diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/CNAME b/CNAME new file mode 100644 index 00000000000..90bfa61923e --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +coverage.abapgit.org diff --git a/base.css b/base.css new file mode 100644 index 00000000000..f418035b469 --- /dev/null +++ b/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/block-navigation.js b/block-navigation.js new file mode 100644 index 00000000000..cc121302316 --- /dev/null +++ b/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/deps/cl_package_factory.clas.abap.html b/deps/cl_package_factory.clas.abap.html new file mode 100644 index 00000000000..b4b7af6d1d3 --- /dev/null +++ b/deps/cl_package_factory.clas.abap.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for deps/cl_package_factory.clas.abap + + + + + + + + + +
+
+

All files / deps cl_package_factory.clas.abap

+
+ +
+ 100% + Statements + 36/36 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 36/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +371x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS cl_package_factory DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS load_package
+      IMPORTING
+        i_package_name TYPE devclass
+        VALUE(i_force_reload) TYPE abap_bool OPTIONAL
+      EXPORTING
+        VALUE(e_package) TYPE REF TO if_package
+      EXCEPTIONS
+        object_not_existing
+        unexpected_error
+        intern_err
+        no_access
+        object_locked_and_modified.
+ 
+    CLASS-METHODS create_new_package
+      IMPORTING
+        VALUE(i_reuse_deleted_object) TYPE abap_bool DEFAULT 'X'
+        !i_suppress_dialog            TYPE abap_bool DEFAULT abap_false
+        !i_suppress_access_permission TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        VALUE(e_package) TYPE REF TO if_package
+      CHANGING
+        c_package_data TYPE any.
+ENDCLASS.
+ 
+CLASS cl_package_factory IMPLEMENTATION.
+  METHOD load_package.
+    RAISE object_not_existing.
+  ENDMETHOD.
+ 
+  METHOD create_new_package.
+* this should never be called in unit tests
+    ASSERT 1 = 2.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/deps/index.html b/deps/index.html new file mode 100644 index 00000000000..0fcd4596300 --- /dev/null +++ b/deps/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for deps + + + + + + + + + +
+
+

All files deps

+
+ +
+ 100% + Statements + 36/36 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 36/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cl_package_factory.clas.abap +
+
100%36/36100%0/0100%0/0100%36/36
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/favicon.png b/favicon.png new file mode 100644 index 00000000000..c1525b811a1 Binary files /dev/null and b/favicon.png differ diff --git a/index.html b/index.html new file mode 100644 index 00000000000..38fac2796d2 --- /dev/null +++ b/index.html @@ -0,0 +1,641 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 91.51% + Statements + 175792/192084 +
+ + +
+ 54.98% + Branches + 1995/3628 +
+ + +
+ 58.78% + Functions + 917/1560 +
+ + +
+ 91.51% + Lines + 175792/192084 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
deps +
+
100%36/36100%0/0100%0/0100%36/36
output +
+
99.99%92902/9291014.49%219/1511100%2/299.99%92902/92910
src +
+
89.83%1758/195785.71%48/5653.96%34/6389.83%1758/1957
src/apack +
+
75.98%212/27971.42%5/783.33%5/675.98%212/279
src/background +
+
63.84%385/603100%0/00%0/663.84%385/603
src/cts +
+
87.91%1833/208589.79%44/4968.42%26/3887.91%1833/2085
src/data +
+
93.23%1530/164178.04%32/4178.57%22/2893.23%1530/1641
src/exits +
+
55.96%258/46143.75%7/1636.84%7/1955.96%258/461
src/git +
+
97.94%5857/598075.22%167/222100%111/11197.94%5857/5980
src/git/zlib +
+
99.82%1152/115496.96%32/33100%13/1399.82%1152/1154
src/git_platform +
+
95.45%399/418100%1/150%1/295.45%399/418
src/http +
+
93.12%1516/162867.3%35/5287.09%27/3193.12%1516/1628
src/inspect +
+
87.65%362/413100%0/00%0/387.65%362/413
src/json +
+
98.32%10208/1038288.4%488/55297.47%193/19898.32%10208/10382
src/objects +
+
69.85%4431/634375.6%31/4124.13%21/8769.85%4431/6343
src/objects/aff +
+
99.62%534/53696.07%49/51100%21/2199.62%534/536
src/objects/core +
+
82.09%4256/518483.56%122/14667.16%90/13482.09%4256/5184
src/objects/jump +
+
86.55%502/580100%0/00%0/286.55%502/580
src/objects/oo +
+
71.31%460/6450%0/20%0/1571.31%460/645
src/objects/rules +
+
52.13%61/117100%0/00%0/352.13%61/117
src/objects/sap +
+
59.16%368/622100%0/00%0/759.16%368/622
src/objects/texts +
+
88.64%2748/310082.5%66/8061.11%22/3688.64%2748/3100
src/persist +
+
77.28%1732/22410%0/20%0/3777.28%1732/2241
src/progress +
+
69.46%91/131100%2/233.33%1/369.46%91/131
src/repo +
+
77.58%5293/682280.23%138/17248.7%75/15477.58%5293/6822
src/stage +
+
96.22%255/26575%3/460%3/596.22%255/265
src/syntax +
+
93.03%3287/353392.78%90/9789.09%49/5593.03%3287/3533
src/ui +
+
33.97%1770/52090%0/20%0/3733.97%1770/5209
src/ui/core +
+
89.76%3262/363485.4%117/13767.1%51/7689.76%3262/3634
src/ui/lib +
+
91.89%5897/641790.58%77/8559.25%32/5491.89%5897/6417
src/ui/pages +
+
83.31%12920/1550784%21/2513.22%16/12183.31%12920/15507
src/ui/popups +
+
100%347/347100%0/0100%0/0100%347/347
src/ui/routing +
+
94.71%2473/2611100%0/00%0/2794.71%2473/2611
src/utils +
+
82.99%5995/722384.07%190/22663.23%86/13682.99%5995/7223
src/xml +
+
63.83%646/101266.66%10/1528.57%8/2863.83%646/1012
test +
+
96.55%56/58100%1/150%1/296.55%56/58
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/output/#ui2#cl_json.clas.locals.mjs.map.html b/output/#ui2#cl_json.clas.locals.mjs.map.html new file mode 100644 index 00000000000..5ae40f578d5 --- /dev/null +++ b/output/#ui2#cl_json.clas.locals.mjs.map.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/#ui2#cl_json.clas.locals.mjs.map + + + + + + + + + +
+
+

All files / output #ui2#cl_json.clas.locals.mjs.map

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
{
+  "version": 3,
+  "sources": [
+    "#ui2#cl_json.clas.locals_imp.abap"
+  ],
+  "names": [],
+  "mappings": ";;AA+BA;;;;;;;;;;;;;;;;;;;EACE;;;;;QACO,iVAA4B;IACjC,OAAO,MAAC,UAAO,OAAO;IACtB,OAAO,MAAC,cAAW,gCAAe,GAAR,SAAU,yCAAjB,CAA0B;IAC7C,gCAAO,iBAAW,YAAO;EAC3B;EAEA;;QACO,uDAAe;QACf,iVAA4B;IACjC,aAAW,yBAAO,cAAS;IAC3B;oBAA8C;IAC9C,aAAW,OAAO,MAAC,SAAQ;IAC7B;;EAEA;;QACO,uDAAe;IACpB,IAAc,WAA8B;IAE5C,aAAW,yBAAO,cAAS;IAC3B;6BAAqD;IACrD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,WAAS,MAAC,iBAAoC,mBAAtB,WAAS,MAAC,aAAc,gCAAC;MACjD,aAAW,WAAS,MAAC,YAAW;MAChC,aAAW,4BAAU,UAAU;IACjC;IACF;;EAEA;;QACO,uDAAe;QACf,iVAA4B;IACjC,aAAW,yBAAO,cAAS;IAC3B,iBAAY,GAAT,UAAW,gCAAC;MACb;sBAA8C;MAC9C,YAAU,OAAO,MAAC,KAAI;;IAExB;IACF;;EAEA;;QACO,iVAA4B;;;MAE/B,kCAAU,QAAW,OAAO,MAAC,MAAI;IACnC;IACF;;AACF;;;AA2DA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;IACE,IAAc,WAA8B;;;MAE1C,0JAA2D;MAC3D,wJAAyD;MACzD,6JAA8D;IAChE;EACF;EAEA;;;;QACO,0dAA4B;;;MAE/B,iBAAiC,GAA9B,4BAAU,OAAO,MAAC,cAAc,4BAAU,UAAS;QACpD,YAAU,OAAO,MAAC,UAAS;QAC3B;MACF;IACF;IACA,YAAU,OAAO;IACnB;;EAEA;;;;IACE;;;4CAAsE;IACtE,cAAY,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IACnC;;EAEA;;;;QACO,0dAA4B;IACjC;;;;4CAA4D;IAC5D,YAAU,OAAO,MAAC,KAAI;IACxB;;EAEA;;;;QACO,0dAA4B;;;MAE/B,gCAAO,OAAO,MAAC,eAAQ,UAAU;IACnC;IACF;;EAEA;;;;IACE,aAAW,gCAA+B,IAAxB,8CAA0B,wCAAjC,CAAyC;IACtD;;EAEA;;;;IACE,cAAW,4CAAuB;IACpC;;EAEA;;;;IACE,cAAW,4CAAuB;IACpC;;EAEA;;;;QACO,0dAA4B;IAEjC;;;;4CAA4D;IAC5D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,aAAW,OAAO,MAAC,MAAK;IAC1B;IACF;;EAEA;;;QAEO,0GAAsC;QACtC,0GAAsC;QACtC,gHAAwC;QACxC,6HAA+C;QAC/C,0HAA8C;QAC9C,6UAAgD;QAChD,yHAA2C;QAC3C,uHAA4C;QAC5C,0DAAyB;QACzB,0DAAyB;QACzB,0HAAmC;QACnC,0dAAkC;QAClC,uDAAoB;QACpB,iSAAyE;;IAM9E,eAAY,mIAAwE;;;;;MAIlF,aAAU,sDAA4B;MACtC,yBAAG,QAAkB;QACnB;MACF;MACA,gCAAO,iBAAW,QAAQ;IAC5B;;;;MAKE,aAAW,eAAE,MAAC,MAAK;MAEnB,IACE,OA+CA,KAhDG,OAAO,OAAE,iBAAd;;mCAEI,SAAW,OAAO;QAGlB,mBAAgB,0DAA0B;QAE1C;6BAAkD;QAClD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,aAAU,uDAA0B;QACtC,wBAA6B,IAAtB,kCAAwB,uBAAS;UACtC,aAAU,8CAAmC;QAC/C;QAEA,yBAAG,kBAAsB;UACvB,sBAAM,OAAO;UACb,OAAO,MAAC,aAAS,qCAA0B;UAC3C,OAAO,MAAC,UAAO,OAAO;UACtB,OAAO,MAAC,qCAAY,OAAO,MAAC,QAAU,OAAO,MAAC,MAAI;UAClD,OAAO,MAAC,UAAO,OAAO,OAAE,0BAAK,MAAC,KAAI;UAElC,aAAoB,mBAAT,SAAW,gCAAC;UACvB;0BAA+C;UAC/C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAkB,GAAd,OAAO,OAAE,mBAAO,6BAAc,yBAAW;uCAC3D,UAAY,OAAO;YACnB,OAAO,MAAC,YAAQ,oDAAsB;UACxC;UAEA,gCAAO,iBAAW,YAAO;qHAIQ;QACnC;QAEA,iBAAuB,GAApB,OAAO,OAAE,0BAAK,MAAC,OAAO,0CAAS,iBAAuB,GAApB,OAAO,OAAE,0BAAK,MAAC,OAAO,yCAAO;UAChE,sBAAM,OAAO;UACb,OAAO,MAAC,aAAS,qCAA0B;UAC3C,OAAO,MAAC,UAAO,oCAAG;UAClB,OAAO,MAAC,qCAAY,OAAO,MAAC,QAAU,OAAO,MAAC,MAAI;UAClD,OAAO,MAAC,UAAO,OAAO,OAAE,0BAAK,MAAC,KAAI;UAClC,gCAAO,iBAAW,YAAO;kJAIQ;QACnC;;mCAGA,UAAY,OAAO;QACnB,aAAU,2BAAgB;QAC1B,iBAAW,GAAR,SAAU,qCAAG;oCACE;QAClB;;IAYN;EAWF;AACF",
+  "file": "#ui2#cl_json.clas.locals.mjs",
+  "sourceRoot": ""
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/#ui2#cl_json.clas.mjs.map.html b/output/#ui2#cl_json.clas.mjs.map.html new file mode 100644 index 00000000000..6642c9a4253 --- /dev/null +++ b/output/#ui2#cl_json.clas.mjs.map.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/#ui2#cl_json.clas.mjs.map + + + + + + + + + +
+
+

All files / output #ui2#cl_json.clas.mjs.map

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
{
+  "version": 3,
+  "sources": [
+    "#ui2#cl_json.clas.abap"
+  ],
+  "names": [],
+  "mappings": ";;;AA8CA;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;;;;;QACO,gHAA2C;QAC3C,sHAA6C;QAC7C,imBAAuD;QACvD,wZAAwC;QACxC,+DAA8B;QAC9B,uDAAoB;IAEzB,IAAc,OAAc;IAC5B,IAAc,OAAoB;IAElC,aAAU,yEAA2C;IACrD,IACE,OAsCA,AAeA,AA4BA,KAlFG,OAAO,OAAE,IAAd;;MAGI,IACE,OAYA,AAEA,AAEA,AAYA,AAEA,KA/BG,OAAO,OAAE,SAAd;;QAEI,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,gEAAgC;UAC1D,iBAAQ,GAAL,MAAO,uBAAS;YACjB,WAAS,uCAAM;UACjB;YACE,WAAS,wCAAO;UAClB;QACF,gCAAO,KAAe;UACpB,WAAS,qCAAI;QACf;UACE,iCAAS,2DAAO,qBAAQ,sEAAiB,QAAS,+BAAgB,gBAAoB,sCAAG;QAC3F;;QAEA,iCAAS,2DAAO,qBAAQ,KAAM,MAAK,QAAS,+BAAgB,gBAAmB,sCAAG;;QAElF,0EAAmB;;QAEnB,iBAAiB,GAAd,eAAgB,uBACf,IAAI,cAAyB,GAAvB,OAAO,OAAE,eAAgB,gDAC/B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,iDAAmB,CAAC;UAClD,yBAAG,KAAe;YAChB,4CAAa;UACf;YACE,yGAA8C;UAChD;QACF;UACE,0EAAmB;QACrB;;QAEA,2FAAgC;;QAEhC,2FAAgC;;QAEhC,WAAS,IAAI;;;MAGjB,WAAS,oCAAG;MACZ,qDAAoB;;;QAElB,aAAW,eAAE,MAAC,MAAK;QACnB,iCAAS,QAAU,mHAIc;QACjC,iBAAiB,GAAd,yBAAO,QAAU,SAAQ;UAC1B,iCAAS,OAAU,qCAAG;QACxB;MACF;MACA,iCAAS,OAAU,qCAAG;;iCAEtB,WAAa,OAAO;MACpB,mBAAgB,uCAA4B;MAC5C,WAAS,oCAAG;;;QAEV,yFAA6D;QAC7D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACnB,iBAAY,GAAT,UAAW,uBAAU,yBAAI,QAAgB;UAC1C;QACF;QACA,iBAAe,GAAZ,aAAc,wBAAW,MAAC,YAAU;UACrC,iCAAS,yJAA4D;QACvE,wBAAmB,GAAZ,aAAc,wBAAW,MAAC,UAAQ;UACvC,iCAAS,2HAAgD;QAC3D;UACE,iCAAS,6FAAoC;QAC/C;QACA,iCAAS,QAAU,mHAIc;QACjC,iCAAS,OAAU,qCAAG;MACxB;MACA,iBAAU,GAAP,QAAU,sCAAI;QACf,WAAS,wBAAW,KAAM,QAAO,KAAM,iCAAE,KAAuB,qBAAjB,0BAAQ,SAAW,kCAAG;MACvE;MACA,iCAAS,OAAU,qCAAG;;MAEtB,yBAAG,KAAe;QAChB,WAAS,uCAAM;QACf;MACF;MACA,qEAAuB;MACvB,YAAS,kHAIwB;;MAEjC,oCAAS,GAAF,iCAAI,0DAAuB;;IAExC;;EAEA;;;;;;;;;;;;;;;;;IAGE,yBAAG,gBAAoB;iIACsC;IAC7D;+DAC0B;IAC1B;qDAG0B;gHAOF;EAC1B;EAEA;;;;;;;;;;QACO,gHAA2C;QAC3C,sHAA6C;QAC7C,mHAA4C;QAC5C,imBAAuD;QACvD,wZAAwC;QACxC,+PAA+B;QAC/B,+DAA8B;QAC9B,0DAAyB;QACzB,0DAAyB;QACzB,2DAAyB;QACzB,4DAAqC;IAE1C,IAAc,OAAc;IAE5B,aAAU,yEAA2C;IACrD,YAAS,uEAAqC;IAG9C,IACE,OAiCA,AAeA,AAoBA,KArEG,OAAO,OAAE,IAAd;;MAGI,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,qEACxB,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,wDAC5B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,gDAAY;QAC1C,SAAO,gCAAyC,IAAlC,qEAAoC,wCAA3C,CAAmD;MAC5D,wBAA8B,GAAvB,OAAO,OAAE,eAAgB,gDAC5B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,iDAAkB;QAChD,cAAW,mEAAiC;QAC5C,yIAAkD;QAClD,yIAAkD;QAClD,yIAAkD;QAClD,yIAAkD;QAClD,SAAO,QAAQ;MACjB,wBAA0B,GAAnB,OAAO,OAAE,WAAY,kCAAmB,cAAa;QAC1D,cAAW,mEAAiC;QAC5C,yIAAkD;QAClD,iBAAY,GAAT,UAAY,mBAAK;UAClB,sBAAM,IAAI;QACZ;UACE,SAAO,QAAQ;QACjB;MACF,wBAA0B,GAAnB,OAAO,OAAE,WAAY,kCAAmB,cAAa;QAC1D,cAAW,mEAAiC;QAC5C,yIAAkD;QAClD,iBAAY,GAAT,UAAY,mBAAK;UAClB,sBAAM,IAAI;QACZ;UACE,SAAO,QAAQ;QACjB;MACF;QACE,UAAO,mEAAiC;MAC1C;;MAEA,gBAAa,0HAAmC;;;;QAI9C,oEAAsB;uLAMG;QAEzB,0DAA4B;MAC9B;;iCAEA,WAAa,OAAO;MACpB,mBAAgB,uCAA4B;;;QAE1C,yFAA6D;QAC7D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACnB,IACE,YADG,WAAL;;UAEI,YAAU,4BAAU,4BAAU,YAAY,MAAC,SAAQ;;UAEnD,YAAU,4BAAU,YAAY,MAAC,OAAM;;qLAQlB;MAC3B;;MAEA,yBAAG,KAAe;QAChB,gBAAa,0HAAmC;QAGhD,iBAAuB,GAApB,yBAAO,cAAe,gCAAE,iBAAW,GAAP,QAAS,oCAAE;UACxC;QACF;QAEA,aAAU,2HAAoC;QAC9C,yBAAG,QAAkB;UACnB,aAAU,+DAA6B;QACzC;QAGA,iBAAuB,GAApB,yBAAO,cAAe,gCAAE,iBAAY,GAAR,SAAU,0CAAQ;UAC/C,sBAAM,aAAa;;;YAGjB,sBAAM,YAAY;YAClB,YAAY,MAAC,UAAO,4BAAU,WAAW;YACzC;YACA,YAAY,MAAC,WAAO,yDAAoC;YACxD,4CAAO,YAAY,MAAC,gBAAmB;YACvC,gCAAO,sBAAgB,aAAa;UACtC;UACA,eAAY,gFAA4C;UACxD;;QACF,wBAA2B,GAApB,yBAAO,cAAe,gCAAE,iBAAY,GAAR,SAAU,yCAAO;UAClD,cAAW,2HAAkE;UAC7E;;QACF;UACE,IACE,OAOA,AAEA,KAVG,OAAL;;YAEI,cAAW,mEAAiC;YAC5C,iBAAY,GAAT,UAAY,gDAAa;;YAE5B;cACE,oCAAS,GAAF,iCAAI,wCAAM;YACnB;;YAEA;;;YAEA;;;QAIN;MACF;MACA,qEAAuB;wFAME;;MAEzB,oCAAS,GAAF,iCAAI,0DAAuB;;EAExC;AAEF",
+  "file": "#ui2#cl_json.clas.mjs",
+  "sourceRoot": ""
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/00.msag.mjs.html b/output/00.msag.mjs.html new file mode 100644 index 00000000000..4285c074736 --- /dev/null +++ b/output/00.msag.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/00.msag.mjs + + + + + + + + + +
+
+

All files / output 00.msag.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.MSAG["00"] = {
+  "001": "&1&2&3&4",
+  "002": "needed by abapGit unit test",
+  "003": "needed by abapGit unit test",
+};
+//# sourceMappingURL=00.msag.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abap.type.mjs.html b/output/abap.type.mjs.html new file mode 100644 index 00000000000..ef2f6e34360 --- /dev/null +++ b/output/abap.type.mjs.html @@ -0,0 +1,289 @@ + + + + + + Code coverage report for output/abap.type.mjs + + + + + + + + + +
+
+

All files / output abap.type.mjs

+
+ +
+ 100% + Statements + 69/69 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 69/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const pool = {};
+pool['abap_max_comp_name_ln'] = new abap.types.Integer({qualifiedName: "I"});
+pool['abap_max_comp_name_ln'].set(30);
+pool['abap_func_exporting'] = new abap.types.Integer({qualifiedName: "KIND"});
+pool['abap_func_exporting'].set(10);
+pool['abap_func_importing'] = new abap.types.Integer({qualifiedName: "KIND"});
+pool['abap_func_importing'].set(20);
+pool['abap_func_tables'] = new abap.types.Integer({qualifiedName: "KIND"});
+pool['abap_func_tables'].set(30);
+pool['abap_func_changing'] = new abap.types.Integer({qualifiedName: "KIND"});
+pool['abap_func_changing'].set(40);
+pool['abap_trans_srcbind'] = new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"}), "value": new abap.types.DataReference(new abap.types.Character(4))}, "abap_trans_srcbind", undefined, {}, {});
+pool['abap_encoding'] = new abap.types.Character(20, {"qualifiedName":"abap_encoding"});
+pool['abap_trans_srcbind_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"}), "value": new abap.types.DataReference(new abap.types.Character(4))}, "abap_trans_srcbind", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "abap_trans_srcbind_tab");
+pool['abap_trans_resbind_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"}), "value": new abap.types.DataReference(new abap.types.Character(4))}, "abap_trans_srcbind", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "abap_trans_srcbind_tab");
+pool['abap_abstypename'] = new abap.types.Character(200, {"qualifiedName":"abap_abstypename"});
+pool['abap_attrname'] = new abap.types.Character(61, {"qualifiedName":"abap_attrname"});
+pool['abap_classname'] = new abap.types.Character(30, {"qualifiedName":"abap_classname"});
+pool['abap_compname'] = new abap.types.Character(30, {"qualifiedName":"abap_compname"});
+pool['abap_editmask'] = new abap.types.Character(7, {"qualifiedName":"abap_editmask"});
+pool['abap_evntname'] = new abap.types.Character(61, {"qualifiedName":"abap_evntname"});
+pool['abap_excpname'] = new abap.types.Character(30, {"qualifiedName":"abap_excpname"});
+pool['abap_helpid'] = new abap.types.Character(62, {"qualifiedName":"abap_helpid"});
+pool['abap_intfname'] = new abap.types.Character(30, {"qualifiedName":"abap_intfname"});
+pool['abap_keydefkind'] = new abap.types.Character(1, {"qualifiedName":"abap_keydefkind"});
+pool['abap_keyname'] = new abap.types.Character(255, {"qualifiedName":"abap_keyname"});
+pool['abap_methname'] = new abap.types.Character(61, {"qualifiedName":"abap_methname"});
+pool['abap_parmkind'] = new abap.types.Character(1, {"qualifiedName":"abap_parmkind"});
+pool['abap_parmname'] = new abap.types.Character(30, {"qualifiedName":"abap_parmname"});
+pool['abap_structkind'] = new abap.types.Character(1, {"qualifiedName":"abap_structkind"});
+pool['abap_typekind'] = new abap.types.Character(1, {"qualifiedName":"abap_typekind"});
+pool['abap_visibility'] = new abap.types.Character(1, {"qualifiedName":"abap_visibility"});
+pool['abap_tablekind'] = new abap.types.Character(1, {"qualifiedName":"abap_tablekind"});
+pool['abap_char1'] = new abap.types.Character(1, {"qualifiedName":"abap_char1"});
+pool['abap_cr_lf'] = new abap.types.Character(2, {"qualifiedName":"abap_cr_lf"});
+pool['abap_byte_order_mark'] = new abap.types.Hex({length: 2});
+pool['abap_byte_order_utf8'] = new abap.types.Hex({length: 3});
+pool['abap_componentdescr'] = new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"}), "type": new abap.types.ABAPObject({qualifiedName: "CL_ABAP_DATADESCR", RTTIName: "\\CLASS=CL_ABAP_DATADESCR"}), "as_include": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "suffix": new abap.types.String({qualifiedName: "SUFFIX"})}, "abap_componentdescr", undefined, {}, {});
+pool['abap_component_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"}), "type": new abap.types.ABAPObject({qualifiedName: "CL_ABAP_DATADESCR", RTTIName: "\\CLASS=CL_ABAP_DATADESCR"}), "as_include": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "suffix": new abap.types.String({qualifiedName: "SUFFIX"})}, "abap_componentdescr", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "abap_component_tab");
+pool['abap_compdescr'] = new abap.types.Structure({"length": new abap.types.Integer({qualifiedName: "LENGTH"}), "decimals": new abap.types.Integer({qualifiedName: "DECIMALS"}), "type_kind": new abap.types.Character(1, {"qualifiedName":"abap_typekind"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_compname"})}, "abap_compdescr", undefined, {}, {});
+pool['abap_compdescr_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"length": new abap.types.Integer({qualifiedName: "LENGTH"}), "decimals": new abap.types.Integer({qualifiedName: "DECIMALS"}), "type_kind": new abap.types.Character(1, {"qualifiedName":"abap_typekind"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_compname"})}, "abap_compdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_compdescr_tab");
+pool['abap_table_keycompdescr'] = new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"})}, "abap_table_keycompdescr", undefined, {}, {});
+pool['abap_table_keydescr'] = new abap.types.Structure({"components": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"})}, "abap_table_keycompdescr", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "abap_table_keydescr-components"), "name": new abap.types.String({qualifiedName: "NAME"}), "is_primary": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "access_kind": new abap.types.String({qualifiedName: "ACCESS_KIND"}), "is_unique": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "key_kind": new abap.types.String({qualifiedName: "KEY_KIND"})}, "abap_table_keydescr", undefined, {}, {});
+pool['abap_table_keydescr_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"components": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"})}, "abap_table_keycompdescr", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "abap_table_keydescr-components"), "name": new abap.types.String({qualifiedName: "NAME"}), "is_primary": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "access_kind": new abap.types.String({qualifiedName: "ACCESS_KIND"}), "is_unique": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "key_kind": new abap.types.String({qualifiedName: "KEY_KIND"})}, "abap_table_keydescr", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "abap_table_keydescr_tab");
+pool['abap_simple_componentdescr'] = new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"}), "type": new abap.types.ABAPObject({qualifiedName: "CL_ABAP_DATADESCR", RTTIName: "\\CLASS=CL_ABAP_DATADESCR"})}, "abap_simple_componentdescr", undefined, {}, {});
+pool['abap_component_view_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"}), "type": new abap.types.ABAPObject({qualifiedName: "CL_ABAP_DATADESCR", RTTIName: "\\CLASS=CL_ABAP_DATADESCR"})}, "abap_simple_componentdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_component_view_tab");
+pool['abap_parmbind'] = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_parmname"}), "kind": new abap.types.Character(1, {"qualifiedName":"abap_parmkind"}), "value": new abap.types.DataReference(new abap.types.Character(4))}, "abap_parmbind", undefined, {}, {});
+pool['abap_parmbind_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_parmname"}), "kind": new abap.types.Character(1, {"qualifiedName":"abap_parmkind"}), "value": new abap.types.DataReference(new abap.types.Character(4))}, "abap_parmbind", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"HASHED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "abap_parmbind_tab");
+pool['abap_parmdescr'] = new abap.types.Structure({"length": new abap.types.Integer({qualifiedName: "LENGTH"}), "decimals": new abap.types.Integer({qualifiedName: "DECIMALS"}), "type_kind": new abap.types.Character(1, {"qualifiedName":"abap_typekind"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_parmname"}), "parm_kind": new abap.types.Character(1, {"qualifiedName":"abap_parmkind"}), "by_value": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_optional": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_parmdescr", undefined, {}, {});
+pool['abap_parmdescr_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"length": new abap.types.Integer({qualifiedName: "LENGTH"}), "decimals": new abap.types.Integer({qualifiedName: "DECIMALS"}), "type_kind": new abap.types.Character(1, {"qualifiedName":"abap_typekind"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_parmname"}), "parm_kind": new abap.types.Character(1, {"qualifiedName":"abap_parmkind"}), "by_value": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_optional": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_parmdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_parmdescr_tab");
+pool['abap_component_symbol_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "NAME"}), "type": new abap.types.ABAPObject({qualifiedName: "CL_ABAP_DATADESCR", RTTIName: "\\CLASS=CL_ABAP_DATADESCR"})}, "abap_simple_componentdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"HASHED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "abap_component_symbol_tab");
+pool['abap_func_parmbind'] = new abap.types.Structure({"value": new abap.types.DataReference(new abap.types.Character(4)), "tables_wa": new abap.types.DataReference(new abap.types.Character(4)), "kind": new abap.types.Integer({qualifiedName: "KIND"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_parmname"})}, "abap_func_parmbind", undefined, {}, {});
+pool['abap_func_parmbind_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"value": new abap.types.DataReference(new abap.types.Character(4)), "tables_wa": new abap.types.DataReference(new abap.types.Character(4)), "kind": new abap.types.Integer({qualifiedName: "KIND"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_parmname"})}, "abap_func_parmbind", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["KIND","NAME"]},"secondary":[]}, "abap_func_parmbind_tab");
+pool['abap_func_excpbind'] = new abap.types.Structure({"message": new abap.types.DataReference(new abap.types.Character(4)), "value": new abap.types.Integer({qualifiedName: "VALUE"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_excpname"})}, "abap_func_excpbind", undefined, {}, {});
+pool['abap_func_excpbind_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"message": new abap.types.DataReference(new abap.types.Character(4)), "value": new abap.types.Integer({qualifiedName: "VALUE"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_excpname"})}, "abap_func_excpbind", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"HASHED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "abap_func_excpbind_tab");
+pool['abap_excpdescr'] = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_excpname"}), "is_resumable": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_excpdescr", undefined, {}, {});
+pool['abap_excpdescr_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_excpname"}), "is_resumable": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_excpdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_excpdescr_tab");
+pool['abap_methdescr'] = new abap.types.Structure({"parameters": abap.types.TableFactory.construct(new abap.types.Structure({"length": new abap.types.Integer({qualifiedName: "LENGTH"}), "decimals": new abap.types.Integer({qualifiedName: "DECIMALS"}), "type_kind": new abap.types.Character(1, {"qualifiedName":"abap_typekind"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_parmname"}), "parm_kind": new abap.types.Character(1, {"qualifiedName":"abap_parmkind"}), "by_value": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_optional": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_parmdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_parmdescr_tab"), "exceptions": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_excpname"}), "is_resumable": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_excpdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_excpdescr_tab"), "name": new abap.types.Character(61, {"qualifiedName":"abap_methname"}), "for_event": new abap.types.Character(61, {"qualifiedName":"abap_evntname"}), "of_class": new abap.types.Character(30, {"qualifiedName":"abap_classname"}), "visibility": new abap.types.Character(1, {"qualifiedName":"abap_visibility"}), "is_interface": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_inherited": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_redefined": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_abstract": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_final": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_class": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "alias_for": new abap.types.Character(61, {"qualifiedName":"abap_methname"}), "is_raising_excps": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_methdescr", undefined, {}, {});
+pool['abap_methdescr_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"parameters": abap.types.TableFactory.construct(new abap.types.Structure({"length": new abap.types.Integer({qualifiedName: "LENGTH"}), "decimals": new abap.types.Integer({qualifiedName: "DECIMALS"}), "type_kind": new abap.types.Character(1, {"qualifiedName":"abap_typekind"}), "name": new abap.types.Character(30, {"qualifiedName":"abap_parmname"}), "parm_kind": new abap.types.Character(1, {"qualifiedName":"abap_parmkind"}), "by_value": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_optional": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_parmdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_parmdescr_tab"), "exceptions": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_excpname"}), "is_resumable": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_excpdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_excpdescr_tab"), "name": new abap.types.Character(61, {"qualifiedName":"abap_methname"}), "for_event": new abap.types.Character(61, {"qualifiedName":"abap_evntname"}), "of_class": new abap.types.Character(30, {"qualifiedName":"abap_classname"}), "visibility": new abap.types.Character(1, {"qualifiedName":"abap_visibility"}), "is_interface": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_inherited": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_redefined": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_abstract": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_final": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_class": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "alias_for": new abap.types.Character(61, {"qualifiedName":"abap_methname"}), "is_raising_excps": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_methdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_methdescr_tab");
+pool['abap_attrdescr'] = new abap.types.Structure({"length": new abap.types.Integer({qualifiedName: "LENGTH"}), "decimals": new abap.types.Integer({qualifiedName: "DECIMALS"}), "name": new abap.types.Character(61, {"qualifiedName":"abap_attrname"}), "type_kind": new abap.types.Character(1, {"qualifiedName":"abap_typekind"}), "visibility": new abap.types.Character(1, {"qualifiedName":"abap_visibility"}), "is_interface": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_inherited": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_class": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_constant": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_virtual": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_read_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "alias_for": new abap.types.Character(61, {"qualifiedName":"abap_attrname"})}, "abap_attrdescr", undefined, {}, {});
+pool['abap_attrdescr_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"length": new abap.types.Integer({qualifiedName: "LENGTH"}), "decimals": new abap.types.Integer({qualifiedName: "DECIMALS"}), "name": new abap.types.Character(61, {"qualifiedName":"abap_attrname"}), "type_kind": new abap.types.Character(1, {"qualifiedName":"abap_typekind"}), "visibility": new abap.types.Character(1, {"qualifiedName":"abap_visibility"}), "is_interface": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_inherited": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_class": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_constant": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_virtual": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "is_read_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "alias_for": new abap.types.Character(61, {"qualifiedName":"abap_attrname"})}, "abap_attrdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_attrdescr_tab");
+pool['abap_intfdescr'] = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_intfname"}), "is_inherited": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_intfdescr", undefined, {}, {});
+pool['abap_intfdescr_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_intfname"}), "is_inherited": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "abap_intfdescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_intfdescr_tab");
+pool['abap_excpbind'] = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_excpname"}), "value": new abap.types.Integer({qualifiedName: "VALUE"})}, "abap_excpbind", undefined, {}, {});
+pool['abap_excpbind_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"abap_excpname"}), "value": new abap.types.Integer({qualifiedName: "VALUE"})}, "abap_excpbind", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"HASHED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "abap_excpbind_tab");
+pool['abap_keydescr'] = new abap.types.Structure({"name": new abap.types.Character(255, {"qualifiedName":"abap_keyname"})}, "abap_keydescr", undefined, {}, {});
+pool['abap_keydescr_tab'] = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(255, {"qualifiedName":"abap_keyname"})}, "abap_keydescr", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["NAME"]},"secondary":[]}, "abap_keydescr_tab");
+abap.TypePools['ABAP'] = pool;
+//# sourceMappingURL=abap.type.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abap_boolean.dtel.mjs.html b/output/abap_boolean.dtel.mjs.html new file mode 100644 index 00000000000..f2ac6572834 --- /dev/null +++ b/output/abap_boolean.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/abap_boolean.dtel.mjs + + + + + + + + + +
+
+

All files / output abap_boolean.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["ABAP_BOOLEAN"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOLEAN","ddicName":"ABAP_BOOLEAN"}),
+  "domain": "ABAP_BOOLEAN",
+  "fixedValues": [{"description":"False","language":"E"},{"description":"True","low":"X","language":"E"}],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abap_callstack.ttyp.mjs.html b/output/abap_callstack.ttyp.mjs.html new file mode 100644 index 00000000000..309073c92d2 --- /dev/null +++ b/output/abap_callstack.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/abap_callstack.ttyp.mjs + + + + + + + + + +
+
+

All files / output abap_callstack.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["ABAP_CALLSTACK"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"mainprogram": new abap.types.Character(40, {}), "include": new abap.types.Character(40, {}), "line": new abap.types.Integer({qualifiedName: "I"}), "blockname": new abap.types.String({qualifiedName: "STRING"})}, "ABAP_CALLSTACK_LINE", "ABAP_CALLSTACK_LINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "ABAP_CALLSTACK"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abap_callstack_line.tabl.mjs.html b/output/abap_callstack_line.tabl.mjs.html new file mode 100644 index 00000000000..9998c4ed4cb --- /dev/null +++ b/output/abap_callstack_line.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/abap_callstack_line.tabl.mjs + + + + + + + + + +
+
+

All files / output abap_callstack_line.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["ABAP_CALLSTACK_LINE"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"mainprogram": new abap.types.Character(40, {}), "include": new abap.types.Character(40, {}), "line": new abap.types.Integer({qualifiedName: "I"}), "blockname": new abap.types.String({qualifiedName: "STRING"})}, "ABAP_CALLSTACK_LINE", "ABAP_CALLSTACK_LINE", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abap_encod.dtel.mjs.html b/output/abap_encod.dtel.mjs.html new file mode 100644 index 00000000000..634be68643a --- /dev/null +++ b/output/abap_encod.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/abap_encod.dtel.mjs + + + + + + + + + +
+
+

All files / output abap_encod.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["ABAP_ENCOD"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"ABAP_ENCOD","ddicName":"ABAP_ENCOD"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abap_sortorder.tabl.mjs.html b/output/abap_sortorder.tabl.mjs.html new file mode 100644 index 00000000000..a3570e25293 --- /dev/null +++ b/output/abap_sortorder.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/abap_sortorder.tabl.mjs + + + + + + + + + +
+
+

All files / output abap_sortorder.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["ABAP_SORTORDER"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "descending": new abap.types.Character(1, {}), "astext": new abap.types.Character(1, {})}, "ABAP_SORTORDER", "ABAP_SORTORDER", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abap_sortorder_tab.ttyp.mjs.html b/output/abap_sortorder_tab.ttyp.mjs.html new file mode 100644 index 00000000000..9f13801fc11 --- /dev/null +++ b/output/abap_sortorder_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/abap_sortorder_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output abap_sortorder_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["ABAP_SORTORDER_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "descending": new abap.types.Character(1, {}), "astext": new abap.types.Character(1, {})}, "ABAP_SORTORDER", "ABAP_SORTORDER", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "ABAP_SORTORDER_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abaptxt255.tabl.mjs.html b/output/abaptxt255.tabl.mjs.html new file mode 100644 index 00000000000..0a06ff951cf --- /dev/null +++ b/output/abaptxt255.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/abaptxt255.tabl.mjs + + + + + + + + + +
+
+

All files / output abaptxt255.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["ABAPTXT255"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"line": new abap.types.Character(255, {"qualifiedName":"TEXT255","ddicName":"TEXT255"})}, "ABAPTXT255", "ABAPTXT255", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/abaptxt255_tab.ttyp.mjs.html b/output/abaptxt255_tab.ttyp.mjs.html new file mode 100644 index 00000000000..b12cb5773b9 --- /dev/null +++ b/output/abaptxt255_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/abaptxt255_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output abaptxt255_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["ABAPTXT255_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"line": new abap.types.Character(255, {"qualifiedName":"TEXT255","ddicName":"TEXT255"})}, "ABAPTXT255", "ABAPTXT255", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "ABAPTXT255_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/balmnr.dtel.mjs.html b/output/balmnr.dtel.mjs.html new file mode 100644 index 00000000000..598316b1c6a --- /dev/null +++ b/output/balmnr.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/balmnr.dtel.mjs + + + + + + + + + +
+
+

All files / output balmnr.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BALMNR"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Numc({length: 6, qualifiedName: "BALMNR"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/balognr.dtel.mjs.html b/output/balognr.dtel.mjs.html new file mode 100644 index 00000000000..6534a9c6c68 --- /dev/null +++ b/output/balognr.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/balognr.dtel.mjs + + + + + + + + + +
+
+

All files / output balognr.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BALOGNR"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"BALOGNR","ddicName":"BALOGNR"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapi_fld.dtel.mjs.html b/output/bapi_fld.dtel.mjs.html new file mode 100644 index 00000000000..5950637a542 --- /dev/null +++ b/output/bapi_fld.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapi_fld.dtel.mjs + + + + + + + + + +
+
+

All files / output bapi_fld.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPI_FLD"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"BAPI_FLD","ddicName":"BAPI_FLD"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapi_line.dtel.mjs.html b/output/bapi_line.dtel.mjs.html new file mode 100644 index 00000000000..61825a45d40 --- /dev/null +++ b/output/bapi_line.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapi_line.dtel.mjs + + + + + + + + + +
+
+

All files / output bapi_line.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPI_LINE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "BAPI_LINE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapi_msg.dtel.mjs.html b/output/bapi_msg.dtel.mjs.html new file mode 100644 index 00000000000..3c03f09ab60 --- /dev/null +++ b/output/bapi_msg.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapi_msg.dtel.mjs + + + + + + + + + +
+
+

All files / output bapi_msg.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPI_MSG"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(220, {"qualifiedName":"BAPI_MSG","ddicName":"BAPI_MSG"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapi_mtype.dtel.mjs.html b/output/bapi_mtype.dtel.mjs.html new file mode 100644 index 00000000000..41982832e2a --- /dev/null +++ b/output/bapi_mtype.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapi_mtype.dtel.mjs + + + + + + + + + +
+
+

All files / output bapi_mtype.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPI_MTYPE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"BAPI_MTYPE","ddicName":"BAPI_MTYPE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapi_param.dtel.mjs.html b/output/bapi_param.dtel.mjs.html new file mode 100644 index 00000000000..5e58a5e0821 --- /dev/null +++ b/output/bapi_param.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapi_param.dtel.mjs + + + + + + + + + +
+
+

All files / output bapi_param.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPI_PARAM"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"BAPI_PARAM","ddicName":"BAPI_PARAM"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapi_rcode.dtel.mjs.html b/output/bapi_rcode.dtel.mjs.html new file mode 100644 index 00000000000..0a8e3221c05 --- /dev/null +++ b/output/bapi_rcode.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapi_rcode.dtel.mjs + + + + + + + + + +
+
+

All files / output bapi_rcode.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPI_RCODE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(5, {"qualifiedName":"BAPI_RCODE","ddicName":"BAPI_RCODE"}),
+  "domain": "CHAR5",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapilogsys.dtel.mjs.html b/output/bapilogsys.dtel.mjs.html new file mode 100644 index 00000000000..22141f56b37 --- /dev/null +++ b/output/bapilogsys.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapilogsys.dtel.mjs + + + + + + + + + +
+
+

All files / output bapilogsys.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPILOGSYS"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(10, {"qualifiedName":"BAPILOGSYS","ddicName":"BAPILOGSYS"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapioption.dtel.mjs.html b/output/bapioption.dtel.mjs.html new file mode 100644 index 00000000000..101152b3908 --- /dev/null +++ b/output/bapioption.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapioption.dtel.mjs + + + + + + + + + +
+
+

All files / output bapioption.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPIOPTION"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(2, {"qualifiedName":"BAPIOPTION","ddicName":"BAPIOPTION"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapiret2.tabl.mjs.html b/output/bapiret2.tabl.mjs.html new file mode 100644 index 00000000000..de09d39c44a --- /dev/null +++ b/output/bapiret2.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/bapiret2.tabl.mjs + + + + + + + + + +
+
+

All files / output bapiret2.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["BAPIRET2"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"type": new abap.types.Character(1, {"qualifiedName":"BAPI_MTYPE","ddicName":"BAPI_MTYPE"}), "id": new abap.types.Character(20, {"qualifiedName":"SYMSGID","ddicName":"SYMSGID"}), "number": new abap.types.Numc({length: 3, qualifiedName: "SYMSGNO"}), "message": new abap.types.Character(220, {"qualifiedName":"BAPI_MSG","ddicName":"BAPI_MSG"}), "log_no": new abap.types.Character(20, {"qualifiedName":"BALOGNR","ddicName":"BALOGNR"}), "log_msg_no": new abap.types.Numc({length: 6, qualifiedName: "BALMNR"}), "message_v1": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v2": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v3": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v4": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "parameter": new abap.types.Character(32, {"qualifiedName":"BAPI_PARAM","ddicName":"BAPI_PARAM"}), "row": new abap.types.Integer({qualifiedName: "BAPI_LINE"}), "field": new abap.types.Character(30, {"qualifiedName":"BAPI_FLD","ddicName":"BAPI_FLD"}), "system": new abap.types.Character(10, {"qualifiedName":"BAPILOGSYS","ddicName":"BAPILOGSYS"})}, "BAPIRET2", "BAPIRET2", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapirettab.ttyp.mjs.html b/output/bapirettab.ttyp.mjs.html new file mode 100644 index 00000000000..255e9e39237 --- /dev/null +++ b/output/bapirettab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/bapirettab.ttyp.mjs + + + + + + + + + +
+
+

All files / output bapirettab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["BAPIRETTAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(1, {"qualifiedName":"BAPI_MTYPE","ddicName":"BAPI_MTYPE"}), "id": new abap.types.Character(20, {"qualifiedName":"SYMSGID","ddicName":"SYMSGID"}), "number": new abap.types.Numc({length: 3, qualifiedName: "SYMSGNO"}), "message": new abap.types.Character(220, {"qualifiedName":"BAPI_MSG","ddicName":"BAPI_MSG"}), "log_no": new abap.types.Character(20, {"qualifiedName":"BALOGNR","ddicName":"BALOGNR"}), "log_msg_no": new abap.types.Numc({length: 6, qualifiedName: "BALMNR"}), "message_v1": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v2": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v3": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v4": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "parameter": new abap.types.Character(32, {"qualifiedName":"BAPI_PARAM","ddicName":"BAPI_PARAM"}), "row": new abap.types.Integer({qualifiedName: "BAPI_LINE"}), "field": new abap.types.Character(30, {"qualifiedName":"BAPI_FLD","ddicName":"BAPI_FLD"}), "system": new abap.types.Character(10, {"qualifiedName":"BAPILOGSYS","ddicName":"BAPILOGSYS"})}, "BAPIRET2", "BAPIRET2", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "BAPIRETTAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapireturn.tabl.mjs.html b/output/bapireturn.tabl.mjs.html new file mode 100644 index 00000000000..d268f22b067 --- /dev/null +++ b/output/bapireturn.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/bapireturn.tabl.mjs + + + + + + + + + +
+
+

All files / output bapireturn.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["BAPIRETURN"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"type": new abap.types.Character(1, {"qualifiedName":"BAPI_MTYPE","ddicName":"BAPI_MTYPE"}), "code": new abap.types.Character(5, {"qualifiedName":"BAPI_RCODE","ddicName":"BAPI_RCODE"}), "message": new abap.types.Character(220, {"qualifiedName":"BAPI_MSG","ddicName":"BAPI_MSG"}), "log_no": new abap.types.Character(20, {"qualifiedName":"BALOGNR","ddicName":"BALOGNR"}), "log_msg_no": new abap.types.Numc({length: 6, qualifiedName: "BALMNR"}), "message_v1": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v2": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v3": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}), "message_v4": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"})}, "BAPIRETURN", "BAPIRETURN", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/bapisign.dtel.mjs.html b/output/bapisign.dtel.mjs.html new file mode 100644 index 00000000000..2b54272072e --- /dev/null +++ b/output/bapisign.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/bapisign.dtel.mjs + + + + + + + + + +
+
+

All files / output bapisign.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BAPISIGN"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"BAPISIGN","ddicName":"BAPISIGN"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/boolean.dtel.mjs.html b/output/boolean.dtel.mjs.html new file mode 100644 index 00000000000..80c2ca596b3 --- /dev/null +++ b/output/boolean.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/boolean.dtel.mjs + + + + + + + + + +
+
+

All files / output boolean.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["BOOLEAN"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"BOOLEAN","ddicName":"BOOLEAN"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char1.dtel.mjs.html b/output/char1.dtel.mjs.html new file mode 100644 index 00000000000..651755e1f45 --- /dev/null +++ b/output/char1.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char1.dtel.mjs + + + + + + + + + +
+
+

All files / output char1.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR1"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"CHAR1","ddicName":"CHAR1"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char10.dtel.mjs.html b/output/char10.dtel.mjs.html new file mode 100644 index 00000000000..7bd699a743a --- /dev/null +++ b/output/char10.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char10.dtel.mjs + + + + + + + + + +
+
+

All files / output char10.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR10"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(10, {"qualifiedName":"CHAR10","ddicName":"CHAR10"}),
+  "domain": "CHAR10",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char120.dtel.mjs.html b/output/char120.dtel.mjs.html new file mode 100644 index 00000000000..157d7ac0fec --- /dev/null +++ b/output/char120.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char120.dtel.mjs + + + + + + + + + +
+
+

All files / output char120.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR120"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(120, {"qualifiedName":"CHAR120","ddicName":"CHAR120"}),
+  "domain": "CHAR120",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char15.dtel.mjs.html b/output/char15.dtel.mjs.html new file mode 100644 index 00000000000..e1ac836bd6b --- /dev/null +++ b/output/char15.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char15.dtel.mjs + + + + + + + + + +
+
+

All files / output char15.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR15"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(15, {"qualifiedName":"CHAR15","ddicName":"CHAR15"}),
+  "domain": "CHAR15",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char20.dtel.mjs.html b/output/char20.dtel.mjs.html new file mode 100644 index 00000000000..78779f6c1ec --- /dev/null +++ b/output/char20.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char20.dtel.mjs + + + + + + + + + +
+
+

All files / output char20.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR20"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"CHAR20","ddicName":"CHAR20"}),
+  "domain": "CHAR20",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char25.dtel.mjs.html b/output/char25.dtel.mjs.html new file mode 100644 index 00000000000..64b8f309dcc --- /dev/null +++ b/output/char25.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char25.dtel.mjs + + + + + + + + + +
+
+

All files / output char25.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR25"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(25, {"qualifiedName":"CHAR25","ddicName":"CHAR25"}),
+  "domain": "CHAR25",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char3.dtel.mjs.html b/output/char3.dtel.mjs.html new file mode 100644 index 00000000000..b6514541260 --- /dev/null +++ b/output/char3.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char3.dtel.mjs + + + + + + + + + +
+
+

All files / output char3.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR3"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(3, {"qualifiedName":"CHAR3","ddicName":"CHAR3"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char30.dtel.mjs.html b/output/char30.dtel.mjs.html new file mode 100644 index 00000000000..1a8788ccf05 --- /dev/null +++ b/output/char30.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char30.dtel.mjs + + + + + + + + + +
+
+

All files / output char30.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR30"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"CHAR30","ddicName":"CHAR30"}),
+  "domain": "CHAR30",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char32.dtel.mjs.html b/output/char32.dtel.mjs.html new file mode 100644 index 00000000000..54cf4ece4db --- /dev/null +++ b/output/char32.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char32.dtel.mjs + + + + + + + + + +
+
+

All files / output char32.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR32"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"CHAR32","ddicName":"CHAR32"}),
+  "domain": "CHAR32",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char4.dtel.mjs.html b/output/char4.dtel.mjs.html new file mode 100644 index 00000000000..6904435ae50 --- /dev/null +++ b/output/char4.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char4.dtel.mjs + + + + + + + + + +
+
+

All files / output char4.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR4"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(4, {"qualifiedName":"CHAR4","ddicName":"CHAR4"}),
+  "domain": "CHAR4",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char6.dtel.mjs.html b/output/char6.dtel.mjs.html new file mode 100644 index 00000000000..e3f5bea4561 --- /dev/null +++ b/output/char6.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char6.dtel.mjs + + + + + + + + + +
+
+

All files / output char6.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR6"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(6, {"qualifiedName":"CHAR6","ddicName":"CHAR6"}),
+  "domain": "CHAR6",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/char80.dtel.mjs.html b/output/char80.dtel.mjs.html new file mode 100644 index 00000000000..c8afe56a0a1 --- /dev/null +++ b/output/char80.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/char80.dtel.mjs + + + + + + + + + +
+
+

All files / output char80.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["CHAR80"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(80, {"qualifiedName":"CHAR80","ddicName":"CHAR80"}),
+  "domain": "CHAR80",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/dats.dtel.mjs.html b/output/dats.dtel.mjs.html new file mode 100644 index 00000000000..b2a7482299d --- /dev/null +++ b/output/dats.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/dats.dtel.mjs + + + + + + + + + +
+
+

All files / output dats.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["DATS"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Date({qualifiedName: "DATS"}),
+  "domain": "DATS",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/dd02l.tabl.mjs.html b/output/dd02l.tabl.mjs.html new file mode 100644 index 00000000000..059b1614e00 --- /dev/null +++ b/output/dd02l.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/dd02l.tabl.mjs + + + + + + + + + +
+
+

All files / output dd02l.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["DD02L"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"tabname": new abap.types.Character(30, {}), "as4local": new abap.types.Character(1, {}), "as4vers": new abap.types.Numc({length: 4}), "tabclass": new abap.types.Character(8, {}), "sqltab": new abap.types.Character(30, {}), "as4user": new abap.types.Character(12, {}), "as4date": new abap.types.Date(), "as4time": new abap.types.Time(), "contflag": new abap.types.Character(1, {})}, "DD02L", "DD02L", {}, {}),
+  "keyFields": ["TABNAME","AS4LOCAL","AS4VERS"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/dd09l.tabl.mjs.html b/output/dd09l.tabl.mjs.html new file mode 100644 index 00000000000..2efcfa9a5a3 --- /dev/null +++ b/output/dd09l.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/dd09l.tabl.mjs + + + + + + + + + +
+
+

All files / output dd09l.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["DD09L"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"tabname": new abap.types.Character(30, {}), "as4local": new abap.types.Character(1, {}), "as4vers": new abap.types.Numc({length: 4}), "tabkat": new abap.types.Character(2, {}), "tabart": new abap.types.Character(5, {}), "as4user": new abap.types.Character(12, {}), "as4date": new abap.types.Date(), "as4time": new abap.types.Time(), "bufallow": new abap.types.Character(1, {})}, "DD09L", "DD09L", {}, {}),
+  "keyFields": ["TABNAME","AS4LOCAL","AS4VERS"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/ddfields.ttyp.mjs.html b/output/ddfields.ttyp.mjs.html new file mode 100644 index 00000000000..4c79b95c4a3 --- /dev/null +++ b/output/ddfields.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/ddfields.ttyp.mjs + + + + + + + + + +
+
+

All files / output ddfields.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["DDFIELDS"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"tabname": new abap.types.Character(30, {}), "fieldname": new abap.types.Character(30, {}), "langu": new abap.types.Character(1, {}), "position": new abap.types.Numc({length: 4}), "offset": new abap.types.Numc({length: 6}), "domname": new abap.types.Character(30, {}), "rollname": new abap.types.Character(30, {}), "checktable": new abap.types.Character(1, {}), "leng": new abap.types.Numc({length: 6}), "intlen": new abap.types.Numc({length: 6}), "outputlen": new abap.types.Numc({length: 6}), "decimals": new abap.types.Numc({length: 6}), "datatype": new abap.types.Character(1, {}), "inttype": new abap.types.Character(1, {}), "reftable": new abap.types.Character(1, {}), "reffield": new abap.types.Character(1, {}), "precfield": new abap.types.Character(1, {}), "authorid": new abap.types.Character(1, {}), "memoryid": new abap.types.Character(1, {}), "logflag": new abap.types.Character(1, {}), "mask": new abap.types.Character(20, {}), "masklen": new abap.types.Character(1, {}), "convexit": new abap.types.Character(1, {}), "headlen": new abap.types.Character(1, {}), "scrlen1": new abap.types.Character(1, {}), "scrlen2": new abap.types.Character(1, {}), "scrlen3": new abap.types.Character(1, {}), "fieldtext": new abap.types.Character(1, {}), "reptext": new abap.types.Character(1, {}), "scrtext_s": new abap.types.Character(1, {}), "scrtext_m": new abap.types.Character(1, {}), "scrtext_l": new abap.types.Character(1, {}), "keyflag": new abap.types.Character(1, {}), "lowercase": new abap.types.Character(1, {}), "mac": new abap.types.Character(1, {}), "genkey": new abap.types.Character(1, {}), "noforkey": new abap.types.Character(1, {}), "valexi": new abap.types.Character(1, {}), "noauthch": new abap.types.Character(1, {}), "sign": new abap.types.Character(1, {}), "dynpfld": new abap.types.Character(1, {}), "f4availabl": new abap.types.Character(1, {}), "comptype": new abap.types.Character(1, {}), "outputstyle": new abap.types.Character(1, {}), "lfieldname": new abap.types.Character(132, {})}, "DFIES", "DFIES", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "DDFIELDS"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/ddoption.dtel.mjs.html b/output/ddoption.dtel.mjs.html new file mode 100644 index 00000000000..76103251a03 --- /dev/null +++ b/output/ddoption.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/ddoption.dtel.mjs + + + + + + + + + +
+
+

All files / output ddoption.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["DDOPTION"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(2, {"qualifiedName":"DDOPTION","ddicName":"DDOPTION"}),
+  "domain": "DDOPTION",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/ddsign.dtel.mjs.html b/output/ddsign.dtel.mjs.html new file mode 100644 index 00000000000..7cdfa48de11 --- /dev/null +++ b/output/ddsign.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/ddsign.dtel.mjs + + + + + + + + + +
+
+

All files / output ddsign.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["DDSIGN"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"DDSIGN","ddicName":"DDSIGN"}),
+  "domain": "DDSIGN",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/devclass.dtel.mjs.html b/output/devclass.dtel.mjs.html new file mode 100644 index 00000000000..f437b73cdde --- /dev/null +++ b/output/devclass.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/devclass.dtel.mjs + + + + + + + + + +
+
+

All files / output devclass.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["DEVCLASS"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/dfies.tabl.mjs.html b/output/dfies.tabl.mjs.html new file mode 100644 index 00000000000..f448d695d1d --- /dev/null +++ b/output/dfies.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/dfies.tabl.mjs + + + + + + + + + +
+
+

All files / output dfies.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["DFIES"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"tabname": new abap.types.Character(30, {}), "fieldname": new abap.types.Character(30, {}), "langu": new abap.types.Character(1, {}), "position": new abap.types.Numc({length: 4}), "offset": new abap.types.Numc({length: 6}), "domname": new abap.types.Character(30, {}), "rollname": new abap.types.Character(30, {}), "checktable": new abap.types.Character(1, {}), "leng": new abap.types.Numc({length: 6}), "intlen": new abap.types.Numc({length: 6}), "outputlen": new abap.types.Numc({length: 6}), "decimals": new abap.types.Numc({length: 6}), "datatype": new abap.types.Character(1, {}), "inttype": new abap.types.Character(1, {}), "reftable": new abap.types.Character(1, {}), "reffield": new abap.types.Character(1, {}), "precfield": new abap.types.Character(1, {}), "authorid": new abap.types.Character(1, {}), "memoryid": new abap.types.Character(1, {}), "logflag": new abap.types.Character(1, {}), "mask": new abap.types.Character(20, {}), "masklen": new abap.types.Character(1, {}), "convexit": new abap.types.Character(1, {}), "headlen": new abap.types.Character(1, {}), "scrlen1": new abap.types.Character(1, {}), "scrlen2": new abap.types.Character(1, {}), "scrlen3": new abap.types.Character(1, {}), "fieldtext": new abap.types.Character(1, {}), "reptext": new abap.types.Character(1, {}), "scrtext_s": new abap.types.Character(1, {}), "scrtext_m": new abap.types.Character(1, {}), "scrtext_l": new abap.types.Character(1, {}), "keyflag": new abap.types.Character(1, {}), "lowercase": new abap.types.Character(1, {}), "mac": new abap.types.Character(1, {}), "genkey": new abap.types.Character(1, {}), "noforkey": new abap.types.Character(1, {}), "valexi": new abap.types.Character(1, {}), "noauthch": new abap.types.Character(1, {}), "sign": new abap.types.Character(1, {}), "dynpfld": new abap.types.Character(1, {}), "f4availabl": new abap.types.Character(1, {}), "comptype": new abap.types.Character(1, {}), "outputstyle": new abap.types.Character(1, {}), "lfieldname": new abap.types.Character(132, {})}, "DFIES", "DFIES", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/dokhl.tabl.mjs.html b/output/dokhl.tabl.mjs.html new file mode 100644 index 00000000000..690cd7415ac --- /dev/null +++ b/output/dokhl.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/dokhl.tabl.mjs + + + + + + + + + +
+
+

All files / output dokhl.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["DOKHL"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"id": new abap.types.Character(2, {}), "object": new abap.types.Character(60, {}), "langu": new abap.types.Character(1, {}), "typ": new abap.types.Character(1, {}), "dokversion": new abap.types.Numc({length: 4}), "dokstate": new abap.types.Character(1, {}), "dokform": new abap.types.Character(16, {}), "dokstyle": new abap.types.Character(8, {}), "dokfuser": new abap.types.Character(12, {}), "dokfreles": new abap.types.Character(4, {}), "dokfdate": new abap.types.Date(), "dokftime": new abap.types.Time(), "dokluser": new abap.types.Character(12, {}), "doklreles": new abap.types.Character(4, {}), "dokldate": new abap.types.Date(), "dokltime": new abap.types.Time()}, "DOKHL", "DOKHL", {}, {}),
+  "keyFields": ["ID","OBJECT","LANGU","TYP","DOKVERSION"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/dokil.tabl.mjs.html b/output/dokil.tabl.mjs.html new file mode 100644 index 00000000000..c1ba0000fad --- /dev/null +++ b/output/dokil.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/dokil.tabl.mjs + + + + + + + + + +
+
+

All files / output dokil.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["DOKIL"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"id": new abap.types.Character(2, {}), "object": new abap.types.Character(60, {}), "langu": new abap.types.Character(1, {}), "typ": new abap.types.Character(1, {}), "version": new abap.types.Numc({length: 4}), "masterlang": new abap.types.Character(1, {}), "txtlines": new abap.types.Numc({length: 5}), "dokstate": new abap.types.Character(1, {}), "selfdef": new abap.types.Character(1, {})}, "DOKIL", "DOKIL", {}, {}),
+  "keyFields": ["ID","OBJECT","LANGU","TYP"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/dokstate.dtel.mjs.html b/output/dokstate.dtel.mjs.html new file mode 100644 index 00000000000..eff8c6ee474 --- /dev/null +++ b/output/dokstate.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/dokstate.dtel.mjs + + + + + + + + + +
+
+

All files / output dokstate.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["DOKSTATE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"DOKSTATE","ddicName":"DOKSTATE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/doku_obj.dtel.mjs.html b/output/doku_obj.dtel.mjs.html new file mode 100644 index 00000000000..3d47539efa0 --- /dev/null +++ b/output/doku_obj.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/doku_obj.dtel.mjs + + + + + + + + + +
+
+

All files / output doku_obj.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["DOKU_OBJ"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(60, {"qualifiedName":"DOKU_OBJ","ddicName":"DOKU_OBJ"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/dynprofld.dtel.mjs.html b/output/dynprofld.dtel.mjs.html new file mode 100644 index 00000000000..50454b70829 --- /dev/null +++ b/output/dynprofld.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/dynprofld.dtel.mjs + + + + + + + + + +
+
+

All files / output dynprofld.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["DYNPROFLD"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"DYNPROFLD","ddicName":"DYNPROFLD"}),
+  "domain": "ABAP_BOOLEAN",
+  "fixedValues": [{"description":"False","language":"E"},{"description":"True","low":"X","language":"E"}],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/fieldname.dtel.mjs.html b/output/fieldname.dtel.mjs.html new file mode 100644 index 00000000000..dd83fe5e596 --- /dev/null +++ b/output/fieldname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/fieldname.dtel.mjs + + + + + + + + + +
+
+

All files / output fieldname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["FIELDNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"FIELDNAME","ddicName":"FIELDNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/file_table.tabl.mjs.html b/output/file_table.tabl.mjs.html new file mode 100644 index 00000000000..5c9db1cea00 --- /dev/null +++ b/output/file_table.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/file_table.tabl.mjs + + + + + + + + + +
+
+

All files / output file_table.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["FILE_TABLE"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"filename": new abap.types.Character(1024, {})}, "FILE_TABLE", "FILE_TABLE", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/filetable.ttyp.mjs.html b/output/filetable.ttyp.mjs.html new file mode 100644 index 00000000000..28939b06f7d --- /dev/null +++ b/output/filetable.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/filetable.ttyp.mjs + + + + + + + + + +
+
+

All files / output filetable.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["FILETABLE"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"filename": new abap.types.Character(1024, {})}, "FILE_TABLE", "FILE_TABLE", {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "FILETABLE"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/flag.dtel.mjs.html b/output/flag.dtel.mjs.html new file mode 100644 index 00000000000..b0aa68bf00d --- /dev/null +++ b/output/flag.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/flag.dtel.mjs + + + + + + + + + +
+
+

All files / output flag.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["FLAG"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"FLAG","ddicName":"FLAG"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/funcname.dtel.mjs.html b/output/funcname.dtel.mjs.html new file mode 100644 index 00000000000..cbb62091195 --- /dev/null +++ b/output/funcname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/funcname.dtel.mjs + + + + + + + + + +
+
+

All files / output funcname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["FUNCNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"FUNCNAME","ddicName":"FUNCNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/guid.dtel.mjs.html b/output/guid.dtel.mjs.html new file mode 100644 index 00000000000..eda1907a62b --- /dev/null +++ b/output/guid.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/guid.dtel.mjs + + + + + + + + + +
+
+

All files / output guid.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["GUID"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Hex({length: 16}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/icon.type.mjs.html b/output/icon.type.mjs.html new file mode 100644 index 00000000000..c9297babca6 --- /dev/null +++ b/output/icon.type.mjs.html @@ -0,0 +1,529 @@ + + + + + + Code coverage report for output/icon.type.mjs + + + + + + + + + +
+
+

All files / output icon.type.mjs

+
+ +
+ 100% + Statements + 149/149 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 149/149 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +1491x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const pool = {};
+pool['icon_abap'] = new abap.types.Character(4, {});
+pool['icon_abap'].set('ICON');
+pool['icon_address'] = new abap.types.Character(4, {});
+pool['icon_address'].set('ICON');
+pool['icon_adopt'] = new abap.types.Character(4, {});
+pool['icon_adopt'].set('ICON');
+pool['icon_ben_current_benefits'] = new abap.types.Character(4, {});
+pool['icon_ben_current_benefits'].set('ICON');
+pool['icon_biw_report'] = new abap.types.Character(4, {});
+pool['icon_biw_report'].set('ICON');
+pool['icon_biw_source_sys_r3'] = new abap.types.Character(4, {});
+pool['icon_biw_source_sys_r3'].set('ICON');
+pool['icon_change'] = new abap.types.Character(4, {});
+pool['icon_change'].set('ICON');
+pool['icon_change_text'] = new abap.types.Character(4, {});
+pool['icon_change_text'].set('ICON');
+pool['icon_compare'] = new abap.types.Character(4, {});
+pool['icon_compare'].set('ICON');
+pool['icon_complete'] = new abap.types.Character(4, {});
+pool['icon_complete'].set('ICON');
+pool['icon_connect'] = new abap.types.Character(4, {});
+pool['icon_connect'].set('ICON');
+pool['icon_copy_object'] = new abap.types.Character(4, {});
+pool['icon_copy_object'].set('ICON');
+pool['icon_create'] = new abap.types.Character(4, {});
+pool['icon_create'].set('ICON');
+pool['icon_database_table'] = new abap.types.Character(4, {});
+pool['icon_database_table'].set('ICON');
+pool['icon_delete'] = new abap.types.Character(4, {});
+pool['icon_delete'].set('ICON');
+pool['icon_delete_favorites'] = new abap.types.Character(4, {});
+pool['icon_delete_favorites'].set('ICON');
+pool['icon_delete_row'] = new abap.types.Character(4, {});
+pool['icon_delete_row'].set('ICON');
+pool['icon_delete_template'] = new abap.types.Character(4, {});
+pool['icon_delete_template'].set('ICON');
+pool['icon_delivery_inbound'] = new abap.types.Character(4, {});
+pool['icon_delivery_inbound'].set('ICON');
+pool['icon_deselect_all'] = new abap.types.Character(4, {});
+pool['icon_deselect_all'].set('ICON');
+pool['icon_detail'] = new abap.types.Character(4, {});
+pool['icon_detail'].set('ICON');
+pool['icon_display'] = new abap.types.Character(4, {});
+pool['icon_display'].set('ICON');
+pool['icon_document'] = new abap.types.Character(4, {});
+pool['icon_document'].set('ICON');
+pool['icon_element'] = new abap.types.Character(4, {});
+pool['icon_element'].set('ICON');
+pool['icon_execute_object'] = new abap.types.Character(4, {});
+pool['icon_execute_object'].set('ICON');
+pool['icon_foreign_key'] = new abap.types.Character(4, {});
+pool['icon_foreign_key'].set('ICON');
+pool['icon_generate'] = new abap.types.Character(4, {});
+pool['icon_generate'].set('ICON');
+pool['icon_green_light'] = new abap.types.Character(4, {});
+pool['icon_green_light'].set('ICON');
+pool['icon_hint'] = new abap.types.Character(4, {});
+pool['icon_hint'].set('ICON');
+pool['icon_host'] = new abap.types.Character(4, {});
+pool['icon_host'].set('ICON');
+pool['icon_incoming_object'] = new abap.types.Character(4, {});
+pool['icon_incoming_object'].set('ICON');
+pool['icon_insert_row'] = new abap.types.Character(4, {});
+pool['icon_insert_row'].set('ICON');
+pool['icon_led_green'] = new abap.types.Character(4, {});
+pool['icon_led_green'].set('ICON');
+pool['icon_led_inactive'] = new abap.types.Character(4, {});
+pool['icon_led_inactive'].set('ICON');
+pool['icon_led_red'] = new abap.types.Character(4, {});
+pool['icon_led_red'].set('ICON');
+pool['icon_led_yellow'] = new abap.types.Character(4, {});
+pool['icon_led_yellow'].set('ICON');
+pool['icon_list'] = new abap.types.Character(4, {});
+pool['icon_list'].set('ICON');
+pool['icon_message_critical'] = new abap.types.Character(4, {});
+pool['icon_message_critical'].set('ICON');
+pool['icon_message_information'] = new abap.types.Character(4, {});
+pool['icon_message_information'].set('ICON');
+pool['icon_message_question'] = new abap.types.Character(4, {});
+pool['icon_message_question'].set('ICON');
+pool['icon_no_status'] = new abap.types.Character(4, {});
+pool['icon_no_status'].set('ICON');
+pool['icon_object_list'] = new abap.types.Character(4, {});
+pool['icon_object_list'].set('ICON');
+pool['icon_okay'] = new abap.types.Character(4, {});
+pool['icon_okay'].set('ICON');
+pool['icon_outgoing_object'] = new abap.types.Character(4, {});
+pool['icon_outgoing_object'].set('ICON');
+pool['icon_package_standard'] = new abap.types.Character(4, {});
+pool['icon_package_standard'].set('ICON');
+pool['icon_parameter_result'] = new abap.types.Character(4, {});
+pool['icon_parameter_result'].set('ICON');
+pool['icon_plant'] = new abap.types.Character(4, {});
+pool['icon_plant'].set('ICON');
+pool['icon_pm_insert'] = new abap.types.Character(4, {});
+pool['icon_pm_insert'].set('ICON');
+pool['icon_pm_press'] = new abap.types.Character(4, {});
+pool['icon_pm_press'].set('ICON');
+pool['icon_profit_center'] = new abap.types.Character(4, {});
+pool['icon_profit_center'].set('ICON');
+pool['icon_question'] = new abap.types.Character(4, {});
+pool['icon_question'].set('ICON');
+pool['icon_red_light'] = new abap.types.Character(4, {});
+pool['icon_red_light'].set('ICON');
+pool['icon_refresh'] = new abap.types.Character(4, {});
+pool['icon_refresh'].set('ICON');
+pool['icon_relation'] = new abap.types.Character(4, {});
+pool['icon_relation'].set('ICON');
+pool['icon_release'] = new abap.types.Character(4, {});
+pool['icon_release'].set('ICON');
+pool['icon_set_state'] = new abap.types.Character(4, {});
+pool['icon_set_state'].set('ICON');
+pool['icon_simulate'] = new abap.types.Character(4, {});
+pool['icon_simulate'].set('ICON');
+pool['icon_space'] = new abap.types.Character(4, {});
+pool['icon_space'].set('ICON');
+pool['icon_stack'] = new abap.types.Character(4, {});
+pool['icon_stack'].set('ICON');
+pool['icon_store_location'] = new abap.types.Character(4, {});
+pool['icon_store_location'].set('ICON');
+pool['icon_structure'] = new abap.types.Character(4, {});
+pool['icon_structure'].set('ICON');
+pool['icon_sym_log_server'] = new abap.types.Character(4, {});
+pool['icon_sym_log_server'].set('ICON');
+pool['icon_system_help'] = new abap.types.Character(4, {});
+pool['icon_system_help'].set('ICON');
+pool['icon_system_local_paste'] = new abap.types.Character(4, {});
+pool['icon_system_local_paste'].set('ICON');
+pool['icon_terminated_org_unit'] = new abap.types.Character(4, {});
+pool['icon_terminated_org_unit'].set('ICON');
+pool['icon_test'] = new abap.types.Character(4, {});
+pool['icon_test'].set('ICON');
+pool['icon_total_left'] = new abap.types.Character(4, {});
+pool['icon_total_left'].set('ICON');
+pool['icon_transport'] = new abap.types.Character(4, {});
+pool['icon_transport'].set('ICON');
+pool['icon_warehouse'] = new abap.types.Character(4, {});
+pool['icon_warehouse'].set('ICON');
+pool['icon_wd_context'] = new abap.types.Character(4, {});
+pool['icon_wd_context'].set('ICON');
+pool['icon_wd_table'] = new abap.types.Character(4, {});
+pool['icon_wd_table'].set('ICON');
+pool['icon_wf_workitem_completed'] = new abap.types.Character(4, {});
+pool['icon_wf_workitem_completed'].set('ICON');
+pool['icon_yellow_light'] = new abap.types.Character(4, {});
+pool['icon_yellow_light'].set('ICON');
+abap.TypePools['ICON'] = pool;
+//# sourceMappingURL=icon.type.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/icon_d.dtel.mjs.html b/output/icon_d.dtel.mjs.html new file mode 100644 index 00000000000..213ea032e24 --- /dev/null +++ b/output/icon_d.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/icon_d.dtel.mjs + + + + + + + + + +
+
+

All files / output icon_d.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["ICON_D"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_abap_channel_types.intf.mjs.html b/output/if_abap_channel_types.intf.mjs.html new file mode 100644 index 00000000000..9015e95f75e --- /dev/null +++ b/output/if_abap_channel_types.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_abap_channel_types.intf.mjs + + + + + + + + + +
+
+

All files / output if_abap_channel_types.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_abap_channel_types.intf.abap
+class if_abap_channel_types {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['IF_ABAP_CHANNEL_TYPES'] = if_abap_channel_types;if_abap_channel_types.ty_apc_tcp_frame = new abap.types.Structure({"frame_type": new abap.types.Integer({qualifiedName: "IF_ABAP_CHANNEL_TYPES=>TY_APC_TCP_FRAME-FRAME_TYPE"}), "fixed_length": new abap.types.Integer({qualifiedName: "IF_ABAP_CHANNEL_TYPES=>TY_APC_TCP_FRAME-FIXED_LENGTH"}), "terminator": new abap.types.String({qualifiedName: "IF_ABAP_CHANNEL_TYPES=>TY_APC_TCP_FRAME-TERMINATOR"}), "length_field_length": new abap.types.Integer({qualifiedName: "IF_ABAP_CHANNEL_TYPES=>TY_APC_TCP_FRAME-LENGTH_FIELD_LENGTH"}), "length_field_offset": new abap.types.Integer({qualifiedName: "IF_ABAP_CHANNEL_TYPES=>TY_APC_TCP_FRAME-LENGTH_FIELD_OFFSET"}), "length_field_header": new abap.types.Integer({qualifiedName: "IF_ABAP_CHANNEL_TYPES=>TY_APC_TCP_FRAME-LENGTH_FIELD_HEADER"})}, "if_abap_channel_types=>ty_apc_tcp_frame", undefined, {}, {});
+if_abap_channel_types.ty_tihttpnvp = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");
+export {if_abap_channel_types};
+//# sourceMappingURL=if_abap_channel_types.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_abap_conv_in.intf.mjs.html b/output/if_abap_conv_in.intf.mjs.html new file mode 100644 index 00000000000..c08b3c9b2d5 --- /dev/null +++ b/output/if_abap_conv_in.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_abap_conv_in.intf.mjs + + + + + + + + + +
+
+

All files / output if_abap_conv_in.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_abap_conv_in.intf.abap
+class if_abap_conv_in {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CONVERT": {"visibility": "U", "parameters": {"RESULT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "SOURCE": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_ABAP_CONV_IN'] = if_abap_conv_in;
+export {if_abap_conv_in};
+//# sourceMappingURL=if_abap_conv_in.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_abap_conv_out.intf.mjs.html b/output/if_abap_conv_out.intf.mjs.html new file mode 100644 index 00000000000..50ad9c04cd3 --- /dev/null +++ b/output/if_abap_conv_out.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_abap_conv_out.intf.mjs + + + + + + + + + +
+
+

All files / output if_abap_conv_out.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_abap_conv_out.intf.abap
+class if_abap_conv_out {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CONVERT": {"visibility": "U", "parameters": {"RESULT": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}, "SOURCE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_ABAP_CONV_OUT'] = if_abap_conv_out;
+export {if_abap_conv_out};
+//# sourceMappingURL=if_abap_conv_out.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_abap_unit_constant.intf.mjs.html b/output/if_abap_unit_constant.intf.mjs.html new file mode 100644 index 00000000000..f4ed93e1ff1 --- /dev/null +++ b/output/if_abap_unit_constant.intf.mjs.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for output/if_abap_unit_constant.intf.mjs + + + + + + + + + +
+
+

All files / output if_abap_unit_constant.intf.mjs

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_abap_unit_constant.intf.abap
+class if_abap_unit_constant {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"SEVERITY": {"type": () => {return new abap.types.Structure({"low": new abap.types.Integer({qualifiedName: "INT1"}), "medium": new abap.types.Integer({qualifiedName: "INT1"}), "high": new abap.types.Integer({qualifiedName: "INT1"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "QUIT": {"type": () => {return new abap.types.Structure({"test": new abap.types.Integer({qualifiedName: "INT1"}), "no": new abap.types.Integer({qualifiedName: "INT1"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_ABAP_UNIT_CONSTANT'] = if_abap_unit_constant;
+if_abap_unit_constant.if_abap_unit_constant$severity = new abap.types.Structure({"low": new abap.types.Integer({qualifiedName: "INT1"}), "medium": new abap.types.Integer({qualifiedName: "INT1"}), "high": new abap.types.Integer({qualifiedName: "INT1"})}, undefined, undefined, {}, {});
+if_abap_unit_constant.if_abap_unit_constant$severity.get().low.set(0);
+if_abap_unit_constant.if_abap_unit_constant$severity.get().medium.set(1);
+if_abap_unit_constant.if_abap_unit_constant$severity.get().high.set(2);
+if_abap_unit_constant.if_abap_unit_constant$quit = new abap.types.Structure({"test": new abap.types.Integer({qualifiedName: "INT1"}), "no": new abap.types.Integer({qualifiedName: "INT1"})}, undefined, undefined, {}, {});
+if_abap_unit_constant.if_abap_unit_constant$quit.get().test.set(1);
+if_abap_unit_constant.if_abap_unit_constant$quit.get().no.set(5);
+export {if_abap_unit_constant};
+//# sourceMappingURL=if_abap_unit_constant.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_tcp_frame_types.intf.mjs.html b/output/if_apc_tcp_frame_types.intf.mjs.html new file mode 100644 index 00000000000..6bdc06fb440 --- /dev/null +++ b/output/if_apc_tcp_frame_types.intf.mjs.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for output/if_apc_tcp_frame_types.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_tcp_frame_types.intf.mjs

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_tcp_frame_types.intf.abap
+class if_apc_tcp_frame_types {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_FRAME_TYPE_FIXED_LENGTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_FRAME_TYPE_TERMINATOR": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_FRAME_TYPE_LENGTH_FIELD": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_APC_TCP_FRAME_TYPES'] = if_apc_tcp_frame_types;
+if_apc_tcp_frame_types.if_apc_tcp_frame_types$co_frame_type_fixed_length = new abap.types.Integer({qualifiedName: "I"});
+if_apc_tcp_frame_types.if_apc_tcp_frame_types$co_frame_type_fixed_length.set(1);
+if_apc_tcp_frame_types.if_apc_tcp_frame_types$co_frame_type_terminator = new abap.types.Integer({qualifiedName: "I"});
+if_apc_tcp_frame_types.if_apc_tcp_frame_types$co_frame_type_terminator.set(2);
+if_apc_tcp_frame_types.if_apc_tcp_frame_types$co_frame_type_length_field = new abap.types.Integer({qualifiedName: "I"});
+if_apc_tcp_frame_types.if_apc_tcp_frame_types$co_frame_type_length_field.set(3);
+export {if_apc_tcp_frame_types};
+//# sourceMappingURL=if_apc_tcp_frame_types.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_wsp_binding_manager.intf.mjs.html b/output/if_apc_wsp_binding_manager.intf.mjs.html new file mode 100644 index 00000000000..b7ee26d3db6 --- /dev/null +++ b/output/if_apc_wsp_binding_manager.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_apc_wsp_binding_manager.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_wsp_binding_manager.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_wsp_binding_manager.intf.abap
+class if_apc_wsp_binding_manager {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"BIND_AMC_MESSAGE_CONSUMER": {"visibility": "U", "parameters": {"I_APPLICATION_ID": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_CHANNEL_ID": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}}};
+}
+abap.Classes['IF_APC_WSP_BINDING_MANAGER'] = if_apc_wsp_binding_manager;
+export {if_apc_wsp_binding_manager};
+//# sourceMappingURL=if_apc_wsp_binding_manager.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_wsp_client.intf.mjs.html b/output/if_apc_wsp_client.intf.mjs.html new file mode 100644 index 00000000000..7ca98c7c2a9 --- /dev/null +++ b/output/if_apc_wsp_client.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/if_apc_wsp_client.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_wsp_client.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_wsp_client.intf.abap
+class if_apc_wsp_client {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CONNECT": {"visibility": "U", "parameters": {}},
+  "CLOSE": {"visibility": "U", "parameters": {}},
+  "GET_MESSAGE_MANAGER": {"visibility": "U", "parameters": {"RI_MANAGER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_MESSAGE_MANAGER", RTTIName: "\\INTERFACE=IF_APC_WSP_MESSAGE_MANAGER"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_APC_WSP_CLIENT'] = if_apc_wsp_client;
+export {if_apc_wsp_client};
+//# sourceMappingURL=if_apc_wsp_client.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_wsp_event_handler.intf.mjs.html b/output/if_apc_wsp_event_handler.intf.mjs.html new file mode 100644 index 00000000000..4c82ead9b65 --- /dev/null +++ b/output/if_apc_wsp_event_handler.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/if_apc_wsp_event_handler.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_wsp_event_handler.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_wsp_event_handler.intf.abap
+class if_apc_wsp_event_handler {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ON_OPEN": {"visibility": "U", "parameters": {}},
+  "ON_MESSAGE": {"visibility": "U", "parameters": {"I_MESSAGE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_MESSAGE", RTTIName: "\\INTERFACE=IF_APC_WSP_MESSAGE"});}, "is_optional": " "}}},
+  "ON_CLOSE": {"visibility": "U", "parameters": {}},
+  "ON_ERROR": {"visibility": "U", "parameters": {}}};
+}
+abap.Classes['IF_APC_WSP_EVENT_HANDLER'] = if_apc_wsp_event_handler;
+export {if_apc_wsp_event_handler};
+//# sourceMappingURL=if_apc_wsp_event_handler.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_wsp_extension.intf.mjs.html b/output/if_apc_wsp_extension.intf.mjs.html new file mode 100644 index 00000000000..0ca7c1b5c60 --- /dev/null +++ b/output/if_apc_wsp_extension.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_apc_wsp_extension.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_wsp_extension.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_wsp_extension.intf.abap
+class if_apc_wsp_extension {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ON_START": {"visibility": "U", "parameters": {"I_CONTEXT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_SERVER_CONTEXT", RTTIName: "\\INTERFACE=IF_APC_WSP_SERVER_CONTEXT"});}, "is_optional": " "}, "I_MESSAGE_MANAGER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_MESSAGE_MANAGER", RTTIName: "\\INTERFACE=IF_APC_WSP_MESSAGE_MANAGER"});}, "is_optional": " "}}},
+  "ON_MESSAGE": {"visibility": "U", "parameters": {"I_MESSAGE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_MESSAGE", RTTIName: "\\INTERFACE=IF_APC_WSP_MESSAGE"});}, "is_optional": " "}, "I_MESSAGE_MANAGER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_MESSAGE_MANAGER", RTTIName: "\\INTERFACE=IF_APC_WSP_MESSAGE_MANAGER"});}, "is_optional": " "}, "I_CONTEXT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_SERVER_CONTEXT", RTTIName: "\\INTERFACE=IF_APC_WSP_SERVER_CONTEXT"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_APC_WSP_EXTENSION'] = if_apc_wsp_extension;
+export {if_apc_wsp_extension};
+//# sourceMappingURL=if_apc_wsp_extension.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_wsp_initial_request.intf.mjs.html b/output/if_apc_wsp_initial_request.intf.mjs.html new file mode 100644 index 00000000000..0384b5ecc61 --- /dev/null +++ b/output/if_apc_wsp_initial_request.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_apc_wsp_initial_request.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_wsp_initial_request.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_wsp_initial_request.intf.abap
+class if_apc_wsp_initial_request {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_FORM_FIELDS": {"visibility": "U", "parameters": {"I_FORMFIELD_ENCODING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "C_FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}}},
+  "GET_HEADER_FIELDS": {"visibility": "U", "parameters": {"C_FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}}}};
+}
+abap.Classes['IF_APC_WSP_INITIAL_REQUEST'] = if_apc_wsp_initial_request;
+export {if_apc_wsp_initial_request};
+//# sourceMappingURL=if_apc_wsp_initial_request.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_wsp_message.intf.mjs.html b/output/if_apc_wsp_message.intf.mjs.html new file mode 100644 index 00000000000..d4ca13afd92 --- /dev/null +++ b/output/if_apc_wsp_message.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/if_apc_wsp_message.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_wsp_message.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_wsp_message.intf.abap
+class if_apc_wsp_message {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_BINARY": {"visibility": "U", "parameters": {"RV_BINARY": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "SET_BINARY": {"visibility": "U", "parameters": {"IV_BINARY": {"type": () => {return new abap.types.Hex();}, "is_optional": " "}}},
+  "GET_TEXT": {"visibility": "U", "parameters": {"R_MESSAGE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_APC_WSP_MESSAGE'] = if_apc_wsp_message;
+export {if_apc_wsp_message};
+//# sourceMappingURL=if_apc_wsp_message.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_wsp_message_manager.intf.mjs.html b/output/if_apc_wsp_message_manager.intf.mjs.html new file mode 100644 index 00000000000..83418b4a31f --- /dev/null +++ b/output/if_apc_wsp_message_manager.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_apc_wsp_message_manager.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_wsp_message_manager.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_wsp_message_manager.intf.abap
+class if_apc_wsp_message_manager {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_MESSAGE": {"visibility": "U", "parameters": {"RI_MESSAGE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_MESSAGE", RTTIName: "\\INTERFACE=IF_APC_WSP_MESSAGE"});}, "is_optional": " "}}},
+  "SEND": {"visibility": "U", "parameters": {"II_MESSAGE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_MESSAGE", RTTIName: "\\INTERFACE=IF_APC_WSP_MESSAGE"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_APC_WSP_MESSAGE_MANAGER'] = if_apc_wsp_message_manager;
+export {if_apc_wsp_message_manager};
+//# sourceMappingURL=if_apc_wsp_message_manager.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_apc_wsp_server_context.intf.mjs.html b/output/if_apc_wsp_server_context.intf.mjs.html new file mode 100644 index 00000000000..c212bc1183f --- /dev/null +++ b/output/if_apc_wsp_server_context.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_apc_wsp_server_context.intf.mjs + + + + + + + + + +
+
+

All files / output if_apc_wsp_server_context.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_apc_wsp_server_context.intf.abap
+class if_apc_wsp_server_context {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_INITIAL_REQUEST": {"visibility": "U", "parameters": {"R_INITIAL_REQUEST": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_INITIAL_REQUEST", RTTIName: "\\INTERFACE=IF_APC_WSP_INITIAL_REQUEST"});}, "is_optional": " "}}},
+  "GET_BINDING_MANAGER": {"visibility": "U", "parameters": {"R_BINDING_MANAGER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_APC_WSP_BINDING_MANAGER", RTTIName: "\\INTERFACE=IF_APC_WSP_BINDING_MANAGER"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_APC_WSP_SERVER_CONTEXT'] = if_apc_wsp_server_context;
+export {if_apc_wsp_server_context};
+//# sourceMappingURL=if_apc_wsp_server_context.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_aunit_constants.intf.mjs.html b/output/if_aunit_constants.intf.mjs.html new file mode 100644 index 00000000000..8263a9adf2b --- /dev/null +++ b/output/if_aunit_constants.intf.mjs.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for output/if_aunit_constants.intf.mjs + + + + + + + + + +
+
+

All files / output if_aunit_constants.intf.mjs

+
+ +
+ 100% + Statements + 35/35 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 35/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +351x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_aunit_constants.intf.abap
+class if_aunit_constants {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"NO": {"type": () => {return new abap.types.Integer({qualifiedName: "INT1"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CRITICAL": {"type": () => {return new abap.types.Integer({qualifiedName: "INT1"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "FATAL": {"type": () => {return new abap.types.Integer({qualifiedName: "INT1"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "TOLERABLE": {"type": () => {return new abap.types.Integer({qualifiedName: "INT1"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "METHOD": {"type": () => {return new abap.types.Integer({qualifiedName: "INT1"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CLASS_": {"type": () => {return new abap.types.Integer({qualifiedName: "INT1"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "SEVERITY": {"type": () => {return new abap.types.Structure({"low": new abap.types.Integer({qualifiedName: "INT1"}), "medium": new abap.types.Integer({qualifiedName: "INT1"}), "high": new abap.types.Integer({qualifiedName: "INT1"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "QUIT": {"type": () => {return new abap.types.Structure({"no": new abap.types.Integer({qualifiedName: "INT1"}), "test": new abap.types.Integer({qualifiedName: "INT1"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_AUNIT_CONSTANTS'] = if_aunit_constants;
+if_aunit_constants.if_aunit_constants$no = new abap.types.Integer({qualifiedName: "INT1"});
+if_aunit_constants.if_aunit_constants$no.set(0);
+if_aunit_constants.if_aunit_constants$critical = new abap.types.Integer({qualifiedName: "INT1"});
+if_aunit_constants.if_aunit_constants$critical.set(1);
+if_aunit_constants.if_aunit_constants$fatal = new abap.types.Integer({qualifiedName: "INT1"});
+if_aunit_constants.if_aunit_constants$fatal.set(1);
+if_aunit_constants.if_aunit_constants$tolerable = new abap.types.Integer({qualifiedName: "INT1"});
+if_aunit_constants.if_aunit_constants$tolerable.set(1);
+if_aunit_constants.if_aunit_constants$method = new abap.types.Integer({qualifiedName: "INT1"});
+if_aunit_constants.if_aunit_constants$method.set(1);
+if_aunit_constants.if_aunit_constants$class_ = new abap.types.Integer({qualifiedName: "INT1"});
+if_aunit_constants.if_aunit_constants$class_.set(2);
+if_aunit_constants.if_aunit_constants$severity = new abap.types.Structure({"low": new abap.types.Integer({qualifiedName: "INT1"}), "medium": new abap.types.Integer({qualifiedName: "INT1"}), "high": new abap.types.Integer({qualifiedName: "INT1"})}, undefined, undefined, {}, {});
+if_aunit_constants.if_aunit_constants$severity.get().low.set(0);
+if_aunit_constants.if_aunit_constants$severity.get().medium.set(1);
+if_aunit_constants.if_aunit_constants$severity.get().high.set(2);
+if_aunit_constants.if_aunit_constants$quit = new abap.types.Structure({"no": new abap.types.Integer({qualifiedName: "INT1"}), "test": new abap.types.Integer({qualifiedName: "INT1"})}, undefined, undefined, {}, {});
+if_aunit_constants.if_aunit_constants$quit.get().no.set(0);
+if_aunit_constants.if_aunit_constants$quit.get().test.set(1);
+export {if_aunit_constants};
+//# sourceMappingURL=if_aunit_constants.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_document_bcs.intf.mjs.html b/output/if_document_bcs.intf.mjs.html new file mode 100644 index 00000000000..c316f752f04 --- /dev/null +++ b/output/if_document_bcs.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_document_bcs.intf.mjs + + + + + + + + + +
+
+

All files / output if_document_bcs.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_document_bcs.intf.abap
+class if_document_bcs {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['IF_DOCUMENT_BCS'] = if_document_bcs;
+export {if_document_bcs};
+//# sourceMappingURL=if_document_bcs.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ftd_input_arguments.intf.mjs.html b/output/if_ftd_input_arguments.intf.mjs.html new file mode 100644 index 00000000000..7d0b22c04e5 --- /dev/null +++ b/output/if_ftd_input_arguments.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ftd_input_arguments.intf.mjs + + + + + + + + + +
+
+

All files / output if_ftd_input_arguments.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ftd_input_arguments.intf.abap
+class if_ftd_input_arguments {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_IMPORTING_PARAMETER": {"visibility": "U", "parameters": {"RESULT": {"type": () => {return new abap.types.DataReference(new abap.types.Character(4));}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"abap_parmname"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_FTD_INPUT_ARGUMENTS'] = if_ftd_input_arguments;
+export {if_ftd_input_arguments};
+//# sourceMappingURL=if_ftd_input_arguments.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ftd_input_config_setter.intf.mjs.html b/output/if_ftd_input_config_setter.intf.mjs.html new file mode 100644 index 00000000000..d4ce8d1519b --- /dev/null +++ b/output/if_ftd_input_config_setter.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ftd_input_config_setter.intf.mjs + + + + + + + + + +
+
+

All files / output if_ftd_input_config_setter.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ftd_input_config_setter.intf.abap
+class if_ftd_input_config_setter {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"IGNORE_ALL_PARAMETERS": {"visibility": "U", "parameters": {"OUTPUT_CONFIGURATION_SETTER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FTD_OUTPUT_CONFIG_SETTER", RTTIName: "\\INTERFACE=IF_FTD_OUTPUT_CONFIG_SETTER"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_FTD_INPUT_CONFIG_SETTER'] = if_ftd_input_config_setter;
+export {if_ftd_input_config_setter};
+//# sourceMappingURL=if_ftd_input_config_setter.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ftd_invocation_answer.intf.mjs.html b/output/if_ftd_invocation_answer.intf.mjs.html new file mode 100644 index 00000000000..62d99c912f7 --- /dev/null +++ b/output/if_ftd_invocation_answer.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ftd_invocation_answer.intf.mjs + + + + + + + + + +
+
+

All files / output if_ftd_invocation_answer.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ftd_invocation_answer.intf.abap
+class if_ftd_invocation_answer {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ANSWER": {"visibility": "U", "parameters": {"ARGUMENTS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FTD_INPUT_ARGUMENTS", RTTIName: "\\INTERFACE=IF_FTD_INPUT_ARGUMENTS"});}, "is_optional": " "}, "RESULT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FTD_INVOCATION_RESULT", RTTIName: "\\INTERFACE=IF_FTD_INVOCATION_RESULT"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_FTD_INVOCATION_ANSWER'] = if_ftd_invocation_answer;
+export {if_ftd_invocation_answer};
+//# sourceMappingURL=if_ftd_invocation_answer.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ftd_invocation_result.intf.mjs.html b/output/if_ftd_invocation_result.intf.mjs.html new file mode 100644 index 00000000000..458394a6970 --- /dev/null +++ b/output/if_ftd_invocation_result.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ftd_invocation_result.intf.mjs + + + + + + + + + +
+
+

All files / output if_ftd_invocation_result.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ftd_invocation_result.intf.abap
+class if_ftd_invocation_result {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_OUTPUT_CONFIGURATION": {"visibility": "U", "parameters": {"RESULT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FTD_OUTPUT_CONFIGURATION", RTTIName: "\\INTERFACE=IF_FTD_OUTPUT_CONFIGURATION"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_FTD_INVOCATION_RESULT'] = if_ftd_invocation_result;
+export {if_ftd_invocation_result};
+//# sourceMappingURL=if_ftd_invocation_result.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ftd_output_config_setter.intf.mjs.html b/output/if_ftd_output_config_setter.intf.mjs.html new file mode 100644 index 00000000000..0294ea8bed7 --- /dev/null +++ b/output/if_ftd_output_config_setter.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ftd_output_config_setter.intf.mjs + + + + + + + + + +
+
+

All files / output if_ftd_output_config_setter.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ftd_output_config_setter.intf.abap
+class if_ftd_output_config_setter {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"THEN_ANSWER": {"visibility": "U", "parameters": {"SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FTD_OUTPUT_CONFIG_SETTER", RTTIName: "\\INTERFACE=IF_FTD_OUTPUT_CONFIG_SETTER"});}, "is_optional": " "}, "ANSWER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FTD_INVOCATION_ANSWER", RTTIName: "\\INTERFACE=IF_FTD_INVOCATION_ANSWER"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_FTD_OUTPUT_CONFIG_SETTER'] = if_ftd_output_config_setter;
+export {if_ftd_output_config_setter};
+//# sourceMappingURL=if_ftd_output_config_setter.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ftd_output_configuration.intf.mjs.html b/output/if_ftd_output_configuration.intf.mjs.html new file mode 100644 index 00000000000..36398b81dd1 --- /dev/null +++ b/output/if_ftd_output_configuration.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ftd_output_configuration.intf.mjs + + + + + + + + + +
+
+

All files / output if_ftd_output_configuration.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ftd_output_configuration.intf.abap
+class if_ftd_output_configuration {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"SET_EXPORTING_PARAMETER": {"visibility": "U", "parameters": {"SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FTD_OUTPUT_CONFIGURATION", RTTIName: "\\INTERFACE=IF_FTD_OUTPUT_CONFIGURATION"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"abap_parmname"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}}};
+}
+abap.Classes['IF_FTD_OUTPUT_CONFIGURATION'] = if_ftd_output_configuration;
+export {if_ftd_output_configuration};
+//# sourceMappingURL=if_ftd_output_configuration.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_function_test_environment.intf.mjs.html b/output/if_function_test_environment.intf.mjs.html new file mode 100644 index 00000000000..567b5ec191c --- /dev/null +++ b/output/if_function_test_environment.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_function_test_environment.intf.mjs + + + + + + + + + +
+
+

All files / output if_function_test_environment.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_function_test_environment.intf.abap
+class if_function_test_environment {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_DOUBLE": {"visibility": "U", "parameters": {"RESULT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FUNCTION_TESTDOUBLE", RTTIName: "\\INTERFACE=IF_FUNCTION_TESTDOUBLE"});}, "is_optional": " "}, "FUNCTION_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SXCO_FM_NAME","ddicName":"SXCO_FM_NAME"});}, "is_optional": " "}}},
+  "CLEAR_DOUBLES": {"visibility": "U", "parameters": {}}};
+}
+abap.Classes['IF_FUNCTION_TEST_ENVIRONMENT'] = if_function_test_environment;if_function_test_environment.tt_function_dependencies = abap.types.TableFactory.construct(new abap.types.Character(30, {"qualifiedName":"SXCO_FM_NAME","ddicName":"SXCO_FM_NAME"}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["TABLE_LINE"]},"secondary":[]}, "if_function_test_environment=>tt_function_dependencies");
+export {if_function_test_environment};
+//# sourceMappingURL=if_function_test_environment.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_function_testdouble.intf.mjs.html b/output/if_function_testdouble.intf.mjs.html new file mode 100644 index 00000000000..53c515fb34f --- /dev/null +++ b/output/if_function_testdouble.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_function_testdouble.intf.mjs + + + + + + + + + +
+
+

All files / output if_function_testdouble.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_function_testdouble.intf.abap
+class if_function_testdouble {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CONFIGURE_CALL": {"visibility": "U", "parameters": {"INPUT_CONFIGURATION_SETTER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_FTD_INPUT_CONFIG_SETTER", RTTIName: "\\INTERFACE=IF_FTD_INPUT_CONFIG_SETTER"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_FUNCTION_TESTDOUBLE'] = if_function_testdouble;
+export {if_function_testdouble};
+//# sourceMappingURL=if_function_testdouble.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_http_client.intf.mjs.html b/output/if_http_client.intf.mjs.html new file mode 100644 index 00000000000..e0a30c660be --- /dev/null +++ b/output/if_http_client.intf.mjs.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for output/if_http_client.intf.mjs + + + + + + + + + +
+
+

All files / output if_http_client.intf.mjs

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 23/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_http_client.intf.abap
+class if_http_client {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"REQUEST": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_REQUEST", RTTIName: "\\INTERFACE=IF_HTTP_REQUEST"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "RESPONSE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_RESPONSE", RTTIName: "\\INTERFACE=IF_HTTP_RESPONSE"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "PROPERTYTYPE_LOGON_POPUP": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "PROPERTYTYPE_ACCEPT_COOKIE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "CO_DISABLED": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_ENABLED": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"AUTHENTICATE": {"visibility": "U", "parameters": {"PROXY_AUTHENTICATION": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "USERNAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PASSWORD": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CLOSE": {"visibility": "U", "parameters": {}},
+  "SEND": {"visibility": "U", "parameters": {"TIMEOUT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "RECEIVE": {"visibility": "U", "parameters": {}},
+  "SEND_SAP_LOGON_TICKET": {"visibility": "U", "parameters": {}},
+  "GET_LAST_ERROR": {"visibility": "U", "parameters": {"CODE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "MESSAGE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_HTTP_CLIENT'] = if_http_client;
+if_http_client.if_http_client$co_disabled = new abap.types.Integer({qualifiedName: "I"});
+if_http_client.if_http_client$co_disabled.set(0);
+if_http_client.if_http_client$co_enabled = new abap.types.Integer({qualifiedName: "I"});
+if_http_client.if_http_client$co_enabled.set(1);
+export {if_http_client};
+//# sourceMappingURL=if_http_client.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_http_entity.intf.mjs.html b/output/if_http_entity.intf.mjs.html new file mode 100644 index 00000000000..358ba4eaf87 --- /dev/null +++ b/output/if_http_entity.intf.mjs.html @@ -0,0 +1,256 @@ + + + + + + Code coverage report for output/if_http_entity.intf.mjs + + + + + + + + + +
+
+

All files / output if_http_entity.intf.mjs

+
+ +
+ 100% + Statements + 58/58 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 58/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +581x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_http_entity.intf.abap
+class if_http_entity {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_REQUEST_METHOD_GET": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_REQUEST_METHOD_POST": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_BODY_BEFORE_QUERY_STRING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"SET_CDATA": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "OFFSET": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "LENGTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_DATA": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "GET_HEADER_FIELD": {"visibility": "U", "parameters": {"VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_HEADER_FIELD": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_FORM_FIELDS": {"visibility": "U", "parameters": {"FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}}},
+  "SET_COMPRESSION": {"visibility": "U", "parameters": {}},
+  "ADD_MULTIPART": {"visibility": "U", "parameters": {"ENTITY": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_ENTITY", RTTIName: "\\INTERFACE=IF_HTTP_ENTITY"});}, "is_optional": " "}, "SUPPRESS_CONTENT_LENGTH": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "APPEND_CDATA": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}},
+  "GET_FORM_FIELD": {"visibility": "U", "parameters": {"VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_CDATA": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_CONTENT_TYPE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_SERIALIZED_MESSAGE_LENGTH": {"visibility": "U", "parameters": {"BODY_LENGTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "HEADER_LENGTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_CONTENT_TYPE": {"visibility": "U", "parameters": {"CONTENT_TYPE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_DATA": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "GET_HEADER_FIELDS": {"visibility": "U", "parameters": {"FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}}},
+  "TO_XSTRING": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "GET_COOKIES": {"visibility": "U", "parameters": {"COOKIES": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "ADD_COOKIE_FIELD": {"visibility": "U", "parameters": {"COOKIE_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "COOKIE_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "FIELD_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "FIELD_VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "BASE64": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "APPEND_CDATA2": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "ENCODING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "OFFSET": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "LENGTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "APPEND_DATA": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}, "OFFSET": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "LENGTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "DELETE_COOKIE_SECURE": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DELETE_FORM_FIELD": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DELETE_FORM_FIELD_SECURE": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "FROM_XSTRING": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "GET_COOKIE": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "DOMAIN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "EXPIRES": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "SECURE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_COOKIE_FIELD": {"visibility": "U", "parameters": {"FIELD_VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "COOKIE_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "COOKIE_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "FIELD_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "BASE64": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_DATA_LENGTH": {"visibility": "U", "parameters": {"DATA_LENGTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_FORM_FIELDS_CS": {"visibility": "U", "parameters": {"FORMFIELD_ENCODING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "SEARCH_OPTION": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}}},
+  "GET_FORM_FIELD_CS": {"visibility": "U", "parameters": {"VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "FORMFIELD_ENCODING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "SEARCH_OPTION": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_LAST_ERROR": {"visibility": "U", "parameters": {"RC": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_MULTIPART": {"visibility": "U", "parameters": {"ENTITY": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_ENTITY", RTTIName: "\\INTERFACE=IF_HTTP_ENTITY"});}, "is_optional": " "}, "INDEX": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_VERSION": {"visibility": "U", "parameters": {"VERSION": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "NUM_MULTIPARTS": {"visibility": "U", "parameters": {"NUM": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_COOKIE": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "DOMAIN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "EXPIRES": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "SECURE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_FORMFIELD_ENCODING": {"visibility": "U", "parameters": {"FORMFIELD_ENCODING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_FORM_FIELD": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_FORM_FIELDS": {"visibility": "U", "parameters": {"FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}, "MULTIVALUE": {"type": () => {return new abap.types.Integer({qualifiedName: "INT4"});}, "is_optional": " "}}},
+  "SET_HEADER_FIELDS": {"visibility": "U", "parameters": {"FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}}},
+  "SUPPRESS_CONTENT_TYPE": {"visibility": "U", "parameters": {"SUPPRESS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "DELETE_COOKIE": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DELETE_HEADER_FIELD": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DELETE_HEADER_FIELD_SECURE": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_HTTP_ENTITY'] = if_http_entity;
+if_http_entity.if_http_entity$co_request_method_get = new abap.types.String({qualifiedName: "STRING"});
+if_http_entity.if_http_entity$co_request_method_get.set('GET');
+if_http_entity.if_http_entity$co_request_method_post = new abap.types.String({qualifiedName: "STRING"});
+if_http_entity.if_http_entity$co_request_method_post.set('POST');
+if_http_entity.if_http_entity$co_body_before_query_string = new abap.types.Integer({qualifiedName: "I"});
+if_http_entity.if_http_entity$co_body_before_query_string.set(3);
+export {if_http_entity};
+//# sourceMappingURL=if_http_entity.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_http_extension.intf.mjs.html b/output/if_http_extension.intf.mjs.html new file mode 100644 index 00000000000..d50fcf6b016 --- /dev/null +++ b/output/if_http_extension.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/if_http_extension.intf.mjs + + + + + + + + + +
+
+

All files / output if_http_extension.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_http_extension.intf.abap
+class if_http_extension {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"FLOW_RC": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "CO_FLOW_OK": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_FLOW_OK_OTHERS_MAND": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"HANDLE_REQUEST": {"visibility": "U", "parameters": {"SERVER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_SERVER", RTTIName: "\\INTERFACE=IF_HTTP_SERVER"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_HTTP_EXTENSION'] = if_http_extension;
+if_http_extension.if_http_extension$co_flow_ok = new abap.types.Integer({qualifiedName: "I"});
+if_http_extension.if_http_extension$co_flow_ok.set(0);
+if_http_extension.if_http_extension$co_flow_ok_others_mand = new abap.types.Integer({qualifiedName: "I"});
+if_http_extension.if_http_extension$co_flow_ok_others_mand.set(2);
+export {if_http_extension};
+//# sourceMappingURL=if_http_extension.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_http_request.intf.mjs.html b/output/if_http_request.intf.mjs.html new file mode 100644 index 00000000000..c13b0fd8b06 --- /dev/null +++ b/output/if_http_request.intf.mjs.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for output/if_http_request.intf.mjs + + + + + + + + + +
+
+

All files / output if_http_request.intf.mjs

+
+ +
+ 100% + Statements + 32/32 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 32/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +321x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_http_request.intf.abap
+class if_http_request {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_PROTOCOL_VERSION_1_1": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_PROTOCOL_VERSION_1_0": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_REQUEST_METHOD_GET": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_REQUEST_METHOD_POST": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_HTTP_ENTITY~CO_REQUEST_METHOD_GET": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_HTTP_ENTITY~CO_REQUEST_METHOD_POST": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_HTTP_ENTITY~CO_BODY_BEFORE_QUERY_STRING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"SET_METHOD": {"visibility": "U", "parameters": {"METHOD": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_METHOD": {"visibility": "U", "parameters": {"METH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_VERSION": {"visibility": "U", "parameters": {"VERSION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_AUTHORIZATION": {"visibility": "U", "parameters": {"AUTH_TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "USERNAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PASSWORD": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "COPY": {"visibility": "U", "parameters": {"REQUEST": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_REQUEST", RTTIName: "\\INTERFACE=IF_HTTP_REQUEST"});}, "is_optional": " "}}},
+  "GET_AUTHORIZATION": {"visibility": "U", "parameters": {"AUTH_TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "USERNAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PASSWORD": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_FORM_DATA": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "GET_RAW_MESSAGE": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "GET_URI_PARAMETER": {"visibility": "U", "parameters": {"VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_USER_AGENT": {"visibility": "U", "parameters": {"USER_AGENT_TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "USER_AGENT_VERSION": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_HTTP_REQUEST'] = if_http_request;
+if_http_request.if_http_request$co_protocol_version_1_1 = new abap.types.String({qualifiedName: "STRING"});
+if_http_request.if_http_request$co_protocol_version_1_1.set('VER11');
+if_http_request.if_http_request$co_protocol_version_1_0 = new abap.types.String({qualifiedName: "STRING"});
+if_http_request.if_http_request$co_protocol_version_1_0.set('VER10');
+if_http_request.if_http_request$co_request_method_get = new abap.types.String({qualifiedName: "STRING"});
+if_http_request.if_http_request$co_request_method_get.set('GET');
+if_http_request.if_http_request$co_request_method_post = new abap.types.String({qualifiedName: "STRING"});
+if_http_request.if_http_request$co_request_method_post.set('POST');
+export {if_http_request};
+//# sourceMappingURL=if_http_request.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_http_response.intf.mjs.html b/output/if_http_response.intf.mjs.html new file mode 100644 index 00000000000..47644b3dc6a --- /dev/null +++ b/output/if_http_response.intf.mjs.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for output/if_http_response.intf.mjs + + + + + + + + + +
+
+

All files / output if_http_response.intf.mjs

+
+ +
+ 100% + Statements + 20/20 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_http_response.intf.abap
+class if_http_response {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"IF_HTTP_ENTITY~CO_REQUEST_METHOD_GET": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_HTTP_ENTITY~CO_REQUEST_METHOD_POST": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_HTTP_ENTITY~CO_BODY_BEFORE_QUERY_STRING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"GET_STATUS": {"visibility": "U", "parameters": {"CODE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "REASON": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_STATUS": {"visibility": "U", "parameters": {"CODE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "REASON": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DELETE_COOKIE_AT_CLIENT": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "DOMAIN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "REDIRECT": {"visibility": "U", "parameters": {"URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PERMANENTLY": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "PROTOCOL_DEPENDENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "COPY": {"visibility": "U", "parameters": {"RESPONSE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_RESPONSE", RTTIName: "\\INTERFACE=IF_HTTP_RESPONSE"});}, "is_optional": " "}}},
+  "GET_RAW_MESSAGE": {"visibility": "U", "parameters": {"DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "SERVER_CACHE_BROWSER_DEPENDENT": {"visibility": "U", "parameters": {"DEPENDENT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"BOOLEAN","ddicName":"BOOLEAN"});}, "is_optional": " "}}},
+  "SERVER_CACHE_EXPIRE_ABS": {"visibility": "U", "parameters": {"EXPIRES_ABS_DATE": {"type": () => {return new abap.types.Date({qualifiedName: "D"});}, "is_optional": " "}, "EXPIRES_ABS_TIME": {"type": () => {return new abap.types.Time({qualifiedName: "T"});}, "is_optional": " "}, "ETAG": {"type": () => {return new abap.types.Character(32, {"qualifiedName":"CHAR32","ddicName":"CHAR32"});}, "is_optional": " "}, "BROWSER_DEPENDENT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"BOOLEAN","ddicName":"BOOLEAN"});}, "is_optional": " "}, "NO_UFO_CACHE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"BOOLEAN","ddicName":"BOOLEAN"});}, "is_optional": " "}}},
+  "SERVER_CACHE_EXPIRE_DEFAULT": {"visibility": "U", "parameters": {"ETAG": {"type": () => {return new abap.types.Character(32, {"qualifiedName":"CHAR32","ddicName":"CHAR32"});}, "is_optional": " "}, "BROWSER_DEPENDENT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"BOOLEAN","ddicName":"BOOLEAN"});}, "is_optional": " "}, "NO_UFO_CACHE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"BOOLEAN","ddicName":"BOOLEAN"});}, "is_optional": " "}}},
+  "SERVER_CACHE_EXPIRE_REL": {"visibility": "U", "parameters": {"EXPIRES_REL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "ETAG": {"type": () => {return new abap.types.Character(32, {"qualifiedName":"CHAR32","ddicName":"CHAR32"});}, "is_optional": " "}, "BROWSER_DEPENDENT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"BOOLEAN","ddicName":"BOOLEAN"});}, "is_optional": " "}, "NO_UFO_CACHE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"BOOLEAN","ddicName":"BOOLEAN"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_HTTP_RESPONSE'] = if_http_response;
+export {if_http_response};
+//# sourceMappingURL=if_http_response.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_http_server.intf.mjs.html b/output/if_http_server.intf.mjs.html new file mode 100644 index 00000000000..60e656c9e8a --- /dev/null +++ b/output/if_http_server.intf.mjs.html @@ -0,0 +1,235 @@ + + + + + + Code coverage report for output/if_http_server.intf.mjs + + + + + + + + + +
+
+

All files / output if_http_server.intf.mjs

+
+ +
+ 100% + Statements + 51/51 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 51/51 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +511x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_http_server.intf.abap
+class if_http_server {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"SESSION_ID": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": "X"},
+  "AUTHENTICATION_METHOD": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": " ", "is_class": "X"},
+  "RESPONSE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_RESPONSE", RTTIName: "\\INTERFACE=IF_HTTP_RESPONSE"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "REQUEST": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_REQUEST", RTTIName: "\\INTERFACE=IF_HTTP_REQUEST"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "AUTHMETHOD_SERVICE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_COMPRESS_BASED_ON_MIME_TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_DISABLED": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_ENABLED": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_PAGE_ERROR_TYPE": {"type": () => {return new abap.types.Character(1, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_RESPONSE_PAGE_OPTION": {"type": () => {return new abap.types.Character(1, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"LOGOFF": {"visibility": "U", "parameters": {"DELETE_MYSAPSSO2_COOKIE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "PROPAGATE_LOGOFF": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "REDIRECT_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_SESSION_STATEFUL": {"visibility": "U", "parameters": {"STATEFUL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "APPEND_FIELD_URL": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_ABS_URL": {"visibility": "U", "parameters": {"URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PROTOCOL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "POST": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PORT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "QUERYSTRING": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_REL_URL": {"visibility": "U", "parameters": {"URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "QUERYSTRING": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DECODE_BASE64": {"visibility": "U", "parameters": {"DECODED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "ENCODED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ENABLE_FOREIGN_SESSION_ACCESS": {"visibility": "U", "parameters": {"URL_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "USER_ID": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"});}, "is_optional": " "}, "ONE_TIME_ACCESS_TOKEN": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "SESSION_ACCESS_TOKEN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ENCODE_BASE64": {"visibility": "U", "parameters": {"ENCODED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "UNENCODED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ESCAPE_HTML": {"visibility": "U", "parameters": {"ESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "UNESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ESCAPE_URL": {"visibility": "U", "parameters": {"ESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "UNESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_EXTENSION_INFO": {"visibility": "U", "parameters": {"EXTENSION_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "URLS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE");}, "is_optional": " "}}},
+  "GET_EXTENSION_URL": {"visibility": "U", "parameters": {"EXTENSION_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "URLS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE");}, "is_optional": " "}}},
+  "GET_LAST_ERROR": {"visibility": "U", "parameters": {"RC": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_LOCATION": {"visibility": "U", "parameters": {"URL_PART": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PROTOCOL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "APPLICATION": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "FOR_DOMAIN": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "SERVER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_SERVER", RTTIName: "\\INTERFACE=IF_HTTP_SERVER"});}, "is_optional": " "}, "USE_TICKET_PROTOCOL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "HOST": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PORT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "OUT_PROTOCOL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VH_SWITCH": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_LOCATION_EXCEPTION": {"visibility": "U", "parameters": {"URL_PART": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PROTOCOL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "APPLICATION": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "FOR_DOMAIN": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "SERVER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_SERVER", RTTIName: "\\INTERFACE=IF_HTTP_SERVER"});}, "is_optional": " "}, "USE_TICKET_PROTOCOL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "HOST": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PORT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "OUT_PROTOCOL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VH_SWITCH": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_XSRF_TOKEN": {"visibility": "U", "parameters": {"TOKEN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SEND_PAGE": {"visibility": "U", "parameters": {}},
+  "SET_COMPRESSION": {"visibility": "U", "parameters": {"OPTIONS": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_PAGE": {"visibility": "U", "parameters": {"RESPONSE_PAGE_TYPE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"CHAR1","ddicName":"CHAR1"});}, "is_optional": " "}, "RESPONSE_OPTION": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"CHAR1","ddicName":"CHAR1"});}, "is_optional": " "}, "RESPONSE_OPTION_PAGE": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "RESPONSE_OPTION_REDIRECT_URL": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "SET_SESSION_STATEFUL_VIA_URL": {"visibility": "U", "parameters": {"STATEFUL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "REWRITE_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "UNESCAPE_URL": {"visibility": "U", "parameters": {"UNESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "ESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "VALIDATE_XSRF_TOKEN": {"visibility": "U", "parameters": {"TOKEN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "SUCCESSFUL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_HTTP_SERVER'] = if_http_server;
+if_http_server.if_http_server$authmethod_service = new abap.types.Integer({qualifiedName: "I"});
+if_http_server.if_http_server$authmethod_service.set(4);
+if_http_server.if_http_server$co_compress_based_on_mime_type = new abap.types.Integer({qualifiedName: "I"});
+if_http_server.if_http_server$co_compress_based_on_mime_type.set(2);
+if_http_server.if_http_server$co_disabled = new abap.types.Integer({qualifiedName: "I"});
+if_http_server.if_http_server$co_disabled.set(0);
+if_http_server.if_http_server$co_enabled = new abap.types.Integer({qualifiedName: "I"});
+if_http_server.if_http_server$co_enabled.set(1);
+if_http_server.if_http_server$co_page_error_type = new abap.types.Character(1, {});
+if_http_server.if_http_server$co_page_error_type.set('1');
+if_http_server.if_http_server$co_response_page_option = new abap.types.Character(1, {});
+if_http_server.if_http_server$co_response_page_option.set(' ');
+export {if_http_server};
+//# sourceMappingURL=if_http_server.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_http_utility.intf.mjs.html b/output/if_http_utility.intf.mjs.html new file mode 100644 index 00000000000..8f9f45efb78 --- /dev/null +++ b/output/if_http_utility.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/if_http_utility.intf.mjs + + + + + + + + + +
+
+

All files / output if_http_utility.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_http_utility.intf.abap
+class if_http_utility {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"STRING_TO_FIELDS": {"visibility": "U", "parameters": {"FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}, "STRING": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_LAST_ERROR": {"visibility": "U", "parameters": {"RC": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "UNESCAPE_URL": {"visibility": "U", "parameters": {"UNESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "ESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "OPTIONS": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "ESCAPE_URL": {"visibility": "U", "parameters": {"ESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "UNESCAPED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ENCODE_BASE64": {"visibility": "U", "parameters": {"ENCODED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "UNENCODED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "FIELDS_TO_STRING": {"visibility": "U", "parameters": {"STRING": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "FIELDS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP");}, "is_optional": " "}}},
+  "DECODE_BASE64": {"visibility": "U", "parameters": {"DECODED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "ENCODED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_HTTP_UTILITY'] = if_http_utility;
+export {if_http_utility};
+//# sourceMappingURL=if_http_utility.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml.intf.mjs.html b/output/if_ixml.intf.mjs.html new file mode 100644 index 00000000000..66ebf1b0779 --- /dev/null +++ b/output/if_ixml.intf.mjs.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for output/if_ixml.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml.intf.mjs

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml.intf.abap
+class if_ixml {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_DOCUMENT": {"visibility": "U", "parameters": {"DOC": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_DOCUMENT", RTTIName: "\\INTERFACE=IF_IXML_DOCUMENT"});}, "is_optional": " "}}},
+  "CREATE_STREAM_FACTORY": {"visibility": "U", "parameters": {"STREAM": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_STREAM_FACTORY", RTTIName: "\\INTERFACE=IF_IXML_STREAM_FACTORY"});}, "is_optional": " "}}},
+  "CREATE_RENDERER": {"visibility": "U", "parameters": {"RENDERER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_RENDERER", RTTIName: "\\INTERFACE=IF_IXML_RENDERER"});}, "is_optional": " "}, "OSTREAM": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_OSTREAM", RTTIName: "\\INTERFACE=IF_IXML_OSTREAM"});}, "is_optional": " "}, "DOCUMENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_DOCUMENT", RTTIName: "\\INTERFACE=IF_IXML_DOCUMENT"});}, "is_optional": " "}}},
+  "CREATE_PARSER": {"visibility": "U", "parameters": {"PARSER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_PARSER", RTTIName: "\\INTERFACE=IF_IXML_PARSER"});}, "is_optional": " "}, "STREAM_FACTORY": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_STREAM_FACTORY", RTTIName: "\\INTERFACE=IF_IXML_STREAM_FACTORY"});}, "is_optional": " "}, "ISTREAM": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ISTREAM", RTTIName: "\\INTERFACE=IF_IXML_ISTREAM"});}, "is_optional": " "}, "DOCUMENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_DOCUMENT", RTTIName: "\\INTERFACE=IF_IXML_DOCUMENT"});}, "is_optional": " "}}},
+  "CREATE_ENCODING": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ENCODING", RTTIName: "\\INTERFACE=IF_IXML_ENCODING"});}, "is_optional": " "}, "BYTE_ORDER": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "CHARACTER_SET": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML'] = if_ixml;
+export {if_ixml};
+//# sourceMappingURL=if_ixml.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_attribute.intf.mjs.html b/output/if_ixml_attribute.intf.mjs.html new file mode 100644 index 00000000000..4edce39384c --- /dev/null +++ b/output/if_ixml_attribute.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/if_ixml_attribute.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_attribute.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_attribute.intf.abap
+class if_ixml_attribute {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"IF_IXML_NODE~CO_NODE_ELEMENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_IXML_NODE~CO_NODE_TEXT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"GET_VALUE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_VALUE": {"visibility": "U", "parameters": {"VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_NAME": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_ATTRIBUTE'] = if_ixml_attribute;
+export {if_ixml_attribute};
+//# sourceMappingURL=if_ixml_attribute.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_document.intf.mjs.html b/output/if_ixml_document.intf.mjs.html new file mode 100644 index 00000000000..e801e5a2a85 --- /dev/null +++ b/output/if_ixml_document.intf.mjs.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for output/if_ixml_document.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_document.intf.mjs

+
+ +
+ 100% + Statements + 32/32 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 32/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +321x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_document.intf.abap
+class if_ixml_document {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"IF_IXML_NODE~CO_NODE_ELEMENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_IXML_NODE~CO_NODE_TEXT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"SET_ENCODING": {"visibility": "U", "parameters": {"ENCODING": {"type": () => {return new abap.types.ABAPObject({qualifiedName: undefined, RTTIName: undefined});}, "is_optional": " "}}},
+  "SET_STANDALONE": {"visibility": "U", "parameters": {"STANDALONE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_STANDALONE": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "SET_NAMESPACE_PREFIX": {"visibility": "U", "parameters": {"PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "APPEND_CHILD": {"visibility": "U", "parameters": {"NEW_CHILD": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "GET_FIRST_CHILD": {"visibility": "U", "parameters": {"CHILD": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "CREATE_ATTRIBUTE_NS": {"visibility": "U", "parameters": {"ELEMENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ATTRIBUTE", RTTIName: "\\INTERFACE=IF_IXML_ATTRIBUTE"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_ELEMENT_NS": {"visibility": "U", "parameters": {"ELEMENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_ELEMENT": {"visibility": "U", "parameters": {"ELEMENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_ITERATOR_FILTERED": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_ITERATOR", RTTIName: "\\INTERFACE=IF_IXML_NODE_ITERATOR"});}, "is_optional": " "}, "INPUT": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "CREATE_FILTER_AND": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_FILTER", RTTIName: "\\INTERFACE=IF_IXML_NODE_FILTER"});}, "is_optional": " "}, "FILTER1": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "FILTER2": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "CREATE_ITERATOR": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_ITERATOR", RTTIName: "\\INTERFACE=IF_IXML_NODE_ITERATOR"});}, "is_optional": " "}}},
+  "CREATE_FILTER_NODE_TYPE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_FILTER", RTTIName: "\\INTERFACE=IF_IXML_NODE_FILTER"});}, "is_optional": " "}, "TYP": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_SIMPLE_ELEMENT_NS": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PARENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}, "PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_FILTER_ATTRIBUTE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_FILTER", RTTIName: "\\INTERFACE=IF_IXML_NODE_FILTER"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_SIMPLE_ELEMENT": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PARENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "FIND_FROM_NAME": {"visibility": "U", "parameters": {"ELEMENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAMESPACE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "FIND_FROM_NAME_NS": {"visibility": "U", "parameters": {"ELEMENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "DEPTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "URI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "FIND_FROM_PATH": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ELEMENTS_BY_TAG_NAME_NS": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_COLLECTION", RTTIName: "\\INTERFACE=IF_IXML_NODE_COLLECTION"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAMESPACE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "URI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ELEMENTS_BY_TAG_NAME": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_COLLECTION", RTTIName: "\\INTERFACE=IF_IXML_NODE_COLLECTION"});}, "is_optional": " "}, "DEPTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAMESPACE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ROOT": {"visibility": "U", "parameters": {"NODE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "GET_ROOT_ELEMENT": {"visibility": "U", "parameters": {"ROOT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_DOCUMENT'] = if_ixml_document;
+export {if_ixml_document};
+//# sourceMappingURL=if_ixml_document.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_element.intf.mjs.html b/output/if_ixml_element.intf.mjs.html new file mode 100644 index 00000000000..ba718349b07 --- /dev/null +++ b/output/if_ixml_element.intf.mjs.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for output/if_ixml_element.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_element.intf.mjs

+
+ +
+ 100% + Statements + 35/35 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 35/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +351x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_element.intf.abap
+class if_ixml_element {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"IF_IXML_NODE~CO_NODE_ELEMENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_IXML_NODE~CO_NODE_TEXT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"REMOVE_ATTRIBUTE_NS": {"visibility": "U", "parameters": {"FOO": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ATTRIBUTES": {"visibility": "U", "parameters": {"ATTR": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NAMED_NODE_MAP", RTTIName: "\\INTERFACE=IF_IXML_NAMED_NODE_MAP"});}, "is_optional": " "}}},
+  "GET_NEXT": {"visibility": "U", "parameters": {"NEXT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}}},
+  "GET_NAME": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "APPEND_CHILD": {"visibility": "U", "parameters": {"RC": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "NEW_CHILD": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "CLONE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "CREATE_FILTER_NODE_TYPE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.DataReference(new abap.types.Character(4));}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_ITERATOR": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_ITERATOR", RTTIName: "\\INTERFACE=IF_IXML_NODE_ITERATOR"});}, "is_optional": " "}}},
+  "FIND_FROM_NAME_NS": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAMESPACE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "URI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "DEPTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "FIND_FROM_NAME": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAMESPACE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "DEPTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_ATTRIBUTE_NODE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ATTRIBUTE", RTTIName: "\\INTERFACE=IF_IXML_ATTRIBUTE"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ATTRIBUTE_NS": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "URI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ATTRIBUTE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAMESPACE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_CHILDREN": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_LIST", RTTIName: "\\INTERFACE=IF_IXML_NODE_LIST"});}, "is_optional": " "}}},
+  "GET_ELEMENTS_BY_TAG_NAME": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_COLLECTION", RTTIName: "\\INTERFACE=IF_IXML_NODE_COLLECTION"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ELEMENTS_BY_TAG_NAME_NS": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_COLLECTION", RTTIName: "\\INTERFACE=IF_IXML_NODE_COLLECTION"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "URI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ATTRIBUTE_NODE_NS": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ATTRIBUTE", RTTIName: "\\INTERFACE=IF_IXML_ATTRIBUTE"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "URI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_FIRST_CHILD": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "GET_VALUE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "REMOVE_ATTRIBUTE": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "REMOVE_NODE": {"visibility": "U", "parameters": {}},
+  "RENDER": {"visibility": "U", "parameters": {"OSTREAM": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_OSTREAM", RTTIName: "\\INTERFACE=IF_IXML_OSTREAM"});}, "is_optional": " "}}},
+  "SET_ATTRIBUTE_NODE_NS": {"visibility": "U", "parameters": {"ATTR": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "SET_ATTRIBUTE": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NAMESPACE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_ATTRIBUTE_NS": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_VALUE": {"visibility": "U", "parameters": {"RC": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_ELEMENT'] = if_ixml_element;
+export {if_ixml_element};
+//# sourceMappingURL=if_ixml_element.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_encoding.intf.mjs.html b/output/if_ixml_encoding.intf.mjs.html new file mode 100644 index 00000000000..08408fd4fac --- /dev/null +++ b/output/if_ixml_encoding.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/if_ixml_encoding.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_encoding.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_encoding.intf.abap
+class if_ixml_encoding {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_PLATFORM_ENDIAN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_IXML_ENCODING'] = if_ixml_encoding;
+if_ixml_encoding.if_ixml_encoding$co_platform_endian = new abap.types.String({qualifiedName: "STRING"});
+if_ixml_encoding.if_ixml_encoding$co_platform_endian.set('a');
+export {if_ixml_encoding};
+//# sourceMappingURL=if_ixml_encoding.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_istream.intf.mjs.html b/output/if_ixml_istream.intf.mjs.html new file mode 100644 index 00000000000..2f56407df88 --- /dev/null +++ b/output/if_ixml_istream.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ixml_istream.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_istream.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_istream.intf.abap
+class if_ixml_istream {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CLOSE": {"visibility": "U", "parameters": {}}};
+}
+abap.Classes['IF_IXML_ISTREAM'] = if_ixml_istream;
+export {if_ixml_istream};
+//# sourceMappingURL=if_ixml_istream.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_named_node_map.intf.mjs.html b/output/if_ixml_named_node_map.intf.mjs.html new file mode 100644 index 00000000000..3c6ef62222c --- /dev/null +++ b/output/if_ixml_named_node_map.intf.mjs.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for output/if_ixml_named_node_map.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_named_node_map.intf.mjs

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_named_node_map.intf.abap
+class if_ixml_named_node_map {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_ITERATOR": {"visibility": "U", "parameters": {"ITERATOR": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_ITERATOR", RTTIName: "\\INTERFACE=IF_IXML_NODE_ITERATOR"});}, "is_optional": " "}}},
+  "GET_LENGTH": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_NAMED_ITEM_NS": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_NAMED_ITEM": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_NAMED_ITEM_NS": {"visibility": "U", "parameters": {"NODE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "REMOVE_NAMED_ITEM": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_NAMED_NODE_MAP'] = if_ixml_named_node_map;
+export {if_ixml_named_node_map};
+//# sourceMappingURL=if_ixml_named_node_map.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_node.intf.mjs.html b/output/if_ixml_node.intf.mjs.html new file mode 100644 index 00000000000..0f34cde6b83 --- /dev/null +++ b/output/if_ixml_node.intf.mjs.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for output/if_ixml_node.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_node.intf.mjs

+
+ +
+ 100% + Statements + 35/35 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 35/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +351x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_node.intf.abap
+class if_ixml_node {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_NODE_ELEMENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_NODE_TEXT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"APPEND_CHILD": {"visibility": "U", "parameters": {"NEW_CHILD": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "GET_ATTRIBUTES": {"visibility": "U", "parameters": {"MAP": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NAMED_NODE_MAP", RTTIName: "\\INTERFACE=IF_IXML_NAMED_NODE_MAP"});}, "is_optional": " "}}},
+  "GET_FIRST_CHILD": {"visibility": "U", "parameters": {"NODE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "GET_CHILDREN": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_LIST", RTTIName: "\\INTERFACE=IF_IXML_NODE_LIST"});}, "is_optional": " "}}},
+  "QUERY_INTERFACE": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_UNKNOWN", RTTIName: "\\INTERFACE=IF_IXML_UNKNOWN"});}, "is_optional": " "}, "FOO": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "REMOVE_NODE": {"visibility": "U", "parameters": {}},
+  "GET_PARENT": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "REPLACE_CHILD": {"visibility": "U", "parameters": {"NEW_CHILD": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "OLD_CHILD": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_NAME": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_DEPTH": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "IS_LEAF": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_NAMESPACE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_VALUE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_TYPE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_NAME": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_NAMESPACE_PREFIX": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "REMOVE_CHILD": {"visibility": "U", "parameters": {"CHILD": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "SET_VALUE": {"visibility": "U", "parameters": {"VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_NEXT": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}},
+  "GET_NAMESPACE_PREFIX": {"visibility": "U", "parameters": {"RV_PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_NAMESPACE_URI": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_HEIGHT": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_NODE'] = if_ixml_node;
+if_ixml_node.if_ixml_node$co_node_element = new abap.types.Integer({qualifiedName: "I"});
+if_ixml_node.if_ixml_node$co_node_element.set(0);
+if_ixml_node.if_ixml_node$co_node_text = new abap.types.Integer({qualifiedName: "I"});
+if_ixml_node.if_ixml_node$co_node_text.set(0);
+export {if_ixml_node};
+//# sourceMappingURL=if_ixml_node.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_node_collection.intf.mjs.html b/output/if_ixml_node_collection.intf.mjs.html new file mode 100644 index 00000000000..ab68eadef0d --- /dev/null +++ b/output/if_ixml_node_collection.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_ixml_node_collection.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_node_collection.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_node_collection.intf.abap
+class if_ixml_node_collection {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_ITERATOR": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_ITERATOR", RTTIName: "\\INTERFACE=IF_IXML_NODE_ITERATOR"});}, "is_optional": " "}}},
+  "GET_LENGTH": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_NODE_COLLECTION'] = if_ixml_node_collection;
+export {if_ixml_node_collection};
+//# sourceMappingURL=if_ixml_node_collection.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_node_filter.intf.mjs.html b/output/if_ixml_node_filter.intf.mjs.html new file mode 100644 index 00000000000..f753296b80a --- /dev/null +++ b/output/if_ixml_node_filter.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ixml_node_filter.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_node_filter.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_node_filter.intf.abap
+class if_ixml_node_filter {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['IF_IXML_NODE_FILTER'] = if_ixml_node_filter;
+export {if_ixml_node_filter};
+//# sourceMappingURL=if_ixml_node_filter.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_node_iterator.intf.mjs.html b/output/if_ixml_node_iterator.intf.mjs.html new file mode 100644 index 00000000000..1ee86504918 --- /dev/null +++ b/output/if_ixml_node_iterator.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_ixml_node_iterator.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_node_iterator.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_node_iterator.intf.abap
+class if_ixml_node_iterator {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"RESET": {"visibility": "U", "parameters": {}},
+  "GET_NEXT": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_NODE_ITERATOR'] = if_ixml_node_iterator;
+export {if_ixml_node_iterator};
+//# sourceMappingURL=if_ixml_node_iterator.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_node_list.intf.mjs.html b/output/if_ixml_node_list.intf.mjs.html new file mode 100644 index 00000000000..01faa6985c3 --- /dev/null +++ b/output/if_ixml_node_list.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/if_ixml_node_list.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_node_list.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_node_list.intf.abap
+class if_ixml_node_list {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_LENGTH": {"visibility": "U", "parameters": {"LENGTH": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "CREATE_ITERATOR": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_ITERATOR", RTTIName: "\\INTERFACE=IF_IXML_NODE_ITERATOR"});}, "is_optional": " "}}},
+  "GET_ITEM": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE", RTTIName: "\\INTERFACE=IF_IXML_NODE"});}, "is_optional": " "}, "INDEX": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "CREATE_REV_ITERATOR_FILTERED": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_NODE_ITERATOR", RTTIName: "\\INTERFACE=IF_IXML_NODE_ITERATOR"});}, "is_optional": " "}, "FILTER": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_NODE_LIST'] = if_ixml_node_list;
+export {if_ixml_node_list};
+//# sourceMappingURL=if_ixml_node_list.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_ostream.intf.mjs.html b/output/if_ixml_ostream.intf.mjs.html new file mode 100644 index 00000000000..742b0d6d3fc --- /dev/null +++ b/output/if_ixml_ostream.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_ixml_ostream.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_ostream.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_ostream.intf.abap
+class if_ixml_ostream {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"WRITE_STRING": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "STRING": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_NUM_WRITTEN_RAW": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_OSTREAM'] = if_ixml_ostream;
+export {if_ixml_ostream};
+//# sourceMappingURL=if_ixml_ostream.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_parse_error.intf.mjs.html b/output/if_ixml_parse_error.intf.mjs.html new file mode 100644 index 00000000000..e4cae8750cc --- /dev/null +++ b/output/if_ixml_parse_error.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/if_ixml_parse_error.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_parse_error.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_parse_error.intf.abap
+class if_ixml_parse_error {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_REASON": {"visibility": "U", "parameters": {"REASON": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_LINE": {"visibility": "U", "parameters": {"LINE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_COLUMN": {"visibility": "U", "parameters": {"COLUMN": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_PARSE_ERROR'] = if_ixml_parse_error;
+export {if_ixml_parse_error};
+//# sourceMappingURL=if_ixml_parse_error.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_parser.intf.mjs.html b/output/if_ixml_parser.intf.mjs.html new file mode 100644 index 00000000000..51d3ce3d0ce --- /dev/null +++ b/output/if_ixml_parser.intf.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/if_ixml_parser.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_parser.intf.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_parser.intf.abap
+class if_ixml_parser {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_NO_VALIDATION": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"PARSE": {"visibility": "U", "parameters": {"SUBRC": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_NORMALIZING": {"visibility": "U", "parameters": {"NORMAL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "NUM_ERRORS": {"visibility": "U", "parameters": {"ERRORS": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "ADD_STRIP_SPACE_ELEMENT": {"visibility": "U", "parameters": {}},
+  "GET_ERROR": {"visibility": "U", "parameters": {"ERROR": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_PARSE_ERROR", RTTIName: "\\INTERFACE=IF_IXML_PARSE_ERROR"});}, "is_optional": " "}, "INDEX": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_VALIDATING": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "MODE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_PARSER'] = if_ixml_parser;
+if_ixml_parser.if_ixml_parser$co_no_validation = new abap.types.Integer({qualifiedName: "I"});
+if_ixml_parser.if_ixml_parser$co_no_validation.set(0);
+export {if_ixml_parser};
+//# sourceMappingURL=if_ixml_parser.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_renderer.intf.mjs.html b/output/if_ixml_renderer.intf.mjs.html new file mode 100644 index 00000000000..7633f140a30 --- /dev/null +++ b/output/if_ixml_renderer.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_ixml_renderer.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_renderer.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_renderer.intf.abap
+class if_ixml_renderer {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"RENDER": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_NORMALIZING": {"visibility": "U", "parameters": {"NORMAL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_RENDERER'] = if_ixml_renderer;
+export {if_ixml_renderer};
+//# sourceMappingURL=if_ixml_renderer.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_stream_factory.intf.mjs.html b/output/if_ixml_stream_factory.intf.mjs.html new file mode 100644 index 00000000000..705be4ded5f --- /dev/null +++ b/output/if_ixml_stream_factory.intf.mjs.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for output/if_ixml_stream_factory.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_stream_factory.intf.mjs

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_stream_factory.intf.abap
+class if_ixml_stream_factory {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_OSTREAM_CSTRING": {"visibility": "U", "parameters": {"STREAM": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_OSTREAM", RTTIName: "\\INTERFACE=IF_IXML_OSTREAM"});}, "is_optional": " "}, "STRING": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_OSTREAM_XSTRING": {"visibility": "U", "parameters": {"STREAM": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_OSTREAM", RTTIName: "\\INTERFACE=IF_IXML_OSTREAM"});}, "is_optional": " "}, "STRING": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "CREATE_ISTREAM_STRING": {"visibility": "U", "parameters": {"STREAM": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ISTREAM", RTTIName: "\\INTERFACE=IF_IXML_ISTREAM"});}, "is_optional": " "}, "XML": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_ISTREAM_XSTRING": {"visibility": "U", "parameters": {"STREAM": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ISTREAM", RTTIName: "\\INTERFACE=IF_IXML_ISTREAM"});}, "is_optional": " "}, "XML": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "CREATE_OSTREAM_ITABLE": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_OSTREAM", RTTIName: "\\INTERFACE=IF_IXML_OSTREAM"});}, "is_optional": " "}, "TABLE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_STREAM_FACTORY'] = if_ixml_stream_factory;
+export {if_ixml_stream_factory};
+//# sourceMappingURL=if_ixml_stream_factory.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_ixml_unknown.intf.mjs.html b/output/if_ixml_unknown.intf.mjs.html new file mode 100644 index 00000000000..9673490a8e4 --- /dev/null +++ b/output/if_ixml_unknown.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_ixml_unknown.intf.mjs + + + + + + + + + +
+
+

All files / output if_ixml_unknown.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_ixml_unknown.intf.abap
+class if_ixml_unknown {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"QUERY_INTERFACE": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_UNKNOWN", RTTIName: "\\INTERFACE=IF_IXML_UNKNOWN"});}, "is_optional": " "}, "IID": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_IXML_UNKNOWN'] = if_ixml_unknown;
+export {if_ixml_unknown};
+//# sourceMappingURL=if_ixml_unknown.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_message.intf.mjs.html b/output/if_message.intf.mjs.html new file mode 100644 index 00000000000..674c369d8d5 --- /dev/null +++ b/output/if_message.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_message.intf.mjs + + + + + + + + + +
+
+

All files / output if_message.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_message.intf.abap
+class if_message {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_TEXT": {"visibility": "U", "parameters": {"RESULT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_LONGTEXT": {"visibility": "U", "parameters": {"RESULT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PRESERVE_NEWLINES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_MESSAGE'] = if_message;
+export {if_message};
+//# sourceMappingURL=if_message.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_mr_api.intf.mjs.html b/output/if_mr_api.intf.mjs.html new file mode 100644 index 00000000000..8b8fb44ce39 --- /dev/null +++ b/output/if_mr_api.intf.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/if_mr_api.intf.mjs + + + + + + + + + +
+
+

All files / output if_mr_api.intf.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_mr_api.intf.abap
+class if_mr_api {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_API": {"visibility": "U", "parameters": {"R_MR_API": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_MR_API", RTTIName: "\\INTERFACE=IF_MR_API"});}, "is_optional": " "}, "I_PREFIX": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}},
+  "GET": {"visibility": "U", "parameters": {"I_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_CHECK_AUTHORITY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_IS_FOLDER": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_CONTENT": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}, "E_MIME_TYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "E_LOIO": {"type": () => {return new abap.types.Structure({"objtype": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}), "object": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}), "class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SKWF_IO", "SKWF_IO", {}, {});}, "is_optional": " "}, "C_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"});}, "is_optional": " "}}},
+  "CREATE_FOLDER": {"visibility": "U", "parameters": {"I_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"});}, "is_optional": " "}, "I_DESCRIPTION": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_CHECK_AUTHORITY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_SUPPRESS_PACKAGE_DIALOG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_DEV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "I_GENFLAG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_CORR_NUMBER": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}, "I_FOLDER_LOIO": {"type": () => {return new abap.types.Structure({"objtype": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}), "object": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}), "class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SKWF_IO", "SKWF_IO", {}, {});}, "is_optional": " "}, "I_SUPPRESS_DIALOGS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_FOLDER_IO": {"type": () => {return new abap.types.Structure({"objtype": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}), "object": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}), "class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SKWF_IO", "SKWF_IO", {}, {});}, "is_optional": " "}}},
+  "PUT": {"visibility": "U", "parameters": {"I_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_CONTENT": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}, "I_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"});}, "is_optional": " "}, "I_DESCRIPTION": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_CHECK_AUTHORITY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_SUPPRESS_PACKAGE_DIALOG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_DEV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "I_GENFLAG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_CORR_NUMBER": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}, "I_NEW_LOIO": {"type": () => {return new abap.types.Structure({"objtype": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}), "object": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}), "class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SKWF_IO", "SKWF_IO", {}, {});}, "is_optional": " "}, "I_SUPPRESS_DIALOGS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "DELETE": {"visibility": "U", "parameters": {"I_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_DELETE_CHILDREN": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_CHECK_AUTHORITY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_CORR_NUMBER": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}, "I_SUPPRESS_DIALOGS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "FILE_LIST": {"visibility": "U", "parameters": {"I_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_RECURSIVE_CALL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_CHECK_AUTHORITY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE");}, "is_optional": " "}}},
+  "PROPERTIES": {"visibility": "U", "parameters": {"I_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "I_CHECK_AUTHORITY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_IS_FOLDER": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_MIME_TYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "E_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "E_SIZE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "E_BIN_DATA": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_LOIO": {"type": () => {return new abap.types.Structure({"objtype": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}), "object": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}), "class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SKWF_IO", "SKWF_IO", {}, {});}, "is_optional": " "}, "E_PHIO": {"type": () => {return new abap.types.Structure({"objtype": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}), "object": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}), "class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SKWF_IO", "SKWF_IO", {}, {});}, "is_optional": " "}, "E_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"});}, "is_optional": " "}, "E_PHIO_LAST_CHANGED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_IO_FOR_URL": {"visibility": "U", "parameters": {"I_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "E_IS_FOLDER": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_LOIO": {"type": () => {return new abap.types.Structure({"objtype": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}), "object": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}), "class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SKWF_IO", "SKWF_IO", {}, {});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_MR_API'] = if_mr_api;
+export {if_mr_api};
+//# sourceMappingURL=if_mr_api.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_oo_adt_classrun.intf.mjs.html b/output/if_oo_adt_classrun.intf.mjs.html new file mode 100644 index 00000000000..f244919b2f6 --- /dev/null +++ b/output/if_oo_adt_classrun.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_oo_adt_classrun.intf.mjs + + + + + + + + + +
+
+

All files / output if_oo_adt_classrun.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_oo_adt_classrun.intf.abap
+class if_oo_adt_classrun {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"MAIN": {"visibility": "U", "parameters": {"OUT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_OO_ADT_CLASSRUN_OUT", RTTIName: "\\INTERFACE=IF_OO_ADT_CLASSRUN_OUT"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_OO_ADT_CLASSRUN'] = if_oo_adt_classrun;
+export {if_oo_adt_classrun};
+//# sourceMappingURL=if_oo_adt_classrun.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_oo_adt_classrun_out.intf.mjs.html b/output/if_oo_adt_classrun_out.intf.mjs.html new file mode 100644 index 00000000000..e4f0f6c9037 --- /dev/null +++ b/output/if_oo_adt_classrun_out.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_oo_adt_classrun_out.intf.mjs + + + + + + + + + +
+
+

All files / output if_oo_adt_classrun_out.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_oo_adt_classrun_out.intf.abap
+class if_oo_adt_classrun_out {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"WRITE": {"visibility": "U", "parameters": {"OUTPUT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_OO_ADT_CLASSRUN_OUT", RTTIName: "\\INTERFACE=IF_OO_ADT_CLASSRUN_OUT"});}, "is_optional": " "}, "DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET": {"visibility": "U", "parameters": {"OUTPUT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_OO_ADT_CLASSRUN_OUT'] = if_oo_adt_classrun_out;
+export {if_oo_adt_classrun_out};
+//# sourceMappingURL=if_oo_adt_classrun_out.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_oo_clif_source.intf.mjs.html b/output/if_oo_clif_source.intf.mjs.html new file mode 100644 index 00000000000..874d8d74786 --- /dev/null +++ b/output/if_oo_clif_source.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_oo_clif_source.intf.mjs + + + + + + + + + +
+
+

All files / output if_oo_clif_source.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_oo_clif_source.intf.abap
+class if_oo_clif_source {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_SOURCE": {"visibility": "U", "parameters": {"SOURCE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE");}, "is_optional": " "}}}};
+}
+abap.Classes['IF_OO_CLIF_SOURCE'] = if_oo_clif_source;
+export {if_oo_clif_source};
+//# sourceMappingURL=if_oo_clif_source.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_osql_test_environment.intf.mjs.html b/output/if_osql_test_environment.intf.mjs.html new file mode 100644 index 00000000000..e1828d1501b --- /dev/null +++ b/output/if_osql_test_environment.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/if_osql_test_environment.intf.mjs + + + + + + + + + +
+
+

All files / output if_osql_test_environment.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_osql_test_environment.intf.abap
+class if_osql_test_environment {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CLEAR_DOUBLES": {"visibility": "U", "parameters": {}},
+  "DESTROY": {"visibility": "U", "parameters": {}},
+  "INSERT_TEST_DATA": {"visibility": "U", "parameters": {"I_DATA": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_OSQL_TEST_ENVIRONMENT'] = if_osql_test_environment;if_osql_test_environment.ty_s_sobjname = new abap.types.Character(30, {"qualifiedName":"abap_compname"});
+if_osql_test_environment.ty_t_sobjnames = abap.types.TableFactory.construct(new abap.types.Character(30, {"qualifiedName":"abap_compname"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "if_osql_test_environment=>ty_t_sobjnames");
+export {if_osql_test_environment};
+//# sourceMappingURL=if_osql_test_environment.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_package.intf.mjs.html b/output/if_package.intf.mjs.html new file mode 100644 index 00000000000..27d2949be10 --- /dev/null +++ b/output/if_package.intf.mjs.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for output/if_package.intf.mjs + + + + + + + + + +
+
+

All files / output if_package.intf.mjs

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_package.intf.abap
+class if_package {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"WBO_KORR_FLAG": {"type": () => {return new abap.types.Character(1, {});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "SOFTWARE_COMPONENT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "APPLICATION_COMPONENT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "TRANSPORT_LAYER": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "CHANGED_BY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "}};
+  static METHODS = {"SAVE": {"visibility": "U", "parameters": {"I_TRANSPORT_REQUEST": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}}},
+  "DELETE": {"visibility": "U", "parameters": {}},
+  "SET_CHANGEABLE": {"visibility": "U", "parameters": {"I_CHANGEABLE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_CHANGEABLE": {"visibility": "U", "parameters": {"E_CHANGEABLE": {"type": () => {return (() => { throw "Void type: ABAP" })();}, "is_optional": " "}}},
+  "GET_ALL_ATTRIBUTES": {"visibility": "U", "parameters": {"E_PACKAGE_DATA": {"type": () => {return new abap.types.Structure({"devclass": new abap.types.Character(30, {}), "dlvunit": new abap.types.Character(30, {}), "component": new abap.types.Character(20, {}), "ctext": new abap.types.Character(60, {}), "parentcl": new abap.types.Character(30, {}), "pdevclass": new abap.types.Character(4, {}), "as4user": new abap.types.Character(12, {}), "comp_posid": new abap.types.Character(24, {}), "mainpack": new abap.types.Character(1, {}), "created_by": new abap.types.Character(12, {}), "created_on": new abap.types.Date(), "changed_by": new abap.types.Character(12, {}), "changed_on": new abap.types.Date(), "dlvu_text": new abap.types.Character(80, {}), "layer_text": new abap.types.Character(60, {}), "intfprefx": new abap.types.Character(6, {}), "cli_check": new abap.types.Character(1, {}), "namespace": new abap.types.Character(10, {}), "tpclass": new abap.types.Character(1, {}), "korrflag": new abap.types.Character(1, {}), "comp_text": new abap.types.Character(60, {})}, "SCOMPKDTLN", "SCOMPKDTLN", {}, {});}, "is_optional": " "}}},
+  "SAVE_GENERIC": {"visibility": "U", "parameters": {"I_SAVE_SIGN": {"type": () => {return (() => { throw "Void type: PAKSAVSIGN" })();}, "is_optional": " "}, "I_TRANSPORT_REQUEST": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}, "I_SUPPRESS_DIALOG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_TRANSPORT_REQUEST": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}}},
+  "SET_ALL_ATTRIBUTES": {"visibility": "U", "parameters": {"I_PACKAGE_DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "I_DATA_SIGN": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "SET_PERMISSIONS_CHANGEABLE": {"visibility": "U", "parameters": {"I_CHANGEABLE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_SUPPRESS_DIALOG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "I_SUPPRESS_LANGUAGE_CHECK": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "E_DELETED_PERMISSIONS": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "GET_PERMISSIONS_TO_USE": {"visibility": "U", "parameters": {"E_PERMISSIONS": {"type": () => {return (() => { throw "Void type: TPAK_PERMISSION_TO_USE_LIST" })();}, "is_optional": " "}}},
+  "ADD_PERMISSION_TO_USE": {"visibility": "U", "parameters": {"I_PKG_PERMISSION_DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "E_PKG_PERMISSION": {"type": () => {return (() => { throw "Void type: if_package_permission_to_use" })();}, "is_optional": " "}}}};
+}
+abap.Classes['IF_PACKAGE'] = if_package;
+export {if_package};
+//# sourceMappingURL=if_package.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_recipient_bcs.intf.mjs.html b/output/if_recipient_bcs.intf.mjs.html new file mode 100644 index 00000000000..0e42ea9aab2 --- /dev/null +++ b/output/if_recipient_bcs.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_recipient_bcs.intf.mjs + + + + + + + + + +
+
+

All files / output if_recipient_bcs.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_recipient_bcs.intf.abap
+class if_recipient_bcs {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['IF_RECIPIENT_BCS'] = if_recipient_bcs;
+export {if_recipient_bcs};
+//# sourceMappingURL=if_recipient_bcs.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_salv_c_bool_sap.intf.mjs.html b/output/if_salv_c_bool_sap.intf.mjs.html new file mode 100644 index 00000000000..87e431983e9 --- /dev/null +++ b/output/if_salv_c_bool_sap.intf.mjs.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for output/if_salv_c_bool_sap.intf.mjs + + + + + + + + + +
+
+

All files / output if_salv_c_bool_sap.intf.mjs

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_salv_c_bool_sap.intf.abap
+class if_salv_c_bool_sap {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"TRUE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "FALSE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_SALV_C_BOOL_SAP'] = if_salv_c_bool_sap;
+if_salv_c_bool_sap.if_salv_c_bool_sap$true = new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});
+if_salv_c_bool_sap.if_salv_c_bool_sap$true.set(abap.builtin.abap_true);
+if_salv_c_bool_sap.if_salv_c_bool_sap$false = new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});
+if_salv_c_bool_sap.if_salv_c_bool_sap$false.set(abap.builtin.abap_false);
+export {if_salv_c_bool_sap};
+//# sourceMappingURL=if_salv_c_bool_sap.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_salv_c_selection_mode.intf.mjs.html b/output/if_salv_c_selection_mode.intf.mjs.html new file mode 100644 index 00000000000..15adac0facd --- /dev/null +++ b/output/if_salv_c_selection_mode.intf.mjs.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for output/if_salv_c_selection_mode.intf.mjs + + + + + + + + + +
+
+

All files / output if_salv_c_selection_mode.intf.mjs

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 23/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_salv_c_selection_mode.intf.abap
+class if_salv_c_selection_mode {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CELL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "MULTIPLE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "NONE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "ROW_COLUMN": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "SINGLE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_SALV_C_SELECTION_MODE'] = if_salv_c_selection_mode;
+if_salv_c_selection_mode.if_salv_c_selection_mode$cell = new abap.types.Integer({qualifiedName: "I"});
+if_salv_c_selection_mode.if_salv_c_selection_mode$cell.set(1);
+if_salv_c_selection_mode.if_salv_c_selection_mode$multiple = new abap.types.Integer({qualifiedName: "I"});
+if_salv_c_selection_mode.if_salv_c_selection_mode$multiple.set(2);
+if_salv_c_selection_mode.if_salv_c_selection_mode$none = new abap.types.Integer({qualifiedName: "I"});
+if_salv_c_selection_mode.if_salv_c_selection_mode$none.set(3);
+if_salv_c_selection_mode.if_salv_c_selection_mode$row_column = new abap.types.Integer({qualifiedName: "I"});
+if_salv_c_selection_mode.if_salv_c_selection_mode$row_column.set(4);
+if_salv_c_selection_mode.if_salv_c_selection_mode$single = new abap.types.Integer({qualifiedName: "I"});
+if_salv_c_selection_mode.if_salv_c_selection_mode$single.set(5);
+export {if_salv_c_selection_mode};
+//# sourceMappingURL=if_salv_c_selection_mode.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sender_bcs.intf.mjs.html b/output/if_sender_bcs.intf.mjs.html new file mode 100644 index 00000000000..388e25815d0 --- /dev/null +++ b/output/if_sender_bcs.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_sender_bcs.intf.mjs + + + + + + + + + +
+
+

All files / output if_sender_bcs.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sender_bcs.intf.abap
+class if_sender_bcs {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['IF_SENDER_BCS'] = if_sender_bcs;
+export {if_sender_bcs};
+//# sourceMappingURL=if_sender_bcs.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_serializable_object.intf.mjs.html b/output/if_serializable_object.intf.mjs.html new file mode 100644 index 00000000000..2bde5afd622 --- /dev/null +++ b/output/if_serializable_object.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_serializable_object.intf.mjs + + + + + + + + + +
+
+

All files / output if_serializable_object.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_serializable_object.intf.abap
+class if_serializable_object {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['IF_SERIALIZABLE_OBJECT'] = if_serializable_object;
+export {if_serializable_object};
+//# sourceMappingURL=if_serializable_object.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_shm_build_instance.intf.mjs.html b/output/if_shm_build_instance.intf.mjs.html new file mode 100644 index 00000000000..2ca1d6341c0 --- /dev/null +++ b/output/if_shm_build_instance.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_shm_build_instance.intf.mjs + + + + + + + + + +
+
+

All files / output if_shm_build_instance.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_shm_build_instance.intf.abap
+class if_shm_build_instance {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"BUILD": {"visibility": "U", "parameters": {"INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "INVOCATION_MODE": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_CONSTR_INVOCATION_MODE"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SHM_BUILD_INSTANCE'] = if_shm_build_instance;
+export {if_shm_build_instance};
+//# sourceMappingURL=if_shm_build_instance.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_shm_trace.intf.mjs.html b/output/if_shm_trace.intf.mjs.html new file mode 100644 index 00000000000..8bbf58d2424 --- /dev/null +++ b/output/if_shm_trace.intf.mjs.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for output/if_shm_trace.intf.mjs + + + + + + + + + +
+
+

All files / output if_shm_trace.intf.mjs

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_shm_trace.intf.abap
+class if_shm_trace {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"VARIANT": {"type": () => {return new abap.types.Structure({"def_name": new abap.types.Character(32, {"qualifiedName":"SHMM_TRC_VARIANT_NAME","ddicName":"SHMM_TRC_VARIANT_NAME"}), "attach_for_upd": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "attach_for_read": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "free_area": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "detach_area": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "set_root": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "invalidate_inst": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "get_instance_inf": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "free_instance": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "invalidate_area": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "build": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "attach_for_write": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "get_root": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": " ", "is_class": " "}};
+  static METHODS = {"TRIN_ATTACH_FOR_WRITE": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "MODE": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_ATTACH_MODE"});}, "is_optional": " "}, "WAIT_TIME": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "TRCX_ATTACH_FOR_WRITE": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "MODE": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_ATTACH_MODE"});}, "is_optional": " "}, "WAIT_TIME": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "CX": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"});}, "is_optional": " "}}},
+  "TRIN_ATTACH_FOR_UPDATE": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "MODE": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_ATTACH_MODE"});}, "is_optional": " "}, "WAIT_TIME": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "TRCX_ATTACH_FOR_UPDATE": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "MODE": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_ATTACH_MODE"});}, "is_optional": " "}, "WAIT_TIME": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "CX": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"});}, "is_optional": " "}}},
+  "TRIN_ATTACH_FOR_READ": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}}},
+  "TRCX_ATTACH_FOR_READ": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "CX": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"});}, "is_optional": " "}}},
+  "TRIN_BUILD": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}}},
+  "TRCX_BUILD": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CX": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"});}, "is_optional": " "}}},
+  "TRIN_SET_ROOT": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "ROOT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: undefined, RTTIName: undefined});}, "is_optional": " "}}},
+  "TRCX_SET_ROOT": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "ROOT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: undefined, RTTIName: undefined});}, "is_optional": " "}, "CX": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"});}, "is_optional": " "}}},
+  "TRIN_DETACH_AREA": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "RC": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_RC"});}, "is_optional": " "}}},
+  "TRIN_FREE_AREA": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "TERMINATE_CHANGER": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "AFFECT_SERVER": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_AFFECT_SERVER"});}, "is_optional": " "}, "RC": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_RC"});}, "is_optional": " "}}},
+  "TRIN_FREE_INSTANCE": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "TERMINATE_CHANGER": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "AFFECT_SERVER": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_AFFECT_SERVER"});}, "is_optional": " "}, "RC": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_RC"});}, "is_optional": " "}}},
+  "TRIN_GET_INSTANCE_INFOS": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "INFOS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"client": new abap.types.Character(3, {"qualifiedName":"MANDT","ddicName":"MANDT"}), "name": new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"})}, "SHM_INST_INFO", "SHM_INST_INFO", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SHM_INST_INFOS");}, "is_optional": " "}}},
+  "TRIN_INVALIDATE_AREA": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "RC": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_RC"});}, "is_optional": " "}, "AFFECT_SERVER": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_AFFECT_SERVER"});}, "is_optional": " "}, "TERMINATE_CHANGER": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "TRIN_INVALIDATE_INSTANCE": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "INST_NAME": {"type": () => {return new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"});}, "is_optional": " "}, "CLIENT": {"type": () => {return new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"});}, "is_optional": " "}, "TERMINATE_CHANGER": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "AFFECT_SERVER": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_AFFECT_SERVER"});}, "is_optional": " "}, "RC": {"type": () => {return new abap.types.Integer({qualifiedName: "SHM_RC"});}, "is_optional": " "}}},
+  "TRIN_GET_ROOT": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}}},
+  "TRCX_GET_ROOT": {"visibility": "U", "parameters": {"AREA_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"});}, "is_optional": " "}, "CX": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SHM_TRACE'] = if_shm_trace;
+export {if_shm_trace};
+//# sourceMappingURL=if_shm_trace.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml.intf.mjs.html b/output/if_sxml.intf.mjs.html new file mode 100644 index 00000000000..ef14e02c49f --- /dev/null +++ b/output/if_sxml.intf.mjs.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for output/if_sxml.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml.intf.mjs

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml.intf.abap
+class if_sxml {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_XT_XML10": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_XT_BINARY": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_XT_XOP": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_XT_JSON": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_SXML'] = if_sxml;
+if_sxml.if_sxml$co_xt_xml10 = new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});
+if_sxml.if_sxml$co_xt_xml10.set(1);
+if_sxml.if_sxml$co_xt_binary = new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});
+if_sxml.if_sxml$co_xt_binary.set(2);
+if_sxml.if_sxml$co_xt_xop = new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});
+if_sxml.if_sxml$co_xt_xop.set(3);
+if_sxml.if_sxml$co_xt_json = new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});
+if_sxml.if_sxml$co_xt_json.set(4);
+if_sxml.xml_stream_type = new abap.types.Integer({qualifiedName: "IF_SXML=>XML_STREAM_TYPE"});
+export {if_sxml};
+//# sourceMappingURL=if_sxml.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml_attribute.intf.mjs.html b/output/if_sxml_attribute.intf.mjs.html new file mode 100644 index 00000000000..0d665aaa879 --- /dev/null +++ b/output/if_sxml_attribute.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/if_sxml_attribute.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml_attribute.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml_attribute.intf.abap
+class if_sxml_attribute {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"QNAME": {"type": () => {return new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "VALUE_TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_VALUE=>VALUE_TYPE"});}, "visibility": "U", "is_constant": " ", "is_class": " "}};
+  static METHODS = {"GET_VALUE": {"visibility": "U", "parameters": {"VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SXML_ATTRIBUTE'] = if_sxml_attribute;
+if_sxml_attribute.attributes = abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "IF_SXML_ATTRIBUTE", RTTIName: "\\INTERFACE=IF_SXML_ATTRIBUTE"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "if_sxml_attribute=>attributes");
+export {if_sxml_attribute};
+//# sourceMappingURL=if_sxml_attribute.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml_close_element.intf.mjs.html b/output/if_sxml_close_element.intf.mjs.html new file mode 100644 index 00000000000..7a7a87ddf66 --- /dev/null +++ b/output/if_sxml_close_element.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/if_sxml_close_element.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml_close_element.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml_close_element.intf.abap
+class if_sxml_close_element {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"QNAME": {"type": () => {return new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "IF_SXML_NODE~TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "IF_SXML_NODE~CO_NT_ELEMENT_OPEN": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_ELEMENT_CLOSE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_VALUE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_ATTRIBUTE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_FINAL": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_SXML_CLOSE_ELEMENT'] = if_sxml_close_element;
+export {if_sxml_close_element};
+//# sourceMappingURL=if_sxml_close_element.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml_node.intf.mjs.html b/output/if_sxml_node.intf.mjs.html new file mode 100644 index 00000000000..29b370385f9 --- /dev/null +++ b/output/if_sxml_node.intf.mjs.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for output/if_sxml_node.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml_node.intf.mjs

+
+ +
+ 100% + Statements + 25/25 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 25/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +251x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml_node.intf.abap
+class if_sxml_node {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "CO_NT_ELEMENT_OPEN": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_NT_ELEMENT_CLOSE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_NT_VALUE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_NT_ATTRIBUTE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_NT_FINAL": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_SXML_NODE'] = if_sxml_node;
+if_sxml_node.if_sxml_node$co_nt_element_open = new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});
+if_sxml_node.if_sxml_node$co_nt_element_open.set(1);
+if_sxml_node.if_sxml_node$co_nt_element_close = new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});
+if_sxml_node.if_sxml_node$co_nt_element_close.set(2);
+if_sxml_node.if_sxml_node$co_nt_value = new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});
+if_sxml_node.if_sxml_node$co_nt_value.set(4);
+if_sxml_node.if_sxml_node$co_nt_attribute = new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});
+if_sxml_node.if_sxml_node$co_nt_attribute.set(32);
+if_sxml_node.if_sxml_node$co_nt_final = new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});
+if_sxml_node.if_sxml_node$co_nt_final.set(128);
+if_sxml_node.node_type = new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});
+export {if_sxml_node};
+//# sourceMappingURL=if_sxml_node.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml_open_element.intf.mjs.html b/output/if_sxml_open_element.intf.mjs.html new file mode 100644 index 00000000000..08a631062b3 --- /dev/null +++ b/output/if_sxml_open_element.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/if_sxml_open_element.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml_open_element.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml_open_element.intf.abap
+class if_sxml_open_element {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"QNAME": {"type": () => {return new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "IF_SXML_NODE~TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "IF_SXML_NODE~CO_NT_ELEMENT_OPEN": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_ELEMENT_CLOSE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_VALUE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_ATTRIBUTE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_FINAL": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"GET_ATTRIBUTES": {"visibility": "U", "parameters": {"ATTR": {"type": () => {return abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "IF_SXML_ATTRIBUTE", RTTIName: "\\INTERFACE=IF_SXML_ATTRIBUTE"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "if_sxml_attribute=>attributes");}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SXML_OPEN_ELEMENT'] = if_sxml_open_element;
+export {if_sxml_open_element};
+//# sourceMappingURL=if_sxml_open_element.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml_reader.intf.mjs.html b/output/if_sxml_reader.intf.mjs.html new file mode 100644 index 00000000000..eed042db621 --- /dev/null +++ b/output/if_sxml_reader.intf.mjs.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for output/if_sxml_reader.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml_reader.intf.mjs

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml_reader.intf.abap
+class if_sxml_reader {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"NODE_TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "}};
+  static METHODS = {"READ_NEXT_NODE": {"visibility": "U", "parameters": {"NODE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_SXML_NODE", RTTIName: "\\INTERFACE=IF_SXML_NODE"});}, "is_optional": " "}}},
+  "NEXT_NODE": {"visibility": "U", "parameters": {"VALUE_TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_VALUE=>VALUE_TYPE"});}, "is_optional": " "}}},
+  "NEXT_ATTRIBUTE": {"visibility": "U", "parameters": {"VALUE_TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_VALUE=>VALUE_TYPE"});}, "is_optional": " "}}},
+  "SKIP_NODE": {"visibility": "U", "parameters": {"WRITER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_SXML_WRITER", RTTIName: "\\INTERFACE=IF_SXML_WRITER"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SXML_READER'] = if_sxml_reader;
+export {if_sxml_reader};
+//# sourceMappingURL=if_sxml_reader.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml_value.intf.mjs.html b/output/if_sxml_value.intf.mjs.html new file mode 100644 index 00000000000..09d8c701b07 --- /dev/null +++ b/output/if_sxml_value.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/if_sxml_value.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml_value.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml_value.intf.abap
+class if_sxml_value {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_VT_TEXT": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_VALUE=>VALUE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_SXML_VALUE'] = if_sxml_value;
+if_sxml_value.if_sxml_value$co_vt_text = new abap.types.Integer({qualifiedName: "IF_SXML_VALUE=>VALUE_TYPE"});
+if_sxml_value.if_sxml_value$co_vt_text.set(2);
+if_sxml_value.value_type = new abap.types.Integer({qualifiedName: "IF_SXML_VALUE=>VALUE_TYPE"});
+export {if_sxml_value};
+//# sourceMappingURL=if_sxml_value.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml_value_node.intf.mjs.html b/output/if_sxml_value_node.intf.mjs.html new file mode 100644 index 00000000000..f8caf3a2cce --- /dev/null +++ b/output/if_sxml_value_node.intf.mjs.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for output/if_sxml_value_node.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml_value_node.intf.mjs

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml_value_node.intf.abap
+class if_sxml_value_node {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"IF_SXML_NODE~TYPE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "IF_SXML_NODE~CO_NT_ELEMENT_OPEN": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_ELEMENT_CLOSE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_VALUE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_ATTRIBUTE": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "IF_SXML_NODE~CO_NT_FINAL": {"type": () => {return new abap.types.Integer({qualifiedName: "IF_SXML_NODE=>NODE_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"GET_VALUE": {"visibility": "U", "parameters": {"VAL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SXML_VALUE_NODE'] = if_sxml_value_node;
+export {if_sxml_value_node};
+//# sourceMappingURL=if_sxml_value_node.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxml_writer.intf.mjs.html b/output/if_sxml_writer.intf.mjs.html new file mode 100644 index 00000000000..4a0ed9a31c4 --- /dev/null +++ b/output/if_sxml_writer.intf.mjs.html @@ -0,0 +1,199 @@ + + + + + + Code coverage report for output/if_sxml_writer.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxml_writer.intf.mjs

+
+ +
+ 100% + Statements + 39/39 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 39/39 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +391x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxml_writer.intf.abap
+class if_sxml_writer {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_OPT_NORMALIZING": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPT_NO_EMPTY": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPT_IGNORE_CONV_ERRROS": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPT_LINEBREAKS": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPT_INDENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPT_ILLEGAL_CHAR_REJECT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPT_ILLEGAL_CHAR_REPLACE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPT_ILLEGAL_CHAR_REPLACE_BY": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPT_BASE64_NO_LF": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"OPEN_ELEMENT": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NSURI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CLOSE_ELEMENT": {"visibility": "U", "parameters": {}},
+  "WRITE_ATTRIBUTE": {"visibility": "U", "parameters": {"NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NSURI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "WRITE_VALUE": {"visibility": "U", "parameters": {"VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_OPTION": {"visibility": "U", "parameters": {"OPTION": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "VALUE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SXML_WRITER'] = if_sxml_writer;
+if_sxml_writer.if_sxml_writer$co_opt_normalizing = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_normalizing.set(1);
+if_sxml_writer.if_sxml_writer$co_opt_no_empty = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_no_empty.set(2);
+if_sxml_writer.if_sxml_writer$co_opt_ignore_conv_errros = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_ignore_conv_errros.set(3);
+if_sxml_writer.if_sxml_writer$co_opt_linebreaks = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_linebreaks.set(4);
+if_sxml_writer.if_sxml_writer$co_opt_indent = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_indent.set(5);
+if_sxml_writer.if_sxml_writer$co_opt_illegal_char_reject = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_illegal_char_reject.set(6);
+if_sxml_writer.if_sxml_writer$co_opt_illegal_char_replace = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_illegal_char_replace.set(7);
+if_sxml_writer.if_sxml_writer$co_opt_illegal_char_replace_by = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_illegal_char_replace_by.set(8);
+if_sxml_writer.if_sxml_writer$co_opt_base64_no_lf = new abap.types.Integer({qualifiedName: "I"});
+if_sxml_writer.if_sxml_writer$co_opt_base64_no_lf.set(9);
+export {if_sxml_writer};
+//# sourceMappingURL=if_sxml_writer.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxmlp_factory.intf.mjs.html b/output/if_sxmlp_factory.intf.mjs.html new file mode 100644 index 00000000000..ef962c9d67d --- /dev/null +++ b/output/if_sxmlp_factory.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_sxmlp_factory.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxmlp_factory.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxmlp_factory.intf.abap
+class if_sxmlp_factory {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_LIST": {"visibility": "U", "parameters": {"RVAL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_SXMLP_LIST", RTTIName: "\\INTERFACE=IF_SXMLP_LIST"});}, "is_optional": " "}, "NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "NSURI": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "PREFIX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SXMLP_FACTORY'] = if_sxmlp_factory;
+export {if_sxmlp_factory};
+//# sourceMappingURL=if_sxmlp_factory.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxmlp_list.intf.mjs.html b/output/if_sxmlp_list.intf.mjs.html new file mode 100644 index 00000000000..106fbeafedb --- /dev/null +++ b/output/if_sxmlp_list.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_sxmlp_list.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxmlp_list.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxmlp_list.intf.abap
+class if_sxmlp_list {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ADD_PART": {"visibility": "U", "parameters": {"PART": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_SXMLP_PART", RTTIName: "\\INTERFACE=IF_SXMLP_PART"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SXMLP_LIST'] = if_sxmlp_list;
+export {if_sxmlp_list};
+//# sourceMappingURL=if_sxmlp_list.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxmlp_part.intf.mjs.html b/output/if_sxmlp_part.intf.mjs.html new file mode 100644 index 00000000000..3fdab0354f7 --- /dev/null +++ b/output/if_sxmlp_part.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_sxmlp_part.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxmlp_part.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxmlp_part.intf.abap
+class if_sxmlp_part {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"SERIALIZE": {"visibility": "U", "parameters": {"WRITER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_SXML_WRITER", RTTIName: "\\INTERFACE=IF_SXML_WRITER"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SXMLP_PART'] = if_sxmlp_part;
+export {if_sxmlp_part};
+//# sourceMappingURL=if_sxmlp_part.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_sxmlp_simple.intf.mjs.html b/output/if_sxmlp_simple.intf.mjs.html new file mode 100644 index 00000000000..f0004366b74 --- /dev/null +++ b/output/if_sxmlp_simple.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_sxmlp_simple.intf.mjs + + + + + + + + + +
+
+

All files / output if_sxmlp_simple.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_sxmlp_simple.intf.abap
+class if_sxmlp_simple {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['IF_SXMLP_SIMPLE'] = if_sxmlp_simple;
+export {if_sxmlp_simple};
+//# sourceMappingURL=if_sxmlp_simple.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_system_uuid_rfc4122_static.intf.mjs.html b/output/if_system_uuid_rfc4122_static.intf.mjs.html new file mode 100644 index 00000000000..f6e12cf2d27 --- /dev/null +++ b/output/if_system_uuid_rfc4122_static.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/if_system_uuid_rfc4122_static.intf.mjs + + + + + + + + + +
+
+

All files / output if_system_uuid_rfc4122_static.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// if_system_uuid_rfc4122_static.intf.abap
+class if_system_uuid_rfc4122_static {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_UUID_C36_BY_VERSION": {"visibility": "U", "parameters": {"UUID": {"type": () => {return new abap.types.Character(36, {"qualifiedName":"SYSUUID_C36","ddicName":"SYSUUID_C36"});}, "is_optional": " "}, "VERSION": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SYSTEM_UUID_RFC4122_STATIC'] = if_system_uuid_rfc4122_static;
+export {if_system_uuid_rfc4122_static};
+//# sourceMappingURL=if_system_uuid_rfc4122_static.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_system_uuid_static.intf.mjs.html b/output/if_system_uuid_static.intf.mjs.html new file mode 100644 index 00000000000..56d69c7618e --- /dev/null +++ b/output/if_system_uuid_static.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/if_system_uuid_static.intf.mjs + + + + + + + + + +
+
+

All files / output if_system_uuid_static.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_system_uuid_static.intf.abap
+class if_system_uuid_static {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_UUID_X16": {"visibility": "U", "parameters": {"UUID": {"type": () => {return new abap.types.Hex({length: 16});}, "is_optional": " "}}},
+  "CREATE_UUID_C32": {"visibility": "U", "parameters": {"UUID": {"type": () => {return new abap.types.Character(32, {"qualifiedName":"SYSUUID_C32","ddicName":"SYSUUID_C32"});}, "is_optional": " "}}}};
+}
+abap.Classes['IF_SYSTEM_UUID_STATIC'] = if_system_uuid_static;
+export {if_system_uuid_static};
+//# sourceMappingURL=if_system_uuid_static.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_t100_dyn_msg.intf.mjs.html b/output/if_t100_dyn_msg.intf.mjs.html new file mode 100644 index 00000000000..cfb14265115 --- /dev/null +++ b/output/if_t100_dyn_msg.intf.mjs.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for output/if_t100_dyn_msg.intf.mjs + + + + + + + + + +
+
+

All files / output if_t100_dyn_msg.intf.mjs

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_t100_dyn_msg.intf.abap
+class if_t100_dyn_msg {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"MSGTY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SYMSGTY","ddicName":"SYMSGTY"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "MSGV1": {"type": () => {return new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "MSGV2": {"type": () => {return new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "MSGV3": {"type": () => {return new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "MSGV4": {"type": () => {return new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"});}, "visibility": "U", "is_constant": " ", "is_class": " "}};
+  static METHODS = {};
+}
+abap.Classes['IF_T100_DYN_MSG'] = if_t100_dyn_msg;
+export {if_t100_dyn_msg};
+//# sourceMappingURL=if_t100_dyn_msg.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/if_t100_message.intf.mjs.html b/output/if_t100_message.intf.mjs.html new file mode 100644 index 00000000000..60c8b68ed26 --- /dev/null +++ b/output/if_t100_message.intf.mjs.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for output/if_t100_message.intf.mjs + + + + + + + + + +
+
+

All files / output if_t100_message.intf.mjs

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// if_t100_message.intf.abap
+class if_t100_message {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"T100KEY": {"type": () => {return new abap.types.Structure({"msgid": new abap.types.Character(20, {}), "msgno": new abap.types.Numc({length: 3}), "attr1": new abap.types.Character(255, {}), "attr2": new abap.types.Character(255, {}), "attr3": new abap.types.Character(255, {}), "attr4": new abap.types.Character(255, {})}, "SCX_T100KEY", "SCX_T100KEY", {}, {});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "DEFAULT_TEXTID": {"type": () => {return new abap.types.Structure({"msgid": new abap.types.Character(20, {"qualifiedName":"SYMSGID","ddicName":"SYMSGID"}), "msgno": new abap.types.Numc({length: 3, qualifiedName: "SYMSGNO"}), "attr1": new abap.types.String({qualifiedName: "SCX_ATTRNAME"}), "attr2": new abap.types.String({qualifiedName: "SCX_ATTRNAME"}), "attr3": new abap.types.String({qualifiedName: "SCX_ATTRNAME"}), "attr4": new abap.types.String({qualifiedName: "SCX_ATTRNAME"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['IF_T100_MESSAGE'] = if_t100_message;
+if_t100_message.if_t100_message$default_textid = new abap.types.Structure({"msgid": new abap.types.Character(20, {"qualifiedName":"SYMSGID","ddicName":"SYMSGID"}), "msgno": new abap.types.Numc({length: 3, qualifiedName: "SYMSGNO"}), "attr1": new abap.types.String({qualifiedName: "SCX_ATTRNAME"}), "attr2": new abap.types.String({qualifiedName: "SCX_ATTRNAME"}), "attr3": new abap.types.String({qualifiedName: "SCX_ATTRNAME"}), "attr4": new abap.types.String({qualifiedName: "SCX_ATTRNAME"})}, undefined, undefined, {}, {});
+if_t100_message.if_t100_message$default_textid.get().msgid.set('AB');
+if_t100_message.if_t100_message$default_textid.get().msgno.set('123');
+if_t100_message.if_t100_message$default_textid.get().attr1.set('');
+if_t100_message.if_t100_message$default_textid.get().attr2.set('');
+if_t100_message.if_t100_message$default_textid.get().attr3.set('');
+if_t100_message.if_t100_message$default_textid.get().attr4.set('');
+export {if_t100_message};
+//# sourceMappingURL=if_t100_message.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/ihttpnvp.tabl.mjs.html b/output/ihttpnvp.tabl.mjs.html new file mode 100644 index 00000000000..3696d3e661a --- /dev/null +++ b/output/ihttpnvp.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/ihttpnvp.tabl.mjs + + + + + + + + + +
+
+

All files / output ihttpnvp.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["IHTTPNVP"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/index.html b/output/index.html new file mode 100644 index 00000000000..c710b2c790c --- /dev/null +++ b/output/index.html @@ -0,0 +1,6236 @@ + + + + + + Code coverage report for output + + + + + + + + + +
+
+

All files output

+
+ +
+ 99.99% + Statements + 92902/92910 +
+ + +
+ 14.49% + Branches + 219/1511 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 99.99% + Lines + 92902/92910 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
#ui2#cl_json.clas.locals.mjs.map +
+
100%10/10100%0/0100%0/0100%10/10
#ui2#cl_json.clas.mjs.map +
+
100%10/10100%0/0100%0/0100%10/10
00.msag.mjs +
+
100%6/6100%0/0100%0/0100%6/6
abap.type.mjs +
+
100%69/69100%0/0100%0/0100%69/69
abap_boolean.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
abap_callstack.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
abap_callstack_line.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
abap_encod.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
abap_sortorder.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
abap_sortorder_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
abaptxt255.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
abaptxt255_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
balmnr.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
balognr.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapi_fld.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapi_line.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapi_msg.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapi_mtype.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapi_param.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapi_rcode.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapilogsys.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapioption.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
bapiret2.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
bapirettab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
bapireturn.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
bapisign.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
boolean.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char1.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char10.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char120.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char15.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char20.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char25.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char3.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char30.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char32.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char4.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char6.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
char80.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
dats.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
dd02l.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
dd09l.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
ddfields.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
ddoption.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
ddsign.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
devclass.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
dfies.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
dokhl.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
dokil.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
dokstate.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
doku_obj.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
dynprofld.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
fieldname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
file_table.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
filetable.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
flag.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
funcname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
guid.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
icon.type.mjs +
+
100%149/149100%0/0100%0/0100%149/149
icon_d.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
if_abap_channel_types.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_abap_conv_in.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_abap_conv_out.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_abap_unit_constant.intf.mjs +
+
100%17/17100%0/0100%0/0100%17/17
if_apc_tcp_frame_types.intf.mjs +
+
100%17/17100%0/0100%0/0100%17/17
if_apc_wsp_binding_manager.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_apc_wsp_client.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
if_apc_wsp_event_handler.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
if_apc_wsp_extension.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_apc_wsp_initial_request.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_apc_wsp_message.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
if_apc_wsp_message_manager.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_apc_wsp_server_context.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_aunit_constants.intf.mjs +
+
100%35/35100%0/0100%0/0100%35/35
if_document_bcs.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_ftd_input_arguments.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_ftd_input_config_setter.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_ftd_invocation_answer.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_ftd_invocation_result.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_ftd_output_config_setter.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_ftd_output_configuration.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_function_test_environment.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_function_testdouble.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_http_client.intf.mjs +
+
100%23/23100%0/0100%0/0100%23/23
if_http_entity.intf.mjs +
+
100%58/58100%0/0100%0/0100%58/58
if_http_extension.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
if_http_request.intf.mjs +
+
100%32/32100%0/0100%0/0100%32/32
if_http_response.intf.mjs +
+
100%20/20100%0/0100%0/0100%20/20
if_http_server.intf.mjs +
+
100%51/51100%0/0100%0/0100%51/51
if_http_utility.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
if_ixml.intf.mjs +
+
100%13/13100%0/0100%0/0100%13/13
if_ixml_attribute.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
if_ixml_document.intf.mjs +
+
100%32/32100%0/0100%0/0100%32/32
if_ixml_element.intf.mjs +
+
100%35/35100%0/0100%0/0100%35/35
if_ixml_encoding.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
if_ixml_istream.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_ixml_named_node_map.intf.mjs +
+
100%14/14100%0/0100%0/0100%14/14
if_ixml_node.intf.mjs +
+
100%35/35100%0/0100%0/0100%35/35
if_ixml_node_collection.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_ixml_node_filter.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_ixml_node_iterator.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_ixml_node_list.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
if_ixml_ostream.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_ixml_parse_error.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
if_ixml_parser.intf.mjs +
+
100%16/16100%0/0100%0/0100%16/16
if_ixml_renderer.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_ixml_stream_factory.intf.mjs +
+
100%13/13100%0/0100%0/0100%13/13
if_ixml_unknown.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_message.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_mr_api.intf.mjs +
+
100%16/16100%0/0100%0/0100%16/16
if_oo_adt_classrun.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_oo_adt_classrun_out.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_oo_clif_source.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_osql_test_environment.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
if_package.intf.mjs +
+
100%22/22100%0/0100%0/0100%22/22
if_recipient_bcs.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_salv_c_bool_sap.intf.mjs +
+
100%14/14100%0/0100%0/0100%14/14
if_salv_c_selection_mode.intf.mjs +
+
100%23/23100%0/0100%0/0100%23/23
if_sender_bcs.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_serializable_object.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_shm_build_instance.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_shm_trace.intf.mjs +
+
100%26/26100%0/0100%0/0100%26/26
if_sxml.intf.mjs +
+
100%21/21100%0/0100%0/0100%21/21
if_sxml_attribute.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
if_sxml_close_element.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
if_sxml_node.intf.mjs +
+
100%25/25100%0/0100%0/0100%25/25
if_sxml_open_element.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
if_sxml_reader.intf.mjs +
+
100%14/14100%0/0100%0/0100%14/14
if_sxml_value.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
if_sxml_value_node.intf.mjs +
+
100%14/14100%0/0100%0/0100%14/14
if_sxml_writer.intf.mjs +
+
100%39/39100%0/0100%0/0100%39/39
if_sxmlp_factory.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_sxmlp_list.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_sxmlp_part.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_sxmlp_simple.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_system_uuid_rfc4122_static.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
if_system_uuid_static.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
if_t100_dyn_msg.intf.mjs +
+
100%13/13100%0/0100%0/0100%13/13
if_t100_message.intf.mjs +
+
100%17/17100%0/0100%0/0100%17/17
ihttpnvp.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
index.mjs +
+
99.88%6923/69310.23%3/1295100%1/199.88%6923/6931
init.mjs +
+
100%81238/81238100%2/2100%1/1100%81238/81238
int1.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
int2.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
int4.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
laiso.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
land1.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
langu.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lvc_nokeyc.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lxe_pcx_s1.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
lxecustmnr.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lxeisolang.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lxeobjname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lxetextkey.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lxetexttype.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lxeunitlin.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lxeunitmlt.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
lxeuppcase.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
mandt.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
match_result.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
match_result_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
menge_d.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
msehi.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
namespace.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
number_get_next.fugr.number_get_next.mjs +
+
100%17/17100%0/0100%0/0100%17/17
numc4.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
openabap.fugr.call_v1_ping.mjs +
+
100%6/6100%0/0100%0/0100%6/6
openabap.fugr.conversion_exit_alpha_input.mjs +
+
100%41/41100%0/0100%0/0100%41/41
openabap.fugr.conversion_exit_alpha_output.mjs +
+
100%22/22100%0/0100%0/0100%22/22
openabap.fugr.conversion_exit_isola_input.mjs +
+
100%17/17100%0/0100%0/0100%17/17
openabap.fugr.conversion_exit_isola_output.mjs +
+
100%26/26100%0/0100%0/0100%26/26
openabap.fugr.convert_itf_to_stream_text.mjs +
+
100%26/26100%0/0100%0/0100%26/26
openabap.fugr.docu_get.mjs +
+
100%22/22100%0/0100%0/0100%22/22
openabap.fugr.function_exists.mjs +
+
100%16/16100%0/0100%0/0100%16/16
openabap.fugr.generate_sec_random.mjs +
+
100%16/16100%0/0100%0/0100%16/16
openabap.fugr.get_system_timezone.mjs +
+
100%12/12100%0/0100%0/0100%12/12
openabap.fugr.system_callstack.mjs +
+
100%16/16100%0/0100%0/0100%16/16
openabap.fugr.system_installed_languages.mjs +
+
100%13/13100%0/0100%0/0100%13/13
openabap.fugr.text_split.mjs +
+
100%28/28100%0/0100%0/0100%28/28
openabap.fugr.unit_conversion_simple.mjs +
+
100%39/39100%0/0100%0/0100%39/39
parentcl.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
progdir.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
progname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
reposrc.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
rfcdest.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
rswsourcet.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
rzlli_apcl.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
salv_s_int4_column.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
salv_t_int4_column.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
sappatchlv.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
saprelease.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sci_chkv.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
scompkdtln.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
scrtext_l.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
scrtext_m.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
scrtext_s.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
scx_attrname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
scx_t100key.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
sdok_class.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sdok_docid.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sdokobject.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
seobusobj.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seoc.type.mjs +
+
100%19/19100%0/0100%0/0100%19/19
seoclskey.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
seoclsname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seocmpname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seocmptype.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seocompo.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
seocompotx.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
seodescr.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seoexpose.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seokeyfld.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seoo.type.mjs +
+
100%11/11100%0/0100%0/0100%11/11
seop.type.mjs +
+
100%11/11100%0/0100%0/0100%11/11
seos.type.mjs +
+
100%7/7100%0/0100%0/0100%7/7
seosconame.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seoscotype.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
seosubco.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
seosubcotx.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
seox.type.mjs +
+
100%7/7100%0/0100%0/0100%7/7
shm_affect_server.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shm_area_name.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shm_attach_mode.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shm_auto_build_class_name.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shm_client.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shm_constr_invocation_mode.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shm_inst_info.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
shm_inst_infos.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
shm_inst_name.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shm_life_context.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shm_properties.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
shm_rc.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shma_attributes.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
shma_client.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
shmm_trc_variant_name.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
skwf_io.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
skwf_ioty.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
so_raw255.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
so_text255.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sobj_name.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
soli.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
soli_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
solix.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
solix_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
sotr_conc.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
spras.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
ssfapplssl.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sstmnt.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
sstmnt_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
sstruc.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
sstruc_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
stokes.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
stokes_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
stokesx.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
string_table.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
stringtab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
submatch_result.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
submatch_result_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
sxco_fm_name.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sxco_transport.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sydate.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
symsg.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
symsgid.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
symsgno.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
symsgty.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
symsgv.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
syrepid.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
syst_host.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sysubrc.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sysuuid_c32.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sysuuid_c36.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
sysuuid_x16.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
syuname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
t000.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
t100.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
tabfdpos.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
tabname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
tadir.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
tdevc.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
tdline.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
text20.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
text200.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
text255.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
text30.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
text80.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
textpool.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
tfdir.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
thead.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
tihttpnvp.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
timestamp.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
timestampl.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
timezone.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
timn.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
tline.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
tline_tab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
tlinetab.ttyp.mjs +
+
100%4/4100%1/1100%0/0100%4/4
trfunction.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
trkorr.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
trnspace.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
trobjtype.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
tzntstmpl.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
tzntstmps.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
uname.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
usnam.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
vseointerf.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
w3mime.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
wwwdatatab.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
wwwparams.tabl.mjs +
+
100%5/5100%1/1100%0/0100%5/5
xfeld.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
xsdboolean.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
xsdtime_t.dtel.mjs +
+
100%6/6100%1/1100%0/0100%6/6
zabapgit_css_common.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zabapgit_css_page_db.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zabapgit_css_page_db_entry.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zabapgit_css_theme_belize_blue.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zabapgit_css_theme_dark.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zabapgit_css_theme_default.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zabapgit_icon_font.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zabapgit_icon_font_css.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zabapgit_js_common.w3mi.mjs +
+
100%4/4100%1/1100%0/0100%4/4
zif_abapgit_aff_intf_v1.intf.mjs +
+
100%19/19100%0/0100%0/0100%19/19
zif_abapgit_aff_oo_types_v1.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
zif_abapgit_aff_registry.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_aff_type_mapping.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_aff_types_v1.intf.mjs +
+
100%54/54100%0/0100%0/0100%54/54
zif_abapgit_ajson.intf.mjs +
+
100%53/53100%0/0100%0/0100%53/53
zif_abapgit_ajson_filter.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
zif_abapgit_ajson_mapping.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
zif_abapgit_ajson_types.intf.mjs +
+
100%21/21100%0/0100%0/0100%21/21
zif_abapgit_apack_definitions.intf.mjs +
+
100%26/26100%0/0100%0/0100%26/26
zif_abapgit_auth.intf.mjs +
+
100%16/16100%0/0100%0/0100%16/16
zif_abapgit_background.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
zif_abapgit_code_inspector.intf.mjs +
+
100%16/16100%0/0100%0/0100%16/16
zif_abapgit_comparator.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_cts_api.intf.mjs +
+
100%33/33100%0/0100%0/0100%33/33
zif_abapgit_data_config.intf.mjs +
+
100%31/31100%0/0100%0/0100%31/31
zif_abapgit_data_deserializer.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
zif_abapgit_data_serializer.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_data_supporter.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_definitions.intf.mjs +
+
100%200/200100%0/0100%0/0100%200/200
zif_abapgit_dot_abapgit.intf.mjs +
+
100%22/22100%0/0100%0/0100%22/22
zif_abapgit_ecatt.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
zif_abapgit_ecatt_download.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_ecatt_upload.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_environment.intf.mjs +
+
100%18/18100%0/0100%0/0100%18/18
zif_abapgit_exit.intf.mjs +
+
100%35/35100%0/0100%0/0100%35/35
zif_abapgit_field_rules.intf.mjs +
+
100%19/19100%0/0100%0/0100%19/19
zif_abapgit_frontend_services.intf.mjs +
+
100%27/27100%0/0100%0/0100%27/27
zif_abapgit_git_definitions.intf.mjs +
+
100%62/62100%0/0100%0/0100%62/62
zif_abapgit_gui_asset_manager.intf.mjs +
+
100%13/13100%0/0100%0/0100%13/13
zif_abapgit_gui_error_handler.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_gui_event.intf.mjs +
+
100%14/14100%0/0100%0/0100%14/14
zif_abapgit_gui_event_handler.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_gui_hotkey_ctl.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
zif_abapgit_gui_hotkeys.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_gui_html_processor.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_gui_jumper.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
zif_abapgit_gui_menu_provider.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_gui_modal.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_gui_page_title.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_gui_render_item.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_gui_renderable.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_gui_services.intf.mjs +
+
100%15/15100%0/0100%0/0100%15/15
zif_abapgit_html.intf.mjs +
+
100%33/33100%0/0100%0/0100%33/33
zif_abapgit_html_form.intf.mjs +
+
100%32/32100%0/0100%0/0100%32/32
zif_abapgit_html_popup.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_html_table.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
zif_abapgit_html_viewer.intf.mjs +
+
100%23/23100%0/0100%0/0100%23/23
zif_abapgit_http_agent.intf.mjs +
+
100%16/16100%0/0100%0/0100%16/16
zif_abapgit_http_response.intf.mjs +
+
100%16/16100%0/0100%0/0100%16/16
zif_abapgit_i18n_file.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
zif_abapgit_lang_definitions.intf.mjs +
+
100%13/13100%0/0100%0/0100%13/13
zif_abapgit_log.intf.mjs +
+
100%40/40100%0/0100%0/0100%40/40
zif_abapgit_longtexts.intf.mjs +
+
100%13/13100%0/0100%0/0100%13/13
zif_abapgit_lxe_texts.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_merge.intf.mjs +
+
100%16/16100%0/0100%0/0100%16/16
zif_abapgit_object.intf.mjs +
+
100%28/28100%0/0100%0/0100%28/28
zif_abapgit_object_enho.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_object_enhs.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_object_filter.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_objects.intf.mjs +
+
100%23/23100%0/0100%0/0100%23/23
zif_abapgit_oo_object_fnc.intf.mjs +
+
100%41/41100%0/0100%0/0100%41/41
zif_abapgit_persist_repo.intf.mjs +
+
100%16/16100%0/0100%0/0100%16/16
zif_abapgit_persist_repo_cs.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
zif_abapgit_persist_settings.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_persist_user.intf.mjs +
+
100%43/43100%0/0100%0/0100%43/43
zif_abapgit_persistence.intf.mjs +
+
100%21/21100%0/0100%0/0100%21/21
zif_abapgit_popups.intf.mjs +
+
100%30/30100%0/0100%0/0100%30/30
zif_abapgit_pr_enum_provider.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_progress.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
zif_abapgit_repo.intf.mjs +
+
100%21/21100%0/0100%0/0100%21/21
zif_abapgit_repo_checksums.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
zif_abapgit_repo_listener.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_repo_online.intf.mjs +
+
100%20/20100%0/0100%0/0100%20/20
zif_abapgit_repo_srv.intf.mjs +
+
100%24/24100%0/0100%0/0100%24/24
zif_abapgit_sap_namespace.intf.mjs +
+
100%10/10100%0/0100%0/0100%10/10
zif_abapgit_sap_package.intf.mjs +
+
100%21/21100%0/0100%0/0100%21/21
zif_abapgit_sap_report.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
zif_abapgit_services_git.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_services_repo.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_stage_logic.intf.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zif_abapgit_tadir.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
zif_abapgit_version.intf.mjs +
+
100%14/14100%0/0100%0/0100%14/14
zif_abapgit_xml_input.intf.mjs +
+
100%11/11100%0/0100%0/0100%11/11
zif_abapgit_xml_output.intf.mjs +
+
100%12/12100%0/0100%0/0100%12/12
zw3mi.fugr.wwwdata_export.mjs +
+
100%14/14100%0/0100%0/0100%14/14
zw3mi.fugr.wwwdata_import.mjs +
+
100%39/39100%0/0100%0/0100%39/39
zw3mi.fugr.wwwparams_insert.mjs +
+
100%9/9100%0/0100%0/0100%9/9
zw3mi.fugr.wwwparams_read.mjs +
+
100%34/34100%0/0100%0/0100%34/34
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/output/index.mjs.html b/output/index.mjs.html new file mode 100644 index 00000000000..1dfa06144b7 --- /dev/null +++ b/output/index.mjs.html @@ -0,0 +1,20875 @@ + + + + + + Code coverage report for output/index.mjs + + + + + + + + + +
+
+

All files / output index.mjs

+
+ +
+ 99.88% + Statements + 6923/6931 +
+ + +
+ 0.23% + Branches + 3/1295 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 99.88% + Lines + 6923/6931 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039 +2040 +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056 +2057 +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072 +2073 +2074 +2075 +2076 +2077 +2078 +2079 +2080 +2081 +2082 +2083 +2084 +2085 +2086 +2087 +2088 +2089 +2090 +2091 +2092 +2093 +2094 +2095 +2096 +2097 +2098 +2099 +2100 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +2109 +2110 +2111 +2112 +2113 +2114 +2115 +2116 +2117 +2118 +2119 +2120 +2121 +2122 +2123 +2124 +2125 +2126 +2127 +2128 +2129 +2130 +2131 +2132 +2133 +2134 +2135 +2136 +2137 +2138 +2139 +2140 +2141 +2142 +2143 +2144 +2145 +2146 +2147 +2148 +2149 +2150 +2151 +2152 +2153 +2154 +2155 +2156 +2157 +2158 +2159 +2160 +2161 +2162 +2163 +2164 +2165 +2166 +2167 +2168 +2169 +2170 +2171 +2172 +2173 +2174 +2175 +2176 +2177 +2178 +2179 +2180 +2181 +2182 +2183 +2184 +2185 +2186 +2187 +2188 +2189 +2190 +2191 +2192 +2193 +2194 +2195 +2196 +2197 +2198 +2199 +2200 +2201 +2202 +2203 +2204 +2205 +2206 +2207 +2208 +2209 +2210 +2211 +2212 +2213 +2214 +2215 +2216 +2217 +2218 +2219 +2220 +2221 +2222 +2223 +2224 +2225 +2226 +2227 +2228 +2229 +2230 +2231 +2232 +2233 +2234 +2235 +2236 +2237 +2238 +2239 +2240 +2241 +2242 +2243 +2244 +2245 +2246 +2247 +2248 +2249 +2250 +2251 +2252 +2253 +2254 +2255 +2256 +2257 +2258 +2259 +2260 +2261 +2262 +2263 +2264 +2265 +2266 +2267 +2268 +2269 +2270 +2271 +2272 +2273 +2274 +2275 +2276 +2277 +2278 +2279 +2280 +2281 +2282 +2283 +2284 +2285 +2286 +2287 +2288 +2289 +2290 +2291 +2292 +2293 +2294 +2295 +2296 +2297 +2298 +2299 +2300 +2301 +2302 +2303 +2304 +2305 +2306 +2307 +2308 +2309 +2310 +2311 +2312 +2313 +2314 +2315 +2316 +2317 +2318 +2319 +2320 +2321 +2322 +2323 +2324 +2325 +2326 +2327 +2328 +2329 +2330 +2331 +2332 +2333 +2334 +2335 +2336 +2337 +2338 +2339 +2340 +2341 +2342 +2343 +2344 +2345 +2346 +2347 +2348 +2349 +2350 +2351 +2352 +2353 +2354 +2355 +2356 +2357 +2358 +2359 +2360 +2361 +2362 +2363 +2364 +2365 +2366 +2367 +2368 +2369 +2370 +2371 +2372 +2373 +2374 +2375 +2376 +2377 +2378 +2379 +2380 +2381 +2382 +2383 +2384 +2385 +2386 +2387 +2388 +2389 +2390 +2391 +2392 +2393 +2394 +2395 +2396 +2397 +2398 +2399 +2400 +2401 +2402 +2403 +2404 +2405 +2406 +2407 +2408 +2409 +2410 +2411 +2412 +2413 +2414 +2415 +2416 +2417 +2418 +2419 +2420 +2421 +2422 +2423 +2424 +2425 +2426 +2427 +2428 +2429 +2430 +2431 +2432 +2433 +2434 +2435 +2436 +2437 +2438 +2439 +2440 +2441 +2442 +2443 +2444 +2445 +2446 +2447 +2448 +2449 +2450 +2451 +2452 +2453 +2454 +2455 +2456 +2457 +2458 +2459 +2460 +2461 +2462 +2463 +2464 +2465 +2466 +2467 +2468 +2469 +2470 +2471 +2472 +2473 +2474 +2475 +2476 +2477 +2478 +2479 +2480 +2481 +2482 +2483 +2484 +2485 +2486 +2487 +2488 +2489 +2490 +2491 +2492 +2493 +2494 +2495 +2496 +2497 +2498 +2499 +2500 +2501 +2502 +2503 +2504 +2505 +2506 +2507 +2508 +2509 +2510 +2511 +2512 +2513 +2514 +2515 +2516 +2517 +2518 +2519 +2520 +2521 +2522 +2523 +2524 +2525 +2526 +2527 +2528 +2529 +2530 +2531 +2532 +2533 +2534 +2535 +2536 +2537 +2538 +2539 +2540 +2541 +2542 +2543 +2544 +2545 +2546 +2547 +2548 +2549 +2550 +2551 +2552 +2553 +2554 +2555 +2556 +2557 +2558 +2559 +2560 +2561 +2562 +2563 +2564 +2565 +2566 +2567 +2568 +2569 +2570 +2571 +2572 +2573 +2574 +2575 +2576 +2577 +2578 +2579 +2580 +2581 +2582 +2583 +2584 +2585 +2586 +2587 +2588 +2589 +2590 +2591 +2592 +2593 +2594 +2595 +2596 +2597 +2598 +2599 +2600 +2601 +2602 +2603 +2604 +2605 +2606 +2607 +2608 +2609 +2610 +2611 +2612 +2613 +2614 +2615 +2616 +2617 +2618 +2619 +2620 +2621 +2622 +2623 +2624 +2625 +2626 +2627 +2628 +2629 +2630 +2631 +2632 +2633 +2634 +2635 +2636 +2637 +2638 +2639 +2640 +2641 +2642 +2643 +2644 +2645 +2646 +2647 +2648 +2649 +2650 +2651 +2652 +2653 +2654 +2655 +2656 +2657 +2658 +2659 +2660 +2661 +2662 +2663 +2664 +2665 +2666 +2667 +2668 +2669 +2670 +2671 +2672 +2673 +2674 +2675 +2676 +2677 +2678 +2679 +2680 +2681 +2682 +2683 +2684 +2685 +2686 +2687 +2688 +2689 +2690 +2691 +2692 +2693 +2694 +2695 +2696 +2697 +2698 +2699 +2700 +2701 +2702 +2703 +2704 +2705 +2706 +2707 +2708 +2709 +2710 +2711 +2712 +2713 +2714 +2715 +2716 +2717 +2718 +2719 +2720 +2721 +2722 +2723 +2724 +2725 +2726 +2727 +2728 +2729 +2730 +2731 +2732 +2733 +2734 +2735 +2736 +2737 +2738 +2739 +2740 +2741 +2742 +2743 +2744 +2745 +2746 +2747 +2748 +2749 +2750 +2751 +2752 +2753 +2754 +2755 +2756 +2757 +2758 +2759 +2760 +2761 +2762 +2763 +2764 +2765 +2766 +2767 +2768 +2769 +2770 +2771 +2772 +2773 +2774 +2775 +2776 +2777 +2778 +2779 +2780 +2781 +2782 +2783 +2784 +2785 +2786 +2787 +2788 +2789 +2790 +2791 +2792 +2793 +2794 +2795 +2796 +2797 +2798 +2799 +2800 +2801 +2802 +2803 +2804 +2805 +2806 +2807 +2808 +2809 +2810 +2811 +2812 +2813 +2814 +2815 +2816 +2817 +2818 +2819 +2820 +2821 +2822 +2823 +2824 +2825 +2826 +2827 +2828 +2829 +2830 +2831 +2832 +2833 +2834 +2835 +2836 +2837 +2838 +2839 +2840 +2841 +2842 +2843 +2844 +2845 +2846 +2847 +2848 +2849 +2850 +2851 +2852 +2853 +2854 +2855 +2856 +2857 +2858 +2859 +2860 +2861 +2862 +2863 +2864 +2865 +2866 +2867 +2868 +2869 +2870 +2871 +2872 +2873 +2874 +2875 +2876 +2877 +2878 +2879 +2880 +2881 +2882 +2883 +2884 +2885 +2886 +2887 +2888 +2889 +2890 +2891 +2892 +2893 +2894 +2895 +2896 +2897 +2898 +2899 +2900 +2901 +2902 +2903 +2904 +2905 +2906 +2907 +2908 +2909 +2910 +2911 +2912 +2913 +2914 +2915 +2916 +2917 +2918 +2919 +2920 +2921 +2922 +2923 +2924 +2925 +2926 +2927 +2928 +2929 +2930 +2931 +2932 +2933 +2934 +2935 +2936 +2937 +2938 +2939 +2940 +2941 +2942 +2943 +2944 +2945 +2946 +2947 +2948 +2949 +2950 +2951 +2952 +2953 +2954 +2955 +2956 +2957 +2958 +2959 +2960 +2961 +2962 +2963 +2964 +2965 +2966 +2967 +2968 +2969 +2970 +2971 +2972 +2973 +2974 +2975 +2976 +2977 +2978 +2979 +2980 +2981 +2982 +2983 +2984 +2985 +2986 +2987 +2988 +2989 +2990 +2991 +2992 +2993 +2994 +2995 +2996 +2997 +2998 +2999 +3000 +3001 +3002 +3003 +3004 +3005 +3006 +3007 +3008 +3009 +3010 +3011 +3012 +3013 +3014 +3015 +3016 +3017 +3018 +3019 +3020 +3021 +3022 +3023 +3024 +3025 +3026 +3027 +3028 +3029 +3030 +3031 +3032 +3033 +3034 +3035 +3036 +3037 +3038 +3039 +3040 +3041 +3042 +3043 +3044 +3045 +3046 +3047 +3048 +3049 +3050 +3051 +3052 +3053 +3054 +3055 +3056 +3057 +3058 +3059 +3060 +3061 +3062 +3063 +3064 +3065 +3066 +3067 +3068 +3069 +3070 +3071 +3072 +3073 +3074 +3075 +3076 +3077 +3078 +3079 +3080 +3081 +3082 +3083 +3084 +3085 +3086 +3087 +3088 +3089 +3090 +3091 +3092 +3093 +3094 +3095 +3096 +3097 +3098 +3099 +3100 +3101 +3102 +3103 +3104 +3105 +3106 +3107 +3108 +3109 +3110 +3111 +3112 +3113 +3114 +3115 +3116 +3117 +3118 +3119 +3120 +3121 +3122 +3123 +3124 +3125 +3126 +3127 +3128 +3129 +3130 +3131 +3132 +3133 +3134 +3135 +3136 +3137 +3138 +3139 +3140 +3141 +3142 +3143 +3144 +3145 +3146 +3147 +3148 +3149 +3150 +3151 +3152 +3153 +3154 +3155 +3156 +3157 +3158 +3159 +3160 +3161 +3162 +3163 +3164 +3165 +3166 +3167 +3168 +3169 +3170 +3171 +3172 +3173 +3174 +3175 +3176 +3177 +3178 +3179 +3180 +3181 +3182 +3183 +3184 +3185 +3186 +3187 +3188 +3189 +3190 +3191 +3192 +3193 +3194 +3195 +3196 +3197 +3198 +3199 +3200 +3201 +3202 +3203 +3204 +3205 +3206 +3207 +3208 +3209 +3210 +3211 +3212 +3213 +3214 +3215 +3216 +3217 +3218 +3219 +3220 +3221 +3222 +3223 +3224 +3225 +3226 +3227 +3228 +3229 +3230 +3231 +3232 +3233 +3234 +3235 +3236 +3237 +3238 +3239 +3240 +3241 +3242 +3243 +3244 +3245 +3246 +3247 +3248 +3249 +3250 +3251 +3252 +3253 +3254 +3255 +3256 +3257 +3258 +3259 +3260 +3261 +3262 +3263 +3264 +3265 +3266 +3267 +3268 +3269 +3270 +3271 +3272 +3273 +3274 +3275 +3276 +3277 +3278 +3279 +3280 +3281 +3282 +3283 +3284 +3285 +3286 +3287 +3288 +3289 +3290 +3291 +3292 +3293 +3294 +3295 +3296 +3297 +3298 +3299 +3300 +3301 +3302 +3303 +3304 +3305 +3306 +3307 +3308 +3309 +3310 +3311 +3312 +3313 +3314 +3315 +3316 +3317 +3318 +3319 +3320 +3321 +3322 +3323 +3324 +3325 +3326 +3327 +3328 +3329 +3330 +3331 +3332 +3333 +3334 +3335 +3336 +3337 +3338 +3339 +3340 +3341 +3342 +3343 +3344 +3345 +3346 +3347 +3348 +3349 +3350 +3351 +3352 +3353 +3354 +3355 +3356 +3357 +3358 +3359 +3360 +3361 +3362 +3363 +3364 +3365 +3366 +3367 +3368 +3369 +3370 +3371 +3372 +3373 +3374 +3375 +3376 +3377 +3378 +3379 +3380 +3381 +3382 +3383 +3384 +3385 +3386 +3387 +3388 +3389 +3390 +3391 +3392 +3393 +3394 +3395 +3396 +3397 +3398 +3399 +3400 +3401 +3402 +3403 +3404 +3405 +3406 +3407 +3408 +3409 +3410 +3411 +3412 +3413 +3414 +3415 +3416 +3417 +3418 +3419 +3420 +3421 +3422 +3423 +3424 +3425 +3426 +3427 +3428 +3429 +3430 +3431 +3432 +3433 +3434 +3435 +3436 +3437 +3438 +3439 +3440 +3441 +3442 +3443 +3444 +3445 +3446 +3447 +3448 +3449 +3450 +3451 +3452 +3453 +3454 +3455 +3456 +3457 +3458 +3459 +3460 +3461 +3462 +3463 +3464 +3465 +3466 +3467 +3468 +3469 +3470 +3471 +3472 +3473 +3474 +3475 +3476 +3477 +3478 +3479 +3480 +3481 +3482 +3483 +3484 +3485 +3486 +3487 +3488 +3489 +3490 +3491 +3492 +3493 +3494 +3495 +3496 +3497 +3498 +3499 +3500 +3501 +3502 +3503 +3504 +3505 +3506 +3507 +3508 +3509 +3510 +3511 +3512 +3513 +3514 +3515 +3516 +3517 +3518 +3519 +3520 +3521 +3522 +3523 +3524 +3525 +3526 +3527 +3528 +3529 +3530 +3531 +3532 +3533 +3534 +3535 +3536 +3537 +3538 +3539 +3540 +3541 +3542 +3543 +3544 +3545 +3546 +3547 +3548 +3549 +3550 +3551 +3552 +3553 +3554 +3555 +3556 +3557 +3558 +3559 +3560 +3561 +3562 +3563 +3564 +3565 +3566 +3567 +3568 +3569 +3570 +3571 +3572 +3573 +3574 +3575 +3576 +3577 +3578 +3579 +3580 +3581 +3582 +3583 +3584 +3585 +3586 +3587 +3588 +3589 +3590 +3591 +3592 +3593 +3594 +3595 +3596 +3597 +3598 +3599 +3600 +3601 +3602 +3603 +3604 +3605 +3606 +3607 +3608 +3609 +3610 +3611 +3612 +3613 +3614 +3615 +3616 +3617 +3618 +3619 +3620 +3621 +3622 +3623 +3624 +3625 +3626 +3627 +3628 +3629 +3630 +3631 +3632 +3633 +3634 +3635 +3636 +3637 +3638 +3639 +3640 +3641 +3642 +3643 +3644 +3645 +3646 +3647 +3648 +3649 +3650 +3651 +3652 +3653 +3654 +3655 +3656 +3657 +3658 +3659 +3660 +3661 +3662 +3663 +3664 +3665 +3666 +3667 +3668 +3669 +3670 +3671 +3672 +3673 +3674 +3675 +3676 +3677 +3678 +3679 +3680 +3681 +3682 +3683 +3684 +3685 +3686 +3687 +3688 +3689 +3690 +3691 +3692 +3693 +3694 +3695 +3696 +3697 +3698 +3699 +3700 +3701 +3702 +3703 +3704 +3705 +3706 +3707 +3708 +3709 +3710 +3711 +3712 +3713 +3714 +3715 +3716 +3717 +3718 +3719 +3720 +3721 +3722 +3723 +3724 +3725 +3726 +3727 +3728 +3729 +3730 +3731 +3732 +3733 +3734 +3735 +3736 +3737 +3738 +3739 +3740 +3741 +3742 +3743 +3744 +3745 +3746 +3747 +3748 +3749 +3750 +3751 +3752 +3753 +3754 +3755 +3756 +3757 +3758 +3759 +3760 +3761 +3762 +3763 +3764 +3765 +3766 +3767 +3768 +3769 +3770 +3771 +3772 +3773 +3774 +3775 +3776 +3777 +3778 +3779 +3780 +3781 +3782 +3783 +3784 +3785 +3786 +3787 +3788 +3789 +3790 +3791 +3792 +3793 +3794 +3795 +3796 +3797 +3798 +3799 +3800 +3801 +3802 +3803 +3804 +3805 +3806 +3807 +3808 +3809 +3810 +3811 +3812 +3813 +3814 +3815 +3816 +3817 +3818 +3819 +3820 +3821 +3822 +3823 +3824 +3825 +3826 +3827 +3828 +3829 +3830 +3831 +3832 +3833 +3834 +3835 +3836 +3837 +3838 +3839 +3840 +3841 +3842 +3843 +3844 +3845 +3846 +3847 +3848 +3849 +3850 +3851 +3852 +3853 +3854 +3855 +3856 +3857 +3858 +3859 +3860 +3861 +3862 +3863 +3864 +3865 +3866 +3867 +3868 +3869 +3870 +3871 +3872 +3873 +3874 +3875 +3876 +3877 +3878 +3879 +3880 +3881 +3882 +3883 +3884 +3885 +3886 +3887 +3888 +3889 +3890 +3891 +3892 +3893 +3894 +3895 +3896 +3897 +3898 +3899 +3900 +3901 +3902 +3903 +3904 +3905 +3906 +3907 +3908 +3909 +3910 +3911 +3912 +3913 +3914 +3915 +3916 +3917 +3918 +3919 +3920 +3921 +3922 +3923 +3924 +3925 +3926 +3927 +3928 +3929 +3930 +3931 +3932 +3933 +3934 +3935 +3936 +3937 +3938 +3939 +3940 +3941 +3942 +3943 +3944 +3945 +3946 +3947 +3948 +3949 +3950 +3951 +3952 +3953 +3954 +3955 +3956 +3957 +3958 +3959 +3960 +3961 +3962 +3963 +3964 +3965 +3966 +3967 +3968 +3969 +3970 +3971 +3972 +3973 +3974 +3975 +3976 +3977 +3978 +3979 +3980 +3981 +3982 +3983 +3984 +3985 +3986 +3987 +3988 +3989 +3990 +3991 +3992 +3993 +3994 +3995 +3996 +3997 +3998 +3999 +4000 +4001 +4002 +4003 +4004 +4005 +4006 +4007 +4008 +4009 +4010 +4011 +4012 +4013 +4014 +4015 +4016 +4017 +4018 +4019 +4020 +4021 +4022 +4023 +4024 +4025 +4026 +4027 +4028 +4029 +4030 +4031 +4032 +4033 +4034 +4035 +4036 +4037 +4038 +4039 +4040 +4041 +4042 +4043 +4044 +4045 +4046 +4047 +4048 +4049 +4050 +4051 +4052 +4053 +4054 +4055 +4056 +4057 +4058 +4059 +4060 +4061 +4062 +4063 +4064 +4065 +4066 +4067 +4068 +4069 +4070 +4071 +4072 +4073 +4074 +4075 +4076 +4077 +4078 +4079 +4080 +4081 +4082 +4083 +4084 +4085 +4086 +4087 +4088 +4089 +4090 +4091 +4092 +4093 +4094 +4095 +4096 +4097 +4098 +4099 +4100 +4101 +4102 +4103 +4104 +4105 +4106 +4107 +4108 +4109 +4110 +4111 +4112 +4113 +4114 +4115 +4116 +4117 +4118 +4119 +4120 +4121 +4122 +4123 +4124 +4125 +4126 +4127 +4128 +4129 +4130 +4131 +4132 +4133 +4134 +4135 +4136 +4137 +4138 +4139 +4140 +4141 +4142 +4143 +4144 +4145 +4146 +4147 +4148 +4149 +4150 +4151 +4152 +4153 +4154 +4155 +4156 +4157 +4158 +4159 +4160 +4161 +4162 +4163 +4164 +4165 +4166 +4167 +4168 +4169 +4170 +4171 +4172 +4173 +4174 +4175 +4176 +4177 +4178 +4179 +4180 +4181 +4182 +4183 +4184 +4185 +4186 +4187 +4188 +4189 +4190 +4191 +4192 +4193 +4194 +4195 +4196 +4197 +4198 +4199 +4200 +4201 +4202 +4203 +4204 +4205 +4206 +4207 +4208 +4209 +4210 +4211 +4212 +4213 +4214 +4215 +4216 +4217 +4218 +4219 +4220 +4221 +4222 +4223 +4224 +4225 +4226 +4227 +4228 +4229 +4230 +4231 +4232 +4233 +4234 +4235 +4236 +4237 +4238 +4239 +4240 +4241 +4242 +4243 +4244 +4245 +4246 +4247 +4248 +4249 +4250 +4251 +4252 +4253 +4254 +4255 +4256 +4257 +4258 +4259 +4260 +4261 +4262 +4263 +4264 +4265 +4266 +4267 +4268 +4269 +4270 +4271 +4272 +4273 +4274 +4275 +4276 +4277 +4278 +4279 +4280 +4281 +4282 +4283 +4284 +4285 +4286 +4287 +4288 +4289 +4290 +4291 +4292 +4293 +4294 +4295 +4296 +4297 +4298 +4299 +4300 +4301 +4302 +4303 +4304 +4305 +4306 +4307 +4308 +4309 +4310 +4311 +4312 +4313 +4314 +4315 +4316 +4317 +4318 +4319 +4320 +4321 +4322 +4323 +4324 +4325 +4326 +4327 +4328 +4329 +4330 +4331 +4332 +4333 +4334 +4335 +4336 +4337 +4338 +4339 +4340 +4341 +4342 +4343 +4344 +4345 +4346 +4347 +4348 +4349 +4350 +4351 +4352 +4353 +4354 +4355 +4356 +4357 +4358 +4359 +4360 +4361 +4362 +4363 +4364 +4365 +4366 +4367 +4368 +4369 +4370 +4371 +4372 +4373 +4374 +4375 +4376 +4377 +4378 +4379 +4380 +4381 +4382 +4383 +4384 +4385 +4386 +4387 +4388 +4389 +4390 +4391 +4392 +4393 +4394 +4395 +4396 +4397 +4398 +4399 +4400 +4401 +4402 +4403 +4404 +4405 +4406 +4407 +4408 +4409 +4410 +4411 +4412 +4413 +4414 +4415 +4416 +4417 +4418 +4419 +4420 +4421 +4422 +4423 +4424 +4425 +4426 +4427 +4428 +4429 +4430 +4431 +4432 +4433 +4434 +4435 +4436 +4437 +4438 +4439 +4440 +4441 +4442 +4443 +4444 +4445 +4446 +4447 +4448 +4449 +4450 +4451 +4452 +4453 +4454 +4455 +4456 +4457 +4458 +4459 +4460 +4461 +4462 +4463 +4464 +4465 +4466 +4467 +4468 +4469 +4470 +4471 +4472 +4473 +4474 +4475 +4476 +4477 +4478 +4479 +4480 +4481 +4482 +4483 +4484 +4485 +4486 +4487 +4488 +4489 +4490 +4491 +4492 +4493 +4494 +4495 +4496 +4497 +4498 +4499 +4500 +4501 +4502 +4503 +4504 +4505 +4506 +4507 +4508 +4509 +4510 +4511 +4512 +4513 +4514 +4515 +4516 +4517 +4518 +4519 +4520 +4521 +4522 +4523 +4524 +4525 +4526 +4527 +4528 +4529 +4530 +4531 +4532 +4533 +4534 +4535 +4536 +4537 +4538 +4539 +4540 +4541 +4542 +4543 +4544 +4545 +4546 +4547 +4548 +4549 +4550 +4551 +4552 +4553 +4554 +4555 +4556 +4557 +4558 +4559 +4560 +4561 +4562 +4563 +4564 +4565 +4566 +4567 +4568 +4569 +4570 +4571 +4572 +4573 +4574 +4575 +4576 +4577 +4578 +4579 +4580 +4581 +4582 +4583 +4584 +4585 +4586 +4587 +4588 +4589 +4590 +4591 +4592 +4593 +4594 +4595 +4596 +4597 +4598 +4599 +4600 +4601 +4602 +4603 +4604 +4605 +4606 +4607 +4608 +4609 +4610 +4611 +4612 +4613 +4614 +4615 +4616 +4617 +4618 +4619 +4620 +4621 +4622 +4623 +4624 +4625 +4626 +4627 +4628 +4629 +4630 +4631 +4632 +4633 +4634 +4635 +4636 +4637 +4638 +4639 +4640 +4641 +4642 +4643 +4644 +4645 +4646 +4647 +4648 +4649 +4650 +4651 +4652 +4653 +4654 +4655 +4656 +4657 +4658 +4659 +4660 +4661 +4662 +4663 +4664 +4665 +4666 +4667 +4668 +4669 +4670 +4671 +4672 +4673 +4674 +4675 +4676 +4677 +4678 +4679 +4680 +4681 +4682 +4683 +4684 +4685 +4686 +4687 +4688 +4689 +4690 +4691 +4692 +4693 +4694 +4695 +4696 +4697 +4698 +4699 +4700 +4701 +4702 +4703 +4704 +4705 +4706 +4707 +4708 +4709 +4710 +4711 +4712 +4713 +4714 +4715 +4716 +4717 +4718 +4719 +4720 +4721 +4722 +4723 +4724 +4725 +4726 +4727 +4728 +4729 +4730 +4731 +4732 +4733 +4734 +4735 +4736 +4737 +4738 +4739 +4740 +4741 +4742 +4743 +4744 +4745 +4746 +4747 +4748 +4749 +4750 +4751 +4752 +4753 +4754 +4755 +4756 +4757 +4758 +4759 +4760 +4761 +4762 +4763 +4764 +4765 +4766 +4767 +4768 +4769 +4770 +4771 +4772 +4773 +4774 +4775 +4776 +4777 +4778 +4779 +4780 +4781 +4782 +4783 +4784 +4785 +4786 +4787 +4788 +4789 +4790 +4791 +4792 +4793 +4794 +4795 +4796 +4797 +4798 +4799 +4800 +4801 +4802 +4803 +4804 +4805 +4806 +4807 +4808 +4809 +4810 +4811 +4812 +4813 +4814 +4815 +4816 +4817 +4818 +4819 +4820 +4821 +4822 +4823 +4824 +4825 +4826 +4827 +4828 +4829 +4830 +4831 +4832 +4833 +4834 +4835 +4836 +4837 +4838 +4839 +4840 +4841 +4842 +4843 +4844 +4845 +4846 +4847 +4848 +4849 +4850 +4851 +4852 +4853 +4854 +4855 +4856 +4857 +4858 +4859 +4860 +4861 +4862 +4863 +4864 +4865 +4866 +4867 +4868 +4869 +4870 +4871 +4872 +4873 +4874 +4875 +4876 +4877 +4878 +4879 +4880 +4881 +4882 +4883 +4884 +4885 +4886 +4887 +4888 +4889 +4890 +4891 +4892 +4893 +4894 +4895 +4896 +4897 +4898 +4899 +4900 +4901 +4902 +4903 +4904 +4905 +4906 +4907 +4908 +4909 +4910 +4911 +4912 +4913 +4914 +4915 +4916 +4917 +4918 +4919 +4920 +4921 +4922 +4923 +4924 +4925 +4926 +4927 +4928 +4929 +4930 +4931 +4932 +4933 +4934 +4935 +4936 +4937 +4938 +4939 +4940 +4941 +4942 +4943 +4944 +4945 +4946 +4947 +4948 +4949 +4950 +4951 +4952 +4953 +4954 +4955 +4956 +4957 +4958 +4959 +4960 +4961 +4962 +4963 +4964 +4965 +4966 +4967 +4968 +4969 +4970 +4971 +4972 +4973 +4974 +4975 +4976 +4977 +4978 +4979 +4980 +4981 +4982 +4983 +4984 +4985 +4986 +4987 +4988 +4989 +4990 +4991 +4992 +4993 +4994 +4995 +4996 +4997 +4998 +4999 +5000 +5001 +5002 +5003 +5004 +5005 +5006 +5007 +5008 +5009 +5010 +5011 +5012 +5013 +5014 +5015 +5016 +5017 +5018 +5019 +5020 +5021 +5022 +5023 +5024 +5025 +5026 +5027 +5028 +5029 +5030 +5031 +5032 +5033 +5034 +5035 +5036 +5037 +5038 +5039 +5040 +5041 +5042 +5043 +5044 +5045 +5046 +5047 +5048 +5049 +5050 +5051 +5052 +5053 +5054 +5055 +5056 +5057 +5058 +5059 +5060 +5061 +5062 +5063 +5064 +5065 +5066 +5067 +5068 +5069 +5070 +5071 +5072 +5073 +5074 +5075 +5076 +5077 +5078 +5079 +5080 +5081 +5082 +5083 +5084 +5085 +5086 +5087 +5088 +5089 +5090 +5091 +5092 +5093 +5094 +5095 +5096 +5097 +5098 +5099 +5100 +5101 +5102 +5103 +5104 +5105 +5106 +5107 +5108 +5109 +5110 +5111 +5112 +5113 +5114 +5115 +5116 +5117 +5118 +5119 +5120 +5121 +5122 +5123 +5124 +5125 +5126 +5127 +5128 +5129 +5130 +5131 +5132 +5133 +5134 +5135 +5136 +5137 +5138 +5139 +5140 +5141 +5142 +5143 +5144 +5145 +5146 +5147 +5148 +5149 +5150 +5151 +5152 +5153 +5154 +5155 +5156 +5157 +5158 +5159 +5160 +5161 +5162 +5163 +5164 +5165 +5166 +5167 +5168 +5169 +5170 +5171 +5172 +5173 +5174 +5175 +5176 +5177 +5178 +5179 +5180 +5181 +5182 +5183 +5184 +5185 +5186 +5187 +5188 +5189 +5190 +5191 +5192 +5193 +5194 +5195 +5196 +5197 +5198 +5199 +5200 +5201 +5202 +5203 +5204 +5205 +5206 +5207 +5208 +5209 +5210 +5211 +5212 +5213 +5214 +5215 +5216 +5217 +5218 +5219 +5220 +5221 +5222 +5223 +5224 +5225 +5226 +5227 +5228 +5229 +5230 +5231 +5232 +5233 +5234 +5235 +5236 +5237 +5238 +5239 +5240 +5241 +5242 +5243 +5244 +5245 +5246 +5247 +5248 +5249 +5250 +5251 +5252 +5253 +5254 +5255 +5256 +5257 +5258 +5259 +5260 +5261 +5262 +5263 +5264 +5265 +5266 +5267 +5268 +5269 +5270 +5271 +5272 +5273 +5274 +5275 +5276 +5277 +5278 +5279 +5280 +5281 +5282 +5283 +5284 +5285 +5286 +5287 +5288 +5289 +5290 +5291 +5292 +5293 +5294 +5295 +5296 +5297 +5298 +5299 +5300 +5301 +5302 +5303 +5304 +5305 +5306 +5307 +5308 +5309 +5310 +5311 +5312 +5313 +5314 +5315 +5316 +5317 +5318 +5319 +5320 +5321 +5322 +5323 +5324 +5325 +5326 +5327 +5328 +5329 +5330 +5331 +5332 +5333 +5334 +5335 +5336 +5337 +5338 +5339 +5340 +5341 +5342 +5343 +5344 +5345 +5346 +5347 +5348 +5349 +5350 +5351 +5352 +5353 +5354 +5355 +5356 +5357 +5358 +5359 +5360 +5361 +5362 +5363 +5364 +5365 +5366 +5367 +5368 +5369 +5370 +5371 +5372 +5373 +5374 +5375 +5376 +5377 +5378 +5379 +5380 +5381 +5382 +5383 +5384 +5385 +5386 +5387 +5388 +5389 +5390 +5391 +5392 +5393 +5394 +5395 +5396 +5397 +5398 +5399 +5400 +5401 +5402 +5403 +5404 +5405 +5406 +5407 +5408 +5409 +5410 +5411 +5412 +5413 +5414 +5415 +5416 +5417 +5418 +5419 +5420 +5421 +5422 +5423 +5424 +5425 +5426 +5427 +5428 +5429 +5430 +5431 +5432 +5433 +5434 +5435 +5436 +5437 +5438 +5439 +5440 +5441 +5442 +5443 +5444 +5445 +5446 +5447 +5448 +5449 +5450 +5451 +5452 +5453 +5454 +5455 +5456 +5457 +5458 +5459 +5460 +5461 +5462 +5463 +5464 +5465 +5466 +5467 +5468 +5469 +5470 +5471 +5472 +5473 +5474 +5475 +5476 +5477 +5478 +5479 +5480 +5481 +5482 +5483 +5484 +5485 +5486 +5487 +5488 +5489 +5490 +5491 +5492 +5493 +5494 +5495 +5496 +5497 +5498 +5499 +5500 +5501 +5502 +5503 +5504 +5505 +5506 +5507 +5508 +5509 +5510 +5511 +5512 +5513 +5514 +5515 +5516 +5517 +5518 +5519 +5520 +5521 +5522 +5523 +5524 +5525 +5526 +5527 +5528 +5529 +5530 +5531 +5532 +5533 +5534 +5535 +5536 +5537 +5538 +5539 +5540 +5541 +5542 +5543 +5544 +5545 +5546 +5547 +5548 +5549 +5550 +5551 +5552 +5553 +5554 +5555 +5556 +5557 +5558 +5559 +5560 +5561 +5562 +5563 +5564 +5565 +5566 +5567 +5568 +5569 +5570 +5571 +5572 +5573 +5574 +5575 +5576 +5577 +5578 +5579 +5580 +5581 +5582 +5583 +5584 +5585 +5586 +5587 +5588 +5589 +5590 +5591 +5592 +5593 +5594 +5595 +5596 +5597 +5598 +5599 +5600 +5601 +5602 +5603 +5604 +5605 +5606 +5607 +5608 +5609 +5610 +5611 +5612 +5613 +5614 +5615 +5616 +5617 +5618 +5619 +5620 +5621 +5622 +5623 +5624 +5625 +5626 +5627 +5628 +5629 +5630 +5631 +5632 +5633 +5634 +5635 +5636 +5637 +5638 +5639 +5640 +5641 +5642 +5643 +5644 +5645 +5646 +5647 +5648 +5649 +5650 +5651 +5652 +5653 +5654 +5655 +5656 +5657 +5658 +5659 +5660 +5661 +5662 +5663 +5664 +5665 +5666 +5667 +5668 +5669 +5670 +5671 +5672 +5673 +5674 +5675 +5676 +5677 +5678 +5679 +5680 +5681 +5682 +5683 +5684 +5685 +5686 +5687 +5688 +5689 +5690 +5691 +5692 +5693 +5694 +5695 +5696 +5697 +5698 +5699 +5700 +5701 +5702 +5703 +5704 +5705 +5706 +5707 +5708 +5709 +5710 +5711 +5712 +5713 +5714 +5715 +5716 +5717 +5718 +5719 +5720 +5721 +5722 +5723 +5724 +5725 +5726 +5727 +5728 +5729 +5730 +5731 +5732 +5733 +5734 +5735 +5736 +5737 +5738 +5739 +5740 +5741 +5742 +5743 +5744 +5745 +5746 +5747 +5748 +5749 +5750 +5751 +5752 +5753 +5754 +5755 +5756 +5757 +5758 +5759 +5760 +5761 +5762 +5763 +5764 +5765 +5766 +5767 +5768 +5769 +5770 +5771 +5772 +5773 +5774 +5775 +5776 +5777 +5778 +5779 +5780 +5781 +5782 +5783 +5784 +5785 +5786 +5787 +5788 +5789 +5790 +5791 +5792 +5793 +5794 +5795 +5796 +5797 +5798 +5799 +5800 +5801 +5802 +5803 +5804 +5805 +5806 +5807 +5808 +5809 +5810 +5811 +5812 +5813 +5814 +5815 +5816 +5817 +5818 +5819 +5820 +5821 +5822 +5823 +5824 +5825 +5826 +5827 +5828 +5829 +5830 +5831 +5832 +5833 +5834 +5835 +5836 +5837 +5838 +5839 +5840 +5841 +5842 +5843 +5844 +5845 +5846 +5847 +5848 +5849 +5850 +5851 +5852 +5853 +5854 +5855 +5856 +5857 +5858 +5859 +5860 +5861 +5862 +5863 +5864 +5865 +5866 +5867 +5868 +5869 +5870 +5871 +5872 +5873 +5874 +5875 +5876 +5877 +5878 +5879 +5880 +5881 +5882 +5883 +5884 +5885 +5886 +5887 +5888 +5889 +5890 +5891 +5892 +5893 +5894 +5895 +5896 +5897 +5898 +5899 +5900 +5901 +5902 +5903 +5904 +5905 +5906 +5907 +5908 +5909 +5910 +5911 +5912 +5913 +5914 +5915 +5916 +5917 +5918 +5919 +5920 +5921 +5922 +5923 +5924 +5925 +5926 +5927 +5928 +5929 +5930 +5931 +5932 +5933 +5934 +5935 +5936 +5937 +5938 +5939 +5940 +5941 +5942 +5943 +5944 +5945 +5946 +5947 +5948 +5949 +5950 +5951 +5952 +5953 +5954 +5955 +5956 +5957 +5958 +5959 +5960 +5961 +5962 +5963 +5964 +5965 +5966 +5967 +5968 +5969 +5970 +5971 +5972 +5973 +5974 +5975 +5976 +5977 +5978 +5979 +5980 +5981 +5982 +5983 +5984 +5985 +5986 +5987 +5988 +5989 +5990 +5991 +5992 +5993 +5994 +5995 +5996 +5997 +5998 +5999 +6000 +6001 +6002 +6003 +6004 +6005 +6006 +6007 +6008 +6009 +6010 +6011 +6012 +6013 +6014 +6015 +6016 +6017 +6018 +6019 +6020 +6021 +6022 +6023 +6024 +6025 +6026 +6027 +6028 +6029 +6030 +6031 +6032 +6033 +6034 +6035 +6036 +6037 +6038 +6039 +6040 +6041 +6042 +6043 +6044 +6045 +6046 +6047 +6048 +6049 +6050 +6051 +6052 +6053 +6054 +6055 +6056 +6057 +6058 +6059 +6060 +6061 +6062 +6063 +6064 +6065 +6066 +6067 +6068 +6069 +6070 +6071 +6072 +6073 +6074 +6075 +6076 +6077 +6078 +6079 +6080 +6081 +6082 +6083 +6084 +6085 +6086 +6087 +6088 +6089 +6090 +6091 +6092 +6093 +6094 +6095 +6096 +6097 +6098 +6099 +6100 +6101 +6102 +6103 +6104 +6105 +6106 +6107 +6108 +6109 +6110 +6111 +6112 +6113 +6114 +6115 +6116 +6117 +6118 +6119 +6120 +6121 +6122 +6123 +6124 +6125 +6126 +6127 +6128 +6129 +6130 +6131 +6132 +6133 +6134 +6135 +6136 +6137 +6138 +6139 +6140 +6141 +6142 +6143 +6144 +6145 +6146 +6147 +6148 +6149 +6150 +6151 +6152 +6153 +6154 +6155 +6156 +6157 +6158 +6159 +6160 +6161 +6162 +6163 +6164 +6165 +6166 +6167 +6168 +6169 +6170 +6171 +6172 +6173 +6174 +6175 +6176 +6177 +6178 +6179 +6180 +6181 +6182 +6183 +6184 +6185 +6186 +6187 +6188 +6189 +6190 +6191 +6192 +6193 +6194 +6195 +6196 +6197 +6198 +6199 +6200 +6201 +6202 +6203 +6204 +6205 +6206 +6207 +6208 +6209 +6210 +6211 +6212 +6213 +6214 +6215 +6216 +6217 +6218 +6219 +6220 +6221 +6222 +6223 +6224 +6225 +6226 +6227 +6228 +6229 +6230 +6231 +6232 +6233 +6234 +6235 +6236 +6237 +6238 +6239 +6240 +6241 +6242 +6243 +6244 +6245 +6246 +6247 +6248 +6249 +6250 +6251 +6252 +6253 +6254 +6255 +6256 +6257 +6258 +6259 +6260 +6261 +6262 +6263 +6264 +6265 +6266 +6267 +6268 +6269 +6270 +6271 +6272 +6273 +6274 +6275 +6276 +6277 +6278 +6279 +6280 +6281 +6282 +6283 +6284 +6285 +6286 +6287 +6288 +6289 +6290 +6291 +6292 +6293 +6294 +6295 +6296 +6297 +6298 +6299 +6300 +6301 +6302 +6303 +6304 +6305 +6306 +6307 +6308 +6309 +6310 +6311 +6312 +6313 +6314 +6315 +6316 +6317 +6318 +6319 +6320 +6321 +6322 +6323 +6324 +6325 +6326 +6327 +6328 +6329 +6330 +6331 +6332 +6333 +6334 +6335 +6336 +6337 +6338 +6339 +6340 +6341 +6342 +6343 +6344 +6345 +6346 +6347 +6348 +6349 +6350 +6351 +6352 +6353 +6354 +6355 +6356 +6357 +6358 +6359 +6360 +6361 +6362 +6363 +6364 +6365 +6366 +6367 +6368 +6369 +6370 +6371 +6372 +6373 +6374 +6375 +6376 +6377 +6378 +6379 +6380 +6381 +6382 +6383 +6384 +6385 +6386 +6387 +6388 +6389 +6390 +6391 +6392 +6393 +6394 +6395 +6396 +6397 +6398 +6399 +6400 +6401 +6402 +6403 +6404 +6405 +6406 +6407 +6408 +6409 +6410 +6411 +6412 +6413 +6414 +6415 +6416 +6417 +6418 +6419 +6420 +6421 +6422 +6423 +6424 +6425 +6426 +6427 +6428 +6429 +6430 +6431 +6432 +6433 +6434 +6435 +6436 +6437 +6438 +6439 +6440 +6441 +6442 +6443 +6444 +6445 +6446 +6447 +6448 +6449 +6450 +6451 +6452 +6453 +6454 +6455 +6456 +6457 +6458 +6459 +6460 +6461 +6462 +6463 +6464 +6465 +6466 +6467 +6468 +6469 +6470 +6471 +6472 +6473 +6474 +6475 +6476 +6477 +6478 +6479 +6480 +6481 +6482 +6483 +6484 +6485 +6486 +6487 +6488 +6489 +6490 +6491 +6492 +6493 +6494 +6495 +6496 +6497 +6498 +6499 +6500 +6501 +6502 +6503 +6504 +6505 +6506 +6507 +6508 +6509 +6510 +6511 +6512 +6513 +6514 +6515 +6516 +6517 +6518 +6519 +6520 +6521 +6522 +6523 +6524 +6525 +6526 +6527 +6528 +6529 +6530 +6531 +6532 +6533 +6534 +6535 +6536 +6537 +6538 +6539 +6540 +6541 +6542 +6543 +6544 +6545 +6546 +6547 +6548 +6549 +6550 +6551 +6552 +6553 +6554 +6555 +6556 +6557 +6558 +6559 +6560 +6561 +6562 +6563 +6564 +6565 +6566 +6567 +6568 +6569 +6570 +6571 +6572 +6573 +6574 +6575 +6576 +6577 +6578 +6579 +6580 +6581 +6582 +6583 +6584 +6585 +6586 +6587 +6588 +6589 +6590 +6591 +6592 +6593 +6594 +6595 +6596 +6597 +6598 +6599 +6600 +6601 +6602 +6603 +6604 +6605 +6606 +6607 +6608 +6609 +6610 +6611 +6612 +6613 +6614 +6615 +6616 +6617 +6618 +6619 +6620 +6621 +6622 +6623 +6624 +6625 +6626 +6627 +6628 +6629 +6630 +6631 +6632 +6633 +6634 +6635 +6636 +6637 +6638 +6639 +6640 +6641 +6642 +6643 +6644 +6645 +6646 +6647 +6648 +6649 +6650 +6651 +6652 +6653 +6654 +6655 +6656 +6657 +6658 +6659 +6660 +6661 +6662 +6663 +6664 +6665 +6666 +6667 +6668 +6669 +6670 +6671 +6672 +6673 +6674 +6675 +6676 +6677 +6678 +6679 +6680 +6681 +6682 +6683 +6684 +6685 +6686 +6687 +6688 +6689 +6690 +6691 +6692 +6693 +6694 +6695 +6696 +6697 +6698 +6699 +6700 +6701 +6702 +6703 +6704 +6705 +6706 +6707 +6708 +6709 +6710 +6711 +6712 +6713 +6714 +6715 +6716 +6717 +6718 +6719 +6720 +6721 +6722 +6723 +6724 +6725 +6726 +6727 +6728 +6729 +6730 +6731 +6732 +6733 +6734 +6735 +6736 +6737 +6738 +6739 +6740 +6741 +6742 +6743 +6744 +6745 +6746 +6747 +6748 +6749 +6750 +6751 +6752 +6753 +6754 +6755 +6756 +6757 +6758 +6759 +6760 +6761 +6762 +6763 +6764 +6765 +6766 +6767 +6768 +6769 +6770 +6771 +6772 +6773 +6774 +6775 +6776 +6777 +6778 +6779 +6780 +6781 +6782 +6783 +6784 +6785 +6786 +6787 +6788 +6789 +6790 +6791 +6792 +6793 +6794 +6795 +6796 +6797 +6798 +6799 +6800 +6801 +6802 +6803 +6804 +6805 +6806 +6807 +6808 +6809 +6810 +6811 +6812 +6813 +6814 +6815 +6816 +6817 +6818 +6819 +6820 +6821 +6822 +6823 +6824 +6825 +6826 +6827 +6828 +6829 +6830 +6831 +6832 +6833 +6834 +6835 +6836 +6837 +6838 +6839 +6840 +6841 +6842 +6843 +6844 +6845 +6846 +6847 +6848 +6849 +6850 +6851 +6852 +6853 +6854 +6855 +6856 +6857 +6858 +6859 +6860 +6861 +6862 +6863 +6864 +6865 +6866 +6867 +6868 +6869 +6870 +6871 +6872 +6873 +6874 +6875 +6876 +6877 +6878 +6879 +6880 +6881 +6882 +6883 +6884 +6885 +6886 +6887 +6888 +6889 +6890 +6891 +6892 +6893 +6894 +6895 +6896 +6897 +6898 +6899 +6900 +6901 +6902 +6903 +6904 +6905 +6906 +6907 +6908 +6909 +6910 +6911 +6912 +6913 +6914 +6915 +6916 +6917 +6918 +6919 +6920 +6921 +6922 +6923 +6924 +6925 +6926 +6927 +6928 +6929 +6930 +69311x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +1x
/* eslint-disable curly */
+import fs from "fs";
+import path from "path";
+import {fileURLToPath} from "url";
+import {initializeABAP} from "./init.mjs";
+import runtime from "@abaplint/runtime";
+ 
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+ 
+async function run() {
+  await initializeABAP();
+  const unit = new runtime.UnitTestResult();
+  let clas;
+  let locl;
+  let meth;
+  try {
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DEPENDENCIES");
+    {
+        const {ltcl_sap_package} = await import("./zcl_abapgit_dependencies.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_sap_package");
+        if (ltcl_sap_package.class_setup) await ltcl_sap_package.class_setup();
+      if (ltcl_sap_package.class_teardown) await ltcl_sap_package.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FILE_STATUS");
+    {
+        const {ltcl_status_helper} = await import("./zcl_abapgit_file_status.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_status_helper");
+        if (ltcl_status_helper.class_setup) await ltcl_status_helper.class_setup();
+      if (ltcl_status_helper.class_teardown) await ltcl_status_helper.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FOLDER_LOGIC");
+    {
+        const {ltcl_folder_logic_helper} = await import("./zcl_abapgit_folder_logic.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_folder_logic_helper");
+        if (ltcl_folder_logic_helper.class_setup) await ltcl_folder_logic_helper.class_setup();
+      if (ltcl_folder_logic_helper.class_teardown) await ltcl_folder_logic_helper.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_HTML_PROCESSOR");
+    {
+        const {ltcl_gui_mock} = await import("./zcl_abapgit_gui_html_processor.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_gui_mock");
+        if (ltcl_gui_mock.class_setup) await ltcl_gui_mock.class_setup();
+      if (ltcl_gui_mock.class_teardown) await ltcl_gui_mock.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_OBJECTS");
+    {
+        const {ltcl_object_ddls_mock} = await import("./zcl_abapgit_objects.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_object_ddls_mock");
+        if (ltcl_object_ddls_mock.class_setup) await ltcl_object_ddls_mock.class_setup();
+      if (ltcl_object_ddls_mock.class_teardown) await ltcl_object_ddls_mock.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AFF_REGISTRY");
+    {
+        const {ltcl_aff_registry} = await import("./zcl_abapgit_aff_registry.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_aff_registry");
+        if (ltcl_aff_registry.class_setup) await ltcl_aff_registry.class_setup();
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->clas_not_supported");
+        meth = locl.addMethod("clas_not_supported");
+        await test.clas_not_supported();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->chkc");
+        meth = locl.addMethod("chkc");
+        await test.chkc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->chko");
+        meth = locl.addMethod("chko");
+        await test.chko();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->chkv");
+        meth = locl.addMethod("chkv");
+        await test.chkv();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->evtb");
+        meth = locl.addMethod("evtb");
+        await test.evtb();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->gsmp");
+        meth = locl.addMethod("gsmp");
+        await test.gsmp();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->intf_not_supported");
+        meth = locl.addMethod("intf_not_supported");
+        await test.intf_not_supported();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->intf_experimental");
+        meth = locl.addMethod("intf_experimental");
+        await test.intf_experimental();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_registry()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AFF_REGISTRY: running ltcl_aff_registry->smbc");
+        meth = locl.addMethod("smbc");
+        await test.smbc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_aff_registry.class_teardown) await ltcl_aff_registry.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_parser_test} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_parser_test");
+        if (ltcl_parser_test.class_setup) await ltcl_parser_test.class_setup();
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse");
+        meth = locl.addMethod("parse");
+        await test.parse();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_keeping_order");
+        meth = locl.addMethod("parse_keeping_order");
+        await test.parse_keeping_order();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_string");
+        meth = locl.addMethod("parse_string");
+        await test.parse_string();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_number");
+        meth = locl.addMethod("parse_number");
+        await test.parse_number();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_float");
+        meth = locl.addMethod("parse_float");
+        await test.parse_float();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_boolean");
+        meth = locl.addMethod("parse_boolean");
+        await test.parse_boolean();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_false");
+        meth = locl.addMethod("parse_false");
+        await test.parse_false();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_null");
+        meth = locl.addMethod("parse_null");
+        await test.parse_null();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_date");
+        meth = locl.addMethod("parse_date");
+        await test.parse_date();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_bare_values");
+        meth = locl.addMethod("parse_bare_values");
+        await test.parse_bare_values();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+  console.log('ZCL_ABAPGIT_AJSON: running ltcl_parser_test->parse_error, skipped');
+  meth = locl.addMethod("parse_error");
+  meth.skip();
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->duplicate_key");
+        meth = locl.addMethod("duplicate_key");
+        await test.duplicate_key();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parser_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_parser_test->non_json");
+        meth = locl.addMethod("non_json");
+        await test.non_json();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_parser_test.class_teardown) await ltcl_parser_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_serializer_test} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_serializer_test");
+        if (ltcl_serializer_test.class_setup) await ltcl_serializer_test.class_setup();
+      {
+        const test = await (new ltcl_serializer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_serializer_test->stringify_condensed");
+        meth = locl.addMethod("stringify_condensed");
+        await test.stringify_condensed();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_serializer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_serializer_test->stringify_indented");
+        meth = locl.addMethod("stringify_indented");
+        await test.stringify_indented();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_serializer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_serializer_test->array_index");
+        meth = locl.addMethod("array_index");
+        await test.array_index();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_serializer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_serializer_test->item_order");
+        meth = locl.addMethod("item_order");
+        await test.item_order();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_serializer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_serializer_test->simple_indented");
+        meth = locl.addMethod("simple_indented");
+        await test.simple_indented();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_serializer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_serializer_test->empty_set");
+        meth = locl.addMethod("empty_set");
+        await test.empty_set();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_serializer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_serializer_test->escape_string");
+        meth = locl.addMethod("escape_string");
+        await test.escape_string();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_serializer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_serializer_test->empty");
+        meth = locl.addMethod("empty");
+        await test.empty();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_serializer_test.class_teardown) await ltcl_serializer_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_utils_test} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_utils_test");
+        if (ltcl_utils_test.class_setup) await ltcl_utils_test.class_setup();
+      {
+        const test = await (new ltcl_utils_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_utils_test->normalize_path");
+        meth = locl.addMethod("normalize_path");
+        await test.normalize_path();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_utils_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_utils_test->split_path");
+        meth = locl.addMethod("split_path");
+        await test.split_path();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_utils_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_utils_test->validate_array_index");
+        meth = locl.addMethod("validate_array_index");
+        await test.validate_array_index();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_utils_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_utils_test->string_to_xstring_utf8");
+        meth = locl.addMethod("string_to_xstring_utf8");
+        await test.string_to_xstring_utf8();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_utils_test.class_teardown) await ltcl_utils_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_reader_test} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_reader_test");
+        if (ltcl_reader_test.class_setup) await ltcl_reader_test.class_setup();
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->get_value");
+        meth = locl.addMethod("get_value");
+        await test.get_value();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->get_node_type");
+        meth = locl.addMethod("get_node_type");
+        await test.get_node_type();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->exists");
+        meth = locl.addMethod("exists");
+        await test.exists();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->value_integer");
+        meth = locl.addMethod("value_integer");
+        await test.value_integer();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->value_number");
+        meth = locl.addMethod("value_number");
+        await test.value_number();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->value_boolean");
+        meth = locl.addMethod("value_boolean");
+        await test.value_boolean();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->value_string");
+        meth = locl.addMethod("value_string");
+        await test.value_string();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->members");
+        meth = locl.addMethod("members");
+        await test.members();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->slice");
+        meth = locl.addMethod("slice");
+        await test.slice();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->array_to_string_table");
+        meth = locl.addMethod("array_to_string_table");
+        await test.array_to_string_table();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->get_date");
+        meth = locl.addMethod("get_date");
+        await test.get_date();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_reader_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_reader_test->get_timestamp");
+        meth = locl.addMethod("get_timestamp");
+        await test.get_timestamp();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_reader_test.class_teardown) await ltcl_reader_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_json_to_abap} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_json_to_abap");
+        if (ltcl_json_to_abap.class_setup) await ltcl_json_to_abap.class_setup();
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_struc");
+        meth = locl.addMethod("to_abap_struc");
+        await test.to_abap_struc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_timestamp_initial");
+        meth = locl.addMethod("to_abap_timestamp_initial");
+        await test.to_abap_timestamp_initial();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_value");
+        meth = locl.addMethod("to_abap_value");
+        await test.to_abap_value();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_array");
+        meth = locl.addMethod("to_abap_array");
+        await test.to_abap_array();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_array_of_arrays_simple");
+        meth = locl.addMethod("to_abap_array_of_arrays_simple");
+        await test.to_abap_array_of_arrays_simple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_array_of_arrays");
+        meth = locl.addMethod("to_abap_array_of_arrays");
+        await test.to_abap_array_of_arrays();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_w_tab_of_struc");
+        meth = locl.addMethod("to_abap_w_tab_of_struc");
+        await test.to_abap_w_tab_of_struc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_w_plain_tab");
+        meth = locl.addMethod("to_abap_w_plain_tab");
+        await test.to_abap_w_plain_tab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_hashed_tab");
+        meth = locl.addMethod("to_abap_hashed_tab");
+        await test.to_abap_hashed_tab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_sorted_tab");
+        meth = locl.addMethod("to_abap_sorted_tab");
+        await test.to_abap_sorted_tab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_hashed_plain_tab");
+        meth = locl.addMethod("to_abap_hashed_plain_tab");
+        await test.to_abap_hashed_plain_tab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_negative");
+        meth = locl.addMethod("to_abap_negative");
+        await test.to_abap_negative();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_corresponding");
+        meth = locl.addMethod("to_abap_corresponding");
+        await test.to_abap_corresponding();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_corresponding_negative");
+        meth = locl.addMethod("to_abap_corresponding_negative");
+        await test.to_abap_corresponding_negative();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_corresponding_public");
+        meth = locl.addMethod("to_abap_corresponding_public");
+        await test.to_abap_corresponding_public();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_to_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_json_to_abap->to_abap_corresponding_pub_neg");
+        meth = locl.addMethod("to_abap_corresponding_pub_neg");
+        await test.to_abap_corresponding_pub_neg();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_json_to_abap.class_teardown) await ltcl_json_to_abap.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_writer_test} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_writer_test");
+        if (ltcl_writer_test.class_setup) await ltcl_writer_test.class_setup();
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_ajson");
+        meth = locl.addMethod("set_ajson");
+        await test.set_ajson();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_value");
+        meth = locl.addMethod("set_value");
+        await test.set_value();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->ignore_empty");
+        meth = locl.addMethod("ignore_empty");
+        await test.ignore_empty();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_obj");
+        meth = locl.addMethod("set_obj");
+        await test.set_obj();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_obj_w_date_time");
+        meth = locl.addMethod("set_obj_w_date_time");
+        await test.set_obj_w_date_time();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_tab");
+        meth = locl.addMethod("set_tab");
+        await test.set_tab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_tab_hashed");
+        meth = locl.addMethod("set_tab_hashed");
+        await test.set_tab_hashed();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_tab_nested_struct");
+        meth = locl.addMethod("set_tab_nested_struct");
+        await test.set_tab_nested_struct();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->prove_path_exists");
+        meth = locl.addMethod("prove_path_exists");
+        await test.prove_path_exists();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->delete_subtree");
+        meth = locl.addMethod("delete_subtree");
+        await test.delete_subtree();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->delete");
+        meth = locl.addMethod("delete");
+        await test.delete();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->arrays");
+        meth = locl.addMethod("arrays");
+        await test.arrays();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->arrays_negative");
+        meth = locl.addMethod("arrays_negative");
+        await test.arrays_negative();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->root_assignment");
+        meth = locl.addMethod("root_assignment");
+        await test.root_assignment();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_bool_abap_bool");
+        meth = locl.addMethod("set_bool_abap_bool");
+        await test.set_bool_abap_bool();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_bool_int");
+        meth = locl.addMethod("set_bool_int");
+        await test.set_bool_int();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_bool_tab");
+        meth = locl.addMethod("set_bool_tab");
+        await test.set_bool_tab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_str");
+        meth = locl.addMethod("set_str");
+        await test.set_str();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_int");
+        meth = locl.addMethod("set_int");
+        await test.set_int();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_date");
+        meth = locl.addMethod("set_date");
+        await test.set_date();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_timestamp");
+        meth = locl.addMethod("set_timestamp");
+        await test.set_timestamp();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->read_only");
+        meth = locl.addMethod("read_only");
+        await test.read_only();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_array_obj");
+        meth = locl.addMethod("set_array_obj");
+        await test.set_array_obj();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->set_with_type");
+        meth = locl.addMethod("set_with_type");
+        await test.set_with_type();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->overwrite_w_keep_order_touch");
+        meth = locl.addMethod("overwrite_w_keep_order_touch");
+        await test.overwrite_w_keep_order_touch();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->overwrite_w_keep_order_set");
+        meth = locl.addMethod("overwrite_w_keep_order_set");
+        await test.overwrite_w_keep_order_set();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->setx");
+        meth = locl.addMethod("setx");
+        await test.setx();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->setx_float");
+        meth = locl.addMethod("setx_float");
+        await test.setx_float();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->setx_complex");
+        meth = locl.addMethod("setx_complex");
+        await test.setx_complex();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_writer_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_writer_test->setx_complex_w_keep_order");
+        meth = locl.addMethod("setx_complex_w_keep_order");
+        await test.setx_complex_w_keep_order();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_writer_test.class_teardown) await ltcl_writer_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_integrated} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_integrated");
+        if (ltcl_integrated.class_setup) await ltcl_integrated.class_setup();
+      {
+        const test = await (new ltcl_integrated()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_integrated->reader");
+        meth = locl.addMethod("reader");
+        await test.reader();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_integrated()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_integrated->array_index");
+        meth = locl.addMethod("array_index");
+        await test.array_index();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_integrated()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_integrated->array_simple");
+        meth = locl.addMethod("array_simple");
+        await test.array_simple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_integrated()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_integrated->stringify");
+        meth = locl.addMethod("stringify");
+        await test.stringify();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_integrated()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_integrated->item_order_integrated");
+        meth = locl.addMethod("item_order_integrated");
+        await test.item_order_integrated();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_integrated()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_integrated->chaining");
+        meth = locl.addMethod("chaining");
+        await test.chaining();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_integrated()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_integrated->push_json");
+        meth = locl.addMethod("push_json");
+        await test.push_json();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_integrated()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_integrated->is_empty");
+        meth = locl.addMethod("is_empty");
+        await test.is_empty();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_integrated.class_teardown) await ltcl_integrated.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_abap_to_json} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_abap_to_json");
+        if (ltcl_abap_to_json.class_setup) await ltcl_abap_to_json.class_setup();
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_ajson");
+        meth = locl.addMethod("set_ajson");
+        await test.set_ajson();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_value_number");
+        meth = locl.addMethod("set_value_number");
+        await test.set_value_number();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_value_string");
+        meth = locl.addMethod("set_value_string");
+        await test.set_value_string();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_value_true");
+        meth = locl.addMethod("set_value_true");
+        await test.set_value_true();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_value_false");
+        meth = locl.addMethod("set_value_false");
+        await test.set_value_false();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_value_xsdboolean");
+        meth = locl.addMethod("set_value_xsdboolean");
+        await test.set_value_xsdboolean();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_value_timestamp");
+        meth = locl.addMethod("set_value_timestamp");
+        await test.set_value_timestamp();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_value_timestamp_initial");
+        meth = locl.addMethod("set_value_timestamp_initial");
+        await test.set_value_timestamp_initial();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_null");
+        meth = locl.addMethod("set_null");
+        await test.set_null();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_obj");
+        meth = locl.addMethod("set_obj");
+        await test.set_obj();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_array");
+        meth = locl.addMethod("set_array");
+        await test.set_array();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->set_complex_obj");
+        meth = locl.addMethod("set_complex_obj");
+        await test.set_complex_obj();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abap_to_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_abap_to_json->prefix");
+        meth = locl.addMethod("prefix");
+        await test.prefix();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_abap_to_json.class_teardown) await ltcl_abap_to_json.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_filter_test} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_filter_test");
+        if (ltcl_filter_test.class_setup) await ltcl_filter_test.class_setup();
+      {
+        const test = await (new ltcl_filter_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_filter_test->simple_test");
+        meth = locl.addMethod("simple_test");
+        await test.simple_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_filter_test->array_test");
+        meth = locl.addMethod("array_test");
+        await test.array_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_filter_test->visit_types");
+        meth = locl.addMethod("visit_types");
+        await test.visit_types();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_filter_test.class_teardown) await ltcl_filter_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_mapper_test} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_mapper_test");
+        if (ltcl_mapper_test.class_setup) await ltcl_mapper_test.class_setup();
+      {
+        const test = await (new ltcl_mapper_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_mapper_test->simple_test");
+        meth = locl.addMethod("simple_test");
+        await test.simple_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_mapper_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_mapper_test->array_test");
+        meth = locl.addMethod("array_test");
+        await test.array_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_mapper_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_mapper_test->duplication_test");
+        meth = locl.addMethod("duplication_test");
+        await test.duplication_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_mapper_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_mapper_test->empty_name_test");
+        meth = locl.addMethod("empty_name_test");
+        await test.empty_name_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_mapper_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_mapper_test->trivial");
+        meth = locl.addMethod("trivial");
+        await test.trivial();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_mapper_test.class_teardown) await ltcl_mapper_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON");
+    {
+        const {ltcl_cloning_test} = await import("./zcl_abapgit_ajson.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_cloning_test");
+        if (ltcl_cloning_test.class_setup) await ltcl_cloning_test.class_setup();
+      {
+        const test = await (new ltcl_cloning_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_cloning_test->clone_test");
+        meth = locl.addMethod("clone_test");
+        await test.clone_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_cloning_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_cloning_test->filter_test");
+        meth = locl.addMethod("filter_test");
+        await test.filter_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_cloning_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_cloning_test->mapper_test");
+        meth = locl.addMethod("mapper_test");
+        await test.mapper_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_cloning_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_cloning_test->mapper_and_filter");
+        meth = locl.addMethod("mapper_and_filter");
+        await test.mapper_and_filter();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_cloning_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON: running ltcl_cloning_test->opts_copying");
+        meth = locl.addMethod("opts_copying");
+        await test.opts_copying();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_cloning_test.class_teardown) await ltcl_cloning_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON_FILTER_LIB");
+    {
+        const {ltcl_filters_test} = await import("./zcl_abapgit_ajson_filter_lib.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_filters_test");
+        if (ltcl_filters_test.class_setup) await ltcl_filters_test.class_setup();
+      {
+        const test = await (new ltcl_filters_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_FILTER_LIB: running ltcl_filters_test->empty_filter_simple");
+        meth = locl.addMethod("empty_filter_simple");
+        await test.empty_filter_simple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filters_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_FILTER_LIB: running ltcl_filters_test->empty_filter_deep");
+        meth = locl.addMethod("empty_filter_deep");
+        await test.empty_filter_deep();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filters_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_FILTER_LIB: running ltcl_filters_test->path_filter");
+        meth = locl.addMethod("path_filter");
+        await test.path_filter();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filters_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_FILTER_LIB: running ltcl_filters_test->path_filter_string");
+        meth = locl.addMethod("path_filter_string");
+        await test.path_filter_string();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filters_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_FILTER_LIB: running ltcl_filters_test->path_filter_w_patterns");
+        meth = locl.addMethod("path_filter_w_patterns");
+        await test.path_filter_w_patterns();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filters_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_FILTER_LIB: running ltcl_filters_test->path_filter_deep");
+        meth = locl.addMethod("path_filter_deep");
+        await test.path_filter_deep();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filters_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_FILTER_LIB: running ltcl_filters_test->and_filter");
+        meth = locl.addMethod("and_filter");
+        await test.and_filter();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_filters_test.class_teardown) await ltcl_filters_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON_MAPPING");
+    {
+        const {ltcl_test_mappers} = await import("./zcl_abapgit_ajson_mapping.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test_mappers");
+        if (ltcl_test_mappers.class_setup) await ltcl_test_mappers.class_setup();
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->from_json_to_json");
+        meth = locl.addMethod("from_json_to_json");
+        await test.from_json_to_json();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->to_abap");
+        meth = locl.addMethod("to_abap");
+        await test.to_abap();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->to_json");
+        meth = locl.addMethod("to_json");
+        await test.to_json();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->to_json_nested_struc");
+        meth = locl.addMethod("to_json_nested_struc");
+        await test.to_json_nested_struc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->to_json_nested_table");
+        meth = locl.addMethod("to_json_nested_table");
+        await test.to_json_nested_table();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->to_json_first_lower");
+        meth = locl.addMethod("to_json_first_lower");
+        await test.to_json_first_lower();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->to_snake");
+        meth = locl.addMethod("to_snake");
+        await test.to_snake();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->to_camel");
+        meth = locl.addMethod("to_camel");
+        await test.to_camel();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->to_camel_1st_upper");
+        meth = locl.addMethod("to_camel_1st_upper");
+        await test.to_camel_1st_upper();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->rename_by_attr");
+        meth = locl.addMethod("rename_by_attr");
+        await test.rename_by_attr();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->rename_by_path");
+        meth = locl.addMethod("rename_by_path");
+        await test.rename_by_path();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->rename_by_pattern");
+        meth = locl.addMethod("rename_by_pattern");
+        await test.rename_by_pattern();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->compound_mapper");
+        meth = locl.addMethod("compound_mapper");
+        await test.compound_mapper();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->test_to_upper");
+        meth = locl.addMethod("test_to_upper");
+        await test.test_to_upper();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_mappers()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_test_mappers->test_to_lower");
+        meth = locl.addMethod("test_to_lower");
+        await test.test_to_lower();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test_mappers.class_teardown) await ltcl_test_mappers.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON_MAPPING");
+    {
+        const {ltcl_fields} = await import("./zcl_abapgit_ajson_mapping.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_fields");
+        if (ltcl_fields.class_setup) await ltcl_fields.class_setup();
+      {
+        const test = await (new ltcl_fields()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_fields->to_json_without_path");
+        meth = locl.addMethod("to_json_without_path");
+        await test.to_json_without_path();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_fields()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_fields->to_json_with_path");
+        meth = locl.addMethod("to_json_with_path");
+        await test.to_json_with_path();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_fields()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_fields->to_abap");
+        meth = locl.addMethod("to_abap");
+        await test.to_abap();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_fields.class_teardown) await ltcl_fields.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON_MAPPING");
+    {
+        const {ltcl_to_lower} = await import("./zcl_abapgit_ajson_mapping.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_to_lower");
+        if (ltcl_to_lower.class_setup) await ltcl_to_lower.class_setup();
+      {
+        const test = await (new ltcl_to_lower()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_to_lower->to_json");
+        meth = locl.addMethod("to_json");
+        await test.to_json();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_to_lower.class_teardown) await ltcl_to_lower.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON_MAPPING");
+    {
+        const {ltcl_to_upper} = await import("./zcl_abapgit_ajson_mapping.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_to_upper");
+        if (ltcl_to_upper.class_setup) await ltcl_to_upper.class_setup();
+      {
+        const test = await (new ltcl_to_upper()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_MAPPING: running ltcl_to_upper->to_json");
+        meth = locl.addMethod("to_json");
+        await test.to_json();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_to_upper.class_teardown) await ltcl_to_upper.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON_UTILITIES");
+    {
+        const {ltcl_parser_test} = await import("./zcl_abapgit_ajson_utilities.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_parser_test");
+        if (ltcl_parser_test.class_setup) await ltcl_parser_test.class_setup();
+      if (ltcl_parser_test.class_teardown) await ltcl_parser_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AJSON_UTILITIES");
+    {
+        const {ltcl_json_utils} = await import("./zcl_abapgit_ajson_utilities.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_json_utils");
+        if (ltcl_json_utils.class_setup) await ltcl_json_utils.class_setup();
+      {
+        const test = await (new ltcl_json_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_UTILITIES: running ltcl_json_utils->json_diff");
+        meth = locl.addMethod("json_diff");
+        await test.json_diff();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_UTILITIES: running ltcl_json_utils->json_diff_types");
+        meth = locl.addMethod("json_diff_types");
+        await test.json_diff_types();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_UTILITIES: running ltcl_json_utils->json_diff_arrays");
+        meth = locl.addMethod("json_diff_arrays");
+        await test.json_diff_arrays();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_UTILITIES: running ltcl_json_utils->json_merge");
+        meth = locl.addMethod("json_merge");
+        await test.json_merge();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_UTILITIES: running ltcl_json_utils->json_sort");
+        meth = locl.addMethod("json_sort");
+        await test.json_sort();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_json_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AJSON_UTILITIES: running ltcl_json_utils->is_equal");
+        meth = locl.addMethod("is_equal");
+        await test.is_equal();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_json_utils.class_teardown) await ltcl_json_utils.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_APACK_READER");
+    {
+        const {ltcl_apack_manifest_reader} = await import("./zcl_abapgit_apack_reader.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_apack_manifest_reader");
+        if (ltcl_apack_manifest_reader.class_setup) await ltcl_apack_manifest_reader.class_setup();
+      {
+        const test = await (new ltcl_apack_manifest_reader()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_APACK_READER: running ltcl_apack_manifest_reader->manifest_descriptor");
+        meth = locl.addMethod("manifest_descriptor");
+        await test.manifest_descriptor();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_apack_manifest_reader.class_teardown) await ltcl_apack_manifest_reader.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_AUTH");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_auth.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_AUTH: running ltcl_test->default_is_allow");
+        meth = locl.addMethod("default_is_allow");
+        await test.default_is_allow();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_CONVERT");
+    {
+        const {ltcl_convert} = await import("./zcl_abapgit_convert.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_convert");
+        if (ltcl_convert.class_setup) await ltcl_convert.class_setup();
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->convert_int");
+        meth = locl.addMethod("convert_int");
+        await test.convert_int();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->split_string");
+        meth = locl.addMethod("split_string");
+        await test.split_string();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->convert_bitbyte");
+        meth = locl.addMethod("convert_bitbyte");
+        await test.convert_bitbyte();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->string_to_xstring_utf8");
+        meth = locl.addMethod("string_to_xstring_utf8");
+        await test.string_to_xstring_utf8();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->string_to_xstring_utf8_bom");
+        meth = locl.addMethod("string_to_xstring_utf8_bom");
+        await test.string_to_xstring_utf8_bom();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->xstring_to_string_utf8");
+        meth = locl.addMethod("xstring_to_string_utf8");
+        await test.xstring_to_string_utf8();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->xstring_to_string_not_utf8");
+        meth = locl.addMethod("xstring_to_string_not_utf8");
+        await test.xstring_to_string_not_utf8();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->base64_to_xstring");
+        meth = locl.addMethod("base64_to_xstring");
+        await test.base64_to_xstring();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->conversion_exit_isola_output");
+        meth = locl.addMethod("conversion_exit_isola_output");
+        await test.conversion_exit_isola_output();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->string_to_tab");
+        meth = locl.addMethod("string_to_tab");
+        await test.string_to_tab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->string_to_xstring");
+        meth = locl.addMethod("string_to_xstring");
+        await test.string_to_xstring();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_convert()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_CONVERT: running ltcl_convert->xstring_to_bintab");
+        meth = locl.addMethod("xstring_to_bintab");
+        await test.xstring_to_bintab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_convert.class_teardown) await ltcl_convert.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DATA_CONFIG");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_data_config.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_CONFIG: running ltcl_test->double_add_config");
+        meth = locl.addMethod("double_add_config");
+        await test.double_add_config();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_CONFIG: running ltcl_test->to_json");
+        meth = locl.addMethod("to_json");
+        await test.to_json();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DATA_DESERIALIZER");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_data_deserializer.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_DESERIALIZER: running ltcl_test->test1");
+        meth = locl.addMethod("test1");
+        await test.test1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_DESERIALIZER: running ltcl_test->preview_database_changes_ins");
+        meth = locl.addMethod("preview_database_changes_ins");
+        await test.preview_database_changes_ins();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_DESERIALIZER: running ltcl_test->preview_database_changes_upd");
+        meth = locl.addMethod("preview_database_changes_upd");
+        await test.preview_database_changes_upd();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_DESERIALIZER: running ltcl_test->preview_database_changes_del");
+        meth = locl.addMethod("preview_database_changes_del");
+        await test.preview_database_changes_del();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DATA_SERIALIZER");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_data_serializer.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_SERIALIZER: running ltcl_test->serialize");
+        meth = locl.addMethod("serialize");
+        await test.serialize();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_SERIALIZER: running ltcl_test->serialize_error_table");
+        meth = locl.addMethod("serialize_error_table");
+        await test.serialize_error_table();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_SERIALIZER: running ltcl_test->serialize_error_field");
+        meth = locl.addMethod("serialize_error_field");
+        await test.serialize_error_field();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DATA_SUPPORTER");
+    {
+        const {ltcl_supporter} = await import("./zcl_abapgit_data_supporter.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_supporter");
+        if (ltcl_supporter.class_setup) await ltcl_supporter.class_setup();
+      {
+        const test = await (new ltcl_supporter()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_SUPPORTER: running ltcl_supporter->is_not_supported");
+        meth = locl.addMethod("is_not_supported");
+        await test.is_not_supported();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_supporter()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_SUPPORTER: running ltcl_supporter->is_supported");
+        meth = locl.addMethod("is_supported");
+        await test.is_supported();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_supporter.class_teardown) await ltcl_supporter.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DATA_UTILS");
+    {
+        const {ltcl_data_utils_test} = await import("./zcl_abapgit_data_utils.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_data_utils_test");
+        if (ltcl_data_utils_test.class_setup) await ltcl_data_utils_test.class_setup();
+      {
+        const test = await (new ltcl_data_utils_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_UTILS: running ltcl_data_utils_test->build_data_filename");
+        meth = locl.addMethod("build_data_filename");
+        await test.build_data_filename();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_data_utils_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_UTILS: running ltcl_data_utils_test->build_config_filename");
+        meth = locl.addMethod("build_config_filename");
+        await test.build_config_filename();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_data_utils_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DATA_UTILS: running ltcl_data_utils_test->build_table_itab");
+        meth = locl.addMethod("build_table_itab");
+        await test.build_table_itab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_data_utils_test.class_teardown) await ltcl_data_utils_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DEPENDENCIES");
+    {
+        const {ltcl_resolve_packages} = await import("./zcl_abapgit_dependencies.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_resolve_packages");
+        if (ltcl_resolve_packages.class_setup) await ltcl_resolve_packages.class_setup();
+      {
+        const test = await (new ltcl_resolve_packages()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DEPENDENCIES: running ltcl_resolve_packages->resolve_single");
+        meth = locl.addMethod("resolve_single");
+        await test.resolve_single();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_resolve_packages.class_teardown) await ltcl_resolve_packages.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DIFF");
+    {
+        const {ltcl_diff} = await import("./zcl_abapgit_diff.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_diff");
+        if (ltcl_diff.class_setup) await ltcl_diff.class_setup();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff01, skipped');
+  meth = locl.addMethod("diff01");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff02, skipped');
+  meth = locl.addMethod("diff02");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff03, skipped');
+  meth = locl.addMethod("diff03");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff04, skipped');
+  meth = locl.addMethod("diff04");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff05, skipped');
+  meth = locl.addMethod("diff05");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff06, skipped');
+  meth = locl.addMethod("diff06");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff07, skipped');
+  meth = locl.addMethod("diff07");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff08, skipped');
+  meth = locl.addMethod("diff08");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff09, skipped');
+  meth = locl.addMethod("diff09");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff10, skipped');
+  meth = locl.addMethod("diff10");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff11, skipped');
+  meth = locl.addMethod("diff11");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff12, skipped');
+  meth = locl.addMethod("diff12");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff13, skipped');
+  meth = locl.addMethod("diff13");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff14, skipped');
+  meth = locl.addMethod("diff14");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff15, skipped');
+  meth = locl.addMethod("diff15");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->diff16, skipped');
+  meth = locl.addMethod("diff16");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_DIFF: running ltcl_diff->map_beacons, skipped');
+  meth = locl.addMethod("map_beacons");
+  meth.skip();
+      if (ltcl_diff.class_teardown) await ltcl_diff.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_DOT_ABAPGIT");
+    {
+        const {ltcl_dot_abapgit} = await import("./zcl_abapgit_dot_abapgit.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_dot_abapgit");
+        if (ltcl_dot_abapgit.class_setup) await ltcl_dot_abapgit.class_setup();
+  console.log('ZCL_ABAPGIT_DOT_ABAPGIT: running ltcl_dot_abapgit->identity, skipped');
+  meth = locl.addMethod("identity");
+  meth.skip();
+      {
+        const test = await (new ltcl_dot_abapgit()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_DOT_ABAPGIT: running ltcl_dot_abapgit->ignore");
+        meth = locl.addMethod("ignore");
+        await test.ignore();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_dot_abapgit.class_teardown) await ltcl_dot_abapgit.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_ENVIRONMENT");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_environment.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ENVIRONMENT: running ltcl_test->is_sap_cloud_platform");
+        meth = locl.addMethod("is_sap_cloud_platform");
+        await test.is_sap_cloud_platform();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ENVIRONMENT: running ltcl_test->is_merged");
+        meth = locl.addMethod("is_merged");
+        await test.is_merged();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+  console.log('ZCL_ABAPGIT_ENVIRONMENT: running ltcl_test->is_repo_object_changes_allowed, skipped');
+  meth = locl.addMethod("is_repo_object_changes_allowed");
+  meth.skip();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ENVIRONMENT: running ltcl_test->compare_with_inactive");
+        meth = locl.addMethod("compare_with_inactive");
+        await test.compare_with_inactive();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ENVIRONMENT: running ltcl_test->is_restart_required");
+        meth = locl.addMethod("is_restart_required");
+        await test.is_restart_required();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FILENAME_LOGIC");
+    {
+        const {ltcl_run_checks} = await import("./zcl_abapgit_filename_logic.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_run_checks");
+        if (ltcl_run_checks.class_setup) await ltcl_run_checks.class_setup();
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILENAME_LOGIC: running ltcl_run_checks->is_obj_def_file");
+        meth = locl.addMethod("is_obj_def_file");
+        await test.is_obj_def_file();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILENAME_LOGIC: running ltcl_run_checks->dot_abapgit");
+        meth = locl.addMethod("dot_abapgit");
+        await test.dot_abapgit();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILENAME_LOGIC: running ltcl_run_checks->file_to_object");
+        meth = locl.addMethod("file_to_object");
+        await test.file_to_object();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILENAME_LOGIC: running ltcl_run_checks->object_to_file");
+        meth = locl.addMethod("object_to_file");
+        await test.object_to_file();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILENAME_LOGIC: running ltcl_run_checks->file_to_object_package");
+        meth = locl.addMethod("file_to_object_package");
+        await test.file_to_object_package();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILENAME_LOGIC: running ltcl_run_checks->object_to_file_package");
+        meth = locl.addMethod("object_to_file_package");
+        await test.object_to_file_package();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_run_checks.class_teardown) await ltcl_run_checks.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FILE_DESERIALIZE");
+    {
+        const {ltcl_filter_files_to_deser} = await import("./zcl_abapgit_file_deserialize.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_filter_files_to_deser");
+        if (ltcl_filter_files_to_deser.class_setup) await ltcl_filter_files_to_deser.class_setup();
+      {
+        const test = await (new ltcl_filter_files_to_deser()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_filter_files_to_deser->filter_duplicates");
+        meth = locl.addMethod("filter_duplicates");
+        await test.filter_duplicates();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_files_to_deser()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_filter_files_to_deser->filter_duplicates_rstate");
+        meth = locl.addMethod("filter_duplicates_rstate");
+        await test.filter_duplicates_rstate();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_files_to_deser()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_filter_files_to_deser->filter_duplicates_lstate");
+        meth = locl.addMethod("filter_duplicates_lstate");
+        await test.filter_duplicates_lstate();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_files_to_deser()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_filter_files_to_deser->filter_duplicates_match");
+        meth = locl.addMethod("filter_duplicates_match");
+        await test.filter_duplicates_match();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_files_to_deser()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_filter_files_to_deser->filter_duplicates_init_objtype");
+        meth = locl.addMethod("filter_duplicates_init_objtype");
+        await test.filter_duplicates_init_objtype();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_files_to_deser()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_filter_files_to_deser->filter_duplicates_changes_01");
+        meth = locl.addMethod("filter_duplicates_changes_01");
+        await test.filter_duplicates_changes_01();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_files_to_deser()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_filter_files_to_deser->filter_duplicates_changes_02");
+        meth = locl.addMethod("filter_duplicates_changes_02");
+        await test.filter_duplicates_changes_02();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_filter_files_to_deser()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_filter_files_to_deser->filter_duplicates_deleted");
+        meth = locl.addMethod("filter_duplicates_deleted");
+        await test.filter_duplicates_deleted();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_filter_files_to_deser.class_teardown) await ltcl_filter_files_to_deser.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FILE_DESERIALIZE");
+    {
+        const {ltcl_prio_deserialization} = await import("./zcl_abapgit_file_deserialize.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_prio_deserialization");
+        if (ltcl_prio_deserialization.class_setup) await ltcl_prio_deserialization.class_setup();
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->ddls_before_dcls");
+        meth = locl.addMethod("ddls_before_dcls");
+        await test.ddls_before_dcls();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->webi_before_sprx");
+        meth = locl.addMethod("webi_before_sprx");
+        await test.webi_before_sprx();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->iasp_before_iarp");
+        meth = locl.addMethod("iasp_before_iarp");
+        await test.iasp_before_iarp();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->iarp_before_iatu");
+        meth = locl.addMethod("iarp_before_iatu");
+        await test.iarp_before_iatu();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->prog_before_iaxu");
+        meth = locl.addMethod("prog_before_iaxu");
+        await test.prog_before_iaxu();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->iobj_before_odso");
+        meth = locl.addMethod("iobj_before_odso");
+        await test.iobj_before_odso();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->tobj_before_scp1");
+        meth = locl.addMethod("tobj_before_scp1");
+        await test.tobj_before_scp1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->otgr_before_char");
+        meth = locl.addMethod("otgr_before_char");
+        await test.otgr_before_char();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->sprx_before_clas");
+        meth = locl.addMethod("sprx_before_clas");
+        await test.sprx_before_clas();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->sprx_before_intf");
+        meth = locl.addMethod("sprx_before_intf");
+        await test.sprx_before_intf();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->sprx_before_tabl");
+        meth = locl.addMethod("sprx_before_tabl");
+        await test.sprx_before_tabl();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->pinf_before_devc");
+        meth = locl.addMethod("pinf_before_devc");
+        await test.pinf_before_devc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->clas_before_pinf");
+        meth = locl.addMethod("clas_before_pinf");
+        await test.clas_before_pinf();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->enhs_before_ensc");
+        meth = locl.addMethod("enhs_before_ensc");
+        await test.enhs_before_ensc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->ensc_before_enho");
+        meth = locl.addMethod("ensc_before_enho");
+        await test.ensc_before_enho();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->enho_before_enhc");
+        meth = locl.addMethod("enho_before_enhc");
+        await test.enho_before_enhc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->xslt_before_clas");
+        meth = locl.addMethod("xslt_before_clas");
+        await test.xslt_before_clas();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_prio_deserialization()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_DESERIALIZE: running ltcl_prio_deserialization->xslt_before_prog");
+        meth = locl.addMethod("xslt_before_prog");
+        await test.xslt_before_prog();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_prio_deserialization.class_teardown) await ltcl_prio_deserialization.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FILE_STATUS");
+    {
+        const {ltcl_util} = await import("./zcl_abapgit_file_status.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_util");
+        if (ltcl_util.class_setup) await ltcl_util.class_setup();
+      if (ltcl_util.class_teardown) await ltcl_util.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FILE_STATUS");
+    {
+        const {ltcl_run_checks} = await import("./zcl_abapgit_file_status.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_run_checks");
+        if (ltcl_run_checks.class_setup) await ltcl_run_checks.class_setup();
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->positive");
+        meth = locl.addMethod("positive");
+        await test.positive();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->neg_diff_path_for_same_obj");
+        meth = locl.addMethod("neg_diff_path_for_same_obj");
+        await test.neg_diff_path_for_same_obj();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->neg_incorrect_path_vs_pack");
+        meth = locl.addMethod("neg_incorrect_path_vs_pack");
+        await test.neg_incorrect_path_vs_pack();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->neg_similar_filenames");
+        meth = locl.addMethod("neg_similar_filenames");
+        await test.neg_similar_filenames();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->neg_empty_filenames");
+        meth = locl.addMethod("neg_empty_filenames");
+        await test.neg_empty_filenames();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->package_move");
+        meth = locl.addMethod("package_move");
+        await test.package_move();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->check_namespace");
+        meth = locl.addMethod("check_namespace");
+        await test.check_namespace();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->check_namespace_aff");
+        meth = locl.addMethod("check_namespace_aff");
+        await test.check_namespace_aff();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_run_checks()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_run_checks->check_sub_package");
+        meth = locl.addMethod("check_sub_package");
+        await test.check_sub_package();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_run_checks.class_teardown) await ltcl_run_checks.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FILE_STATUS");
+    {
+        const {ltcl_calculate_status} = await import("./zcl_abapgit_file_status.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_calculate_status");
+        if (ltcl_calculate_status.class_setup) await ltcl_calculate_status.class_setup();
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->only_remote");
+        meth = locl.addMethod("only_remote");
+        await test.only_remote();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+  console.log('ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->deleted_remote, skipped');
+  meth = locl.addMethod("deleted_remote");
+  meth.skip();
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->only_local");
+        meth = locl.addMethod("only_local");
+        await test.only_local();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->match_file");
+        meth = locl.addMethod("match_file");
+        await test.match_file();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->diff");
+        meth = locl.addMethod("diff");
+        await test.diff();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->moved");
+        meth = locl.addMethod("moved");
+        await test.moved();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->inactive");
+        meth = locl.addMethod("inactive");
+        await test.inactive();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->local_outside_main");
+        meth = locl.addMethod("local_outside_main");
+        await test.local_outside_main();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+  console.log('ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->complete, skipped');
+  meth = locl.addMethod("complete");
+  meth.skip();
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->only_local2");
+        meth = locl.addMethod("only_local2");
+        await test.only_local2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->only_remote2");
+        meth = locl.addMethod("only_remote2");
+        await test.only_remote2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_status()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FILE_STATUS: running ltcl_calculate_status->only_remote3");
+        meth = locl.addMethod("only_remote3");
+        await test.only_remote3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_calculate_status.class_teardown) await ltcl_calculate_status.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FOLDER_LOGIC");
+    {
+        const {ltcl_folder_logic} = await import("./zcl_abapgit_folder_logic.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_folder_logic");
+        if (ltcl_folder_logic.class_setup) await ltcl_folder_logic.class_setup();
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->prefix1");
+        meth = locl.addMethod("prefix1");
+        await test.prefix1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->prefix2");
+        meth = locl.addMethod("prefix2");
+        await test.prefix2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->prefix3");
+        meth = locl.addMethod("prefix3");
+        await test.prefix3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->prefix_error1");
+        meth = locl.addMethod("prefix_error1");
+        await test.prefix_error1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->mixed1");
+        meth = locl.addMethod("mixed1");
+        await test.mixed1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->mixed2");
+        meth = locl.addMethod("mixed2");
+        await test.mixed2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->mixed3");
+        meth = locl.addMethod("mixed3");
+        await test.mixed3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->mixed_error1");
+        meth = locl.addMethod("mixed_error1");
+        await test.mixed_error1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->full1");
+        meth = locl.addMethod("full1");
+        await test.full1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->full2");
+        meth = locl.addMethod("full2");
+        await test.full2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic->full3");
+        meth = locl.addMethod("full3");
+        await test.full3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_folder_logic.class_teardown) await ltcl_folder_logic.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FOLDER_LOGIC");
+    {
+        const {ltcl_folder_logic_namespaces} = await import("./zcl_abapgit_folder_logic.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_folder_logic_namespaces");
+        if (ltcl_folder_logic_namespaces.class_setup) await ltcl_folder_logic_namespaces.class_setup();
+      {
+        const test = await (new ltcl_folder_logic_namespaces()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_namespaces->prefix1");
+        meth = locl.addMethod("prefix1");
+        await test.prefix1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic_namespaces()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_namespaces->prefix2");
+        meth = locl.addMethod("prefix2");
+        await test.prefix2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic_namespaces()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_namespaces->mixed1");
+        meth = locl.addMethod("mixed1");
+        await test.mixed1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic_namespaces()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_namespaces->mixed2");
+        meth = locl.addMethod("mixed2");
+        await test.mixed2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic_namespaces()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_namespaces->full1");
+        meth = locl.addMethod("full1");
+        await test.full1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic_namespaces()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_namespaces->full2");
+        meth = locl.addMethod("full2");
+        await test.full2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_folder_logic_namespaces.class_teardown) await ltcl_folder_logic_namespaces.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_FOLDER_LOGIC");
+    {
+        const {ltcl_folder_logic_no_parent} = await import("./zcl_abapgit_folder_logic.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_folder_logic_no_parent");
+        if (ltcl_folder_logic_no_parent.class_setup) await ltcl_folder_logic_no_parent.class_setup();
+      {
+        const test = await (new ltcl_folder_logic_no_parent()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_no_parent->prefix");
+        meth = locl.addMethod("prefix");
+        await test.prefix();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic_no_parent()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_no_parent->mixed");
+        meth = locl.addMethod("mixed");
+        await test.mixed();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_folder_logic_no_parent()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_FOLDER_LOGIC: running ltcl_folder_logic_no_parent->full");
+        meth = locl.addMethod("full");
+        await test.full();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_folder_logic_no_parent.class_teardown) await ltcl_folder_logic_no_parent.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_ADD_PATCH");
+    {
+        const {ltcl_calculate_patch} = await import("./zcl_abapgit_git_add_patch.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_calculate_patch");
+        if (ltcl_calculate_patch.class_setup) await ltcl_calculate_patch.class_setup();
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->single_insert");
+        meth = locl.addMethod("single_insert");
+        await test.single_insert();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_adjacent_insert");
+        meth = locl.addMethod("multiple_adjacent_insert");
+        await test.multiple_adjacent_insert();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_non_adjacent_insert");
+        meth = locl.addMethod("multiple_non_adjacent_insert");
+        await test.multiple_non_adjacent_insert();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_partial_insert");
+        meth = locl.addMethod("multiple_partial_insert");
+        await test.multiple_partial_insert();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->single_delete");
+        meth = locl.addMethod("single_delete");
+        await test.single_delete();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_adjacend_delete");
+        meth = locl.addMethod("multiple_adjacend_delete");
+        await test.multiple_adjacend_delete();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_non_adjacent_delete");
+        meth = locl.addMethod("multiple_non_adjacent_delete");
+        await test.multiple_non_adjacent_delete();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_partial_delete");
+        meth = locl.addMethod("multiple_partial_delete");
+        await test.multiple_partial_delete();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->single_update");
+        meth = locl.addMethod("single_update");
+        await test.single_update();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_adjacend_update");
+        meth = locl.addMethod("multiple_adjacend_update");
+        await test.multiple_adjacend_update();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_non_adjacent_update");
+        meth = locl.addMethod("multiple_non_adjacent_update");
+        await test.multiple_non_adjacent_update();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->multiple_partial_update");
+        meth = locl.addMethod("multiple_partial_update");
+        await test.multiple_partial_update();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->mixed");
+        meth = locl.addMethod("mixed");
+        await test.mixed();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->no_diff");
+        meth = locl.addMethod("no_diff");
+        await test.no_diff();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_calculate_patch()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_ADD_PATCH: running ltcl_calculate_patch->unknown_result_type");
+        meth = locl.addMethod("unknown_result_type");
+        await test.unknown_result_type();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_calculate_patch.class_teardown) await ltcl_calculate_patch.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_BRANCH_LIST");
+    {
+        const {ltcl_parse} = await import("./zcl_abapgit_git_branch_list.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_parse");
+        if (ltcl_parse.class_setup) await ltcl_parse.class_setup();
+      {
+        const test = await (new ltcl_parse()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_BRANCH_LIST: running ltcl_parse->parse_ok_without_first_lf");
+        meth = locl.addMethod("parse_ok_without_first_lf");
+        await test.parse_ok_without_first_lf();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parse()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_BRANCH_LIST: running ltcl_parse->parse_works");
+        meth = locl.addMethod("parse_works");
+        await test.parse_works();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parse()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_BRANCH_LIST: running ltcl_parse->captcha_response_is_caught");
+        meth = locl.addMethod("captcha_response_is_caught");
+        await test.captcha_response_is_caught();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parse()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_BRANCH_LIST: running ltcl_parse->parse_raw");
+        meth = locl.addMethod("parse_raw");
+        await test.parse_raw();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_parse()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_BRANCH_LIST: running ltcl_parse->use_refs_if_head_is_missing");
+        meth = locl.addMethod("use_refs_if_head_is_missing");
+        await test.use_refs_if_head_is_missing();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_parse.class_teardown) await ltcl_parse.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_COMMIT");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_git_commit.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_test->parse_commits");
+        meth = locl.addMethod("parse_commits");
+        await test.parse_commits();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_test->check_author_regex");
+        meth = locl.addMethod("check_author_regex");
+        await test.check_author_regex();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_COMMIT");
+    {
+        const {ltc_parent_handling} = await import("./zcl_abapgit_git_commit.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltc_parent_handling");
+        if (ltc_parent_handling.class_setup) await ltc_parent_handling.class_setup();
+      {
+        const test = await (new ltc_parent_handling()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltc_parent_handling->blank_not_missing");
+        meth = locl.addMethod("blank_not_missing");
+        await test.blank_not_missing();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltc_parent_handling()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltc_parent_handling->parent_is_missing");
+        meth = locl.addMethod("parent_is_missing");
+        await test.parent_is_missing();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltc_parent_handling()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltc_parent_handling->parent_is_found");
+        meth = locl.addMethod("parent_is_found");
+        await test.parent_is_found();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltc_parent_handling()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltc_parent_handling->missing_parent1_cleared");
+        meth = locl.addMethod("missing_parent1_cleared");
+        await test.missing_parent1_cleared();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltc_parent_handling()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltc_parent_handling->missing_parent2_cleared");
+        meth = locl.addMethod("missing_parent2_cleared");
+        await test.missing_parent2_cleared();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltc_parent_handling()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltc_parent_handling->matched_parent1_remains");
+        meth = locl.addMethod("matched_parent1_remains");
+        await test.matched_parent1_remains();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltc_parent_handling.class_teardown) await ltc_parent_handling.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_COMMIT");
+    {
+        const {ltcl_extract_author_data} = await import("./zcl_abapgit_git_commit.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_extract_author_data");
+        if (ltcl_extract_author_data.class_setup) await ltcl_extract_author_data.class_setup();
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data1");
+        meth = locl.addMethod("extract_author_data1");
+        await test.extract_author_data1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data2");
+        meth = locl.addMethod("extract_author_data2");
+        await test.extract_author_data2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data3");
+        meth = locl.addMethod("extract_author_data3");
+        await test.extract_author_data3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data4");
+        meth = locl.addMethod("extract_author_data4");
+        await test.extract_author_data4();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data5");
+        meth = locl.addMethod("extract_author_data5");
+        await test.extract_author_data5();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data6");
+        meth = locl.addMethod("extract_author_data6");
+        await test.extract_author_data6();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data7");
+        meth = locl.addMethod("extract_author_data7");
+        await test.extract_author_data7();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data8");
+        meth = locl.addMethod("extract_author_data8");
+        await test.extract_author_data8();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_extract_author_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_COMMIT: running ltcl_extract_author_data->extract_author_data9");
+        meth = locl.addMethod("extract_author_data9");
+        await test.extract_author_data9();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_extract_author_data.class_teardown) await ltcl_extract_author_data.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_PACK");
+    {
+        const {ltcl_tree} = await import("./zcl_abapgit_git_pack.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_tree");
+        if (ltcl_tree.class_setup) await ltcl_tree.class_setup();
+      {
+        const test = await (new ltcl_tree()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_tree->test01");
+        meth = locl.addMethod("test01");
+        await test.test01();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_tree()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_tree->test02");
+        meth = locl.addMethod("test02");
+        await test.test02();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_tree()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_tree->test03");
+        meth = locl.addMethod("test03");
+        await test.test03();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_tree.class_teardown) await ltcl_tree.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_PACK");
+    {
+        const {ltcl_type_and_length} = await import("./zcl_abapgit_git_pack.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_type_and_length");
+        if (ltcl_type_and_length.class_setup) await ltcl_type_and_length.class_setup();
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_0");
+        meth = locl.addMethod("type_and_length_0");
+        await test.type_and_length_0();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_1");
+        meth = locl.addMethod("type_and_length_1");
+        await test.type_and_length_1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_10");
+        meth = locl.addMethod("type_and_length_10");
+        await test.type_and_length_10();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_15");
+        meth = locl.addMethod("type_and_length_15");
+        await test.type_and_length_15();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_16");
+        meth = locl.addMethod("type_and_length_16");
+        await test.type_and_length_16();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_17");
+        meth = locl.addMethod("type_and_length_17");
+        await test.type_and_length_17();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_100");
+        meth = locl.addMethod("type_and_length_100");
+        await test.type_and_length_100();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_128");
+        meth = locl.addMethod("type_and_length_128");
+        await test.type_and_length_128();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_2047");
+        meth = locl.addMethod("type_and_length_2047");
+        await test.type_and_length_2047();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_2048");
+        meth = locl.addMethod("type_and_length_2048");
+        await test.type_and_length_2048();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_90000");
+        meth = locl.addMethod("type_and_length_90000");
+        await test.type_and_length_90000();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_type_and_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_type_and_length->type_and_length_1000000");
+        meth = locl.addMethod("type_and_length_1000000");
+        await test.type_and_length_1000000();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_type_and_length.class_teardown) await ltcl_type_and_length.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_PACK");
+    {
+        const {ltcl_pack} = await import("./zcl_abapgit_git_pack.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_pack");
+        if (ltcl_pack.class_setup) await ltcl_pack.class_setup();
+      {
+        const test = await (new ltcl_pack()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_pack->commit");
+        meth = locl.addMethod("commit");
+        await test.commit();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_pack()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_pack->commit_newline");
+        meth = locl.addMethod("commit_newline");
+        await test.commit_newline();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_pack()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_pack->signed_commit");
+        meth = locl.addMethod("signed_commit");
+        await test.signed_commit();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_pack()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_pack->pack_short");
+        meth = locl.addMethod("pack_short");
+        await test.pack_short();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_pack()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_pack->pack_long");
+        meth = locl.addMethod("pack_long");
+        await test.pack_long();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_pack()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_pack->pack_multiple");
+        meth = locl.addMethod("pack_multiple");
+        await test.pack_multiple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_pack()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_pack->sort_tree1");
+        meth = locl.addMethod("sort_tree1");
+        await test.sort_tree1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_pack()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_pack->sort_tree2");
+        meth = locl.addMethod("sort_tree2");
+        await test.sort_tree2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_pack.class_teardown) await ltcl_pack.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_PACK");
+    {
+        const {ltcl_git_pack_decode_commit} = await import("./zcl_abapgit_git_pack.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_git_pack_decode_commit");
+        if (ltcl_git_pack_decode_commit.class_setup) await ltcl_git_pack_decode_commit.class_setup();
+      {
+        const test = await (new ltcl_git_pack_decode_commit()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_git_pack_decode_commit->decode1");
+        meth = locl.addMethod("decode1");
+        await test.decode1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_pack_decode_commit()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_git_pack_decode_commit->decode2");
+        meth = locl.addMethod("decode2");
+        await test.decode2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_pack_decode_commit()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_git_pack_decode_commit->decode3");
+        meth = locl.addMethod("decode3");
+        await test.decode3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_git_pack_decode_commit.class_teardown) await ltcl_git_pack_decode_commit.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_PACK");
+    {
+        const {ltcl_tag} = await import("./zcl_abapgit_git_pack.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_tag");
+        if (ltcl_tag.class_setup) await ltcl_tag.class_setup();
+      {
+        const test = await (new ltcl_tag()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_tag->decode_tag");
+        meth = locl.addMethod("decode_tag");
+        await test.decode_tag();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_tag.class_teardown) await ltcl_tag.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_PACK");
+    {
+        const {ltcl_get_length} = await import("./zcl_abapgit_git_pack.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_get_length");
+        if (ltcl_get_length.class_setup) await ltcl_get_length.class_setup();
+      {
+        const test = await (new ltcl_get_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_get_length->length_0");
+        meth = locl.addMethod("length_0");
+        await test.length_0();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_get_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_get_length->length_1");
+        meth = locl.addMethod("length_1");
+        await test.length_1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_get_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_get_length->length_15");
+        meth = locl.addMethod("length_15");
+        await test.length_15();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_get_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_get_length->length_31");
+        meth = locl.addMethod("length_31");
+        await test.length_31();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_get_length()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PACK: running ltcl_get_length->length_22783");
+        meth = locl.addMethod("length_22783");
+        await test.length_22783();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_get_length.class_teardown) await ltcl_get_length.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_PORCELAIN");
+    {
+        const {ltcl_git_porcelain} = await import("./zcl_abapgit_git_porcelain.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_git_porcelain");
+        if (ltcl_git_porcelain.class_setup) await ltcl_git_porcelain.class_setup();
+      {
+        const test = await (new ltcl_git_porcelain()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PORCELAIN: running ltcl_git_porcelain->single_file");
+        meth = locl.addMethod("single_file");
+        await test.single_file();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_porcelain()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PORCELAIN: running ltcl_git_porcelain->two_files_same_path");
+        meth = locl.addMethod("two_files_same_path");
+        await test.two_files_same_path();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_porcelain()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PORCELAIN: running ltcl_git_porcelain->root_empty");
+        meth = locl.addMethod("root_empty");
+        await test.root_empty();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_porcelain()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PORCELAIN: running ltcl_git_porcelain->namespaces");
+        meth = locl.addMethod("namespaces");
+        await test.namespaces();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_porcelain()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PORCELAIN: running ltcl_git_porcelain->more_sub");
+        meth = locl.addMethod("more_sub");
+        await test.more_sub();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_porcelain()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_PORCELAIN: running ltcl_git_porcelain->sub");
+        meth = locl.addMethod("sub");
+        await test.sub();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_git_porcelain.class_teardown) await ltcl_git_porcelain.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_TIME");
+    {
+        const {ltcl_time_test} = await import("./zcl_abapgit_git_time.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_time_test");
+        if (ltcl_time_test.class_setup) await ltcl_time_test.class_setup();
+      {
+        const test = await (new ltcl_time_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_TIME: running ltcl_time_test->get_unix");
+        meth = locl.addMethod("get_unix");
+        await test.get_unix();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_time_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_TIME: running ltcl_time_test->get_utc");
+        meth = locl.addMethod("get_utc");
+        await test.get_utc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_time_test.class_teardown) await ltcl_time_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_TRANSPORT");
+    {
+        const {ltcl_git_transport} = await import("./zcl_abapgit_git_transport.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_git_transport");
+        if (ltcl_git_transport.class_setup) await ltcl_git_transport.class_setup();
+      {
+        const test = await (new ltcl_git_transport()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_TRANSPORT: running ltcl_git_transport->all_ok");
+        meth = locl.addMethod("all_ok");
+        await test.all_ok();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_transport()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_TRANSPORT: running ltcl_git_transport->unpack_error");
+        meth = locl.addMethod("unpack_error");
+        await test.unpack_error();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_transport()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_TRANSPORT: running ltcl_git_transport->command_error");
+        meth = locl.addMethod("command_error");
+        await test.command_error();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_transport()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_TRANSPORT: running ltcl_git_transport->flush_error");
+        meth = locl.addMethod("flush_error");
+        await test.flush_error();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_transport()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_TRANSPORT: running ltcl_git_transport->parse");
+        meth = locl.addMethod("parse");
+        await test.parse();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_transport()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_TRANSPORT: running ltcl_git_transport->gitlab_flush_all_ok");
+        meth = locl.addMethod("gitlab_flush_all_ok");
+        await test.gitlab_flush_all_ok();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_git_transport.class_teardown) await ltcl_git_transport.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_URL");
+    {
+        const {ltcl_repo_online} = await import("./zcl_abapgit_git_url.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_repo_online");
+        if (ltcl_repo_online.class_setup) await ltcl_repo_online.class_setup();
+      {
+        const test = await (new ltcl_repo_online()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_URL: running ltcl_repo_online->test_repo_commit_show_urls");
+        meth = locl.addMethod("test_repo_commit_show_urls");
+        await test.test_repo_commit_show_urls();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_repo_online.class_teardown) await ltcl_repo_online.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GIT_UTILS");
+    {
+        const {ltcl_git_utils} = await import("./zcl_abapgit_git_utils.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_git_utils");
+        if (ltcl_git_utils.class_setup) await ltcl_git_utils.class_setup();
+      {
+        const test = await (new ltcl_git_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_UTILS: running ltcl_git_utils->get_null");
+        meth = locl.addMethod("get_null");
+        await test.get_null();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_UTILS: running ltcl_git_utils->pkt_string");
+        meth = locl.addMethod("pkt_string");
+        await test.pkt_string();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_git_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GIT_UTILS: running ltcl_git_utils->length_utf8_hex");
+        meth = locl.addMethod("length_utf8_hex");
+        await test.length_utf8_hex();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_git_utils.class_teardown) await ltcl_git_utils.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_ASSET_MANAGER");
+    {
+        const {ltcl_abapgit_gui_asset_manager} = await import("./zcl_abapgit_gui_asset_manager.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_abapgit_gui_asset_manager");
+        if (ltcl_abapgit_gui_asset_manager.class_setup) await ltcl_abapgit_gui_asset_manager.class_setup();
+      {
+        const test = await (new ltcl_abapgit_gui_asset_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_ASSET_MANAGER: running ltcl_abapgit_gui_asset_manager->get_inline_asset");
+        meth = locl.addMethod("get_inline_asset");
+        await test.get_inline_asset();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_gui_asset_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_ASSET_MANAGER: running ltcl_abapgit_gui_asset_manager->get_text_asset");
+        meth = locl.addMethod("get_text_asset");
+        await test.get_text_asset();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_gui_asset_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_ASSET_MANAGER: running ltcl_abapgit_gui_asset_manager->get_mime_asset");
+        meth = locl.addMethod("get_mime_asset");
+        await test.get_mime_asset();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_gui_asset_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_ASSET_MANAGER: running ltcl_abapgit_gui_asset_manager->get_base64_asset");
+        meth = locl.addMethod("get_base64_asset");
+        await test.get_base64_asset();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_gui_asset_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_ASSET_MANAGER: running ltcl_abapgit_gui_asset_manager->get_all");
+        meth = locl.addMethod("get_all");
+        await test.get_all();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_gui_asset_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_ASSET_MANAGER: running ltcl_abapgit_gui_asset_manager->register_and_overwrite");
+        meth = locl.addMethod("register_and_overwrite");
+        await test.register_and_overwrite();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_abapgit_gui_asset_manager.class_teardown) await ltcl_abapgit_gui_asset_manager.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_CHUNK_LIB");
+    {
+        const {ltcl_normalize_program_name} = await import("./zcl_abapgit_gui_chunk_lib.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_normalize_program_name");
+        if (ltcl_normalize_program_name.class_setup) await ltcl_normalize_program_name.class_setup();
+      {
+        const test = await (new ltcl_normalize_program_name()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CHUNK_LIB: running ltcl_normalize_program_name->class_");
+        meth = locl.addMethod("class_");
+        await test.class_();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_normalize_program_name()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CHUNK_LIB: running ltcl_normalize_program_name->program");
+        meth = locl.addMethod("program");
+        await test.program();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_normalize_program_name.class_teardown) await ltcl_normalize_program_name.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_CSS_PROCESSOR");
+    {
+        const {ltcl_single_file} = await import("./zcl_abapgit_gui_css_processor.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_single_file");
+        if (ltcl_single_file.class_setup) await ltcl_single_file.class_setup();
+      {
+        const test = await (new ltcl_single_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_single_file->test_file_exists");
+        meth = locl.addMethod("test_file_exists");
+        await test.test_file_exists();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_single_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_single_file->test_file_does_not_exist");
+        meth = locl.addMethod("test_file_does_not_exist");
+        await test.test_file_does_not_exist();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_single_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_single_file->test_empty_file");
+        meth = locl.addMethod("test_empty_file");
+        await test.test_empty_file();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_single_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_single_file->test_no_variables");
+        meth = locl.addMethod("test_no_variables");
+        await test.test_no_variables();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_single_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_single_file->test_simple_variables");
+        meth = locl.addMethod("test_simple_variables");
+        await test.test_simple_variables();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_single_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_single_file->test_complex_variables");
+        meth = locl.addMethod("test_complex_variables");
+        await test.test_complex_variables();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_single_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_single_file->test_overwrite");
+        meth = locl.addMethod("test_overwrite");
+        await test.test_overwrite();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_single_file.class_teardown) await ltcl_single_file.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_CSS_PROCESSOR");
+    {
+        const {ltcl_multiple_files} = await import("./zcl_abapgit_gui_css_processor.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_multiple_files");
+        if (ltcl_multiple_files.class_setup) await ltcl_multiple_files.class_setup();
+      {
+        const test = await (new ltcl_multiple_files()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_multiple_files->test_simple");
+        meth = locl.addMethod("test_simple");
+        await test.test_simple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_multiple_files()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_CSS_PROCESSOR: running ltcl_multiple_files->test_overwrite");
+        meth = locl.addMethod("test_overwrite");
+        await test.test_overwrite();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_multiple_files.class_teardown) await ltcl_multiple_files.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_EVENT");
+    {
+        const {ltcl_event} = await import("./zcl_abapgit_gui_event.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_event");
+        if (ltcl_event.class_setup) await ltcl_event.class_setup();
+      {
+        const test = await (new ltcl_event()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_EVENT: running ltcl_event->query_wrong_data");
+        meth = locl.addMethod("query_wrong_data");
+        await test.query_wrong_data();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_event()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_EVENT: running ltcl_event->form_wrong_data");
+        meth = locl.addMethod("form_wrong_data");
+        await test.form_wrong_data();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_event()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_EVENT: running ltcl_event->query");
+        meth = locl.addMethod("query");
+        await test.query();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_event()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_EVENT: running ltcl_event->form_data");
+        meth = locl.addMethod("form_data");
+        await test.form_data();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_event()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_EVENT: running ltcl_event->immutability");
+        meth = locl.addMethod("immutability");
+        await test.immutability();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_event.class_teardown) await ltcl_event.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_HTML_PROCESSOR");
+    {
+        const {ltcl_html_processor_test} = await import("./zcl_abapgit_gui_html_processor.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_html_processor_test");
+        if (ltcl_html_processor_test.class_setup) await ltcl_html_processor_test.class_setup();
+      {
+        const test = await (new ltcl_html_processor_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_HTML_PROCESSOR: running ltcl_html_processor_test->process_typical");
+        meth = locl.addMethod("process_typical");
+        await test.process_typical();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_processor_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_HTML_PROCESSOR: running ltcl_html_processor_test->process_with_preserve");
+        meth = locl.addMethod("process_with_preserve");
+        await test.process_with_preserve();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_processor_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_HTML_PROCESSOR: running ltcl_html_processor_test->process_no_css");
+        meth = locl.addMethod("process_no_css");
+        await test.process_no_css();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_processor_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_HTML_PROCESSOR: running ltcl_html_processor_test->process_fails");
+        meth = locl.addMethod("process_fails");
+        await test.process_fails();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_processor_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_HTML_PROCESSOR: running ltcl_html_processor_test->find_head_closing_tag");
+        meth = locl.addMethod("find_head_closing_tag");
+        await test.find_head_closing_tag();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_html_processor_test.class_teardown) await ltcl_html_processor_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_PAGE_DATA");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_gui_page_data.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_DATA: running ltcl_test->concatenated_key_to_where1");
+        meth = locl.addMethod("concatenated_key_to_where1");
+        await test.concatenated_key_to_where1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_DATA: running ltcl_test->concatenated_key_to_where2");
+        meth = locl.addMethod("concatenated_key_to_where2");
+        await test.concatenated_key_to_where2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_DATA: running ltcl_test->concatenated_key_to_where3");
+        meth = locl.addMethod("concatenated_key_to_where3");
+        await test.concatenated_key_to_where3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_DATA: running ltcl_test->concatenated_key_to_where4");
+        meth = locl.addMethod("concatenated_key_to_where4");
+        await test.concatenated_key_to_where4();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_PAGE_PATCH");
+    {
+        const {ltcl_get_patch_data} = await import("./zcl_abapgit_gui_page_patch.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_get_patch_data");
+        if (ltcl_get_patch_data.class_setup) await ltcl_get_patch_data.class_setup();
+      {
+        const test = await (new ltcl_get_patch_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_PATCH: running ltcl_get_patch_data->get_patch_data_add");
+        meth = locl.addMethod("get_patch_data_add");
+        await test.get_patch_data_add();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_get_patch_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_PATCH: running ltcl_get_patch_data->get_patch_data_remove");
+        meth = locl.addMethod("get_patch_data_remove");
+        await test.get_patch_data_remove();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_get_patch_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_PATCH: running ltcl_get_patch_data->invalid_patch_missing_file");
+        meth = locl.addMethod("invalid_patch_missing_file");
+        await test.invalid_patch_missing_file();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_get_patch_data()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_PATCH: running ltcl_get_patch_data->invalid_patch_missing_index");
+        meth = locl.addMethod("invalid_patch_missing_index");
+        await test.invalid_patch_missing_index();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_get_patch_data.class_teardown) await ltcl_get_patch_data.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_PAGE_PATCH");
+    {
+        const {ltcl_is_patch_line_possible} = await import("./zcl_abapgit_gui_page_patch.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_is_patch_line_possible");
+        if (ltcl_is_patch_line_possible.class_setup) await ltcl_is_patch_line_possible.class_setup();
+      {
+        const test = await (new ltcl_is_patch_line_possible()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_PATCH: running ltcl_is_patch_line_possible->initial_diff_line");
+        meth = locl.addMethod("initial_diff_line");
+        await test.initial_diff_line();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_is_patch_line_possible()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_PATCH: running ltcl_is_patch_line_possible->for_update_patch_shd_be_possbl");
+        meth = locl.addMethod("for_update_patch_shd_be_possbl");
+        await test.for_update_patch_shd_be_possbl();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_is_patch_line_possible()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_PATCH: running ltcl_is_patch_line_possible->for_insert_patch_shd_be_possbl");
+        meth = locl.addMethod("for_insert_patch_shd_be_possbl");
+        await test.for_insert_patch_shd_be_possbl();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_is_patch_line_possible()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_PAGE_PATCH: running ltcl_is_patch_line_possible->for_delete_patch_shd_be_possbl");
+        meth = locl.addMethod("for_delete_patch_shd_be_possbl");
+        await test.for_delete_patch_shd_be_possbl();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_is_patch_line_possible.class_teardown) await ltcl_is_patch_line_possible.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_GUI_UTILS");
+    {
+        const {ltcl_gui_utils} = await import("./zcl_abapgit_gui_utils.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_gui_utils");
+        if (ltcl_gui_utils.class_setup) await ltcl_gui_utils.class_setup();
+      {
+        const test = await (new ltcl_gui_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_UTILS: running ltcl_gui_utils->is_renderable");
+        meth = locl.addMethod("is_renderable");
+        await test.is_renderable();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_gui_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_GUI_UTILS: running ltcl_gui_utils->is_event_handler");
+        meth = locl.addMethod("is_event_handler");
+        await test.is_event_handler();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_gui_utils.class_teardown) await ltcl_gui_utils.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_HASH");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_hash.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HASH: running ltcl_test->adler32");
+        meth = locl.addMethod("adler32");
+        await test.adler32();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HASH: running ltcl_test->sha1");
+        meth = locl.addMethod("sha1");
+        await test.sha1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HASH: running ltcl_test->sha1_raw_valid");
+        meth = locl.addMethod("sha1_raw_valid");
+        await test.sha1_raw_valid();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HASH: running ltcl_test->sha1_raw_empty");
+        meth = locl.addMethod("sha1_raw_empty");
+        await test.sha1_raw_empty();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_HTML");
+    {
+        const {ltcl_html} = await import("./zcl_abapgit_html.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_html");
+        if (ltcl_html.class_setup) await ltcl_html.class_setup();
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->wrap");
+        meth = locl.addMethod("wrap");
+        await test.wrap();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->add_renderable");
+        meth = locl.addMethod("add_renderable");
+        await test.add_renderable();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->td");
+        meth = locl.addMethod("td");
+        await test.td();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->th");
+        meth = locl.addMethod("th");
+        await test.th();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->wrap_ii");
+        meth = locl.addMethod("wrap_ii");
+        await test.wrap_ii();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->indent1");
+        meth = locl.addMethod("indent1");
+        await test.indent1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->indent2");
+        meth = locl.addMethod("indent2");
+        await test.indent2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->indent3");
+        meth = locl.addMethod("indent3");
+        await test.indent3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->indent4");
+        meth = locl.addMethod("indent4");
+        await test.indent4();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML: running ltcl_html->style1");
+        meth = locl.addMethod("style1");
+        await test.style1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_html.class_teardown) await ltcl_html.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_HTML_ACTION_UTILS");
+    {
+        const {ltcl_html_action_utils} = await import("./zcl_abapgit_html_action_utils.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_html_action_utils");
+        if (ltcl_html_action_utils.class_setup) await ltcl_html_action_utils.class_setup();
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_fields_simple_case");
+        meth = locl.addMethod("parse_fields_simple_case");
+        await test.parse_fields_simple_case();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_fields_advanced_case");
+        meth = locl.addMethod("parse_fields_advanced_case");
+        await test.parse_fields_advanced_case();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_fields_unescape");
+        meth = locl.addMethod("parse_fields_unescape");
+        await test.parse_fields_unescape();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_fields_unescape_nbsp");
+        meth = locl.addMethod("parse_fields_unescape_nbsp");
+        await test.parse_fields_unescape_nbsp();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_fields_german_umlauts");
+        meth = locl.addMethod("parse_fields_german_umlauts");
+        await test.parse_fields_german_umlauts();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_fields_wrong_format");
+        meth = locl.addMethod("parse_fields_wrong_format");
+        await test.parse_fields_wrong_format();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_post_form_data");
+        meth = locl.addMethod("parse_post_form_data");
+        await test.parse_post_form_data();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_fields_webgui");
+        meth = locl.addMethod("parse_fields_webgui");
+        await test.parse_fields_webgui();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_html_action_utils()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_ACTION_UTILS: running ltcl_html_action_utils->parse_fields_special_chars");
+        meth = locl.addMethod("parse_fields_special_chars");
+        await test.parse_fields_special_chars();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_html_action_utils.class_teardown) await ltcl_html_action_utils.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_HTML_FORM_UTILS");
+    {
+        const {ltcl_popups_mock} = await import("./zcl_abapgit_html_form_utils.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_popups_mock");
+        if (ltcl_popups_mock.class_setup) await ltcl_popups_mock.class_setup();
+      if (ltcl_popups_mock.class_teardown) await ltcl_popups_mock.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_HTML_FORM_UTILS");
+    {
+        const {ltcl_test_form} = await import("./zcl_abapgit_html_form_utils.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test_form");
+        if (ltcl_test_form.class_setup) await ltcl_test_form.class_setup();
+      {
+        const test = await (new ltcl_test_form()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_FORM_UTILS: running ltcl_test_form->validate1");
+        meth = locl.addMethod("validate1");
+        await test.validate1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_form()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_FORM_UTILS: running ltcl_test_form->validate2");
+        meth = locl.addMethod("validate2");
+        await test.validate2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_form()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_FORM_UTILS: running ltcl_test_form->validate3");
+        meth = locl.addMethod("validate3");
+        await test.validate3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_form()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_FORM_UTILS: running ltcl_test_form->normalize");
+        meth = locl.addMethod("normalize");
+        await test.normalize();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_form()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_FORM_UTILS: running ltcl_test_form->is_empty");
+        meth = locl.addMethod("is_empty");
+        await test.is_empty();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_form()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_FORM_UTILS: running ltcl_test_form->exit_clean");
+        meth = locl.addMethod("exit_clean");
+        await test.exit_clean();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_form()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_FORM_UTILS: running ltcl_test_form->exit_dirty_confirm");
+        meth = locl.addMethod("exit_dirty_confirm");
+        await test.exit_dirty_confirm();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_form()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_FORM_UTILS: running ltcl_test_form->exit_dirty_cancel");
+        meth = locl.addMethod("exit_dirty_cancel");
+        await test.exit_dirty_cancel();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test_form.class_teardown) await ltcl_test_form.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_HTML_PARTS");
+    {
+        const {ltcl_part_collections} = await import("./zcl_abapgit_html_parts.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_part_collections");
+        if (ltcl_part_collections.class_setup) await ltcl_part_collections.class_setup();
+      {
+        const test = await (new ltcl_part_collections()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_PARTS: running ltcl_part_collections->test");
+        meth = locl.addMethod("test");
+        await test.test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_part_collections.class_teardown) await ltcl_part_collections.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_HTML_TABLE");
+    {
+        const {ltcl_test_simple_table} = await import("./zcl_abapgit_html_table.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test_simple_table");
+        if (ltcl_test_simple_table.class_setup) await ltcl_test_simple_table.class_setup();
+      {
+        const test = await (new ltcl_test_simple_table()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_HTML_TABLE: running ltcl_test_simple_table->simple_render");
+        meth = locl.addMethod("simple_render");
+        await test.simple_render();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test_simple_table.class_teardown) await ltcl_test_simple_table.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_I18N_PARAMS");
+    {
+        const {ltcl_i18n_params_test} = await import("./zcl_abapgit_i18n_params.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_i18n_params_test");
+        if (ltcl_i18n_params_test.class_setup) await ltcl_i18n_params_test.class_setup();
+      {
+        const test = await (new ltcl_i18n_params_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_I18N_PARAMS: running ltcl_i18n_params_test->iso_langs_to_lang_filter");
+        meth = locl.addMethod("iso_langs_to_lang_filter");
+        await test.iso_langs_to_lang_filter();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_i18n_params_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_I18N_PARAMS: running ltcl_i18n_params_test->filter_sap_langs");
+        meth = locl.addMethod("filter_sap_langs");
+        await test.filter_sap_langs();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_i18n_params_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_I18N_PARAMS: running ltcl_i18n_params_test->filter_sap_langs_tab");
+        meth = locl.addMethod("filter_sap_langs_tab");
+        await test.filter_sap_langs_tab();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_i18n_params_test.class_teardown) await ltcl_i18n_params_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_INJECTOR");
+    {
+        const {ltcl_no_dependency_injection} = await import("./zcl_abapgit_injector.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_no_dependency_injection");
+        if (ltcl_no_dependency_injection.class_setup) await ltcl_no_dependency_injection.class_setup();
+  console.log('ZCL_ABAPGIT_INJECTOR: running ltcl_no_dependency_injection->no_injection, skipped');
+  meth = locl.addMethod("no_injection");
+  meth.skip();
+      if (ltcl_no_dependency_injection.class_teardown) await ltcl_no_dependency_injection.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_INJECTOR");
+    {
+        const {ltcl_simple_dependency_inject} = await import("./zcl_abapgit_injector.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_simple_dependency_inject");
+        if (ltcl_simple_dependency_inject.class_setup) await ltcl_simple_dependency_inject.class_setup();
+  console.log('ZCL_ABAPGIT_INJECTOR: running ltcl_simple_dependency_inject->simple_injection, skipped');
+  meth = locl.addMethod("simple_injection");
+  meth.skip();
+      if (ltcl_simple_dependency_inject.class_teardown) await ltcl_simple_dependency_inject.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_ITEM_GRAPH");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_item_graph.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ITEM_GRAPH: running ltcl_test->basic");
+        meth = locl.addMethod("basic");
+        await test.basic();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_ITEM_STATE");
+    {
+        const {ltcl_state_test} = await import("./zcl_abapgit_item_state.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_state_test");
+        if (ltcl_state_test.class_setup) await ltcl_state_test.class_setup();
+      {
+        const test = await (new ltcl_state_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ITEM_STATE: running ltcl_state_test->test_sum_with_status");
+        meth = locl.addMethod("test_sum_with_status");
+        await test.test_sum_with_status();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_state_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ITEM_STATE: running ltcl_state_test->test_sum_with_ritem");
+        meth = locl.addMethod("test_sum_with_ritem");
+        await test.test_sum_with_ritem();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_state_test.class_teardown) await ltcl_state_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_LOG");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_log.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOG: running ltcl_test->from_x");
+        meth = locl.addMethod("from_x");
+        await test.from_x();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOG: running ltcl_test->get_status");
+        meth = locl.addMethod("get_status");
+        await test.get_status();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOG: running ltcl_test->get_log_level");
+        meth = locl.addMethod("get_log_level");
+        await test.get_log_level();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOG: running ltcl_test->merge_with");
+        meth = locl.addMethod("merge_with");
+        await test.merge_with();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOG: running ltcl_test->merge_with_min_level");
+        meth = locl.addMethod("merge_with_min_level");
+        await test.merge_with_min_level();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOG: running ltcl_test->empty");
+        meth = locl.addMethod("empty");
+        await test.empty();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOG: running ltcl_test->clone");
+        meth = locl.addMethod("clone");
+        await test.clone();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOG: running ltcl_test->add");
+        meth = locl.addMethod("add");
+        await test.add();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_LOGIN_MANAGER");
+    {
+        const {ltcl_login_manager} = await import("./zcl_abapgit_login_manager.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_login_manager");
+        if (ltcl_login_manager.class_setup) await ltcl_login_manager.class_setup();
+      {
+        const test = await (new ltcl_login_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOGIN_MANAGER: running ltcl_login_manager->encoding");
+        meth = locl.addMethod("encoding");
+        await test.encoding();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_login_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOGIN_MANAGER: running ltcl_login_manager->save");
+        meth = locl.addMethod("save");
+        await test.save();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_login_manager()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LOGIN_MANAGER: running ltcl_login_manager->same_server");
+        meth = locl.addMethod("same_server");
+        await test.same_server();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_login_manager.class_teardown) await ltcl_login_manager.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_LONGTEXTS");
+    {
+        const {ltcl_longtexts} = await import("./zcl_abapgit_longtexts.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_longtexts");
+        if (ltcl_longtexts.class_setup) await ltcl_longtexts.class_setup();
+      {
+        const test = await (new ltcl_longtexts()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LONGTEXTS: running ltcl_longtexts->escape_name");
+        meth = locl.addMethod("escape_name");
+        await test.escape_name();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_longtexts.class_teardown) await ltcl_longtexts.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_LXE_TEXTS");
+    {
+        const {ltcl_lxe_texts} = await import("./zcl_abapgit_lxe_texts.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_lxe_texts");
+        if (ltcl_lxe_texts.class_setup) await ltcl_lxe_texts.class_setup();
+      {
+        const test = await (new ltcl_lxe_texts()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LXE_TEXTS: running ltcl_lxe_texts->check_langs_versus_installed");
+        meth = locl.addMethod("check_langs_versus_installed");
+        await test.check_langs_versus_installed();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_lxe_texts()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LXE_TEXTS: running ltcl_lxe_texts->lang_string_to_table");
+        meth = locl.addMethod("lang_string_to_table");
+        await test.lang_string_to_table();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_lxe_texts()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_LXE_TEXTS: running ltcl_lxe_texts->table_to_lang_string");
+        meth = locl.addMethod("table_to_lang_string");
+        await test.table_to_lang_string();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_lxe_texts.class_teardown) await ltcl_lxe_texts.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_NEWS");
+    {
+        const {ltcl_news} = await import("./zcl_abapgit_news.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_news");
+        if (ltcl_news.class_setup) await ltcl_news.class_setup();
+      {
+        const test = await (new ltcl_news()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_NEWS: running ltcl_news->parse_line");
+        meth = locl.addMethod("parse_line");
+        await test.parse_line();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_news()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_NEWS: running ltcl_news->parse");
+        meth = locl.addMethod("parse");
+        await test.parse();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_news.class_teardown) await ltcl_news.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_OBJECTS");
+    {
+        const {ltcl_object_types} = await import("./zcl_abapgit_objects.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_object_types");
+        if (ltcl_object_types.class_setup) await ltcl_object_types.class_setup();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_object_types->type_supported, skipped');
+  meth = locl.addMethod("type_supported");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_object_types->not_exist, skipped');
+  meth = locl.addMethod("not_exist");
+  meth.skip();
+      if (ltcl_object_types.class_teardown) await ltcl_object_types.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_OBJECTS");
+    {
+        const {ltcl_serialize} = await import("./zcl_abapgit_objects.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_serialize");
+        if (ltcl_serialize.class_setup) await ltcl_serialize.class_setup();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_tabl, skipped');
+  meth = locl.addMethod("serialize_tabl");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_shlp, skipped');
+  meth = locl.addMethod("serialize_shlp");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_view, skipped');
+  meth = locl.addMethod("serialize_view");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_auth, skipped');
+  meth = locl.addMethod("serialize_auth");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_clas, skipped');
+  meth = locl.addMethod("serialize_clas");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_intf, skipped');
+  meth = locl.addMethod("serialize_intf");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_doma, skipped');
+  meth = locl.addMethod("serialize_doma");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_dtel, skipped');
+  meth = locl.addMethod("serialize_dtel");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_fugr, skipped');
+  meth = locl.addMethod("serialize_fugr");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_msag, skipped');
+  meth = locl.addMethod("serialize_msag");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_prog, skipped');
+  meth = locl.addMethod("serialize_prog");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_tran, skipped');
+  meth = locl.addMethod("serialize_tran");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_serialize->serialize_ttyp, skipped');
+  meth = locl.addMethod("serialize_ttyp");
+  meth.skip();
+      if (ltcl_serialize.class_teardown) await ltcl_serialize.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_OBJECTS");
+    {
+        const {ltcl_check_objects_locked} = await import("./zcl_abapgit_objects.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_check_objects_locked");
+        if (ltcl_check_objects_locked.class_setup) await ltcl_check_objects_locked.class_setup();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_check_objects_locked->throw_excp_if_object_is_locked, skipped');
+  meth = locl.addMethod("throw_excp_if_object_is_locked");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_OBJECTS: running ltcl_check_objects_locked->no_excp_if_obj_is_not_locked, skipped');
+  meth = locl.addMethod("no_excp_if_obj_is_not_locked");
+  meth.skip();
+      if (ltcl_check_objects_locked.class_teardown) await ltcl_check_objects_locked.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_OBJECTS_FILES");
+    {
+        const {ltcl_objects_files} = await import("./zcl_abapgit_objects_files.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_objects_files");
+        if (ltcl_objects_files.class_setup) await ltcl_objects_files.class_setup();
+      {
+        const test = await (new ltcl_objects_files()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECTS_FILES: running ltcl_objects_files->read_abap");
+        meth = locl.addMethod("read_abap");
+        await test.read_abap();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_objects_files()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECTS_FILES: running ltcl_objects_files->read_xml");
+        meth = locl.addMethod("read_xml");
+        await test.read_xml();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_objects_files()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECTS_FILES: running ltcl_objects_files->get_file_pattern");
+        meth = locl.addMethod("get_file_pattern");
+        await test.get_file_pattern();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_objects_files()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECTS_FILES: running ltcl_objects_files->is_json_metadata");
+        meth = locl.addMethod("is_json_metadata");
+        await test.is_json_metadata();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_objects_files()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECTS_FILES: running ltcl_objects_files->is_not_json_metadata");
+        meth = locl.addMethod("is_not_json_metadata");
+        await test.is_not_json_metadata();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_objects_files()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECTS_FILES: running ltcl_objects_files->read_i18n_files");
+        meth = locl.addMethod("read_i18n_files");
+        await test.read_i18n_files();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_objects_files.class_teardown) await ltcl_objects_files.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_OBJECTS_PROGRAM");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_objects_program.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECTS_PROGRAM: running ltcl_test->strip_generation_comments_1");
+        meth = locl.addMethod("strip_generation_comments_1");
+        await test.strip_generation_comments_1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECTS_PROGRAM: running ltcl_test->strip_generation_comments_2");
+        meth = locl.addMethod("strip_generation_comments_2");
+        await test.strip_generation_comments_2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_OBJECT_INTF");
+    {
+        const {ltcl_unit_test} = await import("./zcl_abapgit_object_intf.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_unit_test");
+        if (ltcl_unit_test.class_setup) await ltcl_unit_test.class_setup();
+      {
+        const test = await (new ltcl_unit_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECT_INTF: running ltcl_unit_test->deserializes");
+        meth = locl.addMethod("deserializes");
+        await test.deserializes();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_unit_test.class_teardown) await ltcl_unit_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_OBJECT_INTF");
+    {
+        const {ltcl_aff_metadata} = await import("./zcl_abapgit_object_intf.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_aff_metadata");
+        if (ltcl_aff_metadata.class_setup) await ltcl_aff_metadata.class_setup();
+      {
+        const test = await (new ltcl_aff_metadata()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECT_INTF: running ltcl_aff_metadata->deserialize_defaults");
+        meth = locl.addMethod("deserialize_defaults");
+        await test.deserialize_defaults();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_metadata()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECT_INTF: running ltcl_aff_metadata->deserialize_non_defaults");
+        meth = locl.addMethod("deserialize_non_defaults");
+        await test.deserialize_non_defaults();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_metadata()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECT_INTF: running ltcl_aff_metadata->serialize_non_default");
+        meth = locl.addMethod("serialize_non_default");
+        await test.serialize_non_default();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_aff_metadata()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_OBJECT_INTF: running ltcl_aff_metadata->serialize_default");
+        meth = locl.addMethod("serialize_default");
+        await test.serialize_default();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_aff_metadata.class_teardown) await ltcl_aff_metadata.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_PATH");
+    {
+        const {ltcl_path} = await import("./zcl_abapgit_path.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_path");
+        if (ltcl_path.class_setup) await ltcl_path.class_setup();
+      {
+        const test = await (new ltcl_path()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PATH: running ltcl_path->is_root");
+        meth = locl.addMethod("is_root");
+        await test.is_root();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_path()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PATH: running ltcl_path->split_file_location");
+        meth = locl.addMethod("split_file_location");
+        await test.split_file_location();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_path()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PATH: running ltcl_path->is_subdir");
+        meth = locl.addMethod("is_subdir");
+        await test.is_subdir();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_path()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PATH: running ltcl_path->change_dir");
+        meth = locl.addMethod("change_dir");
+        await test.change_dir();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_path()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PATH: running ltcl_path->get_filename_from_syspath");
+        meth = locl.addMethod("get_filename_from_syspath");
+        await test.get_filename_from_syspath();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_path.class_teardown) await ltcl_path.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_PO_FILE");
+    {
+        const {ltcl_po_file} = await import("./zcl_abapgit_po_file.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_po_file");
+        if (ltcl_po_file.class_setup) await ltcl_po_file.class_setup();
+      {
+        const test = await (new ltcl_po_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PO_FILE: running ltcl_po_file->po_body");
+        meth = locl.addMethod("po_body");
+        await test.po_body();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_po_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PO_FILE: running ltcl_po_file->parse_happy_path");
+        meth = locl.addMethod("parse_happy_path");
+        await test.parse_happy_path();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_po_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PO_FILE: running ltcl_po_file->parse_negative");
+        meth = locl.addMethod("parse_negative");
+        await test.parse_negative();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_po_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PO_FILE: running ltcl_po_file->unquote");
+        meth = locl.addMethod("unquote");
+        await test.unquote();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_po_file()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_PO_FILE: running ltcl_po_file->multiline_parsing");
+        meth = locl.addMethod("multiline_parsing");
+        await test.multiline_parsing();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_po_file.class_teardown) await ltcl_po_file.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REPO");
+    {
+        const {ltcl_find_remote_dot_abapgit} = await import("./zcl_abapgit_repo.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_find_remote_dot_abapgit");
+        if (ltcl_find_remote_dot_abapgit.class_setup) await ltcl_find_remote_dot_abapgit.class_setup();
+      {
+        const test = await (new ltcl_find_remote_dot_abapgit()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO: running ltcl_find_remote_dot_abapgit->positive");
+        meth = locl.addMethod("positive");
+        await test.positive();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_find_remote_dot_abapgit()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO: running ltcl_find_remote_dot_abapgit->new_repo_needs_no_dot_abapgit");
+        meth = locl.addMethod("new_repo_needs_no_dot_abapgit");
+        await test.new_repo_needs_no_dot_abapgit();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_find_remote_dot_abapgit.class_teardown) await ltcl_find_remote_dot_abapgit.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REPO_CHECKSUMS");
+    {
+        const {ltcl_test_checksum_serializer} = await import("./zcl_abapgit_repo_checksums.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test_checksum_serializer");
+        if (ltcl_test_checksum_serializer.class_setup) await ltcl_test_checksum_serializer.class_setup();
+      {
+        const test = await (new ltcl_test_checksum_serializer()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_test_checksum_serializer->serialize");
+        meth = locl.addMethod("serialize");
+        await test.serialize();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_checksum_serializer()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_test_checksum_serializer->serialize_w_zero_item");
+        meth = locl.addMethod("serialize_w_zero_item");
+        await test.serialize_w_zero_item();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_checksum_serializer()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_test_checksum_serializer->deserialize");
+        meth = locl.addMethod("deserialize");
+        await test.deserialize();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_checksum_serializer()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_test_checksum_serializer->deserialize_w_root_file");
+        meth = locl.addMethod("deserialize_w_root_file");
+        await test.deserialize_w_root_file();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test_checksum_serializer.class_teardown) await ltcl_test_checksum_serializer.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REPO_CHECKSUMS");
+    {
+        const {ltcl_test_checksums} = await import("./zcl_abapgit_repo_checksums.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test_checksums");
+        if (ltcl_test_checksums.class_setup) await ltcl_test_checksums.class_setup();
+      {
+        const test = await (new ltcl_test_checksums()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_test_checksums->get");
+        meth = locl.addMethod("get");
+        await test.get();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_checksums()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_test_checksums->rebuild_simple");
+        meth = locl.addMethod("rebuild_simple");
+        await test.rebuild_simple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_checksums()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_test_checksums->rebuild_w_dot_abapgit");
+        meth = locl.addMethod("rebuild_w_dot_abapgit");
+        await test.rebuild_w_dot_abapgit();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test_checksums()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_test_checksums->update_simple");
+        meth = locl.addMethod("update_simple");
+        await test.update_simple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test_checksums.class_teardown) await ltcl_test_checksums.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REPO_CHECKSUMS");
+    {
+        const {ltcl_update_calculator_test} = await import("./zcl_abapgit_repo_checksums.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_update_calculator_test");
+        if (ltcl_update_calculator_test.class_setup) await ltcl_update_calculator_test.class_setup();
+      {
+        const test = await (new ltcl_update_calculator_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_CHECKSUMS: running ltcl_update_calculator_test->simple_test");
+        meth = locl.addMethod("simple_test");
+        await test.simple_test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_update_calculator_test.class_teardown) await ltcl_update_calculator_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REPO_LABELS");
+    {
+        const {ltcl_tags} = await import("./zcl_abapgit_repo_labels.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_tags");
+        if (ltcl_tags.class_setup) await ltcl_tags.class_setup();
+      {
+        const test = await (new ltcl_tags()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_LABELS: running ltcl_tags->split");
+        meth = locl.addMethod("split");
+        await test.split();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_tags()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_LABELS: running ltcl_tags->validate");
+        meth = locl.addMethod("validate");
+        await test.validate();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_tags()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_LABELS: running ltcl_tags->normalize");
+        meth = locl.addMethod("normalize");
+        await test.normalize();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_tags()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_LABELS: running ltcl_tags->split_colors");
+        meth = locl.addMethod("split_colors");
+        await test.split_colors();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_tags()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_LABELS: running ltcl_tags->split_colors_into_map");
+        meth = locl.addMethod("split_colors_into_map");
+        await test.split_colors_into_map();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_tags()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_LABELS: running ltcl_tags->validate_colors");
+        meth = locl.addMethod("validate_colors");
+        await test.validate_colors();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_tags()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_REPO_LABELS: running ltcl_tags->normalize_colors");
+        meth = locl.addMethod("normalize_colors");
+        await test.normalize_colors();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_tags.class_teardown) await ltcl_tags.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REQUIREMENT_HELPER");
+    {
+        const {ltcl_lower_release} = await import("./zcl_abapgit_requirement_helper.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_lower_release");
+        if (ltcl_lower_release.class_setup) await ltcl_lower_release.class_setup();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_lower_release->empty_patch, skipped');
+  meth = locl.addMethod("empty_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_lower_release->lower_patch, skipped');
+  meth = locl.addMethod("lower_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_lower_release->same_patch, skipped');
+  meth = locl.addMethod("same_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_lower_release->higher_patch, skipped');
+  meth = locl.addMethod("higher_patch");
+  meth.skip();
+      if (ltcl_lower_release.class_teardown) await ltcl_lower_release.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REQUIREMENT_HELPER");
+    {
+        const {ltcl_same_release} = await import("./zcl_abapgit_requirement_helper.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_same_release");
+        if (ltcl_same_release.class_setup) await ltcl_same_release.class_setup();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_same_release->empty_patch, skipped');
+  meth = locl.addMethod("empty_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_same_release->lower_patch, skipped');
+  meth = locl.addMethod("lower_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_same_release->same_patch, skipped');
+  meth = locl.addMethod("same_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_same_release->higher_patch, skipped');
+  meth = locl.addMethod("higher_patch");
+  meth.skip();
+      if (ltcl_same_release.class_teardown) await ltcl_same_release.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REQUIREMENT_HELPER");
+    {
+        const {ltcl_higher_release} = await import("./zcl_abapgit_requirement_helper.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_higher_release");
+        if (ltcl_higher_release.class_setup) await ltcl_higher_release.class_setup();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_higher_release->empty_patch, skipped');
+  meth = locl.addMethod("empty_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_higher_release->lower_patch, skipped');
+  meth = locl.addMethod("lower_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_higher_release->same_patch, skipped');
+  meth = locl.addMethod("same_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_higher_release->higher_patch, skipped');
+  meth = locl.addMethod("higher_patch");
+  meth.skip();
+      if (ltcl_higher_release.class_teardown) await ltcl_higher_release.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_REQUIREMENT_HELPER");
+    {
+        const {ltcl_formats} = await import("./zcl_abapgit_requirement_helper.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_formats");
+        if (ltcl_formats.class_setup) await ltcl_formats.class_setup();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_formats->shorter_patch, skipped');
+  meth = locl.addMethod("shorter_patch");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_REQUIREMENT_HELPER: running ltcl_formats->higher_patch, skipped');
+  meth = locl.addMethod("higher_patch");
+  meth.skip();
+      if (ltcl_formats.class_teardown) await ltcl_formats.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SERIALIZE");
+    {
+        const {ltcl_determine_max_threads} = await import("./zcl_abapgit_serialize.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_determine_max_threads");
+        if (ltcl_determine_max_threads.class_setup) await ltcl_determine_max_threads.class_setup();
+      {
+        const test = await (new ltcl_determine_max_threads()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SERIALIZE: running ltcl_determine_max_threads->determine_max_threads");
+        meth = locl.addMethod("determine_max_threads");
+        await test.determine_max_threads();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_determine_max_threads()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SERIALIZE: running ltcl_determine_max_threads->force");
+        meth = locl.addMethod("force");
+        await test.force();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_determine_max_threads.class_teardown) await ltcl_determine_max_threads.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SERIALIZE");
+    {
+        const {ltcl_serialize} = await import("./zcl_abapgit_serialize.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_serialize");
+        if (ltcl_serialize.class_setup) await ltcl_serialize.class_setup();
+  console.log('ZCL_ABAPGIT_SERIALIZE: running ltcl_serialize->test, skipped');
+  meth = locl.addMethod("test");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_SERIALIZE: running ltcl_serialize->unsupported, skipped');
+  meth = locl.addMethod("unsupported");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_SERIALIZE: running ltcl_serialize->ignored, skipped');
+  meth = locl.addMethod("ignored");
+  meth.skip();
+      if (ltcl_serialize.class_teardown) await ltcl_serialize.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SERIALIZE");
+    {
+        const {ltcl_i18n} = await import("./zcl_abapgit_serialize.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_i18n");
+        if (ltcl_i18n.class_setup) await ltcl_i18n.class_setup();
+  console.log('ZCL_ABAPGIT_SERIALIZE: running ltcl_i18n->test, skipped');
+  meth = locl.addMethod("test");
+  meth.skip();
+      if (ltcl_i18n.class_teardown) await ltcl_i18n.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SERVICES_BASIS");
+    {
+        const {ltcl_sap_package_mock} = await import("./zcl_abapgit_services_basis.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_sap_package_mock");
+        if (ltcl_sap_package_mock.class_setup) await ltcl_sap_package_mock.class_setup();
+      if (ltcl_sap_package_mock.class_teardown) await ltcl_sap_package_mock.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SERVICES_BASIS");
+    {
+        const {ltcl_popups_mock} = await import("./zcl_abapgit_services_basis.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_popups_mock");
+        if (ltcl_popups_mock.class_setup) await ltcl_popups_mock.class_setup();
+      if (ltcl_popups_mock.class_teardown) await ltcl_popups_mock.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SERVICES_BASIS");
+    {
+        const {ltcl_create_package} = await import("./zcl_abapgit_services_basis.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_create_package");
+        if (ltcl_create_package.class_setup) await ltcl_create_package.class_setup();
+  console.log('ZCL_ABAPGIT_SERVICES_BASIS: running ltcl_create_package->raise_error_if_package_exists, skipped');
+  meth = locl.addMethod("raise_error_if_package_exists");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_SERVICES_BASIS: running ltcl_create_package->package_given_in_popup, skipped');
+  meth = locl.addMethod("package_given_in_popup");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_SERVICES_BASIS: running ltcl_create_package->package_not_created_when_canc, skipped');
+  meth = locl.addMethod("package_not_created_when_canc");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_SERVICES_BASIS: running ltcl_create_package->package_created_when_confirm, skipped');
+  meth = locl.addMethod("package_created_when_confirm");
+  meth.skip();
+      if (ltcl_create_package.class_teardown) await ltcl_create_package.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SOTR_HANDLER");
+    {
+        const {ltcl_sotr_handler} = await import("./zcl_abapgit_sotr_handler.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_sotr_handler");
+        if (ltcl_sotr_handler.class_setup) await ltcl_sotr_handler.class_setup();
+  console.log('ZCL_ABAPGIT_SOTR_HANDLER: running ltcl_sotr_handler->sotr_wda_0001, skipped');
+  meth = locl.addMethod("sotr_wda_0001");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_SOTR_HANDLER: running ltcl_sotr_handler->sotr_wda_0003_not_exist, skipped');
+  meth = locl.addMethod("sotr_wda_0003_not_exist");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_SOTR_HANDLER: running ltcl_sotr_handler->sotr_wda_0004, skipped');
+  meth = locl.addMethod("sotr_wda_0004");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_SOTR_HANDLER: running ltcl_sotr_handler->sotr_cx_0002, skipped');
+  meth = locl.addMethod("sotr_cx_0002");
+  meth.skip();
+      if (ltcl_sotr_handler.class_teardown) await ltcl_sotr_handler.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_STRING_BUFFER");
+    {
+        const {ltcl_test_strbuf} = await import("./zcl_abapgit_string_buffer.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test_strbuf");
+        if (ltcl_test_strbuf.class_setup) await ltcl_test_strbuf.class_setup();
+      {
+        const test = await (new ltcl_test_strbuf()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_STRING_BUFFER: running ltcl_test_strbuf->join_space");
+        meth = locl.addMethod("join_space");
+        await test.join_space();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test_strbuf.class_teardown) await ltcl_test_strbuf.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_STRING_MAP");
+    {
+        const {ltcl_sm_test} = await import("./zcl_abapgit_string_map.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_sm_test");
+        if (ltcl_sm_test.class_setup) await ltcl_sm_test.class_setup();
+      {
+        const test = await (new ltcl_sm_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_STRING_MAP: running ltcl_sm_test->simple");
+        meth = locl.addMethod("simple");
+        await test.simple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_sm_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_STRING_MAP: running ltcl_sm_test->freeze");
+        meth = locl.addMethod("freeze");
+        await test.freeze();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_sm_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_STRING_MAP: running ltcl_sm_test->strict");
+        meth = locl.addMethod("strict");
+        await test.strict();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_sm_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_STRING_MAP: running ltcl_sm_test->case_insensitive");
+        meth = locl.addMethod("case_insensitive");
+        await test.case_insensitive();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_sm_test.class_teardown) await ltcl_sm_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SYNTAX_ABAP");
+    {
+        const {ltcl_abapgit_syntax_abap} = await import("./zcl_abapgit_syntax_abap.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_abapgit_syntax_abap");
+        if (ltcl_abapgit_syntax_abap.class_setup) await ltcl_abapgit_syntax_abap.class_setup();
+      {
+        const test = await (new ltcl_abapgit_syntax_abap()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_abapgit_syntax_abap->report_header");
+        meth = locl.addMethod("report_header");
+        await test.report_header();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_abapgit_syntax_abap.class_teardown) await ltcl_abapgit_syntax_abap.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SYNTAX_ABAP");
+    {
+        const {ltcl_syntax_basic_logic} = await import("./zcl_abapgit_syntax_abap.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_syntax_basic_logic");
+        if (ltcl_syntax_basic_logic.class_setup) await ltcl_syntax_basic_logic.class_setup();
+      {
+        const test = await (new ltcl_syntax_basic_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_basic_logic->process_line");
+        meth = locl.addMethod("process_line");
+        await test.process_line();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_basic_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_basic_logic->format_line");
+        meth = locl.addMethod("format_line");
+        await test.format_line();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_basic_logic()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_basic_logic->apply_style");
+        meth = locl.addMethod("apply_style");
+        await test.apply_style();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_syntax_basic_logic.class_teardown) await ltcl_syntax_basic_logic.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SYNTAX_ABAP");
+    {
+        const {ltcl_syntax_cases} = await import("./zcl_abapgit_syntax_abap.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_syntax_cases");
+        if (ltcl_syntax_cases.class_setup) await ltcl_syntax_cases.class_setup();
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_cases->test_abap_01");
+        meth = locl.addMethod("test_abap_01");
+        await test.test_abap_01();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_cases->test_abap_02");
+        meth = locl.addMethod("test_abap_02");
+        await test.test_abap_02();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_cases->test_abap_03");
+        meth = locl.addMethod("test_abap_03");
+        await test.test_abap_03();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_cases->test_abap_04");
+        meth = locl.addMethod("test_abap_04");
+        await test.test_abap_04();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_cases->test_abap_05");
+        meth = locl.addMethod("test_abap_05");
+        await test.test_abap_05();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_cases->test_abap_06");
+        meth = locl.addMethod("test_abap_06");
+        await test.test_abap_06();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_cases->test_abap_07");
+        meth = locl.addMethod("test_abap_07");
+        await test.test_abap_07();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_ABAP: running ltcl_syntax_cases->test_abap_08");
+        meth = locl.addMethod("test_abap_08");
+        await test.test_abap_08();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_syntax_cases.class_teardown) await ltcl_syntax_cases.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SYNTAX_JSON");
+    {
+        const {ltcl_abapgit_syntax_json} = await import("./zcl_abapgit_syntax_json.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_abapgit_syntax_json");
+        if (ltcl_abapgit_syntax_json.class_setup) await ltcl_abapgit_syntax_json.class_setup();
+      {
+        const test = await (new ltcl_abapgit_syntax_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_JSON: running ltcl_abapgit_syntax_json->key_value");
+        meth = locl.addMethod("key_value");
+        await test.key_value();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_JSON: running ltcl_abapgit_syntax_json->comment_1");
+        meth = locl.addMethod("comment_1");
+        await test.comment_1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_json()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_JSON: running ltcl_abapgit_syntax_json->comment_2");
+        meth = locl.addMethod("comment_2");
+        await test.comment_2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_abapgit_syntax_json.class_teardown) await ltcl_abapgit_syntax_json.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SYNTAX_XML");
+    {
+        const {ltcl_abapgit_syntax_xml} = await import("./zcl_abapgit_syntax_xml.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_abapgit_syntax_xml");
+        if (ltcl_abapgit_syntax_xml.class_setup) await ltcl_abapgit_syntax_xml.class_setup();
+      {
+        const test = await (new ltcl_abapgit_syntax_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_abapgit_syntax_xml->sole_closing_xml_tag");
+        meth = locl.addMethod("sole_closing_xml_tag");
+        await test.sole_closing_xml_tag();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_abapgit_syntax_xml->complete_xml_tag");
+        meth = locl.addMethod("complete_xml_tag");
+        await test.complete_xml_tag();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_abapgit_syntax_xml->complete_xml_tag_with_closing");
+        meth = locl.addMethod("complete_xml_tag_with_closing");
+        await test.complete_xml_tag_with_closing();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_abapgit_syntax_xml->empty_attributes");
+        meth = locl.addMethod("empty_attributes");
+        await test.empty_attributes();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_abapgit_syntax_xml->open_tags");
+        meth = locl.addMethod("open_tags");
+        await test.open_tags();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_abapgit_syntax_xml->attributes_only");
+        meth = locl.addMethod("attributes_only");
+        await test.attributes_only();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_abapgit_syntax_xml->attribute_value_equal_signs");
+        meth = locl.addMethod("attribute_value_equal_signs");
+        await test.attribute_value_equal_signs();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_abapgit_syntax_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_abapgit_syntax_xml->multi_line_comments");
+        meth = locl.addMethod("multi_line_comments");
+        await test.multi_line_comments();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_abapgit_syntax_xml.class_teardown) await ltcl_abapgit_syntax_xml.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_SYNTAX_XML");
+    {
+        const {ltcl_syntax_cases} = await import("./zcl_abapgit_syntax_xml.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_syntax_cases");
+        if (ltcl_syntax_cases.class_setup) await ltcl_syntax_cases.class_setup();
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_01");
+        meth = locl.addMethod("test_xml_01");
+        await test.test_xml_01();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_02");
+        meth = locl.addMethod("test_xml_02");
+        await test.test_xml_02();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_03");
+        meth = locl.addMethod("test_xml_03");
+        await test.test_xml_03();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_04");
+        meth = locl.addMethod("test_xml_04");
+        await test.test_xml_04();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_05");
+        meth = locl.addMethod("test_xml_05");
+        await test.test_xml_05();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_06");
+        meth = locl.addMethod("test_xml_06");
+        await test.test_xml_06();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_07");
+        meth = locl.addMethod("test_xml_07");
+        await test.test_xml_07();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_08");
+        meth = locl.addMethod("test_xml_08");
+        await test.test_xml_08();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_syntax_cases()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_SYNTAX_XML: running ltcl_syntax_cases->test_xml_09");
+        meth = locl.addMethod("test_xml_09");
+        await test.test_xml_09();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_syntax_cases.class_teardown) await ltcl_syntax_cases.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_TIMER");
+    {
+        const {ltcl_timer} = await import("./zcl_abapgit_timer.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_timer");
+        if (ltcl_timer.class_setup) await ltcl_timer.class_setup();
+      {
+        const test = await (new ltcl_timer()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TIMER: running ltcl_timer->run_timer");
+        meth = locl.addMethod("run_timer");
+        await test.run_timer();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_timer()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TIMER: running ltcl_timer->run_timer_with_count");
+        meth = locl.addMethod("run_timer_with_count");
+        await test.run_timer_with_count();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_timer()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TIMER: running ltcl_timer->run_timer_with_text");
+        meth = locl.addMethod("run_timer_with_text");
+        await test.run_timer_with_text();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_timer.class_teardown) await ltcl_timer.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_TRANSPORT_OBJECTS");
+    {
+        const {ltcl_transport_objects} = await import("./zcl_abapgit_transport_objects.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_transport_objects");
+        if (ltcl_transport_objects.class_setup) await ltcl_transport_objects.class_setup();
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->add_new_to_local_files");
+        meth = locl.addMethod("add_new_to_local_files");
+        await test.add_new_to_local_files();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->modified_to_new_local_files");
+        meth = locl.addMethod("modified_to_new_local_files");
+        await test.modified_to_new_local_files();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->transport_not_in_repository");
+        meth = locl.addMethod("transport_not_in_repository");
+        await test.transport_not_in_repository();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->object_not_in_local_files");
+        meth = locl.addMethod("object_not_in_local_files");
+        await test.object_not_in_local_files();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->cant_be_added_with_del_flag");
+        meth = locl.addMethod("cant_be_added_with_del_flag");
+        await test.cant_be_added_with_del_flag();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->cant_be_modified_with_del_flag");
+        meth = locl.addMethod("cant_be_modified_with_del_flag");
+        await test.cant_be_modified_with_del_flag();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->deleted_to_removed_files");
+        meth = locl.addMethod("deleted_to_removed_files");
+        await test.deleted_to_removed_files();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->should_remove_no_delflag_iwmo");
+        meth = locl.addMethod("should_remove_no_delflag_iwmo");
+        await test.should_remove_no_delflag_iwmo();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->should_remove_no_delflag_iwom");
+        meth = locl.addMethod("should_remove_no_delflag_iwom");
+        await test.should_remove_no_delflag_iwom();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->should_remove_no_delflag_iwsg");
+        meth = locl.addMethod("should_remove_no_delflag_iwsg");
+        await test.should_remove_no_delflag_iwsg();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->should_remove_no_delflag_iwsv");
+        meth = locl.addMethod("should_remove_no_delflag_iwsv");
+        await test.should_remove_no_delflag_iwsv();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->should_remove_no_delflag_susc");
+        meth = locl.addMethod("should_remove_no_delflag_susc");
+        await test.should_remove_no_delflag_susc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->shouldnt_remove_no_delflag");
+        meth = locl.addMethod("shouldnt_remove_no_delflag");
+        await test.shouldnt_remove_no_delflag();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->should_add_all_local_files");
+        meth = locl.addMethod("should_add_all_local_files");
+        await test.should_add_all_local_files();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_transport_objects()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_TRANSPORT_OBJECTS: running ltcl_transport_objects->should_delete_all_related");
+        meth = locl.addMethod("should_delete_all_related");
+        await test.should_delete_all_related();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_transport_objects.class_teardown) await ltcl_transport_objects.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_UI_INJECTOR");
+    {
+        const {ltcl_no_dependency_injection} = await import("./zcl_abapgit_ui_injector.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_no_dependency_injection");
+        if (ltcl_no_dependency_injection.class_setup) await ltcl_no_dependency_injection.class_setup();
+  console.log('ZCL_ABAPGIT_UI_INJECTOR: running ltcl_no_dependency_injection->no_injection, skipped');
+  meth = locl.addMethod("no_injection");
+  meth.skip();
+      if (ltcl_no_dependency_injection.class_teardown) await ltcl_no_dependency_injection.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_UI_INJECTOR");
+    {
+        const {ltcl_simple_dependency_inject} = await import("./zcl_abapgit_ui_injector.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_simple_dependency_inject");
+        if (ltcl_simple_dependency_inject.class_setup) await ltcl_simple_dependency_inject.class_setup();
+  console.log('ZCL_ABAPGIT_UI_INJECTOR: running ltcl_simple_dependency_inject->simple_injection, skipped');
+  meth = locl.addMethod("simple_injection");
+  meth.skip();
+      if (ltcl_simple_dependency_inject.class_teardown) await ltcl_simple_dependency_inject.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_URL");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_url.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_host");
+        meth = locl.addMethod("repo_host");
+        await test.repo_host();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_name1");
+        meth = locl.addMethod("repo_name1");
+        await test.repo_name1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_name2");
+        meth = locl.addMethod("repo_name2");
+        await test.repo_name2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_name3");
+        meth = locl.addMethod("repo_name3");
+        await test.repo_name3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_name4");
+        meth = locl.addMethod("repo_name4");
+        await test.repo_name4();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_name5");
+        meth = locl.addMethod("repo_name5");
+        await test.repo_name5();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_address1");
+        meth = locl.addMethod("repo_address1");
+        await test.repo_address1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_address2");
+        meth = locl.addMethod("repo_address2");
+        await test.repo_address2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_address3");
+        meth = locl.addMethod("repo_address3");
+        await test.repo_address3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_address4");
+        meth = locl.addMethod("repo_address4");
+        await test.repo_address4();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_address5_dots");
+        meth = locl.addMethod("repo_address5_dots");
+        await test.repo_address5_dots();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_address6_dots_and_git");
+        meth = locl.addMethod("repo_address6_dots_and_git");
+        await test.repo_address6_dots_and_git();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->repo_error");
+        meth = locl.addMethod("repo_error");
+        await test.repo_error();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->url_validate1");
+        meth = locl.addMethod("url_validate1");
+        await test.url_validate1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->url_validate2");
+        meth = locl.addMethod("url_validate2");
+        await test.url_validate2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_URL: running ltcl_test->url_validate3");
+        meth = locl.addMethod("url_validate3");
+        await test.url_validate3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_USER_RECORD");
+    {
+        const {ltcl_user_record} = await import("./zcl_abapgit_user_record.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_user_record");
+        if (ltcl_user_record.class_setup) await ltcl_user_record.class_setup();
+  console.log('ZCL_ABAPGIT_USER_RECORD: running ltcl_user_record->test_invalid_user, skipped');
+  meth = locl.addMethod("test_invalid_user");
+  meth.skip();
+      if (ltcl_user_record.class_teardown) await ltcl_user_record.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_UTILS");
+    {
+        const {ltcl_is_binary} = await import("./zcl_abapgit_utils.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_is_binary");
+        if (ltcl_is_binary.class_setup) await ltcl_is_binary.class_setup();
+      {
+        const test = await (new ltcl_is_binary()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_UTILS: running ltcl_is_binary->cds_metadata_is_text");
+        meth = locl.addMethod("cds_metadata_is_text");
+        await test.cds_metadata_is_text();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_is_binary()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_UTILS: running ltcl_is_binary->cds_with_umlaut_is_text");
+        meth = locl.addMethod("cds_with_umlaut_is_text");
+        await test.cds_with_umlaut_is_text();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_is_binary()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_UTILS: running ltcl_is_binary->image_is_binary");
+        meth = locl.addMethod("image_is_binary");
+        await test.image_is_binary();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_is_binary.class_teardown) await ltcl_is_binary.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_VERSION");
+    {
+        const {ltcl_version} = await import("./zcl_abapgit_version.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_version");
+        if (ltcl_version.class_setup) await ltcl_version.class_setup();
+      {
+        const test = await (new ltcl_version()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_VERSION: running ltcl_version->version_to_numeric");
+        meth = locl.addMethod("version_to_numeric");
+        await test.version_to_numeric();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_version()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_VERSION: running ltcl_version->compare");
+        meth = locl.addMethod("compare");
+        await test.compare();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_version()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_VERSION: running ltcl_version->normalize");
+        meth = locl.addMethod("normalize");
+        await test.normalize();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_version.class_teardown) await ltcl_version.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_XML");
+    {
+        const {ltcl_xml} = await import("./zcl_abapgit_xml.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_xml");
+        if (ltcl_xml.class_setup) await ltcl_xml.class_setup();
+  console.log('ZCL_ABAPGIT_XML: running ltcl_xml->space_leading_trailing, skipped');
+  meth = locl.addMethod("space_leading_trailing");
+  meth.skip();
+      {
+        const test = await (new ltcl_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_XML: running ltcl_xml->bad_version_raises_exc");
+        meth = locl.addMethod("bad_version_raises_exc");
+        await test.bad_version_raises_exc();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+  console.log('ZCL_ABAPGIT_XML: running ltcl_xml->bad_xml_raises_exc, skipped');
+  meth = locl.addMethod("bad_xml_raises_exc");
+  meth.skip();
+      if (ltcl_xml.class_teardown) await ltcl_xml.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_XML_INPUT");
+    {
+        const {ltcl_xml} = await import("./zcl_abapgit_xml_input.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_xml");
+        if (ltcl_xml.class_setup) await ltcl_xml.class_setup();
+  console.log('ZCL_ABAPGIT_XML_INPUT: running ltcl_xml->up, skipped');
+  meth = locl.addMethod("up");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_XML_INPUT: running ltcl_xml->empty, skipped');
+  meth = locl.addMethod("empty");
+  meth.skip();
+      {
+        const test = await (new ltcl_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_XML_INPUT: running ltcl_xml->input");
+        meth = locl.addMethod("input");
+        await test.input();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_xml()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_XML_INPUT: running ltcl_xml->read_intf");
+        meth = locl.addMethod("read_intf");
+        await test.read_intf();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+  console.log('ZCL_ABAPGIT_XML_INPUT: running ltcl_xml->down, skipped');
+  meth = locl.addMethod("down");
+  meth.skip();
+      if (ltcl_xml.class_teardown) await ltcl_xml.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_XML_OUTPUT");
+    {
+        const {ltcl_xml_output} = await import("./zcl_abapgit_xml_output.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_xml_output");
+        if (ltcl_xml_output.class_setup) await ltcl_xml_output.class_setup();
+  console.log('ZCL_ABAPGIT_XML_OUTPUT: running ltcl_xml_output->render_xml_string, skipped');
+  meth = locl.addMethod("render_xml_string");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_XML_OUTPUT: running ltcl_xml_output->add_simple_object, skipped');
+  meth = locl.addMethod("add_simple_object");
+  meth.skip();
+      if (ltcl_xml_output.class_teardown) await ltcl_xml_output.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_XML_PRETTY");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_xml_pretty.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+  console.log('ZCL_ABAPGIT_XML_PRETTY: running ltcl_test->pretty1, skipped');
+  meth = locl.addMethod("pretty1");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_XML_PRETTY: running ltcl_test->pretty2, skipped');
+  meth = locl.addMethod("pretty2");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_XML_PRETTY: running ltcl_test->pretty3, skipped');
+  meth = locl.addMethod("pretty3");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_XML_PRETTY: running ltcl_test->malformatted, skipped');
+  meth = locl.addMethod("malformatted");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_XML_PRETTY: running ltcl_test->dont_ignore_error, skipped');
+  meth = locl.addMethod("dont_ignore_error");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_XML_PRETTY: running ltcl_test->unpretty, skipped');
+  meth = locl.addMethod("unpretty");
+  meth.skip();
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_ZLIB");
+    {
+        const {ltcl_zlib} = await import("./zcl_abapgit_zlib.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_zlib");
+        if (ltcl_zlib.class_setup) await ltcl_zlib.class_setup();
+      {
+        const test = await (new ltcl_zlib()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB: running ltcl_zlib->fixed");
+        meth = locl.addMethod("fixed");
+        await test.fixed();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_zlib()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB: running ltcl_zlib->dynamic_simple");
+        meth = locl.addMethod("dynamic_simple");
+        await test.dynamic_simple();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_zlib()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB: running ltcl_zlib->dynamic_another");
+        meth = locl.addMethod("dynamic_another");
+        await test.dynamic_another();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_zlib()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB: running ltcl_zlib->dynamic");
+        meth = locl.addMethod("dynamic");
+        await test.dynamic();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_zlib()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB: running ltcl_zlib->not_compressed");
+        meth = locl.addMethod("not_compressed");
+        await test.not_compressed();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_zlib.class_teardown) await ltcl_zlib.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_ZLIB_CONVERT");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_zlib_convert.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB_CONVERT: running ltcl_test->bits_to_int");
+        meth = locl.addMethod("bits_to_int");
+        await test.bits_to_int();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB_CONVERT: running ltcl_test->hex_to_bits");
+        meth = locl.addMethod("hex_to_bits");
+        await test.hex_to_bits();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB_CONVERT: running ltcl_test->int_to_hex");
+        meth = locl.addMethod("int_to_hex");
+        await test.int_to_hex();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_ZLIB_HUFFMAN");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_zlib_huffman.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB_HUFFMAN: running ltcl_test->create1");
+        meth = locl.addMethod("create1");
+        await test.create1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB_HUFFMAN: running ltcl_test->create2");
+        meth = locl.addMethod("create2");
+        await test.create2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_ZLIB_STREAM");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_zlib_stream.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_ZLIB_STREAM: running ltcl_test->test");
+        meth = locl.addMethod("test");
+        await test.test();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCX_ABAPGIT_AJSON_ERROR");
+    {
+        const {ltcl_error} = await import("./zcx_abapgit_ajson_error.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_error");
+        if (ltcl_error.class_setup) await ltcl_error.class_setup();
+      {
+        const test = await (new ltcl_error()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_AJSON_ERROR: running ltcl_error->raise");
+        meth = locl.addMethod("raise");
+        await test.raise();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_error()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_AJSON_ERROR: running ltcl_error->raise_w_location");
+        meth = locl.addMethod("raise_w_location");
+        await test.raise_w_location();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_error()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_AJSON_ERROR: running ltcl_error->raise_w_node");
+        meth = locl.addMethod("raise_w_node");
+        await test.raise_w_node();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_error()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_AJSON_ERROR: running ltcl_error->set_location");
+        meth = locl.addMethod("set_location");
+        await test.set_location();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_error.class_teardown) await ltcl_error.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCX_ABAPGIT_EXCEPTION");
+    {
+        const {ltcl_general} = await import("./zcx_abapgit_exception.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_general");
+        if (ltcl_general.class_setup) await ltcl_general.class_setup();
+      {
+        const test = await (new ltcl_general()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_general->direct_text");
+        meth = locl.addMethod("direct_text");
+        await test.direct_text();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_general()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_general->no_text");
+        meth = locl.addMethod("no_text");
+        await test.no_text();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_general()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_general->text_from_exception");
+        meth = locl.addMethod("text_from_exception");
+        await test.text_from_exception();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_general.class_teardown) await ltcl_general.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCX_ABAPGIT_EXCEPTION");
+    {
+        const {ltcl_t100} = await import("./zcx_abapgit_exception.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_t100");
+        if (ltcl_t100.class_setup) await ltcl_t100.class_setup();
+      {
+        const test = await (new ltcl_t100()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_t100->text1");
+        meth = locl.addMethod("text1");
+        await test.text1();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_t100()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_t100->text2");
+        meth = locl.addMethod("text2");
+        await test.text2();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_t100()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_t100->text3");
+        meth = locl.addMethod("text3");
+        await test.text3();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_t100()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_t100->text4");
+        meth = locl.addMethod("text4");
+        await test.text4();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_t100()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_t100->text5");
+        meth = locl.addMethod("text5");
+        await test.text5();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_t100()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_t100->text6");
+        meth = locl.addMethod("text6");
+        await test.text6();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_t100()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_t100->text7");
+        meth = locl.addMethod("text7");
+        await test.text7();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_t100()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_t100->text8");
+        meth = locl.addMethod("text8");
+        await test.text8();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_t100.class_teardown) await ltcl_t100.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCX_ABAPGIT_EXCEPTION");
+    {
+        const {ltcl_get_t100_longtext} = await import("./zcx_abapgit_exception.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_get_t100_longtext");
+        if (ltcl_get_t100_longtext.class_setup) await ltcl_get_t100_longtext.class_setup();
+  console.log('ZCX_ABAPGIT_EXCEPTION: running ltcl_get_t100_longtext->test01, skipped');
+  meth = locl.addMethod("test01");
+  meth.skip();
+      if (ltcl_get_t100_longtext.class_teardown) await ltcl_get_t100_longtext.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCX_ABAPGIT_EXCEPTION");
+    {
+        const {ltcl_split_text} = await import("./zcx_abapgit_exception.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_split_text");
+        if (ltcl_split_text.class_setup) await ltcl_split_text.class_setup();
+      {
+        const test = await (new ltcl_split_text()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_split_text->test_set_msg_b");
+        meth = locl.addMethod("test_set_msg_b");
+        await test.test_set_msg_b();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_split_text()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_split_text->test_set_msg_c");
+        meth = locl.addMethod("test_set_msg_c");
+        await test.test_set_msg_c();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_split_text()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_split_text->test_set_msg_d");
+        meth = locl.addMethod("test_set_msg_d");
+        await test.test_set_msg_d();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_split_text()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_split_text->test_set_msg_e");
+        meth = locl.addMethod("test_set_msg_e");
+        await test.test_set_msg_e();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_split_text()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_split_text->test_set_msg_z");
+        meth = locl.addMethod("test_set_msg_z");
+        await test.test_set_msg_z();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_split_text.class_teardown) await ltcl_split_text.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCX_ABAPGIT_EXCEPTION");
+    {
+        const {ltcl_longtext} = await import("./zcx_abapgit_exception.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_longtext");
+        if (ltcl_longtext.class_setup) await ltcl_longtext.class_setup();
+      {
+        const test = await (new ltcl_longtext()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_longtext->empty_longtext");
+        meth = locl.addMethod("empty_longtext");
+        await test.empty_longtext();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_longtext()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_longtext->longtext");
+        meth = locl.addMethod("longtext");
+        await test.longtext();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_longtext()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_longtext->multiline_longtext");
+        meth = locl.addMethod("multiline_longtext");
+        await test.multiline_longtext();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_longtext()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_longtext->t100_longtext_override");
+        meth = locl.addMethod("t100_longtext_override");
+        await test.t100_longtext_override();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      {
+        const test = await (new ltcl_longtext()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCX_ABAPGIT_EXCEPTION: running ltcl_longtext->text_from_previous_exception");
+        meth = locl.addMethod("text_from_previous_exception");
+        await test.text_from_previous_exception();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_longtext.class_teardown) await ltcl_longtext.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_INTEGRATION_GIT");
+    {
+        const {ltcl_test} = await import("./zcl_abapgit_integration_git.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_test");
+        if (ltcl_test.class_setup) await ltcl_test.class_setup();
+      {
+        const test = await (new ltcl_test()).constructor_();
+        if (test.setup) await test.setup();
+        console.log("ZCL_ABAPGIT_INTEGRATION_GIT: running ltcl_test->test01");
+        meth = locl.addMethod("test01");
+        await test.test01();
+        meth.pass();
+        if (test.teardown) await test.teardown();
+      }
+      if (ltcl_test.class_teardown) await ltcl_test.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_PERSISTENCE_USER");
+    {
+        const {ltcl_user} = await import("./zcl_abapgit_persistence_user.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_user");
+        if (ltcl_user.class_setup) await ltcl_user.class_setup();
+  console.log('ZCL_ABAPGIT_PERSISTENCE_USER: running ltcl_user->set_get_git_user, skipped');
+  meth = locl.addMethod("set_get_git_user");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_PERSISTENCE_USER: running ltcl_user->set_get_repo_show, skipped');
+  meth = locl.addMethod("set_get_repo_show");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_PERSISTENCE_USER: running ltcl_user->set_get_settings, skipped');
+  meth = locl.addMethod("set_get_settings");
+  meth.skip();
+  console.log('ZCL_ABAPGIT_PERSISTENCE_USER: running ltcl_user->set_get_repo_login, skipped');
+  meth = locl.addMethod("set_get_repo_login");
+  meth.skip();
+      if (ltcl_user.class_teardown) await ltcl_user.class_teardown();
+    }
+// --------------------------------------------
+    clas = unit.addObject("ZCL_ABAPGIT_PERSIST_PACKAGES");
+    {
+        const {ltcl_packages} = await import("./zcl_abapgit_persist_packages.clas.testclasses.mjs");
+        locl = clas.addTestClass("ltcl_packages");
+        if (ltcl_packages.class_setup) await ltcl_packages.class_setup();
+  console.log('ZCL_ABAPGIT_PERSIST_PACKAGES: running ltcl_packages->test_package, skipped');
+  meth = locl.addMethod("test_package");
+  meth.skip();
+      if (ltcl_packages.class_teardown) await ltcl_packages.class_teardown();
+    }
+// -------------------END-------------------
+    fs.writeFileSync(__dirname + path.sep + "_output.xml", unit.xUnitXML());
+  } catch (e) {
+    if (meth) {
+      meth.fail();
+    }
+    fs.writeFileSync(__dirname + path.sep + "_output.xml", unit.xUnitXML());
+    throw e;
+  }
+}
+ 
+run().then(() => {
+  process.exit(0);
+}).catch((err) => {
+  console.log(err);
+  process.exit(1);
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/init.mjs.html b/output/init.mjs.html new file mode 100644 index 00000000000..81060384ee8 --- /dev/null +++ b/output/init.mjs.html @@ -0,0 +1,243796 @@ + + + + + + Code coverage report for output/init.mjs + + + + + + + + + +
+
+

All files / output init.mjs

+
+ +
+ 100% + Statements + 81238/81238 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 81238/81238 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039 +2040 +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056 +2057 +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072 +2073 +2074 +2075 +2076 +2077 +2078 +2079 +2080 +2081 +2082 +2083 +2084 +2085 +2086 +2087 +2088 +2089 +2090 +2091 +2092 +2093 +2094 +2095 +2096 +2097 +2098 +2099 +2100 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +2109 +2110 +2111 +2112 +2113 +2114 +2115 +2116 +2117 +2118 +2119 +2120 +2121 +2122 +2123 +2124 +2125 +2126 +2127 +2128 +2129 +2130 +2131 +2132 +2133 +2134 +2135 +2136 +2137 +2138 +2139 +2140 +2141 +2142 +2143 +2144 +2145 +2146 +2147 +2148 +2149 +2150 +2151 +2152 +2153 +2154 +2155 +2156 +2157 +2158 +2159 +2160 +2161 +2162 +2163 +2164 +2165 +2166 +2167 +2168 +2169 +2170 +2171 +2172 +2173 +2174 +2175 +2176 +2177 +2178 +2179 +2180 +2181 +2182 +2183 +2184 +2185 +2186 +2187 +2188 +2189 +2190 +2191 +2192 +2193 +2194 +2195 +2196 +2197 +2198 +2199 +2200 +2201 +2202 +2203 +2204 +2205 +2206 +2207 +2208 +2209 +2210 +2211 +2212 +2213 +2214 +2215 +2216 +2217 +2218 +2219 +2220 +2221 +2222 +2223 +2224 +2225 +2226 +2227 +2228 +2229 +2230 +2231 +2232 +2233 +2234 +2235 +2236 +2237 +2238 +2239 +2240 +2241 +2242 +2243 +2244 +2245 +2246 +2247 +2248 +2249 +2250 +2251 +2252 +2253 +2254 +2255 +2256 +2257 +2258 +2259 +2260 +2261 +2262 +2263 +2264 +2265 +2266 +2267 +2268 +2269 +2270 +2271 +2272 +2273 +2274 +2275 +2276 +2277 +2278 +2279 +2280 +2281 +2282 +2283 +2284 +2285 +2286 +2287 +2288 +2289 +2290 +2291 +2292 +2293 +2294 +2295 +2296 +2297 +2298 +2299 +2300 +2301 +2302 +2303 +2304 +2305 +2306 +2307 +2308 +2309 +2310 +2311 +2312 +2313 +2314 +2315 +2316 +2317 +2318 +2319 +2320 +2321 +2322 +2323 +2324 +2325 +2326 +2327 +2328 +2329 +2330 +2331 +2332 +2333 +2334 +2335 +2336 +2337 +2338 +2339 +2340 +2341 +2342 +2343 +2344 +2345 +2346 +2347 +2348 +2349 +2350 +2351 +2352 +2353 +2354 +2355 +2356 +2357 +2358 +2359 +2360 +2361 +2362 +2363 +2364 +2365 +2366 +2367 +2368 +2369 +2370 +2371 +2372 +2373 +2374 +2375 +2376 +2377 +2378 +2379 +2380 +2381 +2382 +2383 +2384 +2385 +2386 +2387 +2388 +2389 +2390 +2391 +2392 +2393 +2394 +2395 +2396 +2397 +2398 +2399 +2400 +2401 +2402 +2403 +2404 +2405 +2406 +2407 +2408 +2409 +2410 +2411 +2412 +2413 +2414 +2415 +2416 +2417 +2418 +2419 +2420 +2421 +2422 +2423 +2424 +2425 +2426 +2427 +2428 +2429 +2430 +2431 +2432 +2433 +2434 +2435 +2436 +2437 +2438 +2439 +2440 +2441 +2442 +2443 +2444 +2445 +2446 +2447 +2448 +2449 +2450 +2451 +2452 +2453 +2454 +2455 +2456 +2457 +2458 +2459 +2460 +2461 +2462 +2463 +2464 +2465 +2466 +2467 +2468 +2469 +2470 +2471 +2472 +2473 +2474 +2475 +2476 +2477 +2478 +2479 +2480 +2481 +2482 +2483 +2484 +2485 +2486 +2487 +2488 +2489 +2490 +2491 +2492 +2493 +2494 +2495 +2496 +2497 +2498 +2499 +2500 +2501 +2502 +2503 +2504 +2505 +2506 +2507 +2508 +2509 +2510 +2511 +2512 +2513 +2514 +2515 +2516 +2517 +2518 +2519 +2520 +2521 +2522 +2523 +2524 +2525 +2526 +2527 +2528 +2529 +2530 +2531 +2532 +2533 +2534 +2535 +2536 +2537 +2538 +2539 +2540 +2541 +2542 +2543 +2544 +2545 +2546 +2547 +2548 +2549 +2550 +2551 +2552 +2553 +2554 +2555 +2556 +2557 +2558 +2559 +2560 +2561 +2562 +2563 +2564 +2565 +2566 +2567 +2568 +2569 +2570 +2571 +2572 +2573 +2574 +2575 +2576 +2577 +2578 +2579 +2580 +2581 +2582 +2583 +2584 +2585 +2586 +2587 +2588 +2589 +2590 +2591 +2592 +2593 +2594 +2595 +2596 +2597 +2598 +2599 +2600 +2601 +2602 +2603 +2604 +2605 +2606 +2607 +2608 +2609 +2610 +2611 +2612 +2613 +2614 +2615 +2616 +2617 +2618 +2619 +2620 +2621 +2622 +2623 +2624 +2625 +2626 +2627 +2628 +2629 +2630 +2631 +2632 +2633 +2634 +2635 +2636 +2637 +2638 +2639 +2640 +2641 +2642 +2643 +2644 +2645 +2646 +2647 +2648 +2649 +2650 +2651 +2652 +2653 +2654 +2655 +2656 +2657 +2658 +2659 +2660 +2661 +2662 +2663 +2664 +2665 +2666 +2667 +2668 +2669 +2670 +2671 +2672 +2673 +2674 +2675 +2676 +2677 +2678 +2679 +2680 +2681 +2682 +2683 +2684 +2685 +2686 +2687 +2688 +2689 +2690 +2691 +2692 +2693 +2694 +2695 +2696 +2697 +2698 +2699 +2700 +2701 +2702 +2703 +2704 +2705 +2706 +2707 +2708 +2709 +2710 +2711 +2712 +2713 +2714 +2715 +2716 +2717 +2718 +2719 +2720 +2721 +2722 +2723 +2724 +2725 +2726 +2727 +2728 +2729 +2730 +2731 +2732 +2733 +2734 +2735 +2736 +2737 +2738 +2739 +2740 +2741 +2742 +2743 +2744 +2745 +2746 +2747 +2748 +2749 +2750 +2751 +2752 +2753 +2754 +2755 +2756 +2757 +2758 +2759 +2760 +2761 +2762 +2763 +2764 +2765 +2766 +2767 +2768 +2769 +2770 +2771 +2772 +2773 +2774 +2775 +2776 +2777 +2778 +2779 +2780 +2781 +2782 +2783 +2784 +2785 +2786 +2787 +2788 +2789 +2790 +2791 +2792 +2793 +2794 +2795 +2796 +2797 +2798 +2799 +2800 +2801 +2802 +2803 +2804 +2805 +2806 +2807 +2808 +2809 +2810 +2811 +2812 +2813 +2814 +2815 +2816 +2817 +2818 +2819 +2820 +2821 +2822 +2823 +2824 +2825 +2826 +2827 +2828 +2829 +2830 +2831 +2832 +2833 +2834 +2835 +2836 +2837 +2838 +2839 +2840 +2841 +2842 +2843 +2844 +2845 +2846 +2847 +2848 +2849 +2850 +2851 +2852 +2853 +2854 +2855 +2856 +2857 +2858 +2859 +2860 +2861 +2862 +2863 +2864 +2865 +2866 +2867 +2868 +2869 +2870 +2871 +2872 +2873 +2874 +2875 +2876 +2877 +2878 +2879 +2880 +2881 +2882 +2883 +2884 +2885 +2886 +2887 +2888 +2889 +2890 +2891 +2892 +2893 +2894 +2895 +2896 +2897 +2898 +2899 +2900 +2901 +2902 +2903 +2904 +2905 +2906 +2907 +2908 +2909 +2910 +2911 +2912 +2913 +2914 +2915 +2916 +2917 +2918 +2919 +2920 +2921 +2922 +2923 +2924 +2925 +2926 +2927 +2928 +2929 +2930 +2931 +2932 +2933 +2934 +2935 +2936 +2937 +2938 +2939 +2940 +2941 +2942 +2943 +2944 +2945 +2946 +2947 +2948 +2949 +2950 +2951 +2952 +2953 +2954 +2955 +2956 +2957 +2958 +2959 +2960 +2961 +2962 +2963 +2964 +2965 +2966 +2967 +2968 +2969 +2970 +2971 +2972 +2973 +2974 +2975 +2976 +2977 +2978 +2979 +2980 +2981 +2982 +2983 +2984 +2985 +2986 +2987 +2988 +2989 +2990 +2991 +2992 +2993 +2994 +2995 +2996 +2997 +2998 +2999 +3000 +3001 +3002 +3003 +3004 +3005 +3006 +3007 +3008 +3009 +3010 +3011 +3012 +3013 +3014 +3015 +3016 +3017 +3018 +3019 +3020 +3021 +3022 +3023 +3024 +3025 +3026 +3027 +3028 +3029 +3030 +3031 +3032 +3033 +3034 +3035 +3036 +3037 +3038 +3039 +3040 +3041 +3042 +3043 +3044 +3045 +3046 +3047 +3048 +3049 +3050 +3051 +3052 +3053 +3054 +3055 +3056 +3057 +3058 +3059 +3060 +3061 +3062 +3063 +3064 +3065 +3066 +3067 +3068 +3069 +3070 +3071 +3072 +3073 +3074 +3075 +3076 +3077 +3078 +3079 +3080 +3081 +3082 +3083 +3084 +3085 +3086 +3087 +3088 +3089 +3090 +3091 +3092 +3093 +3094 +3095 +3096 +3097 +3098 +3099 +3100 +3101 +3102 +3103 +3104 +3105 +3106 +3107 +3108 +3109 +3110 +3111 +3112 +3113 +3114 +3115 +3116 +3117 +3118 +3119 +3120 +3121 +3122 +3123 +3124 +3125 +3126 +3127 +3128 +3129 +3130 +3131 +3132 +3133 +3134 +3135 +3136 +3137 +3138 +3139 +3140 +3141 +3142 +3143 +3144 +3145 +3146 +3147 +3148 +3149 +3150 +3151 +3152 +3153 +3154 +3155 +3156 +3157 +3158 +3159 +3160 +3161 +3162 +3163 +3164 +3165 +3166 +3167 +3168 +3169 +3170 +3171 +3172 +3173 +3174 +3175 +3176 +3177 +3178 +3179 +3180 +3181 +3182 +3183 +3184 +3185 +3186 +3187 +3188 +3189 +3190 +3191 +3192 +3193 +3194 +3195 +3196 +3197 +3198 +3199 +3200 +3201 +3202 +3203 +3204 +3205 +3206 +3207 +3208 +3209 +3210 +3211 +3212 +3213 +3214 +3215 +3216 +3217 +3218 +3219 +3220 +3221 +3222 +3223 +3224 +3225 +3226 +3227 +3228 +3229 +3230 +3231 +3232 +3233 +3234 +3235 +3236 +3237 +3238 +3239 +3240 +3241 +3242 +3243 +3244 +3245 +3246 +3247 +3248 +3249 +3250 +3251 +3252 +3253 +3254 +3255 +3256 +3257 +3258 +3259 +3260 +3261 +3262 +3263 +3264 +3265 +3266 +3267 +3268 +3269 +3270 +3271 +3272 +3273 +3274 +3275 +3276 +3277 +3278 +3279 +3280 +3281 +3282 +3283 +3284 +3285 +3286 +3287 +3288 +3289 +3290 +3291 +3292 +3293 +3294 +3295 +3296 +3297 +3298 +3299 +3300 +3301 +3302 +3303 +3304 +3305 +3306 +3307 +3308 +3309 +3310 +3311 +3312 +3313 +3314 +3315 +3316 +3317 +3318 +3319 +3320 +3321 +3322 +3323 +3324 +3325 +3326 +3327 +3328 +3329 +3330 +3331 +3332 +3333 +3334 +3335 +3336 +3337 +3338 +3339 +3340 +3341 +3342 +3343 +3344 +3345 +3346 +3347 +3348 +3349 +3350 +3351 +3352 +3353 +3354 +3355 +3356 +3357 +3358 +3359 +3360 +3361 +3362 +3363 +3364 +3365 +3366 +3367 +3368 +3369 +3370 +3371 +3372 +3373 +3374 +3375 +3376 +3377 +3378 +3379 +3380 +3381 +3382 +3383 +3384 +3385 +3386 +3387 +3388 +3389 +3390 +3391 +3392 +3393 +3394 +3395 +3396 +3397 +3398 +3399 +3400 +3401 +3402 +3403 +3404 +3405 +3406 +3407 +3408 +3409 +3410 +3411 +3412 +3413 +3414 +3415 +3416 +3417 +3418 +3419 +3420 +3421 +3422 +3423 +3424 +3425 +3426 +3427 +3428 +3429 +3430 +3431 +3432 +3433 +3434 +3435 +3436 +3437 +3438 +3439 +3440 +3441 +3442 +3443 +3444 +3445 +3446 +3447 +3448 +3449 +3450 +3451 +3452 +3453 +3454 +3455 +3456 +3457 +3458 +3459 +3460 +3461 +3462 +3463 +3464 +3465 +3466 +3467 +3468 +3469 +3470 +3471 +3472 +3473 +3474 +3475 +3476 +3477 +3478 +3479 +3480 +3481 +3482 +3483 +3484 +3485 +3486 +3487 +3488 +3489 +3490 +3491 +3492 +3493 +3494 +3495 +3496 +3497 +3498 +3499 +3500 +3501 +3502 +3503 +3504 +3505 +3506 +3507 +3508 +3509 +3510 +3511 +3512 +3513 +3514 +3515 +3516 +3517 +3518 +3519 +3520 +3521 +3522 +3523 +3524 +3525 +3526 +3527 +3528 +3529 +3530 +3531 +3532 +3533 +3534 +3535 +3536 +3537 +3538 +3539 +3540 +3541 +3542 +3543 +3544 +3545 +3546 +3547 +3548 +3549 +3550 +3551 +3552 +3553 +3554 +3555 +3556 +3557 +3558 +3559 +3560 +3561 +3562 +3563 +3564 +3565 +3566 +3567 +3568 +3569 +3570 +3571 +3572 +3573 +3574 +3575 +3576 +3577 +3578 +3579 +3580 +3581 +3582 +3583 +3584 +3585 +3586 +3587 +3588 +3589 +3590 +3591 +3592 +3593 +3594 +3595 +3596 +3597 +3598 +3599 +3600 +3601 +3602 +3603 +3604 +3605 +3606 +3607 +3608 +3609 +3610 +3611 +3612 +3613 +3614 +3615 +3616 +3617 +3618 +3619 +3620 +3621 +3622 +3623 +3624 +3625 +3626 +3627 +3628 +3629 +3630 +3631 +3632 +3633 +3634 +3635 +3636 +3637 +3638 +3639 +3640 +3641 +3642 +3643 +3644 +3645 +3646 +3647 +3648 +3649 +3650 +3651 +3652 +3653 +3654 +3655 +3656 +3657 +3658 +3659 +3660 +3661 +3662 +3663 +3664 +3665 +3666 +3667 +3668 +3669 +3670 +3671 +3672 +3673 +3674 +3675 +3676 +3677 +3678 +3679 +3680 +3681 +3682 +3683 +3684 +3685 +3686 +3687 +3688 +3689 +3690 +3691 +3692 +3693 +3694 +3695 +3696 +3697 +3698 +3699 +3700 +3701 +3702 +3703 +3704 +3705 +3706 +3707 +3708 +3709 +3710 +3711 +3712 +3713 +3714 +3715 +3716 +3717 +3718 +3719 +3720 +3721 +3722 +3723 +3724 +3725 +3726 +3727 +3728 +3729 +3730 +3731 +3732 +3733 +3734 +3735 +3736 +3737 +3738 +3739 +3740 +3741 +3742 +3743 +3744 +3745 +3746 +3747 +3748 +3749 +3750 +3751 +3752 +3753 +3754 +3755 +3756 +3757 +3758 +3759 +3760 +3761 +3762 +3763 +3764 +3765 +3766 +3767 +3768 +3769 +3770 +3771 +3772 +3773 +3774 +3775 +3776 +3777 +3778 +3779 +3780 +3781 +3782 +3783 +3784 +3785 +3786 +3787 +3788 +3789 +3790 +3791 +3792 +3793 +3794 +3795 +3796 +3797 +3798 +3799 +3800 +3801 +3802 +3803 +3804 +3805 +3806 +3807 +3808 +3809 +3810 +3811 +3812 +3813 +3814 +3815 +3816 +3817 +3818 +3819 +3820 +3821 +3822 +3823 +3824 +3825 +3826 +3827 +3828 +3829 +3830 +3831 +3832 +3833 +3834 +3835 +3836 +3837 +3838 +3839 +3840 +3841 +3842 +3843 +3844 +3845 +3846 +3847 +3848 +3849 +3850 +3851 +3852 +3853 +3854 +3855 +3856 +3857 +3858 +3859 +3860 +3861 +3862 +3863 +3864 +3865 +3866 +3867 +3868 +3869 +3870 +3871 +3872 +3873 +3874 +3875 +3876 +3877 +3878 +3879 +3880 +3881 +3882 +3883 +3884 +3885 +3886 +3887 +3888 +3889 +3890 +3891 +3892 +3893 +3894 +3895 +3896 +3897 +3898 +3899 +3900 +3901 +3902 +3903 +3904 +3905 +3906 +3907 +3908 +3909 +3910 +3911 +3912 +3913 +3914 +3915 +3916 +3917 +3918 +3919 +3920 +3921 +3922 +3923 +3924 +3925 +3926 +3927 +3928 +3929 +3930 +3931 +3932 +3933 +3934 +3935 +3936 +3937 +3938 +3939 +3940 +3941 +3942 +3943 +3944 +3945 +3946 +3947 +3948 +3949 +3950 +3951 +3952 +3953 +3954 +3955 +3956 +3957 +3958 +3959 +3960 +3961 +3962 +3963 +3964 +3965 +3966 +3967 +3968 +3969 +3970 +3971 +3972 +3973 +3974 +3975 +3976 +3977 +3978 +3979 +3980 +3981 +3982 +3983 +3984 +3985 +3986 +3987 +3988 +3989 +3990 +3991 +3992 +3993 +3994 +3995 +3996 +3997 +3998 +3999 +4000 +4001 +4002 +4003 +4004 +4005 +4006 +4007 +4008 +4009 +4010 +4011 +4012 +4013 +4014 +4015 +4016 +4017 +4018 +4019 +4020 +4021 +4022 +4023 +4024 +4025 +4026 +4027 +4028 +4029 +4030 +4031 +4032 +4033 +4034 +4035 +4036 +4037 +4038 +4039 +4040 +4041 +4042 +4043 +4044 +4045 +4046 +4047 +4048 +4049 +4050 +4051 +4052 +4053 +4054 +4055 +4056 +4057 +4058 +4059 +4060 +4061 +4062 +4063 +4064 +4065 +4066 +4067 +4068 +4069 +4070 +4071 +4072 +4073 +4074 +4075 +4076 +4077 +4078 +4079 +4080 +4081 +4082 +4083 +4084 +4085 +4086 +4087 +4088 +4089 +4090 +4091 +4092 +4093 +4094 +4095 +4096 +4097 +4098 +4099 +4100 +4101 +4102 +4103 +4104 +4105 +4106 +4107 +4108 +4109 +4110 +4111 +4112 +4113 +4114 +4115 +4116 +4117 +4118 +4119 +4120 +4121 +4122 +4123 +4124 +4125 +4126 +4127 +4128 +4129 +4130 +4131 +4132 +4133 +4134 +4135 +4136 +4137 +4138 +4139 +4140 +4141 +4142 +4143 +4144 +4145 +4146 +4147 +4148 +4149 +4150 +4151 +4152 +4153 +4154 +4155 +4156 +4157 +4158 +4159 +4160 +4161 +4162 +4163 +4164 +4165 +4166 +4167 +4168 +4169 +4170 +4171 +4172 +4173 +4174 +4175 +4176 +4177 +4178 +4179 +4180 +4181 +4182 +4183 +4184 +4185 +4186 +4187 +4188 +4189 +4190 +4191 +4192 +4193 +4194 +4195 +4196 +4197 +4198 +4199 +4200 +4201 +4202 +4203 +4204 +4205 +4206 +4207 +4208 +4209 +4210 +4211 +4212 +4213 +4214 +4215 +4216 +4217 +4218 +4219 +4220 +4221 +4222 +4223 +4224 +4225 +4226 +4227 +4228 +4229 +4230 +4231 +4232 +4233 +4234 +4235 +4236 +4237 +4238 +4239 +4240 +4241 +4242 +4243 +4244 +4245 +4246 +4247 +4248 +4249 +4250 +4251 +4252 +4253 +4254 +4255 +4256 +4257 +4258 +4259 +4260 +4261 +4262 +4263 +4264 +4265 +4266 +4267 +4268 +4269 +4270 +4271 +4272 +4273 +4274 +4275 +4276 +4277 +4278 +4279 +4280 +4281 +4282 +4283 +4284 +4285 +4286 +4287 +4288 +4289 +4290 +4291 +4292 +4293 +4294 +4295 +4296 +4297 +4298 +4299 +4300 +4301 +4302 +4303 +4304 +4305 +4306 +4307 +4308 +4309 +4310 +4311 +4312 +4313 +4314 +4315 +4316 +4317 +4318 +4319 +4320 +4321 +4322 +4323 +4324 +4325 +4326 +4327 +4328 +4329 +4330 +4331 +4332 +4333 +4334 +4335 +4336 +4337 +4338 +4339 +4340 +4341 +4342 +4343 +4344 +4345 +4346 +4347 +4348 +4349 +4350 +4351 +4352 +4353 +4354 +4355 +4356 +4357 +4358 +4359 +4360 +4361 +4362 +4363 +4364 +4365 +4366 +4367 +4368 +4369 +4370 +4371 +4372 +4373 +4374 +4375 +4376 +4377 +4378 +4379 +4380 +4381 +4382 +4383 +4384 +4385 +4386 +4387 +4388 +4389 +4390 +4391 +4392 +4393 +4394 +4395 +4396 +4397 +4398 +4399 +4400 +4401 +4402 +4403 +4404 +4405 +4406 +4407 +4408 +4409 +4410 +4411 +4412 +4413 +4414 +4415 +4416 +4417 +4418 +4419 +4420 +4421 +4422 +4423 +4424 +4425 +4426 +4427 +4428 +4429 +4430 +4431 +4432 +4433 +4434 +4435 +4436 +4437 +4438 +4439 +4440 +4441 +4442 +4443 +4444 +4445 +4446 +4447 +4448 +4449 +4450 +4451 +4452 +4453 +4454 +4455 +4456 +4457 +4458 +4459 +4460 +4461 +4462 +4463 +4464 +4465 +4466 +4467 +4468 +4469 +4470 +4471 +4472 +4473 +4474 +4475 +4476 +4477 +4478 +4479 +4480 +4481 +4482 +4483 +4484 +4485 +4486 +4487 +4488 +4489 +4490 +4491 +4492 +4493 +4494 +4495 +4496 +4497 +4498 +4499 +4500 +4501 +4502 +4503 +4504 +4505 +4506 +4507 +4508 +4509 +4510 +4511 +4512 +4513 +4514 +4515 +4516 +4517 +4518 +4519 +4520 +4521 +4522 +4523 +4524 +4525 +4526 +4527 +4528 +4529 +4530 +4531 +4532 +4533 +4534 +4535 +4536 +4537 +4538 +4539 +4540 +4541 +4542 +4543 +4544 +4545 +4546 +4547 +4548 +4549 +4550 +4551 +4552 +4553 +4554 +4555 +4556 +4557 +4558 +4559 +4560 +4561 +4562 +4563 +4564 +4565 +4566 +4567 +4568 +4569 +4570 +4571 +4572 +4573 +4574 +4575 +4576 +4577 +4578 +4579 +4580 +4581 +4582 +4583 +4584 +4585 +4586 +4587 +4588 +4589 +4590 +4591 +4592 +4593 +4594 +4595 +4596 +4597 +4598 +4599 +4600 +4601 +4602 +4603 +4604 +4605 +4606 +4607 +4608 +4609 +4610 +4611 +4612 +4613 +4614 +4615 +4616 +4617 +4618 +4619 +4620 +4621 +4622 +4623 +4624 +4625 +4626 +4627 +4628 +4629 +4630 +4631 +4632 +4633 +4634 +4635 +4636 +4637 +4638 +4639 +4640 +4641 +4642 +4643 +4644 +4645 +4646 +4647 +4648 +4649 +4650 +4651 +4652 +4653 +4654 +4655 +4656 +4657 +4658 +4659 +4660 +4661 +4662 +4663 +4664 +4665 +4666 +4667 +4668 +4669 +4670 +4671 +4672 +4673 +4674 +4675 +4676 +4677 +4678 +4679 +4680 +4681 +4682 +4683 +4684 +4685 +4686 +4687 +4688 +4689 +4690 +4691 +4692 +4693 +4694 +4695 +4696 +4697 +4698 +4699 +4700 +4701 +4702 +4703 +4704 +4705 +4706 +4707 +4708 +4709 +4710 +4711 +4712 +4713 +4714 +4715 +4716 +4717 +4718 +4719 +4720 +4721 +4722 +4723 +4724 +4725 +4726 +4727 +4728 +4729 +4730 +4731 +4732 +4733 +4734 +4735 +4736 +4737 +4738 +4739 +4740 +4741 +4742 +4743 +4744 +4745 +4746 +4747 +4748 +4749 +4750 +4751 +4752 +4753 +4754 +4755 +4756 +4757 +4758 +4759 +4760 +4761 +4762 +4763 +4764 +4765 +4766 +4767 +4768 +4769 +4770 +4771 +4772 +4773 +4774 +4775 +4776 +4777 +4778 +4779 +4780 +4781 +4782 +4783 +4784 +4785 +4786 +4787 +4788 +4789 +4790 +4791 +4792 +4793 +4794 +4795 +4796 +4797 +4798 +4799 +4800 +4801 +4802 +4803 +4804 +4805 +4806 +4807 +4808 +4809 +4810 +4811 +4812 +4813 +4814 +4815 +4816 +4817 +4818 +4819 +4820 +4821 +4822 +4823 +4824 +4825 +4826 +4827 +4828 +4829 +4830 +4831 +4832 +4833 +4834 +4835 +4836 +4837 +4838 +4839 +4840 +4841 +4842 +4843 +4844 +4845 +4846 +4847 +4848 +4849 +4850 +4851 +4852 +4853 +4854 +4855 +4856 +4857 +4858 +4859 +4860 +4861 +4862 +4863 +4864 +4865 +4866 +4867 +4868 +4869 +4870 +4871 +4872 +4873 +4874 +4875 +4876 +4877 +4878 +4879 +4880 +4881 +4882 +4883 +4884 +4885 +4886 +4887 +4888 +4889 +4890 +4891 +4892 +4893 +4894 +4895 +4896 +4897 +4898 +4899 +4900 +4901 +4902 +4903 +4904 +4905 +4906 +4907 +4908 +4909 +4910 +4911 +4912 +4913 +4914 +4915 +4916 +4917 +4918 +4919 +4920 +4921 +4922 +4923 +4924 +4925 +4926 +4927 +4928 +4929 +4930 +4931 +4932 +4933 +4934 +4935 +4936 +4937 +4938 +4939 +4940 +4941 +4942 +4943 +4944 +4945 +4946 +4947 +4948 +4949 +4950 +4951 +4952 +4953 +4954 +4955 +4956 +4957 +4958 +4959 +4960 +4961 +4962 +4963 +4964 +4965 +4966 +4967 +4968 +4969 +4970 +4971 +4972 +4973 +4974 +4975 +4976 +4977 +4978 +4979 +4980 +4981 +4982 +4983 +4984 +4985 +4986 +4987 +4988 +4989 +4990 +4991 +4992 +4993 +4994 +4995 +4996 +4997 +4998 +4999 +5000 +5001 +5002 +5003 +5004 +5005 +5006 +5007 +5008 +5009 +5010 +5011 +5012 +5013 +5014 +5015 +5016 +5017 +5018 +5019 +5020 +5021 +5022 +5023 +5024 +5025 +5026 +5027 +5028 +5029 +5030 +5031 +5032 +5033 +5034 +5035 +5036 +5037 +5038 +5039 +5040 +5041 +5042 +5043 +5044 +5045 +5046 +5047 +5048 +5049 +5050 +5051 +5052 +5053 +5054 +5055 +5056 +5057 +5058 +5059 +5060 +5061 +5062 +5063 +5064 +5065 +5066 +5067 +5068 +5069 +5070 +5071 +5072 +5073 +5074 +5075 +5076 +5077 +5078 +5079 +5080 +5081 +5082 +5083 +5084 +5085 +5086 +5087 +5088 +5089 +5090 +5091 +5092 +5093 +5094 +5095 +5096 +5097 +5098 +5099 +5100 +5101 +5102 +5103 +5104 +5105 +5106 +5107 +5108 +5109 +5110 +5111 +5112 +5113 +5114 +5115 +5116 +5117 +5118 +5119 +5120 +5121 +5122 +5123 +5124 +5125 +5126 +5127 +5128 +5129 +5130 +5131 +5132 +5133 +5134 +5135 +5136 +5137 +5138 +5139 +5140 +5141 +5142 +5143 +5144 +5145 +5146 +5147 +5148 +5149 +5150 +5151 +5152 +5153 +5154 +5155 +5156 +5157 +5158 +5159 +5160 +5161 +5162 +5163 +5164 +5165 +5166 +5167 +5168 +5169 +5170 +5171 +5172 +5173 +5174 +5175 +5176 +5177 +5178 +5179 +5180 +5181 +5182 +5183 +5184 +5185 +5186 +5187 +5188 +5189 +5190 +5191 +5192 +5193 +5194 +5195 +5196 +5197 +5198 +5199 +5200 +5201 +5202 +5203 +5204 +5205 +5206 +5207 +5208 +5209 +5210 +5211 +5212 +5213 +5214 +5215 +5216 +5217 +5218 +5219 +5220 +5221 +5222 +5223 +5224 +5225 +5226 +5227 +5228 +5229 +5230 +5231 +5232 +5233 +5234 +5235 +5236 +5237 +5238 +5239 +5240 +5241 +5242 +5243 +5244 +5245 +5246 +5247 +5248 +5249 +5250 +5251 +5252 +5253 +5254 +5255 +5256 +5257 +5258 +5259 +5260 +5261 +5262 +5263 +5264 +5265 +5266 +5267 +5268 +5269 +5270 +5271 +5272 +5273 +5274 +5275 +5276 +5277 +5278 +5279 +5280 +5281 +5282 +5283 +5284 +5285 +5286 +5287 +5288 +5289 +5290 +5291 +5292 +5293 +5294 +5295 +5296 +5297 +5298 +5299 +5300 +5301 +5302 +5303 +5304 +5305 +5306 +5307 +5308 +5309 +5310 +5311 +5312 +5313 +5314 +5315 +5316 +5317 +5318 +5319 +5320 +5321 +5322 +5323 +5324 +5325 +5326 +5327 +5328 +5329 +5330 +5331 +5332 +5333 +5334 +5335 +5336 +5337 +5338 +5339 +5340 +5341 +5342 +5343 +5344 +5345 +5346 +5347 +5348 +5349 +5350 +5351 +5352 +5353 +5354 +5355 +5356 +5357 +5358 +5359 +5360 +5361 +5362 +5363 +5364 +5365 +5366 +5367 +5368 +5369 +5370 +5371 +5372 +5373 +5374 +5375 +5376 +5377 +5378 +5379 +5380 +5381 +5382 +5383 +5384 +5385 +5386 +5387 +5388 +5389 +5390 +5391 +5392 +5393 +5394 +5395 +5396 +5397 +5398 +5399 +5400 +5401 +5402 +5403 +5404 +5405 +5406 +5407 +5408 +5409 +5410 +5411 +5412 +5413 +5414 +5415 +5416 +5417 +5418 +5419 +5420 +5421 +5422 +5423 +5424 +5425 +5426 +5427 +5428 +5429 +5430 +5431 +5432 +5433 +5434 +5435 +5436 +5437 +5438 +5439 +5440 +5441 +5442 +5443 +5444 +5445 +5446 +5447 +5448 +5449 +5450 +5451 +5452 +5453 +5454 +5455 +5456 +5457 +5458 +5459 +5460 +5461 +5462 +5463 +5464 +5465 +5466 +5467 +5468 +5469 +5470 +5471 +5472 +5473 +5474 +5475 +5476 +5477 +5478 +5479 +5480 +5481 +5482 +5483 +5484 +5485 +5486 +5487 +5488 +5489 +5490 +5491 +5492 +5493 +5494 +5495 +5496 +5497 +5498 +5499 +5500 +5501 +5502 +5503 +5504 +5505 +5506 +5507 +5508 +5509 +5510 +5511 +5512 +5513 +5514 +5515 +5516 +5517 +5518 +5519 +5520 +5521 +5522 +5523 +5524 +5525 +5526 +5527 +5528 +5529 +5530 +5531 +5532 +5533 +5534 +5535 +5536 +5537 +5538 +5539 +5540 +5541 +5542 +5543 +5544 +5545 +5546 +5547 +5548 +5549 +5550 +5551 +5552 +5553 +5554 +5555 +5556 +5557 +5558 +5559 +5560 +5561 +5562 +5563 +5564 +5565 +5566 +5567 +5568 +5569 +5570 +5571 +5572 +5573 +5574 +5575 +5576 +5577 +5578 +5579 +5580 +5581 +5582 +5583 +5584 +5585 +5586 +5587 +5588 +5589 +5590 +5591 +5592 +5593 +5594 +5595 +5596 +5597 +5598 +5599 +5600 +5601 +5602 +5603 +5604 +5605 +5606 +5607 +5608 +5609 +5610 +5611 +5612 +5613 +5614 +5615 +5616 +5617 +5618 +5619 +5620 +5621 +5622 +5623 +5624 +5625 +5626 +5627 +5628 +5629 +5630 +5631 +5632 +5633 +5634 +5635 +5636 +5637 +5638 +5639 +5640 +5641 +5642 +5643 +5644 +5645 +5646 +5647 +5648 +5649 +5650 +5651 +5652 +5653 +5654 +5655 +5656 +5657 +5658 +5659 +5660 +5661 +5662 +5663 +5664 +5665 +5666 +5667 +5668 +5669 +5670 +5671 +5672 +5673 +5674 +5675 +5676 +5677 +5678 +5679 +5680 +5681 +5682 +5683 +5684 +5685 +5686 +5687 +5688 +5689 +5690 +5691 +5692 +5693 +5694 +5695 +5696 +5697 +5698 +5699 +5700 +5701 +5702 +5703 +5704 +5705 +5706 +5707 +5708 +5709 +5710 +5711 +5712 +5713 +5714 +5715 +5716 +5717 +5718 +5719 +5720 +5721 +5722 +5723 +5724 +5725 +5726 +5727 +5728 +5729 +5730 +5731 +5732 +5733 +5734 +5735 +5736 +5737 +5738 +5739 +5740 +5741 +5742 +5743 +5744 +5745 +5746 +5747 +5748 +5749 +5750 +5751 +5752 +5753 +5754 +5755 +5756 +5757 +5758 +5759 +5760 +5761 +5762 +5763 +5764 +5765 +5766 +5767 +5768 +5769 +5770 +5771 +5772 +5773 +5774 +5775 +5776 +5777 +5778 +5779 +5780 +5781 +5782 +5783 +5784 +5785 +5786 +5787 +5788 +5789 +5790 +5791 +5792 +5793 +5794 +5795 +5796 +5797 +5798 +5799 +5800 +5801 +5802 +5803 +5804 +5805 +5806 +5807 +5808 +5809 +5810 +5811 +5812 +5813 +5814 +5815 +5816 +5817 +5818 +5819 +5820 +5821 +5822 +5823 +5824 +5825 +5826 +5827 +5828 +5829 +5830 +5831 +5832 +5833 +5834 +5835 +5836 +5837 +5838 +5839 +5840 +5841 +5842 +5843 +5844 +5845 +5846 +5847 +5848 +5849 +5850 +5851 +5852 +5853 +5854 +5855 +5856 +5857 +5858 +5859 +5860 +5861 +5862 +5863 +5864 +5865 +5866 +5867 +5868 +5869 +5870 +5871 +5872 +5873 +5874 +5875 +5876 +5877 +5878 +5879 +5880 +5881 +5882 +5883 +5884 +5885 +5886 +5887 +5888 +5889 +5890 +5891 +5892 +5893 +5894 +5895 +5896 +5897 +5898 +5899 +5900 +5901 +5902 +5903 +5904 +5905 +5906 +5907 +5908 +5909 +5910 +5911 +5912 +5913 +5914 +5915 +5916 +5917 +5918 +5919 +5920 +5921 +5922 +5923 +5924 +5925 +5926 +5927 +5928 +5929 +5930 +5931 +5932 +5933 +5934 +5935 +5936 +5937 +5938 +5939 +5940 +5941 +5942 +5943 +5944 +5945 +5946 +5947 +5948 +5949 +5950 +5951 +5952 +5953 +5954 +5955 +5956 +5957 +5958 +5959 +5960 +5961 +5962 +5963 +5964 +5965 +5966 +5967 +5968 +5969 +5970 +5971 +5972 +5973 +5974 +5975 +5976 +5977 +5978 +5979 +5980 +5981 +5982 +5983 +5984 +5985 +5986 +5987 +5988 +5989 +5990 +5991 +5992 +5993 +5994 +5995 +5996 +5997 +5998 +5999 +6000 +6001 +6002 +6003 +6004 +6005 +6006 +6007 +6008 +6009 +6010 +6011 +6012 +6013 +6014 +6015 +6016 +6017 +6018 +6019 +6020 +6021 +6022 +6023 +6024 +6025 +6026 +6027 +6028 +6029 +6030 +6031 +6032 +6033 +6034 +6035 +6036 +6037 +6038 +6039 +6040 +6041 +6042 +6043 +6044 +6045 +6046 +6047 +6048 +6049 +6050 +6051 +6052 +6053 +6054 +6055 +6056 +6057 +6058 +6059 +6060 +6061 +6062 +6063 +6064 +6065 +6066 +6067 +6068 +6069 +6070 +6071 +6072 +6073 +6074 +6075 +6076 +6077 +6078 +6079 +6080 +6081 +6082 +6083 +6084 +6085 +6086 +6087 +6088 +6089 +6090 +6091 +6092 +6093 +6094 +6095 +6096 +6097 +6098 +6099 +6100 +6101 +6102 +6103 +6104 +6105 +6106 +6107 +6108 +6109 +6110 +6111 +6112 +6113 +6114 +6115 +6116 +6117 +6118 +6119 +6120 +6121 +6122 +6123 +6124 +6125 +6126 +6127 +6128 +6129 +6130 +6131 +6132 +6133 +6134 +6135 +6136 +6137 +6138 +6139 +6140 +6141 +6142 +6143 +6144 +6145 +6146 +6147 +6148 +6149 +6150 +6151 +6152 +6153 +6154 +6155 +6156 +6157 +6158 +6159 +6160 +6161 +6162 +6163 +6164 +6165 +6166 +6167 +6168 +6169 +6170 +6171 +6172 +6173 +6174 +6175 +6176 +6177 +6178 +6179 +6180 +6181 +6182 +6183 +6184 +6185 +6186 +6187 +6188 +6189 +6190 +6191 +6192 +6193 +6194 +6195 +6196 +6197 +6198 +6199 +6200 +6201 +6202 +6203 +6204 +6205 +6206 +6207 +6208 +6209 +6210 +6211 +6212 +6213 +6214 +6215 +6216 +6217 +6218 +6219 +6220 +6221 +6222 +6223 +6224 +6225 +6226 +6227 +6228 +6229 +6230 +6231 +6232 +6233 +6234 +6235 +6236 +6237 +6238 +6239 +6240 +6241 +6242 +6243 +6244 +6245 +6246 +6247 +6248 +6249 +6250 +6251 +6252 +6253 +6254 +6255 +6256 +6257 +6258 +6259 +6260 +6261 +6262 +6263 +6264 +6265 +6266 +6267 +6268 +6269 +6270 +6271 +6272 +6273 +6274 +6275 +6276 +6277 +6278 +6279 +6280 +6281 +6282 +6283 +6284 +6285 +6286 +6287 +6288 +6289 +6290 +6291 +6292 +6293 +6294 +6295 +6296 +6297 +6298 +6299 +6300 +6301 +6302 +6303 +6304 +6305 +6306 +6307 +6308 +6309 +6310 +6311 +6312 +6313 +6314 +6315 +6316 +6317 +6318 +6319 +6320 +6321 +6322 +6323 +6324 +6325 +6326 +6327 +6328 +6329 +6330 +6331 +6332 +6333 +6334 +6335 +6336 +6337 +6338 +6339 +6340 +6341 +6342 +6343 +6344 +6345 +6346 +6347 +6348 +6349 +6350 +6351 +6352 +6353 +6354 +6355 +6356 +6357 +6358 +6359 +6360 +6361 +6362 +6363 +6364 +6365 +6366 +6367 +6368 +6369 +6370 +6371 +6372 +6373 +6374 +6375 +6376 +6377 +6378 +6379 +6380 +6381 +6382 +6383 +6384 +6385 +6386 +6387 +6388 +6389 +6390 +6391 +6392 +6393 +6394 +6395 +6396 +6397 +6398 +6399 +6400 +6401 +6402 +6403 +6404 +6405 +6406 +6407 +6408 +6409 +6410 +6411 +6412 +6413 +6414 +6415 +6416 +6417 +6418 +6419 +6420 +6421 +6422 +6423 +6424 +6425 +6426 +6427 +6428 +6429 +6430 +6431 +6432 +6433 +6434 +6435 +6436 +6437 +6438 +6439 +6440 +6441 +6442 +6443 +6444 +6445 +6446 +6447 +6448 +6449 +6450 +6451 +6452 +6453 +6454 +6455 +6456 +6457 +6458 +6459 +6460 +6461 +6462 +6463 +6464 +6465 +6466 +6467 +6468 +6469 +6470 +6471 +6472 +6473 +6474 +6475 +6476 +6477 +6478 +6479 +6480 +6481 +6482 +6483 +6484 +6485 +6486 +6487 +6488 +6489 +6490 +6491 +6492 +6493 +6494 +6495 +6496 +6497 +6498 +6499 +6500 +6501 +6502 +6503 +6504 +6505 +6506 +6507 +6508 +6509 +6510 +6511 +6512 +6513 +6514 +6515 +6516 +6517 +6518 +6519 +6520 +6521 +6522 +6523 +6524 +6525 +6526 +6527 +6528 +6529 +6530 +6531 +6532 +6533 +6534 +6535 +6536 +6537 +6538 +6539 +6540 +6541 +6542 +6543 +6544 +6545 +6546 +6547 +6548 +6549 +6550 +6551 +6552 +6553 +6554 +6555 +6556 +6557 +6558 +6559 +6560 +6561 +6562 +6563 +6564 +6565 +6566 +6567 +6568 +6569 +6570 +6571 +6572 +6573 +6574 +6575 +6576 +6577 +6578 +6579 +6580 +6581 +6582 +6583 +6584 +6585 +6586 +6587 +6588 +6589 +6590 +6591 +6592 +6593 +6594 +6595 +6596 +6597 +6598 +6599 +6600 +6601 +6602 +6603 +6604 +6605 +6606 +6607 +6608 +6609 +6610 +6611 +6612 +6613 +6614 +6615 +6616 +6617 +6618 +6619 +6620 +6621 +6622 +6623 +6624 +6625 +6626 +6627 +6628 +6629 +6630 +6631 +6632 +6633 +6634 +6635 +6636 +6637 +6638 +6639 +6640 +6641 +6642 +6643 +6644 +6645 +6646 +6647 +6648 +6649 +6650 +6651 +6652 +6653 +6654 +6655 +6656 +6657 +6658 +6659 +6660 +6661 +6662 +6663 +6664 +6665 +6666 +6667 +6668 +6669 +6670 +6671 +6672 +6673 +6674 +6675 +6676 +6677 +6678 +6679 +6680 +6681 +6682 +6683 +6684 +6685 +6686 +6687 +6688 +6689 +6690 +6691 +6692 +6693 +6694 +6695 +6696 +6697 +6698 +6699 +6700 +6701 +6702 +6703 +6704 +6705 +6706 +6707 +6708 +6709 +6710 +6711 +6712 +6713 +6714 +6715 +6716 +6717 +6718 +6719 +6720 +6721 +6722 +6723 +6724 +6725 +6726 +6727 +6728 +6729 +6730 +6731 +6732 +6733 +6734 +6735 +6736 +6737 +6738 +6739 +6740 +6741 +6742 +6743 +6744 +6745 +6746 +6747 +6748 +6749 +6750 +6751 +6752 +6753 +6754 +6755 +6756 +6757 +6758 +6759 +6760 +6761 +6762 +6763 +6764 +6765 +6766 +6767 +6768 +6769 +6770 +6771 +6772 +6773 +6774 +6775 +6776 +6777 +6778 +6779 +6780 +6781 +6782 +6783 +6784 +6785 +6786 +6787 +6788 +6789 +6790 +6791 +6792 +6793 +6794 +6795 +6796 +6797 +6798 +6799 +6800 +6801 +6802 +6803 +6804 +6805 +6806 +6807 +6808 +6809 +6810 +6811 +6812 +6813 +6814 +6815 +6816 +6817 +6818 +6819 +6820 +6821 +6822 +6823 +6824 +6825 +6826 +6827 +6828 +6829 +6830 +6831 +6832 +6833 +6834 +6835 +6836 +6837 +6838 +6839 +6840 +6841 +6842 +6843 +6844 +6845 +6846 +6847 +6848 +6849 +6850 +6851 +6852 +6853 +6854 +6855 +6856 +6857 +6858 +6859 +6860 +6861 +6862 +6863 +6864 +6865 +6866 +6867 +6868 +6869 +6870 +6871 +6872 +6873 +6874 +6875 +6876 +6877 +6878 +6879 +6880 +6881 +6882 +6883 +6884 +6885 +6886 +6887 +6888 +6889 +6890 +6891 +6892 +6893 +6894 +6895 +6896 +6897 +6898 +6899 +6900 +6901 +6902 +6903 +6904 +6905 +6906 +6907 +6908 +6909 +6910 +6911 +6912 +6913 +6914 +6915 +6916 +6917 +6918 +6919 +6920 +6921 +6922 +6923 +6924 +6925 +6926 +6927 +6928 +6929 +6930 +6931 +6932 +6933 +6934 +6935 +6936 +6937 +6938 +6939 +6940 +6941 +6942 +6943 +6944 +6945 +6946 +6947 +6948 +6949 +6950 +6951 +6952 +6953 +6954 +6955 +6956 +6957 +6958 +6959 +6960 +6961 +6962 +6963 +6964 +6965 +6966 +6967 +6968 +6969 +6970 +6971 +6972 +6973 +6974 +6975 +6976 +6977 +6978 +6979 +6980 +6981 +6982 +6983 +6984 +6985 +6986 +6987 +6988 +6989 +6990 +6991 +6992 +6993 +6994 +6995 +6996 +6997 +6998 +6999 +7000 +7001 +7002 +7003 +7004 +7005 +7006 +7007 +7008 +7009 +7010 +7011 +7012 +7013 +7014 +7015 +7016 +7017 +7018 +7019 +7020 +7021 +7022 +7023 +7024 +7025 +7026 +7027 +7028 +7029 +7030 +7031 +7032 +7033 +7034 +7035 +7036 +7037 +7038 +7039 +7040 +7041 +7042 +7043 +7044 +7045 +7046 +7047 +7048 +7049 +7050 +7051 +7052 +7053 +7054 +7055 +7056 +7057 +7058 +7059 +7060 +7061 +7062 +7063 +7064 +7065 +7066 +7067 +7068 +7069 +7070 +7071 +7072 +7073 +7074 +7075 +7076 +7077 +7078 +7079 +7080 +7081 +7082 +7083 +7084 +7085 +7086 +7087 +7088 +7089 +7090 +7091 +7092 +7093 +7094 +7095 +7096 +7097 +7098 +7099 +7100 +7101 +7102 +7103 +7104 +7105 +7106 +7107 +7108 +7109 +7110 +7111 +7112 +7113 +7114 +7115 +7116 +7117 +7118 +7119 +7120 +7121 +7122 +7123 +7124 +7125 +7126 +7127 +7128 +7129 +7130 +7131 +7132 +7133 +7134 +7135 +7136 +7137 +7138 +7139 +7140 +7141 +7142 +7143 +7144 +7145 +7146 +7147 +7148 +7149 +7150 +7151 +7152 +7153 +7154 +7155 +7156 +7157 +7158 +7159 +7160 +7161 +7162 +7163 +7164 +7165 +7166 +7167 +7168 +7169 +7170 +7171 +7172 +7173 +7174 +7175 +7176 +7177 +7178 +7179 +7180 +7181 +7182 +7183 +7184 +7185 +7186 +7187 +7188 +7189 +7190 +7191 +7192 +7193 +7194 +7195 +7196 +7197 +7198 +7199 +7200 +7201 +7202 +7203 +7204 +7205 +7206 +7207 +7208 +7209 +7210 +7211 +7212 +7213 +7214 +7215 +7216 +7217 +7218 +7219 +7220 +7221 +7222 +7223 +7224 +7225 +7226 +7227 +7228 +7229 +7230 +7231 +7232 +7233 +7234 +7235 +7236 +7237 +7238 +7239 +7240 +7241 +7242 +7243 +7244 +7245 +7246 +7247 +7248 +7249 +7250 +7251 +7252 +7253 +7254 +7255 +7256 +7257 +7258 +7259 +7260 +7261 +7262 +7263 +7264 +7265 +7266 +7267 +7268 +7269 +7270 +7271 +7272 +7273 +7274 +7275 +7276 +7277 +7278 +7279 +7280 +7281 +7282 +7283 +7284 +7285 +7286 +7287 +7288 +7289 +7290 +7291 +7292 +7293 +7294 +7295 +7296 +7297 +7298 +7299 +7300 +7301 +7302 +7303 +7304 +7305 +7306 +7307 +7308 +7309 +7310 +7311 +7312 +7313 +7314 +7315 +7316 +7317 +7318 +7319 +7320 +7321 +7322 +7323 +7324 +7325 +7326 +7327 +7328 +7329 +7330 +7331 +7332 +7333 +7334 +7335 +7336 +7337 +7338 +7339 +7340 +7341 +7342 +7343 +7344 +7345 +7346 +7347 +7348 +7349 +7350 +7351 +7352 +7353 +7354 +7355 +7356 +7357 +7358 +7359 +7360 +7361 +7362 +7363 +7364 +7365 +7366 +7367 +7368 +7369 +7370 +7371 +7372 +7373 +7374 +7375 +7376 +7377 +7378 +7379 +7380 +7381 +7382 +7383 +7384 +7385 +7386 +7387 +7388 +7389 +7390 +7391 +7392 +7393 +7394 +7395 +7396 +7397 +7398 +7399 +7400 +7401 +7402 +7403 +7404 +7405 +7406 +7407 +7408 +7409 +7410 +7411 +7412 +7413 +7414 +7415 +7416 +7417 +7418 +7419 +7420 +7421 +7422 +7423 +7424 +7425 +7426 +7427 +7428 +7429 +7430 +7431 +7432 +7433 +7434 +7435 +7436 +7437 +7438 +7439 +7440 +7441 +7442 +7443 +7444 +7445 +7446 +7447 +7448 +7449 +7450 +7451 +7452 +7453 +7454 +7455 +7456 +7457 +7458 +7459 +7460 +7461 +7462 +7463 +7464 +7465 +7466 +7467 +7468 +7469 +7470 +7471 +7472 +7473 +7474 +7475 +7476 +7477 +7478 +7479 +7480 +7481 +7482 +7483 +7484 +7485 +7486 +7487 +7488 +7489 +7490 +7491 +7492 +7493 +7494 +7495 +7496 +7497 +7498 +7499 +7500 +7501 +7502 +7503 +7504 +7505 +7506 +7507 +7508 +7509 +7510 +7511 +7512 +7513 +7514 +7515 +7516 +7517 +7518 +7519 +7520 +7521 +7522 +7523 +7524 +7525 +7526 +7527 +7528 +7529 +7530 +7531 +7532 +7533 +7534 +7535 +7536 +7537 +7538 +7539 +7540 +7541 +7542 +7543 +7544 +7545 +7546 +7547 +7548 +7549 +7550 +7551 +7552 +7553 +7554 +7555 +7556 +7557 +7558 +7559 +7560 +7561 +7562 +7563 +7564 +7565 +7566 +7567 +7568 +7569 +7570 +7571 +7572 +7573 +7574 +7575 +7576 +7577 +7578 +7579 +7580 +7581 +7582 +7583 +7584 +7585 +7586 +7587 +7588 +7589 +7590 +7591 +7592 +7593 +7594 +7595 +7596 +7597 +7598 +7599 +7600 +7601 +7602 +7603 +7604 +7605 +7606 +7607 +7608 +7609 +7610 +7611 +7612 +7613 +7614 +7615 +7616 +7617 +7618 +7619 +7620 +7621 +7622 +7623 +7624 +7625 +7626 +7627 +7628 +7629 +7630 +7631 +7632 +7633 +7634 +7635 +7636 +7637 +7638 +7639 +7640 +7641 +7642 +7643 +7644 +7645 +7646 +7647 +7648 +7649 +7650 +7651 +7652 +7653 +7654 +7655 +7656 +7657 +7658 +7659 +7660 +7661 +7662 +7663 +7664 +7665 +7666 +7667 +7668 +7669 +7670 +7671 +7672 +7673 +7674 +7675 +7676 +7677 +7678 +7679 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7830 +7831 +7832 +7833 +7834 +7835 +7836 +7837 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7936 +7937 +7938 +7939 +7940 +7941 +7942 +7943 +7944 +7945 +7946 +7947 +7948 +7949 +7950 +7951 +7952 +7953 +7954 +7955 +7956 +7957 +7958 +7959 +7960 +7961 +7962 +7963 +7964 +7965 +7966 +7967 +7968 +7969 +7970 +7971 +7972 +7973 +7974 +7975 +7976 +7977 +7978 +7979 +7980 +7981 +7982 +7983 +7984 +7985 +7986 +7987 +7988 +7989 +7990 +7991 +7992 +7993 +7994 +7995 +7996 +7997 +7998 +7999 +8000 +8001 +8002 +8003 +8004 +8005 +8006 +8007 +8008 +8009 +8010 +8011 +8012 +8013 +8014 +8015 +8016 +8017 +8018 +8019 +8020 +8021 +8022 +8023 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8033 +8034 +8035 +8036 +8037 +8038 +8039 +8040 +8041 +8042 +8043 +8044 +8045 +8046 +8047 +8048 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062 +8063 +8064 +8065 +8066 +8067 +8068 +8069 +8070 +8071 +8072 +8073 +8074 +8075 +8076 +8077 +8078 +8079 +8080 +8081 +8082 +8083 +8084 +8085 +8086 +8087 +8088 +8089 +8090 +8091 +8092 +8093 +8094 +8095 +8096 +8097 +8098 +8099 +8100 +8101 +8102 +8103 +8104 +8105 +8106 +8107 +8108 +8109 +8110 +8111 +8112 +8113 +8114 +8115 +8116 +8117 +8118 +8119 +8120 +8121 +8122 +8123 +8124 +8125 +8126 +8127 +8128 +8129 +8130 +8131 +8132 +8133 +8134 +8135 +8136 +8137 +8138 +8139 +8140 +8141 +8142 +8143 +8144 +8145 +8146 +8147 +8148 +8149 +8150 +8151 +8152 +8153 +8154 +8155 +8156 +8157 +8158 +8159 +8160 +8161 +8162 +8163 +8164 +8165 +8166 +8167 +8168 +8169 +8170 +8171 +8172 +8173 +8174 +8175 +8176 +8177 +8178 +8179 +8180 +8181 +8182 +8183 +8184 +8185 +8186 +8187 +8188 +8189 +8190 +8191 +8192 +8193 +8194 +8195 +8196 +8197 +8198 +8199 +8200 +8201 +8202 +8203 +8204 +8205 +8206 +8207 +8208 +8209 +8210 +8211 +8212 +8213 +8214 +8215 +8216 +8217 +8218 +8219 +8220 +8221 +8222 +8223 +8224 +8225 +8226 +8227 +8228 +8229 +8230 +8231 +8232 +8233 +8234 +8235 +8236 +8237 +8238 +8239 +8240 +8241 +8242 +8243 +8244 +8245 +8246 +8247 +8248 +8249 +8250 +8251 +8252 +8253 +8254 +8255 +8256 +8257 +8258 +8259 +8260 +8261 +8262 +8263 +8264 +8265 +8266 +8267 +8268 +8269 +8270 +8271 +8272 +8273 +8274 +8275 +8276 +8277 +8278 +8279 +8280 +8281 +8282 +8283 +8284 +8285 +8286 +8287 +8288 +8289 +8290 +8291 +8292 +8293 +8294 +8295 +8296 +8297 +8298 +8299 +8300 +8301 +8302 +8303 +8304 +8305 +8306 +8307 +8308 +8309 +8310 +8311 +8312 +8313 +8314 +8315 +8316 +8317 +8318 +8319 +8320 +8321 +8322 +8323 +8324 +8325 +8326 +8327 +8328 +8329 +8330 +8331 +8332 +8333 +8334 +8335 +8336 +8337 +8338 +8339 +8340 +8341 +8342 +8343 +8344 +8345 +8346 +8347 +8348 +8349 +8350 +8351 +8352 +8353 +8354 +8355 +8356 +8357 +8358 +8359 +8360 +8361 +8362 +8363 +8364 +8365 +8366 +8367 +8368 +8369 +8370 +8371 +8372 +8373 +8374 +8375 +8376 +8377 +8378 +8379 +8380 +8381 +8382 +8383 +8384 +8385 +8386 +8387 +8388 +8389 +8390 +8391 +8392 +8393 +8394 +8395 +8396 +8397 +8398 +8399 +8400 +8401 +8402 +8403 +8404 +8405 +8406 +8407 +8408 +8409 +8410 +8411 +8412 +8413 +8414 +8415 +8416 +8417 +8418 +8419 +8420 +8421 +8422 +8423 +8424 +8425 +8426 +8427 +8428 +8429 +8430 +8431 +8432 +8433 +8434 +8435 +8436 +8437 +8438 +8439 +8440 +8441 +8442 +8443 +8444 +8445 +8446 +8447 +8448 +8449 +8450 +8451 +8452 +8453 +8454 +8455 +8456 +8457 +8458 +8459 +8460 +8461 +8462 +8463 +8464 +8465 +8466 +8467 +8468 +8469 +8470 +8471 +8472 +8473 +8474 +8475 +8476 +8477 +8478 +8479 +8480 +8481 +8482 +8483 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8491 +8492 +8493 +8494 +8495 +8496 +8497 +8498 +8499 +8500 +8501 +8502 +8503 +8504 +8505 +8506 +8507 +8508 +8509 +8510 +8511 +8512 +8513 +8514 +8515 +8516 +8517 +8518 +8519 +8520 +8521 +8522 +8523 +8524 +8525 +8526 +8527 +8528 +8529 +8530 +8531 +8532 +8533 +8534 +8535 +8536 +8537 +8538 +8539 +8540 +8541 +8542 +8543 +8544 +8545 +8546 +8547 +8548 +8549 +8550 +8551 +8552 +8553 +8554 +8555 +8556 +8557 +8558 +8559 +8560 +8561 +8562 +8563 +8564 +8565 +8566 +8567 +8568 +8569 +8570 +8571 +8572 +8573 +8574 +8575 +8576 +8577 +8578 +8579 +8580 +8581 +8582 +8583 +8584 +8585 +8586 +8587 +8588 +8589 +8590 +8591 +8592 +8593 +8594 +8595 +8596 +8597 +8598 +8599 +8600 +8601 +8602 +8603 +8604 +8605 +8606 +8607 +8608 +8609 +8610 +8611 +8612 +8613 +8614 +8615 +8616 +8617 +8618 +8619 +8620 +8621 +8622 +8623 +8624 +8625 +8626 +8627 +8628 +8629 +8630 +8631 +8632 +8633 +8634 +8635 +8636 +8637 +8638 +8639 +8640 +8641 +8642 +8643 +8644 +8645 +8646 +8647 +8648 +8649 +8650 +8651 +8652 +8653 +8654 +8655 +8656 +8657 +8658 +8659 +8660 +8661 +8662 +8663 +8664 +8665 +8666 +8667 +8668 +8669 +8670 +8671 +8672 +8673 +8674 +8675 +8676 +8677 +8678 +8679 +8680 +8681 +8682 +8683 +8684 +8685 +8686 +8687 +8688 +8689 +8690 +8691 +8692 +8693 +8694 +8695 +8696 +8697 +8698 +8699 +8700 +8701 +8702 +8703 +8704 +8705 +8706 +8707 +8708 +8709 +8710 +8711 +8712 +8713 +8714 +8715 +8716 +8717 +8718 +8719 +8720 +8721 +8722 +8723 +8724 +8725 +8726 +8727 +8728 +8729 +8730 +8731 +8732 +8733 +8734 +8735 +8736 +8737 +8738 +8739 +8740 +8741 +8742 +8743 +8744 +8745 +8746 +8747 +8748 +8749 +8750 +8751 +8752 +8753 +8754 +8755 +8756 +8757 +8758 +8759 +8760 +8761 +8762 +8763 +8764 +8765 +8766 +8767 +8768 +8769 +8770 +8771 +8772 +8773 +8774 +8775 +8776 +8777 +8778 +8779 +8780 +8781 +8782 +8783 +8784 +8785 +8786 +8787 +8788 +8789 +8790 +8791 +8792 +8793 +8794 +8795 +8796 +8797 +8798 +8799 +8800 +8801 +8802 +8803 +8804 +8805 +8806 +8807 +8808 +8809 +8810 +8811 +8812 +8813 +8814 +8815 +8816 +8817 +8818 +8819 +8820 +8821 +8822 +8823 +8824 +8825 +8826 +8827 +8828 +8829 +8830 +8831 +8832 +8833 +8834 +8835 +8836 +8837 +8838 +8839 +8840 +8841 +8842 +8843 +8844 +8845 +8846 +8847 +8848 +8849 +8850 +8851 +8852 +8853 +8854 +8855 +8856 +8857 +8858 +8859 +8860 +8861 +8862 +8863 +8864 +8865 +8866 +8867 +8868 +8869 +8870 +8871 +8872 +8873 +8874 +8875 +8876 +8877 +8878 +8879 +8880 +8881 +8882 +8883 +8884 +8885 +8886 +8887 +8888 +8889 +8890 +8891 +8892 +8893 +8894 +8895 +8896 +8897 +8898 +8899 +8900 +8901 +8902 +8903 +8904 +8905 +8906 +8907 +8908 +8909 +8910 +8911 +8912 +8913 +8914 +8915 +8916 +8917 +8918 +8919 +8920 +8921 +8922 +8923 +8924 +8925 +8926 +8927 +8928 +8929 +8930 +8931 +8932 +8933 +8934 +8935 +8936 +8937 +8938 +8939 +8940 +8941 +8942 +8943 +8944 +8945 +8946 +8947 +8948 +8949 +8950 +8951 +8952 +8953 +8954 +8955 +8956 +8957 +8958 +8959 +8960 +8961 +8962 +8963 +8964 +8965 +8966 +8967 +8968 +8969 +8970 +8971 +8972 +8973 +8974 +8975 +8976 +8977 +8978 +8979 +8980 +8981 +8982 +8983 +8984 +8985 +8986 +8987 +8988 +8989 +8990 +8991 +8992 +8993 +8994 +8995 +8996 +8997 +8998 +8999 +9000 +9001 +9002 +9003 +9004 +9005 +9006 +9007 +9008 +9009 +9010 +9011 +9012 +9013 +9014 +9015 +9016 +9017 +9018 +9019 +9020 +9021 +9022 +9023 +9024 +9025 +9026 +9027 +9028 +9029 +9030 +9031 +9032 +9033 +9034 +9035 +9036 +9037 +9038 +9039 +9040 +9041 +9042 +9043 +9044 +9045 +9046 +9047 +9048 +9049 +9050 +9051 +9052 +9053 +9054 +9055 +9056 +9057 +9058 +9059 +9060 +9061 +9062 +9063 +9064 +9065 +9066 +9067 +9068 +9069 +9070 +9071 +9072 +9073 +9074 +9075 +9076 +9077 +9078 +9079 +9080 +9081 +9082 +9083 +9084 +9085 +9086 +9087 +9088 +9089 +9090 +9091 +9092 +9093 +9094 +9095 +9096 +9097 +9098 +9099 +9100 +9101 +9102 +9103 +9104 +9105 +9106 +9107 +9108 +9109 +9110 +9111 +9112 +9113 +9114 +9115 +9116 +9117 +9118 +9119 +9120 +9121 +9122 +9123 +9124 +9125 +9126 +9127 +9128 +9129 +9130 +9131 +9132 +9133 +9134 +9135 +9136 +9137 +9138 +9139 +9140 +9141 +9142 +9143 +9144 +9145 +9146 +9147 +9148 +9149 +9150 +9151 +9152 +9153 +9154 +9155 +9156 +9157 +9158 +9159 +9160 +9161 +9162 +9163 +9164 +9165 +9166 +9167 +9168 +9169 +9170 +9171 +9172 +9173 +9174 +9175 +9176 +9177 +9178 +9179 +9180 +9181 +9182 +9183 +9184 +9185 +9186 +9187 +9188 +9189 +9190 +9191 +9192 +9193 +9194 +9195 +9196 +9197 +9198 +9199 +9200 +9201 +9202 +9203 +9204 +9205 +9206 +9207 +9208 +9209 +9210 +9211 +9212 +9213 +9214 +9215 +9216 +9217 +9218 +9219 +9220 +9221 +9222 +9223 +9224 +9225 +9226 +9227 +9228 +9229 +9230 +9231 +9232 +9233 +9234 +9235 +9236 +9237 +9238 +9239 +9240 +9241 +9242 +9243 +9244 +9245 +9246 +9247 +9248 +9249 +9250 +9251 +9252 +9253 +9254 +9255 +9256 +9257 +9258 +9259 +9260 +9261 +9262 +9263 +9264 +9265 +9266 +9267 +9268 +9269 +9270 +9271 +9272 +9273 +9274 +9275 +9276 +9277 +9278 +9279 +9280 +9281 +9282 +9283 +9284 +9285 +9286 +9287 +9288 +9289 +9290 +9291 +9292 +9293 +9294 +9295 +9296 +9297 +9298 +9299 +9300 +9301 +9302 +9303 +9304 +9305 +9306 +9307 +9308 +9309 +9310 +9311 +9312 +9313 +9314 +9315 +9316 +9317 +9318 +9319 +9320 +9321 +9322 +9323 +9324 +9325 +9326 +9327 +9328 +9329 +9330 +9331 +9332 +9333 +9334 +9335 +9336 +9337 +9338 +9339 +9340 +9341 +9342 +9343 +9344 +9345 +9346 +9347 +9348 +9349 +9350 +9351 +9352 +9353 +9354 +9355 +9356 +9357 +9358 +9359 +9360 +9361 +9362 +9363 +9364 +9365 +9366 +9367 +9368 +9369 +9370 +9371 +9372 +9373 +9374 +9375 +9376 +9377 +9378 +9379 +9380 +9381 +9382 +9383 +9384 +9385 +9386 +9387 +9388 +9389 +9390 +9391 +9392 +9393 +9394 +9395 +9396 +9397 +9398 +9399 +9400 +9401 +9402 +9403 +9404 +9405 +9406 +9407 +9408 +9409 +9410 +9411 +9412 +9413 +9414 +9415 +9416 +9417 +9418 +9419 +9420 +9421 +9422 +9423 +9424 +9425 +9426 +9427 +9428 +9429 +9430 +9431 +9432 +9433 +9434 +9435 +9436 +9437 +9438 +9439 +9440 +9441 +9442 +9443 +9444 +9445 +9446 +9447 +9448 +9449 +9450 +9451 +9452 +9453 +9454 +9455 +9456 +9457 +9458 +9459 +9460 +9461 +9462 +9463 +9464 +9465 +9466 +9467 +9468 +9469 +9470 +9471 +9472 +9473 +9474 +9475 +9476 +9477 +9478 +9479 +9480 +9481 +9482 +9483 +9484 +9485 +9486 +9487 +9488 +9489 +9490 +9491 +9492 +9493 +9494 +9495 +9496 +9497 +9498 +9499 +9500 +9501 +9502 +9503 +9504 +9505 +9506 +9507 +9508 +9509 +9510 +9511 +9512 +9513 +9514 +9515 +9516 +9517 +9518 +9519 +9520 +9521 +9522 +9523 +9524 +9525 +9526 +9527 +9528 +9529 +9530 +9531 +9532 +9533 +9534 +9535 +9536 +9537 +9538 +9539 +9540 +9541 +9542 +9543 +9544 +9545 +9546 +9547 +9548 +9549 +9550 +9551 +9552 +9553 +9554 +9555 +9556 +9557 +9558 +9559 +9560 +9561 +9562 +9563 +9564 +9565 +9566 +9567 +9568 +9569 +9570 +9571 +9572 +9573 +9574 +9575 +9576 +9577 +9578 +9579 +9580 +9581 +9582 +9583 +9584 +9585 +9586 +9587 +9588 +9589 +9590 +9591 +9592 +9593 +9594 +9595 +9596 +9597 +9598 +9599 +9600 +9601 +9602 +9603 +9604 +9605 +9606 +9607 +9608 +9609 +9610 +9611 +9612 +9613 +9614 +9615 +9616 +9617 +9618 +9619 +9620 +9621 +9622 +9623 +9624 +9625 +9626 +9627 +9628 +9629 +9630 +9631 +9632 +9633 +9634 +9635 +9636 +9637 +9638 +9639 +9640 +9641 +9642 +9643 +9644 +9645 +9646 +9647 +9648 +9649 +9650 +9651 +9652 +9653 +9654 +9655 +9656 +9657 +9658 +9659 +9660 +9661 +9662 +9663 +9664 +9665 +9666 +9667 +9668 +9669 +9670 +9671 +9672 +9673 +9674 +9675 +9676 +9677 +9678 +9679 +9680 +9681 +9682 +9683 +9684 +9685 +9686 +9687 +9688 +9689 +9690 +9691 +9692 +9693 +9694 +9695 +9696 +9697 +9698 +9699 +9700 +9701 +9702 +9703 +9704 +9705 +9706 +9707 +9708 +9709 +9710 +9711 +9712 +9713 +9714 +9715 +9716 +9717 +9718 +9719 +9720 +9721 +9722 +9723 +9724 +9725 +9726 +9727 +9728 +9729 +9730 +9731 +9732 +9733 +9734 +9735 +9736 +9737 +9738 +9739 +9740 +9741 +9742 +9743 +9744 +9745 +9746 +9747 +9748 +9749 +9750 +9751 +9752 +9753 +9754 +9755 +9756 +9757 +9758 +9759 +9760 +9761 +9762 +9763 +9764 +9765 +9766 +9767 +9768 +9769 +9770 +9771 +9772 +9773 +9774 +9775 +9776 +9777 +9778 +9779 +9780 +9781 +9782 +9783 +9784 +9785 +9786 +9787 +9788 +9789 +9790 +9791 +9792 +9793 +9794 +9795 +9796 +9797 +9798 +9799 +9800 +9801 +9802 +9803 +9804 +9805 +9806 +9807 +9808 +9809 +9810 +9811 +9812 +9813 +9814 +9815 +9816 +9817 +9818 +9819 +9820 +9821 +9822 +9823 +9824 +9825 +9826 +9827 +9828 +9829 +9830 +9831 +9832 +9833 +9834 +9835 +9836 +9837 +9838 +9839 +9840 +9841 +9842 +9843 +9844 +9845 +9846 +9847 +9848 +9849 +9850 +9851 +9852 +9853 +9854 +9855 +9856 +9857 +9858 +9859 +9860 +9861 +9862 +9863 +9864 +9865 +9866 +9867 +9868 +9869 +9870 +9871 +9872 +9873 +9874 +9875 +9876 +9877 +9878 +9879 +9880 +9881 +9882 +9883 +9884 +9885 +9886 +9887 +9888 +9889 +9890 +9891 +9892 +9893 +9894 +9895 +9896 +9897 +9898 +9899 +9900 +9901 +9902 +9903 +9904 +9905 +9906 +9907 +9908 +9909 +9910 +9911 +9912 +9913 +9914 +9915 +9916 +9917 +9918 +9919 +9920 +9921 +9922 +9923 +9924 +9925 +9926 +9927 +9928 +9929 +9930 +9931 +9932 +9933 +9934 +9935 +9936 +9937 +9938 +9939 +9940 +9941 +9942 +9943 +9944 +9945 +9946 +9947 +9948 +9949 +9950 +9951 +9952 +9953 +9954 +9955 +9956 +9957 +9958 +9959 +9960 +9961 +9962 +9963 +9964 +9965 +9966 +9967 +9968 +9969 +9970 +9971 +9972 +9973 +9974 +9975 +9976 +9977 +9978 +9979 +9980 +9981 +9982 +9983 +9984 +9985 +9986 +9987 +9988 +9989 +9990 +9991 +9992 +9993 +9994 +9995 +9996 +9997 +9998 +9999 +10000 +10001 +10002 +10003 +10004 +10005 +10006 +10007 +10008 +10009 +10010 +10011 +10012 +10013 +10014 +10015 +10016 +10017 +10018 +10019 +10020 +10021 +10022 +10023 +10024 +10025 +10026 +10027 +10028 +10029 +10030 +10031 +10032 +10033 +10034 +10035 +10036 +10037 +10038 +10039 +10040 +10041 +10042 +10043 +10044 +10045 +10046 +10047 +10048 +10049 +10050 +10051 +10052 +10053 +10054 +10055 +10056 +10057 +10058 +10059 +10060 +10061 +10062 +10063 +10064 +10065 +10066 +10067 +10068 +10069 +10070 +10071 +10072 +10073 +10074 +10075 +10076 +10077 +10078 +10079 +10080 +10081 +10082 +10083 +10084 +10085 +10086 +10087 +10088 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10102 +10103 +10104 +10105 +10106 +10107 +10108 +10109 +10110 +10111 +10112 +10113 +10114 +10115 +10116 +10117 +10118 +10119 +10120 +10121 +10122 +10123 +10124 +10125 +10126 +10127 +10128 +10129 +10130 +10131 +10132 +10133 +10134 +10135 +10136 +10137 +10138 +10139 +10140 +10141 +10142 +10143 +10144 +10145 +10146 +10147 +10148 +10149 +10150 +10151 +10152 +10153 +10154 +10155 +10156 +10157 +10158 +10159 +10160 +10161 +10162 +10163 +10164 +10165 +10166 +10167 +10168 +10169 +10170 +10171 +10172 +10173 +10174 +10175 +10176 +10177 +10178 +10179 +10180 +10181 +10182 +10183 +10184 +10185 +10186 +10187 +10188 +10189 +10190 +10191 +10192 +10193 +10194 +10195 +10196 +10197 +10198 +10199 +10200 +10201 +10202 +10203 +10204 +10205 +10206 +10207 +10208 +10209 +10210 +10211 +10212 +10213 +10214 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10224 +10225 +10226 +10227 +10228 +10229 +10230 +10231 +10232 +10233 +10234 +10235 +10236 +10237 +10238 +10239 +10240 +10241 +10242 +10243 +10244 +10245 +10246 +10247 +10248 +10249 +10250 +10251 +10252 +10253 +10254 +10255 +10256 +10257 +10258 +10259 +10260 +10261 +10262 +10263 +10264 +10265 +10266 +10267 +10268 +10269 +10270 +10271 +10272 +10273 +10274 +10275 +10276 +10277 +10278 +10279 +10280 +10281 +10282 +10283 +10284 +10285 +10286 +10287 +10288 +10289 +10290 +10291 +10292 +10293 +10294 +10295 +10296 +10297 +10298 +10299 +10300 +10301 +10302 +10303 +10304 +10305 +10306 +10307 +10308 +10309 +10310 +10311 +10312 +10313 +10314 +10315 +10316 +10317 +10318 +10319 +10320 +10321 +10322 +10323 +10324 +10325 +10326 +10327 +10328 +10329 +10330 +10331 +10332 +10333 +10334 +10335 +10336 +10337 +10338 +10339 +10340 +10341 +10342 +10343 +10344 +10345 +10346 +10347 +10348 +10349 +10350 +10351 +10352 +10353 +10354 +10355 +10356 +10357 +10358 +10359 +10360 +10361 +10362 +10363 +10364 +10365 +10366 +10367 +10368 +10369 +10370 +10371 +10372 +10373 +10374 +10375 +10376 +10377 +10378 +10379 +10380 +10381 +10382 +10383 +10384 +10385 +10386 +10387 +10388 +10389 +10390 +10391 +10392 +10393 +10394 +10395 +10396 +10397 +10398 +10399 +10400 +10401 +10402 +10403 +10404 +10405 +10406 +10407 +10408 +10409 +10410 +10411 +10412 +10413 +10414 +10415 +10416 +10417 +10418 +10419 +10420 +10421 +10422 +10423 +10424 +10425 +10426 +10427 +10428 +10429 +10430 +10431 +10432 +10433 +10434 +10435 +10436 +10437 +10438 +10439 +10440 +10441 +10442 +10443 +10444 +10445 +10446 +10447 +10448 +10449 +10450 +10451 +10452 +10453 +10454 +10455 +10456 +10457 +10458 +10459 +10460 +10461 +10462 +10463 +10464 +10465 +10466 +10467 +10468 +10469 +10470 +10471 +10472 +10473 +10474 +10475 +10476 +10477 +10478 +10479 +10480 +10481 +10482 +10483 +10484 +10485 +10486 +10487 +10488 +10489 +10490 +10491 +10492 +10493 +10494 +10495 +10496 +10497 +10498 +10499 +10500 +10501 +10502 +10503 +10504 +10505 +10506 +10507 +10508 +10509 +10510 +10511 +10512 +10513 +10514 +10515 +10516 +10517 +10518 +10519 +10520 +10521 +10522 +10523 +10524 +10525 +10526 +10527 +10528 +10529 +10530 +10531 +10532 +10533 +10534 +10535 +10536 +10537 +10538 +10539 +10540 +10541 +10542 +10543 +10544 +10545 +10546 +10547 +10548 +10549 +10550 +10551 +10552 +10553 +10554 +10555 +10556 +10557 +10558 +10559 +10560 +10561 +10562 +10563 +10564 +10565 +10566 +10567 +10568 +10569 +10570 +10571 +10572 +10573 +10574 +10575 +10576 +10577 +10578 +10579 +10580 +10581 +10582 +10583 +10584 +10585 +10586 +10587 +10588 +10589 +10590 +10591 +10592 +10593 +10594 +10595 +10596 +10597 +10598 +10599 +10600 +10601 +10602 +10603 +10604 +10605 +10606 +10607 +10608 +10609 +10610 +10611 +10612 +10613 +10614 +10615 +10616 +10617 +10618 +10619 +10620 +10621 +10622 +10623 +10624 +10625 +10626 +10627 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10649 +10650 +10651 +10652 +10653 +10654 +10655 +10656 +10657 +10658 +10659 +10660 +10661 +10662 +10663 +10664 +10665 +10666 +10667 +10668 +10669 +10670 +10671 +10672 +10673 +10674 +10675 +10676 +10677 +10678 +10679 +10680 +10681 +10682 +10683 +10684 +10685 +10686 +10687 +10688 +10689 +10690 +10691 +10692 +10693 +10694 +10695 +10696 +10697 +10698 +10699 +10700 +10701 +10702 +10703 +10704 +10705 +10706 +10707 +10708 +10709 +10710 +10711 +10712 +10713 +10714 +10715 +10716 +10717 +10718 +10719 +10720 +10721 +10722 +10723 +10724 +10725 +10726 +10727 +10728 +10729 +10730 +10731 +10732 +10733 +10734 +10735 +10736 +10737 +10738 +10739 +10740 +10741 +10742 +10743 +10744 +10745 +10746 +10747 +10748 +10749 +10750 +10751 +10752 +10753 +10754 +10755 +10756 +10757 +10758 +10759 +10760 +10761 +10762 +10763 +10764 +10765 +10766 +10767 +10768 +10769 +10770 +10771 +10772 +10773 +10774 +10775 +10776 +10777 +10778 +10779 +10780 +10781 +10782 +10783 +10784 +10785 +10786 +10787 +10788 +10789 +10790 +10791 +10792 +10793 +10794 +10795 +10796 +10797 +10798 +10799 +10800 +10801 +10802 +10803 +10804 +10805 +10806 +10807 +10808 +10809 +10810 +10811 +10812 +10813 +10814 +10815 +10816 +10817 +10818 +10819 +10820 +10821 +10822 +10823 +10824 +10825 +10826 +10827 +10828 +10829 +10830 +10831 +10832 +10833 +10834 +10835 +10836 +10837 +10838 +10839 +10840 +10841 +10842 +10843 +10844 +10845 +10846 +10847 +10848 +10849 +10850 +10851 +10852 +10853 +10854 +10855 +10856 +10857 +10858 +10859 +10860 +10861 +10862 +10863 +10864 +10865 +10866 +10867 +10868 +10869 +10870 +10871 +10872 +10873 +10874 +10875 +10876 +10877 +10878 +10879 +10880 +10881 +10882 +10883 +10884 +10885 +10886 +10887 +10888 +10889 +10890 +10891 +10892 +10893 +10894 +10895 +10896 +10897 +10898 +10899 +10900 +10901 +10902 +10903 +10904 +10905 +10906 +10907 +10908 +10909 +10910 +10911 +10912 +10913 +10914 +10915 +10916 +10917 +10918 +10919 +10920 +10921 +10922 +10923 +10924 +10925 +10926 +10927 +10928 +10929 +10930 +10931 +10932 +10933 +10934 +10935 +10936 +10937 +10938 +10939 +10940 +10941 +10942 +10943 +10944 +10945 +10946 +10947 +10948 +10949 +10950 +10951 +10952 +10953 +10954 +10955 +10956 +10957 +10958 +10959 +10960 +10961 +10962 +10963 +10964 +10965 +10966 +10967 +10968 +10969 +10970 +10971 +10972 +10973 +10974 +10975 +10976 +10977 +10978 +10979 +10980 +10981 +10982 +10983 +10984 +10985 +10986 +10987 +10988 +10989 +10990 +10991 +10992 +10993 +10994 +10995 +10996 +10997 +10998 +10999 +11000 +11001 +11002 +11003 +11004 +11005 +11006 +11007 +11008 +11009 +11010 +11011 +11012 +11013 +11014 +11015 +11016 +11017 +11018 +11019 +11020 +11021 +11022 +11023 +11024 +11025 +11026 +11027 +11028 +11029 +11030 +11031 +11032 +11033 +11034 +11035 +11036 +11037 +11038 +11039 +11040 +11041 +11042 +11043 +11044 +11045 +11046 +11047 +11048 +11049 +11050 +11051 +11052 +11053 +11054 +11055 +11056 +11057 +11058 +11059 +11060 +11061 +11062 +11063 +11064 +11065 +11066 +11067 +11068 +11069 +11070 +11071 +11072 +11073 +11074 +11075 +11076 +11077 +11078 +11079 +11080 +11081 +11082 +11083 +11084 +11085 +11086 +11087 +11088 +11089 +11090 +11091 +11092 +11093 +11094 +11095 +11096 +11097 +11098 +11099 +11100 +11101 +11102 +11103 +11104 +11105 +11106 +11107 +11108 +11109 +11110 +11111 +11112 +11113 +11114 +11115 +11116 +11117 +11118 +11119 +11120 +11121 +11122 +11123 +11124 +11125 +11126 +11127 +11128 +11129 +11130 +11131 +11132 +11133 +11134 +11135 +11136 +11137 +11138 +11139 +11140 +11141 +11142 +11143 +11144 +11145 +11146 +11147 +11148 +11149 +11150 +11151 +11152 +11153 +11154 +11155 +11156 +11157 +11158 +11159 +11160 +11161 +11162 +11163 +11164 +11165 +11166 +11167 +11168 +11169 +11170 +11171 +11172 +11173 +11174 +11175 +11176 +11177 +11178 +11179 +11180 +11181 +11182 +11183 +11184 +11185 +11186 +11187 +11188 +11189 +11190 +11191 +11192 +11193 +11194 +11195 +11196 +11197 +11198 +11199 +11200 +11201 +11202 +11203 +11204 +11205 +11206 +11207 +11208 +11209 +11210 +11211 +11212 +11213 +11214 +11215 +11216 +11217 +11218 +11219 +11220 +11221 +11222 +11223 +11224 +11225 +11226 +11227 +11228 +11229 +11230 +11231 +11232 +11233 +11234 +11235 +11236 +11237 +11238 +11239 +11240 +11241 +11242 +11243 +11244 +11245 +11246 +11247 +11248 +11249 +11250 +11251 +11252 +11253 +11254 +11255 +11256 +11257 +11258 +11259 +11260 +11261 +11262 +11263 +11264 +11265 +11266 +11267 +11268 +11269 +11270 +11271 +11272 +11273 +11274 +11275 +11276 +11277 +11278 +11279 +11280 +11281 +11282 +11283 +11284 +11285 +11286 +11287 +11288 +11289 +11290 +11291 +11292 +11293 +11294 +11295 +11296 +11297 +11298 +11299 +11300 +11301 +11302 +11303 +11304 +11305 +11306 +11307 +11308 +11309 +11310 +11311 +11312 +11313 +11314 +11315 +11316 +11317 +11318 +11319 +11320 +11321 +11322 +11323 +11324 +11325 +11326 +11327 +11328 +11329 +11330 +11331 +11332 +11333 +11334 +11335 +11336 +11337 +11338 +11339 +11340 +11341 +11342 +11343 +11344 +11345 +11346 +11347 +11348 +11349 +11350 +11351 +11352 +11353 +11354 +11355 +11356 +11357 +11358 +11359 +11360 +11361 +11362 +11363 +11364 +11365 +11366 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11374 +11375 +11376 +11377 +11378 +11379 +11380 +11381 +11382 +11383 +11384 +11385 +11386 +11387 +11388 +11389 +11390 +11391 +11392 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11492 +11493 +11494 +11495 +11496 +11497 +11498 +11499 +11500 +11501 +11502 +11503 +11504 +11505 +11506 +11507 +11508 +11509 +11510 +11511 +11512 +11513 +11514 +11515 +11516 +11517 +11518 +11519 +11520 +11521 +11522 +11523 +11524 +11525 +11526 +11527 +11528 +11529 +11530 +11531 +11532 +11533 +11534 +11535 +11536 +11537 +11538 +11539 +11540 +11541 +11542 +11543 +11544 +11545 +11546 +11547 +11548 +11549 +11550 +11551 +11552 +11553 +11554 +11555 +11556 +11557 +11558 +11559 +11560 +11561 +11562 +11563 +11564 +11565 +11566 +11567 +11568 +11569 +11570 +11571 +11572 +11573 +11574 +11575 +11576 +11577 +11578 +11579 +11580 +11581 +11582 +11583 +11584 +11585 +11586 +11587 +11588 +11589 +11590 +11591 +11592 +11593 +11594 +11595 +11596 +11597 +11598 +11599 +11600 +11601 +11602 +11603 +11604 +11605 +11606 +11607 +11608 +11609 +11610 +11611 +11612 +11613 +11614 +11615 +11616 +11617 +11618 +11619 +11620 +11621 +11622 +11623 +11624 +11625 +11626 +11627 +11628 +11629 +11630 +11631 +11632 +11633 +11634 +11635 +11636 +11637 +11638 +11639 +11640 +11641 +11642 +11643 +11644 +11645 +11646 +11647 +11648 +11649 +11650 +11651 +11652 +11653 +11654 +11655 +11656 +11657 +11658 +11659 +11660 +11661 +11662 +11663 +11664 +11665 +11666 +11667 +11668 +11669 +11670 +11671 +11672 +11673 +11674 +11675 +11676 +11677 +11678 +11679 +11680 +11681 +11682 +11683 +11684 +11685 +11686 +11687 +11688 +11689 +11690 +11691 +11692 +11693 +11694 +11695 +11696 +11697 +11698 +11699 +11700 +11701 +11702 +11703 +11704 +11705 +11706 +11707 +11708 +11709 +11710 +11711 +11712 +11713 +11714 +11715 +11716 +11717 +11718 +11719 +11720 +11721 +11722 +11723 +11724 +11725 +11726 +11727 +11728 +11729 +11730 +11731 +11732 +11733 +11734 +11735 +11736 +11737 +11738 +11739 +11740 +11741 +11742 +11743 +11744 +11745 +11746 +11747 +11748 +11749 +11750 +11751 +11752 +11753 +11754 +11755 +11756 +11757 +11758 +11759 +11760 +11761 +11762 +11763 +11764 +11765 +11766 +11767 +11768 +11769 +11770 +11771 +11772 +11773 +11774 +11775 +11776 +11777 +11778 +11779 +11780 +11781 +11782 +11783 +11784 +11785 +11786 +11787 +11788 +11789 +11790 +11791 +11792 +11793 +11794 +11795 +11796 +11797 +11798 +11799 +11800 +11801 +11802 +11803 +11804 +11805 +11806 +11807 +11808 +11809 +11810 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +11818 +11819 +11820 +11821 +11822 +11823 +11824 +11825 +11826 +11827 +11828 +11829 +11830 +11831 +11832 +11833 +11834 +11835 +11836 +11837 +11838 +11839 +11840 +11841 +11842 +11843 +11844 +11845 +11846 +11847 +11848 +11849 +11850 +11851 +11852 +11853 +11854 +11855 +11856 +11857 +11858 +11859 +11860 +11861 +11862 +11863 +11864 +11865 +11866 +11867 +11868 +11869 +11870 +11871 +11872 +11873 +11874 +11875 +11876 +11877 +11878 +11879 +11880 +11881 +11882 +11883 +11884 +11885 +11886 +11887 +11888 +11889 +11890 +11891 +11892 +11893 +11894 +11895 +11896 +11897 +11898 +11899 +11900 +11901 +11902 +11903 +11904 +11905 +11906 +11907 +11908 +11909 +11910 +11911 +11912 +11913 +11914 +11915 +11916 +11917 +11918 +11919 +11920 +11921 +11922 +11923 +11924 +11925 +11926 +11927 +11928 +11929 +11930 +11931 +11932 +11933 +11934 +11935 +11936 +11937 +11938 +11939 +11940 +11941 +11942 +11943 +11944 +11945 +11946 +11947 +11948 +11949 +11950 +11951 +11952 +11953 +11954 +11955 +11956 +11957 +11958 +11959 +11960 +11961 +11962 +11963 +11964 +11965 +11966 +11967 +11968 +11969 +11970 +11971 +11972 +11973 +11974 +11975 +11976 +11977 +11978 +11979 +11980 +11981 +11982 +11983 +11984 +11985 +11986 +11987 +11988 +11989 +11990 +11991 +11992 +11993 +11994 +11995 +11996 +11997 +11998 +11999 +12000 +12001 +12002 +12003 +12004 +12005 +12006 +12007 +12008 +12009 +12010 +12011 +12012 +12013 +12014 +12015 +12016 +12017 +12018 +12019 +12020 +12021 +12022 +12023 +12024 +12025 +12026 +12027 +12028 +12029 +12030 +12031 +12032 +12033 +12034 +12035 +12036 +12037 +12038 +12039 +12040 +12041 +12042 +12043 +12044 +12045 +12046 +12047 +12048 +12049 +12050 +12051 +12052 +12053 +12054 +12055 +12056 +12057 +12058 +12059 +12060 +12061 +12062 +12063 +12064 +12065 +12066 +12067 +12068 +12069 +12070 +12071 +12072 +12073 +12074 +12075 +12076 +12077 +12078 +12079 +12080 +12081 +12082 +12083 +12084 +12085 +12086 +12087 +12088 +12089 +12090 +12091 +12092 +12093 +12094 +12095 +12096 +12097 +12098 +12099 +12100 +12101 +12102 +12103 +12104 +12105 +12106 +12107 +12108 +12109 +12110 +12111 +12112 +12113 +12114 +12115 +12116 +12117 +12118 +12119 +12120 +12121 +12122 +12123 +12124 +12125 +12126 +12127 +12128 +12129 +12130 +12131 +12132 +12133 +12134 +12135 +12136 +12137 +12138 +12139 +12140 +12141 +12142 +12143 +12144 +12145 +12146 +12147 +12148 +12149 +12150 +12151 +12152 +12153 +12154 +12155 +12156 +12157 +12158 +12159 +12160 +12161 +12162 +12163 +12164 +12165 +12166 +12167 +12168 +12169 +12170 +12171 +12172 +12173 +12174 +12175 +12176 +12177 +12178 +12179 +12180 +12181 +12182 +12183 +12184 +12185 +12186 +12187 +12188 +12189 +12190 +12191 +12192 +12193 +12194 +12195 +12196 +12197 +12198 +12199 +12200 +12201 +12202 +12203 +12204 +12205 +12206 +12207 +12208 +12209 +12210 +12211 +12212 +12213 +12214 +12215 +12216 +12217 +12218 +12219 +12220 +12221 +12222 +12223 +12224 +12225 +12226 +12227 +12228 +12229 +12230 +12231 +12232 +12233 +12234 +12235 +12236 +12237 +12238 +12239 +12240 +12241 +12242 +12243 +12244 +12245 +12246 +12247 +12248 +12249 +12250 +12251 +12252 +12253 +12254 +12255 +12256 +12257 +12258 +12259 +12260 +12261 +12262 +12263 +12264 +12265 +12266 +12267 +12268 +12269 +12270 +12271 +12272 +12273 +12274 +12275 +12276 +12277 +12278 +12279 +12280 +12281 +12282 +12283 +12284 +12285 +12286 +12287 +12288 +12289 +12290 +12291 +12292 +12293 +12294 +12295 +12296 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12306 +12307 +12308 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +12316 +12317 +12318 +12319 +12320 +12321 +12322 +12323 +12324 +12325 +12326 +12327 +12328 +12329 +12330 +12331 +12332 +12333 +12334 +12335 +12336 +12337 +12338 +12339 +12340 +12341 +12342 +12343 +12344 +12345 +12346 +12347 +12348 +12349 +12350 +12351 +12352 +12353 +12354 +12355 +12356 +12357 +12358 +12359 +12360 +12361 +12362 +12363 +12364 +12365 +12366 +12367 +12368 +12369 +12370 +12371 +12372 +12373 +12374 +12375 +12376 +12377 +12378 +12379 +12380 +12381 +12382 +12383 +12384 +12385 +12386 +12387 +12388 +12389 +12390 +12391 +12392 +12393 +12394 +12395 +12396 +12397 +12398 +12399 +12400 +12401 +12402 +12403 +12404 +12405 +12406 +12407 +12408 +12409 +12410 +12411 +12412 +12413 +12414 +12415 +12416 +12417 +12418 +12419 +12420 +12421 +12422 +12423 +12424 +12425 +12426 +12427 +12428 +12429 +12430 +12431 +12432 +12433 +12434 +12435 +12436 +12437 +12438 +12439 +12440 +12441 +12442 +12443 +12444 +12445 +12446 +12447 +12448 +12449 +12450 +12451 +12452 +12453 +12454 +12455 +12456 +12457 +12458 +12459 +12460 +12461 +12462 +12463 +12464 +12465 +12466 +12467 +12468 +12469 +12470 +12471 +12472 +12473 +12474 +12475 +12476 +12477 +12478 +12479 +12480 +12481 +12482 +12483 +12484 +12485 +12486 +12487 +12488 +12489 +12490 +12491 +12492 +12493 +12494 +12495 +12496 +12497 +12498 +12499 +12500 +12501 +12502 +12503 +12504 +12505 +12506 +12507 +12508 +12509 +12510 +12511 +12512 +12513 +12514 +12515 +12516 +12517 +12518 +12519 +12520 +12521 +12522 +12523 +12524 +12525 +12526 +12527 +12528 +12529 +12530 +12531 +12532 +12533 +12534 +12535 +12536 +12537 +12538 +12539 +12540 +12541 +12542 +12543 +12544 +12545 +12546 +12547 +12548 +12549 +12550 +12551 +12552 +12553 +12554 +12555 +12556 +12557 +12558 +12559 +12560 +12561 +12562 +12563 +12564 +12565 +12566 +12567 +12568 +12569 +12570 +12571 +12572 +12573 +12574 +12575 +12576 +12577 +12578 +12579 +12580 +12581 +12582 +12583 +12584 +12585 +12586 +12587 +12588 +12589 +12590 +12591 +12592 +12593 +12594 +12595 +12596 +12597 +12598 +12599 +12600 +12601 +12602 +12603 +12604 +12605 +12606 +12607 +12608 +12609 +12610 +12611 +12612 +12613 +12614 +12615 +12616 +12617 +12618 +12619 +12620 +12621 +12622 +12623 +12624 +12625 +12626 +12627 +12628 +12629 +12630 +12631 +12632 +12633 +12634 +12635 +12636 +12637 +12638 +12639 +12640 +12641 +12642 +12643 +12644 +12645 +12646 +12647 +12648 +12649 +12650 +12651 +12652 +12653 +12654 +12655 +12656 +12657 +12658 +12659 +12660 +12661 +12662 +12663 +12664 +12665 +12666 +12667 +12668 +12669 +12670 +12671 +12672 +12673 +12674 +12675 +12676 +12677 +12678 +12679 +12680 +12681 +12682 +12683 +12684 +12685 +12686 +12687 +12688 +12689 +12690 +12691 +12692 +12693 +12694 +12695 +12696 +12697 +12698 +12699 +12700 +12701 +12702 +12703 +12704 +12705 +12706 +12707 +12708 +12709 +12710 +12711 +12712 +12713 +12714 +12715 +12716 +12717 +12718 +12719 +12720 +12721 +12722 +12723 +12724 +12725 +12726 +12727 +12728 +12729 +12730 +12731 +12732 +12733 +12734 +12735 +12736 +12737 +12738 +12739 +12740 +12741 +12742 +12743 +12744 +12745 +12746 +12747 +12748 +12749 +12750 +12751 +12752 +12753 +12754 +12755 +12756 +12757 +12758 +12759 +12760 +12761 +12762 +12763 +12764 +12765 +12766 +12767 +12768 +12769 +12770 +12771 +12772 +12773 +12774 +12775 +12776 +12777 +12778 +12779 +12780 +12781 +12782 +12783 +12784 +12785 +12786 +12787 +12788 +12789 +12790 +12791 +12792 +12793 +12794 +12795 +12796 +12797 +12798 +12799 +12800 +12801 +12802 +12803 +12804 +12805 +12806 +12807 +12808 +12809 +12810 +12811 +12812 +12813 +12814 +12815 +12816 +12817 +12818 +12819 +12820 +12821 +12822 +12823 +12824 +12825 +12826 +12827 +12828 +12829 +12830 +12831 +12832 +12833 +12834 +12835 +12836 +12837 +12838 +12839 +12840 +12841 +12842 +12843 +12844 +12845 +12846 +12847 +12848 +12849 +12850 +12851 +12852 +12853 +12854 +12855 +12856 +12857 +12858 +12859 +12860 +12861 +12862 +12863 +12864 +12865 +12866 +12867 +12868 +12869 +12870 +12871 +12872 +12873 +12874 +12875 +12876 +12877 +12878 +12879 +12880 +12881 +12882 +12883 +12884 +12885 +12886 +12887 +12888 +12889 +12890 +12891 +12892 +12893 +12894 +12895 +12896 +12897 +12898 +12899 +12900 +12901 +12902 +12903 +12904 +12905 +12906 +12907 +12908 +12909 +12910 +12911 +12912 +12913 +12914 +12915 +12916 +12917 +12918 +12919 +12920 +12921 +12922 +12923 +12924 +12925 +12926 +12927 +12928 +12929 +12930 +12931 +12932 +12933 +12934 +12935 +12936 +12937 +12938 +12939 +12940 +12941 +12942 +12943 +12944 +12945 +12946 +12947 +12948 +12949 +12950 +12951 +12952 +12953 +12954 +12955 +12956 +12957 +12958 +12959 +12960 +12961 +12962 +12963 +12964 +12965 +12966 +12967 +12968 +12969 +12970 +12971 +12972 +12973 +12974 +12975 +12976 +12977 +12978 +12979 +12980 +12981 +12982 +12983 +12984 +12985 +12986 +12987 +12988 +12989 +12990 +12991 +12992 +12993 +12994 +12995 +12996 +12997 +12998 +12999 +13000 +13001 +13002 +13003 +13004 +13005 +13006 +13007 +13008 +13009 +13010 +13011 +13012 +13013 +13014 +13015 +13016 +13017 +13018 +13019 +13020 +13021 +13022 +13023 +13024 +13025 +13026 +13027 +13028 +13029 +13030 +13031 +13032 +13033 +13034 +13035 +13036 +13037 +13038 +13039 +13040 +13041 +13042 +13043 +13044 +13045 +13046 +13047 +13048 +13049 +13050 +13051 +13052 +13053 +13054 +13055 +13056 +13057 +13058 +13059 +13060 +13061 +13062 +13063 +13064 +13065 +13066 +13067 +13068 +13069 +13070 +13071 +13072 +13073 +13074 +13075 +13076 +13077 +13078 +13079 +13080 +13081 +13082 +13083 +13084 +13085 +13086 +13087 +13088 +13089 +13090 +13091 +13092 +13093 +13094 +13095 +13096 +13097 +13098 +13099 +13100 +13101 +13102 +13103 +13104 +13105 +13106 +13107 +13108 +13109 +13110 +13111 +13112 +13113 +13114 +13115 +13116 +13117 +13118 +13119 +13120 +13121 +13122 +13123 +13124 +13125 +13126 +13127 +13128 +13129 +13130 +13131 +13132 +13133 +13134 +13135 +13136 +13137 +13138 +13139 +13140 +13141 +13142 +13143 +13144 +13145 +13146 +13147 +13148 +13149 +13150 +13151 +13152 +13153 +13154 +13155 +13156 +13157 +13158 +13159 +13160 +13161 +13162 +13163 +13164 +13165 +13166 +13167 +13168 +13169 +13170 +13171 +13172 +13173 +13174 +13175 +13176 +13177 +13178 +13179 +13180 +13181 +13182 +13183 +13184 +13185 +13186 +13187 +13188 +13189 +13190 +13191 +13192 +13193 +13194 +13195 +13196 +13197 +13198 +13199 +13200 +13201 +13202 +13203 +13204 +13205 +13206 +13207 +13208 +13209 +13210 +13211 +13212 +13213 +13214 +13215 +13216 +13217 +13218 +13219 +13220 +13221 +13222 +13223 +13224 +13225 +13226 +13227 +13228 +13229 +13230 +13231 +13232 +13233 +13234 +13235 +13236 +13237 +13238 +13239 +13240 +13241 +13242 +13243 +13244 +13245 +13246 +13247 +13248 +13249 +13250 +13251 +13252 +13253 +13254 +13255 +13256 +13257 +13258 +13259 +13260 +13261 +13262 +13263 +13264 +13265 +13266 +13267 +13268 +13269 +13270 +13271 +13272 +13273 +13274 +13275 +13276 +13277 +13278 +13279 +13280 +13281 +13282 +13283 +13284 +13285 +13286 +13287 +13288 +13289 +13290 +13291 +13292 +13293 +13294 +13295 +13296 +13297 +13298 +13299 +13300 +13301 +13302 +13303 +13304 +13305 +13306 +13307 +13308 +13309 +13310 +13311 +13312 +13313 +13314 +13315 +13316 +13317 +13318 +13319 +13320 +13321 +13322 +13323 +13324 +13325 +13326 +13327 +13328 +13329 +13330 +13331 +13332 +13333 +13334 +13335 +13336 +13337 +13338 +13339 +13340 +13341 +13342 +13343 +13344 +13345 +13346 +13347 +13348 +13349 +13350 +13351 +13352 +13353 +13354 +13355 +13356 +13357 +13358 +13359 +13360 +13361 +13362 +13363 +13364 +13365 +13366 +13367 +13368 +13369 +13370 +13371 +13372 +13373 +13374 +13375 +13376 +13377 +13378 +13379 +13380 +13381 +13382 +13383 +13384 +13385 +13386 +13387 +13388 +13389 +13390 +13391 +13392 +13393 +13394 +13395 +13396 +13397 +13398 +13399 +13400 +13401 +13402 +13403 +13404 +13405 +13406 +13407 +13408 +13409 +13410 +13411 +13412 +13413 +13414 +13415 +13416 +13417 +13418 +13419 +13420 +13421 +13422 +13423 +13424 +13425 +13426 +13427 +13428 +13429 +13430 +13431 +13432 +13433 +13434 +13435 +13436 +13437 +13438 +13439 +13440 +13441 +13442 +13443 +13444 +13445 +13446 +13447 +13448 +13449 +13450 +13451 +13452 +13453 +13454 +13455 +13456 +13457 +13458 +13459 +13460 +13461 +13462 +13463 +13464 +13465 +13466 +13467 +13468 +13469 +13470 +13471 +13472 +13473 +13474 +13475 +13476 +13477 +13478 +13479 +13480 +13481 +13482 +13483 +13484 +13485 +13486 +13487 +13488 +13489 +13490 +13491 +13492 +13493 +13494 +13495 +13496 +13497 +13498 +13499 +13500 +13501 +13502 +13503 +13504 +13505 +13506 +13507 +13508 +13509 +13510 +13511 +13512 +13513 +13514 +13515 +13516 +13517 +13518 +13519 +13520 +13521 +13522 +13523 +13524 +13525 +13526 +13527 +13528 +13529 +13530 +13531 +13532 +13533 +13534 +13535 +13536 +13537 +13538 +13539 +13540 +13541 +13542 +13543 +13544 +13545 +13546 +13547 +13548 +13549 +13550 +13551 +13552 +13553 +13554 +13555 +13556 +13557 +13558 +13559 +13560 +13561 +13562 +13563 +13564 +13565 +13566 +13567 +13568 +13569 +13570 +13571 +13572 +13573 +13574 +13575 +13576 +13577 +13578 +13579 +13580 +13581 +13582 +13583 +13584 +13585 +13586 +13587 +13588 +13589 +13590 +13591 +13592 +13593 +13594 +13595 +13596 +13597 +13598 +13599 +13600 +13601 +13602 +13603 +13604 +13605 +13606 +13607 +13608 +13609 +13610 +13611 +13612 +13613 +13614 +13615 +13616 +13617 +13618 +13619 +13620 +13621 +13622 +13623 +13624 +13625 +13626 +13627 +13628 +13629 +13630 +13631 +13632 +13633 +13634 +13635 +13636 +13637 +13638 +13639 +13640 +13641 +13642 +13643 +13644 +13645 +13646 +13647 +13648 +13649 +13650 +13651 +13652 +13653 +13654 +13655 +13656 +13657 +13658 +13659 +13660 +13661 +13662 +13663 +13664 +13665 +13666 +13667 +13668 +13669 +13670 +13671 +13672 +13673 +13674 +13675 +13676 +13677 +13678 +13679 +13680 +13681 +13682 +13683 +13684 +13685 +13686 +13687 +13688 +13689 +13690 +13691 +13692 +13693 +13694 +13695 +13696 +13697 +13698 +13699 +13700 +13701 +13702 +13703 +13704 +13705 +13706 +13707 +13708 +13709 +13710 +13711 +13712 +13713 +13714 +13715 +13716 +13717 +13718 +13719 +13720 +13721 +13722 +13723 +13724 +13725 +13726 +13727 +13728 +13729 +13730 +13731 +13732 +13733 +13734 +13735 +13736 +13737 +13738 +13739 +13740 +13741 +13742 +13743 +13744 +13745 +13746 +13747 +13748 +13749 +13750 +13751 +13752 +13753 +13754 +13755 +13756 +13757 +13758 +13759 +13760 +13761 +13762 +13763 +13764 +13765 +13766 +13767 +13768 +13769 +13770 +13771 +13772 +13773 +13774 +13775 +13776 +13777 +13778 +13779 +13780 +13781 +13782 +13783 +13784 +13785 +13786 +13787 +13788 +13789 +13790 +13791 +13792 +13793 +13794 +13795 +13796 +13797 +13798 +13799 +13800 +13801 +13802 +13803 +13804 +13805 +13806 +13807 +13808 +13809 +13810 +13811 +13812 +13813 +13814 +13815 +13816 +13817 +13818 +13819 +13820 +13821 +13822 +13823 +13824 +13825 +13826 +13827 +13828 +13829 +13830 +13831 +13832 +13833 +13834 +13835 +13836 +13837 +13838 +13839 +13840 +13841 +13842 +13843 +13844 +13845 +13846 +13847 +13848 +13849 +13850 +13851 +13852 +13853 +13854 +13855 +13856 +13857 +13858 +13859 +13860 +13861 +13862 +13863 +13864 +13865 +13866 +13867 +13868 +13869 +13870 +13871 +13872 +13873 +13874 +13875 +13876 +13877 +13878 +13879 +13880 +13881 +13882 +13883 +13884 +13885 +13886 +13887 +13888 +13889 +13890 +13891 +13892 +13893 +13894 +13895 +13896 +13897 +13898 +13899 +13900 +13901 +13902 +13903 +13904 +13905 +13906 +13907 +13908 +13909 +13910 +13911 +13912 +13913 +13914 +13915 +13916 +13917 +13918 +13919 +13920 +13921 +13922 +13923 +13924 +13925 +13926 +13927 +13928 +13929 +13930 +13931 +13932 +13933 +13934 +13935 +13936 +13937 +13938 +13939 +13940 +13941 +13942 +13943 +13944 +13945 +13946 +13947 +13948 +13949 +13950 +13951 +13952 +13953 +13954 +13955 +13956 +13957 +13958 +13959 +13960 +13961 +13962 +13963 +13964 +13965 +13966 +13967 +13968 +13969 +13970 +13971 +13972 +13973 +13974 +13975 +13976 +13977 +13978 +13979 +13980 +13981 +13982 +13983 +13984 +13985 +13986 +13987 +13988 +13989 +13990 +13991 +13992 +13993 +13994 +13995 +13996 +13997 +13998 +13999 +14000 +14001 +14002 +14003 +14004 +14005 +14006 +14007 +14008 +14009 +14010 +14011 +14012 +14013 +14014 +14015 +14016 +14017 +14018 +14019 +14020 +14021 +14022 +14023 +14024 +14025 +14026 +14027 +14028 +14029 +14030 +14031 +14032 +14033 +14034 +14035 +14036 +14037 +14038 +14039 +14040 +14041 +14042 +14043 +14044 +14045 +14046 +14047 +14048 +14049 +14050 +14051 +14052 +14053 +14054 +14055 +14056 +14057 +14058 +14059 +14060 +14061 +14062 +14063 +14064 +14065 +14066 +14067 +14068 +14069 +14070 +14071 +14072 +14073 +14074 +14075 +14076 +14077 +14078 +14079 +14080 +14081 +14082 +14083 +14084 +14085 +14086 +14087 +14088 +14089 +14090 +14091 +14092 +14093 +14094 +14095 +14096 +14097 +14098 +14099 +14100 +14101 +14102 +14103 +14104 +14105 +14106 +14107 +14108 +14109 +14110 +14111 +14112 +14113 +14114 +14115 +14116 +14117 +14118 +14119 +14120 +14121 +14122 +14123 +14124 +14125 +14126 +14127 +14128 +14129 +14130 +14131 +14132 +14133 +14134 +14135 +14136 +14137 +14138 +14139 +14140 +14141 +14142 +14143 +14144 +14145 +14146 +14147 +14148 +14149 +14150 +14151 +14152 +14153 +14154 +14155 +14156 +14157 +14158 +14159 +14160 +14161 +14162 +14163 +14164 +14165 +14166 +14167 +14168 +14169 +14170 +14171 +14172 +14173 +14174 +14175 +14176 +14177 +14178 +14179 +14180 +14181 +14182 +14183 +14184 +14185 +14186 +14187 +14188 +14189 +14190 +14191 +14192 +14193 +14194 +14195 +14196 +14197 +14198 +14199 +14200 +14201 +14202 +14203 +14204 +14205 +14206 +14207 +14208 +14209 +14210 +14211 +14212 +14213 +14214 +14215 +14216 +14217 +14218 +14219 +14220 +14221 +14222 +14223 +14224 +14225 +14226 +14227 +14228 +14229 +14230 +14231 +14232 +14233 +14234 +14235 +14236 +14237 +14238 +14239 +14240 +14241 +14242 +14243 +14244 +14245 +14246 +14247 +14248 +14249 +14250 +14251 +14252 +14253 +14254 +14255 +14256 +14257 +14258 +14259 +14260 +14261 +14262 +14263 +14264 +14265 +14266 +14267 +14268 +14269 +14270 +14271 +14272 +14273 +14274 +14275 +14276 +14277 +14278 +14279 +14280 +14281 +14282 +14283 +14284 +14285 +14286 +14287 +14288 +14289 +14290 +14291 +14292 +14293 +14294 +14295 +14296 +14297 +14298 +14299 +14300 +14301 +14302 +14303 +14304 +14305 +14306 +14307 +14308 +14309 +14310 +14311 +14312 +14313 +14314 +14315 +14316 +14317 +14318 +14319 +14320 +14321 +14322 +14323 +14324 +14325 +14326 +14327 +14328 +14329 +14330 +14331 +14332 +14333 +14334 +14335 +14336 +14337 +14338 +14339 +14340 +14341 +14342 +14343 +14344 +14345 +14346 +14347 +14348 +14349 +14350 +14351 +14352 +14353 +14354 +14355 +14356 +14357 +14358 +14359 +14360 +14361 +14362 +14363 +14364 +14365 +14366 +14367 +14368 +14369 +14370 +14371 +14372 +14373 +14374 +14375 +14376 +14377 +14378 +14379 +14380 +14381 +14382 +14383 +14384 +14385 +14386 +14387 +14388 +14389 +14390 +14391 +14392 +14393 +14394 +14395 +14396 +14397 +14398 +14399 +14400 +14401 +14402 +14403 +14404 +14405 +14406 +14407 +14408 +14409 +14410 +14411 +14412 +14413 +14414 +14415 +14416 +14417 +14418 +14419 +14420 +14421 +14422 +14423 +14424 +14425 +14426 +14427 +14428 +14429 +14430 +14431 +14432 +14433 +14434 +14435 +14436 +14437 +14438 +14439 +14440 +14441 +14442 +14443 +14444 +14445 +14446 +14447 +14448 +14449 +14450 +14451 +14452 +14453 +14454 +14455 +14456 +14457 +14458 +14459 +14460 +14461 +14462 +14463 +14464 +14465 +14466 +14467 +14468 +14469 +14470 +14471 +14472 +14473 +14474 +14475 +14476 +14477 +14478 +14479 +14480 +14481 +14482 +14483 +14484 +14485 +14486 +14487 +14488 +14489 +14490 +14491 +14492 +14493 +14494 +14495 +14496 +14497 +14498 +14499 +14500 +14501 +14502 +14503 +14504 +14505 +14506 +14507 +14508 +14509 +14510 +14511 +14512 +14513 +14514 +14515 +14516 +14517 +14518 +14519 +14520 +14521 +14522 +14523 +14524 +14525 +14526 +14527 +14528 +14529 +14530 +14531 +14532 +14533 +14534 +14535 +14536 +14537 +14538 +14539 +14540 +14541 +14542 +14543 +14544 +14545 +14546 +14547 +14548 +14549 +14550 +14551 +14552 +14553 +14554 +14555 +14556 +14557 +14558 +14559 +14560 +14561 +14562 +14563 +14564 +14565 +14566 +14567 +14568 +14569 +14570 +14571 +14572 +14573 +14574 +14575 +14576 +14577 +14578 +14579 +14580 +14581 +14582 +14583 +14584 +14585 +14586 +14587 +14588 +14589 +14590 +14591 +14592 +14593 +14594 +14595 +14596 +14597 +14598 +14599 +14600 +14601 +14602 +14603 +14604 +14605 +14606 +14607 +14608 +14609 +14610 +14611 +14612 +14613 +14614 +14615 +14616 +14617 +14618 +14619 +14620 +14621 +14622 +14623 +14624 +14625 +14626 +14627 +14628 +14629 +14630 +14631 +14632 +14633 +14634 +14635 +14636 +14637 +14638 +14639 +14640 +14641 +14642 +14643 +14644 +14645 +14646 +14647 +14648 +14649 +14650 +14651 +14652 +14653 +14654 +14655 +14656 +14657 +14658 +14659 +14660 +14661 +14662 +14663 +14664 +14665 +14666 +14667 +14668 +14669 +14670 +14671 +14672 +14673 +14674 +14675 +14676 +14677 +14678 +14679 +14680 +14681 +14682 +14683 +14684 +14685 +14686 +14687 +14688 +14689 +14690 +14691 +14692 +14693 +14694 +14695 +14696 +14697 +14698 +14699 +14700 +14701 +14702 +14703 +14704 +14705 +14706 +14707 +14708 +14709 +14710 +14711 +14712 +14713 +14714 +14715 +14716 +14717 +14718 +14719 +14720 +14721 +14722 +14723 +14724 +14725 +14726 +14727 +14728 +14729 +14730 +14731 +14732 +14733 +14734 +14735 +14736 +14737 +14738 +14739 +14740 +14741 +14742 +14743 +14744 +14745 +14746 +14747 +14748 +14749 +14750 +14751 +14752 +14753 +14754 +14755 +14756 +14757 +14758 +14759 +14760 +14761 +14762 +14763 +14764 +14765 +14766 +14767 +14768 +14769 +14770 +14771 +14772 +14773 +14774 +14775 +14776 +14777 +14778 +14779 +14780 +14781 +14782 +14783 +14784 +14785 +14786 +14787 +14788 +14789 +14790 +14791 +14792 +14793 +14794 +14795 +14796 +14797 +14798 +14799 +14800 +14801 +14802 +14803 +14804 +14805 +14806 +14807 +14808 +14809 +14810 +14811 +14812 +14813 +14814 +14815 +14816 +14817 +14818 +14819 +14820 +14821 +14822 +14823 +14824 +14825 +14826 +14827 +14828 +14829 +14830 +14831 +14832 +14833 +14834 +14835 +14836 +14837 +14838 +14839 +14840 +14841 +14842 +14843 +14844 +14845 +14846 +14847 +14848 +14849 +14850 +14851 +14852 +14853 +14854 +14855 +14856 +14857 +14858 +14859 +14860 +14861 +14862 +14863 +14864 +14865 +14866 +14867 +14868 +14869 +14870 +14871 +14872 +14873 +14874 +14875 +14876 +14877 +14878 +14879 +14880 +14881 +14882 +14883 +14884 +14885 +14886 +14887 +14888 +14889 +14890 +14891 +14892 +14893 +14894 +14895 +14896 +14897 +14898 +14899 +14900 +14901 +14902 +14903 +14904 +14905 +14906 +14907 +14908 +14909 +14910 +14911 +14912 +14913 +14914 +14915 +14916 +14917 +14918 +14919 +14920 +14921 +14922 +14923 +14924 +14925 +14926 +14927 +14928 +14929 +14930 +14931 +14932 +14933 +14934 +14935 +14936 +14937 +14938 +14939 +14940 +14941 +14942 +14943 +14944 +14945 +14946 +14947 +14948 +14949 +14950 +14951 +14952 +14953 +14954 +14955 +14956 +14957 +14958 +14959 +14960 +14961 +14962 +14963 +14964 +14965 +14966 +14967 +14968 +14969 +14970 +14971 +14972 +14973 +14974 +14975 +14976 +14977 +14978 +14979 +14980 +14981 +14982 +14983 +14984 +14985 +14986 +14987 +14988 +14989 +14990 +14991 +14992 +14993 +14994 +14995 +14996 +14997 +14998 +14999 +15000 +15001 +15002 +15003 +15004 +15005 +15006 +15007 +15008 +15009 +15010 +15011 +15012 +15013 +15014 +15015 +15016 +15017 +15018 +15019 +15020 +15021 +15022 +15023 +15024 +15025 +15026 +15027 +15028 +15029 +15030 +15031 +15032 +15033 +15034 +15035 +15036 +15037 +15038 +15039 +15040 +15041 +15042 +15043 +15044 +15045 +15046 +15047 +15048 +15049 +15050 +15051 +15052 +15053 +15054 +15055 +15056 +15057 +15058 +15059 +15060 +15061 +15062 +15063 +15064 +15065 +15066 +15067 +15068 +15069 +15070 +15071 +15072 +15073 +15074 +15075 +15076 +15077 +15078 +15079 +15080 +15081 +15082 +15083 +15084 +15085 +15086 +15087 +15088 +15089 +15090 +15091 +15092 +15093 +15094 +15095 +15096 +15097 +15098 +15099 +15100 +15101 +15102 +15103 +15104 +15105 +15106 +15107 +15108 +15109 +15110 +15111 +15112 +15113 +15114 +15115 +15116 +15117 +15118 +15119 +15120 +15121 +15122 +15123 +15124 +15125 +15126 +15127 +15128 +15129 +15130 +15131 +15132 +15133 +15134 +15135 +15136 +15137 +15138 +15139 +15140 +15141 +15142 +15143 +15144 +15145 +15146 +15147 +15148 +15149 +15150 +15151 +15152 +15153 +15154 +15155 +15156 +15157 +15158 +15159 +15160 +15161 +15162 +15163 +15164 +15165 +15166 +15167 +15168 +15169 +15170 +15171 +15172 +15173 +15174 +15175 +15176 +15177 +15178 +15179 +15180 +15181 +15182 +15183 +15184 +15185 +15186 +15187 +15188 +15189 +15190 +15191 +15192 +15193 +15194 +15195 +15196 +15197 +15198 +15199 +15200 +15201 +15202 +15203 +15204 +15205 +15206 +15207 +15208 +15209 +15210 +15211 +15212 +15213 +15214 +15215 +15216 +15217 +15218 +15219 +15220 +15221 +15222 +15223 +15224 +15225 +15226 +15227 +15228 +15229 +15230 +15231 +15232 +15233 +15234 +15235 +15236 +15237 +15238 +15239 +15240 +15241 +15242 +15243 +15244 +15245 +15246 +15247 +15248 +15249 +15250 +15251 +15252 +15253 +15254 +15255 +15256 +15257 +15258 +15259 +15260 +15261 +15262 +15263 +15264 +15265 +15266 +15267 +15268 +15269 +15270 +15271 +15272 +15273 +15274 +15275 +15276 +15277 +15278 +15279 +15280 +15281 +15282 +15283 +15284 +15285 +15286 +15287 +15288 +15289 +15290 +15291 +15292 +15293 +15294 +15295 +15296 +15297 +15298 +15299 +15300 +15301 +15302 +15303 +15304 +15305 +15306 +15307 +15308 +15309 +15310 +15311 +15312 +15313 +15314 +15315 +15316 +15317 +15318 +15319 +15320 +15321 +15322 +15323 +15324 +15325 +15326 +15327 +15328 +15329 +15330 +15331 +15332 +15333 +15334 +15335 +15336 +15337 +15338 +15339 +15340 +15341 +15342 +15343 +15344 +15345 +15346 +15347 +15348 +15349 +15350 +15351 +15352 +15353 +15354 +15355 +15356 +15357 +15358 +15359 +15360 +15361 +15362 +15363 +15364 +15365 +15366 +15367 +15368 +15369 +15370 +15371 +15372 +15373 +15374 +15375 +15376 +15377 +15378 +15379 +15380 +15381 +15382 +15383 +15384 +15385 +15386 +15387 +15388 +15389 +15390 +15391 +15392 +15393 +15394 +15395 +15396 +15397 +15398 +15399 +15400 +15401 +15402 +15403 +15404 +15405 +15406 +15407 +15408 +15409 +15410 +15411 +15412 +15413 +15414 +15415 +15416 +15417 +15418 +15419 +15420 +15421 +15422 +15423 +15424 +15425 +15426 +15427 +15428 +15429 +15430 +15431 +15432 +15433 +15434 +15435 +15436 +15437 +15438 +15439 +15440 +15441 +15442 +15443 +15444 +15445 +15446 +15447 +15448 +15449 +15450 +15451 +15452 +15453 +15454 +15455 +15456 +15457 +15458 +15459 +15460 +15461 +15462 +15463 +15464 +15465 +15466 +15467 +15468 +15469 +15470 +15471 +15472 +15473 +15474 +15475 +15476 +15477 +15478 +15479 +15480 +15481 +15482 +15483 +15484 +15485 +15486 +15487 +15488 +15489 +15490 +15491 +15492 +15493 +15494 +15495 +15496 +15497 +15498 +15499 +15500 +15501 +15502 +15503 +15504 +15505 +15506 +15507 +15508 +15509 +15510 +15511 +15512 +15513 +15514 +15515 +15516 +15517 +15518 +15519 +15520 +15521 +15522 +15523 +15524 +15525 +15526 +15527 +15528 +15529 +15530 +15531 +15532 +15533 +15534 +15535 +15536 +15537 +15538 +15539 +15540 +15541 +15542 +15543 +15544 +15545 +15546 +15547 +15548 +15549 +15550 +15551 +15552 +15553 +15554 +15555 +15556 +15557 +15558 +15559 +15560 +15561 +15562 +15563 +15564 +15565 +15566 +15567 +15568 +15569 +15570 +15571 +15572 +15573 +15574 +15575 +15576 +15577 +15578 +15579 +15580 +15581 +15582 +15583 +15584 +15585 +15586 +15587 +15588 +15589 +15590 +15591 +15592 +15593 +15594 +15595 +15596 +15597 +15598 +15599 +15600 +15601 +15602 +15603 +15604 +15605 +15606 +15607 +15608 +15609 +15610 +15611 +15612 +15613 +15614 +15615 +15616 +15617 +15618 +15619 +15620 +15621 +15622 +15623 +15624 +15625 +15626 +15627 +15628 +15629 +15630 +15631 +15632 +15633 +15634 +15635 +15636 +15637 +15638 +15639 +15640 +15641 +15642 +15643 +15644 +15645 +15646 +15647 +15648 +15649 +15650 +15651 +15652 +15653 +15654 +15655 +15656 +15657 +15658 +15659 +15660 +15661 +15662 +15663 +15664 +15665 +15666 +15667 +15668 +15669 +15670 +15671 +15672 +15673 +15674 +15675 +15676 +15677 +15678 +15679 +15680 +15681 +15682 +15683 +15684 +15685 +15686 +15687 +15688 +15689 +15690 +15691 +15692 +15693 +15694 +15695 +15696 +15697 +15698 +15699 +15700 +15701 +15702 +15703 +15704 +15705 +15706 +15707 +15708 +15709 +15710 +15711 +15712 +15713 +15714 +15715 +15716 +15717 +15718 +15719 +15720 +15721 +15722 +15723 +15724 +15725 +15726 +15727 +15728 +15729 +15730 +15731 +15732 +15733 +15734 +15735 +15736 +15737 +15738 +15739 +15740 +15741 +15742 +15743 +15744 +15745 +15746 +15747 +15748 +15749 +15750 +15751 +15752 +15753 +15754 +15755 +15756 +15757 +15758 +15759 +15760 +15761 +15762 +15763 +15764 +15765 +15766 +15767 +15768 +15769 +15770 +15771 +15772 +15773 +15774 +15775 +15776 +15777 +15778 +15779 +15780 +15781 +15782 +15783 +15784 +15785 +15786 +15787 +15788 +15789 +15790 +15791 +15792 +15793 +15794 +15795 +15796 +15797 +15798 +15799 +15800 +15801 +15802 +15803 +15804 +15805 +15806 +15807 +15808 +15809 +15810 +15811 +15812 +15813 +15814 +15815 +15816 +15817 +15818 +15819 +15820 +15821 +15822 +15823 +15824 +15825 +15826 +15827 +15828 +15829 +15830 +15831 +15832 +15833 +15834 +15835 +15836 +15837 +15838 +15839 +15840 +15841 +15842 +15843 +15844 +15845 +15846 +15847 +15848 +15849 +15850 +15851 +15852 +15853 +15854 +15855 +15856 +15857 +15858 +15859 +15860 +15861 +15862 +15863 +15864 +15865 +15866 +15867 +15868 +15869 +15870 +15871 +15872 +15873 +15874 +15875 +15876 +15877 +15878 +15879 +15880 +15881 +15882 +15883 +15884 +15885 +15886 +15887 +15888 +15889 +15890 +15891 +15892 +15893 +15894 +15895 +15896 +15897 +15898 +15899 +15900 +15901 +15902 +15903 +15904 +15905 +15906 +15907 +15908 +15909 +15910 +15911 +15912 +15913 +15914 +15915 +15916 +15917 +15918 +15919 +15920 +15921 +15922 +15923 +15924 +15925 +15926 +15927 +15928 +15929 +15930 +15931 +15932 +15933 +15934 +15935 +15936 +15937 +15938 +15939 +15940 +15941 +15942 +15943 +15944 +15945 +15946 +15947 +15948 +15949 +15950 +15951 +15952 +15953 +15954 +15955 +15956 +15957 +15958 +15959 +15960 +15961 +15962 +15963 +15964 +15965 +15966 +15967 +15968 +15969 +15970 +15971 +15972 +15973 +15974 +15975 +15976 +15977 +15978 +15979 +15980 +15981 +15982 +15983 +15984 +15985 +15986 +15987 +15988 +15989 +15990 +15991 +15992 +15993 +15994 +15995 +15996 +15997 +15998 +15999 +16000 +16001 +16002 +16003 +16004 +16005 +16006 +16007 +16008 +16009 +16010 +16011 +16012 +16013 +16014 +16015 +16016 +16017 +16018 +16019 +16020 +16021 +16022 +16023 +16024 +16025 +16026 +16027 +16028 +16029 +16030 +16031 +16032 +16033 +16034 +16035 +16036 +16037 +16038 +16039 +16040 +16041 +16042 +16043 +16044 +16045 +16046 +16047 +16048 +16049 +16050 +16051 +16052 +16053 +16054 +16055 +16056 +16057 +16058 +16059 +16060 +16061 +16062 +16063 +16064 +16065 +16066 +16067 +16068 +16069 +16070 +16071 +16072 +16073 +16074 +16075 +16076 +16077 +16078 +16079 +16080 +16081 +16082 +16083 +16084 +16085 +16086 +16087 +16088 +16089 +16090 +16091 +16092 +16093 +16094 +16095 +16096 +16097 +16098 +16099 +16100 +16101 +16102 +16103 +16104 +16105 +16106 +16107 +16108 +16109 +16110 +16111 +16112 +16113 +16114 +16115 +16116 +16117 +16118 +16119 +16120 +16121 +16122 +16123 +16124 +16125 +16126 +16127 +16128 +16129 +16130 +16131 +16132 +16133 +16134 +16135 +16136 +16137 +16138 +16139 +16140 +16141 +16142 +16143 +16144 +16145 +16146 +16147 +16148 +16149 +16150 +16151 +16152 +16153 +16154 +16155 +16156 +16157 +16158 +16159 +16160 +16161 +16162 +16163 +16164 +16165 +16166 +16167 +16168 +16169 +16170 +16171 +16172 +16173 +16174 +16175 +16176 +16177 +16178 +16179 +16180 +16181 +16182 +16183 +16184 +16185 +16186 +16187 +16188 +16189 +16190 +16191 +16192 +16193 +16194 +16195 +16196 +16197 +16198 +16199 +16200 +16201 +16202 +16203 +16204 +16205 +16206 +16207 +16208 +16209 +16210 +16211 +16212 +16213 +16214 +16215 +16216 +16217 +16218 +16219 +16220 +16221 +16222 +16223 +16224 +16225 +16226 +16227 +16228 +16229 +16230 +16231 +16232 +16233 +16234 +16235 +16236 +16237 +16238 +16239 +16240 +16241 +16242 +16243 +16244 +16245 +16246 +16247 +16248 +16249 +16250 +16251 +16252 +16253 +16254 +16255 +16256 +16257 +16258 +16259 +16260 +16261 +16262 +16263 +16264 +16265 +16266 +16267 +16268 +16269 +16270 +16271 +16272 +16273 +16274 +16275 +16276 +16277 +16278 +16279 +16280 +16281 +16282 +16283 +16284 +16285 +16286 +16287 +16288 +16289 +16290 +16291 +16292 +16293 +16294 +16295 +16296 +16297 +16298 +16299 +16300 +16301 +16302 +16303 +16304 +16305 +16306 +16307 +16308 +16309 +16310 +16311 +16312 +16313 +16314 +16315 +16316 +16317 +16318 +16319 +16320 +16321 +16322 +16323 +16324 +16325 +16326 +16327 +16328 +16329 +16330 +16331 +16332 +16333 +16334 +16335 +16336 +16337 +16338 +16339 +16340 +16341 +16342 +16343 +16344 +16345 +16346 +16347 +16348 +16349 +16350 +16351 +16352 +16353 +16354 +16355 +16356 +16357 +16358 +16359 +16360 +16361 +16362 +16363 +16364 +16365 +16366 +16367 +16368 +16369 +16370 +16371 +16372 +16373 +16374 +16375 +16376 +16377 +16378 +16379 +16380 +16381 +16382 +16383 +16384 +16385 +16386 +16387 +16388 +16389 +16390 +16391 +16392 +16393 +16394 +16395 +16396 +16397 +16398 +16399 +16400 +16401 +16402 +16403 +16404 +16405 +16406 +16407 +16408 +16409 +16410 +16411 +16412 +16413 +16414 +16415 +16416 +16417 +16418 +16419 +16420 +16421 +16422 +16423 +16424 +16425 +16426 +16427 +16428 +16429 +16430 +16431 +16432 +16433 +16434 +16435 +16436 +16437 +16438 +16439 +16440 +16441 +16442 +16443 +16444 +16445 +16446 +16447 +16448 +16449 +16450 +16451 +16452 +16453 +16454 +16455 +16456 +16457 +16458 +16459 +16460 +16461 +16462 +16463 +16464 +16465 +16466 +16467 +16468 +16469 +16470 +16471 +16472 +16473 +16474 +16475 +16476 +16477 +16478 +16479 +16480 +16481 +16482 +16483 +16484 +16485 +16486 +16487 +16488 +16489 +16490 +16491 +16492 +16493 +16494 +16495 +16496 +16497 +16498 +16499 +16500 +16501 +16502 +16503 +16504 +16505 +16506 +16507 +16508 +16509 +16510 +16511 +16512 +16513 +16514 +16515 +16516 +16517 +16518 +16519 +16520 +16521 +16522 +16523 +16524 +16525 +16526 +16527 +16528 +16529 +16530 +16531 +16532 +16533 +16534 +16535 +16536 +16537 +16538 +16539 +16540 +16541 +16542 +16543 +16544 +16545 +16546 +16547 +16548 +16549 +16550 +16551 +16552 +16553 +16554 +16555 +16556 +16557 +16558 +16559 +16560 +16561 +16562 +16563 +16564 +16565 +16566 +16567 +16568 +16569 +16570 +16571 +16572 +16573 +16574 +16575 +16576 +16577 +16578 +16579 +16580 +16581 +16582 +16583 +16584 +16585 +16586 +16587 +16588 +16589 +16590 +16591 +16592 +16593 +16594 +16595 +16596 +16597 +16598 +16599 +16600 +16601 +16602 +16603 +16604 +16605 +16606 +16607 +16608 +16609 +16610 +16611 +16612 +16613 +16614 +16615 +16616 +16617 +16618 +16619 +16620 +16621 +16622 +16623 +16624 +16625 +16626 +16627 +16628 +16629 +16630 +16631 +16632 +16633 +16634 +16635 +16636 +16637 +16638 +16639 +16640 +16641 +16642 +16643 +16644 +16645 +16646 +16647 +16648 +16649 +16650 +16651 +16652 +16653 +16654 +16655 +16656 +16657 +16658 +16659 +16660 +16661 +16662 +16663 +16664 +16665 +16666 +16667 +16668 +16669 +16670 +16671 +16672 +16673 +16674 +16675 +16676 +16677 +16678 +16679 +16680 +16681 +16682 +16683 +16684 +16685 +16686 +16687 +16688 +16689 +16690 +16691 +16692 +16693 +16694 +16695 +16696 +16697 +16698 +16699 +16700 +16701 +16702 +16703 +16704 +16705 +16706 +16707 +16708 +16709 +16710 +16711 +16712 +16713 +16714 +16715 +16716 +16717 +16718 +16719 +16720 +16721 +16722 +16723 +16724 +16725 +16726 +16727 +16728 +16729 +16730 +16731 +16732 +16733 +16734 +16735 +16736 +16737 +16738 +16739 +16740 +16741 +16742 +16743 +16744 +16745 +16746 +16747 +16748 +16749 +16750 +16751 +16752 +16753 +16754 +16755 +16756 +16757 +16758 +16759 +16760 +16761 +16762 +16763 +16764 +16765 +16766 +16767 +16768 +16769 +16770 +16771 +16772 +16773 +16774 +16775 +16776 +16777 +16778 +16779 +16780 +16781 +16782 +16783 +16784 +16785 +16786 +16787 +16788 +16789 +16790 +16791 +16792 +16793 +16794 +16795 +16796 +16797 +16798 +16799 +16800 +16801 +16802 +16803 +16804 +16805 +16806 +16807 +16808 +16809 +16810 +16811 +16812 +16813 +16814 +16815 +16816 +16817 +16818 +16819 +16820 +16821 +16822 +16823 +16824 +16825 +16826 +16827 +16828 +16829 +16830 +16831 +16832 +16833 +16834 +16835 +16836 +16837 +16838 +16839 +16840 +16841 +16842 +16843 +16844 +16845 +16846 +16847 +16848 +16849 +16850 +16851 +16852 +16853 +16854 +16855 +16856 +16857 +16858 +16859 +16860 +16861 +16862 +16863 +16864 +16865 +16866 +16867 +16868 +16869 +16870 +16871 +16872 +16873 +16874 +16875 +16876 +16877 +16878 +16879 +16880 +16881 +16882 +16883 +16884 +16885 +16886 +16887 +16888 +16889 +16890 +16891 +16892 +16893 +16894 +16895 +16896 +16897 +16898 +16899 +16900 +16901 +16902 +16903 +16904 +16905 +16906 +16907 +16908 +16909 +16910 +16911 +16912 +16913 +16914 +16915 +16916 +16917 +16918 +16919 +16920 +16921 +16922 +16923 +16924 +16925 +16926 +16927 +16928 +16929 +16930 +16931 +16932 +16933 +16934 +16935 +16936 +16937 +16938 +16939 +16940 +16941 +16942 +16943 +16944 +16945 +16946 +16947 +16948 +16949 +16950 +16951 +16952 +16953 +16954 +16955 +16956 +16957 +16958 +16959 +16960 +16961 +16962 +16963 +16964 +16965 +16966 +16967 +16968 +16969 +16970 +16971 +16972 +16973 +16974 +16975 +16976 +16977 +16978 +16979 +16980 +16981 +16982 +16983 +16984 +16985 +16986 +16987 +16988 +16989 +16990 +16991 +16992 +16993 +16994 +16995 +16996 +16997 +16998 +16999 +17000 +17001 +17002 +17003 +17004 +17005 +17006 +17007 +17008 +17009 +17010 +17011 +17012 +17013 +17014 +17015 +17016 +17017 +17018 +17019 +17020 +17021 +17022 +17023 +17024 +17025 +17026 +17027 +17028 +17029 +17030 +17031 +17032 +17033 +17034 +17035 +17036 +17037 +17038 +17039 +17040 +17041 +17042 +17043 +17044 +17045 +17046 +17047 +17048 +17049 +17050 +17051 +17052 +17053 +17054 +17055 +17056 +17057 +17058 +17059 +17060 +17061 +17062 +17063 +17064 +17065 +17066 +17067 +17068 +17069 +17070 +17071 +17072 +17073 +17074 +17075 +17076 +17077 +17078 +17079 +17080 +17081 +17082 +17083 +17084 +17085 +17086 +17087 +17088 +17089 +17090 +17091 +17092 +17093 +17094 +17095 +17096 +17097 +17098 +17099 +17100 +17101 +17102 +17103 +17104 +17105 +17106 +17107 +17108 +17109 +17110 +17111 +17112 +17113 +17114 +17115 +17116 +17117 +17118 +17119 +17120 +17121 +17122 +17123 +17124 +17125 +17126 +17127 +17128 +17129 +17130 +17131 +17132 +17133 +17134 +17135 +17136 +17137 +17138 +17139 +17140 +17141 +17142 +17143 +17144 +17145 +17146 +17147 +17148 +17149 +17150 +17151 +17152 +17153 +17154 +17155 +17156 +17157 +17158 +17159 +17160 +17161 +17162 +17163 +17164 +17165 +17166 +17167 +17168 +17169 +17170 +17171 +17172 +17173 +17174 +17175 +17176 +17177 +17178 +17179 +17180 +17181 +17182 +17183 +17184 +17185 +17186 +17187 +17188 +17189 +17190 +17191 +17192 +17193 +17194 +17195 +17196 +17197 +17198 +17199 +17200 +17201 +17202 +17203 +17204 +17205 +17206 +17207 +17208 +17209 +17210 +17211 +17212 +17213 +17214 +17215 +17216 +17217 +17218 +17219 +17220 +17221 +17222 +17223 +17224 +17225 +17226 +17227 +17228 +17229 +17230 +17231 +17232 +17233 +17234 +17235 +17236 +17237 +17238 +17239 +17240 +17241 +17242 +17243 +17244 +17245 +17246 +17247 +17248 +17249 +17250 +17251 +17252 +17253 +17254 +17255 +17256 +17257 +17258 +17259 +17260 +17261 +17262 +17263 +17264 +17265 +17266 +17267 +17268 +17269 +17270 +17271 +17272 +17273 +17274 +17275 +17276 +17277 +17278 +17279 +17280 +17281 +17282 +17283 +17284 +17285 +17286 +17287 +17288 +17289 +17290 +17291 +17292 +17293 +17294 +17295 +17296 +17297 +17298 +17299 +17300 +17301 +17302 +17303 +17304 +17305 +17306 +17307 +17308 +17309 +17310 +17311 +17312 +17313 +17314 +17315 +17316 +17317 +17318 +17319 +17320 +17321 +17322 +17323 +17324 +17325 +17326 +17327 +17328 +17329 +17330 +17331 +17332 +17333 +17334 +17335 +17336 +17337 +17338 +17339 +17340 +17341 +17342 +17343 +17344 +17345 +17346 +17347 +17348 +17349 +17350 +17351 +17352 +17353 +17354 +17355 +17356 +17357 +17358 +17359 +17360 +17361 +17362 +17363 +17364 +17365 +17366 +17367 +17368 +17369 +17370 +17371 +17372 +17373 +17374 +17375 +17376 +17377 +17378 +17379 +17380 +17381 +17382 +17383 +17384 +17385 +17386 +17387 +17388 +17389 +17390 +17391 +17392 +17393 +17394 +17395 +17396 +17397 +17398 +17399 +17400 +17401 +17402 +17403 +17404 +17405 +17406 +17407 +17408 +17409 +17410 +17411 +17412 +17413 +17414 +17415 +17416 +17417 +17418 +17419 +17420 +17421 +17422 +17423 +17424 +17425 +17426 +17427 +17428 +17429 +17430 +17431 +17432 +17433 +17434 +17435 +17436 +17437 +17438 +17439 +17440 +17441 +17442 +17443 +17444 +17445 +17446 +17447 +17448 +17449 +17450 +17451 +17452 +17453 +17454 +17455 +17456 +17457 +17458 +17459 +17460 +17461 +17462 +17463 +17464 +17465 +17466 +17467 +17468 +17469 +17470 +17471 +17472 +17473 +17474 +17475 +17476 +17477 +17478 +17479 +17480 +17481 +17482 +17483 +17484 +17485 +17486 +17487 +17488 +17489 +17490 +17491 +17492 +17493 +17494 +17495 +17496 +17497 +17498 +17499 +17500 +17501 +17502 +17503 +17504 +17505 +17506 +17507 +17508 +17509 +17510 +17511 +17512 +17513 +17514 +17515 +17516 +17517 +17518 +17519 +17520 +17521 +17522 +17523 +17524 +17525 +17526 +17527 +17528 +17529 +17530 +17531 +17532 +17533 +17534 +17535 +17536 +17537 +17538 +17539 +17540 +17541 +17542 +17543 +17544 +17545 +17546 +17547 +17548 +17549 +17550 +17551 +17552 +17553 +17554 +17555 +17556 +17557 +17558 +17559 +17560 +17561 +17562 +17563 +17564 +17565 +17566 +17567 +17568 +17569 +17570 +17571 +17572 +17573 +17574 +17575 +17576 +17577 +17578 +17579 +17580 +17581 +17582 +17583 +17584 +17585 +17586 +17587 +17588 +17589 +17590 +17591 +17592 +17593 +17594 +17595 +17596 +17597 +17598 +17599 +17600 +17601 +17602 +17603 +17604 +17605 +17606 +17607 +17608 +17609 +17610 +17611 +17612 +17613 +17614 +17615 +17616 +17617 +17618 +17619 +17620 +17621 +17622 +17623 +17624 +17625 +17626 +17627 +17628 +17629 +17630 +17631 +17632 +17633 +17634 +17635 +17636 +17637 +17638 +17639 +17640 +17641 +17642 +17643 +17644 +17645 +17646 +17647 +17648 +17649 +17650 +17651 +17652 +17653 +17654 +17655 +17656 +17657 +17658 +17659 +17660 +17661 +17662 +17663 +17664 +17665 +17666 +17667 +17668 +17669 +17670 +17671 +17672 +17673 +17674 +17675 +17676 +17677 +17678 +17679 +17680 +17681 +17682 +17683 +17684 +17685 +17686 +17687 +17688 +17689 +17690 +17691 +17692 +17693 +17694 +17695 +17696 +17697 +17698 +17699 +17700 +17701 +17702 +17703 +17704 +17705 +17706 +17707 +17708 +17709 +17710 +17711 +17712 +17713 +17714 +17715 +17716 +17717 +17718 +17719 +17720 +17721 +17722 +17723 +17724 +17725 +17726 +17727 +17728 +17729 +17730 +17731 +17732 +17733 +17734 +17735 +17736 +17737 +17738 +17739 +17740 +17741 +17742 +17743 +17744 +17745 +17746 +17747 +17748 +17749 +17750 +17751 +17752 +17753 +17754 +17755 +17756 +17757 +17758 +17759 +17760 +17761 +17762 +17763 +17764 +17765 +17766 +17767 +17768 +17769 +17770 +17771 +17772 +17773 +17774 +17775 +17776 +17777 +17778 +17779 +17780 +17781 +17782 +17783 +17784 +17785 +17786 +17787 +17788 +17789 +17790 +17791 +17792 +17793 +17794 +17795 +17796 +17797 +17798 +17799 +17800 +17801 +17802 +17803 +17804 +17805 +17806 +17807 +17808 +17809 +17810 +17811 +17812 +17813 +17814 +17815 +17816 +17817 +17818 +17819 +17820 +17821 +17822 +17823 +17824 +17825 +17826 +17827 +17828 +17829 +17830 +17831 +17832 +17833 +17834 +17835 +17836 +17837 +17838 +17839 +17840 +17841 +17842 +17843 +17844 +17845 +17846 +17847 +17848 +17849 +17850 +17851 +17852 +17853 +17854 +17855 +17856 +17857 +17858 +17859 +17860 +17861 +17862 +17863 +17864 +17865 +17866 +17867 +17868 +17869 +17870 +17871 +17872 +17873 +17874 +17875 +17876 +17877 +17878 +17879 +17880 +17881 +17882 +17883 +17884 +17885 +17886 +17887 +17888 +17889 +17890 +17891 +17892 +17893 +17894 +17895 +17896 +17897 +17898 +17899 +17900 +17901 +17902 +17903 +17904 +17905 +17906 +17907 +17908 +17909 +17910 +17911 +17912 +17913 +17914 +17915 +17916 +17917 +17918 +17919 +17920 +17921 +17922 +17923 +17924 +17925 +17926 +17927 +17928 +17929 +17930 +17931 +17932 +17933 +17934 +17935 +17936 +17937 +17938 +17939 +17940 +17941 +17942 +17943 +17944 +17945 +17946 +17947 +17948 +17949 +17950 +17951 +17952 +17953 +17954 +17955 +17956 +17957 +17958 +17959 +17960 +17961 +17962 +17963 +17964 +17965 +17966 +17967 +17968 +17969 +17970 +17971 +17972 +17973 +17974 +17975 +17976 +17977 +17978 +17979 +17980 +17981 +17982 +17983 +17984 +17985 +17986 +17987 +17988 +17989 +17990 +17991 +17992 +17993 +17994 +17995 +17996 +17997 +17998 +17999 +18000 +18001 +18002 +18003 +18004 +18005 +18006 +18007 +18008 +18009 +18010 +18011 +18012 +18013 +18014 +18015 +18016 +18017 +18018 +18019 +18020 +18021 +18022 +18023 +18024 +18025 +18026 +18027 +18028 +18029 +18030 +18031 +18032 +18033 +18034 +18035 +18036 +18037 +18038 +18039 +18040 +18041 +18042 +18043 +18044 +18045 +18046 +18047 +18048 +18049 +18050 +18051 +18052 +18053 +18054 +18055 +18056 +18057 +18058 +18059 +18060 +18061 +18062 +18063 +18064 +18065 +18066 +18067 +18068 +18069 +18070 +18071 +18072 +18073 +18074 +18075 +18076 +18077 +18078 +18079 +18080 +18081 +18082 +18083 +18084 +18085 +18086 +18087 +18088 +18089 +18090 +18091 +18092 +18093 +18094 +18095 +18096 +18097 +18098 +18099 +18100 +18101 +18102 +18103 +18104 +18105 +18106 +18107 +18108 +18109 +18110 +18111 +18112 +18113 +18114 +18115 +18116 +18117 +18118 +18119 +18120 +18121 +18122 +18123 +18124 +18125 +18126 +18127 +18128 +18129 +18130 +18131 +18132 +18133 +18134 +18135 +18136 +18137 +18138 +18139 +18140 +18141 +18142 +18143 +18144 +18145 +18146 +18147 +18148 +18149 +18150 +18151 +18152 +18153 +18154 +18155 +18156 +18157 +18158 +18159 +18160 +18161 +18162 +18163 +18164 +18165 +18166 +18167 +18168 +18169 +18170 +18171 +18172 +18173 +18174 +18175 +18176 +18177 +18178 +18179 +18180 +18181 +18182 +18183 +18184 +18185 +18186 +18187 +18188 +18189 +18190 +18191 +18192 +18193 +18194 +18195 +18196 +18197 +18198 +18199 +18200 +18201 +18202 +18203 +18204 +18205 +18206 +18207 +18208 +18209 +18210 +18211 +18212 +18213 +18214 +18215 +18216 +18217 +18218 +18219 +18220 +18221 +18222 +18223 +18224 +18225 +18226 +18227 +18228 +18229 +18230 +18231 +18232 +18233 +18234 +18235 +18236 +18237 +18238 +18239 +18240 +18241 +18242 +18243 +18244 +18245 +18246 +18247 +18248 +18249 +18250 +18251 +18252 +18253 +18254 +18255 +18256 +18257 +18258 +18259 +18260 +18261 +18262 +18263 +18264 +18265 +18266 +18267 +18268 +18269 +18270 +18271 +18272 +18273 +18274 +18275 +18276 +18277 +18278 +18279 +18280 +18281 +18282 +18283 +18284 +18285 +18286 +18287 +18288 +18289 +18290 +18291 +18292 +18293 +18294 +18295 +18296 +18297 +18298 +18299 +18300 +18301 +18302 +18303 +18304 +18305 +18306 +18307 +18308 +18309 +18310 +18311 +18312 +18313 +18314 +18315 +18316 +18317 +18318 +18319 +18320 +18321 +18322 +18323 +18324 +18325 +18326 +18327 +18328 +18329 +18330 +18331 +18332 +18333 +18334 +18335 +18336 +18337 +18338 +18339 +18340 +18341 +18342 +18343 +18344 +18345 +18346 +18347 +18348 +18349 +18350 +18351 +18352 +18353 +18354 +18355 +18356 +18357 +18358 +18359 +18360 +18361 +18362 +18363 +18364 +18365 +18366 +18367 +18368 +18369 +18370 +18371 +18372 +18373 +18374 +18375 +18376 +18377 +18378 +18379 +18380 +18381 +18382 +18383 +18384 +18385 +18386 +18387 +18388 +18389 +18390 +18391 +18392 +18393 +18394 +18395 +18396 +18397 +18398 +18399 +18400 +18401 +18402 +18403 +18404 +18405 +18406 +18407 +18408 +18409 +18410 +18411 +18412 +18413 +18414 +18415 +18416 +18417 +18418 +18419 +18420 +18421 +18422 +18423 +18424 +18425 +18426 +18427 +18428 +18429 +18430 +18431 +18432 +18433 +18434 +18435 +18436 +18437 +18438 +18439 +18440 +18441 +18442 +18443 +18444 +18445 +18446 +18447 +18448 +18449 +18450 +18451 +18452 +18453 +18454 +18455 +18456 +18457 +18458 +18459 +18460 +18461 +18462 +18463 +18464 +18465 +18466 +18467 +18468 +18469 +18470 +18471 +18472 +18473 +18474 +18475 +18476 +18477 +18478 +18479 +18480 +18481 +18482 +18483 +18484 +18485 +18486 +18487 +18488 +18489 +18490 +18491 +18492 +18493 +18494 +18495 +18496 +18497 +18498 +18499 +18500 +18501 +18502 +18503 +18504 +18505 +18506 +18507 +18508 +18509 +18510 +18511 +18512 +18513 +18514 +18515 +18516 +18517 +18518 +18519 +18520 +18521 +18522 +18523 +18524 +18525 +18526 +18527 +18528 +18529 +18530 +18531 +18532 +18533 +18534 +18535 +18536 +18537 +18538 +18539 +18540 +18541 +18542 +18543 +18544 +18545 +18546 +18547 +18548 +18549 +18550 +18551 +18552 +18553 +18554 +18555 +18556 +18557 +18558 +18559 +18560 +18561 +18562 +18563 +18564 +18565 +18566 +18567 +18568 +18569 +18570 +18571 +18572 +18573 +18574 +18575 +18576 +18577 +18578 +18579 +18580 +18581 +18582 +18583 +18584 +18585 +18586 +18587 +18588 +18589 +18590 +18591 +18592 +18593 +18594 +18595 +18596 +18597 +18598 +18599 +18600 +18601 +18602 +18603 +18604 +18605 +18606 +18607 +18608 +18609 +18610 +18611 +18612 +18613 +18614 +18615 +18616 +18617 +18618 +18619 +18620 +18621 +18622 +18623 +18624 +18625 +18626 +18627 +18628 +18629 +18630 +18631 +18632 +18633 +18634 +18635 +18636 +18637 +18638 +18639 +18640 +18641 +18642 +18643 +18644 +18645 +18646 +18647 +18648 +18649 +18650 +18651 +18652 +18653 +18654 +18655 +18656 +18657 +18658 +18659 +18660 +18661 +18662 +18663 +18664 +18665 +18666 +18667 +18668 +18669 +18670 +18671 +18672 +18673 +18674 +18675 +18676 +18677 +18678 +18679 +18680 +18681 +18682 +18683 +18684 +18685 +18686 +18687 +18688 +18689 +18690 +18691 +18692 +18693 +18694 +18695 +18696 +18697 +18698 +18699 +18700 +18701 +18702 +18703 +18704 +18705 +18706 +18707 +18708 +18709 +18710 +18711 +18712 +18713 +18714 +18715 +18716 +18717 +18718 +18719 +18720 +18721 +18722 +18723 +18724 +18725 +18726 +18727 +18728 +18729 +18730 +18731 +18732 +18733 +18734 +18735 +18736 +18737 +18738 +18739 +18740 +18741 +18742 +18743 +18744 +18745 +18746 +18747 +18748 +18749 +18750 +18751 +18752 +18753 +18754 +18755 +18756 +18757 +18758 +18759 +18760 +18761 +18762 +18763 +18764 +18765 +18766 +18767 +18768 +18769 +18770 +18771 +18772 +18773 +18774 +18775 +18776 +18777 +18778 +18779 +18780 +18781 +18782 +18783 +18784 +18785 +18786 +18787 +18788 +18789 +18790 +18791 +18792 +18793 +18794 +18795 +18796 +18797 +18798 +18799 +18800 +18801 +18802 +18803 +18804 +18805 +18806 +18807 +18808 +18809 +18810 +18811 +18812 +18813 +18814 +18815 +18816 +18817 +18818 +18819 +18820 +18821 +18822 +18823 +18824 +18825 +18826 +18827 +18828 +18829 +18830 +18831 +18832 +18833 +18834 +18835 +18836 +18837 +18838 +18839 +18840 +18841 +18842 +18843 +18844 +18845 +18846 +18847 +18848 +18849 +18850 +18851 +18852 +18853 +18854 +18855 +18856 +18857 +18858 +18859 +18860 +18861 +18862 +18863 +18864 +18865 +18866 +18867 +18868 +18869 +18870 +18871 +18872 +18873 +18874 +18875 +18876 +18877 +18878 +18879 +18880 +18881 +18882 +18883 +18884 +18885 +18886 +18887 +18888 +18889 +18890 +18891 +18892 +18893 +18894 +18895 +18896 +18897 +18898 +18899 +18900 +18901 +18902 +18903 +18904 +18905 +18906 +18907 +18908 +18909 +18910 +18911 +18912 +18913 +18914 +18915 +18916 +18917 +18918 +18919 +18920 +18921 +18922 +18923 +18924 +18925 +18926 +18927 +18928 +18929 +18930 +18931 +18932 +18933 +18934 +18935 +18936 +18937 +18938 +18939 +18940 +18941 +18942 +18943 +18944 +18945 +18946 +18947 +18948 +18949 +18950 +18951 +18952 +18953 +18954 +18955 +18956 +18957 +18958 +18959 +18960 +18961 +18962 +18963 +18964 +18965 +18966 +18967 +18968 +18969 +18970 +18971 +18972 +18973 +18974 +18975 +18976 +18977 +18978 +18979 +18980 +18981 +18982 +18983 +18984 +18985 +18986 +18987 +18988 +18989 +18990 +18991 +18992 +18993 +18994 +18995 +18996 +18997 +18998 +18999 +19000 +19001 +19002 +19003 +19004 +19005 +19006 +19007 +19008 +19009 +19010 +19011 +19012 +19013 +19014 +19015 +19016 +19017 +19018 +19019 +19020 +19021 +19022 +19023 +19024 +19025 +19026 +19027 +19028 +19029 +19030 +19031 +19032 +19033 +19034 +19035 +19036 +19037 +19038 +19039 +19040 +19041 +19042 +19043 +19044 +19045 +19046 +19047 +19048 +19049 +19050 +19051 +19052 +19053 +19054 +19055 +19056 +19057 +19058 +19059 +19060 +19061 +19062 +19063 +19064 +19065 +19066 +19067 +19068 +19069 +19070 +19071 +19072 +19073 +19074 +19075 +19076 +19077 +19078 +19079 +19080 +19081 +19082 +19083 +19084 +19085 +19086 +19087 +19088 +19089 +19090 +19091 +19092 +19093 +19094 +19095 +19096 +19097 +19098 +19099 +19100 +19101 +19102 +19103 +19104 +19105 +19106 +19107 +19108 +19109 +19110 +19111 +19112 +19113 +19114 +19115 +19116 +19117 +19118 +19119 +19120 +19121 +19122 +19123 +19124 +19125 +19126 +19127 +19128 +19129 +19130 +19131 +19132 +19133 +19134 +19135 +19136 +19137 +19138 +19139 +19140 +19141 +19142 +19143 +19144 +19145 +19146 +19147 +19148 +19149 +19150 +19151 +19152 +19153 +19154 +19155 +19156 +19157 +19158 +19159 +19160 +19161 +19162 +19163 +19164 +19165 +19166 +19167 +19168 +19169 +19170 +19171 +19172 +19173 +19174 +19175 +19176 +19177 +19178 +19179 +19180 +19181 +19182 +19183 +19184 +19185 +19186 +19187 +19188 +19189 +19190 +19191 +19192 +19193 +19194 +19195 +19196 +19197 +19198 +19199 +19200 +19201 +19202 +19203 +19204 +19205 +19206 +19207 +19208 +19209 +19210 +19211 +19212 +19213 +19214 +19215 +19216 +19217 +19218 +19219 +19220 +19221 +19222 +19223 +19224 +19225 +19226 +19227 +19228 +19229 +19230 +19231 +19232 +19233 +19234 +19235 +19236 +19237 +19238 +19239 +19240 +19241 +19242 +19243 +19244 +19245 +19246 +19247 +19248 +19249 +19250 +19251 +19252 +19253 +19254 +19255 +19256 +19257 +19258 +19259 +19260 +19261 +19262 +19263 +19264 +19265 +19266 +19267 +19268 +19269 +19270 +19271 +19272 +19273 +19274 +19275 +19276 +19277 +19278 +19279 +19280 +19281 +19282 +19283 +19284 +19285 +19286 +19287 +19288 +19289 +19290 +19291 +19292 +19293 +19294 +19295 +19296 +19297 +19298 +19299 +19300 +19301 +19302 +19303 +19304 +19305 +19306 +19307 +19308 +19309 +19310 +19311 +19312 +19313 +19314 +19315 +19316 +19317 +19318 +19319 +19320 +19321 +19322 +19323 +19324 +19325 +19326 +19327 +19328 +19329 +19330 +19331 +19332 +19333 +19334 +19335 +19336 +19337 +19338 +19339 +19340 +19341 +19342 +19343 +19344 +19345 +19346 +19347 +19348 +19349 +19350 +19351 +19352 +19353 +19354 +19355 +19356 +19357 +19358 +19359 +19360 +19361 +19362 +19363 +19364 +19365 +19366 +19367 +19368 +19369 +19370 +19371 +19372 +19373 +19374 +19375 +19376 +19377 +19378 +19379 +19380 +19381 +19382 +19383 +19384 +19385 +19386 +19387 +19388 +19389 +19390 +19391 +19392 +19393 +19394 +19395 +19396 +19397 +19398 +19399 +19400 +19401 +19402 +19403 +19404 +19405 +19406 +19407 +19408 +19409 +19410 +19411 +19412 +19413 +19414 +19415 +19416 +19417 +19418 +19419 +19420 +19421 +19422 +19423 +19424 +19425 +19426 +19427 +19428 +19429 +19430 +19431 +19432 +19433 +19434 +19435 +19436 +19437 +19438 +19439 +19440 +19441 +19442 +19443 +19444 +19445 +19446 +19447 +19448 +19449 +19450 +19451 +19452 +19453 +19454 +19455 +19456 +19457 +19458 +19459 +19460 +19461 +19462 +19463 +19464 +19465 +19466 +19467 +19468 +19469 +19470 +19471 +19472 +19473 +19474 +19475 +19476 +19477 +19478 +19479 +19480 +19481 +19482 +19483 +19484 +19485 +19486 +19487 +19488 +19489 +19490 +19491 +19492 +19493 +19494 +19495 +19496 +19497 +19498 +19499 +19500 +19501 +19502 +19503 +19504 +19505 +19506 +19507 +19508 +19509 +19510 +19511 +19512 +19513 +19514 +19515 +19516 +19517 +19518 +19519 +19520 +19521 +19522 +19523 +19524 +19525 +19526 +19527 +19528 +19529 +19530 +19531 +19532 +19533 +19534 +19535 +19536 +19537 +19538 +19539 +19540 +19541 +19542 +19543 +19544 +19545 +19546 +19547 +19548 +19549 +19550 +19551 +19552 +19553 +19554 +19555 +19556 +19557 +19558 +19559 +19560 +19561 +19562 +19563 +19564 +19565 +19566 +19567 +19568 +19569 +19570 +19571 +19572 +19573 +19574 +19575 +19576 +19577 +19578 +19579 +19580 +19581 +19582 +19583 +19584 +19585 +19586 +19587 +19588 +19589 +19590 +19591 +19592 +19593 +19594 +19595 +19596 +19597 +19598 +19599 +19600 +19601 +19602 +19603 +19604 +19605 +19606 +19607 +19608 +19609 +19610 +19611 +19612 +19613 +19614 +19615 +19616 +19617 +19618 +19619 +19620 +19621 +19622 +19623 +19624 +19625 +19626 +19627 +19628 +19629 +19630 +19631 +19632 +19633 +19634 +19635 +19636 +19637 +19638 +19639 +19640 +19641 +19642 +19643 +19644 +19645 +19646 +19647 +19648 +19649 +19650 +19651 +19652 +19653 +19654 +19655 +19656 +19657 +19658 +19659 +19660 +19661 +19662 +19663 +19664 +19665 +19666 +19667 +19668 +19669 +19670 +19671 +19672 +19673 +19674 +19675 +19676 +19677 +19678 +19679 +19680 +19681 +19682 +19683 +19684 +19685 +19686 +19687 +19688 +19689 +19690 +19691 +19692 +19693 +19694 +19695 +19696 +19697 +19698 +19699 +19700 +19701 +19702 +19703 +19704 +19705 +19706 +19707 +19708 +19709 +19710 +19711 +19712 +19713 +19714 +19715 +19716 +19717 +19718 +19719 +19720 +19721 +19722 +19723 +19724 +19725 +19726 +19727 +19728 +19729 +19730 +19731 +19732 +19733 +19734 +19735 +19736 +19737 +19738 +19739 +19740 +19741 +19742 +19743 +19744 +19745 +19746 +19747 +19748 +19749 +19750 +19751 +19752 +19753 +19754 +19755 +19756 +19757 +19758 +19759 +19760 +19761 +19762 +19763 +19764 +19765 +19766 +19767 +19768 +19769 +19770 +19771 +19772 +19773 +19774 +19775 +19776 +19777 +19778 +19779 +19780 +19781 +19782 +19783 +19784 +19785 +19786 +19787 +19788 +19789 +19790 +19791 +19792 +19793 +19794 +19795 +19796 +19797 +19798 +19799 +19800 +19801 +19802 +19803 +19804 +19805 +19806 +19807 +19808 +19809 +19810 +19811 +19812 +19813 +19814 +19815 +19816 +19817 +19818 +19819 +19820 +19821 +19822 +19823 +19824 +19825 +19826 +19827 +19828 +19829 +19830 +19831 +19832 +19833 +19834 +19835 +19836 +19837 +19838 +19839 +19840 +19841 +19842 +19843 +19844 +19845 +19846 +19847 +19848 +19849 +19850 +19851 +19852 +19853 +19854 +19855 +19856 +19857 +19858 +19859 +19860 +19861 +19862 +19863 +19864 +19865 +19866 +19867 +19868 +19869 +19870 +19871 +19872 +19873 +19874 +19875 +19876 +19877 +19878 +19879 +19880 +19881 +19882 +19883 +19884 +19885 +19886 +19887 +19888 +19889 +19890 +19891 +19892 +19893 +19894 +19895 +19896 +19897 +19898 +19899 +19900 +19901 +19902 +19903 +19904 +19905 +19906 +19907 +19908 +19909 +19910 +19911 +19912 +19913 +19914 +19915 +19916 +19917 +19918 +19919 +19920 +19921 +19922 +19923 +19924 +19925 +19926 +19927 +19928 +19929 +19930 +19931 +19932 +19933 +19934 +19935 +19936 +19937 +19938 +19939 +19940 +19941 +19942 +19943 +19944 +19945 +19946 +19947 +19948 +19949 +19950 +19951 +19952 +19953 +19954 +19955 +19956 +19957 +19958 +19959 +19960 +19961 +19962 +19963 +19964 +19965 +19966 +19967 +19968 +19969 +19970 +19971 +19972 +19973 +19974 +19975 +19976 +19977 +19978 +19979 +19980 +19981 +19982 +19983 +19984 +19985 +19986 +19987 +19988 +19989 +19990 +19991 +19992 +19993 +19994 +19995 +19996 +19997 +19998 +19999 +20000 +20001 +20002 +20003 +20004 +20005 +20006 +20007 +20008 +20009 +20010 +20011 +20012 +20013 +20014 +20015 +20016 +20017 +20018 +20019 +20020 +20021 +20022 +20023 +20024 +20025 +20026 +20027 +20028 +20029 +20030 +20031 +20032 +20033 +20034 +20035 +20036 +20037 +20038 +20039 +20040 +20041 +20042 +20043 +20044 +20045 +20046 +20047 +20048 +20049 +20050 +20051 +20052 +20053 +20054 +20055 +20056 +20057 +20058 +20059 +20060 +20061 +20062 +20063 +20064 +20065 +20066 +20067 +20068 +20069 +20070 +20071 +20072 +20073 +20074 +20075 +20076 +20077 +20078 +20079 +20080 +20081 +20082 +20083 +20084 +20085 +20086 +20087 +20088 +20089 +20090 +20091 +20092 +20093 +20094 +20095 +20096 +20097 +20098 +20099 +20100 +20101 +20102 +20103 +20104 +20105 +20106 +20107 +20108 +20109 +20110 +20111 +20112 +20113 +20114 +20115 +20116 +20117 +20118 +20119 +20120 +20121 +20122 +20123 +20124 +20125 +20126 +20127 +20128 +20129 +20130 +20131 +20132 +20133 +20134 +20135 +20136 +20137 +20138 +20139 +20140 +20141 +20142 +20143 +20144 +20145 +20146 +20147 +20148 +20149 +20150 +20151 +20152 +20153 +20154 +20155 +20156 +20157 +20158 +20159 +20160 +20161 +20162 +20163 +20164 +20165 +20166 +20167 +20168 +20169 +20170 +20171 +20172 +20173 +20174 +20175 +20176 +20177 +20178 +20179 +20180 +20181 +20182 +20183 +20184 +20185 +20186 +20187 +20188 +20189 +20190 +20191 +20192 +20193 +20194 +20195 +20196 +20197 +20198 +20199 +20200 +20201 +20202 +20203 +20204 +20205 +20206 +20207 +20208 +20209 +20210 +20211 +20212 +20213 +20214 +20215 +20216 +20217 +20218 +20219 +20220 +20221 +20222 +20223 +20224 +20225 +20226 +20227 +20228 +20229 +20230 +20231 +20232 +20233 +20234 +20235 +20236 +20237 +20238 +20239 +20240 +20241 +20242 +20243 +20244 +20245 +20246 +20247 +20248 +20249 +20250 +20251 +20252 +20253 +20254 +20255 +20256 +20257 +20258 +20259 +20260 +20261 +20262 +20263 +20264 +20265 +20266 +20267 +20268 +20269 +20270 +20271 +20272 +20273 +20274 +20275 +20276 +20277 +20278 +20279 +20280 +20281 +20282 +20283 +20284 +20285 +20286 +20287 +20288 +20289 +20290 +20291 +20292 +20293 +20294 +20295 +20296 +20297 +20298 +20299 +20300 +20301 +20302 +20303 +20304 +20305 +20306 +20307 +20308 +20309 +20310 +20311 +20312 +20313 +20314 +20315 +20316 +20317 +20318 +20319 +20320 +20321 +20322 +20323 +20324 +20325 +20326 +20327 +20328 +20329 +20330 +20331 +20332 +20333 +20334 +20335 +20336 +20337 +20338 +20339 +20340 +20341 +20342 +20343 +20344 +20345 +20346 +20347 +20348 +20349 +20350 +20351 +20352 +20353 +20354 +20355 +20356 +20357 +20358 +20359 +20360 +20361 +20362 +20363 +20364 +20365 +20366 +20367 +20368 +20369 +20370 +20371 +20372 +20373 +20374 +20375 +20376 +20377 +20378 +20379 +20380 +20381 +20382 +20383 +20384 +20385 +20386 +20387 +20388 +20389 +20390 +20391 +20392 +20393 +20394 +20395 +20396 +20397 +20398 +20399 +20400 +20401 +20402 +20403 +20404 +20405 +20406 +20407 +20408 +20409 +20410 +20411 +20412 +20413 +20414 +20415 +20416 +20417 +20418 +20419 +20420 +20421 +20422 +20423 +20424 +20425 +20426 +20427 +20428 +20429 +20430 +20431 +20432 +20433 +20434 +20435 +20436 +20437 +20438 +20439 +20440 +20441 +20442 +20443 +20444 +20445 +20446 +20447 +20448 +20449 +20450 +20451 +20452 +20453 +20454 +20455 +20456 +20457 +20458 +20459 +20460 +20461 +20462 +20463 +20464 +20465 +20466 +20467 +20468 +20469 +20470 +20471 +20472 +20473 +20474 +20475 +20476 +20477 +20478 +20479 +20480 +20481 +20482 +20483 +20484 +20485 +20486 +20487 +20488 +20489 +20490 +20491 +20492 +20493 +20494 +20495 +20496 +20497 +20498 +20499 +20500 +20501 +20502 +20503 +20504 +20505 +20506 +20507 +20508 +20509 +20510 +20511 +20512 +20513 +20514 +20515 +20516 +20517 +20518 +20519 +20520 +20521 +20522 +20523 +20524 +20525 +20526 +20527 +20528 +20529 +20530 +20531 +20532 +20533 +20534 +20535 +20536 +20537 +20538 +20539 +20540 +20541 +20542 +20543 +20544 +20545 +20546 +20547 +20548 +20549 +20550 +20551 +20552 +20553 +20554 +20555 +20556 +20557 +20558 +20559 +20560 +20561 +20562 +20563 +20564 +20565 +20566 +20567 +20568 +20569 +20570 +20571 +20572 +20573 +20574 +20575 +20576 +20577 +20578 +20579 +20580 +20581 +20582 +20583 +20584 +20585 +20586 +20587 +20588 +20589 +20590 +20591 +20592 +20593 +20594 +20595 +20596 +20597 +20598 +20599 +20600 +20601 +20602 +20603 +20604 +20605 +20606 +20607 +20608 +20609 +20610 +20611 +20612 +20613 +20614 +20615 +20616 +20617 +20618 +20619 +20620 +20621 +20622 +20623 +20624 +20625 +20626 +20627 +20628 +20629 +20630 +20631 +20632 +20633 +20634 +20635 +20636 +20637 +20638 +20639 +20640 +20641 +20642 +20643 +20644 +20645 +20646 +20647 +20648 +20649 +20650 +20651 +20652 +20653 +20654 +20655 +20656 +20657 +20658 +20659 +20660 +20661 +20662 +20663 +20664 +20665 +20666 +20667 +20668 +20669 +20670 +20671 +20672 +20673 +20674 +20675 +20676 +20677 +20678 +20679 +20680 +20681 +20682 +20683 +20684 +20685 +20686 +20687 +20688 +20689 +20690 +20691 +20692 +20693 +20694 +20695 +20696 +20697 +20698 +20699 +20700 +20701 +20702 +20703 +20704 +20705 +20706 +20707 +20708 +20709 +20710 +20711 +20712 +20713 +20714 +20715 +20716 +20717 +20718 +20719 +20720 +20721 +20722 +20723 +20724 +20725 +20726 +20727 +20728 +20729 +20730 +20731 +20732 +20733 +20734 +20735 +20736 +20737 +20738 +20739 +20740 +20741 +20742 +20743 +20744 +20745 +20746 +20747 +20748 +20749 +20750 +20751 +20752 +20753 +20754 +20755 +20756 +20757 +20758 +20759 +20760 +20761 +20762 +20763 +20764 +20765 +20766 +20767 +20768 +20769 +20770 +20771 +20772 +20773 +20774 +20775 +20776 +20777 +20778 +20779 +20780 +20781 +20782 +20783 +20784 +20785 +20786 +20787 +20788 +20789 +20790 +20791 +20792 +20793 +20794 +20795 +20796 +20797 +20798 +20799 +20800 +20801 +20802 +20803 +20804 +20805 +20806 +20807 +20808 +20809 +20810 +20811 +20812 +20813 +20814 +20815 +20816 +20817 +20818 +20819 +20820 +20821 +20822 +20823 +20824 +20825 +20826 +20827 +20828 +20829 +20830 +20831 +20832 +20833 +20834 +20835 +20836 +20837 +20838 +20839 +20840 +20841 +20842 +20843 +20844 +20845 +20846 +20847 +20848 +20849 +20850 +20851 +20852 +20853 +20854 +20855 +20856 +20857 +20858 +20859 +20860 +20861 +20862 +20863 +20864 +20865 +20866 +20867 +20868 +20869 +20870 +20871 +20872 +20873 +20874 +20875 +20876 +20877 +20878 +20879 +20880 +20881 +20882 +20883 +20884 +20885 +20886 +20887 +20888 +20889 +20890 +20891 +20892 +20893 +20894 +20895 +20896 +20897 +20898 +20899 +20900 +20901 +20902 +20903 +20904 +20905 +20906 +20907 +20908 +20909 +20910 +20911 +20912 +20913 +20914 +20915 +20916 +20917 +20918 +20919 +20920 +20921 +20922 +20923 +20924 +20925 +20926 +20927 +20928 +20929 +20930 +20931 +20932 +20933 +20934 +20935 +20936 +20937 +20938 +20939 +20940 +20941 +20942 +20943 +20944 +20945 +20946 +20947 +20948 +20949 +20950 +20951 +20952 +20953 +20954 +20955 +20956 +20957 +20958 +20959 +20960 +20961 +20962 +20963 +20964 +20965 +20966 +20967 +20968 +20969 +20970 +20971 +20972 +20973 +20974 +20975 +20976 +20977 +20978 +20979 +20980 +20981 +20982 +20983 +20984 +20985 +20986 +20987 +20988 +20989 +20990 +20991 +20992 +20993 +20994 +20995 +20996 +20997 +20998 +20999 +21000 +21001 +21002 +21003 +21004 +21005 +21006 +21007 +21008 +21009 +21010 +21011 +21012 +21013 +21014 +21015 +21016 +21017 +21018 +21019 +21020 +21021 +21022 +21023 +21024 +21025 +21026 +21027 +21028 +21029 +21030 +21031 +21032 +21033 +21034 +21035 +21036 +21037 +21038 +21039 +21040 +21041 +21042 +21043 +21044 +21045 +21046 +21047 +21048 +21049 +21050 +21051 +21052 +21053 +21054 +21055 +21056 +21057 +21058 +21059 +21060 +21061 +21062 +21063 +21064 +21065 +21066 +21067 +21068 +21069 +21070 +21071 +21072 +21073 +21074 +21075 +21076 +21077 +21078 +21079 +21080 +21081 +21082 +21083 +21084 +21085 +21086 +21087 +21088 +21089 +21090 +21091 +21092 +21093 +21094 +21095 +21096 +21097 +21098 +21099 +21100 +21101 +21102 +21103 +21104 +21105 +21106 +21107 +21108 +21109 +21110 +21111 +21112 +21113 +21114 +21115 +21116 +21117 +21118 +21119 +21120 +21121 +21122 +21123 +21124 +21125 +21126 +21127 +21128 +21129 +21130 +21131 +21132 +21133 +21134 +21135 +21136 +21137 +21138 +21139 +21140 +21141 +21142 +21143 +21144 +21145 +21146 +21147 +21148 +21149 +21150 +21151 +21152 +21153 +21154 +21155 +21156 +21157 +21158 +21159 +21160 +21161 +21162 +21163 +21164 +21165 +21166 +21167 +21168 +21169 +21170 +21171 +21172 +21173 +21174 +21175 +21176 +21177 +21178 +21179 +21180 +21181 +21182 +21183 +21184 +21185 +21186 +21187 +21188 +21189 +21190 +21191 +21192 +21193 +21194 +21195 +21196 +21197 +21198 +21199 +21200 +21201 +21202 +21203 +21204 +21205 +21206 +21207 +21208 +21209 +21210 +21211 +21212 +21213 +21214 +21215 +21216 +21217 +21218 +21219 +21220 +21221 +21222 +21223 +21224 +21225 +21226 +21227 +21228 +21229 +21230 +21231 +21232 +21233 +21234 +21235 +21236 +21237 +21238 +21239 +21240 +21241 +21242 +21243 +21244 +21245 +21246 +21247 +21248 +21249 +21250 +21251 +21252 +21253 +21254 +21255 +21256 +21257 +21258 +21259 +21260 +21261 +21262 +21263 +21264 +21265 +21266 +21267 +21268 +21269 +21270 +21271 +21272 +21273 +21274 +21275 +21276 +21277 +21278 +21279 +21280 +21281 +21282 +21283 +21284 +21285 +21286 +21287 +21288 +21289 +21290 +21291 +21292 +21293 +21294 +21295 +21296 +21297 +21298 +21299 +21300 +21301 +21302 +21303 +21304 +21305 +21306 +21307 +21308 +21309 +21310 +21311 +21312 +21313 +21314 +21315 +21316 +21317 +21318 +21319 +21320 +21321 +21322 +21323 +21324 +21325 +21326 +21327 +21328 +21329 +21330 +21331 +21332 +21333 +21334 +21335 +21336 +21337 +21338 +21339 +21340 +21341 +21342 +21343 +21344 +21345 +21346 +21347 +21348 +21349 +21350 +21351 +21352 +21353 +21354 +21355 +21356 +21357 +21358 +21359 +21360 +21361 +21362 +21363 +21364 +21365 +21366 +21367 +21368 +21369 +21370 +21371 +21372 +21373 +21374 +21375 +21376 +21377 +21378 +21379 +21380 +21381 +21382 +21383 +21384 +21385 +21386 +21387 +21388 +21389 +21390 +21391 +21392 +21393 +21394 +21395 +21396 +21397 +21398 +21399 +21400 +21401 +21402 +21403 +21404 +21405 +21406 +21407 +21408 +21409 +21410 +21411 +21412 +21413 +21414 +21415 +21416 +21417 +21418 +21419 +21420 +21421 +21422 +21423 +21424 +21425 +21426 +21427 +21428 +21429 +21430 +21431 +21432 +21433 +21434 +21435 +21436 +21437 +21438 +21439 +21440 +21441 +21442 +21443 +21444 +21445 +21446 +21447 +21448 +21449 +21450 +21451 +21452 +21453 +21454 +21455 +21456 +21457 +21458 +21459 +21460 +21461 +21462 +21463 +21464 +21465 +21466 +21467 +21468 +21469 +21470 +21471 +21472 +21473 +21474 +21475 +21476 +21477 +21478 +21479 +21480 +21481 +21482 +21483 +21484 +21485 +21486 +21487 +21488 +21489 +21490 +21491 +21492 +21493 +21494 +21495 +21496 +21497 +21498 +21499 +21500 +21501 +21502 +21503 +21504 +21505 +21506 +21507 +21508 +21509 +21510 +21511 +21512 +21513 +21514 +21515 +21516 +21517 +21518 +21519 +21520 +21521 +21522 +21523 +21524 +21525 +21526 +21527 +21528 +21529 +21530 +21531 +21532 +21533 +21534 +21535 +21536 +21537 +21538 +21539 +21540 +21541 +21542 +21543 +21544 +21545 +21546 +21547 +21548 +21549 +21550 +21551 +21552 +21553 +21554 +21555 +21556 +21557 +21558 +21559 +21560 +21561 +21562 +21563 +21564 +21565 +21566 +21567 +21568 +21569 +21570 +21571 +21572 +21573 +21574 +21575 +21576 +21577 +21578 +21579 +21580 +21581 +21582 +21583 +21584 +21585 +21586 +21587 +21588 +21589 +21590 +21591 +21592 +21593 +21594 +21595 +21596 +21597 +21598 +21599 +21600 +21601 +21602 +21603 +21604 +21605 +21606 +21607 +21608 +21609 +21610 +21611 +21612 +21613 +21614 +21615 +21616 +21617 +21618 +21619 +21620 +21621 +21622 +21623 +21624 +21625 +21626 +21627 +21628 +21629 +21630 +21631 +21632 +21633 +21634 +21635 +21636 +21637 +21638 +21639 +21640 +21641 +21642 +21643 +21644 +21645 +21646 +21647 +21648 +21649 +21650 +21651 +21652 +21653 +21654 +21655 +21656 +21657 +21658 +21659 +21660 +21661 +21662 +21663 +21664 +21665 +21666 +21667 +21668 +21669 +21670 +21671 +21672 +21673 +21674 +21675 +21676 +21677 +21678 +21679 +21680 +21681 +21682 +21683 +21684 +21685 +21686 +21687 +21688 +21689 +21690 +21691 +21692 +21693 +21694 +21695 +21696 +21697 +21698 +21699 +21700 +21701 +21702 +21703 +21704 +21705 +21706 +21707 +21708 +21709 +21710 +21711 +21712 +21713 +21714 +21715 +21716 +21717 +21718 +21719 +21720 +21721 +21722 +21723 +21724 +21725 +21726 +21727 +21728 +21729 +21730 +21731 +21732 +21733 +21734 +21735 +21736 +21737 +21738 +21739 +21740 +21741 +21742 +21743 +21744 +21745 +21746 +21747 +21748 +21749 +21750 +21751 +21752 +21753 +21754 +21755 +21756 +21757 +21758 +21759 +21760 +21761 +21762 +21763 +21764 +21765 +21766 +21767 +21768 +21769 +21770 +21771 +21772 +21773 +21774 +21775 +21776 +21777 +21778 +21779 +21780 +21781 +21782 +21783 +21784 +21785 +21786 +21787 +21788 +21789 +21790 +21791 +21792 +21793 +21794 +21795 +21796 +21797 +21798 +21799 +21800 +21801 +21802 +21803 +21804 +21805 +21806 +21807 +21808 +21809 +21810 +21811 +21812 +21813 +21814 +21815 +21816 +21817 +21818 +21819 +21820 +21821 +21822 +21823 +21824 +21825 +21826 +21827 +21828 +21829 +21830 +21831 +21832 +21833 +21834 +21835 +21836 +21837 +21838 +21839 +21840 +21841 +21842 +21843 +21844 +21845 +21846 +21847 +21848 +21849 +21850 +21851 +21852 +21853 +21854 +21855 +21856 +21857 +21858 +21859 +21860 +21861 +21862 +21863 +21864 +21865 +21866 +21867 +21868 +21869 +21870 +21871 +21872 +21873 +21874 +21875 +21876 +21877 +21878 +21879 +21880 +21881 +21882 +21883 +21884 +21885 +21886 +21887 +21888 +21889 +21890 +21891 +21892 +21893 +21894 +21895 +21896 +21897 +21898 +21899 +21900 +21901 +21902 +21903 +21904 +21905 +21906 +21907 +21908 +21909 +21910 +21911 +21912 +21913 +21914 +21915 +21916 +21917 +21918 +21919 +21920 +21921 +21922 +21923 +21924 +21925 +21926 +21927 +21928 +21929 +21930 +21931 +21932 +21933 +21934 +21935 +21936 +21937 +21938 +21939 +21940 +21941 +21942 +21943 +21944 +21945 +21946 +21947 +21948 +21949 +21950 +21951 +21952 +21953 +21954 +21955 +21956 +21957 +21958 +21959 +21960 +21961 +21962 +21963 +21964 +21965 +21966 +21967 +21968 +21969 +21970 +21971 +21972 +21973 +21974 +21975 +21976 +21977 +21978 +21979 +21980 +21981 +21982 +21983 +21984 +21985 +21986 +21987 +21988 +21989 +21990 +21991 +21992 +21993 +21994 +21995 +21996 +21997 +21998 +21999 +22000 +22001 +22002 +22003 +22004 +22005 +22006 +22007 +22008 +22009 +22010 +22011 +22012 +22013 +22014 +22015 +22016 +22017 +22018 +22019 +22020 +22021 +22022 +22023 +22024 +22025 +22026 +22027 +22028 +22029 +22030 +22031 +22032 +22033 +22034 +22035 +22036 +22037 +22038 +22039 +22040 +22041 +22042 +22043 +22044 +22045 +22046 +22047 +22048 +22049 +22050 +22051 +22052 +22053 +22054 +22055 +22056 +22057 +22058 +22059 +22060 +22061 +22062 +22063 +22064 +22065 +22066 +22067 +22068 +22069 +22070 +22071 +22072 +22073 +22074 +22075 +22076 +22077 +22078 +22079 +22080 +22081 +22082 +22083 +22084 +22085 +22086 +22087 +22088 +22089 +22090 +22091 +22092 +22093 +22094 +22095 +22096 +22097 +22098 +22099 +22100 +22101 +22102 +22103 +22104 +22105 +22106 +22107 +22108 +22109 +22110 +22111 +22112 +22113 +22114 +22115 +22116 +22117 +22118 +22119 +22120 +22121 +22122 +22123 +22124 +22125 +22126 +22127 +22128 +22129 +22130 +22131 +22132 +22133 +22134 +22135 +22136 +22137 +22138 +22139 +22140 +22141 +22142 +22143 +22144 +22145 +22146 +22147 +22148 +22149 +22150 +22151 +22152 +22153 +22154 +22155 +22156 +22157 +22158 +22159 +22160 +22161 +22162 +22163 +22164 +22165 +22166 +22167 +22168 +22169 +22170 +22171 +22172 +22173 +22174 +22175 +22176 +22177 +22178 +22179 +22180 +22181 +22182 +22183 +22184 +22185 +22186 +22187 +22188 +22189 +22190 +22191 +22192 +22193 +22194 +22195 +22196 +22197 +22198 +22199 +22200 +22201 +22202 +22203 +22204 +22205 +22206 +22207 +22208 +22209 +22210 +22211 +22212 +22213 +22214 +22215 +22216 +22217 +22218 +22219 +22220 +22221 +22222 +22223 +22224 +22225 +22226 +22227 +22228 +22229 +22230 +22231 +22232 +22233 +22234 +22235 +22236 +22237 +22238 +22239 +22240 +22241 +22242 +22243 +22244 +22245 +22246 +22247 +22248 +22249 +22250 +22251 +22252 +22253 +22254 +22255 +22256 +22257 +22258 +22259 +22260 +22261 +22262 +22263 +22264 +22265 +22266 +22267 +22268 +22269 +22270 +22271 +22272 +22273 +22274 +22275 +22276 +22277 +22278 +22279 +22280 +22281 +22282 +22283 +22284 +22285 +22286 +22287 +22288 +22289 +22290 +22291 +22292 +22293 +22294 +22295 +22296 +22297 +22298 +22299 +22300 +22301 +22302 +22303 +22304 +22305 +22306 +22307 +22308 +22309 +22310 +22311 +22312 +22313 +22314 +22315 +22316 +22317 +22318 +22319 +22320 +22321 +22322 +22323 +22324 +22325 +22326 +22327 +22328 +22329 +22330 +22331 +22332 +22333 +22334 +22335 +22336 +22337 +22338 +22339 +22340 +22341 +22342 +22343 +22344 +22345 +22346 +22347 +22348 +22349 +22350 +22351 +22352 +22353 +22354 +22355 +22356 +22357 +22358 +22359 +22360 +22361 +22362 +22363 +22364 +22365 +22366 +22367 +22368 +22369 +22370 +22371 +22372 +22373 +22374 +22375 +22376 +22377 +22378 +22379 +22380 +22381 +22382 +22383 +22384 +22385 +22386 +22387 +22388 +22389 +22390 +22391 +22392 +22393 +22394 +22395 +22396 +22397 +22398 +22399 +22400 +22401 +22402 +22403 +22404 +22405 +22406 +22407 +22408 +22409 +22410 +22411 +22412 +22413 +22414 +22415 +22416 +22417 +22418 +22419 +22420 +22421 +22422 +22423 +22424 +22425 +22426 +22427 +22428 +22429 +22430 +22431 +22432 +22433 +22434 +22435 +22436 +22437 +22438 +22439 +22440 +22441 +22442 +22443 +22444 +22445 +22446 +22447 +22448 +22449 +22450 +22451 +22452 +22453 +22454 +22455 +22456 +22457 +22458 +22459 +22460 +22461 +22462 +22463 +22464 +22465 +22466 +22467 +22468 +22469 +22470 +22471 +22472 +22473 +22474 +22475 +22476 +22477 +22478 +22479 +22480 +22481 +22482 +22483 +22484 +22485 +22486 +22487 +22488 +22489 +22490 +22491 +22492 +22493 +22494 +22495 +22496 +22497 +22498 +22499 +22500 +22501 +22502 +22503 +22504 +22505 +22506 +22507 +22508 +22509 +22510 +22511 +22512 +22513 +22514 +22515 +22516 +22517 +22518 +22519 +22520 +22521 +22522 +22523 +22524 +22525 +22526 +22527 +22528 +22529 +22530 +22531 +22532 +22533 +22534 +22535 +22536 +22537 +22538 +22539 +22540 +22541 +22542 +22543 +22544 +22545 +22546 +22547 +22548 +22549 +22550 +22551 +22552 +22553 +22554 +22555 +22556 +22557 +22558 +22559 +22560 +22561 +22562 +22563 +22564 +22565 +22566 +22567 +22568 +22569 +22570 +22571 +22572 +22573 +22574 +22575 +22576 +22577 +22578 +22579 +22580 +22581 +22582 +22583 +22584 +22585 +22586 +22587 +22588 +22589 +22590 +22591 +22592 +22593 +22594 +22595 +22596 +22597 +22598 +22599 +22600 +22601 +22602 +22603 +22604 +22605 +22606 +22607 +22608 +22609 +22610 +22611 +22612 +22613 +22614 +22615 +22616 +22617 +22618 +22619 +22620 +22621 +22622 +22623 +22624 +22625 +22626 +22627 +22628 +22629 +22630 +22631 +22632 +22633 +22634 +22635 +22636 +22637 +22638 +22639 +22640 +22641 +22642 +22643 +22644 +22645 +22646 +22647 +22648 +22649 +22650 +22651 +22652 +22653 +22654 +22655 +22656 +22657 +22658 +22659 +22660 +22661 +22662 +22663 +22664 +22665 +22666 +22667 +22668 +22669 +22670 +22671 +22672 +22673 +22674 +22675 +22676 +22677 +22678 +22679 +22680 +22681 +22682 +22683 +22684 +22685 +22686 +22687 +22688 +22689 +22690 +22691 +22692 +22693 +22694 +22695 +22696 +22697 +22698 +22699 +22700 +22701 +22702 +22703 +22704 +22705 +22706 +22707 +22708 +22709 +22710 +22711 +22712 +22713 +22714 +22715 +22716 +22717 +22718 +22719 +22720 +22721 +22722 +22723 +22724 +22725 +22726 +22727 +22728 +22729 +22730 +22731 +22732 +22733 +22734 +22735 +22736 +22737 +22738 +22739 +22740 +22741 +22742 +22743 +22744 +22745 +22746 +22747 +22748 +22749 +22750 +22751 +22752 +22753 +22754 +22755 +22756 +22757 +22758 +22759 +22760 +22761 +22762 +22763 +22764 +22765 +22766 +22767 +22768 +22769 +22770 +22771 +22772 +22773 +22774 +22775 +22776 +22777 +22778 +22779 +22780 +22781 +22782 +22783 +22784 +22785 +22786 +22787 +22788 +22789 +22790 +22791 +22792 +22793 +22794 +22795 +22796 +22797 +22798 +22799 +22800 +22801 +22802 +22803 +22804 +22805 +22806 +22807 +22808 +22809 +22810 +22811 +22812 +22813 +22814 +22815 +22816 +22817 +22818 +22819 +22820 +22821 +22822 +22823 +22824 +22825 +22826 +22827 +22828 +22829 +22830 +22831 +22832 +22833 +22834 +22835 +22836 +22837 +22838 +22839 +22840 +22841 +22842 +22843 +22844 +22845 +22846 +22847 +22848 +22849 +22850 +22851 +22852 +22853 +22854 +22855 +22856 +22857 +22858 +22859 +22860 +22861 +22862 +22863 +22864 +22865 +22866 +22867 +22868 +22869 +22870 +22871 +22872 +22873 +22874 +22875 +22876 +22877 +22878 +22879 +22880 +22881 +22882 +22883 +22884 +22885 +22886 +22887 +22888 +22889 +22890 +22891 +22892 +22893 +22894 +22895 +22896 +22897 +22898 +22899 +22900 +22901 +22902 +22903 +22904 +22905 +22906 +22907 +22908 +22909 +22910 +22911 +22912 +22913 +22914 +22915 +22916 +22917 +22918 +22919 +22920 +22921 +22922 +22923 +22924 +22925 +22926 +22927 +22928 +22929 +22930 +22931 +22932 +22933 +22934 +22935 +22936 +22937 +22938 +22939 +22940 +22941 +22942 +22943 +22944 +22945 +22946 +22947 +22948 +22949 +22950 +22951 +22952 +22953 +22954 +22955 +22956 +22957 +22958 +22959 +22960 +22961 +22962 +22963 +22964 +22965 +22966 +22967 +22968 +22969 +22970 +22971 +22972 +22973 +22974 +22975 +22976 +22977 +22978 +22979 +22980 +22981 +22982 +22983 +22984 +22985 +22986 +22987 +22988 +22989 +22990 +22991 +22992 +22993 +22994 +22995 +22996 +22997 +22998 +22999 +23000 +23001 +23002 +23003 +23004 +23005 +23006 +23007 +23008 +23009 +23010 +23011 +23012 +23013 +23014 +23015 +23016 +23017 +23018 +23019 +23020 +23021 +23022 +23023 +23024 +23025 +23026 +23027 +23028 +23029 +23030 +23031 +23032 +23033 +23034 +23035 +23036 +23037 +23038 +23039 +23040 +23041 +23042 +23043 +23044 +23045 +23046 +23047 +23048 +23049 +23050 +23051 +23052 +23053 +23054 +23055 +23056 +23057 +23058 +23059 +23060 +23061 +23062 +23063 +23064 +23065 +23066 +23067 +23068 +23069 +23070 +23071 +23072 +23073 +23074 +23075 +23076 +23077 +23078 +23079 +23080 +23081 +23082 +23083 +23084 +23085 +23086 +23087 +23088 +23089 +23090 +23091 +23092 +23093 +23094 +23095 +23096 +23097 +23098 +23099 +23100 +23101 +23102 +23103 +23104 +23105 +23106 +23107 +23108 +23109 +23110 +23111 +23112 +23113 +23114 +23115 +23116 +23117 +23118 +23119 +23120 +23121 +23122 +23123 +23124 +23125 +23126 +23127 +23128 +23129 +23130 +23131 +23132 +23133 +23134 +23135 +23136 +23137 +23138 +23139 +23140 +23141 +23142 +23143 +23144 +23145 +23146 +23147 +23148 +23149 +23150 +23151 +23152 +23153 +23154 +23155 +23156 +23157 +23158 +23159 +23160 +23161 +23162 +23163 +23164 +23165 +23166 +23167 +23168 +23169 +23170 +23171 +23172 +23173 +23174 +23175 +23176 +23177 +23178 +23179 +23180 +23181 +23182 +23183 +23184 +23185 +23186 +23187 +23188 +23189 +23190 +23191 +23192 +23193 +23194 +23195 +23196 +23197 +23198 +23199 +23200 +23201 +23202 +23203 +23204 +23205 +23206 +23207 +23208 +23209 +23210 +23211 +23212 +23213 +23214 +23215 +23216 +23217 +23218 +23219 +23220 +23221 +23222 +23223 +23224 +23225 +23226 +23227 +23228 +23229 +23230 +23231 +23232 +23233 +23234 +23235 +23236 +23237 +23238 +23239 +23240 +23241 +23242 +23243 +23244 +23245 +23246 +23247 +23248 +23249 +23250 +23251 +23252 +23253 +23254 +23255 +23256 +23257 +23258 +23259 +23260 +23261 +23262 +23263 +23264 +23265 +23266 +23267 +23268 +23269 +23270 +23271 +23272 +23273 +23274 +23275 +23276 +23277 +23278 +23279 +23280 +23281 +23282 +23283 +23284 +23285 +23286 +23287 +23288 +23289 +23290 +23291 +23292 +23293 +23294 +23295 +23296 +23297 +23298 +23299 +23300 +23301 +23302 +23303 +23304 +23305 +23306 +23307 +23308 +23309 +23310 +23311 +23312 +23313 +23314 +23315 +23316 +23317 +23318 +23319 +23320 +23321 +23322 +23323 +23324 +23325 +23326 +23327 +23328 +23329 +23330 +23331 +23332 +23333 +23334 +23335 +23336 +23337 +23338 +23339 +23340 +23341 +23342 +23343 +23344 +23345 +23346 +23347 +23348 +23349 +23350 +23351 +23352 +23353 +23354 +23355 +23356 +23357 +23358 +23359 +23360 +23361 +23362 +23363 +23364 +23365 +23366 +23367 +23368 +23369 +23370 +23371 +23372 +23373 +23374 +23375 +23376 +23377 +23378 +23379 +23380 +23381 +23382 +23383 +23384 +23385 +23386 +23387 +23388 +23389 +23390 +23391 +23392 +23393 +23394 +23395 +23396 +23397 +23398 +23399 +23400 +23401 +23402 +23403 +23404 +23405 +23406 +23407 +23408 +23409 +23410 +23411 +23412 +23413 +23414 +23415 +23416 +23417 +23418 +23419 +23420 +23421 +23422 +23423 +23424 +23425 +23426 +23427 +23428 +23429 +23430 +23431 +23432 +23433 +23434 +23435 +23436 +23437 +23438 +23439 +23440 +23441 +23442 +23443 +23444 +23445 +23446 +23447 +23448 +23449 +23450 +23451 +23452 +23453 +23454 +23455 +23456 +23457 +23458 +23459 +23460 +23461 +23462 +23463 +23464 +23465 +23466 +23467 +23468 +23469 +23470 +23471 +23472 +23473 +23474 +23475 +23476 +23477 +23478 +23479 +23480 +23481 +23482 +23483 +23484 +23485 +23486 +23487 +23488 +23489 +23490 +23491 +23492 +23493 +23494 +23495 +23496 +23497 +23498 +23499 +23500 +23501 +23502 +23503 +23504 +23505 +23506 +23507 +23508 +23509 +23510 +23511 +23512 +23513 +23514 +23515 +23516 +23517 +23518 +23519 +23520 +23521 +23522 +23523 +23524 +23525 +23526 +23527 +23528 +23529 +23530 +23531 +23532 +23533 +23534 +23535 +23536 +23537 +23538 +23539 +23540 +23541 +23542 +23543 +23544 +23545 +23546 +23547 +23548 +23549 +23550 +23551 +23552 +23553 +23554 +23555 +23556 +23557 +23558 +23559 +23560 +23561 +23562 +23563 +23564 +23565 +23566 +23567 +23568 +23569 +23570 +23571 +23572 +23573 +23574 +23575 +23576 +23577 +23578 +23579 +23580 +23581 +23582 +23583 +23584 +23585 +23586 +23587 +23588 +23589 +23590 +23591 +23592 +23593 +23594 +23595 +23596 +23597 +23598 +23599 +23600 +23601 +23602 +23603 +23604 +23605 +23606 +23607 +23608 +23609 +23610 +23611 +23612 +23613 +23614 +23615 +23616 +23617 +23618 +23619 +23620 +23621 +23622 +23623 +23624 +23625 +23626 +23627 +23628 +23629 +23630 +23631 +23632 +23633 +23634 +23635 +23636 +23637 +23638 +23639 +23640 +23641 +23642 +23643 +23644 +23645 +23646 +23647 +23648 +23649 +23650 +23651 +23652 +23653 +23654 +23655 +23656 +23657 +23658 +23659 +23660 +23661 +23662 +23663 +23664 +23665 +23666 +23667 +23668 +23669 +23670 +23671 +23672 +23673 +23674 +23675 +23676 +23677 +23678 +23679 +23680 +23681 +23682 +23683 +23684 +23685 +23686 +23687 +23688 +23689 +23690 +23691 +23692 +23693 +23694 +23695 +23696 +23697 +23698 +23699 +23700 +23701 +23702 +23703 +23704 +23705 +23706 +23707 +23708 +23709 +23710 +23711 +23712 +23713 +23714 +23715 +23716 +23717 +23718 +23719 +23720 +23721 +23722 +23723 +23724 +23725 +23726 +23727 +23728 +23729 +23730 +23731 +23732 +23733 +23734 +23735 +23736 +23737 +23738 +23739 +23740 +23741 +23742 +23743 +23744 +23745 +23746 +23747 +23748 +23749 +23750 +23751 +23752 +23753 +23754 +23755 +23756 +23757 +23758 +23759 +23760 +23761 +23762 +23763 +23764 +23765 +23766 +23767 +23768 +23769 +23770 +23771 +23772 +23773 +23774 +23775 +23776 +23777 +23778 +23779 +23780 +23781 +23782 +23783 +23784 +23785 +23786 +23787 +23788 +23789 +23790 +23791 +23792 +23793 +23794 +23795 +23796 +23797 +23798 +23799 +23800 +23801 +23802 +23803 +23804 +23805 +23806 +23807 +23808 +23809 +23810 +23811 +23812 +23813 +23814 +23815 +23816 +23817 +23818 +23819 +23820 +23821 +23822 +23823 +23824 +23825 +23826 +23827 +23828 +23829 +23830 +23831 +23832 +23833 +23834 +23835 +23836 +23837 +23838 +23839 +23840 +23841 +23842 +23843 +23844 +23845 +23846 +23847 +23848 +23849 +23850 +23851 +23852 +23853 +23854 +23855 +23856 +23857 +23858 +23859 +23860 +23861 +23862 +23863 +23864 +23865 +23866 +23867 +23868 +23869 +23870 +23871 +23872 +23873 +23874 +23875 +23876 +23877 +23878 +23879 +23880 +23881 +23882 +23883 +23884 +23885 +23886 +23887 +23888 +23889 +23890 +23891 +23892 +23893 +23894 +23895 +23896 +23897 +23898 +23899 +23900 +23901 +23902 +23903 +23904 +23905 +23906 +23907 +23908 +23909 +23910 +23911 +23912 +23913 +23914 +23915 +23916 +23917 +23918 +23919 +23920 +23921 +23922 +23923 +23924 +23925 +23926 +23927 +23928 +23929 +23930 +23931 +23932 +23933 +23934 +23935 +23936 +23937 +23938 +23939 +23940 +23941 +23942 +23943 +23944 +23945 +23946 +23947 +23948 +23949 +23950 +23951 +23952 +23953 +23954 +23955 +23956 +23957 +23958 +23959 +23960 +23961 +23962 +23963 +23964 +23965 +23966 +23967 +23968 +23969 +23970 +23971 +23972 +23973 +23974 +23975 +23976 +23977 +23978 +23979 +23980 +23981 +23982 +23983 +23984 +23985 +23986 +23987 +23988 +23989 +23990 +23991 +23992 +23993 +23994 +23995 +23996 +23997 +23998 +23999 +24000 +24001 +24002 +24003 +24004 +24005 +24006 +24007 +24008 +24009 +24010 +24011 +24012 +24013 +24014 +24015 +24016 +24017 +24018 +24019 +24020 +24021 +24022 +24023 +24024 +24025 +24026 +24027 +24028 +24029 +24030 +24031 +24032 +24033 +24034 +24035 +24036 +24037 +24038 +24039 +24040 +24041 +24042 +24043 +24044 +24045 +24046 +24047 +24048 +24049 +24050 +24051 +24052 +24053 +24054 +24055 +24056 +24057 +24058 +24059 +24060 +24061 +24062 +24063 +24064 +24065 +24066 +24067 +24068 +24069 +24070 +24071 +24072 +24073 +24074 +24075 +24076 +24077 +24078 +24079 +24080 +24081 +24082 +24083 +24084 +24085 +24086 +24087 +24088 +24089 +24090 +24091 +24092 +24093 +24094 +24095 +24096 +24097 +24098 +24099 +24100 +24101 +24102 +24103 +24104 +24105 +24106 +24107 +24108 +24109 +24110 +24111 +24112 +24113 +24114 +24115 +24116 +24117 +24118 +24119 +24120 +24121 +24122 +24123 +24124 +24125 +24126 +24127 +24128 +24129 +24130 +24131 +24132 +24133 +24134 +24135 +24136 +24137 +24138 +24139 +24140 +24141 +24142 +24143 +24144 +24145 +24146 +24147 +24148 +24149 +24150 +24151 +24152 +24153 +24154 +24155 +24156 +24157 +24158 +24159 +24160 +24161 +24162 +24163 +24164 +24165 +24166 +24167 +24168 +24169 +24170 +24171 +24172 +24173 +24174 +24175 +24176 +24177 +24178 +24179 +24180 +24181 +24182 +24183 +24184 +24185 +24186 +24187 +24188 +24189 +24190 +24191 +24192 +24193 +24194 +24195 +24196 +24197 +24198 +24199 +24200 +24201 +24202 +24203 +24204 +24205 +24206 +24207 +24208 +24209 +24210 +24211 +24212 +24213 +24214 +24215 +24216 +24217 +24218 +24219 +24220 +24221 +24222 +24223 +24224 +24225 +24226 +24227 +24228 +24229 +24230 +24231 +24232 +24233 +24234 +24235 +24236 +24237 +24238 +24239 +24240 +24241 +24242 +24243 +24244 +24245 +24246 +24247 +24248 +24249 +24250 +24251 +24252 +24253 +24254 +24255 +24256 +24257 +24258 +24259 +24260 +24261 +24262 +24263 +24264 +24265 +24266 +24267 +24268 +24269 +24270 +24271 +24272 +24273 +24274 +24275 +24276 +24277 +24278 +24279 +24280 +24281 +24282 +24283 +24284 +24285 +24286 +24287 +24288 +24289 +24290 +24291 +24292 +24293 +24294 +24295 +24296 +24297 +24298 +24299 +24300 +24301 +24302 +24303 +24304 +24305 +24306 +24307 +24308 +24309 +24310 +24311 +24312 +24313 +24314 +24315 +24316 +24317 +24318 +24319 +24320 +24321 +24322 +24323 +24324 +24325 +24326 +24327 +24328 +24329 +24330 +24331 +24332 +24333 +24334 +24335 +24336 +24337 +24338 +24339 +24340 +24341 +24342 +24343 +24344 +24345 +24346 +24347 +24348 +24349 +24350 +24351 +24352 +24353 +24354 +24355 +24356 +24357 +24358 +24359 +24360 +24361 +24362 +24363 +24364 +24365 +24366 +24367 +24368 +24369 +24370 +24371 +24372 +24373 +24374 +24375 +24376 +24377 +24378 +24379 +24380 +24381 +24382 +24383 +24384 +24385 +24386 +24387 +24388 +24389 +24390 +24391 +24392 +24393 +24394 +24395 +24396 +24397 +24398 +24399 +24400 +24401 +24402 +24403 +24404 +24405 +24406 +24407 +24408 +24409 +24410 +24411 +24412 +24413 +24414 +24415 +24416 +24417 +24418 +24419 +24420 +24421 +24422 +24423 +24424 +24425 +24426 +24427 +24428 +24429 +24430 +24431 +24432 +24433 +24434 +24435 +24436 +24437 +24438 +24439 +24440 +24441 +24442 +24443 +24444 +24445 +24446 +24447 +24448 +24449 +24450 +24451 +24452 +24453 +24454 +24455 +24456 +24457 +24458 +24459 +24460 +24461 +24462 +24463 +24464 +24465 +24466 +24467 +24468 +24469 +24470 +24471 +24472 +24473 +24474 +24475 +24476 +24477 +24478 +24479 +24480 +24481 +24482 +24483 +24484 +24485 +24486 +24487 +24488 +24489 +24490 +24491 +24492 +24493 +24494 +24495 +24496 +24497 +24498 +24499 +24500 +24501 +24502 +24503 +24504 +24505 +24506 +24507 +24508 +24509 +24510 +24511 +24512 +24513 +24514 +24515 +24516 +24517 +24518 +24519 +24520 +24521 +24522 +24523 +24524 +24525 +24526 +24527 +24528 +24529 +24530 +24531 +24532 +24533 +24534 +24535 +24536 +24537 +24538 +24539 +24540 +24541 +24542 +24543 +24544 +24545 +24546 +24547 +24548 +24549 +24550 +24551 +24552 +24553 +24554 +24555 +24556 +24557 +24558 +24559 +24560 +24561 +24562 +24563 +24564 +24565 +24566 +24567 +24568 +24569 +24570 +24571 +24572 +24573 +24574 +24575 +24576 +24577 +24578 +24579 +24580 +24581 +24582 +24583 +24584 +24585 +24586 +24587 +24588 +24589 +24590 +24591 +24592 +24593 +24594 +24595 +24596 +24597 +24598 +24599 +24600 +24601 +24602 +24603 +24604 +24605 +24606 +24607 +24608 +24609 +24610 +24611 +24612 +24613 +24614 +24615 +24616 +24617 +24618 +24619 +24620 +24621 +24622 +24623 +24624 +24625 +24626 +24627 +24628 +24629 +24630 +24631 +24632 +24633 +24634 +24635 +24636 +24637 +24638 +24639 +24640 +24641 +24642 +24643 +24644 +24645 +24646 +24647 +24648 +24649 +24650 +24651 +24652 +24653 +24654 +24655 +24656 +24657 +24658 +24659 +24660 +24661 +24662 +24663 +24664 +24665 +24666 +24667 +24668 +24669 +24670 +24671 +24672 +24673 +24674 +24675 +24676 +24677 +24678 +24679 +24680 +24681 +24682 +24683 +24684 +24685 +24686 +24687 +24688 +24689 +24690 +24691 +24692 +24693 +24694 +24695 +24696 +24697 +24698 +24699 +24700 +24701 +24702 +24703 +24704 +24705 +24706 +24707 +24708 +24709 +24710 +24711 +24712 +24713 +24714 +24715 +24716 +24717 +24718 +24719 +24720 +24721 +24722 +24723 +24724 +24725 +24726 +24727 +24728 +24729 +24730 +24731 +24732 +24733 +24734 +24735 +24736 +24737 +24738 +24739 +24740 +24741 +24742 +24743 +24744 +24745 +24746 +24747 +24748 +24749 +24750 +24751 +24752 +24753 +24754 +24755 +24756 +24757 +24758 +24759 +24760 +24761 +24762 +24763 +24764 +24765 +24766 +24767 +24768 +24769 +24770 +24771 +24772 +24773 +24774 +24775 +24776 +24777 +24778 +24779 +24780 +24781 +24782 +24783 +24784 +24785 +24786 +24787 +24788 +24789 +24790 +24791 +24792 +24793 +24794 +24795 +24796 +24797 +24798 +24799 +24800 +24801 +24802 +24803 +24804 +24805 +24806 +24807 +24808 +24809 +24810 +24811 +24812 +24813 +24814 +24815 +24816 +24817 +24818 +24819 +24820 +24821 +24822 +24823 +24824 +24825 +24826 +24827 +24828 +24829 +24830 +24831 +24832 +24833 +24834 +24835 +24836 +24837 +24838 +24839 +24840 +24841 +24842 +24843 +24844 +24845 +24846 +24847 +24848 +24849 +24850 +24851 +24852 +24853 +24854 +24855 +24856 +24857 +24858 +24859 +24860 +24861 +24862 +24863 +24864 +24865 +24866 +24867 +24868 +24869 +24870 +24871 +24872 +24873 +24874 +24875 +24876 +24877 +24878 +24879 +24880 +24881 +24882 +24883 +24884 +24885 +24886 +24887 +24888 +24889 +24890 +24891 +24892 +24893 +24894 +24895 +24896 +24897 +24898 +24899 +24900 +24901 +24902 +24903 +24904 +24905 +24906 +24907 +24908 +24909 +24910 +24911 +24912 +24913 +24914 +24915 +24916 +24917 +24918 +24919 +24920 +24921 +24922 +24923 +24924 +24925 +24926 +24927 +24928 +24929 +24930 +24931 +24932 +24933 +24934 +24935 +24936 +24937 +24938 +24939 +24940 +24941 +24942 +24943 +24944 +24945 +24946 +24947 +24948 +24949 +24950 +24951 +24952 +24953 +24954 +24955 +24956 +24957 +24958 +24959 +24960 +24961 +24962 +24963 +24964 +24965 +24966 +24967 +24968 +24969 +24970 +24971 +24972 +24973 +24974 +24975 +24976 +24977 +24978 +24979 +24980 +24981 +24982 +24983 +24984 +24985 +24986 +24987 +24988 +24989 +24990 +24991 +24992 +24993 +24994 +24995 +24996 +24997 +24998 +24999 +25000 +25001 +25002 +25003 +25004 +25005 +25006 +25007 +25008 +25009 +25010 +25011 +25012 +25013 +25014 +25015 +25016 +25017 +25018 +25019 +25020 +25021 +25022 +25023 +25024 +25025 +25026 +25027 +25028 +25029 +25030 +25031 +25032 +25033 +25034 +25035 +25036 +25037 +25038 +25039 +25040 +25041 +25042 +25043 +25044 +25045 +25046 +25047 +25048 +25049 +25050 +25051 +25052 +25053 +25054 +25055 +25056 +25057 +25058 +25059 +25060 +25061 +25062 +25063 +25064 +25065 +25066 +25067 +25068 +25069 +25070 +25071 +25072 +25073 +25074 +25075 +25076 +25077 +25078 +25079 +25080 +25081 +25082 +25083 +25084 +25085 +25086 +25087 +25088 +25089 +25090 +25091 +25092 +25093 +25094 +25095 +25096 +25097 +25098 +25099 +25100 +25101 +25102 +25103 +25104 +25105 +25106 +25107 +25108 +25109 +25110 +25111 +25112 +25113 +25114 +25115 +25116 +25117 +25118 +25119 +25120 +25121 +25122 +25123 +25124 +25125 +25126 +25127 +25128 +25129 +25130 +25131 +25132 +25133 +25134 +25135 +25136 +25137 +25138 +25139 +25140 +25141 +25142 +25143 +25144 +25145 +25146 +25147 +25148 +25149 +25150 +25151 +25152 +25153 +25154 +25155 +25156 +25157 +25158 +25159 +25160 +25161 +25162 +25163 +25164 +25165 +25166 +25167 +25168 +25169 +25170 +25171 +25172 +25173 +25174 +25175 +25176 +25177 +25178 +25179 +25180 +25181 +25182 +25183 +25184 +25185 +25186 +25187 +25188 +25189 +25190 +25191 +25192 +25193 +25194 +25195 +25196 +25197 +25198 +25199 +25200 +25201 +25202 +25203 +25204 +25205 +25206 +25207 +25208 +25209 +25210 +25211 +25212 +25213 +25214 +25215 +25216 +25217 +25218 +25219 +25220 +25221 +25222 +25223 +25224 +25225 +25226 +25227 +25228 +25229 +25230 +25231 +25232 +25233 +25234 +25235 +25236 +25237 +25238 +25239 +25240 +25241 +25242 +25243 +25244 +25245 +25246 +25247 +25248 +25249 +25250 +25251 +25252 +25253 +25254 +25255 +25256 +25257 +25258 +25259 +25260 +25261 +25262 +25263 +25264 +25265 +25266 +25267 +25268 +25269 +25270 +25271 +25272 +25273 +25274 +25275 +25276 +25277 +25278 +25279 +25280 +25281 +25282 +25283 +25284 +25285 +25286 +25287 +25288 +25289 +25290 +25291 +25292 +25293 +25294 +25295 +25296 +25297 +25298 +25299 +25300 +25301 +25302 +25303 +25304 +25305 +25306 +25307 +25308 +25309 +25310 +25311 +25312 +25313 +25314 +25315 +25316 +25317 +25318 +25319 +25320 +25321 +25322 +25323 +25324 +25325 +25326 +25327 +25328 +25329 +25330 +25331 +25332 +25333 +25334 +25335 +25336 +25337 +25338 +25339 +25340 +25341 +25342 +25343 +25344 +25345 +25346 +25347 +25348 +25349 +25350 +25351 +25352 +25353 +25354 +25355 +25356 +25357 +25358 +25359 +25360 +25361 +25362 +25363 +25364 +25365 +25366 +25367 +25368 +25369 +25370 +25371 +25372 +25373 +25374 +25375 +25376 +25377 +25378 +25379 +25380 +25381 +25382 +25383 +25384 +25385 +25386 +25387 +25388 +25389 +25390 +25391 +25392 +25393 +25394 +25395 +25396 +25397 +25398 +25399 +25400 +25401 +25402 +25403 +25404 +25405 +25406 +25407 +25408 +25409 +25410 +25411 +25412 +25413 +25414 +25415 +25416 +25417 +25418 +25419 +25420 +25421 +25422 +25423 +25424 +25425 +25426 +25427 +25428 +25429 +25430 +25431 +25432 +25433 +25434 +25435 +25436 +25437 +25438 +25439 +25440 +25441 +25442 +25443 +25444 +25445 +25446 +25447 +25448 +25449 +25450 +25451 +25452 +25453 +25454 +25455 +25456 +25457 +25458 +25459 +25460 +25461 +25462 +25463 +25464 +25465 +25466 +25467 +25468 +25469 +25470 +25471 +25472 +25473 +25474 +25475 +25476 +25477 +25478 +25479 +25480 +25481 +25482 +25483 +25484 +25485 +25486 +25487 +25488 +25489 +25490 +25491 +25492 +25493 +25494 +25495 +25496 +25497 +25498 +25499 +25500 +25501 +25502 +25503 +25504 +25505 +25506 +25507 +25508 +25509 +25510 +25511 +25512 +25513 +25514 +25515 +25516 +25517 +25518 +25519 +25520 +25521 +25522 +25523 +25524 +25525 +25526 +25527 +25528 +25529 +25530 +25531 +25532 +25533 +25534 +25535 +25536 +25537 +25538 +25539 +25540 +25541 +25542 +25543 +25544 +25545 +25546 +25547 +25548 +25549 +25550 +25551 +25552 +25553 +25554 +25555 +25556 +25557 +25558 +25559 +25560 +25561 +25562 +25563 +25564 +25565 +25566 +25567 +25568 +25569 +25570 +25571 +25572 +25573 +25574 +25575 +25576 +25577 +25578 +25579 +25580 +25581 +25582 +25583 +25584 +25585 +25586 +25587 +25588 +25589 +25590 +25591 +25592 +25593 +25594 +25595 +25596 +25597 +25598 +25599 +25600 +25601 +25602 +25603 +25604 +25605 +25606 +25607 +25608 +25609 +25610 +25611 +25612 +25613 +25614 +25615 +25616 +25617 +25618 +25619 +25620 +25621 +25622 +25623 +25624 +25625 +25626 +25627 +25628 +25629 +25630 +25631 +25632 +25633 +25634 +25635 +25636 +25637 +25638 +25639 +25640 +25641 +25642 +25643 +25644 +25645 +25646 +25647 +25648 +25649 +25650 +25651 +25652 +25653 +25654 +25655 +25656 +25657 +25658 +25659 +25660 +25661 +25662 +25663 +25664 +25665 +25666 +25667 +25668 +25669 +25670 +25671 +25672 +25673 +25674 +25675 +25676 +25677 +25678 +25679 +25680 +25681 +25682 +25683 +25684 +25685 +25686 +25687 +25688 +25689 +25690 +25691 +25692 +25693 +25694 +25695 +25696 +25697 +25698 +25699 +25700 +25701 +25702 +25703 +25704 +25705 +25706 +25707 +25708 +25709 +25710 +25711 +25712 +25713 +25714 +25715 +25716 +25717 +25718 +25719 +25720 +25721 +25722 +25723 +25724 +25725 +25726 +25727 +25728 +25729 +25730 +25731 +25732 +25733 +25734 +25735 +25736 +25737 +25738 +25739 +25740 +25741 +25742 +25743 +25744 +25745 +25746 +25747 +25748 +25749 +25750 +25751 +25752 +25753 +25754 +25755 +25756 +25757 +25758 +25759 +25760 +25761 +25762 +25763 +25764 +25765 +25766 +25767 +25768 +25769 +25770 +25771 +25772 +25773 +25774 +25775 +25776 +25777 +25778 +25779 +25780 +25781 +25782 +25783 +25784 +25785 +25786 +25787 +25788 +25789 +25790 +25791 +25792 +25793 +25794 +25795 +25796 +25797 +25798 +25799 +25800 +25801 +25802 +25803 +25804 +25805 +25806 +25807 +25808 +25809 +25810 +25811 +25812 +25813 +25814 +25815 +25816 +25817 +25818 +25819 +25820 +25821 +25822 +25823 +25824 +25825 +25826 +25827 +25828 +25829 +25830 +25831 +25832 +25833 +25834 +25835 +25836 +25837 +25838 +25839 +25840 +25841 +25842 +25843 +25844 +25845 +25846 +25847 +25848 +25849 +25850 +25851 +25852 +25853 +25854 +25855 +25856 +25857 +25858 +25859 +25860 +25861 +25862 +25863 +25864 +25865 +25866 +25867 +25868 +25869 +25870 +25871 +25872 +25873 +25874 +25875 +25876 +25877 +25878 +25879 +25880 +25881 +25882 +25883 +25884 +25885 +25886 +25887 +25888 +25889 +25890 +25891 +25892 +25893 +25894 +25895 +25896 +25897 +25898 +25899 +25900 +25901 +25902 +25903 +25904 +25905 +25906 +25907 +25908 +25909 +25910 +25911 +25912 +25913 +25914 +25915 +25916 +25917 +25918 +25919 +25920 +25921 +25922 +25923 +25924 +25925 +25926 +25927 +25928 +25929 +25930 +25931 +25932 +25933 +25934 +25935 +25936 +25937 +25938 +25939 +25940 +25941 +25942 +25943 +25944 +25945 +25946 +25947 +25948 +25949 +25950 +25951 +25952 +25953 +25954 +25955 +25956 +25957 +25958 +25959 +25960 +25961 +25962 +25963 +25964 +25965 +25966 +25967 +25968 +25969 +25970 +25971 +25972 +25973 +25974 +25975 +25976 +25977 +25978 +25979 +25980 +25981 +25982 +25983 +25984 +25985 +25986 +25987 +25988 +25989 +25990 +25991 +25992 +25993 +25994 +25995 +25996 +25997 +25998 +25999 +26000 +26001 +26002 +26003 +26004 +26005 +26006 +26007 +26008 +26009 +26010 +26011 +26012 +26013 +26014 +26015 +26016 +26017 +26018 +26019 +26020 +26021 +26022 +26023 +26024 +26025 +26026 +26027 +26028 +26029 +26030 +26031 +26032 +26033 +26034 +26035 +26036 +26037 +26038 +26039 +26040 +26041 +26042 +26043 +26044 +26045 +26046 +26047 +26048 +26049 +26050 +26051 +26052 +26053 +26054 +26055 +26056 +26057 +26058 +26059 +26060 +26061 +26062 +26063 +26064 +26065 +26066 +26067 +26068 +26069 +26070 +26071 +26072 +26073 +26074 +26075 +26076 +26077 +26078 +26079 +26080 +26081 +26082 +26083 +26084 +26085 +26086 +26087 +26088 +26089 +26090 +26091 +26092 +26093 +26094 +26095 +26096 +26097 +26098 +26099 +26100 +26101 +26102 +26103 +26104 +26105 +26106 +26107 +26108 +26109 +26110 +26111 +26112 +26113 +26114 +26115 +26116 +26117 +26118 +26119 +26120 +26121 +26122 +26123 +26124 +26125 +26126 +26127 +26128 +26129 +26130 +26131 +26132 +26133 +26134 +26135 +26136 +26137 +26138 +26139 +26140 +26141 +26142 +26143 +26144 +26145 +26146 +26147 +26148 +26149 +26150 +26151 +26152 +26153 +26154 +26155 +26156 +26157 +26158 +26159 +26160 +26161 +26162 +26163 +26164 +26165 +26166 +26167 +26168 +26169 +26170 +26171 +26172 +26173 +26174 +26175 +26176 +26177 +26178 +26179 +26180 +26181 +26182 +26183 +26184 +26185 +26186 +26187 +26188 +26189 +26190 +26191 +26192 +26193 +26194 +26195 +26196 +26197 +26198 +26199 +26200 +26201 +26202 +26203 +26204 +26205 +26206 +26207 +26208 +26209 +26210 +26211 +26212 +26213 +26214 +26215 +26216 +26217 +26218 +26219 +26220 +26221 +26222 +26223 +26224 +26225 +26226 +26227 +26228 +26229 +26230 +26231 +26232 +26233 +26234 +26235 +26236 +26237 +26238 +26239 +26240 +26241 +26242 +26243 +26244 +26245 +26246 +26247 +26248 +26249 +26250 +26251 +26252 +26253 +26254 +26255 +26256 +26257 +26258 +26259 +26260 +26261 +26262 +26263 +26264 +26265 +26266 +26267 +26268 +26269 +26270 +26271 +26272 +26273 +26274 +26275 +26276 +26277 +26278 +26279 +26280 +26281 +26282 +26283 +26284 +26285 +26286 +26287 +26288 +26289 +26290 +26291 +26292 +26293 +26294 +26295 +26296 +26297 +26298 +26299 +26300 +26301 +26302 +26303 +26304 +26305 +26306 +26307 +26308 +26309 +26310 +26311 +26312 +26313 +26314 +26315 +26316 +26317 +26318 +26319 +26320 +26321 +26322 +26323 +26324 +26325 +26326 +26327 +26328 +26329 +26330 +26331 +26332 +26333 +26334 +26335 +26336 +26337 +26338 +26339 +26340 +26341 +26342 +26343 +26344 +26345 +26346 +26347 +26348 +26349 +26350 +26351 +26352 +26353 +26354 +26355 +26356 +26357 +26358 +26359 +26360 +26361 +26362 +26363 +26364 +26365 +26366 +26367 +26368 +26369 +26370 +26371 +26372 +26373 +26374 +26375 +26376 +26377 +26378 +26379 +26380 +26381 +26382 +26383 +26384 +26385 +26386 +26387 +26388 +26389 +26390 +26391 +26392 +26393 +26394 +26395 +26396 +26397 +26398 +26399 +26400 +26401 +26402 +26403 +26404 +26405 +26406 +26407 +26408 +26409 +26410 +26411 +26412 +26413 +26414 +26415 +26416 +26417 +26418 +26419 +26420 +26421 +26422 +26423 +26424 +26425 +26426 +26427 +26428 +26429 +26430 +26431 +26432 +26433 +26434 +26435 +26436 +26437 +26438 +26439 +26440 +26441 +26442 +26443 +26444 +26445 +26446 +26447 +26448 +26449 +26450 +26451 +26452 +26453 +26454 +26455 +26456 +26457 +26458 +26459 +26460 +26461 +26462 +26463 +26464 +26465 +26466 +26467 +26468 +26469 +26470 +26471 +26472 +26473 +26474 +26475 +26476 +26477 +26478 +26479 +26480 +26481 +26482 +26483 +26484 +26485 +26486 +26487 +26488 +26489 +26490 +26491 +26492 +26493 +26494 +26495 +26496 +26497 +26498 +26499 +26500 +26501 +26502 +26503 +26504 +26505 +26506 +26507 +26508 +26509 +26510 +26511 +26512 +26513 +26514 +26515 +26516 +26517 +26518 +26519 +26520 +26521 +26522 +26523 +26524 +26525 +26526 +26527 +26528 +26529 +26530 +26531 +26532 +26533 +26534 +26535 +26536 +26537 +26538 +26539 +26540 +26541 +26542 +26543 +26544 +26545 +26546 +26547 +26548 +26549 +26550 +26551 +26552 +26553 +26554 +26555 +26556 +26557 +26558 +26559 +26560 +26561 +26562 +26563 +26564 +26565 +26566 +26567 +26568 +26569 +26570 +26571 +26572 +26573 +26574 +26575 +26576 +26577 +26578 +26579 +26580 +26581 +26582 +26583 +26584 +26585 +26586 +26587 +26588 +26589 +26590 +26591 +26592 +26593 +26594 +26595 +26596 +26597 +26598 +26599 +26600 +26601 +26602 +26603 +26604 +26605 +26606 +26607 +26608 +26609 +26610 +26611 +26612 +26613 +26614 +26615 +26616 +26617 +26618 +26619 +26620 +26621 +26622 +26623 +26624 +26625 +26626 +26627 +26628 +26629 +26630 +26631 +26632 +26633 +26634 +26635 +26636 +26637 +26638 +26639 +26640 +26641 +26642 +26643 +26644 +26645 +26646 +26647 +26648 +26649 +26650 +26651 +26652 +26653 +26654 +26655 +26656 +26657 +26658 +26659 +26660 +26661 +26662 +26663 +26664 +26665 +26666 +26667 +26668 +26669 +26670 +26671 +26672 +26673 +26674 +26675 +26676 +26677 +26678 +26679 +26680 +26681 +26682 +26683 +26684 +26685 +26686 +26687 +26688 +26689 +26690 +26691 +26692 +26693 +26694 +26695 +26696 +26697 +26698 +26699 +26700 +26701 +26702 +26703 +26704 +26705 +26706 +26707 +26708 +26709 +26710 +26711 +26712 +26713 +26714 +26715 +26716 +26717 +26718 +26719 +26720 +26721 +26722 +26723 +26724 +26725 +26726 +26727 +26728 +26729 +26730 +26731 +26732 +26733 +26734 +26735 +26736 +26737 +26738 +26739 +26740 +26741 +26742 +26743 +26744 +26745 +26746 +26747 +26748 +26749 +26750 +26751 +26752 +26753 +26754 +26755 +26756 +26757 +26758 +26759 +26760 +26761 +26762 +26763 +26764 +26765 +26766 +26767 +26768 +26769 +26770 +26771 +26772 +26773 +26774 +26775 +26776 +26777 +26778 +26779 +26780 +26781 +26782 +26783 +26784 +26785 +26786 +26787 +26788 +26789 +26790 +26791 +26792 +26793 +26794 +26795 +26796 +26797 +26798 +26799 +26800 +26801 +26802 +26803 +26804 +26805 +26806 +26807 +26808 +26809 +26810 +26811 +26812 +26813 +26814 +26815 +26816 +26817 +26818 +26819 +26820 +26821 +26822 +26823 +26824 +26825 +26826 +26827 +26828 +26829 +26830 +26831 +26832 +26833 +26834 +26835 +26836 +26837 +26838 +26839 +26840 +26841 +26842 +26843 +26844 +26845 +26846 +26847 +26848 +26849 +26850 +26851 +26852 +26853 +26854 +26855 +26856 +26857 +26858 +26859 +26860 +26861 +26862 +26863 +26864 +26865 +26866 +26867 +26868 +26869 +26870 +26871 +26872 +26873 +26874 +26875 +26876 +26877 +26878 +26879 +26880 +26881 +26882 +26883 +26884 +26885 +26886 +26887 +26888 +26889 +26890 +26891 +26892 +26893 +26894 +26895 +26896 +26897 +26898 +26899 +26900 +26901 +26902 +26903 +26904 +26905 +26906 +26907 +26908 +26909 +26910 +26911 +26912 +26913 +26914 +26915 +26916 +26917 +26918 +26919 +26920 +26921 +26922 +26923 +26924 +26925 +26926 +26927 +26928 +26929 +26930 +26931 +26932 +26933 +26934 +26935 +26936 +26937 +26938 +26939 +26940 +26941 +26942 +26943 +26944 +26945 +26946 +26947 +26948 +26949 +26950 +26951 +26952 +26953 +26954 +26955 +26956 +26957 +26958 +26959 +26960 +26961 +26962 +26963 +26964 +26965 +26966 +26967 +26968 +26969 +26970 +26971 +26972 +26973 +26974 +26975 +26976 +26977 +26978 +26979 +26980 +26981 +26982 +26983 +26984 +26985 +26986 +26987 +26988 +26989 +26990 +26991 +26992 +26993 +26994 +26995 +26996 +26997 +26998 +26999 +27000 +27001 +27002 +27003 +27004 +27005 +27006 +27007 +27008 +27009 +27010 +27011 +27012 +27013 +27014 +27015 +27016 +27017 +27018 +27019 +27020 +27021 +27022 +27023 +27024 +27025 +27026 +27027 +27028 +27029 +27030 +27031 +27032 +27033 +27034 +27035 +27036 +27037 +27038 +27039 +27040 +27041 +27042 +27043 +27044 +27045 +27046 +27047 +27048 +27049 +27050 +27051 +27052 +27053 +27054 +27055 +27056 +27057 +27058 +27059 +27060 +27061 +27062 +27063 +27064 +27065 +27066 +27067 +27068 +27069 +27070 +27071 +27072 +27073 +27074 +27075 +27076 +27077 +27078 +27079 +27080 +27081 +27082 +27083 +27084 +27085 +27086 +27087 +27088 +27089 +27090 +27091 +27092 +27093 +27094 +27095 +27096 +27097 +27098 +27099 +27100 +27101 +27102 +27103 +27104 +27105 +27106 +27107 +27108 +27109 +27110 +27111 +27112 +27113 +27114 +27115 +27116 +27117 +27118 +27119 +27120 +27121 +27122 +27123 +27124 +27125 +27126 +27127 +27128 +27129 +27130 +27131 +27132 +27133 +27134 +27135 +27136 +27137 +27138 +27139 +27140 +27141 +27142 +27143 +27144 +27145 +27146 +27147 +27148 +27149 +27150 +27151 +27152 +27153 +27154 +27155 +27156 +27157 +27158 +27159 +27160 +27161 +27162 +27163 +27164 +27165 +27166 +27167 +27168 +27169 +27170 +27171 +27172 +27173 +27174 +27175 +27176 +27177 +27178 +27179 +27180 +27181 +27182 +27183 +27184 +27185 +27186 +27187 +27188 +27189 +27190 +27191 +27192 +27193 +27194 +27195 +27196 +27197 +27198 +27199 +27200 +27201 +27202 +27203 +27204 +27205 +27206 +27207 +27208 +27209 +27210 +27211 +27212 +27213 +27214 +27215 +27216 +27217 +27218 +27219 +27220 +27221 +27222 +27223 +27224 +27225 +27226 +27227 +27228 +27229 +27230 +27231 +27232 +27233 +27234 +27235 +27236 +27237 +27238 +27239 +27240 +27241 +27242 +27243 +27244 +27245 +27246 +27247 +27248 +27249 +27250 +27251 +27252 +27253 +27254 +27255 +27256 +27257 +27258 +27259 +27260 +27261 +27262 +27263 +27264 +27265 +27266 +27267 +27268 +27269 +27270 +27271 +27272 +27273 +27274 +27275 +27276 +27277 +27278 +27279 +27280 +27281 +27282 +27283 +27284 +27285 +27286 +27287 +27288 +27289 +27290 +27291 +27292 +27293 +27294 +27295 +27296 +27297 +27298 +27299 +27300 +27301 +27302 +27303 +27304 +27305 +27306 +27307 +27308 +27309 +27310 +27311 +27312 +27313 +27314 +27315 +27316 +27317 +27318 +27319 +27320 +27321 +27322 +27323 +27324 +27325 +27326 +27327 +27328 +27329 +27330 +27331 +27332 +27333 +27334 +27335 +27336 +27337 +27338 +27339 +27340 +27341 +27342 +27343 +27344 +27345 +27346 +27347 +27348 +27349 +27350 +27351 +27352 +27353 +27354 +27355 +27356 +27357 +27358 +27359 +27360 +27361 +27362 +27363 +27364 +27365 +27366 +27367 +27368 +27369 +27370 +27371 +27372 +27373 +27374 +27375 +27376 +27377 +27378 +27379 +27380 +27381 +27382 +27383 +27384 +27385 +27386 +27387 +27388 +27389 +27390 +27391 +27392 +27393 +27394 +27395 +27396 +27397 +27398 +27399 +27400 +27401 +27402 +27403 +27404 +27405 +27406 +27407 +27408 +27409 +27410 +27411 +27412 +27413 +27414 +27415 +27416 +27417 +27418 +27419 +27420 +27421 +27422 +27423 +27424 +27425 +27426 +27427 +27428 +27429 +27430 +27431 +27432 +27433 +27434 +27435 +27436 +27437 +27438 +27439 +27440 +27441 +27442 +27443 +27444 +27445 +27446 +27447 +27448 +27449 +27450 +27451 +27452 +27453 +27454 +27455 +27456 +27457 +27458 +27459 +27460 +27461 +27462 +27463 +27464 +27465 +27466 +27467 +27468 +27469 +27470 +27471 +27472 +27473 +27474 +27475 +27476 +27477 +27478 +27479 +27480 +27481 +27482 +27483 +27484 +27485 +27486 +27487 +27488 +27489 +27490 +27491 +27492 +27493 +27494 +27495 +27496 +27497 +27498 +27499 +27500 +27501 +27502 +27503 +27504 +27505 +27506 +27507 +27508 +27509 +27510 +27511 +27512 +27513 +27514 +27515 +27516 +27517 +27518 +27519 +27520 +27521 +27522 +27523 +27524 +27525 +27526 +27527 +27528 +27529 +27530 +27531 +27532 +27533 +27534 +27535 +27536 +27537 +27538 +27539 +27540 +27541 +27542 +27543 +27544 +27545 +27546 +27547 +27548 +27549 +27550 +27551 +27552 +27553 +27554 +27555 +27556 +27557 +27558 +27559 +27560 +27561 +27562 +27563 +27564 +27565 +27566 +27567 +27568 +27569 +27570 +27571 +27572 +27573 +27574 +27575 +27576 +27577 +27578 +27579 +27580 +27581 +27582 +27583 +27584 +27585 +27586 +27587 +27588 +27589 +27590 +27591 +27592 +27593 +27594 +27595 +27596 +27597 +27598 +27599 +27600 +27601 +27602 +27603 +27604 +27605 +27606 +27607 +27608 +27609 +27610 +27611 +27612 +27613 +27614 +27615 +27616 +27617 +27618 +27619 +27620 +27621 +27622 +27623 +27624 +27625 +27626 +27627 +27628 +27629 +27630 +27631 +27632 +27633 +27634 +27635 +27636 +27637 +27638 +27639 +27640 +27641 +27642 +27643 +27644 +27645 +27646 +27647 +27648 +27649 +27650 +27651 +27652 +27653 +27654 +27655 +27656 +27657 +27658 +27659 +27660 +27661 +27662 +27663 +27664 +27665 +27666 +27667 +27668 +27669 +27670 +27671 +27672 +27673 +27674 +27675 +27676 +27677 +27678 +27679 +27680 +27681 +27682 +27683 +27684 +27685 +27686 +27687 +27688 +27689 +27690 +27691 +27692 +27693 +27694 +27695 +27696 +27697 +27698 +27699 +27700 +27701 +27702 +27703 +27704 +27705 +27706 +27707 +27708 +27709 +27710 +27711 +27712 +27713 +27714 +27715 +27716 +27717 +27718 +27719 +27720 +27721 +27722 +27723 +27724 +27725 +27726 +27727 +27728 +27729 +27730 +27731 +27732 +27733 +27734 +27735 +27736 +27737 +27738 +27739 +27740 +27741 +27742 +27743 +27744 +27745 +27746 +27747 +27748 +27749 +27750 +27751 +27752 +27753 +27754 +27755 +27756 +27757 +27758 +27759 +27760 +27761 +27762 +27763 +27764 +27765 +27766 +27767 +27768 +27769 +27770 +27771 +27772 +27773 +27774 +27775 +27776 +27777 +27778 +27779 +27780 +27781 +27782 +27783 +27784 +27785 +27786 +27787 +27788 +27789 +27790 +27791 +27792 +27793 +27794 +27795 +27796 +27797 +27798 +27799 +27800 +27801 +27802 +27803 +27804 +27805 +27806 +27807 +27808 +27809 +27810 +27811 +27812 +27813 +27814 +27815 +27816 +27817 +27818 +27819 +27820 +27821 +27822 +27823 +27824 +27825 +27826 +27827 +27828 +27829 +27830 +27831 +27832 +27833 +27834 +27835 +27836 +27837 +27838 +27839 +27840 +27841 +27842 +27843 +27844 +27845 +27846 +27847 +27848 +27849 +27850 +27851 +27852 +27853 +27854 +27855 +27856 +27857 +27858 +27859 +27860 +27861 +27862 +27863 +27864 +27865 +27866 +27867 +27868 +27869 +27870 +27871 +27872 +27873 +27874 +27875 +27876 +27877 +27878 +27879 +27880 +27881 +27882 +27883 +27884 +27885 +27886 +27887 +27888 +27889 +27890 +27891 +27892 +27893 +27894 +27895 +27896 +27897 +27898 +27899 +27900 +27901 +27902 +27903 +27904 +27905 +27906 +27907 +27908 +27909 +27910 +27911 +27912 +27913 +27914 +27915 +27916 +27917 +27918 +27919 +27920 +27921 +27922 +27923 +27924 +27925 +27926 +27927 +27928 +27929 +27930 +27931 +27932 +27933 +27934 +27935 +27936 +27937 +27938 +27939 +27940 +27941 +27942 +27943 +27944 +27945 +27946 +27947 +27948 +27949 +27950 +27951 +27952 +27953 +27954 +27955 +27956 +27957 +27958 +27959 +27960 +27961 +27962 +27963 +27964 +27965 +27966 +27967 +27968 +27969 +27970 +27971 +27972 +27973 +27974 +27975 +27976 +27977 +27978 +27979 +27980 +27981 +27982 +27983 +27984 +27985 +27986 +27987 +27988 +27989 +27990 +27991 +27992 +27993 +27994 +27995 +27996 +27997 +27998 +27999 +28000 +28001 +28002 +28003 +28004 +28005 +28006 +28007 +28008 +28009 +28010 +28011 +28012 +28013 +28014 +28015 +28016 +28017 +28018 +28019 +28020 +28021 +28022 +28023 +28024 +28025 +28026 +28027 +28028 +28029 +28030 +28031 +28032 +28033 +28034 +28035 +28036 +28037 +28038 +28039 +28040 +28041 +28042 +28043 +28044 +28045 +28046 +28047 +28048 +28049 +28050 +28051 +28052 +28053 +28054 +28055 +28056 +28057 +28058 +28059 +28060 +28061 +28062 +28063 +28064 +28065 +28066 +28067 +28068 +28069 +28070 +28071 +28072 +28073 +28074 +28075 +28076 +28077 +28078 +28079 +28080 +28081 +28082 +28083 +28084 +28085 +28086 +28087 +28088 +28089 +28090 +28091 +28092 +28093 +28094 +28095 +28096 +28097 +28098 +28099 +28100 +28101 +28102 +28103 +28104 +28105 +28106 +28107 +28108 +28109 +28110 +28111 +28112 +28113 +28114 +28115 +28116 +28117 +28118 +28119 +28120 +28121 +28122 +28123 +28124 +28125 +28126 +28127 +28128 +28129 +28130 +28131 +28132 +28133 +28134 +28135 +28136 +28137 +28138 +28139 +28140 +28141 +28142 +28143 +28144 +28145 +28146 +28147 +28148 +28149 +28150 +28151 +28152 +28153 +28154 +28155 +28156 +28157 +28158 +28159 +28160 +28161 +28162 +28163 +28164 +28165 +28166 +28167 +28168 +28169 +28170 +28171 +28172 +28173 +28174 +28175 +28176 +28177 +28178 +28179 +28180 +28181 +28182 +28183 +28184 +28185 +28186 +28187 +28188 +28189 +28190 +28191 +28192 +28193 +28194 +28195 +28196 +28197 +28198 +28199 +28200 +28201 +28202 +28203 +28204 +28205 +28206 +28207 +28208 +28209 +28210 +28211 +28212 +28213 +28214 +28215 +28216 +28217 +28218 +28219 +28220 +28221 +28222 +28223 +28224 +28225 +28226 +28227 +28228 +28229 +28230 +28231 +28232 +28233 +28234 +28235 +28236 +28237 +28238 +28239 +28240 +28241 +28242 +28243 +28244 +28245 +28246 +28247 +28248 +28249 +28250 +28251 +28252 +28253 +28254 +28255 +28256 +28257 +28258 +28259 +28260 +28261 +28262 +28263 +28264 +28265 +28266 +28267 +28268 +28269 +28270 +28271 +28272 +28273 +28274 +28275 +28276 +28277 +28278 +28279 +28280 +28281 +28282 +28283 +28284 +28285 +28286 +28287 +28288 +28289 +28290 +28291 +28292 +28293 +28294 +28295 +28296 +28297 +28298 +28299 +28300 +28301 +28302 +28303 +28304 +28305 +28306 +28307 +28308 +28309 +28310 +28311 +28312 +28313 +28314 +28315 +28316 +28317 +28318 +28319 +28320 +28321 +28322 +28323 +28324 +28325 +28326 +28327 +28328 +28329 +28330 +28331 +28332 +28333 +28334 +28335 +28336 +28337 +28338 +28339 +28340 +28341 +28342 +28343 +28344 +28345 +28346 +28347 +28348 +28349 +28350 +28351 +28352 +28353 +28354 +28355 +28356 +28357 +28358 +28359 +28360 +28361 +28362 +28363 +28364 +28365 +28366 +28367 +28368 +28369 +28370 +28371 +28372 +28373 +28374 +28375 +28376 +28377 +28378 +28379 +28380 +28381 +28382 +28383 +28384 +28385 +28386 +28387 +28388 +28389 +28390 +28391 +28392 +28393 +28394 +28395 +28396 +28397 +28398 +28399 +28400 +28401 +28402 +28403 +28404 +28405 +28406 +28407 +28408 +28409 +28410 +28411 +28412 +28413 +28414 +28415 +28416 +28417 +28418 +28419 +28420 +28421 +28422 +28423 +28424 +28425 +28426 +28427 +28428 +28429 +28430 +28431 +28432 +28433 +28434 +28435 +28436 +28437 +28438 +28439 +28440 +28441 +28442 +28443 +28444 +28445 +28446 +28447 +28448 +28449 +28450 +28451 +28452 +28453 +28454 +28455 +28456 +28457 +28458 +28459 +28460 +28461 +28462 +28463 +28464 +28465 +28466 +28467 +28468 +28469 +28470 +28471 +28472 +28473 +28474 +28475 +28476 +28477 +28478 +28479 +28480 +28481 +28482 +28483 +28484 +28485 +28486 +28487 +28488 +28489 +28490 +28491 +28492 +28493 +28494 +28495 +28496 +28497 +28498 +28499 +28500 +28501 +28502 +28503 +28504 +28505 +28506 +28507 +28508 +28509 +28510 +28511 +28512 +28513 +28514 +28515 +28516 +28517 +28518 +28519 +28520 +28521 +28522 +28523 +28524 +28525 +28526 +28527 +28528 +28529 +28530 +28531 +28532 +28533 +28534 +28535 +28536 +28537 +28538 +28539 +28540 +28541 +28542 +28543 +28544 +28545 +28546 +28547 +28548 +28549 +28550 +28551 +28552 +28553 +28554 +28555 +28556 +28557 +28558 +28559 +28560 +28561 +28562 +28563 +28564 +28565 +28566 +28567 +28568 +28569 +28570 +28571 +28572 +28573 +28574 +28575 +28576 +28577 +28578 +28579 +28580 +28581 +28582 +28583 +28584 +28585 +28586 +28587 +28588 +28589 +28590 +28591 +28592 +28593 +28594 +28595 +28596 +28597 +28598 +28599 +28600 +28601 +28602 +28603 +28604 +28605 +28606 +28607 +28608 +28609 +28610 +28611 +28612 +28613 +28614 +28615 +28616 +28617 +28618 +28619 +28620 +28621 +28622 +28623 +28624 +28625 +28626 +28627 +28628 +28629 +28630 +28631 +28632 +28633 +28634 +28635 +28636 +28637 +28638 +28639 +28640 +28641 +28642 +28643 +28644 +28645 +28646 +28647 +28648 +28649 +28650 +28651 +28652 +28653 +28654 +28655 +28656 +28657 +28658 +28659 +28660 +28661 +28662 +28663 +28664 +28665 +28666 +28667 +28668 +28669 +28670 +28671 +28672 +28673 +28674 +28675 +28676 +28677 +28678 +28679 +28680 +28681 +28682 +28683 +28684 +28685 +28686 +28687 +28688 +28689 +28690 +28691 +28692 +28693 +28694 +28695 +28696 +28697 +28698 +28699 +28700 +28701 +28702 +28703 +28704 +28705 +28706 +28707 +28708 +28709 +28710 +28711 +28712 +28713 +28714 +28715 +28716 +28717 +28718 +28719 +28720 +28721 +28722 +28723 +28724 +28725 +28726 +28727 +28728 +28729 +28730 +28731 +28732 +28733 +28734 +28735 +28736 +28737 +28738 +28739 +28740 +28741 +28742 +28743 +28744 +28745 +28746 +28747 +28748 +28749 +28750 +28751 +28752 +28753 +28754 +28755 +28756 +28757 +28758 +28759 +28760 +28761 +28762 +28763 +28764 +28765 +28766 +28767 +28768 +28769 +28770 +28771 +28772 +28773 +28774 +28775 +28776 +28777 +28778 +28779 +28780 +28781 +28782 +28783 +28784 +28785 +28786 +28787 +28788 +28789 +28790 +28791 +28792 +28793 +28794 +28795 +28796 +28797 +28798 +28799 +28800 +28801 +28802 +28803 +28804 +28805 +28806 +28807 +28808 +28809 +28810 +28811 +28812 +28813 +28814 +28815 +28816 +28817 +28818 +28819 +28820 +28821 +28822 +28823 +28824 +28825 +28826 +28827 +28828 +28829 +28830 +28831 +28832 +28833 +28834 +28835 +28836 +28837 +28838 +28839 +28840 +28841 +28842 +28843 +28844 +28845 +28846 +28847 +28848 +28849 +28850 +28851 +28852 +28853 +28854 +28855 +28856 +28857 +28858 +28859 +28860 +28861 +28862 +28863 +28864 +28865 +28866 +28867 +28868 +28869 +28870 +28871 +28872 +28873 +28874 +28875 +28876 +28877 +28878 +28879 +28880 +28881 +28882 +28883 +28884 +28885 +28886 +28887 +28888 +28889 +28890 +28891 +28892 +28893 +28894 +28895 +28896 +28897 +28898 +28899 +28900 +28901 +28902 +28903 +28904 +28905 +28906 +28907 +28908 +28909 +28910 +28911 +28912 +28913 +28914 +28915 +28916 +28917 +28918 +28919 +28920 +28921 +28922 +28923 +28924 +28925 +28926 +28927 +28928 +28929 +28930 +28931 +28932 +28933 +28934 +28935 +28936 +28937 +28938 +28939 +28940 +28941 +28942 +28943 +28944 +28945 +28946 +28947 +28948 +28949 +28950 +28951 +28952 +28953 +28954 +28955 +28956 +28957 +28958 +28959 +28960 +28961 +28962 +28963 +28964 +28965 +28966 +28967 +28968 +28969 +28970 +28971 +28972 +28973 +28974 +28975 +28976 +28977 +28978 +28979 +28980 +28981 +28982 +28983 +28984 +28985 +28986 +28987 +28988 +28989 +28990 +28991 +28992 +28993 +28994 +28995 +28996 +28997 +28998 +28999 +29000 +29001 +29002 +29003 +29004 +29005 +29006 +29007 +29008 +29009 +29010 +29011 +29012 +29013 +29014 +29015 +29016 +29017 +29018 +29019 +29020 +29021 +29022 +29023 +29024 +29025 +29026 +29027 +29028 +29029 +29030 +29031 +29032 +29033 +29034 +29035 +29036 +29037 +29038 +29039 +29040 +29041 +29042 +29043 +29044 +29045 +29046 +29047 +29048 +29049 +29050 +29051 +29052 +29053 +29054 +29055 +29056 +29057 +29058 +29059 +29060 +29061 +29062 +29063 +29064 +29065 +29066 +29067 +29068 +29069 +29070 +29071 +29072 +29073 +29074 +29075 +29076 +29077 +29078 +29079 +29080 +29081 +29082 +29083 +29084 +29085 +29086 +29087 +29088 +29089 +29090 +29091 +29092 +29093 +29094 +29095 +29096 +29097 +29098 +29099 +29100 +29101 +29102 +29103 +29104 +29105 +29106 +29107 +29108 +29109 +29110 +29111 +29112 +29113 +29114 +29115 +29116 +29117 +29118 +29119 +29120 +29121 +29122 +29123 +29124 +29125 +29126 +29127 +29128 +29129 +29130 +29131 +29132 +29133 +29134 +29135 +29136 +29137 +29138 +29139 +29140 +29141 +29142 +29143 +29144 +29145 +29146 +29147 +29148 +29149 +29150 +29151 +29152 +29153 +29154 +29155 +29156 +29157 +29158 +29159 +29160 +29161 +29162 +29163 +29164 +29165 +29166 +29167 +29168 +29169 +29170 +29171 +29172 +29173 +29174 +29175 +29176 +29177 +29178 +29179 +29180 +29181 +29182 +29183 +29184 +29185 +29186 +29187 +29188 +29189 +29190 +29191 +29192 +29193 +29194 +29195 +29196 +29197 +29198 +29199 +29200 +29201 +29202 +29203 +29204 +29205 +29206 +29207 +29208 +29209 +29210 +29211 +29212 +29213 +29214 +29215 +29216 +29217 +29218 +29219 +29220 +29221 +29222 +29223 +29224 +29225 +29226 +29227 +29228 +29229 +29230 +29231 +29232 +29233 +29234 +29235 +29236 +29237 +29238 +29239 +29240 +29241 +29242 +29243 +29244 +29245 +29246 +29247 +29248 +29249 +29250 +29251 +29252 +29253 +29254 +29255 +29256 +29257 +29258 +29259 +29260 +29261 +29262 +29263 +29264 +29265 +29266 +29267 +29268 +29269 +29270 +29271 +29272 +29273 +29274 +29275 +29276 +29277 +29278 +29279 +29280 +29281 +29282 +29283 +29284 +29285 +29286 +29287 +29288 +29289 +29290 +29291 +29292 +29293 +29294 +29295 +29296 +29297 +29298 +29299 +29300 +29301 +29302 +29303 +29304 +29305 +29306 +29307 +29308 +29309 +29310 +29311 +29312 +29313 +29314 +29315 +29316 +29317 +29318 +29319 +29320 +29321 +29322 +29323 +29324 +29325 +29326 +29327 +29328 +29329 +29330 +29331 +29332 +29333 +29334 +29335 +29336 +29337 +29338 +29339 +29340 +29341 +29342 +29343 +29344 +29345 +29346 +29347 +29348 +29349 +29350 +29351 +29352 +29353 +29354 +29355 +29356 +29357 +29358 +29359 +29360 +29361 +29362 +29363 +29364 +29365 +29366 +29367 +29368 +29369 +29370 +29371 +29372 +29373 +29374 +29375 +29376 +29377 +29378 +29379 +29380 +29381 +29382 +29383 +29384 +29385 +29386 +29387 +29388 +29389 +29390 +29391 +29392 +29393 +29394 +29395 +29396 +29397 +29398 +29399 +29400 +29401 +29402 +29403 +29404 +29405 +29406 +29407 +29408 +29409 +29410 +29411 +29412 +29413 +29414 +29415 +29416 +29417 +29418 +29419 +29420 +29421 +29422 +29423 +29424 +29425 +29426 +29427 +29428 +29429 +29430 +29431 +29432 +29433 +29434 +29435 +29436 +29437 +29438 +29439 +29440 +29441 +29442 +29443 +29444 +29445 +29446 +29447 +29448 +29449 +29450 +29451 +29452 +29453 +29454 +29455 +29456 +29457 +29458 +29459 +29460 +29461 +29462 +29463 +29464 +29465 +29466 +29467 +29468 +29469 +29470 +29471 +29472 +29473 +29474 +29475 +29476 +29477 +29478 +29479 +29480 +29481 +29482 +29483 +29484 +29485 +29486 +29487 +29488 +29489 +29490 +29491 +29492 +29493 +29494 +29495 +29496 +29497 +29498 +29499 +29500 +29501 +29502 +29503 +29504 +29505 +29506 +29507 +29508 +29509 +29510 +29511 +29512 +29513 +29514 +29515 +29516 +29517 +29518 +29519 +29520 +29521 +29522 +29523 +29524 +29525 +29526 +29527 +29528 +29529 +29530 +29531 +29532 +29533 +29534 +29535 +29536 +29537 +29538 +29539 +29540 +29541 +29542 +29543 +29544 +29545 +29546 +29547 +29548 +29549 +29550 +29551 +29552 +29553 +29554 +29555 +29556 +29557 +29558 +29559 +29560 +29561 +29562 +29563 +29564 +29565 +29566 +29567 +29568 +29569 +29570 +29571 +29572 +29573 +29574 +29575 +29576 +29577 +29578 +29579 +29580 +29581 +29582 +29583 +29584 +29585 +29586 +29587 +29588 +29589 +29590 +29591 +29592 +29593 +29594 +29595 +29596 +29597 +29598 +29599 +29600 +29601 +29602 +29603 +29604 +29605 +29606 +29607 +29608 +29609 +29610 +29611 +29612 +29613 +29614 +29615 +29616 +29617 +29618 +29619 +29620 +29621 +29622 +29623 +29624 +29625 +29626 +29627 +29628 +29629 +29630 +29631 +29632 +29633 +29634 +29635 +29636 +29637 +29638 +29639 +29640 +29641 +29642 +29643 +29644 +29645 +29646 +29647 +29648 +29649 +29650 +29651 +29652 +29653 +29654 +29655 +29656 +29657 +29658 +29659 +29660 +29661 +29662 +29663 +29664 +29665 +29666 +29667 +29668 +29669 +29670 +29671 +29672 +29673 +29674 +29675 +29676 +29677 +29678 +29679 +29680 +29681 +29682 +29683 +29684 +29685 +29686 +29687 +29688 +29689 +29690 +29691 +29692 +29693 +29694 +29695 +29696 +29697 +29698 +29699 +29700 +29701 +29702 +29703 +29704 +29705 +29706 +29707 +29708 +29709 +29710 +29711 +29712 +29713 +29714 +29715 +29716 +29717 +29718 +29719 +29720 +29721 +29722 +29723 +29724 +29725 +29726 +29727 +29728 +29729 +29730 +29731 +29732 +29733 +29734 +29735 +29736 +29737 +29738 +29739 +29740 +29741 +29742 +29743 +29744 +29745 +29746 +29747 +29748 +29749 +29750 +29751 +29752 +29753 +29754 +29755 +29756 +29757 +29758 +29759 +29760 +29761 +29762 +29763 +29764 +29765 +29766 +29767 +29768 +29769 +29770 +29771 +29772 +29773 +29774 +29775 +29776 +29777 +29778 +29779 +29780 +29781 +29782 +29783 +29784 +29785 +29786 +29787 +29788 +29789 +29790 +29791 +29792 +29793 +29794 +29795 +29796 +29797 +29798 +29799 +29800 +29801 +29802 +29803 +29804 +29805 +29806 +29807 +29808 +29809 +29810 +29811 +29812 +29813 +29814 +29815 +29816 +29817 +29818 +29819 +29820 +29821 +29822 +29823 +29824 +29825 +29826 +29827 +29828 +29829 +29830 +29831 +29832 +29833 +29834 +29835 +29836 +29837 +29838 +29839 +29840 +29841 +29842 +29843 +29844 +29845 +29846 +29847 +29848 +29849 +29850 +29851 +29852 +29853 +29854 +29855 +29856 +29857 +29858 +29859 +29860 +29861 +29862 +29863 +29864 +29865 +29866 +29867 +29868 +29869 +29870 +29871 +29872 +29873 +29874 +29875 +29876 +29877 +29878 +29879 +29880 +29881 +29882 +29883 +29884 +29885 +29886 +29887 +29888 +29889 +29890 +29891 +29892 +29893 +29894 +29895 +29896 +29897 +29898 +29899 +29900 +29901 +29902 +29903 +29904 +29905 +29906 +29907 +29908 +29909 +29910 +29911 +29912 +29913 +29914 +29915 +29916 +29917 +29918 +29919 +29920 +29921 +29922 +29923 +29924 +29925 +29926 +29927 +29928 +29929 +29930 +29931 +29932 +29933 +29934 +29935 +29936 +29937 +29938 +29939 +29940 +29941 +29942 +29943 +29944 +29945 +29946 +29947 +29948 +29949 +29950 +29951 +29952 +29953 +29954 +29955 +29956 +29957 +29958 +29959 +29960 +29961 +29962 +29963 +29964 +29965 +29966 +29967 +29968 +29969 +29970 +29971 +29972 +29973 +29974 +29975 +29976 +29977 +29978 +29979 +29980 +29981 +29982 +29983 +29984 +29985 +29986 +29987 +29988 +29989 +29990 +29991 +29992 +29993 +29994 +29995 +29996 +29997 +29998 +29999 +30000 +30001 +30002 +30003 +30004 +30005 +30006 +30007 +30008 +30009 +30010 +30011 +30012 +30013 +30014 +30015 +30016 +30017 +30018 +30019 +30020 +30021 +30022 +30023 +30024 +30025 +30026 +30027 +30028 +30029 +30030 +30031 +30032 +30033 +30034 +30035 +30036 +30037 +30038 +30039 +30040 +30041 +30042 +30043 +30044 +30045 +30046 +30047 +30048 +30049 +30050 +30051 +30052 +30053 +30054 +30055 +30056 +30057 +30058 +30059 +30060 +30061 +30062 +30063 +30064 +30065 +30066 +30067 +30068 +30069 +30070 +30071 +30072 +30073 +30074 +30075 +30076 +30077 +30078 +30079 +30080 +30081 +30082 +30083 +30084 +30085 +30086 +30087 +30088 +30089 +30090 +30091 +30092 +30093 +30094 +30095 +30096 +30097 +30098 +30099 +30100 +30101 +30102 +30103 +30104 +30105 +30106 +30107 +30108 +30109 +30110 +30111 +30112 +30113 +30114 +30115 +30116 +30117 +30118 +30119 +30120 +30121 +30122 +30123 +30124 +30125 +30126 +30127 +30128 +30129 +30130 +30131 +30132 +30133 +30134 +30135 +30136 +30137 +30138 +30139 +30140 +30141 +30142 +30143 +30144 +30145 +30146 +30147 +30148 +30149 +30150 +30151 +30152 +30153 +30154 +30155 +30156 +30157 +30158 +30159 +30160 +30161 +30162 +30163 +30164 +30165 +30166 +30167 +30168 +30169 +30170 +30171 +30172 +30173 +30174 +30175 +30176 +30177 +30178 +30179 +30180 +30181 +30182 +30183 +30184 +30185 +30186 +30187 +30188 +30189 +30190 +30191 +30192 +30193 +30194 +30195 +30196 +30197 +30198 +30199 +30200 +30201 +30202 +30203 +30204 +30205 +30206 +30207 +30208 +30209 +30210 +30211 +30212 +30213 +30214 +30215 +30216 +30217 +30218 +30219 +30220 +30221 +30222 +30223 +30224 +30225 +30226 +30227 +30228 +30229 +30230 +30231 +30232 +30233 +30234 +30235 +30236 +30237 +30238 +30239 +30240 +30241 +30242 +30243 +30244 +30245 +30246 +30247 +30248 +30249 +30250 +30251 +30252 +30253 +30254 +30255 +30256 +30257 +30258 +30259 +30260 +30261 +30262 +30263 +30264 +30265 +30266 +30267 +30268 +30269 +30270 +30271 +30272 +30273 +30274 +30275 +30276 +30277 +30278 +30279 +30280 +30281 +30282 +30283 +30284 +30285 +30286 +30287 +30288 +30289 +30290 +30291 +30292 +30293 +30294 +30295 +30296 +30297 +30298 +30299 +30300 +30301 +30302 +30303 +30304 +30305 +30306 +30307 +30308 +30309 +30310 +30311 +30312 +30313 +30314 +30315 +30316 +30317 +30318 +30319 +30320 +30321 +30322 +30323 +30324 +30325 +30326 +30327 +30328 +30329 +30330 +30331 +30332 +30333 +30334 +30335 +30336 +30337 +30338 +30339 +30340 +30341 +30342 +30343 +30344 +30345 +30346 +30347 +30348 +30349 +30350 +30351 +30352 +30353 +30354 +30355 +30356 +30357 +30358 +30359 +30360 +30361 +30362 +30363 +30364 +30365 +30366 +30367 +30368 +30369 +30370 +30371 +30372 +30373 +30374 +30375 +30376 +30377 +30378 +30379 +30380 +30381 +30382 +30383 +30384 +30385 +30386 +30387 +30388 +30389 +30390 +30391 +30392 +30393 +30394 +30395 +30396 +30397 +30398 +30399 +30400 +30401 +30402 +30403 +30404 +30405 +30406 +30407 +30408 +30409 +30410 +30411 +30412 +30413 +30414 +30415 +30416 +30417 +30418 +30419 +30420 +30421 +30422 +30423 +30424 +30425 +30426 +30427 +30428 +30429 +30430 +30431 +30432 +30433 +30434 +30435 +30436 +30437 +30438 +30439 +30440 +30441 +30442 +30443 +30444 +30445 +30446 +30447 +30448 +30449 +30450 +30451 +30452 +30453 +30454 +30455 +30456 +30457 +30458 +30459 +30460 +30461 +30462 +30463 +30464 +30465 +30466 +30467 +30468 +30469 +30470 +30471 +30472 +30473 +30474 +30475 +30476 +30477 +30478 +30479 +30480 +30481 +30482 +30483 +30484 +30485 +30486 +30487 +30488 +30489 +30490 +30491 +30492 +30493 +30494 +30495 +30496 +30497 +30498 +30499 +30500 +30501 +30502 +30503 +30504 +30505 +30506 +30507 +30508 +30509 +30510 +30511 +30512 +30513 +30514 +30515 +30516 +30517 +30518 +30519 +30520 +30521 +30522 +30523 +30524 +30525 +30526 +30527 +30528 +30529 +30530 +30531 +30532 +30533 +30534 +30535 +30536 +30537 +30538 +30539 +30540 +30541 +30542 +30543 +30544 +30545 +30546 +30547 +30548 +30549 +30550 +30551 +30552 +30553 +30554 +30555 +30556 +30557 +30558 +30559 +30560 +30561 +30562 +30563 +30564 +30565 +30566 +30567 +30568 +30569 +30570 +30571 +30572 +30573 +30574 +30575 +30576 +30577 +30578 +30579 +30580 +30581 +30582 +30583 +30584 +30585 +30586 +30587 +30588 +30589 +30590 +30591 +30592 +30593 +30594 +30595 +30596 +30597 +30598 +30599 +30600 +30601 +30602 +30603 +30604 +30605 +30606 +30607 +30608 +30609 +30610 +30611 +30612 +30613 +30614 +30615 +30616 +30617 +30618 +30619 +30620 +30621 +30622 +30623 +30624 +30625 +30626 +30627 +30628 +30629 +30630 +30631 +30632 +30633 +30634 +30635 +30636 +30637 +30638 +30639 +30640 +30641 +30642 +30643 +30644 +30645 +30646 +30647 +30648 +30649 +30650 +30651 +30652 +30653 +30654 +30655 +30656 +30657 +30658 +30659 +30660 +30661 +30662 +30663 +30664 +30665 +30666 +30667 +30668 +30669 +30670 +30671 +30672 +30673 +30674 +30675 +30676 +30677 +30678 +30679 +30680 +30681 +30682 +30683 +30684 +30685 +30686 +30687 +30688 +30689 +30690 +30691 +30692 +30693 +30694 +30695 +30696 +30697 +30698 +30699 +30700 +30701 +30702 +30703 +30704 +30705 +30706 +30707 +30708 +30709 +30710 +30711 +30712 +30713 +30714 +30715 +30716 +30717 +30718 +30719 +30720 +30721 +30722 +30723 +30724 +30725 +30726 +30727 +30728 +30729 +30730 +30731 +30732 +30733 +30734 +30735 +30736 +30737 +30738 +30739 +30740 +30741 +30742 +30743 +30744 +30745 +30746 +30747 +30748 +30749 +30750 +30751 +30752 +30753 +30754 +30755 +30756 +30757 +30758 +30759 +30760 +30761 +30762 +30763 +30764 +30765 +30766 +30767 +30768 +30769 +30770 +30771 +30772 +30773 +30774 +30775 +30776 +30777 +30778 +30779 +30780 +30781 +30782 +30783 +30784 +30785 +30786 +30787 +30788 +30789 +30790 +30791 +30792 +30793 +30794 +30795 +30796 +30797 +30798 +30799 +30800 +30801 +30802 +30803 +30804 +30805 +30806 +30807 +30808 +30809 +30810 +30811 +30812 +30813 +30814 +30815 +30816 +30817 +30818 +30819 +30820 +30821 +30822 +30823 +30824 +30825 +30826 +30827 +30828 +30829 +30830 +30831 +30832 +30833 +30834 +30835 +30836 +30837 +30838 +30839 +30840 +30841 +30842 +30843 +30844 +30845 +30846 +30847 +30848 +30849 +30850 +30851 +30852 +30853 +30854 +30855 +30856 +30857 +30858 +30859 +30860 +30861 +30862 +30863 +30864 +30865 +30866 +30867 +30868 +30869 +30870 +30871 +30872 +30873 +30874 +30875 +30876 +30877 +30878 +30879 +30880 +30881 +30882 +30883 +30884 +30885 +30886 +30887 +30888 +30889 +30890 +30891 +30892 +30893 +30894 +30895 +30896 +30897 +30898 +30899 +30900 +30901 +30902 +30903 +30904 +30905 +30906 +30907 +30908 +30909 +30910 +30911 +30912 +30913 +30914 +30915 +30916 +30917 +30918 +30919 +30920 +30921 +30922 +30923 +30924 +30925 +30926 +30927 +30928 +30929 +30930 +30931 +30932 +30933 +30934 +30935 +30936 +30937 +30938 +30939 +30940 +30941 +30942 +30943 +30944 +30945 +30946 +30947 +30948 +30949 +30950 +30951 +30952 +30953 +30954 +30955 +30956 +30957 +30958 +30959 +30960 +30961 +30962 +30963 +30964 +30965 +30966 +30967 +30968 +30969 +30970 +30971 +30972 +30973 +30974 +30975 +30976 +30977 +30978 +30979 +30980 +30981 +30982 +30983 +30984 +30985 +30986 +30987 +30988 +30989 +30990 +30991 +30992 +30993 +30994 +30995 +30996 +30997 +30998 +30999 +31000 +31001 +31002 +31003 +31004 +31005 +31006 +31007 +31008 +31009 +31010 +31011 +31012 +31013 +31014 +31015 +31016 +31017 +31018 +31019 +31020 +31021 +31022 +31023 +31024 +31025 +31026 +31027 +31028 +31029 +31030 +31031 +31032 +31033 +31034 +31035 +31036 +31037 +31038 +31039 +31040 +31041 +31042 +31043 +31044 +31045 +31046 +31047 +31048 +31049 +31050 +31051 +31052 +31053 +31054 +31055 +31056 +31057 +31058 +31059 +31060 +31061 +31062 +31063 +31064 +31065 +31066 +31067 +31068 +31069 +31070 +31071 +31072 +31073 +31074 +31075 +31076 +31077 +31078 +31079 +31080 +31081 +31082 +31083 +31084 +31085 +31086 +31087 +31088 +31089 +31090 +31091 +31092 +31093 +31094 +31095 +31096 +31097 +31098 +31099 +31100 +31101 +31102 +31103 +31104 +31105 +31106 +31107 +31108 +31109 +31110 +31111 +31112 +31113 +31114 +31115 +31116 +31117 +31118 +31119 +31120 +31121 +31122 +31123 +31124 +31125 +31126 +31127 +31128 +31129 +31130 +31131 +31132 +31133 +31134 +31135 +31136 +31137 +31138 +31139 +31140 +31141 +31142 +31143 +31144 +31145 +31146 +31147 +31148 +31149 +31150 +31151 +31152 +31153 +31154 +31155 +31156 +31157 +31158 +31159 +31160 +31161 +31162 +31163 +31164 +31165 +31166 +31167 +31168 +31169 +31170 +31171 +31172 +31173 +31174 +31175 +31176 +31177 +31178 +31179 +31180 +31181 +31182 +31183 +31184 +31185 +31186 +31187 +31188 +31189 +31190 +31191 +31192 +31193 +31194 +31195 +31196 +31197 +31198 +31199 +31200 +31201 +31202 +31203 +31204 +31205 +31206 +31207 +31208 +31209 +31210 +31211 +31212 +31213 +31214 +31215 +31216 +31217 +31218 +31219 +31220 +31221 +31222 +31223 +31224 +31225 +31226 +31227 +31228 +31229 +31230 +31231 +31232 +31233 +31234 +31235 +31236 +31237 +31238 +31239 +31240 +31241 +31242 +31243 +31244 +31245 +31246 +31247 +31248 +31249 +31250 +31251 +31252 +31253 +31254 +31255 +31256 +31257 +31258 +31259 +31260 +31261 +31262 +31263 +31264 +31265 +31266 +31267 +31268 +31269 +31270 +31271 +31272 +31273 +31274 +31275 +31276 +31277 +31278 +31279 +31280 +31281 +31282 +31283 +31284 +31285 +31286 +31287 +31288 +31289 +31290 +31291 +31292 +31293 +31294 +31295 +31296 +31297 +31298 +31299 +31300 +31301 +31302 +31303 +31304 +31305 +31306 +31307 +31308 +31309 +31310 +31311 +31312 +31313 +31314 +31315 +31316 +31317 +31318 +31319 +31320 +31321 +31322 +31323 +31324 +31325 +31326 +31327 +31328 +31329 +31330 +31331 +31332 +31333 +31334 +31335 +31336 +31337 +31338 +31339 +31340 +31341 +31342 +31343 +31344 +31345 +31346 +31347 +31348 +31349 +31350 +31351 +31352 +31353 +31354 +31355 +31356 +31357 +31358 +31359 +31360 +31361 +31362 +31363 +31364 +31365 +31366 +31367 +31368 +31369 +31370 +31371 +31372 +31373 +31374 +31375 +31376 +31377 +31378 +31379 +31380 +31381 +31382 +31383 +31384 +31385 +31386 +31387 +31388 +31389 +31390 +31391 +31392 +31393 +31394 +31395 +31396 +31397 +31398 +31399 +31400 +31401 +31402 +31403 +31404 +31405 +31406 +31407 +31408 +31409 +31410 +31411 +31412 +31413 +31414 +31415 +31416 +31417 +31418 +31419 +31420 +31421 +31422 +31423 +31424 +31425 +31426 +31427 +31428 +31429 +31430 +31431 +31432 +31433 +31434 +31435 +31436 +31437 +31438 +31439 +31440 +31441 +31442 +31443 +31444 +31445 +31446 +31447 +31448 +31449 +31450 +31451 +31452 +31453 +31454 +31455 +31456 +31457 +31458 +31459 +31460 +31461 +31462 +31463 +31464 +31465 +31466 +31467 +31468 +31469 +31470 +31471 +31472 +31473 +31474 +31475 +31476 +31477 +31478 +31479 +31480 +31481 +31482 +31483 +31484 +31485 +31486 +31487 +31488 +31489 +31490 +31491 +31492 +31493 +31494 +31495 +31496 +31497 +31498 +31499 +31500 +31501 +31502 +31503 +31504 +31505 +31506 +31507 +31508 +31509 +31510 +31511 +31512 +31513 +31514 +31515 +31516 +31517 +31518 +31519 +31520 +31521 +31522 +31523 +31524 +31525 +31526 +31527 +31528 +31529 +31530 +31531 +31532 +31533 +31534 +31535 +31536 +31537 +31538 +31539 +31540 +31541 +31542 +31543 +31544 +31545 +31546 +31547 +31548 +31549 +31550 +31551 +31552 +31553 +31554 +31555 +31556 +31557 +31558 +31559 +31560 +31561 +31562 +31563 +31564 +31565 +31566 +31567 +31568 +31569 +31570 +31571 +31572 +31573 +31574 +31575 +31576 +31577 +31578 +31579 +31580 +31581 +31582 +31583 +31584 +31585 +31586 +31587 +31588 +31589 +31590 +31591 +31592 +31593 +31594 +31595 +31596 +31597 +31598 +31599 +31600 +31601 +31602 +31603 +31604 +31605 +31606 +31607 +31608 +31609 +31610 +31611 +31612 +31613 +31614 +31615 +31616 +31617 +31618 +31619 +31620 +31621 +31622 +31623 +31624 +31625 +31626 +31627 +31628 +31629 +31630 +31631 +31632 +31633 +31634 +31635 +31636 +31637 +31638 +31639 +31640 +31641 +31642 +31643 +31644 +31645 +31646 +31647 +31648 +31649 +31650 +31651 +31652 +31653 +31654 +31655 +31656 +31657 +31658 +31659 +31660 +31661 +31662 +31663 +31664 +31665 +31666 +31667 +31668 +31669 +31670 +31671 +31672 +31673 +31674 +31675 +31676 +31677 +31678 +31679 +31680 +31681 +31682 +31683 +31684 +31685 +31686 +31687 +31688 +31689 +31690 +31691 +31692 +31693 +31694 +31695 +31696 +31697 +31698 +31699 +31700 +31701 +31702 +31703 +31704 +31705 +31706 +31707 +31708 +31709 +31710 +31711 +31712 +31713 +31714 +31715 +31716 +31717 +31718 +31719 +31720 +31721 +31722 +31723 +31724 +31725 +31726 +31727 +31728 +31729 +31730 +31731 +31732 +31733 +31734 +31735 +31736 +31737 +31738 +31739 +31740 +31741 +31742 +31743 +31744 +31745 +31746 +31747 +31748 +31749 +31750 +31751 +31752 +31753 +31754 +31755 +31756 +31757 +31758 +31759 +31760 +31761 +31762 +31763 +31764 +31765 +31766 +31767 +31768 +31769 +31770 +31771 +31772 +31773 +31774 +31775 +31776 +31777 +31778 +31779 +31780 +31781 +31782 +31783 +31784 +31785 +31786 +31787 +31788 +31789 +31790 +31791 +31792 +31793 +31794 +31795 +31796 +31797 +31798 +31799 +31800 +31801 +31802 +31803 +31804 +31805 +31806 +31807 +31808 +31809 +31810 +31811 +31812 +31813 +31814 +31815 +31816 +31817 +31818 +31819 +31820 +31821 +31822 +31823 +31824 +31825 +31826 +31827 +31828 +31829 +31830 +31831 +31832 +31833 +31834 +31835 +31836 +31837 +31838 +31839 +31840 +31841 +31842 +31843 +31844 +31845 +31846 +31847 +31848 +31849 +31850 +31851 +31852 +31853 +31854 +31855 +31856 +31857 +31858 +31859 +31860 +31861 +31862 +31863 +31864 +31865 +31866 +31867 +31868 +31869 +31870 +31871 +31872 +31873 +31874 +31875 +31876 +31877 +31878 +31879 +31880 +31881 +31882 +31883 +31884 +31885 +31886 +31887 +31888 +31889 +31890 +31891 +31892 +31893 +31894 +31895 +31896 +31897 +31898 +31899 +31900 +31901 +31902 +31903 +31904 +31905 +31906 +31907 +31908 +31909 +31910 +31911 +31912 +31913 +31914 +31915 +31916 +31917 +31918 +31919 +31920 +31921 +31922 +31923 +31924 +31925 +31926 +31927 +31928 +31929 +31930 +31931 +31932 +31933 +31934 +31935 +31936 +31937 +31938 +31939 +31940 +31941 +31942 +31943 +31944 +31945 +31946 +31947 +31948 +31949 +31950 +31951 +31952 +31953 +31954 +31955 +31956 +31957 +31958 +31959 +31960 +31961 +31962 +31963 +31964 +31965 +31966 +31967 +31968 +31969 +31970 +31971 +31972 +31973 +31974 +31975 +31976 +31977 +31978 +31979 +31980 +31981 +31982 +31983 +31984 +31985 +31986 +31987 +31988 +31989 +31990 +31991 +31992 +31993 +31994 +31995 +31996 +31997 +31998 +31999 +32000 +32001 +32002 +32003 +32004 +32005 +32006 +32007 +32008 +32009 +32010 +32011 +32012 +32013 +32014 +32015 +32016 +32017 +32018 +32019 +32020 +32021 +32022 +32023 +32024 +32025 +32026 +32027 +32028 +32029 +32030 +32031 +32032 +32033 +32034 +32035 +32036 +32037 +32038 +32039 +32040 +32041 +32042 +32043 +32044 +32045 +32046 +32047 +32048 +32049 +32050 +32051 +32052 +32053 +32054 +32055 +32056 +32057 +32058 +32059 +32060 +32061 +32062 +32063 +32064 +32065 +32066 +32067 +32068 +32069 +32070 +32071 +32072 +32073 +32074 +32075 +32076 +32077 +32078 +32079 +32080 +32081 +32082 +32083 +32084 +32085 +32086 +32087 +32088 +32089 +32090 +32091 +32092 +32093 +32094 +32095 +32096 +32097 +32098 +32099 +32100 +32101 +32102 +32103 +32104 +32105 +32106 +32107 +32108 +32109 +32110 +32111 +32112 +32113 +32114 +32115 +32116 +32117 +32118 +32119 +32120 +32121 +32122 +32123 +32124 +32125 +32126 +32127 +32128 +32129 +32130 +32131 +32132 +32133 +32134 +32135 +32136 +32137 +32138 +32139 +32140 +32141 +32142 +32143 +32144 +32145 +32146 +32147 +32148 +32149 +32150 +32151 +32152 +32153 +32154 +32155 +32156 +32157 +32158 +32159 +32160 +32161 +32162 +32163 +32164 +32165 +32166 +32167 +32168 +32169 +32170 +32171 +32172 +32173 +32174 +32175 +32176 +32177 +32178 +32179 +32180 +32181 +32182 +32183 +32184 +32185 +32186 +32187 +32188 +32189 +32190 +32191 +32192 +32193 +32194 +32195 +32196 +32197 +32198 +32199 +32200 +32201 +32202 +32203 +32204 +32205 +32206 +32207 +32208 +32209 +32210 +32211 +32212 +32213 +32214 +32215 +32216 +32217 +32218 +32219 +32220 +32221 +32222 +32223 +32224 +32225 +32226 +32227 +32228 +32229 +32230 +32231 +32232 +32233 +32234 +32235 +32236 +32237 +32238 +32239 +32240 +32241 +32242 +32243 +32244 +32245 +32246 +32247 +32248 +32249 +32250 +32251 +32252 +32253 +32254 +32255 +32256 +32257 +32258 +32259 +32260 +32261 +32262 +32263 +32264 +32265 +32266 +32267 +32268 +32269 +32270 +32271 +32272 +32273 +32274 +32275 +32276 +32277 +32278 +32279 +32280 +32281 +32282 +32283 +32284 +32285 +32286 +32287 +32288 +32289 +32290 +32291 +32292 +32293 +32294 +32295 +32296 +32297 +32298 +32299 +32300 +32301 +32302 +32303 +32304 +32305 +32306 +32307 +32308 +32309 +32310 +32311 +32312 +32313 +32314 +32315 +32316 +32317 +32318 +32319 +32320 +32321 +32322 +32323 +32324 +32325 +32326 +32327 +32328 +32329 +32330 +32331 +32332 +32333 +32334 +32335 +32336 +32337 +32338 +32339 +32340 +32341 +32342 +32343 +32344 +32345 +32346 +32347 +32348 +32349 +32350 +32351 +32352 +32353 +32354 +32355 +32356 +32357 +32358 +32359 +32360 +32361 +32362 +32363 +32364 +32365 +32366 +32367 +32368 +32369 +32370 +32371 +32372 +32373 +32374 +32375 +32376 +32377 +32378 +32379 +32380 +32381 +32382 +32383 +32384 +32385 +32386 +32387 +32388 +32389 +32390 +32391 +32392 +32393 +32394 +32395 +32396 +32397 +32398 +32399 +32400 +32401 +32402 +32403 +32404 +32405 +32406 +32407 +32408 +32409 +32410 +32411 +32412 +32413 +32414 +32415 +32416 +32417 +32418 +32419 +32420 +32421 +32422 +32423 +32424 +32425 +32426 +32427 +32428 +32429 +32430 +32431 +32432 +32433 +32434 +32435 +32436 +32437 +32438 +32439 +32440 +32441 +32442 +32443 +32444 +32445 +32446 +32447 +32448 +32449 +32450 +32451 +32452 +32453 +32454 +32455 +32456 +32457 +32458 +32459 +32460 +32461 +32462 +32463 +32464 +32465 +32466 +32467 +32468 +32469 +32470 +32471 +32472 +32473 +32474 +32475 +32476 +32477 +32478 +32479 +32480 +32481 +32482 +32483 +32484 +32485 +32486 +32487 +32488 +32489 +32490 +32491 +32492 +32493 +32494 +32495 +32496 +32497 +32498 +32499 +32500 +32501 +32502 +32503 +32504 +32505 +32506 +32507 +32508 +32509 +32510 +32511 +32512 +32513 +32514 +32515 +32516 +32517 +32518 +32519 +32520 +32521 +32522 +32523 +32524 +32525 +32526 +32527 +32528 +32529 +32530 +32531 +32532 +32533 +32534 +32535 +32536 +32537 +32538 +32539 +32540 +32541 +32542 +32543 +32544 +32545 +32546 +32547 +32548 +32549 +32550 +32551 +32552 +32553 +32554 +32555 +32556 +32557 +32558 +32559 +32560 +32561 +32562 +32563 +32564 +32565 +32566 +32567 +32568 +32569 +32570 +32571 +32572 +32573 +32574 +32575 +32576 +32577 +32578 +32579 +32580 +32581 +32582 +32583 +32584 +32585 +32586 +32587 +32588 +32589 +32590 +32591 +32592 +32593 +32594 +32595 +32596 +32597 +32598 +32599 +32600 +32601 +32602 +32603 +32604 +32605 +32606 +32607 +32608 +32609 +32610 +32611 +32612 +32613 +32614 +32615 +32616 +32617 +32618 +32619 +32620 +32621 +32622 +32623 +32624 +32625 +32626 +32627 +32628 +32629 +32630 +32631 +32632 +32633 +32634 +32635 +32636 +32637 +32638 +32639 +32640 +32641 +32642 +32643 +32644 +32645 +32646 +32647 +32648 +32649 +32650 +32651 +32652 +32653 +32654 +32655 +32656 +32657 +32658 +32659 +32660 +32661 +32662 +32663 +32664 +32665 +32666 +32667 +32668 +32669 +32670 +32671 +32672 +32673 +32674 +32675 +32676 +32677 +32678 +32679 +32680 +32681 +32682 +32683 +32684 +32685 +32686 +32687 +32688 +32689 +32690 +32691 +32692 +32693 +32694 +32695 +32696 +32697 +32698 +32699 +32700 +32701 +32702 +32703 +32704 +32705 +32706 +32707 +32708 +32709 +32710 +32711 +32712 +32713 +32714 +32715 +32716 +32717 +32718 +32719 +32720 +32721 +32722 +32723 +32724 +32725 +32726 +32727 +32728 +32729 +32730 +32731 +32732 +32733 +32734 +32735 +32736 +32737 +32738 +32739 +32740 +32741 +32742 +32743 +32744 +32745 +32746 +32747 +32748 +32749 +32750 +32751 +32752 +32753 +32754 +32755 +32756 +32757 +32758 +32759 +32760 +32761 +32762 +32763 +32764 +32765 +32766 +32767 +32768 +32769 +32770 +32771 +32772 +32773 +32774 +32775 +32776 +32777 +32778 +32779 +32780 +32781 +32782 +32783 +32784 +32785 +32786 +32787 +32788 +32789 +32790 +32791 +32792 +32793 +32794 +32795 +32796 +32797 +32798 +32799 +32800 +32801 +32802 +32803 +32804 +32805 +32806 +32807 +32808 +32809 +32810 +32811 +32812 +32813 +32814 +32815 +32816 +32817 +32818 +32819 +32820 +32821 +32822 +32823 +32824 +32825 +32826 +32827 +32828 +32829 +32830 +32831 +32832 +32833 +32834 +32835 +32836 +32837 +32838 +32839 +32840 +32841 +32842 +32843 +32844 +32845 +32846 +32847 +32848 +32849 +32850 +32851 +32852 +32853 +32854 +32855 +32856 +32857 +32858 +32859 +32860 +32861 +32862 +32863 +32864 +32865 +32866 +32867 +32868 +32869 +32870 +32871 +32872 +32873 +32874 +32875 +32876 +32877 +32878 +32879 +32880 +32881 +32882 +32883 +32884 +32885 +32886 +32887 +32888 +32889 +32890 +32891 +32892 +32893 +32894 +32895 +32896 +32897 +32898 +32899 +32900 +32901 +32902 +32903 +32904 +32905 +32906 +32907 +32908 +32909 +32910 +32911 +32912 +32913 +32914 +32915 +32916 +32917 +32918 +32919 +32920 +32921 +32922 +32923 +32924 +32925 +32926 +32927 +32928 +32929 +32930 +32931 +32932 +32933 +32934 +32935 +32936 +32937 +32938 +32939 +32940 +32941 +32942 +32943 +32944 +32945 +32946 +32947 +32948 +32949 +32950 +32951 +32952 +32953 +32954 +32955 +32956 +32957 +32958 +32959 +32960 +32961 +32962 +32963 +32964 +32965 +32966 +32967 +32968 +32969 +32970 +32971 +32972 +32973 +32974 +32975 +32976 +32977 +32978 +32979 +32980 +32981 +32982 +32983 +32984 +32985 +32986 +32987 +32988 +32989 +32990 +32991 +32992 +32993 +32994 +32995 +32996 +32997 +32998 +32999 +33000 +33001 +33002 +33003 +33004 +33005 +33006 +33007 +33008 +33009 +33010 +33011 +33012 +33013 +33014 +33015 +33016 +33017 +33018 +33019 +33020 +33021 +33022 +33023 +33024 +33025 +33026 +33027 +33028 +33029 +33030 +33031 +33032 +33033 +33034 +33035 +33036 +33037 +33038 +33039 +33040 +33041 +33042 +33043 +33044 +33045 +33046 +33047 +33048 +33049 +33050 +33051 +33052 +33053 +33054 +33055 +33056 +33057 +33058 +33059 +33060 +33061 +33062 +33063 +33064 +33065 +33066 +33067 +33068 +33069 +33070 +33071 +33072 +33073 +33074 +33075 +33076 +33077 +33078 +33079 +33080 +33081 +33082 +33083 +33084 +33085 +33086 +33087 +33088 +33089 +33090 +33091 +33092 +33093 +33094 +33095 +33096 +33097 +33098 +33099 +33100 +33101 +33102 +33103 +33104 +33105 +33106 +33107 +33108 +33109 +33110 +33111 +33112 +33113 +33114 +33115 +33116 +33117 +33118 +33119 +33120 +33121 +33122 +33123 +33124 +33125 +33126 +33127 +33128 +33129 +33130 +33131 +33132 +33133 +33134 +33135 +33136 +33137 +33138 +33139 +33140 +33141 +33142 +33143 +33144 +33145 +33146 +33147 +33148 +33149 +33150 +33151 +33152 +33153 +33154 +33155 +33156 +33157 +33158 +33159 +33160 +33161 +33162 +33163 +33164 +33165 +33166 +33167 +33168 +33169 +33170 +33171 +33172 +33173 +33174 +33175 +33176 +33177 +33178 +33179 +33180 +33181 +33182 +33183 +33184 +33185 +33186 +33187 +33188 +33189 +33190 +33191 +33192 +33193 +33194 +33195 +33196 +33197 +33198 +33199 +33200 +33201 +33202 +33203 +33204 +33205 +33206 +33207 +33208 +33209 +33210 +33211 +33212 +33213 +33214 +33215 +33216 +33217 +33218 +33219 +33220 +33221 +33222 +33223 +33224 +33225 +33226 +33227 +33228 +33229 +33230 +33231 +33232 +33233 +33234 +33235 +33236 +33237 +33238 +33239 +33240 +33241 +33242 +33243 +33244 +33245 +33246 +33247 +33248 +33249 +33250 +33251 +33252 +33253 +33254 +33255 +33256 +33257 +33258 +33259 +33260 +33261 +33262 +33263 +33264 +33265 +33266 +33267 +33268 +33269 +33270 +33271 +33272 +33273 +33274 +33275 +33276 +33277 +33278 +33279 +33280 +33281 +33282 +33283 +33284 +33285 +33286 +33287 +33288 +33289 +33290 +33291 +33292 +33293 +33294 +33295 +33296 +33297 +33298 +33299 +33300 +33301 +33302 +33303 +33304 +33305 +33306 +33307 +33308 +33309 +33310 +33311 +33312 +33313 +33314 +33315 +33316 +33317 +33318 +33319 +33320 +33321 +33322 +33323 +33324 +33325 +33326 +33327 +33328 +33329 +33330 +33331 +33332 +33333 +33334 +33335 +33336 +33337 +33338 +33339 +33340 +33341 +33342 +33343 +33344 +33345 +33346 +33347 +33348 +33349 +33350 +33351 +33352 +33353 +33354 +33355 +33356 +33357 +33358 +33359 +33360 +33361 +33362 +33363 +33364 +33365 +33366 +33367 +33368 +33369 +33370 +33371 +33372 +33373 +33374 +33375 +33376 +33377 +33378 +33379 +33380 +33381 +33382 +33383 +33384 +33385 +33386 +33387 +33388 +33389 +33390 +33391 +33392 +33393 +33394 +33395 +33396 +33397 +33398 +33399 +33400 +33401 +33402 +33403 +33404 +33405 +33406 +33407 +33408 +33409 +33410 +33411 +33412 +33413 +33414 +33415 +33416 +33417 +33418 +33419 +33420 +33421 +33422 +33423 +33424 +33425 +33426 +33427 +33428 +33429 +33430 +33431 +33432 +33433 +33434 +33435 +33436 +33437 +33438 +33439 +33440 +33441 +33442 +33443 +33444 +33445 +33446 +33447 +33448 +33449 +33450 +33451 +33452 +33453 +33454 +33455 +33456 +33457 +33458 +33459 +33460 +33461 +33462 +33463 +33464 +33465 +33466 +33467 +33468 +33469 +33470 +33471 +33472 +33473 +33474 +33475 +33476 +33477 +33478 +33479 +33480 +33481 +33482 +33483 +33484 +33485 +33486 +33487 +33488 +33489 +33490 +33491 +33492 +33493 +33494 +33495 +33496 +33497 +33498 +33499 +33500 +33501 +33502 +33503 +33504 +33505 +33506 +33507 +33508 +33509 +33510 +33511 +33512 +33513 +33514 +33515 +33516 +33517 +33518 +33519 +33520 +33521 +33522 +33523 +33524 +33525 +33526 +33527 +33528 +33529 +33530 +33531 +33532 +33533 +33534 +33535 +33536 +33537 +33538 +33539 +33540 +33541 +33542 +33543 +33544 +33545 +33546 +33547 +33548 +33549 +33550 +33551 +33552 +33553 +33554 +33555 +33556 +33557 +33558 +33559 +33560 +33561 +33562 +33563 +33564 +33565 +33566 +33567 +33568 +33569 +33570 +33571 +33572 +33573 +33574 +33575 +33576 +33577 +33578 +33579 +33580 +33581 +33582 +33583 +33584 +33585 +33586 +33587 +33588 +33589 +33590 +33591 +33592 +33593 +33594 +33595 +33596 +33597 +33598 +33599 +33600 +33601 +33602 +33603 +33604 +33605 +33606 +33607 +33608 +33609 +33610 +33611 +33612 +33613 +33614 +33615 +33616 +33617 +33618 +33619 +33620 +33621 +33622 +33623 +33624 +33625 +33626 +33627 +33628 +33629 +33630 +33631 +33632 +33633 +33634 +33635 +33636 +33637 +33638 +33639 +33640 +33641 +33642 +33643 +33644 +33645 +33646 +33647 +33648 +33649 +33650 +33651 +33652 +33653 +33654 +33655 +33656 +33657 +33658 +33659 +33660 +33661 +33662 +33663 +33664 +33665 +33666 +33667 +33668 +33669 +33670 +33671 +33672 +33673 +33674 +33675 +33676 +33677 +33678 +33679 +33680 +33681 +33682 +33683 +33684 +33685 +33686 +33687 +33688 +33689 +33690 +33691 +33692 +33693 +33694 +33695 +33696 +33697 +33698 +33699 +33700 +33701 +33702 +33703 +33704 +33705 +33706 +33707 +33708 +33709 +33710 +33711 +33712 +33713 +33714 +33715 +33716 +33717 +33718 +33719 +33720 +33721 +33722 +33723 +33724 +33725 +33726 +33727 +33728 +33729 +33730 +33731 +33732 +33733 +33734 +33735 +33736 +33737 +33738 +33739 +33740 +33741 +33742 +33743 +33744 +33745 +33746 +33747 +33748 +33749 +33750 +33751 +33752 +33753 +33754 +33755 +33756 +33757 +33758 +33759 +33760 +33761 +33762 +33763 +33764 +33765 +33766 +33767 +33768 +33769 +33770 +33771 +33772 +33773 +33774 +33775 +33776 +33777 +33778 +33779 +33780 +33781 +33782 +33783 +33784 +33785 +33786 +33787 +33788 +33789 +33790 +33791 +33792 +33793 +33794 +33795 +33796 +33797 +33798 +33799 +33800 +33801 +33802 +33803 +33804 +33805 +33806 +33807 +33808 +33809 +33810 +33811 +33812 +33813 +33814 +33815 +33816 +33817 +33818 +33819 +33820 +33821 +33822 +33823 +33824 +33825 +33826 +33827 +33828 +33829 +33830 +33831 +33832 +33833 +33834 +33835 +33836 +33837 +33838 +33839 +33840 +33841 +33842 +33843 +33844 +33845 +33846 +33847 +33848 +33849 +33850 +33851 +33852 +33853 +33854 +33855 +33856 +33857 +33858 +33859 +33860 +33861 +33862 +33863 +33864 +33865 +33866 +33867 +33868 +33869 +33870 +33871 +33872 +33873 +33874 +33875 +33876 +33877 +33878 +33879 +33880 +33881 +33882 +33883 +33884 +33885 +33886 +33887 +33888 +33889 +33890 +33891 +33892 +33893 +33894 +33895 +33896 +33897 +33898 +33899 +33900 +33901 +33902 +33903 +33904 +33905 +33906 +33907 +33908 +33909 +33910 +33911 +33912 +33913 +33914 +33915 +33916 +33917 +33918 +33919 +33920 +33921 +33922 +33923 +33924 +33925 +33926 +33927 +33928 +33929 +33930 +33931 +33932 +33933 +33934 +33935 +33936 +33937 +33938 +33939 +33940 +33941 +33942 +33943 +33944 +33945 +33946 +33947 +33948 +33949 +33950 +33951 +33952 +33953 +33954 +33955 +33956 +33957 +33958 +33959 +33960 +33961 +33962 +33963 +33964 +33965 +33966 +33967 +33968 +33969 +33970 +33971 +33972 +33973 +33974 +33975 +33976 +33977 +33978 +33979 +33980 +33981 +33982 +33983 +33984 +33985 +33986 +33987 +33988 +33989 +33990 +33991 +33992 +33993 +33994 +33995 +33996 +33997 +33998 +33999 +34000 +34001 +34002 +34003 +34004 +34005 +34006 +34007 +34008 +34009 +34010 +34011 +34012 +34013 +34014 +34015 +34016 +34017 +34018 +34019 +34020 +34021 +34022 +34023 +34024 +34025 +34026 +34027 +34028 +34029 +34030 +34031 +34032 +34033 +34034 +34035 +34036 +34037 +34038 +34039 +34040 +34041 +34042 +34043 +34044 +34045 +34046 +34047 +34048 +34049 +34050 +34051 +34052 +34053 +34054 +34055 +34056 +34057 +34058 +34059 +34060 +34061 +34062 +34063 +34064 +34065 +34066 +34067 +34068 +34069 +34070 +34071 +34072 +34073 +34074 +34075 +34076 +34077 +34078 +34079 +34080 +34081 +34082 +34083 +34084 +34085 +34086 +34087 +34088 +34089 +34090 +34091 +34092 +34093 +34094 +34095 +34096 +34097 +34098 +34099 +34100 +34101 +34102 +34103 +34104 +34105 +34106 +34107 +34108 +34109 +34110 +34111 +34112 +34113 +34114 +34115 +34116 +34117 +34118 +34119 +34120 +34121 +34122 +34123 +34124 +34125 +34126 +34127 +34128 +34129 +34130 +34131 +34132 +34133 +34134 +34135 +34136 +34137 +34138 +34139 +34140 +34141 +34142 +34143 +34144 +34145 +34146 +34147 +34148 +34149 +34150 +34151 +34152 +34153 +34154 +34155 +34156 +34157 +34158 +34159 +34160 +34161 +34162 +34163 +34164 +34165 +34166 +34167 +34168 +34169 +34170 +34171 +34172 +34173 +34174 +34175 +34176 +34177 +34178 +34179 +34180 +34181 +34182 +34183 +34184 +34185 +34186 +34187 +34188 +34189 +34190 +34191 +34192 +34193 +34194 +34195 +34196 +34197 +34198 +34199 +34200 +34201 +34202 +34203 +34204 +34205 +34206 +34207 +34208 +34209 +34210 +34211 +34212 +34213 +34214 +34215 +34216 +34217 +34218 +34219 +34220 +34221 +34222 +34223 +34224 +34225 +34226 +34227 +34228 +34229 +34230 +34231 +34232 +34233 +34234 +34235 +34236 +34237 +34238 +34239 +34240 +34241 +34242 +34243 +34244 +34245 +34246 +34247 +34248 +34249 +34250 +34251 +34252 +34253 +34254 +34255 +34256 +34257 +34258 +34259 +34260 +34261 +34262 +34263 +34264 +34265 +34266 +34267 +34268 +34269 +34270 +34271 +34272 +34273 +34274 +34275 +34276 +34277 +34278 +34279 +34280 +34281 +34282 +34283 +34284 +34285 +34286 +34287 +34288 +34289 +34290 +34291 +34292 +34293 +34294 +34295 +34296 +34297 +34298 +34299 +34300 +34301 +34302 +34303 +34304 +34305 +34306 +34307 +34308 +34309 +34310 +34311 +34312 +34313 +34314 +34315 +34316 +34317 +34318 +34319 +34320 +34321 +34322 +34323 +34324 +34325 +34326 +34327 +34328 +34329 +34330 +34331 +34332 +34333 +34334 +34335 +34336 +34337 +34338 +34339 +34340 +34341 +34342 +34343 +34344 +34345 +34346 +34347 +34348 +34349 +34350 +34351 +34352 +34353 +34354 +34355 +34356 +34357 +34358 +34359 +34360 +34361 +34362 +34363 +34364 +34365 +34366 +34367 +34368 +34369 +34370 +34371 +34372 +34373 +34374 +34375 +34376 +34377 +34378 +34379 +34380 +34381 +34382 +34383 +34384 +34385 +34386 +34387 +34388 +34389 +34390 +34391 +34392 +34393 +34394 +34395 +34396 +34397 +34398 +34399 +34400 +34401 +34402 +34403 +34404 +34405 +34406 +34407 +34408 +34409 +34410 +34411 +34412 +34413 +34414 +34415 +34416 +34417 +34418 +34419 +34420 +34421 +34422 +34423 +34424 +34425 +34426 +34427 +34428 +34429 +34430 +34431 +34432 +34433 +34434 +34435 +34436 +34437 +34438 +34439 +34440 +34441 +34442 +34443 +34444 +34445 +34446 +34447 +34448 +34449 +34450 +34451 +34452 +34453 +34454 +34455 +34456 +34457 +34458 +34459 +34460 +34461 +34462 +34463 +34464 +34465 +34466 +34467 +34468 +34469 +34470 +34471 +34472 +34473 +34474 +34475 +34476 +34477 +34478 +34479 +34480 +34481 +34482 +34483 +34484 +34485 +34486 +34487 +34488 +34489 +34490 +34491 +34492 +34493 +34494 +34495 +34496 +34497 +34498 +34499 +34500 +34501 +34502 +34503 +34504 +34505 +34506 +34507 +34508 +34509 +34510 +34511 +34512 +34513 +34514 +34515 +34516 +34517 +34518 +34519 +34520 +34521 +34522 +34523 +34524 +34525 +34526 +34527 +34528 +34529 +34530 +34531 +34532 +34533 +34534 +34535 +34536 +34537 +34538 +34539 +34540 +34541 +34542 +34543 +34544 +34545 +34546 +34547 +34548 +34549 +34550 +34551 +34552 +34553 +34554 +34555 +34556 +34557 +34558 +34559 +34560 +34561 +34562 +34563 +34564 +34565 +34566 +34567 +34568 +34569 +34570 +34571 +34572 +34573 +34574 +34575 +34576 +34577 +34578 +34579 +34580 +34581 +34582 +34583 +34584 +34585 +34586 +34587 +34588 +34589 +34590 +34591 +34592 +34593 +34594 +34595 +34596 +34597 +34598 +34599 +34600 +34601 +34602 +34603 +34604 +34605 +34606 +34607 +34608 +34609 +34610 +34611 +34612 +34613 +34614 +34615 +34616 +34617 +34618 +34619 +34620 +34621 +34622 +34623 +34624 +34625 +34626 +34627 +34628 +34629 +34630 +34631 +34632 +34633 +34634 +34635 +34636 +34637 +34638 +34639 +34640 +34641 +34642 +34643 +34644 +34645 +34646 +34647 +34648 +34649 +34650 +34651 +34652 +34653 +34654 +34655 +34656 +34657 +34658 +34659 +34660 +34661 +34662 +34663 +34664 +34665 +34666 +34667 +34668 +34669 +34670 +34671 +34672 +34673 +34674 +34675 +34676 +34677 +34678 +34679 +34680 +34681 +34682 +34683 +34684 +34685 +34686 +34687 +34688 +34689 +34690 +34691 +34692 +34693 +34694 +34695 +34696 +34697 +34698 +34699 +34700 +34701 +34702 +34703 +34704 +34705 +34706 +34707 +34708 +34709 +34710 +34711 +34712 +34713 +34714 +34715 +34716 +34717 +34718 +34719 +34720 +34721 +34722 +34723 +34724 +34725 +34726 +34727 +34728 +34729 +34730 +34731 +34732 +34733 +34734 +34735 +34736 +34737 +34738 +34739 +34740 +34741 +34742 +34743 +34744 +34745 +34746 +34747 +34748 +34749 +34750 +34751 +34752 +34753 +34754 +34755 +34756 +34757 +34758 +34759 +34760 +34761 +34762 +34763 +34764 +34765 +34766 +34767 +34768 +34769 +34770 +34771 +34772 +34773 +34774 +34775 +34776 +34777 +34778 +34779 +34780 +34781 +34782 +34783 +34784 +34785 +34786 +34787 +34788 +34789 +34790 +34791 +34792 +34793 +34794 +34795 +34796 +34797 +34798 +34799 +34800 +34801 +34802 +34803 +34804 +34805 +34806 +34807 +34808 +34809 +34810 +34811 +34812 +34813 +34814 +34815 +34816 +34817 +34818 +34819 +34820 +34821 +34822 +34823 +34824 +34825 +34826 +34827 +34828 +34829 +34830 +34831 +34832 +34833 +34834 +34835 +34836 +34837 +34838 +34839 +34840 +34841 +34842 +34843 +34844 +34845 +34846 +34847 +34848 +34849 +34850 +34851 +34852 +34853 +34854 +34855 +34856 +34857 +34858 +34859 +34860 +34861 +34862 +34863 +34864 +34865 +34866 +34867 +34868 +34869 +34870 +34871 +34872 +34873 +34874 +34875 +34876 +34877 +34878 +34879 +34880 +34881 +34882 +34883 +34884 +34885 +34886 +34887 +34888 +34889 +34890 +34891 +34892 +34893 +34894 +34895 +34896 +34897 +34898 +34899 +34900 +34901 +34902 +34903 +34904 +34905 +34906 +34907 +34908 +34909 +34910 +34911 +34912 +34913 +34914 +34915 +34916 +34917 +34918 +34919 +34920 +34921 +34922 +34923 +34924 +34925 +34926 +34927 +34928 +34929 +34930 +34931 +34932 +34933 +34934 +34935 +34936 +34937 +34938 +34939 +34940 +34941 +34942 +34943 +34944 +34945 +34946 +34947 +34948 +34949 +34950 +34951 +34952 +34953 +34954 +34955 +34956 +34957 +34958 +34959 +34960 +34961 +34962 +34963 +34964 +34965 +34966 +34967 +34968 +34969 +34970 +34971 +34972 +34973 +34974 +34975 +34976 +34977 +34978 +34979 +34980 +34981 +34982 +34983 +34984 +34985 +34986 +34987 +34988 +34989 +34990 +34991 +34992 +34993 +34994 +34995 +34996 +34997 +34998 +34999 +35000 +35001 +35002 +35003 +35004 +35005 +35006 +35007 +35008 +35009 +35010 +35011 +35012 +35013 +35014 +35015 +35016 +35017 +35018 +35019 +35020 +35021 +35022 +35023 +35024 +35025 +35026 +35027 +35028 +35029 +35030 +35031 +35032 +35033 +35034 +35035 +35036 +35037 +35038 +35039 +35040 +35041 +35042 +35043 +35044 +35045 +35046 +35047 +35048 +35049 +35050 +35051 +35052 +35053 +35054 +35055 +35056 +35057 +35058 +35059 +35060 +35061 +35062 +35063 +35064 +35065 +35066 +35067 +35068 +35069 +35070 +35071 +35072 +35073 +35074 +35075 +35076 +35077 +35078 +35079 +35080 +35081 +35082 +35083 +35084 +35085 +35086 +35087 +35088 +35089 +35090 +35091 +35092 +35093 +35094 +35095 +35096 +35097 +35098 +35099 +35100 +35101 +35102 +35103 +35104 +35105 +35106 +35107 +35108 +35109 +35110 +35111 +35112 +35113 +35114 +35115 +35116 +35117 +35118 +35119 +35120 +35121 +35122 +35123 +35124 +35125 +35126 +35127 +35128 +35129 +35130 +35131 +35132 +35133 +35134 +35135 +35136 +35137 +35138 +35139 +35140 +35141 +35142 +35143 +35144 +35145 +35146 +35147 +35148 +35149 +35150 +35151 +35152 +35153 +35154 +35155 +35156 +35157 +35158 +35159 +35160 +35161 +35162 +35163 +35164 +35165 +35166 +35167 +35168 +35169 +35170 +35171 +35172 +35173 +35174 +35175 +35176 +35177 +35178 +35179 +35180 +35181 +35182 +35183 +35184 +35185 +35186 +35187 +35188 +35189 +35190 +35191 +35192 +35193 +35194 +35195 +35196 +35197 +35198 +35199 +35200 +35201 +35202 +35203 +35204 +35205 +35206 +35207 +35208 +35209 +35210 +35211 +35212 +35213 +35214 +35215 +35216 +35217 +35218 +35219 +35220 +35221 +35222 +35223 +35224 +35225 +35226 +35227 +35228 +35229 +35230 +35231 +35232 +35233 +35234 +35235 +35236 +35237 +35238 +35239 +35240 +35241 +35242 +35243 +35244 +35245 +35246 +35247 +35248 +35249 +35250 +35251 +35252 +35253 +35254 +35255 +35256 +35257 +35258 +35259 +35260 +35261 +35262 +35263 +35264 +35265 +35266 +35267 +35268 +35269 +35270 +35271 +35272 +35273 +35274 +35275 +35276 +35277 +35278 +35279 +35280 +35281 +35282 +35283 +35284 +35285 +35286 +35287 +35288 +35289 +35290 +35291 +35292 +35293 +35294 +35295 +35296 +35297 +35298 +35299 +35300 +35301 +35302 +35303 +35304 +35305 +35306 +35307 +35308 +35309 +35310 +35311 +35312 +35313 +35314 +35315 +35316 +35317 +35318 +35319 +35320 +35321 +35322 +35323 +35324 +35325 +35326 +35327 +35328 +35329 +35330 +35331 +35332 +35333 +35334 +35335 +35336 +35337 +35338 +35339 +35340 +35341 +35342 +35343 +35344 +35345 +35346 +35347 +35348 +35349 +35350 +35351 +35352 +35353 +35354 +35355 +35356 +35357 +35358 +35359 +35360 +35361 +35362 +35363 +35364 +35365 +35366 +35367 +35368 +35369 +35370 +35371 +35372 +35373 +35374 +35375 +35376 +35377 +35378 +35379 +35380 +35381 +35382 +35383 +35384 +35385 +35386 +35387 +35388 +35389 +35390 +35391 +35392 +35393 +35394 +35395 +35396 +35397 +35398 +35399 +35400 +35401 +35402 +35403 +35404 +35405 +35406 +35407 +35408 +35409 +35410 +35411 +35412 +35413 +35414 +35415 +35416 +35417 +35418 +35419 +35420 +35421 +35422 +35423 +35424 +35425 +35426 +35427 +35428 +35429 +35430 +35431 +35432 +35433 +35434 +35435 +35436 +35437 +35438 +35439 +35440 +35441 +35442 +35443 +35444 +35445 +35446 +35447 +35448 +35449 +35450 +35451 +35452 +35453 +35454 +35455 +35456 +35457 +35458 +35459 +35460 +35461 +35462 +35463 +35464 +35465 +35466 +35467 +35468 +35469 +35470 +35471 +35472 +35473 +35474 +35475 +35476 +35477 +35478 +35479 +35480 +35481 +35482 +35483 +35484 +35485 +35486 +35487 +35488 +35489 +35490 +35491 +35492 +35493 +35494 +35495 +35496 +35497 +35498 +35499 +35500 +35501 +35502 +35503 +35504 +35505 +35506 +35507 +35508 +35509 +35510 +35511 +35512 +35513 +35514 +35515 +35516 +35517 +35518 +35519 +35520 +35521 +35522 +35523 +35524 +35525 +35526 +35527 +35528 +35529 +35530 +35531 +35532 +35533 +35534 +35535 +35536 +35537 +35538 +35539 +35540 +35541 +35542 +35543 +35544 +35545 +35546 +35547 +35548 +35549 +35550 +35551 +35552 +35553 +35554 +35555 +35556 +35557 +35558 +35559 +35560 +35561 +35562 +35563 +35564 +35565 +35566 +35567 +35568 +35569 +35570 +35571 +35572 +35573 +35574 +35575 +35576 +35577 +35578 +35579 +35580 +35581 +35582 +35583 +35584 +35585 +35586 +35587 +35588 +35589 +35590 +35591 +35592 +35593 +35594 +35595 +35596 +35597 +35598 +35599 +35600 +35601 +35602 +35603 +35604 +35605 +35606 +35607 +35608 +35609 +35610 +35611 +35612 +35613 +35614 +35615 +35616 +35617 +35618 +35619 +35620 +35621 +35622 +35623 +35624 +35625 +35626 +35627 +35628 +35629 +35630 +35631 +35632 +35633 +35634 +35635 +35636 +35637 +35638 +35639 +35640 +35641 +35642 +35643 +35644 +35645 +35646 +35647 +35648 +35649 +35650 +35651 +35652 +35653 +35654 +35655 +35656 +35657 +35658 +35659 +35660 +35661 +35662 +35663 +35664 +35665 +35666 +35667 +35668 +35669 +35670 +35671 +35672 +35673 +35674 +35675 +35676 +35677 +35678 +35679 +35680 +35681 +35682 +35683 +35684 +35685 +35686 +35687 +35688 +35689 +35690 +35691 +35692 +35693 +35694 +35695 +35696 +35697 +35698 +35699 +35700 +35701 +35702 +35703 +35704 +35705 +35706 +35707 +35708 +35709 +35710 +35711 +35712 +35713 +35714 +35715 +35716 +35717 +35718 +35719 +35720 +35721 +35722 +35723 +35724 +35725 +35726 +35727 +35728 +35729 +35730 +35731 +35732 +35733 +35734 +35735 +35736 +35737 +35738 +35739 +35740 +35741 +35742 +35743 +35744 +35745 +35746 +35747 +35748 +35749 +35750 +35751 +35752 +35753 +35754 +35755 +35756 +35757 +35758 +35759 +35760 +35761 +35762 +35763 +35764 +35765 +35766 +35767 +35768 +35769 +35770 +35771 +35772 +35773 +35774 +35775 +35776 +35777 +35778 +35779 +35780 +35781 +35782 +35783 +35784 +35785 +35786 +35787 +35788 +35789 +35790 +35791 +35792 +35793 +35794 +35795 +35796 +35797 +35798 +35799 +35800 +35801 +35802 +35803 +35804 +35805 +35806 +35807 +35808 +35809 +35810 +35811 +35812 +35813 +35814 +35815 +35816 +35817 +35818 +35819 +35820 +35821 +35822 +35823 +35824 +35825 +35826 +35827 +35828 +35829 +35830 +35831 +35832 +35833 +35834 +35835 +35836 +35837 +35838 +35839 +35840 +35841 +35842 +35843 +35844 +35845 +35846 +35847 +35848 +35849 +35850 +35851 +35852 +35853 +35854 +35855 +35856 +35857 +35858 +35859 +35860 +35861 +35862 +35863 +35864 +35865 +35866 +35867 +35868 +35869 +35870 +35871 +35872 +35873 +35874 +35875 +35876 +35877 +35878 +35879 +35880 +35881 +35882 +35883 +35884 +35885 +35886 +35887 +35888 +35889 +35890 +35891 +35892 +35893 +35894 +35895 +35896 +35897 +35898 +35899 +35900 +35901 +35902 +35903 +35904 +35905 +35906 +35907 +35908 +35909 +35910 +35911 +35912 +35913 +35914 +35915 +35916 +35917 +35918 +35919 +35920 +35921 +35922 +35923 +35924 +35925 +35926 +35927 +35928 +35929 +35930 +35931 +35932 +35933 +35934 +35935 +35936 +35937 +35938 +35939 +35940 +35941 +35942 +35943 +35944 +35945 +35946 +35947 +35948 +35949 +35950 +35951 +35952 +35953 +35954 +35955 +35956 +35957 +35958 +35959 +35960 +35961 +35962 +35963 +35964 +35965 +35966 +35967 +35968 +35969 +35970 +35971 +35972 +35973 +35974 +35975 +35976 +35977 +35978 +35979 +35980 +35981 +35982 +35983 +35984 +35985 +35986 +35987 +35988 +35989 +35990 +35991 +35992 +35993 +35994 +35995 +35996 +35997 +35998 +35999 +36000 +36001 +36002 +36003 +36004 +36005 +36006 +36007 +36008 +36009 +36010 +36011 +36012 +36013 +36014 +36015 +36016 +36017 +36018 +36019 +36020 +36021 +36022 +36023 +36024 +36025 +36026 +36027 +36028 +36029 +36030 +36031 +36032 +36033 +36034 +36035 +36036 +36037 +36038 +36039 +36040 +36041 +36042 +36043 +36044 +36045 +36046 +36047 +36048 +36049 +36050 +36051 +36052 +36053 +36054 +36055 +36056 +36057 +36058 +36059 +36060 +36061 +36062 +36063 +36064 +36065 +36066 +36067 +36068 +36069 +36070 +36071 +36072 +36073 +36074 +36075 +36076 +36077 +36078 +36079 +36080 +36081 +36082 +36083 +36084 +36085 +36086 +36087 +36088 +36089 +36090 +36091 +36092 +36093 +36094 +36095 +36096 +36097 +36098 +36099 +36100 +36101 +36102 +36103 +36104 +36105 +36106 +36107 +36108 +36109 +36110 +36111 +36112 +36113 +36114 +36115 +36116 +36117 +36118 +36119 +36120 +36121 +36122 +36123 +36124 +36125 +36126 +36127 +36128 +36129 +36130 +36131 +36132 +36133 +36134 +36135 +36136 +36137 +36138 +36139 +36140 +36141 +36142 +36143 +36144 +36145 +36146 +36147 +36148 +36149 +36150 +36151 +36152 +36153 +36154 +36155 +36156 +36157 +36158 +36159 +36160 +36161 +36162 +36163 +36164 +36165 +36166 +36167 +36168 +36169 +36170 +36171 +36172 +36173 +36174 +36175 +36176 +36177 +36178 +36179 +36180 +36181 +36182 +36183 +36184 +36185 +36186 +36187 +36188 +36189 +36190 +36191 +36192 +36193 +36194 +36195 +36196 +36197 +36198 +36199 +36200 +36201 +36202 +36203 +36204 +36205 +36206 +36207 +36208 +36209 +36210 +36211 +36212 +36213 +36214 +36215 +36216 +36217 +36218 +36219 +36220 +36221 +36222 +36223 +36224 +36225 +36226 +36227 +36228 +36229 +36230 +36231 +36232 +36233 +36234 +36235 +36236 +36237 +36238 +36239 +36240 +36241 +36242 +36243 +36244 +36245 +36246 +36247 +36248 +36249 +36250 +36251 +36252 +36253 +36254 +36255 +36256 +36257 +36258 +36259 +36260 +36261 +36262 +36263 +36264 +36265 +36266 +36267 +36268 +36269 +36270 +36271 +36272 +36273 +36274 +36275 +36276 +36277 +36278 +36279 +36280 +36281 +36282 +36283 +36284 +36285 +36286 +36287 +36288 +36289 +36290 +36291 +36292 +36293 +36294 +36295 +36296 +36297 +36298 +36299 +36300 +36301 +36302 +36303 +36304 +36305 +36306 +36307 +36308 +36309 +36310 +36311 +36312 +36313 +36314 +36315 +36316 +36317 +36318 +36319 +36320 +36321 +36322 +36323 +36324 +36325 +36326 +36327 +36328 +36329 +36330 +36331 +36332 +36333 +36334 +36335 +36336 +36337 +36338 +36339 +36340 +36341 +36342 +36343 +36344 +36345 +36346 +36347 +36348 +36349 +36350 +36351 +36352 +36353 +36354 +36355 +36356 +36357 +36358 +36359 +36360 +36361 +36362 +36363 +36364 +36365 +36366 +36367 +36368 +36369 +36370 +36371 +36372 +36373 +36374 +36375 +36376 +36377 +36378 +36379 +36380 +36381 +36382 +36383 +36384 +36385 +36386 +36387 +36388 +36389 +36390 +36391 +36392 +36393 +36394 +36395 +36396 +36397 +36398 +36399 +36400 +36401 +36402 +36403 +36404 +36405 +36406 +36407 +36408 +36409 +36410 +36411 +36412 +36413 +36414 +36415 +36416 +36417 +36418 +36419 +36420 +36421 +36422 +36423 +36424 +36425 +36426 +36427 +36428 +36429 +36430 +36431 +36432 +36433 +36434 +36435 +36436 +36437 +36438 +36439 +36440 +36441 +36442 +36443 +36444 +36445 +36446 +36447 +36448 +36449 +36450 +36451 +36452 +36453 +36454 +36455 +36456 +36457 +36458 +36459 +36460 +36461 +36462 +36463 +36464 +36465 +36466 +36467 +36468 +36469 +36470 +36471 +36472 +36473 +36474 +36475 +36476 +36477 +36478 +36479 +36480 +36481 +36482 +36483 +36484 +36485 +36486 +36487 +36488 +36489 +36490 +36491 +36492 +36493 +36494 +36495 +36496 +36497 +36498 +36499 +36500 +36501 +36502 +36503 +36504 +36505 +36506 +36507 +36508 +36509 +36510 +36511 +36512 +36513 +36514 +36515 +36516 +36517 +36518 +36519 +36520 +36521 +36522 +36523 +36524 +36525 +36526 +36527 +36528 +36529 +36530 +36531 +36532 +36533 +36534 +36535 +36536 +36537 +36538 +36539 +36540 +36541 +36542 +36543 +36544 +36545 +36546 +36547 +36548 +36549 +36550 +36551 +36552 +36553 +36554 +36555 +36556 +36557 +36558 +36559 +36560 +36561 +36562 +36563 +36564 +36565 +36566 +36567 +36568 +36569 +36570 +36571 +36572 +36573 +36574 +36575 +36576 +36577 +36578 +36579 +36580 +36581 +36582 +36583 +36584 +36585 +36586 +36587 +36588 +36589 +36590 +36591 +36592 +36593 +36594 +36595 +36596 +36597 +36598 +36599 +36600 +36601 +36602 +36603 +36604 +36605 +36606 +36607 +36608 +36609 +36610 +36611 +36612 +36613 +36614 +36615 +36616 +36617 +36618 +36619 +36620 +36621 +36622 +36623 +36624 +36625 +36626 +36627 +36628 +36629 +36630 +36631 +36632 +36633 +36634 +36635 +36636 +36637 +36638 +36639 +36640 +36641 +36642 +36643 +36644 +36645 +36646 +36647 +36648 +36649 +36650 +36651 +36652 +36653 +36654 +36655 +36656 +36657 +36658 +36659 +36660 +36661 +36662 +36663 +36664 +36665 +36666 +36667 +36668 +36669 +36670 +36671 +36672 +36673 +36674 +36675 +36676 +36677 +36678 +36679 +36680 +36681 +36682 +36683 +36684 +36685 +36686 +36687 +36688 +36689 +36690 +36691 +36692 +36693 +36694 +36695 +36696 +36697 +36698 +36699 +36700 +36701 +36702 +36703 +36704 +36705 +36706 +36707 +36708 +36709 +36710 +36711 +36712 +36713 +36714 +36715 +36716 +36717 +36718 +36719 +36720 +36721 +36722 +36723 +36724 +36725 +36726 +36727 +36728 +36729 +36730 +36731 +36732 +36733 +36734 +36735 +36736 +36737 +36738 +36739 +36740 +36741 +36742 +36743 +36744 +36745 +36746 +36747 +36748 +36749 +36750 +36751 +36752 +36753 +36754 +36755 +36756 +36757 +36758 +36759 +36760 +36761 +36762 +36763 +36764 +36765 +36766 +36767 +36768 +36769 +36770 +36771 +36772 +36773 +36774 +36775 +36776 +36777 +36778 +36779 +36780 +36781 +36782 +36783 +36784 +36785 +36786 +36787 +36788 +36789 +36790 +36791 +36792 +36793 +36794 +36795 +36796 +36797 +36798 +36799 +36800 +36801 +36802 +36803 +36804 +36805 +36806 +36807 +36808 +36809 +36810 +36811 +36812 +36813 +36814 +36815 +36816 +36817 +36818 +36819 +36820 +36821 +36822 +36823 +36824 +36825 +36826 +36827 +36828 +36829 +36830 +36831 +36832 +36833 +36834 +36835 +36836 +36837 +36838 +36839 +36840 +36841 +36842 +36843 +36844 +36845 +36846 +36847 +36848 +36849 +36850 +36851 +36852 +36853 +36854 +36855 +36856 +36857 +36858 +36859 +36860 +36861 +36862 +36863 +36864 +36865 +36866 +36867 +36868 +36869 +36870 +36871 +36872 +36873 +36874 +36875 +36876 +36877 +36878 +36879 +36880 +36881 +36882 +36883 +36884 +36885 +36886 +36887 +36888 +36889 +36890 +36891 +36892 +36893 +36894 +36895 +36896 +36897 +36898 +36899 +36900 +36901 +36902 +36903 +36904 +36905 +36906 +36907 +36908 +36909 +36910 +36911 +36912 +36913 +36914 +36915 +36916 +36917 +36918 +36919 +36920 +36921 +36922 +36923 +36924 +36925 +36926 +36927 +36928 +36929 +36930 +36931 +36932 +36933 +36934 +36935 +36936 +36937 +36938 +36939 +36940 +36941 +36942 +36943 +36944 +36945 +36946 +36947 +36948 +36949 +36950 +36951 +36952 +36953 +36954 +36955 +36956 +36957 +36958 +36959 +36960 +36961 +36962 +36963 +36964 +36965 +36966 +36967 +36968 +36969 +36970 +36971 +36972 +36973 +36974 +36975 +36976 +36977 +36978 +36979 +36980 +36981 +36982 +36983 +36984 +36985 +36986 +36987 +36988 +36989 +36990 +36991 +36992 +36993 +36994 +36995 +36996 +36997 +36998 +36999 +37000 +37001 +37002 +37003 +37004 +37005 +37006 +37007 +37008 +37009 +37010 +37011 +37012 +37013 +37014 +37015 +37016 +37017 +37018 +37019 +37020 +37021 +37022 +37023 +37024 +37025 +37026 +37027 +37028 +37029 +37030 +37031 +37032 +37033 +37034 +37035 +37036 +37037 +37038 +37039 +37040 +37041 +37042 +37043 +37044 +37045 +37046 +37047 +37048 +37049 +37050 +37051 +37052 +37053 +37054 +37055 +37056 +37057 +37058 +37059 +37060 +37061 +37062 +37063 +37064 +37065 +37066 +37067 +37068 +37069 +37070 +37071 +37072 +37073 +37074 +37075 +37076 +37077 +37078 +37079 +37080 +37081 +37082 +37083 +37084 +37085 +37086 +37087 +37088 +37089 +37090 +37091 +37092 +37093 +37094 +37095 +37096 +37097 +37098 +37099 +37100 +37101 +37102 +37103 +37104 +37105 +37106 +37107 +37108 +37109 +37110 +37111 +37112 +37113 +37114 +37115 +37116 +37117 +37118 +37119 +37120 +37121 +37122 +37123 +37124 +37125 +37126 +37127 +37128 +37129 +37130 +37131 +37132 +37133 +37134 +37135 +37136 +37137 +37138 +37139 +37140 +37141 +37142 +37143 +37144 +37145 +37146 +37147 +37148 +37149 +37150 +37151 +37152 +37153 +37154 +37155 +37156 +37157 +37158 +37159 +37160 +37161 +37162 +37163 +37164 +37165 +37166 +37167 +37168 +37169 +37170 +37171 +37172 +37173 +37174 +37175 +37176 +37177 +37178 +37179 +37180 +37181 +37182 +37183 +37184 +37185 +37186 +37187 +37188 +37189 +37190 +37191 +37192 +37193 +37194 +37195 +37196 +37197 +37198 +37199 +37200 +37201 +37202 +37203 +37204 +37205 +37206 +37207 +37208 +37209 +37210 +37211 +37212 +37213 +37214 +37215 +37216 +37217 +37218 +37219 +37220 +37221 +37222 +37223 +37224 +37225 +37226 +37227 +37228 +37229 +37230 +37231 +37232 +37233 +37234 +37235 +37236 +37237 +37238 +37239 +37240 +37241 +37242 +37243 +37244 +37245 +37246 +37247 +37248 +37249 +37250 +37251 +37252 +37253 +37254 +37255 +37256 +37257 +37258 +37259 +37260 +37261 +37262 +37263 +37264 +37265 +37266 +37267 +37268 +37269 +37270 +37271 +37272 +37273 +37274 +37275 +37276 +37277 +37278 +37279 +37280 +37281 +37282 +37283 +37284 +37285 +37286 +37287 +37288 +37289 +37290 +37291 +37292 +37293 +37294 +37295 +37296 +37297 +37298 +37299 +37300 +37301 +37302 +37303 +37304 +37305 +37306 +37307 +37308 +37309 +37310 +37311 +37312 +37313 +37314 +37315 +37316 +37317 +37318 +37319 +37320 +37321 +37322 +37323 +37324 +37325 +37326 +37327 +37328 +37329 +37330 +37331 +37332 +37333 +37334 +37335 +37336 +37337 +37338 +37339 +37340 +37341 +37342 +37343 +37344 +37345 +37346 +37347 +37348 +37349 +37350 +37351 +37352 +37353 +37354 +37355 +37356 +37357 +37358 +37359 +37360 +37361 +37362 +37363 +37364 +37365 +37366 +37367 +37368 +37369 +37370 +37371 +37372 +37373 +37374 +37375 +37376 +37377 +37378 +37379 +37380 +37381 +37382 +37383 +37384 +37385 +37386 +37387 +37388 +37389 +37390 +37391 +37392 +37393 +37394 +37395 +37396 +37397 +37398 +37399 +37400 +37401 +37402 +37403 +37404 +37405 +37406 +37407 +37408 +37409 +37410 +37411 +37412 +37413 +37414 +37415 +37416 +37417 +37418 +37419 +37420 +37421 +37422 +37423 +37424 +37425 +37426 +37427 +37428 +37429 +37430 +37431 +37432 +37433 +37434 +37435 +37436 +37437 +37438 +37439 +37440 +37441 +37442 +37443 +37444 +37445 +37446 +37447 +37448 +37449 +37450 +37451 +37452 +37453 +37454 +37455 +37456 +37457 +37458 +37459 +37460 +37461 +37462 +37463 +37464 +37465 +37466 +37467 +37468 +37469 +37470 +37471 +37472 +37473 +37474 +37475 +37476 +37477 +37478 +37479 +37480 +37481 +37482 +37483 +37484 +37485 +37486 +37487 +37488 +37489 +37490 +37491 +37492 +37493 +37494 +37495 +37496 +37497 +37498 +37499 +37500 +37501 +37502 +37503 +37504 +37505 +37506 +37507 +37508 +37509 +37510 +37511 +37512 +37513 +37514 +37515 +37516 +37517 +37518 +37519 +37520 +37521 +37522 +37523 +37524 +37525 +37526 +37527 +37528 +37529 +37530 +37531 +37532 +37533 +37534 +37535 +37536 +37537 +37538 +37539 +37540 +37541 +37542 +37543 +37544 +37545 +37546 +37547 +37548 +37549 +37550 +37551 +37552 +37553 +37554 +37555 +37556 +37557 +37558 +37559 +37560 +37561 +37562 +37563 +37564 +37565 +37566 +37567 +37568 +37569 +37570 +37571 +37572 +37573 +37574 +37575 +37576 +37577 +37578 +37579 +37580 +37581 +37582 +37583 +37584 +37585 +37586 +37587 +37588 +37589 +37590 +37591 +37592 +37593 +37594 +37595 +37596 +37597 +37598 +37599 +37600 +37601 +37602 +37603 +37604 +37605 +37606 +37607 +37608 +37609 +37610 +37611 +37612 +37613 +37614 +37615 +37616 +37617 +37618 +37619 +37620 +37621 +37622 +37623 +37624 +37625 +37626 +37627 +37628 +37629 +37630 +37631 +37632 +37633 +37634 +37635 +37636 +37637 +37638 +37639 +37640 +37641 +37642 +37643 +37644 +37645 +37646 +37647 +37648 +37649 +37650 +37651 +37652 +37653 +37654 +37655 +37656 +37657 +37658 +37659 +37660 +37661 +37662 +37663 +37664 +37665 +37666 +37667 +37668 +37669 +37670 +37671 +37672 +37673 +37674 +37675 +37676 +37677 +37678 +37679 +37680 +37681 +37682 +37683 +37684 +37685 +37686 +37687 +37688 +37689 +37690 +37691 +37692 +37693 +37694 +37695 +37696 +37697 +37698 +37699 +37700 +37701 +37702 +37703 +37704 +37705 +37706 +37707 +37708 +37709 +37710 +37711 +37712 +37713 +37714 +37715 +37716 +37717 +37718 +37719 +37720 +37721 +37722 +37723 +37724 +37725 +37726 +37727 +37728 +37729 +37730 +37731 +37732 +37733 +37734 +37735 +37736 +37737 +37738 +37739 +37740 +37741 +37742 +37743 +37744 +37745 +37746 +37747 +37748 +37749 +37750 +37751 +37752 +37753 +37754 +37755 +37756 +37757 +37758 +37759 +37760 +37761 +37762 +37763 +37764 +37765 +37766 +37767 +37768 +37769 +37770 +37771 +37772 +37773 +37774 +37775 +37776 +37777 +37778 +37779 +37780 +37781 +37782 +37783 +37784 +37785 +37786 +37787 +37788 +37789 +37790 +37791 +37792 +37793 +37794 +37795 +37796 +37797 +37798 +37799 +37800 +37801 +37802 +37803 +37804 +37805 +37806 +37807 +37808 +37809 +37810 +37811 +37812 +37813 +37814 +37815 +37816 +37817 +37818 +37819 +37820 +37821 +37822 +37823 +37824 +37825 +37826 +37827 +37828 +37829 +37830 +37831 +37832 +37833 +37834 +37835 +37836 +37837 +37838 +37839 +37840 +37841 +37842 +37843 +37844 +37845 +37846 +37847 +37848 +37849 +37850 +37851 +37852 +37853 +37854 +37855 +37856 +37857 +37858 +37859 +37860 +37861 +37862 +37863 +37864 +37865 +37866 +37867 +37868 +37869 +37870 +37871 +37872 +37873 +37874 +37875 +37876 +37877 +37878 +37879 +37880 +37881 +37882 +37883 +37884 +37885 +37886 +37887 +37888 +37889 +37890 +37891 +37892 +37893 +37894 +37895 +37896 +37897 +37898 +37899 +37900 +37901 +37902 +37903 +37904 +37905 +37906 +37907 +37908 +37909 +37910 +37911 +37912 +37913 +37914 +37915 +37916 +37917 +37918 +37919 +37920 +37921 +37922 +37923 +37924 +37925 +37926 +37927 +37928 +37929 +37930 +37931 +37932 +37933 +37934 +37935 +37936 +37937 +37938 +37939 +37940 +37941 +37942 +37943 +37944 +37945 +37946 +37947 +37948 +37949 +37950 +37951 +37952 +37953 +37954 +37955 +37956 +37957 +37958 +37959 +37960 +37961 +37962 +37963 +37964 +37965 +37966 +37967 +37968 +37969 +37970 +37971 +37972 +37973 +37974 +37975 +37976 +37977 +37978 +37979 +37980 +37981 +37982 +37983 +37984 +37985 +37986 +37987 +37988 +37989 +37990 +37991 +37992 +37993 +37994 +37995 +37996 +37997 +37998 +37999 +38000 +38001 +38002 +38003 +38004 +38005 +38006 +38007 +38008 +38009 +38010 +38011 +38012 +38013 +38014 +38015 +38016 +38017 +38018 +38019 +38020 +38021 +38022 +38023 +38024 +38025 +38026 +38027 +38028 +38029 +38030 +38031 +38032 +38033 +38034 +38035 +38036 +38037 +38038 +38039 +38040 +38041 +38042 +38043 +38044 +38045 +38046 +38047 +38048 +38049 +38050 +38051 +38052 +38053 +38054 +38055 +38056 +38057 +38058 +38059 +38060 +38061 +38062 +38063 +38064 +38065 +38066 +38067 +38068 +38069 +38070 +38071 +38072 +38073 +38074 +38075 +38076 +38077 +38078 +38079 +38080 +38081 +38082 +38083 +38084 +38085 +38086 +38087 +38088 +38089 +38090 +38091 +38092 +38093 +38094 +38095 +38096 +38097 +38098 +38099 +38100 +38101 +38102 +38103 +38104 +38105 +38106 +38107 +38108 +38109 +38110 +38111 +38112 +38113 +38114 +38115 +38116 +38117 +38118 +38119 +38120 +38121 +38122 +38123 +38124 +38125 +38126 +38127 +38128 +38129 +38130 +38131 +38132 +38133 +38134 +38135 +38136 +38137 +38138 +38139 +38140 +38141 +38142 +38143 +38144 +38145 +38146 +38147 +38148 +38149 +38150 +38151 +38152 +38153 +38154 +38155 +38156 +38157 +38158 +38159 +38160 +38161 +38162 +38163 +38164 +38165 +38166 +38167 +38168 +38169 +38170 +38171 +38172 +38173 +38174 +38175 +38176 +38177 +38178 +38179 +38180 +38181 +38182 +38183 +38184 +38185 +38186 +38187 +38188 +38189 +38190 +38191 +38192 +38193 +38194 +38195 +38196 +38197 +38198 +38199 +38200 +38201 +38202 +38203 +38204 +38205 +38206 +38207 +38208 +38209 +38210 +38211 +38212 +38213 +38214 +38215 +38216 +38217 +38218 +38219 +38220 +38221 +38222 +38223 +38224 +38225 +38226 +38227 +38228 +38229 +38230 +38231 +38232 +38233 +38234 +38235 +38236 +38237 +38238 +38239 +38240 +38241 +38242 +38243 +38244 +38245 +38246 +38247 +38248 +38249 +38250 +38251 +38252 +38253 +38254 +38255 +38256 +38257 +38258 +38259 +38260 +38261 +38262 +38263 +38264 +38265 +38266 +38267 +38268 +38269 +38270 +38271 +38272 +38273 +38274 +38275 +38276 +38277 +38278 +38279 +38280 +38281 +38282 +38283 +38284 +38285 +38286 +38287 +38288 +38289 +38290 +38291 +38292 +38293 +38294 +38295 +38296 +38297 +38298 +38299 +38300 +38301 +38302 +38303 +38304 +38305 +38306 +38307 +38308 +38309 +38310 +38311 +38312 +38313 +38314 +38315 +38316 +38317 +38318 +38319 +38320 +38321 +38322 +38323 +38324 +38325 +38326 +38327 +38328 +38329 +38330 +38331 +38332 +38333 +38334 +38335 +38336 +38337 +38338 +38339 +38340 +38341 +38342 +38343 +38344 +38345 +38346 +38347 +38348 +38349 +38350 +38351 +38352 +38353 +38354 +38355 +38356 +38357 +38358 +38359 +38360 +38361 +38362 +38363 +38364 +38365 +38366 +38367 +38368 +38369 +38370 +38371 +38372 +38373 +38374 +38375 +38376 +38377 +38378 +38379 +38380 +38381 +38382 +38383 +38384 +38385 +38386 +38387 +38388 +38389 +38390 +38391 +38392 +38393 +38394 +38395 +38396 +38397 +38398 +38399 +38400 +38401 +38402 +38403 +38404 +38405 +38406 +38407 +38408 +38409 +38410 +38411 +38412 +38413 +38414 +38415 +38416 +38417 +38418 +38419 +38420 +38421 +38422 +38423 +38424 +38425 +38426 +38427 +38428 +38429 +38430 +38431 +38432 +38433 +38434 +38435 +38436 +38437 +38438 +38439 +38440 +38441 +38442 +38443 +38444 +38445 +38446 +38447 +38448 +38449 +38450 +38451 +38452 +38453 +38454 +38455 +38456 +38457 +38458 +38459 +38460 +38461 +38462 +38463 +38464 +38465 +38466 +38467 +38468 +38469 +38470 +38471 +38472 +38473 +38474 +38475 +38476 +38477 +38478 +38479 +38480 +38481 +38482 +38483 +38484 +38485 +38486 +38487 +38488 +38489 +38490 +38491 +38492 +38493 +38494 +38495 +38496 +38497 +38498 +38499 +38500 +38501 +38502 +38503 +38504 +38505 +38506 +38507 +38508 +38509 +38510 +38511 +38512 +38513 +38514 +38515 +38516 +38517 +38518 +38519 +38520 +38521 +38522 +38523 +38524 +38525 +38526 +38527 +38528 +38529 +38530 +38531 +38532 +38533 +38534 +38535 +38536 +38537 +38538 +38539 +38540 +38541 +38542 +38543 +38544 +38545 +38546 +38547 +38548 +38549 +38550 +38551 +38552 +38553 +38554 +38555 +38556 +38557 +38558 +38559 +38560 +38561 +38562 +38563 +38564 +38565 +38566 +38567 +38568 +38569 +38570 +38571 +38572 +38573 +38574 +38575 +38576 +38577 +38578 +38579 +38580 +38581 +38582 +38583 +38584 +38585 +38586 +38587 +38588 +38589 +38590 +38591 +38592 +38593 +38594 +38595 +38596 +38597 +38598 +38599 +38600 +38601 +38602 +38603 +38604 +38605 +38606 +38607 +38608 +38609 +38610 +38611 +38612 +38613 +38614 +38615 +38616 +38617 +38618 +38619 +38620 +38621 +38622 +38623 +38624 +38625 +38626 +38627 +38628 +38629 +38630 +38631 +38632 +38633 +38634 +38635 +38636 +38637 +38638 +38639 +38640 +38641 +38642 +38643 +38644 +38645 +38646 +38647 +38648 +38649 +38650 +38651 +38652 +38653 +38654 +38655 +38656 +38657 +38658 +38659 +38660 +38661 +38662 +38663 +38664 +38665 +38666 +38667 +38668 +38669 +38670 +38671 +38672 +38673 +38674 +38675 +38676 +38677 +38678 +38679 +38680 +38681 +38682 +38683 +38684 +38685 +38686 +38687 +38688 +38689 +38690 +38691 +38692 +38693 +38694 +38695 +38696 +38697 +38698 +38699 +38700 +38701 +38702 +38703 +38704 +38705 +38706 +38707 +38708 +38709 +38710 +38711 +38712 +38713 +38714 +38715 +38716 +38717 +38718 +38719 +38720 +38721 +38722 +38723 +38724 +38725 +38726 +38727 +38728 +38729 +38730 +38731 +38732 +38733 +38734 +38735 +38736 +38737 +38738 +38739 +38740 +38741 +38742 +38743 +38744 +38745 +38746 +38747 +38748 +38749 +38750 +38751 +38752 +38753 +38754 +38755 +38756 +38757 +38758 +38759 +38760 +38761 +38762 +38763 +38764 +38765 +38766 +38767 +38768 +38769 +38770 +38771 +38772 +38773 +38774 +38775 +38776 +38777 +38778 +38779 +38780 +38781 +38782 +38783 +38784 +38785 +38786 +38787 +38788 +38789 +38790 +38791 +38792 +38793 +38794 +38795 +38796 +38797 +38798 +38799 +38800 +38801 +38802 +38803 +38804 +38805 +38806 +38807 +38808 +38809 +38810 +38811 +38812 +38813 +38814 +38815 +38816 +38817 +38818 +38819 +38820 +38821 +38822 +38823 +38824 +38825 +38826 +38827 +38828 +38829 +38830 +38831 +38832 +38833 +38834 +38835 +38836 +38837 +38838 +38839 +38840 +38841 +38842 +38843 +38844 +38845 +38846 +38847 +38848 +38849 +38850 +38851 +38852 +38853 +38854 +38855 +38856 +38857 +38858 +38859 +38860 +38861 +38862 +38863 +38864 +38865 +38866 +38867 +38868 +38869 +38870 +38871 +38872 +38873 +38874 +38875 +38876 +38877 +38878 +38879 +38880 +38881 +38882 +38883 +38884 +38885 +38886 +38887 +38888 +38889 +38890 +38891 +38892 +38893 +38894 +38895 +38896 +38897 +38898 +38899 +38900 +38901 +38902 +38903 +38904 +38905 +38906 +38907 +38908 +38909 +38910 +38911 +38912 +38913 +38914 +38915 +38916 +38917 +38918 +38919 +38920 +38921 +38922 +38923 +38924 +38925 +38926 +38927 +38928 +38929 +38930 +38931 +38932 +38933 +38934 +38935 +38936 +38937 +38938 +38939 +38940 +38941 +38942 +38943 +38944 +38945 +38946 +38947 +38948 +38949 +38950 +38951 +38952 +38953 +38954 +38955 +38956 +38957 +38958 +38959 +38960 +38961 +38962 +38963 +38964 +38965 +38966 +38967 +38968 +38969 +38970 +38971 +38972 +38973 +38974 +38975 +38976 +38977 +38978 +38979 +38980 +38981 +38982 +38983 +38984 +38985 +38986 +38987 +38988 +38989 +38990 +38991 +38992 +38993 +38994 +38995 +38996 +38997 +38998 +38999 +39000 +39001 +39002 +39003 +39004 +39005 +39006 +39007 +39008 +39009 +39010 +39011 +39012 +39013 +39014 +39015 +39016 +39017 +39018 +39019 +39020 +39021 +39022 +39023 +39024 +39025 +39026 +39027 +39028 +39029 +39030 +39031 +39032 +39033 +39034 +39035 +39036 +39037 +39038 +39039 +39040 +39041 +39042 +39043 +39044 +39045 +39046 +39047 +39048 +39049 +39050 +39051 +39052 +39053 +39054 +39055 +39056 +39057 +39058 +39059 +39060 +39061 +39062 +39063 +39064 +39065 +39066 +39067 +39068 +39069 +39070 +39071 +39072 +39073 +39074 +39075 +39076 +39077 +39078 +39079 +39080 +39081 +39082 +39083 +39084 +39085 +39086 +39087 +39088 +39089 +39090 +39091 +39092 +39093 +39094 +39095 +39096 +39097 +39098 +39099 +39100 +39101 +39102 +39103 +39104 +39105 +39106 +39107 +39108 +39109 +39110 +39111 +39112 +39113 +39114 +39115 +39116 +39117 +39118 +39119 +39120 +39121 +39122 +39123 +39124 +39125 +39126 +39127 +39128 +39129 +39130 +39131 +39132 +39133 +39134 +39135 +39136 +39137 +39138 +39139 +39140 +39141 +39142 +39143 +39144 +39145 +39146 +39147 +39148 +39149 +39150 +39151 +39152 +39153 +39154 +39155 +39156 +39157 +39158 +39159 +39160 +39161 +39162 +39163 +39164 +39165 +39166 +39167 +39168 +39169 +39170 +39171 +39172 +39173 +39174 +39175 +39176 +39177 +39178 +39179 +39180 +39181 +39182 +39183 +39184 +39185 +39186 +39187 +39188 +39189 +39190 +39191 +39192 +39193 +39194 +39195 +39196 +39197 +39198 +39199 +39200 +39201 +39202 +39203 +39204 +39205 +39206 +39207 +39208 +39209 +39210 +39211 +39212 +39213 +39214 +39215 +39216 +39217 +39218 +39219 +39220 +39221 +39222 +39223 +39224 +39225 +39226 +39227 +39228 +39229 +39230 +39231 +39232 +39233 +39234 +39235 +39236 +39237 +39238 +39239 +39240 +39241 +39242 +39243 +39244 +39245 +39246 +39247 +39248 +39249 +39250 +39251 +39252 +39253 +39254 +39255 +39256 +39257 +39258 +39259 +39260 +39261 +39262 +39263 +39264 +39265 +39266 +39267 +39268 +39269 +39270 +39271 +39272 +39273 +39274 +39275 +39276 +39277 +39278 +39279 +39280 +39281 +39282 +39283 +39284 +39285 +39286 +39287 +39288 +39289 +39290 +39291 +39292 +39293 +39294 +39295 +39296 +39297 +39298 +39299 +39300 +39301 +39302 +39303 +39304 +39305 +39306 +39307 +39308 +39309 +39310 +39311 +39312 +39313 +39314 +39315 +39316 +39317 +39318 +39319 +39320 +39321 +39322 +39323 +39324 +39325 +39326 +39327 +39328 +39329 +39330 +39331 +39332 +39333 +39334 +39335 +39336 +39337 +39338 +39339 +39340 +39341 +39342 +39343 +39344 +39345 +39346 +39347 +39348 +39349 +39350 +39351 +39352 +39353 +39354 +39355 +39356 +39357 +39358 +39359 +39360 +39361 +39362 +39363 +39364 +39365 +39366 +39367 +39368 +39369 +39370 +39371 +39372 +39373 +39374 +39375 +39376 +39377 +39378 +39379 +39380 +39381 +39382 +39383 +39384 +39385 +39386 +39387 +39388 +39389 +39390 +39391 +39392 +39393 +39394 +39395 +39396 +39397 +39398 +39399 +39400 +39401 +39402 +39403 +39404 +39405 +39406 +39407 +39408 +39409 +39410 +39411 +39412 +39413 +39414 +39415 +39416 +39417 +39418 +39419 +39420 +39421 +39422 +39423 +39424 +39425 +39426 +39427 +39428 +39429 +39430 +39431 +39432 +39433 +39434 +39435 +39436 +39437 +39438 +39439 +39440 +39441 +39442 +39443 +39444 +39445 +39446 +39447 +39448 +39449 +39450 +39451 +39452 +39453 +39454 +39455 +39456 +39457 +39458 +39459 +39460 +39461 +39462 +39463 +39464 +39465 +39466 +39467 +39468 +39469 +39470 +39471 +39472 +39473 +39474 +39475 +39476 +39477 +39478 +39479 +39480 +39481 +39482 +39483 +39484 +39485 +39486 +39487 +39488 +39489 +39490 +39491 +39492 +39493 +39494 +39495 +39496 +39497 +39498 +39499 +39500 +39501 +39502 +39503 +39504 +39505 +39506 +39507 +39508 +39509 +39510 +39511 +39512 +39513 +39514 +39515 +39516 +39517 +39518 +39519 +39520 +39521 +39522 +39523 +39524 +39525 +39526 +39527 +39528 +39529 +39530 +39531 +39532 +39533 +39534 +39535 +39536 +39537 +39538 +39539 +39540 +39541 +39542 +39543 +39544 +39545 +39546 +39547 +39548 +39549 +39550 +39551 +39552 +39553 +39554 +39555 +39556 +39557 +39558 +39559 +39560 +39561 +39562 +39563 +39564 +39565 +39566 +39567 +39568 +39569 +39570 +39571 +39572 +39573 +39574 +39575 +39576 +39577 +39578 +39579 +39580 +39581 +39582 +39583 +39584 +39585 +39586 +39587 +39588 +39589 +39590 +39591 +39592 +39593 +39594 +39595 +39596 +39597 +39598 +39599 +39600 +39601 +39602 +39603 +39604 +39605 +39606 +39607 +39608 +39609 +39610 +39611 +39612 +39613 +39614 +39615 +39616 +39617 +39618 +39619 +39620 +39621 +39622 +39623 +39624 +39625 +39626 +39627 +39628 +39629 +39630 +39631 +39632 +39633 +39634 +39635 +39636 +39637 +39638 +39639 +39640 +39641 +39642 +39643 +39644 +39645 +39646 +39647 +39648 +39649 +39650 +39651 +39652 +39653 +39654 +39655 +39656 +39657 +39658 +39659 +39660 +39661 +39662 +39663 +39664 +39665 +39666 +39667 +39668 +39669 +39670 +39671 +39672 +39673 +39674 +39675 +39676 +39677 +39678 +39679 +39680 +39681 +39682 +39683 +39684 +39685 +39686 +39687 +39688 +39689 +39690 +39691 +39692 +39693 +39694 +39695 +39696 +39697 +39698 +39699 +39700 +39701 +39702 +39703 +39704 +39705 +39706 +39707 +39708 +39709 +39710 +39711 +39712 +39713 +39714 +39715 +39716 +39717 +39718 +39719 +39720 +39721 +39722 +39723 +39724 +39725 +39726 +39727 +39728 +39729 +39730 +39731 +39732 +39733 +39734 +39735 +39736 +39737 +39738 +39739 +39740 +39741 +39742 +39743 +39744 +39745 +39746 +39747 +39748 +39749 +39750 +39751 +39752 +39753 +39754 +39755 +39756 +39757 +39758 +39759 +39760 +39761 +39762 +39763 +39764 +39765 +39766 +39767 +39768 +39769 +39770 +39771 +39772 +39773 +39774 +39775 +39776 +39777 +39778 +39779 +39780 +39781 +39782 +39783 +39784 +39785 +39786 +39787 +39788 +39789 +39790 +39791 +39792 +39793 +39794 +39795 +39796 +39797 +39798 +39799 +39800 +39801 +39802 +39803 +39804 +39805 +39806 +39807 +39808 +39809 +39810 +39811 +39812 +39813 +39814 +39815 +39816 +39817 +39818 +39819 +39820 +39821 +39822 +39823 +39824 +39825 +39826 +39827 +39828 +39829 +39830 +39831 +39832 +39833 +39834 +39835 +39836 +39837 +39838 +39839 +39840 +39841 +39842 +39843 +39844 +39845 +39846 +39847 +39848 +39849 +39850 +39851 +39852 +39853 +39854 +39855 +39856 +39857 +39858 +39859 +39860 +39861 +39862 +39863 +39864 +39865 +39866 +39867 +39868 +39869 +39870 +39871 +39872 +39873 +39874 +39875 +39876 +39877 +39878 +39879 +39880 +39881 +39882 +39883 +39884 +39885 +39886 +39887 +39888 +39889 +39890 +39891 +39892 +39893 +39894 +39895 +39896 +39897 +39898 +39899 +39900 +39901 +39902 +39903 +39904 +39905 +39906 +39907 +39908 +39909 +39910 +39911 +39912 +39913 +39914 +39915 +39916 +39917 +39918 +39919 +39920 +39921 +39922 +39923 +39924 +39925 +39926 +39927 +39928 +39929 +39930 +39931 +39932 +39933 +39934 +39935 +39936 +39937 +39938 +39939 +39940 +39941 +39942 +39943 +39944 +39945 +39946 +39947 +39948 +39949 +39950 +39951 +39952 +39953 +39954 +39955 +39956 +39957 +39958 +39959 +39960 +39961 +39962 +39963 +39964 +39965 +39966 +39967 +39968 +39969 +39970 +39971 +39972 +39973 +39974 +39975 +39976 +39977 +39978 +39979 +39980 +39981 +39982 +39983 +39984 +39985 +39986 +39987 +39988 +39989 +39990 +39991 +39992 +39993 +39994 +39995 +39996 +39997 +39998 +39999 +40000 +40001 +40002 +40003 +40004 +40005 +40006 +40007 +40008 +40009 +40010 +40011 +40012 +40013 +40014 +40015 +40016 +40017 +40018 +40019 +40020 +40021 +40022 +40023 +40024 +40025 +40026 +40027 +40028 +40029 +40030 +40031 +40032 +40033 +40034 +40035 +40036 +40037 +40038 +40039 +40040 +40041 +40042 +40043 +40044 +40045 +40046 +40047 +40048 +40049 +40050 +40051 +40052 +40053 +40054 +40055 +40056 +40057 +40058 +40059 +40060 +40061 +40062 +40063 +40064 +40065 +40066 +40067 +40068 +40069 +40070 +40071 +40072 +40073 +40074 +40075 +40076 +40077 +40078 +40079 +40080 +40081 +40082 +40083 +40084 +40085 +40086 +40087 +40088 +40089 +40090 +40091 +40092 +40093 +40094 +40095 +40096 +40097 +40098 +40099 +40100 +40101 +40102 +40103 +40104 +40105 +40106 +40107 +40108 +40109 +40110 +40111 +40112 +40113 +40114 +40115 +40116 +40117 +40118 +40119 +40120 +40121 +40122 +40123 +40124 +40125 +40126 +40127 +40128 +40129 +40130 +40131 +40132 +40133 +40134 +40135 +40136 +40137 +40138 +40139 +40140 +40141 +40142 +40143 +40144 +40145 +40146 +40147 +40148 +40149 +40150 +40151 +40152 +40153 +40154 +40155 +40156 +40157 +40158 +40159 +40160 +40161 +40162 +40163 +40164 +40165 +40166 +40167 +40168 +40169 +40170 +40171 +40172 +40173 +40174 +40175 +40176 +40177 +40178 +40179 +40180 +40181 +40182 +40183 +40184 +40185 +40186 +40187 +40188 +40189 +40190 +40191 +40192 +40193 +40194 +40195 +40196 +40197 +40198 +40199 +40200 +40201 +40202 +40203 +40204 +40205 +40206 +40207 +40208 +40209 +40210 +40211 +40212 +40213 +40214 +40215 +40216 +40217 +40218 +40219 +40220 +40221 +40222 +40223 +40224 +40225 +40226 +40227 +40228 +40229 +40230 +40231 +40232 +40233 +40234 +40235 +40236 +40237 +40238 +40239 +40240 +40241 +40242 +40243 +40244 +40245 +40246 +40247 +40248 +40249 +40250 +40251 +40252 +40253 +40254 +40255 +40256 +40257 +40258 +40259 +40260 +40261 +40262 +40263 +40264 +40265 +40266 +40267 +40268 +40269 +40270 +40271 +40272 +40273 +40274 +40275 +40276 +40277 +40278 +40279 +40280 +40281 +40282 +40283 +40284 +40285 +40286 +40287 +40288 +40289 +40290 +40291 +40292 +40293 +40294 +40295 +40296 +40297 +40298 +40299 +40300 +40301 +40302 +40303 +40304 +40305 +40306 +40307 +40308 +40309 +40310 +40311 +40312 +40313 +40314 +40315 +40316 +40317 +40318 +40319 +40320 +40321 +40322 +40323 +40324 +40325 +40326 +40327 +40328 +40329 +40330 +40331 +40332 +40333 +40334 +40335 +40336 +40337 +40338 +40339 +40340 +40341 +40342 +40343 +40344 +40345 +40346 +40347 +40348 +40349 +40350 +40351 +40352 +40353 +40354 +40355 +40356 +40357 +40358 +40359 +40360 +40361 +40362 +40363 +40364 +40365 +40366 +40367 +40368 +40369 +40370 +40371 +40372 +40373 +40374 +40375 +40376 +40377 +40378 +40379 +40380 +40381 +40382 +40383 +40384 +40385 +40386 +40387 +40388 +40389 +40390 +40391 +40392 +40393 +40394 +40395 +40396 +40397 +40398 +40399 +40400 +40401 +40402 +40403 +40404 +40405 +40406 +40407 +40408 +40409 +40410 +40411 +40412 +40413 +40414 +40415 +40416 +40417 +40418 +40419 +40420 +40421 +40422 +40423 +40424 +40425 +40426 +40427 +40428 +40429 +40430 +40431 +40432 +40433 +40434 +40435 +40436 +40437 +40438 +40439 +40440 +40441 +40442 +40443 +40444 +40445 +40446 +40447 +40448 +40449 +40450 +40451 +40452 +40453 +40454 +40455 +40456 +40457 +40458 +40459 +40460 +40461 +40462 +40463 +40464 +40465 +40466 +40467 +40468 +40469 +40470 +40471 +40472 +40473 +40474 +40475 +40476 +40477 +40478 +40479 +40480 +40481 +40482 +40483 +40484 +40485 +40486 +40487 +40488 +40489 +40490 +40491 +40492 +40493 +40494 +40495 +40496 +40497 +40498 +40499 +40500 +40501 +40502 +40503 +40504 +40505 +40506 +40507 +40508 +40509 +40510 +40511 +40512 +40513 +40514 +40515 +40516 +40517 +40518 +40519 +40520 +40521 +40522 +40523 +40524 +40525 +40526 +40527 +40528 +40529 +40530 +40531 +40532 +40533 +40534 +40535 +40536 +40537 +40538 +40539 +40540 +40541 +40542 +40543 +40544 +40545 +40546 +40547 +40548 +40549 +40550 +40551 +40552 +40553 +40554 +40555 +40556 +40557 +40558 +40559 +40560 +40561 +40562 +40563 +40564 +40565 +40566 +40567 +40568 +40569 +40570 +40571 +40572 +40573 +40574 +40575 +40576 +40577 +40578 +40579 +40580 +40581 +40582 +40583 +40584 +40585 +40586 +40587 +40588 +40589 +40590 +40591 +40592 +40593 +40594 +40595 +40596 +40597 +40598 +40599 +40600 +40601 +40602 +40603 +40604 +40605 +40606 +40607 +40608 +40609 +40610 +40611 +40612 +40613 +40614 +40615 +40616 +40617 +40618 +40619 +40620 +40621 +40622 +40623 +40624 +40625 +40626 +40627 +40628 +40629 +40630 +40631 +40632 +40633 +40634 +40635 +40636 +40637 +40638 +40639 +40640 +40641 +40642 +40643 +40644 +40645 +40646 +40647 +40648 +40649 +40650 +40651 +40652 +40653 +40654 +40655 +40656 +40657 +40658 +40659 +40660 +40661 +40662 +40663 +40664 +40665 +40666 +40667 +40668 +40669 +40670 +40671 +40672 +40673 +40674 +40675 +40676 +40677 +40678 +40679 +40680 +40681 +40682 +40683 +40684 +40685 +40686 +40687 +40688 +40689 +40690 +40691 +40692 +40693 +40694 +40695 +40696 +40697 +40698 +40699 +40700 +40701 +40702 +40703 +40704 +40705 +40706 +40707 +40708 +40709 +40710 +40711 +40712 +40713 +40714 +40715 +40716 +40717 +40718 +40719 +40720 +40721 +40722 +40723 +40724 +40725 +40726 +40727 +40728 +40729 +40730 +40731 +40732 +40733 +40734 +40735 +40736 +40737 +40738 +40739 +40740 +40741 +40742 +40743 +40744 +40745 +40746 +40747 +40748 +40749 +40750 +40751 +40752 +40753 +40754 +40755 +40756 +40757 +40758 +40759 +40760 +40761 +40762 +40763 +40764 +40765 +40766 +40767 +40768 +40769 +40770 +40771 +40772 +40773 +40774 +40775 +40776 +40777 +40778 +40779 +40780 +40781 +40782 +40783 +40784 +40785 +40786 +40787 +40788 +40789 +40790 +40791 +40792 +40793 +40794 +40795 +40796 +40797 +40798 +40799 +40800 +40801 +40802 +40803 +40804 +40805 +40806 +40807 +40808 +40809 +40810 +40811 +40812 +40813 +40814 +40815 +40816 +40817 +40818 +40819 +40820 +40821 +40822 +40823 +40824 +40825 +40826 +40827 +40828 +40829 +40830 +40831 +40832 +40833 +40834 +40835 +40836 +40837 +40838 +40839 +40840 +40841 +40842 +40843 +40844 +40845 +40846 +40847 +40848 +40849 +40850 +40851 +40852 +40853 +40854 +40855 +40856 +40857 +40858 +40859 +40860 +40861 +40862 +40863 +40864 +40865 +40866 +40867 +40868 +40869 +40870 +40871 +40872 +40873 +40874 +40875 +40876 +40877 +40878 +40879 +40880 +40881 +40882 +40883 +40884 +40885 +40886 +40887 +40888 +40889 +40890 +40891 +40892 +40893 +40894 +40895 +40896 +40897 +40898 +40899 +40900 +40901 +40902 +40903 +40904 +40905 +40906 +40907 +40908 +40909 +40910 +40911 +40912 +40913 +40914 +40915 +40916 +40917 +40918 +40919 +40920 +40921 +40922 +40923 +40924 +40925 +40926 +40927 +40928 +40929 +40930 +40931 +40932 +40933 +40934 +40935 +40936 +40937 +40938 +40939 +40940 +40941 +40942 +40943 +40944 +40945 +40946 +40947 +40948 +40949 +40950 +40951 +40952 +40953 +40954 +40955 +40956 +40957 +40958 +40959 +40960 +40961 +40962 +40963 +40964 +40965 +40966 +40967 +40968 +40969 +40970 +40971 +40972 +40973 +40974 +40975 +40976 +40977 +40978 +40979 +40980 +40981 +40982 +40983 +40984 +40985 +40986 +40987 +40988 +40989 +40990 +40991 +40992 +40993 +40994 +40995 +40996 +40997 +40998 +40999 +41000 +41001 +41002 +41003 +41004 +41005 +41006 +41007 +41008 +41009 +41010 +41011 +41012 +41013 +41014 +41015 +41016 +41017 +41018 +41019 +41020 +41021 +41022 +41023 +41024 +41025 +41026 +41027 +41028 +41029 +41030 +41031 +41032 +41033 +41034 +41035 +41036 +41037 +41038 +41039 +41040 +41041 +41042 +41043 +41044 +41045 +41046 +41047 +41048 +41049 +41050 +41051 +41052 +41053 +41054 +41055 +41056 +41057 +41058 +41059 +41060 +41061 +41062 +41063 +41064 +41065 +41066 +41067 +41068 +41069 +41070 +41071 +41072 +41073 +41074 +41075 +41076 +41077 +41078 +41079 +41080 +41081 +41082 +41083 +41084 +41085 +41086 +41087 +41088 +41089 +41090 +41091 +41092 +41093 +41094 +41095 +41096 +41097 +41098 +41099 +41100 +41101 +41102 +41103 +41104 +41105 +41106 +41107 +41108 +41109 +41110 +41111 +41112 +41113 +41114 +41115 +41116 +41117 +41118 +41119 +41120 +41121 +41122 +41123 +41124 +41125 +41126 +41127 +41128 +41129 +41130 +41131 +41132 +41133 +41134 +41135 +41136 +41137 +41138 +41139 +41140 +41141 +41142 +41143 +41144 +41145 +41146 +41147 +41148 +41149 +41150 +41151 +41152 +41153 +41154 +41155 +41156 +41157 +41158 +41159 +41160 +41161 +41162 +41163 +41164 +41165 +41166 +41167 +41168 +41169 +41170 +41171 +41172 +41173 +41174 +41175 +41176 +41177 +41178 +41179 +41180 +41181 +41182 +41183 +41184 +41185 +41186 +41187 +41188 +41189 +41190 +41191 +41192 +41193 +41194 +41195 +41196 +41197 +41198 +41199 +41200 +41201 +41202 +41203 +41204 +41205 +41206 +41207 +41208 +41209 +41210 +41211 +41212 +41213 +41214 +41215 +41216 +41217 +41218 +41219 +41220 +41221 +41222 +41223 +41224 +41225 +41226 +41227 +41228 +41229 +41230 +41231 +41232 +41233 +41234 +41235 +41236 +41237 +41238 +41239 +41240 +41241 +41242 +41243 +41244 +41245 +41246 +41247 +41248 +41249 +41250 +41251 +41252 +41253 +41254 +41255 +41256 +41257 +41258 +41259 +41260 +41261 +41262 +41263 +41264 +41265 +41266 +41267 +41268 +41269 +41270 +41271 +41272 +41273 +41274 +41275 +41276 +41277 +41278 +41279 +41280 +41281 +41282 +41283 +41284 +41285 +41286 +41287 +41288 +41289 +41290 +41291 +41292 +41293 +41294 +41295 +41296 +41297 +41298 +41299 +41300 +41301 +41302 +41303 +41304 +41305 +41306 +41307 +41308 +41309 +41310 +41311 +41312 +41313 +41314 +41315 +41316 +41317 +41318 +41319 +41320 +41321 +41322 +41323 +41324 +41325 +41326 +41327 +41328 +41329 +41330 +41331 +41332 +41333 +41334 +41335 +41336 +41337 +41338 +41339 +41340 +41341 +41342 +41343 +41344 +41345 +41346 +41347 +41348 +41349 +41350 +41351 +41352 +41353 +41354 +41355 +41356 +41357 +41358 +41359 +41360 +41361 +41362 +41363 +41364 +41365 +41366 +41367 +41368 +41369 +41370 +41371 +41372 +41373 +41374 +41375 +41376 +41377 +41378 +41379 +41380 +41381 +41382 +41383 +41384 +41385 +41386 +41387 +41388 +41389 +41390 +41391 +41392 +41393 +41394 +41395 +41396 +41397 +41398 +41399 +41400 +41401 +41402 +41403 +41404 +41405 +41406 +41407 +41408 +41409 +41410 +41411 +41412 +41413 +41414 +41415 +41416 +41417 +41418 +41419 +41420 +41421 +41422 +41423 +41424 +41425 +41426 +41427 +41428 +41429 +41430 +41431 +41432 +41433 +41434 +41435 +41436 +41437 +41438 +41439 +41440 +41441 +41442 +41443 +41444 +41445 +41446 +41447 +41448 +41449 +41450 +41451 +41452 +41453 +41454 +41455 +41456 +41457 +41458 +41459 +41460 +41461 +41462 +41463 +41464 +41465 +41466 +41467 +41468 +41469 +41470 +41471 +41472 +41473 +41474 +41475 +41476 +41477 +41478 +41479 +41480 +41481 +41482 +41483 +41484 +41485 +41486 +41487 +41488 +41489 +41490 +41491 +41492 +41493 +41494 +41495 +41496 +41497 +41498 +41499 +41500 +41501 +41502 +41503 +41504 +41505 +41506 +41507 +41508 +41509 +41510 +41511 +41512 +41513 +41514 +41515 +41516 +41517 +41518 +41519 +41520 +41521 +41522 +41523 +41524 +41525 +41526 +41527 +41528 +41529 +41530 +41531 +41532 +41533 +41534 +41535 +41536 +41537 +41538 +41539 +41540 +41541 +41542 +41543 +41544 +41545 +41546 +41547 +41548 +41549 +41550 +41551 +41552 +41553 +41554 +41555 +41556 +41557 +41558 +41559 +41560 +41561 +41562 +41563 +41564 +41565 +41566 +41567 +41568 +41569 +41570 +41571 +41572 +41573 +41574 +41575 +41576 +41577 +41578 +41579 +41580 +41581 +41582 +41583 +41584 +41585 +41586 +41587 +41588 +41589 +41590 +41591 +41592 +41593 +41594 +41595 +41596 +41597 +41598 +41599 +41600 +41601 +41602 +41603 +41604 +41605 +41606 +41607 +41608 +41609 +41610 +41611 +41612 +41613 +41614 +41615 +41616 +41617 +41618 +41619 +41620 +41621 +41622 +41623 +41624 +41625 +41626 +41627 +41628 +41629 +41630 +41631 +41632 +41633 +41634 +41635 +41636 +41637 +41638 +41639 +41640 +41641 +41642 +41643 +41644 +41645 +41646 +41647 +41648 +41649 +41650 +41651 +41652 +41653 +41654 +41655 +41656 +41657 +41658 +41659 +41660 +41661 +41662 +41663 +41664 +41665 +41666 +41667 +41668 +41669 +41670 +41671 +41672 +41673 +41674 +41675 +41676 +41677 +41678 +41679 +41680 +41681 +41682 +41683 +41684 +41685 +41686 +41687 +41688 +41689 +41690 +41691 +41692 +41693 +41694 +41695 +41696 +41697 +41698 +41699 +41700 +41701 +41702 +41703 +41704 +41705 +41706 +41707 +41708 +41709 +41710 +41711 +41712 +41713 +41714 +41715 +41716 +41717 +41718 +41719 +41720 +41721 +41722 +41723 +41724 +41725 +41726 +41727 +41728 +41729 +41730 +41731 +41732 +41733 +41734 +41735 +41736 +41737 +41738 +41739 +41740 +41741 +41742 +41743 +41744 +41745 +41746 +41747 +41748 +41749 +41750 +41751 +41752 +41753 +41754 +41755 +41756 +41757 +41758 +41759 +41760 +41761 +41762 +41763 +41764 +41765 +41766 +41767 +41768 +41769 +41770 +41771 +41772 +41773 +41774 +41775 +41776 +41777 +41778 +41779 +41780 +41781 +41782 +41783 +41784 +41785 +41786 +41787 +41788 +41789 +41790 +41791 +41792 +41793 +41794 +41795 +41796 +41797 +41798 +41799 +41800 +41801 +41802 +41803 +41804 +41805 +41806 +41807 +41808 +41809 +41810 +41811 +41812 +41813 +41814 +41815 +41816 +41817 +41818 +41819 +41820 +41821 +41822 +41823 +41824 +41825 +41826 +41827 +41828 +41829 +41830 +41831 +41832 +41833 +41834 +41835 +41836 +41837 +41838 +41839 +41840 +41841 +41842 +41843 +41844 +41845 +41846 +41847 +41848 +41849 +41850 +41851 +41852 +41853 +41854 +41855 +41856 +41857 +41858 +41859 +41860 +41861 +41862 +41863 +41864 +41865 +41866 +41867 +41868 +41869 +41870 +41871 +41872 +41873 +41874 +41875 +41876 +41877 +41878 +41879 +41880 +41881 +41882 +41883 +41884 +41885 +41886 +41887 +41888 +41889 +41890 +41891 +41892 +41893 +41894 +41895 +41896 +41897 +41898 +41899 +41900 +41901 +41902 +41903 +41904 +41905 +41906 +41907 +41908 +41909 +41910 +41911 +41912 +41913 +41914 +41915 +41916 +41917 +41918 +41919 +41920 +41921 +41922 +41923 +41924 +41925 +41926 +41927 +41928 +41929 +41930 +41931 +41932 +41933 +41934 +41935 +41936 +41937 +41938 +41939 +41940 +41941 +41942 +41943 +41944 +41945 +41946 +41947 +41948 +41949 +41950 +41951 +41952 +41953 +41954 +41955 +41956 +41957 +41958 +41959 +41960 +41961 +41962 +41963 +41964 +41965 +41966 +41967 +41968 +41969 +41970 +41971 +41972 +41973 +41974 +41975 +41976 +41977 +41978 +41979 +41980 +41981 +41982 +41983 +41984 +41985 +41986 +41987 +41988 +41989 +41990 +41991 +41992 +41993 +41994 +41995 +41996 +41997 +41998 +41999 +42000 +42001 +42002 +42003 +42004 +42005 +42006 +42007 +42008 +42009 +42010 +42011 +42012 +42013 +42014 +42015 +42016 +42017 +42018 +42019 +42020 +42021 +42022 +42023 +42024 +42025 +42026 +42027 +42028 +42029 +42030 +42031 +42032 +42033 +42034 +42035 +42036 +42037 +42038 +42039 +42040 +42041 +42042 +42043 +42044 +42045 +42046 +42047 +42048 +42049 +42050 +42051 +42052 +42053 +42054 +42055 +42056 +42057 +42058 +42059 +42060 +42061 +42062 +42063 +42064 +42065 +42066 +42067 +42068 +42069 +42070 +42071 +42072 +42073 +42074 +42075 +42076 +42077 +42078 +42079 +42080 +42081 +42082 +42083 +42084 +42085 +42086 +42087 +42088 +42089 +42090 +42091 +42092 +42093 +42094 +42095 +42096 +42097 +42098 +42099 +42100 +42101 +42102 +42103 +42104 +42105 +42106 +42107 +42108 +42109 +42110 +42111 +42112 +42113 +42114 +42115 +42116 +42117 +42118 +42119 +42120 +42121 +42122 +42123 +42124 +42125 +42126 +42127 +42128 +42129 +42130 +42131 +42132 +42133 +42134 +42135 +42136 +42137 +42138 +42139 +42140 +42141 +42142 +42143 +42144 +42145 +42146 +42147 +42148 +42149 +42150 +42151 +42152 +42153 +42154 +42155 +42156 +42157 +42158 +42159 +42160 +42161 +42162 +42163 +42164 +42165 +42166 +42167 +42168 +42169 +42170 +42171 +42172 +42173 +42174 +42175 +42176 +42177 +42178 +42179 +42180 +42181 +42182 +42183 +42184 +42185 +42186 +42187 +42188 +42189 +42190 +42191 +42192 +42193 +42194 +42195 +42196 +42197 +42198 +42199 +42200 +42201 +42202 +42203 +42204 +42205 +42206 +42207 +42208 +42209 +42210 +42211 +42212 +42213 +42214 +42215 +42216 +42217 +42218 +42219 +42220 +42221 +42222 +42223 +42224 +42225 +42226 +42227 +42228 +42229 +42230 +42231 +42232 +42233 +42234 +42235 +42236 +42237 +42238 +42239 +42240 +42241 +42242 +42243 +42244 +42245 +42246 +42247 +42248 +42249 +42250 +42251 +42252 +42253 +42254 +42255 +42256 +42257 +42258 +42259 +42260 +42261 +42262 +42263 +42264 +42265 +42266 +42267 +42268 +42269 +42270 +42271 +42272 +42273 +42274 +42275 +42276 +42277 +42278 +42279 +42280 +42281 +42282 +42283 +42284 +42285 +42286 +42287 +42288 +42289 +42290 +42291 +42292 +42293 +42294 +42295 +42296 +42297 +42298 +42299 +42300 +42301 +42302 +42303 +42304 +42305 +42306 +42307 +42308 +42309 +42310 +42311 +42312 +42313 +42314 +42315 +42316 +42317 +42318 +42319 +42320 +42321 +42322 +42323 +42324 +42325 +42326 +42327 +42328 +42329 +42330 +42331 +42332 +42333 +42334 +42335 +42336 +42337 +42338 +42339 +42340 +42341 +42342 +42343 +42344 +42345 +42346 +42347 +42348 +42349 +42350 +42351 +42352 +42353 +42354 +42355 +42356 +42357 +42358 +42359 +42360 +42361 +42362 +42363 +42364 +42365 +42366 +42367 +42368 +42369 +42370 +42371 +42372 +42373 +42374 +42375 +42376 +42377 +42378 +42379 +42380 +42381 +42382 +42383 +42384 +42385 +42386 +42387 +42388 +42389 +42390 +42391 +42392 +42393 +42394 +42395 +42396 +42397 +42398 +42399 +42400 +42401 +42402 +42403 +42404 +42405 +42406 +42407 +42408 +42409 +42410 +42411 +42412 +42413 +42414 +42415 +42416 +42417 +42418 +42419 +42420 +42421 +42422 +42423 +42424 +42425 +42426 +42427 +42428 +42429 +42430 +42431 +42432 +42433 +42434 +42435 +42436 +42437 +42438 +42439 +42440 +42441 +42442 +42443 +42444 +42445 +42446 +42447 +42448 +42449 +42450 +42451 +42452 +42453 +42454 +42455 +42456 +42457 +42458 +42459 +42460 +42461 +42462 +42463 +42464 +42465 +42466 +42467 +42468 +42469 +42470 +42471 +42472 +42473 +42474 +42475 +42476 +42477 +42478 +42479 +42480 +42481 +42482 +42483 +42484 +42485 +42486 +42487 +42488 +42489 +42490 +42491 +42492 +42493 +42494 +42495 +42496 +42497 +42498 +42499 +42500 +42501 +42502 +42503 +42504 +42505 +42506 +42507 +42508 +42509 +42510 +42511 +42512 +42513 +42514 +42515 +42516 +42517 +42518 +42519 +42520 +42521 +42522 +42523 +42524 +42525 +42526 +42527 +42528 +42529 +42530 +42531 +42532 +42533 +42534 +42535 +42536 +42537 +42538 +42539 +42540 +42541 +42542 +42543 +42544 +42545 +42546 +42547 +42548 +42549 +42550 +42551 +42552 +42553 +42554 +42555 +42556 +42557 +42558 +42559 +42560 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42606 +42607 +42608 +42609 +42610 +42611 +42612 +42613 +42614 +42615 +42616 +42617 +42618 +42619 +42620 +42621 +42622 +42623 +42624 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42652 +42653 +42654 +42655 +42656 +42657 +42658 +42659 +42660 +42661 +42662 +42663 +42664 +42665 +42666 +42667 +42668 +42669 +42670 +42671 +42672 +42673 +42674 +42675 +42676 +42677 +42678 +42679 +42680 +42681 +42682 +42683 +42684 +42685 +42686 +42687 +42688 +42689 +42690 +42691 +42692 +42693 +42694 +42695 +42696 +42697 +42698 +42699 +42700 +42701 +42702 +42703 +42704 +42705 +42706 +42707 +42708 +42709 +42710 +42711 +42712 +42713 +42714 +42715 +42716 +42717 +42718 +42719 +42720 +42721 +42722 +42723 +42724 +42725 +42726 +42727 +42728 +42729 +42730 +42731 +42732 +42733 +42734 +42735 +42736 +42737 +42738 +42739 +42740 +42741 +42742 +42743 +42744 +42745 +42746 +42747 +42748 +42749 +42750 +42751 +42752 +42753 +42754 +42755 +42756 +42757 +42758 +42759 +42760 +42761 +42762 +42763 +42764 +42765 +42766 +42767 +42768 +42769 +42770 +42771 +42772 +42773 +42774 +42775 +42776 +42777 +42778 +42779 +42780 +42781 +42782 +42783 +42784 +42785 +42786 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42800 +42801 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42864 +42865 +42866 +42867 +42868 +42869 +42870 +42871 +42872 +42873 +42874 +42875 +42876 +42877 +42878 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42888 +42889 +42890 +42891 +42892 +42893 +42894 +42895 +42896 +42897 +42898 +42899 +42900 +42901 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42923 +42924 +42925 +42926 +42927 +42928 +42929 +42930 +42931 +42932 +42933 +42934 +42935 +42936 +42937 +42938 +42939 +42940 +42941 +42942 +42943 +42944 +42945 +42946 +42947 +42948 +42949 +42950 +42951 +42952 +42953 +42954 +42955 +42956 +42957 +42958 +42959 +42960 +42961 +42962 +42963 +42964 +42965 +42966 +42967 +42968 +42969 +42970 +42971 +42972 +42973 +42974 +42975 +42976 +42977 +42978 +42979 +42980 +42981 +42982 +42983 +42984 +42985 +42986 +42987 +42988 +42989 +42990 +42991 +42992 +42993 +42994 +42995 +42996 +42997 +42998 +42999 +43000 +43001 +43002 +43003 +43004 +43005 +43006 +43007 +43008 +43009 +43010 +43011 +43012 +43013 +43014 +43015 +43016 +43017 +43018 +43019 +43020 +43021 +43022 +43023 +43024 +43025 +43026 +43027 +43028 +43029 +43030 +43031 +43032 +43033 +43034 +43035 +43036 +43037 +43038 +43039 +43040 +43041 +43042 +43043 +43044 +43045 +43046 +43047 +43048 +43049 +43050 +43051 +43052 +43053 +43054 +43055 +43056 +43057 +43058 +43059 +43060 +43061 +43062 +43063 +43064 +43065 +43066 +43067 +43068 +43069 +43070 +43071 +43072 +43073 +43074 +43075 +43076 +43077 +43078 +43079 +43080 +43081 +43082 +43083 +43084 +43085 +43086 +43087 +43088 +43089 +43090 +43091 +43092 +43093 +43094 +43095 +43096 +43097 +43098 +43099 +43100 +43101 +43102 +43103 +43104 +43105 +43106 +43107 +43108 +43109 +43110 +43111 +43112 +43113 +43114 +43115 +43116 +43117 +43118 +43119 +43120 +43121 +43122 +43123 +43124 +43125 +43126 +43127 +43128 +43129 +43130 +43131 +43132 +43133 +43134 +43135 +43136 +43137 +43138 +43139 +43140 +43141 +43142 +43143 +43144 +43145 +43146 +43147 +43148 +43149 +43150 +43151 +43152 +43153 +43154 +43155 +43156 +43157 +43158 +43159 +43160 +43161 +43162 +43163 +43164 +43165 +43166 +43167 +43168 +43169 +43170 +43171 +43172 +43173 +43174 +43175 +43176 +43177 +43178 +43179 +43180 +43181 +43182 +43183 +43184 +43185 +43186 +43187 +43188 +43189 +43190 +43191 +43192 +43193 +43194 +43195 +43196 +43197 +43198 +43199 +43200 +43201 +43202 +43203 +43204 +43205 +43206 +43207 +43208 +43209 +43210 +43211 +43212 +43213 +43214 +43215 +43216 +43217 +43218 +43219 +43220 +43221 +43222 +43223 +43224 +43225 +43226 +43227 +43228 +43229 +43230 +43231 +43232 +43233 +43234 +43235 +43236 +43237 +43238 +43239 +43240 +43241 +43242 +43243 +43244 +43245 +43246 +43247 +43248 +43249 +43250 +43251 +43252 +43253 +43254 +43255 +43256 +43257 +43258 +43259 +43260 +43261 +43262 +43263 +43264 +43265 +43266 +43267 +43268 +43269 +43270 +43271 +43272 +43273 +43274 +43275 +43276 +43277 +43278 +43279 +43280 +43281 +43282 +43283 +43284 +43285 +43286 +43287 +43288 +43289 +43290 +43291 +43292 +43293 +43294 +43295 +43296 +43297 +43298 +43299 +43300 +43301 +43302 +43303 +43304 +43305 +43306 +43307 +43308 +43309 +43310 +43311 +43312 +43313 +43314 +43315 +43316 +43317 +43318 +43319 +43320 +43321 +43322 +43323 +43324 +43325 +43326 +43327 +43328 +43329 +43330 +43331 +43332 +43333 +43334 +43335 +43336 +43337 +43338 +43339 +43340 +43341 +43342 +43343 +43344 +43345 +43346 +43347 +43348 +43349 +43350 +43351 +43352 +43353 +43354 +43355 +43356 +43357 +43358 +43359 +43360 +43361 +43362 +43363 +43364 +43365 +43366 +43367 +43368 +43369 +43370 +43371 +43372 +43373 +43374 +43375 +43376 +43377 +43378 +43379 +43380 +43381 +43382 +43383 +43384 +43385 +43386 +43387 +43388 +43389 +43390 +43391 +43392 +43393 +43394 +43395 +43396 +43397 +43398 +43399 +43400 +43401 +43402 +43403 +43404 +43405 +43406 +43407 +43408 +43409 +43410 +43411 +43412 +43413 +43414 +43415 +43416 +43417 +43418 +43419 +43420 +43421 +43422 +43423 +43424 +43425 +43426 +43427 +43428 +43429 +43430 +43431 +43432 +43433 +43434 +43435 +43436 +43437 +43438 +43439 +43440 +43441 +43442 +43443 +43444 +43445 +43446 +43447 +43448 +43449 +43450 +43451 +43452 +43453 +43454 +43455 +43456 +43457 +43458 +43459 +43460 +43461 +43462 +43463 +43464 +43465 +43466 +43467 +43468 +43469 +43470 +43471 +43472 +43473 +43474 +43475 +43476 +43477 +43478 +43479 +43480 +43481 +43482 +43483 +43484 +43485 +43486 +43487 +43488 +43489 +43490 +43491 +43492 +43493 +43494 +43495 +43496 +43497 +43498 +43499 +43500 +43501 +43502 +43503 +43504 +43505 +43506 +43507 +43508 +43509 +43510 +43511 +43512 +43513 +43514 +43515 +43516 +43517 +43518 +43519 +43520 +43521 +43522 +43523 +43524 +43525 +43526 +43527 +43528 +43529 +43530 +43531 +43532 +43533 +43534 +43535 +43536 +43537 +43538 +43539 +43540 +43541 +43542 +43543 +43544 +43545 +43546 +43547 +43548 +43549 +43550 +43551 +43552 +43553 +43554 +43555 +43556 +43557 +43558 +43559 +43560 +43561 +43562 +43563 +43564 +43565 +43566 +43567 +43568 +43569 +43570 +43571 +43572 +43573 +43574 +43575 +43576 +43577 +43578 +43579 +43580 +43581 +43582 +43583 +43584 +43585 +43586 +43587 +43588 +43589 +43590 +43591 +43592 +43593 +43594 +43595 +43596 +43597 +43598 +43599 +43600 +43601 +43602 +43603 +43604 +43605 +43606 +43607 +43608 +43609 +43610 +43611 +43612 +43613 +43614 +43615 +43616 +43617 +43618 +43619 +43620 +43621 +43622 +43623 +43624 +43625 +43626 +43627 +43628 +43629 +43630 +43631 +43632 +43633 +43634 +43635 +43636 +43637 +43638 +43639 +43640 +43641 +43642 +43643 +43644 +43645 +43646 +43647 +43648 +43649 +43650 +43651 +43652 +43653 +43654 +43655 +43656 +43657 +43658 +43659 +43660 +43661 +43662 +43663 +43664 +43665 +43666 +43667 +43668 +43669 +43670 +43671 +43672 +43673 +43674 +43675 +43676 +43677 +43678 +43679 +43680 +43681 +43682 +43683 +43684 +43685 +43686 +43687 +43688 +43689 +43690 +43691 +43692 +43693 +43694 +43695 +43696 +43697 +43698 +43699 +43700 +43701 +43702 +43703 +43704 +43705 +43706 +43707 +43708 +43709 +43710 +43711 +43712 +43713 +43714 +43715 +43716 +43717 +43718 +43719 +43720 +43721 +43722 +43723 +43724 +43725 +43726 +43727 +43728 +43729 +43730 +43731 +43732 +43733 +43734 +43735 +43736 +43737 +43738 +43739 +43740 +43741 +43742 +43743 +43744 +43745 +43746 +43747 +43748 +43749 +43750 +43751 +43752 +43753 +43754 +43755 +43756 +43757 +43758 +43759 +43760 +43761 +43762 +43763 +43764 +43765 +43766 +43767 +43768 +43769 +43770 +43771 +43772 +43773 +43774 +43775 +43776 +43777 +43778 +43779 +43780 +43781 +43782 +43783 +43784 +43785 +43786 +43787 +43788 +43789 +43790 +43791 +43792 +43793 +43794 +43795 +43796 +43797 +43798 +43799 +43800 +43801 +43802 +43803 +43804 +43805 +43806 +43807 +43808 +43809 +43810 +43811 +43812 +43813 +43814 +43815 +43816 +43817 +43818 +43819 +43820 +43821 +43822 +43823 +43824 +43825 +43826 +43827 +43828 +43829 +43830 +43831 +43832 +43833 +43834 +43835 +43836 +43837 +43838 +43839 +43840 +43841 +43842 +43843 +43844 +43845 +43846 +43847 +43848 +43849 +43850 +43851 +43852 +43853 +43854 +43855 +43856 +43857 +43858 +43859 +43860 +43861 +43862 +43863 +43864 +43865 +43866 +43867 +43868 +43869 +43870 +43871 +43872 +43873 +43874 +43875 +43876 +43877 +43878 +43879 +43880 +43881 +43882 +43883 +43884 +43885 +43886 +43887 +43888 +43889 +43890 +43891 +43892 +43893 +43894 +43895 +43896 +43897 +43898 +43899 +43900 +43901 +43902 +43903 +43904 +43905 +43906 +43907 +43908 +43909 +43910 +43911 +43912 +43913 +43914 +43915 +43916 +43917 +43918 +43919 +43920 +43921 +43922 +43923 +43924 +43925 +43926 +43927 +43928 +43929 +43930 +43931 +43932 +43933 +43934 +43935 +43936 +43937 +43938 +43939 +43940 +43941 +43942 +43943 +43944 +43945 +43946 +43947 +43948 +43949 +43950 +43951 +43952 +43953 +43954 +43955 +43956 +43957 +43958 +43959 +43960 +43961 +43962 +43963 +43964 +43965 +43966 +43967 +43968 +43969 +43970 +43971 +43972 +43973 +43974 +43975 +43976 +43977 +43978 +43979 +43980 +43981 +43982 +43983 +43984 +43985 +43986 +43987 +43988 +43989 +43990 +43991 +43992 +43993 +43994 +43995 +43996 +43997 +43998 +43999 +44000 +44001 +44002 +44003 +44004 +44005 +44006 +44007 +44008 +44009 +44010 +44011 +44012 +44013 +44014 +44015 +44016 +44017 +44018 +44019 +44020 +44021 +44022 +44023 +44024 +44025 +44026 +44027 +44028 +44029 +44030 +44031 +44032 +44033 +44034 +44035 +44036 +44037 +44038 +44039 +44040 +44041 +44042 +44043 +44044 +44045 +44046 +44047 +44048 +44049 +44050 +44051 +44052 +44053 +44054 +44055 +44056 +44057 +44058 +44059 +44060 +44061 +44062 +44063 +44064 +44065 +44066 +44067 +44068 +44069 +44070 +44071 +44072 +44073 +44074 +44075 +44076 +44077 +44078 +44079 +44080 +44081 +44082 +44083 +44084 +44085 +44086 +44087 +44088 +44089 +44090 +44091 +44092 +44093 +44094 +44095 +44096 +44097 +44098 +44099 +44100 +44101 +44102 +44103 +44104 +44105 +44106 +44107 +44108 +44109 +44110 +44111 +44112 +44113 +44114 +44115 +44116 +44117 +44118 +44119 +44120 +44121 +44122 +44123 +44124 +44125 +44126 +44127 +44128 +44129 +44130 +44131 +44132 +44133 +44134 +44135 +44136 +44137 +44138 +44139 +44140 +44141 +44142 +44143 +44144 +44145 +44146 +44147 +44148 +44149 +44150 +44151 +44152 +44153 +44154 +44155 +44156 +44157 +44158 +44159 +44160 +44161 +44162 +44163 +44164 +44165 +44166 +44167 +44168 +44169 +44170 +44171 +44172 +44173 +44174 +44175 +44176 +44177 +44178 +44179 +44180 +44181 +44182 +44183 +44184 +44185 +44186 +44187 +44188 +44189 +44190 +44191 +44192 +44193 +44194 +44195 +44196 +44197 +44198 +44199 +44200 +44201 +44202 +44203 +44204 +44205 +44206 +44207 +44208 +44209 +44210 +44211 +44212 +44213 +44214 +44215 +44216 +44217 +44218 +44219 +44220 +44221 +44222 +44223 +44224 +44225 +44226 +44227 +44228 +44229 +44230 +44231 +44232 +44233 +44234 +44235 +44236 +44237 +44238 +44239 +44240 +44241 +44242 +44243 +44244 +44245 +44246 +44247 +44248 +44249 +44250 +44251 +44252 +44253 +44254 +44255 +44256 +44257 +44258 +44259 +44260 +44261 +44262 +44263 +44264 +44265 +44266 +44267 +44268 +44269 +44270 +44271 +44272 +44273 +44274 +44275 +44276 +44277 +44278 +44279 +44280 +44281 +44282 +44283 +44284 +44285 +44286 +44287 +44288 +44289 +44290 +44291 +44292 +44293 +44294 +44295 +44296 +44297 +44298 +44299 +44300 +44301 +44302 +44303 +44304 +44305 +44306 +44307 +44308 +44309 +44310 +44311 +44312 +44313 +44314 +44315 +44316 +44317 +44318 +44319 +44320 +44321 +44322 +44323 +44324 +44325 +44326 +44327 +44328 +44329 +44330 +44331 +44332 +44333 +44334 +44335 +44336 +44337 +44338 +44339 +44340 +44341 +44342 +44343 +44344 +44345 +44346 +44347 +44348 +44349 +44350 +44351 +44352 +44353 +44354 +44355 +44356 +44357 +44358 +44359 +44360 +44361 +44362 +44363 +44364 +44365 +44366 +44367 +44368 +44369 +44370 +44371 +44372 +44373 +44374 +44375 +44376 +44377 +44378 +44379 +44380 +44381 +44382 +44383 +44384 +44385 +44386 +44387 +44388 +44389 +44390 +44391 +44392 +44393 +44394 +44395 +44396 +44397 +44398 +44399 +44400 +44401 +44402 +44403 +44404 +44405 +44406 +44407 +44408 +44409 +44410 +44411 +44412 +44413 +44414 +44415 +44416 +44417 +44418 +44419 +44420 +44421 +44422 +44423 +44424 +44425 +44426 +44427 +44428 +44429 +44430 +44431 +44432 +44433 +44434 +44435 +44436 +44437 +44438 +44439 +44440 +44441 +44442 +44443 +44444 +44445 +44446 +44447 +44448 +44449 +44450 +44451 +44452 +44453 +44454 +44455 +44456 +44457 +44458 +44459 +44460 +44461 +44462 +44463 +44464 +44465 +44466 +44467 +44468 +44469 +44470 +44471 +44472 +44473 +44474 +44475 +44476 +44477 +44478 +44479 +44480 +44481 +44482 +44483 +44484 +44485 +44486 +44487 +44488 +44489 +44490 +44491 +44492 +44493 +44494 +44495 +44496 +44497 +44498 +44499 +44500 +44501 +44502 +44503 +44504 +44505 +44506 +44507 +44508 +44509 +44510 +44511 +44512 +44513 +44514 +44515 +44516 +44517 +44518 +44519 +44520 +44521 +44522 +44523 +44524 +44525 +44526 +44527 +44528 +44529 +44530 +44531 +44532 +44533 +44534 +44535 +44536 +44537 +44538 +44539 +44540 +44541 +44542 +44543 +44544 +44545 +44546 +44547 +44548 +44549 +44550 +44551 +44552 +44553 +44554 +44555 +44556 +44557 +44558 +44559 +44560 +44561 +44562 +44563 +44564 +44565 +44566 +44567 +44568 +44569 +44570 +44571 +44572 +44573 +44574 +44575 +44576 +44577 +44578 +44579 +44580 +44581 +44582 +44583 +44584 +44585 +44586 +44587 +44588 +44589 +44590 +44591 +44592 +44593 +44594 +44595 +44596 +44597 +44598 +44599 +44600 +44601 +44602 +44603 +44604 +44605 +44606 +44607 +44608 +44609 +44610 +44611 +44612 +44613 +44614 +44615 +44616 +44617 +44618 +44619 +44620 +44621 +44622 +44623 +44624 +44625 +44626 +44627 +44628 +44629 +44630 +44631 +44632 +44633 +44634 +44635 +44636 +44637 +44638 +44639 +44640 +44641 +44642 +44643 +44644 +44645 +44646 +44647 +44648 +44649 +44650 +44651 +44652 +44653 +44654 +44655 +44656 +44657 +44658 +44659 +44660 +44661 +44662 +44663 +44664 +44665 +44666 +44667 +44668 +44669 +44670 +44671 +44672 +44673 +44674 +44675 +44676 +44677 +44678 +44679 +44680 +44681 +44682 +44683 +44684 +44685 +44686 +44687 +44688 +44689 +44690 +44691 +44692 +44693 +44694 +44695 +44696 +44697 +44698 +44699 +44700 +44701 +44702 +44703 +44704 +44705 +44706 +44707 +44708 +44709 +44710 +44711 +44712 +44713 +44714 +44715 +44716 +44717 +44718 +44719 +44720 +44721 +44722 +44723 +44724 +44725 +44726 +44727 +44728 +44729 +44730 +44731 +44732 +44733 +44734 +44735 +44736 +44737 +44738 +44739 +44740 +44741 +44742 +44743 +44744 +44745 +44746 +44747 +44748 +44749 +44750 +44751 +44752 +44753 +44754 +44755 +44756 +44757 +44758 +44759 +44760 +44761 +44762 +44763 +44764 +44765 +44766 +44767 +44768 +44769 +44770 +44771 +44772 +44773 +44774 +44775 +44776 +44777 +44778 +44779 +44780 +44781 +44782 +44783 +44784 +44785 +44786 +44787 +44788 +44789 +44790 +44791 +44792 +44793 +44794 +44795 +44796 +44797 +44798 +44799 +44800 +44801 +44802 +44803 +44804 +44805 +44806 +44807 +44808 +44809 +44810 +44811 +44812 +44813 +44814 +44815 +44816 +44817 +44818 +44819 +44820 +44821 +44822 +44823 +44824 +44825 +44826 +44827 +44828 +44829 +44830 +44831 +44832 +44833 +44834 +44835 +44836 +44837 +44838 +44839 +44840 +44841 +44842 +44843 +44844 +44845 +44846 +44847 +44848 +44849 +44850 +44851 +44852 +44853 +44854 +44855 +44856 +44857 +44858 +44859 +44860 +44861 +44862 +44863 +44864 +44865 +44866 +44867 +44868 +44869 +44870 +44871 +44872 +44873 +44874 +44875 +44876 +44877 +44878 +44879 +44880 +44881 +44882 +44883 +44884 +44885 +44886 +44887 +44888 +44889 +44890 +44891 +44892 +44893 +44894 +44895 +44896 +44897 +44898 +44899 +44900 +44901 +44902 +44903 +44904 +44905 +44906 +44907 +44908 +44909 +44910 +44911 +44912 +44913 +44914 +44915 +44916 +44917 +44918 +44919 +44920 +44921 +44922 +44923 +44924 +44925 +44926 +44927 +44928 +44929 +44930 +44931 +44932 +44933 +44934 +44935 +44936 +44937 +44938 +44939 +44940 +44941 +44942 +44943 +44944 +44945 +44946 +44947 +44948 +44949 +44950 +44951 +44952 +44953 +44954 +44955 +44956 +44957 +44958 +44959 +44960 +44961 +44962 +44963 +44964 +44965 +44966 +44967 +44968 +44969 +44970 +44971 +44972 +44973 +44974 +44975 +44976 +44977 +44978 +44979 +44980 +44981 +44982 +44983 +44984 +44985 +44986 +44987 +44988 +44989 +44990 +44991 +44992 +44993 +44994 +44995 +44996 +44997 +44998 +44999 +45000 +45001 +45002 +45003 +45004 +45005 +45006 +45007 +45008 +45009 +45010 +45011 +45012 +45013 +45014 +45015 +45016 +45017 +45018 +45019 +45020 +45021 +45022 +45023 +45024 +45025 +45026 +45027 +45028 +45029 +45030 +45031 +45032 +45033 +45034 +45035 +45036 +45037 +45038 +45039 +45040 +45041 +45042 +45043 +45044 +45045 +45046 +45047 +45048 +45049 +45050 +45051 +45052 +45053 +45054 +45055 +45056 +45057 +45058 +45059 +45060 +45061 +45062 +45063 +45064 +45065 +45066 +45067 +45068 +45069 +45070 +45071 +45072 +45073 +45074 +45075 +45076 +45077 +45078 +45079 +45080 +45081 +45082 +45083 +45084 +45085 +45086 +45087 +45088 +45089 +45090 +45091 +45092 +45093 +45094 +45095 +45096 +45097 +45098 +45099 +45100 +45101 +45102 +45103 +45104 +45105 +45106 +45107 +45108 +45109 +45110 +45111 +45112 +45113 +45114 +45115 +45116 +45117 +45118 +45119 +45120 +45121 +45122 +45123 +45124 +45125 +45126 +45127 +45128 +45129 +45130 +45131 +45132 +45133 +45134 +45135 +45136 +45137 +45138 +45139 +45140 +45141 +45142 +45143 +45144 +45145 +45146 +45147 +45148 +45149 +45150 +45151 +45152 +45153 +45154 +45155 +45156 +45157 +45158 +45159 +45160 +45161 +45162 +45163 +45164 +45165 +45166 +45167 +45168 +45169 +45170 +45171 +45172 +45173 +45174 +45175 +45176 +45177 +45178 +45179 +45180 +45181 +45182 +45183 +45184 +45185 +45186 +45187 +45188 +45189 +45190 +45191 +45192 +45193 +45194 +45195 +45196 +45197 +45198 +45199 +45200 +45201 +45202 +45203 +45204 +45205 +45206 +45207 +45208 +45209 +45210 +45211 +45212 +45213 +45214 +45215 +45216 +45217 +45218 +45219 +45220 +45221 +45222 +45223 +45224 +45225 +45226 +45227 +45228 +45229 +45230 +45231 +45232 +45233 +45234 +45235 +45236 +45237 +45238 +45239 +45240 +45241 +45242 +45243 +45244 +45245 +45246 +45247 +45248 +45249 +45250 +45251 +45252 +45253 +45254 +45255 +45256 +45257 +45258 +45259 +45260 +45261 +45262 +45263 +45264 +45265 +45266 +45267 +45268 +45269 +45270 +45271 +45272 +45273 +45274 +45275 +45276 +45277 +45278 +45279 +45280 +45281 +45282 +45283 +45284 +45285 +45286 +45287 +45288 +45289 +45290 +45291 +45292 +45293 +45294 +45295 +45296 +45297 +45298 +45299 +45300 +45301 +45302 +45303 +45304 +45305 +45306 +45307 +45308 +45309 +45310 +45311 +45312 +45313 +45314 +45315 +45316 +45317 +45318 +45319 +45320 +45321 +45322 +45323 +45324 +45325 +45326 +45327 +45328 +45329 +45330 +45331 +45332 +45333 +45334 +45335 +45336 +45337 +45338 +45339 +45340 +45341 +45342 +45343 +45344 +45345 +45346 +45347 +45348 +45349 +45350 +45351 +45352 +45353 +45354 +45355 +45356 +45357 +45358 +45359 +45360 +45361 +45362 +45363 +45364 +45365 +45366 +45367 +45368 +45369 +45370 +45371 +45372 +45373 +45374 +45375 +45376 +45377 +45378 +45379 +45380 +45381 +45382 +45383 +45384 +45385 +45386 +45387 +45388 +45389 +45390 +45391 +45392 +45393 +45394 +45395 +45396 +45397 +45398 +45399 +45400 +45401 +45402 +45403 +45404 +45405 +45406 +45407 +45408 +45409 +45410 +45411 +45412 +45413 +45414 +45415 +45416 +45417 +45418 +45419 +45420 +45421 +45422 +45423 +45424 +45425 +45426 +45427 +45428 +45429 +45430 +45431 +45432 +45433 +45434 +45435 +45436 +45437 +45438 +45439 +45440 +45441 +45442 +45443 +45444 +45445 +45446 +45447 +45448 +45449 +45450 +45451 +45452 +45453 +45454 +45455 +45456 +45457 +45458 +45459 +45460 +45461 +45462 +45463 +45464 +45465 +45466 +45467 +45468 +45469 +45470 +45471 +45472 +45473 +45474 +45475 +45476 +45477 +45478 +45479 +45480 +45481 +45482 +45483 +45484 +45485 +45486 +45487 +45488 +45489 +45490 +45491 +45492 +45493 +45494 +45495 +45496 +45497 +45498 +45499 +45500 +45501 +45502 +45503 +45504 +45505 +45506 +45507 +45508 +45509 +45510 +45511 +45512 +45513 +45514 +45515 +45516 +45517 +45518 +45519 +45520 +45521 +45522 +45523 +45524 +45525 +45526 +45527 +45528 +45529 +45530 +45531 +45532 +45533 +45534 +45535 +45536 +45537 +45538 +45539 +45540 +45541 +45542 +45543 +45544 +45545 +45546 +45547 +45548 +45549 +45550 +45551 +45552 +45553 +45554 +45555 +45556 +45557 +45558 +45559 +45560 +45561 +45562 +45563 +45564 +45565 +45566 +45567 +45568 +45569 +45570 +45571 +45572 +45573 +45574 +45575 +45576 +45577 +45578 +45579 +45580 +45581 +45582 +45583 +45584 +45585 +45586 +45587 +45588 +45589 +45590 +45591 +45592 +45593 +45594 +45595 +45596 +45597 +45598 +45599 +45600 +45601 +45602 +45603 +45604 +45605 +45606 +45607 +45608 +45609 +45610 +45611 +45612 +45613 +45614 +45615 +45616 +45617 +45618 +45619 +45620 +45621 +45622 +45623 +45624 +45625 +45626 +45627 +45628 +45629 +45630 +45631 +45632 +45633 +45634 +45635 +45636 +45637 +45638 +45639 +45640 +45641 +45642 +45643 +45644 +45645 +45646 +45647 +45648 +45649 +45650 +45651 +45652 +45653 +45654 +45655 +45656 +45657 +45658 +45659 +45660 +45661 +45662 +45663 +45664 +45665 +45666 +45667 +45668 +45669 +45670 +45671 +45672 +45673 +45674 +45675 +45676 +45677 +45678 +45679 +45680 +45681 +45682 +45683 +45684 +45685 +45686 +45687 +45688 +45689 +45690 +45691 +45692 +45693 +45694 +45695 +45696 +45697 +45698 +45699 +45700 +45701 +45702 +45703 +45704 +45705 +45706 +45707 +45708 +45709 +45710 +45711 +45712 +45713 +45714 +45715 +45716 +45717 +45718 +45719 +45720 +45721 +45722 +45723 +45724 +45725 +45726 +45727 +45728 +45729 +45730 +45731 +45732 +45733 +45734 +45735 +45736 +45737 +45738 +45739 +45740 +45741 +45742 +45743 +45744 +45745 +45746 +45747 +45748 +45749 +45750 +45751 +45752 +45753 +45754 +45755 +45756 +45757 +45758 +45759 +45760 +45761 +45762 +45763 +45764 +45765 +45766 +45767 +45768 +45769 +45770 +45771 +45772 +45773 +45774 +45775 +45776 +45777 +45778 +45779 +45780 +45781 +45782 +45783 +45784 +45785 +45786 +45787 +45788 +45789 +45790 +45791 +45792 +45793 +45794 +45795 +45796 +45797 +45798 +45799 +45800 +45801 +45802 +45803 +45804 +45805 +45806 +45807 +45808 +45809 +45810 +45811 +45812 +45813 +45814 +45815 +45816 +45817 +45818 +45819 +45820 +45821 +45822 +45823 +45824 +45825 +45826 +45827 +45828 +45829 +45830 +45831 +45832 +45833 +45834 +45835 +45836 +45837 +45838 +45839 +45840 +45841 +45842 +45843 +45844 +45845 +45846 +45847 +45848 +45849 +45850 +45851 +45852 +45853 +45854 +45855 +45856 +45857 +45858 +45859 +45860 +45861 +45862 +45863 +45864 +45865 +45866 +45867 +45868 +45869 +45870 +45871 +45872 +45873 +45874 +45875 +45876 +45877 +45878 +45879 +45880 +45881 +45882 +45883 +45884 +45885 +45886 +45887 +45888 +45889 +45890 +45891 +45892 +45893 +45894 +45895 +45896 +45897 +45898 +45899 +45900 +45901 +45902 +45903 +45904 +45905 +45906 +45907 +45908 +45909 +45910 +45911 +45912 +45913 +45914 +45915 +45916 +45917 +45918 +45919 +45920 +45921 +45922 +45923 +45924 +45925 +45926 +45927 +45928 +45929 +45930 +45931 +45932 +45933 +45934 +45935 +45936 +45937 +45938 +45939 +45940 +45941 +45942 +45943 +45944 +45945 +45946 +45947 +45948 +45949 +45950 +45951 +45952 +45953 +45954 +45955 +45956 +45957 +45958 +45959 +45960 +45961 +45962 +45963 +45964 +45965 +45966 +45967 +45968 +45969 +45970 +45971 +45972 +45973 +45974 +45975 +45976 +45977 +45978 +45979 +45980 +45981 +45982 +45983 +45984 +45985 +45986 +45987 +45988 +45989 +45990 +45991 +45992 +45993 +45994 +45995 +45996 +45997 +45998 +45999 +46000 +46001 +46002 +46003 +46004 +46005 +46006 +46007 +46008 +46009 +46010 +46011 +46012 +46013 +46014 +46015 +46016 +46017 +46018 +46019 +46020 +46021 +46022 +46023 +46024 +46025 +46026 +46027 +46028 +46029 +46030 +46031 +46032 +46033 +46034 +46035 +46036 +46037 +46038 +46039 +46040 +46041 +46042 +46043 +46044 +46045 +46046 +46047 +46048 +46049 +46050 +46051 +46052 +46053 +46054 +46055 +46056 +46057 +46058 +46059 +46060 +46061 +46062 +46063 +46064 +46065 +46066 +46067 +46068 +46069 +46070 +46071 +46072 +46073 +46074 +46075 +46076 +46077 +46078 +46079 +46080 +46081 +46082 +46083 +46084 +46085 +46086 +46087 +46088 +46089 +46090 +46091 +46092 +46093 +46094 +46095 +46096 +46097 +46098 +46099 +46100 +46101 +46102 +46103 +46104 +46105 +46106 +46107 +46108 +46109 +46110 +46111 +46112 +46113 +46114 +46115 +46116 +46117 +46118 +46119 +46120 +46121 +46122 +46123 +46124 +46125 +46126 +46127 +46128 +46129 +46130 +46131 +46132 +46133 +46134 +46135 +46136 +46137 +46138 +46139 +46140 +46141 +46142 +46143 +46144 +46145 +46146 +46147 +46148 +46149 +46150 +46151 +46152 +46153 +46154 +46155 +46156 +46157 +46158 +46159 +46160 +46161 +46162 +46163 +46164 +46165 +46166 +46167 +46168 +46169 +46170 +46171 +46172 +46173 +46174 +46175 +46176 +46177 +46178 +46179 +46180 +46181 +46182 +46183 +46184 +46185 +46186 +46187 +46188 +46189 +46190 +46191 +46192 +46193 +46194 +46195 +46196 +46197 +46198 +46199 +46200 +46201 +46202 +46203 +46204 +46205 +46206 +46207 +46208 +46209 +46210 +46211 +46212 +46213 +46214 +46215 +46216 +46217 +46218 +46219 +46220 +46221 +46222 +46223 +46224 +46225 +46226 +46227 +46228 +46229 +46230 +46231 +46232 +46233 +46234 +46235 +46236 +46237 +46238 +46239 +46240 +46241 +46242 +46243 +46244 +46245 +46246 +46247 +46248 +46249 +46250 +46251 +46252 +46253 +46254 +46255 +46256 +46257 +46258 +46259 +46260 +46261 +46262 +46263 +46264 +46265 +46266 +46267 +46268 +46269 +46270 +46271 +46272 +46273 +46274 +46275 +46276 +46277 +46278 +46279 +46280 +46281 +46282 +46283 +46284 +46285 +46286 +46287 +46288 +46289 +46290 +46291 +46292 +46293 +46294 +46295 +46296 +46297 +46298 +46299 +46300 +46301 +46302 +46303 +46304 +46305 +46306 +46307 +46308 +46309 +46310 +46311 +46312 +46313 +46314 +46315 +46316 +46317 +46318 +46319 +46320 +46321 +46322 +46323 +46324 +46325 +46326 +46327 +46328 +46329 +46330 +46331 +46332 +46333 +46334 +46335 +46336 +46337 +46338 +46339 +46340 +46341 +46342 +46343 +46344 +46345 +46346 +46347 +46348 +46349 +46350 +46351 +46352 +46353 +46354 +46355 +46356 +46357 +46358 +46359 +46360 +46361 +46362 +46363 +46364 +46365 +46366 +46367 +46368 +46369 +46370 +46371 +46372 +46373 +46374 +46375 +46376 +46377 +46378 +46379 +46380 +46381 +46382 +46383 +46384 +46385 +46386 +46387 +46388 +46389 +46390 +46391 +46392 +46393 +46394 +46395 +46396 +46397 +46398 +46399 +46400 +46401 +46402 +46403 +46404 +46405 +46406 +46407 +46408 +46409 +46410 +46411 +46412 +46413 +46414 +46415 +46416 +46417 +46418 +46419 +46420 +46421 +46422 +46423 +46424 +46425 +46426 +46427 +46428 +46429 +46430 +46431 +46432 +46433 +46434 +46435 +46436 +46437 +46438 +46439 +46440 +46441 +46442 +46443 +46444 +46445 +46446 +46447 +46448 +46449 +46450 +46451 +46452 +46453 +46454 +46455 +46456 +46457 +46458 +46459 +46460 +46461 +46462 +46463 +46464 +46465 +46466 +46467 +46468 +46469 +46470 +46471 +46472 +46473 +46474 +46475 +46476 +46477 +46478 +46479 +46480 +46481 +46482 +46483 +46484 +46485 +46486 +46487 +46488 +46489 +46490 +46491 +46492 +46493 +46494 +46495 +46496 +46497 +46498 +46499 +46500 +46501 +46502 +46503 +46504 +46505 +46506 +46507 +46508 +46509 +46510 +46511 +46512 +46513 +46514 +46515 +46516 +46517 +46518 +46519 +46520 +46521 +46522 +46523 +46524 +46525 +46526 +46527 +46528 +46529 +46530 +46531 +46532 +46533 +46534 +46535 +46536 +46537 +46538 +46539 +46540 +46541 +46542 +46543 +46544 +46545 +46546 +46547 +46548 +46549 +46550 +46551 +46552 +46553 +46554 +46555 +46556 +46557 +46558 +46559 +46560 +46561 +46562 +46563 +46564 +46565 +46566 +46567 +46568 +46569 +46570 +46571 +46572 +46573 +46574 +46575 +46576 +46577 +46578 +46579 +46580 +46581 +46582 +46583 +46584 +46585 +46586 +46587 +46588 +46589 +46590 +46591 +46592 +46593 +46594 +46595 +46596 +46597 +46598 +46599 +46600 +46601 +46602 +46603 +46604 +46605 +46606 +46607 +46608 +46609 +46610 +46611 +46612 +46613 +46614 +46615 +46616 +46617 +46618 +46619 +46620 +46621 +46622 +46623 +46624 +46625 +46626 +46627 +46628 +46629 +46630 +46631 +46632 +46633 +46634 +46635 +46636 +46637 +46638 +46639 +46640 +46641 +46642 +46643 +46644 +46645 +46646 +46647 +46648 +46649 +46650 +46651 +46652 +46653 +46654 +46655 +46656 +46657 +46658 +46659 +46660 +46661 +46662 +46663 +46664 +46665 +46666 +46667 +46668 +46669 +46670 +46671 +46672 +46673 +46674 +46675 +46676 +46677 +46678 +46679 +46680 +46681 +46682 +46683 +46684 +46685 +46686 +46687 +46688 +46689 +46690 +46691 +46692 +46693 +46694 +46695 +46696 +46697 +46698 +46699 +46700 +46701 +46702 +46703 +46704 +46705 +46706 +46707 +46708 +46709 +46710 +46711 +46712 +46713 +46714 +46715 +46716 +46717 +46718 +46719 +46720 +46721 +46722 +46723 +46724 +46725 +46726 +46727 +46728 +46729 +46730 +46731 +46732 +46733 +46734 +46735 +46736 +46737 +46738 +46739 +46740 +46741 +46742 +46743 +46744 +46745 +46746 +46747 +46748 +46749 +46750 +46751 +46752 +46753 +46754 +46755 +46756 +46757 +46758 +46759 +46760 +46761 +46762 +46763 +46764 +46765 +46766 +46767 +46768 +46769 +46770 +46771 +46772 +46773 +46774 +46775 +46776 +46777 +46778 +46779 +46780 +46781 +46782 +46783 +46784 +46785 +46786 +46787 +46788 +46789 +46790 +46791 +46792 +46793 +46794 +46795 +46796 +46797 +46798 +46799 +46800 +46801 +46802 +46803 +46804 +46805 +46806 +46807 +46808 +46809 +46810 +46811 +46812 +46813 +46814 +46815 +46816 +46817 +46818 +46819 +46820 +46821 +46822 +46823 +46824 +46825 +46826 +46827 +46828 +46829 +46830 +46831 +46832 +46833 +46834 +46835 +46836 +46837 +46838 +46839 +46840 +46841 +46842 +46843 +46844 +46845 +46846 +46847 +46848 +46849 +46850 +46851 +46852 +46853 +46854 +46855 +46856 +46857 +46858 +46859 +46860 +46861 +46862 +46863 +46864 +46865 +46866 +46867 +46868 +46869 +46870 +46871 +46872 +46873 +46874 +46875 +46876 +46877 +46878 +46879 +46880 +46881 +46882 +46883 +46884 +46885 +46886 +46887 +46888 +46889 +46890 +46891 +46892 +46893 +46894 +46895 +46896 +46897 +46898 +46899 +46900 +46901 +46902 +46903 +46904 +46905 +46906 +46907 +46908 +46909 +46910 +46911 +46912 +46913 +46914 +46915 +46916 +46917 +46918 +46919 +46920 +46921 +46922 +46923 +46924 +46925 +46926 +46927 +46928 +46929 +46930 +46931 +46932 +46933 +46934 +46935 +46936 +46937 +46938 +46939 +46940 +46941 +46942 +46943 +46944 +46945 +46946 +46947 +46948 +46949 +46950 +46951 +46952 +46953 +46954 +46955 +46956 +46957 +46958 +46959 +46960 +46961 +46962 +46963 +46964 +46965 +46966 +46967 +46968 +46969 +46970 +46971 +46972 +46973 +46974 +46975 +46976 +46977 +46978 +46979 +46980 +46981 +46982 +46983 +46984 +46985 +46986 +46987 +46988 +46989 +46990 +46991 +46992 +46993 +46994 +46995 +46996 +46997 +46998 +46999 +47000 +47001 +47002 +47003 +47004 +47005 +47006 +47007 +47008 +47009 +47010 +47011 +47012 +47013 +47014 +47015 +47016 +47017 +47018 +47019 +47020 +47021 +47022 +47023 +47024 +47025 +47026 +47027 +47028 +47029 +47030 +47031 +47032 +47033 +47034 +47035 +47036 +47037 +47038 +47039 +47040 +47041 +47042 +47043 +47044 +47045 +47046 +47047 +47048 +47049 +47050 +47051 +47052 +47053 +47054 +47055 +47056 +47057 +47058 +47059 +47060 +47061 +47062 +47063 +47064 +47065 +47066 +47067 +47068 +47069 +47070 +47071 +47072 +47073 +47074 +47075 +47076 +47077 +47078 +47079 +47080 +47081 +47082 +47083 +47084 +47085 +47086 +47087 +47088 +47089 +47090 +47091 +47092 +47093 +47094 +47095 +47096 +47097 +47098 +47099 +47100 +47101 +47102 +47103 +47104 +47105 +47106 +47107 +47108 +47109 +47110 +47111 +47112 +47113 +47114 +47115 +47116 +47117 +47118 +47119 +47120 +47121 +47122 +47123 +47124 +47125 +47126 +47127 +47128 +47129 +47130 +47131 +47132 +47133 +47134 +47135 +47136 +47137 +47138 +47139 +47140 +47141 +47142 +47143 +47144 +47145 +47146 +47147 +47148 +47149 +47150 +47151 +47152 +47153 +47154 +47155 +47156 +47157 +47158 +47159 +47160 +47161 +47162 +47163 +47164 +47165 +47166 +47167 +47168 +47169 +47170 +47171 +47172 +47173 +47174 +47175 +47176 +47177 +47178 +47179 +47180 +47181 +47182 +47183 +47184 +47185 +47186 +47187 +47188 +47189 +47190 +47191 +47192 +47193 +47194 +47195 +47196 +47197 +47198 +47199 +47200 +47201 +47202 +47203 +47204 +47205 +47206 +47207 +47208 +47209 +47210 +47211 +47212 +47213 +47214 +47215 +47216 +47217 +47218 +47219 +47220 +47221 +47222 +47223 +47224 +47225 +47226 +47227 +47228 +47229 +47230 +47231 +47232 +47233 +47234 +47235 +47236 +47237 +47238 +47239 +47240 +47241 +47242 +47243 +47244 +47245 +47246 +47247 +47248 +47249 +47250 +47251 +47252 +47253 +47254 +47255 +47256 +47257 +47258 +47259 +47260 +47261 +47262 +47263 +47264 +47265 +47266 +47267 +47268 +47269 +47270 +47271 +47272 +47273 +47274 +47275 +47276 +47277 +47278 +47279 +47280 +47281 +47282 +47283 +47284 +47285 +47286 +47287 +47288 +47289 +47290 +47291 +47292 +47293 +47294 +47295 +47296 +47297 +47298 +47299 +47300 +47301 +47302 +47303 +47304 +47305 +47306 +47307 +47308 +47309 +47310 +47311 +47312 +47313 +47314 +47315 +47316 +47317 +47318 +47319 +47320 +47321 +47322 +47323 +47324 +47325 +47326 +47327 +47328 +47329 +47330 +47331 +47332 +47333 +47334 +47335 +47336 +47337 +47338 +47339 +47340 +47341 +47342 +47343 +47344 +47345 +47346 +47347 +47348 +47349 +47350 +47351 +47352 +47353 +47354 +47355 +47356 +47357 +47358 +47359 +47360 +47361 +47362 +47363 +47364 +47365 +47366 +47367 +47368 +47369 +47370 +47371 +47372 +47373 +47374 +47375 +47376 +47377 +47378 +47379 +47380 +47381 +47382 +47383 +47384 +47385 +47386 +47387 +47388 +47389 +47390 +47391 +47392 +47393 +47394 +47395 +47396 +47397 +47398 +47399 +47400 +47401 +47402 +47403 +47404 +47405 +47406 +47407 +47408 +47409 +47410 +47411 +47412 +47413 +47414 +47415 +47416 +47417 +47418 +47419 +47420 +47421 +47422 +47423 +47424 +47425 +47426 +47427 +47428 +47429 +47430 +47431 +47432 +47433 +47434 +47435 +47436 +47437 +47438 +47439 +47440 +47441 +47442 +47443 +47444 +47445 +47446 +47447 +47448 +47449 +47450 +47451 +47452 +47453 +47454 +47455 +47456 +47457 +47458 +47459 +47460 +47461 +47462 +47463 +47464 +47465 +47466 +47467 +47468 +47469 +47470 +47471 +47472 +47473 +47474 +47475 +47476 +47477 +47478 +47479 +47480 +47481 +47482 +47483 +47484 +47485 +47486 +47487 +47488 +47489 +47490 +47491 +47492 +47493 +47494 +47495 +47496 +47497 +47498 +47499 +47500 +47501 +47502 +47503 +47504 +47505 +47506 +47507 +47508 +47509 +47510 +47511 +47512 +47513 +47514 +47515 +47516 +47517 +47518 +47519 +47520 +47521 +47522 +47523 +47524 +47525 +47526 +47527 +47528 +47529 +47530 +47531 +47532 +47533 +47534 +47535 +47536 +47537 +47538 +47539 +47540 +47541 +47542 +47543 +47544 +47545 +47546 +47547 +47548 +47549 +47550 +47551 +47552 +47553 +47554 +47555 +47556 +47557 +47558 +47559 +47560 +47561 +47562 +47563 +47564 +47565 +47566 +47567 +47568 +47569 +47570 +47571 +47572 +47573 +47574 +47575 +47576 +47577 +47578 +47579 +47580 +47581 +47582 +47583 +47584 +47585 +47586 +47587 +47588 +47589 +47590 +47591 +47592 +47593 +47594 +47595 +47596 +47597 +47598 +47599 +47600 +47601 +47602 +47603 +47604 +47605 +47606 +47607 +47608 +47609 +47610 +47611 +47612 +47613 +47614 +47615 +47616 +47617 +47618 +47619 +47620 +47621 +47622 +47623 +47624 +47625 +47626 +47627 +47628 +47629 +47630 +47631 +47632 +47633 +47634 +47635 +47636 +47637 +47638 +47639 +47640 +47641 +47642 +47643 +47644 +47645 +47646 +47647 +47648 +47649 +47650 +47651 +47652 +47653 +47654 +47655 +47656 +47657 +47658 +47659 +47660 +47661 +47662 +47663 +47664 +47665 +47666 +47667 +47668 +47669 +47670 +47671 +47672 +47673 +47674 +47675 +47676 +47677 +47678 +47679 +47680 +47681 +47682 +47683 +47684 +47685 +47686 +47687 +47688 +47689 +47690 +47691 +47692 +47693 +47694 +47695 +47696 +47697 +47698 +47699 +47700 +47701 +47702 +47703 +47704 +47705 +47706 +47707 +47708 +47709 +47710 +47711 +47712 +47713 +47714 +47715 +47716 +47717 +47718 +47719 +47720 +47721 +47722 +47723 +47724 +47725 +47726 +47727 +47728 +47729 +47730 +47731 +47732 +47733 +47734 +47735 +47736 +47737 +47738 +47739 +47740 +47741 +47742 +47743 +47744 +47745 +47746 +47747 +47748 +47749 +47750 +47751 +47752 +47753 +47754 +47755 +47756 +47757 +47758 +47759 +47760 +47761 +47762 +47763 +47764 +47765 +47766 +47767 +47768 +47769 +47770 +47771 +47772 +47773 +47774 +47775 +47776 +47777 +47778 +47779 +47780 +47781 +47782 +47783 +47784 +47785 +47786 +47787 +47788 +47789 +47790 +47791 +47792 +47793 +47794 +47795 +47796 +47797 +47798 +47799 +47800 +47801 +47802 +47803 +47804 +47805 +47806 +47807 +47808 +47809 +47810 +47811 +47812 +47813 +47814 +47815 +47816 +47817 +47818 +47819 +47820 +47821 +47822 +47823 +47824 +47825 +47826 +47827 +47828 +47829 +47830 +47831 +47832 +47833 +47834 +47835 +47836 +47837 +47838 +47839 +47840 +47841 +47842 +47843 +47844 +47845 +47846 +47847 +47848 +47849 +47850 +47851 +47852 +47853 +47854 +47855 +47856 +47857 +47858 +47859 +47860 +47861 +47862 +47863 +47864 +47865 +47866 +47867 +47868 +47869 +47870 +47871 +47872 +47873 +47874 +47875 +47876 +47877 +47878 +47879 +47880 +47881 +47882 +47883 +47884 +47885 +47886 +47887 +47888 +47889 +47890 +47891 +47892 +47893 +47894 +47895 +47896 +47897 +47898 +47899 +47900 +47901 +47902 +47903 +47904 +47905 +47906 +47907 +47908 +47909 +47910 +47911 +47912 +47913 +47914 +47915 +47916 +47917 +47918 +47919 +47920 +47921 +47922 +47923 +47924 +47925 +47926 +47927 +47928 +47929 +47930 +47931 +47932 +47933 +47934 +47935 +47936 +47937 +47938 +47939 +47940 +47941 +47942 +47943 +47944 +47945 +47946 +47947 +47948 +47949 +47950 +47951 +47952 +47953 +47954 +47955 +47956 +47957 +47958 +47959 +47960 +47961 +47962 +47963 +47964 +47965 +47966 +47967 +47968 +47969 +47970 +47971 +47972 +47973 +47974 +47975 +47976 +47977 +47978 +47979 +47980 +47981 +47982 +47983 +47984 +47985 +47986 +47987 +47988 +47989 +47990 +47991 +47992 +47993 +47994 +47995 +47996 +47997 +47998 +47999 +48000 +48001 +48002 +48003 +48004 +48005 +48006 +48007 +48008 +48009 +48010 +48011 +48012 +48013 +48014 +48015 +48016 +48017 +48018 +48019 +48020 +48021 +48022 +48023 +48024 +48025 +48026 +48027 +48028 +48029 +48030 +48031 +48032 +48033 +48034 +48035 +48036 +48037 +48038 +48039 +48040 +48041 +48042 +48043 +48044 +48045 +48046 +48047 +48048 +48049 +48050 +48051 +48052 +48053 +48054 +48055 +48056 +48057 +48058 +48059 +48060 +48061 +48062 +48063 +48064 +48065 +48066 +48067 +48068 +48069 +48070 +48071 +48072 +48073 +48074 +48075 +48076 +48077 +48078 +48079 +48080 +48081 +48082 +48083 +48084 +48085 +48086 +48087 +48088 +48089 +48090 +48091 +48092 +48093 +48094 +48095 +48096 +48097 +48098 +48099 +48100 +48101 +48102 +48103 +48104 +48105 +48106 +48107 +48108 +48109 +48110 +48111 +48112 +48113 +48114 +48115 +48116 +48117 +48118 +48119 +48120 +48121 +48122 +48123 +48124 +48125 +48126 +48127 +48128 +48129 +48130 +48131 +48132 +48133 +48134 +48135 +48136 +48137 +48138 +48139 +48140 +48141 +48142 +48143 +48144 +48145 +48146 +48147 +48148 +48149 +48150 +48151 +48152 +48153 +48154 +48155 +48156 +48157 +48158 +48159 +48160 +48161 +48162 +48163 +48164 +48165 +48166 +48167 +48168 +48169 +48170 +48171 +48172 +48173 +48174 +48175 +48176 +48177 +48178 +48179 +48180 +48181 +48182 +48183 +48184 +48185 +48186 +48187 +48188 +48189 +48190 +48191 +48192 +48193 +48194 +48195 +48196 +48197 +48198 +48199 +48200 +48201 +48202 +48203 +48204 +48205 +48206 +48207 +48208 +48209 +48210 +48211 +48212 +48213 +48214 +48215 +48216 +48217 +48218 +48219 +48220 +48221 +48222 +48223 +48224 +48225 +48226 +48227 +48228 +48229 +48230 +48231 +48232 +48233 +48234 +48235 +48236 +48237 +48238 +48239 +48240 +48241 +48242 +48243 +48244 +48245 +48246 +48247 +48248 +48249 +48250 +48251 +48252 +48253 +48254 +48255 +48256 +48257 +48258 +48259 +48260 +48261 +48262 +48263 +48264 +48265 +48266 +48267 +48268 +48269 +48270 +48271 +48272 +48273 +48274 +48275 +48276 +48277 +48278 +48279 +48280 +48281 +48282 +48283 +48284 +48285 +48286 +48287 +48288 +48289 +48290 +48291 +48292 +48293 +48294 +48295 +48296 +48297 +48298 +48299 +48300 +48301 +48302 +48303 +48304 +48305 +48306 +48307 +48308 +48309 +48310 +48311 +48312 +48313 +48314 +48315 +48316 +48317 +48318 +48319 +48320 +48321 +48322 +48323 +48324 +48325 +48326 +48327 +48328 +48329 +48330 +48331 +48332 +48333 +48334 +48335 +48336 +48337 +48338 +48339 +48340 +48341 +48342 +48343 +48344 +48345 +48346 +48347 +48348 +48349 +48350 +48351 +48352 +48353 +48354 +48355 +48356 +48357 +48358 +48359 +48360 +48361 +48362 +48363 +48364 +48365 +48366 +48367 +48368 +48369 +48370 +48371 +48372 +48373 +48374 +48375 +48376 +48377 +48378 +48379 +48380 +48381 +48382 +48383 +48384 +48385 +48386 +48387 +48388 +48389 +48390 +48391 +48392 +48393 +48394 +48395 +48396 +48397 +48398 +48399 +48400 +48401 +48402 +48403 +48404 +48405 +48406 +48407 +48408 +48409 +48410 +48411 +48412 +48413 +48414 +48415 +48416 +48417 +48418 +48419 +48420 +48421 +48422 +48423 +48424 +48425 +48426 +48427 +48428 +48429 +48430 +48431 +48432 +48433 +48434 +48435 +48436 +48437 +48438 +48439 +48440 +48441 +48442 +48443 +48444 +48445 +48446 +48447 +48448 +48449 +48450 +48451 +48452 +48453 +48454 +48455 +48456 +48457 +48458 +48459 +48460 +48461 +48462 +48463 +48464 +48465 +48466 +48467 +48468 +48469 +48470 +48471 +48472 +48473 +48474 +48475 +48476 +48477 +48478 +48479 +48480 +48481 +48482 +48483 +48484 +48485 +48486 +48487 +48488 +48489 +48490 +48491 +48492 +48493 +48494 +48495 +48496 +48497 +48498 +48499 +48500 +48501 +48502 +48503 +48504 +48505 +48506 +48507 +48508 +48509 +48510 +48511 +48512 +48513 +48514 +48515 +48516 +48517 +48518 +48519 +48520 +48521 +48522 +48523 +48524 +48525 +48526 +48527 +48528 +48529 +48530 +48531 +48532 +48533 +48534 +48535 +48536 +48537 +48538 +48539 +48540 +48541 +48542 +48543 +48544 +48545 +48546 +48547 +48548 +48549 +48550 +48551 +48552 +48553 +48554 +48555 +48556 +48557 +48558 +48559 +48560 +48561 +48562 +48563 +48564 +48565 +48566 +48567 +48568 +48569 +48570 +48571 +48572 +48573 +48574 +48575 +48576 +48577 +48578 +48579 +48580 +48581 +48582 +48583 +48584 +48585 +48586 +48587 +48588 +48589 +48590 +48591 +48592 +48593 +48594 +48595 +48596 +48597 +48598 +48599 +48600 +48601 +48602 +48603 +48604 +48605 +48606 +48607 +48608 +48609 +48610 +48611 +48612 +48613 +48614 +48615 +48616 +48617 +48618 +48619 +48620 +48621 +48622 +48623 +48624 +48625 +48626 +48627 +48628 +48629 +48630 +48631 +48632 +48633 +48634 +48635 +48636 +48637 +48638 +48639 +48640 +48641 +48642 +48643 +48644 +48645 +48646 +48647 +48648 +48649 +48650 +48651 +48652 +48653 +48654 +48655 +48656 +48657 +48658 +48659 +48660 +48661 +48662 +48663 +48664 +48665 +48666 +48667 +48668 +48669 +48670 +48671 +48672 +48673 +48674 +48675 +48676 +48677 +48678 +48679 +48680 +48681 +48682 +48683 +48684 +48685 +48686 +48687 +48688 +48689 +48690 +48691 +48692 +48693 +48694 +48695 +48696 +48697 +48698 +48699 +48700 +48701 +48702 +48703 +48704 +48705 +48706 +48707 +48708 +48709 +48710 +48711 +48712 +48713 +48714 +48715 +48716 +48717 +48718 +48719 +48720 +48721 +48722 +48723 +48724 +48725 +48726 +48727 +48728 +48729 +48730 +48731 +48732 +48733 +48734 +48735 +48736 +48737 +48738 +48739 +48740 +48741 +48742 +48743 +48744 +48745 +48746 +48747 +48748 +48749 +48750 +48751 +48752 +48753 +48754 +48755 +48756 +48757 +48758 +48759 +48760 +48761 +48762 +48763 +48764 +48765 +48766 +48767 +48768 +48769 +48770 +48771 +48772 +48773 +48774 +48775 +48776 +48777 +48778 +48779 +48780 +48781 +48782 +48783 +48784 +48785 +48786 +48787 +48788 +48789 +48790 +48791 +48792 +48793 +48794 +48795 +48796 +48797 +48798 +48799 +48800 +48801 +48802 +48803 +48804 +48805 +48806 +48807 +48808 +48809 +48810 +48811 +48812 +48813 +48814 +48815 +48816 +48817 +48818 +48819 +48820 +48821 +48822 +48823 +48824 +48825 +48826 +48827 +48828 +48829 +48830 +48831 +48832 +48833 +48834 +48835 +48836 +48837 +48838 +48839 +48840 +48841 +48842 +48843 +48844 +48845 +48846 +48847 +48848 +48849 +48850 +48851 +48852 +48853 +48854 +48855 +48856 +48857 +48858 +48859 +48860 +48861 +48862 +48863 +48864 +48865 +48866 +48867 +48868 +48869 +48870 +48871 +48872 +48873 +48874 +48875 +48876 +48877 +48878 +48879 +48880 +48881 +48882 +48883 +48884 +48885 +48886 +48887 +48888 +48889 +48890 +48891 +48892 +48893 +48894 +48895 +48896 +48897 +48898 +48899 +48900 +48901 +48902 +48903 +48904 +48905 +48906 +48907 +48908 +48909 +48910 +48911 +48912 +48913 +48914 +48915 +48916 +48917 +48918 +48919 +48920 +48921 +48922 +48923 +48924 +48925 +48926 +48927 +48928 +48929 +48930 +48931 +48932 +48933 +48934 +48935 +48936 +48937 +48938 +48939 +48940 +48941 +48942 +48943 +48944 +48945 +48946 +48947 +48948 +48949 +48950 +48951 +48952 +48953 +48954 +48955 +48956 +48957 +48958 +48959 +48960 +48961 +48962 +48963 +48964 +48965 +48966 +48967 +48968 +48969 +48970 +48971 +48972 +48973 +48974 +48975 +48976 +48977 +48978 +48979 +48980 +48981 +48982 +48983 +48984 +48985 +48986 +48987 +48988 +48989 +48990 +48991 +48992 +48993 +48994 +48995 +48996 +48997 +48998 +48999 +49000 +49001 +49002 +49003 +49004 +49005 +49006 +49007 +49008 +49009 +49010 +49011 +49012 +49013 +49014 +49015 +49016 +49017 +49018 +49019 +49020 +49021 +49022 +49023 +49024 +49025 +49026 +49027 +49028 +49029 +49030 +49031 +49032 +49033 +49034 +49035 +49036 +49037 +49038 +49039 +49040 +49041 +49042 +49043 +49044 +49045 +49046 +49047 +49048 +49049 +49050 +49051 +49052 +49053 +49054 +49055 +49056 +49057 +49058 +49059 +49060 +49061 +49062 +49063 +49064 +49065 +49066 +49067 +49068 +49069 +49070 +49071 +49072 +49073 +49074 +49075 +49076 +49077 +49078 +49079 +49080 +49081 +49082 +49083 +49084 +49085 +49086 +49087 +49088 +49089 +49090 +49091 +49092 +49093 +49094 +49095 +49096 +49097 +49098 +49099 +49100 +49101 +49102 +49103 +49104 +49105 +49106 +49107 +49108 +49109 +49110 +49111 +49112 +49113 +49114 +49115 +49116 +49117 +49118 +49119 +49120 +49121 +49122 +49123 +49124 +49125 +49126 +49127 +49128 +49129 +49130 +49131 +49132 +49133 +49134 +49135 +49136 +49137 +49138 +49139 +49140 +49141 +49142 +49143 +49144 +49145 +49146 +49147 +49148 +49149 +49150 +49151 +49152 +49153 +49154 +49155 +49156 +49157 +49158 +49159 +49160 +49161 +49162 +49163 +49164 +49165 +49166 +49167 +49168 +49169 +49170 +49171 +49172 +49173 +49174 +49175 +49176 +49177 +49178 +49179 +49180 +49181 +49182 +49183 +49184 +49185 +49186 +49187 +49188 +49189 +49190 +49191 +49192 +49193 +49194 +49195 +49196 +49197 +49198 +49199 +49200 +49201 +49202 +49203 +49204 +49205 +49206 +49207 +49208 +49209 +49210 +49211 +49212 +49213 +49214 +49215 +49216 +49217 +49218 +49219 +49220 +49221 +49222 +49223 +49224 +49225 +49226 +49227 +49228 +49229 +49230 +49231 +49232 +49233 +49234 +49235 +49236 +49237 +49238 +49239 +49240 +49241 +49242 +49243 +49244 +49245 +49246 +49247 +49248 +49249 +49250 +49251 +49252 +49253 +49254 +49255 +49256 +49257 +49258 +49259 +49260 +49261 +49262 +49263 +49264 +49265 +49266 +49267 +49268 +49269 +49270 +49271 +49272 +49273 +49274 +49275 +49276 +49277 +49278 +49279 +49280 +49281 +49282 +49283 +49284 +49285 +49286 +49287 +49288 +49289 +49290 +49291 +49292 +49293 +49294 +49295 +49296 +49297 +49298 +49299 +49300 +49301 +49302 +49303 +49304 +49305 +49306 +49307 +49308 +49309 +49310 +49311 +49312 +49313 +49314 +49315 +49316 +49317 +49318 +49319 +49320 +49321 +49322 +49323 +49324 +49325 +49326 +49327 +49328 +49329 +49330 +49331 +49332 +49333 +49334 +49335 +49336 +49337 +49338 +49339 +49340 +49341 +49342 +49343 +49344 +49345 +49346 +49347 +49348 +49349 +49350 +49351 +49352 +49353 +49354 +49355 +49356 +49357 +49358 +49359 +49360 +49361 +49362 +49363 +49364 +49365 +49366 +49367 +49368 +49369 +49370 +49371 +49372 +49373 +49374 +49375 +49376 +49377 +49378 +49379 +49380 +49381 +49382 +49383 +49384 +49385 +49386 +49387 +49388 +49389 +49390 +49391 +49392 +49393 +49394 +49395 +49396 +49397 +49398 +49399 +49400 +49401 +49402 +49403 +49404 +49405 +49406 +49407 +49408 +49409 +49410 +49411 +49412 +49413 +49414 +49415 +49416 +49417 +49418 +49419 +49420 +49421 +49422 +49423 +49424 +49425 +49426 +49427 +49428 +49429 +49430 +49431 +49432 +49433 +49434 +49435 +49436 +49437 +49438 +49439 +49440 +49441 +49442 +49443 +49444 +49445 +49446 +49447 +49448 +49449 +49450 +49451 +49452 +49453 +49454 +49455 +49456 +49457 +49458 +49459 +49460 +49461 +49462 +49463 +49464 +49465 +49466 +49467 +49468 +49469 +49470 +49471 +49472 +49473 +49474 +49475 +49476 +49477 +49478 +49479 +49480 +49481 +49482 +49483 +49484 +49485 +49486 +49487 +49488 +49489 +49490 +49491 +49492 +49493 +49494 +49495 +49496 +49497 +49498 +49499 +49500 +49501 +49502 +49503 +49504 +49505 +49506 +49507 +49508 +49509 +49510 +49511 +49512 +49513 +49514 +49515 +49516 +49517 +49518 +49519 +49520 +49521 +49522 +49523 +49524 +49525 +49526 +49527 +49528 +49529 +49530 +49531 +49532 +49533 +49534 +49535 +49536 +49537 +49538 +49539 +49540 +49541 +49542 +49543 +49544 +49545 +49546 +49547 +49548 +49549 +49550 +49551 +49552 +49553 +49554 +49555 +49556 +49557 +49558 +49559 +49560 +49561 +49562 +49563 +49564 +49565 +49566 +49567 +49568 +49569 +49570 +49571 +49572 +49573 +49574 +49575 +49576 +49577 +49578 +49579 +49580 +49581 +49582 +49583 +49584 +49585 +49586 +49587 +49588 +49589 +49590 +49591 +49592 +49593 +49594 +49595 +49596 +49597 +49598 +49599 +49600 +49601 +49602 +49603 +49604 +49605 +49606 +49607 +49608 +49609 +49610 +49611 +49612 +49613 +49614 +49615 +49616 +49617 +49618 +49619 +49620 +49621 +49622 +49623 +49624 +49625 +49626 +49627 +49628 +49629 +49630 +49631 +49632 +49633 +49634 +49635 +49636 +49637 +49638 +49639 +49640 +49641 +49642 +49643 +49644 +49645 +49646 +49647 +49648 +49649 +49650 +49651 +49652 +49653 +49654 +49655 +49656 +49657 +49658 +49659 +49660 +49661 +49662 +49663 +49664 +49665 +49666 +49667 +49668 +49669 +49670 +49671 +49672 +49673 +49674 +49675 +49676 +49677 +49678 +49679 +49680 +49681 +49682 +49683 +49684 +49685 +49686 +49687 +49688 +49689 +49690 +49691 +49692 +49693 +49694 +49695 +49696 +49697 +49698 +49699 +49700 +49701 +49702 +49703 +49704 +49705 +49706 +49707 +49708 +49709 +49710 +49711 +49712 +49713 +49714 +49715 +49716 +49717 +49718 +49719 +49720 +49721 +49722 +49723 +49724 +49725 +49726 +49727 +49728 +49729 +49730 +49731 +49732 +49733 +49734 +49735 +49736 +49737 +49738 +49739 +49740 +49741 +49742 +49743 +49744 +49745 +49746 +49747 +49748 +49749 +49750 +49751 +49752 +49753 +49754 +49755 +49756 +49757 +49758 +49759 +49760 +49761 +49762 +49763 +49764 +49765 +49766 +49767 +49768 +49769 +49770 +49771 +49772 +49773 +49774 +49775 +49776 +49777 +49778 +49779 +49780 +49781 +49782 +49783 +49784 +49785 +49786 +49787 +49788 +49789 +49790 +49791 +49792 +49793 +49794 +49795 +49796 +49797 +49798 +49799 +49800 +49801 +49802 +49803 +49804 +49805 +49806 +49807 +49808 +49809 +49810 +49811 +49812 +49813 +49814 +49815 +49816 +49817 +49818 +49819 +49820 +49821 +49822 +49823 +49824 +49825 +49826 +49827 +49828 +49829 +49830 +49831 +49832 +49833 +49834 +49835 +49836 +49837 +49838 +49839 +49840 +49841 +49842 +49843 +49844 +49845 +49846 +49847 +49848 +49849 +49850 +49851 +49852 +49853 +49854 +49855 +49856 +49857 +49858 +49859 +49860 +49861 +49862 +49863 +49864 +49865 +49866 +49867 +49868 +49869 +49870 +49871 +49872 +49873 +49874 +49875 +49876 +49877 +49878 +49879 +49880 +49881 +49882 +49883 +49884 +49885 +49886 +49887 +49888 +49889 +49890 +49891 +49892 +49893 +49894 +49895 +49896 +49897 +49898 +49899 +49900 +49901 +49902 +49903 +49904 +49905 +49906 +49907 +49908 +49909 +49910 +49911 +49912 +49913 +49914 +49915 +49916 +49917 +49918 +49919 +49920 +49921 +49922 +49923 +49924 +49925 +49926 +49927 +49928 +49929 +49930 +49931 +49932 +49933 +49934 +49935 +49936 +49937 +49938 +49939 +49940 +49941 +49942 +49943 +49944 +49945 +49946 +49947 +49948 +49949 +49950 +49951 +49952 +49953 +49954 +49955 +49956 +49957 +49958 +49959 +49960 +49961 +49962 +49963 +49964 +49965 +49966 +49967 +49968 +49969 +49970 +49971 +49972 +49973 +49974 +49975 +49976 +49977 +49978 +49979 +49980 +49981 +49982 +49983 +49984 +49985 +49986 +49987 +49988 +49989 +49990 +49991 +49992 +49993 +49994 +49995 +49996 +49997 +49998 +49999 +50000 +50001 +50002 +50003 +50004 +50005 +50006 +50007 +50008 +50009 +50010 +50011 +50012 +50013 +50014 +50015 +50016 +50017 +50018 +50019 +50020 +50021 +50022 +50023 +50024 +50025 +50026 +50027 +50028 +50029 +50030 +50031 +50032 +50033 +50034 +50035 +50036 +50037 +50038 +50039 +50040 +50041 +50042 +50043 +50044 +50045 +50046 +50047 +50048 +50049 +50050 +50051 +50052 +50053 +50054 +50055 +50056 +50057 +50058 +50059 +50060 +50061 +50062 +50063 +50064 +50065 +50066 +50067 +50068 +50069 +50070 +50071 +50072 +50073 +50074 +50075 +50076 +50077 +50078 +50079 +50080 +50081 +50082 +50083 +50084 +50085 +50086 +50087 +50088 +50089 +50090 +50091 +50092 +50093 +50094 +50095 +50096 +50097 +50098 +50099 +50100 +50101 +50102 +50103 +50104 +50105 +50106 +50107 +50108 +50109 +50110 +50111 +50112 +50113 +50114 +50115 +50116 +50117 +50118 +50119 +50120 +50121 +50122 +50123 +50124 +50125 +50126 +50127 +50128 +50129 +50130 +50131 +50132 +50133 +50134 +50135 +50136 +50137 +50138 +50139 +50140 +50141 +50142 +50143 +50144 +50145 +50146 +50147 +50148 +50149 +50150 +50151 +50152 +50153 +50154 +50155 +50156 +50157 +50158 +50159 +50160 +50161 +50162 +50163 +50164 +50165 +50166 +50167 +50168 +50169 +50170 +50171 +50172 +50173 +50174 +50175 +50176 +50177 +50178 +50179 +50180 +50181 +50182 +50183 +50184 +50185 +50186 +50187 +50188 +50189 +50190 +50191 +50192 +50193 +50194 +50195 +50196 +50197 +50198 +50199 +50200 +50201 +50202 +50203 +50204 +50205 +50206 +50207 +50208 +50209 +50210 +50211 +50212 +50213 +50214 +50215 +50216 +50217 +50218 +50219 +50220 +50221 +50222 +50223 +50224 +50225 +50226 +50227 +50228 +50229 +50230 +50231 +50232 +50233 +50234 +50235 +50236 +50237 +50238 +50239 +50240 +50241 +50242 +50243 +50244 +50245 +50246 +50247 +50248 +50249 +50250 +50251 +50252 +50253 +50254 +50255 +50256 +50257 +50258 +50259 +50260 +50261 +50262 +50263 +50264 +50265 +50266 +50267 +50268 +50269 +50270 +50271 +50272 +50273 +50274 +50275 +50276 +50277 +50278 +50279 +50280 +50281 +50282 +50283 +50284 +50285 +50286 +50287 +50288 +50289 +50290 +50291 +50292 +50293 +50294 +50295 +50296 +50297 +50298 +50299 +50300 +50301 +50302 +50303 +50304 +50305 +50306 +50307 +50308 +50309 +50310 +50311 +50312 +50313 +50314 +50315 +50316 +50317 +50318 +50319 +50320 +50321 +50322 +50323 +50324 +50325 +50326 +50327 +50328 +50329 +50330 +50331 +50332 +50333 +50334 +50335 +50336 +50337 +50338 +50339 +50340 +50341 +50342 +50343 +50344 +50345 +50346 +50347 +50348 +50349 +50350 +50351 +50352 +50353 +50354 +50355 +50356 +50357 +50358 +50359 +50360 +50361 +50362 +50363 +50364 +50365 +50366 +50367 +50368 +50369 +50370 +50371 +50372 +50373 +50374 +50375 +50376 +50377 +50378 +50379 +50380 +50381 +50382 +50383 +50384 +50385 +50386 +50387 +50388 +50389 +50390 +50391 +50392 +50393 +50394 +50395 +50396 +50397 +50398 +50399 +50400 +50401 +50402 +50403 +50404 +50405 +50406 +50407 +50408 +50409 +50410 +50411 +50412 +50413 +50414 +50415 +50416 +50417 +50418 +50419 +50420 +50421 +50422 +50423 +50424 +50425 +50426 +50427 +50428 +50429 +50430 +50431 +50432 +50433 +50434 +50435 +50436 +50437 +50438 +50439 +50440 +50441 +50442 +50443 +50444 +50445 +50446 +50447 +50448 +50449 +50450 +50451 +50452 +50453 +50454 +50455 +50456 +50457 +50458 +50459 +50460 +50461 +50462 +50463 +50464 +50465 +50466 +50467 +50468 +50469 +50470 +50471 +50472 +50473 +50474 +50475 +50476 +50477 +50478 +50479 +50480 +50481 +50482 +50483 +50484 +50485 +50486 +50487 +50488 +50489 +50490 +50491 +50492 +50493 +50494 +50495 +50496 +50497 +50498 +50499 +50500 +50501 +50502 +50503 +50504 +50505 +50506 +50507 +50508 +50509 +50510 +50511 +50512 +50513 +50514 +50515 +50516 +50517 +50518 +50519 +50520 +50521 +50522 +50523 +50524 +50525 +50526 +50527 +50528 +50529 +50530 +50531 +50532 +50533 +50534 +50535 +50536 +50537 +50538 +50539 +50540 +50541 +50542 +50543 +50544 +50545 +50546 +50547 +50548 +50549 +50550 +50551 +50552 +50553 +50554 +50555 +50556 +50557 +50558 +50559 +50560 +50561 +50562 +50563 +50564 +50565 +50566 +50567 +50568 +50569 +50570 +50571 +50572 +50573 +50574 +50575 +50576 +50577 +50578 +50579 +50580 +50581 +50582 +50583 +50584 +50585 +50586 +50587 +50588 +50589 +50590 +50591 +50592 +50593 +50594 +50595 +50596 +50597 +50598 +50599 +50600 +50601 +50602 +50603 +50604 +50605 +50606 +50607 +50608 +50609 +50610 +50611 +50612 +50613 +50614 +50615 +50616 +50617 +50618 +50619 +50620 +50621 +50622 +50623 +50624 +50625 +50626 +50627 +50628 +50629 +50630 +50631 +50632 +50633 +50634 +50635 +50636 +50637 +50638 +50639 +50640 +50641 +50642 +50643 +50644 +50645 +50646 +50647 +50648 +50649 +50650 +50651 +50652 +50653 +50654 +50655 +50656 +50657 +50658 +50659 +50660 +50661 +50662 +50663 +50664 +50665 +50666 +50667 +50668 +50669 +50670 +50671 +50672 +50673 +50674 +50675 +50676 +50677 +50678 +50679 +50680 +50681 +50682 +50683 +50684 +50685 +50686 +50687 +50688 +50689 +50690 +50691 +50692 +50693 +50694 +50695 +50696 +50697 +50698 +50699 +50700 +50701 +50702 +50703 +50704 +50705 +50706 +50707 +50708 +50709 +50710 +50711 +50712 +50713 +50714 +50715 +50716 +50717 +50718 +50719 +50720 +50721 +50722 +50723 +50724 +50725 +50726 +50727 +50728 +50729 +50730 +50731 +50732 +50733 +50734 +50735 +50736 +50737 +50738 +50739 +50740 +50741 +50742 +50743 +50744 +50745 +50746 +50747 +50748 +50749 +50750 +50751 +50752 +50753 +50754 +50755 +50756 +50757 +50758 +50759 +50760 +50761 +50762 +50763 +50764 +50765 +50766 +50767 +50768 +50769 +50770 +50771 +50772 +50773 +50774 +50775 +50776 +50777 +50778 +50779 +50780 +50781 +50782 +50783 +50784 +50785 +50786 +50787 +50788 +50789 +50790 +50791 +50792 +50793 +50794 +50795 +50796 +50797 +50798 +50799 +50800 +50801 +50802 +50803 +50804 +50805 +50806 +50807 +50808 +50809 +50810 +50811 +50812 +50813 +50814 +50815 +50816 +50817 +50818 +50819 +50820 +50821 +50822 +50823 +50824 +50825 +50826 +50827 +50828 +50829 +50830 +50831 +50832 +50833 +50834 +50835 +50836 +50837 +50838 +50839 +50840 +50841 +50842 +50843 +50844 +50845 +50846 +50847 +50848 +50849 +50850 +50851 +50852 +50853 +50854 +50855 +50856 +50857 +50858 +50859 +50860 +50861 +50862 +50863 +50864 +50865 +50866 +50867 +50868 +50869 +50870 +50871 +50872 +50873 +50874 +50875 +50876 +50877 +50878 +50879 +50880 +50881 +50882 +50883 +50884 +50885 +50886 +50887 +50888 +50889 +50890 +50891 +50892 +50893 +50894 +50895 +50896 +50897 +50898 +50899 +50900 +50901 +50902 +50903 +50904 +50905 +50906 +50907 +50908 +50909 +50910 +50911 +50912 +50913 +50914 +50915 +50916 +50917 +50918 +50919 +50920 +50921 +50922 +50923 +50924 +50925 +50926 +50927 +50928 +50929 +50930 +50931 +50932 +50933 +50934 +50935 +50936 +50937 +50938 +50939 +50940 +50941 +50942 +50943 +50944 +50945 +50946 +50947 +50948 +50949 +50950 +50951 +50952 +50953 +50954 +50955 +50956 +50957 +50958 +50959 +50960 +50961 +50962 +50963 +50964 +50965 +50966 +50967 +50968 +50969 +50970 +50971 +50972 +50973 +50974 +50975 +50976 +50977 +50978 +50979 +50980 +50981 +50982 +50983 +50984 +50985 +50986 +50987 +50988 +50989 +50990 +50991 +50992 +50993 +50994 +50995 +50996 +50997 +50998 +50999 +51000 +51001 +51002 +51003 +51004 +51005 +51006 +51007 +51008 +51009 +51010 +51011 +51012 +51013 +51014 +51015 +51016 +51017 +51018 +51019 +51020 +51021 +51022 +51023 +51024 +51025 +51026 +51027 +51028 +51029 +51030 +51031 +51032 +51033 +51034 +51035 +51036 +51037 +51038 +51039 +51040 +51041 +51042 +51043 +51044 +51045 +51046 +51047 +51048 +51049 +51050 +51051 +51052 +51053 +51054 +51055 +51056 +51057 +51058 +51059 +51060 +51061 +51062 +51063 +51064 +51065 +51066 +51067 +51068 +51069 +51070 +51071 +51072 +51073 +51074 +51075 +51076 +51077 +51078 +51079 +51080 +51081 +51082 +51083 +51084 +51085 +51086 +51087 +51088 +51089 +51090 +51091 +51092 +51093 +51094 +51095 +51096 +51097 +51098 +51099 +51100 +51101 +51102 +51103 +51104 +51105 +51106 +51107 +51108 +51109 +51110 +51111 +51112 +51113 +51114 +51115 +51116 +51117 +51118 +51119 +51120 +51121 +51122 +51123 +51124 +51125 +51126 +51127 +51128 +51129 +51130 +51131 +51132 +51133 +51134 +51135 +51136 +51137 +51138 +51139 +51140 +51141 +51142 +51143 +51144 +51145 +51146 +51147 +51148 +51149 +51150 +51151 +51152 +51153 +51154 +51155 +51156 +51157 +51158 +51159 +51160 +51161 +51162 +51163 +51164 +51165 +51166 +51167 +51168 +51169 +51170 +51171 +51172 +51173 +51174 +51175 +51176 +51177 +51178 +51179 +51180 +51181 +51182 +51183 +51184 +51185 +51186 +51187 +51188 +51189 +51190 +51191 +51192 +51193 +51194 +51195 +51196 +51197 +51198 +51199 +51200 +51201 +51202 +51203 +51204 +51205 +51206 +51207 +51208 +51209 +51210 +51211 +51212 +51213 +51214 +51215 +51216 +51217 +51218 +51219 +51220 +51221 +51222 +51223 +51224 +51225 +51226 +51227 +51228 +51229 +51230 +51231 +51232 +51233 +51234 +51235 +51236 +51237 +51238 +51239 +51240 +51241 +51242 +51243 +51244 +51245 +51246 +51247 +51248 +51249 +51250 +51251 +51252 +51253 +51254 +51255 +51256 +51257 +51258 +51259 +51260 +51261 +51262 +51263 +51264 +51265 +51266 +51267 +51268 +51269 +51270 +51271 +51272 +51273 +51274 +51275 +51276 +51277 +51278 +51279 +51280 +51281 +51282 +51283 +51284 +51285 +51286 +51287 +51288 +51289 +51290 +51291 +51292 +51293 +51294 +51295 +51296 +51297 +51298 +51299 +51300 +51301 +51302 +51303 +51304 +51305 +51306 +51307 +51308 +51309 +51310 +51311 +51312 +51313 +51314 +51315 +51316 +51317 +51318 +51319 +51320 +51321 +51322 +51323 +51324 +51325 +51326 +51327 +51328 +51329 +51330 +51331 +51332 +51333 +51334 +51335 +51336 +51337 +51338 +51339 +51340 +51341 +51342 +51343 +51344 +51345 +51346 +51347 +51348 +51349 +51350 +51351 +51352 +51353 +51354 +51355 +51356 +51357 +51358 +51359 +51360 +51361 +51362 +51363 +51364 +51365 +51366 +51367 +51368 +51369 +51370 +51371 +51372 +51373 +51374 +51375 +51376 +51377 +51378 +51379 +51380 +51381 +51382 +51383 +51384 +51385 +51386 +51387 +51388 +51389 +51390 +51391 +51392 +51393 +51394 +51395 +51396 +51397 +51398 +51399 +51400 +51401 +51402 +51403 +51404 +51405 +51406 +51407 +51408 +51409 +51410 +51411 +51412 +51413 +51414 +51415 +51416 +51417 +51418 +51419 +51420 +51421 +51422 +51423 +51424 +51425 +51426 +51427 +51428 +51429 +51430 +51431 +51432 +51433 +51434 +51435 +51436 +51437 +51438 +51439 +51440 +51441 +51442 +51443 +51444 +51445 +51446 +51447 +51448 +51449 +51450 +51451 +51452 +51453 +51454 +51455 +51456 +51457 +51458 +51459 +51460 +51461 +51462 +51463 +51464 +51465 +51466 +51467 +51468 +51469 +51470 +51471 +51472 +51473 +51474 +51475 +51476 +51477 +51478 +51479 +51480 +51481 +51482 +51483 +51484 +51485 +51486 +51487 +51488 +51489 +51490 +51491 +51492 +51493 +51494 +51495 +51496 +51497 +51498 +51499 +51500 +51501 +51502 +51503 +51504 +51505 +51506 +51507 +51508 +51509 +51510 +51511 +51512 +51513 +51514 +51515 +51516 +51517 +51518 +51519 +51520 +51521 +51522 +51523 +51524 +51525 +51526 +51527 +51528 +51529 +51530 +51531 +51532 +51533 +51534 +51535 +51536 +51537 +51538 +51539 +51540 +51541 +51542 +51543 +51544 +51545 +51546 +51547 +51548 +51549 +51550 +51551 +51552 +51553 +51554 +51555 +51556 +51557 +51558 +51559 +51560 +51561 +51562 +51563 +51564 +51565 +51566 +51567 +51568 +51569 +51570 +51571 +51572 +51573 +51574 +51575 +51576 +51577 +51578 +51579 +51580 +51581 +51582 +51583 +51584 +51585 +51586 +51587 +51588 +51589 +51590 +51591 +51592 +51593 +51594 +51595 +51596 +51597 +51598 +51599 +51600 +51601 +51602 +51603 +51604 +51605 +51606 +51607 +51608 +51609 +51610 +51611 +51612 +51613 +51614 +51615 +51616 +51617 +51618 +51619 +51620 +51621 +51622 +51623 +51624 +51625 +51626 +51627 +51628 +51629 +51630 +51631 +51632 +51633 +51634 +51635 +51636 +51637 +51638 +51639 +51640 +51641 +51642 +51643 +51644 +51645 +51646 +51647 +51648 +51649 +51650 +51651 +51652 +51653 +51654 +51655 +51656 +51657 +51658 +51659 +51660 +51661 +51662 +51663 +51664 +51665 +51666 +51667 +51668 +51669 +51670 +51671 +51672 +51673 +51674 +51675 +51676 +51677 +51678 +51679 +51680 +51681 +51682 +51683 +51684 +51685 +51686 +51687 +51688 +51689 +51690 +51691 +51692 +51693 +51694 +51695 +51696 +51697 +51698 +51699 +51700 +51701 +51702 +51703 +51704 +51705 +51706 +51707 +51708 +51709 +51710 +51711 +51712 +51713 +51714 +51715 +51716 +51717 +51718 +51719 +51720 +51721 +51722 +51723 +51724 +51725 +51726 +51727 +51728 +51729 +51730 +51731 +51732 +51733 +51734 +51735 +51736 +51737 +51738 +51739 +51740 +51741 +51742 +51743 +51744 +51745 +51746 +51747 +51748 +51749 +51750 +51751 +51752 +51753 +51754 +51755 +51756 +51757 +51758 +51759 +51760 +51761 +51762 +51763 +51764 +51765 +51766 +51767 +51768 +51769 +51770 +51771 +51772 +51773 +51774 +51775 +51776 +51777 +51778 +51779 +51780 +51781 +51782 +51783 +51784 +51785 +51786 +51787 +51788 +51789 +51790 +51791 +51792 +51793 +51794 +51795 +51796 +51797 +51798 +51799 +51800 +51801 +51802 +51803 +51804 +51805 +51806 +51807 +51808 +51809 +51810 +51811 +51812 +51813 +51814 +51815 +51816 +51817 +51818 +51819 +51820 +51821 +51822 +51823 +51824 +51825 +51826 +51827 +51828 +51829 +51830 +51831 +51832 +51833 +51834 +51835 +51836 +51837 +51838 +51839 +51840 +51841 +51842 +51843 +51844 +51845 +51846 +51847 +51848 +51849 +51850 +51851 +51852 +51853 +51854 +51855 +51856 +51857 +51858 +51859 +51860 +51861 +51862 +51863 +51864 +51865 +51866 +51867 +51868 +51869 +51870 +51871 +51872 +51873 +51874 +51875 +51876 +51877 +51878 +51879 +51880 +51881 +51882 +51883 +51884 +51885 +51886 +51887 +51888 +51889 +51890 +51891 +51892 +51893 +51894 +51895 +51896 +51897 +51898 +51899 +51900 +51901 +51902 +51903 +51904 +51905 +51906 +51907 +51908 +51909 +51910 +51911 +51912 +51913 +51914 +51915 +51916 +51917 +51918 +51919 +51920 +51921 +51922 +51923 +51924 +51925 +51926 +51927 +51928 +51929 +51930 +51931 +51932 +51933 +51934 +51935 +51936 +51937 +51938 +51939 +51940 +51941 +51942 +51943 +51944 +51945 +51946 +51947 +51948 +51949 +51950 +51951 +51952 +51953 +51954 +51955 +51956 +51957 +51958 +51959 +51960 +51961 +51962 +51963 +51964 +51965 +51966 +51967 +51968 +51969 +51970 +51971 +51972 +51973 +51974 +51975 +51976 +51977 +51978 +51979 +51980 +51981 +51982 +51983 +51984 +51985 +51986 +51987 +51988 +51989 +51990 +51991 +51992 +51993 +51994 +51995 +51996 +51997 +51998 +51999 +52000 +52001 +52002 +52003 +52004 +52005 +52006 +52007 +52008 +52009 +52010 +52011 +52012 +52013 +52014 +52015 +52016 +52017 +52018 +52019 +52020 +52021 +52022 +52023 +52024 +52025 +52026 +52027 +52028 +52029 +52030 +52031 +52032 +52033 +52034 +52035 +52036 +52037 +52038 +52039 +52040 +52041 +52042 +52043 +52044 +52045 +52046 +52047 +52048 +52049 +52050 +52051 +52052 +52053 +52054 +52055 +52056 +52057 +52058 +52059 +52060 +52061 +52062 +52063 +52064 +52065 +52066 +52067 +52068 +52069 +52070 +52071 +52072 +52073 +52074 +52075 +52076 +52077 +52078 +52079 +52080 +52081 +52082 +52083 +52084 +52085 +52086 +52087 +52088 +52089 +52090 +52091 +52092 +52093 +52094 +52095 +52096 +52097 +52098 +52099 +52100 +52101 +52102 +52103 +52104 +52105 +52106 +52107 +52108 +52109 +52110 +52111 +52112 +52113 +52114 +52115 +52116 +52117 +52118 +52119 +52120 +52121 +52122 +52123 +52124 +52125 +52126 +52127 +52128 +52129 +52130 +52131 +52132 +52133 +52134 +52135 +52136 +52137 +52138 +52139 +52140 +52141 +52142 +52143 +52144 +52145 +52146 +52147 +52148 +52149 +52150 +52151 +52152 +52153 +52154 +52155 +52156 +52157 +52158 +52159 +52160 +52161 +52162 +52163 +52164 +52165 +52166 +52167 +52168 +52169 +52170 +52171 +52172 +52173 +52174 +52175 +52176 +52177 +52178 +52179 +52180 +52181 +52182 +52183 +52184 +52185 +52186 +52187 +52188 +52189 +52190 +52191 +52192 +52193 +52194 +52195 +52196 +52197 +52198 +52199 +52200 +52201 +52202 +52203 +52204 +52205 +52206 +52207 +52208 +52209 +52210 +52211 +52212 +52213 +52214 +52215 +52216 +52217 +52218 +52219 +52220 +52221 +52222 +52223 +52224 +52225 +52226 +52227 +52228 +52229 +52230 +52231 +52232 +52233 +52234 +52235 +52236 +52237 +52238 +52239 +52240 +52241 +52242 +52243 +52244 +52245 +52246 +52247 +52248 +52249 +52250 +52251 +52252 +52253 +52254 +52255 +52256 +52257 +52258 +52259 +52260 +52261 +52262 +52263 +52264 +52265 +52266 +52267 +52268 +52269 +52270 +52271 +52272 +52273 +52274 +52275 +52276 +52277 +52278 +52279 +52280 +52281 +52282 +52283 +52284 +52285 +52286 +52287 +52288 +52289 +52290 +52291 +52292 +52293 +52294 +52295 +52296 +52297 +52298 +52299 +52300 +52301 +52302 +52303 +52304 +52305 +52306 +52307 +52308 +52309 +52310 +52311 +52312 +52313 +52314 +52315 +52316 +52317 +52318 +52319 +52320 +52321 +52322 +52323 +52324 +52325 +52326 +52327 +52328 +52329 +52330 +52331 +52332 +52333 +52334 +52335 +52336 +52337 +52338 +52339 +52340 +52341 +52342 +52343 +52344 +52345 +52346 +52347 +52348 +52349 +52350 +52351 +52352 +52353 +52354 +52355 +52356 +52357 +52358 +52359 +52360 +52361 +52362 +52363 +52364 +52365 +52366 +52367 +52368 +52369 +52370 +52371 +52372 +52373 +52374 +52375 +52376 +52377 +52378 +52379 +52380 +52381 +52382 +52383 +52384 +52385 +52386 +52387 +52388 +52389 +52390 +52391 +52392 +52393 +52394 +52395 +52396 +52397 +52398 +52399 +52400 +52401 +52402 +52403 +52404 +52405 +52406 +52407 +52408 +52409 +52410 +52411 +52412 +52413 +52414 +52415 +52416 +52417 +52418 +52419 +52420 +52421 +52422 +52423 +52424 +52425 +52426 +52427 +52428 +52429 +52430 +52431 +52432 +52433 +52434 +52435 +52436 +52437 +52438 +52439 +52440 +52441 +52442 +52443 +52444 +52445 +52446 +52447 +52448 +52449 +52450 +52451 +52452 +52453 +52454 +52455 +52456 +52457 +52458 +52459 +52460 +52461 +52462 +52463 +52464 +52465 +52466 +52467 +52468 +52469 +52470 +52471 +52472 +52473 +52474 +52475 +52476 +52477 +52478 +52479 +52480 +52481 +52482 +52483 +52484 +52485 +52486 +52487 +52488 +52489 +52490 +52491 +52492 +52493 +52494 +52495 +52496 +52497 +52498 +52499 +52500 +52501 +52502 +52503 +52504 +52505 +52506 +52507 +52508 +52509 +52510 +52511 +52512 +52513 +52514 +52515 +52516 +52517 +52518 +52519 +52520 +52521 +52522 +52523 +52524 +52525 +52526 +52527 +52528 +52529 +52530 +52531 +52532 +52533 +52534 +52535 +52536 +52537 +52538 +52539 +52540 +52541 +52542 +52543 +52544 +52545 +52546 +52547 +52548 +52549 +52550 +52551 +52552 +52553 +52554 +52555 +52556 +52557 +52558 +52559 +52560 +52561 +52562 +52563 +52564 +52565 +52566 +52567 +52568 +52569 +52570 +52571 +52572 +52573 +52574 +52575 +52576 +52577 +52578 +52579 +52580 +52581 +52582 +52583 +52584 +52585 +52586 +52587 +52588 +52589 +52590 +52591 +52592 +52593 +52594 +52595 +52596 +52597 +52598 +52599 +52600 +52601 +52602 +52603 +52604 +52605 +52606 +52607 +52608 +52609 +52610 +52611 +52612 +52613 +52614 +52615 +52616 +52617 +52618 +52619 +52620 +52621 +52622 +52623 +52624 +52625 +52626 +52627 +52628 +52629 +52630 +52631 +52632 +52633 +52634 +52635 +52636 +52637 +52638 +52639 +52640 +52641 +52642 +52643 +52644 +52645 +52646 +52647 +52648 +52649 +52650 +52651 +52652 +52653 +52654 +52655 +52656 +52657 +52658 +52659 +52660 +52661 +52662 +52663 +52664 +52665 +52666 +52667 +52668 +52669 +52670 +52671 +52672 +52673 +52674 +52675 +52676 +52677 +52678 +52679 +52680 +52681 +52682 +52683 +52684 +52685 +52686 +52687 +52688 +52689 +52690 +52691 +52692 +52693 +52694 +52695 +52696 +52697 +52698 +52699 +52700 +52701 +52702 +52703 +52704 +52705 +52706 +52707 +52708 +52709 +52710 +52711 +52712 +52713 +52714 +52715 +52716 +52717 +52718 +52719 +52720 +52721 +52722 +52723 +52724 +52725 +52726 +52727 +52728 +52729 +52730 +52731 +52732 +52733 +52734 +52735 +52736 +52737 +52738 +52739 +52740 +52741 +52742 +52743 +52744 +52745 +52746 +52747 +52748 +52749 +52750 +52751 +52752 +52753 +52754 +52755 +52756 +52757 +52758 +52759 +52760 +52761 +52762 +52763 +52764 +52765 +52766 +52767 +52768 +52769 +52770 +52771 +52772 +52773 +52774 +52775 +52776 +52777 +52778 +52779 +52780 +52781 +52782 +52783 +52784 +52785 +52786 +52787 +52788 +52789 +52790 +52791 +52792 +52793 +52794 +52795 +52796 +52797 +52798 +52799 +52800 +52801 +52802 +52803 +52804 +52805 +52806 +52807 +52808 +52809 +52810 +52811 +52812 +52813 +52814 +52815 +52816 +52817 +52818 +52819 +52820 +52821 +52822 +52823 +52824 +52825 +52826 +52827 +52828 +52829 +52830 +52831 +52832 +52833 +52834 +52835 +52836 +52837 +52838 +52839 +52840 +52841 +52842 +52843 +52844 +52845 +52846 +52847 +52848 +52849 +52850 +52851 +52852 +52853 +52854 +52855 +52856 +52857 +52858 +52859 +52860 +52861 +52862 +52863 +52864 +52865 +52866 +52867 +52868 +52869 +52870 +52871 +52872 +52873 +52874 +52875 +52876 +52877 +52878 +52879 +52880 +52881 +52882 +52883 +52884 +52885 +52886 +52887 +52888 +52889 +52890 +52891 +52892 +52893 +52894 +52895 +52896 +52897 +52898 +52899 +52900 +52901 +52902 +52903 +52904 +52905 +52906 +52907 +52908 +52909 +52910 +52911 +52912 +52913 +52914 +52915 +52916 +52917 +52918 +52919 +52920 +52921 +52922 +52923 +52924 +52925 +52926 +52927 +52928 +52929 +52930 +52931 +52932 +52933 +52934 +52935 +52936 +52937 +52938 +52939 +52940 +52941 +52942 +52943 +52944 +52945 +52946 +52947 +52948 +52949 +52950 +52951 +52952 +52953 +52954 +52955 +52956 +52957 +52958 +52959 +52960 +52961 +52962 +52963 +52964 +52965 +52966 +52967 +52968 +52969 +52970 +52971 +52972 +52973 +52974 +52975 +52976 +52977 +52978 +52979 +52980 +52981 +52982 +52983 +52984 +52985 +52986 +52987 +52988 +52989 +52990 +52991 +52992 +52993 +52994 +52995 +52996 +52997 +52998 +52999 +53000 +53001 +53002 +53003 +53004 +53005 +53006 +53007 +53008 +53009 +53010 +53011 +53012 +53013 +53014 +53015 +53016 +53017 +53018 +53019 +53020 +53021 +53022 +53023 +53024 +53025 +53026 +53027 +53028 +53029 +53030 +53031 +53032 +53033 +53034 +53035 +53036 +53037 +53038 +53039 +53040 +53041 +53042 +53043 +53044 +53045 +53046 +53047 +53048 +53049 +53050 +53051 +53052 +53053 +53054 +53055 +53056 +53057 +53058 +53059 +53060 +53061 +53062 +53063 +53064 +53065 +53066 +53067 +53068 +53069 +53070 +53071 +53072 +53073 +53074 +53075 +53076 +53077 +53078 +53079 +53080 +53081 +53082 +53083 +53084 +53085 +53086 +53087 +53088 +53089 +53090 +53091 +53092 +53093 +53094 +53095 +53096 +53097 +53098 +53099 +53100 +53101 +53102 +53103 +53104 +53105 +53106 +53107 +53108 +53109 +53110 +53111 +53112 +53113 +53114 +53115 +53116 +53117 +53118 +53119 +53120 +53121 +53122 +53123 +53124 +53125 +53126 +53127 +53128 +53129 +53130 +53131 +53132 +53133 +53134 +53135 +53136 +53137 +53138 +53139 +53140 +53141 +53142 +53143 +53144 +53145 +53146 +53147 +53148 +53149 +53150 +53151 +53152 +53153 +53154 +53155 +53156 +53157 +53158 +53159 +53160 +53161 +53162 +53163 +53164 +53165 +53166 +53167 +53168 +53169 +53170 +53171 +53172 +53173 +53174 +53175 +53176 +53177 +53178 +53179 +53180 +53181 +53182 +53183 +53184 +53185 +53186 +53187 +53188 +53189 +53190 +53191 +53192 +53193 +53194 +53195 +53196 +53197 +53198 +53199 +53200 +53201 +53202 +53203 +53204 +53205 +53206 +53207 +53208 +53209 +53210 +53211 +53212 +53213 +53214 +53215 +53216 +53217 +53218 +53219 +53220 +53221 +53222 +53223 +53224 +53225 +53226 +53227 +53228 +53229 +53230 +53231 +53232 +53233 +53234 +53235 +53236 +53237 +53238 +53239 +53240 +53241 +53242 +53243 +53244 +53245 +53246 +53247 +53248 +53249 +53250 +53251 +53252 +53253 +53254 +53255 +53256 +53257 +53258 +53259 +53260 +53261 +53262 +53263 +53264 +53265 +53266 +53267 +53268 +53269 +53270 +53271 +53272 +53273 +53274 +53275 +53276 +53277 +53278 +53279 +53280 +53281 +53282 +53283 +53284 +53285 +53286 +53287 +53288 +53289 +53290 +53291 +53292 +53293 +53294 +53295 +53296 +53297 +53298 +53299 +53300 +53301 +53302 +53303 +53304 +53305 +53306 +53307 +53308 +53309 +53310 +53311 +53312 +53313 +53314 +53315 +53316 +53317 +53318 +53319 +53320 +53321 +53322 +53323 +53324 +53325 +53326 +53327 +53328 +53329 +53330 +53331 +53332 +53333 +53334 +53335 +53336 +53337 +53338 +53339 +53340 +53341 +53342 +53343 +53344 +53345 +53346 +53347 +53348 +53349 +53350 +53351 +53352 +53353 +53354 +53355 +53356 +53357 +53358 +53359 +53360 +53361 +53362 +53363 +53364 +53365 +53366 +53367 +53368 +53369 +53370 +53371 +53372 +53373 +53374 +53375 +53376 +53377 +53378 +53379 +53380 +53381 +53382 +53383 +53384 +53385 +53386 +53387 +53388 +53389 +53390 +53391 +53392 +53393 +53394 +53395 +53396 +53397 +53398 +53399 +53400 +53401 +53402 +53403 +53404 +53405 +53406 +53407 +53408 +53409 +53410 +53411 +53412 +53413 +53414 +53415 +53416 +53417 +53418 +53419 +53420 +53421 +53422 +53423 +53424 +53425 +53426 +53427 +53428 +53429 +53430 +53431 +53432 +53433 +53434 +53435 +53436 +53437 +53438 +53439 +53440 +53441 +53442 +53443 +53444 +53445 +53446 +53447 +53448 +53449 +53450 +53451 +53452 +53453 +53454 +53455 +53456 +53457 +53458 +53459 +53460 +53461 +53462 +53463 +53464 +53465 +53466 +53467 +53468 +53469 +53470 +53471 +53472 +53473 +53474 +53475 +53476 +53477 +53478 +53479 +53480 +53481 +53482 +53483 +53484 +53485 +53486 +53487 +53488 +53489 +53490 +53491 +53492 +53493 +53494 +53495 +53496 +53497 +53498 +53499 +53500 +53501 +53502 +53503 +53504 +53505 +53506 +53507 +53508 +53509 +53510 +53511 +53512 +53513 +53514 +53515 +53516 +53517 +53518 +53519 +53520 +53521 +53522 +53523 +53524 +53525 +53526 +53527 +53528 +53529 +53530 +53531 +53532 +53533 +53534 +53535 +53536 +53537 +53538 +53539 +53540 +53541 +53542 +53543 +53544 +53545 +53546 +53547 +53548 +53549 +53550 +53551 +53552 +53553 +53554 +53555 +53556 +53557 +53558 +53559 +53560 +53561 +53562 +53563 +53564 +53565 +53566 +53567 +53568 +53569 +53570 +53571 +53572 +53573 +53574 +53575 +53576 +53577 +53578 +53579 +53580 +53581 +53582 +53583 +53584 +53585 +53586 +53587 +53588 +53589 +53590 +53591 +53592 +53593 +53594 +53595 +53596 +53597 +53598 +53599 +53600 +53601 +53602 +53603 +53604 +53605 +53606 +53607 +53608 +53609 +53610 +53611 +53612 +53613 +53614 +53615 +53616 +53617 +53618 +53619 +53620 +53621 +53622 +53623 +53624 +53625 +53626 +53627 +53628 +53629 +53630 +53631 +53632 +53633 +53634 +53635 +53636 +53637 +53638 +53639 +53640 +53641 +53642 +53643 +53644 +53645 +53646 +53647 +53648 +53649 +53650 +53651 +53652 +53653 +53654 +53655 +53656 +53657 +53658 +53659 +53660 +53661 +53662 +53663 +53664 +53665 +53666 +53667 +53668 +53669 +53670 +53671 +53672 +53673 +53674 +53675 +53676 +53677 +53678 +53679 +53680 +53681 +53682 +53683 +53684 +53685 +53686 +53687 +53688 +53689 +53690 +53691 +53692 +53693 +53694 +53695 +53696 +53697 +53698 +53699 +53700 +53701 +53702 +53703 +53704 +53705 +53706 +53707 +53708 +53709 +53710 +53711 +53712 +53713 +53714 +53715 +53716 +53717 +53718 +53719 +53720 +53721 +53722 +53723 +53724 +53725 +53726 +53727 +53728 +53729 +53730 +53731 +53732 +53733 +53734 +53735 +53736 +53737 +53738 +53739 +53740 +53741 +53742 +53743 +53744 +53745 +53746 +53747 +53748 +53749 +53750 +53751 +53752 +53753 +53754 +53755 +53756 +53757 +53758 +53759 +53760 +53761 +53762 +53763 +53764 +53765 +53766 +53767 +53768 +53769 +53770 +53771 +53772 +53773 +53774 +53775 +53776 +53777 +53778 +53779 +53780 +53781 +53782 +53783 +53784 +53785 +53786 +53787 +53788 +53789 +53790 +53791 +53792 +53793 +53794 +53795 +53796 +53797 +53798 +53799 +53800 +53801 +53802 +53803 +53804 +53805 +53806 +53807 +53808 +53809 +53810 +53811 +53812 +53813 +53814 +53815 +53816 +53817 +53818 +53819 +53820 +53821 +53822 +53823 +53824 +53825 +53826 +53827 +53828 +53829 +53830 +53831 +53832 +53833 +53834 +53835 +53836 +53837 +53838 +53839 +53840 +53841 +53842 +53843 +53844 +53845 +53846 +53847 +53848 +53849 +53850 +53851 +53852 +53853 +53854 +53855 +53856 +53857 +53858 +53859 +53860 +53861 +53862 +53863 +53864 +53865 +53866 +53867 +53868 +53869 +53870 +53871 +53872 +53873 +53874 +53875 +53876 +53877 +53878 +53879 +53880 +53881 +53882 +53883 +53884 +53885 +53886 +53887 +53888 +53889 +53890 +53891 +53892 +53893 +53894 +53895 +53896 +53897 +53898 +53899 +53900 +53901 +53902 +53903 +53904 +53905 +53906 +53907 +53908 +53909 +53910 +53911 +53912 +53913 +53914 +53915 +53916 +53917 +53918 +53919 +53920 +53921 +53922 +53923 +53924 +53925 +53926 +53927 +53928 +53929 +53930 +53931 +53932 +53933 +53934 +53935 +53936 +53937 +53938 +53939 +53940 +53941 +53942 +53943 +53944 +53945 +53946 +53947 +53948 +53949 +53950 +53951 +53952 +53953 +53954 +53955 +53956 +53957 +53958 +53959 +53960 +53961 +53962 +53963 +53964 +53965 +53966 +53967 +53968 +53969 +53970 +53971 +53972 +53973 +53974 +53975 +53976 +53977 +53978 +53979 +53980 +53981 +53982 +53983 +53984 +53985 +53986 +53987 +53988 +53989 +53990 +53991 +53992 +53993 +53994 +53995 +53996 +53997 +53998 +53999 +54000 +54001 +54002 +54003 +54004 +54005 +54006 +54007 +54008 +54009 +54010 +54011 +54012 +54013 +54014 +54015 +54016 +54017 +54018 +54019 +54020 +54021 +54022 +54023 +54024 +54025 +54026 +54027 +54028 +54029 +54030 +54031 +54032 +54033 +54034 +54035 +54036 +54037 +54038 +54039 +54040 +54041 +54042 +54043 +54044 +54045 +54046 +54047 +54048 +54049 +54050 +54051 +54052 +54053 +54054 +54055 +54056 +54057 +54058 +54059 +54060 +54061 +54062 +54063 +54064 +54065 +54066 +54067 +54068 +54069 +54070 +54071 +54072 +54073 +54074 +54075 +54076 +54077 +54078 +54079 +54080 +54081 +54082 +54083 +54084 +54085 +54086 +54087 +54088 +54089 +54090 +54091 +54092 +54093 +54094 +54095 +54096 +54097 +54098 +54099 +54100 +54101 +54102 +54103 +54104 +54105 +54106 +54107 +54108 +54109 +54110 +54111 +54112 +54113 +54114 +54115 +54116 +54117 +54118 +54119 +54120 +54121 +54122 +54123 +54124 +54125 +54126 +54127 +54128 +54129 +54130 +54131 +54132 +54133 +54134 +54135 +54136 +54137 +54138 +54139 +54140 +54141 +54142 +54143 +54144 +54145 +54146 +54147 +54148 +54149 +54150 +54151 +54152 +54153 +54154 +54155 +54156 +54157 +54158 +54159 +54160 +54161 +54162 +54163 +54164 +54165 +54166 +54167 +54168 +54169 +54170 +54171 +54172 +54173 +54174 +54175 +54176 +54177 +54178 +54179 +54180 +54181 +54182 +54183 +54184 +54185 +54186 +54187 +54188 +54189 +54190 +54191 +54192 +54193 +54194 +54195 +54196 +54197 +54198 +54199 +54200 +54201 +54202 +54203 +54204 +54205 +54206 +54207 +54208 +54209 +54210 +54211 +54212 +54213 +54214 +54215 +54216 +54217 +54218 +54219 +54220 +54221 +54222 +54223 +54224 +54225 +54226 +54227 +54228 +54229 +54230 +54231 +54232 +54233 +54234 +54235 +54236 +54237 +54238 +54239 +54240 +54241 +54242 +54243 +54244 +54245 +54246 +54247 +54248 +54249 +54250 +54251 +54252 +54253 +54254 +54255 +54256 +54257 +54258 +54259 +54260 +54261 +54262 +54263 +54264 +54265 +54266 +54267 +54268 +54269 +54270 +54271 +54272 +54273 +54274 +54275 +54276 +54277 +54278 +54279 +54280 +54281 +54282 +54283 +54284 +54285 +54286 +54287 +54288 +54289 +54290 +54291 +54292 +54293 +54294 +54295 +54296 +54297 +54298 +54299 +54300 +54301 +54302 +54303 +54304 +54305 +54306 +54307 +54308 +54309 +54310 +54311 +54312 +54313 +54314 +54315 +54316 +54317 +54318 +54319 +54320 +54321 +54322 +54323 +54324 +54325 +54326 +54327 +54328 +54329 +54330 +54331 +54332 +54333 +54334 +54335 +54336 +54337 +54338 +54339 +54340 +54341 +54342 +54343 +54344 +54345 +54346 +54347 +54348 +54349 +54350 +54351 +54352 +54353 +54354 +54355 +54356 +54357 +54358 +54359 +54360 +54361 +54362 +54363 +54364 +54365 +54366 +54367 +54368 +54369 +54370 +54371 +54372 +54373 +54374 +54375 +54376 +54377 +54378 +54379 +54380 +54381 +54382 +54383 +54384 +54385 +54386 +54387 +54388 +54389 +54390 +54391 +54392 +54393 +54394 +54395 +54396 +54397 +54398 +54399 +54400 +54401 +54402 +54403 +54404 +54405 +54406 +54407 +54408 +54409 +54410 +54411 +54412 +54413 +54414 +54415 +54416 +54417 +54418 +54419 +54420 +54421 +54422 +54423 +54424 +54425 +54426 +54427 +54428 +54429 +54430 +54431 +54432 +54433 +54434 +54435 +54436 +54437 +54438 +54439 +54440 +54441 +54442 +54443 +54444 +54445 +54446 +54447 +54448 +54449 +54450 +54451 +54452 +54453 +54454 +54455 +54456 +54457 +54458 +54459 +54460 +54461 +54462 +54463 +54464 +54465 +54466 +54467 +54468 +54469 +54470 +54471 +54472 +54473 +54474 +54475 +54476 +54477 +54478 +54479 +54480 +54481 +54482 +54483 +54484 +54485 +54486 +54487 +54488 +54489 +54490 +54491 +54492 +54493 +54494 +54495 +54496 +54497 +54498 +54499 +54500 +54501 +54502 +54503 +54504 +54505 +54506 +54507 +54508 +54509 +54510 +54511 +54512 +54513 +54514 +54515 +54516 +54517 +54518 +54519 +54520 +54521 +54522 +54523 +54524 +54525 +54526 +54527 +54528 +54529 +54530 +54531 +54532 +54533 +54534 +54535 +54536 +54537 +54538 +54539 +54540 +54541 +54542 +54543 +54544 +54545 +54546 +54547 +54548 +54549 +54550 +54551 +54552 +54553 +54554 +54555 +54556 +54557 +54558 +54559 +54560 +54561 +54562 +54563 +54564 +54565 +54566 +54567 +54568 +54569 +54570 +54571 +54572 +54573 +54574 +54575 +54576 +54577 +54578 +54579 +54580 +54581 +54582 +54583 +54584 +54585 +54586 +54587 +54588 +54589 +54590 +54591 +54592 +54593 +54594 +54595 +54596 +54597 +54598 +54599 +54600 +54601 +54602 +54603 +54604 +54605 +54606 +54607 +54608 +54609 +54610 +54611 +54612 +54613 +54614 +54615 +54616 +54617 +54618 +54619 +54620 +54621 +54622 +54623 +54624 +54625 +54626 +54627 +54628 +54629 +54630 +54631 +54632 +54633 +54634 +54635 +54636 +54637 +54638 +54639 +54640 +54641 +54642 +54643 +54644 +54645 +54646 +54647 +54648 +54649 +54650 +54651 +54652 +54653 +54654 +54655 +54656 +54657 +54658 +54659 +54660 +54661 +54662 +54663 +54664 +54665 +54666 +54667 +54668 +54669 +54670 +54671 +54672 +54673 +54674 +54675 +54676 +54677 +54678 +54679 +54680 +54681 +54682 +54683 +54684 +54685 +54686 +54687 +54688 +54689 +54690 +54691 +54692 +54693 +54694 +54695 +54696 +54697 +54698 +54699 +54700 +54701 +54702 +54703 +54704 +54705 +54706 +54707 +54708 +54709 +54710 +54711 +54712 +54713 +54714 +54715 +54716 +54717 +54718 +54719 +54720 +54721 +54722 +54723 +54724 +54725 +54726 +54727 +54728 +54729 +54730 +54731 +54732 +54733 +54734 +54735 +54736 +54737 +54738 +54739 +54740 +54741 +54742 +54743 +54744 +54745 +54746 +54747 +54748 +54749 +54750 +54751 +54752 +54753 +54754 +54755 +54756 +54757 +54758 +54759 +54760 +54761 +54762 +54763 +54764 +54765 +54766 +54767 +54768 +54769 +54770 +54771 +54772 +54773 +54774 +54775 +54776 +54777 +54778 +54779 +54780 +54781 +54782 +54783 +54784 +54785 +54786 +54787 +54788 +54789 +54790 +54791 +54792 +54793 +54794 +54795 +54796 +54797 +54798 +54799 +54800 +54801 +54802 +54803 +54804 +54805 +54806 +54807 +54808 +54809 +54810 +54811 +54812 +54813 +54814 +54815 +54816 +54817 +54818 +54819 +54820 +54821 +54822 +54823 +54824 +54825 +54826 +54827 +54828 +54829 +54830 +54831 +54832 +54833 +54834 +54835 +54836 +54837 +54838 +54839 +54840 +54841 +54842 +54843 +54844 +54845 +54846 +54847 +54848 +54849 +54850 +54851 +54852 +54853 +54854 +54855 +54856 +54857 +54858 +54859 +54860 +54861 +54862 +54863 +54864 +54865 +54866 +54867 +54868 +54869 +54870 +54871 +54872 +54873 +54874 +54875 +54876 +54877 +54878 +54879 +54880 +54881 +54882 +54883 +54884 +54885 +54886 +54887 +54888 +54889 +54890 +54891 +54892 +54893 +54894 +54895 +54896 +54897 +54898 +54899 +54900 +54901 +54902 +54903 +54904 +54905 +54906 +54907 +54908 +54909 +54910 +54911 +54912 +54913 +54914 +54915 +54916 +54917 +54918 +54919 +54920 +54921 +54922 +54923 +54924 +54925 +54926 +54927 +54928 +54929 +54930 +54931 +54932 +54933 +54934 +54935 +54936 +54937 +54938 +54939 +54940 +54941 +54942 +54943 +54944 +54945 +54946 +54947 +54948 +54949 +54950 +54951 +54952 +54953 +54954 +54955 +54956 +54957 +54958 +54959 +54960 +54961 +54962 +54963 +54964 +54965 +54966 +54967 +54968 +54969 +54970 +54971 +54972 +54973 +54974 +54975 +54976 +54977 +54978 +54979 +54980 +54981 +54982 +54983 +54984 +54985 +54986 +54987 +54988 +54989 +54990 +54991 +54992 +54993 +54994 +54995 +54996 +54997 +54998 +54999 +55000 +55001 +55002 +55003 +55004 +55005 +55006 +55007 +55008 +55009 +55010 +55011 +55012 +55013 +55014 +55015 +55016 +55017 +55018 +55019 +55020 +55021 +55022 +55023 +55024 +55025 +55026 +55027 +55028 +55029 +55030 +55031 +55032 +55033 +55034 +55035 +55036 +55037 +55038 +55039 +55040 +55041 +55042 +55043 +55044 +55045 +55046 +55047 +55048 +55049 +55050 +55051 +55052 +55053 +55054 +55055 +55056 +55057 +55058 +55059 +55060 +55061 +55062 +55063 +55064 +55065 +55066 +55067 +55068 +55069 +55070 +55071 +55072 +55073 +55074 +55075 +55076 +55077 +55078 +55079 +55080 +55081 +55082 +55083 +55084 +55085 +55086 +55087 +55088 +55089 +55090 +55091 +55092 +55093 +55094 +55095 +55096 +55097 +55098 +55099 +55100 +55101 +55102 +55103 +55104 +55105 +55106 +55107 +55108 +55109 +55110 +55111 +55112 +55113 +55114 +55115 +55116 +55117 +55118 +55119 +55120 +55121 +55122 +55123 +55124 +55125 +55126 +55127 +55128 +55129 +55130 +55131 +55132 +55133 +55134 +55135 +55136 +55137 +55138 +55139 +55140 +55141 +55142 +55143 +55144 +55145 +55146 +55147 +55148 +55149 +55150 +55151 +55152 +55153 +55154 +55155 +55156 +55157 +55158 +55159 +55160 +55161 +55162 +55163 +55164 +55165 +55166 +55167 +55168 +55169 +55170 +55171 +55172 +55173 +55174 +55175 +55176 +55177 +55178 +55179 +55180 +55181 +55182 +55183 +55184 +55185 +55186 +55187 +55188 +55189 +55190 +55191 +55192 +55193 +55194 +55195 +55196 +55197 +55198 +55199 +55200 +55201 +55202 +55203 +55204 +55205 +55206 +55207 +55208 +55209 +55210 +55211 +55212 +55213 +55214 +55215 +55216 +55217 +55218 +55219 +55220 +55221 +55222 +55223 +55224 +55225 +55226 +55227 +55228 +55229 +55230 +55231 +55232 +55233 +55234 +55235 +55236 +55237 +55238 +55239 +55240 +55241 +55242 +55243 +55244 +55245 +55246 +55247 +55248 +55249 +55250 +55251 +55252 +55253 +55254 +55255 +55256 +55257 +55258 +55259 +55260 +55261 +55262 +55263 +55264 +55265 +55266 +55267 +55268 +55269 +55270 +55271 +55272 +55273 +55274 +55275 +55276 +55277 +55278 +55279 +55280 +55281 +55282 +55283 +55284 +55285 +55286 +55287 +55288 +55289 +55290 +55291 +55292 +55293 +55294 +55295 +55296 +55297 +55298 +55299 +55300 +55301 +55302 +55303 +55304 +55305 +55306 +55307 +55308 +55309 +55310 +55311 +55312 +55313 +55314 +55315 +55316 +55317 +55318 +55319 +55320 +55321 +55322 +55323 +55324 +55325 +55326 +55327 +55328 +55329 +55330 +55331 +55332 +55333 +55334 +55335 +55336 +55337 +55338 +55339 +55340 +55341 +55342 +55343 +55344 +55345 +55346 +55347 +55348 +55349 +55350 +55351 +55352 +55353 +55354 +55355 +55356 +55357 +55358 +55359 +55360 +55361 +55362 +55363 +55364 +55365 +55366 +55367 +55368 +55369 +55370 +55371 +55372 +55373 +55374 +55375 +55376 +55377 +55378 +55379 +55380 +55381 +55382 +55383 +55384 +55385 +55386 +55387 +55388 +55389 +55390 +55391 +55392 +55393 +55394 +55395 +55396 +55397 +55398 +55399 +55400 +55401 +55402 +55403 +55404 +55405 +55406 +55407 +55408 +55409 +55410 +55411 +55412 +55413 +55414 +55415 +55416 +55417 +55418 +55419 +55420 +55421 +55422 +55423 +55424 +55425 +55426 +55427 +55428 +55429 +55430 +55431 +55432 +55433 +55434 +55435 +55436 +55437 +55438 +55439 +55440 +55441 +55442 +55443 +55444 +55445 +55446 +55447 +55448 +55449 +55450 +55451 +55452 +55453 +55454 +55455 +55456 +55457 +55458 +55459 +55460 +55461 +55462 +55463 +55464 +55465 +55466 +55467 +55468 +55469 +55470 +55471 +55472 +55473 +55474 +55475 +55476 +55477 +55478 +55479 +55480 +55481 +55482 +55483 +55484 +55485 +55486 +55487 +55488 +55489 +55490 +55491 +55492 +55493 +55494 +55495 +55496 +55497 +55498 +55499 +55500 +55501 +55502 +55503 +55504 +55505 +55506 +55507 +55508 +55509 +55510 +55511 +55512 +55513 +55514 +55515 +55516 +55517 +55518 +55519 +55520 +55521 +55522 +55523 +55524 +55525 +55526 +55527 +55528 +55529 +55530 +55531 +55532 +55533 +55534 +55535 +55536 +55537 +55538 +55539 +55540 +55541 +55542 +55543 +55544 +55545 +55546 +55547 +55548 +55549 +55550 +55551 +55552 +55553 +55554 +55555 +55556 +55557 +55558 +55559 +55560 +55561 +55562 +55563 +55564 +55565 +55566 +55567 +55568 +55569 +55570 +55571 +55572 +55573 +55574 +55575 +55576 +55577 +55578 +55579 +55580 +55581 +55582 +55583 +55584 +55585 +55586 +55587 +55588 +55589 +55590 +55591 +55592 +55593 +55594 +55595 +55596 +55597 +55598 +55599 +55600 +55601 +55602 +55603 +55604 +55605 +55606 +55607 +55608 +55609 +55610 +55611 +55612 +55613 +55614 +55615 +55616 +55617 +55618 +55619 +55620 +55621 +55622 +55623 +55624 +55625 +55626 +55627 +55628 +55629 +55630 +55631 +55632 +55633 +55634 +55635 +55636 +55637 +55638 +55639 +55640 +55641 +55642 +55643 +55644 +55645 +55646 +55647 +55648 +55649 +55650 +55651 +55652 +55653 +55654 +55655 +55656 +55657 +55658 +55659 +55660 +55661 +55662 +55663 +55664 +55665 +55666 +55667 +55668 +55669 +55670 +55671 +55672 +55673 +55674 +55675 +55676 +55677 +55678 +55679 +55680 +55681 +55682 +55683 +55684 +55685 +55686 +55687 +55688 +55689 +55690 +55691 +55692 +55693 +55694 +55695 +55696 +55697 +55698 +55699 +55700 +55701 +55702 +55703 +55704 +55705 +55706 +55707 +55708 +55709 +55710 +55711 +55712 +55713 +55714 +55715 +55716 +55717 +55718 +55719 +55720 +55721 +55722 +55723 +55724 +55725 +55726 +55727 +55728 +55729 +55730 +55731 +55732 +55733 +55734 +55735 +55736 +55737 +55738 +55739 +55740 +55741 +55742 +55743 +55744 +55745 +55746 +55747 +55748 +55749 +55750 +55751 +55752 +55753 +55754 +55755 +55756 +55757 +55758 +55759 +55760 +55761 +55762 +55763 +55764 +55765 +55766 +55767 +55768 +55769 +55770 +55771 +55772 +55773 +55774 +55775 +55776 +55777 +55778 +55779 +55780 +55781 +55782 +55783 +55784 +55785 +55786 +55787 +55788 +55789 +55790 +55791 +55792 +55793 +55794 +55795 +55796 +55797 +55798 +55799 +55800 +55801 +55802 +55803 +55804 +55805 +55806 +55807 +55808 +55809 +55810 +55811 +55812 +55813 +55814 +55815 +55816 +55817 +55818 +55819 +55820 +55821 +55822 +55823 +55824 +55825 +55826 +55827 +55828 +55829 +55830 +55831 +55832 +55833 +55834 +55835 +55836 +55837 +55838 +55839 +55840 +55841 +55842 +55843 +55844 +55845 +55846 +55847 +55848 +55849 +55850 +55851 +55852 +55853 +55854 +55855 +55856 +55857 +55858 +55859 +55860 +55861 +55862 +55863 +55864 +55865 +55866 +55867 +55868 +55869 +55870 +55871 +55872 +55873 +55874 +55875 +55876 +55877 +55878 +55879 +55880 +55881 +55882 +55883 +55884 +55885 +55886 +55887 +55888 +55889 +55890 +55891 +55892 +55893 +55894 +55895 +55896 +55897 +55898 +55899 +55900 +55901 +55902 +55903 +55904 +55905 +55906 +55907 +55908 +55909 +55910 +55911 +55912 +55913 +55914 +55915 +55916 +55917 +55918 +55919 +55920 +55921 +55922 +55923 +55924 +55925 +55926 +55927 +55928 +55929 +55930 +55931 +55932 +55933 +55934 +55935 +55936 +55937 +55938 +55939 +55940 +55941 +55942 +55943 +55944 +55945 +55946 +55947 +55948 +55949 +55950 +55951 +55952 +55953 +55954 +55955 +55956 +55957 +55958 +55959 +55960 +55961 +55962 +55963 +55964 +55965 +55966 +55967 +55968 +55969 +55970 +55971 +55972 +55973 +55974 +55975 +55976 +55977 +55978 +55979 +55980 +55981 +55982 +55983 +55984 +55985 +55986 +55987 +55988 +55989 +55990 +55991 +55992 +55993 +55994 +55995 +55996 +55997 +55998 +55999 +56000 +56001 +56002 +56003 +56004 +56005 +56006 +56007 +56008 +56009 +56010 +56011 +56012 +56013 +56014 +56015 +56016 +56017 +56018 +56019 +56020 +56021 +56022 +56023 +56024 +56025 +56026 +56027 +56028 +56029 +56030 +56031 +56032 +56033 +56034 +56035 +56036 +56037 +56038 +56039 +56040 +56041 +56042 +56043 +56044 +56045 +56046 +56047 +56048 +56049 +56050 +56051 +56052 +56053 +56054 +56055 +56056 +56057 +56058 +56059 +56060 +56061 +56062 +56063 +56064 +56065 +56066 +56067 +56068 +56069 +56070 +56071 +56072 +56073 +56074 +56075 +56076 +56077 +56078 +56079 +56080 +56081 +56082 +56083 +56084 +56085 +56086 +56087 +56088 +56089 +56090 +56091 +56092 +56093 +56094 +56095 +56096 +56097 +56098 +56099 +56100 +56101 +56102 +56103 +56104 +56105 +56106 +56107 +56108 +56109 +56110 +56111 +56112 +56113 +56114 +56115 +56116 +56117 +56118 +56119 +56120 +56121 +56122 +56123 +56124 +56125 +56126 +56127 +56128 +56129 +56130 +56131 +56132 +56133 +56134 +56135 +56136 +56137 +56138 +56139 +56140 +56141 +56142 +56143 +56144 +56145 +56146 +56147 +56148 +56149 +56150 +56151 +56152 +56153 +56154 +56155 +56156 +56157 +56158 +56159 +56160 +56161 +56162 +56163 +56164 +56165 +56166 +56167 +56168 +56169 +56170 +56171 +56172 +56173 +56174 +56175 +56176 +56177 +56178 +56179 +56180 +56181 +56182 +56183 +56184 +56185 +56186 +56187 +56188 +56189 +56190 +56191 +56192 +56193 +56194 +56195 +56196 +56197 +56198 +56199 +56200 +56201 +56202 +56203 +56204 +56205 +56206 +56207 +56208 +56209 +56210 +56211 +56212 +56213 +56214 +56215 +56216 +56217 +56218 +56219 +56220 +56221 +56222 +56223 +56224 +56225 +56226 +56227 +56228 +56229 +56230 +56231 +56232 +56233 +56234 +56235 +56236 +56237 +56238 +56239 +56240 +56241 +56242 +56243 +56244 +56245 +56246 +56247 +56248 +56249 +56250 +56251 +56252 +56253 +56254 +56255 +56256 +56257 +56258 +56259 +56260 +56261 +56262 +56263 +56264 +56265 +56266 +56267 +56268 +56269 +56270 +56271 +56272 +56273 +56274 +56275 +56276 +56277 +56278 +56279 +56280 +56281 +56282 +56283 +56284 +56285 +56286 +56287 +56288 +56289 +56290 +56291 +56292 +56293 +56294 +56295 +56296 +56297 +56298 +56299 +56300 +56301 +56302 +56303 +56304 +56305 +56306 +56307 +56308 +56309 +56310 +56311 +56312 +56313 +56314 +56315 +56316 +56317 +56318 +56319 +56320 +56321 +56322 +56323 +56324 +56325 +56326 +56327 +56328 +56329 +56330 +56331 +56332 +56333 +56334 +56335 +56336 +56337 +56338 +56339 +56340 +56341 +56342 +56343 +56344 +56345 +56346 +56347 +56348 +56349 +56350 +56351 +56352 +56353 +56354 +56355 +56356 +56357 +56358 +56359 +56360 +56361 +56362 +56363 +56364 +56365 +56366 +56367 +56368 +56369 +56370 +56371 +56372 +56373 +56374 +56375 +56376 +56377 +56378 +56379 +56380 +56381 +56382 +56383 +56384 +56385 +56386 +56387 +56388 +56389 +56390 +56391 +56392 +56393 +56394 +56395 +56396 +56397 +56398 +56399 +56400 +56401 +56402 +56403 +56404 +56405 +56406 +56407 +56408 +56409 +56410 +56411 +56412 +56413 +56414 +56415 +56416 +56417 +56418 +56419 +56420 +56421 +56422 +56423 +56424 +56425 +56426 +56427 +56428 +56429 +56430 +56431 +56432 +56433 +56434 +56435 +56436 +56437 +56438 +56439 +56440 +56441 +56442 +56443 +56444 +56445 +56446 +56447 +56448 +56449 +56450 +56451 +56452 +56453 +56454 +56455 +56456 +56457 +56458 +56459 +56460 +56461 +56462 +56463 +56464 +56465 +56466 +56467 +56468 +56469 +56470 +56471 +56472 +56473 +56474 +56475 +56476 +56477 +56478 +56479 +56480 +56481 +56482 +56483 +56484 +56485 +56486 +56487 +56488 +56489 +56490 +56491 +56492 +56493 +56494 +56495 +56496 +56497 +56498 +56499 +56500 +56501 +56502 +56503 +56504 +56505 +56506 +56507 +56508 +56509 +56510 +56511 +56512 +56513 +56514 +56515 +56516 +56517 +56518 +56519 +56520 +56521 +56522 +56523 +56524 +56525 +56526 +56527 +56528 +56529 +56530 +56531 +56532 +56533 +56534 +56535 +56536 +56537 +56538 +56539 +56540 +56541 +56542 +56543 +56544 +56545 +56546 +56547 +56548 +56549 +56550 +56551 +56552 +56553 +56554 +56555 +56556 +56557 +56558 +56559 +56560 +56561 +56562 +56563 +56564 +56565 +56566 +56567 +56568 +56569 +56570 +56571 +56572 +56573 +56574 +56575 +56576 +56577 +56578 +56579 +56580 +56581 +56582 +56583 +56584 +56585 +56586 +56587 +56588 +56589 +56590 +56591 +56592 +56593 +56594 +56595 +56596 +56597 +56598 +56599 +56600 +56601 +56602 +56603 +56604 +56605 +56606 +56607 +56608 +56609 +56610 +56611 +56612 +56613 +56614 +56615 +56616 +56617 +56618 +56619 +56620 +56621 +56622 +56623 +56624 +56625 +56626 +56627 +56628 +56629 +56630 +56631 +56632 +56633 +56634 +56635 +56636 +56637 +56638 +56639 +56640 +56641 +56642 +56643 +56644 +56645 +56646 +56647 +56648 +56649 +56650 +56651 +56652 +56653 +56654 +56655 +56656 +56657 +56658 +56659 +56660 +56661 +56662 +56663 +56664 +56665 +56666 +56667 +56668 +56669 +56670 +56671 +56672 +56673 +56674 +56675 +56676 +56677 +56678 +56679 +56680 +56681 +56682 +56683 +56684 +56685 +56686 +56687 +56688 +56689 +56690 +56691 +56692 +56693 +56694 +56695 +56696 +56697 +56698 +56699 +56700 +56701 +56702 +56703 +56704 +56705 +56706 +56707 +56708 +56709 +56710 +56711 +56712 +56713 +56714 +56715 +56716 +56717 +56718 +56719 +56720 +56721 +56722 +56723 +56724 +56725 +56726 +56727 +56728 +56729 +56730 +56731 +56732 +56733 +56734 +56735 +56736 +56737 +56738 +56739 +56740 +56741 +56742 +56743 +56744 +56745 +56746 +56747 +56748 +56749 +56750 +56751 +56752 +56753 +56754 +56755 +56756 +56757 +56758 +56759 +56760 +56761 +56762 +56763 +56764 +56765 +56766 +56767 +56768 +56769 +56770 +56771 +56772 +56773 +56774 +56775 +56776 +56777 +56778 +56779 +56780 +56781 +56782 +56783 +56784 +56785 +56786 +56787 +56788 +56789 +56790 +56791 +56792 +56793 +56794 +56795 +56796 +56797 +56798 +56799 +56800 +56801 +56802 +56803 +56804 +56805 +56806 +56807 +56808 +56809 +56810 +56811 +56812 +56813 +56814 +56815 +56816 +56817 +56818 +56819 +56820 +56821 +56822 +56823 +56824 +56825 +56826 +56827 +56828 +56829 +56830 +56831 +56832 +56833 +56834 +56835 +56836 +56837 +56838 +56839 +56840 +56841 +56842 +56843 +56844 +56845 +56846 +56847 +56848 +56849 +56850 +56851 +56852 +56853 +56854 +56855 +56856 +56857 +56858 +56859 +56860 +56861 +56862 +56863 +56864 +56865 +56866 +56867 +56868 +56869 +56870 +56871 +56872 +56873 +56874 +56875 +56876 +56877 +56878 +56879 +56880 +56881 +56882 +56883 +56884 +56885 +56886 +56887 +56888 +56889 +56890 +56891 +56892 +56893 +56894 +56895 +56896 +56897 +56898 +56899 +56900 +56901 +56902 +56903 +56904 +56905 +56906 +56907 +56908 +56909 +56910 +56911 +56912 +56913 +56914 +56915 +56916 +56917 +56918 +56919 +56920 +56921 +56922 +56923 +56924 +56925 +56926 +56927 +56928 +56929 +56930 +56931 +56932 +56933 +56934 +56935 +56936 +56937 +56938 +56939 +56940 +56941 +56942 +56943 +56944 +56945 +56946 +56947 +56948 +56949 +56950 +56951 +56952 +56953 +56954 +56955 +56956 +56957 +56958 +56959 +56960 +56961 +56962 +56963 +56964 +56965 +56966 +56967 +56968 +56969 +56970 +56971 +56972 +56973 +56974 +56975 +56976 +56977 +56978 +56979 +56980 +56981 +56982 +56983 +56984 +56985 +56986 +56987 +56988 +56989 +56990 +56991 +56992 +56993 +56994 +56995 +56996 +56997 +56998 +56999 +57000 +57001 +57002 +57003 +57004 +57005 +57006 +57007 +57008 +57009 +57010 +57011 +57012 +57013 +57014 +57015 +57016 +57017 +57018 +57019 +57020 +57021 +57022 +57023 +57024 +57025 +57026 +57027 +57028 +57029 +57030 +57031 +57032 +57033 +57034 +57035 +57036 +57037 +57038 +57039 +57040 +57041 +57042 +57043 +57044 +57045 +57046 +57047 +57048 +57049 +57050 +57051 +57052 +57053 +57054 +57055 +57056 +57057 +57058 +57059 +57060 +57061 +57062 +57063 +57064 +57065 +57066 +57067 +57068 +57069 +57070 +57071 +57072 +57073 +57074 +57075 +57076 +57077 +57078 +57079 +57080 +57081 +57082 +57083 +57084 +57085 +57086 +57087 +57088 +57089 +57090 +57091 +57092 +57093 +57094 +57095 +57096 +57097 +57098 +57099 +57100 +57101 +57102 +57103 +57104 +57105 +57106 +57107 +57108 +57109 +57110 +57111 +57112 +57113 +57114 +57115 +57116 +57117 +57118 +57119 +57120 +57121 +57122 +57123 +57124 +57125 +57126 +57127 +57128 +57129 +57130 +57131 +57132 +57133 +57134 +57135 +57136 +57137 +57138 +57139 +57140 +57141 +57142 +57143 +57144 +57145 +57146 +57147 +57148 +57149 +57150 +57151 +57152 +57153 +57154 +57155 +57156 +57157 +57158 +57159 +57160 +57161 +57162 +57163 +57164 +57165 +57166 +57167 +57168 +57169 +57170 +57171 +57172 +57173 +57174 +57175 +57176 +57177 +57178 +57179 +57180 +57181 +57182 +57183 +57184 +57185 +57186 +57187 +57188 +57189 +57190 +57191 +57192 +57193 +57194 +57195 +57196 +57197 +57198 +57199 +57200 +57201 +57202 +57203 +57204 +57205 +57206 +57207 +57208 +57209 +57210 +57211 +57212 +57213 +57214 +57215 +57216 +57217 +57218 +57219 +57220 +57221 +57222 +57223 +57224 +57225 +57226 +57227 +57228 +57229 +57230 +57231 +57232 +57233 +57234 +57235 +57236 +57237 +57238 +57239 +57240 +57241 +57242 +57243 +57244 +57245 +57246 +57247 +57248 +57249 +57250 +57251 +57252 +57253 +57254 +57255 +57256 +57257 +57258 +57259 +57260 +57261 +57262 +57263 +57264 +57265 +57266 +57267 +57268 +57269 +57270 +57271 +57272 +57273 +57274 +57275 +57276 +57277 +57278 +57279 +57280 +57281 +57282 +57283 +57284 +57285 +57286 +57287 +57288 +57289 +57290 +57291 +57292 +57293 +57294 +57295 +57296 +57297 +57298 +57299 +57300 +57301 +57302 +57303 +57304 +57305 +57306 +57307 +57308 +57309 +57310 +57311 +57312 +57313 +57314 +57315 +57316 +57317 +57318 +57319 +57320 +57321 +57322 +57323 +57324 +57325 +57326 +57327 +57328 +57329 +57330 +57331 +57332 +57333 +57334 +57335 +57336 +57337 +57338 +57339 +57340 +57341 +57342 +57343 +57344 +57345 +57346 +57347 +57348 +57349 +57350 +57351 +57352 +57353 +57354 +57355 +57356 +57357 +57358 +57359 +57360 +57361 +57362 +57363 +57364 +57365 +57366 +57367 +57368 +57369 +57370 +57371 +57372 +57373 +57374 +57375 +57376 +57377 +57378 +57379 +57380 +57381 +57382 +57383 +57384 +57385 +57386 +57387 +57388 +57389 +57390 +57391 +57392 +57393 +57394 +57395 +57396 +57397 +57398 +57399 +57400 +57401 +57402 +57403 +57404 +57405 +57406 +57407 +57408 +57409 +57410 +57411 +57412 +57413 +57414 +57415 +57416 +57417 +57418 +57419 +57420 +57421 +57422 +57423 +57424 +57425 +57426 +57427 +57428 +57429 +57430 +57431 +57432 +57433 +57434 +57435 +57436 +57437 +57438 +57439 +57440 +57441 +57442 +57443 +57444 +57445 +57446 +57447 +57448 +57449 +57450 +57451 +57452 +57453 +57454 +57455 +57456 +57457 +57458 +57459 +57460 +57461 +57462 +57463 +57464 +57465 +57466 +57467 +57468 +57469 +57470 +57471 +57472 +57473 +57474 +57475 +57476 +57477 +57478 +57479 +57480 +57481 +57482 +57483 +57484 +57485 +57486 +57487 +57488 +57489 +57490 +57491 +57492 +57493 +57494 +57495 +57496 +57497 +57498 +57499 +57500 +57501 +57502 +57503 +57504 +57505 +57506 +57507 +57508 +57509 +57510 +57511 +57512 +57513 +57514 +57515 +57516 +57517 +57518 +57519 +57520 +57521 +57522 +57523 +57524 +57525 +57526 +57527 +57528 +57529 +57530 +57531 +57532 +57533 +57534 +57535 +57536 +57537 +57538 +57539 +57540 +57541 +57542 +57543 +57544 +57545 +57546 +57547 +57548 +57549 +57550 +57551 +57552 +57553 +57554 +57555 +57556 +57557 +57558 +57559 +57560 +57561 +57562 +57563 +57564 +57565 +57566 +57567 +57568 +57569 +57570 +57571 +57572 +57573 +57574 +57575 +57576 +57577 +57578 +57579 +57580 +57581 +57582 +57583 +57584 +57585 +57586 +57587 +57588 +57589 +57590 +57591 +57592 +57593 +57594 +57595 +57596 +57597 +57598 +57599 +57600 +57601 +57602 +57603 +57604 +57605 +57606 +57607 +57608 +57609 +57610 +57611 +57612 +57613 +57614 +57615 +57616 +57617 +57618 +57619 +57620 +57621 +57622 +57623 +57624 +57625 +57626 +57627 +57628 +57629 +57630 +57631 +57632 +57633 +57634 +57635 +57636 +57637 +57638 +57639 +57640 +57641 +57642 +57643 +57644 +57645 +57646 +57647 +57648 +57649 +57650 +57651 +57652 +57653 +57654 +57655 +57656 +57657 +57658 +57659 +57660 +57661 +57662 +57663 +57664 +57665 +57666 +57667 +57668 +57669 +57670 +57671 +57672 +57673 +57674 +57675 +57676 +57677 +57678 +57679 +57680 +57681 +57682 +57683 +57684 +57685 +57686 +57687 +57688 +57689 +57690 +57691 +57692 +57693 +57694 +57695 +57696 +57697 +57698 +57699 +57700 +57701 +57702 +57703 +57704 +57705 +57706 +57707 +57708 +57709 +57710 +57711 +57712 +57713 +57714 +57715 +57716 +57717 +57718 +57719 +57720 +57721 +57722 +57723 +57724 +57725 +57726 +57727 +57728 +57729 +57730 +57731 +57732 +57733 +57734 +57735 +57736 +57737 +57738 +57739 +57740 +57741 +57742 +57743 +57744 +57745 +57746 +57747 +57748 +57749 +57750 +57751 +57752 +57753 +57754 +57755 +57756 +57757 +57758 +57759 +57760 +57761 +57762 +57763 +57764 +57765 +57766 +57767 +57768 +57769 +57770 +57771 +57772 +57773 +57774 +57775 +57776 +57777 +57778 +57779 +57780 +57781 +57782 +57783 +57784 +57785 +57786 +57787 +57788 +57789 +57790 +57791 +57792 +57793 +57794 +57795 +57796 +57797 +57798 +57799 +57800 +57801 +57802 +57803 +57804 +57805 +57806 +57807 +57808 +57809 +57810 +57811 +57812 +57813 +57814 +57815 +57816 +57817 +57818 +57819 +57820 +57821 +57822 +57823 +57824 +57825 +57826 +57827 +57828 +57829 +57830 +57831 +57832 +57833 +57834 +57835 +57836 +57837 +57838 +57839 +57840 +57841 +57842 +57843 +57844 +57845 +57846 +57847 +57848 +57849 +57850 +57851 +57852 +57853 +57854 +57855 +57856 +57857 +57858 +57859 +57860 +57861 +57862 +57863 +57864 +57865 +57866 +57867 +57868 +57869 +57870 +57871 +57872 +57873 +57874 +57875 +57876 +57877 +57878 +57879 +57880 +57881 +57882 +57883 +57884 +57885 +57886 +57887 +57888 +57889 +57890 +57891 +57892 +57893 +57894 +57895 +57896 +57897 +57898 +57899 +57900 +57901 +57902 +57903 +57904 +57905 +57906 +57907 +57908 +57909 +57910 +57911 +57912 +57913 +57914 +57915 +57916 +57917 +57918 +57919 +57920 +57921 +57922 +57923 +57924 +57925 +57926 +57927 +57928 +57929 +57930 +57931 +57932 +57933 +57934 +57935 +57936 +57937 +57938 +57939 +57940 +57941 +57942 +57943 +57944 +57945 +57946 +57947 +57948 +57949 +57950 +57951 +57952 +57953 +57954 +57955 +57956 +57957 +57958 +57959 +57960 +57961 +57962 +57963 +57964 +57965 +57966 +57967 +57968 +57969 +57970 +57971 +57972 +57973 +57974 +57975 +57976 +57977 +57978 +57979 +57980 +57981 +57982 +57983 +57984 +57985 +57986 +57987 +57988 +57989 +57990 +57991 +57992 +57993 +57994 +57995 +57996 +57997 +57998 +57999 +58000 +58001 +58002 +58003 +58004 +58005 +58006 +58007 +58008 +58009 +58010 +58011 +58012 +58013 +58014 +58015 +58016 +58017 +58018 +58019 +58020 +58021 +58022 +58023 +58024 +58025 +58026 +58027 +58028 +58029 +58030 +58031 +58032 +58033 +58034 +58035 +58036 +58037 +58038 +58039 +58040 +58041 +58042 +58043 +58044 +58045 +58046 +58047 +58048 +58049 +58050 +58051 +58052 +58053 +58054 +58055 +58056 +58057 +58058 +58059 +58060 +58061 +58062 +58063 +58064 +58065 +58066 +58067 +58068 +58069 +58070 +58071 +58072 +58073 +58074 +58075 +58076 +58077 +58078 +58079 +58080 +58081 +58082 +58083 +58084 +58085 +58086 +58087 +58088 +58089 +58090 +58091 +58092 +58093 +58094 +58095 +58096 +58097 +58098 +58099 +58100 +58101 +58102 +58103 +58104 +58105 +58106 +58107 +58108 +58109 +58110 +58111 +58112 +58113 +58114 +58115 +58116 +58117 +58118 +58119 +58120 +58121 +58122 +58123 +58124 +58125 +58126 +58127 +58128 +58129 +58130 +58131 +58132 +58133 +58134 +58135 +58136 +58137 +58138 +58139 +58140 +58141 +58142 +58143 +58144 +58145 +58146 +58147 +58148 +58149 +58150 +58151 +58152 +58153 +58154 +58155 +58156 +58157 +58158 +58159 +58160 +58161 +58162 +58163 +58164 +58165 +58166 +58167 +58168 +58169 +58170 +58171 +58172 +58173 +58174 +58175 +58176 +58177 +58178 +58179 +58180 +58181 +58182 +58183 +58184 +58185 +58186 +58187 +58188 +58189 +58190 +58191 +58192 +58193 +58194 +58195 +58196 +58197 +58198 +58199 +58200 +58201 +58202 +58203 +58204 +58205 +58206 +58207 +58208 +58209 +58210 +58211 +58212 +58213 +58214 +58215 +58216 +58217 +58218 +58219 +58220 +58221 +58222 +58223 +58224 +58225 +58226 +58227 +58228 +58229 +58230 +58231 +58232 +58233 +58234 +58235 +58236 +58237 +58238 +58239 +58240 +58241 +58242 +58243 +58244 +58245 +58246 +58247 +58248 +58249 +58250 +58251 +58252 +58253 +58254 +58255 +58256 +58257 +58258 +58259 +58260 +58261 +58262 +58263 +58264 +58265 +58266 +58267 +58268 +58269 +58270 +58271 +58272 +58273 +58274 +58275 +58276 +58277 +58278 +58279 +58280 +58281 +58282 +58283 +58284 +58285 +58286 +58287 +58288 +58289 +58290 +58291 +58292 +58293 +58294 +58295 +58296 +58297 +58298 +58299 +58300 +58301 +58302 +58303 +58304 +58305 +58306 +58307 +58308 +58309 +58310 +58311 +58312 +58313 +58314 +58315 +58316 +58317 +58318 +58319 +58320 +58321 +58322 +58323 +58324 +58325 +58326 +58327 +58328 +58329 +58330 +58331 +58332 +58333 +58334 +58335 +58336 +58337 +58338 +58339 +58340 +58341 +58342 +58343 +58344 +58345 +58346 +58347 +58348 +58349 +58350 +58351 +58352 +58353 +58354 +58355 +58356 +58357 +58358 +58359 +58360 +58361 +58362 +58363 +58364 +58365 +58366 +58367 +58368 +58369 +58370 +58371 +58372 +58373 +58374 +58375 +58376 +58377 +58378 +58379 +58380 +58381 +58382 +58383 +58384 +58385 +58386 +58387 +58388 +58389 +58390 +58391 +58392 +58393 +58394 +58395 +58396 +58397 +58398 +58399 +58400 +58401 +58402 +58403 +58404 +58405 +58406 +58407 +58408 +58409 +58410 +58411 +58412 +58413 +58414 +58415 +58416 +58417 +58418 +58419 +58420 +58421 +58422 +58423 +58424 +58425 +58426 +58427 +58428 +58429 +58430 +58431 +58432 +58433 +58434 +58435 +58436 +58437 +58438 +58439 +58440 +58441 +58442 +58443 +58444 +58445 +58446 +58447 +58448 +58449 +58450 +58451 +58452 +58453 +58454 +58455 +58456 +58457 +58458 +58459 +58460 +58461 +58462 +58463 +58464 +58465 +58466 +58467 +58468 +58469 +58470 +58471 +58472 +58473 +58474 +58475 +58476 +58477 +58478 +58479 +58480 +58481 +58482 +58483 +58484 +58485 +58486 +58487 +58488 +58489 +58490 +58491 +58492 +58493 +58494 +58495 +58496 +58497 +58498 +58499 +58500 +58501 +58502 +58503 +58504 +58505 +58506 +58507 +58508 +58509 +58510 +58511 +58512 +58513 +58514 +58515 +58516 +58517 +58518 +58519 +58520 +58521 +58522 +58523 +58524 +58525 +58526 +58527 +58528 +58529 +58530 +58531 +58532 +58533 +58534 +58535 +58536 +58537 +58538 +58539 +58540 +58541 +58542 +58543 +58544 +58545 +58546 +58547 +58548 +58549 +58550 +58551 +58552 +58553 +58554 +58555 +58556 +58557 +58558 +58559 +58560 +58561 +58562 +58563 +58564 +58565 +58566 +58567 +58568 +58569 +58570 +58571 +58572 +58573 +58574 +58575 +58576 +58577 +58578 +58579 +58580 +58581 +58582 +58583 +58584 +58585 +58586 +58587 +58588 +58589 +58590 +58591 +58592 +58593 +58594 +58595 +58596 +58597 +58598 +58599 +58600 +58601 +58602 +58603 +58604 +58605 +58606 +58607 +58608 +58609 +58610 +58611 +58612 +58613 +58614 +58615 +58616 +58617 +58618 +58619 +58620 +58621 +58622 +58623 +58624 +58625 +58626 +58627 +58628 +58629 +58630 +58631 +58632 +58633 +58634 +58635 +58636 +58637 +58638 +58639 +58640 +58641 +58642 +58643 +58644 +58645 +58646 +58647 +58648 +58649 +58650 +58651 +58652 +58653 +58654 +58655 +58656 +58657 +58658 +58659 +58660 +58661 +58662 +58663 +58664 +58665 +58666 +58667 +58668 +58669 +58670 +58671 +58672 +58673 +58674 +58675 +58676 +58677 +58678 +58679 +58680 +58681 +58682 +58683 +58684 +58685 +58686 +58687 +58688 +58689 +58690 +58691 +58692 +58693 +58694 +58695 +58696 +58697 +58698 +58699 +58700 +58701 +58702 +58703 +58704 +58705 +58706 +58707 +58708 +58709 +58710 +58711 +58712 +58713 +58714 +58715 +58716 +58717 +58718 +58719 +58720 +58721 +58722 +58723 +58724 +58725 +58726 +58727 +58728 +58729 +58730 +58731 +58732 +58733 +58734 +58735 +58736 +58737 +58738 +58739 +58740 +58741 +58742 +58743 +58744 +58745 +58746 +58747 +58748 +58749 +58750 +58751 +58752 +58753 +58754 +58755 +58756 +58757 +58758 +58759 +58760 +58761 +58762 +58763 +58764 +58765 +58766 +58767 +58768 +58769 +58770 +58771 +58772 +58773 +58774 +58775 +58776 +58777 +58778 +58779 +58780 +58781 +58782 +58783 +58784 +58785 +58786 +58787 +58788 +58789 +58790 +58791 +58792 +58793 +58794 +58795 +58796 +58797 +58798 +58799 +58800 +58801 +58802 +58803 +58804 +58805 +58806 +58807 +58808 +58809 +58810 +58811 +58812 +58813 +58814 +58815 +58816 +58817 +58818 +58819 +58820 +58821 +58822 +58823 +58824 +58825 +58826 +58827 +58828 +58829 +58830 +58831 +58832 +58833 +58834 +58835 +58836 +58837 +58838 +58839 +58840 +58841 +58842 +58843 +58844 +58845 +58846 +58847 +58848 +58849 +58850 +58851 +58852 +58853 +58854 +58855 +58856 +58857 +58858 +58859 +58860 +58861 +58862 +58863 +58864 +58865 +58866 +58867 +58868 +58869 +58870 +58871 +58872 +58873 +58874 +58875 +58876 +58877 +58878 +58879 +58880 +58881 +58882 +58883 +58884 +58885 +58886 +58887 +58888 +58889 +58890 +58891 +58892 +58893 +58894 +58895 +58896 +58897 +58898 +58899 +58900 +58901 +58902 +58903 +58904 +58905 +58906 +58907 +58908 +58909 +58910 +58911 +58912 +58913 +58914 +58915 +58916 +58917 +58918 +58919 +58920 +58921 +58922 +58923 +58924 +58925 +58926 +58927 +58928 +58929 +58930 +58931 +58932 +58933 +58934 +58935 +58936 +58937 +58938 +58939 +58940 +58941 +58942 +58943 +58944 +58945 +58946 +58947 +58948 +58949 +58950 +58951 +58952 +58953 +58954 +58955 +58956 +58957 +58958 +58959 +58960 +58961 +58962 +58963 +58964 +58965 +58966 +58967 +58968 +58969 +58970 +58971 +58972 +58973 +58974 +58975 +58976 +58977 +58978 +58979 +58980 +58981 +58982 +58983 +58984 +58985 +58986 +58987 +58988 +58989 +58990 +58991 +58992 +58993 +58994 +58995 +58996 +58997 +58998 +58999 +59000 +59001 +59002 +59003 +59004 +59005 +59006 +59007 +59008 +59009 +59010 +59011 +59012 +59013 +59014 +59015 +59016 +59017 +59018 +59019 +59020 +59021 +59022 +59023 +59024 +59025 +59026 +59027 +59028 +59029 +59030 +59031 +59032 +59033 +59034 +59035 +59036 +59037 +59038 +59039 +59040 +59041 +59042 +59043 +59044 +59045 +59046 +59047 +59048 +59049 +59050 +59051 +59052 +59053 +59054 +59055 +59056 +59057 +59058 +59059 +59060 +59061 +59062 +59063 +59064 +59065 +59066 +59067 +59068 +59069 +59070 +59071 +59072 +59073 +59074 +59075 +59076 +59077 +59078 +59079 +59080 +59081 +59082 +59083 +59084 +59085 +59086 +59087 +59088 +59089 +59090 +59091 +59092 +59093 +59094 +59095 +59096 +59097 +59098 +59099 +59100 +59101 +59102 +59103 +59104 +59105 +59106 +59107 +59108 +59109 +59110 +59111 +59112 +59113 +59114 +59115 +59116 +59117 +59118 +59119 +59120 +59121 +59122 +59123 +59124 +59125 +59126 +59127 +59128 +59129 +59130 +59131 +59132 +59133 +59134 +59135 +59136 +59137 +59138 +59139 +59140 +59141 +59142 +59143 +59144 +59145 +59146 +59147 +59148 +59149 +59150 +59151 +59152 +59153 +59154 +59155 +59156 +59157 +59158 +59159 +59160 +59161 +59162 +59163 +59164 +59165 +59166 +59167 +59168 +59169 +59170 +59171 +59172 +59173 +59174 +59175 +59176 +59177 +59178 +59179 +59180 +59181 +59182 +59183 +59184 +59185 +59186 +59187 +59188 +59189 +59190 +59191 +59192 +59193 +59194 +59195 +59196 +59197 +59198 +59199 +59200 +59201 +59202 +59203 +59204 +59205 +59206 +59207 +59208 +59209 +59210 +59211 +59212 +59213 +59214 +59215 +59216 +59217 +59218 +59219 +59220 +59221 +59222 +59223 +59224 +59225 +59226 +59227 +59228 +59229 +59230 +59231 +59232 +59233 +59234 +59235 +59236 +59237 +59238 +59239 +59240 +59241 +59242 +59243 +59244 +59245 +59246 +59247 +59248 +59249 +59250 +59251 +59252 +59253 +59254 +59255 +59256 +59257 +59258 +59259 +59260 +59261 +59262 +59263 +59264 +59265 +59266 +59267 +59268 +59269 +59270 +59271 +59272 +59273 +59274 +59275 +59276 +59277 +59278 +59279 +59280 +59281 +59282 +59283 +59284 +59285 +59286 +59287 +59288 +59289 +59290 +59291 +59292 +59293 +59294 +59295 +59296 +59297 +59298 +59299 +59300 +59301 +59302 +59303 +59304 +59305 +59306 +59307 +59308 +59309 +59310 +59311 +59312 +59313 +59314 +59315 +59316 +59317 +59318 +59319 +59320 +59321 +59322 +59323 +59324 +59325 +59326 +59327 +59328 +59329 +59330 +59331 +59332 +59333 +59334 +59335 +59336 +59337 +59338 +59339 +59340 +59341 +59342 +59343 +59344 +59345 +59346 +59347 +59348 +59349 +59350 +59351 +59352 +59353 +59354 +59355 +59356 +59357 +59358 +59359 +59360 +59361 +59362 +59363 +59364 +59365 +59366 +59367 +59368 +59369 +59370 +59371 +59372 +59373 +59374 +59375 +59376 +59377 +59378 +59379 +59380 +59381 +59382 +59383 +59384 +59385 +59386 +59387 +59388 +59389 +59390 +59391 +59392 +59393 +59394 +59395 +59396 +59397 +59398 +59399 +59400 +59401 +59402 +59403 +59404 +59405 +59406 +59407 +59408 +59409 +59410 +59411 +59412 +59413 +59414 +59415 +59416 +59417 +59418 +59419 +59420 +59421 +59422 +59423 +59424 +59425 +59426 +59427 +59428 +59429 +59430 +59431 +59432 +59433 +59434 +59435 +59436 +59437 +59438 +59439 +59440 +59441 +59442 +59443 +59444 +59445 +59446 +59447 +59448 +59449 +59450 +59451 +59452 +59453 +59454 +59455 +59456 +59457 +59458 +59459 +59460 +59461 +59462 +59463 +59464 +59465 +59466 +59467 +59468 +59469 +59470 +59471 +59472 +59473 +59474 +59475 +59476 +59477 +59478 +59479 +59480 +59481 +59482 +59483 +59484 +59485 +59486 +59487 +59488 +59489 +59490 +59491 +59492 +59493 +59494 +59495 +59496 +59497 +59498 +59499 +59500 +59501 +59502 +59503 +59504 +59505 +59506 +59507 +59508 +59509 +59510 +59511 +59512 +59513 +59514 +59515 +59516 +59517 +59518 +59519 +59520 +59521 +59522 +59523 +59524 +59525 +59526 +59527 +59528 +59529 +59530 +59531 +59532 +59533 +59534 +59535 +59536 +59537 +59538 +59539 +59540 +59541 +59542 +59543 +59544 +59545 +59546 +59547 +59548 +59549 +59550 +59551 +59552 +59553 +59554 +59555 +59556 +59557 +59558 +59559 +59560 +59561 +59562 +59563 +59564 +59565 +59566 +59567 +59568 +59569 +59570 +59571 +59572 +59573 +59574 +59575 +59576 +59577 +59578 +59579 +59580 +59581 +59582 +59583 +59584 +59585 +59586 +59587 +59588 +59589 +59590 +59591 +59592 +59593 +59594 +59595 +59596 +59597 +59598 +59599 +59600 +59601 +59602 +59603 +59604 +59605 +59606 +59607 +59608 +59609 +59610 +59611 +59612 +59613 +59614 +59615 +59616 +59617 +59618 +59619 +59620 +59621 +59622 +59623 +59624 +59625 +59626 +59627 +59628 +59629 +59630 +59631 +59632 +59633 +59634 +59635 +59636 +59637 +59638 +59639 +59640 +59641 +59642 +59643 +59644 +59645 +59646 +59647 +59648 +59649 +59650 +59651 +59652 +59653 +59654 +59655 +59656 +59657 +59658 +59659 +59660 +59661 +59662 +59663 +59664 +59665 +59666 +59667 +59668 +59669 +59670 +59671 +59672 +59673 +59674 +59675 +59676 +59677 +59678 +59679 +59680 +59681 +59682 +59683 +59684 +59685 +59686 +59687 +59688 +59689 +59690 +59691 +59692 +59693 +59694 +59695 +59696 +59697 +59698 +59699 +59700 +59701 +59702 +59703 +59704 +59705 +59706 +59707 +59708 +59709 +59710 +59711 +59712 +59713 +59714 +59715 +59716 +59717 +59718 +59719 +59720 +59721 +59722 +59723 +59724 +59725 +59726 +59727 +59728 +59729 +59730 +59731 +59732 +59733 +59734 +59735 +59736 +59737 +59738 +59739 +59740 +59741 +59742 +59743 +59744 +59745 +59746 +59747 +59748 +59749 +59750 +59751 +59752 +59753 +59754 +59755 +59756 +59757 +59758 +59759 +59760 +59761 +59762 +59763 +59764 +59765 +59766 +59767 +59768 +59769 +59770 +59771 +59772 +59773 +59774 +59775 +59776 +59777 +59778 +59779 +59780 +59781 +59782 +59783 +59784 +59785 +59786 +59787 +59788 +59789 +59790 +59791 +59792 +59793 +59794 +59795 +59796 +59797 +59798 +59799 +59800 +59801 +59802 +59803 +59804 +59805 +59806 +59807 +59808 +59809 +59810 +59811 +59812 +59813 +59814 +59815 +59816 +59817 +59818 +59819 +59820 +59821 +59822 +59823 +59824 +59825 +59826 +59827 +59828 +59829 +59830 +59831 +59832 +59833 +59834 +59835 +59836 +59837 +59838 +59839 +59840 +59841 +59842 +59843 +59844 +59845 +59846 +59847 +59848 +59849 +59850 +59851 +59852 +59853 +59854 +59855 +59856 +59857 +59858 +59859 +59860 +59861 +59862 +59863 +59864 +59865 +59866 +59867 +59868 +59869 +59870 +59871 +59872 +59873 +59874 +59875 +59876 +59877 +59878 +59879 +59880 +59881 +59882 +59883 +59884 +59885 +59886 +59887 +59888 +59889 +59890 +59891 +59892 +59893 +59894 +59895 +59896 +59897 +59898 +59899 +59900 +59901 +59902 +59903 +59904 +59905 +59906 +59907 +59908 +59909 +59910 +59911 +59912 +59913 +59914 +59915 +59916 +59917 +59918 +59919 +59920 +59921 +59922 +59923 +59924 +59925 +59926 +59927 +59928 +59929 +59930 +59931 +59932 +59933 +59934 +59935 +59936 +59937 +59938 +59939 +59940 +59941 +59942 +59943 +59944 +59945 +59946 +59947 +59948 +59949 +59950 +59951 +59952 +59953 +59954 +59955 +59956 +59957 +59958 +59959 +59960 +59961 +59962 +59963 +59964 +59965 +59966 +59967 +59968 +59969 +59970 +59971 +59972 +59973 +59974 +59975 +59976 +59977 +59978 +59979 +59980 +59981 +59982 +59983 +59984 +59985 +59986 +59987 +59988 +59989 +59990 +59991 +59992 +59993 +59994 +59995 +59996 +59997 +59998 +59999 +60000 +60001 +60002 +60003 +60004 +60005 +60006 +60007 +60008 +60009 +60010 +60011 +60012 +60013 +60014 +60015 +60016 +60017 +60018 +60019 +60020 +60021 +60022 +60023 +60024 +60025 +60026 +60027 +60028 +60029 +60030 +60031 +60032 +60033 +60034 +60035 +60036 +60037 +60038 +60039 +60040 +60041 +60042 +60043 +60044 +60045 +60046 +60047 +60048 +60049 +60050 +60051 +60052 +60053 +60054 +60055 +60056 +60057 +60058 +60059 +60060 +60061 +60062 +60063 +60064 +60065 +60066 +60067 +60068 +60069 +60070 +60071 +60072 +60073 +60074 +60075 +60076 +60077 +60078 +60079 +60080 +60081 +60082 +60083 +60084 +60085 +60086 +60087 +60088 +60089 +60090 +60091 +60092 +60093 +60094 +60095 +60096 +60097 +60098 +60099 +60100 +60101 +60102 +60103 +60104 +60105 +60106 +60107 +60108 +60109 +60110 +60111 +60112 +60113 +60114 +60115 +60116 +60117 +60118 +60119 +60120 +60121 +60122 +60123 +60124 +60125 +60126 +60127 +60128 +60129 +60130 +60131 +60132 +60133 +60134 +60135 +60136 +60137 +60138 +60139 +60140 +60141 +60142 +60143 +60144 +60145 +60146 +60147 +60148 +60149 +60150 +60151 +60152 +60153 +60154 +60155 +60156 +60157 +60158 +60159 +60160 +60161 +60162 +60163 +60164 +60165 +60166 +60167 +60168 +60169 +60170 +60171 +60172 +60173 +60174 +60175 +60176 +60177 +60178 +60179 +60180 +60181 +60182 +60183 +60184 +60185 +60186 +60187 +60188 +60189 +60190 +60191 +60192 +60193 +60194 +60195 +60196 +60197 +60198 +60199 +60200 +60201 +60202 +60203 +60204 +60205 +60206 +60207 +60208 +60209 +60210 +60211 +60212 +60213 +60214 +60215 +60216 +60217 +60218 +60219 +60220 +60221 +60222 +60223 +60224 +60225 +60226 +60227 +60228 +60229 +60230 +60231 +60232 +60233 +60234 +60235 +60236 +60237 +60238 +60239 +60240 +60241 +60242 +60243 +60244 +60245 +60246 +60247 +60248 +60249 +60250 +60251 +60252 +60253 +60254 +60255 +60256 +60257 +60258 +60259 +60260 +60261 +60262 +60263 +60264 +60265 +60266 +60267 +60268 +60269 +60270 +60271 +60272 +60273 +60274 +60275 +60276 +60277 +60278 +60279 +60280 +60281 +60282 +60283 +60284 +60285 +60286 +60287 +60288 +60289 +60290 +60291 +60292 +60293 +60294 +60295 +60296 +60297 +60298 +60299 +60300 +60301 +60302 +60303 +60304 +60305 +60306 +60307 +60308 +60309 +60310 +60311 +60312 +60313 +60314 +60315 +60316 +60317 +60318 +60319 +60320 +60321 +60322 +60323 +60324 +60325 +60326 +60327 +60328 +60329 +60330 +60331 +60332 +60333 +60334 +60335 +60336 +60337 +60338 +60339 +60340 +60341 +60342 +60343 +60344 +60345 +60346 +60347 +60348 +60349 +60350 +60351 +60352 +60353 +60354 +60355 +60356 +60357 +60358 +60359 +60360 +60361 +60362 +60363 +60364 +60365 +60366 +60367 +60368 +60369 +60370 +60371 +60372 +60373 +60374 +60375 +60376 +60377 +60378 +60379 +60380 +60381 +60382 +60383 +60384 +60385 +60386 +60387 +60388 +60389 +60390 +60391 +60392 +60393 +60394 +60395 +60396 +60397 +60398 +60399 +60400 +60401 +60402 +60403 +60404 +60405 +60406 +60407 +60408 +60409 +60410 +60411 +60412 +60413 +60414 +60415 +60416 +60417 +60418 +60419 +60420 +60421 +60422 +60423 +60424 +60425 +60426 +60427 +60428 +60429 +60430 +60431 +60432 +60433 +60434 +60435 +60436 +60437 +60438 +60439 +60440 +60441 +60442 +60443 +60444 +60445 +60446 +60447 +60448 +60449 +60450 +60451 +60452 +60453 +60454 +60455 +60456 +60457 +60458 +60459 +60460 +60461 +60462 +60463 +60464 +60465 +60466 +60467 +60468 +60469 +60470 +60471 +60472 +60473 +60474 +60475 +60476 +60477 +60478 +60479 +60480 +60481 +60482 +60483 +60484 +60485 +60486 +60487 +60488 +60489 +60490 +60491 +60492 +60493 +60494 +60495 +60496 +60497 +60498 +60499 +60500 +60501 +60502 +60503 +60504 +60505 +60506 +60507 +60508 +60509 +60510 +60511 +60512 +60513 +60514 +60515 +60516 +60517 +60518 +60519 +60520 +60521 +60522 +60523 +60524 +60525 +60526 +60527 +60528 +60529 +60530 +60531 +60532 +60533 +60534 +60535 +60536 +60537 +60538 +60539 +60540 +60541 +60542 +60543 +60544 +60545 +60546 +60547 +60548 +60549 +60550 +60551 +60552 +60553 +60554 +60555 +60556 +60557 +60558 +60559 +60560 +60561 +60562 +60563 +60564 +60565 +60566 +60567 +60568 +60569 +60570 +60571 +60572 +60573 +60574 +60575 +60576 +60577 +60578 +60579 +60580 +60581 +60582 +60583 +60584 +60585 +60586 +60587 +60588 +60589 +60590 +60591 +60592 +60593 +60594 +60595 +60596 +60597 +60598 +60599 +60600 +60601 +60602 +60603 +60604 +60605 +60606 +60607 +60608 +60609 +60610 +60611 +60612 +60613 +60614 +60615 +60616 +60617 +60618 +60619 +60620 +60621 +60622 +60623 +60624 +60625 +60626 +60627 +60628 +60629 +60630 +60631 +60632 +60633 +60634 +60635 +60636 +60637 +60638 +60639 +60640 +60641 +60642 +60643 +60644 +60645 +60646 +60647 +60648 +60649 +60650 +60651 +60652 +60653 +60654 +60655 +60656 +60657 +60658 +60659 +60660 +60661 +60662 +60663 +60664 +60665 +60666 +60667 +60668 +60669 +60670 +60671 +60672 +60673 +60674 +60675 +60676 +60677 +60678 +60679 +60680 +60681 +60682 +60683 +60684 +60685 +60686 +60687 +60688 +60689 +60690 +60691 +60692 +60693 +60694 +60695 +60696 +60697 +60698 +60699 +60700 +60701 +60702 +60703 +60704 +60705 +60706 +60707 +60708 +60709 +60710 +60711 +60712 +60713 +60714 +60715 +60716 +60717 +60718 +60719 +60720 +60721 +60722 +60723 +60724 +60725 +60726 +60727 +60728 +60729 +60730 +60731 +60732 +60733 +60734 +60735 +60736 +60737 +60738 +60739 +60740 +60741 +60742 +60743 +60744 +60745 +60746 +60747 +60748 +60749 +60750 +60751 +60752 +60753 +60754 +60755 +60756 +60757 +60758 +60759 +60760 +60761 +60762 +60763 +60764 +60765 +60766 +60767 +60768 +60769 +60770 +60771 +60772 +60773 +60774 +60775 +60776 +60777 +60778 +60779 +60780 +60781 +60782 +60783 +60784 +60785 +60786 +60787 +60788 +60789 +60790 +60791 +60792 +60793 +60794 +60795 +60796 +60797 +60798 +60799 +60800 +60801 +60802 +60803 +60804 +60805 +60806 +60807 +60808 +60809 +60810 +60811 +60812 +60813 +60814 +60815 +60816 +60817 +60818 +60819 +60820 +60821 +60822 +60823 +60824 +60825 +60826 +60827 +60828 +60829 +60830 +60831 +60832 +60833 +60834 +60835 +60836 +60837 +60838 +60839 +60840 +60841 +60842 +60843 +60844 +60845 +60846 +60847 +60848 +60849 +60850 +60851 +60852 +60853 +60854 +60855 +60856 +60857 +60858 +60859 +60860 +60861 +60862 +60863 +60864 +60865 +60866 +60867 +60868 +60869 +60870 +60871 +60872 +60873 +60874 +60875 +60876 +60877 +60878 +60879 +60880 +60881 +60882 +60883 +60884 +60885 +60886 +60887 +60888 +60889 +60890 +60891 +60892 +60893 +60894 +60895 +60896 +60897 +60898 +60899 +60900 +60901 +60902 +60903 +60904 +60905 +60906 +60907 +60908 +60909 +60910 +60911 +60912 +60913 +60914 +60915 +60916 +60917 +60918 +60919 +60920 +60921 +60922 +60923 +60924 +60925 +60926 +60927 +60928 +60929 +60930 +60931 +60932 +60933 +60934 +60935 +60936 +60937 +60938 +60939 +60940 +60941 +60942 +60943 +60944 +60945 +60946 +60947 +60948 +60949 +60950 +60951 +60952 +60953 +60954 +60955 +60956 +60957 +60958 +60959 +60960 +60961 +60962 +60963 +60964 +60965 +60966 +60967 +60968 +60969 +60970 +60971 +60972 +60973 +60974 +60975 +60976 +60977 +60978 +60979 +60980 +60981 +60982 +60983 +60984 +60985 +60986 +60987 +60988 +60989 +60990 +60991 +60992 +60993 +60994 +60995 +60996 +60997 +60998 +60999 +61000 +61001 +61002 +61003 +61004 +61005 +61006 +61007 +61008 +61009 +61010 +61011 +61012 +61013 +61014 +61015 +61016 +61017 +61018 +61019 +61020 +61021 +61022 +61023 +61024 +61025 +61026 +61027 +61028 +61029 +61030 +61031 +61032 +61033 +61034 +61035 +61036 +61037 +61038 +61039 +61040 +61041 +61042 +61043 +61044 +61045 +61046 +61047 +61048 +61049 +61050 +61051 +61052 +61053 +61054 +61055 +61056 +61057 +61058 +61059 +61060 +61061 +61062 +61063 +61064 +61065 +61066 +61067 +61068 +61069 +61070 +61071 +61072 +61073 +61074 +61075 +61076 +61077 +61078 +61079 +61080 +61081 +61082 +61083 +61084 +61085 +61086 +61087 +61088 +61089 +61090 +61091 +61092 +61093 +61094 +61095 +61096 +61097 +61098 +61099 +61100 +61101 +61102 +61103 +61104 +61105 +61106 +61107 +61108 +61109 +61110 +61111 +61112 +61113 +61114 +61115 +61116 +61117 +61118 +61119 +61120 +61121 +61122 +61123 +61124 +61125 +61126 +61127 +61128 +61129 +61130 +61131 +61132 +61133 +61134 +61135 +61136 +61137 +61138 +61139 +61140 +61141 +61142 +61143 +61144 +61145 +61146 +61147 +61148 +61149 +61150 +61151 +61152 +61153 +61154 +61155 +61156 +61157 +61158 +61159 +61160 +61161 +61162 +61163 +61164 +61165 +61166 +61167 +61168 +61169 +61170 +61171 +61172 +61173 +61174 +61175 +61176 +61177 +61178 +61179 +61180 +61181 +61182 +61183 +61184 +61185 +61186 +61187 +61188 +61189 +61190 +61191 +61192 +61193 +61194 +61195 +61196 +61197 +61198 +61199 +61200 +61201 +61202 +61203 +61204 +61205 +61206 +61207 +61208 +61209 +61210 +61211 +61212 +61213 +61214 +61215 +61216 +61217 +61218 +61219 +61220 +61221 +61222 +61223 +61224 +61225 +61226 +61227 +61228 +61229 +61230 +61231 +61232 +61233 +61234 +61235 +61236 +61237 +61238 +61239 +61240 +61241 +61242 +61243 +61244 +61245 +61246 +61247 +61248 +61249 +61250 +61251 +61252 +61253 +61254 +61255 +61256 +61257 +61258 +61259 +61260 +61261 +61262 +61263 +61264 +61265 +61266 +61267 +61268 +61269 +61270 +61271 +61272 +61273 +61274 +61275 +61276 +61277 +61278 +61279 +61280 +61281 +61282 +61283 +61284 +61285 +61286 +61287 +61288 +61289 +61290 +61291 +61292 +61293 +61294 +61295 +61296 +61297 +61298 +61299 +61300 +61301 +61302 +61303 +61304 +61305 +61306 +61307 +61308 +61309 +61310 +61311 +61312 +61313 +61314 +61315 +61316 +61317 +61318 +61319 +61320 +61321 +61322 +61323 +61324 +61325 +61326 +61327 +61328 +61329 +61330 +61331 +61332 +61333 +61334 +61335 +61336 +61337 +61338 +61339 +61340 +61341 +61342 +61343 +61344 +61345 +61346 +61347 +61348 +61349 +61350 +61351 +61352 +61353 +61354 +61355 +61356 +61357 +61358 +61359 +61360 +61361 +61362 +61363 +61364 +61365 +61366 +61367 +61368 +61369 +61370 +61371 +61372 +61373 +61374 +61375 +61376 +61377 +61378 +61379 +61380 +61381 +61382 +61383 +61384 +61385 +61386 +61387 +61388 +61389 +61390 +61391 +61392 +61393 +61394 +61395 +61396 +61397 +61398 +61399 +61400 +61401 +61402 +61403 +61404 +61405 +61406 +61407 +61408 +61409 +61410 +61411 +61412 +61413 +61414 +61415 +61416 +61417 +61418 +61419 +61420 +61421 +61422 +61423 +61424 +61425 +61426 +61427 +61428 +61429 +61430 +61431 +61432 +61433 +61434 +61435 +61436 +61437 +61438 +61439 +61440 +61441 +61442 +61443 +61444 +61445 +61446 +61447 +61448 +61449 +61450 +61451 +61452 +61453 +61454 +61455 +61456 +61457 +61458 +61459 +61460 +61461 +61462 +61463 +61464 +61465 +61466 +61467 +61468 +61469 +61470 +61471 +61472 +61473 +61474 +61475 +61476 +61477 +61478 +61479 +61480 +61481 +61482 +61483 +61484 +61485 +61486 +61487 +61488 +61489 +61490 +61491 +61492 +61493 +61494 +61495 +61496 +61497 +61498 +61499 +61500 +61501 +61502 +61503 +61504 +61505 +61506 +61507 +61508 +61509 +61510 +61511 +61512 +61513 +61514 +61515 +61516 +61517 +61518 +61519 +61520 +61521 +61522 +61523 +61524 +61525 +61526 +61527 +61528 +61529 +61530 +61531 +61532 +61533 +61534 +61535 +61536 +61537 +61538 +61539 +61540 +61541 +61542 +61543 +61544 +61545 +61546 +61547 +61548 +61549 +61550 +61551 +61552 +61553 +61554 +61555 +61556 +61557 +61558 +61559 +61560 +61561 +61562 +61563 +61564 +61565 +61566 +61567 +61568 +61569 +61570 +61571 +61572 +61573 +61574 +61575 +61576 +61577 +61578 +61579 +61580 +61581 +61582 +61583 +61584 +61585 +61586 +61587 +61588 +61589 +61590 +61591 +61592 +61593 +61594 +61595 +61596 +61597 +61598 +61599 +61600 +61601 +61602 +61603 +61604 +61605 +61606 +61607 +61608 +61609 +61610 +61611 +61612 +61613 +61614 +61615 +61616 +61617 +61618 +61619 +61620 +61621 +61622 +61623 +61624 +61625 +61626 +61627 +61628 +61629 +61630 +61631 +61632 +61633 +61634 +61635 +61636 +61637 +61638 +61639 +61640 +61641 +61642 +61643 +61644 +61645 +61646 +61647 +61648 +61649 +61650 +61651 +61652 +61653 +61654 +61655 +61656 +61657 +61658 +61659 +61660 +61661 +61662 +61663 +61664 +61665 +61666 +61667 +61668 +61669 +61670 +61671 +61672 +61673 +61674 +61675 +61676 +61677 +61678 +61679 +61680 +61681 +61682 +61683 +61684 +61685 +61686 +61687 +61688 +61689 +61690 +61691 +61692 +61693 +61694 +61695 +61696 +61697 +61698 +61699 +61700 +61701 +61702 +61703 +61704 +61705 +61706 +61707 +61708 +61709 +61710 +61711 +61712 +61713 +61714 +61715 +61716 +61717 +61718 +61719 +61720 +61721 +61722 +61723 +61724 +61725 +61726 +61727 +61728 +61729 +61730 +61731 +61732 +61733 +61734 +61735 +61736 +61737 +61738 +61739 +61740 +61741 +61742 +61743 +61744 +61745 +61746 +61747 +61748 +61749 +61750 +61751 +61752 +61753 +61754 +61755 +61756 +61757 +61758 +61759 +61760 +61761 +61762 +61763 +61764 +61765 +61766 +61767 +61768 +61769 +61770 +61771 +61772 +61773 +61774 +61775 +61776 +61777 +61778 +61779 +61780 +61781 +61782 +61783 +61784 +61785 +61786 +61787 +61788 +61789 +61790 +61791 +61792 +61793 +61794 +61795 +61796 +61797 +61798 +61799 +61800 +61801 +61802 +61803 +61804 +61805 +61806 +61807 +61808 +61809 +61810 +61811 +61812 +61813 +61814 +61815 +61816 +61817 +61818 +61819 +61820 +61821 +61822 +61823 +61824 +61825 +61826 +61827 +61828 +61829 +61830 +61831 +61832 +61833 +61834 +61835 +61836 +61837 +61838 +61839 +61840 +61841 +61842 +61843 +61844 +61845 +61846 +61847 +61848 +61849 +61850 +61851 +61852 +61853 +61854 +61855 +61856 +61857 +61858 +61859 +61860 +61861 +61862 +61863 +61864 +61865 +61866 +61867 +61868 +61869 +61870 +61871 +61872 +61873 +61874 +61875 +61876 +61877 +61878 +61879 +61880 +61881 +61882 +61883 +61884 +61885 +61886 +61887 +61888 +61889 +61890 +61891 +61892 +61893 +61894 +61895 +61896 +61897 +61898 +61899 +61900 +61901 +61902 +61903 +61904 +61905 +61906 +61907 +61908 +61909 +61910 +61911 +61912 +61913 +61914 +61915 +61916 +61917 +61918 +61919 +61920 +61921 +61922 +61923 +61924 +61925 +61926 +61927 +61928 +61929 +61930 +61931 +61932 +61933 +61934 +61935 +61936 +61937 +61938 +61939 +61940 +61941 +61942 +61943 +61944 +61945 +61946 +61947 +61948 +61949 +61950 +61951 +61952 +61953 +61954 +61955 +61956 +61957 +61958 +61959 +61960 +61961 +61962 +61963 +61964 +61965 +61966 +61967 +61968 +61969 +61970 +61971 +61972 +61973 +61974 +61975 +61976 +61977 +61978 +61979 +61980 +61981 +61982 +61983 +61984 +61985 +61986 +61987 +61988 +61989 +61990 +61991 +61992 +61993 +61994 +61995 +61996 +61997 +61998 +61999 +62000 +62001 +62002 +62003 +62004 +62005 +62006 +62007 +62008 +62009 +62010 +62011 +62012 +62013 +62014 +62015 +62016 +62017 +62018 +62019 +62020 +62021 +62022 +62023 +62024 +62025 +62026 +62027 +62028 +62029 +62030 +62031 +62032 +62033 +62034 +62035 +62036 +62037 +62038 +62039 +62040 +62041 +62042 +62043 +62044 +62045 +62046 +62047 +62048 +62049 +62050 +62051 +62052 +62053 +62054 +62055 +62056 +62057 +62058 +62059 +62060 +62061 +62062 +62063 +62064 +62065 +62066 +62067 +62068 +62069 +62070 +62071 +62072 +62073 +62074 +62075 +62076 +62077 +62078 +62079 +62080 +62081 +62082 +62083 +62084 +62085 +62086 +62087 +62088 +62089 +62090 +62091 +62092 +62093 +62094 +62095 +62096 +62097 +62098 +62099 +62100 +62101 +62102 +62103 +62104 +62105 +62106 +62107 +62108 +62109 +62110 +62111 +62112 +62113 +62114 +62115 +62116 +62117 +62118 +62119 +62120 +62121 +62122 +62123 +62124 +62125 +62126 +62127 +62128 +62129 +62130 +62131 +62132 +62133 +62134 +62135 +62136 +62137 +62138 +62139 +62140 +62141 +62142 +62143 +62144 +62145 +62146 +62147 +62148 +62149 +62150 +62151 +62152 +62153 +62154 +62155 +62156 +62157 +62158 +62159 +62160 +62161 +62162 +62163 +62164 +62165 +62166 +62167 +62168 +62169 +62170 +62171 +62172 +62173 +62174 +62175 +62176 +62177 +62178 +62179 +62180 +62181 +62182 +62183 +62184 +62185 +62186 +62187 +62188 +62189 +62190 +62191 +62192 +62193 +62194 +62195 +62196 +62197 +62198 +62199 +62200 +62201 +62202 +62203 +62204 +62205 +62206 +62207 +62208 +62209 +62210 +62211 +62212 +62213 +62214 +62215 +62216 +62217 +62218 +62219 +62220 +62221 +62222 +62223 +62224 +62225 +62226 +62227 +62228 +62229 +62230 +62231 +62232 +62233 +62234 +62235 +62236 +62237 +62238 +62239 +62240 +62241 +62242 +62243 +62244 +62245 +62246 +62247 +62248 +62249 +62250 +62251 +62252 +62253 +62254 +62255 +62256 +62257 +62258 +62259 +62260 +62261 +62262 +62263 +62264 +62265 +62266 +62267 +62268 +62269 +62270 +62271 +62272 +62273 +62274 +62275 +62276 +62277 +62278 +62279 +62280 +62281 +62282 +62283 +62284 +62285 +62286 +62287 +62288 +62289 +62290 +62291 +62292 +62293 +62294 +62295 +62296 +62297 +62298 +62299 +62300 +62301 +62302 +62303 +62304 +62305 +62306 +62307 +62308 +62309 +62310 +62311 +62312 +62313 +62314 +62315 +62316 +62317 +62318 +62319 +62320 +62321 +62322 +62323 +62324 +62325 +62326 +62327 +62328 +62329 +62330 +62331 +62332 +62333 +62334 +62335 +62336 +62337 +62338 +62339 +62340 +62341 +62342 +62343 +62344 +62345 +62346 +62347 +62348 +62349 +62350 +62351 +62352 +62353 +62354 +62355 +62356 +62357 +62358 +62359 +62360 +62361 +62362 +62363 +62364 +62365 +62366 +62367 +62368 +62369 +62370 +62371 +62372 +62373 +62374 +62375 +62376 +62377 +62378 +62379 +62380 +62381 +62382 +62383 +62384 +62385 +62386 +62387 +62388 +62389 +62390 +62391 +62392 +62393 +62394 +62395 +62396 +62397 +62398 +62399 +62400 +62401 +62402 +62403 +62404 +62405 +62406 +62407 +62408 +62409 +62410 +62411 +62412 +62413 +62414 +62415 +62416 +62417 +62418 +62419 +62420 +62421 +62422 +62423 +62424 +62425 +62426 +62427 +62428 +62429 +62430 +62431 +62432 +62433 +62434 +62435 +62436 +62437 +62438 +62439 +62440 +62441 +62442 +62443 +62444 +62445 +62446 +62447 +62448 +62449 +62450 +62451 +62452 +62453 +62454 +62455 +62456 +62457 +62458 +62459 +62460 +62461 +62462 +62463 +62464 +62465 +62466 +62467 +62468 +62469 +62470 +62471 +62472 +62473 +62474 +62475 +62476 +62477 +62478 +62479 +62480 +62481 +62482 +62483 +62484 +62485 +62486 +62487 +62488 +62489 +62490 +62491 +62492 +62493 +62494 +62495 +62496 +62497 +62498 +62499 +62500 +62501 +62502 +62503 +62504 +62505 +62506 +62507 +62508 +62509 +62510 +62511 +62512 +62513 +62514 +62515 +62516 +62517 +62518 +62519 +62520 +62521 +62522 +62523 +62524 +62525 +62526 +62527 +62528 +62529 +62530 +62531 +62532 +62533 +62534 +62535 +62536 +62537 +62538 +62539 +62540 +62541 +62542 +62543 +62544 +62545 +62546 +62547 +62548 +62549 +62550 +62551 +62552 +62553 +62554 +62555 +62556 +62557 +62558 +62559 +62560 +62561 +62562 +62563 +62564 +62565 +62566 +62567 +62568 +62569 +62570 +62571 +62572 +62573 +62574 +62575 +62576 +62577 +62578 +62579 +62580 +62581 +62582 +62583 +62584 +62585 +62586 +62587 +62588 +62589 +62590 +62591 +62592 +62593 +62594 +62595 +62596 +62597 +62598 +62599 +62600 +62601 +62602 +62603 +62604 +62605 +62606 +62607 +62608 +62609 +62610 +62611 +62612 +62613 +62614 +62615 +62616 +62617 +62618 +62619 +62620 +62621 +62622 +62623 +62624 +62625 +62626 +62627 +62628 +62629 +62630 +62631 +62632 +62633 +62634 +62635 +62636 +62637 +62638 +62639 +62640 +62641 +62642 +62643 +62644 +62645 +62646 +62647 +62648 +62649 +62650 +62651 +62652 +62653 +62654 +62655 +62656 +62657 +62658 +62659 +62660 +62661 +62662 +62663 +62664 +62665 +62666 +62667 +62668 +62669 +62670 +62671 +62672 +62673 +62674 +62675 +62676 +62677 +62678 +62679 +62680 +62681 +62682 +62683 +62684 +62685 +62686 +62687 +62688 +62689 +62690 +62691 +62692 +62693 +62694 +62695 +62696 +62697 +62698 +62699 +62700 +62701 +62702 +62703 +62704 +62705 +62706 +62707 +62708 +62709 +62710 +62711 +62712 +62713 +62714 +62715 +62716 +62717 +62718 +62719 +62720 +62721 +62722 +62723 +62724 +62725 +62726 +62727 +62728 +62729 +62730 +62731 +62732 +62733 +62734 +62735 +62736 +62737 +62738 +62739 +62740 +62741 +62742 +62743 +62744 +62745 +62746 +62747 +62748 +62749 +62750 +62751 +62752 +62753 +62754 +62755 +62756 +62757 +62758 +62759 +62760 +62761 +62762 +62763 +62764 +62765 +62766 +62767 +62768 +62769 +62770 +62771 +62772 +62773 +62774 +62775 +62776 +62777 +62778 +62779 +62780 +62781 +62782 +62783 +62784 +62785 +62786 +62787 +62788 +62789 +62790 +62791 +62792 +62793 +62794 +62795 +62796 +62797 +62798 +62799 +62800 +62801 +62802 +62803 +62804 +62805 +62806 +62807 +62808 +62809 +62810 +62811 +62812 +62813 +62814 +62815 +62816 +62817 +62818 +62819 +62820 +62821 +62822 +62823 +62824 +62825 +62826 +62827 +62828 +62829 +62830 +62831 +62832 +62833 +62834 +62835 +62836 +62837 +62838 +62839 +62840 +62841 +62842 +62843 +62844 +62845 +62846 +62847 +62848 +62849 +62850 +62851 +62852 +62853 +62854 +62855 +62856 +62857 +62858 +62859 +62860 +62861 +62862 +62863 +62864 +62865 +62866 +62867 +62868 +62869 +62870 +62871 +62872 +62873 +62874 +62875 +62876 +62877 +62878 +62879 +62880 +62881 +62882 +62883 +62884 +62885 +62886 +62887 +62888 +62889 +62890 +62891 +62892 +62893 +62894 +62895 +62896 +62897 +62898 +62899 +62900 +62901 +62902 +62903 +62904 +62905 +62906 +62907 +62908 +62909 +62910 +62911 +62912 +62913 +62914 +62915 +62916 +62917 +62918 +62919 +62920 +62921 +62922 +62923 +62924 +62925 +62926 +62927 +62928 +62929 +62930 +62931 +62932 +62933 +62934 +62935 +62936 +62937 +62938 +62939 +62940 +62941 +62942 +62943 +62944 +62945 +62946 +62947 +62948 +62949 +62950 +62951 +62952 +62953 +62954 +62955 +62956 +62957 +62958 +62959 +62960 +62961 +62962 +62963 +62964 +62965 +62966 +62967 +62968 +62969 +62970 +62971 +62972 +62973 +62974 +62975 +62976 +62977 +62978 +62979 +62980 +62981 +62982 +62983 +62984 +62985 +62986 +62987 +62988 +62989 +62990 +62991 +62992 +62993 +62994 +62995 +62996 +62997 +62998 +62999 +63000 +63001 +63002 +63003 +63004 +63005 +63006 +63007 +63008 +63009 +63010 +63011 +63012 +63013 +63014 +63015 +63016 +63017 +63018 +63019 +63020 +63021 +63022 +63023 +63024 +63025 +63026 +63027 +63028 +63029 +63030 +63031 +63032 +63033 +63034 +63035 +63036 +63037 +63038 +63039 +63040 +63041 +63042 +63043 +63044 +63045 +63046 +63047 +63048 +63049 +63050 +63051 +63052 +63053 +63054 +63055 +63056 +63057 +63058 +63059 +63060 +63061 +63062 +63063 +63064 +63065 +63066 +63067 +63068 +63069 +63070 +63071 +63072 +63073 +63074 +63075 +63076 +63077 +63078 +63079 +63080 +63081 +63082 +63083 +63084 +63085 +63086 +63087 +63088 +63089 +63090 +63091 +63092 +63093 +63094 +63095 +63096 +63097 +63098 +63099 +63100 +63101 +63102 +63103 +63104 +63105 +63106 +63107 +63108 +63109 +63110 +63111 +63112 +63113 +63114 +63115 +63116 +63117 +63118 +63119 +63120 +63121 +63122 +63123 +63124 +63125 +63126 +63127 +63128 +63129 +63130 +63131 +63132 +63133 +63134 +63135 +63136 +63137 +63138 +63139 +63140 +63141 +63142 +63143 +63144 +63145 +63146 +63147 +63148 +63149 +63150 +63151 +63152 +63153 +63154 +63155 +63156 +63157 +63158 +63159 +63160 +63161 +63162 +63163 +63164 +63165 +63166 +63167 +63168 +63169 +63170 +63171 +63172 +63173 +63174 +63175 +63176 +63177 +63178 +63179 +63180 +63181 +63182 +63183 +63184 +63185 +63186 +63187 +63188 +63189 +63190 +63191 +63192 +63193 +63194 +63195 +63196 +63197 +63198 +63199 +63200 +63201 +63202 +63203 +63204 +63205 +63206 +63207 +63208 +63209 +63210 +63211 +63212 +63213 +63214 +63215 +63216 +63217 +63218 +63219 +63220 +63221 +63222 +63223 +63224 +63225 +63226 +63227 +63228 +63229 +63230 +63231 +63232 +63233 +63234 +63235 +63236 +63237 +63238 +63239 +63240 +63241 +63242 +63243 +63244 +63245 +63246 +63247 +63248 +63249 +63250 +63251 +63252 +63253 +63254 +63255 +63256 +63257 +63258 +63259 +63260 +63261 +63262 +63263 +63264 +63265 +63266 +63267 +63268 +63269 +63270 +63271 +63272 +63273 +63274 +63275 +63276 +63277 +63278 +63279 +63280 +63281 +63282 +63283 +63284 +63285 +63286 +63287 +63288 +63289 +63290 +63291 +63292 +63293 +63294 +63295 +63296 +63297 +63298 +63299 +63300 +63301 +63302 +63303 +63304 +63305 +63306 +63307 +63308 +63309 +63310 +63311 +63312 +63313 +63314 +63315 +63316 +63317 +63318 +63319 +63320 +63321 +63322 +63323 +63324 +63325 +63326 +63327 +63328 +63329 +63330 +63331 +63332 +63333 +63334 +63335 +63336 +63337 +63338 +63339 +63340 +63341 +63342 +63343 +63344 +63345 +63346 +63347 +63348 +63349 +63350 +63351 +63352 +63353 +63354 +63355 +63356 +63357 +63358 +63359 +63360 +63361 +63362 +63363 +63364 +63365 +63366 +63367 +63368 +63369 +63370 +63371 +63372 +63373 +63374 +63375 +63376 +63377 +63378 +63379 +63380 +63381 +63382 +63383 +63384 +63385 +63386 +63387 +63388 +63389 +63390 +63391 +63392 +63393 +63394 +63395 +63396 +63397 +63398 +63399 +63400 +63401 +63402 +63403 +63404 +63405 +63406 +63407 +63408 +63409 +63410 +63411 +63412 +63413 +63414 +63415 +63416 +63417 +63418 +63419 +63420 +63421 +63422 +63423 +63424 +63425 +63426 +63427 +63428 +63429 +63430 +63431 +63432 +63433 +63434 +63435 +63436 +63437 +63438 +63439 +63440 +63441 +63442 +63443 +63444 +63445 +63446 +63447 +63448 +63449 +63450 +63451 +63452 +63453 +63454 +63455 +63456 +63457 +63458 +63459 +63460 +63461 +63462 +63463 +63464 +63465 +63466 +63467 +63468 +63469 +63470 +63471 +63472 +63473 +63474 +63475 +63476 +63477 +63478 +63479 +63480 +63481 +63482 +63483 +63484 +63485 +63486 +63487 +63488 +63489 +63490 +63491 +63492 +63493 +63494 +63495 +63496 +63497 +63498 +63499 +63500 +63501 +63502 +63503 +63504 +63505 +63506 +63507 +63508 +63509 +63510 +63511 +63512 +63513 +63514 +63515 +63516 +63517 +63518 +63519 +63520 +63521 +63522 +63523 +63524 +63525 +63526 +63527 +63528 +63529 +63530 +63531 +63532 +63533 +63534 +63535 +63536 +63537 +63538 +63539 +63540 +63541 +63542 +63543 +63544 +63545 +63546 +63547 +63548 +63549 +63550 +63551 +63552 +63553 +63554 +63555 +63556 +63557 +63558 +63559 +63560 +63561 +63562 +63563 +63564 +63565 +63566 +63567 +63568 +63569 +63570 +63571 +63572 +63573 +63574 +63575 +63576 +63577 +63578 +63579 +63580 +63581 +63582 +63583 +63584 +63585 +63586 +63587 +63588 +63589 +63590 +63591 +63592 +63593 +63594 +63595 +63596 +63597 +63598 +63599 +63600 +63601 +63602 +63603 +63604 +63605 +63606 +63607 +63608 +63609 +63610 +63611 +63612 +63613 +63614 +63615 +63616 +63617 +63618 +63619 +63620 +63621 +63622 +63623 +63624 +63625 +63626 +63627 +63628 +63629 +63630 +63631 +63632 +63633 +63634 +63635 +63636 +63637 +63638 +63639 +63640 +63641 +63642 +63643 +63644 +63645 +63646 +63647 +63648 +63649 +63650 +63651 +63652 +63653 +63654 +63655 +63656 +63657 +63658 +63659 +63660 +63661 +63662 +63663 +63664 +63665 +63666 +63667 +63668 +63669 +63670 +63671 +63672 +63673 +63674 +63675 +63676 +63677 +63678 +63679 +63680 +63681 +63682 +63683 +63684 +63685 +63686 +63687 +63688 +63689 +63690 +63691 +63692 +63693 +63694 +63695 +63696 +63697 +63698 +63699 +63700 +63701 +63702 +63703 +63704 +63705 +63706 +63707 +63708 +63709 +63710 +63711 +63712 +63713 +63714 +63715 +63716 +63717 +63718 +63719 +63720 +63721 +63722 +63723 +63724 +63725 +63726 +63727 +63728 +63729 +63730 +63731 +63732 +63733 +63734 +63735 +63736 +63737 +63738 +63739 +63740 +63741 +63742 +63743 +63744 +63745 +63746 +63747 +63748 +63749 +63750 +63751 +63752 +63753 +63754 +63755 +63756 +63757 +63758 +63759 +63760 +63761 +63762 +63763 +63764 +63765 +63766 +63767 +63768 +63769 +63770 +63771 +63772 +63773 +63774 +63775 +63776 +63777 +63778 +63779 +63780 +63781 +63782 +63783 +63784 +63785 +63786 +63787 +63788 +63789 +63790 +63791 +63792 +63793 +63794 +63795 +63796 +63797 +63798 +63799 +63800 +63801 +63802 +63803 +63804 +63805 +63806 +63807 +63808 +63809 +63810 +63811 +63812 +63813 +63814 +63815 +63816 +63817 +63818 +63819 +63820 +63821 +63822 +63823 +63824 +63825 +63826 +63827 +63828 +63829 +63830 +63831 +63832 +63833 +63834 +63835 +63836 +63837 +63838 +63839 +63840 +63841 +63842 +63843 +63844 +63845 +63846 +63847 +63848 +63849 +63850 +63851 +63852 +63853 +63854 +63855 +63856 +63857 +63858 +63859 +63860 +63861 +63862 +63863 +63864 +63865 +63866 +63867 +63868 +63869 +63870 +63871 +63872 +63873 +63874 +63875 +63876 +63877 +63878 +63879 +63880 +63881 +63882 +63883 +63884 +63885 +63886 +63887 +63888 +63889 +63890 +63891 +63892 +63893 +63894 +63895 +63896 +63897 +63898 +63899 +63900 +63901 +63902 +63903 +63904 +63905 +63906 +63907 +63908 +63909 +63910 +63911 +63912 +63913 +63914 +63915 +63916 +63917 +63918 +63919 +63920 +63921 +63922 +63923 +63924 +63925 +63926 +63927 +63928 +63929 +63930 +63931 +63932 +63933 +63934 +63935 +63936 +63937 +63938 +63939 +63940 +63941 +63942 +63943 +63944 +63945 +63946 +63947 +63948 +63949 +63950 +63951 +63952 +63953 +63954 +63955 +63956 +63957 +63958 +63959 +63960 +63961 +63962 +63963 +63964 +63965 +63966 +63967 +63968 +63969 +63970 +63971 +63972 +63973 +63974 +63975 +63976 +63977 +63978 +63979 +63980 +63981 +63982 +63983 +63984 +63985 +63986 +63987 +63988 +63989 +63990 +63991 +63992 +63993 +63994 +63995 +63996 +63997 +63998 +63999 +64000 +64001 +64002 +64003 +64004 +64005 +64006 +64007 +64008 +64009 +64010 +64011 +64012 +64013 +64014 +64015 +64016 +64017 +64018 +64019 +64020 +64021 +64022 +64023 +64024 +64025 +64026 +64027 +64028 +64029 +64030 +64031 +64032 +64033 +64034 +64035 +64036 +64037 +64038 +64039 +64040 +64041 +64042 +64043 +64044 +64045 +64046 +64047 +64048 +64049 +64050 +64051 +64052 +64053 +64054 +64055 +64056 +64057 +64058 +64059 +64060 +64061 +64062 +64063 +64064 +64065 +64066 +64067 +64068 +64069 +64070 +64071 +64072 +64073 +64074 +64075 +64076 +64077 +64078 +64079 +64080 +64081 +64082 +64083 +64084 +64085 +64086 +64087 +64088 +64089 +64090 +64091 +64092 +64093 +64094 +64095 +64096 +64097 +64098 +64099 +64100 +64101 +64102 +64103 +64104 +64105 +64106 +64107 +64108 +64109 +64110 +64111 +64112 +64113 +64114 +64115 +64116 +64117 +64118 +64119 +64120 +64121 +64122 +64123 +64124 +64125 +64126 +64127 +64128 +64129 +64130 +64131 +64132 +64133 +64134 +64135 +64136 +64137 +64138 +64139 +64140 +64141 +64142 +64143 +64144 +64145 +64146 +64147 +64148 +64149 +64150 +64151 +64152 +64153 +64154 +64155 +64156 +64157 +64158 +64159 +64160 +64161 +64162 +64163 +64164 +64165 +64166 +64167 +64168 +64169 +64170 +64171 +64172 +64173 +64174 +64175 +64176 +64177 +64178 +64179 +64180 +64181 +64182 +64183 +64184 +64185 +64186 +64187 +64188 +64189 +64190 +64191 +64192 +64193 +64194 +64195 +64196 +64197 +64198 +64199 +64200 +64201 +64202 +64203 +64204 +64205 +64206 +64207 +64208 +64209 +64210 +64211 +64212 +64213 +64214 +64215 +64216 +64217 +64218 +64219 +64220 +64221 +64222 +64223 +64224 +64225 +64226 +64227 +64228 +64229 +64230 +64231 +64232 +64233 +64234 +64235 +64236 +64237 +64238 +64239 +64240 +64241 +64242 +64243 +64244 +64245 +64246 +64247 +64248 +64249 +64250 +64251 +64252 +64253 +64254 +64255 +64256 +64257 +64258 +64259 +64260 +64261 +64262 +64263 +64264 +64265 +64266 +64267 +64268 +64269 +64270 +64271 +64272 +64273 +64274 +64275 +64276 +64277 +64278 +64279 +64280 +64281 +64282 +64283 +64284 +64285 +64286 +64287 +64288 +64289 +64290 +64291 +64292 +64293 +64294 +64295 +64296 +64297 +64298 +64299 +64300 +64301 +64302 +64303 +64304 +64305 +64306 +64307 +64308 +64309 +64310 +64311 +64312 +64313 +64314 +64315 +64316 +64317 +64318 +64319 +64320 +64321 +64322 +64323 +64324 +64325 +64326 +64327 +64328 +64329 +64330 +64331 +64332 +64333 +64334 +64335 +64336 +64337 +64338 +64339 +64340 +64341 +64342 +64343 +64344 +64345 +64346 +64347 +64348 +64349 +64350 +64351 +64352 +64353 +64354 +64355 +64356 +64357 +64358 +64359 +64360 +64361 +64362 +64363 +64364 +64365 +64366 +64367 +64368 +64369 +64370 +64371 +64372 +64373 +64374 +64375 +64376 +64377 +64378 +64379 +64380 +64381 +64382 +64383 +64384 +64385 +64386 +64387 +64388 +64389 +64390 +64391 +64392 +64393 +64394 +64395 +64396 +64397 +64398 +64399 +64400 +64401 +64402 +64403 +64404 +64405 +64406 +64407 +64408 +64409 +64410 +64411 +64412 +64413 +64414 +64415 +64416 +64417 +64418 +64419 +64420 +64421 +64422 +64423 +64424 +64425 +64426 +64427 +64428 +64429 +64430 +64431 +64432 +64433 +64434 +64435 +64436 +64437 +64438 +64439 +64440 +64441 +64442 +64443 +64444 +64445 +64446 +64447 +64448 +64449 +64450 +64451 +64452 +64453 +64454 +64455 +64456 +64457 +64458 +64459 +64460 +64461 +64462 +64463 +64464 +64465 +64466 +64467 +64468 +64469 +64470 +64471 +64472 +64473 +64474 +64475 +64476 +64477 +64478 +64479 +64480 +64481 +64482 +64483 +64484 +64485 +64486 +64487 +64488 +64489 +64490 +64491 +64492 +64493 +64494 +64495 +64496 +64497 +64498 +64499 +64500 +64501 +64502 +64503 +64504 +64505 +64506 +64507 +64508 +64509 +64510 +64511 +64512 +64513 +64514 +64515 +64516 +64517 +64518 +64519 +64520 +64521 +64522 +64523 +64524 +64525 +64526 +64527 +64528 +64529 +64530 +64531 +64532 +64533 +64534 +64535 +64536 +64537 +64538 +64539 +64540 +64541 +64542 +64543 +64544 +64545 +64546 +64547 +64548 +64549 +64550 +64551 +64552 +64553 +64554 +64555 +64556 +64557 +64558 +64559 +64560 +64561 +64562 +64563 +64564 +64565 +64566 +64567 +64568 +64569 +64570 +64571 +64572 +64573 +64574 +64575 +64576 +64577 +64578 +64579 +64580 +64581 +64582 +64583 +64584 +64585 +64586 +64587 +64588 +64589 +64590 +64591 +64592 +64593 +64594 +64595 +64596 +64597 +64598 +64599 +64600 +64601 +64602 +64603 +64604 +64605 +64606 +64607 +64608 +64609 +64610 +64611 +64612 +64613 +64614 +64615 +64616 +64617 +64618 +64619 +64620 +64621 +64622 +64623 +64624 +64625 +64626 +64627 +64628 +64629 +64630 +64631 +64632 +64633 +64634 +64635 +64636 +64637 +64638 +64639 +64640 +64641 +64642 +64643 +64644 +64645 +64646 +64647 +64648 +64649 +64650 +64651 +64652 +64653 +64654 +64655 +64656 +64657 +64658 +64659 +64660 +64661 +64662 +64663 +64664 +64665 +64666 +64667 +64668 +64669 +64670 +64671 +64672 +64673 +64674 +64675 +64676 +64677 +64678 +64679 +64680 +64681 +64682 +64683 +64684 +64685 +64686 +64687 +64688 +64689 +64690 +64691 +64692 +64693 +64694 +64695 +64696 +64697 +64698 +64699 +64700 +64701 +64702 +64703 +64704 +64705 +64706 +64707 +64708 +64709 +64710 +64711 +64712 +64713 +64714 +64715 +64716 +64717 +64718 +64719 +64720 +64721 +64722 +64723 +64724 +64725 +64726 +64727 +64728 +64729 +64730 +64731 +64732 +64733 +64734 +64735 +64736 +64737 +64738 +64739 +64740 +64741 +64742 +64743 +64744 +64745 +64746 +64747 +64748 +64749 +64750 +64751 +64752 +64753 +64754 +64755 +64756 +64757 +64758 +64759 +64760 +64761 +64762 +64763 +64764 +64765 +64766 +64767 +64768 +64769 +64770 +64771 +64772 +64773 +64774 +64775 +64776 +64777 +64778 +64779 +64780 +64781 +64782 +64783 +64784 +64785 +64786 +64787 +64788 +64789 +64790 +64791 +64792 +64793 +64794 +64795 +64796 +64797 +64798 +64799 +64800 +64801 +64802 +64803 +64804 +64805 +64806 +64807 +64808 +64809 +64810 +64811 +64812 +64813 +64814 +64815 +64816 +64817 +64818 +64819 +64820 +64821 +64822 +64823 +64824 +64825 +64826 +64827 +64828 +64829 +64830 +64831 +64832 +64833 +64834 +64835 +64836 +64837 +64838 +64839 +64840 +64841 +64842 +64843 +64844 +64845 +64846 +64847 +64848 +64849 +64850 +64851 +64852 +64853 +64854 +64855 +64856 +64857 +64858 +64859 +64860 +64861 +64862 +64863 +64864 +64865 +64866 +64867 +64868 +64869 +64870 +64871 +64872 +64873 +64874 +64875 +64876 +64877 +64878 +64879 +64880 +64881 +64882 +64883 +64884 +64885 +64886 +64887 +64888 +64889 +64890 +64891 +64892 +64893 +64894 +64895 +64896 +64897 +64898 +64899 +64900 +64901 +64902 +64903 +64904 +64905 +64906 +64907 +64908 +64909 +64910 +64911 +64912 +64913 +64914 +64915 +64916 +64917 +64918 +64919 +64920 +64921 +64922 +64923 +64924 +64925 +64926 +64927 +64928 +64929 +64930 +64931 +64932 +64933 +64934 +64935 +64936 +64937 +64938 +64939 +64940 +64941 +64942 +64943 +64944 +64945 +64946 +64947 +64948 +64949 +64950 +64951 +64952 +64953 +64954 +64955 +64956 +64957 +64958 +64959 +64960 +64961 +64962 +64963 +64964 +64965 +64966 +64967 +64968 +64969 +64970 +64971 +64972 +64973 +64974 +64975 +64976 +64977 +64978 +64979 +64980 +64981 +64982 +64983 +64984 +64985 +64986 +64987 +64988 +64989 +64990 +64991 +64992 +64993 +64994 +64995 +64996 +64997 +64998 +64999 +65000 +65001 +65002 +65003 +65004 +65005 +65006 +65007 +65008 +65009 +65010 +65011 +65012 +65013 +65014 +65015 +65016 +65017 +65018 +65019 +65020 +65021 +65022 +65023 +65024 +65025 +65026 +65027 +65028 +65029 +65030 +65031 +65032 +65033 +65034 +65035 +65036 +65037 +65038 +65039 +65040 +65041 +65042 +65043 +65044 +65045 +65046 +65047 +65048 +65049 +65050 +65051 +65052 +65053 +65054 +65055 +65056 +65057 +65058 +65059 +65060 +65061 +65062 +65063 +65064 +65065 +65066 +65067 +65068 +65069 +65070 +65071 +65072 +65073 +65074 +65075 +65076 +65077 +65078 +65079 +65080 +65081 +65082 +65083 +65084 +65085 +65086 +65087 +65088 +65089 +65090 +65091 +65092 +65093 +65094 +65095 +65096 +65097 +65098 +65099 +65100 +65101 +65102 +65103 +65104 +65105 +65106 +65107 +65108 +65109 +65110 +65111 +65112 +65113 +65114 +65115 +65116 +65117 +65118 +65119 +65120 +65121 +65122 +65123 +65124 +65125 +65126 +65127 +65128 +65129 +65130 +65131 +65132 +65133 +65134 +65135 +65136 +65137 +65138 +65139 +65140 +65141 +65142 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65152 +65153 +65154 +65155 +65156 +65157 +65158 +65159 +65160 +65161 +65162 +65163 +65164 +65165 +65166 +65167 +65168 +65169 +65170 +65171 +65172 +65173 +65174 +65175 +65176 +65177 +65178 +65179 +65180 +65181 +65182 +65183 +65184 +65185 +65186 +65187 +65188 +65189 +65190 +65191 +65192 +65193 +65194 +65195 +65196 +65197 +65198 +65199 +65200 +65201 +65202 +65203 +65204 +65205 +65206 +65207 +65208 +65209 +65210 +65211 +65212 +65213 +65214 +65215 +65216 +65217 +65218 +65219 +65220 +65221 +65222 +65223 +65224 +65225 +65226 +65227 +65228 +65229 +65230 +65231 +65232 +65233 +65234 +65235 +65236 +65237 +65238 +65239 +65240 +65241 +65242 +65243 +65244 +65245 +65246 +65247 +65248 +65249 +65250 +65251 +65252 +65253 +65254 +65255 +65256 +65257 +65258 +65259 +65260 +65261 +65262 +65263 +65264 +65265 +65266 +65267 +65268 +65269 +65270 +65271 +65272 +65273 +65274 +65275 +65276 +65277 +65278 +65279 +65280 +65281 +65282 +65283 +65284 +65285 +65286 +65287 +65288 +65289 +65290 +65291 +65292 +65293 +65294 +65295 +65296 +65297 +65298 +65299 +65300 +65301 +65302 +65303 +65304 +65305 +65306 +65307 +65308 +65309 +65310 +65311 +65312 +65313 +65314 +65315 +65316 +65317 +65318 +65319 +65320 +65321 +65322 +65323 +65324 +65325 +65326 +65327 +65328 +65329 +65330 +65331 +65332 +65333 +65334 +65335 +65336 +65337 +65338 +65339 +65340 +65341 +65342 +65343 +65344 +65345 +65346 +65347 +65348 +65349 +65350 +65351 +65352 +65353 +65354 +65355 +65356 +65357 +65358 +65359 +65360 +65361 +65362 +65363 +65364 +65365 +65366 +65367 +65368 +65369 +65370 +65371 +65372 +65373 +65374 +65375 +65376 +65377 +65378 +65379 +65380 +65381 +65382 +65383 +65384 +65385 +65386 +65387 +65388 +65389 +65390 +65391 +65392 +65393 +65394 +65395 +65396 +65397 +65398 +65399 +65400 +65401 +65402 +65403 +65404 +65405 +65406 +65407 +65408 +65409 +65410 +65411 +65412 +65413 +65414 +65415 +65416 +65417 +65418 +65419 +65420 +65421 +65422 +65423 +65424 +65425 +65426 +65427 +65428 +65429 +65430 +65431 +65432 +65433 +65434 +65435 +65436 +65437 +65438 +65439 +65440 +65441 +65442 +65443 +65444 +65445 +65446 +65447 +65448 +65449 +65450 +65451 +65452 +65453 +65454 +65455 +65456 +65457 +65458 +65459 +65460 +65461 +65462 +65463 +65464 +65465 +65466 +65467 +65468 +65469 +65470 +65471 +65472 +65473 +65474 +65475 +65476 +65477 +65478 +65479 +65480 +65481 +65482 +65483 +65484 +65485 +65486 +65487 +65488 +65489 +65490 +65491 +65492 +65493 +65494 +65495 +65496 +65497 +65498 +65499 +65500 +65501 +65502 +65503 +65504 +65505 +65506 +65507 +65508 +65509 +65510 +65511 +65512 +65513 +65514 +65515 +65516 +65517 +65518 +65519 +65520 +65521 +65522 +65523 +65524 +65525 +65526 +65527 +65528 +65529 +65530 +65531 +65532 +65533 +65534 +65535 +65536 +65537 +65538 +65539 +65540 +65541 +65542 +65543 +65544 +65545 +65546 +65547 +65548 +65549 +65550 +65551 +65552 +65553 +65554 +65555 +65556 +65557 +65558 +65559 +65560 +65561 +65562 +65563 +65564 +65565 +65566 +65567 +65568 +65569 +65570 +65571 +65572 +65573 +65574 +65575 +65576 +65577 +65578 +65579 +65580 +65581 +65582 +65583 +65584 +65585 +65586 +65587 +65588 +65589 +65590 +65591 +65592 +65593 +65594 +65595 +65596 +65597 +65598 +65599 +65600 +65601 +65602 +65603 +65604 +65605 +65606 +65607 +65608 +65609 +65610 +65611 +65612 +65613 +65614 +65615 +65616 +65617 +65618 +65619 +65620 +65621 +65622 +65623 +65624 +65625 +65626 +65627 +65628 +65629 +65630 +65631 +65632 +65633 +65634 +65635 +65636 +65637 +65638 +65639 +65640 +65641 +65642 +65643 +65644 +65645 +65646 +65647 +65648 +65649 +65650 +65651 +65652 +65653 +65654 +65655 +65656 +65657 +65658 +65659 +65660 +65661 +65662 +65663 +65664 +65665 +65666 +65667 +65668 +65669 +65670 +65671 +65672 +65673 +65674 +65675 +65676 +65677 +65678 +65679 +65680 +65681 +65682 +65683 +65684 +65685 +65686 +65687 +65688 +65689 +65690 +65691 +65692 +65693 +65694 +65695 +65696 +65697 +65698 +65699 +65700 +65701 +65702 +65703 +65704 +65705 +65706 +65707 +65708 +65709 +65710 +65711 +65712 +65713 +65714 +65715 +65716 +65717 +65718 +65719 +65720 +65721 +65722 +65723 +65724 +65725 +65726 +65727 +65728 +65729 +65730 +65731 +65732 +65733 +65734 +65735 +65736 +65737 +65738 +65739 +65740 +65741 +65742 +65743 +65744 +65745 +65746 +65747 +65748 +65749 +65750 +65751 +65752 +65753 +65754 +65755 +65756 +65757 +65758 +65759 +65760 +65761 +65762 +65763 +65764 +65765 +65766 +65767 +65768 +65769 +65770 +65771 +65772 +65773 +65774 +65775 +65776 +65777 +65778 +65779 +65780 +65781 +65782 +65783 +65784 +65785 +65786 +65787 +65788 +65789 +65790 +65791 +65792 +65793 +65794 +65795 +65796 +65797 +65798 +65799 +65800 +65801 +65802 +65803 +65804 +65805 +65806 +65807 +65808 +65809 +65810 +65811 +65812 +65813 +65814 +65815 +65816 +65817 +65818 +65819 +65820 +65821 +65822 +65823 +65824 +65825 +65826 +65827 +65828 +65829 +65830 +65831 +65832 +65833 +65834 +65835 +65836 +65837 +65838 +65839 +65840 +65841 +65842 +65843 +65844 +65845 +65846 +65847 +65848 +65849 +65850 +65851 +65852 +65853 +65854 +65855 +65856 +65857 +65858 +65859 +65860 +65861 +65862 +65863 +65864 +65865 +65866 +65867 +65868 +65869 +65870 +65871 +65872 +65873 +65874 +65875 +65876 +65877 +65878 +65879 +65880 +65881 +65882 +65883 +65884 +65885 +65886 +65887 +65888 +65889 +65890 +65891 +65892 +65893 +65894 +65895 +65896 +65897 +65898 +65899 +65900 +65901 +65902 +65903 +65904 +65905 +65906 +65907 +65908 +65909 +65910 +65911 +65912 +65913 +65914 +65915 +65916 +65917 +65918 +65919 +65920 +65921 +65922 +65923 +65924 +65925 +65926 +65927 +65928 +65929 +65930 +65931 +65932 +65933 +65934 +65935 +65936 +65937 +65938 +65939 +65940 +65941 +65942 +65943 +65944 +65945 +65946 +65947 +65948 +65949 +65950 +65951 +65952 +65953 +65954 +65955 +65956 +65957 +65958 +65959 +65960 +65961 +65962 +65963 +65964 +65965 +65966 +65967 +65968 +65969 +65970 +65971 +65972 +65973 +65974 +65975 +65976 +65977 +65978 +65979 +65980 +65981 +65982 +65983 +65984 +65985 +65986 +65987 +65988 +65989 +65990 +65991 +65992 +65993 +65994 +65995 +65996 +65997 +65998 +65999 +66000 +66001 +66002 +66003 +66004 +66005 +66006 +66007 +66008 +66009 +66010 +66011 +66012 +66013 +66014 +66015 +66016 +66017 +66018 +66019 +66020 +66021 +66022 +66023 +66024 +66025 +66026 +66027 +66028 +66029 +66030 +66031 +66032 +66033 +66034 +66035 +66036 +66037 +66038 +66039 +66040 +66041 +66042 +66043 +66044 +66045 +66046 +66047 +66048 +66049 +66050 +66051 +66052 +66053 +66054 +66055 +66056 +66057 +66058 +66059 +66060 +66061 +66062 +66063 +66064 +66065 +66066 +66067 +66068 +66069 +66070 +66071 +66072 +66073 +66074 +66075 +66076 +66077 +66078 +66079 +66080 +66081 +66082 +66083 +66084 +66085 +66086 +66087 +66088 +66089 +66090 +66091 +66092 +66093 +66094 +66095 +66096 +66097 +66098 +66099 +66100 +66101 +66102 +66103 +66104 +66105 +66106 +66107 +66108 +66109 +66110 +66111 +66112 +66113 +66114 +66115 +66116 +66117 +66118 +66119 +66120 +66121 +66122 +66123 +66124 +66125 +66126 +66127 +66128 +66129 +66130 +66131 +66132 +66133 +66134 +66135 +66136 +66137 +66138 +66139 +66140 +66141 +66142 +66143 +66144 +66145 +66146 +66147 +66148 +66149 +66150 +66151 +66152 +66153 +66154 +66155 +66156 +66157 +66158 +66159 +66160 +66161 +66162 +66163 +66164 +66165 +66166 +66167 +66168 +66169 +66170 +66171 +66172 +66173 +66174 +66175 +66176 +66177 +66178 +66179 +66180 +66181 +66182 +66183 +66184 +66185 +66186 +66187 +66188 +66189 +66190 +66191 +66192 +66193 +66194 +66195 +66196 +66197 +66198 +66199 +66200 +66201 +66202 +66203 +66204 +66205 +66206 +66207 +66208 +66209 +66210 +66211 +66212 +66213 +66214 +66215 +66216 +66217 +66218 +66219 +66220 +66221 +66222 +66223 +66224 +66225 +66226 +66227 +66228 +66229 +66230 +66231 +66232 +66233 +66234 +66235 +66236 +66237 +66238 +66239 +66240 +66241 +66242 +66243 +66244 +66245 +66246 +66247 +66248 +66249 +66250 +66251 +66252 +66253 +66254 +66255 +66256 +66257 +66258 +66259 +66260 +66261 +66262 +66263 +66264 +66265 +66266 +66267 +66268 +66269 +66270 +66271 +66272 +66273 +66274 +66275 +66276 +66277 +66278 +66279 +66280 +66281 +66282 +66283 +66284 +66285 +66286 +66287 +66288 +66289 +66290 +66291 +66292 +66293 +66294 +66295 +66296 +66297 +66298 +66299 +66300 +66301 +66302 +66303 +66304 +66305 +66306 +66307 +66308 +66309 +66310 +66311 +66312 +66313 +66314 +66315 +66316 +66317 +66318 +66319 +66320 +66321 +66322 +66323 +66324 +66325 +66326 +66327 +66328 +66329 +66330 +66331 +66332 +66333 +66334 +66335 +66336 +66337 +66338 +66339 +66340 +66341 +66342 +66343 +66344 +66345 +66346 +66347 +66348 +66349 +66350 +66351 +66352 +66353 +66354 +66355 +66356 +66357 +66358 +66359 +66360 +66361 +66362 +66363 +66364 +66365 +66366 +66367 +66368 +66369 +66370 +66371 +66372 +66373 +66374 +66375 +66376 +66377 +66378 +66379 +66380 +66381 +66382 +66383 +66384 +66385 +66386 +66387 +66388 +66389 +66390 +66391 +66392 +66393 +66394 +66395 +66396 +66397 +66398 +66399 +66400 +66401 +66402 +66403 +66404 +66405 +66406 +66407 +66408 +66409 +66410 +66411 +66412 +66413 +66414 +66415 +66416 +66417 +66418 +66419 +66420 +66421 +66422 +66423 +66424 +66425 +66426 +66427 +66428 +66429 +66430 +66431 +66432 +66433 +66434 +66435 +66436 +66437 +66438 +66439 +66440 +66441 +66442 +66443 +66444 +66445 +66446 +66447 +66448 +66449 +66450 +66451 +66452 +66453 +66454 +66455 +66456 +66457 +66458 +66459 +66460 +66461 +66462 +66463 +66464 +66465 +66466 +66467 +66468 +66469 +66470 +66471 +66472 +66473 +66474 +66475 +66476 +66477 +66478 +66479 +66480 +66481 +66482 +66483 +66484 +66485 +66486 +66487 +66488 +66489 +66490 +66491 +66492 +66493 +66494 +66495 +66496 +66497 +66498 +66499 +66500 +66501 +66502 +66503 +66504 +66505 +66506 +66507 +66508 +66509 +66510 +66511 +66512 +66513 +66514 +66515 +66516 +66517 +66518 +66519 +66520 +66521 +66522 +66523 +66524 +66525 +66526 +66527 +66528 +66529 +66530 +66531 +66532 +66533 +66534 +66535 +66536 +66537 +66538 +66539 +66540 +66541 +66542 +66543 +66544 +66545 +66546 +66547 +66548 +66549 +66550 +66551 +66552 +66553 +66554 +66555 +66556 +66557 +66558 +66559 +66560 +66561 +66562 +66563 +66564 +66565 +66566 +66567 +66568 +66569 +66570 +66571 +66572 +66573 +66574 +66575 +66576 +66577 +66578 +66579 +66580 +66581 +66582 +66583 +66584 +66585 +66586 +66587 +66588 +66589 +66590 +66591 +66592 +66593 +66594 +66595 +66596 +66597 +66598 +66599 +66600 +66601 +66602 +66603 +66604 +66605 +66606 +66607 +66608 +66609 +66610 +66611 +66612 +66613 +66614 +66615 +66616 +66617 +66618 +66619 +66620 +66621 +66622 +66623 +66624 +66625 +66626 +66627 +66628 +66629 +66630 +66631 +66632 +66633 +66634 +66635 +66636 +66637 +66638 +66639 +66640 +66641 +66642 +66643 +66644 +66645 +66646 +66647 +66648 +66649 +66650 +66651 +66652 +66653 +66654 +66655 +66656 +66657 +66658 +66659 +66660 +66661 +66662 +66663 +66664 +66665 +66666 +66667 +66668 +66669 +66670 +66671 +66672 +66673 +66674 +66675 +66676 +66677 +66678 +66679 +66680 +66681 +66682 +66683 +66684 +66685 +66686 +66687 +66688 +66689 +66690 +66691 +66692 +66693 +66694 +66695 +66696 +66697 +66698 +66699 +66700 +66701 +66702 +66703 +66704 +66705 +66706 +66707 +66708 +66709 +66710 +66711 +66712 +66713 +66714 +66715 +66716 +66717 +66718 +66719 +66720 +66721 +66722 +66723 +66724 +66725 +66726 +66727 +66728 +66729 +66730 +66731 +66732 +66733 +66734 +66735 +66736 +66737 +66738 +66739 +66740 +66741 +66742 +66743 +66744 +66745 +66746 +66747 +66748 +66749 +66750 +66751 +66752 +66753 +66754 +66755 +66756 +66757 +66758 +66759 +66760 +66761 +66762 +66763 +66764 +66765 +66766 +66767 +66768 +66769 +66770 +66771 +66772 +66773 +66774 +66775 +66776 +66777 +66778 +66779 +66780 +66781 +66782 +66783 +66784 +66785 +66786 +66787 +66788 +66789 +66790 +66791 +66792 +66793 +66794 +66795 +66796 +66797 +66798 +66799 +66800 +66801 +66802 +66803 +66804 +66805 +66806 +66807 +66808 +66809 +66810 +66811 +66812 +66813 +66814 +66815 +66816 +66817 +66818 +66819 +66820 +66821 +66822 +66823 +66824 +66825 +66826 +66827 +66828 +66829 +66830 +66831 +66832 +66833 +66834 +66835 +66836 +66837 +66838 +66839 +66840 +66841 +66842 +66843 +66844 +66845 +66846 +66847 +66848 +66849 +66850 +66851 +66852 +66853 +66854 +66855 +66856 +66857 +66858 +66859 +66860 +66861 +66862 +66863 +66864 +66865 +66866 +66867 +66868 +66869 +66870 +66871 +66872 +66873 +66874 +66875 +66876 +66877 +66878 +66879 +66880 +66881 +66882 +66883 +66884 +66885 +66886 +66887 +66888 +66889 +66890 +66891 +66892 +66893 +66894 +66895 +66896 +66897 +66898 +66899 +66900 +66901 +66902 +66903 +66904 +66905 +66906 +66907 +66908 +66909 +66910 +66911 +66912 +66913 +66914 +66915 +66916 +66917 +66918 +66919 +66920 +66921 +66922 +66923 +66924 +66925 +66926 +66927 +66928 +66929 +66930 +66931 +66932 +66933 +66934 +66935 +66936 +66937 +66938 +66939 +66940 +66941 +66942 +66943 +66944 +66945 +66946 +66947 +66948 +66949 +66950 +66951 +66952 +66953 +66954 +66955 +66956 +66957 +66958 +66959 +66960 +66961 +66962 +66963 +66964 +66965 +66966 +66967 +66968 +66969 +66970 +66971 +66972 +66973 +66974 +66975 +66976 +66977 +66978 +66979 +66980 +66981 +66982 +66983 +66984 +66985 +66986 +66987 +66988 +66989 +66990 +66991 +66992 +66993 +66994 +66995 +66996 +66997 +66998 +66999 +67000 +67001 +67002 +67003 +67004 +67005 +67006 +67007 +67008 +67009 +67010 +67011 +67012 +67013 +67014 +67015 +67016 +67017 +67018 +67019 +67020 +67021 +67022 +67023 +67024 +67025 +67026 +67027 +67028 +67029 +67030 +67031 +67032 +67033 +67034 +67035 +67036 +67037 +67038 +67039 +67040 +67041 +67042 +67043 +67044 +67045 +67046 +67047 +67048 +67049 +67050 +67051 +67052 +67053 +67054 +67055 +67056 +67057 +67058 +67059 +67060 +67061 +67062 +67063 +67064 +67065 +67066 +67067 +67068 +67069 +67070 +67071 +67072 +67073 +67074 +67075 +67076 +67077 +67078 +67079 +67080 +67081 +67082 +67083 +67084 +67085 +67086 +67087 +67088 +67089 +67090 +67091 +67092 +67093 +67094 +67095 +67096 +67097 +67098 +67099 +67100 +67101 +67102 +67103 +67104 +67105 +67106 +67107 +67108 +67109 +67110 +67111 +67112 +67113 +67114 +67115 +67116 +67117 +67118 +67119 +67120 +67121 +67122 +67123 +67124 +67125 +67126 +67127 +67128 +67129 +67130 +67131 +67132 +67133 +67134 +67135 +67136 +67137 +67138 +67139 +67140 +67141 +67142 +67143 +67144 +67145 +67146 +67147 +67148 +67149 +67150 +67151 +67152 +67153 +67154 +67155 +67156 +67157 +67158 +67159 +67160 +67161 +67162 +67163 +67164 +67165 +67166 +67167 +67168 +67169 +67170 +67171 +67172 +67173 +67174 +67175 +67176 +67177 +67178 +67179 +67180 +67181 +67182 +67183 +67184 +67185 +67186 +67187 +67188 +67189 +67190 +67191 +67192 +67193 +67194 +67195 +67196 +67197 +67198 +67199 +67200 +67201 +67202 +67203 +67204 +67205 +67206 +67207 +67208 +67209 +67210 +67211 +67212 +67213 +67214 +67215 +67216 +67217 +67218 +67219 +67220 +67221 +67222 +67223 +67224 +67225 +67226 +67227 +67228 +67229 +67230 +67231 +67232 +67233 +67234 +67235 +67236 +67237 +67238 +67239 +67240 +67241 +67242 +67243 +67244 +67245 +67246 +67247 +67248 +67249 +67250 +67251 +67252 +67253 +67254 +67255 +67256 +67257 +67258 +67259 +67260 +67261 +67262 +67263 +67264 +67265 +67266 +67267 +67268 +67269 +67270 +67271 +67272 +67273 +67274 +67275 +67276 +67277 +67278 +67279 +67280 +67281 +67282 +67283 +67284 +67285 +67286 +67287 +67288 +67289 +67290 +67291 +67292 +67293 +67294 +67295 +67296 +67297 +67298 +67299 +67300 +67301 +67302 +67303 +67304 +67305 +67306 +67307 +67308 +67309 +67310 +67311 +67312 +67313 +67314 +67315 +67316 +67317 +67318 +67319 +67320 +67321 +67322 +67323 +67324 +67325 +67326 +67327 +67328 +67329 +67330 +67331 +67332 +67333 +67334 +67335 +67336 +67337 +67338 +67339 +67340 +67341 +67342 +67343 +67344 +67345 +67346 +67347 +67348 +67349 +67350 +67351 +67352 +67353 +67354 +67355 +67356 +67357 +67358 +67359 +67360 +67361 +67362 +67363 +67364 +67365 +67366 +67367 +67368 +67369 +67370 +67371 +67372 +67373 +67374 +67375 +67376 +67377 +67378 +67379 +67380 +67381 +67382 +67383 +67384 +67385 +67386 +67387 +67388 +67389 +67390 +67391 +67392 +67393 +67394 +67395 +67396 +67397 +67398 +67399 +67400 +67401 +67402 +67403 +67404 +67405 +67406 +67407 +67408 +67409 +67410 +67411 +67412 +67413 +67414 +67415 +67416 +67417 +67418 +67419 +67420 +67421 +67422 +67423 +67424 +67425 +67426 +67427 +67428 +67429 +67430 +67431 +67432 +67433 +67434 +67435 +67436 +67437 +67438 +67439 +67440 +67441 +67442 +67443 +67444 +67445 +67446 +67447 +67448 +67449 +67450 +67451 +67452 +67453 +67454 +67455 +67456 +67457 +67458 +67459 +67460 +67461 +67462 +67463 +67464 +67465 +67466 +67467 +67468 +67469 +67470 +67471 +67472 +67473 +67474 +67475 +67476 +67477 +67478 +67479 +67480 +67481 +67482 +67483 +67484 +67485 +67486 +67487 +67488 +67489 +67490 +67491 +67492 +67493 +67494 +67495 +67496 +67497 +67498 +67499 +67500 +67501 +67502 +67503 +67504 +67505 +67506 +67507 +67508 +67509 +67510 +67511 +67512 +67513 +67514 +67515 +67516 +67517 +67518 +67519 +67520 +67521 +67522 +67523 +67524 +67525 +67526 +67527 +67528 +67529 +67530 +67531 +67532 +67533 +67534 +67535 +67536 +67537 +67538 +67539 +67540 +67541 +67542 +67543 +67544 +67545 +67546 +67547 +67548 +67549 +67550 +67551 +67552 +67553 +67554 +67555 +67556 +67557 +67558 +67559 +67560 +67561 +67562 +67563 +67564 +67565 +67566 +67567 +67568 +67569 +67570 +67571 +67572 +67573 +67574 +67575 +67576 +67577 +67578 +67579 +67580 +67581 +67582 +67583 +67584 +67585 +67586 +67587 +67588 +67589 +67590 +67591 +67592 +67593 +67594 +67595 +67596 +67597 +67598 +67599 +67600 +67601 +67602 +67603 +67604 +67605 +67606 +67607 +67608 +67609 +67610 +67611 +67612 +67613 +67614 +67615 +67616 +67617 +67618 +67619 +67620 +67621 +67622 +67623 +67624 +67625 +67626 +67627 +67628 +67629 +67630 +67631 +67632 +67633 +67634 +67635 +67636 +67637 +67638 +67639 +67640 +67641 +67642 +67643 +67644 +67645 +67646 +67647 +67648 +67649 +67650 +67651 +67652 +67653 +67654 +67655 +67656 +67657 +67658 +67659 +67660 +67661 +67662 +67663 +67664 +67665 +67666 +67667 +67668 +67669 +67670 +67671 +67672 +67673 +67674 +67675 +67676 +67677 +67678 +67679 +67680 +67681 +67682 +67683 +67684 +67685 +67686 +67687 +67688 +67689 +67690 +67691 +67692 +67693 +67694 +67695 +67696 +67697 +67698 +67699 +67700 +67701 +67702 +67703 +67704 +67705 +67706 +67707 +67708 +67709 +67710 +67711 +67712 +67713 +67714 +67715 +67716 +67717 +67718 +67719 +67720 +67721 +67722 +67723 +67724 +67725 +67726 +67727 +67728 +67729 +67730 +67731 +67732 +67733 +67734 +67735 +67736 +67737 +67738 +67739 +67740 +67741 +67742 +67743 +67744 +67745 +67746 +67747 +67748 +67749 +67750 +67751 +67752 +67753 +67754 +67755 +67756 +67757 +67758 +67759 +67760 +67761 +67762 +67763 +67764 +67765 +67766 +67767 +67768 +67769 +67770 +67771 +67772 +67773 +67774 +67775 +67776 +67777 +67778 +67779 +67780 +67781 +67782 +67783 +67784 +67785 +67786 +67787 +67788 +67789 +67790 +67791 +67792 +67793 +67794 +67795 +67796 +67797 +67798 +67799 +67800 +67801 +67802 +67803 +67804 +67805 +67806 +67807 +67808 +67809 +67810 +67811 +67812 +67813 +67814 +67815 +67816 +67817 +67818 +67819 +67820 +67821 +67822 +67823 +67824 +67825 +67826 +67827 +67828 +67829 +67830 +67831 +67832 +67833 +67834 +67835 +67836 +67837 +67838 +67839 +67840 +67841 +67842 +67843 +67844 +67845 +67846 +67847 +67848 +67849 +67850 +67851 +67852 +67853 +67854 +67855 +67856 +67857 +67858 +67859 +67860 +67861 +67862 +67863 +67864 +67865 +67866 +67867 +67868 +67869 +67870 +67871 +67872 +67873 +67874 +67875 +67876 +67877 +67878 +67879 +67880 +67881 +67882 +67883 +67884 +67885 +67886 +67887 +67888 +67889 +67890 +67891 +67892 +67893 +67894 +67895 +67896 +67897 +67898 +67899 +67900 +67901 +67902 +67903 +67904 +67905 +67906 +67907 +67908 +67909 +67910 +67911 +67912 +67913 +67914 +67915 +67916 +67917 +67918 +67919 +67920 +67921 +67922 +67923 +67924 +67925 +67926 +67927 +67928 +67929 +67930 +67931 +67932 +67933 +67934 +67935 +67936 +67937 +67938 +67939 +67940 +67941 +67942 +67943 +67944 +67945 +67946 +67947 +67948 +67949 +67950 +67951 +67952 +67953 +67954 +67955 +67956 +67957 +67958 +67959 +67960 +67961 +67962 +67963 +67964 +67965 +67966 +67967 +67968 +67969 +67970 +67971 +67972 +67973 +67974 +67975 +67976 +67977 +67978 +67979 +67980 +67981 +67982 +67983 +67984 +67985 +67986 +67987 +67988 +67989 +67990 +67991 +67992 +67993 +67994 +67995 +67996 +67997 +67998 +67999 +68000 +68001 +68002 +68003 +68004 +68005 +68006 +68007 +68008 +68009 +68010 +68011 +68012 +68013 +68014 +68015 +68016 +68017 +68018 +68019 +68020 +68021 +68022 +68023 +68024 +68025 +68026 +68027 +68028 +68029 +68030 +68031 +68032 +68033 +68034 +68035 +68036 +68037 +68038 +68039 +68040 +68041 +68042 +68043 +68044 +68045 +68046 +68047 +68048 +68049 +68050 +68051 +68052 +68053 +68054 +68055 +68056 +68057 +68058 +68059 +68060 +68061 +68062 +68063 +68064 +68065 +68066 +68067 +68068 +68069 +68070 +68071 +68072 +68073 +68074 +68075 +68076 +68077 +68078 +68079 +68080 +68081 +68082 +68083 +68084 +68085 +68086 +68087 +68088 +68089 +68090 +68091 +68092 +68093 +68094 +68095 +68096 +68097 +68098 +68099 +68100 +68101 +68102 +68103 +68104 +68105 +68106 +68107 +68108 +68109 +68110 +68111 +68112 +68113 +68114 +68115 +68116 +68117 +68118 +68119 +68120 +68121 +68122 +68123 +68124 +68125 +68126 +68127 +68128 +68129 +68130 +68131 +68132 +68133 +68134 +68135 +68136 +68137 +68138 +68139 +68140 +68141 +68142 +68143 +68144 +68145 +68146 +68147 +68148 +68149 +68150 +68151 +68152 +68153 +68154 +68155 +68156 +68157 +68158 +68159 +68160 +68161 +68162 +68163 +68164 +68165 +68166 +68167 +68168 +68169 +68170 +68171 +68172 +68173 +68174 +68175 +68176 +68177 +68178 +68179 +68180 +68181 +68182 +68183 +68184 +68185 +68186 +68187 +68188 +68189 +68190 +68191 +68192 +68193 +68194 +68195 +68196 +68197 +68198 +68199 +68200 +68201 +68202 +68203 +68204 +68205 +68206 +68207 +68208 +68209 +68210 +68211 +68212 +68213 +68214 +68215 +68216 +68217 +68218 +68219 +68220 +68221 +68222 +68223 +68224 +68225 +68226 +68227 +68228 +68229 +68230 +68231 +68232 +68233 +68234 +68235 +68236 +68237 +68238 +68239 +68240 +68241 +68242 +68243 +68244 +68245 +68246 +68247 +68248 +68249 +68250 +68251 +68252 +68253 +68254 +68255 +68256 +68257 +68258 +68259 +68260 +68261 +68262 +68263 +68264 +68265 +68266 +68267 +68268 +68269 +68270 +68271 +68272 +68273 +68274 +68275 +68276 +68277 +68278 +68279 +68280 +68281 +68282 +68283 +68284 +68285 +68286 +68287 +68288 +68289 +68290 +68291 +68292 +68293 +68294 +68295 +68296 +68297 +68298 +68299 +68300 +68301 +68302 +68303 +68304 +68305 +68306 +68307 +68308 +68309 +68310 +68311 +68312 +68313 +68314 +68315 +68316 +68317 +68318 +68319 +68320 +68321 +68322 +68323 +68324 +68325 +68326 +68327 +68328 +68329 +68330 +68331 +68332 +68333 +68334 +68335 +68336 +68337 +68338 +68339 +68340 +68341 +68342 +68343 +68344 +68345 +68346 +68347 +68348 +68349 +68350 +68351 +68352 +68353 +68354 +68355 +68356 +68357 +68358 +68359 +68360 +68361 +68362 +68363 +68364 +68365 +68366 +68367 +68368 +68369 +68370 +68371 +68372 +68373 +68374 +68375 +68376 +68377 +68378 +68379 +68380 +68381 +68382 +68383 +68384 +68385 +68386 +68387 +68388 +68389 +68390 +68391 +68392 +68393 +68394 +68395 +68396 +68397 +68398 +68399 +68400 +68401 +68402 +68403 +68404 +68405 +68406 +68407 +68408 +68409 +68410 +68411 +68412 +68413 +68414 +68415 +68416 +68417 +68418 +68419 +68420 +68421 +68422 +68423 +68424 +68425 +68426 +68427 +68428 +68429 +68430 +68431 +68432 +68433 +68434 +68435 +68436 +68437 +68438 +68439 +68440 +68441 +68442 +68443 +68444 +68445 +68446 +68447 +68448 +68449 +68450 +68451 +68452 +68453 +68454 +68455 +68456 +68457 +68458 +68459 +68460 +68461 +68462 +68463 +68464 +68465 +68466 +68467 +68468 +68469 +68470 +68471 +68472 +68473 +68474 +68475 +68476 +68477 +68478 +68479 +68480 +68481 +68482 +68483 +68484 +68485 +68486 +68487 +68488 +68489 +68490 +68491 +68492 +68493 +68494 +68495 +68496 +68497 +68498 +68499 +68500 +68501 +68502 +68503 +68504 +68505 +68506 +68507 +68508 +68509 +68510 +68511 +68512 +68513 +68514 +68515 +68516 +68517 +68518 +68519 +68520 +68521 +68522 +68523 +68524 +68525 +68526 +68527 +68528 +68529 +68530 +68531 +68532 +68533 +68534 +68535 +68536 +68537 +68538 +68539 +68540 +68541 +68542 +68543 +68544 +68545 +68546 +68547 +68548 +68549 +68550 +68551 +68552 +68553 +68554 +68555 +68556 +68557 +68558 +68559 +68560 +68561 +68562 +68563 +68564 +68565 +68566 +68567 +68568 +68569 +68570 +68571 +68572 +68573 +68574 +68575 +68576 +68577 +68578 +68579 +68580 +68581 +68582 +68583 +68584 +68585 +68586 +68587 +68588 +68589 +68590 +68591 +68592 +68593 +68594 +68595 +68596 +68597 +68598 +68599 +68600 +68601 +68602 +68603 +68604 +68605 +68606 +68607 +68608 +68609 +68610 +68611 +68612 +68613 +68614 +68615 +68616 +68617 +68618 +68619 +68620 +68621 +68622 +68623 +68624 +68625 +68626 +68627 +68628 +68629 +68630 +68631 +68632 +68633 +68634 +68635 +68636 +68637 +68638 +68639 +68640 +68641 +68642 +68643 +68644 +68645 +68646 +68647 +68648 +68649 +68650 +68651 +68652 +68653 +68654 +68655 +68656 +68657 +68658 +68659 +68660 +68661 +68662 +68663 +68664 +68665 +68666 +68667 +68668 +68669 +68670 +68671 +68672 +68673 +68674 +68675 +68676 +68677 +68678 +68679 +68680 +68681 +68682 +68683 +68684 +68685 +68686 +68687 +68688 +68689 +68690 +68691 +68692 +68693 +68694 +68695 +68696 +68697 +68698 +68699 +68700 +68701 +68702 +68703 +68704 +68705 +68706 +68707 +68708 +68709 +68710 +68711 +68712 +68713 +68714 +68715 +68716 +68717 +68718 +68719 +68720 +68721 +68722 +68723 +68724 +68725 +68726 +68727 +68728 +68729 +68730 +68731 +68732 +68733 +68734 +68735 +68736 +68737 +68738 +68739 +68740 +68741 +68742 +68743 +68744 +68745 +68746 +68747 +68748 +68749 +68750 +68751 +68752 +68753 +68754 +68755 +68756 +68757 +68758 +68759 +68760 +68761 +68762 +68763 +68764 +68765 +68766 +68767 +68768 +68769 +68770 +68771 +68772 +68773 +68774 +68775 +68776 +68777 +68778 +68779 +68780 +68781 +68782 +68783 +68784 +68785 +68786 +68787 +68788 +68789 +68790 +68791 +68792 +68793 +68794 +68795 +68796 +68797 +68798 +68799 +68800 +68801 +68802 +68803 +68804 +68805 +68806 +68807 +68808 +68809 +68810 +68811 +68812 +68813 +68814 +68815 +68816 +68817 +68818 +68819 +68820 +68821 +68822 +68823 +68824 +68825 +68826 +68827 +68828 +68829 +68830 +68831 +68832 +68833 +68834 +68835 +68836 +68837 +68838 +68839 +68840 +68841 +68842 +68843 +68844 +68845 +68846 +68847 +68848 +68849 +68850 +68851 +68852 +68853 +68854 +68855 +68856 +68857 +68858 +68859 +68860 +68861 +68862 +68863 +68864 +68865 +68866 +68867 +68868 +68869 +68870 +68871 +68872 +68873 +68874 +68875 +68876 +68877 +68878 +68879 +68880 +68881 +68882 +68883 +68884 +68885 +68886 +68887 +68888 +68889 +68890 +68891 +68892 +68893 +68894 +68895 +68896 +68897 +68898 +68899 +68900 +68901 +68902 +68903 +68904 +68905 +68906 +68907 +68908 +68909 +68910 +68911 +68912 +68913 +68914 +68915 +68916 +68917 +68918 +68919 +68920 +68921 +68922 +68923 +68924 +68925 +68926 +68927 +68928 +68929 +68930 +68931 +68932 +68933 +68934 +68935 +68936 +68937 +68938 +68939 +68940 +68941 +68942 +68943 +68944 +68945 +68946 +68947 +68948 +68949 +68950 +68951 +68952 +68953 +68954 +68955 +68956 +68957 +68958 +68959 +68960 +68961 +68962 +68963 +68964 +68965 +68966 +68967 +68968 +68969 +68970 +68971 +68972 +68973 +68974 +68975 +68976 +68977 +68978 +68979 +68980 +68981 +68982 +68983 +68984 +68985 +68986 +68987 +68988 +68989 +68990 +68991 +68992 +68993 +68994 +68995 +68996 +68997 +68998 +68999 +69000 +69001 +69002 +69003 +69004 +69005 +69006 +69007 +69008 +69009 +69010 +69011 +69012 +69013 +69014 +69015 +69016 +69017 +69018 +69019 +69020 +69021 +69022 +69023 +69024 +69025 +69026 +69027 +69028 +69029 +69030 +69031 +69032 +69033 +69034 +69035 +69036 +69037 +69038 +69039 +69040 +69041 +69042 +69043 +69044 +69045 +69046 +69047 +69048 +69049 +69050 +69051 +69052 +69053 +69054 +69055 +69056 +69057 +69058 +69059 +69060 +69061 +69062 +69063 +69064 +69065 +69066 +69067 +69068 +69069 +69070 +69071 +69072 +69073 +69074 +69075 +69076 +69077 +69078 +69079 +69080 +69081 +69082 +69083 +69084 +69085 +69086 +69087 +69088 +69089 +69090 +69091 +69092 +69093 +69094 +69095 +69096 +69097 +69098 +69099 +69100 +69101 +69102 +69103 +69104 +69105 +69106 +69107 +69108 +69109 +69110 +69111 +69112 +69113 +69114 +69115 +69116 +69117 +69118 +69119 +69120 +69121 +69122 +69123 +69124 +69125 +69126 +69127 +69128 +69129 +69130 +69131 +69132 +69133 +69134 +69135 +69136 +69137 +69138 +69139 +69140 +69141 +69142 +69143 +69144 +69145 +69146 +69147 +69148 +69149 +69150 +69151 +69152 +69153 +69154 +69155 +69156 +69157 +69158 +69159 +69160 +69161 +69162 +69163 +69164 +69165 +69166 +69167 +69168 +69169 +69170 +69171 +69172 +69173 +69174 +69175 +69176 +69177 +69178 +69179 +69180 +69181 +69182 +69183 +69184 +69185 +69186 +69187 +69188 +69189 +69190 +69191 +69192 +69193 +69194 +69195 +69196 +69197 +69198 +69199 +69200 +69201 +69202 +69203 +69204 +69205 +69206 +69207 +69208 +69209 +69210 +69211 +69212 +69213 +69214 +69215 +69216 +69217 +69218 +69219 +69220 +69221 +69222 +69223 +69224 +69225 +69226 +69227 +69228 +69229 +69230 +69231 +69232 +69233 +69234 +69235 +69236 +69237 +69238 +69239 +69240 +69241 +69242 +69243 +69244 +69245 +69246 +69247 +69248 +69249 +69250 +69251 +69252 +69253 +69254 +69255 +69256 +69257 +69258 +69259 +69260 +69261 +69262 +69263 +69264 +69265 +69266 +69267 +69268 +69269 +69270 +69271 +69272 +69273 +69274 +69275 +69276 +69277 +69278 +69279 +69280 +69281 +69282 +69283 +69284 +69285 +69286 +69287 +69288 +69289 +69290 +69291 +69292 +69293 +69294 +69295 +69296 +69297 +69298 +69299 +69300 +69301 +69302 +69303 +69304 +69305 +69306 +69307 +69308 +69309 +69310 +69311 +69312 +69313 +69314 +69315 +69316 +69317 +69318 +69319 +69320 +69321 +69322 +69323 +69324 +69325 +69326 +69327 +69328 +69329 +69330 +69331 +69332 +69333 +69334 +69335 +69336 +69337 +69338 +69339 +69340 +69341 +69342 +69343 +69344 +69345 +69346 +69347 +69348 +69349 +69350 +69351 +69352 +69353 +69354 +69355 +69356 +69357 +69358 +69359 +69360 +69361 +69362 +69363 +69364 +69365 +69366 +69367 +69368 +69369 +69370 +69371 +69372 +69373 +69374 +69375 +69376 +69377 +69378 +69379 +69380 +69381 +69382 +69383 +69384 +69385 +69386 +69387 +69388 +69389 +69390 +69391 +69392 +69393 +69394 +69395 +69396 +69397 +69398 +69399 +69400 +69401 +69402 +69403 +69404 +69405 +69406 +69407 +69408 +69409 +69410 +69411 +69412 +69413 +69414 +69415 +69416 +69417 +69418 +69419 +69420 +69421 +69422 +69423 +69424 +69425 +69426 +69427 +69428 +69429 +69430 +69431 +69432 +69433 +69434 +69435 +69436 +69437 +69438 +69439 +69440 +69441 +69442 +69443 +69444 +69445 +69446 +69447 +69448 +69449 +69450 +69451 +69452 +69453 +69454 +69455 +69456 +69457 +69458 +69459 +69460 +69461 +69462 +69463 +69464 +69465 +69466 +69467 +69468 +69469 +69470 +69471 +69472 +69473 +69474 +69475 +69476 +69477 +69478 +69479 +69480 +69481 +69482 +69483 +69484 +69485 +69486 +69487 +69488 +69489 +69490 +69491 +69492 +69493 +69494 +69495 +69496 +69497 +69498 +69499 +69500 +69501 +69502 +69503 +69504 +69505 +69506 +69507 +69508 +69509 +69510 +69511 +69512 +69513 +69514 +69515 +69516 +69517 +69518 +69519 +69520 +69521 +69522 +69523 +69524 +69525 +69526 +69527 +69528 +69529 +69530 +69531 +69532 +69533 +69534 +69535 +69536 +69537 +69538 +69539 +69540 +69541 +69542 +69543 +69544 +69545 +69546 +69547 +69548 +69549 +69550 +69551 +69552 +69553 +69554 +69555 +69556 +69557 +69558 +69559 +69560 +69561 +69562 +69563 +69564 +69565 +69566 +69567 +69568 +69569 +69570 +69571 +69572 +69573 +69574 +69575 +69576 +69577 +69578 +69579 +69580 +69581 +69582 +69583 +69584 +69585 +69586 +69587 +69588 +69589 +69590 +69591 +69592 +69593 +69594 +69595 +69596 +69597 +69598 +69599 +69600 +69601 +69602 +69603 +69604 +69605 +69606 +69607 +69608 +69609 +69610 +69611 +69612 +69613 +69614 +69615 +69616 +69617 +69618 +69619 +69620 +69621 +69622 +69623 +69624 +69625 +69626 +69627 +69628 +69629 +69630 +69631 +69632 +69633 +69634 +69635 +69636 +69637 +69638 +69639 +69640 +69641 +69642 +69643 +69644 +69645 +69646 +69647 +69648 +69649 +69650 +69651 +69652 +69653 +69654 +69655 +69656 +69657 +69658 +69659 +69660 +69661 +69662 +69663 +69664 +69665 +69666 +69667 +69668 +69669 +69670 +69671 +69672 +69673 +69674 +69675 +69676 +69677 +69678 +69679 +69680 +69681 +69682 +69683 +69684 +69685 +69686 +69687 +69688 +69689 +69690 +69691 +69692 +69693 +69694 +69695 +69696 +69697 +69698 +69699 +69700 +69701 +69702 +69703 +69704 +69705 +69706 +69707 +69708 +69709 +69710 +69711 +69712 +69713 +69714 +69715 +69716 +69717 +69718 +69719 +69720 +69721 +69722 +69723 +69724 +69725 +69726 +69727 +69728 +69729 +69730 +69731 +69732 +69733 +69734 +69735 +69736 +69737 +69738 +69739 +69740 +69741 +69742 +69743 +69744 +69745 +69746 +69747 +69748 +69749 +69750 +69751 +69752 +69753 +69754 +69755 +69756 +69757 +69758 +69759 +69760 +69761 +69762 +69763 +69764 +69765 +69766 +69767 +69768 +69769 +69770 +69771 +69772 +69773 +69774 +69775 +69776 +69777 +69778 +69779 +69780 +69781 +69782 +69783 +69784 +69785 +69786 +69787 +69788 +69789 +69790 +69791 +69792 +69793 +69794 +69795 +69796 +69797 +69798 +69799 +69800 +69801 +69802 +69803 +69804 +69805 +69806 +69807 +69808 +69809 +69810 +69811 +69812 +69813 +69814 +69815 +69816 +69817 +69818 +69819 +69820 +69821 +69822 +69823 +69824 +69825 +69826 +69827 +69828 +69829 +69830 +69831 +69832 +69833 +69834 +69835 +69836 +69837 +69838 +69839 +69840 +69841 +69842 +69843 +69844 +69845 +69846 +69847 +69848 +69849 +69850 +69851 +69852 +69853 +69854 +69855 +69856 +69857 +69858 +69859 +69860 +69861 +69862 +69863 +69864 +69865 +69866 +69867 +69868 +69869 +69870 +69871 +69872 +69873 +69874 +69875 +69876 +69877 +69878 +69879 +69880 +69881 +69882 +69883 +69884 +69885 +69886 +69887 +69888 +69889 +69890 +69891 +69892 +69893 +69894 +69895 +69896 +69897 +69898 +69899 +69900 +69901 +69902 +69903 +69904 +69905 +69906 +69907 +69908 +69909 +69910 +69911 +69912 +69913 +69914 +69915 +69916 +69917 +69918 +69919 +69920 +69921 +69922 +69923 +69924 +69925 +69926 +69927 +69928 +69929 +69930 +69931 +69932 +69933 +69934 +69935 +69936 +69937 +69938 +69939 +69940 +69941 +69942 +69943 +69944 +69945 +69946 +69947 +69948 +69949 +69950 +69951 +69952 +69953 +69954 +69955 +69956 +69957 +69958 +69959 +69960 +69961 +69962 +69963 +69964 +69965 +69966 +69967 +69968 +69969 +69970 +69971 +69972 +69973 +69974 +69975 +69976 +69977 +69978 +69979 +69980 +69981 +69982 +69983 +69984 +69985 +69986 +69987 +69988 +69989 +69990 +69991 +69992 +69993 +69994 +69995 +69996 +69997 +69998 +69999 +70000 +70001 +70002 +70003 +70004 +70005 +70006 +70007 +70008 +70009 +70010 +70011 +70012 +70013 +70014 +70015 +70016 +70017 +70018 +70019 +70020 +70021 +70022 +70023 +70024 +70025 +70026 +70027 +70028 +70029 +70030 +70031 +70032 +70033 +70034 +70035 +70036 +70037 +70038 +70039 +70040 +70041 +70042 +70043 +70044 +70045 +70046 +70047 +70048 +70049 +70050 +70051 +70052 +70053 +70054 +70055 +70056 +70057 +70058 +70059 +70060 +70061 +70062 +70063 +70064 +70065 +70066 +70067 +70068 +70069 +70070 +70071 +70072 +70073 +70074 +70075 +70076 +70077 +70078 +70079 +70080 +70081 +70082 +70083 +70084 +70085 +70086 +70087 +70088 +70089 +70090 +70091 +70092 +70093 +70094 +70095 +70096 +70097 +70098 +70099 +70100 +70101 +70102 +70103 +70104 +70105 +70106 +70107 +70108 +70109 +70110 +70111 +70112 +70113 +70114 +70115 +70116 +70117 +70118 +70119 +70120 +70121 +70122 +70123 +70124 +70125 +70126 +70127 +70128 +70129 +70130 +70131 +70132 +70133 +70134 +70135 +70136 +70137 +70138 +70139 +70140 +70141 +70142 +70143 +70144 +70145 +70146 +70147 +70148 +70149 +70150 +70151 +70152 +70153 +70154 +70155 +70156 +70157 +70158 +70159 +70160 +70161 +70162 +70163 +70164 +70165 +70166 +70167 +70168 +70169 +70170 +70171 +70172 +70173 +70174 +70175 +70176 +70177 +70178 +70179 +70180 +70181 +70182 +70183 +70184 +70185 +70186 +70187 +70188 +70189 +70190 +70191 +70192 +70193 +70194 +70195 +70196 +70197 +70198 +70199 +70200 +70201 +70202 +70203 +70204 +70205 +70206 +70207 +70208 +70209 +70210 +70211 +70212 +70213 +70214 +70215 +70216 +70217 +70218 +70219 +70220 +70221 +70222 +70223 +70224 +70225 +70226 +70227 +70228 +70229 +70230 +70231 +70232 +70233 +70234 +70235 +70236 +70237 +70238 +70239 +70240 +70241 +70242 +70243 +70244 +70245 +70246 +70247 +70248 +70249 +70250 +70251 +70252 +70253 +70254 +70255 +70256 +70257 +70258 +70259 +70260 +70261 +70262 +70263 +70264 +70265 +70266 +70267 +70268 +70269 +70270 +70271 +70272 +70273 +70274 +70275 +70276 +70277 +70278 +70279 +70280 +70281 +70282 +70283 +70284 +70285 +70286 +70287 +70288 +70289 +70290 +70291 +70292 +70293 +70294 +70295 +70296 +70297 +70298 +70299 +70300 +70301 +70302 +70303 +70304 +70305 +70306 +70307 +70308 +70309 +70310 +70311 +70312 +70313 +70314 +70315 +70316 +70317 +70318 +70319 +70320 +70321 +70322 +70323 +70324 +70325 +70326 +70327 +70328 +70329 +70330 +70331 +70332 +70333 +70334 +70335 +70336 +70337 +70338 +70339 +70340 +70341 +70342 +70343 +70344 +70345 +70346 +70347 +70348 +70349 +70350 +70351 +70352 +70353 +70354 +70355 +70356 +70357 +70358 +70359 +70360 +70361 +70362 +70363 +70364 +70365 +70366 +70367 +70368 +70369 +70370 +70371 +70372 +70373 +70374 +70375 +70376 +70377 +70378 +70379 +70380 +70381 +70382 +70383 +70384 +70385 +70386 +70387 +70388 +70389 +70390 +70391 +70392 +70393 +70394 +70395 +70396 +70397 +70398 +70399 +70400 +70401 +70402 +70403 +70404 +70405 +70406 +70407 +70408 +70409 +70410 +70411 +70412 +70413 +70414 +70415 +70416 +70417 +70418 +70419 +70420 +70421 +70422 +70423 +70424 +70425 +70426 +70427 +70428 +70429 +70430 +70431 +70432 +70433 +70434 +70435 +70436 +70437 +70438 +70439 +70440 +70441 +70442 +70443 +70444 +70445 +70446 +70447 +70448 +70449 +70450 +70451 +70452 +70453 +70454 +70455 +70456 +70457 +70458 +70459 +70460 +70461 +70462 +70463 +70464 +70465 +70466 +70467 +70468 +70469 +70470 +70471 +70472 +70473 +70474 +70475 +70476 +70477 +70478 +70479 +70480 +70481 +70482 +70483 +70484 +70485 +70486 +70487 +70488 +70489 +70490 +70491 +70492 +70493 +70494 +70495 +70496 +70497 +70498 +70499 +70500 +70501 +70502 +70503 +70504 +70505 +70506 +70507 +70508 +70509 +70510 +70511 +70512 +70513 +70514 +70515 +70516 +70517 +70518 +70519 +70520 +70521 +70522 +70523 +70524 +70525 +70526 +70527 +70528 +70529 +70530 +70531 +70532 +70533 +70534 +70535 +70536 +70537 +70538 +70539 +70540 +70541 +70542 +70543 +70544 +70545 +70546 +70547 +70548 +70549 +70550 +70551 +70552 +70553 +70554 +70555 +70556 +70557 +70558 +70559 +70560 +70561 +70562 +70563 +70564 +70565 +70566 +70567 +70568 +70569 +70570 +70571 +70572 +70573 +70574 +70575 +70576 +70577 +70578 +70579 +70580 +70581 +70582 +70583 +70584 +70585 +70586 +70587 +70588 +70589 +70590 +70591 +70592 +70593 +70594 +70595 +70596 +70597 +70598 +70599 +70600 +70601 +70602 +70603 +70604 +70605 +70606 +70607 +70608 +70609 +70610 +70611 +70612 +70613 +70614 +70615 +70616 +70617 +70618 +70619 +70620 +70621 +70622 +70623 +70624 +70625 +70626 +70627 +70628 +70629 +70630 +70631 +70632 +70633 +70634 +70635 +70636 +70637 +70638 +70639 +70640 +70641 +70642 +70643 +70644 +70645 +70646 +70647 +70648 +70649 +70650 +70651 +70652 +70653 +70654 +70655 +70656 +70657 +70658 +70659 +70660 +70661 +70662 +70663 +70664 +70665 +70666 +70667 +70668 +70669 +70670 +70671 +70672 +70673 +70674 +70675 +70676 +70677 +70678 +70679 +70680 +70681 +70682 +70683 +70684 +70685 +70686 +70687 +70688 +70689 +70690 +70691 +70692 +70693 +70694 +70695 +70696 +70697 +70698 +70699 +70700 +70701 +70702 +70703 +70704 +70705 +70706 +70707 +70708 +70709 +70710 +70711 +70712 +70713 +70714 +70715 +70716 +70717 +70718 +70719 +70720 +70721 +70722 +70723 +70724 +70725 +70726 +70727 +70728 +70729 +70730 +70731 +70732 +70733 +70734 +70735 +70736 +70737 +70738 +70739 +70740 +70741 +70742 +70743 +70744 +70745 +70746 +70747 +70748 +70749 +70750 +70751 +70752 +70753 +70754 +70755 +70756 +70757 +70758 +70759 +70760 +70761 +70762 +70763 +70764 +70765 +70766 +70767 +70768 +70769 +70770 +70771 +70772 +70773 +70774 +70775 +70776 +70777 +70778 +70779 +70780 +70781 +70782 +70783 +70784 +70785 +70786 +70787 +70788 +70789 +70790 +70791 +70792 +70793 +70794 +70795 +70796 +70797 +70798 +70799 +70800 +70801 +70802 +70803 +70804 +70805 +70806 +70807 +70808 +70809 +70810 +70811 +70812 +70813 +70814 +70815 +70816 +70817 +70818 +70819 +70820 +70821 +70822 +70823 +70824 +70825 +70826 +70827 +70828 +70829 +70830 +70831 +70832 +70833 +70834 +70835 +70836 +70837 +70838 +70839 +70840 +70841 +70842 +70843 +70844 +70845 +70846 +70847 +70848 +70849 +70850 +70851 +70852 +70853 +70854 +70855 +70856 +70857 +70858 +70859 +70860 +70861 +70862 +70863 +70864 +70865 +70866 +70867 +70868 +70869 +70870 +70871 +70872 +70873 +70874 +70875 +70876 +70877 +70878 +70879 +70880 +70881 +70882 +70883 +70884 +70885 +70886 +70887 +70888 +70889 +70890 +70891 +70892 +70893 +70894 +70895 +70896 +70897 +70898 +70899 +70900 +70901 +70902 +70903 +70904 +70905 +70906 +70907 +70908 +70909 +70910 +70911 +70912 +70913 +70914 +70915 +70916 +70917 +70918 +70919 +70920 +70921 +70922 +70923 +70924 +70925 +70926 +70927 +70928 +70929 +70930 +70931 +70932 +70933 +70934 +70935 +70936 +70937 +70938 +70939 +70940 +70941 +70942 +70943 +70944 +70945 +70946 +70947 +70948 +70949 +70950 +70951 +70952 +70953 +70954 +70955 +70956 +70957 +70958 +70959 +70960 +70961 +70962 +70963 +70964 +70965 +70966 +70967 +70968 +70969 +70970 +70971 +70972 +70973 +70974 +70975 +70976 +70977 +70978 +70979 +70980 +70981 +70982 +70983 +70984 +70985 +70986 +70987 +70988 +70989 +70990 +70991 +70992 +70993 +70994 +70995 +70996 +70997 +70998 +70999 +71000 +71001 +71002 +71003 +71004 +71005 +71006 +71007 +71008 +71009 +71010 +71011 +71012 +71013 +71014 +71015 +71016 +71017 +71018 +71019 +71020 +71021 +71022 +71023 +71024 +71025 +71026 +71027 +71028 +71029 +71030 +71031 +71032 +71033 +71034 +71035 +71036 +71037 +71038 +71039 +71040 +71041 +71042 +71043 +71044 +71045 +71046 +71047 +71048 +71049 +71050 +71051 +71052 +71053 +71054 +71055 +71056 +71057 +71058 +71059 +71060 +71061 +71062 +71063 +71064 +71065 +71066 +71067 +71068 +71069 +71070 +71071 +71072 +71073 +71074 +71075 +71076 +71077 +71078 +71079 +71080 +71081 +71082 +71083 +71084 +71085 +71086 +71087 +71088 +71089 +71090 +71091 +71092 +71093 +71094 +71095 +71096 +71097 +71098 +71099 +71100 +71101 +71102 +71103 +71104 +71105 +71106 +71107 +71108 +71109 +71110 +71111 +71112 +71113 +71114 +71115 +71116 +71117 +71118 +71119 +71120 +71121 +71122 +71123 +71124 +71125 +71126 +71127 +71128 +71129 +71130 +71131 +71132 +71133 +71134 +71135 +71136 +71137 +71138 +71139 +71140 +71141 +71142 +71143 +71144 +71145 +71146 +71147 +71148 +71149 +71150 +71151 +71152 +71153 +71154 +71155 +71156 +71157 +71158 +71159 +71160 +71161 +71162 +71163 +71164 +71165 +71166 +71167 +71168 +71169 +71170 +71171 +71172 +71173 +71174 +71175 +71176 +71177 +71178 +71179 +71180 +71181 +71182 +71183 +71184 +71185 +71186 +71187 +71188 +71189 +71190 +71191 +71192 +71193 +71194 +71195 +71196 +71197 +71198 +71199 +71200 +71201 +71202 +71203 +71204 +71205 +71206 +71207 +71208 +71209 +71210 +71211 +71212 +71213 +71214 +71215 +71216 +71217 +71218 +71219 +71220 +71221 +71222 +71223 +71224 +71225 +71226 +71227 +71228 +71229 +71230 +71231 +71232 +71233 +71234 +71235 +71236 +71237 +71238 +71239 +71240 +71241 +71242 +71243 +71244 +71245 +71246 +71247 +71248 +71249 +71250 +71251 +71252 +71253 +71254 +71255 +71256 +71257 +71258 +71259 +71260 +71261 +71262 +71263 +71264 +71265 +71266 +71267 +71268 +71269 +71270 +71271 +71272 +71273 +71274 +71275 +71276 +71277 +71278 +71279 +71280 +71281 +71282 +71283 +71284 +71285 +71286 +71287 +71288 +71289 +71290 +71291 +71292 +71293 +71294 +71295 +71296 +71297 +71298 +71299 +71300 +71301 +71302 +71303 +71304 +71305 +71306 +71307 +71308 +71309 +71310 +71311 +71312 +71313 +71314 +71315 +71316 +71317 +71318 +71319 +71320 +71321 +71322 +71323 +71324 +71325 +71326 +71327 +71328 +71329 +71330 +71331 +71332 +71333 +71334 +71335 +71336 +71337 +71338 +71339 +71340 +71341 +71342 +71343 +71344 +71345 +71346 +71347 +71348 +71349 +71350 +71351 +71352 +71353 +71354 +71355 +71356 +71357 +71358 +71359 +71360 +71361 +71362 +71363 +71364 +71365 +71366 +71367 +71368 +71369 +71370 +71371 +71372 +71373 +71374 +71375 +71376 +71377 +71378 +71379 +71380 +71381 +71382 +71383 +71384 +71385 +71386 +71387 +71388 +71389 +71390 +71391 +71392 +71393 +71394 +71395 +71396 +71397 +71398 +71399 +71400 +71401 +71402 +71403 +71404 +71405 +71406 +71407 +71408 +71409 +71410 +71411 +71412 +71413 +71414 +71415 +71416 +71417 +71418 +71419 +71420 +71421 +71422 +71423 +71424 +71425 +71426 +71427 +71428 +71429 +71430 +71431 +71432 +71433 +71434 +71435 +71436 +71437 +71438 +71439 +71440 +71441 +71442 +71443 +71444 +71445 +71446 +71447 +71448 +71449 +71450 +71451 +71452 +71453 +71454 +71455 +71456 +71457 +71458 +71459 +71460 +71461 +71462 +71463 +71464 +71465 +71466 +71467 +71468 +71469 +71470 +71471 +71472 +71473 +71474 +71475 +71476 +71477 +71478 +71479 +71480 +71481 +71482 +71483 +71484 +71485 +71486 +71487 +71488 +71489 +71490 +71491 +71492 +71493 +71494 +71495 +71496 +71497 +71498 +71499 +71500 +71501 +71502 +71503 +71504 +71505 +71506 +71507 +71508 +71509 +71510 +71511 +71512 +71513 +71514 +71515 +71516 +71517 +71518 +71519 +71520 +71521 +71522 +71523 +71524 +71525 +71526 +71527 +71528 +71529 +71530 +71531 +71532 +71533 +71534 +71535 +71536 +71537 +71538 +71539 +71540 +71541 +71542 +71543 +71544 +71545 +71546 +71547 +71548 +71549 +71550 +71551 +71552 +71553 +71554 +71555 +71556 +71557 +71558 +71559 +71560 +71561 +71562 +71563 +71564 +71565 +71566 +71567 +71568 +71569 +71570 +71571 +71572 +71573 +71574 +71575 +71576 +71577 +71578 +71579 +71580 +71581 +71582 +71583 +71584 +71585 +71586 +71587 +71588 +71589 +71590 +71591 +71592 +71593 +71594 +71595 +71596 +71597 +71598 +71599 +71600 +71601 +71602 +71603 +71604 +71605 +71606 +71607 +71608 +71609 +71610 +71611 +71612 +71613 +71614 +71615 +71616 +71617 +71618 +71619 +71620 +71621 +71622 +71623 +71624 +71625 +71626 +71627 +71628 +71629 +71630 +71631 +71632 +71633 +71634 +71635 +71636 +71637 +71638 +71639 +71640 +71641 +71642 +71643 +71644 +71645 +71646 +71647 +71648 +71649 +71650 +71651 +71652 +71653 +71654 +71655 +71656 +71657 +71658 +71659 +71660 +71661 +71662 +71663 +71664 +71665 +71666 +71667 +71668 +71669 +71670 +71671 +71672 +71673 +71674 +71675 +71676 +71677 +71678 +71679 +71680 +71681 +71682 +71683 +71684 +71685 +71686 +71687 +71688 +71689 +71690 +71691 +71692 +71693 +71694 +71695 +71696 +71697 +71698 +71699 +71700 +71701 +71702 +71703 +71704 +71705 +71706 +71707 +71708 +71709 +71710 +71711 +71712 +71713 +71714 +71715 +71716 +71717 +71718 +71719 +71720 +71721 +71722 +71723 +71724 +71725 +71726 +71727 +71728 +71729 +71730 +71731 +71732 +71733 +71734 +71735 +71736 +71737 +71738 +71739 +71740 +71741 +71742 +71743 +71744 +71745 +71746 +71747 +71748 +71749 +71750 +71751 +71752 +71753 +71754 +71755 +71756 +71757 +71758 +71759 +71760 +71761 +71762 +71763 +71764 +71765 +71766 +71767 +71768 +71769 +71770 +71771 +71772 +71773 +71774 +71775 +71776 +71777 +71778 +71779 +71780 +71781 +71782 +71783 +71784 +71785 +71786 +71787 +71788 +71789 +71790 +71791 +71792 +71793 +71794 +71795 +71796 +71797 +71798 +71799 +71800 +71801 +71802 +71803 +71804 +71805 +71806 +71807 +71808 +71809 +71810 +71811 +71812 +71813 +71814 +71815 +71816 +71817 +71818 +71819 +71820 +71821 +71822 +71823 +71824 +71825 +71826 +71827 +71828 +71829 +71830 +71831 +71832 +71833 +71834 +71835 +71836 +71837 +71838 +71839 +71840 +71841 +71842 +71843 +71844 +71845 +71846 +71847 +71848 +71849 +71850 +71851 +71852 +71853 +71854 +71855 +71856 +71857 +71858 +71859 +71860 +71861 +71862 +71863 +71864 +71865 +71866 +71867 +71868 +71869 +71870 +71871 +71872 +71873 +71874 +71875 +71876 +71877 +71878 +71879 +71880 +71881 +71882 +71883 +71884 +71885 +71886 +71887 +71888 +71889 +71890 +71891 +71892 +71893 +71894 +71895 +71896 +71897 +71898 +71899 +71900 +71901 +71902 +71903 +71904 +71905 +71906 +71907 +71908 +71909 +71910 +71911 +71912 +71913 +71914 +71915 +71916 +71917 +71918 +71919 +71920 +71921 +71922 +71923 +71924 +71925 +71926 +71927 +71928 +71929 +71930 +71931 +71932 +71933 +71934 +71935 +71936 +71937 +71938 +71939 +71940 +71941 +71942 +71943 +71944 +71945 +71946 +71947 +71948 +71949 +71950 +71951 +71952 +71953 +71954 +71955 +71956 +71957 +71958 +71959 +71960 +71961 +71962 +71963 +71964 +71965 +71966 +71967 +71968 +71969 +71970 +71971 +71972 +71973 +71974 +71975 +71976 +71977 +71978 +71979 +71980 +71981 +71982 +71983 +71984 +71985 +71986 +71987 +71988 +71989 +71990 +71991 +71992 +71993 +71994 +71995 +71996 +71997 +71998 +71999 +72000 +72001 +72002 +72003 +72004 +72005 +72006 +72007 +72008 +72009 +72010 +72011 +72012 +72013 +72014 +72015 +72016 +72017 +72018 +72019 +72020 +72021 +72022 +72023 +72024 +72025 +72026 +72027 +72028 +72029 +72030 +72031 +72032 +72033 +72034 +72035 +72036 +72037 +72038 +72039 +72040 +72041 +72042 +72043 +72044 +72045 +72046 +72047 +72048 +72049 +72050 +72051 +72052 +72053 +72054 +72055 +72056 +72057 +72058 +72059 +72060 +72061 +72062 +72063 +72064 +72065 +72066 +72067 +72068 +72069 +72070 +72071 +72072 +72073 +72074 +72075 +72076 +72077 +72078 +72079 +72080 +72081 +72082 +72083 +72084 +72085 +72086 +72087 +72088 +72089 +72090 +72091 +72092 +72093 +72094 +72095 +72096 +72097 +72098 +72099 +72100 +72101 +72102 +72103 +72104 +72105 +72106 +72107 +72108 +72109 +72110 +72111 +72112 +72113 +72114 +72115 +72116 +72117 +72118 +72119 +72120 +72121 +72122 +72123 +72124 +72125 +72126 +72127 +72128 +72129 +72130 +72131 +72132 +72133 +72134 +72135 +72136 +72137 +72138 +72139 +72140 +72141 +72142 +72143 +72144 +72145 +72146 +72147 +72148 +72149 +72150 +72151 +72152 +72153 +72154 +72155 +72156 +72157 +72158 +72159 +72160 +72161 +72162 +72163 +72164 +72165 +72166 +72167 +72168 +72169 +72170 +72171 +72172 +72173 +72174 +72175 +72176 +72177 +72178 +72179 +72180 +72181 +72182 +72183 +72184 +72185 +72186 +72187 +72188 +72189 +72190 +72191 +72192 +72193 +72194 +72195 +72196 +72197 +72198 +72199 +72200 +72201 +72202 +72203 +72204 +72205 +72206 +72207 +72208 +72209 +72210 +72211 +72212 +72213 +72214 +72215 +72216 +72217 +72218 +72219 +72220 +72221 +72222 +72223 +72224 +72225 +72226 +72227 +72228 +72229 +72230 +72231 +72232 +72233 +72234 +72235 +72236 +72237 +72238 +72239 +72240 +72241 +72242 +72243 +72244 +72245 +72246 +72247 +72248 +72249 +72250 +72251 +72252 +72253 +72254 +72255 +72256 +72257 +72258 +72259 +72260 +72261 +72262 +72263 +72264 +72265 +72266 +72267 +72268 +72269 +72270 +72271 +72272 +72273 +72274 +72275 +72276 +72277 +72278 +72279 +72280 +72281 +72282 +72283 +72284 +72285 +72286 +72287 +72288 +72289 +72290 +72291 +72292 +72293 +72294 +72295 +72296 +72297 +72298 +72299 +72300 +72301 +72302 +72303 +72304 +72305 +72306 +72307 +72308 +72309 +72310 +72311 +72312 +72313 +72314 +72315 +72316 +72317 +72318 +72319 +72320 +72321 +72322 +72323 +72324 +72325 +72326 +72327 +72328 +72329 +72330 +72331 +72332 +72333 +72334 +72335 +72336 +72337 +72338 +72339 +72340 +72341 +72342 +72343 +72344 +72345 +72346 +72347 +72348 +72349 +72350 +72351 +72352 +72353 +72354 +72355 +72356 +72357 +72358 +72359 +72360 +72361 +72362 +72363 +72364 +72365 +72366 +72367 +72368 +72369 +72370 +72371 +72372 +72373 +72374 +72375 +72376 +72377 +72378 +72379 +72380 +72381 +72382 +72383 +72384 +72385 +72386 +72387 +72388 +72389 +72390 +72391 +72392 +72393 +72394 +72395 +72396 +72397 +72398 +72399 +72400 +72401 +72402 +72403 +72404 +72405 +72406 +72407 +72408 +72409 +72410 +72411 +72412 +72413 +72414 +72415 +72416 +72417 +72418 +72419 +72420 +72421 +72422 +72423 +72424 +72425 +72426 +72427 +72428 +72429 +72430 +72431 +72432 +72433 +72434 +72435 +72436 +72437 +72438 +72439 +72440 +72441 +72442 +72443 +72444 +72445 +72446 +72447 +72448 +72449 +72450 +72451 +72452 +72453 +72454 +72455 +72456 +72457 +72458 +72459 +72460 +72461 +72462 +72463 +72464 +72465 +72466 +72467 +72468 +72469 +72470 +72471 +72472 +72473 +72474 +72475 +72476 +72477 +72478 +72479 +72480 +72481 +72482 +72483 +72484 +72485 +72486 +72487 +72488 +72489 +72490 +72491 +72492 +72493 +72494 +72495 +72496 +72497 +72498 +72499 +72500 +72501 +72502 +72503 +72504 +72505 +72506 +72507 +72508 +72509 +72510 +72511 +72512 +72513 +72514 +72515 +72516 +72517 +72518 +72519 +72520 +72521 +72522 +72523 +72524 +72525 +72526 +72527 +72528 +72529 +72530 +72531 +72532 +72533 +72534 +72535 +72536 +72537 +72538 +72539 +72540 +72541 +72542 +72543 +72544 +72545 +72546 +72547 +72548 +72549 +72550 +72551 +72552 +72553 +72554 +72555 +72556 +72557 +72558 +72559 +72560 +72561 +72562 +72563 +72564 +72565 +72566 +72567 +72568 +72569 +72570 +72571 +72572 +72573 +72574 +72575 +72576 +72577 +72578 +72579 +72580 +72581 +72582 +72583 +72584 +72585 +72586 +72587 +72588 +72589 +72590 +72591 +72592 +72593 +72594 +72595 +72596 +72597 +72598 +72599 +72600 +72601 +72602 +72603 +72604 +72605 +72606 +72607 +72608 +72609 +72610 +72611 +72612 +72613 +72614 +72615 +72616 +72617 +72618 +72619 +72620 +72621 +72622 +72623 +72624 +72625 +72626 +72627 +72628 +72629 +72630 +72631 +72632 +72633 +72634 +72635 +72636 +72637 +72638 +72639 +72640 +72641 +72642 +72643 +72644 +72645 +72646 +72647 +72648 +72649 +72650 +72651 +72652 +72653 +72654 +72655 +72656 +72657 +72658 +72659 +72660 +72661 +72662 +72663 +72664 +72665 +72666 +72667 +72668 +72669 +72670 +72671 +72672 +72673 +72674 +72675 +72676 +72677 +72678 +72679 +72680 +72681 +72682 +72683 +72684 +72685 +72686 +72687 +72688 +72689 +72690 +72691 +72692 +72693 +72694 +72695 +72696 +72697 +72698 +72699 +72700 +72701 +72702 +72703 +72704 +72705 +72706 +72707 +72708 +72709 +72710 +72711 +72712 +72713 +72714 +72715 +72716 +72717 +72718 +72719 +72720 +72721 +72722 +72723 +72724 +72725 +72726 +72727 +72728 +72729 +72730 +72731 +72732 +72733 +72734 +72735 +72736 +72737 +72738 +72739 +72740 +72741 +72742 +72743 +72744 +72745 +72746 +72747 +72748 +72749 +72750 +72751 +72752 +72753 +72754 +72755 +72756 +72757 +72758 +72759 +72760 +72761 +72762 +72763 +72764 +72765 +72766 +72767 +72768 +72769 +72770 +72771 +72772 +72773 +72774 +72775 +72776 +72777 +72778 +72779 +72780 +72781 +72782 +72783 +72784 +72785 +72786 +72787 +72788 +72789 +72790 +72791 +72792 +72793 +72794 +72795 +72796 +72797 +72798 +72799 +72800 +72801 +72802 +72803 +72804 +72805 +72806 +72807 +72808 +72809 +72810 +72811 +72812 +72813 +72814 +72815 +72816 +72817 +72818 +72819 +72820 +72821 +72822 +72823 +72824 +72825 +72826 +72827 +72828 +72829 +72830 +72831 +72832 +72833 +72834 +72835 +72836 +72837 +72838 +72839 +72840 +72841 +72842 +72843 +72844 +72845 +72846 +72847 +72848 +72849 +72850 +72851 +72852 +72853 +72854 +72855 +72856 +72857 +72858 +72859 +72860 +72861 +72862 +72863 +72864 +72865 +72866 +72867 +72868 +72869 +72870 +72871 +72872 +72873 +72874 +72875 +72876 +72877 +72878 +72879 +72880 +72881 +72882 +72883 +72884 +72885 +72886 +72887 +72888 +72889 +72890 +72891 +72892 +72893 +72894 +72895 +72896 +72897 +72898 +72899 +72900 +72901 +72902 +72903 +72904 +72905 +72906 +72907 +72908 +72909 +72910 +72911 +72912 +72913 +72914 +72915 +72916 +72917 +72918 +72919 +72920 +72921 +72922 +72923 +72924 +72925 +72926 +72927 +72928 +72929 +72930 +72931 +72932 +72933 +72934 +72935 +72936 +72937 +72938 +72939 +72940 +72941 +72942 +72943 +72944 +72945 +72946 +72947 +72948 +72949 +72950 +72951 +72952 +72953 +72954 +72955 +72956 +72957 +72958 +72959 +72960 +72961 +72962 +72963 +72964 +72965 +72966 +72967 +72968 +72969 +72970 +72971 +72972 +72973 +72974 +72975 +72976 +72977 +72978 +72979 +72980 +72981 +72982 +72983 +72984 +72985 +72986 +72987 +72988 +72989 +72990 +72991 +72992 +72993 +72994 +72995 +72996 +72997 +72998 +72999 +73000 +73001 +73002 +73003 +73004 +73005 +73006 +73007 +73008 +73009 +73010 +73011 +73012 +73013 +73014 +73015 +73016 +73017 +73018 +73019 +73020 +73021 +73022 +73023 +73024 +73025 +73026 +73027 +73028 +73029 +73030 +73031 +73032 +73033 +73034 +73035 +73036 +73037 +73038 +73039 +73040 +73041 +73042 +73043 +73044 +73045 +73046 +73047 +73048 +73049 +73050 +73051 +73052 +73053 +73054 +73055 +73056 +73057 +73058 +73059 +73060 +73061 +73062 +73063 +73064 +73065 +73066 +73067 +73068 +73069 +73070 +73071 +73072 +73073 +73074 +73075 +73076 +73077 +73078 +73079 +73080 +73081 +73082 +73083 +73084 +73085 +73086 +73087 +73088 +73089 +73090 +73091 +73092 +73093 +73094 +73095 +73096 +73097 +73098 +73099 +73100 +73101 +73102 +73103 +73104 +73105 +73106 +73107 +73108 +73109 +73110 +73111 +73112 +73113 +73114 +73115 +73116 +73117 +73118 +73119 +73120 +73121 +73122 +73123 +73124 +73125 +73126 +73127 +73128 +73129 +73130 +73131 +73132 +73133 +73134 +73135 +73136 +73137 +73138 +73139 +73140 +73141 +73142 +73143 +73144 +73145 +73146 +73147 +73148 +73149 +73150 +73151 +73152 +73153 +73154 +73155 +73156 +73157 +73158 +73159 +73160 +73161 +73162 +73163 +73164 +73165 +73166 +73167 +73168 +73169 +73170 +73171 +73172 +73173 +73174 +73175 +73176 +73177 +73178 +73179 +73180 +73181 +73182 +73183 +73184 +73185 +73186 +73187 +73188 +73189 +73190 +73191 +73192 +73193 +73194 +73195 +73196 +73197 +73198 +73199 +73200 +73201 +73202 +73203 +73204 +73205 +73206 +73207 +73208 +73209 +73210 +73211 +73212 +73213 +73214 +73215 +73216 +73217 +73218 +73219 +73220 +73221 +73222 +73223 +73224 +73225 +73226 +73227 +73228 +73229 +73230 +73231 +73232 +73233 +73234 +73235 +73236 +73237 +73238 +73239 +73240 +73241 +73242 +73243 +73244 +73245 +73246 +73247 +73248 +73249 +73250 +73251 +73252 +73253 +73254 +73255 +73256 +73257 +73258 +73259 +73260 +73261 +73262 +73263 +73264 +73265 +73266 +73267 +73268 +73269 +73270 +73271 +73272 +73273 +73274 +73275 +73276 +73277 +73278 +73279 +73280 +73281 +73282 +73283 +73284 +73285 +73286 +73287 +73288 +73289 +73290 +73291 +73292 +73293 +73294 +73295 +73296 +73297 +73298 +73299 +73300 +73301 +73302 +73303 +73304 +73305 +73306 +73307 +73308 +73309 +73310 +73311 +73312 +73313 +73314 +73315 +73316 +73317 +73318 +73319 +73320 +73321 +73322 +73323 +73324 +73325 +73326 +73327 +73328 +73329 +73330 +73331 +73332 +73333 +73334 +73335 +73336 +73337 +73338 +73339 +73340 +73341 +73342 +73343 +73344 +73345 +73346 +73347 +73348 +73349 +73350 +73351 +73352 +73353 +73354 +73355 +73356 +73357 +73358 +73359 +73360 +73361 +73362 +73363 +73364 +73365 +73366 +73367 +73368 +73369 +73370 +73371 +73372 +73373 +73374 +73375 +73376 +73377 +73378 +73379 +73380 +73381 +73382 +73383 +73384 +73385 +73386 +73387 +73388 +73389 +73390 +73391 +73392 +73393 +73394 +73395 +73396 +73397 +73398 +73399 +73400 +73401 +73402 +73403 +73404 +73405 +73406 +73407 +73408 +73409 +73410 +73411 +73412 +73413 +73414 +73415 +73416 +73417 +73418 +73419 +73420 +73421 +73422 +73423 +73424 +73425 +73426 +73427 +73428 +73429 +73430 +73431 +73432 +73433 +73434 +73435 +73436 +73437 +73438 +73439 +73440 +73441 +73442 +73443 +73444 +73445 +73446 +73447 +73448 +73449 +73450 +73451 +73452 +73453 +73454 +73455 +73456 +73457 +73458 +73459 +73460 +73461 +73462 +73463 +73464 +73465 +73466 +73467 +73468 +73469 +73470 +73471 +73472 +73473 +73474 +73475 +73476 +73477 +73478 +73479 +73480 +73481 +73482 +73483 +73484 +73485 +73486 +73487 +73488 +73489 +73490 +73491 +73492 +73493 +73494 +73495 +73496 +73497 +73498 +73499 +73500 +73501 +73502 +73503 +73504 +73505 +73506 +73507 +73508 +73509 +73510 +73511 +73512 +73513 +73514 +73515 +73516 +73517 +73518 +73519 +73520 +73521 +73522 +73523 +73524 +73525 +73526 +73527 +73528 +73529 +73530 +73531 +73532 +73533 +73534 +73535 +73536 +73537 +73538 +73539 +73540 +73541 +73542 +73543 +73544 +73545 +73546 +73547 +73548 +73549 +73550 +73551 +73552 +73553 +73554 +73555 +73556 +73557 +73558 +73559 +73560 +73561 +73562 +73563 +73564 +73565 +73566 +73567 +73568 +73569 +73570 +73571 +73572 +73573 +73574 +73575 +73576 +73577 +73578 +73579 +73580 +73581 +73582 +73583 +73584 +73585 +73586 +73587 +73588 +73589 +73590 +73591 +73592 +73593 +73594 +73595 +73596 +73597 +73598 +73599 +73600 +73601 +73602 +73603 +73604 +73605 +73606 +73607 +73608 +73609 +73610 +73611 +73612 +73613 +73614 +73615 +73616 +73617 +73618 +73619 +73620 +73621 +73622 +73623 +73624 +73625 +73626 +73627 +73628 +73629 +73630 +73631 +73632 +73633 +73634 +73635 +73636 +73637 +73638 +73639 +73640 +73641 +73642 +73643 +73644 +73645 +73646 +73647 +73648 +73649 +73650 +73651 +73652 +73653 +73654 +73655 +73656 +73657 +73658 +73659 +73660 +73661 +73662 +73663 +73664 +73665 +73666 +73667 +73668 +73669 +73670 +73671 +73672 +73673 +73674 +73675 +73676 +73677 +73678 +73679 +73680 +73681 +73682 +73683 +73684 +73685 +73686 +73687 +73688 +73689 +73690 +73691 +73692 +73693 +73694 +73695 +73696 +73697 +73698 +73699 +73700 +73701 +73702 +73703 +73704 +73705 +73706 +73707 +73708 +73709 +73710 +73711 +73712 +73713 +73714 +73715 +73716 +73717 +73718 +73719 +73720 +73721 +73722 +73723 +73724 +73725 +73726 +73727 +73728 +73729 +73730 +73731 +73732 +73733 +73734 +73735 +73736 +73737 +73738 +73739 +73740 +73741 +73742 +73743 +73744 +73745 +73746 +73747 +73748 +73749 +73750 +73751 +73752 +73753 +73754 +73755 +73756 +73757 +73758 +73759 +73760 +73761 +73762 +73763 +73764 +73765 +73766 +73767 +73768 +73769 +73770 +73771 +73772 +73773 +73774 +73775 +73776 +73777 +73778 +73779 +73780 +73781 +73782 +73783 +73784 +73785 +73786 +73787 +73788 +73789 +73790 +73791 +73792 +73793 +73794 +73795 +73796 +73797 +73798 +73799 +73800 +73801 +73802 +73803 +73804 +73805 +73806 +73807 +73808 +73809 +73810 +73811 +73812 +73813 +73814 +73815 +73816 +73817 +73818 +73819 +73820 +73821 +73822 +73823 +73824 +73825 +73826 +73827 +73828 +73829 +73830 +73831 +73832 +73833 +73834 +73835 +73836 +73837 +73838 +73839 +73840 +73841 +73842 +73843 +73844 +73845 +73846 +73847 +73848 +73849 +73850 +73851 +73852 +73853 +73854 +73855 +73856 +73857 +73858 +73859 +73860 +73861 +73862 +73863 +73864 +73865 +73866 +73867 +73868 +73869 +73870 +73871 +73872 +73873 +73874 +73875 +73876 +73877 +73878 +73879 +73880 +73881 +73882 +73883 +73884 +73885 +73886 +73887 +73888 +73889 +73890 +73891 +73892 +73893 +73894 +73895 +73896 +73897 +73898 +73899 +73900 +73901 +73902 +73903 +73904 +73905 +73906 +73907 +73908 +73909 +73910 +73911 +73912 +73913 +73914 +73915 +73916 +73917 +73918 +73919 +73920 +73921 +73922 +73923 +73924 +73925 +73926 +73927 +73928 +73929 +73930 +73931 +73932 +73933 +73934 +73935 +73936 +73937 +73938 +73939 +73940 +73941 +73942 +73943 +73944 +73945 +73946 +73947 +73948 +73949 +73950 +73951 +73952 +73953 +73954 +73955 +73956 +73957 +73958 +73959 +73960 +73961 +73962 +73963 +73964 +73965 +73966 +73967 +73968 +73969 +73970 +73971 +73972 +73973 +73974 +73975 +73976 +73977 +73978 +73979 +73980 +73981 +73982 +73983 +73984 +73985 +73986 +73987 +73988 +73989 +73990 +73991 +73992 +73993 +73994 +73995 +73996 +73997 +73998 +73999 +74000 +74001 +74002 +74003 +74004 +74005 +74006 +74007 +74008 +74009 +74010 +74011 +74012 +74013 +74014 +74015 +74016 +74017 +74018 +74019 +74020 +74021 +74022 +74023 +74024 +74025 +74026 +74027 +74028 +74029 +74030 +74031 +74032 +74033 +74034 +74035 +74036 +74037 +74038 +74039 +74040 +74041 +74042 +74043 +74044 +74045 +74046 +74047 +74048 +74049 +74050 +74051 +74052 +74053 +74054 +74055 +74056 +74057 +74058 +74059 +74060 +74061 +74062 +74063 +74064 +74065 +74066 +74067 +74068 +74069 +74070 +74071 +74072 +74073 +74074 +74075 +74076 +74077 +74078 +74079 +74080 +74081 +74082 +74083 +74084 +74085 +74086 +74087 +74088 +74089 +74090 +74091 +74092 +74093 +74094 +74095 +74096 +74097 +74098 +74099 +74100 +74101 +74102 +74103 +74104 +74105 +74106 +74107 +74108 +74109 +74110 +74111 +74112 +74113 +74114 +74115 +74116 +74117 +74118 +74119 +74120 +74121 +74122 +74123 +74124 +74125 +74126 +74127 +74128 +74129 +74130 +74131 +74132 +74133 +74134 +74135 +74136 +74137 +74138 +74139 +74140 +74141 +74142 +74143 +74144 +74145 +74146 +74147 +74148 +74149 +74150 +74151 +74152 +74153 +74154 +74155 +74156 +74157 +74158 +74159 +74160 +74161 +74162 +74163 +74164 +74165 +74166 +74167 +74168 +74169 +74170 +74171 +74172 +74173 +74174 +74175 +74176 +74177 +74178 +74179 +74180 +74181 +74182 +74183 +74184 +74185 +74186 +74187 +74188 +74189 +74190 +74191 +74192 +74193 +74194 +74195 +74196 +74197 +74198 +74199 +74200 +74201 +74202 +74203 +74204 +74205 +74206 +74207 +74208 +74209 +74210 +74211 +74212 +74213 +74214 +74215 +74216 +74217 +74218 +74219 +74220 +74221 +74222 +74223 +74224 +74225 +74226 +74227 +74228 +74229 +74230 +74231 +74232 +74233 +74234 +74235 +74236 +74237 +74238 +74239 +74240 +74241 +74242 +74243 +74244 +74245 +74246 +74247 +74248 +74249 +74250 +74251 +74252 +74253 +74254 +74255 +74256 +74257 +74258 +74259 +74260 +74261 +74262 +74263 +74264 +74265 +74266 +74267 +74268 +74269 +74270 +74271 +74272 +74273 +74274 +74275 +74276 +74277 +74278 +74279 +74280 +74281 +74282 +74283 +74284 +74285 +74286 +74287 +74288 +74289 +74290 +74291 +74292 +74293 +74294 +74295 +74296 +74297 +74298 +74299 +74300 +74301 +74302 +74303 +74304 +74305 +74306 +74307 +74308 +74309 +74310 +74311 +74312 +74313 +74314 +74315 +74316 +74317 +74318 +74319 +74320 +74321 +74322 +74323 +74324 +74325 +74326 +74327 +74328 +74329 +74330 +74331 +74332 +74333 +74334 +74335 +74336 +74337 +74338 +74339 +74340 +74341 +74342 +74343 +74344 +74345 +74346 +74347 +74348 +74349 +74350 +74351 +74352 +74353 +74354 +74355 +74356 +74357 +74358 +74359 +74360 +74361 +74362 +74363 +74364 +74365 +74366 +74367 +74368 +74369 +74370 +74371 +74372 +74373 +74374 +74375 +74376 +74377 +74378 +74379 +74380 +74381 +74382 +74383 +74384 +74385 +74386 +74387 +74388 +74389 +74390 +74391 +74392 +74393 +74394 +74395 +74396 +74397 +74398 +74399 +74400 +74401 +74402 +74403 +74404 +74405 +74406 +74407 +74408 +74409 +74410 +74411 +74412 +74413 +74414 +74415 +74416 +74417 +74418 +74419 +74420 +74421 +74422 +74423 +74424 +74425 +74426 +74427 +74428 +74429 +74430 +74431 +74432 +74433 +74434 +74435 +74436 +74437 +74438 +74439 +74440 +74441 +74442 +74443 +74444 +74445 +74446 +74447 +74448 +74449 +74450 +74451 +74452 +74453 +74454 +74455 +74456 +74457 +74458 +74459 +74460 +74461 +74462 +74463 +74464 +74465 +74466 +74467 +74468 +74469 +74470 +74471 +74472 +74473 +74474 +74475 +74476 +74477 +74478 +74479 +74480 +74481 +74482 +74483 +74484 +74485 +74486 +74487 +74488 +74489 +74490 +74491 +74492 +74493 +74494 +74495 +74496 +74497 +74498 +74499 +74500 +74501 +74502 +74503 +74504 +74505 +74506 +74507 +74508 +74509 +74510 +74511 +74512 +74513 +74514 +74515 +74516 +74517 +74518 +74519 +74520 +74521 +74522 +74523 +74524 +74525 +74526 +74527 +74528 +74529 +74530 +74531 +74532 +74533 +74534 +74535 +74536 +74537 +74538 +74539 +74540 +74541 +74542 +74543 +74544 +74545 +74546 +74547 +74548 +74549 +74550 +74551 +74552 +74553 +74554 +74555 +74556 +74557 +74558 +74559 +74560 +74561 +74562 +74563 +74564 +74565 +74566 +74567 +74568 +74569 +74570 +74571 +74572 +74573 +74574 +74575 +74576 +74577 +74578 +74579 +74580 +74581 +74582 +74583 +74584 +74585 +74586 +74587 +74588 +74589 +74590 +74591 +74592 +74593 +74594 +74595 +74596 +74597 +74598 +74599 +74600 +74601 +74602 +74603 +74604 +74605 +74606 +74607 +74608 +74609 +74610 +74611 +74612 +74613 +74614 +74615 +74616 +74617 +74618 +74619 +74620 +74621 +74622 +74623 +74624 +74625 +74626 +74627 +74628 +74629 +74630 +74631 +74632 +74633 +74634 +74635 +74636 +74637 +74638 +74639 +74640 +74641 +74642 +74643 +74644 +74645 +74646 +74647 +74648 +74649 +74650 +74651 +74652 +74653 +74654 +74655 +74656 +74657 +74658 +74659 +74660 +74661 +74662 +74663 +74664 +74665 +74666 +74667 +74668 +74669 +74670 +74671 +74672 +74673 +74674 +74675 +74676 +74677 +74678 +74679 +74680 +74681 +74682 +74683 +74684 +74685 +74686 +74687 +74688 +74689 +74690 +74691 +74692 +74693 +74694 +74695 +74696 +74697 +74698 +74699 +74700 +74701 +74702 +74703 +74704 +74705 +74706 +74707 +74708 +74709 +74710 +74711 +74712 +74713 +74714 +74715 +74716 +74717 +74718 +74719 +74720 +74721 +74722 +74723 +74724 +74725 +74726 +74727 +74728 +74729 +74730 +74731 +74732 +74733 +74734 +74735 +74736 +74737 +74738 +74739 +74740 +74741 +74742 +74743 +74744 +74745 +74746 +74747 +74748 +74749 +74750 +74751 +74752 +74753 +74754 +74755 +74756 +74757 +74758 +74759 +74760 +74761 +74762 +74763 +74764 +74765 +74766 +74767 +74768 +74769 +74770 +74771 +74772 +74773 +74774 +74775 +74776 +74777 +74778 +74779 +74780 +74781 +74782 +74783 +74784 +74785 +74786 +74787 +74788 +74789 +74790 +74791 +74792 +74793 +74794 +74795 +74796 +74797 +74798 +74799 +74800 +74801 +74802 +74803 +74804 +74805 +74806 +74807 +74808 +74809 +74810 +74811 +74812 +74813 +74814 +74815 +74816 +74817 +74818 +74819 +74820 +74821 +74822 +74823 +74824 +74825 +74826 +74827 +74828 +74829 +74830 +74831 +74832 +74833 +74834 +74835 +74836 +74837 +74838 +74839 +74840 +74841 +74842 +74843 +74844 +74845 +74846 +74847 +74848 +74849 +74850 +74851 +74852 +74853 +74854 +74855 +74856 +74857 +74858 +74859 +74860 +74861 +74862 +74863 +74864 +74865 +74866 +74867 +74868 +74869 +74870 +74871 +74872 +74873 +74874 +74875 +74876 +74877 +74878 +74879 +74880 +74881 +74882 +74883 +74884 +74885 +74886 +74887 +74888 +74889 +74890 +74891 +74892 +74893 +74894 +74895 +74896 +74897 +74898 +74899 +74900 +74901 +74902 +74903 +74904 +74905 +74906 +74907 +74908 +74909 +74910 +74911 +74912 +74913 +74914 +74915 +74916 +74917 +74918 +74919 +74920 +74921 +74922 +74923 +74924 +74925 +74926 +74927 +74928 +74929 +74930 +74931 +74932 +74933 +74934 +74935 +74936 +74937 +74938 +74939 +74940 +74941 +74942 +74943 +74944 +74945 +74946 +74947 +74948 +74949 +74950 +74951 +74952 +74953 +74954 +74955 +74956 +74957 +74958 +74959 +74960 +74961 +74962 +74963 +74964 +74965 +74966 +74967 +74968 +74969 +74970 +74971 +74972 +74973 +74974 +74975 +74976 +74977 +74978 +74979 +74980 +74981 +74982 +74983 +74984 +74985 +74986 +74987 +74988 +74989 +74990 +74991 +74992 +74993 +74994 +74995 +74996 +74997 +74998 +74999 +75000 +75001 +75002 +75003 +75004 +75005 +75006 +75007 +75008 +75009 +75010 +75011 +75012 +75013 +75014 +75015 +75016 +75017 +75018 +75019 +75020 +75021 +75022 +75023 +75024 +75025 +75026 +75027 +75028 +75029 +75030 +75031 +75032 +75033 +75034 +75035 +75036 +75037 +75038 +75039 +75040 +75041 +75042 +75043 +75044 +75045 +75046 +75047 +75048 +75049 +75050 +75051 +75052 +75053 +75054 +75055 +75056 +75057 +75058 +75059 +75060 +75061 +75062 +75063 +75064 +75065 +75066 +75067 +75068 +75069 +75070 +75071 +75072 +75073 +75074 +75075 +75076 +75077 +75078 +75079 +75080 +75081 +75082 +75083 +75084 +75085 +75086 +75087 +75088 +75089 +75090 +75091 +75092 +75093 +75094 +75095 +75096 +75097 +75098 +75099 +75100 +75101 +75102 +75103 +75104 +75105 +75106 +75107 +75108 +75109 +75110 +75111 +75112 +75113 +75114 +75115 +75116 +75117 +75118 +75119 +75120 +75121 +75122 +75123 +75124 +75125 +75126 +75127 +75128 +75129 +75130 +75131 +75132 +75133 +75134 +75135 +75136 +75137 +75138 +75139 +75140 +75141 +75142 +75143 +75144 +75145 +75146 +75147 +75148 +75149 +75150 +75151 +75152 +75153 +75154 +75155 +75156 +75157 +75158 +75159 +75160 +75161 +75162 +75163 +75164 +75165 +75166 +75167 +75168 +75169 +75170 +75171 +75172 +75173 +75174 +75175 +75176 +75177 +75178 +75179 +75180 +75181 +75182 +75183 +75184 +75185 +75186 +75187 +75188 +75189 +75190 +75191 +75192 +75193 +75194 +75195 +75196 +75197 +75198 +75199 +75200 +75201 +75202 +75203 +75204 +75205 +75206 +75207 +75208 +75209 +75210 +75211 +75212 +75213 +75214 +75215 +75216 +75217 +75218 +75219 +75220 +75221 +75222 +75223 +75224 +75225 +75226 +75227 +75228 +75229 +75230 +75231 +75232 +75233 +75234 +75235 +75236 +75237 +75238 +75239 +75240 +75241 +75242 +75243 +75244 +75245 +75246 +75247 +75248 +75249 +75250 +75251 +75252 +75253 +75254 +75255 +75256 +75257 +75258 +75259 +75260 +75261 +75262 +75263 +75264 +75265 +75266 +75267 +75268 +75269 +75270 +75271 +75272 +75273 +75274 +75275 +75276 +75277 +75278 +75279 +75280 +75281 +75282 +75283 +75284 +75285 +75286 +75287 +75288 +75289 +75290 +75291 +75292 +75293 +75294 +75295 +75296 +75297 +75298 +75299 +75300 +75301 +75302 +75303 +75304 +75305 +75306 +75307 +75308 +75309 +75310 +75311 +75312 +75313 +75314 +75315 +75316 +75317 +75318 +75319 +75320 +75321 +75322 +75323 +75324 +75325 +75326 +75327 +75328 +75329 +75330 +75331 +75332 +75333 +75334 +75335 +75336 +75337 +75338 +75339 +75340 +75341 +75342 +75343 +75344 +75345 +75346 +75347 +75348 +75349 +75350 +75351 +75352 +75353 +75354 +75355 +75356 +75357 +75358 +75359 +75360 +75361 +75362 +75363 +75364 +75365 +75366 +75367 +75368 +75369 +75370 +75371 +75372 +75373 +75374 +75375 +75376 +75377 +75378 +75379 +75380 +75381 +75382 +75383 +75384 +75385 +75386 +75387 +75388 +75389 +75390 +75391 +75392 +75393 +75394 +75395 +75396 +75397 +75398 +75399 +75400 +75401 +75402 +75403 +75404 +75405 +75406 +75407 +75408 +75409 +75410 +75411 +75412 +75413 +75414 +75415 +75416 +75417 +75418 +75419 +75420 +75421 +75422 +75423 +75424 +75425 +75426 +75427 +75428 +75429 +75430 +75431 +75432 +75433 +75434 +75435 +75436 +75437 +75438 +75439 +75440 +75441 +75442 +75443 +75444 +75445 +75446 +75447 +75448 +75449 +75450 +75451 +75452 +75453 +75454 +75455 +75456 +75457 +75458 +75459 +75460 +75461 +75462 +75463 +75464 +75465 +75466 +75467 +75468 +75469 +75470 +75471 +75472 +75473 +75474 +75475 +75476 +75477 +75478 +75479 +75480 +75481 +75482 +75483 +75484 +75485 +75486 +75487 +75488 +75489 +75490 +75491 +75492 +75493 +75494 +75495 +75496 +75497 +75498 +75499 +75500 +75501 +75502 +75503 +75504 +75505 +75506 +75507 +75508 +75509 +75510 +75511 +75512 +75513 +75514 +75515 +75516 +75517 +75518 +75519 +75520 +75521 +75522 +75523 +75524 +75525 +75526 +75527 +75528 +75529 +75530 +75531 +75532 +75533 +75534 +75535 +75536 +75537 +75538 +75539 +75540 +75541 +75542 +75543 +75544 +75545 +75546 +75547 +75548 +75549 +75550 +75551 +75552 +75553 +75554 +75555 +75556 +75557 +75558 +75559 +75560 +75561 +75562 +75563 +75564 +75565 +75566 +75567 +75568 +75569 +75570 +75571 +75572 +75573 +75574 +75575 +75576 +75577 +75578 +75579 +75580 +75581 +75582 +75583 +75584 +75585 +75586 +75587 +75588 +75589 +75590 +75591 +75592 +75593 +75594 +75595 +75596 +75597 +75598 +75599 +75600 +75601 +75602 +75603 +75604 +75605 +75606 +75607 +75608 +75609 +75610 +75611 +75612 +75613 +75614 +75615 +75616 +75617 +75618 +75619 +75620 +75621 +75622 +75623 +75624 +75625 +75626 +75627 +75628 +75629 +75630 +75631 +75632 +75633 +75634 +75635 +75636 +75637 +75638 +75639 +75640 +75641 +75642 +75643 +75644 +75645 +75646 +75647 +75648 +75649 +75650 +75651 +75652 +75653 +75654 +75655 +75656 +75657 +75658 +75659 +75660 +75661 +75662 +75663 +75664 +75665 +75666 +75667 +75668 +75669 +75670 +75671 +75672 +75673 +75674 +75675 +75676 +75677 +75678 +75679 +75680 +75681 +75682 +75683 +75684 +75685 +75686 +75687 +75688 +75689 +75690 +75691 +75692 +75693 +75694 +75695 +75696 +75697 +75698 +75699 +75700 +75701 +75702 +75703 +75704 +75705 +75706 +75707 +75708 +75709 +75710 +75711 +75712 +75713 +75714 +75715 +75716 +75717 +75718 +75719 +75720 +75721 +75722 +75723 +75724 +75725 +75726 +75727 +75728 +75729 +75730 +75731 +75732 +75733 +75734 +75735 +75736 +75737 +75738 +75739 +75740 +75741 +75742 +75743 +75744 +75745 +75746 +75747 +75748 +75749 +75750 +75751 +75752 +75753 +75754 +75755 +75756 +75757 +75758 +75759 +75760 +75761 +75762 +75763 +75764 +75765 +75766 +75767 +75768 +75769 +75770 +75771 +75772 +75773 +75774 +75775 +75776 +75777 +75778 +75779 +75780 +75781 +75782 +75783 +75784 +75785 +75786 +75787 +75788 +75789 +75790 +75791 +75792 +75793 +75794 +75795 +75796 +75797 +75798 +75799 +75800 +75801 +75802 +75803 +75804 +75805 +75806 +75807 +75808 +75809 +75810 +75811 +75812 +75813 +75814 +75815 +75816 +75817 +75818 +75819 +75820 +75821 +75822 +75823 +75824 +75825 +75826 +75827 +75828 +75829 +75830 +75831 +75832 +75833 +75834 +75835 +75836 +75837 +75838 +75839 +75840 +75841 +75842 +75843 +75844 +75845 +75846 +75847 +75848 +75849 +75850 +75851 +75852 +75853 +75854 +75855 +75856 +75857 +75858 +75859 +75860 +75861 +75862 +75863 +75864 +75865 +75866 +75867 +75868 +75869 +75870 +75871 +75872 +75873 +75874 +75875 +75876 +75877 +75878 +75879 +75880 +75881 +75882 +75883 +75884 +75885 +75886 +75887 +75888 +75889 +75890 +75891 +75892 +75893 +75894 +75895 +75896 +75897 +75898 +75899 +75900 +75901 +75902 +75903 +75904 +75905 +75906 +75907 +75908 +75909 +75910 +75911 +75912 +75913 +75914 +75915 +75916 +75917 +75918 +75919 +75920 +75921 +75922 +75923 +75924 +75925 +75926 +75927 +75928 +75929 +75930 +75931 +75932 +75933 +75934 +75935 +75936 +75937 +75938 +75939 +75940 +75941 +75942 +75943 +75944 +75945 +75946 +75947 +75948 +75949 +75950 +75951 +75952 +75953 +75954 +75955 +75956 +75957 +75958 +75959 +75960 +75961 +75962 +75963 +75964 +75965 +75966 +75967 +75968 +75969 +75970 +75971 +75972 +75973 +75974 +75975 +75976 +75977 +75978 +75979 +75980 +75981 +75982 +75983 +75984 +75985 +75986 +75987 +75988 +75989 +75990 +75991 +75992 +75993 +75994 +75995 +75996 +75997 +75998 +75999 +76000 +76001 +76002 +76003 +76004 +76005 +76006 +76007 +76008 +76009 +76010 +76011 +76012 +76013 +76014 +76015 +76016 +76017 +76018 +76019 +76020 +76021 +76022 +76023 +76024 +76025 +76026 +76027 +76028 +76029 +76030 +76031 +76032 +76033 +76034 +76035 +76036 +76037 +76038 +76039 +76040 +76041 +76042 +76043 +76044 +76045 +76046 +76047 +76048 +76049 +76050 +76051 +76052 +76053 +76054 +76055 +76056 +76057 +76058 +76059 +76060 +76061 +76062 +76063 +76064 +76065 +76066 +76067 +76068 +76069 +76070 +76071 +76072 +76073 +76074 +76075 +76076 +76077 +76078 +76079 +76080 +76081 +76082 +76083 +76084 +76085 +76086 +76087 +76088 +76089 +76090 +76091 +76092 +76093 +76094 +76095 +76096 +76097 +76098 +76099 +76100 +76101 +76102 +76103 +76104 +76105 +76106 +76107 +76108 +76109 +76110 +76111 +76112 +76113 +76114 +76115 +76116 +76117 +76118 +76119 +76120 +76121 +76122 +76123 +76124 +76125 +76126 +76127 +76128 +76129 +76130 +76131 +76132 +76133 +76134 +76135 +76136 +76137 +76138 +76139 +76140 +76141 +76142 +76143 +76144 +76145 +76146 +76147 +76148 +76149 +76150 +76151 +76152 +76153 +76154 +76155 +76156 +76157 +76158 +76159 +76160 +76161 +76162 +76163 +76164 +76165 +76166 +76167 +76168 +76169 +76170 +76171 +76172 +76173 +76174 +76175 +76176 +76177 +76178 +76179 +76180 +76181 +76182 +76183 +76184 +76185 +76186 +76187 +76188 +76189 +76190 +76191 +76192 +76193 +76194 +76195 +76196 +76197 +76198 +76199 +76200 +76201 +76202 +76203 +76204 +76205 +76206 +76207 +76208 +76209 +76210 +76211 +76212 +76213 +76214 +76215 +76216 +76217 +76218 +76219 +76220 +76221 +76222 +76223 +76224 +76225 +76226 +76227 +76228 +76229 +76230 +76231 +76232 +76233 +76234 +76235 +76236 +76237 +76238 +76239 +76240 +76241 +76242 +76243 +76244 +76245 +76246 +76247 +76248 +76249 +76250 +76251 +76252 +76253 +76254 +76255 +76256 +76257 +76258 +76259 +76260 +76261 +76262 +76263 +76264 +76265 +76266 +76267 +76268 +76269 +76270 +76271 +76272 +76273 +76274 +76275 +76276 +76277 +76278 +76279 +76280 +76281 +76282 +76283 +76284 +76285 +76286 +76287 +76288 +76289 +76290 +76291 +76292 +76293 +76294 +76295 +76296 +76297 +76298 +76299 +76300 +76301 +76302 +76303 +76304 +76305 +76306 +76307 +76308 +76309 +76310 +76311 +76312 +76313 +76314 +76315 +76316 +76317 +76318 +76319 +76320 +76321 +76322 +76323 +76324 +76325 +76326 +76327 +76328 +76329 +76330 +76331 +76332 +76333 +76334 +76335 +76336 +76337 +76338 +76339 +76340 +76341 +76342 +76343 +76344 +76345 +76346 +76347 +76348 +76349 +76350 +76351 +76352 +76353 +76354 +76355 +76356 +76357 +76358 +76359 +76360 +76361 +76362 +76363 +76364 +76365 +76366 +76367 +76368 +76369 +76370 +76371 +76372 +76373 +76374 +76375 +76376 +76377 +76378 +76379 +76380 +76381 +76382 +76383 +76384 +76385 +76386 +76387 +76388 +76389 +76390 +76391 +76392 +76393 +76394 +76395 +76396 +76397 +76398 +76399 +76400 +76401 +76402 +76403 +76404 +76405 +76406 +76407 +76408 +76409 +76410 +76411 +76412 +76413 +76414 +76415 +76416 +76417 +76418 +76419 +76420 +76421 +76422 +76423 +76424 +76425 +76426 +76427 +76428 +76429 +76430 +76431 +76432 +76433 +76434 +76435 +76436 +76437 +76438 +76439 +76440 +76441 +76442 +76443 +76444 +76445 +76446 +76447 +76448 +76449 +76450 +76451 +76452 +76453 +76454 +76455 +76456 +76457 +76458 +76459 +76460 +76461 +76462 +76463 +76464 +76465 +76466 +76467 +76468 +76469 +76470 +76471 +76472 +76473 +76474 +76475 +76476 +76477 +76478 +76479 +76480 +76481 +76482 +76483 +76484 +76485 +76486 +76487 +76488 +76489 +76490 +76491 +76492 +76493 +76494 +76495 +76496 +76497 +76498 +76499 +76500 +76501 +76502 +76503 +76504 +76505 +76506 +76507 +76508 +76509 +76510 +76511 +76512 +76513 +76514 +76515 +76516 +76517 +76518 +76519 +76520 +76521 +76522 +76523 +76524 +76525 +76526 +76527 +76528 +76529 +76530 +76531 +76532 +76533 +76534 +76535 +76536 +76537 +76538 +76539 +76540 +76541 +76542 +76543 +76544 +76545 +76546 +76547 +76548 +76549 +76550 +76551 +76552 +76553 +76554 +76555 +76556 +76557 +76558 +76559 +76560 +76561 +76562 +76563 +76564 +76565 +76566 +76567 +76568 +76569 +76570 +76571 +76572 +76573 +76574 +76575 +76576 +76577 +76578 +76579 +76580 +76581 +76582 +76583 +76584 +76585 +76586 +76587 +76588 +76589 +76590 +76591 +76592 +76593 +76594 +76595 +76596 +76597 +76598 +76599 +76600 +76601 +76602 +76603 +76604 +76605 +76606 +76607 +76608 +76609 +76610 +76611 +76612 +76613 +76614 +76615 +76616 +76617 +76618 +76619 +76620 +76621 +76622 +76623 +76624 +76625 +76626 +76627 +76628 +76629 +76630 +76631 +76632 +76633 +76634 +76635 +76636 +76637 +76638 +76639 +76640 +76641 +76642 +76643 +76644 +76645 +76646 +76647 +76648 +76649 +76650 +76651 +76652 +76653 +76654 +76655 +76656 +76657 +76658 +76659 +76660 +76661 +76662 +76663 +76664 +76665 +76666 +76667 +76668 +76669 +76670 +76671 +76672 +76673 +76674 +76675 +76676 +76677 +76678 +76679 +76680 +76681 +76682 +76683 +76684 +76685 +76686 +76687 +76688 +76689 +76690 +76691 +76692 +76693 +76694 +76695 +76696 +76697 +76698 +76699 +76700 +76701 +76702 +76703 +76704 +76705 +76706 +76707 +76708 +76709 +76710 +76711 +76712 +76713 +76714 +76715 +76716 +76717 +76718 +76719 +76720 +76721 +76722 +76723 +76724 +76725 +76726 +76727 +76728 +76729 +76730 +76731 +76732 +76733 +76734 +76735 +76736 +76737 +76738 +76739 +76740 +76741 +76742 +76743 +76744 +76745 +76746 +76747 +76748 +76749 +76750 +76751 +76752 +76753 +76754 +76755 +76756 +76757 +76758 +76759 +76760 +76761 +76762 +76763 +76764 +76765 +76766 +76767 +76768 +76769 +76770 +76771 +76772 +76773 +76774 +76775 +76776 +76777 +76778 +76779 +76780 +76781 +76782 +76783 +76784 +76785 +76786 +76787 +76788 +76789 +76790 +76791 +76792 +76793 +76794 +76795 +76796 +76797 +76798 +76799 +76800 +76801 +76802 +76803 +76804 +76805 +76806 +76807 +76808 +76809 +76810 +76811 +76812 +76813 +76814 +76815 +76816 +76817 +76818 +76819 +76820 +76821 +76822 +76823 +76824 +76825 +76826 +76827 +76828 +76829 +76830 +76831 +76832 +76833 +76834 +76835 +76836 +76837 +76838 +76839 +76840 +76841 +76842 +76843 +76844 +76845 +76846 +76847 +76848 +76849 +76850 +76851 +76852 +76853 +76854 +76855 +76856 +76857 +76858 +76859 +76860 +76861 +76862 +76863 +76864 +76865 +76866 +76867 +76868 +76869 +76870 +76871 +76872 +76873 +76874 +76875 +76876 +76877 +76878 +76879 +76880 +76881 +76882 +76883 +76884 +76885 +76886 +76887 +76888 +76889 +76890 +76891 +76892 +76893 +76894 +76895 +76896 +76897 +76898 +76899 +76900 +76901 +76902 +76903 +76904 +76905 +76906 +76907 +76908 +76909 +76910 +76911 +76912 +76913 +76914 +76915 +76916 +76917 +76918 +76919 +76920 +76921 +76922 +76923 +76924 +76925 +76926 +76927 +76928 +76929 +76930 +76931 +76932 +76933 +76934 +76935 +76936 +76937 +76938 +76939 +76940 +76941 +76942 +76943 +76944 +76945 +76946 +76947 +76948 +76949 +76950 +76951 +76952 +76953 +76954 +76955 +76956 +76957 +76958 +76959 +76960 +76961 +76962 +76963 +76964 +76965 +76966 +76967 +76968 +76969 +76970 +76971 +76972 +76973 +76974 +76975 +76976 +76977 +76978 +76979 +76980 +76981 +76982 +76983 +76984 +76985 +76986 +76987 +76988 +76989 +76990 +76991 +76992 +76993 +76994 +76995 +76996 +76997 +76998 +76999 +77000 +77001 +77002 +77003 +77004 +77005 +77006 +77007 +77008 +77009 +77010 +77011 +77012 +77013 +77014 +77015 +77016 +77017 +77018 +77019 +77020 +77021 +77022 +77023 +77024 +77025 +77026 +77027 +77028 +77029 +77030 +77031 +77032 +77033 +77034 +77035 +77036 +77037 +77038 +77039 +77040 +77041 +77042 +77043 +77044 +77045 +77046 +77047 +77048 +77049 +77050 +77051 +77052 +77053 +77054 +77055 +77056 +77057 +77058 +77059 +77060 +77061 +77062 +77063 +77064 +77065 +77066 +77067 +77068 +77069 +77070 +77071 +77072 +77073 +77074 +77075 +77076 +77077 +77078 +77079 +77080 +77081 +77082 +77083 +77084 +77085 +77086 +77087 +77088 +77089 +77090 +77091 +77092 +77093 +77094 +77095 +77096 +77097 +77098 +77099 +77100 +77101 +77102 +77103 +77104 +77105 +77106 +77107 +77108 +77109 +77110 +77111 +77112 +77113 +77114 +77115 +77116 +77117 +77118 +77119 +77120 +77121 +77122 +77123 +77124 +77125 +77126 +77127 +77128 +77129 +77130 +77131 +77132 +77133 +77134 +77135 +77136 +77137 +77138 +77139 +77140 +77141 +77142 +77143 +77144 +77145 +77146 +77147 +77148 +77149 +77150 +77151 +77152 +77153 +77154 +77155 +77156 +77157 +77158 +77159 +77160 +77161 +77162 +77163 +77164 +77165 +77166 +77167 +77168 +77169 +77170 +77171 +77172 +77173 +77174 +77175 +77176 +77177 +77178 +77179 +77180 +77181 +77182 +77183 +77184 +77185 +77186 +77187 +77188 +77189 +77190 +77191 +77192 +77193 +77194 +77195 +77196 +77197 +77198 +77199 +77200 +77201 +77202 +77203 +77204 +77205 +77206 +77207 +77208 +77209 +77210 +77211 +77212 +77213 +77214 +77215 +77216 +77217 +77218 +77219 +77220 +77221 +77222 +77223 +77224 +77225 +77226 +77227 +77228 +77229 +77230 +77231 +77232 +77233 +77234 +77235 +77236 +77237 +77238 +77239 +77240 +77241 +77242 +77243 +77244 +77245 +77246 +77247 +77248 +77249 +77250 +77251 +77252 +77253 +77254 +77255 +77256 +77257 +77258 +77259 +77260 +77261 +77262 +77263 +77264 +77265 +77266 +77267 +77268 +77269 +77270 +77271 +77272 +77273 +77274 +77275 +77276 +77277 +77278 +77279 +77280 +77281 +77282 +77283 +77284 +77285 +77286 +77287 +77288 +77289 +77290 +77291 +77292 +77293 +77294 +77295 +77296 +77297 +77298 +77299 +77300 +77301 +77302 +77303 +77304 +77305 +77306 +77307 +77308 +77309 +77310 +77311 +77312 +77313 +77314 +77315 +77316 +77317 +77318 +77319 +77320 +77321 +77322 +77323 +77324 +77325 +77326 +77327 +77328 +77329 +77330 +77331 +77332 +77333 +77334 +77335 +77336 +77337 +77338 +77339 +77340 +77341 +77342 +77343 +77344 +77345 +77346 +77347 +77348 +77349 +77350 +77351 +77352 +77353 +77354 +77355 +77356 +77357 +77358 +77359 +77360 +77361 +77362 +77363 +77364 +77365 +77366 +77367 +77368 +77369 +77370 +77371 +77372 +77373 +77374 +77375 +77376 +77377 +77378 +77379 +77380 +77381 +77382 +77383 +77384 +77385 +77386 +77387 +77388 +77389 +77390 +77391 +77392 +77393 +77394 +77395 +77396 +77397 +77398 +77399 +77400 +77401 +77402 +77403 +77404 +77405 +77406 +77407 +77408 +77409 +77410 +77411 +77412 +77413 +77414 +77415 +77416 +77417 +77418 +77419 +77420 +77421 +77422 +77423 +77424 +77425 +77426 +77427 +77428 +77429 +77430 +77431 +77432 +77433 +77434 +77435 +77436 +77437 +77438 +77439 +77440 +77441 +77442 +77443 +77444 +77445 +77446 +77447 +77448 +77449 +77450 +77451 +77452 +77453 +77454 +77455 +77456 +77457 +77458 +77459 +77460 +77461 +77462 +77463 +77464 +77465 +77466 +77467 +77468 +77469 +77470 +77471 +77472 +77473 +77474 +77475 +77476 +77477 +77478 +77479 +77480 +77481 +77482 +77483 +77484 +77485 +77486 +77487 +77488 +77489 +77490 +77491 +77492 +77493 +77494 +77495 +77496 +77497 +77498 +77499 +77500 +77501 +77502 +77503 +77504 +77505 +77506 +77507 +77508 +77509 +77510 +77511 +77512 +77513 +77514 +77515 +77516 +77517 +77518 +77519 +77520 +77521 +77522 +77523 +77524 +77525 +77526 +77527 +77528 +77529 +77530 +77531 +77532 +77533 +77534 +77535 +77536 +77537 +77538 +77539 +77540 +77541 +77542 +77543 +77544 +77545 +77546 +77547 +77548 +77549 +77550 +77551 +77552 +77553 +77554 +77555 +77556 +77557 +77558 +77559 +77560 +77561 +77562 +77563 +77564 +77565 +77566 +77567 +77568 +77569 +77570 +77571 +77572 +77573 +77574 +77575 +77576 +77577 +77578 +77579 +77580 +77581 +77582 +77583 +77584 +77585 +77586 +77587 +77588 +77589 +77590 +77591 +77592 +77593 +77594 +77595 +77596 +77597 +77598 +77599 +77600 +77601 +77602 +77603 +77604 +77605 +77606 +77607 +77608 +77609 +77610 +77611 +77612 +77613 +77614 +77615 +77616 +77617 +77618 +77619 +77620 +77621 +77622 +77623 +77624 +77625 +77626 +77627 +77628 +77629 +77630 +77631 +77632 +77633 +77634 +77635 +77636 +77637 +77638 +77639 +77640 +77641 +77642 +77643 +77644 +77645 +77646 +77647 +77648 +77649 +77650 +77651 +77652 +77653 +77654 +77655 +77656 +77657 +77658 +77659 +77660 +77661 +77662 +77663 +77664 +77665 +77666 +77667 +77668 +77669 +77670 +77671 +77672 +77673 +77674 +77675 +77676 +77677 +77678 +77679 +77680 +77681 +77682 +77683 +77684 +77685 +77686 +77687 +77688 +77689 +77690 +77691 +77692 +77693 +77694 +77695 +77696 +77697 +77698 +77699 +77700 +77701 +77702 +77703 +77704 +77705 +77706 +77707 +77708 +77709 +77710 +77711 +77712 +77713 +77714 +77715 +77716 +77717 +77718 +77719 +77720 +77721 +77722 +77723 +77724 +77725 +77726 +77727 +77728 +77729 +77730 +77731 +77732 +77733 +77734 +77735 +77736 +77737 +77738 +77739 +77740 +77741 +77742 +77743 +77744 +77745 +77746 +77747 +77748 +77749 +77750 +77751 +77752 +77753 +77754 +77755 +77756 +77757 +77758 +77759 +77760 +77761 +77762 +77763 +77764 +77765 +77766 +77767 +77768 +77769 +77770 +77771 +77772 +77773 +77774 +77775 +77776 +77777 +77778 +77779 +77780 +77781 +77782 +77783 +77784 +77785 +77786 +77787 +77788 +77789 +77790 +77791 +77792 +77793 +77794 +77795 +77796 +77797 +77798 +77799 +77800 +77801 +77802 +77803 +77804 +77805 +77806 +77807 +77808 +77809 +77810 +77811 +77812 +77813 +77814 +77815 +77816 +77817 +77818 +77819 +77820 +77821 +77822 +77823 +77824 +77825 +77826 +77827 +77828 +77829 +77830 +77831 +77832 +77833 +77834 +77835 +77836 +77837 +77838 +77839 +77840 +77841 +77842 +77843 +77844 +77845 +77846 +77847 +77848 +77849 +77850 +77851 +77852 +77853 +77854 +77855 +77856 +77857 +77858 +77859 +77860 +77861 +77862 +77863 +77864 +77865 +77866 +77867 +77868 +77869 +77870 +77871 +77872 +77873 +77874 +77875 +77876 +77877 +77878 +77879 +77880 +77881 +77882 +77883 +77884 +77885 +77886 +77887 +77888 +77889 +77890 +77891 +77892 +77893 +77894 +77895 +77896 +77897 +77898 +77899 +77900 +77901 +77902 +77903 +77904 +77905 +77906 +77907 +77908 +77909 +77910 +77911 +77912 +77913 +77914 +77915 +77916 +77917 +77918 +77919 +77920 +77921 +77922 +77923 +77924 +77925 +77926 +77927 +77928 +77929 +77930 +77931 +77932 +77933 +77934 +77935 +77936 +77937 +77938 +77939 +77940 +77941 +77942 +77943 +77944 +77945 +77946 +77947 +77948 +77949 +77950 +77951 +77952 +77953 +77954 +77955 +77956 +77957 +77958 +77959 +77960 +77961 +77962 +77963 +77964 +77965 +77966 +77967 +77968 +77969 +77970 +77971 +77972 +77973 +77974 +77975 +77976 +77977 +77978 +77979 +77980 +77981 +77982 +77983 +77984 +77985 +77986 +77987 +77988 +77989 +77990 +77991 +77992 +77993 +77994 +77995 +77996 +77997 +77998 +77999 +78000 +78001 +78002 +78003 +78004 +78005 +78006 +78007 +78008 +78009 +78010 +78011 +78012 +78013 +78014 +78015 +78016 +78017 +78018 +78019 +78020 +78021 +78022 +78023 +78024 +78025 +78026 +78027 +78028 +78029 +78030 +78031 +78032 +78033 +78034 +78035 +78036 +78037 +78038 +78039 +78040 +78041 +78042 +78043 +78044 +78045 +78046 +78047 +78048 +78049 +78050 +78051 +78052 +78053 +78054 +78055 +78056 +78057 +78058 +78059 +78060 +78061 +78062 +78063 +78064 +78065 +78066 +78067 +78068 +78069 +78070 +78071 +78072 +78073 +78074 +78075 +78076 +78077 +78078 +78079 +78080 +78081 +78082 +78083 +78084 +78085 +78086 +78087 +78088 +78089 +78090 +78091 +78092 +78093 +78094 +78095 +78096 +78097 +78098 +78099 +78100 +78101 +78102 +78103 +78104 +78105 +78106 +78107 +78108 +78109 +78110 +78111 +78112 +78113 +78114 +78115 +78116 +78117 +78118 +78119 +78120 +78121 +78122 +78123 +78124 +78125 +78126 +78127 +78128 +78129 +78130 +78131 +78132 +78133 +78134 +78135 +78136 +78137 +78138 +78139 +78140 +78141 +78142 +78143 +78144 +78145 +78146 +78147 +78148 +78149 +78150 +78151 +78152 +78153 +78154 +78155 +78156 +78157 +78158 +78159 +78160 +78161 +78162 +78163 +78164 +78165 +78166 +78167 +78168 +78169 +78170 +78171 +78172 +78173 +78174 +78175 +78176 +78177 +78178 +78179 +78180 +78181 +78182 +78183 +78184 +78185 +78186 +78187 +78188 +78189 +78190 +78191 +78192 +78193 +78194 +78195 +78196 +78197 +78198 +78199 +78200 +78201 +78202 +78203 +78204 +78205 +78206 +78207 +78208 +78209 +78210 +78211 +78212 +78213 +78214 +78215 +78216 +78217 +78218 +78219 +78220 +78221 +78222 +78223 +78224 +78225 +78226 +78227 +78228 +78229 +78230 +78231 +78232 +78233 +78234 +78235 +78236 +78237 +78238 +78239 +78240 +78241 +78242 +78243 +78244 +78245 +78246 +78247 +78248 +78249 +78250 +78251 +78252 +78253 +78254 +78255 +78256 +78257 +78258 +78259 +78260 +78261 +78262 +78263 +78264 +78265 +78266 +78267 +78268 +78269 +78270 +78271 +78272 +78273 +78274 +78275 +78276 +78277 +78278 +78279 +78280 +78281 +78282 +78283 +78284 +78285 +78286 +78287 +78288 +78289 +78290 +78291 +78292 +78293 +78294 +78295 +78296 +78297 +78298 +78299 +78300 +78301 +78302 +78303 +78304 +78305 +78306 +78307 +78308 +78309 +78310 +78311 +78312 +78313 +78314 +78315 +78316 +78317 +78318 +78319 +78320 +78321 +78322 +78323 +78324 +78325 +78326 +78327 +78328 +78329 +78330 +78331 +78332 +78333 +78334 +78335 +78336 +78337 +78338 +78339 +78340 +78341 +78342 +78343 +78344 +78345 +78346 +78347 +78348 +78349 +78350 +78351 +78352 +78353 +78354 +78355 +78356 +78357 +78358 +78359 +78360 +78361 +78362 +78363 +78364 +78365 +78366 +78367 +78368 +78369 +78370 +78371 +78372 +78373 +78374 +78375 +78376 +78377 +78378 +78379 +78380 +78381 +78382 +78383 +78384 +78385 +78386 +78387 +78388 +78389 +78390 +78391 +78392 +78393 +78394 +78395 +78396 +78397 +78398 +78399 +78400 +78401 +78402 +78403 +78404 +78405 +78406 +78407 +78408 +78409 +78410 +78411 +78412 +78413 +78414 +78415 +78416 +78417 +78418 +78419 +78420 +78421 +78422 +78423 +78424 +78425 +78426 +78427 +78428 +78429 +78430 +78431 +78432 +78433 +78434 +78435 +78436 +78437 +78438 +78439 +78440 +78441 +78442 +78443 +78444 +78445 +78446 +78447 +78448 +78449 +78450 +78451 +78452 +78453 +78454 +78455 +78456 +78457 +78458 +78459 +78460 +78461 +78462 +78463 +78464 +78465 +78466 +78467 +78468 +78469 +78470 +78471 +78472 +78473 +78474 +78475 +78476 +78477 +78478 +78479 +78480 +78481 +78482 +78483 +78484 +78485 +78486 +78487 +78488 +78489 +78490 +78491 +78492 +78493 +78494 +78495 +78496 +78497 +78498 +78499 +78500 +78501 +78502 +78503 +78504 +78505 +78506 +78507 +78508 +78509 +78510 +78511 +78512 +78513 +78514 +78515 +78516 +78517 +78518 +78519 +78520 +78521 +78522 +78523 +78524 +78525 +78526 +78527 +78528 +78529 +78530 +78531 +78532 +78533 +78534 +78535 +78536 +78537 +78538 +78539 +78540 +78541 +78542 +78543 +78544 +78545 +78546 +78547 +78548 +78549 +78550 +78551 +78552 +78553 +78554 +78555 +78556 +78557 +78558 +78559 +78560 +78561 +78562 +78563 +78564 +78565 +78566 +78567 +78568 +78569 +78570 +78571 +78572 +78573 +78574 +78575 +78576 +78577 +78578 +78579 +78580 +78581 +78582 +78583 +78584 +78585 +78586 +78587 +78588 +78589 +78590 +78591 +78592 +78593 +78594 +78595 +78596 +78597 +78598 +78599 +78600 +78601 +78602 +78603 +78604 +78605 +78606 +78607 +78608 +78609 +78610 +78611 +78612 +78613 +78614 +78615 +78616 +78617 +78618 +78619 +78620 +78621 +78622 +78623 +78624 +78625 +78626 +78627 +78628 +78629 +78630 +78631 +78632 +78633 +78634 +78635 +78636 +78637 +78638 +78639 +78640 +78641 +78642 +78643 +78644 +78645 +78646 +78647 +78648 +78649 +78650 +78651 +78652 +78653 +78654 +78655 +78656 +78657 +78658 +78659 +78660 +78661 +78662 +78663 +78664 +78665 +78666 +78667 +78668 +78669 +78670 +78671 +78672 +78673 +78674 +78675 +78676 +78677 +78678 +78679 +78680 +78681 +78682 +78683 +78684 +78685 +78686 +78687 +78688 +78689 +78690 +78691 +78692 +78693 +78694 +78695 +78696 +78697 +78698 +78699 +78700 +78701 +78702 +78703 +78704 +78705 +78706 +78707 +78708 +78709 +78710 +78711 +78712 +78713 +78714 +78715 +78716 +78717 +78718 +78719 +78720 +78721 +78722 +78723 +78724 +78725 +78726 +78727 +78728 +78729 +78730 +78731 +78732 +78733 +78734 +78735 +78736 +78737 +78738 +78739 +78740 +78741 +78742 +78743 +78744 +78745 +78746 +78747 +78748 +78749 +78750 +78751 +78752 +78753 +78754 +78755 +78756 +78757 +78758 +78759 +78760 +78761 +78762 +78763 +78764 +78765 +78766 +78767 +78768 +78769 +78770 +78771 +78772 +78773 +78774 +78775 +78776 +78777 +78778 +78779 +78780 +78781 +78782 +78783 +78784 +78785 +78786 +78787 +78788 +78789 +78790 +78791 +78792 +78793 +78794 +78795 +78796 +78797 +78798 +78799 +78800 +78801 +78802 +78803 +78804 +78805 +78806 +78807 +78808 +78809 +78810 +78811 +78812 +78813 +78814 +78815 +78816 +78817 +78818 +78819 +78820 +78821 +78822 +78823 +78824 +78825 +78826 +78827 +78828 +78829 +78830 +78831 +78832 +78833 +78834 +78835 +78836 +78837 +78838 +78839 +78840 +78841 +78842 +78843 +78844 +78845 +78846 +78847 +78848 +78849 +78850 +78851 +78852 +78853 +78854 +78855 +78856 +78857 +78858 +78859 +78860 +78861 +78862 +78863 +78864 +78865 +78866 +78867 +78868 +78869 +78870 +78871 +78872 +78873 +78874 +78875 +78876 +78877 +78878 +78879 +78880 +78881 +78882 +78883 +78884 +78885 +78886 +78887 +78888 +78889 +78890 +78891 +78892 +78893 +78894 +78895 +78896 +78897 +78898 +78899 +78900 +78901 +78902 +78903 +78904 +78905 +78906 +78907 +78908 +78909 +78910 +78911 +78912 +78913 +78914 +78915 +78916 +78917 +78918 +78919 +78920 +78921 +78922 +78923 +78924 +78925 +78926 +78927 +78928 +78929 +78930 +78931 +78932 +78933 +78934 +78935 +78936 +78937 +78938 +78939 +78940 +78941 +78942 +78943 +78944 +78945 +78946 +78947 +78948 +78949 +78950 +78951 +78952 +78953 +78954 +78955 +78956 +78957 +78958 +78959 +78960 +78961 +78962 +78963 +78964 +78965 +78966 +78967 +78968 +78969 +78970 +78971 +78972 +78973 +78974 +78975 +78976 +78977 +78978 +78979 +78980 +78981 +78982 +78983 +78984 +78985 +78986 +78987 +78988 +78989 +78990 +78991 +78992 +78993 +78994 +78995 +78996 +78997 +78998 +78999 +79000 +79001 +79002 +79003 +79004 +79005 +79006 +79007 +79008 +79009 +79010 +79011 +79012 +79013 +79014 +79015 +79016 +79017 +79018 +79019 +79020 +79021 +79022 +79023 +79024 +79025 +79026 +79027 +79028 +79029 +79030 +79031 +79032 +79033 +79034 +79035 +79036 +79037 +79038 +79039 +79040 +79041 +79042 +79043 +79044 +79045 +79046 +79047 +79048 +79049 +79050 +79051 +79052 +79053 +79054 +79055 +79056 +79057 +79058 +79059 +79060 +79061 +79062 +79063 +79064 +79065 +79066 +79067 +79068 +79069 +79070 +79071 +79072 +79073 +79074 +79075 +79076 +79077 +79078 +79079 +79080 +79081 +79082 +79083 +79084 +79085 +79086 +79087 +79088 +79089 +79090 +79091 +79092 +79093 +79094 +79095 +79096 +79097 +79098 +79099 +79100 +79101 +79102 +79103 +79104 +79105 +79106 +79107 +79108 +79109 +79110 +79111 +79112 +79113 +79114 +79115 +79116 +79117 +79118 +79119 +79120 +79121 +79122 +79123 +79124 +79125 +79126 +79127 +79128 +79129 +79130 +79131 +79132 +79133 +79134 +79135 +79136 +79137 +79138 +79139 +79140 +79141 +79142 +79143 +79144 +79145 +79146 +79147 +79148 +79149 +79150 +79151 +79152 +79153 +79154 +79155 +79156 +79157 +79158 +79159 +79160 +79161 +79162 +79163 +79164 +79165 +79166 +79167 +79168 +79169 +79170 +79171 +79172 +79173 +79174 +79175 +79176 +79177 +79178 +79179 +79180 +79181 +79182 +79183 +79184 +79185 +79186 +79187 +79188 +79189 +79190 +79191 +79192 +79193 +79194 +79195 +79196 +79197 +79198 +79199 +79200 +79201 +79202 +79203 +79204 +79205 +79206 +79207 +79208 +79209 +79210 +79211 +79212 +79213 +79214 +79215 +79216 +79217 +79218 +79219 +79220 +79221 +79222 +79223 +79224 +79225 +79226 +79227 +79228 +79229 +79230 +79231 +79232 +79233 +79234 +79235 +79236 +79237 +79238 +79239 +79240 +79241 +79242 +79243 +79244 +79245 +79246 +79247 +79248 +79249 +79250 +79251 +79252 +79253 +79254 +79255 +79256 +79257 +79258 +79259 +79260 +79261 +79262 +79263 +79264 +79265 +79266 +79267 +79268 +79269 +79270 +79271 +79272 +79273 +79274 +79275 +79276 +79277 +79278 +79279 +79280 +79281 +79282 +79283 +79284 +79285 +79286 +79287 +79288 +79289 +79290 +79291 +79292 +79293 +79294 +79295 +79296 +79297 +79298 +79299 +79300 +79301 +79302 +79303 +79304 +79305 +79306 +79307 +79308 +79309 +79310 +79311 +79312 +79313 +79314 +79315 +79316 +79317 +79318 +79319 +79320 +79321 +79322 +79323 +79324 +79325 +79326 +79327 +79328 +79329 +79330 +79331 +79332 +79333 +79334 +79335 +79336 +79337 +79338 +79339 +79340 +79341 +79342 +79343 +79344 +79345 +79346 +79347 +79348 +79349 +79350 +79351 +79352 +79353 +79354 +79355 +79356 +79357 +79358 +79359 +79360 +79361 +79362 +79363 +79364 +79365 +79366 +79367 +79368 +79369 +79370 +79371 +79372 +79373 +79374 +79375 +79376 +79377 +79378 +79379 +79380 +79381 +79382 +79383 +79384 +79385 +79386 +79387 +79388 +79389 +79390 +79391 +79392 +79393 +79394 +79395 +79396 +79397 +79398 +79399 +79400 +79401 +79402 +79403 +79404 +79405 +79406 +79407 +79408 +79409 +79410 +79411 +79412 +79413 +79414 +79415 +79416 +79417 +79418 +79419 +79420 +79421 +79422 +79423 +79424 +79425 +79426 +79427 +79428 +79429 +79430 +79431 +79432 +79433 +79434 +79435 +79436 +79437 +79438 +79439 +79440 +79441 +79442 +79443 +79444 +79445 +79446 +79447 +79448 +79449 +79450 +79451 +79452 +79453 +79454 +79455 +79456 +79457 +79458 +79459 +79460 +79461 +79462 +79463 +79464 +79465 +79466 +79467 +79468 +79469 +79470 +79471 +79472 +79473 +79474 +79475 +79476 +79477 +79478 +79479 +79480 +79481 +79482 +79483 +79484 +79485 +79486 +79487 +79488 +79489 +79490 +79491 +79492 +79493 +79494 +79495 +79496 +79497 +79498 +79499 +79500 +79501 +79502 +79503 +79504 +79505 +79506 +79507 +79508 +79509 +79510 +79511 +79512 +79513 +79514 +79515 +79516 +79517 +79518 +79519 +79520 +79521 +79522 +79523 +79524 +79525 +79526 +79527 +79528 +79529 +79530 +79531 +79532 +79533 +79534 +79535 +79536 +79537 +79538 +79539 +79540 +79541 +79542 +79543 +79544 +79545 +79546 +79547 +79548 +79549 +79550 +79551 +79552 +79553 +79554 +79555 +79556 +79557 +79558 +79559 +79560 +79561 +79562 +79563 +79564 +79565 +79566 +79567 +79568 +79569 +79570 +79571 +79572 +79573 +79574 +79575 +79576 +79577 +79578 +79579 +79580 +79581 +79582 +79583 +79584 +79585 +79586 +79587 +79588 +79589 +79590 +79591 +79592 +79593 +79594 +79595 +79596 +79597 +79598 +79599 +79600 +79601 +79602 +79603 +79604 +79605 +79606 +79607 +79608 +79609 +79610 +79611 +79612 +79613 +79614 +79615 +79616 +79617 +79618 +79619 +79620 +79621 +79622 +79623 +79624 +79625 +79626 +79627 +79628 +79629 +79630 +79631 +79632 +79633 +79634 +79635 +79636 +79637 +79638 +79639 +79640 +79641 +79642 +79643 +79644 +79645 +79646 +79647 +79648 +79649 +79650 +79651 +79652 +79653 +79654 +79655 +79656 +79657 +79658 +79659 +79660 +79661 +79662 +79663 +79664 +79665 +79666 +79667 +79668 +79669 +79670 +79671 +79672 +79673 +79674 +79675 +79676 +79677 +79678 +79679 +79680 +79681 +79682 +79683 +79684 +79685 +79686 +79687 +79688 +79689 +79690 +79691 +79692 +79693 +79694 +79695 +79696 +79697 +79698 +79699 +79700 +79701 +79702 +79703 +79704 +79705 +79706 +79707 +79708 +79709 +79710 +79711 +79712 +79713 +79714 +79715 +79716 +79717 +79718 +79719 +79720 +79721 +79722 +79723 +79724 +79725 +79726 +79727 +79728 +79729 +79730 +79731 +79732 +79733 +79734 +79735 +79736 +79737 +79738 +79739 +79740 +79741 +79742 +79743 +79744 +79745 +79746 +79747 +79748 +79749 +79750 +79751 +79752 +79753 +79754 +79755 +79756 +79757 +79758 +79759 +79760 +79761 +79762 +79763 +79764 +79765 +79766 +79767 +79768 +79769 +79770 +79771 +79772 +79773 +79774 +79775 +79776 +79777 +79778 +79779 +79780 +79781 +79782 +79783 +79784 +79785 +79786 +79787 +79788 +79789 +79790 +79791 +79792 +79793 +79794 +79795 +79796 +79797 +79798 +79799 +79800 +79801 +79802 +79803 +79804 +79805 +79806 +79807 +79808 +79809 +79810 +79811 +79812 +79813 +79814 +79815 +79816 +79817 +79818 +79819 +79820 +79821 +79822 +79823 +79824 +79825 +79826 +79827 +79828 +79829 +79830 +79831 +79832 +79833 +79834 +79835 +79836 +79837 +79838 +79839 +79840 +79841 +79842 +79843 +79844 +79845 +79846 +79847 +79848 +79849 +79850 +79851 +79852 +79853 +79854 +79855 +79856 +79857 +79858 +79859 +79860 +79861 +79862 +79863 +79864 +79865 +79866 +79867 +79868 +79869 +79870 +79871 +79872 +79873 +79874 +79875 +79876 +79877 +79878 +79879 +79880 +79881 +79882 +79883 +79884 +79885 +79886 +79887 +79888 +79889 +79890 +79891 +79892 +79893 +79894 +79895 +79896 +79897 +79898 +79899 +79900 +79901 +79902 +79903 +79904 +79905 +79906 +79907 +79908 +79909 +79910 +79911 +79912 +79913 +79914 +79915 +79916 +79917 +79918 +79919 +79920 +79921 +79922 +79923 +79924 +79925 +79926 +79927 +79928 +79929 +79930 +79931 +79932 +79933 +79934 +79935 +79936 +79937 +79938 +79939 +79940 +79941 +79942 +79943 +79944 +79945 +79946 +79947 +79948 +79949 +79950 +79951 +79952 +79953 +79954 +79955 +79956 +79957 +79958 +79959 +79960 +79961 +79962 +79963 +79964 +79965 +79966 +79967 +79968 +79969 +79970 +79971 +79972 +79973 +79974 +79975 +79976 +79977 +79978 +79979 +79980 +79981 +79982 +79983 +79984 +79985 +79986 +79987 +79988 +79989 +79990 +79991 +79992 +79993 +79994 +79995 +79996 +79997 +79998 +79999 +80000 +80001 +80002 +80003 +80004 +80005 +80006 +80007 +80008 +80009 +80010 +80011 +80012 +80013 +80014 +80015 +80016 +80017 +80018 +80019 +80020 +80021 +80022 +80023 +80024 +80025 +80026 +80027 +80028 +80029 +80030 +80031 +80032 +80033 +80034 +80035 +80036 +80037 +80038 +80039 +80040 +80041 +80042 +80043 +80044 +80045 +80046 +80047 +80048 +80049 +80050 +80051 +80052 +80053 +80054 +80055 +80056 +80057 +80058 +80059 +80060 +80061 +80062 +80063 +80064 +80065 +80066 +80067 +80068 +80069 +80070 +80071 +80072 +80073 +80074 +80075 +80076 +80077 +80078 +80079 +80080 +80081 +80082 +80083 +80084 +80085 +80086 +80087 +80088 +80089 +80090 +80091 +80092 +80093 +80094 +80095 +80096 +80097 +80098 +80099 +80100 +80101 +80102 +80103 +80104 +80105 +80106 +80107 +80108 +80109 +80110 +80111 +80112 +80113 +80114 +80115 +80116 +80117 +80118 +80119 +80120 +80121 +80122 +80123 +80124 +80125 +80126 +80127 +80128 +80129 +80130 +80131 +80132 +80133 +80134 +80135 +80136 +80137 +80138 +80139 +80140 +80141 +80142 +80143 +80144 +80145 +80146 +80147 +80148 +80149 +80150 +80151 +80152 +80153 +80154 +80155 +80156 +80157 +80158 +80159 +80160 +80161 +80162 +80163 +80164 +80165 +80166 +80167 +80168 +80169 +80170 +80171 +80172 +80173 +80174 +80175 +80176 +80177 +80178 +80179 +80180 +80181 +80182 +80183 +80184 +80185 +80186 +80187 +80188 +80189 +80190 +80191 +80192 +80193 +80194 +80195 +80196 +80197 +80198 +80199 +80200 +80201 +80202 +80203 +80204 +80205 +80206 +80207 +80208 +80209 +80210 +80211 +80212 +80213 +80214 +80215 +80216 +80217 +80218 +80219 +80220 +80221 +80222 +80223 +80224 +80225 +80226 +80227 +80228 +80229 +80230 +80231 +80232 +80233 +80234 +80235 +80236 +80237 +80238 +80239 +80240 +80241 +80242 +80243 +80244 +80245 +80246 +80247 +80248 +80249 +80250 +80251 +80252 +80253 +80254 +80255 +80256 +80257 +80258 +80259 +80260 +80261 +80262 +80263 +80264 +80265 +80266 +80267 +80268 +80269 +80270 +80271 +80272 +80273 +80274 +80275 +80276 +80277 +80278 +80279 +80280 +80281 +80282 +80283 +80284 +80285 +80286 +80287 +80288 +80289 +80290 +80291 +80292 +80293 +80294 +80295 +80296 +80297 +80298 +80299 +80300 +80301 +80302 +80303 +80304 +80305 +80306 +80307 +80308 +80309 +80310 +80311 +80312 +80313 +80314 +80315 +80316 +80317 +80318 +80319 +80320 +80321 +80322 +80323 +80324 +80325 +80326 +80327 +80328 +80329 +80330 +80331 +80332 +80333 +80334 +80335 +80336 +80337 +80338 +80339 +80340 +80341 +80342 +80343 +80344 +80345 +80346 +80347 +80348 +80349 +80350 +80351 +80352 +80353 +80354 +80355 +80356 +80357 +80358 +80359 +80360 +80361 +80362 +80363 +80364 +80365 +80366 +80367 +80368 +80369 +80370 +80371 +80372 +80373 +80374 +80375 +80376 +80377 +80378 +80379 +80380 +80381 +80382 +80383 +80384 +80385 +80386 +80387 +80388 +80389 +80390 +80391 +80392 +80393 +80394 +80395 +80396 +80397 +80398 +80399 +80400 +80401 +80402 +80403 +80404 +80405 +80406 +80407 +80408 +80409 +80410 +80411 +80412 +80413 +80414 +80415 +80416 +80417 +80418 +80419 +80420 +80421 +80422 +80423 +80424 +80425 +80426 +80427 +80428 +80429 +80430 +80431 +80432 +80433 +80434 +80435 +80436 +80437 +80438 +80439 +80440 +80441 +80442 +80443 +80444 +80445 +80446 +80447 +80448 +80449 +80450 +80451 +80452 +80453 +80454 +80455 +80456 +80457 +80458 +80459 +80460 +80461 +80462 +80463 +80464 +80465 +80466 +80467 +80468 +80469 +80470 +80471 +80472 +80473 +80474 +80475 +80476 +80477 +80478 +80479 +80480 +80481 +80482 +80483 +80484 +80485 +80486 +80487 +80488 +80489 +80490 +80491 +80492 +80493 +80494 +80495 +80496 +80497 +80498 +80499 +80500 +80501 +80502 +80503 +80504 +80505 +80506 +80507 +80508 +80509 +80510 +80511 +80512 +80513 +80514 +80515 +80516 +80517 +80518 +80519 +80520 +80521 +80522 +80523 +80524 +80525 +80526 +80527 +80528 +80529 +80530 +80531 +80532 +80533 +80534 +80535 +80536 +80537 +80538 +80539 +80540 +80541 +80542 +80543 +80544 +80545 +80546 +80547 +80548 +80549 +80550 +80551 +80552 +80553 +80554 +80555 +80556 +80557 +80558 +80559 +80560 +80561 +80562 +80563 +80564 +80565 +80566 +80567 +80568 +80569 +80570 +80571 +80572 +80573 +80574 +80575 +80576 +80577 +80578 +80579 +80580 +80581 +80582 +80583 +80584 +80585 +80586 +80587 +80588 +80589 +80590 +80591 +80592 +80593 +80594 +80595 +80596 +80597 +80598 +80599 +80600 +80601 +80602 +80603 +80604 +80605 +80606 +80607 +80608 +80609 +80610 +80611 +80612 +80613 +80614 +80615 +80616 +80617 +80618 +80619 +80620 +80621 +80622 +80623 +80624 +80625 +80626 +80627 +80628 +80629 +80630 +80631 +80632 +80633 +80634 +80635 +80636 +80637 +80638 +80639 +80640 +80641 +80642 +80643 +80644 +80645 +80646 +80647 +80648 +80649 +80650 +80651 +80652 +80653 +80654 +80655 +80656 +80657 +80658 +80659 +80660 +80661 +80662 +80663 +80664 +80665 +80666 +80667 +80668 +80669 +80670 +80671 +80672 +80673 +80674 +80675 +80676 +80677 +80678 +80679 +80680 +80681 +80682 +80683 +80684 +80685 +80686 +80687 +80688 +80689 +80690 +80691 +80692 +80693 +80694 +80695 +80696 +80697 +80698 +80699 +80700 +80701 +80702 +80703 +80704 +80705 +80706 +80707 +80708 +80709 +80710 +80711 +80712 +80713 +80714 +80715 +80716 +80717 +80718 +80719 +80720 +80721 +80722 +80723 +80724 +80725 +80726 +80727 +80728 +80729 +80730 +80731 +80732 +80733 +80734 +80735 +80736 +80737 +80738 +80739 +80740 +80741 +80742 +80743 +80744 +80745 +80746 +80747 +80748 +80749 +80750 +80751 +80752 +80753 +80754 +80755 +80756 +80757 +80758 +80759 +80760 +80761 +80762 +80763 +80764 +80765 +80766 +80767 +80768 +80769 +80770 +80771 +80772 +80773 +80774 +80775 +80776 +80777 +80778 +80779 +80780 +80781 +80782 +80783 +80784 +80785 +80786 +80787 +80788 +80789 +80790 +80791 +80792 +80793 +80794 +80795 +80796 +80797 +80798 +80799 +80800 +80801 +80802 +80803 +80804 +80805 +80806 +80807 +80808 +80809 +80810 +80811 +80812 +80813 +80814 +80815 +80816 +80817 +80818 +80819 +80820 +80821 +80822 +80823 +80824 +80825 +80826 +80827 +80828 +80829 +80830 +80831 +80832 +80833 +80834 +80835 +80836 +80837 +80838 +80839 +80840 +80841 +80842 +80843 +80844 +80845 +80846 +80847 +80848 +80849 +80850 +80851 +80852 +80853 +80854 +80855 +80856 +80857 +80858 +80859 +80860 +80861 +80862 +80863 +80864 +80865 +80866 +80867 +80868 +80869 +80870 +80871 +80872 +80873 +80874 +80875 +80876 +80877 +80878 +80879 +80880 +80881 +80882 +80883 +80884 +80885 +80886 +80887 +80888 +80889 +80890 +80891 +80892 +80893 +80894 +80895 +80896 +80897 +80898 +80899 +80900 +80901 +80902 +80903 +80904 +80905 +80906 +80907 +80908 +80909 +80910 +80911 +80912 +80913 +80914 +80915 +80916 +80917 +80918 +80919 +80920 +80921 +80922 +80923 +80924 +80925 +80926 +80927 +80928 +80929 +80930 +80931 +80932 +80933 +80934 +80935 +80936 +80937 +80938 +80939 +80940 +80941 +80942 +80943 +80944 +80945 +80946 +80947 +80948 +80949 +80950 +80951 +80952 +80953 +80954 +80955 +80956 +80957 +80958 +80959 +80960 +80961 +80962 +80963 +80964 +80965 +80966 +80967 +80968 +80969 +80970 +80971 +80972 +80973 +80974 +80975 +80976 +80977 +80978 +80979 +80980 +80981 +80982 +80983 +80984 +80985 +80986 +80987 +80988 +80989 +80990 +80991 +80992 +80993 +80994 +80995 +80996 +80997 +80998 +80999 +81000 +81001 +81002 +81003 +81004 +81005 +81006 +81007 +81008 +81009 +81010 +81011 +81012 +81013 +81014 +81015 +81016 +81017 +81018 +81019 +81020 +81021 +81022 +81023 +81024 +81025 +81026 +81027 +81028 +81029 +81030 +81031 +81032 +81033 +81034 +81035 +81036 +81037 +81038 +81039 +81040 +81041 +81042 +81043 +81044 +81045 +81046 +81047 +81048 +81049 +81050 +81051 +81052 +81053 +81054 +81055 +81056 +81057 +81058 +81059 +81060 +81061 +81062 +81063 +81064 +81065 +81066 +81067 +81068 +81069 +81070 +81071 +81072 +81073 +81074 +81075 +81076 +81077 +81078 +81079 +81080 +81081 +81082 +81083 +81084 +81085 +81086 +81087 +81088 +81089 +81090 +81091 +81092 +81093 +81094 +81095 +81096 +81097 +81098 +81099 +81100 +81101 +81102 +81103 +81104 +81105 +81106 +81107 +81108 +81109 +81110 +81111 +81112 +81113 +81114 +81115 +81116 +81117 +81118 +81119 +81120 +81121 +81122 +81123 +81124 +81125 +81126 +81127 +81128 +81129 +81130 +81131 +81132 +81133 +81134 +81135 +81136 +81137 +81138 +81139 +81140 +81141 +81142 +81143 +81144 +81145 +81146 +81147 +81148 +81149 +81150 +81151 +81152 +81153 +81154 +81155 +81156 +81157 +81158 +81159 +81160 +81161 +81162 +81163 +81164 +81165 +81166 +81167 +81168 +81169 +81170 +81171 +81172 +81173 +81174 +81175 +81176 +81177 +81178 +81179 +81180 +81181 +81182 +81183 +81184 +81185 +81186 +81187 +81188 +81189 +81190 +81191 +81192 +81193 +81194 +81195 +81196 +81197 +81198 +81199 +81200 +81201 +81202 +81203 +81204 +81205 +81206 +81207 +81208 +81209 +81210 +81211 +81212 +81213 +81214 +81215 +81216 +81217 +81218 +81219 +81220 +81221 +81222 +81223 +81224 +81225 +81226 +81227 +81228 +81229 +81230 +81231 +81232 +81233 +81234 +81235 +81236 +81237 +812381x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
/* eslint-disable import/newline-after-import */
+import runtime from "@abaplint/runtime";
+globalThis.abap = new runtime.ABAP();
+await import("./%23ui2%23cl_json.clas.mjs");
+await import("./00.msag.mjs");
+await import("./abap.type.mjs");
+await import("./abap_boolean.dtel.mjs");
+await import("./abap_callstack.ttyp.mjs");
+await import("./abap_callstack_line.tabl.mjs");
+await import("./abap_encod.dtel.mjs");
+await import("./abap_sortorder.tabl.mjs");
+await import("./abap_sortorder_tab.ttyp.mjs");
+await import("./abaptxt255.tabl.mjs");
+await import("./abaptxt255_tab.ttyp.mjs");
+await import("./balmnr.dtel.mjs");
+await import("./balognr.dtel.mjs");
+await import("./bapi_fld.dtel.mjs");
+await import("./bapi_line.dtel.mjs");
+await import("./bapi_msg.dtel.mjs");
+await import("./bapi_mtype.dtel.mjs");
+await import("./bapi_param.dtel.mjs");
+await import("./bapi_rcode.dtel.mjs");
+await import("./bapilogsys.dtel.mjs");
+await import("./bapioption.dtel.mjs");
+await import("./bapiret2.tabl.mjs");
+await import("./bapirettab.ttyp.mjs");
+await import("./bapireturn.tabl.mjs");
+await import("./bapisign.dtel.mjs");
+await import("./boolean.dtel.mjs");
+await import("./char1.dtel.mjs");
+await import("./char10.dtel.mjs");
+await import("./char120.dtel.mjs");
+await import("./char15.dtel.mjs");
+await import("./char20.dtel.mjs");
+await import("./char25.dtel.mjs");
+await import("./char3.dtel.mjs");
+await import("./char30.dtel.mjs");
+await import("./char32.dtel.mjs");
+await import("./char4.dtel.mjs");
+await import("./char6.dtel.mjs");
+await import("./char80.dtel.mjs");
+await import("./cl_abap_char_utilities.clas.mjs");
+await import("./cl_abap_classdescr.clas.mjs");
+await import("./cl_abap_codepage.clas.mjs");
+await import("./cl_abap_complexdescr.clas.mjs");
+await import("./cl_abap_conv_codepage.clas.mjs");
+await import("./cl_abap_conv_in_ce.clas.mjs");
+await import("./cl_abap_conv_out_ce.clas.mjs");
+await import("./cl_abap_datadescr.clas.mjs");
+await import("./cl_abap_datfm.clas.mjs");
+await import("./cl_abap_dyn_prg.clas.mjs");
+await import("./cl_abap_elemdescr.clas.mjs");
+await import("./cl_abap_enumdescr.clas.mjs");
+await import("./cl_abap_exceptional_values.clas.mjs");
+await import("./cl_abap_format.clas.mjs");
+await import("./cl_abap_gzip.clas.mjs");
+await import("./cl_abap_hmac.clas.mjs");
+await import("./cl_abap_intfdescr.clas.mjs");
+await import("./cl_abap_matcher.clas.mjs");
+await import("./cl_abap_math.clas.mjs");
+await import("./cl_abap_message_digest.clas.mjs");
+await import("./cl_abap_objectdescr.clas.mjs");
+await import("./cl_abap_random.clas.mjs");
+await import("./cl_abap_random_int.clas.mjs");
+await import("./cl_abap_refdescr.clas.mjs");
+await import("./cl_abap_regex.clas.mjs");
+await import("./cl_abap_structdescr.clas.mjs");
+await import("./cl_abap_tabledescr.clas.mjs");
+await import("./cl_abap_timefm.clas.mjs");
+await import("./cl_abap_tstmp.clas.mjs");
+await import("./cl_abap_typedescr.clas.mjs");
+await import("./cl_abap_unit_assert.clas.mjs");
+await import("./cl_abap_zip.clas.mjs");
+await import("./cl_apc_tcp_client_manager.clas.mjs");
+await import("./cl_apc_wsp_ext_stateless_base.clas.mjs");
+await import("./cl_bcs.clas.mjs");
+await import("./cl_bcs_convert.clas.mjs");
+await import("./cl_cam_address_bcs.clas.mjs");
+await import("./cl_demo_output.clas.mjs");
+await import("./cl_document_bcs.clas.mjs");
+await import("./cl_function_test_environment.clas.mjs");
+await import("./cl_gdt_conversion.clas.mjs");
+await import("./cl_gui_cfw.clas.mjs");
+await import("./cl_gui_container.clas.mjs");
+await import("./cl_gui_frontend_services.clas.mjs");
+await import("./cl_http_client.clas.mjs");
+await import("./cl_http_entity.clas.mjs");
+await import("./cl_http_server.clas.mjs");
+await import("./cl_http_utility.clas.mjs");
+await import("./cl_i18n_languages.clas.mjs");
+await import("./cl_ixml.clas.mjs");
+await import("./cl_message_helper.clas.mjs");
+await import("./cl_mime_repository_api.clas.mjs");
+await import("./cl_numberrange_runtime.clas.mjs");
+await import("./cl_oo_factory.clas.mjs");
+await import("./cl_osql_test_environment.clas.mjs");
+await import("./cl_package_factory.clas.mjs");
+await import("./cl_progress_indicator.clas.mjs");
+await import("./cl_salv_aggregations.clas.mjs");
+await import("./cl_salv_column.clas.mjs");
+await import("./cl_salv_columns_table.clas.mjs");
+await import("./cl_salv_events_table.clas.mjs");
+await import("./cl_salv_filters.clas.mjs");
+await import("./cl_salv_functions_list.clas.mjs");
+await import("./cl_salv_table.clas.mjs");
+await import("./cl_shm_area.clas.mjs");
+await import("./cl_shm_service.clas.mjs");
+await import("./cl_sql_result_set.clas.mjs");
+await import("./cl_sql_statement.clas.mjs");
+await import("./cl_sxml_string_reader.clas.mjs");
+await import("./cl_sxml_string_writer.clas.mjs");
+await import("./cl_system_uuid.clas.mjs");
+await import("./cl_web_http_utility.clas.mjs");
+await import("./cx_abap_datfm.clas.mjs");
+await import("./cx_abap_message_digest.clas.mjs");
+await import("./cx_abap_not_a_table.clas.mjs");
+await import("./cx_abap_not_in_package.clas.mjs");
+await import("./cx_abap_not_in_whitelist.clas.mjs");
+await import("./cx_abap_random.clas.mjs");
+await import("./cx_abap_timefm_invalid.clas.mjs");
+await import("./cx_apc_error.clas.mjs");
+await import("./cx_bcs.clas.mjs");
+await import("./cx_dynamic_check.clas.mjs");
+await import("./cx_ftd_parameter_not_found.clas.mjs");
+await import("./cx_gdt_conversion.clas.mjs");
+await import("./cx_no_check.clas.mjs");
+await import("./cx_oo_clif_not_exists.clas.mjs");
+await import("./cx_parameter_invalid.clas.mjs");
+await import("./cx_parameter_invalid_range.clas.mjs");
+await import("./cx_parameter_invalid_type.clas.mjs");
+await import("./cx_root.clas.mjs");
+await import("./cx_salv_access_error.clas.mjs");
+await import("./cx_salv_data_error.clas.mjs");
+await import("./cx_salv_error.clas.mjs");
+await import("./cx_salv_msg.clas.mjs");
+await import("./cx_salv_not_found.clas.mjs");
+await import("./cx_salv_static_check.clas.mjs");
+await import("./cx_shm_already_detached.clas.mjs");
+await import("./cx_shm_attach_error.clas.mjs");
+await import("./cx_shm_build_failed.clas.mjs");
+await import("./cx_shm_change_lock_active.clas.mjs");
+await import("./cx_shm_completion_error.clas.mjs");
+await import("./cx_shm_detach_error.clas.mjs");
+await import("./cx_shm_error.clas.mjs");
+await import("./cx_shm_event_execution_failed.clas.mjs");
+await import("./cx_shm_exclusive_lock_active.clas.mjs");
+await import("./cx_shm_general_error.clas.mjs");
+await import("./cx_shm_inconsistent.clas.mjs");
+await import("./cx_shm_initial_reference.clas.mjs");
+await import("./cx_shm_no_active_version.clas.mjs");
+await import("./cx_shm_parameter_error.clas.mjs");
+await import("./cx_shm_pending_lock_removed.clas.mjs");
+await import("./cx_shm_read_lock_active.clas.mjs");
+await import("./cx_shm_secondary_commit.clas.mjs");
+await import("./cx_shm_version_limit_exceeded.clas.mjs");
+await import("./cx_shm_wrong_handle.clas.mjs");
+await import("./cx_shma_dynamic.clas.mjs");
+await import("./cx_shma_inconsistent.clas.mjs");
+await import("./cx_shma_not_configured.clas.mjs");
+await import("./cx_sql_exception.clas.mjs");
+await import("./cx_static_check.clas.mjs");
+await import("./cx_sxml_error.clas.mjs");
+await import("./cx_sxml_illegal_argument_error.clas.mjs");
+await import("./cx_sxml_name_error.clas.mjs");
+await import("./cx_sxml_parse_error.clas.mjs");
+await import("./cx_sxml_state_error.clas.mjs");
+await import("./cx_sy_arithmetic_error.clas.mjs");
+await import("./cx_sy_buffer_overflow.clas.mjs");
+await import("./cx_sy_codepage_converter_init.clas.mjs");
+await import("./cx_sy_compression_error.clas.mjs");
+await import("./cx_sy_conversion_codepage.clas.mjs");
+await import("./cx_sy_conversion_data_loss.clas.mjs");
+await import("./cx_sy_conversion_error.clas.mjs");
+await import("./cx_sy_conversion_no_number.clas.mjs");
+await import("./cx_sy_conversion_overflow.clas.mjs");
+await import("./cx_sy_create_data_error.clas.mjs");
+await import("./cx_sy_create_object_error.clas.mjs");
+await import("./cx_sy_data_access_error.clas.mjs");
+await import("./cx_sy_duplicate_key.clas.mjs");
+await import("./cx_sy_dyn_call_error.clas.mjs");
+await import("./cx_sy_dyn_call_illegal_class.clas.mjs");
+await import("./cx_sy_dyn_call_illegal_form.clas.mjs");
+await import("./cx_sy_dyn_call_illegal_func.clas.mjs");
+await import("./cx_sy_dyn_call_illegal_method.clas.mjs");
+await import("./cx_sy_dyn_call_param_not_found.clas.mjs");
+await import("./cx_sy_dyn_call_parameter_error.clas.mjs");
+await import("./cx_sy_dynamic_osql_error.clas.mjs");
+await import("./cx_sy_dynamic_osql_semantics.clas.mjs");
+await import("./cx_sy_itab_duplicate_key.clas.mjs");
+await import("./cx_sy_itab_error.clas.mjs");
+await import("./cx_sy_itab_line_not_found.clas.mjs");
+await import("./cx_sy_message_illegal_text.clas.mjs");
+await import("./cx_sy_move_cast_error.clas.mjs");
+await import("./cx_sy_open_sql_error.clas.mjs");
+await import("./cx_sy_range_out_of_bounds.clas.mjs");
+await import("./cx_sy_ref_is_initial.clas.mjs");
+await import("./cx_sy_sql_error.clas.mjs");
+await import("./cx_sy_strg_par_val.clas.mjs");
+await import("./cx_sy_struct_attributes.clas.mjs");
+await import("./cx_sy_struct_comp_name.clas.mjs");
+await import("./cx_sy_struct_comp_type.clas.mjs");
+await import("./cx_sy_struct_creation.clas.mjs");
+await import("./cx_sy_type_creation.clas.mjs");
+await import("./cx_sy_zerodivide.clas.mjs");
+await import("./cx_transformation_error.clas.mjs");
+await import("./cx_uuid_error.clas.mjs");
+await import("./cx_xslt_exception.clas.mjs");
+await import("./cx_xslt_format_error.clas.mjs");
+await import("./cx_xslt_runtime_error.clas.mjs");
+await import("./cx_xslt_serialization_error.clas.mjs");
+await import("./cx_xslt_system_error.clas.mjs");
+await import("./dats.dtel.mjs");
+await import("./dd02l.tabl.mjs");
+await import("./dd09l.tabl.mjs");
+await import("./ddfields.ttyp.mjs");
+await import("./ddoption.dtel.mjs");
+await import("./ddsign.dtel.mjs");
+await import("./devclass.dtel.mjs");
+await import("./dfies.tabl.mjs");
+await import("./dokhl.tabl.mjs");
+await import("./dokil.tabl.mjs");
+await import("./dokstate.dtel.mjs");
+await import("./doku_obj.dtel.mjs");
+await import("./dynprofld.dtel.mjs");
+await import("./fieldname.dtel.mjs");
+await import("./file_table.tabl.mjs");
+await import("./filetable.ttyp.mjs");
+await import("./flag.dtel.mjs");
+await import("./funcname.dtel.mjs");
+await import("./guid.dtel.mjs");
+await import("./icon.type.mjs");
+await import("./icon_d.dtel.mjs");
+await import("./if_abap_channel_types.intf.mjs");
+await import("./if_abap_conv_in.intf.mjs");
+await import("./if_abap_conv_out.intf.mjs");
+await import("./if_abap_unit_constant.intf.mjs");
+await import("./if_apc_tcp_frame_types.intf.mjs");
+await import("./if_apc_wsp_binding_manager.intf.mjs");
+await import("./if_apc_wsp_client.intf.mjs");
+await import("./if_apc_wsp_event_handler.intf.mjs");
+await import("./if_apc_wsp_extension.intf.mjs");
+await import("./if_apc_wsp_initial_request.intf.mjs");
+await import("./if_apc_wsp_message.intf.mjs");
+await import("./if_apc_wsp_message_manager.intf.mjs");
+await import("./if_apc_wsp_server_context.intf.mjs");
+await import("./if_aunit_constants.intf.mjs");
+await import("./if_document_bcs.intf.mjs");
+await import("./if_ftd_input_arguments.intf.mjs");
+await import("./if_ftd_input_config_setter.intf.mjs");
+await import("./if_ftd_invocation_answer.intf.mjs");
+await import("./if_ftd_invocation_result.intf.mjs");
+await import("./if_ftd_output_config_setter.intf.mjs");
+await import("./if_ftd_output_configuration.intf.mjs");
+await import("./if_function_test_environment.intf.mjs");
+await import("./if_function_testdouble.intf.mjs");
+await import("./if_http_client.intf.mjs");
+await import("./if_http_entity.intf.mjs");
+await import("./if_http_extension.intf.mjs");
+await import("./if_http_request.intf.mjs");
+await import("./if_http_response.intf.mjs");
+await import("./if_http_server.intf.mjs");
+await import("./if_http_utility.intf.mjs");
+await import("./if_ixml.intf.mjs");
+await import("./if_ixml_attribute.intf.mjs");
+await import("./if_ixml_document.intf.mjs");
+await import("./if_ixml_element.intf.mjs");
+await import("./if_ixml_encoding.intf.mjs");
+await import("./if_ixml_istream.intf.mjs");
+await import("./if_ixml_named_node_map.intf.mjs");
+await import("./if_ixml_node.intf.mjs");
+await import("./if_ixml_node_collection.intf.mjs");
+await import("./if_ixml_node_filter.intf.mjs");
+await import("./if_ixml_node_iterator.intf.mjs");
+await import("./if_ixml_node_list.intf.mjs");
+await import("./if_ixml_ostream.intf.mjs");
+await import("./if_ixml_parse_error.intf.mjs");
+await import("./if_ixml_parser.intf.mjs");
+await import("./if_ixml_renderer.intf.mjs");
+await import("./if_ixml_stream_factory.intf.mjs");
+await import("./if_ixml_unknown.intf.mjs");
+await import("./if_message.intf.mjs");
+await import("./if_mr_api.intf.mjs");
+await import("./if_oo_adt_classrun.intf.mjs");
+await import("./if_oo_adt_classrun_out.intf.mjs");
+await import("./if_oo_clif_source.intf.mjs");
+await import("./if_osql_test_environment.intf.mjs");
+await import("./if_package.intf.mjs");
+await import("./if_recipient_bcs.intf.mjs");
+await import("./if_salv_c_bool_sap.intf.mjs");
+await import("./if_salv_c_selection_mode.intf.mjs");
+await import("./if_sender_bcs.intf.mjs");
+await import("./if_serializable_object.intf.mjs");
+await import("./if_shm_build_instance.intf.mjs");
+await import("./if_shm_trace.intf.mjs");
+await import("./if_sxml.intf.mjs");
+await import("./if_sxml_attribute.intf.mjs");
+await import("./if_sxml_close_element.intf.mjs");
+await import("./if_sxml_node.intf.mjs");
+await import("./if_sxml_open_element.intf.mjs");
+await import("./if_sxml_reader.intf.mjs");
+await import("./if_sxml_value.intf.mjs");
+await import("./if_sxml_value_node.intf.mjs");
+await import("./if_sxml_writer.intf.mjs");
+await import("./if_sxmlp_factory.intf.mjs");
+await import("./if_sxmlp_list.intf.mjs");
+await import("./if_sxmlp_part.intf.mjs");
+await import("./if_sxmlp_simple.intf.mjs");
+await import("./if_system_uuid_rfc4122_static.intf.mjs");
+await import("./if_system_uuid_static.intf.mjs");
+await import("./if_t100_dyn_msg.intf.mjs");
+await import("./if_t100_message.intf.mjs");
+await import("./ihttpnvp.tabl.mjs");
+await import("./int1.dtel.mjs");
+await import("./int2.dtel.mjs");
+await import("./int4.dtel.mjs");
+await import("./kernel_authority_check.clas.mjs");
+await import("./kernel_call.clas.mjs");
+await import("./kernel_call_transformation.clas.mjs");
+await import("./kernel_create_data_handle.clas.mjs");
+await import("./kernel_cx_assert.clas.mjs");
+await import("./kernel_fugr_test.clas.mjs");
+await import("./kernel_internal_name.clas.mjs");
+await import("./kernel_ixml_json_to_data.clas.mjs");
+await import("./kernel_ixml_xml_to_data.clas.mjs");
+await import("./kernel_json_to_ixml.clas.mjs");
+await import("./kernel_lock.clas.mjs");
+await import("./kernel_numberrange.clas.mjs");
+await import("./kernel_push_channels.clas.mjs");
+await import("./kernel_scan_abap_source.clas.mjs");
+await import("./kernel_unit_runner.clas.mjs");
+await import("./laiso.dtel.mjs");
+await import("./land1.dtel.mjs");
+await import("./langu.dtel.mjs");
+await import("./lvc_nokeyc.dtel.mjs");
+await import("./lxe_pcx_s1.tabl.mjs");
+await import("./lxecustmnr.dtel.mjs");
+await import("./lxeisolang.dtel.mjs");
+await import("./lxeobjname.dtel.mjs");
+await import("./lxetextkey.dtel.mjs");
+await import("./lxetexttype.dtel.mjs");
+await import("./lxeunitlin.dtel.mjs");
+await import("./lxeunitmlt.dtel.mjs");
+await import("./lxeuppcase.dtel.mjs");
+await import("./mandt.dtel.mjs");
+await import("./match_result.tabl.mjs");
+await import("./match_result_tab.ttyp.mjs");
+await import("./menge_d.dtel.mjs");
+await import("./msehi.dtel.mjs");
+await import("./namespace.dtel.mjs");
+await import("./number_get_next.fugr.number_get_next.mjs");
+await import("./numc4.dtel.mjs");
+await import("./openabap.fugr.call_v1_ping.mjs");
+await import("./openabap.fugr.conversion_exit_alpha_input.mjs");
+await import("./openabap.fugr.conversion_exit_alpha_output.mjs");
+await import("./openabap.fugr.conversion_exit_isola_input.mjs");
+await import("./openabap.fugr.conversion_exit_isola_output.mjs");
+await import("./openabap.fugr.convert_itf_to_stream_text.mjs");
+await import("./openabap.fugr.docu_get.mjs");
+await import("./openabap.fugr.function_exists.mjs");
+await import("./openabap.fugr.generate_sec_random.mjs");
+await import("./openabap.fugr.get_system_timezone.mjs");
+await import("./openabap.fugr.system_callstack.mjs");
+await import("./openabap.fugr.system_installed_languages.mjs");
+await import("./openabap.fugr.text_split.mjs");
+await import("./openabap.fugr.unit_conversion_simple.mjs");
+await import("./parentcl.dtel.mjs");
+await import("./progdir.tabl.mjs");
+await import("./progname.dtel.mjs");
+await import("./reposrc.tabl.mjs");
+await import("./rfcdest.dtel.mjs");
+await import("./rswsourcet.ttyp.mjs");
+await import("./rzlli_apcl.dtel.mjs");
+await import("./salv_s_int4_column.tabl.mjs");
+await import("./salv_t_int4_column.ttyp.mjs");
+await import("./sappatchlv.dtel.mjs");
+await import("./saprelease.dtel.mjs");
+await import("./sci_chkv.dtel.mjs");
+await import("./scompkdtln.tabl.mjs");
+await import("./scrtext_l.dtel.mjs");
+await import("./scrtext_m.dtel.mjs");
+await import("./scrtext_s.dtel.mjs");
+await import("./scx_attrname.dtel.mjs");
+await import("./scx_t100key.tabl.mjs");
+await import("./sdok_class.dtel.mjs");
+await import("./sdok_docid.dtel.mjs");
+await import("./sdokobject.tabl.mjs");
+await import("./seobusobj.dtel.mjs");
+await import("./seoc.type.mjs");
+await import("./seoclskey.tabl.mjs");
+await import("./seoclsname.dtel.mjs");
+await import("./seocmpname.dtel.mjs");
+await import("./seocmptype.dtel.mjs");
+await import("./seocompo.tabl.mjs");
+await import("./seocompotx.tabl.mjs");
+await import("./seodescr.dtel.mjs");
+await import("./seoexpose.dtel.mjs");
+await import("./seokeyfld.dtel.mjs");
+await import("./seoo.type.mjs");
+await import("./seop.type.mjs");
+await import("./seos.type.mjs");
+await import("./seosconame.dtel.mjs");
+await import("./seoscotype.dtel.mjs");
+await import("./seosubco.tabl.mjs");
+await import("./seosubcotx.tabl.mjs");
+await import("./seox.type.mjs");
+await import("./shm_affect_server.dtel.mjs");
+await import("./shm_area_name.dtel.mjs");
+await import("./shm_attach_mode.dtel.mjs");
+await import("./shm_auto_build_class_name.dtel.mjs");
+await import("./shm_client.dtel.mjs");
+await import("./shm_constr_invocation_mode.dtel.mjs");
+await import("./shm_inst_info.tabl.mjs");
+await import("./shm_inst_infos.ttyp.mjs");
+await import("./shm_inst_name.dtel.mjs");
+await import("./shm_life_context.dtel.mjs");
+await import("./shm_properties.tabl.mjs");
+await import("./shm_rc.dtel.mjs");
+await import("./shma_attributes.tabl.mjs");
+await import("./shma_client.dtel.mjs");
+await import("./shmm_trc_variant_name.dtel.mjs");
+await import("./skwf_io.tabl.mjs");
+await import("./skwf_ioty.dtel.mjs");
+await import("./so_raw255.dtel.mjs");
+await import("./so_text255.dtel.mjs");
+await import("./sobj_name.dtel.mjs");
+await import("./soli.tabl.mjs");
+await import("./soli_tab.ttyp.mjs");
+await import("./solix.tabl.mjs");
+await import("./solix_tab.ttyp.mjs");
+await import("./sotr_conc.dtel.mjs");
+await import("./spras.dtel.mjs");
+await import("./ssfapplssl.dtel.mjs");
+await import("./sstmnt.tabl.mjs");
+await import("./sstmnt_tab.ttyp.mjs");
+await import("./sstruc.tabl.mjs");
+await import("./sstruc_tab.ttyp.mjs");
+await import("./stokes.tabl.mjs");
+await import("./stokes_tab.ttyp.mjs");
+await import("./stokesx.tabl.mjs");
+await import("./string_table.ttyp.mjs");
+await import("./stringtab.ttyp.mjs");
+await import("./submatch_result.tabl.mjs");
+await import("./submatch_result_tab.ttyp.mjs");
+await import("./sxco_fm_name.dtel.mjs");
+await import("./sxco_transport.dtel.mjs");
+await import("./sydate.dtel.mjs");
+await import("./symsg.tabl.mjs");
+await import("./symsgid.dtel.mjs");
+await import("./symsgno.dtel.mjs");
+await import("./symsgty.dtel.mjs");
+await import("./symsgv.dtel.mjs");
+await import("./syrepid.dtel.mjs");
+await import("./syst_host.dtel.mjs");
+await import("./sysubrc.dtel.mjs");
+await import("./sysuuid_c32.dtel.mjs");
+await import("./sysuuid_c36.dtel.mjs");
+await import("./sysuuid_x16.dtel.mjs");
+await import("./syuname.dtel.mjs");
+await import("./t000.tabl.mjs");
+await import("./t100.tabl.mjs");
+await import("./tabfdpos.dtel.mjs");
+await import("./tabname.dtel.mjs");
+await import("./tadir.tabl.mjs");
+await import("./tdevc.tabl.mjs");
+await import("./tdline.dtel.mjs");
+await import("./text20.dtel.mjs");
+await import("./text200.dtel.mjs");
+await import("./text255.dtel.mjs");
+await import("./text30.dtel.mjs");
+await import("./text80.dtel.mjs");
+await import("./textpool.tabl.mjs");
+await import("./tfdir.tabl.mjs");
+await import("./thead.tabl.mjs");
+await import("./tihttpnvp.ttyp.mjs");
+await import("./timestamp.dtel.mjs");
+await import("./timestampl.dtel.mjs");
+await import("./timezone.dtel.mjs");
+await import("./timn.dtel.mjs");
+await import("./tline.tabl.mjs");
+await import("./tline_tab.ttyp.mjs");
+await import("./tlinetab.ttyp.mjs");
+await import("./trfunction.dtel.mjs");
+await import("./trkorr.dtel.mjs");
+await import("./trnspace.tabl.mjs");
+await import("./trobjtype.dtel.mjs");
+await import("./tzntstmpl.dtel.mjs");
+await import("./tzntstmps.dtel.mjs");
+await import("./uname.dtel.mjs");
+await import("./usnam.dtel.mjs");
+await import("./vseointerf.tabl.mjs");
+await import("./w3mime.tabl.mjs");
+await import("./wwwdatatab.tabl.mjs");
+await import("./wwwparams.tabl.mjs");
+await import("./xfeld.dtel.mjs");
+await import("./xsdboolean.dtel.mjs");
+await import("./xsdtime_t.dtel.mjs");
+await import("./zabapgit_css_common.w3mi.mjs");
+await import("./zabapgit_css_page_db.w3mi.mjs");
+await import("./zabapgit_css_page_db_entry.w3mi.mjs");
+await import("./zabapgit_css_theme_belize_blue.w3mi.mjs");
+await import("./zabapgit_css_theme_dark.w3mi.mjs");
+await import("./zabapgit_css_theme_default.w3mi.mjs");
+await import("./zabapgit_icon_font.w3mi.mjs");
+await import("./zabapgit_icon_font_css.w3mi.mjs");
+await import("./zabapgit_js_common.w3mi.mjs");
+await import("./zcl_abapgit_abap_language_vers.clas.mjs");
+await import("./zcl_abapgit_adt_link.clas.mjs");
+await import("./zcl_abapgit_aff_registry.clas.mjs");
+await import("./zcl_abapgit_ajson.clas.mjs");
+await import("./zcl_abapgit_ajson_filter_lib.clas.mjs");
+await import("./zcl_abapgit_ajson_mapping.clas.mjs");
+await import("./zcl_abapgit_ajson_utilities.clas.mjs");
+await import("./zcl_abapgit_apack_reader.clas.mjs");
+await import("./zcl_abapgit_auth.clas.mjs");
+await import("./zcl_abapgit_background.clas.mjs");
+await import("./zcl_abapgit_background_pull.clas.mjs");
+await import("./zcl_abapgit_background_push_au.clas.mjs");
+await import("./zcl_abapgit_background_push_fi.clas.mjs");
+await import("./zcl_abapgit_code_inspector.clas.mjs");
+await import("./zcl_abapgit_convert.clas.mjs");
+await import("./zcl_abapgit_cts_api.clas.mjs");
+await import("./zcl_abapgit_data_config.clas.mjs");
+await import("./zcl_abapgit_data_deserializer.clas.mjs");
+await import("./zcl_abapgit_data_factory.clas.mjs");
+await import("./zcl_abapgit_data_injector.clas.mjs");
+await import("./zcl_abapgit_data_serializer.clas.mjs");
+await import("./zcl_abapgit_data_supporter.clas.mjs");
+await import("./zcl_abapgit_data_utils.clas.mjs");
+await import("./zcl_abapgit_default_transport.clas.mjs");
+await import("./zcl_abapgit_dependencies.clas.mjs");
+await import("./zcl_abapgit_diff.clas.mjs");
+await import("./zcl_abapgit_dot_abapgit.clas.mjs");
+await import("./zcl_abapgit_environment.clas.mjs");
+await import("./zcl_abapgit_exit.clas.mjs");
+await import("./zcl_abapgit_factory.clas.mjs");
+await import("./zcl_abapgit_field_rules.clas.mjs");
+await import("./zcl_abapgit_file_deserialize.clas.mjs");
+await import("./zcl_abapgit_file_status.clas.mjs");
+await import("./zcl_abapgit_filename_logic.clas.mjs");
+await import("./zcl_abapgit_folder_logic.clas.mjs");
+await import("./zcl_abapgit_frontend_services.clas.mjs");
+await import("./zcl_abapgit_git_add_patch.clas.mjs");
+await import("./zcl_abapgit_git_branch_list.clas.mjs");
+await import("./zcl_abapgit_git_commit.clas.mjs");
+await import("./zcl_abapgit_git_pack.clas.mjs");
+await import("./zcl_abapgit_git_porcelain.clas.mjs");
+await import("./zcl_abapgit_git_tag.clas.mjs");
+await import("./zcl_abapgit_git_time.clas.mjs");
+await import("./zcl_abapgit_git_transport.clas.mjs");
+await import("./zcl_abapgit_git_url.clas.mjs");
+await import("./zcl_abapgit_git_utils.clas.mjs");
+await import("./zcl_abapgit_gui.clas.mjs");
+await import("./zcl_abapgit_gui_asset_manager.clas.mjs");
+await import("./zcl_abapgit_gui_buttons.clas.mjs");
+await import("./zcl_abapgit_gui_component.clas.mjs");
+await import("./zcl_abapgit_gui_css_processor.clas.mjs");
+await import("./zcl_abapgit_gui_event.clas.mjs");
+await import("./zcl_abapgit_gui_hotkey_ctl.clas.mjs");
+await import("./zcl_abapgit_gui_html_processor.clas.mjs");
+await import("./zcl_abapgit_gui_in_page_modal.clas.mjs");
+await import("./zcl_abapgit_gui_jumper.clas.mjs");
+await import("./zcl_abapgit_gui_page.clas.mjs");
+await import("./zcl_abapgit_gui_page_addofflin.clas.mjs");
+await import("./zcl_abapgit_gui_page_addonline.clas.mjs");
+await import("./zcl_abapgit_gui_page_code_insp.clas.mjs");
+await import("./zcl_abapgit_gui_page_codi_base.clas.mjs");
+await import("./zcl_abapgit_gui_page_commit.clas.mjs");
+await import("./zcl_abapgit_gui_page_data.clas.mjs");
+await import("./zcl_abapgit_gui_page_db.clas.mjs");
+await import("./zcl_abapgit_gui_page_db_entry.clas.mjs");
+await import("./zcl_abapgit_gui_page_debuginfo.clas.mjs");
+await import("./zcl_abapgit_gui_page_diff.clas.mjs");
+await import("./zcl_abapgit_gui_page_ex_object.clas.mjs");
+await import("./zcl_abapgit_gui_page_ex_pckage.clas.mjs");
+await import("./zcl_abapgit_gui_page_hoc.clas.mjs");
+await import("./zcl_abapgit_gui_page_merge.clas.mjs");
+await import("./zcl_abapgit_gui_page_merge_res.clas.mjs");
+await import("./zcl_abapgit_gui_page_merge_sel.clas.mjs");
+await import("./zcl_abapgit_gui_page_patch.clas.mjs");
+await import("./zcl_abapgit_gui_page_repo_over.clas.mjs");
+await import("./zcl_abapgit_gui_page_repo_view.clas.mjs");
+await import("./zcl_abapgit_gui_page_run_bckg.clas.mjs");
+await import("./zcl_abapgit_gui_page_runit.clas.mjs");
+await import("./zcl_abapgit_gui_page_sett_bckg.clas.mjs");
+await import("./zcl_abapgit_gui_page_sett_glob.clas.mjs");
+await import("./zcl_abapgit_gui_page_sett_info.clas.mjs");
+await import("./zcl_abapgit_gui_page_sett_locl.clas.mjs");
+await import("./zcl_abapgit_gui_page_sett_pers.clas.mjs");
+await import("./zcl_abapgit_gui_page_sett_remo.clas.mjs");
+await import("./zcl_abapgit_gui_page_sett_repo.clas.mjs");
+await import("./zcl_abapgit_gui_page_stage.clas.mjs");
+await import("./zcl_abapgit_gui_page_syntax.clas.mjs");
+await import("./zcl_abapgit_gui_page_tags.clas.mjs");
+await import("./zcl_abapgit_gui_page_tutorial.clas.mjs");
+await import("./zcl_abapgit_gui_picklist.clas.mjs");
+await import("./zcl_abapgit_gui_router.clas.mjs");
+await import("./zcl_abapgit_gui_utils.clas.mjs");
+await import("./zcl_abapgit_hash.clas.mjs");
+await import("./zcl_abapgit_html_form.clas.mjs");
+await import("./zcl_abapgit_html_form_utils.clas.mjs");
+await import("./zcl_abapgit_html_parts.clas.mjs");
+await import("./zcl_abapgit_html_table.clas.mjs");
+await import("./zcl_abapgit_html_toolbar.clas.mjs");
+await import("./zcl_abapgit_html_viewer_gui.clas.mjs");
+await import("./zcl_abapgit_http.clas.mjs");
+await import("./zcl_abapgit_http_agent.clas.mjs");
+await import("./zcl_abapgit_http_client.clas.mjs");
+await import("./zcl_abapgit_http_digest.clas.mjs");
+await import("./zcl_abapgit_i18n_params.clas.mjs");
+await import("./zcl_abapgit_injector.clas.mjs");
+await import("./zcl_abapgit_integration_git.clas.mjs");
+await import("./zcl_abapgit_item_graph.clas.mjs");
+await import("./zcl_abapgit_item_state.clas.mjs");
+await import("./zcl_abapgit_json_handler.clas.mjs");
+await import("./zcl_abapgit_log.clas.mjs");
+await import("./zcl_abapgit_log_viewer.clas.mjs");
+await import("./zcl_abapgit_login_manager.clas.mjs");
+await import("./zcl_abapgit_longtexts.clas.mjs");
+await import("./zcl_abapgit_news.clas.mjs");
+await import("./zcl_abapgit_object_devc.clas.mjs");
+await import("./zcl_abapgit_object_intf.clas.mjs");
+await import("./zcl_abapgit_objects.clas.mjs");
+await import("./zcl_abapgit_objects_bridge.clas.mjs");
+await import("./zcl_abapgit_objects_files.clas.mjs");
+await import("./zcl_abapgit_objects_program.clas.mjs");
+await import("./zcl_abapgit_objects_super.clas.mjs");
+await import("./zcl_abapgit_oo_base.clas.mjs");
+await import("./zcl_abapgit_oo_factory.clas.mjs");
+await import("./zcl_abapgit_oo_interface.clas.mjs");
+await import("./zcl_abapgit_password_dialog.clas.mjs");
+await import("./zcl_abapgit_path.clas.mjs");
+await import("./zcl_abapgit_persist_background.clas.mjs");
+await import("./zcl_abapgit_persist_factory.clas.mjs");
+await import("./zcl_abapgit_persist_injector.clas.mjs");
+await import("./zcl_abapgit_persist_migrate.clas.mjs");
+await import("./zcl_abapgit_persist_packages.clas.mjs");
+await import("./zcl_abapgit_persist_settings.clas.mjs");
+await import("./zcl_abapgit_persistence_db.clas.mjs");
+await import("./zcl_abapgit_persistence_repo.clas.mjs");
+await import("./zcl_abapgit_persistence_user.clas.mjs");
+await import("./zcl_abapgit_po_file.clas.mjs");
+await import("./zcl_abapgit_popup_branch_list.clas.mjs");
+await import("./zcl_abapgit_popup_code_insp.clas.mjs");
+await import("./zcl_abapgit_popup_pull_request.clas.mjs");
+await import("./zcl_abapgit_popup_tag_list.clas.mjs");
+await import("./zcl_abapgit_popups.clas.mjs");
+await import("./zcl_abapgit_pr_enum_github.clas.mjs");
+await import("./zcl_abapgit_pr_enumerator.clas.mjs");
+await import("./zcl_abapgit_progress.clas.mjs");
+await import("./zcl_abapgit_proxy_auth.clas.mjs");
+await import("./zcl_abapgit_proxy_config.clas.mjs");
+await import("./zcl_abapgit_repo.clas.mjs");
+await import("./zcl_abapgit_repo_checksums.clas.mjs");
+await import("./zcl_abapgit_repo_content_list.clas.mjs");
+await import("./zcl_abapgit_repo_cs_migration.clas.mjs");
+await import("./zcl_abapgit_repo_filter.clas.mjs");
+await import("./zcl_abapgit_repo_offline.clas.mjs");
+await import("./zcl_abapgit_repo_online.clas.mjs");
+await import("./zcl_abapgit_repo_srv.clas.mjs");
+await import("./zcl_abapgit_requirement_helper.clas.mjs");
+await import("./zcl_abapgit_sap_namespace.clas.mjs");
+await import("./zcl_abapgit_sap_package.clas.mjs");
+await import("./zcl_abapgit_sap_report.clas.mjs");
+await import("./zcl_abapgit_serialize.clas.mjs");
+await import("./zcl_abapgit_services_abapgit.clas.mjs");
+await import("./zcl_abapgit_services_basis.clas.mjs");
+await import("./zcl_abapgit_services_git.clas.mjs");
+await import("./zcl_abapgit_services_repo.clas.mjs");
+await import("./zcl_abapgit_settings.clas.mjs");
+await import("./zcl_abapgit_sotr_handler.clas.mjs");
+await import("./zcl_abapgit_sots_handler.clas.mjs");
+await import("./zcl_abapgit_stage.clas.mjs");
+await import("./zcl_abapgit_stage_logic.clas.mjs");
+await import("./zcl_abapgit_string_buffer.clas.mjs");
+await import("./zcl_abapgit_string_map.clas.mjs");
+await import("./zcl_abapgit_syntax_factory.clas.mjs");
+await import("./zcl_abapgit_syntax_highlighter.clas.mjs");
+await import("./zcl_abapgit_syntax_json.clas.mjs");
+await import("./zcl_abapgit_syntax_txt.clas.mjs");
+await import("./zcl_abapgit_syntax_xml.clas.mjs");
+await import("./zcl_abapgit_tadir.clas.mjs");
+await import("./zcl_abapgit_timer.clas.mjs");
+await import("./zcl_abapgit_transport.clas.mjs");
+await import("./zcl_abapgit_transport_2_branch.clas.mjs");
+await import("./zcl_abapgit_transport_mass.clas.mjs");
+await import("./zcl_abapgit_transport_objects.clas.mjs");
+await import("./zcl_abapgit_ui_factory.clas.mjs");
+await import("./zcl_abapgit_ui_injector.clas.mjs");
+await import("./zcl_abapgit_url.clas.mjs");
+await import("./zcl_abapgit_user_record.clas.mjs");
+await import("./zcl_abapgit_utils.clas.mjs");
+await import("./zcl_abapgit_version.clas.mjs");
+await import("./zcl_abapgit_xml.clas.mjs");
+await import("./zcl_abapgit_xml_input.clas.mjs");
+await import("./zcl_abapgit_xml_output.clas.mjs");
+await import("./zcl_abapgit_xml_pretty.clas.mjs");
+await import("./zcl_abapgit_zip.clas.mjs");
+await import("./zcl_abapgit_zlib.clas.mjs");
+await import("./zcl_abapgit_zlib_convert.clas.mjs");
+await import("./zcl_abapgit_zlib_huffman.clas.mjs");
+await import("./zcl_abapgit_zlib_stream.clas.mjs");
+await import("./zcx_abapgit_ajson_error.clas.mjs");
+await import("./zcx_abapgit_cancel.clas.mjs");
+await import("./zcx_abapgit_exception.clas.mjs");
+await import("./zcx_abapgit_not_found.clas.mjs");
+await import("./zif_abapgit_aff_intf_v1.intf.mjs");
+await import("./zif_abapgit_aff_oo_types_v1.intf.mjs");
+await import("./zif_abapgit_aff_registry.intf.mjs");
+await import("./zif_abapgit_aff_type_mapping.intf.mjs");
+await import("./zif_abapgit_aff_types_v1.intf.mjs");
+await import("./zif_abapgit_ajson.intf.mjs");
+await import("./zif_abapgit_ajson_filter.intf.mjs");
+await import("./zif_abapgit_ajson_mapping.intf.mjs");
+await import("./zif_abapgit_ajson_types.intf.mjs");
+await import("./zif_abapgit_apack_definitions.intf.mjs");
+await import("./zif_abapgit_auth.intf.mjs");
+await import("./zif_abapgit_background.intf.mjs");
+await import("./zif_abapgit_code_inspector.intf.mjs");
+await import("./zif_abapgit_comparator.intf.mjs");
+await import("./zif_abapgit_cts_api.intf.mjs");
+await import("./zif_abapgit_data_config.intf.mjs");
+await import("./zif_abapgit_data_deserializer.intf.mjs");
+await import("./zif_abapgit_data_serializer.intf.mjs");
+await import("./zif_abapgit_data_supporter.intf.mjs");
+await import("./zif_abapgit_definitions.intf.mjs");
+await import("./zif_abapgit_dot_abapgit.intf.mjs");
+await import("./zif_abapgit_ecatt.intf.mjs");
+await import("./zif_abapgit_ecatt_download.intf.mjs");
+await import("./zif_abapgit_ecatt_upload.intf.mjs");
+await import("./zif_abapgit_environment.intf.mjs");
+await import("./zif_abapgit_exit.intf.mjs");
+await import("./zif_abapgit_field_rules.intf.mjs");
+await import("./zif_abapgit_frontend_services.intf.mjs");
+await import("./zif_abapgit_git_definitions.intf.mjs");
+await import("./zif_abapgit_gui_asset_manager.intf.mjs");
+await import("./zif_abapgit_gui_error_handler.intf.mjs");
+await import("./zif_abapgit_gui_event.intf.mjs");
+await import("./zif_abapgit_gui_event_handler.intf.mjs");
+await import("./zif_abapgit_gui_hotkey_ctl.intf.mjs");
+await import("./zif_abapgit_gui_hotkeys.intf.mjs");
+await import("./zif_abapgit_gui_html_processor.intf.mjs");
+await import("./zif_abapgit_gui_jumper.intf.mjs");
+await import("./zif_abapgit_gui_menu_provider.intf.mjs");
+await import("./zif_abapgit_gui_modal.intf.mjs");
+await import("./zif_abapgit_gui_page_title.intf.mjs");
+await import("./zif_abapgit_gui_render_item.intf.mjs");
+await import("./zif_abapgit_gui_renderable.intf.mjs");
+await import("./zif_abapgit_gui_services.intf.mjs");
+await import("./zif_abapgit_html.intf.mjs");
+await import("./zif_abapgit_html_form.intf.mjs");
+await import("./zif_abapgit_html_popup.intf.mjs");
+await import("./zif_abapgit_html_table.intf.mjs");
+await import("./zif_abapgit_html_viewer.intf.mjs");
+await import("./zif_abapgit_http_agent.intf.mjs");
+await import("./zif_abapgit_http_response.intf.mjs");
+await import("./zif_abapgit_i18n_file.intf.mjs");
+await import("./zif_abapgit_lang_definitions.intf.mjs");
+await import("./zif_abapgit_log.intf.mjs");
+await import("./zif_abapgit_longtexts.intf.mjs");
+await import("./zif_abapgit_lxe_texts.intf.mjs");
+await import("./zif_abapgit_merge.intf.mjs");
+await import("./zif_abapgit_object.intf.mjs");
+await import("./zif_abapgit_object_enho.intf.mjs");
+await import("./zif_abapgit_object_enhs.intf.mjs");
+await import("./zif_abapgit_object_filter.intf.mjs");
+await import("./zif_abapgit_objects.intf.mjs");
+await import("./zif_abapgit_oo_object_fnc.intf.mjs");
+await import("./zif_abapgit_persist_repo.intf.mjs");
+await import("./zif_abapgit_persist_repo_cs.intf.mjs");
+await import("./zif_abapgit_persist_settings.intf.mjs");
+await import("./zif_abapgit_persist_user.intf.mjs");
+await import("./zif_abapgit_persistence.intf.mjs");
+await import("./zif_abapgit_popups.intf.mjs");
+await import("./zif_abapgit_pr_enum_provider.intf.mjs");
+await import("./zif_abapgit_progress.intf.mjs");
+await import("./zif_abapgit_repo.intf.mjs");
+await import("./zif_abapgit_repo_checksums.intf.mjs");
+await import("./zif_abapgit_repo_listener.intf.mjs");
+await import("./zif_abapgit_repo_online.intf.mjs");
+await import("./zif_abapgit_repo_srv.intf.mjs");
+await import("./zif_abapgit_sap_namespace.intf.mjs");
+await import("./zif_abapgit_sap_package.intf.mjs");
+await import("./zif_abapgit_sap_report.intf.mjs");
+await import("./zif_abapgit_services_git.intf.mjs");
+await import("./zif_abapgit_services_repo.intf.mjs");
+await import("./zif_abapgit_stage_logic.intf.mjs");
+await import("./zif_abapgit_tadir.intf.mjs");
+await import("./zif_abapgit_version.intf.mjs");
+await import("./zif_abapgit_xml_input.intf.mjs");
+await import("./zif_abapgit_xml_output.intf.mjs");
+await import("./zw3mi.fugr.wwwdata_export.mjs");
+await import("./zw3mi.fugr.wwwdata_import.mjs");
+await import("./zw3mi.fugr.wwwparams_insert.mjs");
+await import("./zw3mi.fugr.wwwparams_read.mjs");
+await import("./zcl_abapgit_lxe_texts.clas.mjs");
+await import("./zcl_abapgit_syntax_abap.clas.mjs");
+await import("./zcl_abapgit_syntax_css.clas.mjs");
+await import("./zcl_abapgit_syntax_js.clas.mjs");
+await import("./zcl_abapgit_html.clas.mjs");
+await import("./zcl_abapgit_gui_chunk_lib.clas.mjs");
+await import("./zcl_abapgit_html_action_utils.clas.mjs");
+await import("./zcl_abapgit_language.clas.mjs");
+await import("./zcl_abapgit_repo_labels.clas.mjs");
+ 
+export async function initializeABAP() {
+  const sqlite = [];
+sqlite.push(`CREATE TABLE 'dd02l' ('tabname' NCHAR(30) COLLATE RTRIM, 'as4local' NCHAR(1) COLLATE RTRIM, 'as4vers' NCHAR(4), 'tabclass' NCHAR(8) COLLATE RTRIM, 'sqltab' NCHAR(30) COLLATE RTRIM, 'as4user' NCHAR(12) COLLATE RTRIM, 'as4date' NCHAR(8), 'as4time' NCHAR(6), 'contflag' NCHAR(1) COLLATE RTRIM, PRIMARY KEY('tabname','as4local','as4vers'));`);
+sqlite.push(`CREATE TABLE 'dd09l' ('tabname' NCHAR(30) COLLATE RTRIM, 'as4local' NCHAR(1) COLLATE RTRIM, 'as4vers' NCHAR(4), 'tabkat' NCHAR(2) COLLATE RTRIM, 'tabart' NCHAR(5) COLLATE RTRIM, 'as4user' NCHAR(12) COLLATE RTRIM, 'as4date' NCHAR(8), 'as4time' NCHAR(6), 'bufallow' NCHAR(1) COLLATE RTRIM, PRIMARY KEY('tabname','as4local','as4vers'));`);
+sqlite.push(`CREATE TABLE 'dokhl' ('id' NCHAR(2) COLLATE RTRIM, 'object' NCHAR(60) COLLATE RTRIM, 'langu' NCHAR(1) COLLATE RTRIM, 'typ' NCHAR(1) COLLATE RTRIM, 'dokversion' NCHAR(4), 'dokstate' NCHAR(1) COLLATE RTRIM, 'dokform' NCHAR(16) COLLATE RTRIM, 'dokstyle' NCHAR(8) COLLATE RTRIM, 'dokfuser' NCHAR(12) COLLATE RTRIM, 'dokfreles' NCHAR(4) COLLATE RTRIM, 'dokfdate' NCHAR(8), 'dokftime' NCHAR(6), 'dokluser' NCHAR(12) COLLATE RTRIM, 'doklreles' NCHAR(4) COLLATE RTRIM, 'dokldate' NCHAR(8), 'dokltime' NCHAR(6), PRIMARY KEY('id','object','langu','typ','dokversion'));`);
+sqlite.push(`CREATE TABLE 'dokil' ('id' NCHAR(2) COLLATE RTRIM, 'object' NCHAR(60) COLLATE RTRIM, 'langu' NCHAR(1) COLLATE RTRIM, 'typ' NCHAR(1) COLLATE RTRIM, 'version' NCHAR(4), 'masterlang' NCHAR(1) COLLATE RTRIM, 'txtlines' NCHAR(5), 'dokstate' NCHAR(1) COLLATE RTRIM, 'selfdef' NCHAR(1) COLLATE RTRIM, PRIMARY KEY('id','object','langu','typ'));`);
+sqlite.push(`CREATE TABLE 'progdir' ('name' NCHAR(40) COLLATE RTRIM, 'state' NCHAR(1) COLLATE RTRIM, 'sqlx' NCHAR(1) COLLATE RTRIM, 'edtx' NCHAR(1) COLLATE RTRIM, 'varcl' NCHAR(1) COLLATE RTRIM, 'dbapl' NCHAR(1) COLLATE RTRIM, 'dbna' NCHAR(2) COLLATE RTRIM, 'clas' NCHAR(4) COLLATE RTRIM, 'type' NCHAR(3) COLLATE RTRIM, 'occurs' NCHAR(1) COLLATE RTRIM, 'subc' NCHAR(1) COLLATE RTRIM, 'appl' NCHAR(1) COLLATE RTRIM, 'secu' NCHAR(8) COLLATE RTRIM, 'cnam' NCHAR(12) COLLATE RTRIM, 'cdat' NCHAR(8), 'unam' NCHAR(12) COLLATE RTRIM, 'udat' NCHAR(8), 'vern' NCHAR(6) COLLATE RTRIM, 'levl' NCHAR(4) COLLATE RTRIM, 'rstat' NCHAR(1) COLLATE RTRIM, 'rmand' NCHAR(3) COLLATE RTRIM, 'rload' NCHAR(1) COLLATE RTRIM, 'fixpt' NCHAR(1) COLLATE RTRIM, 'sset' NCHAR(1) COLLATE RTRIM, 'sdate' NCHAR(8), 'stime' NCHAR(6) COLLATE RTRIM, 'idate' NCHAR(8), 'itime' NCHAR(6) COLLATE RTRIM, 'ldbname' NCHAR(20) COLLATE RTRIM, 'uccheck' NCHAR(1) COLLATE RTRIM, PRIMARY KEY('name','state'));`);
+sqlite.push(`CREATE TABLE 'seocompo' ('clsname' NCHAR(30) COLLATE RTRIM, 'cmpname' NCHAR(30) COLLATE RTRIM, 'cmptype' NCHAR(1), 'mtdtype' NCHAR(1), PRIMARY KEY('clsname','cmpname'));`);
+sqlite.push(`CREATE TABLE 'seocompotx' ('clsname' NCHAR(30) COLLATE RTRIM, 'cmpname' NCHAR(30) COLLATE RTRIM, 'langu' NCHAR(1) COLLATE RTRIM, 'descript' NCHAR(60) COLLATE RTRIM, PRIMARY KEY('clsname','cmpname','langu'));`);
+sqlite.push(`CREATE TABLE 'seosubco' ('clsname' NCHAR(30) COLLATE RTRIM, 'cmpname' NCHAR(30) COLLATE RTRIM, 'sconame' NCHAR(30) COLLATE RTRIM, 'cmptype' NCHAR(1), 'mtdtype' NCHAR(1), 'scotype' NCHAR(1), PRIMARY KEY('clsname','cmpname','sconame'));`);
+sqlite.push(`CREATE TABLE 'seosubcotx' ('clsname' NCHAR(30) COLLATE RTRIM, 'cmpname' NCHAR(30) COLLATE RTRIM, 'sconame' NCHAR(30) COLLATE RTRIM, 'langu' NCHAR(1) COLLATE RTRIM, 'descript' NCHAR(60) COLLATE RTRIM, PRIMARY KEY('clsname','cmpname','sconame','langu'));`);
+sqlite.push(`CREATE TABLE 'trnspace' ('namespace' NCHAR(10) COLLATE RTRIM, 'editflag' NCHAR(1) COLLATE RTRIM, PRIMARY KEY('namespace'));`);
+sqlite.push(`CREATE TABLE 't000' ('mandt' NCHAR(3) COLLATE RTRIM, 'cccategory' NCHAR(1) COLLATE RTRIM, 'ccnocliind' NCHAR(1) COLLATE RTRIM, PRIMARY KEY('mandt'));`);
+sqlite.push(`CREATE TABLE 't100' ('sprsl' NCHAR(1) COLLATE RTRIM, 'arbgb' NCHAR(20) COLLATE RTRIM, 'msgnr' NCHAR(3) COLLATE RTRIM, 'text' NCHAR(73) COLLATE RTRIM, PRIMARY KEY('sprsl','arbgb','msgnr'));`);
+sqlite.push(`CREATE TABLE 'tdevc' ('devclass' NCHAR(30) COLLATE RTRIM, 'dlvunit' NCHAR(30) COLLATE RTRIM, 'component' NCHAR(20) COLLATE RTRIM, 'parentcl' NCHAR(30) COLLATE RTRIM, 'as4user' NCHAR(12) COLLATE RTRIM, 'created_by' NCHAR(12) COLLATE RTRIM, 'created_on' NCHAR(8), 'ctext' NCHAR(60) COLLATE RTRIM, 'changed_by' NCHAR(12) COLLATE RTRIM, 'changed_on' NCHAR(8), 'namespace' NCHAR(10) COLLATE RTRIM, PRIMARY KEY('devclass'));`);
+sqlite.push(`CREATE TABLE 'tfdir' ('funcname' NCHAR(30) COLLATE RTRIM, PRIMARY KEY('funcname'));`);
+sqlite.push(`CREATE TABLE 'reposrc' ('progname' NCHAR(40) COLLATE RTRIM, 'data' TEXT COLLATE RTRIM, 'unam' NCHAR(12) COLLATE RTRIM, 'udat' NCHAR(8), 'utime' NCHAR(6), PRIMARY KEY('progname'));`);
+  const hdb = `todo`;
+  const pg = `CREATE TABLE "dd02l" ("tabname" NCHAR(30), "as4local" NCHAR(1), "as4vers" NCHAR(4), "tabclass" NCHAR(8), "sqltab" NCHAR(30), "as4user" NCHAR(12), "as4date" NCHAR(8), "as4time" NCHAR(6), "contflag" NCHAR(1), PRIMARY KEY("tabname","as4local","as4vers"));,CREATE TABLE "dd09l" ("tabname" NCHAR(30), "as4local" NCHAR(1), "as4vers" NCHAR(4), "tabkat" NCHAR(2), "tabart" NCHAR(5), "as4user" NCHAR(12), "as4date" NCHAR(8), "as4time" NCHAR(6), "bufallow" NCHAR(1), PRIMARY KEY("tabname","as4local","as4vers"));,CREATE TABLE "dokhl" ("id" NCHAR(2), "object" NCHAR(60), "langu" NCHAR(1), "typ" NCHAR(1), "dokversion" NCHAR(4), "dokstate" NCHAR(1), "dokform" NCHAR(16), "dokstyle" NCHAR(8), "dokfuser" NCHAR(12), "dokfreles" NCHAR(4), "dokfdate" NCHAR(8), "dokftime" NCHAR(6), "dokluser" NCHAR(12), "doklreles" NCHAR(4), "dokldate" NCHAR(8), "dokltime" NCHAR(6), PRIMARY KEY("id","object","langu","typ","dokversion"));,CREATE TABLE "dokil" ("id" NCHAR(2), "object" NCHAR(60), "langu" NCHAR(1), "typ" NCHAR(1), "version" NCHAR(4), "masterlang" NCHAR(1), "txtlines" NCHAR(5), "dokstate" NCHAR(1), "selfdef" NCHAR(1), PRIMARY KEY("id","object","langu","typ"));,CREATE TABLE "progdir" ("name" NCHAR(40), "state" NCHAR(1), "sqlx" NCHAR(1), "edtx" NCHAR(1), "varcl" NCHAR(1), "dbapl" NCHAR(1), "dbna" NCHAR(2), "clas" NCHAR(4), "type" NCHAR(3), "occurs" NCHAR(1), "subc" NCHAR(1), "appl" NCHAR(1), "secu" NCHAR(8), "cnam" NCHAR(12), "cdat" NCHAR(8), "unam" NCHAR(12), "udat" NCHAR(8), "vern" NCHAR(6), "levl" NCHAR(4), "rstat" NCHAR(1), "rmand" NCHAR(3), "rload" NCHAR(1), "fixpt" NCHAR(1), "sset" NCHAR(1), "sdate" NCHAR(8), "stime" NCHAR(6), "idate" NCHAR(8), "itime" NCHAR(6), "ldbname" NCHAR(20), "uccheck" NCHAR(1), PRIMARY KEY("name","state"));,CREATE TABLE "seocompo" ("clsname" NCHAR(30), "cmpname" NCHAR(30), "cmptype" NCHAR(1), "mtdtype" NCHAR(1), PRIMARY KEY("clsname","cmpname"));,CREATE TABLE "seocompotx" ("clsname" NCHAR(30), "cmpname" NCHAR(30), "langu" NCHAR(1), "descript" NCHAR(60), PRIMARY KEY("clsname","cmpname","langu"));,CREATE TABLE "seosubco" ("clsname" NCHAR(30), "cmpname" NCHAR(30), "sconame" NCHAR(30), "cmptype" NCHAR(1), "mtdtype" NCHAR(1), "scotype" NCHAR(1), PRIMARY KEY("clsname","cmpname","sconame"));,CREATE TABLE "seosubcotx" ("clsname" NCHAR(30), "cmpname" NCHAR(30), "sconame" NCHAR(30), "langu" NCHAR(1), "descript" NCHAR(60), PRIMARY KEY("clsname","cmpname","sconame","langu"));,CREATE TABLE "trnspace" ("namespace" NCHAR(10), "editflag" NCHAR(1), PRIMARY KEY("namespace"));,CREATE TABLE "t000" ("mandt" NCHAR(3), "cccategory" NCHAR(1), "ccnocliind" NCHAR(1), PRIMARY KEY("mandt"));,CREATE TABLE "t100" ("sprsl" NCHAR(1), "arbgb" NCHAR(20), "msgnr" NCHAR(3), "text" NCHAR(73), PRIMARY KEY("sprsl","arbgb","msgnr"));,CREATE TABLE "tdevc" ("devclass" NCHAR(30), "dlvunit" NCHAR(30), "component" NCHAR(20), "parentcl" NCHAR(30), "as4user" NCHAR(12), "created_by" NCHAR(12), "created_on" NCHAR(8), "ctext" NCHAR(60), "changed_by" NCHAR(12), "changed_on" NCHAR(8), "namespace" NCHAR(10), PRIMARY KEY("devclass"));,CREATE TABLE "tfdir" ("funcname" NCHAR(30), PRIMARY KEY("funcname"));,CREATE TABLE "reposrc" ("progname" NCHAR(40), "data" TEXT, "unam" NCHAR(12), "udat" NCHAR(8), "utime" NCHAR(6), PRIMARY KEY("progname"));`;
+  const schemas = {sqlite, hdb, pg};
+  const insert = [];
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_INTEGRATION_GIT             ', 'CLASS zcl_abapgit_integration_git DEFINITION PUBLIC FINAL CREATE PUBLIC.
+ENDCLASS.
+ 
+CLASS zcl_abapgit_integration_git IMPLEMENTATION.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_APACK_READER                ', 'CLASS zcl_abapgit_apack_reader DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES ty_package_name TYPE devclass .
+ 
+    CLASS-METHODS create_instance
+      IMPORTING
+        !iv_package_name          TYPE ty_package_name
+      RETURNING
+        VALUE(ro_manifest_reader) TYPE REF TO zcl_abapgit_apack_reader .
+    CLASS-METHODS deserialize
+      IMPORTING
+        !iv_package_name          TYPE ty_package_name
+        !iv_xstr                  TYPE xstring
+      RETURNING
+        VALUE(ro_manifest_reader) TYPE REF TO zcl_abapgit_apack_reader
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_manifest_descriptor
+      RETURNING
+        VALUE(rs_manifest_descriptor) TYPE zif_abapgit_apack_definitions=>ty_descriptor
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_manifest_descriptor
+      IMPORTING
+        !is_manifest_descriptor TYPE zif_abapgit_apack_definitions=>ty_descriptor
+      RAISING
+        zcx_abapgit_exception.
+    METHODS copy_manifest_descriptor
+      IMPORTING
+        !io_manifest_provider TYPE REF TO object
+      RAISING
+        zcx_abapgit_exception.
+    METHODS has_manifest
+      RETURNING
+        VALUE(rv_has_manifest) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      IMPORTING
+        !iv_package_name TYPE ty_package_name .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_s_manifest_declaration,
+        clsname  TYPE seoclsname,
+        devclass TYPE devclass,
+      END OF ty_s_manifest_declaration .
+ 
+    DATA mv_package_name TYPE ty_package_name .
+    DATA ms_cached_descriptor TYPE zif_abapgit_apack_definitions=>ty_descriptor .
+    DATA mv_is_cached TYPE abap_bool .
+ 
+    CLASS-METHODS from_xml
+      IMPORTING
+        iv_xml         TYPE string
+      RETURNING
+        VALUE(rs_data) TYPE zif_abapgit_apack_definitions=>ty_descriptor.
+ 
+    METHODS format_version
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_apack_reader IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mv_package_name = iv_package_name.
+  ENDMETHOD.
+ 
+ 
+  METHOD copy_manifest_descriptor.
+ 
+    DATA: ls_my_manifest_wo_deps TYPE zif_abapgit_apack_definitions=>ty_descriptor_wo_dependencies,
+          ls_my_dependency       TYPE zif_abapgit_apack_definitions=>ty_dependency,
+          ls_descriptor          TYPE zif_abapgit_apack_definitions=>ty_descriptor,
+          lv_descriptor_cust     TYPE string,
+          lv_descriptor_sap      TYPE string.
+ 
+    FIELD-SYMBOLS: <lg_descriptor>   TYPE any,
+                   <lt_dependencies> TYPE ANY TABLE,
+                   <lg_dependency>   TYPE any.
+ 
+    lv_descriptor_cust = zif_abapgit_apack_definitions=>c_apack_interface_cust && ''~DESCRIPTOR''.
+    lv_descriptor_sap  = zif_abapgit_apack_definitions=>c_apack_interface_sap && ''~DESCRIPTOR''.
+ 
+    ASSIGN io_manifest_provider->(lv_descriptor_cust) TO <lg_descriptor>.
+    IF <lg_descriptor> IS NOT ASSIGNED.
+      ASSIGN io_manifest_provider->(lv_descriptor_sap) TO <lg_descriptor>.
+    ENDIF.
+    IF <lg_descriptor> IS ASSIGNED.
+      " A little more complex than a normal MOVE-CORRSPONDING
+      " to avoid dumps in case of future updates to the dependencies table structure
+      ASSIGN COMPONENT ''DEPENDENCIES'' OF STRUCTURE <lg_descriptor> TO <lt_dependencies>.
+      IF <lt_dependencies> IS ASSIGNED.
+        LOOP AT <lt_dependencies> ASSIGNING <lg_dependency>.
+          MOVE-CORRESPONDING <lg_dependency> TO ls_my_dependency.
+          INSERT ls_my_dependency INTO TABLE ls_descriptor-dependencies.
+        ENDLOOP.
+        MOVE-CORRESPONDING <lg_descriptor> TO ls_my_manifest_wo_deps.
+        MOVE-CORRESPONDING ls_my_manifest_wo_deps TO ls_descriptor.
+      ENDIF.
+    ENDIF.
+ 
+    set_manifest_descriptor( ls_descriptor ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_instance.
+    CREATE OBJECT ro_manifest_reader
+      EXPORTING
+        iv_package_name = iv_package_name.
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize.
+ 
+    DATA: lv_xml  TYPE string,
+          ls_data TYPE zif_abapgit_apack_definitions=>ty_descriptor.
+ 
+    lv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( iv_xstr ).
+ 
+    ls_data = from_xml( lv_xml ).
+ 
+    ro_manifest_reader = create_instance( iv_package_name ).
+ 
+    ro_manifest_reader = create_instance( iv_package_name ).
+    ro_manifest_reader->set_manifest_descriptor( ls_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_version.
+ 
+    FIELD-SYMBOLS: <ls_dependency> TYPE zif_abapgit_apack_definitions=>ty_dependency.
+ 
+    TRANSLATE ms_cached_descriptor-version TO LOWER CASE.
+    ms_cached_descriptor-sem_version = zcl_abapgit_version=>conv_str_to_version( ms_cached_descriptor-version ).
+ 
+    LOOP AT ms_cached_descriptor-dependencies ASSIGNING <ls_dependency>.
+      <ls_dependency>-sem_version = zcl_abapgit_version=>conv_str_to_version( <ls_dependency>-version ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = iv_xml.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = ''accept_data_loss''
+      SOURCE XML lv_xml
+      RESULT data = rs_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_manifest_descriptor.
+ 
+    DATA: lo_manifest_provider       TYPE REF TO object,
+          ls_manifest_implementation TYPE ty_s_manifest_declaration.
+ 
+    IF mv_is_cached IS INITIAL AND mv_package_name IS NOT INITIAL.
+      SELECT SINGLE seometarel~clsname tadir~devclass FROM seometarel "#EC CI_NOORDER
+         INNER JOIN tadir ON seometarel~clsname = tadir~obj_name "#EC CI_BUFFJOIN
+         INTO ls_manifest_implementation
+         WHERE tadir~pgmid = ''R3TR'' AND
+               tadir~object = ''CLAS'' AND
+               seometarel~version = ''1'' AND
+               seometarel~refclsname = zif_abapgit_apack_definitions=>c_apack_interface_cust AND
+               tadir~devclass = mv_package_name.
+      IF ls_manifest_implementation IS INITIAL.
+        SELECT SINGLE seometarel~clsname tadir~devclass FROM seometarel "#EC CI_NOORDER
+           INNER JOIN tadir ON seometarel~clsname = tadir~obj_name "#EC CI_BUFFJOIN
+           INTO ls_manifest_implementation
+           WHERE tadir~pgmid = ''R3TR'' AND
+                 tadir~object = ''CLAS'' AND
+                 seometarel~version = ''1'' AND
+                 seometarel~refclsname = zif_abapgit_apack_definitions=>c_apack_interface_sap AND
+                 tadir~devclass = mv_package_name.
+      ENDIF.
+      IF ls_manifest_implementation IS NOT INITIAL.
+        TRY.
+            CREATE OBJECT lo_manifest_provider TYPE (ls_manifest_implementation-clsname).
+          CATCH cx_sy_create_object_error.
+            CLEAR: rs_manifest_descriptor.
+        ENDTRY.
+        IF lo_manifest_provider IS BOUND.
+          copy_manifest_descriptor( lo_manifest_provider ).
+        ENDIF.
+      ENDIF.
+ 
+      mv_is_cached = abap_true.
+ 
+    ENDIF.
+ 
+    rs_manifest_descriptor = ms_cached_descriptor.
+  ENDMETHOD.
+ 
+ 
+  METHOD has_manifest.
+ 
+    DATA: ls_returned_manifest TYPE zif_abapgit_apack_definitions=>ty_descriptor.
+ 
+    ls_returned_manifest = get_manifest_descriptor( ).
+ 
+    rv_has_manifest = abap_false.
+    IF ls_returned_manifest IS NOT INITIAL.
+      rv_has_manifest = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_manifest_descriptor.
+    mv_is_cached = abap_true.
+    ms_cached_descriptor = is_manifest_descriptor.
+    format_version( ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_APACK_DEFINITIONS           ', 'INTERFACE zif_abapgit_apack_definitions PUBLIC .
+ 
+ 
+  TYPES:
+    BEGIN OF ty_dependency,
+      group_id       TYPE string,
+      artifact_id    TYPE string,
+      version        TYPE string,
+      sem_version    TYPE zif_abapgit_definitions=>ty_version,
+      git_url        TYPE string,
+      target_package TYPE devclass,
+    END OF ty_dependency,
+    ty_dependencies    TYPE STANDARD TABLE OF ty_dependency
+                    WITH NON-UNIQUE DEFAULT KEY,
+ 
+    ty_repository_type TYPE string,
+ 
+    BEGIN OF ty_descriptor_wo_dependencies,
+      group_id        TYPE string,
+      artifact_id     TYPE string,
+      version         TYPE string,
+      sem_version     TYPE zif_abapgit_definitions=>ty_version,
+      repository_type TYPE ty_repository_type,
+      git_url         TYPE string,
+    END OF ty_descriptor_wo_dependencies,
+ 
+    BEGIN OF ty_descriptor.
+      INCLUDE TYPE ty_descriptor_wo_dependencies.
+  TYPES:
+    dependencies TYPE ty_dependencies,
+    END OF ty_descriptor,
+ 
+    ty_descriptors TYPE STANDARD TABLE OF ty_descriptor WITH NON-UNIQUE DEFAULT KEY.
+ 
+  CONSTANTS c_dot_apack_manifest TYPE string VALUE ''.apack-manifest.xml'' ##NO_TEXT.
+  CONSTANTS c_repository_type_abapgit TYPE ty_repository_type VALUE ''abapGit'' ##NO_TEXT.
+  CONSTANTS c_apack_interface_sap TYPE seoclsname VALUE ''IF_APACK_MANIFEST'' ##NO_TEXT.
+  CONSTANTS c_apack_interface_cust TYPE seoclsname VALUE ''ZIF_APACK_MANIFEST'' ##NO_TEXT.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_BACKGROUND                  ', 'CLASS zcl_abapgit_background DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES: BEGIN OF ty_method,
+             class_       TYPE seoclsname,
+             description TYPE string,
+           END OF ty_method.
+ 
+    TYPES: ty_methods TYPE SORTED TABLE OF ty_method WITH UNIQUE KEY class_.
+ 
+    CLASS-METHODS run
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS list_methods
+      RETURNING VALUE(rt_methods) TYPE ty_methods.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_BACKGROUND IMPLEMENTATION.
+ 
+ 
+  METHOD list_methods.
+ 
+    DATA: ls_method       LIKE LINE OF rt_methods,
+          ls_key          TYPE seoclskey,
+          lt_implementing TYPE seor_implementing_keys,
+          ls_implementing LIKE LINE OF lt_implementing.
+ 
+    FIELD-SYMBOLS: <ls_method> LIKE LINE OF rt_methods.
+ 
+ 
+* in order to handle local classes in the compiled report
+    ls_method-class_ = ''ZCL_ABAPGIT_BACKGROUND_PULL''.
+    INSERT ls_method INTO TABLE rt_methods.
+    ls_method-class_ = ''ZCL_ABAPGIT_BACKGROUND_PUSH_AU''.
+    INSERT ls_method INTO TABLE rt_methods.
+    ls_method-class_ = ''ZCL_ABAPGIT_BACKGROUND_PUSH_FI''.
+    INSERT ls_method INTO TABLE rt_methods.
+ 
+    ls_key-clsname = ''ZIF_ABAPGIT_BACKGROUND''.
+ 
+    CALL FUNCTION ''SEO_INTERFACE_IMPLEM_GET_ALL''
+      EXPORTING
+        intkey       = ls_key
+      IMPORTING
+        impkeys      = lt_implementing
+      EXCEPTIONS
+        not_existing = 1
+        OTHERS       = 2 ##FM_SUBRC_OK.
+    LOOP AT lt_implementing INTO ls_implementing.
+      ls_method-class_ = ls_implementing-clsname.
+      INSERT ls_method INTO TABLE rt_methods.
+    ENDLOOP.
+ 
+    LOOP AT rt_methods ASSIGNING <ls_method>.
+      CALL METHOD (<ls_method>-class_)=>zif_abapgit_background~get_description
+        RECEIVING
+          rv_description = <ls_method>-description.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    CONSTANTS: lc_enq_type TYPE c LENGTH 12 VALUE ''BACKGROUND''.
+ 
+    DATA: lo_per        TYPE REF TO zcl_abapgit_persist_background,
+          lo_repo       TYPE REF TO zcl_abapgit_repo_online,
+          lt_list       TYPE zcl_abapgit_persist_background=>ty_background_keys,
+          li_background TYPE REF TO zif_abapgit_background,
+          li_log        TYPE REF TO zif_abapgit_log,
+          lx_error      TYPE REF TO zcx_abapgit_exception,
+          lv_repo_name  TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_list> LIKE LINE OF lt_list.
+ 
+ 
+    CALL FUNCTION ''ENQUEUE_EZABAPGIT''
+      EXPORTING
+        mode_zabapgit  = ''E''
+        type           = lc_enq_type
+        _scope         = ''3''
+      EXCEPTIONS
+        foreign_lock   = 1
+        system_failure = 2
+        OTHERS         = 3.
+    IF sy-subrc <> 0.
+      WRITE: / ''Another intance of the program is already running''.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT lo_per.
+    lt_list = lo_per->list( ).
+ 
+    WRITE: / ''Background mode''.
+ 
+    LOOP AT lt_list ASSIGNING <ls_list>.
+      CREATE OBJECT li_log TYPE zcl_abapgit_log.
+ 
+      TRY.
+          lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( <ls_list>-key ).
+          lv_repo_name = lo_repo->get_name( ).
+          WRITE: / <ls_list>-method, lv_repo_name.
+ 
+          zcl_abapgit_login_manager=>set(
+            iv_uri      = lo_repo->get_url( )
+            iv_username = <ls_list>-username
+            iv_password = <ls_list>-password ).
+ 
+          CREATE OBJECT li_background TYPE (<ls_list>-method).
+ 
+          li_background->run(
+            io_repo     = lo_repo
+            ii_log      = li_log
+            it_settings = <ls_list>-settings ).
+ 
+          " Clear auth buffer to allow different user/password per repository in background mode
+          zcl_abapgit_login_manager=>clear( ).
+ 
+        CATCH zcx_abapgit_exception INTO lx_error.
+          li_log->add_exception( lx_error ).
+      ENDTRY.
+ 
+      zcl_abapgit_log_viewer=>write_log( li_log ).
+    ENDLOOP.
+ 
+    IF lines( lt_list ) = 0.
+      WRITE: / ''Nothing configured''.
+    ENDIF.
+ 
+    CALL FUNCTION ''DEQUEUE_EZABAPGIT''
+      EXPORTING
+        type = lc_enq_type.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_BACKGROUND_PULL             ', 'CLASS zcl_abapgit_background_pull DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_background .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_background_pull IMPLEMENTATION.
+ 
+ 
+  METHOD zif_abapgit_background~get_description.
+ 
+    rv_description = ''Automatic pull''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_settings.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~run.
+ 
+    DATA: ls_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks.
+ 
+    FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF ls_checks-overwrite.
+ 
+ 
+    ls_checks = io_repo->deserialize_checks( ).
+ 
+    LOOP AT ls_checks-overwrite ASSIGNING <ls_overwrite>.
+      <ls_overwrite>-decision = zif_abapgit_definitions=>c_yes.
+    ENDLOOP.
+ 
+    io_repo->deserialize( is_checks = ls_checks
+                          ii_log    = ii_log ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_BACKGROUND_PUSH_AU          ', 'CLASS zcl_abapgit_background_push_au DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_background .
+  PROTECTED SECTION.
+ 
+    DATA mi_log TYPE REF TO zif_abapgit_log .
+ 
+    METHODS build_comment
+      IMPORTING
+        !is_files         TYPE zif_abapgit_definitions=>ty_stage_files
+      RETURNING
+        VALUE(rv_comment) TYPE string .
+    METHODS push_auto
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo_online
+      RAISING
+        zcx_abapgit_exception .
+    METHODS determine_user_details
+      IMPORTING
+        !iv_changed_by TYPE syuname
+      RETURNING
+        VALUE(rs_user) TYPE zif_abapgit_git_definitions=>ty_git_user .
+    METHODS push_deletions
+      IMPORTING
+        !io_repo  TYPE REF TO zcl_abapgit_repo_online
+        !is_files TYPE zif_abapgit_definitions=>ty_stage_files
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_background_push_au IMPLEMENTATION.
+ 
+ 
+  METHOD build_comment.
+ 
+    DATA: lt_objects TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          lv_str     TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_local> LIKE LINE OF is_files-local.
+ 
+ 
+    LOOP AT is_files-local ASSIGNING <ls_local>.
+      lv_str = |{ <ls_local>-item-obj_type } { <ls_local>-item-obj_name }|.
+      APPEND lv_str TO lt_objects.
+    ENDLOOP.
+ 
+    SORT lt_objects AS TEXT.
+    DELETE ADJACENT DUPLICATES FROM lt_objects.
+ 
+    IF lines( lt_objects ) = 1.
+      rv_comment = |BG: { lv_str }|.
+    ELSE.
+      rv_comment = ''BG: Multiple objects''.
+      LOOP AT lt_objects INTO lv_str.
+        CONCATENATE rv_comment cl_abap_char_utilities=>newline lv_str INTO rv_comment.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_user_details.
+ 
+    DATA: lo_user_record TYPE REF TO zcl_abapgit_user_record.
+ 
+ 
+    lo_user_record = zcl_abapgit_user_record=>get_instance( iv_changed_by ).
+    rs_user-name = lo_user_record->get_name( ).
+    rs_user-email = lo_user_record->get_email( ).
+ 
+*   If no email, fall back to localhost/default email
+    IF rs_user-email IS INITIAL.
+      rs_user-email = |{ iv_changed_by }@localhost|.
+    ENDIF.
+ 
+*   If no full name maintained, just use changed by user name
+    IF rs_user-name IS INITIAL.
+      rs_user-name  = iv_changed_by.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push_auto.
+ 
+    TYPES: BEGIN OF ty_changed,
+             filename   TYPE string,
+             path       TYPE string,
+             changed_by TYPE syuname,
+           END OF ty_changed.
+ 
+    DATA: ls_comment    TYPE zif_abapgit_git_definitions=>ty_comment,
+          ls_files      TYPE zif_abapgit_definitions=>ty_stage_files,
+          lt_changed    TYPE STANDARD TABLE OF ty_changed WITH DEFAULT KEY,
+          lt_users      TYPE STANDARD TABLE OF syuname WITH DEFAULT KEY,
+          ls_user_files LIKE ls_files,
+          lv_changed_by LIKE LINE OF lt_users,
+          lo_stage      TYPE REF TO zcl_abapgit_stage.
+ 
+    FIELD-SYMBOLS: <ls_changed> LIKE LINE OF lt_changed,
+                   <ls_remote>  LIKE LINE OF ls_files-remote,
+                   <ls_local>   LIKE LINE OF ls_files-local.
+ 
+ 
+    ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
+ 
+    LOOP AT ls_files-local ASSIGNING <ls_local>.
+      lv_changed_by = zcl_abapgit_objects=>changed_by(
+        is_item     = <ls_local>-item
+        iv_filename = <ls_local>-file-filename ).
+      APPEND lv_changed_by TO lt_users.
+      APPEND INITIAL LINE TO lt_changed ASSIGNING <ls_changed>.
+      <ls_changed>-changed_by = lv_changed_by.
+      <ls_changed>-filename   = <ls_local>-file-filename.
+      <ls_changed>-path       = <ls_local>-file-path.
+    ENDLOOP.
+ 
+    SORT lt_users ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM lt_users.
+ 
+    LOOP AT lt_users INTO lv_changed_by.
+      CLEAR: ls_comment.
+ 
+*     Fill user details
+      ls_comment-committer = determine_user_details( lv_changed_by ).
+ 
+      CREATE OBJECT lo_stage.
+ 
+      CLEAR ls_user_files.
+ 
+      LOOP AT ls_files-local ASSIGNING <ls_local>.
+        READ TABLE lt_changed WITH KEY
+          path = <ls_local>-file-path
+          filename = <ls_local>-file-filename
+          changed_by = lv_changed_by
+          TRANSPORTING NO FIELDS.
+        IF sy-subrc = 0.
+          mi_log->add_info( |stage: {
+            ls_comment-committer-name } {
+            <ls_local>-file-path } {
+            <ls_local>-file-filename }| ).
+ 
+          lo_stage->add( iv_path     = <ls_local>-file-path
+                         iv_filename = <ls_local>-file-filename
+                         iv_data     = <ls_local>-file-data ).
+ 
+          APPEND <ls_local> TO ls_user_files-local.
+ 
+          LOOP AT ls_files-remote ASSIGNING <ls_remote>
+              USING KEY file
+              WHERE filename = <ls_local>-file-filename
+              AND path <> <ls_local>-file-path
+              AND filename <> ''package.devc.xml''.
+            mi_log->add_info( |rm: { <ls_remote>-path } { <ls_remote>-filename }| ).
+ 
+* rm old file when object has moved
+            lo_stage->rm(
+              iv_path     = <ls_remote>-path
+              iv_filename = <ls_remote>-filename ).
+            EXIT. " assumption: only one file
+          ENDLOOP.
+        ENDIF.
+      ENDLOOP.
+ 
+      ls_comment-comment = build_comment( ls_user_files ).
+ 
+      io_repo->push( is_comment = ls_comment
+                     io_stage   = lo_stage ).
+    ENDLOOP.
+ 
+    IF lines( ls_files-remote ) > 0.
+      push_deletions( io_repo  = io_repo
+                      is_files = ls_files ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push_deletions.
+ 
+    DATA: lo_stage   TYPE REF TO zcl_abapgit_stage,
+          ls_comment TYPE zif_abapgit_git_definitions=>ty_comment.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF is_files-remote.
+ 
+    ASSERT lines( is_files-remote ) > 0.
+ 
+    CREATE OBJECT lo_stage.
+ 
+    ls_comment-comment = ''BG: Deletion''.
+ 
+    LOOP AT is_files-remote ASSIGNING <ls_remote>.
+ 
+      mi_log->add_info( |removed: { <ls_remote>-path } { <ls_remote>-filename }| ).
+ 
+      lo_stage->rm( iv_path     = <ls_remote>-path
+                    iv_filename = <ls_remote>-filename ).
+ 
+      CONCATENATE ls_comment-comment cl_abap_char_utilities=>newline <ls_remote>-filename
+        INTO ls_comment-comment.
+ 
+    ENDLOOP.
+ 
+    ls_comment-committer-name  = ''Deletion''.
+    ls_comment-committer-email = ''deletion@localhost''.
+ 
+    io_repo->push( is_comment = ls_comment
+                   io_stage   = lo_stage ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_description.
+ 
+    rv_description = ''Automatic push, auto author''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_settings.
+ 
+    RETURN.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~run.
+ 
+    DATA: ls_files TYPE zif_abapgit_definitions=>ty_stage_files.
+ 
+    mi_log = ii_log.
+    ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
+ 
+    IF lines( ls_files-local ) = 0 AND lines( ls_files-remote ) = 0.
+      ii_log->add_info( ''Nothing to stage'' ).
+      RETURN.
+    ENDIF.
+ 
+    push_auto( io_repo ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_BACKGROUND_PUSH_FI          ', 'CLASS zcl_abapgit_background_push_fi DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_background .
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_settings,
+        name  TYPE string VALUE ''NAME'',
+        email TYPE string VALUE ''EMAIL'',
+      END OF c_settings .
+    DATA mi_log TYPE REF TO zif_abapgit_log .
+ 
+    METHODS build_comment
+      IMPORTING
+        !is_files         TYPE zif_abapgit_definitions=>ty_stage_files
+      RETURNING
+        VALUE(rv_comment) TYPE string .
+    METHODS push_fixed
+      IMPORTING
+        !io_repo  TYPE REF TO zcl_abapgit_repo_online
+        !iv_name  TYPE string
+        !iv_email TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_background_push_fi IMPLEMENTATION.
+ 
+ 
+  METHOD build_comment.
+ 
+    DATA: lt_objects TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          lv_str     TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_local> LIKE LINE OF is_files-local.
+ 
+ 
+    LOOP AT is_files-local ASSIGNING <ls_local>.
+      lv_str = |{ <ls_local>-item-obj_type } { <ls_local>-item-obj_name }|.
+      APPEND lv_str TO lt_objects.
+    ENDLOOP.
+ 
+    SORT lt_objects AS TEXT.
+    DELETE ADJACENT DUPLICATES FROM lt_objects.
+ 
+    IF lines( lt_objects ) = 1.
+      rv_comment = |BG: { lv_str }|.
+    ELSE.
+      rv_comment = ''BG: Multiple objects''.
+      LOOP AT lt_objects INTO lv_str.
+        CONCATENATE rv_comment cl_abap_char_utilities=>newline lv_str INTO rv_comment.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push_fixed.
+ 
+    DATA: ls_comment TYPE zif_abapgit_git_definitions=>ty_comment,
+          ls_files   TYPE zif_abapgit_definitions=>ty_stage_files,
+          lo_stage   TYPE REF TO zcl_abapgit_stage.
+ 
+    FIELD-SYMBOLS: <ls_local>  LIKE LINE OF ls_files-local,
+                   <ls_remote> LIKE LINE OF ls_files-remote.
+ 
+ 
+    ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
+    ASSERT lines( ls_files-local ) > 0
+        OR lines( ls_files-remote ) > 0.
+ 
+    CREATE OBJECT lo_stage.
+ 
+    LOOP AT ls_files-local ASSIGNING <ls_local>.
+      mi_log->add_info( |stage: { <ls_local>-file-path } { <ls_local>-file-filename }| ).
+      lo_stage->add( iv_path     = <ls_local>-file-path
+                     iv_filename = <ls_local>-file-filename
+                     iv_data     = <ls_local>-file-data ).
+    ENDLOOP.
+ 
+    LOOP AT ls_files-remote ASSIGNING <ls_remote>.
+ 
+      mi_log->add_info( |removed: { <ls_remote>-path } { <ls_remote>-filename }| ).
+ 
+      lo_stage->rm( iv_path     = <ls_remote>-path
+                    iv_filename = <ls_remote>-filename ).
+ 
+    ENDLOOP.
+ 
+    ls_comment-committer-name  = iv_name.
+    ls_comment-committer-email = iv_email.
+    ls_comment-comment         = build_comment( ls_files ).
+ 
+    io_repo->push( is_comment = ls_comment
+                   io_stage   = lo_stage ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_description.
+ 
+    rv_description = ''Automatic push, fixed author''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_settings.
+ 
+    DATA: ls_setting LIKE LINE OF ct_settings.
+ 
+ 
+    READ TABLE ct_settings WITH KEY key = c_settings-name INTO ls_setting.
+    IF sy-subrc <> 0.
+      ls_setting-key = c_settings-name.
+      ls_setting-value = ''foobar''.
+      APPEND ls_setting TO ct_settings.
+    ENDIF.
+ 
+    READ TABLE ct_settings WITH KEY key = c_settings-email INTO ls_setting.
+    IF sy-subrc <> 0.
+      ls_setting-key = c_settings-email.
+      ls_setting-value = ''foobar@localhost''.
+      APPEND ls_setting TO ct_settings.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~run.
+ 
+    DATA: ls_files   TYPE zif_abapgit_definitions=>ty_stage_files,
+          ls_setting LIKE LINE OF it_settings,
+          lv_name    TYPE string,
+          lv_email   TYPE string.
+ 
+    mi_log = ii_log.
+    ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
+ 
+    IF lines( ls_files-local ) = 0 AND lines( ls_files-remote ) = 0.
+      ii_log->add_info( ''Nothing to stage'' ).
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE it_settings WITH KEY key = c_settings-name INTO ls_setting. "#EC CI_SUBRC
+    lv_name = ls_setting-value.
+ 
+    READ TABLE it_settings WITH KEY key = c_settings-email INTO ls_setting. "#EC CI_SUBRC
+    lv_email = ls_setting-value.
+ 
+    push_fixed(
+      io_repo  = io_repo
+      iv_name  = lv_name
+      iv_email = lv_email ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_BACKGROUND                  ', 'INTERFACE zif_abapgit_background
+  PUBLIC .
+ 
+ 
+  TYPES:
+    BEGIN OF ty_settings,
+      key   TYPE string,
+      value TYPE string,
+    END OF ty_settings .
+  TYPES:
+    ty_settings_tt TYPE STANDARD TABLE OF ty_settings WITH DEFAULT KEY .
+ 
+  CLASS-METHODS get_description
+    RETURNING
+      VALUE(rv_description) TYPE string .
+  CLASS-METHODS get_settings
+    CHANGING
+      VALUE(ct_settings) TYPE ty_settings_tt .
+  METHODS run
+    IMPORTING
+      !io_repo     TYPE REF TO zcl_abapgit_repo_online
+      !ii_log      TYPE REF TO zif_abapgit_log
+      !it_settings TYPE ty_settings_tt OPTIONAL
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_CTS_API                     ', '"! Change transport system API
+CLASS zcl_abapgit_cts_api DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_cts_api.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA: mv_confirm_transp_msgs_called TYPE abap_bool.
+ 
+    "! Returns the transport request / task the object is currently locked in
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter iv_object_name | Object name
+    "! @parameter rv_transport | Transport request / task
+    "! @raising zcx_abapgit_exception | Object is not locked in a transport
+    METHODS get_current_transport_for_obj
+      IMPORTING
+        !iv_program_id      TYPE pgmid DEFAULT ''R3TR''
+        !iv_object_type     TYPE trobjtype
+        !iv_object_name     TYPE sobj_name
+      RETURNING
+        VALUE(rv_transport) TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    "! Returns the transport request / task that includes the object (even if not locked)
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter iv_object_name | Object name
+    "! @parameter rv_transport | Transport request / task
+    "! @raising zcx_abapgit_exception | Object is not locked in a transport
+    METHODS get_current_transport_from_db
+      IMPORTING
+        !iv_program_id      TYPE pgmid DEFAULT ''R3TR''
+        !iv_object_type     TYPE trobjtype
+        !iv_object_name     TYPE sobj_name
+      RETURNING
+        VALUE(rv_transport) TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    "! Check if the object is currently locked in a transport
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter iv_object_name | Object name
+    "! @parameter rv_locked | Object is locked
+    "! @raising zcx_abapgit_exception | Object type is not lockable
+    METHODS is_object_locked_in_transport
+      IMPORTING
+        !iv_program_id   TYPE pgmid DEFAULT ''R3TR''
+        !iv_object_type  TYPE trobjtype
+        !iv_object_name  TYPE sobj_name
+      RETURNING
+        VALUE(rv_locked) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    "! Check if the object type is lockable
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter rv_lockable | Lockable
+    METHODS is_object_type_lockable
+      IMPORTING
+        !iv_program_id     TYPE pgmid DEFAULT ''R3TR''
+        !iv_object_type    TYPE trobjtype
+      RETURNING
+        VALUE(rv_lockable) TYPE abap_bool .
+    "! Check if the object type can be transported
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter rv_transportable | Transportable
+    METHODS is_object_type_transportable
+      IMPORTING
+        !iv_program_id          TYPE pgmid DEFAULT ''R3TR''
+        !iv_object_type         TYPE trobjtype
+      RETURNING
+        VALUE(rv_transportable) TYPE abap_bool .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_cts_api IMPLEMENTATION.
+ 
+ 
+  METHOD get_current_transport_for_obj.
+    DATA: lv_object_lockable   TYPE abap_bool,
+          lv_locked            TYPE abap_bool,
+          lv_transport_request TYPE trkorr,
+          lv_task              TYPE trkorr,
+          lv_tr_object_name    TYPE trobj_name.
+ 
+    lv_tr_object_name = iv_object_name.
+ 
+    CALL FUNCTION ''TR_CHECK_OBJECT_LOCK''
+      EXPORTING
+        wi_pgmid             = iv_program_id
+        wi_object            = iv_object_type
+        wi_objname           = lv_tr_object_name
+      IMPORTING
+        we_lockable_object   = lv_object_lockable
+        we_locked            = lv_locked
+        we_lock_order        = lv_transport_request
+        we_lock_task         = lv_task
+      EXCEPTIONS
+        empty_key            = 1
+        no_systemname        = 2
+        no_systemtype        = 3
+        unallowed_lock_order = 4
+        OTHERS               = 5.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    IF lv_locked = abap_false.
+      zcx_abapgit_exception=>raise( |Object { iv_program_id }-{ iv_object_type }-{ iv_object_name } is not locked| ).
+    ENDIF.
+ 
+    IF lv_object_lockable = abap_false.
+      zcx_abapgit_exception=>raise( |Object type { iv_program_id }-{ iv_object_type } not lockable| ).
+    ENDIF.
+ 
+    rv_transport = lv_transport_request.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_current_transport_from_db.
+ 
+    " This method is used for objects that are included in transports but not locked
+    " for example, namespaces (NSPC)
+    SELECT SINGLE a~trkorr FROM e070 AS a JOIN e071 AS b ON a~trkorr = b~trkorr
+      INTO rv_transport
+      WHERE ( a~trstatus = ''D'' OR a~trstatus = ''L'' )
+        AND a~trfunction <> ''G''
+        AND b~pgmid = iv_program_id AND b~object = iv_object_type AND b~obj_name = iv_object_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_object_locked_in_transport.
+    DATA: ls_object_key        TYPE e071,
+          lv_type_check_result TYPE c LENGTH 1,
+          ls_lock_key          TYPE tlock_int,
+          lv_lock_flag         TYPE c LENGTH 1.
+ 
+    ls_object_key-pgmid = iv_program_id.
+    ls_object_key-object = iv_object_type.
+    ls_object_key-obj_name = iv_object_name.
+ 
+    CALL FUNCTION ''TR_CHECK_TYPE''
+      EXPORTING
+        wi_e071     = ls_object_key
+      IMPORTING
+        pe_result   = lv_type_check_result
+        we_lock_key = ls_lock_key.
+ 
+    IF lv_type_check_result <> ''L''.
+      zcx_abapgit_exception=>raise( |Object type { iv_program_id }-{ iv_object_type } not lockable| ).
+    ENDIF.
+ 
+    CALL FUNCTION ''TRINT_CHECK_LOCKS''
+      EXPORTING
+        wi_lock_key = ls_lock_key
+      IMPORTING
+        we_lockflag = lv_lock_flag
+      EXCEPTIONS
+        empty_key   = 1
+        OTHERS      = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    rv_locked = boolc( lv_lock_flag <> space ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_object_type_lockable.
+    DATA: ls_object_key        TYPE e071,
+          lv_type_check_result TYPE c LENGTH 1.
+ 
+    ls_object_key-pgmid = iv_program_id.
+    ls_object_key-object = iv_object_type.
+    ls_object_key-obj_name = ''_''. " Dummy value #2071
+ 
+    CALL FUNCTION ''TR_CHECK_TYPE''
+      EXPORTING
+        wi_e071   = ls_object_key
+      IMPORTING
+        pe_result = lv_type_check_result.
+ 
+    rv_lockable = boolc( lv_type_check_result = ''L'' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_object_type_transportable.
+    DATA: ls_object_key        TYPE e071,
+          lv_type_check_result TYPE c LENGTH 1.
+ 
+    ls_object_key-pgmid = iv_program_id.
+    ls_object_key-object = iv_object_type.
+    ls_object_key-obj_name = ''_''. " Dummy value #2071
+ 
+    CALL FUNCTION ''TR_CHECK_TYPE''
+      EXPORTING
+        wi_e071   = ls_object_key
+      IMPORTING
+        pe_result = lv_type_check_result.
+ 
+    rv_transportable = boolc( lv_type_check_result CA ''RTL'' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~create_transport_entries.
+ 
+    DATA lt_tables      TYPE tredt_objects.
+    DATA lt_table_keys  TYPE STANDARD TABLE OF e071k.
+    DATA lv_with_dialog TYPE abap_bool.
+ 
+    cl_table_utilities_brf=>create_transport_entries(
+      EXPORTING
+        it_table_ins = it_table_ins
+        it_table_upd = it_table_upd
+        it_table_del = it_table_del
+        iv_tabname   = iv_tabname
+      CHANGING
+        ct_e071      = lt_tables
+        ct_e071k     = lt_table_keys ).
+ 
+    " cl_table_utilities_brf=>write_transport_entries does not allow passing a request
+ 
+    CALL FUNCTION ''TR_OBJECTS_CHECK''
+      TABLES
+        wt_ko200                = lt_tables
+      EXCEPTIONS
+        cancel_edit_other_error = 1
+        show_only_other_error   = 2
+        OTHERS                  = 3.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    IF iv_transport IS INITIAL.
+      lv_with_dialog = abap_true.
+    ENDIF.
+ 
+    CALL FUNCTION ''TRINT_OBJECTS_CHECK_AND_INSERT''
+      EXPORTING
+        iv_order       = iv_transport
+        iv_with_dialog = lv_with_dialog
+      CHANGING
+        ct_ko200       = lt_tables
+        ct_e071k       = lt_table_keys
+      EXCEPTIONS
+        OTHERS         = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~get_r3tr_obj_for_limu_obj.
+ 
+    CLEAR ev_object.
+    CLEAR ev_obj_name.
+ 
+    CALL FUNCTION ''GET_R3TR_OBJECT_FROM_LIMU_OBJ''
+      EXPORTING
+        p_limu_objtype = iv_object
+        p_limu_objname = iv_obj_name
+      IMPORTING
+        p_r3tr_objtype = ev_object
+        p_r3tr_objname = ev_obj_name
+      EXCEPTIONS
+        no_mapping     = 1
+        OTHERS         = 2.
+    IF sy-subrc <> 0 OR ev_obj_name IS INITIAL.
+      zcx_abapgit_exception=>raise( |No R3TR Object found for { iv_object } { iv_obj_name }| ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~get_transports_for_list.
+ 
+    DATA lv_request TYPE trkorr.
+    DATA lt_tlock TYPE SORTED TABLE OF tlock WITH NON-UNIQUE KEY object hikey.
+    DATA ls_object_key TYPE e071.
+    DATA lv_type_check_result TYPE c LENGTH 1.
+    DATA ls_lock_key TYPE tlock_int.
+    DATA ls_transport LIKE LINE OF rt_transports.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF it_items.
+    FIELD-SYMBOLS <ls_tlock> LIKE LINE OF lt_tlock.
+ 
+* Workarounds to improve performance, note that IT_ITEMS might
+* contain 1000s of rows, see standard logic in function module
+* TR_CHECK_OBJECT_LOCK
+ 
+* avoid database lookups in TLOCK for each item,
+    SELECT * FROM tlock INTO TABLE lt_tlock.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT it_items ASSIGNING <ls_item>.
+      CLEAR lv_request.
+ 
+      ls_object_key-pgmid = ''R3TR''.
+      ls_object_key-object = <ls_item>-obj_type.
+      ls_object_key-obj_name = <ls_item>-obj_name.
+ 
+      CALL FUNCTION ''TR_CHECK_TYPE''
+        EXPORTING
+          wi_e071     = ls_object_key
+        IMPORTING
+          we_lock_key = ls_lock_key
+          pe_result   = lv_type_check_result.
+ 
+      IF lv_type_check_result = ''L''.
+        LOOP AT lt_tlock ASSIGNING <ls_tlock>
+            WHERE object =  ls_lock_key-obj
+            AND   hikey  >= ls_lock_key-low
+            AND   lokey  <= ls_lock_key-hi.               "#EC PORTABLE
+          lv_request = <ls_tlock>-trkorr.
+          EXIT.
+        ENDLOOP.
+      ELSEIF is_object_type_transportable( <ls_item>-obj_type ) = abap_true.
+        lv_request = get_current_transport_from_db(
+          iv_object_type = <ls_item>-obj_type
+          iv_object_name = <ls_item>-obj_name ).
+      ENDIF.
+ 
+      IF lv_request IS NOT INITIAL.
+        ls_transport-obj_type = <ls_item>-obj_type.
+        ls_transport-obj_name = <ls_item>-obj_name.
+        ls_transport-trkorr = lv_request.
+        INSERT ls_transport INTO TABLE rt_transports.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~get_transport_for_object.
+ 
+    IF is_item-obj_type IS NOT INITIAL AND is_item-obj_name IS NOT INITIAL.
+ 
+      IF is_object_type_lockable( is_item-obj_type ) = abap_true AND
+         is_object_locked_in_transport(
+           iv_object_type = is_item-obj_type
+           iv_object_name = is_item-obj_name ) = abap_true.
+ 
+        rv_transport = get_current_transport_for_obj(
+          iv_object_type = is_item-obj_type
+          iv_object_name = is_item-obj_name ).
+ 
+      ELSEIF is_object_type_transportable( is_item-obj_type ) = abap_true.
+ 
+        rv_transport = get_current_transport_from_db(
+          iv_object_type = is_item-obj_type
+          iv_object_name = is_item-obj_name ).
+ 
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~insert_transport_object.
+ 
+    CALL FUNCTION ''RS_CORR_INSERT''
+      EXPORTING
+        object              = iv_obj_name
+        object_class        = iv_object
+        devclass            = iv_package
+        master_language     = iv_language
+        mode                = iv_mode
+        global_lock         = abap_true
+        suppress_dialog     = abap_true
+      EXCEPTIONS
+        cancelled           = 1
+        permission_failure  = 2
+        unknown_objectclass = 3
+        OTHERS              = 4.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~is_chrec_possible_for_package.
+    IF iv_package IS NOT INITIAL.
+      rv_possible = zcl_abapgit_factory=>get_sap_package( iv_package )->are_changes_recorded_in_tr_req( ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~read_description.
+ 
+    SELECT SINGLE as4text FROM e07t
+      INTO rv_description
+      WHERE trkorr = iv_trkorr
+      AND langu = sy-langu ##SUBRC_OK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~read_user.
+ 
+    SELECT SINGLE as4user FROM e070 INTO rv_uname
+      WHERE trkorr = iv_trkorr ##SUBRC_OK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~confirm_transport_messages.
+ 
+    TYPES: BEGIN OF ty_s_message,
+             id TYPE symsgid,
+             ty TYPE symsgty,
+             no TYPE symsgno,
+             v1 TYPE symsgv,
+             v2 TYPE symsgv,
+             v3 TYPE symsgv,
+             v4 TYPE symsgv,
+           END OF ty_s_message.
+ 
+    DATA ls_message TYPE ty_s_message.
+ 
+    FIELD-SYMBOLS: <lt_confirmed_messages> TYPE STANDARD TABLE.
+ 
+    IF mv_confirm_transp_msgs_called = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " remember the call to avoid duplicates in GT_CONFIRMED_MESSAGES
+    mv_confirm_transp_msgs_called = abap_true.
+ 
+ 
+    " Auto-confirm certain messages (requires SAP Note 1609940)
+    PERFORM dummy IN PROGRAM saplstrd IF FOUND.  "load function group STRD once into memory
+ 
+    ASSIGN (''(SAPLSTRD)GT_CONFIRMED_MESSAGES'') TO <lt_confirmed_messages>.
+ 
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    " Object can only be created in package of namespace
+    ls_message-id = ''TR''.
+    ls_message-no = ''007''.
+    INSERT ls_message INTO TABLE <lt_confirmed_messages>.
+ 
+    " Original system set to "SAP"
+    ls_message-id = ''TR''.
+    ls_message-no = ''013''.
+    INSERT ls_message INTO TABLE <lt_confirmed_messages>.
+ 
+    " Make repairs in foreign namespaces only if they are urgent
+    ls_message-id = ''TR''.
+    ls_message-no = ''852''.
+    INSERT ls_message INTO TABLE <lt_confirmed_messages>.
+ 
+    " Make repairs in foreign namespaces only if they are urgent
+    ls_message-id = ''TK''.
+    ls_message-no = ''016''.
+    INSERT ls_message INTO TABLE <lt_confirmed_messages>.
+ 
+    rv_messages_confirmed = abap_true.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DEFAULT_TRANSPORT           ', 'CLASS zcl_abapgit_default_transport DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      get_instance
+        RETURNING
+          VALUE(ro_instance) TYPE REF TO zcl_abapgit_default_transport
+        RAISING
+          zcx_abapgit_exception.
+ 
+    METHODS:
+      constructor
+        RAISING
+          zcx_abapgit_exception,
+ 
+      set
+        IMPORTING
+          iv_transport TYPE trkorr
+        RAISING
+          zcx_abapgit_exception,
+ 
+      reset
+        RAISING
+          zcx_abapgit_exception,
+      get
+        RETURNING
+          VALUE(rs_default_task) TYPE e070use
+        RAISING
+          zcx_abapgit_exception .
+ 
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_instance TYPE REF TO zcl_abapgit_default_transport .
+    DATA mv_is_set_by_abapgit TYPE abap_bool .
+    DATA ms_save TYPE e070use .
+ 
+    METHODS store
+      RAISING
+        zcx_abapgit_exception .
+    METHODS restore
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_internal
+      IMPORTING
+        !iv_transport TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    METHODS clear
+      IMPORTING
+        !is_default_task TYPE e070use
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_default_transport IMPLEMENTATION.
+ 
+ 
+  METHOD clear.
+ 
+    CALL FUNCTION ''TR_TASK_RESET''
+      EXPORTING
+        iv_username      = is_default_task-username
+        iv_order         = is_default_task-ordernum
+        iv_task          = is_default_task-tasknum
+        iv_dialog        = abap_false
+      EXCEPTIONS
+        invalid_username = 1
+        invalid_order    = 2
+        invalid_task     = 3
+        OTHERS           = 4.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    store( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get.
+ 
+    DATA: lt_e070use TYPE STANDARD TABLE OF e070use.
+ 
+    CALL FUNCTION ''TR_TASK_GET''
+      TABLES
+        tt_e070use       = lt_e070use
+      EXCEPTIONS
+        invalid_username = 1
+        invalid_category = 2
+        invalid_client   = 3
+        OTHERS           = 4.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    READ TABLE lt_e070use INTO rs_default_task
+                          INDEX 1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    IF go_instance IS NOT BOUND.
+      CREATE OBJECT go_instance.
+    ENDIF.
+ 
+    ro_instance = go_instance.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reset.
+ 
+    DATA: ls_default_task TYPE e070use.
+ 
+    IF mv_is_set_by_abapgit = abap_false.
+      " if the default transport request task isn''t set
+      " by us there is nothing to do.
+      RETURN.
+    ENDIF.
+ 
+    CLEAR mv_is_set_by_abapgit.
+ 
+    ls_default_task = get( ).
+ 
+    IF ls_default_task IS NOT INITIAL.
+ 
+      clear( ls_default_task ).
+ 
+    ENDIF.
+ 
+    restore( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD restore.
+ 
+    IF ms_save IS INITIAL.
+      " There wasn''t a default transport request before
+      " so we needn''t restore anything.
+      RETURN.
+    ENDIF.
+ 
+    CALL FUNCTION ''TR_TASK_SET''
+      EXPORTING
+        iv_order          = ms_save-ordernum
+        iv_task           = ms_save-tasknum
+      EXCEPTIONS
+        invalid_username  = 1
+        invalid_category  = 2
+        invalid_client    = 3
+        invalid_validdays = 4
+        invalid_order     = 5
+        invalid_task      = 6
+        OTHERS            = 7.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set.
+ 
+    " checks whether object changes of the package are rerorded in transport
+    " requests. If true then we set the default task, so that no annoying
+    " transport request popups are shown while deserializing.
+ 
+    IF mv_is_set_by_abapgit = abap_true.
+      " the default transport request task is already set by us
+      " -> no reason to do it again.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_transport IS INITIAL.
+      zcx_abapgit_exception=>raise( |No transport request was supplied| ).
+    ENDIF.
+ 
+    set_internal( iv_transport ).
+ 
+    mv_is_set_by_abapgit = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_internal.
+ 
+    CALL FUNCTION ''TR_TASK_SET''
+      EXPORTING
+        iv_order          = iv_transport
+        iv_validdays      = 1
+      EXCEPTIONS
+        invalid_username  = 1
+        invalid_category  = 2
+        invalid_client    = 3
+        invalid_validdays = 4
+        invalid_order     = 5
+        invalid_task      = 6
+        OTHERS            = 7.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD store.
+ 
+    ms_save = get( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_TRANSPORT                   ', 'CLASS zcl_abapgit_transport DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+* todo, add interfaces for this class, consider merging zcl_abapgit_transport_mass into this class?
+    CLASS-METHODS zip
+      IMPORTING
+        !iv_show_log_popup TYPE abap_bool DEFAULT abap_true
+        !iv_logic          TYPE string OPTIONAL
+        !is_trkorr         TYPE trwbo_request_header OPTIONAL
+      RETURNING
+        VALUE(rv_xstr)     TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS to_tadir
+      IMPORTING
+        !it_transport_headers TYPE trwbo_request_headers
+        !iv_deleted_objects   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_tadir)       TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS add_all_objects_to_trans_req
+      IMPORTING
+        iv_key TYPE zif_abapgit_persistence=>ty_value
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS read
+      IMPORTING
+        !is_trkorr        TYPE trwbo_request_header OPTIONAL
+      RETURNING
+        VALUE(rs_request) TYPE trwbo_request
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS validate_transport_request
+      IMPORTING
+        iv_transport_request TYPE trkorr
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS read_requests
+      IMPORTING
+        !it_trkorr         TYPE trwbo_request_headers
+      RETURNING
+        VALUE(rt_requests) TYPE trwbo_requests
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS find_top_package
+      IMPORTING
+        !it_tadir         TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RETURNING
+        VALUE(rv_package) TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS resolve
+      IMPORTING
+        !it_requests        TYPE trwbo_requests
+        !iv_deleted_objects TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_tadir)     TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+    CLASS-METHODS collect_all_objects
+      IMPORTING
+        iv_key            TYPE zif_abapgit_persistence=>ty_value
+      RETURNING
+        VALUE(rt_objects) TYPE tr_objects
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS show_log
+      IMPORTING
+        it_log   TYPE sprot_u_tab
+        iv_title TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_transport IMPLEMENTATION.
+ 
+ 
+  METHOD add_all_objects_to_trans_req.
+ 
+    DATA:
+      ls_request      TYPE trwbo_request_header,
+      lt_e071         TYPE tr_objects,
+      lv_text         TYPE string,
+      lv_answer       TYPE c LENGTH 1,
+      lv_lock_objects TYPE trparflag,
+      lt_log          TYPE sprot_u_tab.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+                    iv_titlebar              = \`Lock objects?\`
+                    iv_text_question         = \`Shall all objects be locked in the transport request?\`
+                    iv_display_cancel_button = abap_true ).
+ 
+    CASE lv_answer.
+      WHEN ''1''.
+        lv_lock_objects = abap_true.
+      WHEN ''2''.
+        lv_lock_objects = abap_false.
+      WHEN OTHERS.
+        RETURN.
+    ENDCASE.
+ 
+    lt_e071 = collect_all_objects( iv_key ).
+ 
+    " We used TR_REQUEST_CHOICE before, but it issues its error log with
+    " write lists which are not compatible with abapGit.
+    " There we user TRINT_REQUEST_CHOICE which returns the error log
+    " and display the log ourselve.
+    CALL FUNCTION ''TRINT_REQUEST_CHOICE''
+      EXPORTING
+        iv_request_types     = ''FTCOK''
+        iv_lock_objects      = lv_lock_objects
+        iv_with_error_log    = abap_false
+      IMPORTING
+        es_request           = ls_request
+        et_log               = lt_log
+      TABLES
+        it_e071              = lt_e071
+      EXCEPTIONS
+        invalid_request      = 1
+        invalid_request_type = 2
+        user_not_owner       = 3
+        no_objects_appended  = 4
+        enqueue_error        = 5
+        cancelled_by_user    = 6
+        recursive_call       = 7
+        OTHERS               = 8.
+    IF sy-subrc = 0.
+      lv_text = |Objects successfully added to { ls_request-trkorr }|.
+      MESSAGE lv_text TYPE ''S''.
+      RETURN.
+    ENDIF.
+ 
+    IF lines( lt_log ) > 0.
+      show_log(
+          it_log   = lt_log
+          iv_title = \`Error log\` ).
+    ELSE.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD collect_all_objects.
+ 
+    DATA:
+      lt_objects     TYPE scts_tadir,
+      lt_objects_all LIKE lt_objects,
+      ls_e071        LIKE LINE OF rt_objects,
+      lo_repo        TYPE REF TO zcl_abapgit_repo,
+      lv_package     TYPE zif_abapgit_persistence=>ty_repo-package,
+      lt_packages    TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    FIELD-SYMBOLS:
+      <lv_package> TYPE devclass,
+      <ls_object>  TYPE tadir.
+ 
+    lo_repo    ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    lv_package  = lo_repo->get_package( ).
+    lt_packages = zcl_abapgit_factory=>get_sap_package( lv_package )->list_subpackages( ).
+    INSERT lv_package INTO TABLE lt_packages.
+ 
+    LOOP AT lt_packages ASSIGNING <lv_package>.
+ 
+      CLEAR: lt_objects.
+ 
+      CALL FUNCTION ''TRINT_SELECT_OBJECTS''
+        EXPORTING
+          iv_devclass       = <lv_package>
+          iv_via_selscreen  = abap_false
+        IMPORTING
+          et_objects_tadir  = lt_objects
+        EXCEPTIONS
+          cancelled_by_user = 1
+          invalid_input     = 2
+          OTHERS            = 3.
+ 
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      INSERT LINES OF lt_objects INTO TABLE lt_objects_all.
+ 
+    ENDLOOP.
+ 
+    IF lines( lt_objects_all ) = 0.
+      zcx_abapgit_exception=>raise( |No objects found| ).
+    ENDIF.
+ 
+    LOOP AT lt_objects_all ASSIGNING <ls_object>.
+ 
+      CLEAR: ls_e071.
+ 
+      MOVE-CORRESPONDING <ls_object> TO ls_e071.
+      INSERT ls_e071 INTO TABLE rt_objects.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_top_package.
+* assumption: all objects in transport share a common super package
+ 
+    DATA: lt_obj   TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+          lt_super TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+          lv_super LIKE LINE OF lt_super,
+          lv_index TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
+ 
+ 
+    READ TABLE it_tadir INDEX 1 ASSIGNING <ls_tadir>.
+    ASSERT sy-subrc = 0.
+    lt_super = zcl_abapgit_factory=>get_sap_package( <ls_tadir>-devclass )->list_superpackages( ).
+ 
+    LOOP AT it_tadir ASSIGNING <ls_tadir>.
+      lt_obj = zcl_abapgit_factory=>get_sap_package( <ls_tadir>-devclass )->list_superpackages( ).
+ 
+* filter out possibilities from lt_super
+      LOOP AT lt_super INTO lv_super.
+        lv_index = sy-tabix.
+        READ TABLE lt_obj FROM lv_super TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          DELETE lt_super INDEX lv_index.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    READ TABLE lt_super INDEX lines( lt_super ) INTO rv_package.
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    rs_request-h-trkorr = is_trkorr-trkorr.
+ 
+    CALL FUNCTION ''TRINT_READ_REQUEST''
+      EXPORTING
+        iv_read_e070       = abap_true
+        iv_read_e07t       = abap_true
+        iv_read_e070c      = abap_true
+        iv_read_e070m      = abap_true
+        iv_read_objs_keys  = abap_true
+        iv_read_objs       = abap_true
+        iv_read_attributes = abap_true
+      CHANGING
+        cs_request         = rs_request
+      EXCEPTIONS
+        error_occured      = 1
+        OTHERS             = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_requests.
+    DATA lt_requests LIKE rt_requests.
+    FIELD-SYMBOLS <ls_trkorr> LIKE LINE OF it_trkorr.
+ 
+    LOOP AT it_trkorr ASSIGNING <ls_trkorr>.
+      CALL FUNCTION ''TR_READ_REQUEST_WITH_TASKS''
+        EXPORTING
+          iv_trkorr     = <ls_trkorr>-trkorr
+        IMPORTING
+          et_requests   = lt_requests
+        EXCEPTIONS
+          invalid_input = 1
+          OTHERS        = 2.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      APPEND LINES OF lt_requests TO rt_requests.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve.
+    DATA: lv_object    TYPE tadir-object,
+          lv_obj_name  TYPE tadir-obj_name,
+          ls_tadir     TYPE zif_abapgit_definitions=>ty_tadir,
+          lv_result    TYPE trpari-s_checked,
+          ls_tadir_sap TYPE tadir.
+ 
+    FIELD-SYMBOLS: <ls_request> LIKE LINE OF it_requests,
+                   <ls_object>  LIKE LINE OF <ls_request>-objects.
+ 
+ 
+    LOOP AT it_requests ASSIGNING <ls_request>.
+      LOOP AT <ls_request>-objects ASSIGNING <ls_object>.
+        " VARX, see https://github.com/abapGit/abapGit/issues/3107
+        IF <ls_object>-pgmid = ''LIMU'' AND <ls_object>-object <> ''VARX''.
+          CALL FUNCTION ''TR_CHECK_TYPE''
+            EXPORTING
+              wi_e071   = <ls_object>
+            IMPORTING
+              we_tadir  = ls_tadir_sap
+              pe_result = lv_result.
+          IF lv_result NA ''TL'' OR ls_tadir_sap IS INITIAL.
+            zcx_abapgit_exception=>raise( ''error from TR_CHECK_TYPE'' ).
+          ENDIF.
+          lv_object   = ls_tadir_sap-object.
+          lv_obj_name = ls_tadir_sap-obj_name.
+        ELSE.
+          lv_object   = <ls_object>-object.
+          lv_obj_name = <ls_object>-obj_name.
+        ENDIF.
+ 
+        ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
+          iv_object   = lv_object
+          iv_obj_name = lv_obj_name ).
+ 
+        IF ls_tadir-delflag IS INITIAL OR iv_deleted_objects = abap_true.
+          APPEND ls_tadir TO rt_tadir.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    SORT rt_tadir BY object ASCENDING obj_name ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM rt_tadir COMPARING object obj_name.
+    DELETE rt_tadir WHERE table_line IS INITIAL.
+  ENDMETHOD.
+ 
+ 
+  METHOD show_log.
+ 
+    DATA: li_log     TYPE REF TO zif_abapgit_log,
+          lv_message TYPE string.
+    FIELD-SYMBOLS: <ls_log> TYPE sprot_u.
+ 
+    CREATE OBJECT li_log TYPE zcl_abapgit_log
+      EXPORTING
+        iv_title = iv_title.
+ 
+    LOOP AT it_log ASSIGNING <ls_log>.
+ 
+      MESSAGE ID <ls_log>-ag TYPE <ls_log>-severity NUMBER <ls_log>-msgnr
+       WITH <ls_log>-var1 <ls_log>-var2 <ls_log>-var3 <ls_log>-var4
+       INTO lv_message.
+ 
+      li_log->add(
+          iv_msg  = lv_message
+          iv_type = <ls_log>-severity ).
+ 
+    ENDLOOP.
+ 
+    zcl_abapgit_log_viewer=>show_log( li_log ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_tadir.
+    DATA: lt_requests TYPE trwbo_requests.
+ 
+ 
+    IF lines( it_transport_headers ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    lt_requests = read_requests( it_transport_headers ).
+    rt_tadir = resolve(
+      it_requests        = lt_requests
+      iv_deleted_objects = iv_deleted_objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_transport_request.
+ 
+    CONSTANTS:
+      BEGIN OF c_tr_status,
+        modifiable                   TYPE trstatus VALUE ''D'',
+        modifiable_protected         TYPE trstatus VALUE ''L'',
+        release_started              TYPE trstatus VALUE ''O'',
+        released                     TYPE trstatus VALUE ''R'',
+        released_with_import_protect TYPE trstatus VALUE ''N'', " Released (with Import Protection for Repaired Objects)
+      END OF c_tr_status.
+ 
+    DATA:
+      ls_trkorr  TYPE trwbo_request_header,
+      ls_request TYPE trwbo_request.
+ 
+    ls_trkorr-trkorr = iv_transport_request.
+ 
+    ls_request = read( ls_trkorr ).
+ 
+    IF  ls_request-h-trstatus <> c_tr_status-modifiable
+    AND ls_request-h-trstatus <> c_tr_status-modifiable_protected.
+      " Task/request &1 has already been released
+      MESSAGE e064(tk) WITH iv_transport_request INTO zcx_abapgit_exception=>null.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zip.
+ 
+    DATA: lt_requests       TYPE trwbo_requests,
+          lt_tadir          TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          lv_package        TYPE devclass,
+          lo_dot_abapgit    TYPE REF TO zcl_abapgit_dot_abapgit,
+          ls_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings,
+          lt_trkorr         TYPE trwbo_request_headers.
+ 
+ 
+    IF is_trkorr IS SUPPLIED.
+      APPEND is_trkorr TO lt_trkorr.
+    ELSE.
+      lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
+    ENDIF.
+ 
+    IF lines( lt_trkorr ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    lt_requests = read_requests( lt_trkorr ).
+    lt_tadir = resolve( lt_requests ).
+    IF lines( lt_tadir ) = 0.
+      zcx_abapgit_exception=>raise( ''empty transport'' ).
+    ENDIF.
+ 
+    lv_package = find_top_package( lt_tadir ).
+    IF lv_package IS INITIAL.
+      zcx_abapgit_exception=>raise( ''error finding super package'' ).
+    ENDIF.
+ 
+    lo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ).
+    IF iv_logic IS SUPPLIED AND iv_logic IS NOT INITIAL.
+      lo_dot_abapgit->set_folder_logic( iv_logic ).
+    ELSE.
+      lo_dot_abapgit->set_folder_logic( zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ) ).
+    ENDIF.
+ 
+    rv_xstr = zcl_abapgit_zip=>export(
+      iv_package        = lv_package
+      io_dot_abapgit    = lo_dot_abapgit
+      is_local_settings = ls_local_settings
+      it_filter         = lt_tadir
+      iv_show_log       = iv_show_log_popup ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_TRANSPORT_2_BRANCH          ', 'CLASS zcl_abapgit_transport_2_branch DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS create
+      IMPORTING
+        !io_repository          TYPE REF TO zcl_abapgit_repo_online
+        !is_transport_to_branch TYPE zif_abapgit_definitions=>ty_transport_to_branch
+        !it_transport_objects   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    METHODS generate_commit_message
+      IMPORTING
+        !is_transport_to_branch TYPE zif_abapgit_definitions=>ty_transport_to_branch
+      RETURNING
+        VALUE(rs_comment)       TYPE zif_abapgit_git_definitions=>ty_comment .
+    METHODS stage_transport_objects
+      IMPORTING
+        !it_transport_objects TYPE zif_abapgit_definitions=>ty_tadir_tt
+        !io_stage             TYPE REF TO zcl_abapgit_stage
+        !is_stage_objects     TYPE zif_abapgit_definitions=>ty_stage_files
+        !it_object_statuses   TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_TRANSPORT_2_BRANCH IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    DATA:
+      lv_branch_name     TYPE string,
+      ls_comment         TYPE zif_abapgit_git_definitions=>ty_comment,
+      lo_stage           TYPE REF TO zcl_abapgit_stage,
+      ls_stage_objects   TYPE zif_abapgit_definitions=>ty_stage_files,
+      lt_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt.
+ 
+    lv_branch_name = zcl_abapgit_git_branch_list=>complete_heads_branch_name(
+        zcl_abapgit_git_branch_list=>normalize_branch_name( is_transport_to_branch-branch_name ) ).
+ 
+    io_repository->create_branch( lv_branch_name ).
+ 
+    CREATE OBJECT lo_stage.
+ 
+    ls_stage_objects = zcl_abapgit_factory=>get_stage_logic( )->get( io_repository ).
+ 
+    lt_object_statuses = io_repository->status( ).
+ 
+    stage_transport_objects(
+       it_transport_objects = it_transport_objects
+       io_stage             = lo_stage
+       is_stage_objects     = ls_stage_objects
+       it_object_statuses   = lt_object_statuses ).
+ 
+    ls_comment = generate_commit_message( is_transport_to_branch ).
+ 
+    io_repository->push( is_comment = ls_comment
+                         io_stage   = lo_stage ).
+  ENDMETHOD.
+ 
+ 
+  METHOD generate_commit_message.
+    rs_comment-committer-name  = sy-uname.
+    rs_comment-committer-email = |{ rs_comment-committer-name }@localhost|.
+    rs_comment-comment         = is_transport_to_branch-commit_text.
+  ENDMETHOD.
+ 
+ 
+  METHOD stage_transport_objects.
+    DATA lo_transport_objects TYPE REF TO zcl_abapgit_transport_objects.
+    CREATE OBJECT lo_transport_objects
+      EXPORTING
+        it_transport_objects = it_transport_objects.
+ 
+    lo_transport_objects->to_stage(
+      io_stage           = io_stage
+      is_stage_objects   = is_stage_objects
+      it_object_statuses = it_object_statuses ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_TRANSPORT_MASS              ', 'CLASS zcl_abapgit_transport_mass DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_transport
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS run .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_transport_mass IMPLEMENTATION.
+ 
+ 
+  METHOD run.
+ 
+    DATA:
+      lt_trkorr           TYPE trwbo_request_headers,
+      lo_transport_zipper TYPE REF TO lcl_transport_zipper,
+      lx_except           TYPE REF TO cx_root,
+      lv_folder           TYPE string,
+      lv_text             TYPE string.
+ 
+    TRY.
+ 
+        lt_trkorr = lcl_gui=>select_tr_requests( ).
+ 
+        IF lt_trkorr[] IS NOT INITIAL.
+ 
+          lv_folder = lcl_gui=>f4_folder( ).
+ 
+          IF lv_folder IS INITIAL.
+* Empty folder
+            zcx_abapgit_exception=>raise( ''Empty destination folder'' ).
+          ENDIF.
+ 
+* Instantiate transport zipper object that will also create the timestamped output folder
+          CREATE OBJECT lo_transport_zipper TYPE lcl_transport_zipper
+            EXPORTING
+              iv_folder = lv_folder.
+ 
+* Generate the local zip files from the given list of transport requests
+          lo_transport_zipper->generate_files(
+            it_trkorr = lt_trkorr
+            ig_logic  = zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ) ).
+ 
+* Open output folder if user asked it
+          lcl_gui=>open_folder_frontend( lo_transport_zipper->get_folder( ) ).
+ 
+        ELSE.
+* No data found for the provided selection criterias
+          zcx_abapgit_exception=>raise( ''No transport requests selected'' ).
+        ENDIF.
+ 
+      CATCH zcx_abapgit_exception INTO lx_except.
+ 
+        lv_text = lx_except->get_text( ).
+        MESSAGE lv_text TYPE ''S'' DISPLAY LIKE ''E''.
+ 
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_TRANSPORT_OBJECTS           ', 'CLASS zcl_abapgit_transport_objects DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_transport_objects TYPE zif_abapgit_definitions=>ty_tadir_tt .
+    METHODS to_stage
+      IMPORTING
+        !io_stage           TYPE REF TO zcl_abapgit_stage
+        !is_stage_objects   TYPE zif_abapgit_definitions=>ty_stage_files
+        !it_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_transport_objects TYPE zif_abapgit_definitions=>ty_tadir_tt .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_transport_objects IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mt_transport_objects = it_transport_objects.
+  ENDMETHOD.
+ 
+ 
+  METHOD to_stage.
+    DATA: ls_transport_object LIKE LINE OF mt_transport_objects,
+          ls_local_file       TYPE zif_abapgit_definitions=>ty_file_item,
+          ls_object_status    TYPE zif_abapgit_definitions=>ty_result.
+ 
+    LOOP AT mt_transport_objects INTO ls_transport_object.
+      LOOP AT it_object_statuses INTO ls_object_status
+          WHERE obj_name = ls_transport_object-obj_name
+          AND obj_type = ls_transport_object-object
+          AND NOT lstate IS INITIAL.
+ 
+        CASE ls_object_status-lstate.
+          WHEN zif_abapgit_definitions=>c_state-added OR zif_abapgit_definitions=>c_state-modified.
+            IF ls_transport_object-delflag = abap_true.
+              zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name
+                } should be added/modified, but has deletion flag in transport| ).
+            ENDIF.
+ 
+            READ TABLE is_stage_objects-local
+                  INTO ls_local_file
+              WITH KEY item-obj_name = ls_transport_object-obj_name
+                       item-obj_type = ls_transport_object-object
+                       file-filename = ls_object_status-filename.
+            IF sy-subrc <> 0.
+              zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name
+                } not found in the local repository files| ).
+            ELSE.
+              io_stage->add(
+                iv_path     = ls_local_file-file-path
+                iv_filename = ls_local_file-file-filename
+                iv_data     = ls_local_file-file-data ).
+            ENDIF.
+          WHEN zif_abapgit_definitions=>c_state-deleted.
+* SUSC, see https://github.com/abapGit/abapGit/issues/2772
+            IF ls_transport_object-delflag = abap_false
+                AND ls_transport_object-object <> ''SUSC''
+                AND ls_transport_object-object <> ''IWOM''
+                AND ls_transport_object-object <> ''IWMO''
+                AND ls_transport_object-object <> ''IWSG''
+                AND ls_transport_object-object <> ''IWSV''.
+              zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name
+                } should be removed, but has NO deletion flag in transport| ).
+            ENDIF.
+            io_stage->rm(
+              iv_path     = ls_object_status-path
+              iv_filename = ls_object_status-filename ).
+          WHEN OTHERS.
+            ASSERT 0 = 1. "Unexpected state
+        ENDCASE.
+      ENDLOOP.
+      IF sy-subrc <> 0.
+        " Since not all objects in a transport might be in the local repo
+        " i.e generated SADL objects, we don''t add these objects to
+        " the stage.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_CTS_API                     ', 'INTERFACE zif_abapgit_cts_api
+  PUBLIC .
+ 
+  CONSTANTS:
+    BEGIN OF c_transport_type,
+      wb_request   TYPE c LENGTH 1 VALUE ''K'', "workbench request
+      wb_repair    TYPE c LENGTH 1 VALUE ''R'', "workbench repair
+      wb_task      TYPE c LENGTH 1 VALUE ''S'', "workbench task
+      cust_request TYPE c LENGTH 1 VALUE ''W'', "customizing request
+      cust_task    TYPE c LENGTH 1 VALUE ''Q'', "customizing task
+    END OF c_transport_type.
+ 
+  CONSTANTS:
+    BEGIN OF c_transport_category,
+      workbench   TYPE c LENGTH 4 VALUE ''SYST'',
+      customizing TYPE c LENGTH 4 VALUE ''CUST'',
+    END OF c_transport_category.
+ 
+  CONSTANTS:
+    BEGIN OF c_transport_mode,
+      insert TYPE c LENGTH 1 VALUE ''I'',
+      delete TYPE c LENGTH 1 VALUE ''D'',
+    END OF c_transport_mode.
+ 
+  TYPES: BEGIN OF ty_transport,
+           obj_type TYPE tadir-object,
+           obj_name TYPE tadir-obj_name,
+           trkorr   TYPE trkorr,
+         END OF ty_transport.
+ 
+  TYPES ty_transport_list TYPE SORTED TABLE OF ty_transport WITH NON-UNIQUE KEY obj_type obj_name.
+ 
+  "! Returns the transport request / task the object is currently in
+  "! @parameter is_item | Object
+  "! @parameter rv_transport | Transport request / task
+  "! @raising zcx_abapgit_exception | Object is not in a transport
+  METHODS get_transport_for_object
+    IMPORTING
+      !is_item            TYPE zif_abapgit_definitions=>ty_item
+    RETURNING
+      VALUE(rv_transport) TYPE trkorr
+    RAISING
+      zcx_abapgit_exception .
+  "! Check if change recording is possible for the given package
+  "! @parameter iv_package | Package
+  "! @parameter rv_possible | Change recording is possible
+  "! @raising zcx_abapgit_exception | Package could not be loaded
+  METHODS is_chrec_possible_for_package
+    IMPORTING
+      !iv_package        TYPE devclass
+    RETURNING
+      VALUE(rv_possible) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_transports_for_list
+    IMPORTING
+      !it_items            TYPE zif_abapgit_definitions=>ty_items_tt
+    RETURNING
+      VALUE(rt_transports) TYPE ty_transport_list
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_r3tr_obj_for_limu_obj
+    IMPORTING
+      iv_object   TYPE tadir-object
+      iv_obj_name TYPE trobj_name
+    EXPORTING
+      ev_object   TYPE tadir-object
+      ev_obj_name TYPE trobj_name
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS read_description
+    IMPORTING
+      iv_trkorr             TYPE trkorr
+    RETURNING
+      VALUE(rv_description) TYPE string.
+ 
+  METHODS read_user
+    IMPORTING
+      iv_trkorr       TYPE trkorr
+    RETURNING
+      VALUE(rv_uname) TYPE uname.
+ 
+  METHODS create_transport_entries
+    IMPORTING
+      iv_transport TYPE trkorr
+      it_table_ins TYPE ANY TABLE
+      it_table_upd TYPE ANY TABLE
+      it_table_del TYPE ANY TABLE
+      iv_tabname   TYPE tabname
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS insert_transport_object
+    IMPORTING
+      iv_pgmid    TYPE tadir-pgmid DEFAULT ''R3TR''
+      iv_object   TYPE tadir-object
+      iv_obj_name TYPE csequence
+      iv_package  TYPE devclass
+      iv_language TYPE sy-langu DEFAULT sy-langu
+      iv_mode     TYPE c DEFAULT ''I''
+    EXPORTING
+      ev_object   TYPE tadir-object
+      ev_obj_name TYPE trobj_name
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS confirm_transport_messages
+    RETURNING
+      VALUE(rv_messages_confirmed) TYPE abap_bool .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DATA_CONFIG                 ', 'CLASS zcl_abapgit_data_config DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_data_config .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_config TYPE zif_abapgit_data_config=>ty_config_tt .
+ 
+    METHODS dump
+      IMPORTING
+        !is_config     TYPE zif_abapgit_data_config=>ty_config
+      RETURNING
+        VALUE(rv_json) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_config IMPLEMENTATION.
+ 
+ 
+  METHOD dump.
+ 
+    DATA lo_ajson TYPE REF TO zcl_abapgit_ajson.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    TRY.
+        lo_ajson = zcl_abapgit_ajson=>create_empty( ).
+        lo_ajson->zif_abapgit_ajson~set(
+          iv_path = ''/''
+          iv_val  = is_config ).
+        rv_json = zcl_abapgit_convert=>string_to_xstring_utf8( lo_ajson->stringify( 2 ) ).
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~add_config.
+ 
+    DATA lv_where TYPE string.
+ 
+    FIELD-SYMBOLS <ls_config> LIKE LINE OF mt_config.
+ 
+    ASSERT is_config-type IS NOT INITIAL.
+    ASSERT is_config-name IS NOT INITIAL.
+    ASSERT is_config-name = to_upper( is_config-name ).
+ 
+    INSERT is_config INTO TABLE mt_config.
+    IF sy-subrc <> 0.
+* append to existing
+      READ TABLE mt_config ASSIGNING <ls_config> WITH KEY type = is_config-type name = is_config-name.
+      ASSERT sy-subrc = 0.
+      LOOP AT is_config-where INTO lv_where.
+        READ TABLE <ls_config>-where TRANSPORTING NO FIELDS WITH KEY table_line = lv_where.
+        IF sy-subrc <> 0.
+          INSERT lv_where INTO TABLE <ls_config>-where.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~from_json.
+ 
+    DATA ls_file LIKE LINE OF it_files.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+    DATA lo_ajson TYPE REF TO zcl_abapgit_ajson.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    CLEAR mt_config.
+    LOOP AT it_files INTO ls_file
+        USING KEY file_path
+        WHERE path = zif_abapgit_data_config=>c_default_path
+        AND filename CP |*.{ zif_abapgit_data_config=>c_config }.{ zif_abapgit_data_config=>c_default_format }|.
+      TRY.
+          lo_ajson = zcl_abapgit_ajson=>parse( zcl_abapgit_convert=>xstring_to_string_utf8( ls_file-data ) ).
+          lo_ajson->zif_abapgit_ajson~to_abap( IMPORTING ev_container = ls_config ).
+        CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+          zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
+      ENDTRY.
+ 
+      zif_abapgit_data_config~add_config( ls_config ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~get_configs.
+    rt_configs = mt_config.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~remove_config.
+ 
+    ASSERT is_config-type IS NOT INITIAL.
+    ASSERT is_config-name IS NOT INITIAL.
+    ASSERT is_config-name = to_upper( is_config-name ).
+ 
+    DELETE mt_config WHERE name = is_config-name AND type = is_config-type.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Not found'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~to_json.
+ 
+    DATA ls_config LIKE LINE OF mt_config.
+    DATA ls_file LIKE LINE OF rt_files.
+ 
+    ls_file-path = zif_abapgit_data_config=>c_default_path.
+ 
+    LOOP AT mt_config INTO ls_config.
+      ls_file-data = dump( ls_config ).
+      ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ).
+      ls_config-type = zif_abapgit_data_config=>c_config.
+      ls_file-filename = zcl_abapgit_data_utils=>build_data_filename( ls_config ).
+      APPEND ls_file TO rt_files.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~update_config.
+ 
+    zif_abapgit_data_config~remove_config( is_config ).
+    zif_abapgit_data_config~add_config( is_config ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DATA_DESERIALIZER           ', 'CLASS zcl_abapgit_data_deserializer DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_data_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_data_deserializer .
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS convert_json_to_itab
+      IMPORTING
+        !is_file TYPE zif_abapgit_git_definitions=>ty_file
+        !ir_data TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception .
+    METHODS preview_database_changes
+      IMPORTING
+        !iv_name         TYPE tadir-obj_name
+        !it_where        TYPE string_table
+        !ir_lc_data      TYPE REF TO data
+        !ir_db_data      TYPE REF TO data
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_data_deserializer=>ty_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS write_database_table
+      IMPORTING
+        !iv_name TYPE tadir-obj_name
+        !ir_del  TYPE REF TO data
+        !ir_ins  TYPE REF TO data
+        !ir_upd  TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_database_table
+      IMPORTING
+        !iv_name       TYPE tadir-obj_name
+        !it_where      TYPE string_table
+      RETURNING
+        VALUE(rr_data) TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception .
+    METHODS determine_transport_request
+      IMPORTING
+        io_repo                     TYPE REF TO zcl_abapgit_repo
+        iv_transport_type           TYPE zif_abapgit_definitions=>ty_transport_type
+      RETURNING
+        VALUE(rv_transport_request) TYPE trkorr.
+    METHODS is_table_allowed_to_edit
+      IMPORTING
+        !is_result                TYPE zif_abapgit_data_deserializer=>ty_result
+      RETURNING
+        VALUE(rv_allowed_to_edit) TYPE abap_bool .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_deserializer IMPLEMENTATION.
+ 
+ 
+  METHOD convert_json_to_itab.
+ 
+    DATA lo_ajson TYPE REF TO zcl_abapgit_ajson.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
+ 
+    ASSIGN ir_data->* TO <lg_tab>.
+ 
+    TRY.
+        lo_ajson = zcl_abapgit_ajson=>parse( zcl_abapgit_convert=>xstring_to_string_utf8( is_file-data ) ).
+        lo_ajson->zif_abapgit_ajson~to_abap( IMPORTING ev_container = <lg_tab> ).
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_transport_request.
+ 
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+    " Use transport from repo settings if maintained, or determine via user exit.
+    " If transport keeps empty here, it''ll requested later via popup.
+    rv_transport_request = io_repo->get_local_settings( )-customizing_request.
+ 
+    li_exit->determine_transport_request(
+      EXPORTING
+        io_repo              = io_repo
+        iv_transport_type    = iv_transport_type
+      CHANGING
+        cv_transport_request = rv_transport_request ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_table_allowed_to_edit.
+ 
+    " Is the object supported (by default or based on exit)?
+    rv_allowed_to_edit = zcl_abapgit_data_factory=>get_supporter( )->is_object_supported(
+      iv_type = is_result-type
+      iv_name = is_result-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD preview_database_changes.
+ 
+* method currently distinguishes between records be deleted and inserted (comparison of complete record)
+ 
+    FIELD-SYMBOLS <lg_old> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_new> TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_del> TYPE any.
+    FIELD-SYMBOLS <ls_ins> TYPE any.
+    FIELD-SYMBOLS <ls_upd> TYPE any.
+    FIELD-SYMBOLS <lg_del> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_ins> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_upd> TYPE ANY TABLE.
+ 
+    ASSIGN ir_db_data->* TO <lg_old>.
+    ASSIGN ir_lc_data->* TO <lg_new>.
+ 
+    rs_result-type = zif_abapgit_data_config=>c_data_type-tabu.
+    rs_result-name = iv_name.
+    rs_result-deletes = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    rs_result-inserts = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    rs_result-updates = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    ASSIGN rs_result-deletes->* TO <lg_del>.
+    ASSIGN rs_result-inserts->* TO <lg_ins>.
+    ASSIGN rs_result-updates->* TO <lg_upd>.
+ 
+    <lg_del> = <lg_old>.
+    <lg_ins> = <lg_new>.
+ 
+    " Remove identical records
+    LOOP AT <lg_del> ASSIGNING <ls_del>.
+      READ TABLE <lg_ins> ASSIGNING <ls_ins> FROM <ls_del>.
+      IF sy-subrc = 0.
+        IF <ls_del> <> <ls_ins>.
+          " Identical key but not identical component values
+          INSERT <ls_ins> INTO TABLE <lg_upd>.
+        ENDIF.
+        DELETE TABLE <lg_del> FROM <ls_del>.
+        DELETE TABLE <lg_ins> FROM <ls_ins>.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_database_table.
+ 
+    DATA lv_where LIKE LINE OF it_where.
+ 
+    FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
+ 
+    rr_data = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    ASSIGN rr_data->* TO <lg_tab>.
+ 
+    LOOP AT it_where INTO lv_where.
+      SELECT * FROM (iv_name) APPENDING TABLE <lg_tab> WHERE (lv_where).
+    ENDLOOP.
+    IF lines( it_where ) = 0.
+      SELECT * FROM (iv_name) INTO TABLE <lg_tab>.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD write_database_table.
+ 
+    FIELD-SYMBOLS <lg_del> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_ins> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_upd> TYPE ANY TABLE.
+ 
+    IF zcl_abapgit_data_utils=>does_table_exist( iv_name ) = abap_false.
+      zcx_abapgit_exception=>raise( |Table { iv_name } not found for data deserialization| ).
+    ENDIF.
+ 
+    ASSIGN ir_del->* TO <lg_del>.
+    ASSIGN ir_ins->* TO <lg_ins>.
+    ASSIGN ir_upd->* TO <lg_upd>.
+ 
+    IF lines( <lg_del> ) > 0.
+      DELETE (iv_name) FROM TABLE <lg_del>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Error deleting { lines( <lg_del> ) } records from table { iv_name }| ).
+      ENDIF.
+    ENDIF.
+ 
+    IF lines( <lg_ins> ) > 0.
+      INSERT (iv_name) FROM TABLE <lg_ins>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Error inserting { lines( <lg_ins> ) } records into table { iv_name }| ).
+      ENDIF.
+    ENDIF.
+ 
+    IF lines( <lg_upd> ) > 0.
+      UPDATE (iv_name) FROM TABLE <lg_upd>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Error updating { lines( <lg_upd> ) } records into table { iv_name }| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_deserializer~actualize.
+ 
+* this method updates the database
+ 
+    DATA ls_result  LIKE LINE OF it_result.
+    DATA li_cts_api TYPE REF TO zif_abapgit_cts_api.
+    DATA ls_file    LIKE LINE OF rt_accessed_files.
+ 
+    FIELD-SYMBOLS:
+      <lt_ins> TYPE ANY TABLE,
+      <lt_del> TYPE ANY TABLE,
+      <lt_upd> TYPE ANY TABLE.
+ 
+    LOOP AT it_result INTO ls_result.
+      ASSERT ls_result-type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+      ASSERT ls_result-name IS NOT INITIAL.
+ 
+      " Did the user flagged this object for update?
+      READ TABLE is_checks-overwrite TRANSPORTING NO FIELDS
+        WITH KEY object_type_and_name
+        COMPONENTS
+          obj_type = ls_result-type
+          obj_name = ls_result-name
+          decision = zif_abapgit_definitions=>c_yes.
+      IF sy-subrc <>  0.
+        CONTINUE.
+      ENDIF.
+ 
+      IF is_table_allowed_to_edit( ls_result ) = abap_false.
+        zcx_abapgit_exception=>raise( |Table { ls_result-name } not supported for updating data| ).
+      ENDIF.
+ 
+      write_database_table(
+        iv_name = ls_result-name
+        ir_del  = ls_result-deletes
+        ir_ins  = ls_result-inserts
+        ir_upd  = ls_result-updates ).
+ 
+      ASSIGN ls_result-inserts->* TO <lt_ins>.
+      ASSIGN ls_result-deletes->* TO <lt_del>.
+      ASSIGN ls_result-updates->* TO <lt_upd>.
+ 
+      IF zcl_abapgit_data_utils=>is_customizing_table( ls_result-name ) = abap_true.
+        IF li_cts_api IS INITIAL.
+          li_cts_api = zcl_abapgit_factory=>get_cts_api( ).
+        ENDIF.
+ 
+        li_cts_api->create_transport_entries(
+          iv_transport = is_checks-customizing-transport
+          it_table_ins = <lt_ins>
+          it_table_upd = <lt_upd>
+          it_table_del = <lt_del>
+          iv_tabname   = |{ ls_result-name }| ).
+      ENDIF.
+ 
+      INSERT ls_result-file INTO TABLE rt_accessed_files. " data file
+      INSERT ls_result-config INTO TABLE rt_accessed_files. " config file
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_deserializer~deserialize.
+ 
+* this method does not persist any changes to the database
+ 
+    DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+    DATA ls_config  LIKE LINE OF lt_configs.
+    DATA lr_lc_data TYPE REF TO data.
+    DATA lr_db_data TYPE REF TO data.
+    DATA ls_file    LIKE LINE OF it_files.
+    DATA ls_result  LIKE LINE OF rt_result.
+ 
+    lt_configs = ii_config->get_configs( ).
+ 
+    LOOP AT lt_configs INTO ls_config.
+      ASSERT ls_config-type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+      ASSERT ls_config-name IS NOT INITIAL.
+ 
+      lr_lc_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ).
+ 
+      READ TABLE it_files INTO ls_file
+        WITH KEY file_path
+        COMPONENTS path     = zif_abapgit_data_config=>c_default_path
+                   filename = zcl_abapgit_data_utils=>build_data_filename( ls_config ).
+      IF sy-subrc = 0.
+        convert_json_to_itab(
+          ir_data = lr_lc_data
+          is_file = ls_file ).
+ 
+        lr_db_data = read_database_table(
+          iv_name  = ls_config-name
+          it_where = ls_config-where ).
+ 
+        ls_result = preview_database_changes(
+          iv_name    = ls_config-name
+          it_where   = ls_config-where
+          ir_lc_data = lr_lc_data
+          ir_db_data = lr_db_data ).
+ 
+        MOVE-CORRESPONDING ls_file TO ls_result-file. " data file
+ 
+        READ TABLE it_files INTO ls_file
+          WITH KEY file_path
+          COMPONENTS path     = zif_abapgit_data_config=>c_default_path
+                     filename = zcl_abapgit_data_utils=>build_config_filename( ls_config ).
+        ASSERT sy-subrc = 0.
+ 
+        MOVE-CORRESPONDING ls_file TO ls_result-config. " config file
+ 
+        INSERT ls_result INTO TABLE rt_result.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_deserializer~deserialize_check.
+ 
+    DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+ 
+    lt_configs = ii_config->get_configs( ).
+ 
+    IF lt_configs IS NOT INITIAL.
+      rs_checks-required     = abap_true.
+      rs_checks-type-request = zif_abapgit_cts_api=>c_transport_type-cust_request.
+      rs_checks-type-task    = zif_abapgit_cts_api=>c_transport_type-cust_task.
+      rs_checks-transport    = determine_transport_request(
+                                 io_repo           = io_repo
+                                 iv_transport_type = rs_checks-type ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DATA_FACTORY                ', 'CLASS zcl_abapgit_data_factory DEFINITION
+  PUBLIC
+  CREATE PUBLIC
+  GLOBAL FRIENDS zcl_abapgit_data_injector .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_supporter
+      RETURNING
+        VALUE(ri_supporter) TYPE REF TO zif_abapgit_data_supporter .
+    CLASS-METHODS get_serializer
+      RETURNING
+        VALUE(ri_serializer) TYPE REF TO zif_abapgit_data_serializer .
+    CLASS-METHODS get_deserializer
+      RETURNING
+        VALUE(ri_deserializer) TYPE REF TO zif_abapgit_data_deserializer .
+    CLASS-METHODS get_config
+      RETURNING
+        VALUE(ri_config) TYPE REF TO zif_abapgit_data_config .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_supporter TYPE REF TO zif_abapgit_data_supporter .
+    CLASS-DATA gi_serializer TYPE REF TO zif_abapgit_data_serializer .
+    CLASS-DATA gi_deserializer TYPE REF TO zif_abapgit_data_deserializer .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_factory IMPLEMENTATION.
+ 
+ 
+  METHOD get_config.
+    CREATE OBJECT ri_config TYPE zcl_abapgit_data_config.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_deserializer.
+ 
+    IF gi_deserializer IS INITIAL.
+      CREATE OBJECT gi_deserializer TYPE zcl_abapgit_data_deserializer.
+    ENDIF.
+ 
+    ri_deserializer = gi_deserializer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_serializer.
+ 
+    IF gi_serializer IS INITIAL.
+      CREATE OBJECT gi_serializer TYPE zcl_abapgit_data_serializer.
+    ENDIF.
+ 
+    ri_serializer = gi_serializer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_supporter.
+ 
+    IF gi_supporter IS INITIAL.
+      CREATE OBJECT gi_supporter TYPE zcl_abapgit_data_supporter.
+    ENDIF.
+ 
+    ri_supporter = gi_supporter.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DATA_INJECTOR               ', 'CLASS zcl_abapgit_data_injector DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS set_supporter
+      IMPORTING
+        !ii_supporter TYPE REF TO zif_abapgit_data_supporter .
+    METHODS set_serializer
+      IMPORTING
+        !ii_serializer TYPE REF TO zif_abapgit_data_serializer .
+    METHODS set_deserializer
+      IMPORTING
+        !ii_deserializer TYPE REF TO zif_abapgit_data_deserializer .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_injector IMPLEMENTATION.
+ 
+ 
+  METHOD set_deserializer.
+    zcl_abapgit_data_factory=>gi_deserializer = ii_deserializer.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_serializer.
+    zcl_abapgit_data_factory=>gi_serializer = ii_serializer.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_supporter.
+    zcl_abapgit_data_factory=>gi_supporter = ii_supporter.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DATA_SERIALIZER             ', 'CLASS zcl_abapgit_data_serializer DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_data_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_data_serializer .
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_max_records TYPE i VALUE 20000 ##NO_TEXT.
+ 
+    METHODS convert_itab_to_json
+      IMPORTING
+        !ir_data         TYPE REF TO data
+        !iv_skip_initial TYPE abap_bool
+      RETURNING
+        VALUE(rv_data)   TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_database_table
+      IMPORTING
+        !iv_name       TYPE tadir-obj_name
+        !it_where      TYPE string_table
+      RETURNING
+        VALUE(rr_data) TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_serializer IMPLEMENTATION.
+ 
+ 
+  METHOD convert_itab_to_json.
+ 
+    DATA lo_ajson  TYPE REF TO zcl_abapgit_ajson.
+    DATA lv_string TYPE string.
+    DATA lx_ajson  TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
+ 
+    ASSIGN ir_data->* TO <lg_tab>.
+ 
+    TRY.
+        lo_ajson = zcl_abapgit_ajson=>create_empty( ).
+        lo_ajson->keep_item_order( ).
+        lo_ajson->set(
+          iv_path = ''/''
+          iv_val = <lg_tab> ).
+ 
+        IF iv_skip_initial = abap_true.
+          lo_ajson = zcl_abapgit_ajson=>create_from(
+            ii_source_json = lo_ajson
+            ii_filter = zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) ).
+        ENDIF.
+ 
+        lv_string = lo_ajson->stringify( 2 ).
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
+    ENDTRY.
+ 
+    rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_database_table.
+ 
+    DATA lv_records TYPE i.
+    DATA lv_where LIKE LINE OF it_where.
+    DATA lx_sql TYPE REF TO cx_sy_sql_error.
+ 
+    FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
+ 
+    rr_data = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    ASSIGN rr_data->* TO <lg_tab>.
+ 
+    TRY.
+        LOOP AT it_where INTO lv_where.
+          SELECT * FROM (iv_name) APPENDING TABLE <lg_tab> WHERE (lv_where).
+        ENDLOOP.
+        IF lines( it_where ) = 0.
+          SELECT * FROM (iv_name) INTO TABLE <lg_tab>.
+        ENDIF.
+      CATCH cx_sy_sql_error INTO lx_sql.
+        zcx_abapgit_exception=>raise(
+          iv_text     = lx_sql->get_text( )
+          ix_previous = lx_sql ).
+    ENDTRY.
+ 
+    lv_records = lines( <lg_tab> ).
+    IF lv_records > c_max_records.
+      zcx_abapgit_exception=>raise( |Too many records selected from table { iv_name
+        } (selected { lv_records }, max { c_max_records })| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_serializer~serialize.
+ 
+    DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+    DATA ls_config  LIKE LINE OF lt_configs.
+    DATA ls_file    LIKE LINE OF rt_files.
+    DATA lr_data    TYPE REF TO data.
+ 
+    ls_file-path = zif_abapgit_data_config=>c_default_path.
+    lt_configs = ii_config->get_configs( ).
+ 
+    LOOP AT lt_configs INTO ls_config.
+      ASSERT ls_config-type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+      ASSERT ls_config-name IS NOT INITIAL.
+ 
+      IF zcl_abapgit_data_utils=>does_table_exist( ls_config-name ) = abap_true.
+        lr_data = read_database_table(
+          iv_name  = ls_config-name
+          it_where = ls_config-where ).
+ 
+        ls_file-data = convert_itab_to_json(
+          ir_data         = lr_data
+          iv_skip_initial = ls_config-skip_initial ).
+      ELSE.
+        ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( ''[]'' ).
+      ENDIF.
+ 
+      ls_file-filename = zcl_abapgit_data_utils=>build_data_filename( ls_config ).
+      ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ).
+      APPEND ls_file TO rt_files.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DATA_SUPPORTER              ', 'CLASS zcl_abapgit_data_supporter DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_data_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_data_supporter.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_supported_objects TYPE zif_abapgit_data_supporter=>ty_objects.
+ 
+    METHODS get_supported_objects.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_supporter IMPLEMENTATION.
+ 
+ 
+  METHOD get_supported_objects.
+ 
+    DATA:
+      lt_tables  TYPE STANDARD TABLE OF tabname,
+      lv_tabname TYPE tabname,
+      ls_object  LIKE LINE OF mt_supported_objects,
+      li_exit    TYPE REF TO zif_abapgit_exit.
+ 
+    " For safety reasons, by default only customer-defined customizing tables are supported
+    SELECT dd02l~tabname
+      FROM dd09l JOIN dd02l
+        ON dd09l~tabname = dd02l~tabname
+        AND dd09l~as4local = dd02l~as4local
+        AND dd09l~as4vers = dd02l~as4vers
+      INTO TABLE lt_tables
+      WHERE dd02l~tabclass = ''TRANSP''
+        AND dd09l~tabart = ''APPL2''
+        AND dd09l~as4user <> ''SAP''
+        AND dd09l~as4local = ''A'' "Only active tables
+        AND dd02l~contflag = ''C''. "Only customizing tables
+ 
+    LOOP AT lt_tables INTO lv_tabname.
+      ls_object-type = zif_abapgit_data_config=>c_data_type-tabu.
+      ls_object-name = lv_tabname.
+      INSERT ls_object INTO TABLE mt_supported_objects.
+    ENDLOOP.
+ 
+    " The list of supported objects can be enhanced using an exit
+    " Name patterns are allowed. For example, TABU T009*
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->change_supported_data_objects( CHANGING ct_objects =  mt_supported_objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_supporter~is_object_supported.
+ 
+    FIELD-SYMBOLS <ls_object> LIKE LINE OF mt_supported_objects.
+ 
+    IF mt_supported_objects IS INITIAL.
+      get_supported_objects( ).
+    ENDIF.
+ 
+    READ TABLE mt_supported_objects TRANSPORTING NO FIELDS
+      WITH TABLE KEY type = iv_type name = iv_name.
+    IF sy-subrc = 0.
+      rv_supported = abap_true.
+    ELSE.
+      " Check if object name matches pattern
+      LOOP AT mt_supported_objects ASSIGNING <ls_object> WHERE type = iv_type.
+        IF iv_name CP <ls_object>-name.
+          rv_supported = abap_true.
+          RETURN.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DATA_UTILS                  ', 'CLASS zcl_abapgit_data_utils DEFINITION
+  PUBLIC
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS build_table_itab
+      IMPORTING
+        !iv_name       TYPE tadir-obj_name
+      RETURNING
+        VALUE(rr_data) TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS build_data_filename
+      IMPORTING
+        !is_config         TYPE zif_abapgit_data_config=>ty_config
+      RETURNING
+        VALUE(rv_filename) TYPE string.
+    CLASS-METHODS build_config_filename
+      IMPORTING
+        !is_config         TYPE zif_abapgit_data_config=>ty_config
+      RETURNING
+        VALUE(rv_filename) TYPE string.
+    CLASS-METHODS jump
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_exit) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS does_table_exist
+      IMPORTING
+        !iv_name         TYPE tadir-obj_name
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool.
+    CLASS-METHODS is_customizing_table
+      IMPORTING
+        !iv_name              TYPE tadir-obj_name
+      RETURNING
+        VALUE(rv_customizing) TYPE abap_bool.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES ty_names TYPE STANDARD TABLE OF abap_compname WITH DEFAULT KEY .
+    CLASS-METHODS list_key_fields
+      IMPORTING
+        !iv_name        TYPE tadir-obj_name
+      RETURNING
+        VALUE(rt_names) TYPE ty_names
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_utils IMPLEMENTATION.
+ 
+ 
+  METHOD build_config_filename.
+ 
+    rv_filename = to_lower( |{ is_config-name }.{ zif_abapgit_data_config=>c_config }|
+      && |.{ zif_abapgit_data_config=>c_default_format }| ).
+ 
+    REPLACE ALL OCCURRENCES OF ''/'' IN rv_filename WITH ''#''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_data_filename.
+ 
+    rv_filename = to_lower( |{ is_config-name }.{ is_config-type }|
+      && |.{ zif_abapgit_data_config=>c_default_format }| ).
+ 
+    REPLACE ALL OCCURRENCES OF ''/'' IN rv_filename WITH ''#''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_table_itab.
+ 
+    DATA lo_type   TYPE REF TO cl_abap_typedescr.
+    DATA lo_data   TYPE REF TO cl_abap_structdescr.
+    DATA lo_table  TYPE REF TO cl_abap_tabledescr.
+    DATA lt_keys   TYPE abap_table_keydescr_tab.
+    DATA lt_names  TYPE ty_names.
+ 
+    FIELD-SYMBOLS <lv_name>      LIKE LINE OF lt_names.
+    FIELD-SYMBOLS <ls_key>       LIKE LINE OF lt_keys.
+    FIELD-SYMBOLS <ls_component> LIKE LINE OF <ls_key>-components.
+ 
+    cl_abap_structdescr=>describe_by_name(
+      EXPORTING
+        p_name         = iv_name
+      RECEIVING
+        p_descr_ref    = lo_type
+      EXCEPTIONS
+        type_not_found = 1 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Table { iv_name } not found for data serialization| ).
+    ENDIF.
+ 
+    TRY.
+        lo_data ?= lo_type.
+ 
+        " Get primary key to ensure unique entries
+        IF lo_data->is_ddic_type( ) = abap_true.
+          lt_names = list_key_fields( iv_name ).
+ 
+          APPEND INITIAL LINE TO lt_keys ASSIGNING <ls_key>.
+          <ls_key>-access_kind = cl_abap_tabledescr=>tablekind_sorted.
+          <ls_key>-key_kind    = cl_abap_tabledescr=>keydefkind_user.
+          <ls_key>-is_primary  = abap_true.
+          <ls_key>-is_unique   = abap_true.
+ 
+          LOOP AT lt_names ASSIGNING <lv_name>.
+            APPEND INITIAL LINE TO <ls_key>-components ASSIGNING <ls_component>.
+            <ls_component>-name = <lv_name>.
+          ENDLOOP.
+        ENDIF.
+ 
+        IF lines( lt_names ) = 0.
+          lo_table = cl_abap_tabledescr=>get( lo_data ).
+        ELSE.
+          lo_table = cl_abap_tabledescr=>get_with_keys(
+            p_line_type = lo_data
+            p_keys      = lt_keys ).
+        ENDIF.
+ 
+        CREATE DATA rr_data TYPE HANDLE lo_table.
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( |Error creating internal table for data serialization| ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD does_table_exist.
+ 
+    " This is slow but ensures that the table actually exists and is not just buffered by RTTI
+    " If we just rely on RTTI, uninstalling and reinstalling a table in the same session will lead to dumps
+    TRY.
+        build_table_itab( iv_name ).
+        rv_exists = abap_true.
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_customizing_table.
+ 
+    DATA lv_contflag       TYPE c LENGTH 1.
+    DATA lo_table          TYPE REF TO object.
+    DATA lo_content        TYPE REF TO object.
+    DATA lo_delivery_class TYPE REF TO object.
+    FIELD-SYMBOLS <ls_any> TYPE any.
+ 
+    TRY.
+        CALL METHOD (''XCO_CP_ABAP_DICTIONARY'')=>database_table
+          EXPORTING
+            iv_name           = iv_name(16)
+          RECEIVING
+            ro_database_table = lo_table.
+        CALL METHOD lo_table->(''IF_XCO_DATABASE_TABLE~CONTENT'')
+          RECEIVING
+            ro_content = lo_content.
+        CALL METHOD lo_content->(''IF_XCO_DBT_CONTENT~GET_DELIVERY_CLASS'')
+          RECEIVING
+            ro_delivery_class = lo_delivery_class.
+        ASSIGN lo_delivery_class->(''VALUE'') TO <ls_any>.
+        lv_contflag = <ls_any>.
+      CATCH cx_sy_dyn_call_illegal_class.
+        SELECT SINGLE contflag FROM (''DD02L'') INTO lv_contflag WHERE tabname = iv_name.
+    ENDTRY.
+ 
+    IF lv_contflag = ''C''.
+      rv_customizing = abap_true.
+    ELSEIF lv_contflag IS NOT INITIAL.
+      rv_customizing = abap_false.
+    ELSE.
+      rv_customizing = abap_undefined. " table does not exist
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump.
+ 
+    " Run SE16 with authorization check
+    CALL FUNCTION ''RS_TABLE_LIST_CREATE''
+      EXPORTING
+        table_name         = is_item-obj_name
+      EXCEPTIONS
+        table_is_structure = 1
+        table_not_exists   = 2
+        db_not_exists      = 3
+        no_permission      = 4
+        no_change_allowed  = 5
+        table_is_gtt       = 6
+        OTHERS             = 7.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Table { is_item-obj_name } cannot be displayed| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD list_key_fields.
+    DATA lo_obj        TYPE REF TO object.
+    DATA lv_tabname    TYPE c LENGTH 16.
+    DATA lr_ddfields   TYPE REF TO data.
+    DATA lv_workaround TYPE c LENGTH 20.
+    DATA lr_struct     TYPE REF TO cl_abap_structdescr.
+    FIELD-SYMBOLS <lg_any> TYPE any.
+    FIELD-SYMBOLS <lv_field> TYPE simple.
+    FIELD-SYMBOLS <lt_ddfields> TYPE ANY TABLE.
+ 
+* convert to correct type,
+    lv_tabname = iv_name.
+ 
+    TRY.
+        CALL METHOD (''XCO_CP_ABAP_DICTIONARY'')=>database_table
+          EXPORTING
+            iv_name           = lv_tabname
+          RECEIVING
+            ro_database_table = lo_obj.
+        ASSIGN lo_obj->(''IF_XCO_DATABASE_TABLE~FIELDS->IF_XCO_DBT_FIELDS_FACTORY~KEY'') TO <lg_any>.
+        IF sy-subrc  <> 0.
+* fallback to RTTI, KEY field does not exist in S/4 2020
+          RAISE EXCEPTION TYPE cx_sy_dyn_call_illegal_class.
+        ENDIF.
+        lo_obj = <lg_any>.
+        CALL METHOD lo_obj->(''IF_XCO_DBT_FIELDS~GET_NAMES'')
+          RECEIVING
+            rt_names = rt_names.
+      CATCH cx_sy_dyn_call_illegal_class cx_no_check.
+        lv_workaround = ''DDFIELDS''.
+        CREATE DATA lr_ddfields TYPE (lv_workaround).
+        ASSIGN lr_ddfields->* TO <lt_ddfields>.
+        ASSERT sy-subrc = 0.
+        lr_struct ?= cl_abap_typedescr=>describe_by_name( lv_tabname ).
+        lr_struct->get_ddic_field_list(
+          RECEIVING
+            p_field_list = <lt_ddfields>
+          EXCEPTIONS
+            not_found    = 1
+            no_ddic_type = 2 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise( |Table { iv_name } not found| ).
+        ENDIF.
+        LOOP AT <lt_ddfields> ASSIGNING <lg_any>.
+          ASSIGN COMPONENT ''KEYFLAG'' OF STRUCTURE <lg_any> TO <lv_field>.
+          IF sy-subrc <> 0 OR <lv_field> <> abap_true.
+            CONTINUE.
+          ENDIF.
+          ASSIGN COMPONENT ''FIELDNAME'' OF STRUCTURE <lg_any> TO <lv_field>.
+          ASSERT sy-subrc = 0.
+          APPEND <lv_field> TO rt_names.
+        ENDLOOP.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_DATA_CONFIG                 ', 'INTERFACE zif_abapgit_data_config
+  PUBLIC .
+ 
+ 
+  TYPES:
+    ty_data_type TYPE c LENGTH 4 .
+  TYPES:
+    BEGIN OF ty_config,
+      type         TYPE ty_data_type,
+      name         TYPE tadir-obj_name,
+      skip_initial TYPE abap_bool,
+      where        TYPE string_table,
+    END OF ty_config .
+  TYPES:
+    ty_config_tt TYPE SORTED TABLE OF ty_config WITH UNIQUE KEY type name .
+ 
+  CONSTANTS c_default_path TYPE string VALUE ''/data/'' ##NO_TEXT.
+  CONSTANTS c_default_format TYPE string VALUE ''json'' ##NO_TEXT.
+  CONSTANTS c_config TYPE string VALUE ''conf'' ##NO_TEXT.
+  CONSTANTS:
+    BEGIN OF c_data_type,
+      tabu TYPE ty_data_type VALUE ''TABU'',
+      vdat TYPE ty_data_type VALUE ''VDAT'',
+      cdat TYPE ty_data_type VALUE ''CDAT'',
+      tdat TYPE ty_data_type VALUE ''TDAT'',
+    END OF c_data_type .
+ 
+  METHODS add_config
+    IMPORTING
+      !is_config TYPE ty_config
+    RAISING
+      zcx_abapgit_exception .
+  METHODS from_json
+    IMPORTING
+      !it_files TYPE zif_abapgit_git_definitions=>ty_files_tt
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_configs
+    RETURNING
+      VALUE(rt_configs) TYPE ty_config_tt .
+  METHODS remove_config
+    IMPORTING
+      !is_config TYPE ty_config
+    RAISING
+      zcx_abapgit_exception .
+  METHODS to_json
+    RETURNING
+      VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt
+    RAISING
+      zcx_abapgit_exception .
+  METHODS update_config
+    IMPORTING
+      !is_config TYPE ty_config
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_DATA_DESERIALIZER           ', 'INTERFACE zif_abapgit_data_deserializer
+  PUBLIC .
+ 
+ 
+  TYPES: BEGIN OF ty_result,
+           type    TYPE zif_abapgit_data_config=>ty_config-type,
+           name    TYPE zif_abapgit_data_config=>ty_config-name,
+           deletes TYPE REF TO data,
+           updates TYPE REF TO data,
+           inserts TYPE REF TO data,
+           file    TYPE zif_abapgit_git_definitions=>ty_file_signature,
+           config  TYPE zif_abapgit_git_definitions=>ty_file_signature,
+         END OF ty_result.
+  TYPES: ty_results TYPE STANDARD TABLE OF ty_result WITH KEY type name.
+ 
+  METHODS deserialize_check
+    IMPORTING
+      !io_repo         TYPE REF TO zcl_abapgit_repo
+      !ii_config       TYPE REF TO zif_abapgit_data_config
+    RETURNING
+      VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_deserialize_checks-customizing
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS deserialize
+    IMPORTING
+      !ii_config       TYPE REF TO zif_abapgit_data_config
+      !it_files        TYPE zif_abapgit_git_definitions=>ty_files_tt
+    RETURNING
+      VALUE(rt_result) TYPE ty_results
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS actualize
+    IMPORTING
+      !is_checks               TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      !it_result               TYPE ty_results
+    RETURNING
+      VALUE(rt_accessed_files) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_DATA_SERIALIZER             ', 'INTERFACE zif_abapgit_data_serializer
+  PUBLIC .
+ 
+ 
+  METHODS serialize
+    IMPORTING
+      !ii_config      TYPE REF TO zif_abapgit_data_config
+    RETURNING
+      VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_DATA_SUPPORTER              ', 'INTERFACE zif_abapgit_data_supporter
+  PUBLIC.
+ 
+  TYPES:
+    BEGIN OF ty_object,
+      type TYPE zif_abapgit_data_config=>ty_config-type,
+      name TYPE zif_abapgit_data_config=>ty_config-name,
+    END OF ty_object.
+  TYPES:
+    ty_objects TYPE SORTED TABLE OF ty_object WITH UNIQUE KEY type name.
+ 
+  METHODS is_object_supported
+    IMPORTING
+      !iv_type            TYPE ty_object-type
+      !iv_name            TYPE ty_object-name
+    RETURNING
+      VALUE(rv_supported) TYPE abap_bool.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_AUTH                        ', 'CLASS zcl_abapgit_auth DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS is_allowed
+      IMPORTING
+        !iv_authorization TYPE zif_abapgit_auth=>ty_authorization
+        !iv_param         TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_allowed) TYPE abap_bool .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_auth IMPLEMENTATION.
+ 
+ 
+  METHOD is_allowed.
+ 
+    DATA: li_auth TYPE REF TO zif_abapgit_auth.
+ 
+    TRY.
+        CREATE OBJECT li_auth TYPE (''ZCL_ABAPGIT_AUTH_EXIT'').
+        rv_allowed = li_auth->is_allowed( iv_authorization = iv_authorization
+                                          iv_param         = iv_param ).
+      CATCH cx_sy_create_object_error.
+        rv_allowed = abap_true.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_EXIT                        ', 'CLASS zcl_abapgit_exit DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_exit .
+ 
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ri_exit) TYPE REF TO zif_abapgit_exit .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_exit TYPE REF TO zif_abapgit_exit .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_exit IMPLEMENTATION.
+ 
+ 
+  METHOD get_instance.
+ 
+    DATA lv_class_name TYPE string.
+ 
+    lv_class_name = ''ZCL_ABAPGIT_USER_EXIT''.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      " Prevent accidental usage of exit handlers in the developer version
+      lv_class_name = |\\\\PROGRAM={ sy-repid }\\\\CLASS={ lv_class_name }|.
+    ENDIF.
+ 
+    IF gi_exit IS INITIAL.
+      TRY.
+          CREATE OBJECT gi_exit TYPE (lv_class_name).
+        CATCH cx_sy_create_object_error ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+    CREATE OBJECT ri_exit TYPE zcl_abapgit_exit.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~adjust_display_commit_url.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->adjust_display_commit_url(
+            EXPORTING
+              iv_repo_url    = iv_repo_url
+              iv_repo_name   = iv_repo_name
+              iv_repo_key    = iv_repo_key
+              iv_commit_hash = iv_commit_hash
+            CHANGING
+              cv_display_url = cv_display_url ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~adjust_display_filename.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rv_filename = gi_exit->adjust_display_filename( iv_filename ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+    IF rv_filename IS INITIAL.
+      rv_filename = iv_filename.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~allow_sap_objects.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rv_allowed = gi_exit->allow_sap_objects( ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_local_host.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_local_host( CHANGING ct_hosts = ct_hosts ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_proxy_authentication.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_proxy_authentication(
+            EXPORTING
+              iv_repo_url             = iv_repo_url
+            CHANGING
+              cv_proxy_authentication = cv_proxy_authentication ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_proxy_port.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_proxy_port(
+            EXPORTING
+              iv_repo_url   = iv_repo_url
+            CHANGING
+              cv_proxy_port = cv_proxy_port ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_proxy_url.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_proxy_url(
+            EXPORTING
+              iv_repo_url  = iv_repo_url
+            CHANGING
+              cv_proxy_url = cv_proxy_url ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_supported_data_objects.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_supported_data_objects( CHANGING ct_objects = ct_objects ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_supported_object_types.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_supported_object_types( CHANGING ct_types = ct_types ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_tadir.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_tadir(
+            EXPORTING
+              iv_package = iv_package
+              ii_log     = ii_log
+            CHANGING
+              ct_tadir   = ct_tadir ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~create_http_client.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          ri_client = gi_exit->create_http_client( iv_url ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~custom_serialize_abap_clif.
+ 
+    " This exit might be called twice per object
+    " 1st call: it_source = initial
+    "    Can be used for serializing complete source
+    "    If source is returned, there will be no second call
+    " 2nd call: it_source = code as serialized by abapGit
+    "    Can be used for post-processing of source
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rt_source = gi_exit->custom_serialize_abap_clif(
+            is_class_key = is_class_key
+            it_source    = it_source ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+    IF rt_source IS INITIAL.
+      rt_source = it_source.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~deserialize_postprocess.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->deserialize_postprocess( is_step = is_step
+                                            ii_log  = ii_log ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~determine_transport_request.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->determine_transport_request(
+            EXPORTING
+              io_repo              = io_repo
+              iv_transport_type    = iv_transport_type
+            CHANGING
+              cv_transport_request = cv_transport_request ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~get_ci_tests.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->get_ci_tests(
+            EXPORTING
+              iv_object   = iv_object
+            CHANGING
+              ct_ci_repos = ct_ci_repos ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~get_ssl_id.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rv_ssl_id = gi_exit->get_ssl_id( ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+    IF rv_ssl_id IS INITIAL.
+      rv_ssl_id = ''ANONYM''.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~http_client.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->http_client(
+            iv_url    = iv_url
+            ii_client = ii_client ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~on_event.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rs_handled = gi_exit->on_event( ii_event ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~pre_calculate_repo_status.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->pre_calculate_repo_status(
+            EXPORTING
+              is_repo_meta = is_repo_meta
+            CHANGING
+              ct_local     = ct_local
+              ct_remote    = ct_remote ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~serialize_postprocess.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->serialize_postprocess(
+            EXPORTING
+              iv_package = iv_package
+              ii_log     = ii_log
+            CHANGING
+              ct_files   = ct_files ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~validate_before_push.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->validate_before_push(
+            is_comment = is_comment
+            io_stage   = io_stage
+            io_repo    = io_repo ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~wall_message_list.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->wall_message_list( ii_html ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~wall_message_repo.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->wall_message_repo(
+            is_repo_meta = is_repo_meta
+            ii_html      = ii_html ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+  METHOD zif_abapgit_exit~enhance_repo_toolbar.
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->enhance_repo_toolbar(
+            io_menu = io_menu
+            iv_key  = iv_key
+            iv_act  = iv_act ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AUTH                        ', 'INTERFACE zif_abapgit_auth PUBLIC.
+ 
+  TYPES: ty_authorization TYPE string.
+ 
+  CONSTANTS: BEGIN OF c_authorization,
+               startup               TYPE ty_authorization VALUE ''STARTUP'',
+               uninstall             TYPE ty_authorization VALUE ''UNINSTALL'',
+               create_repo           TYPE ty_authorization VALUE ''CREATE_REPO'',
+               transport_to_branch   TYPE ty_authorization VALUE ''TRANSPORT_TO_BRANCH'',
+               update_local_checksum TYPE ty_authorization VALUE ''UPDATE_LOCAL_CHECKSUM'',
+             END OF c_authorization.
+ 
+  METHODS:
+    is_allowed
+      IMPORTING iv_authorization  TYPE ty_authorization
+                iv_param          TYPE string OPTIONAL
+      RETURNING VALUE(rv_allowed) TYPE abap_bool.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_EXIT                        ', 'INTERFACE zif_abapgit_exit
+  PUBLIC .
+ 
+ 
+  TYPES:
+    BEGIN OF ty_ci_repo,
+      name      TYPE string,
+      clone_url TYPE string,
+    END OF ty_ci_repo .
+  TYPES:
+    ty_ci_repos TYPE TABLE OF ty_ci_repo .
+  TYPES:
+    ty_object_types TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY .
+ 
+  METHODS adjust_display_commit_url
+    IMPORTING
+      !iv_repo_url    TYPE csequence
+      !iv_repo_name   TYPE csequence
+      !iv_repo_key    TYPE csequence
+      !iv_commit_hash TYPE zif_abapgit_git_definitions=>ty_sha1
+    CHANGING
+      !cv_display_url TYPE csequence
+    RAISING
+      zcx_abapgit_exception .
+  METHODS adjust_display_filename
+    IMPORTING
+      !iv_filename       TYPE string
+    RETURNING
+      VALUE(rv_filename) TYPE string .
+  METHODS allow_sap_objects
+    RETURNING
+      VALUE(rv_allowed) TYPE abap_bool .
+  METHODS change_local_host
+    CHANGING
+      !ct_hosts TYPE zif_abapgit_definitions=>ty_string_tt .
+  METHODS change_proxy_authentication
+    IMPORTING
+      !iv_repo_url             TYPE csequence
+    CHANGING
+      !cv_proxy_authentication TYPE abap_bool .
+  METHODS change_proxy_port
+    IMPORTING
+      !iv_repo_url   TYPE csequence
+    CHANGING
+      !cv_proxy_port TYPE string .
+  METHODS change_proxy_url
+    IMPORTING
+      !iv_repo_url  TYPE csequence
+    CHANGING
+      !cv_proxy_url TYPE string .
+  METHODS change_supported_data_objects
+    CHANGING
+      !ct_objects TYPE zif_abapgit_data_supporter=>ty_objects.
+  METHODS change_supported_object_types
+    CHANGING
+      !ct_types TYPE ty_object_types .
+  METHODS change_tadir
+    IMPORTING
+      !iv_package TYPE devclass
+      !ii_log     TYPE REF TO zif_abapgit_log
+    CHANGING
+      !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt .
+  METHODS create_http_client
+    IMPORTING
+      !iv_url          TYPE string
+    RETURNING
+      VALUE(ri_client) TYPE REF TO if_http_client
+    RAISING
+      zcx_abapgit_exception .
+  TYPES: BEGIN OF ty_class_key,
+           clsname TYPE abap_classname,
+         END OF ty_class_key.
+  METHODS custom_serialize_abap_clif
+    IMPORTING
+      !is_class_key    TYPE ty_class_key
+      !it_source       TYPE zif_abapgit_definitions=>ty_string_tt OPTIONAL
+    RETURNING
+      VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt
+    RAISING
+      zcx_abapgit_exception .
+  METHODS deserialize_postprocess
+    IMPORTING
+      !is_step TYPE zif_abapgit_objects=>ty_step_data
+      !ii_log  TYPE REF TO zif_abapgit_log .
+  METHODS determine_transport_request
+    IMPORTING
+      !io_repo              TYPE REF TO zcl_abapgit_repo
+      !iv_transport_type    TYPE zif_abapgit_definitions=>ty_transport_type
+    CHANGING
+      !cv_transport_request TYPE trkorr .
+  METHODS get_ci_tests
+    IMPORTING
+      !iv_object   TYPE tadir-object
+    CHANGING
+      !ct_ci_repos TYPE ty_ci_repos .
+  METHODS get_ssl_id
+    RETURNING
+      VALUE(rv_ssl_id) TYPE ssfapplssl .
+  METHODS http_client
+    IMPORTING
+      !iv_url    TYPE string
+      !ii_client TYPE REF TO if_http_client .
+  METHODS on_event
+    IMPORTING
+      !ii_event         TYPE REF TO zif_abapgit_gui_event
+    RETURNING
+      VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+    RAISING
+      zcx_abapgit_exception .
+  METHODS pre_calculate_repo_status
+    IMPORTING
+      !is_repo_meta TYPE zif_abapgit_persistence=>ty_repo
+    CHANGING
+      !ct_local     TYPE zif_abapgit_definitions=>ty_files_item_tt
+      !ct_remote    TYPE zif_abapgit_git_definitions=>ty_files_tt
+    RAISING
+      zcx_abapgit_exception .
+  METHODS serialize_postprocess
+    IMPORTING
+      !iv_package TYPE devclass
+      !ii_log     TYPE REF TO zif_abapgit_log
+    CHANGING
+      !ct_files   TYPE zif_abapgit_definitions=>ty_files_item_tt .
+  METHODS validate_before_push
+    IMPORTING
+      !is_comment TYPE zif_abapgit_git_definitions=>ty_comment
+      !io_stage   TYPE REF TO zcl_abapgit_stage
+      !io_repo    TYPE REF TO zcl_abapgit_repo_online
+    RAISING
+      zcx_abapgit_exception .
+  METHODS wall_message_list
+    IMPORTING
+      !ii_html TYPE REF TO zif_abapgit_html .
+  METHODS wall_message_repo
+    IMPORTING
+      !is_repo_meta TYPE zif_abapgit_persistence=>ty_repo
+      !ii_html      TYPE REF TO zif_abapgit_html .
+  METHODS enhance_repo_toolbar
+    IMPORTING
+      !io_menu TYPE REF TO zcl_abapgit_html_toolbar
+      !iv_key  TYPE zif_abapgit_persistence=>ty_value
+      !iv_act  TYPE string.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_ADD_PATCH               ', 'CLASS zcl_abapgit_git_add_patch DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          it_diff TYPE zif_abapgit_definitions=>ty_diffs_tt,
+ 
+      get_patch
+        RETURNING
+          VALUE(rt_patch) TYPE string_table
+        RAISING
+          zcx_abapgit_exception,
+ 
+      get_patch_binary
+        RETURNING
+          VALUE(rv_patch_binary) TYPE xstring
+        RAISING
+          zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA:
+      mt_diff  TYPE zif_abapgit_definitions=>ty_diffs_tt,
+      mt_patch TYPE string_table.
+ 
+    METHODS:
+      calculate_patch
+        RETURNING
+          VALUE(rt_patch) TYPE string_table
+        RAISING
+          zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GIT_ADD_PATCH IMPLEMENTATION.
+ 
+ 
+  METHOD calculate_patch.
+ 
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
+ 
+    LOOP AT mt_diff ASSIGNING <ls_diff>.
+ 
+      CASE <ls_diff>-result.
+        WHEN zif_abapgit_definitions=>c_diff-unchanged.
+ 
+          INSERT <ls_diff>-old INTO TABLE rt_patch.
+ 
+        WHEN zif_abapgit_definitions=>c_diff-insert.
+ 
+          IF <ls_diff>-patch_flag = abap_true.
+            INSERT <ls_diff>-new INTO TABLE rt_patch.
+          ENDIF.
+ 
+        WHEN zif_abapgit_definitions=>c_diff-delete.
+ 
+          IF <ls_diff>-patch_flag = abap_false.
+            INSERT <ls_diff>-old INTO TABLE rt_patch.
+          ENDIF.
+ 
+        WHEN zif_abapgit_definitions=>c_diff-update.
+ 
+          IF <ls_diff>-patch_flag = abap_true.
+            INSERT <ls_diff>-new INTO TABLE rt_patch.
+          ELSE.
+            INSERT <ls_diff>-old INTO TABLE rt_patch.
+          ENDIF.
+ 
+        WHEN OTHERS.
+ 
+          zcx_abapgit_exception=>raise( |Unknown result| ).
+ 
+      ENDCASE.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    mt_diff = it_diff.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_patch.
+ 
+    IF mt_patch IS INITIAL.
+      mt_patch = calculate_patch( ).
+    ENDIF.
+ 
+    rt_patch = mt_patch.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_patch_binary.
+ 
+    DATA: lv_string TYPE string.
+ 
+    IF mt_patch IS INITIAL.
+      mt_patch = calculate_patch( ).
+    ENDIF.
+ 
+    CONCATENATE LINES OF mt_patch INTO lv_string SEPARATED BY cl_abap_char_utilities=>newline.
+    lv_string = lv_string && cl_abap_char_utilities=>newline.
+ 
+    rv_patch_binary = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_BRANCH_LIST             ', 'CLASS zcl_abapgit_git_branch_list DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        !iv_data TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS find_by_name
+      IMPORTING
+        !iv_branch_name  TYPE clike
+      RETURNING
+        VALUE(rs_branch) TYPE zif_abapgit_git_definitions=>ty_git_branch
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_head_symref
+      RETURNING
+        VALUE(rv_head_symref) TYPE string .
+    METHODS get_all
+      RETURNING
+        VALUE(rt_branches) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_branches_only
+      RETURNING
+        VALUE(rt_branches) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_tags_only             " For potential future use
+      RETURNING
+        VALUE(rt_tags) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_display_name
+      IMPORTING
+        !iv_branch_name        TYPE clike
+      RETURNING
+        VALUE(rv_display_name) TYPE string .
+    CLASS-METHODS get_type
+      IMPORTING
+        !iv_branch_name       TYPE clike
+        !it_result            TYPE string_table OPTIONAL
+        !iv_current_row_index TYPE sy-tabix OPTIONAL
+      RETURNING
+        VALUE(rv_type)        TYPE zif_abapgit_git_definitions=>ty_git_branch_type .
+    CLASS-METHODS complete_heads_branch_name
+      IMPORTING
+        !iv_branch_name TYPE clike
+      RETURNING
+        VALUE(rv_name)  TYPE string .
+    CLASS-METHODS normalize_branch_name
+      IMPORTING
+        !iv_branch_name TYPE clike
+      RETURNING
+        VALUE(rv_name)  TYPE string .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt .
+    DATA mv_head_symref TYPE string .
+ 
+    CLASS-METHODS skip_first_pkt
+      IMPORTING
+        !iv_data       TYPE string
+      RETURNING
+        VALUE(rv_data) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS find_tag_by_name
+      IMPORTING
+        !iv_branch_name  TYPE string
+      RETURNING
+        VALUE(rs_branch) TYPE zif_abapgit_git_definitions=>ty_git_branch
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS parse_branch_list
+      IMPORTING
+        !iv_data        TYPE string
+      EXPORTING
+        !et_list        TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+        !ev_head_symref TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS parse_head_params
+      IMPORTING
+        !iv_data              TYPE string
+      RETURNING
+        VALUE(rv_head_symref) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_branch_list IMPLEMENTATION.
+ 
+ 
+  METHOD complete_heads_branch_name.
+    IF iv_branch_name CP zif_abapgit_git_definitions=>c_git_branch-heads.
+      rv_name = iv_branch_name.
+    ELSE.
+      rv_name = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && iv_branch_name.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    parse_branch_list(
+      EXPORTING
+        iv_data        = iv_data
+      IMPORTING
+        et_list        = mt_branches
+        ev_head_symref = mv_head_symref ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_by_name.
+ 
+    IF iv_branch_name IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Branch name empty'' ).
+    ENDIF.
+ 
+    IF iv_branch_name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+      rs_branch = find_tag_by_name( iv_branch_name ).
+    ELSE.
+ 
+      READ TABLE mt_branches INTO rs_branch
+        WITH TABLE KEY name_key
+        COMPONENTS name = iv_branch_name.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Branch { get_display_name( iv_branch_name )
+          } not found. Use ''Branch'' > ''Switch'' to select a different branch| ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_tag_by_name.
+ 
+    READ TABLE mt_branches INTO rs_branch
+        WITH TABLE KEY name_key
+        COMPONENTS name = zcl_abapgit_git_tag=>add_peel( iv_branch_name ).
+    IF sy-subrc <> 0.
+ 
+      READ TABLE mt_branches INTO rs_branch
+        WITH TABLE KEY name_key
+        COMPONENTS name = iv_branch_name.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( ''Branch not found'' ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_all.
+ 
+    rt_branches = mt_branches.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_branches_only.
+    FIELD-SYMBOLS <ls_branch> LIKE LINE OF mt_branches.
+ 
+    LOOP AT mt_branches ASSIGNING <ls_branch>.
+      IF <ls_branch>-type = zif_abapgit_git_definitions=>c_git_branch_type-branch.
+        APPEND <ls_branch> TO rt_branches.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_display_name.
+    rv_display_name = iv_branch_name.
+ 
+    IF rv_display_name CP zif_abapgit_git_definitions=>c_git_branch-heads.
+      REPLACE FIRST OCCURRENCE OF zif_abapgit_git_definitions=>c_git_branch-heads_prefix IN rv_display_name WITH ''''.
+    ELSEIF rv_display_name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+      rv_display_name = zcl_abapgit_git_tag=>remove_tag_prefix( zcl_abapgit_git_tag=>remove_peel( rv_display_name ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_head_symref.
+    rv_head_symref = mv_head_symref.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_tags_only.
+    FIELD-SYMBOLS <ls_branch> LIKE LINE OF mt_branches.
+ 
+    LOOP AT mt_branches ASSIGNING <ls_branch>
+        WHERE type = zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag
+        OR type = zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag.
+      APPEND <ls_branch> TO rt_tags.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_type.
+ 
+    FIELD-SYMBOLS: <lv_result> TYPE LINE OF string_table.
+ 
+    rv_type = zif_abapgit_git_definitions=>c_git_branch_type-other.
+ 
+    IF iv_branch_name CP zif_abapgit_git_definitions=>c_git_branch-heads OR
+       iv_branch_name = zif_abapgit_git_definitions=>c_head_name.
+      rv_type = zif_abapgit_git_definitions=>c_git_branch_type-branch.
+ 
+    ELSEIF iv_branch_name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+ 
+      READ TABLE it_result ASSIGNING <lv_result>
+                           INDEX iv_current_row_index + 1.
+      IF sy-subrc = 0 AND <lv_result> CP ''*'' && zcl_abapgit_git_tag=>add_peel( iv_branch_name ).
+        rv_type = zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag.
+      ELSE.
+        rv_type = zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag.
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_branch_name.
+ 
+    rv_name = iv_branch_name. " Force convert to string
+    REPLACE ALL OCCURRENCES OF \` \` IN rv_name WITH ''-''. " Disallow space in branch name
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_branch_list.
+ 
+    DATA: lt_result            TYPE TABLE OF string,
+          lv_hash              TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_name              TYPE string,
+          lv_head_params       TYPE string,
+          lv_char              TYPE c,
+          lv_data              LIKE LINE OF lt_result,
+          lv_current_row_index TYPE syst-tabix.
+ 
+    FIELD-SYMBOLS: <ls_branch> LIKE LINE OF et_list.
+ 
+    CLEAR: et_list, ev_head_symref.
+ 
+    lv_data = skip_first_pkt( iv_data ).
+    SPLIT lv_data AT cl_abap_char_utilities=>newline INTO TABLE lt_result.
+ 
+    LOOP AT lt_result INTO lv_data.
+      lv_current_row_index = sy-tabix.
+ 
+      IF sy-tabix = 1 AND strlen( lv_data ) > 12 AND lv_data(4) = ''0000'' AND lv_data+8(3) = ''ERR''.
+        lv_name = lv_data+8.
+        zcx_abapgit_exception=>raise( lv_name ).
+      ELSEIF sy-tabix = 1 AND strlen( lv_data ) > 49.
+        lv_hash = lv_data+8.
+        lv_name = lv_data+49.
+        lv_char = zcl_abapgit_git_utils=>get_null( ).
+ 
+        SPLIT lv_name AT lv_char INTO lv_name lv_head_params.
+        ev_head_symref = parse_head_params( lv_head_params ).
+        IF ev_head_symref IS INITIAL AND lv_name CS ''refs/heads/''.
+          ev_head_symref = lv_name.
+        ENDIF.
+      ELSEIF sy-tabix > 1 AND strlen( lv_data ) > 45.
+        lv_hash = lv_data+4.
+        lv_name = lv_data+45.
+      ELSEIF sy-tabix = 1 AND strlen( lv_data ) = 8 AND lv_data(8) = ''00000000''.
+        zcx_abapgit_exception=>raise( ''No branches, create branch manually by adding file'' ).
+      ELSE.
+        CONTINUE.
+      ENDIF.
+ 
+      ASSERT lv_name IS NOT INITIAL.
+ 
+      APPEND INITIAL LINE TO et_list ASSIGNING <ls_branch>.
+      <ls_branch>-sha1         = lv_hash.
+      <ls_branch>-name         = lv_name.
+      <ls_branch>-display_name = get_display_name( lv_name ).
+      <ls_branch>-type         = get_type( iv_branch_name       = lv_name
+                                           it_result            = lt_result
+                                           iv_current_row_index = lv_current_row_index ).
+      IF <ls_branch>-name = zif_abapgit_git_definitions=>c_head_name OR <ls_branch>-name = ev_head_symref.
+        <ls_branch>-is_head = abap_true.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_head_params.
+ 
+    DATA: ls_match    TYPE match_result,
+          ls_submatch LIKE LINE OF ls_match-submatches.
+ 
+    FIND FIRST OCCURRENCE OF REGEX ''\\ssymref=HEAD:([^\\s]+)'' IN iv_data RESULTS ls_match.
+    READ TABLE ls_match-submatches INTO ls_submatch INDEX 1.
+    IF sy-subrc IS INITIAL.
+      rv_head_symref = iv_data+ls_submatch-offset(ls_submatch-length).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD skip_first_pkt.
+ 
+    DATA: lv_hex    TYPE x LENGTH 1,
+          lv_length TYPE i.
+ 
+* channel
+    ASSERT iv_data(2) = ''00''.
+ 
+    lv_hex = to_upper( iv_data+2(2) ).
+    lv_length = lv_hex.
+ 
+    rv_data = iv_data+lv_length.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_COMMIT                  ', 'CLASS zcl_abapgit_git_commit DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    TYPES:
+      BEGIN OF ty_pull_result,
+        commits TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+        commit  TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_pull_result .
+ 
+    CLASS-METHODS get_by_branch
+      IMPORTING
+        !iv_branch_name       TYPE string
+        !iv_repo_url          TYPE string
+        !iv_deepen_level      TYPE i
+        !iv_sorted            TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rs_pull_result) TYPE ty_pull_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_by_commit
+      IMPORTING
+        !iv_commit_hash   TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_repo_url      TYPE string
+        !iv_deepen_level  TYPE i
+      RETURNING
+        VALUE(rt_commits) TYPE zif_abapgit_git_definitions=>ty_commit_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS parse_commits
+      IMPORTING
+        !it_objects       TYPE zif_abapgit_definitions=>ty_objects_tt
+      RETURNING
+        VALUE(rt_commits) TYPE zif_abapgit_git_definitions=>ty_commit_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sort_commits
+      CHANGING
+        !ct_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS reverse_sort_order
+      CHANGING
+        !ct_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt .
+    CLASS-METHODS clear_missing_parents CHANGING ct_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES: ty_sha1_range TYPE RANGE OF zif_abapgit_git_definitions=>ty_sha1 .
+ 
+    CLASS-METHODS get_1st_child_commit
+      IMPORTING
+        it_commit_sha1s TYPE ty_sha1_range
+      EXPORTING
+        et_commit_sha1s TYPE ty_sha1_range
+        es_1st_commit   TYPE zif_abapgit_git_definitions=>ty_commit
+      CHANGING
+        ct_commits      TYPE zif_abapgit_git_definitions=>ty_commit_tt .
+ 
+    CLASS-METHODS is_missing
+      IMPORTING
+        it_commits       TYPE zif_abapgit_git_definitions=>ty_commit_tt
+        iv_sha1          TYPE zif_abapgit_git_definitions=>ty_sha1
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool.
+ 
+    CLASS-METHODS extract_author_data
+      IMPORTING
+        !iv_author TYPE string
+      EXPORTING
+        !ev_author TYPE zif_abapgit_git_definitions=>ty_commit-author
+        !ev_email  TYPE zif_abapgit_git_definitions=>ty_commit-email
+        !ev_time   TYPE zif_abapgit_git_definitions=>ty_commit-time
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_commit IMPLEMENTATION.
+ 
+  METHOD extract_author_data.
+ 
+    " unix time stamps are in same time zone, so ignore the zone
+    FIND REGEX zif_abapgit_definitions=>c_author_regex IN iv_author
+      SUBMATCHES
+      ev_author
+      ev_email
+      ev_time.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error author regex value=''{ iv_author }''| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD clear_missing_parents.
+ 
+    "Part of #4719 to handle cut commit sequences, todo
+ 
+    FIELD-SYMBOLS: <ls_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    LOOP AT ct_commits ASSIGNING <ls_commit>.
+ 
+      IF is_missing( it_commits = ct_commits
+                     iv_sha1  = <ls_commit>-parent1 ) = abap_true.
+        CLEAR <ls_commit>-parent1.
+      ENDIF.
+ 
+      IF is_missing( it_commits = ct_commits
+                     iv_sha1  = <ls_commit>-parent2 ) = abap_true.
+        CLEAR <ls_commit>-parent2.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_1st_child_commit.
+ 
+    DATA: lt_1stchild_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+          ls_parent           LIKE LINE OF it_commit_sha1s,
+          lt_commit_sha1s     LIKE it_commit_sha1s.
+ 
+    FIELD-SYMBOLS: <ls_child_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    CLEAR: es_1st_commit.
+ 
+* get all reachable next commits
+    lt_commit_sha1s = it_commit_sha1s.
+    LOOP AT ct_commits ASSIGNING <ls_child_commit> WHERE parent1 IN lt_commit_sha1s
+                                                      OR parent2 IN lt_commit_sha1s.
+      INSERT <ls_child_commit> INTO TABLE lt_1stchild_commits.
+    ENDLOOP.
+ 
+* return oldest one
+    SORT lt_1stchild_commits BY time ASCENDING.
+    READ TABLE lt_1stchild_commits INTO es_1st_commit INDEX 1.
+ 
+* remove from available commits
+    DELETE ct_commits WHERE sha1 = es_1st_commit-sha1.
+ 
+* set relevant parent commit sha1s
+    IF lines( lt_1stchild_commits ) = 1.
+      CLEAR et_commit_sha1s.
+    ELSE.
+      et_commit_sha1s = it_commit_sha1s.
+    ENDIF.
+ 
+    ls_parent-sign   = ''I''.
+    ls_parent-option = ''EQ''.
+    ls_parent-low    = es_1st_commit-sha1.
+    INSERT ls_parent INTO TABLE et_commit_sha1s.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_by_branch.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          lt_objects  TYPE zif_abapgit_definitions=>ty_objects_tt.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( 1 ).
+ 
+    li_progress->show(
+      iv_current = 1
+      iv_text    = |Get git commits { iv_repo_url }| ).
+ 
+    zcl_abapgit_git_transport=>upload_pack_by_branch(
+      EXPORTING
+        iv_url          = iv_repo_url
+        iv_branch_name  = iv_branch_name
+        iv_deepen_level = iv_deepen_level
+      IMPORTING
+        ev_branch       = rs_pull_result-commit
+        et_objects      = lt_objects ).
+ 
+    DELETE lt_objects WHERE type <> zif_abapgit_git_definitions=>c_type-commit.
+ 
+    rs_pull_result-commits = parse_commits( lt_objects ).
+ 
+    IF iv_sorted = abap_true.
+      sort_commits( CHANGING ct_commits = rs_pull_result-commits ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_by_commit.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          lt_objects  TYPE zif_abapgit_definitions=>ty_objects_tt.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( 1 ).
+ 
+    li_progress->show(
+      iv_current = 1
+      iv_text    = |Get git commits { iv_repo_url }| ).
+ 
+    zcl_abapgit_git_transport=>upload_pack_by_commit(
+      EXPORTING
+        iv_url          = iv_repo_url
+        iv_deepen_level = iv_deepen_level
+        iv_hash         = iv_commit_hash
+      IMPORTING
+        et_objects      = lt_objects ).
+ 
+    DELETE lt_objects WHERE type <> zif_abapgit_git_definitions=>c_type-commit.
+ 
+    rt_commits = parse_commits( lt_objects ).
+    sort_commits( CHANGING ct_commits = rt_commits ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_missing.
+ 
+    IF iv_sha1 IS NOT INITIAL.
+ 
+      READ TABLE it_commits
+        TRANSPORTING NO FIELDS
+        WITH KEY sha1 = iv_sha1.
+      rv_result = boolc( sy-subrc <> 0 ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_commits.
+ 
+    DATA: ls_commit TYPE zif_abapgit_git_definitions=>ty_commit,
+          lt_body   TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          ls_raw    TYPE zcl_abapgit_git_pack=>ty_commit.
+ 
+    FIELD-SYMBOLS: <ls_object> LIKE LINE OF it_objects,
+                   <lv_body>   TYPE string.
+ 
+ 
+    LOOP AT it_objects ASSIGNING <ls_object> USING KEY type
+        WHERE type = zif_abapgit_git_definitions=>c_type-commit.
+      ls_raw = zcl_abapgit_git_pack=>decode_commit( <ls_object>-data ).
+ 
+      CLEAR ls_commit.
+      ls_commit-sha1 = <ls_object>-sha1.
+      ls_commit-parent1 = ls_raw-parent.
+      ls_commit-parent2 = ls_raw-parent2.
+ 
+      SPLIT ls_raw-body AT cl_abap_char_utilities=>newline INTO TABLE lt_body.
+ 
+      READ TABLE lt_body WITH KEY table_line = '' -----END PGP SIGNATURE-----'' TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        DELETE lt_body TO sy-tabix.
+        DELETE lt_body TO 2.
+      ENDIF.
+ 
+      READ TABLE lt_body INDEX 1 INTO ls_commit-message.  "#EC CI_SUBRC
+      " The second line is always empty. Therefore we omit it.
+      LOOP AT lt_body ASSIGNING <lv_body>
+                      FROM 3.
+        INSERT <lv_body> INTO TABLE ls_commit-body.
+      ENDLOOP.
+ 
+      extract_author_data(
+        EXPORTING
+          iv_author = ls_raw-author
+        IMPORTING
+          ev_author = ls_commit-author
+          ev_email  = ls_commit-email
+          ev_time   = ls_commit-time ).
+ 
+      APPEND ls_commit TO rt_commits.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reverse_sort_order.
+ 
+    DATA: lt_commits           TYPE zif_abapgit_git_definitions=>ty_commit_tt.
+    FIELD-SYMBOLS: <ls_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    LOOP AT ct_commits ASSIGNING <ls_commit>.
+      INSERT <ls_commit> INTO lt_commits INDEX 1.
+    ENDLOOP.
+    ct_commits = lt_commits.
+    FREE lt_commits.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sort_commits.
+ 
+    DATA: lt_sorted_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+          ls_next_commit    TYPE zif_abapgit_git_definitions=>ty_commit,
+          lt_parents        TYPE ty_sha1_range,
+          ls_parent         LIKE LINE OF lt_parents.
+ 
+    FIELD-SYMBOLS: <ls_initial_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    " find initial commit
+    READ TABLE ct_commits ASSIGNING <ls_initial_commit> WITH KEY parent1 = space.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Cannot find initial commit. Too many commits. Action not possible.| ).
+    ENDIF.
+ 
+    ls_parent-sign   = ''I''.
+    ls_parent-option = ''EQ''.
+    ls_parent-low    = <ls_initial_commit>-sha1.
+    INSERT ls_parent INTO TABLE lt_parents.
+ 
+    " first commit
+    INSERT <ls_initial_commit> INTO TABLE lt_sorted_commits.
+ 
+    " remove from available commits
+    DELETE ct_commits WHERE sha1 = <ls_initial_commit>-sha1.
+ 
+    DO.
+      get_1st_child_commit( EXPORTING it_commit_sha1s = lt_parents
+                            IMPORTING et_commit_sha1s = lt_parents
+                                      es_1st_commit   = ls_next_commit
+                            CHANGING  ct_commits      = ct_commits ).
+      IF ls_next_commit IS INITIAL.
+        EXIT. "DO
+      ENDIF.
+      INSERT ls_next_commit INTO TABLE lt_sorted_commits.
+    ENDDO.
+ 
+    ct_commits = lt_sorted_commits.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_PACK                    ', 'CLASS zcl_abapgit_git_pack DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    TYPES:
+      BEGIN OF ty_node,
+        chmod TYPE zif_abapgit_git_definitions=>ty_chmod,
+        name  TYPE string,
+        sha1  TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_node .
+    TYPES:
+      ty_nodes_tt TYPE STANDARD TABLE OF ty_node WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_commit,
+        tree      TYPE zif_abapgit_git_definitions=>ty_sha1,
+        parent    TYPE zif_abapgit_git_definitions=>ty_sha1,
+        parent2   TYPE zif_abapgit_git_definitions=>ty_sha1,
+        author    TYPE string,
+        committer TYPE string,
+        gpgsig    TYPE string,
+        body      TYPE string,
+      END OF ty_commit .
+    TYPES:
+      BEGIN OF ty_tag,
+        object       TYPE string,
+        type         TYPE string,
+        tag          TYPE string,
+        tagger_name  TYPE string,
+        tagger_email TYPE string,
+        message      TYPE string,
+        body         TYPE string,
+      END OF ty_tag .
+ 
+    CLASS-METHODS decode
+      IMPORTING
+        !iv_data          TYPE xstring
+      RETURNING
+        VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS decode_tree
+      IMPORTING
+        !iv_data        TYPE xstring
+      RETURNING
+        VALUE(rt_nodes) TYPE ty_nodes_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS decode_commit
+      IMPORTING
+        !iv_data         TYPE xstring
+      RETURNING
+        VALUE(rs_commit) TYPE ty_commit
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS decode_tag
+      IMPORTING
+        !iv_data      TYPE xstring
+      RETURNING
+        VALUE(rs_tag) TYPE ty_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS encode
+      IMPORTING
+        !it_objects    TYPE zif_abapgit_definitions=>ty_objects_tt
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS encode_tree
+      IMPORTING
+        !it_nodes      TYPE ty_nodes_tt
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS encode_commit
+      IMPORTING
+        !is_commit     TYPE ty_commit
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS encode_tag
+      IMPORTING
+        !is_tag        TYPE ty_tag
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      c_pack_start TYPE x LENGTH 4 VALUE ''5041434B'' ##NO_TEXT.
+    CONSTANTS:
+      c_zlib       TYPE x LENGTH 2 VALUE ''789C'' ##NO_TEXT.
+    CONSTANTS:
+      c_zlib_hmm   TYPE x LENGTH 2 VALUE ''7801'' ##NO_TEXT.
+    CONSTANTS:                                                    " PACK
+      c_version    TYPE x LENGTH 4 VALUE ''00000002'' ##NO_TEXT.
+ 
+    CLASS-METHODS decode_deltas
+      CHANGING
+        !ct_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delta
+      IMPORTING
+        !is_object  TYPE zif_abapgit_definitions=>ty_object
+      CHANGING
+        !ct_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delta_header
+      IMPORTING
+        !io_stream       TYPE REF TO lcl_stream
+      RETURNING
+        VALUE(rv_header) TYPE i .
+    CLASS-METHODS sort_tree
+      IMPORTING
+        !it_nodes       TYPE ty_nodes_tt
+      RETURNING
+        VALUE(rt_nodes) TYPE ty_nodes_tt .
+    CLASS-METHODS get_type
+      IMPORTING
+        !iv_x          TYPE x
+      RETURNING
+        VALUE(rv_type) TYPE zif_abapgit_git_definitions=>ty_type
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_length
+      EXPORTING
+        !ev_length TYPE i
+      CHANGING
+        !cv_data   TYPE xstring .
+    CLASS-METHODS type_and_length
+      IMPORTING
+        !iv_type          TYPE zif_abapgit_git_definitions=>ty_type
+        !iv_length        TYPE i
+      RETURNING
+        VALUE(rv_xstring) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS zlib_decompress
+      CHANGING
+        !cv_data         TYPE xstring
+        !cv_decompressed TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_pack IMPLEMENTATION.
+ 
+ 
+  METHOD decode.
+ 
+    DATA: lv_x              TYPE x,
+          lv_data           TYPE xstring,
+          lv_type           TYPE c LENGTH 6,
+          lv_zlib           TYPE x LENGTH 2,
+          lv_objects        TYPE i,
+          lv_len            TYPE i,
+          lv_sha1           TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_ref_delta      TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_compressed_len TYPE i,
+          lv_compressed     TYPE xstring,
+          lv_decompressed   TYPE xstring,
+          lv_decompress_len TYPE i,
+          lv_xstring        TYPE xstring,
+          lv_expected       TYPE i,
+          ls_object         LIKE LINE OF rt_objects,
+          lv_uindex         TYPE sy-index.
+ 
+ 
+    lv_data = iv_data.
+ 
+* header
+    IF NOT xstrlen( lv_data ) > 4 OR lv_data(4) <> c_pack_start.
+      zcx_abapgit_exception=>raise( |Unexpected pack header| ).
+    ENDIF.
+    lv_data = lv_data+4.
+ 
+* version
+    IF lv_data(4) <> c_version.
+      zcx_abapgit_exception=>raise( |Version not supported| ).
+    ENDIF.
+    lv_data = lv_data+4.
+ 
+* number of objects
+    lv_xstring = lv_data(4).
+    lv_objects = zcl_abapgit_convert=>xstring_to_int( lv_xstring ).
+    lv_data = lv_data+4.
+ 
+ 
+    DO lv_objects TIMES.
+ 
+      lv_uindex = sy-index.
+ 
+      lv_x = lv_data(1).
+      lv_type = get_type( lv_x ).
+ 
+      get_length( IMPORTING ev_length = lv_expected
+                  CHANGING cv_data = lv_data ).
+ 
+      IF lv_type = zif_abapgit_git_definitions=>c_type-ref_d.
+        lv_ref_delta = lv_data(20).
+        lv_data = lv_data+20.
+      ENDIF.
+ 
+* strip header, ''789C'', CMF + FLG
+      lv_zlib = lv_data(2).
+      IF lv_zlib <> c_zlib AND lv_zlib <> c_zlib_hmm.
+        zcx_abapgit_exception=>raise( |Unexpected zlib header| ).
+      ENDIF.
+      lv_data = lv_data+2.
+ 
+*******************************
+ 
+      IF lv_zlib = c_zlib.
+        cl_abap_gzip=>decompress_binary(
+          EXPORTING
+            gzip_in     = lv_data
+          IMPORTING
+            raw_out     = lv_decompressed
+            raw_out_len = lv_decompress_len ).
+ 
+        IF lv_expected <> lv_decompress_len.
+          zcx_abapgit_exception=>raise( |Decompression falied| ).
+        ENDIF.
+ 
+        cl_abap_gzip=>compress_binary(
+          EXPORTING
+            raw_in         = lv_decompressed
+          IMPORTING
+            gzip_out       = lv_compressed
+            gzip_out_len   = lv_compressed_len ).
+ 
+        IF lv_compressed(lv_compressed_len) <> lv_data(lv_compressed_len).
+          "Lets try with zlib before error in out for good
+          "This fixes issues with TFS 2017 and visualstudio.com Git repos
+          zlib_decompress( CHANGING cv_data = lv_data
+                                    cv_decompressed = lv_decompressed ).
+        ELSE.
+          lv_data = lv_data+lv_compressed_len.
+        ENDIF.
+ 
+      ELSEIF lv_zlib = c_zlib_hmm.
+* cl_abap_gzip compression works for header ''789C'', but does not work for
+* ''7801'', call custom implementation of DEFLATE algorithm.
+* The custom implementation could handle both, but most likely the kernel
+* implementation runs faster than the custom ABAP.
+        zlib_decompress( CHANGING cv_data = lv_data
+                                  cv_decompressed = lv_decompressed ).
+      ENDIF.
+ 
+      CLEAR ls_object.
+      ls_object-adler32 = lv_data(4).
+      lv_data = lv_data+4. " skip adler checksum
+ 
+      IF lv_type = zif_abapgit_git_definitions=>c_type-ref_d.
+        ls_object-sha1 = lv_ref_delta.
+        TRANSLATE ls_object-sha1 TO LOWER CASE.
+      ELSE.
+        ls_object-sha1 = zcl_abapgit_hash=>sha1(
+          iv_type = lv_type
+          iv_data = lv_decompressed ).
+      ENDIF.
+      ls_object-type = lv_type.
+      ls_object-data = lv_decompressed.
+      ls_object-index = lv_uindex.
+      APPEND ls_object TO rt_objects.
+    ENDDO.
+ 
+* check SHA1 at end of pack
+    lv_len = xstrlen( iv_data ) - 20.
+    lv_xstring = iv_data(lv_len).
+    lv_sha1 = zcl_abapgit_hash=>sha1_raw( lv_xstring ).
+    IF to_upper( lv_sha1 ) <> lv_data.
+      zcx_abapgit_exception=>raise( |SHA1 at end of pack doesnt match| ).
+    ENDIF.
+ 
+    decode_deltas( CHANGING ct_objects = rt_objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_commit.
+ 
+    DATA: lv_string        TYPE string,
+          lv_word          TYPE string,
+          lv_offset        TYPE i,
+          lv_length        TYPE i,
+          lv_length_gpgsig TYPE i,
+          lv_trash         TYPE string ##NEEDED,
+          lt_string        TYPE TABLE OF string.
+ 
+    FIELD-SYMBOLS: <lv_string> LIKE LINE OF lt_string.
+ 
+ 
+    lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_data ).
+ 
+    SPLIT lv_string AT cl_abap_char_utilities=>newline INTO TABLE lt_string.
+ 
+    LOOP AT lt_string ASSIGNING <lv_string>.
+      lv_length = strlen( <lv_string> ) + 1.
+      lv_string = lv_string+lv_length.
+ 
+      SPLIT <lv_string> AT space INTO lv_word lv_trash.
+      CASE lv_word.
+        WHEN ''tree''.
+          rs_commit-tree = <lv_string>+5.
+        WHEN ''parent''.
+          IF rs_commit-parent IS INITIAL.
+            rs_commit-parent = <lv_string>+7.
+          ELSE.
+            rs_commit-parent2 = <lv_string>+7.
+          ENDIF.
+        WHEN ''author''.
+          rs_commit-author = <lv_string>+7.
+        WHEN ''committer''.
+          rs_commit-committer = <lv_string>+10.
+          EXIT. " current loop
+        WHEN OTHERS.
+          ASSERT 1 = 0.
+      ENDCASE.
+ 
+    ENDLOOP.
+ 
+    lv_length = strlen( lv_string ).
+    IF lv_length >= 6 AND lv_string+0(6) = ''gpgsig''.
+      FIND REGEX |-----END PGP SIGNATURE-----[[:space:]]+|
+        IN lv_string
+        MATCH OFFSET lv_offset
+        MATCH LENGTH lv_length.
+      lv_length = lv_length - 1.
+      lv_length_gpgsig = lv_offset + lv_length - 7.
+      lv_length = lv_offset + lv_length.
+      rs_commit-gpgsig = lv_string+7(lv_length_gpgsig).
+      lv_string = lv_string+lv_length.
+    ENDIF.
+ 
+    rs_commit-body = lv_string+1.
+ 
+    IF rs_commit-author IS INITIAL
+        OR rs_commit-committer IS INITIAL
+        OR rs_commit-tree IS INITIAL.
+      zcx_abapgit_exception=>raise( |multiple parents? not supported| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_deltas.
+ 
+    DATA: ls_object   LIKE LINE OF ct_objects,
+          li_progress TYPE REF TO zif_abapgit_progress,
+          lt_deltas   LIKE ct_objects.
+ 
+ 
+    LOOP AT ct_objects INTO ls_object
+        USING KEY type
+        WHERE type = zif_abapgit_git_definitions=>c_type-ref_d.
+      INSERT ls_object INTO TABLE lt_deltas.
+    ENDLOOP.
+ 
+    DELETE ct_objects
+      USING KEY type
+      WHERE type = zif_abapgit_git_definitions=>c_type-ref_d.
+ 
+    "Restore correct Delta Order
+    SORT lt_deltas BY index.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( lt_deltas ) ).
+ 
+    LOOP AT lt_deltas INTO ls_object.
+      li_progress->show( iv_current = sy-tabix
+                         iv_text    = ''Decode deltas'' ).
+ 
+      delta( EXPORTING is_object = ls_object
+             CHANGING ct_objects = ct_objects ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_tag.
+ 
+    DATA: lv_string TYPE string,
+          lv_word   TYPE string,
+          lv_trash  TYPE string ##NEEDED,
+          lt_string TYPE TABLE OF string.
+ 
+    FIELD-SYMBOLS: <lv_string> LIKE LINE OF lt_string.
+ 
+ 
+    lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_data ).
+ 
+    SPLIT lv_string AT cl_abap_char_utilities=>newline INTO TABLE lt_string.
+ 
+    LOOP AT lt_string ASSIGNING <lv_string>.
+ 
+      SPLIT <lv_string> AT space INTO lv_word lv_trash.
+ 
+      CASE lv_word.
+        WHEN ''object''.
+          rs_tag-object = lv_trash.
+        WHEN ''type''.
+          rs_tag-type = lv_trash.
+        WHEN ''tag''.
+          rs_tag-tag = lv_trash.
+        WHEN ''tagger''.
+ 
+          FIND FIRST OCCURRENCE OF REGEX \`(.*)<(.*)>\`
+                     IN lv_trash
+                     SUBMATCHES rs_tag-tagger_name
+                                rs_tag-tagger_email.
+ 
+          rs_tag-tagger_name = condense( rs_tag-tagger_name ).
+ 
+        WHEN ''''.
+          " ignore blank lines
+          CONTINUE.
+        WHEN OTHERS.
+ 
+          " these are the non empty line which don''t start with a key word
+          " the first one is the message, the rest are cumulated to the body
+ 
+          IF rs_tag-message IS INITIAL.
+            rs_tag-message = <lv_string>.
+          ELSE.
+ 
+            IF rs_tag-body IS NOT INITIAL.
+              rs_tag-body = rs_tag-body && cl_abap_char_utilities=>newline.
+            ENDIF.
+ 
+            rs_tag-body = rs_tag-body && <lv_string>.
+ 
+          ENDIF.
+ 
+      ENDCASE.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_tree.
+ 
+    CONSTANTS: lc_sha_length TYPE i VALUE 20,
+               lc_null       TYPE x VALUE ''00''.
+ 
+    DATA: lv_xstring TYPE xstring,
+          lv_chmod   TYPE zif_abapgit_git_definitions=>ty_chmod,
+          lv_name    TYPE string,
+          lv_string  TYPE string,
+          lv_len     TYPE i,
+          lv_offset  TYPE i,
+          lv_cursor  TYPE i,
+          lv_match   TYPE i,
+          ls_node    TYPE ty_node.
+ 
+ 
+    DO.
+      FIND FIRST OCCURRENCE OF lc_null IN SECTION OFFSET lv_cursor OF iv_data
+        IN BYTE MODE MATCH OFFSET lv_match.
+      IF sy-subrc <> 0.
+        EXIT.
+      ENDIF.
+ 
+      lv_len = lv_match - lv_cursor.
+      lv_xstring = iv_data+lv_cursor(lv_len).
+ 
+      lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstring ).
+      SPLIT lv_string AT space INTO lv_chmod lv_name.
+ 
+      CLEAR ls_node.
+      ls_node-chmod = lv_chmod.
+      IF ls_node-chmod <> zif_abapgit_git_definitions=>c_chmod-dir
+          AND ls_node-chmod <> zif_abapgit_git_definitions=>c_chmod-file
+          AND ls_node-chmod <> zif_abapgit_git_definitions=>c_chmod-executable
+          AND ls_node-chmod <> zif_abapgit_git_definitions=>c_chmod-submodule.
+        zcx_abapgit_exception=>raise( |Unknown chmod| ).
+      ENDIF.
+ 
+      lv_offset = lv_match + 1.
+      ls_node-name = lv_name.
+      ls_node-sha1 = iv_data+lv_offset(lc_sha_length).
+      TRANSLATE ls_node-sha1 TO LOWER CASE.
+      APPEND ls_node TO rt_nodes.
+ 
+      lv_cursor = lv_match + 1 + lc_sha_length.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delta.
+ 
+    CONSTANTS: lc_1   TYPE x VALUE ''01'',
+               lc_2   TYPE x VALUE ''02'',
+               lc_4   TYPE x VALUE ''04'',
+               lc_8   TYPE x VALUE ''08'',
+               lc_16  TYPE x VALUE ''10'',
+               lc_32  TYPE x VALUE ''20'',
+               lc_64  TYPE x VALUE ''40'',
+               lc_128 TYPE x VALUE ''80''.
+ 
+    DATA: lv_base   TYPE xstring,
+          lv_result TYPE xstring,
+          lv_offset TYPE i,
+          lo_stream TYPE REF TO lcl_stream,
+          lv_sha1   TYPE zif_abapgit_git_definitions=>ty_sha1,
+          ls_object LIKE LINE OF ct_objects,
+          lv_len    TYPE i,
+          lv_tmp    TYPE xstring,
+          lv_org    TYPE x.
+ 
+    FIELD-SYMBOLS: <ls_object> LIKE LINE OF ct_objects.
+ 
+ 
+    CREATE OBJECT lo_stream
+      EXPORTING
+        iv_data = is_object-data.
+ 
+* find base
+    READ TABLE ct_objects ASSIGNING <ls_object>
+      WITH KEY sha COMPONENTS sha1 = is_object-sha1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Base not found, { is_object-sha1 }| ).
+    ELSEIF <ls_object>-type = zif_abapgit_git_definitions=>c_type-ref_d.
+* sanity check
+      zcx_abapgit_exception=>raise( |Delta, base eq delta| ).
+    ENDIF.
+ 
+    lv_base = <ls_object>-data.
+ 
+* skip the 2 headers
+    delta_header( lo_stream ).
+    delta_header( lo_stream ).
+ 
+    WHILE xstrlen( lo_stream->get( ) ) > 0.
+ 
+      lv_org = lo_stream->eat_byte( ).
+ 
+      IF lv_org BIT-AND lc_128 = lc_128. " MSB = 1
+ 
+        lv_offset = 0.
+        IF lv_org BIT-AND lc_1 = lc_1.
+          lv_offset = lo_stream->eat_byte( ).
+        ENDIF.
+        IF lv_org BIT-AND lc_2 = lc_2.
+          lv_offset = lv_offset + lo_stream->eat_byte( ) * 256.
+        ENDIF.
+        IF lv_org BIT-AND lc_4 = lc_4.
+          lv_offset = lv_offset + lo_stream->eat_byte( ) * 65536.
+        ENDIF.
+        IF lv_org BIT-AND lc_8 = lc_8.
+          lv_offset = lv_offset + lo_stream->eat_byte( ) * 16777216. " hmm, overflow?
+        ENDIF.
+ 
+        lv_len = 0.
+        IF lv_org BIT-AND lc_16 = lc_16.
+          lv_len = lo_stream->eat_byte( ).
+        ENDIF.
+        IF lv_org BIT-AND lc_32 = lc_32.
+          lv_len = lv_len + lo_stream->eat_byte( ) * 256.
+        ENDIF.
+        IF lv_org BIT-AND lc_64 = lc_64.
+          lv_len = lv_len + lo_stream->eat_byte( ) * 65536.
+        ENDIF.
+ 
+        IF lv_len = 0.
+          lv_len = 65536.
+        ENDIF.
+ 
+        CONCATENATE lv_result lv_base+lv_offset(lv_len)
+          INTO lv_result IN BYTE MODE.
+      ELSE. " lv_bitbyte(1) = ''0''
+* insert from delta
+        lv_len = lv_org. " convert to int
+        lv_tmp = lo_stream->eat_bytes( lv_len ).
+        CONCATENATE lv_result lv_tmp INTO lv_result IN BYTE MODE.
+      ENDIF.
+ 
+    ENDWHILE.
+ 
+    lv_sha1 = zcl_abapgit_hash=>sha1( iv_type = <ls_object>-type
+                                      iv_data = lv_result ).
+ 
+    CLEAR ls_object.
+    ls_object-sha1 = lv_sha1.
+    ls_object-type = <ls_object>-type.
+    ls_object-data = lv_result.
+    ls_object-index = <ls_object>-index. "Retain sort index
+    APPEND ls_object TO ct_objects.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delta_header.
+ 
+    DATA: lv_bitbyte TYPE zif_abapgit_git_definitions=>ty_bitbyte,
+          lv_bits    TYPE string,
+          lv_x       TYPE x.
+ 
+ 
+    lv_bits = ''''.
+    DO.
+      lv_x = io_stream->eat_byte( ).
+      lv_bitbyte = zcl_abapgit_convert=>x_to_bitbyte( lv_x ).
+      CONCATENATE lv_bitbyte+1 lv_bits INTO lv_bits.
+      IF lv_bitbyte(1) = ''0''.
+        EXIT. " current loop
+      ENDIF.
+    ENDDO.
+    rv_header = zcl_abapgit_convert=>bitbyte_to_int( lv_bits ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD encode.
+ 
+    DATA: lv_sha1          TYPE x LENGTH 20,
+          lv_adler32       TYPE zif_abapgit_git_definitions=>ty_adler32,
+          lv_compressed    TYPE xstring,
+          lv_xstring       TYPE xstring,
+          li_progress      TYPE REF TO zif_abapgit_progress,
+          lv_objects_total TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_object>  LIKE LINE OF it_objects.
+ 
+ 
+    rv_data = c_pack_start.
+ 
+    CONCATENATE rv_data c_version INTO rv_data IN BYTE MODE.
+ 
+    lv_xstring = zcl_abapgit_convert=>int_to_xstring4( lines( it_objects ) ).
+    CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE.
+ 
+    lv_objects_total = lines( it_objects ).
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lv_objects_total ).
+ 
+    LOOP AT it_objects ASSIGNING <ls_object>.
+      IF sy-tabix MOD 200 = 0.
+        li_progress->show(
+          iv_current = sy-tabix
+          iv_text    = |Encoding objects ( { sy-tabix } of { lv_objects_total } )| ).
+      ENDIF.
+ 
+      lv_xstring = type_and_length(
+        iv_type   = <ls_object>-type
+        iv_length = xstrlen( <ls_object>-data ) ).
+      CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE.
+ 
+      cl_abap_gzip=>compress_binary(
+        EXPORTING
+          raw_in   = <ls_object>-data
+        IMPORTING
+          gzip_out = lv_compressed ).
+ 
+      CONCATENATE rv_data c_zlib lv_compressed INTO rv_data IN BYTE MODE.
+ 
+      IF NOT <ls_object>-adler32 IS INITIAL.
+        lv_adler32 = <ls_object>-adler32.
+      ELSE.
+        lv_adler32 = zcl_abapgit_hash=>adler32( <ls_object>-data ).
+      ENDIF.
+      CONCATENATE rv_data lv_adler32 INTO rv_data IN BYTE MODE.
+ 
+    ENDLOOP.
+ 
+    lv_sha1 = to_upper( zcl_abapgit_hash=>sha1_raw( rv_data ) ).
+    CONCATENATE rv_data lv_sha1 INTO rv_data IN BYTE MODE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD encode_commit.
+ 
+    DATA: lv_string       TYPE string,
+          lv_tmp          TYPE string,
+          lv_tree_lower   TYPE string,
+          lv_parent_lower TYPE string.
+ 
+ 
+    lv_tree_lower = is_commit-tree.
+    TRANSLATE lv_tree_lower TO LOWER CASE.
+ 
+    lv_string = ''''.
+ 
+    CONCATENATE ''tree'' lv_tree_lower INTO lv_tmp SEPARATED BY space.
+    CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+ 
+    IF NOT is_commit-parent IS INITIAL.
+      lv_parent_lower = is_commit-parent.
+      TRANSLATE lv_parent_lower TO LOWER CASE.
+ 
+      CONCATENATE ''parent'' lv_parent_lower
+        INTO lv_tmp SEPARATED BY space.
+      CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+    ENDIF.
+ 
+    IF NOT is_commit-parent2 IS INITIAL.
+      lv_parent_lower = is_commit-parent2.
+      TRANSLATE lv_parent_lower TO LOWER CASE.
+ 
+      CONCATENATE ''parent'' lv_parent_lower
+        INTO lv_tmp SEPARATED BY space.
+      CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+    ENDIF.
+ 
+    CONCATENATE ''author'' is_commit-author
+      INTO lv_tmp SEPARATED BY space.
+    CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+ 
+    CONCATENATE ''committer'' is_commit-committer
+      INTO lv_tmp SEPARATED BY space.
+    CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+ 
+    IF NOT is_commit-gpgsig IS INITIAL.
+      CONCATENATE ''gpgsig'' is_commit-gpgsig
+        INTO lv_tmp SEPARATED BY space.
+      CONCATENATE lv_string lv_tmp INTO lv_string.
+    ENDIF.
+ 
+    CONCATENATE lv_string cl_abap_char_utilities=>newline is_commit-body INTO lv_string.
+ 
+    rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD encode_tag.
+ 
+    DATA: lv_string TYPE string,
+          lv_time   TYPE zcl_abapgit_git_time=>ty_unixtime.
+ 
+    lv_time = zcl_abapgit_git_time=>get_unix( ).
+ 
+    lv_string = |object { is_tag-object }{ cl_abap_char_utilities=>newline }|
+             && |type { is_tag-type }{ cl_abap_char_utilities=>newline }|
+             && |tag { zcl_abapgit_git_tag=>remove_tag_prefix( is_tag-tag ) }{ cl_abap_char_utilities=>newline }|
+             && |tagger { is_tag-tagger_name } <{ is_tag-tagger_email }> { lv_time }|
+             && |{ cl_abap_char_utilities=>newline }|
+             && |{ cl_abap_char_utilities=>newline }|
+             && |{ is_tag-message }|.
+ 
+    rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD encode_tree.
+ 
+    CONSTANTS: lc_null TYPE x VALUE ''00''.
+ 
+    DATA: lv_string  TYPE string,
+          lt_nodes   LIKE it_nodes,
+          lv_hex20   TYPE x LENGTH 20,
+          lv_xstring TYPE xstring.
+ 
+    FIELD-SYMBOLS: <ls_node> LIKE LINE OF it_nodes.
+ 
+ 
+    lt_nodes = sort_tree( it_nodes ).
+ 
+    LOOP AT lt_nodes ASSIGNING <ls_node>.
+      ASSERT NOT <ls_node>-chmod IS INITIAL.
+      ASSERT NOT <ls_node>-name IS INITIAL.
+      ASSERT NOT <ls_node>-sha1 IS INITIAL.
+ 
+      CONCATENATE <ls_node>-chmod <ls_node>-name INTO lv_string SEPARATED BY space.
+      lv_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+      lv_hex20 = to_upper( <ls_node>-sha1 ).
+      CONCATENATE rv_data lv_xstring lc_null lv_hex20 INTO rv_data IN BYTE MODE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_length.
+ 
+* https://github.com/git/git/blob/master/Documentation/technical/pack-format.txt
+ 
+* n-byte sizeN (as long as MSB is set, each 7-bit)
+*    size0..sizeN form 4+7+7+..+7 bit integer, size0
+*    is the least significant part, and sizeN is the
+*    most significant part.
+ 
+    DATA: lv_x           TYPE x,
+          lv_length_bits TYPE string,
+          lv_bitbyte     TYPE zif_abapgit_git_definitions=>ty_bitbyte.
+ 
+ 
+    lv_x = cv_data(1).
+    lv_bitbyte = zcl_abapgit_convert=>x_to_bitbyte( lv_x ).
+ 
+    cv_data = cv_data+1.
+    lv_length_bits = lv_bitbyte+4.
+ 
+    WHILE lv_bitbyte(1) <> ''0''.
+      lv_x = cv_data(1).
+      lv_bitbyte = zcl_abapgit_convert=>x_to_bitbyte( lv_x ).
+      cv_data = cv_data+1.
+      CONCATENATE lv_bitbyte+1 lv_length_bits INTO lv_length_bits.
+    ENDWHILE.
+ 
+    ev_length = zcl_abapgit_convert=>bitbyte_to_int( lv_length_bits ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_type.
+ 
+    CONSTANTS: lc_mask TYPE x VALUE 112.
+    DATA: lv_xtype TYPE x.
+ 
+    lv_xtype = iv_x BIT-AND lc_mask.
+ 
+    CASE lv_xtype.
+      WHEN 16.
+        rv_type = zif_abapgit_git_definitions=>c_type-commit.
+      WHEN 32.
+        rv_type = zif_abapgit_git_definitions=>c_type-tree.
+      WHEN 48.
+        rv_type = zif_abapgit_git_definitions=>c_type-blob.
+      WHEN 64.
+        rv_type = zif_abapgit_git_definitions=>c_type-tag.
+      WHEN 112.
+        rv_type = zif_abapgit_git_definitions=>c_type-ref_d.
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise( |Todo, unknown git pack type| ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sort_tree.
+ 
+    TYPES: BEGIN OF ty_sort,
+             sort TYPE string,
+             node TYPE ty_node,
+           END OF ty_sort.
+ 
+    DATA: lt_sort TYPE STANDARD TABLE OF ty_sort WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS: <ls_sort> LIKE LINE OF lt_sort,
+                   <ls_node> LIKE LINE OF it_nodes.
+ 
+ 
+    LOOP AT it_nodes ASSIGNING <ls_node>.
+      APPEND INITIAL LINE TO lt_sort ASSIGNING <ls_sort>.
+      IF <ls_node>-chmod = zif_abapgit_git_definitions=>c_chmod-dir.
+        CONCATENATE <ls_node>-name ''/'' INTO <ls_sort>-sort.
+      ELSE.
+        <ls_sort>-sort = <ls_node>-name.
+      ENDIF.
+      <ls_sort>-node = <ls_node>.
+    ENDLOOP.
+ 
+* following has to be done, or unpack will fail on server side
+    SORT lt_sort BY sort ASCENDING.
+ 
+    LOOP AT lt_sort ASSIGNING <ls_sort>.
+      APPEND <ls_sort>-node TO rt_nodes.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD type_and_length.
+ 
+* see http://stefan.saasen.me/articles/git-clone-in-haskell-from-the-bottom-up/#pack_file_objects
+ 
+    DATA: lv_type   TYPE i,
+          lv_length TYPE i,
+          lv_hex    TYPE x LENGTH 1.
+ 
+ 
+    CASE iv_type.
+      WHEN zif_abapgit_git_definitions=>c_type-commit.
+        lv_type = 16.
+      WHEN zif_abapgit_git_definitions=>c_type-tree.
+        lv_type = 32.
+      WHEN zif_abapgit_git_definitions=>c_type-blob.
+        lv_type = 48.
+      WHEN zif_abapgit_git_definitions=>c_type-tag.
+        lv_type = 64.
+      WHEN zif_abapgit_git_definitions=>c_type-ref_d.
+        lv_type = 112.
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise( |Unexpected object type while encoding pack| ).
+    ENDCASE.
+ 
+    lv_length = iv_length.
+ 
+* first byte
+    IF lv_length > 15.
+      lv_hex = 128.
+    ENDIF.
+    lv_hex = lv_hex + lv_type + lv_length MOD 16.
+    rv_xstring = lv_hex.
+    lv_length = lv_length DIV 16.
+ 
+* subsequent bytes
+    WHILE lv_length >= 128.
+      lv_hex = 128 + lv_length MOD 128.
+      CONCATENATE rv_xstring lv_hex INTO rv_xstring IN BYTE MODE.
+      lv_length = lv_length DIV 128.
+    ENDWHILE.
+ 
+* last byte
+    IF lv_length > 0.
+      lv_hex = lv_length.
+      CONCATENATE rv_xstring lv_hex INTO rv_xstring IN BYTE MODE.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zlib_decompress.
+ 
+    DATA: ls_data           TYPE zcl_abapgit_zlib=>ty_decompress,
+          lv_compressed_len TYPE i,
+          lv_adler32        TYPE zif_abapgit_git_definitions=>ty_adler32.
+ 
+ 
+    ls_data = zcl_abapgit_zlib=>decompress( cv_data ).
+    lv_compressed_len = ls_data-compressed_len.
+    cv_decompressed = ls_data-raw.
+ 
+    IF lv_compressed_len IS INITIAL.
+      zcx_abapgit_exception=>raise( |Decompression falied :o/| ).
+    ENDIF.
+ 
+    cv_data = cv_data+lv_compressed_len.
+ 
+    lv_adler32 = zcl_abapgit_hash=>adler32( cv_decompressed ).
+    IF cv_data(4) <> lv_adler32.
+      cv_data = cv_data+1.
+    ENDIF.
+    IF cv_data(4) <> lv_adler32.
+      cv_data = cv_data+1.
+    ENDIF.
+    IF cv_data(4) <> lv_adler32.
+      zcx_abapgit_exception=>raise( |Wrong Adler checksum| ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_PORCELAIN               ', 'CLASS zcl_abapgit_git_porcelain DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_pull_result,
+        files   TYPE zif_abapgit_git_definitions=>ty_files_tt,
+        objects TYPE zif_abapgit_definitions=>ty_objects_tt,
+        commit  TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_pull_result .
+    TYPES:
+      BEGIN OF ty_push_result,
+        new_files     TYPE zif_abapgit_git_definitions=>ty_files_tt,
+        branch        TYPE zif_abapgit_git_definitions=>ty_sha1,
+        updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
+        new_objects   TYPE zif_abapgit_definitions=>ty_objects_tt,
+      END OF ty_push_result .
+ 
+    CLASS-METHODS pull_by_branch
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_branch_name  TYPE string
+        !iv_deepen_level TYPE i DEFAULT 1
+      RETURNING
+        VALUE(rs_result) TYPE ty_pull_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS pull_by_commit
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_commit_hash  TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_deepen_level TYPE i DEFAULT 1
+      RETURNING
+        VALUE(rs_result) TYPE ty_pull_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS push
+      IMPORTING
+        !is_comment      TYPE zif_abapgit_git_definitions=>ty_comment
+        !io_stage        TYPE REF TO zcl_abapgit_stage
+        !it_old_objects  TYPE zif_abapgit_definitions=>ty_objects_tt
+        !iv_parent       TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_url          TYPE string
+        !iv_branch_name  TYPE string
+      RETURNING
+        VALUE(rs_result) TYPE ty_push_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_branch
+      IMPORTING
+        !iv_url  TYPE string
+        !iv_name TYPE string
+        !iv_from TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_tag
+      IMPORTING
+        !iv_url TYPE string
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_branch
+      IMPORTING
+        !iv_url    TYPE string
+        !is_branch TYPE zif_abapgit_git_definitions=>ty_git_branch
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_tag
+      IMPORTING
+        !iv_url TYPE string
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS full_tree
+      IMPORTING
+        !it_objects        TYPE zif_abapgit_definitions=>ty_objects_tt
+        !iv_parent         TYPE zif_abapgit_git_definitions=>ty_sha1
+      RETURNING
+        VALUE(rt_expanded) TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_tree,
+        path TYPE string,
+        data TYPE xstring,
+        sha1 TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_tree .
+    TYPES:
+      ty_trees_tt TYPE STANDARD TABLE OF ty_tree WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_folder,
+        path  TYPE string,
+        count TYPE i,
+        sha1  TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_folder .
+    TYPES:
+      ty_folders_tt TYPE STANDARD TABLE OF ty_folder WITH DEFAULT KEY .
+ 
+    CONSTANTS c_zero TYPE zif_abapgit_git_definitions=>ty_sha1
+      VALUE ''0000000000000000000000000000000000000000'' ##NO_TEXT.
+ 
+    CLASS-METHODS build_trees
+      IMPORTING
+        !it_expanded    TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+      RETURNING
+        VALUE(rt_trees) TYPE ty_trees_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS find_folders
+      IMPORTING
+        !it_expanded      TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+      RETURNING
+        VALUE(rt_folders) TYPE ty_folders_tt .
+    CLASS-METHODS pull
+      IMPORTING
+        !iv_commit      TYPE zif_abapgit_git_definitions=>ty_sha1
+        !it_objects     TYPE zif_abapgit_definitions=>ty_objects_tt
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS walk
+      IMPORTING
+        !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+        !iv_sha1    TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_path    TYPE string
+      CHANGING
+        !ct_files   TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS walk_tree
+      IMPORTING
+        !it_objects        TYPE zif_abapgit_definitions=>ty_objects_tt
+        !iv_tree           TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_base           TYPE string
+      RETURNING
+        VALUE(rt_expanded) TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS receive_pack_push
+      IMPORTING
+        !is_comment     TYPE zif_abapgit_git_definitions=>ty_comment
+        !it_trees       TYPE ty_trees_tt
+        !it_blobs       TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !iv_parent      TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_parent2     TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL
+        !iv_url         TYPE string
+        !iv_branch_name TYPE string
+      EXPORTING
+        !ev_new_commit  TYPE zif_abapgit_git_definitions=>ty_sha1
+        !et_new_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+        !ev_new_tree    TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_annotated_tag
+      IMPORTING
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_lightweight_tag
+      IMPORTING
+        is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+        iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_annotated_tag
+      IMPORTING
+        !iv_url TYPE string
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_lightweight_tag
+      IMPORTING
+        !iv_url TYPE string
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS empty_packfile
+      RETURNING
+        VALUE(rv_pack) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_porcelain IMPLEMENTATION.
+ 
+ 
+  METHOD build_trees.
+ 
+    DATA: lt_nodes   TYPE zcl_abapgit_git_pack=>ty_nodes_tt,
+          ls_tree    LIKE LINE OF rt_trees,
+          lv_len     TYPE i,
+          lt_folders TYPE ty_folders_tt.
+ 
+    FIELD-SYMBOLS: <ls_folder> LIKE LINE OF lt_folders,
+                   <ls_node>   LIKE LINE OF lt_nodes,
+                   <ls_sub>    LIKE LINE OF lt_folders,
+                   <ls_exp>    LIKE LINE OF it_expanded.
+ 
+ 
+    lt_folders = find_folders( it_expanded ).
+ 
+* start with the deepest folders
+    SORT lt_folders BY count DESCENDING.
+ 
+    LOOP AT lt_folders ASSIGNING <ls_folder>.
+      CLEAR lt_nodes.
+ 
+* files
+      LOOP AT it_expanded ASSIGNING <ls_exp> WHERE path = <ls_folder>-path.
+        APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
+        <ls_node>-chmod = <ls_exp>-chmod.
+        <ls_node>-name  = <ls_exp>-name.
+        <ls_node>-sha1  = <ls_exp>-sha1.
+      ENDLOOP.
+ 
+* folders
+      LOOP AT lt_folders ASSIGNING <ls_sub> WHERE count = <ls_folder>-count + 1.
+        lv_len = strlen( <ls_folder>-path ).
+        IF strlen( <ls_sub>-path ) > lv_len AND <ls_sub>-path(lv_len) = <ls_folder>-path.
+          APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
+          <ls_node>-chmod = zif_abapgit_git_definitions=>c_chmod-dir.
+ 
+* extract folder name, this can probably be done easier using regular expressions
+          <ls_node>-name = <ls_sub>-path+lv_len.
+          lv_len = strlen( <ls_node>-name ) - 1.
+          <ls_node>-name = <ls_node>-name(lv_len).
+ 
+          <ls_node>-sha1 = <ls_sub>-sha1.
+        ENDIF.
+      ENDLOOP.
+ 
+      CLEAR ls_tree.
+      ls_tree-path = <ls_folder>-path.
+      ls_tree-data = zcl_abapgit_git_pack=>encode_tree( lt_nodes ).
+      ls_tree-sha1 = zcl_abapgit_hash=>sha1_tree( ls_tree-data ).
+      APPEND ls_tree TO rt_trees.
+ 
+      <ls_folder>-sha1 = ls_tree-sha1.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_annotated_tag.
+ 
+    DATA: lv_tag          TYPE xstring,
+          lt_objects      TYPE zif_abapgit_definitions=>ty_objects_tt,
+          lv_pack         TYPE xstring,
+          ls_object       LIKE LINE OF lt_objects,
+          ls_tag          TYPE zcl_abapgit_git_pack=>ty_tag,
+          lv_new_tag_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1.
+ 
+* new tag
+    ls_tag-object       = is_tag-sha1.
+    ls_tag-type         = zif_abapgit_git_definitions=>c_type-commit.
+    ls_tag-tag          = is_tag-name.
+    ls_tag-tagger_name  = is_tag-tagger_name.
+    ls_tag-tagger_email = is_tag-tagger_email.
+    ls_tag-message      = is_tag-message
+                      && |{ cl_abap_char_utilities=>newline }|
+                      && |{ cl_abap_char_utilities=>newline }|
+                      && is_tag-body.
+ 
+    lv_tag = zcl_abapgit_git_pack=>encode_tag( ls_tag ).
+ 
+    lv_new_tag_sha1 = zcl_abapgit_hash=>sha1_tag( lv_tag ).
+ 
+    ls_object-sha1  = lv_new_tag_sha1.
+    ls_object-type  = zif_abapgit_git_definitions=>c_type-tag.
+    ls_object-data  = lv_tag.
+    ls_object-index = 1.
+    APPEND ls_object TO lt_objects.
+ 
+    lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = c_zero
+      iv_new         = lv_new_tag_sha1
+      iv_branch_name = is_tag-name
+      iv_pack        = lv_pack ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_branch.
+ 
+    IF iv_name CS \` \`.
+      zcx_abapgit_exception=>raise( ''Branch name cannot contain blank spaces'' ).
+    ENDIF.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = c_zero
+      iv_new         = iv_from
+      iv_branch_name = iv_name
+      iv_pack        = empty_packfile( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_lightweight_tag.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = c_zero
+      iv_new         = is_tag-sha1
+      iv_branch_name = is_tag-name
+      iv_pack        = empty_packfile( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_tag.
+ 
+    IF is_tag-name CS \` \`.
+      zcx_abapgit_exception=>raise( ''Tag name cannot contain blank spaces'' ).
+    ENDIF.
+ 
+    CASE is_tag-type.
+      WHEN zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag.
+ 
+        create_annotated_tag(
+          is_tag = is_tag
+          iv_url = iv_url ).
+ 
+      WHEN zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag.
+ 
+        create_lightweight_tag(
+          is_tag = is_tag
+          iv_url = iv_url ).
+ 
+      WHEN OTHERS.
+ 
+        zcx_abapgit_exception=>raise( |Invalid tag type: { is_tag-type }| ).
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_annotated_tag.
+ 
+    DATA:
+      lo_branches TYPE REF TO zcl_abapgit_git_branch_list,
+      lv_tag      TYPE string,
+      ls_tag      TYPE zif_abapgit_git_definitions=>ty_git_branch,
+      lt_tags     TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt.
+ 
+    " For annotated tags, find the correct commit
+    lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
+    lt_tags     = lo_branches->get_tags_only( ).
+    lv_tag      = zcl_abapgit_git_tag=>remove_peel( is_tag-name ).
+ 
+    READ TABLE lt_tags INTO ls_tag WITH KEY name_key COMPONENTS name = lv_tag.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Annotated tag { lv_tag } not found| ).
+    ENDIF.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = ls_tag-sha1
+      iv_new         = c_zero
+      iv_branch_name = ls_tag-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_branch.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = is_branch-sha1
+      iv_new         = c_zero
+      iv_branch_name = is_branch-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_lightweight_tag.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = is_tag-sha1
+      iv_new         = c_zero
+      iv_branch_name = is_tag-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_tag.
+ 
+    IF is_tag-name CS zif_abapgit_git_definitions=>c_git_branch-peel.
+ 
+      delete_annotated_tag(
+        is_tag = is_tag
+        iv_url = iv_url ).
+ 
+    ELSE.
+ 
+      delete_lightweight_tag(
+        is_tag = is_tag
+        iv_url = iv_url ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD empty_packfile.
+ 
+    " For avoiding "client MUST send an empty packfile" error
+    " https://github.com/git/git/blob/master/Documentation/gitprotocol-pack.txt#L595-L599
+ 
+    DATA lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt.
+ 
+    rv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_folders.
+ 
+    DATA: lt_paths TYPE TABLE OF string,
+          lv_split TYPE string,
+          lv_path  TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_folder> LIKE LINE OF rt_folders,
+                   <ls_new>    LIKE LINE OF rt_folders,
+                   <ls_exp>    LIKE LINE OF it_expanded.
+ 
+ 
+    LOOP AT it_expanded ASSIGNING <ls_exp>.
+      READ TABLE rt_folders WITH KEY path = <ls_exp>-path TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        APPEND INITIAL LINE TO rt_folders ASSIGNING <ls_folder>.
+        <ls_folder>-path = <ls_exp>-path.
+      ENDIF.
+    ENDLOOP.
+ 
+* add empty folders
+    LOOP AT rt_folders ASSIGNING <ls_folder>.
+      SPLIT <ls_folder>-path AT ''/'' INTO TABLE lt_paths.
+ 
+      CLEAR lv_path.
+      LOOP AT lt_paths INTO lv_split.
+        CONCATENATE lv_path lv_split ''/'' INTO lv_path.
+        READ TABLE rt_folders WITH KEY path = lv_path TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          APPEND INITIAL LINE TO rt_folders ASSIGNING <ls_new>.
+          <ls_new>-path = lv_path.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    LOOP AT rt_folders ASSIGNING <ls_folder>.
+      FIND ALL OCCURRENCES OF ''/'' IN <ls_folder>-path MATCH COUNT <ls_folder>-count.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD full_tree.
+ 
+    DATA: ls_object LIKE LINE OF it_objects,
+          ls_commit TYPE zcl_abapgit_git_pack=>ty_commit.
+ 
+    READ TABLE it_objects INTO ls_object
+      WITH KEY type COMPONENTS
+        type = zif_abapgit_git_definitions=>c_type-commit
+        sha1 = iv_parent.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''commit not found'' ).
+    ENDIF.
+    ls_commit = zcl_abapgit_git_pack=>decode_commit( ls_object-data ).
+ 
+    rt_expanded = walk_tree( it_objects = it_objects
+                             iv_tree    = ls_commit-tree
+                             iv_base    = ''/'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pull.
+ 
+    DATA: ls_object TYPE zif_abapgit_definitions=>ty_object,
+          ls_commit TYPE zcl_abapgit_git_pack=>ty_commit.
+ 
+    READ TABLE it_objects INTO ls_object
+      WITH KEY type COMPONENTS
+        type = zif_abapgit_git_definitions=>c_type-commit
+        sha1 = iv_commit.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Commit/Branch not found.'' ).
+    ENDIF.
+ 
+    ls_commit = zcl_abapgit_git_pack=>decode_commit( ls_object-data ).
+ 
+    walk( EXPORTING it_objects = it_objects
+                    iv_sha1    = ls_commit-tree
+                    iv_path    = ''/''
+          CHANGING  ct_files   = rt_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pull_by_branch.
+ 
+    zcl_abapgit_git_transport=>upload_pack_by_branch(
+      EXPORTING
+        iv_url          = iv_url
+        iv_branch_name  = iv_branch_name
+        iv_deepen_level = iv_deepen_level
+      IMPORTING
+        et_objects      = rs_result-objects
+        ev_branch       = rs_result-commit ).
+ 
+    rs_result-files = pull( iv_commit  = rs_result-commit
+                            it_objects = rs_result-objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pull_by_commit.
+ 
+    zcl_abapgit_git_transport=>upload_pack_by_commit(
+      EXPORTING
+        iv_url          = iv_url
+        iv_hash         = iv_commit_hash
+        iv_deepen_level = iv_deepen_level
+      IMPORTING
+        et_objects      = rs_result-objects
+        ev_commit       = rs_result-commit ).
+ 
+    rs_result-files = pull( iv_commit  = rs_result-commit
+                            it_objects = rs_result-objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push.
+ 
+    DATA: lt_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt,
+          lt_blobs    TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lv_sha1     TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_new_tree TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lt_trees    TYPE ty_trees_tt,
+          lt_stage    TYPE zif_abapgit_definitions=>ty_stage_tt.
+ 
+    FIELD-SYMBOLS: <ls_stage>   LIKE LINE OF lt_stage,
+                   <ls_updated> LIKE LINE OF rs_result-updated_files,
+                   <ls_exp>     LIKE LINE OF lt_expanded.
+ 
+    lt_expanded = full_tree( it_objects = it_old_objects
+                             iv_parent  = iv_parent ).
+ 
+    lt_stage = io_stage->get_all( ).
+    LOOP AT lt_stage ASSIGNING <ls_stage>.
+ 
+      " Save file ref to updated files table
+      APPEND INITIAL LINE TO rs_result-updated_files ASSIGNING <ls_updated>.
+      MOVE-CORRESPONDING <ls_stage>-file TO <ls_updated>.
+ 
+      CASE <ls_stage>-method.
+        WHEN zif_abapgit_definitions=>c_method-add.
+ 
+          APPEND <ls_stage>-file TO lt_blobs.
+ 
+          READ TABLE lt_expanded ASSIGNING <ls_exp> WITH KEY
+            name = <ls_stage>-file-filename
+            path = <ls_stage>-file-path.
+          IF sy-subrc <> 0. " new files
+            APPEND INITIAL LINE TO lt_expanded ASSIGNING <ls_exp>.
+            <ls_exp>-name  = <ls_stage>-file-filename.
+            <ls_exp>-path  = <ls_stage>-file-path.
+            <ls_exp>-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+          ENDIF.
+ 
+          lv_sha1 = zcl_abapgit_hash=>sha1_blob( <ls_stage>-file-data ).
+          IF <ls_exp>-sha1 <> lv_sha1.
+            <ls_exp>-sha1 = lv_sha1.
+          ENDIF.
+ 
+          <ls_updated>-sha1 = lv_sha1.   "New sha1
+ 
+        WHEN zif_abapgit_definitions=>c_method-rm.
+          DELETE lt_expanded
+            WHERE name = <ls_stage>-file-filename
+            AND path = <ls_stage>-file-path.
+          ASSERT sy-subrc = 0.
+ 
+          CLEAR <ls_updated>-sha1.       " Mark as deleted
+ 
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( ''stage method not supported, todo'' ).
+      ENDCASE.
+    ENDLOOP.
+ 
+    lt_trees = build_trees( lt_expanded ).
+ 
+    receive_pack_push(
+      EXPORTING
+        is_comment     = is_comment
+        it_trees       = lt_trees
+        iv_branch_name = iv_branch_name
+        iv_url         = iv_url
+        iv_parent      = iv_parent
+        iv_parent2     = io_stage->get_merge_source( )
+        it_blobs       = lt_blobs
+      IMPORTING
+        ev_new_commit  = rs_result-branch
+        et_new_objects = rs_result-new_objects
+        ev_new_tree    = lv_new_tree ).
+ 
+    APPEND LINES OF it_old_objects TO rs_result-new_objects.
+ 
+    walk( EXPORTING it_objects = rs_result-new_objects
+                    iv_sha1    = lv_new_tree
+                    iv_path    = ''/''
+          CHANGING  ct_files   = rs_result-new_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD receive_pack_push.
+ 
+    DATA: lv_time   TYPE zcl_abapgit_git_time=>ty_unixtime,
+          lv_commit TYPE xstring,
+          lv_pack   TYPE xstring,
+          ls_object LIKE LINE OF et_new_objects,
+          ls_commit TYPE zcl_abapgit_git_pack=>ty_commit,
+          lv_uindex TYPE sy-index.
+ 
+    FIELD-SYMBOLS: <ls_tree> LIKE LINE OF it_trees,
+                   <ls_blob> LIKE LINE OF it_blobs.
+ 
+ 
+    lv_time = zcl_abapgit_git_time=>get_unix( ).
+ 
+    READ TABLE it_trees ASSIGNING <ls_tree> WITH KEY path = ''/''.
+    ASSERT sy-subrc = 0.
+ 
+* new commit
+    ls_commit-committer = |{ is_comment-committer-name
+      } <{ is_comment-committer-email }> { lv_time }|.
+    IF is_comment-author-name IS NOT INITIAL.
+      ls_commit-author = |{ is_comment-author-name
+        } <{ is_comment-author-email }> { lv_time }|.
+    ELSE.
+      ls_commit-author = ls_commit-committer.
+    ENDIF.
+ 
+    ls_commit-tree      = <ls_tree>-sha1.
+    ls_commit-parent    = iv_parent.
+    ls_commit-parent2   = iv_parent2.
+    ls_commit-body      = is_comment-comment.
+    lv_commit = zcl_abapgit_git_pack=>encode_commit( ls_commit ).
+ 
+    ls_object-sha1 = zcl_abapgit_hash=>sha1_commit( lv_commit ).
+    ls_object-type = zif_abapgit_git_definitions=>c_type-commit.
+    ls_object-data = lv_commit.
+    APPEND ls_object TO et_new_objects.
+ 
+    LOOP AT it_trees ASSIGNING <ls_tree>.
+      CLEAR ls_object.
+      ls_object-sha1 = <ls_tree>-sha1.
+ 
+      READ TABLE et_new_objects
+        WITH KEY type COMPONENTS
+          type = zif_abapgit_git_definitions=>c_type-tree
+          sha1 = ls_object-sha1
+        TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+* two identical trees added at the same time, only add one to the pack
+        CONTINUE.
+      ENDIF.
+ 
+      ls_object-type = zif_abapgit_git_definitions=>c_type-tree.
+      ls_object-data = <ls_tree>-data.
+      lv_uindex = lv_uindex + 1.
+      ls_object-index = lv_uindex.
+      APPEND ls_object TO et_new_objects.
+    ENDLOOP.
+ 
+    LOOP AT it_blobs ASSIGNING <ls_blob>.
+      CLEAR ls_object.
+      ls_object-sha1 = zcl_abapgit_hash=>sha1_blob( <ls_blob>-data ).
+ 
+      READ TABLE et_new_objects
+        WITH KEY type COMPONENTS
+          type = zif_abapgit_git_definitions=>c_type-blob
+          sha1 = ls_object-sha1
+        TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+* two identical files added at the same time, only add one blob to the pack
+        CONTINUE.
+      ENDIF.
+ 
+      ls_object-type = zif_abapgit_git_definitions=>c_type-blob.
+* note <ls_blob>-data can be empty, #1857 allow empty files - some more checks needed?
+      ls_object-data = <ls_blob>-data.
+      lv_uindex = lv_uindex + 1.
+      ls_object-index = lv_uindex.
+      APPEND ls_object TO et_new_objects.
+    ENDLOOP.
+ 
+    lv_pack = zcl_abapgit_git_pack=>encode( et_new_objects ).
+ 
+    ev_new_commit = zcl_abapgit_hash=>sha1_commit( lv_commit ).
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = iv_parent
+      iv_new         = ev_new_commit
+      iv_branch_name = iv_branch_name
+      iv_pack        = lv_pack ).
+ 
+    ev_new_tree = ls_commit-tree.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD walk.
+ 
+    DATA: lv_path  TYPE string,
+          ls_file  LIKE LINE OF ct_files,
+          lt_nodes TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    FIELD-SYMBOLS: <ls_tree> LIKE LINE OF it_objects,
+                   <ls_blob> LIKE LINE OF it_objects,
+                   <ls_node> LIKE LINE OF lt_nodes.
+ 
+ 
+    READ TABLE it_objects ASSIGNING <ls_tree>
+      WITH KEY type COMPONENTS
+        type = zif_abapgit_git_definitions=>c_type-tree
+        sha1 = iv_sha1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Walk, tree not found'' ).
+    ENDIF.
+ 
+    lt_nodes = zcl_abapgit_git_pack=>decode_tree( <ls_tree>-data ).
+ 
+    LOOP AT lt_nodes ASSIGNING <ls_node>.
+      IF <ls_node>-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+        READ TABLE it_objects ASSIGNING <ls_blob>
+          WITH KEY type COMPONENTS
+            type = zif_abapgit_git_definitions=>c_type-blob
+            sha1 = <ls_node>-sha1.
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise( ''Walk, blob not found'' ).
+        ENDIF.
+ 
+        CLEAR ls_file.
+        ls_file-path     = iv_path.
+        ls_file-filename = <ls_node>-name.
+        ls_file-data     = <ls_blob>-data.
+        ls_file-sha1     = <ls_blob>-sha1.
+        APPEND ls_file TO ct_files.
+      ENDIF.
+    ENDLOOP.
+ 
+    LOOP AT lt_nodes ASSIGNING <ls_node> WHERE chmod = zif_abapgit_git_definitions=>c_chmod-dir.
+      CONCATENATE iv_path <ls_node>-name ''/'' INTO lv_path.
+ 
+      walk( EXPORTING it_objects = it_objects
+                      iv_sha1    = <ls_node>-sha1
+                      iv_path    = lv_path
+            CHANGING  ct_files   = ct_files ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD walk_tree.
+ 
+    DATA: ls_object   LIKE LINE OF it_objects,
+          lt_expanded LIKE rt_expanded,
+          lt_nodes    TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    FIELD-SYMBOLS: <ls_exp>  LIKE LINE OF rt_expanded,
+                   <ls_node> LIKE LINE OF lt_nodes.
+ 
+ 
+    READ TABLE it_objects INTO ls_object
+      WITH KEY type COMPONENTS
+        type = zif_abapgit_git_definitions=>c_type-tree
+        sha1 = iv_tree.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''tree not found'' ).
+    ENDIF.
+    lt_nodes = zcl_abapgit_git_pack=>decode_tree( ls_object-data ).
+ 
+    LOOP AT lt_nodes ASSIGNING <ls_node>.
+      CASE <ls_node>-chmod.
+        WHEN zif_abapgit_git_definitions=>c_chmod-file
+            OR zif_abapgit_git_definitions=>c_chmod-executable
+            OR zif_abapgit_git_definitions=>c_chmod-submodule.
+          APPEND INITIAL LINE TO rt_expanded ASSIGNING <ls_exp>.
+          <ls_exp>-path  = iv_base.
+          <ls_exp>-name  = <ls_node>-name.
+          <ls_exp>-sha1  = <ls_node>-sha1.
+          <ls_exp>-chmod = <ls_node>-chmod.
+        WHEN zif_abapgit_git_definitions=>c_chmod-dir.
+          lt_expanded = walk_tree(
+            it_objects = it_objects
+            iv_tree    = <ls_node>-sha1
+            iv_base    = iv_base && <ls_node>-name && ''/'' ).
+          APPEND LINES OF lt_expanded TO rt_expanded.
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( ''walk_tree: unknown chmod'' ).
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_TAG                     ', 'CLASS zcl_abapgit_git_tag DEFINITION
+  PUBLIC
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS add_tag_prefix
+      IMPORTING
+        !iv_text       TYPE csequence
+      RETURNING
+        VALUE(rv_text) TYPE string.
+ 
+    CLASS-METHODS remove_tag_prefix
+      IMPORTING
+        !iv_text       TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string.
+ 
+    CLASS-METHODS add_peel
+      IMPORTING
+        !iv_text       TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string.
+ 
+    CLASS-METHODS remove_peel
+      IMPORTING
+        !iv_text       TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_tag IMPLEMENTATION.
+ 
+ 
+  METHOD add_peel.
+ 
+    rv_text = iv_text && zif_abapgit_git_definitions=>c_git_branch-peel.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_tag_prefix.
+ 
+    rv_text = zif_abapgit_git_definitions=>c_git_branch-tags_prefix && iv_text.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_peel.
+ 
+    rv_text = iv_text.
+ 
+    REPLACE zif_abapgit_git_definitions=>c_git_branch-peel IN rv_text WITH ''''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_tag_prefix.
+ 
+    rv_text = iv_text.
+ 
+    REPLACE FIRST OCCURRENCE OF zif_abapgit_git_definitions=>c_git_branch-tags_prefix
+            IN rv_text
+            WITH ''''.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_TIME                    ', 'CLASS zcl_abapgit_git_time DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      ty_unixtime TYPE c LENGTH 16 .
+ 
+    CLASS-METHODS get_unix
+      RETURNING
+        VALUE(rv_time) TYPE ty_unixtime
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_utc
+      IMPORTING
+        !iv_unix TYPE ty_unixtime
+      EXPORTING
+        !ev_date TYPE sy-datum
+        !ev_time TYPE sy-uzeit .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_time IMPLEMENTATION.
+ 
+ 
+  METHOD get_unix.
+* returns seconds since unix epoch, including timezone indicator
+ 
+    CONSTANTS lc_epoch TYPE timestamp VALUE ''19700101000000''.
+    DATA lv_time TYPE timestamp.
+    DATA lv_seconds TYPE i.
+ 
+    GET TIME STAMP FIELD lv_time.
+ 
+    lv_seconds = cl_abap_tstmp=>subtract(
+      tstmp1 = lv_time
+      tstmp2 = lc_epoch ).
+ 
+    rv_time = lv_seconds.
+    CONDENSE rv_time.
+    rv_time+11 = ''+000000''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_utc.
+ 
+    CONSTANTS lc_epoch TYPE d VALUE ''19700101''.
+ 
+    DATA: lv_i       TYPE i,
+          lv_utcdiff TYPE t,
+          lv_utcsign TYPE c LENGTH 1.
+ 
+ 
+    lv_i = iv_unix(10).
+    lv_utcsign = iv_unix+11.
+    lv_utcdiff = iv_unix+12.
+ 
+    " GMT + time-zone
+    CASE lv_utcsign.
+      WHEN ''+''.
+        lv_i = lv_i + lv_utcdiff.
+      WHEN ''-''.
+        lv_i = lv_i - lv_utcdiff.
+    ENDCASE.
+ 
+    ev_time = lv_i MOD 86400.
+    lv_i = lv_i - ev_time.
+    lv_i = lv_i / 86400.
+    ev_date = lv_i + lc_epoch.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_TRANSPORT               ', 'CLASS zcl_abapgit_git_transport DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+* remote to local
+    CLASS-METHODS upload_pack_by_branch
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_branch_name  TYPE string
+        !iv_deepen_level TYPE i DEFAULT 1
+        !it_branches     TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt OPTIONAL
+      EXPORTING
+        !et_objects      TYPE zif_abapgit_definitions=>ty_objects_tt
+        !ev_branch       TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS upload_pack_by_commit
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_hash         TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL
+        !iv_deepen_level TYPE i DEFAULT 0
+      EXPORTING
+        !et_objects      TYPE zif_abapgit_definitions=>ty_objects_tt
+        !ev_commit       TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+* local to remote
+    CLASS-METHODS receive_pack
+      IMPORTING
+        !iv_url         TYPE string
+        !iv_old         TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_new         TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_branch_name TYPE string
+        !iv_pack        TYPE xstring OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS branches
+      IMPORTING
+        !iv_url               TYPE string
+      RETURNING
+        VALUE(ro_branch_list) TYPE REF TO zcl_abapgit_git_branch_list
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_service,
+        receive TYPE string VALUE ''receive'',                  "#EC NOTEXT
+        upload  TYPE string VALUE ''upload'',                   "#EC NOTEXT
+      END OF c_service .
+ 
+    CLASS-METHODS check_report_status
+      IMPORTING
+        !iv_string TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS branch_list
+      IMPORTING
+        !iv_url         TYPE string
+        !iv_service     TYPE string
+      EXPORTING
+        !eo_client      TYPE REF TO zcl_abapgit_http_client
+        !eo_branch_list TYPE REF TO zcl_abapgit_git_branch_list
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS find_branch
+      IMPORTING
+        !iv_url         TYPE string
+        !iv_service     TYPE string
+        !iv_branch_name TYPE string
+      EXPORTING
+        !eo_client      TYPE REF TO zcl_abapgit_http_client
+        !ev_branch      TYPE zif_abapgit_git_definitions=>ty_sha1
+        !eo_branch_list TYPE REF TO zcl_abapgit_git_branch_list
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS parse
+      EXPORTING
+        !ev_pack TYPE xstring
+      CHANGING
+        !cv_data TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS upload_pack
+      IMPORTING
+        !io_client        TYPE REF TO zcl_abapgit_http_client
+        !iv_url           TYPE string
+        !iv_deepen_level  TYPE i DEFAULT 0
+        !it_hashes        TYPE zif_abapgit_git_definitions=>ty_sha1_tt
+      RETURNING
+        VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_transport IMPLEMENTATION.
+ 
+ 
+  METHOD branches.
+ 
+    DATA: lo_client TYPE REF TO zcl_abapgit_http_client.
+ 
+ 
+    branch_list(
+      EXPORTING
+        iv_url         = iv_url
+        iv_service     = c_service-upload
+      IMPORTING
+        eo_client      = lo_client
+        eo_branch_list = ro_branch_list ).
+ 
+    lo_client->close( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD branch_list.
+ 
+    CONSTANTS lc_content_regex TYPE string VALUE ''^[0-9a-f]{4}#''.
+    CONSTANTS lc_content_type  TYPE string VALUE ''application/x-git-<service>-pack-advertisement''.
+ 
+    DATA: lv_data TYPE string.
+    DATA: lv_expected_content_type TYPE string.
+ 
+    eo_client = zcl_abapgit_http=>create_by_url(
+      iv_url     = iv_url
+      iv_service = iv_service ).
+ 
+    lv_expected_content_type = lc_content_type.
+    REPLACE ''<service>'' IN lv_expected_content_type WITH iv_service.
+ 
+    eo_client->check_smart_response(
+        iv_expected_content_type = lv_expected_content_type
+        iv_content_regex         = lc_content_regex ).
+ 
+    lv_data = eo_client->get_cdata( ).
+ 
+    CREATE OBJECT eo_branch_list
+      EXPORTING
+        iv_data = lv_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_report_status.
+ 
+    DATA:
+      lv_string        TYPE string,
+      lv_error         TYPE string,
+      lv_unpack_status TYPE string,
+      lv_unpack_code   TYPE string,
+      lv_unpack_text   TYPE string,
+      lv_commnd_status TYPE string,
+      lv_commnd_code   TYPE string,
+      lv_commnd_text   TYPE string.
+ 
+    " Based on https://git-scm.com/docs/pack-protocol/2.2.3#_report_status
+    lv_string = iv_string.
+ 
+    IF lv_string = ''''.
+      lv_error = ''Unexpected empty reply''.
+    ELSEIF strlen( lv_string ) < 4.
+      lv_error = ''Missing pkt length for unpack status''.
+    ELSE.
+      lv_string = lv_string+4.
+      SPLIT lv_string AT cl_abap_char_utilities=>newline INTO lv_unpack_status lv_string.
+      SPLIT lv_unpack_status AT space INTO lv_unpack_text lv_unpack_code.
+ 
+      IF lv_unpack_text <> ''unpack''.
+        lv_error = ''Unexpected unpack status''.
+      ELSEIF lv_unpack_code <> ''ok''.
+        lv_error = |Unpack not ok ({ lv_unpack_code })|.
+      ELSEIF lv_string = ''''.
+        lv_error = ''Unexpected command status''.
+      ELSEIF strlen( lv_string ) < 4.
+        lv_error = ''Missing pkt length for command status''.
+      ELSE.
+        lv_string = lv_string+4.
+        SPLIT lv_string AT cl_abap_char_utilities=>newline INTO lv_commnd_status lv_string.
+        SPLIT lv_commnd_status AT space INTO lv_commnd_code lv_commnd_text.
+ 
+        IF lv_commnd_code <> ''ok''. "=ng
+          " Some pre-defined error messages
+          IF lv_commnd_text CP ''*pre-receive hook declined*''.
+            lv_error = ''Pre-receive hook declined''.
+          ELSEIF lv_commnd_text CP ''*protected branch hook declined*''.
+            lv_error = ''Protected branch hook declined''.
+          ELSEIF lv_commnd_text CP ''*push declined due to email privacy*''.
+            lv_error = ''Push declined due to email privacy''.
+          ELSEIF lv_commnd_text CP ''*funny refname*''.
+            lv_error = ''Funny refname''.
+          ELSEIF lv_commnd_text CP ''*failed to update ref*''.
+            lv_error = ''Failed to update ref''.
+          ELSEIF lv_commnd_text CP ''*missing necessary objects*''.
+            lv_error = ''Missing necessary objects''.
+          ELSEIF lv_commnd_text CP ''*refusing to delete the current branch*''.
+            lv_error = ''Branch delete not allowed''.
+          ELSEIF lv_commnd_text CP ''*cannot lock ref*reference already exists*''.
+            lv_error = ''Branch already exists''.
+          ELSEIF lv_commnd_text CP ''*cannot lock ref*but expected*''.
+            lv_error = ''Branch cannot be locked''.
+          ELSEIF lv_commnd_text CP ''*invalid committer*''.
+            lv_error = ''Invalid committer''.
+          ELSE.
+            " Otherwise return full error message
+            lv_error = lv_commnd_text.
+          ENDIF.
+        ELSEIF strlen( lv_string ) < 4.
+          lv_error = ''Missing flush-pkt''.
+        ELSEIF lv_string <> ''0000'' AND lv_string <> ''00000000''.
+          " We update only one reference at a time so this should be the end
+          lv_error = ''Unexpected end of status (flush-pkt)''.
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+    IF lv_error IS NOT INITIAL.
+      zcx_abapgit_exception=>raise( |Git protocol error: { lv_error }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_branch.
+ 
+    branch_list(
+      EXPORTING
+        iv_url          = iv_url
+        iv_service      = iv_service
+      IMPORTING
+        eo_client       = eo_client
+        eo_branch_list  = eo_branch_list ).
+ 
+    IF ev_branch IS SUPPLIED.
+      ev_branch = eo_branch_list->find_by_name( iv_branch_name )-sha1.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    CONSTANTS: lc_band1 TYPE x VALUE ''01''.
+ 
+    DATA: lv_len      TYPE i,
+          lv_contents TYPE xstring,
+          lv_pack     TYPE xstring.
+ 
+ 
+    WHILE xstrlen( cv_data ) >= 4.
+      lv_len = zcl_abapgit_git_utils=>length_utf8_hex( cv_data ).
+ 
+      IF lv_len > xstrlen( cv_data ).
+        zcx_abapgit_exception=>raise( ''parse, string length too large'' ).
+      ENDIF.
+ 
+      lv_contents = cv_data(lv_len).
+      IF lv_len = 0.
+        cv_data = cv_data+4.
+        CONTINUE.
+      ELSE.
+        cv_data = cv_data+lv_len.
+      ENDIF.
+ 
+      lv_contents = lv_contents+4.
+ 
+      IF xstrlen( lv_contents ) > 1 AND lv_contents(1) = lc_band1.
+        CONCATENATE lv_pack lv_contents+1 INTO lv_pack IN BYTE MODE.
+      ENDIF.
+ 
+    ENDWHILE.
+ 
+    ev_pack = lv_pack.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD receive_pack.
+ 
+    DATA: lo_client   TYPE REF TO zcl_abapgit_http_client,
+          lv_cmd_pkt  TYPE string,
+          lv_line     TYPE string,
+          lv_tmp      TYPE xstring,
+          lv_xstring  TYPE xstring,
+          lv_string   TYPE string,
+          lv_cap_list TYPE string,
+          lv_buffer   TYPE string.
+ 
+ 
+    find_branch(
+      EXPORTING
+        iv_url         = iv_url
+        iv_service     = c_service-receive
+        iv_branch_name = iv_branch_name
+      IMPORTING
+        eo_client      = lo_client ).
+ 
+    lo_client->set_headers(
+      iv_url     = iv_url
+      iv_service = c_service-receive ).
+ 
+    lv_cap_list = ''report-status''.
+ 
+    lv_line = iv_old &&
+              \` \` &&
+              iv_new &&
+              \` \` &&
+              iv_branch_name &&
+              zcl_abapgit_git_utils=>get_null( ) &&
+              \` \` &&
+              lv_cap_list &&
+              cl_abap_char_utilities=>newline.
+    lv_cmd_pkt = zcl_abapgit_git_utils=>pkt_string( lv_line ).
+ 
+    lv_buffer = lv_cmd_pkt && ''0000''.
+    lv_tmp = zcl_abapgit_convert=>string_to_xstring_utf8( lv_buffer ).
+ 
+    CONCATENATE lv_tmp iv_pack INTO lv_xstring IN BYTE MODE.
+ 
+    lv_xstring = lo_client->send_receive_close( lv_xstring ).
+ 
+    lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstring ).
+ 
+    check_report_status( lv_string ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD upload_pack.
+ 
+    DATA: lv_capa    TYPE string,
+          lv_line    TYPE string,
+          lv_buffer  TYPE string,
+          lv_xstring TYPE xstring,
+          lv_pack    TYPE xstring.
+ 
+    FIELD-SYMBOLS: <lv_hash> LIKE LINE OF it_hashes.
+ 
+ 
+    io_client->set_headers( iv_url     = iv_url
+                            iv_service = c_service-upload ).
+ 
+    LOOP AT it_hashes FROM 1 ASSIGNING <lv_hash>.
+      IF sy-tabix = 1.
+        lv_capa = ''side-band-64k no-progress multi_ack''.
+        lv_line = ''want'' && \` \` && <lv_hash>
+          && \` \` && lv_capa && cl_abap_char_utilities=>newline.
+      ELSE.
+        lv_line = ''want'' && \` \` && <lv_hash>
+          && cl_abap_char_utilities=>newline.
+      ENDIF.
+      lv_buffer = lv_buffer && zcl_abapgit_git_utils=>pkt_string( lv_line ).
+    ENDLOOP.
+ 
+    IF iv_deepen_level > 0.
+      lv_buffer = lv_buffer && zcl_abapgit_git_utils=>pkt_string( |deepen { iv_deepen_level }| &&
+        cl_abap_char_utilities=>newline ).
+    ENDIF.
+ 
+    lv_buffer = lv_buffer
+             && ''0000''
+             && ''0009done'' && cl_abap_char_utilities=>newline.
+ 
+    lv_xstring = io_client->send_receive_close( zcl_abapgit_convert=>string_to_xstring_utf8( lv_buffer ) ).
+ 
+    parse( IMPORTING ev_pack = lv_pack
+           CHANGING  cv_data = lv_xstring ).
+ 
+    IF lv_pack IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Response could not be parsed - empty pack returned.'' ).
+    ENDIF.
+ 
+    rt_objects = zcl_abapgit_git_pack=>decode( lv_pack ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD upload_pack_by_branch.
+ 
+    DATA: lo_client TYPE REF TO zcl_abapgit_http_client,
+          lt_hashes TYPE zif_abapgit_git_definitions=>ty_sha1_tt.
+ 
+    FIELD-SYMBOLS: <ls_branch> LIKE LINE OF it_branches.
+ 
+ 
+    CLEAR: et_objects,
+           ev_branch.
+ 
+    find_branch(
+      EXPORTING
+        iv_url         = iv_url
+        iv_service     = c_service-upload
+        iv_branch_name = iv_branch_name
+      IMPORTING
+        eo_client      = lo_client
+        ev_branch      = ev_branch ).
+ 
+    IF it_branches IS INITIAL.
+      APPEND ev_branch TO lt_hashes.
+    ELSE.
+      LOOP AT it_branches ASSIGNING <ls_branch>.
+        APPEND <ls_branch>-sha1 TO lt_hashes.
+      ENDLOOP.
+    ENDIF.
+ 
+    et_objects = upload_pack( io_client       = lo_client
+                              iv_url          = iv_url
+                              iv_deepen_level = iv_deepen_level
+                              it_hashes       = lt_hashes ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD upload_pack_by_commit.
+ 
+    DATA: lo_client TYPE REF TO zcl_abapgit_http_client,
+          lt_hashes TYPE zif_abapgit_git_definitions=>ty_sha1_tt.
+ 
+ 
+    CLEAR: et_objects,
+           ev_commit.
+ 
+    APPEND iv_hash TO lt_hashes.
+    ev_commit = iv_hash.
+ 
+    lo_client = zcl_abapgit_http=>create_by_url(
+      iv_url     = iv_url
+      iv_service = c_service-upload ).
+ 
+    et_objects = upload_pack( io_client       = lo_client
+                              iv_url          = iv_url
+                              iv_deepen_level = iv_deepen_level
+                              it_hashes       = lt_hashes ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_UTILS                   ', 'CLASS zcl_abapgit_git_utils DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      ty_null TYPE c LENGTH 1 .
+ 
+    CLASS-METHODS get_null
+      RETURNING
+        VALUE(rv_c) TYPE ty_null .
+    CLASS-METHODS pkt_string
+      IMPORTING
+        !iv_string    TYPE string
+      RETURNING
+        VALUE(rv_pkt) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS length_utf8_hex
+      IMPORTING
+        !iv_data      TYPE xstring
+      RETURNING
+        VALUE(rv_len) TYPE i
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_utils IMPLEMENTATION.
+ 
+ 
+  METHOD get_null.
+ 
+* must be length 4, or it gives a syntax error on lower versions
+    DATA: lv_x TYPE x LENGTH 4 VALUE ''00000000''.
+    FIELD-SYMBOLS <lv_y> TYPE c.
+ 
+    ASSIGN lv_x TO <lv_y> CASTING.
+    rv_c = <lv_y>.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD length_utf8_hex.
+ 
+    DATA: lv_xstring TYPE xstring,
+          lv_char4   TYPE c LENGTH 4,
+          lv_x       TYPE x LENGTH 2.
+ 
+    IF xstrlen( iv_data ) < 4.
+      zcx_abapgit_exception=>raise( ''error converting to hex, LENGTH_UTF8_HEX'' ).
+    ENDIF.
+ 
+    lv_xstring = iv_data(4).
+ 
+    lv_char4 = zcl_abapgit_convert=>xstring_to_string_utf8(
+      iv_data   = lv_xstring
+      iv_length = 4 ).
+ 
+    TRANSLATE lv_char4 TO UPPER CASE.
+    lv_x = lv_char4.
+    rv_len = lv_x.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pkt_string.
+ 
+    DATA: lv_x   TYPE x,
+          lv_len TYPE i.
+ 
+ 
+    lv_len = strlen( iv_string ).
+ 
+    IF lv_len >= 255.
+      zcx_abapgit_exception=>raise( ''PKT, todo'' ).
+    ENDIF.
+ 
+    lv_x = lv_len + 4.
+ 
+    rv_pkt = ''00'' && lv_x && iv_string.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HASH                        ', 'CLASS zcl_abapgit_hash DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS adler32
+      IMPORTING
+        !iv_xstring        TYPE xstring
+      RETURNING
+        VALUE(rv_checksum) TYPE zif_abapgit_git_definitions=>ty_adler32 .
+    CLASS-METHODS sha1
+      IMPORTING
+        !iv_type       TYPE zif_abapgit_git_definitions=>ty_type
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_commit
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_tree
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_tag
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_blob
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_raw
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_string
+      IMPORTING
+        !iv_data       TYPE string
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_hash IMPLEMENTATION.
+ 
+ 
+  METHOD adler32.
+ 
+    CONSTANTS: lc_adler TYPE i VALUE 65521,
+               lc_max_b TYPE i VALUE 1800000000.
+ 
+    DATA: lv_index TYPE i,
+          lv_a     TYPE i VALUE 1,
+          lv_b     TYPE i VALUE 0,
+          lv_x     TYPE x LENGTH 2,
+          lv_ca    TYPE c LENGTH 4,
+          lv_cb    TYPE c LENGTH 4,
+          lv_char8 TYPE c LENGTH 8.
+ 
+ 
+    DO xstrlen( iv_xstring ) TIMES.
+      lv_index = sy-index - 1.
+ 
+      lv_a = lv_a + iv_xstring+lv_index(1).
+      lv_b = lv_b + lv_a.
+ 
+* delay the MOD operation until the integer might overflow
+* articles describe 5552 additions are allowed, but this assumes unsigned integers
+* instead of allowing a fixed number of additions before running MOD, then
+* just compare value of lv_b, this is 1 operation less than comparing and adding
+      IF lv_b > lc_max_b.
+        lv_a = lv_a MOD lc_adler.
+        lv_b = lv_b MOD lc_adler.
+      ENDIF.
+    ENDDO.
+ 
+    lv_a = lv_a MOD lc_adler.
+    lv_b = lv_b MOD lc_adler.
+ 
+    lv_x = lv_a.
+    lv_ca = lv_x.
+ 
+    lv_x = lv_b.
+    lv_cb = lv_x.
+ 
+    CONCATENATE lv_cb lv_ca INTO lv_char8.
+ 
+    rv_checksum = lv_char8.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1.
+ 
+    DATA: lv_len     TYPE i,
+          lv_char10  TYPE c LENGTH 10,
+          lv_string  TYPE string,
+          lv_xstring TYPE xstring.
+ 
+ 
+    lv_len = xstrlen( iv_data ).
+    lv_char10 = lv_len.
+    CONDENSE lv_char10.
+    CONCATENATE iv_type lv_char10 INTO lv_string SEPARATED BY space.
+    lv_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+    lv_string = lv_xstring.
+    CONCATENATE lv_string ''00'' INTO lv_string.
+    lv_xstring = lv_string.
+ 
+    CONCATENATE lv_xstring iv_data INTO lv_xstring IN BYTE MODE.
+ 
+    rv_sha1 = sha1_raw( lv_xstring ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_blob.
+    rv_sha1 = sha1( iv_type = zif_abapgit_git_definitions=>c_type-blob
+                    iv_data = iv_data ).
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_commit.
+    rv_sha1 = sha1( iv_type = zif_abapgit_git_definitions=>c_type-commit
+                    iv_data = iv_data ).
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_raw.
+ 
+    DATA: lv_hash  TYPE string,
+          lv_key   TYPE xstring,
+          lx_error TYPE REF TO cx_abap_message_digest.
+    TRY.
+        cl_abap_hmac=>calculate_hmac_for_raw(
+      EXPORTING
+        if_key        = lv_key
+        if_data       = iv_data
+      IMPORTING
+        ef_hmacstring = lv_hash ).
+      CATCH cx_abap_message_digest INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+    rv_sha1 = lv_hash.
+    TRANSLATE rv_sha1 TO LOWER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_string.
+ 
+    DATA: lv_hash  TYPE string,
+          lv_key   TYPE xstring,
+          lx_error TYPE REF TO cx_abap_message_digest.
+    TRY.
+        cl_abap_hmac=>calculate_hmac_for_char(
+      EXPORTING
+        if_key        = lv_key
+        if_data       = iv_data
+      IMPORTING
+        ef_hmacstring = lv_hash ).
+      CATCH cx_abap_message_digest INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+    rv_sha1 = lv_hash.
+    TRANSLATE rv_sha1 TO LOWER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_tag.
+    rv_sha1 = sha1( iv_type = zif_abapgit_git_definitions=>c_type-tag
+                    iv_data = iv_data ).
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_tree.
+    rv_sha1 = sha1( iv_type = zif_abapgit_git_definitions=>c_type-tree
+                    iv_data = iv_data ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GIT_DEFINITIONS             ', 'INTERFACE zif_abapgit_git_definitions
+  PUBLIC .
+* this interface is self contained
+* only references to built in types
+* git does not know the concept of TADIR objects, only knows files
+  TYPES:
+    ty_type    TYPE c LENGTH 6 .
+  TYPES:
+    ty_bitbyte TYPE c LENGTH 8 .
+  TYPES:
+    ty_sha1    TYPE c LENGTH 40 .
+  TYPES: ty_sha1_tt TYPE STANDARD TABLE OF ty_sha1 WITH DEFAULT KEY .
+  TYPES:
+    ty_adler32 TYPE x LENGTH 4 .
+ 
+  TYPES ty_item_state TYPE c LENGTH 1.
+  TYPES:
+    BEGIN OF ty_file_signature,
+      path     TYPE string,
+      filename TYPE string,
+      sha1     TYPE ty_sha1,
+    END OF ty_file_signature .
+  TYPES:
+    ty_file_signatures_tt TYPE STANDARD TABLE OF
+           ty_file_signature WITH DEFAULT KEY .
+  TYPES:
+    ty_file_signatures_ts TYPE SORTED TABLE OF
+           ty_file_signature WITH UNIQUE KEY path filename .
+  TYPES:
+    BEGIN OF ty_file.
+      INCLUDE TYPE ty_file_signature.
+  TYPES: data TYPE xstring,
+    END OF ty_file .
+  TYPES:
+    ty_files_tt TYPE STANDARD TABLE OF ty_file WITH DEFAULT KEY
+                     WITH UNIQUE SORTED KEY file_path COMPONENTS path filename
+                     WITH NON-UNIQUE SORTED KEY file COMPONENTS filename.
+ 
+  TYPES ty_git_branch_type TYPE c LENGTH 2 .
+  TYPES:
+    BEGIN OF ty_git_branch,
+      sha1         TYPE ty_sha1,
+      name         TYPE string,
+      type         TYPE ty_git_branch_type,
+      is_head      TYPE abap_bool,
+      display_name TYPE string,
+    END OF ty_git_branch .
+  TYPES:
+    ty_git_branch_list_tt TYPE STANDARD TABLE OF ty_git_branch WITH DEFAULT KEY
+                               WITH NON-UNIQUE SORTED KEY name_key
+                               COMPONENTS name.
+  TYPES:
+    BEGIN OF ty_git_tag,
+      sha1         TYPE ty_sha1,
+      object       TYPE ty_sha1,
+      name         TYPE string,
+      type         TYPE ty_git_branch_type,
+      display_name TYPE string,
+      tagger_name  TYPE string,
+      tagger_email TYPE string,
+      message      TYPE string,
+      body         TYPE string,
+    END OF ty_git_tag .
+  TYPES:
+    BEGIN OF ty_git_user,
+      name  TYPE string,
+      email TYPE string,
+    END OF ty_git_user .
+  TYPES:
+    BEGIN OF ty_comment,
+      committer TYPE ty_git_user,
+      author    TYPE ty_git_user,
+      comment   TYPE string,
+    END OF ty_comment .
+ 
+  TYPES:
+    ty_chmod TYPE c LENGTH 6 .
+ 
+  CONSTANTS:
+    BEGIN OF c_chmod,
+      file       TYPE ty_chmod VALUE ''100644'',
+      executable TYPE ty_chmod VALUE ''100755'',
+      dir        TYPE ty_chmod VALUE ''40000 '',
+      submodule  TYPE ty_chmod VALUE ''160000'',
+    END OF c_chmod .
+ 
+  TYPES:
+    BEGIN OF ty_expanded,
+      path  TYPE string,
+      name  TYPE string,
+      sha1  TYPE ty_sha1,
+      chmod TYPE ty_chmod,
+    END OF ty_expanded .
+  TYPES:
+    ty_expanded_tt TYPE STANDARD TABLE OF ty_expanded WITH DEFAULT KEY .
+ 
+  TYPES:
+    BEGIN OF ty_create,
+      name   TYPE string,
+      parent TYPE string,
+    END OF ty_create .
+  TYPES:
+    BEGIN OF ty_commit,
+      sha1       TYPE ty_sha1,
+      parent1    TYPE ty_sha1,
+      parent2    TYPE ty_sha1,
+      author     TYPE string,
+      email      TYPE string,
+      time       TYPE string,
+      message    TYPE string,
+      body       TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+      branch     TYPE string,
+      merge      TYPE string,
+      tags       TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+      create     TYPE STANDARD TABLE OF ty_create WITH DEFAULT KEY,
+      compressed TYPE abap_bool,
+    END OF ty_commit .
+  TYPES:
+    ty_commit_tt TYPE STANDARD TABLE OF ty_commit WITH DEFAULT KEY .
+ 
+  CONSTANTS:
+    BEGIN OF c_type,
+      commit TYPE ty_type VALUE ''commit'',                   "#EC NOTEXT
+      tree   TYPE ty_type VALUE ''tree'',                     "#EC NOTEXT
+      ref_d  TYPE ty_type VALUE ''ref_d'',                    "#EC NOTEXT
+      tag    TYPE ty_type VALUE ''tag'',                      "#EC NOTEXT
+      blob   TYPE ty_type VALUE ''blob'',                     "#EC NOTEXT
+    END OF c_type .
+ 
+  CONSTANTS:
+    BEGIN OF c_git_branch_type,
+      branch          TYPE ty_git_branch_type VALUE ''HD'',
+      lightweight_tag TYPE ty_git_branch_type VALUE ''TG'',
+      annotated_tag   TYPE ty_git_branch_type VALUE ''AT'',
+      other           TYPE ty_git_branch_type VALUE ''ZZ'',
+    END OF c_git_branch_type .
+  CONSTANTS c_head_name TYPE string VALUE ''HEAD'' ##NO_TEXT.
+  CONSTANTS:
+    BEGIN OF c_git_branch,
+      main         TYPE string VALUE ''refs/heads/main'',
+      prefix       TYPE string VALUE ''refs/'',
+      heads_prefix TYPE string VALUE ''refs/heads/'',
+      heads        TYPE string VALUE ''refs/heads/*'',
+      tags_prefix  TYPE string VALUE ''refs/tags/'',
+      tags         TYPE string VALUE ''refs/tags/*'',
+      peel         TYPE string VALUE ''^{}'',
+    END OF c_git_branch.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ZLIB                        ', 'CLASS zcl_abapgit_zlib DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_decompress,
+        raw            TYPE xstring,
+        compressed_len TYPE i,
+      END OF ty_decompress .
+ 
+    CLASS-METHODS decompress
+      IMPORTING
+        !iv_compressed TYPE xsequence
+      RETURNING
+        VALUE(rs_data) TYPE ty_decompress .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS: c_maxdcodes TYPE i VALUE 30.
+ 
+    CLASS-DATA: gv_out      TYPE xstring,
+                go_lencode  TYPE REF TO zcl_abapgit_zlib_huffman,
+                go_distcode TYPE REF TO zcl_abapgit_zlib_huffman,
+                go_stream   TYPE REF TO zcl_abapgit_zlib_stream.
+ 
+    TYPES: BEGIN OF ty_pair,
+             length   TYPE i,
+             distance TYPE i,
+           END OF ty_pair.
+ 
+    CLASS-METHODS:
+      decode
+        IMPORTING io_huffman       TYPE REF TO zcl_abapgit_zlib_huffman
+        RETURNING VALUE(rv_symbol) TYPE i,
+      map_length
+        IMPORTING iv_code          TYPE i
+        RETURNING VALUE(rv_length) TYPE i,
+      map_distance
+        IMPORTING iv_code            TYPE i
+        RETURNING VALUE(rv_distance) TYPE i,
+      dynamic,
+      fixed,
+      not_compressed,
+      decode_loop,
+      read_pair
+        IMPORTING iv_length      TYPE i
+        RETURNING VALUE(rs_pair) TYPE ty_pair,
+      copy_out
+        IMPORTING is_pair TYPE ty_pair.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZLIB IMPLEMENTATION.
+ 
+ 
+  METHOD copy_out.
+ 
+* copy one byte at a time, it is not possible to copy using
+* string offsets, as it might copy data that does not exist
+* in mv_out yet
+ 
+    DATA: lv_distance TYPE i,
+          lv_index    TYPE i,
+          lv_x        TYPE x LENGTH 1.
+ 
+ 
+    lv_distance = xstrlen( gv_out ) - is_pair-distance.
+    DO is_pair-length TIMES.
+      lv_index = sy-index - 1 + lv_distance.
+      lv_x = gv_out+lv_index(1).
+      CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode.
+ 
+    DATA: lv_bit   TYPE c LENGTH 1,
+          lv_len   TYPE i,
+          lv_count TYPE i,
+          lv_code  TYPE i,
+          lv_index TYPE i,
+          lv_first TYPE i,
+          lv_bits  TYPE string.
+ 
+ 
+    DO zcl_abapgit_zlib_huffman=>c_maxbits TIMES.
+      lv_len = sy-index.
+ 
+      lv_bit = go_stream->take_bits( 1 ).
+      CONCATENATE lv_bits lv_bit INTO lv_bits.
+      lv_code = zcl_abapgit_zlib_convert=>bits_to_int( lv_bits ).
+      lv_count = io_huffman->get_count( lv_len ).
+ 
+      IF lv_code - lv_count < lv_first.
+        rv_symbol = io_huffman->get_symbol( lv_index + lv_code - lv_first + 1 ).
+        RETURN.
+      ENDIF.
+      lv_index = lv_index + lv_count.
+      lv_first = lv_first + lv_count.
+      lv_first = lv_first * 2.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_loop.
+ 
+    DATA lv_x TYPE x.
+    DATA lv_symbol TYPE i.
+ 
+    DO.
+      lv_symbol = decode( go_lencode ).
+ 
+      IF lv_symbol < 256.
+        lv_x = zcl_abapgit_zlib_convert=>int_to_hex( lv_symbol ).
+        CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE.
+      ELSEIF lv_symbol = 256.
+        EXIT.
+      ELSE.
+        copy_out( read_pair( lv_symbol ) ).
+      ENDIF.
+ 
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decompress.
+ 
+    DATA: lv_bfinal TYPE c LENGTH 1,
+          lv_btype  TYPE c LENGTH 2.
+ 
+ 
+    IF iv_compressed IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    CLEAR gv_out.
+    CREATE OBJECT go_stream
+      EXPORTING
+        iv_data = iv_compressed.
+ 
+    DO.
+      lv_bfinal = go_stream->take_bits( 1 ).
+ 
+      lv_btype = go_stream->take_bits( 2 ).
+      CASE lv_btype.
+        WHEN ''00''.
+          not_compressed( ).
+        WHEN ''01''.
+          fixed( ).
+          decode_loop( ).
+        WHEN ''10''.
+          dynamic( ).
+          decode_loop( ).
+        WHEN OTHERS.
+          ASSERT 1 = 0.
+      ENDCASE.
+ 
+      IF lv_bfinal = ''1''.
+        EXIT.
+      ENDIF.
+ 
+    ENDDO.
+ 
+    rs_data-raw = gv_out.
+    rs_data-compressed_len = xstrlen( iv_compressed ) - go_stream->remaining( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dynamic.
+ 
+    DATA: lv_nlen    TYPE i,
+          lv_ndist   TYPE i,
+          lv_ncode   TYPE i,
+          lv_index   TYPE i,
+          lv_length  TYPE i,
+          lv_symbol  TYPE i,
+          lt_order   TYPE TABLE OF i,
+          lt_lengths TYPE zcl_abapgit_zlib_huffman=>ty_lengths,
+          lt_dists   TYPE zcl_abapgit_zlib_huffman=>ty_lengths.
+ 
+    FIELD-SYMBOLS: <lv_length> LIKE LINE OF lt_lengths.
+ 
+ 
+    APPEND 16 TO lt_order.
+    APPEND 17 TO lt_order.
+    APPEND 18 TO lt_order.
+    APPEND 0 TO lt_order.
+    APPEND 8 TO lt_order.
+    APPEND 7 TO lt_order.
+    APPEND 9 TO lt_order.
+    APPEND 6 TO lt_order.
+    APPEND 10 TO lt_order.
+    APPEND 5 TO lt_order.
+    APPEND 11 TO lt_order.
+    APPEND 4 TO lt_order.
+    APPEND 12 TO lt_order.
+    APPEND 3 TO lt_order.
+    APPEND 13 TO lt_order.
+    APPEND 2 TO lt_order.
+    APPEND 14 TO lt_order.
+    APPEND 1 TO lt_order.
+    APPEND 15 TO lt_order.
+ 
+    lv_nlen = go_stream->take_int( 5 ) + 257.
+    lv_ndist = go_stream->take_int( 5 ) + 1.
+    lv_ncode = go_stream->take_int( 4 ) + 4.
+ 
+    DO 19 TIMES.
+      APPEND 0 TO lt_lengths.
+    ENDDO.
+ 
+    DO lv_ncode TIMES.
+      READ TABLE lt_order INDEX sy-index INTO lv_index.
+      ASSERT sy-subrc = 0.
+      lv_index = lv_index + 1.
+      READ TABLE lt_lengths INDEX lv_index ASSIGNING <lv_length>.
+      ASSERT sy-subrc = 0.
+      <lv_length> = go_stream->take_int( 3 ).
+    ENDDO.
+ 
+    CREATE OBJECT go_lencode
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+    CLEAR lt_lengths.
+    WHILE lines( lt_lengths ) < lv_nlen + lv_ndist.
+      lv_symbol = decode( go_lencode ).
+ 
+      IF lv_symbol < 16.
+        APPEND lv_symbol TO lt_lengths.
+      ELSE.
+        lv_length = 0.
+        IF lv_symbol = 16.
+          READ TABLE lt_lengths INDEX lines( lt_lengths ) INTO lv_length.
+          ASSERT sy-subrc = 0.
+          lv_symbol = go_stream->take_int( 2 ) + 3.
+        ELSEIF lv_symbol = 17.
+          lv_symbol = go_stream->take_int( 3 ) + 3.
+        ELSE.
+          lv_symbol = go_stream->take_int( 7 ) + 11.
+        ENDIF.
+        DO lv_symbol TIMES.
+          APPEND lv_length TO lt_lengths.
+        ENDDO.
+      ENDIF.
+    ENDWHILE.
+ 
+    lt_dists = lt_lengths.
+    DELETE lt_lengths FROM lv_nlen + 1.
+    DELETE lt_dists TO lv_nlen.
+ 
+    CREATE OBJECT go_lencode
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+    CREATE OBJECT go_distcode
+      EXPORTING
+        it_lengths = lt_dists.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD fixed.
+ 
+    DATA: lt_lengths TYPE zcl_abapgit_zlib_huffman=>ty_lengths.
+ 
+ 
+    DO 144 TIMES.
+      APPEND 8 TO lt_lengths.
+    ENDDO.
+    DO 112 TIMES.
+      APPEND 9 TO lt_lengths.
+    ENDDO.
+    DO 24 TIMES.
+      APPEND 7 TO lt_lengths.
+    ENDDO.
+    DO 8 TIMES.
+      APPEND 8 TO lt_lengths.
+    ENDDO.
+ 
+    CREATE OBJECT go_lencode
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+    CLEAR lt_lengths.
+    DO c_maxdcodes TIMES.
+      APPEND 5 TO lt_lengths.
+    ENDDO.
+ 
+    CREATE OBJECT go_distcode
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_distance.
+ 
+    CASE iv_code.
+      WHEN 0.
+        rv_distance = go_stream->take_int( 0 ) + 1.
+      WHEN 1.
+        rv_distance = go_stream->take_int( 0 ) + 2.
+      WHEN 2.
+        rv_distance = go_stream->take_int( 0 ) + 3.
+      WHEN 3.
+        rv_distance = go_stream->take_int( 0 ) + 4.
+      WHEN 4.
+        rv_distance = go_stream->take_int( 1 ) + 5.
+      WHEN 5.
+        rv_distance = go_stream->take_int( 1 ) + 7.
+      WHEN 6.
+        rv_distance = go_stream->take_int( 2 ) + 9.
+      WHEN 7.
+        rv_distance = go_stream->take_int( 2 ) + 13.
+      WHEN 8.
+        rv_distance = go_stream->take_int( 3 ) + 17.
+      WHEN 9.
+        rv_distance = go_stream->take_int( 3 ) + 25.
+      WHEN 10.
+        rv_distance = go_stream->take_int( 4 ) + 33.
+      WHEN 11.
+        rv_distance = go_stream->take_int( 4 ) + 49.
+      WHEN 12.
+        rv_distance = go_stream->take_int( 5 ) + 65.
+      WHEN 13.
+        rv_distance = go_stream->take_int( 5 ) + 97.
+      WHEN 14.
+        rv_distance = go_stream->take_int( 6 ) + 129.
+      WHEN 15.
+        rv_distance = go_stream->take_int( 6 ) + 193.
+      WHEN 16.
+        rv_distance = go_stream->take_int( 7 ) + 257.
+      WHEN 17.
+        rv_distance = go_stream->take_int( 7 ) + 385.
+      WHEN 18.
+        rv_distance = go_stream->take_int( 8 ) + 513.
+      WHEN 19.
+        rv_distance = go_stream->take_int( 8 ) + 769.
+      WHEN 20.
+        rv_distance = go_stream->take_int( 9 ) + 1025.
+      WHEN 21.
+        rv_distance = go_stream->take_int( 9 ) + 1537.
+      WHEN 22.
+        rv_distance = go_stream->take_int( 10 ) + 2049.
+      WHEN 23.
+        rv_distance = go_stream->take_int( 10 ) + 3073.
+      WHEN 24.
+        rv_distance = go_stream->take_int( 11 ) + 4097.
+      WHEN 25.
+        rv_distance = go_stream->take_int( 11 ) + 6145.
+      WHEN 26.
+        rv_distance = go_stream->take_int( 12 ) + 8193.
+      WHEN 27.
+        rv_distance = go_stream->take_int( 12 ) + 12289.
+      WHEN 28.
+        rv_distance = go_stream->take_int( 13 ) + 16385.
+      WHEN 29.
+        rv_distance = go_stream->take_int( 13 ) + 24577.
+      WHEN OTHERS.
+        ASSERT 1 = 0.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_length.
+ 
+    CASE iv_code.
+      WHEN 257.
+        rv_length = go_stream->take_int( 0 ) + 3.
+      WHEN 258.
+        rv_length = go_stream->take_int( 0 ) + 4.
+      WHEN 259.
+        rv_length = go_stream->take_int( 0 ) + 5.
+      WHEN 260.
+        rv_length = go_stream->take_int( 0 ) + 6.
+      WHEN 261.
+        rv_length = go_stream->take_int( 0 ) + 7.
+      WHEN 262.
+        rv_length = go_stream->take_int( 0 ) + 8.
+      WHEN 263.
+        rv_length = go_stream->take_int( 0 ) + 9.
+      WHEN 264.
+        rv_length = go_stream->take_int( 0 ) + 10.
+      WHEN 265.
+        rv_length = go_stream->take_int( 1 ) + 11.
+      WHEN 266.
+        rv_length = go_stream->take_int( 1 ) + 13.
+      WHEN 267.
+        rv_length = go_stream->take_int( 1 ) + 15.
+      WHEN 268.
+        rv_length = go_stream->take_int( 1 ) + 17.
+      WHEN 269.
+        rv_length = go_stream->take_int( 2 ) + 19.
+      WHEN 270.
+        rv_length = go_stream->take_int( 2 ) + 23.
+      WHEN 271.
+        rv_length = go_stream->take_int( 2 ) + 27.
+      WHEN 272.
+        rv_length = go_stream->take_int( 2 ) + 31.
+      WHEN 273.
+        rv_length = go_stream->take_int( 3 ) + 35.
+      WHEN 274.
+        rv_length = go_stream->take_int( 3 ) + 43.
+      WHEN 275.
+        rv_length = go_stream->take_int( 3 ) + 51.
+      WHEN 276.
+        rv_length = go_stream->take_int( 3 ) + 59.
+      WHEN 277.
+        rv_length = go_stream->take_int( 4 ) + 67.
+      WHEN 278.
+        rv_length = go_stream->take_int( 4 ) + 83.
+      WHEN 279.
+        rv_length = go_stream->take_int( 4 ) + 99.
+      WHEN 280.
+        rv_length = go_stream->take_int( 4 ) + 115.
+      WHEN 281.
+        rv_length = go_stream->take_int( 5 ) + 131.
+      WHEN 282.
+        rv_length = go_stream->take_int( 5 ) + 163.
+      WHEN 283.
+        rv_length = go_stream->take_int( 5 ) + 195.
+      WHEN 284.
+        rv_length = go_stream->take_int( 5 ) + 227.
+      WHEN 285.
+        rv_length = go_stream->take_int( 0 ) + 258.
+      WHEN OTHERS.
+        ASSERT 1 = 0.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD not_compressed.
+ 
+    DATA: lv_len  TYPE i,
+          lv_nlen TYPE i ##NEEDED.
+    DATA lv_bytes TYPE xstring.
+ 
+* skip any remaining bits in current partially processed byte
+    go_stream->clear_bits( ).
+ 
+    lv_len = go_stream->take_int( 16 ).
+    lv_nlen = go_stream->take_int( 16 ).
+ 
+    lv_bytes = go_stream->take_bytes( lv_len ).
+    CONCATENATE gv_out lv_bytes INTO gv_out IN BYTE MODE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_pair.
+ 
+    DATA: lv_symbol TYPE i.
+ 
+ 
+    rs_pair-length = map_length( iv_length ).
+ 
+    lv_symbol = decode( go_distcode ).
+    rs_pair-distance = map_distance( lv_symbol ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ZLIB_CONVERT                ', 'CLASS zcl_abapgit_zlib_convert DEFINITION
+  PUBLIC FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS hex_to_bits
+      IMPORTING
+        !iv_hex        TYPE xsequence
+      RETURNING
+        VALUE(rv_bits) TYPE string.
+ 
+    CLASS-METHODS bits_to_int
+      IMPORTING
+        !iv_bits      TYPE clike
+      RETURNING
+        VALUE(rv_int) TYPE i.
+ 
+    CLASS-METHODS int_to_hex
+      IMPORTING
+        !iv_int       TYPE i
+      RETURNING
+        VALUE(rv_hex) TYPE xstring.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZLIB_CONVERT IMPLEMENTATION.
+ 
+ 
+  METHOD bits_to_int.
+ 
+    DATA: lv_c    TYPE c LENGTH 1,
+          lv_bits TYPE string.
+ 
+    lv_bits = iv_bits.
+ 
+    WHILE NOT lv_bits IS INITIAL.
+      lv_c = lv_bits.
+      rv_int = rv_int * 2.
+      rv_int = rv_int + lv_c.
+      lv_bits = lv_bits+1.
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD hex_to_bits.
+ 
+    DATA: lv_x   TYPE x LENGTH 1,
+          lv_c   TYPE c LENGTH 1,
+          lv_bit TYPE i,
+          lv_hex TYPE xstring.
+ 
+ 
+    lv_hex = iv_hex.
+    WHILE NOT lv_hex IS INITIAL.
+      lv_x = lv_hex.
+      DO 8 TIMES.
+        lv_bit = sy-index.
+        GET BIT lv_bit OF lv_x INTO lv_c.
+        CONCATENATE rv_bits lv_c INTO rv_bits.
+      ENDDO.
+      lv_hex = lv_hex+1.
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD int_to_hex.
+ 
+    DATA: lv_x TYPE x.
+ 
+ 
+    lv_x = iv_int.
+    rv_hex = lv_x.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ZLIB_HUFFMAN                ', 'CLASS zcl_abapgit_zlib_huffman DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      ty_lengths TYPE STANDARD TABLE OF i WITH DEFAULT KEY .
+ 
+    CONSTANTS c_maxbits TYPE i VALUE 15 ##NO_TEXT.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_lengths TYPE ty_lengths .
+    METHODS get_count
+      IMPORTING
+        !iv_index       TYPE i
+      RETURNING
+        VALUE(rv_value) TYPE i .
+    METHODS get_symbol
+      IMPORTING
+        !iv_index       TYPE i
+      RETURNING
+        VALUE(rv_value) TYPE i .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA: mt_count  TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
+          mt_symbol TYPE STANDARD TABLE OF i WITH DEFAULT KEY.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZLIB_HUFFMAN IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lv_index  TYPE i,
+          lt_offset TYPE TABLE OF i,
+          lv_length LIKE LINE OF it_lengths,
+          lv_prev   TYPE i,
+          lv_count  LIKE LINE OF mt_count.
+ 
+    FIELD-SYMBOLS: <lv_offset> LIKE LINE OF lt_offset,
+                   <lv_symbol> LIKE LINE OF mt_symbol,
+                   <lv_i>      LIKE LINE OF it_lengths.
+ 
+ 
+    DO c_maxbits TIMES.
+      APPEND 0 TO mt_count.
+    ENDDO.
+    LOOP AT it_lengths INTO lv_index.
+      IF lv_index = 0.
+        CONTINUE.
+      ENDIF.
+      READ TABLE mt_count INDEX lv_index ASSIGNING <lv_i>.
+      ASSERT sy-subrc = 0.
+      <lv_i> = <lv_i> + 1.
+    ENDLOOP.
+ 
+************
+ 
+    APPEND 0 TO lt_offset.
+    DO c_maxbits - 1 TIMES.
+      READ TABLE mt_count INDEX sy-index INTO lv_count.
+      ASSERT sy-subrc = 0.
+      lv_prev = lv_prev + lv_count.
+      APPEND lv_prev TO lt_offset.
+    ENDDO.
+ 
+    DO lines( it_lengths ) TIMES.
+      APPEND 0 TO mt_symbol.
+    ENDDO.
+    DO lines( it_lengths ) TIMES.
+      lv_index = sy-index.
+      READ TABLE it_lengths INDEX lv_index INTO lv_length.
+      ASSERT sy-subrc = 0.
+      IF lv_length = 0.
+        CONTINUE.
+      ENDIF.
+      READ TABLE lt_offset INDEX lv_length ASSIGNING <lv_offset>.
+      ASSERT sy-subrc = 0.
+      READ TABLE mt_symbol INDEX <lv_offset> + 1 ASSIGNING <lv_symbol>.
+      ASSERT sy-subrc = 0.
+      <lv_symbol> = lv_index - 1.
+      <lv_offset> = <lv_offset> + 1.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_count.
+    READ TABLE mt_count INDEX iv_index INTO rv_value.     "#EC CI_SUBRC
+  ENDMETHOD.
+ 
+ 
+  METHOD get_symbol.
+    READ TABLE mt_symbol INDEX iv_index INTO rv_value.    "#EC CI_SUBRC
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ZLIB_STREAM                 ', 'CLASS zcl_abapgit_zlib_stream DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_data TYPE xstring .
+    METHODS take_bits
+      IMPORTING
+        !iv_length     TYPE i
+      RETURNING
+        VALUE(rv_bits) TYPE string .
+    METHODS take_int
+      IMPORTING
+        !iv_length    TYPE i
+      RETURNING
+        VALUE(rv_int) TYPE i .
+    METHODS remaining
+      RETURNING
+        VALUE(rv_length) TYPE i .
+    "! Take bytes, there''s an implicit realignment to start at the beginning of a byte
+    "! i.e. if next bit of current byte is not the first bit, then this byte is skipped
+    "! and the bytes are taken from the next one.
+    "! @parameter iv_length | <p class="shorttext synchronized" lang="en"></p>
+    "! @parameter rv_bytes | <p class="shorttext synchronized" lang="en"></p>
+    METHODS take_bytes
+      IMPORTING
+        !iv_length      TYPE i
+      RETURNING
+        VALUE(rv_bytes) TYPE xstring .
+    METHODS clear_bits .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mv_bits TYPE string .
+    DATA mv_compressed TYPE xstring .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZLIB_STREAM IMPLEMENTATION.
+ 
+ 
+  METHOD clear_bits.
+    CLEAR mv_bits.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    mv_compressed = iv_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remaining.
+ 
+    rv_length = xstrlen( mv_compressed ) + 1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD take_bits.
+ 
+    DATA: lv_left  TYPE i,
+          lv_index TYPE i,
+          lv_x     TYPE x LENGTH 1.
+ 
+ 
+    WHILE strlen( rv_bits ) < iv_length.
+      IF mv_bits IS INITIAL.
+        lv_x = mv_compressed(1).
+        mv_bits = zcl_abapgit_zlib_convert=>hex_to_bits( lv_x ).
+        mv_compressed = mv_compressed+1.
+      ENDIF.
+      lv_left = iv_length - strlen( rv_bits ).
+      IF lv_left >= strlen( mv_bits ).
+        CONCATENATE mv_bits rv_bits INTO rv_bits.
+        CLEAR mv_bits.
+      ELSE.
+        lv_index = strlen( mv_bits ) - lv_left.
+        CONCATENATE mv_bits+lv_index(lv_left) rv_bits INTO rv_bits.
+        mv_bits = mv_bits(lv_index).
+      ENDIF.
+ 
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD take_bytes.
+ 
+    rv_bytes = mv_compressed(iv_length).
+    mv_compressed = mv_compressed+iv_length.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD take_int.
+ 
+    rv_int = zcl_abapgit_zlib_convert=>bits_to_int( take_bits( iv_length ) ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GIT_URL                     ', 'CLASS zcl_abapgit_git_url DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS get_commit_display_url
+      IMPORTING
+        !io_repo      TYPE REF TO zcl_abapgit_repo_online
+      RETURNING
+        VALUE(rv_url) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS validate_url
+      IMPORTING
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+    METHODS get_default_commit_display_url
+      IMPORTING
+        !iv_repo_url         TYPE string
+        !iv_hash             TYPE zif_abapgit_git_definitions=>ty_sha1
+      RETURNING
+        VALUE(rv_commit_url) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_url IMPLEMENTATION.
+ 
+ 
+  METHOD get_commit_display_url.
+ 
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    rv_url = get_default_commit_display_url(
+      iv_repo_url = io_repo->get_url( )
+      iv_hash     = io_repo->get_current_remote( ) ).
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->adjust_display_commit_url(
+      EXPORTING
+        iv_repo_url    = io_repo->get_url( )
+        iv_repo_name   = io_repo->get_name( )
+        iv_repo_key    = io_repo->get_key( )
+        iv_commit_hash = io_repo->get_current_remote( )
+      CHANGING
+        cv_display_url = rv_url ).
+ 
+    IF rv_url IS INITIAL.
+      zcx_abapgit_exception=>raise( |provider not yet supported| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_default_commit_display_url.
+ 
+    DATA ls_result TYPE match_result.
+    FIELD-SYMBOLS <ls_provider_match> TYPE submatch_result.
+ 
+    rv_commit_url = iv_repo_url.
+ 
+    FIND REGEX ''^http(?:s)?:\\/\\/(?:www\\.)?(github\\.com|bitbucket\\.org|gitlab\\.com)\\/''
+      IN rv_commit_url
+      RESULTS ls_result.
+    IF sy-subrc = 0.
+      READ TABLE ls_result-submatches INDEX 1 ASSIGNING <ls_provider_match>.
+      CASE rv_commit_url+<ls_provider_match>-offset(<ls_provider_match>-length).
+        WHEN ''github.com''.
+          REPLACE REGEX ''\\.git$'' IN rv_commit_url WITH space.
+          rv_commit_url = rv_commit_url && |/commit/| && iv_hash.
+        WHEN ''bitbucket.org''.
+          REPLACE REGEX ''\\.git$'' IN rv_commit_url WITH space.
+          rv_commit_url = rv_commit_url && |/commits/| && iv_hash.
+        WHEN ''gitlab.com''.
+          REPLACE REGEX ''\\.git$'' IN rv_commit_url WITH space.
+          rv_commit_url = rv_commit_url && |/-/commit/| && iv_hash.
+      ENDCASE.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_url.
+ 
+    DATA lv_provider TYPE string.
+ 
+    lv_provider = zcl_abapgit_url=>host( to_lower( iv_url ) ).
+ 
+    " Provider-specific check for URLs that don''t work
+    IF lv_provider CS ''gitlab.com''.
+      FIND REGEX ''\\.git$'' IN iv_url IGNORING CASE.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( ''Repo URL for GitLab must end in ".git"'' ).
+      ENDIF.
+    ELSEIF lv_provider CS ''dev.azure.com''.
+      FIND REGEX ''\\.git$'' IN iv_url IGNORING CASE.
+      IF sy-subrc = 0.
+        zcx_abapgit_exception=>raise( ''Repo URL for Azure DevOps must not end in ".git"'' ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PR_ENUM_GITHUB              ', 'CLASS zcl_abapgit_pr_enum_github DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_pr_enum_provider .
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_user_and_repo TYPE string
+        !ii_http_agent    TYPE REF TO zif_abapgit_http_agent
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_info,
+        repo_json TYPE REF TO zif_abapgit_ajson,
+        pulls     TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests,
+      END OF ty_info.
+ 
+    DATA mi_http_agent TYPE REF TO zif_abapgit_http_agent.
+    DATA mv_repo_url TYPE string.
+ 
+    METHODS fetch_repo_by_url
+      IMPORTING
+        iv_repo_url    TYPE string
+      RETURNING
+        VALUE(rs_info) TYPE ty_info
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS convert_list
+      IMPORTING
+        ii_json         TYPE REF TO zif_abapgit_ajson
+      RETURNING
+        VALUE(rt_pulls) TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests.
+ 
+    METHODS clean_url
+      IMPORTING
+        iv_url        TYPE string
+      RETURNING
+        VALUE(rv_url) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PR_ENUM_GITHUB IMPLEMENTATION.
+ 
+ 
+  METHOD clean_url.
+    rv_url = replace(
+      val = iv_url
+      regex = ''\\{.*\\}$''
+      with = '''' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    mv_repo_url   = |https://api.github.com/repos/{ iv_user_and_repo }|.
+    mi_http_agent = ii_http_agent.
+    mi_http_agent->global_headers( )->set(
+      iv_key = ''Accept''
+      iv_val = ''application/vnd.github.v3+json'' ).
+ 
+    IF zcl_abapgit_login_manager=>get( mv_repo_url ) IS NOT INITIAL.
+      mi_http_agent->global_headers( )->set(
+        iv_key = ''Authorization''
+        iv_val = zcl_abapgit_login_manager=>get( mv_repo_url ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD convert_list.
+ 
+    DATA lt_items TYPE string_table.
+    DATA lv_i TYPE string.
+    FIELD-SYMBOLS <ls_p> LIKE LINE OF rt_pulls.
+ 
+    lt_items = ii_json->members( ''/'' ).
+ 
+    LOOP AT lt_items INTO lv_i.
+      APPEND INITIAL LINE TO rt_pulls ASSIGNING <ls_p>.
+      <ls_p>-base_url        = ii_json->get( |/{ lv_i }/base/repo/clone_url| ).
+      <ls_p>-number          = ii_json->get( |/{ lv_i }/number| ).
+      <ls_p>-title           = ii_json->get( |/{ lv_i }/title| ).
+      <ls_p>-user            = ii_json->get( |/{ lv_i }/user/login| ).
+      <ls_p>-head_url        = ii_json->get( |/{ lv_i }/head/repo/clone_url| ).
+      <ls_p>-head_branch     = ii_json->get( |/{ lv_i }/head/ref| ).
+      <ls_p>-created_at      = ii_json->get( |/{ lv_i }/created_at| ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD fetch_repo_by_url.
+ 
+    DATA li_pulls_json TYPE REF TO zif_abapgit_ajson.
+    DATA lv_pull_url TYPE string.
+    DATA li_response TYPE REF TO zif_abapgit_http_response.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    li_response = mi_http_agent->request( iv_repo_url ).
+ 
+    TRY.
+        rs_info-repo_json = li_response->json( ).
+        li_response->headers( ). " for debug
+        lv_pull_url = clean_url( rs_info-repo_json->get( ''/pulls_url'' ) ).
+        IF lv_pull_url IS INITIAL OR rs_info-repo_json->get( ''/message'' ) = ''Not Found''.
+          RETURN.
+        ENDIF.
+        li_pulls_json = mi_http_agent->request( lv_pull_url )->json( ).
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        zcx_abapgit_exception=>raise_with_text( lx_ajson ).
+    ENDTRY.
+ 
+    rs_info-pulls = convert_list( li_pulls_json ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_pr_enum_provider~list_pull_requests.
+ 
+    DATA lv_upstream_url TYPE string.
+    DATA ls_repo_info TYPE ty_info.
+    FIELD-SYMBOLS <ls_p> LIKE LINE OF ls_repo_info-pulls.
+ 
+    ls_repo_info = fetch_repo_by_url( mv_repo_url ).
+    APPEND LINES OF ls_repo_info-pulls TO rt_pulls.
+ 
+    IF ls_repo_info-repo_json->get_boolean( ''/fork'' ) = abap_true.
+      lv_upstream_url = ls_repo_info-repo_json->get( ''/source/url'' ). " parent ?
+      ls_repo_info = fetch_repo_by_url( lv_upstream_url ).
+      LOOP AT ls_repo_info-pulls ASSIGNING <ls_p>.
+        <ls_p>-is_for_upstream = abap_true.
+        APPEND <ls_p> TO rt_pulls.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PR_ENUMERATOR               ', 'CLASS zcl_abapgit_pr_enumerator DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_pulls
+      RETURNING
+        VALUE(rt_pulls) TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS new
+      IMPORTING
+        iv_url             TYPE string
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_pr_enumerator
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mv_repo_url TYPE string.
+    DATA mi_enum_provider TYPE REF TO zif_abapgit_pr_enum_provider.
+ 
+    CLASS-METHODS create_provider
+      IMPORTING
+        iv_repo_url        TYPE string
+      RETURNING
+        VALUE(ri_provider) TYPE REF TO zif_abapgit_pr_enum_provider
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_pr_enumerator IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    mv_repo_url = to_lower( iv_url ).
+    TRY.
+        mi_enum_provider = create_provider( mv_repo_url ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_provider.
+ 
+    DATA li_agent TYPE REF TO zif_abapgit_http_agent.
+    DATA lv_user TYPE string.
+    DATA lv_repo TYPE string.
+ 
+    li_agent = zcl_abapgit_factory=>get_http_agent( ).
+ 
+    FIND ALL OCCURRENCES OF REGEX ''github\\.com\\/([^\\/]+)\\/([^\\/]+)''
+      IN iv_repo_url
+      SUBMATCHES lv_user lv_repo.
+    IF sy-subrc = 0.
+      lv_repo = replace(
+        val = lv_repo
+        regex = ''\\.git$''
+        with = '''' ).
+      CREATE OBJECT ri_provider TYPE zcl_abapgit_pr_enum_github
+        EXPORTING
+          iv_user_and_repo = |{ lv_user }/{ lv_repo }|
+          ii_http_agent    = li_agent.
+    ELSE.
+      zcx_abapgit_exception=>raise( |PR enumeration is not supported for { iv_repo_url }| ).
+    ENDIF.
+ 
+    " TODO somewhen more providers
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_pulls.
+ 
+    IF mi_enum_provider IS NOT BOUND.
+      RETURN.
+    ENDIF.
+ 
+    rt_pulls = mi_enum_provider->list_pull_requests( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance EXPORTING iv_url = iv_url.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_PR_ENUM_PROVIDER            ', 'INTERFACE zif_abapgit_pr_enum_provider
+  PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_pull_request,
+      base_url        TYPE string,
+      number          TYPE string,
+      title           TYPE string,
+      user            TYPE string,
+      head_url        TYPE string,
+      head_branch     TYPE string,
+      created_at      TYPE string, " TODO change to D after date parsing fixed
+      is_for_upstream TYPE abap_bool,
+    END OF ty_pull_request.
+  TYPES:
+    ty_pull_requests TYPE STANDARD TABLE OF ty_pull_request WITH KEY base_url number.
+ 
+  METHODS list_pull_requests
+    RETURNING
+      VALUE(rt_pulls) TYPE ty_pull_requests
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTTP                        ', 'CLASS zcl_abapgit_http DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_scheme,
+        digest TYPE string VALUE ''Digest'',
+      END OF c_scheme .
+ 
+    CLASS-METHODS get_agent
+      RETURNING
+        VALUE(rv_agent) TYPE string .
+    CLASS-METHODS create_by_url
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_service      TYPE string
+      RETURNING
+        VALUE(ro_client) TYPE REF TO zcl_abapgit_http_client
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS check_auth_requested
+      IMPORTING
+        !ii_client               TYPE REF TO if_http_client
+      RETURNING
+        VALUE(rv_auth_requested) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_local_system
+      IMPORTING
+        !iv_url        TYPE string
+      RETURNING
+        VALUE(rv_bool) TYPE abap_bool .
+    CLASS-METHODS acquire_login_details
+      IMPORTING
+        !ii_client       TYPE REF TO if_http_client
+        !io_client       TYPE REF TO zcl_abapgit_http_client
+        !iv_url          TYPE string
+      RETURNING
+        VALUE(rv_scheme) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTTP IMPLEMENTATION.
+ 
+ 
+  METHOD acquire_login_details.
+ 
+    DATA: lv_default_user TYPE string,
+          lv_user         TYPE string,
+          lv_pass         TYPE string,
+          lo_digest       TYPE REF TO zcl_abapgit_http_digest.
+ 
+ 
+    lv_default_user = zcl_abapgit_persistence_user=>get_instance( )->get_repo_login( iv_url ).
+    lv_user         = lv_default_user.
+ 
+    zcl_abapgit_password_dialog=>popup(
+      EXPORTING
+        iv_repo_url     = iv_url
+      CHANGING
+        cv_user         = lv_user
+        cv_pass         = lv_pass ).
+ 
+    IF lv_user IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Unauthorized access. Check your credentials'' ).
+    ENDIF.
+ 
+    IF lv_user <> lv_default_user.
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_login(
+        iv_url   = iv_url
+        iv_login = lv_user ).
+    ENDIF.
+ 
+    rv_scheme = ii_client->response->get_header_field( ''www-authenticate'' ).
+    FIND REGEX ''^(\\w+)'' IN rv_scheme SUBMATCHES rv_scheme.
+ 
+    CASE rv_scheme.
+      WHEN c_scheme-digest.
+* https://en.wikipedia.org/wiki/Digest_access_authentication
+* e.g. used by https://www.gerritcodereview.com/
+        CREATE OBJECT lo_digest
+          EXPORTING
+            ii_client   = ii_client
+            iv_username = lv_user
+            iv_password = lv_pass.
+        lo_digest->run( ii_client ).
+        io_client->set_digest( lo_digest ).
+      WHEN OTHERS.
+* https://en.wikipedia.org/wiki/Basic_access_authentication
+        ii_client->authenticate(
+          username = lv_user
+          password = lv_pass ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_auth_requested.
+ 
+    DATA: lv_code TYPE i.
+ 
+    ii_client->response->get_status( IMPORTING code = lv_code ).
+    IF lv_code = 401.
+      rv_auth_requested = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_by_url.
+ 
+    DATA: lv_uri                 TYPE string,
+          lv_scheme              TYPE string,
+          lv_authorization       TYPE string,
+          li_client              TYPE REF TO if_http_client,
+          lo_proxy_configuration TYPE REF TO zcl_abapgit_proxy_config,
+          lv_text                TYPE string.
+ 
+ 
+    CREATE OBJECT lo_proxy_configuration.
+ 
+    li_client = zcl_abapgit_exit=>get_instance( )->create_http_client( iv_url ).
+ 
+    IF li_client IS NOT BOUND.
+ 
+      cl_http_client=>create_by_url(
+        EXPORTING
+          url                = zcl_abapgit_url=>host( iv_url )
+          ssl_id             = zcl_abapgit_exit=>get_instance( )->get_ssl_id( )
+          proxy_host         = lo_proxy_configuration->get_proxy_url( iv_url )
+          proxy_service      = lo_proxy_configuration->get_proxy_port( iv_url )
+        IMPORTING
+          client             = li_client
+        EXCEPTIONS
+          argument_not_found = 1
+          plugin_not_active  = 2
+          internal_error     = 3
+          OTHERS             = 4 ).
+      IF sy-subrc <> 0.
+        CASE sy-subrc.
+          WHEN 1.
+            " make sure:
+            " a) SSL is setup properly in STRUST
+            lv_text = ''HTTPS ARGUMENT_NOT_FOUND | STRUST/SSL Setup correct?''.
+          WHEN OTHERS.
+            lv_text = ''While creating HTTP Client''.
+ 
+        ENDCASE.
+        zcx_abapgit_exception=>raise( lv_text ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+    IF lo_proxy_configuration->get_proxy_authentication( iv_url ) = abap_true.
+      zcl_abapgit_proxy_auth=>run( li_client ).
+    ENDIF.
+ 
+    CREATE OBJECT ro_client
+      EXPORTING
+        ii_client = li_client.
+ 
+    IF is_local_system( iv_url ) = abap_true.
+      li_client->send_sap_logon_ticket( ).
+    ENDIF.
+ 
+    li_client->request->set_cdata( '''' ).
+    li_client->request->set_header_field(
+        name  = ''~request_method''
+        value = ''GET'' ).
+    li_client->request->set_header_field(
+        name  = ''user-agent''
+        value = get_agent( ) ).
+    lv_uri = zcl_abapgit_url=>path_name( iv_url ) &&
+             ''/info/refs?service=git-'' &&
+             iv_service &&
+             ''-pack''.
+    li_client->request->set_header_field(
+        name  = ''~request_uri''
+        value = lv_uri ).
+ 
+    " Disable internal auth dialog (due to its unclarity)
+    li_client->propertytype_logon_popup = if_http_client=>co_disabled.
+ 
+    lv_authorization = zcl_abapgit_login_manager=>load( iv_url ).
+    IF lv_authorization IS NOT INITIAL.
+      li_client->request->set_header_field(
+        name  = ''authorization''
+        value = lv_authorization ).
+      li_client->propertytype_logon_popup = li_client->co_disabled.
+    ENDIF.
+ 
+    zcl_abapgit_exit=>get_instance( )->http_client(
+      iv_url    = iv_url
+      ii_client = li_client ).
+ 
+    ro_client->send_receive( ).
+    IF check_auth_requested( li_client ) = abap_true.
+      lv_scheme = acquire_login_details( ii_client = li_client
+                                         io_client = ro_client
+                                         iv_url    = iv_url ).
+      ro_client->send_receive( ).
+    ENDIF.
+    ro_client->check_http_200( ).
+ 
+    IF lv_scheme <> c_scheme-digest.
+      zcl_abapgit_login_manager=>save(
+        iv_uri           = iv_url
+        iv_authorization = li_client->request->get_header_field( ''authorization'' ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_agent.
+ 
+* bitbucket require agent prefix = "git/"
+* also see https://github.com/abapGit/abapGit/issues/1432
+    rv_agent = |git/2.0 (abapGit { zif_abapgit_version=>c_abap_version })|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_local_system.
+ 
+    DATA: lv_host TYPE string,
+          lt_list TYPE zif_abapgit_definitions=>ty_string_tt,
+          li_exit TYPE REF TO zif_abapgit_exit.
+ 
+ 
+    cl_http_server=>get_location( IMPORTING host = lv_host ).
+    APPEND lv_host TO lt_list.
+ 
+    APPEND ''localhost'' TO lt_list.
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->change_local_host( CHANGING ct_hosts = lt_list ).
+ 
+    FIND REGEX ''https?://([^/^:]*)'' IN iv_url SUBMATCHES lv_host.
+ 
+    READ TABLE lt_list WITH KEY table_line = lv_host TRANSPORTING NO FIELDS.
+    rv_bool = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTTP_AGENT                  ', 'CLASS zcl_abapgit_http_agent DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_http_agent .
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_instance) TYPE REF TO zif_abapgit_http_agent .
+ 
+    METHODS constructor.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_global_headers TYPE REF TO zcl_abapgit_string_map.
+ 
+    CLASS-METHODS attach_payload
+      IMPORTING
+        ii_request TYPE REF TO if_http_request
+        iv_payload TYPE any
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTTP_AGENT IMPLEMENTATION.
+ 
+ 
+  METHOD attach_payload.
+ 
+    DATA lo_type TYPE REF TO cl_abap_typedescr.
+    lo_type = cl_abap_typedescr=>describe_by_data( iv_payload ).
+ 
+    IF lo_type->type_kind = cl_abap_typedescr=>typekind_xstring.
+      ii_request->set_data( iv_payload ).
+ 
+    ELSEIF lo_type->type_kind = cl_abap_typedescr=>typekind_string.
+      ii_request->set_cdata( iv_payload ).
+ 
+    ELSE.
+      zcx_abapgit_exception=>raise( |Unexpected payload type { lo_type->absolute_name }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    CREATE OBJECT mo_global_headers.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    CREATE OBJECT ri_instance TYPE zcl_abapgit_http_agent.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_http_agent~global_headers.
+ 
+    ro_global_headers = mo_global_headers.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_http_agent~request.
+ 
+    DATA li_client TYPE REF TO if_http_client.
+    DATA lo_proxy_configuration TYPE REF TO zcl_abapgit_proxy_config.
+    DATA lv_code TYPE i.
+    DATA lv_message TYPE string.
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF io_query->mt_entries.
+ 
+    CREATE OBJECT lo_proxy_configuration.
+ 
+    cl_http_client=>create_by_url(
+      EXPORTING
+        url           = iv_url
+        ssl_id        = zcl_abapgit_exit=>get_instance( )->get_ssl_id( )
+        proxy_host    = lo_proxy_configuration->get_proxy_url( iv_url )
+        proxy_service = lo_proxy_configuration->get_proxy_port( iv_url )
+      IMPORTING
+        client = li_client ).
+ 
+    li_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).
+    li_client->request->set_method( iv_method ).
+ 
+    IF io_query IS BOUND.
+      LOOP AT io_query->mt_entries ASSIGNING <ls_entry>.
+        li_client->request->set_form_field(
+          name  = <ls_entry>-k
+          value = <ls_entry>-v ).
+      ENDLOOP.
+    ENDIF.
+ 
+    LOOP AT mo_global_headers->mt_entries ASSIGNING <ls_entry>.
+      li_client->request->set_header_field(
+        name  = to_lower( <ls_entry>-k )
+        value = <ls_entry>-v ).
+    ENDLOOP.
+ 
+    IF io_headers IS BOUND.
+      LOOP AT io_headers->mt_entries ASSIGNING <ls_entry>.
+        li_client->request->set_header_field(
+          name  = to_lower( <ls_entry>-k )
+          value = <ls_entry>-v ).
+      ENDLOOP.
+    ENDIF.
+ 
+    IF iv_method = zif_abapgit_http_agent=>c_methods-post
+      OR iv_method = zif_abapgit_http_agent=>c_methods-put
+      OR iv_method = zif_abapgit_http_agent=>c_methods-patch.
+      attach_payload(
+        ii_request = li_client->request
+        iv_payload = iv_payload ).
+    ENDIF.
+ 
+    li_client->send(
+      EXCEPTIONS
+        http_communication_failure = 1
+        http_invalid_state         = 2
+        http_processing_failed     = 3
+        http_invalid_timeout       = 4
+        OTHERS                     = 5 ).
+    IF sy-subrc = 0.
+      li_client->receive(
+        EXCEPTIONS
+          http_communication_failure = 1
+          http_invalid_state         = 2
+          http_processing_failed     = 3
+          OTHERS                     = 4 ).
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      li_client->get_last_error(
+        IMPORTING
+          code    = lv_code
+          message = lv_message ).
+      zcx_abapgit_exception=>raise( |HTTP error: [{ lv_code }] { lv_message }| ).
+    ENDIF.
+ 
+    ri_response = lcl_http_response=>create( li_client ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTTP_CLIENT                 ', 'CLASS zcl_abapgit_http_client DEFINITION PUBLIC CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS:
+      constructor
+        IMPORTING ii_client TYPE REF TO if_http_client,
+      close,
+      set_digest
+        IMPORTING io_digest TYPE REF TO zcl_abapgit_http_digest,
+      send_receive_close
+        IMPORTING iv_data        TYPE xstring
+        RETURNING VALUE(rv_data) TYPE xstring
+        RAISING   zcx_abapgit_exception,
+      get_cdata
+        RETURNING VALUE(rv_value) TYPE string,
+      check_http_200
+        RAISING zcx_abapgit_exception,
+      check_smart_response
+        IMPORTING iv_expected_content_type TYPE string
+                  iv_content_regex         TYPE string
+        RAISING   zcx_abapgit_exception,
+      send_receive
+        RAISING zcx_abapgit_exception,
+      set_headers
+        IMPORTING iv_url     TYPE string
+                  iv_service TYPE string
+        RAISING   zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+    DATA: mi_client TYPE REF TO if_http_client,
+          mo_digest TYPE REF TO zcl_abapgit_http_digest.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_http_client IMPLEMENTATION.
+ 
+ 
+  METHOD check_http_200.
+ 
+    DATA: lv_code TYPE i,
+          lv_text TYPE string.
+ 
+    mi_client->response->get_status( IMPORTING code = lv_code ).
+    CASE lv_code.
+      WHEN 200.
+        RETURN. " Success, OK
+      WHEN 302.
+        zcx_abapgit_exception=>raise( ''Resource access temporarily redirected (HTTP 302). Check the URL'' ).
+      WHEN 401.
+        zcx_abapgit_exception=>raise( ''Unauthorized access to resource (HTTP 401). Check your credentials'' ).
+      WHEN 403.
+        zcx_abapgit_exception=>raise( ''Access to resource forbidden (HTTP 403)'' ).
+      WHEN 404.
+        zcx_abapgit_exception=>raise( ''Resource not found (HTTP 404). Check the URL'' ).
+      WHEN 407.
+        zcx_abapgit_exception=>raise( ''Proxy authentication required (HTTP 407). Check your credentials'' ).
+      WHEN 408.
+        zcx_abapgit_exception=>raise( ''Request timeout (HTTP 408)'' ).
+      WHEN 415.
+        zcx_abapgit_exception=>raise( ''Unsupported media type (HTTP 415)'' ).
+      WHEN 422.
+        zcx_abapgit_exception=>raise( ''Unprocessable entity (HTTP 422). Check, if URL has to end with ".git"'' ).
+      WHEN OTHERS.
+        lv_text = mi_client->response->get_cdata( ).
+        zcx_abapgit_exception=>raise( |(HTTP { lv_code }) { lv_text }| ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_smart_response.
+ 
+    DATA: lv_content_type TYPE string.
+    DATA: lv_data         TYPE string.
+ 
+    IF iv_expected_content_type IS NOT INITIAL.
+      lv_content_type = mi_client->response->get_content_type( ).
+      IF lv_content_type <> iv_expected_content_type.
+        zcx_abapgit_exception=>raise( ''Wrong Content-Type sent by server - no fallback to the dumb protocol!'' ).
+      ENDIF.
+    ENDIF.
+ 
+    IF iv_content_regex IS NOT INITIAL.
+      lv_data = mi_client->response->get_cdata( ).
+      FIND REGEX iv_content_regex IN lv_data.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( ''Wrong Content sent by server'' ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD close.
+    mi_client->close( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mi_client = ii_client.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_cdata.
+    rv_value = mi_client->response->get_cdata( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD send_receive.
+ 
+    DATA: lv_text    TYPE string,
+          lv_code    TYPE i,
+          lv_message TYPE string.
+ 
+    mi_client->send(
+      EXCEPTIONS
+        http_communication_failure = 1
+        http_invalid_state         = 2
+        http_processing_failed     = 3
+        http_invalid_timeout       = 4
+        OTHERS                     = 5 ).
+ 
+    IF sy-subrc = 0.
+      mi_client->receive(
+        EXCEPTIONS
+          http_communication_failure = 1
+          http_invalid_state         = 2
+          http_processing_failed     = 3
+          OTHERS                     = 4 ).
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      " in case of HTTP_COMMUNICATION_FAILURE
+      " make sure:
+      " a) SSL is setup properly in STRUST
+      " b) no firewalls
+      " check trace file in transaction SMICM
+ 
+      mi_client->get_last_error(
+        IMPORTING
+          code    = lv_code
+          message = lv_message ).
+ 
+      lv_text = |HTTP error { lv_code } occured: { lv_message }|.
+ 
+      zcx_abapgit_exception=>raise( lv_text ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD send_receive_close.
+ 
+* do not use set_cdata as it modifies the Content-Type header field
+    mi_client->request->set_data( iv_data ).
+    send_receive( ).
+    check_http_200( ).
+    rv_data = mi_client->response->get_data( ).
+    mi_client->close( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_digest.
+    mo_digest = io_digest.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_headers.
+ 
+    DATA: lv_value TYPE string.
+ 
+ 
+    mi_client->request->set_header_field(
+        name  = ''~request_method''
+        value = ''POST'' ).
+ 
+    lv_value = zcl_abapgit_url=>path_name( iv_url ) &&
+      ''/git-'' &&
+      iv_service &&
+      ''-pack''.
+    mi_client->request->set_header_field(
+        name  = ''~request_uri''
+        value = lv_value ).
+ 
+    lv_value = ''application/x-git-''
+                  && iv_service && ''-pack-request''.
+    mi_client->request->set_header_field(
+        name  = ''Content-Type''
+        value = lv_value ).
+ 
+    lv_value = ''application/x-git-''
+                  && iv_service && ''-pack-result''.
+    mi_client->request->set_header_field(
+        name  = ''Accept''
+        value = lv_value ).
+ 
+    IF mo_digest IS BOUND.
+      mo_digest->run( mi_client ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTTP_DIGEST                 ', 'CLASS zcl_abapgit_http_digest DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !ii_client   TYPE REF TO if_http_client
+        !iv_username TYPE string
+        !iv_password TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS run
+      IMPORTING
+        !ii_client TYPE REF TO if_http_client
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA: mv_ha1      TYPE string,
+          mv_username TYPE string,
+          mv_realm    TYPE string,
+          mv_qop      TYPE string,
+          mv_nonce    TYPE string.
+ 
+    CLASS-DATA: gv_nc TYPE n LENGTH 8.
+ 
+    CLASS-METHODS:
+      md5
+        IMPORTING
+                  iv_data        TYPE string
+        RETURNING
+                  VALUE(rv_hash) TYPE string
+        RAISING   zcx_abapgit_exception.
+ 
+    METHODS:
+      hash
+        IMPORTING
+                  iv_qop             TYPE string
+                  iv_nonce           TYPE string
+                  iv_uri             TYPE string
+                  iv_method          TYPE string
+                  iv_cnonse          TYPE string
+        RETURNING
+                  VALUE(rv_response) TYPE string
+        RAISING   zcx_abapgit_exception,
+      parse
+        IMPORTING
+          ii_client TYPE REF TO if_http_client.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTTP_DIGEST IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    parse( ii_client ).
+ 
+    mv_ha1 = md5( |{ iv_username }:{ mv_realm }:{ iv_password }| ).
+ 
+    mv_username = iv_username.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD hash.
+ 
+    DATA: lv_ha2 TYPE string.
+ 
+ 
+    lv_ha2 = md5( |{ iv_method }:{ iv_uri }| ).
+ 
+    ASSERT NOT iv_cnonse IS INITIAL.
+ 
+    rv_response = md5( |{ mv_ha1 }:{ iv_nonce }:{ gv_nc }:{ iv_cnonse }:{ iv_qop }:{ lv_ha2 }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD md5.
+ 
+    DATA lv_xstr TYPE xstring.
+    DATA lv_hash TYPE xstring.
+    DATA lv_empty TYPE xstring.
+ 
+    lv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8( iv_data ).
+ 
+    TRY.
+        cl_abap_hmac=>calculate_hmac_for_raw(
+          EXPORTING
+            if_algorithm   = ''MD5''
+            if_key         = lv_empty
+            if_data        = lv_xstr
+          IMPORTING
+            ef_hmacxstring = lv_hash ).
+      CATCH cx_abap_message_digest.
+        zcx_abapgit_exception=>raise( ''error calculating md5'' ).
+    ENDTRY.
+ 
+    rv_hash = lv_hash.
+    TRANSLATE rv_hash TO LOWER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA: lv_value TYPE string.
+ 
+ 
+    lv_value = ii_client->response->get_header_field( ''www-authenticate'' ).
+ 
+    FIND REGEX ''realm="([\\w ]+)"'' IN lv_value SUBMATCHES mv_realm.
+    FIND REGEX ''qop="(\\w+)"'' IN lv_value SUBMATCHES mv_qop.
+    FIND REGEX ''nonce="([\\w=/+\\$]+)"'' IN lv_value SUBMATCHES mv_nonce.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    DATA: lv_response TYPE string,
+          lv_method   TYPE string,
+          lv_cnonce   TYPE string,
+          lv_uri      TYPE string,
+          lv_auth     TYPE string.
+ 
+ 
+    ASSERT NOT mv_nonce IS INITIAL.
+ 
+    lv_method = ii_client->request->get_header_field( ''~request_method'' ).
+    lv_uri = ii_client->request->get_header_field( ''~request_uri'' ).
+ 
+    CALL FUNCTION ''GENERAL_GET_RANDOM_STRING''
+      EXPORTING
+        number_chars  = 24
+      IMPORTING
+        random_string = lv_cnonce.
+ 
+    lv_response = hash(
+      iv_qop    = mv_qop
+      iv_nonce  = mv_nonce
+      iv_uri    = lv_uri
+      iv_method = lv_method
+      iv_cnonse = lv_cnonce ).
+ 
+* client response
+    lv_auth = |Digest username="{ mv_username
+      }", realm="{ mv_realm
+      }", nonce="{ mv_nonce
+      }", uri="{ lv_uri
+      }", qop={ mv_qop
+      }, nc={ gv_nc
+      }, cnonce="{ lv_cnonce
+      }", response="{ lv_response }"|.
+ 
+    ii_client->request->set_header_field(
+      name  = ''Authorization''
+      value = lv_auth ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_LOGIN_MANAGER               ', 'CLASS zcl_abapgit_login_manager DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS load
+      IMPORTING
+        !iv_uri                 TYPE string
+      RETURNING
+        VALUE(rv_authorization) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS save
+      IMPORTING
+        !iv_uri           TYPE string
+        !iv_authorization TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS clear .
+    CLASS-METHODS set
+      IMPORTING
+        !iv_uri        TYPE string
+        !iv_username   TYPE string
+        !iv_password   TYPE string
+      RETURNING
+        VALUE(rv_auth) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get
+      IMPORTING
+        !iv_uri        TYPE string
+      RETURNING
+        VALUE(rv_auth) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_auth,
+        uri           TYPE string,
+        authorization TYPE string,
+      END OF ty_auth .
+ 
+    CLASS-DATA:
+      gt_auth TYPE TABLE OF ty_auth WITH DEFAULT KEY .
+ 
+    CLASS-METHODS append
+      IMPORTING
+        !iv_uri  TYPE string
+        !iv_auth TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_LOGIN_MANAGER IMPLEMENTATION.
+ 
+ 
+  METHOD append.
+ 
+    FIELD-SYMBOLS: <ls_auth> LIKE LINE OF gt_auth.
+ 
+    READ TABLE gt_auth WITH KEY uri = zcl_abapgit_url=>host( iv_uri )
+      TRANSPORTING NO FIELDS.
+    IF sy-subrc <> 0.
+      APPEND INITIAL LINE TO gt_auth ASSIGNING <ls_auth>.
+      <ls_auth>-uri           = zcl_abapgit_url=>host( iv_uri ).
+      <ls_auth>-authorization = iv_auth.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD clear.
+ 
+    CLEAR gt_auth.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get.
+ 
+    DATA ls_auth LIKE LINE OF gt_auth.
+ 
+    READ TABLE gt_auth INTO ls_auth WITH KEY uri = zcl_abapgit_url=>host( iv_uri ).
+    IF sy-subrc = 0.
+      rv_auth = ls_auth-authorization.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD load.
+ 
+    DATA ls_auth LIKE LINE OF gt_auth.
+ 
+    READ TABLE gt_auth INTO ls_auth WITH KEY uri = zcl_abapgit_url=>host( iv_uri ).
+    IF sy-subrc = 0.
+      rv_authorization = ls_auth-authorization.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save.
+ 
+    IF NOT iv_authorization IS INITIAL.
+      append( iv_uri  = iv_uri
+              iv_auth = iv_authorization ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set.
+ 
+    DATA: lv_concat TYPE string.
+ 
+    ASSERT NOT iv_uri IS INITIAL.
+ 
+    IF iv_username IS INITIAL OR iv_password IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    CONCATENATE iv_username '':'' iv_password INTO lv_concat.
+ 
+    rv_auth = cl_http_utility=>encode_base64( lv_concat ).
+ 
+    CONCATENATE ''Basic'' rv_auth INTO rv_auth
+      SEPARATED BY space.
+ 
+    append( iv_uri  = iv_uri
+            iv_auth = rv_auth ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PROXY_AUTH                  ', 'CLASS zcl_abapgit_proxy_auth DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      run
+        IMPORTING ii_client TYPE REF TO if_http_client
+        RAISING   zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+    CLASS-DATA: gv_username TYPE string,
+                gv_password TYPE string.
+ 
+    CLASS-METHODS: enter RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PROXY_AUTH IMPLEMENTATION.
+ 
+ 
+  METHOD enter.
+ 
+    zcl_abapgit_password_dialog=>popup(
+      EXPORTING
+        iv_repo_url = ''Proxy Authentication''
+      CHANGING
+        cv_user     = gv_username
+        cv_pass     = gv_password ).
+ 
+    IF gv_username IS INITIAL OR gv_password IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Proxy auth failed'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    IF gv_username IS INITIAL OR gv_password IS INITIAL.
+      enter( ).
+    ENDIF.
+ 
+    ii_client->authenticate(
+      proxy_authentication = abap_true
+      username             = gv_username
+      password             = gv_password ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PROXY_CONFIG                ', 'CLASS zcl_abapgit_proxy_config DEFINITION PUBLIC FINAL CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor,
+ 
+      get_proxy_url
+        IMPORTING
+          iv_repo_url         TYPE csequence OPTIONAL
+        RETURNING
+          VALUE(rv_proxy_url) TYPE string,
+ 
+      get_proxy_port
+        IMPORTING
+          iv_repo_url    TYPE csequence OPTIONAL
+        RETURNING
+          VALUE(rv_port) TYPE string,
+ 
+      get_proxy_authentication
+        IMPORTING
+          iv_repo_url    TYPE csequence OPTIONAL
+        RETURNING
+          VALUE(rv_auth) TYPE abap_bool.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA: mo_settings TYPE REF TO zcl_abapgit_settings,
+          mi_exit     TYPE REF TO zif_abapgit_exit.
+ 
+    METHODS:
+      bypass_proxy
+        IMPORTING
+          iv_repo_url            TYPE csequence OPTIONAL
+        RETURNING
+          VALUE(rv_bypass_proxy) TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PROXY_CONFIG IMPLEMENTATION.
+ 
+ 
+  METHOD bypass_proxy.
+ 
+    DATA lt_proxy_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url.
+ 
+    lt_proxy_bypass = mo_settings->get_proxy_bypass( ).
+ 
+    IF lt_proxy_bypass IS NOT INITIAL
+    AND iv_repo_url IN lt_proxy_bypass.
+      rv_bypass_proxy = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    mi_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_authentication.
+ 
+    IF bypass_proxy( iv_repo_url ) = abap_false.
+      rv_auth = mo_settings->get_proxy_authentication( ).
+    ENDIF.
+ 
+    mi_exit->change_proxy_authentication(
+      EXPORTING
+        iv_repo_url            = iv_repo_url
+      CHANGING
+        cv_proxy_authentication = rv_auth ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_port.
+ 
+    IF bypass_proxy( iv_repo_url ) = abap_false.
+      rv_port = mo_settings->get_proxy_port( ).
+    ENDIF.
+ 
+    mi_exit->change_proxy_port(
+      EXPORTING
+        iv_repo_url  = iv_repo_url
+      CHANGING
+        cv_proxy_port = rv_port ).
+ 
+    CONDENSE rv_port.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_url.
+ 
+    IF bypass_proxy( iv_repo_url ) = abap_false.
+      rv_proxy_url = mo_settings->get_proxy_url( ).
+    ENDIF.
+ 
+    mi_exit->change_proxy_url(
+      EXPORTING
+        iv_repo_url = iv_repo_url
+      CHANGING
+        cv_proxy_url = rv_proxy_url ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_URL                         ', 'CLASS zcl_abapgit_url DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS validate
+      IMPORTING
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS host
+      IMPORTING
+        !iv_url        TYPE string
+      RETURNING
+        VALUE(rv_host) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS name
+      IMPORTING
+        !iv_url        TYPE string
+        !iv_validate   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_name) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS path_name
+      IMPORTING
+        !iv_url             TYPE string
+      RETURNING
+        VALUE(rv_path_name) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_abapgit_repo
+      IMPORTING
+        !iv_url           TYPE string
+      RETURNING
+        VALUE(rv_abapgit) TYPE abap_bool .
+    CLASS-METHODS url_address
+      IMPORTING
+        !iv_url          TYPE string
+      RETURNING
+        VALUE(rv_adress) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS regex
+      IMPORTING
+        !iv_url  TYPE string
+      EXPORTING
+        !ev_host TYPE string
+        !ev_path TYPE string
+        !ev_name TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_url IMPLEMENTATION.
+ 
+ 
+  METHOD host.
+ 
+    regex( EXPORTING iv_url = iv_url
+           IMPORTING ev_host = rv_host ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_abapgit_repo.
+ 
+    IF iv_url CS ''github.com'' AND ( iv_url CP ''*/abapGit'' OR iv_url CP ''*/abapGit.git'' ).
+      rv_abapgit = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD name.
+ 
+    DATA: lv_path TYPE string.
+ 
+    TRY.
+        regex( EXPORTING iv_url = iv_url
+               IMPORTING ev_name = rv_name
+                         ev_path = lv_path ).
+ 
+        IF rv_name IS INITIAL.
+          FIND REGEX ''([\\w-]+)/$'' IN lv_path SUBMATCHES rv_name.
+          IF sy-subrc <> 0.
+            zcx_abapgit_exception=>raise( ''Malformed URL'' ).
+          ENDIF.
+        ENDIF.
+ 
+      CATCH zcx_abapgit_exception.
+        IF iv_validate = abap_true.
+          zcx_abapgit_exception=>raise( ''Malformed URL'' ).
+        ELSE.
+          rv_name = ''URL error (fix repo with "Advanced > Change Remote")''.
+        ENDIF.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD path_name.
+ 
+    DATA: lv_host TYPE string ##NEEDED.
+ 
+    FIND REGEX ''(.*://[^/]*)(.*)'' IN iv_url
+      SUBMATCHES lv_host rv_path_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD regex.
+ 
+    FIND REGEX ''^(https?://[^/]*)(.*/)(.*)\\.git$'' IN iv_url
+      SUBMATCHES ev_host ev_path ev_name.
+    IF sy-subrc <> 0.
+      FIND REGEX ''^(https?://[^/]*)(.*/)(.*)$'' IN iv_url
+        SUBMATCHES ev_host ev_path ev_name.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( ''Malformed URL'' ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD url_address.
+ 
+    DATA:
+      lv_host TYPE string,
+      lv_path TYPE string,
+      lv_name TYPE string,
+      lv_len  TYPE i.
+ 
+    regex( EXPORTING iv_url  = iv_url
+           IMPORTING ev_host = lv_host
+                     ev_path = lv_path
+                     ev_name = lv_name ).
+ 
+    IF lv_path IS INITIAL AND lv_name IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Malformed URL'' ).
+    ELSEIF lv_name IS INITIAL.
+      lv_len = strlen( lv_path ) - 1.
+      IF lv_path+lv_len(1) = ''/''.
+        lv_path = lv_path(lv_len).
+      ENDIF.
+    ENDIF.
+ 
+    rv_adress = |{ lv_host }{ lv_path }{ lv_name }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate.
+ 
+    name( iv_url      = iv_url
+          iv_validate = abap_true ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_HTTP_AGENT                  ', 'INTERFACE zif_abapgit_http_agent
+  PUBLIC .
+ 
+  CONSTANTS:
+    BEGIN OF c_methods,
+      get    TYPE string VALUE ''GET'',
+      post   TYPE string VALUE ''POST'',
+      put    TYPE string VALUE ''PUT'',
+      delete TYPE string VALUE ''DELETE'',
+      patch  TYPE string VALUE ''PATCH'',
+    END OF c_methods.
+ 
+  METHODS global_headers
+    RETURNING
+      VALUE(ro_global_headers) TYPE REF TO zcl_abapgit_string_map.
+ 
+  METHODS request
+    IMPORTING
+      !iv_url            TYPE string
+      !iv_method         TYPE string DEFAULT c_methods-get
+      !io_query          TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      !io_headers        TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      !iv_payload        TYPE any OPTIONAL " can be string, xstring
+    RETURNING
+      VALUE(ri_response) TYPE REF TO zif_abapgit_http_response
+    RAISING
+      zcx_abapgit_exception .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_HTTP_RESPONSE               ', 'INTERFACE zif_abapgit_http_response
+  PUBLIC .
+ 
+ 
+  METHODS data
+    RETURNING
+      VALUE(rv_data) TYPE xstring .
+  METHODS cdata
+    RETURNING
+      VALUE(rv_data) TYPE string .
+  METHODS json
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error .
+  METHODS is_ok
+    RETURNING
+      VALUE(rv_yes) TYPE abap_bool .
+  METHODS code
+    RETURNING
+      VALUE(rv_code) TYPE i .
+  METHODS error
+    RETURNING
+      VALUE(rv_message) TYPE string .
+  METHODS headers
+    RETURNING
+      VALUE(ro_headers) TYPE REF TO zcl_abapgit_string_map
+    RAISING
+      zcx_abapgit_exception .
+  METHODS close .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_CODE_INSPECTOR              ', 'CLASS zcl_abapgit_code_inspector DEFINITION
+  PUBLIC
+  CREATE PROTECTED
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_code_inspector .
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+    DATA mv_package TYPE devclass .
+ 
+    METHODS create_variant
+      IMPORTING
+        !iv_variant       TYPE sci_chkv
+      RETURNING
+        VALUE(ro_variant) TYPE REF TO cl_ci_checkvariant
+      RAISING
+        zcx_abapgit_exception .
+    METHODS cleanup
+      IMPORTING
+        !io_set TYPE REF TO cl_ci_objectset
+      RAISING
+        zcx_abapgit_exception .
+    METHODS skip_object
+      IMPORTING
+        !is_obj        TYPE scir_objs
+      RETURNING
+        VALUE(rv_skip) TYPE abap_bool.
+  PRIVATE SECTION.
+ 
+    DATA mv_success TYPE abap_bool .
+    DATA mv_summary TYPE string.
+ 
+    TYPES: ty_run_mode TYPE c LENGTH 1.
+ 
+    CONSTANTS:
+      BEGIN OF co_run_mode,
+        run_with_popup   TYPE ty_run_mode VALUE ''P'',
+        run_after_popup  TYPE ty_run_mode VALUE ''A'',
+        run_via_rfc      TYPE ty_run_mode VALUE ''R'',
+        run_in_batch     TYPE ty_run_mode VALUE ''B'',
+        run_loc_parallel TYPE ty_run_mode VALUE ''L'',
+        run_direct       TYPE ty_run_mode VALUE ''L'',
+      END OF co_run_mode .
+    DATA mo_inspection TYPE REF TO cl_ci_inspection .
+    DATA mv_name TYPE sci_objs .
+    DATA mv_run_mode TYPE c LENGTH 1 .
+ 
+    METHODS create_objectset
+      RETURNING
+        VALUE(ro_set) TYPE REF TO cl_ci_objectset .
+    METHODS run_inspection
+      IMPORTING
+        !io_inspection TYPE REF TO cl_ci_inspection
+      RETURNING
+        VALUE(rt_list) TYPE scit_alvlist
+      RAISING
+        zcx_abapgit_exception .
+    METHODS create_inspection
+      IMPORTING
+        !io_set              TYPE REF TO cl_ci_objectset
+        !io_variant          TYPE REF TO cl_ci_checkvariant
+      RETURNING
+        VALUE(ro_inspection) TYPE REF TO cl_ci_inspection
+      RAISING
+        zcx_abapgit_exception .
+    METHODS decide_run_mode
+      RETURNING
+        VALUE(rv_run_mode) TYPE ty_run_mode .
+    METHODS filter_inspection
+      CHANGING
+        !ct_list TYPE scit_alvlist .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_CODE_INSPECTOR IMPLEMENTATION.
+ 
+ 
+  METHOD cleanup.
+ 
+    IF mo_inspection IS BOUND.
+ 
+      mo_inspection->delete(
+        EXCEPTIONS
+          locked              = 1
+          error_in_enqueue    = 2
+          not_authorized      = 3
+          exceptn_appl_exists = 4
+          OTHERS              = 5 ).
+ 
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Couldn''t delete inspection. Subrc = { sy-subrc }| ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+    io_set->delete(
+      EXCEPTIONS
+        exists_in_insp   = 1
+        locked           = 2
+        error_in_enqueue = 3
+        not_authorized   = 4
+        exists_in_objs   = 5
+        OTHERS           = 6 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Couldn''t delete objectset. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    IF iv_package IS INITIAL.
+      zcx_abapgit_exception=>raise( |Please supply package| ).
+    ENDIF.
+ 
+    mv_package = iv_package.
+ 
+    " We create the inspection and objectset with dummy names.
+    " Because we want to persist them so we can run it in parallel.
+    " Both are deleted afterwards.
+    mv_name = |{ sy-uname }_{ sy-datum }_{ sy-uzeit }|.
+    mv_run_mode = decide_run_mode( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_inspection.
+ 
+    cl_ci_inspection=>create(
+      EXPORTING
+        p_user           = sy-uname
+        p_name           = mv_name
+      RECEIVING
+        p_ref            = ro_inspection
+      EXCEPTIONS
+        locked           = 1
+        error_in_enqueue = 2
+        not_authorized   = 3
+        OTHERS           = 4 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Failed to create inspection. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+    ro_inspection->set(
+      p_chkv = io_variant
+      p_objs = io_set ).
+ 
+    ro_inspection->save(
+      EXCEPTIONS
+        missing_information = 1
+        insp_no_name        = 2
+        not_enqueued        = 3
+        OTHERS              = 4 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Failed to save inspection. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_objectset.
+ 
+    DATA: lt_objs       TYPE scit_objs,
+          ls_obj        TYPE scir_objs,
+          lt_objs_check TYPE scit_objs,
+          ls_item       TYPE zif_abapgit_definitions=>ty_item,
+          lt_packages   TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    lt_packages = zcl_abapgit_factory=>get_sap_package( mv_package )->list_subpackages( ).
+    INSERT mv_package INTO TABLE lt_packages.
+ 
+    SELECT object AS objtype obj_name AS objname
+      FROM tadir
+      INTO CORRESPONDING FIELDS OF TABLE lt_objs
+      FOR ALL ENTRIES IN lt_packages
+      WHERE devclass = lt_packages-table_line
+      AND delflag = abap_false
+      AND pgmid = ''R3TR'' ##TOO_MANY_ITAB_FIELDS.        "#EC CI_GENBUFF
+ 
+    LOOP AT lt_objs INTO ls_obj.
+ 
+      IF skip_object( ls_obj ) = abap_true.
+        CONTINUE.
+      ENDIF.
+ 
+      ls_item-obj_type = ls_obj-objtype.
+      ls_item-obj_name = ls_obj-objname.
+ 
+      IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+        CONTINUE.
+      ENDIF.
+ 
+      INSERT ls_obj INTO TABLE lt_objs_check.
+ 
+    ENDLOOP.
+ 
+    ro_set = cl_ci_objectset=>save_from_list(
+      p_name    = mv_name
+      p_objects = lt_objs_check ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_variant.
+ 
+    IF iv_variant IS INITIAL.
+      zcx_abapgit_exception=>raise( |No check variant supplied.| ).
+    ENDIF.
+ 
+    cl_ci_checkvariant=>get_ref(
+      EXPORTING
+        p_user                   = ''''
+        p_name                   = iv_variant
+      RECEIVING
+        p_ref                    = ro_variant
+      EXCEPTIONS
+        chkv_not_exists          = 1
+        missing_parameter        = 2
+        OTHERS                   = 3 ).
+ 
+    CASE sy-subrc.
+      WHEN 1.
+        zcx_abapgit_exception=>raise( |Check variant { iv_variant } doesn''t exist| ).
+      WHEN 2.
+        zcx_abapgit_exception=>raise( |Parameter missing for check variant { iv_variant }| ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decide_run_mode.
+ 
+    DATA lo_settings TYPE REF TO zcl_abapgit_settings.
+    lo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    IF sy-batch = abap_true.
+      " We have to disable parallelization in batch because of lock errors.
+      rv_run_mode = co_run_mode-run_via_rfc.
+    ELSEIF lo_settings->get_parallel_proc_disabled( ) = abap_false.
+      rv_run_mode = co_run_mode-run_loc_parallel.
+    ELSE.
+      rv_run_mode = co_run_mode-run_via_rfc.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_inspection.
+ 
+    " Remove findings in LSVIM* includes which are part of generated maintenance screens
+    DELETE ct_list WHERE sobjtype = ''PROG'' AND sobjname CP ''LSVIM*''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run_inspection.
+ 
+    io_inspection->run(
+      EXPORTING
+        p_howtorun            = mv_run_mode
+      EXCEPTIONS
+        invalid_check_version = 1
+        OTHERS                = 2 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Code inspector run failed. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+    io_inspection->plain_list( IMPORTING p_list = rt_list ).
+ 
+    filter_inspection( CHANGING ct_list = rt_list ).
+ 
+    SORT rt_list BY objtype objname test code sobjtype sobjname line col.
+ 
+    DELETE ADJACENT DUPLICATES FROM rt_list.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD skip_object.
+ 
+    DATA ls_program_type TYPE subc.
+ 
+    CASE is_obj-objtype.
+      WHEN ''PROG''.
+ 
+        SELECT SINGLE subc
+          INTO ls_program_type
+          FROM trdir
+          WHERE name = is_obj-objname.
+ 
+        rv_skip = boolc( ls_program_type = ''I'' ). " Include program.
+ 
+      WHEN OTHERS.
+        rv_skip = abap_false.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~get_summary.
+    rv_summary = mv_summary.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~is_successful.
+ 
+    rv_success = mv_success.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~list_global_variants.
+ 
+    SELECT scichkv_hd~checkvname AS name
+      scichkv_tx~text AS description
+      INTO TABLE rt_list
+      FROM scichkv_hd
+      LEFT OUTER JOIN scichkv_tx
+      ON scichkv_hd~checkvid = scichkv_tx~checkvid
+      AND scichkv_hd~ciuser  = scichkv_tx~ciuser
+      AND scichkv_tx~language = sy-langu
+      WHERE scichkv_hd~ciuser = space.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~run.
+ 
+    DATA: lo_set     TYPE REF TO cl_ci_objectset,
+          lo_variant TYPE REF TO cl_ci_checkvariant,
+          lv_count   TYPE i,
+          lt_list    TYPE scit_alvlist,
+          ls_list    LIKE LINE OF lt_list,
+          ls_result  LIKE LINE OF rt_list,
+          lo_timer   TYPE REF TO zcl_abapgit_timer,
+          lx_error   TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        lo_set = create_objectset( ).
+ 
+        lv_count = lines( lo_set->iobjlst-objects ).
+        IF lv_count = 0.
+          " no objects, nothing to check
+          RETURN.
+        ENDIF.
+ 
+        lo_timer = zcl_abapgit_timer=>create( iv_count = lv_count )->start( ).
+ 
+        lo_variant = create_variant( iv_variant ).
+ 
+        mo_inspection = create_inspection(
+          io_set     = lo_set
+          io_variant = lo_variant ).
+ 
+        lt_list = run_inspection( mo_inspection ).
+ 
+        cleanup( lo_set ).
+ 
+        LOOP AT lt_list INTO ls_list.
+          MOVE-CORRESPONDING ls_list TO ls_result.
+          INSERT ls_result INTO TABLE rt_list.
+        ENDLOOP.
+ 
+        IF iv_save = abap_true.
+          READ TABLE rt_list TRANSPORTING NO FIELDS WITH KEY kind = ''E''.
+          mv_success = boolc( sy-subrc <> 0 ).
+        ENDIF.
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+ 
+        " ensure cleanup
+        cleanup( lo_set ).
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+ 
+    ENDTRY.
+ 
+    mv_summary = lo_timer->end( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~validate_check_variant.
+ 
+    cl_ci_checkvariant=>get_ref(
+      EXPORTING
+        p_user                   = ''''
+        p_name                   = iv_check_variant_name
+      EXCEPTIONS
+        chkv_not_exists          = 1
+        missing_parameter        = 2
+        OTHERS                   = 3 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |No valid check variant { iv_check_variant_name  }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_CODE_INSPECTOR              ', 'INTERFACE zif_abapgit_code_inspector
+  PUBLIC .
+ 
+  TYPES: BEGIN OF ty_result,
+           objtype  TYPE tadir-object,
+           objname  TYPE tadir-obj_name,
+           sobjtype TYPE c LENGTH 4,
+           sobjname TYPE c LENGTH 40,
+           kind     TYPE c LENGTH 1,
+           line     TYPE n LENGTH 6,
+           col      TYPE n LENGTH 4,
+           code     TYPE c LENGTH 10,
+           test     TYPE c LENGTH 30,
+           text     TYPE string,
+           param1   TYPE c LENGTH 80,
+         END OF ty_result.
+ 
+  TYPES ty_results TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY.
+ 
+  TYPES: BEGIN OF ty_variant,
+           name        TYPE sci_chkv,
+           description TYPE string,
+         END OF ty_variant.
+ 
+  TYPES ty_variants TYPE STANDARD TABLE OF ty_variant WITH DEFAULT KEY.
+ 
+  METHODS run
+    IMPORTING
+      !iv_variant    TYPE sci_chkv
+      !iv_save       TYPE abap_bool DEFAULT abap_false
+    RETURNING
+      VALUE(rt_list) TYPE ty_results
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS is_successful
+    RETURNING
+      VALUE(rv_success) TYPE abap_bool .
+ 
+  METHODS get_summary
+    RETURNING
+      VALUE(rv_summary) TYPE string.
+ 
+  METHODS validate_check_variant
+    IMPORTING
+      !iv_check_variant_name TYPE sci_chkv
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS list_global_variants
+    RETURNING
+      VALUE(rt_list) TYPE ty_variants.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_AJSON                       ', 'CLASS zcl_abapgit_ajson DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_ajson .
+ 
+    ALIASES:
+      is_empty FOR zif_abapgit_ajson~is_empty,
+      exists FOR zif_abapgit_ajson~exists,
+      members FOR zif_abapgit_ajson~members,
+      get FOR zif_abapgit_ajson~get,
+      get_boolean FOR zif_abapgit_ajson~get_boolean,
+      get_integer FOR zif_abapgit_ajson~get_integer,
+      get_number FOR zif_abapgit_ajson~get_number,
+      get_date FOR zif_abapgit_ajson~get_date,
+      get_timestamp FOR zif_abapgit_ajson~get_timestamp,
+      get_string FOR zif_abapgit_ajson~get_string,
+      slice FOR zif_abapgit_ajson~slice,
+      to_abap FOR zif_abapgit_ajson~to_abap,
+      array_to_string_table FOR zif_abapgit_ajson~array_to_string_table.
+ 
+    ALIASES:
+      clear FOR zif_abapgit_ajson~clear,
+      set FOR zif_abapgit_ajson~set,
+      setx FOR zif_abapgit_ajson~setx,
+      set_boolean FOR zif_abapgit_ajson~set_boolean,
+      set_string FOR zif_abapgit_ajson~set_string,
+      set_integer FOR zif_abapgit_ajson~set_integer,
+      set_date FOR zif_abapgit_ajson~set_date,
+      set_timestamp FOR zif_abapgit_ajson~set_timestamp,
+      set_null FOR zif_abapgit_ajson~set_null,
+      delete FOR zif_abapgit_ajson~delete,
+      touch_array FOR zif_abapgit_ajson~touch_array,
+      push FOR zif_abapgit_ajson~push,
+      stringify FOR zif_abapgit_ajson~stringify.
+ 
+    ALIASES:
+      clone FOR zif_abapgit_ajson~clone,
+      filter FOR zif_abapgit_ajson~filter,
+      map FOR zif_abapgit_ajson~map.
+ 
+    ALIASES:
+      mt_json_tree FOR zif_abapgit_ajson~mt_json_tree,
+      keep_item_order FOR zif_abapgit_ajson~keep_item_order,
+      format_datetime FOR zif_abapgit_ajson~format_datetime,
+      to_abap_corresponding_only FOR zif_abapgit_ajson~to_abap_corresponding_only,
+      freeze FOR zif_abapgit_ajson~freeze.
+ 
+    CLASS-METHODS parse
+      IMPORTING
+        !iv_json            TYPE string
+        !iv_freeze          TYPE abap_bool DEFAULT abap_false
+        !ii_custom_mapping  TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        !iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+ 
+    CLASS-METHODS create_empty " Might be deprecated, prefer using new( ) or create object
+      IMPORTING
+        !ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+        iv_format_datetime TYPE abap_bool DEFAULT abap_true
+        iv_to_abap_corresponding_only TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson.
+ 
+    " Experimental ! May change
+    CLASS-METHODS create_from " TODO, rename to ''from'' ?
+      IMPORTING
+        !ii_source_json TYPE REF TO zif_abapgit_ajson
+        !ii_filter TYPE REF TO zif_abapgit_ajson_filter OPTIONAL " Might be deprecated, use filter() instead
+        !ii_mapper TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL " Might be deprecated, use map() instead
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+ 
+    METHODS constructor
+      IMPORTING
+        iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+        iv_format_datetime TYPE abap_bool DEFAULT abap_true
+        iv_to_abap_corresponding_only TYPE abap_bool DEFAULT abap_false.
+    CLASS-METHODS new
+      IMPORTING
+        iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+        iv_format_datetime TYPE abap_bool DEFAULT abap_true
+        iv_to_abap_corresponding_only TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson.
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_float_regex TYPE REF TO cl_abap_regex.
+ 
+    DATA ms_opts TYPE zif_abapgit_ajson=>ty_opts.
+    DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping. " DEPRECATED, will be removed
+ 
+    METHODS get_item
+      IMPORTING
+        iv_path        TYPE string
+      RETURNING
+        VALUE(rv_item) TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    METHODS prove_path_exists
+      IMPORTING
+        iv_path              TYPE string
+      RETURNING
+        VALUE(rr_end_node) TYPE REF TO zif_abapgit_ajson_types=>ty_node
+      RAISING
+        zcx_abapgit_ajson_error.
+    METHODS delete_subtree
+      IMPORTING
+        iv_path           TYPE string
+        iv_name           TYPE string
+        ir_parent         TYPE REF TO zif_abapgit_ajson_types=>ty_node OPTIONAL
+      RETURNING
+        VALUE(rs_top_node) TYPE zif_abapgit_ajson_types=>ty_node.
+    METHODS read_only_watchdog
+      RAISING
+        zcx_abapgit_ajson_error.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ajson IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    ms_opts-keep_item_order = iv_keep_item_order.
+    ms_opts-to_abap_corresponding_only = iv_to_abap_corresponding_only.
+    format_datetime( iv_format_datetime ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create_empty.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_to_abap_corresponding_only = iv_to_abap_corresponding_only
+        iv_format_datetime = iv_format_datetime
+        iv_keep_item_order = iv_keep_item_order.
+    ro_instance->mi_custom_mapping = ii_custom_mapping.
+  ENDMETHOD.
+ 
+ 
+  METHOD create_from.
+ 
+    DATA lo_mutator_queue TYPE REF TO lcl_mutator_queue.
+ 
+    IF ii_source_json IS NOT BOUND.
+      zcx_abapgit_ajson_error=>raise( ''Source not bound'' ).
+    ENDIF.
+ 
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_to_abap_corresponding_only = ii_source_json->opts( )-to_abap_corresponding_only
+        iv_format_datetime = ii_source_json->opts( )-format_datetime
+        iv_keep_item_order = ii_source_json->opts( )-keep_item_order.
+ 
+    IF ii_filter IS NOT BOUND AND ii_mapper IS NOT BOUND.
+      ro_instance->mt_json_tree = ii_source_json->mt_json_tree.
+    ELSE.
+      CREATE OBJECT lo_mutator_queue.
+      IF ii_mapper IS BOUND.
+        " Mapping goes first. But maybe it should be a freely definable queue of processors ?
+        lo_mutator_queue->add( lcl_mapper_runner=>new( ii_mapper ) ).
+      ENDIF.
+      IF ii_filter IS BOUND.
+        lo_mutator_queue->add( lcl_filter_runner=>new( ii_filter ) ).
+      ENDIF.
+      lo_mutator_queue->lif_mutator_runner~run(
+        EXPORTING
+          it_source_tree = ii_source_json->mt_json_tree
+        IMPORTING
+          et_dest_tree = ro_instance->mt_json_tree ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_subtree.
+ 
+    DATA lv_parent_path TYPE string.
+    DATA lr_parent LIKE ir_parent.
+ 
+    READ TABLE mt_json_tree INTO rs_top_node
+      WITH KEY
+        path = iv_path
+        name = iv_name.
+    IF sy-subrc <> 0.
+      RETURN. " Not found ? nothing to delete !
+    ENDIF.
+ 
+    DELETE mt_json_tree INDEX sy-tabix. " where path = iv_path and name = iv_name.
+ 
+    IF rs_top_node-children > 0. " only for objects and arrays
+      lv_parent_path = iv_path && iv_name && ''/*''.
+      DELETE mt_json_tree WHERE path CP lv_parent_path.
+    ENDIF.
+ 
+    " decrement parent children
+    IF ir_parent IS SUPPLIED.
+      ir_parent->children = ir_parent->children - 1.
+    ELSE.
+      lr_parent = get_item( iv_path ).
+      IF lr_parent IS NOT INITIAL.
+        lr_parent->children = lr_parent->children - 1.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_item.
+ 
+    FIELD-SYMBOLS <item> LIKE LINE OF mt_json_tree.
+    DATA ls_path_name TYPE zif_abapgit_ajson_types=>ty_path_name.
+    ls_path_name = lcl_utils=>split_path( iv_path ).
+ 
+    READ TABLE mt_json_tree
+      ASSIGNING <item>
+      WITH KEY
+        path = ls_path_name-path
+        name = ls_path_name-name.
+    IF sy-subrc = 0.
+      GET REFERENCE OF <item> INTO rv_item.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_to_abap_corresponding_only = iv_to_abap_corresponding_only
+        iv_format_datetime = iv_format_datetime
+        iv_keep_item_order = iv_keep_item_order.
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA lo_parser TYPE REF TO lcl_json_parser.
+ 
+    CREATE OBJECT ro_instance.
+    CREATE OBJECT lo_parser.
+    ro_instance->mt_json_tree = lo_parser->parse(
+      iv_json            = iv_json
+      iv_keep_item_order = iv_keep_item_order ).
+    ro_instance->mi_custom_mapping = ii_custom_mapping.
+    ro_instance->ms_opts-keep_item_order = iv_keep_item_order.
+ 
+    IF iv_freeze = abap_true.
+      ro_instance->freeze( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD prove_path_exists.
+ 
+    DATA lt_path TYPE string_table.
+    DATA lr_node_parent LIKE rr_end_node.
+    DATA lv_cur_path TYPE string.
+    DATA lv_cur_name TYPE string.
+    DATA ls_new_node LIKE LINE OF mt_json_tree.
+ 
+    SPLIT iv_path AT ''/'' INTO TABLE lt_path.
+    DELETE lt_path WHERE table_line IS INITIAL.
+ 
+    DO.
+      lr_node_parent = rr_end_node.
+      READ TABLE mt_json_tree REFERENCE INTO rr_end_node
+        WITH KEY
+          path = lv_cur_path
+          name = lv_cur_name.
+      IF sy-subrc <> 0. " New node, assume it is always object as it has a named child, use touch_array to init array
+        CLEAR ls_new_node.
+        IF lr_node_parent IS NOT INITIAL. " if has parent
+          lr_node_parent->children = lr_node_parent->children + 1.
+          IF lr_node_parent->type = zif_abapgit_ajson_types=>node_type-array.
+            ls_new_node-index = lcl_utils=>validate_array_index(
+              iv_path  = lv_cur_path
+              iv_index = lv_cur_name ).
+          ENDIF.
+        ENDIF.
+        ls_new_node-path = lv_cur_path.
+        ls_new_node-name = lv_cur_name.
+        ls_new_node-type = zif_abapgit_ajson_types=>node_type-object.
+        INSERT ls_new_node INTO TABLE mt_json_tree REFERENCE INTO rr_end_node.
+      ENDIF.
+      lv_cur_path = lv_cur_path && lv_cur_name && ''/''.
+      READ TABLE lt_path INDEX sy-index INTO lv_cur_name.
+      IF sy-subrc <> 0.
+        EXIT. " no more segments
+      ENDIF.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_only_watchdog.
+    IF ms_opts-read_only = abap_true.
+      zcx_abapgit_ajson_error=>raise( ''This json instance is read only'' ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~array_to_string_table.
+ 
+    DATA lv_normalized_path TYPE string.
+    DATA lr_node TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    FIELD-SYMBOLS <item> LIKE LINE OF mt_json_tree.
+ 
+    lv_normalized_path = lcl_utils=>normalize_path( iv_path ).
+    lr_node = get_item( iv_path ).
+ 
+    IF lr_node IS INITIAL.
+      zcx_abapgit_ajson_error=>raise( |Path not found: { iv_path }| ).
+    ENDIF.
+    IF lr_node->type <> zif_abapgit_ajson_types=>node_type-array.
+      zcx_abapgit_ajson_error=>raise( |Array expected at: { iv_path }| ).
+    ENDIF.
+ 
+    LOOP AT mt_json_tree ASSIGNING <item> WHERE path = lv_normalized_path.
+      CASE <item>-type.
+        WHEN zif_abapgit_ajson_types=>node_type-number OR zif_abapgit_ajson_types=>node_type-string.
+          APPEND <item>-value TO rt_string_table.
+        WHEN zif_abapgit_ajson_types=>node_type-null.
+          APPEND '''' TO rt_string_table.
+        WHEN zif_abapgit_ajson_types=>node_type-boolean.
+          DATA lv_tmp TYPE string.
+          IF <item>-value = ''true''.
+            lv_tmp = abap_true.
+          ELSE.
+            CLEAR lv_tmp.
+          ENDIF.
+          APPEND lv_tmp TO rt_string_table.
+        WHEN OTHERS.
+          zcx_abapgit_ajson_error=>raise( |Cannot convert [{ <item>-type
+            }] to string at [{ <item>-path }{ <item>-name }]| ).
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~clear.
+ 
+    read_only_watchdog( ).
+    CLEAR mt_json_tree.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~clone.
+    ri_json = create_from( me ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~delete.
+ 
+    read_only_watchdog( ).
+ 
+    DATA ls_split_path TYPE zif_abapgit_ajson_types=>ty_path_name.
+    ls_split_path = lcl_utils=>split_path( iv_path ).
+ 
+    delete_subtree(
+      iv_path = ls_split_path-path
+      iv_name = ls_split_path-name ).
+ 
+    ri_json = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~exists.
+    rv_exists = boolc( get_item( iv_path ) IS NOT INITIAL ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~filter.
+    ri_json = create_from(
+      ii_source_json = me
+      ii_filter      = ii_filter ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~format_datetime.
+    ms_opts-format_datetime = iv_use_iso.
+    ri_json = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~freeze.
+    ms_opts-read_only = abap_true.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL.
+      rv_value = lr_item->value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_boolean.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS INITIAL OR lr_item->type = zif_abapgit_ajson_types=>node_type-null.
+      RETURN.
+    ELSEIF lr_item->type = zif_abapgit_ajson_types=>node_type-boolean.
+      rv_value = boolc( lr_item->value = ''true'' ).
+    ELSEIF lr_item->value IS NOT INITIAL.
+      rv_value = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_date.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    DATA lv_y TYPE c LENGTH 4.
+    DATA lv_m TYPE c LENGTH 2.
+    DATA lv_d TYPE c LENGTH 2.
+ 
+    lr_item = get_item( iv_path ).
+ 
+    IF lr_item IS NOT INITIAL AND lr_item->type = zif_abapgit_ajson_types=>node_type-string.
+      FIND FIRST OCCURRENCE OF REGEX ''^(\\d{4})-(\\d{2})-(\\d{2})(T|$)''
+        IN lr_item->value
+        SUBMATCHES lv_y lv_m lv_d.
+      CONCATENATE lv_y lv_m lv_d INTO rv_value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_integer.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL AND lr_item->type = zif_abapgit_ajson_types=>node_type-number.
+      rv_value = lr_item->value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_node_type.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL.
+      rv_node_type = lr_item->type.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_number.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL AND lr_item->type = zif_abapgit_ajson_types=>node_type-number.
+      rv_value = lr_item->value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_string.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL AND lr_item->type <> zif_abapgit_ajson_types=>node_type-null.
+      rv_value = lr_item->value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_timestamp.
+ 
+    DATA lo_to_abap TYPE REF TO lcl_json_to_abap.
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+ 
+    lr_item = get_item( iv_path ).
+ 
+    IF lr_item IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT lo_to_abap.
+ 
+    TRY.
+        rv_value = lo_to_abap->to_timestamp( lr_item->value ).
+      CATCH zcx_abapgit_ajson_error.
+        RETURN.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~is_empty.
+    rv_yes = boolc( lines( mt_json_tree ) = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~keep_item_order.
+    ms_opts-keep_item_order = abap_true.
+    ri_json = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~map.
+    ri_json = create_from(
+      ii_source_json = me
+      ii_mapper      = ii_mapper ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~members.
+ 
+    DATA lv_normalized_path TYPE string.
+    FIELD-SYMBOLS <item> LIKE LINE OF mt_json_tree.
+ 
+    lv_normalized_path = lcl_utils=>normalize_path( iv_path ).
+ 
+    LOOP AT mt_json_tree ASSIGNING <item> WHERE path = lv_normalized_path.
+      APPEND <item>-name TO rt_members.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~opts.
+    rs_opts = ms_opts.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~push.
+ 
+    DATA lr_parent TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    DATA lr_new_node TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+ 
+    read_only_watchdog( ).
+ 
+    lr_parent = get_item( iv_path ).
+ 
+    IF lr_parent IS INITIAL.
+      zcx_abapgit_ajson_error=>raise( |Path [{ iv_path }] does not exist| ).
+    ENDIF.
+ 
+    IF lr_parent->type <> zif_abapgit_ajson_types=>node_type-array.
+      zcx_abapgit_ajson_error=>raise( |Path [{ iv_path }] is not array| ).
+    ENDIF.
+ 
+    DATA lt_new_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA ls_new_path TYPE zif_abapgit_ajson_types=>ty_path_name.
+    DATA lv_new_index TYPE i.
+ 
+    lv_new_index     = lr_parent->children + 1.
+    ls_new_path-path = lcl_utils=>normalize_path( iv_path ).
+    ls_new_path-name = |{ lv_new_index }|.
+ 
+    lt_new_nodes = lcl_abap_to_json=>convert(
+      is_opts            = ms_opts
+      iv_data   = iv_val
+      is_prefix = ls_new_path ).
+    READ TABLE lt_new_nodes INDEX 1 REFERENCE INTO lr_new_node. " assume first record is the array item - not ideal !
+    ASSERT sy-subrc = 0.
+    lr_new_node->index = lv_new_index.
+ 
+    " update data
+    lr_parent->children = lv_new_index.
+    INSERT LINES OF lt_new_nodes INTO TABLE mt_json_tree.
+ 
+    ri_json = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set.
+ 
+    DATA ls_split_path TYPE zif_abapgit_ajson_types=>ty_path_name.
+    DATA lr_parent TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    DATA ls_deleted_node TYPE zif_abapgit_ajson_types=>ty_node.
+    DATA lv_item_order TYPE zif_abapgit_ajson_types=>ty_node-order.
+ 
+    read_only_watchdog( ).
+ 
+    ri_json = me.
+ 
+    IF iv_val IS INITIAL AND iv_ignore_empty = abap_true AND iv_node_type IS INITIAL.
+      RETURN. " nothing to assign
+    ENDIF.
+ 
+    IF iv_node_type IS NOT INITIAL
+      AND iv_node_type <> zif_abapgit_ajson_types=>node_type-boolean AND iv_node_type <> zif_abapgit_ajson_types=>node_type-null
+      AND iv_node_type <> zif_abapgit_ajson_types=>node_type-number AND iv_node_type <> zif_abapgit_ajson_types=>node_type-string.
+      zcx_abapgit_ajson_error=>raise( |Unexpected type { iv_node_type }| ).
+    ENDIF.
+ 
+    ls_split_path = lcl_utils=>split_path( iv_path ).
+    IF ls_split_path IS INITIAL. " Assign root, exceptional processing
+      IF iv_node_type IS NOT INITIAL.
+        mt_json_tree = lcl_abap_to_json=>insert_with_type(
+          is_opts            = ms_opts
+          iv_data            = iv_val
+          iv_type            = iv_node_type
+          is_prefix          = ls_split_path
+          ii_custom_mapping  = mi_custom_mapping ).
+      ELSE.
+        mt_json_tree = lcl_abap_to_json=>convert(
+          is_opts            = ms_opts
+          iv_data            = iv_val
+          is_prefix          = ls_split_path
+          ii_custom_mapping  = mi_custom_mapping ).
+      ENDIF.
+      RETURN.
+    ENDIF.
+ 
+    " Ensure whole path exists
+    lr_parent = prove_path_exists( ls_split_path-path ).
+    ASSERT lr_parent IS NOT INITIAL.
+ 
+    " delete if exists with subtree
+    ls_deleted_node = delete_subtree(
+      ir_parent = lr_parent
+      iv_path   = ls_split_path-path
+      iv_name   = ls_split_path-name ).
+    lv_item_order = ls_deleted_node-order.
+ 
+    " convert to json
+    DATA lt_new_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA lv_array_index TYPE i.
+ 
+    IF lr_parent->type = zif_abapgit_ajson_types=>node_type-array.
+      lv_array_index = lcl_utils=>validate_array_index(
+        iv_path  = ls_split_path-path
+        iv_index = ls_split_path-name ).
+    ELSEIF lr_parent->type = zif_abapgit_ajson_types=>node_type-object
+      AND lv_item_order = 0 AND ms_opts-keep_item_order = abap_true.
+      lv_item_order = lr_parent->children + 1.
+    ENDIF.
+ 
+    IF iv_node_type IS NOT INITIAL.
+      lt_new_nodes = lcl_abap_to_json=>insert_with_type(
+        is_opts            = ms_opts
+        iv_item_order      = lv_item_order
+        iv_data            = iv_val
+        iv_type            = iv_node_type
+        iv_array_index     = lv_array_index
+        is_prefix          = ls_split_path
+        ii_custom_mapping  = mi_custom_mapping ).
+    ELSE.
+      lt_new_nodes = lcl_abap_to_json=>convert(
+        is_opts            = ms_opts
+        iv_item_order      = lv_item_order
+        iv_data            = iv_val
+        iv_array_index     = lv_array_index
+        is_prefix          = ls_split_path
+        ii_custom_mapping  = mi_custom_mapping ).
+    ENDIF.
+ 
+    " update nodes
+    IF lines( lt_new_nodes ) > 0.
+      lr_parent->children = lr_parent->children + 1.
+      INSERT LINES OF lt_new_nodes INTO TABLE mt_json_tree.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~setx.
+ 
+    DATA lv_path TYPE string.
+    DATA lv_val TYPE string.
+    DATA lv_int TYPE i.
+    DATA lv_dec TYPE decfloat34.
+    DATA lv_last TYPE i.
+ 
+    IF iv_param IS INITIAL.
+      ri_json = me.
+      RETURN.
+    ENDIF.
+ 
+    SPLIT iv_param AT '':'' INTO lv_path lv_val.
+    CONDENSE lv_path.
+    CONDENSE lv_val.
+ 
+    IF lv_val IS INITIAL.
+      ri_json = me.
+      RETURN. " Hmm ? or empty string ? or null ?
+    ENDIF.
+ 
+    IF go_float_regex IS NOT BOUND.
+      CREATE OBJECT go_float_regex EXPORTING pattern = ''^([1-9][0-9]*|0)\\.[0-9]+$''.
+      " expects fractional, because ints are detected separately
+    ENDIF.
+ 
+    IF lv_val = ''null''.
+      zif_abapgit_ajson~set_null( lv_path ).
+    ELSEIF lv_val = ''true''.
+      zif_abapgit_ajson~set_boolean(
+        iv_path = lv_path
+        iv_val  = abap_true ).
+    ELSEIF lv_val = ''false''.
+      zif_abapgit_ajson~set_boolean(
+        iv_path = lv_path
+        iv_val  = abap_false ).
+    ELSEIF lv_val CO ''0123456789''.
+      lv_int = lv_val.
+      zif_abapgit_ajson~set_integer(
+        iv_path = lv_path
+        iv_val  = lv_int ).
+    ELSEIF lv_val CO ''0123456789.'' AND go_float_regex->create_matcher( text = lv_val )->match( ) = abap_true.
+      lv_dec = lv_val.
+      zif_abapgit_ajson~set(
+        iv_path = lv_path
+        iv_val  = lv_dec ).
+    ELSEIF lv_val+0(1) = ''{'' OR lv_val+0(1) = ''[''.
+      "Expect object/array, but no further checks, parser will catch errors
+      zif_abapgit_ajson~set(
+        iv_path = lv_path
+        iv_val  = parse(
+          iv_json = lv_val
+          iv_keep_item_order = ms_opts-keep_item_order ) ).
+    ELSE. " string
+      lv_last = strlen( lv_val ) - 1.
+      IF lv_val+0(1) = ''"'' AND lv_val+lv_last(1) = ''"''.
+        lv_val = substring(
+          val = lv_val
+          off = 1
+          len = lv_last - 1 ).
+      ENDIF.
+      zif_abapgit_ajson~set_string(
+        iv_path = lv_path
+        iv_val  = lv_val ).
+    ENDIF.
+ 
+    ri_json = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_boolean.
+ 
+    ri_json = me.
+ 
+    DATA lv_bool TYPE abap_bool.
+    lv_bool = boolc( iv_val IS NOT INITIAL ).
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_bool ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_date.
+ 
+    ri_json = me.
+ 
+    DATA lv_val TYPE string.
+    lv_val = lcl_abap_to_json=>format_date( iv_val ).
+ 
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_val ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_integer.
+ 
+    ri_json = me.
+ 
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = iv_val ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_null.
+ 
+    ri_json = me.
+ 
+    DATA lv_null_ref TYPE REF TO data.
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_null_ref ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_string.
+ 
+    ri_json = me.
+ 
+    DATA lv_val TYPE string.
+    lv_val = iv_val.
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_val ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_timestamp.
+ 
+    ri_json = me.
+ 
+    DATA lv_timestamp_iso TYPE string.
+    lv_timestamp_iso = lcl_abap_to_json=>format_timestamp( iv_val ).
+ 
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_timestamp_iso ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~slice.
+ 
+    DATA lo_section         TYPE REF TO zcl_abapgit_ajson.
+    DATA ls_item            LIKE LINE OF mt_json_tree.
+    DATA lv_normalized_path TYPE string.
+    DATA ls_path_parts      TYPE zif_abapgit_ajson_types=>ty_path_name.
+    DATA lv_path_len        TYPE i.
+    DATA lv_path_pattern    TYPE string.
+ 
+    CREATE OBJECT lo_section.
+    lv_normalized_path = lcl_utils=>normalize_path( iv_path ).
+    lv_path_len        = strlen( lv_normalized_path ).
+    ls_path_parts      = lcl_utils=>split_path( lv_normalized_path ).
+ 
+    READ TABLE mt_json_tree INTO ls_item
+      WITH KEY path = ls_path_parts-path name = ls_path_parts-name.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    CLEAR: ls_item-path, ls_item-name, ls_item-order. " this becomes a new root
+    INSERT ls_item INTO TABLE lo_section->mt_json_tree.
+ 
+    lv_path_pattern = lv_normalized_path && \`*\`.
+ 
+    LOOP AT mt_json_tree INTO ls_item WHERE path CP lv_path_pattern.
+ 
+      ls_item-path = substring( val = ls_item-path
+                                off = lv_path_len - 1 ). " less closing ''/''
+      INSERT ls_item INTO TABLE lo_section->mt_json_tree.
+ 
+    ENDLOOP.
+ 
+    ri_json = lo_section.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~stringify.
+ 
+    rv_json = lcl_json_serializer=>stringify(
+      it_json_tree       = mt_json_tree
+      iv_keep_item_order = ms_opts-keep_item_order
+      iv_indent          = iv_indent ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~touch_array.
+ 
+    DATA lr_node TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    DATA ls_deleted_node TYPE zif_abapgit_ajson_types=>ty_node.
+    DATA ls_new_node LIKE LINE OF mt_json_tree.
+    DATA ls_split_path TYPE zif_abapgit_ajson_types=>ty_path_name.
+ 
+    read_only_watchdog( ).
+ 
+    ls_split_path = lcl_utils=>split_path( iv_path ).
+    IF ls_split_path IS INITIAL. " Assign root, exceptional processing
+      ls_new_node-path = ls_split_path-path.
+      ls_new_node-name = ls_split_path-name.
+      ls_new_node-type = zif_abapgit_ajson_types=>node_type-array.
+      INSERT ls_new_node INTO TABLE mt_json_tree.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_clear = abap_true.
+      ls_deleted_node = delete_subtree(
+        iv_path = ls_split_path-path
+        iv_name = ls_split_path-name ).
+    ELSE.
+      lr_node = get_item( iv_path ).
+    ENDIF.
+ 
+    IF lr_node IS INITIAL. " Or node was cleared
+ 
+      DATA lr_parent TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+      lr_parent = prove_path_exists( ls_split_path-path ).
+      ASSERT lr_parent IS NOT INITIAL.
+ 
+      lr_parent->children = lr_parent->children + 1.
+ 
+      ls_new_node-path = ls_split_path-path.
+      ls_new_node-name = ls_split_path-name.
+      ls_new_node-type = zif_abapgit_ajson_types=>node_type-array.
+ 
+      IF ms_opts-keep_item_order = abap_true AND ls_deleted_node IS NOT INITIAL.
+        ls_new_node-order = ls_deleted_node-order.
+      ENDIF.
+ 
+      INSERT ls_new_node INTO TABLE mt_json_tree.
+ 
+    ELSEIF lr_node->type <> zif_abapgit_ajson_types=>node_type-array.
+      zcx_abapgit_ajson_error=>raise( |Path [{ iv_path }] already used and is not array| ).
+    ENDIF.
+ 
+    ri_json = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~to_abap.
+ 
+    DATA lo_to_abap TYPE REF TO lcl_json_to_abap.
+ 
+    CLEAR ev_container.
+    CREATE OBJECT lo_to_abap
+      EXPORTING
+        iv_corresponding  = boolc( iv_corresponding = abap_true OR ms_opts-to_abap_corresponding_only = abap_true )
+        ii_custom_mapping = mi_custom_mapping.
+ 
+    lo_to_abap->to_abap(
+      EXPORTING
+        it_nodes    = zif_abapgit_ajson~mt_json_tree
+      CHANGING
+        c_container = ev_container ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~to_abap_corresponding_only.
+    ms_opts-to_abap_corresponding_only = iv_enable.
+    ri_json = me.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_AJSON_FILTER_LIB            ', 'CLASS zcl_abapgit_ajson_filter_lib DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create_empty_filter
+      RETURNING
+        VALUE(ri_filter) TYPE REF TO zif_abapgit_ajson_filter
+      RAISING
+        zcx_abapgit_ajson_error .
+    CLASS-METHODS create_path_filter
+      IMPORTING
+        !it_skip_paths TYPE string_table OPTIONAL
+        !iv_skip_paths TYPE string OPTIONAL
+        !iv_pattern_search TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_filter) TYPE REF TO zif_abapgit_ajson_filter
+      RAISING
+        zcx_abapgit_ajson_error .
+    CLASS-METHODS create_and_filter
+      IMPORTING
+        !it_filters TYPE zif_abapgit_ajson_filter=>ty_filter_tab
+      RETURNING
+        VALUE(ri_filter) TYPE REF TO zif_abapgit_ajson_filter
+      RAISING
+        zcx_abapgit_ajson_error .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ajson_filter_lib IMPLEMENTATION.
+ 
+ 
+  METHOD create_and_filter.
+    CREATE OBJECT ri_filter TYPE lcl_and_filter
+      EXPORTING
+        it_filters = it_filters.
+  ENDMETHOD.
+ 
+ 
+  METHOD create_empty_filter.
+    CREATE OBJECT ri_filter TYPE lcl_empty_filter.
+  ENDMETHOD.
+ 
+ 
+  METHOD create_path_filter.
+    CREATE OBJECT ri_filter TYPE lcl_paths_filter
+      EXPORTING
+        iv_pattern_search = iv_pattern_search
+        it_skip_paths = it_skip_paths
+        iv_skip_paths = iv_skip_paths.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_AJSON_MAPPING               ', 'CLASS zcl_abapgit_ajson_mapping DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF rename_by,
+        attr_name TYPE i VALUE 0,
+        full_path TYPE i VALUE 1,
+        pattern TYPE i VALUE 2,
+        " regex type i value 3, " TODO add if needed in future
+      END OF rename_by.
+ 
+    CLASS-METHODS create_camel_case " DEPRECATED
+      IMPORTING
+        it_mapping_fields   TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
+        iv_first_json_upper TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ri_mapping)   TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_upper_case
+      IMPORTING
+        it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_lower_case
+      IMPORTING
+        it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_field_mapping " DEPRECATED
+      IMPORTING
+        it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_rename
+      IMPORTING
+        it_rename_map TYPE zif_abapgit_ajson_mapping=>tty_rename_map
+        iv_rename_by TYPE i DEFAULT rename_by-attr_name
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_compound_mapper
+      IMPORTING
+        ii_mapper1 TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        ii_mapper2 TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        ii_mapper3 TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        it_more TYPE zif_abapgit_ajson_mapping=>ty_table_of OPTIONAL
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_to_snake_case
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_to_camel_case
+      IMPORTING
+        iv_first_json_upper TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ajson_mapping IMPLEMENTATION.
+ 
+ 
+  METHOD create_camel_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_mapping_camel
+      EXPORTING
+        it_mapping_fields   = it_mapping_fields
+        iv_first_json_upper = iv_first_json_upper.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_compound_mapper.
+ 
+    DATA lt_queue TYPE zif_abapgit_ajson_mapping=>ty_table_of.
+ 
+    APPEND ii_mapper1 TO lt_queue.
+    APPEND ii_mapper2 TO lt_queue.
+    APPEND ii_mapper3 TO lt_queue.
+    APPEND LINES OF it_more TO lt_queue.
+    DELETE lt_queue WHERE table_line IS INITIAL.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_compound_mapper
+      EXPORTING
+        it_queue = lt_queue.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_field_mapping.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_mapping_fields
+      EXPORTING
+        it_mapping_fields = it_mapping_fields.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_lower_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_mapping_to_lower
+      EXPORTING
+        it_mapping_fields = it_mapping_fields.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_rename.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_rename
+      EXPORTING
+        it_rename_map = it_rename_map
+        iv_rename_by = iv_rename_by.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_to_camel_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_to_camel
+      EXPORTING
+        iv_first_json_upper = iv_first_json_upper.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_to_snake_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_to_snake.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_upper_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_mapping_to_upper
+      EXPORTING
+        it_mapping_fields = it_mapping_fields.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_AJSON_UTILITIES             ', 'CLASS zcl_abapgit_ajson_utilities DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS new
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson_utilities.
+    METHODS diff
+      IMPORTING
+        !iv_json_a            TYPE string OPTIONAL
+        !iv_json_b            TYPE string OPTIONAL
+        !io_json_a            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !io_json_b            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !iv_keep_empty_arrays TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        !eo_insert            TYPE REF TO zif_abapgit_ajson
+        !eo_delete            TYPE REF TO zif_abapgit_ajson
+        !eo_change            TYPE REF TO zif_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS merge
+      IMPORTING
+        !iv_json_a            TYPE string OPTIONAL
+        !iv_json_b            TYPE string OPTIONAL
+        !io_json_a            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !io_json_b            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !iv_keep_empty_arrays TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_json)        TYPE REF TO zif_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS sort
+      IMPORTING
+        !iv_json         TYPE string OPTIONAL
+        !io_json         TYPE REF TO zif_abapgit_ajson OPTIONAL
+      RETURNING
+        VALUE(rv_sorted) TYPE string
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS is_equal
+      IMPORTING
+        !iv_json_a            TYPE string OPTIONAL
+        !iv_json_b            TYPE string OPTIONAL
+        !ii_json_a            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !ii_json_b            TYPE REF TO zif_abapgit_ajson OPTIONAL
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool
+      RAISING
+        zcx_abapgit_ajson_error .
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mo_json_a TYPE REF TO zif_abapgit_ajson .
+    DATA mo_json_b TYPE REF TO zif_abapgit_ajson .
+    DATA mo_insert TYPE REF TO zif_abapgit_ajson .
+    DATA mo_delete TYPE REF TO zif_abapgit_ajson .
+    DATA mo_change TYPE REF TO zif_abapgit_ajson .
+ 
+    METHODS normalize_input
+      IMPORTING
+        !iv_json       TYPE string OPTIONAL
+        !io_json       TYPE REF TO zif_abapgit_ajson OPTIONAL
+      RETURNING
+        VALUE(ro_json) TYPE REF TO zif_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS diff_a_b
+      IMPORTING
+        !iv_path TYPE string
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS diff_b_a
+      IMPORTING
+        !iv_path  TYPE string
+        !iv_array TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS delete_empty_nodes
+      IMPORTING
+        !io_json              TYPE REF TO zif_abapgit_ajson
+        !iv_keep_empty_arrays TYPE abap_bool
+      RAISING
+        zcx_abapgit_ajson_error .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION.
+ 
+ 
+  METHOD delete_empty_nodes.
+ 
+    DATA ls_json_tree LIKE LINE OF io_json->mt_json_tree.
+    DATA lv_done TYPE abap_bool.
+ 
+    DO.
+      lv_done = abap_true.
+ 
+      IF iv_keep_empty_arrays = abap_false.
+        LOOP AT io_json->mt_json_tree INTO ls_json_tree
+          WHERE type = zif_abapgit_ajson_types=>node_type-array AND children = 0.
+ 
+          io_json->delete( ls_json_tree-path && ls_json_tree-name ).
+ 
+        ENDLOOP.
+        IF sy-subrc = 0.
+          lv_done = abap_false.
+        ENDIF.
+      ENDIF.
+ 
+      LOOP AT io_json->mt_json_tree INTO ls_json_tree
+        WHERE type = zif_abapgit_ajson_types=>node_type-object AND children = 0.
+ 
+        io_json->delete( ls_json_tree-path && ls_json_tree-name ).
+ 
+      ENDLOOP.
+      IF sy-subrc = 0.
+        lv_done = abap_false.
+      ENDIF.
+ 
+      IF lv_done = abap_true.
+        EXIT. " nothing else to delete
+      ENDIF.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD diff.
+ 
+    mo_json_a = normalize_input(
+      iv_json = iv_json_a
+      io_json = io_json_a ).
+ 
+    mo_json_b = normalize_input(
+      iv_json = iv_json_b
+      io_json = io_json_b ).
+ 
+    mo_insert = zcl_abapgit_ajson=>create_empty( ).
+    mo_delete = zcl_abapgit_ajson=>create_empty( ).
+    mo_change = zcl_abapgit_ajson=>create_empty( ).
+ 
+    diff_a_b( ''/'' ).
+    diff_b_a( ''/'' ).
+ 
+    eo_insert ?= mo_insert.
+    eo_delete ?= mo_delete.
+    eo_change ?= mo_change.
+ 
+    delete_empty_nodes(
+      io_json              = eo_insert
+      iv_keep_empty_arrays = iv_keep_empty_arrays ).
+    delete_empty_nodes(
+      io_json              = eo_delete
+      iv_keep_empty_arrays = iv_keep_empty_arrays ).
+    delete_empty_nodes(
+      io_json              = eo_change
+      iv_keep_empty_arrays = iv_keep_empty_arrays ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD diff_a_b.
+ 
+    DATA:
+      lv_path_a TYPE string,
+      lv_path_b TYPE string.
+ 
+    FIELD-SYMBOLS:
+      <node_a> LIKE LINE OF mo_json_a->mt_json_tree,
+      <node_b> LIKE LINE OF mo_json_a->mt_json_tree.
+ 
+    LOOP AT mo_json_a->mt_json_tree ASSIGNING <node_a> WHERE path = iv_path.
+      lv_path_a = <node_a>-path && <node_a>-name && ''/''.
+ 
+      READ TABLE mo_json_b->mt_json_tree ASSIGNING <node_b>
+        WITH TABLE KEY path = <node_a>-path name = <node_a>-name.
+      IF sy-subrc = 0.
+        lv_path_b = <node_b>-path && <node_b>-name && ''/''.
+ 
+        IF <node_a>-type = <node_b>-type.
+          CASE <node_a>-type.
+            WHEN zif_abapgit_ajson_types=>node_type-array.
+              mo_insert->touch_array( lv_path_a ).
+              mo_change->touch_array( lv_path_a ).
+              mo_delete->touch_array( lv_path_a ).
+              diff_a_b( lv_path_a ).
+            WHEN zif_abapgit_ajson_types=>node_type-object.
+              diff_a_b( lv_path_a ).
+            WHEN OTHERS.
+              IF <node_a>-value <> <node_b>-value.
+                " save as changed value
+                mo_change->set(
+                  iv_path      = lv_path_b
+                  iv_val       = <node_b>-value
+                  iv_node_type = <node_b>-type ).
+              ENDIF.
+          ENDCASE.
+        ELSE.
+          " save changed type as delete + insert
+          CASE <node_a>-type.
+            WHEN zif_abapgit_ajson_types=>node_type-array.
+              mo_delete->touch_array( lv_path_a ).
+              diff_a_b( lv_path_a ).
+            WHEN zif_abapgit_ajson_types=>node_type-object.
+              diff_a_b( lv_path_a ).
+            WHEN OTHERS.
+              mo_delete->set(
+                iv_path      = lv_path_a
+                iv_val       = <node_a>-value
+                iv_node_type = <node_a>-type ).
+          ENDCASE.
+          CASE <node_b>-type.
+            WHEN zif_abapgit_ajson_types=>node_type-array.
+              mo_insert->touch_array( lv_path_b ).
+              diff_b_a( lv_path_b ).
+            WHEN zif_abapgit_ajson_types=>node_type-object.
+              diff_b_a( lv_path_b ).
+            WHEN OTHERS.
+              mo_insert->set(
+                iv_path      = lv_path_b
+                iv_val       = <node_b>-value
+                iv_node_type = <node_b>-type ).
+          ENDCASE.
+        ENDIF.
+      ELSE.
+        " save as delete
+        CASE <node_a>-type.
+          WHEN zif_abapgit_ajson_types=>node_type-array.
+            mo_delete->touch_array( lv_path_a ).
+            diff_a_b( lv_path_a ).
+          WHEN zif_abapgit_ajson_types=>node_type-object.
+            diff_a_b( lv_path_a ).
+          WHEN OTHERS.
+            mo_delete->set(
+              iv_path      = lv_path_a
+              iv_val       = <node_a>-value
+              iv_node_type = <node_a>-type ).
+        ENDCASE.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD diff_b_a.
+ 
+    DATA lv_path TYPE string.
+ 
+    FIELD-SYMBOLS <node_b> LIKE LINE OF mo_json_b->mt_json_tree.
+ 
+    LOOP AT mo_json_b->mt_json_tree ASSIGNING <node_b> WHERE path = iv_path.
+      lv_path = <node_b>-path && <node_b>-name && ''/''.
+ 
+      CASE <node_b>-type.
+        WHEN zif_abapgit_ajson_types=>node_type-array.
+          mo_insert->touch_array( lv_path ).
+          diff_b_a(
+            iv_path  = lv_path
+            iv_array = abap_true ).
+        WHEN zif_abapgit_ajson_types=>node_type-object.
+          diff_b_a( lv_path ).
+        WHEN OTHERS.
+          IF iv_array = abap_false.
+            READ TABLE mo_json_a->mt_json_tree TRANSPORTING NO FIELDS
+              WITH TABLE KEY path = <node_b>-path name = <node_b>-name.
+            IF sy-subrc <> 0.
+              " save as insert
+              mo_insert->set(
+                iv_path      = lv_path
+                iv_val       = <node_b>-value
+                iv_node_type = <node_b>-type ).
+            ENDIF.
+          ELSE.
+            READ TABLE mo_insert->mt_json_tree TRANSPORTING NO FIELDS
+              WITH KEY path = <node_b>-path value = <node_b>-value.
+            IF sy-subrc <> 0.
+              " save as new array value
+              mo_insert->push(
+                iv_path = iv_path
+                iv_val  = <node_b>-value ).
+            ENDIF.
+          ENDIF.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_equal.
+ 
+    DATA li_ins TYPE REF TO zif_abapgit_ajson.
+    DATA li_del TYPE REF TO zif_abapgit_ajson.
+    DATA li_mod TYPE REF TO zif_abapgit_ajson.
+ 
+    diff(
+      EXPORTING
+        iv_json_a = iv_json_a
+        iv_json_b = iv_json_b
+        io_json_a = ii_json_a
+        io_json_b = ii_json_b
+      IMPORTING
+        eo_insert = li_ins
+        eo_delete = li_del
+        eo_change = li_mod ).
+ 
+    rv_yes = boolc(
+      li_ins->is_empty( ) = abap_true AND
+      li_del->is_empty( ) = abap_true AND
+      li_mod->is_empty( ) = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD merge.
+ 
+    mo_json_a = normalize_input(
+      iv_json = iv_json_a
+      io_json = io_json_a ).
+ 
+    mo_json_b = normalize_input(
+      iv_json = iv_json_b
+      io_json = io_json_b ).
+ 
+    " Start with first JSON...
+    mo_insert = mo_json_a.
+ 
+    " ...and add all nodes from second JSON
+    diff_b_a( ''/'' ).
+ 
+    ro_json ?= mo_insert.
+ 
+    delete_empty_nodes(
+      io_json              = ro_json
+      iv_keep_empty_arrays = iv_keep_empty_arrays ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance.
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_input.
+ 
+    IF boolc( iv_json IS INITIAL ) = boolc( io_json IS INITIAL ).
+      zcx_abapgit_ajson_error=>raise( ''Either supply JSON string or instance, but not both'' ).
+    ENDIF.
+ 
+    IF iv_json IS NOT INITIAL.
+      ro_json = zcl_abapgit_ajson=>parse( iv_json ).
+    ELSEIF io_json IS NOT INITIAL.
+      ro_json = io_json.
+    ELSE.
+      zcx_abapgit_ajson_error=>raise( ''Supply either JSON string or instance'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sort.
+ 
+    DATA lo_json TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_json = normalize_input(
+      iv_json = iv_json
+      io_json = io_json ).
+ 
+    " Nodes are parsed into a sorted table, so no explicit sorting required
+    rv_sorted = lo_json->stringify( 2 ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCX_ABAPGIT_AJSON_ERROR                 ', 'class zcx_abapgit_ajson_error definition
+  public
+  inheriting from CX_STATIC_CHECK
+  final
+  create public .
+ 
+public section.
+ 
+  interfaces IF_T100_MESSAGE .
+ 
+  types:
+    ty_rc type c length 4 .
+ 
+  constants:
+    begin of ZCX_AJSON_ERROR,
+      msgid type symsgid value ''00'',
+      msgno type symsgno value ''001'',
+      attr1 type scx_attrname value ''A1'',
+      attr2 type scx_attrname value ''A2'',
+      attr3 type scx_attrname value ''A3'',
+      attr4 type scx_attrname value ''A4'',
+    end of ZCX_AJSON_ERROR .
+  data RC type TY_RC read-only .
+  data MESSAGE type STRING read-only .
+  data LOCATION type STRING read-only .
+  data A1 type SYMSGV read-only .
+  data A2 type SYMSGV read-only .
+  data A3 type SYMSGV read-only .
+  data A4 type SYMSGV read-only .
+ 
+  methods CONSTRUCTOR
+    importing
+      !TEXTID like IF_T100_MESSAGE=>T100KEY optional
+      !PREVIOUS like PREVIOUS optional
+      !RC type TY_RC optional
+      !MESSAGE type STRING optional
+      !LOCATION type STRING optional
+      !A1 type SYMSGV optional
+      !A2 type SYMSGV optional
+      !A3 type SYMSGV optional
+      !A4 type SYMSGV optional .
+  class-methods RAISE
+    importing
+      !IV_MSG type STRING
+      !IV_LOCATION type STRING optional
+      !IS_NODE type ANY optional
+    raising
+      zcx_abapgit_ajson_error .
+  methods SET_LOCATION
+    importing
+      !IV_LOCATION type STRING optional
+      !IS_NODE type ANY optional
+    preferred parameter IV_LOCATION .
+protected section.
+private section.
+  types:
+    begin of ty_message_parts,
+      a1 like a1,
+      a2 like a1,
+      a3 like a1,
+      a4 like a1,
+    end of ty_message_parts.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcx_abapgit_ajson_error IMPLEMENTATION.
+ 
+ 
+method CONSTRUCTOR.
+CALL METHOD SUPER->CONSTRUCTOR
+EXPORTING
+PREVIOUS = PREVIOUS
+.
+me->RC = RC .
+me->MESSAGE = MESSAGE .
+me->LOCATION = LOCATION .
+me->A1 = A1 .
+me->A2 = A2 .
+me->A3 = A3 .
+me->A4 = A4 .
+clear me->textid.
+if textid is initial.
+  IF_T100_MESSAGE~T100KEY = ZCX_AJSON_ERROR .
+else.
+  IF_T100_MESSAGE~T100KEY = TEXTID.
+endif.
+endmethod.
+ 
+ 
+method raise.
+ 
+  data lx type ref to zcx_abapgit_ajson_error.
+ 
+  create object lx exporting message = iv_msg.
+  lx->set_location(
+    iv_location = iv_location
+    is_node     = is_node ).
+  raise exception lx.
+ 
+endmethod.
+ 
+ 
+method set_location.
+ 
+  data ls_msg type ty_message_parts.
+  data lv_location type string.
+  data lv_tmp type string.
+  field-symbols <path> type string.
+  field-symbols <name> type string.
+ 
+  if iv_location is not initial.
+    lv_location = iv_location.
+  elseif is_node is not initial.
+    assign component ''PATH'' of structure is_node to <path>.
+    assign component ''NAME'' of structure is_node to <name>.
+    if <path> is assigned and <name> is assigned.
+      lv_location = <path> && <name>.
+    endif.
+  endif.
+ 
+  if lv_location is not initial.
+    lv_tmp = message && | @{ lv_location }|.
+  else.
+    lv_tmp = message.
+  endif.
+ 
+  ls_msg = lv_tmp.
+ 
+  location = lv_location.
+  a1       = ls_msg-a1.
+  a2       = ls_msg-a2.
+  a3       = ls_msg-a3.
+  a4       = ls_msg-a4.
+ 
+endmethod.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AJSON                       ', 'INTERFACE zif_abapgit_ajson
+  PUBLIC.
+ 
+  CONSTANTS version TYPE string VALUE ''v1.1.8''. "#EC NOTEXT
+  CONSTANTS origin TYPE string VALUE ''https://github.com/sbcgua/ajson''. "#EC NOTEXT
+  CONSTANTS license TYPE string VALUE ''MIT''. "#EC NOTEXT
+ 
+  TYPES:
+    BEGIN OF ty_opts,
+      read_only TYPE abap_bool,
+      keep_item_order TYPE abap_bool,
+      format_datetime TYPE abap_bool,
+      to_abap_corresponding_only TYPE abap_bool,
+    END OF ty_opts.
+ 
+  " DATA
+ 
+  DATA mt_json_tree TYPE zif_abapgit_ajson_types=>ty_nodes_ts READ-ONLY.
+ 
+  " CLONING
+ 
+  METHODS clone
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+  METHODS filter
+    IMPORTING
+      ii_filter TYPE REF TO zif_abapgit_ajson_filter
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+  METHODS map
+    IMPORTING
+      ii_mapper TYPE REF TO zif_abapgit_ajson_mapping
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  " METHODS
+ 
+  METHODS freeze.
+  METHODS keep_item_order
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson.
+  METHODS format_datetime
+    IMPORTING
+      iv_use_iso TYPE abap_bool DEFAULT abap_true
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson.
+  METHODS to_abap_corresponding_only
+    IMPORTING
+      iv_enable TYPE abap_bool DEFAULT abap_true
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson.
+  METHODS opts
+    RETURNING
+      VALUE(rs_opts) TYPE ty_opts.
+ 
+  " METHODS ex.reader
+ 
+  METHODS is_empty
+    RETURNING
+      VALUE(rv_yes) TYPE abap_bool.
+ 
+  METHODS exists
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_exists) TYPE abap_bool.
+ 
+  METHODS members
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rt_members) TYPE string_table.
+ 
+  METHODS get
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_value) TYPE string.
+ 
+  METHODS get_node_type
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_node_type) TYPE zif_abapgit_ajson_types=>ty_node_type.
+ 
+  METHODS get_boolean
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_value) TYPE abap_bool.
+ 
+  METHODS get_integer
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_value) TYPE i.
+ 
+  METHODS get_number
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_value) TYPE f.
+ 
+  METHODS get_date
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_value) TYPE d.
+ 
+  METHODS get_timestamp
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_value) TYPE timestamp.
+ 
+  METHODS get_string
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rv_value) TYPE string.
+ 
+  METHODS slice
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson.
+ 
+  METHODS to_abap
+    IMPORTING
+      iv_corresponding TYPE abap_bool DEFAULT abap_false
+    EXPORTING
+      ev_container TYPE any
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS array_to_string_table
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(rt_string_table) TYPE string_table
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  " METHODS ex.writer
+ 
+  METHODS clear
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS set
+    IMPORTING
+      iv_path TYPE string
+      iv_val TYPE any
+      iv_ignore_empty TYPE abap_bool DEFAULT abap_true
+      iv_node_type TYPE zif_abapgit_ajson_types=>ty_node_type OPTIONAL
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS setx
+    IMPORTING
+      iv_param TYPE string
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS set_boolean
+    IMPORTING
+      iv_path TYPE string
+      iv_val TYPE any
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS set_string
+    IMPORTING
+      iv_path TYPE string
+      iv_val TYPE clike
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS set_integer
+    IMPORTING
+      iv_path TYPE string
+      iv_val TYPE i
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS set_date
+    IMPORTING
+      iv_path TYPE string
+      iv_val TYPE d
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS set_timestamp
+    IMPORTING
+      iv_path TYPE string
+      iv_val TYPE timestamp
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS set_null
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS delete
+    IMPORTING
+      iv_path TYPE string
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS touch_array
+    IMPORTING
+      iv_path TYPE string
+      iv_clear TYPE abap_bool DEFAULT abap_false
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS push
+    IMPORTING
+      iv_path TYPE string
+      iv_val TYPE any
+    RETURNING
+      VALUE(ri_json) TYPE REF TO zif_abapgit_ajson
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+  METHODS stringify
+    IMPORTING
+      iv_indent TYPE i DEFAULT 0
+    RETURNING
+      VALUE(rv_json) TYPE string
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AJSON_FILTER                ', 'INTERFACE zif_abapgit_ajson_filter
+  PUBLIC.
+ 
+  TYPES ty_filter_tab TYPE STANDARD TABLE OF REF TO zif_abapgit_ajson_filter WITH KEY table_line.
+  TYPES ty_visit_type TYPE i.
+ 
+  CONSTANTS:
+    BEGIN OF visit_type,
+      value TYPE ty_visit_type VALUE 0,
+      open  TYPE ty_visit_type VALUE 1,
+      close TYPE ty_visit_type VALUE 2,
+    END OF visit_type.
+ 
+  METHODS keep_node
+    IMPORTING
+      is_node TYPE zif_abapgit_ajson_types=>ty_node
+      iv_visit TYPE ty_visit_type DEFAULT visit_type-value
+    RETURNING
+      VALUE(rv_keep) TYPE abap_bool
+    RAISING
+      zcx_abapgit_ajson_error.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AJSON_MAPPING               ', 'INTERFACE zif_abapgit_ajson_mapping
+  PUBLIC.
+ 
+  TYPES:
+    BEGIN OF ty_mapping_field, " deprecated, will be removed
+      abap TYPE string,
+      json TYPE string,
+    END OF ty_mapping_field,
+    ty_mapping_fields TYPE STANDARD TABLE OF ty_mapping_field
+      WITH UNIQUE SORTED KEY abap COMPONENTS abap
+      WITH UNIQUE SORTED KEY json COMPONENTS json.
+ 
+  TYPES:
+    BEGIN OF ty_rename,
+      from TYPE string,
+      to TYPE string,
+    END OF ty_rename,
+    tty_rename_map TYPE STANDARD TABLE OF ty_rename
+      WITH UNIQUE SORTED KEY by_name COMPONENTS from.
+ 
+  TYPES:
+    ty_table_of TYPE STANDARD TABLE OF REF TO zif_abapgit_ajson_mapping.
+ 
+  METHODS to_abap " deprecated, will be removed
+    IMPORTING
+      !iv_path         TYPE string
+      !iv_name         TYPE string
+    RETURNING
+      VALUE(rv_result) TYPE string.
+ 
+  METHODS to_json " deprecated, will be removed
+    IMPORTING
+      !iv_path         TYPE string
+      !iv_name         TYPE string
+    RETURNING
+      VALUE(rv_result) TYPE string.
+ 
+  METHODS rename_node
+    IMPORTING
+      !is_node TYPE zif_abapgit_ajson_types=>ty_node
+    CHANGING
+      !cv_name TYPE zif_abapgit_ajson_types=>ty_node-name.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AJSON_TYPES                 ', 'INTERFACE zif_abapgit_ajson_types
+  PUBLIC.
+ 
+  TYPES:
+    ty_node_type TYPE string.
+ 
+  CONSTANTS:
+    BEGIN OF node_type,
+      boolean TYPE ty_node_type VALUE ''bool'',
+      string  TYPE ty_node_type VALUE ''str'',
+      number  TYPE ty_node_type VALUE ''num'',
+      null    TYPE ty_node_type VALUE ''null'',
+      array   TYPE ty_node_type VALUE ''array'',
+      object  TYPE ty_node_type VALUE ''object'',
+    END OF node_type.
+ 
+  TYPES:
+    BEGIN OF ty_node,
+      path TYPE string,
+      name TYPE string,
+      type TYPE ty_node_type,
+      value TYPE string,
+      index TYPE i,
+      order TYPE i,
+      children TYPE i,
+    END OF ty_node.
+  TYPES:
+    ty_nodes_tt TYPE STANDARD TABLE OF ty_node WITH KEY path name.
+  TYPES:
+    ty_nodes_ts TYPE SORTED TABLE OF ty_node
+      WITH UNIQUE KEY path name
+      WITH NON-UNIQUE SORTED KEY array_index COMPONENTS path index
+      WITH NON-UNIQUE SORTED KEY item_order COMPONENTS path order.
+ 
+  TYPES:
+    BEGIN OF ty_path_name,
+      path TYPE string,
+      name TYPE string,
+    END OF ty_path_name.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_AFF_REGISTRY                ', 'CLASS zcl_abapgit_aff_registry DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_aff_registry.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          io_settings TYPE REF TO zcl_abapgit_settings OPTIONAL.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_registry_entry,
+        obj_type     TYPE tadir-object,
+        experimental TYPE abap_bool,
+      END OF ty_registry_entry.
+ 
+    CLASS-DATA:
+      gt_registry TYPE HASHED TABLE OF ty_registry_entry WITH UNIQUE KEY obj_type.
+ 
+    DATA:
+      mo_settings TYPE REF TO zcl_abapgit_settings.
+    METHODS initialize_registry_table.
+ 
+    CLASS-METHODS:
+      register
+        IMPORTING
+          iv_obj_type     TYPE tadir-object
+          iv_experimental TYPE abap_bool DEFAULT abap_false.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_aff_registry IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    IF io_settings IS SUPPLIED.
+      mo_settings = io_settings.
+    ELSE.
+      mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD initialize_registry_table.
+    register( iv_obj_type = ''CHKC'' ).
+    register( iv_obj_type = ''CHKO'' ).
+    register( iv_obj_type = ''CHKV'' ).
+    register( iv_obj_type = ''EVTB'' ).
+    register( iv_obj_type = ''EEEC'' ).
+    register( iv_obj_type = ''GSMP'' ).
+    register( iv_obj_type     = ''INTF''
+              iv_experimental = abap_true ).
+    register( iv_obj_type = ''SMBC'' ).
+    register( iv_obj_type = ''NONT'' ).
+    register( iv_obj_type = ''RONT'' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD register.
+    DATA ls_registry_entry TYPE ty_registry_entry.
+ 
+    ls_registry_entry-obj_type = iv_obj_type.
+    ls_registry_entry-experimental = iv_experimental.
+    INSERT ls_registry_entry INTO TABLE gt_registry.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_aff_registry~is_supported_object_type.
+ 
+    DATA ls_registry_entry TYPE ty_registry_entry.
+ 
+    IF gt_registry IS INITIAL.
+      initialize_registry_table( ).
+    ENDIF.
+ 
+    READ TABLE gt_registry WITH TABLE KEY obj_type = iv_obj_type INTO ls_registry_entry.
+    IF sy-subrc = 0 AND ls_registry_entry-experimental = abap_false.
+      rv_result = abap_true.
+    ELSEIF sy-subrc = 0 AND mo_settings->get_experimental_features( ) = abap_true.
+      rv_result = abap_true.
+    ELSE.
+      rv_result = abap_false.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_JSON_HANDLER                ', 'CLASS zcl_abapgit_json_handler DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_json_abap_mapping,
+        json TYPE string,
+        abap TYPE string,
+      END OF ty_json_abap_mapping .
+    TYPES:
+      ty_json_abap_mappings TYPE STANDARD TABLE OF ty_json_abap_mapping WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_enum_mapping,
+        path     TYPE string,
+        mappings TYPE ty_json_abap_mappings,
+      END OF ty_enum_mapping .
+    TYPES:
+      ty_enum_mappings TYPE TABLE OF ty_enum_mapping WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_path_value_pair,
+        path  TYPE string,
+        value TYPE string,
+      END OF ty_path_value_pair .
+    TYPES:
+      ty_skip_paths TYPE STANDARD TABLE OF ty_path_value_pair WITH KEY path .
+ 
+    "! Serializes data to xstring. Type of data is specified in the
+    "! implementing class.
+    "!
+    "! @parameter iv_data | data to be serialized
+    "! @parameter iv_enum_mappings | ABAP/JSON value mappings
+    "! @parameter iv_skip_paths | path/value pairs to be skipped during serialization
+    "! @parameter rv_result | serialized data
+    METHODS serialize
+      IMPORTING
+        !iv_data          TYPE data
+        !iv_enum_mappings TYPE ty_enum_mappings OPTIONAL
+        !iv_skip_paths    TYPE ty_skip_paths OPTIONAL
+      RETURNING
+        VALUE(rv_result)  TYPE xstring
+      RAISING
+        cx_static_check .
+    "! Deserializes xstring into data. The type of data is specified in
+    "! the implementing class
+    "!
+    "! @parameter iv_content | xstring to be deserialized
+    "! @parameter iv_defaults | path-value pairs that apply if value is initial
+    "! @parameter ev_data | data of the xstring
+    METHODS deserialize
+      IMPORTING
+        !iv_content       TYPE xstring
+        !iv_defaults      TYPE ty_skip_paths OPTIONAL
+        !iv_enum_mappings TYPE ty_enum_mappings OPTIONAL
+      EXPORTING
+        !ev_data          TYPE data
+      RAISING
+        cx_static_check .
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS:
+      map2json_original_language
+        CHANGING co_ajson TYPE REF TO zif_abapgit_ajson
+        RAISING  zcx_abapgit_ajson_error,
+      map2json_custom_enum
+        IMPORTING it_enum_mappings TYPE ty_enum_mappings
+        CHANGING  co_ajson         TYPE REF TO zif_abapgit_ajson
+        RAISING   zcx_abapgit_ajson_error,
+      map2json_abap_language_version
+        CHANGING co_ajson TYPE REF TO zif_abapgit_ajson
+        RAISING  zcx_abapgit_ajson_error,
+      "! Get the enum mapping from object handler, as other enums as well
+      map2abap_abap_language_version
+        CHANGING co_ajson TYPE REF TO zif_abapgit_ajson
+        RAISING  zcx_abapgit_ajson_error,
+      "! For deserialization
+      map2abap_original_language
+        CHANGING co_ajson TYPE REF TO zif_abapgit_ajson
+        RAISING  zcx_abapgit_ajson_error,
+      "! For deserialization
+      set_defaults
+        IMPORTING it_defaults TYPE ty_skip_paths
+        CHANGING  co_ajson    TYPE REF TO zif_abapgit_ajson
+        RAISING   zcx_abapgit_ajson_error,
+      map2abap_custom_enum
+        IMPORTING it_enum_mappings TYPE ty_enum_mappings
+        CHANGING  co_ajson         TYPE REF TO zif_abapgit_ajson
+        RAISING   zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_JSON_HANDLER IMPLEMENTATION.
+ 
+ 
+  METHOD deserialize.
+    DATA lv_json    TYPE string.
+    DATA lo_ajson   TYPE REF TO zif_abapgit_ajson.
+ 
+    CLEAR ev_data.
+ 
+    lv_json = zcl_abapgit_convert=>xstring_to_string_utf8( iv_content ).
+ 
+    lo_ajson = zcl_abapgit_ajson=>parse( iv_json = lv_json
+      )->map( zcl_abapgit_ajson_mapping=>create_to_snake_case( ) ).
+ 
+    map2abap_original_language( CHANGING co_ajson = lo_ajson ).
+    set_defaults( EXPORTING it_defaults = iv_defaults
+                  CHANGING  co_ajson    = lo_ajson ).
+    map2abap_abap_language_version( CHANGING co_ajson = lo_ajson ).
+    map2abap_custom_enum( EXPORTING it_enum_mappings = iv_enum_mappings
+                          CHANGING co_ajson          = lo_ajson  ).
+ 
+    lo_ajson->to_abap( IMPORTING ev_container = ev_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map2abap_abap_language_version.
+    DATA:
+      lv_enum_abap TYPE string,
+      lv_enum_json TYPE string.
+ 
+ 
+    lv_enum_json = co_ajson->get_string( ''/header/abap_language_version'' ).
+    IF lv_enum_json = ''standard''.
+      lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
+    ELSEIF lv_enum_json = ''cloudDevelopment''.
+      lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development.
+    ELSEIF lv_enum_json = ''keyUser''.
+      lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-key_user.
+    ENDIF.
+ 
+    co_ajson->set_string( iv_path = ''/header/abap_language_version''
+                          iv_val  = lv_enum_abap ).
+  ENDMETHOD.
+ 
+ 
+  METHOD map2abap_custom_enum.
+    DATA:
+      lv_enum_json    TYPE string,
+      ls_enum_mapping TYPE ty_enum_mapping,
+      ls_mapping      TYPE ty_json_abap_mapping.
+ 
+ 
+    LOOP AT it_enum_mappings INTO ls_enum_mapping.
+      lv_enum_json = co_ajson->get_string( ls_enum_mapping-path ).
+      READ TABLE ls_enum_mapping-mappings WITH KEY json = lv_enum_json INTO ls_mapping.
+      IF sy-subrc = 0.
+        co_ajson->set_string( iv_path = ls_enum_mapping-path
+                              iv_val  = ls_mapping-abap ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD map2abap_original_language.
+    DATA:
+      lv_iso_language      TYPE laiso,
+      lv_original_language TYPE sy-langu.
+ 
+ 
+    lv_iso_language = co_ajson->get_string( ''/header/original_language'' ).
+ 
+    CALL FUNCTION ''CONVERSION_EXIT_ISOLA_INPUT''
+      EXPORTING
+        input  = lv_iso_language
+      IMPORTING
+        output = lv_original_language.
+ 
+    co_ajson->set_string( iv_path = ''/header/original_language''
+                          iv_val  = lv_original_language ).
+  ENDMETHOD.
+ 
+ 
+  METHOD map2json_abap_language_version.
+    DATA:
+      lv_enum_abap TYPE string,
+      lv_enum_json TYPE string.
+ 
+ 
+    lv_enum_abap = co_ajson->get_string( ''/header/abapLanguageVersion'' ).
+    IF lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard
+      OR lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
+      lv_enum_json = ''standard''.
+    ELSEIF lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development.
+      lv_enum_json = ''cloudDevelopment''.
+    ELSEIF lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-key_user.
+      lv_enum_json = ''keyUser''.
+    ENDIF.
+ 
+    co_ajson->set_string( iv_path = ''/header/abapLanguageVersion''
+                          iv_val  = lv_enum_json ).
+  ENDMETHOD.
+ 
+ 
+  METHOD map2json_custom_enum.
+    DATA:
+      lv_enum_abap    TYPE string,
+      ls_enum_mapping TYPE ty_enum_mapping,
+      ls_mapping      TYPE ty_json_abap_mapping.
+ 
+ 
+    LOOP AT it_enum_mappings INTO ls_enum_mapping.
+      lv_enum_abap = co_ajson->get_string( ls_enum_mapping-path ).
+      READ TABLE ls_enum_mapping-mappings WITH KEY abap = lv_enum_abap INTO ls_mapping.
+      IF sy-subrc = 0.
+        co_ajson->set_string( iv_path = ls_enum_mapping-path
+                              iv_val  = ls_mapping-json ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD map2json_original_language.
+    DATA:
+      lv_iso_language      TYPE laiso,
+      lv_original_language TYPE sy-langu.
+ 
+ 
+    lv_original_language = co_ajson->get_string( ''/header/originalLanguage'' ).
+ 
+    CALL FUNCTION ''CONVERSION_EXIT_ISOLA_OUTPUT''
+      EXPORTING
+        input  = lv_original_language
+      IMPORTING
+        output = lv_iso_language.
+ 
+    TRANSLATE lv_iso_language TO LOWER CASE.
+    co_ajson->set_string( iv_path = ''/header/originalLanguage''
+                          iv_val  = lv_iso_language ).
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+    DATA: lt_st_source TYPE abap_trans_srcbind_tab,
+          lv_json      TYPE string,
+          lo_ajson     TYPE REF TO zif_abapgit_ajson,
+          lo_filter    TYPE REF TO lcl_aff_filter.
+ 
+    FIELD-SYMBOLS: <lg_source> LIKE LINE OF lt_st_source.
+ 
+    APPEND INITIAL LINE TO lt_st_source ASSIGNING <lg_source>.
+    GET REFERENCE OF iv_data INTO <lg_source>-value.
+ 
+    lo_ajson = zcl_abapgit_ajson=>new( iv_keep_item_order = abap_true
+      )->set( iv_path = ''/''
+              iv_val  = iv_data
+      )->map( zcl_abapgit_ajson_mapping=>create_to_camel_case( ) ).
+ 
+    map2json_original_language( CHANGING co_ajson = lo_ajson ).
+    map2json_abap_language_version( CHANGING co_ajson = lo_ajson ).
+    map2json_custom_enum( EXPORTING it_enum_mappings = iv_enum_mappings
+                          CHANGING co_ajson          = lo_ajson ).
+ 
+    CREATE OBJECT lo_filter EXPORTING iv_skip_paths = iv_skip_paths.
+ 
+    " files end with an empty line (EOF)
+    lv_json = lo_ajson->clone( )->filter( lo_filter )->stringify( 2 ) && cl_abap_char_utilities=>newline.
+ 
+    rv_result = zcl_abapgit_convert=>string_to_xstring_utf8( lv_json ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_defaults.
+    DATA:
+      lv_enum_json TYPE string,
+      ls_default   TYPE ty_path_value_pair.
+ 
+ 
+    LOOP AT it_defaults INTO ls_default.
+      lv_enum_json = co_ajson->get_string( ls_default-path ).
+      IF lv_enum_json = \`\`.
+        co_ajson->set_string( iv_path = ls_default-path
+                              iv_val  = ls_default-value ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AFF_REGISTRY                ', 'INTERFACE zif_abapgit_aff_registry
+  PUBLIC .
+ 
+  METHODS:
+    "! Returns TRUE if the object type is supported by ABAP file formats (AFF) in abapGit.<br/>
+    "! Either there is a (standalone AFF capable) object handler,
+    "! or object handler calls the AFF framework in newer ABAP systems.
+    is_supported_object_type
+      IMPORTING
+        iv_obj_type      TYPE tadir-object
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AFF_TYPE_MAPPING            ', 'INTERFACE zif_abapgit_aff_type_mapping
+  PUBLIC .
+  METHODS:
+    "! Convert from AFF to abapGit data
+    "!
+    "! @parameter iv_data | ABAP data as AFF type
+    "! @parameter iv_object_name | Name of object
+    "! @parameter es_data | ABAP data as abapGit type
+    to_abapgit
+      IMPORTING iv_data TYPE data
+                iv_object_name TYPE sobj_name
+      EXPORTING es_data TYPE data,
+ 
+    "! Converts to AFF specific meta data
+    "!
+    "! @parameter iv_data | (meta-)data of the object
+    "! @parameter es_data | aff data of the object, e.g. zif_abapgit_aff_intf_v1=>ty_main
+    to_aff
+      IMPORTING iv_data TYPE data
+      EXPORTING es_data TYPE data.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AFF_INTF_V1                 ', 'INTERFACE zif_abapgit_aff_intf_v1 PUBLIC.
+ 
+  TYPES ty_category TYPE n LENGTH 2.
+ 
+  CONSTANTS:
+    BEGIN OF co_category,
+      general                      TYPE ty_category VALUE ''00'',
+      classic_badi                 TYPE ty_category VALUE ''01'',
+      business_static_components   TYPE ty_category VALUE ''51'',
+      business_instance_components TYPE ty_category VALUE ''52'',
+      db_procedure_proxy           TYPE ty_category VALUE ''65'',
+      web_dynpro_runtime           TYPE ty_category VALUE ''80'',
+      enterprise_service           TYPE ty_category VALUE ''90'',
+    END OF co_category.
+ 
+  TYPES:
+    BEGIN OF ty_main,
+      format_version TYPE zif_abapgit_aff_types_v1=>ty_format_version,
+      header         TYPE zif_abapgit_aff_types_v1=>ty_header_60_src,
+      category       TYPE ty_category,
+      proxy          TYPE abap_bool,
+      descriptions   TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions,
+    END OF ty_main.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AFF_OO_TYPES_V1             ', 'INTERFACE zif_abapgit_aff_oo_types_v1
+  PUBLIC.
+ 
+  TYPES:
+    BEGIN OF ty_component_description,
+      name        TYPE zif_abapgit_aff_types_v1=>ty_object_name_30,
+      description TYPE zif_abapgit_aff_types_v1=>ty_description_60,
+    END OF ty_component_description,
+ 
+    ty_component_descriptions TYPE SORTED TABLE OF ty_component_description WITH UNIQUE KEY name.
+ 
+ 
+  TYPES:
+    BEGIN OF ty_method,
+      name        TYPE zif_abapgit_aff_types_v1=>ty_object_name_30,
+      description TYPE zif_abapgit_aff_types_v1=>ty_description_60,
+      parameters  TYPE ty_component_descriptions,
+      exceptions  TYPE ty_component_descriptions,
+    END OF ty_method,
+    ty_methods TYPE SORTED TABLE OF ty_method WITH UNIQUE KEY name.
+ 
+  TYPES:
+    BEGIN OF ty_event,
+      name        TYPE zif_abapgit_aff_types_v1=>ty_object_name_30,
+      description TYPE zif_abapgit_aff_types_v1=>ty_description_60,
+      parameters  TYPE ty_component_descriptions,
+    END OF ty_event,
+    ty_events TYPE SORTED TABLE OF ty_event WITH UNIQUE KEY name.
+ 
+  TYPES:
+    BEGIN OF ty_descriptions,
+      types      TYPE ty_component_descriptions,
+      attributes TYPE ty_component_descriptions,
+      events     TYPE ty_events,
+      methods    TYPE ty_methods,
+    END OF ty_descriptions.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_AFF_TYPES_V1                ', 'INTERFACE zif_abapgit_aff_types_v1 PUBLIC.
+ 
+  TYPES ty_format_version TYPE string.
+ 
+  TYPES ty_abap_language_version TYPE c LENGTH 1.
+ 
+  TYPES ty_abap_language_version_cloud TYPE c LENGTH 1.
+ 
+  TYPES ty_abap_language_version_src TYPE c LENGTH 1.
+ 
+  CONSTANTS:
+    BEGIN OF co_abap_language_version_src,
+      standard          TYPE ty_abap_language_version_src VALUE ''X'',
+      key_user          TYPE ty_abap_language_version_src VALUE ''2'',
+      cloud_development TYPE ty_abap_language_version_src VALUE ''5'',
+    END OF co_abap_language_version_src.
+ 
+  CONSTANTS:
+    BEGIN OF co_abap_language_version,
+      standard          TYPE ty_abap_language_version VALUE space,
+      key_user          TYPE ty_abap_language_version VALUE ''2'',
+      cloud_development TYPE ty_abap_language_version VALUE ''5'',
+    END OF co_abap_language_version.
+ 
+  CONSTANTS:
+    BEGIN OF co_abap_language_version_cloud,
+      standard          TYPE ty_abap_language_version_cloud VALUE space,
+      cloud_development TYPE ty_abap_language_version_cloud VALUE ''5'',
+    END OF co_abap_language_version_cloud.
+ 
+  TYPES ty_description_60 TYPE c LENGTH 60.
+  TYPES ty_description_100 TYPE c LENGTH 100.
+ 
+  TYPES ty_object_name_30 TYPE c LENGTH 30.
+ 
+  TYPES ty_original_language TYPE sy-langu.
+ 
+  TYPES:
+    BEGIN OF ty_header_60_src,
+      description           TYPE ty_description_60,
+      original_language     TYPE ty_original_language,
+      abap_language_version TYPE ty_abap_language_version_src,
+    END OF ty_header_60_src.
+ 
+  TYPES:
+    BEGIN OF ty_header_60_cloud,
+      description           TYPE ty_description_60,
+      original_language     TYPE ty_original_language,
+      abap_language_version TYPE ty_abap_language_version_cloud,
+    END OF ty_header_60_cloud.
+ 
+  TYPES:
+    BEGIN OF ty_header_60,
+      description           TYPE ty_description_60,
+      original_language     TYPE ty_original_language,
+      abap_language_version TYPE ty_abap_language_version,
+    END OF ty_header_60.
+ 
+  TYPES:
+    BEGIN OF ty_header_60_no_abap_lv,
+      description           TYPE ty_description_60,
+      original_language     TYPE ty_original_language,
+    END OF ty_header_60_no_abap_lv.
+ 
+  TYPES:
+    BEGIN OF ty_header_100,
+      description           TYPE ty_description_100,
+      original_language     TYPE ty_original_language,
+      abap_language_version TYPE ty_abap_language_version,
+    END OF ty_header_100.
+ 
+  TYPES:
+    BEGIN OF ty_header_only_description,
+      description TYPE ty_description_60,
+    END OF ty_header_only_description.
+ 
+  TYPES ty_option TYPE c LENGTH 2.
+ 
+  CONSTANTS:
+    BEGIN OF co_option,
+      equals               TYPE ty_option VALUE ''EQ'',
+      between              TYPE ty_option VALUE ''BT'',
+      greater_than         TYPE ty_option VALUE ''GT'',
+      contains_pattern     TYPE ty_option VALUE ''CP'',
+      not_equal            TYPE ty_option VALUE ''NE'',
+      not_between          TYPE ty_option VALUE ''NB'',
+      not_contains_pattern TYPE ty_option VALUE ''NP'',
+      greater_equal        TYPE ty_option VALUE ''GE'',
+      less_than            TYPE ty_option VALUE ''LT'',
+      less_equal           TYPE ty_option VALUE ''LE'',
+    END OF co_option.
+ 
+  TYPES ty_sign TYPE c LENGTH 1.
+ 
+  CONSTANTS:
+    BEGIN OF co_sign,
+      include TYPE ty_sign VALUE ''I'',
+      exclude TYPE ty_sign VALUE ''E'',
+    END OF co_sign.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DEPENDENCIES                ', 'CLASS zcl_abapgit_dependencies DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS resolve
+      CHANGING
+        !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_dependency,
+        depname  TYPE dd02l-tabname,
+        deptyp   TYPE c LENGTH 4,
+        deplocal TYPE dd02l-as4local,
+        refname  TYPE dd02l-tabname,
+        reftyp   TYPE c LENGTH 4,
+        kind     TYPE c LENGTH 1,
+      END OF ty_dependency .
+    TYPES:
+      ty_dedenpencies TYPE STANDARD TABLE OF ty_dependency
+                                 WITH NON-UNIQUE DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_item,
+        obj_type TYPE tadir-object,
+        obj_name TYPE tadir-obj_name,
+        devclass TYPE devclass,
+      END OF ty_item .
+ 
+    CLASS-METHODS resolve_ddic
+      CHANGING
+        !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_ddls_dependencies
+      IMPORTING
+        iv_ddls_name         TYPE tadir-obj_name
+      RETURNING
+        VALUE(rt_dependency) TYPE ty_dedenpencies.
+    CLASS-METHODS resolve_packages
+      CHANGING
+        ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_dependencies IMPLEMENTATION.
+ 
+ 
+  METHOD get_ddls_dependencies.
+ 
+    DATA: lt_ddls_name TYPE TABLE OF ddsymtab,
+          ls_ddls_name TYPE ddsymtab.
+ 
+    ls_ddls_name-name = iv_ddls_name.
+    INSERT ls_ddls_name INTO TABLE lt_ddls_name.
+ 
+    PERFORM (''DDLS_GET_DEP'') IN PROGRAM (''RADMASDL'')
+                             TABLES lt_ddls_name rt_dependency.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve.
+ 
+    DATA: lv_tabclass TYPE dd02l-tabclass.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir.
+ 
+    " misuse field KORRNUM to fix deletion sequence
+    " higher value means later deletion
+ 
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+      CASE <ls_tadir>-object.
+        WHEN ''DEVC''.
+          " Packages last
+          <ls_tadir>-korrnum = ''999000''.
+        WHEN ''DOMA''.
+          <ls_tadir>-korrnum = ''900000''.
+        WHEN ''SPRX''.
+          <ls_tadir>-korrnum = ''850000''.
+        WHEN ''WEBI''.
+          <ls_tadir>-korrnum = ''840000''.
+        WHEN ''PARA''.
+          " PARA after DTEL
+          <ls_tadir>-korrnum = ''810000''.
+        WHEN ''DTEL''.
+          <ls_tadir>-korrnum = ''800000''.
+        WHEN ''SHLP''.
+          " SHLP after TABL
+          <ls_tadir>-korrnum = ''760000''.
+        WHEN ''TTYP'' OR ''TABL'' OR ''VIEW''.
+          SELECT SINGLE tabclass FROM dd02l
+            INTO lv_tabclass
+            WHERE tabname = <ls_tadir>-obj_name
+            AND as4local = ''A''
+            AND as4vers = ''0000''.
+          IF sy-subrc = 0 AND lv_tabclass = ''APPEND''.
+            " delete append structures before database tables
+            <ls_tadir>-korrnum = ''730000''.
+          ELSE.
+            <ls_tadir>-korrnum = ''750000''.
+          ENDIF.
+        WHEN ''ENQU''.
+          " ENQU before TABL
+          <ls_tadir>-korrnum = ''725000''.
+        WHEN ''DDLS''.
+          " DDLS after DCLS but before other DDIC
+          <ls_tadir>-korrnum = ''720000''.
+        WHEN ''DDLX''.
+          " DDLX before DDLS
+          <ls_tadir>-korrnum = ''719000''.
+        WHEN ''AUTH''.
+          " AUTH after DCLS
+          <ls_tadir>-korrnum = ''715000''.
+        WHEN ''SUSH''.
+          " SUSH after SUSC
+          <ls_tadir>-korrnum = ''712000''.
+        WHEN ''SUSC''.
+          " SUSC after SUSO
+          <ls_tadir>-korrnum = ''711000''.
+        WHEN ''SUSO''.
+          " SUSO after DCLS
+          <ls_tadir>-korrnum = ''710000''.
+        WHEN ''DCLS''.
+          " AUTH and SUSO after DCLS
+          <ls_tadir>-korrnum = ''705000''.
+        WHEN ''IASP''.
+          <ls_tadir>-korrnum = ''552000''.
+        WHEN ''IARP''.
+          <ls_tadir>-korrnum = ''551000''.
+        WHEN ''IATU''.
+          <ls_tadir>-korrnum = ''550000''.
+        WHEN ''ACID''.
+          " ACID after PROG/FUGR/CLAS
+          <ls_tadir>-korrnum = ''300000''.
+        WHEN ''FUGR''.
+          <ls_tadir>-korrnum = ''260000''.
+        WHEN ''PROG''.
+          " delete includes after main programs
+          SELECT COUNT(*) FROM reposrc
+            WHERE progname = <ls_tadir>-obj_name
+            AND r3state = ''A''
+            AND subc = ''I''.
+          IF sy-subrc = 0.
+            <ls_tadir>-korrnum = ''250000''.
+          ELSE.
+            <ls_tadir>-korrnum = ''240000''.
+          ENDIF.
+        WHEN ''INTF''.
+          <ls_tadir>-korrnum = ''230000''.
+        WHEN ''CLAS''.
+          <ls_tadir>-korrnum = ''220000''.
+        WHEN ''IDOC''.
+          <ls_tadir>-korrnum = ''200000''.
+        WHEN ''IOBJ''.
+          <ls_tadir>-korrnum = ''195000''.
+        WHEN ''ODSO''.
+          <ls_tadir>-korrnum = ''190000''.
+        WHEN ''WDCA''.
+          <ls_tadir>-korrnum = ''174000''.
+        WHEN ''WDYA''.
+          <ls_tadir>-korrnum = ''173000''.
+        WHEN ''WDCC''.
+          <ls_tadir>-korrnum = ''172000''.
+        WHEN ''WDYN''.
+          <ls_tadir>-korrnum = ''171000''.
+        WHEN ''IEXT''.
+          <ls_tadir>-korrnum = ''150000''.
+        WHEN ''SAPC''.
+          " SAPC after SICF
+          <ls_tadir>-korrnum = ''140000''.
+        WHEN ''PINF''.
+          " PINF before exposed objects
+          <ls_tadir>-korrnum = ''130000''.
+        WHEN OTHERS.
+          <ls_tadir>-korrnum = ''100000''.
+      ENDCASE.
+    ENDLOOP.
+ 
+    resolve_ddic( CHANGING ct_tadir = ct_tadir ).
+    resolve_packages( CHANGING ct_tadir = ct_tadir ).
+ 
+    SORT ct_tadir BY korrnum ASCENDING.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve_ddic.
+* this will make sure the deletion sequence of structures/tables work
+* in case they have dependencies with .INCLUDE
+ 
+    TYPES: BEGIN OF ty_edge,
+             from TYPE ty_item,
+             to   TYPE ty_item,
+           END OF ty_edge.
+ 
+    DATA: lt_nodes        TYPE TABLE OF ty_item,
+          lt_edges        TYPE TABLE OF ty_edge,
+          lt_findstrings  TYPE TABLE OF rsfind,
+          lv_plus         TYPE i VALUE 1,
+          lv_find_obj_cls TYPE euobj-id,
+          lv_index        TYPE i,
+          lv_before       TYPE i,
+          lt_founds       TYPE TABLE OF rsfindlst,
+          lt_scope        TYPE STANDARD TABLE OF seu_obj,
+          lt_dependency   TYPE ty_dedenpencies.
+ 
+    FIELD-SYMBOLS: <ls_tadir_ddls>      TYPE zif_abapgit_definitions=>ty_tadir,
+                   <ls_dependency>      TYPE ty_dependency,
+                   <ls_tadir_dependent> TYPE zif_abapgit_definitions=>ty_tadir,
+                   <ls_tadir>           LIKE LINE OF ct_tadir,
+                   <ls_edge>            LIKE LINE OF lt_edges,
+                   <ls_found>           LIKE LINE OF lt_founds,
+                   <ls_node>            LIKE LINE OF lt_nodes.
+ 
+    " build nodes
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>
+        WHERE object = ''TABL''
+        OR object = ''VIEW''
+        OR object = ''TTYP''.
+      APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
+      <ls_node>-obj_name = <ls_tadir>-obj_name.
+      <ls_node>-obj_type = <ls_tadir>-object.
+    ENDLOOP.
+ 
+    APPEND ''TABL'' TO lt_scope.
+    APPEND ''VIEW'' TO lt_scope.
+    APPEND ''STRU'' TO lt_scope.
+    APPEND ''TTYP'' TO lt_scope.
+ 
+    " build edges
+    LOOP AT lt_nodes ASSIGNING <ls_node>.
+ 
+      CLEAR lt_findstrings.
+      APPEND <ls_node>-obj_name TO lt_findstrings.
+      lv_find_obj_cls = <ls_node>-obj_type.
+ 
+      CALL FUNCTION ''RS_EU_CROSSREF''
+        EXPORTING
+          i_find_obj_cls           = lv_find_obj_cls
+        TABLES
+          i_findstrings            = lt_findstrings
+          o_founds                 = lt_founds
+          i_scope_object_cls       = lt_scope
+        EXCEPTIONS
+          not_executed             = 1
+          not_found                = 2
+          illegal_object           = 3
+          no_cross_for_this_object = 4
+          batch                    = 5
+          batchjob_error           = 6
+          wrong_type               = 7
+          object_not_exist         = 8
+          OTHERS                   = 9.
+      IF sy-subrc <> 0.
+        CONTINUE.
+      ENDIF.
+ 
+      LOOP AT lt_founds ASSIGNING <ls_found>.
+        APPEND INITIAL LINE TO lt_edges ASSIGNING <ls_edge>.
+        <ls_edge>-from = <ls_node>.
+ 
+        <ls_edge>-to-obj_name   = <ls_found>-object.
+        CASE <ls_found>-object_cls.
+          WHEN ''DS''
+              OR ''DT''.
+            <ls_edge>-to-obj_type = ''TABL''.
+          WHEN ''DV''.
+            <ls_edge>-to-obj_type = ''VIEW''.
+          WHEN ''DA''.
+            <ls_edge>-to-obj_type = ''TTYP''.
+          WHEN OTHERS.
+            zcx_abapgit_exception=>raise( ''resolve_ddic, unknown object_cls'' ).
+        ENDCASE.
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+    " build DDLS edges
+    SORT ct_tadir. "binary search
+    LOOP AT ct_tadir ASSIGNING <ls_tadir_ddls>
+                     WHERE object = ''DDLS''.
+ 
+      CLEAR: lt_dependency.
+ 
+      APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
+      <ls_node>-obj_name = <ls_tadir_ddls>-obj_name.
+      <ls_node>-obj_type = <ls_tadir_ddls>-object.
+ 
+      lt_dependency = get_ddls_dependencies( <ls_tadir_ddls>-obj_name ).
+ 
+      LOOP AT lt_dependency ASSIGNING <ls_dependency>
+                            WHERE deptyp = ''DDLS''
+                            AND refname = <ls_tadir_ddls>-obj_name.
+ 
+        READ TABLE ct_tadir ASSIGNING <ls_tadir_dependent>
+                            WITH KEY pgmid    = ''R3TR''
+                                     object   = ''DDLS''
+                                     obj_name = <ls_dependency>-depname
+                            BINARY SEARCH.
+        CHECK sy-subrc = 0.
+ 
+        APPEND INITIAL LINE TO lt_edges ASSIGNING <ls_edge>.
+        <ls_edge>-from = <ls_node>.
+        <ls_edge>-to-obj_name = <ls_dependency>-depname.
+        <ls_edge>-to-obj_type = ''DDLS''.
+ 
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+    DO.
+      lv_before = lines( lt_nodes ).
+      LOOP AT lt_nodes ASSIGNING <ls_node>.
+        lv_index = sy-tabix.
+        READ TABLE lt_edges WITH KEY
+          from-obj_name = <ls_node>-obj_name
+          from-obj_type = <ls_node>-obj_type
+          TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          LOOP AT ct_tadir ASSIGNING <ls_tadir>
+              WHERE obj_name = <ls_node>-obj_name
+              AND object = <ls_node>-obj_type.
+            <ls_tadir>-korrnum = <ls_tadir>-korrnum + lv_plus.
+            CONDENSE <ls_tadir>-korrnum.
+          ENDLOOP.
+          DELETE lt_edges
+            WHERE to-obj_name = <ls_node>-obj_name
+            AND to-obj_type = <ls_node>-obj_type.
+          DELETE lt_nodes INDEX lv_index.
+          EXIT. " make sure the sequence is fixed
+        ENDIF.
+      ENDLOOP.
+      IF lv_before = lines( lt_nodes ).
+        EXIT.
+      ENDIF.
+      lv_plus = lv_plus + 1.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve_packages.
+ 
+    DATA: lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    FIELD-SYMBOLS: <ls_tadir>            LIKE LINE OF ct_tadir,
+                   <lv_subpackage>       LIKE LINE OF lt_subpackages,
+                   <ls_tadir_subpackage> LIKE LINE OF ct_tadir.
+ 
+    " List subpackage before corresponding superpackage
+ 
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>
+                     WHERE object = ''DEVC''.
+ 
+      lt_subpackages = zcl_abapgit_factory=>get_sap_package( |{ <ls_tadir>-obj_name }| )->list_subpackages( ).
+ 
+      LOOP AT lt_subpackages ASSIGNING <lv_subpackage>.
+ 
+        READ TABLE ct_tadir ASSIGNING <ls_tadir_subpackage>
+                            WITH KEY object   = ''DEVC''
+                                     obj_name = <lv_subpackage>.
+        IF sy-subrc = 0.
+          <ls_tadir_subpackage>-korrnum = condense( |{ <ls_tadir_subpackage>-korrnum - 1 }| ).
+        ENDIF.
+ 
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_FILE_DESERIALIZE            ', 'CLASS zcl_abapgit_file_deserialize DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_results
+      IMPORTING
+        !io_repo          TYPE REF TO zcl_abapgit_repo
+        !ii_log           TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS filter_files_to_deserialize
+      IMPORTING
+        !it_results       TYPE zif_abapgit_definitions=>ty_results_tt
+        !ii_log           TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt .
+    CLASS-METHODS prioritize_deser
+      IMPORTING
+        !ii_log           TYPE REF TO zif_abapgit_log
+        !it_results       TYPE zif_abapgit_definitions=>ty_results_tt
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt .
+    CLASS-METHODS map_results_to_items
+      IMPORTING
+        !it_results     TYPE zif_abapgit_definitions=>ty_results_tt
+      RETURNING
+        VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_file_deserialize IMPLEMENTATION.
+ 
+ 
+  METHOD filter_files_to_deserialize.
+ 
+    DATA lt_objects LIKE rt_results.
+    DATA lr_object  TYPE REF TO zif_abapgit_definitions=>ty_result.
+    DATA ls_item    TYPE zif_abapgit_definitions=>ty_item.
+    DATA lv_tabix   TYPE sy-tabix.
+ 
+    rt_results = it_results.
+ 
+    "preparation for object logging, sort all file entries by objects
+    IF ii_log IS BOUND.
+      lt_objects = rt_results.
+      SORT lt_objects
+        BY obj_type
+           obj_name.
+      DELETE ADJACENT DUPLICATES FROM lt_objects COMPARING obj_type obj_name.
+      DELETE lt_objects WHERE obj_type IS INITIAL AND obj_name IS INITIAL.
+    ENDIF.
+ 
+    "ignore objects w/o changes
+    DELETE rt_results WHERE match = abap_true.     " Full match
+    "log objects w/o changes
+    IF sy-subrc = 0 AND ii_log IS BOUND.
+      SORT rt_results BY obj_type obj_name.
+      LOOP AT lt_objects REFERENCE INTO lr_object.
+        lv_tabix = sy-tabix.
+        READ TABLE rt_results WITH KEY obj_type = lr_object->obj_type
+                                       obj_name = lr_object->obj_name
+                              BINARY SEARCH TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          "all parts of the objects have not changed
+          ls_item-devclass = lr_object->package.
+          ls_item-obj_type = lr_object->obj_type.
+          ls_item-obj_name = lr_object->obj_name.
+          ii_log->add_success(
+            iv_msg  = |Object { ls_item-obj_name } (type { ls_item-obj_type }) not changed; no import required|
+            is_item = ls_item ).
+          "ignore object for further messages
+          DELETE lt_objects INDEX lv_tabix.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+    "ignore objects w/o object type
+    DELETE rt_results WHERE obj_type IS INITIAL.
+    "log objects w/o object type
+    IF sy-subrc = 0 AND ii_log IS BOUND.
+      " Note: Moving the CHECK condition to the LOOP WHERE clause will lead to a
+      " syntax warning in higher releases and syntax error in 702
+      LOOP AT lt_objects REFERENCE INTO lr_object.
+        CHECK lr_object->obj_type IS INITIAL AND lr_object->obj_name IS NOT INITIAL.
+        ls_item-devclass = lr_object->package.
+        ls_item-obj_type = lr_object->obj_type.
+        ls_item-obj_name = lr_object->obj_name.
+        ii_log->add_warning(
+          iv_msg  = |Object type for { ls_item-obj_name } not defined - will be ignored by abapGit|
+          is_item = ls_item ).
+      ENDLOOP.
+      DELETE lt_objects WHERE obj_type IS INITIAL.
+    ENDIF.
+ 
+    "ignore objects that exists only local
+    DELETE rt_results WHERE lstate = zif_abapgit_definitions=>c_state-added AND rstate IS INITIAL.
+    "ignore objects that where deleted remotely
+    DELETE rt_results WHERE rstate = zif_abapgit_definitions=>c_state-deleted.
+    "log objects that exists only local or where deleted remotely
+    IF sy-subrc = 0 AND ii_log IS BOUND.
+      SORT rt_results BY obj_type obj_name.
+      LOOP AT lt_objects REFERENCE INTO lr_object.
+        lv_tabix = sy-tabix.
+        READ TABLE rt_results WITH KEY obj_type = lr_object->obj_type
+                                       obj_name = lr_object->obj_name
+                              BINARY SEARCH TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          "all parts exists only local
+          "no log message; ignore object for further messages
+          DELETE lt_objects INDEX lv_tabix.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+    "ignore table content
+    DELETE rt_results WHERE path = zif_abapgit_data_config=>c_default_path.
+ 
+    SORT rt_results
+      BY obj_type ASCENDING
+         obj_name ASCENDING
+         rstate   DESCENDING  " ensures that non-empty rstate is kept
+         lstate   DESCENDING. " ensures that non-empty lstate is kept
+    DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_results.
+ 
+    DATA lt_results TYPE zif_abapgit_definitions=>ty_results_tt.
+ 
+    lt_results = filter_files_to_deserialize(
+      it_results = zcl_abapgit_file_status=>status( io_repo )
+      ii_log     = ii_log ).
+ 
+    rt_results = prioritize_deser(
+      ii_log     = ii_log
+      it_results = lt_results ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_results_to_items.
+ 
+    DATA ls_item LIKE LINE OF rt_items.
+    FIELD-SYMBOLS: <ls_result> TYPE zif_abapgit_definitions=>ty_result.
+ 
+    LOOP AT it_results ASSIGNING <ls_result>.
+      ls_item-devclass = <ls_result>-package.
+      ls_item-obj_type = <ls_result>-obj_type.
+      ls_item-obj_name = <ls_result>-obj_name.
+      INSERT ls_item INTO TABLE rt_items.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD prioritize_deser.
+ 
+    DATA lt_items    TYPE zif_abapgit_definitions=>ty_items_tt.
+    DATA ls_item     LIKE LINE OF lt_items.
+    DATA lt_requires TYPE zif_abapgit_definitions=>ty_items_tt.
+    DATA ls_require  LIKE LINE OF lt_requires.
+    DATA ls_result   LIKE LINE OF it_results.
+    DATA lo_graph    TYPE REF TO zcl_abapgit_item_graph.
+ 
+    lt_items = map_results_to_items( it_results ).
+ 
+    CREATE OBJECT lo_graph EXPORTING it_items = lt_items.
+ 
+    LOOP AT lt_items INTO ls_item.
+      CLEAR lt_requires.
+ 
+* TODO: BEGIN extract to object handler method in ZIF_ABAPGIT_OBJECT:
+*    METHODS get_deserialize_order
+*      IMPORTING
+*        it_items TYPE ty_items_tt
+*      RETURNING
+*        VALUE(rt_requries) TYPE ty_items_tt
+ 
+      CASE ls_item-obj_type.
+        WHEN ''SPRX''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''WEBI''.
+        WHEN ''CLAS''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''SPRX''
+            AND obj_type <> ''INTF''
+            AND obj_type <> ''XSLT''.
+        WHEN ''PROG''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''XSLT''.
+        WHEN ''INTF''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''SPRX''
+            AND obj_type <> ''XSLT''.
+        WHEN ''TABL''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''SPRX''.
+        WHEN ''IARP''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''IASP''.
+        WHEN ''IATU'' OR ''IAXU''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''IASP''
+            AND obj_type <> ''PROG''
+            AND obj_type <> ''IARP''.
+        WHEN ''DCLS''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''DDLS''.
+        WHEN ''ODSO''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''IOBJ''.
+        WHEN ''SCP1''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''TOBJ''.
+        WHEN ''CHAR''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''OTGR''.
+        WHEN ''PINF''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''CLAS''
+            AND obj_type <> ''INTF''
+            AND obj_type <> ''TABL''
+            AND obj_type <> ''DOMA''
+            AND obj_type <> ''DTEL''.
+        WHEN ''DEVC''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''PINF''.
+        WHEN ''ENHC''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''ENHO''.
+        WHEN ''ENHO''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''ENSC'' AND obj_type <> ''ENHS''.
+        WHEN ''ENSC''.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> ''ENHS''.
+      ENDCASE.
+* TODO: END extract to object handler method
+ 
+      LOOP AT lt_requires INTO ls_require.
+        lo_graph->add_edge(
+          is_from = ls_require
+          is_to   = ls_item ).
+      ENDLOOP.
+    ENDLOOP.
+ 
+    WHILE lo_graph->has_vertices( ) = abap_true.
+      ls_item = lo_graph->get_next( ii_log ).
+      READ TABLE it_results INTO ls_result WITH KEY sec_key COMPONENTS
+        obj_name = ls_item-obj_name
+        obj_type = ls_item-obj_type.
+      ASSERT sy-subrc = 0.
+      APPEND ls_result TO rt_results.
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_FILENAME_LOGIC              ', 'CLASS zcl_abapgit_filename_logic DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_package_file,
+        obj_name  TYPE c LENGTH 7 VALUE ''package'',
+        sep1      TYPE c LENGTH 1 VALUE ''.'',
+        obj_type  TYPE c LENGTH 4 VALUE ''devc'',
+        sep2      TYPE c LENGTH 1 VALUE ''.'',
+        extension TYPE c LENGTH 3 VALUE ''xml'',
+      END OF c_package_file.
+ 
+    CONSTANTS:
+      BEGIN OF c_json_file,
+        extension TYPE c LENGTH 4 VALUE ''json'',
+      END OF c_json_file.
+ 
+    CLASS-METHODS detect_obj_definition
+      IMPORTING
+        !iv_type    TYPE string
+        !iv_ext     TYPE string
+      EXPORTING
+        !ev_is_xml  TYPE abap_bool
+        !ev_is_json TYPE abap_bool.
+ 
+    CLASS-METHODS is_obj_definition_file
+      IMPORTING
+        !iv_filename  TYPE string
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+ 
+    CLASS-METHODS file_to_object
+      IMPORTING
+        !iv_filename TYPE string
+        !iv_path     TYPE string
+        !iv_devclass TYPE devclass OPTIONAL
+        !io_dot      TYPE REF TO zcl_abapgit_dot_abapgit
+      EXPORTING
+        !es_item     TYPE zif_abapgit_definitions=>ty_item
+        !ev_is_xml   TYPE abap_bool
+        !ev_is_json  TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS object_to_file
+      IMPORTING
+        !is_item           TYPE zif_abapgit_definitions=>ty_item
+        !iv_ext            TYPE string
+        !iv_extra          TYPE clike OPTIONAL
+      RETURNING
+        VALUE(rv_filename) TYPE string .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA:
+      go_aff_registry TYPE REF TO zif_abapgit_aff_registry.
+ 
+    CLASS-METHODS name_escape
+      IMPORTING
+        !iv_name       TYPE csequence
+      RETURNING
+        VALUE(rv_name) TYPE string.
+ 
+    CLASS-METHODS name_unescape
+      IMPORTING
+        !iv_name       TYPE csequence
+      RETURNING
+        VALUE(rv_name) TYPE string.
+ 
+    CLASS-METHODS map_filename_to_object
+      IMPORTING
+        !iv_filename TYPE string
+        !iv_path     TYPE string
+        !iv_package  TYPE devclass
+        !io_dot      TYPE REF TO zcl_abapgit_dot_abapgit
+      CHANGING
+        cs_item      TYPE zif_abapgit_definitions=>ty_item
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS map_object_to_filename
+      IMPORTING
+        !is_item    TYPE zif_abapgit_definitions=>ty_item
+      CHANGING
+        cv_filename TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_filename_logic IMPLEMENTATION.
+ 
+ 
+  METHOD detect_obj_definition.
+ 
+    ev_is_xml  = boolc( iv_ext = to_upper( c_package_file-extension ) AND strlen( iv_type ) = 4 ).
+    ev_is_json = boolc( iv_ext = to_upper( c_json_file-extension ) AND strlen( iv_type ) = 4 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD file_to_object.
+ 
+    DATA:
+      lv_name TYPE string,
+      lv_type TYPE string,
+      lv_ext  TYPE string.
+ 
+    " Guess object type and name
+    SPLIT to_upper( iv_filename ) AT ''.'' INTO lv_name lv_type lv_ext.
+ 
+    " Handle namespaces
+    REPLACE ALL OCCURRENCES OF ''#'' IN lv_name WITH ''/''.
+    REPLACE ALL OCCURRENCES OF ''#'' IN lv_type WITH ''/''.
+    REPLACE ALL OCCURRENCES OF ''#'' IN lv_ext WITH ''/''.
+ 
+    " Assume AFF namespace convention
+    CREATE OBJECT go_aff_registry TYPE zcl_abapgit_aff_registry.
+ 
+    IF go_aff_registry->is_supported_object_type( |{ lv_type }| ) = abap_true.
+      REPLACE ALL OCCURRENCES OF ''('' IN lv_name WITH ''/''.
+      REPLACE ALL OCCURRENCES OF '')'' IN lv_name WITH ''/''.
+    ENDIF.
+ 
+    " Get original object name
+    lv_name = name_unescape( lv_name ).
+ 
+    CLEAR es_item.
+    es_item-obj_type = lv_type.
+    es_item-obj_name = lv_name.
+ 
+    " Get mapping specific to object type
+    map_filename_to_object(
+      EXPORTING
+        iv_filename = iv_filename
+        iv_path     = iv_path
+        io_dot      = io_dot
+        iv_package  = iv_devclass
+      CHANGING
+        cs_item     = es_item ).
+ 
+    detect_obj_definition(
+      EXPORTING
+        iv_ext     = lv_ext
+        iv_type    = lv_type
+      IMPORTING
+        ev_is_xml  = ev_is_xml
+        ev_is_json = ev_is_json ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_obj_definition_file.
+ 
+    DATA:
+      lv_xml  TYPE abap_bool,
+      lv_json TYPE abap_bool,
+      lv_name TYPE string,
+      lv_type TYPE string,
+      lv_ext  TYPE string.
+ 
+    SPLIT to_upper( iv_filename ) AT ''.'' INTO lv_name lv_type lv_ext.
+ 
+    detect_obj_definition(
+      EXPORTING
+        iv_ext     = lv_ext
+        iv_type    = lv_type
+      IMPORTING
+        ev_is_xml  = lv_xml
+        ev_is_json = lv_json ).
+ 
+    rv_yes = boolc( lv_json = abap_true OR lv_xml = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_filename_to_object.
+ 
+    DATA lv_class TYPE seoclsname.
+ 
+    " TODO: Add check for supported object types to avoid calls to non-existing classes
+    " zcl_abapgit_objects=>is_type_supported( is_item-obj_type )
+    " This will trigger class constructor of zcl_abapgit_objects_bridge reading table seometarel
+    " which is currently not supported by abaplint test runner
+ 
+    TRY.
+        lv_class = ''ZCL_ABAPGIT_OBJECT_'' && cs_item-obj_type.
+ 
+        CALL METHOD (lv_class)=>(''ZIF_ABAPGIT_OBJECT~MAP_FILENAME_TO_OBJECT'')
+          EXPORTING
+            iv_filename = iv_filename
+            iv_path     = iv_path
+            io_dot      = io_dot
+            iv_package  = iv_package
+          CHANGING
+            cs_item     = cs_item.
+      CATCH cx_sy_dyn_call_illegal_class ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_object_to_filename.
+ 
+    DATA lv_class TYPE seoclsname.
+ 
+    " TODO: Add check for supported object types to avoid calls to non-existing classes
+    " zcl_abapgit_objects=>is_type_supported( is_item-obj_type )
+    " This will trigger class constructor of zcl_abapgit_objects_bridge reading table seometarel
+    " which is currently not supported by abaplint test runner
+ 
+    TRY.
+        lv_class = ''ZCL_ABAPGIT_OBJECT_'' && is_item-obj_type.
+ 
+        CALL METHOD (lv_class)=>(''ZIF_ABAPGIT_OBJECT~MAP_OBJECT_TO_FILENAME'')
+          EXPORTING
+            is_item     = is_item
+          CHANGING
+            cv_filename = cv_filename.
+      CATCH cx_sy_dyn_call_illegal_class ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD name_escape.
+    " Some characters in object names cause problems when identifying the object later
+    " -> we escape these characters here
+    " cl_http_utility=>escape_url doesn''t do dots but escapes slash which we use for namespaces
+    " -> we escape just some selected characters
+    rv_name = iv_name.
+    REPLACE ALL OCCURRENCES OF \`#\` IN rv_name WITH ''%23''.
+    REPLACE ALL OCCURRENCES OF \`%\` IN rv_name WITH ''%25''.
+    REPLACE ALL OCCURRENCES OF \`.\` IN rv_name WITH ''%2e''.
+    REPLACE ALL OCCURRENCES OF \`<\` IN rv_name WITH ''%3c''.
+    REPLACE ALL OCCURRENCES OF \`=\` IN rv_name WITH ''%3d''.
+    REPLACE ALL OCCURRENCES OF \`>\` IN rv_name WITH ''%3e''.
+    REPLACE ALL OCCURRENCES OF \`?\` IN rv_name WITH ''%3f''.
+  ENDMETHOD.
+ 
+ 
+  METHOD name_unescape.
+    " Replace all %xy with encoded character
+    rv_name = cl_http_utility=>unescape_url( iv_name ).
+  ENDMETHOD.
+ 
+ 
+  METHOD object_to_file.
+ 
+    DATA lv_obj_name TYPE string.
+    DATA lv_nb_of_slash TYPE string.
+ 
+    " Get escaped object name
+    lv_obj_name = to_lower( name_escape( is_item-obj_name ) ).
+ 
+    IF iv_extra IS INITIAL.
+      CONCATENATE lv_obj_name ''.'' is_item-obj_type INTO rv_filename.
+    ELSE.
+      CONCATENATE lv_obj_name ''.'' is_item-obj_type ''.'' iv_extra INTO rv_filename.
+    ENDIF.
+ 
+    IF iv_ext IS NOT INITIAL.
+      CONCATENATE rv_filename ''.'' iv_ext INTO rv_filename.
+    ENDIF.
+ 
+    " Get mapping specific to object type
+    TRY.
+        map_object_to_filename(
+          EXPORTING
+            is_item     = is_item
+          CHANGING
+            cv_filename = rv_filename ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+ 
+    " Handle namespaces
+    CREATE OBJECT go_aff_registry TYPE zcl_abapgit_aff_registry.
+ 
+    IF go_aff_registry->is_supported_object_type( is_item-obj_type ) = abap_true.
+      FIND ALL OCCURRENCES OF \`/\` IN rv_filename MATCH COUNT lv_nb_of_slash.
+      IF lv_nb_of_slash = 2.
+        REPLACE FIRST OCCURRENCE OF \`/\` IN rv_filename WITH \`(\`.
+        REPLACE \`/\` IN rv_filename WITH \`)\`.
+      ENDIF.
+    ELSE.
+      REPLACE ALL OCCURRENCES OF ''/'' IN rv_filename WITH ''#''.
+    ENDIF.
+ 
+    TRANSLATE rv_filename TO LOWER CASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_FOLDER_LOGIC                ', 'CLASS zcl_abapgit_folder_logic DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS package_to_path
+      IMPORTING
+        !iv_top        TYPE devclass
+        !io_dot        TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_package    TYPE devclass
+      RETURNING
+        VALUE(rv_path) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS path_to_package
+      IMPORTING
+        !iv_top                  TYPE devclass
+        !io_dot                  TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_path                 TYPE string
+        !iv_create_if_not_exists TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rv_package)        TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_folder_logic .
+  PROTECTED SECTION.
+ 
+    METHODS get_parent
+      IMPORTING
+        !iv_top          TYPE devclass
+        !iv_package      TYPE devclass
+      RETURNING
+        VALUE(rv_parent) TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_devclass_info,
+        devclass  TYPE devclass,
+        namespace TYPE namespace,
+        parentcl  TYPE parentcl,
+      END OF ty_devclass_info .
+    TYPES:
+      ty_devclass_info_tt TYPE SORTED TABLE OF ty_devclass_info
+        WITH UNIQUE KEY devclass .
+    DATA mt_top_subpackages TYPE ty_devclass_info_tt .
+    DATA mt_parent TYPE ty_devclass_info_tt .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_folder_logic IMPLEMENTATION.
+ 
+ 
+  METHOD get_instance.
+    CREATE OBJECT ro_instance.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_parent.
+    DATA: ls_parent LIKE LINE OF mt_parent.
+ 
+    " Check that package is included in the TOP package hierarchy
+    IF mt_top_subpackages IS INITIAL.
+      mt_top_subpackages = zcl_abapgit_factory=>get_sap_package( iv_top )->list_subpackages( ).
+    ENDIF.
+ 
+    READ TABLE mt_top_subpackages TRANSPORTING NO FIELDS WITH KEY devclass = iv_package.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    "Determine Parent Package
+    READ TABLE mt_parent INTO ls_parent
+      WITH TABLE KEY devclass = iv_package.
+    IF sy-subrc <> 0.
+      rv_parent = zcl_abapgit_factory=>get_sap_package( iv_package )->read_parent( ).
+      ls_parent-devclass = iv_package.
+      ls_parent-parentcl = rv_parent.
+      INSERT ls_parent INTO TABLE mt_parent.
+    ELSE.
+      rv_parent = ls_parent-parentcl.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD package_to_path.
+ 
+    DATA: lv_len          TYPE i,
+          lv_path         TYPE string,
+          lv_message      TYPE string,
+          lv_parentcl     TYPE tdevc-parentcl,
+          lv_folder_logic TYPE string.
+ 
+    IF iv_top = iv_package.
+      rv_path = io_dot->get_starting_folder( ).
+    ELSE.
+      lv_parentcl = get_parent(
+        iv_top     = iv_top
+        iv_package = iv_package ).
+ 
+      " If the parent package can not be determined, we return an initial path and handle
+      " it outside of this class (in zcl_abapgit_file_status)
+      IF lv_parentcl IS NOT INITIAL.
+        lv_folder_logic = io_dot->get_folder_logic( ).
+        CASE lv_folder_logic.
+          WHEN zif_abapgit_dot_abapgit=>c_folder_logic-full.
+            lv_len = 0.
+            IF iv_package(1) = ''$''.
+              lv_len = 1.
+            ENDIF.
+          WHEN zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+            lv_len = strlen( lv_parentcl ).
+ 
+            IF iv_package(lv_len) <> lv_parentcl.
+* if abapGit project is installed in package ZZZ, all subpackages should be named
+* ZZZ_something. This will define the folder name in the zip file to be "something",
+* similarily with online projects. Alternatively change to FULL folder logic
+              lv_message = ''PREFIX: Unexpected package naming ('' && iv_package && '')''
+                           && ''you might switch the folder logic''.
+              zcx_abapgit_exception=>raise( lv_message ).
+            ENDIF.
+          WHEN zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+            lv_len = strlen( iv_top ).
+ 
+            IF iv_package(lv_len) <> iv_top.
+              lv_message = ''MIXED: Unexpected package naming ('' && iv_package && '')''
+                           && ''you might switch the folder logic''.
+              zcx_abapgit_exception=>raise( lv_message ).
+            ENDIF.
+          WHEN OTHERS.
+            zcx_abapgit_exception=>raise( |Invalid folder logic: { lv_folder_logic }| ).
+        ENDCASE.
+ 
+        lv_path = iv_package+lv_len.
+        IF strlen( lv_path ) = 0.
+          zcx_abapgit_exception=>raise( |Folder logic: length = 0, parent: {
+            lv_parentcl }, child: { iv_package }| ).
+        ENDIF.
+ 
+        IF lv_path(1) = ''_''.
+          lv_path = lv_path+1.
+        ENDIF.
+        IF strlen( lv_path ) = 0.
+          zcx_abapgit_exception=>raise( |Folder logic: length = 0, parent: {
+            lv_parentcl }, child: { iv_package }| ).
+        ENDIF.
+ 
+        TRANSLATE lv_path USING ''/#''.
+        TRANSLATE lv_path TO LOWER CASE.
+        CONCATENATE lv_path ''/'' INTO lv_path.
+ 
+        rv_path = package_to_path( iv_top     = iv_top
+                                   io_dot     = io_dot
+                                   iv_package = lv_parentcl ).
+ 
+        CONCATENATE rv_path lv_path INTO rv_path.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD path_to_package.
+ 
+    DATA: lv_length               TYPE i,
+          lv_parent               TYPE devclass,
+          ls_package              TYPE scompkdtln,
+          lv_new                  TYPE string,
+          lv_path                 TYPE string,
+          lv_absolute_name        TYPE string,
+          lv_folder_logic         TYPE string,
+          lt_unique_package_names TYPE HASHED TABLE OF devclass WITH UNIQUE KEY table_line.
+ 
+    lv_length  = strlen( io_dot->get_starting_folder( ) ).
+    IF lv_length > strlen( iv_path ).
+* treat as not existing locally
+      RETURN.
+    ENDIF.
+    lv_path    = iv_path+lv_length.
+    lv_parent  = iv_top.
+    rv_package = iv_top.
+ 
+    " Automatically create package using minimal properties
+    " Details will be updated during deserialization
+    IF iv_create_if_not_exists = abap_true.
+      IF iv_top(1) = ''$''.
+        zcl_abapgit_factory=>get_sap_package( iv_top )->create_local( ).
+      ELSE.
+        ls_package-devclass = iv_top.
+        ls_package-ctext = iv_top.
+        ls_package-as4user = sy-uname.
+        zcl_abapgit_factory=>get_sap_package( iv_top )->create( ls_package ).
+      ENDIF.
+    ENDIF.
+ 
+    INSERT iv_top INTO TABLE lt_unique_package_names.
+ 
+    WHILE lv_path CA ''/''.
+      SPLIT lv_path AT ''/'' INTO lv_new lv_path.
+ 
+      lv_folder_logic = io_dot->get_folder_logic( ).
+      CASE lv_folder_logic.
+        WHEN zif_abapgit_dot_abapgit=>c_folder_logic-full.
+          lv_absolute_name = lv_new.
+          TRANSLATE lv_absolute_name USING ''#/''.
+          IF iv_top(1) = ''$''.
+            CONCATENATE ''$'' lv_absolute_name INTO lv_absolute_name.
+          ENDIF.
+        WHEN zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+          CONCATENATE rv_package ''_'' lv_new INTO lv_absolute_name.
+        WHEN zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+          CONCATENATE iv_top ''_'' lv_new INTO lv_absolute_name.
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( |Invalid folder logic: { lv_folder_logic }| ).
+      ENDCASE.
+ 
+      TRANSLATE lv_absolute_name TO UPPER CASE.
+ 
+      IF strlen( lv_absolute_name ) > 30.
+        zcx_abapgit_exception=>raise( |Package { lv_absolute_name } exceeds ABAP 30-characters name limit| ).
+      ENDIF.
+ 
+      rv_package = lv_absolute_name.
+      READ TABLE lt_unique_package_names TRANSPORTING NO FIELDS
+        WITH TABLE KEY table_line = rv_package.
+      IF sy-subrc = 0.
+        zcx_abapgit_exception=>raise( |Package { rv_package } has a subpackage with the same name| ).
+      ELSE.
+        INSERT rv_package INTO TABLE lt_unique_package_names.
+      ENDIF.
+ 
+      IF zcl_abapgit_factory=>get_sap_package( rv_package )->exists( ) = abap_false AND
+          iv_create_if_not_exists = abap_true.
+ 
+        zcl_abapgit_factory=>get_sap_package( lv_parent )->create_child( rv_package ).
+      ENDIF.
+ 
+      lv_parent = rv_package.
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ITEM_GRAPH                  ', 'CLASS zcl_abapgit_item_graph DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_items TYPE zif_abapgit_definitions=>ty_items_tt .
+    METHODS add_edge
+      IMPORTING
+        !is_from TYPE zif_abapgit_definitions=>ty_item
+        !is_to   TYPE zif_abapgit_definitions=>ty_item .
+    METHODS has_vertices
+      RETURNING
+        VALUE(rv_bool) TYPE abap_bool .
+    METHODS get_next
+      IMPORTING
+        !ii_log        TYPE REF TO zif_abapgit_log
+      RETURNING
+        VALUE(rs_item) TYPE zif_abapgit_definitions=>ty_item .
+  PRIVATE SECTION.
+    TYPES: BEGIN OF ty_edge,
+             from TYPE zif_abapgit_definitions=>ty_item,
+             to   TYPE zif_abapgit_definitions=>ty_item,
+           END OF ty_edge.
+ 
+    DATA mt_vertices TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_item WITH DEFAULT KEY.
+    DATA mt_edges TYPE STANDARD TABLE OF ty_edge WITH DEFAULT KEY
+                       WITH NON-UNIQUE SORTED KEY sec_key
+                       COMPONENTS to.
+    DATA mv_warning TYPE abap_bool.
+ 
+    METHODS remove_vertex IMPORTING iv_index TYPE i.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ITEM_GRAPH IMPLEMENTATION.
+ 
+ 
+  METHOD add_edge.
+    DATA ls_edge LIKE LINE OF mt_edges.
+    ASSERT is_from IS NOT INITIAL.
+    ASSERT is_to IS NOT INITIAL.
+    ls_edge-from = is_from.
+    ls_edge-to   = is_to.
+    APPEND ls_edge TO mt_edges.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    INSERT LINES OF it_items INTO TABLE mt_vertices.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_next.
+* find a vertex with no inbound edges, if it does not exist pick anything
+ 
+    DATA ls_vertex LIKE LINE OF mt_vertices.
+    DATA lv_index  TYPE i.
+ 
+    LOOP AT mt_vertices INTO ls_vertex.
+      lv_index = sy-tabix.
+      READ TABLE mt_edges WITH KEY sec_key COMPONENTS
+        to-obj_type = ls_vertex-obj_type
+        to-obj_name = ls_vertex-obj_name
+        TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        remove_vertex( lv_index ).
+        rs_item = ls_vertex.
+        RETURN.
+      ENDIF.
+    ENDLOOP.
+ 
+    IF mv_warning = abap_false.
+* only issue the warning once per graph
+      ii_log->add_warning( |Cycle detected in item graph| ).
+      mv_warning = abap_true.
+    ENDIF.
+ 
+    READ TABLE mt_vertices INTO rs_item INDEX 1.
+    ASSERT sy-subrc = 0.
+    remove_vertex( 1 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD has_vertices.
+    rv_bool = boolc( lines( mt_vertices ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_vertex.
+    DATA ls_vertex LIKE LINE OF mt_vertices.
+ 
+    READ TABLE mt_vertices INDEX iv_index INTO ls_vertex.
+    ASSERT sy-subrc = 0.
+ 
+    DELETE mt_vertices INDEX iv_index.
+    DELETE mt_edges WHERE
+      from-obj_type = ls_vertex-obj_type AND
+      from-obj_name = ls_vertex-obj_name.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OBJECTS_FILES               ', 'CLASS zcl_abapgit_objects_files DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !is_item TYPE zif_abapgit_definitions=>ty_item
+        !iv_path TYPE string OPTIONAL .
+    METHODS add_string
+      IMPORTING
+        !iv_extra  TYPE clike OPTIONAL
+        !iv_ext    TYPE string
+        !iv_string TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_string
+      IMPORTING
+        !iv_extra        TYPE clike OPTIONAL
+        !iv_ext          TYPE string
+      RETURNING
+        VALUE(rv_string) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_xml
+      IMPORTING
+        !iv_extra     TYPE clike OPTIONAL
+        !ii_xml       TYPE REF TO zif_abapgit_xml_output
+        !iv_normalize TYPE abap_bool DEFAULT abap_true
+        !is_metadata  TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_xml
+      IMPORTING
+        !iv_extra     TYPE clike OPTIONAL
+      RETURNING
+        VALUE(ri_xml) TYPE REF TO zif_abapgit_xml_input
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_abap
+      IMPORTING
+        !iv_extra      TYPE clike OPTIONAL
+        !iv_error      TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rt_abap) TYPE abaptxt255_tab
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_abap
+      IMPORTING
+        !iv_extra TYPE clike OPTIONAL
+        !it_abap  TYPE STANDARD TABLE
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add
+      IMPORTING
+        !is_file TYPE zif_abapgit_git_definitions=>ty_file .
+    METHODS add_raw
+      IMPORTING
+        !iv_extra TYPE clike OPTIONAL
+        !iv_ext   TYPE string
+        !iv_data  TYPE xstring.
+    METHODS read_raw
+      IMPORTING
+        !iv_extra      TYPE clike OPTIONAL
+        !iv_ext        TYPE string
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_files
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    METHODS set_files
+      IMPORTING
+        !it_files TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    METHODS get_accessed_files
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt .
+    METHODS contains_file
+      IMPORTING
+        !iv_extra         TYPE clike OPTIONAL
+        !iv_ext           TYPE string
+      RETURNING
+        VALUE(rv_present) TYPE abap_bool .
+    METHODS get_file_pattern
+      RETURNING
+        VALUE(rv_pattern) TYPE string .
+    METHODS is_json_metadata
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool.
+    METHODS add_i18n_file
+      IMPORTING
+        !ii_i18n_file TYPE REF TO zif_abapgit_i18n_file
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_i18n_files
+      RETURNING
+        VALUE(rt_i18n_files) TYPE zif_abapgit_i18n_file=>ty_table_of
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+ 
+    METHODS read_file
+      IMPORTING
+        !iv_filename   TYPE string
+        !iv_error      TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    DATA ms_item TYPE zif_abapgit_definitions=>ty_item .
+    DATA mt_accessed_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt .
+    DATA mt_files TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    DATA mv_path TYPE string .
+ 
+    METHODS mark_accessed
+      IMPORTING
+        !iv_path TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_file TYPE zif_abapgit_git_definitions=>ty_file-filename.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_OBJECTS_FILES IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+    APPEND is_file TO mt_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD add_abap.
+ 
+    DATA: lv_source TYPE string,
+          ls_file   TYPE zif_abapgit_git_definitions=>ty_file.
+ 
+ 
+    CONCATENATE LINES OF it_abap INTO lv_source SEPARATED BY cl_abap_char_utilities=>newline.
+* when editing files via eg. GitHub web interface it adds a newline at end of file
+    lv_source = lv_source && cl_abap_char_utilities=>newline.
+ 
+    ls_file-path = ''/''.
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = ''abap'' ).
+    ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_source ).
+ 
+    APPEND ls_file TO mt_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_i18n_file.
+ 
+    DATA ls_file TYPE zif_abapgit_git_definitions=>ty_file.
+ 
+    ls_file-data = ii_i18n_file->render( ).
+    IF ls_file-data IS INITIAL.
+      RETURN. " Don''t add empty files
+    ENDIF.
+ 
+    ls_file-path     = ''/''.
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = |i18n.{ ii_i18n_file->lang( ) }|
+      iv_ext   = ii_i18n_file->ext( ) ).
+ 
+    APPEND ls_file TO mt_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_raw.
+ 
+    DATA: ls_file TYPE zif_abapgit_git_definitions=>ty_file.
+ 
+    ls_file-path     = ''/''.
+    ls_file-data     = iv_data.
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+ 
+    APPEND ls_file TO mt_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_string.
+ 
+    DATA: ls_file TYPE zif_abapgit_git_definitions=>ty_file.
+ 
+ 
+    ls_file-path = ''/''.
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+    ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( iv_string ).
+ 
+    APPEND ls_file TO mt_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_xml.
+ 
+    DATA: lv_xml  TYPE string,
+          ls_file TYPE zif_abapgit_git_definitions=>ty_file.
+ 
+    lv_xml = ii_xml->render( iv_normalize = iv_normalize
+                             is_metadata = is_metadata ).
+    ls_file-path = ''/''.
+ 
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = ''xml'' ).
+ 
+    REPLACE FIRST OCCURRENCE
+      OF REGEX ''<\\?xml version="1\\.0" encoding="[\\w-]+"\\?>''
+      IN lv_xml
+      WITH ''<?xml version="1.0" encoding="utf-8"?>''.
+    ASSERT sy-subrc = 0.
+ 
+    ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_xml ).
+ 
+    APPEND ls_file TO mt_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    ms_item = is_item.
+    mv_path = iv_path.
+  ENDMETHOD.
+ 
+ 
+  METHOD contains_file.
+    DATA: lv_filename TYPE string.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+ 
+    IF mv_path IS NOT INITIAL.
+      READ TABLE mt_files TRANSPORTING NO FIELDS
+          WITH KEY file_path
+          COMPONENTS path     = mv_path
+                     filename = lv_filename.
+    ELSE.
+      READ TABLE mt_files TRANSPORTING NO FIELDS
+          WITH KEY file
+          COMPONENTS filename = lv_filename.
+    ENDIF.
+ 
+    IF sy-subrc = 0.
+      rv_present = abap_true.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_accessed_files.
+    rt_files = mt_accessed_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_files.
+    rt_files = mt_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_file_pattern.
+    rv_pattern = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_ext   = ''*'' ).
+    " Escape special characters for use with ''covers pattern'' (CP)
+    REPLACE ALL OCCURRENCES OF ''#'' IN rv_pattern WITH ''##''.
+    REPLACE ALL OCCURRENCES OF ''+'' IN rv_pattern WITH ''#+''.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_json_metadata.
+ 
+    DATA lv_pattern TYPE string.
+ 
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF mt_files.
+ 
+    lv_pattern = |*.{ to_lower( ms_item-obj_type ) }.json|.
+ 
+    LOOP AT mt_files ASSIGNING <ls_file> WHERE filename CP lv_pattern.
+      rv_result = abap_true.
+      EXIT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD mark_accessed.
+ 
+    FIELD-SYMBOLS <ls_accessed> LIKE LINE OF mt_accessed_files.
+ 
+    READ TABLE mt_accessed_files TRANSPORTING NO FIELDS
+      WITH KEY path = iv_path filename = iv_file.
+    IF sy-subrc > 0. " Not found ? -> Add
+      APPEND INITIAL LINE TO mt_accessed_files ASSIGNING <ls_accessed>.
+      <ls_accessed>-path     = iv_path.
+      <ls_accessed>-filename = iv_file.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_abap.
+ 
+    DATA: lv_filename TYPE string,
+          lv_data     TYPE xstring,
+          lv_abap     TYPE string.
+ 
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = ''abap'' ).
+ 
+    lv_data = read_file( iv_filename = lv_filename
+                         iv_error    = iv_error ).
+ 
+    IF lv_data IS INITIAL. " Post-handling of iv_error = false
+      RETURN.
+    ENDIF.
+ 
+    lv_abap = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+ 
+    SPLIT lv_abap AT cl_abap_char_utilities=>newline INTO TABLE rt_abap.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_file.
+ 
+    FIELD-SYMBOLS <ls_file>     LIKE LINE OF mt_files.
+ 
+    IF mv_path IS NOT INITIAL.
+      READ TABLE mt_files ASSIGNING <ls_file>
+          WITH KEY file_path
+          COMPONENTS path     = mv_path
+                     filename = iv_filename.
+    ELSE.
+      READ TABLE mt_files ASSIGNING <ls_file>
+          WITH KEY file
+          COMPONENTS filename = iv_filename.
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      IF iv_error = abap_true.
+        zcx_abapgit_exception=>raise( |File not found: { iv_filename }| ).
+      ELSE.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    " Update access table
+    mark_accessed(
+      iv_path = <ls_file>-path
+      iv_file = <ls_file>-filename ).
+ 
+    rv_data = <ls_file>-data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_i18n_files.
+ 
+    DATA lv_lang TYPE laiso.
+    DATA lv_ext TYPE string.
+    DATA lo_po TYPE REF TO zcl_abapgit_po_file.
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF mt_files.
+ 
+    LOOP AT mt_files ASSIGNING <ls_file>.
+ 
+      " TODO: Maybe this should be in zcl_abapgit_filename_logic
+      FIND FIRST OCCURRENCE OF REGEX ''i18n\\.([^.]{2})\\.([^.]+)$'' IN <ls_file>-filename SUBMATCHES lv_lang lv_ext.
+      CHECK sy-subrc = 0.
+ 
+      CASE lv_ext.
+        WHEN ''po''.
+          CREATE OBJECT lo_po EXPORTING iv_lang = lv_lang.
+          lo_po->parse( <ls_file>-data ).
+          APPEND lo_po TO rt_i18n_files.
+        WHEN OTHERS.
+          CONTINUE. " Unsupported i18n file type
+      ENDCASE.
+ 
+      mark_accessed(
+        iv_path = <ls_file>-path
+        iv_file = <ls_file>-filename ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_raw.
+ 
+    DATA: lv_filename TYPE string.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+ 
+    rv_data = read_file( lv_filename ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_string.
+ 
+    DATA: lv_filename TYPE string,
+          lv_data     TYPE xstring.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+ 
+    lv_data = read_file( lv_filename ).
+ 
+    rv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_xml.
+ 
+    DATA: lv_filename TYPE string,
+          lv_data     TYPE xstring,
+          lv_xml      TYPE string.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = ''xml'' ).
+ 
+    lv_data = read_file( lv_filename ).
+ 
+    lv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+ 
+    CREATE OBJECT ri_xml
+      TYPE zcl_abapgit_xml_input
+      EXPORTING
+        iv_xml      = lv_xml
+        iv_filename = lv_filename.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_files.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files.
+ 
+    CLEAR mt_files.
+ 
+    " Set only files matching the pattern for this object
+    " If a path has been defined in the constructor, then the path has to match, too
+    LOOP AT it_files ASSIGNING <ls_file> WHERE filename CP get_file_pattern( ).
+      IF mv_path IS INITIAL.
+        INSERT <ls_file> INTO TABLE mt_files.
+      ELSEIF mv_path = <ls_file>-path.
+        INSERT <ls_file> INTO TABLE mt_files.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SERIALIZE                   ', 'CLASS zcl_abapgit_serialize DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !io_dot_abapgit    TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL
+        !is_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS on_end_of_task
+      IMPORTING
+        !p_task TYPE clike ##NEEDED.
+    METHODS serialize
+      IMPORTING
+        !iv_package          TYPE devclass OPTIONAL
+        !it_tadir            TYPE zif_abapgit_definitions=>ty_tadir_tt
+        !ii_log              TYPE REF TO zif_abapgit_log OPTIONAL
+        !iv_force_sequential TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_files)      TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS files_local
+      IMPORTING
+        !iv_package     TYPE devclass
+        !ii_log         TYPE REF TO zif_abapgit_log
+        !it_filter      TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL
+        !ii_data_config TYPE REF TO zif_abapgit_data_config OPTIONAL
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_unsupported_count,
+        obj_type TYPE tadir-object,
+        obj_name TYPE tadir-obj_name,
+        count    TYPE i,
+      END OF ty_unsupported_count .
+    TYPES:
+      ty_unsupported_count_tt TYPE HASHED TABLE OF ty_unsupported_count WITH UNIQUE KEY obj_type .
+    TYPES:
+      ty_char32 TYPE c LENGTH 32 .
+ 
+    CLASS-DATA gv_max_threads TYPE i .
+    DATA mt_files TYPE zif_abapgit_definitions=>ty_files_item_tt .
+    DATA mv_free TYPE i .
+    DATA mi_log TYPE REF TO zif_abapgit_log .
+    DATA mv_group TYPE rzlli_apcl .
+    DATA mo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit.
+    DATA ms_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings.
+    DATA ms_i18n_params TYPE zif_abapgit_definitions=>ty_i18n_params.
+ 
+    METHODS add_apack
+      IMPORTING
+        !iv_package TYPE devclass
+      CHANGING
+        !ct_files   TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_data
+      IMPORTING
+        !ii_data_config TYPE REF TO zif_abapgit_data_config
+      CHANGING
+        !ct_files       TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_dot_abapgit
+      CHANGING
+        !ct_files TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_to_return
+      IMPORTING
+        !iv_path      TYPE string
+        !is_file_item TYPE zif_abapgit_objects=>ty_serialization .
+    METHODS run_parallel
+      IMPORTING
+        !is_tadir TYPE zif_abapgit_definitions=>ty_tadir
+        !iv_task  TYPE ty_char32
+      RAISING
+        zcx_abapgit_exception .
+    METHODS run_sequential
+      IMPORTING
+        !is_tadir TYPE zif_abapgit_definitions=>ty_tadir
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_objects
+      IMPORTING
+        !iv_package     TYPE devclass
+        !ii_log         TYPE REF TO zif_abapgit_log
+        !it_filter      TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL
+      CHANGING
+        VALUE(ct_files) TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS determine_max_threads
+      IMPORTING
+        !iv_force_sequential TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_threads)    TYPE i
+      RAISING
+        zcx_abapgit_exception .
+    METHODS filter_unsupported_objects
+      CHANGING
+        !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt .
+    METHODS filter_ignored_objects
+      IMPORTING
+        !iv_package TYPE devclass
+      CHANGING
+        !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+    CLASS-METHODS determine_i18n_params
+      IMPORTING
+        !io_dot TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_main_language_only TYPE abap_bool
+      RETURNING
+        VALUE(rs_i18n_params) TYPE zif_abapgit_definitions=>ty_i18n_params
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_serialize IMPLEMENTATION.
+ 
+ 
+  METHOD add_apack.
+ 
+    DATA ls_apack_file TYPE zif_abapgit_git_definitions=>ty_file.
+ 
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF ct_files.
+ 
+ 
+    ls_apack_file = zcl_abapgit_apack_helper=>to_file( iv_package ).
+    IF ls_apack_file IS NOT INITIAL.
+      APPEND INITIAL LINE TO ct_files ASSIGNING <ls_file>.
+      <ls_file>-file = ls_apack_file.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_data.
+ 
+    DATA lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    DATA ls_file LIKE LINE OF lt_files.
+ 
+    FIELD-SYMBOLS <ls_return> LIKE LINE OF ct_files.
+ 
+    IF ii_data_config IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lt_files = ii_data_config->to_json( ).
+    LOOP AT lt_files INTO ls_file.
+      APPEND INITIAL LINE TO ct_files ASSIGNING <ls_return>.
+      <ls_return>-file = ls_file.
+ 
+      " Derive object from config filename (namespace + escaping)
+      zcl_abapgit_filename_logic=>file_to_object(
+        EXPORTING
+          iv_filename = <ls_return>-file-filename
+          iv_path     = <ls_return>-file-path
+          io_dot      = mo_dot_abapgit
+        IMPORTING
+          es_item     = <ls_return>-item ).
+ 
+      <ls_return>-item-obj_type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+    ENDLOOP.
+ 
+    lt_files = zcl_abapgit_data_factory=>get_serializer( )->serialize( ii_data_config ).
+    LOOP AT lt_files INTO ls_file.
+      APPEND INITIAL LINE TO ct_files ASSIGNING <ls_return>.
+      <ls_return>-file = ls_file.
+ 
+      " Derive object from data filename (namespace + escaping)
+      zcl_abapgit_filename_logic=>file_to_object(
+        EXPORTING
+          iv_filename = <ls_return>-file-filename
+          iv_path     = <ls_return>-file-path
+          io_dot      = mo_dot_abapgit
+        IMPORTING
+          es_item     = <ls_return>-item ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_dot_abapgit.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF ct_files.
+ 
+    APPEND INITIAL LINE TO ct_files ASSIGNING <ls_file>.
+    <ls_file>-file = mo_dot_abapgit->to_file( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_objects.
+ 
+    DATA: lo_filter TYPE REF TO zcl_abapgit_repo_filter,
+          lv_force  TYPE abap_bool,
+          lt_found  LIKE ct_files,
+          lt_tadir  TYPE zif_abapgit_definitions=>ty_tadir_tt.
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+      iv_package            = iv_package
+      iv_ignore_subpackages = ms_local_settings-ignore_subpackages
+      iv_only_local_objects = ms_local_settings-only_local_objects
+      io_dot                = mo_dot_abapgit
+      ii_log                = ii_log ).
+ 
+    CREATE OBJECT lo_filter.
+ 
+    lo_filter->apply( EXPORTING it_filter = it_filter
+                      CHANGING  ct_tadir  = lt_tadir ).
+ 
+* if there are less than 10 objects run in single thread
+* this helps a lot when debugging, plus performance gain
+* with low number of objects does not matter much
+    lv_force = boolc( lines( lt_tadir ) < 10 ).
+ 
+    lt_found = serialize(
+      iv_package          = iv_package
+      it_tadir            = lt_tadir
+      ii_log              = ii_log
+      iv_force_sequential = lv_force ).
+    APPEND LINES OF lt_found TO ct_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_to_return.
+ 
+    FIELD-SYMBOLS: <ls_file>   LIKE LINE OF is_file_item-files,
+                   <ls_return> LIKE LINE OF mt_files.
+ 
+ 
+    LOOP AT is_file_item-files ASSIGNING <ls_file>.
+      APPEND INITIAL LINE TO mt_files ASSIGNING <ls_return>.
+      <ls_return>-file = <ls_file>.
+      <ls_return>-file-path = iv_path.
+      <ls_return>-item = is_file_item-item.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA lo_settings TYPE REF TO zcl_abapgit_settings.
+ 
+    lo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true
+        OR lo_settings->get_parallel_proc_disabled( ) = abap_true.
+      gv_max_threads = 1.
+    ENDIF.
+ 
+    mv_group = ''parallel_generators''.
+ 
+    mo_dot_abapgit = io_dot_abapgit.
+    ms_local_settings = is_local_settings.
+ 
+    ms_i18n_params = determine_i18n_params(
+      io_dot = io_dot_abapgit
+      iv_main_language_only = is_local_settings-main_language_only ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_i18n_params.
+ 
+    " TODO: unify with ZCL_ABAPGIT_OBJECTS=>DETERMINE_I18N_PARAMS, same code
+ 
+    IF io_dot IS BOUND.
+      rs_i18n_params-main_language         = io_dot->get_main_language( ).
+      rs_i18n_params-use_lxe               = io_dot->use_lxe( ).
+      rs_i18n_params-main_language_only    = iv_main_language_only.
+      rs_i18n_params-translation_languages = zcl_abapgit_lxe_texts=>get_translation_languages(
+        iv_main_language  = io_dot->get_main_language( )
+        it_i18n_languages = io_dot->get_i18n_languages( ) ).
+    ENDIF.
+ 
+    IF rs_i18n_params-main_language IS INITIAL.
+      rs_i18n_params-main_language = sy-langu.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_max_threads.
+ 
+    IF iv_force_sequential = abap_true.
+      rv_threads = 1.
+      RETURN.
+    ENDIF.
+ 
+    IF gv_max_threads >= 1.
+* SPBT_INITIALIZE gives error PBT_ENV_ALREADY_INITIALIZED if called
+* multiple times in same session
+      rv_threads = gv_max_threads.
+      RETURN.
+    ENDIF.
+ 
+    CALL FUNCTION ''FUNCTION_EXISTS''
+      EXPORTING
+        funcname           = ''Z_ABAPGIT_SERIALIZE_PARALLEL''
+      EXCEPTIONS
+        function_not_exist = 1
+        OTHERS             = 2.
+    IF sy-subrc <> 0.
+      gv_max_threads = 1.
+    ELSE.
+* todo, add possibility to set group name in user exit
+      CALL FUNCTION ''SPBT_INITIALIZE''
+        EXPORTING
+          group_name                     = mv_group
+        IMPORTING
+          free_pbt_wps                   = gv_max_threads
+        EXCEPTIONS
+          invalid_group_name             = 1
+          internal_error                 = 2
+          pbt_env_already_initialized    = 3
+          currently_no_resources_avail   = 4
+          no_pbt_resources_found         = 5
+          cant_init_different_pbt_groups = 6
+          OTHERS                         = 7.
+      IF sy-subrc <> 0.
+*   fallback to running sequentially. If SPBT_INITIALIZE fails, check transactions
+*   RZ12, SM50, SM21, SARFC
+        gv_max_threads = 1.
+      ENDIF.
+    ENDIF.
+ 
+    IF gv_max_threads > 1.
+      gv_max_threads = gv_max_threads - 1.
+    ENDIF.
+ 
+    ASSERT gv_max_threads >= 1.
+ 
+    IF gv_max_threads > 32.
+* https://en.wikipedia.org/wiki/Amdahl%27s_law
+      gv_max_threads = 32.
+    ENDIF.
+ 
+    rv_threads = gv_max_threads.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD files_local.
+ 
+* serializes objects, including .abapgit.xml, apack, and takes into account local settings
+ 
+    add_dot_abapgit( CHANGING ct_files = rt_files ).
+ 
+    add_apack(
+      EXPORTING
+        iv_package = iv_package
+      CHANGING
+        ct_files   = rt_files ).
+ 
+    add_data(
+      EXPORTING
+        ii_data_config = ii_data_config
+      CHANGING
+        ct_files       = rt_files ).
+ 
+    add_objects(
+      EXPORTING
+        iv_package = iv_package
+        ii_log     = ii_log
+        it_filter  = it_filter
+      CHANGING
+        ct_files   = rt_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_ignored_objects.
+ 
+    DATA:
+      ls_ignored_count TYPE ty_unsupported_count,
+      lt_ignored_count TYPE ty_unsupported_count_tt,
+      lo_folder_logic  TYPE REF TO zcl_abapgit_folder_logic,
+      ls_item          TYPE zif_abapgit_definitions=>ty_item,
+      lv_path          TYPE string,
+      lv_filename      TYPE string.
+ 
+    FIELD-SYMBOLS:
+      <ls_tadir>         LIKE LINE OF ct_tadir,
+      <ls_ignored_count> TYPE ty_unsupported_count.
+ 
+    " Ignore logic requires .abapGit.xml
+    IF mo_dot_abapgit IS INITIAL OR iv_package IS INITIAL OR mi_log IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
+ 
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+      CLEAR: ls_ignored_count.
+ 
+      ls_item-obj_type = <ls_tadir>-object.
+      ls_item-obj_name = <ls_tadir>-obj_name.
+ 
+      IF <ls_tadir>-devclass IS NOT INITIAL.
+        lv_path = lo_folder_logic->package_to_path(
+          iv_top     = iv_package
+          io_dot     = mo_dot_abapgit
+          iv_package = <ls_tadir>-devclass ).
+      ELSE.
+        lv_path = mo_dot_abapgit->get_starting_folder( ).
+      ENDIF.
+ 
+      lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+        is_item  = ls_item
+        iv_ext   = ''*'' ).
+ 
+      IF mo_dot_abapgit->is_ignored(
+        iv_path     = lv_path
+        iv_filename = lv_filename ) = abap_false.
+        CONTINUE.
+      ENDIF.
+ 
+      READ TABLE lt_ignored_count ASSIGNING <ls_ignored_count> WITH TABLE KEY obj_type = <ls_tadir>-object.
+      IF sy-subrc <> 0.
+        ls_ignored_count-obj_type = <ls_tadir>-object.
+        ls_ignored_count-count    = 1.
+        ls_ignored_count-obj_name = <ls_tadir>-obj_name.
+        INSERT ls_ignored_count INTO TABLE lt_ignored_count ASSIGNING <ls_ignored_count>.
+      ELSE.
+        CLEAR: <ls_ignored_count>-obj_name.
+        <ls_ignored_count>-count = <ls_ignored_count>-count + 1.
+      ENDIF.
+      " init object so we can remove these entries afterwards
+      CLEAR <ls_tadir>-object.
+    ENDLOOP.
+    IF lt_ignored_count IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " remove ignored objects
+    DELETE ct_tadir WHERE object IS INITIAL.
+ 
+    LOOP AT lt_ignored_count ASSIGNING <ls_ignored_count>.
+      IF <ls_ignored_count>-count = 1.
+        mi_log->add_warning( iv_msg  = |Object { <ls_ignored_count>-obj_type } {
+                                       <ls_ignored_count>-obj_name } ignored| ).
+      ELSE.
+        mi_log->add_warning( iv_msg  = |Object type { <ls_ignored_count>-obj_type } with {
+                                       <ls_ignored_count>-count } objects ignored| ).
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_unsupported_objects.
+ 
+    DATA: ls_unsupported_count TYPE ty_unsupported_count,
+          lt_supported_types   TYPE zcl_abapgit_objects=>ty_types_tt,
+          lt_unsupported_count TYPE ty_unsupported_count_tt.
+ 
+    FIELD-SYMBOLS: <ls_tadir>             LIKE LINE OF ct_tadir,
+                   <ls_unsupported_count> TYPE ty_unsupported_count.
+ 
+    lt_supported_types = zcl_abapgit_objects=>supported_list( ).
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+      CLEAR: ls_unsupported_count.
+      READ TABLE lt_supported_types WITH KEY table_line = <ls_tadir>-object TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        CONTINUE.
+      ENDIF.
+ 
+      READ TABLE lt_unsupported_count ASSIGNING <ls_unsupported_count>
+                                      WITH TABLE KEY obj_type = <ls_tadir>-object.
+      IF sy-subrc <> 0.
+        ls_unsupported_count-obj_type = <ls_tadir>-object.
+        ls_unsupported_count-count    = 1.
+        ls_unsupported_count-obj_name = <ls_tadir>-obj_name.
+        INSERT ls_unsupported_count INTO TABLE lt_unsupported_count ASSIGNING <ls_unsupported_count>.
+      ELSE.
+        CLEAR: <ls_unsupported_count>-obj_name.
+        <ls_unsupported_count>-count = <ls_unsupported_count>-count + 1.
+      ENDIF.
+      CLEAR: <ls_tadir>-object.
+    ENDLOOP.
+    IF lt_unsupported_count IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    DELETE ct_tadir WHERE object IS INITIAL.
+    IF mi_log IS BOUND.
+      LOOP AT lt_unsupported_count ASSIGNING <ls_unsupported_count>.
+        IF <ls_unsupported_count>-count = 1.
+          mi_log->add_error( iv_msg  = |Object type { <ls_unsupported_count>-obj_type } not supported, {
+                                       <ls_unsupported_count>-obj_name } ignored| ).
+        ELSE.
+          mi_log->add_error( iv_msg  = |Object type { <ls_unsupported_count>-obj_type } not supported, {
+                                       <ls_unsupported_count>-count } objects ignored| ).
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD on_end_of_task.
+ 
+* this method will be called from the parallel processing, thus it must be public
+ 
+    DATA: lv_result    TYPE xstring,
+          lv_path      TYPE string,
+          lv_mess      TYPE c LENGTH 200,
+          ls_file_item TYPE zif_abapgit_objects=>ty_serialization.
+ 
+ 
+    RECEIVE RESULTS FROM FUNCTION ''Z_ABAPGIT_SERIALIZE_PARALLEL''
+      IMPORTING
+        ev_result             = lv_result
+        ev_path               = lv_path
+      EXCEPTIONS
+        error                 = 1
+        system_failure        = 2 MESSAGE lv_mess
+        communication_failure = 3 MESSAGE lv_mess
+        OTHERS = 4.
+    IF sy-subrc <> 0.
+      IF NOT mi_log IS INITIAL.
+        IF NOT lv_mess IS INITIAL.
+          mi_log->add_error( lv_mess ).
+        ELSE.
+          mi_log->add_error( |{ sy-msgv1 }{ sy-msgv2 }{ sy-msgv3 }{ sy-msgv3 }| ).
+        ENDIF.
+      ENDIF.
+    ELSE.
+      IMPORT data = ls_file_item FROM DATA BUFFER lv_result. "#EC CI_SUBRC
+      ASSERT sy-subrc = 0.
+      add_to_return( is_file_item = ls_file_item
+                     iv_path      = lv_path ).
+    ENDIF.
+ 
+    mv_free = mv_free + 1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run_parallel.
+ 
+    DATA: lv_msg  TYPE c LENGTH 100,
+          lv_task TYPE c LENGTH 32,
+          lv_free LIKE mv_free.
+ 
+ 
+    ASSERT mv_free > 0.
+ 
+    DO.
+      lv_task = |{ iv_task }-{ sy-index }|.
+      CALL FUNCTION ''Z_ABAPGIT_SERIALIZE_PARALLEL''
+        STARTING NEW TASK lv_task
+        DESTINATION IN GROUP mv_group
+        CALLING on_end_of_task ON END OF TASK
+        EXPORTING
+          iv_obj_type           = is_tadir-object
+          iv_obj_name           = is_tadir-obj_name
+          iv_devclass           = is_tadir-devclass
+          iv_path               = is_tadir-path
+          iv_language           = ms_i18n_params-main_language
+          iv_main_language_only = ms_i18n_params-main_language_only
+          it_translation_langs  = ms_i18n_params-translation_languages
+          iv_use_lxe            = ms_i18n_params-use_lxe
+        EXCEPTIONS
+          system_failure        = 1 MESSAGE lv_msg
+          communication_failure = 2 MESSAGE lv_msg
+          resource_failure      = 3
+          OTHERS                = 4.
+      IF sy-subrc = 3.
+        lv_free = mv_free.
+        WAIT UNTIL mv_free <> lv_free UP TO 1 SECONDS.
+        CONTINUE.
+      ELSEIF sy-subrc <> 0.
+        ASSERT lv_msg = '''' AND 0 = 1.
+      ENDIF.
+      EXIT.
+    ENDDO.
+ 
+    mv_free = mv_free - 1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run_sequential.
+ 
+    DATA: lx_error     TYPE REF TO zcx_abapgit_exception,
+          ls_file_item TYPE zif_abapgit_objects=>ty_serialization.
+ 
+ 
+    ls_file_item-item-obj_type  = is_tadir-object.
+    ls_file_item-item-obj_name  = is_tadir-obj_name.
+    ls_file_item-item-devclass  = is_tadir-devclass.
+    ls_file_item-item-srcsystem = is_tadir-srcsystem.
+ 
+    TRY.
+        ls_file_item = zcl_abapgit_objects=>serialize(
+          is_item        = ls_file_item-item
+          io_i18n_params = zcl_abapgit_i18n_params=>new( is_params = ms_i18n_params ) ).
+ 
+        add_to_return( is_file_item = ls_file_item
+                       iv_path      = is_tadir-path ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        IF NOT mi_log IS INITIAL.
+          mi_log->add_exception(
+              ix_exc  = lx_error
+              is_item = ls_file_item-item ).
+        ENDIF.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+ 
+* serializes only objects
+ 
+    DATA: lv_max      TYPE i,
+          lv_count    TYPE i,
+          li_progress TYPE REF TO zif_abapgit_progress,
+          li_exit     TYPE REF TO zif_abapgit_exit,
+          lo_timer    TYPE REF TO zcl_abapgit_timer,
+          lt_tadir    TYPE zif_abapgit_definitions=>ty_tadir_tt.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
+ 
+ 
+    CLEAR mt_files.
+ 
+    lv_max = determine_max_threads( iv_force_sequential ).
+    mv_free = lv_max.
+    mi_log = ii_log.
+ 
+    lt_tadir = it_tadir.
+    filter_unsupported_objects( CHANGING ct_tadir = lt_tadir ).
+ 
+    filter_ignored_objects(
+      EXPORTING
+        iv_package = iv_package
+      CHANGING
+        ct_tadir   = lt_tadir ).
+ 
+    lv_count = lines( lt_tadir ).
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lv_count ).
+ 
+    lo_timer = zcl_abapgit_timer=>create(
+      iv_text  = ''Serialize:''
+      iv_count = lv_count )->start( ).
+ 
+    LOOP AT lt_tadir ASSIGNING <ls_tadir>.
+ 
+      li_progress->show(
+        iv_current = sy-tabix
+        iv_text    = |Serialize { <ls_tadir>-obj_name }, { lv_max } threads| ).
+ 
+      IF lv_max = 1.
+        run_sequential( <ls_tadir> ).
+      ELSE.
+        run_parallel(
+          is_tadir = <ls_tadir>
+          iv_task  = |{ sy-tabix }| ).
+        WAIT UNTIL mv_free > 0 UP TO 120 SECONDS.
+      ENDIF.
+    ENDLOOP.
+ 
+    li_progress->off( ).
+ 
+    WAIT UNTIL mv_free = lv_max UP TO 120 SECONDS.
+    rt_files = mt_files.
+    FREE mt_files.
+ 
+*   Call postprocessing
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+    li_exit->serialize_postprocess(
+      EXPORTING
+        iv_package = iv_package
+        ii_log     = ii_log
+      CHANGING
+        ct_files   = rt_files ).
+ 
+    lo_timer->end( abap_true ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_TADIR                       ', 'CLASS zcl_abapgit_tadir DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_tadir .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS check_exists
+      IMPORTING
+        !it_tadir       TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RETURNING
+        VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build
+      IMPORTING
+        !iv_package            TYPE tadir-devclass
+        !io_dot                TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false
+        !iv_only_local_objects TYPE abap_bool DEFAULT abap_false
+        !ii_log                TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_tadir)        TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS select_objects
+      IMPORTING
+        !iv_package            TYPE tadir-devclass
+        !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false
+        !iv_only_local_objects TYPE abap_bool
+      EXPORTING
+        !et_packages           TYPE zif_abapgit_sap_package=>ty_devclass_tt
+        !et_tadir              TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_local_packages
+      IMPORTING
+        !it_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt
+      CHANGING
+        !ct_tadir    TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_namespaces
+      IMPORTING
+        !iv_package TYPE devclass
+      CHANGING
+        !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_namespace
+      IMPORTING
+        !iv_package TYPE devclass
+        !iv_object  TYPE csequence
+      CHANGING
+        !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS determine_path
+      IMPORTING
+        !iv_package TYPE tadir-devclass
+        !io_dot     TYPE REF TO zcl_abapgit_dot_abapgit
+      CHANGING
+        !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_sots_excluded
+      IMPORTING
+        !it_packages      TYPE zif_abapgit_sap_package=>ty_devclass_tt
+      RETURNING
+        VALUE(rv_exclude) TYPE abap_bool.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_tadir IMPLEMENTATION.
+ 
+ 
+  METHOD add_local_packages.
+ 
+    FIELD-SYMBOLS:
+      <lv_package> LIKE LINE OF it_packages,
+      <ls_tadir>   LIKE LINE OF ct_tadir.
+ 
+    LOOP AT it_packages ASSIGNING <lv_package>.
+ 
+      " Local packages are not in TADIR, only in TDEVC, act as if they were
+      IF <lv_package> CP ''$*''. " OR <package> CP ''T*'' ).
+        APPEND INITIAL LINE TO ct_tadir ASSIGNING <ls_tadir>.
+        <ls_tadir>-pgmid      = ''R3TR''.
+        <ls_tadir>-object     = ''DEVC''.
+        <ls_tadir>-obj_name   = <lv_package>.
+        <ls_tadir>-devclass   = <lv_package>.
+        <ls_tadir>-srcsystem  = sy-sysid.
+        <ls_tadir>-masterlang = sy-langu.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_namespace.
+ 
+    DATA:
+      lv_name      TYPE progname,
+      lv_namespace TYPE namespace.
+ 
+    FIELD-SYMBOLS <ls_tadir> LIKE LINE OF ct_tadir.
+ 
+    lv_name = iv_object.
+ 
+    CALL FUNCTION ''RS_NAME_SPLIT_NAMESPACE''
+      EXPORTING
+        name_with_namespace = lv_name
+      IMPORTING
+        namespace           = lv_namespace
+      EXCEPTIONS
+        delimiter_error     = 1
+        OTHERS              = 2.
+ 
+    IF sy-subrc = 0 AND lv_namespace IS NOT INITIAL.
+ 
+      READ TABLE ct_tadir TRANSPORTING NO FIELDS
+        WITH KEY pgmid = ''R3TR'' object = ''NSPC'' obj_name = lv_namespace.
+      IF sy-subrc <> 0.
+        APPEND INITIAL LINE TO ct_tadir ASSIGNING <ls_tadir>.
+        <ls_tadir>-pgmid      = ''R3TR''.
+        <ls_tadir>-object     = ''NSPC''.
+        <ls_tadir>-obj_name   = lv_namespace.
+        <ls_tadir>-devclass   = iv_package.
+        <ls_tadir>-srcsystem  = sy-sysid.
+        <ls_tadir>-masterlang = sy-langu.
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_namespaces.
+ 
+    FIELD-SYMBOLS <ls_tadir> LIKE LINE OF ct_tadir.
+ 
+    " Namespaces are not in TADIR, but are necessary for creating objects in transportable packages
+    LOOP AT ct_tadir ASSIGNING <ls_tadir> WHERE obj_name(1) = ''/''.
+      add_namespace(
+        EXPORTING
+          iv_package = iv_package
+          iv_object  = <ls_tadir>-obj_name
+        CHANGING
+          ct_tadir   = ct_tadir ).
+    ENDLOOP.
+ 
+    " Root package of repo might not exist yet but needs to be considered, too
+    IF iv_package CP ''/*''.
+      add_namespace(
+        EXPORTING
+          iv_package = iv_package
+          iv_object  = iv_package
+        CHANGING
+          ct_tadir   = ct_tadir ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build.
+ 
+    DATA lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    select_objects(
+      EXPORTING
+        iv_package            = iv_package
+        iv_ignore_subpackages = iv_ignore_subpackages
+        iv_only_local_objects = iv_only_local_objects
+      IMPORTING
+        et_tadir              = rt_tadir
+        et_packages           = lt_packages ).
+ 
+    add_local_packages(
+      EXPORTING
+        it_packages = lt_packages
+      CHANGING
+        ct_tadir    = rt_tadir ).
+ 
+    add_namespaces(
+      EXPORTING
+        iv_package = iv_package
+      CHANGING
+        ct_tadir   = rt_tadir ).
+ 
+    determine_path(
+      EXPORTING
+        iv_package = iv_package
+        io_dot     = io_dot
+      CHANGING
+        ct_tadir   = rt_tadir ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_exists.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          ls_item     TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
+ 
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( it_tadir ) ).
+ 
+* rows from database table TADIR are not removed for
+* transportable objects until the transport is released
+    LOOP AT it_tadir ASSIGNING <ls_tadir>.
+      IF sy-tabix MOD 200 = 0.
+        li_progress->show(
+          iv_current = sy-tabix
+          iv_text    = |Check object exists { <ls_tadir>-object } { <ls_tadir>-obj_name }| ).
+      ENDIF.
+ 
+      ls_item-obj_type = <ls_tadir>-object.
+      ls_item-obj_name = <ls_tadir>-obj_name.
+      ls_item-devclass = <ls_tadir>-devclass.
+ 
+      IF zcl_abapgit_objects=>exists( ls_item ) = abap_true.
+        APPEND <ls_tadir> TO rt_tadir.
+      ENDIF.
+    ENDLOOP.
+ 
+    li_progress->off( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_path.
+ 
+    DATA:
+      lv_path         TYPE string,
+      lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic,
+      lv_last_package TYPE devclass VALUE cl_abap_char_utilities=>horizontal_tab.
+ 
+    FIELD-SYMBOLS <ls_tadir> LIKE LINE OF ct_tadir.
+ 
+    lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
+ 
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+ 
+      IF lv_last_package <> <ls_tadir>-devclass.
+        "Change in Package
+        lv_last_package = <ls_tadir>-devclass.
+ 
+        IF NOT io_dot IS INITIAL.
+          lv_path = lo_folder_logic->package_to_path(
+            iv_top     = iv_package
+            io_dot     = io_dot
+            iv_package = <ls_tadir>-devclass ).
+        ENDIF.
+      ENDIF.
+ 
+      <ls_tadir>-path = lv_path.
+      <ls_tadir>-korrnum = ''''.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_sots_excluded.
+ 
+    " Todo: once all OTR longtexts are handled by object-specific class,
+    " we can exclude SOTS completely (just like SOTR)
+    " Until then, we need an object-type specific check here
+ 
+    DATA:
+      lt_concepts TYPE STANDARD TABLE OF sotr_headu-concept,
+      lv_count    TYPE i.
+ 
+    ASSERT it_packages IS NOT INITIAL.
+ 
+    rv_exclude = abap_false.
+ 
+    " Get all OTR longtexts
+    SELECT concept FROM sotr_headu INTO TABLE lt_concepts
+      FOR ALL ENTRIES IN it_packages WHERE paket = it_packages-table_line.
+    IF lines( lt_concepts ) > 0.
+      " Check if there are any texts related to objects that do not serialize these texts (yet)
+      " If yes, we need to keep processing SOTS
+      SELECT COUNT(*) FROM sotr_useu INTO lv_count
+        FOR ALL ENTRIES IN lt_concepts WHERE concept = lt_concepts-table_line
+        AND NOT ( pgmid = ''R3TR'' AND object = ''SICF'' )
+        AND NOT ( pgmid = ''LIMU'' AND object = ''CPUB'' ).
+      IF lv_count > 0.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    " If no, SOTS can be excluded from the TADIR selection
+    rv_exclude = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD select_objects.
+ 
+    DATA:
+      lt_excludes  TYPE RANGE OF trobjtype,
+      ls_exclude   LIKE LINE OF lt_excludes,
+      lt_srcsystem TYPE RANGE OF tadir-srcsystem,
+      ls_srcsystem LIKE LINE OF lt_srcsystem.
+ 
+    " Determine packages to read
+    IF iv_ignore_subpackages = abap_false.
+      et_packages = zcl_abapgit_factory=>get_sap_package( iv_package )->list_subpackages( ).
+    ENDIF.
+    INSERT iv_package INTO et_packages INDEX 1.
+ 
+    " Exclude object types with tadir entries that are included elsewhere
+    ls_exclude-sign   = ''I''.
+    ls_exclude-option = ''EQ''.
+    ls_exclude-low    = ''SOTR''. " automatically created for SAP packages (DEVC)
+    APPEND ls_exclude TO lt_excludes.
+    ls_exclude-low    = ''SFB1''. " covered by business function sets (SFBS)
+    APPEND ls_exclude TO lt_excludes.
+    ls_exclude-low    = ''SFB2''. " covered by business functions (SFBF)
+    APPEND ls_exclude TO lt_excludes.
+    ls_exclude-low    = ''STOB''. " auto generated by core data services (DDLS)
+    APPEND ls_exclude TO lt_excludes.
+ 
+    IF is_sots_excluded( et_packages ) = abap_true.
+      ls_exclude-low = ''SOTS''.
+      APPEND ls_exclude TO lt_excludes.
+    ENDIF.
+ 
+    " Limit to objects belonging to this system
+    IF iv_only_local_objects = abap_true.
+      ls_srcsystem-sign   = ''I''.
+      ls_srcsystem-option = ''EQ''.
+      ls_srcsystem-low    = sy-sysid.
+      APPEND ls_srcsystem TO lt_srcsystem.
+    ENDIF.
+ 
+    IF et_packages IS NOT INITIAL.
+      SELECT * FROM tadir INTO CORRESPONDING FIELDS OF TABLE et_tadir
+        FOR ALL ENTRIES IN et_packages
+        WHERE devclass = et_packages-table_line
+        AND pgmid      = ''R3TR''
+        AND object     NOT IN lt_excludes
+        AND delflag    = abap_false
+        AND srcsystem  IN lt_srcsystem
+        ORDER BY PRIMARY KEY ##TOO_MANY_ITAB_FIELDS. "#EC CI_GENBUFF "#EC CI_SUBRC
+    ENDIF.
+ 
+    SORT et_tadir BY devclass pgmid object obj_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_tadir~get_object_package.
+ 
+    DATA: ls_tadir TYPE zif_abapgit_definitions=>ty_tadir,
+          ls_item  TYPE zif_abapgit_definitions=>ty_item.
+ 
+    ls_tadir = zif_abapgit_tadir~read_single(
+      iv_pgmid    = iv_pgmid
+      iv_object   = iv_object
+      iv_obj_name = iv_obj_name ).
+ 
+    IF ls_tadir-delflag = abap_true.
+      RETURN. "Mark for deletion -> return nothing
+    ENDIF.
+ 
+    ls_item-obj_type = ls_tadir-object.
+    ls_item-obj_name = ls_tadir-obj_name.
+    ls_item-devclass = ls_tadir-devclass.
+ 
+    IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    rv_devclass = ls_tadir-devclass.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_tadir~read.
+ 
+    DATA: li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    " Start recursion
+    " hmm, some problems here, should TADIR also build path?
+    rt_tadir = build(
+      iv_package            = iv_package
+      io_dot                = io_dot
+      iv_ignore_subpackages = iv_ignore_subpackages
+      iv_only_local_objects = iv_only_local_objects
+      ii_log                = ii_log ).
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->change_tadir(
+      EXPORTING
+        iv_package = iv_package
+        ii_log     = ii_log
+      CHANGING
+        ct_tadir   = rt_tadir ).
+ 
+    rt_tadir = check_exists( rt_tadir ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_tadir~read_single.
+ 
+    SELECT SINGLE * FROM tadir INTO CORRESPONDING FIELDS OF rs_tadir
+      WHERE pgmid = iv_pgmid
+      AND object = iv_object
+      AND obj_name = iv_obj_name.                         "#EC CI_SUBRC
+    CLEAR rs_tadir-korrnum.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_TADIR                       ', 'INTERFACE zif_abapgit_tadir
+  PUBLIC .
+ 
+ 
+  METHODS get_object_package
+    IMPORTING
+      !iv_pgmid          TYPE tadir-pgmid DEFAULT ''R3TR''
+      !iv_object         TYPE tadir-object
+      !iv_obj_name       TYPE tadir-obj_name
+    RETURNING
+      VALUE(rv_devclass) TYPE tadir-devclass
+    RAISING
+      zcx_abapgit_exception .
+  METHODS read
+    IMPORTING
+      !iv_package            TYPE tadir-devclass
+      !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false
+      !iv_only_local_objects TYPE abap_bool DEFAULT abap_false
+      !io_dot                TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL
+      !ii_log                TYPE REF TO zif_abapgit_log OPTIONAL
+    RETURNING
+      VALUE(rt_tadir)        TYPE zif_abapgit_definitions=>ty_tadir_tt
+    RAISING
+      zcx_abapgit_exception .
+  METHODS read_single
+    IMPORTING
+      !iv_pgmid       TYPE tadir-pgmid DEFAULT ''R3TR''
+      !iv_object      TYPE tadir-object
+      !iv_obj_name    TYPE tadir-obj_name
+    RETURNING
+      VALUE(rs_tadir) TYPE zif_abapgit_definitions=>ty_tadir.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_ECATT                       ', 'INTERFACE zif_abapgit_ecatt
+  PUBLIC .
+ 
+  " downport missing types
+ 
+  TYPES:
+    ty_invert_validation TYPE c LENGTH 1,
+    ty_error_prio        TYPE n LENGTH 1,
+    ty_impl_name         TYPE c LENGTH 30,
+    ty_impl_type         TYPE c LENGTH 1,
+    ty_impl_subtype      TYPE c LENGTH 4,
+    ty_package           TYPE c LENGTH 255,
+    BEGIN OF ty_impl_det,
+      impl_name    TYPE ty_impl_name,
+      impl_type    TYPE ty_impl_type,
+      impl_subtype TYPE ty_impl_subtype,
+      impl_package TYPE ty_package,
+    END OF ty_impl_det.
+ 
+  TYPES:
+    BEGIN OF ty_bus_msg.
+      INCLUDE TYPE etobj_key.
+  TYPES:
+      bus_msg_no   TYPE c LENGTH 1, " ty_msg_no
+      arbgb        TYPE arbgb,
+      msgnr        TYPE msgnr,
+      bus_msg_text TYPE string, "ty_bus_msg_text
+      otr_key      TYPE sotr_conc,
+      msg_type     TYPE c LENGTH 4, "ty_msg_type
+    END OF ty_bus_msg,
+ 
+    ty_bus_msgs TYPE STANDARD TABLE OF ty_bus_msg.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_ECATT_DOWNLOAD              ', 'INTERFACE zif_abapgit_ecatt_download
+  PUBLIC .
+ 
+  METHODS:
+    get_xml_stream
+      RETURNING
+        VALUE(rv_xml_stream) TYPE xstring.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_ECATT_UPLOAD                ', 'INTERFACE zif_abapgit_ecatt_upload
+  PUBLIC .
+  METHODS:
+    set_stream_for_upload
+      IMPORTING
+        iv_xml TYPE xstring.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_OBJECT_ENHO                 ', 'INTERFACE zif_abapgit_object_enho PUBLIC.
+ 
+  METHODS:
+    deserialize
+      IMPORTING ii_xml     TYPE REF TO zif_abapgit_xml_input
+                iv_package TYPE devclass
+      RAISING   zcx_abapgit_exception,
+    serialize
+      IMPORTING ii_xml      TYPE REF TO zif_abapgit_xml_output
+                ii_enh_tool TYPE REF TO if_enh_tool
+      RAISING   zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_OBJECT_ENHS                 ', 'INTERFACE zif_abapgit_object_enhs PUBLIC.
+ 
+  METHODS:
+    deserialize
+      IMPORTING ii_xml           TYPE REF TO zif_abapgit_xml_input
+                iv_package       TYPE devclass
+                ii_enh_spot_tool TYPE REF TO if_enh_spot_tool
+      RAISING   zcx_abapgit_exception,
+ 
+    serialize
+      IMPORTING ii_xml           TYPE REF TO zif_abapgit_xml_output
+                ii_enh_spot_tool TYPE REF TO if_enh_spot_tool
+      RAISING   zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ADT_LINK                    ', 'CLASS zcl_abapgit_adt_link DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS jump
+      IMPORTING
+        !iv_obj_name     TYPE zif_abapgit_definitions=>ty_item-obj_name
+        !iv_obj_type     TYPE zif_abapgit_definitions=>ty_item-obj_type
+        !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name OPTIONAL
+        !iv_line_number  TYPE i OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS link_transport
+      IMPORTING
+        iv_transport TYPE trkorr
+      RETURNING
+        VALUE(rv_link) TYPE string.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS generate
+      IMPORTING
+        !iv_obj_name     TYPE zif_abapgit_definitions=>ty_item-obj_name
+        !iv_obj_type     TYPE zif_abapgit_definitions=>ty_item-obj_type
+        !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name OPTIONAL
+        !iv_line_number  TYPE i OPTIONAL
+      RETURNING
+        VALUE(rv_result) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS get_adt_objects_and_names
+      IMPORTING
+        iv_obj_name       TYPE zif_abapgit_definitions=>ty_item-obj_name
+        iv_obj_type       TYPE zif_abapgit_definitions=>ty_item-obj_type
+      EXPORTING
+        eo_adt_uri_mapper TYPE REF TO object
+        eo_adt_objectref  TYPE REF TO object
+        ev_program        TYPE progname
+        ev_include        TYPE progname
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS is_adt_jump_possible
+      IMPORTING
+        io_object                      TYPE REF TO cl_wb_object
+        io_adt                         TYPE REF TO object
+      RETURNING
+        VALUE(rv_is_adt_jump_possible) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_adt_link IMPLEMENTATION.
+ 
+  METHOD link_transport.
+* call to CL_CTS_ADT_TM_URI_BUILDER=>CREATE_ADT_URI replaced with logic that works on all systems,
+    rv_link = |adt://{ sy-sysid }/sap/bc/adt/cts/transportrequests/{ iv_transport }|.
+  ENDMETHOD.
+ 
+  METHOD generate.
+ 
+    DATA: lv_adt_link       TYPE string.
+    DATA: lo_adt_uri_mapper TYPE REF TO object.
+    DATA: lo_adt_objref     TYPE REF TO object.
+    DATA: lo_adt_sub_objref TYPE REF TO object.
+    DATA: lv_program        TYPE progname.
+    DATA: lv_include        TYPE progname.
+ 
+    FIELD-SYMBOLS: <lv_uri> TYPE string.
+ 
+    get_adt_objects_and_names(
+      EXPORTING
+        iv_obj_name       = iv_obj_name
+        iv_obj_type       = iv_obj_type
+      IMPORTING
+        eo_adt_uri_mapper = lo_adt_uri_mapper
+        eo_adt_objectref  = lo_adt_objref
+        ev_program        = lv_program
+        ev_include        = lv_include ).
+ 
+    TRY.
+        IF iv_sub_obj_name IS NOT INITIAL.
+ 
+          IF ( lv_program <> iv_obj_name AND lv_include IS INITIAL ) OR
+             ( lv_program = lv_include AND iv_sub_obj_name IS NOT INITIAL ).
+            lv_include = iv_sub_obj_name.
+          ENDIF.
+ 
+          CALL METHOD lo_adt_uri_mapper->(''IF_ADT_URI_MAPPER~MAP_INCLUDE_TO_OBJREF'')
+            EXPORTING
+              program     = lv_program
+              include     = lv_include
+              line        = iv_line_number
+              line_offset = 0
+              end_line    = iv_line_number
+              end_offset  = 1
+            RECEIVING
+              result      = lo_adt_sub_objref.
+          IF lo_adt_sub_objref IS NOT INITIAL.
+            lo_adt_objref = lo_adt_sub_objref.
+          ENDIF.
+ 
+        ENDIF.
+ 
+        ASSIGN (''LO_ADT_OBJREF->REF_DATA-URI'') TO <lv_uri>.
+        ASSERT sy-subrc = 0.
+ 
+        CONCATENATE ''adt://'' sy-sysid <lv_uri> INTO lv_adt_link.
+ 
+        rv_result = lv_adt_link.
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( ''ADT Jump Error'' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_adt_objects_and_names.
+ 
+    DATA lv_obj_type       TYPE trobjtype.
+    DATA lv_obj_name       TYPE trobj_name.
+    DATA lo_object         TYPE REF TO cl_wb_object.
+    DATA lo_adt            TYPE REF TO object.
+ 
+    FIELD-SYMBOLS <lv_uri> TYPE string.
+ 
+    lv_obj_name = iv_obj_name.
+    lv_obj_type = iv_obj_type.
+ 
+    TRY.
+        cl_wb_object=>create_from_transport_key(
+          EXPORTING
+            p_object    = lv_obj_type
+            p_obj_name  = lv_obj_name
+          RECEIVING
+            p_wb_object = lo_object
+          EXCEPTIONS
+            OTHERS      = 1 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise( ''ADT Jump Error'' ).
+        ENDIF.
+ 
+        CALL METHOD (''CL_ADT_TOOLS_CORE_FACTORY'')=>(''GET_INSTANCE'')
+          RECEIVING
+            result = lo_adt.
+ 
+        IF is_adt_jump_possible( io_object = lo_object
+                                 io_adt    = lo_adt ) = abap_false.
+          zcx_abapgit_exception=>raise( ''ADT Jump Error'' ).
+        ENDIF.
+ 
+        CALL METHOD lo_adt->(''IF_ADT_TOOLS_CORE_FACTORY~GET_URI_MAPPER'')
+          RECEIVING
+            result = eo_adt_uri_mapper.
+ 
+        CALL METHOD eo_adt_uri_mapper->(''IF_ADT_URI_MAPPER~MAP_WB_OBJECT_TO_OBJREF'')
+          EXPORTING
+            wb_object = lo_object
+          RECEIVING
+            result    = eo_adt_objectref.
+ 
+        ASSIGN (''EO_ADT_OBJECTREF->REF_DATA-URI'') TO <lv_uri>.
+        ASSERT sy-subrc = 0.
+ 
+        CALL METHOD eo_adt_uri_mapper->(''IF_ADT_URI_MAPPER~MAP_OBJREF_TO_INCLUDE'')
+          EXPORTING
+            uri     = <lv_uri>
+          IMPORTING
+            program = ev_program
+            include = ev_include.
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( ''ADT Jump Error'' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_adt_jump_possible.
+ 
+    DATA: lo_wb_request         TYPE REF TO cl_wb_request,
+          lo_adt_uri_mapper_vit TYPE REF TO object,
+          lv_vit_wb_request     TYPE abap_bool.
+ 
+    cl_wb_request=>create_from_object_ref(
+      EXPORTING
+        p_wb_object       = io_object
+      RECEIVING
+        p_wb_request      = lo_wb_request
+      EXCEPTIONS
+        illegal_operation = 1
+        cancelled         = 2
+        OTHERS            = 3 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''ADT Jump Error'' ).
+    ENDIF.
+ 
+    TRY.
+        CALL METHOD io_adt->(''IF_ADT_TOOLS_CORE_FACTORY~GET_URI_MAPPER_VIT'')
+          RECEIVING
+            result = lo_adt_uri_mapper_vit.
+ 
+        CALL METHOD lo_adt_uri_mapper_vit->(''IF_ADT_URI_MAPPER_VIT~IS_VIT_WB_REQUEST'')
+          EXPORTING
+            wb_request = lo_wb_request
+          RECEIVING
+            result     = lv_vit_wb_request.
+ 
+        rv_is_adt_jump_possible = boolc( NOT lv_vit_wb_request = abap_true ).
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( ''ADT Jump Error'' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump.
+ 
+    DATA lv_adt_link TYPE string.
+ 
+    TRY.
+        lv_adt_link = generate(
+          iv_obj_name     = iv_obj_name
+          iv_obj_type     = iv_obj_type
+          iv_sub_obj_name = iv_sub_obj_name
+          iv_line_number  = iv_line_number ).
+ 
+        zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ).
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( ''ADT Jump Error'' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_JUMPER                  ', 'CLASS zcl_abapgit_gui_jumper DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_jumper.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS jump_tr
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_exit) TYPE abap_bool.
+ 
+    METHODS jump_wb
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+        !iv_new_window TYPE abap_bool
+      RETURNING
+        VALUE(rv_exit) TYPE abap_bool.
+ 
+    METHODS jump_wb_line
+      IMPORTING
+        !is_item         TYPE zif_abapgit_definitions=>ty_item
+        !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
+        !iv_sub_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type
+        !iv_line_number  TYPE i
+        !iv_new_window   TYPE abap_bool
+      RETURNING
+        VALUE(rv_exit)   TYPE abap_bool.
+ 
+    METHODS jump_bw
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+        !iv_new_window TYPE abap_bool
+      RETURNING
+        VALUE(rv_exit) TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_jumper IMPLEMENTATION.
+ 
+ 
+  METHOD jump_bw.
+ 
+    DATA:
+      lv_exit  TYPE abap_bool,
+      lv_tlogo TYPE c LENGTH 4, "rstlogo
+      lv_objnm TYPE c LENGTH 40. "rsawbnobjnm
+ 
+    lv_tlogo = is_item-obj_type.
+    lv_objnm = is_item-obj_name.
+ 
+    TRY.
+        CALL METHOD (''CL_RSAWBN_AWB'')=>(''IS_SUPPORTED_NAVIGATION'')
+          EXPORTING
+            i_tlogo               = lv_tlogo
+            i_fcode               = ''DISPLAY''
+          IMPORTING
+            re_is_supported_fcode = lv_exit.
+ 
+        IF lv_exit = abap_false.
+          RETURN.
+        ENDIF.
+      CATCH cx_root.
+        " Not a BW system
+        RETURN.
+    ENDTRY.
+ 
+    TRY.
+        CALL METHOD (''CL_RSAWBN_AWB'')=>(''NAVIGATE_FROM_APPLICATION'')
+          EXPORTING
+            i_tlogo                = lv_tlogo
+            i_objnm                = lv_objnm
+            i_new_mode             = iv_new_window
+          IMPORTING
+            e_exit_own_application = lv_exit.
+ 
+      CATCH cx_root.
+        " Older release without i_new_mode
+        CALL METHOD (''CL_RSAWBN_AWB'')=>(''NAVIGATE_FROM_APPLICATION'')
+          EXPORTING
+            i_tlogo                = lv_tlogo
+            i_objnm                = lv_objnm
+          IMPORTING
+            e_exit_own_application = lv_exit.
+    ENDTRY.
+ 
+    rv_exit = lv_exit.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_tr.
+ 
+    DATA:
+      lv_e071_object   TYPE e071-object,
+      lv_e071_obj_name TYPE e071-obj_name.
+ 
+    lv_e071_object   = is_item-obj_type.
+    lv_e071_obj_name = is_item-obj_name.
+ 
+    CALL FUNCTION ''TR_OBJECT_JUMP_TO_TOOL''
+      EXPORTING
+        iv_action         = ''SHOW''
+        iv_pgmid          = ''R3TR''
+        iv_object         = lv_e071_object
+        iv_obj_name       = lv_e071_obj_name
+      EXCEPTIONS
+        jump_not_possible = 1
+        OTHERS            = 2.
+ 
+    rv_exit = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_wb.
+ 
+    CALL FUNCTION ''RS_TOOL_ACCESS''
+      EXPORTING
+        operation           = ''SHOW''
+        object_name         = is_item-obj_name
+        object_type         = is_item-obj_type
+        devclass            = is_item-devclass
+        in_new_window       = iv_new_window
+      EXCEPTIONS
+        not_executed        = 1
+        invalid_object_type = 2
+        OTHERS              = 3.
+ 
+    rv_exit = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_wb_line.
+ 
+    IF iv_line_number IS NOT INITIAL AND iv_sub_obj_type IS NOT INITIAL AND iv_sub_obj_name IS NOT INITIAL.
+ 
+      " For the line navigation we have to supply the sub object type (iv_sub_obj_type).
+      " If we use is_item-obj_type it navigates only to the object.
+      CALL FUNCTION ''RS_TOOL_ACCESS''
+        EXPORTING
+          operation           = ''SHOW''
+          object_name         = is_item-obj_name
+          object_type         = iv_sub_obj_type
+          devclass            = is_item-devclass
+          include             = iv_sub_obj_name
+          position            = iv_line_number
+          in_new_window       = iv_new_window
+        EXCEPTIONS
+          not_executed        = 1
+          invalid_object_type = 2
+          OTHERS              = 3.
+ 
+      rv_exit = boolc( sy-subrc = 0 ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_jumper~jump.
+ 
+    " WebGUI cannot open windows or ADT
+    IF zcl_abapgit_ui_factory=>get_frontend_services( )->is_webgui( ) = abap_true.
+      zcx_abapgit_exception=>raise( |Jump not possible in WebGUI| ).
+    ENDIF.
+ 
+    " Try all generic jump options
+ 
+    " 1) ADT Jump
+    rv_exit = zif_abapgit_gui_jumper~jump_adt(
+      is_item         = is_item
+      iv_sub_obj_name = is_sub_item-obj_name
+      iv_line_number  = iv_line_number ).
+ 
+    IF rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " 2) WB Jump with Line Number
+    rv_exit = jump_wb_line(
+      is_item         = is_item
+      iv_sub_obj_name = is_sub_item-obj_name
+      iv_sub_obj_type = is_sub_item-obj_type
+      iv_line_number  = iv_line_number
+      iv_new_window   = iv_new_window ).
+ 
+    IF rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " 3) WB Jump without Line Number
+    rv_exit = jump_wb(
+      is_item       = is_item
+      iv_new_window = iv_new_window ).
+ 
+    IF rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " 4) Transport Tool Jump
+    rv_exit = jump_tr( is_item ).
+ 
+    IF rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " 5) BW Jump
+    rv_exit = jump_bw(
+      is_item       = is_item
+      iv_new_window = iv_new_window ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_jumper~jump_abapgit.
+ 
+    DATA lt_spagpa        TYPE STANDARD TABLE OF rfc_spagpa.
+    DATA ls_spagpa        LIKE LINE OF lt_spagpa.
+    DATA lv_save_sy_langu TYPE sy-langu.
+    DATA lv_subrc         TYPE syst-subrc.
+    DATA lv_tcode         TYPE tcode.
+ 
+    " https://blogs.sap.com/2017/01/13/logon-language-sy-langu-and-rfc/
+ 
+    lv_tcode = zcl_abapgit_services_abapgit=>get_abapgit_tcode( ).
+ 
+    lv_save_sy_langu = sy-langu.
+    SET LOCALE LANGUAGE iv_language.
+ 
+    ls_spagpa-parid  = zif_abapgit_definitions=>c_spagpa_param_repo_key.
+    ls_spagpa-parval = iv_key.
+    INSERT ls_spagpa INTO TABLE lt_spagpa.
+ 
+    CALL FUNCTION ''ABAP4_CALL_TRANSACTION''
+      DESTINATION ''NONE''
+      STARTING NEW TASK ''ABAPGIT''
+      EXPORTING
+        tcode                   = lv_tcode
+      TABLES
+        spagpa_tab              = lt_spagpa
+      EXCEPTIONS
+        call_transaction_denied = 1
+        tcode_invalid           = 2
+        communication_failure   = 3
+        system_failure          = 4
+        OTHERS                  = 5.
+ 
+    lv_subrc = sy-subrc.
+ 
+    SET LOCALE LANGUAGE lv_save_sy_langu.
+ 
+    IF lv_subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error from ABAP4_CALL_TRANSACTION. Subrc = { lv_subrc }| ).
+    ENDIF.
+ 
+    MESSAGE ''Repository opened in a new window'' TYPE ''S''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_jumper~jump_adt.
+ 
+    " Open object in ADT (if enabled)
+ 
+    DATA lv_adt_jump_enabled TYPE abap_bool.
+ 
+    lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
+ 
+    IF lv_adt_jump_enabled = abap_true.
+      TRY.
+          zcl_abapgit_adt_link=>jump(
+            iv_obj_name     = is_item-obj_name
+            iv_obj_type     = is_item-obj_type
+            iv_sub_obj_name = iv_sub_obj_name
+            iv_line_number  = iv_line_number ).
+ 
+          rv_exit = abap_true.
+        CATCH zcx_abapgit_exception ##NO_HANDLER.
+          " Use fallback
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_jumper~jump_batch_input.
+ 
+    DATA lv_msg TYPE c LENGTH 80.
+ 
+    IF iv_new_window = abap_true.
+      CALL FUNCTION ''ABAP4_CALL_TRANSACTION''
+        STARTING NEW TASK ''GIT''
+        EXPORTING
+          tcode                 = iv_tcode
+          mode_val              = ''E''
+        TABLES
+          using_tab             = it_bdcdata
+        EXCEPTIONS
+          system_failure        = 1 MESSAGE lv_msg
+          communication_failure = 2 MESSAGE lv_msg
+          resource_failure      = 3
+          OTHERS                = 4.
+    ELSE.
+      CALL FUNCTION ''ABAP4_CALL_TRANSACTION''
+        EXPORTING
+          tcode     = iv_tcode
+          mode_val  = ''E''
+        TABLES
+          using_tab = it_bdcdata
+        EXCEPTIONS
+          OTHERS    = 4.
+    ENDIF.
+ 
+    CASE sy-subrc.
+      WHEN 1 OR 2.
+        zcx_abapgit_exception=>raise( |Batch input error for transaction { iv_tcode }: { lv_msg }| ).
+      WHEN 3 OR 4.
+        zcx_abapgit_exception=>raise( |Batch input error for transaction { iv_tcode }| ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_JUMPER                  ', 'INTERFACE zif_abapgit_gui_jumper
+  PUBLIC.
+ 
+  TYPES:
+    ty_bdcdata_tt TYPE STANDARD TABLE OF bdcdata WITH DEFAULT KEY.
+ 
+  METHODS jump
+    IMPORTING
+      !is_item         TYPE zif_abapgit_definitions=>ty_item
+      !is_sub_item     TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+      !iv_line_number  TYPE i OPTIONAL
+      !iv_new_window   TYPE abap_bool DEFAULT abap_true
+    RETURNING
+      VALUE(rv_exit)   TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS jump_adt
+    IMPORTING
+      !is_item         TYPE zif_abapgit_definitions=>ty_item
+      !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
+      !iv_line_number  TYPE i
+    RETURNING
+      VALUE(rv_exit)   TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS jump_batch_input
+    IMPORTING
+      !iv_tcode      TYPE sy-tcode
+      !it_bdcdata    TYPE ty_bdcdata_tt
+      !iv_new_window TYPE abap_bool DEFAULT abap_true
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS jump_abapgit
+    IMPORTING
+      !iv_language TYPE spras
+      !iv_key      TYPE zif_abapgit_persistence=>ty_value
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OO_BASE                     ', 'CLASS zcl_abapgit_oo_base DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_oo_object_fnc .
+  PROTECTED SECTION.
+    CLASS-METHODS:
+      convert_attrib_to_vseoattrib
+        IMPORTING iv_clsname           TYPE seoclsname
+                  it_attributes        TYPE zif_abapgit_definitions=>ty_obj_attribute_tt
+        RETURNING VALUE(rt_vseoattrib) TYPE seoo_attributes_r.
+ 
+  PRIVATE SECTION.
+    CONSTANTS c_docu_state_active TYPE dokstate VALUE ''A''. " See include SDOC_CONSTANTS
+    DATA mv_skip_test_classes TYPE abap_bool .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_oo_base IMPLEMENTATION.
+ 
+ 
+  METHOD convert_attrib_to_vseoattrib.
+    FIELD-SYMBOLS: <ls_attribute>  LIKE LINE OF it_attributes,
+                   <ls_vseoattrib> LIKE LINE OF rt_vseoattrib.
+ 
+    LOOP AT it_attributes ASSIGNING <ls_attribute>.
+      INSERT INITIAL LINE INTO TABLE rt_vseoattrib ASSIGNING <ls_vseoattrib>.
+      MOVE-CORRESPONDING <ls_attribute> TO <ls_vseoattrib>.
+      <ls_vseoattrib>-clsname = iv_clsname.
+      <ls_vseoattrib>-state = seoc_state_implemented.
+      <ls_vseoattrib>-exposure = <ls_attribute>-exposure.
+      UNASSIGN <ls_vseoattrib>.
+    ENDLOOP.
+    UNASSIGN <ls_attribute>.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~add_to_activation_list.
+    zcl_abapgit_objects_activation=>add_item( is_item ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~create.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~create_documentation.
+    CALL FUNCTION ''DOCU_UPD''
+      EXPORTING
+        id            = iv_id
+        langu         = iv_language
+        object        = iv_object_name
+        no_masterlang = iv_no_masterlang
+        state         = c_docu_state_active
+      TABLES
+        line          = it_lines
+      EXCEPTIONS
+        ret_code      = 1
+        OTHERS        = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~create_sotr.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~delete.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~delete_documentation.
+    CALL FUNCTION ''DOCU_DEL''
+      EXPORTING
+        id       = iv_id
+        langu    = iv_language
+        object   = iv_object_name
+        typ      = ''E''
+      EXCEPTIONS
+        ret_code = 1
+        OTHERS   = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error from DOCU_DEL'' ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~deserialize_source.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~exists.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~generate_locals.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_class_properties.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_includes.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_interface_properties.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_skip_test_classes.
+    rv_skip = mv_skip_test_classes.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~insert_text_pool.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_attributes.
+    SELECT cmpname attbusobj attkeyfld exposure
+      FROM seocompodf
+      INTO CORRESPONDING FIELDS OF TABLE rt_attributes
+      WHERE clsname = iv_object_name
+        AND ( attbusobj <> space OR attkeyfld <> space )
+        AND version = ''1''
+      ORDER BY PRIMARY KEY.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_descriptions.
+    FIELD-SYMBOLS <ls_description> LIKE LINE OF rt_descriptions.
+ 
+    IF iv_language IS INITIAL.
+      " load all languages
+      SELECT * FROM seocompotx INTO TABLE rt_descriptions
+             WHERE clsname   = iv_object_name
+               AND descript <> ''''
+             ORDER BY PRIMARY KEY.                        "#EC CI_SUBRC
+    ELSE.
+      " load main language
+      SELECT * FROM seocompotx INTO TABLE rt_descriptions
+              WHERE clsname   = iv_object_name
+                AND langu     = iv_language
+                AND descript <> ''''
+              ORDER BY PRIMARY KEY.                       "#EC CI_SUBRC
+    ENDIF.
+ 
+    LOOP AT rt_descriptions ASSIGNING <ls_description>.
+      CLEAR <ls_description>-clsname.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_descriptions_sub.
+    FIELD-SYMBOLS <ls_description> LIKE LINE OF rt_descriptions.
+ 
+    IF iv_language IS INITIAL.
+      " load all languages
+      SELECT * FROM seosubcotx INTO TABLE rt_descriptions
+             WHERE clsname   = iv_object_name
+               AND descript <> ''''
+             ORDER BY PRIMARY KEY.                        "#EC CI_SUBRC
+    ELSE.
+      " load main language
+      SELECT * FROM seosubcotx INTO TABLE rt_descriptions
+              WHERE clsname   = iv_object_name
+                AND langu     = iv_language
+                AND descript <> ''''
+              ORDER BY PRIMARY KEY.                       "#EC CI_SUBRC
+    ENDIF.
+ 
+    LOOP AT rt_descriptions ASSIGNING <ls_description>.
+      CLEAR <ls_description>-clsname.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_documentation.
+    DATA: lv_state  TYPE dokstate,
+          lt_lines  TYPE tlinetab.
+ 
+    CALL FUNCTION ''DOCU_GET''
+      EXPORTING
+        id                     = iv_id
+        langu                  = iv_language
+        object                 = iv_object_name
+        version_active_or_last = space " retrieve active version
+      IMPORTING
+        dokstate               = lv_state
+      TABLES
+        line                   = lt_lines
+      EXCEPTIONS
+        no_docu_on_screen      = 1
+        no_docu_self_def       = 2
+        no_docu_temp           = 3
+        ret_code               = 4
+        OTHERS                 = 5.
+    IF sy-subrc = 0 AND lv_state = c_docu_state_active.
+      rt_lines = lt_lines.
+    ELSE.
+      CLEAR rt_lines.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_sotr.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_superclass.
+    SELECT SINGLE refclsname FROM vseoextend INTO rv_superclass
+      WHERE clsname = iv_classname.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_text_pool.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~serialize_abap.
+    DATA lo_oo_serializer TYPE REF TO zcl_abapgit_oo_serializer.
+    CREATE OBJECT lo_oo_serializer.
+    CASE iv_type.
+      WHEN seop_ext_class_locals_def.
+        rt_source = lo_oo_serializer->serialize_locals_def( is_class_key ).
+      WHEN seop_ext_class_locals_imp.
+        rt_source = lo_oo_serializer->serialize_locals_imp( is_class_key ).
+      WHEN seop_ext_class_macros.
+        rt_source = lo_oo_serializer->serialize_macros( is_class_key ).
+      WHEN seop_ext_class_testclasses.
+        rt_source = lo_oo_serializer->serialize_testclasses( is_class_key ).
+        mv_skip_test_classes = lo_oo_serializer->are_test_classes_skipped( ).
+      WHEN OTHERS.
+        rt_source = lo_oo_serializer->serialize_abap_clif_source( is_class_key ).
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~update_descriptions.
+    DATA lt_descriptions LIKE it_descriptions.
+    FIELD-SYMBOLS <ls_description> LIKE LINE OF it_descriptions.
+ 
+    lt_descriptions = it_descriptions.
+    LOOP AT lt_descriptions ASSIGNING <ls_description>.
+      <ls_description>-clsname = is_key-clsname.
+    ENDLOOP.
+    DELETE FROM seocompotx WHERE clsname = is_key-clsname. "#EC CI_SUBRC
+    INSERT seocompotx FROM TABLE lt_descriptions.         "#EC CI_SUBRC
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~update_descriptions_sub.
+    DATA lt_descriptions LIKE it_descriptions.
+    FIELD-SYMBOLS <ls_description> LIKE LINE OF it_descriptions.
+ 
+    lt_descriptions = it_descriptions.
+    LOOP AT lt_descriptions ASSIGNING <ls_description>.
+      <ls_description>-clsname = is_key-clsname.
+    ENDLOOP.
+    DELETE FROM seosubcotx WHERE clsname = is_key-clsname. "#EC CI_SUBRC
+    INSERT seosubcotx FROM TABLE lt_descriptions.         "#EC CI_SUBRC
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OO_FACTORY                  ', 'CLASS zcl_abapgit_oo_factory DEFINITION PUBLIC.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      make
+        IMPORTING
+          iv_object_type                   TYPE tadir-object
+        RETURNING
+          VALUE(ri_object_oriented_object) TYPE REF TO zif_abapgit_oo_object_fnc.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_object_oriented_object TYPE REF TO zif_abapgit_oo_object_fnc .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_oo_factory IMPLEMENTATION.
+ 
+ 
+  METHOD make.
+    IF gi_object_oriented_object IS BOUND.
+      ri_object_oriented_object = gi_object_oriented_object.
+      RETURN.
+    ENDIF.
+    IF iv_object_type = ''CLAS''.
+      CREATE OBJECT ri_object_oriented_object TYPE zcl_abapgit_oo_class.
+    ELSEIF iv_object_type = ''INTF''.
+      CREATE OBJECT ri_object_oriented_object TYPE zcl_abapgit_oo_interface.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OO_INTERFACE                ', 'CLASS zcl_abapgit_oo_interface DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_oo_base
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS zif_abapgit_oo_object_fnc~create
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~delete
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~get_includes
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~get_interface_properties
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~deserialize_source
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~exists
+        REDEFINITION .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS update_report
+      IMPORTING
+        !iv_program       TYPE syrepid
+        !it_source        TYPE string_table
+        !iv_package       TYPE devclass
+      RETURNING
+        VALUE(rv_updated) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS update_meta
+      IMPORTING
+        !iv_name   TYPE seoclsname
+        !it_source TYPE rswsourcet
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS init_scanner
+      IMPORTING
+        !it_source        TYPE zif_abapgit_definitions=>ty_string_tt
+        !iv_name          TYPE seoclsname
+      RETURNING
+        VALUE(ro_scanner) TYPE REF TO cl_oo_source_scanner_interface
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_oo_interface IMPLEMENTATION.
+ 
+ 
+  METHOD init_scanner.
+ 
+    DATA: lx_exc       TYPE REF TO cx_root,
+          lv_message   TYPE string,
+          lv_classname TYPE abap_abstypename.
+ 
+    FIELD-SYMBOLS: <lv_line> TYPE i.
+ 
+    TRY.
+        ro_scanner = cl_oo_source_scanner_interface=>create_interface_scanner(
+          clif_name = iv_name
+          source    = it_source ).
+        ro_scanner->scan( ).
+      CATCH cx_clif_scan_error.
+        zcx_abapgit_exception=>raise( ''error initializing INTF scanner'' ).
+      CATCH cx_root INTO lx_exc.
+        lv_classname = cl_abap_classdescr=>get_class_name( lx_exc ).
+        IF lv_classname = ''\\CLASS=CX_OO_CLIF_SCAN_ERROR_DETAIL''.
+          ASSIGN lx_exc->(''SOURCE_POSITION-LINE'') TO <lv_line>.
+          ASSERT sy-subrc = 0.
+          lv_message = |{ lx_exc->get_text( ) }, line { <lv_line> }|.
+        ELSE.
+          lv_message = lx_exc->get_text( ).
+        ENDIF.
+        zcx_abapgit_exception=>raise( lv_message ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_meta.
+ 
+    DATA: lo_update     TYPE REF TO cl_oo_interface_section_source,
+          lx_error      TYPE REF TO cx_oo_source_save_failure,
+          ls_clskey     TYPE seoclskey,
+          lv_scan_error TYPE abap_bool.
+ 
+ 
+    ls_clskey-clsname = iv_name.
+ 
+    TRY.
+        CALL FUNCTION ''SEO_BUFFER_REFRESH''
+          EXPORTING
+            cifkey  = ls_clskey
+            version = seoc_version_active.
+        CREATE OBJECT lo_update TYPE (''CL_OO_INTERFACE_SECTION_SOURCE'')
+          EXPORTING
+            intkey                        = ls_clskey
+            state                         = ''A''
+            source                        = it_source
+          EXCEPTIONS
+            interface_not_existing        = 1
+            read_source_error             = 2
+            OTHERS                        = 3 ##SUBRC_OK.
+      CATCH cx_sy_dyn_call_param_not_found.
+* downport to 702, see https://github.com/abapGit/abapGit/issues/933
+* this will READ REPORT instead of using it_source, which should be okay
+        CREATE OBJECT lo_update TYPE cl_oo_interface_section_source
+          EXPORTING
+            intkey                 = ls_clskey
+            state                  = ''A''
+          EXCEPTIONS
+            interface_not_existing = 1
+            read_source_error      = 2
+            OTHERS                 = 3.
+    ENDTRY.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    lo_update->set_dark_mode( abap_true ).
+ 
+    lo_update->scan_section_source(
+      RECEIVING
+        scan_error             = lv_scan_error
+      EXCEPTIONS
+        scan_abap_source_error = 1
+        OTHERS                 = 2 ).
+    IF sy-subrc <> 0 OR lv_scan_error = abap_true.
+      zcx_abapgit_exception=>raise( |INTF, error while scanning source. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+* this will update the SEO* database tables
+    TRY.
+        lo_update->revert_scan_result( ).
+      CATCH cx_oo_source_save_failure INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_report.
+    rv_updated = zcl_abapgit_factory=>get_sap_report( )->update_report(
+      iv_name    = iv_program
+      iv_package = iv_package
+      it_source  = it_source ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~create.
+ 
+    DATA:
+      lt_vseoattrib    TYPE seoo_attributes_r,
+      ls_interface_key TYPE seoclskey,
+      ls_properties    TYPE vseointerf.
+ 
+    FIELD-SYMBOLS: <lv_clsname> TYPE seoclsname.
+ 
+    ASSIGN COMPONENT ''CLSNAME'' OF STRUCTURE cg_properties TO <lv_clsname>.
+    ASSERT sy-subrc = 0.
+ 
+    " Get existing interface properties and check if the interface
+    " needs to be created/updated (or is the same)
+    IF iv_check = abap_true.
+      ls_interface_key-clsname = <lv_clsname>.
+      ls_properties = zif_abapgit_oo_object_fnc~get_interface_properties( ls_interface_key ).
+ 
+      IF ls_properties = cg_properties.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    lt_vseoattrib = convert_attrib_to_vseoattrib(
+                      iv_clsname    = <lv_clsname>
+                      it_attributes = it_attributes ).
+ 
+    " Hardcode STATE (#2612)
+    ls_properties = cg_properties.
+    ls_properties-state = seoc_state_implemented.
+ 
+    TRY.
+        CALL FUNCTION ''SEO_INTERFACE_CREATE_COMPLETE''
+          EXPORTING
+            devclass        = iv_package
+            overwrite       = abap_true
+            version         = seoc_version_active
+            suppress_dialog = abap_true " Parameter missing in 702
+          CHANGING
+            interface       = ls_properties
+            attributes      = lt_vseoattrib
+          EXCEPTIONS
+            existing        = 1
+            is_class        = 2
+            db_error        = 3
+            component_error = 4
+            no_access       = 5
+            other           = 6
+            OTHERS          = 7.
+      CATCH cx_sy_dyn_call_param_not_found.
+        CALL FUNCTION ''SEO_INTERFACE_CREATE_COMPLETE''
+          EXPORTING
+            devclass        = iv_package
+            overwrite       = abap_true
+            version         = seoc_version_active
+          CHANGING
+            interface       = ls_properties
+            attributes      = lt_vseoattrib
+          EXCEPTIONS
+            existing        = 1
+            is_class        = 2
+            db_error        = 3
+            component_error = 4
+            no_access       = 5
+            other           = 6
+            OTHERS          = 7.
+    ENDTRY.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~delete.
+    CALL FUNCTION ''SEO_INTERFACE_DELETE_COMPLETE''
+      EXPORTING
+        intkey       = is_deletion_key
+      EXCEPTIONS
+        not_existing = 1
+        is_class     = 2
+        db_error     = 3
+        no_access    = 4
+        other        = 5
+        OTHERS       = 6.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~deserialize_source.
+ 
+    DATA: lv_updated TYPE abap_bool,
+          lv_program TYPE program,
+          lo_scanner TYPE REF TO cl_oo_source_scanner_interface,
+          lt_public  TYPE seop_source_string.
+ 
+    "Buffer needs to be refreshed,
+    "otherwise standard SAP CLIF_SOURCE reorder methods alphabetically
+    CALL FUNCTION ''SEO_BUFFER_INIT''.
+    CALL FUNCTION ''SEO_BUFFER_REFRESH''
+      EXPORTING
+        cifkey  = is_key
+        version = seoc_version_inactive.
+ 
+    lo_scanner = init_scanner(
+      it_source = it_source
+      iv_name   = is_key-clsname ).
+ 
+    lt_public = lo_scanner->get_interface_section_source( ).
+    IF lt_public IS NOT INITIAL.
+      lv_program = cl_oo_classname_service=>get_intfsec_name( is_key-clsname ).
+      lv_updated = update_report( iv_program = lv_program
+                                  iv_package = iv_package
+                                  it_source  = lt_public ).
+      IF lv_updated = abap_true.
+        update_meta( iv_name   = is_key-clsname
+                     it_source = lt_public ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~exists.
+    CALL FUNCTION ''SEO_INTERFACE_EXISTENCE_CHECK''
+      EXPORTING
+        intkey        = is_object_name
+      EXCEPTIONS
+        not_specified = 1
+        not_existing  = 2
+        is_class      = 3
+        no_text       = 4
+        inconsistent  = 5
+        OTHERS        = 6.
+    rv_exists = boolc( sy-subrc = 0 OR sy-subrc = 4 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_includes.
+    DATA lv_interface_name TYPE seoclsname.
+    lv_interface_name = iv_object_name.
+    APPEND cl_oo_classname_service=>get_interfacepool_name( lv_interface_name ) TO rt_includes.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_interface_properties.
+    CALL FUNCTION ''SEO_CLIF_GET''
+      EXPORTING
+        cifkey       = is_interface_key
+        version      = seoc_version_active
+      IMPORTING
+        interface    = rs_interface_properties
+      EXCEPTIONS
+        not_existing = 1
+        deleted      = 2
+        model_only   = 3
+        OTHERS       = 4.
+    IF sy-subrc = 1.
+      RETURN. " in case only inactive version exists
+    ELSEIF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    CLEAR:
+      " TODO 2023-08-01: Clear rs_interface_properties-state (#2612)
+      rs_interface_properties-uuid,
+      rs_interface_properties-author,
+      rs_interface_properties-createdon,
+      rs_interface_properties-changedby,
+      rs_interface_properties-changedon,
+      rs_interface_properties-chgdanyby,
+      rs_interface_properties-chgdanyon,
+      rs_interface_properties-r3release,
+      rs_interface_properties-version.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_OO_OBJECT_FNC               ', 'INTERFACE zif_abapgit_oo_object_fnc PUBLIC.
+ 
+  CONSTANTS:
+    BEGIN OF c_parts,
+      locals_def  TYPE string VALUE ''locals_def'',
+      locals_imp  TYPE string VALUE ''locals_imp'',
+      macros      TYPE string VALUE ''macros'',
+      testclasses TYPE string VALUE ''testclasses'',
+    END OF c_parts.
+ 
+  TYPES: BEGIN OF ty_includes,
+           programm TYPE syrepid,
+         END OF ty_includes,
+         ty_includes_tt TYPE STANDARD TABLE OF ty_includes WITH DEFAULT KEY.
+ 
+  TYPES:
+    ty_seocompotx_tt TYPE STANDARD TABLE OF seocompotx WITH DEFAULT KEY .
+  TYPES:
+    ty_seosubcotx_tt TYPE STANDARD TABLE OF seosubcotx WITH DEFAULT KEY .
+ 
+  METHODS:
+    create
+      IMPORTING
+        iv_check      TYPE abap_bool
+        iv_package    TYPE devclass
+        it_attributes TYPE zif_abapgit_definitions=>ty_obj_attribute_tt OPTIONAL
+      CHANGING
+        cg_properties TYPE any
+      RAISING
+        zcx_abapgit_exception,
+    generate_locals
+      IMPORTING
+        is_key                   TYPE seoclskey
+        it_local_definitions     TYPE seop_source_string OPTIONAL
+        it_local_implementations TYPE seop_source_string OPTIONAL
+        it_local_macros          TYPE seop_source_string OPTIONAL
+        it_local_test_classes    TYPE seop_source_string OPTIONAL
+        iv_package               TYPE devclass
+      RAISING
+        zcx_abapgit_exception,
+    deserialize_source
+      IMPORTING
+        is_key     TYPE seoclskey
+        it_source  TYPE zif_abapgit_definitions=>ty_string_tt
+        iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception
+        cx_sy_dyn_call_error,
+    insert_text_pool
+      IMPORTING
+        iv_class_name TYPE seoclsname
+        it_text_pool  TYPE textpool_table
+        iv_language   TYPE spras
+        iv_state      TYPE c DEFAULT ''I''
+      RAISING
+        zcx_abapgit_exception,
+    update_descriptions
+      IMPORTING
+        is_key          TYPE seoclskey
+        it_descriptions TYPE ty_seocompotx_tt,
+    update_descriptions_sub
+      IMPORTING
+        is_key          TYPE seoclskey
+        it_descriptions TYPE ty_seosubcotx_tt,
+    add_to_activation_list
+      IMPORTING
+        is_item TYPE zif_abapgit_definitions=>ty_item
+      RAISING
+        zcx_abapgit_exception,
+    create_sotr
+      IMPORTING
+        iv_object_name TYPE sobj_name
+        iv_package     TYPE devclass
+        ii_xml         TYPE REF TO zif_abapgit_xml_input
+      RAISING
+        zcx_abapgit_exception,
+    create_documentation
+      IMPORTING
+        it_lines         TYPE tlinetab
+        iv_id            TYPE dokhl-id
+        iv_object_name   TYPE dokhl-object
+        iv_language      TYPE spras
+        iv_no_masterlang TYPE abap_bool OPTIONAL
+      RAISING
+        zcx_abapgit_exception,
+    delete_documentation
+      IMPORTING
+        iv_id          TYPE dokhl-id
+        iv_object_name TYPE dokhl-object
+        iv_language    TYPE spras
+      RAISING
+        zcx_abapgit_exception,
+    get_includes
+      IMPORTING
+        iv_object_name     TYPE sobj_name
+      RETURNING
+        VALUE(rt_includes) TYPE ty_includes_tt
+      RAISING
+        zcx_abapgit_exception,
+    exists
+      IMPORTING
+        is_object_name   TYPE seoclskey
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool,
+    serialize_abap
+      IMPORTING
+        is_class_key     TYPE seoclskey
+        iv_type          TYPE seop_include_ext_app OPTIONAL
+      RETURNING
+        VALUE(rt_source) TYPE zif_abapgit_definitions=>ty_string_tt
+      RAISING
+        zcx_abapgit_exception
+        cx_sy_dyn_call_error,
+    get_skip_test_classes
+      RETURNING
+        VALUE(rv_skip) TYPE abap_bool,
+    get_class_properties
+      IMPORTING
+        is_class_key               TYPE seoclskey
+      RETURNING
+        VALUE(rs_class_properties) TYPE vseoclass
+      RAISING
+        zcx_abapgit_exception,
+    get_interface_properties
+      IMPORTING
+        is_interface_key               TYPE seoclskey
+      RETURNING
+        VALUE(rs_interface_properties) TYPE vseointerf
+      RAISING
+        zcx_abapgit_exception,
+    read_text_pool
+      IMPORTING
+        iv_class_name       TYPE seoclsname
+        iv_language         TYPE spras
+      RETURNING
+        VALUE(rt_text_pool) TYPE textpool_table,
+    read_documentation
+      IMPORTING
+        iv_id           TYPE dokhl-id
+        iv_object_name  TYPE dokhl-object
+        iv_language     TYPE spras
+      RETURNING
+        VALUE(rt_lines) TYPE tlinetab,
+    read_sotr
+      IMPORTING
+        iv_object_name TYPE sobj_name
+        ii_xml         TYPE REF TO zif_abapgit_xml_output
+        io_i18n_params TYPE REF TO zcl_abapgit_i18n_params
+      RAISING
+        zcx_abapgit_exception,
+    read_descriptions
+      IMPORTING
+        iv_object_name         TYPE seoclsname
+        iv_language            TYPE spras OPTIONAL
+      RETURNING
+        VALUE(rt_descriptions) TYPE ty_seocompotx_tt,
+    read_descriptions_sub
+      IMPORTING
+        iv_object_name         TYPE seoclsname
+        iv_language            TYPE spras OPTIONAL
+      RETURNING
+        VALUE(rt_descriptions) TYPE ty_seosubcotx_tt,
+    delete
+      IMPORTING
+        is_deletion_key TYPE seoclskey
+      RAISING
+        zcx_abapgit_exception,
+    read_superclass
+      IMPORTING
+        iv_classname         TYPE seoclsname
+      RETURNING
+        VALUE(rv_superclass) TYPE seoclsname,
+    read_attributes
+      IMPORTING
+        iv_object_name       TYPE seoclsname
+      RETURNING
+        VALUE(rt_attributes) TYPE zif_abapgit_definitions=>ty_obj_attribute_tt.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_FIELD_RULES                 ', 'CLASS zcl_abapgit_field_rules DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_field_rules.
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ro_result) TYPE REF TO zif_abapgit_field_rules.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_item,
+        tabname   TYPE tabname,
+        fieldname TYPE fieldname,
+        fill_rule TYPE zif_abapgit_field_rules=>ty_fill_rule,
+      END OF ty_item,
+      ty_items TYPE SORTED TABLE OF ty_item WITH UNIQUE KEY tabname fieldname.
+ 
+    DATA mt_item TYPE ty_items.
+ 
+    METHODS fill_value
+      IMPORTING
+        iv_rule    TYPE zif_abapgit_field_rules=>ty_fill_rule
+        iv_package TYPE devclass
+      CHANGING
+        cv_value   TYPE any.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_FIELD_RULES IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_result TYPE zcl_abapgit_field_rules.
+  ENDMETHOD.
+ 
+ 
+  METHOD fill_value.
+    CASE iv_rule.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-date.
+        cv_value = sy-datum.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-time.
+        cv_value = sy-uzeit.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-timestamp.
+        GET TIME STAMP FIELD cv_value.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-user.
+        cv_value = sy-uname.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-client.
+        cv_value = sy-mandt.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-package.
+        cv_value = iv_package.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_field_rules~add.
+    DATA ls_item TYPE ty_item.
+ 
+    ls_item-tabname   = iv_table.
+    ls_item-fieldname = iv_field.
+    ls_item-fill_rule = iv_fill_rule.
+    INSERT ls_item INTO TABLE mt_item.
+ 
+    ro_self = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_field_rules~apply_clear_logic.
+    DATA ls_item TYPE ty_item.
+ 
+    FIELD-SYMBOLS <ls_data> TYPE any.
+    FIELD-SYMBOLS <lv_value> TYPE any.
+ 
+    IF mt_item IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT ct_data ASSIGNING <ls_data>.
+      LOOP AT mt_item INTO ls_item WHERE tabname = iv_table.
+        ASSIGN COMPONENT ls_item-fieldname OF STRUCTURE <ls_data> TO <lv_value>.
+        IF sy-subrc = 0.
+          CLEAR <lv_value>.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_field_rules~apply_fill_logic.
+    DATA ls_item TYPE ty_item.
+ 
+    FIELD-SYMBOLS <ls_data> TYPE any.
+    FIELD-SYMBOLS <lv_value> TYPE any.
+ 
+    IF mt_item IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT ct_data ASSIGNING <ls_data>.
+      LOOP AT mt_item INTO ls_item WHERE tabname = iv_table.
+        ASSIGN COMPONENT ls_item-fieldname OF STRUCTURE <ls_data> TO <lv_value>.
+        IF sy-subrc = 0.
+          fill_value(
+            EXPORTING
+              iv_rule    = ls_item-fill_rule
+              iv_package = iv_package
+            CHANGING
+              cv_value   = <lv_value> ).
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_FIELD_RULES                 ', 'INTERFACE zif_abapgit_field_rules
+  PUBLIC .
+  TYPES ty_fill_rule TYPE c LENGTH 2.
+  CONSTANTS:
+    BEGIN OF c_fill_rule,
+      date      TYPE ty_fill_rule VALUE ''DT'',
+      time      TYPE ty_fill_rule VALUE ''TM'',
+      timestamp TYPE ty_fill_rule VALUE ''TS'',
+      user      TYPE ty_fill_rule VALUE ''UR'',
+      client    TYPE ty_fill_rule VALUE ''CT'',
+      package   TYPE ty_fill_rule VALUE ''PK'',
+    END OF c_fill_rule.
+ 
+  METHODS add
+    IMPORTING
+      iv_table       TYPE tabname
+      iv_field       TYPE fieldname
+      iv_fill_rule   TYPE ty_fill_rule
+    RETURNING
+      VALUE(ro_self) TYPE REF TO zif_abapgit_field_rules.
+  METHODS apply_clear_logic
+    IMPORTING
+      iv_table TYPE tabname
+    CHANGING
+      ct_data  TYPE STANDARD TABLE.
+  METHODS apply_fill_logic
+    IMPORTING
+      iv_table   TYPE tabname
+      iv_package TYPE devclass
+    CHANGING
+      ct_data    TYPE STANDARD TABLE.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SAP_NAMESPACE               ', 'CLASS zcl_abapgit_sap_namespace DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_sap_namespace.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_SAP_NAMESPACE IMPLEMENTATION.
+ 
+ 
+  METHOD zif_abapgit_sap_namespace~exists.
+    DATA lv_editflag TYPE trnspace-editflag.
+    SELECT SINGLE editflag FROM trnspace INTO lv_editflag WHERE namespace = iv_namespace.
+    rv_yes = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_namespace~is_editable.
+    DATA lv_editflag TYPE trnspace-editflag.
+    SELECT SINGLE editflag FROM trnspace INTO lv_editflag WHERE namespace = iv_namespace.
+    rv_yes = boolc( sy-subrc = 0 AND lv_editflag = ''X'' ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SAP_PACKAGE                 ', 'CLASS zcl_abapgit_sap_package DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_sap_package .
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_package TYPE devclass .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA: mv_package TYPE devclass.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_sap_package IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mv_package = iv_package.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req.
+ 
+    DATA: li_package TYPE REF TO if_package.
+ 
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = mv_package
+      IMPORTING
+        e_package                  = li_package
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5
+        OTHERS                     = 6 ).
+ 
+    CASE sy-subrc.
+      WHEN 0.
+        rv_are_changes_rec_in_tr_req = li_package->wbo_korr_flag.
+      WHEN 1.
+        " For new packages, derive from package name
+        rv_are_changes_rec_in_tr_req = boolc( mv_package(1) <> ''$'' ).
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise_t100( ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~create.
+ 
+    DATA: lv_err     TYPE string,
+          li_package TYPE REF TO if_package,
+          ls_package LIKE is_package.
+ 
+ 
+    ASSERT NOT is_package-devclass IS INITIAL.
+ 
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = is_package-devclass
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5 ).
+    IF sy-subrc = 0.
+      " Package already exists. We assume this is fine. Its properties might be changed later at
+      " DEVC deserialization.
+      RETURN.
+    ENDIF.
+ 
+    ls_package = is_package.
+ 
+    " Set software component to ''HOME'' if none is set at this point.
+    " Otherwise SOFTWARE_COMPONENT_INVALID will be raised.
+    IF ls_package-dlvunit IS INITIAL.
+      ls_package-dlvunit = ''HOME''.
+    ENDIF.
+ 
+    " For transportable packages, get default transport and layer
+    IF ls_package-devclass(1) <> ''$'' AND ls_package-pdevclass IS INITIAL.
+      ls_package-pdevclass = zif_abapgit_sap_package~get_transport_layer( ).
+    ENDIF.
+ 
+    cl_package_factory=>create_new_package(
+      EXPORTING
+        i_reuse_deleted_object     = abap_true
+*        i_suppress_dialog          = abap_true " does not exist in 730
+      IMPORTING
+        e_package                  = li_package
+      CHANGING
+        c_package_data             = ls_package
+      EXCEPTIONS
+        object_already_existing    = 1
+        object_just_created        = 2
+        not_authorized             = 3
+        wrong_name_prefix          = 4
+        undefined_name             = 5
+        reserved_local_name        = 6
+        invalid_package_name       = 7
+        short_text_missing         = 8
+        software_component_invalid = 9
+        layer_invalid              = 10
+        author_not_existing        = 11
+        component_not_existing     = 12
+        component_missing          = 13
+        prefix_in_use              = 14
+        unexpected_error           = 15
+        intern_err                 = 16
+        no_access                  = 17
+*        invalid_translation_depth  = 18
+*        wrong_mainpack_value       = 19
+*        superpackage_invalid       = 20
+*        error_in_cts_checks        = 21
+        OTHERS                     = 18 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    li_package->save(
+*      EXPORTING
+*        i_suppress_dialog     = abap_true    " Controls whether popups can be transmitted
+      EXCEPTIONS
+        object_invalid        = 1
+        object_not_changeable = 2
+        cancelled_in_corr     = 3
+        permission_failure    = 4
+        unexpected_error      = 5
+        intern_err            = 6
+        OTHERS                = 7 ).
+    IF sy-subrc <> 0.
+ 
+      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_err.
+ 
+      " Here we have to delete the package,
+      " otherwise it would remain in the memory
+      " and cannot created again in this session.
+      li_package->delete(
+        EXCEPTIONS
+          object_not_empty      = 1
+          object_not_changeable = 2
+          object_invalid        = 3
+          intern_err            = 4
+          OTHERS                = 5 ).
+ 
+      zcx_abapgit_exception=>raise( lv_err ).
+ 
+    ENDIF.
+ 
+    li_package->set_changeable( abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~create_child.
+ 
+    DATA: li_parent TYPE REF TO if_package,
+          ls_child  TYPE scompkdtln.
+ 
+ 
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = mv_package
+      IMPORTING
+        e_package                  = li_parent
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    ls_child-devclass  = iv_child.
+    ls_child-dlvunit   = li_parent->software_component.
+    ls_child-component = li_parent->application_component.
+    ls_child-ctext     = iv_child.
+    ls_child-parentcl  = mv_package.
+    ls_child-pdevclass = li_parent->transport_layer.
+    ls_child-as4user   = sy-uname.
+ 
+    zif_abapgit_sap_package~create( ls_child ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~create_local.
+ 
+    DATA: ls_package TYPE scompkdtln.
+ 
+ 
+    ls_package-devclass  = mv_package.
+    ls_package-ctext     = mv_package.
+    ls_package-parentcl  = ''$TMP''.
+    ls_package-dlvunit   = ''LOCAL''.
+    ls_package-as4user   = sy-uname.
+ 
+    zif_abapgit_sap_package~create( ls_package ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~exists.
+ 
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = mv_package
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5 ).
+    rv_bool = boolc( sy-subrc <> 1 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer.
+ 
+    " Get default transport layer
+    CALL FUNCTION ''TR_GET_TRANSPORT_TARGET''
+      EXPORTING
+        iv_use_default             = abap_true
+        iv_get_layer_only          = abap_true
+      IMPORTING
+        ev_layer                   = rv_transport_layer
+      EXCEPTIONS
+        wrong_call                 = 1
+        invalid_input              = 2
+        cts_initialization_failure = 3
+        OTHERS                     = 4.
+    IF sy-subrc <> 0.
+      " Return empty layer (i.e. "local workbench request" for the package)
+      CLEAR rv_transport_layer.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type.
+ 
+    DATA:
+      lv_pkg_name TYPE e071-obj_name,
+      lv_obj_name TYPE tadir-obj_name,
+      lv_role     TYPE trnrole.
+ 
+    lv_pkg_name = mv_package.
+    lv_obj_name = mv_package.
+ 
+    CALL FUNCTION ''TR_GET_REQUEST_TYPE''
+      EXPORTING
+        iv_pgmid          = ''R3TR''
+        iv_object         = ''DEVC''
+        iv_obj_name       = lv_pkg_name
+      IMPORTING
+        ev_request_type   = rs_transport_type-request
+        ev_task_type      = rs_transport_type-task
+      EXCEPTIONS
+        no_request_needed = 1
+        invalid_object    = 2
+        system_error      = 3
+        OTHERS            = 4.
+ 
+    CASE sy-subrc.
+      WHEN 0 OR 1.
+        RETURN.
+      WHEN 2.
+        " For new packages, set to workbench request
+        rs_transport_type-request = ''K''.
+ 
+        CALL FUNCTION ''TR_GET_NAMESPACE_AND_ROLE''
+          EXPORTING
+            iv_pgmid                   = ''R3TR''
+            iv_object                  = ''DEVC''
+            iv_objname                 = lv_obj_name
+          IMPORTING
+            ev_role                    = lv_role
+          EXCEPTIONS
+            namespace_not_existing     = 1
+            invalid_object             = 2
+            namespace_not_determinable = 3
+            OTHERS                     = 4.
+        IF sy-subrc = 0 AND lv_role = ''C''.
+          " Namespace with repair license requires repair task
+          rs_transport_type-task = ''R''.
+        ELSE.
+          " Otherweise use correction task
+          rs_transport_type-task = ''S''.
+        ENDIF.
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise_t100( ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~list_subpackages.
+ 
+    DATA: lt_list     LIKE rt_list.
+ 
+    SELECT devclass FROM tdevc
+      INTO TABLE lt_list
+      WHERE parentcl = mv_package
+      ORDER BY PRIMARY KEY.               "#EC CI_SUBRC "#EC CI_GENBUFF
+ 
+    rt_list = lt_list.
+    WHILE lines( lt_list ) > 0.
+ 
+      SELECT devclass FROM tdevc
+        INTO TABLE lt_list
+        FOR ALL ENTRIES IN lt_list
+        WHERE parentcl = lt_list-table_line
+        ORDER BY PRIMARY KEY.             "#EC CI_SUBRC "#EC CI_GENBUFF
+      APPEND LINES OF lt_list TO rt_list.
+ 
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages.
+ 
+    DATA: lt_list   LIKE rt_list,
+          lv_parent TYPE tdevc-parentcl.
+ 
+ 
+    APPEND mv_package TO rt_list.
+ 
+    lv_parent = zif_abapgit_sap_package~read_parent( ).
+ 
+    IF sy-subrc = 0 AND NOT lv_parent IS INITIAL.
+      lt_list = zcl_abapgit_factory=>get_sap_package( lv_parent )->list_superpackages( ).
+      APPEND LINES OF lt_list TO rt_list.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+ 
+    SELECT SINGLE ctext FROM tdevct INTO rv_description
+      WHERE devclass = mv_package AND spras = sy-langu ##SUBRC_OK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~read_parent.
+ 
+    SELECT SINGLE parentcl FROM tdevc INTO rv_parentcl
+      WHERE devclass = mv_package.                      "#EC CI_GENBUFF
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Inconsistent package structure! Cannot find parent for { mv_package }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    SELECT SINGLE as4user FROM tdevc
+      INTO rv_responsible
+      WHERE devclass = mv_package ##SUBRC_OK.           "#EC CI_GENBUFF
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+ 
+    IF mv_package IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Package name must not be empty'' ).
+    ENDIF.
+ 
+    IF mv_package = ''$TMP''.
+      zcx_abapgit_exception=>raise( ''It is not possible to use $TMP, use a different (local) package'' ).
+    ENDIF.
+ 
+    " Check if package name is allowed
+    cl_package_helper=>check_package_name(
+      EXPORTING
+        i_package_name       = mv_package
+      EXCEPTIONS
+        undefined_name       = 1
+        wrong_name_prefix    = 2
+        reserved_local_name  = 3
+        invalid_package_name = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Package name { mv_package } is not valid| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SAP_REPORT                  ', 'CLASS zcl_abapgit_sap_report DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_sap_report.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS get_language_version
+      IMPORTING
+        iv_package        TYPE devclass
+        iv_version        TYPE zif_abapgit_sap_report=>ty_abap_language_version
+      RETURNING
+        VALUE(rv_version) TYPE zif_abapgit_sap_report=>ty_abap_language_version.
+ 
+    METHODS authorization_check
+      IMPORTING
+        iv_mode    TYPE csequence
+        is_item    TYPE zif_abapgit_definitions=>ty_item
+        iv_version TYPE zif_abapgit_sap_report=>ty_abap_language_version OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_sap_report IMPLEMENTATION.
+ 
+ 
+  METHOD authorization_check.
+ 
+    IF is_item IS NOT INITIAL.
+      " TODO: Check for ABAP Language Version (ABAP_LANGU_VERSION_UPON_INSERT = iv_version)
+      CALL FUNCTION ''RS_ACCESS_PERMISSION''
+        EXPORTING
+          mode                     = iv_mode
+          object                   = is_item-obj_name
+          object_class             = is_item-obj_type
+          suppress_corr_check      = abap_true
+          suppress_language_check  = abap_true
+          suppress_extend_dialog   = abap_true
+        EXCEPTIONS
+          canceled_in_corr         = 1
+          enqueued_by_user         = 2
+          enqueue_system_failure   = 3
+          illegal_parameter_values = 4
+          locked_by_author         = 5
+          no_modify_permission     = 6
+          no_show_permission       = 7
+          permission_failure       = 8
+          request_language_denied  = 9
+          OTHERS                   = 10.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_language_version.
+ 
+    ASSERT iv_version CA '' X25''.
+ 
+    " TODO: Determine ABAP Language Version
+    " https://github.com/abapGit/abapGit/issues/6154#issuecomment-1503566920)
+ 
+    " For now, use default for ABAP source code
+    IF zcl_abapgit_factory=>get_environment( )->is_sap_cloud_platform( ) = abap_true.
+      rv_version = ''5''. " abap_for_cloud_development
+    ELSE.
+      rv_version = ''X''. " standard_abap
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_report~delete_report.
+ 
+    authorization_check(
+      iv_mode = ''DELETE''
+      is_item = is_item ).
+ 
+    DELETE REPORT iv_name.
+ 
+    IF sy-subrc <> 0 AND iv_raise_error = abap_true.
+      zcx_abapgit_exception=>raise( |Error deleting report { iv_name }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_report~insert_report.
+ 
+    DATA lv_version TYPE zif_abapgit_sap_report=>ty_abap_language_version ##NEEDED.
+    DATA lv_obj_name TYPE e071-obj_name.
+ 
+    ASSERT iv_state CA '' AI''.
+    ASSERT iv_program_type CA '' 1FIJKMST''.
+ 
+    lv_version = get_language_version(
+      iv_package = iv_package
+      iv_version = iv_version ).
+ 
+    authorization_check(
+      iv_mode    = ''MODIFY''
+      is_item    = is_item
+      iv_version = lv_version ).
+ 
+    " TODO: Add \`VERSION lv_version\` but it''s not supported in lower releases
+    IF iv_state IS INITIAL.
+      INSERT REPORT iv_name FROM it_source.
+        "VERSION lv_version.
+    ELSEIF iv_program_type IS INITIAL AND iv_extension_type IS INITIAL.
+      INSERT REPORT iv_name FROM it_source
+        STATE   iv_state.
+        "VERSION lv_version.
+    ELSEIF iv_extension_type IS INITIAL.
+      INSERT REPORT iv_name FROM it_source
+        STATE        iv_state
+        PROGRAM TYPE iv_program_type.
+        "VERSION      lv_version.
+    ELSE.
+      INSERT REPORT iv_name FROM it_source
+        STATE          iv_state
+        EXTENSION TYPE iv_extension_type
+        PROGRAM TYPE   iv_program_type.
+        "VERSION        lv_version.
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error inserting report { iv_name }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_report~read_report.
+ 
+    ASSERT iv_state CA '' AI''.
+ 
+    authorization_check(
+      iv_mode = ''SHOW''
+      is_item = is_item ).
+ 
+    IF iv_state IS INITIAL.
+      READ REPORT iv_name INTO rt_source.
+    ELSE.
+      READ REPORT iv_name INTO rt_source STATE iv_state.
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error reading report { iv_name }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_report~update_report.
+ 
+    DATA lt_new TYPE string_table.
+    DATA lt_old TYPE string_table.
+ 
+    lt_new = it_source.
+    lt_old = zif_abapgit_sap_report~read_report( iv_name ).
+ 
+    IF lt_old <> lt_new.
+      zif_abapgit_sap_report~insert_report(
+        iv_name            = iv_name
+        it_source          = it_source
+        iv_state           = iv_state
+        iv_program_type    = iv_program_type
+        iv_extension_type  = iv_extension_type
+        iv_package         = iv_package
+        iv_version         = iv_version
+        is_item            = is_item ).
+ 
+      rv_updated = abap_true.
+    ELSE.
+      rv_updated = abap_false.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_SAP_NAMESPACE               ', 'INTERFACE zif_abapgit_sap_namespace
+  PUBLIC .
+ 
+  METHODS exists
+    IMPORTING
+      iv_namespace TYPE trnspace-namespace
+    RETURNING
+      VALUE(rv_yes) TYPE abap_bool.
+ 
+  METHODS is_editable
+    IMPORTING
+      iv_namespace TYPE trnspace-namespace
+    RETURNING
+      VALUE(rv_yes) TYPE abap_bool.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_SAP_PACKAGE                 ', 'INTERFACE zif_abapgit_sap_package
+  PUBLIC .
+ 
+ 
+  TYPES:
+    ty_devclass_tt TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY .
+ 
+  METHODS validate_name
+    RAISING
+      zcx_abapgit_exception .
+  METHODS create
+    IMPORTING
+      !is_package TYPE scompkdtln
+    RAISING
+      zcx_abapgit_exception .
+  METHODS create_local
+    RAISING
+      zcx_abapgit_exception .
+  METHODS list_subpackages
+    RETURNING
+      VALUE(rt_list) TYPE ty_devclass_tt .
+  METHODS list_superpackages
+    RETURNING
+      VALUE(rt_list) TYPE ty_devclass_tt
+    RAISING
+      zcx_abapgit_exception .
+  METHODS read_parent
+    RETURNING
+      VALUE(rv_parentcl) TYPE tdevc-parentcl
+    RAISING
+      zcx_abapgit_exception .
+  METHODS read_description
+    RETURNING
+      VALUE(rv_description) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS read_responsible
+    RETURNING
+      VALUE(rv_responsible) TYPE usnam
+    RAISING
+      zcx_abapgit_exception .
+  METHODS create_child
+    IMPORTING
+      !iv_child TYPE devclass
+    RAISING
+      zcx_abapgit_exception .
+  METHODS exists
+    RETURNING
+      VALUE(rv_bool) TYPE abap_bool .
+  METHODS are_changes_recorded_in_tr_req
+    RETURNING
+      VALUE(rv_are_changes_rec_in_tr_req) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_transport_type
+    RETURNING
+      VALUE(rs_transport_type) TYPE zif_abapgit_definitions=>ty_transport_type
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_transport_layer
+    RETURNING
+      VALUE(rv_transport_layer) TYPE devlayer
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_SAP_REPORT                  ', 'INTERFACE zif_abapgit_sap_report
+  PUBLIC.
+ 
+  TYPES:
+    ty_abap_language_version TYPE c LENGTH 1.
+ 
+  METHODS read_report
+    IMPORTING
+      iv_name          TYPE syrepid
+      iv_state         TYPE r3state OPTIONAL
+      is_item          TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+    RETURNING
+      VALUE(rt_source) TYPE abaptxt255_tab
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS insert_report
+    IMPORTING
+      iv_name           TYPE syrepid
+      it_source         TYPE STANDARD TABLE
+      iv_state          TYPE r3state OPTIONAL
+      iv_program_type   TYPE c OPTIONAL
+      iv_extension_type TYPE c OPTIONAL
+      iv_package        TYPE devclass
+      iv_version        TYPE ty_abap_language_version OPTIONAL
+      is_item           TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS update_report
+    IMPORTING
+      iv_name           TYPE syrepid
+      it_source         TYPE STANDARD TABLE
+      iv_state          TYPE r3state OPTIONAL
+      iv_program_type   TYPE c OPTIONAL
+      iv_extension_type TYPE c OPTIONAL
+      iv_package        TYPE devclass
+      iv_version        TYPE ty_abap_language_version OPTIONAL
+      is_item           TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+    RETURNING
+      VALUE(rv_updated) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS delete_report
+    IMPORTING
+      iv_name        TYPE syrepid
+      iv_raise_error TYPE abap_bool DEFAULT abap_false
+      iv_version     TYPE ty_abap_language_version OPTIONAL
+      is_item        TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_I18N_PARAMS                 ', 'CLASS zcl_abapgit_i18n_params DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    DATA ms_params TYPE zif_abapgit_definitions=>ty_i18n_params READ-ONLY .
+ 
+    CLASS-METHODS new
+      IMPORTING
+        !iv_main_language      TYPE spras DEFAULT zif_abapgit_definitions=>c_english
+        !iv_main_language_only TYPE abap_bool DEFAULT abap_false
+        !it_translation_langs  TYPE zif_abapgit_definitions=>ty_languages OPTIONAL
+        !iv_use_lxe            TYPE abap_bool DEFAULT abap_false
+        !is_params             TYPE zif_abapgit_definitions=>ty_i18n_params OPTIONAL
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_i18n_params .
+    METHODS constructor
+      IMPORTING
+        !iv_main_language      TYPE spras DEFAULT zif_abapgit_definitions=>c_english
+        !iv_main_language_only TYPE abap_bool DEFAULT abap_false
+        !it_translation_langs  TYPE zif_abapgit_definitions=>ty_languages OPTIONAL
+        !iv_use_lxe            TYPE abap_bool DEFAULT abap_false
+        !is_params             TYPE zif_abapgit_definitions=>ty_i18n_params OPTIONAL .
+ 
+    METHODS is_lxe_applicable
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS build_language_filter
+      RETURNING
+        VALUE(rt_language_filter) TYPE zif_abapgit_environment=>ty_system_language_filter .
+    METHODS trim_saplang_list
+      CHANGING
+        ct_sap_langs  TYPE zif_abapgit_definitions=>ty_sap_langu_tab
+      RAISING
+        zcx_abapgit_exception.
+    METHODS trim_saplang_keyed_table
+      IMPORTING
+        iv_lang_field_name  TYPE abap_compname
+        iv_keep_master_lang TYPE abap_bool DEFAULT abap_false  "sy-langu OPTIONAL
+      CHANGING
+        ct_tab              TYPE STANDARD TABLE
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    CLASS-METHODS iso_langs_to_lang_filter
+      IMPORTING
+        it_iso_filter      TYPE zif_abapgit_definitions=>ty_languages
+      RETURNING
+        VALUE(rt_language_filter) TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_I18N_PARAMS IMPLEMENTATION.
+ 
+ 
+  METHOD build_language_filter.
+    IF mt_language_filter IS INITIAL.
+      " translation_languages are includes, system langs are excludes, so the do not interfere
+      IF ms_params-translation_languages IS NOT INITIAL.
+        mt_language_filter = iso_langs_to_lang_filter( ms_params-translation_languages ).
+      ELSE.
+        mt_language_filter = zcl_abapgit_factory=>get_environment( )->get_system_language_filter( ).
+      ENDIF.
+    ENDIF.
+    rt_language_filter = mt_language_filter.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    IF is_params IS NOT INITIAL.
+      ms_params = is_params.
+    ELSE.
+      ms_params-main_language         = iv_main_language.
+      ms_params-main_language_only    = iv_main_language_only.
+      ms_params-translation_languages = it_translation_langs.
+      ms_params-use_lxe               = iv_use_lxe.
+    ENDIF.
+    ASSERT ms_params-main_language IS NOT INITIAL.
+  ENDMETHOD.
+ 
+ 
+  METHOD iso_langs_to_lang_filter.
+ 
+    DATA lv_laiso LIKE LINE OF it_iso_filter.
+    DATA lv_langu TYPE sy-langu.
+    DATA ls_range LIKE LINE OF rt_language_filter.
+ 
+    ls_range-sign = ''I''.
+    ls_range-option = ''EQ''.
+ 
+    LOOP AT it_iso_filter INTO lv_laiso.
+ 
+      cl_i18n_languages=>sap2_to_sap1(
+        EXPORTING
+          im_lang_sap2  = lv_laiso
+        RECEIVING
+          re_lang_sap1  = lv_langu
+        EXCEPTIONS
+          no_assignment = 1
+          OTHERS        = 2 ).
+      IF sy-subrc <> 0.
+        CONTINUE.
+      ENDIF.
+ 
+      ls_range-low = lv_langu.
+      APPEND ls_range TO rt_language_filter.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_lxe_applicable.
+ 
+    rv_yes = boolc( ms_params-main_language_only = abap_false AND
+       ms_params-use_lxe = abap_true AND
+       ms_params-translation_languages IS NOT INITIAL ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_main_language      = iv_main_language
+        iv_main_language_only = iv_main_language_only
+        it_translation_langs  = it_translation_langs
+        iv_use_lxe            = iv_use_lxe
+        is_params             = is_params.
+  ENDMETHOD.
+ 
+ 
+  METHOD trim_saplang_keyed_table.
+ 
+    DATA lv_laiso TYPE laiso.
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_i> TYPE any.
+    FIELD-SYMBOLS <lv_langu> TYPE sy-langu.
+ 
+    IF ms_params-translation_languages IS INITIAL OR iv_lang_field_name IS INITIAL.
+      RETURN. " Nothing to filter
+    ENDIF.
+ 
+    LOOP AT ct_tab ASSIGNING <ls_i>.
+      lv_index = sy-tabix.
+      ASSIGN COMPONENT iv_lang_field_name OF STRUCTURE <ls_i> TO <lv_langu>.
+      ASSERT sy-subrc = 0.
+ 
+      IF iv_keep_master_lang = abap_true AND <lv_langu> = ms_params-main_language.
+        CONTINUE. " Just keep it
+      ENDIF.
+ 
+      cl_i18n_languages=>sap1_to_sap2(
+        EXPORTING
+          im_lang_sap1  = <lv_langu>
+        RECEIVING
+          re_lang_sap2  = lv_laiso
+        EXCEPTIONS
+          no_assignment = 1
+          OTHERS        = 2 ).
+      IF sy-subrc <> 0.
+        DELETE ct_tab INDEX lv_index. " Not in the list anyway ...
+        CONTINUE.
+      ENDIF.
+ 
+      " Not a sorted table, but presumably the list is small, so no significant performance flow
+      READ TABLE ms_params-translation_languages TRANSPORTING NO FIELDS WITH KEY table_line = lv_laiso.
+      IF sy-subrc <> 0.
+        DELETE ct_tab INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD trim_saplang_list.
+ 
+    DATA lv_langu TYPE sy-langu.
+    DATA lv_laiso TYPE laiso.
+    DATA lv_index TYPE i.
+ 
+    IF ms_params-translation_languages IS INITIAL.
+      RETURN. " Nothing to filter
+    ENDIF.
+ 
+    LOOP AT ct_sap_langs INTO lv_langu.
+      lv_index = sy-tabix.
+ 
+      cl_i18n_languages=>sap1_to_sap2(
+        EXPORTING
+          im_lang_sap1  = lv_langu
+        RECEIVING
+          re_lang_sap2  = lv_laiso
+        EXCEPTIONS
+          no_assignment = 1
+          OTHERS        = 2 ).
+      IF sy-subrc <> 0.
+        DELETE ct_sap_langs INDEX lv_index. " Not in the list anyway ...
+        CONTINUE.
+      ENDIF.
+ 
+      " Not a sorted table, but presumably the list is small, so no significant performance flow
+      READ TABLE ms_params-translation_languages TRANSPORTING NO FIELDS WITH KEY table_line = lv_laiso.
+      IF sy-subrc <> 0.
+        DELETE ct_sap_langs INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_LONGTEXTS                   ', 'CLASS zcl_abapgit_longtexts DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_longtexts.
+ 
+  PROTECTED SECTION.
+ 
+    METHODS read
+      IMPORTING
+        !iv_object_name     TYPE clike
+        !iv_longtext_id     TYPE dokil-id
+        !it_dokil           TYPE zif_abapgit_definitions=>ty_dokil_tt
+        !iv_main_lang_only  TYPE abap_bool DEFAULT abap_false
+        !iv_clear_fields    TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rt_longtexts) TYPE zif_abapgit_longtexts=>ty_longtexts
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_docu_state_active TYPE dokstate VALUE ''A'' ##NO_TEXT.
+ 
+    METHODS escape_name
+      IMPORTING
+        !iv_longtext_id  TYPE dokil-id
+        !iv_object_name  TYPE clike
+      RETURNING
+        VALUE(rv_object) TYPE dokil-object.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_LONGTEXTS IMPLEMENTATION.
+ 
+ 
+  METHOD escape_name.
+    " Prepare name for SQL LIKE condition
+    rv_object = iv_object_name.
+ 
+    IF ''CA,CE,CO,CT,IA,IE,IO,WC,FU,FX,DI,IS,PS'' CS iv_longtext_id.
+      " Document types of objects with sub-objects
+      rv_object+30 = ''%''.
+    ELSEIF ''OD'' CS iv_longtext_id.
+      rv_object+10 = ''%''.
+    ENDIF.
+ 
+    rv_object = replace(
+      val  = rv_object
+      sub  = ''_''
+      with = ''#_''
+      occ  = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    DATA: ls_longtext TYPE zif_abapgit_longtexts=>ty_longtext,
+          lv_object   TYPE dokil-object,
+          lt_dokil    TYPE zif_abapgit_definitions=>ty_dokil_tt.
+ 
+    FIELD-SYMBOLS: <ls_dokil> LIKE LINE OF lt_dokil.
+ 
+    lv_object = escape_name(
+      iv_longtext_id = iv_longtext_id
+      iv_object_name = iv_object_name ).
+ 
+    IF lines( it_dokil ) > 0.
+ 
+      lt_dokil = it_dokil.
+ 
+      IF iv_main_lang_only = abap_true.
+        DELETE lt_dokil WHERE masterlang <> abap_true.
+      ENDIF.
+ 
+    ELSEIF iv_longtext_id IS NOT INITIAL.
+      IF iv_main_lang_only = abap_true.
+        SELECT * FROM dokil
+                 INTO TABLE lt_dokil
+                 WHERE id     = iv_longtext_id
+                 AND object LIKE lv_object ESCAPE ''#''
+                 AND masterlang = abap_true
+                 ORDER BY PRIMARY KEY.
+      ELSE.
+        SELECT * FROM dokil
+                 INTO TABLE lt_dokil
+                 WHERE id     = iv_longtext_id
+                 AND object LIKE lv_object ESCAPE ''#''
+                 ORDER BY PRIMARY KEY.
+      ENDIF.
+    ELSE.
+ 
+      zcx_abapgit_exception=>raise( |serialize_longtexts parameter error| ).
+ 
+    ENDIF.
+ 
+    LOOP AT lt_dokil ASSIGNING <ls_dokil>
+                     WHERE txtlines > 0.
+ 
+      CLEAR: ls_longtext.
+ 
+      ls_longtext-dokil = <ls_dokil>.
+ 
+      CALL FUNCTION ''DOCU_READ''
+        EXPORTING
+          id      = <ls_dokil>-id
+          langu   = <ls_dokil>-langu
+          object  = <ls_dokil>-object
+          typ     = <ls_dokil>-typ
+          version = <ls_dokil>-version
+        IMPORTING
+          head    = ls_longtext-head
+        TABLES
+          line    = ls_longtext-lines.
+ 
+      IF iv_clear_fields = abap_true.
+        CLEAR: ls_longtext-head-tdfuser,
+               ls_longtext-head-tdfreles,
+               ls_longtext-head-tdfdate,
+               ls_longtext-head-tdftime,
+               ls_longtext-head-tdluser,
+               ls_longtext-head-tdlreles,
+               ls_longtext-head-tdldate,
+               ls_longtext-head-tdltime.
+      ENDIF.
+ 
+      INSERT ls_longtext INTO TABLE rt_longtexts.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_longtexts~changed_by.
+ 
+    DATA: lt_longtexts TYPE zif_abapgit_longtexts=>ty_longtexts.
+    FIELD-SYMBOLS: <ls_longtext> TYPE zif_abapgit_longtexts=>ty_longtext.
+ 
+    lt_longtexts = read( iv_object_name  = iv_object_name
+                         iv_longtext_id  = iv_longtext_id
+                         it_dokil        = it_dokil
+                         iv_clear_fields = abap_false ).
+ 
+    READ TABLE lt_longtexts INDEX 1 ASSIGNING <ls_longtext>.
+    IF sy-subrc = 0.
+      rv_user = <ls_longtext>-head-tdluser.
+      IF rv_user IS INITIAL.
+        rv_user = <ls_longtext>-head-tdfuser.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_longtexts~delete.
+ 
+    DATA: lt_dokil  TYPE zif_abapgit_definitions=>ty_dokil_tt,
+          lv_object TYPE dokil-object.
+ 
+    FIELD-SYMBOLS: <ls_dokil> TYPE dokil.
+ 
+    lv_object = escape_name(
+      iv_longtext_id = iv_longtext_id
+      iv_object_name = iv_object_name ).
+ 
+    SELECT * FROM dokil
+      INTO TABLE lt_dokil
+      WHERE id     = iv_longtext_id
+      AND   object LIKE lv_object ESCAPE ''#''.
+ 
+    LOOP AT lt_dokil ASSIGNING <ls_dokil>.
+ 
+      CALL FUNCTION ''DOCU_DEL''
+        EXPORTING
+          id       = <ls_dokil>-id
+          langu    = <ls_dokil>-langu
+          object   = <ls_dokil>-object
+          typ      = <ls_dokil>-typ
+        EXCEPTIONS
+          ret_code = 1
+          OTHERS   = 2.
+ 
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_longtexts~deserialize.
+ 
+    DATA: lt_longtexts    TYPE zif_abapgit_longtexts=>ty_longtexts,
+          lv_object       TYPE dokil-object,
+          lt_dokil        TYPE zif_abapgit_definitions=>ty_dokil_tt,
+          lv_no_main_lang TYPE dokil-masterlang.
+ 
+    FIELD-SYMBOLS: <ls_longtext> TYPE zif_abapgit_longtexts=>ty_longtext,
+                   <ls_dokil>    TYPE dokil.
+ 
+    lv_object = escape_name(
+      iv_longtext_id = iv_longtext_id
+      iv_object_name = iv_object_name ).
+ 
+    ii_xml->read(
+      EXPORTING
+        iv_name = iv_longtext_name
+      CHANGING
+        cg_data = lt_longtexts ).
+ 
+    LOOP AT lt_longtexts ASSIGNING <ls_longtext>.
+ 
+      lv_no_main_lang = boolc( iv_main_language <> <ls_longtext>-dokil-langu ).
+ 
+      CALL FUNCTION ''DOCU_UPDATE''
+        EXPORTING
+          head          = <ls_longtext>-head
+          state         = c_docu_state_active
+          typ           = <ls_longtext>-dokil-typ
+          version       = <ls_longtext>-dokil-version
+          no_masterlang = lv_no_main_lang
+        TABLES
+          line          = <ls_longtext>-lines.
+ 
+    ENDLOOP.
+ 
+    " Read existing texts and check if they were deserialized above
+    " If not, delete the texts
+    SELECT * FROM dokil
+      INTO TABLE lt_dokil
+      WHERE id     = iv_longtext_id
+      AND   object LIKE lv_object ESCAPE ''#''.
+ 
+    LOOP AT lt_dokil ASSIGNING <ls_dokil>.
+ 
+      READ TABLE lt_longtexts TRANSPORTING NO FIELDS WITH KEY
+        dokil-id     = <ls_dokil>-id
+        dokil-langu  = <ls_dokil>-langu
+        dokil-object = <ls_dokil>-object
+        dokil-typ    = <ls_dokil>-typ.
+      IF sy-subrc <> 0.
+        CALL FUNCTION ''DOCU_DEL''
+          EXPORTING
+            id       = <ls_dokil>-id
+            langu    = <ls_dokil>-langu
+            object   = <ls_dokil>-object
+            typ      = <ls_dokil>-typ
+          EXCEPTIONS
+            ret_code = 1
+            OTHERS   = 2.
+ 
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_longtexts~serialize.
+ 
+    rt_longtexts = read( iv_object_name    = iv_object_name
+                         iv_longtext_id    = iv_longtext_id
+                         it_dokil          = it_dokil
+                         iv_main_lang_only = io_i18n_params->ms_params-main_language_only ).
+ 
+    IF rt_longtexts IS SUPPLIED.
+      RETURN.
+    ENDIF.
+ 
+    ii_xml->add( iv_name = iv_longtext_name
+                 ig_data = rt_longtexts ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_LXE_TEXTS                   ', 'CLASS zcl_abapgit_lxe_texts DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_lxe_texts .
+ 
+    CLASS-METHODS class_constructor.
+    CLASS-METHODS get_translation_languages
+      IMPORTING
+        !iv_main_language   TYPE spras
+        !it_i18n_languages  TYPE zif_abapgit_definitions=>ty_languages
+      RETURNING
+        VALUE(rt_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS get_installed_languages
+      RETURNING
+        VALUE(rt_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS convert_lang_string_to_table
+      IMPORTING
+        !iv_langs              TYPE string
+        !iv_skip_main_language TYPE spras OPTIONAL
+      RETURNING
+        VALUE(rt_languages)    TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS convert_table_to_lang_string
+      IMPORTING
+        !it_languages   TYPE zif_abapgit_definitions=>ty_languages
+      RETURNING
+        VALUE(rv_langs) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS detect_unsupported_languages
+      IMPORTING
+        !it_languages                   TYPE zif_abapgit_definitions=>ty_languages
+      RETURNING
+        VALUE(rt_unsupported_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_object_supported
+      IMPORTING
+        iv_object_type TYPE tadir-object
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_custmnr TYPE lxecustmnr VALUE ''999999''.
+    " The value for ABAP system translation is always 999999 (from lxecustmnr docs)
+ 
+    TYPES:
+      BEGIN OF ty_lxe_translation,
+        source_lang TYPE lxeisolang,
+        target_lang TYPE lxeisolang,
+        custmnr     TYPE lxecustmnr,
+        objtype     TYPE trobjtype,
+        objname     TYPE lxeobjname,
+        text_pairs  TYPE zif_abapgit_lxe_texts=>ty_text_pairs,
+      END OF ty_lxe_translation.
+    TYPES:
+      ty_lxe_translations TYPE STANDARD TABLE OF ty_lxe_translation WITH DEFAULT KEY .
+ 
+    CLASS-DATA gt_installed_languages_cache TYPE zif_abapgit_definitions=>ty_languages.
+    CLASS-DATA gt_supported_obj_types TYPE STANDARD TABLE OF tadir-object.
+ 
+    DATA mo_i18n_params TYPE REF TO zcl_abapgit_i18n_params.
+    DATA mi_xml_out     TYPE REF TO zif_abapgit_xml_output.
+    DATA mi_xml_in      TYPE REF TO zif_abapgit_xml_input.
+    DATA mo_files       TYPE REF TO zcl_abapgit_objects_files.
+ 
+    METHODS serialize_xml
+      IMPORTING
+        !iv_lxe_text_name TYPE string DEFAULT ''LXE_TEXTS''
+        !iv_object_type   TYPE tadir-object
+        !iv_object_name   TYPE tadir-obj_name
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS serialize_as_po
+      IMPORTING
+        !iv_object_type   TYPE tadir-object
+        !iv_object_name   TYPE tadir-obj_name
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS deserialize_xml
+      IMPORTING
+        !iv_lxe_text_name TYPE string DEFAULT ''LXE_TEXTS''
+        !iv_object_type   TYPE tadir-object OPTIONAL
+        !iv_object_name   TYPE tadir-obj_name OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS deserialize_from_po
+      IMPORTING
+        !iv_object_type   TYPE tadir-object
+        !iv_object_name   TYPE tadir-obj_name
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS get_lang_iso4
+      IMPORTING
+        iv_src         TYPE laiso
+      RETURNING
+        VALUE(rv_iso4) TYPE lxeisolang
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_lxe_object_list
+      IMPORTING
+        iv_object_type     TYPE trobjtype
+        iv_object_name     TYPE sobj_name
+      RETURNING
+        VALUE(rt_obj_list) TYPE lxe_tt_colob .
+    METHODS read_lxe_object_text_pair
+      IMPORTING
+        iv_s_lang                TYPE lxeisolang
+        iv_t_lang                TYPE lxeisolang
+        iv_custmnr               TYPE lxecustmnr
+        iv_objtype               TYPE trobjtype
+        iv_objname               TYPE lxeobjname
+        iv_read_only             TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rt_text_pairs_tmp) TYPE ty_lxe_translation-text_pairs
+      RAISING
+        zcx_abapgit_exception.
+    METHODS write_lxe_object_text_pair
+      IMPORTING
+        iv_s_lang  TYPE lxeisolang
+        iv_t_lang  TYPE lxeisolang
+        iv_custmnr TYPE lxecustmnr
+        iv_objtype TYPE trobjtype
+        iv_objname TYPE lxeobjname
+        it_pcx_s1  TYPE ty_lxe_translation-text_pairs
+      RAISING
+        zcx_abapgit_exception.
+    METHODS read_text_items
+      IMPORTING
+        iv_object_type       TYPE tadir-object
+        iv_object_name       TYPE tadir-obj_name
+      RETURNING
+        VALUE(rt_text_items) TYPE ty_lxe_translations
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS langu_to_laiso_safe
+      IMPORTING
+        iv_langu        TYPE sy-langu
+      RETURNING
+        VALUE(rv_laiso) TYPE laiso
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS iso4_to_iso2
+      IMPORTING
+        iv_lxe_lang     TYPE lxeisolang
+      RETURNING
+        VALUE(rv_laiso) TYPE laiso
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS check_langs_versus_installed
+      IMPORTING
+        it_languages    TYPE zif_abapgit_definitions=>ty_languages
+        it_installed    TYPE zif_abapgit_definitions=>ty_languages
+      EXPORTING
+        et_intersection TYPE zif_abapgit_definitions=>ty_languages
+        et_missfits     TYPE zif_abapgit_definitions=>ty_languages.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_LXE_TEXTS IMPLEMENTATION.
+ 
+ 
+  METHOD check_langs_versus_installed.
+ 
+    DATA lt_installed_hash TYPE HASHED TABLE OF laiso WITH UNIQUE KEY table_line.
+    FIELD-SYMBOLS <lv_lang> LIKE LINE OF it_languages.
+ 
+    CLEAR: et_intersection, et_missfits.
+    lt_installed_hash = it_installed.
+ 
+    LOOP AT it_languages ASSIGNING <lv_lang>.
+      READ TABLE lt_installed_hash WITH KEY table_line = <lv_lang> TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        APPEND <lv_lang> TO et_intersection.
+      ELSE.
+        APPEND <lv_lang> TO et_missfits.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_constructor.
+ 
+    APPEND ''CLAS'' TO gt_supported_obj_types.
+    APPEND ''DOMA'' TO gt_supported_obj_types.
+    APPEND ''DTEL'' TO gt_supported_obj_types.
+    APPEND ''FUGR'' TO gt_supported_obj_types.
+    APPEND ''MSAG'' TO gt_supported_obj_types.
+    APPEND ''PARA'' TO gt_supported_obj_types.
+    APPEND ''PROG'' TO gt_supported_obj_types.
+    APPEND ''SHI3'' TO gt_supported_obj_types.
+    APPEND ''TABL'' TO gt_supported_obj_types.
+    APPEND ''TRAN'' TO gt_supported_obj_types.
+    APPEND ''VIEW'' TO gt_supported_obj_types.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD convert_lang_string_to_table.
+ 
+    DATA:
+      lt_langs_str          TYPE string_table,
+      lv_laiso              TYPE laiso,
+      lv_skip_main_lang_iso TYPE laiso.
+ 
+    FIELD-SYMBOLS:
+      <lv_str>  LIKE LINE OF lt_langs_str.
+ 
+    " Keep * as indicator for ''all installed languages''
+    IF iv_langs = ''*''.
+      APPEND iv_langs TO rt_languages.
+      RETURN.
+    ENDIF.
+ 
+    " Convert string of 2-letter ISO languages into table of sy-langu codes
+    SPLIT iv_langs AT '','' INTO TABLE lt_langs_str.
+ 
+    LOOP AT lt_langs_str ASSIGNING <lv_str>.
+      lv_laiso = condense( to_upper( <lv_str> ) ).
+      APPEND lv_laiso TO rt_languages.
+    ENDLOOP.
+ 
+    IF iv_skip_main_language IS NOT INITIAL.
+      lv_skip_main_lang_iso = langu_to_laiso_safe( iv_skip_main_language ).
+      DELETE rt_languages WHERE table_line = lv_skip_main_lang_iso.
+    ENDIF.
+ 
+    SORT rt_languages.
+    DELETE ADJACENT DUPLICATES FROM rt_languages.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD convert_table_to_lang_string.
+ 
+    DATA:
+      lt_langs_str TYPE string_table.
+ 
+    FIELD-SYMBOLS:
+      <lv_lang> LIKE LINE OF it_languages,
+      <lv_str>  TYPE string.
+ 
+    " Convert table of sy-langu codes into string of 2-letter ISO languages
+    LOOP AT it_languages ASSIGNING <lv_lang>.
+      " Keep * as indicator for ''all installed languages''
+      IF <lv_lang> = ''*''.
+        CLEAR lt_langs_str.
+        APPEND ''*'' TO lt_langs_str.
+        EXIT.
+      ENDIF.
+ 
+      APPEND INITIAL LINE TO lt_langs_str ASSIGNING <lv_str>.
+      <lv_str> = <lv_lang>.
+    ENDLOOP.
+ 
+    CONCATENATE LINES OF lt_langs_str INTO rv_langs SEPARATED BY '',''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_from_po.
+ 
+    DATA lv_lang LIKE LINE OF mo_i18n_params->ms_params-translation_languages.
+    DATA lt_po_files TYPE zif_abapgit_i18n_file=>ty_table_of.
+    DATA li_po LIKE LINE OF lt_po_files.
+    DATA lt_text_pairs_tmp TYPE ty_lxe_translation-text_pairs.
+    DATA lt_obj_list TYPE lxe_tt_colob.
+    DATA lv_main_lang TYPE lxeisolang.
+    DATA lv_target_lang TYPE lxeisolang.
+ 
+    FIELD-SYMBOLS <lv_lxe_object> LIKE LINE OF lt_obj_list.
+ 
+    lt_obj_list = get_lxe_object_list(
+      iv_object_name = iv_object_name
+      iv_object_type = iv_object_type ).
+ 
+    IF lt_obj_list IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lt_po_files  = mo_files->read_i18n_files( ).
+    lv_main_lang = get_lang_iso4( langu_to_laiso_safe( mo_i18n_params->ms_params-main_language ) ).
+ 
+    LOOP AT mo_i18n_params->ms_params-translation_languages INTO lv_lang.
+      lv_target_lang = get_lang_iso4( lv_lang ).
+ 
+      LOOP AT lt_po_files INTO li_po.
+        IF li_po->lang( ) = to_lower( lv_lang ). " Not quite efficient but the list is presumably very short
+          EXIT.
+        ELSE.
+          CLEAR li_po.
+        ENDIF.
+      ENDLOOP.
+ 
+      CHECK li_po IS BOUND. " Ignore missing files, missing translation is not a crime
+ 
+      LOOP AT lt_obj_list ASSIGNING <lv_lxe_object>.
+ 
+        lt_text_pairs_tmp = read_lxe_object_text_pair(
+          iv_s_lang    = lv_main_lang
+          iv_t_lang    = lv_target_lang
+          iv_custmnr   = <lv_lxe_object>-custmnr
+          iv_objtype   = <lv_lxe_object>-objtype
+          iv_objname   = <lv_lxe_object>-objname
+          iv_read_only = abap_false ).
+ 
+        li_po->translate( CHANGING ct_text_pairs = lt_text_pairs_tmp ).
+        " TODO maybe optimize, check if values have changed
+ 
+        write_lxe_object_text_pair(
+          iv_s_lang  = lv_main_lang
+          iv_t_lang  = lv_target_lang
+          iv_custmnr = <lv_lxe_object>-custmnr
+          iv_objtype = <lv_lxe_object>-objtype
+          iv_objname = <lv_lxe_object>-objname
+          it_pcx_s1  = lt_text_pairs_tmp ).
+ 
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_xml.
+ 
+    DATA:
+      lt_lxe_texts      TYPE ty_lxe_translations,
+      ls_lxe_item       LIKE LINE OF lt_lxe_texts,
+      lt_text_pairs_tmp LIKE ls_lxe_item-text_pairs.
+ 
+    mi_xml_in->read(
+      EXPORTING iv_name = iv_lxe_text_name
+      CHANGING  cg_data = lt_lxe_texts ).
+ 
+    LOOP AT lt_lxe_texts INTO ls_lxe_item.
+      " Call Read first for buffer prefill
+ 
+      lt_text_pairs_tmp = read_lxe_object_text_pair(
+        iv_s_lang    = ls_lxe_item-source_lang
+        iv_t_lang    = ls_lxe_item-target_lang
+        iv_custmnr   = ls_lxe_item-custmnr
+        iv_objtype   = ls_lxe_item-objtype
+        iv_objname   = ls_lxe_item-objname
+        iv_read_only = abap_false ).
+ 
+      "Call actual Write FM
+      write_lxe_object_text_pair(
+        iv_s_lang  = ls_lxe_item-source_lang
+        iv_t_lang  = ls_lxe_item-target_lang
+        iv_custmnr = ls_lxe_item-custmnr
+        iv_objtype = ls_lxe_item-objtype
+        iv_objname = ls_lxe_item-objname
+        it_pcx_s1  = ls_lxe_item-text_pairs ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD detect_unsupported_languages.
+ 
+    check_langs_versus_installed(
+      EXPORTING
+        it_languages = it_languages
+        it_installed = get_installed_languages( )
+      IMPORTING
+        et_missfits = rt_unsupported_languages ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_installed_languages.
+ 
+    DATA:
+      lv_index               TYPE i,
+      lv_langu               TYPE sy-langu,
+      lv_laiso               TYPE laiso,
+      lv_installed_languages TYPE string,
+      lt_language_filter     TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    IF gt_installed_languages_cache IS INITIAL.
+      CALL FUNCTION ''SYSTEM_INSTALLED_LANGUAGES''
+        IMPORTING
+          languages       = lv_installed_languages
+        EXCEPTIONS
+          sapgparam_error = 1                " Error requesting profile parameter
+          OTHERS          = 2.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( ''Fail to get system SYSTEM_INSTALLED_LANGUAGES'' ).
+      ENDIF.
+ 
+      lt_language_filter = zcl_abapgit_factory=>get_environment( )->get_system_language_filter( ).
+ 
+      DO strlen( lv_installed_languages ) TIMES.
+        lv_index = sy-index - 1.
+        lv_langu = lv_installed_languages+lv_index(1).
+ 
+        IF lv_langu NOT IN lt_language_filter.
+          CONTINUE.
+        ENDIF.
+ 
+        lv_laiso = langu_to_laiso_safe( lv_langu ).
+        APPEND lv_laiso TO gt_installed_languages_cache.
+      ENDDO.
+    ENDIF.
+ 
+    rt_languages = gt_installed_languages_cache.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_lang_iso4.
+ 
+    DATA lv_lang_iso639 TYPE laiso.
+    DATA lv_country     TYPE land1.
+ 
+    cl_i18n_languages=>sap2_to_iso639_1(
+      EXPORTING
+        im_lang_sap2   = iv_src
+      IMPORTING
+        ex_lang_iso639 = lv_lang_iso639
+        ex_country     = lv_country
+      EXCEPTIONS
+        no_assignment  = 1
+        OTHERS         = 2 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Failed to convert [{ iv_src }] lang to iso639| ).
+    ENDIF.
+ 
+    CONCATENATE lv_lang_iso639 lv_country INTO rv_iso4.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_lxe_object_list.
+ 
+    DATA lv_object_name TYPE trobj_name.
+ 
+    lv_object_name = iv_object_name.
+ 
+    CALL FUNCTION ''LXE_OBJ_EXPAND_TRANSPORT_OBJ''
+      EXPORTING
+        pgmid           = ''R3TR''
+        object          = iv_object_type
+        obj_name        = lv_object_name
+      TABLES
+        ex_colob        = rt_obj_list
+      EXCEPTIONS
+        unknown_object  = 1
+        unknown_ta_type = 2
+        OTHERS          = 3.
+    IF sy-subrc <> 0.
+      RETURN. " Ignore error and return empty list
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_translation_languages.
+ 
+    " Returns a list of translation languages for serialization
+    " If the setting is initial, no translations shall be serialized
+    " If the setting is \`*\`, all all installed system languages shall be serialized
+    " Else, the setting shall contain all languages to be serialized
+ 
+    DATA lv_main_lang_laiso TYPE laiso.
+ 
+    IF it_i18n_languages IS NOT INITIAL.
+      READ TABLE it_i18n_languages TRANSPORTING NO FIELDS WITH KEY table_line = ''*''.
+      IF sy-subrc = 0.
+        rt_languages = get_installed_languages( ).
+      ELSE.
+        check_langs_versus_installed(
+          EXPORTING
+            it_languages = it_i18n_languages
+            it_installed = get_installed_languages( )
+          IMPORTING
+            et_intersection = rt_languages ).
+      ENDIF.
+    ENDIF.
+ 
+    " Remove main language from translation languages
+    lv_main_lang_laiso = langu_to_laiso_safe( iv_main_language ).
+    DELETE rt_languages WHERE table_line = lv_main_lang_laiso.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD iso4_to_iso2.
+    rv_laiso = iv_lxe_lang+0(2).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_object_supported.
+    READ TABLE gt_supported_obj_types TRANSPORTING NO FIELDS WITH KEY table_line = iv_object_type.
+    rv_yes = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD langu_to_laiso_safe.
+ 
+    cl_i18n_languages=>sap1_to_sap2(
+      EXPORTING
+        im_lang_sap1  = iv_langu
+      RECEIVING
+        re_lang_sap2  = rv_laiso
+      EXCEPTIONS
+        no_assignment = 1
+        OTHERS        = 2 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Could not convert lang [{ iv_langu }] to ISO| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_lxe_object_text_pair.
+ 
+    DATA:
+      lv_error TYPE lxestring.
+ 
+    TRY.
+        CALL FUNCTION ''LXE_OBJ_TEXT_PAIR_READ''
+          EXPORTING
+            s_lang    = iv_s_lang
+            t_lang    = iv_t_lang
+            custmnr   = iv_custmnr
+            objtype   = iv_objtype
+            objname   = iv_objname
+            read_only = iv_read_only
+          IMPORTING
+            err_msg   = lv_error  " doesn''t exist in NW <= 750
+          TABLES
+            lt_pcx_s1 = rt_text_pairs_tmp.
+        IF lv_error IS NOT INITIAL.
+          zcx_abapgit_exception=>raise( lv_error ).
+        ENDIF.
+ 
+      CATCH cx_sy_dyn_call_param_not_found.
+ 
+        CALL FUNCTION ''LXE_OBJ_TEXT_PAIR_READ''
+          EXPORTING
+            s_lang    = iv_s_lang
+            t_lang    = iv_t_lang
+            custmnr   = iv_custmnr
+            objtype   = iv_objtype
+            objname   = iv_objname
+            read_only = iv_read_only
+          TABLES
+            lt_pcx_s1 = rt_text_pairs_tmp.
+ 
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_text_items.
+ 
+    DATA:
+      lt_obj_list      TYPE lxe_tt_colob,
+      lv_main_lang     TYPE lxeisolang,
+      ls_lxe_text_item LIKE LINE OF rt_text_items.
+ 
+    FIELD-SYMBOLS:
+      <lv_language>   LIKE LINE OF mo_i18n_params->ms_params-translation_languages,
+      <lv_lxe_object> LIKE LINE OF lt_obj_list.
+ 
+    lt_obj_list = get_lxe_object_list(
+      iv_object_name = iv_object_name
+      iv_object_type = iv_object_type ).
+ 
+    IF lt_obj_list IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " Get list of languages that need to be serialized (already resolves * and installed languages)
+    lv_main_lang = get_lang_iso4( langu_to_laiso_safe( mo_i18n_params->ms_params-main_language ) ).
+ 
+    LOOP AT lt_obj_list ASSIGNING <lv_lxe_object>.
+      CLEAR ls_lxe_text_item.
+      ls_lxe_text_item-custmnr = <lv_lxe_object>-custmnr.
+      ls_lxe_text_item-objtype = <lv_lxe_object>-objtype.
+      ls_lxe_text_item-objname = <lv_lxe_object>-objname.
+ 
+      LOOP AT mo_i18n_params->ms_params-translation_languages ASSIGNING <lv_language>.
+        ls_lxe_text_item-source_lang = lv_main_lang.
+        ls_lxe_text_item-target_lang = get_lang_iso4( <lv_language> ).
+        IF ls_lxe_text_item-source_lang = ls_lxe_text_item-target_lang.
+          CONTINUE. " if source = target -> skip
+        ENDIF.
+ 
+        ls_lxe_text_item-text_pairs = read_lxe_object_text_pair(
+          iv_s_lang    = ls_lxe_text_item-source_lang
+          iv_t_lang    = ls_lxe_text_item-target_lang
+          iv_custmnr   = ls_lxe_text_item-custmnr
+          iv_objtype   = ls_lxe_text_item-objtype
+          iv_objname   = ls_lxe_text_item-objname ).
+ 
+        IF ls_lxe_text_item-text_pairs IS NOT INITIAL.
+          APPEND ls_lxe_text_item TO rt_text_items.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_as_po.
+ 
+    DATA lt_lxe_texts TYPE ty_lxe_translations.
+    DATA lo_po_file TYPE REF TO zcl_abapgit_po_file.
+    DATA lv_lang LIKE LINE OF mo_i18n_params->ms_params-translation_languages.
+    FIELD-SYMBOLS <ls_translation> LIKE LINE OF lt_lxe_texts.
+ 
+    lt_lxe_texts = read_text_items(
+      iv_object_name   = iv_object_name
+      iv_object_type   = iv_object_type ).
+ 
+    LOOP AT mo_i18n_params->ms_params-translation_languages INTO lv_lang.
+      lv_lang = to_lower( lv_lang ).
+      CREATE OBJECT lo_po_file
+        EXPORTING
+          iv_lang = lv_lang.
+      LOOP AT lt_lxe_texts ASSIGNING <ls_translation>.
+        IF iso4_to_iso2( <ls_translation>-target_lang ) = lv_lang.
+          lo_po_file->push_text_pairs(
+            iv_objtype    = <ls_translation>-objtype
+            iv_objname    = <ls_translation>-objname
+            it_text_pairs = <ls_translation>-text_pairs ).
+        ENDIF.
+      ENDLOOP.
+      mo_files->add_i18n_file( lo_po_file ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_xml.
+ 
+    DATA lt_lxe_texts TYPE ty_lxe_translations.
+ 
+    lt_lxe_texts = read_text_items(
+      iv_object_name   = iv_object_name
+      iv_object_type   = iv_object_type ).
+ 
+    IF lines( lt_lxe_texts ) > 0.
+      mi_xml_out->add(
+        iv_name = iv_lxe_text_name
+        ig_data = lt_lxe_texts ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD write_lxe_object_text_pair.
+ 
+    DATA:
+      lv_error TYPE lxestring.
+ 
+    TRY.
+        CALL FUNCTION ''LXE_OBJ_TEXT_PAIR_WRITE''
+          EXPORTING
+            s_lang    = iv_s_lang
+            t_lang    = iv_t_lang
+            custmnr   = iv_custmnr
+            objtype   = iv_objtype
+            objname   = iv_objname
+          IMPORTING
+            err_msg   = lv_error  " doesn''t exist in NW <= 750
+          TABLES
+            lt_pcx_s1 = it_pcx_s1.
+        IF lv_error IS NOT INITIAL.
+          zcx_abapgit_exception=>raise( lv_error ).
+        ENDIF.
+ 
+      CATCH cx_sy_dyn_call_param_not_found.
+ 
+        CALL FUNCTION ''LXE_OBJ_TEXT_PAIR_WRITE''
+          EXPORTING
+            s_lang    = iv_s_lang
+            t_lang    = iv_t_lang
+            custmnr   = iv_custmnr
+            objtype   = iv_objtype
+            objname   = iv_objname
+          TABLES
+            lt_pcx_s1 = it_pcx_s1.
+ 
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_lxe_texts~deserialize.
+ 
+    IF is_object_supported( iv_object_type ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    mo_i18n_params = io_i18n_params.
+    mi_xml_in      = ii_xml.
+    mo_files       = io_files.
+ 
+    " MAYBE TODO: see comment in serialize
+ 
+    IF 1 = 1.
+      deserialize_from_po(
+        iv_object_type = iv_object_type
+        iv_object_name = iv_object_name ).
+    ELSE.
+      deserialize_xml(
+        iv_object_type = iv_object_type
+        iv_object_name = iv_object_name ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_lxe_texts~serialize.
+ 
+    IF is_object_supported( iv_object_type ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    mo_i18n_params = io_i18n_params.
+    mi_xml_out     = ii_xml.
+    mo_files       = io_files.
+ 
+    " MAYBE TODO
+    " if other formats are needed, including the old in-XML approach
+    " here is the place to implement it. Supposed architecture:
+    " I18N_PARAMS should contain an option which format to use
+    " The option should be originally maintained in dot_abapgit structures (e.g. \`translation_storage_format\`)
+    " Consequently it comes here
+    " The serialize method can read it and call a corresponding submethod,
+    " e.g. serialize_xml or serialize_as_po or ...
+    " both ii_xml and io_files are accessible intentionally to enable both XML based or file based formats
+    " access to json can be easily added too,
+    " or maybe (maybe) some kind of zif_ag_object_ctl with all DAO instead
+ 
+    IF 1 = 1.
+      serialize_as_po(
+        iv_object_type = iv_object_type
+        iv_object_name = iv_object_name ).
+    ELSE.
+      serialize_xml(
+        iv_object_type = iv_object_type
+        iv_object_name = iv_object_name ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PO_FILE                     ', 'CLASS zcl_abapgit_po_file DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_i18n_file.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_lang TYPE laiso.
+ 
+    METHODS parse
+      IMPORTING
+        iv_xdata TYPE xstring
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS push_text_pairs
+      IMPORTING
+        iv_objtype    TYPE trobjtype
+        iv_objname    TYPE lxeobjname
+        it_text_pairs TYPE zif_abapgit_lxe_texts=>ty_text_pairs
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_comment,
+        translator TYPE i VALUE 1,
+        extracted  TYPE i VALUE 2,
+        reference  TYPE i VALUE 3,
+        flag       TYPE i VALUE 4,
+        previous   TYPE i VALUE 5,
+      END OF c_comment.
+    TYPES:
+      BEGIN OF ty_comment,
+        kind TYPE i,
+        text TYPE string,
+      END OF ty_comment.
+    TYPES:
+      BEGIN OF ty_msg_pair,
+        source   TYPE string,
+        target   TYPE string,
+        comments TYPE STANDARD TABLE OF ty_comment WITH KEY kind text,
+      END OF ty_msg_pair.
+ 
+ 
+    DATA mv_lang TYPE laiso.
+    DATA mt_pairs TYPE SORTED TABLE OF ty_msg_pair WITH UNIQUE KEY source.
+ 
+    METHODS build_po_body
+      RETURNING
+        VALUE(ro_buf) TYPE REF TO zcl_abapgit_string_buffer.
+    METHODS build_po_head
+      RETURNING
+        VALUE(ro_buf) TYPE REF TO zcl_abapgit_string_buffer.
+    METHODS parse_po
+      IMPORTING
+        iv_data TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS get_comment_marker
+      IMPORTING
+        iv_comment_kind  TYPE i
+      RETURNING
+        VALUE(rv_marker) TYPE string.
+ 
+    CLASS-METHODS quote
+      IMPORTING
+        iv_text        TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string.
+    CLASS-METHODS unquote
+      IMPORTING
+        iv_text        TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PO_FILE IMPLEMENTATION.
+ 
+ 
+  METHOD build_po_body.
+ 
+    FIELD-SYMBOLS <ls_pair> LIKE LINE OF mt_pairs.
+    FIELD-SYMBOLS <ls_comment> LIKE LINE OF <ls_pair>-comments.
+ 
+    CREATE OBJECT ro_buf.
+ 
+    LOOP AT mt_pairs ASSIGNING <ls_pair>.
+      IF sy-tabix <> 1.
+        ro_buf->add( '''' ).
+      ENDIF.
+ 
+      " TODO integrate translator comments ?
+ 
+      SORT <ls_pair>-comments BY kind.
+      LOOP AT <ls_pair>-comments ASSIGNING <ls_comment>.
+        ro_buf->add( |#{ get_comment_marker( <ls_comment>-kind ) } { <ls_comment>-text }| ).
+      ENDLOOP.
+ 
+      ro_buf->add( |msgid { quote( <ls_pair>-source ) }| ).
+      ro_buf->add( |msgstr { quote( <ls_pair>-target ) }| ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_po_head.
+ 
+    CREATE OBJECT ro_buf.
+ 
+    " TODO, more headers ? sample: https://www.gnu.org/software/trans-coord/manual/gnun/html_node/PO-Header.html
+    " TODO, does \\n really necessary ? check editors support for non-\\n
+    " TODO, should be unfuzzy for final version, and potentially should have more fields
+ 
+    ro_buf->add( ''#, fuzzy'' ).
+    ro_buf->add( ''msgid ""'' ).
+    ro_buf->add( ''msgstr ""'' ).
+    ro_buf->add( ''"MIME-Version: 1.0\\n"'' ).
+    ro_buf->add( ''"Content-Type: text/plain; charset=UTF-8\\n"'' ).
+    ro_buf->add( ''"Content-Transfer-Encoding: 8bit\\n"'' ).
+    ro_buf->add( '''' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_lang = to_lower( iv_lang ).
+  ENDMETHOD.
+ 
+ 
+  METHOD get_comment_marker.
+    CASE iv_comment_kind.
+      WHEN c_comment-translator.
+        rv_marker = ''''.
+      WHEN c_comment-extracted.
+        rv_marker = ''.''.
+      WHEN c_comment-reference.
+        rv_marker = '':''.
+      WHEN c_comment-flag.
+        rv_marker = '',''.
+      WHEN c_comment-previous.
+        rv_marker = ''|''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA lv_xdata TYPE xstring.
+    DATA lv_data TYPE string.
+ 
+    IF xstrlen( iv_xdata ) > 3 AND iv_xdata(3) = cl_abap_char_utilities=>byte_order_mark_utf8.
+      lv_xdata = iv_xdata+3.
+    ELSE.
+      lv_xdata = iv_xdata.
+    ENDIF.
+ 
+    lv_data = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xdata ).
+ 
+    parse_po( lv_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_po.
+ 
+    CONSTANTS:
+      BEGIN OF c_state,
+        wait_id  TYPE i VALUE 0,
+        wait_str TYPE i VALUE 1,
+        wait_eos TYPE i VALUE 2,
+        " TODO msgctx
+      END OF c_state.
+ 
+    DATA lv_state TYPE i VALUE c_state-wait_id.
+    DATA lt_lines TYPE string_table.
+    DATA ls_pair LIKE LINE OF mt_pairs.
+    DATA lv_whitespace TYPE c LENGTH 2.
+    FIELD-SYMBOLS <lv_i> TYPE string.
+ 
+    lv_whitespace = \` \` && cl_abap_char_utilities=>horizontal_tab.
+ 
+    SPLIT iv_data AT cl_abap_char_utilities=>newline INTO TABLE lt_lines.
+    APPEND '''' TO lt_lines. " terminator
+ 
+    LOOP AT lt_lines ASSIGNING <lv_i>.
+      IF lv_state = c_state-wait_eos.
+        IF strlen( <lv_i> ) >= 1 AND <lv_i>+0(1) = ''"''.
+          ls_pair-target = ls_pair-target && unquote( <lv_i> ).
+          CONTINUE.
+        ELSE.
+          lv_state = c_state-wait_id.
+          IF ls_pair-source IS NOT INITIAL. " skip header entry for now
+            INSERT ls_pair INTO TABLE mt_pairs. " Sorted, duplicates will not be inserted
+          ENDIF.
+          CLEAR ls_pair.
+        ENDIF.
+      ENDIF.
+ 
+      CASE lv_state.
+        WHEN c_state-wait_id.
+          IF <lv_i> IS INITIAL
+            OR <lv_i>+0(1) = ''#'' " TODO, potentially parse comments in future, to re-integrate
+            OR <lv_i> CO lv_whitespace.
+            CONTINUE.
+          ENDIF.
+          IF strlen( <lv_i> ) >= 6 AND <lv_i>+0(6) = \`msgid \`. " w/trailing space
+            ls_pair-source = unquote( substring(
+              val = <lv_i>
+              off = 6 ) ).
+            lv_state = c_state-wait_str.
+          ELSE.
+            zcx_abapgit_exception=>raise( ''PO file format error: expected msgid'' ).
+          ENDIF.
+ 
+        WHEN c_state-wait_str.
+          IF strlen( <lv_i> ) >= 7 AND <lv_i>+0(7) = \`msgstr \`. " w/trailing space
+            ls_pair-target = unquote( substring(
+              val = <lv_i>
+              off = 7 ) ).
+            lv_state = c_state-wait_eos.
+          ELSE.
+            zcx_abapgit_exception=>raise( ''PO file format error: expected msgstr'' ).
+          ENDIF.
+ 
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push_text_pairs.
+ 
+    DATA ls_out LIKE LINE OF mt_pairs.
+    FIELD-SYMBOLS <ls_in> LIKE LINE OF it_text_pairs.
+    FIELD-SYMBOLS <ls_out> LIKE LINE OF mt_pairs.
+    DATA ls_comment LIKE LINE OF <ls_out>-comments.
+ 
+    LOOP AT it_text_pairs ASSIGNING <ls_in>.
+      CHECK <ls_in>-s_text IS NOT INITIAL.
+ 
+      READ TABLE mt_pairs ASSIGNING <ls_out> WITH KEY source = <ls_in>-s_text.
+      IF sy-subrc <> 0.
+        ls_out-source = <ls_in>-s_text.
+        INSERT ls_out INTO  TABLE mt_pairs ASSIGNING <ls_out>.
+        ASSERT sy-subrc = 0.
+      ENDIF.
+ 
+      IF <ls_out>-target IS INITIAL. " For a case of orig text duplication
+        <ls_out>-target = <ls_in>-t_text.
+      ENDIF.
+ 
+      ls_comment-kind = c_comment-reference.
+      ls_comment-text = condense( |{ iv_objtype }/{ iv_objname }/{ <ls_in>-textkey }| )
+        && |, maxlen={ <ls_in>-unitmlt }|.
+      APPEND ls_comment TO <ls_out>-comments.
+      ASSERT sy-subrc = 0.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD quote.
+    rv_text = ''"'' && replace(
+      val  = iv_text
+      sub  = ''"''
+      with = ''\\"''
+      occ  = 0 ) && ''"''.
+  ENDMETHOD.
+ 
+ 
+  METHOD unquote.
+ 
+    DATA lv_len TYPE i.
+    DATA lv_prev_char TYPE i.
+ 
+    rv_text = iv_text.
+    SHIFT rv_text RIGHT DELETING TRAILING space. " Measure perf ? Could be slowish, maybe use find
+    SHIFT rv_text LEFT DELETING LEADING space.
+    lv_len = strlen( rv_text ).
+ 
+    IF lv_len < 2.
+      zcx_abapgit_exception=>raise( ''PO file format error: bad quoting'' ).
+    ENDIF.
+ 
+    lv_prev_char = lv_len - 1.
+    IF rv_text+0(1) <> ''"'' OR rv_text+lv_prev_char(1) <> ''"''.
+      zcx_abapgit_exception=>raise( ''PO file format error: bad quoting'' ).
+    ENDIF.
+ 
+    lv_prev_char = lv_prev_char - 1.
+    IF lv_len >= 3 AND rv_text+lv_prev_char(1) = ''\\''. " escaped quote
+      zcx_abapgit_exception=>raise( ''PO file format error: bad quoting'' ).
+    ENDIF.
+ 
+    rv_text = substring(
+      val = rv_text
+      off = 1
+      len = lv_len - 2 ).
+ 
+    rv_text = replace(
+      val  = rv_text
+      sub  = ''\\"''
+      with = ''"''
+      occ  = 0 ).
+ 
+    rv_text = replace(
+      val  = rv_text
+      sub  = ''\\n''
+      with = cl_abap_char_utilities=>newline
+      occ  = 0 ).
+ 
+    " TODO: theoretically there can be unescaped " - is it a problem ? check standard
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_i18n_file~ext.
+    rv_ext = ''po''.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_i18n_file~lang.
+    rv_lang = mv_lang.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_i18n_file~render.
+ 
+    DATA lv_str TYPE string.
+ 
+    lv_str = build_po_body( )->join_w_newline_and_flush( ).
+ 
+    IF lv_str IS NOT INITIAL.
+      lv_str = build_po_head( )->join_w_newline_and_flush( )
+        && cl_abap_char_utilities=>newline
+        && lv_str
+        && cl_abap_char_utilities=>newline. " Trailing LF
+      rv_data = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_str ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_i18n_file~translate.
+ 
+    FIELD-SYMBOLS <ls_lxe> LIKE LINE OF ct_text_pairs.
+    FIELD-SYMBOLS <ls_tr> LIKE LINE OF mt_pairs.
+    DATA lv_idx TYPE i.
+ 
+    LOOP AT ct_text_pairs ASSIGNING <ls_lxe>.
+      CHECK <ls_lxe>-s_text IS NOT INITIAL.
+      lv_idx = sy-tabix.
+ 
+      READ TABLE mt_pairs ASSIGNING <ls_tr> WITH KEY source = <ls_lxe>-s_text.
+      IF sy-subrc = 0 AND <ls_tr>-target IS NOT INITIAL.
+        <ls_lxe>-t_text = <ls_tr>-target.
+      ELSE.
+        DELETE ct_text_pairs INDEX lv_idx. " Otherwise error in LXE FMs for empty translation
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SOTR_HANDLER                ', 'CLASS zcl_abapgit_sotr_handler DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_sotr,
+        header  TYPE sotr_head,
+        entries TYPE sotr_text_tt,
+      END OF ty_sotr .
+    TYPES:
+      ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY .
+    TYPES:
+      ty_sotr_use_tt TYPE STANDARD TABLE OF sotr_use WITH DEFAULT KEY .
+ 
+    CLASS-METHODS read_sotr
+      IMPORTING
+        !iv_pgmid    TYPE pgmid DEFAULT ''R3TR''
+        !iv_object   TYPE trobjtype
+        !iv_obj_name TYPE csequence
+        !io_xml      TYPE REF TO zif_abapgit_xml_output OPTIONAL
+        !io_i18n_params TYPE REF TO zcl_abapgit_i18n_params
+      EXPORTING
+        !et_sotr     TYPE ty_sotr_tt
+        !et_sotr_use TYPE ty_sotr_use_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_sotr
+      IMPORTING
+        !iv_package TYPE devclass
+        !io_xml     TYPE REF TO zif_abapgit_xml_input
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_sotr_from_data
+      IMPORTING
+        !iv_package  TYPE devclass
+        !it_sotr     TYPE ty_sotr_tt
+        !it_sotr_use TYPE ty_sotr_use_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_sotr
+      IMPORTING
+        !iv_pgmid    TYPE pgmid DEFAULT ''R3TR''
+        !iv_object   TYPE trobjtype
+        !iv_obj_name TYPE csequence
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_sotr_package
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+    CLASS-METHODS get_sotr_usage
+      IMPORTING
+        !iv_pgmid          TYPE pgmid
+        !iv_object         TYPE trobjtype
+        !iv_obj_name       TYPE csequence
+      RETURNING
+        VALUE(rt_sotr_use) TYPE ty_sotr_use_tt.
+ 
+    CLASS-METHODS get_sotr_4_concept
+      IMPORTING
+        !iv_concept    TYPE sotr_conc
+      RETURNING
+        VALUE(rs_sotr) TYPE ty_sotr .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_SOTR_HANDLER IMPLEMENTATION.
+ 
+ 
+  METHOD create_sotr.
+ 
+    DATA:
+      lt_sotr     TYPE ty_sotr_tt,
+      lt_sotr_use TYPE ty_sotr_use_tt.
+ 
+    io_xml->read( EXPORTING iv_name = ''SOTR''
+                  CHANGING cg_data = lt_sotr ).
+    io_xml->read( EXPORTING iv_name = ''SOTR_USE''
+                  CHANGING cg_data = lt_sotr_use ).
+ 
+    create_sotr_from_data(
+      iv_package  = iv_package
+      it_sotr     = lt_sotr
+      it_sotr_use = lt_sotr_use ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_sotr_from_data.
+ 
+    DATA:
+      lt_objects TYPE sotr_objects,
+      ls_paket   TYPE sotr_pack,
+      lv_alias   TYPE sotr_head-alias_name,
+      lv_object  LIKE LINE OF lt_objects.
+ 
+    FIELD-SYMBOLS: <ls_sotr> LIKE LINE OF it_sotr.
+ 
+    LOOP AT it_sotr ASSIGNING <ls_sotr>.
+      CALL FUNCTION ''SOTR_OBJECT_GET_OBJECTS''
+        EXPORTING
+          object_vector    = <ls_sotr>-header-objid_vec
+        IMPORTING
+          objects          = lt_objects
+        EXCEPTIONS
+          object_not_found = 1
+          OTHERS           = 2.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      READ TABLE lt_objects INDEX 1 INTO lv_object.
+      ASSERT sy-subrc = 0.
+ 
+      ls_paket-paket = iv_package.
+ 
+      " Replace package in alias with new package
+      lv_alias = <ls_sotr>-header-alias_name.
+      IF lv_alias CS ''/''.
+        lv_alias = iv_package && lv_alias+sy-fdpos(*).
+      ENDIF.
+ 
+      CALL FUNCTION ''SOTR_CREATE_CONCEPT''
+        EXPORTING
+          paket                         = ls_paket
+          crea_lan                      = <ls_sotr>-header-crea_lan
+          alias_name                    = lv_alias
+          object                        = lv_object
+          entries                       = <ls_sotr>-entries
+          concept_default               = <ls_sotr>-header-concept
+        EXCEPTIONS
+          package_missing               = 1
+          crea_lan_missing              = 2
+          object_missing                = 3
+          paket_does_not_exist          = 4
+          alias_already_exist           = 5
+          object_type_not_found         = 6
+          langu_missing                 = 7
+          identical_context_not_allowed = 8
+          text_too_long                 = 9
+          error_in_update               = 10
+          no_master_langu               = 11
+          error_in_concept_id           = 12
+          alias_not_allowed             = 13
+          tadir_entry_creation_failed   = 14
+          internal_error                = 15
+          error_in_correction           = 16
+          user_cancelled                = 17
+          no_entry_found                = 18
+          OTHERS                        = 19.
+      IF sy-subrc <> 0 AND sy-subrc <> 5.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDLOOP.
+ 
+    CALL FUNCTION ''SOTR_USAGE_MODIFY''
+      EXPORTING
+        sotr_usage = it_sotr_use.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_sotr.
+ 
+    DATA lt_sotr_use TYPE ty_sotr_use_tt.
+ 
+    FIELD-SYMBOLS <ls_sotr_use> LIKE LINE OF lt_sotr_use.
+ 
+    lt_sotr_use = get_sotr_usage( iv_pgmid    = iv_pgmid
+                                  iv_object   = iv_object
+                                  iv_obj_name = iv_obj_name ).
+ 
+    " Remove any usage to ensure deletion, see function module BTFR_CHECK
+    DELETE sotr_use FROM TABLE lt_sotr_use ##SUBRC_OK.
+ 
+    LOOP AT lt_sotr_use ASSIGNING <ls_sotr_use> WHERE concept IS NOT INITIAL.
+ 
+      CALL FUNCTION ''SOTR_DELETE_CONCEPT''
+        EXPORTING
+          concept             = <ls_sotr_use>-concept
+        EXCEPTIONS
+          no_entry_found      = 1
+          text_not_found      = 2
+          invalid_package     = 3
+          text_not_changeable = 4
+          text_enqueued       = 5
+          no_correction       = 6
+          parameter_error     = 7
+          OTHERS              = 8.
+      IF sy-subrc > 2.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_sotr_package.
+ 
+    DATA lt_sotr_head TYPE STANDARD TABLE OF sotr_head WITH DEFAULT KEY.
+    DATA lv_obj_name TYPE tadir-obj_name.
+ 
+    FIELD-SYMBOLS <ls_sotr_head> LIKE LINE OF lt_sotr_head.
+ 
+    SELECT * FROM sotr_head INTO TABLE lt_sotr_head WHERE paket = iv_package.
+ 
+    LOOP AT lt_sotr_head ASSIGNING <ls_sotr_head> WHERE concept IS NOT INITIAL.
+ 
+      CALL FUNCTION ''SOTR_DELETE_CONCEPT''
+        EXPORTING
+          concept             = <ls_sotr_head>-concept
+        EXCEPTIONS
+          no_entry_found      = 1
+          text_not_found      = 2
+          invalid_package     = 3
+          text_not_changeable = 4
+          text_enqueued       = 5
+          no_correction       = 6
+          parameter_error     = 7
+          OTHERS              = 8.
+      IF sy-subrc > 2.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    " Nothing left, then delete SOTR from TADIR
+    SELECT * FROM sotr_head INTO TABLE lt_sotr_head WHERE paket = iv_package.
+    IF sy-subrc <> 0.
+      SELECT SINGLE obj_name FROM tadir INTO lv_obj_name
+        WHERE pgmid = ''R3TR'' AND object = ''SOTR'' AND obj_name = iv_package.
+      IF sy-subrc = 0.
+        CALL FUNCTION ''TR_TADIR_INTERFACE''
+          EXPORTING
+            wi_delete_tadir_entry = abap_true
+            wi_test_modus         = abap_false
+            wi_tadir_pgmid        = ''R3TR''
+            wi_tadir_object       = ''SOTR''
+            wi_tadir_obj_name     = lv_obj_name
+          EXCEPTIONS
+            OTHERS                = 1 ##FM_SUBRC_OK.
+ 
+        IF zcl_abapgit_factory=>get_sap_package( iv_package )->are_changes_recorded_in_tr_req( ) = abap_true.
+ 
+          zcl_abapgit_factory=>get_cts_api( )->insert_transport_object(
+            iv_object   = ''SOTR''
+            iv_obj_name = lv_obj_name
+            iv_package  = iv_package
+            iv_mode     = zif_abapgit_cts_api=>c_transport_mode-delete ).
+ 
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sotr_4_concept.
+ 
+    DATA: ls_header  TYPE ty_sotr-header,
+          lv_paket   LIKE ls_header-alias_name,
+          lt_entries TYPE ty_sotr-entries.
+ 
+    FIELD-SYMBOLS: <ls_entry> LIKE LINE OF lt_entries.
+ 
+    CALL FUNCTION ''SOTR_GET_CONCEPT''
+      EXPORTING
+        concept        = iv_concept
+      IMPORTING
+        header         = ls_header
+      TABLES
+        entries        = lt_entries
+      EXCEPTIONS
+        no_entry_found = 1
+        OTHERS         = 2.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    " If alias contains package, remove it
+    lv_paket = ls_header-paket && ''/''.
+    IF ls_header-alias_name CS lv_paket.
+      ls_header-alias_name = replace(
+        val  = ls_header-alias_name
+        sub  = lv_paket
+        with = ''/''
+        occ  = 1 ).
+    ENDIF.
+ 
+    CLEAR: ls_header-paket,
+           ls_header-crea_name,
+           ls_header-crea_tstut,
+           ls_header-chan_name,
+           ls_header-chan_tstut,
+           ls_header-system_id.
+ 
+    LOOP AT lt_entries ASSIGNING <ls_entry>.
+      CLEAR: <ls_entry>-version,
+             <ls_entry>-crea_name,
+             <ls_entry>-crea_tstut,
+             <ls_entry>-chan_name,
+             <ls_entry>-chan_tstut.
+    ENDLOOP.
+ 
+    rs_sotr-header  = ls_header.
+    rs_sotr-entries = lt_entries.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sotr_usage.
+ 
+    DATA: lv_obj_name TYPE trobj_name.
+ 
+    lv_obj_name = iv_obj_name.
+ 
+    " Objects with multiple components
+    IF iv_pgmid = ''LIMU'' AND ( iv_object CP ''WDY*'' OR iv_object = ''WAPP'' ).
+      lv_obj_name+30 = ''%''.
+    ENDIF.
+ 
+    CALL FUNCTION ''SOTR_USAGE_READ''
+      EXPORTING
+        pgmid          = iv_pgmid
+        object         = iv_object
+        obj_name       = lv_obj_name
+      IMPORTING
+        sotr_usage     = rt_sotr_use
+      EXCEPTIONS
+        no_entry_found = 1
+        error_in_pgmid = 2
+        OTHERS         = 3.
+    IF sy-subrc = 0.
+      SORT rt_sotr_use.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_sotr.
+ 
+    FIELD-SYMBOLS <ls_sotr_use> LIKE LINE OF et_sotr_use.
+ 
+    DATA: lv_sotr            TYPE ty_sotr,
+          lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    " OTR short text usage: see TABLE BTFR_OBJ_IDS
+    " LIMU: CPUB, WAPP, WDYC, WDYD, WDYV
+    " R3TR: ENHC, ENHO, ENHS, ENSC, SCGR, SMIF, WDCA, WDCC, WEBI, WEBS
+ 
+    et_sotr_use = get_sotr_usage( iv_pgmid    = iv_pgmid
+                                  iv_object   = iv_object
+                                  iv_obj_name = iv_obj_name ).
+ 
+    LOOP AT et_sotr_use ASSIGNING <ls_sotr_use> WHERE concept IS NOT INITIAL.
+      lv_sotr = get_sotr_4_concept( <ls_sotr_use>-concept ).
+ 
+      IF io_xml IS BOUND AND io_i18n_params->ms_params-main_language_only = abap_true.
+        DELETE lv_sotr-entries WHERE langu <> io_i18n_params->ms_params-main_language.
+        CHECK lv_sotr-entries IS NOT INITIAL.
+      ENDIF.
+      lt_language_filter = io_i18n_params->build_language_filter( ).
+      DELETE lv_sotr-entries WHERE NOT langu IN lt_language_filter
+        AND langu <> io_i18n_params->ms_params-main_language.
+      CHECK lv_sotr-entries IS NOT INITIAL.
+ 
+      INSERT lv_sotr INTO TABLE et_sotr.
+    ENDLOOP.
+ 
+    IF io_xml IS BOUND.
+      io_xml->add( iv_name = ''SOTR''
+                   ig_data = et_sotr ).
+      io_xml->add( iv_name = ''SOTR_USE''
+                   ig_data = et_sotr_use ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SOTS_HANDLER                ', 'CLASS zcl_abapgit_sots_handler DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_sots,
+        header  TYPE sotr_headu,
+        entries TYPE sotr_textl_tt,
+      END OF ty_sots.
+    TYPES:
+      ty_sots_tt TYPE STANDARD TABLE OF ty_sots WITH DEFAULT KEY.
+    TYPES:
+      ty_sots_use_tt TYPE STANDARD TABLE OF sotr_useu WITH DEFAULT KEY.
+ 
+    CLASS-METHODS read_sots
+      IMPORTING
+        !iv_pgmid    TYPE pgmid DEFAULT ''R3TR''
+        !iv_object   TYPE trobjtype
+        !iv_obj_name TYPE csequence
+        !io_xml      TYPE REF TO zif_abapgit_xml_output OPTIONAL
+        !io_i18n_params TYPE REF TO zcl_abapgit_i18n_params
+      EXPORTING
+        !et_sots     TYPE ty_sots_tt
+        !et_sots_use TYPE ty_sots_use_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS create_sots
+      IMPORTING
+        !iv_package TYPE devclass
+        !io_xml     TYPE REF TO zif_abapgit_xml_input OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS create_sots_from_data
+      IMPORTING
+        !iv_package  TYPE devclass
+        !it_sots     TYPE ty_sots_tt OPTIONAL
+        !it_sots_use TYPE ty_sots_use_tt OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS delete_sots
+      IMPORTING
+        !iv_pgmid    TYPE pgmid DEFAULT ''R3TR''
+        !iv_object   TYPE trobjtype
+        !iv_obj_name TYPE csequence
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS get_sots_usage
+      IMPORTING
+        !iv_pgmid          TYPE pgmid
+        !iv_object         TYPE trobjtype
+        !iv_obj_name       TYPE csequence
+      RETURNING
+        VALUE(rt_sots_use) TYPE ty_sots_use_tt.
+ 
+    CLASS-METHODS get_sots_4_concept
+      IMPORTING
+        !iv_concept    TYPE sotr_conc
+      RETURNING
+        VALUE(rs_sots) TYPE ty_sots.
+ 
+  PRIVATE SECTION.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_SOTS_HANDLER IMPLEMENTATION.
+ 
+ 
+  METHOD create_sots.
+ 
+    DATA:
+      lt_sots     TYPE ty_sots_tt,
+      lt_sots_use TYPE ty_sots_use_tt.
+ 
+    io_xml->read( EXPORTING iv_name = ''SOTS''
+                  CHANGING  cg_data = lt_sots ).
+    io_xml->read( EXPORTING iv_name = ''SOTS_USE''
+                  CHANGING  cg_data = lt_sots_use ).
+ 
+    create_sots_from_data(
+      iv_package  = iv_package
+      it_sots     = lt_sots
+      it_sots_use = lt_sots_use ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_sots_from_data.
+ 
+    DATA:
+      lt_objects         TYPE sotr_objects,
+      lv_object          LIKE LINE OF lt_objects,
+      lv_subrc           TYPE sy-subrc,
+      ls_header          TYPE btfr_head,
+      lt_text_tab        TYPE sotr_text_tt,
+      lt_string_tab      TYPE sotr_textl_tt,
+      ls_entry           LIKE LINE OF lt_string_tab,
+      lv_concept         TYPE sotr_conc,
+      lv_concept_default TYPE sotr_conc.
+ 
+    FIELD-SYMBOLS <ls_sots> LIKE LINE OF it_sots.
+ 
+    LOOP AT it_sots ASSIGNING <ls_sots>.
+ 
+      CALL FUNCTION ''SOTR_OBJECT_GET_OBJECTS''
+        EXPORTING
+          object_vector    = <ls_sots>-header-objid_vec
+        IMPORTING
+          objects          = lt_objects
+        EXCEPTIONS
+          object_not_found = 1
+          OTHERS           = 2.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      READ TABLE lt_objects INDEX 1 INTO lv_object.
+      ASSERT sy-subrc = 0.
+ 
+      " Reimplementation of SOTR_STRING_CREATE_CONCEPT because we can''t supply
+      " concept and it would then be generated.
+ 
+      LOOP AT <ls_sots>-entries INTO ls_entry.
+        ls_entry-langu   = <ls_sots>-header-crea_lan.
+        ls_entry-concept = <ls_sots>-header-concept.
+        INSERT ls_entry INTO TABLE lt_string_tab.
+      ENDLOOP.
+ 
+      MOVE-CORRESPONDING <ls_sots>-header TO ls_header.
+      ls_header-paket = iv_package.
+ 
+      lv_concept = <ls_sots>-header-concept.
+ 
+      PERFORM btfr_create IN PROGRAM saplsotr_db_string
+        USING    lv_object
+                 sy-langu
+                 abap_false
+                 abap_true
+        CHANGING lt_text_tab
+                 lt_string_tab
+                 ls_header
+                 lv_concept
+                 lv_concept_default
+                 lv_subrc.
+ 
+      CASE lv_subrc.
+        WHEN 1.
+          MESSAGE e100(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 2.
+          MESSAGE e101(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 3.
+          MESSAGE i305(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 4.
+          " The concept will be created in the non-original system (not an error)
+        WHEN 5.
+          MESSAGE e504(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 6.
+          MESSAGE e035(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 7.
+          MESSAGE e170(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 9.
+          MESSAGE e102(sotr_mess) INTO zcx_abapgit_exception=>null.
+      ENDCASE.
+ 
+      IF lv_subrc <> 0 AND lv_subrc <> 4.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    CALL FUNCTION ''SOTR_USAGE_STRING_MODIFY''
+      EXPORTING
+        sotr_usage = it_sots_use.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_sots.
+ 
+    DATA:
+      ls_sots     TYPE ty_sots,
+      lt_sots_use TYPE ty_sots_use_tt.
+ 
+    FIELD-SYMBOLS <ls_sots_use> LIKE LINE OF lt_sots_use.
+ 
+    lt_sots_use = get_sots_usage( iv_pgmid    = iv_pgmid
+                                  iv_object   = iv_object
+                                  iv_obj_name = iv_obj_name ).
+ 
+    " Remove any usage to ensure deletion, see function module BTFR_CHECK
+    DELETE sotr_useu FROM TABLE lt_sots_use ##SUBRC_OK.
+ 
+    LOOP AT lt_sots_use ASSIGNING <ls_sots_use> WHERE concept IS NOT INITIAL.
+ 
+      CALL FUNCTION ''BTFR_DELETE_SINGLE_TEXT''
+        EXPORTING
+          concept             = <ls_sots_use>-concept
+          flag_string         = abap_true
+        EXCEPTIONS
+          text_not_found      = 1 "ok
+          invalid_package     = 3
+          text_not_changeable = 4
+          text_enqueued       = 5
+          no_correction       = 6
+          parameter_error     = 7
+          OTHERS              = 8.
+      IF sy-subrc > 2.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sots_4_concept.
+ 
+    DATA: ls_header  TYPE ty_sots-header,
+          lt_entries TYPE ty_sots-entries.
+ 
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF lt_entries.
+ 
+    CALL FUNCTION ''SOTR_STRING_GET_CONCEPT''
+      EXPORTING
+        concept        = iv_concept
+      IMPORTING
+        header         = ls_header
+        entries        = lt_entries
+      EXCEPTIONS
+        no_entry_found = 1
+        OTHERS         = 2.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    CLEAR: ls_header-paket,
+           ls_header-crea_name,
+           ls_header-crea_tstut,
+           ls_header-chan_name,
+           ls_header-chan_tstut,
+           ls_header-system_id.
+ 
+    LOOP AT lt_entries ASSIGNING <ls_entry>.
+      CLEAR: <ls_entry>-version,
+             <ls_entry>-crea_name,
+             <ls_entry>-crea_tstut,
+             <ls_entry>-chan_name,
+             <ls_entry>-chan_tstut.
+    ENDLOOP.
+ 
+    rs_sots-header  = ls_header.
+    rs_sots-entries = lt_entries.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sots_usage.
+ 
+    DATA: lv_obj_name TYPE trobj_name.
+ 
+    lv_obj_name = iv_obj_name.
+ 
+    " Objects with multiple components
+    IF iv_pgmid = ''LIMU'' AND ( iv_object CP ''WDY*'' OR iv_object = ''WAPP'' ).
+      lv_obj_name+30 = ''%''.
+    ENDIF.
+ 
+    CALL FUNCTION ''SOTR_USAGE_STRING_READ''
+      EXPORTING
+        pgmid          = iv_pgmid
+        object         = iv_object
+        obj_name       = lv_obj_name
+      IMPORTING
+        sotr_usage     = rt_sots_use
+      EXCEPTIONS
+        no_entry_found = 1
+        error_in_pgmid = 2
+        OTHERS         = 3.
+    IF sy-subrc = 0.
+      SORT rt_sots_use.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_sots.
+ 
+    FIELD-SYMBOLS <ls_sots_use> LIKE LINE OF et_sots_use.
+ 
+    DATA ls_sots TYPE ty_sots.
+ 
+    " OTR long text (string) usage: see TABLE BTFR_OBJ_IDS
+    " LIMU: CPUB, WAPP
+    " R3TR: SICF, SMIF, XSLT
+ 
+    et_sots_use = get_sots_usage( iv_pgmid    = iv_pgmid
+                                  iv_object   = iv_object
+                                  iv_obj_name = iv_obj_name ).
+ 
+    LOOP AT et_sots_use ASSIGNING <ls_sots_use> WHERE concept IS NOT INITIAL.
+      ls_sots = get_sots_4_concept( <ls_sots_use>-concept ).
+ 
+      IF io_i18n_params->ms_params-main_language_only = abap_true.
+        DELETE ls_sots-entries WHERE langu <> io_i18n_params->ms_params-main_language.
+        CHECK ls_sots-entries IS NOT INITIAL.
+      ENDIF.
+ 
+      INSERT ls_sots INTO TABLE et_sots.
+    ENDLOOP.
+ 
+    IF io_xml IS BOUND.
+      io_xml->add( iv_name = ''SOTS''
+                   ig_data = et_sots ).
+      io_xml->add( iv_name = ''SOTS_USE''
+                   ig_data = et_sots_use ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_I18N_FILE                   ', 'INTERFACE zif_abapgit_i18n_file
+  PUBLIC.
+ 
+  TYPES: ty_table_of TYPE STANDARD TABLE OF REF TO zif_abapgit_i18n_file WITH DEFAULT KEY.
+ 
+  METHODS render
+    RETURNING
+      VALUE(rv_data) TYPE xstring
+    RAISING
+      zcx_abapgit_exception.
+  METHODS translate
+    CHANGING
+      ct_text_pairs TYPE zif_abapgit_lxe_texts=>ty_text_pairs
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS ext
+    RETURNING
+      VALUE(rv_ext) TYPE string.
+  METHODS lang
+    RETURNING
+      VALUE(rv_lang) TYPE string.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_LANG_DEFINITIONS            ', 'INTERFACE zif_abapgit_lang_definitions
+  PUBLIC .
+ 
+  TYPES: BEGIN OF ty_i18n_tpool,
+           language TYPE langu,
+           textpool TYPE zif_abapgit_definitions=>ty_tpool_tt,
+         END OF ty_i18n_tpool,
+         ty_i18n_tpools TYPE STANDARD TABLE OF ty_i18n_tpool.
+ 
+  TYPES: BEGIN OF ty_i18n_line,
+           language TYPE langu,
+           lines    TYPE tlinetab,
+         END OF ty_i18n_line,
+         ty_i18n_lines TYPE STANDARD TABLE OF ty_i18n_line WITH KEY language.
+ 
+  TYPES: ty_langus TYPE STANDARD TABLE OF langu.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_LONGTEXTS                   ', 'INTERFACE zif_abapgit_longtexts
+  PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_longtext,
+      dokil TYPE dokil,
+      head  TYPE thead,
+      lines TYPE tline_tab,
+    END OF ty_longtext .
+  TYPES:
+    ty_longtexts TYPE STANDARD TABLE OF ty_longtext WITH NON-UNIQUE DEFAULT KEY .
+ 
+  METHODS changed_by
+    IMPORTING
+      !iv_object_name TYPE tadir-obj_name
+      !iv_longtext_id TYPE dokil-id
+      !it_dokil       TYPE zif_abapgit_definitions=>ty_dokil_tt OPTIONAL
+    RETURNING
+      VALUE(rv_user)  TYPE syuname
+    RAISING
+      zcx_abapgit_exception .
+  METHODS serialize
+    IMPORTING
+      !iv_longtext_name   TYPE string DEFAULT ''LONGTEXTS''
+      !iv_object_name     TYPE clike
+      !iv_longtext_id     TYPE dokil-id
+      !it_dokil           TYPE zif_abapgit_definitions=>ty_dokil_tt OPTIONAL
+      !ii_xml             TYPE REF TO zif_abapgit_xml_output
+      !io_i18n_params     TYPE REF TO zcl_abapgit_i18n_params
+    RETURNING
+      VALUE(rt_longtexts) TYPE ty_longtexts
+    RAISING
+      zcx_abapgit_exception .
+  METHODS deserialize
+    IMPORTING
+      !iv_longtext_name TYPE string DEFAULT ''LONGTEXTS''
+      !iv_object_name   TYPE clike
+      !iv_longtext_id   TYPE dokil-id
+      !ii_xml           TYPE REF TO zif_abapgit_xml_input
+      !iv_main_language TYPE sy-langu
+    RAISING
+      zcx_abapgit_exception .
+  METHODS delete
+    IMPORTING
+      !iv_object_name TYPE tadir-obj_name
+      !iv_longtext_id TYPE dokil-id
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_LXE_TEXTS                   ', 'INTERFACE zif_abapgit_lxe_texts
+  PUBLIC .
+ 
+  TYPES:
+    ty_text_pairs TYPE STANDARD TABLE OF lxe_pcx_s1 WITH DEFAULT KEY.
+ 
+  METHODS serialize
+    IMPORTING
+      !iv_object_type   TYPE tadir-object
+      !iv_object_name   TYPE tadir-obj_name
+      !io_i18n_params   TYPE REF TO zcl_abapgit_i18n_params
+      !ii_xml           TYPE REF TO zif_abapgit_xml_output
+      !io_files         TYPE REF TO zcl_abapgit_objects_files
+    RAISING
+      zcx_abapgit_exception .
+  METHODS deserialize
+    IMPORTING
+      !iv_object_type   TYPE tadir-object OPTIONAL
+      !iv_object_name   TYPE tadir-obj_name OPTIONAL
+      !io_i18n_params   TYPE REF TO zcl_abapgit_i18n_params
+      !ii_xml           TYPE REF TO zif_abapgit_xml_input
+      !io_files         TYPE REF TO zcl_abapgit_objects_files
+    RAISING
+      zcx_abapgit_exception .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OBJECT_DEVC                 ', 'CLASS zcl_abapgit_object_devc DEFINITION PUBLIC
+  INHERITING FROM zcl_abapgit_objects_super
+  FINAL.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_object.
+ 
+    METHODS:
+      constructor IMPORTING is_item     TYPE zif_abapgit_definitions=>ty_item
+                            iv_language TYPE spras.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mv_local_devclass TYPE devclass .
+ 
+    METHODS get_package
+      RETURNING
+        VALUE(ri_package) TYPE REF TO if_package
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_pinf_usages
+      IMPORTING
+        !ii_package    TYPE REF TO if_package
+        !it_usage_data TYPE scomppdata
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_lock
+      IMPORTING
+        !ii_package TYPE REF TO if_package
+        !iv_lock    TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS unlock_and_raise_error
+      IMPORTING
+        !ii_package TYPE REF TO if_package
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_empty
+      IMPORTING
+        !iv_package_name   TYPE devclass
+      RETURNING
+        VALUE(rv_is_empty) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS load_package
+      IMPORTING
+        !iv_package_name  TYPE devclass
+      RETURNING
+        VALUE(ri_package) TYPE REF TO if_package
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_local
+      IMPORTING
+        !iv_package_name   TYPE devclass
+      RETURNING
+        VALUE(rv_is_local) TYPE abap_bool .
+    METHODS remove_obsolete_tadir
+      IMPORTING
+        !iv_package_name TYPE devclass .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_object_devc IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor( is_item     = is_item
+                        iv_language = iv_language ).
+    IF is_item-devclass IS NOT INITIAL.
+      mv_local_devclass = is_item-devclass.
+    ELSE.
+      mv_local_devclass = is_item-obj_name.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_package.
+    IF zif_abapgit_object~exists( ) = abap_true.
+      ri_package = load_package( mv_local_devclass ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_empty.
+ 
+    DATA: lv_object_name TYPE tadir-obj_name,
+          lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    lt_subpackages = zcl_abapgit_factory=>get_sap_package( iv_package_name )->list_subpackages( ).
+ 
+    IF lines( lt_subpackages ) > 0.
+      rv_is_empty = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    " Ignore the SOTR if is linked to the current SAP package (DEVC)
+    SELECT SINGLE obj_name
+           FROM tadir
+           INTO lv_object_name
+           WHERE pgmid = ''R3TR''
+           AND NOT ( ( object = ''DEVC'' OR object = ''SOTR'' ) AND obj_name = iv_package_name )
+           AND devclass = iv_package_name.
+    rv_is_empty = boolc( sy-subrc <> 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_local.
+ 
+    DATA lv_dlvunit TYPE tdevc-dlvunit.
+ 
+    SELECT SINGLE dlvunit FROM tdevc INTO lv_dlvunit
+        WHERE devclass = iv_package_name AND intsys <> ''SAP''.
+    IF sy-subrc = 0 AND lv_dlvunit = ''LOCAL''.
+      rv_is_local = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD load_package.
+ 
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = iv_package_name
+        i_force_reload             = abap_true
+      IMPORTING
+        e_package                  = ri_package
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5
+        OTHERS                     = 6 ).
+    IF sy-subrc = 1.
+      RETURN.
+    ELSEIF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_obsolete_tadir.
+ 
+    DATA:
+      lv_pack  TYPE devclass,
+      lt_pack  TYPE STANDARD TABLE OF devclass,
+      ls_tadir TYPE zif_abapgit_definitions=>ty_tadir,
+      lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
+      ls_item  TYPE zif_abapgit_definitions=>ty_item.
+ 
+    " TADIR entries must remain for transportable packages
+    IF is_local( iv_package_name ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    " Clean-up sub packages first
+    SELECT devclass FROM tdevc INTO TABLE lt_pack WHERE parentcl = iv_package_name.
+ 
+    LOOP AT lt_pack INTO lv_pack.
+      remove_obsolete_tadir( lv_pack ).
+    ENDLOOP.
+ 
+    " Remove TADIR entries for objects that do not exist anymore
+    SELECT * FROM tadir INTO CORRESPONDING FIELDS OF TABLE lt_tadir
+      WHERE devclass = iv_package_name ##TOO_MANY_ITAB_FIELDS.
+ 
+    LOOP AT lt_tadir INTO ls_tadir.
+      ls_item-obj_type = ls_tadir-object.
+      ls_item-obj_name = ls_tadir-obj_name.
+ 
+      IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+        CALL FUNCTION ''TR_TADIR_INTERFACE''
+          EXPORTING
+            wi_delete_tadir_entry = abap_true
+            wi_tadir_pgmid        = ''R3TR''
+            wi_tadir_object       = ls_tadir-object
+            wi_tadir_obj_name     = ls_tadir-obj_name
+            wi_test_modus         = abap_false
+          EXCEPTIONS
+            OTHERS                = 1 ##FM_SUBRC_OK.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_lock.
+ 
+    DATA: lv_changeable TYPE abap_bool.
+ 
+    ii_package->get_changeable( IMPORTING e_changeable = lv_changeable ).
+    IF lv_changeable <> iv_lock.
+      TRY.
+          CALL METHOD ii_package->(''SET_CHANGEABLE'')
+            EXPORTING
+              i_changeable                = iv_lock
+              i_suppress_dialog           = abap_true " Parameter missing in 702
+            EXCEPTIONS
+              object_locked_by_other_user = 1
+              permission_failure          = 2
+              object_already_changeable   = 3
+              object_already_unlocked     = 4
+              object_just_created         = 5
+              object_deleted              = 6
+              object_modified             = 7
+              object_not_existing         = 8
+              object_invalid              = 9
+              unexpected_error            = 10
+              OTHERS                      = 11.
+        CATCH cx_sy_dyn_call_param_not_found.
+          ii_package->set_changeable(
+            EXPORTING
+              i_changeable                = iv_lock
+            EXCEPTIONS
+              object_locked_by_other_user = 1
+              permission_failure          = 2
+              object_already_changeable   = 3
+              object_already_unlocked     = 4
+              object_just_created         = 5
+              object_deleted              = 6
+              object_modified             = 7
+              object_not_existing         = 8
+              object_invalid              = 9
+              unexpected_error            = 10
+              OTHERS                      = 11 ).
+      ENDTRY.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+ 
+    TRY.
+        CALL METHOD ii_package->(''SET_PERMISSIONS_CHANGEABLE'')
+          EXPORTING
+            i_changeable                = iv_lock
+            i_suppress_dialog           = abap_true " Parameter missing in 702
+          EXCEPTIONS
+            object_already_changeable   = 1
+            object_already_unlocked     = 2
+            object_locked_by_other_user = 3
+            object_modified             = 4
+            object_just_created         = 5
+            object_deleted              = 6
+            permission_failure          = 7
+            object_invalid              = 8
+            unexpected_error            = 9
+            OTHERS                      = 10.
+      CATCH cx_sy_dyn_call_param_not_found.
+        ii_package->set_permissions_changeable(
+          EXPORTING
+            i_changeable                = iv_lock
+          EXCEPTIONS
+            object_already_changeable   = 1
+            object_already_unlocked     = 2
+            object_locked_by_other_user = 3
+            object_modified             = 4
+            object_just_created         = 5
+            object_deleted              = 6
+            permission_failure          = 7
+            object_invalid              = 8
+            unexpected_error            = 9
+            OTHERS                      = 10 ).
+    ENDTRY.
+    IF ( sy-subrc = 1 AND iv_lock = abap_true ) OR ( sy-subrc = 2 AND iv_lock = abap_false ).
+      " There''s no getter to find out beforehand...
+    ELSEIF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD unlock_and_raise_error.
+ 
+    DATA ls_msg TYPE bal_s_msg.
+ 
+    " Remember message since unlock overwrites it (for example with XT465)
+    MOVE-CORRESPONDING sy TO ls_msg.
+ 
+    set_lock( ii_package = ii_package
+              iv_lock    = abap_false ).
+ 
+    zcx_abapgit_exception=>raise_t100(
+      iv_msgid = ls_msg-msgid
+      iv_msgno = ls_msg-msgno
+      iv_msgv1 = ls_msg-msgv1
+      iv_msgv2 = ls_msg-msgv2
+      iv_msgv3 = ls_msg-msgv3
+      iv_msgv4 = ls_msg-msgv4 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_pinf_usages.
+    DATA: lt_current_permissions TYPE tpak_permission_to_use_list,
+          li_usage               TYPE REF TO if_package_permission_to_use,
+          ls_data_sign           TYPE scomppsign,
+          ls_add_permission_data TYPE pkgpermdat,
+          lt_handled             TYPE SORTED TABLE OF i WITH UNIQUE KEY table_line.
+    FIELD-SYMBOLS: <ls_usage_data> LIKE LINE OF it_usage_data.
+ 
+    " Get the current permissions
+    ii_package->get_permissions_to_use(
+      IMPORTING
+        e_permissions    = lt_current_permissions
+      EXCEPTIONS
+        object_invalid   = 1
+        unexpected_error = 2
+        OTHERS           = 3 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    ls_data_sign-err_sever = abap_true.
+ 
+    " New permissions
+    LOOP AT it_usage_data ASSIGNING <ls_usage_data>.
+      READ TABLE lt_current_permissions
+           WITH KEY table_line->package_interface_name = <ls_usage_data>-intf_name
+           INTO li_usage.
+ 
+      IF sy-subrc = 0 AND li_usage IS BOUND.
+        INSERT sy-tabix INTO TABLE lt_handled.
+ 
+        " Permission already exists, update attributes
+        li_usage->set_all_attributes(
+          EXPORTING
+            i_permission_data     = <ls_usage_data>
+            i_data_sign           = ls_data_sign
+          EXCEPTIONS
+            object_not_changeable = 1
+            object_invalid        = 2
+            intern_err            = 3
+            OTHERS                = 4 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+ 
+      ELSE.
+        " Permission does not exist yet, add it
+        MOVE-CORRESPONDING <ls_usage_data> TO ls_add_permission_data.
+        ii_package->add_permission_to_use(
+          EXPORTING
+            i_pkg_permission_data   = ls_add_permission_data
+          EXCEPTIONS
+            object_not_changeable   = 1
+            object_access_error     = 2
+            object_already_existing = 3
+            object_invalid          = 4
+            unexpected_error        = 5
+            OTHERS                  = 6 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+ 
+      ENDIF.
+ 
+      FREE li_usage.
+    ENDLOOP.
+ 
+    " Delete missing usages
+    LOOP AT lt_current_permissions INTO li_usage.
+      READ TABLE lt_handled WITH TABLE KEY table_line = sy-tabix TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        CONTINUE.
+      ENDIF.
+ 
+      li_usage->delete(
+        EXCEPTIONS
+          object_not_changeable = 1
+          object_invalid        = 2
+*          deletion_not_allowed  = 3 downport, does not exist in 7.30
+          intern_err            = 4
+          OTHERS                = 5 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~changed_by.
+    DATA li_package TYPE REF TO if_package.
+ 
+    li_package = get_package( ).
+    IF li_package IS BOUND.
+      rv_user = li_package->changed_by.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~delete.
+ 
+    DATA: li_package TYPE REF TO if_package,
+          lv_package TYPE devclass.
+ 
+    " Package deletion is a bit tricky. A package can only be deleted if there are no objects
+    " contained in it. This includes subpackages, so first the leaf packages need to be deleted.
+    " Unfortunately deleted objects that are still contained in an unreleased transport request
+    " also count towards the contained objects counter.
+    " -> Currently we delete only empty packages
+    "
+    " If objects are deleted, the TADIR entry is deleted when the transport request is released.
+    " So before we can delete the package, the transport which deletes the objects
+    " in the package has to be released.
+ 
+    lv_package = ms_item-obj_name.
+ 
+    " Remove remaining OTR entries
+    zcl_abapgit_sotr_handler=>delete_sotr_package( iv_package ).
+ 
+    remove_obsolete_tadir( lv_package ).
+ 
+    IF is_empty( lv_package ) = abap_true.
+ 
+      li_package = load_package( lv_package ).
+ 
+      IF li_package IS NOT BOUND.
+        RETURN.
+      ENDIF.
+ 
+      IF lv_package(1) = ''$''.
+        zcl_abapgit_persist_packages=>get_instance( )->modify( lv_package ).
+      ENDIF.
+ 
+      set_lock( ii_package = li_package
+                iv_lock    = abap_true ).
+ 
+      TRY.
+          CALL METHOD li_package->(''DELETE'')
+            EXPORTING
+              i_suppress_dialog     = abap_true  " Parameter missing in 702
+            EXCEPTIONS
+              object_not_empty      = 1
+              object_not_changeable = 2
+              object_invalid        = 3
+              intern_err            = 4
+              OTHERS                = 5.
+ 
+        CATCH cx_sy_dyn_call_param_not_found.
+ 
+          li_package->delete(
+            EXCEPTIONS
+              object_not_empty      = 1
+              object_not_changeable = 2
+              object_invalid        = 3
+              intern_err            = 4
+              OTHERS                = 5 ).
+ 
+      ENDTRY.
+ 
+      IF sy-subrc <> 0.
+        unlock_and_raise_error( li_package ).
+      ENDIF.
+ 
+      TRY.
+          CALL METHOD li_package->(''SAVE'')
+            EXPORTING
+              i_suppress_dialog     = abap_true
+            EXCEPTIONS
+              object_invalid        = 1
+              object_not_changeable = 2
+              cancelled_in_corr     = 3
+              permission_failure    = 4
+              unexpected_error      = 5
+              intern_err            = 6
+              OTHERS                = 7.
+ 
+        CATCH cx_sy_dyn_call_param_not_found.
+ 
+          li_package->save(
+            EXCEPTIONS
+              object_invalid        = 1
+              object_not_changeable = 2
+              cancelled_in_corr     = 3
+              permission_failure    = 4
+              unexpected_error      = 5
+              intern_err            = 6
+              OTHERS                = 7 ).
+ 
+      ENDTRY.
+ 
+      IF sy-subrc <> 0.
+        unlock_and_raise_error( li_package ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~deserialize.
+    DATA: li_package      TYPE REF TO if_package,
+          ls_package_data TYPE scompkdtln,
+          ls_data_sign    TYPE scompksign,
+          lt_usage_data   TYPE scomppdata,
+          ls_save_sign    TYPE paksavsign.
+ 
+    FIELD-SYMBOLS: <ls_usage_data> TYPE scomppdtln.
+ 
+ 
+    mv_local_devclass = iv_package.
+ 
+    io_xml->read(
+      EXPORTING
+        iv_name = ''DEVC''
+      CHANGING
+        cg_data = ls_package_data ).
+ 
+    IF mv_local_devclass(1) = ''$''.
+      IF ls_package_data-mainpack = ''X''.
+        zcx_abapgit_exception=>raise( |Main package { iv_package } cannot be used in local package| ).
+      ELSEIF ls_package_data-mainpack = ''S''.
+        zcx_abapgit_exception=>raise( |Structure package { iv_package } cannot be used in local package| ).
+      ENDIF.
+    ENDIF.
+ 
+    li_package = get_package( ).
+ 
+    " Swap out repository package name with the local installation package name
+    ls_package_data-devclass = mv_local_devclass.
+    IF li_package IS BOUND.
+      ls_package_data-pdevclass = li_package->transport_layer.
+    ENDIF.
+ 
+    " For local packages store application component
+    IF ls_package_data-devclass(1) = ''$''.
+      zcl_abapgit_persist_packages=>get_instance( )->modify(
+        iv_package    = ls_package_data-devclass
+        iv_component  = ls_package_data-component
+        iv_comp_posid = ls_package_data-comp_posid ).
+    ENDIF.
+ 
+    " Parent package is not changed. Assume the folder logic already created the package and set
+    " the hierarchy before.
+    CLEAR ls_package_data-parentcl.
+ 
+* Fields not set:
+* korrflag
+* dlvunit
+* parentcl
+* cli_check
+* intprefx
+    ls_data_sign-ctext            = abap_true.
+    ls_data_sign-as4user          = abap_true.
+    ls_data_sign-pdevclass        = abap_true.
+    ls_data_sign-comp_posid       = abap_true.
+    ls_data_sign-component        = abap_true.
+    ls_data_sign-perminher        = abap_true.
+    ls_data_sign-packtype         = abap_true.
+    ls_data_sign-restricted       = abap_true.
+    ls_data_sign-mainpack         = abap_true.
+    ls_data_sign-srv_check        = abap_true.
+    ls_data_sign-ext_alias        = abap_true.
+    ls_data_sign-project_guid     = abap_true.
+    ls_data_sign-project_id       = abap_true.
+    ls_data_sign-project_passdown = abap_true.
+ 
+    IF ls_package_data-ctext IS INITIAL.
+      ls_package_data-ctext = mv_local_devclass.
+    ENDIF.
+    IF ls_package_data-dlvunit IS INITIAL.
+      ls_package_data-dlvunit = ''HOME''.
+    ENDIF.
+ 
+    ls_package_data-as4user = sy-uname.
+ 
+    IF li_package IS BOUND.
+      " Package already exists, change it
+      set_lock( ii_package = li_package
+                iv_lock    = abap_true ).
+ 
+      li_package->set_all_attributes(
+        EXPORTING
+          i_package_data             = ls_package_data
+          i_data_sign                = ls_data_sign
+        EXCEPTIONS
+          object_not_changeable      = 1
+          object_deleted             = 2
+          object_invalid             = 3
+          short_text_missing         = 4
+          author_not_existing        = 5
+          local_package              = 6
+          software_component_invalid = 7
+          layer_invalid              = 8
+          korrflag_invalid           = 9
+          component_not_existing     = 10
+          component_missing          = 11
+          authorize_failure          = 12
+          prefix_in_use              = 13
+          unexpected_error           = 14
+          intern_err                 = 15
+*          wrong_mainpack_value       = 16  downport, does not exist in 7.30
+*          superpackage_invalid       = 17  downport, does not exist in 7.30
+          OTHERS                     = 18 ).
+      IF sy-subrc <> 0.
+        unlock_and_raise_error( li_package ).
+      ENDIF.
+ 
+    ELSE.
+      " Package does not exist yet, create it
+      " This shouldn''t really happen, because the folder logic initially creates the packages.
+      cl_package_factory=>create_new_package(
+        IMPORTING
+          e_package                  = li_package
+        CHANGING
+          c_package_data             = ls_package_data
+        EXCEPTIONS
+          object_already_existing    = 1
+          object_just_created        = 2
+          not_authorized             = 3
+          wrong_name_prefix          = 4
+          undefined_name             = 5
+          reserved_local_name        = 6
+          invalid_package_name       = 7
+          short_text_missing         = 8
+          software_component_invalid = 9
+          layer_invalid              = 10
+          author_not_existing        = 11
+          component_not_existing     = 12
+          component_missing          = 13
+          prefix_in_use              = 14
+          unexpected_error           = 15
+          intern_err                 = 16
+          no_access                  = 17
+*          invalid_translation_depth  = 18 downport, does not exist in 7.30
+*          wrong_mainpack_value       = 19 downport, does not exist in 7.30
+*          superpackage_invalid       = 20 downport, does not exist in 7.30
+*          error_in_cts_checks        = 21 downport, does not exist in 7.31
+          OTHERS                     = 22 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+ 
+    " Load package interface usages
+    TRY.
+        io_xml->read(
+          EXPORTING
+            iv_name = ''PERMISSION''
+          CHANGING
+            cg_data = lt_usage_data ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+        " No permissions saved
+    ENDTRY.
+ 
+    LOOP AT lt_usage_data ASSIGNING <ls_usage_data>.
+      <ls_usage_data>-client_pak = mv_local_devclass.
+    ENDLOOP.
+ 
+    update_pinf_usages( ii_package    = li_package
+                        it_usage_data = lt_usage_data ).
+ 
+    ls_save_sign-pack = abap_true.
+    ls_save_sign-permis = abap_true.
+    ls_save_sign-elems = abap_true.
+    ls_save_sign-interf = abap_true.
+    li_package->save_generic(
+      EXPORTING
+        i_save_sign           = ls_save_sign
+        i_transport_request   = iv_transport
+        i_suppress_dialog     = abap_true
+      EXCEPTIONS
+        cancelled_in_corr     = 1
+        permission_failure    = 2
+        object_not_changeable = 3
+        object_invalid        = 4
+        OTHERS                = 5 ).
+    IF sy-subrc <> 0.
+      unlock_and_raise_error( li_package ).
+    ENDIF.
+ 
+    set_lock( ii_package = li_package
+              iv_lock    = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~exists.
+    " Check remote package if deserialize has not been called before this
+    IF mv_local_devclass IS INITIAL.
+      rv_bool = abap_false.
+    ELSE.
+      cl_package_helper=>check_package_existence(
+        EXPORTING
+          i_package_name          = mv_local_devclass
+        IMPORTING
+          e_package_exists        = rv_bool
+        EXCEPTIONS
+          intern_err              = 1
+          OTHERS                  = 2 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_comparator.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_order.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_steps.
+    APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_metadata.
+    rs_metadata = get_metadata( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_active.
+    rv_active = is_active( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_locked.
+ 
+    DATA: lv_object TYPE eqegraarg.
+ 
+    lv_object = |DV{ ms_item-obj_name }|.
+    OVERLAY lv_object WITH ''                                          ''.
+    lv_object = lv_object && ''*''.
+ 
+    rv_is_locked = exists_a_lock_entry_for( iv_lock_object = ''EEUDB''
+                                            iv_argument    = lv_object ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~jump.
+    " Covered by ZCL_ABAPGIT_OBJECTS=>JUMP
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_filename_to_object.
+ 
+    IF iv_filename <> zcl_abapgit_filename_logic=>c_package_file.
+      zcx_abapgit_exception=>raise( |Unexpected filename for package { cs_item-obj_name }| ).
+    ENDIF.
+ 
+    " Try to get a unique package name for DEVC by using the path
+    cs_item-obj_name = zcl_abapgit_folder_logic=>get_instance( )->path_to_package(
+      iv_top                  = iv_package
+      io_dot                  = io_dot
+      iv_create_if_not_exists = abap_false
+      iv_path                 = iv_path ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_object_to_filename.
+ 
+    " Packages have a fixed filename so that the repository can be installed to a different
+    " package(-hierarchy) on the client and not show up as a different package in the repo.
+    cv_filename = zcl_abapgit_filename_logic=>c_package_file.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~serialize.
+    DATA: ls_package_data TYPE scompkdtln,
+          ls_package_comp TYPE zcl_abapgit_persist_packages=>ty_package,
+          li_package      TYPE REF TO if_package,
+          lt_intf_usages  TYPE tpak_permission_to_use_list,
+          lt_usage_data   TYPE scomppdata,
+          ls_usage_data   TYPE scomppdtln,
+          li_usage        TYPE REF TO if_package_permission_to_use.
+ 
+    FIELD-SYMBOLS: <lg_field> TYPE any.
+ 
+ 
+    li_package = get_package( ).
+    IF li_package IS NOT BOUND.
+      zcx_abapgit_exception=>raise( |Could not find package to serialize.| ).
+    ENDIF.
+ 
+    li_package->get_all_attributes(
+      IMPORTING
+        e_package_data  = ls_package_data
+      EXCEPTIONS
+        object_invalid  = 1
+        package_deleted = 2
+        intern_err      = 3
+        OTHERS          = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    " For local packages get application component
+    IF is_local( ls_package_data-devclass ) = abap_true.
+      ls_package_comp = zcl_abapgit_persist_packages=>get_instance( )->read( ls_package_data-devclass ).
+      ls_package_data-component  = ls_package_comp-component.
+      ls_package_data-comp_posid = ls_package_comp-comp_posid.
+    ENDIF.
+ 
+    CLEAR: ls_package_data-devclass,
+           ls_package_data-parentcl.
+ 
+    " Clear administrative data to prevent diffs
+    CLEAR: ls_package_data-created_by,
+           ls_package_data-created_on,
+           ls_package_data-changed_by,
+           ls_package_data-changed_on,
+           ls_package_data-as4user.
+ 
+    " Clear text descriptions that might be localized
+    CLEAR: ls_package_data-comp_text,
+           ls_package_data-dlvu_text,
+           ls_package_data-layer_text.
+ 
+    " Clear obsolete fields
+    CLEAR: ls_package_data-intfprefx,
+           ls_package_data-cli_check.
+ 
+    ASSIGN COMPONENT ''TRANSLATION_DEPTH_TEXT''
+           OF STRUCTURE ls_package_data
+           TO <lg_field>.
+    IF sy-subrc = 0.
+      CLEAR: <lg_field>.
+    ENDIF.
+ 
+    ASSIGN COMPONENT ''TRANSLATION_GRAPH_DEPTH_TEXT''
+           OF STRUCTURE ls_package_data
+           TO <lg_field>.
+    IF sy-subrc = 0.
+      CLEAR: <lg_field>.
+    ENDIF.
+ 
+    " Clear things related to local installation package
+    CLEAR: ls_package_data-namespace,
+           ls_package_data-dlvunit,
+           ls_package_data-tpclass,
+           ls_package_data-pdevclass.
+ 
+    " Not usable on customer systems
+    ASSIGN COMPONENT ''TRANSLATION_DEPTH''
+           OF STRUCTURE ls_package_data
+           TO <lg_field>.
+    IF sy-subrc = 0.
+      CLEAR: <lg_field>.
+    ENDIF.
+ 
+    ASSIGN COMPONENT ''TRANSLATION_GRAPH_DEPTH''
+           OF STRUCTURE ls_package_data
+           TO <lg_field>.
+    IF sy-subrc = 0.
+      CLEAR: <lg_field>.
+    ENDIF.
+ 
+    CLEAR: ls_package_data-korrflag.
+ 
+    io_xml->add( iv_name = ''DEVC''
+                 ig_data = ls_package_data ).
+ 
+    " Save package interface usages
+    li_package->get_permissions_to_use(
+      IMPORTING
+        e_permissions    = lt_intf_usages
+      EXCEPTIONS
+        object_invalid   = 1
+        unexpected_error = 2
+        OTHERS           = 3 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    LOOP AT lt_intf_usages INTO li_usage.
+      li_usage->get_all_attributes(
+        IMPORTING
+          e_permission_data = ls_usage_data
+        EXCEPTIONS
+          object_invalid    = 1
+          intern_err        = 2
+          OTHERS            = 3 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      CLEAR: ls_usage_data-pack_name, ls_usage_data-client_pak.
+ 
+      APPEND ls_usage_data TO lt_usage_data.
+    ENDLOOP.
+ 
+    IF lt_usage_data IS NOT INITIAL.
+      io_xml->add( iv_name = ''PERMISSION''
+                   ig_data = lt_usage_data ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OBJECT_INTF                 ', 'CLASS zcl_abapgit_object_intf DEFINITION PUBLIC FINAL INHERITING FROM zcl_abapgit_objects_program.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_object.
+ 
+    TYPES:
+      BEGIN OF ty_docu,
+        lines      TYPE tlinetab,
+        i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_lines,
+      END OF ty_docu.
+ 
+    TYPES:
+      BEGIN OF ty_intf,
+        vseointerf      TYPE vseointerf,
+        docu            TYPE ty_docu,
+        description     TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt,
+        description_sub TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt,
+      END OF ty_intf.
+ 
+    METHODS constructor
+      IMPORTING
+        is_item     TYPE zif_abapgit_definitions=>ty_item
+        iv_language TYPE spras.
+  PROTECTED SECTION.
+    METHODS deserialize_proxy
+      IMPORTING
+        iv_transport TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_docu
+      IMPORTING
+        !ii_xml  TYPE REF TO zif_abapgit_xml_input
+        !is_docu TYPE ty_docu
+      RAISING
+        zcx_abapgit_exception .
+    METHODS serialize_docu
+      IMPORTING
+                !ii_xml              TYPE REF TO zif_abapgit_xml_output
+                !it_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus OPTIONAL
+                !iv_clsname          TYPE seoclsname
+      RETURNING VALUE(rs_docu)       TYPE ty_docu
+      RAISING
+                zcx_abapgit_exception.
+    METHODS serialize_descr
+      IMPORTING
+                !ii_xml               TYPE REF TO zif_abapgit_xml_output
+                !iv_clsname           TYPE seoclsname
+      RETURNING VALUE(rs_description) TYPE ty_intf-description
+      RAISING
+                zcx_abapgit_exception.
+    METHODS serialize_descr_sub
+      IMPORTING
+                !ii_xml               TYPE REF TO zif_abapgit_xml_output
+                !iv_clsname           TYPE seoclsname
+      RETURNING VALUE(rs_description) TYPE ty_intf-description_sub
+      RAISING
+                zcx_abapgit_exception.
+    METHODS serialize_xml
+      IMPORTING
+        !io_xml TYPE REF TO zif_abapgit_xml_output
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_longtext_name,
+        attributes TYPE string VALUE ''LONGTEXTS_IA'',
+        methods    TYPE string VALUE ''LONGTEXTS_IO'',
+        events     TYPE string VALUE ''LONGTEXTS_IE'',
+      END OF c_longtext_name.
+ 
+    CONSTANTS:
+      BEGIN OF c_longtext_id,
+        interface  TYPE dokil-id VALUE ''IF'',
+        attributes TYPE dokil-id VALUE ''IA'',
+        methods    TYPE dokil-id VALUE ''IO'',
+        events     TYPE dokil-id VALUE ''IE'',
+      END OF c_longtext_id.
+ 
+    DATA mi_object_oriented_object_fct TYPE REF TO zif_abapgit_oo_object_fnc .
+ 
+    METHODS deserialize_pre_ddic
+      IMPORTING
+        ii_xml     TYPE REF TO zif_abapgit_xml_input
+        iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS deserialize_descriptions
+      IMPORTING
+        it_description TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt OPTIONAL.
+    METHODS deserialize_descr_sub
+      IMPORTING
+        it_description TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt OPTIONAL.
+    METHODS read_xml
+      IMPORTING
+                ii_xml         TYPE REF TO zif_abapgit_xml_input
+      RETURNING VALUE(rs_intf) TYPE ty_intf
+      RAISING
+                zcx_abapgit_exception.
+    METHODS read_json
+      RETURNING VALUE(rs_intf) TYPE ty_intf
+      RAISING
+                zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_OBJECT_INTF IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor(
+      is_item     = is_item
+      iv_language = iv_language ).
+    mi_object_oriented_object_fct = zcl_abapgit_oo_factory=>make( ms_item-obj_type ).
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_descriptions.
+    DATA:  ls_clskey TYPE seoclskey.
+    ls_clskey-clsname = ms_item-obj_name.
+ 
+    mi_object_oriented_object_fct->update_descriptions(
+      is_key          = ls_clskey
+      it_descriptions = it_description ).
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_descr_sub.
+    DATA:  ls_clskey TYPE seoclskey.
+    ls_clskey-clsname = ms_item-obj_name.
+ 
+    mi_object_oriented_object_fct->update_descriptions_sub(
+      is_key          = ls_clskey
+      it_descriptions = it_description ).
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_docu.
+    DATA: lv_object     TYPE dokhl-object,
+          ls_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_line.
+ 
+    lv_object = ms_item-obj_name.
+ 
+    IF lines( is_docu-lines ) = 0.
+      mi_object_oriented_object_fct->delete_documentation(
+        iv_id          = c_longtext_id-interface
+        iv_object_name = lv_object
+        iv_language    = mv_language ).
+      RETURN.
+    ENDIF.
+ 
+    mi_object_oriented_object_fct->create_documentation(
+      it_lines       = is_docu-lines
+      iv_id          = c_longtext_id-interface
+      iv_object_name = lv_object
+      iv_language    = mv_language ).
+ 
+    LOOP AT is_docu-i18n_lines INTO ls_i18n_lines.
+      mi_object_oriented_object_fct->create_documentation(
+        it_lines         = ls_i18n_lines-lines
+        iv_id            = c_longtext_id-interface
+        iv_object_name   = lv_object
+        iv_language      = ls_i18n_lines-language
+        iv_no_masterlang = abap_true ).
+    ENDLOOP.
+ 
+    deserialize_longtexts(
+      ii_xml           = ii_xml
+      iv_longtext_name = c_longtext_name-attributes
+      iv_longtext_id   = c_longtext_id-attributes ).
+ 
+    deserialize_longtexts(
+      ii_xml           = ii_xml
+      iv_longtext_name = c_longtext_name-methods
+      iv_longtext_id   = c_longtext_id-methods ).
+ 
+    deserialize_longtexts(
+      ii_xml           = ii_xml
+      iv_longtext_name = c_longtext_name-events
+      iv_longtext_id   = c_longtext_id-events ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_pre_ddic.
+ 
+    DATA ls_intf TYPE ty_intf.
+ 
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+      ls_intf = read_json( ).
+    ELSE.
+      ii_xml->read( EXPORTING iv_name = ''VSEOINTERF''
+                    CHANGING  cg_data = ls_intf-vseointerf ).
+    ENDIF.
+ 
+    mi_object_oriented_object_fct->create(
+      EXPORTING
+        iv_check      = abap_false
+        iv_package    = iv_package
+      CHANGING
+        cg_properties = ls_intf-vseointerf ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_proxy.
+ 
+    DATA: lv_transport    TYPE trkorr,
+          li_proxy_object TYPE REF TO if_px_main,
+          lv_name         TYPE prx_r3name,
+          lx_proxy_fault  TYPE REF TO cx_proxy_fault.
+ 
+    lv_name = ms_item-obj_name.
+ 
+    lv_transport = iv_transport.
+ 
+    TRY.
+        li_proxy_object = cl_pxn_factory=>create(
+                              application  = ''PROXY_UI''
+                              display_only = abap_false
+                              saveable     = abap_true
+                          )->if_pxn_factory~load_by_abap_name(
+                              object   = ms_item-obj_type
+                              obj_name = lv_name ).
+ 
+        li_proxy_object->activate(
+          EXPORTING
+            activate_all     = abap_true
+          CHANGING
+            transport_number = lv_transport ).
+ 
+        li_proxy_object->dequeue( ).
+ 
+      CATCH cx_proxy_fault INTO lx_proxy_fault.
+        IF li_proxy_object IS BOUND.
+          TRY.
+              li_proxy_object->dequeue( ).
+            CATCH cx_proxy_fault ##NO_HANDLER.
+          ENDTRY.
+        ENDIF.
+        zcx_abapgit_exception=>raise_with_text( lx_proxy_fault ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_json.
+    DATA lv_json_data TYPE xstring.
+    DATA ls_intf_aff TYPE zif_abapgit_aff_intf_v1=>ty_main.
+    DATA lo_aff_mapper TYPE REF TO zif_abapgit_aff_type_mapping.
+ 
+    lv_json_data = zif_abapgit_object~mo_files->read_raw( iv_ext = ''json'' ).
+    ls_intf_aff = lcl_aff_metadata_handler=>deserialize( lv_json_data ).
+ 
+    CREATE OBJECT lo_aff_mapper TYPE lcl_aff_type_mapping.
+    lo_aff_mapper->to_abapgit( EXPORTING iv_data = ls_intf_aff
+                                         iv_object_name = ms_item-obj_name
+                               IMPORTING es_data = rs_intf ).
+  ENDMETHOD.
+ 
+ 
+  METHOD read_xml.
+    ii_xml->read( EXPORTING iv_name = ''VSEOINTERF''
+                  CHANGING  cg_data = rs_intf-vseointerf ).
+    ii_xml->read( EXPORTING iv_name = ''DESCRIPTIONS''
+                  CHANGING  cg_data = rs_intf-description ).
+    ii_xml->read( EXPORTING iv_name = ''DESCRIPTIONS_SUB''
+                  CHANGING  cg_data = rs_intf-description_sub ).
+    ii_xml->read( EXPORTING iv_name = ''LINES''
+                  CHANGING  cg_data = rs_intf-docu-lines ).
+    ii_xml->read( EXPORTING iv_name = ''I18N_LINES''
+                  CHANGING  cg_data = rs_intf-docu-i18n_lines ).
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_descr.
+ 
+    DATA: lt_descriptions    TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt,
+          lv_language        TYPE spras,
+          lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    IF mo_i18n_params->ms_params-main_language_only = abap_true.
+      lv_language = mv_language.
+    ENDIF.
+ 
+    lt_descriptions = mi_object_oriented_object_fct->read_descriptions(
+      iv_object_name = iv_clsname
+      iv_language    = lv_language ).
+ 
+    " Remove technical languages
+    lt_language_filter = mo_i18n_params->build_language_filter( ).
+    DELETE lt_descriptions WHERE NOT langu IN lt_language_filter AND langu <> mv_language.
+ 
+    IF lines( lt_descriptions ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    rs_description = lt_descriptions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_descr_sub.
+ 
+    DATA: lt_descriptions    TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt,
+          lv_language        TYPE spras,
+          lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    IF mo_i18n_params->ms_params-main_language_only = abap_true.
+      lv_language = mv_language.
+    ENDIF.
+ 
+    lt_descriptions = mi_object_oriented_object_fct->read_descriptions_sub(
+      iv_object_name = iv_clsname
+      iv_language    = lv_language ).
+ 
+    " Remove technical languages
+    lt_language_filter = mo_i18n_params->build_language_filter( ).
+    DELETE lt_descriptions WHERE NOT langu IN lt_language_filter AND langu <> mv_language.
+ 
+    IF lines( lt_descriptions ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    rs_description = lt_descriptions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_docu.
+ 
+    DATA: lt_lines      TYPE tlinetab,
+          lv_object     TYPE dokhl-object,
+          lv_langu      TYPE sy-langu,
+          lt_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_lines,
+          ls_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_line.
+ 
+    lv_object = iv_clsname.
+ 
+    lt_lines = mi_object_oriented_object_fct->read_documentation(
+      iv_id          = c_longtext_id-interface
+      iv_object_name = lv_object
+      iv_language    = mv_language ).
+ 
+    rs_docu-lines = lt_lines.
+ 
+    IF mo_i18n_params->ms_params-main_language_only = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT it_langu_additional INTO lv_langu.
+ 
+      lt_lines = mi_object_oriented_object_fct->read_documentation(
+        iv_id          = c_longtext_id-interface
+        iv_object_name = lv_object
+        iv_language    = lv_langu ).
+ 
+      IF lines( lt_lines ) > 0.
+        CLEAR ls_i18n_lines.
+        ls_i18n_lines-language = lv_langu.
+        ls_i18n_lines-lines    = lt_lines.
+        INSERT ls_i18n_lines INTO TABLE lt_i18n_lines.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    rs_docu-i18n_lines = lt_i18n_lines.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_xml.
+ 
+    DATA:
+      ls_intf             TYPE ty_intf,
+      ls_clskey           TYPE seoclskey,
+      lv_serialized_data  TYPE xstring,
+      lt_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus.
+ 
+    ls_clskey-clsname = ms_item-obj_name.
+ 
+    ls_intf-vseointerf = mi_object_oriented_object_fct->get_interface_properties( ls_clskey ).
+ 
+    " Select all active translations of documentation
+    " Skip main language - it was already serialized
+    SELECT DISTINCT langu
+      INTO TABLE lt_langu_additional
+      FROM dokhl
+      WHERE id     = c_longtext_id-interface
+        AND object = ls_clskey-clsname
+        AND langu  <> mv_language.
+ 
+    ls_intf-docu = serialize_docu(
+      ii_xml              = io_xml
+      iv_clsname          = ls_clskey-clsname
+      it_langu_additional = lt_langu_additional ).
+ 
+    ls_intf-description = serialize_descr( ii_xml     = io_xml
+                                           iv_clsname = ls_clskey-clsname ).
+    ls_intf-description_sub = serialize_descr_sub( ii_xml     = io_xml
+                                                   iv_clsname = ls_clskey-clsname ).
+ 
+    " HERE: switch with feature flag for XML or JSON file format
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+      lv_serialized_data = lcl_aff_metadata_handler=>serialize( ls_intf ).
+      zif_abapgit_object~mo_files->add_raw( iv_ext  = ''json''
+                                            iv_data = lv_serialized_data ).
+ 
+    ELSE.
+      io_xml->add( iv_name = ''VSEOINTERF''
+                   ig_data = ls_intf-vseointerf ).
+      io_xml->add( iv_name = ''DESCRIPTIONS''
+                   ig_data = ls_intf-description ).
+      io_xml->add( iv_name = ''DESCRIPTIONS_SUB''
+                   ig_data = ls_intf-description_sub ).
+      io_xml->add( iv_name = ''LINES''
+                   ig_data = ls_intf-docu-lines ).
+      io_xml->add( iv_name = ''I18N_LINES''
+                   ig_data = ls_intf-docu-i18n_lines ).
+ 
+      serialize_longtexts(
+        ii_xml           = io_xml
+        iv_longtext_name = c_longtext_name-attributes
+        iv_longtext_id   = c_longtext_id-attributes ).
+ 
+      serialize_longtexts(
+        ii_xml           = io_xml
+        iv_longtext_name = c_longtext_name-methods
+        iv_longtext_id   = c_longtext_id-methods ).
+ 
+      serialize_longtexts(
+        ii_xml           = io_xml
+        iv_longtext_name = c_longtext_name-events
+        iv_longtext_id   = c_longtext_id-events ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~changed_by.
+    TYPES: BEGIN OF ty_includes,
+             programm TYPE syrepid,
+           END OF ty_includes.
+ 
+    TYPES: BEGIN OF ty_reposrc,
+             unam  TYPE reposrc-unam,
+             udat  TYPE reposrc-udat,
+             utime TYPE reposrc-utime,
+           END OF ty_reposrc.
+ 
+    DATA: lt_reposrc  TYPE STANDARD TABLE OF ty_reposrc,
+          ls_reposrc  LIKE LINE OF lt_reposrc,
+          lt_includes TYPE STANDARD TABLE OF ty_includes.
+ 
+    lt_includes = mi_object_oriented_object_fct->get_includes( ms_item-obj_name ).
+    ASSERT lines( lt_includes ) > 0.
+ 
+    SELECT unam udat utime FROM reposrc
+      INTO TABLE lt_reposrc
+      FOR ALL ENTRIES IN lt_includes
+      WHERE progname = lt_includes-programm
+      AND r3state = ''A''.
+    IF sy-subrc <> 0.
+      rv_user = c_user_unknown.
+    ELSE.
+      SORT lt_reposrc BY udat DESCENDING utime DESCENDING.
+      READ TABLE lt_reposrc INDEX 1 INTO ls_reposrc.
+      ASSERT sy-subrc = 0.
+      rv_user = ls_reposrc-unam.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~delete.
+    DATA: ls_clskey     TYPE seoclskey,
+          ls_vseointerf TYPE vseointerf.
+ 
+    ls_clskey-clsname = ms_item-obj_name.
+    ls_vseointerf = mi_object_oriented_object_fct->get_interface_properties( ls_clskey ).
+ 
+    IF ls_vseointerf-clsproxy = abap_true.
+      " Proxy interfaces are managed via SPRX
+      RETURN.
+    ENDIF.
+ 
+    IF zif_abapgit_object~exists( ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    corr_insert( iv_package ).
+ 
+    mi_object_oriented_object_fct->delete( ls_clskey ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~deserialize.
+    DATA: lt_source TYPE rswsourcet,
+          ls_clskey TYPE seoclskey,
+          ls_intf   TYPE ty_intf.
+ 
+    IF iv_step = zif_abapgit_object=>gc_step_id-abap.
+      " HERE: switch with feature flag between XML and JSON file format
+      IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+        ls_intf = read_json( ).
+      ELSE.
+        ls_intf = read_xml( io_xml ).
+      ENDIF.
+ 
+      IF ls_intf-vseointerf-clsproxy = abap_true.
+        " Proxy interfaces are managed via SPRX
+        deserialize_proxy( iv_transport ).
+ 
+      ELSE.
+        mi_object_oriented_object_fct->create(
+          EXPORTING
+            iv_check      = abap_true
+            iv_package    = iv_package
+          CHANGING
+            cg_properties = ls_intf-vseointerf ).
+ 
+        ls_clskey-clsname = ms_item-obj_name.
+        lt_source = zif_abapgit_object~mo_files->read_abap( ).
+        mi_object_oriented_object_fct->deserialize_source(
+          is_key     = ls_clskey
+          iv_package = iv_package
+          it_source  = lt_source ).
+ 
+        deserialize_descriptions( it_description = ls_intf-description ).
+ 
+        deserialize_descr_sub( it_description = ls_intf-description_sub ).
+ 
+        deserialize_docu(
+          is_docu = ls_intf-docu
+          ii_xml  = io_xml ).
+ 
+        mi_object_oriented_object_fct->add_to_activation_list( ms_item ).
+      ENDIF.
+ 
+    ELSEIF iv_step = zif_abapgit_object=>gc_step_id-early.
+ 
+      " If interface does not exist, create it
+      " so DDIC that depends on it does not fail activation
+      IF zif_abapgit_object~exists( ) = abap_false.
+        deserialize_pre_ddic(
+          ii_xml     = io_xml
+          iv_package = iv_package ).
+      ELSE.
+        corr_insert( iv_package ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~exists.
+ 
+    DATA: ls_class_key TYPE seoclskey,
+          lv_category  TYPE seoclassdf-category.
+ 
+    ls_class_key-clsname = ms_item-obj_name.
+ 
+    rv_bool = mi_object_oriented_object_fct->exists( ls_class_key ).
+ 
+    IF rv_bool = abap_true.
+      SELECT SINGLE category FROM seoclassdf INTO lv_category
+        WHERE clsname = ls_class_key-clsname
+        AND ( version = ''1''
+        OR version = ''0'' ) ##WARN_OK.                   "#EC CI_GENBUFF
+      IF sy-subrc = 0 AND lv_category = seoc_category_webdynpro_class.
+        rv_bool = abap_false.
+      ELSE.
+        SELECT SINGLE obj_name FROM sproxhdr INTO ls_class_key-clsname
+          WHERE object = ''INTF'' AND obj_name = ls_class_key-clsname.
+        IF sy-subrc = 0.
+          " generated by proxy
+          rv_bool = abap_false.
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_comparator.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_order.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_steps.
+    APPEND zif_abapgit_object=>gc_step_id-early TO rt_steps.
+    APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_metadata.
+    rs_metadata = get_metadata( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_active.
+    rv_active = is_active( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_locked.
+ 
+    DATA: lv_object TYPE eqegraarg.
+ 
+    lv_object = |{ ms_item-obj_name }|.
+    OVERLAY lv_object WITH ''==============================P''.
+    lv_object = lv_object && ''*''.
+ 
+    rv_is_locked = exists_a_lock_entry_for( iv_lock_object = ''ESEOCLASS''
+                                            iv_argument    = lv_object ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~jump.
+    " Covered by ZCL_ABAPGIT_OBJECTS=>JUMP
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_filename_to_object.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_object_to_filename.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~serialize.
+ 
+    DATA: lt_source        TYPE seop_source_string,
+          ls_interface_key TYPE seoclskey.
+ 
+    ls_interface_key-clsname = ms_item-obj_name.
+ 
+    IF zif_abapgit_object~exists( ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    CALL FUNCTION ''SEO_BUFFER_REFRESH''
+      EXPORTING
+        version = seoc_version_active
+        force   = abap_true.
+    CALL FUNCTION ''SEO_BUFFER_REFRESH''
+      EXPORTING
+        version = seoc_version_inactive
+        force   = abap_true.
+ 
+    lt_source = mi_object_oriented_object_fct->serialize_abap( ls_interface_key ).
+ 
+    zif_abapgit_object~mo_files->add_abap( lt_source ).
+ 
+    serialize_xml( io_xml ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OBJECTS                     ', 'CLASS zcl_abapgit_objects DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      ty_types_tt TYPE SORTED TABLE OF tadir-object WITH UNIQUE KEY table_line .
+    TYPES:
+      BEGIN OF ty_serialization,
+        files TYPE zif_abapgit_git_definitions=>ty_files_tt,
+        item  TYPE zif_abapgit_definitions=>ty_item,
+      END OF ty_serialization .
+ 
+    CLASS-METHODS serialize
+      IMPORTING
+        !is_item                 TYPE zif_abapgit_definitions=>ty_item
+        !io_i18n_params          TYPE REF TO zcl_abapgit_i18n_params
+      RETURNING
+        VALUE(rs_files_and_item) TYPE ty_serialization
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS deserialize
+      IMPORTING
+        !io_repo                 TYPE REF TO zcl_abapgit_repo
+        !is_checks               TYPE zif_abapgit_definitions=>ty_deserialize_checks
+        !ii_log                  TYPE REF TO zif_abapgit_log
+      RETURNING
+        VALUE(rt_accessed_files) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS deserialize_checks
+      IMPORTING
+        !io_repo         TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete
+      IMPORTING
+        !it_tadir  TYPE zif_abapgit_definitions=>ty_tadir_tt
+        !is_checks TYPE zif_abapgit_definitions=>ty_delete_checks OPTIONAL
+        !ii_log    TYPE REF TO zif_abapgit_log OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS jump
+      IMPORTING
+        !is_item        TYPE zif_abapgit_definitions=>ty_item
+        !is_sub_item    TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !iv_filename    TYPE string OPTIONAL
+        !iv_line_number TYPE i OPTIONAL
+        !iv_new_window  TYPE abap_bool DEFAULT abap_true
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS changed_by
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+        !is_sub_item   TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !iv_filename   TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_user) TYPE syuname .
+    CLASS-METHODS is_supported
+      IMPORTING
+        !is_item        TYPE zif_abapgit_definitions=>ty_item
+        !iv_native_only TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_bool)  TYPE abap_bool .
+    CLASS-METHODS is_type_supported
+      IMPORTING
+        !iv_obj_type   TYPE zif_abapgit_definitions=>ty_item-obj_type
+      RETURNING
+        VALUE(rv_bool) TYPE abap_bool .
+    CLASS-METHODS exists
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_bool) TYPE abap_bool .
+    CLASS-METHODS supported_list
+      RETURNING
+        VALUE(rt_types) TYPE ty_types_tt .
+    CLASS-METHODS is_active
+      IMPORTING
+        !is_item         TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_active) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_supported_types,
+        obj_type  TYPE tadir-object,
+        supported TYPE abap_bool,
+      END OF ty_supported_types.
+ 
+    TYPES: ty_supported_types_tt TYPE SORTED TABLE OF ty_supported_types WITH UNIQUE KEY obj_type.
+ 
+    TYPES:
+      BEGIN OF ty_obj_serializer_item,
+        item     TYPE zif_abapgit_definitions=>ty_item,
+        metadata TYPE zif_abapgit_definitions=>ty_metadata,
+      END OF ty_obj_serializer_item .
+    TYPES:
+      ty_obj_serializer_map TYPE SORTED TABLE OF ty_obj_serializer_item WITH UNIQUE KEY item .
+ 
+    CLASS-DATA gt_obj_serializer_map TYPE ty_obj_serializer_map .
+    CLASS-DATA gt_supported_obj_types TYPE ty_supported_types_tt .
+    CLASS-DATA gv_supported_obj_types_loaded TYPE abap_bool .
+ 
+    CLASS-METHODS check_duplicates
+      IMPORTING
+        !it_files TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS class_name
+      IMPORTING
+        !is_item             TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_class_name) TYPE string .
+    CLASS-METHODS update_package_tree
+      IMPORTING
+        !iv_package TYPE devclass .
+    CLASS-METHODS delete_object
+      IMPORTING
+        !iv_package   TYPE devclass
+        !is_item      TYPE zif_abapgit_definitions=>ty_item
+        !iv_transport TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS compare_remote_to_local
+      IMPORTING
+        !ii_object TYPE REF TO zif_abapgit_object
+        !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !is_result TYPE zif_abapgit_definitions=>ty_result
+        !ii_log    TYPE REF TO zif_abapgit_log
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS deserialize_steps
+      IMPORTING
+        !it_steps     TYPE zif_abapgit_objects=>ty_step_data_tt
+        !ii_log       TYPE REF TO zif_abapgit_log
+        !iv_transport TYPE trkorr
+      CHANGING
+        !ct_files     TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS deserialize_objects
+      IMPORTING
+        !is_step      TYPE zif_abapgit_objects=>ty_step_data
+        !ii_log       TYPE REF TO zif_abapgit_log
+        !iv_transport TYPE trkorr
+      CHANGING
+        !ct_files     TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS check_objects_locked
+      IMPORTING
+        !iv_language TYPE spras
+        !it_items    TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_object
+      IMPORTING
+        !is_item        TYPE zif_abapgit_definitions=>ty_item
+        !io_i18n_params TYPE REF TO zcl_abapgit_i18n_params OPTIONAL
+        !is_metadata    TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
+        !iv_native_only TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_obj)   TYPE REF TO zif_abapgit_object
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS map_tadir_to_items
+      IMPORTING
+        !it_tadir       TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RETURNING
+        VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt .
+    CLASS-METHODS map_results_to_items
+      IMPORTING
+        !it_results     TYPE zif_abapgit_definitions=>ty_results_tt
+      RETURNING
+        VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt .
+    CLASS-METHODS get_deserialize_steps
+      RETURNING
+        VALUE(rt_steps) TYPE zif_abapgit_objects=>ty_step_data_tt .
+    CLASS-METHODS check_main_package
+      IMPORTING
+        !iv_package  TYPE devclass
+        !iv_obj_type TYPE tadir-object
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS change_package_assignments
+      IMPORTING
+        !is_item TYPE zif_abapgit_definitions=>ty_item
+        !ii_log  TYPE REF TO zif_abapgit_log .
+    CLASS-METHODS determine_i18n_params
+      IMPORTING
+        !io_dot                TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_main_language_only TYPE abap_bool
+      RETURNING
+        VALUE(rs_i18n_params)  TYPE zif_abapgit_definitions=>ty_i18n_params
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS get_extra_from_filename
+      IMPORTING
+        !iv_filename    TYPE string
+      RETURNING
+        VALUE(rv_extra) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_objects IMPLEMENTATION.
+ 
+ 
+  METHOD changed_by.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    " For unsupported objects, return empty string
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        li_obj = create_object( is_item ).
+        rv_user = li_obj->changed_by( get_extra_from_filename( iv_filename ) ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+        " Ignore errors
+    ENDTRY.
+ 
+    IF rv_user IS INITIAL.
+      " Eg. ".abapgit.xml" file
+      rv_user = zcl_abapgit_objects_super=>c_user_unknown.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD change_package_assignments.
+ 
+    CALL FUNCTION ''TR_TADIR_INTERFACE''
+      EXPORTING
+        wi_tadir_pgmid    = ''R3TR''
+        wi_tadir_object   = is_item-obj_type
+        wi_tadir_obj_name = is_item-obj_name
+        wi_tadir_devclass = is_item-devclass
+        wi_test_modus     = abap_false
+      EXCEPTIONS
+        OTHERS            = 1.
+    IF sy-subrc = 0.
+      ii_log->add_success( iv_msg  = |Object { is_item-obj_name } assigned to package { is_item-devclass }|
+                           is_item = is_item ).
+    ELSE.
+      ii_log->add_error( iv_msg  = |Package change of object { is_item-obj_name } failed|
+                         is_item = is_item ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_duplicates.
+ 
+    DATA: lt_files          TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lv_path           TYPE string,
+          lv_filename       TYPE string,
+          lt_duplicates     TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          lv_duplicates     LIKE LINE OF lt_duplicates,
+          lv_all_duplicates TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files.
+ 
+    lt_files = it_files.
+    SORT lt_files BY path ASCENDING filename ASCENDING.
+ 
+    LOOP AT lt_files ASSIGNING <ls_file>.
+      IF lv_path = <ls_file>-path AND lv_filename = <ls_file>-filename.
+        CONCATENATE <ls_file>-path <ls_file>-filename INTO lv_duplicates.
+        APPEND lv_duplicates TO lt_duplicates.
+      ENDIF.
+      lv_path = <ls_file>-path.
+      lv_filename = <ls_file>-filename.
+    ENDLOOP.
+ 
+    IF lt_duplicates IS NOT INITIAL.
+      CONCATENATE LINES OF lt_duplicates INTO lv_all_duplicates SEPARATED BY \`, \`.
+      zcx_abapgit_exception=>raise( |Duplicates: { lv_all_duplicates }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_main_package.
+ 
+    " check package restrictions, closed package, descriptive or
+    " functional package
+    cl_pak_object_types=>check_object_type(
+      EXPORTING
+        i_working_mode         = ''I''
+        i_package_name         = iv_package
+        i_pgmid                = ''R3TR''
+        i_object_type          = iv_obj_type
+      EXCEPTIONS
+        wrong_object_type      = 1
+        package_not_extensible = 2
+        package_not_loaded     = 3
+        OTHERS                 = 4 ).
+    CASE sy-subrc.
+      WHEN 0.
+        RETURN.
+      WHEN 2.
+        zcx_abapgit_exception=>raise( |Object type { iv_obj_type } not allowed for package { iv_package }| ).
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise_t100(  ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_objects_locked.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    FIELD-SYMBOLS: <ls_item> LIKE LINE OF it_items.
+ 
+    LOOP AT it_items ASSIGNING <ls_item>.
+ 
+      " You should remember that we ignore not supported objects here,
+      " because otherwise the process aborts which is not desired
+      IF is_type_supported( <ls_item>-obj_type ) = abap_false.
+        CONTINUE.
+      ENDIF.
+ 
+      li_obj = create_object( <ls_item> ).
+ 
+      IF li_obj->is_locked( ) = abap_true.
+        zcx_abapgit_exception=>raise( |Object { <ls_item>-obj_type } { <ls_item>-obj_name } |
+                                   && |is locked. Action not possible.| ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_name.
+ 
+    CONCATENATE ''ZCL_ABAPGIT_OBJECT_'' is_item-obj_type INTO rv_class_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD compare_remote_to_local.
+* this method is used for comparing local with remote objects
+* before pull, this is useful eg. when overwriting a TABL object.
+* only the main XML file is used for comparison
+ 
+    DATA: ls_remote_file    TYPE zif_abapgit_git_definitions=>ty_file,
+          li_remote_version TYPE REF TO zif_abapgit_xml_input,
+          lv_count          TYPE i,
+          ls_result         TYPE zif_abapgit_comparator=>ty_result,
+          lv_answer         TYPE string,
+          li_comparator     TYPE REF TO zif_abapgit_comparator,
+          ls_item           TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIND ALL OCCURRENCES OF ''.'' IN is_result-filename MATCH COUNT lv_count.
+ 
+    IF is_result-filename CS ''.XML'' AND lv_count = 2.
+      IF ii_object->exists( ) = abap_false.
+        RETURN.
+      ENDIF.
+ 
+      READ TABLE it_remote WITH KEY file
+        COMPONENTS filename = is_result-filename INTO ls_remote_file.
+      IF sy-subrc <> 0. "if file does not exist in remote, we don''t need to validate
+        RETURN.
+      ENDIF.
+ 
+      li_comparator = ii_object->get_comparator( ).
+      IF NOT li_comparator IS BOUND.
+        RETURN.
+      ENDIF.
+ 
+      CREATE OBJECT li_remote_version
+        TYPE zcl_abapgit_xml_input
+        EXPORTING
+          iv_xml      = zcl_abapgit_convert=>xstring_to_string_utf8( ls_remote_file-data )
+          iv_filename = ls_remote_file-filename.
+ 
+      ls_result = li_comparator->compare( ii_remote = li_remote_version
+                                          ii_log = ii_log ).
+      IF ls_result-text IS INITIAL.
+        RETURN.
+      ENDIF.
+ 
+      "log comparison result
+      ls_item-obj_type = is_result-obj_type.
+      ls_item-obj_name = is_result-obj_name.
+      ii_log->add_warning( iv_msg = ls_result-text
+                           is_item = ls_item ).
+ 
+      "continue or abort?
+      IF zcl_abapgit_ui_factory=>get_frontend_services( )->gui_is_available( ) = abap_true.
+        lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+          iv_titlebar              = ''Warning''
+          iv_text_question         = ls_result-text
+          iv_text_button_1         = ''Pull Anyway''
+          iv_icon_button_1         = ''ICON_OKAY''
+          iv_text_button_2         = ''Cancel''
+          iv_icon_button_2         = ''ICON_CANCEL''
+          iv_default_button        = ''2''
+          iv_display_cancel_button = abap_false ).
+ 
+        IF lv_answer = ''2''.
+          zcx_abapgit_exception=>raise( |Deserialization for object { is_result-obj_name } | &
+                                        |(type { is_result-obj_type }) aborted by user| ).
+        ENDIF.
+      ELSE.
+        zcx_abapgit_exception=>raise( |Deserialization for object { is_result-obj_name } | &
+                                      |(type { is_result-obj_type }) aborted, user descision required| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_object.
+ 
+    DATA: lv_message            TYPE string,
+          lv_class_name         TYPE string,
+          ls_obj_serializer_map LIKE LINE OF gt_obj_serializer_map.
+    DATA lo_obj_base TYPE REF TO zcl_abapgit_objects_super.
+    DATA lo_i18n_params TYPE REF TO zcl_abapgit_i18n_params.
+ 
+    IF io_i18n_params IS BOUND.
+      lo_i18n_params = io_i18n_params.
+    ELSE.
+      lo_i18n_params = zcl_abapgit_i18n_params=>new( ). " All defaults
+    ENDIF.
+ 
+    READ TABLE gt_obj_serializer_map
+      INTO ls_obj_serializer_map WITH KEY item = is_item.
+    IF sy-subrc = 0.
+      lv_class_name = ls_obj_serializer_map-metadata-class_.
+    ELSEIF is_metadata IS NOT INITIAL.
+*        Metadata is provided only on deserialization
+*        Once this has been triggered, the same deserializer shall be used
+*        for subsequent processes.
+*        Thus, buffer the metadata afterwards
+      ls_obj_serializer_map-item      = is_item.
+      ls_obj_serializer_map-metadata  = is_metadata.
+      INSERT ls_obj_serializer_map INTO TABLE gt_obj_serializer_map.
+      lv_class_name = is_metadata-class_.
+    ELSE.
+      lv_class_name = class_name( is_item ).
+    ENDIF.
+ 
+    REPLACE FIRST OCCURRENCE OF ''LCL'' IN lv_class_name WITH ''ZCL_ABAPGIT''.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      " Prevent accidental usage of object handlers in the developer version
+      lv_class_name = |\\\\PROGRAM={ sy-repid }\\\\CLASS={ lv_class_name }|.
+    ENDIF.
+ 
+    TRY.
+        CREATE OBJECT ri_obj TYPE (lv_class_name)
+          EXPORTING
+            is_item     = is_item
+            iv_language = lo_i18n_params->ms_params-main_language.
+      CATCH cx_sy_create_object_error.
+        lv_message = |Object type { is_item-obj_type } is not supported by this system|.
+        IF iv_native_only = abap_false.
+          TRY. " 2nd step, try looking for plugins
+              CREATE OBJECT ri_obj TYPE zcl_abapgit_objects_bridge
+                EXPORTING
+                  is_item = is_item.
+            CATCH cx_sy_create_object_error.
+              zcx_abapgit_exception=>raise( lv_message ).
+          ENDTRY.
+        ELSE. " No native support? -> fail
+          zcx_abapgit_exception=>raise( lv_message ).
+        ENDIF.
+    ENDTRY.
+ 
+    IF ri_obj IS BOUND.
+      lo_obj_base ?= ri_obj.
+      lo_obj_base->mo_i18n_params = lo_i18n_params.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete.
+ 
+    DATA: ls_item     TYPE zif_abapgit_definitions=>ty_item,
+          li_progress TYPE REF TO zif_abapgit_progress,
+          lt_tadir    LIKE it_tadir,
+          lt_deleted  LIKE it_tadir,
+          lt_items    TYPE zif_abapgit_definitions=>ty_items_tt,
+          lx_error    TYPE REF TO zcx_abapgit_exception,
+          lv_count    TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
+ 
+    IF it_tadir IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lt_tadir = it_tadir.
+ 
+    IF ii_log IS BOUND.
+      IF lines( lt_tadir ) = 1.
+        ii_log->add_info( |>>> Deleting 1 object| ).
+      ELSE.
+        ii_log->add_info( |>>> Deleting { lines( lt_tadir ) } objects| ).
+      ENDIF.
+    ENDIF.
+ 
+    IF is_checks-transport-required = abap_true.
+      zcl_abapgit_default_transport=>get_instance( )->set( is_checks-transport-transport ).
+    ENDIF.
+ 
+    TRY.
+        zcl_abapgit_dependencies=>resolve( CHANGING ct_tadir = lt_tadir ).
+ 
+        li_progress = zcl_abapgit_progress=>get_instance( lines( lt_tadir ) ).
+ 
+        lt_items = map_tadir_to_items( lt_tadir ).
+ 
+        check_objects_locked( iv_language = zif_abapgit_definitions=>c_english
+                              it_items    = lt_items ).
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+        zcl_abapgit_default_transport=>get_instance( )->reset( ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+    lv_count = 1.
+    DO.
+      CLEAR lt_deleted.
+      LOOP AT lt_tadir ASSIGNING <ls_tadir>.
+        li_progress->show( iv_current = lv_count
+                           iv_text    = |Delete { <ls_tadir>-obj_name }| ).
+ 
+        CLEAR ls_item.
+        ls_item-obj_type = <ls_tadir>-object.
+        ls_item-obj_name = <ls_tadir>-obj_name.
+ 
+        TRY.
+            delete_object(
+              iv_package   = <ls_tadir>-devclass
+              is_item      = ls_item
+              iv_transport = is_checks-transport-transport ).
+ 
+            INSERT <ls_tadir> INTO TABLE lt_deleted.
+            DELETE lt_tadir.
+            lv_count = lv_count + 1.
+ 
+            " make sure to save object deletions
+            COMMIT WORK.
+ 
+            IF ii_log IS BOUND.
+              ii_log->add_info( iv_msg  = |Object { ls_item-obj_type } { ls_item-obj_name } deleted|
+                                is_item = ls_item ).
+            ENDIF.
+ 
+          CATCH zcx_abapgit_exception INTO lx_error.
+            IF ii_log IS BOUND.
+              ii_log->add_exception( ix_exc  = lx_error
+                                     is_item = ls_item ).
+              ii_log->add_error( iv_msg  = |Deletion of object { ls_item-obj_name } failed|
+                                 is_item = ls_item ).
+            ENDIF.
+        ENDTRY.
+ 
+      ENDLOOP.
+ 
+      " Exit if done or nothing else was deleted
+      IF lines( lt_tadir ) = 0 OR lines( lt_deleted ) = 0.
+        EXIT.
+      ENDIF.
+    ENDDO.
+ 
+    zcl_abapgit_default_transport=>get_instance( )->reset( ).
+ 
+    IF lx_error IS BOUND AND lines( lt_tadir ) > 0.
+      zcx_abapgit_exception=>raise( ''Error during uninstall. Check the log.'' ).
+    ENDIF.
+ 
+    li_progress->off( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_object.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    " Nothing to do for unsupported objects
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    li_obj = create_object( is_item ).
+    li_obj->delete( iv_package   = iv_package
+                    iv_transport = iv_transport ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize.
+ 
+    DATA: ls_item     TYPE zif_abapgit_definitions=>ty_item,
+          li_obj      TYPE REF TO zif_abapgit_object,
+          lt_remote   TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lv_package  TYPE devclass,
+          lo_files    TYPE REF TO zcl_abapgit_objects_files,
+          ls_metadata TYPE zif_abapgit_definitions=>ty_metadata,
+          lo_xml      TYPE REF TO zif_abapgit_xml_input,
+          lt_results  TYPE zif_abapgit_definitions=>ty_results_tt,
+          li_progress TYPE REF TO zif_abapgit_progress,
+          lv_path     TYPE string,
+          lt_items    TYPE zif_abapgit_definitions=>ty_items_tt,
+          lt_steps_id TYPE zif_abapgit_definitions=>ty_deserialization_step_tt,
+          lt_steps    TYPE zif_abapgit_objects=>ty_step_data_tt,
+          lx_exc      TYPE REF TO zcx_abapgit_exception.
+    DATA lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
+    DATA lo_i18n_params TYPE REF TO zcl_abapgit_i18n_params.
+    DATA lo_timer TYPE REF TO zcl_abapgit_timer.
+    DATA lo_abap_language_vers TYPE REF TO zcl_abapgit_abap_language_vers.
+ 
+    FIELD-SYMBOLS: <ls_result>  TYPE zif_abapgit_definitions=>ty_result,
+                   <lv_step_id> TYPE LINE OF zif_abapgit_definitions=>ty_deserialization_step_tt,
+                   <ls_step>    TYPE LINE OF zif_abapgit_objects=>ty_step_data_tt,
+                   <ls_deser>   TYPE LINE OF zif_abapgit_objects=>ty_deserialization_tt.
+ 
+    lt_steps = get_deserialize_steps( ).
+ 
+    lv_package = io_repo->get_package( ).
+ 
+    IF is_checks-transport-required = abap_true.
+      zcl_abapgit_default_transport=>get_instance( )->set( is_checks-transport-transport ).
+    ENDIF.
+ 
+    zcl_abapgit_objects_activation=>clear( ).
+ 
+    lt_remote = io_repo->get_files_remote( iv_ignore_files = abap_true ).
+ 
+    lt_results = zcl_abapgit_file_deserialize=>get_results(
+      io_repo = io_repo
+      ii_log = ii_log ).
+ 
+    IF lt_results IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    zcl_abapgit_objects_check=>checks_adjust(
+      EXPORTING
+        io_repo    = io_repo
+        is_checks  = is_checks
+      CHANGING
+        ct_results = lt_results ).
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( lt_results ) ).
+ 
+    lt_items = map_results_to_items( lt_results ).
+ 
+    lo_timer = zcl_abapgit_timer=>create(
+      iv_text  = ''Deserialize:''
+      iv_count = lines( lt_items ) )->start( ).
+ 
+    zcl_abapgit_factory=>get_cts_api( )->confirm_transport_messages( ).
+ 
+    check_objects_locked( iv_language = io_repo->get_dot_abapgit( )->get_main_language( )
+                          it_items    = lt_items ).
+ 
+    lo_i18n_params = zcl_abapgit_i18n_params=>new( is_params = determine_i18n_params(
+      io_dot                = io_repo->get_dot_abapgit( )
+      iv_main_language_only = io_repo->get_local_settings( )-main_language_only ) ).
+ 
+    IF lines( lt_items ) = 1.
+      ii_log->add_info( |>>> Deserializing 1 object| ).
+    ELSE.
+      ii_log->add_info( |>>> Deserializing { lines( lt_items ) } objects| ).
+    ENDIF.
+ 
+    CREATE OBJECT lo_abap_language_vers.
+ 
+    lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
+    LOOP AT lt_results ASSIGNING <ls_result>.
+      li_progress->show( iv_current = sy-tabix
+                         iv_text    = |Prepare Deserialize: { <ls_result>-obj_type } { <ls_result>-obj_name }| ).
+ 
+      CLEAR ls_item.
+      ls_item-obj_type = <ls_result>-obj_type.
+      ls_item-obj_name = <ls_result>-obj_name.
+ 
+      "error handling & logging added
+      TRY.
+          IF ls_item-obj_type <> ''NSPC''.
+            " If package does not exist yet, it will be created with this call
+            lv_package = lo_folder_logic->path_to_package(
+              iv_top  = io_repo->get_package( )
+              io_dot  = io_repo->get_dot_abapgit( )
+              iv_path = <ls_result>-path ).
+ 
+            check_main_package(
+              iv_package  = lv_package
+              iv_obj_type = ls_item-obj_type ).
+          ENDIF.
+ 
+          IF ls_item-obj_type = ''DEVC''.
+            " Packages have the same filename across different folders. The path needs to be supplied
+            " to find the correct file.
+            lv_path = <ls_result>-path.
+          ENDIF.
+ 
+          ls_item-devclass = lv_package.
+          ls_item-abap_language_version = lo_abap_language_vers->get_abap_language_vers_by_objt(
+                                                                    iv_object_type = ls_item-obj_type
+                                                                    iv_package = lv_package ).
+ 
+          IF <ls_result>-packmove = abap_true.
+            " Move object to new package
+            change_package_assignments( is_item = ls_item
+                                        ii_log  = ii_log ).
+            " No other changes required
+            CONTINUE.
+          ENDIF.
+ 
+          " Create or update object
+          CREATE OBJECT lo_files
+            EXPORTING
+              is_item = ls_item
+              iv_path = lv_path.
+ 
+          lo_files->set_files( lt_remote ).
+ 
+          IF lo_files->is_json_metadata( ) = abap_false.
+            "analyze XML in order to instantiate the proper serializer
+            lo_xml = lo_files->read_xml( ).
+            ls_metadata = lo_xml->get_metadata( ).
+          ELSE.
+            " there''s no XML and metadata for JSON format
+            CLEAR: lo_xml, ls_metadata.
+          ENDIF.
+ 
+          li_obj = create_object(
+            is_item        = ls_item
+            is_metadata    = ls_metadata
+            io_i18n_params = lo_i18n_params ).
+ 
+          compare_remote_to_local(
+            ii_object = li_obj
+            it_remote = lt_remote
+            is_result = <ls_result>
+            ii_log    = ii_log ).
+ 
+          li_obj->mo_files = lo_files.
+ 
+          "get required steps for deserialize the object
+          lt_steps_id = li_obj->get_deserialize_steps( ).
+ 
+          LOOP AT lt_steps_id ASSIGNING <lv_step_id>.
+            READ TABLE lt_steps WITH KEY step_id = <lv_step_id> ASSIGNING <ls_step>.
+            ASSERT sy-subrc = 0.
+            IF <lv_step_id> = zif_abapgit_object=>gc_step_id-ddic AND
+               zcl_abapgit_objects_activation=>is_ddic_type( ls_item-obj_type ) = abap_false.
+              " DDIC only for DDIC objects
+              zcx_abapgit_exception=>raise( |Step { <lv_step_id> } is only for DDIC objects| ).
+            ENDIF.
+            APPEND INITIAL LINE TO <ls_step>-objects ASSIGNING <ls_deser>.
+            <ls_deser>-item    = ls_item.
+            <ls_deser>-obj     = li_obj.
+            <ls_deser>-xml     = lo_xml.
+            <ls_deser>-package = lv_package.
+          ENDLOOP.
+ 
+          " LXE, TODO refactor and move below activation
+          IF lo_i18n_params->is_lxe_applicable( ) = abap_true.
+            zcl_abapgit_factory=>get_lxe_texts( )->deserialize(
+              iv_object_type = ls_item-obj_type
+              iv_object_name = ls_item-obj_name
+              io_i18n_params = lo_i18n_params
+              ii_xml         = lo_xml
+              io_files       = lo_files ).
+          ENDIF.
+ 
+          CLEAR: lv_path, lv_package.
+ 
+        CATCH zcx_abapgit_exception INTO lx_exc.
+          ii_log->add_exception( ix_exc = lx_exc
+                                 is_item = ls_item ).
+          ii_log->add_error( iv_msg = |Import of object { ls_item-obj_name } failed|
+                             is_item = ls_item ).
+          "object should not be part of any deserialization step
+          CONTINUE.
+      ENDTRY.
+ 
+    ENDLOOP.
+ 
+    li_progress->off( ).
+ 
+    "run deserialize for all steps and its objects
+    deserialize_steps(
+      EXPORTING
+        it_steps     = lt_steps
+        ii_log       = ii_log
+        iv_transport = is_checks-transport-transport
+      CHANGING
+        ct_files     = rt_accessed_files ).
+ 
+    " TODO: LXE translations (objects has been activated by now)
+ 
+    update_package_tree( io_repo->get_package( ) ).
+ 
+    zcl_abapgit_default_transport=>get_instance( )->reset( ).
+ 
+    lo_timer->end( abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_checks.
+ 
+    rs_checks = zcl_abapgit_objects_check=>deserialize_checks( io_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_objects.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          li_exit     TYPE REF TO zif_abapgit_exit,
+          lx_exc      TYPE REF TO zcx_abapgit_exception.
+ 
+    FIELD-SYMBOLS: <ls_obj> LIKE LINE OF is_step-objects.
+ 
+ 
+    zcl_abapgit_objects_activation=>clear( ).
+ 
+    ii_log->add_success( |>> Step { is_step-order } - { is_step-descr }| ).
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( is_step-objects ) ).
+ 
+    LOOP AT is_step-objects ASSIGNING <ls_obj>.
+      li_progress->show(
+        iv_current = sy-tabix
+        iv_text    = |Step { is_step-order } - { is_step-descr }:| &&
+                     | { <ls_obj>-item-obj_type } { <ls_obj>-item-obj_name }| ).
+ 
+      TRY.
+          <ls_obj>-obj->deserialize( iv_package   = <ls_obj>-package
+                                     io_xml       = <ls_obj>-xml
+                                     iv_step      = is_step-step_id
+                                     ii_log       = ii_log
+                                     iv_transport = iv_transport ).
+          APPEND LINES OF <ls_obj>-obj->mo_files->get_accessed_files( ) TO ct_files.
+ 
+          ii_log->add_success( iv_msg = |Object { <ls_obj>-item-obj_name } imported|
+                               is_item = <ls_obj>-item ).
+ 
+        CATCH zcx_abapgit_exception INTO lx_exc.
+          ii_log->add_exception( ix_exc = lx_exc
+                                 is_item = <ls_obj>-item ).
+          ii_log->add_error( iv_msg = |Import of object { <ls_obj>-item-obj_name } failed|
+                             is_item = <ls_obj>-item ).
+      ENDTRY.
+ 
+    ENDLOOP.
+ 
+    li_progress->show( iv_current = lines( is_step-objects )
+                       iv_text    = |Step { is_step-order } - Activating Objects| ).
+ 
+    CASE is_step-step_id.
+      WHEN zif_abapgit_object=>gc_step_id-ddic.
+        zcl_abapgit_objects_activation=>activate(
+          iv_ddic = abap_true
+          ii_log  = ii_log ).
+      WHEN zif_abapgit_object=>gc_step_id-abap.
+        zcl_abapgit_objects_activation=>activate(
+          iv_ddic = abap_false
+          ii_log  = ii_log ).
+      WHEN zif_abapgit_object=>gc_step_id-late.
+        " late can have both DDIC (like TABL with REF TO) and non-DDIC objects
+        zcl_abapgit_objects_activation=>activate(
+          iv_ddic = abap_true
+          ii_log  = ii_log ).
+        zcl_abapgit_objects_activation=>activate(
+          iv_ddic = abap_false
+          ii_log  = ii_log ).
+    ENDCASE.
+ 
+    li_progress->off( ).
+ 
+*   Call postprocessing
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+    li_exit->deserialize_postprocess( is_step = is_step
+                                      ii_log  = ii_log ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_steps.
+ 
+    FIELD-SYMBOLS <ls_step> LIKE LINE OF it_steps.
+ 
+    LOOP AT it_steps ASSIGNING <ls_step>.
+      deserialize_objects(
+        EXPORTING
+          is_step      = <ls_step>
+          ii_log       = ii_log
+          iv_transport = iv_transport
+        CHANGING
+          ct_files     = ct_files ).
+    ENDLOOP.
+ 
+    SORT ct_files BY path ASCENDING filename ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM ct_files. " Just in case
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_i18n_params.
+ 
+    " TODO: unify with ZCL_ABAPGIT_SERIALIZE=>DETERMINE_I18N_PARAMS, same code
+ 
+    IF io_dot IS BOUND.
+      rs_i18n_params-main_language         = io_dot->get_main_language( ).
+      rs_i18n_params-use_lxe               = io_dot->use_lxe( ).
+      rs_i18n_params-main_language_only    = iv_main_language_only.
+      rs_i18n_params-translation_languages = zcl_abapgit_lxe_texts=>get_translation_languages(
+        iv_main_language  = io_dot->get_main_language( )
+        it_i18n_languages = io_dot->get_i18n_languages( ) ).
+    ENDIF.
+ 
+    IF rs_i18n_params-main_language IS INITIAL.
+      rs_i18n_params-main_language = sy-langu.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD exists.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    " Might be called for objects without tadir entry
+    IF is_item IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " For unsupported objects, assume object exists
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      rv_bool = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        li_obj = create_object( is_item ).
+        rv_bool = li_obj->exists( ).
+      CATCH zcx_abapgit_exception.
+        " Ignore errors and assume the object exists
+        rv_bool = abap_true.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_deserialize_steps.
+    FIELD-SYMBOLS: <ls_step> TYPE LINE OF zif_abapgit_objects=>ty_step_data_tt.
+ 
+    APPEND INITIAL LINE TO rt_steps ASSIGNING <ls_step>.
+    <ls_step>-step_id      = zif_abapgit_object=>gc_step_id-early.
+    <ls_step>-descr        = ''Pre-process Objects''.
+    <ls_step>-syntax_check = abap_false.
+    <ls_step>-order        = 1.
+ 
+    APPEND INITIAL LINE TO rt_steps ASSIGNING <ls_step>.
+    <ls_step>-step_id      = zif_abapgit_object=>gc_step_id-ddic.
+    <ls_step>-descr        = ''Deserialize DDIC Objects''.
+    <ls_step>-syntax_check = abap_false.
+    <ls_step>-order        = 2.
+ 
+    APPEND INITIAL LINE TO rt_steps ASSIGNING <ls_step>.
+    <ls_step>-step_id      = zif_abapgit_object=>gc_step_id-abap.
+    <ls_step>-descr        = ''Deserialize non-DDIC Objects''.
+    <ls_step>-syntax_check = abap_false.
+    <ls_step>-order        = 3.
+ 
+    APPEND INITIAL LINE TO rt_steps ASSIGNING <ls_step>.
+    <ls_step>-step_id      = zif_abapgit_object=>gc_step_id-late.
+    <ls_step>-descr        = ''Post-process Objects''.
+    <ls_step>-syntax_check = abap_true.
+    <ls_step>-order        = 4.
+ 
+    SORT rt_steps BY order. " ensure correct processing order
+  ENDMETHOD.
+ 
+ 
+  METHOD get_extra_from_filename.
+ 
+    IF iv_filename IS NOT INITIAL.
+      FIND REGEX ''\\..*\\.([\\-a-z0-9_%]*)\\.'' IN iv_filename SUBMATCHES rv_extra.
+      IF sy-subrc = 0.
+        rv_extra = cl_http_utility=>unescape_url( rv_extra ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_active.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    " For unsupported objects, assume active state
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      rv_active = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        li_obj = create_object( is_item ).
+        rv_active = li_obj->is_active( ).
+      CATCH cx_sy_dyn_call_illegal_method
+            cx_sy_ref_is_initial
+            zcx_abapgit_exception.
+        " Ignore errors and assume active state
+        rv_active = abap_true.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_supported.
+ 
+    TRY.
+        create_object(
+          is_item        = is_item
+          iv_native_only = iv_native_only ).
+        rv_bool = abap_true.
+      CATCH zcx_abapgit_exception.
+        rv_bool = abap_false.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_type_supported.
+ 
+    DATA: ls_item               TYPE zif_abapgit_definitions=>ty_item,
+          ls_supported_obj_type TYPE ty_supported_types.
+ 
+    FIELD-SYMBOLS <ls_supported_obj_type> TYPE ty_supported_types.
+ 
+    IF iv_obj_type IS INITIAL.
+      " empty object type should never exist
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE gt_supported_obj_types
+      ASSIGNING <ls_supported_obj_type>
+      WITH KEY obj_type = iv_obj_type.
+ 
+    IF sy-subrc <> 0.
+ 
+      ls_item-obj_type = iv_obj_type.
+ 
+      ls_supported_obj_type-obj_type  = iv_obj_type.
+      ls_supported_obj_type-supported = is_supported( ls_item ).
+ 
+      INSERT ls_supported_obj_type INTO TABLE gt_supported_obj_types.
+ 
+      rv_bool = ls_supported_obj_type-supported.
+      RETURN.
+ 
+    ENDIF.
+ 
+    rv_bool = <ls_supported_obj_type>-supported.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump.
+ 
+    DATA: li_obj  TYPE REF TO zif_abapgit_object,
+          lv_exit TYPE abap_bool.
+ 
+    " Nothing to do for unsupported objects
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      zcx_abapgit_exception=>raise( |Object type { is_item-obj_type } is not supported by this system| ).
+    ENDIF.
+ 
+    " Nothing to do if object does not exist
+    li_obj = create_object( is_item ).
+ 
+    IF li_obj->exists( ) = abap_false.
+      zcx_abapgit_exception=>raise( |Object { is_item-obj_type } { is_item-obj_name } doesn''t exist| ).
+    ENDIF.
+ 
+    " First priority object-specific handler
+    lv_exit = li_obj->jump( get_extra_from_filename( iv_filename ) ).
+ 
+    IF lv_exit = abap_false.
+      " Open object in new window with generic jumper
+      lv_exit = zcl_abapgit_objects_factory=>get_gui_jumper( )->jump(
+        is_item        = is_item
+        is_sub_item    = is_sub_item
+        iv_line_number = iv_line_number
+        iv_new_window  = iv_new_window ).
+    ENDIF.
+ 
+    IF lv_exit = abap_false.
+      zcx_abapgit_exception=>raise( |Jump to { is_item-obj_type } { is_item-obj_name } not possible| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_results_to_items.
+ 
+    DATA: ls_item LIKE LINE OF rt_items.
+    FIELD-SYMBOLS: <ls_result> TYPE zif_abapgit_definitions=>ty_result.
+ 
+    LOOP AT it_results ASSIGNING <ls_result>.
+ 
+      ls_item-devclass = <ls_result>-package.
+      ls_item-obj_type = <ls_result>-obj_type.
+      ls_item-obj_name = <ls_result>-obj_name.
+      INSERT ls_item INTO TABLE rt_items.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_tadir_to_items.
+ 
+    DATA: ls_item LIKE LINE OF rt_items.
+    FIELD-SYMBOLS: <ls_tadir> TYPE zif_abapgit_definitions=>ty_tadir.
+ 
+    LOOP AT it_tadir ASSIGNING <ls_tadir>.
+ 
+      ls_item-devclass = <ls_tadir>-devclass.
+      ls_item-obj_type = <ls_tadir>-object.
+      ls_item-obj_name = <ls_tadir>-obj_name.
+      INSERT ls_item INTO TABLE rt_items.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+ 
+    DATA: li_obj   TYPE REF TO zif_abapgit_object,
+          lx_error TYPE REF TO zcx_abapgit_exception,
+          li_xml   TYPE REF TO zif_abapgit_xml_output,
+          lo_files TYPE REF TO zcl_abapgit_objects_files.
+ 
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF rs_files_and_item-files.
+ 
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      zcx_abapgit_exception=>raise( |Object type ignored, not supported: {
+        is_item-obj_type }-{
+        is_item-obj_name }| ).
+    ENDIF.
+ 
+    li_obj = create_object(
+      is_item        = is_item
+      io_i18n_params = io_i18n_params ).
+ 
+    CREATE OBJECT lo_files EXPORTING is_item = is_item.
+    li_obj->mo_files = lo_files. " TODO move into create_object
+ 
+    CREATE OBJECT li_xml TYPE zcl_abapgit_xml_output.
+ 
+    rs_files_and_item-item = is_item.
+ 
+    TRY.
+        li_obj->serialize( li_xml ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        rs_files_and_item-item-inactive = boolc( li_obj->is_active( ) = abap_false ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+    IF io_i18n_params->is_lxe_applicable( ) = abap_true.
+      zcl_abapgit_factory=>get_lxe_texts( )->serialize(
+        iv_object_type = is_item-obj_type
+        iv_object_name = is_item-obj_name
+        io_i18n_params = io_i18n_params
+        io_files       = lo_files
+        ii_xml         = li_xml ).
+    ENDIF.
+ 
+    IF lo_files->is_json_metadata( ) = abap_false.
+      lo_files->add_xml(
+        ii_xml      = li_xml
+        is_metadata = li_obj->get_metadata( ) ).
+    ENDIF.
+ 
+    rs_files_and_item-files = lo_files->get_files( ).
+ 
+    check_duplicates( rs_files_and_item-files ).
+ 
+    rs_files_and_item-item-inactive = boolc( li_obj->is_active( ) = abap_false ).
+ 
+    LOOP AT rs_files_and_item-files ASSIGNING <ls_file>.
+      <ls_file>-sha1 = zcl_abapgit_hash=>sha1_blob( <ls_file>-data ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD supported_list.
+ 
+    DATA lt_objects            TYPE STANDARD TABLE OF ko100.
+    DATA ls_item               TYPE zif_abapgit_definitions=>ty_item.
+    DATA ls_supported_obj_type TYPE ty_supported_types.
+    DATA lt_types              TYPE zif_abapgit_exit=>ty_object_types.
+    DATA lv_type               LIKE LINE OF lt_types.
+    DATA li_exit               TYPE REF TO zif_abapgit_exit.
+ 
+    FIELD-SYMBOLS <ls_object> LIKE LINE OF lt_objects.
+    FIELD-SYMBOLS <ls_supported_obj_type> TYPE ty_supported_types.
+ 
+    IF gv_supported_obj_types_loaded = abap_true.
+      LOOP AT gt_supported_obj_types ASSIGNING <ls_supported_obj_type> WHERE supported = abap_true.
+        INSERT <ls_supported_obj_type>-obj_type INTO TABLE rt_types.
+      ENDLOOP.
+      RETURN.
+    ENDIF.
+ 
+    " delete content because it might be filled already by method IS_TYPE_SUPPORTED
+    CLEAR gt_supported_obj_types.
+ 
+    CALL FUNCTION ''TR_OBJECT_TABLE''
+      TABLES
+        wt_object_text = lt_objects
+      EXCEPTIONS
+        OTHERS         = 1 ##FM_SUBRC_OK.
+ 
+    LOOP AT lt_objects ASSIGNING <ls_object> WHERE pgmid = ''R3TR''.
+      INSERT <ls_object>-object INTO TABLE lt_types.
+    ENDLOOP.
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->change_supported_object_types( CHANGING ct_types = lt_types ).
+ 
+    LOOP AT lt_types INTO lv_type.
+      ls_item-obj_type = lv_type.
+ 
+      ls_supported_obj_type-obj_type  = lv_type.
+      ls_supported_obj_type-supported = is_supported( ls_item ).
+ 
+      INSERT ls_supported_obj_type INTO TABLE gt_supported_obj_types.
+ 
+      IF ls_supported_obj_type-supported = abap_true.
+        INSERT ls_supported_obj_type-obj_type INTO TABLE rt_types.
+      ENDIF.
+    ENDLOOP.
+ 
+    gv_supported_obj_types_loaded = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_package_tree.
+ 
+    DATA: lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+          lv_package  LIKE LINE OF lt_packages,
+          lv_tree     TYPE dirtree-tname.
+ 
+ 
+    lt_packages = zcl_abapgit_factory=>get_sap_package( iv_package )->list_subpackages( ).
+    APPEND iv_package TO lt_packages.
+ 
+    LOOP AT lt_packages INTO lv_package.
+* update package tree for SE80
+      lv_tree = ''EU_'' && lv_package.
+      CALL FUNCTION ''WB_TREE_ACTUALIZE''
+        EXPORTING
+          tree_name              = lv_tree
+          without_crossreference = abap_true
+          with_tcode_index       = abap_true.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OBJECTS_BRIDGE              ', 'CLASS zcl_abapgit_objects_bridge DEFINITION PUBLIC FINAL CREATE PUBLIC INHERITING FROM zcl_abapgit_objects_super.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item
+      RAISING   cx_sy_create_object_error.
+ 
+    INTERFACES zif_abapgit_object.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mo_plugin TYPE REF TO object.
+ 
+    CLASS-METHODS initialize.
+ 
+    " Metadata flags (late_deser, delete_tadir, and ddic) are not required by abapGit anymore
+    " We keep them to stay compatible with old bridge implementation
+    TYPES:
+      BEGIN OF ty_metadata,
+        class_        TYPE string,
+        version      TYPE string,
+        late_deser   TYPE abap_bool,
+        delete_tadir TYPE abap_bool,
+        ddic         TYPE abap_bool,
+      END OF ty_metadata .
+ 
+    TYPES: BEGIN OF ty_s_objtype_map,
+             obj_typ      TYPE tadir-object,
+             plugin_class TYPE seoclsname,
+           END OF ty_s_objtype_map,
+           ty_t_objtype_map TYPE SORTED TABLE OF ty_s_objtype_map WITH UNIQUE KEY obj_typ.
+ 
+    CLASS-DATA gv_init TYPE abap_bool.
+    CLASS-DATA gt_objtype_map TYPE ty_t_objtype_map.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_objects_bridge IMPLEMENTATION.
+ 
+ 
+  METHOD initialize.
+ 
+    DATA lt_plugin_class    TYPE STANDARD TABLE OF seoclsname WITH DEFAULT KEY.
+    DATA lv_plugin_class    LIKE LINE OF lt_plugin_class.
+    DATA lo_plugin          TYPE REF TO object.
+    DATA lt_plugin_obj_type TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY.
+    DATA ls_objtype_map     LIKE LINE OF gt_objtype_map.
+ 
+    IF gv_init = abap_true.
+      RETURN.
+    ENDIF.
+    gv_init = abap_true.
+ 
+    SELECT clsname
+      FROM seometarel
+      INTO TABLE lt_plugin_class
+      WHERE refclsname LIKE ''ZCL_ABAPGITP_OBJECT%''
+      AND version = ''1''
+      ORDER BY clsname.                                   "#EC CI_SUBRC
+ 
+    CLEAR gt_objtype_map.
+    LOOP AT lt_plugin_class INTO lv_plugin_class
+        WHERE table_line <> ''ZCL_ABAPGITP_OBJECT_BY_SOBJ''.
+* have the generic plugin only as fallback
+      TRY.
+          CREATE OBJECT lo_plugin TYPE (lv_plugin_class).
+        CATCH cx_sy_create_object_error.
+          CONTINUE. ">>>>>>>>>>>>>>
+      ENDTRY.
+ 
+      CALL METHOD lo_plugin->(''GET_SUPPORTED_OBJ_TYPES'')
+        IMPORTING
+          rt_obj_type = lt_plugin_obj_type.
+ 
+      ls_objtype_map-plugin_class = lv_plugin_class.
+      LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ.
+        INSERT ls_objtype_map INTO TABLE gt_objtype_map.
+        IF sy-subrc <> 0.
+* No exception in class-contructor possible.
+* Anyway, a shortdump is more appropriate in this case
+          ASSERT ''There must not be'' =
+            |multiple abapGit-Plugins for the same object type {
+            ls_objtype_map-obj_typ }|.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP. "at plugins
+ 
+* and the same for the generic plugin if exists
+* have the generic plugin only as fallback
+    LOOP AT lt_plugin_class INTO lv_plugin_class
+        WHERE table_line = ''ZCL_ABAPGITP_OBJECT_BY_SOBJ''.
+      CREATE OBJECT lo_plugin TYPE (lv_plugin_class).
+ 
+      CALL METHOD lo_plugin->(''GET_SUPPORTED_OBJ_TYPES'')
+        RECEIVING
+          rt_obj_type = lt_plugin_obj_type.
+ 
+      ls_objtype_map-plugin_class = lv_plugin_class.
+      LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ.
+        INSERT ls_objtype_map INTO TABLE gt_objtype_map. "knowingly ignore the subrc
+      ENDLOOP.
+    ENDLOOP. "at plugins
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA ls_objtype_map LIKE LINE OF gt_objtype_map.
+ 
+    super->constructor( is_item = is_item
+                        iv_language = zif_abapgit_definitions=>c_english ).
+ 
+    initialize( ).
+ 
+*    determine the responsible plugin
+    READ TABLE gt_objtype_map INTO ls_objtype_map
+      WITH TABLE KEY obj_typ = is_item-obj_type.
+    IF sy-subrc = 0.
+      CREATE OBJECT mo_plugin TYPE (ls_objtype_map-plugin_class).
+ 
+      CALL METHOD mo_plugin->(''SET_ITEM'')
+        EXPORTING
+          iv_obj_type = is_item-obj_type
+          iv_obj_name = is_item-obj_name.
+    ELSE.
+      RAISE EXCEPTION TYPE cx_sy_create_object_error
+        EXPORTING
+          classname = ''LCL_OBJECTS_BRIDGE''.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~changed_by.
+    rv_user = c_user_unknown. " todo
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~delete.
+    DATA lx_plugin TYPE REF TO cx_static_check.
+ 
+    TRY.
+        CALL METHOD mo_plugin->(''ZIF_ABAPGITP_PLUGIN~DELETE'').
+      CATCH cx_static_check INTO lx_plugin.
+        zcx_abapgit_exception=>raise( lx_plugin->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~deserialize.
+ 
+    DATA: lx_plugin        TYPE REF TO cx_static_check.
+ 
+    TRY.
+        CALL METHOD mo_plugin->(''WRAP_DESERIALIZE'')
+          EXPORTING
+            iv_package = iv_package
+            io_xml     = io_xml.
+      CATCH cx_static_check INTO lx_plugin.
+        zcx_abapgit_exception=>raise( lx_plugin->get_text( ) ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~exists.
+ 
+    CALL METHOD mo_plugin->(''ZIF_ABAPGITP_PLUGIN~EXISTS'')
+      RECEIVING
+        rv_bool = rv_bool.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_comparator.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_order.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_steps.
+ 
+    DATA ls_meta TYPE ty_metadata.
+ 
+    CALL METHOD mo_plugin->(''ZIF_ABAPGITP_PLUGIN~GET_METADATA'')
+      RECEIVING
+        rs_metadata = ls_meta.
+ 
+    IF ls_meta-late_deser = abap_true.
+      APPEND zif_abapgit_object=>gc_step_id-late TO rt_steps.
+    ELSEIF ls_meta-ddic = abap_true.
+      APPEND zif_abapgit_object=>gc_step_id-ddic TO rt_steps.
+    ELSE.
+      APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_metadata.
+ 
+    DATA ls_meta TYPE ty_metadata.
+ 
+    CALL METHOD mo_plugin->(''ZIF_ABAPGITP_PLUGIN~GET_METADATA'')
+      RECEIVING
+        rs_metadata = ls_meta.
+ 
+    MOVE-CORRESPONDING ls_meta TO rs_metadata.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_active.
+    rv_active = abap_true.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_locked.
+ 
+    rv_is_locked = abap_false.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~jump.
+ 
+    CALL METHOD mo_plugin->(''ZIF_ABAPGITP_PLUGIN~JUMP'').
+    rv_exit = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_filename_to_object.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_object_to_filename.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~serialize.
+ 
+    CALL METHOD mo_plugin->(''WRAP_SERIALIZE'')
+      EXPORTING
+        io_xml = io_xml.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OBJECTS_PROGRAM             ', 'CLASS zcl_abapgit_objects_program DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_objects_super
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_progdir,
+        name    TYPE progdir-name,
+        state   TYPE progdir-state,
+        sqlx    TYPE progdir-sqlx,
+        edtx    TYPE progdir-edtx,
+        varcl   TYPE progdir-varcl,
+        dbapl   TYPE progdir-dbapl,
+        dbna    TYPE progdir-dbna,
+        clas    TYPE progdir-clas,
+        type    TYPE progdir-type,
+        occurs  TYPE progdir-occurs,
+        subc    TYPE progdir-subc,
+        appl    TYPE progdir-appl,
+        secu    TYPE progdir-secu,
+        cnam    TYPE progdir-cnam,
+        cdat    TYPE progdir-cdat,
+        unam    TYPE progdir-unam,
+        udat    TYPE progdir-udat,
+        vern    TYPE progdir-vern,
+        levl    TYPE progdir-levl,
+        rstat   TYPE progdir-rstat,
+        rmand   TYPE progdir-rmand,
+        rload   TYPE progdir-rload,
+        fixpt   TYPE progdir-fixpt,
+        sset    TYPE progdir-sset,
+        sdate   TYPE progdir-sdate,
+        stime   TYPE progdir-stime,
+        idate   TYPE progdir-idate,
+        itime   TYPE progdir-itime,
+        ldbname TYPE progdir-ldbname,
+        uccheck TYPE progdir-uccheck,
+      END OF ty_progdir.
+    TYPES:
+      BEGIN OF ty_cua,
+        adm TYPE rsmpe_adm,
+        sta TYPE STANDARD TABLE OF rsmpe_stat WITH DEFAULT KEY,
+        fun TYPE STANDARD TABLE OF rsmpe_funt WITH DEFAULT KEY,
+        men TYPE STANDARD TABLE OF rsmpe_men WITH DEFAULT KEY,
+        mtx TYPE STANDARD TABLE OF rsmpe_mnlt WITH DEFAULT KEY,
+        act TYPE STANDARD TABLE OF rsmpe_act WITH DEFAULT KEY,
+        but TYPE STANDARD TABLE OF rsmpe_but WITH DEFAULT KEY,
+        pfk TYPE STANDARD TABLE OF rsmpe_pfk WITH DEFAULT KEY,
+        set TYPE STANDARD TABLE OF rsmpe_staf WITH DEFAULT KEY,
+        doc TYPE STANDARD TABLE OF rsmpe_atrt WITH DEFAULT KEY,
+        tit TYPE STANDARD TABLE OF rsmpe_titt WITH DEFAULT KEY,
+        biv TYPE STANDARD TABLE OF rsmpe_buts WITH DEFAULT KEY,
+      END OF ty_cua.
+ 
+    METHODS serialize_program
+      IMPORTING
+        !io_xml     TYPE REF TO zif_abapgit_xml_output OPTIONAL
+        !is_item    TYPE zif_abapgit_definitions=>ty_item
+        !io_files   TYPE REF TO zcl_abapgit_objects_files
+        !iv_program TYPE syrepid OPTIONAL
+        !iv_extra   TYPE clike OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS read_progdir
+      IMPORTING
+        !iv_program       TYPE syrepid
+      RETURNING
+        VALUE(rs_progdir) TYPE ty_progdir.
+    METHODS deserialize_program
+      IMPORTING
+        !is_progdir TYPE ty_progdir
+        !it_source  TYPE abaptxt255_tab
+        !it_tpool   TYPE textpool_table
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+ 
+    TYPES:
+      ty_spaces_tt TYPE STANDARD TABLE OF i WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_dynpro,
+        header     TYPE rpy_dyhead,
+        containers TYPE dycatt_tab,
+        fields     TYPE dyfatc_tab,
+        flow_logic TYPE swydyflow,
+        spaces     TYPE ty_spaces_tt,
+      END OF ty_dynpro .
+    TYPES:
+      ty_dynpro_tt TYPE STANDARD TABLE OF ty_dynpro WITH DEFAULT KEY .
+ 
+    METHODS strip_generation_comments
+      CHANGING
+        ct_source TYPE STANDARD TABLE. " tab of string or charX
+    METHODS serialize_dynpros
+      IMPORTING
+        !iv_program_name TYPE syrepid
+      RETURNING
+        VALUE(rt_dynpro) TYPE ty_dynpro_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS serialize_cua
+      IMPORTING
+        !iv_program_name TYPE syrepid
+      RETURNING
+        VALUE(rs_cua)    TYPE ty_cua
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_dynpros
+      IMPORTING
+        !it_dynpros TYPE ty_dynpro_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_textpool
+      IMPORTING
+        !iv_program    TYPE syrepid
+        !it_tpool      TYPE textpool_table
+        !iv_language   TYPE sy-langu OPTIONAL
+        !iv_is_include TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_cua
+      IMPORTING
+        !iv_program_name TYPE syrepid
+        !is_cua          TYPE ty_cua
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_any_dynpro_locked
+      IMPORTING
+        !iv_program                    TYPE syrepid
+      RETURNING
+        VALUE(rv_is_any_dynpro_locked) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_cua_locked
+      IMPORTING
+        !iv_program             TYPE syrepid
+      RETURNING
+        VALUE(rv_is_cua_locked) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_text_locked
+      IMPORTING
+        !iv_program              TYPE syrepid
+      RETURNING
+        VALUE(rv_is_text_locked) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS add_tpool
+      IMPORTING
+        !it_tpool       TYPE textpool_table
+      RETURNING
+        VALUE(rt_tpool) TYPE zif_abapgit_definitions=>ty_tpool_tt .
+    CLASS-METHODS read_tpool
+      IMPORTING
+        !it_tpool       TYPE zif_abapgit_definitions=>ty_tpool_tt
+      RETURNING
+        VALUE(rt_tpool) TYPE zif_abapgit_definitions=>ty_tpool_tt .
+  PRIVATE SECTION.
+    METHODS:
+      uncondense_flow
+        IMPORTING it_flow        TYPE swydyflow
+                  it_spaces      TYPE ty_spaces_tt
+        RETURNING VALUE(rt_flow) TYPE swydyflow.
+ 
+    CLASS-METHODS auto_correct_cua_adm
+      IMPORTING
+        is_cua TYPE ty_cua
+      CHANGING
+        cs_adm TYPE rsmpe_adm.
+ 
+    METHODS get_program_title
+      IMPORTING
+        !it_tpool       TYPE textpool_table
+      RETURNING
+        VALUE(rv_title) TYPE repti .
+    METHODS insert_program
+      IMPORTING
+        !is_progdir TYPE ty_progdir
+        !it_source  TYPE abaptxt255_tab
+        !iv_title   TYPE repti
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_program
+      IMPORTING
+        !is_progdir TYPE ty_progdir
+        !it_source  TYPE abaptxt255_tab
+        !iv_title   TYPE repti
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_progdir
+      IMPORTING
+        !is_progdir TYPE ty_progdir
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_objects_program IMPLEMENTATION.
+ 
+ 
+  METHOD add_tpool.
+ 
+    FIELD-SYMBOLS: <ls_tpool_in>  LIKE LINE OF it_tpool,
+                   <ls_tpool_out> LIKE LINE OF rt_tpool.
+ 
+ 
+    LOOP AT it_tpool ASSIGNING <ls_tpool_in>.
+      APPEND INITIAL LINE TO rt_tpool ASSIGNING <ls_tpool_out>.
+      MOVE-CORRESPONDING <ls_tpool_in> TO <ls_tpool_out>.
+      IF <ls_tpool_out>-id = ''S''.
+        <ls_tpool_out>-split = <ls_tpool_out>-entry.
+        <ls_tpool_out>-entry = <ls_tpool_out>-entry+8.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD auto_correct_cua_adm.
+    " issue #1807 automatic correction of CUA interfaces saved incorrectly in the past (ADM was not saved in the XML)
+ 
+    CONSTANTS:
+      lc_num_n_space TYPE string VALUE '' 0123456789'',
+      lc_num_only    TYPE string VALUE ''0123456789''.
+ 
+    FIELD-SYMBOLS:
+      <ls_pfk> TYPE rsmpe_pfk,
+      <ls_act> TYPE rsmpe_act,
+      <ls_men> TYPE rsmpe_men.
+ 
+    IF cs_adm IS NOT INITIAL
+        AND cs_adm-actcode CO lc_num_n_space
+        AND cs_adm-mencode CO lc_num_n_space
+        AND cs_adm-pfkcode CO lc_num_n_space. "Check performed in form check_adm of include LSMPIF03
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT is_cua-act ASSIGNING <ls_act>.
+      IF <ls_act>-code+6(14) IS INITIAL AND <ls_act>-code(6) CO lc_num_only.
+        cs_adm-actcode = <ls_act>-code.
+      ENDIF.
+    ENDLOOP.
+ 
+    LOOP AT is_cua-men ASSIGNING <ls_men>.
+      IF <ls_men>-code+6(14) IS INITIAL AND <ls_men>-code(6) CO lc_num_only.
+        cs_adm-mencode = <ls_men>-code.
+      ENDIF.
+    ENDLOOP.
+ 
+    LOOP AT is_cua-pfk ASSIGNING <ls_pfk>.
+      IF <ls_pfk>-code+6(14) IS INITIAL AND <ls_pfk>-code(6) CO lc_num_only.
+        cs_adm-pfkcode = <ls_pfk>-code.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_cua.
+ 
+    DATA: ls_tr_key TYPE trkey,
+          ls_adm    TYPE rsmpe_adm.
+ 
+ 
+    IF lines( is_cua-sta ) = 0
+        AND lines( is_cua-fun ) = 0
+        AND lines( is_cua-men ) = 0
+        AND lines( is_cua-mtx ) = 0
+        AND lines( is_cua-act ) = 0
+        AND lines( is_cua-but ) = 0
+        AND lines( is_cua-pfk ) = 0
+        AND lines( is_cua-set ) = 0
+        AND lines( is_cua-doc ) = 0
+        AND lines( is_cua-tit ) = 0
+        AND lines( is_cua-biv ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    SELECT SINGLE devclass INTO ls_tr_key-devclass
+      FROM tadir
+      WHERE pgmid = ''R3TR''
+      AND object = ms_item-obj_type
+      AND obj_name = ms_item-obj_name.                  "#EC CI_GENBUFF
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''not found in tadir'' ).
+    ENDIF.
+ 
+    ls_tr_key-obj_type = ms_item-obj_type.
+    ls_tr_key-obj_name = ms_item-obj_name.
+    ls_tr_key-sub_type = ''CUAD''.
+    ls_tr_key-sub_name = iv_program_name.
+ 
+    ls_adm = is_cua-adm.
+    auto_correct_cua_adm( EXPORTING is_cua = is_cua CHANGING cs_adm = ls_adm ).
+ 
+    sy-tcode = ''SE41'' ##WRITE_OK. " evil hack, workaround to handle fixes in note 2159455
+    CALL FUNCTION ''RS_CUA_INTERNAL_WRITE''
+      EXPORTING
+        program   = iv_program_name
+        language  = mv_language
+        tr_key    = ls_tr_key
+        adm       = ls_adm
+        state     = ''I''
+      TABLES
+        sta       = is_cua-sta
+        fun       = is_cua-fun
+        men       = is_cua-men
+        mtx       = is_cua-mtx
+        act       = is_cua-act
+        but       = is_cua-but
+        pfk       = is_cua-pfk
+        set       = is_cua-set
+        doc       = is_cua-doc
+        tit       = is_cua-tit
+        biv       = is_cua-biv
+      EXCEPTIONS
+        not_found = 1
+        OTHERS    = 2.
+    IF sy-subrc <> 0.
+* if moving code from SAPlink, see https://github.com/abapGit/abapGit/issues/562
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    zcl_abapgit_objects_activation=>add(
+      iv_type = ''CUAD''
+      iv_name = iv_program_name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_dynpros.
+ 
+    CONSTANTS lc_rpyty_force_off TYPE c LENGTH 1 VALUE ''/''.
+ 
+    DATA: lv_name            TYPE dwinactiv-obj_name,
+          lt_d020s_to_delete TYPE TABLE OF d020s,
+          ls_d020s           LIKE LINE OF lt_d020s_to_delete,
+          ls_dynpro          LIKE LINE OF it_dynpros.
+ 
+    FIELD-SYMBOLS: <ls_field> TYPE rpy_dyfatc.
+ 
+    " Delete DYNPROs which are not in the list
+    CALL FUNCTION ''RS_SCREEN_LIST''
+      EXPORTING
+        dynnr     = ''''
+        progname  = ms_item-obj_name
+      TABLES
+        dynpros   = lt_d020s_to_delete
+      EXCEPTIONS
+        not_found = 1
+        OTHERS    = 2.
+    IF sy-subrc = 2.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    SORT lt_d020s_to_delete BY dnum ASCENDING.
+ 
+* ls_dynpro is changed by the function module, a field-symbol will cause
+* the program to dump since it_dynpros cannot be changed
+    LOOP AT it_dynpros INTO ls_dynpro.
+ 
+      READ TABLE lt_d020s_to_delete WITH KEY dnum = ls_dynpro-header-screen
+        TRANSPORTING NO FIELDS
+        BINARY SEARCH.
+      IF sy-subrc = 0.
+        DELETE lt_d020s_to_delete INDEX sy-tabix.
+      ENDIF.
+ 
+      " todo: kept for compatibility, remove after grace period #3680
+      ls_dynpro-flow_logic = uncondense_flow(
+        it_flow = ls_dynpro-flow_logic
+        it_spaces = ls_dynpro-spaces ).
+ 
+ 
+      LOOP AT ls_dynpro-fields ASSIGNING <ls_field>.
+* if the DDIC element has a PARAMETER_ID and the flag "from_dict" is active
+* the import will enable the SET-/GET_PARAM flag. In this case: "force off"
+        IF <ls_field>-param_id IS NOT INITIAL
+            AND <ls_field>-from_dict = abap_true.
+          IF <ls_field>-set_param IS INITIAL.
+            <ls_field>-set_param = lc_rpyty_force_off.
+          ENDIF.
+          IF <ls_field>-get_param IS INITIAL.
+            <ls_field>-get_param = lc_rpyty_force_off.
+          ENDIF.
+        ENDIF.
+ 
+* If the previous conditions are met the value ''F'' will be taken over
+* during de-serialization potentially overlapping other fields in the screen,
+* we set the tag to the correct value ''X''
+        IF <ls_field>-type = ''CHECK''
+            AND <ls_field>-from_dict = abap_true
+            AND <ls_field>-text IS INITIAL
+            AND <ls_field>-modific IS INITIAL.
+          <ls_field>-modific = ''X''.
+        ENDIF.
+ 
+        "fix for issue #2747:
+        IF <ls_field>-foreignkey IS INITIAL.
+          <ls_field>-foreignkey = lc_rpyty_force_off.
+        ENDIF.
+ 
+      ENDLOOP.
+ 
+      CALL FUNCTION ''RPY_DYNPRO_INSERT''
+        EXPORTING
+          header                 = ls_dynpro-header
+          suppress_exist_checks  = abap_true
+        TABLES
+          containers             = ls_dynpro-containers
+          fields_to_containers   = ls_dynpro-fields
+          flow_logic             = ls_dynpro-flow_logic
+        EXCEPTIONS
+          cancelled              = 1
+          already_exists         = 2
+          program_not_exists     = 3
+          not_executed           = 4
+          missing_required_field = 5
+          illegal_field_value    = 6
+          field_not_allowed      = 7
+          not_generated          = 8
+          illegal_field_position = 9
+          OTHERS                 = 10.
+      IF sy-subrc <> 2 AND sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+* todo, RPY_DYNPRO_UPDATE?
+ 
+      CONCATENATE ls_dynpro-header-program ls_dynpro-header-screen
+        INTO lv_name RESPECTING BLANKS.
+      ASSERT NOT lv_name IS INITIAL.
+ 
+      zcl_abapgit_objects_activation=>add(
+        iv_type = ''DYNP''
+        iv_name = lv_name ).
+ 
+    ENDLOOP.
+ 
+    " Delete obsolete screens
+    LOOP AT lt_d020s_to_delete INTO ls_d020s.
+ 
+      CALL FUNCTION ''RS_SCRP_DELETE''
+        EXPORTING
+          dynnr                  = ls_d020s-dnum
+          progname               = ms_item-obj_name
+          with_popup             = abap_false
+        EXCEPTIONS
+          enqueued_by_user       = 1
+          enqueue_system_failure = 2
+          not_executed           = 3
+          not_exists             = 4
+          no_modify_permission   = 5
+          popup_canceled         = 6.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_program.
+ 
+    DATA:
+      lv_progname TYPE reposrc-progname,
+      lv_title    TYPE rglif-title.
+ 
+    zcl_abapgit_factory=>get_cts_api( )->insert_transport_object(
+      iv_object   = ''ABAP''
+      iv_obj_name = is_progdir-name
+      iv_package  = iv_package
+      iv_language = mv_language ).
+ 
+    lv_title = get_program_title( it_tpool ).
+ 
+    " Check if program already exists
+    SELECT SINGLE progname FROM reposrc INTO lv_progname
+      WHERE progname = is_progdir-name
+      AND r3state = ''A''.
+ 
+    IF sy-subrc = 0.
+      update_program(
+        is_progdir = is_progdir
+        it_source  = it_source
+        iv_title   = lv_title ).
+    ELSE.
+      insert_program(
+        is_progdir = is_progdir
+        it_source  = it_source
+        iv_title   = lv_title
+        iv_package = iv_package ).
+    ENDIF.
+ 
+    update_progdir( is_progdir ).
+ 
+    zcl_abapgit_objects_activation=>add(
+      iv_type = ''REPS''
+      iv_name = is_progdir-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_textpool.
+ 
+    DATA lv_language TYPE sy-langu.
+    DATA lv_state    TYPE c.
+    DATA lv_delete   TYPE abap_bool.
+ 
+    IF iv_language IS INITIAL.
+      lv_language = mv_language.
+    ELSE.
+      lv_language = iv_language.
+    ENDIF.
+ 
+    IF lv_language = mv_language.
+      lv_state = ''I''. "Textpool in main language needs to be activated
+    ELSE.
+      lv_state = ''A''. "Translations are always active
+    ENDIF.
+ 
+    IF it_tpool IS INITIAL.
+      IF iv_is_include = abap_false OR lv_state = ''A''.
+        DELETE TEXTPOOL iv_program "Remove initial description from textpool if
+          LANGUAGE lv_language     "original program does not have a textpool
+          STATE lv_state.
+ 
+        lv_delete = abap_true.
+      ELSE.
+        INSERT TEXTPOOL iv_program "In case of includes: Deletion of textpool in
+          FROM it_tpool            "main language cannot be activated because
+          LANGUAGE lv_language     "this woul activate the deletion of the textpool
+          STATE lv_state.          "of the mail program -> insert empty textpool
+      ENDIF.
+    ELSE.
+      INSERT TEXTPOOL iv_program
+        FROM it_tpool
+        LANGUAGE lv_language
+        STATE lv_state.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( ''error from INSERT TEXTPOOL'' ).
+      ENDIF.
+    ENDIF.
+ 
+    IF lv_state = ''I''. "Textpool in main language needs to be activated
+      zcl_abapgit_objects_activation=>add(
+        iv_type   = ''REPT''
+        iv_name   = iv_program
+        iv_delete = lv_delete ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_program_title.
+ 
+    DATA ls_tpool LIKE LINE OF it_tpool.
+ 
+    FIELD-SYMBOLS <lg_any> TYPE any.
+ 
+    READ TABLE it_tpool INTO ls_tpool WITH KEY id = ''R''.
+    IF sy-subrc = 0.
+      " there is a bug in RPY_PROGRAM_UPDATE, the header line of TTAB is not
+      " cleared, so the title length might be inherited from a different program.
+      ASSIGN (''(SAPLSIFP)TTAB'') TO <lg_any>.
+      IF sy-subrc = 0.
+        CLEAR <lg_any>.
+      ENDIF.
+ 
+      rv_title = ls_tpool-entry.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_program.
+ 
+    CALL FUNCTION ''RPY_PROGRAM_INSERT''
+      EXPORTING
+        development_class = iv_package
+        program_name      = is_progdir-name
+        program_type      = is_progdir-subc
+        title_string      = iv_title
+        save_inactive     = ''I''
+        suppress_dialog   = abap_true
+      TABLES
+        source_extended   = it_source
+      EXCEPTIONS
+        already_exists    = 1
+        cancelled         = 2
+        name_not_allowed  = 3
+        permission_error  = 4
+        OTHERS            = 5.
+    IF sy-subrc = 3.
+ 
+      " For cases that standard function does not handle (like FUGR),
+      " we save active and inactive version of source with the given PROGRAM TYPE.
+      " Without the active version, the code will not be visible in case of activation errors.
+      zcl_abapgit_factory=>get_sap_report( )->insert_report(
+        iv_name         = is_progdir-name
+        iv_package      = iv_package
+        it_source       = it_source
+        iv_state        = ''A''
+        iv_program_type = is_progdir-subc ).
+ 
+      zcl_abapgit_factory=>get_sap_report( )->insert_report(
+        iv_name         = is_progdir-name
+        iv_package      = iv_package
+        it_source       = it_source
+        iv_state        = ''I''
+        iv_program_type = is_progdir-subc ).
+ 
+    ELSEIF sy-subrc > 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_any_dynpro_locked.
+ 
+    DATA: lt_dynpros TYPE ty_dynpro_tt,
+          lv_object  TYPE seqg3-garg.
+ 
+    FIELD-SYMBOLS: <ls_dynpro> TYPE ty_dynpro.
+ 
+    lt_dynpros = serialize_dynpros( iv_program ).
+ 
+    LOOP AT lt_dynpros ASSIGNING <ls_dynpro>.
+ 
+      lv_object = |{ <ls_dynpro>-header-screen }{ <ls_dynpro>-header-program }|.
+ 
+      IF exists_a_lock_entry_for( iv_lock_object = ''ESCRP''
+                                  iv_argument    = lv_object ) = abap_true.
+        rv_is_any_dynpro_locked = abap_true.
+        EXIT.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_cua_locked.
+ 
+    DATA: lv_object TYPE eqegraarg.
+ 
+    lv_object = |CU{ iv_program }|.
+    OVERLAY lv_object WITH ''                                          ''.
+    lv_object = lv_object && ''*''.
+ 
+    rv_is_cua_locked = exists_a_lock_entry_for( iv_lock_object = ''ESCUAPAINT''
+                                                iv_argument    = lv_object ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_text_locked.
+ 
+    DATA: lv_object TYPE eqegraarg.
+ 
+    lv_object = |*{ iv_program }|.
+ 
+    rv_is_text_locked = exists_a_lock_entry_for( iv_lock_object = ''EABAPTEXTE''
+                                                 iv_argument    = lv_object ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_progdir.
+ 
+    DATA: ls_sapdir TYPE progdir.
+ 
+ 
+    CALL FUNCTION ''READ_PROGDIR''
+      EXPORTING
+        i_progname = iv_program
+        i_state    = ''A''
+      IMPORTING
+        e_progdir  = ls_sapdir.
+    MOVE-CORRESPONDING ls_sapdir TO rs_progdir.
+ 
+    CLEAR: rs_progdir-edtx,
+           rs_progdir-cnam,
+           rs_progdir-cdat,
+           rs_progdir-unam,
+           rs_progdir-udat,
+           rs_progdir-levl,
+           rs_progdir-vern,
+           rs_progdir-rmand,
+           rs_progdir-sdate,
+           rs_progdir-stime,
+           rs_progdir-idate,
+           rs_progdir-itime,
+           rs_progdir-varcl,
+           rs_progdir-state.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_tpool.
+ 
+    FIELD-SYMBOLS: <ls_tpool_in>  LIKE LINE OF it_tpool,
+                   <ls_tpool_out> LIKE LINE OF rt_tpool.
+ 
+ 
+    LOOP AT it_tpool ASSIGNING <ls_tpool_in>.
+      APPEND INITIAL LINE TO rt_tpool ASSIGNING <ls_tpool_out>.
+      MOVE-CORRESPONDING <ls_tpool_in> TO <ls_tpool_out>.
+      IF <ls_tpool_out>-id = ''S''.
+        CONCATENATE <ls_tpool_in>-split <ls_tpool_in>-entry
+          INTO <ls_tpool_out>-entry
+          RESPECTING BLANKS.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_cua.
+ 
+    CALL FUNCTION ''RS_CUA_INTERNAL_FETCH''
+      EXPORTING
+        program         = iv_program_name
+        language        = mv_language
+        state           = ''A''
+      IMPORTING
+        adm             = rs_cua-adm
+      TABLES
+        sta             = rs_cua-sta
+        fun             = rs_cua-fun
+        men             = rs_cua-men
+        mtx             = rs_cua-mtx
+        act             = rs_cua-act
+        but             = rs_cua-but
+        pfk             = rs_cua-pfk
+        set             = rs_cua-set
+        doc             = rs_cua-doc
+        tit             = rs_cua-tit
+        biv             = rs_cua-biv
+      EXCEPTIONS
+        not_found       = 1
+        unknown_version = 2
+        OTHERS          = 3.
+    IF sy-subrc > 1.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_dynpros.
+    DATA: ls_header               TYPE rpy_dyhead,
+          lt_containers           TYPE dycatt_tab,
+          lt_fields_to_containers TYPE dyfatc_tab,
+          lt_flow_logic           TYPE swydyflow,
+          lt_d020s                TYPE TABLE OF d020s,
+          lt_fieldlist_int        TYPE TABLE OF d021s. "internal format
+ 
+    FIELD-SYMBOLS: <ls_d020s>       LIKE LINE OF lt_d020s,
+                   <lv_outputstyle> TYPE scrpostyle,
+                   <ls_container>   LIKE LINE OF lt_containers,
+                   <ls_field>       LIKE LINE OF lt_fields_to_containers,
+                   <ls_dynpro>      LIKE LINE OF rt_dynpro,
+                   <ls_field_int>   LIKE LINE OF lt_fieldlist_int.
+ 
+    "#2746: relevant flag values (taken from include MSEUSBIT)
+    CONSTANTS: lc_flg1ddf TYPE x VALUE ''20'',
+               lc_flg3fku TYPE x VALUE ''08'',
+               lc_flg3for TYPE x VALUE ''04'',
+               lc_flg3fdu TYPE x VALUE ''02''.
+ 
+ 
+    CALL FUNCTION ''RS_SCREEN_LIST''
+      EXPORTING
+        dynnr     = ''''
+        progname  = iv_program_name
+      TABLES
+        dynpros   = lt_d020s
+      EXCEPTIONS
+        not_found = 1
+        OTHERS    = 2.
+    IF sy-subrc = 2.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    SORT lt_d020s BY dnum ASCENDING.
+ 
+* loop dynpros and skip generated selection screens
+    LOOP AT lt_d020s ASSIGNING <ls_d020s>
+        WHERE type <> ''S'' AND type <> ''W'' AND type <> ''J''
+        AND NOT dnum IS INITIAL.
+ 
+      CALL FUNCTION ''RPY_DYNPRO_READ''
+        EXPORTING
+          progname             = iv_program_name
+          dynnr                = <ls_d020s>-dnum
+        IMPORTING
+          header               = ls_header
+        TABLES
+          containers           = lt_containers
+          fields_to_containers = lt_fields_to_containers
+          flow_logic           = lt_flow_logic
+        EXCEPTIONS
+          cancelled            = 1
+          not_found            = 2
+          permission_error     = 3
+          OTHERS               = 4.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      "#2746: we need the dynpro fields in internal format:
+      FREE lt_fieldlist_int.
+ 
+      CALL FUNCTION ''RPY_DYNPRO_READ_NATIVE''
+        EXPORTING
+          progname  = iv_program_name
+          dynnr     = <ls_d020s>-dnum
+        TABLES
+          fieldlist = lt_fieldlist_int.
+ 
+ 
+      LOOP AT lt_fields_to_containers ASSIGNING <ls_field>.
+* output style is a NUMC field, the XML conversion will fail if it contains invalid value
+* field does not exist in all versions
+        ASSIGN COMPONENT ''OUTPUTSTYLE'' OF STRUCTURE <ls_field> TO <lv_outputstyle>.
+        IF sy-subrc = 0 AND <lv_outputstyle> = ''  ''.
+          CLEAR <lv_outputstyle>.
+        ENDIF.
+ 
+        "2746: we apply the same logic as in SAPLWBSCREEN
+        "for setting or unsetting the foreignkey field:
+        UNASSIGN <ls_field_int>.
+        READ TABLE lt_fieldlist_int ASSIGNING <ls_field_int> WITH KEY fnam = <ls_field>-name.
+        IF <ls_field_int> IS ASSIGNED.
+          IF <ls_field_int>-flg1 O lc_flg1ddf AND
+              <ls_field_int>-flg3 O lc_flg3for AND
+              <ls_field_int>-flg3 Z lc_flg3fdu AND
+              <ls_field_int>-flg3 Z lc_flg3fku.
+            <ls_field>-foreignkey = ''X''.
+          ELSE.
+            CLEAR <ls_field>-foreignkey.
+          ENDIF.
+        ENDIF.
+ 
+        IF <ls_field>-from_dict = abap_true AND
+           <ls_field>-modific   <> ''F'' AND
+           <ls_field>-modific   <> ''X''.
+          CLEAR <ls_field>-text.
+        ENDIF.
+      ENDLOOP.
+ 
+      LOOP AT lt_containers ASSIGNING <ls_container>.
+        IF <ls_container>-c_resize_v = abap_false.
+          CLEAR <ls_container>-c_line_min.
+        ENDIF.
+        IF <ls_container>-c_resize_h = abap_false.
+          CLEAR <ls_container>-c_coln_min.
+        ENDIF.
+      ENDLOOP.
+ 
+      APPEND INITIAL LINE TO rt_dynpro ASSIGNING <ls_dynpro>.
+      <ls_dynpro>-header     = ls_header.
+      <ls_dynpro>-containers = lt_containers.
+      <ls_dynpro>-fields     = lt_fields_to_containers.
+ 
+      <ls_dynpro>-flow_logic = lt_flow_logic.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_program.
+ 
+    DATA: ls_progdir      TYPE ty_progdir,
+          lv_program_name TYPE syrepid,
+          lt_dynpros      TYPE ty_dynpro_tt,
+          ls_cua          TYPE ty_cua,
+          lt_source       TYPE TABLE OF abaptxt255,
+          lt_tpool        TYPE textpool_table,
+          ls_tpool        LIKE LINE OF lt_tpool,
+          li_xml          TYPE REF TO zif_abapgit_xml_output.
+ 
+    IF iv_program IS INITIAL.
+      lv_program_name = is_item-obj_name.
+    ELSE.
+      lv_program_name = iv_program.
+    ENDIF.
+ 
+    zcl_abapgit_language=>set_current_language( mv_language ).
+ 
+    CALL FUNCTION ''RPY_PROGRAM_READ''
+      EXPORTING
+        program_name     = lv_program_name
+        with_includelist = abap_false
+        with_lowercase   = abap_true
+      TABLES
+        source_extended  = lt_source
+        textelements     = lt_tpool
+      EXCEPTIONS
+        cancelled        = 1
+        not_found        = 2
+        permission_error = 3
+        OTHERS           = 4.
+ 
+    IF sy-subrc = 2.
+      zcl_abapgit_language=>restore_login_language( ).
+      RETURN.
+    ELSEIF sy-subrc <> 0.
+      zcl_abapgit_language=>restore_login_language( ).
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    zcl_abapgit_language=>restore_login_language( ).
+ 
+    ls_progdir = read_progdir( lv_program_name ).
+ 
+    IF io_xml IS BOUND.
+      li_xml = io_xml.
+    ELSE.
+      CREATE OBJECT li_xml TYPE zcl_abapgit_xml_output.
+    ENDIF.
+ 
+    li_xml->add( iv_name = ''PROGDIR''
+                 ig_data = ls_progdir ).
+    IF ls_progdir-subc = ''1'' OR ls_progdir-subc = ''M''.
+      lt_dynpros = serialize_dynpros( lv_program_name ).
+      li_xml->add( iv_name = ''DYNPROS''
+                   ig_data = lt_dynpros ).
+ 
+      ls_cua = serialize_cua( lv_program_name ).
+      IF NOT ls_cua IS INITIAL.
+        li_xml->add( iv_name = ''CUA''
+                     ig_data = ls_cua ).
+      ENDIF.
+    ENDIF.
+ 
+    READ TABLE lt_tpool WITH KEY id = ''R'' INTO ls_tpool.
+    IF sy-subrc = 0 AND ls_tpool-key = '''' AND ls_tpool-length = 0.
+      DELETE lt_tpool INDEX sy-tabix.
+    ENDIF.
+ 
+    li_xml->add( iv_name = ''TPOOL''
+                 ig_data = add_tpool( lt_tpool ) ).
+ 
+    IF NOT io_xml IS BOUND.
+      io_files->add_xml( iv_extra = iv_extra
+                         ii_xml   = li_xml ).
+    ENDIF.
+ 
+    strip_generation_comments( CHANGING ct_source = lt_source ).
+ 
+    io_files->add_abap( iv_extra = iv_extra
+                        it_abap  = lt_source ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD strip_generation_comments.
+ 
+    FIELD-SYMBOLS <lv_line> TYPE any. " Assuming CHAR (e.g. abaptxt255_tab) or string (FUGR)
+ 
+    IF ms_item-obj_type <> ''FUGR''.
+      RETURN.
+    ENDIF.
+ 
+    " Case 1: MV FM main prog and TOPs
+    READ TABLE ct_source INDEX 1 ASSIGNING <lv_line>.
+    IF sy-subrc = 0 AND <lv_line> CP ''#**regenerated at *''.
+      DELETE ct_source INDEX 1.
+      RETURN.
+    ENDIF.
+ 
+    " Case 2: MV FM includes
+    IF lines( ct_source ) < 5. " Generation header length
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 1 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP ''#*---*''.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 2 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP ''#**''.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 3 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP ''#**generation date:*''.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 4 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP ''#**generator version:*''.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 5 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP ''#*---*''.
+      RETURN.
+    ENDIF.
+ 
+    DELETE ct_source INDEX 4.
+    DELETE ct_source INDEX 3.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD uncondense_flow.
+ 
+    DATA: lv_spaces LIKE LINE OF it_spaces.
+ 
+    FIELD-SYMBOLS: <ls_flow>   LIKE LINE OF it_flow,
+                   <ls_output> LIKE LINE OF rt_flow.
+ 
+ 
+    LOOP AT it_flow ASSIGNING <ls_flow>.
+      APPEND INITIAL LINE TO rt_flow ASSIGNING <ls_output>.
+      <ls_output>-line = <ls_flow>-line.
+ 
+      READ TABLE it_spaces INDEX sy-tabix INTO lv_spaces.
+      IF sy-subrc = 0.
+        SHIFT <ls_output>-line RIGHT BY lv_spaces PLACES IN CHARACTER MODE.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_progdir.
+ 
+    DATA ls_progdir_new TYPE progdir.
+ 
+    CALL FUNCTION ''READ_PROGDIR''
+      EXPORTING
+        i_progname = is_progdir-name
+        i_state    = ''I''
+      IMPORTING
+        e_progdir  = ls_progdir_new
+      EXCEPTIONS
+        not_exists = 1
+        OTHERS     = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error reading program directory'' ).
+    ENDIF.
+ 
+    ls_progdir_new-ldbname = is_progdir-ldbname.
+    ls_progdir_new-dbna    = is_progdir-dbna.
+    ls_progdir_new-dbapl   = is_progdir-dbapl.
+    ls_progdir_new-rload   = is_progdir-rload.
+    ls_progdir_new-fixpt   = is_progdir-fixpt.
+    ls_progdir_new-varcl   = is_progdir-varcl.
+    ls_progdir_new-appl    = is_progdir-appl.
+    ls_progdir_new-rstat   = is_progdir-rstat.
+    ls_progdir_new-sqlx    = is_progdir-sqlx.
+    ls_progdir_new-uccheck = is_progdir-uccheck.
+    ls_progdir_new-clas    = is_progdir-clas.
+    ls_progdir_new-secu    = is_progdir-secu.
+ 
+    CALL FUNCTION ''UPDATE_PROGDIR''
+      EXPORTING
+        i_progdir    = ls_progdir_new
+        i_progname   = ls_progdir_new-name
+        i_state      = ls_progdir_new-state
+      EXCEPTIONS
+        not_executed = 1
+        OTHERS       = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error updating program directory'' ).
+    ENDIF.
+ 
+    " function UPDATE_PROGDIR does not update VARCL, so we do it here
+    SELECT SINGLE * FROM progdir INTO ls_progdir_new
+      WHERE name  = ls_progdir_new-name
+        AND state = ls_progdir_new-state.
+    IF sy-subrc = 0 AND is_progdir-varcl <> ls_progdir_new-varcl.
+      UPDATE progdir SET varcl = is_progdir-varcl
+        WHERE name  = ls_progdir_new-name
+          AND state = ls_progdir_new-state.               "#EC CI_SUBRC
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_program.
+ 
+    zcl_abapgit_language=>set_current_language( mv_language ).
+ 
+    CALL FUNCTION ''RPY_PROGRAM_UPDATE''
+      EXPORTING
+        program_name     = is_progdir-name
+        title_string     = iv_title
+        save_inactive    = ''I''
+      TABLES
+        source_extended  = it_source
+      EXCEPTIONS
+        cancelled        = 1
+        permission_error = 2
+        not_found        = 3
+        OTHERS           = 4.
+ 
+    IF sy-subrc <> 0.
+      zcl_abapgit_language=>restore_login_language( ).
+ 
+      IF sy-msgid = ''EU'' AND sy-msgno = ''510''.
+        zcx_abapgit_exception=>raise( ''User is currently editing program'' ).
+      ELSEIF sy-msgid = ''EU'' AND sy-msgno = ''522''.
+        " for generated table maintenance function groups, the author is set to SAP* instead of the user which
+        " generates the function group. This hits some standard checks, pulling new code again sets the author
+        " to the current user which avoids the check
+        zcx_abapgit_exception=>raise( |Delete function group and pull again, { is_progdir-name } (EU522)| ).
+      ELSE.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+ 
+    zcl_abapgit_language=>restore_login_language( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_OBJECTS_SUPER               ', 'CLASS zcl_abapgit_objects_super DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC
+  GLOBAL FRIENDS zcl_abapgit_objects .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_user_unknown TYPE syuname VALUE ''UNKNOWN''.
+ 
+    METHODS constructor
+      IMPORTING
+        !is_item     TYPE zif_abapgit_definitions=>ty_item
+        !iv_language TYPE spras .
+  PROTECTED SECTION.
+ 
+    DATA ms_item TYPE zif_abapgit_definitions=>ty_item .
+    DATA mo_i18n_params TYPE REF TO zcl_abapgit_i18n_params .
+    DATA mv_language TYPE spras .
+ 
+    METHODS get_metadata
+      RETURNING
+        VALUE(rs_metadata) TYPE zif_abapgit_definitions=>ty_metadata .
+    METHODS corr_insert
+      IMPORTING
+        !iv_package      TYPE devclass
+        !ig_object_class TYPE any OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS tadir_insert
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    METHODS tadir_delete
+      RAISING
+        zcx_abapgit_exception .
+    METHODS exists_a_lock_entry_for
+      IMPORTING
+        !iv_lock_object               TYPE string
+        !iv_argument                  TYPE seqg3-garg OPTIONAL
+      RETURNING
+        VALUE(rv_exists_a_lock_entry) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_default_package
+      IMPORTING
+        !iv_package TYPE devclass .
+    METHODS set_default_transport
+      IMPORTING
+        !iv_transport TYPE trkorr.
+    METHODS serialize_longtexts
+      IMPORTING
+        !ii_xml           TYPE REF TO zif_abapgit_xml_output
+        !iv_longtext_id   TYPE dokil-id OPTIONAL
+        !it_dokil         TYPE zif_abapgit_definitions=>ty_dokil_tt OPTIONAL
+        !iv_longtext_name TYPE string DEFAULT ''LONGTEXTS''
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_longtexts
+      IMPORTING
+        !ii_xml           TYPE REF TO zif_abapgit_xml_input
+        !iv_longtext_id   TYPE dokil-id OPTIONAL
+        !iv_longtext_name TYPE string DEFAULT ''LONGTEXTS''
+      RAISING
+        zcx_abapgit_exception .
+    METHODS delete_longtexts
+      IMPORTING
+        !iv_longtext_id TYPE dokil-id
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_active
+      RETURNING
+        VALUE(rv_active) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS delete_ddic
+      IMPORTING
+        VALUE(iv_objtype)              TYPE string
+        VALUE(iv_no_ask)               TYPE abap_bool DEFAULT abap_true
+        VALUE(iv_no_ask_delete_append) TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_OBJECTS_SUPER IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    ms_item = is_item.
+    ASSERT NOT ms_item IS INITIAL.
+    mv_language = iv_language.
+    ASSERT NOT mv_language IS INITIAL.
+  ENDMETHOD.
+ 
+ 
+  METHOD corr_insert.
+ 
+    DATA: lv_object       TYPE trobj_name,
+          lv_object_class TYPE tadir-object.
+ 
+    IF ig_object_class IS NOT INITIAL.
+      lv_object_class = ig_object_class.
+      IF ig_object_class = ''DICT''.
+        CONCATENATE ms_item-obj_type ms_item-obj_name INTO lv_object.
+      ELSE.
+        lv_object = ms_item-obj_name.
+      ENDIF.
+    ELSE.
+      lv_object_class = ms_item-obj_type.
+      lv_object       = ms_item-obj_name.
+    ENDIF.
+ 
+    zcl_abapgit_factory=>get_cts_api( )->insert_transport_object(
+      iv_object   = lv_object_class
+      iv_obj_name = lv_object
+      iv_package  = iv_package
+      iv_language = mv_language ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_ddic.
+ 
+    DATA: lv_objname TYPE rsedd0-ddobjname,
+          lv_objtype TYPE rsedd0-ddobjtype.
+ 
+    lv_objname = ms_item-obj_name.
+    lv_objtype = iv_objtype.
+ 
+    TRY.
+        CALL FUNCTION ''RS_DD_DELETE_OBJ''
+          EXPORTING
+            no_ask               = iv_no_ask
+            objname              = lv_objname
+            objtype              = lv_objtype
+            no_ask_delete_append = iv_no_ask_delete_append
+          EXCEPTIONS
+            not_executed         = 1
+            object_not_found     = 2
+            object_not_specified = 3
+            permission_failure   = 4
+            dialog_needed        = 5
+            OTHERS               = 6.
+      CATCH cx_sy_dyn_call_param_not_found.
+        TRY.
+            " try to force deletion for APPENDs
+            CALL FUNCTION ''RS_DD_DELETE_OBJ''
+              EXPORTING
+                no_ask               = iv_no_ask
+                objname              = lv_objname
+                objtype              = lv_objtype
+                aie_force_deletion   = iv_no_ask_delete_append
+              EXCEPTIONS
+                not_executed         = 1
+                object_not_found     = 2
+                object_not_specified = 3
+                permission_failure   = 4
+                dialog_needed        = 5
+                OTHERS               = 6.
+          CATCH cx_sy_dyn_call_param_not_found.
+            " no_ask_delete_append and aie_force_deletion not available in lower releases
+            CALL FUNCTION ''RS_DD_DELETE_OBJ''
+              EXPORTING
+                no_ask               = iv_no_ask
+                objname              = lv_objname
+                objtype              = lv_objtype
+              EXCEPTIONS
+                not_executed         = 1
+                object_not_found     = 2
+                object_not_specified = 3
+                permission_failure   = 4
+                dialog_needed        = 5
+                OTHERS               = 6.
+        ENDTRY.
+    ENDTRY.
+ 
+    IF sy-subrc = 5.
+      zcx_abapgit_exception=>raise( |Object { ms_item-obj_type } { ms_item-obj_name
+                                    } has dependencies and must be deleted manually| ).
+    ELSEIF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error deleting { ms_item-obj_type } { ms_item-obj_name }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_longtexts.
+ 
+    zcl_abapgit_factory=>get_longtexts( )->delete(
+        iv_longtext_id = iv_longtext_id
+        iv_object_name = ms_item-obj_name  ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_longtexts.
+ 
+    zcl_abapgit_factory=>get_longtexts( )->deserialize(
+      ii_xml           = ii_xml
+      iv_longtext_name = iv_longtext_name
+      iv_object_name   = ms_item-obj_name
+      iv_longtext_id   = iv_longtext_id
+      iv_main_language = mv_language ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD exists_a_lock_entry_for.
+ 
+    DATA: lt_lock_entries TYPE STANDARD TABLE OF seqg3.
+ 
+    CALL FUNCTION ''ENQUEUE_READ''
+      EXPORTING
+        guname                = ''*''
+        garg                  = iv_argument
+      TABLES
+        enq                   = lt_lock_entries
+      EXCEPTIONS
+        communication_failure = 1
+        system_failure        = 2
+        OTHERS                = 3.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    READ TABLE lt_lock_entries TRANSPORTING NO FIELDS
+                               WITH KEY gobj = iv_lock_object.
+    IF sy-subrc = 0.
+      rv_exists_a_lock_entry = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_metadata.
+ 
+    DATA: lv_class TYPE string.
+ 
+    lv_class = cl_abap_classdescr=>describe_by_object_ref( me )->get_relative_name( ).
+ 
+    REPLACE FIRST OCCURRENCE OF ''ZCL_ABAPGIT'' IN lv_class WITH ''LCL''.
+ 
+    rs_metadata-class_ = lv_class.
+    rs_metadata-version = ''v1.0.0''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_active.
+ 
+    rv_active = zcl_abapgit_objects_activation=>is_active( ms_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_longtexts.
+ 
+    zcl_abapgit_factory=>get_longtexts( )->serialize(
+        iv_object_name   = ms_item-obj_name
+        iv_longtext_name = iv_longtext_name
+        iv_longtext_id   = iv_longtext_id
+        it_dokil         = it_dokil
+        io_i18n_params   = mo_i18n_params
+        ii_xml           = ii_xml  ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_default_package.
+ 
+    " In certain cases we need to set the package via ABAP memory
+    " because we can''t supply it via the APIs.
+    "
+    " Set default package, see function module RS_CORR_INSERT FORM get_current_devclass.
+    "
+    " We use ABAP memory instead the SET parameter because it is
+    " more reliable. SET parameter doesn''t work when multiple objects
+    " are deserialized which uses the ABAP memory mechanism.
+    " We don''t need to reset the memory as it is done in above mentioned form routine.
+ 
+    EXPORT current_devclass FROM iv_package TO MEMORY ID ''EUK''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_default_transport.
+ 
+    " In certain cases we need to set the transport via ABAP memory
+    " because we can''t supply it via the APIs.
+    "
+    " See function module RS_CORR_INSERT
+ 
+    EXPORT tasknr FROM iv_transport TO MEMORY ID ''EUT''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD tadir_delete.
+ 
+    CALL FUNCTION ''TR_TADIR_INTERFACE''
+      EXPORTING
+        wi_delete_tadir_entry          = abap_true
+        wi_tadir_pgmid                 = ''R3TR''
+        wi_tadir_object                = ms_item-obj_type
+        wi_tadir_obj_name              = ms_item-obj_name
+        wi_test_modus                  = abap_false
+      EXCEPTIONS
+        tadir_entry_not_existing       = 1
+        tadir_entry_ill_type           = 2
+        no_systemname                  = 3
+        no_systemtype                  = 4
+        original_system_conflict       = 5
+        object_reserved_for_devclass   = 6
+        object_exists_global           = 7
+        object_exists_local            = 8
+        object_is_distributed          = 9
+        obj_specification_not_unique   = 10
+        no_authorization_to_delete     = 11
+        devclass_not_existing          = 12
+        simultanious_set_remove_repair = 13
+        order_missing                  = 14
+        no_modification_of_head_syst   = 15
+        pgmid_object_not_allowed       = 16
+        masterlanguage_not_specified   = 17
+        devclass_not_specified         = 18
+        specify_owner_unique           = 19
+        loc_priv_objs_no_repair        = 20
+        gtadir_not_reached             = 21
+        object_locked_for_order        = 22
+        change_of_class_not_allowed    = 23
+        no_change_from_sap_to_tmp      = 24
+        OTHERS                         = 25.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD tadir_insert.
+ 
+    CALL FUNCTION ''TR_TADIR_INTERFACE''
+      EXPORTING
+        wi_test_modus                  = abap_false
+        wi_tadir_pgmid                 = ''R3TR''
+        wi_tadir_object                = ms_item-obj_type
+        wi_tadir_obj_name              = ms_item-obj_name
+        wi_tadir_author                = sy-uname
+        wi_tadir_devclass              = iv_package
+        wi_tadir_masterlang            = mv_language
+        iv_delflag                     = abap_false
+      EXCEPTIONS
+        tadir_entry_not_existing       = 1
+        tadir_entry_ill_type           = 2
+        no_systemname                  = 3
+        no_systemtype                  = 4
+        original_system_conflict       = 5
+        object_reserved_for_devclass   = 6
+        object_exists_global           = 7
+        object_exists_local            = 8
+        object_is_distributed          = 9
+        obj_specification_not_unique   = 10
+        no_authorization_to_delete     = 11
+        devclass_not_existing          = 12
+        simultanious_set_remove_repair = 13
+        order_missing                  = 14
+        no_modification_of_head_syst   = 15
+        pgmid_object_not_allowed       = 16
+        masterlanguage_not_specified   = 17
+        devclass_not_specified         = 18
+        specify_owner_unique           = 19
+        loc_priv_objs_no_repair        = 20
+        gtadir_not_reached             = 21
+        object_locked_for_order        = 22
+        change_of_class_not_allowed    = 23
+        no_change_from_sap_to_tmp      = 24
+        OTHERS                         = 25.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_COMPARATOR                  ', 'INTERFACE zif_abapgit_comparator
+  PUBLIC .
+ 
+ 
+  TYPES:
+    BEGIN OF ty_result,
+      text TYPE string,
+    END OF ty_result .
+ 
+  METHODS compare
+    IMPORTING
+      !ii_remote       TYPE REF TO zif_abapgit_xml_input
+      !ii_log          TYPE REF TO zif_abapgit_log
+    RETURNING
+      VALUE(rs_result) TYPE ty_result
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_OBJECT                      ', 'INTERFACE zif_abapgit_object
+  PUBLIC .
+ 
+  DATA mo_files TYPE REF TO zcl_abapgit_objects_files .
+ 
+  CONSTANTS:
+    BEGIN OF gc_step_id,
+      early TYPE zif_abapgit_definitions=>ty_deserialization_step VALUE \`EARLY\`,
+      abap  TYPE zif_abapgit_definitions=>ty_deserialization_step VALUE \`ABAP\`,
+      ddic  TYPE zif_abapgit_definitions=>ty_deserialization_step VALUE \`DDIC\`,
+      late  TYPE zif_abapgit_definitions=>ty_deserialization_step VALUE \`LATE\`,
+    END OF gc_step_id.
+ 
+  METHODS serialize
+    IMPORTING
+      !io_xml TYPE REF TO zif_abapgit_xml_output
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS deserialize
+    IMPORTING
+      !iv_package   TYPE devclass
+      !io_xml       TYPE REF TO zif_abapgit_xml_input
+      !iv_step      TYPE zif_abapgit_definitions=>ty_deserialization_step
+      !ii_log       TYPE REF TO zif_abapgit_log
+      !iv_transport TYPE trkorr
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS delete
+    IMPORTING
+      !iv_package   TYPE devclass
+      !iv_transport TYPE trkorr
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS exists
+    RETURNING
+      VALUE(rv_bool) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS is_locked
+    RETURNING
+      VALUE(rv_is_locked) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS is_active
+    RETURNING
+      VALUE(rv_active) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS changed_by
+    IMPORTING
+      !iv_extra      TYPE string OPTIONAL
+    RETURNING
+      VALUE(rv_user) TYPE syuname
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS jump
+    IMPORTING
+      !iv_extra      TYPE string OPTIONAL
+    RETURNING
+      VALUE(rv_exit) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS get_metadata
+    RETURNING
+      VALUE(rs_metadata) TYPE zif_abapgit_definitions=>ty_metadata .
+ 
+  METHODS get_comparator
+    RETURNING
+      VALUE(ri_comparator) TYPE REF TO zif_abapgit_comparator
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS get_deserialize_steps
+    RETURNING
+      VALUE(rt_steps) TYPE zif_abapgit_definitions=>ty_deserialization_step_tt .
+ 
+  METHODS get_deserialize_order
+    IMPORTING
+      !it_all_objects          TYPE zif_abapgit_definitions=>ty_items_tt
+    RETURNING
+      VALUE(rt_objects_before) TYPE zif_abapgit_definitions=>ty_items_tt.
+ 
+  CLASS-METHODS map_filename_to_object
+    IMPORTING
+      !iv_filename TYPE string
+      !iv_path     TYPE string OPTIONAL
+      !io_dot      TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL
+      !iv_package  TYPE devclass OPTIONAL
+    CHANGING
+      cs_item      TYPE zif_abapgit_definitions=>ty_item
+    RAISING
+      zcx_abapgit_exception.
+ 
+  CLASS-METHODS map_object_to_filename
+    IMPORTING
+      !is_item    TYPE zif_abapgit_definitions=>ty_item
+    CHANGING
+      cv_filename TYPE string
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_OBJECTS                     ', 'INTERFACE zif_abapgit_objects
+  PUBLIC.
+ 
+  TYPES:
+    BEGIN OF ty_serialization,
+      files TYPE zif_abapgit_git_definitions=>ty_files_tt,
+      item  TYPE zif_abapgit_definitions=>ty_item,
+    END OF ty_serialization .
+  TYPES:
+    BEGIN OF ty_deserialization,
+      obj     TYPE REF TO zif_abapgit_object,
+      xml     TYPE REF TO zif_abapgit_xml_input,
+      package TYPE devclass,
+      item    TYPE zif_abapgit_definitions=>ty_item,
+    END OF ty_deserialization .
+  TYPES:
+    ty_deserialization_tt TYPE STANDARD TABLE OF ty_deserialization WITH DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_step_data,
+      step_id      TYPE zif_abapgit_definitions=>ty_deserialization_step,
+      order        TYPE i,
+      descr        TYPE string,
+      syntax_check TYPE abap_bool,
+      objects      TYPE ty_deserialization_tt,
+    END OF ty_step_data .
+  TYPES:
+    ty_step_data_tt TYPE STANDARD TABLE OF ty_step_data
+                                WITH DEFAULT KEY .
+ 
+  CONSTANTS:
+    BEGIN OF c_deserialize_action,
+      " also used to determine priority if object has multiple changes, so don''t change order
+      no_support TYPE i VALUE -1,
+      none       TYPE i VALUE 0,
+      add        TYPE i VALUE 1,
+      update     TYPE i VALUE 2,
+      overwrite  TYPE i VALUE 3,
+      delete     TYPE i VALUE 4,
+      delete_add TYPE i VALUE 5,
+      packmove   TYPE i VALUE 6,
+    END OF c_deserialize_action.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSIST_BACKGROUND          ', 'CLASS zcl_abapgit_persist_background DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_xml,
+        method   TYPE string,
+        username TYPE string,
+        password TYPE string,
+        settings TYPE zif_abapgit_background=>ty_settings_tt,
+      END OF ty_xml .
+    TYPES:
+      BEGIN OF ty_background,
+        key TYPE zif_abapgit_persistence=>ty_value.
+        INCLUDE TYPE ty_xml.
+    TYPES: END OF ty_background .
+    TYPES:
+      ty_background_keys TYPE STANDARD TABLE OF ty_background WITH DEFAULT KEY .
+ 
+    METHODS constructor .
+    METHODS list
+      RETURNING
+        VALUE(rt_list) TYPE ty_background_keys
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_by_key
+      IMPORTING
+        !iv_key        TYPE ty_background-key
+      RETURNING
+        VALUE(rs_data) TYPE ty_background
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found .
+    METHODS modify
+      IMPORTING
+        !is_data TYPE ty_background
+      RAISING
+        zcx_abapgit_exception .
+    METHODS delete
+      IMPORTING
+        !iv_key TYPE ty_background-key
+      RAISING
+        zcx_abapgit_exception .
+    METHODS exists
+      IMPORTING
+        !iv_key       TYPE ty_background-key
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_db TYPE REF TO zcl_abapgit_persistence_db .
+ 
+    METHODS from_xml
+      IMPORTING
+        !iv_string    TYPE string
+      RETURNING
+        VALUE(rs_xml) TYPE ty_xml
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_xml
+      IMPORTING
+        !is_background   TYPE ty_background
+      RETURNING
+        VALUE(rv_string) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSIST_BACKGROUND IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mo_db = zcl_abapgit_persistence_db=>get_instance( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD delete.
+ 
+    TRY.
+        mo_db->read( iv_type  = zcl_abapgit_persistence_db=>c_type_background
+                     iv_value = iv_key ).
+      CATCH zcx_abapgit_not_found.
+        RETURN.
+    ENDTRY.
+ 
+    mo_db->delete( iv_type  = zcl_abapgit_persistence_db=>c_type_background
+                   iv_value = iv_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD exists.
+ 
+    TRY.
+        mo_db->read( iv_type  = zcl_abapgit_persistence_db=>c_type_background
+                     iv_value = iv_key ).
+        rv_yes = abap_true.
+      CATCH zcx_abapgit_not_found.
+        rv_yes = abap_false.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = ''accept_data_loss''
+      SOURCE XML iv_string
+      RESULT data = rs_xml.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_by_key.
+ 
+    DATA: lt_list TYPE ty_background_keys.
+ 
+    lt_list = list( ).
+ 
+    READ TABLE lt_list WITH KEY key = iv_key INTO rs_data.
+    IF sy-subrc <> 0.
+      RAISE EXCEPTION TYPE zcx_abapgit_not_found.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD list.
+ 
+    DATA: lt_list TYPE zif_abapgit_persistence=>ty_contents,
+          ls_xml  TYPE ty_xml.
+ 
+    FIELD-SYMBOLS: <ls_list>   LIKE LINE OF lt_list,
+                   <ls_output> LIKE LINE OF rt_list.
+ 
+ 
+    lt_list = mo_db->list_by_type( zcl_abapgit_persistence_db=>c_type_background ).
+ 
+    LOOP AT lt_list ASSIGNING <ls_list>.
+      ls_xml = from_xml( <ls_list>-data_str ).
+ 
+      APPEND INITIAL LINE TO rt_list ASSIGNING <ls_output>.
+      MOVE-CORRESPONDING ls_xml TO <ls_output>.
+      <ls_output>-key = <ls_list>-value.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD modify.
+ 
+    ASSERT NOT is_data-key IS INITIAL.
+ 
+    mo_db->modify(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_background
+      iv_value = is_data-key
+      iv_data  = to_xml( is_data ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+    DATA: ls_xml TYPE ty_xml.
+ 
+    MOVE-CORRESPONDING is_background TO ls_xml.
+ 
+    CALL TRANSFORMATION id
+      SOURCE data = ls_xml
+      RESULT XML rv_string.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSIST_FACTORY             ', 'CLASS zcl_abapgit_persist_factory DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_persist_injector .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_repo
+      RETURNING
+        VALUE(ri_repo) TYPE REF TO zif_abapgit_persist_repo .
+    CLASS-METHODS get_repo_cs
+      RETURNING
+        VALUE(ri_repo_cs) TYPE REF TO zif_abapgit_persist_repo_cs .
+    CLASS-METHODS get_settings
+      RETURNING
+        VALUE(ri_settings) TYPE REF TO zif_abapgit_persist_settings .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_repo TYPE REF TO zif_abapgit_persist_repo .
+    CLASS-DATA gi_repo_cs TYPE REF TO zif_abapgit_persist_repo_cs .
+    CLASS-DATA gi_settings TYPE REF TO zif_abapgit_persist_settings .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSIST_FACTORY IMPLEMENTATION.
+ 
+ 
+  METHOD get_repo.
+ 
+    IF gi_repo IS INITIAL.
+      CREATE OBJECT gi_repo TYPE zcl_abapgit_persistence_repo.
+    ENDIF.
+ 
+    ri_repo = gi_repo.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_repo_cs.
+ 
+    IF gi_repo_cs IS INITIAL.
+      CREATE OBJECT gi_repo_cs TYPE zcl_abapgit_persistence_repo.
+    ENDIF.
+ 
+    ri_repo_cs = gi_repo_cs.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_settings.
+ 
+    IF gi_settings IS INITIAL.
+      CREATE OBJECT gi_settings TYPE zcl_abapgit_persist_settings.
+    ENDIF.
+ 
+    ri_settings = gi_settings.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSIST_INJECTOR            ', 'CLASS zcl_abapgit_persist_injector DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  FOR TESTING .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS set_repo
+      IMPORTING
+        !ii_repo TYPE REF TO zif_abapgit_persist_repo .
+ 
+    CLASS-METHODS set_repo_cs
+      IMPORTING
+        !ii_repo_cs TYPE REF TO zif_abapgit_persist_repo_cs .
+ 
+    CLASS-METHODS set_settings
+      IMPORTING
+        !ii_settings TYPE REF TO zif_abapgit_persist_settings .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSIST_INJECTOR IMPLEMENTATION.
+ 
+ 
+  METHOD set_repo.
+ 
+    zcl_abapgit_persist_factory=>gi_repo = ii_repo.
+ 
+  ENDMETHOD.
+ 
+  METHOD set_repo_cs.
+ 
+    zcl_abapgit_persist_factory=>gi_repo_cs = ii_repo_cs.
+ 
+  ENDMETHOD.
+ 
+  METHOD set_settings.
+ 
+    zcl_abapgit_persist_factory=>gi_settings = ii_settings.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSIST_MIGRATE             ', 'CLASS zcl_abapgit_persist_migrate DEFINITION PUBLIC CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS: run RAISING zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS c_text TYPE string VALUE ''Generated by abapGit'' ##NO_TEXT.
+ 
+    CLASS-METHODS table_create
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS table_exists
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool.
+    CLASS-METHODS lock_create
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS lock_exists
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool.
+    CLASS-METHODS gui_status_create
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS gui_status_exists
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_persist_migrate IMPLEMENTATION.
+ 
+ 
+  METHOD gui_status_create.
+ 
+    DATA ls_cua TYPE zcl_abapgit_objects_program=>ty_cua.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      RETURN. " No autocreation for full version
+    ENDIF.
+ 
+    IF gui_status_exists( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    ls_cua = lcl_own_cua_provider=>get( ).
+ 
+    IF ls_cua IS INITIAL. " Full version or something wrong with abapmerged version
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        lcl_cua_interface=>new( )->put_own_cua( ls_cua ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD gui_status_exists.
+ 
+    DATA ls_own_cua TYPE zcl_abapgit_objects_program=>ty_cua.
+    DATA ls_new_cua TYPE zcl_abapgit_objects_program=>ty_cua.
+    DATA lv_x_own TYPE xstring.
+    DATA lv_x_new TYPE xstring.
+    DATA lv_h_own TYPE zif_abapgit_git_definitions=>ty_sha1.
+    DATA lv_h_new TYPE zif_abapgit_git_definitions=>ty_sha1.
+ 
+    TRY.
+        ls_own_cua = lcl_cua_interface=>new( )->get_own_cua( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    IF ls_own_cua IS INITIAL.
+      rv_exists = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    ls_new_cua = lcl_own_cua_provider=>get( ).
+    IF ls_new_cua IS INITIAL.
+      rv_exists = abap_true. " own exists and new is not - nothing to compare with
+      RETURN.
+    ENDIF.
+ 
+    EXPORT data = ls_own_cua TO DATA BUFFER lv_x_own.
+    EXPORT data = ls_new_cua TO DATA BUFFER lv_x_new.
+ 
+    TRY.
+        lv_h_own = zcl_abapgit_hash=>sha1_raw( lv_x_own ).
+        lv_h_new = zcl_abapgit_hash=>sha1_raw( lv_x_new ).
+      CATCH zcx_abapgit_exception.
+        rv_exists = abap_true. " own exists and some issue with calculating hash ... assume own is OK
+        RETURN.
+    ENDTRY.
+ 
+    " New exists and differs from own - then it is really new, needs to be installed
+    rv_exists = boolc( lv_h_own = lv_h_new ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD lock_create.
+ 
+    DATA: lv_obj_name TYPE tadir-obj_name,
+          ls_dd25v    TYPE dd25v,
+          lt_dd26e    TYPE STANDARD TABLE OF dd26e WITH DEFAULT KEY,
+          lt_dd27p    TYPE STANDARD TABLE OF dd27p WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS: <ls_dd26e> LIKE LINE OF lt_dd26e,
+                   <ls_dd27p> LIKE LINE OF lt_dd27p.
+ 
+ 
+    ls_dd25v-viewname   = zcl_abapgit_persistence_db=>c_lock.
+    ls_dd25v-aggtype    = ''E''.
+    ls_dd25v-roottab    = zcl_abapgit_persistence_db=>c_tabname.
+    ls_dd25v-ddlanguage = zif_abapgit_definitions=>c_english.
+    ls_dd25v-ddtext     = c_text.
+ 
+    APPEND INITIAL LINE TO lt_dd26e ASSIGNING <ls_dd26e>.
+    <ls_dd26e>-viewname   = zcl_abapgit_persistence_db=>c_lock.
+    <ls_dd26e>-tabname    = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd26e>-tabpos     = ''0001''.
+    <ls_dd26e>-fortabname = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd26e>-enqmode    = ''E''.
+ 
+    APPEND INITIAL LINE TO lt_dd27p ASSIGNING <ls_dd27p>.
+    <ls_dd27p>-viewname  = zcl_abapgit_persistence_db=>c_lock.
+    <ls_dd27p>-objpos    = ''0001''.
+    <ls_dd27p>-viewfield = ''TYPE''.
+    <ls_dd27p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd27p>-fieldname = ''TYPE''.
+    <ls_dd27p>-keyflag   = abap_true.
+ 
+    APPEND INITIAL LINE TO lt_dd27p ASSIGNING <ls_dd27p>.
+    <ls_dd27p>-viewname  = zcl_abapgit_persistence_db=>c_lock.
+    <ls_dd27p>-objpos    = ''0002''.
+    <ls_dd27p>-viewfield = ''VALUE''.
+    <ls_dd27p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd27p>-fieldname = ''VALUE''.
+    <ls_dd27p>-keyflag   = abap_true.
+ 
+    CALL FUNCTION ''DDIF_ENQU_PUT''
+      EXPORTING
+        name              = zcl_abapgit_persistence_db=>c_lock
+        dd25v_wa          = ls_dd25v
+      TABLES
+        dd26e_tab         = lt_dd26e
+        dd27p_tab         = lt_dd27p
+      EXCEPTIONS
+        enqu_not_found    = 1
+        name_inconsistent = 2
+        enqu_inconsistent = 3
+        put_failure       = 4
+        put_refused       = 5
+        OTHERS            = 6.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    lv_obj_name = zcl_abapgit_persistence_db=>c_lock.
+    CALL FUNCTION ''TR_TADIR_INTERFACE''
+      EXPORTING
+        wi_tadir_pgmid    = ''R3TR''
+        wi_tadir_object   = ''ENQU''
+        wi_tadir_obj_name = lv_obj_name
+        wi_set_genflag    = abap_true
+        wi_test_modus     = abap_false
+        wi_tadir_devclass = ''$TMP''
+      EXCEPTIONS
+        OTHERS            = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    CALL FUNCTION ''DDIF_ENQU_ACTIVATE''
+      EXPORTING
+        name        = zcl_abapgit_persistence_db=>c_lock
+      EXCEPTIONS
+        not_found   = 1
+        put_failure = 2
+        OTHERS      = 3.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''migrate, error from DDIF_ENQU_ACTIVATE'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD lock_exists.
+ 
+    DATA: lv_viewname TYPE dd25l-viewname.
+ 
+    SELECT SINGLE viewname FROM dd25l INTO lv_viewname
+      WHERE viewname = zcl_abapgit_persistence_db=>c_lock.
+    rv_exists = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    IF table_exists( ) = abap_false.
+      table_create( ).
+    ENDIF.
+ 
+    IF lock_exists( ) = abap_false.
+      lock_create( ).
+    ENDIF.
+ 
+    gui_status_create( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD table_create.
+ 
+    DATA: lv_rc       LIKE sy-subrc,
+          lv_obj_name TYPE tadir-obj_name,
+          ls_dd02v    TYPE dd02v,
+          ls_dd09l    TYPE dd09l,
+          lt_dd03p    TYPE STANDARD TABLE OF dd03p WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS: <ls_dd03p> LIKE LINE OF lt_dd03p.
+ 
+    ls_dd02v-tabname    = zcl_abapgit_persistence_db=>c_tabname.
+    ls_dd02v-ddlanguage = zif_abapgit_definitions=>c_english.
+    ls_dd02v-tabclass   = ''TRANSP''.
+    ls_dd02v-ddtext     = c_text.
+    ls_dd02v-contflag   = ''L''.
+    ls_dd02v-exclass    = ''1''.
+ 
+    ls_dd09l-tabname  = zcl_abapgit_persistence_db=>c_tabname.
+    ls_dd09l-as4local = ''A''.
+    ls_dd09l-tabkat   = ''1''.
+    ls_dd09l-tabart   = ''APPL1''.
+    ls_dd09l-bufallow = ''N''.
+ 
+    APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
+    <ls_dd03p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd03p>-fieldname = ''TYPE''.
+    <ls_dd03p>-position  = ''0001''.
+    <ls_dd03p>-keyflag   = ''X''.
+    <ls_dd03p>-datatype  = ''CHAR''.
+    <ls_dd03p>-leng      = ''000012''.
+ 
+    APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
+    <ls_dd03p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd03p>-fieldname = ''VALUE''.
+    <ls_dd03p>-position  = ''0002''.
+    <ls_dd03p>-keyflag   = ''X''.
+    <ls_dd03p>-datatype  = ''CHAR''.
+    <ls_dd03p>-leng      = ''000012''.
+ 
+    APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
+    <ls_dd03p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd03p>-fieldname = ''DATA_STR''.
+    <ls_dd03p>-position  = ''0003''.
+    <ls_dd03p>-datatype  = ''STRG''.
+ 
+    CALL FUNCTION ''DDIF_TABL_PUT''
+      EXPORTING
+        name              = zcl_abapgit_persistence_db=>c_tabname
+        dd02v_wa          = ls_dd02v
+        dd09l_wa          = ls_dd09l
+      TABLES
+        dd03p_tab         = lt_dd03p
+      EXCEPTIONS
+        tabl_not_found    = 1
+        name_inconsistent = 2
+        tabl_inconsistent = 3
+        put_failure       = 4
+        put_refused       = 5
+        OTHERS            = 6.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    lv_obj_name = zcl_abapgit_persistence_db=>c_tabname.
+    CALL FUNCTION ''TR_TADIR_INTERFACE''
+      EXPORTING
+        wi_tadir_pgmid    = ''R3TR''
+        wi_tadir_object   = ''TABL''
+        wi_tadir_obj_name = lv_obj_name
+        wi_set_genflag    = abap_true
+        wi_test_modus     = abap_false
+        wi_tadir_devclass = ''$TMP''
+      EXCEPTIONS
+        OTHERS            = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    CALL FUNCTION ''DDIF_TABL_ACTIVATE''
+      EXPORTING
+        name        = zcl_abapgit_persistence_db=>c_tabname
+        auth_chk    = abap_false
+      IMPORTING
+        rc          = lv_rc
+      EXCEPTIONS
+        not_found   = 1
+        put_failure = 2
+        OTHERS      = 3.
+    IF sy-subrc <> 0 OR lv_rc <> 0.
+      zcx_abapgit_exception=>raise( ''migrate, error from DDIF_TABL_ACTIVATE'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD table_exists.
+ 
+    DATA: lv_tabname TYPE dd02l-tabname.
+ 
+    SELECT SINGLE tabname FROM dd02l INTO lv_tabname
+      WHERE tabname = zcl_abapgit_persistence_db=>c_tabname.
+    rv_exists = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSIST_PACKAGES            ', 'CLASS zcl_abapgit_persist_packages DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_package,
+        devclass   TYPE scompkdtln-devclass,
+        component  TYPE scompkdtln-component,
+        comp_posid TYPE scompkdtln-comp_posid,
+      END OF ty_package .
+    TYPES:
+      ty_packages TYPE HASHED TABLE OF ty_package WITH UNIQUE KEY devclass .
+ 
+    METHODS init .
+    METHODS modify
+      IMPORTING
+        !iv_package    TYPE scompkdtln-devclass
+        !iv_component  TYPE scompkdtln-component OPTIONAL
+        !iv_comp_posid TYPE scompkdtln-comp_posid OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read
+      IMPORTING
+        !iv_package       TYPE scompkdtln-devclass
+      RETURNING
+        VALUE(rs_package) TYPE ty_package .
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ro_persist) TYPE REF TO zcl_abapgit_persist_packages .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_persist TYPE REF TO zcl_abapgit_persist_packages.
+    DATA mt_packages TYPE ty_packages.
+ 
+    METHODS from_xml
+      IMPORTING
+        iv_xml             TYPE string
+      RETURNING
+        VALUE(rt_packages) TYPE ty_packages
+      RAISING
+        zcx_abapgit_exception.
+    METHODS to_xml
+      IMPORTING
+        it_packages   TYPE ty_packages
+      RETURNING
+        VALUE(rv_xml) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_persist_packages IMPLEMENTATION.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA lo_input TYPE REF TO zif_abapgit_xml_input.
+ 
+    CREATE OBJECT lo_input TYPE zcl_abapgit_xml_input EXPORTING iv_xml = iv_xml.
+ 
+    lo_input->read(
+      EXPORTING
+        iv_name = zcl_abapgit_persistence_db=>c_type_packages
+      CHANGING
+        cg_data = rt_packages ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    IF go_persist IS NOT BOUND.
+      CREATE OBJECT go_persist.
+    ENDIF.
+    ro_persist = go_persist.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init.
+ 
+    TRY.
+        " Might have changed in another session so always get latest
+        mt_packages = from_xml( zcl_abapgit_persistence_db=>get_instance( )->read(
+          iv_type  = zcl_abapgit_persistence_db=>c_type_packages
+          iv_value = '''' ) ).
+      CATCH zcx_abapgit_exception zcx_abapgit_not_found ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD modify.
+ 
+    DATA ls_package LIKE LINE OF mt_packages.
+ 
+    FIELD-SYMBOLS <ls_package> LIKE LINE OF mt_packages.
+ 
+    init( ).
+ 
+    IF iv_component IS INITIAL AND iv_comp_posid IS INITIAL.
+      DELETE mt_packages WHERE devclass = iv_package.
+    ELSE.
+      READ TABLE mt_packages ASSIGNING <ls_package> WITH TABLE KEY devclass = iv_package.
+      IF sy-subrc = 0.
+        <ls_package>-component  = iv_component.
+        <ls_package>-comp_posid = iv_comp_posid.
+      ELSE.
+        ls_package-devclass   = iv_package.
+        ls_package-component  = iv_component.
+        ls_package-comp_posid = iv_comp_posid.
+        INSERT ls_package INTO TABLE mt_packages.
+      ENDIF.
+    ENDIF.
+ 
+    zcl_abapgit_persistence_db=>get_instance( )->modify(
+      iv_type       = zcl_abapgit_persistence_db=>c_type_packages
+      iv_value      = ''''
+      iv_data       = to_xml( mt_packages ) ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    init( ).
+ 
+    READ TABLE mt_packages INTO rs_package WITH TABLE KEY devclass = iv_package.
+    IF sy-subrc <> 0.
+      rs_package-devclass = iv_package. " no component
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+ 
+    DATA li_output TYPE REF TO zif_abapgit_xml_output.
+ 
+    CREATE OBJECT li_output TYPE zcl_abapgit_xml_output.
+ 
+    li_output->add(
+      iv_name = zcl_abapgit_persistence_db=>c_type_packages
+      ig_data = it_packages ).
+ 
+    rv_xml = li_output->render( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSIST_SETTINGS            ', 'CLASS zcl_abapgit_persist_settings DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_persist_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_persist_settings .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSIST_SETTINGS IMPLEMENTATION.
+ 
+ 
+  METHOD zif_abapgit_persist_settings~modify.
+ 
+    DATA: lv_settings      TYPE string,
+          ls_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+ 
+    lv_settings = io_settings->get_settings_xml( ).
+ 
+    zcl_abapgit_persistence_db=>get_instance( )->modify(
+      iv_type       = zcl_abapgit_persistence_db=>c_type_settings
+      iv_value      = ''''
+      iv_data       = lv_settings ).
+ 
+    ls_user_settings = io_settings->get_user_settings( ).
+ 
+    zcl_abapgit_persistence_user=>get_instance( )->set_settings( ls_user_settings ).
+ 
+    " Settings have been modified: Update Buffered Settings
+    IF mo_settings IS BOUND.
+      mo_settings->set_xml_settings( lv_settings ).
+      mo_settings->set_user_settings( ls_user_settings ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_settings~read.
+ 
+    IF mo_settings IS BOUND.
+      " Return Buffered Settings
+      ro_settings = mo_settings.
+      RETURN.
+    ENDIF.
+ 
+    " Settings have changed or have not yet been loaded
+    CREATE OBJECT ro_settings.
+ 
+    TRY.
+ 
+        ro_settings->set_xml_settings(
+          zcl_abapgit_persistence_db=>get_instance( )->read(
+            iv_type  = zcl_abapgit_persistence_db=>c_type_settings
+            iv_value = '''' ) ).
+ 
+        ro_settings->set_user_settings( zcl_abapgit_persistence_user=>get_instance( )->get_settings( ) ).
+ 
+      CATCH zcx_abapgit_not_found zcx_abapgit_exception.
+ 
+        ro_settings->set_defaults( ).
+ 
+    ENDTRY.
+ 
+    mo_settings = ro_settings.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSISTENCE_DB              ', 'CLASS zcl_abapgit_persistence_db DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+    CONSTANTS c_tabname TYPE c LENGTH 30 VALUE ''ZABAPGIT'' ##NO_TEXT.
+    CONSTANTS c_lock TYPE c LENGTH 30 VALUE ''EZABAPGIT'' ##NO_TEXT.
+ 
+    CONSTANTS:
+      c_type_settings   TYPE zif_abapgit_persistence=>ty_type VALUE ''SETTINGS'' ##NO_TEXT,
+      c_type_repo       TYPE zif_abapgit_persistence=>ty_type VALUE ''REPO'' ##NO_TEXT,
+      c_type_repo_csum  TYPE zif_abapgit_persistence=>ty_type VALUE ''REPO_CS'' ##NO_TEXT,
+      c_type_background TYPE zif_abapgit_persistence=>ty_type VALUE ''BACKGROUND'' ##NO_TEXT,
+      c_type_packages   TYPE zif_abapgit_persistence=>ty_type VALUE ''PACKAGES'' ##NO_TEXT,
+      c_type_user       TYPE zif_abapgit_persistence=>ty_type VALUE ''USER'' ##NO_TEXT.
+ 
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ro_db) TYPE REF TO zcl_abapgit_persistence_db .
+    METHODS add
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+        !iv_data  TYPE zif_abapgit_persistence=>ty_content-data_str
+      RAISING
+        zcx_abapgit_exception .
+    METHODS delete
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+      RAISING
+        zcx_abapgit_exception .
+    METHODS list
+      RETURNING
+        VALUE(rt_content) TYPE zif_abapgit_persistence=>ty_contents .
+    METHODS list_by_type
+      IMPORTING
+        !iv_type          TYPE zif_abapgit_persistence=>ty_type
+      RETURNING
+        VALUE(rt_content) TYPE zif_abapgit_persistence=>ty_contents .
+    METHODS list_by_keys
+      IMPORTING it_keys            TYPE zif_abapgit_persistence=>ty_repo_keys
+                iv_type            TYPE zif_abapgit_persistence=>ty_type
+      RETURNING VALUE(rt_contents) TYPE zif_abapgit_persistence=>ty_contents.
+    METHODS lock
+      IMPORTING
+        !iv_mode  TYPE enqmode DEFAULT ''E''
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+      RAISING
+        zcx_abapgit_exception .
+    METHODS modify
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+        !iv_data  TYPE zif_abapgit_persistence=>ty_content-data_str
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read
+      IMPORTING
+        !iv_type       TYPE zif_abapgit_persistence=>ty_type
+        !iv_value      TYPE zif_abapgit_persistence=>ty_content-value
+      RETURNING
+        VALUE(rv_data) TYPE zif_abapgit_persistence=>ty_content-data_str
+      RAISING
+        zcx_abapgit_not_found .
+    METHODS update
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+        !iv_data  TYPE zif_abapgit_persistence=>ty_content-data_str
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS validate_entry_type
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_db TYPE REF TO zcl_abapgit_persistence_db .
+    DATA mv_update_function TYPE funcname .
+ 
+    METHODS get_update_function
+      RETURNING
+        VALUE(rv_funcname) TYPE funcname .
+    METHODS validate_and_unprettify_xml
+      IMPORTING
+        !iv_xml       TYPE string
+      RETURNING
+        VALUE(rv_xml) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSISTENCE_DB IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+ 
+    DATA ls_table TYPE zif_abapgit_persistence=>ty_content.
+ 
+    validate_entry_type( iv_type ).
+    ls_table-type  = iv_type.
+    ls_table-value = iv_value.
+    ls_table-data_str = iv_data.
+ 
+    INSERT (c_tabname) FROM ls_table.                     "#EC CI_SUBRC
+    ASSERT sy-subrc = 0.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete.
+ 
+    lock( iv_type  = iv_type
+          iv_value = iv_value ).
+ 
+    " Ignore errors since record might not exist
+    DELETE FROM (c_tabname)
+      WHERE type = iv_type
+      AND value = iv_value.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    IF go_db IS NOT BOUND.
+      CREATE OBJECT go_db.
+    ENDIF.
+    ro_db = go_db.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_update_function.
+    IF mv_update_function IS INITIAL.
+      mv_update_function = ''CALL_V1_PING''.
+      CALL FUNCTION ''FUNCTION_EXISTS''
+        EXPORTING
+          funcname = mv_update_function
+        EXCEPTIONS
+          OTHERS   = 2.
+ 
+      IF sy-subrc <> 0.
+        mv_update_function = ''BANK_OBJ_WORKL_RELEASE_LOCKS''.
+      ENDIF.
+    ENDIF.
+    rv_funcname = mv_update_function.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD list.
+    SELECT * FROM (c_tabname)
+      INTO TABLE rt_content.                              "#EC CI_SUBRC
+  ENDMETHOD.
+ 
+ 
+  METHOD list_by_keys.
+    FIELD-SYMBOLS: <ls_key> LIKE LINE OF it_keys.
+    LOOP AT it_keys ASSIGNING <ls_key>.
+      SELECT * FROM (c_tabname)
+      APPENDING TABLE rt_contents
+      WHERE value = <ls_key> AND
+            type  = iv_type.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD list_by_type.
+    SELECT * FROM (c_tabname)
+      INTO TABLE rt_content
+      WHERE type = iv_type
+      ORDER BY PRIMARY KEY.                               "#EC CI_SUBRC
+  ENDMETHOD.
+ 
+ 
+  METHOD lock.
+    DATA: lv_dummy_update_function TYPE funcname.
+ 
+    CALL FUNCTION ''ENQUEUE_EZABAPGIT''
+      EXPORTING
+        mode_zabapgit  = iv_mode
+        type           = iv_type
+        value          = iv_value
+      EXCEPTIONS
+        foreign_lock   = 1
+        system_failure = 2
+        OTHERS         = 3.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    lv_dummy_update_function = get_update_function( ).
+ 
+* trigger dummy update task to automatically release locks at commit
+    CALL FUNCTION lv_dummy_update_function
+      IN UPDATE TASK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD modify.
+ 
+    DATA: ls_content TYPE zif_abapgit_persistence=>ty_content.
+ 
+    lock( iv_type  = iv_type
+          iv_value = iv_value ).
+ 
+    ls_content-type  = iv_type.
+    ls_content-value = iv_value.
+    ls_content-data_str = iv_data.
+ 
+    MODIFY (c_tabname) FROM ls_content.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''DB modify failed'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    SELECT SINGLE data_str FROM (c_tabname) INTO rv_data
+      WHERE type = iv_type
+      AND value = iv_value.
+    IF sy-subrc <> 0.
+      RAISE EXCEPTION TYPE zcx_abapgit_not_found.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update.
+ 
+    DATA lv_data LIKE iv_data.
+ 
+    IF iv_data CS ''<?xml''.
+      lv_data = validate_and_unprettify_xml( iv_data ).
+    ELSE.
+      lv_data = iv_data.
+    ENDIF.
+ 
+    lock( iv_type  = iv_type
+          iv_value = iv_value ).
+ 
+    UPDATE (c_tabname) SET data_str = lv_data
+      WHERE type  = iv_type
+      AND value = iv_value.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''DB update failed'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_and_unprettify_xml.
+ 
+    rv_xml = zcl_abapgit_xml_pretty=>print(
+      iv_xml           = iv_xml
+      iv_unpretty      = abap_true
+      iv_ignore_errors = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_entry_type.
+ 
+    IF NOT (
+      iv_type = c_type_repo OR
+      iv_type = c_type_repo_csum OR
+      iv_type = c_type_user OR
+      iv_type = c_type_settings OR
+      iv_type = c_type_background OR
+      iv_type = c_type_packages ).
+      zcx_abapgit_exception=>raise( |Invalid DB entry type [{ iv_type }]| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSISTENCE_REPO            ', 'CLASS zcl_abapgit_persistence_repo DEFINITION
+  PUBLIC
+  CREATE PROTECTED
+  GLOBAL FRIENDS zcl_abapgit_persist_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_persist_repo .
+    INTERFACES zif_abapgit_persist_repo_cs .
+ 
+    METHODS constructor .
+    METHODS rewrite_repo_meta
+      IMPORTING
+        !iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found.
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mt_meta_fields TYPE STANDARD TABLE OF abap_compname.
+    DATA mo_db TYPE REF TO zcl_abapgit_persistence_db .
+ 
+    METHODS from_xml
+      IMPORTING
+        !iv_repo_xml_string TYPE string
+      RETURNING
+        VALUE(rs_repo)      TYPE zif_abapgit_persistence=>ty_repo_xml
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_xml
+      IMPORTING
+        !is_repo                  TYPE zif_abapgit_persistence=>ty_repo
+      RETURNING
+        VALUE(rv_repo_xml_string) TYPE string .
+    METHODS get_next_id
+      RETURNING
+        VALUE(rv_next_repo_id) TYPE zif_abapgit_persistence=>ty_content-value
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_repo_from_content
+      IMPORTING
+        is_content    TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_persistence=>ty_repo
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSISTENCE_REPO IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA ls_dummy_meta_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask.
+    DATA ls_dummy_meta      TYPE zif_abapgit_persistence=>ty_repo_xml.
+    DATA lo_type_meta_mask  TYPE REF TO cl_abap_structdescr.
+    DATA lo_type_meta       TYPE REF TO cl_abap_structdescr.
+    FIELD-SYMBOLS <ls_comp> LIKE LINE OF lo_type_meta_mask->components.
+ 
+    " Collect actual list of fields in repo meta data (used in update_meta)
+    lo_type_meta_mask ?= cl_abap_structdescr=>describe_by_data( ls_dummy_meta_mask ).
+    lo_type_meta      ?= cl_abap_structdescr=>describe_by_data( ls_dummy_meta ).
+    LOOP AT lo_type_meta_mask->components ASSIGNING <ls_comp>.
+      APPEND <ls_comp>-name TO mt_meta_fields.
+    ENDLOOP.
+ 
+    mo_db = zcl_abapgit_persistence_db=>get_instance( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = iv_repo_xml_string.
+ 
+* fix downward compatibility
+    REPLACE ALL OCCURRENCES OF ''<_--28C_TYPE_REPO_--29>'' IN lv_xml WITH ''<REPO>''.
+    REPLACE ALL OCCURRENCES OF ''</_--28C_TYPE_REPO_--29>'' IN lv_xml WITH ''</REPO>''.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = ''accept_data_loss''
+      SOURCE XML lv_xml
+      RESULT repo = rs_repo.
+ 
+* automatic migration of old fields
+* todo, keep for transition period until 2022-12-31, then remove all of these
+    FIND FIRST OCCURRENCE OF ''</HEAD_BRANCH><WRITE_PROTECT>X</WRITE_PROTECT>'' IN lv_xml.
+    IF sy-subrc = 0.
+      rs_repo-local_settings-write_protected = abap_true.
+    ENDIF.
+    FIND FIRST OCCURRENCE OF ''<IGNORE_SUBPACKAGES>X</IGNORE_SUBPACKAGES></REPO>'' IN lv_xml.
+    IF sy-subrc = 0.
+      rs_repo-local_settings-ignore_subpackages = abap_true.
+    ENDIF.
+    FIND FIRST OCCURRENCE OF ''<SERIALIZE_MASTER_LANG_ONLY>X</SERIALIZE_MASTER_LANG_ONLY>'' IN lv_xml.
+    IF sy-subrc = 0.
+      rs_repo-local_settings-main_language_only = abap_true.
+    ENDIF.
+ 
+    IF rs_repo IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Inconsistent repo metadata'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_next_id.
+ 
+* todo: Lock the complete persistence in order to prevent concurrent repo-creation
+* however the current approach will most likely work in almost all cases
+ 
+    DATA: lt_content TYPE zif_abapgit_persistence=>ty_contents.
+ 
+    FIELD-SYMBOLS: <ls_content> LIKE LINE OF lt_content.
+ 
+ 
+    rv_next_repo_id = 1.
+ 
+    lt_content = mo_db->list_by_type( zcl_abapgit_persistence_db=>c_type_repo ).
+    LOOP AT lt_content ASSIGNING <ls_content>.
+      IF <ls_content>-value >= rv_next_repo_id.
+        rv_next_repo_id = <ls_content>-value + 1.
+      ENDIF.
+    ENDLOOP.
+ 
+    SHIFT rv_next_repo_id RIGHT DELETING TRAILING space.
+    TRANSLATE rv_next_repo_id USING '' 0''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_repo_from_content.
+    MOVE-CORRESPONDING from_xml( is_content-data_str ) TO rs_result.
+    IF rs_result-local_settings-write_protected = abap_false AND
+       zcl_abapgit_factory=>get_environment( )->is_repo_object_changes_allowed( ) = abap_false.
+      rs_result-local_settings-write_protected = abap_true.
+    ENDIF.
+    rs_result-key = is_content-value.
+  ENDMETHOD.
+ 
+ 
+  METHOD rewrite_repo_meta.
+ 
+    DATA lv_old_blob TYPE string.
+    DATA lv_new_blob TYPE string.
+    DATA ls_repo_meta TYPE zif_abapgit_persistence=>ty_repo.
+ 
+    lv_old_blob = mo_db->read(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+      iv_value = iv_repo_key ).
+ 
+    MOVE-CORRESPONDING from_xml( lv_old_blob ) TO ls_repo_meta.
+    lv_new_blob = to_xml( ls_repo_meta ).
+ 
+    mo_db->update(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+      iv_value = iv_repo_key
+      iv_data  = lv_new_blob ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+ 
+    DATA: ls_xml TYPE zif_abapgit_persistence=>ty_repo_xml.
+ 
+ 
+    MOVE-CORRESPONDING is_repo TO ls_xml.
+ 
+    CALL TRANSFORMATION id
+      SOURCE repo = ls_xml
+      RESULT XML rv_repo_xml_string.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo_cs~delete.
+ 
+    mo_db->delete(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo_csum
+      iv_value = iv_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo_cs~read.
+ 
+    rv_cs_blob = mo_db->read(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo_csum
+      iv_value = iv_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo_cs~update.
+ 
+    mo_db->modify(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo_csum
+      iv_value = iv_key
+      iv_data  = iv_cs_blob ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~add.
+ 
+    DATA: ls_repo        TYPE zif_abapgit_persistence=>ty_repo,
+          lv_repo_as_xml TYPE string.
+ 
+ 
+    ls_repo-url          = iv_url.
+    ls_repo-branch_name  = iv_branch_name.
+    ls_repo-package      = iv_package.
+    ls_repo-offline      = iv_offline.
+    ls_repo-created_by   = sy-uname.
+    GET TIME STAMP FIELD ls_repo-created_at.
+    ls_repo-dot_abapgit  = is_dot_abapgit.
+ 
+    ls_repo-local_settings-display_name = iv_display_name.
+ 
+    lv_repo_as_xml = to_xml( ls_repo ).
+ 
+    rv_key = get_next_id( ).
+ 
+    mo_db->add( iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+                iv_value = rv_key
+                iv_data  = lv_repo_as_xml ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~delete.
+ 
+    DATA: lo_background TYPE REF TO zcl_abapgit_persist_background.
+ 
+    CREATE OBJECT lo_background.
+    lo_background->delete( iv_key ).
+ 
+    mo_db->delete( iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+                   iv_value = iv_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~exists.
+ 
+    DATA lt_keys TYPE zif_abapgit_persistence=>ty_repo_keys.
+    DATA lt_content TYPE zif_abapgit_persistence=>ty_contents.
+ 
+    APPEND iv_key TO lt_keys.
+ 
+    lt_content = mo_db->list_by_keys(
+      it_keys = lt_keys
+      iv_type = zcl_abapgit_persistence_db=>c_type_repo ).
+ 
+    rv_yes = boolc( lines( lt_content ) > 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~list.
+ 
+    DATA: lt_content TYPE zif_abapgit_persistence=>ty_contents,
+          ls_content LIKE LINE OF lt_content,
+          ls_repo    LIKE LINE OF rt_repos.
+ 
+    lt_content = mo_db->list_by_type( zcl_abapgit_persistence_db=>c_type_repo ).
+ 
+    LOOP AT lt_content INTO ls_content.
+      ls_repo = get_repo_from_content( ls_content ).
+      INSERT ls_repo INTO TABLE rt_repos.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~list_by_keys.
+    DATA: lt_content TYPE zif_abapgit_persistence=>ty_contents,
+          ls_content LIKE LINE OF lt_content,
+          ls_repo    LIKE LINE OF rt_repos.
+ 
+    lt_content = mo_db->list_by_keys(
+      it_keys = it_keys
+      iv_type = zcl_abapgit_persistence_db=>c_type_repo ).
+ 
+    LOOP AT lt_content INTO ls_content.
+      ls_repo = get_repo_from_content( ls_content ).
+      INSERT ls_repo INTO TABLE rt_repos.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~lock.
+ 
+    mo_db->lock( iv_mode  = iv_mode
+                 iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+                 iv_value = iv_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~read.
+ 
+    DATA lt_repo TYPE zif_abapgit_persistence=>ty_repos.
+ 
+    lt_repo = zif_abapgit_persist_repo~list( ).
+ 
+    READ TABLE lt_repo INTO rs_repo WITH KEY key = iv_key.
+    IF sy-subrc <> 0.
+      RAISE EXCEPTION TYPE zcx_abapgit_not_found.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~update_metadata.
+ 
+    DATA:
+      lv_blob            TYPE zif_abapgit_persistence=>ty_content-data_str,
+      ls_persistent_meta TYPE zif_abapgit_persistence=>ty_repo.
+ 
+    FIELD-SYMBOLS <lv_field>   LIKE LINE OF mt_meta_fields.
+    FIELD-SYMBOLS <lg_dst>     TYPE any.
+    FIELD-SYMBOLS <lg_src>     TYPE any.
+    FIELD-SYMBOLS <lv_changed> TYPE abap_bool.
+ 
+    ASSERT NOT iv_key IS INITIAL.
+ 
+    IF is_change_mask IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " Validations
+    IF is_change_mask-url = abap_true AND is_meta-url IS INITIAL.
+      zcx_abapgit_exception=>raise( ''update, url empty'' ).
+    ENDIF.
+ 
+    ls_persistent_meta = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key )->ms_data.
+ 
+    " Update
+    LOOP AT mt_meta_fields ASSIGNING <lv_field>.
+      ASSIGN COMPONENT <lv_field> OF STRUCTURE is_change_mask TO <lv_changed>.
+      ASSERT sy-subrc = 0.
+      CHECK <lv_changed> = abap_true.
+      ASSIGN COMPONENT <lv_field> OF STRUCTURE ls_persistent_meta TO <lg_dst>.
+      ASSERT sy-subrc = 0.
+      ASSIGN COMPONENT <lv_field> OF STRUCTURE is_meta TO <lg_src>.
+      ASSERT sy-subrc = 0.
+      <lg_dst> = <lg_src>.
+    ENDLOOP.
+ 
+    lv_blob = to_xml( ls_persistent_meta ).
+ 
+    mo_db->update( iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+                   iv_value = iv_key
+                   iv_data  = lv_blob ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PERSISTENCE_USER            ', 'CLASS zcl_abapgit_persistence_user DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_persist_user .
+ 
+    CLASS-METHODS get_instance
+      IMPORTING
+        !iv_user       TYPE sy-uname DEFAULT sy-uname
+      RETURNING
+        VALUE(ri_user) TYPE REF TO zif_abapgit_persist_user
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !iv_user TYPE sy-uname DEFAULT sy-uname
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_repo_config,
+        url              TYPE zif_abapgit_persistence=>ty_repo-url,
+        login            TYPE string,
+        git_user         TYPE zif_abapgit_git_definitions=>ty_git_user,
+        last_change_seen TYPE string,
+      END OF ty_repo_config .
+    TYPES:
+      ty_repo_configs TYPE STANDARD TABLE OF ty_repo_config WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_user,
+        default_git_user TYPE zif_abapgit_git_definitions=>ty_git_user,
+        repo_show        TYPE zif_abapgit_persistence=>ty_repo-key,
+        hide_files       TYPE abap_bool,
+        changes_only     TYPE abap_bool,
+        order_by         TYPE string,
+        order_descending TYPE abap_bool,
+        diff_first       TYPE abap_bool,
+        diff_unified     TYPE abap_bool,
+        favorites        TYPE zif_abapgit_persist_user=>ty_favorites,
+        repo_config      TYPE ty_repo_configs,
+        settings         TYPE zif_abapgit_definitions=>ty_s_user_settings,
+        show_folders     TYPE abap_bool,
+        list_settings    TYPE zif_abapgit_definitions=>ty_list_settings,
+      END OF ty_user .
+ 
+    DATA mv_user TYPE sy-uname .
+    DATA ms_user TYPE ty_user.
+    CLASS-DATA gi_current_user TYPE REF TO zif_abapgit_persist_user .
+ 
+    METHODS from_xml
+      IMPORTING
+        !iv_xml        TYPE string
+      RETURNING
+        VALUE(rs_user) TYPE ty_user
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_repo_config
+      IMPORTING
+        !iv_url               TYPE zif_abapgit_persistence=>ty_repo-url
+      RETURNING
+        VALUE(rs_repo_config) TYPE ty_repo_config
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_xml
+      IMPORTING
+        !is_user      TYPE ty_user
+      RETURNING
+        VALUE(rv_xml) TYPE string .
+    METHODS update
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_repo_config
+      IMPORTING
+        !iv_url         TYPE zif_abapgit_persistence=>ty_repo-url
+        !is_repo_config TYPE ty_repo_config
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_persistence_user IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mv_user = iv_user.
+    read( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = iv_xml.
+ 
+* fix downward compatibility
+    REPLACE ALL OCCURRENCES OF ''<_--28C_TYPE_USER_--29>'' IN lv_xml WITH ''<USER>''.
+    REPLACE ALL OCCURRENCES OF ''</_--28C_TYPE_USER_--29>'' IN lv_xml WITH ''</USER>''.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = ''accept_data_loss''
+      SOURCE XML lv_xml
+      RESULT user = rs_user.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    IF iv_user = sy-uname ##USER_OK.
+      IF gi_current_user IS NOT BOUND.
+        CREATE OBJECT gi_current_user TYPE zcl_abapgit_persistence_user.
+      ENDIF.
+      ri_user = gi_current_user.
+    ELSE.
+      CREATE OBJECT ri_user TYPE zcl_abapgit_persistence_user
+        EXPORTING
+          iv_user = iv_user.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    TRY.
+        lv_xml = zcl_abapgit_persistence_db=>get_instance( )->read(
+          iv_type  = zcl_abapgit_persistence_db=>c_type_user
+          iv_value = mv_user ).
+      CATCH zcx_abapgit_not_found.
+        RETURN.
+    ENDTRY.
+ 
+    ms_user = from_xml( lv_xml ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_repo_config.
+    DATA lv_url TYPE string.
+    lv_url = to_lower( iv_url ).
+    READ TABLE ms_user-repo_config INTO rs_repo_config WITH KEY url = lv_url.
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+    CALL TRANSFORMATION id
+      SOURCE user = is_user
+      RESULT XML rv_xml.
+  ENDMETHOD.
+ 
+ 
+  METHOD update.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = to_xml( ms_user ).
+ 
+    zcl_abapgit_persistence_db=>get_instance( )->modify(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_user
+      iv_value = mv_user
+      iv_data  = lv_xml ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_repo_config.
+ 
+    DATA: lv_key  TYPE string.
+ 
+    FIELD-SYMBOLS <ls_repo_config> TYPE ty_repo_config.
+ 
+    lv_key  = to_lower( iv_url ).
+ 
+    READ TABLE ms_user-repo_config ASSIGNING <ls_repo_config> WITH KEY url = lv_key.
+    IF sy-subrc IS NOT INITIAL.
+      APPEND INITIAL LINE TO ms_user-repo_config ASSIGNING <ls_repo_config>.
+    ENDIF.
+    <ls_repo_config>     = is_repo_config.
+    <ls_repo_config>-url = lv_key.
+ 
+    update( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_changes_only.
+ 
+    rv_changes_only = ms_user-changes_only.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_default_git_user_email.
+ 
+    rv_email = ms_user-default_git_user-email.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_default_git_user_name.
+ 
+    rv_username = ms_user-default_git_user-name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_diff_first.
+    rv_diff_first = ms_user-diff_first.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_diff_unified.
+ 
+    rv_diff_unified = ms_user-diff_unified.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_favorites.
+ 
+    rt_favorites = ms_user-favorites.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_hide_files.
+ 
+    rv_hide = ms_user-hide_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_list_settings.
+ 
+    rs_list_settings = ms_user-list_settings.
+ 
+    IF rs_list_settings IS INITIAL.
+      " for performance reasons, set "only favorites" as a default
+      IF zcl_abapgit_repo_srv=>get_instance( )->list_favorites( ) IS NOT INITIAL.
+        rs_list_settings-only_favorites = abap_true.
+      ENDIF.
+ 
+      rs_list_settings-order_by = |NAME|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_order_by.
+    rv_order_by = ms_user-order_by.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_order_descending.
+    rv_order_descending = ms_user-order_descending.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_git_user_email.
+ 
+    rv_email = read_repo_config( iv_url )-git_user-email.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_git_user_name.
+ 
+    rv_username = read_repo_config( iv_url )-git_user-name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_last_change_seen.
+ 
+    rv_version = read_repo_config( iv_url )-last_change_seen.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_login.
+ 
+    rv_login = read_repo_config( iv_url )-login.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_show.
+ 
+    rv_key = ms_user-repo_show.
+ 
+    IF rv_key IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " Check if repo exists
+    TRY.
+        zcl_abapgit_persistence_db=>get_instance( )->read(
+          iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+          iv_value = rv_key ).
+      CATCH zcx_abapgit_not_found.
+        " remove invalid key
+        CLEAR rv_key.
+        zif_abapgit_persist_user~set_repo_show( rv_key ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_settings.
+ 
+    rs_user_settings = ms_user-settings.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_show_folders.
+ 
+    rv_folders = ms_user-show_folders.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~is_favorite_repo.
+ 
+    READ TABLE ms_user-favorites TRANSPORTING NO FIELDS
+      WITH KEY table_line = iv_repo_key.
+ 
+    rv_yes = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_default_git_user_email.
+ 
+    ms_user-default_git_user-email = iv_email.
+    update( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_default_git_user_name.
+ 
+    ms_user-default_git_user-name = iv_username.
+    update( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_diff_first.
+    ms_user-diff_first = iv_diff_first.
+    update( ).
+    rv_diff_first = ms_user-diff_first.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_list_settings.
+    ms_user-list_settings = is_list_settings.
+    update( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_order_by.
+    ms_user-order_by = iv_order_by.
+    update( ).
+    rv_order_by = ms_user-order_by.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_order_descending.
+    ms_user-order_descending = iv_order_descending.
+    update( ).
+    rv_order_descending = ms_user-order_descending.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_git_user_email.
+ 
+    DATA: ls_repo_config TYPE ty_repo_config.
+ 
+    ls_repo_config                = read_repo_config( iv_url ).
+    ls_repo_config-git_user-email = iv_email.
+    update_repo_config( iv_url = iv_url
+                        is_repo_config = ls_repo_config ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_git_user_name.
+ 
+    DATA: ls_repo_config TYPE ty_repo_config.
+ 
+    ls_repo_config               = read_repo_config( iv_url ).
+    ls_repo_config-git_user-name = iv_username.
+    update_repo_config( iv_url = iv_url
+                        is_repo_config = ls_repo_config ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_last_change_seen.
+ 
+    DATA: ls_repo_config TYPE ty_repo_config.
+ 
+    ls_repo_config                  = read_repo_config( iv_url ).
+    ls_repo_config-last_change_seen = iv_version.
+    update_repo_config( iv_url = iv_url
+                        is_repo_config = ls_repo_config ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_login.
+ 
+    DATA: ls_repo_config TYPE ty_repo_config.
+ 
+    ls_repo_config       = read_repo_config( iv_url ).
+    ls_repo_config-login = iv_login.
+    update_repo_config( iv_url = iv_url
+                        is_repo_config = ls_repo_config ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_show.
+ 
+    ms_user-repo_show = iv_key.
+    update( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_settings.
+ 
+    ms_user-settings = is_user_settings.
+    update( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_changes_only.
+ 
+    ms_user-changes_only = boolc( ms_user-changes_only = abap_false ).
+    update( ).
+ 
+    rv_changes_only = ms_user-changes_only.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_diff_unified.
+ 
+    ms_user-diff_unified = boolc( ms_user-diff_unified = abap_false ).
+    update( ).
+ 
+    rv_diff_unified = ms_user-diff_unified.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_favorite.
+ 
+    READ TABLE ms_user-favorites TRANSPORTING NO FIELDS
+      WITH KEY table_line = iv_repo_key.
+ 
+    IF sy-subrc = 0.
+      DELETE ms_user-favorites INDEX sy-tabix.
+    ELSE.
+      APPEND iv_repo_key TO ms_user-favorites.
+    ENDIF.
+ 
+    update( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_hide_files.
+ 
+    ms_user-hide_files = boolc( ms_user-hide_files = abap_false ).
+    update( ).
+ 
+    rv_hide = ms_user-hide_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_show_folders.
+    ms_user-show_folders = boolc( ms_user-show_folders = abap_false ).
+    update( ).
+ 
+    rv_folders = ms_user-show_folders.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_PERSIST_REPO                ', 'INTERFACE zif_abapgit_persist_repo
+  PUBLIC .
+ 
+ 
+  METHODS add
+    IMPORTING
+      !iv_url         TYPE string
+      !iv_branch_name TYPE string
+      !iv_branch      TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL
+      iv_display_name TYPE string OPTIONAL
+      !iv_package     TYPE devclass
+      !iv_offline     TYPE abap_bool DEFAULT abap_false
+      !is_dot_abapgit TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit
+    RETURNING
+      VALUE(rv_key)   TYPE zif_abapgit_persistence=>ty_repo-key
+    RAISING
+      zcx_abapgit_exception .
+  METHODS delete
+    IMPORTING
+      !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+    RAISING
+      zcx_abapgit_exception .
+  METHODS exists
+    IMPORTING
+      !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+    RETURNING
+      VALUE(rv_yes) TYPE abap_bool.
+  METHODS list
+    RETURNING
+      VALUE(rt_repos) TYPE zif_abapgit_persistence=>ty_repos
+    RAISING
+      zcx_abapgit_exception .
+  METHODS list_by_keys
+    IMPORTING
+      it_keys         TYPE zif_abapgit_persistence=>ty_repo_keys
+    RETURNING
+      VALUE(rt_repos) TYPE zif_abapgit_persistence=>ty_repos
+    RAISING
+      zcx_abapgit_exception .
+  METHODS lock
+    IMPORTING
+      !iv_mode TYPE enqmode
+      !iv_key  TYPE zif_abapgit_persistence=>ty_repo-key
+    RAISING
+      zcx_abapgit_exception .
+  METHODS read
+    IMPORTING
+      !iv_key        TYPE zif_abapgit_persistence=>ty_repo-key
+    RETURNING
+      VALUE(rs_repo) TYPE zif_abapgit_persistence=>ty_repo
+    RAISING
+      zcx_abapgit_exception
+      zcx_abapgit_not_found .
+  METHODS update_metadata
+    IMPORTING
+      !iv_key         TYPE zif_abapgit_persistence=>ty_repo-key
+      !is_meta        TYPE zif_abapgit_persistence=>ty_repo_xml
+      !is_change_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_PERSIST_REPO_CS             ', 'INTERFACE zif_abapgit_persist_repo_cs
+  PUBLIC .
+ 
+  METHODS update
+    IMPORTING
+      !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      !iv_cs_blob TYPE zif_abapgit_persistence=>ty_content-data_str
+    RAISING
+      zcx_abapgit_exception .
+  METHODS delete
+    IMPORTING
+      !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+    RAISING
+      zcx_abapgit_exception .
+  METHODS read
+    IMPORTING
+      !iv_key        TYPE zif_abapgit_persistence=>ty_repo-key
+    RETURNING
+      VALUE(rv_cs_blob) TYPE zif_abapgit_persistence=>ty_content-data_str
+    RAISING
+      zcx_abapgit_exception
+      zcx_abapgit_not_found .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_PERSIST_SETTINGS            ', 'INTERFACE zif_abapgit_persist_settings PUBLIC.
+ 
+  METHODS modify
+    IMPORTING
+      !io_settings TYPE REF TO zcl_abapgit_settings
+    RAISING
+      zcx_abapgit_exception .
+  METHODS read
+    RETURNING
+      VALUE(ro_settings) TYPE REF TO zcl_abapgit_settings .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_PERSIST_USER                ', 'INTERFACE zif_abapgit_persist_user
+  PUBLIC .
+ 
+  TYPES ty_favorites TYPE zif_abapgit_persistence=>ty_repo_keys .
+ 
+  METHODS get_changes_only
+    RETURNING
+      VALUE(rv_changes_only) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_default_git_user_email
+    RETURNING
+      VALUE(rv_email) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_default_git_user_name
+    RETURNING
+      VALUE(rv_username) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_diff_unified
+    RETURNING
+      VALUE(rv_diff_unified) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_favorites
+    RETURNING
+      VALUE(rt_favorites) TYPE ty_favorites
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_hide_files
+    RETURNING
+      VALUE(rv_hide) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_show_folders
+    RETURNING
+      VALUE(rv_folders) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_repo_git_user_email
+    IMPORTING
+      !iv_url         TYPE zif_abapgit_persistence=>ty_repo-url
+    RETURNING
+      VALUE(rv_email) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_repo_git_user_name
+    IMPORTING
+      !iv_url            TYPE zif_abapgit_persistence=>ty_repo-url
+    RETURNING
+      VALUE(rv_username) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_repo_last_change_seen
+    IMPORTING
+      !iv_url           TYPE zif_abapgit_persistence=>ty_repo-url
+    RETURNING
+      VALUE(rv_version) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_repo_login
+    IMPORTING
+      !iv_url         TYPE zif_abapgit_persistence=>ty_repo-url
+    RETURNING
+      VALUE(rv_login) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_repo_show
+    RETURNING
+      VALUE(rv_key) TYPE zif_abapgit_persistence=>ty_repo-key
+    RAISING
+      zcx_abapgit_exception .
+  METHODS is_favorite_repo
+    IMPORTING
+      !iv_repo_key  TYPE zif_abapgit_persistence=>ty_repo-key
+    RETURNING
+      VALUE(rv_yes) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_default_git_user_email
+    IMPORTING
+      !iv_email TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_default_git_user_name
+    IMPORTING
+      !iv_username TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_repo_git_user_email
+    IMPORTING
+      !iv_url   TYPE zif_abapgit_persistence=>ty_repo-url
+      !iv_email TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_repo_git_user_name
+    IMPORTING
+      !iv_url      TYPE zif_abapgit_persistence=>ty_repo-url
+      !iv_username TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_repo_last_change_seen
+    IMPORTING
+      !iv_url     TYPE zif_abapgit_persistence=>ty_repo-url
+      !iv_version TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_repo_login
+    IMPORTING
+      !iv_url   TYPE zif_abapgit_persistence=>ty_repo-url
+      !iv_login TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_repo_show
+    IMPORTING
+      !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+    RAISING
+      zcx_abapgit_exception .
+  METHODS toggle_changes_only
+    RETURNING
+      VALUE(rv_changes_only) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_order_by
+    RETURNING
+      VALUE(rv_order_by) TYPE string
+    RAISING
+      zcx_abapgit_exception.
+  METHODS set_order_by
+    IMPORTING
+      iv_order_by        TYPE string
+    RETURNING
+      VALUE(rv_order_by) TYPE string
+    RAISING
+      zcx_abapgit_exception.
+  METHODS get_order_descending
+    RETURNING
+      VALUE(rv_order_descending) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+  METHODS set_order_descending
+    IMPORTING
+      iv_order_descending        TYPE abap_bool
+    RETURNING
+      VALUE(rv_order_descending) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+  METHODS get_diff_first
+    RETURNING
+      VALUE(rv_diff_first) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+  METHODS set_diff_first
+    IMPORTING
+      iv_diff_first        TYPE abap_bool
+    RETURNING
+      VALUE(rv_diff_first) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+  METHODS toggle_diff_unified
+    RETURNING
+      VALUE(rv_diff_unified) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS toggle_favorite
+    IMPORTING
+      !iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+    RAISING
+      zcx_abapgit_exception .
+  METHODS toggle_hide_files
+    RETURNING
+      VALUE(rv_hide) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS toggle_show_folders
+    RETURNING
+      VALUE(rv_folders) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+  METHODS get_settings
+    RETURNING
+      VALUE(rs_user_settings) TYPE zif_abapgit_definitions=>ty_s_user_settings
+    RAISING
+      zcx_abapgit_exception.
+  METHODS set_settings
+    IMPORTING
+      is_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings
+    RAISING
+      zcx_abapgit_exception.
+  METHODS get_list_settings
+    RETURNING
+      VALUE(rs_list_settings) TYPE zif_abapgit_definitions=>ty_list_settings
+    RAISING
+      zcx_abapgit_exception.
+  METHODS set_list_settings
+    IMPORTING
+      is_list_settings TYPE zif_abapgit_definitions=>ty_list_settings
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_PERSISTENCE                 ', 'INTERFACE zif_abapgit_persistence PUBLIC.
+ 
+  TYPES:
+    ty_type  TYPE c LENGTH 12 .
+  TYPES:
+    ty_value TYPE c LENGTH 12 .
+  TYPES:
+    BEGIN OF ty_content,
+      type     TYPE ty_type,
+      value    TYPE ty_value,
+      data_str TYPE string,
+    END OF ty_content .
+  TYPES:
+    ty_contents TYPE SORTED TABLE OF ty_content WITH UNIQUE KEY type value .
+ 
+  TYPES: BEGIN OF ty_local_checksum,
+           item  TYPE zif_abapgit_definitions=>ty_item_signature,
+           files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
+         END OF ty_local_checksum.
+ 
+  TYPES:
+    BEGIN OF ty_local_settings,
+      display_name                 TYPE string,
+      ignore_subpackages           TYPE abap_bool,
+      write_protected              TYPE abap_bool,
+      only_local_objects           TYPE abap_bool,
+      code_inspector_check_variant TYPE sci_chkv,
+      block_commit                 TYPE abap_bool,
+      main_language_only           TYPE abap_bool,
+      labels                       TYPE string,
+      transport_request            TYPE trkorr,
+      customizing_request          TYPE trkorr,
+    END OF ty_local_settings.
+ 
+  TYPES: ty_local_checksum_tt TYPE STANDARD TABLE OF ty_local_checksum WITH DEFAULT KEY.
+  TYPES: ty_local_checksum_by_item_tt TYPE SORTED TABLE OF ty_local_checksum
+    WITH NON-UNIQUE KEY item-obj_type item-obj_name.
+ 
+  TYPES: BEGIN OF ty_repo_xml,
+           url             TYPE string,
+           branch_name     TYPE string,
+           selected_commit TYPE zif_abapgit_git_definitions=>ty_sha1,
+           package         TYPE devclass,
+           created_by      TYPE syuname,
+           created_at      TYPE timestampl,
+           deserialized_by TYPE syuname,
+           deserialized_at TYPE timestampl,
+           offline         TYPE abap_bool,
+           switched_origin TYPE string,
+           dot_abapgit     TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit,
+           head_branch     TYPE string,   " HEAD symref of the repo, master branch
+           local_settings  TYPE ty_local_settings,
+         END OF ty_repo_xml.
+ 
+  TYPES:
+    BEGIN OF ty_repo_meta_mask,
+      url             TYPE abap_bool,
+      branch_name     TYPE abap_bool,
+      selected_commit TYPE abap_bool,
+      package         TYPE abap_bool,
+      created_by      TYPE abap_bool,
+      created_at      TYPE abap_bool,
+      deserialized_by TYPE abap_bool,
+      deserialized_at TYPE abap_bool,
+      offline         TYPE abap_bool,
+      switched_origin TYPE abap_bool,
+      dot_abapgit     TYPE abap_bool,
+      head_branch     TYPE abap_bool,
+      local_settings  TYPE abap_bool,
+    END OF ty_repo_meta_mask.
+ 
+  TYPES: BEGIN OF ty_repo,
+           key TYPE ty_value.
+      INCLUDE TYPE ty_repo_xml.
+  TYPES: END OF ty_repo.
+  TYPES: ty_repos TYPE STANDARD TABLE OF ty_repo WITH DEFAULT KEY.
+  TYPES: ty_repo_keys TYPE STANDARD TABLE OF ty_repo-key WITH DEFAULT KEY.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PROGRESS                    ', 'CLASS zcl_abapgit_progress DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PROTECTED .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_progress .
+ 
+    CLASS-METHODS set_instance
+      IMPORTING
+        !ii_progress TYPE REF TO zif_abapgit_progress .
+    CLASS-METHODS get_instance
+      IMPORTING
+        !iv_total          TYPE i
+      RETURNING
+        VALUE(ri_progress) TYPE REF TO zif_abapgit_progress .
+  PROTECTED SECTION.
+ 
+    DATA mv_total TYPE i .
+    CLASS-DATA gi_progress TYPE REF TO zif_abapgit_progress .
+ 
+    METHODS calc_pct
+      IMPORTING
+        !iv_current   TYPE i
+      RETURNING
+        VALUE(rv_pct) TYPE i .
+  PRIVATE SECTION.
+ 
+    DATA mv_cv_time_next TYPE sy-uzeit .
+    DATA mv_cv_datum_next TYPE sy-datum .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_progress IMPLEMENTATION.
+ 
+ 
+  METHOD calc_pct.
+ 
+    DATA: lv_f TYPE f.
+ 
+    lv_f = ( iv_current / mv_total ) * 100.
+    rv_pct = lv_f.
+ 
+    IF rv_pct = 100.
+      rv_pct = 99.
+    ELSEIF rv_pct = 0.
+      rv_pct = 1.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+* max one progress indicator at a time is supported
+ 
+    IF gi_progress IS INITIAL.
+      CREATE OBJECT gi_progress TYPE zcl_abapgit_progress.
+    ENDIF.
+ 
+    gi_progress->set_total( iv_total ).
+ 
+    ri_progress = gi_progress.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_instance.
+ 
+    gi_progress = ii_progress.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_progress~off.
+ 
+    " Clear the status bar
+    CALL FUNCTION ''SAPGUI_PROGRESS_INDICATOR''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_progress~set_total.
+ 
+    mv_total = iv_total.
+ 
+    CLEAR mv_cv_time_next.
+    CLEAR mv_cv_datum_next.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_progress~show.
+ 
+    DATA: lv_pct  TYPE i,
+          lv_time TYPE t.
+ 
+    CONSTANTS: lc_wait_secs TYPE i VALUE 2.
+ 
+    GET TIME.
+    lv_time = sy-uzeit.
+    IF mv_cv_time_next IS INITIAL AND mv_cv_datum_next IS INITIAL.
+      mv_cv_time_next  = lv_time.
+      mv_cv_datum_next = sy-datum.
+    ENDIF.
+ 
+    "We only do a progress indication if enough time has passed
+    IF lv_time >= mv_cv_time_next
+        AND sy-datum = mv_cv_datum_next
+        OR sy-datum > mv_cv_datum_next.
+ 
+      lv_pct = calc_pct( iv_current ).
+ 
+      CALL FUNCTION ''SAPGUI_PROGRESS_INDICATOR''
+        EXPORTING
+          percentage = lv_pct
+          text       = iv_text.
+      mv_cv_time_next = lv_time + lc_wait_secs.
+ 
+    ENDIF.
+    IF sy-datum > mv_cv_datum_next.
+      mv_cv_datum_next = sy-datum.
+    ENDIF.
+    IF mv_cv_time_next < lv_time.
+      mv_cv_datum_next = sy-datum + 1.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_PROGRESS                    ', 'INTERFACE zif_abapgit_progress
+  PUBLIC .
+ 
+ 
+  METHODS show
+    IMPORTING
+      !iv_current TYPE i
+      !iv_text    TYPE csequence .
+  METHODS set_total
+    IMPORTING
+      !iv_total TYPE i .
+  METHODS off .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DOT_ABAPGIT                 ', 'CLASS zcl_abapgit_dot_abapgit DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS build_default
+      RETURNING
+        VALUE(ro_dot_abapgit) TYPE REF TO zcl_abapgit_dot_abapgit .
+    CLASS-METHODS deserialize
+      IMPORTING
+        !iv_xstr              TYPE xstring
+      RETURNING
+        VALUE(ro_dot_abapgit) TYPE REF TO zcl_abapgit_dot_abapgit
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !is_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
+    METHODS serialize
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_file
+      RETURNING
+        VALUE(rs_file) TYPE zif_abapgit_git_definitions=>ty_file
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_data
+      RETURNING
+        VALUE(rs_data) TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
+    METHODS add_ignore
+      IMPORTING
+        !iv_path     TYPE string
+        !iv_filename TYPE string .
+    METHODS is_ignored
+      IMPORTING
+        !iv_path          TYPE string
+        !iv_filename      TYPE string
+      RETURNING
+        VALUE(rv_ignored) TYPE abap_bool .
+    METHODS remove_ignore
+      IMPORTING
+        !iv_path     TYPE string
+        !iv_filename TYPE string .
+    METHODS get_starting_folder
+      RETURNING
+        VALUE(rv_path) TYPE string .
+    METHODS get_folder_logic
+      RETURNING
+        VALUE(rv_logic) TYPE string .
+    METHODS set_folder_logic
+      IMPORTING
+        !iv_logic TYPE string .
+    METHODS set_starting_folder
+      IMPORTING
+        !iv_path TYPE string .
+    METHODS get_main_language
+      RETURNING
+        VALUE(rv_language) TYPE spras .
+    METHODS get_i18n_languages
+      RETURNING
+        VALUE(rt_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_i18n_languages
+      IMPORTING
+        VALUE(it_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_signature
+      RETURNING
+        VALUE(rs_signature) TYPE zif_abapgit_git_definitions=>ty_file_signature
+      RAISING
+        zcx_abapgit_exception .
+    METHODS use_lxe
+      IMPORTING
+        !iv_yes       TYPE abap_bool DEFAULT abap_undefined
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS get_requirements
+      RETURNING
+        VALUE(rt_requirements) TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt .
+    METHODS set_requirements
+      IMPORTING
+        !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt .
+    METHODS get_version_constant
+      RETURNING
+        VALUE(rv_version_constant) TYPE string .
+    METHODS set_version_constant
+      IMPORTING
+        !iv_version_constant TYPE csequence .
+    METHODS get_abap_language_version
+      RETURNING
+        VALUE(rv_abap_language_version) TYPE string .
+    METHODS set_abap_language_version
+      IMPORTING
+        !iv_abap_language_version TYPE string .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA ms_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
+ 
+    CLASS-METHODS to_xml
+      IMPORTING
+        !is_data      TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit
+      RETURNING
+        VALUE(rv_xml) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS from_xml
+      IMPORTING
+        !iv_xml        TYPE string
+      RETURNING
+        VALUE(rs_data) TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_DOT_ABAPGIT IMPLEMENTATION.
+ 
+ 
+  METHOD add_ignore.
+ 
+    DATA: lv_name TYPE string.
+ 
+    FIELD-SYMBOLS: <lv_ignore> LIKE LINE OF ms_data-ignore.
+ 
+ 
+    lv_name = iv_path && iv_filename.
+ 
+    READ TABLE ms_data-ignore FROM lv_name TRANSPORTING NO FIELDS.
+    IF sy-subrc = 0.
+      RETURN.
+    ENDIF.
+ 
+    APPEND INITIAL LINE TO ms_data-ignore ASSIGNING <lv_ignore>.
+    <lv_ignore> = lv_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_default.
+ 
+    DATA: ls_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
+ 
+ 
+    ls_data-master_language = sy-langu.
+    ls_data-starting_folder = ''/src/''.
+    ls_data-folder_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+ 
+    CREATE OBJECT ro_dot_abapgit
+      EXPORTING
+        is_data = ls_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    ms_data = is_data.
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize.
+ 
+    DATA: lv_xml  TYPE string,
+          ls_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
+ 
+ 
+    lv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( iv_xstr ).
+ 
+    ls_data = from_xml( lv_xml ).
+ 
+    CREATE OBJECT ro_dot_abapgit
+      EXPORTING
+        is_data = ls_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = iv_xml.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = ''accept_data_loss''
+      SOURCE XML lv_xml
+      RESULT data = rs_data.
+ 
+* downward compatibility
+    IF rs_data-folder_logic IS INITIAL.
+      rs_data-folder_logic = zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_data.
+    rs_data = ms_data.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_folder_logic.
+    rv_logic = ms_data-folder_logic.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_i18n_languages.
+    rt_languages = ms_data-i18n_languages.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_main_language.
+    rv_language = ms_data-master_language.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_requirements.
+    rt_requirements = ms_data-requirements.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_signature.
+ 
+    rs_signature-path     = zif_abapgit_definitions=>c_root_dir.
+    rs_signature-filename = zif_abapgit_definitions=>c_dot_abapgit.
+    rs_signature-sha1     = zcl_abapgit_hash=>sha1_blob( serialize( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_starting_folder.
+    rv_path = ms_data-starting_folder.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_version_constant.
+    rv_version_constant = ms_data-version_constant.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_ignored.
+ 
+    DATA: lv_name     TYPE string,
+          lv_starting TYPE string,
+          lv_dot      TYPE string,
+          lv_ignore   TYPE string.
+ 
+ 
+    lv_name = iv_path && iv_filename.
+ 
+    CONCATENATE ms_data-starting_folder ''*'' INTO lv_starting.
+ 
+    " Always allow .abapgit.xml and .apack-manifest.xml
+    CONCATENATE ''/'' zif_abapgit_definitions=>c_dot_abapgit INTO lv_dot.
+    IF lv_name = lv_dot.
+      RETURN.
+    ENDIF.
+    CONCATENATE ''/'' zif_abapgit_apack_definitions=>c_dot_apack_manifest INTO lv_dot.
+    IF lv_name = lv_dot.
+      RETURN.
+    ENDIF.
+ 
+    " Ignore all files matching pattern in ignore list
+    LOOP AT ms_data-ignore INTO lv_ignore.
+      IF lv_name CP lv_ignore.
+        rv_ignored = abap_true.
+        RETURN.
+      ENDIF.
+    ENDLOOP.
+ 
+    " Ignore all files outside of starting folder tree
+    IF ms_data-starting_folder <> ''/'' AND NOT lv_name CP lv_starting.
+      rv_ignored = abap_true.
+    ENDIF.
+ 
+    IF iv_path = zif_abapgit_data_config=>c_default_path.
+      rv_ignored = abap_false.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_ignore.
+ 
+    DATA: lv_name TYPE string.
+ 
+ 
+    lv_name = iv_path && iv_filename.
+ 
+    DELETE TABLE ms_data-ignore FROM lv_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+ 
+    DATA lv_xml TYPE string.
+ 
+    lv_xml = to_xml( ms_data ).
+ 
+    rv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_xml ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_folder_logic.
+    ms_data-folder_logic = iv_logic.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_i18n_languages.
+    ms_data-i18n_languages = it_languages.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_requirements.
+    ms_data-requirements = it_requirements.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_starting_folder.
+    ms_data-starting_folder = iv_path.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_version_constant.
+    ms_data-version_constant = iv_version_constant.
+  ENDMETHOD.
+ 
+ 
+  METHOD to_file.
+    rs_file-path     = zif_abapgit_definitions=>c_root_dir.
+    rs_file-filename = zif_abapgit_definitions=>c_dot_abapgit.
+    rs_file-data     = serialize( ).
+    rs_file-sha1     = zcl_abapgit_hash=>sha1_blob( rs_file-data ).
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS initial_components = ''suppress''
+      SOURCE data = is_data
+      RESULT XML rv_xml.
+ 
+    rv_xml = zcl_abapgit_xml_pretty=>print( rv_xml ).
+ 
+    REPLACE FIRST OCCURRENCE
+      OF REGEX ''<\\?xml version="1\\.0" encoding="[\\w-]+"\\?>''
+      IN rv_xml
+      WITH ''<?xml version="1.0" encoding="utf-8"?>''.
+    ASSERT sy-subrc = 0.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD use_lxe.
+ 
+    IF iv_yes <> abap_undefined.
+      ms_data-use_lxe = iv_yes.
+    ENDIF.
+ 
+    rv_yes = ms_data-use_lxe.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_abap_language_version.
+    rv_abap_language_version = ms_data-abap_language_version.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_abap_language_version.
+    ms_data-abap_language_version = iv_abap_language_version.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_FILE_STATUS                 ', 'CLASS zcl_abapgit_file_status DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS status
+      IMPORTING
+        !io_repo          TYPE REF TO zcl_abapgit_repo
+        !ii_log           TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_root_package TYPE devclass
+        !io_dot          TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mv_root_package TYPE devclass.
+    DATA mo_dot          TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+    METHODS calculate_status
+      IMPORTING
+        !it_local         TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_remote        TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !it_cur_state     TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS process_local
+      IMPORTING
+        !it_local     TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_state_idx TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+      CHANGING
+        !ct_remote    TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !ct_items     TYPE zif_abapgit_definitions=>ty_items_tt
+        !ct_results   TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS process_items
+      IMPORTING
+        !it_unprocessed_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+      CHANGING
+        !ct_items    TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS process_remote
+      IMPORTING
+        !it_local     TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_unprocessed_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !it_state_idx TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+        !it_items_idx TYPE zif_abapgit_definitions=>ty_items_ts
+      CHANGING
+        !ct_results   TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS build_existing
+      IMPORTING
+        !is_local        TYPE zif_abapgit_definitions=>ty_file_item
+        !is_remote       TYPE zif_abapgit_git_definitions=>ty_file
+        !it_state        TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_definitions=>ty_result .
+    CLASS-METHODS build_new_local
+      IMPORTING
+        !is_local        TYPE zif_abapgit_definitions=>ty_file_item
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_definitions=>ty_result .
+    METHODS build_new_remote
+      IMPORTING
+        !is_remote       TYPE zif_abapgit_git_definitions=>ty_file
+        !it_items_idx    TYPE zif_abapgit_definitions=>ty_items_ts
+        !it_state_idx    TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_definitions=>ty_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_object_package
+      IMPORTING
+        !iv_object         TYPE tadir-object
+        !iv_obj_name       TYPE tadir-obj_name
+      RETURNING
+        VALUE(rv_devclass) TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS check_local_remote_consistency
+      IMPORTING
+        !is_local        TYPE zif_abapgit_definitions=>ty_file_item
+        !is_remote       TYPE zif_abapgit_git_definitions=>ty_file
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS ensure_state
+      IMPORTING
+        !it_local         TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_cur_state     TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RETURNING
+        VALUE(rt_state) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_file_status IMPLEMENTATION.
+ 
+ 
+  METHOD build_existing.
+ 
+    DATA ls_file_sig LIKE LINE OF it_state.
+ 
+    " Item
+    rs_result-obj_type  = is_local-item-obj_type.
+    rs_result-obj_name  = is_local-item-obj_name.
+    rs_result-package   = is_local-item-devclass.
+    rs_result-srcsystem = is_local-item-srcsystem.
+    rs_result-origlang  = is_local-item-origlang.
+    rs_result-inactive  = is_local-item-inactive.
+ 
+    " File
+    rs_result-path     = is_local-file-path.
+    rs_result-filename = is_local-file-filename.
+ 
+    rs_result-match    = boolc( is_local-file-sha1 = is_remote-sha1 ).
+    IF rs_result-match = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " Match against current state
+    READ TABLE it_state INTO ls_file_sig
+      WITH KEY
+        path     = is_local-file-path
+        filename = is_local-file-filename
+      BINARY SEARCH.
+ 
+    IF sy-subrc = 0.
+      IF ls_file_sig-sha1 <> is_local-file-sha1.
+        rs_result-lstate = zif_abapgit_definitions=>c_state-modified.
+      ENDIF.
+      IF ls_file_sig-sha1 <> is_remote-sha1.
+        rs_result-rstate = zif_abapgit_definitions=>c_state-modified.
+      ENDIF.
+    ELSE.
+      " This is a strange situation. As both local and remote exist
+      " the state should also be present. Maybe this is a first run of the code.
+      " In this case just compare hashes directly and mark both changed
+      " the user will presumably decide what to do after checking the actual diff
+      rs_result-lstate = zif_abapgit_definitions=>c_state-modified.
+      rs_result-rstate = zif_abapgit_definitions=>c_state-modified.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_new_local.
+ 
+    " Item
+    rs_result-obj_type  = is_local-item-obj_type.
+    rs_result-obj_name  = is_local-item-obj_name.
+    rs_result-package   = is_local-item-devclass.
+    rs_result-srcsystem = is_local-item-srcsystem.
+    rs_result-origlang  = is_local-item-origlang.
+    rs_result-inactive  = is_local-item-inactive.
+ 
+    " File
+    rs_result-path     = is_local-file-path.
+    rs_result-filename = is_local-file-filename.
+ 
+    " Match
+    rs_result-match    = abap_false.
+    rs_result-lstate   = zif_abapgit_definitions=>c_state-added.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_new_remote.
+ 
+    DATA ls_item     LIKE LINE OF it_items_idx.
+    DATA ls_file_sig LIKE LINE OF it_state_idx.
+ 
+    " Common and default part
+    rs_result-path     = is_remote-path.
+    rs_result-filename = is_remote-filename.
+    rs_result-match    = abap_false.
+    rs_result-rstate   = zif_abapgit_definitions=>c_state-added.
+ 
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = is_remote-filename
+        iv_path     = is_remote-path
+        iv_devclass = mv_root_package
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item ).
+ 
+    " Check if in item index + get package
+    READ TABLE it_items_idx INTO ls_item
+      WITH KEY
+        obj_type = ls_item-obj_type
+        obj_name = ls_item-obj_name.
+ 
+    IF sy-subrc = 0.
+ 
+      " Completely new (xml, abap) and new file in an existing object
+      rs_result-obj_type  = ls_item-obj_type.
+      rs_result-obj_name  = ls_item-obj_name.
+      rs_result-package   = ls_item-devclass.
+      rs_result-srcsystem = sy-sysid.
+      rs_result-origlang  = sy-langu.
+ 
+      READ TABLE it_state_idx INTO ls_file_sig
+        WITH KEY
+          path     = is_remote-path
+          filename = is_remote-filename.
+ 
+      " Existing file but from another package
+      " was not added during local file proc as was not in tadir for repo package
+      IF sy-subrc = 0.
+        IF ls_file_sig-sha1 = is_remote-sha1.
+          rs_result-match = abap_true.
+          CLEAR rs_result-rstate.
+        ELSE.
+          rs_result-rstate = zif_abapgit_definitions=>c_state-modified.
+        ENDIF.
+ 
+        " Item is in state and in cache but with no package - it was deleted
+        " OR devclass is the same as repo package (see #532)
+        IF ls_item-devclass IS INITIAL OR ls_item-devclass = mv_root_package.
+          rs_result-match  = abap_false.
+          rs_result-lstate = zif_abapgit_definitions=>c_state-deleted.
+        ENDIF.
+      ENDIF.
+ 
+    ELSE. " Completely unknown file, probably non-abapgit
+      ASSERT 1 = 1. " No action, just follow defaults
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD calculate_status.
+ 
+    DATA:
+      lt_remote        LIKE it_remote,
+      lt_items         TYPE zif_abapgit_definitions=>ty_items_tt,
+      lt_items_by_obj  TYPE zif_abapgit_definitions=>ty_items_ts, " Sorted by obj_type+obj_name
+      lt_state_by_file TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts. " Sorted by path+filename
+ 
+    lt_state_by_file = ensure_state( " Index by file
+      it_cur_state = it_cur_state
+      it_local     = it_local ).
+    lt_remote        = it_remote.
+ 
+    " Process local files and new local files
+    process_local(
+      EXPORTING
+        it_local     = it_local
+        it_state_idx = lt_state_by_file
+      CHANGING
+        ct_remote    = lt_remote
+        ct_items     = lt_items
+        ct_results   = rt_results ).
+ 
+    " Remove processed remotes (with cleared SHA1)
+    DELETE lt_remote WHERE sha1 IS INITIAL.
+ 
+    " Complete item index for unmarked remote files
+    process_items( " TODO: rename ?
+      EXPORTING
+        it_unprocessed_remote = lt_remote
+      CHANGING
+        ct_items              = lt_items ).
+ 
+    " The item list was not unique by now, just collected as "mention" list
+    SORT lt_items DESCENDING. " Default key - type, name, pkg, ...
+    DELETE ADJACENT DUPLICATES FROM lt_items COMPARING obj_type obj_name.
+    lt_items_by_obj = lt_items.
+ 
+    " Process new remote files (marked above with empty SHA1)
+    process_remote(
+      EXPORTING
+        it_local              = it_local
+        it_unprocessed_remote = lt_remote
+        it_state_idx          = lt_state_by_file
+        it_items_idx          = lt_items_by_obj
+      CHANGING
+        ct_results            = rt_results ).
+ 
+    SORT rt_results BY
+      obj_type ASCENDING
+      obj_name ASCENDING
+      filename ASCENDING
+      path ASCENDING.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_local_remote_consistency.
+    IF is_remote-sha1 IS INITIAL.
+      IF is_local-file-filename = zcl_abapgit_filename_logic=>c_package_file.
+        zcx_abapgit_exception=>raise(
+          |Package name conflict { is_local-item-obj_type } { is_local-item-obj_name }. | &&
+          |Rename package or use FULL folder logic| ).
+      ELSE.
+        zcx_abapgit_exception=>raise(
+          |Checksum conflict { is_local-item-obj_type } { is_local-item-obj_name }. | &&
+          |Please create an issue on Github| ).
+      ENDIF.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_root_package = iv_root_package.
+    mo_dot          = io_dot.
+  ENDMETHOD.
+ 
+ 
+  METHOD ensure_state.
+ 
+    FIELD-SYMBOLS <ls_state> LIKE LINE OF rt_state.
+    FIELD-SYMBOLS <ls_local> LIKE LINE OF it_local.
+ 
+    IF lines( it_cur_state ) = 0.
+      " Empty state is usually not expected. Maybe for new repos.
+      " In this case suppose the local state is unchanged
+      LOOP AT it_local ASSIGNING <ls_local>.
+        APPEND INITIAL LINE TO rt_state ASSIGNING <ls_state>.
+        MOVE-CORRESPONDING <ls_local>-file TO <ls_state>.
+      ENDLOOP.
+    ELSE.
+      rt_state = it_cur_state.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_object_package.
+    DATA: lv_name    TYPE devclass,
+          li_package TYPE REF TO zif_abapgit_sap_package.
+ 
+    rv_devclass = zcl_abapgit_factory=>get_tadir( )->get_object_package(
+      iv_object   = iv_object
+      iv_obj_name = iv_obj_name ).
+    IF rv_devclass IS INITIAL AND iv_object = ''DEVC'' AND iv_obj_name(1) = ''$''.
+      " local packages usually have no tadir entry
+      lv_name = iv_obj_name.
+      li_package = zcl_abapgit_factory=>get_sap_package( lv_name ).
+      IF li_package->exists( ) = abap_true.
+        rv_devclass = lv_name.
+      ENDIF.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD process_items.
+ 
+    DATA:
+      ls_item         LIKE LINE OF ct_items,
+      lv_is_xml       TYPE abap_bool,
+      lv_is_json      TYPE abap_bool,
+      lv_sub_fetched  TYPE abap_bool,
+      lt_sub_packages TYPE SORTED TABLE OF devclass WITH UNIQUE KEY table_line.
+ 
+    FIELD-SYMBOLS <ls_remote> LIKE LINE OF it_unprocessed_remote.
+ 
+    LOOP AT it_unprocessed_remote ASSIGNING <ls_remote>.
+ 
+      zcl_abapgit_filename_logic=>file_to_object(
+        EXPORTING
+          iv_filename = <ls_remote>-filename
+          iv_path     = <ls_remote>-path
+          io_dot      = mo_dot
+          iv_devclass = mv_root_package
+        IMPORTING
+          es_item     = ls_item
+          ev_is_xml   = lv_is_xml
+          ev_is_json  = lv_is_json ).
+ 
+      CHECK lv_is_xml = abap_true OR lv_is_json = abap_true. " only object definitions
+ 
+      ls_item-devclass = get_object_package(
+        iv_object   = ls_item-obj_type
+        iv_obj_name = ls_item-obj_name ).
+ 
+      IF ls_item-devclass IS NOT INITIAL AND mv_root_package <> ls_item-devclass.
+        IF lv_sub_fetched = abap_false.
+          lt_sub_packages = zcl_abapgit_factory=>get_sap_package( mv_root_package )->list_subpackages( ).
+          lv_sub_fetched  = abap_true.
+        ENDIF.
+ 
+        " Make sure the package is under the repo main package
+        READ TABLE lt_sub_packages TRANSPORTING NO FIELDS
+          WITH KEY table_line = ls_item-devclass.
+        IF sy-subrc <> 0 AND ls_item-obj_type = ''DEVC''.
+          CLEAR ls_item-devclass.
+        ENDIF.
+      ENDIF.
+ 
+      APPEND ls_item TO ct_items.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD process_local.
+ 
+    FIELD-SYMBOLS:
+      <ls_remote> LIKE LINE OF ct_remote,
+      <ls_result> LIKE LINE OF ct_results,
+      <ls_state>  LIKE LINE OF it_state_idx,
+      <ls_local>  LIKE LINE OF it_local.
+ 
+    LOOP AT it_local ASSIGNING <ls_local>.
+      " Skip ignored files
+      CHECK mo_dot->is_ignored(
+        iv_path     = <ls_local>-file-path
+        iv_filename = <ls_local>-file-filename ) = abap_false.
+ 
+      IF <ls_local>-item IS NOT INITIAL
+        AND zcl_abapgit_filename_logic=>is_obj_definition_file( <ls_local>-file-filename ) = abap_true.
+        " Collect for item index
+        APPEND <ls_local>-item TO ct_items.
+      ENDIF.
+ 
+      APPEND INITIAL LINE TO ct_results ASSIGNING <ls_result>.
+ 
+      " Find a match in remote
+      READ TABLE ct_remote ASSIGNING <ls_remote>
+        WITH KEY file_path
+        COMPONENTS
+          path     = <ls_local>-file-path
+          filename = <ls_local>-file-filename.
+      IF sy-subrc = 0.  " Both local and remote exist
+        check_local_remote_consistency(
+          is_local  = <ls_local>
+          is_remote = <ls_remote> ).
+        <ls_result> = build_existing(
+          is_local  = <ls_local>
+          is_remote = <ls_remote>
+          it_state  = it_state_idx ).
+        CLEAR <ls_remote>-sha1. " Mark as processed
+      ELSE. " Only local exists
+        <ls_result> = build_new_local( <ls_local> ).
+        " Check if same file exists in different location
+        READ TABLE ct_remote ASSIGNING <ls_remote>
+          WITH KEY file
+          COMPONENTS filename = <ls_local>-file-filename.
+        IF sy-subrc = 0 AND <ls_local>-file-sha1 = <ls_remote>-sha1.
+          " If yes, then it was probably moved
+          <ls_result>-packmove = abap_true.
+        ELSEIF sy-subrc = 4.
+          " Check if file existed before and was deleted remotely
+          READ TABLE it_state_idx ASSIGNING <ls_state>
+            WITH KEY
+              path     = <ls_local>-file-path
+              filename = <ls_local>-file-filename.
+          IF sy-subrc = 0.
+            IF <ls_local>-file-sha1 = <ls_state>-sha1.
+              <ls_result>-lstate = zif_abapgit_definitions=>c_state-unchanged.
+            ELSE.
+              <ls_result>-lstate = zif_abapgit_definitions=>c_state-modified.
+            ENDIF.
+            <ls_result>-rstate = zif_abapgit_definitions=>c_state-deleted. " ??
+          ENDIF.
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD process_remote.
+ 
+    FIELD-SYMBOLS:
+      <ls_remote> LIKE LINE OF it_unprocessed_remote,
+      <ls_result> LIKE LINE OF ct_results,
+      <ls_local>  LIKE LINE OF it_local.
+ 
+    LOOP AT it_unprocessed_remote ASSIGNING <ls_remote>.
+ 
+      APPEND INITIAL LINE TO ct_results ASSIGNING <ls_result>.
+ 
+      <ls_result> = build_new_remote(
+        is_remote   = <ls_remote>
+        it_items_idx = it_items_idx
+        it_state_idx = it_state_idx ).
+ 
+      " Check if same file exists in different location (not for generic package files)
+      READ TABLE it_local ASSIGNING <ls_local>
+        WITH KEY file-filename = <ls_remote>-filename.
+      IF sy-subrc = 0 AND <ls_remote>-filename <> zcl_abapgit_filename_logic=>c_package_file.
+        <ls_result>-match = abap_false.
+        <ls_result>-lstate = zif_abapgit_definitions=>c_state-deleted.
+        <ls_result>-rstate = zif_abapgit_definitions=>c_state-unchanged.
+        IF <ls_local>-file-sha1 = <ls_remote>-sha1.
+          <ls_result>-packmove = abap_true.
+        ENDIF.
+      ELSE.
+        " Check if file existed before and was deleted locally
+        READ TABLE it_state_idx TRANSPORTING NO FIELDS
+          WITH KEY
+            path     = <ls_remote>-path
+            filename = <ls_remote>-filename.
+        IF sy-subrc = 0.
+          <ls_result>-match  = abap_false.
+          <ls_result>-lstate = zif_abapgit_definitions=>c_state-deleted.
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD status.
+ 
+    DATA lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt.
+    DATA lt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+    DATA lo_instance TYPE REF TO zcl_abapgit_file_status.
+    DATA lo_consistency_checks TYPE REF TO lcl_status_consistency_checks.
+ 
+    lt_local = io_repo->get_files_local( ii_log = ii_log ).
+ 
+    IF lines( lt_local ) <= 2.
+      " Less equal two means that we have only the .abapgit.xml and the package in
+      " our local repository. In this case we have to update our local .abapgit.xml
+      " from the remote one. Otherwise we get errors when e.g. the folder starting
+      " folder is different.
+      io_repo->find_remote_dot_abapgit( ).
+    ENDIF.
+ 
+    lt_remote = io_repo->get_files_remote( iv_ignore_files = abap_true ).
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->pre_calculate_repo_status(
+      EXPORTING
+        is_repo_meta = io_repo->ms_data
+      CHANGING
+        ct_local  = lt_local
+        ct_remote = lt_remote ).
+ 
+    CREATE OBJECT lo_instance
+      EXPORTING
+        iv_root_package = io_repo->get_package( )
+        io_dot          = io_repo->get_dot_abapgit( ).
+ 
+    rt_results = lo_instance->calculate_status(
+      it_local     = lt_local
+      it_remote    = lt_remote
+      it_cur_state = io_repo->zif_abapgit_repo~checksums( )->get_checksums_per_file( ) ).
+ 
+    IF ii_log IS BOUND.
+      " This method just adds messages to the log. No log, nothing to do here
+      CREATE OBJECT lo_consistency_checks
+        EXPORTING
+          iv_root_package = io_repo->get_package( )
+          io_dot          = io_repo->get_dot_abapgit( ).
+      ii_log->merge_with( lo_consistency_checks->run_checks( rt_results ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO                        ', 'CLASS zcl_abapgit_repo DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_repo .
+ 
+    ALIASES ms_data
+      FOR zif_abapgit_repo~ms_data .
+    ALIASES deserialize
+      FOR zif_abapgit_repo~deserialize .
+    ALIASES deserialize_checks
+      FOR zif_abapgit_repo~deserialize_checks .
+    ALIASES get_dot_abapgit
+      FOR zif_abapgit_repo~get_dot_abapgit .
+    ALIASES get_files_local
+      FOR zif_abapgit_repo~get_files_local .
+    ALIASES get_files_remote
+      FOR zif_abapgit_repo~get_files_remote .
+    ALIASES get_key
+      FOR zif_abapgit_repo~get_key .
+    ALIASES get_local_settings
+      FOR zif_abapgit_repo~get_local_settings .
+    ALIASES get_name
+      FOR zif_abapgit_repo~get_name .
+    ALIASES get_package
+      FOR zif_abapgit_repo~get_package .
+    ALIASES is_offline
+      FOR zif_abapgit_repo~is_offline .
+    ALIASES refresh
+      FOR zif_abapgit_repo~refresh .
+    ALIASES set_dot_abapgit
+      FOR zif_abapgit_repo~set_dot_abapgit .
+ 
+    METHODS bind_listener
+      IMPORTING
+        !ii_listener TYPE REF TO zif_abapgit_repo_listener .
+    METHODS check_and_create_package
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !is_data TYPE zif_abapgit_persistence=>ty_repo .
+    METHODS create_new_log
+      IMPORTING
+        !iv_title     TYPE string OPTIONAL
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log .
+    METHODS delete_checks
+      RETURNING
+        VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_delete_checks
+      RAISING
+        zcx_abapgit_exception .
+    METHODS find_remote_dot_abapgit
+      RETURNING
+        VALUE(ro_dot) TYPE REF TO zcl_abapgit_dot_abapgit
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_data_config
+      RETURNING
+        VALUE(ri_config) TYPE REF TO zif_abapgit_data_config
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_dot_apack
+      RETURNING
+        VALUE(ro_dot_apack) TYPE REF TO zcl_abapgit_apack_reader .
+    METHODS get_log
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log .
+    METHODS get_unsupported_objects_local
+      RETURNING
+        VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS has_remote_source
+      ABSTRACT
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS refresh_local_object
+      IMPORTING
+        !iv_obj_type TYPE tadir-object
+        !iv_obj_name TYPE tadir-obj_name
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_local_objects
+      RAISING
+        zcx_abapgit_exception .
+    METHODS remove_ignored_files
+      CHANGING
+        !ct_files TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS reset_status .
+    METHODS set_files_remote
+      IMPORTING
+        !it_files TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    METHODS set_local_settings
+      IMPORTING
+        !is_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings
+      RAISING
+        zcx_abapgit_exception .
+    METHODS status
+      IMPORTING
+        !ii_log           TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS switch_repo_type
+      IMPORTING
+        !iv_offline TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    DATA mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt .
+    DATA mt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    DATA mv_request_local_refresh TYPE abap_bool .
+    DATA mv_request_remote_refresh TYPE abap_bool .
+    DATA mt_status TYPE zif_abapgit_definitions=>ty_results_tt .
+    DATA mi_log TYPE REF TO zif_abapgit_log .
+    DATA mi_listener TYPE REF TO zif_abapgit_repo_listener .
+    DATA mo_apack_reader TYPE REF TO zcl_abapgit_apack_reader .
+    DATA mi_data_config TYPE REF TO zif_abapgit_data_config .
+ 
+    METHODS find_remote_dot_apack
+      RETURNING
+        VALUE(ro_dot) TYPE REF TO zcl_abapgit_apack_reader
+      RAISING
+        zcx_abapgit_exception .
+    METHODS reset_remote .
+    METHODS set
+      IMPORTING
+        !iv_url             TYPE zif_abapgit_persistence=>ty_repo-url OPTIONAL
+        !iv_branch_name     TYPE zif_abapgit_persistence=>ty_repo-branch_name OPTIONAL
+        !iv_selected_commit TYPE zif_abapgit_persistence=>ty_repo-selected_commit OPTIONAL
+        !iv_head_branch     TYPE zif_abapgit_persistence=>ty_repo-head_branch OPTIONAL
+        !iv_offline         TYPE zif_abapgit_persistence=>ty_repo-offline OPTIONAL
+        !is_dot_abapgit     TYPE zif_abapgit_persistence=>ty_repo-dot_abapgit OPTIONAL
+        !is_local_settings  TYPE zif_abapgit_persistence=>ty_repo-local_settings OPTIONAL
+        !iv_deserialized_at TYPE zif_abapgit_persistence=>ty_repo-deserialized_at OPTIONAL
+        !iv_deserialized_by TYPE zif_abapgit_persistence=>ty_repo-deserialized_by OPTIONAL
+        !iv_switched_origin TYPE zif_abapgit_persistence=>ty_repo-switched_origin OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_dot_apack
+      IMPORTING
+        !io_dot_apack TYPE REF TO zcl_abapgit_apack_reader
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    METHODS check_for_restart .
+    METHODS check_language
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_write_protect
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_data
+      IMPORTING
+        !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      CHANGING
+        !ct_files  TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_dot_abapgit
+      CHANGING
+        !ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_objects
+      IMPORTING
+        !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+        !ii_log    TYPE REF TO zif_abapgit_log
+      CHANGING
+        !ct_files  TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS normalize_local_settings
+      CHANGING
+        !cs_local_settings TYPE zif_abapgit_persistence=>ty_local_settings .
+    METHODS notify_listener
+      IMPORTING
+        !is_change_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_last_deserialize
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_abap_language_version
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION.
+ 
+ 
+  METHOD bind_listener.
+    mi_listener = ii_listener.
+  ENDMETHOD.
+ 
+ 
+  METHOD check_and_create_package.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lv_package TYPE devclass.
+ 
+    ls_item-obj_type = ''DEVC''.
+    ls_item-obj_name = iv_package.
+ 
+    IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+      " Check if any package is included in remote
+      READ TABLE mt_remote TRANSPORTING NO FIELDS
+        WITH KEY file
+        COMPONENTS filename = zcl_abapgit_filename_logic=>c_package_file.
+      IF sy-subrc <> 0.
+        " If not, prompt to create it
+        lv_package = zcl_abapgit_services_basis=>create_package( iv_package ).
+        IF lv_package IS NOT INITIAL.
+          COMMIT WORK AND WAIT.
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_for_restart.
+ 
+    CONSTANTS:
+      lc_abapgit_prog TYPE progname VALUE \`ZABAPGIT\`.
+ 
+    " If abapGit was used to update itself, then restart to avoid LOAD_PROGRAM_&_MISMATCH dumps
+    " because abapGit code was changed at runtime
+    IF zcl_abapgit_ui_factory=>get_frontend_services( )->gui_is_available( ) = abap_true AND
+       zcl_abapgit_url=>is_abapgit_repo( ms_data-url ) = abap_true AND
+       sy-batch = abap_false AND
+       sy-cprog = lc_abapgit_prog.
+ 
+      IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_show_default_repo( ) = abap_false.
+        MESSAGE ''abapGit was updated and will restart itself'' TYPE ''I''.
+      ENDIF.
+ 
+      SUBMIT (sy-cprog).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_language.
+ 
+    DATA:
+      lv_main_language  TYPE spras,
+      lv_error_message  TYPE string,
+      lv_error_longtext TYPE string.
+ 
+    " for deserialize, assumes find_remote_dot_abapgit has been called before (or language won''t be defined)
+    lv_main_language = get_dot_abapgit( )->get_main_language( ).
+ 
+    IF lv_main_language <> sy-langu.
+ 
+      lv_error_message = |Current login language |
+                      && |''{ zcl_abapgit_convert=>conversion_exit_isola_output( sy-langu ) }''|
+                      && | does not match main language |
+                      && |''{ zcl_abapgit_convert=>conversion_exit_isola_output( lv_main_language ) }''.|.
+ 
+      " Feature open in main language only exists if abapGit tcode is present
+      IF zcl_abapgit_services_abapgit=>get_abapgit_tcode( ) IS INITIAL.
+        lv_error_message = lv_error_message && | Please logon in main language and retry.|.
+        lv_error_longtext = |For the Advanced menu option ''Open in Main Language'' to be available a transaction code| &&
+                            | must be assigned to report { sy-cprog }.|.
+      ELSE.
+        lv_error_message = lv_error_message && | Select ''Advanced'' > ''Open in Main Language''|.
+      ENDIF.
+ 
+      zcx_abapgit_exception=>raise( iv_text     = lv_error_message
+                                    iv_longtext = lv_error_longtext ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_write_protect.
+ 
+    IF get_local_settings( )-write_protected = abap_true.
+      zcx_abapgit_exception=>raise( ''Cannot deserialize. Local code is write-protected by repo config'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    ASSERT NOT is_data-key IS INITIAL.
+ 
+    ms_data = is_data.
+    mv_request_remote_refresh = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_new_log.
+ 
+    CREATE OBJECT mi_log TYPE zcl_abapgit_log.
+    mi_log->set_title( iv_title ).
+ 
+    ri_log = mi_log.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_checks.
+ 
+    DATA: li_package TYPE REF TO zif_abapgit_sap_package.
+ 
+    check_write_protect( ).
+    check_language( ).
+ 
+    li_package = zcl_abapgit_factory=>get_sap_package( get_package( ) ).
+    rs_checks-transport-required = li_package->are_changes_recorded_in_tr_req( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_data.
+ 
+    DATA:
+      lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
+      lt_result        TYPE zif_abapgit_data_deserializer=>ty_results.
+ 
+    "Deserialize data
+    lt_result = zcl_abapgit_data_factory=>get_deserializer( )->deserialize(
+      ii_config  = get_data_config( )
+      it_files   = get_files_remote( ) ).
+ 
+    "Save deserialized data to DB and add entries to transport requests
+    lt_updated_files = zcl_abapgit_data_factory=>get_deserializer( )->actualize(
+      it_result = lt_result
+      is_checks = is_checks ).
+ 
+    INSERT LINES OF lt_updated_files INTO TABLE ct_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_dot_abapgit.
+    INSERT get_dot_abapgit( )->get_signature( ) INTO TABLE ct_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_objects.
+ 
+    DATA:
+      lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
+      lx_error         TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        lt_updated_files = zcl_abapgit_objects=>deserialize(
+          io_repo   = me
+          is_checks = is_checks
+          ii_log    = ii_log ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        " Ensure to reset default transport request task
+        zcl_abapgit_default_transport=>get_instance( )->reset( ).
+        refresh( iv_drop_log = abap_false ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+    INSERT LINES OF lt_updated_files INTO TABLE ct_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_remote_dot_abapgit.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
+ 
+    get_files_remote( ).
+ 
+    READ TABLE mt_remote ASSIGNING <ls_remote>
+      WITH KEY file_path
+      COMPONENTS path     = zif_abapgit_definitions=>c_root_dir
+                 filename = zif_abapgit_definitions=>c_dot_abapgit.
+    IF sy-subrc = 0.
+      ro_dot = zcl_abapgit_dot_abapgit=>deserialize( <ls_remote>-data ).
+      set_dot_abapgit( ro_dot ).
+      COMMIT WORK AND WAIT. " to release lock
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_remote_dot_apack.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
+ 
+    get_files_remote( ).
+ 
+    READ TABLE mt_remote ASSIGNING <ls_remote>
+      WITH KEY file_path
+      COMPONENTS path     = zif_abapgit_definitions=>c_root_dir
+                 filename = zif_abapgit_apack_definitions=>c_dot_apack_manifest.
+    IF sy-subrc = 0.
+      ro_dot = zcl_abapgit_apack_reader=>deserialize( iv_package_name = ms_data-package
+                                                      iv_xstr         = <ls_remote>-data ).
+      set_dot_apack( ro_dot ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_data_config.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
+ 
+    IF mi_data_config IS BOUND.
+      ri_config = mi_data_config.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT ri_config TYPE zcl_abapgit_data_config.
+    mi_data_config = ri_config.
+ 
+    " Assume remote data has been loaded already
+    READ TABLE mt_remote ASSIGNING <ls_remote>
+      WITH KEY file_path
+      COMPONENTS path = zif_abapgit_data_config=>c_default_path.
+    IF sy-subrc = 0.
+      ri_config->from_json( mt_remote ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_dot_apack.
+    IF mo_apack_reader IS NOT BOUND.
+      mo_apack_reader = zcl_abapgit_apack_reader=>create_instance( ms_data-package ).
+    ENDIF.
+ 
+    ro_dot_apack = mo_apack_reader.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_log.
+    ri_log = mi_log.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_unsupported_objects_local.
+ 
+    DATA: lt_tadir           TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          lt_supported_types TYPE zcl_abapgit_objects=>ty_types_tt.
+ 
+    FIELD-SYMBOLS: <ls_tadir>  LIKE LINE OF lt_tadir,
+                   <ls_object> LIKE LINE OF rt_objects.
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+                      iv_package            = ms_data-package
+                      iv_ignore_subpackages = ms_data-local_settings-ignore_subpackages
+                      iv_only_local_objects = ms_data-local_settings-only_local_objects
+                      io_dot                = get_dot_abapgit( ) ).
+ 
+    lt_supported_types = zcl_abapgit_objects=>supported_list( ).
+    LOOP AT lt_tadir ASSIGNING <ls_tadir>.
+      READ TABLE lt_supported_types WITH KEY table_line = <ls_tadir>-object TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        APPEND INITIAL LINE TO rt_objects ASSIGNING <ls_object>.
+        MOVE-CORRESPONDING <ls_tadir> TO <ls_object>.
+        <ls_object>-obj_type = <ls_tadir>-object.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_local_settings.
+ 
+    cs_local_settings-labels = zcl_abapgit_repo_labels=>normalize( cs_local_settings-labels ).
+ 
+    " TODO: more validation and normalization ?
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD notify_listener.
+ 
+    DATA ls_meta_slug TYPE zif_abapgit_persistence=>ty_repo_xml.
+ 
+    IF mi_listener IS BOUND.
+      MOVE-CORRESPONDING ms_data TO ls_meta_slug.
+      mi_listener->on_meta_change(
+        iv_key         = ms_data-key
+        is_meta        = ls_meta_slug
+        is_change_mask = is_change_mask ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local_object.
+ 
+    DATA:
+      ls_tadir           TYPE zif_abapgit_definitions=>ty_tadir,
+      lt_tadir           TYPE zif_abapgit_definitions=>ty_tadir_tt,
+      lt_new_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt,
+      lo_serialize       TYPE REF TO zcl_abapgit_serialize.
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+                   iv_package = ms_data-package
+                   io_dot     = get_dot_abapgit( ) ).
+ 
+    DELETE mt_local WHERE item-obj_type = iv_obj_type
+                    AND   item-obj_name = iv_obj_name.
+ 
+    READ TABLE lt_tadir INTO ls_tadir
+                        WITH KEY object   = iv_obj_type
+                                 obj_name = iv_obj_name.
+    IF sy-subrc <> 0 OR ls_tadir-delflag = abap_true.
+      " object doesn''t exist anymore, nothing todo here
+      RETURN.
+    ENDIF.
+ 
+    CLEAR lt_tadir.
+    INSERT ls_tadir INTO TABLE lt_tadir.
+ 
+    CREATE OBJECT lo_serialize.
+    lt_new_local_files = lo_serialize->serialize(
+      iv_package = ms_data-package
+      it_tadir   = lt_tadir ).
+ 
+    INSERT LINES OF lt_new_local_files INTO TABLE mt_local.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local_objects.
+ 
+    mv_request_local_refresh = abap_true.
+    get_files_local( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_ignored_files.
+ 
+    DATA lo_dot TYPE REF TO zcl_abapgit_dot_abapgit.
+    DATA lv_index TYPE sy-index.
+ 
+    FIELD-SYMBOLS <ls_files> LIKE LINE OF ct_files.
+ 
+    lo_dot = get_dot_abapgit( ).
+ 
+    " Skip ignored files
+    LOOP AT ct_files ASSIGNING <ls_files>.
+      lv_index = sy-tabix.
+      IF lo_dot->is_ignored( iv_path     = <ls_files>-path
+                             iv_filename = <ls_files>-filename ) = abap_true.
+        DELETE ct_files INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reset_remote.
+    CLEAR mt_remote.
+    mv_request_remote_refresh = abap_true.
+    reset_status( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD reset_status.
+    CLEAR mt_status.
+  ENDMETHOD.
+ 
+ 
+  METHOD set.
+ 
+* TODO: refactor, maybe use zcl_abapgit_string_map ?
+ 
+    DATA: ls_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask.
+ 
+ 
+    ASSERT iv_url IS SUPPLIED
+      OR iv_branch_name IS SUPPLIED
+      OR iv_selected_commit IS SUPPLIED
+      OR iv_head_branch IS SUPPLIED
+      OR iv_offline IS SUPPLIED
+      OR is_dot_abapgit IS SUPPLIED
+      OR is_local_settings IS SUPPLIED
+      OR iv_deserialized_by IS SUPPLIED
+      OR iv_deserialized_at IS SUPPLIED
+      OR iv_switched_origin IS SUPPLIED.
+ 
+ 
+    IF iv_url IS SUPPLIED.
+      ms_data-url = iv_url.
+      ls_mask-url = abap_true.
+    ENDIF.
+ 
+    IF iv_branch_name IS SUPPLIED.
+      ms_data-branch_name = iv_branch_name.
+      ls_mask-branch_name = abap_true.
+    ENDIF.
+ 
+    IF iv_selected_commit IS SUPPLIED.
+      ms_data-selected_commit = iv_selected_commit.
+      ls_mask-selected_commit = abap_true.
+    ENDIF.
+ 
+    IF iv_head_branch IS SUPPLIED.
+      ms_data-head_branch = iv_head_branch.
+      ls_mask-head_branch = abap_true.
+    ENDIF.
+ 
+    IF iv_offline IS SUPPLIED.
+      ms_data-offline = iv_offline.
+      ls_mask-offline = abap_true.
+    ENDIF.
+ 
+    IF is_dot_abapgit IS SUPPLIED.
+      ms_data-dot_abapgit = is_dot_abapgit.
+      ls_mask-dot_abapgit = abap_true.
+    ENDIF.
+ 
+    IF is_local_settings IS SUPPLIED.
+      ms_data-local_settings = is_local_settings.
+      ls_mask-local_settings = abap_true.
+      normalize_local_settings( CHANGING cs_local_settings = ms_data-local_settings ).
+    ENDIF.
+ 
+    IF iv_deserialized_at IS SUPPLIED OR iv_deserialized_by IS SUPPLIED.
+      ms_data-deserialized_at = iv_deserialized_at.
+      ms_data-deserialized_by = iv_deserialized_by.
+      ls_mask-deserialized_at = abap_true.
+      ls_mask-deserialized_by = abap_true.
+    ENDIF.
+ 
+    IF iv_switched_origin IS SUPPLIED.
+      ms_data-switched_origin = iv_switched_origin.
+      ls_mask-switched_origin = abap_true.
+    ENDIF.
+ 
+    notify_listener( ls_mask ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_dot_apack.
+    get_dot_apack( ).
+    mo_apack_reader->set_manifest_descriptor( io_dot_apack->get_manifest_descriptor( ) ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_files_remote.
+ 
+    mt_remote = it_files.
+    mv_request_remote_refresh = abap_false.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_local_settings.
+ 
+    set( is_local_settings = is_settings ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD status.
+ 
+    IF lines( mt_status ) = 0.
+      mt_status = zcl_abapgit_file_status=>status( io_repo = me
+                                                   ii_log  = ii_log ).
+ 
+    ENDIF.
+ 
+    rt_results = mt_status.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_repo_type.
+ 
+    IF iv_offline = ms_data-offline.
+      zcx_abapgit_exception=>raise( |Cannot switch_repo_type, offline already = "{ ms_data-offline }"| ).
+    ENDIF.
+ 
+    IF iv_offline = abap_true. " On-line -> OFFline
+      set( iv_url             = zcl_abapgit_url=>name( ms_data-url )
+           iv_branch_name     = ''''
+           iv_selected_commit = ''''
+           iv_head_branch     = ''''
+           iv_offline         = abap_true ).
+    ELSE. " OFFline -> On-line
+      set( iv_offline = abap_false ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_last_deserialize.
+ 
+    DATA: lv_deserialized_at TYPE zif_abapgit_persistence=>ty_repo-deserialized_at,
+          lv_deserialized_by TYPE zif_abapgit_persistence=>ty_repo-deserialized_by.
+ 
+    GET TIME STAMP FIELD lv_deserialized_at.
+    lv_deserialized_by = sy-uname.
+ 
+    set( iv_deserialized_at = lv_deserialized_at
+         iv_deserialized_by = lv_deserialized_by ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~checksums.
+ 
+    CREATE OBJECT ri_checksums TYPE zcl_abapgit_repo_checksums
+      EXPORTING
+        iv_repo_key = ms_data-key.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~deserialize.
+ 
+    DATA lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt.
+ 
+    find_remote_dot_abapgit( ).
+    find_remote_dot_apack( ).
+ 
+    check_write_protect( ).
+    check_language( ).
+ 
+    IF is_checks-requirements-met = zif_abapgit_definitions=>c_no AND is_checks-requirements-decision IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Requirements not met and undecided'' ).
+    ENDIF.
+ 
+    IF is_checks-dependencies-met = zif_abapgit_definitions=>c_no.
+      zcx_abapgit_exception=>raise( ''APACK dependencies not met'' ).
+    ENDIF.
+ 
+    IF is_checks-transport-required = abap_true AND is_checks-transport-transport IS INITIAL.
+      zcx_abapgit_exception=>raise( |No transport request was supplied| ).
+    ENDIF.
+ 
+    deserialize_dot_abapgit( CHANGING ct_files = lt_updated_files ).
+ 
+    deserialize_objects(
+      EXPORTING
+        is_checks = is_checks
+        ii_log    = ii_log
+      CHANGING
+        ct_files  = lt_updated_files ).
+ 
+    deserialize_data(
+      EXPORTING
+        is_checks = is_checks
+      CHANGING
+        ct_files  = lt_updated_files ).
+ 
+    CLEAR mt_local. " Should be before CS update which uses NEW local
+ 
+    zif_abapgit_repo~checksums( )->update( lt_updated_files ).
+ 
+    update_last_deserialize( ).
+    reset_status( ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+    check_for_restart( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~deserialize_checks.
+ 
+    DATA: lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+          lt_dependencies TYPE zif_abapgit_apack_definitions=>ty_dependencies.
+ 
+    find_remote_dot_abapgit( ).
+    find_remote_dot_apack( ).
+ 
+    check_write_protect( ).
+    check_language( ).
+    check_abap_language_version( ).
+ 
+    rs_checks = zcl_abapgit_objects=>deserialize_checks( me ).
+ 
+    lt_requirements = get_dot_abapgit( )->get_data( )-requirements.
+    rs_checks-requirements-met = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements ).
+ 
+    lt_dependencies = get_dot_apack( )->get_manifest_descriptor( )-dependencies.
+    rs_checks-dependencies-met = zcl_abapgit_apack_helper=>are_dependencies_met( lt_dependencies ).
+ 
+    rs_checks-customizing = zcl_abapgit_data_factory=>get_deserializer( )->deserialize_check(
+      io_repo   = me
+      ii_config = get_data_config( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_dot_abapgit.
+    CREATE OBJECT ro_dot_abapgit
+      EXPORTING
+        is_data = ms_data-dot_abapgit.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_files_local.
+ 
+    DATA lo_serialize TYPE REF TO zcl_abapgit_serialize.
+    DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    " Serialization happened before and no refresh request
+    IF lines( mt_local ) > 0 AND mv_request_local_refresh = abap_false.
+      rt_files = mt_local.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT lo_serialize
+      EXPORTING
+        io_dot_abapgit    = get_dot_abapgit( )
+        is_local_settings = get_local_settings( ).
+ 
+    IF ii_obj_filter IS NOT INITIAL.
+      lt_filter = ii_obj_filter->get_filter( ).
+    ENDIF.
+ 
+    rt_files = lo_serialize->files_local(
+      iv_package     = get_package( )
+      ii_data_config = get_data_config( )
+      ii_log         = ii_log
+      it_filter      = lt_filter ).
+ 
+    mt_local                 = rt_files.
+    mv_request_local_refresh = abap_false. " Fulfill refresh
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_files_remote.
+    DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    DATA lr_filter TYPE REF TO zcl_abapgit_repo_filter.
+ 
+    rt_files = mt_remote.
+    IF ii_obj_filter IS NOT INITIAL.
+      lt_filter = ii_obj_filter->get_filter( ).
+ 
+      CREATE OBJECT lr_filter.
+      lr_filter->apply_object_filter(
+        EXPORTING
+          it_filter   = lt_filter
+          io_dot      = get_dot_abapgit( )
+          iv_devclass = get_package( )
+        CHANGING
+          ct_files    = rt_files ).
+ 
+    ENDIF.
+ 
+    IF iv_ignore_files = abap_true.
+      remove_ignored_files( CHANGING ct_files = rt_files ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_key.
+    rv_key = ms_data-key.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_local_settings.
+ 
+    rs_settings = ms_data-local_settings.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_name.
+ 
+    rv_name = ms_data-local_settings-display_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_package.
+    rv_package = ms_data-package.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~is_offline.
+    rv_offline = ms_data-offline.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~refresh.
+ 
+    mv_request_local_refresh = abap_true.
+    reset_remote( ).
+ 
+    IF iv_drop_log = abap_true.
+      CLEAR mi_log.
+    ENDIF.
+ 
+    IF iv_drop_cache = abap_true.
+      CLEAR mt_local.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~set_dot_abapgit.
+    set( is_dot_abapgit = io_dot_abapgit->get_data( ) ).
+  ENDMETHOD.
+ 
+ 
+  METHOD check_abap_language_version.
+ 
+    DATA lo_abapgit_abap_language_vers TYPE REF TO zcl_abapgit_abap_language_vers.
+    DATA lv_text TYPE string.
+    CREATE OBJECT lo_abapgit_abap_language_vers.
+ 
+    IF lo_abapgit_abap_language_vers->is_import_allowed( io_repo = me
+                                                         iv_package = ms_data-package ) = abap_false.
+      lv_text = |Repository cannot be imported. | &&
+                |ABAP Language Version of linked package is not compatible with repository settings.|.
+      zcx_abapgit_exception=>raise( iv_text = lv_text ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO_CHECKSUMS              ', 'CLASS zcl_abapgit_repo_checksums DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_repo_checksums.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS force_write
+      IMPORTING
+        it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_local_files_by_item_tt TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_file_item WITH NON-UNIQUE KEY item.
+ 
+    DATA mv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key.
+    DATA mi_repo TYPE REF TO zif_abapgit_repo.
+ 
+    METHODS remove_non_code_related_files
+      CHANGING
+        !ct_local_files TYPE ty_local_files_by_item_tt.
+ 
+    METHODS build_checksums_from_files
+      IMPORTING
+        it_local     TYPE ty_local_files_by_item_tt
+      RETURNING
+        VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+    METHODS save_checksums
+      IMPORTING
+        it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS add_meta
+      CHANGING
+        cv_cs_blob TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS extract_meta
+      CHANGING
+*        co_string_map - return string map with meta when it is needed
+        cv_cs_blob TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REPO_CHECKSUMS IMPLEMENTATION.
+ 
+ 
+  METHOD add_meta.
+ 
+    DATA lv_meta_str TYPE string.
+ 
+    lv_meta_str = |#repo_name#{ mi_repo->get_name( ) }|.
+ 
+    cv_cs_blob = lv_meta_str && |\\n| && cv_cs_blob.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_checksums_from_files.
+ 
+    DATA ls_last_item TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS:
+      <ls_checksum>    LIKE LINE OF rt_checksums,
+      <ls_local>       LIKE LINE OF it_local,
+      <ls_cs_file_sig> LIKE LINE OF <ls_checksum>-files.
+ 
+    " This methods is run at repo creation moment or manually by user
+    " In the first case it assumes that the local state is the CURRENT state
+    " Thus the idea is to copy local state to checksums
+    " The second case is an exception, when we acknoledge that the state is unknown
+    " Thus copying the local to checksums is the "best guess"
+ 
+    LOOP AT it_local ASSIGNING <ls_local>.
+      IF ls_last_item <> <ls_local>-item OR sy-tabix = 1. " First or New item reached ?
+        APPEND INITIAL LINE TO rt_checksums ASSIGNING <ls_checksum>.
+        MOVE-CORRESPONDING <ls_local>-item TO <ls_checksum>-item.
+        ls_last_item       = <ls_local>-item.
+      ENDIF.
+ 
+      APPEND INITIAL LINE TO <ls_checksum>-files ASSIGNING <ls_cs_file_sig>.
+      MOVE-CORRESPONDING <ls_local>-file TO <ls_cs_file_sig>.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    ASSERT iv_repo_key IS NOT INITIAL.
+    mv_repo_key = iv_repo_key.
+    mi_repo = zcl_abapgit_repo_srv=>get_instance( )->get( mv_repo_key ).
+    " Should be safe as repo_srv is supposed to be single source of repo instances
+  ENDMETHOD.
+ 
+ 
+  METHOD extract_meta.
+ 
+    DATA lv_meta_str TYPE string.
+ 
+    IF cv_cs_blob+0(1) <> ''#''.
+      RETURN. " No meta ? just ignore it
+    ENDIF.
+ 
+    SPLIT cv_cs_blob AT |\\n| INTO lv_meta_str cv_cs_blob.
+    " Just remove the header meta string - this is OK for now.
+    " There is just repo name for the moment - needed to for DB util and potential debug
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD force_write.
+ 
+    " for migration only for the moment
+ 
+    save_checksums( it_checksums ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_non_code_related_files.
+ 
+    DELETE ct_local_files
+      WHERE item IS INITIAL
+      AND NOT ( file-path = zif_abapgit_definitions=>c_root_dir
+      AND file-filename = zif_abapgit_definitions=>c_dot_abapgit ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_checksums.
+ 
+    DATA lv_cs_blob TYPE string.
+ 
+    lv_cs_blob = lcl_checksum_serializer=>serialize( it_checksums ).
+    add_meta( CHANGING cv_cs_blob = lv_cs_blob ).
+    zcl_abapgit_persist_factory=>get_repo_cs( )->update(
+      iv_key     = mv_repo_key
+      iv_cs_blob = lv_cs_blob ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_checksums~get.
+ 
+    DATA lv_cs_blob TYPE string.
+ 
+    TRY.
+        lv_cs_blob = zcl_abapgit_persist_factory=>get_repo_cs( )->read( iv_key = mv_repo_key ).
+      CATCH zcx_abapgit_exception zcx_abapgit_not_found.
+        " Ignore currently, it''s not critical for execution, just return empty
+        RETURN.
+    ENDTRY.
+ 
+    IF lv_cs_blob IS NOT INITIAL.
+      extract_meta( CHANGING cv_cs_blob = lv_cs_blob ).
+      rt_checksums = lcl_checksum_serializer=>deserialize( lv_cs_blob ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_checksums~get_checksums_per_file.
+ 
+    DATA lt_checksums   TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    FIELD-SYMBOLS <ls_object> LIKE LINE OF lt_checksums.
+ 
+    lt_checksums = zif_abapgit_repo_checksums~get( ).
+ 
+    LOOP AT lt_checksums ASSIGNING <ls_object>.
+      APPEND LINES OF <ls_object>-files TO rt_checksums.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_checksums~rebuild.
+ 
+    DATA lt_local     TYPE ty_local_files_by_item_tt.
+    DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+    lt_local  = mi_repo->get_files_local( ).
+    remove_non_code_related_files( CHANGING ct_local_files = lt_local ).
+ 
+    lt_checksums = build_checksums_from_files( lt_local ).
+    save_checksums( lt_checksums ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_checksums~update.
+ 
+    DATA lt_checksums   TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lt_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt.
+ 
+    lt_checksums   = zif_abapgit_repo_checksums~get( ).
+    lt_local_files = mi_repo->get_files_local( ).
+ 
+    lt_checksums = lcl_update_calculator=>calculate_updated(
+      it_current_checksums = lt_checksums
+      it_local_files       = lt_local_files
+      it_updated_files     = it_updated_files ).
+ 
+    save_checksums( lt_checksums ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO_CONTENT_LIST           ', 'CLASS zcl_abapgit_repo_content_list DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING io_repo TYPE REF TO zcl_abapgit_repo.
+ 
+    METHODS list
+      IMPORTING iv_path              TYPE string
+                iv_by_folders        TYPE abap_bool OPTIONAL
+                iv_changes_only      TYPE abap_bool OPTIONAL
+                iv_transports        TYPE abap_bool OPTIONAL
+      RETURNING VALUE(rt_repo_items) TYPE zif_abapgit_definitions=>ty_repo_item_tt
+      RAISING   zcx_abapgit_exception.
+ 
+    METHODS get_log
+      RETURNING VALUE(ri_log) TYPE REF TO zif_abapgit_log.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS: BEGIN OF c_sortkey,
+                 default    TYPE i VALUE 9999,
+                 parent_dir TYPE i VALUE 0,
+                 dir        TYPE i VALUE 1,
+                 orphan     TYPE i VALUE 2,
+                 changed    TYPE i VALUE 3,
+                 inactive   TYPE i VALUE 4,
+               END OF c_sortkey.
+ 
+    DATA: mo_repo TYPE REF TO zcl_abapgit_repo,
+          mi_log  TYPE REF TO zif_abapgit_log.
+ 
+    METHODS build_repo_items_local_only
+      RETURNING VALUE(rt_repo_items) TYPE zif_abapgit_definitions=>ty_repo_item_tt
+      RAISING   zcx_abapgit_exception.
+ 
+    METHODS build_repo_items_with_remote
+      RETURNING VALUE(rt_repo_items) TYPE zif_abapgit_definitions=>ty_repo_item_tt
+      RAISING   zcx_abapgit_exception.
+ 
+    METHODS build_folders
+      IMPORTING iv_cur_dir    TYPE string
+      CHANGING  ct_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt
+      RAISING   zcx_abapgit_exception.
+ 
+    METHODS determine_transports
+      CHANGING ct_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt.
+ 
+    METHODS filter_changes
+      CHANGING ct_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt.
+ 
+    METHODS check_repo_size
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_content_list IMPLEMENTATION.
+ 
+ 
+  METHOD build_folders.
+ 
+    DATA: lv_index    TYPE i,
+          lt_subitems LIKE ct_repo_items,
+          ls_subitem  LIKE LINE OF ct_repo_items,
+          ls_folder   LIKE LINE OF ct_repo_items.
+ 
+    DATA lo_state TYPE REF TO zcl_abapgit_item_state.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF ct_repo_items.
+ 
+ 
+    LOOP AT ct_repo_items ASSIGNING <ls_item>.
+      lv_index = sy-tabix.
+      CHECK <ls_item>-path <> iv_cur_dir. " files in target dir - just leave them be
+ 
+      IF zcl_abapgit_path=>is_subdir( iv_path = <ls_item>-path
+                                      iv_parent = iv_cur_dir ) = abap_true.
+        ls_subitem-changes = <ls_item>-changes.
+        ls_subitem-path    = <ls_item>-path.
+        ls_subitem-lstate  = <ls_item>-lstate.
+        ls_subitem-rstate  = <ls_item>-rstate.
+        APPEND ls_subitem TO lt_subitems.
+      ENDIF.
+ 
+      DELETE ct_repo_items INDEX lv_index.
+    ENDLOOP.
+ 
+    SORT lt_subitems BY path ASCENDING.
+ 
+    LOOP AT lt_subitems ASSIGNING <ls_item>.
+      AT NEW path.
+        CLEAR ls_folder.
+        ls_folder-path    = <ls_item>-path.
+        ls_folder-sortkey = c_sortkey-dir. " Directory
+        ls_folder-is_dir  = abap_true.
+        CREATE OBJECT lo_state.
+      ENDAT.
+ 
+      ls_folder-changes = ls_folder-changes + <ls_item>-changes.
+      lo_state->sum_with_repo_item( <ls_item> ).
+ 
+      AT END OF path.
+        ls_folder-lstate = lo_state->local( ).
+        ls_folder-rstate = lo_state->remote( ).
+        APPEND ls_folder TO ct_repo_items.
+      ENDAT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_repo_items_local_only.
+ 
+    DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          ls_item  TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS: <ls_repo_item> LIKE LINE OF rt_repo_items,
+                   <ls_tadir>     LIKE LINE OF lt_tadir.
+ 
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+      iv_package            = mo_repo->get_package( )
+      iv_ignore_subpackages = mo_repo->get_local_settings( )-ignore_subpackages
+      iv_only_local_objects = mo_repo->get_local_settings( )-only_local_objects
+      io_dot                = mo_repo->get_dot_abapgit( ) ).
+ 
+    LOOP AT lt_tadir ASSIGNING <ls_tadir>.
+      APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>.
+      <ls_repo_item>-obj_type  = <ls_tadir>-object.
+      <ls_repo_item>-obj_name  = <ls_tadir>-obj_name.
+      <ls_repo_item>-path      = <ls_tadir>-path.
+      <ls_repo_item>-srcsystem = <ls_tadir>-srcsystem.
+      MOVE-CORRESPONDING <ls_repo_item> TO ls_item.
+      <ls_repo_item>-inactive = boolc( zcl_abapgit_objects=>is_active( ls_item ) = abap_false ).
+      IF <ls_repo_item>-inactive = abap_true.
+        <ls_repo_item>-sortkey = c_sortkey-inactive.
+      ELSE.
+        <ls_repo_item>-sortkey = c_sortkey-default.      " Default sort key
+      ENDIF.
+ 
+      IF <ls_repo_item>-obj_type IS NOT INITIAL.
+        MOVE-CORRESPONDING <ls_repo_item> TO ls_item.
+        IF zcl_abapgit_objects=>exists( ls_item ) = abap_true.
+          <ls_repo_item>-changed_by = zcl_abapgit_objects=>changed_by( ls_item ).
+        ENDIF.
+        CLEAR ls_item.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_repo_items_with_remote.
+ 
+    DATA:
+      lo_state      TYPE REF TO zcl_abapgit_item_state,
+      ls_file       TYPE zif_abapgit_definitions=>ty_repo_file,
+      lt_status     TYPE zif_abapgit_definitions=>ty_results_tt,
+      ls_item       TYPE zif_abapgit_definitions=>ty_item,
+      ls_previous   LIKE ls_item,
+      lv_changed_by TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_status>    LIKE LINE OF lt_status,
+                   <ls_repo_item> LIKE LINE OF rt_repo_items.
+ 
+ 
+    lt_status = mo_repo->status( mi_log ).
+ 
+    LOOP AT lt_status ASSIGNING <ls_status>.
+      AT NEW obj_name. "obj_type + obj_name
+        APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>.
+        <ls_repo_item>-obj_type  = <ls_status>-obj_type.
+        <ls_repo_item>-obj_name  = <ls_status>-obj_name.
+        <ls_repo_item>-inactive  = <ls_status>-inactive.
+        <ls_repo_item>-sortkey   = c_sortkey-default. " Default sort key
+        <ls_repo_item>-changes   = 0.
+        <ls_repo_item>-path      = <ls_status>-path.
+        <ls_repo_item>-srcsystem = <ls_status>-srcsystem.
+        CREATE OBJECT lo_state.
+      ENDAT.
+ 
+      IF <ls_status>-filename IS NOT INITIAL.
+        MOVE-CORRESPONDING <ls_status> TO ls_file.
+        ls_file-is_changed = boolc( <ls_status>-match = abap_false ). " TODO refactor
+        APPEND ls_file TO <ls_repo_item>-files.
+ 
+        IF <ls_status>-inactive = abap_true AND <ls_repo_item>-sortkey > c_sortkey-changed.
+          <ls_repo_item>-sortkey = c_sortkey-inactive.
+        ENDIF.
+ 
+        IF ls_file-is_changed = abap_true.
+          <ls_repo_item>-sortkey = c_sortkey-changed. " Changed files
+          <ls_repo_item>-changes = <ls_repo_item>-changes + 1.
+          lo_state->sum_with_status_item( <ls_status> ).
+        ENDIF.
+      ENDIF.
+ 
+      IF <ls_repo_item>-changes > 0 AND <ls_repo_item>-obj_type IS NOT INITIAL.
+        MOVE-CORRESPONDING <ls_repo_item> TO ls_item.
+        IF ls_previous = ls_item.
+          <ls_repo_item>-changed_by = lv_changed_by.
+        ELSEIF zcl_abapgit_objects=>exists( ls_item ) = abap_true.
+          <ls_repo_item>-changed_by = zcl_abapgit_objects=>changed_by( ls_item ).
+          ls_previous = ls_item.
+          lv_changed_by = <ls_repo_item>-changed_by.
+        ENDIF.
+        CLEAR ls_item.
+      ENDIF.
+ 
+      AT END OF obj_name. "obj_type + obj_name
+        IF <ls_repo_item>-obj_type IS INITIAL.
+          <ls_repo_item>-sortkey = c_sortkey-orphan. "Virtual objects
+        ENDIF.
+        <ls_repo_item>-lstate = lo_state->local( ).
+        <ls_repo_item>-rstate = lo_state->remote( ).
+        <ls_repo_item>-packmove = lo_state->is_reassigned( ).
+      ENDAT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_repo_size.
+ 
+    CONSTANTS lc_new_repo_size TYPE i VALUE 10.
+ 
+    DATA lt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt.
+ 
+    lt_remote = mo_repo->get_files_remote( ).
+ 
+    IF lines( lt_remote ) > lc_new_repo_size.
+      " Less files means it''s a new repo (with just readme and license, for example) which is ok
+      READ TABLE lt_remote TRANSPORTING NO FIELDS
+        WITH KEY file_path
+        COMPONENTS path     = zif_abapgit_definitions=>c_root_dir
+                   filename = zif_abapgit_definitions=>c_dot_abapgit.
+      IF sy-subrc <> 0.
+        mi_log->add_warning( |Cannot find .abapgit.xml - Is this an abapGit repository?| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mo_repo = io_repo.
+    CREATE OBJECT mi_log TYPE zcl_abapgit_log.
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_transports.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF ct_repo_items.
+ 
+    LOOP AT ct_repo_items ASSIGNING <ls_item>.
+      ls_item-obj_type = <ls_item>-obj_type.
+      ls_item-obj_name = <ls_item>-obj_name.
+      TRY.
+          <ls_item>-transport = zcl_abapgit_factory=>get_cts_api( )->get_transport_for_object( ls_item ).
+        CATCH zcx_abapgit_exception ##NO_HANDLER.
+          " Ignore errors related to object check when trying to get transport
+      ENDTRY.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_changes.
+ 
+    FIELD-SYMBOLS: <ls_item> TYPE zif_abapgit_definitions=>ty_repo_item.
+ 
+    DELETE ct_repo_items WHERE changes = 0 AND inactive = abap_false.
+    LOOP AT ct_repo_items ASSIGNING <ls_item> WHERE inactive = abap_false.
+      DELETE <ls_item>-files WHERE is_changed = abap_false.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_log.
+    DATA li_repo_log TYPE REF TO zif_abapgit_log.
+    DATA lt_repo_msg TYPE zif_abapgit_log=>ty_log_outs.
+    DATA lr_repo_msg TYPE REF TO zif_abapgit_log=>ty_log_out.
+ 
+    ri_log = mi_log.
+ 
+    "add warning and error messages from repo log
+    li_repo_log = mo_repo->get_log( ).
+    IF li_repo_log IS BOUND.
+      lt_repo_msg = li_repo_log->get_messages( ).
+      LOOP AT lt_repo_msg REFERENCE INTO lr_repo_msg WHERE type CA ''EW''.
+        CASE lr_repo_msg->type.
+          WHEN ''E''.
+            ri_log->add_error( lr_repo_msg->text ).
+          WHEN ''W''.
+            ri_log->add_warning( lr_repo_msg->text ).
+          WHEN OTHERS.
+            CONTINUE.
+        ENDCASE.
+      ENDLOOP.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD list.
+ 
+    mi_log->clear( ).
+ 
+    IF mo_repo->has_remote_source( ) = abap_true.
+      rt_repo_items = build_repo_items_with_remote( ).
+      check_repo_size( ).
+    ELSE.
+      rt_repo_items = build_repo_items_local_only( ).
+    ENDIF.
+ 
+    IF iv_by_folders = abap_true.
+      build_folders(
+        EXPORTING iv_cur_dir    = iv_path
+        CHANGING  ct_repo_items = rt_repo_items ).
+    ENDIF.
+ 
+    IF iv_changes_only = abap_true.
+      " There are never changes for offline repositories
+      filter_changes( CHANGING ct_repo_items = rt_repo_items ).
+    ENDIF.
+ 
+    IF iv_transports = abap_true.
+      determine_transports( CHANGING ct_repo_items = rt_repo_items ).
+    ENDIF.
+ 
+    SORT rt_repo_items BY
+      sortkey ASCENDING
+      path ASCENDING
+      obj_name ASCENDING.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO_CS_MIGRATION           ', 'CLASS zcl_abapgit_repo_cs_migration DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS run
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      ty_repo_ids TYPE SORTED TABLE OF zif_abapgit_persistence=>ty_repo-key WITH UNIQUE KEY table_line.
+ 
+    CLASS-METHODS get_unconverted_repo_ids
+      RETURNING
+        VALUE(rt_repo_ids) TYPE ty_repo_ids.
+    CLASS-METHODS clear_repo_metadata
+      IMPORTING
+        iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found.
+    CLASS-METHODS convert_checksums
+      IMPORTING
+        iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REPO_CS_MIGRATION IMPLEMENTATION.
+ 
+ 
+  METHOD clear_repo_metadata.
+ 
+    DATA lo_repo_persistence TYPE REF TO zcl_abapgit_persistence_repo.
+ 
+    lo_repo_persistence ?= zcl_abapgit_persist_factory=>get_repo( ).
+    lo_repo_persistence->rewrite_repo_meta( iv_repo_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD convert_checksums.
+ 
+    DATA lo_cs TYPE REF TO zcl_abapgit_repo_checksums.
+    DATA lv_xml TYPE zif_abapgit_persistence=>ty_content-data_str.
+    DATA:
+      BEGIN OF ls_repo_extract,
+        local_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt,
+      END OF ls_repo_extract.
+ 
+    lv_xml = zcl_abapgit_persistence_db=>get_instance( )->read(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+      iv_value = iv_repo_key ).
+ 
+    REPLACE ALL OCCURRENCES OF ''<_--28C_TYPE_REPO_--29>'' IN lv_xml WITH ''<REPO>''.
+    REPLACE ALL OCCURRENCES OF ''</_--28C_TYPE_REPO_--29>'' IN lv_xml WITH ''</REPO>''.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = ''accept_data_loss''
+      SOURCE XML lv_xml
+      RESULT repo = ls_repo_extract.
+ 
+    IF lines( ls_repo_extract-local_checksums ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT lo_cs EXPORTING iv_repo_key = iv_repo_key.
+    lo_cs->force_write( ls_repo_extract-local_checksums ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_unconverted_repo_ids.
+ 
+    DATA lt_cs_ids TYPE ty_repo_ids.
+    DATA lv_repo_id LIKE LINE OF rt_repo_ids.
+    DATA lv_index TYPE i.
+ 
+    SELECT value FROM (zcl_abapgit_persistence_db=>c_tabname)
+      INTO TABLE rt_repo_ids
+      WHERE type = zcl_abapgit_persistence_db=>c_type_repo.
+    SELECT value FROM (zcl_abapgit_persistence_db=>c_tabname)
+      INTO TABLE lt_cs_ids
+      WHERE type = zcl_abapgit_persistence_db=>c_type_repo_csum.
+ 
+    LOOP AT rt_repo_ids INTO lv_repo_id.
+      lv_index = sy-tabix.
+      READ TABLE lt_cs_ids TRANSPORTING NO FIELDS WITH KEY table_line = lv_repo_id.
+      IF sy-subrc = 0. " Already converted
+        DELETE rt_repo_ids INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    DATA lt_repo_ids TYPE ty_repo_ids.
+    DATA lv_repo_id LIKE LINE OF lt_repo_ids.
+ 
+    lt_repo_ids = get_unconverted_repo_ids( ).
+ 
+    LOOP AT lt_repo_ids INTO lv_repo_id.
+      convert_checksums( lv_repo_id ).
+      clear_repo_metadata( lv_repo_id ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO_FILTER                 ', 'CLASS zcl_abapgit_repo_filter DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    METHODS apply
+      IMPORTING
+        it_filter TYPE zif_abapgit_definitions=>ty_tadir_tt
+      CHANGING
+        ct_tadir  TYPE zif_abapgit_definitions=>ty_tadir_tt .
+ 
+    METHODS apply_object_filter
+      IMPORTING
+        it_filter   TYPE zif_abapgit_definitions=>ty_tadir_tt
+        io_dot      TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL
+        iv_devclass TYPE devclass OPTIONAL
+      CHANGING
+        ct_files    TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+ 
+    METHODS filter_generated_tadir
+      CHANGING
+        !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt .
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_filter IMPLEMENTATION.
+ 
+ 
+  METHOD apply.
+ 
+    DATA: lt_filter TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_tadir
+                      WITH NON-UNIQUE KEY object obj_name,
+          lv_index  TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir.
+ 
+    filter_generated_tadir( CHANGING ct_tadir = ct_tadir ).
+ 
+    IF lines( it_filter ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    lt_filter = it_filter.
+ 
+* this is another loop at TADIR, but typically the filter is blank
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+      lv_index = sy-tabix.
+      READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY object = <ls_tadir>-object
+                                                           obj_name = <ls_tadir>-obj_name
+                                                  BINARY SEARCH.
+      IF sy-subrc <> 0.
+        DELETE ct_tadir INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_object_filter.
+    DATA lr_file TYPE REF TO zif_abapgit_git_definitions=>ty_file.
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA ls_tadir TYPE zif_abapgit_definitions=>ty_tadir.
+    DATA lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    DATA lt_filter TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_tadir
+                      WITH NON-UNIQUE KEY object obj_name.
+ 
+    lt_filter = it_filter.
+ 
+    LOOP AT ct_files REFERENCE INTO lr_file.
+      IF lr_file->filename = zif_abapgit_definitions=>c_dot_abapgit.
+        CONTINUE.
+      ENDIF.
+ 
+      zcl_abapgit_filename_logic=>file_to_object(
+        EXPORTING
+          iv_filename = lr_file->filename
+          iv_path     = lr_file->path
+          iv_devclass = iv_devclass
+          io_dot      = io_dot
+        IMPORTING
+          es_item     = ls_item ).
+ 
+      CLEAR lt_tadir.
+      CLEAR ls_tadir.
+ 
+      ls_tadir-object = ls_item-obj_type.
+      ls_tadir-obj_name = ls_item-obj_name.
+      ls_tadir-devclass = ls_item-devclass.
+ 
+      INSERT ls_tadir INTO TABLE lt_tadir.
+ 
+      filter_generated_tadir( CHANGING ct_tadir = lt_tadir ).
+ 
+      IF lt_tadir IS INITIAL.
+        DELETE ct_files.
+        CONTINUE.
+      ENDIF.
+ 
+      READ TABLE lt_filter TRANSPORTING NO FIELDS
+      WITH KEY object = ls_tadir-object
+               obj_name = ls_tadir-obj_name
+      BINARY SEARCH.
+ 
+      IF sy-subrc <> 0.
+        DELETE ct_files.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_generated_tadir.
+ 
+    DATA: ls_tadir     TYPE zif_abapgit_definitions=>ty_tadir,
+          ls_tadir_gen TYPE zif_abapgit_definitions=>ty_tadir,
+          lv_cd_object TYPE cdobjectcl,
+          lt_cd_names  TYPE STANDARD TABLE OF cdnames,
+          ls_cd_names  TYPE cdnames,
+          lt_tcdrs     TYPE STANDARD TABLE OF tcdrs,
+          ls_tcdrs     TYPE tcdrs.
+ 
+    LOOP AT ct_tadir INTO ls_tadir WHERE pgmid = ''R3TR'' AND object = ''CHDO''.
+      CLEAR: lv_cd_object, lt_cd_names, ls_tadir_gen, lt_tcdrs, ls_tcdrs.
+ 
+      lv_cd_object = ls_tadir-obj_name.
+ 
+      CALL FUNCTION ''CDNAMES_GET''
+        EXPORTING
+          iv_object        = lv_cd_object
+        TABLES
+          it_names         = lt_cd_names
+          it_tcdrs         = lt_tcdrs
+        EXCEPTIONS
+          object_space     = 1
+          object_not_found = 2
+          OTHERS           = 3.
+      IF sy-subrc <> 0.
+        CONTINUE.
+      ENDIF.
+ 
+      LOOP AT lt_cd_names INTO ls_cd_names.
+        DELETE ct_tadir WHERE pgmid = ''R3TR''
+                          AND ( ( object = ''PROG''
+                              AND ( obj_name = ls_cd_names-repnamec
+                                 OR obj_name = ls_cd_names-repnamet
+                                 OR obj_name = ls_cd_names-repnamefix
+                                 OR obj_name = ls_cd_names-repnamevar ) )
+                               OR object = ''FUGR'' AND obj_name = ls_cd_names-fgrp ).
+      ENDLOOP.
+ 
+      LOOP AT lt_tcdrs INTO ls_tcdrs.
+        DELETE ct_tadir WHERE pgmid = ''R3TR'' AND object = ''TABL'' AND obj_name = ls_tcdrs-tabname.
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO_OFFLINE                ', 'CLASS zcl_abapgit_repo_offline DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_repo
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS set_name
+      IMPORTING
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS zif_abapgit_repo~get_name
+        REDEFINITION .
+    METHODS has_remote_source
+        REDEFINITION .
+  PROTECTED SECTION.
+ 
+    METHODS reset_remote
+        REDEFINITION .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_offline IMPLEMENTATION.
+ 
+ 
+  METHOD has_remote_source.
+    rv_yes = boolc( lines( mt_remote ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD reset_remote.
+ 
+    DATA lt_backup LIKE mt_remote.
+ 
+    " online repo has online source to renew data from, offline does not
+    " so offline repo preserves the remote
+    " in case of partial pull failure the user will immediately see the new difference
+    " UI will detect "pullable" content based on mt_status
+    " in the uniform way both for online and offline repos
+    " for more details see discussion in 2096 and 1953
+ 
+    lt_backup = mt_remote.
+    super->reset_remote( ).
+    set_files_remote( lt_backup ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_name.
+    set( iv_url = iv_url ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_name.
+    rv_name = super->get_name( ).
+ 
+    IF rv_name IS INITIAL.
+      rv_name = ms_data-url.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO_ONLINE                 ', 'CLASS zcl_abapgit_repo_online DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_repo
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_repo_online .
+ 
+    ALIASES create_branch
+      FOR zif_abapgit_repo_online~create_branch .
+    ALIASES get_current_remote
+      FOR zif_abapgit_repo_online~get_current_remote .
+    ALIASES get_selected_branch
+      FOR zif_abapgit_repo_online~get_selected_branch .
+    ALIASES get_selected_commit
+      FOR zif_abapgit_repo_online~get_selected_commit .
+    ALIASES get_url
+      FOR zif_abapgit_repo_online~get_url .
+    ALIASES push
+      FOR zif_abapgit_repo_online~push .
+    ALIASES select_branch
+      FOR zif_abapgit_repo_online~select_branch .
+    ALIASES select_commit
+      FOR zif_abapgit_repo_online~select_commit .
+    ALIASES set_url
+      FOR zif_abapgit_repo_online~set_url .
+    ALIASES switch_origin
+      FOR zif_abapgit_repo_online~switch_origin .
+    ALIASES get_switched_origin
+      FOR zif_abapgit_repo_online~get_switched_origin.
+ 
+ 
+ 
+    METHODS zif_abapgit_repo~get_files_remote
+        REDEFINITION .
+    METHODS zif_abapgit_repo~get_name
+        REDEFINITION .
+    METHODS has_remote_source
+        REDEFINITION .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt .
+    DATA mv_current_commit TYPE zif_abapgit_git_definitions=>ty_sha1 .
+ 
+    METHODS handle_stage_ignore
+      IMPORTING
+        !io_stage TYPE REF TO zcl_abapgit_stage
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_objects
+      IMPORTING
+        !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS fetch_remote
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_objects
+      RETURNING
+        VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS raise_error_if_branch_exists
+      IMPORTING
+        iv_name TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_online IMPLEMENTATION.
+ 
+ 
+  METHOD fetch_remote.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          ls_pull     TYPE zcl_abapgit_git_porcelain=>ty_pull_result.
+ 
+    IF mv_request_remote_refresh = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( 1 ).
+ 
+    li_progress->show( iv_current = 1
+                       iv_text    = ''Fetch remote files'' ).
+ 
+    IF get_selected_commit( ) IS INITIAL.
+      ls_pull = zcl_abapgit_git_porcelain=>pull_by_branch( iv_url         = get_url( )
+                                                           iv_branch_name = get_selected_branch( ) ).
+    ELSE.
+      ls_pull = zcl_abapgit_git_porcelain=>pull_by_commit( iv_url         = get_url( )
+                                                           iv_commit_hash = get_selected_commit( ) ).
+    ENDIF.
+ 
+    set_files_remote( ls_pull-files ).
+    set_objects( ls_pull-objects ).
+    mv_current_commit = ls_pull-commit.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_objects.
+    fetch_remote( ).
+    rt_objects = mt_objects.
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_stage_ignore.
+ 
+    DATA: lv_add         TYPE abap_bool,
+          lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit,
+          lt_stage       TYPE zif_abapgit_definitions=>ty_stage_tt.
+ 
+    FIELD-SYMBOLS: <ls_stage> LIKE LINE OF lt_stage.
+ 
+ 
+    lo_dot_abapgit = get_dot_abapgit( ).
+    lt_stage = io_stage->get_all( ).
+    LOOP AT lt_stage ASSIGNING <ls_stage> WHERE method = zif_abapgit_definitions=>c_method-ignore.
+ 
+      lo_dot_abapgit->add_ignore(
+        iv_path     = <ls_stage>-file-path
+        iv_filename = <ls_stage>-file-filename ).
+ 
+      " remove it from the staging object, as the action is handled here
+      io_stage->reset( iv_path     = <ls_stage>-file-path
+                       iv_filename = <ls_stage>-file-filename ).
+ 
+      lv_add = abap_true.
+ 
+    ENDLOOP.
+ 
+    IF lv_add = abap_true.
+      io_stage->add(
+        iv_path     = zif_abapgit_definitions=>c_root_dir
+        iv_filename = zif_abapgit_definitions=>c_dot_abapgit
+        iv_data     = lo_dot_abapgit->serialize( ) ).
+ 
+      set_dot_abapgit( lo_dot_abapgit ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD has_remote_source.
+    rv_yes = abap_true.
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_error_if_branch_exists.
+ 
+    DATA:
+      lt_branches     TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+      lv_display_name TYPE string.
+ 
+    lt_branches = zcl_abapgit_git_transport=>branches( get_url( ) )->get_branches_only( ).
+ 
+    READ TABLE lt_branches WITH TABLE KEY name_key
+                           COMPONENTS name = iv_name
+                           TRANSPORTING NO FIELDS.
+    IF sy-subrc = 0.
+      lv_display_name = zcl_abapgit_git_branch_list=>get_display_name( iv_name ).
+      zcx_abapgit_exception=>raise( |Branch ''{ lv_display_name }'' already exists| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_objects.
+    mt_objects = it_objects.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~check_for_valid_branch.
+ 
+    DATA:
+      lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list,
+      lv_branch      TYPE string,
+      lv_head        TYPE string,
+      lv_msg         TYPE string.
+ 
+    lv_branch = get_selected_branch( ).
+ 
+    IF lv_branch IS NOT INITIAL.
+      lo_branch_list = zcl_abapgit_git_transport=>branches( get_url( ) ).
+ 
+      TRY.
+          lo_branch_list->find_by_name( lv_branch ).
+        CATCH zcx_abapgit_exception.
+          " branch does not exist, fallback to head
+          lv_head = lo_branch_list->get_head_symref( ).
+          IF lo_branch_list->get_type( lv_branch ) = zif_abapgit_git_definitions=>c_git_branch_type-branch.
+            lv_msg = ''Branch''.
+          ELSE.
+            lv_msg = ''Tag''.
+          ENDIF.
+          lv_msg = |{ lv_msg } { lo_branch_list->get_display_name( lv_branch ) } does not exist.|
+                && | Switched to { lo_branch_list->get_display_name( lv_head ) }|.
+          MESSAGE lv_msg TYPE ''S''.
+          select_branch( lv_head ).
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~create_branch.
+ 
+    DATA: lv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1.
+ 
+    ASSERT iv_name CP zif_abapgit_git_definitions=>c_git_branch-heads.
+ 
+    IF iv_from IS INITIAL.
+      lv_sha1 = get_current_remote( ).
+    ELSE.
+      lv_sha1 = iv_from.
+    ENDIF.
+ 
+    raise_error_if_branch_exists( iv_name ).
+ 
+    zcl_abapgit_git_porcelain=>create_branch(
+      iv_url  = get_url( )
+      iv_name = iv_name
+      iv_from = lv_sha1 ).
+ 
+    " automatically switch to new branch
+    select_branch( iv_name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_current_remote.
+    fetch_remote( ).
+    rv_sha1 = mv_current_commit.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_selected_branch.
+    rv_name = ms_data-branch_name.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_selected_commit.
+    rv_selected_commit = ms_data-selected_commit.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_switched_origin.
+    rv_switched_origin = ms_data-switched_origin.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_url.
+    rv_url = ms_data-url.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~push.
+ 
+* assumption: PUSH is done on top of the currently selected branch
+ 
+    DATA: ls_push   TYPE zcl_abapgit_git_porcelain=>ty_push_result,
+          lv_text   TYPE string,
+          lv_parent TYPE zif_abapgit_git_definitions=>ty_sha1.
+ 
+ 
+    IF ms_data-branch_name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+      lv_text = |You''re working on a tag. Currently it''s not |
+             && |possible to push on tags. Consider creating a branch instead|.
+      zcx_abapgit_exception=>raise( lv_text ).
+    ENDIF.
+ 
+    IF ms_data-selected_commit IS NOT INITIAL.
+      lv_text = ''You are currently checked out in a commit.''.
+      lv_text = |{ lv_text } You must be on a branch to push|.
+      zcx_abapgit_exception=>raise( lv_text ).
+    ENDIF.
+ 
+    IF ms_data-local_settings-block_commit = abap_true
+        AND zcl_abapgit_factory=>get_code_inspector( get_package( )
+          )->is_successful( ) = abap_false.
+      zcx_abapgit_exception=>raise( |A successful code inspection is required| ).
+    ENDIF.
+ 
+    handle_stage_ignore( io_stage ).
+ 
+    IF get_selected_commit( ) IS INITIAL.
+      lv_parent = get_current_remote( ).
+    ELSE.
+      lv_parent = get_selected_commit( ).
+    ENDIF.
+ 
+    ls_push = zcl_abapgit_git_porcelain=>push(
+      is_comment     = is_comment
+      io_stage       = io_stage
+      iv_branch_name = get_selected_branch( )
+      iv_url         = get_url( )
+      iv_parent      = lv_parent
+      it_old_objects = get_objects( ) ).
+ 
+    set_objects( ls_push-new_objects ).
+    set_files_remote( ls_push-new_files ).
+ 
+    mv_current_commit = ls_push-branch.
+ 
+    zif_abapgit_repo~checksums( )->update( ls_push-updated_files ).
+ 
+    reset_status( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~select_branch.
+ 
+    reset_remote( ).
+    set( iv_branch_name     = iv_branch_name
+         iv_selected_commit = space ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~select_commit.
+ 
+    reset_remote( ).
+    set( iv_selected_commit = iv_selected_commit ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~set_url.
+ 
+    reset_remote( ).
+    set( iv_url = iv_url ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~switch_origin.
+ 
+    DATA lv_offs TYPE i.
+ 
+    " For repo settings page
+    IF iv_overwrite = abap_true.
+      set( iv_switched_origin = iv_url ).
+      RETURN.
+    ENDIF.
+ 
+    IF iv_url IS INITIAL.
+      IF ms_data-switched_origin IS INITIAL.
+        RETURN.
+      ELSE.
+        lv_offs = find(
+          val = reverse( ms_data-switched_origin )
+          sub = ''@'' ).
+        IF lv_offs = -1.
+          zcx_abapgit_exception=>raise( ''Incorrect format of switched origin'' ).
+        ENDIF.
+        lv_offs = strlen( ms_data-switched_origin ) - lv_offs - 1.
+        set_url( substring(
+          val = ms_data-switched_origin
+          len = lv_offs ) ).
+        select_branch( substring(
+          val = ms_data-switched_origin
+          off = lv_offs + 1 ) ).
+        set( iv_switched_origin = '''' ).
+      ENDIF.
+    ELSEIF ms_data-switched_origin IS INITIAL.
+      set( iv_switched_origin = ms_data-url && ''@'' && ms_data-branch_name ).
+      set_url( iv_url ).
+      select_branch( iv_branch ).
+    ELSE.
+      zcx_abapgit_exception=>raise( ''Cannot switch origin twice'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_files_remote.
+    fetch_remote( ).
+    rt_files = super->get_files_remote(
+      ii_obj_filter   = ii_obj_filter
+      iv_ignore_files = iv_ignore_files ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_name.
+    rv_name = super->get_name( ).
+    IF rv_name IS INITIAL.
+      TRY.
+          rv_name = zcl_abapgit_url=>name( ms_data-url ).
+          rv_name = cl_http_utility=>unescape_url( rv_name ).
+        CATCH zcx_abapgit_exception.
+          rv_name = ''New online repo''. "unlikely fallback
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO_SRV                    ', 'CLASS zcl_abapgit_repo_srv DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_repo_srv .
+    INTERFACES zif_abapgit_repo_listener .
+ 
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ri_srv) TYPE REF TO zif_abapgit_repo_srv .
+    CLASS-METHODS inject_instance
+      IMPORTING
+        ii_srv TYPE REF TO zif_abapgit_repo_srv.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_ref TYPE REF TO zif_abapgit_repo_srv .
+    DATA mv_init TYPE abap_bool.
+    DATA mv_only_favorites TYPE abap_bool.
+    DATA mt_list TYPE zif_abapgit_repo_srv=>ty_repo_list .
+ 
+    METHODS determine_branch_name
+      IMPORTING
+        !iv_name       TYPE string
+        !iv_url        TYPE string
+      RETURNING
+        VALUE(rv_name) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_all
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_favorites
+      RAISING
+        zcx_abapgit_exception .
+    METHODS instantiate_and_add
+      IMPORTING
+        !is_repo_meta  TYPE zif_abapgit_persistence=>ty_repo
+      RETURNING
+        VALUE(ri_repo) TYPE REF TO zif_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add
+      IMPORTING
+        !ii_repo TYPE REF TO zif_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+    METHODS reinstantiate_repo
+      IMPORTING
+        !iv_key  TYPE zif_abapgit_persistence=>ty_repo-key
+        !is_meta TYPE zif_abapgit_persistence=>ty_repo_xml
+      RAISING
+        zcx_abapgit_exception .
+    METHODS validate_sub_super_packages
+      IMPORTING
+        !iv_package    TYPE devclass
+        !it_repos      TYPE zif_abapgit_persistence=>ty_repos
+        !iv_ign_subpkg TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        VALUE(ei_repo) TYPE REF TO zif_abapgit_repo
+        !ev_reason     TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_srv IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+ 
+    DATA li_repo LIKE LINE OF mt_list.
+    DATA lo_repo TYPE REF TO zcl_abapgit_repo.
+ 
+    LOOP AT mt_list INTO li_repo.
+      IF li_repo->ms_data-key = ii_repo->ms_data-key.
+        IF li_repo = ii_repo.
+          RETURN.
+        ENDIF.
+        zcx_abapgit_exception=>raise( ''identical keys'' ).
+      ENDIF.
+    ENDLOOP.
+ 
+    lo_repo ?= ii_repo. " TODO, refactor later
+    lo_repo->bind_listener( me ).
+    APPEND ii_repo TO mt_list.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_branch_name.
+ 
+    DATA lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list.
+ 
+    rv_name = iv_name.
+    IF rv_name IS INITIAL.
+      ASSERT NOT iv_url IS INITIAL.
+      lo_branch_list = zcl_abapgit_git_transport=>branches( iv_url ).
+      rv_name = lo_branch_list->get_head_symref( ).
+    ELSEIF -1 = find(
+        val = rv_name
+        sub = zif_abapgit_git_definitions=>c_git_branch-heads_prefix ).
+      " Assume short branch name was received
+      rv_name = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && rv_name.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+    IF gi_ref IS INITIAL.
+      CREATE OBJECT gi_ref TYPE zcl_abapgit_repo_srv.
+    ENDIF.
+    ri_srv = gi_ref.
+  ENDMETHOD.
+ 
+ 
+  METHOD inject_instance.
+    gi_ref = ii_srv.
+  ENDMETHOD.
+ 
+ 
+  METHOD instantiate_and_add.
+ 
+    IF is_repo_meta-offline = abap_false.
+      CREATE OBJECT ri_repo TYPE zcl_abapgit_repo_online
+        EXPORTING
+          is_data = is_repo_meta.
+    ELSE.
+      CREATE OBJECT ri_repo TYPE zcl_abapgit_repo_offline
+        EXPORTING
+          is_data = is_repo_meta.
+    ENDIF.
+    add( ri_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_all.
+ 
+    DATA: lt_list TYPE zif_abapgit_persistence=>ty_repos.
+ 
+    FIELD-SYMBOLS: <ls_list> LIKE LINE OF lt_list.
+ 
+    CLEAR mt_list.
+ 
+    lt_list = zcl_abapgit_persist_factory=>get_repo( )->list( ).
+    LOOP AT lt_list ASSIGNING <ls_list>.
+      instantiate_and_add( <ls_list> ).
+    ENDLOOP.
+ 
+    mv_init = abap_true.
+    mv_only_favorites = abap_false.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_favorites.
+ 
+    DATA: lt_list           TYPE zif_abapgit_persistence=>ty_repos,
+          lt_user_favorites TYPE zif_abapgit_persist_user=>ty_favorites.
+ 
+    DATA li_repo TYPE REF TO zif_abapgit_repo.
+    DATA lv_repo_index TYPE i.
+    DATA lo_repo_db TYPE REF TO zif_abapgit_persist_repo.
+ 
+    FIELD-SYMBOLS: <ls_repo_record> LIKE LINE OF lt_list.
+ 
+    lo_repo_db        = zcl_abapgit_persist_factory=>get_repo( ).
+    lt_user_favorites = zcl_abapgit_persistence_user=>get_instance( )->get_favorites( ).
+    lt_list           = lo_repo_db->list_by_keys( lt_user_favorites ).
+ 
+    SORT lt_list BY package.
+ 
+    LOOP AT mt_list INTO li_repo.
+      lv_repo_index = sy-tabix.
+ 
+      READ TABLE lt_list TRANSPORTING NO FIELDS WITH KEY package = li_repo->get_package( ).
+      IF sy-subrc = 0.
+        DELETE lt_list INDEX sy-tabix.
+        CONTINUE. " Leave the repo be
+      ELSEIF lo_repo_db->exists( li_repo->get_key( ) ) = abap_false.
+        " Not a fav, and also does not exist, probably uninstalled
+        DELETE mt_list INDEX lv_repo_index.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    " Create remaining (new) favs
+    LOOP AT lt_list ASSIGNING <ls_repo_record>.
+      instantiate_and_add( <ls_repo_record> ).
+    ENDLOOP.
+ 
+    mv_init = abap_true.
+    mv_only_favorites = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reinstantiate_repo.
+ 
+    DATA li_repo      TYPE REF TO zif_abapgit_repo.
+    DATA ls_full_meta TYPE zif_abapgit_persistence=>ty_repo.
+ 
+    li_repo = zif_abapgit_repo_srv~get( iv_key ).
+    DELETE TABLE mt_list FROM li_repo.
+    ASSERT sy-subrc IS INITIAL.
+ 
+    MOVE-CORRESPONDING is_meta TO ls_full_meta.
+    ls_full_meta-key = iv_key.
+ 
+    instantiate_and_add( ls_full_meta ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_sub_super_packages.
+ 
+    DATA:
+      ls_repo     LIKE LINE OF it_repos,
+      li_package  TYPE REF TO zif_abapgit_sap_package,
+      lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+      li_repo     TYPE REF TO zif_abapgit_repo.
+ 
+    LOOP AT it_repos INTO ls_repo.
+      li_repo = zif_abapgit_repo_srv~get( ls_repo-key ).
+ 
+      li_package = zcl_abapgit_factory=>get_sap_package( ls_repo-package ).
+      IF li_package->exists( ) = abap_false.
+        " Skip dangling repository
+        CONTINUE.
+      ENDIF.
+ 
+      CLEAR lt_packages.
+      IF li_repo->get_local_settings( )-ignore_subpackages = abap_false.
+        APPEND LINES OF li_package->list_subpackages( ) TO lt_packages.
+        READ TABLE lt_packages TRANSPORTING NO FIELDS
+          WITH KEY table_line = iv_package.
+        IF sy-subrc = 0.
+          ei_repo = li_repo.
+          ev_reason = |Repository { li_repo->get_name( ) } already contains { iv_package } |.
+          RETURN.
+        ENDIF.
+      ENDIF.
+ 
+      IF iv_ign_subpkg = abap_false.
+        APPEND LINES OF li_package->list_superpackages( ) TO lt_packages.
+        READ TABLE lt_packages TRANSPORTING NO FIELDS
+          WITH KEY table_line = iv_package.
+        IF sy-subrc = 0.
+          ei_repo = li_repo.
+          ev_reason = |Repository { li_repo->get_name( ) } already contains subpackage of { iv_package } |.
+          RETURN.
+        ENDIF.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_listener~on_meta_change.
+ 
+    DATA li_persistence TYPE REF TO zif_abapgit_persist_repo.
+ 
+    li_persistence = zcl_abapgit_persist_factory=>get_repo( ).
+    li_persistence->update_metadata(
+      iv_key         = iv_key
+      is_meta        = is_meta
+      is_change_mask = is_change_mask ).
+ 
+ 
+    " Recreate repo instance if type changed
+    " Instances in mt_list are of *_online and *_offline type
+    " If type is changed object should be recreated from the proper class
+    " TODO refactor, e.g. unify repo logic in one class
+    IF is_change_mask-offline = abap_true.
+      reinstantiate_repo(
+        iv_key  = iv_key
+        is_meta = is_meta ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~delete.
+ 
+    zcl_abapgit_persist_factory=>get_repo( )->delete( ii_repo->get_key( ) ).
+    zcl_abapgit_persist_factory=>get_repo_cs( )->delete( ii_repo->get_key( ) ).
+ 
+    " If favorite, remove it
+    IF zcl_abapgit_persistence_user=>get_instance( )->is_favorite_repo( ii_repo->get_key( ) ) = abap_true.
+      zcl_abapgit_persistence_user=>get_instance( )->toggle_favorite( ii_repo->get_key( ) ).
+    ENDIF.
+ 
+    DELETE TABLE mt_list FROM ii_repo.
+    ASSERT sy-subrc = 0.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~get.
+ 
+    FIELD-SYMBOLS: <li_repo> LIKE LINE OF mt_list.
+ 
+    IF mv_init = abap_false.
+      refresh_all( ).
+    ENDIF.
+ 
+    DO 2 TIMES.
+      " Repo might have been created in another session. Try again after refresh
+      IF sy-index = 2.
+        refresh_all( ).
+      ENDIF.
+      LOOP AT mt_list ASSIGNING <li_repo>.
+        IF <li_repo>->ms_data-key = iv_key.
+          ri_repo = <li_repo>.
+          RETURN.
+        ENDIF.
+      ENDLOOP.
+    ENDDO.
+ 
+    zcx_abapgit_exception=>raise( |Repository not found in database. Key: REPO, { iv_key }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~get_label_list.
+ 
+    DATA:
+      lt_repo           TYPE zif_abapgit_repo_srv=>ty_repo_list,
+      ls_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings,
+      lt_labels         TYPE string_table,
+      ls_label          LIKE LINE OF rt_labels.
+ 
+    FIELD-SYMBOLS:
+      <ls_repo>  TYPE REF TO zif_abapgit_repo,
+      <lv_label> TYPE LINE OF string_table.
+ 
+    lt_repo = zif_abapgit_repo_srv~list( ).
+ 
+    LOOP AT lt_repo ASSIGNING <ls_repo>.
+ 
+      ls_local_settings = <ls_repo>->get_local_settings( ).
+      lt_labels = zcl_abapgit_repo_labels=>split( ls_local_settings-labels ).
+ 
+      LOOP AT lt_labels ASSIGNING <lv_label>.
+        ls_label-label = <lv_label>.
+        INSERT ls_label INTO TABLE rt_labels.
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+    SORT rt_labels.
+    DELETE ADJACENT DUPLICATES FROM rt_labels.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~get_repo_from_package.
+ 
+    DATA:
+      lt_repos TYPE zif_abapgit_persistence=>ty_repos,
+      lv_name  TYPE zif_abapgit_persistence=>ty_local_settings-display_name,
+      lv_owner TYPE zif_abapgit_persistence=>ty_local_settings-display_name.
+ 
+    FIELD-SYMBOLS:
+      <ls_repo> LIKE LINE OF lt_repos.
+ 
+    " check if package is already in use for a different repository
+    lt_repos = zcl_abapgit_persist_factory=>get_repo( )->list( ).
+    READ TABLE lt_repos WITH KEY package = iv_package ASSIGNING <ls_repo>.
+    IF sy-subrc = 0.
+      ei_repo = get_instance( )->get( <ls_repo>-key ).
+      lv_name = ei_repo->get_name( ).
+      lv_owner = <ls_repo>-created_by.
+      ev_reason = |Package { iv_package } already versioned as { lv_name } by { lv_owner }|.
+    ELSE.
+      " check if package is include as sub-package in a different repo
+      validate_sub_super_packages(
+        EXPORTING
+          iv_package    = iv_package
+          it_repos      = lt_repos
+          iv_ign_subpkg = iv_ign_subpkg
+        IMPORTING
+          ei_repo       = ei_repo
+          ev_reason     = ev_reason ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~get_repo_from_url.
+ 
+    DATA:
+      lt_repos                TYPE zif_abapgit_persistence=>ty_repos,
+      lv_current_repo_address TYPE string,
+      lv_check_repo_address   TYPE string,
+      lv_repo_path            TYPE string,
+      lv_name                 TYPE zif_abapgit_persistence=>ty_local_settings-display_name,
+      lv_owner                TYPE zif_abapgit_persistence=>ty_local_settings-display_name.
+ 
+    FIELD-SYMBOLS:
+      <ls_repo> LIKE LINE OF lt_repos.
+ 
+    CLEAR:
+      ei_repo, ev_reason.
+ 
+    lv_current_repo_address = zcl_abapgit_url=>url_address( iv_url ).
+ 
+    " check if url is already in use for a different package
+    lt_repos = zcl_abapgit_persist_factory=>get_repo( )->list( ).
+    LOOP AT lt_repos ASSIGNING <ls_repo> WHERE offline = abap_false.
+ 
+      lv_check_repo_address = zcl_abapgit_url=>url_address( <ls_repo>-url ).
+ 
+      IF lv_current_repo_address = lv_check_repo_address.
+        ei_repo      = get_instance( )->get( <ls_repo>-key ).
+        lv_repo_path = zcl_abapgit_url=>path_name( iv_url ).
+        lv_name      = ei_repo->get_name( ).
+        lv_owner     = <ls_repo>-created_by.
+        ev_reason    = |Repository { lv_repo_path } already versioned as { lv_name } by { lv_owner }|.
+        RETURN.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~init.
+    CLEAR mv_init.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~is_repo_installed.
+ 
+    DATA: lt_repo        TYPE zif_abapgit_repo_srv=>ty_repo_list,
+          li_repo        TYPE REF TO zif_abapgit_repo,
+          lv_url         TYPE string,
+          lv_package     TYPE devclass,
+          lo_repo_online TYPE REF TO zcl_abapgit_repo_online,
+          lv_err         TYPE string.
+ 
+    lt_repo = zif_abapgit_repo_srv~list( ).
+ 
+    LOOP AT lt_repo INTO li_repo.
+      CHECK li_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= li_repo.
+ 
+      lv_url     = lo_repo_online->get_url( ).
+      lv_package = lo_repo_online->get_package( ).
+      CHECK to_upper( lv_url ) = to_upper( iv_url ).
+ 
+      " Validate bindings
+      "TODO refactor: move this message out of this method
+      IF iv_target_package IS NOT INITIAL AND iv_target_package <> lv_package.
+        lv_err = |Installation to package { lv_package } detected. |
+              && |Cancelling installation|.
+        zcx_abapgit_exception=>raise( lv_err ).
+      ENDIF.
+ 
+      rv_installed = abap_true.
+      EXIT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~list.
+ 
+    IF mv_init = abap_false OR mv_only_favorites = abap_true.
+      refresh_all( ).
+    ENDIF.
+ 
+    rt_list = mt_list.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~list_favorites.
+ 
+    DATA lt_user_favorites TYPE zif_abapgit_persist_user=>ty_favorites.
+    DATA li_repo TYPE REF TO zif_abapgit_repo.
+ 
+    lt_user_favorites = zcl_abapgit_persistence_user=>get_instance( )->get_favorites( ).
+    SORT lt_user_favorites BY table_line.
+ 
+    IF mv_init = abap_false OR mv_only_favorites = abap_false.
+      refresh_favorites( ).
+    ENDIF.
+ 
+    LOOP AT mt_list INTO li_repo.
+      READ TABLE lt_user_favorites
+        TRANSPORTING NO FIELDS
+        WITH KEY table_line = li_repo->get_key( ).
+      IF sy-subrc = 0.
+        APPEND li_repo TO rt_list.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~new_offline.
+ 
+    DATA: ls_repo        TYPE zif_abapgit_persistence=>ty_repo,
+          lv_key         TYPE zif_abapgit_persistence=>ty_repo-key,
+          lo_repo        TYPE REF TO zcl_abapgit_repo_offline,
+          lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+ 
+    IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-create_repo ) = abap_false.
+      zcx_abapgit_exception=>raise( ''Not authorized'' ).
+    ENDIF.
+ 
+    zif_abapgit_repo_srv~validate_package(
+      iv_package    = iv_package
+      iv_ign_subpkg = iv_ign_subpkg ).
+ 
+    IF iv_url IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Missing display name for repo'' ).
+    ENDIF.
+ 
+    lo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ).
+    lo_dot_abapgit->set_folder_logic( iv_folder_logic ).
+ 
+    lv_key = zcl_abapgit_persist_factory=>get_repo( )->add(
+      iv_url          = iv_url
+      iv_branch_name  = ''''
+      iv_package      = iv_package
+      iv_offline      = abap_true
+      is_dot_abapgit  = lo_dot_abapgit->get_data( ) ).
+ 
+    TRY.
+        ls_repo = zcl_abapgit_persist_factory=>get_repo( )->read( lv_key ).
+      CATCH zcx_abapgit_not_found.
+        zcx_abapgit_exception=>raise( ''new_offline not found'' ).
+    ENDTRY.
+ 
+    lo_repo ?= instantiate_and_add( ls_repo ).
+ 
+    IF ls_repo-local_settings-ignore_subpackages <> iv_ign_subpkg.
+      ls_repo-local_settings-ignore_subpackages = iv_ign_subpkg.
+    ENDIF.
+    ls_repo-local_settings-main_language_only = iv_main_lang_only.
+    ls_repo-local_settings-labels = iv_labels.
+ 
+    lo_repo->set_local_settings( ls_repo-local_settings ).
+    lo_repo->check_and_create_package( iv_package ).
+ 
+    ri_repo = lo_repo.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~new_online.
+ 
+    DATA: ls_repo        TYPE zif_abapgit_persistence=>ty_repo,
+          lo_repo        TYPE REF TO zcl_abapgit_repo_online,
+          lv_branch_name LIKE iv_branch_name,
+          lv_key         TYPE zif_abapgit_persistence=>ty_repo-key,
+          ls_dot_abapgit TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit,
+          lv_url         TYPE string.
+ 
+ 
+    ASSERT NOT iv_url IS INITIAL
+      AND NOT iv_package IS INITIAL.
+ 
+    lv_url = condense( iv_url ).
+ 
+    IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-create_repo ) = abap_false.
+      zcx_abapgit_exception=>raise( ''Not authorized'' ).
+    ENDIF.
+ 
+    zif_abapgit_repo_srv~validate_package(
+      iv_package    = iv_package
+      iv_ign_subpkg = iv_ign_subpkg ).
+ 
+    zif_abapgit_repo_srv~validate_url( lv_url ).
+ 
+    lv_branch_name = determine_branch_name(
+      iv_name = iv_branch_name
+      iv_url  = lv_url ).
+ 
+    ls_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ).
+    ls_dot_abapgit-folder_logic = iv_folder_logic.
+ 
+    lv_key = zcl_abapgit_persist_factory=>get_repo( )->add(
+      iv_url          = lv_url
+      iv_branch_name  = lv_branch_name " local !
+      iv_display_name = iv_display_name
+      iv_package      = iv_package
+      iv_offline      = abap_false
+      is_dot_abapgit  = ls_dot_abapgit ).
+ 
+    TRY.
+        ls_repo = zcl_abapgit_persist_factory=>get_repo( )->read( lv_key ).
+      CATCH zcx_abapgit_not_found.
+        zcx_abapgit_exception=>raise( ''new_online not found'' ).
+    ENDTRY.
+ 
+    lo_repo ?= instantiate_and_add( ls_repo ).
+ 
+    IF ls_repo-local_settings-ignore_subpackages <> iv_ign_subpkg.
+      ls_repo-local_settings-ignore_subpackages = iv_ign_subpkg.
+    ENDIF.
+    ls_repo-local_settings-main_language_only = iv_main_lang_only.
+    ls_repo-local_settings-labels = iv_labels.
+ 
+    lo_repo->set_local_settings( ls_repo-local_settings ).
+    lo_repo->refresh( ).
+    lo_repo->find_remote_dot_abapgit( ).
+    lo_repo->check_and_create_package( iv_package ).
+ 
+    ri_repo = lo_repo.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~purge.
+ 
+* uninstalls all objects, no UI or popups in this class
+ 
+* todo, this should be a method on the repo instead?
+ 
+    DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    DATA: lx_error TYPE REF TO zcx_abapgit_exception.
+    DATA lo_repo TYPE REF TO zcl_abapgit_repo.
+ 
+    lo_repo ?= ii_repo. " TODO, remove later
+    ri_log = lo_repo->create_new_log( ''Uninstall Log'' ).
+ 
+    IF ii_repo->get_local_settings( )-write_protected = abap_true.
+      zcx_abapgit_exception=>raise( ''Cannot purge. Local code is write-protected by repo config'' ).
+    ELSEIF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-uninstall ) = abap_false.
+      zcx_abapgit_exception=>raise( ''Not authorized'' ).
+    ENDIF.
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( ii_repo->get_package( ) ).
+ 
+    TRY.
+        zcl_abapgit_objects=>delete( it_tadir  = lt_tadir
+                                     is_checks = is_checks
+                                     ii_log    = ri_log ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        " If uninstall fails, repo needs a refresh to show which objects where deleted and which not
+        ii_repo->refresh( iv_drop_log = abap_false ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+    zif_abapgit_repo_srv~delete( ii_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~validate_package.
+ 
+    DATA: lv_as4user TYPE tdevc-as4user,
+          li_repo    TYPE REF TO zif_abapgit_repo,
+          lv_reason  TYPE string.
+ 
+    zcl_abapgit_factory=>get_sap_package( iv_package )->validate_name( ).
+ 
+    " Check if package owned by SAP is allowed (new packages are ok, since they are created automatically)
+    lv_as4user = zcl_abapgit_factory=>get_sap_package( iv_package )->read_responsible( ).
+ 
+    IF sy-subrc = 0 AND lv_as4user = ''SAP'' AND
+      zcl_abapgit_factory=>get_environment( )->is_sap_object_allowed( ) = abap_false.
+      zcx_abapgit_exception=>raise( |Package { iv_package } not allowed, responsible user = ''SAP''| ).
+    ENDIF.
+ 
+    " Check if package is already used in another repo
+    IF iv_chk_exists = abap_true.
+      zif_abapgit_repo_srv~get_repo_from_package(
+        EXPORTING
+          iv_package    = iv_package
+          iv_ign_subpkg = iv_ign_subpkg
+        IMPORTING
+          ei_repo       = li_repo
+          ev_reason     = lv_reason ).
+ 
+      IF li_repo IS BOUND.
+        zcx_abapgit_exception=>raise( lv_reason ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~validate_url.
+ 
+    DATA:
+      li_repo   TYPE REF TO zif_abapgit_repo,
+      lv_reason TYPE string.
+ 
+    zcl_abapgit_url=>validate( iv_url ).
+ 
+    IF iv_chk_exists = abap_true.
+      zif_abapgit_repo_srv~get_repo_from_url(
+        EXPORTING
+          iv_url    = iv_url
+        IMPORTING
+          ei_repo   = li_repo
+          ev_reason = lv_reason ).
+      IF li_repo IS BOUND.
+        zcx_abapgit_exception=>raise( lv_reason ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_DOT_ABAPGIT                 ', 'INTERFACE zif_abapgit_dot_abapgit PUBLIC.
+ 
+  TYPES:
+    BEGIN OF ty_requirement,
+      component   TYPE tdevc-dlvunit,
+      min_release TYPE saprelease,
+      min_patch   TYPE sappatchlv,
+    END OF ty_requirement .
+  TYPES:
+    ty_requirement_tt TYPE STANDARD TABLE OF ty_requirement WITH DEFAULT KEY .
+ 
+  TYPES:
+    BEGIN OF ty_dot_abapgit,
+      master_language       TYPE spras,
+      i18n_languages        TYPE zif_abapgit_definitions=>ty_languages,
+      use_lxe               TYPE abap_bool,
+      starting_folder       TYPE string,
+      folder_logic          TYPE string,
+      ignore                TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+      requirements          TYPE ty_requirement_tt,
+      version_constant      TYPE string,
+      abap_language_version TYPE string,
+    END OF ty_dot_abapgit .
+ 
+  CONSTANTS:
+    BEGIN OF c_folder_logic,
+      prefix TYPE string VALUE ''PREFIX'',
+      full   TYPE string VALUE ''FULL'',
+      mixed  TYPE string VALUE ''MIXED'',
+    END OF c_folder_logic,
+ 
+    BEGIN OF c_abap_language_version,
+      standard          TYPE string VALUE ''standard'',
+      key_user          TYPE string VALUE ''keyUser'',
+      cloud_development TYPE string VALUE ''cloudDevelopment'',
+      undefined         TYPE string VALUE ''undefined'',
+    END OF c_abap_language_version.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_OBJECT_FILTER               ', 'INTERFACE zif_abapgit_object_filter
+  PUBLIC .
+ 
+  METHODS get_filter
+    RETURNING
+      VALUE(rt_filter) TYPE zif_abapgit_definitions=>ty_tadir_tt
+    RAISING
+      zcx_abapgit_exception.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_REPO                        ', 'INTERFACE zif_abapgit_repo
+  PUBLIC .
+ 
+  DATA ms_data TYPE zif_abapgit_persistence=>ty_repo READ-ONLY.
+ 
+  METHODS get_key
+    RETURNING
+      VALUE(rv_key) TYPE zif_abapgit_persistence=>ty_value .
+  METHODS get_name
+    RETURNING
+      VALUE(rv_name) TYPE string.
+  METHODS is_offline
+    RETURNING
+      VALUE(rv_offline) TYPE abap_bool .
+  METHODS get_package
+    RETURNING
+      VALUE(rv_package) TYPE zif_abapgit_persistence=>ty_repo-package .
+  METHODS get_local_settings
+    RETURNING
+      VALUE(rs_settings) TYPE zif_abapgit_persistence=>ty_repo-local_settings .
+ 
+  METHODS get_files_local
+    IMPORTING
+      !ii_log         TYPE REF TO zif_abapgit_log OPTIONAL
+      !ii_obj_filter  TYPE REF TO zif_abapgit_object_filter OPTIONAL
+    RETURNING
+      VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_item_tt
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_files_remote
+    IMPORTING
+      !ii_obj_filter   TYPE REF TO zif_abapgit_object_filter OPTIONAL
+      !iv_ignore_files TYPE abap_bool DEFAULT abap_false
+        PREFERRED PARAMETER ii_obj_filter
+    RETURNING
+      VALUE(rt_files)  TYPE zif_abapgit_git_definitions=>ty_files_tt
+    RAISING
+      zcx_abapgit_exception .
+  METHODS refresh
+    IMPORTING
+      !iv_drop_cache TYPE abap_bool DEFAULT abap_false
+      !iv_drop_log   TYPE abap_bool DEFAULT abap_true
+        PREFERRED PARAMETER iv_drop_cache
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_dot_abapgit
+    RETURNING
+      VALUE(ro_dot_abapgit) TYPE REF TO zcl_abapgit_dot_abapgit .
+  METHODS set_dot_abapgit
+    IMPORTING
+      !io_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit
+    RAISING
+      zcx_abapgit_exception .
+  METHODS deserialize
+    IMPORTING
+      !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      !ii_log    TYPE REF TO zif_abapgit_log
+    RAISING
+      zcx_abapgit_exception .
+  METHODS deserialize_checks
+    RETURNING
+      VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_deserialize_checks
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS checksums
+    RETURNING
+      VALUE(ri_checksums) TYPE REF TO zif_abapgit_repo_checksums
+    RAISING
+      zcx_abapgit_exception .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_REPO_CHECKSUMS              ', 'INTERFACE zif_abapgit_repo_checksums
+  PUBLIC.
+ 
+  METHODS get
+    RETURNING
+      VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+  METHODS get_checksums_per_file
+    RETURNING
+      VALUE(rt_checksums) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt .
+ 
+  METHODS rebuild
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS update
+    IMPORTING
+      !it_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_REPO_LISTENER               ', 'INTERFACE zif_abapgit_repo_listener
+  PUBLIC .
+ 
+  METHODS on_meta_change
+    IMPORTING
+      !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      !is_meta TYPE zif_abapgit_persistence=>ty_repo_xml
+      !is_change_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_REPO_ONLINE                 ', 'INTERFACE zif_abapgit_repo_online
+  PUBLIC .
+ 
+ 
+  METHODS get_url
+    RETURNING
+      VALUE(rv_url) TYPE zif_abapgit_persistence=>ty_repo-url .
+  METHODS get_selected_branch
+    RETURNING
+      VALUE(rv_name) TYPE zif_abapgit_persistence=>ty_repo-branch_name .
+  METHODS set_url
+    IMPORTING
+      !iv_url TYPE zif_abapgit_persistence=>ty_repo-url
+    RAISING
+      zcx_abapgit_exception .
+  METHODS select_branch
+    IMPORTING
+      !iv_branch_name TYPE zif_abapgit_persistence=>ty_repo-branch_name
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_selected_commit
+    RETURNING
+      VALUE(rv_selected_commit) TYPE zif_abapgit_persistence=>ty_repo-selected_commit
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_current_remote
+    RETURNING
+      VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+    RAISING
+      zcx_abapgit_exception .
+  METHODS select_commit
+    IMPORTING
+      !iv_selected_commit TYPE zif_abapgit_persistence=>ty_repo-selected_commit
+    RAISING
+      zcx_abapgit_exception .
+  METHODS switch_origin
+    IMPORTING
+      !iv_url       TYPE zif_abapgit_persistence=>ty_repo-url
+      !iv_branch    TYPE zif_abapgit_persistence=>ty_repo-branch_name OPTIONAL
+      !iv_overwrite TYPE abap_bool DEFAULT abap_false
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_switched_origin
+    RETURNING
+      VALUE(rv_switched_origin) TYPE zif_abapgit_persistence=>ty_repo-switched_origin.
+  METHODS push
+    IMPORTING
+      !is_comment TYPE zif_abapgit_git_definitions=>ty_comment
+      !io_stage   TYPE REF TO zcl_abapgit_stage
+    RAISING
+      zcx_abapgit_exception .
+  METHODS create_branch
+    IMPORTING
+      !iv_name TYPE string
+      !iv_from TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL
+    RAISING
+      zcx_abapgit_exception .
+  METHODS check_for_valid_branch
+    RAISING
+      zcx_abapgit_exception .
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_REPO_SRV                    ', 'INTERFACE zif_abapgit_repo_srv
+  PUBLIC .
+ 
+ 
+  TYPES:
+    ty_repo_list TYPE STANDARD TABLE OF REF TO zif_abapgit_repo WITH DEFAULT KEY,
+ 
+    BEGIN OF ty_label,
+      label TYPE string,
+    END OF ty_label,
+    ty_labels TYPE STANDARD TABLE OF ty_label WITH NON-UNIQUE DEFAULT KEY
+                   WITH NON-UNIQUE SORTED KEY key_label COMPONENTS label.
+ 
+  METHODS init.
+  METHODS delete
+    IMPORTING
+      !ii_repo TYPE REF TO zif_abapgit_repo
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get
+    IMPORTING
+      !iv_key        TYPE zif_abapgit_persistence=>ty_value
+    RETURNING
+      VALUE(ri_repo) TYPE REF TO zif_abapgit_repo
+    RAISING
+      zcx_abapgit_exception .
+  METHODS is_repo_installed
+    IMPORTING
+      !iv_url             TYPE string
+      !iv_target_package  TYPE devclass OPTIONAL
+    RETURNING
+      VALUE(rv_installed) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS list
+    RETURNING
+      VALUE(rt_list) TYPE ty_repo_list
+    RAISING
+      zcx_abapgit_exception .
+  METHODS list_favorites
+    RETURNING
+      VALUE(rt_list) TYPE ty_repo_list
+    RAISING
+      zcx_abapgit_exception .
+  METHODS new_offline
+    IMPORTING
+      !iv_url            TYPE string
+      !iv_package        TYPE devclass
+      !iv_folder_logic   TYPE string DEFAULT zif_abapgit_dot_abapgit=>c_folder_logic-full
+      !iv_labels         TYPE string OPTIONAL
+      !iv_ign_subpkg     TYPE abap_bool DEFAULT abap_false
+      !iv_main_lang_only TYPE abap_bool DEFAULT abap_false
+    RETURNING
+      VALUE(ri_repo)     TYPE REF TO zif_abapgit_repo
+    RAISING
+      zcx_abapgit_exception .
+  METHODS new_online
+    IMPORTING
+      !iv_url            TYPE string
+      !iv_branch_name    TYPE string OPTIONAL
+      !iv_display_name   TYPE string OPTIONAL
+      !iv_package        TYPE devclass
+      !iv_folder_logic   TYPE string DEFAULT zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      !iv_labels         TYPE string OPTIONAL
+      !iv_ign_subpkg     TYPE abap_bool DEFAULT abap_false
+      !iv_main_lang_only TYPE abap_bool DEFAULT abap_false
+    RETURNING
+      VALUE(ri_repo)     TYPE REF TO zif_abapgit_repo
+    RAISING
+      zcx_abapgit_exception .
+  METHODS purge
+    IMPORTING
+      !ii_repo      TYPE REF TO zif_abapgit_repo
+      !is_checks    TYPE zif_abapgit_definitions=>ty_delete_checks
+    RETURNING
+      VALUE(ri_log) TYPE REF TO zif_abapgit_log
+    RAISING
+      zcx_abapgit_exception .
+  METHODS validate_package
+    IMPORTING
+      !iv_package    TYPE devclass
+      !iv_ign_subpkg TYPE abap_bool DEFAULT abap_false
+      !iv_chk_exists TYPE abap_bool DEFAULT abap_true
+    RAISING
+      zcx_abapgit_exception .
+  METHODS validate_url
+    IMPORTING
+      !iv_url        TYPE string
+      !iv_chk_exists TYPE abap_bool DEFAULT abap_true
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_repo_from_package
+    IMPORTING
+      !iv_package    TYPE devclass
+      !iv_ign_subpkg TYPE abap_bool DEFAULT abap_false
+    EXPORTING
+      VALUE(ei_repo) TYPE REF TO zif_abapgit_repo
+      !ev_reason     TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_repo_from_url
+    IMPORTING
+      !iv_url    TYPE string
+    EXPORTING
+      !ei_repo   TYPE REF TO zif_abapgit_repo
+      !ev_reason TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_label_list
+    RETURNING
+      VALUE(rt_labels) TYPE ty_labels
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_STAGE                       ', 'CLASS zcl_abapgit_stage DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS method_description
+      IMPORTING
+        !iv_method            TYPE zif_abapgit_definitions=>ty_method
+      RETURNING
+        VALUE(rv_description) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !iv_merge_source TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL .
+    METHODS add
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+        !iv_data     TYPE xstring
+        !is_status   TYPE zif_abapgit_definitions=>ty_result OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS reset
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+      RAISING
+        zcx_abapgit_exception .
+    METHODS rm
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+        !is_status   TYPE zif_abapgit_definitions=>ty_result OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS ignore
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_merge_source
+      RETURNING
+        VALUE(rv_source) TYPE zif_abapgit_git_definitions=>ty_sha1 .
+    METHODS count
+      RETURNING
+        VALUE(rv_count) TYPE i .
+    METHODS get_all
+      RETURNING
+        VALUE(rt_stage) TYPE zif_abapgit_definitions=>ty_stage_tt .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_stage TYPE zif_abapgit_definitions=>ty_stage_tt .
+    DATA mv_merge_source TYPE zif_abapgit_git_definitions=>ty_sha1 .
+ 
+    METHODS append
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+        !iv_method   TYPE zif_abapgit_definitions=>ty_method
+        !is_status   TYPE zif_abapgit_definitions=>ty_result OPTIONAL
+        !iv_data     TYPE xstring OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_stage IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+ 
+    append( iv_path     = iv_path
+            iv_filename = iv_filename
+            iv_method   = zif_abapgit_definitions=>c_method-add
+            is_status   = is_status
+            iv_data     = iv_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD append.
+ 
+    DATA: ls_stage LIKE LINE OF mt_stage.
+ 
+    FIELD-SYMBOLS: <ls_stage> LIKE LINE OF mt_stage.
+ 
+ 
+    READ TABLE mt_stage WITH KEY
+      file-path     = iv_path
+      file-filename = iv_filename
+      ASSIGNING <ls_stage>.
+    IF sy-subrc = 0.
+      <ls_stage>-file-data = iv_data.
+      <ls_stage>-method    = iv_method.
+    ELSE.
+      ls_stage-file-path     = iv_path.
+      ls_stage-file-filename = iv_filename.
+      ls_stage-file-data     = iv_data.
+      ls_stage-method        = iv_method.
+      ls_stage-status        = is_status.
+      INSERT ls_stage INTO TABLE mt_stage.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_merge_source = iv_merge_source.
+  ENDMETHOD.
+ 
+ 
+  METHOD count.
+    rv_count = lines( mt_stage ).
+  ENDMETHOD.
+ 
+ 
+  METHOD get_all.
+    rt_stage = mt_stage.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_merge_source.
+    rv_source = mv_merge_source.
+  ENDMETHOD.
+ 
+ 
+  METHOD ignore.
+    append( iv_path     = iv_path
+            iv_filename = iv_filename
+            iv_method   = zif_abapgit_definitions=>c_method-ignore ).
+  ENDMETHOD.
+ 
+ 
+  METHOD method_description.
+ 
+    CASE iv_method.
+      WHEN zif_abapgit_definitions=>c_method-add.
+        rv_description = ''add''.
+      WHEN zif_abapgit_definitions=>c_method-rm.
+        rv_description = ''remove''.
+      WHEN zif_abapgit_definitions=>c_method-ignore.
+        rv_description = ''ignore''.
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise( ''unknown staging method type'' ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reset.
+    DELETE mt_stage WHERE file-path = iv_path AND file-filename = iv_filename.
+    ASSERT sy-subrc = 0.
+  ENDMETHOD.
+ 
+ 
+  METHOD rm.
+    append( iv_path     = iv_path
+            iv_filename = iv_filename
+            is_status   = is_status
+            iv_method   = zif_abapgit_definitions=>c_method-rm ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_STAGE_LOGIC                 ', 'CLASS zcl_abapgit_stage_logic DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_stage_logic .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CLASS-METHODS:
+      remove_ignored
+        IMPORTING io_repo  TYPE REF TO zcl_abapgit_repo_online
+        CHANGING  cs_files TYPE zif_abapgit_definitions=>ty_stage_files,
+      remove_identical
+        CHANGING cs_files TYPE zif_abapgit_definitions=>ty_stage_files.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_stage_logic IMPLEMENTATION.
+ 
+ 
+  METHOD remove_identical.
+ 
+    DATA: lv_index  TYPE i,
+          ls_remote LIKE LINE OF cs_files-remote.
+ 
+    FIELD-SYMBOLS: <ls_local> LIKE LINE OF cs_files-local.
+ 
+    SORT cs_files-remote BY path filename.
+ 
+    LOOP AT cs_files-local ASSIGNING <ls_local>.
+      lv_index = sy-tabix.
+ 
+      READ TABLE cs_files-remote INTO ls_remote
+        WITH KEY path = <ls_local>-file-path filename = <ls_local>-file-filename
+        BINARY SEARCH.
+      IF sy-subrc = 0.
+        DELETE cs_files-remote INDEX sy-tabix.
+        IF ls_remote-sha1 = <ls_local>-file-sha1.
+          DELETE cs_files-local INDEX lv_index.
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_ignored.
+ 
+    DATA: lv_index TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF cs_files-remote,
+                   <ls_local>  LIKE LINE OF cs_files-local.
+ 
+ 
+    LOOP AT cs_files-remote ASSIGNING <ls_remote>.
+      lv_index = sy-tabix.
+ 
+      IF io_repo->get_dot_abapgit( )->is_ignored(
+          iv_path     = <ls_remote>-path
+          iv_filename = <ls_remote>-filename ) = abap_true.
+        DELETE cs_files-remote INDEX lv_index.
+      ELSEIF <ls_remote>-path = zif_abapgit_definitions=>c_root_dir
+          AND <ls_remote>-filename = zif_abapgit_definitions=>c_dot_abapgit.
+        " Remove .abapgit from remotes - it cannot be removed or ignored
+        DELETE cs_files-remote INDEX lv_index.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    LOOP AT cs_files-local ASSIGNING <ls_local>.
+      lv_index = sy-tabix.
+ 
+      IF io_repo->get_dot_abapgit( )->is_ignored(
+          iv_path     = <ls_local>-file-path
+          iv_filename = <ls_local>-file-filename ) = abap_true.
+        DELETE cs_files-local INDEX lv_index.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_stage_logic~get.
+ 
+    rs_files-local  = io_repo->get_files_local( ii_obj_filter = ii_obj_filter ).
+    rs_files-remote = io_repo->get_files_remote( ii_obj_filter ).
+    rs_files-status = io_repo->status( ).
+    remove_identical( CHANGING cs_files = rs_files ).
+    remove_ignored( EXPORTING io_repo  = io_repo
+                    CHANGING  cs_files = rs_files ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_MERGE                       ', 'INTERFACE zif_abapgit_merge PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_merge,
+      repo     TYPE REF TO zcl_abapgit_repo_online,
+      source   TYPE zif_abapgit_git_definitions=>ty_git_branch,
+      target   TYPE zif_abapgit_git_definitions=>ty_git_branch,
+      common   TYPE zif_abapgit_definitions=>ty_ancestor,
+      stree    TYPE zif_abapgit_git_definitions=>ty_expanded_tt,
+      ttree    TYPE zif_abapgit_git_definitions=>ty_expanded_tt,
+      ctree    TYPE zif_abapgit_git_definitions=>ty_expanded_tt,
+      result   TYPE zif_abapgit_git_definitions=>ty_expanded_tt,
+      stage    TYPE REF TO zcl_abapgit_stage,
+      conflict TYPE string,
+    END OF ty_merge .
+  TYPES:
+    BEGIN OF ty_merge_conflict,
+      path        TYPE string,
+      filename    TYPE string,
+      source_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1,
+      source_data TYPE xstring,
+      target_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1,
+      target_data TYPE xstring,
+      result_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1,
+      result_data TYPE xstring,
+    END OF ty_merge_conflict .
+  TYPES:
+    ty_merge_conflict_tt TYPE STANDARD TABLE OF ty_merge_conflict WITH DEFAULT KEY .
+ 
+  METHODS get_conflicts
+    RETURNING
+      VALUE(rt_conflicts) TYPE ty_merge_conflict_tt .
+  METHODS get_result
+    RETURNING
+      VALUE(rs_merge) TYPE ty_merge .
+  METHODS get_source_branch
+    RETURNING
+      VALUE(rv_source_branch) TYPE string .
+  METHODS has_conflicts
+    RETURNING
+      VALUE(rv_conflicts_exists) TYPE abap_bool .
+  METHODS resolve_conflict
+    IMPORTING
+      !is_conflict TYPE ty_merge_conflict
+    RAISING
+      zcx_abapgit_exception .
+  METHODS run
+    RAISING
+      zcx_abapgit_exception .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_STAGE_LOGIC                 ', 'INTERFACE zif_abapgit_stage_logic
+  PUBLIC .
+ 
+  METHODS get
+    IMPORTING
+      !io_repo        TYPE REF TO zcl_abapgit_repo_online
+      !ii_obj_filter  TYPE REF TO zif_abapgit_object_filter OPTIONAL
+    RETURNING
+      VALUE(rs_files) TYPE zif_abapgit_definitions=>ty_stage_files
+    RAISING
+      zcx_abapgit_exception .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SYNTAX_ABAP                 ', 'CLASS zcl_abapgit_syntax_abap DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS class_constructor.
+    METHODS constructor.
+ 
+    CONSTANTS:
+      BEGIN OF c_css,
+        keyword TYPE string VALUE ''keyword'',
+        text    TYPE string VALUE ''text'',
+        comment TYPE string VALUE ''comment'',
+      END OF c_css,
+ 
+      BEGIN OF c_token,
+        keyword TYPE c VALUE ''K'',
+        text    TYPE c VALUE ''T'',
+        comment TYPE c VALUE ''C'',
+      END OF c_token,
+ 
+      BEGIN OF c_regex,
+        comment TYPE string VALUE ''##|"|^\\*'',
+        text    TYPE string VALUE ''\`|''''|\\||\\{|\\}'',
+        keyword TYPE string VALUE ''&&|\\b[-_a-z0-9]+\\b'',
+      END OF c_regex.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-DATA gt_keywords TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
+ 
+    CLASS-METHODS init_keywords.
+    CLASS-METHODS is_keyword
+      IMPORTING iv_chunk      TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    METHODS order_matches REDEFINITION.
+    METHODS parse_line REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_SYNTAX_ABAP IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+ 
+    init_keywords( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Initialize instances of regular expression
+    add_rule( iv_regex = c_regex-keyword
+              iv_token = c_token-keyword
+              iv_style = c_css-keyword ).
+ 
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+    add_rule( iv_regex = c_regex-text
+              iv_token = c_token-text
+              iv_style = c_css-text ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init_keywords.
+ 
+    DATA: lv_keywords TYPE string,
+          lt_keywords TYPE STANDARD TABLE OF string.
+ 
+    lv_keywords =
+     ''&&|?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING'' &&
+      ''|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS'' &&
+      ''|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE'' &&
+      ''|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT'' &&
+      ''|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY'' &&
+      ''|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN'' &&
+      ''|BETWEEN|BIG|BINARY|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK'' &&
+      ''|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT'' &&
+      ''|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS'' &&
+      ''|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED'' &&
+      ''|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHARACTER|CHARLEN'' &&
+      ''|CHAR-TO-HEX|CHECK|CHECKBOX|CI_|CIRCULAR|CLASS|CLASS-CODING|CLASS-DATA'' &&
+      ''|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE'' &&
+      ''|CN|CO|COALESCE|CODE|CODING|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY'' &&
+      ''|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COLLECT|COLOR|COLUMN|COLUMNS'' &&
+      ''|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS'' &&
+      ''|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT'' &&
+      ''|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION'' &&
+      ''|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE'' &&
+      ''|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION'' &&
+      ''|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE'' &&
+      ''|DAYLIGHT|DBMAXLEN|DD/MM/YY|DD/MM/YYYY|DDMMYY|DEALLOCATE|DECIMAL_SHIFT|DECIMALS'' &&
+      ''|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING'' &&
+      ''|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY'' &&
+      ''|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING'' &&
+      ''|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO'' &&
+      ''|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|ENDAT|ENDCASE'' &&
+      ''|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|END-ENHANCEMENT-SECTION'' &&
+      ''|ENDEXEC|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE'' &&
+      ''|END-LINES|ENDLOOP|ENDMETHOD|ENDMODULE|END-OF-DEFINITION|END-OF-FILE'' &&
+      ''|END-OF-PAGE|END-OF-SELECTION|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE'' &&
+      ''|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENTS|ENHANCEMENT-SECTION'' &&
+      ''|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING'' &&
+      ''|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTIONS|EXCEPTION-TABLE|EXCLUDE|EXCLUDING'' &&
+      ''|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT'' &&
+      ''|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD'' &&
+      ''|FIELD-GROUPS|FIELDS|FIELD-SYMBOL|FIELD-SYMBOLS|FILE|FILTER|FILTERS|FILTER-TABLE'' &&
+      ''|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM'' &&
+      ''|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTIONALITY'' &&
+      ''|FUNCTION-POOL|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT'' &&
+      ''|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEADER|HEADERS'' &&
+      ''|HEADING|HEAD-LINES|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID'' &&
+      ''|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION'' &&
+      ''|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE'' &&
+      ''|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL'' &&
+      ''|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE'' &&
+      ''|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS'' &&
+      ''|ISO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND'' &&
+      ''|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS'' &&
+      ''|LEFTSPACE|LEGACY|LENGTH|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINEFEED'' &&
+      ''|LINES|LINE-SELECTION|LINE-SIZE|LIST|LISTBOX|LIST-PROCESSING|LITTLE|LLANG'' &&
+      ''|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG10|LOGFILE|LOGICAL'' &&
+      ''|LOG-POINT|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN'' &&
+      ''|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE'' &&
+      ''|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM/DD/YY'' &&
+      ''|MM/DD/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING'' &&
+      ''|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING'' &&
+      ''|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NODE|NODES|NO-DISPLAY'' &&
+      ''|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NON-UNICODE|NON-UNIQUE'' &&
+      ''|NO-SCROLLING|NO-SIGN|NOT|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NP|NS|NULL|NUMBER'' &&
+      ''|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF'' &&
+      ''|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT'' &&
+      ''|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE'' &&
+      ''|PAGES|PARAMETER|PARAMETERS|PARAMETER-TABLE|PART|PARTIALLY|PATTERN|PERCENTAGE'' &&
+      ''|PERFORM|PERFORMING|PERSON|PF1|PF2|PF3|PF4|PF5|PF6|PF7|PF8|PF9|PF10|PF11|PF12'' &&
+      ''|PF13|PF14|PF15|PF-STATUS|PINK|PLACES|POOL|POS_HIGH|POS_LOW'' &&
+      ''|POSITION|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL'' &&
+      ''|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC'' &&
+      ''|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES'' &&
+      ''|RAW|READ|READER|READ-ONLY|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION'' &&
+      ''|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE'' &&
+      ''|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION'' &&
+      ''|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE'' &&
+      ''|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE'' &&
+      ''|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RUN|SAP'' &&
+      ''|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC'' &&
+      ''|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH'' &&
+      ''|SECONDARY|SECONDS|SECTION|SELECT|SELECTION|SELECTIONS|SELECTION-SCREEN|SELECTION-SET'' &&
+      ''|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS|SEND|SEPARATE|SEPARATED|SET'' &&
+      ''|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE'' &&
+      ''|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL'' &&
+      ''|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|STARTING|START-OF-SELECTION|STATE'' &&
+      ''|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE'' &&
+      ''|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT'' &&
+      ''|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH'' &&
+      ''|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE'' &&
+      ''|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP'' &&
+      ''|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP'' &&
+      ''|TIMEZONE|TITLE|TITLEBAR|TITLE-LINES|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE'' &&
+      ''|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE'' &&
+      ''|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES'' &&
+      ''|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL'' &&
+      ''|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES'' &&
+      ''|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER'' &&
+      ''|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK'' &&
+      ''|WRITE|WRITER|X|XML|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE'' &&
+      ''|BINTOHEX|CHAR|CLNT|CONCAT_WITH_SPACE|CURR|DATS|DATS_ADD_DAYS|DATS_ADD_MONTHS'' &&
+      ''|DATS_DAYS_BETWEEN|DATS_IS_VALID|DEC|END-OF-EDITING|END-TEST-INJECTION|END-TEST-SEAM'' &&
+      ''|ENDWITH|ENUM|HEXTOBIN|INSTANCE|INSTR|LANG|LTRIM|NUMC|PUSH'' &&
+      ''|QUAN|RETURNS|RPAD|RTRIM|SSTRING|START-OF-EDITING|TEST-INJECTION|TEST-SEAM|TIMS'' &&
+      ''|TIMS_IS_VALID|TSTMP_ADD_SECONDS|TSTMP_CURRENT_UTCTIMESTAMP|TSTMP_IS_VALID'' &&
+      ''|TSTMP_SECONDS_BETWEEN|B|D|DECFLOAT16|DECFLOAT34|F|INT8|N|P|S|STRING|T|UTCLONG|XSTRING'' &&
+      ''|ABAP_BOOL|ACCP|CUKY|DF16_DEC|DF16_RAW|DF34_DEC|DF34_RAW|FLTP'' &&
+      ''|INT1|INT2|INT4|LCHR|LRAW|RAWSTRING|DF16_SCL|DF34_SCL'' &&
+      ''|PREC|VARC|CLIKE|CSEQUENCE|DECFLOAT|NUMERIC|XSEQUENCE|ME|SYST|SY'' &&
+      ''|BIT-SET|BOOLC|BOOLX|CHAR_OFF|CMAX|CMIN|CONCAT_LINES_OF|CONTAINS|CONTAINS_ANY_NOT_OF'' &&
+      ''|CONTAINS_ANY_OF|COUNT_ANY_NOT_OF|COUNT_ANY_OF|FIND_ANY_NOT_OF|FIND_ANY_OF|FIND_END'' &&
+      ''|FROM_MIXED|IPOW|LINE_EXISTS|LINE_INDEX|MATCHES|NMAX|NMIN|REPEAT|RESCALE|REVERSE'' &&
+      ''|SEGMENT|SHIFT_LEFT|SHIFT_RIGHT|SUBSTRING_AFTER|SUBSTRING_BEFORE|SUBSTRING_FROM|SUBSTRING_TO'' &&
+      ''|TO_LOWER|TO_MIXED|TO_UPPER|UTCLONG_ADD|UTCLONG_CURRENT|UTCLONG_DIFF|XSDBOOL''.
+ 
+ 
+    SPLIT lv_keywords AT ''|'' INTO TABLE lt_keywords.
+    " remove duplicates to avoid dumps when converting to a hash table
+    SORT lt_keywords BY table_line ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM lt_keywords.
+    gt_keywords = lt_keywords. " Hash table
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_keyword.
+ 
+    DATA lv_str TYPE string.
+ 
+    lv_str = to_upper( iv_chunk ).
+    READ TABLE gt_keywords WITH KEY table_line = lv_str TRANSPORTING NO FIELDS.
+    rv_yes = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+ 
+    DATA:
+      lv_index      TYPE sy-tabix,
+      lv_line_len   TYPE i,
+      lv_prev_token TYPE c.
+ 
+    FIELD-SYMBOLS:
+      <ls_prev>  TYPE ty_match,
+      <ls_match> TYPE ty_match.
+ 
+    SORT ct_matches BY offset.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      lv_index = sy-tabix.
+ 
+      " Delete matches after open text match
+      IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
+        DELETE ct_matches INDEX lv_index.
+        CONTINUE.
+      ENDIF.
+ 
+      CASE <ls_match>-token.
+        WHEN c_token-keyword.
+          IF <ls_match>-offset > 0
+              AND substring( val = iv_line
+                             off = ( <ls_match>-offset - 1 )
+                             len = 1 ) CA ''-<''.
+            " Delete match if keyword is part of structure or field symbol
+            DELETE ct_matches INDEX lv_index.
+            CONTINUE.
+          ENDIF.
+ 
+        WHEN c_token-comment.
+          <ls_match>-length = lv_line_len - <ls_match>-offset.
+          DELETE ct_matches FROM lv_index + 1.
+          CONTINUE.
+ 
+        WHEN c_token-text.
+          <ls_match>-text_tag = substring( val = iv_line
+                                        off = <ls_match>-offset
+                                        len = <ls_match>-length ).
+          IF lv_prev_token = c_token-text.
+            IF <ls_match>-text_tag = <ls_prev>-text_tag.
+              <ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
+              CLEAR lv_prev_token.
+            ELSEIF <ls_prev>-text_tag = ''}'' AND <ls_match>-text_tag = ''{''.
+              <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset - 1.  " Shift } out of scope
+              <ls_prev>-offset = <ls_prev>-offset + 1.                   " Shift { out of scope
+              CLEAR lv_prev_token.
+            ELSEIF <ls_match>-text_tag = ''{''.
+              <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset.
+              CLEAR lv_prev_token.
+            ELSEIF <ls_prev>-text_tag = ''}''.
+              <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset.
+              <ls_prev>-offset = <ls_prev>-offset + 1.                   " Shift } out of scope
+              CLEAR lv_prev_token.
+            ENDIF.
+            DELETE ct_matches INDEX lv_index.
+            CONTINUE.
+          ENDIF.
+ 
+      ENDCASE.
+ 
+      lv_prev_token = <ls_match>-token.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line. "REDEFINITION
+ 
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
+ 
+    rt_matches = super->parse_line( iv_line ).
+ 
+    " Remove non-keywords
+    LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
+      lv_index = sy-tabix.
+      IF abap_false = is_keyword( substring( val = iv_line
+                                             off = <ls_match>-offset
+                                             len = <ls_match>-length ) ).
+        DELETE rt_matches INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SYNTAX_CSS                  ', 'CLASS zcl_abapgit_syntax_css DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    " CSS Standard            https://www.w3.org/TR/css-2018/
+    " CSS Reference           https://www.w3schools.com/cssref/default.asp
+ 
+    " We used a mixture of above as reference for the keyword list
+    " 1) CSS Properties       https://www.w3schools.com/cssref/default.asp
+    " 2) CSS Values & Units   https://www.w3schools.com/cssref/css_units.asp
+    " 3) CSS Selectors        https://www.w3.org/TR/css-2018/#selectors
+    " 4) CSS Functions        https://www.w3schools.com/cssref/css_functions.asp
+    " 5) CSS Colors           https://www.w3schools.com/colors/colors_names.asp
+    " 6) CSS Extensions
+    " 7) CSS At-Rules         https://www.w3.org/TR/css-2018/#at-rules
+    " 8) HTML Tags
+ 
+    CONSTANTS:
+      BEGIN OF c_css,
+        keyword    TYPE string VALUE ''keyword'',
+        text       TYPE string VALUE ''text'',
+        comment    TYPE string VALUE ''comment'',
+        selectors  TYPE string VALUE ''selectors'',
+        units      TYPE string VALUE ''units'',
+        properties TYPE string VALUE ''properties'',
+        values     TYPE string VALUE ''values'',
+        functions  TYPE string VALUE ''functions'',
+        colors     TYPE string VALUE ''colors'',
+        extensions TYPE string VALUE ''extensions'',
+        at_rules   TYPE string VALUE ''at_rules'',
+        html       TYPE string VALUE ''html'',
+      END OF c_css .
+    CONSTANTS:
+      BEGIN OF c_token,
+        keyword    TYPE c VALUE ''K'',
+        text       TYPE c VALUE ''T'',
+        comment    TYPE c VALUE ''C'',
+        selectors  TYPE c VALUE ''S'',
+        units      TYPE c VALUE ''U'',
+        properties TYPE c VALUE ''P'',
+        values     TYPE c VALUE ''V'',
+        functions  TYPE c VALUE ''F'',
+        colors     TYPE c VALUE ''Z'',
+        extensions TYPE c VALUE ''E'',
+        at_rules   TYPE c VALUE ''A'',
+        html       TYPE c VALUE ''H'',
+      END OF c_token .
+    CONSTANTS:
+      BEGIN OF c_regex,
+        " comments /* ... */
+        comment   TYPE string VALUE ''\\/\\*.*\\*\\/|\\/\\*|\\*\\/'',
+        " single or double quoted strings
+        text      TYPE string VALUE ''("[^"]*")|(''''[^'''']*'''')|(\`[^\`]*\`)'',
+        " in general keywords don''t contain numbers (except -ms-scrollbar-3dlight-color)
+        keyword   TYPE string VALUE ''\\b[a-z3@\\-]+\\b'',
+        " selectors begin with :
+        selectors TYPE string VALUE '':[:a-z]+\\b'',
+        " units
+        units     TYPE string
+        VALUE ''\\b[0-9\\. ]+(ch|cm|em|ex|in|mm|pc|pt|px|vh|vmax|vmin|vw)\\b|\\b[0-9\\. ]+%'',
+      END OF c_regex .
+ 
+    CLASS-METHODS class_constructor .
+    METHODS constructor .
+  PROTECTED SECTION.
+    TYPES: ty_token TYPE c LENGTH 1.
+ 
+    TYPES: BEGIN OF ty_keyword,
+             keyword TYPE string,
+             token   TYPE ty_token,
+           END OF ty_keyword.
+ 
+    CLASS-DATA gt_keywords TYPE HASHED TABLE OF ty_keyword WITH UNIQUE KEY keyword.
+    CLASS-DATA gv_comment TYPE abap_bool.
+ 
+    CLASS-METHODS init_keywords.
+    CLASS-METHODS insert_keywords
+      IMPORTING
+        iv_keywords TYPE string
+        iv_token    TYPE ty_token.
+    CLASS-METHODS is_keyword
+      IMPORTING iv_chunk      TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    METHODS order_matches REDEFINITION.
+    METHODS parse_line REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_css IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+ 
+    init_keywords( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Reset indicator for multi-line comments
+    CLEAR gv_comment.
+ 
+    " Initialize instances of regular expression
+    add_rule( iv_regex = c_regex-keyword
+              iv_token = c_token-keyword
+              iv_style = c_css-keyword ).
+ 
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+    add_rule( iv_regex = c_regex-text
+              iv_token = c_token-text
+              iv_style = c_css-text ).
+ 
+    add_rule( iv_regex = c_regex-selectors
+              iv_token = c_token-selectors
+              iv_style = c_css-selectors ).
+ 
+    add_rule( iv_regex = c_regex-units
+              iv_token = c_token-units
+              iv_style = c_css-units ).
+ 
+    " Styles for keywords
+    add_rule( iv_regex = ''''
+              iv_token = c_token-html
+              iv_style = c_css-html ).
+ 
+    add_rule( iv_regex = ''''
+              iv_token = c_token-properties
+              iv_style = c_css-properties ).
+ 
+    add_rule( iv_regex = ''''
+              iv_token = c_token-values
+              iv_style = c_css-values ).
+ 
+    add_rule( iv_regex = ''''
+              iv_token = c_token-functions
+              iv_style = c_css-functions ).
+ 
+    add_rule( iv_regex = ''''
+              iv_token = c_token-colors
+              iv_style = c_css-colors ).
+ 
+    add_rule( iv_regex = ''''
+              iv_token = c_token-extensions
+              iv_style = c_css-extensions ).
+ 
+    add_rule( iv_regex = ''''
+              iv_token = c_token-at_rules
+              iv_style = c_css-at_rules ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init_keywords.
+ 
+    DATA: lv_keywords TYPE string.
+ 
+    CLEAR gt_keywords.
+ 
+    " 1) CSS Properties
+    lv_keywords =
+    ''align-content|align-items|align-self|animation|animation-delay|animation-direction|animation-duration|'' &&
+    ''animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|'' &&
+    ''backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|'' &&
+    ''background-image|background-origin|background-position|background-repeat|background-size|border|'' &&
+    ''border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|'' &&
+    ''border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|'' &&
+    ''border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|'' &&
+    ''border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|'' &&
+    ''border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|'' &&
+    ''border-top-style|border-top-width|border-width|box-decoration-break|box-shadow|box-sizing|caption-side|'' &&
+    ''caret-color|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|'' &&
+    ''column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|'' &&
+    ''counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|'' &&
+    ''flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-kerning|font-size|font-size-adjust|'' &&
+    ''font-stretch|font-style|font-variant|font-weight|grid|grid-area|grid-auto-columns|grid-auto-flow|'' &&
+    ''grid-auto-rows|grid-column|grid-column-end|grid-column-gap|grid-column-start|grid-gap|grid-row|'' &&
+    ''grid-row-end|grid-row-gap|grid-row-start|grid-template|grid-template-areas|grid-template-columns|'' &&
+    ''grid-template-rows|hanging-punctuation|height|hyphens|isolation|justify-content|'' &&
+    ''letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|'' &&
+    ''margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|media|min-height|min-width|'' &&
+    ''mix-blend-mode|object-fit|object-position|opacity|order|outline|outline-color|outline-offset|'' &&
+    ''outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|'' &&
+    ''padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|'' &&
+    ''perspective-origin|pointer-events|position|quotes|resize|scroll-behavior|tab-size|table-layout|'' &&
+    ''text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|'' &&
+    ''text-decoration-style|text-indent|text-justify|text-overflow|text-rendering|text-shadow|text-transform|'' &&
+    ''transform|transform-origin|transform-style|transition|transition-delay|transition-duration|'' &&
+    ''transition-property|transition-timing-function|unicode-bidi|user-select|vertical-align|visibility|'' &&
+    ''white-space|width|word-break|word-spacing|word-wrap|writing-mode|z-index''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-properties ).
+ 
+    " 2) CSS Values
+    lv_keywords =
+    ''absolute|all|auto|block|bold|border-box|both|bottom|center|counter|cover|dashed|fixed|hidden|important|'' &&
+    ''inherit|initial|inline-block|italic|left|max-content|middle|min-content|no-repeat|none|normal|pointer|'' &&
+    ''relative|rem|right|solid|table-cell|text|top|transparent|underline|url''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-values ).
+ 
+    " 3) CSS Selectors
+    lv_keywords =
+    '':active|::after|::before|:checked|:disabled|:empty|:enabled|:first-child|::first-letter|::first-line|'' &&
+    '':first-of-type|:focus|:hover|:lang|:last-child|:last-of-type|:link|:not|:nth-child|:nth-last-child|'' &&
+    '':nth-last-of-type|:nth-of-type|:only-child|:only-of-type|:root|:target|:visited''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-selectors ).
+ 
+    " 4) CSS Functions
+    lv_keywords =
+    ''attr|calc|cubic-bezier|hsl|hsla|linear-gradient|radial-gradient|repeating-linear-gradient|'' &&
+    ''repeating-radial-gradient|rgb|rgba|rotate|scale|translateX|translateY|var''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-functions ).
+ 
+    " 5) CSS Colors
+    lv_keywords =
+    ''#|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|'' &&
+    ''burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|'' &&
+    ''darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|'' &&
+    ''darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|'' &&
+    ''deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|'' &&
+    ''ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|'' &&
+    ''lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|'' &&
+    ''lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|'' &&
+    ''lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|'' &&
+    ''mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|'' &&
+    ''mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|'' &&
+    ''orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|'' &&
+    ''peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|'' &&
+    ''seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|'' &&
+    ''tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-colors ).
+ 
+    " 6) CSS Extensions
+    lv_keywords =
+    ''moz|moz-binding|moz-border-bottom-colors|moz-border-left-colors|moz-border-right-colors|'' &&
+    ''moz-border-top-colors|moz-box-align|moz-box-direction|moz-box-flex|moz-box-ordinal-group|'' &&
+    ''moz-box-orient|moz-box-pack|moz-box-shadow|moz-context-properties|moz-float-edge|'' &&
+    ''moz-force-broken-image-icon|moz-image-region|moz-orient|moz-osx-font-smoothing|'' &&
+    ''moz-outline-radius|moz-outline-radius-bottomleft|moz-outline-radius-bottomright|'' &&
+    ''moz-outline-radius-topleft|moz-outline-radius-topright|moz-stack-sizing|moz-system-metric|'' &&
+    ''moz-transform|moz-transform-origin|moz-transition|moz-transition-delay|moz-user-focus|'' &&
+    ''moz-user-input|moz-user-modify|moz-window-dragging|moz-window-shadow|ms|ms-accelerator|'' &&
+    ''ms-block-progression|ms-content-zoom-chaining|ms-content-zoom-limit|'' &&
+    ''ms-content-zoom-limit-max|ms-content-zoom-limit-min|ms-content-zoom-snap|'' &&
+    ''ms-content-zoom-snap-points|ms-content-zoom-snap-type|ms-content-zooming|ms-filter|'' &&
+    ''ms-flow-from|ms-flow-into|ms-high-contrast-adjust|ms-hyphenate-limit-chars|'' &&
+    ''ms-hyphenate-limit-lines|ms-hyphenate-limit-zone|ms-ime-align|ms-overflow-style|'' &&
+    ''ms-scroll-chaining|ms-scroll-limit|ms-scroll-limit-x-max|ms-scroll-limit-x-min|'' &&
+    ''ms-scroll-limit-y-max|ms-scroll-limit-y-min|ms-scroll-rails|ms-scroll-snap-points-x|'' &&
+    ''ms-scroll-snap-points-y|ms-scroll-snap-x|ms-scroll-snap-y|ms-scroll-translation|'' &&
+    ''ms-scrollbar-3dlight-color|ms-scrollbar-arrow-color|ms-scrollbar-base-color|'' &&
+    ''ms-scrollbar-darkshadow-color|ms-scrollbar-face-color|ms-scrollbar-highlight-color|'' &&
+    ''ms-scrollbar-shadow-color|ms-scrollbar-track-color|ms-transform|ms-text-autospace|'' &&
+    ''ms-touch-select|ms-wrap-flow|ms-wrap-margin|ms-wrap-through|o|o-transform|webkit|'' &&
+    ''webkit-animation-trigger|webkit-app-region|webkit-appearance|webkit-aspect-ratio|'' &&
+    ''webkit-backdrop-filter|webkit-background-composite|webkit-border-after|'' &&
+    ''webkit-border-after-color|webkit-border-after-style|webkit-border-after-width|'' &&
+    ''webkit-border-before|webkit-border-before-color|webkit-border-before-style|'' &&
+    ''webkit-border-before-width|webkit-border-end|webkit-border-end-color|'' &&
+    ''webkit-border-end-style|webkit-border-end-width|webkit-border-fit|'' &&
+    ''webkit-border-horizontal-spacing|webkit-border-radius|webkit-border-start|'' &&
+    ''webkit-border-start-color|webkit-border-start-style|webkit-border-start-width|'' &&
+    ''webkit-border-vertical-spacing|webkit-box-align|webkit-box-direction|webkit-box-flex|'' &&
+    ''webkit-box-flex-group|webkit-box-lines|webkit-box-ordinal-group|webkit-box-orient|'' &&
+    ''webkit-box-pack|webkit-box-reflect|webkit-box-shadow|webkit-column-axis|'' &&
+    ''webkit-column-break-after|webkit-column-break-before|webkit-column-break-inside|'' &&
+    ''webkit-column-progression|webkit-cursor-visibility|webkit-dashboard-region|'' &&
+    ''webkit-font-size-delta|webkit-font-smoothing|webkit-highlight|webkit-hyphenate-character|'' &&
+    ''webkit-hyphenate-limit-after|webkit-hyphenate-limit-before|webkit-hyphenate-limit-lines|'' &&
+    ''webkit-initial-letter|webkit-line-align|webkit-line-box-contain|webkit-line-clamp|'' &&
+    ''webkit-line-grid|webkit-line-snap|webkit-locale|webkit-logical-height|'' &&
+    ''webkit-logical-width|webkit-margin-after|webkit-margin-after-collapse|'' &&
+    ''webkit-margin-before|webkit-margin-before-collapse|webkit-margin-bottom-collapse|'' &&
+    ''webkit-margin-collapse|webkit-margin-end|webkit-margin-start|webkit-margin-top-collapse|'' &&
+    ''webkit-marquee|webkit-marquee-direction|webkit-marquee-increment|'' &&
+    ''webkit-marquee-repetition|webkit-marquee-speed|webkit-marquee-style|webkit-mask-box-image|'' &&
+    ''webkit-mask-box-image-outset|webkit-mask-box-image-repeat|webkit-mask-box-image-slice|'' &&
+    ''webkit-mask-box-image-source|webkit-mask-box-image-width|webkit-mask-repeat-x|'' &&
+    ''webkit-mask-repeat-y|webkit-mask-source-type|webkit-max-logical-height|'' &&
+    ''webkit-max-logical-width|webkit-min-logical-height|webkit-min-logical-width|'' &&
+    ''webkit-nbsp-mode|webkit-padding-after|webkit-padding-before|webkit-padding-end|'' &&
+    ''webkit-padding-start|webkit-perspective-origin-x|webkit-perspective-origin-y|'' &&
+    ''webkit-print-color-adjust|webkit-rtl-ordering|webkit-svg-shadow|'' &&
+    ''webkit-tap-highlight-color|webkit-text-combine|webkit-text-decoration-skip|'' &&
+    ''webkit-text-decorations-in-effect|webkit-text-fill-color|webkit-text-security|'' &&
+    ''webkit-text-stroke|webkit-text-stroke-color|webkit-text-stroke-width|webkit-text-zoom|'' &&
+    ''webkit-transform|webkit-transform-origin|webkit-transform-origin-x|'' &&
+    ''webkit-transform-origin-y|webkit-transform-origin-z|webkit-transition|'' &&
+    ''webkit-transition-delay|webkit-user-drag|webkit-user-modify|overflow-clip-box|'' &&
+    ''overflow-clip-box-block|overflow-clip-box-inline|zoom''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-extensions ).
+ 
+    " 6) CSS At-Rules
+    lv_keywords =
+    ''@|charset|counter-style|font-face|import|keyframes''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-at_rules ).
+ 
+    " 7) HTML tage
+    lv_keywords =
+    ''doctyype|a|abbr|acronym|address|applet|area|b|base|basefont|bdo|bgsound|big|blink|blockquote|'' &&
+    ''body|br|button|caption|center|cite|code|col|colgroup|dd|del|dfn|dir|div|dl|dt|em|embed|fieldset|'' &&
+    ''font|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|hr|html|i|iframe|ilayer|img|input|ins|isindex|'' &&
+    ''kbd|keygen|label|layer|legend|li|link|listing|map|menu|meta|multicol|nobr|noembed|noframes|'' &&
+    ''nolayer|noscript|object|ol|optgroup|option|p|param|plaintext|pre|q|s|samp|script|select|server|'' &&
+    ''small|sound|spacer|span|strike|strong|style|sub|sup|tbody|textarea|title|tt|u|ul|var|wbr|xmp|'' &&
+    ''xsl|xml|accesskey|action|align|alink|alt|background|balance|behavior|bgcolor|bgproperties|'' &&
+    ''border|bordercolor|bordercolordark|bordercolorlight|bottommargin|checked|class|classid|clear|'' &&
+    ''code|codebase|codetype|color|cols|colspan|compact|content|controls|coords|data|datafld|'' &&
+    ''dataformatas|datasrc|direction|disabled|dynsrc|enctype|event|face|for|frame|frameborder|'' &&
+    ''framespacing|height|hidden|href|hspace|http-equiv|id|ismap|lang|language|leftmargin|link|loop|'' &&
+    ''lowsrc|marginheight|marginwidth|maxlength|mayscript|method|methods|multiple|name|nohref|'' &&
+    ''noresize|noshade|nowrap|palette|pluginspage|public|readonly|rel|rev|rightmargin|rows|rowspan|'' &&
+    ''rules|scroll|scrollamount|scrolldelay|scrolling|selected|shape|size|span|src|start|style|'' &&
+    ''tabindex|target|text|title|topmargin|truespeed|type|url|urn|usemap|valign|value|vlink|volume|'' &&
+    ''vrml|vspace|width|wrap|apply-templates|attribute|choose|comment|define-template-set|'' &&
+    ''entity-ref|eval|expr|for-each|if|match|no-entities|node-name|order-by|otherwise|select|'' &&
+    ''stylesheet|template|test|value-of|version|when|xmlns|xsl|cellpadding|cellspacing|table|td|'' &&
+    ''tfoot|th|thead|tr''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-html ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_keywords.
+ 
+    DATA: lt_keywords TYPE STANDARD TABLE OF string,
+          ls_keyword  TYPE ty_keyword.
+ 
+    FIELD-SYMBOLS: <lv_keyword> TYPE any.
+ 
+    SPLIT iv_keywords AT ''|'' INTO TABLE lt_keywords.
+ 
+    LOOP AT lt_keywords ASSIGNING <lv_keyword>.
+      CLEAR ls_keyword.
+      ls_keyword-keyword = <lv_keyword>.
+      ls_keyword-token = iv_token.
+      INSERT ls_keyword INTO TABLE gt_keywords.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_keyword.
+ 
+    DATA lv_str TYPE string.
+ 
+    lv_str = to_lower( iv_chunk ).
+    READ TABLE gt_keywords WITH TABLE KEY keyword = lv_str TRANSPORTING NO FIELDS.
+    rv_yes = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+ 
+    DATA:
+      lv_match      TYPE string,
+      lv_line_len   TYPE i,
+      lv_cmmt_end   TYPE i,
+      lv_prev_end   TYPE i,
+      lv_prev_token TYPE c.
+ 
+    FIELD-SYMBOLS:
+      <ls_prev>    TYPE ty_match,
+      <ls_match>   TYPE ty_match,
+      <ls_keyword> TYPE ty_keyword.
+ 
+    " Longest matches
+    SORT ct_matches BY offset length DESCENDING.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    " Check if this is part of multi-line comment and mark it accordingly
+    IF gv_comment = abap_true.
+      READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        CLEAR ct_matches.
+        APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
+        <ls_match>-token = c_token-comment.
+        <ls_match>-offset = 0.
+        <ls_match>-length = lv_line_len.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      " Delete matches after open text match
+      IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
+        CLEAR <ls_match>-token.
+        CONTINUE.
+      ENDIF.
+ 
+      lv_match = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+ 
+      CASE <ls_match>-token.
+        WHEN c_token-keyword.
+          " Skip keyword that''s part of previous (longer) keyword
+          IF <ls_match>-offset < lv_prev_end.
+            CLEAR <ls_match>-token.
+            CONTINUE.
+          ENDIF.
+ 
+          " Map generic keyword to specific CSS token
+          lv_match = to_lower( lv_match ).
+          READ TABLE gt_keywords ASSIGNING <ls_keyword> WITH TABLE KEY keyword = lv_match.
+          IF sy-subrc = 0.
+            <ls_match>-token = <ls_keyword>-token.
+          ENDIF.
+ 
+        WHEN c_token-comment.
+          IF lv_match = ''/*''.
+            DELETE ct_matches WHERE offset > <ls_match>-offset.
+            <ls_match>-length = lv_line_len - <ls_match>-offset.
+            gv_comment = abap_true.
+          ELSEIF lv_match = ''*/''.
+            DELETE ct_matches WHERE offset < <ls_match>-offset.
+            <ls_match>-length = <ls_match>-offset + 2.
+            <ls_match>-offset = 0.
+            gv_comment = abap_false.
+          ELSE.
+            lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
+            DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
+          ENDIF.
+ 
+        WHEN c_token-text.
+          <ls_match>-text_tag = lv_match.
+          IF lv_prev_token = c_token-text.
+            IF <ls_match>-text_tag = <ls_prev>-text_tag.
+              <ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
+              CLEAR lv_prev_token.
+            ENDIF.
+            CLEAR <ls_match>-token.
+            CONTINUE.
+          ENDIF.
+ 
+      ENDCASE.
+ 
+      lv_prev_token = <ls_match>-token.
+      lv_prev_end   = <ls_match>-offset + <ls_match>-length.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+ 
+    DELETE ct_matches WHERE token IS INITIAL.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line. "REDEFINITION
+ 
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
+ 
+    rt_matches = super->parse_line( iv_line ).
+ 
+    " Remove non-keywords
+    LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
+      lv_index = sy-tabix.
+      IF abap_false = is_keyword( substring( val = iv_line
+                                             off = <ls_match>-offset
+                                             len = <ls_match>-length ) ).
+        CLEAR <ls_match>-token.
+      ENDIF.
+    ENDLOOP.
+ 
+    DELETE rt_matches WHERE token IS INITIAL.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SYNTAX_FACTORY              ', 'CLASS zcl_abapgit_syntax_factory DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_filename       TYPE string
+        !iv_hidden_chars   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_syntax_highlighter .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_factory IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+ 
+    " Create instance of highighter dynamically dependent on syntax type
+    IF iv_filename CP ''*.abap''.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_abap.
+    ELSEIF iv_filename CP ''*.xml'' OR iv_filename CP ''*.html''.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_xml.
+    ELSEIF iv_filename CP ''*.css''.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_css.
+    ELSEIF iv_filename CP ''*.js''.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_js.
+    ELSEIF iv_filename CP ''*.json'' OR iv_filename CP ''*.jsonc''.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_json.
+    ELSEIF iv_filename CP ''*.txt'' OR iv_filename CP ''*.ini''  OR iv_filename CP ''*.text''.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_txt.
+    ELSE.
+      CLEAR ro_instance.
+    ENDIF.
+ 
+    IF ro_instance IS BOUND.
+      ro_instance->set_hidden_chars( iv_hidden_chars ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SYNTAX_HIGHLIGHTER          ', 'CLASS zcl_abapgit_syntax_highlighter DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS process_line
+      IMPORTING
+        !iv_line       TYPE string
+      RETURNING
+        VALUE(rv_line) TYPE string .
+    METHODS set_hidden_chars
+      IMPORTING
+        !iv_hidden_chars TYPE abap_bool .
+  PROTECTED SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_match,
+        token    TYPE c LENGTH 1,  " Type of matches
+        offset   TYPE i,      " Beginning position of the string that should be formatted
+        length   TYPE i,      " Length of the string that should be formatted
+        text_tag TYPE string, " Type of text tag
+      END OF ty_match .
+    TYPES:
+      ty_match_tt  TYPE STANDARD TABLE OF ty_match WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_rule,
+        regex             TYPE REF TO cl_abap_regex,
+        token             TYPE c LENGTH 1,
+        style             TYPE string,
+        relevant_submatch TYPE i,
+      END OF ty_rule .
+ 
+    CONSTANTS c_token_none TYPE c VALUE ''.'' ##NO_TEXT.
+    DATA:
+      mt_rules TYPE STANDARD TABLE OF ty_rule .
+    DATA mv_hidden_chars TYPE abap_bool .
+ 
+    METHODS add_rule
+      IMPORTING
+        !iv_regex    TYPE string
+        !iv_token    TYPE c
+        !iv_style    TYPE string
+        !iv_submatch TYPE i OPTIONAL .
+    METHODS parse_line
+      IMPORTING
+        !iv_line          TYPE string
+      RETURNING
+        VALUE(rt_matches) TYPE ty_match_tt .
+    METHODS order_matches
+      IMPORTING
+        !iv_line    TYPE string
+      CHANGING
+        !ct_matches TYPE ty_match_tt .
+    METHODS extend_matches
+      IMPORTING
+        !iv_line    TYPE string
+      CHANGING
+        !ct_matches TYPE ty_match_tt .
+    METHODS format_line
+      IMPORTING
+        !iv_line       TYPE string
+        !it_matches    TYPE ty_match_tt
+      RETURNING
+        VALUE(rv_line) TYPE string .
+    METHODS apply_style
+      IMPORTING
+        !iv_line       TYPE string
+        !iv_class      TYPE string
+      RETURNING
+        VALUE(rv_line) TYPE string .
+    METHODS is_whitespace
+      IMPORTING
+        !iv_string       TYPE string
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool .
+    METHODS show_hidden_chars
+      IMPORTING
+        !iv_line       TYPE string
+      RETURNING
+        VALUE(rv_line) TYPE string .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_highlighter IMPLEMENTATION.
+ 
+ 
+  METHOD add_rule.
+ 
+    DATA ls_rule LIKE LINE OF mt_rules.
+ 
+    IF NOT iv_regex IS INITIAL.
+      CREATE OBJECT ls_rule-regex
+        EXPORTING
+          pattern     = iv_regex
+          ignore_case = abap_true.
+    ENDIF.
+ 
+    ls_rule-token         = iv_token.
+    ls_rule-style         = iv_style.
+    ls_rule-relevant_submatch = iv_submatch.
+    APPEND ls_rule TO mt_rules.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_style.
+ 
+    DATA lv_escaped TYPE string.
+ 
+    lv_escaped = escape( val    = iv_line
+                         format = cl_abap_format=>e_html_text ).
+ 
+    lv_escaped = show_hidden_chars( lv_escaped ).
+ 
+    IF iv_class IS NOT INITIAL.
+      rv_line = |<span class="{ iv_class }">{ lv_escaped }</span>|.
+    ELSE.
+      rv_line = lv_escaped.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD extend_matches.
+ 
+    DATA: lv_line_len TYPE i,
+          lv_last_pos TYPE i VALUE 0,
+          lv_length   TYPE i,
+          ls_match    TYPE ty_match.
+ 
+    FIELD-SYMBOLS <ls_match> TYPE ty_match.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    SORT ct_matches BY offset.
+ 
+    " Add entries refering to parts of text that should not be formatted
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      IF <ls_match>-offset > lv_last_pos.
+        lv_length = <ls_match>-offset - lv_last_pos.
+        ls_match-token  = c_token_none.
+        ls_match-offset = lv_last_pos.
+        ls_match-length = lv_length.
+        INSERT ls_match INTO ct_matches INDEX sy-tabix.
+      ENDIF.
+      lv_last_pos = <ls_match>-offset + <ls_match>-length.
+    ENDLOOP.
+ 
+    " Add remainder of the string
+    IF lv_line_len > lv_last_pos.
+      lv_length = lv_line_len - lv_last_pos.
+      ls_match-token  = c_token_none.
+      ls_match-offset = lv_last_pos.
+      ls_match-length = lv_length.
+      APPEND ls_match TO ct_matches.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_line.
+ 
+    DATA:
+      lv_chunk TYPE string,
+      ls_rule  LIKE LINE OF mt_rules.
+ 
+    FIELD-SYMBOLS <ls_match> TYPE ty_match.
+ 
+    LOOP AT it_matches ASSIGNING <ls_match>.
+      lv_chunk = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+ 
+      CLEAR ls_rule. " Failed read equals no style
+      READ TABLE mt_rules INTO ls_rule WITH KEY token = <ls_match>-token.
+ 
+      lv_chunk = apply_style( iv_line  = lv_chunk
+                              iv_class = ls_rule-style ).
+ 
+      rv_line = rv_line && lv_chunk.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_whitespace.
+ 
+    DATA: lv_whitespace TYPE string.
+ 
+    "/^\\s+$/
+    lv_whitespace = \` \` && cl_abap_char_utilities=>horizontal_tab && cl_abap_char_utilities=>cr_lf.
+ 
+    rv_result = boolc( iv_string CO lv_whitespace ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line.
+ 
+    DATA:
+      lo_regex   TYPE REF TO cl_abap_regex,
+      lo_matcher TYPE REF TO cl_abap_matcher,
+      lt_result  TYPE match_result_tab,
+      ls_match   TYPE ty_match.
+ 
+    FIELD-SYMBOLS:
+      <ls_regex>    LIKE LINE OF mt_rules,
+      <ls_result>   TYPE match_result,
+      <ls_submatch> LIKE LINE OF <ls_result>-submatches.
+ 
+ 
+    " Process syntax-dependent regex table and find all matches
+    LOOP AT mt_rules ASSIGNING <ls_regex> WHERE regex IS BOUND.
+      lo_regex   = <ls_regex>-regex.
+      lo_matcher = lo_regex->create_matcher( text = iv_line ).
+      lt_result  = lo_matcher->find_all( ).
+ 
+      " Save matches into custom table with predefined tokens
+      LOOP AT lt_result ASSIGNING <ls_result>.
+        CLEAR: ls_match.
+        IF <ls_regex>-relevant_submatch = 0.
+          ls_match-token  = <ls_regex>-token.
+          ls_match-offset = <ls_result>-offset.
+          ls_match-length = <ls_result>-length.
+          APPEND ls_match TO rt_matches.
+        ELSE.
+          READ TABLE <ls_result>-submatches ASSIGNING <ls_submatch> INDEX <ls_regex>-relevant_submatch.
+          "submatch might be empty if only discarted parts matched
+          IF sy-subrc = 0 AND <ls_submatch>-offset >= 0 AND <ls_submatch>-length > 0.
+            ls_match-token  = <ls_regex>-token.
+            ls_match-offset = <ls_submatch>-offset.
+            ls_match-length = <ls_submatch>-length.
+            APPEND ls_match TO rt_matches.
+          ENDIF.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD process_line.
+ 
+    DATA: lt_matches TYPE ty_match_tt.
+ 
+    IF iv_line IS INITIAL OR is_whitespace( iv_line ) = abap_true.
+      rv_line = show_hidden_chars( iv_line ).
+      RETURN.
+    ENDIF.
+ 
+    lt_matches = parse_line( iv_line ).
+ 
+    order_matches( EXPORTING iv_line    = iv_line
+                   CHANGING  ct_matches = lt_matches ).
+ 
+    extend_matches( EXPORTING iv_line    = iv_line
+                    CHANGING  ct_matches = lt_matches ).
+ 
+    rv_line = format_line( iv_line    = iv_line
+                           it_matches = lt_matches ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_hidden_chars.
+    mv_hidden_chars = iv_hidden_chars.
+  ENDMETHOD.
+ 
+ 
+  METHOD show_hidden_chars.
+ 
+    DATA lv_bom TYPE x LENGTH 3.
+ 
+    rv_line = iv_line.
+ 
+    IF mv_hidden_chars = abap_true.
+      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN rv_line WITH ''&nbsp;&rarr;&nbsp;''.
+      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf(1)       IN rv_line WITH ''&para;''.
+      REPLACE ALL OCCURRENCES OF \` \`                                    IN rv_line WITH ''&middot;''.
+      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>form_feed IN rv_line
+        WITH ''<span class="red">&odash;</span>''.
+ 
+      IF strlen( rv_line ) BETWEEN 1 AND 2.
+        TRY.
+            lv_bom = zcl_abapgit_convert=>string_to_xstring( rv_line ).
+          CATCH zcx_abapgit_exception ##NO_HANDLER.
+        ENDTRY.
+        IF lv_bom(2) = cl_abap_char_utilities=>byte_order_mark_big.
+          rv_line = ''<span class="red">&squf;</span>''. " UTF-16 big-endian (FE FF)
+        ENDIF.
+        IF lv_bom(2) = cl_abap_char_utilities=>byte_order_mark_little.
+          rv_line = ''<span class="red">&compfn;</span>''. " UTF-16 little-endian (FF FE)
+        ENDIF.
+        IF lv_bom(3) = cl_abap_char_utilities=>byte_order_mark_utf8.
+          rv_line = ''<span class="red">&curren;</span>''. " UTF-8 (EF BB BF)
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SYNTAX_JS                   ', 'CLASS zcl_abapgit_syntax_js DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      " JavaScript
+      " 1) General keywords
+      " 2) Variable types
+      " 3) HTML Tags
+      BEGIN OF c_css,
+        keyword   TYPE string VALUE ''keyword'',
+        text      TYPE string VALUE ''text'',
+        comment   TYPE string VALUE ''comment'',
+        variables TYPE string VALUE ''variables'',
+      END OF c_css .
+    CONSTANTS:
+      BEGIN OF c_token,
+        keyword   TYPE c VALUE ''K'',
+        text      TYPE c VALUE ''T'',
+        comment   TYPE c VALUE ''C'',
+        variables TYPE c VALUE ''V'',
+      END OF c_token .
+    CONSTANTS:
+      BEGIN OF c_regex,
+        " comments /* ... */ or //
+        comment TYPE string VALUE ''\\/\\*.*\\*\\/|\\/\\*|\\*\\/|\\/\\/'',
+        " single or double quoted strings
+        text    TYPE string VALUE ''"|''''|\`'',
+        " in general keywords don''t contain numbers (except -ms-scrollbar-3dlight-color)
+        keyword TYPE string VALUE ''\\b[a-z-]+\\b'',
+      END OF c_regex .
+ 
+    CLASS-METHODS class_constructor .
+    METHODS constructor .
+  PROTECTED SECTION.
+    TYPES: ty_token TYPE c LENGTH 1.
+ 
+    TYPES: BEGIN OF ty_keyword,
+             keyword TYPE string,
+             token   TYPE ty_token,
+           END OF ty_keyword.
+ 
+    CLASS-DATA gt_keywords TYPE HASHED TABLE OF ty_keyword WITH UNIQUE KEY keyword.
+    CLASS-DATA gv_comment TYPE abap_bool.
+ 
+    CLASS-METHODS init_keywords.
+    CLASS-METHODS insert_keywords
+      IMPORTING
+        iv_keywords TYPE string
+        iv_token    TYPE ty_token.
+    CLASS-METHODS is_keyword
+      IMPORTING iv_chunk      TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    METHODS order_matches REDEFINITION.
+    METHODS parse_line REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_js IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+ 
+    init_keywords( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Reset indicator for multi-line comments
+    CLEAR gv_comment.
+ 
+    " Initialize instances of regular expression
+    add_rule( iv_regex = c_regex-keyword
+              iv_token = c_token-keyword
+              iv_style = c_css-keyword ).
+ 
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+    add_rule( iv_regex = c_regex-text
+              iv_token = c_token-text
+              iv_style = c_css-text ).
+ 
+    " Styles for keywords
+    add_rule( iv_regex = ''''
+              iv_token = c_token-variables
+              iv_style = c_css-variables ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init_keywords.
+ 
+    DATA: lv_keywords TYPE string.
+ 
+    CLEAR gt_keywords.
+ 
+    " 1) General keywords
+    lv_keywords =
+    ''alert|all|body|break|bytetostring|case|continue|default|delete|do|document|else|event|export|for|function|if|'' &&
+    ''import|in|innerhtml|isnan|item|mimetypes|navigator|new|onabort|onblur|onchange|onclick|ondblclick|ondragdrop|'' &&
+    ''onerror|onfocus|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|'' &&
+    ''onmove|onreset|onselect|onsubmit|onunload|onresize|options|parsefloat|parseint|prototype|return|screen|switch|'' &&
+    ''unit|var|void|while|window|with|anchor|applet|area|button|checkbox|fileupload|form|frame|hidden|link|mimetype|'' &&
+    ''password|plugin|radio|reset|select|submit|text|textarea|abs|acos|alert|anchor|asin|atan|atan2|back|big|blink|'' &&
+    ''blur|bold|captureevents|ceil|charat|charcodeat|clearinterval|cleartimeout|click|close|concat|confirm|cos|'' &&
+    ''disableexternalcapture|enableexternalcapture|eval|exp|find|fixed|floor|focus|fontcolor|fontsize|forward|'' &&
+    ''fromcharcode|getdate|getday|getelementbyid|gethours|getminutes|getmonth|getoptionvalue|getoptionvaluecount|'' &&
+    ''getseconds|getselection|gettime|gettimezoneoffset|getyear|go|handleevent|home|indexof|italics|javaenabled|join|'' &&
+    ''lastindexof|link|load|log|match|max|min|moveabove|movebelow|moveby|moveto|movetoabsolute|open|parse|plugins|'' &&
+    ''pop|pow|preference|print|prompt|push|random|refresh|releaseevents|reload|replace|reset|resizeby|resizeto|'' &&
+    ''reverse|round|routeevent|scroll|scrollby|scrollto|search|select|setdate|sethours|setinterval|setminutes|'' &&
+    ''setmonth|setseconds|settime|settimeout|setyear|shift|sin|slice|small|sort|splice|split|sqrt|stop|strike|sub|'' &&
+    ''submit|substr|substring|sup|taintenabled|tan|togmtstring|tolocalestring|tolowercase|tostring|touppercase|'' &&
+    ''unshift|unwatch|utc|valueof|watch|write|writeln|e|ln10|ln2|log10e|log2e|max_value|min_value|negative_infinity|'' &&
+    ''nan|pi|positive_infinity|url|above|action|alinkcolor|anchors|appcodename|appname|appversion|applets|arguments|'' &&
+    ''arity|availheight|availwidth|background|backgroundcolor|below|bgcolor|border|bottom|caller|cancelbubble|'' &&
+    ''checked|clientheight|clientwidth|clientx|clienty|clip|closed|color|colordepth|complete|constructor|cookie|'' &&
+    ''count|current|defaultchecked|defaultselected|defaultstatus|defaultvalue|description|display|document|domain|'' &&
+    ''elements|embeds|enabledplugin|encoding|false|fgcolor|filename|form|formname|forms|frames|hash|height|history|'' &&
+    ''host|hostname|href|hspace|images|innerheight|innerwidth|language|lastmodified|layers|left|length|linkcolor|'' &&
+    ''links|location|locationbar|lowsrc|menubar|method|mimetypes|name|next|null|offsetheight|offsetleft|offsetparent|'' &&
+    ''offsetwidth|opener|outerheight|outerwidth|pagex|pagexoffset|pagey|pageyoffset|parent|parentlayer|pathname|'' &&
+    ''personalbar|pixeldepth|platform|plugins|port|poswidth|previous|protocol|prototype|referrer|right|scrolltop|'' &&
+    ''scrollbars|search|selected|selectedindex|self|siblingabove|siblingbelow|src|srcelement|status|statusbar|style|'' &&
+    ''suffixes|tags|target|text|this|title|toolbar|top|true|type|useragent|value|visibility|vlinkcolor|vspace|width|'' &&
+    ''window|zindex''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-keyword ).
+ 
+    " 2) Variable types
+    lv_keywords =
+    ''array|boolean|date|function|image|layer|math|number|object|option|regexp|string''.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-variables ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_keywords.
+ 
+    DATA: lt_keywords TYPE STANDARD TABLE OF string,
+          ls_keyword  TYPE ty_keyword.
+ 
+    FIELD-SYMBOLS: <lv_keyword> TYPE any.
+ 
+    SPLIT iv_keywords AT ''|'' INTO TABLE lt_keywords.
+ 
+    LOOP AT lt_keywords ASSIGNING <lv_keyword>.
+      CLEAR ls_keyword.
+      ls_keyword-keyword = <lv_keyword>.
+      ls_keyword-token = iv_token.
+      INSERT ls_keyword INTO TABLE gt_keywords.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_keyword.
+ 
+    DATA lv_str TYPE string.
+ 
+    lv_str = to_lower( iv_chunk ).
+    READ TABLE gt_keywords WITH TABLE KEY keyword = lv_str TRANSPORTING NO FIELDS.
+    rv_yes = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+ 
+    DATA:
+      lv_match      TYPE string,
+      lv_line_len   TYPE i,
+      lv_cmmt_end   TYPE i,
+      lv_prev_end   TYPE i,
+      lv_prev_token TYPE c.
+ 
+    FIELD-SYMBOLS:
+      <ls_prev>    TYPE ty_match,
+      <ls_match>   TYPE ty_match,
+      <ls_keyword> TYPE ty_keyword.
+ 
+    " Longest matches
+    SORT ct_matches BY offset length DESCENDING.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    " Check if this is part of multi-line comment and mark it accordingly
+    IF gv_comment = abap_true.
+      READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        CLEAR ct_matches.
+        APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
+        <ls_match>-token = c_token-comment.
+        <ls_match>-offset = 0.
+        <ls_match>-length = lv_line_len.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      " Delete matches after open text match
+      IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
+        CLEAR <ls_match>-token.
+        CONTINUE.
+      ENDIF.
+ 
+      lv_match = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+ 
+      CASE <ls_match>-token.
+        WHEN c_token-keyword.
+          " Skip keyword that''s part of previous (longer) keyword
+          IF <ls_match>-offset < lv_prev_end.
+            CLEAR <ls_match>-token.
+            CONTINUE.
+          ENDIF.
+ 
+          " Map generic keyword to specific token
+          lv_match = to_lower( lv_match ).
+          READ TABLE gt_keywords ASSIGNING <ls_keyword> WITH TABLE KEY keyword = lv_match.
+          IF sy-subrc = 0.
+            <ls_match>-token = <ls_keyword>-token.
+          ENDIF.
+ 
+        WHEN c_token-comment.
+          IF lv_match = ''/*''.
+            DELETE ct_matches WHERE offset > <ls_match>-offset.
+            <ls_match>-length = lv_line_len - <ls_match>-offset.
+            gv_comment = abap_true.
+          ELSEIF lv_match = ''//''.
+            DELETE ct_matches WHERE offset > <ls_match>-offset.
+            <ls_match>-length = lv_line_len - <ls_match>-offset.
+          ELSEIF lv_match = ''*/''.
+            DELETE ct_matches WHERE offset < <ls_match>-offset.
+            <ls_match>-length = <ls_match>-offset + 2.
+            <ls_match>-offset = 0.
+            gv_comment = abap_false.
+          ELSE.
+            lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
+            DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
+          ENDIF.
+ 
+        WHEN c_token-text.
+          <ls_match>-text_tag = lv_match.
+          IF lv_prev_token = c_token-text.
+            IF <ls_match>-text_tag = <ls_prev>-text_tag.
+              <ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
+              CLEAR lv_prev_token.
+            ENDIF.
+            CLEAR <ls_match>-token.
+            CONTINUE.
+          ENDIF.
+ 
+      ENDCASE.
+ 
+      lv_prev_token = <ls_match>-token.
+      lv_prev_end   = <ls_match>-offset + <ls_match>-length.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+ 
+    DELETE ct_matches WHERE token IS INITIAL.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line. "REDEFINITION
+ 
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
+ 
+    rt_matches = super->parse_line( iv_line ).
+ 
+    " Remove non-keywords
+    LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
+      lv_index = sy-tabix.
+      IF abap_false = is_keyword( substring( val = iv_line
+                                             off = <ls_match>-offset
+                                             len = <ls_match>-length ) ).
+        CLEAR <ls_match>-token.
+      ENDIF.
+    ENDLOOP.
+ 
+    DELETE rt_matches WHERE token IS INITIAL.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SYNTAX_JSON                 ', 'CLASS zcl_abapgit_syntax_json DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      " JSON... This was easy :-)
+      " JSONC... With comments
+      BEGIN OF c_css,
+        keyword TYPE string VALUE ''selectors'',              "#EC NOTEXT
+        text    TYPE string VALUE ''text'',                   "#EC NOTEXT
+        values  TYPE string VALUE ''properties'',             "#EC NOTEXT
+        comment TYPE string VALUE ''comment'',                "#EC NOTEXT
+      END OF c_css.
+    CONSTANTS:
+      BEGIN OF c_token,
+        keyword TYPE c VALUE ''K'',                           "#EC NOTEXT
+        text    TYPE c VALUE ''T'',                           "#EC NOTEXT
+        values  TYPE c VALUE ''V'',                           "#EC NOTEXT
+        comment TYPE c VALUE ''C'',                           "#EC NOTEXT
+      END OF c_token.
+    CONSTANTS:
+      BEGIN OF c_regex,
+        " comments /* ... */ or //
+        comment TYPE string VALUE ''\\/\\*.*\\*\\/|\\/\\*|\\*\\/|\\/\\/'', "#EC NOTEXT
+        " not much here
+        keyword TYPE string VALUE ''true|false|null'',        "#EC NOTEXT
+        " double quoted strings
+        text    TYPE string VALUE ''"'',                      "#EC NOTEXT
+      END OF c_regex.
+ 
+    METHODS constructor.
+  PROTECTED SECTION.
+ 
+    METHODS order_matches REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_json IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Initialize instances of regular expression
+ 
+    add_rule( iv_regex = c_regex-keyword
+              iv_token = c_token-keyword
+              iv_style = c_css-keyword ).
+ 
+    " Style for keys
+    add_rule( iv_regex = c_regex-text
+              iv_token = c_token-text
+              iv_style = c_css-text ).
+ 
+    " Style for values
+    add_rule( iv_regex = ''''
+              iv_token = c_token-values
+              iv_style = c_css-values ).
+ 
+    " JSONC comments
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+ 
+    DATA:
+      lv_match      TYPE string,
+      lv_count      TYPE i,
+      lv_line_len   TYPE i,
+      lv_prev_token TYPE c.
+ 
+    FIELD-SYMBOLS:
+      <ls_prev>  TYPE ty_match,
+      <ls_match> TYPE ty_match.
+ 
+    " Longest matches
+    SORT ct_matches BY offset length DESCENDING.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      " Delete matches after open text match
+      IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
+        CLEAR <ls_match>-token.
+        CONTINUE.
+      ENDIF.
+ 
+      lv_match = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+ 
+      IF <ls_match>-token = c_token-text.
+        <ls_match>-text_tag = lv_match.
+        IF lv_prev_token = c_token-text.
+          IF <ls_match>-text_tag = <ls_prev>-text_tag.
+            <ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
+            CLEAR lv_prev_token.
+          ENDIF.
+          CLEAR <ls_match>-token.
+          CONTINUE.
+        ENDIF.
+      ENDIF.
+ 
+      lv_prev_token = <ls_match>-token.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+ 
+    DELETE ct_matches WHERE token IS INITIAL.
+ 
+    " Switch style of second text match to values
+    LOOP AT ct_matches ASSIGNING <ls_match> WHERE token = c_token-text.
+      lv_count = lv_count + 1.
+      IF lv_count >= 2.
+        <ls_match>-token = c_token-values.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SYNTAX_TXT                  ', 'CLASS zcl_abapgit_syntax_txt DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor .
+ 
+    METHODS process_line
+        REDEFINITION .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_txt IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " No rules for plain text files
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD process_line.
+ 
+    rv_line = apply_style(
+      iv_line  = iv_line
+      iv_class = '''' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SYNTAX_XML                  ', 'CLASS zcl_abapgit_syntax_xml DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_css,
+        xml_tag  TYPE string VALUE ''xml_tag'',
+        attr     TYPE string VALUE ''attr'',
+        attr_val TYPE string VALUE ''attr_val'',
+        comment  TYPE string VALUE ''comment'',
+      END OF c_css .
+    CONSTANTS:
+      BEGIN OF c_token,
+        xml_tag  TYPE c VALUE ''X'',
+        attr     TYPE c VALUE ''A'',
+        attr_val TYPE c VALUE ''V'',
+        comment  TYPE c VALUE ''C'',
+      END OF c_token .
+    CONSTANTS:
+      BEGIN OF c_regex,
+        "for XML tags, we will use a submatch
+        " main pattern includes quoted strings so we can ignore < and > in attr values
+        xml_tag  TYPE string VALUE ''(?:"[^"]*")|(?:''''[^'''']*'''')|(?:\`[^\`]*\`)|([<>])'',
+        attr     TYPE string VALUE ''(?:^|\\s)[-a-z:_0-9]+\\s*(?==\\s*["|''''|\`])'',
+        attr_val TYPE string VALUE ''("[^"]*")|(''''[^'''']*'''')|(\`[^\`]*\`)'',
+        " comments <!-- ... -->
+        comment  TYPE string VALUE ''[\\<]!--.*--[\\>]|[\\<]!--|--[\\>]'',
+      END OF c_regex .
+ 
+    METHODS constructor .
+  PROTECTED SECTION.
+    CLASS-DATA gv_comment TYPE abap_bool.
+ 
+    METHODS order_matches REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_xml IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Reset indicator for multi-line comments
+    CLEAR gv_comment.
+ 
+    " Initialize instances of regular expressions
+    add_rule( iv_regex    = c_regex-xml_tag
+              iv_token    = c_token-xml_tag
+              iv_style    = c_css-xml_tag
+              iv_submatch = 1 ).
+ 
+    add_rule( iv_regex = c_regex-attr
+              iv_token = c_token-attr
+              iv_style = c_css-attr ).
+ 
+    add_rule( iv_regex = c_regex-attr_val
+              iv_token = c_token-attr_val
+              iv_style = c_css-attr_val ).
+ 
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+ 
+    DATA:
+      lv_match      TYPE string,
+      lv_line_len   TYPE i,
+      lv_cmmt_end   TYPE i,
+      lv_index      TYPE sy-tabix,
+      lv_prev_token TYPE c,
+      lv_state      TYPE c VALUE ''O''. " O - for open tag; C - for closed tag;
+ 
+    FIELD-SYMBOLS:
+      <ls_prev>  TYPE ty_match,
+      <ls_match> TYPE ty_match.
+ 
+    SORT ct_matches BY offset.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    " Check if this is part of multi-line comment and mark it accordingly
+    IF gv_comment = abap_true.
+      READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        CLEAR ct_matches.
+        APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
+        <ls_match>-token = c_token-comment.
+        <ls_match>-offset = 0.
+        <ls_match>-length = lv_line_len.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      lv_index = sy-tabix.
+ 
+      lv_match = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+ 
+      CASE <ls_match>-token.
+        WHEN c_token-xml_tag.
+          <ls_match>-text_tag = lv_match.
+ 
+          " No other matches between two tags
+          IF <ls_match>-text_tag = ''>'' AND lv_prev_token = c_token-xml_tag.
+            lv_state = ''C''.
+            <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset + <ls_match>-length.
+            DELETE ct_matches INDEX lv_index.
+            CONTINUE.
+ 
+            " Adjust length and offset of closing tag
+          ELSEIF <ls_match>-text_tag = ''>'' AND lv_prev_token <> c_token-xml_tag.
+            lv_state = ''C''.
+            IF <ls_prev> IS ASSIGNED.
+              <ls_match>-length = <ls_match>-offset - <ls_prev>-offset - <ls_prev>-length + <ls_match>-length.
+              <ls_match>-offset = <ls_prev>-offset + <ls_prev>-length.
+            ENDIF.
+          ELSE.
+            lv_state = ''O''.
+          ENDIF.
+ 
+        WHEN c_token-comment.
+          IF lv_match = ''<!--''.
+            DELETE ct_matches WHERE offset > <ls_match>-offset.
+            DELETE ct_matches WHERE offset = <ls_match>-offset AND token = c_token-xml_tag.
+            <ls_match>-length = lv_line_len - <ls_match>-offset.
+            gv_comment = abap_true.
+          ELSEIF lv_match = ''-->''.
+            DELETE ct_matches WHERE offset < <ls_match>-offset.
+            <ls_match>-length = <ls_match>-offset + 3.
+            <ls_match>-offset = 0.
+            gv_comment = abap_false.
+          ELSE.
+            lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
+            DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
+            DELETE ct_matches WHERE offset = <ls_match>-offset AND token = c_token-xml_tag.
+          ENDIF.
+ 
+        WHEN OTHERS.
+          IF lv_prev_token = c_token-xml_tag.
+            <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset. " Extend length of the opening tag
+          ENDIF.
+ 
+          IF lv_state = ''C''.  " Delete all matches between tags
+            DELETE ct_matches INDEX lv_index.
+            CONTINUE.
+          ENDIF.
+ 
+      ENDCASE.
+ 
+      lv_prev_token = <ls_match>-token.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+ 
+    "if the last XML tag is not closed, extend it to the end of the tag
+    IF lv_prev_token = c_token-xml_tag
+        AND <ls_prev> IS ASSIGNED
+        AND <ls_prev>-length  = 1
+        AND <ls_prev>-text_tag = ''<''.
+ 
+      FIND REGEX ''<\\s*[^\\s]*'' IN iv_line+<ls_prev>-offset MATCH LENGTH <ls_prev>-length.
+      IF sy-subrc <> 0.
+        <ls_prev>-length = 1.
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI                         ', 'CLASS zcl_abapgit_gui DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_services .
+ 
+    CONSTANTS:
+      BEGIN OF c_event_state,
+        not_handled         TYPE i VALUE 0,
+        re_render           TYPE i VALUE 1,
+        new_page            TYPE i VALUE 2,
+        go_back             TYPE i VALUE 3,
+        no_more_act         TYPE i VALUE 4,
+        new_page_w_bookmark TYPE i VALUE 5,
+        go_back_to_bookmark TYPE i VALUE 6,
+        new_page_replacing  TYPE i VALUE 7,
+      END OF c_event_state .
+    METHODS go_home
+      IMPORTING
+        iv_action TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS back
+      IMPORTING
+        !iv_to_bookmark TYPE abap_bool DEFAULT abap_false
+        !iv_graceful    TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_exit)  TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS back_graceful
+      RETURNING
+        VALUE(rv_handled) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS on_event
+      FOR EVENT sapevent OF zif_abapgit_html_viewer
+      IMPORTING
+        !action
+        !frame
+        !getdata
+        !postdata
+        !query_table .
+    METHODS constructor
+      IMPORTING
+        !io_component         TYPE REF TO object OPTIONAL
+        !ii_asset_man         TYPE REF TO zif_abapgit_gui_asset_manager OPTIONAL
+        !ii_hotkey_ctl        TYPE REF TO zif_abapgit_gui_hotkey_ctl OPTIONAL
+        !ii_html_processor    TYPE REF TO zif_abapgit_gui_html_processor OPTIONAL
+        !iv_rollback_on_error TYPE abap_bool DEFAULT abap_true
+      RAISING
+        zcx_abapgit_exception .
+    METHODS free .
+    METHODS set_focus
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_page_stack,
+        page     TYPE REF TO zif_abapgit_gui_renderable,
+        bookmark TYPE abap_bool,
+      END OF ty_page_stack .
+ 
+    DATA mv_rollback_on_error TYPE abap_bool .
+    DATA mi_cur_page TYPE REF TO zif_abapgit_gui_renderable .
+    DATA mt_stack             TYPE STANDARD TABLE OF ty_page_stack .
+    DATA mt_event_handlers    TYPE STANDARD TABLE OF REF TO zif_abapgit_gui_event_handler .
+    DATA mi_router TYPE REF TO zif_abapgit_gui_event_handler .
+    DATA mi_asset_man TYPE REF TO zif_abapgit_gui_asset_manager .
+    DATA mi_hotkey_ctl TYPE REF TO zif_abapgit_gui_hotkey_ctl .
+    DATA mi_html_processor TYPE REF TO zif_abapgit_gui_html_processor .
+    DATA mi_html_viewer TYPE REF TO zif_abapgit_html_viewer .
+    DATA mo_html_parts TYPE REF TO zcl_abapgit_html_parts .
+    DATA mi_common_log TYPE REF TO zif_abapgit_log .
+ 
+ 
+    METHODS cache_html
+      IMPORTING
+        !iv_text      TYPE string
+      RETURNING
+        VALUE(rv_url) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS startup
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render
+      RAISING
+        zcx_abapgit_exception .
+    METHODS call_page
+      IMPORTING
+        !ii_page          TYPE REF TO zif_abapgit_gui_renderable
+        !iv_with_bookmark TYPE abap_bool DEFAULT abap_false
+        !iv_replacing     TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+    METHODS handle_action
+      IMPORTING
+        !iv_action   TYPE c
+        !iv_getdata  TYPE c OPTIONAL
+        !it_postdata TYPE zif_abapgit_html_viewer=>ty_post_data OPTIONAL .
+    METHODS handle_error
+      IMPORTING
+        !ix_exception TYPE REF TO zcx_abapgit_exception .
+    METHODS is_page_modal
+      IMPORTING
+        !ii_page      TYPE REF TO zif_abapgit_gui_renderable
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI IMPLEMENTATION.
+ 
+ 
+  METHOD back.
+ 
+    DATA lv_index TYPE i.
+    DATA ls_stack LIKE LINE OF mt_stack.
+ 
+    " If viewer is showing Internet page, then use browser navigation
+    IF mi_html_viewer->get_url( ) CP ''http*''.
+      mi_html_viewer->back( ).
+      RETURN.
+    ENDIF.
+ 
+    lv_index = lines( mt_stack ).
+ 
+    IF lv_index = 0.
+      rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_graceful = abap_true AND back_graceful( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    DO lv_index TIMES.
+      READ TABLE mt_stack INDEX lv_index INTO ls_stack.
+      ASSERT sy-subrc = 0.
+ 
+      DELETE mt_stack INDEX lv_index.
+      ASSERT sy-subrc = 0.
+ 
+      lv_index = lv_index - 1.
+ 
+      IF iv_to_bookmark = abap_false OR ls_stack-bookmark = abap_true.
+        EXIT.
+      ENDIF.
+    ENDDO.
+ 
+    mi_cur_page = ls_stack-page. " last page always stays
+    render( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD back_graceful.
+ 
+    DATA li_handler TYPE REF TO zif_abapgit_gui_event_handler.
+    DATA ls_handled TYPE zif_abapgit_gui_event_handler=>ty_handling_result.
+ 
+    " This code can be potentially improved
+    " Why send go_back to the topmost handler only ? It makes sense to notify the whole stack
+    " But than how to handle re-render ? render if at least one handler asks for it ?
+    " Probably that''s the way but needs a relevant example. Postponed arch decision.
+    READ TABLE mt_event_handlers INTO li_handler INDEX 1.
+    IF sy-subrc = 0.
+      ls_handled = li_handler->on_event( zcl_abapgit_gui_event=>new(
+        iv_action       = zif_abapgit_definitions=>c_action-go_back
+        ii_gui_services = me ) ).
+      IF ls_handled-state = c_event_state-re_render. " soft exit, probably popup
+        render( ).
+        rv_handled = abap_true.
+      ELSEIF ls_handled-state = c_event_state-no_more_act. " soft exit, probably GUI popup
+        rv_handled = abap_true.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD cache_html.
+ 
+    rv_url = zif_abapgit_gui_services~cache_asset(
+      iv_text    = iv_text
+      iv_type    = ''text''
+      iv_subtype = ''html'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD call_page.
+ 
+    DATA: ls_stack TYPE ty_page_stack.
+ 
+    IF iv_replacing = abap_false AND NOT mi_cur_page IS INITIAL.
+      ls_stack-page     = mi_cur_page.
+      ls_stack-bookmark = iv_with_bookmark.
+      APPEND ls_stack TO mt_stack.
+    ENDIF.
+ 
+    mi_cur_page = ii_page.
+    render( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    IF io_component IS BOUND.
+      IF zcl_abapgit_gui_utils=>is_renderable( io_component ) = abap_true.
+        mi_cur_page ?= io_component. " direct page
+      ELSE.
+        IF zcl_abapgit_gui_utils=>is_event_handler( io_component ) = abap_false.
+          zcx_abapgit_exception=>raise( ''Component must be renderable or be an event handler'' ).
+        ENDIF.
+        mi_router ?= io_component.
+      ENDIF.
+    ENDIF.
+ 
+    CREATE OBJECT mo_html_parts.
+ 
+    mv_rollback_on_error = iv_rollback_on_error.
+    mi_asset_man      = ii_asset_man.
+    mi_hotkey_ctl     = ii_hotkey_ctl.
+    mi_html_processor = ii_html_processor. " Maybe improve to middlewares stack ??
+    startup( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD free.
+ 
+    SET HANDLER on_event FOR mi_html_viewer ACTIVATION space.
+    mi_html_viewer->close_document( ).
+    mi_html_viewer->free( ).
+    FREE mi_html_viewer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD go_home.
+ 
+    DATA: ls_stack LIKE LINE OF mt_stack,
+          lv_mode  TYPE tabname.
+ 
+    IF mi_router IS BOUND.
+      CLEAR: mt_stack, mt_event_handlers.
+      APPEND mi_router TO mt_event_handlers.
+ 
+      on_event( action = |{ iv_action }| ).
+    ELSE.
+      IF lines( mt_stack ) > 0.
+        READ TABLE mt_stack INTO ls_stack INDEX 1.
+        mi_cur_page = ls_stack-page.
+      ENDIF.
+      render( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_action.
+ 
+    DATA:
+      lx_exception TYPE REF TO zcx_abapgit_exception,
+      li_handler   TYPE REF TO zif_abapgit_gui_event_handler,
+      li_event     TYPE REF TO zif_abapgit_gui_event,
+      ls_handled   TYPE zif_abapgit_gui_event_handler=>ty_handling_result.
+ 
+    CREATE OBJECT li_event TYPE zcl_abapgit_gui_event
+      EXPORTING
+        ii_gui_services = me
+        iv_action       = iv_action
+        iv_getdata      = iv_getdata
+        it_postdata     = it_postdata.
+ 
+    TRY.
+        LOOP AT mt_event_handlers INTO li_handler.
+          ls_handled = li_handler->on_event( li_event ).
+          IF ls_handled-state IS NOT INITIAL AND ls_handled-state <> c_event_state-not_handled. " is handled
+            EXIT.
+          ENDIF.
+        ENDLOOP.
+ 
+        IF is_page_modal( mi_cur_page ) = abap_true AND NOT (
+          ls_handled-state = c_event_state-re_render OR
+          ls_handled-state = c_event_state-go_back OR
+          ls_handled-state = c_event_state-no_more_act ).
+          " Restrict new page switching from modals
+          ls_handled-state = c_event_state-no_more_act.
+        ENDIF.
+ 
+        CASE ls_handled-state.
+          WHEN c_event_state-re_render.
+            render( ).
+          WHEN c_event_state-new_page.
+            call_page( ls_handled-page ).
+          WHEN c_event_state-new_page_w_bookmark.
+            call_page(
+              ii_page = ls_handled-page
+              iv_with_bookmark = abap_true ).
+          WHEN c_event_state-new_page_replacing.
+            call_page(
+              ii_page = ls_handled-page
+              iv_replacing = abap_true ).
+          WHEN c_event_state-go_back.
+            back( ).
+          WHEN c_event_state-go_back_to_bookmark.
+            back( iv_to_bookmark = abap_true ).
+          WHEN c_event_state-no_more_act.
+            " Do nothing, handling completed
+          WHEN OTHERS.
+            zcx_abapgit_exception=>raise( |Unknown action: { iv_action }| ).
+        ENDCASE.
+ 
+      CATCH zcx_abapgit_cancel ##NO_HANDLER.
+        " Do nothing = gc_event_state-no_more_act
+      CATCH zcx_abapgit_exception INTO lx_exception.
+        handle_error( lx_exception ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_error.
+ 
+    DATA: li_gui_error_handler TYPE REF TO zif_abapgit_gui_error_handler,
+          lx_exception         TYPE REF TO cx_root.
+ 
+    IF mv_rollback_on_error = abap_true.
+      ROLLBACK WORK.
+    ENDIF.
+ 
+    TRY.
+        li_gui_error_handler ?= mi_cur_page.
+ 
+        IF li_gui_error_handler IS BOUND AND li_gui_error_handler->handle_error( ix_exception ) = abap_true.
+          " We rerender the current page to display the error box
+          render( ).
+        ELSEIF ix_exception->mi_log IS BOUND.
+          mi_common_log = ix_exception->mi_log.
+          IF mi_common_log->get_log_level( ) >= zif_abapgit_log=>c_log_level-warning.
+            zcl_abapgit_log_viewer=>show_log( mi_common_log ).
+          ENDIF.
+        ELSE.
+          MESSAGE ix_exception TYPE ''S'' DISPLAY LIKE ''E''.
+        ENDIF.
+ 
+      CATCH zcx_abapgit_exception cx_sy_move_cast_error INTO lx_exception.
+        " In case of fire we just fallback to plain old message
+        MESSAGE lx_exception TYPE ''S'' DISPLAY LIKE ''E''.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_page_modal.
+ 
+    DATA li_modal TYPE REF TO zif_abapgit_gui_modal.
+ 
+    TRY.
+        IF ii_page IS BOUND.
+          li_modal ?= ii_page.
+          rv_yes = li_modal->is_modal( ).
+        ENDIF.
+      CATCH cx_sy_move_cast_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD on_event.
+ 
+    handle_action(
+      iv_action   = action
+      iv_getdata  = getdata
+      it_postdata = postdata ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render.
+ 
+    DATA: lv_url  TYPE string,
+          lv_html TYPE string,
+          li_html TYPE REF TO zif_abapgit_html.
+ 
+    IF mi_cur_page IS NOT BOUND.
+      zcx_abapgit_exception=>raise( ''GUI error: no current page'' ).
+    ENDIF.
+ 
+    CLEAR mt_event_handlers.
+    mo_html_parts->clear( ).
+ 
+    IF mi_router IS BOUND AND is_page_modal( mi_cur_page ) = abap_false.
+      " No global commands in modals
+      APPEND mi_router TO mt_event_handlers.
+    ENDIF.
+ 
+    IF mi_hotkey_ctl IS BOUND.
+      mi_hotkey_ctl->reset( ).
+    ENDIF.
+ 
+    li_html = mi_cur_page->render( ).
+    lv_html = li_html->render( iv_no_indent_jscss = abap_true ).
+ 
+    IF mi_html_processor IS BOUND.
+      lv_html = mi_html_processor->process(
+        iv_html         = lv_html
+        ii_gui_services = me ).
+    ENDIF.
+ 
+    lv_url = cache_html( lv_html ).
+    mi_html_viewer->show_url( lv_url ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_focus.
+    mi_html_viewer->set_focus( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD startup.
+ 
+    DATA: lt_events TYPE cntl_simple_events,
+          ls_event  LIKE LINE OF lt_events,
+          lt_assets TYPE zif_abapgit_gui_asset_manager=>ty_web_assets.
+ 
+    FIELD-SYMBOLS <ls_asset> LIKE LINE OF lt_assets.
+ 
+ 
+    mi_html_viewer = zcl_abapgit_ui_factory=>get_html_viewer( ).
+ 
+    IF mi_asset_man IS BOUND.
+      lt_assets = mi_asset_man->get_all_assets( ).
+      LOOP AT lt_assets ASSIGNING <ls_asset> WHERE is_cacheable = abap_true.
+        zif_abapgit_gui_services~cache_asset(
+          iv_xdata   = <ls_asset>-content
+          iv_url     = <ls_asset>-url
+          iv_type    = <ls_asset>-type
+          iv_subtype = <ls_asset>-subtype ).
+      ENDLOOP.
+    ENDIF.
+ 
+    ls_event-eventid    = mi_html_viewer->m_id_sapevent.
+    ls_event-appl_event = abap_true.
+    APPEND ls_event TO lt_events.
+ 
+    mi_html_viewer->set_registered_events( lt_events ).
+    SET HANDLER on_event FOR mi_html_viewer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~cache_asset.
+ 
+    TYPES ty_hex TYPE x LENGTH 200.
+    TYPES ty_char TYPE c LENGTH 200.
+ 
+    DATA: lt_xdata TYPE STANDARD TABLE OF ty_hex WITH DEFAULT KEY,
+          lv_size  TYPE i,
+          lt_html  TYPE STANDARD TABLE OF ty_char WITH DEFAULT KEY.
+ 
+    ASSERT iv_text IS SUPPLIED OR iv_xdata IS SUPPLIED.
+ 
+    IF iv_text IS SUPPLIED. " String input
+      zcl_abapgit_convert=>string_to_tab(
+         EXPORTING
+           iv_str  = iv_text
+         IMPORTING
+           ev_size = lv_size
+           et_tab  = lt_html ).
+ 
+      mi_html_viewer->load_data(
+        EXPORTING
+          iv_type         = iv_type
+          iv_subtype      = iv_subtype
+          iv_size         = lv_size
+          iv_url          = iv_url
+        IMPORTING
+          ev_assigned_url = rv_url
+        CHANGING
+          ct_data_table   = lt_html ).
+    ELSE. " Raw input
+      zcl_abapgit_convert=>xstring_to_bintab(
+        EXPORTING
+          iv_xstr   = iv_xdata
+        IMPORTING
+          ev_size   = lv_size
+          et_bintab = lt_xdata ).
+ 
+      mi_html_viewer->load_data(
+        EXPORTING
+          iv_type         = iv_type
+          iv_subtype      = iv_subtype
+          iv_size         = lv_size
+          iv_url          = iv_url
+        IMPORTING
+          ev_assigned_url = rv_url
+        CHANGING
+          ct_data_table   = lt_xdata ).
+    ENDIF.
+ 
+    ASSERT sy-subrc = 0. " Image data error
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~get_current_page_name.
+ 
+    DATA li_page_hoc TYPE REF TO zcl_abapgit_gui_page_hoc.
+ 
+    IF mi_cur_page IS BOUND.
+      rv_page_name = cl_abap_classdescr=>describe_by_object_ref( mi_cur_page )->get_relative_name( ).
+ 
+      " For HOC components return name of child component instead
+      IF rv_page_name = ''ZCL_ABAPGIT_GUI_PAGE_HOC''.
+        li_page_hoc ?= mi_cur_page.
+        IF li_page_hoc->get_child( ) IS BOUND.
+          rv_page_name = cl_abap_classdescr=>describe_by_object_ref(
+                           li_page_hoc->get_child( ) )->get_relative_name( ).
+        ENDIF.
+      ENDIF.
+    ENDIF." ELSE - return is empty => initial page
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~get_hotkeys_ctl.
+    ri_hotkey_ctl = mi_hotkey_ctl.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~get_html_parts.
+    ro_parts = mo_html_parts.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~get_log.
+ 
+    IF iv_create_new = abap_true OR mi_common_log IS NOT BOUND.
+      CREATE OBJECT mi_common_log TYPE zcl_abapgit_log.
+    ENDIF.
+ 
+    ri_log = mi_common_log.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~register_event_handler.
+    ASSERT ii_event_handler IS BOUND.
+    INSERT ii_event_handler INTO mt_event_handlers INDEX 1.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~register_page_asset.
+ 
+    " Maybe forbid registering cachable existing assets, maybe this is the right place (see also asset_man commments)
+ 
+    mi_asset_man->register_asset(
+      iv_url = iv_url
+      iv_type = iv_type
+      iv_mime_name = iv_mime_name
+      iv_inline = iv_inline
+      " This registering will happen after initialization so all cachable already cached
+      iv_cachable = abap_false ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_ASSET_MANAGER           ', 'CLASS zcl_abapgit_gui_asset_manager DEFINITION PUBLIC FINAL CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_asset_manager.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_asset_manager) TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_asset_entry.
+        INCLUDE TYPE zif_abapgit_gui_asset_manager~ty_web_asset.
+    TYPES: mime_name TYPE wwwdatatab-objid,
+      END OF ty_asset_entry.
+    TYPES:
+      ty_asset_register TYPE STANDARD TABLE OF ty_asset_entry WITH KEY url.
+ 
+    DATA mt_asset_register TYPE ty_asset_register.
+ 
+    METHODS get_mime_asset
+      IMPORTING
+        iv_mime_name    TYPE c
+      RETURNING
+        VALUE(rv_xdata) TYPE xstring
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS load_asset
+      IMPORTING
+        is_asset_entry  TYPE ty_asset_entry
+      RETURNING
+        VALUE(rs_asset) TYPE zif_abapgit_gui_asset_manager~ty_web_asset
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_asset_manager IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ri_asset_manager TYPE zcl_abapgit_gui_asset_manager.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_mime_asset.
+ 
+    DATA: ls_key    TYPE wwwdatatab,
+          lv_size_c TYPE wwwparams-value,
+          lv_size   TYPE i,
+          lt_w3mime TYPE STANDARD TABLE OF w3mime,
+          ls_w3mime LIKE LINE OF lt_w3mime.
+ 
+    ls_key-relid = ''MI''.
+    ls_key-objid = iv_mime_name.
+ 
+    " Get exact file size
+    CALL FUNCTION ''WWWPARAMS_READ''
+      EXPORTING
+        relid            = ls_key-relid
+        objid            = ls_key-objid
+        name             = ''filesize''
+      IMPORTING
+        value            = lv_size_c
+      EXCEPTIONS
+        entry_not_exists = 1.
+ 
+    IF sy-subrc IS NOT INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_size = lv_size_c.
+ 
+    " Get binary data
+    CALL FUNCTION ''WWWDATA_IMPORT''
+      EXPORTING
+        key               = ls_key
+      TABLES
+        mime              = lt_w3mime
+      EXCEPTIONS
+        wrong_object_type = 1
+        import_error      = 2.
+ 
+    IF sy-subrc IS NOT INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT lt_w3mime INTO ls_w3mime.
+      CONCATENATE rv_xdata ls_w3mime-line INTO rv_xdata IN BYTE MODE.
+    ENDLOOP.
+    rv_xdata = rv_xdata(lv_size).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD load_asset.
+ 
+    MOVE-CORRESPONDING is_asset_entry TO rs_asset.
+    IF rs_asset-content IS INITIAL AND is_asset_entry-mime_name IS NOT INITIAL.
+      " inline content has the priority
+      rs_asset-content = get_mime_asset( is_asset_entry-mime_name ).
+    ENDIF.
+    IF rs_asset-content IS INITIAL.
+      zcx_abapgit_exception=>raise( |failed to load GUI asset: { is_asset_entry-url }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_asset_manager~get_all_assets.
+ 
+    FIELD-SYMBOLS <ls_a> LIKE LINE OF mt_asset_register.
+ 
+    LOOP AT mt_asset_register ASSIGNING <ls_a>.
+      APPEND load_asset( <ls_a> ) TO rt_assets.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_asset_manager~get_asset.
+ 
+    FIELD-SYMBOLS <ls_a> LIKE LINE OF mt_asset_register.
+ 
+    READ TABLE mt_asset_register WITH KEY url = iv_url ASSIGNING <ls_a>.
+    IF <ls_a> IS NOT ASSIGNED.
+      zcx_abapgit_exception=>raise( |Cannot find GUI asset: { iv_url }| ).
+    ENDIF.
+    rs_asset = load_asset( <ls_a> ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_asset_manager~get_text_asset.
+ 
+    DATA ls_asset TYPE zif_abapgit_gui_asset_manager~ty_web_asset.
+    ls_asset = zif_abapgit_gui_asset_manager~get_asset( iv_url ).
+ 
+    IF ls_asset-type <> ''text''.
+      zcx_abapgit_exception=>raise( |Not a text asset: { iv_url }| ).
+    ENDIF.
+ 
+    IF iv_assert_subtype IS NOT INITIAL AND ls_asset-subtype <> iv_assert_subtype.
+      zcx_abapgit_exception=>raise( |Wrong subtype ({ iv_assert_subtype }): { iv_url }| ).
+    ENDIF.
+ 
+    rv_asset = zcl_abapgit_convert=>xstring_to_string_utf8( ls_asset-content ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_asset_manager~register_asset.
+ 
+    DATA ls_asset LIKE LINE OF mt_asset_register.
+ 
+    SPLIT iv_type AT ''/'' INTO ls_asset-type ls_asset-subtype.
+    ls_asset-url          = iv_url.
+    ls_asset-mime_name    = iv_mime_name.
+    ls_asset-is_cacheable = iv_cachable.
+    IF iv_base64 IS NOT INITIAL.
+      ls_asset-content = zcl_abapgit_convert=>base64_to_xstring( iv_base64 ).
+    ELSEIF iv_inline IS NOT INITIAL.
+      ls_asset-content = zcl_abapgit_convert=>string_to_xstring( iv_inline ).
+    ENDIF.
+ 
+    DELETE mt_asset_register WHERE url = iv_url.
+    " TODO: Maybe forbid averwriting cachable assets as they were probably already cached ... agrueable
+    APPEND ls_asset TO mt_asset_register.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_CSS_PROCESSOR           ', 'CLASS zcl_abapgit_gui_css_processor DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor
+        IMPORTING
+          ii_asset_manager TYPE REF TO zif_abapgit_gui_asset_manager,
+      add_file
+        IMPORTING
+          iv_url TYPE string,
+      process
+        RETURNING
+          VALUE(rv_result) TYPE string
+        RAISING   zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_css_var,
+        name  TYPE string,
+        value TYPE string,
+      END OF ty_css_var,
+      ty_css_vars TYPE SORTED TABLE OF ty_css_var WITH UNIQUE KEY name.
+ 
+    METHODS:
+      get_css_vars_in_string
+        IMPORTING
+          iv_string           TYPE string
+        RETURNING
+          VALUE(rt_variables) TYPE ty_css_vars,
+      resolve_var_recursively
+        IMPORTING
+          iv_variable_name TYPE string
+        CHANGING
+          ct_variables     TYPE ty_css_vars
+        RAISING
+          zcx_abapgit_exception.
+    DATA:
+      mi_asset_manager TYPE REF TO zif_abapgit_gui_asset_manager,
+      mt_files         TYPE string_table.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_CSS_PROCESSOR IMPLEMENTATION.
+ 
+ 
+  METHOD add_file.
+    APPEND iv_url TO mt_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mi_asset_manager = ii_asset_manager.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_css_vars_in_string.
+    CONSTANTS: lc_root_pattern     TYPE string VALUE \`:root\\s*\\{([^\\}]*)\\}\`,
+               lc_variable_pattern TYPE string VALUE \`\\-\\-([\\w\\d-]+)\\s*:\\s*([^\\n\\r;]*);\`.
+    DATA: lv_root     TYPE string,
+          lo_matcher  TYPE REF TO cl_abap_matcher,
+          lo_regex    TYPE REF TO cl_abap_regex,
+          ls_variable LIKE LINE OF rt_variables.
+ 
+    " Only the :root element may define variables for now
+ 
+    FIND FIRST OCCURRENCE OF REGEX lc_root_pattern IN iv_string SUBMATCHES lv_root.
+    IF sy-subrc = 0 AND lv_root IS NOT INITIAL.
+      CREATE OBJECT lo_regex
+        EXPORTING
+          pattern = lc_variable_pattern.
+      lo_matcher = lo_regex->create_matcher( text = lv_root ).
+      WHILE lo_matcher->find_next( ) = abap_true.
+        ls_variable-name = lo_matcher->get_submatch( 1 ).
+        ls_variable-value = lo_matcher->get_submatch( 2 ).
+        INSERT ls_variable INTO TABLE rt_variables.
+        IF sy-subrc <> 0.
+          MODIFY TABLE rt_variables FROM ls_variable.
+        ENDIF.
+      ENDWHILE.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD process.
+    DATA:
+          lt_contents         TYPE STANDARD TABLE OF string,
+          lv_content          TYPE string,
+          lt_css_variables    TYPE ty_css_vars,
+          lt_css_vars_in_file TYPE ty_css_vars.
+    FIELD-SYMBOLS: <lv_url>          TYPE string,
+                   <ls_css_variable> LIKE LINE OF lt_css_vars_in_file,
+                   <lv_content>      LIKE LINE OF lt_contents.
+ 
+    " 1. Determine all variables and their values. Later definitions overwrite previous ones.
+    LOOP AT mt_files ASSIGNING <lv_url>.
+      lv_content = mi_asset_manager->get_text_asset(
+        iv_url = <lv_url>
+        iv_assert_subtype = ''css'' ).
+ 
+      lt_css_vars_in_file = get_css_vars_in_string( lv_content ).
+ 
+      LOOP AT lt_css_vars_in_file ASSIGNING <ls_css_variable>.
+        INSERT <ls_css_variable> INTO TABLE lt_css_variables.
+        IF sy-subrc <> 0.
+          MODIFY TABLE lt_css_variables FROM <ls_css_variable>.
+        ENDIF.
+      ENDLOOP.
+ 
+      APPEND lv_content TO lt_contents.
+    ENDLOOP.
+ 
+    " 2. Replace all variable usages in variables
+    LOOP AT lt_css_variables ASSIGNING <ls_css_variable> WHERE value CS ''var(--''.
+      resolve_var_recursively( EXPORTING iv_variable_name = <ls_css_variable>-name
+                               CHANGING  ct_variables     = lt_css_variables ).
+    ENDLOOP.
+ 
+    " 3. Replace all other variable usages by inlining the values.
+    LOOP AT lt_contents ASSIGNING <lv_content>.
+      LOOP AT lt_css_variables ASSIGNING <ls_css_variable>.
+        REPLACE ALL OCCURRENCES OF |var(--{ <ls_css_variable>-name })|
+                IN <lv_content>
+                WITH <ls_css_variable>-value.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    rv_result = concat_lines_of( table = lt_contents
+                                 sep = cl_abap_char_utilities=>newline ).
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve_var_recursively.
+    CONSTANTS: lc_variable_usage_pattern TYPE string VALUE \`var\\(\\-\\-([^\\)]*)\\)\`.
+    DATA: lv_variable_name  TYPE string.
+    FIELD-SYMBOLS: <ls_variable>       LIKE LINE OF ct_variables,
+                   <ls_other_variable> LIKE LINE OF ct_variables.
+ 
+    READ TABLE ct_variables WITH TABLE KEY name = iv_variable_name ASSIGNING <ls_variable>.
+    IF sy-subrc = 0.
+      DO.
+        FIND FIRST OCCURRENCE OF REGEX lc_variable_usage_pattern
+             IN <ls_variable>-value
+             SUBMATCHES lv_variable_name.
+        IF sy-subrc = 0.
+          resolve_var_recursively( EXPORTING iv_variable_name = lv_variable_name
+                                   CHANGING  ct_variables     = ct_variables ).
+          READ TABLE ct_variables WITH TABLE KEY name = lv_variable_name ASSIGNING <ls_other_variable>.
+          REPLACE FIRST OCCURRENCE OF |var(--{ lv_variable_name })|
+                  IN <ls_variable>-value
+                  WITH <ls_other_variable>-value.
+        ELSE.
+          EXIT.
+        ENDIF.
+      ENDDO.
+    ELSE.
+      zcx_abapgit_exception=>raise( |CSS variable { iv_variable_name } not resolveable| ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_EVENT                   ', 'CLASS zcl_abapgit_gui_event DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event .
+ 
+    CLASS-METHODS new
+      IMPORTING
+        !ii_gui_services   TYPE REF TO zif_abapgit_gui_services OPTIONAL
+        !iv_action         TYPE clike
+        !iv_getdata        TYPE clike OPTIONAL
+        !it_postdata       TYPE zif_abapgit_html_viewer=>ty_post_data OPTIONAL
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_gui_event.
+    METHODS constructor
+      IMPORTING
+        !ii_gui_services TYPE REF TO zif_abapgit_gui_services OPTIONAL
+        !iv_action       TYPE clike
+        !iv_getdata      TYPE clike OPTIONAL
+        !it_postdata     TYPE zif_abapgit_html_viewer=>ty_post_data OPTIONAL .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mo_query TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+ 
+    METHODS fields_to_map
+      IMPORTING
+        it_fields            TYPE tihttpnvp
+      RETURNING
+        VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_event IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    " Edge Webview control returns upper case action but abapGit requires lower case (#4841)
+    zif_abapgit_gui_event~mi_gui_services = ii_gui_services.
+    zif_abapgit_gui_event~mv_action       = to_lower( iv_action ).
+    zif_abapgit_gui_event~mv_getdata      = iv_getdata.
+    zif_abapgit_gui_event~mt_postdata     = it_postdata.
+ 
+    IF ii_gui_services IS BOUND.
+      zif_abapgit_gui_event~mv_current_page_name = ii_gui_services->get_current_page_name( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD fields_to_map.
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF it_fields.
+ 
+    CREATE OBJECT ro_string_map EXPORTING iv_case_insensitive = abap_true.
+    LOOP AT it_fields ASSIGNING <ls_field>.
+      ro_string_map->set(
+        iv_key = <ls_field>-name
+        iv_val = <ls_field>-value ).
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        ii_gui_services = ii_gui_services
+        iv_action       = iv_action
+        iv_getdata      = iv_getdata
+        it_postdata     = it_postdata.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event~form_data.
+ 
+    IF mo_form_data IS NOT BOUND.
+      mo_form_data = fields_to_map(
+        zcl_abapgit_html_action_utils=>parse_post_form_data( zif_abapgit_gui_event~mt_postdata ) ).
+      mo_form_data->freeze( ).
+    ENDIF.
+    ro_string_map = mo_form_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event~query.
+ 
+    IF mo_query IS NOT BOUND.
+      mo_query = fields_to_map(
+        zcl_abapgit_html_action_utils=>parse_fields( zif_abapgit_gui_event~mv_getdata ) ).
+      mo_query->freeze( ).
+    ENDIF.
+    ro_string_map = mo_query.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_HOTKEY_CTL              ', 'CLASS zcl_abapgit_gui_hotkey_ctl DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_hotkeys.
+    INTERFACES zif_abapgit_gui_hotkey_ctl.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CONSTANTS c_showhotkeys_action TYPE string VALUE \`showHotkeys\` ##NO_TEXT.
+ 
+    CLASS-METHODS should_show_hint
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA:
+      mt_hotkeys       TYPE zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr,
+      ms_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings,
+      mv_visible       TYPE abap_bool.
+    CLASS-DATA gv_hint_was_shown TYPE abap_bool .
+ 
+    METHODS render_scripts
+      IMPORTING
+        !it_hotkeys    TYPE zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_HOTKEY_CTL IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    ms_user_settings = zcl_abapgit_persistence_user=>get_instance( )->get_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    DATA lv_json TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_hotkey> LIKE LINE OF it_hotkeys.
+ 
+    lv_json = \`{\`.
+ 
+    LOOP AT it_hotkeys ASSIGNING <ls_hotkey>.
+ 
+      IF sy-tabix > 1.
+        lv_json = lv_json && |,|.
+      ENDIF.
+ 
+      lv_json = lv_json && |  "{ <ls_hotkey>-hotkey }" : "{ <ls_hotkey>-action }" |.
+ 
+    ENDLOOP.
+ 
+    lv_json = lv_json && \`}\`.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( |setKeyBindings({ lv_json });| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD should_show_hint.
+    IF gv_hint_was_shown = abap_false.
+      rv_yes = abap_true.
+      gv_hint_was_shown = abap_true.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA ls_hotkey LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey-ui_component = ''Hotkeys''.
+    ls_hotkey-action       = c_showhotkeys_action.
+    ls_hotkey-description  = ''Show Hotkeys Help''.
+    ls_hotkey-hotkey       = ''?''.
+    INSERT ls_hotkey INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkey_ctl~get_registered_hotkeys.
+    rt_registered_hotkeys = mt_hotkeys.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkey_ctl~register_hotkeys.
+ 
+    FIELD-SYMBOLS <ls_hotkey> LIKE LINE OF it_hotkeys.
+ 
+    " Compress duplicates
+    LOOP AT it_hotkeys ASSIGNING <ls_hotkey>.
+      READ TABLE mt_hotkeys WITH KEY hotkey = <ls_hotkey>-hotkey TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0. " If found command with same hotkey
+        DELETE mt_hotkeys INDEX sy-tabix. " Later registered commands enjoys the priority
+      ENDIF.
+ 
+      IF  ms_user_settings-link_hints_enabled = abap_true
+      AND ms_user_settings-link_hint_key      = <ls_hotkey>-hotkey.
+        " Link hint activation key is more important
+        CONTINUE.
+      ENDIF.
+ 
+      APPEND <ls_hotkey> TO mt_hotkeys.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkey_ctl~reset.
+    CLEAR mt_hotkeys.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkey_ctl~set_visible.
+ 
+    mv_visible = iv_visible.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA:
+      lv_hint               TYPE string,
+      lt_registered_hotkeys TYPE zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr,
+      lv_hotkey             TYPE string,
+      ls_user_settings      TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+    FIELD-SYMBOLS <ls_hotkey> LIKE LINE OF lt_registered_hotkeys.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lt_registered_hotkeys = zif_abapgit_gui_hotkey_ctl~get_registered_hotkeys( ).
+    SORT lt_registered_hotkeys BY ui_component description.
+ 
+    register_deferred_script( render_scripts( lt_registered_hotkeys ) ).
+ 
+    " Render hotkeys
+    ri_html->add( ''<ul class="hotkeys">'' ).
+    LOOP AT lt_registered_hotkeys ASSIGNING <ls_hotkey>.
+      ri_html->add( |<li>|
+        && |<span class="key-id">{ <ls_hotkey>-hotkey }</span>|
+        && |<span class="key-descr">{ <ls_hotkey>-description }</span>|
+        && |</li>| ).
+    ENDLOOP.
+ 
+    " render link hints activation key
+    ls_user_settings = zcl_abapgit_persistence_user=>get_instance( )->get_settings( ).
+    IF ls_user_settings-link_hints_enabled = abap_true.
+      ri_html->add( |<li>|
+         && |<span class="key-id">{ ls_user_settings-link_hint_key }</span>|
+         && |<span class="key-descr">Link Hints</span>|
+         && |</li>| ).
+      ri_html->add( |<li>|
+         && |<span class="key-id">y{ ls_user_settings-link_hint_key }</span>|
+         && |<span class="key-descr">Copy Link Text</span>|
+         && |</li>| ).
+    ENDIF.
+ 
+    ri_html->add( ''</ul>'' ).
+ 
+    CLEAR lv_hotkey.
+ 
+    READ TABLE lt_registered_hotkeys ASSIGNING <ls_hotkey>
+      WITH KEY action = c_showhotkeys_action.
+    IF sy-subrc = 0.
+      lv_hotkey = <ls_hotkey>-hotkey.
+    ENDIF.
+ 
+    lv_hint = |Close window with upper right corner ''X''|.
+    IF lv_hotkey IS NOT INITIAL.
+      lv_hint = lv_hint && | or press ''{ <ls_hotkey>-hotkey }''|.
+    ENDIF.
+ 
+    ri_html = zcl_abapgit_gui_chunk_lib=>render_infopanel(
+      iv_div_id     = ''hotkeys''
+      iv_title      = ''Hotkeys''
+      iv_hint       = lv_hint
+      iv_hide       = boolc( mv_visible = abap_false )
+      iv_scrollable = abap_false
+      io_content    = ri_html ).
+ 
+    IF lv_hotkey IS NOT INITIAL AND should_show_hint( ) = abap_true.
+      ri_html->add( |<div id="hotkeys-hint" class="corner-hint">|
+        && |Press ''{ <ls_hotkey>-hotkey }'' to get keyboard shortcuts list|
+        && |</div>| ).
+    ENDIF.
+ 
+    " Always reset visibility here. Closing of the popup has to be done by the
+    " user and is handeled in JS.
+    mv_visible = abap_false.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_HTML_PROCESSOR          ', 'CLASS zcl_abapgit_gui_html_processor DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_css_build_name TYPE string VALUE ''css/bundle.css''.
+    CONSTANTS c_preprocess_marker TYPE string VALUE \`<!-- abapgit HTML preprocessor -->\`.
+    CONSTANTS c_comment_start TYPE string VALUE \`<!--\`.
+    CONSTANTS c_comment_end TYPE string VALUE \`-->\`.
+ 
+    INTERFACES zif_abapgit_gui_html_processor .
+ 
+    METHODS constructor
+      IMPORTING
+        ii_asset_man TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    METHODS preserve_css
+      IMPORTING
+        !iv_css_url TYPE string .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mt_preserve_css TYPE string_table.
+    DATA mi_asset_man TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    METHODS patch_html
+      IMPORTING
+        iv_html TYPE string
+      EXPORTING
+        ev_html TYPE string
+        et_css_urls TYPE string_table
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS is_preserved
+      IMPORTING
+        !iv_css_url TYPE string
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+ 
+    METHODS find_head_offset
+      IMPORTING
+        iv_html            TYPE string
+      RETURNING
+        VALUE(rv_head_end) TYPE i
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_HTML_PROCESSOR IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mi_asset_man = ii_asset_man.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_preserved.
+    READ TABLE mt_preserve_css TRANSPORTING NO FIELDS WITH KEY table_line = iv_css_url.
+    rv_yes = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD patch_html.
+ 
+    CONSTANTS lc_css_re TYPE string VALUE \`<link\\s+rel="stylesheet"\\s+type="text/css"\\s+href="(\\S+)">\`.
+ 
+    DATA lv_head_end TYPE i.
+    DATA lo_css_re   TYPE REF TO cl_abap_regex.
+    DATA lo_matcher  TYPE REF TO cl_abap_matcher.
+    DATA lv_css_path TYPE string.
+    DATA lv_marker   TYPE string.
+ 
+    DATA lv_off TYPE i.
+    DATA lv_len TYPE i.
+    DATA lv_cur TYPE i.
+ 
+    DATA lv_css_build TYPE string VALUE ''<link rel="stylesheet" type="text/css" href="$BUILD_NAME">''.
+    REPLACE FIRST OCCURRENCE OF ''$BUILD_NAME'' IN lv_css_build WITH c_css_build_name. " Mmmm
+ 
+    CLEAR: ev_html, et_css_urls.
+ 
+    lv_head_end = find_head_offset( iv_html ).
+ 
+    CREATE OBJECT lo_css_re
+      EXPORTING
+        ignore_case = abap_true
+        pattern     = lc_css_re.
+ 
+    lo_matcher = lo_css_re->create_matcher( text = substring( val = iv_html len = lv_head_end ) ).
+    WHILE lo_matcher->find_next( ) = abap_true.
+      lv_css_path = lo_matcher->get_submatch( 1 ).
+      IF abap_false = is_preserved( lv_css_path ).
+        lv_off = lo_matcher->get_offset( ).
+        lv_len = lo_matcher->get_length( ).
+        ev_html = ev_html && substring( val = iv_html
+                                        off = lv_cur
+                                        len = lv_off - lv_cur ).
+        ev_html = ev_html && c_comment_start && substring( val = iv_html
+                                                           off = lv_off
+                                                           len = lv_len ) && c_comment_end.
+        lv_cur  = lv_off + lv_len.
+        APPEND lv_css_path TO et_css_urls.
+      ENDIF.
+    ENDWHILE.
+ 
+    ev_html = ev_html && substring( val = iv_html
+                                    off = lv_cur
+                                    len = lv_head_end - lv_cur ).
+    IF lines( et_css_urls ) > 0.
+      lv_marker = cl_abap_char_utilities=>newline
+        && \`    \` " Assume 4 space indent, maybe improve and detect ?
+        && c_preprocess_marker
+        && cl_abap_char_utilities=>newline
+        && \`    \`.
+      ev_html = ev_html && lv_marker && lv_css_build.
+    ENDIF.
+    ev_html = ev_html && substring( val = iv_html
+                                    off = lv_head_end ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD preserve_css.
+    APPEND iv_css_url TO mt_preserve_css.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_html_processor~process.
+ 
+    DATA lo_css_processor TYPE REF TO zcl_abapgit_gui_css_processor.
+    DATA lt_css_urls TYPE string_table.
+    DATA lv_css_build TYPE string.
+ 
+    FIELD-SYMBOLS <lv_url> LIKE LINE OF lt_css_urls.
+ 
+    patch_html(
+      EXPORTING
+        iv_html = iv_html
+      IMPORTING
+        ev_html = rv_html
+        et_css_urls = lt_css_urls ).
+ 
+    IF lines( lt_css_urls ) > 0.
+      CREATE OBJECT lo_css_processor
+        EXPORTING
+          ii_asset_manager = mi_asset_man.
+ 
+      LOOP AT lt_css_urls ASSIGNING <lv_url>.
+        lo_css_processor->add_file( <lv_url> ).
+      ENDLOOP.
+ 
+      lv_css_build = lo_css_processor->process( ).
+ 
+      ii_gui_services->cache_asset(
+        iv_url     = |{ c_css_build_name }|
+        iv_type    = ''text''
+        iv_subtype = ''css''
+        iv_text    = lv_css_build ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD find_head_offset.
+ 
+    rv_head_end = find( val = iv_html
+                        regex = |{ cl_abap_char_utilities=>newline }?\\\\s*</head>|
+                        case = abap_false ).
+    IF rv_head_end <= 0.
+      rv_head_end = find( val = iv_html
+                          regex = |</head>|
+                          case = abap_false ).
+      IF rv_head_end <= 0.
+        zcx_abapgit_exception=>raise( ''HTML preprocessor: </head> not found'' ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_UTILS                   ', 'CLASS zcl_abapgit_gui_utils DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS is_renderable
+      IMPORTING
+        !io_obj TYPE REF TO object
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    CLASS-METHODS is_event_handler
+      IMPORTING
+        !io_obj TYPE REF TO object
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_UTILS IMPLEMENTATION.
+ 
+ 
+  METHOD is_event_handler.
+    DATA li_event_handler TYPE REF TO zif_abapgit_gui_event_handler.
+    TRY.
+        li_event_handler ?= io_obj.
+        rv_yes = abap_true.
+      CATCH cx_sy_move_cast_error.
+        rv_yes = abap_false.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_renderable.
+    DATA li_renderable TYPE REF TO zif_abapgit_gui_renderable.
+    TRY.
+        li_renderable ?= io_obj.
+        rv_yes = abap_true.
+      CATCH cx_sy_move_cast_error.
+        rv_yes = abap_false.
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTML                        ', 'CLASS zcl_abapgit_html DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_html .
+ 
+    CONSTANTS c_indent_size TYPE i VALUE 2 ##NO_TEXT.
+ 
+    CLASS-METHODS class_constructor .
+    CLASS-METHODS create
+      IMPORTING
+        !iv_initial_chunk  TYPE any OPTIONAL
+      RETURNING
+        VALUE(ri_instance) TYPE REF TO zif_abapgit_html.
+ 
+    CLASS-METHODS icon
+      IMPORTING
+        !iv_name      TYPE string
+        !iv_hint      TYPE string OPTIONAL
+        !iv_class     TYPE string OPTIONAL
+        !iv_onclick   TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_str) TYPE string .
+    CLASS-METHODS checkbox
+      IMPORTING
+        iv_id          TYPE string OPTIONAL
+        iv_checked     TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(rv_html) TYPE string .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_indent_context,
+        no_indent_jscss TYPE abap_bool,
+        within_style    TYPE abap_bool,
+        within_js       TYPE abap_bool,
+        within_textarea TYPE abap_bool,
+        indent          TYPE i,
+        indent_str      TYPE string,
+      END OF ty_indent_context .
+    TYPES:
+      BEGIN OF ty_study_result,
+        style_open     TYPE abap_bool,
+        style_close    TYPE abap_bool,
+        script_open    TYPE abap_bool,
+        script_close   TYPE abap_bool,
+        textarea_open  TYPE abap_bool,
+        textarea_close TYPE abap_bool,
+        tag_close      TYPE abap_bool,
+        curly_close    TYPE abap_bool,
+        openings       TYPE i,
+        closings       TYPE i,
+        singles        TYPE i,
+      END OF ty_study_result .
+ 
+    CLASS-DATA go_single_tags_re TYPE REF TO cl_abap_regex .
+    DATA mt_buffer TYPE string_table .
+    CLASS-DATA gv_spaces TYPE string .
+    CLASS-DATA gv_debug_mode TYPE abap_bool .
+ 
+    METHODS indent_line
+      CHANGING
+        !cs_context TYPE ty_indent_context
+        !cv_line    TYPE string .
+    METHODS study_line
+      IMPORTING
+        !iv_line         TYPE string
+        !is_context      TYPE ty_indent_context
+      RETURNING
+        VALUE(rs_result) TYPE ty_study_result .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML IMPLEMENTATION.
+ 
+ 
+  METHOD checkbox.
+ 
+    DATA: lv_checked TYPE string.
+ 
+    IF iv_checked = abap_true.
+      lv_checked = |checked|.
+    ENDIF.
+ 
+    rv_html = |<input type="checkbox" { lv_checked } |.
+    IF iv_id IS NOT INITIAL.
+      rv_html = rv_html && |id="{ iv_id }"|.
+    ENDIF.
+ 
+    rv_html = rv_html && \`/>\`.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_constructor.
+ 
+    DATA lv_mode TYPE tabname.
+ 
+    CREATE OBJECT go_single_tags_re
+      EXPORTING
+        pattern     = ''<(AREA|BASE|BR|COL|COMMAND|EMBED|HR|IMG|INPUT|LINK|META|PARAM|SOURCE|!)''
+        ignore_case = abap_false.
+ 
+    gv_spaces = repeat(
+      val = \` \`
+      occ = 200 ).
+ 
+    GET PARAMETER ID ''DBT'' FIELD lv_mode.
+    gv_debug_mode = boolc( lv_mode = ''HREF'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ri_instance TYPE zcl_abapgit_html.
+    IF iv_initial_chunk IS NOT INITIAL.
+      ri_instance->add( iv_initial_chunk ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD icon.
+ 
+    DATA: lv_hint       TYPE string,
+          lv_name       TYPE string,
+          lv_color      TYPE string,
+          lv_class      TYPE string,
+          lv_large_icon TYPE string,
+          lv_xpixel     TYPE i,
+          lv_onclick    TYPE string.
+ 
+    SPLIT iv_name AT ''/'' INTO lv_name lv_color.
+ 
+    IF iv_hint IS NOT INITIAL.
+      lv_hint  = | title="{ iv_hint }"|.
+    ENDIF.
+    IF iv_onclick IS NOT INITIAL.
+      lv_onclick = | onclick="{ iv_onclick }"|.
+    ENDIF.
+    IF iv_class IS NOT INITIAL.
+      lv_class = | { iv_class }|.
+    ENDIF.
+    IF lv_color IS NOT INITIAL.
+      lv_color = | { lv_color }|.
+    ENDIF.
+ 
+    lv_xpixel = cl_gui_cfw=>compute_pixel_from_metric( x_or_y = ''X''
+                                                       in_ = 1 ).
+    IF lv_xpixel >= 2.
+      lv_large_icon = '' large''.
+    ENDIF.
+ 
+    rv_str = |<i class="icon{ lv_large_icon } icon-{ lv_name }{ lv_color }|.
+    rv_str = |{ rv_str }{ lv_class }"{ lv_onclick }{ lv_hint }></i>|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD indent_line.
+ 
+    DATA: ls_study  TYPE ty_study_result,
+          lv_spaces TYPE i.
+ 
+    ls_study = study_line(
+      is_context = cs_context
+      iv_line    = cv_line ).
+ 
+    " No indent for textarea tags
+    IF ls_study-textarea_open = abap_true.
+      cs_context-within_textarea = abap_true.
+      RETURN.
+    ELSEIF ls_study-textarea_close = abap_true.
+      cs_context-within_textarea = abap_false.
+      RETURN.
+    ELSEIF cs_context-within_textarea = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " First closing tag - shift back exceptionally
+    IF ( ls_study-script_close = abap_true
+        OR ls_study-style_close = abap_true
+        OR ls_study-curly_close = abap_true
+        OR ls_study-tag_close = abap_true )
+        AND cs_context-indent > 0.
+      lv_spaces = ( cs_context-indent - 1 ) * c_indent_size.
+      cv_line  = gv_spaces(lv_spaces) && cv_line.
+    ELSE.
+      cv_line = cs_context-indent_str && cv_line.
+    ENDIF.
+ 
+    " Context status update
+    CASE abap_true.
+      WHEN ls_study-script_open.
+        cs_context-within_js    = abap_true.
+        cs_context-within_style = abap_false.
+      WHEN ls_study-style_open.
+        cs_context-within_js    = abap_false.
+        cs_context-within_style = abap_true.
+      WHEN ls_study-script_close OR ls_study-style_close.
+        cs_context-within_js    = abap_false.
+        cs_context-within_style = abap_false.
+        ls_study-closings       = ls_study-closings + 1.
+    ENDCASE.
+ 
+    " More-less logic chosen due to possible double tags in a line ''<a><b>''
+    IF ls_study-openings <> ls_study-closings.
+      IF ls_study-openings > ls_study-closings.
+        cs_context-indent = cs_context-indent + 1.
+      ELSEIF cs_context-indent > 0. " AND ls_study-openings < ls_study-closings
+        cs_context-indent = cs_context-indent - 1.
+      ENDIF.
+      lv_spaces = cs_context-indent * c_indent_size.
+      cs_context-indent_str = gv_spaces(lv_spaces).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD study_line.
+ 
+    DATA: lv_line TYPE string,
+          lv_len  TYPE i.
+ 
+    lv_line = to_upper( shift_left( val = iv_line
+                                    sub = \` \` ) ).
+    lv_len  = strlen( lv_line ).
+ 
+    " Some assumptions for simplification and speed
+    " - style & scripts tag should be opened/closed in a separate line
+    " - style & scripts opening and closing in one line is possible but only once
+ 
+    " TODO & Issues
+    " - What if the string IS a well formed html already not just single line ?
+ 
+    IF is_context-within_js = abap_true OR is_context-within_style = abap_true.
+ 
+      IF is_context-within_js = abap_true AND lv_len >= 8 AND lv_line(8) = ''</SCRIPT''.
+        rs_result-script_close = abap_true.
+      ELSEIF is_context-within_style = abap_true AND lv_len >= 7 AND lv_line(7) = ''</STYLE''.
+        rs_result-style_close = abap_true.
+      ENDIF.
+ 
+      IF is_context-no_indent_jscss = abap_false.
+        IF lv_len >= 1 AND lv_line(1) = ''}''.
+          rs_result-curly_close = abap_true.
+        ENDIF.
+ 
+        FIND ALL OCCURRENCES OF ''{'' IN lv_line MATCH COUNT rs_result-openings.
+        FIND ALL OCCURRENCES OF ''}'' IN lv_line MATCH COUNT rs_result-closings.
+      ENDIF.
+ 
+    ELSE.
+      IF lv_len >= 7 AND lv_line(7) = ''<SCRIPT''.
+        FIND FIRST OCCURRENCE OF ''</SCRIPT'' IN lv_line.
+        IF sy-subrc > 0. " Not found
+          rs_result-script_open = abap_true.
+        ENDIF.
+      ENDIF.
+      IF lv_len >= 6 AND lv_line(6) = ''<STYLE''.
+        FIND FIRST OCCURRENCE OF ''</STYLE'' IN lv_line.
+        IF sy-subrc > 0. " Not found
+          rs_result-style_open = abap_true.
+        ENDIF.
+      ENDIF.
+      IF lv_len >= 2 AND lv_line(2) = ''</''.
+        rs_result-tag_close = abap_true.
+      ENDIF.
+ 
+      FIND ALL OCCURRENCES OF ''<''  IN lv_line MATCH COUNT rs_result-openings.
+      FIND ALL OCCURRENCES OF ''</'' IN lv_line MATCH COUNT rs_result-closings.
+      IF rs_result-closings <> rs_result-openings.
+* if everything is closings, there are no single tags
+        FIND ALL OCCURRENCES OF REGEX go_single_tags_re IN lv_line MATCH COUNT rs_result-singles.
+      ENDIF.
+      rs_result-openings = rs_result-openings - rs_result-closings - rs_result-singles.
+ 
+    ENDIF.
+ 
+    " Textarea (same assumptions as above)
+    IF is_context-within_textarea = abap_true AND lv_len >= 10 AND lv_line(10) = ''</TEXTAREA''.
+      rs_result-textarea_close = abap_true.
+    ELSEIF is_context-within_textarea = abap_false AND lv_len >= 9 AND lv_line(9) = ''<TEXTAREA''.
+      FIND FIRST OCCURRENCE OF ''</TEXTAREA'' IN lv_line.
+      IF sy-subrc > 0. " Not found
+        rs_result-textarea_open = abap_true.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~a.
+ 
+    DATA: lv_class TYPE string,
+          lv_href  TYPE string,
+          lv_click TYPE string,
+          lv_id    TYPE string,
+          lv_act   TYPE string,
+          lv_style TYPE string,
+          lv_title TYPE string.
+ 
+    lv_class = iv_class.
+ 
+    IF iv_opt CA zif_abapgit_html=>c_html_opt-strong.
+      lv_class = lv_class && '' emphasis''.
+    ENDIF.
+    IF iv_opt CA zif_abapgit_html=>c_html_opt-cancel.
+      lv_class = lv_class && '' attention''.
+    ENDIF.
+    IF iv_opt CA zif_abapgit_html=>c_html_opt-crossout.
+      lv_class = lv_class && '' crossout grey''.
+    ENDIF.
+    IF lv_class IS NOT INITIAL.
+      SHIFT lv_class LEFT DELETING LEADING space.
+      lv_class = | class="{ lv_class }"|.
+    ENDIF.
+ 
+    lv_href = '' href="#"''. " Default, dummy
+    lv_act  = iv_act.
+    IF ( iv_act IS NOT INITIAL OR iv_typ = zif_abapgit_html=>c_action_type-dummy )
+        AND iv_opt NA zif_abapgit_html=>c_html_opt-crossout.
+      CASE iv_typ.
+        WHEN zif_abapgit_html=>c_action_type-url.
+          IF iv_query IS NOT INITIAL.
+            lv_act = lv_act && \`?\` && iv_query.
+          ENDIF.
+          lv_href  = | href="{ lv_act }"|.
+        WHEN zif_abapgit_html=>c_action_type-sapevent.
+          IF iv_query IS NOT INITIAL.
+            lv_act = lv_act && \`?\` && iv_query.
+          ENDIF.
+          lv_href  = | href="sapevent:{ lv_act }"|.
+        WHEN zif_abapgit_html=>c_action_type-onclick.
+          lv_href  = '' href="#"''.
+          lv_click = | onclick="{ iv_act }"|.
+        WHEN zif_abapgit_html=>c_action_type-dummy.
+          lv_href  = '' href="#"''.
+      ENDCASE.
+    ENDIF.
+ 
+    IF iv_id IS NOT INITIAL.
+      lv_id = | id="{ iv_id }"|.
+    ENDIF.
+ 
+    IF iv_style IS NOT INITIAL.
+      lv_style = | style="{ iv_style }"|.
+    ENDIF.
+ 
+    IF iv_title IS NOT INITIAL.
+      lv_title = | title="{ iv_title }"|.
+    ENDIF.
+ 
+    " Debug option to display href-link on hover
+    IF gv_debug_mode = abap_true.
+      lv_title = | title="{ escape(
+        val    = lv_href
+        format = cl_abap_format=>e_html_attr ) }"|.
+    ENDIF.
+ 
+    rv_str = |<a{ lv_id }{ lv_class }{ lv_href }{ lv_click }{ lv_style }{ lv_title }>|
+          && |{ iv_txt }</a>|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~add.
+ 
+    DATA: lv_type TYPE c,
+          li_renderable TYPE REF TO zif_abapgit_gui_renderable,
+          lx_error TYPE REF TO zcx_abapgit_exception,
+          lo_html TYPE REF TO zcl_abapgit_html.
+ 
+    FIELD-SYMBOLS: <lt_tab> TYPE string_table.
+ 
+    lv_type = cl_abap_typedescr=>describe_by_data( ig_chunk )->type_kind.
+ 
+    CASE lv_type.
+      WHEN ''C'' OR ''g''.  " Char or string
+        APPEND ig_chunk TO mt_buffer.
+      WHEN ''h''.         " Table
+        ASSIGN ig_chunk TO <lt_tab>. " Assuming table of strings ! Will dump otherwise
+        APPEND LINES OF <lt_tab> TO mt_buffer.
+      WHEN ''r''.         " Object ref
+        ASSERT ig_chunk IS BOUND. " Dev mistake
+        TRY.
+            lo_html ?= ig_chunk.
+          CATCH cx_sy_move_cast_error.
+            TRY.
+                li_renderable ?= ig_chunk.
+                lo_html ?= li_renderable->render( ).
+              CATCH cx_sy_move_cast_error.
+                ASSERT 1 = 0. " Dev mistake
+              CATCH zcx_abapgit_exception INTO lx_error.
+                lo_html ?= create( |<span class="error">Render error: { lx_error->get_text( ) }</span>| ).
+            ENDTRY.
+        ENDTRY.
+        APPEND LINES OF lo_html->mt_buffer TO mt_buffer.
+      WHEN OTHERS.
+        ASSERT 1 = 0. " Dev mistake
+    ENDCASE.
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~add_a.
+ 
+    zif_abapgit_html~add( zif_abapgit_html~a(
+      iv_txt   = iv_txt
+      iv_act   = iv_act
+      iv_query = iv_query
+      iv_typ   = iv_typ
+      iv_opt   = iv_opt
+      iv_class = iv_class
+      iv_id    = iv_id
+      iv_style = iv_style
+      iv_title = iv_title ) ).
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~add_checkbox.
+ 
+    zif_abapgit_html~add( checkbox(
+      iv_id      = iv_id
+      iv_checked = iv_checked ) ).
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~add_icon.
+ 
+    zif_abapgit_html~add( icon(
+      iv_name    = iv_name
+      iv_class   = iv_class
+      iv_hint    = iv_hint
+      iv_onclick = iv_onclick ) ).
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~icon.
+ 
+    rv_str = icon(
+      iv_name    = iv_name
+      iv_hint    = iv_hint
+      iv_class   = iv_class
+      iv_onclick = iv_onclick ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~is_empty.
+    rv_yes = boolc( lines( mt_buffer ) = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~render.
+ 
+    DATA: ls_context TYPE ty_indent_context,
+          lt_temp    TYPE string_table.
+ 
+    FIELD-SYMBOLS: <lv_line>   LIKE LINE OF lt_temp,
+                   <lv_line_c> LIKE LINE OF lt_temp.
+ 
+    ls_context-no_indent_jscss = iv_no_indent_jscss.
+ 
+    LOOP AT mt_buffer ASSIGNING <lv_line>.
+      APPEND <lv_line> TO lt_temp ASSIGNING <lv_line_c>.
+      indent_line( CHANGING cs_context = ls_context cv_line = <lv_line_c> ).
+    ENDLOOP.
+ 
+    CONCATENATE LINES OF lt_temp INTO rv_html SEPARATED BY cl_abap_char_utilities=>newline.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~set_title.
+    zif_abapgit_html~mv_chunk_title = iv_title.
+    ri_self = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~td.
+    zif_abapgit_html~wrap(
+      iv_format_single_line = iv_format_single_line
+      iv_tag   = ''td''
+      iv_content = iv_content
+      ii_content = ii_content
+      iv_id    = iv_id
+      iv_class = iv_class
+      iv_hint  = iv_hint ).
+    ri_self = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~th.
+    zif_abapgit_html~wrap(
+      iv_format_single_line = iv_format_single_line
+      iv_tag   = ''th''
+      iv_content = iv_content
+      ii_content = ii_content
+      iv_id    = iv_id
+      iv_class = iv_class
+      iv_hint  = iv_hint ).
+    ri_self = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~wrap.
+ 
+    DATA lv_open_tag TYPE string.
+    DATA lv_close_tag TYPE string.
+ 
+    DATA: lv_class TYPE string,
+          lv_id    TYPE string,
+          lv_title TYPE string.
+ 
+    IF iv_id IS NOT INITIAL.
+      lv_id = | id="{ iv_id }"|.
+    ENDIF.
+ 
+    IF iv_class IS NOT INITIAL.
+      lv_class = | class="{ iv_class }"|.
+    ENDIF.
+ 
+    IF iv_hint IS NOT INITIAL.
+      lv_title = | title="{ iv_hint }"|.
+    ENDIF.
+ 
+    lv_open_tag = |<{ iv_tag }{ lv_id }{ lv_class }{ lv_title }>|.
+    lv_close_tag = |</{ iv_tag }>|.
+ 
+    IF ii_content IS NOT BOUND AND iv_content IS INITIAL.
+      lv_open_tag = lv_open_tag && lv_close_tag.
+      CLEAR lv_close_tag.
+    ENDIF.
+ 
+    IF iv_format_single_line = abap_true AND iv_content IS NOT INITIAL.
+      zif_abapgit_html~add( lv_open_tag && iv_content && lv_close_tag ).
+    ELSE.
+      zif_abapgit_html~add( lv_open_tag ).
+      IF ii_content IS BOUND.
+        zif_abapgit_html~add( ii_content ).
+      ELSEIF iv_content IS NOT INITIAL.
+        zif_abapgit_html~add( iv_content ).
+      ENDIF.
+      IF lv_close_tag IS NOT INITIAL.
+        zif_abapgit_html~add( lv_close_tag ).
+      ENDIF.
+    ENDIF.
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTML_PARTS                  ', 'CLASS zcl_abapgit_html_parts DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS add_part
+      IMPORTING
+        !iv_collection TYPE string
+        !ii_part TYPE REF TO zif_abapgit_html .
+    METHODS get_parts
+      IMPORTING
+        !iv_collection TYPE string
+      RETURNING
+        VALUE(rt_parts) TYPE zif_abapgit_html=>ty_table_of .
+    METHODS get_collection_names
+      RETURNING
+        VALUE(rt_list) TYPE string_table .
+    METHODS get_collection_size
+      IMPORTING
+        !iv_collection TYPE string
+      RETURNING
+        VALUE(rv_size) TYPE i .
+    METHODS clear.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_named_collection,
+        name TYPE string,
+        pile TYPE zif_abapgit_html=>ty_table_of,
+      END OF ty_named_collection.
+    TYPES:
+      ty_named_collections TYPE STANDARD TABLE OF ty_named_collection WITH KEY name.
+ 
+    DATA mt_part_collections TYPE ty_named_collections.
+ 
+    METHODS get_collection
+      IMPORTING
+        !iv_collection TYPE string
+        !iv_create_if_missing TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rr_collection) TYPE REF TO ty_named_collection .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_PARTS IMPLEMENTATION.
+ 
+ 
+  METHOD add_part.
+ 
+    DATA lr_collection TYPE REF TO ty_named_collection.
+    lr_collection = get_collection(
+      iv_collection = iv_collection
+      iv_create_if_missing = abap_true ).
+    APPEND ii_part TO lr_collection->pile.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD clear.
+    CLEAR mt_part_collections.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_collection.
+ 
+    READ TABLE mt_part_collections REFERENCE INTO rr_collection WITH KEY name = iv_collection.
+    IF sy-subrc <> 0 AND iv_create_if_missing = abap_true.
+      APPEND INITIAL LINE TO mt_part_collections REFERENCE INTO rr_collection.
+      rr_collection->name = iv_collection.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_collection_names.
+ 
+    FIELD-SYMBOLS <ls_coll> LIKE LINE OF mt_part_collections.
+    LOOP AT mt_part_collections ASSIGNING <ls_coll>.
+      APPEND <ls_coll>-name TO rt_list.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_collection_size.
+ 
+    DATA lr_collection TYPE REF TO ty_named_collection.
+    lr_collection = get_collection( iv_collection ).
+    IF lr_collection IS BOUND.
+      rv_size = lines( lr_collection->pile ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_parts.
+ 
+    DATA lr_collection TYPE REF TO ty_named_collection.
+    lr_collection = get_collection( iv_collection ).
+    IF lr_collection IS BOUND.
+      rt_parts = lr_collection->pile.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTML_VIEWER_GUI             ', 'CLASS zcl_abapgit_html_viewer_gui DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_html_viewer .
+ 
+    METHODS constructor
+      IMPORTING
+        !io_container           TYPE REF TO cl_gui_container DEFAULT cl_gui_container=>screen0
+        !iv_disable_query_table TYPE abap_bool DEFAULT abap_true .
+  PROTECTED SECTION.
+ 
+    DATA mo_html_viewer TYPE REF TO cl_gui_html_viewer .
+ 
+    METHODS on_event
+        FOR EVENT sapevent OF cl_gui_html_viewer
+      IMPORTING
+        !action
+        !frame
+        !getdata
+        !postdata
+        !query_table .
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_html_viewer_gui IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lt_events TYPE cntl_simple_events,
+          ls_event  LIKE LINE OF lt_events.
+ 
+    CREATE OBJECT mo_html_viewer
+      EXPORTING
+        query_table_disabled = iv_disable_query_table
+        parent               = io_container.
+ 
+    ls_event-eventid    = zif_abapgit_html_viewer=>m_id_sapevent.
+    ls_event-appl_event = abap_true.
+    APPEND ls_event TO lt_events.
+ 
+    mo_html_viewer->set_registered_events( lt_events ).
+    SET HANDLER on_event FOR mo_html_viewer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD on_event.
+ 
+    RAISE EVENT zif_abapgit_html_viewer~sapevent
+      EXPORTING
+        action      = action
+        frame       = frame
+        getdata     = getdata
+        postdata    = postdata
+        query_table = query_table.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~back.
+ 
+    mo_html_viewer->go_back( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~close_document.
+ 
+    mo_html_viewer->close_document( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~free.
+ 
+    mo_html_viewer->free( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~get_url.
+ 
+    DATA lv_url TYPE c LENGTH 250.
+    mo_html_viewer->get_current_url( IMPORTING url = lv_url ).
+    cl_gui_cfw=>flush( ).
+    rv_url = lv_url.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~load_data.
+ 
+    DATA lv_url TYPE c LENGTH 250.
+    DATA lv_assigned TYPE c LENGTH 250.
+ 
+    ASSERT strlen( iv_url ) <= 250.
+    lv_url = iv_url.
+    mo_html_viewer->load_data(
+      EXPORTING
+        url                    = lv_url
+        type                   = iv_type
+        subtype                = iv_subtype
+        size                   = iv_size
+      IMPORTING
+        assigned_url           = lv_assigned
+      CHANGING
+        data_table             = ct_data_table
+      EXCEPTIONS
+        dp_invalid_parameter   = 1
+        dp_error_general       = 2
+        cntl_error             = 3
+        " html_syntax_notcorrect = 4  " not in lower releases
+        OTHERS                 = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error loading data for HTML viewer'' ).
+    ENDIF.
+    ev_assigned_url = lv_assigned.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~set_focus.
+    cl_gui_control=>set_focus(
+      EXPORTING
+        control           = mo_html_viewer
+      EXCEPTIONS
+        cntl_error        = 1
+        cntl_system_error = 2
+        OTHERS            = 3 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error in: cl_gui_control=>set_focus - SUBRC = { sy-subrc }| ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~set_registered_events.
+ 
+    mo_html_viewer->set_registered_events(
+      EXPORTING
+        events                    = it_events
+      EXCEPTIONS
+        cntl_error                = 1
+        cntl_system_error         = 2
+        illegal_event_combination = 3
+        OTHERS                    = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error registering events for HTML viewer'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~set_visiblity.
+    DATA: lv_visible TYPE c LENGTH 1.
+ 
+    IF iv_visible = abap_true.
+      lv_visible = cl_gui_container=>visible_true.
+    ELSE.
+      lv_visible = cl_gui_container=>visible_false.
+    ENDIF.
+ 
+    mo_html_viewer->set_visible( lv_visible ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~show_url.
+ 
+    DATA lv_url TYPE c LENGTH 250.
+    lv_url = iv_url.
+    mo_html_viewer->show_url(
+      EXPORTING
+        url                    = lv_url
+      EXCEPTIONS
+        cntl_error             = 1
+        cnht_error_not_allowed = 2
+        cnht_error_parameter   = 3
+        dp_error_general       = 4
+        OTHERS                 = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error showing URL in HTML viewer'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCX_ABAPGIT_CANCEL                      ', 'CLASS zcx_abapgit_cancel DEFINITION
+  PUBLIC
+  INHERITING FROM zcx_abapgit_exception
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !textid   LIKE if_t100_message=>t100key OPTIONAL
+        !previous LIKE previous OPTIONAL
+        !log      TYPE REF TO zif_abapgit_log OPTIONAL
+        !msgv1    TYPE symsgv OPTIONAL
+        !msgv2    TYPE symsgv OPTIONAL
+        !msgv3    TYPE symsgv OPTIONAL
+        !msgv4    TYPE symsgv OPTIONAL
+        !longtext TYPE csequence OPTIONAL.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcx_abapgit_cancel IMPLEMENTATION.
+ 
+ 
+  METHOD constructor ##ADT_SUPPRESS_GENERATION.
+    super->constructor(
+      previous = previous
+      log      = log
+      msgv1    = msgv1
+      msgv2    = msgv2
+      msgv3    = msgv3
+      msgv4    = msgv4
+      longtext = longtext ).
+ 
+    CLEAR me->textid.
+ 
+    IF textid IS INITIAL.
+      if_t100_message~t100key = if_t100_message=>default_textid.
+    ELSE.
+      if_t100_message~t100key = textid.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_ASSET_MANAGER           ', 'INTERFACE zif_abapgit_gui_asset_manager
+  PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_web_asset,
+      url          TYPE string,
+      type         TYPE c LENGTH 50,
+      subtype      TYPE c LENGTH 50,
+      content      TYPE xstring,
+      is_cacheable TYPE abap_bool,
+    END OF ty_web_asset .
+  TYPES:
+    ty_web_assets TYPE STANDARD TABLE OF ty_web_asset WITH DEFAULT KEY .
+ 
+  METHODS get_all_assets
+    RETURNING
+      VALUE(rt_assets) TYPE ty_web_assets
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS get_asset
+    IMPORTING
+      iv_url          TYPE string
+    RETURNING
+      VALUE(rs_asset) TYPE ty_web_asset
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS get_text_asset
+    IMPORTING
+      iv_url            TYPE string
+      iv_assert_subtype TYPE string OPTIONAL
+    RETURNING
+      VALUE(rv_asset)   TYPE string
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS register_asset
+    IMPORTING
+      !iv_url       TYPE string
+      !iv_type      TYPE string
+      !iv_cachable  TYPE abap_bool DEFAULT abap_true
+      !iv_mime_name TYPE wwwdatatab-objid OPTIONAL
+      !iv_base64    TYPE string OPTIONAL
+      !iv_inline    TYPE string OPTIONAL
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_ERROR_HANDLER           ', 'INTERFACE zif_abapgit_gui_error_handler
+  PUBLIC .
+ 
+  METHODS handle_error
+    IMPORTING
+      ix_error          TYPE REF TO zcx_abapgit_exception
+    RETURNING
+      VALUE(rv_handled) TYPE abap_bool.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_EVENT                   ', 'INTERFACE zif_abapgit_gui_event
+  PUBLIC .
+ 
+  DATA mv_action   TYPE string READ-ONLY.
+  DATA mv_getdata  TYPE string READ-ONLY.
+  DATA mt_postdata TYPE zif_abapgit_html_viewer=>ty_post_data READ-ONLY.
+  DATA mi_gui_services TYPE REF TO zif_abapgit_gui_services READ-ONLY.
+  DATA mv_current_page_name TYPE string.
+ 
+  METHODS query
+    RETURNING
+      VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS form_data
+    RETURNING
+      VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_EVENT_HANDLER           ', 'INTERFACE zif_abapgit_gui_event_handler
+  PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_handling_result,
+      page  TYPE REF TO zif_abapgit_gui_renderable,
+      state TYPE i,
+    END OF ty_handling_result.
+ 
+  METHODS on_event
+    IMPORTING
+      ii_event   TYPE REF TO zif_abapgit_gui_event
+    RETURNING
+      VALUE(rs_handled) TYPE ty_handling_result
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_HOTKEY_CTL              ', 'INTERFACE zif_abapgit_gui_hotkey_ctl
+  PUBLIC.
+ 
+ 
+  METHODS register_hotkeys
+    IMPORTING
+      !it_hotkeys TYPE zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr.
+  METHODS reset.
+  METHODS get_registered_hotkeys
+    RETURNING
+      VALUE(rt_registered_hotkeys) TYPE zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr
+    RAISING
+      zcx_abapgit_exception.
+  METHODS set_visible
+    IMPORTING
+      iv_visible TYPE abap_bool.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_HOTKEYS                 ', 'INTERFACE zif_abapgit_gui_hotkeys
+  PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_hotkey_with_descr,
+      ui_component TYPE string,
+      action       TYPE string,
+      hotkey       TYPE string,
+      description  TYPE string,
+    END OF ty_hotkey_with_descr .
+  TYPES:
+    ty_hotkeys_with_descr TYPE STANDARD TABLE OF ty_hotkey_with_descr
+      WITH DEFAULT KEY
+      WITH UNIQUE SORTED KEY action COMPONENTS ui_component action .
+ 
+  METHODS get_hotkey_actions
+    RETURNING
+      VALUE(rt_hotkey_actions) TYPE ty_hotkeys_with_descr .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_HTML_PROCESSOR          ', 'INTERFACE zif_abapgit_gui_html_processor
+  PUBLIC .
+ 
+  METHODS process
+    IMPORTING
+      !iv_html TYPE string
+      !ii_gui_services TYPE REF TO zif_abapgit_gui_services
+    RETURNING
+      VALUE(rv_html) TYPE string
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_MODAL                   ', 'INTERFACE zif_abapgit_gui_modal
+  PUBLIC .
+ 
+  METHODS is_modal
+    RETURNING
+      VALUE(rv_yes) TYPE abap_bool.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_RENDERABLE              ', 'INTERFACE zif_abapgit_gui_renderable
+  PUBLIC .
+ 
+  METHODS render
+    RETURNING
+      VALUE(ri_html) TYPE REF TO zif_abapgit_html
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_SERVICES                ', 'INTERFACE zif_abapgit_gui_services
+  PUBLIC .
+ 
+ 
+  METHODS cache_asset
+    IMPORTING
+      !iv_text      TYPE string OPTIONAL
+      !iv_xdata     TYPE xstring OPTIONAL
+      !iv_url       TYPE string OPTIONAL
+      !iv_type      TYPE c
+      !iv_subtype   TYPE c
+    RETURNING
+      VALUE(rv_url) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  " Notes:
+  " - page_asset is supposed to be not cachable
+  " - add mime64 if needed (supposedly won''t be needed)
+  METHODS register_page_asset
+    IMPORTING
+      !iv_url       TYPE string
+      !iv_type      TYPE string
+      !iv_mime_name TYPE wwwdatatab-objid OPTIONAL
+      !iv_inline    TYPE string OPTIONAL
+    RAISING
+      zcx_abapgit_exception .
+  METHODS register_event_handler
+    IMPORTING
+      !ii_event_handler TYPE REF TO zif_abapgit_gui_event_handler .
+  METHODS get_current_page_name
+    RETURNING
+      VALUE(rv_page_name) TYPE string .
+  METHODS get_hotkeys_ctl
+    RETURNING
+      VALUE(ri_hotkey_ctl) TYPE REF TO zif_abapgit_gui_hotkey_ctl .
+  METHODS get_html_parts
+    RETURNING
+      VALUE(ro_parts) TYPE REF TO zcl_abapgit_html_parts .
+  METHODS get_log
+    IMPORTING
+      !iv_create_new TYPE abap_bool DEFAULT abap_false
+    RETURNING
+      VALUE(ri_log)  TYPE REF TO zif_abapgit_log .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_HTML                        ', 'INTERFACE zif_abapgit_html PUBLIC.
+ 
+  CONSTANTS:
+    BEGIN OF c_action_type,
+      sapevent  TYPE c VALUE ''E'',
+      url       TYPE c VALUE ''U'',
+      onclick   TYPE c VALUE ''C'',
+      separator TYPE c VALUE ''S'',
+      dummy     TYPE c VALUE ''_'',
+    END OF c_action_type .
+  CONSTANTS:
+    BEGIN OF c_html_opt,
+      strong   TYPE c VALUE ''E'',
+      cancel   TYPE c VALUE ''C'',
+      crossout TYPE c VALUE ''X'',
+    END OF c_html_opt .
+ 
+  TYPES:
+    ty_table_of TYPE STANDARD TABLE OF REF TO zif_abapgit_html WITH DEFAULT KEY.
+ 
+  DATA mv_chunk_title TYPE string READ-ONLY. " Primarily for debug of posponed html parts
+ 
+  METHODS set_title
+    IMPORTING
+      iv_title TYPE string
+    RETURNING
+      VALUE(ri_self) TYPE REF TO zif_abapgit_html.
+ 
+  METHODS add
+    IMPORTING
+      !ig_chunk TYPE any
+    RETURNING
+      VALUE(ri_self) TYPE REF TO zif_abapgit_html.
+ 
+  METHODS render
+    IMPORTING
+      !iv_no_indent_jscss TYPE abap_bool OPTIONAL
+    RETURNING
+      VALUE(rv_html)      TYPE string .
+ 
+  METHODS is_empty
+    RETURNING
+      VALUE(rv_yes) TYPE abap_bool .
+ 
+  METHODS add_a
+    IMPORTING
+      !iv_txt   TYPE string
+      !iv_act   TYPE string
+      !iv_query TYPE string OPTIONAL
+      !iv_typ   TYPE c DEFAULT c_action_type-sapevent
+      !iv_opt   TYPE clike OPTIONAL
+      !iv_class TYPE string OPTIONAL
+      !iv_id    TYPE string OPTIONAL
+      !iv_style TYPE string OPTIONAL
+      !iv_title TYPE string OPTIONAL
+    RETURNING
+      VALUE(ri_self) TYPE REF TO zif_abapgit_html.
+ 
+  METHODS add_checkbox
+    IMPORTING
+      iv_id      TYPE string
+      iv_checked TYPE abap_bool OPTIONAL
+    RETURNING
+      VALUE(ri_self) TYPE REF TO zif_abapgit_html.
+ 
+  METHODS a
+    IMPORTING
+      !iv_txt       TYPE string
+      !iv_act       TYPE string
+      !iv_query     TYPE string OPTIONAL
+      !iv_typ       TYPE c DEFAULT zif_abapgit_html=>c_action_type-sapevent
+      !iv_opt       TYPE clike OPTIONAL
+      !iv_class     TYPE string OPTIONAL
+      !iv_id        TYPE string OPTIONAL
+      !iv_style     TYPE string OPTIONAL
+      !iv_title     TYPE string OPTIONAL
+    RETURNING
+      VALUE(rv_str) TYPE string .
+ 
+  METHODS icon
+    IMPORTING
+      !iv_name      TYPE string
+      !iv_hint      TYPE string OPTIONAL
+      !iv_class     TYPE string OPTIONAL
+      !iv_onclick   TYPE string OPTIONAL
+    RETURNING
+      VALUE(rv_str) TYPE string .
+ 
+  METHODS add_icon
+    IMPORTING
+      !iv_name    TYPE string
+      !iv_hint    TYPE string OPTIONAL
+      !iv_class   TYPE string OPTIONAL
+      !iv_onclick TYPE string OPTIONAL
+    RETURNING
+      VALUE(ri_self) TYPE REF TO zif_abapgit_html.
+ 
+  METHODS wrap
+    IMPORTING
+      !iv_tag     TYPE string
+      !iv_content TYPE string OPTIONAL
+      !ii_content TYPE REF TO zif_abapgit_html OPTIONAL
+      !iv_id      TYPE string OPTIONAL
+      !iv_class   TYPE string OPTIONAL
+      !iv_hint    TYPE string OPTIONAL
+      !iv_format_single_line TYPE abap_bool DEFAULT abap_false
+    RETURNING
+      VALUE(ri_self) TYPE REF TO zif_abapgit_html.
+ 
+  METHODS td
+    IMPORTING
+      !iv_content TYPE string OPTIONAL
+      !ii_content TYPE REF TO zif_abapgit_html OPTIONAL
+      !iv_id      TYPE string OPTIONAL
+      !iv_class   TYPE string OPTIONAL
+      !iv_hint    TYPE string OPTIONAL
+      !iv_format_single_line TYPE abap_bool DEFAULT abap_true
+      PREFERRED PARAMETER iv_content
+    RETURNING
+      VALUE(ri_self) TYPE REF TO zif_abapgit_html.
+ 
+  METHODS th
+    IMPORTING
+      !iv_content TYPE string OPTIONAL
+      !ii_content TYPE REF TO zif_abapgit_html OPTIONAL
+      !iv_id      TYPE string OPTIONAL
+      !iv_class   TYPE string OPTIONAL
+      !iv_hint    TYPE string OPTIONAL
+      !iv_format_single_line TYPE abap_bool DEFAULT abap_true
+      PREFERRED PARAMETER iv_content
+    RETURNING
+      VALUE(ri_self) TYPE REF TO zif_abapgit_html.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_HTML_VIEWER                 ', 'INTERFACE zif_abapgit_html_viewer
+  PUBLIC .
+ 
+ 
+  TYPES:
+    ty_char256 TYPE c LENGTH 256 .
+  TYPES:
+    ty_post_data TYPE STANDARD TABLE OF ty_char256 WITH DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_name_value,
+      name  TYPE c LENGTH 30,
+      value TYPE c LENGTH 250,
+    END OF ty_name_value .
+  TYPES:
+    ty_query_table TYPE STANDARD TABLE OF ty_name_value WITH DEFAULT KEY .
+ 
+  CONSTANTS m_id_sapevent TYPE i VALUE 1 ##NO_TEXT.
+ 
+  EVENTS sapevent
+    EXPORTING
+      VALUE(action) TYPE c OPTIONAL
+      VALUE(frame) TYPE c OPTIONAL
+      VALUE(getdata) TYPE c OPTIONAL
+      VALUE(postdata) TYPE ty_post_data OPTIONAL
+      VALUE(query_table) TYPE ty_query_table OPTIONAL .
+ 
+  METHODS load_data
+    IMPORTING
+      !iv_url          TYPE string OPTIONAL
+      !iv_type         TYPE c DEFAULT ''text''
+      !iv_subtype      TYPE c DEFAULT ''html''
+      !iv_size         TYPE i DEFAULT 0
+    EXPORTING
+      !ev_assigned_url TYPE string
+    CHANGING
+      !ct_data_table   TYPE STANDARD TABLE
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_registered_events
+    IMPORTING
+      !it_events TYPE cntl_simple_events
+    RAISING
+      zcx_abapgit_exception .
+  METHODS show_url
+    IMPORTING
+      !iv_url TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS free .
+  METHODS close_document .
+  METHODS get_url
+    RETURNING
+      VALUE(rv_url) TYPE string .
+  METHODS back .
+  METHODS set_visiblity
+    IMPORTING
+      !iv_visible TYPE abap_bool .
+  METHODS set_focus RAISING zcx_abapgit_exception.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_BUTTONS                 ', 'CLASS zcl_abapgit_gui_buttons DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS new_online
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS new_offline
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS advanced
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS help
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS repo_list
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS settings
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS experimental
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_buttons IMPLEMENTATION.
+ 
+ 
+  METHOD advanced.
+    rv_html_string = \`<i class="icon icon-tools-solid"></i>\`.
+  ENDMETHOD.
+ 
+ 
+  METHOD experimental.
+    rv_html_string = \`<i class="icon icon-vial-solid red"></i>\`.
+  ENDMETHOD.
+ 
+ 
+  METHOD help.
+    rv_html_string = \`<i class="icon icon-question-circle-solid"></i>\`.
+  ENDMETHOD.
+ 
+ 
+  METHOD new_offline.
+    rv_html_string = \`<i class="icon icon-plug"></i> New Offline\`.
+  ENDMETHOD.
+ 
+ 
+  METHOD new_online.
+    rv_html_string = \`<i class="icon icon-cloud-upload-alt"></i> New Online\`.
+  ENDMETHOD.
+ 
+ 
+  METHOD repo_list.
+    rv_html_string = \`<i class="icon icon-bars"></i> Repository List\`.
+  ENDMETHOD.
+ 
+ 
+  METHOD settings.
+    rv_html_string = \`<i class="icon icon-cog"></i> Settings\`.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_CHUNK_LIB               ', 'CLASS zcl_abapgit_gui_chunk_lib DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_event_signature,
+        method TYPE string,
+        name   TYPE string,
+      END OF  ty_event_signature .
+ 
+    CLASS-METHODS class_constructor .
+    CLASS-METHODS render_error
+      IMPORTING
+        !ix_error       TYPE REF TO zcx_abapgit_exception OPTIONAL
+        !iv_error       TYPE string OPTIONAL
+        !iv_extra_style TYPE string OPTIONAL
+      RETURNING
+        VALUE(ri_html)  TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_repo_top
+      IMPORTING
+        !io_repo               TYPE REF TO zcl_abapgit_repo
+        !iv_show_package       TYPE abap_bool DEFAULT abap_true
+        !iv_show_branch        TYPE abap_bool DEFAULT abap_true
+        !iv_show_commit        TYPE abap_bool DEFAULT abap_true
+        !iv_show_edit          TYPE abap_bool DEFAULT abap_false
+        !iv_interactive_branch TYPE abap_bool DEFAULT abap_false
+        !io_news               TYPE REF TO zcl_abapgit_news OPTIONAL
+      RETURNING
+        VALUE(ri_html)         TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_item_state
+      IMPORTING
+        !iv_lstate     TYPE char1
+        !iv_rstate     TYPE char1
+      RETURNING
+        VALUE(rv_html) TYPE string .
+    CLASS-METHODS render_js_error_banner
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_news
+      IMPORTING
+        !io_news       TYPE REF TO zcl_abapgit_news
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_commit_popup
+      IMPORTING
+        !iv_content    TYPE csequence
+        !iv_id         TYPE csequence
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_error_message_box
+      IMPORTING
+        !ix_error      TYPE REF TO zcx_abapgit_exception
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_order_by_header_cells
+      IMPORTING
+        !it_col_spec         TYPE zif_abapgit_definitions=>ty_col_spec_tt
+        !iv_order_by         TYPE string
+        !iv_order_descending TYPE abap_bool
+      RETURNING
+        VALUE(ri_html)       TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_warning_banner
+      IMPORTING
+        !iv_text       TYPE string
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_infopanel
+      IMPORTING
+        !iv_div_id     TYPE string
+        !iv_title      TYPE string
+        !iv_hide       TYPE abap_bool DEFAULT abap_true
+        !iv_hint       TYPE string OPTIONAL
+        !iv_scrollable TYPE abap_bool DEFAULT abap_true
+        !io_content    TYPE REF TO zif_abapgit_html
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_event_as_form
+      IMPORTING
+        !is_event      TYPE ty_event_signature
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_repo_palette
+      IMPORTING
+        iv_action      TYPE string
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS advanced_submenu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS help_submenu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS back_toolbar
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS settings_toolbar
+      IMPORTING
+        !iv_act        TYPE string
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS settings_repo_toolbar
+      IMPORTING
+        !iv_key        TYPE zif_abapgit_persistence=>ty_repo-key
+        !iv_act        TYPE string
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS render_branch_name
+      IMPORTING
+        !iv_branch      TYPE string OPTIONAL
+        !iv_repo_key    TYPE zif_abapgit_persistence=>ty_value OPTIONAL
+        !io_repo        TYPE REF TO zcl_abapgit_repo_online OPTIONAL
+        !iv_interactive TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ri_html)  TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_repo_url
+      IMPORTING
+        iv_url                        TYPE zif_abapgit_persistence=>ty_repo-url
+        iv_render_remote_edit_for_key TYPE zif_abapgit_persistence=>ty_repo-key OPTIONAL
+      RETURNING
+        VALUE(ri_html)                TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_package_name
+      IMPORTING
+        !iv_package        TYPE devclass
+        !iv_interactive    TYPE abap_bool DEFAULT abap_true
+        !iv_suppress_title TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_html)     TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_user_name
+      IMPORTING
+        !iv_username       TYPE syuname
+        !iv_interactive    TYPE abap_bool DEFAULT abap_true
+        !iv_icon_only      TYPE abap_bool DEFAULT abap_false
+        !iv_suppress_title TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_html)     TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_transport
+      IMPORTING
+        !iv_transport   TYPE trkorr
+        !iv_interactive TYPE abap_bool DEFAULT abap_true
+        !iv_icon_only   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_html)  TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_sci_result
+      IMPORTING
+        ii_html       TYPE REF TO zif_abapgit_html
+        iv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result.
+ 
+    CLASS-METHODS render_path
+      IMPORTING
+        !iv_path        TYPE string
+        !iv_interactive TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ri_html)  TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS render_timestamp
+      IMPORTING
+        iv_timestamp       TYPE timestampl
+      RETURNING
+        VALUE(rv_rendered) TYPE string.
+ 
+    CLASS-METHODS render_text_input
+      IMPORTING
+        iv_name        TYPE string
+        iv_label       TYPE string
+        iv_value       TYPE string OPTIONAL
+        iv_max_length  TYPE string OPTIONAL
+        iv_autofocus   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html.
+ 
+    CLASS-METHODS shorten_repo_url
+      IMPORTING
+        iv_full_url         TYPE string
+        iv_max_length       TYPE i DEFAULT 60
+      RETURNING
+        VALUE(rv_shortened) TYPE string.
+ 
+    CLASS-METHODS render_label_list
+      IMPORTING
+        it_labels           TYPE string_table
+        io_label_colors     TYPE REF TO zcl_abapgit_string_map
+        iv_clickable_action TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_html)      TYPE string.
+ 
+    CLASS-METHODS render_help_hint
+      IMPORTING
+        iv_text_to_wrap TYPE string
+      RETURNING
+        VALUE(rv_html)  TYPE string.
+ 
+    CLASS-METHODS get_item_icon
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+    CLASS-METHODS get_item_link
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS render_repo_top_commit_hash
+      IMPORTING
+        !ii_html        TYPE REF TO zif_abapgit_html
+        !io_repo_online TYPE REF TO zcl_abapgit_repo_online
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gv_time_zone TYPE timezone .
+ 
+    CLASS-METHODS get_t100_text
+      IMPORTING
+        !iv_msgid      TYPE scx_t100key-msgid
+        !iv_msgno      TYPE scx_t100key-msgno
+      RETURNING
+        VALUE(rv_text) TYPE string .
+    CLASS-METHODS normalize_program_name
+      IMPORTING
+        !iv_program_name                  TYPE sy-repid
+      RETURNING
+        VALUE(rv_normalized_program_name) TYPE string .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION.
+ 
+ 
+  METHOD advanced_submenu.
+ 
+    DATA lv_supports_ie_devtools TYPE abap_bool.
+ 
+    lv_supports_ie_devtools = zcl_abapgit_ui_factory=>get_frontend_services( )->is_sapgui_for_windows( ).
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add(
+      iv_txt = ''Database Utility''
+      iv_act = zif_abapgit_definitions=>c_action-go_db
+    )->add(
+      iv_txt = ''Package to ZIP''
+      iv_act = zif_abapgit_definitions=>c_action-zip_package
+    )->add(
+      iv_txt = ''Transport to ZIP''
+      iv_act = zif_abapgit_definitions=>c_action-zip_transport
+    )->add(
+      iv_txt = ''Object to Files''
+      iv_act = zif_abapgit_definitions=>c_action-zip_object
+    )->add(
+      iv_txt = ''Debug Info''
+      iv_act = zif_abapgit_definitions=>c_action-go_debuginfo ).
+ 
+    IF lv_supports_ie_devtools = abap_true.
+      ro_menu->add(
+        iv_txt = ''Open IE DevTools''
+        iv_act = zif_abapgit_definitions=>c_action-ie_devtools ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD back_toolbar.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = ''toolbar-back''.
+ 
+    ro_menu->add(
+      iv_txt = ''Back''
+      iv_act = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_constructor.
+ 
+    DATA lv_fm TYPE string.
+    lv_fm = ''GET_SYSTEM_TIMEZONE''.
+ 
+    TRY.
+        CALL METHOD (''CL_ABAP_TSTMP'')=>get_system_timezone
+          RECEIVING
+            system_timezone = gv_time_zone.
+      CATCH cx_sy_dyn_call_illegal_method.
+        CALL FUNCTION lv_fm
+          IMPORTING
+            timezone            = gv_time_zone
+          EXCEPTIONS
+            customizing_missing = 1
+            OTHERS              = 2.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_item_icon.
+ 
+    CASE is_item-obj_type.
+      WHEN ''PROG'' OR ''CLAS'' OR ''FUGR'' OR ''INTF'' OR ''TYPE''.
+        rv_html = zcl_abapgit_html=>icon( iv_name = ''file-code/darkgrey''
+                                          iv_hint = ''Code'' ).
+      WHEN ''W3MI'' OR ''W3HT'' OR ''SFPF''.
+        rv_html = zcl_abapgit_html=>icon( iv_name = ''file-image/darkgrey''
+                                          iv_hint = ''Binary'' ).
+      WHEN ''DEVC''.
+        rv_html = zcl_abapgit_html=>icon( iv_name = ''box/darkgrey''
+                                          iv_hint = ''Package'' ).
+      WHEN ''''.
+        rv_html = space. " no icon
+      WHEN OTHERS.
+        rv_html = zcl_abapgit_html=>icon( ''file-alt/darkgrey'' ).
+    ENDCASE.
+ 
+    IF is_item-is_dir = abap_true.
+      rv_html = zcl_abapgit_html=>icon( iv_name = ''folder/darkgrey''
+                                        iv_hint = ''Folder'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_item_link.
+ 
+    DATA lv_encode TYPE string.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+ 
+    CREATE OBJECT li_html TYPE zcl_abapgit_html.
+ 
+    lv_encode = zcl_abapgit_html_action_utils=>jump_encode(
+      iv_obj_type = is_item-obj_type
+      iv_obj_name = is_item-obj_name ).
+ 
+    rv_html = li_html->a(
+      iv_txt = |{ is_item-obj_name }|
+      iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_encode }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_t100_text.
+ 
+    MESSAGE ID iv_msgid TYPE ''S'' NUMBER iv_msgno WITH ''&1'' ''&2'' ''&3'' ''&4'' INTO rv_text.
+ 
+    " Don''t return any generic messages like \`&1 &2 &3 &4\`
+    IF rv_text CO '' 0123456789&''.
+      CLEAR rv_text.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD help_submenu.
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add(
+      iv_txt = ''Tutorial''
+      iv_act = zif_abapgit_definitions=>c_action-go_tutorial
+    )->add(
+      iv_txt = ''Documentation''
+      iv_act = zif_abapgit_definitions=>c_action-documentation
+    )->add(
+      iv_txt = ''Explore''
+      iv_act = zif_abapgit_definitions=>c_action-go_explore
+    )->add(
+      iv_txt = ''Changelog''
+      iv_act = zif_abapgit_definitions=>c_action-changelog
+    )->add(
+      iv_txt = ''Hotkeys''
+      iv_act = zif_abapgit_definitions=>c_action-show_hotkeys ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_program_name.
+ 
+    rv_normalized_program_name = substring_before(
+      val   = iv_program_name
+      regex = \`(=+CP)?$\` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_branch_name.
+ 
+    DATA:
+      lv_key              TYPE string,
+      lv_branch           TYPE string,
+      lv_selected_commit  TYPE string,
+      lv_commit_short_sha TYPE string,
+      lv_text             TYPE string,
+      lv_icon             TYPE string,
+      lv_hint             TYPE string,
+      lv_class            TYPE string.
+ 
+    IF iv_repo_key IS NOT INITIAL.
+      lv_key = iv_repo_key.
+    ELSEIF io_repo IS BOUND.
+      lv_key = io_repo->get_key( ).
+    ELSE.
+      zcx_abapgit_exception=>raise( ''Either iv_repo_key or io_repo must be supplied'' ).
+    ENDIF.
+ 
+    IF iv_branch IS NOT INITIAL.
+      lv_branch = iv_branch.
+      lv_text = zcl_abapgit_git_branch_list=>get_display_name( lv_branch ).
+    ELSEIF io_repo IS BOUND.
+      lv_selected_commit = io_repo->get_selected_commit( ).
+      IF lv_selected_commit IS NOT INITIAL.
+        "Convert to short commit. Example: (ae623b9...)
+        lv_commit_short_sha = lv_selected_commit+0(7).
+        lv_text = |({ lv_commit_short_sha }...)|.
+      ELSE.
+        lv_branch = io_repo->get_selected_branch( ).
+        lv_text = zcl_abapgit_git_branch_list=>get_display_name( lv_branch ).
+      ENDIF.
+    ELSE.
+      zcx_abapgit_exception=>raise( ''Either iv_branch or io_repo must be supplied'' ).
+    ENDIF.
+ 
+    CASE zcl_abapgit_git_branch_list=>get_type( lv_branch ).
+      WHEN zif_abapgit_git_definitions=>c_git_branch_type-branch.
+        lv_class = ''branch branch_branch''.
+        lv_icon  = ''code-branch/grey70''.
+        lv_hint  = ''Current branch''.
+      WHEN zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag
+        OR zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag.
+        lv_class = ''branch''.
+        lv_icon  = ''tag-solid/grey70''.
+        lv_hint  = ''Current tag''.
+      WHEN OTHERS.
+        lv_class = ''branch branch_branch''.
+        lv_icon  = ''code-branch/grey70''.
+        lv_hint  = ''Current commit''.
+    ENDCASE.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( |<span class="{ lv_class }">| ).
+    ri_html->add_icon( iv_name = lv_icon
+                       iv_hint = lv_hint ).
+    IF iv_interactive = abap_true.
+      ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ lv_key }|
+                      iv_txt = lv_text ).
+    ELSE.
+      ri_html->add( lv_text ).
+    ENDIF.
+    ri_html->add( ''</span>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_commit_popup.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<ul class="hotkeys">'' ).
+    ri_html->add( |<li>| && |<span>{ iv_content }</span>| && |</li>| ).
+    ri_html->add( ''</ul>'' ).
+ 
+    ri_html = render_infopanel(
+      iv_div_id     = |{ iv_id }|
+      iv_title      = ''Commit details''
+      iv_hide       = abap_true
+      iv_scrollable = abap_false
+      io_content    = ri_html ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_error.
+ 
+    DATA lv_error TYPE string.
+    DATA lv_class TYPE string VALUE ''panel error center''.
+ 
+    IF iv_extra_style IS NOT INITIAL.
+      lv_class = lv_class && \` \` && iv_extra_style.
+    ENDIF.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF ix_error IS BOUND.
+      lv_error = ix_error->get_text( ).
+    ELSE.
+      lv_error = iv_error.
+    ENDIF.
+ 
+    ri_html->add( |<div class="{ lv_class }">| ).
+    ri_html->add( |{ ri_html->icon( ''exclamation-circle/red'' ) } { lv_error }| ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_error_message_box.
+ 
+    DATA:
+      lv_error_text          TYPE string,
+      lv_longtext            TYPE string,
+      lt_longtext_paragraphs TYPE string_table,
+      lv_program_name        TYPE sy-repid,
+      lv_title               TYPE string,
+      lv_text                TYPE string.
+    FIELD-SYMBOLS:
+      <lv_longtext_paragraph> TYPE string.
+ 
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_error_text = ix_error->get_text( ).
+    lv_longtext = ix_error->if_message~get_longtext( abap_true ).
+ 
+    IF lv_longtext IS NOT INITIAL.
+      lv_error_text = |{ lv_error_text } <span class="emphasis">More...</span>|.
+ 
+      REPLACE FIRST OCCURRENCE OF REGEX
+        |({ zcx_abapgit_exception=>c_section_text-cause }{ cl_abap_char_utilities=>newline })|
+        IN lv_longtext WITH |<h3>$1</h3>|.
+ 
+      REPLACE FIRST OCCURRENCE OF REGEX
+        |({ zcx_abapgit_exception=>c_section_text-system_response }{ cl_abap_char_utilities=>newline })|
+        IN lv_longtext WITH |<h3>$1</h3>|.
+ 
+      REPLACE FIRST OCCURRENCE OF REGEX
+        |({ zcx_abapgit_exception=>c_section_text-what_to_do }{ cl_abap_char_utilities=>newline })|
+        IN lv_longtext WITH |<h3>$1</h3>|.
+ 
+      REPLACE FIRST OCCURRENCE OF REGEX
+        |({ zcx_abapgit_exception=>c_section_text-sys_admin }{ cl_abap_char_utilities=>newline })|
+        IN lv_longtext WITH |<h3>$1</h3>|.
+ 
+      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf
+        IN lv_longtext
+        WITH cl_abap_char_utilities=>newline.
+ 
+      SPLIT lv_longtext AT cl_abap_char_utilities=>newline INTO TABLE lt_longtext_paragraphs.
+      CLEAR lv_longtext.
+ 
+      LOOP AT lt_longtext_paragraphs ASSIGNING <lv_longtext_paragraph>.
+        CONDENSE <lv_longtext_paragraph>.
+ 
+        IF <lv_longtext_paragraph> IS INITIAL.
+          CONTINUE.
+        ENDIF.
+ 
+        lv_longtext = |{ lv_longtext }<p>{ <lv_longtext_paragraph> }</p>{ cl_abap_char_utilities=>newline }|.
+      ENDLOOP.
+    ENDIF.
+ 
+    ri_html->add( |<div id="message" class="message-panel">| ).
+    ri_html->add( |{ ri_html->icon( ''exclamation-circle/red'' ) } { lv_error_text }| ).
+    ri_html->add( |<div class="message-panel-bar">| ).
+ 
+    ri_html->add_a(
+      iv_txt   = \`&#x274c;\`
+      iv_act   = \`toggleDisplay(''message'')\`
+      iv_class = \`close-btn\`
+      iv_typ   = zif_abapgit_html=>c_action_type-onclick ).
+ 
+    ri_html->add( |</div>| ).
+ 
+    ri_html->add( |<div class="message-panel-bar message-panel-commands">| ).
+ 
+    IF ix_error->if_t100_message~t100key-msgid IS NOT INITIAL.
+ 
+      lv_title = get_t100_text(
+        iv_msgid = ix_error->if_t100_message~t100key-msgid
+        iv_msgno = ix_error->if_t100_message~t100key-msgno ).
+ 
+      IF lv_title IS NOT INITIAL.
+        lv_text = |Message ({ ix_error->if_t100_message~t100key-msgid }/{ ix_error->if_t100_message~t100key-msgno })|.
+ 
+        ri_html->add_a(
+          iv_txt   = lv_text
+          iv_typ   = zif_abapgit_html=>c_action_type-sapevent
+          iv_act   = zif_abapgit_definitions=>c_action-goto_message
+          iv_title = lv_title
+          iv_id    = \`a_goto_message\` ).
+      ENDIF.
+    ENDIF.
+ 
+    ix_error->get_source_position( IMPORTING program_name = lv_program_name ).
+ 
+    lv_title = normalize_program_name( lv_program_name ).
+ 
+    ri_html->add_a(
+      iv_txt   = \`Goto source\`
+      iv_act   = zif_abapgit_definitions=>c_action-goto_source
+      iv_typ   = zif_abapgit_html=>c_action_type-sapevent
+      iv_title = lv_title
+      iv_id    = \`a_goto_source\` ).
+ 
+    ri_html->add_a(
+      iv_txt = \`Callstack\`
+      iv_act = zif_abapgit_definitions=>c_action-show_callstack
+      iv_typ = zif_abapgit_html=>c_action_type-sapevent
+      iv_id  = \`a_callstack\` ).
+ 
+    ri_html->add( |</div>| ).
+    ri_html->add( |<div class="message-panel-commands">| ).
+    ri_html->add( |{ lv_longtext }| ).
+    ri_html->add( |</div>| ).
+    ri_html->add( |</div>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_event_as_form.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add(
+      |<form id="form_{ is_event-name }" method="{ is_event-method }" action="sapevent:{ is_event-name }"></form>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_help_hint.
+ 
+    " TODO potentially move to or integrate with zcl_abapgit_html_form
+ 
+    DATA lt_fragments TYPE string_table.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+    li_html = zcl_abapgit_html=>create( ).
+ 
+    APPEND \`<div class="form-field-help-tooltip">\` TO lt_fragments.
+    APPEND li_html->icon(
+      iv_name = ''question-circle-solid''
+      iv_class = ''blue'' ) TO lt_fragments.
+    APPEND \`<div class="form-field-help-tooltip-text">\` TO lt_fragments.
+    APPEND iv_text_to_wrap TO lt_fragments.
+    APPEND \`</div>\` TO lt_fragments.
+    APPEND \`</div>\` TO lt_fragments.
+ 
+    rv_html = concat_lines_of( table = lt_fragments ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_infopanel.
+ 
+    DATA lv_display TYPE string.
+    DATA lv_class TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_hide = abap_true. " Initially hide
+      lv_display = ''display:none''.
+    ENDIF.
+ 
+    lv_class = ''info-panel''.
+    IF iv_scrollable = abap_false. " Initially hide
+      lv_class = lv_class && '' info-panel-fixed''.
+    ENDIF.
+ 
+    ri_html->add( |<div id="{ iv_div_id }" class="{ lv_class }" style="{ lv_display }">| ).
+ 
+    ri_html->add( |<div class="info-title">{ iv_title }|
+               && ''<div class="float-right">''
+               && ri_html->a(
+                    iv_txt   = ''&#x274c;''
+                    iv_typ   = zif_abapgit_html=>c_action_type-onclick
+                    iv_act   = |toggleDisplay(''{ iv_div_id }'')|
+                    iv_class = ''close-btn'' )
+               && ''</div></div>'' ).
+ 
+    IF iv_hint IS NOT INITIAL.
+      ri_html->add( ''<div class="info-hint">''
+        && ri_html->icon( iv_name = ''exclamation-triangle''
+                          iv_class = ''pad-right'' )
+        && iv_hint
+        && ''</div>'' ).
+    ENDIF.
+ 
+    ri_html->add( |<div class="info-list">| ).
+    ri_html->add( io_content ).
+    ri_html->add( ''</div>'' ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_state.
+ 
+    DATA: lv_system TYPE string.
+ 
+    FIELD-SYMBOLS <lv_state> TYPE char1.
+ 
+ 
+    rv_html = ''<span class="state-block">''.
+ 
+    DO 2 TIMES.
+      CASE sy-index.
+        WHEN 1.
+          ASSIGN iv_lstate TO <lv_state>.
+          lv_system = ''Local:''.
+        WHEN 2.
+          ASSIGN iv_rstate TO <lv_state>.
+          lv_system = ''Remote:''.
+      ENDCASE.
+ 
+      CASE <lv_state>.
+        WHEN zif_abapgit_definitions=>c_state-unchanged.  "None or unchanged
+          IF iv_lstate = zif_abapgit_definitions=>c_state-added OR iv_rstate = zif_abapgit_definitions=>c_state-added.
+            rv_html = rv_html && |<span class="none" title="{ lv_system } Not exists">X</span>|.
+          ELSE.
+            rv_html = rv_html && |<span class="none" title="{ lv_system } No changes">&nbsp;</span>|.
+          ENDIF.
+        WHEN zif_abapgit_definitions=>c_state-modified.   "Changed
+          rv_html = rv_html && |<span class="changed" title="{ lv_system } Modified">M</span>|.
+        WHEN zif_abapgit_definitions=>c_state-added.      "Added new
+          rv_html = rv_html && |<span class="added" title="{ lv_system } Added new">A</span>|.
+        WHEN zif_abapgit_definitions=>c_state-mixed.      "Multiple changes (multifile)
+          rv_html = rv_html && |<span class="mixed" title="{ lv_system } Multiple changes">&#x25A0;</span>|.
+        WHEN zif_abapgit_definitions=>c_state-deleted.    "Deleted
+          rv_html = rv_html && |<span class="deleted" title="{ lv_system } Deleted">D</span>|.
+      ENDCASE.
+    ENDDO.
+ 
+    rv_html = rv_html && ''</span>''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_js_error_banner.
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( ''<div id="js-error-banner" class="dummydiv error">'' ).
+    ri_html->add( |{ ri_html->icon( ''exclamation-triangle/red'' ) }| &&
+                  '' If this does not disappear soon,'' &&
+                  '' then there is a JS init error, please log an issue'' ).
+    ri_html->add( ''</div>'' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD render_label_list.
+ 
+    DATA lt_fragments TYPE string_table.
+    DATA lv_l TYPE string.
+    DATA lv_class TYPE string.
+    DATA lv_style TYPE string.
+    DATA ls_parsed_color TYPE zcl_abapgit_repo_labels=>ty_color.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+ 
+    IF it_labels IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    li_html = zcl_abapgit_html=>create( ).
+ 
+    APPEND \`<ul class="repo-labels">\` TO lt_fragments.
+ 
+    LOOP AT it_labels INTO lv_l WHERE table_line IS NOT INITIAL.
+      CLEAR lv_class.
+      CLEAR lv_style.
+      ls_parsed_color = zcl_abapgit_repo_labels=>parse_color( io_label_colors->get( lv_l ) ).
+      IF ls_parsed_color-cls IS NOT INITIAL.
+        lv_class = | class="rl-{ ls_parsed_color-cls }"|.
+      ELSEIF ls_parsed_color-fg IS NOT INITIAL OR ls_parsed_color-bg IS NOT INITIAL.
+        lv_style = \` style="\`.
+        IF ls_parsed_color-fg IS NOT INITIAL.
+          lv_style = lv_style && |color:#{ ls_parsed_color-fg };|.
+        ENDIF.
+        IF ls_parsed_color-bg IS NOT INITIAL.
+          lv_style = lv_style && |background-color:#{ ls_parsed_color-bg };|.
+          lv_style = lv_style && |border-color:#{ ls_parsed_color-bg };|.
+        ENDIF.
+        lv_style = lv_style && \`"\`.
+      ENDIF.
+ 
+      IF iv_clickable_action IS NOT INITIAL.
+        lv_l = li_html->a(
+          iv_txt = lv_l
+          iv_act = |{ iv_clickable_action }|
+          iv_class = ''command''
+          iv_query = lv_l ).
+      ENDIF.
+      lv_l = |<li{ lv_class }{ lv_style }>{ lv_l }</li>|.
+      APPEND lv_l TO lt_fragments.
+    ENDLOOP.
+ 
+    APPEND \`</ul>\` TO lt_fragments.
+ 
+    rv_html = concat_lines_of( table = lt_fragments ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_news.
+ 
+    DATA: lv_text TYPE string,
+          lv_hint TYPE string,
+          lv_ul   TYPE abap_bool,
+          lt_log  TYPE zcl_abapgit_news=>ty_logs.
+ 
+    FIELD-SYMBOLS: <ls_line> LIKE LINE OF lt_log.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF io_news IS NOT BOUND OR io_news->has_news( ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    lt_log = io_news->get_log( ).
+ 
+    " Render news
+    LOOP AT lt_log ASSIGNING <ls_line>.
+      IF <ls_line>-is_header = abap_true.
+        IF <ls_line>-pos_to_cur > 0.
+          lv_text = <ls_line>-text && ''<span class="version-marker update">update</span>''.
+        ELSEIF <ls_line>-pos_to_cur = 0.
+          lv_text = <ls_line>-text && ''<span class="version-marker">current</span>''.
+        ELSE. " < 0
+          lv_text = <ls_line>-text.
+        ENDIF.
+        IF lv_ul = abap_true.
+          ri_html->add( |</ul>| ).
+        ENDIF.
+        ri_html->add( |<h1>{ lv_text }</h1>| ).
+        ri_html->add( |<ul>| ).
+        lv_ul = abap_true.
+      ELSE.
+        <ls_line>-text = escape( val    = <ls_line>-text
+                                 format = cl_abap_format=>e_html_text ).
+        ri_html->add( |<li>{ <ls_line>-text }</li>| ).
+      ENDIF.
+    ENDLOOP.
+    IF lv_ul = abap_true.
+      ri_html->add( |</ul>| ).
+    ENDIF.
+ 
+    " Wrap
+    IF io_news->has_important( ) = abap_true.
+      lv_hint = ''Please note changes marked with "!"''.
+    ENDIF.
+ 
+    ri_html = render_infopanel(
+      iv_div_id  = ''news''
+      iv_title   = ''Announcement of the latest changes''
+      iv_hint    = lv_hint
+      iv_hide    = boolc( io_news->has_unseen( ) = abap_false )
+      io_content = ri_html ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_order_by_header_cells.
+ 
+    DATA:
+      lv_tmp       TYPE string,
+      lv_disp_name TYPE string.
+ 
+    FIELD-SYMBOLS <ls_col> LIKE LINE OF it_col_spec.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    LOOP AT it_col_spec ASSIGNING <ls_col>.
+      " e.g. <th class="ro-detail">Created at [{ gv_time_zone }]</th>
+      lv_tmp = ''<th''.
+      IF <ls_col>-css_class IS NOT INITIAL.
+        lv_tmp = lv_tmp && | class="{ <ls_col>-css_class }"|.
+      ENDIF.
+      lv_tmp = lv_tmp && ''>''.
+ 
+      IF <ls_col>-display_name IS NOT INITIAL.
+        lv_disp_name = <ls_col>-display_name.
+        IF <ls_col>-add_tz = abap_true.
+          lv_disp_name = lv_disp_name && | [{ gv_time_zone }]|.
+        ENDIF.
+        IF <ls_col>-tech_name = iv_order_by.
+          IF iv_order_descending = abap_true.
+            lv_tmp = lv_tmp && ri_html->a(
+              iv_txt   = lv_disp_name
+              iv_act   = |{ zif_abapgit_definitions=>c_action-change_order_by }|
+              iv_title = <ls_col>-title ).
+          ELSE.
+            lv_tmp = lv_tmp && ri_html->a(
+              iv_txt   = lv_disp_name
+              iv_act   = |{ zif_abapgit_definitions=>c_action-direction }?direction=DESCENDING|
+              iv_title = <ls_col>-title ).
+          ENDIF.
+        ELSEIF <ls_col>-allow_order_by = abap_true.
+          lv_tmp = lv_tmp && ri_html->a(
+            iv_txt   = lv_disp_name
+            iv_act   = |{ zif_abapgit_definitions=>c_action-change_order_by }?orderBy={ <ls_col>-tech_name }|
+            iv_title = <ls_col>-title ).
+        ELSE.
+          lv_tmp = lv_tmp && lv_disp_name.
+        ENDIF.
+      ENDIF.
+      IF <ls_col>-tech_name = iv_order_by
+      AND iv_order_by IS NOT INITIAL.
+        IF iv_order_descending = abap_true.
+          lv_tmp = lv_tmp && | &#x25BE;|. " arrow down
+        ELSE.
+          lv_tmp = lv_tmp && | &#x25B4;|. " arrow up
+        ENDIF.
+      ENDIF.
+ 
+      lv_tmp = lv_tmp && ''</th>''.
+      ri_html->add( lv_tmp ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_package_name.
+ 
+    DATA:
+      lv_obj_name TYPE tadir-obj_name,
+      lv_jump     TYPE string,
+      lv_title    TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_package IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_suppress_title = abap_false.
+      lv_title = zcl_abapgit_factory=>get_sap_package( iv_package )->read_description( ).
+    ENDIF.
+ 
+    lv_obj_name = iv_package.
+    lv_jump = zcl_abapgit_html_action_utils=>jump_encode(
+      iv_obj_type = ''DEVC''
+      iv_obj_name = lv_obj_name ).
+ 
+    ri_html->add( |<span class="package-box">| ).
+    ri_html->add_icon( iv_name = ''box/grey70''
+                       iv_hint = ''SAP package'' ).
+    IF iv_interactive = abap_true.
+      ri_html->add_a( iv_act   = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_jump }|
+                      iv_title = lv_title
+                      iv_txt   = |{ iv_package }| ).
+    ELSE.
+      ri_html->add( iv_package ).
+    ENDIF.
+    ri_html->add( ''</span>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_path.
+ 
+    DATA:
+      lv_path    TYPE string,
+      lv_jump    TYPE string,
+      lv_folder  TYPE string,
+      lt_folders TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_path IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_jump = |{ zcl_abapgit_gui_page_repo_view=>c_actions-change_dir }?PATH=|.
+ 
+    ri_html->add( |<span class="path-box">| ).
+ 
+    IF iv_interactive = abap_true.
+      SPLIT iv_path AT ''/'' INTO TABLE lt_folders.
+ 
+      LOOP AT lt_folders INTO lv_folder.
+        IF lv_folder IS INITIAL.
+          " root
+          lv_path = ''/''.
+        ELSEIF sy-tabix < lines( lt_folders ).
+          lv_path = lv_path && lv_folder && ''/''.
+          ri_html->add_a( iv_act = lv_jump && lv_path
+                          iv_txt = lv_folder ).
+        ELSE.
+          " no link for current folder
+          ri_html->add( | <strong>{ lv_folder }</strong> | ).
+        ENDIF.
+        ri_html->add( ''/'' ).
+      ENDLOOP.
+    ELSE.
+      ri_html->add( iv_path ).
+    ENDIF.
+ 
+    ri_html->add( ''</span>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_palette.
+ 
+    DATA lt_repo_obj_list TYPE zif_abapgit_repo_srv=>ty_repo_list.
+    DATA lt_repo_list TYPE zif_abapgit_persistence=>ty_repos.
+    DATA lv_repo_json TYPE string.
+    DATA lv_size TYPE i.
+    DATA ls_repo_data LIKE LINE OF lt_repo_list.
+ 
+    FIELD-SYMBOLS:
+      <ls_repo>     LIKE LINE OF lt_repo_list,
+      <lr_repo_obj> LIKE LINE OF lt_repo_obj_list.
+ 
+    lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+ 
+    LOOP AT lt_repo_obj_list ASSIGNING <lr_repo_obj>.
+      ls_repo_data = <lr_repo_obj>->ms_data.
+      ls_repo_data-local_settings-display_name = <lr_repo_obj>->get_name( ).
+      APPEND ls_repo_data TO lt_repo_list.
+    ENDLOOP.
+ 
+    lv_size = lines( lt_repo_list ).
+    SORT lt_repo_list BY local_settings-display_name AS TEXT.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''var repoCatalog = ['' ). " Maybe separate this into another method if needed in more places
+    LOOP AT lt_repo_list ASSIGNING <ls_repo>.
+      lv_repo_json = |\\{ key: "{ <ls_repo>-key
+        }", isOffline: "{ <ls_repo>-offline
+        }", displayName: "{ <ls_repo>-local_settings-display_name }"  \\}|.
+      IF sy-tabix < lv_size.
+        lv_repo_json = lv_repo_json && '',''.
+      ENDIF.
+      ri_html->add( lv_repo_json ).
+    ENDLOOP.
+    ri_html->add( ''];'' ).
+ 
+    ri_html->add( |var gGoRepoPalette = new CommandPalette(createRepoCatalogEnumerator(repoCatalog, "{
+      iv_action }"), \\{| ).
+    ri_html->add( ''  toggleKey: "F2",'' ).
+    ri_html->add( ''  hotkeyDescription: "Go to Repository ..."'' ).
+    ri_html->add( ''});'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_top.
+ 
+    DATA: lo_repo_online TYPE REF TO zcl_abapgit_repo_online,
+          lo_pback       TYPE REF TO zcl_abapgit_persist_background,
+          lx_error       TYPE REF TO zcx_abapgit_exception,
+          lv_hint        TYPE string,
+          lv_icon        TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    CREATE OBJECT lo_pback.
+ 
+    IF io_repo->is_offline( ) = abap_true.
+      lv_icon = ''plug/darkgrey''.
+      lv_hint = ''Offline Repository''.
+    ELSE.
+      lv_icon = ''cloud-upload-alt/blue''.
+      lv_hint = ''On-line Repository''.
+    ENDIF.
+ 
+    ri_html->add( ''<table class="w100"><tr>'' ).
+ 
+    ri_html->add( ''<td class="repo_name">'' ).
+ 
+    " Repo type and name
+    ri_html->add_icon( iv_name = lv_icon
+                       iv_hint = lv_hint ).
+    ri_html->add( |<span class="name">{ io_repo->get_name( ) }</span>| ).
+    IF io_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= io_repo.
+ 
+      ri_html->add_a( iv_txt   = lo_repo_online->get_url( )
+                      iv_act   = |{ zif_abapgit_definitions=>c_action-url }?url=|
+                              && |{ lo_repo_online->get_url( ) }|
+                      iv_class = |url| ).
+    ENDIF.
+ 
+    IF iv_show_edit = abap_true.
+      ri_html->add_a( iv_txt   = ri_html->icon( iv_name  = ''edit-solid''
+                                                iv_class = ''pad-sides''
+                                                iv_hint  = ''Change Remote'' )
+                      iv_act   = |{ zif_abapgit_definitions=>c_action-repo_remote_settings }?| &&
+                                 |key={ io_repo->get_key( ) }|
+                      iv_class = |url| ).
+    ENDIF.
+ 
+    IF io_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= io_repo.
+ 
+      ri_html->add_a( iv_txt   = ri_html->icon( iv_name  = ''copy-solid''
+                                                iv_class = ''pad-sides''
+                                                iv_hint  = ''Copy URL to Clipboard'' )
+                      iv_act   = |{ zif_abapgit_definitions=>c_action-clipboard }| &&
+                                 |?clipboard={ lo_repo_online->get_url( ) }|
+                      iv_class = |url| ).
+    ENDIF.
+ 
+    IF io_repo->is_offline( ) = abap_false AND iv_show_commit = abap_true.
+      TRY.
+          render_repo_top_commit_hash( ii_html        = ri_html
+                                       io_repo_online = lo_repo_online ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          " In case of missing or wrong credentials, show message in status bar
+          lv_hint = lx_error->get_text( ).
+          IF lv_hint CS ''credentials''.
+            MESSAGE lv_hint TYPE ''S'' DISPLAY LIKE ''E''.
+          ENDIF.
+      ENDTRY.
+    ENDIF.
+ 
+    " News
+    IF io_news IS BOUND AND io_news->has_news( ) = abap_true.
+      IF io_news->has_updates( ) = abap_true.
+        lv_icon = ''arrow-circle-up/warning''.
+      ELSE.
+        lv_icon = ''arrow-circle-up''.
+      ENDIF.
+      ri_html->add_a( iv_act   = |toggleDisplay(''news'')|
+                      iv_typ   = zif_abapgit_html=>c_action_type-onclick
+                      iv_txt   = ri_html->icon( iv_name  = lv_icon
+                                                iv_class = ''pad-sides''
+                                                iv_hint  = ''Display Changelog'' )
+                      iv_class = |url| ).
+    ENDIF.
+    ri_html->add( ''</td>'' ).
+ 
+    ri_html->add( ''<td class="repo_attr right">'' ).
+ 
+    " Fav
+    IF abap_true = zcl_abapgit_persistence_user=>get_instance( )->is_favorite_repo( io_repo->get_key( ) ).
+      lv_icon = ''star/blue''.
+    ELSE.
+      lv_icon = ''star/grey''.
+    ENDIF.
+    ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?key={ io_repo->get_key( ) }|
+                    iv_txt = ri_html->icon( iv_name  = lv_icon
+                                            iv_class = ''pad-sides''
+                                            iv_hint  = ''Toggle Favorite'' ) ).
+ 
+    " BG
+    IF lo_pback->exists( io_repo->get_key( ) ) = abap_true.
+      ri_html->add( ''<span class="bg_marker" title="background">BG</span>'' ).
+    ENDIF.
+ 
+    " Write protect
+    IF io_repo->get_local_settings( )-write_protected = abap_true.
+      ri_html->add_icon( iv_name = ''lock/grey70''
+                         iv_hint = ''Locked from Pulls'' ).
+    ENDIF.
+ 
+    " Branch
+    IF io_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= io_repo.
+      IF iv_show_branch = abap_true.
+        ri_html->add( render_branch_name( io_repo        = lo_repo_online
+                                          iv_interactive = iv_interactive_branch ) ).
+      ENDIF.
+    ENDIF.
+ 
+    " Package
+    IF iv_show_package = abap_true.
+      ri_html->add( render_package_name( io_repo->get_package( ) ) ).
+    ENDIF.
+ 
+    ri_html->add( ''</td>'' ).
+    ri_html->add( ''</tr></table>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_top_commit_hash.
+ 
+    DATA: lv_commit_hash       TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_commit_short_hash TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_display_url       TYPE zif_abapgit_persistence=>ty_repo-url,
+          lo_url               TYPE REF TO zcl_abapgit_git_url,
+          lv_icon_commit       TYPE string.
+ 
+    lv_commit_hash = io_repo_online->get_current_remote( ).
+    lv_commit_short_hash = lv_commit_hash(7).
+ 
+    lv_icon_commit = ii_html->icon( iv_name  = ''code-commit''
+                                    iv_class = ''pad-sides''
+                                    iv_hint  = ''Commit'' ).
+ 
+    CREATE OBJECT lo_url.
+ 
+    TRY.
+        lv_display_url = lo_url->get_commit_display_url( io_repo_online ).
+ 
+        ii_html->add_a( iv_txt   = |{ lv_icon_commit }{ lv_commit_short_hash }|
+                        iv_act   = |{ zif_abapgit_definitions=>c_action-url }?url={ lv_display_url }|
+                        iv_title = ''Commit''
+                        iv_class = |url| ).
+      CATCH zcx_abapgit_exception.
+        ii_html->add( |<span class="url">{ lv_icon_commit }{ lv_commit_short_hash }</span>| ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_url.
+ 
+    ri_html = zcl_abapgit_html=>create( )->add_a(
+      iv_txt   = shorten_repo_url( iv_url )
+      iv_title = iv_url
+      iv_act   = |{ zif_abapgit_definitions=>c_action-url }?url={ iv_url }| ).
+ 
+    IF iv_render_remote_edit_for_key IS NOT INITIAL.
+      ri_html->add_a(
+        iv_txt   = ri_html->icon(
+          iv_name  = ''edit-solid''
+          iv_class = ''pad-sides''
+          iv_hint  = ''Change remote'' )
+        iv_act   = |{ zif_abapgit_definitions=>c_action-repo_remote_settings }?key={ iv_render_remote_edit_for_key }|
+        iv_class = |remote_repo| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_sci_result.
+ 
+    DATA lv_icon TYPE string.
+ 
+    lv_icon = ii_html->icon(
+      iv_name = ''bug-solid''
+      iv_hint = ''Code inspector result'' ).
+ 
+    CASE iv_sci_result.
+      WHEN zif_abapgit_definitions=>c_sci_result-passed.
+        ii_html->add( |<span class="boxed green-filled-set">{ lv_icon }PASSED</span>| ).
+      WHEN zif_abapgit_definitions=>c_sci_result-failed.
+        ii_html->add( |<span class="boxed red-filled-set">{ lv_icon }FAILED</span>| ).
+      WHEN zif_abapgit_definitions=>c_sci_result-warning.
+        ii_html->add( |<span class="boxed yellow-filled-set">{ lv_icon }WARN</span>| ).
+      WHEN OTHERS. " Including NO_RUN
+        RETURN.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_text_input.
+ 
+    DATA lv_attrs TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_value IS NOT INITIAL.
+      lv_attrs = | value="{ iv_value }"|.
+    ENDIF.
+ 
+    IF iv_max_length IS NOT INITIAL.
+      lv_attrs = lv_attrs && | maxlength="{ iv_max_length }"|.
+    ENDIF.
+ 
+    IF iv_autofocus = abap_true.
+      lv_attrs = lv_attrs && | autofocus|.
+    ENDIF.
+ 
+    ri_html->add( |<label for="{ iv_name }">{ iv_label }</label>| ).
+    ri_html->add( |<input id="{ iv_name }" name="{ iv_name }" type="text"{ lv_attrs }>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_timestamp.
+ 
+    DATA lv_date TYPE d.
+    DATA lv_time TYPE t.
+ 
+    CONVERT TIME STAMP iv_timestamp
+      TIME ZONE gv_time_zone
+      INTO DATE lv_date
+      TIME      lv_time.
+ 
+    rv_rendered = |{ lv_date DATE = USER } { lv_time TIME = USER }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_transport.
+ 
+    DATA:
+      lv_title TYPE string,
+      lv_jump  TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_transport IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_title = zcl_abapgit_factory=>get_cts_api( )->read_description( iv_transport ).
+ 
+    lv_jump = |{ zif_abapgit_definitions=>c_action-jump_transport }?transport={ iv_transport }|.
+ 
+    IF iv_icon_only = abap_true.
+      ri_html->add_a( iv_act   = lv_jump
+                      iv_title = |Transport { iv_transport }|
+                      iv_txt   = zcl_abapgit_html=>icon( ''truck-solid/darkgrey'' ) ).
+    ELSE.
+      ri_html->add( |<span class="transport-box">| ).
+ 
+      ri_html->add_icon( iv_name = ''truck-solid/grey70''
+                         iv_hint = ''Transport'' ).
+      IF iv_interactive = abap_true.
+        ri_html->add_a( iv_act   = lv_jump
+                        iv_title = lv_title
+                        iv_txt   = |{ iv_transport }| ).
+      ELSE.
+        ri_html->add( iv_transport ).
+      ENDIF.
+ 
+      ri_html->add( ''</span>'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_user_name.
+ 
+    DATA:
+      lv_title TYPE string,
+      lv_jump  TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_username IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_username <> zcl_abapgit_objects_super=>c_user_unknown AND iv_suppress_title = abap_false.
+      lv_title = zcl_abapgit_user_record=>get_title( iv_username ).
+    ENDIF.
+ 
+    lv_jump = |{ zif_abapgit_definitions=>c_action-jump_user }?user={ iv_username }|.
+ 
+    IF iv_icon_only = abap_true.
+      ri_html->add_a( iv_act   = lv_jump
+                      iv_title = lv_title
+                      iv_txt   = zcl_abapgit_html=>icon( ''user-solid/darkgrey'' ) ).
+    ELSE.
+      ri_html->add( |<span class="user-box">| ).
+ 
+      ri_html->add_icon( iv_name = ''user-solid/grey70''
+                         iv_hint = ''User name'' ).
+      IF iv_interactive = abap_true AND iv_username <> zcl_abapgit_objects_super=>c_user_unknown.
+        ri_html->add_a( iv_act   = lv_jump
+                        iv_title = lv_title
+                        iv_txt   = |{ iv_username }| ).
+      ELSE.
+        ri_html->add( iv_username ).
+      ENDIF.
+ 
+      ri_html->add( ''</span>'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_warning_banner.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( ''<div class="dummydiv warning">'' ).
+    ri_html->add( |{ ri_html->icon( ''exclamation-triangle/yellow'' ) } { iv_text }| ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD settings_repo_toolbar.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = ''toolbar-repo-settings''.
+ 
+    ro_menu->add(
+      iv_txt = ''Repository''
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_settings )
+    )->add(
+      iv_txt = ''Local''
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_local_settings }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_local_settings )
+    )->add(
+      iv_txt = ''Remote''
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_settings }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_remote_settings )
+    )->add(
+      iv_txt = ''Background''
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_background }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_background )
+    )->add(
+      iv_txt = ''Stats''
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_infos }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_infos ) ).
+ 
+    zcl_abapgit_exit=>get_instance(  )->enhance_repo_toolbar(
+       io_menu = ro_menu
+       iv_key  = iv_key
+       iv_act  = iv_act ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD settings_toolbar.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = ''toolbar-settings''.
+ 
+    ro_menu->add(
+      iv_txt = ''Global''
+      iv_act = zif_abapgit_definitions=>c_action-go_settings
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-go_settings )
+    )->add(
+      iv_txt = ''Personal''
+      iv_act = zif_abapgit_definitions=>c_action-go_settings_personal
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-go_settings_personal ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD shorten_repo_url.
+    DATA lv_new_length TYPE i.
+    DATA lv_length_to_truncate_to TYPE i.
+ 
+    rv_shortened = iv_full_url.
+ 
+    REPLACE FIRST OCCURRENCE OF ''https://'' IN rv_shortened WITH ''''.
+    REPLACE FIRST OCCURRENCE OF ''http://'' IN rv_shortened WITH ''''.
+    IF rv_shortened CP ''*.git''.
+      lv_new_length = strlen( rv_shortened ) - 4.
+      rv_shortened  = rv_shortened(lv_new_length).
+    ENDIF.
+ 
+    IF strlen( rv_shortened ) > iv_max_length.
+      lv_length_to_truncate_to = iv_max_length - 3.
+      rv_shortened = rv_shortened(lv_length_to_truncate_to) && \`...\`.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_COMPONENT               ', 'CLASS zcl_abapgit_gui_component DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_html_parts,
+        scripts      TYPE string VALUE ''scripts'',
+        hidden_forms TYPE string VALUE ''hidden_forms'',
+      END OF c_html_parts.
+ 
+  PROTECTED SECTION.
+ 
+    METHODS register_deferred_script
+      IMPORTING
+        ii_part TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+    METHODS gui_services
+      RETURNING
+        VALUE(ri_gui_services) TYPE REF TO zif_abapgit_gui_services
+      RAISING
+        zcx_abapgit_exception.
+    METHODS register_handlers
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+    DATA mi_gui_services TYPE REF TO zif_abapgit_gui_services.
+ 
+    METHODS register_event_handler
+      IMPORTING
+        ii_event_handler TYPE REF TO zif_abapgit_gui_event_handler OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS register_hotkeys
+      IMPORTING
+        ii_hotkey_provider TYPE REF TO zif_abapgit_gui_hotkeys OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_COMPONENT IMPLEMENTATION.
+ 
+ 
+  METHOD gui_services.
+    IF mi_gui_services IS NOT BOUND.
+      mi_gui_services = zcl_abapgit_ui_factory=>get_gui_services( ).
+    ENDIF.
+    ri_gui_services = mi_gui_services.
+  ENDMETHOD.
+ 
+ 
+  METHOD register_deferred_script.
+    gui_services( )->get_html_parts( )->add_part(
+      iv_collection = c_html_parts-scripts
+      ii_part       = ii_part ).
+  ENDMETHOD.
+ 
+ 
+  METHOD register_event_handler.
+ 
+    DATA li_event_handler TYPE REF TO zif_abapgit_gui_event_handler.
+ 
+    IF ii_event_handler IS BOUND.
+      li_event_handler = ii_event_handler.
+    ELSE.
+      TRY.
+          li_event_handler ?= me.
+        CATCH cx_root.
+          RETURN.
+      ENDTRY.
+    ENDIF.
+ 
+    gui_services( )->register_event_handler( li_event_handler ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD register_handlers.
+    register_event_handler( ).
+    register_hotkeys( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD register_hotkeys.
+ 
+    DATA li_hotkey_provider TYPE REF TO zif_abapgit_gui_hotkeys.
+ 
+    IF ii_hotkey_provider IS BOUND.
+      li_hotkey_provider = ii_hotkey_provider.
+    ELSE.
+      TRY.
+          li_hotkey_provider ?= me.
+        CATCH cx_root.
+          RETURN.
+      ENDTRY.
+    ENDIF.
+ 
+    gui_services( )->get_hotkeys_ctl( )->register_hotkeys( li_hotkey_provider->get_hotkey_actions( ) ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_IN_PAGE_MODAL           ', 'CLASS zcl_abapgit_gui_in_page_modal DEFINITION
+  PUBLIC
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_child      TYPE REF TO zif_abapgit_gui_renderable
+        !iv_width      TYPE i OPTIONAL
+        !iv_height     TYPE i OPTIONAL
+      RETURNING
+        VALUE(ro_wrap) TYPE REF TO zcl_abapgit_gui_in_page_modal
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !ii_child  TYPE REF TO zif_abapgit_gui_renderable
+        !iv_width  TYPE i OPTIONAL
+        !iv_height TYPE i OPTIONAL.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mi_child TYPE REF TO zif_abapgit_gui_renderable.
+ 
+    DATA:
+      BEGIN OF ms_attrs,
+        width  TYPE i,
+        height TYPE i,
+      END OF ms_attrs.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_in_page_modal IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    ms_attrs-width  = iv_width.
+    ms_attrs-height = iv_height.
+    mi_child        = ii_child.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_wrap
+      EXPORTING
+        ii_child  = ii_child
+        iv_width  = iv_width
+        iv_height = iv_height.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lo_style TYPE REF TO zcl_abapgit_string_buffer.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    CREATE OBJECT lo_style.
+ 
+    IF ms_attrs-width IS NOT INITIAL.
+      lo_style->add( |width:{ ms_attrs-width }px;| ).
+    ENDIF.
+    IF ms_attrs-height IS NOT INITIAL.
+      lo_style->add( |height:{ ms_attrs-height }px;| ).
+    ENDIF.
+ 
+    ri_html->add( |<div class="modal" style="{ lo_style->join_w_space_and_flush( ) }">| ).
+    ri_html->add( |<div class="modal-guts">| ).
+    ri_html->add( mi_child->render( ) ).
+    ri_html->add( |</div>| ).
+    ri_html->add( |</div>| ).
+    ri_html->add( |<div class="modal-overlay"></div>| ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE                    ', 'CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT
+  INHERITING FROM zcl_abapgit_gui_component
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_gui_modal,
+      zif_abapgit_gui_renderable,
+      zif_abapgit_gui_event_handler,
+      zif_abapgit_gui_error_handler.
+ 
+    TYPES:
+      BEGIN OF ty_control,
+        page_layout         TYPE string,
+        page_title          TYPE string,
+        page_menu           TYPE REF TO zcl_abapgit_html_toolbar,
+        page_menu_provider  TYPE REF TO zif_abapgit_gui_menu_provider,
+        page_title_provider TYPE REF TO zif_abapgit_gui_page_title,
+        extra_css_url       TYPE string,
+        extra_js_url        TYPE string,
+        show_as_modal       TYPE abap_bool,
+      END OF  ty_control .
+ 
+    METHODS constructor RAISING zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_page_layout,
+        centered   TYPE string VALUE \`centered\`,
+        full_width TYPE string VALUE \`full_width\`,
+      END OF c_page_layout.
+ 
+    DATA ms_control TYPE ty_control .
+ 
+    METHODS render_content " TODO refactor, render child directly
+      ABSTRACT
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings .
+    DATA mx_error TYPE REF TO zcx_abapgit_exception .
+    DATA mo_exception_viewer TYPE REF TO zcl_abapgit_exception_viewer .
+ 
+    METHODS render_deferred_parts
+      IMPORTING
+        !ii_html          TYPE REF TO zif_abapgit_html
+        !iv_part_category TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS html_head
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS header_stylesheet_links
+      IMPORTING
+        ii_html TYPE REF TO zif_abapgit_html .
+    METHODS header_script_links
+      IMPORTING
+        ii_html TYPE REF TO zif_abapgit_html .
+    METHODS title
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS footer
+      IMPORTING
+        !iv_time       TYPE string
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_link_hints
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_browser_control_warning
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_command_palettes
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_hotkey_overview
+      RETURNING
+        VALUE(ro_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_error_message_box
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_version_details
+      RETURNING
+        VALUE(rv_version) TYPE string.
+    METHODS is_edge_control_warning_needed
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+    ms_control-page_layout = c_page_layout-centered.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD footer.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div id="footer">'' ).
+    ri_html->add( ''<table class="w100"><tr>'' ).
+ 
+    ri_html->add( ''<td class="w40 sponsor">'' ).
+    ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-sponsor
+                    iv_txt = ri_html->icon( iv_name = ''heart-regular/pink''
+                                            iv_hint = ''Sponsor us'' ) ).
+    ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-sponsor
+                    iv_txt = ''Sponsor us'' ).
+    ri_html->add( ''</td>'' ).
+ 
+    ri_html->add( ''<td class="center">'' ).
+    ri_html->add( ''<div class="logo">'' ).
+    ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-homepage
+                    iv_txt = ri_html->icon( ''git-alt'' ) ).
+    ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-homepage
+                    iv_txt = ri_html->icon( iv_name = ''abapgit''
+                                            iv_hint = iv_time ) ).
+    ri_html->add( ''</div>'' ).
+    ri_html->add( |<div id="footer-version" class="version">{ get_version_details( ) }</div>| ).
+    ri_html->add( ''</td>'' ).
+ 
+    ri_html->add( ''<td id="debug-output" class="w40"></td>'' ).
+ 
+    ri_html->add( ''</tr></table>'' ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_version_details.
+ 
+    DATA lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    rv_version = zif_abapgit_version=>c_abap_version.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      rv_version = rv_version && \` - Standalone Version\`.
+    ELSE.
+      rv_version = rv_version && \` - Developer Version\`.
+    ENDIF.
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    CASE abap_true.
+      WHEN lo_frontend_serv->is_webgui( ).
+        rv_version = rv_version && \` - Web\`.
+      WHEN lo_frontend_serv->is_sapgui_for_windows( ).
+        rv_version = rv_version && \` - Win\`.
+      WHEN lo_frontend_serv->is_sapgui_for_java( ).
+        rv_version = rv_version && \` - Java\`.
+      WHEN OTHERS.
+* eg. open-abap?
+        rv_version = rv_version && \` - Unknown\`.
+    ENDCASE.
+ 
+    " Will be filled by JS method displayBrowserControlFooter
+    rv_version = rv_version && ''<span id="browser-control-footer"></span>''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD header_script_links.
+ 
+    ii_html->add( ''<script src="js/common.js"></script>'' ).
+ 
+    IF ms_control-extra_js_url IS NOT INITIAL.
+      ii_html->add( |<script src="{ ms_control-extra_js_url }"></script>| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD header_stylesheet_links.
+ 
+    ii_html->add( ''<link rel="stylesheet" type="text/css" href="css/common.css">'' ).
+    ii_html->add( ''<link rel="stylesheet" type="text/css" href="css/ag-icons.css">'' ).
+ 
+    " Themes
+    ii_html->add( ''<link rel="stylesheet" type="text/css" href="css/theme-default.css">'' ). " Theme basis
+    CASE mo_settings->get_ui_theme( ).
+      WHEN zcl_abapgit_settings=>c_ui_theme-dark.
+        ii_html->add( ''<link rel="stylesheet" type="text/css" href="css/theme-dark.css">'' ).
+      WHEN zcl_abapgit_settings=>c_ui_theme-belize.
+        ii_html->add( ''<link rel="stylesheet" type="text/css" href="css/theme-belize-blue.css">'' ).
+    ENDCASE.
+ 
+    " Page stylesheets
+    IF ms_control-extra_css_url IS NOT INITIAL.
+      ii_html->add( |<link rel="stylesheet" type="text/css" href="{ ms_control-extra_css_url }">| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD html_head.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<head>'' ).
+ 
+    ri_html->add( ''<meta http-equiv="content-type" content="text/html; charset=utf-8">'' ).
+    ri_html->add( ''<meta http-equiv="X-UA-Compatible" content="IE=11,10,9,8" />'' ).
+ 
+    ri_html->add( ''<title>abapGit</title>'' ).
+ 
+    header_stylesheet_links( ri_html ).
+    header_script_links( ri_html ).
+ 
+    CASE mo_settings->get_icon_scaling( ). " Enforce icon scaling
+      WHEN mo_settings->c_icon_scaling-large.
+        ri_html->add( ''<style>.icon { font-size: 200% }</style>'' ).
+      WHEN mo_settings->c_icon_scaling-small.
+        ri_html->add( ''<style>.icon.large { font-size: inherit }</style>'' ).
+    ENDCASE.
+ 
+    ri_html->add( ''</head>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_browser_control_warning.
+ 
+    DATA li_documentation_link TYPE REF TO zif_abapgit_html.
+ 
+    CREATE OBJECT li_documentation_link TYPE zcl_abapgit_html.
+ 
+    li_documentation_link->add_a(
+        iv_txt = ''Documentation''
+        iv_typ = zif_abapgit_html=>c_action_type-url
+        iv_act =  ''https://docs.abapgit.org/guide-sapgui.html#sap-gui-for-windows'' ).
+ 
+    ii_html->add( ''<div id="browser-control-warning" class="browser-control-warning">'' ).
+    ii_html->add( zcl_abapgit_gui_chunk_lib=>render_warning_banner(
+                    |Attention: You use Edge browser control. |
+                 && |There are several known malfunctions. See |
+                 && li_documentation_link->render( ) ) ).
+    ii_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_command_palettes.
+ 
+    ii_html->add( ''var gCommandPalette = new CommandPalette(enumerateUiActions, {'' ).
+    ii_html->add( ''  toggleKey: "F1",'' ).
+    ii_html->add( ''  hotkeyDescription: "Command ..."'' ).
+    ii_html->add( ''});'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_deferred_parts.
+ 
+    DATA lt_parts TYPE zif_abapgit_html=>ty_table_of.
+    DATA li_part LIKE LINE OF lt_parts.
+ 
+    lt_parts = gui_services( )->get_html_parts( )->get_parts( iv_part_category ).
+    LOOP AT lt_parts INTO li_part.
+      ii_html->add( li_part ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_error_message_box.
+ 
+    " You should remember that the we have to instantiate ro_html even
+    " it''s overwritten further down. Because ADD checks whether it''s
+    " bound.
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " You should remember that we render the message panel only
+    " if we have an error.
+    IF mx_error IS NOT BOUND.
+      RETURN.
+    ENDIF.
+ 
+    ri_html = zcl_abapgit_gui_chunk_lib=>render_error_message_box( mx_error ).
+ 
+    " You should remember that the exception viewer dispatches the events of
+    " error message panel
+    CREATE OBJECT mo_exception_viewer
+      EXPORTING
+        ix_error = mx_error.
+ 
+    " You should remember that we render the message panel just once
+    " for each exception/error text.
+    CLEAR:
+      mx_error.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_hotkey_overview.
+ 
+    DATA lo_hotkeys_component TYPE REF TO zif_abapgit_gui_renderable.
+ 
+    lo_hotkeys_component ?= gui_services( )->get_hotkeys_ctl( ). " Mmmm ...
+    ro_html = lo_hotkeys_component->render( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_link_hints.
+ 
+    DATA: lv_link_hint_key TYPE c LENGTH 1.
+ 
+    lv_link_hint_key = mo_settings->get_link_hint_key( ).
+ 
+    IF mo_settings->get_link_hints_enabled( ) = abap_true AND lv_link_hint_key IS NOT INITIAL.
+ 
+      ii_html->add( |activateLinkHints("{ lv_link_hint_key }");| ).
+      ii_html->add( |setInitialFocusWithQuerySelector(''#header'', false);| ).
+      ii_html->add( |enableArrowListNavigation();| ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    render_deferred_parts(
+      ii_html          = ri_html
+      iv_part_category = c_html_parts-scripts ).
+ 
+    render_link_hints( ri_html ).
+    render_command_palettes( ri_html ).
+    ri_html->add( |toggleBrowserControlWarning();| ).
+    ri_html->add( |displayBrowserControlFooter();| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD title.
+ 
+    DATA lo_page_menu LIKE ms_control-page_menu.
+    DATA lv_page_title TYPE string.
+ 
+    lo_page_menu = ms_control-page_menu.
+    IF lo_page_menu IS NOT BOUND AND ms_control-page_menu_provider IS BOUND.
+      lo_page_menu = ms_control-page_menu_provider->get_menu( ).
+    ENDIF.
+ 
+    lv_page_title = ms_control-page_title.
+    IF ms_control-page_title_provider IS BOUND.
+      lv_page_title = ms_control-page_title_provider->get_page_title( ).
+    ENDIF.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div id="header">'' ).
+ 
+    ri_html->add( ''<div class="logo">'' ).
+    ri_html->add_a(
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home
+      iv_txt = ri_html->icon( ''git-alt'' ) ).
+    ri_html->add_a(
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home
+      iv_txt = ri_html->icon( ''abapgit'' ) ).
+    ri_html->add( ''</div>'' ).
+ 
+    ri_html->add( |<div class="page-title"><span class="spacer">&#x25BA;</span>{ lv_page_title }</div>| ).
+ 
+    IF lo_page_menu IS BOUND.
+      ri_html->add( ''<div class="float-right">'' ).
+      ri_html->add( lo_page_menu->render( iv_right = abap_true ) ).
+      ri_html->add( ''</div>'' ).
+    ENDIF.
+ 
+    IF is_edge_control_warning_needed( ) = abap_true.
+      render_browser_control_warning( ri_html ).
+    ENDIF.
+ 
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_error_handler~handle_error.
+ 
+    mx_error = ix_error.
+    rv_handled = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-goto_source.
+ 
+        IF mo_exception_viewer IS BOUND.
+          mo_exception_viewer->goto_source( ).
+        ENDIF.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-show_callstack.
+ 
+        IF mo_exception_viewer IS BOUND.
+          mo_exception_viewer->show_callstack( ).
+        ENDIF.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-goto_message.
+ 
+        IF mo_exception_viewer IS BOUND.
+          mo_exception_viewer->goto_message( ).
+        ENDIF.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_modal~is_modal.
+    rv_yes = boolc( ms_control-show_as_modal = abap_true ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA:
+      li_script TYPE REF TO zif_abapgit_html,
+      lo_timer  TYPE REF TO zcl_abapgit_timer.
+ 
+    register_handlers( ).
+ 
+    lo_timer = zcl_abapgit_timer=>create( )->start( ).
+ 
+    " Real page
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<!DOCTYPE html>'' ).
+    ri_html->add( ''<html lang="en">'' ).
+    ri_html->add( html_head( ) ).
+    ri_html->add( |<body class="{ ms_control-page_layout }">| ).
+ 
+    ri_html->add( title( ) ).
+ 
+    ri_html->add( ''<div class="not_sticky">'' ).
+ 
+    ri_html->add( render_content( ) ). " TODO -> render child
+ 
+    ri_html->add( render_hotkey_overview( ) ).
+    ri_html->add( render_error_message_box( ) ).
+ 
+    render_deferred_parts(
+      ii_html          = ri_html
+      iv_part_category = c_html_parts-hidden_forms ).
+ 
+    ri_html->add( footer( lo_timer->end( ) ) ).
+ 
+    ri_html->add( ''</div>'' ).
+ 
+    li_script = scripts( ).
+ 
+    IF li_script IS BOUND AND li_script->is_empty( ) = abap_false.
+      ri_html->add( ''<script>'' ).
+      ri_html->add( li_script ).
+      ri_html->add( ''confirmInitialized();'' ).
+      ri_html->add( ''</script>'' ).
+    ENDIF.
+ 
+    ri_html->add( ''</body>'' ).
+    ri_html->add( ''</html>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_edge_control_warning_needed.
+ 
+    DATA:
+      lv_gui_release       TYPE zif_abapgit_frontend_services=>ty_gui_release,
+      lv_gui_sp            TYPE zif_abapgit_frontend_services=>ty_gui_sp,
+      lv_gui_patch         TYPE zif_abapgit_frontend_services=>ty_gui_patch,
+      li_frontend_services TYPE REF TO zif_abapgit_frontend_services.
+ 
+    " With SAGUI 8.00 PL3 and 7.70 PL13 edge browser control is basically working.
+    " For lower releases we render the browser control warning
+    " an toggle it via JS function toggleBrowserControlWarning.
+ 
+    rv_result = abap_true.
+ 
+    TRY.
+        li_frontend_services = zcl_abapgit_ui_factory=>get_frontend_services( ).
+        li_frontend_services->get_gui_version(
+          IMPORTING
+            ev_gui_release        = lv_gui_release
+            ev_gui_sp             = lv_gui_sp
+            ev_gui_patch          = lv_gui_patch ).
+ 
+      CATCH zcx_abapgit_exception.
+        RETURN.
+    ENDTRY.
+ 
+    IF lv_gui_release >= ''7700'' AND lv_gui_sp >= ''1'' AND lv_gui_patch >= ''13''
+    OR lv_gui_release >= ''8000'' AND lv_gui_sp >= ''1'' AND lv_gui_patch >= ''3''.
+      rv_result = abap_false.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_HOC                ', 'CLASS zcl_abapgit_gui_page_hoc DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_child_component     TYPE REF TO zif_abapgit_gui_renderable
+        !iv_page_title          TYPE string OPTIONAL
+        !iv_page_layout         TYPE string DEFAULT zcl_abapgit_gui_page=>c_page_layout-centered
+        !io_page_menu           TYPE REF TO zcl_abapgit_html_toolbar OPTIONAL
+        !ii_page_menu_provider  TYPE REF TO zif_abapgit_gui_menu_provider OPTIONAL
+        !ii_page_title_provider TYPE REF TO zif_abapgit_gui_page_title OPTIONAL
+        !iv_extra_css_url       TYPE string OPTIONAL
+        !iv_extra_js_url        TYPE string OPTIONAL
+        !iv_show_as_modal       TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_page_wrap)     TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_child
+      RETURNING
+        VALUE(ri_child) TYPE REF TO zif_abapgit_gui_renderable.
+    METHODS constructor
+      IMPORTING
+        !ii_child_component TYPE REF TO zif_abapgit_gui_renderable
+        !is_control         TYPE zcl_abapgit_gui_page=>ty_control
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+ 
+    METHODS render_content
+        REDEFINITION.
+  PRIVATE SECTION.
+ 
+    DATA mi_child TYPE REF TO zif_abapgit_gui_renderable .
+ 
+    METHODS detect_modal
+      RETURNING
+        VALUE(rv_is_modal) TYPE abap_bool.
+ 
+    METHODS detect_menu_provider
+      RETURNING
+        VALUE(ri_ref) TYPE REF TO zif_abapgit_gui_menu_provider.
+ 
+    METHODS detect_title_provider
+      RETURNING
+        VALUE(ri_ref) TYPE REF TO zif_abapgit_gui_page_title.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_hoc IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    mi_child = ii_child_component.
+    ms_control = is_control.
+ 
+    IF ms_control-show_as_modal = abap_false.
+      ms_control-show_as_modal = detect_modal( ).
+    ENDIF.
+ 
+    IF ms_control-page_menu_provider IS NOT BOUND.
+      ms_control-page_menu_provider = detect_menu_provider( ).
+    ENDIF.
+ 
+    IF ms_control-page_title_provider IS NOT BOUND.
+      ms_control-page_title_provider = detect_title_provider( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_page TYPE REF TO zcl_abapgit_gui_page_hoc.
+    DATA ls_control TYPE zcl_abapgit_gui_page=>ty_control.
+ 
+    ls_control-page_title          = iv_page_title.
+    ls_control-page_layout         = iv_page_layout.
+    ls_control-page_menu           = io_page_menu.
+    ls_control-page_menu_provider  = ii_page_menu_provider.
+    ls_control-page_title_provider = ii_page_title_provider.
+    ls_control-extra_css_url       = iv_extra_css_url.
+    ls_control-extra_js_url        = iv_extra_js_url.
+    ls_control-show_as_modal       = iv_show_as_modal.
+ 
+    CREATE OBJECT lo_page
+      EXPORTING
+        ii_child_component = ii_child_component
+        is_control         = ls_control.
+ 
+    ri_page_wrap = lo_page.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD detect_menu_provider.
+    TRY.
+        ri_ref ?= mi_child.
+      CATCH cx_sy_move_cast_error.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD detect_modal.
+ 
+    DATA li_modal TYPE REF TO zif_abapgit_gui_modal.
+ 
+    TRY.
+        li_modal ?= mi_child.
+        rv_is_modal = li_modal->is_modal( ).
+      CATCH cx_sy_move_cast_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD detect_title_provider.
+    TRY.
+        ri_ref ?= mi_child.
+      CATCH cx_sy_move_cast_error.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_child.
+    ri_child = mi_child.
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    IF mi_child IS BOUND.
+      ri_html = mi_child->render( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PICKLIST                ', 'CLASS zcl_abapgit_gui_picklist DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+    INTERFACES zif_abapgit_gui_page_title.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_list          TYPE STANDARD TABLE
+        !iv_id            TYPE string OPTIONAL
+        !iv_in_page       TYPE abap_bool DEFAULT abap_false
+        !iv_title         TYPE string DEFAULT ''Choose from list''
+        !iv_attr_name     TYPE abap_compname OPTIONAL
+        !ii_item_renderer TYPE REF TO zif_abapgit_gui_render_item OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_result_idx
+      RETURNING
+        VALUE(rv_index) TYPE i.
+    METHODS get_result_item
+      CHANGING
+        !cs_selected TYPE any.
+    METHODS was_cancelled
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+    METHODS is_fulfilled
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+    METHODS id
+      RETURNING
+        VALUE(rv_id) TYPE string.
+    METHODS is_in_page
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+    METHODS set_id
+      IMPORTING
+        iv_id        TYPE string
+      RETURNING
+        VALUE(ro_me) TYPE REF TO zcl_abapgit_gui_picklist.
+    METHODS set_in_page
+      IMPORTING
+        iv_in_page   TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ro_me) TYPE REF TO zcl_abapgit_gui_picklist.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        back   TYPE string VALUE ''back'',
+        choose TYPE string VALUE ''choose'',
+      END OF c_event.
+ 
+    CONSTANTS c_radio_name TYPE string VALUE ''radio''.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mr_list TYPE REF TO data.
+    DATA mv_selected TYPE i.
+    DATA mv_cancelled TYPE abap_bool.
+    DATA mv_fulfilled TYPE abap_bool.
+    DATA mv_attr_name TYPE abap_compname.
+    DATA mi_item_renderer TYPE REF TO zif_abapgit_gui_render_item.
+    DATA mv_in_page TYPE abap_bool.
+    DATA mv_id TYPE string.
+    DATA mv_title TYPE string.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception.
+    METHODS return_state
+      RETURNING
+        VALUE(rv_state) TYPE zif_abapgit_gui_event_handler=>ty_handling_result-state.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_picklist IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    FIELD-SYMBOLS <lt_tab> TYPE STANDARD TABLE.
+ 
+    super->constructor( ).
+ 
+    " copy contents of table to local scope
+    CREATE DATA mr_list LIKE it_list.
+    ASSIGN mr_list->* TO <lt_tab>.
+    APPEND LINES OF it_list TO <lt_tab>.
+ 
+    mv_attr_name = to_upper( iv_attr_name ).
+    mi_item_renderer = ii_item_renderer.
+    mv_in_page = iv_in_page.
+    mv_id      = iv_id.
+    mv_title   = iv_title.
+ 
+    IF mi_item_renderer IS NOT BOUND AND mv_attr_name IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Renderer or attr name required'' ).
+    ENDIF.
+ 
+    CREATE OBJECT mo_form_data.
+    CREATE OBJECT mo_validation_log.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    FIELD-SYMBOLS <lt_list> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lv_val> TYPE any.
+    FIELD-SYMBOLS <ls_row> TYPE any.
+    DATA lv_index TYPE i.
+    DATA lv_label TYPE string.
+ 
+    ro_form = zcl_abapgit_html_form=>create( ).
+ 
+    ro_form->radio(
+      iv_name     = c_radio_name
+      iv_label    = mv_title ).
+ 
+    ASSIGN mr_list->* TO <lt_list>.
+    LOOP AT <lt_list> ASSIGNING <ls_row>.
+      lv_index = sy-tabix.
+ 
+      IF mv_attr_name IS NOT INITIAL.
+        ASSIGN COMPONENT mv_attr_name OF STRUCTURE <ls_row> TO <lv_val>.
+        ASSERT sy-subrc = 0.
+        lv_label = <lv_val>.
+      ELSEIF mi_item_renderer IS BOUND.
+        lv_label = mi_item_renderer->render(
+          iv_item  = <ls_row>
+          iv_index = lv_index )->render( ).
+      ENDIF.
+ 
+      ro_form->option(
+        iv_label = lv_label
+        iv_value = |{ lv_index }| ).
+ 
+    ENDLOOP.
+ 
+    ro_form->command(
+      iv_label    = ''Choose''
+      iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action   = c_event-choose
+    )->command(
+      iv_label    = ''Back''
+      iv_action   = c_event-back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_result_idx.
+    rv_index = mv_selected.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_result_item.
+ 
+    FIELD-SYMBOLS <lt_tab> TYPE STANDARD TABLE.
+ 
+    CLEAR cs_selected.
+ 
+    IF mv_selected > 0.
+      ASSIGN mr_list->* TO <lt_tab>.
+      READ TABLE <lt_tab> INDEX mv_selected INTO cs_selected.
+      ASSERT sy-subrc = 0.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD id.
+    rv_id = mv_id.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_fulfilled.
+    rv_yes = mv_fulfilled.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_in_page.
+    rv_yes = mv_in_page.
+  ENDMETHOD.
+ 
+ 
+  METHOD return_state.
+    IF mv_in_page = abap_true.
+      rv_state = zcl_abapgit_gui=>c_event_state-re_render.
+    ELSE.
+      rv_state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_id.
+    mv_id = iv_id.
+    ro_me = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_in_page.
+    mv_in_page = iv_in_page.
+    ro_me = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD was_cancelled.
+    rv_yes = mv_cancelled.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+    mo_validation_log->clear( ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-back OR zif_abapgit_definitions=>c_action-go_back.
+        " Handle go_back as a "graceful back" - implicit cancel by F3/ESC
+        mv_fulfilled = abap_true.
+        mv_cancelled = abap_true.
+        rs_handled-state = return_state( ).
+      WHEN c_event-choose.
+        mv_selected = mo_form_data->get( c_radio_name ).
+        IF mv_selected = 0.
+          mo_validation_log->set(
+            iv_key = c_radio_name
+            iv_val = ''You have to select one item'' ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          mv_fulfilled = abap_true.
+          rs_handled-state = return_state( ).
+        ENDIF.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_page_title~get_page_title.
+    rv_title = mv_title.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    ri_html = zcl_abapgit_html=>create( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    register_handlers( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTML_ACTION_UTILS           ', 'CLASS zcl_abapgit_html_action_utils DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS parse_post_form_data
+      IMPORTING
+        !it_post_data    TYPE zif_abapgit_html_viewer=>ty_post_data
+        !iv_upper_cased  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_fields) TYPE tihttpnvp .
+    CLASS-METHODS parse_fields
+      IMPORTING
+        !iv_string       TYPE clike
+        !iv_upper_cased  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_fields) TYPE tihttpnvp .
+    CLASS-METHODS jump_encode
+      IMPORTING
+        !iv_obj_type     TYPE tadir-object
+        !iv_obj_name     TYPE tadir-obj_name
+        !iv_filename     TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS dir_encode
+      IMPORTING
+        !iv_path         TYPE string
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS file_encode
+      IMPORTING
+        !iv_key          TYPE zif_abapgit_persistence=>ty_repo-key
+        !ig_file         TYPE any
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS obj_encode
+      IMPORTING
+        !iv_key          TYPE zif_abapgit_persistence=>ty_repo-key
+        !ig_object       TYPE any
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS class_constructor .
+    CLASS-METHODS dbkey_encode
+      IMPORTING
+        !is_key          TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rv_string) TYPE string .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gv_non_breaking_space TYPE string .
+ 
+    CLASS-METHODS parse_fields_upper_case_name
+      IMPORTING
+        !iv_string       TYPE clike
+      RETURNING
+        VALUE(rt_fields) TYPE tihttpnvp .
+    CLASS-METHODS translate_postdata
+      IMPORTING
+        !it_postdata     TYPE zif_abapgit_html_viewer=>ty_post_data
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS field_keys_to_upper
+      CHANGING
+        !ct_fields TYPE tihttpnvp .
+    CLASS-METHODS add_field
+      IMPORTING
+        !iv_name  TYPE string
+        !ig_field TYPE any
+      CHANGING
+        !ct_field TYPE tihttpnvp .
+    CLASS-METHODS unescape
+      IMPORTING
+        !iv_string       TYPE string
+      RETURNING
+        VALUE(rv_string) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
+ 
+ 
+  METHOD add_field.
+ 
+    DATA ls_field LIKE LINE OF ct_field.
+ 
+    FIELD-SYMBOLS <lg_src> TYPE any.
+ 
+    ls_field-name = iv_name.
+ 
+    CASE cl_abap_typedescr=>describe_by_data( ig_field )->kind.
+      WHEN cl_abap_typedescr=>kind_elem.
+        ls_field-value = ig_field.
+      WHEN cl_abap_typedescr=>kind_struct.
+        ASSIGN COMPONENT iv_name OF STRUCTURE ig_field TO <lg_src>.
+        ASSERT <lg_src> IS ASSIGNED.
+        ls_field-value = <lg_src>.
+      WHEN OTHERS.
+        ASSERT 0 = 1.
+    ENDCASE.
+ 
+    APPEND ls_field TO ct_field.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_constructor.
+ 
+    CONSTANTS lc_nbsp TYPE xstring VALUE ''C2A0''. " &nbsp;
+ 
+    TRY.
+        gv_non_breaking_space = zcl_abapgit_convert=>xstring_to_string_utf8( lc_nbsp ).
+      CATCH zcx_abapgit_exception.
+        ASSERT 0 = 1.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dbkey_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+ 
+    add_field( EXPORTING iv_name = ''TYPE''
+                         ig_field = is_key-type CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = ''VALUE''
+                         ig_field = is_key-value CHANGING ct_field = lt_fields ).
+ 
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dir_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+    add_field( EXPORTING iv_name = ''PATH''
+                         ig_field = iv_path CHANGING ct_field = lt_fields ).
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD field_keys_to_upper.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF ct_fields.
+ 
+    LOOP AT ct_fields ASSIGNING <ls_field>.
+      <ls_field>-name = to_upper( <ls_field>-name ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD file_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+ 
+ 
+    add_field( EXPORTING iv_name = ''KEY''
+                         ig_field = iv_key CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = ''PATH''
+                         ig_field = ig_file CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = ''FILENAME''
+                         ig_field = ig_file CHANGING ct_field = lt_fields ).
+ 
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+ 
+ 
+    add_field( EXPORTING iv_name = ''TYPE''
+                         ig_field = iv_obj_type CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = ''NAME''
+                         ig_field = iv_obj_name CHANGING ct_field = lt_fields ).
+ 
+    IF iv_filename IS NOT INITIAL.
+      add_field( EXPORTING iv_name = ''FILE''
+                           ig_field = iv_filename CHANGING ct_field = lt_fields ).
+    ENDIF.
+ 
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD obj_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+ 
+ 
+    add_field( EXPORTING iv_name = ''KEY''
+                         ig_field = iv_key CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = ''OBJ_TYPE''
+                         ig_field = ig_object CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = ''OBJ_NAME''
+                         ig_field = ig_object CHANGING ct_field = lt_fields ).
+ 
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_fields.
+ 
+    DATA:
+      lt_substrings TYPE string_table,
+      ls_field      LIKE LINE OF rt_fields.
+ 
+    FIELD-SYMBOLS <lv_substring> LIKE LINE OF lt_substrings.
+ 
+    SPLIT iv_string AT ''&'' INTO TABLE lt_substrings.
+ 
+    LOOP AT lt_substrings ASSIGNING <lv_substring>.
+ 
+      CLEAR ls_field.
+      " On attempt to change unescaping -> run unit tests to check !
+ 
+      " Unescape name and value separately
+      ls_field-name = unescape( substring_before(
+        val = <lv_substring>
+        sub = ''='' ) ).
+ 
+      ls_field-value = unescape( substring_after(
+        val = <lv_substring>
+        sub = ''='' ) ).
+ 
+      IF ls_field IS INITIAL. " Not a field with proper structure
+        CONTINUE.
+      ENDIF.
+ 
+      APPEND ls_field TO rt_fields.
+ 
+    ENDLOOP.
+ 
+    IF iv_upper_cased = abap_true.
+      field_keys_to_upper( CHANGING ct_fields = rt_fields ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_fields_upper_case_name.
+ 
+    rt_fields = parse_fields(
+      iv_string      = iv_string
+      iv_upper_cased = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_post_form_data.
+ 
+    DATA lv_serialized_post_data TYPE string.
+ 
+    lv_serialized_post_data = translate_postdata( it_post_data ).
+    IF iv_upper_cased = abap_true.
+      rt_fields = parse_fields_upper_case_name( lv_serialized_post_data ).
+    ELSE.
+      rt_fields = parse_fields( lv_serialized_post_data ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD translate_postdata.
+ 
+    DATA: lt_post_data       TYPE zif_abapgit_html_viewer=>ty_post_data,
+          ls_last_line       LIKE LINE OF it_postdata,
+          lv_last_line_index TYPE i.
+ 
+    IF it_postdata IS INITIAL.
+      RETURN. "Nothing to do
+    ENDIF.
+ 
+    lt_post_data = it_postdata.
+ 
+    "Save the last line for separate merge, because we don''t need its trailing spaces
+    WHILE ls_last_line IS INITIAL.
+      lv_last_line_index = lines( lt_post_data ).
+      READ TABLE lt_post_data INTO ls_last_line INDEX lv_last_line_index.
+      "Avoid trailing null values (see isssue #4832)
+      "todo, keep until SAP GUI for Java is fixed (remove on 2022-12-31)
+      ls_last_line = replace( val  = ls_last_line
+                              sub  = zcl_abapgit_git_utils=>get_null( )
+                              with = space
+                              occ  = 0 ).
+      DELETE lt_post_data INDEX lv_last_line_index.
+    ENDWHILE.
+ 
+    CONCATENATE LINES OF lt_post_data INTO rv_string
+      IN CHARACTER MODE RESPECTING BLANKS.
+    CONCATENATE rv_string ls_last_line INTO rv_string
+      IN CHARACTER MODE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD unescape.
+ 
+* do not use cl_http_utility as it does strange things with the encoding
+    rv_string = iv_string.
+ 
+* todo, more to be added here
+    REPLACE ALL OCCURRENCES OF ''%3A'' IN rv_string WITH '':'' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF ''%3F'' IN rv_string WITH ''?'' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF ''%3D'' IN rv_string WITH ''='' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF ''%2F'' IN rv_string WITH ''/'' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF ''%25'' IN rv_string WITH ''%'' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF ''%26'' IN rv_string WITH ''&'' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF gv_non_breaking_space IN rv_string WITH \` \`.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTML_FORM                   ', 'CLASS zcl_abapgit_html_form DEFINITION
+  PUBLIC
+  FINAL
+  INHERITING FROM zcl_abapgit_gui_component
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_html_form .
+    INTERFACES zif_abapgit_gui_hotkeys .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_form_id    TYPE csequence OPTIONAL
+        !iv_help_page  TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form .
+    METHODS render
+      IMPORTING
+        !iv_form_class     TYPE csequence DEFAULT ''dialog-form''
+        !io_values         TYPE REF TO zcl_abapgit_string_map
+        !io_validation_log TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      RETURNING
+        VALUE(ri_html)     TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS command
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_action     TYPE csequence
+        !iv_cmd_type   TYPE i DEFAULT zif_abapgit_html_form=>c_cmd_type-input
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS text
+      IMPORTING
+        !iv_label       TYPE csequence
+        !iv_name        TYPE csequence
+        !iv_hint        TYPE csequence OPTIONAL
+        !iv_required    TYPE abap_bool DEFAULT abap_false
+        !iv_upper_case  TYPE abap_bool DEFAULT abap_false
+        !iv_readonly    TYPE abap_bool DEFAULT abap_false
+        !iv_password    TYPE abap_bool DEFAULT abap_false
+        !iv_condense    TYPE abap_bool OPTIONAL
+        !iv_placeholder TYPE csequence OPTIONAL
+        !iv_side_action TYPE csequence OPTIONAL
+        !iv_min         TYPE i DEFAULT cl_abap_math=>min_int4
+        !iv_max         TYPE i DEFAULT cl_abap_math=>max_int4
+      RETURNING
+        VALUE(ro_self)  TYPE REF TO zcl_abapgit_html_form .
+    METHODS textarea
+      IMPORTING
+        !iv_label       TYPE csequence
+        !iv_name        TYPE csequence
+        !iv_hint        TYPE csequence OPTIONAL
+        !iv_required    TYPE abap_bool DEFAULT abap_false
+        !iv_readonly    TYPE abap_bool DEFAULT abap_false
+        !iv_placeholder TYPE csequence OPTIONAL
+        !iv_rows        TYPE i OPTIONAL
+        !iv_cols        TYPE i OPTIONAL
+        !iv_upper_case  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_self)  TYPE REF TO zcl_abapgit_html_form .
+    METHODS number
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_name       TYPE csequence
+        !iv_hint       TYPE csequence OPTIONAL
+        !iv_required   TYPE abap_bool DEFAULT abap_false
+        !iv_readonly   TYPE abap_bool DEFAULT abap_false
+        !iv_min        TYPE i DEFAULT cl_abap_math=>min_int4
+        !iv_max        TYPE i DEFAULT cl_abap_math=>max_int4
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS checkbox
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_name       TYPE csequence
+        !iv_hint       TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS radio
+      IMPORTING
+        !iv_label         TYPE csequence
+        !iv_name          TYPE csequence
+        !iv_default_value TYPE csequence OPTIONAL
+        !iv_hint          TYPE csequence OPTIONAL
+        !iv_condense      TYPE abap_bool DEFAULT abap_false
+        !iv_action        TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_self)    TYPE REF TO zcl_abapgit_html_form .
+    METHODS option
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_value      TYPE csequence
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS table
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_name       TYPE csequence
+        !iv_hint       TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS column
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_width      TYPE csequence OPTIONAL
+        !iv_readonly   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS start_group
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_name       TYPE csequence
+        !iv_hint       TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS hidden
+      IMPORTING
+        !iv_name       TYPE csequence
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS get_fields
+      RETURNING
+        VALUE(rt_fields) TYPE zif_abapgit_html_form=>ty_fields .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_attr,
+        value       TYPE string,
+        error       TYPE string,
+        hint        TYPE string,
+        readonly    TYPE string,
+        placeholder TYPE string,
+        required    TYPE string,
+        autofocus   TYPE string,
+      END OF ty_attr .
+ 
+    DATA mt_fields TYPE zif_abapgit_html_form=>ty_fields .
+    DATA:
+      mt_commands TYPE STANDARD TABLE OF zif_abapgit_html_form=>ty_command .
+    DATA mv_form_id TYPE string .
+    DATA mv_help_page TYPE string .
+ 
+    METHODS render_field
+      IMPORTING
+        !ii_html           TYPE REF TO zif_abapgit_html
+        !io_values         TYPE REF TO zcl_abapgit_string_map
+        !io_validation_log TYPE REF TO zcl_abapgit_string_map
+        !is_field          TYPE zif_abapgit_html_form=>ty_field
+        !iv_autofocus      TYPE abap_bool .
+    METHODS render_field_text
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+    METHODS render_field_textarea
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+    METHODS render_field_checkbox
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+    METHODS render_field_radio
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+    METHODS render_field_table
+      IMPORTING
+        !ii_html   TYPE REF TO zif_abapgit_html
+        !is_field  TYPE zif_abapgit_html_form=>ty_field
+        !is_attr   TYPE ty_attr
+        !io_values TYPE REF TO zcl_abapgit_string_map .
+    METHODS render_command
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_cmd  TYPE zif_abapgit_html_form=>ty_command .
+    METHODS render_field_hidden
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_FORM IMPLEMENTATION.
+ 
+ 
+  METHOD checkbox.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-checkbox.
+    ls_field-name  = iv_name.
+    ls_field-label = iv_label.
+    ls_field-hint  = iv_hint.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD column.
+ 
+    FIELD-SYMBOLS <ls_last> LIKE LINE OF mt_fields.
+    DATA ls_column LIKE LINE OF <ls_last>-subitems.
+    DATA lv_size TYPE i.
+ 
+    lv_size = lines( mt_fields ).
+    ASSERT lv_size > 0. " Exception ? Maybe add zcx_no_check ?
+ 
+    READ TABLE mt_fields INDEX lv_size ASSIGNING <ls_last>.
+    ASSERT sy-subrc = 0.
+    ASSERT <ls_last>-type = zif_abapgit_html_form=>c_field_type-table.
+ 
+    ls_column-label    = iv_label.
+    ls_column-value    = iv_width.
+    ls_column-readonly = iv_readonly.
+ 
+    APPEND ls_column TO <ls_last>-subitems.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD command.
+ 
+    DATA ls_cmd LIKE LINE OF mt_commands.
+ 
+    ASSERT iv_cmd_type BETWEEN 1 AND 4.
+ 
+    ls_cmd-label    = iv_label.
+    ls_cmd-action   = iv_action.
+    ls_cmd-cmd_type = iv_cmd_type.
+ 
+    APPEND ls_cmd TO mt_commands.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lv_ts TYPE timestampl.
+ 
+    CREATE OBJECT ro_form.
+    ro_form->mv_form_id = iv_form_id.
+    ro_form->mv_help_page = iv_help_page.
+ 
+    IF ro_form->mv_form_id IS INITIAL.
+      GET TIME STAMP FIELD lv_ts.
+      ro_form->mv_form_id = |form_{ lv_ts }|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_fields.
+    rt_fields = mt_fields.
+  ENDMETHOD.
+ 
+ 
+  METHOD hidden.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-hidden.
+    ls_field-name  = iv_name.
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD number.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type     = zif_abapgit_html_form=>c_field_type-number.
+    ls_field-name     = iv_name.
+    ls_field-label    = iv_label.
+    ls_field-readonly = iv_readonly.
+    ls_field-min      = iv_min.
+    ls_field-max      = iv_max.
+    ls_field-hint     = iv_hint.
+    ls_field-required = iv_required.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD option.
+ 
+    FIELD-SYMBOLS <ls_last> LIKE LINE OF mt_fields.
+    DATA ls_option LIKE LINE OF <ls_last>-subitems.
+    DATA lv_size TYPE i.
+ 
+    lv_size = lines( mt_fields ).
+    ASSERT lv_size > 0. " Exception ? Maybe add zcx_no_check ?
+ 
+    READ TABLE mt_fields INDEX lv_size ASSIGNING <ls_last>.
+    ASSERT sy-subrc = 0.
+    ASSERT <ls_last>-type = zif_abapgit_html_form=>c_field_type-radio. " Or dropdown - TODO in future
+ 
+    ls_option-label = iv_label.
+    ls_option-value = iv_value.
+ 
+    APPEND ls_option TO <ls_last>-subitems.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD radio.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-radio.
+    ls_field-name  = iv_name.
+    ls_field-label = iv_label.
+    ls_field-default_value = iv_default_value.
+    ls_field-hint  = iv_hint.
+    ls_field-click = iv_action.
+ 
+    " put options into one column instead of side-by-side
+    ls_field-condense = iv_condense.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF mt_fields.
+    FIELD-SYMBOLS <ls_cmd> LIKE LINE OF mt_commands.
+    DATA lv_hint TYPE string.
+    DATA ls_form_id TYPE string.
+    DATA ls_form_action TYPE string.
+    DATA lv_cur_group TYPE string.
+    DATA lv_url TYPE string.
+    DATA lv_autofocus TYPE abap_bool.
+ 
+    IF mv_form_id IS NOT INITIAL.
+      ls_form_id = | id="{ mv_form_id }"|.
+    ENDIF.
+    LOOP AT mt_commands ASSIGNING <ls_cmd> WHERE cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main.
+      ls_form_action = | action="sapevent:{ <ls_cmd>-action }"|.
+      EXIT.
+    ENDLOOP.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<div class="dialog { iv_form_class }">| ). " to center use ''dialog-form-center''
+    ri_html->add( |<form method="post"{ ls_form_id }{ ls_form_action }>| ).
+ 
+    " Add hidden button that triggers main command when pressing enter
+    LOOP AT mt_commands ASSIGNING <ls_cmd> WHERE cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main.
+      ri_html->add( |<button type="submit" formaction="sapevent:{ <ls_cmd>-action }" class="hidden-submit"|
+                 && | aria-hidden="true" tabindex="-1"></button>| ).
+      EXIT.
+    ENDLOOP.
+ 
+    lv_autofocus = abap_true.
+    LOOP AT mt_fields ASSIGNING <ls_field>.
+      AT FIRST.
+        IF <ls_field>-type <> zif_abapgit_html_form=>c_field_type-field_group.
+          ri_html->add( |<ul>| ).
+        ENDIF.
+      ENDAT.
+ 
+      IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-field_group.
+        IF lv_cur_group IS NOT INITIAL AND lv_cur_group <> <ls_field>-name.
+          ri_html->add( |</ul>| ).
+          ri_html->add( |</fieldset>| ).
+        ENDIF.
+        IF <ls_field>-hint IS NOT INITIAL.
+          lv_hint = | title="{ <ls_field>-hint }"|.
+        ELSE.
+          lv_hint = ''''.
+        ENDIF.
+        lv_cur_group = <ls_field>-name.
+        ri_html->add( |<fieldset name="{ <ls_field>-name }">| ).
+        ri_html->add( |<legend{ lv_hint }>{ <ls_field>-label }</legend>| ).
+        ri_html->add( |<ul>| ).
+        CONTINUE.
+      ENDIF.
+ 
+      render_field(
+        ii_html           = ri_html
+        io_values         = io_values
+        io_validation_log = io_validation_log
+        is_field          = <ls_field>
+        iv_autofocus      = lv_autofocus ).
+ 
+      lv_autofocus = abap_false.
+ 
+      AT LAST.
+        ri_html->add( |</ul>| ).
+        IF lv_cur_group IS NOT INITIAL.
+          ri_html->add( |</fieldset>| ).
+        ENDIF.
+      ENDAT.
+    ENDLOOP.
+ 
+    ri_html->add( |<ul>| ).
+    ri_html->add( |<li class="dialog-commands">| ).
+ 
+    IF mv_help_page IS NOT INITIAL.
+      lv_url = escape( val    = mv_help_page
+                       format = cl_abap_format=>e_url ).
+      ri_html->add_a(
+        iv_txt   = zcl_abapgit_gui_buttons=>help( )
+        iv_act   = |{ zif_abapgit_definitions=>c_action-url }?url={ lv_url }|
+        iv_class = ''dialog-help''
+        iv_title = ''Help'' ).
+    ENDIF.
+ 
+    LOOP AT mt_commands ASSIGNING <ls_cmd>.
+      render_command(
+        ii_html = ri_html
+        is_cmd  = <ls_cmd> ).
+    ENDLOOP.
+ 
+    ri_html->add( |</li>| ).
+    ri_html->add( |</ul>| ).
+    ri_html->add( |</form>| ).
+    ri_html->add( |</div>| ).
+ 
+    register_handlers( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_command.
+ 
+    CASE is_cmd-cmd_type.
+      WHEN zif_abapgit_html_form=>c_cmd_type-link.
+ 
+        ii_html->add_a(
+          iv_txt   = is_cmd-label
+          iv_act   = is_cmd-action
+          iv_class = ''dialog-commands'' ).
+ 
+      WHEN zif_abapgit_html_form=>c_cmd_type-button.
+ 
+        ii_html->add( |<button type="submit" name="action" value="{ is_cmd-action }"|
+                   && | class="action-commands">{ is_cmd-label }</button>| ).
+ 
+      WHEN zif_abapgit_html_form=>c_cmd_type-input.
+ 
+        ii_html->add( |<input type="submit" value="{ is_cmd-label }" formaction="sapevent:{ is_cmd-action }">| ).
+ 
+      WHEN zif_abapgit_html_form=>c_cmd_type-input_main.
+ 
+        ii_html->add( |<input type="submit" value="{ is_cmd-label }" class="main">| ).
+ 
+      WHEN OTHERS.
+        ASSERT 0 = 1.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field.
+ 
+    DATA:
+      ls_attr       TYPE ty_attr,
+      lv_item_class TYPE string.
+ 
+    " Get value and validation error
+    ls_attr-value = io_values->get( is_field-name ).
+ 
+    IF is_field-type <> zif_abapgit_html_form=>c_field_type-textarea.
+      ls_attr-value = escape( val    = ls_attr-value
+                              format = cl_abap_format=>e_html_attr ).
+    ENDIF.
+ 
+    IF io_validation_log IS BOUND.
+      ls_attr-error = io_validation_log->get( is_field-name ).
+      IF ls_attr-error IS NOT INITIAL.
+        ls_attr-error = escape( val    = ls_attr-error
+                                format = cl_abap_format=>e_html_text ).
+        ls_attr-error = |<small>{ ls_attr-error }</small>|.
+      ENDIF.
+    ENDIF.
+ 
+    " Prepare field attributes
+    IF is_field-required = abap_true.
+      ls_attr-required = '' <em>*</em>''.
+    ENDIF.
+ 
+    IF is_field-hint IS NOT INITIAL.
+      ls_attr-hint = escape( val    = is_field-hint
+                             format = cl_abap_format=>e_html_attr ).
+      ls_attr-hint = | title="{ ls_attr-hint }"|.
+    ENDIF.
+ 
+    IF is_field-placeholder IS NOT INITIAL.
+      ls_attr-placeholder = escape( val    = is_field-placeholder
+                                    format = cl_abap_format=>e_html_attr ).
+      ls_attr-placeholder = | placeholder="{ ls_attr-placeholder }"|.
+    ENDIF.
+ 
+    IF is_field-readonly = abap_true.
+      ls_attr-readonly = '' readonly''.
+    ENDIF.
+ 
+    IF iv_autofocus = abap_true.
+      ls_attr-autofocus = '' autofocus''.
+    ENDIF.
+ 
+    " Prepare item class
+    lv_item_class = is_field-item_class.
+    IF ls_attr-error IS NOT INITIAL.
+      lv_item_class = condense( lv_item_class && '' error'' ).
+    ENDIF.
+    IF is_field-type = zif_abapgit_html_form=>c_field_type-text AND is_field-max BETWEEN 1 AND 20.
+      " Reduced width for short fields
+      lv_item_class = lv_item_class && '' w40''.
+    ENDIF.
+    IF is_field-type = zif_abapgit_html_form=>c_field_type-hidden.
+      lv_item_class = lv_item_class && '' hidden''.
+    ENDIF.
+    IF lv_item_class IS NOT INITIAL.
+      lv_item_class = | class="{ lv_item_class }"|.
+    ENDIF.
+ 
+    " Render field
+    ii_html->add( |<li{ lv_item_class }>| ).
+ 
+    CASE is_field-type.
+      WHEN zif_abapgit_html_form=>c_field_type-text OR zif_abapgit_html_form=>c_field_type-number.
+ 
+        render_field_text(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+ 
+      WHEN zif_abapgit_html_form=>c_field_type-textarea.
+ 
+        render_field_textarea(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+ 
+      WHEN zif_abapgit_html_form=>c_field_type-checkbox.
+ 
+        render_field_checkbox(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+ 
+      WHEN zif_abapgit_html_form=>c_field_type-radio.
+ 
+        render_field_radio(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+ 
+      WHEN zif_abapgit_html_form=>c_field_type-table.
+ 
+        render_field_table(
+          ii_html   = ii_html
+          is_field  = is_field
+          is_attr   = ls_attr
+          io_values = io_values ).
+ 
+      WHEN zif_abapgit_html_form=>c_field_type-hidden.
+ 
+        render_field_hidden(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+ 
+      WHEN OTHERS.
+        ASSERT 1 = 0.
+    ENDCASE.
+ 
+    ii_html->add( ''</li>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_checkbox.
+ 
+    DATA lv_checked TYPE string.
+ 
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+ 
+    IF is_attr-value = abap_true OR is_attr-value = ''on''.
+      " boolc return \` \` which is not initial -> bug after 1st validation
+      lv_checked = '' checked''.
+    ENDIF.
+ 
+    ii_html->add( |<input type="checkbox" name="{ is_field-name }" id="{ is_field-name }"| &&
+                  |{ lv_checked }{ is_attr-readonly }{ is_attr-autofocus }>| ).
+    ii_html->add( |<label for="{ is_field-name }"{ is_attr-hint }>{ is_field-label }</label>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_hidden.
+ 
+    ii_html->add( |<input type="hidden" name="{ is_field-name }" id="{ is_field-name }" value="{ is_attr-value }">| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_radio.
+ 
+    DATA:
+      lv_checked   TYPE string,
+      lv_opt_id    TYPE string,
+      lv_opt_value TYPE string,
+      lv_onclick   TYPE string.
+ 
+    FIELD-SYMBOLS <ls_opt> LIKE LINE OF is_field-subitems.
+ 
+    ii_html->add( |<label{ is_attr-hint }>{ is_field-label }</label>| ).
+ 
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+ 
+    ii_html->add( |<div class="radio-container">| ).
+ 
+    LOOP AT is_field-subitems ASSIGNING <ls_opt>.
+      lv_opt_value = escape( val    = <ls_opt>-value
+                             format = cl_abap_format=>e_html_attr ).
+ 
+      CLEAR lv_checked.
+      IF is_attr-value = lv_opt_value OR ( is_attr-value IS INITIAL AND lv_opt_value = is_field-default_value ).
+        lv_checked = '' checked''.
+      ENDIF.
+ 
+      CLEAR lv_onclick.
+      IF is_field-click IS NOT INITIAL.
+        lv_onclick = |onclick="document.getElementById(''{ mv_form_id }'').action = ''sapevent:|
+                  && |{ is_field-click }''; document.getElementById(''{ mv_form_id }'').submit()"|.
+      ENDIF.
+ 
+      lv_opt_id = |{ is_field-name }{ sy-tabix }|.
+      IF is_field-condense = abap_true.
+        ii_html->add( ''<div>'' ).
+      ENDIF.
+      ii_html->add( |<input type="radio" name="{ is_field-name }" id="{ lv_opt_id }"|
+                 && | value="{ lv_opt_value }"{ lv_checked }{ is_attr-autofocus }|
+                 && | { lv_onclick }>| ).
+      ii_html->add( |<label for="{ lv_opt_id }">{ <ls_opt>-label }</label>| ).
+      IF is_field-condense = abap_true.
+        ii_html->add( ''</div>'' ).
+      ENDIF.
+    ENDLOOP.
+ 
+    ii_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_table.
+ 
+    DATA:
+      lv_value    TYPE string,
+      lv_readonly TYPE string,
+      lv_rows     TYPE i,
+      lv_cell_id  TYPE string.
+ 
+    FIELD-SYMBOLS <ls_subitem> LIKE LINE OF is_field-subitems.
+ 
+    ii_html->add( |<label for="{ is_field-name }"{ is_attr-hint }>{ is_field-label }</label>| ).
+ 
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+ 
+    lv_rows = io_values->get( |{ is_field-name }-{ zif_abapgit_html_form=>c_rows }| ).
+ 
+    " Render table only if there are some data rows
+    IF lv_rows > 0.
+ 
+      ii_html->add( |<table name="{ is_field-name }" id="{ is_field-name }" class="table-container">| ).
+ 
+      ii_html->add( |<thead>| ).
+      ii_html->add( |<tr>| ).
+      LOOP AT is_field-subitems ASSIGNING <ls_subitem>.
+        CLEAR lv_value.
+        IF <ls_subitem>-value IS NOT INITIAL.
+          lv_value = escape( val    = <ls_subitem>-value
+                             format = cl_abap_format=>e_html_attr ).
+          lv_value = | width="{ lv_value }"|.
+        ENDIF.
+        ii_html->add( |<td{ lv_value }>{ <ls_subitem>-label }</td>| ).
+      ENDLOOP.
+      ii_html->add( |</tr>| ).
+      ii_html->add( |</thead>| ).
+ 
+      ii_html->add( |<tbody>| ).
+      DO lv_rows TIMES.
+        lv_rows = sy-index.
+        ii_html->add( |<tr>| ).
+        LOOP AT is_field-subitems ASSIGNING <ls_subitem>.
+          lv_cell_id = |{ is_field-name }-{ lv_rows }-{ sy-tabix }|.
+          lv_value = escape( val    = io_values->get( lv_cell_id )
+                             format = cl_abap_format=>e_html_attr ).
+          CLEAR lv_readonly.
+          IF <ls_subitem>-readonly = abap_true.
+            lv_readonly = | readonly|.
+          ENDIF.
+          ii_html->add( |<td><input type="text" name="{ lv_cell_id }" id="{
+                        lv_cell_id }" value="{ lv_value }"{ lv_readonly }></td>| ).
+        ENDLOOP.
+        ii_html->add( |</tr>| ).
+      ENDDO.
+      ii_html->add( |</tbody>| ).
+ 
+      ii_html->add( |</table>| ).
+ 
+    ELSE.
+      ii_html->add( |<input type="text" name="{ is_field-name }" id="{
+                    is_field-name }" value="Not available" readonly>| ).
+    ENDIF.
+ 
+    " Hidden field with number of rows to simplify getting values from form
+    lv_value = |{ is_field-name }-{ zif_abapgit_html_form=>c_rows }|.
+    ii_html->add( |<input type="number" name="{ lv_value }" id="{ lv_value }"|
+               && | value="{ lv_rows }" style="display:none">| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_text.
+ 
+    DATA:
+      lv_type      TYPE string,
+      lv_minlength TYPE string,
+      lv_maxlength TYPE string.
+ 
+    ii_html->add( |<label for="{ is_field-name }"{ is_attr-hint }>{ is_field-label }{ is_attr-required }</label>| ).
+ 
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+ 
+    IF is_field-side_action IS NOT INITIAL.
+      ii_html->add( ''<div class="input-container">'' ). " Ugly :(
+    ENDIF.
+ 
+    IF is_field-type = zif_abapgit_html_form=>c_field_type-number.
+      lv_type = ''number''.
+    ELSEIF is_field-password = abap_true.
+      lv_type = ''password''.
+    ELSE.
+      lv_type = ''text''.
+    ENDIF.
+ 
+    IF is_field-min > 0.
+      lv_minlength = | minlength={ is_field-min }|.
+    ENDIF.
+    IF is_field-max > 0 AND is_field-max < cl_abap_math=>max_int4.
+      lv_maxlength = | maxlength={ is_field-max }|.
+    ENDIF.
+ 
+    ii_html->add( |<input type="{ lv_type }" name="{ is_field-name }" id="{ is_field-name }"|
+               && | value="{ is_attr-value }"{ is_field-dblclick }{ is_attr-placeholder }|
+               && |{ is_attr-readonly }{ is_attr-autofocus }{ lv_minlength }{ lv_maxlength }>| ).
+ 
+    IF is_field-side_action IS NOT INITIAL.
+      ii_html->add( ''</div>'' ).
+      ii_html->add( ''<div class="command-container">'' ).
+      ii_html->add( |<input type="submit" value="&#x2026;" formaction="sapevent:{ is_field-side_action }"|
+                 && | title="{ is_field-label }">| ).
+      ii_html->add( ''</div>'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_textarea.
+ 
+    DATA lv_rows TYPE string.
+    DATA lv_cols TYPE string.
+    DATA lv_html TYPE string.
+ 
+    ii_html->add( |<label for="{ is_field-name }"{ is_attr-hint }>{ is_field-label }{ is_attr-required }</label>| ).
+ 
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+ 
+    IF is_field-rows > 0.
+      lv_rows = | rows="{ is_field-rows }"|.
+    ELSEIF is_attr-value IS NOT INITIAL.
+      lv_rows = | rows="{ lines( zcl_abapgit_convert=>split_string( is_attr-value ) ) + 1 }"|.
+    ENDIF.
+ 
+    IF is_field-cols > 0.
+      lv_cols = | cols="{ is_field-cols }"|.
+    ENDIF.
+ 
+    " Avoid adding line-breaks inside textarea tag (except for the actual value)
+    lv_html = |<textarea name="{ is_field-name }" id="{ is_field-name }"{ lv_rows }{ lv_cols }|
+           && |{ is_attr-readonly }{ is_attr-autofocus }{ is_attr-placeholder }>|.
+    lv_html = lv_html && escape( val    = is_attr-value
+                                 format = cl_abap_format=>e_html_attr ).
+    lv_html = lv_html && |</textarea>|.
+ 
+    ii_html->add( lv_html ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD start_group.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-field_group.
+    ls_field-label = iv_label.
+    ls_field-name  = iv_name.
+    ls_field-hint  = iv_hint.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD table.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-table.
+    ls_field-name  = iv_name.
+    ls_field-label = iv_label.
+    ls_field-hint  = iv_hint.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD text.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type       = zif_abapgit_html_form=>c_field_type-text.
+    ls_field-name       = iv_name.
+    ls_field-label      = iv_label.
+    ls_field-upper_case = iv_upper_case.
+    ls_field-readonly   = iv_readonly.
+    ls_field-min        = iv_min.
+    ls_field-max        = iv_max.
+    ls_field-password   = iv_password.
+    ls_field-condense   = iv_condense.
+    ls_field-hint       = iv_hint.
+    ls_field-required   = iv_required.
+    ls_field-placeholder = iv_placeholder.
+ 
+    IF iv_side_action IS NOT INITIAL AND mv_form_id IS NOT INITIAL.
+      ls_field-item_class = ''with-command''.
+      ls_field-side_action = iv_side_action.
+      ls_field-dblclick = | ondblclick="document.getElementById(''{ mv_form_id }'').action = ''sapevent:|
+                       && |{ iv_side_action }''; document.getElementById(''{ mv_form_id }'').submit()"|.
+    ENDIF.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD textarea.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type        = zif_abapgit_html_form=>c_field_type-textarea.
+    ls_field-name        = iv_name.
+    ls_field-label       = iv_label.
+    ls_field-readonly    = iv_readonly.
+    ls_field-hint        = iv_hint.
+    ls_field-required    = iv_required.
+    ls_field-placeholder = iv_placeholder.
+    ls_field-rows        = iv_rows.
+    ls_field-cols        = iv_cols.
+    ls_field-upper_case  = iv_upper_case.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+    FIELD-SYMBOLS: <ls_command> TYPE zif_abapgit_html_form=>ty_command.
+ 
+    ls_hotkey_action-ui_component = |Form-{ mv_form_id }|.
+ 
+    READ TABLE mt_commands WITH KEY cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
+                           ASSIGNING <ls_command>.
+    IF sy-subrc = 0.
+      ls_hotkey_action-description = <ls_command>-label.
+      ls_hotkey_action-action      = <ls_command>-action.
+      ls_hotkey_action-hotkey      = |Enter|.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    READ TABLE mt_commands WITH KEY action = zif_abapgit_definitions=>c_action-go_back
+                           ASSIGNING <ls_command>.
+    IF sy-subrc = 0.
+      ls_hotkey_action-description = <ls_command>-label.
+      ls_hotkey_action-action      = <ls_command>-action.
+      ls_hotkey_action-hotkey      = |F3|.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTML_FORM_UTILS             ', 'CLASS zcl_abapgit_html_form_utils DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_form            TYPE REF TO zcl_abapgit_html_form
+      RETURNING
+        VALUE(ro_form_util) TYPE REF TO zcl_abapgit_html_form_utils .
+    CLASS-METHODS is_dirty
+      IMPORTING
+        !io_form_data    TYPE REF TO zcl_abapgit_string_map
+        !io_compare_with TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rv_dirty) TYPE abap_bool .
+ 
+    METHODS constructor
+      IMPORTING
+        !io_form TYPE REF TO zcl_abapgit_html_form .
+    METHODS normalize
+      IMPORTING
+        !io_form_data       TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS validate
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_empty
+      IMPORTING
+        !io_form_data   TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rv_empty) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_data
+      IMPORTING
+        !io_form_data TYPE REF TO zcl_abapgit_string_map .
+    METHODS exit
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+        !io_check_changes_versus TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      RETURNING
+        VALUE(rv_state)          TYPE i
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_form      TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_FORM_UTILS IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mo_form = io_form.
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_form_util
+      EXPORTING
+        io_form = io_form.
+  ENDMETHOD.
+ 
+ 
+  METHOD exit.
+ 
+    DATA lv_answer TYPE c LENGTH 1.
+    DATA lo_compare_with LIKE io_check_changes_versus.
+ 
+    lo_compare_with = io_check_changes_versus.
+    IF lo_compare_with IS NOT BOUND.
+      " TODO: remove this if and make io_check_changes_versus mandatory once all forms are converted
+      lo_compare_with = mo_form_data.
+    ENDIF.
+ 
+    IF is_dirty(
+      io_form_data    = io_form_data
+      io_compare_with = lo_compare_with ) = abap_true.
+      lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+        iv_display_cancel_button = abap_false
+        iv_titlebar       = ''abapGit - Unsaved Changes''
+        iv_text_question  = ''There are unsaved changes. Do you want to exit the form?''
+        iv_default_button = ''2'' ).
+ 
+      IF lv_answer = ''1''.
+        rv_state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
+      ELSE.
+        rv_state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      ENDIF.
+    ELSE.
+      rv_state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_dirty.
+    rv_dirty = boolc( io_form_data->mt_entries <> io_compare_with->mt_entries ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_empty.
+ 
+    DATA:
+      lt_fields TYPE zif_abapgit_html_form=>ty_fields,
+      lv_value  TYPE string,
+      lv_rows   TYPE i,
+      lv_row    TYPE i.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF lt_fields.
+ 
+    rv_empty = abap_true.
+    lt_fields = mo_form->get_fields( ).
+    LOOP AT lt_fields ASSIGNING <ls_field> WHERE type <> zif_abapgit_html_form=>c_field_type-field_group.
+      lv_value = condense(
+        val = io_form_data->get( <ls_field>-name )
+        del = \` \` ).
+ 
+      IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-number.
+        rv_empty = boolc( lv_value IS INITIAL OR lv_value = ''0'' ).
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-table.
+        lv_rows = io_form_data->get( |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }| ).
+        DO lv_rows TIMES.
+          lv_row = sy-index.
+          DO lines( <ls_field>-subitems ) TIMES.
+            lv_value = io_form_data->get( |{ <ls_field>-name }-{ lv_row }-{ sy-index }| ).
+            rv_empty = boolc( lv_value IS INITIAL ).
+            IF rv_empty <> abap_true.
+              RETURN.
+            ENDIF.
+          ENDDO.
+        ENDDO.
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-textarea.
+        REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_value WITH ''''.
+        REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN lv_value WITH ''''.
+        rv_empty = boolc( lv_value IS INITIAL ).
+      ELSE.
+        rv_empty = boolc( lv_value IS INITIAL ).
+      ENDIF.
+ 
+      IF rv_empty <> abap_true.
+        RETURN.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize.
+ 
+    DATA:
+      lt_fields TYPE zif_abapgit_html_form=>ty_fields,
+      lv_value  TYPE string,
+      lv_rows   TYPE i,
+      lv_row    TYPE i,
+      lv_len    TYPE i.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF lt_fields.
+ 
+    CREATE OBJECT ro_form_data.
+ 
+    IF io_form_data->is_empty( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    lt_fields = mo_form->get_fields( ).
+    LOOP AT lt_fields ASSIGNING <ls_field> WHERE type <> zif_abapgit_html_form=>c_field_type-field_group
+      AND type <> zif_abapgit_html_form=>c_field_type-hidden.
+ 
+      CLEAR lv_value.
+      lv_value = io_form_data->get( <ls_field>-name ).
+      IF <ls_field>-condense = abap_true.
+        lv_value = condense( val = lv_value
+                             del = \` \` ).
+      ENDIF.
+ 
+      IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-checkbox.
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = boolc( lv_value = ''on'' ) ) ##TYPE.
+      ELSEIF ( <ls_field>-type = zif_abapgit_html_form=>c_field_type-text
+          OR <ls_field>-type = zif_abapgit_html_form=>c_field_type-textarea )
+          AND <ls_field>-upper_case = abap_true.
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = to_upper( lv_value ) ).
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-number.
+        " Numeric value is checked in validation
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = condense( val = lv_value del = \` \` ) ).
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-table.
+        lv_rows = io_form_data->get( |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }| ).
+        DO lv_rows TIMES.
+          lv_row = sy-index.
+          DO lines( <ls_field>-subitems ) TIMES.
+            lv_value = io_form_data->get( |{ <ls_field>-name }-{ lv_row }-{ sy-index }| ).
+            ro_form_data->set(
+              iv_key = |{ <ls_field>-name }-{ lv_row }-{ sy-index }|
+              iv_val = lv_value ).
+          ENDDO.
+        ENDDO.
+        ro_form_data->set(
+          iv_key = |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }|
+          iv_val = |{ lv_rows }| ).
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-textarea.
+        REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_value
+          WITH cl_abap_char_utilities=>newline.
+ 
+        " Remove last line if empty (ie 2x newline)
+        lv_len = strlen( lv_value ) - 2.
+        IF lv_len >= 0 AND lv_value+lv_len(1) = cl_abap_char_utilities=>newline.
+          lv_len = lv_len + 1.
+          lv_value = lv_value(lv_len).
+        ENDIF.
+ 
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = lv_value ).
+      ELSE.
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = lv_value ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_data.
+    mo_form_data = io_form_data.
+  ENDMETHOD.
+ 
+ 
+  METHOD validate.
+ 
+    DATA:
+      lt_fields TYPE zif_abapgit_html_form=>ty_fields,
+      lv_value  TYPE string,
+      lv_number TYPE i.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF lt_fields.
+ 
+    CREATE OBJECT ro_validation_log.
+ 
+    lt_fields = mo_form->get_fields( ).
+    LOOP AT lt_fields ASSIGNING <ls_field>.
+      lv_value = io_form_data->get( <ls_field>-name ).
+      IF <ls_field>-condense = abap_true.
+        lv_value = condense( val = lv_value
+                             del = \` \` ).
+      ENDIF.
+      IF <ls_field>-required IS NOT INITIAL AND lv_value IS INITIAL.
+        ro_validation_log->set(
+          iv_key = <ls_field>-name
+          iv_val = |{ <ls_field>-label } cannot be empty| ).
+      ENDIF.
+      CASE <ls_field>-type.
+        WHEN zif_abapgit_html_form=>c_field_type-text.
+          IF <ls_field>-min <> cl_abap_math=>min_int4 AND strlen( lv_value ) < <ls_field>-min.
+            ro_validation_log->set(
+              iv_key = <ls_field>-name
+              iv_val = |{ <ls_field>-label } must not be shorter than { <ls_field>-min } characters| ).
+          ENDIF.
+          IF <ls_field>-max <> cl_abap_math=>max_int4 AND strlen( lv_value ) > <ls_field>-max.
+            ro_validation_log->set(
+              iv_key = <ls_field>-name
+              iv_val = |{ <ls_field>-label } must not be longer than { <ls_field>-max } characters| ).
+          ENDIF.
+        WHEN zif_abapgit_html_form=>c_field_type-number.
+          TRY.
+              lv_number = lv_value.
+            CATCH cx_root.
+              ro_validation_log->set(
+                iv_key = <ls_field>-name
+                iv_val = |{ <ls_field>-label } is not numeric| ).
+              CONTINUE.
+          ENDTRY.
+          IF <ls_field>-min <> cl_abap_math=>min_int4 AND lv_number < <ls_field>-min.
+            ro_validation_log->set(
+              iv_key = <ls_field>-name
+              iv_val = |{ <ls_field>-label } must not be lower than { <ls_field>-min }| ).
+          ENDIF.
+          IF <ls_field>-max <> cl_abap_math=>max_int4 AND lv_number > <ls_field>-max.
+            ro_validation_log->set(
+              iv_key = <ls_field>-name
+              iv_val = |{ <ls_field>-label } must not be higher than { <ls_field>-max }| ).
+          ENDIF.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTML_TABLE                  ', 'CLASS zcl_abapgit_html_table DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_renderer    TYPE REF TO zif_abapgit_html_table
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_html_table .
+    " probably th css_class
+    " maybe auto class for td
+    METHODS define_column
+      IMPORTING
+        !iv_column_id  TYPE string
+        !iv_column_title TYPE string OPTIONAL
+        !iv_from_field TYPE abap_compname OPTIONAL
+      RETURNING
+        VALUE(ro_self)  TYPE REF TO zcl_abapgit_html_table .
+    " Maybe also data_provider
+    " Record Limit
+    METHODS render
+      IMPORTING
+        !iv_id         TYPE csequence OPTIONAL
+        !iv_css_class  TYPE csequence OPTIONAL
+        !it_data       TYPE ANY TABLE
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_column,
+        column_id TYPE string,
+        column_title TYPE string,
+        from_field  TYPE abap_compname,
+      END OF ty_column,
+      ty_columns TYPE STANDARD TABLE OF ty_column WITH KEY column_id.
+ 
+ 
+    DATA mi_renderer TYPE REF TO zif_abapgit_html_table.
+    DATA mt_columns TYPE ty_columns.
+    DATA mi_html TYPE REF TO zif_abapgit_html.
+ 
+    METHODS render_thead
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS render_tbody
+      IMPORTING
+        it_data TYPE ANY TABLE
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS render_row
+      IMPORTING
+        iv_row_index TYPE i
+        is_row TYPE any
+      RAISING
+        zcx_abapgit_exception .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_TABLE IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    ASSERT ii_renderer IS BOUND.
+    CREATE OBJECT ro_instance.
+    ro_instance->mi_renderer = ii_renderer.
+  ENDMETHOD.
+ 
+ 
+  METHOD define_column.
+ 
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF mt_columns.
+ 
+    ASSERT iv_column_id IS NOT INITIAL.
+    ro_self = me.
+ 
+    APPEND INITIAL LINE TO mt_columns ASSIGNING <ls_c>.
+    <ls_c>-column_id    = iv_column_id.
+    <ls_c>-column_title = iv_column_title.
+    <ls_c>-from_field   = to_upper( iv_from_field ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render.
+ 
+    DATA lv_attrs TYPE string.
+ 
+    IF iv_id IS NOT INITIAL.
+      lv_attrs = lv_attrs && | id="{ iv_id }"|.
+    ENDIF.
+ 
+    IF iv_css_class IS NOT INITIAL.
+      lv_attrs = lv_attrs && | class="{ iv_css_class }"|.
+    ENDIF.
+ 
+    CREATE OBJECT mi_html TYPE zcl_abapgit_html.
+    ri_html = mi_html.
+ 
+    mi_html->add( |<table{ lv_attrs }>| ).
+    render_thead( ).
+    render_tbody( it_data ).
+    mi_html->add( ''</table>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_row.
+ 
+    DATA ls_render TYPE zif_abapgit_html_table=>ty_cell_render.
+    DATA lv_dummy TYPE string.
+    FIELD-SYMBOLS <ls_col> LIKE LINE OF mt_columns.
+    FIELD-SYMBOLS <lv_val> TYPE any.
+ 
+    LOOP AT mt_columns ASSIGNING <ls_col>.
+      IF <ls_col>-from_field IS NOT INITIAL AND <ls_col>-from_field <> ''-''.
+        ASSIGN COMPONENT <ls_col>-from_field OF STRUCTURE is_row TO <lv_val>.
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise( |html_table: cannot assign field [{ <ls_col>-from_field }]| ).
+        ENDIF.
+      ELSEIF <ls_col>-from_field <> ''-''.
+        <ls_col>-from_field = to_upper( <ls_col>-column_id ). " Try column_id
+        ASSIGN COMPONENT <ls_col>-from_field OF STRUCTURE is_row TO <lv_val>.
+        IF sy-subrc <> 0.
+          <ls_col>-from_field = ''-''. " Don''t try assignments anymore
+          ASSIGN lv_dummy TO <lv_val>.
+        ENDIF.
+      ELSE.
+        ASSIGN lv_dummy TO <lv_val>.
+      ENDIF.
+      ls_render = mi_renderer->render_cell(
+        iv_row_index = iv_row_index
+        is_row       = is_row
+        iv_column_id = <ls_col>-column_id
+        iv_value     = <lv_val> ).
+      mi_html->td(
+        iv_content = ls_render-content
+        ii_content = ls_render-html
+        iv_class   = ls_render-css_class ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_tbody.
+ 
+    DATA ls_row_attrs TYPE zif_abapgit_html_table=>ty_row_attrs.
+    DATA lv_row_attrs TYPE string.
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_i> TYPE any.
+ 
+    mi_html->add( ''<tbody>'' ).
+ 
+    LOOP AT it_data ASSIGNING <ls_i>.
+      lv_index = sy-tabix.
+      ls_row_attrs = mi_renderer->get_row_attrs(
+        iv_row_index = lv_index
+        is_row       = <ls_i> ).
+      CLEAR lv_row_attrs.
+      IF ls_row_attrs-css_class IS NOT INITIAL.
+        lv_row_attrs = lv_row_attrs && | class="{ ls_row_attrs-css_class }"|.
+      ENDIF.
+      mi_html->add( |<tr{ lv_row_attrs }>| ).
+      render_row(
+        iv_row_index = lv_index
+        is_row       = <ls_i> ).
+      mi_html->add( ''</tr>'' ).
+    ENDLOOP.
+ 
+    mi_html->add( ''</tbody>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_thead.
+ 
+    FIELD-SYMBOLS <ls_col> LIKE LINE OF mt_columns.
+ 
+    mi_html->add( ''<thead>'' ).
+    mi_html->add( ''<tr>'' ).
+ 
+    LOOP AT mt_columns ASSIGNING <ls_col>.
+      mi_html->th( iv_content = <ls_col>-column_title ).
+    ENDLOOP.
+ 
+    mi_html->add( ''</tr>'' ).
+    mi_html->add( ''</thead>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_HTML_TOOLBAR                ', 'CLASS zcl_abapgit_html_toolbar DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_id TYPE string OPTIONAL
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_html_toolbar.
+    METHODS constructor
+      IMPORTING
+        !iv_id TYPE string OPTIONAL .
+    METHODS add
+      IMPORTING
+        !iv_txt        TYPE string
+        !io_sub        TYPE REF TO zcl_abapgit_html_toolbar OPTIONAL
+        !iv_typ        TYPE c DEFAULT zif_abapgit_html=>c_action_type-sapevent
+        !iv_act        TYPE string OPTIONAL
+        !iv_ico        TYPE string OPTIONAL
+        !iv_cur        TYPE abap_bool OPTIONAL
+        !iv_opt        TYPE c OPTIONAL
+        !iv_chk        TYPE abap_bool DEFAULT abap_undefined
+        !iv_aux        TYPE string OPTIONAL
+        !iv_id         TYPE string OPTIONAL
+        !iv_title      TYPE string OPTIONAL
+        !iv_class      TYPE string OPTIONAL
+        !iv_li_class   TYPE string OPTIONAL
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS count_items
+      RETURNING
+        VALUE(rv_count) TYPE i .
+    METHODS render
+      IMPORTING
+        !iv_right      TYPE abap_bool OPTIONAL
+        !iv_sort       TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_as_droplist
+      IMPORTING
+        !iv_label      TYPE string
+        !iv_right      TYPE abap_bool OPTIONAL
+        !iv_sort       TYPE abap_bool OPTIONAL
+        !iv_corner     TYPE abap_bool OPTIONAL
+        !iv_action     TYPE string OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_item,
+        txt      TYPE string,
+        act      TYPE string,
+        ico      TYPE string,
+        sub      TYPE REF TO zcl_abapgit_html_toolbar,
+        opt      TYPE c LENGTH 1,
+        typ      TYPE c LENGTH 1,
+        cur      TYPE abap_bool,
+        chk      TYPE abap_bool,
+        aux      TYPE string,
+        id       TYPE string,
+        title    TYPE string,
+        class_    TYPE string,
+        li_class TYPE string,
+      END OF ty_item .
+    TYPES:
+      ty_items TYPE STANDARD TABLE OF ty_item .
+ 
+    DATA mt_items TYPE ty_items .
+    DATA mv_id TYPE string .
+ 
+    METHODS render_items
+      IMPORTING
+        !iv_sort       TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_html_toolbar IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+    DATA ls_item TYPE ty_item.
+ 
+    ASSERT iv_typ = zif_abapgit_html=>c_action_type-separator  " sep doesn''t have action
+      OR iv_typ = zif_abapgit_html=>c_action_type-onclick      " click may have no action (assigned in JS)
+      OR iv_typ = zif_abapgit_html=>c_action_type-dummy        " dummy may have no action
+      OR iv_act IS INITIAL AND io_sub IS NOT INITIAL
+      OR iv_act IS NOT INITIAL AND io_sub IS INITIAL. " Only one supplied
+ 
+    ASSERT NOT ( iv_chk <> abap_undefined AND io_sub IS NOT INITIAL ).
+ 
+    ls_item-txt   = iv_txt.
+    ls_item-act   = iv_act.
+    ls_item-ico   = iv_ico.
+    ls_item-sub   = io_sub.
+    ls_item-opt   = iv_opt.
+    ls_item-typ   = iv_typ.
+    ls_item-cur   = iv_cur.
+    ls_item-chk   = iv_chk.
+    ls_item-aux   = iv_aux.
+    ls_item-id    = iv_id.
+    ls_item-title = iv_title.
+    ls_item-class_ = iv_class.
+    ls_item-li_class = iv_li_class.
+ 
+    APPEND ls_item TO mt_items.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_id = iv_id.
+  ENDMETHOD.
+ 
+  METHOD create.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_id = iv_id.
+  ENDMETHOD.
+ 
+ 
+  METHOD count_items.
+    rv_count = lines( mt_items ).
+  ENDMETHOD.
+ 
+ 
+  METHOD render.
+ 
+    DATA: lv_class TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_class = ''nav-container''.
+    IF iv_right = abap_true.
+      lv_class = lv_class && '' float-right''.
+    ENDIF.
+ 
+    ri_html->add( |<div class="{ lv_class }">| ).
+    ri_html->add( render_items( iv_sort = iv_sort ) ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_as_droplist.
+ 
+    DATA: lv_class TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_class = ''nav-container''.
+    IF iv_right = abap_true.
+      lv_class = lv_class && '' float-right''.
+    ENDIF.
+    IF iv_corner = abap_true.
+      lv_class = lv_class && '' corner''.
+    ENDIF.
+ 
+    ri_html->add( |<div class="{ lv_class }">| ).
+    ri_html->add( ''<ul><li>'' ).
+    ri_html->add_a( iv_txt = iv_label
+                    iv_typ = zif_abapgit_html=>c_action_type-sapevent
+                    iv_act = iv_action ).
+    ri_html->add( ''<div class="minizone"></div>'' ).
+    ri_html->add( render_items( iv_sort = iv_sort ) ).
+    ri_html->add( ''</li></ul>'' ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_items.
+ 
+    DATA: lv_class       TYPE string,
+          lv_class_value TYPE string,
+          lv_icon        TYPE string,
+          lv_id          TYPE string,
+          lv_check       TYPE string,
+          lv_aux         TYPE string,
+          lv_has_icons   TYPE abap_bool.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items.
+ 
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_sort = abap_true.
+      SORT mt_items BY txt ASCENDING AS TEXT.
+    ENDIF.
+ 
+    " Check has icons or check boxes
+    LOOP AT mt_items ASSIGNING <ls_item> WHERE ico IS NOT INITIAL OR chk <> abap_undefined.
+      lv_has_icons = abap_true.
+      lv_class     = '' class="with-icons"''.
+      EXIT.
+    ENDLOOP.
+ 
+    IF mv_id IS NOT INITIAL.
+      lv_id = | id="{ mv_id }"|.
+    ENDIF.
+ 
+    ri_html->add( |<ul{ lv_id }{ lv_class }>| ).
+ 
+    " Render items
+    LOOP AT mt_items ASSIGNING <ls_item>.
+      CLEAR: lv_class, lv_class_value, lv_icon.
+ 
+      IF <ls_item>-typ = zif_abapgit_html=>c_action_type-separator.
+        ri_html->add( |<li class="separator">{ <ls_item>-txt }</li>| ).
+        CONTINUE.
+      ENDIF.
+ 
+      IF lv_has_icons = abap_true.
+        IF <ls_item>-chk = abap_true.
+          lv_icon  = ri_html->icon( ''check/blue'' ).
+          lv_check = '' data-check="X"''.
+        ELSEIF <ls_item>-chk = abap_false.
+          lv_icon = ri_html->icon( ''check/grey'' ).
+          lv_check = '' data-check=""''.
+        ELSE. " abap_undefined -> not a check box
+          lv_icon = ri_html->icon( <ls_item>-ico ).
+        ENDIF.
+      ENDIF.
+ 
+ 
+      IF <ls_item>-cur = abap_true.
+        IF <ls_item>-li_class IS INITIAL.
+          lv_class_value =  ''current-menu-item''.
+        ELSE.
+          lv_class_value =  |current-menu-item { <ls_item>-li_class }|.
+        ENDIF.
+      ELSE.
+        lv_class_value =  <ls_item>-li_class.
+      ENDIF.
+      IF lv_class_value IS NOT INITIAL.
+        lv_class =   | class="{ lv_class_value }"|.
+      ENDIF.
+      IF <ls_item>-aux IS NOT INITIAL.
+        lv_aux = | data-aux="{ <ls_item>-aux }"|.
+      ENDIF.
+ 
+      ri_html->add( |<li{ lv_class }{ lv_check }{ lv_aux }>| ).
+ 
+      IF <ls_item>-sub IS INITIAL.
+        ri_html->add_a( iv_txt   = lv_icon && <ls_item>-txt
+                        iv_typ   = <ls_item>-typ
+                        iv_act   = <ls_item>-act
+                        iv_id    = <ls_item>-id
+                        iv_opt   = <ls_item>-opt
+                        iv_title = <ls_item>-title
+                        iv_class = <ls_item>-class_ ).
+      ELSE.
+        ri_html->add_a( iv_txt   = lv_icon && <ls_item>-txt
+                        iv_typ   = zif_abapgit_html=>c_action_type-dummy
+                        iv_act   = ''''
+                        iv_id    = <ls_item>-id
+                        iv_opt   = <ls_item>-opt
+                        iv_title = <ls_item>-title
+                        iv_class = <ls_item>-class_ ).
+        ri_html->add( <ls_item>-sub->render_items( iv_sort ) ).
+      ENDIF.
+      ri_html->add( ''</li>'' ).
+ 
+    ENDLOOP.
+ 
+    ri_html->add( ''</ul>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_LOG_VIEWER                  ', 'CLASS zcl_abapgit_log_viewer DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS show_log
+      IMPORTING
+        !ii_log TYPE REF TO zif_abapgit_log .
+    CLASS-METHODS to_html
+      IMPORTING
+        !ii_log        TYPE REF TO zif_abapgit_log
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS write_log
+      IMPORTING
+        !ii_log TYPE REF TO zif_abapgit_log .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_log_out,
+        type      TYPE icon_d,
+        msg       TYPE string,
+        obj_type  TYPE trobjtype,
+        obj_name  TYPE sobj_name,
+        exception TYPE REF TO cx_root,
+        longtext  TYPE icon_d,
+        t100      TYPE icon_d,
+        source    TYPE icon_d,
+        callstack TYPE icon_d,
+        cell_type TYPE salv_t_int4_column,
+      END OF ty_log_out.
+    TYPES:
+      ty_log_outs TYPE STANDARD TABLE OF ty_log_out
+                                WITH NON-UNIQUE DEFAULT KEY.
+ 
+    CLASS-METHODS:
+      prepare_log_for_display
+        IMPORTING
+          ii_log            TYPE REF TO zif_abapgit_log
+        RETURNING
+          VALUE(rt_log_out) TYPE ty_log_outs,
+ 
+      show_longtext
+        IMPORTING
+          is_log TYPE ty_log_out
+        RAISING
+          zcx_abapgit_exception,
+ 
+      goto_source
+        IMPORTING
+          is_log TYPE ty_log_out
+        RAISING
+          zcx_abapgit_exception,
+ 
+      goto_callstack
+        IMPORTING
+          is_log TYPE ty_log_out
+        RAISING
+          zcx_abapgit_exception,
+ 
+      goto_t100_message
+        IMPORTING
+          is_log TYPE ty_log_out
+        RAISING
+          zcx_abapgit_exception,
+ 
+      on_link_click FOR EVENT link_click OF cl_salv_events_table
+        IMPORTING row column,
+ 
+      dispatch
+        IMPORTING
+          is_log    TYPE ty_log_out
+          iv_column TYPE salv_de_column
+        RAISING
+          zcx_abapgit_exception,
+ 
+      calculate_cell_type,
+ 
+      get_exception_viewer
+        IMPORTING
+          is_log                     TYPE ty_log_out
+        RETURNING
+          VALUE(ro_exception_viewer) TYPE REF TO zcl_abapgit_exception_viewer.
+ 
+    CLASS-DATA:
+      gt_log TYPE ty_log_outs.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_LOG_VIEWER IMPLEMENTATION.
+ 
+ 
+  METHOD calculate_cell_type.
+ 
+    FIELD-SYMBOLS: <ls_log> LIKE LINE OF gt_log.
+    DATA: ls_cell_type LIKE LINE OF <ls_log>-cell_type.
+ 
+    LOOP AT gt_log ASSIGNING <ls_log>.
+ 
+      IF <ls_log>-longtext IS NOT INITIAL.
+        ls_cell_type-columnname = \`LONGTEXT\`.
+        ls_cell_type-value      = if_salv_c_cell_type=>hotspot.
+        INSERT ls_cell_type INTO TABLE <ls_log>-cell_type.
+      ENDIF.
+ 
+      IF <ls_log>-t100 IS NOT INITIAL.
+        ls_cell_type-columnname = \`T100\`.
+        ls_cell_type-value      = if_salv_c_cell_type=>hotspot.
+        INSERT ls_cell_type INTO TABLE <ls_log>-cell_type.
+      ENDIF.
+ 
+      IF <ls_log>-source IS NOT INITIAL.
+        ls_cell_type-columnname = \`SOURCE\`.
+        ls_cell_type-value      = if_salv_c_cell_type=>hotspot.
+        INSERT ls_cell_type INTO TABLE <ls_log>-cell_type.
+      ENDIF.
+ 
+      IF <ls_log>-callstack IS NOT INITIAL.
+        ls_cell_type-columnname = \`CALLSTACK\`.
+        ls_cell_type-value      = if_salv_c_cell_type=>hotspot.
+        INSERT ls_cell_type INTO TABLE <ls_log>-cell_type.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dispatch.
+ 
+    CASE iv_column.
+      WHEN \`LONGTEXT\`.
+ 
+        show_longtext( is_log ).
+ 
+      WHEN \`T100\`.
+ 
+        goto_t100_message( is_log ).
+ 
+      WHEN \`SOURCE\`.
+ 
+        goto_source( is_log ).
+ 
+      WHEN \`CALLSTACK\`.
+ 
+        goto_callstack( is_log ).
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_exception_viewer.
+ 
+    DATA:
+      lx_abapgit TYPE REF TO zcx_abapgit_exception.
+ 
+    ASSERT is_log-exception IS BOUND.
+    lx_abapgit ?= is_log-exception.
+ 
+    CREATE OBJECT ro_exception_viewer
+      EXPORTING
+        ix_error = lx_abapgit.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD goto_callstack.
+ 
+    get_exception_viewer( is_log )->show_callstack( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD goto_source.
+ 
+    get_exception_viewer( is_log )->goto_source( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD goto_t100_message.
+ 
+    get_exception_viewer( is_log )->goto_message( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD on_link_click.
+ 
+    DATA: lx_error TYPE REF TO zcx_abapgit_exception.
+    FIELD-SYMBOLS: <ls_log> TYPE ty_log_out.
+ 
+    IF row IS INITIAL
+    OR column IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE gt_log ASSIGNING <ls_log>
+                      INDEX row.
+    ASSERT sy-subrc = 0.
+ 
+    TRY.
+        dispatch(
+            is_log    = <ls_log>
+            iv_column = column ).
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+        MESSAGE lx_error TYPE ''S'' DISPLAY LIKE ''E''.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD prepare_log_for_display.
+ 
+    DATA: lt_message      TYPE zif_abapgit_log=>ty_log_outs,
+          lr_message      TYPE REF TO zif_abapgit_log=>ty_log_out,
+          ls_log          TYPE ty_log_out,
+          li_t100_message TYPE REF TO if_t100_message,
+          lx_abapgit      TYPE REF TO zcx_abapgit_exception.
+ 
+    lt_message = ii_log->get_messages( ).
+ 
+    LOOP AT lt_message REFERENCE INTO lr_message.
+ 
+      CLEAR: ls_log.
+ 
+      ls_log-msg = lr_message->text.
+      ls_log-exception = lr_message->exception.
+ 
+      CASE lr_message->type.
+        WHEN ''E'' OR ''A'' OR ''X''.
+          ls_log-type = icon_led_red.
+        WHEN ''W''.
+          ls_log-type = icon_led_yellow.
+        WHEN ''I'' OR ''S''.
+          ls_log-type = icon_led_green.
+        WHEN OTHERS.
+          ls_log-type = icon_led_inactive.
+      ENDCASE.
+ 
+      IF lr_message->exception IS BOUND.
+ 
+        TRY.
+            li_t100_message ?= lr_message->exception.
+ 
+            IF li_t100_message->t100key IS NOT INITIAL.
+              ls_log-t100 = icon_message_information.
+            ENDIF.
+ 
+          CATCH cx_sy_move_cast_error ##NO_HANDLER.
+        ENDTRY.
+ 
+        TRY.
+            lx_abapgit ?= lr_message->exception.
+ 
+            IF lx_abapgit->mt_callstack IS NOT INITIAL.
+              ls_log-longtext  = icon_system_help.
+              ls_log-callstack = icon_stack.
+              ls_log-source    = icon_abap.
+            ENDIF.
+ 
+          CATCH cx_sy_move_cast_error ##NO_HANDLER.
+        ENDTRY.
+ 
+      ENDIF.
+ 
+      ls_log-obj_type = lr_message->obj_type.
+      ls_log-obj_name = lr_message->obj_name.
+ 
+      INSERT ls_log INTO TABLE rt_log_out.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD show_log.
+ 
+    DATA: lr_log         TYPE REF TO ty_log_out,
+          lo_alv         TYPE REF TO cl_salv_table,
+          lx_error       TYPE REF TO cx_salv_error,
+          lo_form_header TYPE REF TO cl_salv_form_header_info,
+          lo_columns     TYPE REF TO cl_salv_columns_table,
+          lo_column      TYPE REF TO cl_salv_column,
+          lo_functions   TYPE REF TO cl_salv_functions_list,
+          ls_position    TYPE zif_abapgit_popups=>ty_popup_position,
+          lv_add_obj_col TYPE abap_bool,
+          lo_event       TYPE REF TO cl_salv_events_table.
+ 
+    gt_log = prepare_log_for_display( ii_log ).
+ 
+    "check if log contains any object info
+    LOOP AT gt_log REFERENCE INTO lr_log.
+      IF lr_log->obj_type IS NOT INITIAL OR lr_log->obj_name IS NOT INITIAL.
+        lv_add_obj_col = abap_true.
+      ENDIF.
+    ENDLOOP.
+ 
+    TRY.
+        cl_salv_table=>factory(
+          IMPORTING
+            r_salv_table = lo_alv
+          CHANGING
+            t_table      = gt_log ).
+ 
+        lo_functions = lo_alv->get_functions( ).
+        lo_functions->set_all( ).
+ 
+        lo_alv->get_display_settings( )->set_list_header( |abapGit Log Viewer| ).
+ 
+        lo_columns = lo_alv->get_columns( ).
+ 
+        lo_columns->set_optimize( ).
+        lo_columns->set_cell_type_column( |CELL_TYPE| ).
+ 
+        calculate_cell_type( ).
+ 
+        lo_column = lo_columns->get_column( |TYPE| ).
+        lo_column->set_medium_text( |Type| ).
+ 
+        lo_column = lo_columns->get_column( |MSG| ).
+        lo_column->set_medium_text( |Message| ).
+ 
+        lo_column = lo_columns->get_column( |LONGTEXT| ).
+        lo_column->set_medium_text( |Longtext| ).
+ 
+        lo_column = lo_columns->get_column( |T100| ).
+        lo_column->set_medium_text( |Goto message| ).
+ 
+        lo_column = lo_columns->get_column( |SOURCE| ).
+        lo_column->set_medium_text( |Goto source| ).
+ 
+        lo_column = lo_columns->get_column( |CALLSTACK| ).
+        lo_column->set_medium_text( |Show callstack| ).
+ 
+        IF lv_add_obj_col = abap_true.
+          lo_column = lo_columns->get_column( |OBJ_TYPE| ).
+          lo_column->set_medium_text( |Object Type| ).
+ 
+          lo_column = lo_columns->get_column( |OBJ_NAME| ).
+          lo_column->set_medium_text( |Object Name| ).
+        ELSE.
+          "hide object columns
+          lo_column = lo_columns->get_column( |OBJ_TYPE| ).
+          lo_column->set_technical( abap_true ).
+ 
+          lo_column = lo_columns->get_column( |OBJ_NAME| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        "hide empty columns
+        LOOP AT gt_log TRANSPORTING NO FIELDS WHERE t100 IS NOT INITIAL.
+          EXIT.
+        ENDLOOP.
+        IF sy-subrc <> 0.
+          lo_column = lo_columns->get_column( |T100| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        LOOP AT gt_log TRANSPORTING NO FIELDS WHERE source IS NOT INITIAL.
+          EXIT.
+        ENDLOOP.
+        IF sy-subrc <> 0.
+          lo_column = lo_columns->get_column( |SOURCE| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        LOOP AT gt_log TRANSPORTING NO FIELDS WHERE longtext IS NOT INITIAL.
+          EXIT.
+        ENDLOOP.
+        IF sy-subrc <> 0.
+          lo_column = lo_columns->get_column( |LONGTEXT| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        LOOP AT gt_log TRANSPORTING NO FIELDS WHERE callstack IS NOT INITIAL.
+          EXIT.
+        ENDLOOP.
+        IF sy-subrc <> 0.
+          lo_column = lo_columns->get_column( |CALLSTACK| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        ls_position = zcl_abapgit_popups=>center(
+          iv_width  = 125
+          iv_height = 20 ).
+ 
+        lo_alv->set_screen_popup( start_column = ls_position-start_column
+                                  end_column   = ls_position-end_column
+                                  start_line   = ls_position-start_row
+                                  end_line     = ls_position-end_row ).
+ 
+        CREATE OBJECT lo_form_header
+          EXPORTING
+            text = ii_log->get_title( ).
+ 
+        lo_alv->set_top_of_list( lo_form_header ).
+ 
+        lo_event = lo_alv->get_event( ).
+ 
+        SET HANDLER on_link_click FOR lo_event.
+ 
+        lo_alv->display( ).
+ 
+      CATCH cx_salv_error INTO lx_error.
+        MESSAGE lx_error TYPE ''S'' DISPLAY LIKE ''E''.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD show_longtext.
+ 
+    DATA: lx_abapgit TYPE REF TO zcx_abapgit_exception.
+ 
+    DATA: lv_docu_object TYPE dokhl-object,
+          lt_dummy1      TYPE TABLE OF dselc,
+          lt_dummy2      TYPE TABLE OF dval,
+          ls_help_info   TYPE help_info.
+ 
+    IF is_log-exception IS NOT BOUND.
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        lx_abapgit ?= is_log-exception.
+      CATCH cx_sy_move_cast_error.
+        RETURN.
+    ENDTRY.
+ 
+    lv_docu_object   = lx_abapgit->if_t100_message~t100key-msgid.
+    lv_docu_object+2 = lx_abapgit->if_t100_message~t100key-msgno.
+ 
+    ls_help_info-call       = ''D''.
+    ls_help_info-spras      = sy-langu.
+    ls_help_info-messageid  = lx_abapgit->if_t100_message~t100key-msgid.
+    ls_help_info-messagenr  = lx_abapgit->if_t100_message~t100key-msgno.
+    ls_help_info-message    = is_log-msg.
+    ls_help_info-title      = ''Longtext''.
+    ls_help_info-docuid     = ''NA''.
+    ls_help_info-docuobject = lv_docu_object.
+    ls_help_info-msgv1      = lx_abapgit->msgv1.
+    ls_help_info-msgv2      = lx_abapgit->msgv2.
+    ls_help_info-msgv3      = lx_abapgit->msgv3.
+    ls_help_info-msgv4      = lx_abapgit->msgv4.
+ 
+    CALL FUNCTION ''HELP_START''
+      EXPORTING
+        help_infos   = ls_help_info
+      TABLES
+        dynpselect   = lt_dummy1
+        dynpvaluetab = lt_dummy2
+      EXCEPTIONS
+        OTHERS       = 1.
+ 
+    IF sy-subrc IS NOT INITIAL.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_html.
+ 
+    DATA: lt_message TYPE zif_abapgit_log=>ty_log_outs,
+          lr_message TYPE REF TO zif_abapgit_log=>ty_log_out,
+          lv_class   TYPE string,
+          lv_icon    TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF ii_log->count( ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    lt_message = ii_log->get_messages( ).
+ 
+    LOOP AT lt_message REFERENCE INTO lr_message.
+      CASE lr_message->type.
+        WHEN ''W''.
+          lv_icon  = ''attention''.
+          lv_class = ''warning''.
+        WHEN ''E''.
+          lv_icon  = ''error''.
+          lv_class = ''error''.
+        WHEN OTHERS. " ??? unexpected
+          lv_icon  = ''error''.
+          lv_class = ''error''.
+      ENDCASE.
+ 
+      ri_html->add( |<span class="{ lv_class }">| ).
+      ri_html->add_icon( lv_icon ).
+      ri_html->add( lr_message->text ).
+      ri_html->add( ''</span>'' ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD write_log.
+ 
+    DATA: lt_message TYPE zif_abapgit_log=>ty_log_outs,
+          lr_message TYPE REF TO zif_abapgit_log=>ty_log_out,
+          lv_text    TYPE string.
+ 
+    lt_message = ii_log->get_messages( ).
+ 
+    LOOP AT lt_message REFERENCE INTO lr_message.
+      IF lr_message->obj_name IS NOT INITIAL AND lr_message->obj_type IS NOT INITIAL.
+        lv_text = |{ lr_message->type }: { lr_message->text } ({ lr_message->obj_type }/{ lr_message->obj_name })|.
+      ELSE.
+        lv_text = |{ lr_message->type }: { lr_message->text }|.
+      ENDIF.
+      WRITE: / lv_text.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_MENU_PROVIDER           ', 'INTERFACE zif_abapgit_gui_menu_provider
+  PUBLIC .
+ 
+  METHODS get_menu
+    RETURNING
+      VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_PAGE_TITLE              ', 'INTERFACE zif_abapgit_gui_page_title
+  PUBLIC .
+ 
+  METHODS get_page_title
+    RETURNING
+      VALUE(rv_title) TYPE string.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_GUI_RENDER_ITEM             ', 'INTERFACE zif_abapgit_gui_render_item
+  PUBLIC .
+ 
+  METHODS render
+    IMPORTING
+      iv_item        TYPE any
+      iv_index       TYPE i
+    RETURNING
+      VALUE(ri_html) TYPE REF TO zif_abapgit_html
+    RAISING
+      zcx_abapgit_exception .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_HTML_FORM                   ', 'INTERFACE zif_abapgit_html_form
+  PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_subitem,
+      label    TYPE string,
+      value    TYPE string,
+      readonly TYPE abap_bool,
+    END OF ty_subitem .
+  TYPES:
+    ty_subitems TYPE STANDARD TABLE OF ty_subitem WITH DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_field,
+      type          TYPE i,
+      name          TYPE string,
+      label         TYPE string,
+      hint          TYPE string,
+      dblclick      TYPE string,
+      click         TYPE string,
+      placeholder   TYPE string,
+      required      TYPE string,
+      upper_case    TYPE abap_bool,
+      item_class    TYPE string,
+      error         TYPE string,
+      default_value TYPE string,
+      side_action   TYPE string,
+      subitems      TYPE ty_subitems,
+      readonly      TYPE abap_bool,
+      password      TYPE abap_bool,
+      condense      TYPE abap_bool,
+      min           TYPE i,
+      max           TYPE i,
+      rows          TYPE i,
+      cols          TYPE i,
+    END OF ty_field .
+  TYPES:
+    ty_fields TYPE STANDARD TABLE OF ty_field
+          WITH DEFAULT KEY
+          WITH UNIQUE SORTED KEY by_name COMPONENTS name .
+  TYPES:
+    BEGIN OF ty_command,
+      label    TYPE string,
+      action   TYPE string,
+      cmd_type TYPE i,
+    END OF ty_command .
+ 
+  CONSTANTS c_rows TYPE string VALUE ''rows''.
+  CONSTANTS:
+    BEGIN OF c_cmd_type,
+      input      TYPE i VALUE 1,
+      input_main TYPE i VALUE 2,
+      link       TYPE i VALUE 3,
+      button     TYPE i VALUE 4,
+    END OF c_cmd_type .
+  CONSTANTS:
+    BEGIN OF c_field_type,
+      text        TYPE i VALUE 1,
+      radio       TYPE i VALUE 2,
+      checkbox    TYPE i VALUE 3,
+      field_group TYPE i VALUE 4,
+      number      TYPE i VALUE 5,
+      textarea    TYPE i VALUE 6,
+      table       TYPE i VALUE 7,
+      hidden      TYPE i VALUE 8,
+    END OF c_field_type .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_HTML_POPUP                  ', 'INTERFACE zif_abapgit_html_popup
+  PUBLIC .
+ 
+  METHODS create_picklist
+    RETURNING
+      VALUE(ro_picklist) TYPE REF TO zcl_abapgit_gui_picklist
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_HTML_TABLE                  ', 'INTERFACE zif_abapgit_html_table
+  PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_row_attrs,
+      css_class TYPE string,
+    END OF ty_row_attrs.
+ 
+  TYPES:
+    BEGIN OF ty_cell_render,
+      css_class TYPE string,
+      content TYPE string,
+      html TYPE REF TO zif_abapgit_html,
+    END OF ty_cell_render.
+ 
+  METHODS get_row_attrs
+    IMPORTING
+      iv_row_index TYPE i
+      is_row TYPE any
+    RETURNING
+      VALUE(rs_attrs) TYPE ty_row_attrs
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS render_cell
+    IMPORTING
+      iv_row_index TYPE i
+      is_row TYPE any
+      iv_column_id TYPE string
+      iv_value TYPE any
+    RETURNING
+      VALUE(rs_render) TYPE ty_cell_render
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN          ', 'CLASS zcl_abapgit_gui_page_addofflin DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        url                TYPE string VALUE ''url'',
+        package            TYPE string VALUE ''package'',
+        folder_logic       TYPE string VALUE ''folder_logic'',
+        labels             TYPE string VALUE ''labels'',
+        ignore_subpackages TYPE string VALUE ''ignore_subpackages'',
+        main_lang_only     TYPE string VALUE ''main_lang_only'',
+      END OF c_id .
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        go_back          TYPE string VALUE ''go-back'',
+        choose_package   TYPE string VALUE ''choose-package'',
+        choose_labels    TYPE string VALUE ''choose-labels'',
+        create_package   TYPE string VALUE ''create-package'',
+        add_offline_repo TYPE string VALUE ''add-repo-offline'',
+      END OF c_event .
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form .
+ 
+    METHODS choose_labels
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN IMPLEMENTATION.
+ 
+ 
+  METHOD choose_labels.
+ 
+    DATA:
+      lv_old_labels TYPE string,
+      lv_new_labels TYPE string.
+ 
+    lv_old_labels = mo_form_data->get( c_id-labels ).
+ 
+    lv_new_labels = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_labels( lv_old_labels ).
+ 
+    mo_form_data->set(
+      iv_key = c_id-labels
+      iv_val = lv_new_labels ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_addofflin.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''New Offline Repository''
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = ''add-repo-offline-form''
+                iv_help_page = ''https://docs.abapgit.org/guide-offline-install.html'' ).
+ 
+    ro_form->text(
+      iv_name        = c_id-url
+      iv_required    = abap_true
+      iv_label       = ''Repository Name''
+      iv_hint        = ''Unique name for repository''
+    )->text(
+      iv_name        = c_id-package
+      iv_side_action = c_event-choose_package
+      iv_required    = abap_true
+      iv_upper_case  = abap_true
+      iv_label       = ''Package''
+      iv_hint        = ''SAP package for repository (should be a dedicated one)''
+      iv_placeholder = ''Z... / $...''
+    )->radio(
+      iv_name        = c_id-folder_logic
+      iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_label       = ''Folder Logic''
+      iv_hint        = ''Define how package folders are named in repository''
+    )->option(
+      iv_label       = ''Prefix''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+    )->option(
+      iv_label       = ''Full''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-full
+    )->option(
+      iv_label       = ''Mixed''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+    )->text(
+      iv_name        = c_id-labels
+      iv_side_action = c_event-choose_labels
+      iv_label       = |Labels (comma-separated, allowed chars: "{ zcl_abapgit_repo_labels=>c_allowed_chars }")|
+      iv_hint        = ''Comma-separated labels for grouping and repo organization (optional)''
+    )->checkbox(
+      iv_name        = c_id-ignore_subpackages
+      iv_label       = ''Ignore Subpackages''
+      iv_hint        = ''Synchronize root package only''
+    )->checkbox(
+      iv_name        = c_id-main_lang_only
+      iv_label       = ''Serialize Main Language Only''
+      iv_hint        = ''Ignore translations, serialize just main language''
+    )->command(
+      iv_label       = ''Create Offline Repo''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-add_offline_repo
+    )->command(
+      iv_label       = ''Create Package''
+      iv_action      = c_event-create_package
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = c_event-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA lx_err TYPE REF TO zcx_abapgit_exception.
+ 
+    ro_validation_log = mo_form_util->validate( io_form_data ).
+ 
+    IF io_form_data->get( c_id-package ) IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_repo_srv=>get_instance( )->validate_package(
+            iv_package    = |{ io_form_data->get( c_id-package ) }|
+            iv_ign_subpkg = |{ io_form_data->get( c_id-ignore_subpackages ) }| ).
+        CATCH zcx_abapgit_exception INTO lx_err.
+          ro_validation_log->set(
+            iv_key = c_id-package
+            iv_val = lx_err->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+        AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-full
+        AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+      ro_validation_log->set(
+        iv_key = c_id-folder_logic
+        iv_val = |Invalid folder logic { io_form_data->get( c_id-folder_logic ) }| ).
+    ENDIF.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate( io_form_data->get( c_id-labels ) ).
+      CATCH zcx_abapgit_exception INTO lx_err.
+        ro_validation_log->set(
+          iv_key = c_id-labels
+          iv_val = lx_err->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA: ls_repo_params      TYPE zif_abapgit_services_repo=>ty_repo_params,
+          lo_new_offline_repo TYPE REF TO zcl_abapgit_repo_offline.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-create_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_services_basis=>create_package(
+            iv_prefill_package = |{ mo_form_data->get( c_id-package ) }| ) ).
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          mo_validation_log = validate_form( mo_form_data ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+ 
+      WHEN c_event-choose_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( ''TDEVC-DEVCLASS'' ) ).
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          mo_validation_log = validate_form( mo_form_data ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+ 
+      WHEN c_event-choose_labels.
+ 
+        choose_labels( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-add_offline_repo.
+ 
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          mo_form_data->to_abap( CHANGING cs_container = ls_repo_params ).
+          lo_new_offline_repo = zcl_abapgit_services_repo=>new_offline( ls_repo_params ).
+          rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lo_new_offline_repo->get_key( ) ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. " Display errors
+        ENDIF.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="form-container">'' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_ADDONLINE          ', 'CLASS zcl_abapgit_gui_page_addonline DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        url                TYPE string VALUE ''url'',
+        package            TYPE string VALUE ''package'',
+        branch_name        TYPE string VALUE ''branch_name'',
+        display_name       TYPE string VALUE ''display_name'',
+        labels             TYPE string VALUE ''labels'',
+        folder_logic       TYPE string VALUE ''folder_logic'',
+        ignore_subpackages TYPE string VALUE ''ignore_subpackages'',
+        main_lang_only     TYPE string VALUE ''main_lang_only'',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        go_back         TYPE string VALUE ''go-back'',
+        choose_package  TYPE string VALUE ''choose-package'',
+        create_package  TYPE string VALUE ''create-package'',
+        choose_branch   TYPE string VALUE ''choose-branch'',
+        choose_labels   TYPE string VALUE ''choose-labels'',
+        add_online_repo TYPE string VALUE ''add-repo-online'',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+ 
+    METHODS validate_form
+      IMPORTING
+        io_form_data             TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+ 
+    METHODS choose_labels
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_addonline IMPLEMENTATION.
+ 
+ 
+  METHOD choose_labels.
+ 
+    DATA:
+      lv_old_labels TYPE string,
+      lv_new_labels TYPE string.
+ 
+    lv_old_labels = mo_form_data->get( c_id-labels ).
+ 
+    lv_new_labels = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_labels( lv_old_labels ).
+ 
+    mo_form_data->set(
+      iv_key = c_id-labels
+      iv_val = lv_new_labels ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_addonline.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''New Online Repository''
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = ''add-repo-online-form''
+                iv_help_page = ''https://docs.abapgit.org/guide-online-install.html'' ).
+ 
+    ro_form->text(
+      iv_name        = c_id-url
+      iv_required    = abap_true
+      iv_condense    = abap_true
+      iv_label       = ''Git Repository URL''
+      iv_hint        = ''HTTPS address of the repository''
+      iv_placeholder = ''https://github.com/...git''
+    )->text(
+      iv_name        = c_id-package
+      iv_side_action = c_event-choose_package
+      iv_required    = abap_true
+      iv_upper_case  = abap_true
+      iv_label       = ''Package''
+      iv_hint        = ''SAP package for repository (should be a dedicated one)''
+      iv_placeholder = ''Z... / $...''
+    )->text(
+      iv_name        = c_id-branch_name
+      iv_side_action = c_event-choose_branch
+      iv_label       = ''Branch''
+      iv_hint        = ''Switch to a specific branch (default: autodetect)''
+      iv_placeholder = ''Autodetect default branch''
+    )->radio(
+      iv_name        = c_id-folder_logic
+      iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_label       = ''Folder Logic''
+      iv_hint        = ''Define how package folders are named in repository''
+    )->option(
+      iv_label       = ''Prefix''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+    )->option(
+      iv_label       = ''Full''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-full
+    )->option(
+      iv_label       = ''Mixed''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+    )->text(
+      iv_name        = c_id-display_name
+      iv_label       = ''Display Name''
+      iv_hint        = ''Name to show instead of original repository name (optional)''
+    )->text(
+      iv_name        = c_id-labels
+      iv_side_action = c_event-choose_labels
+      iv_label       = |Labels (comma-separated, allowed chars: "{ zcl_abapgit_repo_labels=>c_allowed_chars }")|
+      iv_hint        = ''Comma-separated labels for grouping and repo organization (optional)''
+    )->checkbox(
+      iv_name        = c_id-ignore_subpackages
+      iv_label       = ''Ignore Subpackages''
+      iv_hint        = ''Synchronize root package only''
+    )->checkbox(
+      iv_name        = c_id-main_lang_only
+      iv_label       = ''Serialize Main Language Only''
+      iv_hint        = ''Ignore translations, serialize just main language''
+    )->command(
+      iv_label       = ''Create Online Repo''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-add_online_repo
+    )->command(
+      iv_label       = ''Create Package''
+      iv_action      = c_event-create_package
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = c_event-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lv_url TYPE string,
+      lo_url TYPE REF TO zcl_abapgit_git_url,
+      lx_err TYPE REF TO zcx_abapgit_exception.
+ 
+    ro_validation_log = mo_form_util->validate( io_form_data ).
+ 
+    lv_url = io_form_data->get( c_id-url ).
+    IF lv_url IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_repo_srv=>get_instance( )->validate_url( lv_url ).
+ 
+          " Provider-specific URL check
+          CREATE OBJECT lo_url.
+          lo_url->validate_url( lv_url ).
+        CATCH zcx_abapgit_exception INTO lx_err.
+          ro_validation_log->set(
+            iv_key = c_id-url
+            iv_val = lx_err->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF io_form_data->get( c_id-package ) IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_repo_srv=>get_instance( )->validate_package(
+            iv_package    = |{ io_form_data->get( c_id-package ) }|
+            iv_ign_subpkg = |{ io_form_data->get( c_id-ignore_subpackages ) }| ).
+        CATCH zcx_abapgit_exception INTO lx_err.
+          ro_validation_log->set(
+            iv_key = c_id-package
+            iv_val = lx_err->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+        AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-full
+        AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+      ro_validation_log->set(
+        iv_key = c_id-folder_logic
+        iv_val = |Invalid folder logic { io_form_data->get( c_id-folder_logic ) }| ).
+    ENDIF.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate( io_form_data->get( c_id-labels ) ).
+      CATCH zcx_abapgit_exception INTO lx_err.
+        ro_validation_log->set(
+          iv_key = c_id-labels
+          iv_val = lx_err->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA: ls_repo_params     TYPE zif_abapgit_services_repo=>ty_repo_params,
+          lo_new_online_repo TYPE REF TO zcl_abapgit_repo_online.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-create_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_services_basis=>create_package(
+            iv_prefill_package = |{ mo_form_data->get( c_id-package ) }| ) ).
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          mo_validation_log = validate_form( mo_form_data ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+ 
+      WHEN c_event-choose_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( ''TDEVC-DEVCLASS'' ) ).
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          mo_validation_log = validate_form( mo_form_data ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+ 
+      WHEN c_event-choose_branch.
+ 
+        mo_validation_log = validate_form( mo_form_data ).
+        IF mo_validation_log->has( c_id-url ) = abap_true.
+          mo_validation_log->set(
+            iv_key = c_id-branch_name
+            iv_val = ''Check URL issues'' ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. " Display errors
+          RETURN.
+        ENDIF.
+        mo_form_data->set(
+          iv_key = c_id-branch_name
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->branch_list_popup( mo_form_data->get( c_id-url ) )-name ).
+ 
+        IF mo_form_data->get( c_id-branch_name ) IS INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ELSE.
+          mo_form_data->set(
+            iv_key = c_id-branch_name
+            iv_val = replace( " strip technical
+              val = mo_form_data->get( c_id-branch_name )
+              sub = zif_abapgit_git_definitions=>c_git_branch-heads_prefix
+              with = '''' ) ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+      WHEN c_event-choose_labels.
+ 
+        choose_labels( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-add_online_repo.
+ 
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          mo_form_data->to_abap( CHANGING cs_container = ls_repo_params ).
+          lo_new_online_repo = zcl_abapgit_services_repo=>new_online( ls_repo_params ).
+          rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lo_new_online_repo->get_key( ) ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. " Display errors
+        ENDIF.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="form-container">'' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( ''</div>'' ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_CODE_INSP          ', 'CLASS zcl_abapgit_gui_page_code_insp DEFINITION PUBLIC FINAL CREATE PUBLIC
+    INHERITING FROM zcl_abapgit_gui_page_codi_base.
+ 
+  PUBLIC SECTION.
+    INTERFACES: zif_abapgit_gui_hotkeys.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          io_repo          TYPE REF TO zcl_abapgit_repo
+          io_stage         TYPE REF TO zcl_abapgit_stage OPTIONAL
+          iv_check_variant TYPE sci_chkv OPTIONAL
+        RAISING
+          zcx_abapgit_exception,
+ 
+      is_nothing_to_display
+        RETURNING
+          VALUE(rv_yes) TYPE abap_bool,
+ 
+      zif_abapgit_gui_event_handler~on_event
+        REDEFINITION,
+ 
+      zif_abapgit_gui_renderable~render
+        REDEFINITION.
+ 
+  PROTECTED SECTION.
+ 
+    METHODS:
+      render_content   REDEFINITION.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_stage         TYPE REF TO zcl_abapgit_stage,
+      mv_check_variant TYPE sci_chkv.
+ 
+    METHODS:
+      build_menu
+        RETURNING
+          VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar
+        RAISING
+          zcx_abapgit_exception,
+ 
+      run_code_inspector
+        RAISING
+          zcx_abapgit_exception,
+ 
+      has_inspection_errors
+        RETURNING
+          VALUE(rv_has_inspection_errors) TYPE abap_bool,
+ 
+      is_stage_allowed
+        RETURNING
+          VALUE(rv_is_stage_allowed) TYPE abap_bool,
+ 
+      ask_user_for_check_variant
+        RETURNING
+          VALUE(rv_check_variant) TYPE sci_chkv
+        RAISING
+          zcx_abapgit_exception,
+ 
+      determine_check_variant
+        RAISING
+          zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION.
+ 
+ 
+  METHOD ask_user_for_check_variant.
+ 
+    rv_check_variant = zcl_abapgit_ui_factory=>get_popups( )->choose_code_insp_check_variant( ).
+ 
+    IF rv_check_variant IS INITIAL.
+      zcx_abapgit_exception=>raise( |Please select a check variant.| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_menu.
+ 
+    DATA: lv_opt TYPE c LENGTH 1.
+ 
+    ro_menu = build_base_menu( ).
+ 
+    IF is_stage_allowed( ) = abap_false.
+      lv_opt = zif_abapgit_html=>c_html_opt-crossout.
+    ENDIF.
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    IF mo_stage IS BOUND.
+ 
+      " Staging info already available, we can directly
+      " offer to commit
+ 
+      ro_menu->add( iv_txt = ''Commit''
+                    iv_act = c_actions-commit
+                    iv_cur = abap_false
+                    iv_opt = lv_opt ).
+ 
+    ELSE.
+ 
+      ro_menu->add( iv_txt = ''Stage''
+                    iv_act = c_actions-stage
+                    iv_cur = abap_false
+                    iv_opt = lv_opt ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    mo_repo = io_repo.
+    mo_stage = io_stage.
+    mv_check_variant = iv_check_variant.
+    ms_control-page_title = ''Code Inspector''.
+    determine_check_variant( ).
+    run_code_inspector( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_check_variant.
+ 
+    IF mv_check_variant IS NOT INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    mv_check_variant = mo_repo->get_local_settings( )-code_inspector_check_variant.
+ 
+    IF mv_check_variant IS INITIAL.
+      mv_check_variant = ask_user_for_check_variant( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD has_inspection_errors.
+ 
+    READ TABLE mt_result TRANSPORTING NO FIELDS
+                         WITH KEY kind = ''E''.
+    rv_has_inspection_errors = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_nothing_to_display.
+    rv_yes = boolc( lines( mt_result ) = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_stage_allowed.
+ 
+    rv_is_stage_allowed = boolc( NOT ( mo_repo->get_local_settings( )-block_commit = abap_true
+                                           AND has_inspection_errors( ) = abap_true ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( \`<div class="repo">\` ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( io_repo        = mo_repo
+                                                              iv_show_commit = abap_false ) ).
+    ri_html->add( \`</div>\` ).
+ 
+    IF mv_check_variant IS INITIAL.
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_error( iv_error = ''No check variant supplied.'' ) ).
+      RETURN.
+    ENDIF.
+ 
+    register_handlers( ).
+ 
+    ri_html->add( render_variant(
+      iv_variant = mv_check_variant
+      iv_summary = mv_summary ) ).
+ 
+    IF lines( mt_result ) = 0.
+      ri_html->add( ''<div class="dummydiv success">'' ).
+      ri_html->add( ri_html->icon( ''check'' ) ).
+      ri_html->add( ''No code inspector findings'' ).
+      ri_html->add( ''</div>'' ).
+    ELSE.
+      render_result(
+        ii_html   = ri_html
+        it_result = mt_result ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run_code_inspector.
+ 
+    DATA: li_code_inspector TYPE REF TO zif_abapgit_code_inspector.
+ 
+    li_code_inspector = zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( ) ).
+ 
+    mt_result = li_code_inspector->run(
+      iv_variant = |{ mv_check_variant }|
+      iv_save    = abap_true ).
+ 
+    mv_summary = li_code_inspector->get_summary( ).
+ 
+    DELETE mt_result WHERE kind = ''N''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA lo_repo_online TYPE REF TO zcl_abapgit_repo_online.
+    DATA lv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-stage.
+ 
+        lo_repo_online ?= mo_repo.
+ 
+        IF is_stage_allowed( ) = abap_true.
+          " we need to refresh as the source might have changed
+          lo_repo_online->refresh( ).
+ 
+          READ TABLE mt_result TRANSPORTING NO FIELDS WITH KEY kind = ''E''.
+          IF sy-subrc = 0.
+            lv_sci_result = zif_abapgit_definitions=>c_sci_result-failed.
+          ELSE.
+            READ TABLE mt_result TRANSPORTING NO FIELDS WITH KEY kind = ''W''.
+            IF sy-subrc = 0.
+              lv_sci_result = zif_abapgit_definitions=>c_sci_result-warning.
+            ELSE.
+              lv_sci_result = zif_abapgit_definitions=>c_sci_result-passed.
+            ENDIF.
+          ENDIF.
+ 
+          CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_stage
+            EXPORTING
+              io_repo       = lo_repo_online
+              iv_sci_result = lv_sci_result.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+        ELSE.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+        ENDIF.
+ 
+      WHEN c_actions-commit.
+ 
+        lo_repo_online ?= mo_repo.
+ 
+        IF is_stage_allowed( ) = abap_true.
+ 
+          rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+            io_repo  = lo_repo_online
+            io_stage = mo_stage ).
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+        ELSE.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+        ENDIF.
+ 
+      WHEN c_actions-rerun.
+ 
+        run_code_inspector( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN OTHERS.
+        rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = ''Code inspector''.
+ 
+    ls_hotkey_action-description = |Stage|.
+    ls_hotkey_action-action = c_actions-stage.
+    ls_hotkey_action-hotkey = |s|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Re-Run|.
+    ls_hotkey_action-action = c_actions-rerun.
+    ls_hotkey_action-hotkey = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    ms_control-page_menu = build_menu( ).
+    ri_html = super->zif_abapgit_gui_renderable~render( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_CODI_BASE          ', 'CLASS zcl_abapgit_gui_page_codi_base DEFINITION PUBLIC ABSTRACT INHERITING FROM zcl_abapgit_gui_page.
+  PUBLIC SECTION.
+    METHODS:
+      zif_abapgit_gui_event_handler~on_event
+        REDEFINITION.
+ 
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_actions,
+        rerun  TYPE string VALUE ''rerun'' ##NO_TEXT,
+        sort_1 TYPE string VALUE ''sort_1''  ##NO_TEXT,
+        sort_2 TYPE string VALUE ''sort_2''  ##NO_TEXT,
+        sort_3 TYPE string VALUE ''sort_3''  ##NO_TEXT,
+        stage  TYPE string VALUE ''stage'' ##NO_TEXT,
+        commit TYPE string VALUE ''commit'' ##NO_TEXT,
+      END OF c_actions .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mt_result TYPE zif_abapgit_code_inspector=>ty_results .
+    DATA mv_summary TYPE string.
+ 
+    METHODS render_variant
+      IMPORTING
+        !iv_variant    TYPE sci_chkv
+        !iv_summary    TYPE string
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_result
+      IMPORTING
+        !ii_html   TYPE REF TO zif_abapgit_html
+        !it_result TYPE zif_abapgit_code_inspector=>ty_results .
+    METHODS render_result_line
+      IMPORTING
+        !ii_html   TYPE REF TO zif_abapgit_html
+        !is_result TYPE zif_abapgit_code_inspector=>ty_result .
+    METHODS build_nav_link
+      IMPORTING
+        !is_result     TYPE zif_abapgit_code_inspector=>ty_result
+      RETURNING
+        VALUE(rv_link) TYPE string .
+    METHODS jump
+      IMPORTING
+        !is_item        TYPE zif_abapgit_definitions=>ty_item
+        !is_sub_item    TYPE zif_abapgit_definitions=>ty_item
+        !iv_line_number TYPE i
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_base_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+  PRIVATE SECTION.
+    CONSTANTS c_object_separator TYPE c LENGTH 1 VALUE ''|''.
+    CONSTANTS c_ci_sig TYPE string VALUE ''cinav:''.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_codi_base IMPLEMENTATION.
+ 
+ 
+  METHOD build_base_menu.
+ 
+    DATA:
+      lo_sort_menu TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CREATE OBJECT lo_sort_menu.
+ 
+    lo_sort_menu->add(
+      iv_txt = ''By Object, Check, Sub-object''
+      iv_act = c_actions-sort_1
+    )->add(
+      iv_txt = ''By Object, Sub-object, Line''
+      iv_act = c_actions-sort_2
+    )->add(
+      iv_txt = ''By Check, Object, Sub-object''
+      iv_act = c_actions-sort_3 ).
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add( iv_txt = ''Sort''
+                  io_sub = lo_sort_menu ).
+ 
+    ro_menu->add( iv_txt = ''Re-Run''
+                  iv_act = c_actions-rerun
+                  iv_cur = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_nav_link.
+ 
+    rv_link = |{ c_ci_sig }| &&
+      |{ is_result-objtype }{ is_result-objname }| &&
+      |{ c_object_separator }{ is_result-sobjtype }{ is_result-sobjname }| &&
+      |{ c_object_separator }{ is_result-line }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump.
+ 
+    DATA: lo_test             TYPE REF TO cl_ci_test_root,
+          ls_info             TYPE scir_rest,
+          lo_result           TYPE REF TO cl_ci_result_root,
+          lv_adt_jump_enabled TYPE abap_bool,
+          lv_line_number      TYPE i,
+          ls_item             TYPE zif_abapgit_definitions=>ty_item,
+          ls_sub_item         TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS: <ls_result> LIKE LINE OF mt_result.
+ 
+ 
+    IF is_sub_item IS NOT INITIAL.
+      READ TABLE mt_result WITH KEY objtype  = is_item-obj_type
+                                    objname  = is_item-obj_name
+                                    sobjtype = is_sub_item-obj_type
+                                    sobjname = is_sub_item-obj_name
+                                    line     = iv_line_number
+                           ASSIGNING <ls_result>.
+    ELSE.
+      READ TABLE mt_result WITH KEY objtype = is_item-obj_type
+                                    objname = is_item-obj_name
+                                    line    = iv_line_number
+                           ASSIGNING <ls_result>.
+    ENDIF.
+    ASSERT <ls_result> IS ASSIGNED.
+    ls_item-obj_name = <ls_result>-objname.
+    ls_item-obj_type = <ls_result>-objtype.
+ 
+    ls_sub_item-obj_name = <ls_result>-sobjname.
+    ls_sub_item-obj_type = <ls_result>-sobjtype.
+ 
+    " see SCI_LCL_DYNP_530 / HANDLE_DOUBLE_CLICK
+ 
+    lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
+ 
+    TRY.
+        IF lv_adt_jump_enabled = abap_true.
+ 
+          lv_line_number = <ls_result>-line.
+ 
+          zcl_abapgit_objects=>jump(
+            is_item        = ls_item
+            is_sub_item    = ls_sub_item
+            iv_line_number = lv_line_number ).
+          RETURN.
+ 
+        ENDIF.
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        CALL METHOD (''CL_CI_TESTS'')=>(''GET_TEST_REF'')
+          EXPORTING
+            p_test   = <ls_result>-test
+          RECEIVING
+            p_result = lo_test.
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( |Jump to object not supported in your NW release| ).
+    ENDTRY.
+ 
+    lo_result = lo_test->get_result_node( <ls_result>-kind ).
+ 
+    MOVE-CORRESPONDING <ls_result> TO ls_info.
+ 
+    lo_result->set_info( ls_info ).
+    lo_result->if_ci_test~navigate( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_result.
+ 
+    CONSTANTS: lc_limit TYPE i VALUE 500.
+    FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_result.
+ 
+    ii_html->add( ''<div class="ci-result">'' ).
+ 
+    LOOP AT it_result ASSIGNING <ls_result> TO lc_limit.
+      render_result_line(
+        ii_html = ii_html
+        is_result = <ls_result> ).
+    ENDLOOP.
+ 
+    ii_html->add( ''</div>'' ).
+ 
+    IF lines( it_result ) > lc_limit.
+      ii_html->add( ''<div class="dummydiv warning">'' ).
+      ii_html->add( ii_html->icon( ''exclamation-triangle'' ) ).
+      ii_html->add( |Only first { lc_limit } findings shown in list!| ).
+      ii_html->add( ''</div>'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_result_line.
+ 
+    DATA: lv_class   TYPE string,
+          lv_obj_txt TYPE string,
+          lv_msg     TYPE string,
+          lv_line    TYPE i,
+          ls_mtdkey  TYPE seocpdkey.
+ 
+    CASE is_result-kind.
+      WHEN ''E''.
+        lv_class = ''ci-error''.
+      WHEN ''W''.
+        lv_class = ''ci-warning''.
+      WHEN OTHERS.
+        lv_class = ''ci-info''.
+    ENDCASE.
+ 
+    lv_msg = escape( val = is_result-text
+                     format = cl_abap_format=>e_html_attr ).
+ 
+    IF is_result-sobjname IS INITIAL OR
+       ( is_result-sobjname = is_result-objname AND
+         is_result-sobjtype = is_result-objtype ).
+      lv_obj_txt = |{ is_result-objtype } { is_result-objname }|.
+    ELSEIF is_result-objtype = ''CLAS'' OR
+         ( is_result-objtype = ''PROG'' AND NOT is_result-sobjname+30(*) IS INITIAL ).
+      TRY.
+          CASE is_result-sobjname+30(*).
+            WHEN ''CCDEF''.
+              lv_obj_txt = |CLAS { is_result-objname } : Local Definitions|.
+            WHEN ''CCIMP''.
+              lv_obj_txt = |CLAS { is_result-objname } : Local Implementations|.
+            WHEN ''CCMAC''.
+              lv_obj_txt = |CLAS { is_result-objname } : Macros|.
+            WHEN ''CCAU''.
+              lv_obj_txt = |CLAS { is_result-objname } : Test Classes|.
+            WHEN ''CU''.
+              lv_obj_txt = |CLAS { is_result-objname } : Public Section|.
+            WHEN ''CO''.
+              lv_obj_txt = |CLAS { is_result-objname } : Protected Section|.
+            WHEN ''CI''.
+              lv_obj_txt = |CLAS { is_result-objname } : Private Section|.
+            WHEN OTHERS.
+              cl_oo_classname_service=>get_method_by_include(
+                EXPORTING
+                  incname             = is_result-sobjname
+                RECEIVING
+                  mtdkey              = ls_mtdkey
+                EXCEPTIONS
+                  class_not_existing  = 1
+                  method_not_existing = 2
+                  OTHERS              = 3 ).
+              IF sy-subrc = 0.
+                lv_obj_txt = |CLAS { ls_mtdkey-clsname }->{ ls_mtdkey-cpdname }|.
+              ELSE.
+                lv_obj_txt = |{ is_result-objtype } { is_result-sobjname }|.
+              ENDIF.
+ 
+          ENDCASE.
+        CATCH cx_root.
+          lv_obj_txt = ''''. "use default below
+      ENDTRY.
+    ENDIF.
+    IF lv_obj_txt IS INITIAL.
+      lv_obj_txt = |{ is_result-objtype } { is_result-objname } &gt; { is_result-sobjtype } { is_result-sobjname }|.
+    ENDIF.
+    lv_line = is_result-line. " convert from numc to integer
+    lv_obj_txt = |{ lv_obj_txt } [ @{ lv_line } ]|.
+ 
+    ii_html->add( |<li class="{ lv_class }">| ).
+    ii_html->add_a(
+      iv_txt = lv_obj_txt
+      iv_act = build_nav_link( is_result )
+      iv_typ = zif_abapgit_html=>c_action_type-sapevent ).
+    ii_html->add( |<span>{ lv_msg }</span>| ).
+    ii_html->add( ''</li>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_variant.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="ci-head">'' ).
+    ri_html->add( |Code inspector check variant <span class="ci-variant">{ iv_variant }</span>|
+               && | completed ({ iv_summary })| ).
+    ri_html->add( \`</div>\` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    DATA: ls_item          TYPE zif_abapgit_definitions=>ty_item,
+          ls_sub_item      TYPE zif_abapgit_definitions=>ty_item,
+          lv_temp          TYPE string,
+          lv_main_object   TYPE string,
+          lv_sub_object    TYPE string,
+          lv_line_number_s TYPE string,
+          lv_line_number   TYPE i.
+ 
+    lv_temp = replace( val   = ii_event->mv_action
+                       regex = |^{ c_ci_sig }|
+                       with  = \`\` ).
+ 
+    IF lv_temp <> ii_event->mv_action. " CI navigation request detected
+ 
+      SPLIT lv_temp AT c_object_separator INTO lv_main_object lv_sub_object lv_line_number_s.
+      ls_item-obj_type = to_upper( lv_main_object(4) ).
+      ls_item-obj_name = to_upper( lv_main_object+4(*) ).
+ 
+      IF lv_sub_object IS NOT INITIAL.
+        ls_sub_item-obj_type = to_upper( lv_sub_object(4) ).
+        ls_sub_item-obj_name = to_upper( lv_sub_object+4(*) ).
+      ENDIF.
+ 
+      lv_line_number = lv_line_number_s.
+ 
+      jump( is_item        = ls_item
+            is_sub_item    = ls_sub_item
+            iv_line_number = lv_line_number ).
+ 
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+    ENDIF.
+ 
+    CASE ii_event->mv_action.
+ 
+      WHEN c_actions-sort_1.
+        SORT mt_result BY objtype objname test code sobjtype sobjname line col.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_actions-sort_2.
+        SORT mt_result BY objtype objname sobjtype sobjname line col test code.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_actions-sort_3.
+        SORT mt_result BY test code objtype objname sobjtype sobjname line col.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_COMMIT             ', 'CLASS zcl_abapgit_gui_page_commit DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo_online
+        !io_stage      TYPE REF TO zcl_abapgit_stage
+        !iv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result DEFAULT zif_abapgit_definitions=>c_sci_result-no_run
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo_online
+        !io_stage      TYPE REF TO zcl_abapgit_stage
+        !iv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        committer       TYPE string VALUE ''committer'',
+        committer_name  TYPE string VALUE ''committer_name'',
+        committer_email TYPE string VALUE ''committer_email'',
+        message         TYPE string VALUE ''message'',
+        comment         TYPE string VALUE ''comment'',
+        body            TYPE string VALUE ''body'',
+        author          TYPE string VALUE ''author'',
+        author_name     TYPE string VALUE ''author_name'',
+        author_email    TYPE string VALUE ''author_email'',
+        new_branch_name TYPE string VALUE ''new_branch_name'',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        commit TYPE string VALUE ''commit'',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings.
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online.
+    DATA mo_stage TYPE REF TO zcl_abapgit_stage.
+    DATA mt_stage TYPE zif_abapgit_definitions=>ty_stage_tt.
+    DATA ms_commit TYPE zif_abapgit_services_git=>ty_commit_fields.
+    DATA mv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result.
+ 
+    METHODS render_stage_summary
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+    METHODS render_stage_details
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+    METHODS get_defaults
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_committer_name
+      RETURNING
+        VALUE(rv_user) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_committer_email
+      RETURNING
+        VALUE(rv_email) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_comment_default
+      RETURNING
+        VALUE(rv_text) TYPE string.
+    METHODS get_comment_object
+      IMPORTING
+        !it_stage      TYPE zif_abapgit_definitions=>ty_stage_tt
+      RETURNING
+        VALUE(rv_text) TYPE string.
+    METHODS get_comment_file
+      IMPORTING
+        !it_stage      TYPE zif_abapgit_definitions=>ty_stage_tt
+      RETURNING
+        VALUE(rv_text) TYPE string.
+    METHODS branch_name_to_internal
+      IMPORTING
+        iv_branch_name            TYPE string
+      RETURNING
+        VALUE(rv_new_branch_name) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION.
+ 
+ 
+  METHOD branch_name_to_internal.
+    rv_new_branch_name = zcl_abapgit_git_branch_list=>complete_heads_branch_name(
+      zcl_abapgit_git_branch_list=>normalize_branch_name( iv_branch_name ) ).
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    mo_repo       = io_repo.
+    mo_stage      = io_stage.
+    mt_stage      = mo_stage->get_all( ).
+    mv_sci_result = iv_sci_result.
+ 
+    " Get settings from DB
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_commit.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo       = io_repo
+        io_stage      = io_stage
+        iv_sci_result = iv_sci_result.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Commit''
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_comment_default.
+ 
+    rv_text = mo_settings->get_commitmsg_comment_default( ).
+ 
+    IF rv_text IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    REPLACE ''$FILE''   IN rv_text WITH get_comment_file( mt_stage ).
+    REPLACE ''$OBJECT'' IN rv_text WITH get_comment_object( mt_stage ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_comment_file.
+ 
+    DATA lv_count TYPE i.
+ 
+    FIELD-SYMBOLS <ls_stage> LIKE LINE OF it_stage.
+ 
+    lv_count = lines( it_stage ).
+ 
+    IF lv_count = 1.
+      " Just one file so we use the file name
+      READ TABLE it_stage ASSIGNING <ls_stage> INDEX 1.
+      ASSERT sy-subrc = 0.
+ 
+      rv_text = <ls_stage>-file-filename.
+    ELSE.
+      " For multiple file we use the count instead
+      rv_text = |{ lv_count } files|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_comment_object.
+ 
+    DATA:
+      lv_count TYPE i,
+      ls_item  TYPE zif_abapgit_definitions=>ty_item,
+      lt_items TYPE zif_abapgit_definitions=>ty_items_tt.
+ 
+    FIELD-SYMBOLS <ls_stage> LIKE LINE OF it_stage.
+ 
+    " Get objects
+    LOOP AT it_stage ASSIGNING <ls_stage>.
+      CLEAR ls_item.
+      ls_item-obj_type = <ls_stage>-status-obj_type.
+      ls_item-obj_name = <ls_stage>-status-obj_name.
+      COLLECT ls_item INTO lt_items.
+    ENDLOOP.
+ 
+    lv_count = lines( lt_items ).
+ 
+    IF lv_count = 1.
+      " Just one object so we use the object name
+      READ TABLE lt_items INTO ls_item INDEX 1.
+      ASSERT sy-subrc = 0.
+ 
+      CONCATENATE ls_item-obj_type ls_item-obj_name INTO rv_text SEPARATED BY space.
+    ELSE.
+      " For multiple objects we use the count instead
+      rv_text = |{ lv_count } objects|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_committer_email.
+ 
+    DATA li_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    rv_email = li_user->get_repo_git_user_email( mo_repo->get_url( ) ).
+    IF rv_email IS INITIAL.
+      rv_email = li_user->get_default_git_user_email( ).
+    ENDIF.
+    IF rv_email IS INITIAL.
+      " get default from user record
+      rv_email = zcl_abapgit_user_record=>get_instance( sy-uname )->get_email( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_committer_name.
+ 
+    DATA li_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    rv_user  = li_user->get_repo_git_user_name( mo_repo->get_url( ) ).
+    IF rv_user IS INITIAL.
+      rv_user  = li_user->get_default_git_user_name( ).
+    ENDIF.
+    IF rv_user IS INITIAL.
+      " get default from user record
+      rv_user = zcl_abapgit_user_record=>get_instance( sy-uname )->get_name( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_defaults.
+ 
+    ms_commit-committer_name  = get_committer_name( ).
+    ms_commit-committer_email = get_committer_email( ).
+    ms_commit-comment         = get_comment_default( ).
+ 
+    " Committer
+    mo_form_data->set(
+      iv_key = c_id-committer_name
+      iv_val = ms_commit-committer_name ).
+    mo_form_data->set(
+      iv_key = c_id-committer_email
+      iv_val = ms_commit-committer_email ).
+ 
+    " Message
+    mo_form_data->set(
+      iv_key = c_id-comment
+      iv_val = ms_commit-comment ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA: lv_commitmsg_comment_length TYPE i.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = ''commit-form''
+      iv_help_page = ''https://docs.abapgit.org/guide-stage-commit.html'' ).
+ 
+    lv_commitmsg_comment_length =  mo_settings->get_commitmsg_comment_length( ).
+ 
+    ro_form->text(
+      iv_name        = c_id-comment
+      iv_label       = ''Comment''
+      iv_required    = abap_true
+      iv_max         = lv_commitmsg_comment_length
+      iv_placeholder = |Add a mandatory comment with max { lv_commitmsg_comment_length } characters|
+    )->textarea(
+      iv_name        = c_id-body
+      iv_label       = ''Body''
+      iv_rows        = 6
+      iv_cols        = mo_settings->get_commitmsg_body_size( )
+      iv_placeholder = ''Add an optional description...''
+    )->text(
+      iv_name        = c_id-committer_name
+      iv_label       = ''Committer Name''
+      iv_required    = abap_true
+    )->text(
+      iv_name        = c_id-committer_email
+      iv_label       = ''Committer Email''
+      iv_required    = abap_true ).
+ 
+    IF mo_settings->get_commitmsg_hide_author( ) IS INITIAL.
+      ro_form->text(
+        iv_name        = c_id-author_name
+        iv_label       = ''Author Name''
+        iv_placeholder = ''Optionally, specify an author (same as committer by default)''
+      )->text(
+        iv_name        = c_id-author_email
+        iv_label       = ''Author Email'' ).
+    ENDIF.
+ 
+    ro_form->text(
+      iv_name        = c_id-new_branch_name
+      iv_label       = ''New Branch Name''
+      iv_placeholder = ''Optionally, enter a new branch name for this commit''
+      iv_condense    = abap_true ).
+ 
+ 
+    ro_form->command(
+      iv_label       = ''Commit''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-commit
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_stage_details.
+ 
+    FIELD-SYMBOLS <ls_stage> LIKE LINE OF mt_stage.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<table class="stage_tab">'' ).
+    ri_html->add( ''<thead>'' ).
+    ri_html->add( ''<tr>'' ).
+    ri_html->add( ''<th colspan="3">Staged Files (See <a href="#top">Summary</a> Above)</th>'' ).
+    ri_html->add( ''</tr>'' ).
+    ri_html->add( ''</thead>'' ).
+ 
+    ri_html->add( ''<tbody>'' ).
+    LOOP AT mt_stage ASSIGNING <ls_stage>.
+      ri_html->add( ''<tr>'' ).
+      ri_html->add( ''<td>'' ).
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state(
+        iv_lstate = <ls_stage>-status-lstate
+        iv_rstate = <ls_stage>-status-rstate ) ).
+      ri_html->add( ''</td>'' ).
+      ri_html->add( ''<td class="method">'' ).
+      ri_html->add( zcl_abapgit_stage=>method_description( <ls_stage>-method ) ).
+      ri_html->add( ''</td>'' ).
+      ri_html->add( ''<td>'' ).
+      ri_html->add( <ls_stage>-file-path && <ls_stage>-file-filename ).
+      ri_html->add( ''</td>'' ).
+      ri_html->add( ''</tr>'' ).
+    ENDLOOP.
+    ri_html->add( ''</tbody>'' ).
+ 
+    ri_html->add( ''</table>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_stage_summary.
+ 
+    DATA:
+      BEGIN OF ls_sum,
+        method TYPE string,
+        count  TYPE i,
+      END OF ls_sum,
+      lt_sum LIKE STANDARD TABLE OF ls_sum WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS <ls_stage> LIKE LINE OF mt_stage.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    LOOP AT mt_stage ASSIGNING <ls_stage>.
+      ls_sum-method = <ls_stage>-method.
+      ls_sum-count  = 1.
+      COLLECT ls_sum INTO lt_sum.
+    ENDLOOP.
+ 
+    ri_html->add( ''Stage Summary: '' ).
+ 
+    READ TABLE lt_sum INTO ls_sum WITH TABLE KEY method = zif_abapgit_definitions=>c_method-add.
+    IF sy-subrc = 0.
+      ri_html->add( |<span class="diff_banner diff_ins" title="add">+ { ls_sum-count }</span>| ).
+    ENDIF.
+    READ TABLE lt_sum INTO ls_sum WITH TABLE KEY method = zif_abapgit_definitions=>c_method-rm.
+    IF sy-subrc = 0.
+      ri_html->add( |<span class="diff_banner diff_del" title="remove">- { ls_sum-count }</span>| ).
+    ENDIF.
+    READ TABLE lt_sum INTO ls_sum WITH TABLE KEY method = zif_abapgit_definitions=>c_method-ignore.
+    IF sy-subrc = 0.
+      ri_html->add( |<span class="diff_banner diff_upd" title="ignore">~ { ls_sum-count }</span>| ).
+    ENDIF.
+ 
+    IF lines( mt_stage ) = 1.
+      ri_html->add( ''file'' ).
+    ELSE.
+      ri_html->add( ''files'' ).
+    ENDIF.
+ 
+    ri_html->add( ''(See <a href="#stage-details">Details</a> Below)'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA: lt_branches        TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+          lv_new_branch_name TYPE string.
+ 
+    ro_validation_log = mo_form_util->validate( io_form_data ).
+ 
+    IF zcl_abapgit_utils=>is_valid_email( io_form_data->get( c_id-committer_email ) ) = abap_false.
+      ro_validation_log->set(
+        iv_key = c_id-committer_email
+        iv_val = |Invalid email address| ).
+    ENDIF.
+ 
+    IF zcl_abapgit_utils=>is_valid_email( io_form_data->get( c_id-author_email ) ) = abap_false.
+      ro_validation_log->set(
+        iv_key = c_id-author_email
+        iv_val = |Invalid email address| ).
+    ENDIF.
+ 
+    lv_new_branch_name = io_form_data->get( c_id-new_branch_name ).
+    IF lv_new_branch_name IS NOT INITIAL.
+      " check if branch already exists
+      lt_branches = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) )->get_branches_only( ).
+      READ TABLE lt_branches TRANSPORTING NO FIELDS WITH TABLE KEY name_key
+        COMPONENTS name = branch_name_to_internal( lv_new_branch_name ).
+      IF sy-subrc = 0.
+        ro_validation_log->set(
+          iv_key = c_id-new_branch_name
+          iv_val = |Branch already exists| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    DATA lv_new_branch_name   TYPE string.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-commit.
+        " Validate form entries before committing
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+ 
+          " new branch fields not needed in commit data
+          mo_form_data->strict( abap_false ).
+ 
+          mo_form_data->to_abap( CHANGING cs_container = ms_commit ).
+ 
+          REPLACE ALL OCCURRENCES
+            OF cl_abap_char_utilities=>cr_lf
+            IN ms_commit-body
+            WITH cl_abap_char_utilities=>newline.
+ 
+          lv_new_branch_name = mo_form_data->get( c_id-new_branch_name ).
+          " create new branch and commit to it if branch name is not empty
+          IF lv_new_branch_name IS NOT INITIAL.
+            lv_new_branch_name = branch_name_to_internal( lv_new_branch_name ).
+            " creates a new branch and automatically switches to it
+            mo_repo->create_branch( lv_new_branch_name ).
+          ENDIF.
+ 
+          zcl_abapgit_services_git=>commit(
+            is_commit = ms_commit
+            io_repo   = mo_repo
+            io_stage  = mo_stage ).
+ 
+ 
+          MESSAGE ''Commit was successful'' TYPE ''S''.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    IF mo_form_util->is_empty( mo_form_data ) = abap_true.
+      get_defaults( ).
+    ENDIF.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="repo">'' ).
+    ri_html->add( ''<div id="top" class="paddings">'' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( mo_repo ) ).
+    ri_html->add( ''</div>'' ).
+ 
+    ri_html->add( ''<div id="stage-summary" class="dialog w800px paddings">'' ).
+    ri_html->add( render_stage_summary( ) ).
+    ri_html->add( ''</div>'' ).
+ 
+    ri_html->add( mo_form->render(
+      iv_form_class     = ''w800px''
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+ 
+    ri_html->add( ''<div id="stage-details" class="dialog w800px">'' ).
+    ri_html->add( render_stage_details( ) ).
+    ri_html->add( ''</div>'' ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_DATA               ', 'CLASS zcl_abapgit_gui_page_data DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event
+        REDEFINITION .
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        add               TYPE string VALUE ''add'',
+        update            TYPE string VALUE ''update'',
+        remove            TYPE string VALUE ''remove'',
+        add_via_transport TYPE string VALUE ''add_via_transport'',
+      END OF c_event .
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        table        TYPE string VALUE ''table'',
+        where        TYPE string VALUE ''where'',
+        skip_initial TYPE string VALUE ''skip_initial'',
+      END OF c_id .
+ 
+    DATA mi_config TYPE REF TO zif_abapgit_data_config .
+ 
+    METHODS render_content
+        REDEFINITION .
+  PRIVATE SECTION.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+ 
+    CLASS-METHODS concatenated_key_to_where
+      IMPORTING
+        !iv_table       TYPE tabname
+        !iv_tabkey      TYPE clike
+      RETURNING
+        VALUE(rv_where) TYPE string .
+    METHODS add_via_transport
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS build_where
+      IMPORTING
+        !io_map         TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rt_where) TYPE string_table .
+    METHODS render_add
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_existing
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS event_add
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS event_remove
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS event_update
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_data IMPLEMENTATION.
+ 
+ 
+  METHOD add_via_transport.
+ 
+    DATA lt_trkorr  TYPE trwbo_request_headers.
+    DATA ls_trkorr  LIKE LINE OF lt_trkorr.
+    DATA ls_request TYPE trwbo_request.
+    DATA ls_key     LIKE LINE OF ls_request-keys.
+    DATA lv_where   TYPE string.
+    DATA ls_config  TYPE zif_abapgit_data_config=>ty_config.
+ 
+ 
+    lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
+    IF lines( lt_trkorr ) <> 1.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE lt_trkorr INDEX 1 INTO ls_trkorr.
+    ASSERT sy-subrc = 0.
+ 
+    ls_request = zcl_abapgit_transport=>read( ls_trkorr ).
+ 
+    IF lines( ls_request-keys ) = 0.
+      zcx_abapgit_exception=>raise( |No keys found, select task| ).
+    ENDIF.
+ 
+    LOOP AT ls_request-keys INTO ls_key WHERE object = ''TABU''.
+      ASSERT ls_key-objname IS NOT INITIAL.
+      ASSERT ls_key-tabkey IS NOT INITIAL.
+ 
+      CLEAR ls_config.
+      ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+      ls_config-name = to_upper( ls_key-objname ).
+      lv_where = concatenated_key_to_where(
+        iv_table  = ls_key-objname
+        iv_tabkey = ls_key-tabkey ).
+      APPEND lv_where TO ls_config-where.
+      mi_config->add_config( ls_config ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add( iv_txt = ''Add Via Transport''
+                  iv_act = c_event-add_via_transport ).
+    ro_menu->add( iv_txt = ''Back''
+                  iv_act = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_where.
+ 
+    DATA lv_where LIKE LINE OF rt_where.
+ 
+    SPLIT io_map->get( c_id-where ) AT |\\n| INTO TABLE rt_where.
+ 
+    DELETE rt_where WHERE table_line IS INITIAL.
+ 
+    LOOP AT rt_where INTO lv_where.
+      IF strlen( lv_where ) <= 2.
+        DELETE rt_where INDEX sy-tabix.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD concatenated_key_to_where.
+ 
+    DATA lo_structdescr TYPE REF TO cl_abap_structdescr.
+    DATA lt_fields      TYPE ddfields.
+    DATA ls_field       LIKE LINE OF lt_fields.
+    DATA lv_key         TYPE c LENGTH 900.
+ 
+    lv_key = iv_tabkey.
+    lo_structdescr ?= cl_abap_typedescr=>describe_by_name( iv_table ).
+ 
+    lt_fields = lo_structdescr->get_ddic_field_list( ).
+ 
+    LOOP AT lt_fields INTO ls_field WHERE keyflag = abap_true.
+      IF ls_field-position = ''0001'' AND ls_field-datatype = ''CLNT''.
+        lv_key = lv_key+ls_field-leng.
+        CONTINUE.
+      ENDIF.
+      IF lv_key = |*|.
+        EXIT. " current loop
+      ENDIF.
+      IF NOT rv_where IS INITIAL.
+        rv_where = |{ rv_where } AND |.
+      ENDIF.
+      rv_where = |{ rv_where }{ to_lower( ls_field-fieldname ) } = ''{ lv_key(ls_field-leng) }''|.
+      lv_key = lv_key+ls_field-leng.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    ms_control-page_title = ''Data''.
+    ms_control-page_menu = build_menu( ).
+ 
+    mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    mi_config = mo_repo->get_data_config( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD event_add.
+ 
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+ 
+    lo_map = ii_event->form_data( ).
+ 
+    ls_config-type         = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name         = to_upper( lo_map->get( c_id-table ) ).
+    ls_config-skip_initial = lo_map->get( c_id-skip_initial ).
+    ls_config-where        = build_where( lo_map ).
+ 
+    mi_config->add_config( ls_config ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD event_remove.
+ 
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+ 
+    lo_map = ii_event->form_data( ).
+ 
+    ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name = to_upper( lo_map->get( c_id-table ) ).
+ 
+    mi_config->remove_config( ls_config ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD event_update.
+ 
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+ 
+    lo_map = ii_event->form_data( ).
+ 
+    ls_config-type         = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name         = to_upper( lo_map->get( c_id-table ) ).
+    ls_config-skip_initial = lo_map->has( to_upper( c_id-skip_initial ) ).
+    ls_config-where        = build_where( lo_map ).
+ 
+    mi_config->update_config( ls_config ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_add.
+ 
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    CREATE OBJECT lo_form_data.
+ 
+    lo_form = zcl_abapgit_html_form=>create( ).
+    lo_form->text(
+      iv_label    = ''Table''
+      iv_name     = c_id-table
+      iv_required = abap_true ).
+ 
+    lo_form->checkbox(
+      iv_label = ''Skip Initial Values''
+      iv_name  = c_id-skip_initial ).
+ 
+    lo_form->textarea(
+      iv_label       = ''Where''
+      iv_placeholder = ''Conditions separated by newline''
+      iv_name        = c_id-where ).
+ 
+    lo_form->command(
+      iv_label       = ''Add''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-add ).
+    ri_html->add( lo_form->render( lo_form_data ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( ''<div class="repo">'' ).
+    ri_html->add( render_existing( ) ).
+    ri_html->add( render_add( ) ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_existing.
+ 
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+    DATA ls_config LIKE LINE OF lt_configs.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    CREATE OBJECT lo_form_data.
+ 
+    lt_configs = mi_config->get_configs( ).
+ 
+    LOOP AT lt_configs INTO ls_config.
+      lo_form = zcl_abapgit_html_form=>create(  ).
+      CREATE OBJECT lo_form_data.
+ 
+      lo_form_data->set(
+        iv_key = c_id-table
+        iv_val = |{ ls_config-name }| ).
+      lo_form->text(
+        iv_label    = ''Table''
+        iv_name     = c_id-table
+        iv_readonly = abap_true ).
+ 
+      lo_form_data->set(
+        iv_key = c_id-skip_initial
+        iv_val = ls_config-skip_initial ).
+      lo_form->checkbox(
+        iv_label = ''Skip Initial Values''
+        iv_name  = c_id-skip_initial ).
+ 
+      lo_form_data->set(
+        iv_key = c_id-where
+        iv_val = concat_lines_of( table = ls_config-where sep = |\\n| ) ).
+      lo_form->textarea(
+        iv_label       = ''Where''
+        iv_placeholder = ''Conditions separated by newline''
+        iv_name        = c_id-where ).
+ 
+      lo_form->command(
+        iv_label       = ''Update''
+        iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+        iv_action      = c_event-update ).
+      lo_form->command(
+        iv_label       = ''Remove''
+        iv_action      = c_event-remove ).
+      ri_html->add( lo_form->render( lo_form_data ) ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-add.
+        event_add( ii_event ).
+        mo_repo->refresh( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_event-update.
+        event_update( ii_event ).
+        mo_repo->refresh( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_event-remove.
+        event_remove( ii_event ).
+        mo_repo->refresh( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_event-add_via_transport.
+        add_via_transport( ).
+        mo_repo->refresh( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_DB                 ', 'CLASS zcl_abapgit_gui_page_db DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+    INTERFACES zif_abapgit_gui_menu_provider.
+    INTERFACES zif_abapgit_html_table.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_action,
+        delete  TYPE string VALUE ''delete'',
+        backup  TYPE string VALUE ''backup'',
+        restore TYPE string VALUE ''restore'',
+      END OF c_action.
+ 
+    CONSTANTS c_css_url TYPE string VALUE ''css/page_db.css''.
+ 
+    TYPES:
+      BEGIN OF ty_explanation,
+        value TYPE string,
+        extra TYPE string,
+      END OF ty_explanation.
+ 
+    DATA mt_methods TYPE zcl_abapgit_background=>ty_methods.
+ 
+    METHODS register_stylesheet
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_table
+      IMPORTING
+        it_db_entries TYPE zif_abapgit_persistence=>ty_contents
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS do_backup_db
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS do_delete_entry
+      IMPORTING
+        !is_key TYPE zif_abapgit_persistence=>ty_content
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS do_restore_db
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS explain_content
+      IMPORTING
+        !is_data       TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rv_text) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS explain_content_repo
+      IMPORTING
+        !is_data  TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rs_expl) TYPE ty_explanation
+      RAISING
+        zcx_abapgit_exception.
+    METHODS explain_content_repo_cs
+      IMPORTING
+        !is_data  TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rs_expl) TYPE ty_explanation
+      RAISING
+        zcx_abapgit_exception.
+    METHODS explain_content_background
+      IMPORTING
+        !is_data  TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rs_expl) TYPE ty_explanation
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_DB IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    register_stylesheet( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_db.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title         = ''Database Utility''
+      iv_extra_css_url      = c_css_url
+      ii_page_menu_provider = lo_component
+      ii_child_component    = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD do_backup_db.
+ 
+    DATA:
+      lt_data     TYPE zif_abapgit_persistence=>ty_contents,
+      lo_zip      TYPE REF TO cl_abap_zip,
+      lv_zip      TYPE xstring,
+      lv_path     TYPE string,
+      lv_filename TYPE string,
+      li_fe_serv  TYPE REF TO zif_abapgit_frontend_services.
+ 
+    FIELD-SYMBOLS:
+      <ls_data> LIKE LINE OF lt_data.
+ 
+    lt_data = zcl_abapgit_persistence_db=>get_instance( )->list( ).
+ 
+    CREATE OBJECT lo_zip.
+ 
+    LOOP AT lt_data ASSIGNING <ls_data>.
+      CONCATENATE <ls_data>-type ''_'' <ls_data>-value ''.xml'' INTO lv_filename.
+      lo_zip->add(
+        name    = lv_filename
+        content = zcl_abapgit_convert=>string_to_xstring_utf8( <ls_data>-data_str ) ).
+    ENDLOOP.
+ 
+    lv_zip = lo_zip->save( ).
+ 
+    CONCATENATE ''abapGit_Backup_'' sy-datlo ''_'' sy-timlo INTO lv_filename.
+ 
+    li_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lv_path = li_fe_serv->show_file_save_dialog(
+      iv_title            = ''abapGit Backup''
+      iv_extension        = ''zip''
+      iv_default_filename = lv_filename ).
+ 
+    li_fe_serv->file_download(
+      iv_path = lv_path
+      iv_xstr = lv_zip ).
+ 
+    MESSAGE ''abapGit Backup successfully saved'' TYPE ''S''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD do_delete_entry.
+ 
+    DATA lv_answer TYPE c LENGTH 1.
+ 
+    ASSERT is_key-type IS NOT INITIAL.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar              = ''Warning''
+      iv_text_question         = |Are you sure you want to delete entry { is_key-type } { is_key-value }?|
+      iv_text_button_1         = ''Yes''
+      iv_icon_button_1         = ''ICON_DELETE''
+      iv_text_button_2         = ''No''
+      iv_icon_button_2         = ''ICON_CANCEL''
+      iv_default_button        = ''2''
+      iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer = ''2''.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    zcl_abapgit_persistence_db=>get_instance( )->delete(
+      iv_type  = is_key-type
+      iv_value = is_key-value ).
+ 
+    " If deleting repo, also delete corresponding checksums
+    " Other way around is ok, since checksums are automatically recreated
+    IF is_key-type = zcl_abapgit_persistence_db=>c_type_repo.
+      zcl_abapgit_persistence_db=>get_instance( )->delete(
+        iv_type  = zcl_abapgit_persistence_db=>c_type_repo_csum
+        iv_value = is_key-value ).
+ 
+      " Initialize repo list
+      zcl_abapgit_repo_srv=>get_instance( )->init( ).
+      " TODO: think how to remove this code,
+      " maybe implement subscription in persistence_db,
+      " so that repo_srv receive a notification on add/delete
+    ENDIF.
+ 
+    COMMIT WORK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD do_restore_db.
+ 
+    DATA:
+      lv_answer   TYPE c LENGTH 1,
+      lo_zip      TYPE REF TO cl_abap_zip,
+      lv_zip      TYPE xstring,
+      lv_path     TYPE string,
+      lv_filename TYPE string,
+      lv_data     TYPE xstring,
+      ls_data     TYPE zif_abapgit_persistence=>ty_content,
+      lt_data     TYPE zif_abapgit_persistence=>ty_contents,
+      lt_data_old TYPE zif_abapgit_persistence=>ty_contents,
+      li_fe_serv  TYPE REF TO zif_abapgit_frontend_services.
+ 
+    FIELD-SYMBOLS:
+      <ls_zipfile> LIKE LINE OF lo_zip->files.
+ 
+    li_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lv_path = li_fe_serv->show_file_open_dialog(
+      iv_title            = ''Restore abapGit Backup''
+      iv_extension        = ''zip''
+      iv_default_filename = ''abapGit_Backup_*.zip'' ).
+ 
+    lv_zip = li_fe_serv->file_upload( lv_path ).
+ 
+    CREATE OBJECT lo_zip.
+ 
+    lo_zip->load(
+      EXPORTING
+        zip             = lv_zip
+      EXCEPTIONS
+        zip_parse_error = 1
+        OTHERS          = 2 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error loading ZIP file'' ).
+    ENDIF.
+ 
+    LOOP AT lo_zip->files ASSIGNING <ls_zipfile>.
+      CLEAR ls_data.
+      lv_filename = <ls_zipfile>-name.
+      REPLACE ''.xml'' IN lv_filename WITH ''''.
+      SPLIT lv_filename AT ''_'' INTO ls_data-type ls_data-value.
+ 
+      " Validate DB key
+      TRY.
+          zcl_abapgit_persistence_db=>validate_entry_type( ls_data-type ).
+        CATCH zcx_abapgit_exception.
+          zcx_abapgit_exception=>raise( |Invalid DB entry type. This is not an abapGit Backup| ).
+      ENDTRY.
+ 
+      lo_zip->get(
+        EXPORTING
+          name                    = <ls_zipfile>-name
+        IMPORTING
+          content                 = lv_data
+        EXCEPTIONS
+          zip_index_error         = 1
+          zip_decompression_error = 2
+          OTHERS                  = 3 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Error getting file { <ls_zipfile>-name } from ZIP| ).
+      ENDIF.
+ 
+      ls_data-data_str = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+      INSERT ls_data INTO TABLE lt_data.
+    ENDLOOP.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar              = ''Warning''
+      iv_text_question         = ''All existing repositories and settings will be deleted and overwritten! Continue?''
+      iv_text_button_1         = ''Restore''
+      iv_icon_button_1         = ''ICON_IMPORT''
+      iv_text_button_2         = ''Cancel''
+      iv_icon_button_2         = ''ICON_CANCEL''
+      iv_default_button        = ''2''
+      iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer <> ''1''.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    lt_data_old = zcl_abapgit_persistence_db=>get_instance( )->list( ).
+    LOOP AT lt_data_old INTO ls_data.
+      zcl_abapgit_persistence_db=>get_instance( )->delete(
+        iv_type  = ls_data-type
+        iv_value = ls_data-value ).
+    ENDLOOP.
+ 
+    COMMIT WORK AND WAIT.
+ 
+    LOOP AT lt_data INTO ls_data.
+      zcl_abapgit_persistence_db=>get_instance( )->add(
+        iv_type  = ls_data-type
+        iv_value = ls_data-value
+        iv_data  = ls_data-data_str ).
+    ENDLOOP.
+ 
+    COMMIT WORK AND WAIT.
+ 
+    MESSAGE ''abapGit Backup successfully restored'' TYPE ''S''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD explain_content.
+ 
+    DATA lv_descr TYPE string.
+    DATA ls_explanation TYPE ty_explanation.
+ 
+    CASE is_data-type.
+      WHEN zcl_abapgit_persistence_db=>c_type_repo.
+        lv_descr       = ''Repo Settings''.
+        ls_explanation = explain_content_repo( is_data ).
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_background.
+        lv_descr       = ''Background Settings''.
+        ls_explanation = explain_content_background( is_data ).
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_user.
+        lv_descr       = ''Personal Settings''.
+        ls_explanation-value = zcl_abapgit_user_record=>get_instance( is_data-value )->get_name( ).
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_settings.
+        lv_descr       = ''Global Settings''.
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_packages.
+        lv_descr       = ''Local Package Details''.
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_repo_csum.
+        lv_descr       = ''Repo Checksums''.
+        ls_explanation = explain_content_repo_cs( is_data ).
+ 
+      WHEN OTHERS.
+        IF strlen( is_data-data_str ) >= 250.
+          ls_explanation-value = is_data-data_str(250).
+        ELSE.
+          ls_explanation-value = is_data-data_str.
+        ENDIF.
+ 
+        ls_explanation-value = escape(
+          val    = ls_explanation-value
+          format = cl_abap_format=>e_html_attr ).
+        ls_explanation-value = |<pre>{ ls_explanation-value }</pre>|.
+ 
+    ENDCASE.
+ 
+    IF ls_explanation-value IS NOT INITIAL.
+      lv_descr = |{ lv_descr }: |.
+    ENDIF.
+ 
+    IF ls_explanation-extra IS NOT INITIAL.
+      ls_explanation-extra = | ({ ls_explanation-extra })|.
+    ENDIF.
+ 
+    rv_text = |{ lv_descr }<strong>{ ls_explanation-value }</strong>{ ls_explanation-extra }|.
+ 
+    IF strlen( rv_text ) >= 250.
+      rv_text = rv_text(250) && ''...''.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD explain_content_background.
+ 
+    DATA:
+      ls_result TYPE match_result,
+      ls_match  TYPE submatch_result,
+      lv_class  TYPE string,
+      ls_method LIKE LINE OF mt_methods.
+ 
+    rs_expl-value = |{ zcl_abapgit_repo_srv=>get_instance( )->get( is_data-value )->get_name( ) }|.
+ 
+    FIND FIRST OCCURRENCE OF REGEX ''<METHOD>(.*)</METHOD>''
+      IN is_data-data_str IGNORING CASE RESULTS ls_result.
+    READ TABLE ls_result-submatches INTO ls_match INDEX 1.
+    IF sy-subrc = 0.
+      lv_class = is_data-data_str+ls_match-offset(ls_match-length).
+    ENDIF.
+ 
+    IF mt_methods IS INITIAL.
+      mt_methods = zcl_abapgit_background=>list_methods( ).
+    ENDIF.
+ 
+    READ TABLE mt_methods INTO ls_method WITH TABLE KEY class_ = lv_class.
+    IF sy-subrc = 0.
+      rs_expl-extra = ls_method-description.
+    ELSE.
+      rs_expl-extra = lv_class.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD explain_content_repo.
+ 
+    DATA:
+      ls_result TYPE match_result,
+      ls_match  TYPE submatch_result,
+      lv_cnt    TYPE i.
+ 
+    FIND FIRST OCCURRENCE OF REGEX ''<OFFLINE/>''
+      IN is_data-data_str IGNORING CASE MATCH COUNT lv_cnt.
+    IF lv_cnt > 0.
+      rs_expl-extra = ''Online''.
+    ELSE.
+      rs_expl-extra = ''Offline''.
+    ENDIF.
+ 
+    FIND FIRST OCCURRENCE OF REGEX ''<DISPLAY_NAME>(.*)</DISPLAY_NAME>''
+      IN is_data-data_str IGNORING CASE RESULTS ls_result.
+    READ TABLE ls_result-submatches INTO ls_match INDEX 1.
+    IF sy-subrc = 0.
+      rs_expl-value = is_data-data_str+ls_match-offset(ls_match-length).
+    ENDIF.
+ 
+    IF rs_expl-value IS INITIAL.
+      FIND FIRST OCCURRENCE OF REGEX ''<URL>(.*)</URL>''
+        IN is_data-data_str IGNORING CASE RESULTS ls_result.
+      READ TABLE ls_result-submatches INTO ls_match INDEX 1.
+      IF sy-subrc = 0.
+        rs_expl-value = is_data-data_str+ls_match-offset(ls_match-length).
+        IF lv_cnt > 0.
+          rs_expl-value = zcl_abapgit_url=>name( rs_expl-value ).
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD explain_content_repo_cs.
+ 
+    DATA lt_lines TYPE string_table.
+ 
+    IF strlen( is_data-data_str ) > 0.
+      SPLIT is_data-data_str AT cl_abap_char_utilities=>newline INTO TABLE lt_lines.
+      rs_expl-extra = |{ lines( lt_lines ) } lines|.
+ 
+      READ TABLE lt_lines INDEX 1 INTO rs_expl-value.
+      IF sy-subrc = 0.
+        REPLACE ''#repo_name#'' IN rs_expl-value WITH ''''.
+        rs_expl-value = escape(
+          val    = rs_expl-value
+          format = cl_abap_format=>e_html_attr ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD register_stylesheet.
+ 
+    DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
+ 
+    CREATE OBJECT lo_buf.
+ 
+    " @@abapmerge include zabapgit_css_page_db.w3mi.data.css > lo_buf->add( ''$$'' ).
+    gui_services( )->register_page_asset(
+      iv_url       = c_css_url
+      iv_type      = ''text/css''
+      iv_mime_name = ''ZABAPGIT_CSS_PAGE_DB''
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table.
+ 
+    ri_html = zcl_abapgit_html_table=>create( ii_renderer = me
+      )->define_column(
+        iv_column_id = ''type''
+        iv_column_title = ''Type''
+      )->define_column(
+        iv_column_id = ''value''
+        iv_column_title = ''Key''
+      )->define_column(
+        iv_column_id = ''expl''
+        iv_column_title = ''Data''
+      )->define_column( ''cmd''
+      )->render( it_db_entries ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA ls_db TYPE zif_abapgit_persistence=>ty_content.
+    DATA lo_query TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_query = ii_event->query( ).
+    CASE ii_event->mv_action.
+      WHEN c_action-delete.
+        lo_query->to_abap( CHANGING cs_container = ls_db ).
+        do_delete_entry( ls_db ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_action-backup.
+        do_backup_db( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_action-restore.
+        do_restore_db( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_menu_provider~get_menu.
+ 
+    CREATE OBJECT ro_toolbar.
+ 
+    ro_toolbar->add(
+      iv_txt = ''Backup''
+      iv_act = c_action-backup ).
+    ro_toolbar->add(
+      iv_txt = ''Restore''
+      iv_act = c_action-restore ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lt_db_entries TYPE zif_abapgit_persistence=>ty_contents.
+ 
+    register_handlers( ).
+ 
+    lt_db_entries = zcl_abapgit_persistence_db=>get_instance( )->list( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="db-list">'' ).
+    ri_html->add( render_table( lt_db_entries ) ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_table~get_row_attrs.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_table~render_cell.
+ 
+    DATA lv_action  TYPE string.
+    DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CASE iv_column_id.
+      WHEN ''type'' OR ''value''.
+        rs_render-content = |{ iv_value }|.
+      WHEN ''expl''.
+        rs_render-content   = explain_content( is_row ).
+        rs_render-css_class = ''data''.
+      WHEN ''cmd''.
+        lv_action  = zcl_abapgit_html_action_utils=>dbkey_encode( is_row ).
+        lo_toolbar = zcl_abapgit_html_toolbar=>create(
+          )->add(
+            iv_txt = ''Display''
+            iv_act = |{ zif_abapgit_definitions=>c_action-db_display }?{ lv_action }|
+          )->add(
+            iv_txt = ''Edit''
+            iv_act = |{ zif_abapgit_definitions=>c_action-db_edit }?{ lv_action }|
+          )->add(
+            iv_txt = ''Delete''
+            iv_act = |{ c_action-delete }?{ lv_action }| ).
+        rs_render-html = lo_toolbar->render( ).
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_DB_ENTRY           ', 'CLASS zcl_abapgit_gui_page_db_entry DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+    INTERFACES zif_abapgit_gui_page_title .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !is_key        TYPE zif_abapgit_persistence=>ty_content
+        !iv_edit_mode  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !is_key       TYPE zif_abapgit_persistence=>ty_content
+        !iv_edit_mode TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+    CONSTANTS:
+      BEGIN OF c_action,
+        update      TYPE string VALUE ''update'',
+        switch_mode TYPE string VALUE ''switch_mode'',
+      END OF c_action .
+ 
+    CONSTANTS c_edit_form_id TYPE string VALUE \`db_form\`.
+    CONSTANTS c_css_url TYPE string VALUE ''css/page_db_entry.css''.
+ 
+    DATA ms_key TYPE zif_abapgit_persistence=>ty_content.
+    DATA mv_edit_mode TYPE abap_bool.
+ 
+    METHODS register_stylesheet
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_view
+      IMPORTING
+        iv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str
+        ii_html         TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_edit
+      IMPORTING
+        iv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str
+        ii_html         TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_header
+      IMPORTING
+        ii_html    TYPE REF TO zif_abapgit_html
+        io_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    METHODS build_toolbar
+      RETURNING
+        VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CLASS-METHODS render_entry_tag
+      IMPORTING
+        is_key         TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+    CLASS-METHODS dbcontent_decode
+      IMPORTING
+        io_form_data      TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rs_content) TYPE zif_abapgit_persistence=>ty_content
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS do_update
+      IMPORTING
+        is_content TYPE zif_abapgit_persistence=>ty_content
+      RAISING
+        zcx_abapgit_exception .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_DB_ENTRY IMPLEMENTATION.
+ 
+ 
+  METHOD build_toolbar.
+ 
+    CREATE OBJECT ro_toolbar.
+ 
+    IF mv_edit_mode = abap_true.
+      ro_toolbar->add(
+        iv_act = |submitFormById(''{ c_edit_form_id }'');|
+        iv_txt = ''Save''
+        iv_typ = zif_abapgit_html=>c_action_type-onclick
+        iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+    ELSE.
+      ro_toolbar->add(
+        iv_act = |{ c_action-switch_mode }|
+        iv_txt = ''Edit'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    register_stylesheet( ).
+    mv_edit_mode = iv_edit_mode.
+    ms_key       = is_key.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_db_entry.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        iv_edit_mode = iv_edit_mode
+        is_key       = is_key.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_extra_css_url       = c_css_url
+      ii_page_title_provider = lo_component
+      ii_child_component     = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dbcontent_decode.
+ 
+    rs_content-type     = io_form_data->get( ''TYPE'' ).
+    rs_content-value    = io_form_data->get( ''VALUE'' ).
+    rs_content-data_str = io_form_data->get( ''XMLDATA'' ).
+ 
+    IF rs_content-data_str(1) <> ''<'' AND rs_content-data_str+1(1) = ''<''. " Hmmm ???
+      rs_content-data_str = rs_content-data_str+1.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD do_update.
+ 
+    ASSERT is_content-type IS NOT INITIAL.
+ 
+    zcl_abapgit_persistence_db=>get_instance( )->update(
+      iv_type  = is_content-type
+      iv_value = is_content-value
+      iv_data  = is_content-data_str ).
+ 
+    COMMIT WORK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD register_stylesheet.
+ 
+    DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
+ 
+    CREATE OBJECT lo_buf.
+ 
+    " @@abapmerge include zabapgit_css_page_db_entry.w3mi.data.css > lo_buf->add( ''$$'' ).
+    gui_services( )->register_page_asset(
+      iv_url       = c_css_url
+      iv_type      = ''text/css''
+      iv_mime_name = ''ZABAPGIT_CSS_PAGE_DB_ENTRY''
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_edit.
+ 
+    DATA lv_formatted TYPE string.
+ 
+    lv_formatted = escape(
+      val    = zcl_abapgit_xml_pretty=>print( iv_raw_db_value )
+      format = cl_abap_format=>e_html_attr ).
+ 
+    " Form
+    ii_html->add( |<form id="{ c_edit_form_id }" method="post" action="sapevent:{ c_action-update }">| ).
+    ii_html->add( |<input type="hidden" name="type" value="{ ms_key-type }">| ).
+    ii_html->add( |<input type="hidden" name="value" value="{ ms_key-value }">| ).
+    ii_html->add( |<textarea rows="20" cols="100" name="xmldata">{ lv_formatted }</textarea>| ).
+    ii_html->add( ''</form>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_entry_tag.
+ 
+    rv_html =
+      |<dl class="entry-tag">| &&
+      |<div><dt>Type</dt><dd>{ is_key-type }</dd></div>| &&
+      |<div><dt>Key</dt><dd>{ is_key-value }</dd></div>| &&
+      |</dl>|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_header.
+ 
+    ii_html->add( ''<div class="toolbar">'' ).
+    ii_html->add( io_toolbar->render( iv_right = abap_true ) ).
+    ii_html->add( render_entry_tag( ms_key ) ).
+    ii_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_view.
+ 
+    DATA lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter.
+    DATA lv_formatted   TYPE string.
+ 
+    " Create syntax highlighter
+    lo_highlighter = zcl_abapgit_syntax_factory=>create( ''*.xml'' ).
+    lv_formatted   = lo_highlighter->process_line( zcl_abapgit_xml_pretty=>print( iv_raw_db_value ) ).
+ 
+    ii_html->add( |<pre class="syntax-hl">{ lv_formatted }</pre>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_action-switch_mode.
+        mv_edit_mode = boolc( mv_edit_mode = abap_false ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_action-update.
+        do_update( dbcontent_decode( ii_event->form_data( ) ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_page_title~get_page_title.
+ 
+    IF mv_edit_mode = abap_true.
+      rv_title = ''Config Edit''.
+    ELSE.
+      rv_title = ''Config Display''.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str.
+ 
+    register_handlers( ).
+ 
+    TRY.
+        lv_raw_db_value = zcl_abapgit_persistence_db=>get_instance( )->read(
+          iv_type  = ms_key-type
+          iv_value = ms_key-value ).
+      CATCH zcx_abapgit_not_found ##NO_HANDLER.
+    ENDTRY.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="db-entry">'' ).
+ 
+    render_header(
+      ii_html    = ri_html
+      io_toolbar = build_toolbar( ) ).
+ 
+    IF mv_edit_mode = abap_true.
+      zcl_abapgit_persistence_db=>get_instance( )->lock(
+        iv_type  = ms_key-type
+        iv_value = ms_key-value ).
+      render_edit(
+        iv_raw_db_value = lv_raw_db_value
+        ii_html         = ri_html ).
+    ELSE.
+      render_view(
+        iv_raw_db_value = lv_raw_db_value
+        ii_html         = ri_html ).
+    ENDIF.
+ 
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_DEBUGINFO          ', 'CLASS zcl_abapgit_gui_page_debuginfo DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_exit_standalone TYPE syrepid VALUE ''ZABAPGIT_USER_EXIT'' ##NO_TEXT.
+    CONSTANTS c_exit_class TYPE c LENGTH 30 VALUE ''ZCL_ABAPGIT_USER_EXIT'' ##NO_TEXT.
+    CONSTANTS c_exit_interface TYPE c LENGTH 30 VALUE ''ZIF_ABAPGIT_EXIT'' ##NO_TEXT.
+    CONSTANTS:
+      BEGIN OF c_action,
+        save TYPE string VALUE ''save'',
+        back TYPE string VALUE ''back'',
+      END OF c_action.
+    DATA mv_html TYPE string .
+ 
+    CLASS-METHODS build_toolbar
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar.
+    METHODS render_debug_info
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_exit_info
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_exit_info_methods
+      IMPORTING
+        !it_source     TYPE string_table
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_supported_object_types
+      RETURNING
+        VALUE(rv_html) TYPE string .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_jump_object
+      IMPORTING
+        !iv_obj_type   TYPE csequence DEFAULT ''CLAS''
+        !iv_obj_name   TYPE csequence
+      RETURNING
+        VALUE(rv_html) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_debuginfo IMPLEMENTATION.
+ 
+ 
+  METHOD build_toolbar.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = ''toolbar-debug''.
+ 
+    ro_menu->add(
+      iv_txt = ''Save''
+      iv_act = c_action-save ).
+    ro_menu->add(
+      iv_txt = ''Back''
+      iv_act = c_action-back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_debuginfo.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Debug Info''
+      io_page_menu       = build_toolbar( )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_jump_object.
+ 
+    DATA lv_encode TYPE string.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+ 
+    CREATE OBJECT li_html TYPE zcl_abapgit_html.
+ 
+    lv_encode = zcl_abapgit_html_action_utils=>jump_encode( iv_obj_type = |{ iv_obj_type }|
+                                                            iv_obj_name = |{ iv_obj_name }| ).
+ 
+    rv_html = li_html->a(
+      iv_txt = |{ iv_obj_name }|
+      iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_encode }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_debug_info.
+ 
+    DATA: ls_release       TYPE zif_abapgit_environment=>ty_release_sp,
+          lv_gui_version   TYPE string,
+          lv_devclass      TYPE devclass,
+          lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+    TRY.
+        lo_frontend_serv->get_gui_version( IMPORTING ev_gui_version_string = lv_gui_version ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+        " Continue rendering even if this fails
+    ENDTRY.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      ri_html->add( ''<h2>abapGit - Standalone Version</h2>'' ).
+      ri_html->add( ''<div>To keep abapGit up-to-date (or also to contribute) you need to'' ).
+      ri_html->add( |install it as a repository ({ ri_html->a(
+        iv_txt = ''Developer Version''
+        iv_act = ''https://github.com/abapGit/abapGit''
+        iv_typ = zif_abapgit_html=>c_action_type-url ) }).</div>| ).
+    ELSE.
+      lv_devclass = zcl_abapgit_services_abapgit=>is_installed( ).
+      ri_html->add( ''<h2>abapGit - Developer Version</h2>'' ).
+      ri_html->add( |<div>abapGit is installed in package { lv_devclass }</div>| ).
+    ENDIF.
+ 
+    ri_html->add( ''<br><div>'' ).
+    ri_html->add_a(
+      iv_txt = ''Contribution guidelines for abapGit''
+      iv_act = ''https://github.com/abapGit/abapGit/blob/main/CONTRIBUTING.md''
+      iv_typ = zif_abapgit_html=>c_action_type-url ).
+    ri_html->add( ''</div>'' ).
+ 
+    ls_release = zcl_abapgit_factory=>get_environment( )->get_basis_release( ).
+ 
+    ri_html->add( ''<h2>Environment</h2>'' ).
+ 
+    ri_html->add( |<table>| ).
+    ri_html->add( |<tr><td>abapGit version:</td><td>{ zif_abapgit_version=>c_abap_version }</td></tr>| ).
+    ri_html->add( |<tr><td>XML version:    </td><td>{ zif_abapgit_version=>c_xml_version }</td></tr>| ).
+    ri_html->add( |<tr><td>GUI version:    </td><td>{ lv_gui_version }</td></tr>| ).
+    ri_html->add( |<tr><td>APACK version:  </td><td>{
+                  zcl_abapgit_apack_migration=>c_apack_interface_version }</td></tr>| ).
+    ri_html->add( |<tr><td>LCL_TIME:       </td><td>{ zcl_abapgit_git_time=>get_unix( ) }</td></tr>| ).
+    ri_html->add( |<tr><td>SY time:        </td><td>{ sy-datum } { sy-uzeit } { sy-tzone }</td></tr>| ).
+    ri_html->add( |<tr><td>SY release:     </td><td>{ ls_release-release } SP { ls_release-sp }</td></tr>| ).
+    ri_html->add( |</table>| ).
+    ri_html->add( |<br>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_exit_info.
+ 
+    DATA lt_source TYPE string_table.
+    DATA ls_class_key TYPE seoclskey.
+    DATA lo_oo_serializer TYPE REF TO zcl_abapgit_oo_serializer.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<h2>User Exits</h2>'' ).
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      " Standalone version
+      lt_source = zcl_abapgit_factory=>get_sap_report( )->read_report( c_exit_standalone ).
+      IF sy-subrc = 0.
+        ri_html->add( |<div>User exits are active (include { get_jump_object(
+          iv_obj_type = ''PROG''
+          iv_obj_name = c_exit_standalone ) } found)</div><br>| ).
+        ri_html->add( render_exit_info_methods( lt_source ) ).
+      ELSE.
+        ri_html->add( |<div>No user exits implemented (include { c_exit_standalone } not found)</div><br>| ).
+      ENDIF.
+    ELSE.
+      " Developer version
+      TRY.
+          ls_class_key-clsname = c_exit_class.
+          CREATE OBJECT lo_oo_serializer.
+          lt_source = lo_oo_serializer->serialize_abap_clif_source( ls_class_key ).
+ 
+          ri_html->add( |<div>User exits are active (class { get_jump_object( c_exit_class ) } found)</div><br>| ).
+          ri_html->add( render_exit_info_methods( lt_source ) ).
+        CATCH cx_root.
+          ri_html->add( |<div>No user exits implemented (class { c_exit_class } not found)</div><br>| ).
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_exit_info_methods.
+ 
+    DATA:
+      lo_scanner TYPE REF TO cl_oo_source_scanner_class,
+      lx_exc     TYPE REF TO cx_root,
+      lt_methods TYPE cl_oo_source_scanner_class=>type_method_implementations,
+      lv_method  LIKE LINE OF lt_methods,
+      lt_source  TYPE seop_source_string,
+      lv_source  TYPE string,
+      lv_rest    TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<table border="1px"><thead><tr>'' ).
+    ri_html->add( ''<td>Exit</td><td class="center">Implemented?</td>'' ).
+    ri_html->add( ''</tr></thead><tbody>'' ).
+ 
+    TRY.
+        lo_scanner = cl_oo_source_scanner_class=>create_class_scanner(
+          clif_name = c_exit_class
+          source    = it_source ).
+        lo_scanner->scan( ).
+ 
+        lt_methods = lo_scanner->get_method_implementations( ).
+ 
+        LOOP AT lt_methods INTO lv_method WHERE table_line CS c_exit_interface.
+          lt_source = lo_scanner->get_method_impl_source( lv_method ).
+          DELETE lt_source INDEX 1.
+          DELETE lt_source INDEX lines( lt_source ).
+          CONCATENATE LINES OF lt_source INTO lv_source.
+          lv_source = to_upper( condense(
+            val = lv_source
+            del = \` \` ) ).
+          SPLIT lv_method AT ''~'' INTO lv_rest lv_method.
+          ri_html->add( |<tr><td>{ lv_method }</td><td class="center">|  ).
+          IF lv_source IS INITIAL OR lv_source = ''RETURN.'' OR lv_source = ''EXIT.''.
+            ri_html->add( ''No'' ).
+          ELSE.
+            ri_html->add( ''<strong>Yes</strong>'' ).
+          ENDIF.
+          ri_html->add( |</td></tr>| ).
+        ENDLOOP.
+ 
+      CATCH cx_root INTO lx_exc.
+        ri_html->add( |<tr><td colspan="2">{ lx_exc->get_text( ) }</td></tr>| ).
+    ENDTRY.
+ 
+    ri_html->add( ''</tbody></table>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( ''debugOutput("<table><tr><td>Browser:</td><td>" + navigator.userAgent + '' &&
+      ''"</td></tr><tr><td>Frontend time:</td><td>" + new Date() + "</td></tr></table>", "debug_info");'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_supported_object_types.
+ 
+    DATA: lv_list     TYPE string,
+          li_html     TYPE REF TO zif_abapgit_html,
+          lt_types    TYPE zcl_abapgit_objects=>ty_types_tt,
+          lv_type     LIKE LINE OF lt_types,
+          lt_obj      TYPE STANDARD TABLE OF ko100 WITH DEFAULT KEY,
+          lv_class    TYPE seoclsname,
+          li_object   TYPE REF TO zif_abapgit_object,
+          ls_item     TYPE zif_abapgit_definitions=>ty_item,
+          ls_metadata TYPE zif_abapgit_definitions=>ty_metadata,
+          lv_step     TYPE zif_abapgit_definitions=>ty_deserialization_step,
+          lt_steps    TYPE zif_abapgit_definitions=>ty_deserialization_step_tt.
+ 
+    FIELD-SYMBOLS: <ls_obj> TYPE ko100.
+ 
+    CALL FUNCTION ''TR_OBJECT_TABLE''
+      TABLES
+        wt_object_text = lt_obj.
+ 
+    lt_types = zcl_abapgit_objects=>supported_list( ).
+ 
+    CREATE OBJECT li_html TYPE zcl_abapgit_html.
+ 
+    rv_html = ''<h2>Object Types</h2>''.
+ 
+    rv_html = rv_html && li_html->a(
+      iv_txt = ''Complete list of object types supported by abapGit''
+      iv_act = ''https://docs.abapgit.org/ref-supported.html''
+      iv_typ = zif_abapgit_html=>c_action_type-url ).
+ 
+    rv_html = rv_html && |<br><br>Supported object types in <strong>this</strong> system:<br><br>|.
+ 
+    rv_html = rv_html && |<table border="1px"><thead><tr>|.
+    rv_html = rv_html && |<td>Object</td><td>Description</td><td>Class</td><td>Version</td>|.
+    rv_html = rv_html && |<td>Steps</td>|.
+    rv_html = rv_html && |</tr></thead><tbody>|.
+ 
+    LOOP AT lt_types INTO lv_type.
+      lv_class = ''ZCL_ABAPGIT_OBJECT_'' && lv_type.
+ 
+      rv_html = rv_html && |<tr>|.
+ 
+      rv_html = rv_html && |<td>{ lv_type }</td>|.
+ 
+      READ TABLE lt_obj ASSIGNING <ls_obj> WITH KEY pgmid = ''R3TR'' object = lv_type.
+      IF sy-subrc = 0.
+        rv_html = rv_html && |<td>{ <ls_obj>-text }</td>|.
+      ELSE.
+        rv_html = rv_html && |<td class="warning">No description</td>|.
+      ENDIF.
+ 
+ 
+      TRY.
+          ls_item-obj_type = lv_type.
+          ls_item-obj_name = ''TEST''.
+ 
+          CREATE OBJECT li_object TYPE (lv_class)
+            EXPORTING
+              is_item     = ls_item
+              iv_language = sy-langu.
+ 
+          rv_html = rv_html && |<td>{ get_jump_object( lv_class ) }</td>|.
+ 
+        CATCH cx_sy_create_object_error.
+          TRY. " 2nd step, try looking for plugins
+              CREATE OBJECT li_object TYPE zcl_abapgit_objects_bridge
+                EXPORTING
+                  is_item = ls_item.
+            CATCH cx_sy_create_object_error.
+              rv_html = rv_html && |<td class="error" colspan="5">{ lv_class } - error instantiating class</td>|.
+              CONTINUE.
+          ENDTRY.
+ 
+          rv_html = rv_html && |<td>{ get_jump_object( lv_class ) } (Plug-in)</td>|.
+      ENDTRY.
+ 
+      ls_metadata = li_object->get_metadata( ).
+ 
+      rv_html = rv_html && |<td>{ ls_metadata-version }</td>|.
+ 
+      lt_steps = li_object->get_deserialize_steps( ).
+ 
+      CLEAR lv_list.
+      LOOP AT lt_steps INTO lv_step.
+        CASE lv_step.
+          WHEN zif_abapgit_object=>gc_step_id-early.
+            lv_step = |<i>{ lv_step } (1)</i>|.
+          WHEN zif_abapgit_object=>gc_step_id-ddic.
+            lv_step = |<strong>{ lv_step } (2)</strong>|.
+          WHEN zif_abapgit_object=>gc_step_id-abap.
+            lv_step = |{ lv_step } (3)|.
+          WHEN zif_abapgit_object=>gc_step_id-late.
+            lv_step = |<i>{ lv_step } (4)</i>|.
+          WHEN OTHERS.
+            ASSERT 1 = 2.
+        ENDCASE.
+        IF lv_list IS INITIAL.
+          lv_list = lv_step.
+        ELSE.
+          lv_list = lv_list && \`, \` && lv_step.
+        ENDIF.
+      ENDLOOP.
+ 
+      rv_html = rv_html && |<td>{ lv_list }</td>|.
+ 
+      rv_html = rv_html && |</tr>|.
+ 
+    ENDLOOP.
+ 
+    rv_html = rv_html && |</tbody></table>|.
+    rv_html = rv_html && |<br>|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA:
+      lv_path     TYPE string,
+      lv_filename TYPE string,
+      li_fe_serv  TYPE REF TO zif_abapgit_frontend_services.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_action-save.
+ 
+        CONCATENATE ''abapGit_Debug_Info_'' sy-datlo ''_'' sy-timlo ''.html'' INTO lv_filename.
+ 
+        li_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+        lv_path = li_fe_serv->show_file_save_dialog(
+          iv_title            = ''abapGit - Debug Info''
+          iv_extension        = ''html''
+          iv_default_filename = lv_filename ).
+ 
+        li_fe_serv->file_download(
+          iv_path = lv_path
+          iv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8( mv_html ) ).
+ 
+        MESSAGE ''abapGit Debug Info successfully saved'' TYPE ''S''.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_action-back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div id="debug_info" class="debug_container">'' ).
+    ri_html->add( render_debug_info( ) ).
+    ri_html->add( ''</div>'' ).
+ 
+    ri_html->add( ''<div id="exit_info" class="debug_container">'' ).
+    ri_html->add( render_exit_info( ) ).
+    ri_html->add( ''</div>'' ).
+ 
+    ri_html->add( ''<div id="supported_objects" class="debug_container">'' ).
+    ri_html->add( render_supported_object_types( ) ).
+    ri_html->add( ''</div>'' ).
+ 
+    mv_html = ''<!DOCTYPE html><html lang="en"><title>abapGit Debug Info</title></head>''.
+    mv_html = |<body>{ ri_html->render( ) }</body></html>|.
+ 
+    register_deferred_script( render_scripts( ) ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_DIFF               ', 'CLASS zcl_abapgit_gui_page_diff DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_gui_hotkeys.
+ 
+    TYPES:
+      BEGIN OF ty_file_diff,
+        path       TYPE string,
+        filename   TYPE string,
+        obj_type   TYPE string,
+        obj_name   TYPE string,
+        lstate     TYPE c LENGTH 1,
+        rstate     TYPE c LENGTH 1,
+        fstate     TYPE c LENGTH 1, " FILE state - Abstraction for shorter ifs
+        o_diff     TYPE REF TO zcl_abapgit_diff,
+        changed_by TYPE syuname,
+        type       TYPE string,
+      END OF ty_file_diff.
+    TYPES:
+      ty_file_diffs TYPE STANDARD TABLE OF ty_file_diff
+                        WITH NON-UNIQUE DEFAULT KEY
+                        WITH NON-UNIQUE SORTED KEY secondary
+                             COMPONENTS path filename.
+ 
+    CONSTANTS:
+      BEGIN OF c_fstate,
+        local  TYPE c LENGTH 1 VALUE ''L'',
+        remote TYPE c LENGTH 1 VALUE ''R'',
+        both   TYPE c LENGTH 1 VALUE ''B'',
+      END OF c_fstate.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_key    TYPE zif_abapgit_persistence=>ty_repo-key
+        !is_file   TYPE zif_abapgit_git_definitions=>ty_file OPTIONAL
+        !is_object TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !it_files  TYPE zif_abapgit_definitions=>ty_stage_tt OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event
+        REDEFINITION.
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_actions,
+        toggle_unified         TYPE string VALUE ''toggle_unified'',
+        toggle_hidden_chars    TYPE string VALUE ''toggle_hidden_chars'',
+        toggle_ignore_indent   TYPE string VALUE ''toggle_ignore_indent'',
+        toggle_ignore_comments TYPE string VALUE ''toggle_ignore_comments'',
+        toggle_ignore_case     TYPE string VALUE ''toggle_ignore_case'',
+        refresh_prefix         TYPE string VALUE ''refresh'',
+        refresh_all            TYPE string VALUE ''refresh_all'',
+        refresh_local          TYPE string VALUE ''refresh_local'',
+        refresh_local_object   TYPE string VALUE ''refresh_local_object'',
+      END OF c_actions ,
+      BEGIN OF c_action_texts,
+        refresh_all   TYPE string VALUE \`Refresh All\`,
+        refresh_local TYPE string VALUE \`Refresh Local\`,
+      END OF c_action_texts,
+      BEGIN OF c_action_titles,
+        refresh_local TYPE string VALUE \`Refresh all local objects, without refreshing the remote\`,
+        refresh_all   TYPE string VALUE \`Complete refresh of all objects, local and remote\`,
+      END OF c_action_titles.
+ 
+    DATA mv_unified TYPE abap_bool VALUE abap_true ##NO_TEXT.
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mt_diff_files TYPE ty_file_diffs .
+ 
+    METHODS get_normalized_fname_with_path
+      IMPORTING
+        !is_diff           TYPE ty_file_diff
+      RETURNING
+        VALUE(rv_filename) TYPE string .
+    METHODS normalize_path
+      IMPORTING
+        !iv_path             TYPE string
+      RETURNING
+        VALUE(rv_normalized) TYPE string .
+    METHODS normalize_filename
+      IMPORTING
+        !iv_filename         TYPE string
+      RETURNING
+        VALUE(rv_normalized) TYPE string .
+    METHODS add_menu_end
+      IMPORTING
+        !io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS calculate_diff
+      IMPORTING
+        !is_file   TYPE zif_abapgit_git_definitions=>ty_file OPTIONAL
+        !is_object TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !it_files  TYPE zif_abapgit_definitions=>ty_stage_tt OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_menu_begin
+      IMPORTING
+        !io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS render_table_head_non_unified
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_diff TYPE ty_file_diff .
+    METHODS render_beacon_begin_of_row
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_diff TYPE ty_file_diff .
+    METHODS render_diff_head_after_state
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_diff TYPE ty_file_diff .
+    METHODS insert_nav
+      RETURNING
+        VALUE(rv_insert_nav) TYPE abap_bool .
+    METHODS render_line_split_row
+      IMPORTING
+        !ii_html      TYPE REF TO zif_abapgit_html
+        !iv_filename  TYPE string
+        !is_diff_line TYPE zif_abapgit_definitions=>ty_diff
+        !iv_index     TYPE sy-tabix
+        !iv_fstate    TYPE char1
+        !iv_new       TYPE string
+        !iv_old       TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS set_layout.
+    METHODS refresh
+      IMPORTING
+        iv_action TYPE clike
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_full
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_local
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_local_object
+      IMPORTING
+        iv_action TYPE clike
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_refresh
+      IMPORTING
+        iv_action            TYPE string
+      RETURNING
+        VALUE(rv_is_refrseh) TYPE abap_bool.
+    METHODS modify_files_before_diff_calc
+      IMPORTING
+        it_diff_files_old TYPE ty_file_diffs
+      RETURNING
+        VALUE(rt_files)   TYPE zif_abapgit_definitions=>ty_stage_tt.
+    METHODS add_view_sub_menu
+      IMPORTING
+        io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+ 
+    METHODS render_content
+        REDEFINITION .
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_view,
+        hidden_chars    TYPE abap_bool,
+        ignore_indent   TYPE abap_bool,
+        ignore_comments TYPE abap_bool,
+        ignore_case     TYPE abap_bool,
+      END OF ty_view.
+    DATA mt_delayed_lines TYPE zif_abapgit_definitions=>ty_diffs_tt .
+    DATA mv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key .
+    DATA mv_seed TYPE string .                    " Unique page id to bind JS sessionStorage
+    DATA ms_view TYPE ty_view.
+ 
+    METHODS render_diff
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_diff_head
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_table_head
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_beacon
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_line_no_diffs
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_line_split
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff
+        !iv_filename   TYPE string
+        !iv_fstate     TYPE char1
+        !iv_index      TYPE sy-tabix
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_line_unified
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS append_diff
+      IMPORTING
+        !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !it_local  TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !is_status TYPE zif_abapgit_definitions=>ty_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_binary
+      IMPORTING
+        !iv_d1        TYPE xstring
+        !iv_d2        TYPE xstring
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS add_jump_sub_menu
+      IMPORTING
+        !io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS add_filter_sub_menu
+      IMPORTING
+        !io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS render_lines
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_table_head_unified
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_file_requested
+      IMPORTING
+        it_files                    TYPE zif_abapgit_definitions=>ty_stage_tt
+        is_status                   TYPE zif_abapgit_definitions=>ty_result
+      RETURNING
+        VALUE(rv_is_file_requested) TYPE abap_bool.
+    METHODS has_diffs
+      IMPORTING
+        !it_diffs           TYPE zif_abapgit_definitions=>ty_diffs_tt
+      RETURNING
+        VALUE(rv_has_diffs) TYPE abap_bool.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION.
+ 
+ 
+  METHOD add_filter_sub_menu.
+ 
+    DATA:
+      lo_sub_filter TYPE REF TO zcl_abapgit_html_toolbar,
+      lv_user       TYPE string,
+      lt_extensions TYPE SORTED TABLE OF string WITH UNIQUE DEFAULT KEY,
+      lt_obj_types  TYPE SORTED TABLE OF string WITH UNIQUE DEFAULT KEY,
+      lt_users      TYPE SORTED TABLE OF string WITH UNIQUE DEFAULT KEY.
+ 
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff_files,
+                   <lv_i>    TYPE string.
+ 
+    " Get unique filter values
+    LOOP AT mt_diff_files ASSIGNING <ls_diff>.
+      lv_user = <ls_diff>-changed_by.
+      INSERT <ls_diff>-type INTO TABLE lt_extensions.
+      INSERT <ls_diff>-obj_type INTO TABLE lt_obj_types.
+      INSERT lv_user INTO TABLE lt_users.
+    ENDLOOP.
+ 
+    IF lines( lt_extensions ) > 1 OR lines( lt_obj_types ) > 1 OR lines( lt_users ) > 1.
+      CREATE OBJECT lo_sub_filter EXPORTING iv_id = ''diff-filter''.
+ 
+      IF lines( lt_users ) > 1.
+        lo_sub_filter->add( iv_txt = ''Only my changes''
+                            iv_typ = zif_abapgit_html=>c_action_type-onclick
+                            iv_aux = |{ sy-uname }|
+                            iv_chk = abap_false ).
+      ENDIF.
+ 
+      " File extensions
+      IF lines( lt_extensions ) > 1.
+        lo_sub_filter->add( iv_txt = ''Extension''
+                            iv_typ = zif_abapgit_html=>c_action_type-separator ).
+        LOOP AT lt_extensions ASSIGNING <lv_i>.
+          lo_sub_filter->add( iv_txt = <lv_i>
+                       iv_typ = zif_abapgit_html=>c_action_type-onclick
+                       iv_aux = ''extension''
+                       iv_chk = abap_true ).
+        ENDLOOP.
+      ENDIF.
+ 
+      " Object types
+      IF lines( lt_obj_types ) > 1.
+        lo_sub_filter->add( iv_txt = ''Object Type''
+                            iv_typ = zif_abapgit_html=>c_action_type-separator ).
+        LOOP AT lt_obj_types ASSIGNING <lv_i>.
+          lo_sub_filter->add( iv_txt = <lv_i>
+                       iv_typ = zif_abapgit_html=>c_action_type-onclick
+                       iv_aux = ''object-type''
+                       iv_chk = abap_true ).
+        ENDLOOP.
+      ENDIF.
+ 
+      " Changed by
+      IF lines( lt_users ) > 1.
+        lo_sub_filter->add( iv_txt = ''Changed By''
+                            iv_typ = zif_abapgit_html=>c_action_type-separator ).
+        LOOP AT lt_users ASSIGNING <lv_i>.
+          lo_sub_filter->add( iv_txt = <lv_i>
+                       iv_typ = zif_abapgit_html=>c_action_type-onclick
+                       iv_aux = ''changed-by''
+                       iv_chk = abap_true ).
+        ENDLOOP.
+      ENDIF.
+ 
+      io_menu->add( iv_txt = ''Filter''
+                    io_sub = lo_sub_filter ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_jump_sub_menu.
+ 
+    DATA: lo_sub_jump    TYPE REF TO zcl_abapgit_html_toolbar,
+          lv_jump_target TYPE string.
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff_files.
+ 
+    CREATE OBJECT lo_sub_jump EXPORTING iv_id = ''jump''.
+ 
+    LOOP AT mt_diff_files ASSIGNING <ls_diff>.
+ 
+      lv_jump_target = <ls_diff>-path && <ls_diff>-filename.
+ 
+      lo_sub_jump->add(
+          iv_id  = |li_jump_{ sy-tabix }|
+          iv_txt = lv_jump_target
+          iv_typ = zif_abapgit_html=>c_action_type-onclick ).
+ 
+    ENDLOOP.
+ 
+    io_menu->add( iv_txt = ''Jump''
+                  io_sub = lo_sub_jump ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_menu_begin.
+ 
+    io_menu->add(
+        iv_txt   = c_action_texts-refresh_local
+        iv_typ   = zif_abapgit_html=>c_action_type-sapevent
+        iv_act   = c_actions-refresh_local
+        iv_id    = c_actions-refresh_local
+        iv_title = c_action_titles-refresh_local ).
+ 
+    io_menu->add(
+        iv_txt   = c_action_texts-refresh_all
+        iv_typ   = zif_abapgit_html=>c_action_type-sapevent
+        iv_act   = c_actions-refresh_all
+        iv_id    = c_actions-refresh_all
+        iv_title = c_action_titles-refresh_all ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_menu_end.
+ 
+    io_menu->add( iv_txt = ''Split/Unified''
+                  iv_act = c_actions-toggle_unified ).
+ 
+    add_view_sub_menu( io_menu ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_view_sub_menu.
+ 
+    DATA lo_sub_view TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CREATE OBJECT lo_sub_view EXPORTING iv_id = ''diff-view''.
+ 
+    lo_sub_view->add( iv_txt = ''Show Hidden Characters''
+                      iv_act = c_actions-toggle_hidden_chars
+                      iv_chk = ms_view-hidden_chars ).
+ 
+    lo_sub_view->add( iv_txt = ''Ignore Whitespace''
+                      iv_act = c_actions-toggle_ignore_indent
+                      iv_chk = ms_view-ignore_indent ).
+ 
+    lo_sub_view->add( iv_txt = ''Ignore Comments''
+                      iv_act = c_actions-toggle_ignore_comments
+                      iv_chk = ms_view-ignore_comments ).
+ 
+    lo_sub_view->add( iv_txt = ''Ignore Pretty-Print Case''
+                      iv_act = c_actions-toggle_ignore_case
+                      iv_chk = ms_view-ignore_case ).
+ 
+    io_menu->add( iv_txt = ''View''
+                  io_sub = lo_sub_view ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD append_diff.
+ 
+    DATA:
+      lv_offs    TYPE i,
+      ls_r_dummy LIKE LINE OF it_remote ##NEEDED,
+      ls_l_dummy LIKE LINE OF it_local  ##NEEDED.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF it_remote,
+                   <ls_local>  LIKE LINE OF it_local,
+                   <ls_diff>   LIKE LINE OF mt_diff_files.
+ 
+ 
+    READ TABLE it_remote ASSIGNING <ls_remote>
+      WITH KEY file_path
+       COMPONENTS path     = is_status-path
+                  filename = is_status-filename.
+    IF sy-subrc <> 0.
+      ASSIGN ls_r_dummy TO <ls_remote>.
+    ENDIF.
+ 
+    READ TABLE it_local ASSIGNING <ls_local>
+      WITH KEY file-filename = is_status-filename
+               file-path     = is_status-path.
+    IF sy-subrc <> 0.
+      ASSIGN ls_l_dummy TO <ls_local>.
+    ENDIF.
+ 
+    IF <ls_local> IS INITIAL AND <ls_remote> IS INITIAL.
+      zcx_abapgit_exception=>raise( |DIFF: file not found { is_status-filename }| ).
+    ENDIF.
+ 
+    APPEND INITIAL LINE TO mt_diff_files ASSIGNING <ls_diff>.
+    <ls_diff>-path     = is_status-path.
+    <ls_diff>-filename = is_status-filename.
+    <ls_diff>-obj_type = is_status-obj_type.
+    <ls_diff>-obj_name = is_status-obj_name.
+    <ls_diff>-lstate   = is_status-lstate.
+    <ls_diff>-rstate   = is_status-rstate.
+ 
+    IF <ls_diff>-lstate IS NOT INITIAL AND <ls_diff>-rstate IS NOT INITIAL.
+      <ls_diff>-fstate = c_fstate-both.
+    ELSEIF <ls_diff>-lstate IS NOT INITIAL.
+      <ls_diff>-fstate = c_fstate-local.
+    ELSE. "rstate IS NOT INITIAL, lstate = empty.
+      <ls_diff>-fstate = c_fstate-remote.
+    ENDIF.
+ 
+    " Changed by
+    IF <ls_local>-item-obj_type IS NOT INITIAL.
+      <ls_diff>-changed_by = zcl_abapgit_objects=>changed_by(
+        is_item     = <ls_local>-item
+        iv_filename = is_status-filename ).
+    ENDIF.
+    IF <ls_diff>-changed_by IS INITIAL.
+      <ls_diff>-changed_by = zcl_abapgit_objects_super=>c_user_unknown.
+    ENDIF.
+ 
+    " Extension
+    IF <ls_local>-file-filename IS NOT INITIAL.
+      <ls_diff>-type = reverse( <ls_local>-file-filename ).
+    ELSE.
+      <ls_diff>-type = reverse( <ls_remote>-filename ).
+    ENDIF.
+ 
+    FIND FIRST OCCURRENCE OF ''.'' IN <ls_diff>-type MATCH OFFSET lv_offs.
+    <ls_diff>-type = reverse( substring( val = <ls_diff>-type
+                                         len = lv_offs ) ).
+    IF <ls_diff>-type <> ''xml'' AND <ls_diff>-type <> ''abap''.
+      <ls_diff>-type = ''other''.
+    ENDIF.
+ 
+    IF <ls_diff>-type = ''other''
+       AND is_binary( iv_d1 = <ls_remote>-data
+                      iv_d2 = <ls_local>-file-data ) = abap_true.
+      <ls_diff>-type = ''binary''.
+    ENDIF.
+ 
+    " Diff data
+    IF <ls_diff>-type <> ''binary''.
+      IF <ls_diff>-fstate = c_fstate-remote. " Remote file leading changes
+        CREATE OBJECT <ls_diff>-o_diff
+          EXPORTING
+            iv_new                = <ls_remote>-data
+            iv_old                = <ls_local>-file-data
+            iv_ignore_indentation = ms_view-ignore_indent
+            iv_ignore_comments    = ms_view-ignore_comments
+            iv_ignore_case        = ms_view-ignore_case.
+      ELSE.             " Local leading changes or both were modified
+        CREATE OBJECT <ls_diff>-o_diff
+          EXPORTING
+            iv_new                = <ls_local>-file-data
+            iv_old                = <ls_remote>-data
+            iv_ignore_indentation = ms_view-ignore_indent
+            iv_ignore_comments    = ms_view-ignore_comments
+            iv_ignore_case        = ms_view-ignore_case.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = ''toolbar-main''.
+ 
+    add_menu_begin( ro_menu ).
+    add_jump_sub_menu( ro_menu ).
+    add_filter_sub_menu( ro_menu ).
+    add_menu_end( ro_menu ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD calculate_diff.
+ 
+    DATA: lt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lt_local  TYPE zif_abapgit_definitions=>ty_files_item_tt,
+          lt_status TYPE zif_abapgit_definitions=>ty_results_tt.
+ 
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    FIELD-SYMBOLS: <ls_status> LIKE LINE OF lt_status.
+ 
+    CLEAR: mt_diff_files.
+ 
+    lt_remote = mo_repo->get_files_remote( ).
+    lt_local  = mo_repo->get_files_local( ).
+    mo_repo->reset_status( ).
+    lt_status = mo_repo->status( ).
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->pre_calculate_repo_status(
+      EXPORTING
+        is_repo_meta = mo_repo->ms_data
+      CHANGING
+        ct_local  = lt_local
+        ct_remote = lt_remote ).
+ 
+    IF is_file IS NOT INITIAL.        " Diff for one file
+ 
+      READ TABLE lt_status ASSIGNING <ls_status>
+        WITH KEY path = is_file-path filename = is_file-filename.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |File { is_file-path }{ is_file-filename } not found| ).
+      ENDIF.
+ 
+      append_diff( it_remote = lt_remote
+                   it_local  = lt_local
+                   is_status = <ls_status> ).
+ 
+    ELSEIF is_object IS NOT INITIAL.  " Diff for whole object
+ 
+      LOOP AT lt_status ASSIGNING <ls_status>
+          USING KEY sec_key
+          WHERE obj_type = is_object-obj_type
+          AND obj_name = is_object-obj_name
+          AND match IS INITIAL.
+        append_diff( it_remote = lt_remote
+                     it_local  = lt_local
+                     is_status = <ls_status> ).
+      ENDLOOP.
+ 
+    ELSE.                             " Diff for the whole repo
+ 
+      SORT lt_status BY
+        path ASCENDING
+        filename ASCENDING.
+      LOOP AT lt_status ASSIGNING <ls_status> WHERE match IS INITIAL.
+ 
+        IF is_file_requested( it_files  = it_files
+                              is_status = <ls_status> ) = abap_true.
+ 
+          append_diff( it_remote = lt_remote
+                       it_local  = lt_local
+                       is_status = <ls_status> ).
+ 
+        ENDIF.
+ 
+      ENDLOOP.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lv_ts TYPE timestamp.
+ 
+    super->constructor( ).
+    ms_control-page_title = ''Diff''.
+    mv_unified            = zcl_abapgit_persistence_user=>get_instance( )->get_diff_unified( ).
+    set_layout( ).
+    mv_repo_key           = iv_key.
+    mo_repo              ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    GET TIME STAMP FIELD lv_ts.
+    mv_seed = |diff{ lv_ts }|. " Generate based on time
+ 
+    ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed
+ 
+    calculate_diff(
+        is_file   = is_file
+        is_object = is_object
+        it_files  = it_files ).
+ 
+    IF lines( mt_diff_files ) = 0.
+      zcx_abapgit_exception=>raise(
+        ''There are no differences to show. The local state completely matches the remote repository.'' ).
+    ENDIF.
+ 
+    ms_control-page_menu = build_menu( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_normalized_fname_with_path.
+ 
+    rv_filename = normalize_path( is_diff-path )
+               && \`_\`
+               && normalize_filename( is_diff-filename ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD has_diffs.
+ 
+    LOOP AT it_diffs TRANSPORTING NO FIELDS WHERE result IS NOT INITIAL.
+      rv_has_diffs = abap_true.
+      EXIT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_nav.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_binary.
+ 
+    FIELD-SYMBOLS <lv_data> LIKE iv_d1.
+ 
+    IF iv_d1 IS NOT INITIAL. " One of them might be new and so empty
+      ASSIGN iv_d1 TO <lv_data>.
+    ELSE.
+      ASSIGN iv_d2 TO <lv_data>.
+    ENDIF.
+ 
+    rv_yes = zcl_abapgit_utils=>is_binary( <lv_data> ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_file_requested.
+ 
+    IF lines( it_files ) = 0.
+      rv_is_file_requested = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE it_files WITH KEY file-path     = is_status-path
+                                 file-filename = is_status-filename
+                        TRANSPORTING NO FIELDS.
+    rv_is_file_requested = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_refresh.
+ 
+    FIND FIRST OCCURRENCE OF REGEX |^{ c_actions-refresh_prefix }| IN iv_action.
+    rv_is_refrseh = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD modify_files_before_diff_calc.
+ 
+    DATA ls_file LIKE LINE OF rt_files.
+ 
+    FIELD-SYMBOLS <ls_diff_file_old> TYPE ty_file_diff.
+ 
+    " We need to supply files again in calculate_diff. Because
+    " we only want to refresh the visible files. Otherwise all
+    " diff files would appear.
+    " Which is not wanted when we previously only selected particular files.
+    LOOP AT it_diff_files_old ASSIGNING <ls_diff_file_old>.
+      CLEAR ls_file.
+      MOVE-CORRESPONDING <ls_diff_file_old> TO ls_file-file.
+      INSERT ls_file INTO TABLE rt_files.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_filename.
+ 
+    rv_normalized = replace( val  = iv_filename
+                             sub  = ''.''
+                             occ  = 0
+                             with = ''_'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_path.
+ 
+    rv_normalized = replace( val  = iv_path
+                             sub  = ''/''
+                             occ  = 0
+                             with = ''_'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh.
+ 
+    DATA:
+      lt_diff_files_old TYPE ty_file_diffs,
+      lt_files          TYPE zif_abapgit_definitions=>ty_stage_tt.
+ 
+ 
+    lt_diff_files_old = mt_diff_files.
+ 
+    CASE iv_action.
+      WHEN c_actions-refresh_all.
+        refresh_full( ).
+      WHEN c_actions-refresh_local.
+        refresh_local( ).
+      WHEN OTHERS.
+        refresh_local_object( iv_action ).
+    ENDCASE.
+ 
+    lt_files = modify_files_before_diff_calc( lt_diff_files_old ).
+ 
+    calculate_diff( it_files = lt_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_full.
+    mo_repo->refresh( abap_true ).
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local.
+    mo_repo->refresh_local_objects( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local_object.
+ 
+    DATA:
+      lv_regex    TYPE string,
+      lv_obj_type TYPE tadir-object,
+      lv_obj_name TYPE tadir-obj_name.
+ 
+    lv_regex = c_actions-refresh_local_object && \`_(\\w{4})_(.*)\`.
+ 
+    FIND FIRST OCCURRENCE OF REGEX lv_regex
+      IN iv_action
+      SUBMATCHES lv_obj_type lv_obj_name.
+ 
+    IF sy-subrc = 0.
+      mo_repo->refresh_local_object(
+          iv_obj_type = lv_obj_type
+          iv_obj_name = lv_obj_name ).
+    ELSE.
+      zcx_abapgit_exception=>raise( |Invalid refresh action { iv_action }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_beacon.
+ 
+    DATA: lv_beacon  TYPE string,
+          lt_beacons TYPE zif_abapgit_definitions=>ty_string_tt.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF is_diff_line-beacon > 0.
+      lt_beacons = is_diff-o_diff->get_beacons( ).
+      READ TABLE lt_beacons INTO lv_beacon INDEX is_diff_line-beacon.
+    ELSE.
+      lv_beacon = ''---''.
+    ENDIF.
+ 
+    ri_html->add( ''<thead class="nav_line">'' ).
+    ri_html->add( ''<tr>'' ).
+ 
+    render_beacon_begin_of_row(
+      ii_html = ri_html
+      is_diff = is_diff ).
+ 
+    IF mv_unified = abap_true.
+      ri_html->add( ''<th class="num"></th>'' ).
+      ri_html->add( ''<th class="mark"></th>'' ).
+      ri_html->add( |<th>@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
+    ELSE.
+      ri_html->add( |<th colspan="6">@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
+    ENDIF.
+ 
+    ri_html->add( ''</tr>'' ).
+    ri_html->add( ''</thead>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_beacon_begin_of_row.
+ 
+    ii_html->add( ''<th class="num"></th>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    DATA: ls_diff_file LIKE LINE OF mt_diff_files,
+          li_progress  TYPE REF TO zif_abapgit_progress.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( mt_diff_files ) ).
+ 
+    ri_html->add( \`<div class="repo">\` ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( mo_repo ) ).
+    ri_html->add( \`</div>\` ).
+ 
+    ri_html->add( |<div id="diff-list" data-repo-key="{ mv_repo_key }">| ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_js_error_banner( ) ).
+    LOOP AT mt_diff_files INTO ls_diff_file.
+      li_progress->show(
+        iv_current = sy-tabix
+        iv_text    = |Render Diff - { ls_diff_file-filename }| ).
+ 
+      ri_html->add( render_diff( ls_diff_file ) ).
+    ENDLOOP.
+    IF sy-subrc <> 0.
+      ri_html->add( |No more diffs| ).
+    ENDIF.
+    ri_html->add( ''</div>'' ).
+ 
+    register_deferred_script( render_scripts( ) ).
+ 
+    li_progress->off( ).
+ 
+    register_handlers( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<div class="diff" data-extension="{ is_diff-type
+      }" data-object-type="{ is_diff-obj_type
+      }" data-changed-by="{ is_diff-changed_by
+      }" data-file="{ is_diff-path && is_diff-filename }">| ).
+    ri_html->add( render_diff_head( is_diff ) ).
+ 
+    " Content
+    IF is_diff-type <> ''binary''.
+      ri_html->add( ''<div class="diff_content">'' ).
+      ri_html->add( |<table class="diff_tab syntax-hl" id="{ is_diff-filename }">| ).
+      ri_html->add( render_table_head( is_diff ) ).
+      ri_html->add( render_lines( is_diff ) ).
+      ri_html->add( ''</table>'' ).
+    ELSE.
+      ri_html->add( ''<div class="diff_content paddings center grey">'' ).
+      ri_html->add( ''The content seems to be binary.'' ).
+      ri_html->add( ''Cannot display as diff.'' ).
+    ENDIF.
+    ri_html->add( ''</div>'' ).
+ 
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff_head.
+ 
+    DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count,
+          lv_jump  TYPE string,
+          lv_link  TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="diff_head">'' ).
+ 
+    ri_html->add_icon(
+      iv_name    = ''chevron-down''
+      iv_hint    = ''Collapse/Expand''
+      iv_class   = ''cursor-pointer''
+      iv_onclick = ''onDiffCollapse(event)'' ).
+ 
+    IF is_diff-type <> ''binary''.
+      ls_stats = is_diff-o_diff->stats( ).
+      IF is_diff-fstate = c_fstate-both. " Merge stats into ''update'' if both were changed
+        ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete.
+        CLEAR: ls_stats-insert, ls_stats-delete.
+      ENDIF.
+ 
+      ri_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
+      ri_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
+      ri_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
+    ENDIF.
+ 
+    " no links for nonexistent or deleted objects
+    IF NOT ( is_diff-lstate = zif_abapgit_definitions=>c_state-unchanged AND
+             is_diff-rstate = zif_abapgit_definitions=>c_state-added ) AND
+         NOT is_diff-lstate = zif_abapgit_definitions=>c_state-deleted.
+ 
+      lv_jump = zcl_abapgit_html_action_utils=>jump_encode(
+        iv_obj_type = |{ is_diff-obj_type }|
+        iv_obj_name = |{ is_diff-obj_name }|
+        iv_filename = is_diff-filename ).
+ 
+      lv_link = ri_html->a(
+        iv_txt = |{ is_diff-path }{ is_diff-filename }|
+        iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_jump }| ).
+    ENDIF.
+ 
+    IF lv_link IS NOT INITIAL.
+      ri_html->add( |<span class="diff_name">{ lv_link }</span>| ).
+    ELSE.
+      ri_html->add( |<span class="diff_name">{ is_diff-path }{ is_diff-filename }</span>| ).
+    ENDIF.
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state(
+      iv_lstate = is_diff-lstate
+      iv_rstate = is_diff-rstate ) ).
+ 
+    render_diff_head_after_state(
+      ii_html = ri_html
+      is_diff = is_diff ).
+ 
+    ri_html->add( ''<span class="diff_changed_by">Last Changed by: '' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( is_diff-changed_by ) ).
+    ri_html->add( ''</span>'' ).
+ 
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff_head_after_state.
+ 
+    IF is_diff-fstate = c_fstate-both AND mv_unified = abap_true.
+      ii_html->add( ''<span class="attention pad-sides">Attention: Unified mode''
+                 && '' highlighting for MM assumes local file is newer ! </span>'' ).
+    ENDIF.
+ 
+    IF is_diff-obj_type IS NOT INITIAL AND is_diff-obj_name IS NOT INITIAL.
+      ii_html->add( ''<span class="repo_name">'' ).
+      ii_html->add_a( iv_txt   = ii_html->icon( iv_name  = ''redo-alt-solid''
+                                                iv_class = ''pad-sides''
+                                                iv_hint  = ''Local refresh of this object'' )
+                      iv_act   = |{ c_actions-refresh_local_object }_{ is_diff-obj_type }_{ is_diff-obj_name }|
+                      iv_class = |url| ).
+      ii_html->add( ''</span>'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_lines.
+ 
+    DATA: lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter,
+          lt_diffs       TYPE zif_abapgit_definitions=>ty_diffs_tt,
+          lv_insert_nav  TYPE abap_bool,
+          lv_tabix       TYPE syst-tabix.
+ 
+    FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs.
+    FIELD-SYMBOLS <ls_diff_line> LIKE LINE OF lt_diffs.
+ 
+    lo_highlighter = zcl_abapgit_syntax_factory=>create( iv_filename     = is_diff-filename
+                                                         iv_hidden_chars = ms_view-hidden_chars ).
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lt_diffs = is_diff-o_diff->get( ).
+ 
+    IF has_diffs( lt_diffs ) = abap_false.
+      ri_html->add( render_line_no_diffs( ) ).
+      RETURN.
+    ENDIF.
+ 
+    lv_insert_nav = insert_nav( ).
+ 
+    LOOP AT lt_diffs ASSIGNING <ls_diff>.
+ 
+      lv_tabix = sy-tabix.
+ 
+      IF <ls_diff>-short = abap_false.
+        lv_insert_nav = abap_true.
+        CONTINUE.
+      ENDIF.
+ 
+      IF lv_insert_nav = abap_true. " Insert separator line with navigation
+        " Get line where diff really starts
+        READ TABLE lt_diffs ASSIGNING <ls_diff_line> INDEX lv_tabix + 8.
+        IF sy-subrc <> 0.
+          " Occurs only for small files/diffs with less than 8 lines.
+          " Therefore let''s use the first line as beacon
+          ASSIGN <ls_diff> TO <ls_diff_line>.
+          ASSERT <ls_diff_line> IS ASSIGNED.
+        ENDIF.
+        ri_html->add( render_beacon( is_diff_line = <ls_diff_line>
+                                     is_diff      = is_diff ) ).
+        lv_insert_nav = abap_false.
+      ENDIF.
+ 
+      IF lo_highlighter IS BOUND.
+        <ls_diff>-new = lo_highlighter->process_line( <ls_diff>-new ).
+        <ls_diff>-old = lo_highlighter->process_line( <ls_diff>-old ).
+      ELSE.
+        <ls_diff>-new = escape( val    = <ls_diff>-new
+                                format = cl_abap_format=>e_html_attr ).
+        <ls_diff>-old = escape( val    = <ls_diff>-old
+                                format = cl_abap_format=>e_html_attr ).
+      ENDIF.
+ 
+      CONDENSE <ls_diff>-new_num. "get rid of leading spaces
+      CONDENSE <ls_diff>-old_num.
+ 
+      IF mv_unified = abap_true.
+        ri_html->add( render_line_unified( is_diff_line = <ls_diff> ) ).
+      ELSE.
+        ri_html->add( render_line_split( is_diff_line = <ls_diff>
+                                         iv_filename  = get_normalized_fname_with_path( is_diff )
+                                         iv_fstate    = is_diff-fstate
+                                         iv_index     = lv_tabix ) ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF mv_unified = abap_true.
+      ri_html->add( render_line_unified( ) ). " Release delayed lines
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_no_diffs.
+ 
+    DATA ls_diff_line TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF mv_unified = abap_true.
+      ls_diff_line-old = ''No diffs found''.
+      ri_html->add( render_line_unified( is_diff_line = ls_diff_line ) ).
+    ELSE.
+      ls_diff_line-new = ''No diffs found''.
+      ri_html->add( render_line_split( is_diff_line = ls_diff_line
+                                       iv_filename  = ''''
+                                       iv_fstate    = ''''
+                                       iv_index     = 1 ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_split.
+ 
+    DATA: lv_new  TYPE string,
+          lv_old  TYPE string,
+          lv_mark TYPE string,
+          lv_bg   TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " Note: CSS classes "new" and "old" are used to enable column-based copy to clipboard
+ 
+    " New line
+    lv_mark = \` \`.
+    IF is_diff_line-result IS NOT INITIAL.
+      IF iv_fstate = c_fstate-both OR is_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+        lv_bg = '' diff_upd''.
+        lv_mark = \`~\`.
+      ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-insert.
+        lv_bg = '' diff_ins''.
+        lv_mark = \`+\`.
+      ENDIF.
+    ENDIF.
+    lv_new = |<td class="num diff_others" line-num="{ is_diff_line-new_num }"></td>|
+          && |<td class="mark diff_others">{ lv_mark }</td>|
+          && |<td class="code{ lv_bg } diff_left new">{ is_diff_line-new }</td>|.
+ 
+    " Old line
+    CLEAR lv_bg.
+    lv_mark = \` \`.
+    IF is_diff_line-result IS NOT INITIAL.
+      IF iv_fstate = c_fstate-both OR is_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+        lv_bg = '' diff_upd''.
+        lv_mark = \`~\`.
+      ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-delete.
+        lv_bg = '' diff_del''.
+        lv_mark = \`-\`.
+      ENDIF.
+    ENDIF.
+    lv_old = |<td class="num diff_others" line-num="{ is_diff_line-old_num }"></td>|
+          && |<td class="mark diff_others">{ lv_mark }</td>|
+          && |<td class="code{ lv_bg } diff_right old">{ is_diff_line-old }</td>|.
+ 
+    " render line, inverse sides if remote is newer
+    ri_html->add( ''<tr class="diff_line">'' ).
+ 
+    render_line_split_row(
+        ii_html                = ri_html
+        iv_filename            = iv_filename
+        is_diff_line           = is_diff_line
+        iv_index               = iv_index
+        iv_fstate              = iv_fstate
+        iv_old                 = lv_old
+        iv_new                 = lv_new ).
+ 
+    ri_html->add( ''</tr>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_split_row.
+ 
+    IF iv_fstate = c_fstate-remote. " Remote file leading changes
+      ii_html->add( iv_old ). " local
+      ii_html->add( iv_new ). " remote
+    ELSE.             " Local leading changes or both were modified
+      ii_html->add( iv_new ). " local
+      ii_html->add( iv_old ). " remote
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_unified.
+ 
+    FIELD-SYMBOLS <ls_diff_line> LIKE LINE OF mt_delayed_lines.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " Note: CSS classes "new" and "old" are used to enable column-based copy to clipboard
+ 
+    " Release delayed subsequent update lines
+    IF is_diff_line-result <> zif_abapgit_definitions=>c_diff-update.
+      LOOP AT mt_delayed_lines ASSIGNING <ls_diff_line>.
+        ri_html->add( ''<tr class="diff_line">'' ).
+        ri_html->add( |<td class="num diff_others" line-num="{ <ls_diff_line>-old_num }"></td>|
+                   && |<td class="num diff_others" line-num=""></td>|
+                   && |<td class="mark diff_others">-</td>|
+                   && |<td class="code diff_del diff_unified old">{ <ls_diff_line>-old }</td>| ).
+        ri_html->add( ''</tr>'' ).
+      ENDLOOP.
+      LOOP AT mt_delayed_lines ASSIGNING <ls_diff_line>.
+        ri_html->add( ''<tr class="diff_line">'' ).
+        ri_html->add( |<td class="num diff_others" line-num=""></td>|
+                   && |<td class="num diff_others" line-num="{ <ls_diff_line>-new_num }"></td>|
+                   && |<td class="mark diff_others">+</td>|
+                   && |<td class="code diff_ins diff_unified new">{ <ls_diff_line>-new }</td>| ).
+        ri_html->add( ''</tr>'' ).
+      ENDLOOP.
+      CLEAR mt_delayed_lines.
+    ENDIF.
+ 
+    ri_html->add( ''<tr class="diff_line">'' ).
+    CASE is_diff_line-result.
+      WHEN zif_abapgit_definitions=>c_diff-update.
+        APPEND is_diff_line TO mt_delayed_lines. " Delay output of subsequent updates
+      WHEN zif_abapgit_definitions=>c_diff-insert.
+        ri_html->add( |<td class="num diff_others" line-num=""></td>|
+                   && |<td class="num diff_others" line-num="{ is_diff_line-new_num }"></td>|
+                   && |<td class="mark diff_others">+</td>|
+                   && |<td class="code diff_ins diff_unified new">{ is_diff_line-new }</td>| ).
+      WHEN zif_abapgit_definitions=>c_diff-delete.
+        ri_html->add( |<td class="num diff_others" line-num="{ is_diff_line-old_num }"></td>|
+                   && |<td class="num diff_others" line-num=""></td>|
+                   && |<td class="mark diff_others">-</td>|
+                   && |<td class="code diff_del diff_unified old">{ is_diff_line-old }</td>| ).
+      WHEN OTHERS. "none
+        ri_html->add( |<td class="num diff_others" line-num="{ is_diff_line-old_num }"></td>|
+                   && |<td class="num diff_others" line-num="{ is_diff_line-new_num }"></td>|
+                   && |<td class="mark diff_others">&nbsp;</td>|
+                   && |<td class="code diff_unified">{ is_diff_line-old }</td>| ).
+    ENDCASE.
+    ri_html->add( ''</tr>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+ 
+    ri_html->add( ''restoreScrollPosition();'' ).
+    ri_html->add( ''var gHelper = new DiffHelper({'' ).
+    ri_html->add( |  seed:        "{ mv_seed }",| ).
+    ri_html->add( ''  ids: {'' ).
+    ri_html->add( ''    jump:        "jump",'' ).
+    ri_html->add( ''    diffList:    "diff-list",'' ).
+    ri_html->add( ''    filterMenu:  "diff-filter",'' ).
+    ri_html->add( ''  }'' ).
+    ri_html->add( ''});'' ).
+ 
+    ri_html->add( ''addMarginBottom();'' ).
+ 
+    ri_html->add( ''var gGoJumpPalette = new CommandPalette(enumerateJumpAllFiles, {'' ).
+    ri_html->add( ''  toggleKey: "F2",'' ).
+    ri_html->add( ''  hotkeyDescription: "Jump to File ..."'' ).
+    ri_html->add( ''});'' ).
+ 
+    " Feature for selecting ABAP code by column and copy to clipboard
+    ri_html->add( ''var columnSelection = new DiffColumnSelection();'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( ''<thead class="header">'' ).
+    ri_html->add( ''<tr>'' ).
+ 
+    IF mv_unified = abap_true.
+ 
+      render_table_head_unified( ri_html ).
+ 
+    ELSE.
+ 
+      render_table_head_non_unified(
+          ii_html = ri_html
+          is_diff = is_diff ).
+ 
+    ENDIF.
+ 
+    ri_html->add( ''</tr>'' ).
+    ri_html->add( ''</thead>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head_non_unified.
+ 
+    ii_html->add( ''<th class="num"></th>'' ).
+    ii_html->add( ''<th class="mark"></th>'' ).
+    ii_html->add( ''<th>LOCAL</th>'' ).
+    ii_html->add( ''<th class="num"></th>'' ).
+    ii_html->add( ''<th class="mark"></th>'' ).
+    ii_html->add( ''<th>REMOTE</th>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head_unified.
+ 
+    ii_html->add( ''<th class="num">old</th>'' ).
+    ii_html->add( ''<th class="num">new</th>'' ).
+    ii_html->add( ''<th class="mark"></th>'' ).
+    ii_html->add( ''<th>code</th>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_layout.
+ 
+    IF mv_unified = abap_true.
+      ms_control-page_layout = c_page_layout-centered.
+    ELSE.
+      ms_control-page_layout = c_page_layout-full_width.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA ls_view LIKE ms_view.
+ 
+    ls_view = ms_view.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-toggle_unified. " Toggle file diplay
+ 
+        mv_unified = zcl_abapgit_persistence_user=>get_instance( )->toggle_diff_unified( ).
+        set_layout( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-toggle_hidden_chars. " Toggle display of hidden characters
+ 
+        ms_view-hidden_chars = boolc( ms_view-hidden_chars = abap_false ).
+ 
+      WHEN c_actions-toggle_ignore_indent. " Toggle ignore indentation
+ 
+        ms_view-ignore_indent = boolc( ms_view-ignore_indent = abap_false ).
+ 
+      WHEN c_actions-toggle_ignore_comments. " Toggle ignore comments
+ 
+        ms_view-ignore_comments = boolc( ms_view-ignore_comments = abap_false ).
+ 
+      WHEN c_actions-toggle_ignore_case. " Toggle case sensitivity
+ 
+        ms_view-ignore_case = boolc( ms_view-ignore_case = abap_false ).
+ 
+      WHEN OTHERS.
+ 
+        IF is_refresh( ii_event->mv_action ) = abap_true.
+ 
+          refresh( ii_event->mv_action ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+        ELSE.
+ 
+          rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+ 
+        ENDIF.
+ 
+    ENDCASE.
+ 
+    " If view has changed, refresh local files recalculating diff, and update menu
+    IF ms_view <> ls_view.
+      refresh( c_actions-refresh_local ).
+      ms_control-page_menu = build_menu( ).
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = ''Diff''.
+ 
+    ls_hotkey_action-description = |Refresh Local|.
+    ls_hotkey_action-action      = c_actions-refresh_local.
+    ls_hotkey_action-hotkey      = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Refresh All|.
+    ls_hotkey_action-action      = c_actions-refresh_all.
+    ls_hotkey_action-hotkey      = |a|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Toogle Split/Unified|.
+    ls_hotkey_action-action      = c_actions-toggle_unified.
+    ls_hotkey_action-hotkey      = |u|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Toogle Hidden Characters|.
+    ls_hotkey_action-action      = c_actions-toggle_hidden_chars.
+    ls_hotkey_action-hotkey      = |h|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_EX_OBJECT          ', 'CLASS zcl_abapgit_gui_page_ex_object DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS:
+      BEGIN OF c_id,
+        object_type TYPE string VALUE ''object_type'',
+        object_name TYPE string VALUE ''object_name'',
+        only_main   TYPE string VALUE ''only_main'',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        go_back            TYPE string VALUE ''go-back'',
+        export             TYPE string VALUE ''export'',
+        choose_object_type TYPE string VALUE ''choose-object-type'',
+      END OF c_event.
+ 
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+ 
+    METHODS export_object
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_EX_OBJECT IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+ 
+    CREATE OBJECT mo_form_data.
+    mo_form_data->set(
+      iv_key = c_id-only_main
+      iv_val = abap_true ).
+ 
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_ex_object.
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Export Objects to Files''
+      ii_child_component = lo_component ).
+  ENDMETHOD.
+ 
+ 
+  METHOD export_object.
+    DATA lv_object_type TYPE trobjtype.
+    DATA lt_names TYPE STANDARD TABLE OF sobj_name WITH DEFAULT KEY.
+    DATA lv_name LIKE LINE OF lt_names.
+    DATA lv_list TYPE string.
+    DATA lv_only_main TYPE abap_bool.
+ 
+    lv_object_type = mo_form_data->get( c_id-object_type ).
+    lv_list = mo_form_data->get( c_id-object_name ).
+    lv_only_main = mo_form_data->get( c_id-only_main ).
+ 
+    REPLACE ALL OCCURRENCES OF |\\r| IN lv_list WITH ''''.
+    SPLIT lv_list AT |\\n| INTO TABLE lt_names.
+ 
+    LOOP AT lt_names INTO lv_name.
+      IF lv_name IS INITIAL.
+        CONTINUE.
+      ENDIF.
+      zcl_abapgit_zip=>export_object(
+        iv_main_language_only = lv_only_main
+        iv_object_type        = lv_object_type
+        iv_object_name        = lv_name ).
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+    ro_form = zcl_abapgit_html_form=>create( iv_form_id = ''export-object-to-files'' ).
+ 
+    ro_form->text(
+      iv_label       = ''Object Type''
+      iv_name        = c_id-object_type
+      iv_required    = abap_true
+      iv_upper_case  = abap_true
+      iv_side_action = c_event-choose_object_type ).
+ 
+    ro_form->textarea(
+      iv_label       = ''Object Names''
+      iv_name        = c_id-object_name
+      iv_required    = abap_true
+      iv_placeholder = ''One object name per line''
+      iv_upper_case  = abap_true ).
+ 
+    ro_form->checkbox(
+      iv_label = ''Only Main Language''
+      iv_name  = c_id-only_main ).
+ 
+    ro_form->command(
+      iv_label       = ''Export''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-export
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = c_event-go_back ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-go_back.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-export.
+ 
+        export_object( ).
+        MESSAGE ''Object successfully exported'' TYPE ''S''.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-choose_object_type.
+ 
+        mo_form_data->set(
+          iv_key = c_id-object_type
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( ''TADIR-OBJECT'' ) ).
+ 
+        IF mo_form_data->get( c_id-object_type ) IS NOT INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="form-container">'' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( ''</div>'' ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_EX_PCKAGE          ', 'CLASS zcl_abapgit_gui_page_ex_pckage DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS:
+      BEGIN OF c_id,
+        package        TYPE string VALUE ''package'',
+        folder_logic   TYPE string VALUE ''folder_logic'',
+        main_lang_only TYPE string VALUE ''main_lang_only'',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        go_back        TYPE string VALUE ''go-back'',
+        export_package TYPE string VALUE ''export-package'',
+        choose_package TYPE string VALUE ''choose-object-type'',
+      END OF c_event.
+ 
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+ 
+    METHODS export_package
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_EX_PCKAGE IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_ex_pckage.
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Export Package to ZIP''
+      ii_child_component = lo_component ).
+  ENDMETHOD.
+ 
+ 
+  METHOD export_package.
+    DATA lv_package TYPE devclass.
+    DATA lv_folder_logic TYPE string.
+    DATA lv_main_lang_only TYPE abap_bool.
+ 
+    lv_package        = mo_form_data->get( c_id-package ).
+    lv_folder_logic   = mo_form_data->get( c_id-folder_logic ).
+    lv_main_lang_only = mo_form_data->get( c_id-main_lang_only ).
+ 
+    zcl_abapgit_zip=>export_package(
+        iv_package        = lv_package
+        iv_folder_logic   = lv_folder_logic
+        iv_main_lang_only = lv_main_lang_only ).
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+    ro_form = zcl_abapgit_html_form=>create( iv_form_id = ''export-package-to-files'' ).
+ 
+    ro_form->text(
+      iv_name          = c_id-package
+      iv_label         = ''Package''
+      iv_required      = abap_true
+      iv_upper_case    = abap_true
+      iv_side_action   = c_event-choose_package
+    )->radio(
+      iv_name          = c_id-folder_logic
+      iv_label         = ''Folder Logic''
+      iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_hint          = ''Define how package folders are named in repository''
+    )->option(
+      iv_label         = ''Prefix''
+      iv_value         = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+    )->option(
+      iv_label         = ''Full''
+      iv_value         = zif_abapgit_dot_abapgit=>c_folder_logic-full
+    )->option(
+      iv_label         = ''Mixed''
+      iv_value         = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+    )->checkbox(
+      iv_name          = c_id-main_lang_only
+      iv_label         = ''Serialize Main Language Only''
+      iv_hint          = ''Ignore translations, serialize just main language''
+    )->command(
+      iv_label         = ''Export Package to ZIP''
+      iv_action        = c_event-export_package
+      iv_cmd_type      = zif_abapgit_html_form=>c_cmd_type-input_main
+    )->command(
+      iv_label         = ''Back''
+      iv_action        = c_event-go_back ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-go_back.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-export_package.
+ 
+        mo_validation_log = mo_form_util->validate( mo_form_data ).
+        IF mo_validation_log->is_empty( ) = abap_false.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          export_package( ).
+          MESSAGE ''Package successfully exported'' TYPE ''S''.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+        ENDIF.
+ 
+      WHEN c_event-choose_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( ''TDEVC-DEVCLASS'' ) ).
+ 
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_MERGE              ', 'CLASS zcl_abapgit_gui_page_merge DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        io_repo   TYPE REF TO zcl_abapgit_repo_online
+        iv_source TYPE string
+        iv_target TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event
+        REDEFINITION.
+  PROTECTED SECTION.
+    METHODS render_content REDEFINITION.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online .
+    DATA mi_merge TYPE REF TO zif_abapgit_merge .
+    CONSTANTS:
+      BEGIN OF c_actions,
+        merge         TYPE string VALUE ''merge'' ##NO_TEXT,
+        res_conflicts TYPE string VALUE ''res_conflicts'' ##NO_TEXT,
+      END OF c_actions .
+ 
+    METHODS show_file
+      IMPORTING
+        !it_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+        !ii_html     TYPE REF TO zif_abapgit_html
+        !is_file     TYPE zif_abapgit_git_definitions=>ty_expanded
+        !is_result   TYPE zif_abapgit_git_definitions=>ty_expanded .
+    METHODS build_menu
+      IMPORTING
+        VALUE(iv_with_conflict) TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ro_menu)          TYPE REF TO zcl_abapgit_html_toolbar .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_merge IMPLEMENTATION.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add( iv_txt = ''Merge''
+                  iv_act = c_actions-merge
+                  iv_cur = abap_false ).
+ 
+    IF iv_with_conflict = abap_true.
+      ro_menu->add( iv_txt = ''Resolve Conflicts''
+                    iv_act = c_actions-res_conflicts ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    mo_repo = io_repo.
+ 
+    io_repo->select_branch( |{ zif_abapgit_git_definitions=>c_git_branch-heads_prefix }{ iv_target }| ).
+ 
+    CREATE OBJECT mi_merge TYPE zcl_abapgit_merge
+      EXPORTING
+        io_repo          = io_repo
+        iv_source_branch = iv_source.
+    mi_merge->run( ).
+ 
+    ms_control-page_title = ''Merge''.
+    ms_control-page_menu  = build_menu( mi_merge->has_conflicts( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    DATA: ls_merge  TYPE zif_abapgit_merge=>ty_merge,
+          lt_files  LIKE ls_merge-stree,
+          ls_result LIKE LINE OF ls_merge-result.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF lt_files.
+ 
+    ls_merge = mi_merge->get_result( ).
+ 
+    "If now exists no conflicts anymore, conflicts button should disappear
+    ms_control-page_menu = build_menu( mi_merge->has_conflicts( ) ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div id="toc">'' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+      io_repo         = mo_repo
+      iv_show_package = abap_false
+      iv_show_branch  = abap_false ) ).
+ 
+    ri_html->add( ''<table>'' ).
+    ri_html->add( ''<tr>'' ).
+    ri_html->add( ''<td>Source</td>'' ).
+    ri_html->add( ''<td>'' ).
+    ri_html->add( ls_merge-source-name ).
+    ri_html->add( ''</td></tr>'' ).
+    ri_html->add( ''<tr>'' ).
+    ri_html->add( ''<td>Target</td>'' ).
+    ri_html->add( ''<td>'' ).
+    ri_html->add( ls_merge-target-name ).
+    ri_html->add( ''</td></tr>'' ).
+    ri_html->add( ''<tr>'' ).
+    ri_html->add( ''<td>Ancestor</td>'' ).
+    ri_html->add( ''<td>'' ).
+    ri_html->add( ls_merge-common-commit ).
+    ri_html->add( ''</td></tr>'' ).
+    ri_html->add( ''</table>'' ).
+ 
+    ri_html->add( ''<br>'' ).
+ 
+    APPEND LINES OF ls_merge-stree TO lt_files.
+    APPEND LINES OF ls_merge-ttree TO lt_files.
+    APPEND LINES OF ls_merge-ctree TO lt_files.
+    SORT lt_files BY path DESCENDING name ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path name.
+ 
+    ri_html->add( ''<table>'' ).
+    ri_html->add( ''<tr>'' ).
+    ri_html->add( ''<td><u>Source</u></td>'' ).
+    ri_html->add( ''<td></td>'' ).
+    ri_html->add( ''<td><u>Target</u></td>'' ).
+    ri_html->add( ''<td></td>'' ).
+    ri_html->add( ''<td><u>Ancestor</u></td>'' ).
+    ri_html->add( ''<td></td>'' ).
+    ri_html->add( ''<td><u>Result</u></td>'' ).
+    ri_html->add( ''<td></td>'' ).
+    ri_html->add( ''</tr>'' ).
+    LOOP AT lt_files ASSIGNING <ls_file>.
+      CLEAR ls_result.
+      READ TABLE ls_merge-result INTO ls_result
+        WITH KEY path = <ls_file>-path name = <ls_file>-name.
+ 
+      ri_html->add( ''<tr>'' ).
+      show_file( it_expanded = ls_merge-stree
+                 ii_html     = ri_html
+                 is_file     = <ls_file>
+                 is_result   = ls_result ).
+      show_file( it_expanded = ls_merge-ttree
+                 ii_html     = ri_html
+                 is_file     = <ls_file>
+                 is_result   = ls_result ).
+      show_file( it_expanded = ls_merge-ctree
+                 ii_html     = ri_html
+                 is_file     = <ls_file>
+                 is_result   = ls_result ).
+      show_file( it_expanded = ls_merge-result
+                 ii_html     = ri_html
+                 is_file     = <ls_file>
+                 is_result   = ls_result ).
+      ri_html->add( ''</tr>'' ).
+    ENDLOOP.
+    ri_html->add( ''</table>'' ).
+    ri_html->add( ''<br>'' ).
+    ri_html->add( ''<b>'' ).
+    ri_html->add( ls_merge-conflict ).
+    ri_html->add( ''</b>'' ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD show_file.
+ 
+    FIELD-SYMBOLS: <ls_show> LIKE LINE OF it_expanded.
+ 
+ 
+    READ TABLE it_expanded ASSIGNING <ls_show>
+        WITH KEY
+        path = is_file-path
+        name = is_file-name.
+    IF sy-subrc = 0.
+      IF <ls_show>-sha1 = is_result-sha1.
+        ii_html->add( |<td>{ <ls_show>-path }{ <ls_show>-name }</td><td><b>{ <ls_show>-sha1(7) }</b></td>| ).
+      ELSE.
+        ii_html->add( |<td>{ <ls_show>-path }{ <ls_show>-name }</td><td>{ <ls_show>-sha1(7) }</td>| ).
+      ENDIF.
+    ELSE.
+      ii_html->add( ''<td></td><td></td>'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-merge.
+        IF mi_merge->has_conflicts( ) = abap_true.
+          zcx_abapgit_exception=>raise( ''conflicts exists'' ).
+        ENDIF.
+ 
+        IF mi_merge->get_result( )-stage->count( ) = 0.
+          zcx_abapgit_exception=>raise( ''nothing to merge'' ).
+        ENDIF.
+ 
+        IF mo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL.
+ 
+          CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_code_insp
+            EXPORTING
+              io_repo  = mo_repo
+              io_stage = mi_merge->get_result( )-stage.
+ 
+        ELSE.
+ 
+          rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+            io_repo  = mo_repo
+            io_stage = mi_merge->get_result( )-stage ).
+ 
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_actions-res_conflicts.
+ 
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_merge_res
+          EXPORTING
+            io_repo       = mo_repo
+            io_merge_page = me
+            io_merge      = mi_merge.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN OTHERS.
+        rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_MERGE_RES          ', 'CLASS zcl_abapgit_gui_page_merge_res DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        io_repo       TYPE REF TO zcl_abapgit_repo_online
+        io_merge_page TYPE REF TO zcl_abapgit_gui_page_merge
+        io_merge      TYPE REF TO zif_abapgit_merge
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event
+        REDEFINITION .
+  PROTECTED SECTION.
+    METHODS render_content REDEFINITION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_file_diff,
+        path       TYPE string,
+        filename   TYPE string,
+        lstate     TYPE char1,
+        rstate     TYPE char1,
+        fstate     TYPE char1, " FILE state - Abstraction for shorter ifs
+        o_diff     TYPE REF TO zcl_abapgit_diff,
+        changed_by TYPE syuname,
+        type       TYPE string,
+      END OF ty_file_diff .
+ 
+    CONSTANTS:
+      BEGIN OF c_actions,
+        toggle_mode  TYPE string VALUE ''toggle_mode'' ##NO_TEXT,
+        apply_merge  TYPE string VALUE ''apply_merge'' ##NO_TEXT,
+        apply_source TYPE string VALUE ''apply_source'' ##NO_TEXT,
+        apply_target TYPE string VALUE ''apply_target'' ##NO_TEXT,
+        cancel       TYPE string VALUE ''cancel'' ##NO_TEXT,
+      END OF c_actions .
+    CONSTANTS:
+      BEGIN OF c_merge_mode,
+        selection TYPE string VALUE ''selection'' ##NO_TEXT,
+        merge     TYPE string VALUE ''merge'' ##NO_TEXT,
+      END OF c_merge_mode .
+    DATA mo_merge TYPE REF TO zif_abapgit_merge .
+    DATA mo_merge_page TYPE REF TO zcl_abapgit_gui_page_merge .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online .
+    DATA ms_diff_file TYPE ty_file_diff .
+    DATA mv_current_conflict_index TYPE sy-tabix .
+    DATA mv_merge_mode TYPE string .
+    DATA mt_conflicts TYPE zif_abapgit_merge=>ty_merge_conflict_tt .
+ 
+    METHODS apply_merged_content
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS is_binary
+      IMPORTING
+        !iv_d1        TYPE xstring
+        !iv_d2        TYPE xstring
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS render_beacon
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_diff
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_diff_head
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_lines
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_line_split
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_table_head
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS resolve_diff
+      RAISING
+        zcx_abapgit_exception .
+    METHODS toggle_merge_mode .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_merge_res IMPLEMENTATION.
+ 
+ 
+  METHOD apply_merged_content.
+ 
+    DATA:
+      lv_merge_content    TYPE string,
+      lv_new_file_content TYPE xstring.
+ 
+    FIELD-SYMBOLS:
+      <ls_conflict> TYPE zif_abapgit_merge=>ty_merge_conflict.
+ 
+    lv_merge_content = ii_event->form_data( )->get( ''MERGE_CONTENT'' ).
+ 
+    REPLACE ALL OCCURRENCES
+      OF cl_abap_char_utilities=>cr_lf IN lv_merge_content WITH cl_abap_char_utilities=>newline.
+ 
+    lv_new_file_content = zcl_abapgit_convert=>string_to_xstring_utf8( lv_merge_content ).
+ 
+    READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+    <ls_conflict>-result_sha1 = zcl_abapgit_hash=>sha1_blob( lv_new_file_content ).
+    <ls_conflict>-result_data = lv_new_file_content.
+    mo_merge->resolve_conflict( <ls_conflict> ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu.
+    ro_menu->add( iv_txt = ''Toggle merge mode''
+                  iv_act = c_actions-toggle_mode ).
+    ro_menu->add( iv_txt = ''Cancel''
+                  iv_act = c_actions-cancel ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    mo_repo = io_repo.
+    ms_control-page_title = ''Resolve Conflicts''.
+    ms_control-page_menu  = build_menu( ).
+ 
+    mo_merge_page = io_merge_page.
+    mo_merge = io_merge.
+    mv_merge_mode = c_merge_mode-selection.
+    mv_current_conflict_index = 1.
+    mt_conflicts = io_merge->get_conflicts( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_binary.
+ 
+    FIELD-SYMBOLS <lv_data> LIKE iv_d1.
+ 
+ 
+    IF iv_d1 IS NOT INITIAL. " One of them might be new and so empty
+      ASSIGN iv_d1 TO <lv_data>.
+    ELSE.
+      ASSIGN iv_d2 TO <lv_data>.
+    ENDIF.
+ 
+    rv_yes = zcl_abapgit_utils=>is_binary( <lv_data> ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_beacon.
+ 
+    DATA: lv_beacon  TYPE string,
+          lt_beacons TYPE zif_abapgit_definitions=>ty_string_tt.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF is_diff_line-beacon > 0.
+      lt_beacons = is_diff-o_diff->get_beacons( ).
+      READ TABLE lt_beacons INTO lv_beacon INDEX is_diff_line-beacon.
+    ELSE.
+      lv_beacon = ''---''.
+    ENDIF.
+ 
+ 
+    ri_html->add( ''<thead class="nav_line">'' ).
+    ri_html->add( ''<tr>'' ).
+ 
+    ri_html->add( ''<th class="num"></th>'' ).
+    ri_html->add( |<th colspan="3">@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
+ 
+    ri_html->add( ''</tr>'' ).
+    ri_html->add( ''</thead>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    resolve_diff( ).
+    IF ms_diff_file IS INITIAL.
+      zcx_abapgit_exception=>raise( ''no conflict found'' ).
+    ENDIF.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( |<div id="diff-list" data-repo-key="{ mo_repo->get_key( ) }">| ).
+    ri_html->add( render_diff( ms_diff_file ) ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff.
+ 
+    DATA: lv_target_content TYPE string.
+    FIELD-SYMBOLS: <ls_conflict> TYPE zif_abapgit_merge=>ty_merge_conflict.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<div class="diff" data-type="{ is_diff-type
+      }" data-changed-by="{ is_diff-changed_by
+      }" data-file="{ is_diff-path && is_diff-filename }">| ).
+    ri_html->add( render_diff_head( is_diff ) ).
+ 
+    " Content
+    IF is_diff-type <> ''binary''.
+ 
+      IF mv_merge_mode = c_merge_mode-selection.
+        ri_html->add( ''<div class="diff_content">'' ).
+        ri_html->add( ''<table class="diff_tab syntax-hl">'' ).
+        ri_html->add( render_table_head( ) ).
+        ri_html->add( render_lines( is_diff ) ).
+        ri_html->add( ''</table>'' ).
+        ri_html->add( ''</div>'' ).
+      ELSE.
+ 
+        "Table for Div-Table and textarea
+        ri_html->add( ''<div class="diff_content">'' ).
+        ri_html->add( ''<table class="w100">'' ).
+        ri_html->add( ''<thead class="header">'' ).
+        ri_html->add( ''<tr>'' ).
+        ri_html->add( ''<th>Code</th>'' ).
+        ri_html->add( ''<th>Merge - '' ).
+        ri_html->add_a( iv_act = ''submitFormById(''''merge_form'''');''
+                        iv_txt = ''Apply''
+                        iv_typ = zif_abapgit_html=>c_action_type-onclick
+                        iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+        ri_html->add( ''</th> '' ).
+        ri_html->add( ''</tr>'' ).
+        ri_html->add( ''</thead>'' ).
+        ri_html->add( ''<td>'' ).
+ 
+        "Diff-Table of source and target file
+        ri_html->add( ''<table class="diff_tab syntax-hl">'' ).
+        ri_html->add( render_table_head( ) ).
+        ri_html->add( render_lines( is_diff ) ).
+        ri_html->add( ''</table>'' ).
+ 
+        READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+        IF sy-subrc = 0.
+          lv_target_content = zcl_abapgit_convert=>xstring_to_string_utf8( <ls_conflict>-target_data ).
+          lv_target_content = escape( val = lv_target_content
+                                      format = cl_abap_format=>e_html_text ).
+        ENDIF.
+ 
+        ri_html->add( ''</td>'' ).
+        ri_html->add( ''<td>'' ).
+        ri_html->add( ''<div class="form-container">'' ).
+        ri_html->add( |<form id="merge_form" class="aligned-form w100" accept-charset="UTF-8"| ).
+        ri_html->add( |method="post" action="sapevent:apply_merge">| ).
+        ri_html->add( |<textarea id="merge_content" name="merge_content" class="w100" | ).
+        ri_html->add( |rows="{ lines( is_diff-o_diff->get( ) ) }">{ lv_target_content }</textarea>| ).
+        ri_html->add( ''<input type="submit" class="hidden-submit">'' ).
+        ri_html->add( ''</form>'' ).
+        ri_html->add( ''</div>'' ).
+        ri_html->add( ''</td>'' ).
+        ri_html->add( ''</table>'' ).
+        ri_html->add( ''</div>'' ).
+      ENDIF.
+    ELSE.
+      ri_html->add( ''<div class="diff_content paddings center grey">'' ).
+      ri_html->add( ''The content seems to be binary.'' ).
+      ri_html->add( ''Cannot display as diff.'' ).
+      ri_html->add( ''</div>'' ).
+    ENDIF.
+ 
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff_head.
+ 
+    DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="diff_head">'' ).
+ 
+    IF is_diff-type <> ''binary'' AND is_diff-o_diff IS NOT INITIAL.
+      ls_stats = is_diff-o_diff->stats( ).
+      ri_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
+      ri_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
+      ri_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
+    ENDIF.
+ 
+    ri_html->add( |<span class="diff_name">{ is_diff-filename }</span>| ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_lines.
+ 
+    DATA: lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter,
+          lt_diffs       TYPE zif_abapgit_definitions=>ty_diffs_tt,
+          lv_insert_nav  TYPE abap_bool.
+ 
+    FIELD-SYMBOLS <ls_diff>  LIKE LINE OF lt_diffs.
+ 
+    lo_highlighter = zcl_abapgit_syntax_factory=>create( is_diff-filename ).
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lt_diffs = is_diff-o_diff->get( ).
+ 
+    LOOP AT lt_diffs ASSIGNING <ls_diff>.
+      IF <ls_diff>-short = abap_false.
+        lv_insert_nav = abap_true.
+        CONTINUE.
+      ENDIF.
+ 
+      IF lv_insert_nav = abap_true. " Insert separator line with navigation
+        ri_html->add( render_beacon( is_diff_line = <ls_diff>
+                                     is_diff = is_diff ) ).
+        lv_insert_nav = abap_false.
+      ENDIF.
+ 
+      IF lo_highlighter IS BOUND.
+        <ls_diff>-new = lo_highlighter->process_line( <ls_diff>-new ).
+        <ls_diff>-old = lo_highlighter->process_line( <ls_diff>-old ).
+      ELSE.
+        <ls_diff>-new = escape( val = <ls_diff>-new
+                                format = cl_abap_format=>e_html_attr ).
+        <ls_diff>-old = escape( val = <ls_diff>-old
+                                format = cl_abap_format=>e_html_attr ).
+      ENDIF.
+ 
+      CONDENSE <ls_diff>-new_num. "get rid of leading spaces
+      CONDENSE <ls_diff>-old_num.
+ 
+      ri_html->add( render_line_split( <ls_diff> ) ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_split.
+ 
+    DATA: lv_new  TYPE string,
+          lv_old  TYPE string,
+          lv_mark TYPE string,
+          lv_bg   TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " New line
+    lv_mark = \` \`.
+    IF is_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+      lv_bg = '' diff_upd''.
+      lv_mark = \`~\`.
+    ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-insert.
+      lv_bg = '' diff_ins''.
+      lv_mark = \`+\`.
+    ENDIF.
+    lv_new = |<td class="num" line-num="{ is_diff_line-new_num }"></td>|
+          && |<td class="code{ lv_bg }">{ lv_mark }{ is_diff_line-new }</td>|.
+ 
+    " Old line
+    CLEAR lv_bg.
+    lv_mark = \` \`.
+    IF is_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+      lv_bg = '' diff_upd''.
+      lv_mark = \`~\`.
+    ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-delete.
+      lv_bg = '' diff_del''.
+      lv_mark = \`-\`.
+    ENDIF.
+    lv_old = |<td class="num" line-num="{ is_diff_line-old_num }"></td>|
+          && |<td class="code{ lv_bg }">{ lv_mark }{ is_diff_line-old }</td>|.
+ 
+    " render line, inverse sides if remote is newer
+    ri_html->add( ''<tr>'' ).
+    ri_html->add( lv_old ). " Target
+    ri_html->add( lv_new ). " Source
+    ri_html->add( ''</tr>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<thead class="header">'' ).
+    ri_html->add( ''<tr>'' ).
+    ri_html->add( ''<th class="num"></th>'' ).
+ 
+    IF mv_merge_mode = c_merge_mode-selection.
+      ri_html->add( ''<form id="target_form" method="post" action="sapevent:apply_target">'' ).
+      ri_html->add( ''<th>Target - '' && mo_repo->get_selected_branch( ) && '' - '' ).
+      ri_html->add_a( iv_act = ''submitFormById(''''target_form'''');''
+                      iv_txt = ''Apply''
+                      iv_typ = zif_abapgit_html=>c_action_type-onclick
+                      iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ri_html->add( ''</th> '' ).
+      ri_html->add( ''</form>'' ).
+      ri_html->add( ''<th class="num"></th>'' ).
+      ri_html->add( ''<form id="source_form" method="post" action="sapevent:apply_source">'' ).
+      ri_html->add( ''<th>Source  - '' && mo_merge->get_source_branch( ) && '' - '' ).
+      ri_html->add_a( iv_act = ''submitFormById(''''source_form'''');''
+                      iv_txt = ''Apply''
+                      iv_typ = zif_abapgit_html=>c_action_type-onclick
+                      iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ri_html->add( ''</th> '' ).
+      ri_html->add( ''</form>'' ).
+    ELSE.
+      ri_html->add( ''<th>Target - '' && mo_repo->get_selected_branch( ) && ''</th> '' ).
+      ri_html->add( ''<th class="num"></th>'' ).
+      ri_html->add( ''<th>Source - '' && mo_merge->get_source_branch( ) && ''</th> '' ).
+    ENDIF.
+ 
+    ri_html->add( ''</tr>'' ).
+    ri_html->add( ''</thead>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve_diff.
+ 
+    DATA: lv_offs TYPE i.
+    FIELD-SYMBOLS: <ls_conflict> TYPE zif_abapgit_merge=>ty_merge_conflict.
+ 
+    CLEAR ms_diff_file.
+ 
+    READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    ms_diff_file-path     = <ls_conflict>-path.
+    ms_diff_file-filename = <ls_conflict>-filename.
+    ms_diff_file-type = reverse( <ls_conflict>-filename ).
+ 
+    FIND FIRST OCCURRENCE OF ''.'' IN ms_diff_file-type MATCH OFFSET lv_offs.
+    ms_diff_file-type = reverse( substring( val = ms_diff_file-type
+                                            len = lv_offs ) ).
+    IF ms_diff_file-type <> ''xml'' AND ms_diff_file-type <> ''abap''.
+      ms_diff_file-type = ''other''.
+    ENDIF.
+ 
+    IF ms_diff_file-type = ''other''
+    AND is_binary( iv_d1 = <ls_conflict>-source_data
+                   iv_d2 = <ls_conflict>-target_data ) = abap_true.
+      ms_diff_file-type = ''binary''.
+    ENDIF.
+ 
+    IF ms_diff_file-type <> ''binary''.
+      CREATE OBJECT ms_diff_file-o_diff
+        EXPORTING
+          iv_new = <ls_conflict>-source_data
+          iv_old = <ls_conflict>-target_data.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD toggle_merge_mode.
+ 
+    IF mv_merge_mode = c_merge_mode-selection.
+      mv_merge_mode = c_merge_mode-merge.
+    ELSE.
+      mv_merge_mode = c_merge_mode-selection.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    FIELD-SYMBOLS: <ls_conflict> TYPE zif_abapgit_merge=>ty_merge_conflict.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-apply_merge
+        OR c_actions-apply_source
+        OR c_actions-apply_target
+        OR c_actions-cancel.
+ 
+        CASE ii_event->mv_action.
+          WHEN c_actions-apply_merge.
+            apply_merged_content( ii_event ).
+ 
+          WHEN c_actions-apply_source.
+            READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+            <ls_conflict>-result_sha1 = <ls_conflict>-source_sha1.
+            <ls_conflict>-result_data = <ls_conflict>-source_data.
+            mo_merge->resolve_conflict( <ls_conflict> ).
+ 
+          WHEN c_actions-apply_target.
+            READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+            <ls_conflict>-result_sha1 = <ls_conflict>-target_sha1.
+            <ls_conflict>-result_data = <ls_conflict>-target_data.
+            mo_merge->resolve_conflict( <ls_conflict> ).
+ 
+        ENDCASE.
+ 
+        mv_current_conflict_index = mv_current_conflict_index + 1.
+        IF mv_current_conflict_index > lines( mt_conflicts ).
+          CLEAR mv_current_conflict_index.
+        ENDIF.
+ 
+        IF mv_current_conflict_index IS NOT INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-page = mo_merge_page.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+        ENDIF.
+ 
+      WHEN c_actions-toggle_mode.
+        toggle_merge_mode( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_MERGE_SEL          ', 'CLASS zcl_abapgit_gui_page_merge_sel DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_repo       TYPE REF TO zif_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !ii_repo TYPE REF TO zif_abapgit_repo
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        branches TYPE string VALUE ''branches'',
+        source   TYPE string VALUE ''source'',
+        target   TYPE string VALUE ''target'',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        merge TYPE string VALUE ''merge'',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online.
+    DATA mt_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt.
+ 
+    METHODS read_branches
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_merge_sel IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_form_data.
+    mo_repo ?= ii_repo.
+ 
+    read_branches( ).
+ 
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_merge_sel.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        ii_repo = ii_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Merge Branches''
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    FIELD-SYMBOLS <ls_branch> LIKE LINE OF mt_branches.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = ''merge-branches-form''
+                iv_help_page = ''https://docs.abapgit.org/'' ). " todo, add docs
+ 
+    ro_form->start_group(
+      iv_name  = c_id-branches
+      iv_label = ''Branch Selection''
+      iv_hint  = ''Select the branches that should be merged''
+    )->radio(
+      iv_name          = c_id-source
+      iv_label         = ''Source Branch''
+      iv_default_value = substring(
+                           val = mo_repo->get_selected_branch( )
+                           off = 11 )
+      iv_condense      = abap_true ).
+ 
+    LOOP AT mt_branches ASSIGNING <ls_branch>.
+      ro_form->option(
+        iv_label = <ls_branch>-display_name
+        iv_value = <ls_branch>-display_name ).
+    ENDLOOP.
+ 
+    ro_form->radio(
+      iv_name     = c_id-target
+      iv_label    = ''Target Branch''
+      iv_condense = abap_true ).
+ 
+    LOOP AT mt_branches ASSIGNING <ls_branch>.
+      ro_form->option(
+        iv_label = <ls_branch>-display_name
+        iv_value = <ls_branch>-display_name ).
+    ENDLOOP.
+ 
+    ro_form->command(
+      iv_label    = ''Preview Merge''
+      iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action   = c_event-merge
+    )->command(
+      iv_label    = ''Back''
+      iv_action   = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_branches.
+ 
+    DATA lo_branches TYPE REF TO zcl_abapgit_git_branch_list.
+ 
+    lo_branches = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) ).
+    mt_branches = lo_branches->get_branches_only( ).
+ 
+    DELETE mt_branches WHERE name = zif_abapgit_git_definitions=>c_head_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA lo_merge TYPE REF TO zcl_abapgit_gui_page_merge.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-merge.
+        IF mo_form_data->get( c_id-source ) = mo_form_data->get( c_id-target ).
+          zcx_abapgit_exception=>raise( ''Select different branches'' ).
+        ENDIF.
+ 
+        CREATE OBJECT lo_merge
+          EXPORTING
+            io_repo   = mo_repo
+            iv_source = mo_form_data->get( c_id-source )
+            iv_target = mo_form_data->get( c_id-target ).
+ 
+        rs_handled-page = lo_merge.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( \`<div class="repo">\` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_false ) ).
+ 
+    ri_html->add( mo_form->render( io_values = mo_form_data ) ).
+ 
+    ri_html->add( \`</div>\` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_PATCH              ', 'CLASS zcl_abapgit_gui_page_patch DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page_diff
+  CREATE PUBLIC .
+ 
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor
+        IMPORTING
+          iv_key        TYPE zif_abapgit_persistence=>ty_repo-key
+          is_file       TYPE zif_abapgit_git_definitions=>ty_file OPTIONAL
+          is_object     TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+          it_files      TYPE zif_abapgit_definitions=>ty_stage_tt OPTIONAL
+        RAISING
+          zcx_abapgit_exception,
+ 
+      zif_abapgit_gui_event_handler~on_event REDEFINITION,
+      zif_abapgit_gui_hotkeys~get_hotkey_actions REDEFINITION.
+ 
+    CLASS-METHODS:
+      get_patch_data
+        IMPORTING
+          iv_patch      TYPE string
+        EXPORTING
+          ev_filename   TYPE string
+          ev_line_index TYPE string
+        RAISING
+          zcx_abapgit_exception.
+  PROTECTED SECTION.
+    METHODS:
+      render_content REDEFINITION,
+      add_menu_begin REDEFINITION,
+      add_menu_end REDEFINITION,
+      render_table_head_non_unified REDEFINITION,
+      render_beacon_begin_of_row REDEFINITION,
+      render_diff_head_after_state REDEFINITION,
+      insert_nav REDEFINITION,
+      render_line_split_row REDEFINITION,
+      refresh REDEFINITION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES ty_patch_action TYPE string .
+ 
+    CONSTANTS:
+      BEGIN OF c_patch_actions,
+        stage TYPE string VALUE ''patch_stage'',
+      END OF c_patch_actions .
+    CONSTANTS:
+      BEGIN OF c_patch_action,
+        add    TYPE ty_patch_action VALUE ''add'',
+        remove TYPE ty_patch_action VALUE ''remove'',
+      END OF c_patch_action .
+    DATA mo_stage TYPE REF TO zcl_abapgit_stage .
+    DATA mv_section_count TYPE i .
+    DATA mv_pushed TYPE abap_bool .
+    DATA mo_repo_online TYPE REF TO zcl_abapgit_repo_online .
+ 
+    METHODS render_patch
+      IMPORTING
+        !ii_html      TYPE REF TO zif_abapgit_html
+        !iv_filename  TYPE string
+        !is_diff_line TYPE zif_abapgit_definitions=>ty_diff
+        !iv_index     TYPE sy-tabix
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_patch_head
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_diff TYPE ty_file_diff .
+    METHODS start_staging
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS apply_patch_from_form_fields
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS restore_patch_flags
+      IMPORTING
+        !it_diff_files_old TYPE ty_file_diffs
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_to_stage
+      RAISING
+        zcx_abapgit_exception .
+    METHODS apply_patch_all
+      IMPORTING
+        !iv_patch      TYPE string
+        !iv_patch_flag TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS are_all_lines_patched
+      IMPORTING
+        !it_diff                        TYPE zif_abapgit_definitions=>ty_diffs_tt
+      RETURNING
+        VALUE(rv_are_all_lines_patched) TYPE abap_bool .
+    METHODS apply_patch_for
+      IMPORTING
+        !iv_filename   TYPE string
+        !iv_line_index TYPE string
+        !iv_patch_flag TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_diff_object
+      IMPORTING
+        !iv_filename   TYPE string
+      RETURNING
+        VALUE(ro_diff) TYPE REF TO zcl_abapgit_diff
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_diff_line
+      IMPORTING
+        !io_diff       TYPE REF TO zcl_abapgit_diff
+        !iv_line_index TYPE string
+      RETURNING
+        VALUE(rs_diff) TYPE zif_abapgit_definitions=>ty_diff
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_patch_line_possible
+      IMPORTING
+        !is_diff_line                    TYPE zif_abapgit_definitions=>ty_diff
+      RETURNING
+        VALUE(rv_is_patch_line_possible) TYPE abap_bool .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION.
+ 
+ 
+  METHOD add_menu_begin.
+ 
+    io_menu->add(
+        iv_txt   = c_action_texts-refresh_local
+        iv_typ   = zif_abapgit_html=>c_action_type-dummy
+        iv_act   = c_actions-refresh_local
+        iv_id    = c_actions-refresh_local
+        iv_title = c_action_titles-refresh_local ).
+ 
+    io_menu->add(
+        iv_txt   = c_action_texts-refresh_all
+        iv_typ   = zif_abapgit_html=>c_action_type-dummy
+        iv_act   = c_actions-refresh_all
+        iv_id    = c_actions-refresh_all
+        iv_title = c_action_titles-refresh_all ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_menu_end.
+ 
+    io_menu->add( iv_txt = ''Stage''
+                  iv_act = c_patch_actions-stage
+                  iv_id  = ''stage''
+                  iv_typ = zif_abapgit_html=>c_action_type-dummy ).
+ 
+    add_view_sub_menu( io_menu ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_to_stage.
+ 
+    DATA: lt_diff              TYPE zif_abapgit_definitions=>ty_diffs_tt,
+          lv_something_patched TYPE abap_bool,
+          ls_status            TYPE zif_abapgit_definitions=>ty_result,
+          lv_patch             TYPE xstring,
+          lo_git_add_patch     TYPE REF TO zcl_abapgit_git_add_patch.
+ 
+    FIELD-SYMBOLS: <ls_diff_file> TYPE ty_file_diff.
+ 
+    LOOP AT mt_diff_files ASSIGNING <ls_diff_file>.
+ 
+      IF <ls_diff_file>-o_diff IS NOT BOUND.
+        " When we deal with binary files we don''t have a diff object.
+        " There''s nothing to do because they cannot be patched
+        CONTINUE.
+      ENDIF.
+ 
+      lt_diff = <ls_diff_file>-o_diff->get( ).
+ 
+      READ TABLE lt_diff TRANSPORTING NO FIELDS
+                         WITH KEY patch_flag = abap_true.
+      CHECK sy-subrc = 0.
+ 
+      lv_something_patched = abap_true.
+ 
+      CREATE OBJECT lo_git_add_patch
+        EXPORTING
+          it_diff = <ls_diff_file>-o_diff->get( ).
+ 
+      lv_patch = lo_git_add_patch->get_patch_binary( ).
+ 
+      IF <ls_diff_file>-lstate = ''D'' AND are_all_lines_patched( lt_diff ) = abap_true.
+ 
+        ls_status-lstate = zif_abapgit_definitions=>c_state-deleted.
+        mo_stage->rm(
+          iv_path     = <ls_diff_file>-path
+          is_status   = ls_status
+          iv_filename = <ls_diff_file>-filename ).
+ 
+      ELSE.
+ 
+        IF <ls_diff_file>-lstate = ''A'' AND are_all_lines_patched( lt_diff ) = abap_true.
+          ls_status-lstate = zif_abapgit_definitions=>c_state-added.
+        ELSE.
+          ls_status-lstate = zif_abapgit_definitions=>c_state-modified.
+        ENDIF.
+ 
+        mo_stage->add(
+          iv_path     = <ls_diff_file>-path
+          iv_filename = <ls_diff_file>-filename
+          is_status   = ls_status
+          iv_data     = lv_patch ).
+ 
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF lv_something_patched = abap_false.
+      zcx_abapgit_exception=>raise( |Nothing added| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_patch_all.
+ 
+    DATA: lv_filename   TYPE string,
+          lt_patch      TYPE string_table,
+          lv_line_index TYPE string.
+ 
+    FIELD-SYMBOLS: <lv_patch>     TYPE LINE OF string_table.
+ 
+    SPLIT iv_patch AT '','' INTO TABLE lt_patch.
+ 
+    LOOP AT lt_patch ASSIGNING <lv_patch>.
+ 
+      get_patch_data(
+        EXPORTING
+          iv_patch      = <lv_patch>
+        IMPORTING
+          ev_filename   = lv_filename
+          ev_line_index = lv_line_index ).
+ 
+      apply_patch_for( iv_filename   = lv_filename
+                       iv_line_index = lv_line_index
+                       iv_patch_flag = iv_patch_flag ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_patch_for.
+ 
+    DATA: lo_diff      TYPE REF TO zcl_abapgit_diff,
+          ls_diff_line TYPE zif_abapgit_definitions=>ty_diff,
+          lv_line      TYPE i.
+ 
+    lo_diff = get_diff_object( iv_filename ).
+ 
+    ls_diff_line = get_diff_line( io_diff       = lo_diff
+                                  iv_line_index = iv_line_index ).
+ 
+    CASE ls_diff_line-result.
+      WHEN zif_abapgit_definitions=>c_diff-update
+        OR zif_abapgit_definitions=>c_diff-insert.
+ 
+        lv_line = ls_diff_line-new_num.
+ 
+        lo_diff->set_patch_new( iv_line_new   = lv_line
+                                iv_patch_flag = iv_patch_flag ).
+ 
+      WHEN zif_abapgit_definitions=>c_diff-delete.
+ 
+        lv_line = ls_diff_line-old_num.
+ 
+        lo_diff->set_patch_old( iv_line_old   = lv_line
+                                iv_patch_flag = iv_patch_flag ).
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_patch_from_form_fields.
+ 
+    DATA:
+      lv_add    TYPE string,
+      lv_remove TYPE string.
+ 
+    lv_add    = ii_event->form_data( )->get( c_patch_action-add ).
+    lv_remove = ii_event->form_data( )->get( c_patch_action-remove ).
+ 
+    apply_patch_all( iv_patch      = lv_add
+                     iv_patch_flag = abap_true ).
+ 
+    apply_patch_all( iv_patch      = lv_remove
+                     iv_patch_flag = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD are_all_lines_patched.
+ 
+    DATA: lv_patch_count TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    LOOP AT it_diff ASSIGNING <ls_diff>
+                    WHERE patch_flag = abap_true.
+      lv_patch_count = lv_patch_count + 1.
+    ENDLOOP.
+ 
+    rv_are_all_lines_patched = boolc( lv_patch_count = lines( it_diff ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor(
+      iv_key    = iv_key
+      is_file   = is_file
+      is_object = is_object
+      it_files  = it_files ).
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      zcx_abapgit_exception=>raise( |Patching is only possible for online repositories.| ).
+    ENDIF.
+ 
+    mo_repo_online ?= mo_repo.
+ 
+    " While patching we always want to be in split mode
+    CLEAR: mv_unified.
+    set_layout( ).
+    CREATE OBJECT mo_stage.
+ 
+    ms_control-page_title = ''Patch''.
+    ms_control-page_menu = build_menu( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_diff_line.
+ 
+    DATA: lt_diff       TYPE zif_abapgit_definitions=>ty_diffs_tt,
+          lv_line_index TYPE sy-tabix.
+ 
+ 
+    lv_line_index = iv_line_index.
+    lt_diff = io_diff->get( ).
+ 
+    READ TABLE lt_diff INTO rs_diff
+                       INDEX lv_line_index.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Invalid line index { lv_line_index }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_diff_object.
+ 
+    FIELD-SYMBOLS: <ls_diff_file> LIKE LINE OF mt_diff_files.
+ 
+    LOOP AT mt_diff_files ASSIGNING <ls_diff_file>.
+      IF get_normalized_fname_with_path( <ls_diff_file> ) = iv_filename.
+        ro_diff = <ls_diff_file>-o_diff.
+        EXIT.
+      ENDIF.
+    ENDLOOP.
+ 
+    IF ro_diff IS NOT BOUND.
+      zcx_abapgit_exception=>raise( |Invalid filename { iv_filename }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_patch_data.
+ 
+    DATA: lv_section TYPE string.
+ 
+    CLEAR: ev_filename, ev_line_index.
+ 
+    FIND FIRST OCCURRENCE OF REGEX \`patch_line\` && \`_(.*)_(\\d)+_(\\d+)\`
+         IN iv_patch
+         SUBMATCHES ev_filename lv_section ev_line_index.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Invalid patch| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_nav.
+ 
+    " add beacon at beginning of file
+    rv_insert_nav = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_patch_line_possible.
+ 
+    IF is_diff_line-result = zif_abapgit_definitions=>c_diff-update
+    OR is_diff_line-result = zif_abapgit_definitions=>c_diff-insert
+    OR is_diff_line-result = zif_abapgit_definitions=>c_diff-delete.
+      rv_is_patch_line_possible = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh.
+ 
+    DATA: lt_diff_files_old TYPE ty_file_diffs.
+ 
+    lt_diff_files_old = mt_diff_files.
+ 
+    super->refresh( iv_action ).
+ 
+    restore_patch_flags( lt_diff_files_old ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_beacon_begin_of_row.
+ 
+    mv_section_count = mv_section_count + 1.
+ 
+    ii_html->add( |<th class="patch">| ).
+    ii_html->add_checkbox( iv_id = |patch_section_{ get_normalized_fname_with_path( is_diff ) }_{ mv_section_count }| ).
+    ii_html->add( ''</th>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CLEAR: mv_section_count.
+ 
+    IF mv_pushed = abap_true.
+      refresh_full( ).
+      calculate_diff( ).
+      CLEAR: mv_pushed.
+    ENDIF.
+ 
+    register_handlers( ).
+ 
+    ri_html = super->render_content( ).
+ 
+    register_deferred_script( render_scripts( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff_head_after_state.
+ 
+    DATA: lv_act_id TYPE string.
+ 
+    lv_act_id = |{ c_actions-refresh_local_object }_{ is_diff-obj_type }_{ is_diff-obj_name }|.
+ 
+    IF is_diff-obj_type IS NOT INITIAL AND is_diff-obj_name IS NOT INITIAL.
+      " Dummy link is handled in JS (based on ID)
+      ii_html->add( ''<span class="repo_name">'' ).
+      ii_html->add_a( iv_txt   = ii_html->icon( iv_name  = ''redo-alt-solid''
+                                                iv_class = ''pad-sides''
+                                                iv_hint  = ''Local refresh of this object'' )
+                      iv_id    = lv_act_id
+                      iv_act   = lv_act_id
+                      iv_typ   = zif_abapgit_html=>c_action_type-dummy
+                      iv_class = |url| ).
+      ii_html->add( ''</span>'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_split_row.
+ 
+    render_patch( ii_html      = ii_html
+                  iv_filename  = iv_filename
+                  is_diff_line = is_diff_line
+                  iv_index     = iv_index ).
+ 
+    super->render_line_split_row(
+        ii_html      = ii_html
+        iv_filename  = iv_filename
+        is_diff_line = is_diff_line
+        iv_index     = iv_index
+        iv_fstate    = iv_fstate
+        iv_new       = iv_new
+        iv_old       = iv_old ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_patch.
+ 
+    CONSTANTS:
+      BEGIN OF lc_css_class,
+        patch TYPE string VALUE \`patch\`,
+      END OF lc_css_class.
+ 
+    DATA:
+      lv_id                TYPE string,
+      lv_patched           TYPE abap_bool,
+      lv_is_patch_possible TYPE abap_bool.
+ 
+    lv_patched = get_diff_object( iv_filename )->is_line_patched( iv_index ).
+ 
+    lv_is_patch_possible = is_patch_line_possible( is_diff_line ).
+ 
+    IF lv_is_patch_possible = abap_true.
+ 
+      lv_id = |{ iv_filename }_{ mv_section_count }_{ iv_index }|.
+ 
+      ii_html->add( |<td class="{ lc_css_class-patch }">| ).
+      ii_html->add_checkbox(
+          iv_id      = |patch_line_{ lv_id }|
+          iv_checked = lv_patched ).
+      ii_html->add( |</td>| ).
+ 
+    ELSE.
+ 
+      ii_html->add( |<td class="{ lc_css_class-patch }">| ).
+      ii_html->add( |</td>| ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_patch_head.
+ 
+    ii_html->add( |<th class="patch">| ).
+    ii_html->add_checkbox( |patch_file_{ get_normalized_fname_with_path( is_diff ) }| ).
+    ii_html->add( ''</th>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( ''preparePatch();'' ).
+    ri_html->add( ''registerStagePatch();'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head_non_unified.
+ 
+    render_patch_head( ii_html = ii_html
+                       is_diff = is_diff ).
+ 
+    super->render_table_head_non_unified(
+        ii_html = ii_html
+        is_diff = is_diff ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD restore_patch_flags.
+ 
+    DATA:
+      lt_diff_old TYPE zif_abapgit_definitions=>ty_diffs_tt.
+ 
+    FIELD-SYMBOLS:
+      <ls_diff_file>     TYPE ty_file_diff,
+      <ls_diff_file_old> TYPE ty_file_diff,
+      <ls_diff_old>      TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    LOOP AT mt_diff_files ASSIGNING <ls_diff_file>.
+ 
+      READ TABLE it_diff_files_old ASSIGNING <ls_diff_file_old>
+                                   WITH KEY secondary
+                                   COMPONENTS path     = <ls_diff_file>-path
+                                              filename = <ls_diff_file>-filename.
+      IF sy-subrc <> 0.
+        CONTINUE. " e.g. new objects
+      ENDIF.
+ 
+      IF <ls_diff_file_old>-o_diff IS NOT BOUND.
+        CONTINUE. " e.g. binary files
+      ENDIF.
+ 
+      lt_diff_old = <ls_diff_file_old>-o_diff->get( ).
+ 
+      LOOP AT lt_diff_old ASSIGNING <ls_diff_old>
+                          WHERE patch_flag = abap_true.
+ 
+        <ls_diff_file>-o_diff->set_patch_by_old_diff(
+            is_diff_old   = <ls_diff_old>
+            iv_patch_flag = abap_true ).
+ 
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD start_staging.
+ 
+    apply_patch_from_form_fields( ii_event ).
+    add_to_stage( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_patch_actions-stage.
+ 
+        start_staging( ii_event ).
+ 
+        rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+          io_repo  = mo_repo_online
+          io_stage = mo_stage ).
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN OTHERS.
+ 
+        IF is_refresh( ii_event->mv_action ) = abap_true.
+ 
+          apply_patch_from_form_fields( ii_event ).
+          refresh( ii_event->mv_action ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+        ELSE.
+ 
+          rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+ 
+        ENDIF.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = ''Patch''.
+ 
+    ls_hotkey_action-description = |Stage Changes|.
+    ls_hotkey_action-action      = |stagePatch|.
+    ls_hotkey_action-hotkey      = |s|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Refresh Local|.
+    ls_hotkey_action-action      = |refreshLocal|.
+    ls_hotkey_action-hotkey      = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Refresh All|.
+    ls_hotkey_action-action      = |refreshAll|.
+    ls_hotkey_action-hotkey      = |a|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_REPO_OVER          ', 'CLASS zcl_abapgit_gui_page_repo_over DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES:
+      zif_abapgit_gui_event_handler,
+      zif_abapgit_gui_hotkeys,
+      zif_abapgit_gui_menu_provider,
+      zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_only_favorites TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ri_page)     TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_only_favorites TYPE abap_bool OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_overview,
+        favorite            TYPE string,
+        "! True for offline, false for online repo
+        type                TYPE string,
+        key                 TYPE zif_abapgit_persistence=>ty_value,
+        name                TYPE string,
+        labels              TYPE string_table,
+        url                 TYPE string,
+        package             TYPE devclass,
+        branch              TYPE string,
+        created_by          TYPE syuname,
+        created_at          TYPE string,
+        created_at_raw      TYPE timestampl,
+        deserialized_by     TYPE syuname,
+        deserialized_at     TYPE string,
+        deserialized_at_raw TYPE timestampl,
+        write_protected     TYPE abap_bool,
+      END OF ty_overview,
+      ty_overviews TYPE STANDARD TABLE OF ty_overview
+                   WITH NON-UNIQUE DEFAULT KEY.
+    CONSTANTS:
+      BEGIN OF c_action,
+        select       TYPE string VALUE ''select'',
+        apply_filter TYPE string VALUE ''apply_filter'',
+        label_filter TYPE string VALUE ''label_filter'',
+      END OF c_action,
+      c_label_filter_prefix TYPE string VALUE \`label:\`,
+      c_raw_field_suffix    TYPE string VALUE \`_RAW\` ##NO_TEXT.
+ 
+    DATA: mt_all_labels   TYPE string_table,
+          mo_label_colors TYPE REF TO zcl_abapgit_string_map.
+    DATA ms_list_settings TYPE zif_abapgit_definitions=>ty_list_settings.
+ 
+    METHODS set_order_by
+      IMPORTING
+        !iv_order_by TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_order_direction
+      IMPORTING
+        !iv_order_descending TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_filter
+      IMPORTING
+        it_postdata TYPE zif_abapgit_html_viewer=>ty_post_data
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS:
+      apply_filter
+        CHANGING
+          ct_overview TYPE ty_overviews,
+ 
+      map_repo_list_to_overview
+        IMPORTING
+          it_repo_obj_list   TYPE zif_abapgit_repo_srv=>ty_repo_list
+        RETURNING
+          VALUE(rt_overview) TYPE ty_overviews
+        RAISING
+          zcx_abapgit_exception,
+ 
+      render_repo_list
+        IMPORTING
+          ii_html     TYPE REF TO zif_abapgit_html
+          it_overview TYPE ty_overviews
+        RAISING
+          zcx_abapgit_exception,
+ 
+      render_table_header
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html,
+ 
+      render_table_footer
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html,
+ 
+      render_table_body
+        IMPORTING
+          ii_html      TYPE REF TO zif_abapgit_html
+          it_repo_list TYPE ty_overviews
+        RAISING
+          zcx_abapgit_exception,
+ 
+      render_table_item
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html
+          is_repo TYPE ty_overview
+        RAISING
+          zcx_abapgit_exception,
+ 
+      render_header_bar
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html,
+ 
+      render_header_label_list
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html,
+ 
+      apply_order_by
+        CHANGING ct_overview TYPE ty_overviews.
+ 
+    METHODS prepare_overviews
+      RETURNING
+        VALUE(rt_overviews) TYPE ty_overviews
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_action_toolbar
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html.
+ 
+    METHODS render_filter_bar
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html.
+ 
+    METHODS build_table_scheme
+      RETURNING
+        VALUE(rt_tab_scheme) TYPE zif_abapgit_definitions=>ty_col_spec_tt.
+ 
+    METHODS collect_all_labels
+      IMPORTING
+        it_overview    TYPE ty_overviews
+      RETURNING
+        VALUE(rt_list) TYPE string_table.
+ 
+    METHODS render_filter_help_hint
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION.
+ 
+ 
+  METHOD apply_filter.
+ 
+    DATA lv_pfxl TYPE i.
+    DATA lv_idx TYPE i.
+    DATA lv_filter_label TYPE string.
+    FIELD-SYMBOLS <ls_r> LIKE LINE OF ct_overview.
+ 
+    IF ms_list_settings-filter IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_pfxl = strlen( c_label_filter_prefix ).
+ 
+    IF strlen( ms_list_settings-filter ) > lv_pfxl AND ms_list_settings-filter+0(lv_pfxl) = c_label_filter_prefix.
+      lv_filter_label = ms_list_settings-filter+lv_pfxl.
+      IF lv_filter_label = ''all''.
+        DELETE ct_overview WHERE labels IS INITIAL.
+      ELSEIF lv_filter_label = ''none''.
+        DELETE ct_overview WHERE labels IS NOT INITIAL.
+      ELSE.
+        LOOP AT ct_overview ASSIGNING <ls_r>.
+          lv_idx = sy-tabix.
+          READ TABLE <ls_r>-labels TRANSPORTING NO FIELDS WITH KEY table_line = lv_filter_label.
+          IF sy-subrc <> 0.
+            DELETE ct_overview INDEX lv_idx.
+          ENDIF.
+        ENDLOOP.
+      ENDIF.
+    ELSE. " Regular filter
+      DELETE ct_overview WHERE
+            key             NS ms_list_settings-filter
+        AND name            NS ms_list_settings-filter
+        AND url             NS ms_list_settings-filter
+        AND package         NS ms_list_settings-filter
+        AND branch          NS ms_list_settings-filter
+        AND created_by      NS ms_list_settings-filter
+        AND created_at      NS ms_list_settings-filter
+        AND deserialized_by NS ms_list_settings-filter
+        AND deserialized_at NS ms_list_settings-filter.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_order_by.
+ 
+    DATA:
+      lt_sort TYPE abap_sortorder_tab,
+      ls_sort LIKE LINE OF lt_sort.
+ 
+    ls_sort-name = ''FAVORITE''.
+    ls_sort-descending = abap_true.
+    ls_sort-astext = abap_true.
+    INSERT ls_sort INTO TABLE lt_sort.
+ 
+    IF ms_list_settings-order_by IS NOT INITIAL.
+ 
+      CLEAR ls_sort.
+ 
+      IF ms_list_settings-order_by = ''CREATED_AT'' OR ms_list_settings-order_by = ''DESERIALIZED_AT''.
+        ls_sort-name = ms_list_settings-order_by && c_raw_field_suffix.
+      ELSE.
+        ls_sort-name   = ms_list_settings-order_by.
+        ls_sort-astext = abap_true.
+      ENDIF.
+ 
+      ls_sort-descending = ms_list_settings-order_descending.
+      INSERT ls_sort INTO TABLE lt_sort.
+ 
+    ENDIF.
+ 
+    SORT ct_overview BY (lt_sort).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_table_scheme.
+ 
+    DATA lo_tab_scheme TYPE REF TO lcl_table_scheme.
+ 
+    CREATE OBJECT lo_tab_scheme.
+ 
+    lo_tab_scheme->add_column(
+      iv_tech_name      = ''FAVORITE''
+      iv_css_class      = ''wmin''
+      iv_allow_order_by = abap_false
+    )->add_column(
+      iv_tech_name      = ''TYPE''
+      iv_css_class      = ''wmin''
+      iv_allow_order_by = abap_false
+    )->add_column(
+      iv_tech_name      = ''NAME''
+      iv_display_name   = ''Name''
+      iv_allow_order_by = abap_true ).
+ 
+    IF mt_all_labels IS NOT INITIAL.
+      lo_tab_scheme->add_column(
+        iv_tech_name      = ''LABELS''
+        iv_display_name   = ''Labels''
+        iv_allow_order_by = abap_false ).
+    ENDIF.
+ 
+    lo_tab_scheme->add_column(
+      iv_tech_name      = ''PACKAGE''
+      iv_display_name   = ''Package''
+      iv_css_class      = ''package''
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = ''URL''
+      iv_display_name   = ''Remote''
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = ''BRANCH''
+      iv_display_name   = ''Branch/Tag''
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = ''DESERIALIZED_BY''
+      iv_display_name   = ''Deserialized by''
+      iv_css_class      = ''ro-detail''
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = ''DESERIALIZED_AT''
+      iv_display_name   = ''Deserialized at''
+      iv_css_class      = ''ro-detail''
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = ''CREATED_BY''
+      iv_display_name   = ''Created by''
+      iv_css_class      = ''ro-detail''
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = ''CREATED_AT''
+      iv_display_name   = ''Created at''
+      iv_css_class      = ''ro-detail''
+      iv_add_tz         = abap_true
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = ''KEY''
+      iv_display_name   = ''Key''
+      iv_css_class      = ''ro-detail''
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = ''GO''
+      iv_css_class      = ''ro-go wmin''
+      iv_allow_order_by = abap_false ).
+ 
+    rt_tab_scheme = lo_tab_scheme->mt_col_spec.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD collect_all_labels.
+ 
+    FIELD-SYMBOLS <ls_r> LIKE LINE OF it_overview.
+ 
+    LOOP AT it_overview ASSIGNING <ls_r>.
+      APPEND LINES OF <ls_r>-labels TO rt_list.
+    ENDLOOP.
+ 
+    SORT rt_list.
+    DELETE rt_list WHERE table_line IS INITIAL.
+    DELETE ADJACENT DUPLICATES FROM rt_list.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    ms_list_settings = zcl_abapgit_persistence_user=>get_instance( )->get_list_settings( ).
+ 
+    " Overwrite setting
+    IF iv_only_favorites = abap_true.
+      ms_list_settings-only_favorites = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_repo_over.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        iv_only_favorites = iv_only_favorites.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title         = ''Repository List''
+      ii_page_menu_provider = lo_component
+      ii_child_component    = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_repo_list_to_overview.
+ 
+    DATA ls_overview      LIKE LINE OF rt_overview.
+    FIELD-SYMBOLS <ls_repo> LIKE LINE OF it_repo_obj_list.
+ 
+    LOOP AT it_repo_obj_list ASSIGNING <ls_repo>.
+ 
+      CLEAR ls_overview.
+ 
+      ls_overview-favorite        = zcl_abapgit_persistence_user=>get_instance(
+        )->is_favorite_repo( <ls_repo>->ms_data-key ).
+      ls_overview-type            = <ls_repo>->ms_data-offline.
+      ls_overview-key             = <ls_repo>->ms_data-key.
+      ls_overview-name            = <ls_repo>->get_name( ).
+      ls_overview-labels          = zcl_abapgit_repo_labels=>split( <ls_repo>->ms_data-local_settings-labels ).
+      ls_overview-url             = <ls_repo>->ms_data-url.
+      ls_overview-package         = <ls_repo>->ms_data-package.
+      ls_overview-branch          = <ls_repo>->ms_data-branch_name.
+      ls_overview-created_by      = <ls_repo>->ms_data-created_by.
+      ls_overview-write_protected = <ls_repo>->ms_data-local_settings-write_protected.
+      ls_overview-created_at_raw  = <ls_repo>->ms_data-created_at.
+ 
+      IF <ls_repo>->ms_data-created_at IS NOT INITIAL.
+        ls_overview-created_at = zcl_abapgit_gui_chunk_lib=>render_timestamp( <ls_repo>->ms_data-created_at ).
+      ENDIF.
+ 
+      ls_overview-deserialized_by     = <ls_repo>->ms_data-deserialized_by.
+      ls_overview-deserialized_at_raw = <ls_repo>->ms_data-deserialized_at.
+ 
+      IF <ls_repo>->ms_data-deserialized_at IS NOT INITIAL.
+        ls_overview-deserialized_at = zcl_abapgit_gui_chunk_lib=>render_timestamp( <ls_repo>->ms_data-deserialized_at ).
+      ENDIF.
+ 
+      INSERT ls_overview INTO TABLE rt_overview.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD prepare_overviews.
+ 
+    DATA lt_repo_obj_list TYPE zif_abapgit_repo_srv=>ty_repo_list.
+ 
+    IF ms_list_settings-only_favorites = abap_true.
+      lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list_favorites( ).
+    ELSE.
+      lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+    ENDIF.
+ 
+    rt_overviews = map_repo_list_to_overview( lt_repo_obj_list ).
+ 
+    " Hmmm, side effect, not ideal, but we need label list before filter applied
+    mt_all_labels = collect_all_labels( rt_overviews ).
+ 
+    apply_order_by( CHANGING ct_overview = rt_overviews ).
+    apply_filter( CHANGING ct_overview = rt_overviews ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_action_toolbar.
+ 
+    CONSTANTS:
+      lc_dummy_key     TYPE string VALUE \`?key=#\`,
+      lc_offline_class TYPE string VALUE \`action_offline_repo\`,
+      lc_online_class  TYPE string VALUE \`action_online_repo\`,
+      lc_action_class  TYPE string VALUE \`action_link\`.
+ 
+    DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
+    DATA lo_toolbar_more_sub TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CREATE OBJECT lo_toolbar EXPORTING iv_id = ''toolbar-ovp''.
+ 
+    lo_toolbar->add(
+      iv_txt      = |Pull|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-git_pull }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Stage|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-go_stage }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Patch|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-go_patch }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Diff|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-go_repo_diff }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Check|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Import|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-zip_import }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_offline_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Export|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-zip_export }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_offline_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Settings|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-repo_settings }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    CREATE OBJECT lo_toolbar_more_sub EXPORTING iv_id = ''toolbar-ovp-more_sub''.
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt      = |Stage by Transport|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-go_stage_transport }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt      = |Export by Transport|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-zip_export_transport }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_offline_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt = ''Danger''
+      iv_typ = zif_abapgit_html=>c_action_type-separator ).
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt   = |Remove|
+      iv_title = |Remove abapGit''s records of the repository (the system''s |
+              && |development objects will remain unaffected)|
+      iv_act   = |{ zif_abapgit_definitions=>c_action-repo_remove }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt      = |Uninstall|
+      iv_title    = |Delete all development objects belonging to this package |
+                 && |(and subpackages) from the system|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-repo_purge }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |More|
+      io_sub      = lo_toolbar_more_sub
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    ri_html = lo_toolbar->render( iv_right = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_filter_bar.
+ 
+    DATA lv_icon_class TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<form class="inline" method="post" action="sapevent:{ c_action-apply_filter }">| ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_text_input(
+      iv_name      = |filter|
+      iv_label     = |Filter: { render_filter_help_hint( ) }|
+      iv_value     = ms_list_settings-filter ) ).
+    ri_html->add( |<input type="submit" class="hidden-submit">| ).
+    ri_html->add( |</form>| ).
+ 
+    IF ms_list_settings-only_favorites = abap_true.
+      lv_icon_class = \`blue\`.
+    ELSE.
+      lv_icon_class = \`grey\`.
+    ENDIF.
+ 
+    ri_html->add( ''<span class="toolbar-light pad-sides">'' ).
+    ri_html->add( ri_html->a(
+      iv_txt   = |<i id="icon-filter-favorite" class="icon icon-check { lv_icon_class }"></i> Only Favorites|
+      iv_class = ''command''
+      iv_act   = |{ zif_abapgit_definitions=>c_action-toggle_favorites }| ) ).
+    ri_html->add( ri_html->a(
+      iv_txt   = ''<i id="icon-filter-detail" class="icon icon-check"></i> Detail''
+      iv_act   = |gHelper.toggleRepoListDetail()|
+      iv_class = ''command''
+      iv_typ   = zif_abapgit_html=>c_action_type-onclick ) ).
+    ri_html->add( ''</span>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_filter_help_hint.
+ 
+    DATA lt_fragments TYPE string_table.
+ 
+    APPEND \`Filter is applied to all text fields in the below table.\` TO lt_fragments.
+    APPEND \` Search works for any portion of the text (so can be a mid part as well).\` TO lt_fragments.
+    APPEND \`<br>Starting query from <code>label:xxx</code> will filter appropriate label.\` TO lt_fragments.
+    APPEND \`Two "special" label queries are available:\` TO lt_fragments.
+    APPEND \` <code>all</code> (to select all repos that has at least one label)\` TO lt_fragments.
+    APPEND \` and <code>none</code> (to select unlabeled repos).\` TO lt_fragments.
+ 
+    rv_html = zcl_abapgit_gui_chunk_lib=>render_help_hint( concat_lines_of( table = lt_fragments ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_header_bar.
+ 
+    ii_html->add( |<div class="repo-overview-toolbar">| ).
+    ii_html->add( render_filter_bar( ) ).
+    ii_html->add( render_action_toolbar( ) ).
+    ii_html->add( |</div>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_header_label_list.
+ 
+    IF mt_all_labels IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    ii_html->add( |<div class="repo-label-catalog">| ).
+    ii_html->add( ''<label>Filter by label:</label>'' ).
+    ii_html->add( zcl_abapgit_gui_chunk_lib=>render_label_list(
+      it_labels           = mt_all_labels
+      io_label_colors     = mo_label_colors
+      iv_clickable_action = c_action-label_filter ) ).
+    ii_html->add( |</div>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_list.
+ 
+    ii_html->add( |<table>| ).
+ 
+    render_table_header( ii_html ).
+    render_table_body(
+      ii_html      = ii_html
+      it_repo_list = it_overview ).
+    render_table_footer( ii_html ).
+ 
+    ii_html->add( |</table>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( ''var gHelper = new RepoOverViewHelper({ focusFilterKey: "f" });'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_body.
+ 
+    FIELD-SYMBOLS <ls_repo> LIKE LINE OF it_repo_list.
+ 
+    ii_html->add( ''<tbody>'' ).
+ 
+    LOOP AT it_repo_list ASSIGNING <ls_repo>.
+      render_table_item(
+        ii_html = ii_html
+        is_repo = <ls_repo> ).
+    ENDLOOP.
+ 
+    ii_html->add( |</tbody>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_footer.
+ 
+    IF ms_list_settings-only_favorites = abap_true.
+      ii_html->add( \`<tfoot>\` ).
+      ii_html->add( \`<tr><td colspan="100%">\` ).
+      ii_html->add( |(Only favorites are shown. {
+        ii_html->a(
+          iv_txt   = |Show All|
+          iv_act   = |{ zif_abapgit_definitions=>c_action-toggle_favorites }?force_state={ abap_false }| )
+      })| ).
+      ii_html->add( \`</td></tr>\` ).
+      ii_html->add( \`</tfoot>\` ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_header.
+ 
+    ii_html->add( |<thead>| ).
+    ii_html->add( |<tr>| ).
+ 
+    ii_html->add( zcl_abapgit_gui_chunk_lib=>render_order_by_header_cells(
+      it_col_spec         = build_table_scheme( )
+      iv_order_by         = ms_list_settings-order_by
+      iv_order_descending = ms_list_settings-order_descending ) ).
+ 
+    ii_html->add( ''</tr>'' ).
+    ii_html->add( ''</thead>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_item.
+ 
+    DATA:
+      lv_is_online_repo TYPE abap_bool,
+      lv_repo_type_icon TYPE string,
+      lv_favorite_icon  TYPE string,
+      lv_fav_tr_class   TYPE string,
+      lv_lock           TYPE string.
+ 
+    lv_is_online_repo = boolc( is_repo-type = abap_false ).
+ 
+    " Start of row
+    IF is_repo-favorite = abap_true.
+      lv_fav_tr_class = '' class="favorite"''.
+    ELSE.
+      lv_fav_tr_class = ''''.
+    ENDIF.
+ 
+    ii_html->add( |<tr{ lv_fav_tr_class } data-key="{ is_repo-key }" data-offline="{ is_repo-type }">| ).
+ 
+    " Favorite
+    lv_favorite_icon = ii_html->icon(
+      iv_name  = ''star/grey'' " blue is added in css, based on TR style
+      iv_class = ''pad-sides''
+      iv_hint  = ''Click to toggle favorite'' ).
+ 
+    ii_html->td(
+      iv_class   = ''wmin''
+      iv_content = ii_html->a(
+        iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?key={ is_repo-key }|
+        iv_txt = lv_favorite_icon ) ).
+ 
+    " Online/Offline
+    IF lv_is_online_repo = abap_true.
+      lv_repo_type_icon = ''cloud-upload-alt/darkgrey''.
+    ELSE.
+      lv_repo_type_icon = ''plug/darkgrey''.
+    ENDIF.
+ 
+    ii_html->td(
+      iv_class   = ''wmin''
+      iv_content = ii_html->icon( lv_repo_type_icon ) ).
+ 
+    " Repo name
+    IF is_repo-write_protected = abap_true.
+      lv_lock = ii_html->icon(
+        iv_name  = ''lock/grey70''
+        iv_class = ''m-em5-sides''
+        iv_hint  = ''Locked from pulls'' ).
+    ENDIF.
+ 
+    ii_html->td(
+      ii_html->a(
+        iv_txt = is_repo-name
+        iv_act = |{ c_action-select }?key={ is_repo-key }| ) && lv_lock ).
+ 
+    " Labels
+    IF mt_all_labels IS NOT INITIAL.
+      ii_html->td(
+        iv_content = zcl_abapgit_gui_chunk_lib=>render_label_list(
+          it_labels = is_repo-labels
+          io_label_colors = mo_label_colors )
+        iv_class   = ''labels'' ).
+    ENDIF.
+ 
+    " Package
+    ii_html->td( ii_content = zcl_abapgit_gui_chunk_lib=>render_package_name(
+      iv_package        = is_repo-package
+      iv_suppress_title = boolc( NOT ms_list_settings-only_favorites = abap_true ) ) ).
+ 
+    " Repo URL
+    IF lv_is_online_repo = abap_true.
+      ii_html->td( ii_content = zcl_abapgit_gui_chunk_lib=>render_repo_url(
+        iv_url = is_repo-url
+        iv_render_remote_edit_for_key = is_repo-key ) ).
+    ELSE.
+      ii_html->td( ).
+    ENDIF.
+ 
+    " Branch
+    IF is_repo-branch IS INITIAL.
+      ii_html->td( ).
+    ELSE.
+      ii_html->td( ii_content = zcl_abapgit_gui_chunk_lib=>render_branch_name(
+        iv_branch   = is_repo-branch
+        iv_repo_key = is_repo-key ) ).
+    ENDIF.
+ 
+    " Details: deserialized by
+    ii_html->td(
+      iv_class   = ''ro-detail''
+      ii_content = zcl_abapgit_gui_chunk_lib=>render_user_name(
+        iv_username       = is_repo-deserialized_by
+        iv_suppress_title = boolc( NOT ms_list_settings-only_favorites = abap_true ) ) ).
+ 
+    " Details: deserialized at
+    ii_html->td(
+      iv_class = ''ro-detail''
+      iv_content = is_repo-deserialized_at ).
+ 
+    " Details: created by
+    ii_html->td(
+      iv_class   = ''ro-detail''
+      ii_content = zcl_abapgit_gui_chunk_lib=>render_user_name(
+        iv_username = is_repo-created_by
+        iv_suppress_title = boolc( NOT ms_list_settings-only_favorites = abap_true ) ) ).
+ 
+    " Details: created at
+    ii_html->td(
+      iv_class = ''ro-detail''
+      iv_content = is_repo-created_at ).
+ 
+    " Details: repo key
+    ii_html->td(
+      iv_class = ''ro-detail''
+      iv_content = |{ is_repo-key }| ).
+ 
+    " Go-to action
+    ii_html->td(
+      iv_class = ''ro-go wmin''
+      iv_content = ii_html->a(
+        iv_title = ''Open''
+        iv_txt   = ''&rtrif;''
+        iv_act   = |{ c_action-select }?key={ is_repo-key }| ) ).
+ 
+    ii_html->add( \`</tr>\` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+    zcl_abapgit_persistence_user=>get_instance( )->set_list_settings( ms_list_settings ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_filter.
+ 
+    FIELD-SYMBOLS <lv_postdata> LIKE LINE OF it_postdata.
+ 
+    READ TABLE it_postdata ASSIGNING <lv_postdata> INDEX 1.
+    IF sy-subrc = 0.
+      FIND FIRST OCCURRENCE OF REGEX \`filter=(.*)\`
+        IN <lv_postdata>
+        SUBMATCHES ms_list_settings-filter.
+    ENDIF.
+ 
+    ms_list_settings-filter = condense( ms_list_settings-filter ).
+    save_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_order_by.
+    IF ms_list_settings-order_by <> iv_order_by.
+      set_order_direction( abap_false ). " Reset ordering
+    ENDIF.
+    ms_list_settings-order_by = iv_order_by.
+    save_settings( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_order_direction.
+    ms_list_settings-order_descending = iv_order_descending.
+    save_settings( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA lv_key TYPE zif_abapgit_persistence=>ty_value.
+ 
+    lv_key = ii_event->query( )->get( ''KEY'' ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_action-select.
+ 
+        zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ).
+ 
+        TRY.
+            zcl_abapgit_repo_srv=>get_instance( )->get( lv_key )->refresh( ).
+          CATCH zcx_abapgit_exception ##NO_HANDLER.
+        ENDTRY.
+ 
+        rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN zif_abapgit_definitions=>c_action-change_order_by.
+ 
+        set_order_by( ii_event->query( )->get( ''ORDERBY'' ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-toggle_favorites.
+ 
+        IF ii_event->query( )->has( ''FORCE_STATE'' ) = abap_true.
+          ms_list_settings-only_favorites = ii_event->query( )->get( ''FORCE_STATE'' ).
+        ELSE.
+          ms_list_settings-only_favorites = boolc( ms_list_settings-only_favorites = abap_false ).
+        ENDIF.
+        save_settings( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-direction.
+ 
+        set_order_direction( boolc( ii_event->query( )->get( ''DIRECTION'' ) = ''DESCENDING'' ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_action-apply_filter.
+ 
+        set_filter( ii_event->mt_postdata ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_action-label_filter.
+ 
+        IF ii_event->mv_getdata IS NOT INITIAL.
+          ms_list_settings-filter = c_label_filter_prefix && ii_event->mv_getdata.
+        ELSE.
+          CLEAR ms_list_settings-filter. " Unexpected request
+        ENDIF.
+        save_settings( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-go_patch.
+ 
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_patch
+          EXPORTING
+            iv_key = lv_key.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = ''Repo overview''.
+ 
+    ls_hotkey_action-description   = |New Online Repository|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_newonline.
+    ls_hotkey_action-hotkey = |n|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |New Offline Repository|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_newoffline.
+    ls_hotkey_action-hotkey = |o|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |abapGit Settings|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_settings.
+    ls_hotkey_action-hotkey = |x|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Stage|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_stage.
+    ls_hotkey_action-hotkey = |s|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Diff|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_repo_diff.
+    ls_hotkey_action-hotkey = |d|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Check|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_code_inspector.
+    ls_hotkey_action-hotkey = |c|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Pull|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-git_pull.
+    ls_hotkey_action-hotkey = |p|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Patch|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_patch.
+    ls_hotkey_action-hotkey = |a|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    " registered/handled in js
+    ls_hotkey_action-description = |Previous Repository|.
+    ls_hotkey_action-action = \`#\`.
+    ls_hotkey_action-hotkey = |4|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Next Repository|.
+    ls_hotkey_action-action = \`##\`.
+    ls_hotkey_action-hotkey = |6|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Open Repository|.
+    ls_hotkey_action-action = \`###\`.
+    ls_hotkey_action-hotkey = |Enter|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Focus Filter|.
+    ls_hotkey_action-action = \`####\`.
+    ls_hotkey_action-hotkey = |f|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_menu_provider~get_menu.
+ 
+    CREATE OBJECT ro_toolbar EXPORTING iv_id = ''toolbar-main''.
+ 
+    ro_toolbar->add(
+      iv_txt = zcl_abapgit_gui_buttons=>new_online( )
+      iv_act = zif_abapgit_definitions=>c_action-repo_newonline
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>new_offline( )
+      iv_act = zif_abapgit_definitions=>c_action-repo_newoffline
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>settings( )
+      iv_act = zif_abapgit_definitions=>c_action-go_settings
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>advanced( )
+      iv_title = ''Utilities''
+      io_sub = zcl_abapgit_gui_chunk_lib=>advanced_submenu( )
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>help( )
+      iv_title = ''Help''
+      io_sub = zcl_abapgit_gui_chunk_lib=>help_submenu( ) ).
+ 
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+      ro_toolbar->add(
+        iv_txt   = zcl_abapgit_gui_buttons=>experimental( )
+        iv_title = ''Experimental Features are Enabled''
+        iv_act   = zif_abapgit_definitions=>c_action-go_settings ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lt_overview TYPE ty_overviews.
+    DATA ls_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+    ls_settings = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_user_settings( ).
+    mo_label_colors = zcl_abapgit_repo_labels=>split_colors_into_map( ls_settings-label_colors ).
+ 
+    lt_overview = prepare_overviews( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    zcl_abapgit_exit=>get_instance( )->wall_message_list( ri_html ).
+ 
+    ri_html->add( |<div class="repo-overview">| ).
+    render_header_bar( ri_html ).
+    render_header_label_list( ri_html ).
+    render_repo_list(
+      ii_html     = ri_html
+      it_overview = lt_overview ).
+    ri_html->add( |</div>| ).
+ 
+    register_deferred_script( render_scripts( ) ).
+    register_deferred_script( zcl_abapgit_gui_chunk_lib=>render_repo_palette( c_action-select ) ).
+    register_handlers( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_REPO_VIEW          ', 'CLASS zcl_abapgit_gui_page_repo_view DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES:
+      zif_abapgit_gui_event_handler,
+      zif_abapgit_gui_hotkeys,
+      zif_abapgit_gui_menu_provider,
+      zif_abapgit_gui_renderable.
+ 
+    CONSTANTS:
+      BEGIN OF c_actions,
+        change_dir        TYPE string VALUE ''change_dir'' ##NO_TEXT,
+        toggle_hide_files TYPE string VALUE ''toggle_hide_files'' ##NO_TEXT,
+        toggle_folders    TYPE string VALUE ''toggle_folders'' ##NO_TEXT,
+        toggle_changes    TYPE string VALUE ''toggle_changes'' ##NO_TEXT,
+        toggle_diff_first TYPE string VALUE ''toggle_diff_first '' ##NO_TEXT,
+        display_more      TYPE string VALUE ''display_more'' ##NO_TEXT,
+        go_data           TYPE string VALUE ''go_data'',
+        go_unit           TYPE string VALUE ''go_unit'',
+      END OF c_actions .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_key        TYPE zif_abapgit_persistence=>ty_repo-key
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mo_repo_aggregated_state TYPE REF TO zcl_abapgit_item_state.
+    DATA mv_cur_dir TYPE string .
+    DATA mv_hide_files TYPE abap_bool .
+    DATA mv_max_lines TYPE i .
+    DATA mv_max_setting TYPE i .
+    DATA mv_show_folders TYPE abap_bool .
+    DATA mv_changes_only TYPE abap_bool .
+    DATA mv_order_by TYPE string .
+    DATA mv_order_descending TYPE abap_bool .
+    DATA mv_diff_first TYPE abap_bool .
+    DATA mv_key TYPE zif_abapgit_persistence=>ty_value .
+    DATA mv_are_changes_recorded_in_tr TYPE abap_bool .
+ 
+    METHODS render_head_line
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_view_dropdown
+      RETURNING
+        VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_item
+      IMPORTING
+        !is_item              TYPE zif_abapgit_definitions=>ty_repo_item
+        !iv_render_transports TYPE abap_bool
+      RETURNING
+        VALUE(ri_html)        TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_item_files
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_item_command
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_file_command
+      IMPORTING
+        !is_file       TYPE zif_abapgit_definitions=>ty_repo_file
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS get_item_class
+      IMPORTING
+        !is_item         TYPE zif_abapgit_definitions=>ty_repo_item
+        iv_is_object_row TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_html)   TYPE string .
+    METHODS render_item_transport
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_parent_dir
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_dir_jump_link
+      IMPORTING
+        !iv_path       TYPE string
+      RETURNING
+        VALUE(rv_html) TYPE string .
+    METHODS build_inactive_object_code
+      IMPORTING
+        !is_item                     TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_inactive_html_code) TYPE string .
+    METHODS build_srcsystem_code
+      IMPORTING
+        !is_item                      TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_srcsystem_html_code) TYPE string .
+    METHODS build_origlang_code
+      IMPORTING
+        !is_item                      TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_html_code) TYPE string .
+    METHODS open_in_main_language
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_order_by
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS apply_order_by
+      CHANGING
+        !ct_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt .
+    METHODS build_branch_dropdown
+      RETURNING
+        VALUE(ro_branch_dropdown) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_tag_dropdown
+      RETURNING
+        VALUE(ro_tag_dropdown) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_advanced_dropdown
+      RETURNING
+        VALUE(ro_advanced_dropdown) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_main_toolbar
+      RETURNING
+        VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_repo_lang_logon_lang
+      RETURNING
+        VALUE(rv_repo_lang_is_logon_lang) TYPE abap_bool .
+ 
+    METHODS render_item_changed_by
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS order_files
+      CHANGING
+        ct_files TYPE zif_abapgit_definitions=>ty_repo_file_tt.
+ 
+    METHODS get_crossout
+      IMPORTING
+        !iv_authorization  TYPE zif_abapgit_auth=>ty_authorization OPTIONAL
+        !iv_protected      TYPE abap_bool DEFAULT abap_false
+        !iv_strong         TYPE abap_bool DEFAULT abap_false
+          PREFERRED PARAMETER iv_authorization
+      RETURNING
+        VALUE(rv_crossout) LIKE zif_abapgit_html=>c_html_opt-crossout.
+ 
+    METHODS check_branch
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION.
+ 
+ 
+  METHOD apply_order_by.
+ 
+    DATA:
+      lt_sort                        TYPE abap_sortorder_tab,
+      ls_sort                        LIKE LINE OF lt_sort,
+      lt_non_code_and_metadata_items LIKE ct_repo_items,
+      lt_code_items                  LIKE ct_repo_items,
+      lt_diff_items                  LIKE ct_repo_items.
+ 
+    FIELD-SYMBOLS:
+      <ls_repo_item> TYPE zif_abapgit_definitions=>ty_repo_item.
+ 
+    IF mv_order_by IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " we want to preserve non-code and metadata files at the top,
+    " so we isolate them and and sort only the code artifacts
+    LOOP AT ct_repo_items ASSIGNING <ls_repo_item>.
+ 
+      IF <ls_repo_item>-obj_type IS INITIAL AND <ls_repo_item>-is_dir = abap_false.
+        INSERT <ls_repo_item> INTO TABLE lt_non_code_and_metadata_items.
+      ELSE.
+        INSERT <ls_repo_item> INTO TABLE lt_code_items.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF mv_diff_first = abap_true.
+      " fix diffs on the top, right after non-code and metadata
+      LOOP AT lt_code_items ASSIGNING <ls_repo_item>
+                            WHERE changes > 0.
+        INSERT <ls_repo_item> INTO TABLE lt_diff_items.
+      ENDLOOP.
+ 
+      DELETE lt_code_items WHERE changes > 0.
+    ENDIF.
+ 
+    CLEAR: ct_repo_items.
+ 
+    ls_sort-descending = mv_order_descending.
+    ls_sort-astext     = abap_true.
+    ls_sort-name       = mv_order_by.
+    INSERT ls_sort INTO TABLE lt_sort.
+ 
+    " Combine state fields for order of ''Status'' column
+    IF mv_order_by = ''LSTATE''.
+      ls_sort-name = ''RSTATE''.
+      INSERT ls_sort INTO TABLE lt_sort.
+    ENDIF.
+ 
+    " Use object name as secondary sort criteria
+    IF mv_order_by <> ''OBJ_NAME''.
+      ls_sort-name = ''OBJ_NAME''.
+      INSERT ls_sort INTO TABLE lt_sort.
+    ENDIF.
+ 
+    SORT lt_code_items STABLE BY (lt_sort).
+    SORT lt_diff_items STABLE BY (lt_sort).
+ 
+    INSERT LINES OF lt_non_code_and_metadata_items INTO TABLE ct_repo_items.
+    INSERT LINES OF lt_diff_items INTO TABLE ct_repo_items.
+    INSERT LINES OF lt_code_items INTO TABLE ct_repo_items.
+ 
+    " Files are listed under the object names so we always sort them by name
+    LOOP AT ct_repo_items ASSIGNING <ls_repo_item>.
+      order_files( CHANGING ct_files = <ls_repo_item>-files ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_advanced_dropdown.
+ 
+    CREATE OBJECT ro_advanced_dropdown.
+ 
+    ro_advanced_dropdown->add( iv_txt = ''Activate Objects''
+                               iv_act = |{ zif_abapgit_definitions=>c_action-repo_activate_objects }?key={ mv_key }| ).
+ 
+    IF mo_repo->is_offline( ) = abap_false. " Online ?
+      ro_advanced_dropdown->add(
+        iv_txt = ''Transport to Branch''
+        iv_act = |{ zif_abapgit_definitions=>c_action-repo_transport_to_branch }?key={ mv_key }|
+        iv_opt = get_crossout( zif_abapgit_auth=>c_authorization-transport_to_branch ) ).
+    ENDIF.
+ 
+    IF mv_are_changes_recorded_in_tr = abap_true.
+      ro_advanced_dropdown->add(
+        iv_txt = ''Add All Objects to Transport''
+        iv_act = |{ zif_abapgit_definitions=>c_action-repo_add_all_obj_to_trans_req }?key={ mv_key }| ).
+    ENDIF.
+    IF mo_repo->is_offline( ) = abap_true.
+      ro_advanced_dropdown->add( iv_txt = ''Export by Transport''
+                                 iv_act = |{ zif_abapgit_definitions=>c_action-zip_export_transport }?key={ mv_key }| ).
+    ELSE.
+      ro_advanced_dropdown->add( iv_txt = ''Stage by Transport''
+                                 iv_act = |{ zif_abapgit_definitions=>c_action-go_stage_transport }?key={ mv_key }| ).
+    ENDIF.
+ 
+    ro_advanced_dropdown->add( iv_txt = ''Quality Assurance''
+                               iv_typ = zif_abapgit_html=>c_action_type-separator ).
+ 
+    ro_advanced_dropdown->add( iv_txt = ''Syntax Check''
+                               iv_act = |{ zif_abapgit_definitions=>c_action-repo_syntax_check }?key={ mv_key }| ).
+    ro_advanced_dropdown->add( iv_txt = ''Unit Test''
+                               iv_act = |{ c_actions-go_unit }| ).
+    ro_advanced_dropdown->add( iv_txt = ''Run Code Inspector''
+                               iv_act = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }?key={ mv_key }| ).
+ 
+    ro_advanced_dropdown->add( iv_txt = ''Very Advanced''
+                               iv_typ = zif_abapgit_html=>c_action_type-separator ).
+ 
+    ro_advanced_dropdown->add( iv_txt = ''Update Local Checksums''
+                               iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh_checksums }?key={ mv_key }|
+                               iv_opt = get_crossout( zif_abapgit_auth=>c_authorization-update_local_checksum ) ).
+ 
+    ro_advanced_dropdown->add( iv_txt = ''Beta - Data''
+                               iv_act = |{ c_actions-go_data }?key={ mv_key }| ).
+ 
+    IF is_repo_lang_logon_lang( ) = abap_false AND zcl_abapgit_services_abapgit=>get_abapgit_tcode( ) IS NOT INITIAL.
+      ro_advanced_dropdown->add(
+        iv_txt = ''Open in Main Language''
+        iv_act = |{ zif_abapgit_definitions=>c_action-repo_open_in_master_lang }?key={ mv_key }| ).
+    ENDIF.
+ 
+    ro_advanced_dropdown->add( iv_txt = ''Danger''
+                               iv_typ = zif_abapgit_html=>c_action_type-separator ).
+ 
+    ro_advanced_dropdown->add( iv_txt   = ''Remove''
+                               iv_title = \`Remove abapGit''s records of the repository (the system''s \`
+                                          && \`development objects will remain unaffected)\`
+                               iv_act   = |{ zif_abapgit_definitions=>c_action-repo_remove }?key={ mv_key }| ).
+ 
+    ro_advanced_dropdown->add( iv_txt   = ''Uninstall''
+                               iv_title = \`Delete all development objects belonging to this package \`
+                                          && \`(and subpackages) from the system\`
+                               iv_act   = |{ zif_abapgit_definitions=>c_action-repo_purge }?key={ mv_key }|
+                               iv_opt   = get_crossout(
+                                            iv_authorization = zif_abapgit_auth=>c_authorization-uninstall
+                                            iv_protected     = abap_true ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_branch_dropdown.
+ 
+    CREATE OBJECT ro_branch_dropdown.
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    ro_branch_dropdown->add( iv_txt = ''Switch''
+                             iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ mv_key }| ).
+    ro_branch_dropdown->add( iv_txt = ''Create''
+                             iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_create }?key={ mv_key }| ).
+    ro_branch_dropdown->add( iv_txt = ''Delete''
+                             iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_delete }?key={ mv_key }| ).
+    ro_branch_dropdown->add( iv_txt = ''Merge''
+                             iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_merge }?key={ mv_key }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_dir_jump_link.
+ 
+    DATA lv_path   TYPE string.
+    DATA lv_encode TYPE string.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+ 
+    CREATE OBJECT li_html TYPE zcl_abapgit_html.
+ 
+    lv_path = iv_path.
+    REPLACE FIRST OCCURRENCE OF mv_cur_dir IN lv_path WITH ''''.
+    lv_encode = zcl_abapgit_html_action_utils=>dir_encode( lv_path ).
+ 
+    " remove leading and trailing / for display
+    IF lv_path <> ''/''.
+      IF lv_path(1) = ''/''.
+        lv_path = lv_path+1.
+      ENDIF.
+      IF substring( val = reverse( lv_path )
+                    len = 1 ) = ''/''.
+        lv_path = substring( val = lv_path
+                             len = strlen( lv_path ) - 1 ).
+      ENDIF.
+    ENDIF.
+ 
+    rv_html = li_html->a(
+      iv_txt = lv_path
+      iv_act = |{ c_actions-change_dir }?{ lv_encode }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_inactive_object_code.
+ 
+    IF is_item-inactive = abap_true.
+      rv_inactive_html_code = zcl_abapgit_html=>icon(
+        iv_name  = ''bolt/orange''
+        iv_hint  = ''Object or object part is inactive''
+        iv_class = ''inactive'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_main_toolbar.
+ 
+    DATA:
+      li_log TYPE REF TO zif_abapgit_log.
+ 
+    CREATE OBJECT ro_toolbar EXPORTING iv_id = ''toolbar-repo''.
+ 
+    IF mo_repo->is_offline( ) = abap_false.
+      " online repo
+ 
+      IF mo_repo_aggregated_state->is_unchanged( ) = abap_false. " Any changes
+        ro_toolbar->add( iv_txt = ''Pull''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?key={ mv_key }|
+                         iv_opt = get_crossout( iv_protected = abap_true
+                                                iv_strong    = abap_true ) ).
+        ro_toolbar->add( iv_txt = ''Stage''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+        ro_toolbar->add( iv_txt = ''Patch''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-go_patch }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+        ro_toolbar->add( iv_txt = ''Diff''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-go_repo_diff }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ENDIF.
+      li_log = mo_repo->get_log( ).
+      IF li_log IS BOUND AND li_log->count( ) > 0.
+        ro_toolbar->add( iv_txt = ''Log''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-repo_log }?key={ mv_key }| ).
+      ENDIF.
+      ro_toolbar->add( iv_txt = ''Branch''
+                       io_sub = build_branch_dropdown( ) ).
+      ro_toolbar->add( iv_txt = ''Tag''
+                       io_sub = build_tag_dropdown( ) ).
+ 
+    ELSE.
+      " offline repo
+ 
+      IF mo_repo->has_remote_source( ) = abap_true AND mo_repo_aggregated_state->is_unchanged( ) = abap_false.
+        ro_toolbar->add( iv_txt = ''Pull <sup>zip</sup>''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+        ro_toolbar->add( iv_txt = ''Diff''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-go_repo_diff }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ENDIF.
+      ro_toolbar->add( iv_txt = ''Import <sup>zip</sup>''
+                       iv_act = |{ zif_abapgit_definitions=>c_action-zip_import }?key={ mv_key }|
+                       iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      IF mo_repo->get_local_settings( )-write_protected = abap_true.
+        ro_toolbar->add( iv_txt = ''Compare <sup>rfc</sup>''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-rfc_compare }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ENDIF.
+      ro_toolbar->add( iv_txt = ''Export <sup>zip</sup>''
+                       iv_act = |{ zif_abapgit_definitions=>c_action-zip_export }?key={ mv_key }|
+                       iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      li_log = mo_repo->get_log( ).
+      IF li_log IS BOUND AND li_log->count( ) > 0.
+        ro_toolbar->add( iv_txt = ''Log''
+                         iv_act = |{ zif_abapgit_definitions=>c_action-repo_log }?key={ mv_key }| ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+    ro_toolbar->add( iv_txt = ''Advanced''
+                     io_sub = build_advanced_dropdown( ) ).
+ 
+    ro_toolbar->add( iv_txt = ''View''
+                     io_sub = build_view_dropdown( ) ).
+ 
+    ro_toolbar->add( iv_txt = ''Refresh''
+                     iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh }?key={ mv_key }|
+                     iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+ 
+    ro_toolbar->add( iv_txt   = ''Settings''
+                     iv_act   = |{ zif_abapgit_definitions=>c_action-repo_settings }?key={ mv_key }|
+                     iv_opt   = zif_abapgit_html=>c_html_opt-strong
+                     iv_title = \`Repository Settings\` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_origlang_code.
+ 
+    IF is_item-origlang IS NOT INITIAL AND is_item-origlang <> mo_repo->get_dot_abapgit( )->get_main_language( ).
+      rv_html_code = zcl_abapgit_html=>icon(
+        iv_name  = ''language-solid/grey''
+        iv_hint  = |Original language: { is_item-origlang }|
+        iv_class = ''cursor-pointer'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_srcsystem_code.
+ 
+    IF is_item-srcsystem IS NOT INITIAL AND is_item-srcsystem <> sy-sysid.
+      rv_srcsystem_html_code = zcl_abapgit_html=>icon(
+        iv_name  = ''server-solid/grey''
+        iv_hint  = |Original system: { is_item-srcsystem }|
+        iv_class = ''cursor-pointer'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_tag_dropdown.
+ 
+    CREATE OBJECT ro_tag_dropdown.
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    ro_tag_dropdown->add( iv_txt = ''Switch''
+                          iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_switch }?key={ mv_key }| ).
+    ro_tag_dropdown->add( iv_txt = ''Create''
+                          iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_create }?key={ mv_key }| ).
+    ro_tag_dropdown->add( iv_txt = ''Delete''
+                          iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_delete }?key={ mv_key }| ).
+ 
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_view_dropdown.
+ 
+    CREATE OBJECT ro_toolbar.
+ 
+    ro_toolbar->add(
+      iv_txt = ''Changes First''
+      iv_chk = mv_diff_first
+      iv_act = c_actions-toggle_diff_first ).
+ 
+    ro_toolbar->add(
+      iv_txt = ''Changes Only''
+      iv_chk = mv_changes_only
+      iv_act = c_actions-toggle_changes ).
+ 
+    ro_toolbar->add(
+      iv_txt = ''File Paths''
+      iv_chk = boolc( NOT mv_hide_files = abap_true )
+      iv_act = c_actions-toggle_hide_files ).
+ 
+    ro_toolbar->add(
+      iv_txt = ''Folders''
+      iv_chk = mv_show_folders
+      iv_act = c_actions-toggle_folders ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_branch.
+ 
+    DATA lo_repo TYPE REF TO zif_abapgit_repo_online.
+ 
+    IF mo_repo->is_offline( ) = abap_false.
+      lo_repo ?= mo_repo.
+      lo_repo->check_for_valid_branch( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lo_settings         TYPE REF TO zcl_abapgit_settings,
+          lx_error            TYPE REF TO zcx_abapgit_exception,
+          lo_persistence_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    super->constructor( ).
+ 
+    TRY.
+        lo_persistence_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+        mv_key = iv_key.
+        mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+        mv_cur_dir = ''/''. " Root
+ 
+        mv_hide_files = lo_persistence_user->get_hide_files( ).
+        mv_changes_only = lo_persistence_user->get_changes_only( ).
+        mv_order_by = lo_persistence_user->get_order_by( ).
+        mv_order_descending = lo_persistence_user->get_order_descending( ).
+        mv_diff_first = lo_persistence_user->get_diff_first( ).
+        mv_show_folders = lo_persistence_user->get_show_folders( ).
+ 
+        " Read global settings to get max # of objects to be listed
+        lo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+        mv_max_lines = lo_settings->get_max_lines( ).
+        mv_max_setting = mv_max_lines.
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+        " Reset ''last shown repo'' so next start will go to repo overview
+        " and allow troubleshooting of issue
+        zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ).
+ 
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_repo_view.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        iv_key = iv_key.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title         = ''Repository''
+      ii_page_menu_provider = lo_component
+      ii_child_component    = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_crossout.
+    IF iv_strong = abap_true.
+      rv_crossout = zif_abapgit_html=>c_html_opt-strong.
+    ENDIF.
+    IF iv_protected = abap_true AND mo_repo->get_local_settings( )-write_protected = abap_true.
+      rv_crossout = zif_abapgit_html=>c_html_opt-crossout.
+    ENDIF.
+    IF iv_authorization IS NOT INITIAL AND zcl_abapgit_auth=>is_allowed( iv_authorization ) = abap_false.
+      rv_crossout = zif_abapgit_html=>c_html_opt-crossout.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_item_class.
+ 
+    DATA lt_class TYPE TABLE OF string.
+ 
+    IF iv_is_object_row = abap_true.
+      APPEND ''object_row'' TO lt_class.
+    ELSE.
+      APPEND ''file_row'' TO lt_class.
+    ENDIF.
+ 
+    IF is_item-is_dir = abap_true.
+      APPEND ''folder'' TO lt_class.
+    ELSEIF is_item-changes > 0.
+      APPEND ''modified'' TO lt_class.
+    ELSEIF is_item-obj_name IS INITIAL.
+      APPEND ''unsupported'' TO lt_class.
+    ENDIF.
+ 
+    IF lines( lt_class ) > 0.
+      rv_html = | class="{ concat_lines_of( table = lt_class
+                                            sep = \` \` ) }"|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_repo_lang_logon_lang.
+    rv_repo_lang_is_logon_lang = boolc( mo_repo->get_dot_abapgit( )->get_main_language( ) = sy-langu ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_in_main_language.
+ 
+    DATA:
+      lv_main_language TYPE spras,
+      ls_item          TYPE zif_abapgit_definitions=>ty_item,
+      lv_tcode         TYPE tcode.
+ 
+    lv_main_language = mo_repo->get_dot_abapgit( )->get_main_language( ).
+    lv_tcode = zcl_abapgit_services_abapgit=>get_abapgit_tcode( ).
+    ASSERT lv_tcode IS NOT INITIAL.
+ 
+    IF lv_main_language = sy-langu.
+      zcx_abapgit_exception=>raise( |Repo already opened in main language| ).
+    ENDIF.
+ 
+    ls_item-obj_name = lv_tcode.
+    ls_item-obj_type = |TRAN|.
+ 
+    IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+      zcx_abapgit_exception=>raise( |Please install the abapGit repository| ).
+    ENDIF.
+ 
+    zcl_abapgit_objects_factory=>get_gui_jumper( )->jump_abapgit(
+      iv_language = lv_main_language
+      iv_key      = mo_repo->get_key( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_files.
+ 
+    DATA:
+      lt_sort TYPE abap_sortorder_tab,
+      ls_sort LIKE LINE OF lt_sort.
+ 
+    IF lines( ct_files ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    ls_sort-descending = mv_order_descending.
+    ls_sort-astext     = abap_true.
+    ls_sort-name       = ''PATH''.
+    INSERT ls_sort INTO TABLE lt_sort.
+ 
+    ls_sort-descending = mv_order_descending.
+    ls_sort-astext     = abap_true.
+    ls_sort-name       = ''FILENAME''.
+    INSERT ls_sort INTO TABLE lt_sort.
+ 
+    SORT ct_files STABLE BY (lt_sort).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_file_command.
+ 
+    DATA: lv_difflink TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div>'' ).
+    IF is_file-is_changed = abap_true.
+      lv_difflink = zcl_abapgit_html_action_utils=>file_encode(
+        iv_key  = mo_repo->get_key( )
+        ig_file = is_file ).
+      ri_html->add_a( iv_txt = ''diff''
+                      iv_act = |{ zif_abapgit_definitions=>c_action-go_file_diff }?{ lv_difflink }| ).
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state( iv_lstate = is_file-lstate
+                                                                  iv_rstate = is_file-rstate ) ).
+    ELSE.
+      ri_html->add( ''&nbsp;'' ).
+    ENDIF.
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_head_line.
+ 
+    DATA:
+      lo_toolbar      TYPE REF TO zcl_abapgit_html_toolbar,
+      ls_settings     TYPE zif_abapgit_definitions=>ty_s_user_settings,
+      lo_label_colors TYPE REF TO zcl_abapgit_string_map,
+      lt_labels       TYPE string_table.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    lo_toolbar = build_main_toolbar( ).
+ 
+    ri_html->add( ''<div class="paddings">'' ).
+    ri_html->add( ''<table class="w100"><tr>'' ).
+ 
+    IF mv_show_folders = abap_true.
+      ri_html->add( ''<td class="current_dir">'' ).
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_path( mv_cur_dir ) ).
+      ri_html->add( ''</td>'' ).
+    ENDIF.
+ 
+    lt_labels = zcl_abapgit_repo_labels=>split( mo_repo->ms_data-local_settings-labels ).
+ 
+    IF lines( lt_labels ) > 0.
+      ls_settings = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_user_settings( ).
+      lo_label_colors = zcl_abapgit_repo_labels=>split_colors_into_map( ls_settings-label_colors ).
+ 
+      ri_html->td(
+        iv_content = zcl_abapgit_gui_chunk_lib=>render_label_list(
+                       it_labels = lt_labels
+                       io_label_colors = lo_label_colors )
+        iv_class   = ''labels'' ).
+    ENDIF.
+ 
+    ri_html->add( ''<td class="right">'' ).
+    ri_html->add( lo_toolbar->render( iv_right = abap_true ) ).
+    ri_html->add( ''</td>'' ).
+    ri_html->add( ''</tr></table>'' ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item.
+ 
+    DATA: lv_link    TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<tr{ get_item_class( is_item = is_item
+                                        iv_is_object_row = abap_true ) }>| ).
+ 
+    IF is_item-obj_name IS INITIAL AND is_item-is_dir = abap_false.
+      ri_html->add( |<td colspan="2"></td>|
+                 && ''<td class="object">''
+                 && ''<i class="grey">non-code and meta files</i>''
+                 && ''</td>'' ).
+    ELSE.
+      ri_html->add( |<td class="icon">{ zcl_abapgit_gui_chunk_lib=>get_item_icon( is_item ) }</td>| ).
+ 
+      IF is_item-is_dir = abap_true. " Subdir
+        lv_link = build_dir_jump_link( is_item-path ).
+        ri_html->add( |<td class="dir" colspan="2">{ lv_link }</td>| ).
+      ELSE.
+        lv_link = zcl_abapgit_gui_chunk_lib=>get_item_link( is_item ).
+        ri_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
+        ri_html->add( |<td class="object">{ lv_link } { build_inactive_object_code( is_item )
+                      } { build_srcsystem_code( is_item ) } { build_origlang_code( is_item ) }</td>| ).
+      ENDIF.
+    ENDIF.
+ 
+    " Changed by
+    ri_html->add( ''<td class="user">'' ).
+    ri_html->add( render_item_changed_by( is_item ) ).
+    ri_html->add( ''</td>'' ).
+ 
+    IF iv_render_transports = abap_true.
+      ri_html->add( render_item_transport( is_item ) ).
+    ENDIF.
+ 
+    " Command
+    ri_html->add( ''<td class="cmd">'' ).
+    IF mo_repo->has_remote_source( ) = abap_true.
+      ri_html->add( render_item_command( is_item ) ).
+    ENDIF.
+    ri_html->add( ''</td>'' ).
+ 
+    ri_html->add( ''</tr>'' ).
+ 
+    ri_html->add( render_item_files( is_item ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_changed_by.
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF is_item-changes = 0 OR is_item-changed_by IS INITIAL.
+      ri_html->add( ''&nbsp;'' ).
+    ELSE.
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( is_item-changed_by ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_command.
+ 
+    DATA lv_difflink TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF is_item-is_dir = abap_true. " Directory
+      ri_html->add( ''<div>'' ).
+      ri_html->add( |<span class="grey">{ is_item-changes } changes</span>| ).
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state( iv_lstate = is_item-lstate
+                                                                  iv_rstate = is_item-rstate ) ).
+      ri_html->add( ''</div>'' ).
+ 
+    ELSEIF is_item-changes > 0.
+      IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL.
+ 
+        lv_difflink = zcl_abapgit_html_action_utils=>obj_encode(
+          iv_key    = mo_repo->get_key( )
+          ig_object = is_item ).
+ 
+        ri_html->add( ''<div>'' ).
+        ri_html->add_a( iv_txt = |diff ({ is_item-changes })|
+                        iv_act = |{ zif_abapgit_definitions=>c_action-go_file_diff }?{ lv_difflink }| ).
+        ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state( iv_lstate = is_item-lstate
+                                                                    iv_rstate = is_item-rstate ) ).
+        ri_html->add( ''</div>'' ).
+ 
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_files.
+ 
+    DATA: ls_file LIKE LINE OF is_item-files.
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF mv_hide_files = abap_true AND is_item-obj_type IS NOT INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+    LOOP AT is_item-files INTO ls_file.
+      ri_html->add( |<tr{ get_item_class( is_item ) }>| ).
+ 
+      ri_html->add( |<td class="icon"></td>| ).
+ 
+      ri_html->add( |<td class="type"></td>| ).
+      ri_html->add( |<td class="filename darkgrey">| ).
+ 
+      IF mv_show_folders = abap_true.
+        ri_html->add( |<div>{ li_exit->adjust_display_filename( ls_file-filename ) }</div>| ).
+      ELSE.
+        ri_html->add( |<div>{ li_exit->adjust_display_filename( ls_file-path && ls_file-filename ) }</div>| ).
+      ENDIF.
+ 
+      ri_html->add( |</td>| ).
+ 
+      " Changed by (not applicable to file)
+      ri_html->add( ''<td class="user">'' ).
+      ri_html->add( ''</td>'' ).
+ 
+      " Transport (not applicable to file)
+      IF mv_are_changes_recorded_in_tr = abap_true.
+        ri_html->add( \`<td></td>\` ).
+      ENDIF.
+ 
+      " Command
+      ri_html->add( ''<td class="cmd">'' ).
+      IF mo_repo->has_remote_source( ) = abap_true.
+        ri_html->add( render_file_command( ls_file ) ).
+      ENDIF.
+      ri_html->add( ''</td>'' ).
+ 
+      ri_html->add( ''</tr>'' ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_transport.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<td class="transport">'' ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_transport( is_item-transport ) ).
+ 
+    ri_html->add( ''</td>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_order_by.
+ 
+    DATA:
+      lv_icon     TYPE string,
+      lt_col_spec TYPE zif_abapgit_definitions=>ty_col_spec_tt,
+      ls_col_spec TYPE zif_abapgit_definitions=>ty_col_spec.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " icon
+    APPEND INITIAL LINE TO lt_col_spec.
+ 
+    ls_col_spec-tech_name = ''OBJ_TYPE''.
+    ls_col_spec-display_name = ''Type''.
+    ls_col_spec-allow_order_by = abap_true.
+    APPEND ls_col_spec TO lt_col_spec.
+ 
+    ls_col_spec-tech_name = ''OBJ_NAME''.
+    ls_col_spec-display_name = ''Name''.
+    ls_col_spec-allow_order_by = abap_true.
+    APPEND ls_col_spec TO lt_col_spec.
+ 
+    ls_col_spec-tech_name = ''CHANGED_BY''.
+    ls_col_spec-display_name = ''Changed by''.
+    ls_col_spec-allow_order_by = abap_true.
+    APPEND ls_col_spec TO lt_col_spec.
+ 
+    IF mv_are_changes_recorded_in_tr = abap_true.
+      ls_col_spec-tech_name = ''TRANSPORT''.
+      ls_col_spec-display_name = ''Transport''.
+      ls_col_spec-allow_order_by = abap_true.
+      APPEND ls_col_spec TO lt_col_spec.
+    ENDIF.
+ 
+    ls_col_spec-tech_name = ''LSTATE''.
+    ls_col_spec-display_name = ''Status''.
+    ls_col_spec-allow_order_by = abap_true.
+    ls_col_spec-css_class = ''cmd''.
+    APPEND ls_col_spec TO lt_col_spec.
+ 
+    ri_html->add( |<thead>| ).
+    ri_html->add( |<tr>| ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_order_by_header_cells(
+      it_col_spec         = lt_col_spec
+      iv_order_by         = mv_order_by
+      iv_order_descending = mv_order_descending ) ).
+ 
+    IF mv_diff_first = abap_true.
+      lv_icon = ''check/blue''.
+    ELSE.
+      lv_icon = ''check/grey''.
+    ENDIF.
+ 
+    ri_html->add( ''</tr>'' ).
+    ri_html->add( ''</thead>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_parent_dir.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<tr class="folder">'' ).
+    ri_html->add( |<td class="icon">{ ri_html->icon( ''folder'' ) }</td>| ).
+    ri_html->add( |<td class="dir" colspan="4">{ build_dir_jump_link( ''..'' ) }</td>| ).
+    IF mo_repo->has_remote_source( ) = abap_true.
+      ri_html->add( |<td colspan="1"></td>| ). " Dummy for online
+    ENDIF.
+    ri_html->add( ''</tr>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_palette(
+      iv_action = zif_abapgit_definitions=>c_action-go_repo ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA lv_path TYPE string.
+    DATA lv_key TYPE zif_abapgit_persistence=>ty_value.
+ 
+    lv_key = ii_event->query( )->get( ''KEY'' ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_repo. " Switch to another repo
+        rs_handled-page  = create( |{ ii_event->query( )->get( ''KEY'' ) }| ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+ 
+      WHEN c_actions-go_data.
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_data
+          EXPORTING
+            iv_key = |{ ii_event->query( )->get( ''KEY'' ) }|.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_actions-go_unit.
+        rs_handled-page  = zcl_abapgit_gui_page_runit=>create( mo_repo ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_actions-toggle_hide_files. " Toggle file diplay
+        mv_hide_files    = zcl_abapgit_persistence_user=>get_instance( )->toggle_hide_files( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-change_dir.        " Change dir
+        lv_path         = ii_event->query( )->get( ''PATH'' ).
+        mv_cur_dir = zcl_abapgit_path=>change_dir(
+          iv_cur_dir = mv_cur_dir
+          iv_cd      = lv_path ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-toggle_folders.    " Toggle folder view
+        mv_show_folders = zcl_abapgit_persistence_user=>get_instance( )->toggle_show_folders( ).
+        mv_cur_dir      = ''/''. " Root
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-toggle_changes.    " Toggle changes only view
+        mv_changes_only = zcl_abapgit_persistence_user=>get_instance( )->toggle_changes_only( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-toggle_diff_first.
+        mv_diff_first = zcl_abapgit_persistence_user=>get_instance( )->set_diff_first(
+          boolc( mv_diff_first = abap_false ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-display_more.      " Increase MAX lines limit
+        mv_max_lines    = mv_max_lines + mv_max_setting.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-change_order_by.
+        mv_order_by = zcl_abapgit_persistence_user=>get_instance( )->set_order_by(
+          ii_event->query( )->get( ''ORDERBY'' ) ).
+        mv_order_descending = zcl_abapgit_persistence_user=>get_instance( )->set_order_descending( abap_false ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-direction.
+        mv_order_descending = zcl_abapgit_persistence_user=>get_instance( )->set_order_descending(
+          boolc( ii_event->query( )->get( ''DIRECTION'' ) = ''DESCENDING'' ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-repo_open_in_master_lang.
+        open_in_main_language( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-go_patch.
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_patch
+          EXPORTING
+            iv_key = lv_key.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+    ls_hotkey_action-ui_component = ''Repo''.
+ 
+    ls_hotkey_action-description   = |Stage|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_stage.
+    ls_hotkey_action-hotkey = |s|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Switch Branch|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-git_branch_switch.
+    ls_hotkey_action-hotkey = |b|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Repository List|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-abapgit_home.
+    ls_hotkey_action-hotkey = |o|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Refresh Repository|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_refresh.
+    ls_hotkey_action-hotkey = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Pull|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-git_pull.
+    ls_hotkey_action-hotkey = |p|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Patch|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_patch.
+    ls_hotkey_action-hotkey = |a|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Diff|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_repo_diff.
+    ls_hotkey_action-hotkey = |d|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Uninstall Repository|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_purge.
+    ls_hotkey_action-hotkey = |u|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Run Syntax Check|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_syntax_check.
+    ls_hotkey_action-hotkey = |c|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Run Code Inspector|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_code_inspector.
+    ls_hotkey_action-hotkey = |i|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Show Log|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_log.
+    ls_hotkey_action-hotkey = |l|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_menu_provider~get_menu.
+ 
+    CREATE OBJECT ro_toolbar EXPORTING iv_id = ''toolbar-main''.
+ 
+    ro_toolbar->add(
+      iv_txt = zcl_abapgit_gui_buttons=>repo_list( )
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>help( )
+      iv_title = ''Help''
+      io_sub = zcl_abapgit_gui_chunk_lib=>help_submenu( ) ).
+ 
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+      ro_toolbar->add(
+        iv_txt   = zcl_abapgit_gui_buttons=>experimental( )
+        iv_title = ''Experimental Features are Enabled''
+        iv_act   = zif_abapgit_definitions=>c_action-go_settings ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA: lt_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt,
+          lo_browser    TYPE REF TO zcl_abapgit_repo_content_list,
+          lx_error      TYPE REF TO zcx_abapgit_exception,
+          lv_max        TYPE abap_bool,
+          lv_max_str    TYPE string,
+          lv_add_str    TYPE string,
+          li_log        TYPE REF TO zif_abapgit_log,
+          lv_msg        TYPE string,
+          lo_news       TYPE REF TO zcl_abapgit_news.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_repo_items.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT mo_repo_aggregated_state.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    TRY.
+        " Reinit, for the case of type change
+        mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ).
+ 
+        check_branch( ).
+ 
+        mv_are_changes_recorded_in_tr = zcl_abapgit_factory=>get_sap_package( mo_repo->get_package( )
+          )->are_changes_recorded_in_tr_req( ).
+ 
+        lo_news = zcl_abapgit_news=>create( mo_repo ).
+ 
+        ri_html->add( |<div class="repo" id="repo{ mv_key }">| ).
+        ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+          io_repo               = mo_repo
+          io_news               = lo_news
+          iv_show_edit          = abap_true
+          iv_interactive_branch = abap_true ) ).
+ 
+        ri_html->add( zcl_abapgit_gui_chunk_lib=>render_news( io_news = lo_news ) ).
+ 
+        zcl_abapgit_exit=>get_instance( )->wall_message_repo(
+          is_repo_meta = mo_repo->ms_data
+          ii_html      = ri_html ).
+ 
+        CREATE OBJECT lo_browser
+          EXPORTING
+            io_repo = mo_repo.
+ 
+        lt_repo_items = lo_browser->list( iv_path         = mv_cur_dir
+                                          iv_by_folders   = mv_show_folders
+                                          iv_changes_only = mv_changes_only
+                                          iv_transports   = mv_are_changes_recorded_in_tr ).
+ 
+        apply_order_by( CHANGING ct_repo_items = lt_repo_items ).
+ 
+        LOOP AT lt_repo_items ASSIGNING <ls_item>.
+          mo_repo_aggregated_state->sum_with_repo_item( <ls_item> ).
+        ENDLOOP.
+ 
+        ri_html->add( render_head_line( ) ).
+ 
+        li_log = lo_browser->get_log( ).
+        IF li_log->count( ) > 0.
+          ri_html->add( ''<div class="log">'' ).
+          ri_html->add( zcl_abapgit_log_viewer=>to_html( li_log ) ). " shows eg. list of unsupported objects
+          ri_html->add( ''</div>'' ).
+        ENDIF.
+ 
+        ri_html->add( ''<div class="repo_container">'' ).
+ 
+        CLEAR lv_msg.
+ 
+        IF lines( lt_repo_items ) = 0.
+          IF mv_changes_only = abap_true.
+            IF mo_repo->is_offline( ) = abap_true.
+              " Offline match banner
+              IF mo_repo->has_remote_source( ) = abap_true.
+                lv_msg = ''Local state completely <b>matches</b> the ZIP file''.
+              ELSE.
+                lv_msg = ''Import a ZIP file to see if there are any changes''.
+              ENDIF.
+            ELSE.
+              " Online match banner
+              lv_msg = ''Local state completely <b>matches</b> the remote repository''.
+            ENDIF.
+          ELSE.
+            lv_msg = |Package is empty. Show { build_dir_jump_link( ''parent'' ) } package|.
+          ENDIF.
+        ELSE.
+          " Repo content table
+          ri_html->add( ''<table class="repo_tab">'' ).
+ 
+          ri_html->add( render_order_by( ) ).
+ 
+          IF zcl_abapgit_path=>is_root( mv_cur_dir ) = abap_false.
+            ri_html->add( render_parent_dir( ) ).
+          ENDIF.
+ 
+          LOOP AT lt_repo_items ASSIGNING <ls_item>.
+            IF mv_max_lines > 0 AND sy-tabix > mv_max_lines.
+              lv_max = abap_true.
+              EXIT. " current loop
+            ENDIF.
+            ri_html->add( render_item( is_item = <ls_item>
+                                       iv_render_transports = mv_are_changes_recorded_in_tr ) ).
+          ENDLOOP.
+ 
+          IF mv_changes_only = abap_true.
+            ri_html->add( \`<tfoot><tr><td class="grey" colspan="5">\` ).
+            ri_html->add( \`(Only changes are shown. \` ).
+            ri_html->add( ri_html->a(
+              iv_txt   = |Show All|
+              iv_act   = |{ c_actions-toggle_changes }| ) ).
+            ri_html->add( \`)</td></tr></tfoot>\` ).
+          ENDIF.
+ 
+          ri_html->add( ''</table>'' ).
+        ENDIF.
+ 
+        IF NOT lv_msg IS INITIAL.
+          ri_html->add( |<div class="panel success repo_banner">{ lv_msg }</div>| ).
+        ENDIF.
+ 
+        IF lv_max = abap_true.
+          ri_html->add( ''<div class = "dummydiv">'' ).
+          IF mv_max_lines = 1.
+            lv_max_str = ''1 object''.
+          ELSE.
+            lv_max_str = |first { mv_max_lines } objects|.
+          ENDIF.
+          lv_add_str = |+{ mv_max_setting }|.
+          ri_html->add( |Only { lv_max_str } objects shown in list. Display {
+            ri_html->a( iv_txt = lv_add_str
+                        iv_act = c_actions-display_more )
+            } more (change in Settings > {
+            ri_html->a( iv_txt = ''Personal Settings''
+                        iv_act = zif_abapgit_definitions=>c_action-go_settings_personal )
+            })| ).
+          ri_html->add( ''</div>'' ).
+        ENDIF.
+ 
+        ri_html->add( ''</div>'' ).
+        ri_html->add( ''</div>'' ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        " Reset ''last shown repo'' so next start will go to repo overview
+        " and allow troubleshooting of issue
+        zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ).
+ 
+        ri_html->add( render_head_line( ) ).
+ 
+        ri_html->add( zcl_abapgit_gui_chunk_lib=>render_error(
+          iv_extra_style = ''repo_banner''
+          ix_error = lx_error ) ).
+    ENDTRY.
+ 
+    register_deferred_script( render_scripts( ) ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_RUN_BCKG           ', 'CLASS zcl_abapgit_gui_page_run_bckg DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA: mt_text TYPE TABLE OF string.
+ 
+    METHODS run.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_RUN_BCKG IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_run_bckg.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Background Run''
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>back_toolbar( )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    DATA: lx_error TYPE REF TO zcx_abapgit_exception,
+          lv_text  TYPE string,
+          lv_line  TYPE i VALUE 1.
+ 
+ 
+    TRY.
+        zcl_abapgit_background=>run( ).
+ 
+        DO.
+          READ LINE lv_line LINE VALUE INTO lv_text.
+          IF sy-subrc <> 0.
+            EXIT.
+          ENDIF.
+          APPEND lv_text TO mt_text.
+          lv_line = lv_line + 1.
+        ENDDO.
+      CATCH zcx_abapgit_exception INTO lx_error.
+        APPEND lx_error->get_text( ) TO mt_text.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA: lv_text LIKE LINE OF mt_text.
+ 
+    register_handlers( ).
+ 
+    run( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div id="toc">'' ).
+    LOOP AT mt_text INTO lv_text.
+      ri_html->add( ''<pre>'' && lv_text && ''</pre><br>'' ).
+    ENDLOOP.
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_RUNIT              ', 'CLASS zcl_abapgit_gui_page_runit DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+    INTERFACES zif_abapgit_gui_menu_provider.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_key,
+        obj_name TYPE tadir-obj_name,
+        obj_type TYPE tadir-object,
+      END OF ty_key,
+      ty_keys_tt TYPE STANDARD TABLE OF ty_key WITH DEFAULT KEY.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo.
+    DATA mv_summary TYPE string.
+ 
+    METHODS build_tadir
+      RETURNING
+        VALUE(rt_tadir) TYPE ty_keys_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS run
+      RETURNING
+        VALUE(ro_result) TYPE REF TO object
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_RUNIT IMPLEMENTATION.
+ 
+ 
+  METHOD build_tadir.
+ 
+    DATA lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    DATA ls_tadir LIKE LINE OF lt_tadir.
+    DATA ls_row   LIKE LINE OF rt_tadir.
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+      iv_package            = mo_repo->get_package( )
+      iv_only_local_objects = abap_true ).
+ 
+    LOOP AT lt_tadir INTO ls_tadir.
+      CLEAR ls_row.
+      ls_row-obj_type = ls_tadir-object.
+      ls_row-obj_name = ls_tadir-obj_name.
+      APPEND ls_row TO rt_tadir.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    mo_repo = io_repo.
+ 
+    TRY.
+        CALL METHOD (''\\PROGRAM=SAPLSAUCV_GUI_RUNNER\\CLASS=PASSPORT'')=>get.
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( |Not supported in your NW release| ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_runit.
+    DATA lo_page_code_inspector TYPE REF TO zcl_abapgit_gui_page_code_insp.
+ 
+    TRY.
+        CREATE OBJECT lo_component EXPORTING io_repo = io_repo.
+ 
+        ri_page = zcl_abapgit_gui_page_hoc=>create(
+          iv_page_title         = |Unit Tests|
+          ii_page_menu_provider = lo_component
+          ii_child_component    = lo_component ).
+ 
+      CATCH zcx_abapgit_exception.
+ 
+        " Fallback as either SAPLSAUCV_GUI_RUNNER is not available in old releases
+        " or passport=>get is private in newer releases NW >= 756
+        CREATE OBJECT lo_page_code_inspector
+          EXPORTING
+            io_repo          = io_repo
+            iv_check_variant = ''SWF_ABAP_UNIT''.
+ 
+        ri_page = lo_page_code_inspector.
+ 
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    DATA lo_passport TYPE REF TO object.
+    DATA lo_runner   TYPE REF TO object.
+    DATA lo_timer    TYPE REF TO zcl_abapgit_timer.
+    DATA lt_keys     TYPE ty_keys_tt.
+    DATA li_result   TYPE REF TO data.
+    FIELD-SYMBOLS <li_result> TYPE any.
+ 
+    lt_keys = build_tadir( ).
+ 
+    lo_timer = zcl_abapgit_timer=>create( iv_count = lines( lt_keys ) )->start( ).
+ 
+    TRY.
+        CALL METHOD (''\\PROGRAM=SAPLSAUCV_GUI_RUNNER\\CLASS=PASSPORT'')=>get
+          RECEIVING
+            result = lo_passport.
+ 
+        CALL METHOD (''CL_AUCV_TEST_RUNNER_STANDARD'')=>create
+          EXPORTING
+            i_passport = lo_passport
+          RECEIVING
+            result     = lo_runner.
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( |Not supported in your NW release| ).
+    ENDTRY.
+ 
+    CREATE DATA li_result TYPE REF TO (''IF_SAUNIT_INTERNAL_RESULT'').
+    ASSIGN li_result->* TO <li_result>.
+ 
+    CALL METHOD lo_runner->(''RUN_FOR_PROGRAM_KEYS'')
+      EXPORTING
+        i_limit_on_duration_category = ''36'' " long
+        i_limit_on_risk_level        = ''33'' " critical
+        i_program_keys               = lt_keys
+      IMPORTING
+        e_aunit_result               = <li_result>.
+ 
+    mv_summary = lo_timer->end( ).
+ 
+    ro_result = <li_result>.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    IF ii_event->mv_action = zif_abapgit_definitions=>c_action-go_back.
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_menu_provider~get_menu.
+    ro_toolbar = zcl_abapgit_gui_chunk_lib=>back_toolbar( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lo_result         TYPE REF TO object.
+    DATA lv_program_ndx    TYPE i.
+    DATA lv_class_ndx      TYPE i.
+    DATA lv_method_ndx     TYPE i.
+    DATA lv_text           TYPE string.
+    DATA lv_count          TYPE i.
+    DATA lv_params         TYPE string.
+    DATA ls_item           TYPE zif_abapgit_definitions=>ty_repo_item.
+ 
+    FIELD-SYMBOLS <ls_task_data>      TYPE any.
+    FIELD-SYMBOLS <lt_programs>       TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_alert_by_index> TYPE any.
+    FIELD-SYMBOLS <lt_indices>        TYPE ANY TABLE.
+    FIELD-SYMBOLS <lt_alerts>         TYPE ANY TABLE.
+    FIELD-SYMBOLS <lt_classes>        TYPE ANY TABLE.
+    FIELD-SYMBOLS <lt_methods>        TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_alert>          TYPE any.
+    FIELD-SYMBOLS <ls_program>        TYPE any.
+    FIELD-SYMBOLS <ls_class>          TYPE any.
+    FIELD-SYMBOLS <ls_method>         TYPE any.
+    FIELD-SYMBOLS <lv_any>            TYPE any.
+    FIELD-SYMBOLS <lt_text_info>      TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_text_info>      TYPE any.
+    FIELD-SYMBOLS <lt_params>         TYPE string_table.
+ 
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="repo">'' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( io_repo        = mo_repo
+                                                              iv_show_commit = abap_false ) ).
+ 
+    lo_result = run( ).
+ 
+    ASSIGN lo_result->(''F_TASK_DATA'') TO <ls_task_data>.
+    ASSIGN COMPONENT ''ALERTS_BY_INDICIES'' OF STRUCTURE <ls_task_data> TO <lt_indices>.
+    ASSIGN COMPONENT ''PROGRAMS'' OF STRUCTURE <ls_task_data> TO <lt_programs>.
+ 
+    ri_html->add( |<table class="unit_tests">| ).
+ 
+    LOOP AT <lt_indices> ASSIGNING <ls_alert_by_index>.
+      ASSIGN COMPONENT ''ALERTS'' OF STRUCTURE <ls_alert_by_index> TO <lt_alerts>.
+      LOOP AT <lt_alerts> ASSIGNING <ls_alert> WHERE (''KIND = ''''F'''' OR KIND = ''''S'''' OR KIND = ''''E'''' OR KIND = ''''W'''''').
+        CLEAR lv_text.
+        ASSIGN COMPONENT ''HEADER-PARAMS'' OF STRUCTURE <ls_alert> TO <lt_params>.
+        LOOP AT <lt_params> INTO lv_params.
+          lv_text = lv_text && lv_params.
+        ENDLOOP.
+ 
+        ASSIGN COMPONENT ''TEXT_INFOS'' OF STRUCTURE <ls_alert> TO <lt_text_info>.
+        LOOP AT <lt_text_info> ASSIGNING <ls_text_info>.
+          ASSIGN COMPONENT ''PARAMS'' OF STRUCTURE <ls_text_info> TO <lt_params>.
+          LOOP AT <lt_params> INTO lv_params.
+            lv_text = lv_text && lv_params.
+          ENDLOOP.
+        ENDLOOP.
+        IF lv_text NP ''*SAUNIT_NO_TEST_CLASS*''.
+          ri_html->add( |<tr><td><span class="boxed red-filled-set">{ lv_text }</span></td></tr>| ).
+          lv_count = lv_count + 1.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    ri_html->add( ''</table>'' ).
+ 
+    ri_html->add( ''<div class="ci-head">'' ).
+    ri_html->add( |Unit tests completed with <strong>{ lv_count } errors</strong> ({ mv_summary })| ).
+    ri_html->add( \`</div>\` ).
+ 
+    ri_html->add( |<hr><table class="unit_tests">| ).
+ 
+    LOOP AT <lt_programs> ASSIGNING <ls_program>.
+      CLEAR ls_item.
+      lv_program_ndx = sy-tabix.
+      ASSIGN COMPONENT ''INFO-KEY-OBJ_TYPE'' OF STRUCTURE <ls_program> TO <lv_any>.
+      IF sy-subrc = 0.
+        ls_item-obj_type = <lv_any>.
+        ASSIGN COMPONENT ''INFO-KEY-OBJ_NAME'' OF STRUCTURE <ls_program> TO <lv_any>.
+        ls_item-obj_name = <lv_any>.
+        ri_html->add( |<tr><td>{ zcl_abapgit_gui_chunk_lib=>get_item_icon( ls_item ) } { ls_item-obj_type }|
+          && | { zcl_abapgit_gui_chunk_lib=>get_item_link( ls_item ) }</td><td></td></tr>| ).
+      ELSE.
+* KEY field does not exist in 750
+        ASSIGN COMPONENT ''INFO-NAME'' OF STRUCTURE <ls_program> TO <lv_any>.
+        ri_html->add( |<tr><td>{ <lv_any> }</td><td></td></tr>| ).
+      ENDIF.
+      ASSIGN COMPONENT ''CLASSES'' OF STRUCTURE <ls_program> TO <lt_classes>.
+      LOOP AT <lt_classes> ASSIGNING <ls_class>.
+        lv_class_ndx = sy-tabix.
+ 
+        ASSIGN COMPONENT ''INFO-NAME'' OF STRUCTURE <ls_class> TO <lv_any>.
+        ri_html->add( |<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;{ <lv_any> }</td><td></td></tr>| ).
+        ASSIGN COMPONENT ''METHODS'' OF STRUCTURE <ls_class> TO <lt_methods>.
+        LOOP AT <lt_methods> ASSIGNING <ls_method>.
+          lv_method_ndx = sy-tabix.
+ 
+          CLEAR lv_text.
+          READ TABLE <lt_indices> WITH KEY
+            (''PROGRAM_NDX'') = lv_program_ndx
+            (''CLASS_NDX'') = lv_class_ndx
+            (''METHOD_NDX'') = lv_method_ndx
+            ASSIGNING <ls_alert_by_index>.
+          IF sy-subrc = 0.
+            ASSIGN COMPONENT ''ALERTS'' OF STRUCTURE <ls_alert_by_index> TO <lt_alerts>.
+            LOOP AT <lt_alerts> ASSIGNING <ls_alert>.
+              ASSIGN COMPONENT ''HEADER-PARAMS'' OF STRUCTURE <ls_alert> TO <lt_params>.
+              LOOP AT <lt_params> INTO lv_params.
+                lv_text = lv_params.
+              ENDLOOP.
+            ENDLOOP.
+          ENDIF.
+ 
+          IF lv_text IS INITIAL.
+            lv_text = |<span class="boxed green-filled-set">PASSED</span>|.
+          ELSE.
+            lv_text = |<span class="boxed red-filled-set">{ lv_text }</span>|.
+          ENDIF.
+ 
+          ASSIGN COMPONENT ''INFO-NAME'' OF STRUCTURE <ls_method> TO <lv_any>.
+          ri_html->add( |<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
+            <lv_any> }</td><td>{ lv_text }</td></tr>| ).
+        ENDLOOP.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    ri_html->add( ''</table></div>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_SETT_BCKG          ', 'CLASS zcl_abapgit_gui_page_sett_bckg DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        mode_selection TYPE string VALUE ''mode_selection'',
+        method         TYPE string VALUE ''method'',
+        authentication TYPE string VALUE ''authentication'',
+        username       TYPE string VALUE ''username'',
+        password       TYPE string VALUE ''password'',
+        mode_settings  TYPE string VALUE ''mode_settings'',
+        settings       TYPE string VALUE ''settings'',
+      END OF c_id .
+    CONSTANTS:
+      BEGIN OF c_event,
+        run_now TYPE string VALUE ''run_now'',
+        save    TYPE string VALUE ''save'',
+      END OF c_event .
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mv_settings_count TYPE i .
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_persist
+      RETURNING
+        VALUE(rs_persist) TYPE zcl_abapgit_persist_background=>ty_background
+      RAISING
+        zcx_abapgit_exception .
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_BCKG IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_form_data.
+    mo_repo = io_repo.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_bckg.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Background Mode''
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_background )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA:
+      lt_methods TYPE zcl_abapgit_background=>ty_methods,
+      ls_method  LIKE LINE OF lt_methods,
+      lv_hint    TYPE string.
+ 
+    lt_methods = zcl_abapgit_background=>list_methods( ).
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = ''repo-background-form''
+                iv_help_page = ''https://docs.abapgit.org/settings-background-mode.html'' ).
+ 
+    ro_form->start_group(
+      iv_name          = c_id-mode_selection
+      iv_label         = ''Mode''
+    )->radio(
+      iv_name          = c_id-method
+      iv_default_value = ''''
+      iv_label         = ''Selection''
+      iv_hint          = ''Define the action that will be executed in background mode''
+    )->option(
+      iv_label         = ''Do Nothing''
+      iv_value         = '''' ).
+ 
+    LOOP AT lt_methods INTO ls_method.
+      ro_form->option(
+        iv_label       = ls_method-description
+        iv_value       = ls_method-class_ ).
+    ENDLOOP.
+ 
+    ro_form->table(
+      iv_name        = c_id-settings
+      iv_hint        = ''Settings required for selected background action''
+      iv_label       = ''Additional Settings''
+    )->column(
+      iv_label       = ''Key''
+      iv_width       = ''50%''
+      iv_readonly    = abap_true
+    )->column(
+      iv_label       = ''Value''
+      iv_width       = ''50%'' ).
+ 
+    lv_hint = ''Password will be saved in clear text!''.
+ 
+    ro_form->start_group(
+      iv_name        = c_id-authentication
+      iv_label       = ''HTTP Authentication (Optional)''
+      iv_hint        = lv_hint
+    )->text(
+      iv_name        = c_id-username
+      iv_label       = ''Username''
+      iv_hint        = lv_hint
+    )->text(
+      iv_name        = c_id-password
+      iv_label       = ''Password''
+      iv_hint        = lv_hint
+      iv_placeholder = lv_hint ).
+ 
+    ro_form->command(
+      iv_label       = ''Save Settings''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-save
+    )->command(
+      iv_label       = ''Run Background Logic''
+      iv_action      = zif_abapgit_definitions=>c_action-go_background_run
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_persist.
+ 
+    DATA lo_per TYPE REF TO zcl_abapgit_persist_background.
+ 
+    CREATE OBJECT lo_per.
+ 
+    TRY.
+        rs_persist = lo_per->get_by_key( mo_repo->get_key( ) ).
+      CATCH zcx_abapgit_not_found.
+        CLEAR rs_persist.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    DATA:
+      ls_per      TYPE zcl_abapgit_persist_background=>ty_background,
+      lv_row      TYPE i,
+      lv_val      TYPE string,
+      lt_settings LIKE ls_per-settings,
+      ls_settings LIKE LINE OF ls_per-settings.
+ 
+    ls_per = read_persist( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Mode Selection
+    ro_form_data->set(
+      iv_key = c_id-method
+      iv_val = ls_per-method ).
+ 
+    " Mode Settings
+    IF ls_per-method IS NOT INITIAL.
+ 
+      lt_settings = ls_per-settings.
+ 
+      " skip invalid values, from old background logic
+      IF ls_per-method <> ''push'' AND ls_per-method <> ''pull'' AND ls_per-method <> ''nothing''.
+        CALL METHOD (ls_per-method)=>zif_abapgit_background~get_settings
+          CHANGING
+            ct_settings = lt_settings.
+      ENDIF.
+ 
+      LOOP AT lt_settings INTO ls_settings.
+        lv_row = lv_row + 1.
+        DO 3 TIMES.
+          CASE sy-index.
+            WHEN 1.
+              lv_val = ls_settings-key.
+            WHEN 2.
+              lv_val = ls_settings-value.
+          ENDCASE.
+          ro_form_data->set(
+            iv_key = |{ c_id-settings }-{ lv_row }-{ sy-index }|
+            iv_val = lv_val ).
+        ENDDO.
+      ENDLOOP.
+ 
+    ENDIF.
+ 
+    mv_settings_count = lv_row.
+ 
+    ro_form_data->set(
+      iv_key = |{ c_id-settings }-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = |{ mv_settings_count }| ).
+ 
+    " Authentication
+    ro_form_data->set(
+      iv_key = c_id-username
+      iv_val = ls_per-username ).
+    ro_form_data->set(
+      iv_key = c_id-password
+      iv_val = ls_per-password ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+ 
+    DATA:
+      lo_persistence TYPE REF TO zcl_abapgit_persist_background,
+      ls_per         TYPE zcl_abapgit_persist_background=>ty_background,
+      lt_settings    LIKE ls_per-settings.
+ 
+    FIELD-SYMBOLS:
+      <ls_settings> LIKE LINE OF ls_per-settings.
+ 
+    ls_per-key = mo_repo->get_key( ).
+ 
+    " Mode Selection
+    ls_per-method = mo_form_data->get( c_id-method ).
+ 
+    " Mode Settings
+    IF ls_per-method IS NOT INITIAL.
+ 
+      lt_settings = ls_per-settings.
+ 
+      " skip invalid values, from old background logic
+      IF ls_per-method <> ''push'' AND ls_per-method <> ''pull'' AND ls_per-method <> ''nothing''.
+        CALL METHOD (ls_per-method)=>zif_abapgit_background~get_settings
+          CHANGING
+            ct_settings = lt_settings.
+      ENDIF.
+ 
+      LOOP AT lt_settings ASSIGNING <ls_settings>.
+        <ls_settings>-value = mo_form_data->get( |{ c_id-settings }-{ sy-tabix }-2| ).
+      ENDLOOP.
+ 
+      ls_per-settings = lt_settings.
+ 
+    ENDIF.
+ 
+    " Authentication
+    ls_per-username = mo_form_data->get( c_id-username ).
+    ls_per-password = mo_form_data->get( c_id-password ).
+ 
+    CREATE OBJECT lo_persistence.
+ 
+    IF ls_per-method IS INITIAL.
+      lo_persistence->delete( ls_per-key ).
+    ELSE.
+      lo_persistence->modify( ls_per ).
+    ENDIF.
+ 
+    COMMIT WORK AND WAIT.
+ 
+    MESSAGE ''Settings succesfully saved'' TYPE ''S''.
+ 
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-save.
+        save_settings( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( \`<div class="repo">\` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_true ) ).
+ 
+    ri_html->add( mo_form->render(
+      iv_form_class = ''w800px''
+      io_values     = mo_form_data ) ).
+ 
+    ri_html->add( \`</div>\` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_SETT_GLOB          ', 'CLASS zcl_abapgit_gui_page_sett_glob DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        proxy_settings           TYPE string VALUE ''proxy_settings'',
+        proxy_url                TYPE string VALUE ''proxy_url'',
+        proxy_port               TYPE string VALUE ''proxy_port'',
+        proxy_auth               TYPE string VALUE ''proxy_auth'',
+        proxy_bypass             TYPE string VALUE ''proxy_bypass'',
+        commit_settings          TYPE string VALUE ''commit_settings'',
+        commitmsg_comment_length TYPE string VALUE ''commitmsg_comment_length'',
+        commitmsg_comment_deflt  TYPE string VALUE ''commitmsg_comment_deflt'',
+        commitmsg_body_size      TYPE string VALUE ''commitmsg_body_size'',
+        commitmsg_hide_author    TYPE string VALUE ''commitmsg_hide_author'',
+        devint_settings          TYPE string VALUE ''devint_settings'',
+        run_critical_tests       TYPE string VALUE ''run_critical_tests'',
+        experimental_features    TYPE string VALUE ''experimental_features'',
+        activate_wo_popup        TYPE string VALUE ''activate_wo_popup'',
+      END OF c_id.
+    CONSTANTS:
+      BEGIN OF c_event,
+        proxy_bypass TYPE string VALUE ''proxy_bypass'',
+        save         TYPE string VALUE ''save'',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+ 
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings.
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS read_proxy_bypass
+      IMPORTING
+        io_form_data TYPE REF TO zcl_abapgit_string_map
+        io_settings TYPE REF TO zcl_abapgit_settings
+      RAISING
+        zcx_abapgit_exception.
+    METHODS save_proxy_bypass
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_GLOB IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_glob.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Global Settings''
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_toolbar(
+                             zif_abapgit_definitions=>c_action-go_settings )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = ''global-setting-form''
+      iv_help_page = ''https://docs.abapgit.org/guide-settings-global.html'' ).
+ 
+    ro_form->start_group(
+      iv_name        = c_id-proxy_settings
+      iv_label       = ''Proxy Settings''
+    )->text(
+      iv_name        = c_id-proxy_url
+      iv_label       = ''Proxy Host''
+      iv_hint        = ''Hostname or IP of proxy required to access the Internet (do not enter http://)''
+      iv_placeholder = ''Hostname or IP without http://''
+    )->number(
+      iv_name        = c_id-proxy_port
+      iv_label       = ''Proxy Port''
+      iv_hint        = ''Port of proxy required to access the Internet''
+      iv_min         = 0
+      iv_max         = 65535
+    )->checkbox(
+      iv_name        = c_id-proxy_auth
+      iv_label       = ''Proxy Authentication''
+      iv_hint        = ''Check, if proxy requires you to login''
+    )->textarea(
+      iv_name        = c_id-proxy_bypass
+      iv_label       = ''Proxy Bypass''
+      iv_hint        = ''List of hosts/domains for which to bypass using proxy''
+    )->start_group(
+      iv_name        = c_id-commit_settings
+      iv_label       = ''Commit Message Settings''
+    )->number(
+      iv_name        = c_id-commitmsg_comment_length
+      iv_required    = abap_true
+      iv_label       = ''Maximum Length of Comment''
+      iv_hint        = |At least { zcl_abapgit_settings=>c_commitmsg_comment_length_dft } characters|
+      iv_min         = zcl_abapgit_settings=>c_commitmsg_comment_length_dft
+    )->text(
+      iv_name        = c_id-commitmsg_comment_deflt
+      iv_label       = ''Default Text For Comment''
+      iv_hint        = ''You can use $OBJECT or $FILE to include the number of objects/files''
+    )->number(
+      iv_name        = c_id-commitmsg_body_size
+      iv_required    = abap_true
+      iv_label       = ''Maximum Line Size of Body''
+      iv_hint        = |At least { zcl_abapgit_settings=>c_commitmsg_body_size_dft } characters|
+      iv_min         = zcl_abapgit_settings=>c_commitmsg_body_size_dft
+    )->checkbox(
+      iv_name        = c_id-commitmsg_hide_author
+      iv_label       = ''Hide Author Fields'' ).
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      ro_form->start_group(
+        iv_name        = c_id-devint_settings
+        iv_label       = ''Development Internal Settings''
+      )->checkbox(
+        iv_name        = c_id-run_critical_tests
+        iv_label       = ''Enable Critical Unit Tests''
+      )->checkbox(
+        iv_name        = c_id-experimental_features
+        iv_label       = ''Enable Experimental Features'' ).
+    ENDIF.
+ 
+    ro_form->command(
+      iv_label       = ''Save Settings''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-save
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_proxy_bypass.
+ 
+    DATA:
+      lt_proxy_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url,
+      ls_proxy_bypass LIKE LINE OF lt_proxy_bypass,
+      lv_val          TYPE string.
+ 
+    lt_proxy_bypass = io_settings->get_proxy_bypass( ).
+    LOOP AT lt_proxy_bypass INTO ls_proxy_bypass.
+      lv_val = lv_val && ls_proxy_bypass-low && cl_abap_char_utilities=>newline.
+    ENDLOOP.
+ 
+    io_form_data->set(
+      iv_key = c_id-proxy_bypass
+      iv_val = lv_val ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    " Get settings from DB
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Proxy
+    ro_form_data->set(
+      iv_key = c_id-proxy_url
+      iv_val = mo_settings->get_proxy_url( ) ).
+    ro_form_data->set(
+      iv_key = c_id-proxy_port
+      iv_val = mo_settings->get_proxy_port( ) ).
+    ro_form_data->set(
+      iv_key = c_id-proxy_auth
+      iv_val = boolc( mo_settings->get_proxy_authentication( ) = abap_true ) ) ##TYPE.
+ 
+    read_proxy_bypass(
+      io_settings = mo_settings
+      io_form_data = ro_form_data ).
+ 
+    " Commit Message
+    ro_form_data->set(
+      iv_key = c_id-commitmsg_comment_length
+      iv_val = |{ mo_settings->get_commitmsg_comment_length( ) }| ).
+    ro_form_data->set(
+      iv_key = c_id-commitmsg_comment_deflt
+      iv_val = mo_settings->get_commitmsg_comment_default( ) ).
+    ro_form_data->set(
+      iv_key = c_id-commitmsg_body_size
+      iv_val = |{ mo_settings->get_commitmsg_body_size( ) }| ).
+    ro_form_data->set(
+      iv_key = c_id-commitmsg_hide_author
+      iv_val = boolc( mo_settings->get_commitmsg_hide_author( ) = abap_true ) ) ##TYPE.
+ 
+    " Dev Internal
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      ro_form_data->set(
+        iv_key = c_id-run_critical_tests
+        iv_val = boolc( mo_settings->get_run_critical_tests( ) = abap_true ) ) ##TYPE.
+      ro_form_data->set(
+        iv_key = c_id-experimental_features
+        iv_val = boolc( mo_settings->get_experimental_features( ) = abap_true ) ) ##TYPE.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_proxy_bypass.
+ 
+    DATA:
+      lt_textarea     TYPE TABLE OF string,
+      lt_proxy_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url,
+      ls_proxy_bypass LIKE LINE OF lt_proxy_bypass.
+ 
+    lt_textarea = zcl_abapgit_convert=>split_string( mo_form_data->get( c_id-proxy_bypass ) ).
+ 
+    ls_proxy_bypass-sign = ''I''.
+    LOOP AT lt_textarea INTO ls_proxy_bypass-low WHERE table_line IS NOT INITIAL.
+      IF ls_proxy_bypass-low CA ''*+''.
+        ls_proxy_bypass-option = ''CP''.
+      ELSE.
+        ls_proxy_bypass-option = ''EQ''.
+      ENDIF.
+      APPEND ls_proxy_bypass TO lt_proxy_bypass.
+    ENDLOOP.
+ 
+    mo_settings->set_proxy_bypass( lt_proxy_bypass ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+ 
+    DATA:
+      li_persistence TYPE REF TO zif_abapgit_persist_settings,
+      lv_value       TYPE i.
+ 
+    " Proxy
+    mo_settings->set_proxy_url( mo_form_data->get( c_id-proxy_url ) ).
+    mo_settings->set_proxy_port( mo_form_data->get( c_id-proxy_port ) ).
+    mo_settings->set_proxy_authentication( boolc( mo_form_data->get( c_id-proxy_auth ) = abap_true ) ).
+ 
+    save_proxy_bypass( ).
+ 
+    " Commit Message
+    lv_value = mo_form_data->get( c_id-commitmsg_comment_length ).
+    mo_settings->set_commitmsg_comment_length( lv_value ).
+    mo_settings->set_commitmsg_comment_default( mo_form_data->get( c_id-commitmsg_comment_deflt ) ).
+    lv_value = mo_form_data->get( c_id-commitmsg_body_size ).
+    mo_settings->set_commitmsg_body_size( lv_value ).
+    mo_settings->set_commitmsg_hide_author( boolc( mo_form_data->get( c_id-commitmsg_hide_author ) = abap_true ) ).
+ 
+    " Dev Internal
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      mo_settings->set_run_critical_tests( boolc( mo_form_data->get( c_id-run_critical_tests ) = abap_true ) ).
+      mo_settings->set_experimental_features( boolc( mo_form_data->get( c_id-experimental_features ) = abap_true ) ).
+    ENDIF.
+ 
+    " Store in DB
+    li_persistence = zcl_abapgit_persist_factory=>get_settings( ).
+    li_persistence->modify( mo_settings ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+    MESSAGE ''Settings succesfully saved'' TYPE ''S''.
+ 
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    IF io_form_data->get( c_id-proxy_url ) IS NOT INITIAL AND io_form_data->get( c_id-proxy_port ) IS INITIAL OR
+       io_form_data->get( c_id-proxy_url ) IS INITIAL AND io_form_data->get( c_id-proxy_port ) IS NOT INITIAL.
+      ro_validation_log->set(
+        iv_key = c_id-proxy_url
+        iv_val = |If you specify a proxy, you have to specify host and port| ).
+    ENDIF.
+ 
+    IF ( io_form_data->get( c_id-proxy_url ) IS INITIAL OR io_form_data->get( c_id-proxy_port ) IS INITIAL ) AND
+       io_form_data->get( c_id-proxy_auth ) = abap_true.
+      ro_validation_log->set(
+        iv_key = c_id-proxy_auth
+        iv_val = |To turn on authentication, you have to specify host and port| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-save.
+        " Validate form entries before saving
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( ''<div class="form-container">'' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_SETT_INFO          ', 'CLASS zcl_abapgit_gui_page_sett_info DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_stats,
+        measure TYPE string,
+        local   TYPE i,
+        remote  TYPE i,
+      END OF ty_stats .
+    TYPES:
+      BEGIN OF ty_infos,
+        size TYPE p LENGTH 16 DECIMALS 0,
+        line TYPE p LENGTH 16 DECIMALS 0,
+        sloc TYPE p LENGTH 16 DECIMALS 0,
+      END OF ty_infos .
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        info            TYPE string VALUE ''info'',
+        created_by      TYPE string VALUE ''created_by'',
+        created_at      TYPE string VALUE ''created_at'',
+        deserialized_by TYPE string VALUE ''deserialized_by'',
+        deserialized_at TYPE string VALUE ''deserialized_at'',
+        stats           TYPE string VALUE ''stats'',
+        stats_table     TYPE string VALUE ''stats_table'',
+      END OF c_id .
+    CONSTANTS:
+      BEGIN OF c_event,
+        save TYPE string VALUE ''save'',
+      END OF c_event .
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA:
+      mt_stats TYPE STANDARD TABLE OF ty_stats WITH KEY measure .
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_settings
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats_files
+      EXPORTING
+        !et_local  TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !et_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats_state
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats_size_lines_sloc
+      IMPORTING
+        !it_local        TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_remote       TYPE zif_abapgit_git_definitions=>ty_files_tt
+      EXPORTING
+        !et_local_items  TYPE zif_abapgit_definitions=>ty_items_tt
+        !et_remote_items TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats_file
+      IMPORTING
+        !is_file       TYPE zif_abapgit_git_definitions=>ty_file
+      RETURNING
+        VALUE(rs_info) TYPE ty_infos .
+    METHODS read_stats_objects
+      CHANGING
+        !ct_local_items  TYPE zif_abapgit_definitions=>ty_items_tt
+        !ct_remote_items TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS format_user
+      IMPORTING
+        !iv_username   TYPE syuname
+      RETURNING
+        VALUE(rv_user) TYPE string .
+    METHODS format_timestamp
+      IMPORTING
+        !iv_timestamp       TYPE timestampl
+      RETURNING
+        VALUE(rv_timestamp) TYPE string .
+    METHODS format_size
+      IMPORTING
+        !iv_size       TYPE i
+      RETURNING
+        VALUE(rv_size) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_sett_info IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_form_data.
+    mo_repo = io_repo.
+    mo_form = get_form_schema( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_info.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Repository Stats''
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_infos )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_size.
+ 
+    DATA:
+      lv_size TYPE p LENGTH 16 DECIMALS 2.
+ 
+    IF iv_size > 1024 * 1024 * 1024.
+      lv_size = iv_size / 1024 / 1024 / 1024.
+      rv_size = |{ lv_size } GB|.
+    ELSEIF iv_size > 1024 * 1024.
+      lv_size = iv_size / 1024 / 1024.
+      rv_size = |{ lv_size } MB|.
+    ELSEIF iv_size > 1024.
+      lv_size = iv_size / 1024.
+      rv_size = |{ lv_size } KB|.
+    ELSE.
+      rv_size = |{ iv_size } Bytes|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_timestamp.
+ 
+    DATA lv_short TYPE timestamp.
+ 
+    IF iv_timestamp IS INITIAL.
+      rv_timestamp = ''n/a''.
+      RETURN.
+    ENDIF.
+ 
+    cl_abap_tstmp=>move(
+      EXPORTING tstmp_src = iv_timestamp
+      IMPORTING tstmp_tgt = lv_short ).
+ 
+    rv_timestamp = |{ lv_short TIMESTAMP = ISO }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_user.
+ 
+    DATA lv_title TYPE string.
+ 
+    IF iv_username IS INITIAL.
+      rv_user = ''n/a''.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_username <> zcl_abapgit_objects_super=>c_user_unknown.
+      lv_title = zcl_abapgit_user_record=>get_title( iv_username ).
+    ENDIF.
+ 
+    rv_user = iv_username.
+    IF lv_title IS NOT INITIAL.
+      rv_user = |{ rv_user } ({ lv_title })|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA lv_label TYPE string.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = ''repo-infos-form''
+                iv_help_page = ''https://docs.abapgit.org/settings-stats.html'' ).
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      lv_label = ''ZIP File''.
+    ELSE.
+      lv_label = ''Remote''.
+    ENDIF.
+ 
+    ro_form->start_group(
+      iv_name        = c_id-info
+      iv_label       = ''Stats''
+    )->text(
+      iv_name        = c_id-created_by
+      iv_label       = ''Created By''
+      iv_readonly    = abap_true
+    )->text(
+      iv_name        = c_id-created_at
+      iv_label       = ''Created At''
+      iv_readonly    = abap_true
+    )->text(
+      iv_name        = c_id-deserialized_by
+      iv_label       = ''Last Deserialized By''
+      iv_readonly    = abap_true
+    )->text(
+      iv_name        = c_id-deserialized_at
+      iv_label       = ''Last Deserialized At''
+      iv_readonly    = abap_true
+    )->table(
+      iv_name        = c_id-stats_table
+      iv_label       = ''Statistics''
+    )->column(
+      iv_label       = ''Measure''
+      iv_width       = ''50%''
+      iv_readonly    = abap_true
+    )->column(
+      iv_label       = ''Local''
+      iv_width       = ''25%''
+      iv_readonly    = abap_true
+    )->column(
+      iv_label       = lv_label
+      iv_width       = ''25%''
+      iv_readonly    = abap_true
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    DATA:
+      ls_repo  TYPE zif_abapgit_persistence=>ty_repo,
+      ls_stats TYPE ty_stats,
+      lv_row   TYPE i,
+      lv_int   TYPE i,
+      lv_val   TYPE string.
+ 
+    " Get infos from DB
+    TRY.
+        ls_repo = zcl_abapgit_persist_factory=>get_repo( )->read( mo_repo->get_key( ) ).
+      CATCH zcx_abapgit_not_found.
+        zcx_abapgit_exception=>raise( |Repo not found, key { mo_repo->get_key( ) }| ).
+    ENDTRY.
+ 
+    read_stats( ).
+ 
+    " Infos
+    mo_form_data->set(
+      iv_key = c_id-created_by
+      iv_val = format_user( ls_repo-created_by ) ).
+    mo_form_data->set(
+      iv_key = c_id-created_at
+      iv_val = format_timestamp( ls_repo-created_at ) ).
+    mo_form_data->set(
+      iv_key = c_id-deserialized_by
+      iv_val = format_user( ls_repo-deserialized_by ) ).
+    mo_form_data->set(
+      iv_key = c_id-deserialized_at
+      iv_val = format_timestamp( ls_repo-deserialized_at ) ).
+ 
+    LOOP AT mt_stats INTO ls_stats.
+      lv_row = sy-tabix.
+      DO 3 TIMES.
+        CASE sy-index.
+          WHEN 1.
+            lv_val = ls_stats-measure.
+          WHEN 2.
+            lv_val = ls_stats-local.
+          WHEN 3.
+            lv_val = ls_stats-remote.
+        ENDCASE.
+ 
+        IF ls_stats-measure CS ''Size'' AND sy-index BETWEEN 2 AND 3.
+          lv_int = lv_val.
+          lv_val = format_size( lv_int ).
+        ENDIF.
+ 
+        mo_form_data->set(
+          iv_key = |{ c_id-stats_table }-{ lv_row }-{ sy-index }|
+          iv_val = lv_val ).
+      ENDDO.
+    ENDLOOP.
+ 
+    mo_form_data->set(
+      iv_key = |{ c_id-stats_table }-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = |{ lv_row }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats.
+ 
+    DATA:
+      lt_local        TYPE zif_abapgit_definitions=>ty_files_item_tt,
+      lt_remote       TYPE zif_abapgit_git_definitions=>ty_files_tt,
+      lt_local_items  TYPE zif_abapgit_definitions=>ty_items_tt,
+      lt_remote_items TYPE zif_abapgit_definitions=>ty_items_tt.
+ 
+    CLEAR mt_stats.
+ 
+    read_stats_files(
+      IMPORTING
+        et_local  = lt_local
+        et_remote = lt_remote ).
+ 
+    read_stats_state( ).
+ 
+    read_stats_size_lines_sloc(
+      EXPORTING
+        it_local        = lt_local
+        it_remote       = lt_remote
+      IMPORTING
+        et_local_items  = lt_local_items
+        et_remote_items = lt_remote_items ).
+ 
+    read_stats_objects(
+      CHANGING
+        ct_local_items  = lt_local_items
+        ct_remote_items = lt_remote_items ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_file.
+ 
+    TYPES ty_char255 TYPE c LENGTH 255.
+ 
+    DATA:
+      lv_code TYPE string,
+      lt_code TYPE STANDARD TABLE OF ty_char255 WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS:
+      <ls_code> LIKE LINE OF lt_code.
+ 
+    rs_info-size = xstrlen( is_file-data ).
+ 
+    IF is_file-filename CP ''*.abap''.
+      TRY.
+          lv_code = zcl_abapgit_convert=>xstring_to_string_utf8( is_file-data ).
+        CATCH zcx_abapgit_exception ##NO_HANDLER.
+      ENDTRY.
+ 
+      SPLIT lv_code AT cl_abap_char_utilities=>newline INTO TABLE lt_code.
+ 
+      rs_info-line = lines( lt_code ).
+ 
+      LOOP AT lt_code ASSIGNING <ls_code> WHERE table_line IS NOT INITIAL AND table_line(1) <> ''*''.
+        SHIFT <ls_code> LEFT DELETING LEADING space.
+        IF <ls_code>(1) <> ''"''.
+          rs_info-sloc = rs_info-sloc + 1.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_files.
+ 
+    DATA ls_stats TYPE ty_stats.
+    DATA lt_remote_wo_ignored TYPE zif_abapgit_git_definitions=>ty_files_tt.
+ 
+    et_local = mo_repo->get_files_local( ).
+ 
+    ls_stats-measure = ''Number of Files''.
+    ls_stats-local   = lines( et_local ).
+ 
+    IF mo_repo->has_remote_source( ) = abap_true.
+      et_remote = mo_repo->get_files_remote( ).
+      ls_stats-remote = lines( et_remote ).
+      lt_remote_wo_ignored = mo_repo->get_files_remote( iv_ignore_files = abap_true ).
+    ENDIF.
+ 
+    APPEND ls_stats TO mt_stats.
+ 
+    IF et_remote IS NOT INITIAL.
+      CLEAR ls_stats.
+      ls_stats-measure = ''Number of Ignored Files''.
+      ls_stats-remote = lines( et_remote ) - lines( lt_remote_wo_ignored ).
+      APPEND ls_stats TO mt_stats.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_objects.
+ 
+    DATA:
+      ls_stats           TYPE ty_stats,
+      ls_item            TYPE zif_abapgit_definitions=>ty_item,
+      lt_supported_types TYPE zcl_abapgit_objects=>ty_types_tt.
+ 
+    ls_stats-measure = ''Number of Objects''.
+ 
+    DELETE ct_local_items WHERE obj_type IS INITIAL OR obj_name IS INITIAL.
+    ls_stats-local = lines( ct_local_items ).
+ 
+    DELETE ct_remote_items WHERE obj_type IS INITIAL OR obj_name IS INITIAL.
+    ls_stats-remote = lines( ct_remote_items ).
+ 
+    APPEND ls_stats TO mt_stats.
+ 
+    CLEAR ls_stats.
+    ls_stats-measure = ''Number of Unsupported Objects''.
+    ls_stats-local   = lines( mo_repo->get_unsupported_objects_local( ) ).
+ 
+    lt_supported_types = zcl_abapgit_objects=>supported_list( ).
+ 
+    LOOP AT ct_remote_items INTO ls_item.
+      READ TABLE lt_supported_types WITH KEY table_line = ls_item-obj_type TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        ls_stats-remote = ls_stats-remote + 1.
+      ENDIF.
+    ENDLOOP.
+ 
+    APPEND ls_stats TO mt_stats.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_size_lines_sloc.
+ 
+    DATA:
+      ls_stats       TYPE ty_stats,
+      lv_ignored     TYPE abap_bool,
+      ls_info_file   TYPE ty_infos,
+      ls_info_local  TYPE ty_infos,
+      ls_info_remote TYPE ty_infos,
+      ls_item        TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS:
+      <ls_local>  LIKE LINE OF it_local,
+      <ls_remote> LIKE LINE OF it_remote.
+ 
+    LOOP AT it_local ASSIGNING <ls_local>.
+      ls_info_file = read_stats_file( <ls_local>-file ).
+ 
+      ls_info_local-size = ls_info_local-size + ls_info_file-size.
+      ls_info_local-line = ls_info_local-line + ls_info_file-line.
+      ls_info_local-sloc = ls_info_local-sloc + ls_info_file-sloc.
+ 
+      COLLECT <ls_local>-item INTO et_local_items.
+    ENDLOOP.
+ 
+    IF mo_repo->has_remote_source( ) = abap_true.
+      LOOP AT it_remote ASSIGNING <ls_remote> WHERE filename IS NOT INITIAL.
+        lv_ignored = mo_repo->get_dot_abapgit( )->is_ignored(
+                       iv_filename = <ls_remote>-filename
+                       iv_path     = <ls_remote>-path ).
+ 
+        IF lv_ignored = abap_false.
+          ls_info_file = read_stats_file( <ls_remote> ).
+ 
+          ls_info_remote-size = ls_info_remote-size + ls_info_file-size.
+          ls_info_remote-line = ls_info_remote-line + ls_info_file-line.
+          ls_info_remote-sloc = ls_info_remote-sloc + ls_info_file-sloc.
+ 
+          TRY.
+              zcl_abapgit_filename_logic=>file_to_object(
+                EXPORTING
+                  iv_filename = <ls_remote>-filename
+                  iv_path     = <ls_remote>-path
+                  iv_devclass = mo_repo->get_package( )
+                  io_dot      = mo_repo->get_dot_abapgit( )
+                IMPORTING
+                  es_item     = ls_item ).
+              COLLECT ls_item INTO et_remote_items.
+            CATCH zcx_abapgit_exception ##NO_HANDLER.
+          ENDTRY.
+        ENDIF.
+ 
+      ENDLOOP.
+    ENDIF.
+ 
+    ls_stats-measure = ''Size of Files''.
+    ls_stats-local   = ls_info_local-size.
+    ls_stats-remote  = ls_info_remote-size.
+    APPEND ls_stats TO mt_stats.
+    ls_stats-measure = ''Lines in ABAP Files''.
+    ls_stats-local   = ls_info_local-line.
+    ls_stats-remote  = ls_info_remote-line.
+    APPEND ls_stats TO mt_stats.
+    ls_stats-measure = ''Lines of Code in ABAP Files''.
+    ls_stats-local   = ls_info_local-sloc.
+    ls_stats-remote  = ls_info_remote-sloc.
+    APPEND ls_stats TO mt_stats.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_state.
+ 
+    DATA:
+      lt_results TYPE zif_abapgit_definitions=>ty_results_tt,
+      lv_state   TYPE c LENGTH 1,
+      ls_stats   TYPE ty_stats.
+ 
+    FIELD-SYMBOLS:
+      <ls_result> LIKE LINE OF lt_results.
+ 
+    lt_results = zcl_abapgit_file_status=>status( mo_repo ).
+ 
+    DO 3 TIMES.
+      CLEAR ls_stats.
+ 
+      CASE sy-index.
+        WHEN 1.
+          ls_stats-measure = ''Number of Modified Files''.
+          lv_state = zif_abapgit_definitions=>c_state-modified.
+        WHEN 2.
+          ls_stats-measure = ''Number of Added Files''.
+          lv_state = zif_abapgit_definitions=>c_state-added.
+        WHEN 3.
+          ls_stats-measure = ''Number of Deleted Files''.
+          lv_state = zif_abapgit_definitions=>c_state-deleted.
+      ENDCASE.
+ 
+      LOOP AT lt_results ASSIGNING <ls_result>.
+        IF <ls_result>-lstate = lv_state.
+          ls_stats-local = ls_stats-local + 1.
+        ENDIF.
+        IF <ls_result>-rstate = lv_state AND mo_repo->has_remote_source( ) = abap_true.
+          ls_stats-remote = ls_stats-remote + 1.
+        ENDIF.
+      ENDLOOP.
+ 
+      APPEND ls_stats TO mt_stats.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    IF ii_event->mv_action = zif_abapgit_definitions=>c_action-go_back.
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    read_settings( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( \`<div class="repo">\` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_true ) ).
+ 
+    ri_html->add( mo_form->render( mo_form_data ) ).
+ 
+    ri_html->add( \`</div>\` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL          ', 'CLASS zcl_abapgit_gui_page_sett_locl DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_popup_picklist TYPE REF TO zcl_abapgit_gui_picklist.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        local                        TYPE string VALUE ''local'',
+        display_name                 TYPE string VALUE ''display_name'',
+        transport_request            TYPE string VALUE ''transport_request'',
+        customizing_request          TYPE string VALUE ''customizing_request'',
+        labels                       TYPE string VALUE ''labels'',
+        ignore_subpackages           TYPE string VALUE ''ignore_subpackages'',
+        write_protected              TYPE string VALUE ''write_protected'',
+        only_local_objects           TYPE string VALUE ''only_local_objects'',
+        main_language_only           TYPE string VALUE ''main_language_only'',
+        checks                       TYPE string VALUE ''checks'',
+        code_inspector_check_variant TYPE string VALUE ''code_inspector_check_variant'',
+        block_commit                 TYPE string VALUE ''block_commit'',
+      END OF c_id .
+    CONSTANTS:
+      BEGIN OF c_event,
+        save                       TYPE string VALUE ''save'',
+        choose_transport_request   TYPE string VALUE ''choose_transport_request'',
+        choose_customizing_request TYPE string VALUE ''choose_customizing_request'',
+        choose_labels              TYPE string VALUE ''choose-labels'',
+        choose_check_variant       TYPE string VALUE ''choose_check_variant'',
+      END OF c_event .
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA ms_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings .
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception .
+    METHODS choose_labels
+      RAISING
+        zcx_abapgit_exception .
+    METHODS choose_check_variant
+      IMPORTING
+        iv_is_return TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+    METHODS choose_transport_request
+      RAISING
+        zcx_abapgit_exception .
+    METHODS choose_customizing_request
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_customizing_included
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS handle_picklist_state
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION.
+ 
+ 
+  METHOD choose_check_variant.
+ 
+    DATA ls_variant         TYPE zif_abapgit_code_inspector=>ty_variant.
+    DATA lv_popup_cancelled TYPE abap_bool.
+ 
+    IF iv_is_return = abap_false.
+ 
+      mo_popup_picklist = zcl_abapgit_popup_code_insp=>create(
+        )->create_picklist(
+        )->set_id( c_event-choose_check_variant
+        )->set_in_page( abap_false ).
+ 
+    ELSE.
+ 
+      lv_popup_cancelled = mo_popup_picklist->was_cancelled( ).
+      IF lv_popup_cancelled = abap_false.
+        mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_variant ).
+        IF ls_variant IS NOT INITIAL.
+          mo_form_data->set(
+            iv_key = c_id-code_inspector_check_variant
+            iv_val = ls_variant-name ).
+        ENDIF.
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_customizing_request.
+ 
+    DATA:
+      ls_transport_type      TYPE zif_abapgit_definitions=>ty_transport_type,
+      lv_customizing_request TYPE trkorr.
+ 
+    ls_transport_type-request = zif_abapgit_cts_api=>c_transport_type-cust_request.
+    ls_transport_type-task    = zif_abapgit_cts_api=>c_transport_type-cust_task.
+ 
+    lv_customizing_request = zcl_abapgit_ui_factory=>get_popups( )->popup_transport_request( ls_transport_type ).
+ 
+    IF lv_customizing_request IS NOT INITIAL.
+      mo_form_data->set(
+        iv_key = c_id-customizing_request
+        iv_val = lv_customizing_request ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_labels.
+ 
+    DATA:
+      lv_old_labels TYPE string,
+      lv_new_labels TYPE string.
+ 
+    lv_old_labels = mo_form_data->get( c_id-labels ).
+ 
+    lv_new_labels = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_labels( lv_old_labels ).
+ 
+    mo_form_data->set(
+      iv_key = c_id-labels
+      iv_val = lv_new_labels ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_transport_request.
+ 
+    DATA: lv_transport_request TYPE trkorr.
+ 
+    lv_transport_request = zcl_abapgit_ui_factory=>get_popups( )->popup_transport_request( ).
+ 
+    IF lv_transport_request IS NOT INITIAL.
+      mo_form_data->set(
+        iv_key = c_id-transport_request
+        iv_val = lv_transport_request ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_repo = io_repo.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_locl.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Local Settings & Checks''
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_local_settings )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA: li_package TYPE REF TO zif_abapgit_sap_package.
+ 
+    li_package = zcl_abapgit_factory=>get_sap_package( mo_repo->get_package( ) ).
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = ''repo-local-settings-form''
+      iv_help_page = ''https://docs.abapgit.org/settings-local.html'' ).
+ 
+    ro_form->start_group(
+      iv_name        = c_id-local
+      iv_label       = ''Local Settings''
+      iv_hint        = ''Settings valid for this system only''
+    )->text(
+      iv_name        = c_id-display_name
+      iv_label       = ''Display Name''
+      iv_hint        = ''Name to show instead of original repo name (optional)'' ).
+ 
+    IF li_package->are_changes_recorded_in_tr_req( ) = abap_true.
+      ro_form->text(
+        iv_name        = c_id-transport_request
+        iv_side_action = c_event-choose_transport_request
+        iv_label       = |Transport Request|
+        iv_hint        = ''Transport request; All changes are recorded therein and no transport popup appears|'' ).
+    ENDIF.
+ 
+    IF is_customizing_included( ) = abap_true.
+      ro_form->text(
+        iv_name        = c_id-customizing_request
+        iv_side_action = c_event-choose_customizing_request
+        iv_label       = |Customizing Request|
+        iv_hint        = ''Customizing request; All changes are recorded therein and no customizing popup appears|'' ).
+    ENDIF.
+ 
+    ro_form->text(
+      iv_name        = c_id-labels
+      iv_side_action = c_event-choose_labels
+      iv_label       = |Labels (comma-separated, allowed chars: "{ zcl_abapgit_repo_labels=>c_allowed_chars }")|
+      iv_hint        = ''Comma-separated labels for grouping and repo organization (optional)''
+    )->checkbox(
+      iv_name        = c_id-write_protected
+      iv_label       = ''Write Protected''
+      iv_hint        = ''Lock repository against changes from remote (pull)''
+    )->checkbox(
+      iv_name        = c_id-ignore_subpackages
+      iv_label       = ''Ignore Subpackages''
+      iv_hint        = ''Syncronize root package only''
+    )->checkbox(
+      iv_name        = c_id-only_local_objects
+      iv_label       = ''Only Local Objects''
+      iv_hint        = ''Ignore objects imported from other systems; serialize only objects created in this system''
+    )->checkbox(
+      iv_name        = c_id-main_language_only
+      iv_label       = ''Only Serialize Main Language''
+      iv_hint        = ''Ignore translations; serialize only main language of repository''
+    )->start_group(
+      iv_name        = c_id-checks
+      iv_label       = ''Local Checks''
+      iv_hint        = ''Code Inspector check performed to run from menu and before commit''
+    )->text(
+      iv_name        = c_id-code_inspector_check_variant
+      iv_side_action = c_event-choose_check_variant
+      iv_label       = ''Code Inspector Check Variant''
+      iv_hint        = ''Global check variant for Code Inspector or ABAP Test Cockpit''
+    )->checkbox(
+      iv_name        = c_id-block_commit
+      iv_label       = ''Block Commit If Code Inspection Has Errors''
+      iv_hint        = ''Prevent staging if errors of priority 1 or 2 were found during check''
+    )->command(
+      iv_label       = ''Save Settings''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-save
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_picklist_state.
+ 
+    IF mo_popup_picklist IS BOUND AND
+      ( mo_popup_picklist->is_fulfilled( ) = abap_true OR mo_popup_picklist->is_in_page( ) = abap_false ).
+      " Picklist is either fullfilled OR
+      " it was on its own page and user went back from it via F3/ESC and the picklist had no "graceful back" handler
+      CASE mo_popup_picklist->id( ).
+        WHEN c_event-choose_check_variant.
+          choose_check_variant( iv_is_return = abap_true ).
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( |Unexpected picklist id { mo_popup_picklist->id( ) }| ).
+      ENDCASE.
+ 
+      CLEAR mo_popup_picklist.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_customizing_included.
+ 
+    DATA lt_files TYPE zif_abapgit_definitions=>ty_files_item_tt.
+ 
+    lt_files = mo_repo->get_files_local( ).
+ 
+    READ TABLE lt_files TRANSPORTING NO FIELDS
+      WITH KEY item-obj_type = zif_abapgit_data_config=>c_data_type-tabu. "todo
+    IF sy-subrc = 0.
+      rv_result = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    DATA: li_package TYPE REF TO zif_abapgit_sap_package.
+ 
+    li_package = zcl_abapgit_factory=>get_sap_package( mo_repo->get_package( ) ).
+ 
+    " Get settings from DB
+    ms_settings = mo_repo->get_local_settings( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Local Settings
+    ro_form_data->set(
+      iv_key = c_id-display_name
+      iv_val = ms_settings-display_name ).
+ 
+    IF li_package->are_changes_recorded_in_tr_req( ) = abap_true.
+      ro_form_data->set(
+        iv_key = c_id-transport_request
+        iv_val = ms_settings-transport_request ).
+    ENDIF.
+ 
+    IF is_customizing_included( ) = abap_true.
+      ro_form_data->set(
+        iv_key = c_id-customizing_request
+        iv_val = ms_settings-customizing_request ).
+    ENDIF.
+ 
+    ro_form_data->set(
+      iv_key = c_id-labels
+      iv_val = ms_settings-labels ).
+    ro_form_data->set(
+      iv_key = c_id-ignore_subpackages
+      iv_val = boolc( ms_settings-ignore_subpackages = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-main_language_only
+      iv_val = boolc( ms_settings-main_language_only = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-write_protected
+      iv_val = boolc( ms_settings-write_protected = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-only_local_objects
+      iv_val = boolc( ms_settings-only_local_objects = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-code_inspector_check_variant
+      iv_val = |{ ms_settings-code_inspector_check_variant }| ).
+    ro_form_data->set(
+      iv_key = c_id-block_commit
+      iv_val = boolc( ms_settings-block_commit = abap_true ) ) ##TYPE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+ 
+    ms_settings-display_name                 = mo_form_data->get( c_id-display_name ).
+    ms_settings-transport_request            = mo_form_data->get( c_id-transport_request ).
+    ms_settings-customizing_request          = mo_form_data->get( c_id-customizing_request ).
+    ms_settings-labels                       = zcl_abapgit_repo_labels=>normalize( mo_form_data->get( c_id-labels ) ).
+    ms_settings-ignore_subpackages           = mo_form_data->get( c_id-ignore_subpackages ).
+    ms_settings-main_language_only           = mo_form_data->get( c_id-main_language_only ).
+    ms_settings-write_protected              = mo_form_data->get( c_id-write_protected ).
+    ms_settings-only_local_objects           = mo_form_data->get( c_id-only_local_objects ).
+    ms_settings-code_inspector_check_variant = mo_form_data->get( c_id-code_inspector_check_variant ).
+    ms_settings-block_commit                 = mo_form_data->get( c_id-block_commit ).
+ 
+    mo_repo->set_local_settings( ms_settings ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+    MESSAGE ''Settings succesfully saved'' TYPE ''S''.
+ 
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lx_error               TYPE REF TO zcx_abapgit_exception,
+      lv_transport_request   TYPE trkorr,
+      lv_customizing_request TYPE trkorr,
+      lv_check_variant       TYPE sci_chkv.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    lv_transport_request = io_form_data->get( c_id-transport_request ).
+    IF lv_transport_request IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_transport=>validate_transport_request( lv_transport_request ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = c_id-transport_request
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    lv_customizing_request = io_form_data->get( c_id-customizing_request ).
+    IF lv_customizing_request IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_transport=>validate_transport_request( lv_customizing_request ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = c_id-customizing_request
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    lv_check_variant = to_upper( io_form_data->get( c_id-code_inspector_check_variant ) ).
+    IF lv_check_variant IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( )
+            )->validate_check_variant( lv_check_variant ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = c_id-code_inspector_check_variant
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF io_form_data->get( c_id-block_commit ) = abap_true AND lv_check_variant IS INITIAL.
+      ro_validation_log->set(
+        iv_key = c_id-block_commit
+        iv_val = |If block commit is active, a check variant has to be maintained| ).
+    ENDIF.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate( io_form_data->get( c_id-labels ) ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        ro_validation_log->set(
+          iv_key = c_id-labels
+          iv_val = lx_error->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-choose_transport_request.
+ 
+        choose_transport_request( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-choose_customizing_request.
+ 
+        choose_customizing_request( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-choose_labels.
+ 
+        choose_labels( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-choose_check_variant.
+ 
+        choose_check_variant( ).
+ 
+      WHEN c_event-save.
+        " Validate form entries before saving
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+    IF mo_popup_picklist IS BOUND. " Uniform popup state handling
+      " This should happen only for a new popup because
+      " on the first re-render main component event handling is blocked
+      " and not called again until the popup distruction
+      IF mo_popup_picklist->is_in_page( ) = abap_true.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      ELSE.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+        rs_handled-page  = zcl_abapgit_gui_page_hoc=>create(
+          ii_child_component = mo_popup_picklist
+          iv_show_as_modal   = abap_true ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    handle_picklist_state( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( \`<div class="repo">\` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+      io_repo               = mo_repo
+      iv_show_commit        = abap_false
+      iv_interactive_branch = abap_true ) ).
+ 
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+ 
+    ri_html->add( \`</div>\` ).
+ 
+    IF mo_popup_picklist IS NOT BOUND OR mo_popup_picklist->is_in_page( ) = abap_false.
+      register_handlers( ).
+    ELSEIF mo_popup_picklist->is_in_page( ) = abap_true.
+      " Block usual page events if the popup is an in-page popup
+      ri_html->add( zcl_abapgit_gui_in_page_modal=>create( mo_popup_picklist ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_SETT_PERS          ', 'CLASS zcl_abapgit_gui_page_sett_pers DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        startup                TYPE string VALUE ''startup'',
+        show_default_repo      TYPE string VALUE ''show_default_repo'',
+        ui                     TYPE string VALUE ''ui'',
+        ui_theme               TYPE string VALUE ''ui_theme'',
+        icon_scaling           TYPE string VALUE ''icon_scaling'',
+        max_lines              TYPE string VALUE ''max_lines'',
+        interaction            TYPE string VALUE ''interaction'',
+        adt_jump_enabled       TYPE string VALUE ''adt_jump_enabled'',
+        link_hints_enabled     TYPE string VALUE ''link_hints_enabled'',
+        link_hint_key          TYPE string VALUE ''link_hint_key'',
+        hotkeys                TYPE string VALUE ''hotkeys'',
+        resources              TYPE string VALUE ''resources'',
+        parallel_proc_disabled TYPE string VALUE ''parallel_proc_disabled'',
+        hide_sapgui_hint       TYPE string VALUE ''hide_sapgui_hint'',
+        activate_wo_popup      TYPE string VALUE ''activate_wo_popup'',
+        label_colors           TYPE string VALUE ''label_colors'',
+      END OF c_id.
+    CONSTANTS:
+      BEGIN OF c_event,
+        save TYPE string VALUE ''save'',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+ 
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings.
+    DATA ms_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception.
+    METHODS render_repo_labels_help_hint
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_PERS IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_pers.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Personal Settings''
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_toolbar(
+        zif_abapgit_definitions=>c_action-go_settings_personal )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = ''personal-setting-form''
+      iv_help_page = ''https://docs.abapgit.org/guide-settings-personal.html'' ).
+ 
+    ro_form->start_group(
+      iv_name          = c_id-startup
+      iv_label         = ''Startup''
+    )->checkbox(
+      iv_name          = c_id-show_default_repo
+      iv_label         = ''Show Last Opened Repository''
+      iv_hint          = ''Recommended to check, if you are using ADT''
+    )->start_group(
+      iv_name          = c_id-ui
+      iv_label         = ''User Interface''
+    )->radio(
+      iv_name          = c_id-ui_theme
+      iv_default_value = zcl_abapgit_settings=>c_ui_theme-default
+      iv_label         = ''Theme''
+    )->option(
+      iv_label         = ''Default''
+      iv_value         = zcl_abapgit_settings=>c_ui_theme-default
+    )->option(
+      iv_label         = ''Dark''
+      iv_value         = zcl_abapgit_settings=>c_ui_theme-dark
+    )->option(
+      iv_label         = ''Belize''
+      iv_value         = zcl_abapgit_settings=>c_ui_theme-belize
+    )->option(
+      iv_label         = ''Synced with SAP GUI''
+      iv_value         = zcl_abapgit_settings=>c_ui_theme-synced_with_gui
+    )->radio(
+      iv_name          = c_id-icon_scaling
+      iv_default_value = ''''
+      iv_label         = ''Icon Scaling (HDPI)''
+      iv_hint          = ''Adjust size of icons for High DPI displays''
+    )->option(
+      iv_label         = ''Automatic''
+      iv_value         = ''''
+    )->option(
+      iv_label         = ''Small''
+      iv_value         = zcl_abapgit_settings=>c_icon_scaling-small
+    )->option(
+      iv_label         = ''Large''
+      iv_value         = zcl_abapgit_settings=>c_icon_scaling-large
+    )->number(
+      iv_name          = c_id-max_lines
+      iv_label         = ''List Size''
+      iv_hint          = ''Maximum number of objects listed (0 = All)''
+      iv_min           = 0
+      iv_max           = 10000
+    )->textarea(
+      iv_name          = c_id-label_colors
+      iv_rows          = 3
+      iv_label         = \`Repo label colors \` && render_repo_labels_help_hint( )
+    )->start_group(
+      iv_name          = c_id-interaction
+      iv_label         = ''Interaction''
+    )->checkbox(
+      iv_name          = c_id-activate_wo_popup
+      iv_label         = ''Activate Objects Without Popup''
+      iv_hint          = ''Activates objects automatically without showing popup''
+    )->checkbox(
+      iv_name          = c_id-adt_jump_enabled
+      iv_label         = ''Enable Jump to ABAP Development Tools (If Available)''
+      iv_hint          = ''Recommended to check, if you are using ADT''
+    )->checkbox(
+      iv_name          = c_id-link_hints_enabled
+      iv_label         = ''Enable Vimium-like Link Hints''
+      iv_hint          = ''When you hit the key, abapGit will identify clickable things and put a label beside it''
+    )->text(
+      iv_name          = c_id-link_hint_key
+      iv_label         = ''Key to Activate Link Hints''
+      iv_min           = 0
+      iv_max           = 1
+    )->start_group(
+      iv_name          = c_id-resources
+      iv_label         = ''System Resources''
+    )->checkbox(
+      iv_name          = c_id-parallel_proc_disabled
+      iv_label         = ''Disable Parallel Processing''
+      iv_hint          = ''If disabled, abapGit will use only a single thread to serialize objects''
+    )->command(
+      iv_label         = ''Save Settings''
+      iv_cmd_type      = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action        = c_event-save
+    )->command(
+      iv_label         = ''Back''
+      iv_action        = zif_abapgit_definitions=>c_action-go_back ).
+ 
+    " Not available via this form:
+    " - User-specific hotkey settings have been discontinued
+    " - hide_sapgui_hint is set via ZCL_ABAPGIT_SERVICES_ABAPGIT-CHECK_SAPGUI
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    " Get settings from DB
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+    ms_settings = mo_settings->get_user_settings( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Startup
+    ro_form_data->set(
+      iv_key = c_id-show_default_repo
+      iv_val = |{ ms_settings-show_default_repo }| ).
+ 
+    " UI
+    ro_form_data->set(
+      iv_key = c_id-ui_theme
+      iv_val = ms_settings-ui_theme ).
+    ro_form_data->set(
+      iv_key = c_id-icon_scaling
+      iv_val = |{ ms_settings-icon_scaling }| ).
+    ro_form_data->set(
+      iv_key = c_id-max_lines
+      iv_val = |{ ms_settings-max_lines }| ).
+    ro_form_data->set(
+      iv_key = c_id-label_colors
+      iv_val = ms_settings-label_colors ).
+ 
+    " Interaction
+    ro_form_data->set(
+      iv_key = c_id-activate_wo_popup
+      iv_val = boolc( ms_settings-activate_wo_popup = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-adt_jump_enabled
+      iv_val = boolc( ms_settings-adt_jump_enabled = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-link_hints_enabled
+      iv_val = boolc( ms_settings-link_hints_enabled = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-link_hint_key
+      iv_val = |{ ms_settings-link_hint_key }| ).
+ 
+    " Resources
+    ro_form_data->set(
+      iv_key = c_id-parallel_proc_disabled
+      iv_val = boolc( ms_settings-parallel_proc_disabled = abap_true ) ) ##TYPE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_labels_help_hint.
+ 
+    DATA lt_fragments TYPE string_table.
+    DATA lt_labels TYPE string_table.
+    DATA lv_l TYPE string.
+    DATA lo_colors TYPE REF TO zcl_abapgit_string_map.
+ 
+    APPEND \`<p style="margin-bottom: 0.3em">\` TO lt_fragments.
+    APPEND \`Comma-separated list of <code>label:color</code> pairs.\` TO lt_fragments.
+    APPEND \` <code>color</code> part can be either a css style (see below) or <code>#fg/bg</code> pair,\`
+      TO lt_fragments.
+    APPEND \` where <code>fg</code> and <code>bg</code> are RGB color codes (3 or 6 long).\` TO lt_fragments.
+    APPEND \` You can also specify just <code>fg</code> or <code>bg</code>\` TO lt_fragments.
+    APPEND \` (defaults will be used for missing parts).\` TO lt_fragments.
+    APPEND \` E.g. <code>utils:brown, work:#ff0000/880000, client X:#ddd, client Y:#/333</code>\` TO lt_fragments.
+    APPEND \`<br>Available CSS styles:\` TO lt_fragments.
+    APPEND \`</p>\` TO lt_fragments.
+ 
+    APPEND \`white\` TO lt_labels.
+    APPEND \`white-b\` TO lt_labels.
+    APPEND \`white-r\` TO lt_labels.
+    APPEND \`grey\` TO lt_labels.
+    APPEND \`dark-w\` TO lt_labels.
+    APPEND \`dark-y\` TO lt_labels.
+    APPEND \`dark-r\` TO lt_labels.
+    APPEND \`dark-b\` TO lt_labels.
+    APPEND \`lightblue\` TO lt_labels.
+    APPEND \`darkblue\` TO lt_labels.
+    APPEND \`lightgreen\` TO lt_labels.
+    APPEND \`darkgreen\` TO lt_labels.
+    APPEND \`lightred\` TO lt_labels.
+    APPEND \`darkred\` TO lt_labels.
+    APPEND \`yellow\` TO lt_labels.
+    APPEND \`darkyellow\` TO lt_labels.
+    APPEND \`orrange\` TO lt_labels.
+    APPEND \`brown\` TO lt_labels.
+    APPEND \`pink\` TO lt_labels.
+    APPEND \`teal\` TO lt_labels.
+    APPEND \`darkviolet\` TO lt_labels.
+ 
+    lo_colors = zcl_abapgit_string_map=>create( ).
+    LOOP AT lt_labels INTO lv_l.
+      TRY.
+          lo_colors->set(
+            iv_key = lv_l
+            iv_val = lv_l ).
+        CATCH zcx_abapgit_exception.
+      ENDTRY.
+    ENDLOOP.
+ 
+    APPEND zcl_abapgit_gui_chunk_lib=>render_label_list(
+      it_labels       = lt_labels
+      io_label_colors = lo_colors ) TO lt_fragments.
+ 
+    APPEND
+      \`<p style="margin-top: 0.3em">see also <code>rl-*</code> styles in common.css (styles, forgotten here)</p>\`
+      TO lt_fragments.
+ 
+    rv_html = zcl_abapgit_gui_chunk_lib=>render_help_hint( concat_lines_of( table = lt_fragments ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+ 
+    DATA li_persistence TYPE REF TO zif_abapgit_persist_settings.
+ 
+    " Startup
+    ms_settings-show_default_repo = mo_form_data->get( c_id-show_default_repo ).
+ 
+    " UI
+    ms_settings-ui_theme = mo_form_data->get( c_id-ui_theme ).
+    ms_settings-icon_scaling = mo_form_data->get( c_id-icon_scaling ).
+    ms_settings-max_lines = mo_form_data->get( c_id-max_lines ).
+    ms_settings-label_colors = zcl_abapgit_repo_labels=>normalize_colors( mo_form_data->get(  c_id-label_colors ) ).
+ 
+    " Interaction
+    ms_settings-activate_wo_popup = mo_form_data->get( c_id-activate_wo_popup ).
+    ms_settings-adt_jump_enabled = mo_form_data->get( c_id-adt_jump_enabled ).
+    ms_settings-link_hints_enabled = mo_form_data->get( c_id-link_hints_enabled ).
+    ms_settings-link_hint_key = mo_form_data->get( c_id-link_hint_key ).
+ 
+    " Resources
+    ms_settings-parallel_proc_disabled = mo_form_data->get( c_id-parallel_proc_disabled ).
+ 
+    " Store in DB
+    mo_settings->set_user_settings( ms_settings ).
+ 
+    li_persistence = zcl_abapgit_persist_factory=>get_settings( ).
+    li_persistence->modify( mo_settings ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+    MESSAGE ''Settings succesfully saved'' TYPE ''S''.
+ 
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate_colors( io_form_data->get( c_id-label_colors ) ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        ro_validation_log->set(
+          iv_key = c_id-label_colors
+          iv_val = lx_error->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-save.
+        " Validate form entries before saving
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( ''<div class="form-container">'' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( ''</div>'' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_SETT_REMO          ', 'CLASS zcl_abapgit_gui_page_sett_remo DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+    INTERFACES zif_abapgit_gui_hotkeys.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_head_type TYPE c LENGTH 1,
+      BEGIN OF ty_remote_settings,
+        offline         TYPE zif_abapgit_persistence=>ty_repo-offline,
+        url             TYPE zif_abapgit_persistence=>ty_repo-url,
+        branch          TYPE zif_abapgit_git_definitions=>ty_git_branch-name,
+        tag             TYPE zif_abapgit_git_definitions=>ty_git_tag-name,
+        commit          TYPE zif_abapgit_git_definitions=>ty_commit-sha1,
+        pull_request    TYPE string,
+        head_type       TYPE ty_head_type,
+        switched_origin TYPE zif_abapgit_persistence=>ty_repo-switched_origin,
+      END OF ty_remote_settings.
+    CONSTANTS:
+      BEGIN OF c_head_types,
+        branch       TYPE ty_head_type VALUE ''B'',
+        tag          TYPE ty_head_type VALUE ''T'',
+        commit       TYPE ty_head_type VALUE ''C'',
+        pull_request TYPE ty_head_type VALUE ''P'',
+      END OF c_head_types.
+    CONSTANTS:
+      BEGIN OF c_id,
+        general      TYPE string VALUE ''general'',
+        repo_type    TYPE string VALUE ''repo_type'',
+        offline      TYPE string VALUE ''offline'',
+        url          TYPE string VALUE ''url'',
+        head_group   TYPE string VALUE ''head_group'',
+        branch       TYPE string VALUE ''branch'',
+        tag          TYPE string VALUE ''tag'',
+        commit       TYPE string VALUE ''commit'',
+        pull_request TYPE string VALUE ''pull_request'',
+        head_type    TYPE string VALUE ''head_type'',
+      END OF c_id.
+    CONSTANTS:
+      BEGIN OF c_event,
+        save                TYPE string VALUE ''save'',
+        switch              TYPE string VALUE ''switch'',
+        choose_url          TYPE string VALUE ''choose_url'',
+        choose_branch       TYPE string VALUE ''choose_branch'',
+        choose_tag          TYPE string VALUE ''choose_tag'',
+        choose_commit       TYPE string VALUE ''choose_commit'',
+        choose_pull_request TYPE string VALUE ''choose_pull_request'',
+        change_head_type    TYPE string VALUE ''change_head_type'',
+      END OF c_event .
+    CONSTANTS:
+      BEGIN OF c_popup,
+        pull_request TYPE string VALUE ''popup_pull_request'',
+      END OF c_popup.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA ms_settings_snapshot TYPE ty_remote_settings.
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+    DATA mv_refresh_on_back TYPE abap_bool.
+    DATA mv_offline_switch_saved_url TYPE string.
+ 
+    DATA mo_popup_picklist TYPE REF TO zcl_abapgit_gui_picklist.
+ 
+    METHODS get_remote_settings_from_repo
+      IMPORTING
+        io_repo            TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(rs_settings) TYPE ty_remote_settings
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_remote_settings_from_form
+      IMPORTING
+        io_form_data       TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rs_settings) TYPE ty_remote_settings
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_form_schema
+      IMPORTING
+        io_existing_form_data TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS initialize_form_data
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS check_protection
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS validate_form
+      IMPORTING
+        io_form_data             TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS choose_url
+      RETURNING
+        VALUE(rv_url) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS choose_branch
+      IMPORTING
+        iv_is_return TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+    METHODS choose_tag
+      IMPORTING
+        iv_is_return TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+    METHODS choose_pr
+      IMPORTING
+        iv_is_return TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+    METHODS choose_commit
+      RETURNING
+        VALUE(rv_commit) TYPE ty_remote_settings-commit
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS switch_online_offline
+      RAISING
+        zcx_abapgit_exception.
+    METHODS switch_to_branch_tag
+      IMPORTING
+        !iv_name TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS switch_to_commit
+      IMPORTING
+        !iv_revert TYPE abap_bool DEFAULT abap_false
+        !iv_commit TYPE ty_remote_settings-commit OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS switch_to_pull_req
+      IMPORTING
+        !iv_revert TYPE abap_bool DEFAULT abap_false
+        !iv_pull   TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS handle_picklist_state
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_content
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION.
+ 
+ 
+  METHOD check_protection.
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      zcx_abapgit_exception=>raise( ''Unexpected switch for offline repo'' ).
+    ENDIF.
+    IF mo_repo->get_local_settings( )-write_protected = abap_true.
+      zcx_abapgit_exception=>raise( ''Cannot switch. Repository is write-protected in local settings'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_branch.
+ 
+    DATA lv_url         TYPE zif_abapgit_persistence=>ty_repo-url.
+    DATA lv_branch_name TYPE zif_abapgit_persistence=>ty_repo-branch_name.
+    DATA ls_branch      TYPE zif_abapgit_git_definitions=>ty_git_branch.
+    DATA lv_popup_cancelled TYPE abap_bool.
+ 
+    IF iv_is_return = abap_false.
+ 
+      IF mo_form_data->get( c_id-offline ) = abap_true.
+        RETURN.
+      ENDIF.
+ 
+      lv_url         = mo_form_data->get( c_id-url ).
+      lv_branch_name = mo_form_data->get( c_id-branch ).
+ 
+      mo_popup_picklist = zcl_abapgit_popup_branch_list=>create(
+        iv_show_new_option = abap_false
+        iv_url             = lv_url
+        iv_default_branch  = lv_branch_name
+        )->create_picklist(
+        )->set_id( c_event-choose_branch
+        )->set_in_page( ).
+ 
+    ELSE.
+ 
+      lv_popup_cancelled = mo_popup_picklist->was_cancelled( ).
+      IF lv_popup_cancelled = abap_false.
+        mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_branch ).
+        IF ls_branch IS NOT INITIAL.
+          mo_form_data->set(
+            iv_key = c_id-branch
+            iv_val = ls_branch-display_name ).
+        ENDIF.
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_commit.
+ 
+    DATA:
+      lv_url         TYPE string,
+      lv_branch_name TYPE zif_abapgit_persistence=>ty_repo-branch_name,
+      li_popups      TYPE REF TO zif_abapgit_popups.
+ 
+    IF mo_form_data->get( c_id-offline ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    lv_url = mo_form_data->get( c_id-url ).
+    lv_branch_name = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && mo_form_data->get( c_id-branch ).
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+ 
+    rv_commit = li_popups->commit_list_popup(
+      iv_repo_url    = lv_url
+      iv_branch_name = lv_branch_name )-sha1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_pr.
+ 
+    DATA ls_pull         TYPE zif_abapgit_pr_enum_provider=>ty_pull_request.
+    DATA lv_pull_request TYPE ty_remote_settings-pull_request.
+    DATA lv_url TYPE ty_remote_settings-url.
+    DATA lv_popup_cancelled TYPE abap_bool.
+ 
+    IF iv_is_return = abap_false.
+ 
+      IF mo_form_data->get( c_id-offline ) = abap_true.
+        zcx_abapgit_exception=>raise( ''Not possible for offline repositories'' ).
+      ENDIF.
+ 
+      lv_url = mo_form_data->get( c_id-url ).
+      mo_popup_picklist = zcl_abapgit_popup_pull_request=>create( lv_url
+        )->create_picklist(
+        )->set_id( c_event-choose_pull_request
+        )->set_in_page( abap_true ).
+ 
+    ELSE.
+ 
+      lv_popup_cancelled = mo_popup_picklist->was_cancelled( ).
+      IF lv_popup_cancelled = abap_false.
+        mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_pull ).
+        IF ls_pull IS NOT INITIAL.
+          mo_form_data->set(
+            iv_key = c_id-pull_request
+            iv_val = ls_pull-head_url && ''@'' && ls_pull-head_branch ).
+        ENDIF.
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_tag.
+ 
+    DATA ls_tag TYPE zif_abapgit_git_definitions=>ty_git_branch.
+    DATA lv_url TYPE ty_remote_settings-url.
+    DATA lv_popup_cancelled TYPE abap_bool.
+ 
+    IF iv_is_return = abap_false.
+ 
+      IF mo_form_data->get( c_id-offline ) = abap_true.
+        RETURN.
+      ELSEIF mo_repo->is_offline( ) = abap_true.
+        MESSAGE ''Please save conversion to online repository before choosing a tag'' TYPE ''S''.
+        RETURN.
+      ENDIF.
+ 
+      lv_url = mo_form_data->get( c_id-url ).
+      mo_popup_picklist = zcl_abapgit_popup_tag_list=>create( lv_url
+        )->create_picklist(
+        )->set_id( c_event-choose_tag
+        )->set_in_page( ).
+ 
+    ELSE.
+ 
+      lv_popup_cancelled = mo_popup_picklist->was_cancelled( ).
+      IF lv_popup_cancelled = abap_false.
+        mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_tag ).
+        IF ls_tag IS NOT INITIAL.
+          mo_form_data->set(
+            iv_key = c_id-tag
+            iv_val = ls_tag-display_name ).
+        ENDIF.
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_url.
+ 
+    " todo, get url history from DB and show selection popup #3639
+    rv_url = ''''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    mo_repo              = io_repo.
+    ms_settings_snapshot = get_remote_settings_from_repo( mo_repo ).
+    mo_form              = get_form_schema( ).
+    mo_form_data         = initialize_form_data( ).
+    CREATE OBJECT mo_validation_log.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_remo.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Remote Settings''
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_remote_settings )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA:
+      lv_button      TYPE string,
+      lv_label       TYPE string,
+      lv_icon        TYPE string,
+      lv_hint        TYPE string,
+      lv_placeholder TYPE string,
+      lv_offline     TYPE abap_bool,
+      lv_head_type   TYPE ty_head_type.
+ 
+    IF io_existing_form_data IS BOUND AND io_existing_form_data->is_empty( ) = abap_false.
+      lv_offline = io_existing_form_data->get( c_id-offline ).
+      IF lv_offline = abap_false.
+        lv_head_type = io_existing_form_data->get( c_id-head_type ).
+      ENDIF.
+    ELSE.
+      lv_offline   = ms_settings_snapshot-offline.
+      lv_head_type = ms_settings_snapshot-head_type.
+    ENDIF.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = ''repo-remote-settings-form''
+      iv_help_page = ''https://docs.abapgit.org/settings-remote.html'' ).
+ 
+    IF lv_offline = abap_true.
+      lv_button      = ''Switch to Online''.
+      lv_icon        = ''plug/darkgrey''.
+      lv_label       = ''Repository Name''.
+    ELSE.
+      lv_button      = ''Switch to Offline''.
+      lv_icon        = ''cloud-upload-alt/darkgrey''.
+      lv_label       = ''Git Repository URL''.
+      lv_hint        = ''URL of original repository''.
+      lv_placeholder = ''https://github.com/...git''.
+    ENDIF.
+ 
+    ro_form->start_group(
+      iv_name  = c_id-general
+      iv_label = ''General''
+      iv_hint  = ''Change the general type and origin of the repository''
+    )->text(
+      iv_name        = c_id-repo_type
+      iv_label       = |Type of Repository: { zcl_abapgit_html=>icon( lv_icon ) }|
+      iv_readonly    = abap_true
+    )->hidden( c_id-offline
+    )->text(
+      iv_name        = c_id-url
+      iv_condense    = abap_true
+      iv_label       = lv_label
+      iv_hint        = lv_hint
+      iv_placeholder = lv_placeholder ).
+ 
+    IF lv_offline = abap_false.
+ 
+      ro_form->start_group(
+        iv_name  = c_id-head_group
+        iv_label = ''Head''
+      )->radio(
+        iv_label  = ''Type''
+        iv_name   = c_id-head_type
+        iv_action = c_event-change_head_type
+      )->option(
+        iv_label = ''Branch''
+        iv_value = c_head_types-branch
+      )->option(
+        iv_label = ''Tag''
+        iv_value = c_head_types-tag
+      )->option(
+        iv_label = ''Commit''
+        iv_value = c_head_types-commit
+      )->option(
+        iv_label = ''Pull Request''
+        iv_value = c_head_types-pull_request ).
+ 
+      IF lv_head_type = c_head_types-branch OR
+         lv_head_type = c_head_types-commit.
+        ro_form->text(
+          iv_name        = c_id-branch
+          iv_label       = ''Branch''
+          iv_required    = abap_true
+          iv_side_action = c_event-choose_branch ).
+      ENDIF.
+ 
+      IF lv_head_type = c_head_types-tag.
+        ro_form->text(
+          iv_name        = c_id-tag
+          iv_label       = ''Tag''
+          iv_required    = abap_true
+          iv_side_action = c_event-choose_tag ).
+      ENDIF.
+ 
+      IF lv_head_type = c_head_types-commit.
+        ro_form->text(
+          iv_name        = c_id-commit
+          iv_label       = ''Commit''
+          iv_required    = abap_true
+          iv_min         = 40
+          iv_max         = 40
+          iv_side_action = c_event-choose_commit ).
+      ENDIF.
+ 
+      IF lv_head_type = c_head_types-pull_request.
+        ro_form->text(
+          iv_name        = c_id-pull_request
+          iv_label       = ''Pull Request''
+          iv_required    = abap_true
+          iv_side_action = c_event-choose_pull_request ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+    ro_form->command(
+      iv_label    = ''Save Settings''
+      iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action   = c_event-save
+    )->command(
+      iv_label  = lv_button
+      iv_action = c_event-switch
+    )->command(
+      iv_label  = ''Back''
+      iv_action = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_remote_settings_from_form.
+ 
+    rs_settings-url = io_form_data->get( c_id-url ).
+    rs_settings-offline = io_form_data->get( c_id-offline ).
+ 
+    IF rs_settings-offline = abap_false.
+      rs_settings-head_type = io_form_data->get( c_id-head_type ).
+ 
+      CASE rs_settings-head_type.
+        WHEN c_head_types-branch.
+          rs_settings-branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix &&
+            io_form_data->get( c_id-branch ).
+        WHEN c_head_types-tag.
+          rs_settings-tag = zif_abapgit_git_definitions=>c_git_branch-tags_prefix &&
+            io_form_data->get( c_id-tag ).
+        WHEN c_head_types-commit.
+          rs_settings-branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix &&
+            io_form_data->get( c_id-branch ).
+          rs_settings-commit = io_form_data->get( c_id-commit ).
+        WHEN c_head_types-pull_request.
+          rs_settings-pull_request = io_form_data->get( c_id-pull_request ).
+      ENDCASE.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_remote_settings_from_repo.
+ 
+    DATA: lo_repo_online  TYPE REF TO zcl_abapgit_repo_online,
+          lo_repo_offline TYPE REF TO zcl_abapgit_repo_offline,
+          lv_branch       TYPE ty_remote_settings-branch.
+ 
+    IF io_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= io_repo.
+ 
+      rs_settings-url = lo_repo_online->get_url( ).
+      rs_settings-offline = abap_false.
+      rs_settings-switched_origin = lo_repo_online->get_switched_origin( ).
+ 
+      IF lo_repo_online->get_selected_commit( ) IS NOT INITIAL.
+        rs_settings-commit = lo_repo_online->get_selected_commit( ).
+        rs_settings-branch = lo_repo_online->get_selected_branch( ).
+        rs_settings-head_type = c_head_types-commit.
+      ELSEIF lo_repo_online->get_switched_origin( ) IS NOT INITIAL.
+        " get_switched_origin( ) returns the original repo url + HEAD concatenated with @
+        " get_branch( ) returns the branch of the PR in the source repo
+        " get_url( ) returns the source repo of the PR branch
+ 
+        rs_settings-switched_origin = lo_repo_online->get_switched_origin( ).
+        SPLIT rs_settings-switched_origin AT ''@'' INTO rs_settings-url rs_settings-branch.
+        IF rs_settings-branch CP zif_abapgit_git_definitions=>c_git_branch-tags.
+          rs_settings-tag = rs_settings-branch.
+          CLEAR rs_settings-branch.
+        ENDIF.
+ 
+        lv_branch = lo_repo_online->get_selected_branch( ).
+        REPLACE FIRST OCCURRENCE OF zif_abapgit_git_definitions=>c_git_branch-heads_prefix IN lv_branch WITH space.
+        CONDENSE lv_branch.
+        rs_settings-pull_request = |{ lo_repo_online->get_url( ) }@{ lv_branch }|.
+        rs_settings-head_type = c_head_types-pull_request.
+      ELSE.
+        rs_settings-branch = lo_repo_online->get_selected_branch( ).
+        rs_settings-head_type = c_head_types-branch.
+ 
+        IF rs_settings-branch CP zif_abapgit_git_definitions=>c_git_branch-tags.
+          rs_settings-head_type = c_head_types-tag.
+          rs_settings-tag = rs_settings-branch.
+          CLEAR rs_settings-branch.
+        ENDIF.
+      ENDIF.
+ 
+    ELSE.
+      lo_repo_offline ?= io_repo.
+ 
+      rs_settings-url = lo_repo_offline->get_name( ).
+      rs_settings-offline = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_picklist_state.
+ 
+    IF mo_popup_picklist IS BOUND AND
+      ( mo_popup_picklist->is_fulfilled( ) = abap_true OR mo_popup_picklist->is_in_page( ) = abap_false ).
+      " Picklist is either fullfilled OR
+      " it was on its own page and user went back from it via F3/ESC and the picklist had no "graceful back" handler
+      CASE mo_popup_picklist->id( ).
+        WHEN c_event-choose_pull_request.
+          choose_pr( iv_is_return = abap_true ).
+        WHEN c_event-choose_branch.
+          choose_branch( iv_is_return = abap_true ).
+        WHEN c_event-choose_tag.
+          choose_tag( iv_is_return = abap_true ).
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( |Unexpected picklist id { mo_popup_picklist->id( ) }| ).
+      ENDCASE.
+ 
+      CLEAR mo_popup_picklist.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD initialize_form_data.
+ 
+    DATA:
+      lv_type TYPE string,
+      lv_head TYPE string.
+ 
+    CREATE OBJECT ro_form_data.
+ 
+    IF ms_settings_snapshot-offline = abap_true.
+      lv_type = ''Offline repository''.
+    ELSE.
+      lv_type = ''Online repository''.
+    ENDIF.
+ 
+    ro_form_data->set(
+      iv_key = c_id-offline
+      iv_val = ms_settings_snapshot-offline ).
+    ro_form_data->set(
+      iv_key = c_id-repo_type
+      iv_val = lv_type ).
+    ro_form_data->set(
+      iv_key = c_id-url
+      iv_val = ms_settings_snapshot-url ).
+ 
+    IF ms_settings_snapshot-offline = abap_false.
+      ro_form_data->set(
+        iv_key = c_id-head_type
+        iv_val = ms_settings_snapshot-head_type ).
+ 
+      " When pull request is selected the previously selected branch/tag is also loaded to be able to switch back to it
+      lv_head = zcl_abapgit_git_branch_list=>get_display_name( ms_settings_snapshot-branch ).
+      ro_form_data->set(
+        iv_key = c_id-branch
+        iv_val = lv_head ).
+ 
+      lv_head = zcl_abapgit_git_branch_list=>get_display_name( ms_settings_snapshot-tag ).
+      ro_form_data->set(
+        iv_key = c_id-tag
+        iv_val = lv_head ).
+ 
+      ro_form_data->set(
+        iv_key = c_id-commit
+        iv_val = ms_settings_snapshot-commit ).
+ 
+      ro_form_data->set(
+        iv_key = c_id-pull_request
+        iv_val = ms_settings_snapshot-pull_request ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+      io_repo               = mo_repo
+      iv_show_commit        = abap_false
+      iv_interactive_branch = abap_false ) ).
+ 
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+ 
+    DATA:
+      lo_repo_online  TYPE REF TO zcl_abapgit_repo_online,
+      lo_repo_offline TYPE REF TO zcl_abapgit_repo_offline,
+      ls_settings_new TYPE ty_remote_settings.
+ 
+    ls_settings_new = get_remote_settings_from_form( mo_form_data ).
+ 
+    " Switch online / offline
+    IF ls_settings_new-offline <> ms_settings_snapshot-offline.
+      " Remember key, switch, retrieve new instance (todo, refactor #2244)
+      mo_repo->switch_repo_type( ls_settings_new-offline ).
+      mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ).
+    ENDIF.
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      " Offline: Save repo name
+      lo_repo_offline ?= mo_repo.
+      lo_repo_offline->set_name( ls_settings_new-url ).
+    ELSE.
+      " Online: Save url
+      lo_repo_online ?= mo_repo.
+      lo_repo_online->set_url( ls_settings_new-url ).
+    ENDIF.
+ 
+    CASE ls_settings_new-head_type.
+      WHEN c_head_types-branch.
+        switch_to_pull_req( iv_revert = abap_true ).
+        switch_to_commit( iv_revert = abap_true ).
+        switch_to_branch_tag( ls_settings_new-branch ).
+      WHEN c_head_types-tag.
+        switch_to_pull_req( iv_revert = abap_true ).
+        switch_to_commit( iv_revert = abap_true ).
+        switch_to_branch_tag( ls_settings_new-tag ).
+      WHEN c_head_types-commit.
+        switch_to_pull_req( iv_revert = abap_true ).
+        switch_to_commit( iv_commit = ls_settings_new-commit ).
+      WHEN c_head_types-pull_request.
+        switch_to_commit( iv_revert = abap_true ).
+        switch_to_pull_req( iv_pull = ls_settings_new-pull_request ).
+    ENDCASE.
+ 
+    IF mo_repo->is_offline( ) = abap_false AND ls_settings_new-head_type <> c_head_types-pull_request.
+      " Switching from PR to something else will reset the URL in repo->switch_origin( space )
+      " -> set URL again
+      lo_repo_online->set_url( ls_settings_new-url ).
+    ENDIF.
+ 
+    COMMIT WORK AND WAIT.
+ 
+    MESSAGE ''Settings succesfully saved'' TYPE ''S''.
+ 
+    mv_refresh_on_back = abap_true.
+    ms_settings_snapshot = get_remote_settings_from_repo( mo_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_online_offline.
+ 
+    DATA: lv_offline_new TYPE abap_bool,
+          lv_url         TYPE ty_remote_settings-url,
+          lv_branch      TYPE ty_remote_settings-branch.
+ 
+    lv_offline_new = boolc( mo_form_data->get( c_id-offline ) = abap_false ).
+    mo_form_data->set(
+      iv_key = c_id-offline
+      iv_val = lv_offline_new ).
+ 
+    IF lv_offline_new = abap_true.
+      lv_url = mo_form_data->get( c_id-url ).
+      mv_offline_switch_saved_url = lv_url.
+      IF lv_url CP ''http*''.
+        lv_url = zcl_abapgit_url=>name( lv_url ).
+        mo_form_data->set(
+          iv_key = c_id-url
+          iv_val = lv_url ).
+      ENDIF.
+ 
+    ELSE.
+      IF mv_offline_switch_saved_url IS NOT INITIAL.
+        mo_form_data->set(
+          iv_key = c_id-url
+          iv_val = mv_offline_switch_saved_url ).
+      ENDIF.
+ 
+      lv_url = mo_form_data->get( c_id-url ).
+      IF mo_form_data->get( c_id-head_type ) IS INITIAL.
+        TRY.
+            mo_form_data->set(
+              iv_key = c_id-head_type
+              iv_val = c_head_types-branch ).
+ 
+            IF lv_url CP ''http*''.
+              lv_branch = zcl_abapgit_git_transport=>branches( lv_url )->get_head_symref( ).
+              mo_form_data->set(
+                iv_key = c_id-branch
+                iv_val = lv_branch ).
+            ENDIF.
+          CATCH zcx_abapgit_exception ##NO_HANDLER.
+        ENDTRY.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_to_branch_tag.
+ 
+    DATA lo_repo TYPE REF TO zcl_abapgit_repo_online.
+ 
+    check_protection( ).
+    lo_repo ?= mo_repo.
+    lo_repo->select_branch( iv_name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_to_commit.
+ 
+    DATA lo_repo TYPE REF TO zcl_abapgit_repo_online.
+ 
+    check_protection( ).
+ 
+    lo_repo ?= mo_repo.
+ 
+    IF iv_revert = abap_true.
+      lo_repo->select_commit( '''' ).
+    ELSE.
+      lo_repo->select_commit( iv_commit ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_to_pull_req.
+ 
+    DATA:
+      lo_repo   TYPE REF TO zcl_abapgit_repo_online,
+      lv_url    TYPE ty_remote_settings-url,
+      lv_branch TYPE ty_remote_settings-branch.
+ 
+    check_protection( ).
+ 
+    lo_repo ?= mo_repo.
+ 
+    " Switching twice does not work so reset to original repo first
+    lo_repo->switch_origin( '''' ).
+ 
+    IF iv_revert = abap_false.
+      SPLIT iv_pull AT ''@'' INTO lv_url lv_branch.
+      lo_repo->switch_origin(
+        iv_url    = lv_url
+        iv_branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && lv_branch ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lx_error                 TYPE REF TO zcx_abapgit_exception,
+      lo_branch_list           TYPE REF TO zcl_abapgit_git_branch_list,
+      lo_url                   TYPE REF TO zcl_abapgit_git_url,
+      lv_offline               TYPE abap_bool,
+      lv_head_type             TYPE ty_head_type,
+      lv_branch                TYPE ty_remote_settings-branch,
+      lv_url                   TYPE ty_remote_settings-url,
+      lv_branch_check_error_id TYPE string,
+      lv_pull_request          TYPE ty_remote_settings-pull_request,
+      lv_commit                TYPE ty_remote_settings-commit.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+    lv_offline = io_form_data->get( c_id-offline ).
+    lv_url = io_form_data->get( c_id-url ).
+ 
+    IF lv_offline = abap_true AND lv_url IS INITIAL.
+      ro_validation_log->set(
+        iv_key = c_id-url
+        iv_val = ''Enter a name for the repository and save'' ).
+    ENDIF.
+ 
+    IF lv_offline = abap_false AND lv_url NP ''http*''.
+      ro_validation_log->set(
+        iv_key = c_id-url
+        iv_val = ''Enter the URL of the repository and save'' ).
+    ELSEIF lv_offline = abap_false.
+      TRY.
+          zcl_abapgit_url=>name(
+            iv_url      = lv_url
+            iv_validate = abap_true ).
+ 
+          " Provider-specific URL check
+          CREATE OBJECT lo_url.
+          lo_url->validate_url( lv_url ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = c_id-url
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF lv_offline = abap_false.
+      lv_head_type = io_form_data->get( c_id-head_type ).
+ 
+      CASE lv_head_type.
+        WHEN c_head_types-branch.
+          lv_branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && io_form_data->get( c_id-branch ).
+          CONDENSE lv_branch.
+          lv_branch_check_error_id = c_id-branch.
+        WHEN c_head_types-tag.
+          lv_branch = zif_abapgit_git_definitions=>c_git_branch-tags_prefix && io_form_data->get( c_id-tag ).
+          CONDENSE lv_branch.
+          lv_branch_check_error_id = c_id-tag.
+        WHEN c_head_types-pull_request.
+          lv_pull_request = io_form_data->get( c_id-pull_request ).
+          SPLIT lv_pull_request AT ''@'' INTO lv_url lv_branch.
+          IF lv_branch IS NOT INITIAL.
+            lv_branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && lv_branch.
+          ENDIF.
+          lv_branch_check_error_id = c_id-pull_request.
+        WHEN c_head_types-commit.
+          lv_commit = io_form_data->get( c_id-commit ).
+ 
+          " Cannot check for commit existence currently (needs API that doesn''t rely on finding the first commit
+          " in the branch), check format instead
+          IF lv_commit CN ''0123456789abcdef''.
+            ro_validation_log->set(
+              iv_key = c_id-commit
+              iv_val = ''Commit needs to be hexadecimal and in lowercase'' ).
+          ENDIF.
+        WHEN OTHERS.
+          ro_validation_log->set(
+            iv_key = c_id-head_type
+            iv_val = ''Unknown head type'' ).
+      ENDCASE.
+ 
+      TRY.
+          IF lv_branch IS NOT INITIAL.
+            lo_branch_list = zcl_abapgit_git_transport=>branches( lv_url ).
+            lo_branch_list->find_by_name( lv_branch ).
+          ENDIF.
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = lv_branch_check_error_id
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA:
+      lv_url    TYPE ty_remote_settings-url,
+      lv_branch TYPE ty_remote_settings-branch,
+      lv_tag    TYPE ty_remote_settings-tag,
+      lv_commit TYPE ty_remote_settings-commit.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        IF mv_refresh_on_back = abap_true.
+          " Note this doesn''t trigger if the tab is switched first
+          mo_repo->refresh( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data = mo_form_data
+          io_check_changes_versus = initialize_form_data( ) ).
+ 
+      WHEN c_event-choose_url.
+        lv_url = choose_url( ).
+ 
+        IF lv_url IS INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ELSE.
+          mo_form_data->set(
+            iv_key = c_id-url
+            iv_val = lv_url ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+      WHEN c_event-change_head_type.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        mo_validation_log->clear( ).
+ 
+      WHEN c_event-choose_branch.
+        choose_branch( ). " Unformly handle state below
+ 
+      WHEN c_event-choose_tag.
+        choose_tag( ). " Unformly handle state below
+ 
+      WHEN c_event-choose_pull_request.
+        choose_pr( ). " Unformly handle state below
+ 
+      WHEN c_event-choose_commit.
+        lv_commit = choose_commit( ).
+ 
+        IF lv_commit IS INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ELSE.
+          mo_form_data->set(
+            iv_key = c_id-commit
+            iv_val = lv_commit ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+      WHEN c_event-switch.
+        switch_online_offline( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-save.
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+    IF mo_popup_picklist IS BOUND. " Uniform popup state handling
+      " This should happen only for a new popup because
+      " on the first re-render main component event handling is blocked
+      " and not called again until the popup distruction
+      IF mo_popup_picklist->is_in_page( ) = abap_true.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      ELSE.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+        rs_handled-page  = zcl_abapgit_gui_page_hoc=>create(
+          ii_child_component = mo_popup_picklist
+          iv_show_as_modal   = abap_true ).
+      ENDIF.
+    ENDIF.
+ 
+    " If staying on form, initialize it with current settings
+    IF rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render AND mo_popup_picklist IS NOT BOUND.
+      " Switching tabs must change the form layout
+      mo_form = get_form_schema( io_existing_form_data = mo_form_data ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions,
+          lv_head_type     TYPE ty_head_type,
+          lv_offline       TYPE abap_bool.
+ 
+    IF mo_form_data IS BOUND AND mo_form_data->is_empty( ) = abap_false.
+      lv_offline = mo_form_data->get( c_id-offline ).
+      IF lv_offline = abap_false.
+        lv_head_type = mo_form_data->get( c_id-head_type ).
+      ENDIF.
+    ELSE.
+      lv_offline = ms_settings_snapshot-offline.
+      IF lv_offline = abap_false.
+        lv_head_type = ms_settings_snapshot-head_type.
+      ENDIF.
+    ENDIF.
+ 
+    ls_hotkey_action-ui_component = ''Remote''.
+ 
+    ls_hotkey_action-description = ''Choose URL''.
+    ls_hotkey_action-action      = c_event-choose_url.
+    ls_hotkey_action-hotkey      = ''u''.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    IF lv_head_type = c_head_types-branch OR
+       lv_head_type = c_head_types-commit.
+      ls_hotkey_action-description = ''Choose Branch''.
+      ls_hotkey_action-action      = c_event-choose_branch.
+      ls_hotkey_action-hotkey      = ''b''.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    IF lv_head_type = c_head_types-tag.
+      ls_hotkey_action-description = ''Choose Tag''.
+      ls_hotkey_action-action      = c_event-choose_tag.
+      ls_hotkey_action-hotkey      = ''t''.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    IF lv_head_type = c_head_types-commit.
+      ls_hotkey_action-description = ''Choose Commit''.
+      ls_hotkey_action-action      = c_event-choose_commit.
+      ls_hotkey_action-hotkey      = ''c''.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    IF lv_head_type = c_head_types-pull_request.
+      ls_hotkey_action-description = ''Choose Pull Request''.
+      ls_hotkey_action-action      = c_event-choose_pull_request.
+      ls_hotkey_action-hotkey      = ''p''.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    IF lv_offline = abap_true.
+      ls_hotkey_action-description = ''Switch to Online''.
+      ls_hotkey_action-action      = c_event-switch.
+      ls_hotkey_action-hotkey      = ''o''.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ELSE.
+      ls_hotkey_action-description = ''Switch to Offline''.
+      ls_hotkey_action-action      = c_event-switch.
+      ls_hotkey_action-hotkey      = ''o''.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    handle_picklist_state( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->wrap(
+      iv_tag     = ''div''
+      iv_class   = ''repo'' " It''s OK because it''s repo settings ... for now
+      ii_content = render_content( ) ).
+ 
+    IF mo_popup_picklist IS NOT BOUND OR mo_popup_picklist->is_in_page( ) = abap_false.
+      register_handlers( ).
+    ELSEIF mo_popup_picklist->is_in_page( ) = abap_true.
+      " Block usual page events if the popup is an in-page popup
+      ri_html->add( zcl_abapgit_gui_in_page_modal=>create( mo_popup_picklist ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_SETT_REPO          ', 'CLASS zcl_abapgit_gui_page_sett_repo DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        dot              TYPE string VALUE ''dot'',
+        main_language    TYPE string VALUE ''main_language'',
+        i18n_langs       TYPE string VALUE ''i18n_langs'',
+        use_lxe          TYPE string VALUE ''use_lxe'',
+        starting_folder  TYPE string VALUE ''starting_folder'',
+        folder_logic     TYPE string VALUE ''folder_logic'',
+        ignore           TYPE string VALUE ''ignore'',
+        requirements     TYPE string VALUE ''requirements'',
+        version_constant TYPE string VALUE ''version_constant'',
+        version_value    TYPE string VALUE ''version_value'',
+      END OF c_id.
+    CONSTANTS:
+      BEGIN OF c_event,
+        save TYPE string VALUE ''save'',
+      END OF c_event .
+    CONSTANTS c_empty_rows TYPE i VALUE 2 ##NO_TEXT.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mv_requirements_count TYPE i .
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_REPO IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_repo = io_repo.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_repo.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Repository Settings''
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_settings )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = ''repo-settings-form''
+                iv_help_page = ''https://docs.abapgit.org/settings-dot-abapgit.html'' ).
+ 
+    ro_form->start_group(
+      iv_name        = c_id-dot
+      iv_label       = ''Repository Settings (.abapgit.xml)''
+      iv_hint        = ''Settings stored in root folder in .abapgit.xml file''
+    )->text(
+      iv_name        = c_id-main_language
+      iv_label       = ''Main Language''
+      iv_hint        = ''Main language of repository (cannot be changed)''
+      iv_readonly    = abap_true
+    )->text(
+      iv_name        = c_id-i18n_langs
+      iv_label       = ''Serialize Translations for These Languages''
+      iv_hint        = ''Comma-separate 2-letter ISO language codes e.g. "DE,ES,..." - should not include main language''
+    )->checkbox(
+      iv_name        = c_id-use_lxe
+      iv_label       = ''Use experimental LXE approach for translations''
+      iv_hint        = ''It''''s mandatory to specify the list of languages above in addition to this setting''
+    )->radio(
+      iv_name        = c_id-folder_logic
+      iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_label       = ''Folder Logic''
+      iv_hint        = ''Define how package folders are named in repository''
+    )->option(
+      iv_label       = ''Prefix''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+    )->option(
+      iv_label       = ''Full''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-full
+    )->option(
+      iv_label       = ''Mixed''
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+    )->text(
+      iv_name        = c_id-starting_folder
+      iv_label       = ''Starting Folder''
+      iv_hint        = ''Root folder that defines where serialization starts''
+    )->textarea(
+      iv_name        = c_id-ignore
+      iv_label       = ''Ignore Files''
+      iv_hint        = ''List of files in starting folder that shall not be serialized''
+    )->table(
+      iv_name        = c_id-requirements
+      iv_label       = ''Requirements''
+      iv_hint        = ''List of software components with minimum release and patch''
+    )->column(
+      iv_label       = ''Software Component''
+      iv_width       = ''40%''
+    )->column(
+      iv_label       = ''Minimum Release''
+      iv_width       = ''30%''
+    )->column(
+      iv_label       = ''Minimum Patch''
+      iv_width       = ''30%''
+    )->text(
+      iv_name        = c_id-version_constant
+      iv_label       = ''Version Constant''
+      iv_placeholder = ''ZVERSION_CLASS=>VERSION_CONSTANT''
+    )->text(
+      iv_name        = c_id-version_value
+      iv_label       = ''Version Value''
+      iv_readonly    = abap_true
+    )->command(
+      iv_label       = ''Save Settings''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-save
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    DATA:
+      lo_dot          TYPE REF TO zcl_abapgit_dot_abapgit,
+      ls_dot          TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit,
+      lv_main_lang    TYPE spras,
+      lv_language     TYPE t002t-sptxt,
+      lv_ignore       TYPE string,
+      ls_requirements LIKE LINE OF ls_dot-requirements,
+      lv_row          TYPE i,
+      lv_val          TYPE string.
+ 
+    " Get settings from DB
+    lo_dot = mo_repo->get_dot_abapgit( ).
+    ls_dot = lo_dot->get_data( ).
+    lv_main_lang = lo_dot->get_main_language( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Repository Settings
+    SELECT SINGLE sptxt INTO lv_language FROM t002t
+      WHERE spras = sy-langu AND sprsl = lv_main_lang.
+    IF sy-subrc <> 0.
+      lv_language = ''Unknown language; Check your .abapgit.xml file''.
+    ENDIF.
+ 
+    ro_form_data->set(
+      iv_key = c_id-main_language
+      iv_val = |{ lv_main_lang } ({ lv_language })| ).
+    ro_form_data->set(
+      iv_key = c_id-i18n_langs
+      iv_val = zcl_abapgit_lxe_texts=>convert_table_to_lang_string( lo_dot->get_i18n_languages( ) ) ).
+    ro_form_data->set(
+      iv_key = c_id-use_lxe
+      iv_val = boolc( lo_dot->use_lxe( ) = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-folder_logic
+      iv_val = ls_dot-folder_logic ).
+    ro_form_data->set(
+      iv_key = c_id-starting_folder
+      iv_val = ls_dot-starting_folder ).
+    ro_form_data->set(
+      iv_key = c_id-version_constant
+      iv_val = ls_dot-version_constant ).
+    TRY.
+        ro_form_data->set(
+          iv_key = c_id-version_value
+          iv_val = zcl_abapgit_version=>get_version_constant_value( ls_dot-version_constant ) ).
+      CATCH zcx_abapgit_exception.
+        ro_form_data->set(
+          iv_key = c_id-version_value
+          iv_val = '''' ).
+    ENDTRY.
+ 
+    lv_ignore = concat_lines_of(
+      table = ls_dot-ignore
+      sep   = cl_abap_char_utilities=>newline ).
+ 
+    ro_form_data->set(
+      iv_key = c_id-ignore
+      iv_val = lv_ignore ).
+ 
+    LOOP AT ls_dot-requirements INTO ls_requirements.
+      lv_row = lv_row + 1.
+      DO 3 TIMES.
+        CASE sy-index.
+          WHEN 1.
+            lv_val = ls_requirements-component.
+          WHEN 2.
+            lv_val = ls_requirements-min_release.
+          WHEN 3.
+            lv_val = ls_requirements-min_patch.
+        ENDCASE.
+        ro_form_data->set(
+          iv_key = |{ c_id-requirements }-{ lv_row }-{ sy-index }|
+          iv_val = lv_val ).
+      ENDDO.
+    ENDLOOP.
+ 
+    DO c_empty_rows TIMES.
+      lv_row = lv_row + 1.
+      DO 3 TIMES.
+        ro_form_data->set(
+          iv_key = |{ c_id-requirements }-{ lv_row }-{ sy-index }|
+          iv_val = '''' ).
+      ENDDO.
+    ENDDO.
+ 
+    mv_requirements_count = lv_row.
+ 
+    ro_form_data->set(
+      iv_key = |{ c_id-requirements }-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = |{ mv_requirements_count }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+ 
+    DATA:
+      lo_dot          TYPE REF TO zcl_abapgit_dot_abapgit,
+      lv_ignore       TYPE string,
+      lt_ignore       TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+      ls_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt.
+ 
+    lo_dot = mo_repo->get_dot_abapgit( ).
+ 
+    lo_dot->set_folder_logic( mo_form_data->get( c_id-folder_logic ) ).
+    lo_dot->set_starting_folder( mo_form_data->get( c_id-starting_folder ) ).
+    lo_dot->set_version_constant( mo_form_data->get( c_id-version_constant ) ).
+ 
+    lo_dot->set_i18n_languages(
+      zcl_abapgit_lxe_texts=>convert_lang_string_to_table(
+        iv_langs              = mo_form_data->get( c_id-i18n_langs )
+        iv_skip_main_language = lo_dot->get_main_language( ) ) ).
+    lo_dot->use_lxe( boolc( mo_form_data->get( c_id-use_lxe ) = abap_true ) ).
+ 
+    " Remove all ignores
+    lt_ignore = lo_dot->get_data( )-ignore.
+    LOOP AT lt_ignore INTO lv_ignore.
+      lo_dot->remove_ignore( iv_path = ''''
+                             iv_filename = lv_ignore ).
+    ENDLOOP.
+ 
+    " Add newly entered ignores
+    lt_ignore = zcl_abapgit_convert=>split_string( mo_form_data->get( c_id-ignore ) ).
+    LOOP AT lt_ignore INTO lv_ignore.
+      lv_ignore = condense( lv_ignore ).
+      IF lv_ignore IS NOT INITIAL.
+        lo_dot->add_ignore( iv_path = ''''
+                            iv_filename = lv_ignore ).
+      ENDIF.
+    ENDLOOP.
+ 
+    " Requirements
+    DO mv_requirements_count TIMES.
+      ls_requirements-component   = to_upper( mo_form_data->get( |{ c_id-requirements }-{ sy-index }-1| ) ).
+      ls_requirements-min_release = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-2| ).
+      ls_requirements-min_patch   = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-3| ).
+      APPEND ls_requirements TO lt_requirements.
+    ENDDO.
+ 
+    SORT lt_requirements BY component min_release min_patch.
+    DELETE lt_requirements WHERE component IS INITIAL.
+    DELETE ADJACENT DUPLICATES FROM lt_requirements COMPARING ALL FIELDS.
+ 
+    lo_dot->set_requirements( lt_requirements ).
+ 
+    mo_repo->set_dot_abapgit( lo_dot ).
+    mo_repo->refresh( ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+    MESSAGE ''Settings succesfully saved'' TYPE ''S''.
+ 
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lt_lang_list        TYPE zif_abapgit_definitions=>ty_languages,
+      lv_folder           TYPE string,
+      lv_len              TYPE i,
+      lv_component        TYPE zif_abapgit_dot_abapgit=>ty_requirement-component,
+      lv_min_release      TYPE zif_abapgit_dot_abapgit=>ty_requirement-min_release,
+      lv_min_patch        TYPE zif_abapgit_dot_abapgit=>ty_requirement-min_patch,
+      lv_version_constant TYPE string,
+      lx_exception        TYPE REF TO zcx_abapgit_exception.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    lv_folder = io_form_data->get( c_id-starting_folder ).
+    lv_len = strlen( lv_folder ) - 1.
+    IF lv_len > 0 AND lv_folder(1) <> ''/''.
+      ro_validation_log->set(
+        iv_key = c_id-starting_folder
+        iv_val = |The folder must begin with /| ).
+    ELSEIF lv_len > 0 AND lv_folder+lv_len(1) <> ''/''.
+      ro_validation_log->set(
+        iv_key = c_id-starting_folder
+        iv_val = |The folder must end with /| ).
+    ELSEIF lv_folder CA ''\\''.
+      ro_validation_log->set(
+        iv_key = c_id-starting_folder
+        iv_val = |Use / instead of \\\\| ).
+    ENDIF.
+ 
+    DO mv_requirements_count TIMES.
+      lv_component   = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-1| ).
+      lv_min_release = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-2| ).
+      lv_min_patch   = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-3| ).
+ 
+      IF lv_component IS INITIAL AND ( lv_min_release IS NOT INITIAL OR lv_min_patch IS NOT INITIAL ).
+        ro_validation_log->set(
+          iv_key = c_id-requirements
+          iv_val = |If you enter a release or patch, you must also enter a software component| ).
+      ELSEIF lv_component IS NOT INITIAL AND lv_min_release IS INITIAL.
+        ro_validation_log->set(
+          iv_key = c_id-requirements
+          iv_val = |If you enter a software component, you must also enter a minumum release| ).
+      ENDIF.
+    ENDDO.
+ 
+    TRY.
+        lv_version_constant = io_form_data->get( c_id-version_constant ).
+        IF lv_version_constant IS NOT INITIAL.
+          zcl_abapgit_version=>get_version_constant_value( lv_version_constant ).
+        ENDIF.
+      CATCH zcx_abapgit_exception INTO lx_exception.
+        ro_validation_log->set(
+          iv_key = c_id-version_constant
+          iv_val = lx_exception->get_text( ) ).
+    ENDTRY.
+ 
+    lt_lang_list = zcl_abapgit_lxe_texts=>convert_lang_string_to_table(
+      iv_langs              = io_form_data->get( c_id-i18n_langs )
+      iv_skip_main_language = mo_repo->get_dot_abapgit( )->get_main_language( ) ).
+    IF io_form_data->get( c_id-use_lxe ) = abap_true AND lt_lang_list IS INITIAL.
+      ro_validation_log->set(
+        iv_key = c_id-i18n_langs
+        iv_val = ''LXE approach requires a non-empy list of languages'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-save.
+        " Validate all form entries
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( \`<div class="repo">\` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_true ) ).
+ 
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+ 
+    ri_html->add( \`</div>\` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_STAGE              ', 'CLASS zcl_abapgit_gui_page_stage DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC INHERITING FROM zcl_abapgit_gui_page.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_hotkeys.
+ 
+    CONSTANTS: BEGIN OF c_action,
+                 stage_refresh TYPE string VALUE ''stage_refresh'',
+                 stage_all     TYPE string VALUE ''stage_all'',
+                 stage_commit  TYPE string VALUE ''stage_commit'',
+                 stage_filter  TYPE string VALUE ''stage_filter'',
+               END OF c_action.
+ 
+    METHODS constructor
+      IMPORTING
+        io_repo       TYPE REF TO zcl_abapgit_repo_online
+        iv_seed       TYPE string OPTIONAL
+        iv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result DEFAULT zif_abapgit_definitions=>c_sci_result-no_run
+        ii_obj_filter TYPE REF TO zif_abapgit_object_filter OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event REDEFINITION.
+ 
+  PROTECTED SECTION.
+    METHODS:
+      render_content REDEFINITION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_changed_by,
+        item     TYPE zif_abapgit_definitions=>ty_item,
+        filename TYPE string,
+        name     TYPE syuname,
+      END OF ty_changed_by .
+    TYPES:
+      ty_changed_by_tt TYPE SORTED TABLE OF ty_changed_by WITH UNIQUE KEY item filename.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online .
+    DATA ms_files TYPE zif_abapgit_definitions=>ty_stage_files .
+    DATA mv_seed TYPE string .               " Unique page id to bind JS sessionStorage
+    DATA mv_filter_value TYPE string .
+    DATA mv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result.
+    DATA mi_obj_filter TYPE REF TO zif_abapgit_object_filter.
+ 
+    METHODS check_selected
+      IMPORTING
+        !io_files TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS find_changed_by
+      IMPORTING
+        !it_files            TYPE zif_abapgit_definitions=>ty_stage_files
+        !it_transports       TYPE zif_abapgit_cts_api=>ty_transport_list
+      RETURNING
+        VALUE(rt_changed_by) TYPE ty_changed_by_tt .
+    METHODS find_transports
+      IMPORTING
+        !it_files            TYPE zif_abapgit_definitions=>ty_stage_files
+      RETURNING
+        VALUE(rt_transports) TYPE zif_abapgit_cts_api=>ty_transport_list .
+    METHODS render_list
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_file
+      IMPORTING
+        !iv_context    TYPE string
+        !is_file       TYPE zif_abapgit_git_definitions=>ty_file
+        !is_item       TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !is_status     TYPE zif_abapgit_definitions=>ty_result
+        !iv_changed_by TYPE syuname OPTIONAL
+        !iv_transport  TYPE trkorr OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_actions
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS stage_selected
+      IMPORTING
+        !ii_event       TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(ro_stage) TYPE REF TO zcl_abapgit_stage
+      RAISING
+        zcx_abapgit_exception .
+    METHODS stage_all
+      RETURNING
+        VALUE(ro_stage) TYPE REF TO zcl_abapgit_stage
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS get_page_patch
+      IMPORTING
+        !io_stage      TYPE REF TO zcl_abapgit_stage
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_main_language_warning
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS count_default_files_to_commit
+      RETURNING
+        VALUE(rv_count) TYPE i .
+    METHODS render_deferred_hidden_events
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS init_files
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_stage IMPLEMENTATION.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = ''toolbar-main''.
+ 
+    IF lines( ms_files-local ) > 0
+    OR lines( ms_files-remote ) > 0.
+      ro_menu->add(
+        iv_txt = ''Refresh''
+        iv_act = |{ c_action-stage_refresh }|
+        iv_opt = zif_abapgit_html=>c_html_opt-strong
+      )->add(
+        iv_txt = |Diff|
+        iv_act = |{ zif_abapgit_definitions=>c_action-go_repo_diff }?key={ mo_repo->get_key( ) }|
+      )->add(
+        iv_txt = |Patch|
+        iv_typ = zif_abapgit_html=>c_action_type-onclick
+        iv_id  = |patchBtn| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_selected.
+ 
+    DATA:
+      ls_file    TYPE zif_abapgit_git_definitions=>ty_file,
+      lv_pattern TYPE string,
+      lv_msg     TYPE string.
+ 
+    FIELD-SYMBOLS:
+      <ls_item>     LIKE LINE OF io_files->mt_entries,
+      <ls_item_chk> LIKE LINE OF io_files->mt_entries.
+ 
+    " Check all added files if the exist in different paths (packages) without being removed
+    LOOP AT io_files->mt_entries ASSIGNING <ls_item> WHERE v = zif_abapgit_definitions=>c_method-add.
+ 
+      zcl_abapgit_path=>split_file_location(
+        EXPORTING
+          iv_fullpath = to_lower( <ls_item>-k )
+        IMPORTING
+          ev_path     = ls_file-path
+          ev_filename = ls_file-filename ).
+ 
+      " Skip packages since they all have identical filenames
+      IF ls_file-filename <> ''package.devc.xml''.
+        lv_pattern = ''*/'' && to_upper( ls_file-filename ).
+        REPLACE ALL OCCURRENCES OF ''#'' IN lv_pattern WITH ''##''. " for CP
+ 
+        LOOP AT io_files->mt_entries ASSIGNING <ls_item_chk>
+          WHERE k CP lv_pattern AND k <> <ls_item>-k AND v <> zif_abapgit_definitions=>c_method-rm.
+ 
+          lv_msg = |In order to add { to_lower( <ls_item>-k ) }, | &&
+                   |you have to remove { to_lower( <ls_item_chk>-k ) }|.
+          zcx_abapgit_exception=>raise( lv_msg ).
+ 
+        ENDLOOP.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA lv_ts TYPE timestamp.
+ 
+    super->constructor( ).
+ 
+    ms_control-page_title = ''Stage''.
+    mo_repo               = io_repo.
+    mv_seed               = iv_seed.
+    mv_sci_result         = iv_sci_result.
+    mi_obj_filter         = ii_obj_filter.
+ 
+    IF mv_seed IS INITIAL. " Generate based on time unless obtained from diff page
+      GET TIME STAMP FIELD lv_ts.
+      mv_seed = |stage{ lv_ts }|.
+    ENDIF.
+ 
+    init_files( ).
+    ms_control-page_menu = build_menu( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD count_default_files_to_commit.
+ 
+    FIELD-SYMBOLS <ls_status> LIKE LINE OF ms_files-status.
+    FIELD-SYMBOLS <ls_remote> LIKE LINE OF ms_files-remote.
+ 
+    rv_count = lines( ms_files-local ).
+ 
+    LOOP AT ms_files-remote ASSIGNING <ls_remote>.
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_remote>-path
+          filename = <ls_remote>-filename.
+      ASSERT sy-subrc = 0.
+ 
+      IF <ls_status>-lstate = zif_abapgit_definitions=>c_state-deleted
+        AND <ls_status>-rstate = zif_abapgit_definitions=>c_state-unchanged.
+        rv_count = rv_count + 1.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_changed_by.
+ 
+    DATA: ls_local             LIKE LINE OF it_files-local,
+          ls_remote            LIKE LINE OF it_files-remote,
+          ls_changed_by        LIKE LINE OF rt_changed_by,
+          lt_changed_by_remote LIKE rt_changed_by,
+          ls_item              TYPE zif_abapgit_definitions=>ty_item,
+          lv_transport         LIKE LINE OF it_transports,
+          lv_user              TYPE uname.
+ 
+    FIELD-SYMBOLS <ls_changed_by> LIKE LINE OF lt_changed_by_remote.
+ 
+    LOOP AT it_files-local INTO ls_local WHERE NOT item IS INITIAL.
+      ls_changed_by-item = ls_local-item.
+      ls_changed_by-filename = ls_local-file-filename.
+      ls_changed_by-name = zcl_abapgit_objects=>changed_by(
+        is_item     = ls_local-item
+        iv_filename = ls_local-file-filename ).
+      INSERT ls_changed_by INTO TABLE rt_changed_by.
+    ENDLOOP.
+ 
+    LOOP AT it_files-remote INTO ls_remote WHERE filename IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_filename_logic=>file_to_object(
+            EXPORTING
+              iv_filename = ls_remote-filename
+              iv_path     = ls_remote-path
+              io_dot      = mo_repo->get_dot_abapgit( )
+            IMPORTING
+              es_item     = ls_item ).
+          ls_changed_by-item = ls_item.
+          INSERT ls_changed_by INTO TABLE lt_changed_by_remote.
+        CATCH zcx_abapgit_exception.
+      ENDTRY.
+    ENDLOOP.
+ 
+    LOOP AT lt_changed_by_remote ASSIGNING <ls_changed_by>.
+      " deleted files might still be in a transport
+      CLEAR lv_transport.
+      READ TABLE it_transports WITH KEY
+        obj_type = <ls_changed_by>-item-obj_type
+        obj_name = <ls_changed_by>-item-obj_name
+        INTO lv_transport.
+      IF sy-subrc = 0.
+        lv_user = zcl_abapgit_factory=>get_cts_api( )->read_user( lv_transport-trkorr ).
+        IF lv_user IS NOT INITIAL.
+          <ls_changed_by>-name = lv_user.
+        ENDIF.
+      ENDIF.
+      IF <ls_changed_by>-name IS INITIAL.
+        <ls_changed_by>-name = zcl_abapgit_objects_super=>c_user_unknown.
+      ENDIF.
+    ENDLOOP.
+ 
+    INSERT LINES OF lt_changed_by_remote INTO TABLE rt_changed_by.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_transports.
+ 
+    DATA li_cts_api TYPE REF TO zif_abapgit_cts_api.
+    DATA lt_items TYPE zif_abapgit_definitions=>ty_items_tt.
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lo_dot TYPE REF TO zcl_abapgit_dot_abapgit.
+    FIELD-SYMBOLS <ls_local> LIKE LINE OF it_files-local.
+    FIELD-SYMBOLS <ls_remote> LIKE LINE OF it_files-remote.
+ 
+ 
+    li_cts_api = zcl_abapgit_factory=>get_cts_api( ).
+ 
+    TRY.
+        LOOP AT it_files-local ASSIGNING <ls_local> WHERE item IS NOT INITIAL.
+          IF li_cts_api->is_chrec_possible_for_package( <ls_local>-item-devclass ) = abap_false.
+            RETURN. " Assume all other objects are also in packages without change recording
+          ENDIF.
+          APPEND <ls_local>-item TO lt_items.
+        ENDLOOP.
+ 
+        lo_dot = mo_repo->get_dot_abapgit( ).
+        LOOP AT it_files-remote ASSIGNING <ls_remote> WHERE filename IS NOT INITIAL.
+          zcl_abapgit_filename_logic=>file_to_object(
+            EXPORTING
+              iv_filename = <ls_remote>-filename
+              iv_path     = <ls_remote>-path
+              io_dot      = lo_dot
+            IMPORTING
+              es_item     = ls_item ).
+          IF ls_item IS INITIAL.
+            CONTINUE.
+          ENDIF.
+          APPEND ls_item TO lt_items.
+        ENDLOOP.
+ 
+        SORT lt_items BY obj_type obj_name.
+        DELETE ADJACENT DUPLICATES FROM lt_items COMPARING obj_type obj_name.
+ 
+        rt_transports = li_cts_api->get_transports_for_list( lt_items ).
+ 
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_page_patch.
+ 
+    DATA: lo_page  TYPE REF TO zcl_abapgit_gui_page_patch,
+          lv_key   TYPE zif_abapgit_persistence=>ty_repo-key,
+          lt_files TYPE zif_abapgit_definitions=>ty_stage_tt.
+ 
+    lv_key = mo_repo->get_key( ).
+    lt_files = io_stage->get_all( ).
+ 
+    DELETE lt_files WHERE method <> zif_abapgit_definitions=>c_method-add
+                    AND   method <> zif_abapgit_definitions=>c_method-rm.
+ 
+    CREATE OBJECT lo_page
+      EXPORTING
+        iv_key   = lv_key
+        it_files = lt_files.
+ 
+    ri_page = lo_page.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init_files.
+    ms_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo       = mo_repo
+                                                             ii_obj_filter = mi_obj_filter ).
+ 
+    IF lines( ms_files-local ) = 0 AND lines( ms_files-remote ) = 0.
+      mo_repo->refresh( ).
+      zcx_abapgit_exception=>raise( ''There are no changes that could be staged'' ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD render_actions.
+ 
+    DATA: lv_local_count TYPE i,
+          lv_add_all_txt TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    lv_local_count = count_default_files_to_commit( ).
+    IF lv_local_count > 0.
+      lv_add_all_txt = |Add All and Commit ({ lv_local_count })|.
+      " Otherwise empty, but the element (id) is preserved for JS
+    ENDIF.
+ 
+    ri_html->add( ''<table class="w100 margin-v5"><tr>'' ).
+ 
+    " Action buttons
+    ri_html->add( ''<td class="indent5em">'' ).
+    ri_html->add_a( iv_act   = ''errorStub(event)'' " Will be reinit by JS
+                    iv_typ   = zif_abapgit_html=>c_action_type-onclick
+                    iv_id    = ''commitSelectedButton''
+                    iv_style = ''display: none''
+                    iv_txt   = ''Commit Selected (<span class="counter"></span>)''
+                    iv_opt   = zif_abapgit_html=>c_html_opt-strong ).
+    ri_html->add_a( iv_act   = ''errorStub(event)'' " Will be reinit by JS
+                    iv_typ   = zif_abapgit_html=>c_action_type-onclick
+                    iv_id    = ''commitFilteredButton''
+                    iv_style = ''display: none''
+                    iv_txt   = ''Add <b>Filtered</b> and Commit (<span class="counter"></span>)'' ).
+    ri_html->add_a( iv_act = |{ c_action-stage_all }|
+                    iv_id  = ''commitAllButton''
+                    iv_txt = lv_add_all_txt ).
+ 
+ 
+    ri_html->add( ''</td>'' ).
+ 
+    " Filter bar
+    ri_html->add( ''<td class="right">'' ).
+    ri_html->add( ''<input class="stage-filter" id="objectSearch"'' &&
+                  '' type="search" placeholder="Filter Objects"'' &&
+                  | value="{ mv_filter_value }">| ).
+    zcl_abapgit_gui_chunk_lib=>render_sci_result(
+      ii_html       = ri_html
+      iv_sci_result = mv_sci_result ).
+    ri_html->add( ''</td>'' ).
+ 
+    ri_html->add( ''</tr>'' ).
+    ri_html->add( ''</table>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="repo">'' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+      io_repo = mo_repo
+      iv_interactive_branch = abap_true ) ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_js_error_banner( ) ).
+    ri_html->add( render_main_language_warning( ) ).
+ 
+    ri_html->add( ''<div class="stage-container">'' ).
+    ri_html->add( render_actions( ) ).
+    ri_html->add( render_list( ) ).
+    ri_html->add( ''</div>'' ).
+ 
+    ri_html->add( ''</div>'' ).
+ 
+    register_handlers( ).
+    gui_services( )->get_html_parts( )->add_part(
+      iv_collection = zcl_abapgit_gui_component=>c_html_parts-hidden_forms
+      ii_part       = render_deferred_hidden_events( ) ).
+    register_deferred_script( render_scripts( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_deferred_hidden_events.
+ 
+    DATA ls_event TYPE zcl_abapgit_gui_chunk_lib=>ty_event_signature.
+ 
+    ls_event-method = ''post''.
+    ls_event-name   = ''stage_commit''.
+    ri_html = zcl_abapgit_gui_chunk_lib=>render_event_as_form( ls_event ).
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_file.
+ 
+    DATA: lv_param    TYPE string,
+          lv_filename TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_filename = is_file-path && is_file-filename.
+    " make sure whitespace is preserved in the DOM
+    REPLACE ALL OCCURRENCES OF \` \` IN lv_filename WITH ''&nbsp;''.
+ 
+    ri_html->add( |<tr class="{ iv_context }">| ).
+    ri_html->add( ''<td>'' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state(
+      iv_lstate = is_status-lstate
+      iv_rstate = is_status-rstate ) ).
+    ri_html->add( ''</td>'' ).
+ 
+    CASE iv_context.
+      WHEN ''local''.
+        lv_param = zcl_abapgit_html_action_utils=>file_encode(
+          iv_key  = mo_repo->get_key( )
+          ig_file = is_file ).
+ 
+        lv_filename = ri_html->a(
+          iv_txt = lv_filename
+          iv_act = |{ zif_abapgit_definitions=>c_action-go_file_diff }?{ lv_param }| ).
+ 
+        ri_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
+        ri_html->add( |<td class="name">{ lv_filename }</td>| ).
+      WHEN ''remote''.
+        ri_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
+        ri_html->add( |<td class="name">{ lv_filename }</td>| ).
+    ENDCASE.
+ 
+    ri_html->add( ''<td class="user">'' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( iv_changed_by  ) ).
+    ri_html->add( ''</td>'' ).
+ 
+    ri_html->add( ''<td class="transport">'' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_transport( iv_transport ) ).
+    ri_html->add( ''</td>'' ).
+ 
+    ri_html->add( ''<td class="status">?</td>'' ).
+    ri_html->add( ''<td class="cmd"></td>'' ). " Command added in JS
+ 
+    ri_html->add( ''</tr>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_list.
+ 
+    DATA: lt_changed_by  TYPE ty_changed_by_tt,
+          ls_changed_by  LIKE LINE OF lt_changed_by,
+          lt_transports  TYPE zif_abapgit_cts_api=>ty_transport_list,
+          ls_transport   LIKE LINE OF lt_transports,
+          ls_item_remote TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF ms_files-remote,
+                   <ls_status> LIKE LINE OF ms_files-status,
+                   <ls_local>  LIKE LINE OF ms_files-local.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<table id="stageTab" class="stage_tab w100">'' ).
+ 
+    lt_transports = find_transports( ms_files ).
+    lt_changed_by = find_changed_by(
+      it_files = ms_files
+      it_transports = lt_transports ).
+ 
+    " Local changes
+    LOOP AT ms_files-local ASSIGNING <ls_local>.
+      AT FIRST.
+        ri_html->add( ''<thead><tr class="local">'' ).
+        ri_html->add( ''<th class="stage-status"></th>'' ). " Diff state
+        ri_html->add( ''<th class="stage-objtype">Type</th>'' ).
+        ri_html->add( ''<th title="Click filename to see diff">File</th>'' ).
+        ri_html->add( ''<th>Changed by</th>'' ).
+        ri_html->add( ''<th>Transport</th>'' ).
+        ri_html->add( ''<th></th>'' ). " Status
+        ri_html->add( ''<th class="cmd">'' ).
+        ri_html->add( ''<a>add</a>&#x2193; <a>reset</a>&#x2193;'' ).
+        ri_html->add( ''</th>'' ).
+        ri_html->add( ''</tr></thead>'' ).
+        ri_html->add( ''<tbody>'' ).
+      ENDAT.
+ 
+      READ TABLE lt_changed_by INTO ls_changed_by WITH TABLE KEY
+        item     = <ls_local>-item
+        filename = <ls_local>-file-filename.
+      IF sy-subrc <> 0.
+        READ TABLE lt_changed_by INTO ls_changed_by WITH KEY item = <ls_local>-item.
+      ENDIF.
+ 
+      READ TABLE lt_transports INTO ls_transport WITH KEY
+        obj_type = <ls_local>-item-obj_type
+        obj_name = <ls_local>-item-obj_name.              "#EC CI_SUBRC
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_local>-file-path
+          filename = <ls_local>-file-filename.
+      ASSERT sy-subrc = 0.
+ 
+      ri_html->add( render_file(
+        iv_context    = ''local''
+        is_file       = <ls_local>-file
+        is_item       = <ls_local>-item
+        is_status     = <ls_status>
+        iv_changed_by = ls_changed_by-name
+        iv_transport  = ls_transport-trkorr ) ).
+ 
+      CLEAR ls_transport.
+ 
+      AT LAST.
+        ri_html->add( ''</tbody>'' ).
+      ENDAT.
+    ENDLOOP.
+ 
+    " Remote changes
+    LOOP AT ms_files-remote ASSIGNING <ls_remote>.
+      AT FIRST.
+        ri_html->add( ''<thead><tr class="remote">'' ).
+        ri_html->add( ''<th></th>'' ). " Diff state
+        ri_html->add( ''<th></th>'' ). " Type
+        ri_html->add( ''<th colspan="3">Files to remove or non-code</th>'' ).
+        ri_html->add( ''<th></th>'' ). " Transport
+        ri_html->add( ''<th class="cmd">'' ).
+        ri_html->add( ''<a>ignore</a>&#x2193; <a>remove</a>&#x2193; <a>reset</a>&#x2193;'' ).
+        ri_html->add( ''</th>'' ).
+        ri_html->add( ''</tr></thead>'' ).
+        ri_html->add( ''<tbody>'' ).
+      ENDAT.
+ 
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_remote>-path
+          filename = <ls_remote>-filename.
+      ASSERT sy-subrc = 0.
+ 
+      TRY.
+          zcl_abapgit_filename_logic=>file_to_object(
+            EXPORTING
+              iv_filename = <ls_remote>-filename
+              iv_path     = <ls_remote>-path
+              io_dot      = mo_repo->get_dot_abapgit( )
+            IMPORTING
+              es_item     = ls_item_remote ).
+          READ TABLE lt_transports INTO ls_transport WITH KEY
+            obj_type = ls_item_remote-obj_type
+            obj_name = ls_item_remote-obj_name.
+ 
+          READ TABLE lt_changed_by INTO ls_changed_by WITH TABLE KEY
+            item     = ls_item_remote
+            filename = <ls_remote>-filename.
+          IF sy-subrc <> 0.
+            READ TABLE lt_changed_by INTO ls_changed_by WITH KEY item = ls_item_remote.
+          ENDIF.
+        CATCH zcx_abapgit_exception.
+          CLEAR ls_transport.
+      ENDTRY.
+ 
+      ri_html->add( render_file(
+        iv_context    = ''remote''
+        is_status     = <ls_status>
+        is_file       = <ls_remote>
+        is_item       = ls_item_remote
+        iv_changed_by = ls_changed_by-name
+        iv_transport  = ls_transport-trkorr ) ).
+ 
+      AT LAST.
+        ri_html->add( ''</tbody>'' ).
+      ENDAT.
+    ENDLOOP.
+ 
+    ri_html->add( ''</table>'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_main_language_warning.
+ 
+    DATA lv_main_language TYPE spras.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_main_language = mo_repo->get_dot_abapgit( )->get_main_language( ).
+ 
+    IF lv_main_language <> sy-langu.
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_warning_banner(
+                        |Caution: Main language of the repo is ''{ lv_main_language }'', |
+                     && |but you''re logged on in ''{ sy-langu }''| ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+ 
+    ri_html->add( ''var gStageParams = {'' ).
+    ri_html->add( |  seed:            "{ mv_seed }",| ). " Unique page id
+    ri_html->add( |  user:            "{ to_lower( sy-uname ) }",| ).
+    ri_html->add( ''  formAction:      "stage_commit",'' ).
+    ri_html->add( |  patchAction:     "{ zif_abapgit_definitions=>c_action-go_patch }",| ).
+    ri_html->add( ''  focusFilterKey:  "f",'' ).
+ 
+    ri_html->add( ''  ids: {'' ).
+    ri_html->add( ''    stageTab:          "stageTab",'' ).
+    ri_html->add( ''    commitAllBtn:      "commitAllButton",'' ).
+    ri_html->add( ''    commitSelectedBtn: "commitSelectedButton",'' ).
+    ri_html->add( ''    commitFilteredBtn: "commitFilteredButton",'' ).
+    ri_html->add( ''    patchBtn:          "patchBtn",'' ).
+    ri_html->add( ''    objectSearch:      "objectSearch",'' ).
+    ri_html->add( ''  }'' ).
+ 
+    ri_html->add( ''}'' ).
+    ri_html->add( ''var gHelper = new StageHelper(gStageParams);'' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD stage_all.
+ 
+    FIELD-SYMBOLS <ls_local> LIKE LINE OF ms_files-local.
+    FIELD-SYMBOLS <ls_remote> LIKE LINE OF ms_files-remote.
+    FIELD-SYMBOLS <ls_status> LIKE LINE OF ms_files-status.
+ 
+    CREATE OBJECT ro_stage.
+ 
+    LOOP AT ms_files-local ASSIGNING <ls_local>.
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_local>-file-path
+          filename = <ls_local>-file-filename.
+      ASSERT sy-subrc = 0.
+ 
+      ro_stage->add(
+        iv_path     = <ls_local>-file-path
+        iv_filename = <ls_local>-file-filename
+        is_status   = <ls_status>
+        iv_data     = <ls_local>-file-data ).
+    ENDLOOP.
+ 
+    LOOP AT ms_files-remote ASSIGNING <ls_remote>.
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_remote>-path
+          filename = <ls_remote>-filename.
+      ASSERT sy-subrc = 0.
+ 
+      IF <ls_status>-lstate = zif_abapgit_definitions=>c_state-deleted
+        AND <ls_status>-rstate = zif_abapgit_definitions=>c_state-unchanged.
+ 
+        ro_stage->rm(
+          iv_path     = <ls_remote>-path
+          iv_filename = <ls_remote>-filename
+          is_status   = <ls_status> ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD stage_selected.
+ 
+    DATA ls_file  TYPE zif_abapgit_git_definitions=>ty_file.
+    DATA lo_files TYPE REF TO zcl_abapgit_string_map.
+ 
+    FIELD-SYMBOLS:
+      <ls_file>   LIKE LINE OF ms_files-local,
+      <ls_status> LIKE LINE OF ms_files-status,
+      <ls_item>   LIKE LINE OF lo_files->mt_entries.
+ 
+    lo_files = ii_event->form_data( ).
+ 
+    IF lo_files->size( ) = 0.
+      zcx_abapgit_exception=>raise( ''process_stage_list: empty list'' ).
+    ENDIF.
+ 
+    check_selected( lo_files ).
+ 
+    CREATE OBJECT ro_stage.
+ 
+    LOOP AT lo_files->mt_entries ASSIGNING <ls_item>
+      "Ignore Files that we don''t want to stage, so any errors don''t stop the staging process
+      WHERE v <> zif_abapgit_definitions=>c_method-skip.
+ 
+      zcl_abapgit_path=>split_file_location(
+        EXPORTING
+          iv_fullpath = to_lower( <ls_item>-k ) " filename is lower cased
+        IMPORTING
+          ev_path     = ls_file-path
+          ev_filename = ls_file-filename ).
+ 
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = ls_file-path
+          filename = ls_file-filename.
+      IF sy-subrc <> 0.
+* see https://github.com/abapGit/abapGit/issues/3073
+        zcx_abapgit_exception=>raise( iv_text =
+          |Unable to stage { ls_file-filename }. If the filename contains spaces, this is a known issue.| &&
+          | Consider ignoring or staging the file at a later time.| ).
+      ENDIF.
+ 
+      CASE <ls_item>-v.
+        WHEN zif_abapgit_definitions=>c_method-add.
+          READ TABLE ms_files-local ASSIGNING <ls_file>
+            WITH KEY file-path     = ls_file-path
+                     file-filename = ls_file-filename.
+ 
+          IF sy-subrc <> 0.
+            zcx_abapgit_exception=>raise( |process_stage_list: unknown file { ls_file-path }{ ls_file-filename }| ).
+          ENDIF.
+ 
+          ro_stage->add( iv_path     = <ls_file>-file-path
+                         iv_filename = <ls_file>-file-filename
+                         is_status   = <ls_status>
+                         iv_data     = <ls_file>-file-data ).
+        WHEN zif_abapgit_definitions=>c_method-ignore.
+          ro_stage->ignore( iv_path     = ls_file-path
+                            iv_filename = ls_file-filename ).
+        WHEN zif_abapgit_definitions=>c_method-rm.
+          ro_stage->rm( iv_path     = ls_file-path
+                        is_status   = <ls_status>
+                        iv_filename = ls_file-filename ).
+        WHEN zif_abapgit_definitions=>c_method-skip.
+          " Do nothing
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( |process_stage_list: unknown method { <ls_item>-v }| ).
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA: lo_stage  TYPE REF TO zcl_abapgit_stage.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_action-stage_all.
+ 
+        lo_stage = stage_all( ).
+ 
+        rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+          io_repo       = mo_repo
+          io_stage      = lo_stage
+          iv_sci_result = mv_sci_result ).
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_action-stage_commit.
+ 
+        lo_stage = stage_selected( ii_event ).
+ 
+        rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+          io_repo       = mo_repo
+          io_stage      = lo_stage
+          iv_sci_result = mv_sci_result ).
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_action-stage_filter.
+ 
+        mv_filter_value = ii_event->form_data( )->get( ''filterValue'' ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-go_patch.                         " Go Patch page
+ 
+        lo_stage = stage_selected( ii_event ).
+        rs_handled-page  = get_page_patch( lo_stage ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_action-stage_refresh.
+        mo_repo->refresh( abap_true ).
+        init_files( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_switch.
+        zcl_abapgit_services_git=>switch_branch( |{ ii_event->query( )->get( ''KEY'' ) }| ).
+        mo_repo->refresh( abap_true ).
+        init_files( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN OTHERS.
+        rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = ''Stage''.
+    ls_hotkey_action-description  = |Patch|.
+    ls_hotkey_action-action       = ''submitPatch''. " JS function in StageHelper
+    ls_hotkey_action-hotkey       = |p|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description  = |Diff|.
+    ls_hotkey_action-action       = zif_abapgit_definitions=>c_action-go_repo_diff.
+    ls_hotkey_action-hotkey       = |d|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description  = |Refresh|.
+    ls_hotkey_action-action       = c_action-stage_refresh.
+    ls_hotkey_action-hotkey       = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    " registered/handled in js
+    ls_hotkey_action-description = |Focus filter|.
+    ls_hotkey_action-action = \`#\`.
+    ls_hotkey_action-hotkey = |f|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_SYNTAX             ', 'CLASS zcl_abapgit_gui_page_syntax DEFINITION PUBLIC FINAL CREATE PUBLIC
+    INHERITING FROM zcl_abapgit_gui_page_codi_base.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          io_repo TYPE REF TO zcl_abapgit_repo
+        RAISING
+          zcx_abapgit_exception,
+ 
+      zif_abapgit_gui_event_handler~on_event
+        REDEFINITION,
+ 
+      zif_abapgit_gui_renderable~render
+        REDEFINITION.
+ 
+  PROTECTED SECTION.
+    CONSTANTS: c_variant TYPE c LENGTH 30 VALUE ''SYNTAX_CHECK''.
+ 
+    METHODS:
+      render_content REDEFINITION.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      build_menu
+        RETURNING
+          VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar
+        RAISING
+          zcx_abapgit_exception,
+ 
+      run_syntax_check
+        RAISING
+          zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_syntax IMPLEMENTATION.
+ 
+ 
+  METHOD build_menu.
+ 
+    ro_menu = build_base_menu( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    ms_control-page_title = ''Syntax Check''.
+    mo_repo = io_repo.
+    run_syntax_check( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( \`<div class="repo">\` ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( io_repo        = mo_repo
+                                                              iv_show_commit = abap_false ) ).
+    ri_html->add( \`</div>\` ).
+ 
+    ri_html->add( ''<div class="toc">'' ).
+ 
+    ri_html->add( render_variant(
+      iv_variant = c_variant
+      iv_summary = mv_summary ) ).
+ 
+    IF lines( mt_result ) = 0.
+      ri_html->add( ''<div class="dummydiv success">'' ).
+      ri_html->add( ri_html->icon( ''check'' ) ).
+      ri_html->add( ''No syntax errors'' ).
+      ri_html->add( ''</div>'' ).
+    ELSE.
+      render_result( ii_html   = ri_html
+                     it_result = mt_result ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run_syntax_check.
+ 
+    DATA: li_syntax_check TYPE REF TO zif_abapgit_code_inspector.
+ 
+    li_syntax_check = zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( ) ).
+ 
+    TRY.
+        mt_result = li_syntax_check->run( c_variant ).
+      CATCH zcx_abapgit_exception.
+        " Variant SYNTAX_CHECK does not exist in 702
+        mt_result = li_syntax_check->run( ''VERI_'' && c_variant ).
+    ENDTRY.
+ 
+    mv_summary = li_syntax_check->get_summary( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-rerun.
+ 
+        run_syntax_check( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN OTHERS.
+        rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    ms_control-page_menu = build_menu( ).
+    ri_html = super->zif_abapgit_gui_renderable~render( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_TAGS               ', 'CLASS zcl_abapgit_gui_page_tags DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_repo       TYPE REF TO zif_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !ii_repo TYPE REF TO zif_abapgit_repo
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        tag_group    TYPE string VALUE ''tag_group'',
+        tag_type     TYPE string VALUE ''tag_type'',
+        tags         TYPE string VALUE ''tags'',
+        type         TYPE string VALUE ''type'',
+        name         TYPE string VALUE ''name'',
+        sha1         TYPE string VALUE ''sha1'',
+        anno_group   TYPE string VALUE ''anno_group'',
+        tagger       TYPE string VALUE ''tagger'',
+        tagger_name  TYPE string VALUE ''tagger_name'',
+        tagger_email TYPE string VALUE ''tagger_email'',
+        message      TYPE string VALUE ''message'',
+        body         TYPE string VALUE ''body'',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        create        TYPE string VALUE ''create'',
+        choose_commit TYPE string VALUE ''choose_commit'',
+        change_type   TYPE string VALUE ''change_type'',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online.
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings.
+    DATA ms_tag TYPE zif_abapgit_git_definitions=>ty_git_tag.
+ 
+    METHODS get_form_schema
+      IMPORTING
+        io_form_data   TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS initialize_form_data
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_tagger_name
+      RETURNING
+        VALUE(rv_user) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_tagger_email
+      RETURNING
+        VALUE(rv_email) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS choose_commit
+      RETURNING
+        VALUE(rv_commit) TYPE zif_abapgit_git_definitions=>ty_commit-sha1
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_tags IMPLEMENTATION.
+ 
+ 
+  METHOD choose_commit.
+ 
+    DATA li_popups TYPE REF TO zif_abapgit_popups.
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+ 
+    rv_commit = li_popups->commit_list_popup(
+      iv_repo_url    = mo_repo->get_url( )
+      iv_branch_name = mo_repo->get_selected_branch( ) )-sha1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_form_data.
+    CREATE OBJECT mo_validation_log.
+    mo_repo ?= ii_repo.
+ 
+    " Get settings from DB
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    mo_form = get_form_schema( ).
+ 
+    initialize_form_data( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_tags.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        ii_repo = ii_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Create Tag''
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA lv_commitmsg_comment_length TYPE i.
+ 
+    IF io_form_data IS BOUND AND io_form_data->is_empty( ) = abap_false.
+      ms_tag-type = io_form_data->get( c_id-tag_type ).
+    ENDIF.
+ 
+    lv_commitmsg_comment_length =  mo_settings->get_commitmsg_comment_length( ).
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = ''create-tag-form''
+                iv_help_page = ''https://docs.abapgit.org/'' ). " todo, add docs
+ 
+    ro_form->start_group(
+      iv_name  = c_id-tag_group
+      iv_label = ''New Tag''
+    )->radio(
+      iv_label  = ''Type''
+      iv_name   = c_id-tag_type
+      iv_action = c_event-change_type
+    )->option(
+      iv_label = ''Lightweight''
+      iv_value = zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag
+    )->option(
+      iv_label = ''Annotated''
+      iv_value = zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag
+    )->text(
+      iv_name        = c_id-name
+      iv_label       = ''Tag Name''
+      iv_required    = abap_true
+    )->text(
+      iv_name        = c_id-sha1
+      iv_label       = ''Commit''
+      iv_min         = 40
+      iv_max         = 40
+      iv_condense    = abap_true
+      iv_required    = abap_true
+      iv_side_action = c_event-choose_commit ).
+ 
+    IF ms_tag-type = zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag.
+      ro_form->start_group(
+        iv_name        = c_id-anno_group
+        iv_label       = ''Annotation''
+      )->text(
+        iv_name        = c_id-message
+        iv_label       = ''Comment''
+        iv_max         = lv_commitmsg_comment_length
+        iv_placeholder = |Add a mandatory comment with max { lv_commitmsg_comment_length } characters|
+      )->textarea(
+        iv_name        = c_id-body
+        iv_label       = ''Body''
+        iv_rows        = 6
+        iv_cols        = mo_settings->get_commitmsg_body_size( )
+        iv_placeholder = ''Add an optional description...''
+      )->text(
+        iv_name        = c_id-tagger_name
+        iv_label       = ''Tagger Name''
+      )->text(
+        iv_name        = c_id-tagger_email
+        iv_label       = ''Tagger Email'' ).
+    ELSE.
+      ro_form->hidden( c_id-message
+      )->hidden( c_id-body
+      )->hidden( c_id-tagger_name
+      )->hidden( c_id-tagger_email ).
+    ENDIF.
+ 
+    ro_form->command(
+      iv_label       = ''Create''
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-create
+    )->command(
+      iv_label       = ''Back''
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_tagger_email.
+ 
+    DATA li_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    rv_email = li_user->get_repo_git_user_email( mo_repo->get_url( ) ).
+    IF rv_email IS INITIAL.
+      rv_email = li_user->get_default_git_user_email( ).
+    ENDIF.
+    IF rv_email IS INITIAL.
+      " get default from user record
+      rv_email = zcl_abapgit_user_record=>get_instance( sy-uname )->get_email( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_tagger_name.
+ 
+    DATA li_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    rv_user  = li_user->get_repo_git_user_name( mo_repo->get_url( ) ).
+    IF rv_user IS INITIAL.
+      rv_user  = li_user->get_default_git_user_name( ).
+    ENDIF.
+    IF rv_user IS INITIAL.
+      " get default from user record
+      rv_user = zcl_abapgit_user_record=>get_instance( sy-uname )->get_name( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD initialize_form_data.
+ 
+    ms_tag-type = zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag.
+ 
+    mo_form_data->set(
+      iv_key = c_id-tag_type
+      iv_val = ms_tag-type ).
+ 
+    ms_tag-tagger_name  = get_tagger_name( ).
+    ms_tag-tagger_email = get_tagger_email( ).
+ 
+    mo_form_data->set(
+      iv_key = c_id-tagger_name
+      iv_val = ms_tag-tagger_name ).
+    mo_form_data->set(
+      iv_key = c_id-tagger_email
+      iv_val = ms_tag-tagger_email ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lt_tags         TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+      lv_new_tag_name TYPE string.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    IF zcl_abapgit_utils=>is_valid_email( io_form_data->get( c_id-tagger_email ) ) = abap_false.
+      ro_validation_log->set(
+        iv_key = c_id-tagger_email
+        iv_val = |Invalid email address| ).
+    ENDIF.
+ 
+    lv_new_tag_name = io_form_data->get( c_id-name ).
+ 
+    IF lv_new_tag_name IS NOT INITIAL.
+      " Check if tag already exists
+      lt_tags = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) )->get_tags_only( ).
+ 
+      READ TABLE lt_tags TRANSPORTING NO FIELDS WITH TABLE KEY name_key
+        COMPONENTS name = zcl_abapgit_git_tag=>add_tag_prefix( lv_new_tag_name ).
+      IF sy-subrc = 0.
+        ro_validation_log->set(
+          iv_key = c_id-name
+          iv_val = |Tag already exists| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA:
+      lx_error  TYPE REF TO zcx_abapgit_exception,
+      lv_commit TYPE zif_abapgit_git_definitions=>ty_sha1,
+      lv_text   TYPE string.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-choose_commit.
+        lv_commit = choose_commit( ).
+ 
+        IF lv_commit IS INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ELSE.
+          mo_form_data->set(
+            iv_key = c_id-sha1
+            iv_val = lv_commit ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+      WHEN c_event-change_type.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        mo_validation_log->clear( ).
+ 
+      WHEN c_event-create.
+        " Validate form entries before creating tag
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+ 
+          mo_form_data->strict( abap_false ).
+          mo_form_data->to_abap( CHANGING cs_container = ms_tag ).
+ 
+          REPLACE ALL OCCURRENCES
+            OF cl_abap_char_utilities=>cr_lf
+            IN ms_tag-body
+            WITH cl_abap_char_utilities=>newline.
+ 
+          ms_tag-name = zcl_abapgit_git_tag=>add_tag_prefix( ms_tag-name ).
+          ASSERT ms_tag-name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+ 
+          TRY.
+              zcl_abapgit_git_porcelain=>create_tag(
+                iv_url = mo_repo->get_url( )
+                is_tag = ms_tag ).
+            CATCH zcx_abapgit_exception INTO lx_error.
+              zcx_abapgit_exception=>raise( |Cannot create tag { ms_tag-name }: { lx_error->get_text( ) }| ).
+          ENDTRY.
+ 
+          lv_text = |Tag { zcl_abapgit_git_tag=>remove_tag_prefix( ms_tag-name ) } created|.
+          MESSAGE lv_text TYPE ''S''.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+    ENDCASE.
+ 
+    " If staying on form, initialize it with current settings
+    IF rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      mo_form = get_form_schema( mo_form_data ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( \`<div class="repo">\` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_false ) ).
+ 
+    ri_html->add( mo_form->render( io_values         = mo_form_data
+                                   io_validation_log = mo_validation_log ) ).
+ 
+    ri_html->add( \`</div>\` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_PAGE_TUTORIAL           ', 'CLASS zcl_abapgit_gui_page_tutorial DEFINITION
+  PUBLIC
+  FINAL
+  INHERITING FROM zcl_abapgit_gui_component
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS build_main_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_TUTORIAL IMPLEMENTATION.
+ 
+ 
+  METHOD build_main_menu.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = ''toolbar-main''.
+ 
+    ro_menu->add(
+      iv_txt = zcl_abapgit_gui_buttons=>repo_list( )
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>new_online( )
+      iv_act = zif_abapgit_definitions=>c_action-repo_newonline
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>new_offline( )
+      iv_act = zif_abapgit_definitions=>c_action-repo_newoffline
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>settings( )
+      iv_act = zif_abapgit_definitions=>c_action-go_settings
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>advanced( )
+      iv_title = ''Utilities''
+      io_sub = zcl_abapgit_gui_chunk_lib=>advanced_submenu( )
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>help( )
+      iv_title = ''Help''
+      io_sub = zcl_abapgit_gui_chunk_lib=>help_submenu( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_tutorial.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = ''Tutorial''
+      io_page_menu       = build_main_menu( )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( ''<div class="tutorial">'' ).
+ 
+    ri_html->add( ''<h1>Tutorial</h1>'' ).
+    ri_html->add( ''<hr>'' ).
+ 
+    ri_html->add( ''<h2>Online repositories</h2>'' ).
+    ri_html->add( ''<p><ul>'' ).
+ 
+    ri_html->add( \`<li>To clone a remote repository (e.g. from github) click \` ).
+    ri_html->add_a( iv_txt = zcl_abapgit_gui_buttons=>new_online( )
+                    iv_act = zif_abapgit_definitions=>c_action-repo_newonline ).
+    ri_html->add( '' from the top menu. This will link a remote repository with a package on your system.</li>'' ).
+    ri_html->add( ''<li>Use the pull button to retrieve and activate the remote objects.</li>'' ).
+    ri_html->add( ''<li>If the remote repository is updated,'' ).
+    ri_html->add( '' you will see the changes and can pull to apply the updates.</li>'' ).
+ 
+    ri_html->add( ''</ul></p>'' ).
+ 
+    ri_html->add( ''<h2>Offline repositories</h2>'' ).
+    ri_html->add( ''<p><ul>'' ).
+ 
+    ri_html->add( \`<li>To add a package as an offline repository, click \` ).
+    ri_html->add_a( iv_txt = zcl_abapgit_gui_buttons=>new_offline( )
+                    iv_act = zif_abapgit_definitions=>c_action-repo_newoffline ).
+    ri_html->add( '' from the top menu.'' ).
+    ri_html->add( ''<li>abapGit will start tracking changes for the package '' ).
+    ri_html->add( ''without linking it to an online git repository.</li>'' ).
+    ri_html->add( ''<li>You can link the package later or just export the package content as a ZIP file.</li>'' ).
+ 
+    ri_html->add( ''</ul></p>'' ).
+ 
+    ri_html->add( ''</ul></p>'' ).
+ 
+    ri_html->add( ''<h2>Repository list and favorites</h2>'' ).
+    ri_html->add( ''<p><ul>'' ).
+    ri_html->add( |<li>To favorite a repository, use the {
+                  ri_html->icon( ''star/darkgrey'' ) } icon in the repository list.</li>| ).
+    ri_html->add( |<li>To go to a repository, click on the repository name.</li>| ).
+    ri_html->add( |<li>To go back to your favorites, use the| ).
+    ri_html->add_a(
+      iv_txt = zcl_abapgit_gui_buttons=>repo_list( )
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home ).
+    ri_html->add( |</li>| ).
+ 
+    ri_html->add( \`<li>\` ).
+    ri_html->add_a( iv_txt = ''Explore''
+                    iv_act = zif_abapgit_definitions=>c_action-go_explore ).
+    ri_html->add( '' to find projects using abapGit</li>'' ).
+ 
+ 
+    ri_html->add( ''</ul></p>'' ).
+    ri_html->add( ''</div>'' ).
+ 
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_POPUP_BRANCH_LIST           ', 'CLASS zcl_abapgit_popup_branch_list DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_render_item.
+    INTERFACES zif_abapgit_html_popup.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_url             TYPE string
+        !iv_default_branch  TYPE string OPTIONAL
+        !iv_show_new_option TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_popup)     TYPE REF TO zif_abapgit_html_popup.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_url             TYPE string
+        !iv_default_branch  TYPE string OPTIONAL
+        !iv_show_new_option TYPE abap_bool DEFAULT abap_false.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mv_repo_url TYPE string.
+    DATA mv_default_branch TYPE string.
+    DATA mv_show_new_option TYPE abap_bool.
+ 
+    METHODS fetch_branch_list
+      RETURNING
+        VALUE(rt_branches) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_popup_branch_list IMPLEMENTATION.
+ 
+  METHOD create.
+    CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_branch_list
+      EXPORTING
+        iv_url             = iv_url
+        iv_default_branch  = iv_default_branch
+        iv_show_new_option = iv_show_new_option.
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    mv_repo_url        = iv_url.
+    mv_default_branch  = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && iv_default_branch.
+    mv_show_new_option = iv_show_new_option.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_html_popup~create_picklist.
+ 
+    CREATE OBJECT ro_picklist
+      EXPORTING
+        iv_title         = ''Choose Branch''
+        it_list          = fetch_branch_list( )
+        ii_item_renderer = me.
+ 
+  ENDMETHOD.
+ 
+  METHOD fetch_branch_list.
+ 
+    DATA lo_branches    TYPE REF TO zcl_abapgit_git_branch_list.
+    DATA lv_head_symref TYPE string.
+ 
+    FIELD-SYMBOLS <ls_branch> LIKE LINE OF rt_branches.
+ 
+    lo_branches    = zcl_abapgit_git_transport=>branches( mv_repo_url ).
+    rt_branches    = lo_branches->get_branches_only( ).
+    lv_head_symref = lo_branches->get_head_symref( ).
+ 
+    IF rt_branches IS INITIAL.
+      zcx_abapgit_exception=>raise( ''No branches are available to select'' ).
+    ENDIF.
+ 
+    " Clean up branches: HEAD duplicates, empty names
+    LOOP AT rt_branches ASSIGNING <ls_branch>.
+      IF <ls_branch>-name IS INITIAL.
+        DELETE rt_branches INDEX sy-tabix.
+      ELSEIF <ls_branch>-is_head = abap_true AND lv_head_symref IS NOT INITIAL AND <ls_branch>-name <> lv_head_symref.
+        DELETE rt_branches INDEX sy-tabix.
+      ENDIF.
+    ENDLOOP.
+ 
+    SORT rt_branches BY is_head DESCENDING display_name ASCENDING.
+ 
+    IF mv_show_new_option = abap_true.
+      APPEND INITIAL LINE TO rt_branches ASSIGNING <ls_branch>.
+      <ls_branch>-name = zif_abapgit_popups=>c_new_branch_label.
+      <ls_branch>-display_name = zif_abapgit_popups=>c_new_branch_label.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_gui_render_item~render.
+ 
+    DATA lv_head_marker TYPE string.
+    FIELD-SYMBOLS <ls_b> TYPE zif_abapgit_git_definitions=>ty_git_branch.
+ 
+    ASSIGN iv_item TO <ls_b>.
+    ASSERT sy-subrc = 0.
+ 
+    " TODO render mv_default_branch properly, needs respecting support from the picklist components
+ 
+    IF <ls_b>-is_head = abap_true.
+      lv_head_marker = | (<b>{ zif_abapgit_git_definitions=>c_head_name }</b>)|.
+    ENDIF.
+ 
+    ri_html = zcl_abapgit_html=>create( |{ <ls_b>-display_name }{ lv_head_marker }| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_POPUP_CODE_INSP             ', 'CLASS zcl_abapgit_popup_code_insp DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_render_item .
+    INTERFACES zif_abapgit_html_popup .
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_popup) TYPE REF TO zif_abapgit_html_popup .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS fetch_list
+      RETURNING
+        VALUE(rt_list) TYPE zif_abapgit_code_inspector=>ty_variants
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_POPUP_CODE_INSP IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_code_insp.
+  ENDMETHOD.
+ 
+ 
+  METHOD fetch_list.
+ 
+    rt_list = zcl_abapgit_factory=>get_code_inspector( ''$TMP'' )->list_global_variants( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_render_item~render.
+ 
+    FIELD-SYMBOLS <ls_item> TYPE LINE OF zif_abapgit_code_inspector=>ty_variants.
+ 
+    ASSIGN iv_item TO <ls_item>.
+    ASSERT sy-subrc = 0.
+ 
+    ri_html = zcl_abapgit_html=>create( |<b>{ <ls_item>-name }</b> - { <ls_item>-description }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_popup~create_picklist.
+ 
+    CREATE OBJECT ro_picklist
+      EXPORTING
+        iv_title         = ''Choose Variant''
+        it_list          = fetch_list( )
+        ii_item_renderer = me.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_POPUP_PULL_REQUEST          ', 'CLASS zcl_abapgit_popup_pull_request DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_render_item.
+    INTERFACES zif_abapgit_html_popup.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        iv_url          TYPE string
+      RETURNING
+        VALUE(ri_popup) TYPE REF TO zif_abapgit_html_popup.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_url TYPE string.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mv_repo_url TYPE string.
+ 
+    METHODS fetch_pull_request_list
+      RETURNING
+        VALUE(rt_pulls) TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_popup_pull_request IMPLEMENTATION.
+ 
+  METHOD create.
+ 
+    CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_pull_request
+      EXPORTING
+        iv_url = iv_url.
+ 
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    mv_repo_url = iv_url.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_html_popup~create_picklist.
+ 
+    CREATE OBJECT ro_picklist
+      EXPORTING
+        iv_title         = ''Choose Pull Request''
+        it_list          = fetch_pull_request_list( )
+        ii_item_renderer = me.
+ 
+  ENDMETHOD.
+ 
+  METHOD fetch_pull_request_list.
+ 
+    rt_pulls = zcl_abapgit_pr_enumerator=>new( mv_repo_url )->get_pulls( ).
+ 
+    IF lines( rt_pulls ) = 0.
+      zcx_abapgit_exception=>raise( ''No pull requests found'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_render_item~render.
+ 
+    FIELD-SYMBOLS <ls_pr> TYPE zif_abapgit_pr_enum_provider=>ty_pull_request.
+ 
+    ASSIGN iv_item TO <ls_pr>.
+    ASSERT sy-subrc = 0.
+ 
+    ri_html = zcl_abapgit_html=>create( |<b>{ <ls_pr>-number }</b> - { <ls_pr>-title } @{ <ls_pr>-user }| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_POPUP_TAG_LIST              ', 'CLASS zcl_abapgit_popup_tag_list DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_render_item.
+    INTERFACES zif_abapgit_html_popup.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        iv_url          TYPE string
+      RETURNING
+        VALUE(ri_popup) TYPE REF TO zif_abapgit_html_popup.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_url TYPE string.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mv_repo_url TYPE string.
+ 
+    METHODS fetch_tag_list
+      RETURNING
+        VALUE(rt_tags) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_popup_tag_list IMPLEMENTATION.
+ 
+  METHOD create.
+    CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_tag_list
+      EXPORTING
+        iv_url = iv_url.
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    mv_repo_url = iv_url.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_html_popup~create_picklist.
+ 
+    CREATE OBJECT ro_picklist
+      EXPORTING
+        iv_title         = ''Choose Tag''
+        it_list          = fetch_tag_list( )
+        ii_item_renderer = me.
+ 
+  ENDMETHOD.
+ 
+  METHOD fetch_tag_list.
+ 
+    DATA lo_branches  TYPE REF TO zcl_abapgit_git_branch_list.
+ 
+    lo_branches = zcl_abapgit_git_transport=>branches( mv_repo_url ).
+    rt_tags     = lo_branches->get_tags_only( ).
+ 
+    DELETE rt_tags WHERE name CP ''*'' && zif_abapgit_git_definitions=>c_git_branch-peel.
+ 
+    IF lines( rt_tags ) = 0.
+      zcx_abapgit_exception=>raise( ''No tags are available to select'' ).
+    ENDIF.
+ 
+    SORT rt_tags BY display_name ASCENDING.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_render_item~render.
+ 
+    FIELD-SYMBOLS <ls_tag> TYPE zif_abapgit_git_definitions=>ty_git_branch.
+ 
+    ASSIGN iv_item TO <ls_tag>.
+    ASSERT sy-subrc = 0.
+ 
+    ri_html = zcl_abapgit_html=>create( |{ <ls_tag>-display_name }| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_GUI_ROUTER                  ', 'CLASS zcl_abapgit_gui_router DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS general_page_routing
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS abapgit_services_actions
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS db_actions
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS file_download
+      IMPORTING
+        !iv_package TYPE devclass
+        !iv_xstr    TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    METHODS git_services
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS sap_gui_actions
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS other_utilities
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS zip_services
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS repository_services
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_page_diff
+      IMPORTING
+        !ii_event      TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_page_stage
+      IMPORTING
+        !ii_event      TYPE REF TO zif_abapgit_gui_event
+        ii_obj_filter  TYPE REF TO zif_abapgit_object_filter OPTIONAL
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS jump_object
+      IMPORTING
+        !iv_obj_type   TYPE string
+        !iv_obj_name   TYPE string
+        !iv_filename   TYPE string
+        !iv_sub_type   TYPE string OPTIONAL
+        !iv_sub_name   TYPE string OPTIONAL
+        !iv_line       TYPE string OPTIONAL
+        !iv_new_window TYPE string DEFAULT ''X''
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS jump_display_transport
+      IMPORTING
+        !iv_transport TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS jump_display_user
+      IMPORTING
+        !iv_username TYPE syuname
+      RAISING
+        zcx_abapgit_exception .
+    METHODS call_browser
+      IMPORTING
+        !iv_url TYPE csequence
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_state_settings
+      IMPORTING
+        !ii_event       TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rv_state) TYPE i .
+    METHODS get_state_diff
+      IMPORTING
+        !ii_event       TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rv_state) TYPE i .
+    METHODS main_page
+      RETURNING VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING   zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_router IMPLEMENTATION.
+ 
+ 
+  METHOD abapgit_services_actions.
+ 
+    IF ii_event->mv_action = zif_abapgit_definitions=>c_action-abapgit_home.
+      rs_handled-page  = zcl_abapgit_gui_page_repo_over=>create( ).
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD call_browser.
+ 
+    zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = |{ iv_url }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD db_actions.
+ 
+    DATA ls_db_key TYPE zif_abapgit_persistence=>ty_content.
+    DATA lo_query TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_query = ii_event->query( ).
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-db_edit.
+        lo_query->to_abap( CHANGING cs_container = ls_db_key ).
+        rs_handled-page  = zcl_abapgit_gui_page_db_entry=>create(
+          is_key       = ls_db_key
+          iv_edit_mode = abap_true ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-db_display.
+        lo_query->to_abap( CHANGING cs_container = ls_db_key ).
+        rs_handled-page  = zcl_abapgit_gui_page_db_entry=>create( ls_db_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD file_download.
+ 
+    DATA:
+      lv_path    TYPE string,
+      lv_default TYPE string,
+      li_fe_serv TYPE REF TO zif_abapgit_frontend_services,
+      lv_package TYPE devclass.
+ 
+    lv_package = iv_package.
+    TRANSLATE lv_package USING ''/#''.
+    CONCATENATE lv_package ''_'' sy-datlo ''_'' sy-timlo INTO lv_default.
+ 
+    li_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lv_path = li_fe_serv->show_file_save_dialog(
+      iv_title            = ''Export ZIP''
+      iv_extension        = ''zip''
+      iv_default_filename = lv_default ).
+ 
+    li_fe_serv->file_download(
+      iv_path = lv_path
+      iv_xstr = iv_xstr ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD general_page_routing.
+ 
+    DATA: lv_key              TYPE zif_abapgit_persistence=>ty_repo-key,
+          lv_last_repo_key    TYPE zif_abapgit_persistence=>ty_repo-key,
+          lo_obj_filter_trans TYPE REF TO zcl_abapgit_object_filter_tran,
+          lo_repo             TYPE REF TO zcl_abapgit_repo,
+          lt_r_trkorr         TYPE zif_abapgit_definitions=>ty_trrngtrkor_tt.
+ 
+    lv_key = ii_event->query( )->get( ''KEY'' ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_home.
+        lv_last_repo_key = zcl_abapgit_persistence_user=>get_instance( )->get_repo_show( ).
+ 
+        IF lv_last_repo_key IS NOT INITIAL.
+          rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lv_last_repo_key ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+        ELSE.
+          rs_handled-page = main_page( ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+        ENDIF.
+      WHEN zif_abapgit_definitions=>c_action-go_db.                          " Go DB util page
+        rs_handled-page  = zcl_abapgit_gui_page_db=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-go_debuginfo.                   " Go debug info
+        rs_handled-page  = zcl_abapgit_gui_page_debuginfo=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-go_settings.                    " Go global settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_glob=>create( ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-go_settings_personal.           " Go personal settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_pers=>create( ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-go_background_run.              " Go background run page
+        rs_handled-page  = zcl_abapgit_gui_page_run_bckg=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-go_repo_diff                         " Go Diff page
+        OR zif_abapgit_definitions=>c_action-go_file_diff.
+        rs_handled-page  = get_page_diff( ii_event ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
+      WHEN zif_abapgit_definitions=>c_action-go_stage.                        " Go Staging page
+        rs_handled-page  = get_page_stage( ii_event ).
+        rs_handled-state = get_state_diff( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-go_stage_transport.              " Go Staging page by Transport
+ 
+        lt_r_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_select_wb_tc_tr_and_tsk( ).
+ 
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+ 
+        CREATE OBJECT lo_obj_filter_trans.
+        lo_obj_filter_trans->set_filter_values( iv_package  = lo_repo->get_package( )
+                                                it_r_trkorr = lt_r_trkorr ).
+ 
+        rs_handled-page = get_page_stage( ii_event      = ii_event
+                                          ii_obj_filter = lo_obj_filter_trans ).
+        rs_handled-state = get_state_diff( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-go_tutorial.                     " Go to tutorial
+        rs_handled-page  = zcl_abapgit_gui_page_tutorial=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-documentation.                   " abapGit docs
+        zcl_abapgit_services_abapgit=>open_abapgit_wikipage( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-go_explore.                      " dotabap
+        zcl_abapgit_services_abapgit=>open_dotabap_homepage( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-changelog.                       " abapGit full changelog
+        zcl_abapgit_services_abapgit=>open_abapgit_changelog( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-homepage.                        " abapGit homepage
+        zcl_abapgit_services_abapgit=>open_abapgit_homepage( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-sponsor.                         " abapGit sponsor us
+        zcl_abapgit_services_abapgit=>open_abapgit_homepage( ''sponsor.html'' ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-show_hotkeys.                    " show hotkeys
+        zcl_abapgit_ui_factory=>get_gui_services(
+                             )->get_hotkeys_ctl(
+                             )->set_visible( abap_true ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_page_diff.
+ 
+    DATA: ls_file   TYPE zif_abapgit_git_definitions=>ty_file,
+          ls_object TYPE zif_abapgit_definitions=>ty_item,
+          lo_page   TYPE REF TO zcl_abapgit_gui_page_diff,
+          lv_key    TYPE zif_abapgit_persistence=>ty_repo-key.
+ 
+    lv_key             = ii_event->query( )->get( ''KEY'' ).
+    ls_file-path       = ii_event->query( )->get( ''PATH'' ).
+    ls_file-filename   = ii_event->query( )->get( ''FILENAME'' ). " unescape ?
+    ls_object-obj_type = ii_event->query( )->get( ''OBJ_TYPE'' ).
+    ls_object-obj_name = ii_event->query( )->get( ''OBJ_NAME'' ). " unescape ?
+ 
+    CREATE OBJECT lo_page
+      EXPORTING
+        iv_key    = lv_key
+        is_file   = ls_file
+        is_object = ls_object.
+ 
+    ri_page = lo_page.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_page_stage.
+ 
+    DATA: lo_repo                TYPE REF TO zcl_abapgit_repo_online,
+          lv_key                 TYPE zif_abapgit_persistence=>ty_repo-key,
+          lv_seed                TYPE string,
+          lo_stage_page          TYPE REF TO zcl_abapgit_gui_page_stage,
+          lo_code_inspector_page TYPE REF TO zcl_abapgit_gui_page_code_insp,
+          lv_sci_result          TYPE zif_abapgit_definitions=>ty_sci_result,
+          lx_error               TYPE REF TO cx_sy_move_cast_error.
+ 
+    lv_key   = ii_event->query( )->get( ''KEY'' ).
+    lv_seed  = ii_event->query( )->get( ''SEED'' ).
+ 
+    lv_sci_result = zif_abapgit_definitions=>c_sci_result-no_run.
+ 
+    TRY.
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+      CATCH cx_sy_move_cast_error INTO lx_error.
+        zcx_abapgit_exception=>raise( \`Staging is only possible for online repositories.\` ).
+    ENDTRY.
+ 
+    IF lo_repo->get_selected_branch( ) CP zif_abapgit_git_definitions=>c_git_branch-tags.
+      zcx_abapgit_exception=>raise( |You are working on a tag, must be on branch| ).
+    ELSEIF lo_repo->get_selected_commit( ) IS NOT INITIAL.
+      zcx_abapgit_exception=>raise( |You are working on a commit, must be on branch| ).
+    ENDIF.
+ 
+    IF lo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL.
+      CREATE OBJECT lo_code_inspector_page
+        EXPORTING
+          io_repo = lo_repo.
+ 
+      IF lo_code_inspector_page->is_nothing_to_display( ) = abap_true.
+        lv_sci_result = zif_abapgit_definitions=>c_sci_result-passed.
+      ELSE.
+        ri_page = lo_code_inspector_page.
+      ENDIF.
+    ENDIF.
+ 
+    IF ri_page IS INITIAL.
+      " force refresh on stage, to make sure the latest local and remote files are used
+      lo_repo->refresh( ).
+ 
+      CREATE OBJECT lo_stage_page
+        EXPORTING
+          io_repo       = lo_repo
+          iv_seed       = lv_seed
+          iv_sci_result = lv_sci_result
+          ii_obj_filter = ii_obj_filter.
+ 
+      ri_page = lo_stage_page.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_state_diff.
+ 
+    " Bookmark current page before jumping to diff page
+    IF ii_event->mv_current_page_name CP ''ZCL_ABAPGIT_GUI_PAGE_DIFF''.
+      rv_state = zcl_abapgit_gui=>c_event_state-new_page.
+    ELSE.
+      rv_state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_state_settings.
+ 
+    " Bookmark current page before jumping to any settings page
+    IF ii_event->mv_current_page_name CP ''ZCL_ABAPGIT_GUI_PAGE_SETT_*''.
+      rv_state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+    ELSE.
+      rv_state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD git_services.
+ 
+    DATA lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
+    DATA li_repo TYPE REF TO zif_abapgit_repo.
+ 
+    lv_key = ii_event->query( )->get( ''KEY'' ).
+ 
+    IF lv_key IS NOT INITIAL.
+      li_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+    ENDIF.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-git_pull.                      " GIT Pull
+        zcl_abapgit_services_git=>pull( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_create.             " GIT Create new branch
+        zcl_abapgit_services_git=>create_branch( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_delete.             " GIT Delete remote branch
+        zcl_abapgit_services_git=>delete_branch( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_switch.             " GIT Switch branch
+        zcl_abapgit_services_git=>switch_branch( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_merge.              " GIT Merge branch
+        rs_handled-page  = zcl_abapgit_gui_page_merge_sel=>create( li_repo ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-git_tag_create.                " GIT Tag create
+        rs_handled-page  = zcl_abapgit_gui_page_tags=>create( li_repo ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-git_tag_delete.                " GIT Tag delete
+        zcl_abapgit_services_git=>delete_tag( lv_key ).
+        zcl_abapgit_services_repo=>refresh( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_tag_switch.                " GIT Switch Tag
+        zcl_abapgit_services_git=>switch_tag( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_display_transport.
+ 
+    DATA:
+      lv_adt_link         TYPE string,
+      lv_adt_jump_enabled TYPE abap_bool.
+ 
+    lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
+    IF lv_adt_jump_enabled = abap_true.
+      TRY.
+          lv_adt_link = zcl_abapgit_adt_link=>link_transport( iv_transport ).
+          zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ).
+        CATCH zcx_abapgit_exception.
+          " Fallback if ADT link execution failed or was cancelled
+          CALL FUNCTION ''TR_DISPLAY_REQUEST''
+            EXPORTING
+              i_trkorr = iv_transport.
+      ENDTRY.
+    ELSE.
+      CALL FUNCTION ''TR_DISPLAY_REQUEST''
+        EXPORTING
+          i_trkorr = iv_transport.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_display_user.
+ 
+    " todo, user display in ADT
+ 
+    CALL FUNCTION ''BAPI_USER_DISPLAY''
+      EXPORTING
+        username = iv_username.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_object.
+ 
+    DATA:
+      ls_item        TYPE zif_abapgit_definitions=>ty_item,
+      ls_sub_item    TYPE zif_abapgit_definitions=>ty_item,
+      lx_error       TYPE REF TO zcx_abapgit_exception,
+      lv_line_number TYPE i,
+      lv_new_window  TYPE abap_bool,
+      li_html_viewer TYPE REF TO zif_abapgit_html_viewer.
+ 
+    ls_item-obj_type = cl_http_utility=>unescape_url( |{ iv_obj_type }| ).
+    ls_item-obj_name = cl_http_utility=>unescape_url( |{ iv_obj_name }| ).
+    ls_sub_item-obj_type = cl_http_utility=>unescape_url( |{ iv_sub_type }| ).
+    ls_sub_item-obj_name = cl_http_utility=>unescape_url( |{ iv_sub_name }| ).
+ 
+    IF iv_line CO ''0123456789''.
+      lv_line_number = iv_line.
+    ENDIF.
+    lv_new_window = boolc( iv_new_window IS NOT INITIAL ).
+ 
+    TRY.
+        li_html_viewer = zcl_abapgit_ui_factory=>get_html_viewer( ).
+ 
+        " Hide HTML Viewer in dummy screen0 for direct CALL SCREEN to work
+        li_html_viewer->set_visiblity( abap_false ).
+ 
+        IF ls_item-obj_type = zif_abapgit_data_config=>c_data_type-tabu.
+          zcl_abapgit_data_utils=>jump( ls_item ).
+        ELSEIF lv_line_number IS INITIAL OR ls_sub_item IS INITIAL.
+          zcl_abapgit_objects=>jump(
+            is_item       = ls_item
+            iv_filename   = iv_filename
+            iv_new_window = lv_new_window ).
+        ELSE.
+          zcl_abapgit_objects=>jump(
+            is_item        = ls_item
+            is_sub_item    = ls_sub_item
+            iv_filename    = iv_filename
+            iv_line_number = lv_line_number
+            iv_new_window  = lv_new_window ).
+        ENDIF.
+ 
+        li_html_viewer->set_visiblity( abap_true ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        li_html_viewer->set_visiblity( abap_true ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD main_page.
+ 
+    DATA lt_repo_all_list TYPE zif_abapgit_repo_srv=>ty_repo_list.
+ 
+    " if there are no favorites, check if there are any repositories at all
+    " if not, go to tutorial where the user can create the first repository
+    lt_repo_all_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+    IF lt_repo_all_list IS NOT INITIAL.
+      ri_page = zcl_abapgit_gui_page_repo_over=>create( ).
+    ELSE.
+      ri_page = zcl_abapgit_gui_page_tutorial=>create( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD other_utilities.
+    TYPES ty_char600 TYPE c LENGTH 600.
+    DATA lv_clip_content TYPE string.
+    DATA lt_clipboard TYPE STANDARD TABLE OF ty_char600.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-ie_devtools.
+        zcl_abapgit_services_basis=>open_ie_devtools( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-clipboard.
+        lv_clip_content = ii_event->query( )->get( ''CLIPBOARD'' ).
+        APPEND lv_clip_content TO lt_clipboard.
+        zcl_abapgit_ui_factory=>get_frontend_services( )->clipboard_export( lt_clipboard ).
+        MESSAGE ''Successfully exported URL to Clipboard.'' TYPE ''S''.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-yank_to_clipboard.
+        lv_clip_content = ii_event->form_data( )->get( ''CLIPBOARD'' ).
+        APPEND lv_clip_content TO lt_clipboard.
+        zcl_abapgit_ui_factory=>get_frontend_services( )->clipboard_export( lt_clipboard ).
+        MESSAGE ''Successfully exported to Clipboard.'' TYPE ''S''.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD repository_services.
+ 
+    DATA:
+      lv_key  TYPE zif_abapgit_persistence=>ty_repo-key,
+      lo_repo TYPE REF TO zcl_abapgit_repo,
+      li_log  TYPE REF TO zif_abapgit_log.
+ 
+    lv_key = ii_event->query( )->get( ''KEY'' ).
+    IF lv_key IS NOT INITIAL.
+      lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+    ENDIF.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-repo_newoffline.                 " New offline repo
+        rs_handled-page  = zcl_abapgit_gui_page_addofflin=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-repo_add_all_obj_to_trans_req.   " Add objects to transport
+        zcl_abapgit_transport=>add_all_objects_to_trans_req( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_refresh.                    " Repo refresh
+        zcl_abapgit_services_repo=>refresh( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_syntax_check.
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_syntax " Syntax check
+          EXPORTING
+            io_repo = lo_repo.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-repo_code_inspector.             " Code inspector
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_code_insp
+          EXPORTING
+            io_repo = lo_repo.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-repo_purge.                      " Repo purge all objects (uninstall)
+        zcl_abapgit_services_repo=>purge( lv_key ).
+        rs_handled-page  = zcl_abapgit_gui_page_repo_over=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+      WHEN zif_abapgit_definitions=>c_action-repo_remove.                     " Repo remove
+        zcl_abapgit_services_repo=>remove( lv_key ).
+        rs_handled-page  = zcl_abapgit_gui_page_repo_over=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+      WHEN zif_abapgit_definitions=>c_action-repo_activate_objects.           " Repo activate objects
+        zcl_abapgit_services_repo=>activate_objects( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_newonline.                  " New offline repo
+        rs_handled-page  = zcl_abapgit_gui_page_addonline=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-repo_refresh_checksums.          " Rebuild local checksums
+        zcl_abapgit_services_repo=>refresh_local_checksums( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_toggle_fav.                 " Toggle repo as favorite
+        zcl_abapgit_services_repo=>toggle_favorite( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_transport_to_branch.        " Transport to branch
+        zcl_abapgit_services_repo=>transport_to_branch( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_settings.                   " Repo settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_repo=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_local_settings.             " Local repo settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_locl=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_remote_settings.            " Remote repo settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_remo=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_background.                 " Repo background mode
+        rs_handled-page  = zcl_abapgit_gui_page_sett_bckg=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_infos.                      " Repo infos
+        rs_handled-page  = zcl_abapgit_gui_page_sett_info=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_log.                        " Repo log
+        li_log = lo_repo->get_log( ).
+        zcl_abapgit_log_viewer=>show_log( li_log ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sap_gui_actions.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-jump.                          " Open object editor
+        jump_object(
+          iv_obj_type   = ii_event->query( )->get( ''TYPE'' )
+          iv_obj_name   = ii_event->query( )->get( ''NAME'' )
+          iv_filename   = ii_event->query( )->get( ''FILE'' )
+          iv_sub_type   = ii_event->query( )->get( ''SUBTYPE'' )
+          iv_sub_name   = ii_event->query( )->get( ''SUBNAME'' )
+          iv_line       = ii_event->query( )->get( ''LINE'' )
+          iv_new_window = ii_event->query( )->get( ''NEW_WINDOW'' ) ).
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-jump_transport.
+        jump_display_transport( |{ ii_event->query( )->get( ''TRANSPORT'' ) }| ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-jump_user.
+        jump_display_user( |{ ii_event->query( )->get( ''USER'' ) }| ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-url.
+        call_browser( ii_event->query( )->get( ''URL'' ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    rs_handled = zcl_abapgit_exit=>get_instance( )->on_event( ii_event ).
+ 
+    IF rs_handled-state IS INITIAL.
+      rs_handled = general_page_routing( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = repository_services( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = git_services( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = zip_services( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = db_actions( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = abapgit_services_actions( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = sap_gui_actions( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = other_utilities( ii_event ).
+    ENDIF.
+ 
+    IF rs_handled-state IS INITIAL.
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-not_handled.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zip_services.
+ 
+    DATA: lv_key              TYPE zif_abapgit_persistence=>ty_repo-key,
+          lo_repo             TYPE REF TO zcl_abapgit_repo,
+          lv_path             TYPE string,
+          lv_dest             TYPE rfcdest,
+          lv_msg              TYPE c LENGTH 200,
+          lv_xstr             TYPE xstring,
+          lv_package          TYPE zif_abapgit_persistence=>ty_repo-package,
+          lv_folder_logic     TYPE string,
+          lv_main_lang_only   TYPE zif_abapgit_persistence=>ty_local_settings-main_language_only,
+          lo_obj_filter_trans TYPE REF TO zcl_abapgit_object_filter_tran,
+          lt_r_trkorr         TYPE zif_abapgit_definitions=>ty_trrngtrkor_tt.
+ 
+    CONSTANTS:
+      BEGIN OF lc_page,
+        main_view TYPE string VALUE ''ZCL_ABAPGIT_GUI_PAGE_MAIN'',
+        repo_view TYPE string VALUE ''ZCL_ABAPGIT_GUI_PAGE_REPO_VIEW'',
+      END OF lc_page.
+ 
+    lv_key = ii_event->query( )->get( ''KEY'' ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-zip_import                       " Import repo from ZIP
+        OR zif_abapgit_definitions=>c_action-rfc_compare.                     " Compare repo via RFC
+ 
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+ 
+        IF ii_event->mv_action = zif_abapgit_definitions=>c_action-zip_import.
+          lv_path = zcl_abapgit_ui_factory=>get_frontend_services( )->show_file_open_dialog(
+            iv_title            = ''Import ZIP''
+            iv_extension        = ''zip''
+            iv_default_filename = ''*.zip'' ).
+          lv_xstr = zcl_abapgit_ui_factory=>get_frontend_services( )->file_upload( lv_path ).
+        ELSE.
+          lv_dest = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( ''RFCDES-RFCDEST'' ).
+ 
+          IF lv_dest IS INITIAL.
+            rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+            RETURN.
+          ENDIF.
+ 
+          lv_package            = lo_repo->get_package( ).
+          lv_folder_logic       = lo_repo->get_dot_abapgit( )->get_folder_logic( ).
+          lv_main_lang_only     = lo_repo->get_local_settings( )-main_language_only.
+ 
+          CALL FUNCTION ''Z_ABAPGIT_SERIALIZE_PACKAGE''
+            DESTINATION lv_dest
+            EXPORTING
+              iv_package            = lv_package
+              iv_folder_logic       = lv_folder_logic
+              iv_main_lang_only     = lv_main_lang_only
+            IMPORTING
+              ev_xstring            = lv_xstr
+            EXCEPTIONS
+              system_failure        = 1 MESSAGE lv_msg
+              communication_failure = 2 MESSAGE lv_msg
+              OTHERS                = 3.
+          IF sy-subrc <> 0.
+            zcx_abapgit_exception=>raise( |RFC import error: { lv_msg }| ).
+          ENDIF.
+        ENDIF.
+ 
+        lo_repo->set_files_remote( zcl_abapgit_zip=>load( lv_xstr ) ).
+        zcl_abapgit_services_repo=>refresh( lv_key ).
+ 
+        CASE ii_event->mv_current_page_name.
+          WHEN lc_page-repo_view.
+            rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+          WHEN lc_page-main_view.
+            rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lo_repo->get_key( ) ).
+            rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+          WHEN OTHERS.
+            rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDCASE.
+      WHEN zif_abapgit_definitions=>c_action-zip_export.                      " Export repo as ZIP
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+        lv_xstr = zcl_abapgit_zip=>encode_files( lo_repo->get_files_local( ) ).
+        file_download( iv_package = lo_repo->get_package( )
+                       iv_xstr    = lv_xstr ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-zip_export_transport.                      " Export repo as ZIP
+ 
+        lt_r_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_select_wb_tc_tr_and_tsk( ).
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+        lo_repo->refresh( ).
+        CREATE OBJECT lo_obj_filter_trans.
+        lo_obj_filter_trans->set_filter_values( iv_package  = lo_repo->get_package( )
+                                                it_r_trkorr = lt_r_trkorr ).
+ 
+        lv_xstr = zcl_abapgit_zip=>encode_files( lo_repo->get_files_local( ii_obj_filter = lo_obj_filter_trans ) ).
+        lo_repo->refresh( ).
+        file_download( iv_package = lo_repo->get_package( )
+                       iv_xstr    = lv_xstr ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-zip_package.                     " Export package as ZIP
+        rs_handled-page  = zcl_abapgit_gui_page_ex_pckage=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-zip_transport.                   " Export transports as ZIP
+        zcl_abapgit_transport_mass=>run( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-zip_object.                      " Export object as ZIP
+        rs_handled-page  = zcl_abapgit_gui_page_ex_object=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SERVICES_ABAPGIT            ', 'CLASS zcl_abapgit_services_abapgit DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_abapgit_repo TYPE string VALUE ''https://github.com/abapGit/abapGit'' ##NO_TEXT.
+    CONSTANTS c_abapgit_homepage TYPE string VALUE ''https://www.abapgit.org'' ##NO_TEXT.
+    CONSTANTS c_abapgit_wikipage TYPE string VALUE ''https://docs.abapgit.org'' ##NO_TEXT.
+    CONSTANTS c_dotabap_homepage TYPE string VALUE ''https://dotabap.org'' ##NO_TEXT.
+    CONSTANTS c_abapgit_class TYPE seoclsname VALUE \`ZCX_ABAPGIT_EXCEPTION\` ##NO_TEXT.
+    CONSTANTS c_changelog_path TYPE string VALUE ''/blob/main/changelog.txt'' ##NO_TEXT.
+ 
+    CLASS-METHODS open_abapgit_homepage
+      IMPORTING
+        iv_page TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_abapgit_wikipage
+      IMPORTING
+        iv_page TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_dotabap_homepage
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_abapgit_changelog
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_installed
+      RETURNING
+        VALUE(rv_devclass) TYPE tadir-devclass .
+    CLASS-METHODS prepare_gui_startup
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_abapgit_tcode
+      RETURNING
+        VALUE(rv_tcode) TYPE tcode .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS set_start_repo_from_package
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_package_from_adt
+      RETURNING
+        VALUE(rv_package) TYPE devclass .
+    CLASS-METHODS check_sapgui
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_url_in_browser
+      IMPORTING
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_services_abapgit IMPLEMENTATION.
+ 
+ 
+  METHOD check_sapgui.
+ 
+    CONSTANTS:
+      lc_hide_sapgui_hint TYPE string VALUE ''2''.
+ 
+    DATA:
+      lv_answer           TYPE char1,
+      ls_settings         TYPE zif_abapgit_definitions=>ty_s_user_settings,
+      li_user_persistence TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user_persistence = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    ls_settings = li_user_persistence->get_settings( ).
+ 
+    IF ls_settings-hide_sapgui_hint = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    IF zcl_abapgit_ui_factory=>get_frontend_services( )->is_sapgui_for_java( ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+                    iv_titlebar              = ''Not supported SAPGUI''
+                    iv_text_question         = ''SAPGUI for Java is not supported! There might be some issues.''
+                    iv_text_button_1         = ''Got it''
+                    iv_icon_button_1         = |{ icon_okay }|
+                    iv_text_button_2         = ''Hide''
+                    iv_icon_button_2         = |{ icon_set_state }|
+                    iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer = lc_hide_sapgui_hint.
+      ls_settings-hide_sapgui_hint = abap_true.
+      li_user_persistence->set_settings( ls_settings ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_abapgit_tcode.
+    CONSTANTS: lc_report_tcode_hex TYPE x VALUE ''80''.
+    DATA: lt_tcodes TYPE STANDARD TABLE OF tcode.
+ 
+    SELECT tcode
+      FROM tstc
+      INTO TABLE lt_tcodes
+      WHERE pgmna = sy-cprog
+        AND cinfo = lc_report_tcode_hex.
+ 
+    IF lines( lt_tcodes ) > 0.
+      READ TABLE lt_tcodes INDEX 1 INTO rv_tcode.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_package_from_adt.
+ 
+    DATA: ls_item    TYPE zif_abapgit_definitions=>ty_item,
+          lr_context TYPE REF TO data,
+          lt_fields  TYPE tihttpnvp.
+ 
+ 
+    FIELD-SYMBOLS: <lg_context>    TYPE any,
+                   <lv_parameters> TYPE string,
+                   <ls_field>      LIKE LINE OF lt_fields.
+ 
+    ls_item-obj_type = ''CLAS''.
+    ls_item-obj_name = ''CL_ADT_GUI_INTEGRATION_CONTEXT''.
+ 
+    IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+      " ADT is not supported in this NW release
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        CREATE DATA lr_context TYPE (''CL_ADT_GUI_INTEGRATION_CONTEXT=>TY_CONTEXT_INFO'').
+ 
+        ASSIGN lr_context->* TO <lg_context>.
+        ASSERT sy-subrc = 0.
+ 
+        CALL METHOD (''CL_ADT_GUI_INTEGRATION_CONTEXT'')=>read_context
+          RECEIVING
+            result = <lg_context>.
+ 
+        ASSIGN COMPONENT ''PARAMETERS''
+               OF STRUCTURE <lg_context>
+               TO <lv_parameters>.
+        ASSERT sy-subrc = 0.
+ 
+        lt_fields = cl_http_utility=>string_to_fields( cl_http_utility=>unescape_url( <lv_parameters> ) ).
+ 
+        READ TABLE lt_fields ASSIGNING <ls_field>
+                             WITH KEY name = ''p_package_name''.
+        IF sy-subrc = 0.
+          rv_package = <ls_field>-value.
+ 
+          " We want to open the repo just once. Therefore we delete the parameters
+          " and initialize the ADT context.
+          CLEAR <lv_parameters>.
+          CALL METHOD (''CL_ADT_GUI_INTEGRATION_CONTEXT'')=>initialize_instance
+            EXPORTING
+              context_info = <lg_context>.
+ 
+        ENDIF.
+ 
+      CATCH cx_root.
+        " Some problems with dynamic ADT access.
+        " Let''s ignore it for now and fail silently
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_installed.
+ 
+    SELECT SINGLE devclass FROM tadir INTO rv_devclass
+      WHERE pgmid = ''R3TR''
+      AND object = ''CLAS''
+      AND obj_name = c_abapgit_class.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD open_abapgit_changelog.
+    open_url_in_browser( |{ c_abapgit_repo }{ c_changelog_path }| ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_abapgit_homepage.
+    open_url_in_browser( |{ c_abapgit_homepage }/{ iv_page }| ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_abapgit_wikipage.
+    open_url_in_browser( |{ c_abapgit_wikipage }/{ iv_page }| ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_dotabap_homepage.
+    open_url_in_browser( c_dotabap_homepage ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_url_in_browser.
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = iv_url ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        zcx_abapgit_exception=>raise( iv_text     = ''Opening page in external browser failed.''
+                                      ix_previous = lx_error ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD prepare_gui_startup.
+ 
+    DATA: lv_repo_key    TYPE zif_abapgit_persistence=>ty_value,
+          lv_package     TYPE devclass,
+          lv_package_adt TYPE devclass.
+ 
+    check_sapgui( ).
+ 
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_show_default_repo( ) = abap_false.
+      " Don''t show the last seen repo at startup
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ).
+    ENDIF.
+ 
+    " We have three special cases for gui startup
+    "   - open a specific repo by repo key
+    "   - open a specific repo by package name
+    "   - open a specific repo by package name provided by ADT
+    " These overrule the last shown repo
+ 
+    GET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_repo_key FIELD lv_repo_key.
+    GET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_package  FIELD lv_package.
+    lv_package_adt = get_package_from_adt( ).
+ 
+    IF lv_repo_key IS NOT INITIAL.
+ 
+      SET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_repo_key FIELD ''''.
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_repo_key ).
+ 
+    ELSEIF lv_package IS NOT INITIAL.
+ 
+      SET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_package FIELD ''''.
+      set_start_repo_from_package( lv_package ).
+ 
+    ELSEIF lv_package_adt IS NOT INITIAL.
+ 
+      set_start_repo_from_package( lv_package_adt ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_start_repo_from_package.
+ 
+    DATA: lo_repo          TYPE REF TO zcl_abapgit_repo,
+          lt_r_package     TYPE RANGE OF devclass,
+          ls_r_package     LIKE LINE OF lt_r_package,
+          lt_superpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+          li_package       TYPE REF TO zif_abapgit_sap_package,
+          lt_repo_list     TYPE zif_abapgit_repo_srv=>ty_repo_list.
+ 
+    FIELD-SYMBOLS: <lo_repo>         TYPE LINE OF zif_abapgit_repo_srv=>ty_repo_list,
+                   <lv_superpackage> LIKE LINE OF lt_superpackages.
+ 
+    li_package = zcl_abapgit_factory=>get_sap_package( iv_package ).
+ 
+    IF li_package->exists( ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    ls_r_package-sign   = ''I''.
+    ls_r_package-option = ''EQ''.
+    ls_r_package-low    = iv_package.
+    INSERT ls_r_package INTO TABLE lt_r_package.
+ 
+    " Also consider superpackages. E.g. when some open $abapgit_ui, abapGit repo
+    " should be found via package $abapgit
+    lt_superpackages = li_package->list_superpackages( ).
+    LOOP AT lt_superpackages ASSIGNING <lv_superpackage>.
+      ls_r_package-low = <lv_superpackage>.
+      INSERT ls_r_package INTO TABLE lt_r_package.
+    ENDLOOP.
+ 
+    lt_repo_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+ 
+    LOOP AT lt_repo_list ASSIGNING <lo_repo>.
+ 
+      IF <lo_repo>->get_package( ) IN lt_r_package.
+        lo_repo ?= <lo_repo>.
+        EXIT.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF lo_repo IS BOUND.
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lo_repo->get_key( ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SERVICES_BASIS              ', 'CLASS zcl_abapgit_services_basis DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create_package
+      IMPORTING
+        !iv_prefill_package TYPE devclass OPTIONAL
+      RETURNING
+        VALUE(rv_package)   TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_ie_devtools
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CLASS-METHODS raise_error_if_package_exists
+      IMPORTING
+        iv_devclass TYPE scompkdtln-devclass
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_services_basis IMPLEMENTATION.
+ 
+ 
+  METHOD create_package.
+ 
+    DATA ls_package_data TYPE scompkdtln.
+    DATA lv_create       TYPE abap_bool.
+    DATA li_popup        TYPE REF TO zif_abapgit_popups.
+ 
+    ls_package_data-devclass = to_upper( iv_prefill_package ).
+ 
+    raise_error_if_package_exists( ls_package_data-devclass ).
+ 
+    li_popup = zcl_abapgit_ui_factory=>get_popups( ).
+ 
+    li_popup->popup_to_create_package(
+      IMPORTING
+        es_package_data = ls_package_data
+        ev_create       = lv_create ).
+ 
+    IF lv_create = abap_true.
+      zcl_abapgit_factory=>get_sap_package( ls_package_data-devclass )->create( ls_package_data ).
+      rv_package = ls_package_data-devclass.
+      COMMIT WORK.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD open_ie_devtools.
+    DATA: lv_system_directory TYPE string,
+          lv_exe_full_path    TYPE string,
+          lo_frontend_serv    TYPE REF TO zif_abapgit_frontend_services.
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    IF lo_frontend_serv->is_sapgui_for_windows( ) = abap_false.
+      zcx_abapgit_exception=>raise( |IE DevTools not supported on frontend OS| ).
+    ENDIF.
+ 
+    lo_frontend_serv->get_system_directory( CHANGING cv_system_directory = lv_system_directory ).
+ 
+    cl_gui_cfw=>flush( ).
+ 
+    lv_exe_full_path = lv_system_directory && \`\\F12\\IEChooser.exe\`.
+    lo_frontend_serv->execute( iv_application = lv_exe_full_path ).
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_error_if_package_exists.
+ 
+    IF iv_devclass IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    IF zcl_abapgit_factory=>get_sap_package( iv_devclass )->exists( ) = abap_true.
+      zcx_abapgit_exception=>raise( |Package { iv_devclass } already exists| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SERVICES_GIT                ', 'CLASS zcl_abapgit_services_git DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS pull
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS create_branch
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS switch_branch
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS delete_branch
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS delete_tag
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS switch_tag
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS commit
+      IMPORTING
+        !io_repo   TYPE REF TO zcl_abapgit_repo_online
+        !is_commit TYPE zif_abapgit_services_git=>ty_commit_fields
+        !io_stage  TYPE REF TO zcl_abapgit_stage
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_services_git IMPLEMENTATION.
+ 
+ 
+  METHOD commit.
+ 
+    DATA: ls_comment TYPE zif_abapgit_git_definitions=>ty_comment,
+          li_user    TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+    li_user->set_repo_git_user_name( iv_url      = io_repo->get_url( )
+                                     iv_username = is_commit-committer_name ).
+    li_user->set_repo_git_user_email( iv_url   = io_repo->get_url( )
+                                      iv_email = is_commit-committer_email ).
+ 
+    IF is_commit-committer_name IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Commit: Committer name empty'' ).
+    ELSEIF is_commit-committer_email IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Commit: Committer email empty'' ).
+    ELSEIF is_commit-author_email IS NOT INITIAL AND is_commit-author_name IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Commit: Author name empty'' ). " Opposite should be OK ?
+    ELSEIF is_commit-comment IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Commit: empty comment'' ).
+    ENDIF.
+ 
+    ls_comment-committer-name  = is_commit-committer_name.
+    ls_comment-committer-email = is_commit-committer_email.
+    ls_comment-author-name     = is_commit-author_name.
+    ls_comment-author-email    = is_commit-author_email.
+    ls_comment-comment         = is_commit-comment.
+ 
+    IF NOT is_commit-body IS INITIAL.
+      CONCATENATE ls_comment-comment '''' is_commit-body
+        INTO ls_comment-comment SEPARATED BY cl_abap_char_utilities=>newline.
+    ENDIF.
+ 
+    zcl_abapgit_exit=>get_instance(  )->validate_before_push(
+      is_comment = ls_comment
+      io_stage   = io_stage
+      io_repo    = io_repo ).
+ 
+    io_repo->push( is_comment = ls_comment
+                   io_stage   = io_stage ).
+ 
+    COMMIT WORK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_branch.
+ 
+    DATA: lv_name               TYPE string,
+          lv_cancel             TYPE abap_bool,
+          lo_repo               TYPE REF TO zcl_abapgit_repo_online,
+          lv_msg                TYPE string,
+          li_popups             TYPE REF TO zif_abapgit_popups,
+          lv_source_branch_name TYPE string.
+ 
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    lv_source_branch_name = lo_repo->get_selected_branch( ).
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+    li_popups->create_branch_popup(
+      EXPORTING
+        iv_source_branch_name = lv_source_branch_name
+      IMPORTING
+        ev_name               = lv_name
+        ev_cancel             = lv_cancel ).
+ 
+    IF lv_cancel = abap_true.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    lo_repo->create_branch( lv_name ).
+ 
+    lv_msg = |Branch switched from { zcl_abapgit_git_branch_list=>get_display_name( lv_source_branch_name )
+      } to new branch { zcl_abapgit_git_branch_list=>get_display_name( lv_name ) }|.
+    MESSAGE lv_msg TYPE ''S''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_branch.
+ 
+    DATA: lo_repo   TYPE REF TO zcl_abapgit_repo_online,
+          ls_branch TYPE zif_abapgit_git_definitions=>ty_git_branch,
+          lv_msg    TYPE string,
+          li_popups TYPE REF TO zif_abapgit_popups.
+ 
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+    ls_branch = li_popups->branch_list_popup( iv_url         = lo_repo->get_url( )
+                                              iv_hide_branch = lo_repo->get_selected_branch( )
+                                              iv_hide_head   = abap_true ).
+    IF ls_branch IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    zcl_abapgit_git_porcelain=>delete_branch(
+      iv_url    = lo_repo->get_url( )
+      is_branch = ls_branch ).
+ 
+    lv_msg = |Branch { ls_branch-display_name } deleted|.
+    MESSAGE lv_msg TYPE ''S''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_tag.
+ 
+    DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online,
+          ls_tag  TYPE zif_abapgit_git_definitions=>ty_git_tag,
+          lv_text TYPE string.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    ls_tag = zcl_abapgit_ui_factory=>get_popups( )->tag_list_popup( lo_repo->get_url( ) ).
+    IF ls_tag IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    zcl_abapgit_git_porcelain=>delete_tag(
+      iv_url = lo_repo->get_url( )
+      is_tag = ls_tag ).
+ 
+    lv_text = |Tag { ls_tag-display_name } deleted|.
+ 
+    MESSAGE lv_text TYPE ''S''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pull.
+ 
+    DATA: lo_repo TYPE REF TO zcl_abapgit_repo.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    lo_repo->refresh( ).
+ 
+    zcl_abapgit_services_repo=>gui_deserialize( lo_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_branch.
+ 
+    DATA: lo_repo   TYPE REF TO zcl_abapgit_repo_online,
+          ls_branch TYPE zif_abapgit_git_definitions=>ty_git_branch.
+ 
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    ls_branch = zcl_abapgit_ui_factory=>get_popups( )->branch_list_popup(
+      iv_url             = lo_repo->get_url( )
+      iv_default_branch  = lo_repo->get_selected_branch( )
+      iv_show_new_option = abap_true ).
+    IF ls_branch IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    IF ls_branch-name = zif_abapgit_popups=>c_new_branch_label.
+      create_branch( iv_key ).
+      RETURN.
+    ENDIF.
+ 
+    IF lo_repo->get_selected_commit( ) IS NOT INITIAL.
+      lo_repo->select_commit( space ).
+    ENDIF.
+ 
+    lo_repo->select_branch( ls_branch-name ).
+    COMMIT WORK AND WAIT.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_tag.
+ 
+    DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online,
+          ls_tag  TYPE zif_abapgit_git_definitions=>ty_git_tag,
+          lv_text TYPE string.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    ls_tag = zcl_abapgit_ui_factory=>get_popups( )->tag_list_popup( lo_repo->get_url( ) ).
+    IF ls_tag IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    lo_repo->select_branch( zcl_abapgit_git_tag=>remove_peel( ls_tag-name ) ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+    lv_text = |Tag switched to { ls_tag-display_name } |.
+ 
+    MESSAGE lv_text TYPE ''S''.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SERVICES_REPO               ', 'CLASS zcl_abapgit_services_repo DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS new_online
+      IMPORTING
+        !is_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params
+      RETURNING
+        VALUE(ro_repo)  TYPE REF TO zcl_abapgit_repo_online
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS refresh
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS remove
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS purge
+      IMPORTING
+        !iv_key       TYPE zif_abapgit_persistence=>ty_repo-key
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS new_offline
+      IMPORTING
+        !is_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params
+      RETURNING
+        VALUE(ro_repo)  TYPE REF TO zcl_abapgit_repo_offline
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS refresh_local_checksums
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS toggle_favorite
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS transport_to_branch
+      IMPORTING
+        !iv_repository_key TYPE zif_abapgit_persistence=>ty_value
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS gui_deserialize
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS activate_objects
+      IMPORTING
+        !iv_key       TYPE zif_abapgit_persistence=>ty_repo-key
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS delete_unnecessary_objects
+      IMPORTING
+        !io_repo   TYPE REF TO zcl_abapgit_repo
+        !ii_log    TYPE REF TO zif_abapgit_log
+        !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS popup_decisions
+      IMPORTING
+        !io_repo   TYPE REF TO zcl_abapgit_repo
+      CHANGING
+        !cs_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      RAISING
+        zcx_abapgit_cancel
+        zcx_abapgit_exception .
+    CLASS-METHODS popup_overwrite
+      CHANGING
+        !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS popup_package_overwrite
+      CHANGING
+        !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS check_package
+      IMPORTING
+        !is_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_services_repo IMPLEMENTATION.
+ 
+ 
+  METHOD activate_objects.
+ 
+    DATA:
+      lo_repo       TYPE REF TO zcl_abapgit_repo,
+      lo_browser    TYPE REF TO zcl_abapgit_repo_content_list,
+      lt_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt,
+      lv_count      TYPE i,
+      lv_message    TYPE string.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_repo_items.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    CREATE OBJECT lo_browser
+      EXPORTING
+        io_repo = lo_repo.
+ 
+    lt_repo_items = lo_browser->list( ''/'' ).
+ 
+    ri_log = lo_repo->create_new_log( ''Activation Log'' ).
+ 
+    " Add all inactive objects to activation queue
+    zcl_abapgit_objects_activation=>clear( ).
+ 
+    LOOP AT lt_repo_items ASSIGNING <ls_item> WHERE inactive = abap_true.
+      zcl_abapgit_objects_activation=>add(
+        iv_type = <ls_item>-obj_type
+        iv_name = <ls_item>-obj_name ).
+      lv_count = lv_count + 1.
+    ENDLOOP.
+ 
+    IF lv_count = 0.
+      MESSAGE ''No inactive objects found'' TYPE ''S''.
+      RETURN.
+    ENDIF.
+ 
+    " Activate DDIC + non-DDIC
+    zcl_abapgit_objects_activation=>activate(
+      iv_ddic = abap_true
+      ii_log  = ri_log ).
+ 
+    zcl_abapgit_objects_activation=>activate(
+      iv_ddic = abap_false
+      ii_log  = ri_log ).
+ 
+    IF ri_log->get_status( ) <> zif_abapgit_log=>c_status-error.
+      lv_message = |Successfully activated { lv_count } objects|.
+      MESSAGE lv_message TYPE ''S''.
+    ENDIF.
+ 
+    lo_repo->refresh( iv_drop_log = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_package.
+ 
+    DATA:
+      li_repo     TYPE REF TO zif_abapgit_repo,
+      li_repo_srv TYPE REF TO zif_abapgit_repo_srv,
+      lv_reason   TYPE string.
+ 
+    " make sure package is not already in use for a different repository
+    " 702: chaining calls with exp&imp parameters causes syntax error
+    li_repo_srv = zcl_abapgit_repo_srv=>get_instance( ).
+    li_repo_srv->get_repo_from_package(
+      EXPORTING
+        iv_package    = is_repo_params-package
+        iv_ign_subpkg = is_repo_params-ignore_subpackages
+      IMPORTING
+        ei_repo    = li_repo
+        ev_reason  = lv_reason ).
+ 
+    IF li_repo IS BOUND.
+      zcx_abapgit_exception=>raise( lv_reason ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_unnecessary_objects.
+ 
+    DATA:
+      ls_checks TYPE zif_abapgit_definitions=>ty_delete_checks,
+      ls_tadir  TYPE zif_abapgit_definitions=>ty_tadir,
+      lt_tadir  TYPE zif_abapgit_definitions=>ty_tadir_tt.
+ 
+    FIELD-SYMBOLS <ls_overwrite> LIKE LINE OF is_checks-overwrite.
+ 
+    " get confirmed deletions
+    LOOP AT is_checks-overwrite ASSIGNING <ls_overwrite>
+      WHERE ( action = zif_abapgit_objects=>c_deserialize_action-delete
+      OR action = zif_abapgit_objects=>c_deserialize_action-delete_add )
+      AND decision = zif_abapgit_definitions=>c_yes.
+ 
+      ls_tadir-pgmid    = ''R3TR''.
+      ls_tadir-object   = <ls_overwrite>-obj_type.
+      ls_tadir-obj_name = <ls_overwrite>-obj_name.
+      ls_tadir-devclass = <ls_overwrite>-devclass.
+      INSERT ls_tadir INTO TABLE lt_tadir.
+ 
+    ENDLOOP.
+ 
+    " todo, check if object type supports deletion of parts to avoid deleting complete object
+ 
+    " delete objects
+    IF lines( lt_tadir ) > 0.
+      ls_checks-transport = is_checks-transport.
+ 
+      zcl_abapgit_objects=>delete( it_tadir  = lt_tadir
+                                   is_checks = ls_checks
+                                   ii_log    = ii_log ).
+ 
+      io_repo->refresh( iv_drop_log = abap_false ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD gui_deserialize.
+ 
+    DATA:
+      lv_msg    TYPE string,
+      ls_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks,
+      li_log    TYPE REF TO zif_abapgit_log.
+ 
+    " find troublesome objects
+    ls_checks = io_repo->deserialize_checks( ).
+ 
+    IF ls_checks-overwrite IS INITIAL.
+      zcx_abapgit_exception=>raise(
+        ''There is nothing to pull. The local state completely matches the remote repository.'' ).
+    ENDIF.
+ 
+    " let the user decide what to do
+    TRY.
+        popup_decisions(
+          EXPORTING
+            io_repo   = io_repo
+          CHANGING
+            cs_checks = ls_checks ).
+ 
+      CATCH zcx_abapgit_cancel.
+        RETURN.
+    ENDTRY.
+ 
+    li_log = io_repo->create_new_log( ''Pull Log'' ).
+ 
+    " pass decisions to delete
+    delete_unnecessary_objects(
+      io_repo   = io_repo
+      is_checks = ls_checks
+      ii_log    = li_log ).
+ 
+    " pass decisions to deserialize
+    io_repo->deserialize(
+      is_checks = ls_checks
+      ii_log    = li_log ).
+ 
+    IF li_log->get_status( ) = zif_abapgit_log=>c_status-ok.
+      lv_msg = |Repository { io_repo->get_name( ) } successfully pulled for package { io_repo->get_package( ) }|.
+      MESSAGE lv_msg TYPE ''S''.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new_offline.
+ 
+    check_package( is_repo_params ).
+ 
+    " create new repo and add to favorites
+    ro_repo ?= zcl_abapgit_repo_srv=>get_instance( )->new_offline(
+      iv_url            = is_repo_params-url
+      iv_package        = is_repo_params-package
+      iv_folder_logic   = is_repo_params-folder_logic
+      iv_labels         = is_repo_params-labels
+      iv_main_lang_only = is_repo_params-main_lang_only ).
+ 
+    " Make sure there''re no leftovers from previous repos
+    ro_repo->zif_abapgit_repo~checksums( )->rebuild( ).
+    ro_repo->reset_status( ). " TODO refactor later
+ 
+    toggle_favorite( ro_repo->get_key( ) ).
+ 
+    " Set default repo for user
+    zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( ro_repo->get_key( ) ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new_online.
+ 
+    check_package( is_repo_params ).
+ 
+    ro_repo ?= zcl_abapgit_repo_srv=>get_instance( )->new_online(
+      iv_url            = is_repo_params-url
+      iv_branch_name    = is_repo_params-branch_name
+      iv_package        = is_repo_params-package
+      iv_display_name   = is_repo_params-display_name
+      iv_folder_logic   = is_repo_params-folder_logic
+      iv_labels         = is_repo_params-labels
+      iv_ign_subpkg     = is_repo_params-ignore_subpackages
+      iv_main_lang_only = is_repo_params-main_lang_only ).
+ 
+    " Make sure there''re no leftovers from previous repos
+    ro_repo->zif_abapgit_repo~checksums( )->rebuild( ).
+    ro_repo->reset_status( ). " TODO refactor later
+ 
+    toggle_favorite( ro_repo->get_key( ) ).
+ 
+    " Set default repo for user
+    zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( ro_repo->get_key( ) ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD popup_decisions.
+ 
+    DATA:
+      lt_decision     TYPE zif_abapgit_definitions=>ty_overwrite_tt,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      lt_dependencies TYPE zif_abapgit_apack_definitions=>ty_dependencies.
+ 
+    FIELD-SYMBOLS:
+      <ls_overwrite> LIKE LINE OF cs_checks-overwrite,
+      <ls_decision>  LIKE LINE OF lt_decision.
+ 
+    lt_decision = cs_checks-overwrite.
+ 
+    " If there''s a new namespace, it has to be pulled before all other objects
+    READ TABLE lt_decision ASSIGNING <ls_decision> WITH KEY obj_type = ''NSPC''.
+    IF sy-subrc = 0 AND <ls_decision>-action = zif_abapgit_objects=>c_deserialize_action-add.
+      <ls_decision>-decision = zif_abapgit_definitions=>c_yes.
+    ELSE.
+      " Set all new objects to YES
+      LOOP AT lt_decision ASSIGNING <ls_decision> WHERE action = zif_abapgit_objects=>c_deserialize_action-add.
+        <ls_decision>-decision = zif_abapgit_definitions=>c_yes.
+      ENDLOOP.
+    ENDIF.
+ 
+    " Ask user what to do
+    popup_overwrite( CHANGING ct_overwrite = lt_decision ).
+    popup_package_overwrite( CHANGING ct_overwrite = cs_checks-warning_package ).
+ 
+    IF cs_checks-requirements-met = zif_abapgit_definitions=>c_no.
+      lt_requirements = io_repo->get_dot_abapgit( )->get_data( )-requirements.
+      zcl_abapgit_requirement_helper=>requirements_popup( lt_requirements ).
+      cs_checks-requirements-decision = zif_abapgit_definitions=>c_yes.
+    ENDIF.
+ 
+    IF cs_checks-dependencies-met = zif_abapgit_definitions=>c_no.
+      lt_dependencies = io_repo->get_dot_apack( )->get_manifest_descriptor( )-dependencies.
+      zcl_abapgit_apack_helper=>dependencies_popup( lt_dependencies ).
+    ENDIF.
+ 
+    IF  cs_checks-transport-required = abap_true
+    AND cs_checks-transport-transport IS INITIAL.
+      cs_checks-transport-transport = zcl_abapgit_ui_factory=>get_popups( )->popup_transport_request(
+        is_transport_type = cs_checks-transport-type ).
+    ENDIF.
+ 
+    " Update decisions
+    LOOP AT cs_checks-overwrite ASSIGNING <ls_overwrite>.
+      READ TABLE lt_decision ASSIGNING <ls_decision> WITH KEY object_type_and_name COMPONENTS
+        obj_type = <ls_overwrite>-obj_type
+        obj_name = <ls_overwrite>-obj_name.
+      ASSERT sy-subrc = 0.
+      <ls_overwrite>-decision = <ls_decision>-decision.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD popup_overwrite.
+ 
+    DATA: lt_columns  TYPE zif_abapgit_popups=>ty_alv_column_tt,
+          lt_selected LIKE ct_overwrite,
+          li_popups   TYPE REF TO zif_abapgit_popups.
+    DATA lt_preselected_rows TYPE zif_abapgit_popups=>ty_rows.
+ 
+    FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF ct_overwrite,
+                   <ls_column>    TYPE zif_abapgit_popups=>ty_alv_column.
+ 
+ 
+    IF lines( ct_overwrite ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''OBJ_TYPE''.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''OBJ_NAME''.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''DEVCLASS''.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''STATE''.
+    <ls_column>-text = ''State''.
+    <ls_column>-length = 3.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''ICON''.
+    <ls_column>-text = ''Action''.
+    <ls_column>-show_icon = abap_true.
+    <ls_column>-length = 5.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''TEXT''.
+    <ls_column>-text = ''Description''.
+ 
+    LOOP AT ct_overwrite ASSIGNING <ls_overwrite> WHERE decision = zif_abapgit_definitions=>c_yes.
+      INSERT sy-tabix INTO TABLE lt_preselected_rows.
+    ENDLOOP.
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+    li_popups->popup_to_select_from_list(
+      EXPORTING
+        it_list               = ct_overwrite
+        iv_header_text        = |The following objects are different between local and remote repository.|
+                             && | Select the objects which should be brought in line with the remote version.|
+        iv_select_column_text = ''Change?''
+        it_columns_to_display = lt_columns
+        it_preselected_rows   = lt_preselected_rows
+      IMPORTING
+        et_list               = lt_selected ).
+ 
+    LOOP AT ct_overwrite ASSIGNING <ls_overwrite>.
+      READ TABLE lt_selected WITH TABLE KEY object_type_and_name
+                             COMPONENTS obj_type = <ls_overwrite>-obj_type
+                                        obj_name = <ls_overwrite>-obj_name
+                             TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        <ls_overwrite>-decision = zif_abapgit_definitions=>c_yes.
+      ELSE.
+        <ls_overwrite>-decision = zif_abapgit_definitions=>c_no.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD popup_package_overwrite.
+ 
+    DATA: lt_columns  TYPE zif_abapgit_popups=>ty_alv_column_tt,
+          lt_selected LIKE ct_overwrite,
+          li_popups   TYPE REF TO zif_abapgit_popups.
+ 
+    FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF ct_overwrite,
+                   <ls_column>    TYPE zif_abapgit_popups=>ty_alv_column.
+ 
+    IF lines( ct_overwrite ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''OBJ_TYPE''.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''OBJ_NAME''.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''DEVCLASS''.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''STATE''.
+    <ls_column>-text = ''State''.
+    <ls_column>-length = 3.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''ICON''.
+    <ls_column>-text = ''Action''.
+    <ls_column>-show_icon = abap_true.
+    <ls_column>-length = 5.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''TEXT''.
+    <ls_column>-text = ''Description''.
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+    li_popups->popup_to_select_from_list(
+      EXPORTING
+        it_list               = ct_overwrite
+        iv_header_text        = |The following objects have been created in other packages.|
+                             && | Select the objects which should be overwritten.|
+        iv_select_column_text = |Overwrite?|
+        it_columns_to_display = lt_columns
+      IMPORTING
+        et_list               = lt_selected ).
+ 
+    LOOP AT ct_overwrite ASSIGNING <ls_overwrite>.
+ 
+      READ TABLE lt_selected WITH TABLE KEY object_type_and_name
+                             COMPONENTS obj_type = <ls_overwrite>-obj_type
+                                        obj_name = <ls_overwrite>-obj_name
+                             TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        <ls_overwrite>-decision = zif_abapgit_definitions=>c_yes.
+      ELSE.
+        <ls_overwrite>-decision = zif_abapgit_definitions=>c_no.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD purge.
+ 
+    DATA: lt_tadir     TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          lv_answer    TYPE c LENGTH 1,
+          lo_repo      TYPE REF TO zcl_abapgit_repo,
+          lv_package   TYPE devclass,
+          lv_question  TYPE c LENGTH 100,
+          ls_checks    TYPE zif_abapgit_definitions=>ty_delete_checks,
+          lv_repo_name TYPE string,
+          lv_message   TYPE string.
+ 
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    lv_repo_name = lo_repo->get_name( ).
+ 
+    lv_package = lo_repo->get_package( ).
+    lt_tadir   = zcl_abapgit_factory=>get_tadir( )->read( lv_package ).
+ 
+    IF lines( lt_tadir ) > 0.
+ 
+      lv_question = |This will DELETE all objects in package { lv_package
+        } including subpackages ({ lines( lt_tadir ) } objects) from the system|.
+ 
+      lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+        iv_titlebar              = ''Uninstall''
+        iv_text_question         = lv_question
+        iv_text_button_1         = ''Delete''
+        iv_icon_button_1         = ''ICON_DELETE''
+        iv_text_button_2         = ''Cancel''
+        iv_icon_button_2         = ''ICON_CANCEL''
+        iv_default_button        = ''2''
+        iv_display_cancel_button = abap_false ).
+ 
+      IF lv_answer = ''2''.
+        RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+      ENDIF.
+ 
+    ENDIF.
+ 
+    ls_checks = lo_repo->delete_checks( ).
+    IF ls_checks-transport-required = abap_true.
+      ls_checks-transport-transport = zcl_abapgit_ui_factory=>get_popups(
+                                        )->popup_transport_request( ls_checks-transport-type ).
+    ENDIF.
+ 
+    ri_log = zcl_abapgit_repo_srv=>get_instance( )->purge(
+      ii_repo   = lo_repo
+      is_checks = ls_checks ).
+ 
+    COMMIT WORK.
+ 
+    IF ri_log IS BOUND AND ri_log->get_status( ) = zif_abapgit_log=>c_status-error.
+      zcl_abapgit_log_viewer=>show_log( ri_log ).
+      RETURN.
+    ENDIF.
+ 
+    lv_message = |Repository { lv_repo_name } successfully uninstalled from Package { lv_package }. |.
+    MESSAGE lv_message TYPE ''S''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh.
+ 
+    zcl_abapgit_repo_srv=>get_instance( )->get( iv_key )->refresh( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local_checksums.
+ 
+    DATA: lv_answer   TYPE c,
+          lv_question TYPE string,
+          lo_repo     TYPE REF TO zcl_abapgit_repo.
+ 
+ 
+    IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-update_local_checksum ) = abap_false.
+      zcx_abapgit_exception=>raise( ''Not authorized'' ).
+    ENDIF.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    lv_question = ''This will rebuild and overwrite local repo checksums.''.
+ 
+    IF lo_repo->is_offline( ) = abap_false.
+      lv_question = lv_question
+                && '' The logic: if local and remote file differs then:''
+                && '' if remote branch is ahead then assume changes are remote,''
+                && '' else (branches are equal) assume changes are local.''
+                && '' This will lead to incorrect state for files changed on both sides.''
+                && '' Please make sure you don''''t have ones like that.''.
+    ENDIF.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar              = ''Warning''
+      iv_text_question         = lv_question
+      iv_text_button_1         = ''OK''
+      iv_icon_button_1         = ''ICON_DELETE''
+      iv_text_button_2         = ''Cancel''
+      iv_icon_button_2         = ''ICON_CANCEL''
+      iv_default_button        = ''2''
+      iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer = ''2''.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    lo_repo->zif_abapgit_repo~checksums( )->rebuild( ).
+    lo_repo->reset_status( ). " TODO refactor later
+ 
+    COMMIT WORK AND WAIT.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove.
+ 
+    DATA: lv_answer    TYPE c LENGTH 1,
+          li_repo      TYPE REF TO zif_abapgit_repo,
+          lv_package   TYPE devclass,
+          lv_question  TYPE c LENGTH 200,
+          lv_repo_name TYPE string,
+          lv_message   TYPE string.
+ 
+ 
+    li_repo      = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    lv_repo_name = li_repo->get_name( ).
+    lv_package   = li_repo->get_package( ).
+    lv_question  = |This will remove the repository reference to the package { lv_package
+      }. All objects will safely remain in the system.|.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar              = ''Remove''
+      iv_text_question         = lv_question
+      iv_text_button_1         = ''Remove''
+      iv_icon_button_1         = ''ICON_WF_UNLINK''
+      iv_text_button_2         = ''Cancel''
+      iv_icon_button_2         = ''ICON_CANCEL''
+      iv_default_button        = ''2''
+      iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer = ''2''.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    zcl_abapgit_repo_srv=>get_instance( )->delete( li_repo ).
+ 
+    COMMIT WORK.
+ 
+    lv_message = |Reference to repository { lv_repo_name } successfully removed from Package { lv_package }. |.
+    MESSAGE lv_message TYPE ''S''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD toggle_favorite.
+ 
+    zcl_abapgit_persistence_user=>get_instance( )->toggle_favorite( iv_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD transport_to_branch.
+ 
+    DATA:
+      lo_repository          TYPE REF TO zcl_abapgit_repo_online,
+      lo_transport_to_branch TYPE REF TO zcl_abapgit_transport_2_branch,
+      lt_transport_headers   TYPE trwbo_request_headers,
+      lt_transport_objects   TYPE zif_abapgit_definitions=>ty_tadir_tt,
+      ls_transport_to_branch TYPE zif_abapgit_definitions=>ty_transport_to_branch.
+ 
+ 
+    IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-transport_to_branch ) = abap_false.
+      zcx_abapgit_exception=>raise( ''Not authorized'' ).
+    ENDIF.
+ 
+    lo_repository ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_repository_key ).
+ 
+    lt_transport_headers = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
+    " Also include deleted objects that are included in transport
+    lt_transport_objects = zcl_abapgit_transport=>to_tadir(
+      it_transport_headers = lt_transport_headers
+      iv_deleted_objects   = abap_true ).
+    IF lt_transport_objects IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Canceled or List of objects is empty '' ).
+    ENDIF.
+ 
+    ls_transport_to_branch = zcl_abapgit_ui_factory=>get_popups( )->popup_to_create_transp_branch(
+      lt_transport_headers ).
+ 
+    CREATE OBJECT lo_transport_to_branch.
+    lo_transport_to_branch->create(
+      io_repository          = lo_repository
+      is_transport_to_branch = ls_transport_to_branch
+      it_transport_objects   = lt_transport_objects ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_SERVICES_GIT                ', 'INTERFACE zif_abapgit_services_git PUBLIC.
+ 
+  TYPES:
+    BEGIN OF ty_commit_fields,
+      repo_key        TYPE zif_abapgit_persistence=>ty_repo-key,
+      committer_name  TYPE string,
+      committer_email TYPE string,
+      author_name     TYPE string,
+      author_email    TYPE string,
+      comment         TYPE string,
+      body            TYPE string,
+    END OF ty_commit_fields.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_SERVICES_REPO               ', 'INTERFACE zif_abapgit_services_repo
+  PUBLIC .
+ 
+  TYPES:
+    BEGIN OF ty_repo_params,
+      url                TYPE string,
+      package            TYPE devclass,
+      branch_name        TYPE string,
+      display_name       TYPE string,
+      folder_logic       TYPE string,
+      labels             TYPE string,
+      ignore_subpackages TYPE abap_bool,
+      main_lang_only     TYPE abap_bool,
+    END OF ty_repo_params .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_FRONTEND_SERVICES           ', 'CLASS zcl_abapgit_frontend_services DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_ui_factory.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_frontend_services.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_frontend_services IMPLEMENTATION.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~clipboard_export.
+ 
+    DATA lv_rc TYPE i.
+ 
+    " Note: do not use a string table for ''it_data''!
+ 
+    TRY.
+        CALL METHOD cl_gui_frontend_services=>(''CLIPBOARD_EXPORT'')
+          EXPORTING
+            no_auth_check        = iv_no_auth_check " >= 740
+          IMPORTING
+            data                 = it_data
+          CHANGING
+            rc                   = lv_rc
+          EXCEPTIONS
+            cntl_error           = 1
+            error_no_gui         = 2
+            not_supported_by_gui = 3
+            no_authority         = 4
+            OTHERS               = 5.
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+ 
+      CATCH cx_sy_dyn_call_param_missing.
+ 
+        cl_gui_frontend_services=>clipboard_export(
+          IMPORTING
+            data                 = it_data
+          CHANGING
+            rc                   = lv_rc
+          EXCEPTIONS
+            cntl_error           = 1
+            error_no_gui         = 2
+            not_supported_by_gui = 3
+            no_authority         = 4
+          OTHERS               = 5 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+ 
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~directory_browse.
+ 
+    cl_gui_frontend_services=>directory_browse(
+      EXPORTING
+        window_title         = iv_window_title
+        initial_folder       = iv_initial_folder
+      CHANGING
+        selected_folder      = cv_selected_folder
+      EXCEPTIONS
+        cntl_error           = 1
+        error_no_gui         = 2
+        not_supported_by_gui = 3
+        OTHERS               = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~directory_create.
+ 
+    cl_gui_frontend_services=>directory_create(
+      EXPORTING
+        directory                = iv_directory
+      CHANGING
+        rc                       = cv_rc
+      EXCEPTIONS
+        directory_create_failed  = 1
+        cntl_error               = 2
+        error_no_gui             = 3
+        directory_access_denied  = 4
+        directory_already_exists = 5
+        path_not_found           = 6
+        unknown_error            = 7
+        not_supported_by_gui     = 8
+        wrong_parameter          = 9
+        OTHERS                   = 10 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~directory_exist.
+ 
+    cl_gui_frontend_services=>directory_exist(
+      EXPORTING
+        directory            = iv_directory
+      RECEIVING
+        result               = rv_exists
+      EXCEPTIONS
+        cntl_error           = 1
+        error_no_gui         = 2
+        wrong_parameter      = 3
+        not_supported_by_gui = 4
+        OTHERS               = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~execute.
+ 
+    cl_gui_frontend_services=>execute(
+      EXPORTING
+        document               = iv_document
+        application            = iv_application
+        parameter              = iv_parameter
+        default_directory      = iv_default_directory
+        maximized              = iv_maximized
+        minimized              = iv_minimized
+        synchronous            = iv_synchronous
+        operation              = iv_operation
+      EXCEPTIONS
+        cntl_error             = 1
+        error_no_gui           = 2
+        bad_parameter          = 3
+        file_not_found         = 4
+        path_not_found         = 5
+        file_extension_unknown = 6
+        error_execute_failed   = 7
+        synchronous_failed     = 8
+        not_supported_by_gui   = 9
+        OTHERS                 = 10 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~file_download.
+ 
+    TYPES ty_hex TYPE x LENGTH 200.
+    DATA lt_rawdata TYPE STANDARD TABLE OF ty_hex WITH DEFAULT KEY.
+ 
+    zcl_abapgit_convert=>xstring_to_bintab(
+      EXPORTING iv_xstr   = iv_xstr
+      IMPORTING et_bintab = lt_rawdata ).
+ 
+    cl_gui_frontend_services=>gui_download(
+      EXPORTING
+        bin_filesize              = xstrlen( iv_xstr )
+        filename                  = iv_path
+        filetype                  = ''BIN''
+      CHANGING
+        data_tab                  = lt_rawdata
+      EXCEPTIONS
+        file_write_error          = 1
+        no_batch                  = 2
+        gui_refuse_filetransfer   = 3
+        invalid_type              = 4
+        no_authority              = 5
+        unknown_error             = 6
+        header_not_allowed        = 7
+        separator_not_allowed     = 8
+        filesize_not_allowed      = 9
+        header_too_long           = 10
+        dp_error_create           = 11
+        dp_error_send             = 12
+        dp_error_write            = 13
+        unknown_dp_error          = 14
+        access_denied             = 15
+        dp_out_of_memory          = 16
+        disk_full                 = 17
+        dp_timeout                = 18
+        file_not_found            = 19
+        dataprovider_exception    = 20
+        control_flush_error       = 21
+        not_supported_by_gui      = 22
+        error_no_gui              = 23
+        OTHERS                    = 24 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~file_upload.
+ 
+    TYPES: ty_hex TYPE x LENGTH 255.
+ 
+    DATA: lt_data   TYPE TABLE OF ty_hex WITH DEFAULT KEY,
+          lv_length TYPE i.
+ 
+    cl_gui_frontend_services=>gui_upload(
+      EXPORTING
+        filename                = iv_path
+        filetype                = ''BIN''
+      IMPORTING
+        filelength              = lv_length
+      CHANGING
+        data_tab                = lt_data
+      EXCEPTIONS
+        file_open_error         = 1
+        file_read_error         = 2
+        no_batch                = 3
+        gui_refuse_filetransfer = 4
+        invalid_type            = 5
+        no_authority            = 6
+        unknown_error           = 7
+        bad_data_format         = 8
+        header_not_allowed      = 9
+        separator_not_allowed   = 10
+        header_too_long         = 11
+        unknown_dp_error        = 12
+        access_denied           = 13
+        dp_out_of_memory        = 14
+        disk_full               = 15
+        dp_timeout              = 16
+        not_supported_by_gui    = 17
+        error_no_gui            = 18
+        OTHERS                  = 19 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    CONCATENATE LINES OF lt_data INTO rv_xstr IN BYTE MODE.
+    rv_xstr = rv_xstr(lv_length).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~get_file_separator.
+ 
+    cl_gui_frontend_services=>get_file_separator(
+      CHANGING
+        file_separator       = cv_file_separator
+      EXCEPTIONS
+        not_supported_by_gui = 1
+        error_no_gui         = 2
+        cntl_error           = 3
+        OTHERS               = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~get_gui_version.
+ 
+    DATA:
+      lt_version_table TYPE filetable,
+      lv_rc            TYPE i,
+      ls_version       LIKE LINE OF lt_version_table.
+ 
+    cl_gui_frontend_services=>get_gui_version(
+      CHANGING
+        version_table            = lt_version_table
+        rc                       = lv_rc
+      EXCEPTIONS
+        get_gui_version_failed   = 1
+        cant_write_version_table = 2
+        gui_no_version           = 3
+        cntl_error               = 4
+        error_no_gui             = 5
+        not_supported_by_gui     = 6
+        OTHERS                   = 7 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    READ TABLE lt_version_table INTO ls_version INDEX 1. " gui release
+    ev_gui_release = ls_version-filename.
+    READ TABLE lt_version_table INTO ls_version INDEX 2. " gui sp
+    ev_gui_sp = ls_version-filename.
+    READ TABLE lt_version_table INTO ls_version INDEX 3. " gui patch
+    ev_gui_patch = ls_version-filename.
+ 
+    ev_gui_version_string = |{ ev_gui_release }.{ condense( ev_gui_sp ) }.{ condense( ev_gui_patch ) }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~get_system_directory.
+ 
+    cl_gui_frontend_services=>get_system_directory(
+      CHANGING
+        system_directory     = cv_system_directory
+      EXCEPTIONS
+        cntl_error           = 1
+        error_no_gui         = 2
+        not_supported_by_gui = 3
+        OTHERS               = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~gui_is_available.
+ 
+    CALL FUNCTION ''GUI_IS_AVAILABLE''
+      IMPORTING
+        return_ = rv_gui_is_available.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~is_sapgui_for_java.
+ 
+    CALL FUNCTION ''GUI_HAS_JAVABEANS''
+      IMPORTING
+        return_ = rv_result.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~is_sapgui_for_windows.
+ 
+    CALL FUNCTION ''GUI_HAS_ACTIVEX''
+      IMPORTING
+        return_ = rv_result.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~is_webgui.
+ 
+    CALL FUNCTION ''GUI_IS_ITS''
+      IMPORTING
+        return_ = rv_is_webgui.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~show_file_open_dialog.
+ 
+    DATA:
+      lt_file_table TYPE filetable,
+      ls_file_table LIKE LINE OF lt_file_table,
+      lv_filter     TYPE string,
+      lv_action     TYPE i,
+      lv_rc         TYPE i.
+ 
+    IF iv_extension = ''zip''.
+      lv_filter = ''ZIP Files (*.zip)|*.zip|'' && cl_gui_frontend_services=>filetype_all.
+    ENDIF.
+ 
+    cl_gui_frontend_services=>file_open_dialog(
+      EXPORTING
+        window_title            = iv_title
+        default_filename        = iv_default_filename
+        file_filter             = lv_filter
+      CHANGING
+        file_table              = lt_file_table
+        rc                      = lv_rc
+        user_action             = lv_action
+      EXCEPTIONS
+        file_open_dialog_failed = 1
+        cntl_error              = 2
+        error_no_gui            = 3
+        not_supported_by_gui    = 4
+        OTHERS                  = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+    IF lv_action = cl_gui_frontend_services=>action_cancel.
+      zcx_abapgit_exception=>raise( ''Cancelled'' ).
+    ENDIF.
+ 
+    READ TABLE lt_file_table INDEX 1 INTO ls_file_table.
+    ASSERT sy-subrc = 0.
+    rv_path = ls_file_table-filename.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~show_file_save_dialog.
+ 
+    DATA:
+      lv_action   TYPE i,
+      lv_filter   TYPE string,
+      lv_filename TYPE string,
+      lv_path     TYPE string.
+ 
+    IF iv_extension = ''zip''.
+      lv_filter = ''ZIP Files (*.zip)|*.zip|'' && cl_gui_frontend_services=>filetype_all.
+    ENDIF.
+ 
+    cl_gui_frontend_services=>file_save_dialog(
+      EXPORTING
+        window_title         = iv_title
+        default_extension    = iv_extension
+        default_file_name    = iv_default_filename
+        file_filter          = lv_filter
+      CHANGING
+        filename             = lv_filename
+        path                 = lv_path
+        fullpath             = rv_path
+        user_action          = lv_action
+      EXCEPTIONS
+        cntl_error           = 1
+        error_no_gui         = 2
+        not_supported_by_gui = 3
+        OTHERS               = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+    IF lv_action = cl_gui_frontend_services=>action_cancel.
+      zcx_abapgit_exception=>raise( ''Cancelled'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PASSWORD_DIALOG             ', 'CLASS zcl_abapgit_password_dialog DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS popup
+      IMPORTING
+        !iv_repo_url TYPE string
+      CHANGING
+        !cv_user     TYPE string
+        !cv_pass     TYPE string
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_password_dialog IMPLEMENTATION.
+ 
+ 
+  METHOD popup.
+ 
+    DATA: lx_error TYPE REF TO cx_sy_dyn_call_illegal_form.
+ 
+    IF zcl_abapgit_ui_factory=>get_frontend_services( )->gui_is_available( ) = abap_true.
+ 
+      TRY.
+          PERFORM password_popup
+            IN PROGRAM (sy-cprog)
+            USING iv_repo_url
+            CHANGING cv_user cv_pass.
+        CATCH cx_sy_dyn_call_illegal_form INTO lx_error.
+          " abapGit was called via API and either wrong or no username/password
+          " was supplied. It''s not possible to call abapGit password popup in
+          " this case.
+          " See https://docs.abapgit.org/development/api.html#online-repository
+          " on how to provide username/password
+          zcx_abapgit_exception=>raise_with_text( lx_error ).
+      ENDTRY.
+    ELSE.
+      "Extract user credentials from the environment...
+      "Class ZCL_ABAPGIT_DEFAULT_AUTH_INFO is part of https://github.com/abapGit/ADT_Backend.
+      "It stores the credentials of a private repository as long as the session exists.
+      "Usually this class should belong to abapGit core and a refactoring is recommended.
+      "As a temporary solution - and to avoid a DYNPRO_SEND_IN_BACKGROUND dump - a generic
+      "call of the getter methods for username and password is implemented by PR#2635.
+      TRY.
+          CALL METHOD (''ZCL_ABAPGIT_DEFAULT_AUTH_INFO'')=>(''GET_USER'')
+            RECEIVING
+              rv_user = cv_user.
+        CATCH cx_root.
+          RETURN.
+      ENDTRY.
+      TRY.
+          CALL METHOD (''ZCL_ABAPGIT_DEFAULT_AUTH_INFO'')=>(''GET_PASSWORD'')
+            RECEIVING
+              rv_password = cv_pass.
+        CATCH cx_root.
+          "check if old version with typo in method name exists
+          TRY.
+              CALL METHOD (''ZCL_ABAPGIT_DEFAULT_AUTH_INFO'')=>(''GET_PASSOWORD'')
+                RECEIVING
+                  rv_password = cv_pass.
+            CATCH cx_root.
+              RETURN.
+          ENDTRY.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_POPUPS                      ', 'CLASS zcl_abapgit_popups DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_ui_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_popups .
+ 
+    CLASS-METHODS center
+      IMPORTING
+        !iv_width          TYPE i
+        !iv_height         TYPE i
+      RETURNING
+        VALUE(rs_position) TYPE zif_abapgit_popups=>ty_popup_position.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_lt_fields TYPE STANDARD TABLE OF sval WITH DEFAULT KEY .
+ 
+    TYPES:
+      BEGIN OF ty_commit_value_tab,
+        commit   TYPE zif_abapgit_git_definitions=>ty_sha1,
+        message  TYPE c LENGTH 100,
+        datetime TYPE c LENGTH 20,
+      END OF ty_commit_value_tab.
+    TYPES:
+      ty_commit_value_tab_tt TYPE STANDARD TABLE OF ty_commit_value_tab WITH DEFAULT KEY.
+ 
+    CONSTANTS c_answer_cancel      TYPE c LENGTH 1 VALUE ''A'' ##NO_TEXT.
+ 
+    DATA ms_position TYPE zif_abapgit_popups=>ty_popup_position.
+ 
+    METHODS add_field
+      IMPORTING
+        !iv_tabname    TYPE sval-tabname
+        !iv_fieldname  TYPE sval-fieldname
+        !iv_fieldtext  TYPE sval-fieldtext
+        !iv_value      TYPE clike DEFAULT ''''
+        !iv_field_attr TYPE sval-field_attr DEFAULT ''''
+        !iv_obligatory TYPE spo_obl OPTIONAL
+      CHANGING
+        !ct_fields     TYPE zif_abapgit_popups=>ty_sval_tt .
+    METHODS _popup_3_get_values
+      IMPORTING
+        !iv_popup_title    TYPE string
+        !iv_no_value_check TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        !ev_value_1        TYPE spo_value
+        !ev_value_2        TYPE spo_value
+        !ev_value_3        TYPE spo_value
+      CHANGING
+        !ct_fields         TYPE ty_lt_fields
+      RAISING
+        zcx_abapgit_exception .
+    METHODS commit_list_build
+      IMPORTING
+        !iv_repo_url    TYPE string
+        !iv_branch_name TYPE string
+      EXPORTING
+        !et_value_tab   TYPE ty_commit_value_tab_tt
+        !et_commits     TYPE zif_abapgit_git_definitions=>ty_commit_tt
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_popups IMPLEMENTATION.
+ 
+ 
+  METHOD add_field.
+ 
+    FIELD-SYMBOLS: <ls_field> LIKE LINE OF ct_fields.
+ 
+    APPEND INITIAL LINE TO ct_fields ASSIGNING <ls_field>.
+    <ls_field>-tabname    = iv_tabname.
+    <ls_field>-fieldname  = iv_fieldname.
+    <ls_field>-fieldtext  = iv_fieldtext.
+    <ls_field>-value      = iv_value.
+    <ls_field>-field_attr = iv_field_attr.
+    <ls_field>-field_obl  = iv_obligatory.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD center.
+ 
+    CONSTANTS:
+      lc_min_size TYPE i VALUE 10,
+      lc_min_pos  TYPE i VALUE 5.
+ 
+    " Magic math to approximate starting position of popup
+    IF sy-scols > lc_min_size AND iv_width > 0 AND sy-scols > iv_width.
+      rs_position-start_column = nmax(
+        val1 = ( sy-scols - iv_width ) / 2
+        val2 = lc_min_pos ).
+    ELSE.
+      rs_position-start_column = lc_min_pos.
+    ENDIF.
+ 
+    IF sy-srows > lc_min_size AND iv_height > 0 AND sy-srows > iv_height.
+      rs_position-start_row = nmax(
+        val1 = ( sy-srows - iv_height ) / 2 - 1
+        val2 = lc_min_pos ).
+    ELSE.
+      rs_position-start_row = lc_min_pos.
+    ENDIF.
+ 
+    rs_position-end_column = rs_position-start_column + iv_width.
+    rs_position-end_row = rs_position-start_row + iv_height.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD commit_list_build.
+ 
+    DATA:
+      lv_unix_time   TYPE zcl_abapgit_git_time=>ty_unixtime,
+      lv_date        TYPE d,
+      lv_date_string TYPE c LENGTH 12,
+      lv_time        TYPE t,
+      lv_time_string TYPE c LENGTH 10.
+ 
+    FIELD-SYMBOLS:
+      <ls_commit>    TYPE zif_abapgit_git_definitions=>ty_commit,
+      <ls_value_tab> TYPE ty_commit_value_tab.
+ 
+    CLEAR: et_commits, et_value_tab.
+ 
+    et_commits = zcl_abapgit_git_commit=>get_by_branch( iv_branch_name  = iv_branch_name
+                                                        iv_repo_url     = iv_repo_url
+                                                        iv_deepen_level = 99
+                                                        iv_sorted       = abap_false )-commits.
+ 
+    IF et_commits IS INITIAL.
+      zcx_abapgit_exception=>raise( |No commits are available in this branch.| ).
+    ENDIF.
+ 
+    SORT et_commits BY time DESCENDING.
+ 
+    LOOP AT et_commits ASSIGNING <ls_commit>.
+ 
+      APPEND INITIAL LINE TO et_value_tab ASSIGNING <ls_value_tab>.
+      <ls_value_tab>-commit  = <ls_commit>-sha1.
+      <ls_value_tab>-message = <ls_commit>-message.
+      lv_unix_time = <ls_commit>-time.
+      zcl_abapgit_git_time=>get_utc(
+        EXPORTING
+          iv_unix = lv_unix_time
+        IMPORTING
+          ev_time = lv_time
+          ev_date = lv_date ).
+      WRITE: lv_date TO lv_date_string,
+             lv_time TO lv_time_string.
+      <ls_value_tab>-datetime = |{ lv_date_string }, | &&
+                                |{ lv_time_string }|.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~branch_list_popup.
+ 
+    DATA: lo_branches    TYPE REF TO zcl_abapgit_git_branch_list,
+          lt_branches    TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+          lv_answer      TYPE c LENGTH 1,
+          lv_default     TYPE i,
+          lv_head_suffix TYPE string,
+          lv_head_symref TYPE string,
+          lv_text        TYPE string,
+          lt_selection   TYPE TABLE OF spopli.
+ 
+    FIELD-SYMBOLS: <ls_sel>    LIKE LINE OF lt_selection,
+                   <ls_branch> LIKE LINE OF lt_branches.
+ 
+ 
+    lo_branches    = zcl_abapgit_git_transport=>branches( iv_url ).
+    lt_branches    = lo_branches->get_branches_only( ).
+    lv_head_suffix = | ({ zif_abapgit_git_definitions=>c_head_name })|.
+    lv_head_symref = lo_branches->get_head_symref( ).
+ 
+    IF iv_hide_branch IS NOT INITIAL.
+      DELETE lt_branches WHERE name = iv_hide_branch.
+    ENDIF.
+ 
+    IF iv_hide_head IS NOT INITIAL.
+      DELETE lt_branches WHERE name    = zif_abapgit_git_definitions=>c_head_name
+                            OR is_head = abap_true.
+    ENDIF.
+ 
+    IF lt_branches IS INITIAL.
+      IF iv_hide_head IS NOT INITIAL.
+        lv_text = ''main''.
+      ENDIF.
+      IF iv_hide_branch IS NOT INITIAL AND iv_hide_branch <> zif_abapgit_git_definitions=>c_git_branch-main.
+        IF lv_text IS INITIAL.
+          lv_text = iv_hide_branch && '' is''.
+        ELSE.
+          CONCATENATE lv_text ''and'' iv_hide_branch ''are'' INTO lv_text SEPARATED BY space.
+        ENDIF.
+      ELSE.
+        lv_text = lv_text && '' is''.
+      ENDIF.
+      IF lv_text IS NOT INITIAL.
+        zcx_abapgit_exception=>raise( ''No branches available to select ('' && lv_text && '' hidden)'' ).
+      ELSE.
+        zcx_abapgit_exception=>raise( ''No branches are available to select'' ).
+      ENDIF.
+    ENDIF.
+ 
+    LOOP AT lt_branches ASSIGNING <ls_branch>.
+ 
+      CHECK <ls_branch>-name IS NOT INITIAL. " To ensure some below ifs
+ 
+      IF <ls_branch>-is_head = abap_true.
+ 
+        IF <ls_branch>-name = zif_abapgit_git_definitions=>c_head_name. " HEAD
+          IF <ls_branch>-name <> lv_head_symref AND lv_head_symref IS NOT INITIAL.
+            " HEAD but other HEAD symref exists - ignore
+            CONTINUE.
+          ELSE.
+            INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING <ls_sel>.
+            <ls_sel>-varoption = <ls_branch>-name.
+          ENDIF.
+        ELSE.
+          INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING <ls_sel>.
+          <ls_sel>-varoption = <ls_branch>-display_name && lv_head_suffix.
+        ENDIF.
+ 
+        IF lv_default > 0. " Shift down default if set
+          lv_default = lv_default + 1.
+        ENDIF.
+      ELSE.
+        APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+        <ls_sel>-varoption = <ls_branch>-display_name.
+      ENDIF.
+ 
+      IF <ls_branch>-name = iv_default_branch.
+        IF <ls_branch>-is_head = abap_true.
+          lv_default = 1.
+        ELSE.
+          lv_default = sy-tabix.
+        ENDIF.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF iv_show_new_option = abap_true.
+      APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+      <ls_sel>-varoption = zif_abapgit_popups=>c_new_branch_label.
+    ENDIF.
+ 
+    ms_position = center(
+      iv_width  = 30
+      iv_height = lines( lt_selection ) ).
+ 
+    CALL FUNCTION ''POPUP_TO_DECIDE_LIST''
+      EXPORTING
+        titel      = ''Select Branch''
+        textline1  = ''Select a branch''
+        start_col  = ms_position-start_column
+        start_row  = ms_position-start_row
+        cursorline = lv_default
+      IMPORTING
+        answer     = lv_answer
+      TABLES
+        t_spopli   = lt_selection
+      EXCEPTIONS
+        OTHERS     = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error from POPUP_TO_DECIDE_LIST'' ).
+    ENDIF.
+ 
+    IF lv_answer = c_answer_cancel.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
+    ASSERT sy-subrc = 0.
+ 
+    IF iv_show_new_option = abap_true AND <ls_sel>-varoption = zif_abapgit_popups=>c_new_branch_label.
+      rs_branch-name = zif_abapgit_popups=>c_new_branch_label.
+    ELSE.
+      REPLACE FIRST OCCURRENCE OF lv_head_suffix IN <ls_sel>-varoption WITH ''''.
+      READ TABLE lt_branches WITH KEY display_name = <ls_sel>-varoption ASSIGNING <ls_branch>.
+      IF sy-subrc <> 0.
+* branch name longer than 65 characters
+        LOOP AT lt_branches ASSIGNING <ls_branch> WHERE display_name CS <ls_sel>-varoption.
+          EXIT. " current loop
+        ENDLOOP.
+      ENDIF.
+      ASSERT <ls_branch> IS ASSIGNED.
+      rs_branch = lo_branches->find_by_name( <ls_branch>-name ).
+      lv_text = |Branch switched from { zcl_abapgit_git_branch_list=>get_display_name( iv_default_branch ) } to {
+        zcl_abapgit_git_branch_list=>get_display_name( rs_branch-name ) } |.
+      MESSAGE lv_text TYPE ''S''.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~choose_code_insp_check_variant.
+ 
+    DATA: lt_return TYPE STANDARD TABLE OF ddshretval.
+ 
+    FIELD-SYMBOLS: <ls_return> LIKE LINE OF lt_return.
+ 
+    CALL FUNCTION ''F4IF_FIELD_VALUE_REQUEST''
+      EXPORTING
+        tabname           = ''SCI_DYNP''
+        fieldname         = ''CHKV''
+      TABLES
+        return_tab        = lt_return
+      EXCEPTIONS
+        field_not_found   = 1
+        no_help_for_field = 2
+        inconsistent_help = 3
+        no_values_found   = 4
+        OTHERS            = 5.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    READ TABLE lt_return ASSIGNING <ls_return>
+                         WITH KEY retfield = ''SCI_DYNP-CHKV''.
+    IF sy-subrc = 0.
+      rv_check_variant = <ls_return>-fieldval.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~commit_list_popup.
+ 
+    DATA:
+      lt_commits         TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+      lt_value_tab       TYPE ty_commit_value_tab_tt,
+      lt_selected_values TYPE ty_commit_value_tab_tt,
+      lt_columns         TYPE zif_abapgit_popups=>ty_alv_column_tt.
+ 
+    FIELD-SYMBOLS:
+      <ls_value_tab> TYPE ty_commit_value_tab,
+      <ls_column>    TYPE zif_abapgit_popups=>ty_alv_column.
+ 
+    commit_list_build(
+      EXPORTING
+        iv_branch_name = iv_branch_name
+        iv_repo_url    = iv_repo_url
+      IMPORTING
+        et_value_tab   = lt_value_tab
+        et_commits     = lt_commits ).
+ 
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name   = ''COMMIT''.
+    <ls_column>-text   = ''Hash''.
+    <ls_column>-length = 8.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''MESSAGE''.
+    <ls_column>-text = ''Message''.
+    <ls_column>-length = 60.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = ''DATETIME''.
+    <ls_column>-text = ''Datetime''.
+    <ls_column>-length = 17.
+ 
+    zif_abapgit_popups~popup_to_select_from_list(
+      EXPORTING
+        it_list               = lt_value_tab
+        iv_title              = |Select a commit|
+        iv_end_column         = 100
+        iv_striped_pattern    = abap_true
+        iv_optimize_col_width = abap_false
+        iv_selection_mode     = if_salv_c_selection_mode=>single
+        it_columns_to_display = lt_columns
+      IMPORTING
+        et_list               = lt_selected_values ).
+ 
+    IF lt_selected_values IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    READ TABLE lt_selected_values ASSIGNING <ls_value_tab> INDEX 1.
+    ASSERT sy-subrc = 0.
+ 
+    READ TABLE lt_commits INTO rs_commit WITH KEY sha1 = <ls_value_tab>-commit.
+    ASSERT sy-subrc = 0.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~create_branch_popup.
+ 
+    DATA: lt_fields TYPE TABLE OF sval.
+    DATA: lv_name   TYPE spo_value.
+ 
+    CLEAR: ev_name, ev_cancel.
+ 
+    add_field( EXPORTING iv_tabname   = ''TEXTL''
+                         iv_fieldname = ''LINE''
+                         iv_fieldtext = ''Name''
+                         iv_value     = ''new-branch-name''
+               CHANGING  ct_fields    = lt_fields ).
+ 
+    TRY.
+ 
+        _popup_3_get_values(
+          EXPORTING iv_popup_title = |Create branch from {
+            zcl_abapgit_git_branch_list=>get_display_name( iv_source_branch_name ) }|
+          IMPORTING ev_value_1     = lv_name
+          CHANGING  ct_fields      = lt_fields ).
+ 
+        ev_name = zcl_abapgit_git_branch_list=>complete_heads_branch_name(
+              zcl_abapgit_git_branch_list=>normalize_branch_name( lv_name ) ).
+ 
+      CATCH zcx_abapgit_cancel.
+        ev_cancel = abap_true.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_folder_logic.
+ 
+    DATA:
+      lt_selection TYPE TABLE OF spopli,
+      lv_answer    TYPE c LENGTH 1.
+ 
+    FIELD-SYMBOLS: <ls_sel> LIKE LINE OF lt_selection.
+ 
+    APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+    <ls_sel>-selflag   = abap_true.
+    <ls_sel>-varoption = zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+ 
+    APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+    <ls_sel>-varoption = zif_abapgit_dot_abapgit=>c_folder_logic-full.
+ 
+    APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+    <ls_sel>-varoption = zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+ 
+    CALL FUNCTION ''POPUP_TO_DECIDE_LIST''
+      EXPORTING
+        titel     = ''Folder logic''
+        textline1 = ''Select folder logic''
+        start_col = ms_position-start_column
+        start_row = ms_position-start_row
+      IMPORTING
+        answer    = lv_answer
+      TABLES
+        t_spopli  = lt_selection
+      EXCEPTIONS
+        OTHERS    = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error from POPUP_TO_DECIDE_LIST'' ).
+    ENDIF.
+ 
+    IF lv_answer = c_answer_cancel.
+      zcx_abapgit_cancel=>raise( |Canceled| ).
+    ENDIF.
+ 
+    READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
+    ASSERT sy-subrc = 0.
+ 
+    rv_folder_logic = <ls_sel>-varoption.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_search_help.
+ 
+    DATA lt_ret TYPE TABLE OF ddshretval.
+    DATA ls_ret LIKE LINE OF lt_ret.
+    DATA lv_tabname TYPE dfies-tabname.
+    DATA lv_fieldname TYPE dfies-fieldname.
+ 
+    SPLIT iv_tab_field AT ''-'' INTO lv_tabname lv_fieldname.
+    lv_tabname = to_upper( lv_tabname ).
+    lv_fieldname = to_upper( lv_fieldname ).
+ 
+    CALL FUNCTION ''F4IF_FIELD_VALUE_REQUEST''
+      EXPORTING
+        tabname    = lv_tabname
+        fieldname  = lv_fieldname
+      TABLES
+        return_tab = lt_ret
+      EXCEPTIONS
+        OTHERS     = 5.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |F4IF_FIELD_VALUE_REQUEST error [{ iv_tab_field }]| ).
+    ENDIF.
+ 
+    IF lines( lt_ret ) > 0.
+      READ TABLE lt_ret WITH KEY fieldname = lv_fieldname INTO ls_ret.
+      IF sy-subrc = 0.
+        rv_value = ls_ret-fieldval.
+      ELSE.
+        READ TABLE lt_ret INDEX 1 INTO ls_ret.
+        ASSERT sy-subrc = 0.
+        rv_value = ls_ret-fieldval.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_select_tr_requests.
+    DATA ls_r_trkorr TYPE LINE OF zif_abapgit_definitions=>ty_trrngtrkor_tt.
+    DATA lr_request TYPE REF TO trwbo_request_header.
+    DATA lt_request TYPE trwbo_request_headers.
+ 
+    ms_position = center(
+      iv_width  = 120
+      iv_height = 10 ).
+ 
+    CALL FUNCTION ''TRINT_SELECT_REQUESTS''
+      EXPORTING
+        iv_username_pattern    = iv_username_pattern
+        is_selection           = is_selection
+        iv_complete_projects   = abap_false
+        is_popup               = ms_position
+        iv_via_selscreen       = ''X''
+        iv_title               = iv_title
+      IMPORTING
+        et_requests            = lt_request
+      EXCEPTIONS
+        action_aborted_by_user = 1
+        OTHERS                 = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Selection canceled'' ).
+    ENDIF.
+ 
+    IF lt_request IS INITIAL.
+      zcx_abapgit_exception=>raise( ''No Request Found'' ).
+    ENDIF.
+ 
+    IF lines( lt_request ) > 10000.
+      zcx_abapgit_exception=>raise( ''Too many requests selected (max 10000)'' ).
+    ENDIF.
+ 
+    LOOP AT lt_request REFERENCE INTO lr_request.
+      ls_r_trkorr-sign = ''I''.
+      ls_r_trkorr-option = ''EQ''.
+      ls_r_trkorr-low = lr_request->trkorr.
+      INSERT ls_r_trkorr INTO TABLE rt_r_trkorr.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_select_wb_tc_tr_and_tsk.
+    DATA ls_selection  TYPE trwbo_selection.
+    DATA lv_title TYPE trwbo_title.
+ 
+    ls_selection-trkorrpattern = space.
+    ls_selection-connect_req_task_conditions = ''X''.
+    ls_selection-reqfunctions = ''KTRXS''.
+    ls_selection-reqstatus = ''RNODL''.
+    ls_selection-taskstatus = ''RNODL''.
+    CONDENSE ls_selection-reqfunctions NO-GAPS.
+    ls_selection-taskfunctions = ''QRSX''.
+    CONCATENATE sy-sysid ''*'' INTO ls_selection-trkorrpattern.
+ 
+    lv_title = ''Select Transports / Tasks''.
+ 
+    rt_r_trkorr = zif_abapgit_popups~popup_select_tr_requests(
+      is_selection        = ls_selection
+      iv_title            = lv_title
+      iv_username_pattern = ''*'' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_confirm.
+ 
+    ms_position = center(
+      iv_width  = 65
+      iv_height = 5 ).
+ 
+    CALL FUNCTION ''POPUP_TO_CONFIRM''
+      EXPORTING
+        titlebar              = iv_titlebar
+        text_question         = iv_text_question
+        text_button_1         = iv_text_button_1
+        icon_button_1         = iv_icon_button_1
+        text_button_2         = iv_text_button_2
+        icon_button_2         = iv_icon_button_2
+        default_button        = iv_default_button
+        display_cancel_button = iv_display_cancel_button
+        start_column          = ms_position-start_column
+        start_row             = ms_position-start_row
+      IMPORTING
+        answer                = rv_answer
+      EXCEPTIONS
+        text_not_found        = 1
+        OTHERS                = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''error from POPUP_TO_CONFIRM'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_create_package.
+    CALL FUNCTION ''FUNCTION_EXISTS''
+      EXPORTING
+        funcname           = ''PB_POPUP_PACKAGE_CREATE''
+      EXCEPTIONS
+        function_not_exist = 1
+        OTHERS             = 2.
+    IF sy-subrc = 1.
+* looks like the function module used does not exist on all
+* versions since 702, so show an error
+      zcx_abapgit_exception=>raise( ''Your system does not support automatic creation of packages.'' &&
+        ''Please, create the package manually.'' ).
+    ENDIF.
+ 
+    CALL FUNCTION ''PB_POPUP_PACKAGE_CREATE''
+      CHANGING
+        p_object_data    = es_package_data
+      EXCEPTIONS
+        action_cancelled = 1.
+    ev_create = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_create_transp_branch.
+    DATA: lt_fields             TYPE TABLE OF sval,
+          lv_transports_as_text TYPE string,
+          lv_desc_as_text       TYPE string,
+          ls_transport_header   LIKE LINE OF it_transport_headers.
+    DATA: lv_branch_name        TYPE spo_value.
+    DATA: lv_commit_text        TYPE spo_value.
+ 
+    CLEAR: rs_transport_branch-branch_name, rs_transport_branch-commit_text.
+ 
+    " If we only have one transport selected set branch name to Transport
+    " name and commit description to transport description.
+    IF lines( it_transport_headers ) = 1.
+      READ TABLE it_transport_headers INDEX 1 INTO ls_transport_header.
+      lv_transports_as_text = ls_transport_header-trkorr.
+      lv_desc_as_text = zcl_abapgit_factory=>get_cts_api( )->read_description( ls_transport_header-trkorr ).
+    ELSE.   " Else set branch name and commit message to ''Transport(s)_TRXXXXXX_TRXXXXX''
+      lv_transports_as_text = ''Transport(s)''.
+      LOOP AT it_transport_headers INTO ls_transport_header.
+        CONCATENATE lv_transports_as_text ''_'' ls_transport_header-trkorr INTO lv_transports_as_text.
+      ENDLOOP.
+      lv_desc_as_text = lv_transports_as_text.
+ 
+    ENDIF.
+    add_field( EXPORTING iv_tabname   = ''TEXTL''
+                         iv_fieldname = ''LINE''
+                         iv_fieldtext = ''Branch name''
+                         iv_value     = lv_transports_as_text
+               CHANGING  ct_fields    = lt_fields ).
+ 
+    add_field( EXPORTING iv_tabname   = ''ABAPTXT255''
+                         iv_fieldname = ''LINE''
+                         iv_fieldtext = ''Commit text''
+                         iv_value     = lv_desc_as_text
+               CHANGING  ct_fields    = lt_fields ).
+ 
+    _popup_3_get_values( EXPORTING iv_popup_title = ''Transport to new Branch''
+                         IMPORTING ev_value_1     = lv_branch_name
+                                   ev_value_2     = lv_commit_text
+                         CHANGING  ct_fields      = lt_fields ).
+ 
+    rs_transport_branch-branch_name = lv_branch_name.
+    rs_transport_branch-commit_text = lv_commit_text.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_select_from_list.
+ 
+    DATA lo_popup TYPE REF TO lcl_object_descision_list.
+ 
+    CLEAR et_list.
+ 
+    ms_position = center(
+      iv_width  = iv_end_column - iv_start_column
+      iv_height = iv_end_line - iv_start_line ).
+ 
+    CREATE OBJECT lo_popup
+      EXPORTING
+        it_list               = it_list
+        iv_title              = iv_title
+        iv_header_text        = iv_header_text
+        is_position           = ms_position
+        iv_striped_pattern    = iv_striped_pattern
+        iv_optimize_col_width = iv_optimize_col_width
+        iv_selection_mode     = iv_selection_mode
+        iv_select_column_text = iv_select_column_text
+        it_columns_to_display = it_columns_to_display
+        it_preselected_rows   = it_preselected_rows.
+ 
+    lo_popup->display( ).
+    lo_popup->get_selected( IMPORTING et_list = et_list ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_select_labels.
+ 
+    DATA:
+      lt_all_labels         TYPE zif_abapgit_repo_srv=>ty_labels,
+      ls_label              LIKE LINE OF lt_all_labels,
+      lt_current_labels     TYPE string_table,
+      lt_selected_labels    LIKE lt_all_labels,
+      lt_columns_to_display TYPE zif_abapgit_popups=>ty_alv_column_tt,
+      lt_preselected_rows   TYPE zif_abapgit_popups=>ty_rows,
+      ls_columns_to_display LIKE LINE OF lt_columns_to_display,
+      lv_save_tabix         TYPE i,
+      li_popup              TYPE REF TO zif_abapgit_popups.
+ 
+    FIELD-SYMBOLS: <lv_label>         TYPE zif_abapgit_repo_srv=>ty_label,
+                   <lv_current_label> TYPE LINE OF string_table.
+ 
+    lt_current_labels = zcl_abapgit_repo_labels=>split( iv_labels ).
+ 
+    lt_all_labels = zcl_abapgit_repo_srv=>get_instance( )->get_label_list( ).
+ 
+    " Add labels which are not saved yet
+    LOOP AT lt_current_labels ASSIGNING <lv_current_label>.
+ 
+      READ TABLE lt_all_labels TRANSPORTING NO FIELDS
+                               WITH KEY key_label
+                               COMPONENTS label = <lv_current_label>.
+      IF sy-subrc <> 0.
+        ls_label-label = <lv_current_label>.
+        INSERT ls_label INTO TABLE lt_all_labels.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF lines( lt_all_labels ) = 0.
+      zcx_abapgit_exception=>raise( |No labels maintained yet| ).
+    ENDIF.
+ 
+    SORT lt_all_labels.
+    DELETE ADJACENT DUPLICATES FROM lt_all_labels.
+ 
+    " Preselect current labels
+    LOOP AT lt_all_labels ASSIGNING <lv_label>.
+ 
+      lv_save_tabix = sy-tabix.
+ 
+      READ TABLE lt_current_labels TRANSPORTING NO FIELDS
+                                   WITH KEY table_line = <lv_label>-label.
+      IF sy-subrc = 0.
+        INSERT lv_save_tabix INTO TABLE lt_preselected_rows.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    ls_columns_to_display-name = ''LABEL''.
+    ls_columns_to_display-text = ''Label''.
+    INSERT ls_columns_to_display INTO TABLE lt_columns_to_display.
+ 
+    li_popup = zcl_abapgit_ui_factory=>get_popups( ).
+    li_popup->popup_to_select_from_list(
+      EXPORTING
+        iv_header_text        = ''Select labels''
+        iv_select_column_text = ''Add label''
+        it_list               = lt_all_labels
+        iv_selection_mode     = if_salv_c_selection_mode=>multiple
+        it_columns_to_display = lt_columns_to_display
+        it_preselected_rows   = lt_preselected_rows
+        iv_start_column       = 15
+        iv_end_column         = 55
+      IMPORTING
+        et_list               = lt_selected_labels ).
+ 
+    LOOP AT lt_selected_labels ASSIGNING <lv_label>.
+      IF rv_labels IS NOT INITIAL.
+        rv_labels = rv_labels && '',''.
+      ENDIF.
+      rv_labels = rv_labels && <lv_label>-label.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_select_transports.
+ 
+* todo, method to be renamed, it only returns one transport
+ 
+    DATA: lv_trkorr TYPE e070-trkorr,
+          ls_trkorr LIKE LINE OF rt_trkorr.
+ 
+ 
+    CALL FUNCTION ''TR_F4_REQUESTS''
+      IMPORTING
+        ev_selected_request = lv_trkorr.
+ 
+    IF NOT lv_trkorr IS INITIAL.
+      ls_trkorr-trkorr = lv_trkorr.
+      APPEND ls_trkorr TO rt_trkorr.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_transport_request.
+ 
+    DATA: lt_e071    TYPE STANDARD TABLE OF e071,
+          lt_e071k   TYPE STANDARD TABLE OF e071k,
+          lv_order   TYPE trkorr,
+          ls_e070use TYPE e070use.
+    DATA lv_category TYPE e070-korrdev.
+ 
+    " If default transport is set and its type matches, then use it as default for the popup
+    ls_e070use = zcl_abapgit_default_transport=>get_instance( )->get( ).
+ 
+    IF ( ls_e070use-trfunction = is_transport_type-request OR ls_e070use-trfunction IS INITIAL )
+      AND iv_use_default_transport = abap_true.
+      lv_order = ls_e070use-ordernum.
+    ENDIF.
+ 
+    " Differentiate between customizing and WB requests
+    IF is_transport_type-request = zif_abapgit_cts_api=>c_transport_type-cust_request.
+      lv_category = zif_abapgit_cts_api=>c_transport_category-customizing.
+    ELSE.
+      lv_category = zif_abapgit_cts_api=>c_transport_category-workbench.
+    ENDIF.
+ 
+    CALL FUNCTION ''TRINT_ORDER_CHOICE''
+      EXPORTING
+        wi_order_type          = is_transport_type-request
+        wi_task_type           = is_transport_type-task
+        wi_category            = lv_category
+        wi_order               = lv_order
+      IMPORTING
+        we_order               = rv_transport
+      TABLES
+        wt_e071                = lt_e071
+        wt_e071k               = lt_e071k
+      EXCEPTIONS
+        no_correction_selected = 1
+        display_mode           = 2
+        object_append_error    = 3
+        recursive_call         = 4
+        wrong_order_type       = 5
+        OTHERS                 = 6.
+ 
+    IF sy-subrc = 1.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ELSEIF sy-subrc > 1.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~tag_list_popup.
+ 
+    DATA: lo_branches  TYPE REF TO zcl_abapgit_git_branch_list,
+          lt_tags      TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+          ls_branch    TYPE zif_abapgit_git_definitions=>ty_git_branch,
+          lv_answer    TYPE c LENGTH 1,
+          lv_default   TYPE i,
+          lv_tag       TYPE string,
+          lt_selection TYPE TABLE OF spopli.
+ 
+    FIELD-SYMBOLS: <ls_sel> LIKE LINE OF lt_selection,
+                   <ls_tag> LIKE LINE OF lt_tags.
+ 
+ 
+    lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
+    lt_tags     = lo_branches->get_tags_only( ).
+ 
+    LOOP AT lt_tags ASSIGNING <ls_tag> WHERE name NP ''*'' && zif_abapgit_git_definitions=>c_git_branch-peel.
+ 
+      APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+      <ls_sel>-varoption = zcl_abapgit_git_tag=>remove_tag_prefix( <ls_tag>-name ).
+ 
+    ENDLOOP.
+ 
+    IF lt_selection IS INITIAL.
+      zcx_abapgit_exception=>raise( ''No tags are available to select'' ).
+    ENDIF.
+ 
+    ms_position = center(
+      iv_width  = 30
+      iv_height = lines( lt_selection ) ).
+ 
+    CALL FUNCTION ''POPUP_TO_DECIDE_LIST''
+      EXPORTING
+        titel      = ''Select Tag''
+        textline1  = ''Select a tag''
+        start_col  = ms_position-start_column
+        start_row  = ms_position-start_row
+        cursorline = lv_default
+      IMPORTING
+        answer     = lv_answer
+      TABLES
+        t_spopli   = lt_selection
+      EXCEPTIONS
+        OTHERS     = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error from POPUP_TO_DECIDE_LIST'' ).
+    ENDIF.
+ 
+    IF lv_answer = c_answer_cancel.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
+    ASSERT sy-subrc = 0.
+ 
+    lv_tag = zcl_abapgit_git_tag=>add_tag_prefix( <ls_sel>-varoption ).
+ 
+    READ TABLE lt_tags WITH KEY name_key COMPONENTS name = lv_tag ASSIGNING <ls_tag>.
+    IF sy-subrc <> 0.
+      " tag name longer than 65 characters
+      LOOP AT lt_tags ASSIGNING <ls_tag> WHERE name CS lv_tag.
+        EXIT.
+      ENDLOOP.
+    ENDIF.
+    ASSERT <ls_tag> IS ASSIGNED.
+ 
+    ls_branch = lo_branches->find_by_name( <ls_tag>-name ).
+    MOVE-CORRESPONDING ls_branch TO rs_tag.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD _popup_3_get_values.
+ 
+    DATA lv_answer TYPE c LENGTH 1.
+    FIELD-SYMBOLS: <ls_field> TYPE sval.
+ 
+    ms_position = center(
+      iv_width  = 120
+      iv_height = lines( ct_fields ) ).
+ 
+    CALL FUNCTION ''POPUP_GET_VALUES''
+      EXPORTING
+        no_value_check = iv_no_value_check
+        popup_title    = iv_popup_title
+        start_column   = ms_position-start_column
+        start_row      = ms_position-start_row
+      IMPORTING
+        returncode     = lv_answer
+      TABLES
+        fields         = ct_fields
+      EXCEPTIONS
+        OTHERS         = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''Error from POPUP_GET_VALUES'' ).
+    ENDIF.
+ 
+    IF lv_answer = c_answer_cancel.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    IF ev_value_1 IS SUPPLIED.
+      READ TABLE ct_fields INDEX 1 ASSIGNING <ls_field>.
+      ASSERT sy-subrc = 0.
+      ev_value_1 = <ls_field>-value.
+    ENDIF.
+ 
+    IF ev_value_2 IS SUPPLIED.
+      READ TABLE ct_fields INDEX 2 ASSIGNING <ls_field>.
+      ASSERT sy-subrc = 0.
+      ev_value_2 = <ls_field>-value.
+    ENDIF.
+ 
+    IF ev_value_3 IS SUPPLIED.
+      READ TABLE ct_fields INDEX 3 ASSIGNING <ls_field>.
+      ASSERT sy-subrc = 0.
+      ev_value_3 = <ls_field>-value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_UI_FACTORY                  ', 'CLASS zcl_abapgit_ui_factory DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_ui_injector .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_asset_manager
+      RETURNING
+        VALUE(ri_asset_man) TYPE REF TO zif_abapgit_gui_asset_manager
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_popups
+      RETURNING
+        VALUE(ri_popups) TYPE REF TO zif_abapgit_popups .
+    CLASS-METHODS get_gui
+      RETURNING
+        VALUE(ro_gui) TYPE REF TO zcl_abapgit_gui
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_gui_services
+      RETURNING
+        VALUE(ri_gui_services) TYPE REF TO zif_abapgit_gui_services
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_frontend_services
+      RETURNING
+        VALUE(ri_fe_serv) TYPE REF TO zif_abapgit_frontend_services .
+    CLASS-METHODS get_html_viewer
+      IMPORTING
+        !io_container           TYPE REF TO cl_gui_container DEFAULT cl_gui_container=>screen0
+        !iv_disable_query_table TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ri_viewer)        TYPE REF TO zif_abapgit_html_viewer .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_popups TYPE REF TO zif_abapgit_popups .
+    CLASS-DATA gi_html_viewer TYPE REF TO zif_abapgit_html_viewer .
+    CLASS-DATA go_gui TYPE REF TO zcl_abapgit_gui .
+    CLASS-DATA gi_fe_services TYPE REF TO zif_abapgit_frontend_services .
+    CLASS-DATA gi_gui_services TYPE REF TO zif_abapgit_gui_services .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ui_factory IMPLEMENTATION.
+ 
+ 
+  METHOD get_asset_manager.
+ 
+    DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
+    DATA li_asset_man TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    CREATE OBJECT lo_buf.
+ 
+    li_asset_man = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    " @@abapmerge include zabapgit_css_common.w3mi.data.css > lo_buf->add( ''$$'' ).
+    li_asset_man->register_asset(
+      iv_url       = ''css/common.css''
+      iv_type      = ''text/css''
+      iv_mime_name = ''ZABAPGIT_CSS_COMMON''
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_css_theme_default.w3mi.data.css > lo_buf->add( ''$$'' ).
+    li_asset_man->register_asset(
+      iv_url       = ''css/theme-default.css''
+      iv_type      = ''text/css''
+      iv_cachable  = abap_false
+      iv_mime_name = ''ZABAPGIT_CSS_THEME_DEFAULT''
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_css_theme_dark.w3mi.data.css > lo_buf->add( ''$$'' ).
+    li_asset_man->register_asset(
+      iv_url       = ''css/theme-dark.css''
+      iv_type      = ''text/css''
+      iv_cachable  = abap_false
+      iv_mime_name = ''ZABAPGIT_CSS_THEME_DARK''
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_css_theme_belize_blue.w3mi.data.css > lo_buf->add( ''$$'' ).
+    li_asset_man->register_asset(
+      iv_url       = ''css/theme-belize-blue.css''
+      iv_type      = ''text/css''
+      iv_cachable  = abap_false
+      iv_mime_name = ''ZABAPGIT_CSS_THEME_BELIZE_BLUE''
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_js_common.w3mi.data.js > lo_buf->add( ''$$'' ).
+    li_asset_man->register_asset(
+      iv_url       = ''js/common.js''
+      iv_type      = ''text/javascript''
+      iv_mime_name = ''ZABAPGIT_JS_COMMON''
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_icon_font_css.w3mi.data.css > lo_buf->add( ''$$'' ).
+    li_asset_man->register_asset(
+      iv_url       = ''css/ag-icons.css''
+      iv_type      = ''text/css''
+      iv_mime_name = ''ZABAPGIT_ICON_FONT_CSS''
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include-base64 zabapgit_icon_font.w3mi.data.woff > lo_buf->add( ''$$'' ).
+    li_asset_man->register_asset(
+      iv_url       = ''font/ag-icons.woff''
+      iv_type      = ''font/woff''
+      iv_mime_name = ''ZABAPGIT_ICON_FONT''
+      iv_base64    = lo_buf->join_and_flush( ) ).
+ 
+    ri_asset_man = li_asset_man.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_frontend_services.
+ 
+    IF gi_fe_services IS INITIAL.
+      CREATE OBJECT gi_fe_services TYPE zcl_abapgit_frontend_services.
+    ENDIF.
+ 
+    ri_fe_serv = gi_fe_services.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_gui.
+ 
+    DATA:
+      li_hotkey_ctl TYPE REF TO zif_abapgit_gui_hotkey_ctl,
+      li_router     TYPE REF TO zif_abapgit_gui_event_handler,
+      li_asset_man  TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    DATA lo_html_preprocessor TYPE REF TO zcl_abapgit_gui_html_processor.
+ 
+    IF go_gui IS INITIAL.
+      li_asset_man = get_asset_manager( ).
+ 
+      CREATE OBJECT lo_html_preprocessor EXPORTING ii_asset_man = li_asset_man.
+      lo_html_preprocessor->preserve_css( ''css/ag-icons.css'' ).
+      lo_html_preprocessor->preserve_css( ''css/common.css'' ).
+ 
+      CREATE OBJECT li_router TYPE zcl_abapgit_gui_router.
+      CREATE OBJECT li_hotkey_ctl TYPE zcl_abapgit_gui_hotkey_ctl.
+ 
+      CREATE OBJECT go_gui
+        EXPORTING
+          io_component      = li_router
+          ii_hotkey_ctl     = li_hotkey_ctl
+          ii_html_processor = lo_html_preprocessor
+          ii_asset_man      = li_asset_man.
+    ENDIF.
+    ro_gui = go_gui.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_gui_services.
+    IF gi_gui_services IS NOT BOUND.
+      gi_gui_services ?= get_gui( ).
+    ENDIF.
+    ri_gui_services = gi_gui_services.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_html_viewer.
+ 
+    IF gi_html_viewer IS NOT BOUND.
+      CREATE OBJECT gi_html_viewer TYPE zcl_abapgit_html_viewer_gui
+        EXPORTING
+          io_container           = io_container
+          iv_disable_query_table = iv_disable_query_table.
+    ENDIF.
+ 
+    ri_viewer = gi_html_viewer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_popups.
+ 
+    IF gi_popups IS INITIAL.
+      CREATE OBJECT gi_popups TYPE zcl_abapgit_popups.
+    ENDIF.
+ 
+    ri_popups = gi_popups.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_UI_INJECTOR                 ', 'CLASS zcl_abapgit_ui_injector DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS set_popups
+      IMPORTING
+        !ii_popups TYPE REF TO zif_abapgit_popups .
+    CLASS-METHODS set_frontend_services
+      IMPORTING
+        !ii_fe_serv TYPE REF TO zif_abapgit_frontend_services .
+    CLASS-METHODS set_gui_services
+      IMPORTING
+        !ii_gui_services TYPE REF TO zif_abapgit_gui_services .
+    CLASS-METHODS get_dummy_gui_services
+      RETURNING
+        VALUE(ri_gui_services) TYPE REF TO zif_abapgit_gui_services .
+    CLASS-METHODS set_html_viewer
+      IMPORTING
+        !ii_html_viewer TYPE REF TO zif_abapgit_html_viewer .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ui_injector IMPLEMENTATION.
+ 
+ 
+  METHOD get_dummy_gui_services.
+ 
+    ri_gui_services = lcl_gui_services_dummy=>create( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_frontend_services.
+ 
+    zcl_abapgit_ui_factory=>gi_fe_services = ii_fe_serv.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_gui_services.
+ 
+    zcl_abapgit_ui_factory=>gi_gui_services = ii_gui_services.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_html_viewer.
+ 
+    zcl_abapgit_ui_factory=>gi_html_viewer = ii_html_viewer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_popups.
+ 
+    zcl_abapgit_ui_factory=>gi_popups = ii_popups.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_FRONTEND_SERVICES           ', 'INTERFACE zif_abapgit_frontend_services PUBLIC.
+ 
+  TYPES:
+    ty_char1       TYPE c LENGTH 1,
+    ty_gui_release TYPE n LENGTH 4,
+    ty_gui_sp      TYPE n LENGTH 2,
+    ty_gui_patch   TYPE n LENGTH 2.
+ 
+  METHODS file_upload
+    IMPORTING
+      !iv_path       TYPE string
+    RETURNING
+      VALUE(rv_xstr) TYPE xstring
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS file_download
+    IMPORTING
+      !iv_path TYPE string
+      !iv_xstr TYPE xstring
+    RAISING
+      zcx_abapgit_exception .
+ 
+  METHODS show_file_save_dialog
+    IMPORTING
+      !iv_title            TYPE string
+      !iv_extension        TYPE string
+      !iv_default_filename TYPE string
+    RETURNING
+      VALUE(rv_path)       TYPE string
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS show_file_open_dialog
+    IMPORTING
+      !iv_title            TYPE string
+      !iv_extension        TYPE string
+      !iv_default_filename TYPE string
+    RETURNING
+      VALUE(rv_path)       TYPE string
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS clipboard_export
+    IMPORTING
+      iv_no_auth_check TYPE abap_bool DEFAULT abap_false
+      VALUE(it_data)   TYPE STANDARD TABLE
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS execute
+    IMPORTING
+      !iv_document          TYPE string OPTIONAL
+      !iv_application       TYPE string OPTIONAL
+      !iv_parameter         TYPE string OPTIONAL
+      !iv_default_directory TYPE string OPTIONAL
+      !iv_maximized         TYPE string OPTIONAL
+      !iv_minimized         TYPE string OPTIONAL
+      !iv_synchronous       TYPE string OPTIONAL
+      !iv_operation         TYPE string DEFAULT ''OPEN''
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS get_system_directory
+    CHANGING
+      !cv_system_directory TYPE string
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS directory_browse
+    IMPORTING
+      iv_window_title    TYPE string OPTIONAL
+      iv_initial_folder  TYPE string OPTIONAL
+    CHANGING
+      cv_selected_folder TYPE string
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS get_file_separator
+    CHANGING
+      cv_file_separator TYPE ty_char1
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS get_gui_version
+    EXPORTING
+      ev_gui_release        TYPE ty_gui_release
+      ev_gui_sp             TYPE ty_gui_sp
+      ev_gui_patch          TYPE ty_gui_patch
+      ev_gui_version_string TYPE string
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS directory_exist
+    IMPORTING
+      iv_directory     TYPE string
+    RETURNING
+      VALUE(rv_exists) TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS directory_create
+    IMPORTING
+      iv_directory TYPE string
+    CHANGING
+      cv_rc        TYPE i
+    RAISING
+      zcx_abapgit_exception.
+ 
+  METHODS gui_is_available
+    RETURNING
+      VALUE(rv_gui_is_available) TYPE abap_bool.
+ 
+  METHODS is_sapgui_for_java
+    RETURNING
+      VALUE(rv_result) TYPE abap_bool.
+ 
+  METHODS is_sapgui_for_windows
+    RETURNING
+      VALUE(rv_result) TYPE abap_bool.
+ 
+  METHODS is_webgui
+    RETURNING
+      VALUE(rv_is_webgui) TYPE abap_bool.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_POPUPS                      ', 'INTERFACE zif_abapgit_popups
+  PUBLIC .
+ 
+ 
+  TYPES:
+    ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY,
+    ty_rows    TYPE SORTED TABLE OF i WITH UNIQUE KEY table_line.
+ 
+  TYPES:
+    BEGIN OF ty_alv_column,
+      name      TYPE string,
+      text      TYPE string,
+      length    TYPE lvc_outlen,
+      show_icon TYPE abap_bool,
+      center    TYPE abap_bool,
+    END OF ty_alv_column,
+    ty_alv_column_tt TYPE TABLE OF ty_alv_column WITH DEFAULT KEY.
+ 
+  TYPES:
+    BEGIN OF ty_popup_position,
+      start_column LIKE  sy-cucol,
+      start_row    LIKE  sy-curow,
+      end_column   LIKE  sy-cucol,
+      end_row      LIKE  sy-curow,
+    END OF ty_popup_position.
+ 
+  CONSTANTS c_new_branch_label TYPE string VALUE ''+ create new ...'' ##NO_TEXT.
+ 
+  METHODS popup_search_help
+    IMPORTING
+      !iv_tab_field   TYPE string
+    RETURNING
+      VALUE(rv_value) TYPE ddshretval-fieldval
+    RAISING
+      zcx_abapgit_exception .
+  METHODS popup_folder_logic
+    RETURNING
+      VALUE(rv_folder_logic) TYPE string
+    RAISING
+      zcx_abapgit_exception .
+  METHODS create_branch_popup
+    IMPORTING
+      !iv_source_branch_name TYPE string
+    EXPORTING
+      !ev_name               TYPE string
+      !ev_cancel             TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS branch_list_popup
+    IMPORTING
+      !iv_url             TYPE string
+      !iv_default_branch  TYPE string OPTIONAL
+      !iv_show_new_option TYPE abap_bool OPTIONAL
+      !iv_hide_branch     TYPE zif_abapgit_persistence=>ty_repo-branch_name OPTIONAL
+      !iv_hide_head       TYPE abap_bool OPTIONAL
+    RETURNING
+      VALUE(rs_branch)    TYPE zif_abapgit_git_definitions=>ty_git_branch
+    RAISING
+      zcx_abapgit_exception .
+  METHODS tag_list_popup
+    IMPORTING
+      !iv_url       TYPE string
+    RETURNING
+      VALUE(rs_tag) TYPE zif_abapgit_git_definitions=>ty_git_tag
+    RAISING
+      zcx_abapgit_exception .
+  METHODS commit_list_popup
+    IMPORTING
+      !iv_repo_url     TYPE string
+      !iv_branch_name  TYPE string OPTIONAL
+    RETURNING
+      VALUE(rs_commit) TYPE zif_abapgit_git_definitions=>ty_commit
+    RAISING
+      zcx_abapgit_exception .
+  TYPES ty_char1 TYPE c LENGTH 1.
+  TYPES ty_icon TYPE c LENGTH 30.
+  METHODS popup_to_confirm
+    IMPORTING
+      !iv_titlebar              TYPE clike
+      !iv_text_question         TYPE clike
+      !iv_text_button_1         TYPE clike DEFAULT ''Yes''
+      !iv_icon_button_1         TYPE ty_icon DEFAULT space
+      !iv_text_button_2         TYPE clike DEFAULT ''No''
+      !iv_icon_button_2         TYPE ty_icon DEFAULT space
+      !iv_default_button        TYPE ty_char1 DEFAULT ''1''
+      !iv_display_cancel_button TYPE ty_char1 DEFAULT abap_true
+    RETURNING
+      VALUE(rv_answer)          TYPE ty_char1
+    RAISING
+      zcx_abapgit_exception .
+  METHODS popup_to_create_package
+    EXPORTING
+      !es_package_data TYPE scompkdtln
+      !ev_create       TYPE abap_bool
+    RAISING
+      zcx_abapgit_exception .
+  METHODS popup_to_create_transp_branch
+    IMPORTING
+      !it_transport_headers      TYPE trwbo_request_headers
+    RETURNING
+      VALUE(rs_transport_branch) TYPE zif_abapgit_definitions=>ty_transport_to_branch
+    RAISING
+      zcx_abapgit_exception .
+  METHODS popup_to_select_transports
+    RETURNING
+      VALUE(rt_trkorr) TYPE trwbo_request_headers .
+  METHODS popup_to_select_from_list
+    IMPORTING
+      !it_list               TYPE STANDARD TABLE
+      !iv_title              TYPE lvc_title DEFAULT space
+      !iv_header_text        TYPE csequence DEFAULT space
+      !iv_start_column       TYPE i DEFAULT 10
+      !iv_end_column         TYPE i DEFAULT 125
+      !iv_start_line         TYPE i DEFAULT 10
+      !iv_end_line           TYPE i DEFAULT 30
+      !iv_striped_pattern    TYPE abap_bool DEFAULT abap_false
+      !iv_optimize_col_width TYPE abap_bool DEFAULT abap_true
+      !iv_selection_mode     TYPE salv_de_constant DEFAULT if_salv_c_selection_mode=>multiple
+      !iv_select_column_text TYPE csequence DEFAULT space
+      !it_columns_to_display TYPE ty_alv_column_tt
+      !it_preselected_rows   TYPE ty_rows OPTIONAL
+    EXPORTING
+      VALUE(et_list)         TYPE STANDARD TABLE
+    RAISING
+      zcx_abapgit_exception .
+  METHODS popup_transport_request
+    IMPORTING
+      !is_transport_type        TYPE zif_abapgit_definitions=>ty_transport_type OPTIONAL
+      !iv_use_default_transport TYPE abap_bool DEFAULT abap_false
+      PREFERRED PARAMETER is_transport_type
+    RETURNING
+      VALUE(rv_transport)       TYPE trkorr
+    RAISING
+      zcx_abapgit_exception .
+  METHODS popup_select_tr_requests
+    IMPORTING is_selection        TYPE trwbo_selection
+              iv_title            TYPE trwbo_title
+              iv_username_pattern TYPE any DEFAULT sy-uname
+    RETURNING VALUE(rt_r_trkorr)  TYPE zif_abapgit_definitions=>ty_trrngtrkor_tt
+    RAISING   zcx_abapgit_exception.
+  METHODS popup_select_wb_tc_tr_and_tsk
+    RETURNING VALUE(rt_r_trkorr) TYPE zif_abapgit_definitions=>ty_trrngtrkor_tt
+    RAISING   zcx_abapgit_exception.
+  METHODS popup_to_select_labels
+    IMPORTING iv_labels        TYPE string OPTIONAL
+    RETURNING VALUE(rv_labels) TYPE string
+    RAISING   zcx_abapgit_exception.
+  METHODS choose_code_insp_check_variant
+    RETURNING VALUE(rv_check_variant) TYPE sci_chkv
+    RAISING
+      zcx_abapgit_exception.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ABAP_LANGUAGE_VERS          ', 'CLASS zcl_abapgit_abap_language_vers DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS get_abap_language_vers_by_objt
+      IMPORTING
+        !iv_object_type                      TYPE trobjtype
+        !iv_package                          TYPE devclass
+      RETURNING
+        VALUE(rv_allowed_abap_langu_version) TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version .
+    METHODS is_import_allowed
+      IMPORTING
+        !io_repo          TYPE REF TO zif_abapgit_repo
+        !iv_package       TYPE devclass
+      RETURNING
+        VALUE(rv_allowed) TYPE abap_bool .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS get_abap_language_vers_by_devc
+      IMPORTING
+        !iv_package                     TYPE devclass
+      RETURNING
+        VALUE(rv_abap_language_version) TYPE string .
+    METHODS get_abap_language_vers_by_repo
+      IMPORTING
+        !io_repo                        TYPE REF TO zif_abapgit_repo
+      RETURNING
+        VALUE(rv_abap_language_version) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION.
+ 
+ 
+  METHOD get_abap_language_vers_by_devc.
+ 
+    DATA lv_class TYPE string.
+    DATA lv_abap_lang_version_devc TYPE string.
+    DATA lo_abap_language_version_cfg TYPE REF TO object.
+ 
+    lv_class = ''CL_ABAP_LANGUAGE_VERSION_CFG''.
+ 
+    TRY.
+        CREATE OBJECT lo_abap_language_version_cfg TYPE (''IF_ABAP_LANGUAGE_VERSION_CFG'').
+ 
+        CALL METHOD (lv_class)=>(''GET_INSTANCE'')
+          RECEIVING
+            ro_instance = lo_abap_language_version_cfg.
+ 
+        CALL METHOD lo_abap_language_version_cfg->(''IF_ABAP_LANGUAGE_VERSION_CFG~GET_PACKAGE_DEFAULT_VERSION'')
+          EXPORTING
+            iv_package_name             = iv_package
+          RECEIVING
+            rv_default_language_version = lv_abap_lang_version_devc.
+ 
+        CASE lv_abap_lang_version_devc.
+          WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
+            rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
+          WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-key_user.
+            rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-key_user.
+          WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development.
+            rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-cloud_development.
+          WHEN OTHERS.
+            rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
+        ENDCASE.
+      CATCH cx_root.
+        rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_abap_language_vers_by_objt.
+ 
+    DATA lv_class TYPE string.
+    DATA lo_abap_language_version TYPE REF TO object.
+ 
+    lv_class = ''CL_ABAP_LANGUAGE_VERSION_CFG''.
+ 
+    TRY.
+ 
+        CREATE OBJECT lo_abap_language_version TYPE (''IF_ABAP_LANGUAGE_VERSION'').
+ 
+        CALL METHOD (lv_class)=>(''GET_INSTANCE'')
+          RECEIVING
+            ro_instance = lo_abap_language_version.
+ 
+        CALL METHOD lo_abap_language_version->(''IF_ABAP_LANGUAGE_VERSION~GET_DEFAULT_VERSION'')
+          EXPORTING
+            iv_object_type     = iv_object_type
+            iv_package_name    = iv_package
+          RECEIVING
+            rv_default_version = rv_allowed_abap_langu_version.
+ 
+      CATCH cx_root.
+        rv_allowed_abap_langu_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
+        "to do: here we need to differentiate between source code object and non-source code objects
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_abap_language_vers_by_repo.
+    rv_abap_language_version = io_repo->get_dot_abapgit( )->get_abap_language_version( ).
+    IF rv_abap_language_version IS INITIAL.
+      rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_import_allowed.
+ 
+    CASE get_abap_language_vers_by_repo( io_repo ).
+      WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
+        rv_allowed = abap_true.
+      WHEN OTHERS.
+        IF get_abap_language_vers_by_repo( io_repo ) = get_abap_language_vers_by_devc( iv_package ).
+          rv_allowed = abap_true.
+        ELSEIF
+        get_abap_language_vers_by_devc( iv_package ) = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined AND
+        get_abap_language_vers_by_repo( io_repo )    = zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
+          rv_allowed = abap_true.
+        ELSE.
+          rv_allowed = abap_false.
+        ENDIF.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_CONVERT                     ', 'CLASS zcl_abapgit_convert DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS bitbyte_to_int
+      IMPORTING
+        !iv_bits      TYPE clike
+      RETURNING
+        VALUE(rv_int) TYPE i .
+    CLASS-METHODS x_to_bitbyte
+      IMPORTING
+        !iv_x             TYPE x
+      RETURNING
+        VALUE(rv_bitbyte) TYPE zif_abapgit_git_definitions=>ty_bitbyte .
+    CLASS-METHODS string_to_xstring_utf8
+      IMPORTING
+        !iv_string        TYPE string
+      RETURNING
+        VALUE(rv_xstring) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS xstring_to_string_utf8
+      IMPORTING
+        !iv_data         TYPE xsequence
+        !iv_length       TYPE i OPTIONAL
+      RETURNING
+        VALUE(rv_string) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS string_to_xstring_utf8_bom
+      IMPORTING
+        !iv_string        TYPE string
+      RETURNING
+        VALUE(rv_xstring) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS xstring_to_int
+      IMPORTING
+        !iv_xstring TYPE xstring
+      RETURNING
+        VALUE(rv_i) TYPE i
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS int_to_xstring4
+      IMPORTING
+        !iv_i             TYPE i
+      RETURNING
+        VALUE(rv_xstring) TYPE xstring .
+    CLASS-METHODS split_string
+      IMPORTING
+        !iv_string      TYPE string
+      RETURNING
+        VALUE(rt_lines) TYPE string_table .
+    CLASS-METHODS conversion_exit_isola_output
+      IMPORTING
+        !iv_spras       TYPE spras
+      RETURNING
+        VALUE(rv_spras) TYPE laiso .
+    CLASS-METHODS string_to_xstring
+      IMPORTING
+        !iv_str        TYPE string
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS string_to_tab
+      IMPORTING
+        !iv_str  TYPE string
+      EXPORTING
+        !ev_size TYPE i
+        !et_tab  TYPE STANDARD TABLE .
+    CLASS-METHODS base64_to_xstring
+      IMPORTING
+        !iv_base64     TYPE string
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring .
+    CLASS-METHODS xstring_to_bintab
+      IMPORTING
+        !iv_xstr   TYPE xstring
+      EXPORTING
+        !ev_size   TYPE i
+        !et_bintab TYPE STANDARD TABLE .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_convert_out TYPE REF TO cl_abap_conv_out_ce .
+    CLASS-DATA go_convert_in TYPE REF TO cl_abap_conv_in_ce .
+ 
+    CLASS-METHODS xstring_remove_bom
+      IMPORTING
+        iv_xstr        TYPE xsequence
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_convert IMPLEMENTATION.
+ 
+ 
+  METHOD base64_to_xstring.
+ 
+    rv_xstr = cl_http_utility=>decode_x_base64( iv_base64 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD bitbyte_to_int.
+ 
+    DATA: lv_bitbyte TYPE string,
+          lv_len     TYPE i,
+          lv_offset  TYPE i.
+ 
+    lv_bitbyte = iv_bits.
+    SHIFT lv_bitbyte LEFT DELETING LEADING ''0 ''.
+    lv_len     = strlen( lv_bitbyte ).
+    lv_offset  = lv_len - 1.
+ 
+    rv_int = 0.
+    DO lv_len TIMES.
+ 
+      IF sy-index = 1.
+        "Intialize
+        IF lv_bitbyte+lv_offset(1) = ''1''.
+          rv_int = 1.
+        ENDIF.
+      ELSEIF lv_bitbyte+lv_offset(1) = ''1''.
+        rv_int = rv_int + ( 2 ** ( sy-index - 1 ) ).
+      ENDIF.
+ 
+      lv_offset = lv_offset - 1. "Move Cursor
+ 
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD conversion_exit_isola_output.
+ 
+    cl_gdt_conversion=>language_code_outbound(
+      EXPORTING
+        im_value = iv_spras
+      IMPORTING
+        ex_value = rv_spras ).
+ 
+    TRANSLATE rv_spras TO UPPER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD int_to_xstring4.
+* returns xstring of length 4 containing the integer value iv_i
+ 
+    DATA lv_x TYPE x LENGTH 4.
+ 
+    lv_x = iv_i.
+    rv_xstring = lv_x.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_string.
+ 
+    FIND FIRST OCCURRENCE OF cl_abap_char_utilities=>cr_lf IN iv_string.
+ 
+    " Convert string into table depending on separator type CR_LF vs. LF
+    IF sy-subrc = 0.
+      SPLIT iv_string AT cl_abap_char_utilities=>cr_lf INTO TABLE rt_lines.
+    ELSE.
+      SPLIT iv_string AT cl_abap_char_utilities=>newline INTO TABLE rt_lines.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD string_to_tab.
+ 
+    DATA lv_length TYPE i.
+    DATA lv_iterations TYPE i.
+    DATA lv_offset TYPE i.
+ 
+    FIELD-SYMBOLS <lg_line> TYPE any.
+ 
+ 
+    CLEAR et_tab.
+    ev_size = strlen( iv_str ).
+ 
+    APPEND INITIAL LINE TO et_tab ASSIGNING <lg_line>.
+    <lg_line> = iv_str.
+    DESCRIBE FIELD <lg_line> LENGTH lv_length IN CHARACTER MODE.
+    lv_iterations = ev_size DIV lv_length.
+ 
+    DO lv_iterations TIMES.
+      lv_offset = sy-index * lv_length.
+      APPEND INITIAL LINE TO et_tab ASSIGNING <lg_line>.
+      <lg_line> = iv_str+lv_offset.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD string_to_xstring.
+ 
+    rv_xstr = string_to_xstring_utf8( iv_str ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD string_to_xstring_utf8.
+ 
+    DATA lx_error TYPE REF TO cx_root.
+ 
+    TRY.
+        IF go_convert_out IS INITIAL.
+          go_convert_out = cl_abap_conv_out_ce=>create( encoding = ''UTF-8'' ).
+        ENDIF.
+ 
+        go_convert_out->convert(
+          EXPORTING
+            data   = iv_string
+          IMPORTING
+            buffer = rv_xstring ).
+ 
+      CATCH cx_parameter_invalid_range
+            cx_sy_codepage_converter_init
+            cx_sy_conversion_codepage
+            cx_parameter_invalid_type INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD string_to_xstring_utf8_bom.
+ 
+    IF iv_string IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    rv_xstring = string_to_xstring_utf8( iv_string ).
+ 
+    " Add UTF-8 BOM
+    IF xstrlen( rv_xstring ) < 3 OR rv_xstring(3) <> cl_abap_char_utilities=>byte_order_mark_utf8.
+      rv_xstring = cl_abap_char_utilities=>byte_order_mark_utf8 && rv_xstring.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD xstring_remove_bom.
+ 
+    rv_xstr = iv_xstr.
+ 
+    " cl_abap_conv_in_ce does not handle BOM in non-Unicode systems, so we remove it
+    IF cl_abap_char_utilities=>charsize = 1 AND xstrlen( rv_xstr ) > 3
+        AND rv_xstr(3) = cl_abap_char_utilities=>byte_order_mark_utf8.
+ 
+      rv_xstr = rv_xstr+3.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD xstring_to_bintab.
+ 
+    DATA lv_length TYPE i.
+    DATA lv_iterations TYPE i.
+    DATA lv_offset TYPE i.
+ 
+    FIELD-SYMBOLS <lg_line> TYPE any.
+ 
+ 
+    CLEAR et_bintab.
+    ev_size = xstrlen( iv_xstr ).
+ 
+    APPEND INITIAL LINE TO et_bintab ASSIGNING <lg_line>.
+    <lg_line> = iv_xstr.
+    DESCRIBE FIELD <lg_line> LENGTH lv_length IN BYTE MODE.
+    lv_iterations = ev_size DIV lv_length.
+ 
+    DO lv_iterations TIMES.
+      lv_offset = sy-index * lv_length.
+      APPEND INITIAL LINE TO et_bintab ASSIGNING <lg_line>.
+      <lg_line> = iv_xstr+lv_offset.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD xstring_to_int.
+ 
+* use the built-in type conversion
+    rv_i = iv_xstring.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD xstring_to_string_utf8.
+ 
+    DATA lx_error  TYPE REF TO cx_root.
+    DATA lv_data TYPE xstring.
+    DATA lv_length TYPE i.
+ 
+    " Remove BOM for non-Unicode systems
+    lv_data = xstring_remove_bom( iv_data ).
+ 
+    lv_length = iv_length.
+    IF lv_length <= 0.
+      lv_length = xstrlen( lv_data ).
+    ENDIF.
+ 
+    TRY.
+        IF go_convert_in IS INITIAL.
+          go_convert_in = cl_abap_conv_in_ce=>create( encoding = ''UTF-8'' ).
+        ENDIF.
+ 
+        go_convert_in->convert(
+          EXPORTING
+            input = lv_data
+            n     = lv_length
+          IMPORTING
+            data  = rv_string ).
+ 
+      CATCH cx_parameter_invalid_range
+            cx_sy_codepage_converter_init
+            cx_sy_conversion_codepage
+            cx_parameter_invalid_type INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD x_to_bitbyte.
+ 
+    CLEAR rv_bitbyte.
+ 
+    GET BIT 1 OF iv_x INTO rv_bitbyte+0(1).
+    GET BIT 2 OF iv_x INTO rv_bitbyte+1(1).
+    GET BIT 3 OF iv_x INTO rv_bitbyte+2(1).
+    GET BIT 4 OF iv_x INTO rv_bitbyte+3(1).
+    GET BIT 5 OF iv_x INTO rv_bitbyte+4(1).
+    GET BIT 6 OF iv_x INTO rv_bitbyte+5(1).
+    GET BIT 7 OF iv_x INTO rv_bitbyte+6(1).
+    GET BIT 8 OF iv_x INTO rv_bitbyte+7(1).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_DIFF                        ', 'CLASS zcl_abapgit_diff DEFINITION
+  PUBLIC
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    CONSTANTS co_starting_beacon TYPE i VALUE 1.
+ 
+* assumes data is UTF8 based with newlines
+    METHODS constructor
+      IMPORTING
+        !iv_new                TYPE xstring
+        !iv_old                TYPE xstring
+        !iv_ignore_indentation TYPE abap_bool DEFAULT abap_false
+        !iv_ignore_comments    TYPE abap_bool DEFAULT abap_false
+        !iv_ignore_case        TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get
+      RETURNING
+        VALUE(rt_diff) TYPE zif_abapgit_definitions=>ty_diffs_tt.
+    METHODS stats
+      RETURNING
+        VALUE(rs_count) TYPE zif_abapgit_definitions=>ty_count.
+    METHODS set_patch_new
+      IMPORTING
+        !iv_line_new   TYPE i
+        !iv_patch_flag TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_patch_old
+      IMPORTING
+        !iv_line_old   TYPE i
+        !iv_patch_flag TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_beacons
+      RETURNING
+        VALUE(rt_beacons) TYPE zif_abapgit_definitions=>ty_string_tt.
+    METHODS is_line_patched
+      IMPORTING
+        iv_index          TYPE i
+      RETURNING
+        VALUE(rv_patched) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_patch_by_old_diff
+      IMPORTING
+        is_diff_old   TYPE zif_abapgit_definitions=>ty_diff
+        iv_patch_flag TYPE abap_bool.
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_regexset_tt TYPE STANDARD TABLE OF REF TO cl_abap_regex WITH KEY table_line.
+ 
+    DATA mt_beacons TYPE zif_abapgit_definitions=>ty_string_tt.
+    DATA mt_diff TYPE zif_abapgit_definitions=>ty_diffs_tt.
+    DATA ms_stats TYPE zif_abapgit_definitions=>ty_count.
+    DATA mv_compare_mode TYPE c LENGTH 1.
+    DATA mv_ignore_case TYPE abap_bool.
+ 
+    METHODS unpack
+      IMPORTING
+        !iv_new TYPE xstring
+        !iv_old TYPE xstring
+      EXPORTING
+        !et_new TYPE rswsourcet
+        !et_old TYPE rswsourcet
+      RAISING
+        zcx_abapgit_exception.
+    METHODS map_beacons.
+    METHODS shortlist.
+    METHODS create_regex_set
+      RETURNING
+        VALUE(rt_regex_set) TYPE ty_regexset_tt.
+    METHODS compute_and_render
+      IMPORTING
+        !it_new        TYPE rswsourcet
+        !it_old        TYPE rswsourcet
+      RETURNING
+        VALUE(rt_diff) TYPE zif_abapgit_definitions=>ty_diffs_tt.
+    METHODS calculate_stats.
+    METHODS adjust_diff.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_diff IMPLEMENTATION.
+ 
+ 
+  METHOD adjust_diff.
+ 
+    " ABAP kernel diff traverses files from bottom up which leads to odd display of diffs
+    " SAP won''t adjust this kernel service so we will do it here
+    " https://github.com/abapGit/abapGit/issues/4395
+ 
+    TYPES:
+      BEGIN OF ty_diff_block,
+        start TYPE i,
+        len   TYPE i,
+      END OF ty_diff_block.
+ 
+    DATA:
+      lv_block_begin TYPE i,
+      lv_block_end   TYPE i,
+      ls_diff_block  TYPE ty_diff_block,
+      lt_diff_block  TYPE STANDARD TABLE OF ty_diff_block WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS:
+      <ls_diff>       LIKE LINE OF mt_diff,
+      <ls_diff_begin> LIKE LINE OF mt_diff,
+      <ls_diff_end>   LIKE LINE OF mt_diff.
+ 
+    " Determine start and length of diff blocks
+    LOOP AT mt_diff ASSIGNING <ls_diff>.
+      IF <ls_diff>-result = zif_abapgit_definitions=>c_diff-insert OR
+         <ls_diff>-result = zif_abapgit_definitions=>c_diff-delete.
+        IF ls_diff_block IS INITIAL.
+          ls_diff_block-start = sy-tabix.
+        ENDIF.
+        ls_diff_block-len = ls_diff_block-len + 1.
+      ELSEIF ls_diff_block-start IS NOT INITIAL.
+        APPEND ls_diff_block TO lt_diff_block.
+        CLEAR ls_diff_block.
+      ENDIF.
+    ENDLOOP.
+ 
+    " For each diff block, check if beginning is same as end of block
+    " If yes, move diff block down
+    LOOP AT lt_diff_block INTO ls_diff_block.
+      DO ls_diff_block-len TIMES.
+        lv_block_begin = ls_diff_block-start + sy-index - 1.
+        READ TABLE mt_diff ASSIGNING <ls_diff_begin> INDEX lv_block_begin.
+        IF sy-subrc <> 0.
+          EXIT.
+        ENDIF.
+        lv_block_end = ls_diff_block-start + ls_diff_block-len + sy-index - 1.
+        READ TABLE mt_diff ASSIGNING <ls_diff_end> INDEX lv_block_end.
+        IF sy-subrc <> 0.
+          EXIT.
+        ENDIF.
+        CASE <ls_diff_begin>-result.
+          WHEN zif_abapgit_definitions=>c_diff-insert.
+            IF <ls_diff_begin>-new = <ls_diff_end>-new.
+              <ls_diff_begin>-old_num = <ls_diff_end>-old_num.
+              <ls_diff_begin>-old     = <ls_diff_end>-old.
+              <ls_diff_end>-result    = <ls_diff_begin>-result.
+              CLEAR: <ls_diff_begin>-result, <ls_diff_end>-old_num, <ls_diff_end>-old.
+            ELSE.
+              EXIT.
+            ENDIF.
+          WHEN zif_abapgit_definitions=>c_diff-delete.
+            IF <ls_diff_begin>-old = <ls_diff_end>-old.
+              <ls_diff_begin>-new_num = <ls_diff_end>-new_num.
+              <ls_diff_begin>-new     = <ls_diff_end>-new.
+              <ls_diff_end>-result    = <ls_diff_begin>-result.
+              CLEAR: <ls_diff_begin>-result, <ls_diff_end>-new_num, <ls_diff_end>-new.
+            ELSE.
+              EXIT.
+            ENDIF.
+          WHEN OTHERS.
+            EXIT.
+        ENDCASE.
+      ENDDO.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD calculate_stats.
+ 
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
+ 
+    LOOP AT mt_diff ASSIGNING <ls_diff>.
+      CASE <ls_diff>-result.
+        WHEN zif_abapgit_definitions=>c_diff-insert.
+          ms_stats-insert = ms_stats-insert + 1.
+        WHEN zif_abapgit_definitions=>c_diff-delete.
+          ms_stats-delete = ms_stats-delete + 1.
+        WHEN zif_abapgit_definitions=>c_diff-update.
+          ms_stats-update = ms_stats-update + 1.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD compute_and_render.
+ 
+    DATA:
+      lv_i     TYPE i,
+      ls_diff  LIKE LINE OF rt_diff,
+      lt_delta TYPE STANDARD TABLE OF rsedcresul WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS:
+      <ls_old>   LIKE LINE OF it_old,
+      <ls_new>   LIKE LINE OF it_new,
+      <ls_delta> LIKE LINE OF lt_delta.
+ 
+    " Note: Ignore case is for keywords, variables, types etc, but not for literals
+    CALL FUNCTION ''RS_CMP_COMPUTE_DELTA''
+      EXPORTING
+        compare_mode            = mv_compare_mode
+        ignore_case_differences = mv_ignore_case
+      TABLES
+        text_tab1               = it_new
+        text_tab2               = it_old
+        text_tab_res            = lt_delta
+      EXCEPTIONS
+        parameter_invalid       = 1
+        difference_not_found    = 2
+        OTHERS                  = 3.
+ 
+    IF sy-subrc = 0.
+      " Process delta
+      LOOP AT lt_delta ASSIGNING <ls_delta>.
+        CLEAR ls_diff.
+        IF <ls_delta>-line1 > 0.
+          lv_i = <ls_delta>-line1.
+          ls_diff-old_num = lv_i.
+          ls_diff-old     = <ls_delta>-text1.
+        ENDIF.
+        IF <ls_delta>-line2 > 0.
+          lv_i = <ls_delta>-line2.
+          ls_diff-new_num = lv_i.
+          ls_diff-new     = <ls_delta>-text2.
+        ENDIF.
+        IF <ls_delta>-flag1 = ''D''.
+          ls_diff-result = zif_abapgit_definitions=>c_diff-delete.
+        ELSEIF <ls_delta>-flag2 = ''I''.
+          ls_diff-result = zif_abapgit_definitions=>c_diff-insert.
+        ELSEIF <ls_delta>-flag1 = ''M'' AND <ls_delta>-flag2 = ''M''.
+          ls_diff-result = zif_abapgit_definitions=>c_diff-update.
+        ELSEIF <ls_delta>-flag1 = '''' AND <ls_delta>-flag2 = ''''.
+          ls_diff-result = zif_abapgit_definitions=>c_diff-unchanged.
+        ELSEIF <ls_delta>-flag1 = '''' AND <ls_delta>-flag2 = ''E''. " ignore comment
+          ls_diff-result = zif_abapgit_definitions=>c_diff-unchanged.
+        ELSEIF <ls_delta>-flag1 = ''E'' AND <ls_delta>-flag2 = ''''. " ignore comment
+          ls_diff-result = zif_abapgit_definitions=>c_diff-unchanged.
+        ELSE.
+          ASSERT 0 = 1. " unknown comparison result
+        ENDIF.
+        APPEND ls_diff TO rt_diff.
+      ENDLOOP.
+    ELSEIF sy-subrc = 2.
+      " Copy input... but it might not be identical
+      LOOP AT it_old ASSIGNING <ls_old>.
+        CLEAR ls_diff.
+        ls_diff-old_num = sy-tabix.
+        ls_diff-old     = <ls_old>.
+        READ TABLE it_new ASSIGNING <ls_new> INDEX sy-tabix.
+        ASSERT sy-subrc = 0.
+        ls_diff-new_num = sy-tabix.
+        ls_diff-new     = <ls_new>.
+        " SAP function ignores lines that contain only whitespace so we compare directly
+        IF ( mv_compare_mode = 1 OR mv_compare_mode = 3 ) AND <ls_old> <> <ls_new> AND
+           ( strlen( condense( <ls_old> ) ) = 0 OR strlen( condense( <ls_new> ) ) = 0 ).
+          ls_diff-result = zif_abapgit_definitions=>c_diff-update.
+        ENDIF.
+        APPEND ls_diff TO rt_diff.
+      ENDLOOP.
+    ELSE.
+      ASSERT 0 = 1. " incorrect function call
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lt_new TYPE rswsourcet,
+          lt_old TYPE rswsourcet.
+ 
+    mv_compare_mode = 1.
+    IF iv_ignore_indentation = abap_true.
+      mv_compare_mode = mv_compare_mode + 1.
+    ENDIF.
+    IF iv_ignore_comments = abap_true.
+      mv_compare_mode = mv_compare_mode + 2.
+    ENDIF.
+    mv_ignore_case = iv_ignore_case.
+ 
+    unpack( EXPORTING iv_new = iv_new
+                      iv_old = iv_old
+            IMPORTING et_new = lt_new
+                      et_old = lt_old ).
+ 
+    mt_diff = compute_and_render( it_new = lt_new
+                                  it_old = lt_old ).
+ 
+    adjust_diff( ).
+ 
+    calculate_stats( ).
+    map_beacons( ).
+    shortlist( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_regex_set.
+ 
+    DATA: lo_regex TYPE REF TO cl_abap_regex,
+          lt_regex TYPE zif_abapgit_definitions=>ty_string_tt,
+          lv_regex LIKE LINE OF lt_regex.
+ 
+    APPEND ''^\\s*(CLASS|FORM|MODULE|REPORT|METHOD|INTERFACE|FUNCTION)\\s[^=]'' TO lt_regex.
+    APPEND ''^\\s*(PUBLIC|PROTECTED|PRIVATE)\\sSECTION(\\s|\\.)'' TO lt_regex.
+    APPEND ''^\\s*(CLASS|INTERFACE|FUNCTION|TYPE)-POOL\\s'' TO lt_regex.
+    APPEND ''^\\s*(START|END)-OF-SELECTION(\\s|\\.)'' TO lt_regex.
+    APPEND ''^\\s*INITIALIZATION(\\s|\\.)'' TO lt_regex.
+    APPEND ''^\\s*(TOP-OF-PAGE|END-OF-PAGE)(\\s|\\.)'' TO lt_regex.
+    APPEND ''^\\s*AT\\s*(SELECTION-SCREEN|LINE-SELECTION|USER-COMMAND|PF\\d+)(\\s|\\.)'' TO lt_regex.
+    APPEND ''^\\s*(DEFINE|ENHANCEMENT)\\s'' TO lt_regex.
+ 
+    LOOP AT lt_regex INTO lv_regex.
+      CREATE OBJECT lo_regex
+        EXPORTING
+          pattern     = lv_regex
+          ignore_case = abap_true.
+      APPEND lo_regex TO rt_regex_set.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get.
+    rt_diff = mt_diff.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_beacons.
+    rt_beacons = mt_beacons.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_line_patched.
+ 
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    READ TABLE mt_diff INDEX iv_index
+                       ASSIGNING <ls_diff>.
+    IF sy-subrc = 0.
+      rv_patched = <ls_diff>-patch_flag.
+    ELSE.
+      zcx_abapgit_exception=>raise( |Diff line not found { iv_index }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_beacons.
+ 
+    DATA: lv_beacon_idx  TYPE i VALUE co_starting_beacon,
+          lv_offs        TYPE i,
+          lv_beacon_str  TYPE string,
+          lv_beacon_2lev TYPE string,
+          lv_submatch    TYPE string,
+          lo_regex       TYPE REF TO cl_abap_regex,
+          lt_regex       TYPE ty_regexset_tt.
+ 
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
+ 
+    lt_regex = create_regex_set( ).
+    LOOP AT mt_diff ASSIGNING <ls_diff>.
+ 
+      CLEAR lv_offs.
+      <ls_diff>-beacon = lv_beacon_idx.
+ 
+      LOOP AT lt_regex INTO lo_regex.
+        FIND FIRST OCCURRENCE OF REGEX lo_regex IN <ls_diff>-new SUBMATCHES lv_submatch.
+        IF sy-subrc = 0. " Match
+          lv_beacon_str = <ls_diff>-new.
+          lv_submatch = to_upper( lv_submatch ).
+ 
+          " Get rid of comments and end of line
+          FIND FIRST OCCURRENCE OF ''.'' IN lv_beacon_str MATCH OFFSET lv_offs.
+          IF sy-subrc <> 0.
+            FIND FIRST OCCURRENCE OF ''"'' IN lv_beacon_str MATCH OFFSET lv_offs.
+          ENDIF.
+ 
+          IF lv_offs > 0.
+            lv_beacon_str = lv_beacon_str(lv_offs).
+          ENDIF.
+          lv_beacon_str = condense( val = lv_beacon_str
+                                    del = \` \` ).
+ 
+          IF lv_submatch = ''CLASS''.
+            lv_beacon_2lev = replace( val   = lv_beacon_str
+                                      regex = ''\\s+(DEFINITION|IMPLEMENTATION)''
+                                      with  = ''''
+                                      occ   = 0 ).
+          ELSEIF lv_submatch = ''METHOD''.
+            lv_beacon_str = lv_beacon_2lev && \` => \` && lv_beacon_str.
+          ELSEIF lv_submatch = ''PUBLIC'' OR lv_submatch = ''PROTECTED'' OR lv_submatch = ''PRIVATE''.
+            lv_beacon_str = lv_beacon_2lev && \` \` && lv_beacon_str.
+          ENDIF.
+ 
+          APPEND lv_beacon_str TO mt_beacons.
+          lv_beacon_idx    = sy-tabix.
+          <ls_diff>-beacon = lv_beacon_idx.
+          EXIT. "Loop
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_patch_by_old_diff.
+ 
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    LOOP AT mt_diff ASSIGNING <ls_diff>
+                    USING KEY new_num
+                    WHERE old     = is_diff_old-old
+                    AND   new     = is_diff_old-new
+                    AND   new_num = is_diff_old-new_num
+                    AND   old_num = is_diff_old-old_num.
+ 
+      <ls_diff>-patch_flag = iv_patch_flag.
+      EXIT.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_patch_new.
+ 
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    READ TABLE mt_diff WITH TABLE KEY new_num
+                       COMPONENTS new_num = iv_line_new
+                       ASSIGNING <ls_diff>.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Invalid new line number { iv_line_new }| ).
+    ENDIF.
+ 
+    <ls_diff>-patch_flag = iv_patch_flag.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_patch_old.
+ 
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    READ TABLE mt_diff WITH TABLE KEY old_num
+                       COMPONENTS old_num = iv_line_old
+                       ASSIGNING <ls_diff>.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Invalid old line number { iv_line_old }| ).
+    ENDIF.
+ 
+    <ls_diff>-patch_flag = iv_patch_flag.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD shortlist.
+ 
+    DATA: lv_index TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
+ 
+    IF lines( mt_diff ) < 20.
+      LOOP AT mt_diff ASSIGNING <ls_diff>.
+        <ls_diff>-short = abap_true.
+      ENDLOOP.
+    ELSE.
+      LOOP AT mt_diff TRANSPORTING NO FIELDS
+          WHERE NOT result IS INITIAL AND short = abap_false.
+        lv_index = sy-tabix.
+ 
+        DO 8 TIMES. " Backward
+          READ TABLE mt_diff INDEX ( lv_index - sy-index ) ASSIGNING <ls_diff>.
+          IF sy-subrc <> 0 OR <ls_diff>-short = abap_true. " tab bound or prev marker
+            EXIT.
+          ENDIF.
+          <ls_diff>-short = abap_true.
+        ENDDO.
+ 
+        DO 8 TIMES. " Forward
+          READ TABLE mt_diff INDEX ( lv_index + sy-index - 1 ) ASSIGNING <ls_diff>.
+          IF sy-subrc <> 0. " tab bound reached
+            EXIT.
+          ENDIF.
+          CHECK <ls_diff>-short = abap_false. " skip marked
+          <ls_diff>-short = abap_true.
+        ENDDO.
+ 
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD stats.
+    rs_count = ms_stats.
+  ENDMETHOD.
+ 
+ 
+  METHOD unpack.
+ 
+    DATA: lv_new      TYPE string,
+          lv_old      TYPE string,
+          lv_new_last TYPE c LENGTH 1,
+          lv_old_last TYPE c LENGTH 1.
+ 
+    lv_new = zcl_abapgit_convert=>xstring_to_string_utf8( iv_new ).
+    lv_old = zcl_abapgit_convert=>xstring_to_string_utf8( iv_old ).
+ 
+    " Check if one value contains a final newline but the other not
+    " If yes, add a special characters that''s visible in diff render
+    IF lv_new IS NOT INITIAL.
+      lv_new_last = substring(
+        val = lv_new
+        off = strlen( lv_new ) - 1 ).
+    ENDIF.
+    IF lv_old IS NOT INITIAL.
+      lv_old_last = substring(
+        val = lv_old
+        off = strlen( lv_old ) - 1 ).
+    ENDIF.
+ 
+    IF lv_new_last = cl_abap_char_utilities=>newline AND lv_old_last <> cl_abap_char_utilities=>newline
+      AND lv_old IS NOT INITIAL.
+      lv_old = lv_old && cl_abap_char_utilities=>form_feed.
+    ELSEIF lv_new_last <> cl_abap_char_utilities=>newline AND lv_old_last = cl_abap_char_utilities=>newline
+      AND lv_new IS NOT INITIAL.
+      lv_new = lv_new && cl_abap_char_utilities=>form_feed.
+    ENDIF.
+ 
+    SPLIT lv_new AT cl_abap_char_utilities=>newline INTO TABLE et_new.
+    SPLIT lv_old AT cl_abap_char_utilities=>newline INTO TABLE et_old.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ENVIRONMENT                 ', 'CLASS zcl_abapgit_environment DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_environment .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mv_cloud TYPE abap_bool VALUE abap_undefined ##NO_TEXT.
+    DATA mv_is_merged TYPE abap_bool VALUE abap_undefined ##NO_TEXT.
+    DATA mv_modifiable TYPE abap_bool VALUE abap_undefined ##NO_TEXT.
+ 
+    METHODS is_system_changes_allowed
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_environment IMPLEMENTATION.
+ 
+ 
+  METHOD is_system_changes_allowed.
+ 
+    DATA:
+      lv_systemedit         TYPE tadir-edtflag,
+      lv_sys_cliinddep_edit TYPE t000-ccnocliind,
+      lv_is_shadow          TYPE abap_bool,
+      ls_upginfo            TYPE uvers,
+      lv_is_upgrade         TYPE abap_bool.
+ 
+    CALL FUNCTION ''TR_SYS_PARAMS''
+      IMPORTING
+        systemedit         = lv_systemedit
+        sys_cliinddep_edit = lv_sys_cliinddep_edit
+      EXCEPTIONS
+        no_systemname      = 1
+        no_systemtype      = 2
+        OTHERS             = 3.
+    IF sy-subrc <> 0.
+      " Assume system can''t be changed
+      RETURN.
+    ENDIF.
+ 
+    CALL FUNCTION ''UPG_IS_SHADOW_SYSTEM''
+      IMPORTING
+        ev_shadow = lv_is_shadow.
+ 
+    CALL FUNCTION ''UPG_GET_ACTIVE_COMP_UPGRADE''
+      EXPORTING
+        iv_component = ''SAP_BASIS''
+        iv_upgtype   = ''A''
+        iv_buffered  = abap_false
+      IMPORTING
+        ev_upginfo   = ls_upginfo
+      EXCEPTIONS
+        OTHERS       = 4.
+    IF sy-subrc = 0 AND ls_upginfo-putstatus NA ''ITU''.
+      lv_is_upgrade = abap_true.
+    ENDIF.
+ 
+    " SAP system has status ''not modifiable'' (TK 102)
+    " Changes to repository objects are not permitted in this client (TK 729)
+    " Shadow system
+    " Running upgrade
+    rv_result = boolc(
+      lv_systemedit <> ''N'' AND
+      lv_sys_cliinddep_edit NA ''23'' AND
+      lv_is_shadow <> abap_true AND
+      lv_is_upgrade <> abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~compare_with_inactive.
+    rv_result = zif_abapgit_environment~is_sap_cloud_platform( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~get_basis_release.
+ 
+    SELECT SINGLE release extrelease FROM cvers INTO (rs_result-release, rs_result-sp)
+      WHERE component = ''SAP_BASIS'' ##SUBRC_OK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_merged.
+    DATA lr_marker TYPE REF TO data ##NEEDED.
+ 
+    IF mv_is_merged = abap_undefined.
+      TRY.
+          CREATE DATA lr_marker TYPE REF TO (''LIF_ABAPMERGE_MARKER'').
+          "No exception --> marker found
+          mv_is_merged = abap_true.
+ 
+        CATCH cx_sy_create_data_error.
+          mv_is_merged = abap_false.
+      ENDTRY.
+    ENDIF.
+    rv_result = mv_is_merged.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_repo_object_changes_allowed.
+    IF mv_modifiable = abap_undefined.
+      mv_modifiable = is_system_changes_allowed( ).
+    ENDIF.
+    rv_result = mv_modifiable.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_restart_required.
+    " This method will be used in the context of SAP Cloud Platform:
+    " Pull/Push operations are executed in background jobs.
+    " In case of the respective application server needs to be restarted,
+    " it is required to terminate the background job and reschedule again.
+    rv_result = abap_false.
+    TRY.
+        CALL METHOD (''CL_APJ_SCP_TOOLS'')=>(''IS_RESTART_REQUIRED'')
+          RECEIVING
+            restart_required = rv_result.
+      CATCH cx_sy_dyn_call_illegal_method cx_sy_dyn_call_illegal_class.
+        rv_result = abap_false.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_sap_cloud_platform.
+    IF mv_cloud = abap_undefined.
+      TRY.
+          CALL METHOD (''CL_COS_UTILITIES'')=>(''IS_SAP_CLOUD_PLATFORM'')
+            RECEIVING
+              rv_is_sap_cloud_platform = mv_cloud.
+        CATCH cx_sy_dyn_call_error.
+          mv_cloud = abap_false.
+      ENDTRY.
+    ENDIF.
+    rv_result = mv_cloud.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_sap_object_allowed.
+ 
+    rv_allowed = cl_enh_badi_def_utility=>is_sap_system( ).
+    IF rv_allowed = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    rv_allowed = zcl_abapgit_exit=>get_instance( )->allow_sap_objects( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_environment~get_system_language_filter.
+    DATA lv_translation_detective_lang TYPE spras.
+    DATA lv_pseudo_translation_language TYPE spras.
+    FIELD-SYMBOLS <ls_system_language_filter> LIKE LINE OF rt_system_language_filter.
+ 
+    " Translation Object Detective
+    " https://help.sap.com/docs/ABAP_PLATFORM_NEW/ceb25152cb0d4adba664cebea2bf4670/88a3d3cbccf64601975acabaccdfde45.html
+    CALL FUNCTION ''CONVERSION_EXIT_ISOLA_INPUT''
+      EXPORTING
+        input            = ''1Q''
+      IMPORTING
+        output           = lv_translation_detective_lang
+      EXCEPTIONS
+        unknown_language = 1
+        OTHERS           = 2.
+    IF sy-subrc = 1.
+      " The language for Translation Object Detective was not setup
+    ENDIF.
+    IF NOT lv_translation_detective_lang IS INITIAL.
+      APPEND INITIAL LINE TO rt_system_language_filter ASSIGNING <ls_system_language_filter>.
+      <ls_system_language_filter>-sign = ''E''.
+      <ls_system_language_filter>-option = ''EQ''.
+      <ls_system_language_filter>-low = lv_translation_detective_lang.
+    ENDIF.
+    " 1943470 - Using technical language key 2Q to create pseudo-translations of ABAP developments
+    " https://launchpad.support.sap.com/#/notes/1943470
+    CALL FUNCTION ''CONVERSION_EXIT_ISOLA_INPUT''
+      EXPORTING
+        input            = ''2Q''
+      IMPORTING
+        output           = lv_pseudo_translation_language
+      EXCEPTIONS
+        unknown_language = 1
+        OTHERS           = 2.
+    IF sy-subrc = 1.
+      " The language for Pseudo Translation was not setup
+    ENDIF.
+    IF NOT lv_pseudo_translation_language IS INITIAL.
+      APPEND INITIAL LINE TO rt_system_language_filter ASSIGNING <ls_system_language_filter>.
+      <ls_system_language_filter>-sign = ''E''.
+      <ls_system_language_filter>-option = ''EQ''.
+      <ls_system_language_filter>-low = lv_pseudo_translation_language.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_environment~is_variant_maintenance.
+ 
+    DATA:
+      lt_variscreens TYPE STANDARD TABLE OF rsdynnr
+                          WITH NON-UNIQUE DEFAULT KEY.
+ 
+    " Memory is set in LSVARF08 / EXPORT_SCREEN_TABLES.
+    IMPORT variscreens = lt_variscreens FROM MEMORY ID ''%_SCRNR_%''.
+ 
+    rv_is_variant_maintenance = boolc( lines( lt_variscreens ) > 0 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ITEM_STATE                  ', 'CLASS zcl_abapgit_item_state DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS local
+      RETURNING
+        VALUE(rv_state) TYPE zif_abapgit_git_definitions=>ty_item_state.
+    METHODS remote
+      RETURNING
+        VALUE(rv_state) TYPE zif_abapgit_git_definitions=>ty_item_state.
+    METHODS is_reassigned
+      RETURNING
+        VALUE(rv_is_reassigned) TYPE abap_bool.
+    METHODS is_unchanged
+      RETURNING
+        VALUE(rv_is_unchanged) TYPE abap_bool.
+    METHODS sum_with_repo_item
+      IMPORTING
+        !is_repo_item TYPE zif_abapgit_definitions=>ty_repo_item.
+    METHODS sum_with_status_item
+      IMPORTING
+        !is_status_item TYPE zif_abapgit_definitions=>ty_result.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mv_lstate TYPE zif_abapgit_git_definitions=>ty_item_state.
+    DATA mv_rstate TYPE zif_abapgit_git_definitions=>ty_item_state.
+    DATA mv_is_reassigned TYPE abap_bool.
+ 
+    CLASS-METHODS reduce
+      IMPORTING
+        iv_prev       TYPE zif_abapgit_git_definitions=>ty_item_state
+        iv_cur        TYPE zif_abapgit_git_definitions=>ty_item_state
+      RETURNING
+        VALUE(rv_new) TYPE zif_abapgit_git_definitions=>ty_item_state.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ITEM_STATE IMPLEMENTATION.
+ 
+ 
+  METHOD is_reassigned.
+    rv_is_reassigned = mv_is_reassigned.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_unchanged.
+    rv_is_unchanged = boolc( mv_is_reassigned = abap_false
+      AND mv_lstate = zif_abapgit_definitions=>c_state-unchanged
+      AND mv_rstate = zif_abapgit_definitions=>c_state-unchanged ).
+  ENDMETHOD.
+ 
+ 
+  METHOD local.
+    rv_state = mv_lstate.
+  ENDMETHOD.
+ 
+ 
+  METHOD reduce.
+ 
+    rv_new = iv_prev.
+    IF rv_new = iv_cur OR iv_cur IS INITIAL.
+      RETURN. " No change
+    ELSEIF rv_new IS INITIAL.
+      rv_new = iv_cur.
+    ELSE.
+      rv_new = zif_abapgit_definitions=>c_state-mixed.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remote.
+    rv_state = mv_rstate.
+  ENDMETHOD.
+ 
+ 
+  METHOD sum_with_repo_item.
+ 
+    mv_lstate = reduce(
+      iv_prev = mv_lstate
+      iv_cur  = is_repo_item-lstate ).
+    mv_rstate = reduce(
+      iv_prev = mv_rstate
+      iv_cur  = is_repo_item-rstate ).
+    mv_is_reassigned = boolc( mv_is_reassigned = abap_true OR is_repo_item-packmove = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sum_with_status_item.
+ 
+    mv_lstate = reduce(
+      iv_prev = mv_lstate
+      iv_cur  = is_status_item-lstate ).
+    mv_rstate = reduce(
+      iv_prev = mv_rstate
+      iv_cur  = is_status_item-rstate ).
+    mv_is_reassigned = boolc( mv_is_reassigned = abap_true OR is_status_item-packmove = abap_true ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_LANGUAGE                    ', '*----------------------------------------------------------------------*
+* This helper class is used to set and restore the current language.
+* As some of the SAP functions used rely on SY-LANGU containing the
+* main language, this class is used to temporarily change and then
+* restore the value of SY-LANGU.
+*----------------------------------------------------------------------*
+CLASS zcl_abapgit_language DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS class_constructor .
+    CLASS-METHODS restore_login_language .
+    CLASS-METHODS set_current_language
+      IMPORTING
+        !iv_language TYPE sy-langu .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gv_login_language TYPE sy-langu .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_language IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+ 
+    DATA lv_dummy TYPE string.
+ 
+    GET LOCALE LANGUAGE gv_login_language COUNTRY lv_dummy MODIFIER lv_dummy.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD restore_login_language.
+ 
+    SET LOCALE LANGUAGE gv_login_language.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_current_language.
+ 
+    SET LOCALE LANGUAGE iv_language.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_LOG                         ', 'CLASS zcl_abapgit_log DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_log .
+ 
+    METHODS constructor
+      IMPORTING
+        iv_title TYPE string OPTIONAL.
+ 
+    CLASS-METHODS from_exception
+      IMPORTING
+        io_x TYPE REF TO cx_root
+      RETURNING
+        VALUE(ro_log) TYPE REF TO zcl_abapgit_log.
+ 
+  PROTECTED SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_log, "in order of occurrence
+        msg       TYPE zif_abapgit_log=>ty_msg,
+        item      TYPE zif_abapgit_definitions=>ty_item,
+        exception TYPE REF TO cx_root,
+      END OF ty_log .
+ 
+    DATA:
+      mt_log TYPE STANDARD TABLE OF ty_log WITH DEFAULT KEY .
+    DATA mv_title TYPE string .
+ 
+    METHODS get_messages_status
+      IMPORTING
+        !it_msg          TYPE zif_abapgit_log=>ty_msgs
+      RETURNING
+        VALUE(rv_status) TYPE sy-msgty .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_log IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    zif_abapgit_log~set_title( iv_title ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_exception.
+ 
+    CREATE OBJECT ro_log.
+ 
+    IF io_x IS BOUND.
+      ro_log->zif_abapgit_log~add_exception( io_x ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_messages_status.
+ 
+    DATA lr_msg TYPE REF TO zif_abapgit_log=>ty_msg.
+    rv_status = ''S''.
+    LOOP AT it_msg REFERENCE INTO lr_msg.
+      CASE lr_msg->type.
+        WHEN ''E'' OR ''A'' OR ''X''.
+          rv_status = ''E''. "not okay
+          EXIT.
+        WHEN ''W''.
+          rv_status = ''W''. "maybe
+          CONTINUE.
+        WHEN ''S'' OR ''I''.
+          IF rv_status <> ''W''.
+            rv_status = ''S''. "okay
+          ENDIF.
+          CONTINUE.
+        WHEN OTHERS. "unknown
+          CONTINUE.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add.
+ 
+    FIELD-SYMBOLS: <ls_log> LIKE LINE OF mt_log.
+ 
+    APPEND INITIAL LINE TO mt_log ASSIGNING <ls_log>.
+    <ls_log>-msg-text  = iv_msg.
+    <ls_log>-msg-type  = iv_type.
+    <ls_log>-item      = is_item.
+    <ls_log>-exception = ix_exc.
+ 
+    CASE iv_type.
+      WHEN ''E'' OR ''A'' OR ''X''.
+        <ls_log>-msg-level = zif_abapgit_log=>c_log_level-error.
+      WHEN ''W''.
+        <ls_log>-msg-level = zif_abapgit_log=>c_log_level-warning.
+      WHEN ''S'' OR ''I''.
+        <ls_log>-msg-level = zif_abapgit_log=>c_log_level-info.
+      WHEN OTHERS. "unknown
+        ASSERT 0 = 1.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_error.
+ 
+    zif_abapgit_log~add(
+      iv_msg  = iv_msg
+      iv_type = ''E''
+      is_item = is_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_exception.
+ 
+    DATA lx_exc TYPE REF TO cx_root.
+    DATA lv_msg TYPE string.
+    lx_exc = ix_exc.
+    DO.
+      lv_msg = lx_exc->get_text( ).
+      zif_abapgit_log~add( iv_msg  = lv_msg
+                           iv_type = ''E''
+                           is_item = is_item
+                           ix_exc  = lx_exc ).
+      IF lx_exc->previous IS BOUND.
+        lx_exc = lx_exc->previous.
+      ELSE.
+        EXIT.
+      ENDIF.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_info.
+ 
+    zif_abapgit_log~add(
+      iv_msg  = iv_msg
+      iv_type = ''I''
+      is_item = is_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_success.
+ 
+    zif_abapgit_log~add(
+      iv_msg  = iv_msg
+      iv_type = ''S''
+      is_item = is_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_warning.
+ 
+    zif_abapgit_log~add(
+      iv_msg  = iv_msg
+      iv_type = ''W''
+      is_item = is_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~clear.
+    CLEAR mt_log.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~clone.
+ 
+    DATA lo_log TYPE REF TO zcl_abapgit_log.
+ 
+    CREATE OBJECT lo_log EXPORTING iv_title = mv_title.
+    lo_log->mt_log = mt_log.
+    ri_log = lo_log.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~count.
+    rv_count = lines( mt_log ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_item_status.
+ 
+    DATA lr_log         TYPE REF TO ty_log.
+    DATA ls_msg         TYPE zif_abapgit_log=>ty_msg.
+    DATA ls_item_status TYPE zif_abapgit_log=>ty_item_status_out.
+    DATA lr_item_status TYPE REF TO zif_abapgit_log=>ty_item_status_out.
+ 
+    "collect all message for all objects
+    LOOP AT mt_log REFERENCE INTO lr_log.
+      CLEAR ls_item_status.
+      ls_item_status-item = lr_log->item.
+      READ TABLE rt_item_status REFERENCE INTO lr_item_status
+           WITH KEY item-obj_type = ls_item_status-item-obj_type
+                    item-obj_name = ls_item_status-item-obj_name.
+      IF sy-subrc <> 0.
+        INSERT ls_item_status INTO TABLE rt_item_status.
+        GET REFERENCE OF ls_item_status INTO lr_item_status.
+      ENDIF.
+      CLEAR ls_msg.
+      ls_msg-type = lr_log->msg-type.
+      ls_msg-text = lr_log->msg-text.
+      INSERT ls_msg INTO TABLE lr_item_status->messages.
+    ENDLOOP.
+ 
+    "determine object status from object messages
+    LOOP AT rt_item_status REFERENCE INTO lr_item_status.
+      lr_item_status->status = get_messages_status( lr_item_status->messages ).
+      IF lr_item_status->messages IS INITIAL.
+        CLEAR ls_msg.
+        ls_msg-type = ''I''.
+        ls_msg-text = ''No message''.
+        INSERT ls_msg INTO TABLE lr_item_status->messages.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_log_level.
+ 
+    FIELD-SYMBOLS <ls_log> LIKE LINE OF mt_log.
+ 
+    rv_level = zif_abapgit_log=>c_log_level-empty.
+ 
+    LOOP AT mt_log ASSIGNING <ls_log>.
+      IF <ls_log>-msg-level = zif_abapgit_log=>c_log_level-error.
+        rv_level = zif_abapgit_log=>c_log_level-error.
+        EXIT.
+      ELSEIF <ls_log>-msg-level > rv_level.
+        rv_level = <ls_log>-msg-level.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_messages.
+    DATA ls_msg TYPE zif_abapgit_log~ty_log_out.
+    FIELD-SYMBOLS <ls_log> TYPE ty_log.
+    LOOP AT mt_log ASSIGNING <ls_log>.
+      ls_msg-type      = <ls_log>-msg-type.
+      ls_msg-text      = <ls_log>-msg-text.
+      ls_msg-obj_type  = <ls_log>-item-obj_type.
+      ls_msg-obj_name  = <ls_log>-item-obj_name.
+      ls_msg-exception = <ls_log>-exception.
+      APPEND ls_msg TO rt_msg.
+    ENDLOOP.
+    DELETE ADJACENT DUPLICATES FROM rt_msg.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_status.
+ 
+    DATA lr_log TYPE REF TO ty_log.
+    rv_status = zif_abapgit_log=>c_status-ok.
+    LOOP AT mt_log REFERENCE INTO lr_log.
+      CASE lr_log->msg-type.
+        WHEN ''E'' OR ''A'' OR ''X''.
+          rv_status = zif_abapgit_log=>c_status-error.
+          EXIT.
+        WHEN ''W''.
+          rv_status = zif_abapgit_log=>c_status-warning.
+          CONTINUE.
+        WHEN ''S'' OR ''I''.
+          IF rv_status <> zif_abapgit_log=>c_status-warning.
+            rv_status = zif_abapgit_log=>c_status-ok.
+          ENDIF.
+          CONTINUE.
+        WHEN OTHERS. "unknown
+          ASSERT 0 = 1.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_title.
+    rv_title = mv_title.
+    IF rv_title IS INITIAL.
+      rv_title = ''Log''.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~merge_with.
+ 
+    DATA lo_log TYPE REF TO zcl_abapgit_log.
+    DATA lt_log_temp LIKE lo_log->mt_log.
+ 
+    IF ii_log IS BOUND.
+      lo_log ?= ii_log.
+      IF iv_min_level > 0.
+        lt_log_temp = lo_log->mt_log.
+        DELETE lt_log_temp WHERE msg-level < iv_min_level.
+        APPEND LINES OF lt_log_temp TO mt_log.
+      ELSE.
+        APPEND LINES OF lo_log->mt_log TO mt_log.
+      ENDIF.
+    ENDIF.
+ 
+    ri_log = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~set_title.
+    mv_title = iv_title.
+    ri_log = me.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_NEWS                        ', 'CLASS zcl_abapgit_news DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_log,
+        version      TYPE string,
+        pos_to_cur   TYPE i,
+        is_header    TYPE abap_bool,
+        is_important TYPE abap_bool,
+        text         TYPE string,
+      END OF ty_log .
+    TYPES:
+      ty_logs TYPE STANDARD TABLE OF ty_log WITH DEFAULT KEY .
+ 
+    CONSTANTS c_tail_length TYPE i VALUE 5 ##NO_TEXT.     " Number of versions to display if no updates
+ 
+    CLASS-METHODS create     " TODO REFACTOR
+      IMPORTING
+        !io_repo           TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_news
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_log
+      RETURNING
+        VALUE(rt_log) TYPE ty_logs .
+    METHODS has_news
+      RETURNING
+        VALUE(rv_boolean) TYPE abap_bool .
+    METHODS has_important
+      RETURNING
+        VALUE(rv_boolean) TYPE abap_bool .
+    METHODS has_updates
+      RETURNING
+        VALUE(rv_boolean) TYPE abap_bool .
+    METHODS has_unseen
+      RETURNING
+        VALUE(rv_boolean) TYPE abap_bool .
+    METHODS constructor
+      IMPORTING
+        !iv_rawdata          TYPE xstring
+        !iv_lastseen_version TYPE string
+        !iv_current_version  TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_log TYPE ty_logs .
+    DATA mv_current_version TYPE string .
+    DATA mv_lastseen_version TYPE string .
+    DATA mv_latest_version TYPE string .
+ 
+    METHODS latest_version
+      RETURNING
+        VALUE(rv_version) TYPE string .
+    CLASS-METHODS parse_line
+      IMPORTING
+        !iv_line            TYPE string
+        !iv_current_version TYPE string
+      RETURNING
+        VALUE(rs_log)       TYPE ty_log .
+    CLASS-METHODS parse
+      IMPORTING
+        !it_lines           TYPE string_table
+        !iv_current_version TYPE string
+      RETURNING
+        VALUE(rt_log)       TYPE ty_logs .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_news IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lt_lines    TYPE string_table,
+          lv_string   TYPE string,
+          ls_log_line LIKE LINE OF mt_log.
+ 
+    " Validate params
+    mv_current_version  = zcl_abapgit_version=>normalize( iv_current_version ).
+    mv_lastseen_version = zcl_abapgit_version=>normalize( iv_lastseen_version ).
+    IF mv_current_version IS INITIAL.
+      RETURN. " Internal format of program version is not correct -> abort parsing
+    ENDIF.
+ 
+    lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_rawdata ).
+    lt_lines  = zcl_abapgit_convert=>split_string( lv_string ).
+    mt_log    = parse( it_lines = lt_lines
+                       iv_current_version = mv_current_version ).
+ 
+    READ TABLE mt_log INTO ls_log_line INDEX 1.
+    mv_latest_version = ls_log_line-version. " Empty if not found
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    CONSTANTS: " TODO refactor
+      lc_log_path        TYPE string VALUE ''/'',
+      lc_log_filename    TYPE string VALUE ''changelog*'',
+      lc_log_filename_up TYPE string VALUE ''CHANGELOG*''.
+ 
+    DATA: lo_apack            TYPE REF TO zcl_abapgit_apack_reader,
+          lt_remote           TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lv_version          TYPE string,
+          lv_last_seen        TYPE string,
+          lv_url              TYPE string,
+          lo_repo_online      TYPE REF TO zcl_abapgit_repo_online,
+          lv_version_constant TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit-version_constant.
+ 
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF lt_remote.
+ 
+ 
+    IF io_repo->is_offline( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    lo_repo_online ?= io_repo.
+    lv_url          = lo_repo_online->get_url( ).
+ 
+    lo_apack = io_repo->get_dot_apack( ).
+    IF lo_apack IS BOUND.
+      lv_version = lo_apack->get_manifest_descriptor( )-version.
+    ENDIF.
+ 
+    IF lv_version IS INITIAL.
+      TRY.
+          lv_version_constant = io_repo->get_dot_abapgit( )->get_version_constant( ).
+          IF lv_version_constant IS NOT INITIAL.
+            lv_version = zcl_abapgit_version=>get_version_constant_value( lv_version_constant ).
+          ENDIF.
+        CATCH zcx_abapgit_exception.
+          CLEAR lv_version.
+      ENDTRY.
+    ENDIF.
+ 
+    IF lv_version IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_last_seen = zcl_abapgit_persistence_user=>get_instance( )->get_repo_last_change_seen( lv_url ).
+ 
+    TRY. " Find changelog
+        lt_remote = io_repo->get_files_remote( ).
+      CATCH zcx_abapgit_exception.
+        RETURN.
+    ENDTRY.
+ 
+    LOOP AT lt_remote ASSIGNING <ls_file> WHERE path = lc_log_path
+                                            AND ( filename CP lc_log_filename OR filename CP lc_log_filename_up ).
+ 
+      CREATE OBJECT ro_instance
+        EXPORTING
+          iv_rawdata          = <ls_file>-data
+          iv_current_version  = lv_version
+          iv_lastseen_version = zcl_abapgit_version=>normalize( lv_last_seen ).
+ 
+      EXIT.
+ 
+    ENDLOOP.
+ 
+    IF ro_instance IS BOUND AND lv_last_seen <> ro_instance->latest_version( ).
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_last_change_seen(
+        iv_url     = lv_url
+        iv_version = ro_instance->latest_version( ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_log.
+    rt_log = mt_log.
+  ENDMETHOD.
+ 
+ 
+  METHOD has_important.
+    READ TABLE mt_log WITH KEY is_important = abap_true TRANSPORTING NO FIELDS.
+    rv_boolean = boolc( sy-subrc IS INITIAL ).
+  ENDMETHOD.
+ 
+ 
+  METHOD has_news.
+    rv_boolean = boolc( lines( mt_log ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD has_unseen.
+    rv_boolean = boolc( zcl_abapgit_version=>compare(
+      iv_a = mv_latest_version
+      iv_b = mv_lastseen_version ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD has_updates.
+    rv_boolean = boolc( zcl_abapgit_version=>compare(
+      iv_a = mv_latest_version
+      iv_b = mv_current_version ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD latest_version.
+    rv_version = mv_latest_version.
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA: lv_tail                TYPE i,
+          lv_first_version_found TYPE abap_bool,
+          lv_version             TYPE string,
+          ls_log                 LIKE LINE OF rt_log.
+ 
+    FIELD-SYMBOLS: <lv_line> LIKE LINE OF it_lines.
+ 
+ 
+    LOOP AT it_lines ASSIGNING <lv_line>.
+      ls_log = parse_line( iv_line = <lv_line>
+                           iv_current_version = iv_current_version ).
+ 
+      " Skip until first version head and Skip empty lines
+      CHECK ls_log IS NOT INITIAL AND
+            ( lv_first_version_found = abap_true OR ls_log-version IS NOT INITIAL ).
+ 
+      IF lv_first_version_found = abap_false.
+        lv_first_version_found = abap_true.
+        IF zcl_abapgit_version=>compare( iv_a = ls_log-version
+                                         iv_b = iv_current_version ) <= 0.
+          lv_tail = c_tail_length. " Display some last versions if no updates
+        ENDIF.
+      ENDIF.
+ 
+      IF ls_log-is_header = abap_true.
+        "Skip everything below current version or show tail news
+        IF zcl_abapgit_version=>compare( iv_a = ls_log-version
+                                         iv_b = iv_current_version ) <= 0.
+          IF lv_tail > 0.
+            lv_tail = lv_tail - 1.
+          ELSE.
+            EXIT.
+          ENDIF.
+        ENDIF.
+        lv_version = ls_log-version. " Save to fill news lines
+      ELSE.
+        ls_log-version = lv_version.
+      ENDIF.
+ 
+      APPEND ls_log TO rt_log.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line.
+ 
+    CONSTANTS: lc_header_pattern TYPE string
+        VALUE ''^\\d{4}-\\d{2}-\\d{2}\\s+v(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\s*$''.
+ 
+    DATA: lv_version TYPE string.
+ 
+    IF iv_line IS INITIAL OR iv_line CO '' -=''.
+      RETURN. " Skip empty and markup lines
+    ENDIF.
+ 
+    " Check if line is a header line
+    FIND FIRST OCCURRENCE OF REGEX lc_header_pattern IN iv_line SUBMATCHES lv_version.
+    IF sy-subrc IS INITIAL.
+      lv_version        = zcl_abapgit_version=>normalize( lv_version ).
+      rs_log-version    = lv_version.
+      rs_log-is_header  = abap_true.
+      rs_log-pos_to_cur = zcl_abapgit_version=>compare( iv_a = lv_version
+                                                        iv_b = iv_current_version ).
+    ELSE.
+      FIND FIRST OCCURRENCE OF REGEX ''^\\s*!'' IN iv_line.
+      rs_log-is_important = boolc( sy-subrc IS INITIAL ). " Change is important
+    ENDIF.
+ 
+    rs_log-text = iv_line.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_PATH                        ', 'CLASS zcl_abapgit_path DEFINITION
+  PUBLIC FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS split_file_location
+      IMPORTING iv_fullpath TYPE string
+      EXPORTING ev_path     TYPE string
+                ev_filename TYPE string.
+ 
+    CLASS-METHODS is_root
+      IMPORTING iv_path       TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    CLASS-METHODS is_subdir
+      IMPORTING iv_path       TYPE string
+                iv_parent     TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    CLASS-METHODS change_dir
+      IMPORTING iv_cur_dir     TYPE string
+                iv_cd          TYPE string
+      RETURNING VALUE(rv_path) TYPE string.
+ 
+    CLASS-METHODS get_filename_from_syspath
+      IMPORTING iv_path            TYPE string
+      RETURNING VALUE(rv_filename) TYPE string.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PATH IMPLEMENTATION.
+ 
+ 
+  METHOD change_dir.
+ 
+    DATA: lv_last TYPE i,
+          lv_temp TYPE string.
+ 
+    lv_last = strlen( iv_cur_dir ) - 1.
+ 
+    IF iv_cd = '''' OR iv_cd = ''.''. " No change
+      rv_path = iv_cur_dir.
+    ELSEIF iv_cd+0(1) = ''/''.      " Absolute path
+      rv_path = iv_cd.
+    ELSEIF iv_cd = ''..''.          " CD back
+      IF iv_cur_dir = ''/'' OR iv_cur_dir = ''''. " Back from root = root
+        rv_path = iv_cur_dir.
+      ELSE.
+        lv_temp = reverse( iv_cur_dir ).
+        IF lv_temp+0(1) = ''/''.
+          SHIFT lv_temp BY 1 PLACES LEFT.
+        ENDIF.
+        SHIFT lv_temp UP TO ''/'' LEFT.
+        rv_path = reverse( lv_temp ).
+      ENDIF.
+    ELSEIF iv_cur_dir+lv_last(1) = ''/''.  " Append cd to cur_dir separated by /
+      rv_path = iv_cur_dir && iv_cd.
+    ELSE.
+      rv_path = iv_cur_dir && ''/'' && iv_cd.
+    ENDIF.
+ 
+    " TODO: improve logic and cases
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_filename_from_syspath.
+ 
+    DATA: lv_split TYPE c LENGTH 1,
+          lv_index TYPE i,
+          lt_split TYPE TABLE OF string.
+ 
+    " filename | c:\\filename | /dir/filename | \\\\server\\filename
+    IF iv_path CA ''/''.
+      lv_split = ''/''.
+    ELSE.
+      lv_split = ''\\''.
+    ENDIF.
+ 
+    SPLIT iv_path AT lv_split INTO TABLE lt_split.
+ 
+    lv_index = lines( lt_split ).
+ 
+    READ TABLE lt_split INDEX lv_index INTO rv_filename.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_root.
+    rv_yes = boolc( iv_path = ''/'' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_subdir.
+ 
+    DATA lv_len  TYPE i.
+    DATA lv_last TYPE i.
+ 
+    lv_len  = strlen( iv_parent ).
+    lv_last = lv_len - 1.
+    rv_yes  = boolc( strlen( iv_path ) > lv_len
+                 AND iv_path+0(lv_len) = iv_parent
+                 AND ( iv_parent+lv_last(1) = ''/'' OR iv_path+lv_len(1) = ''/'' ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_file_location.
+ 
+    DATA: lv_cnt TYPE i,
+          lv_len TYPE i.
+ 
+    FIND FIRST OCCURRENCE OF REGEX ''^/(.*/)?'' IN iv_fullpath
+      MATCH COUNT lv_cnt
+      MATCH LENGTH lv_len.
+ 
+    IF lv_cnt > 0.
+      ev_path     = iv_fullpath+0(lv_len).
+      ev_filename = iv_fullpath+lv_len.
+    ELSE.
+      CLEAR ev_path.
+      ev_filename = iv_fullpath.
+    ENDIF.
+ 
+    ev_filename = cl_http_utility=>unescape_url( escaped = ev_filename ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REPO_LABELS                 ', 'CLASS zcl_abapgit_repo_labels DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_label_color,
+        label TYPE string,
+        color TYPE string,
+      END OF ty_label_color,
+      ty_label_colors TYPE STANDARD TABLE OF ty_label_color WITH KEY label.
+ 
+    TYPES:
+      BEGIN OF ty_color,
+        cls TYPE string,
+        fg TYPE string,
+        bg TYPE string,
+      END OF ty_color.
+ 
+    CONSTANTS c_allowed_chars TYPE string VALUE \`-_. a-zA-Z0-9\` ##NO_TEXT.
+ 
+    " it is easier to allow chars, though potentially other chars can be added later if needed
+    CLASS-METHODS class_constructor.
+    CLASS-METHODS validate
+      IMPORTING
+        !iv_labels TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS split
+      IMPORTING
+        !iv_labels TYPE string
+      RETURNING
+        VALUE(rt_labels) TYPE string_table.
+    CLASS-METHODS normalize
+      IMPORTING
+        !iv_labels TYPE string
+      RETURNING
+        VALUE(rv_labels) TYPE string.
+ 
+    CLASS-METHODS validate_colors
+      IMPORTING
+        !iv_config TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS split_colors
+      IMPORTING
+        !iv_config TYPE string
+      RETURNING
+        VALUE(rt_label_colors) TYPE ty_label_colors.
+    CLASS-METHODS split_colors_into_map
+      IMPORTING
+        !iv_config TYPE string
+      RETURNING
+        VALUE(ro_map) TYPE REF TO zcl_abapgit_string_map.
+    CLASS-METHODS normalize_colors
+      IMPORTING
+        !iv_config TYPE string
+      RETURNING
+        VALUE(rv_config) TYPE string.
+ 
+    CLASS-METHODS parse_color
+      IMPORTING
+        iv_color TYPE string
+      RETURNING
+        VALUE(rs_parsed) TYPE ty_color.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CLASS-DATA gv_regex TYPE string.
+ 
+    CLASS-METHODS validate_one_label_color
+      IMPORTING
+        !is_lc TYPE ty_label_color
+        !iv_index TYPE i DEFAULT 0
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS validate_rgb_color
+      IMPORTING
+        !iv_color TYPE string
+        !iv_index TYPE i DEFAULT 0
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REPO_LABELS IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+    gv_regex = |^[{ c_allowed_chars }]*$|. " Must start with -
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize.
+ 
+    DATA lt_labels TYPE string_table.
+    DATA lt_normalized TYPE string_table.
+    FIELD-SYMBOLS <lv_lab> LIKE LINE OF lt_labels.
+ 
+    lt_labels = split( iv_labels ).
+ 
+    LOOP AT lt_labels ASSIGNING <lv_lab>.
+      FIND REGEX gv_regex IN <lv_lab>.
+      IF sy-subrc = 0.
+        APPEND <lv_lab> TO lt_normalized.
+      ENDIF.
+    ENDLOOP.
+ 
+    SORT lt_normalized.
+    DELETE ADJACENT DUPLICATES FROM lt_normalized.
+ 
+    rv_labels = concat_lines_of(
+      table = lt_normalized
+      sep = \`, \` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_colors.
+ 
+    DATA lt_colors TYPE ty_label_colors.
+    DATA lt_normalized TYPE ty_label_colors.
+    DATA lt_pairs TYPE string_table.
+    DATA lv_pair TYPE string.
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF lt_colors.
+ 
+    lt_colors = split_colors( iv_config ).
+ 
+    LOOP AT lt_colors ASSIGNING <ls_c>.
+      TRY.
+          validate_one_label_color( <ls_c> ).
+          APPEND <ls_c> TO lt_normalized.
+        CATCH zcx_abapgit_exception.
+      ENDTRY.
+    ENDLOOP.
+ 
+    SORT lt_normalized BY label.
+    DELETE ADJACENT DUPLICATES FROM lt_normalized COMPARING label.
+ 
+    LOOP AT lt_normalized ASSIGNING <ls_c>.
+      lv_pair = <ls_c>-label && \`:\` && <ls_c>-color.
+      APPEND lv_pair TO lt_pairs.
+    ENDLOOP.
+ 
+    rv_config = concat_lines_of(
+      table = lt_pairs
+      sep = \`, \` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_color.
+ 
+    DATA lv_tmp TYPE string.
+ 
+    IF iv_color IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_color+0(1) = ''#''.
+      lv_tmp  = iv_color+1.
+      SPLIT lv_tmp AT ''/'' INTO rs_parsed-fg rs_parsed-bg.
+    ELSE.
+      rs_parsed-cls = iv_color.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split.
+ 
+    FIELD-SYMBOLS <lv_lab> LIKE LINE OF rt_labels.
+ 
+    SPLIT iv_labels AT '','' INTO TABLE rt_labels.
+    LOOP AT rt_labels ASSIGNING <lv_lab>.
+      CONDENSE <lv_lab>.
+    ENDLOOP.
+    DELETE rt_labels WHERE table_line IS INITIAL.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_colors.
+ 
+    DATA lt_pairs TYPE string_table.
+    DATA lv_clean_config LIKE iv_config.
+    DATA ls_c LIKE LINE OF rt_label_colors.
+    FIELD-SYMBOLS <lv_pair> LIKE LINE OF lt_pairs.
+ 
+    lv_clean_config = replace(
+      val = iv_config
+      sub = cl_abap_char_utilities=>newline
+      with = \` \` ). " text area ends with LF
+ 
+    SPLIT lv_clean_config AT '','' INTO TABLE lt_pairs.
+    LOOP AT lt_pairs ASSIGNING <lv_pair>.
+      CONDENSE <lv_pair>.
+      IF <lv_pair> IS NOT INITIAL.
+        SPLIT <lv_pair> AT '':'' INTO ls_c-label ls_c-color.
+        CONDENSE ls_c-label.
+        CONDENSE ls_c-color.
+        APPEND ls_c TO rt_label_colors.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_colors_into_map.
+ 
+    DATA lt_colors TYPE ty_label_colors.
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF lt_colors.
+ 
+    lt_colors = split_colors( iv_config ).
+ 
+    ro_map = zcl_abapgit_string_map=>create( ).
+    LOOP AT lt_colors ASSIGNING <ls_c>.
+      TRY.
+          ro_map->set(
+            iv_key = <ls_c>-label
+            iv_val = <ls_c>-color ).
+        CATCH zcx_abapgit_exception.
+      ENDTRY.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate.
+ 
+    DATA lt_labels TYPE string_table.
+    FIELD-SYMBOLS <lv_lab> LIKE LINE OF lt_labels.
+ 
+    lt_labels = split( iv_labels ).
+ 
+    LOOP AT lt_labels ASSIGNING <lv_lab>.
+      FIND REGEX gv_regex IN <lv_lab>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Disallowed chars in label #{ sy-tabix }| ).
+      ENDIF.
+      " TODO: maybe also limit length ?
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_colors.
+ 
+    DATA lt_colors TYPE ty_label_colors.
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF lt_colors.
+ 
+    lt_colors = split_colors( iv_config ).
+ 
+    LOOP AT lt_colors ASSIGNING <ls_c>.
+      validate_one_label_color(
+        is_lc    = <ls_c>
+        iv_index = sy-tabix ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_one_label_color.
+ 
+    DATA ls_parsed_color TYPE ty_color.
+ 
+    IF is_lc-label IS INITIAL.
+      zcx_abapgit_exception=>raise( |Label is empty in pair #{ iv_index }| ).
+    ENDIF.
+ 
+    IF is_lc-color IS INITIAL.
+      zcx_abapgit_exception=>raise( |Color is empty in pair #{ iv_index }| ).
+    ENDIF.
+ 
+    FIND REGEX gv_regex IN is_lc-label.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Disallowed chars in label in pair #{ iv_index }| ).
+    ENDIF.
+ 
+    ls_parsed_color = parse_color( is_lc-color ).
+    IF ls_parsed_color-cls IS NOT INITIAL.
+      FIND REGEX ''^[-_A-Za-z]+$'' IN ls_parsed_color-cls.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Disallowed chars in color in pair #{ iv_index }| ).
+      ENDIF.
+    ENDIF.
+    IF ls_parsed_color-fg IS NOT INITIAL.
+      validate_rgb_color( ls_parsed_color-fg ).
+    ENDIF.
+    IF ls_parsed_color-bg IS NOT INITIAL.
+      validate_rgb_color( ls_parsed_color-bg ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_rgb_color.
+ 
+    DATA lv_len TYPE i.
+ 
+    IF iv_color IS NOT INITIAL.
+      FIND REGEX ''^[0-9A-Fa-f]+$'' IN iv_color.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Disallowed chars in color in pair #{ iv_index }| ).
+      ENDIF.
+      lv_len = strlen( iv_color ).
+      IF NOT ( lv_len = 3 OR lv_len = 6 ).
+        zcx_abapgit_exception=>raise( |Icorrect color in pair #{ iv_index }| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_REQUIREMENT_HELPER          ', 'CLASS zcl_abapgit_requirement_helper DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS requirements_popup
+      IMPORTING
+        !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_requirements_met
+      IMPORTING
+        !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt
+      RETURNING
+        VALUE(rv_status) TYPE zif_abapgit_definitions=>ty_yes_no
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_requirement_status,
+        met               TYPE abap_bool,
+        component         TYPE tdevc-dlvunit,
+        description       TYPE string,
+        installed_release TYPE saprelease,
+        installed_patch   TYPE sappatchlv,
+        required_release  TYPE saprelease,
+        required_patch    TYPE sappatchlv,
+      END OF ty_requirement_status .
+    TYPES:
+      ty_requirement_status_tt TYPE STANDARD TABLE OF ty_requirement_status WITH DEFAULT KEY .
+ 
+    CLASS-METHODS show_requirement_popup
+      IMPORTING
+        !it_requirements TYPE ty_requirement_status_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_requirement_met_status
+      IMPORTING
+        !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt
+      RETURNING
+        VALUE(rt_status) TYPE ty_requirement_status_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_version_greater_or_equal
+      IMPORTING
+        !is_status     TYPE ty_requirement_status
+      RETURNING
+        VALUE(rv_true) TYPE abap_bool .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REQUIREMENT_HELPER IMPLEMENTATION.
+ 
+ 
+  METHOD get_requirement_met_status.
+ 
+    DATA: lt_installed TYPE STANDARD TABLE OF cvers_sdu.
+ 
+    FIELD-SYMBOLS: <ls_requirement>    TYPE zif_abapgit_dot_abapgit=>ty_requirement,
+                   <ls_status>         TYPE ty_requirement_status,
+                   <ls_installed_comp> TYPE cvers_sdu.
+ 
+ 
+    CALL FUNCTION ''DELIVERY_GET_INSTALLED_COMPS''
+      TABLES
+        tt_comptab       = lt_installed
+      EXCEPTIONS
+        no_release_found = 1
+        OTHERS           = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error from DELIVERY_GET_INSTALLED_COMPS { sy-subrc }| ).
+    ENDIF.
+ 
+    LOOP AT it_requirements ASSIGNING <ls_requirement>.
+      APPEND INITIAL LINE TO rt_status ASSIGNING <ls_status>.
+      <ls_status>-component = <ls_requirement>-component.
+      <ls_status>-required_release = <ls_requirement>-min_release.
+      <ls_status>-required_patch = <ls_requirement>-min_patch.
+ 
+      READ TABLE lt_installed WITH KEY component = <ls_requirement>-component
+                              ASSIGNING <ls_installed_comp>.
+      IF sy-subrc = 0.
+        " Component is installed, requirement is met if the installed version is greater or equal
+        " to the required one.
+        <ls_status>-installed_release = <ls_installed_comp>-release.
+        <ls_status>-installed_patch = <ls_installed_comp>-extrelease.
+        <ls_status>-description = <ls_installed_comp>-desc_text.
+        <ls_status>-met = is_version_greater_or_equal( <ls_status> ).
+      ELSE.
+        " Component is not installed at all
+        <ls_status>-met = abap_false.
+      ENDIF.
+ 
+      UNASSIGN <ls_installed_comp>.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_requirements_met.
+ 
+    DATA: lt_met_status TYPE ty_requirement_status_tt.
+ 
+    lt_met_status = get_requirement_met_status( it_requirements ).
+ 
+    READ TABLE lt_met_status TRANSPORTING NO FIELDS WITH KEY met = abap_false.
+    IF sy-subrc = 0.
+      rv_status = zif_abapgit_definitions=>c_no.
+    ELSE.
+      rv_status = zif_abapgit_definitions=>c_yes.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_version_greater_or_equal.
+ 
+    DATA:
+      lv_installed_release TYPE n LENGTH 4,
+      lv_installed_patch   TYPE n LENGTH 4,
+      lv_required_release  TYPE n LENGTH 4,
+      lv_required_patch    TYPE n LENGTH 4.
+ 
+    TRY.
+        MOVE EXACT: is_status-installed_release TO lv_installed_release,
+                    is_status-installed_patch   TO lv_installed_patch,
+                    is_status-required_release  TO lv_required_release,
+                    is_status-required_patch    TO lv_required_patch.
+      CATCH cx_sy_conversion_error.
+        " Cannot compare by number, assume requirement not fullfilled (user can force install
+        " anyways if this was an error)
+        rv_true = abap_false.
+        RETURN.
+    ENDTRY.
+ 
+    " Versions are comparable by number, compare release and if necessary patch level
+    IF lv_installed_release > lv_required_release
+        OR ( lv_installed_release = lv_required_release
+         AND ( lv_required_patch = 0
+            OR lv_installed_patch >= lv_required_patch ) ).
+ 
+      rv_true = abap_true.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD requirements_popup.
+ 
+    DATA: lt_met_status TYPE ty_requirement_status_tt,
+          lv_answer     TYPE c LENGTH 1.
+ 
+ 
+    lt_met_status = get_requirement_met_status( it_requirements ).
+ 
+    show_requirement_popup( lt_met_status ).
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar      = ''Warning''
+      iv_text_question = ''The project has unmet requirements. Do you want to continue?'' ).
+ 
+    IF lv_answer <> ''1''.
+      zcx_abapgit_exception=>raise( ''Cancelling because of unmet requirements.'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD show_requirement_popup.
+ 
+    TYPES: BEGIN OF ty_color_line,
+             color TYPE lvc_t_scol.
+             INCLUDE TYPE ty_requirement_status.
+    TYPES: END OF ty_color_line.
+ 
+    TYPES: ty_color_tab TYPE STANDARD TABLE OF ty_color_line WITH DEFAULT KEY.
+ 
+    DATA: lo_alv            TYPE REF TO cl_salv_table,
+          lo_column         TYPE REF TO cl_salv_column,
+          lo_columns        TYPE REF TO cl_salv_columns_table,
+          lt_color_table    TYPE ty_color_tab,
+          lt_color_negative TYPE lvc_t_scol,
+          lt_color_positive TYPE lvc_t_scol,
+          ls_color          TYPE lvc_s_scol,
+          ls_position       TYPE zif_abapgit_popups=>ty_popup_position,
+          lx_ex             TYPE REF TO cx_root.
+ 
+    FIELD-SYMBOLS: <ls_line>        TYPE ty_color_line,
+                   <ls_requirement> LIKE LINE OF it_requirements.
+ 
+ 
+    ls_color-color-col = col_negative.
+    APPEND ls_color TO lt_color_negative.
+ 
+    ls_color-color-col = col_positive.
+    APPEND ls_color TO lt_color_positive.
+ 
+    CLEAR ls_color.
+ 
+    LOOP AT it_requirements ASSIGNING <ls_requirement>.
+      APPEND INITIAL LINE TO lt_color_table ASSIGNING <ls_line>.
+      MOVE-CORRESPONDING <ls_requirement> TO <ls_line>.
+    ENDLOOP.
+ 
+    LOOP AT lt_color_table ASSIGNING <ls_line>.
+      IF <ls_line>-met = abap_false.
+        <ls_line>-color = lt_color_negative.
+      ELSE.
+        <ls_line>-color = lt_color_positive.
+      ENDIF.
+    ENDLOOP.
+    UNASSIGN <ls_line>.
+ 
+    TRY.
+        cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
+                                CHANGING t_table       = lt_color_table ).
+ 
+        lo_columns = lo_alv->get_columns( ).
+        lo_columns->get_column( ''MET'' )->set_short_text( ''Met'' ).
+        lo_columns->set_color_column( ''COLOR'' ).
+        lo_columns->set_optimize( ).
+ 
+        lo_column = lo_columns->get_column( ''REQUIRED_RELEASE'' ).
+        lo_column->set_short_text( ''Req. Rel.'' ).
+ 
+        lo_column = lo_columns->get_column( ''REQUIRED_PATCH'' ).
+        lo_column->set_short_text( ''Req. SP L.'' ).
+ 
+        ls_position = zcl_abapgit_popups=>center(
+          iv_width  = 70
+          iv_height = 10 ).
+ 
+        lo_alv->set_screen_popup( start_column = ls_position-start_column
+                                  end_column   = ls_position-end_column
+                                  start_line   = ls_position-start_row
+                                  end_line     = ls_position-end_row ).
+ 
+        lo_alv->get_display_settings( )->set_list_header( ''Requirements'' ).
+        lo_alv->display( ).
+ 
+      CATCH cx_salv_msg cx_salv_not_found cx_salv_data_error INTO lx_ex.
+        zcx_abapgit_exception=>raise( lx_ex->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_STRING_BUFFER               ', 'CLASS zcl_abapgit_string_buffer DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS new
+      RETURNING
+        VALUE(ro_me) TYPE REF TO zcl_abapgit_string_buffer.
+    METHODS add
+      IMPORTING
+        !iv_str      TYPE string
+      RETURNING
+        VALUE(ro_me) TYPE REF TO zcl_abapgit_string_buffer.
+    METHODS join_and_flush
+      RETURNING
+        VALUE(rv_str) TYPE string.
+    METHODS join_w_newline_and_flush
+      RETURNING
+        VALUE(rv_str) TYPE string.
+    METHODS join_w_space_and_flush
+      RETURNING
+        VALUE(rv_str) TYPE string.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mt_buffer TYPE string_table.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_STRING_BUFFER IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+    APPEND iv_str TO mt_buffer.
+    ro_me = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD join_and_flush.
+    rv_str = concat_lines_of( table = mt_buffer ).
+    CLEAR mt_buffer.
+  ENDMETHOD.
+ 
+ 
+  METHOD join_w_newline_and_flush.
+    rv_str = concat_lines_of(
+      table = mt_buffer
+      sep   = cl_abap_char_utilities=>newline ).
+    CLEAR mt_buffer.
+  ENDMETHOD.
+ 
+ 
+  METHOD join_w_space_and_flush.
+    rv_str = concat_lines_of(
+      table = mt_buffer
+      sep   = \` \` ).
+    CLEAR mt_buffer.
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_me.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_STRING_MAP                  ', 'CLASS zcl_abapgit_string_map DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_entry,
+        k TYPE string,
+        v TYPE string,
+      END OF ty_entry .
+    TYPES:
+      ty_entries TYPE SORTED TABLE OF ty_entry WITH UNIQUE KEY k .
+ 
+    DATA mt_entries TYPE ty_entries READ-ONLY .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_case_insensitive TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance)   TYPE REF TO zcl_abapgit_string_map .
+    METHODS constructor
+      IMPORTING
+        !iv_case_insensitive TYPE abap_bool DEFAULT abap_false .
+    METHODS get
+      IMPORTING
+        !iv_key       TYPE string
+      RETURNING
+        VALUE(rv_val) TYPE string .
+    METHODS has
+      IMPORTING
+        !iv_key       TYPE string
+      RETURNING
+        VALUE(rv_has) TYPE abap_bool .
+    METHODS set
+      IMPORTING
+        !iv_key       TYPE string
+        !iv_val       TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_map) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS size
+      RETURNING
+        VALUE(rv_size) TYPE i .
+    METHODS is_empty
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS delete
+      IMPORTING
+        !iv_key TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS clear
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_abap
+      CHANGING
+        !cs_container TYPE any
+      RAISING
+        zcx_abapgit_exception .
+    METHODS strict
+      IMPORTING
+        !iv_strict         TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map .
+    METHODS freeze .
+    METHODS merge
+      IMPORTING
+        !io_string_map TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mv_read_only TYPE abap_bool.
+    DATA mv_is_strict TYPE abap_bool.
+    DATA mv_case_insensitive TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
+ 
+ 
+  METHOD clear.
+    IF mv_read_only = abap_true.
+      zcx_abapgit_exception=>raise( ''Cannot clear. This string map is immutable'' ).
+    ENDIF.
+    CLEAR mt_entries.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_is_strict = abap_true.
+    mv_case_insensitive = iv_case_insensitive.
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_case_insensitive = iv_case_insensitive.
+  ENDMETHOD.
+ 
+ 
+  METHOD delete.
+ 
+    IF mv_read_only = abap_true.
+      zcx_abapgit_exception=>raise( ''Cannot delete. This string map is immutable'' ).
+    ENDIF.
+ 
+    DELETE mt_entries WHERE k = iv_key.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD freeze.
+    mv_read_only = abap_true.
+  ENDMETHOD.
+ 
+ 
+  METHOD get.
+ 
+    DATA lv_key LIKE iv_key.
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
+ 
+    IF mv_case_insensitive = abap_true.
+      lv_key = to_upper( iv_key ).
+    ELSE.
+      lv_key = iv_key.
+    ENDIF.
+ 
+    READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = lv_key.
+    IF sy-subrc IS INITIAL.
+      rv_val = <ls_entry>-v.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD has.
+ 
+    READ TABLE mt_entries TRANSPORTING NO FIELDS WITH KEY k = iv_key.
+    rv_has = boolc( sy-subrc IS INITIAL ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_empty.
+    rv_yes = boolc( lines( mt_entries ) = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD merge.
+ 
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
+ 
+    LOOP AT io_string_map->mt_entries ASSIGNING <ls_entry>.
+      set(
+        iv_key = <ls_entry>-k
+        iv_val = <ls_entry>-v ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set.
+ 
+    DATA lv_key LIKE iv_key.
+    DATA ls_entry LIKE LINE OF mt_entries.
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
+ 
+    IF mv_read_only = abap_true.
+      zcx_abapgit_exception=>raise( ''Cannot set. This string map is immutable'' ).
+    ENDIF.
+ 
+    IF mv_case_insensitive = abap_true.
+      lv_key = to_upper( iv_key ).
+    ELSE.
+      lv_key = iv_key.
+    ENDIF.
+ 
+    READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = lv_key.
+    IF sy-subrc IS INITIAL.
+      <ls_entry>-v = iv_val.
+    ELSE.
+      ls_entry-k = lv_key.
+      ls_entry-v = iv_val.
+      INSERT ls_entry INTO TABLE mt_entries.
+    ENDIF.
+ 
+    ro_map = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD size.
+ 
+    rv_size = lines( mt_entries ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD strict.
+    mv_is_strict = iv_strict.
+    ro_instance = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD to_abap.
+ 
+    DATA lo_type TYPE REF TO cl_abap_typedescr.
+    DATA lv_field TYPE string.
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
+    FIELD-SYMBOLS <lv_val> TYPE any.
+ 
+    lo_type = cl_abap_typedescr=>describe_by_data( cs_container ).
+    IF lo_type->type_kind <> cl_abap_typedescr=>typekind_struct1
+      AND lo_type->type_kind <> cl_abap_typedescr=>typekind_struct2.
+      zcx_abapgit_exception=>raise( ''Only structures supported'' ).
+    ENDIF.
+ 
+    LOOP AT mt_entries ASSIGNING <ls_entry>.
+      lv_field = to_upper( <ls_entry>-k ).
+      ASSIGN COMPONENT lv_field OF STRUCTURE cs_container TO <lv_val>.
+      IF sy-subrc = 0.
+        " TODO check target type ?
+        <lv_val> = <ls_entry>-v.
+      ELSEIF mv_is_strict = abap_false.
+        CONTINUE.
+      ELSE.
+        zcx_abapgit_exception=>raise( |Component { lv_field } not found in target| ).
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_TIMER                       ', 'CLASS zcl_abapgit_timer DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_text        TYPE string OPTIONAL
+        !iv_count       TYPE i OPTIONAL
+          PREFERRED PARAMETER iv_text
+      RETURNING
+        VALUE(ro_timer) TYPE REF TO zcl_abapgit_timer.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_text  TYPE string OPTIONAL
+        !iv_count TYPE i OPTIONAL.
+ 
+    METHODS start
+      RETURNING
+        VALUE(ro_timer) TYPE REF TO zcl_abapgit_timer.
+ 
+    METHODS end
+      IMPORTING
+        !iv_output_as_status_message TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_result)             TYPE string.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mv_text TYPE string.
+    DATA mv_count TYPE i.
+    DATA mv_timer TYPE timestampl.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_timer IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mv_text  = iv_text.
+    mv_count = iv_count.
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_timer
+      EXPORTING
+        iv_text  = iv_text
+        iv_count = iv_count.
+  ENDMETHOD.
+ 
+ 
+  METHOD end.
+ 
+    DATA:
+      lv_timestamp TYPE timestampl,
+      lv_runtime   TYPE timestampl,
+      lv_sec       TYPE p LENGTH 11 DECIMALS 2.
+ 
+    IF mv_timer IS INITIAL.
+      rv_result = ''Runtime measurement has not been started''.
+    ELSE.
+      GET TIME STAMP FIELD lv_timestamp.
+ 
+      TRY.
+          lv_runtime = cl_abap_tstmp=>subtract(
+            tstmp1 = lv_timestamp
+            tstmp2 = mv_timer ).
+ 
+          lv_sec = lv_runtime. " round to 2 decimal places
+ 
+          IF mv_count = 1.
+            rv_result = |1 object, |.
+          ELSEIF mv_count > 1.
+            rv_result = |{ mv_count } objects, |.
+          ENDIF.
+ 
+          rv_result = rv_result && |{ lv_sec } seconds|.
+ 
+        CATCH cx_parameter_invalid.
+          rv_result = ''Error getting runtime measurement''.
+      ENDTRY.
+    ENDIF.
+ 
+    IF iv_output_as_status_message = abap_true.
+      MESSAGE s000(oo) WITH mv_text rv_result.
+    ENDIF.
+ 
+    IF mv_text IS NOT INITIAL.
+      rv_result = |{ mv_text } { rv_result }|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD start.
+    GET TIME STAMP FIELD mv_timer.
+    ro_timer = me.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_USER_RECORD                 ', 'CLASS zcl_abapgit_user_record DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS reset.
+    CLASS-METHODS get_instance
+      IMPORTING
+        !iv_user       TYPE sy-uname
+      RETURNING
+        VALUE(ro_user) TYPE REF TO zcl_abapgit_user_record.
+    METHODS constructor
+      IMPORTING
+        !iv_user TYPE sy-uname.
+    METHODS get_name
+      RETURNING
+        VALUE(rv_name) TYPE zif_abapgit_git_definitions=>ty_git_user-name.
+    METHODS get_email
+      RETURNING
+        VALUE(rv_email) TYPE zif_abapgit_git_definitions=>ty_git_user-email.
+    CLASS-METHODS get_title
+      IMPORTING
+        iv_username     TYPE sy-uname
+      RETURNING
+        VALUE(rv_title) TYPE string.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_user,
+        user   TYPE sy-uname,
+        o_user TYPE REF TO zcl_abapgit_user_record,
+      END OF ty_user.
+ 
+    TYPES:
+      ty_smtp TYPE STANDARD TABLE OF bapiadsmtp WITH DEFAULT KEY.
+ 
+    TYPES:
+      ty_dev_clients TYPE SORTED TABLE OF sy-mandt WITH UNIQUE KEY table_line.
+ 
+    CLASS-DATA:
+      gt_user TYPE HASHED TABLE OF ty_user
+                   WITH UNIQUE KEY user.
+ 
+    DATA:
+      ms_user TYPE zif_abapgit_git_definitions=>ty_git_user.
+ 
+    METHODS check_user_exists
+      IMPORTING
+        VALUE(iv_user)    TYPE sy-uname
+      EXPORTING
+        VALUE(es_address) TYPE bapiaddr3
+        VALUE(et_smtp)    TYPE ty_smtp
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_user_dtls_from_other_clnt
+      IMPORTING
+        iv_user TYPE sy-uname.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_user_record IMPLEMENTATION.
+ 
+ 
+  METHOD get_title.
+* the queried username might not exist, so this method is static
+ 
+    DATA ls_user_address TYPE addr3_val.
+ 
+    CALL FUNCTION ''SUSR_USER_ADDRESS_READ''
+      EXPORTING
+        user_name              = iv_username
+      IMPORTING
+        user_address           = ls_user_address
+      EXCEPTIONS
+        user_address_not_found = 1
+        OTHERS                 = 2.
+    IF sy-subrc = 0.
+      rv_title = ls_user_address-name_text.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD check_user_exists.
+ 
+    DATA lt_return TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY.
+ 
+    CALL FUNCTION ''BAPI_USER_GET_DETAIL''
+      EXPORTING
+        username = iv_user
+      IMPORTING
+        address  = es_address
+      TABLES
+        return_   = lt_return
+        addsmtp  = et_smtp.
+    LOOP AT lt_return TRANSPORTING NO FIELDS WHERE type CA ''EA''.
+      zcx_abapgit_exception=>raise( |User: { iv_user } not found| ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA:
+      ls_address   TYPE bapiaddr3,
+      lt_smtp      TYPE TABLE OF bapiadsmtp,
+      ls_smtp      TYPE bapiadsmtp,
+      ls_user      TYPE ty_user,
+      lo_exception TYPE REF TO zcx_abapgit_exception.
+ 
+    "Get user details
+    TRY.
+        check_user_exists(
+          EXPORTING
+            iv_user    = iv_user
+          IMPORTING
+            es_address = ls_address
+            et_smtp    = lt_smtp ).
+ 
+        " Choose the first email from SU01
+        SORT lt_smtp BY consnumber ASCENDING.
+ 
+        LOOP AT lt_smtp INTO ls_smtp.
+          ms_user-email = ls_smtp-e_mail.
+          EXIT.
+        ENDLOOP.
+ 
+        " Attempt to use the full name from SU01
+        ms_user-name = ls_address-fullname.
+      CATCH zcx_abapgit_exception INTO lo_exception.
+        "Could not find user,try to get from other clients
+        get_user_dtls_from_other_clnt( iv_user ).
+    ENDTRY.
+ 
+    " If the user has been found add it to the list
+    IF ms_user-name IS NOT INITIAL AND ms_user-email IS NOT INITIAL.
+      ls_user-user = iv_user.
+      ls_user-o_user = me.
+      INSERT ls_user INTO TABLE gt_user.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_email.
+ 
+    rv_email = ms_user-email.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    FIELD-SYMBOLS: <ls_user> TYPE ty_user.
+ 
+    READ TABLE gt_user ASSIGNING <ls_user> WITH TABLE KEY user = iv_user.
+    IF sy-subrc = 0.
+      ro_user = <ls_user>-o_user.
+    ELSE.
+      CREATE OBJECT ro_user
+        EXPORTING
+          iv_user = iv_user.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_name.
+ 
+    rv_name = ms_user-name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_user_dtls_from_other_clnt.
+ 
+    CONSTANTS lc_cc_category TYPE string VALUE ''C''.
+ 
+    DATA lt_dev_clients TYPE ty_dev_clients.
+ 
+    FIELD-SYMBOLS: <lv_dev_client> LIKE LINE OF lt_dev_clients.
+ 
+    " Could not find the user Try other development clients
+    SELECT mandt FROM t000 INTO TABLE lt_dev_clients
+        WHERE cccategory = lc_cc_category AND mandt <> sy-mandt
+        ORDER BY PRIMARY KEY.
+ 
+    LOOP AT lt_dev_clients ASSIGNING <lv_dev_client>.
+      SELECT SINGLE p~name_text a~smtp_addr INTO (ms_user-name,ms_user-email)
+          FROM usr21 AS u
+          INNER JOIN adrp AS p ON p~persnumber = u~persnumber
+                              AND p~client     = u~mandt
+          INNER JOIN adr6 AS a ON a~persnumber = u~persnumber
+                              AND a~addrnumber = u~addrnumber
+                              AND a~client     = u~mandt
+          CLIENT SPECIFIED
+          WHERE u~mandt      = <lv_dev_client>
+            AND u~bname      = iv_user
+            AND p~date_from <= sy-datum
+            AND p~date_to   >= sy-datum
+            AND a~date_from <= sy-datum.
+      IF sy-subrc = 0.
+        EXIT.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reset.
+    CLEAR gt_user.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_UTILS                       ', 'CLASS zcl_abapgit_utils DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS is_binary
+      IMPORTING
+        !iv_data            TYPE xstring
+      RETURNING
+        VALUE(rv_is_binary) TYPE abap_bool.
+    CLASS-METHODS is_valid_email
+      IMPORTING
+        iv_email        TYPE string
+      RETURNING
+        VALUE(rv_valid) TYPE abap_bool.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_utils IMPLEMENTATION.
+ 
+ 
+  METHOD is_binary.
+ 
+    " Previously we did a simple char range test described here
+    " stackoverflow.com/questions/277521/how-to-identify-the-file-content-as-ascii-or-binary
+    " but this is insufficient if the data contains german umlauts and other special characters.
+    " Therefore we adopted another algorithm, which is similarily used by AL11
+    " RSWATCH0 / GUESS_FILE_TYPE
+    " We count non-printable characters if there are more than XX% it''s binary.
+ 
+    CONSTANTS:
+      lc_binary_threshold TYPE i VALUE 10,
+      lc_bytes_to_check   TYPE i VALUE 1000.
+ 
+    DATA: lv_string_data           TYPE string,
+          lv_printable_chars_count TYPE i,
+          lv_percentage            TYPE i,
+          lv_data                  TYPE xstring,
+          lv_xlen                  TYPE i.
+ 
+    lv_xlen = xstrlen( iv_data ).
+    IF lv_xlen = 0.
+      RETURN.
+    ENDIF.
+ 
+    lv_xlen = nmin(
+                val1 = lv_xlen
+                val2 = lc_bytes_to_check ).
+ 
+    lv_data = iv_data(lv_xlen).
+ 
+    TRY.
+        lv_string_data = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+      CATCH zcx_abapgit_exception.
+        " Contains data that does not convert to UTF-8 so consider it binary
+        rv_is_binary = abap_true.
+        RETURN.
+    ENDTRY.
+ 
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN lv_string_data WITH space.
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_string_data WITH space.
+ 
+    FIND ALL OCCURRENCES OF REGEX ''[^[:print:]]'' IN lv_string_data MATCH COUNT lv_printable_chars_count.
+    lv_percentage = lv_printable_chars_count * 100 / strlen( lv_string_data ).
+    rv_is_binary = boolc( lv_percentage > lc_binary_threshold ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_valid_email.
+ 
+    " Email address validation (RFC 5322)
+    " https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s01.html
+    CONSTANTS lc_email_regex TYPE string VALUE
+      ''[\\w!#$%&*+/=?\`{|}~^-]+(?:\\.[\\w!#$%&*+/=?\`{|}~^-]+)*@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,6}''.
+ 
+    IF iv_email IS INITIAL.
+      rv_valid = abap_true.
+    ELSE.
+      FIND REGEX lc_email_regex IN iv_email.
+      rv_valid = boolc( sy-subrc = 0 ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_VERSION                     ', 'CLASS zcl_abapgit_version DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS normalize
+      IMPORTING
+        !iv_version       TYPE string
+      RETURNING
+        VALUE(rv_version) TYPE string .
+    CLASS-METHODS conv_str_to_version
+      IMPORTING
+        !iv_version       TYPE csequence
+      RETURNING
+        VALUE(rs_version) TYPE zif_abapgit_definitions=>ty_version
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS check_dependant_version
+      IMPORTING
+        !is_current   TYPE zif_abapgit_definitions=>ty_version
+        !is_dependant TYPE zif_abapgit_definitions=>ty_version
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS compare
+      IMPORTING
+        !iv_a            TYPE string OPTIONAL
+        !iv_b            TYPE string OPTIONAL
+        !is_a            TYPE zif_abapgit_definitions=>ty_version OPTIONAL
+        !is_b            TYPE zif_abapgit_definitions=>ty_version OPTIONAL
+      RETURNING
+        VALUE(rv_result) TYPE i .
+    CLASS-METHODS get_version_constant_value
+      IMPORTING
+        iv_version_constant TYPE string
+      RETURNING
+        VALUE(rv_version)   TYPE string
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS version_to_numeric
+      IMPORTING
+        !iv_version       TYPE string
+      RETURNING
+        VALUE(rv_version) TYPE i.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_version IMPLEMENTATION.
+ 
+ 
+  METHOD check_dependant_version.
+ 
+    CONSTANTS: lc_message TYPE string VALUE ''Current version is older than required''.
+ 
+    IF is_dependant-major > is_current-major.
+      zcx_abapgit_exception=>raise( lc_message ).
+    ELSEIF is_dependant-major < is_current-major.
+      RETURN.
+    ENDIF.
+ 
+    IF is_dependant-minor > is_current-minor.
+      zcx_abapgit_exception=>raise( lc_message ).
+    ELSEIF is_dependant-minor < is_current-minor.
+      RETURN.
+    ENDIF.
+ 
+    IF is_dependant-patch > is_current-patch.
+      zcx_abapgit_exception=>raise( lc_message ).
+    ELSEIF is_dependant-patch < is_current-patch.
+      RETURN.
+    ENDIF.
+ 
+    IF is_current-prerelase IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    CASE is_current-prerelase.
+      WHEN ''rc''.
+        IF is_dependant-prerelase = ''''.
+          zcx_abapgit_exception=>raise( lc_message ).
+        ENDIF.
+ 
+      WHEN ''beta''.
+        IF is_dependant-prerelase = '''' OR is_dependant-prerelase = ''rc''.
+          zcx_abapgit_exception=>raise( lc_message ).
+        ENDIF.
+ 
+      WHEN ''alpha''.
+        IF is_dependant-prerelase = '''' OR is_dependant-prerelase = ''rc'' OR is_dependant-prerelase = ''beta''.
+          zcx_abapgit_exception=>raise( lc_message ).
+        ENDIF.
+ 
+    ENDCASE.
+ 
+    IF is_dependant-prerelase = is_current-prerelase AND is_dependant-prerelase_patch > is_current-prerelase_patch.
+      zcx_abapgit_exception=>raise( lc_message ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD compare.
+ 
+    DATA: ls_version_a TYPE zif_abapgit_definitions=>ty_version,
+          ls_version_b TYPE zif_abapgit_definitions=>ty_version.
+ 
+    TRY.
+        IF is_a IS NOT INITIAL.
+          ls_version_a = is_a.
+        ELSE.
+          ls_version_a = conv_str_to_version( iv_a ).
+        ENDIF.
+ 
+        IF is_b IS NOT INITIAL.
+          ls_version_b = is_b.
+        ELSE.
+          ls_version_b = conv_str_to_version( iv_b ).
+        ENDIF.
+      CATCH zcx_abapgit_exception.
+        rv_result = 0.
+        RETURN.
+    ENDTRY.
+ 
+    IF ls_version_a = ls_version_b.
+      rv_result = 0.
+    ELSE.
+      TRY.
+          check_dependant_version( is_current   = ls_version_a
+                                   is_dependant = ls_version_b ).
+          rv_result = 1.
+        CATCH zcx_abapgit_exception.
+          rv_result = -1.
+          RETURN.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD conv_str_to_version.
+ 
+    DATA: lt_segments TYPE STANDARD TABLE OF string,
+          lt_parts    TYPE STANDARD TABLE OF string,
+          lv_segment  TYPE string.
+ 
+    SPLIT iv_version AT ''-'' INTO TABLE lt_segments.
+ 
+    READ TABLE lt_segments INTO lv_segment INDEX 1. " Version
+    IF sy-subrc <> 0.   " No version
+      RETURN.
+    ENDIF.
+ 
+    SPLIT lv_segment AT ''.'' INTO TABLE lt_parts.
+ 
+    LOOP AT lt_parts INTO lv_segment.
+ 
+      TRY.
+          CASE sy-tabix.
+            WHEN 1.
+              rs_version-major = lv_segment.
+            WHEN 2.
+              rs_version-minor = lv_segment.
+            WHEN 3.
+              rs_version-patch = lv_segment.
+          ENDCASE.
+        CATCH cx_sy_conversion_no_number.
+          zcx_abapgit_exception=>raise( ''Incorrect format for Semantic Version'' ).
+      ENDTRY.
+ 
+    ENDLOOP.
+ 
+    READ TABLE lt_segments INTO lv_segment INDEX 2. " Pre-release Version
+    IF sy-subrc <> 0.   " No version
+      RETURN.
+    ENDIF.
+ 
+    SPLIT lv_segment AT ''.'' INTO TABLE lt_parts.
+ 
+    LOOP AT lt_parts INTO lv_segment.
+ 
+      CASE sy-tabix.
+        WHEN 1.
+          rs_version-prerelase = lv_segment.
+          TRANSLATE rs_version-prerelase TO LOWER CASE.
+        WHEN 2.
+          rs_version-prerelase_patch = lv_segment.
+      ENDCASE.
+ 
+    ENDLOOP.
+ 
+    IF rs_version-prerelase <> ''rc'' AND rs_version-prerelase <> ''beta'' AND rs_version-prerelase <> ''alpha''.
+      zcx_abapgit_exception=>raise( ''Incorrect format for Semantic Version'' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize.
+ 
+    " Internal program version should be in format "XXX.XXX.XXX" or "vXXX.XXX.XXX"
+    CONSTANTS:
+      lc_version_pattern    TYPE string VALUE ''^v?(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\s*$'',
+      lc_prerelease_pattern TYPE string VALUE ''^((rc|beta|alpha)\\.\\d{1,3})\\s*$''.
+ 
+    DATA: lv_version      TYPE string,
+          lv_prerelease   TYPE string,
+          lv_version_n    TYPE string,
+          lv_prerelease_n TYPE string.
+ 
+    SPLIT iv_version AT ''-'' INTO lv_version lv_prerelease.
+ 
+    FIND FIRST OCCURRENCE OF REGEX lc_version_pattern
+      IN lv_version SUBMATCHES lv_version_n.
+ 
+    IF lv_prerelease IS NOT INITIAL.
+ 
+      FIND FIRST OCCURRENCE OF REGEX lc_prerelease_pattern
+        IN lv_prerelease SUBMATCHES lv_prerelease_n.
+ 
+    ENDIF.
+ 
+    IF lv_version_n IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    rv_version = lv_version_n.
+ 
+    IF lv_prerelease_n IS NOT INITIAL.
+      CONCATENATE rv_version ''-'' lv_prerelease_n INTO rv_version.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD version_to_numeric.
+ 
+    DATA: lv_major   TYPE n LENGTH 4,
+          lv_minor   TYPE n LENGTH 4,
+          lv_release TYPE n LENGTH 4.
+ 
+    SPLIT iv_version AT ''.'' INTO lv_major lv_minor lv_release.
+ 
+    " Calculated value of version number, empty version will become 0 which is OK
+    rv_version = lv_major * 1000000 + lv_minor * 1000 + lv_release.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_version_constant_value.
+    DATA: lv_version_class     TYPE string,
+          lv_version_component TYPE string.
+    FIELD-SYMBOLS: <lv_version> TYPE string.
+ 
+    IF iv_version_constant NP ''*=>*''.
+      zcx_abapgit_exception=>raise( ''Version constant needs to use the format CLASS=>CONSTANT'' ).
+    ENDIF.
+ 
+    SPLIT iv_version_constant AT ''=>'' INTO lv_version_class lv_version_component.
+    IF sy-subrc <> 0 OR lv_version_class IS INITIAL OR lv_version_component IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Version constant cannot be parsed'' ).
+    ENDIF.
+ 
+    ASSIGN (lv_version_class)=>(lv_version_component) TO <lv_version>.
+    IF sy-subrc = 0.
+      rv_version = <lv_version>.
+    ELSE.
+      zcx_abapgit_exception=>raise( |Could not access version at class { lv_version_class } component | &&
+                                    |{ lv_version_component }| ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_ZIP                         ', 'CLASS zcl_abapgit_zip DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS encode_files
+      IMPORTING
+        !it_files      TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS export
+      IMPORTING
+        !is_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings
+        !iv_package        TYPE devclass
+        !io_dot_abapgit    TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_show_log       TYPE abap_bool DEFAULT abap_true
+        !it_filter         TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL
+      RETURNING
+        VALUE(rv_xstr)     TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS export_object
+      IMPORTING
+        !iv_object_type        TYPE trobjtype
+        !iv_object_name        TYPE sobj_name
+        !iv_main_language_only TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS export_package
+      IMPORTING
+        !iv_package        TYPE devclass
+        !iv_folder_logic   TYPE string
+        !iv_main_lang_only TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS load
+      IMPORTING
+        !iv_xstr        TYPE xstring
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS save_binstring_to_localfile
+      IMPORTING
+        !iv_filename  TYPE string
+        !iv_binstring TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    CLASS-DATA gv_prev TYPE string .
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS filename
+      IMPORTING
+        !iv_str      TYPE string
+      EXPORTING
+        !ev_path     TYPE string
+        !ev_filename TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS normalize_path
+      CHANGING
+        !ct_files TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS unzip_file
+      IMPORTING
+        !iv_xstr        TYPE xstring
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZIP IMPLEMENTATION.
+ 
+ 
+  METHOD encode_files.
+ 
+    DATA: lo_zip      TYPE REF TO cl_abap_zip,
+          lv_filename TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files.
+ 
+ 
+    CREATE OBJECT lo_zip.
+ 
+    LOOP AT it_files ASSIGNING <ls_file>.
+      CONCATENATE <ls_file>-file-path+1 <ls_file>-file-filename INTO lv_filename.
+      lo_zip->add( name    = lv_filename
+                   content = <ls_file>-file-data ).
+    ENDLOOP.
+ 
+    rv_xstr = lo_zip->save( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD export.
+ 
+    DATA li_log       TYPE REF TO zif_abapgit_log.
+    DATA lt_zip       TYPE zif_abapgit_definitions=>ty_files_item_tt.
+    DATA lo_serialize TYPE REF TO zcl_abapgit_serialize.
+ 
+    CREATE OBJECT li_log TYPE zcl_abapgit_log.
+    li_log->set_title( ''Zip Export Log'' ).
+ 
+    IF zcl_abapgit_factory=>get_sap_package( iv_package )->exists( ) = abap_false.
+      zcx_abapgit_exception=>raise( |Package { iv_package } doesn''t exist| ).
+    ENDIF.
+ 
+    CREATE OBJECT lo_serialize
+      EXPORTING
+        io_dot_abapgit    = io_dot_abapgit
+        is_local_settings = is_local_settings.
+ 
+    lt_zip = lo_serialize->files_local(
+      iv_package = iv_package
+      ii_log     = li_log
+      it_filter  = it_filter ).
+ 
+    FREE lo_serialize.
+ 
+    IF li_log->count( ) > 0 AND iv_show_log = abap_true.
+      zcl_abapgit_log_viewer=>show_log( li_log ).
+    ENDIF.
+ 
+    rv_xstr = encode_files( lt_zip ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD export_object.
+ 
+    DATA: ls_tadir         TYPE zif_abapgit_definitions=>ty_tadir,
+          lv_folder        TYPE string,
+          lv_fullpath      TYPE string,
+          lv_sep           TYPE c LENGTH 1,
+          ls_files_item    TYPE zcl_abapgit_objects=>ty_serialization,
+          lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF ls_files_item-files.
+ 
+    ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
+        iv_object   = iv_object_type
+        iv_obj_name = iv_object_name ).
+ 
+    IF ls_tadir IS INITIAL.
+      zcx_abapgit_exception=>raise( ''Object could not be found'' ).
+    ENDIF.
+ 
+    ls_files_item-item-obj_type = ls_tadir-object.
+    ls_files_item-item-obj_name = ls_tadir-obj_name.
+ 
+    ls_files_item = zcl_abapgit_objects=>serialize(
+      is_item        = ls_files_item-item
+      io_i18n_params = zcl_abapgit_i18n_params=>new(
+        iv_main_language_only = iv_main_language_only
+        iv_main_language      = sy-langu ) ).
+ 
+    IF lines( ls_files_item-files ) = 0.
+      zcx_abapgit_exception=>raise( ''Empty'' ).
+    ENDIF.
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+    lo_frontend_serv->directory_browse(
+      EXPORTING
+        iv_initial_folder  = gv_prev
+      CHANGING
+        cv_selected_folder = lv_folder ).
+    IF lv_folder IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    gv_prev = lv_folder.
+    lo_frontend_serv->get_file_separator( CHANGING cv_file_separator = lv_sep ).
+ 
+    LOOP AT ls_files_item-files ASSIGNING <ls_file>.
+      lv_fullpath = |{ lv_folder }{ lv_sep }{ <ls_file>-filename }|.
+      save_binstring_to_localfile( iv_filename  = lv_fullpath
+                                   iv_binstring = <ls_file>-data ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD export_package.
+ 
+    DATA: ls_local_settings  TYPE zif_abapgit_persistence=>ty_repo-local_settings,
+          lo_dot_abapgit     TYPE REF TO zcl_abapgit_dot_abapgit,
+          lo_frontend_serv   TYPE REF TO zif_abapgit_frontend_services,
+          lv_default         TYPE string,
+          lv_package_escaped TYPE string,
+          lv_path            TYPE string,
+          lv_zip_xstring     TYPE xstring.
+ 
+    ls_local_settings-main_language_only = iv_main_lang_only.
+ 
+    lo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ).
+    lo_dot_abapgit->set_folder_logic( iv_folder_logic ).
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lv_package_escaped = iv_package.
+    REPLACE ALL OCCURRENCES OF ''/'' IN lv_package_escaped WITH ''#''.
+    lv_default = |{ lv_package_escaped }_{ sy-datlo }_{ sy-timlo }|.
+ 
+    lv_zip_xstring = export(
+     is_local_settings = ls_local_settings
+     iv_package        = iv_package
+     io_dot_abapgit    = lo_dot_abapgit ).
+ 
+    lv_path = lo_frontend_serv->show_file_save_dialog(
+        iv_title            = ''Package Export''
+        iv_extension        = ''zip''
+        iv_default_filename = lv_default ).
+ 
+    lo_frontend_serv->file_download(
+        iv_path = lv_path
+        iv_xstr = lv_zip_xstring ).
+  ENDMETHOD.
+ 
+ 
+  METHOD filename.
+ 
+    IF iv_str CA ''/''.
+      FIND REGEX ''(.*/)(.*)'' IN iv_str
+        SUBMATCHES ev_path ev_filename.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( ''Malformed path'' ).
+      ENDIF.
+      IF ev_path <> ''/''.
+        CONCATENATE ''/'' ev_path INTO ev_path.
+      ENDIF.
+    ELSE.
+      ev_path = ''/''.
+      ev_filename = iv_str.
+    ENDIF.
+    TRANSLATE ev_filename TO LOWER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD load.
+ 
+    rt_files = unzip_file( iv_xstr ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_path.
+* removes first folder from path if needed
+ 
+    DATA: lt_split  TYPE TABLE OF string,
+          lv_needed TYPE abap_bool,
+          lv_length TYPE i,
+          lv_split  LIKE LINE OF lt_split.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF ct_files.
+ 
+ 
+    READ TABLE ct_files INDEX 1 ASSIGNING <ls_file>.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    SPLIT <ls_file>-path AT ''/'' INTO TABLE lt_split.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+    READ TABLE lt_split INDEX 2 INTO lv_split.
+    IF sy-subrc <> 0 OR strlen( lv_split ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    CONCATENATE ''/'' lv_split ''/*'' INTO lv_split.
+ 
+    lv_needed = abap_true.
+    LOOP AT ct_files ASSIGNING <ls_file>.
+      IF NOT <ls_file>-path CP lv_split.
+        lv_needed = abap_false.
+        EXIT. " current loop
+      ENDIF.
+    ENDLOOP.
+ 
+    IF lv_needed = abap_true.
+      lv_length = strlen( lv_split ) - 2.
+      LOOP AT ct_files ASSIGNING <ls_file>.
+        <ls_file>-path = <ls_file>-path+lv_length.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_binstring_to_localfile.
+ 
+    zcl_abapgit_ui_factory=>get_frontend_services( )->file_download(
+      iv_path = iv_filename
+      iv_xstr = iv_binstring ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD unzip_file.
+ 
+    DATA: lo_zip  TYPE REF TO cl_abap_zip,
+          lv_data TYPE xstring.
+ 
+    FIELD-SYMBOLS: <ls_zipfile> LIKE LINE OF lo_zip->files,
+                   <ls_file>    LIKE LINE OF rt_files.
+ 
+ 
+    CREATE OBJECT lo_zip.
+    lo_zip->load( EXPORTING
+                    zip             = iv_xstr
+                  EXCEPTIONS
+                    zip_parse_error = 1
+                    OTHERS          = 2 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( ''error from zip'' ).
+    ENDIF.
+ 
+    LOOP AT lo_zip->files ASSIGNING <ls_zipfile>.
+ 
+      lo_zip->get(
+        EXPORTING
+          name                    = <ls_zipfile>-name
+        IMPORTING
+          content                 = lv_data
+        EXCEPTIONS
+          zip_index_error         = 1
+          zip_decompression_error = 2
+          OTHERS                  = 3 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( ''error from zip get'' ).
+      ENDIF.
+ 
+      APPEND INITIAL LINE TO rt_files ASSIGNING <ls_file>.
+ 
+      filename(
+        EXPORTING
+          iv_str      = <ls_zipfile>-name
+        IMPORTING
+          ev_path     = <ls_file>-path
+          ev_filename = <ls_file>-filename ).
+ 
+      <ls_file>-data = lv_data.
+ 
+      <ls_file>-sha1 = zcl_abapgit_hash=>sha1_blob( <ls_file>-data ).
+ 
+    ENDLOOP.
+ 
+    DELETE rt_files WHERE filename IS INITIAL.
+ 
+    normalize_path( CHANGING ct_files = rt_files ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_LOG                         ', 'INTERFACE zif_abapgit_log
+  PUBLIC .
+ 
+  CONSTANTS:
+    BEGIN OF c_status,
+      ok      TYPE sy-msgty VALUE ''S'',
+      error   TYPE sy-msgty VALUE ''E'',
+      warning TYPE sy-msgty VALUE ''W'',
+    END OF c_status.
+ 
+  CONSTANTS:
+    BEGIN OF c_log_level,
+      empty   TYPE i VALUE 0,
+      info    TYPE i VALUE 1,
+      warning TYPE i VALUE 2,
+      error   TYPE i VALUE 3,
+    END OF c_log_level.
+ 
+  TYPES:
+    BEGIN OF ty_log_out,
+      type      TYPE sy-msgty,
+      text      TYPE string,
+      obj_type  TYPE tadir-object,
+      obj_name  TYPE tadir-obj_name,
+      exception TYPE REF TO cx_root,
+    END OF ty_log_out .
+  TYPES:
+    ty_log_outs TYPE STANDARD TABLE OF ty_log_out
+                WITH NON-UNIQUE DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_msg,
+      text TYPE string,
+      type TYPE sy-msgty,
+      level TYPE i,
+    END OF ty_msg .
+  TYPES:
+    ty_msgs TYPE STANDARD TABLE OF ty_msg
+                          WITH NON-UNIQUE DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_item_status_out,
+      item     TYPE zif_abapgit_definitions=>ty_item,
+      status   TYPE sy-msgty,
+      messages TYPE ty_msgs,
+    END OF ty_item_status_out .
+  TYPES:
+    ty_item_status_outs TYPE SORTED TABLE OF ty_item_status_out
+                        WITH UNIQUE KEY item-obj_type item-obj_name .
+ 
+  METHODS add
+    IMPORTING
+      !iv_msg  TYPE csequence
+      !iv_type TYPE sy-msgty DEFAULT ''E''
+      !is_item TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+      !ix_exc  TYPE REF TO cx_root OPTIONAL .
+  METHODS add_error
+    IMPORTING
+      !iv_msg  TYPE csequence
+      !is_item TYPE zif_abapgit_definitions=>ty_item OPTIONAL .
+  METHODS add_info
+    IMPORTING
+      !iv_msg  TYPE csequence
+      !is_item TYPE zif_abapgit_definitions=>ty_item OPTIONAL .
+  METHODS add_warning
+    IMPORTING
+      !iv_msg  TYPE csequence
+      !is_item TYPE zif_abapgit_definitions=>ty_item OPTIONAL .
+  METHODS add_success
+    IMPORTING
+      !iv_msg  TYPE csequence
+      !is_item TYPE zif_abapgit_definitions=>ty_item OPTIONAL .
+  METHODS add_exception
+    IMPORTING
+      !ix_exc  TYPE REF TO cx_root
+      !is_item TYPE zif_abapgit_definitions=>ty_item OPTIONAL .
+  METHODS clear .
+  METHODS count
+    RETURNING
+      VALUE(rv_count) TYPE i .
+  METHODS get_messages
+    RETURNING
+      VALUE(rt_msg) TYPE ty_log_outs .
+  METHODS get_item_status
+    RETURNING
+      VALUE(rt_item_status) TYPE ty_item_status_outs .
+  METHODS get_status
+    RETURNING
+      VALUE(rv_status) TYPE sy-msgty .
+  METHODS get_log_level
+    RETURNING
+      VALUE(rv_level) TYPE i .
+  METHODS get_title
+    RETURNING
+      VALUE(rv_title) TYPE string .
+  METHODS set_title
+    IMPORTING
+      !iv_title TYPE csequence
+    RETURNING
+      VALUE(ri_log) TYPE REF TO zif_abapgit_log.
+  METHODS merge_with
+    IMPORTING
+      ii_log TYPE REF TO zif_abapgit_log
+      iv_min_level TYPE i DEFAULT 0
+    RETURNING
+      VALUE(ri_log) TYPE REF TO zif_abapgit_log.
+  METHODS clone
+    RETURNING
+      VALUE(ri_log) TYPE REF TO zif_abapgit_log.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_XML                         ', 'CLASS zcl_abapgit_xml DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor
+        IMPORTING iv_filename TYPE string OPTIONAL.
+  PROTECTED SECTION.
+    DATA: mi_ixml     TYPE REF TO if_ixml,
+          mi_xml_doc  TYPE REF TO if_ixml_document,
+          ms_metadata TYPE zif_abapgit_definitions=>ty_metadata,
+          mv_filename TYPE string.
+ 
+    CONSTANTS: c_abapgit_tag             TYPE string VALUE ''abapGit'' ##NO_TEXT,
+               c_attr_version            TYPE string VALUE ''version'' ##NO_TEXT,
+               c_attr_serializer         TYPE string VALUE ''serializer'' ##NO_TEXT,
+               c_attr_serializer_version TYPE string VALUE ''serializer_version'' ##NO_TEXT.
+ 
+    METHODS to_xml
+      IMPORTING iv_normalize  TYPE abap_bool DEFAULT abap_true
+      RETURNING VALUE(rv_xml) TYPE string.
+ 
+    METHODS parse
+      IMPORTING iv_xml TYPE string
+      RAISING   zcx_abapgit_exception.
+  PRIVATE SECTION.
+ 
+    METHODS error
+      IMPORTING
+        !ii_parser TYPE REF TO if_ixml_parser
+      RAISING
+        zcx_abapgit_exception .
+    METHODS raise_version_mismatch
+      IMPORTING
+        !iv_vers TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS raise_exception_for
+      IMPORTING
+        !ii_error TYPE REF TO if_ixml_parse_error
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_xml IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mi_ixml     = cl_ixml=>create( ).
+    mi_xml_doc  = mi_ixml->create_document( ).
+    mv_filename = iv_filename.
+  ENDMETHOD.
+ 
+ 
+  METHOD error.
+ 
+    IF ii_parser->num_errors( ) <> 0.
+      raise_exception_for( ii_parser->get_error( 0 ) ).
+    ENDIF.
+ 
+    IF mv_filename IS INITIAL.
+      zcx_abapgit_exception=>raise( |Error while parsing XML| ).
+    ELSE.
+      zcx_abapgit_exception=>raise( |Error while parsing XML file { mv_filename }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA: li_stream_factory TYPE REF TO if_ixml_stream_factory,
+          li_istream        TYPE REF TO if_ixml_istream,
+          li_element        TYPE REF TO if_ixml_element,
+          li_version        TYPE REF TO if_ixml_node,
+          li_parser         TYPE REF TO if_ixml_parser.
+ 
+ 
+    ASSERT NOT iv_xml IS INITIAL.
+ 
+    li_stream_factory = mi_ixml->create_stream_factory( ).
+    li_istream = li_stream_factory->create_istream_string( iv_xml ).
+    li_parser = mi_ixml->create_parser( stream_factory = li_stream_factory
+                                        istream        = li_istream
+                                        document       = mi_xml_doc ).
+    li_parser->add_strip_space_element( ).
+    IF li_parser->parse( ) <> 0.
+      error( li_parser ).
+    ENDIF.
+ 
+    li_istream->close( ).
+ 
+ 
+    li_element = mi_xml_doc->find_from_name_ns( depth = 0
+                                                name = c_abapgit_tag ).
+    li_version = li_element->if_ixml_node~get_attributes(
+      )->get_named_item_ns( c_attr_version ).
+    IF li_version->get_value( ) <> zif_abapgit_version=>c_xml_version.
+      raise_version_mismatch( li_version->get_value( ) ).
+    ENDIF.
+ 
+* buffer serializer metadata. Git node will be removed lateron
+    ms_metadata-class_   = li_element->get_attribute_ns( c_attr_serializer ).
+    ms_metadata-version = li_element->get_attribute_ns( c_attr_serializer_version ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_exception_for.
+    DATA lv_message TYPE string.
+ 
+    lv_message = |XML parser error: { ii_error->get_reason( ) }, | &&
+                 |Line { ii_error->get_line( ) } | &&
+                 |Col. { ii_error->get_column( ) }|.
+ 
+    IF mv_filename IS NOT INITIAL.
+      lv_message = lv_message && | File { mv_filename }|.
+    ENDIF.
+ 
+    zcx_abapgit_exception=>raise( lv_message ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_version_mismatch.
+ 
+    DATA lv_text TYPE string.
+ 
+    lv_text = |The XML versions do not match, expected: { zif_abapgit_version=>c_xml_version }, actual: { iv_vers }|.
+ 
+    IF mv_filename IS NOT INITIAL.
+      lv_text = lv_text && |, file: { mv_filename }|.
+    ENDIF.
+ 
+    lv_text = lv_text && | (see https://docs.abapgit.org/other-xml-mismatch.html)|.
+ 
+    zcx_abapgit_exception=>raise( lv_text ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+* will render to codepage UTF-16
+ 
+    DATA: li_ostream       TYPE REF TO if_ixml_ostream,
+          li_renderer      TYPE REF TO if_ixml_renderer,
+          li_streamfactory TYPE REF TO if_ixml_stream_factory.
+ 
+    li_streamfactory = mi_ixml->create_stream_factory( ).
+ 
+    li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ).
+ 
+    li_renderer = mi_ixml->create_renderer( ostream  = li_ostream
+                                            document = mi_xml_doc ).
+    li_renderer->set_normalizing( iv_normalize ).
+ 
+    li_renderer->render( ).
+ 
+    " handling of BOM moved to zcl_abapgit_convert=>string_to_xstring_utf8_bom
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_XML_INPUT                   ', 'CLASS zcl_abapgit_xml_input DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_xml
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_xml_input.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_xml      TYPE clike
+        !iv_filename TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA ms_i18n_params TYPE zif_abapgit_definitions=>ty_i18n_params.
+ 
+    METHODS fix_xml.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_XML_INPUT IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( iv_filename ).
+    parse( iv_xml ).
+    fix_xml( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD fix_xml.
+ 
+    DATA: li_git  TYPE REF TO if_ixml_element,
+          li_abap TYPE REF TO if_ixml_node.
+ 
+ 
+    li_git ?= mi_xml_doc->find_from_name_ns( depth = 0
+                                             name = c_abapgit_tag ).
+    li_abap = li_git->get_first_child( ).
+ 
+    mi_xml_doc->get_root( )->remove_child( li_git ).
+    mi_xml_doc->get_root( )->append_child( li_abap ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_input~get_metadata.
+    rs_metadata = ms_metadata.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_input~get_raw.
+    ri_raw = mi_xml_doc.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_input~read.
+ 
+    DATA: lx_error TYPE REF TO cx_transformation_error,
+          lt_rtab  TYPE abap_trans_resbind_tab.
+ 
+    FIELD-SYMBOLS: <ls_rtab> LIKE LINE OF lt_rtab.
+ 
+    ASSERT NOT iv_name IS INITIAL.
+ 
+    CLEAR cg_data. "Initialize result to avoid problems with empty values
+ 
+    APPEND INITIAL LINE TO lt_rtab ASSIGNING <ls_rtab>.
+    <ls_rtab>-name = iv_name.
+    GET REFERENCE OF cg_data INTO <ls_rtab>-value.
+ 
+    TRY.
+        CALL TRANSFORMATION id
+          OPTIONS value_handling = ''accept_data_loss''
+          SOURCE XML mi_xml_doc
+          RESULT (lt_rtab).
+      CATCH cx_transformation_error INTO lx_error.
+        IF mv_filename IS INITIAL.
+          zcx_abapgit_exception=>raise( lx_error->if_message~get_text( ) ).
+        ELSE.
+          zcx_abapgit_exception=>raise( |File { mv_filename }: { lx_error->if_message~get_text( ) }| ).
+        ENDIF.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_XML_OUTPUT                  ', 'CLASS zcl_abapgit_xml_output DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_xml
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_xml_output.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mi_raw TYPE REF TO if_ixml_element .
+    DATA ms_i18n_params TYPE zif_abapgit_definitions=>ty_i18n_params .
+ 
+    METHODS build_asx_node
+      RETURNING
+        VALUE(ri_element) TYPE REF TO if_ixml_element .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_XML_OUTPUT IMPLEMENTATION.
+ 
+ 
+  METHOD build_asx_node.
+ 
+    DATA: li_attr TYPE REF TO if_ixml_attribute.
+ 
+ 
+    ri_element = mi_xml_doc->create_element_ns(
+      name   = ''abap''
+      prefix = ''asx'' ).
+ 
+    li_attr = mi_xml_doc->create_attribute_ns( ''version'' ).
+    li_attr->if_ixml_node~set_value( ''1.0'' ).
+    ri_element->set_attribute_node_ns( li_attr ).
+ 
+    li_attr = mi_xml_doc->create_attribute_ns(
+      name   = ''asx''
+      prefix = ''xmlns'' ).
+    li_attr->if_ixml_node~set_value( ''http://www.sap.com/abapxml'' ).
+    ri_element->set_attribute_node_ns( li_attr ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_output~add.
+ 
+    DATA: li_node TYPE REF TO if_ixml_node,
+          li_doc  TYPE REF TO if_ixml_document,
+          lt_stab TYPE abap_trans_srcbind_tab.
+ 
+    FIELD-SYMBOLS: <ls_stab> LIKE LINE OF lt_stab.
+ 
+ 
+    ASSERT NOT iv_name IS INITIAL.
+ 
+    IF ig_data IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    APPEND INITIAL LINE TO lt_stab ASSIGNING <ls_stab>.
+    <ls_stab>-name = iv_name.
+    GET REFERENCE OF ig_data INTO <ls_stab>-value.
+ 
+    li_doc = cl_ixml=>create( )->create_document( ).
+ 
+    CALL TRANSFORMATION id
+      OPTIONS initial_components = ''suppress''
+      SOURCE (lt_stab)
+      RESULT XML li_doc.
+ 
+    li_node = mi_xml_doc->get_root( )->get_first_child( ).
+    IF li_node IS BOUND.
+      mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child(
+        li_doc->get_root( )->get_first_child( )->get_first_child( )->get_first_child( ) ).
+    ELSE.
+      mi_xml_doc->get_root( )->append_child( li_doc->get_root( )->get_first_child( ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_output~add_xml.
+ 
+    DATA: li_element TYPE REF TO if_ixml_element.
+ 
+    li_element = mi_xml_doc->create_element( iv_name ).
+    li_element->append_child( ii_xml ).
+ 
+    mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child( li_element ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_output~render.
+ 
+    DATA: li_git  TYPE REF TO if_ixml_element,
+          li_abap TYPE REF TO if_ixml_element.
+ 
+ 
+    IF mi_raw IS INITIAL.
+      li_abap ?= mi_xml_doc->get_root( )->get_first_child( ).
+      mi_xml_doc->get_root( )->remove_child( li_abap ).
+      IF li_abap IS INITIAL.
+        li_abap = build_asx_node( ).
+      ENDIF.
+    ELSE.
+      li_abap = mi_raw.
+    ENDIF.
+ 
+    li_git = mi_xml_doc->create_element( c_abapgit_tag ).
+    li_git->set_attribute( name = c_attr_version
+                           value = zif_abapgit_version=>c_xml_version ).
+    IF NOT is_metadata IS INITIAL.
+      li_git->set_attribute( name  = c_attr_serializer
+                             value = is_metadata-class_ ).
+      li_git->set_attribute( name  = c_attr_serializer_version
+                             value = is_metadata-version ).
+    ENDIF.
+    li_git->append_child( li_abap ).
+    mi_xml_doc->get_root( )->append_child( li_git ).
+ 
+    rv_xml = to_xml( iv_normalize ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_output~set_raw.
+    mi_raw = ii_raw.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_XML_PRETTY                  ', 'CLASS zcl_abapgit_xml_pretty DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS print
+      IMPORTING
+        !iv_xml           TYPE string
+        !iv_ignore_errors TYPE abap_bool DEFAULT abap_true
+        !iv_unpretty      TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_xml)     TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_XML_PRETTY IMPLEMENTATION.
+ 
+ 
+  METHOD print.
+ 
+    DATA: li_ixml           TYPE REF TO if_ixml,
+          li_xml_doc        TYPE REF TO if_ixml_document,
+          li_stream_factory TYPE REF TO if_ixml_stream_factory,
+          li_istream        TYPE REF TO if_ixml_istream,
+          li_parser         TYPE REF TO if_ixml_parser,
+          li_ostream        TYPE REF TO if_ixml_ostream,
+          li_renderer       TYPE REF TO if_ixml_renderer.
+ 
+ 
+    ASSERT NOT iv_xml IS INITIAL.
+ 
+    li_ixml    = cl_ixml=>create( ).
+    li_xml_doc = li_ixml->create_document( ).
+ 
+    li_stream_factory = li_ixml->create_stream_factory( ).
+    li_istream        = li_stream_factory->create_istream_string( iv_xml ).
+    li_parser         = li_ixml->create_parser( stream_factory = li_stream_factory
+                                                istream        = li_istream
+                                                document       = li_xml_doc ).
+    li_parser->set_normalizing( abap_true ).
+    IF li_parser->parse( ) <> 0.
+      IF iv_ignore_errors = abap_true.
+        rv_xml = iv_xml.
+        RETURN.
+      ELSE.
+        zcx_abapgit_exception=>raise( ''error parsing xml'' ).
+      ENDIF.
+    ENDIF.
+    li_istream->close( ).
+ 
+ 
+    li_ostream  = li_stream_factory->create_ostream_cstring( rv_xml ).
+ 
+    li_renderer = li_ixml->create_renderer( ostream  = li_ostream
+                                            document = li_xml_doc ).
+ 
+    li_renderer->set_normalizing( boolc( iv_unpretty = abap_false ) ).
+ 
+    li_renderer->render( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_XML_INPUT                   ', 'INTERFACE zif_abapgit_xml_input
+  PUBLIC .
+ 
+  METHODS read
+    IMPORTING
+      !iv_name TYPE clike
+    CHANGING
+      !cg_data TYPE any
+    RAISING
+      zcx_abapgit_exception .
+  METHODS get_raw
+    RETURNING
+      VALUE(ri_raw) TYPE REF TO if_ixml_document .
+ 
+* todo, add read_xml to match add_xml in lcl_xml_output
+  METHODS get_metadata
+    RETURNING
+      VALUE(rs_metadata) TYPE zif_abapgit_definitions=>ty_metadata .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_XML_OUTPUT                  ', 'INTERFACE zif_abapgit_xml_output
+  PUBLIC .
+ 
+  METHODS add
+    IMPORTING
+      !iv_name TYPE clike
+      !ig_data TYPE any
+    RAISING
+      zcx_abapgit_exception .
+  METHODS set_raw
+    IMPORTING
+      !ii_raw TYPE REF TO if_ixml_element .
+  METHODS add_xml
+    IMPORTING
+      !iv_name TYPE clike
+      !ii_xml  TYPE REF TO if_ixml_element .
+  METHODS render
+    IMPORTING
+      !iv_normalize TYPE abap_bool DEFAULT abap_true
+      !is_metadata  TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
+    RETURNING
+      VALUE(rv_xml) TYPE string .
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_FACTORY                     ', 'CLASS zcl_abapgit_factory DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_injector .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_tadir
+      RETURNING
+        VALUE(ri_tadir) TYPE REF TO zif_abapgit_tadir .
+    CLASS-METHODS get_sap_package
+      IMPORTING
+        !iv_package           TYPE devclass
+      RETURNING
+        VALUE(ri_sap_package) TYPE REF TO zif_abapgit_sap_package .
+    CLASS-METHODS get_code_inspector
+      IMPORTING
+        !iv_package              TYPE devclass
+      RETURNING
+        VALUE(ri_code_inspector) TYPE REF TO zif_abapgit_code_inspector
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_stage_logic
+      RETURNING
+        VALUE(ri_logic) TYPE REF TO zif_abapgit_stage_logic .
+    CLASS-METHODS get_cts_api
+      RETURNING
+        VALUE(ri_cts_api) TYPE REF TO zif_abapgit_cts_api .
+    CLASS-METHODS get_environment
+      RETURNING
+        VALUE(ri_environment) TYPE REF TO zif_abapgit_environment .
+    CLASS-METHODS get_longtexts
+      RETURNING
+        VALUE(ri_longtexts) TYPE REF TO zif_abapgit_longtexts .
+    CLASS-METHODS get_http_agent
+      RETURNING
+        VALUE(ri_http_agent) TYPE REF TO zif_abapgit_http_agent .
+    CLASS-METHODS get_lxe_texts
+      RETURNING
+        VALUE(ri_lxe_texts) TYPE REF TO zif_abapgit_lxe_texts .
+    CLASS-METHODS get_sap_namespace
+      RETURNING
+        VALUE(ri_namespace) TYPE REF TO zif_abapgit_sap_namespace .
+    CLASS-METHODS get_sap_report
+      RETURNING
+        VALUE(ri_report) TYPE REF TO zif_abapgit_sap_report.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_sap_package,
+        package  TYPE devclass,
+        instance TYPE REF TO zif_abapgit_sap_package,
+      END OF ty_sap_package .
+    TYPES:
+      ty_sap_packages TYPE HASHED TABLE OF ty_sap_package
+                                    WITH UNIQUE KEY package .
+    TYPES:
+      BEGIN OF ty_code_inspector_pack,
+        package  TYPE devclass,
+        instance TYPE REF TO zif_abapgit_code_inspector,
+      END OF ty_code_inspector_pack .
+    TYPES:
+      ty_code_inspector_packs TYPE HASHED TABLE OF ty_code_inspector_pack
+                                       WITH UNIQUE KEY package .
+ 
+    CLASS-DATA gi_tadir TYPE REF TO zif_abapgit_tadir .
+    CLASS-DATA gt_sap_package TYPE ty_sap_packages .
+    CLASS-DATA gt_code_inspector TYPE ty_code_inspector_packs .
+    CLASS-DATA gi_stage_logic TYPE REF TO zif_abapgit_stage_logic .
+    CLASS-DATA gi_cts_api TYPE REF TO zif_abapgit_cts_api .
+    CLASS-DATA gi_environment TYPE REF TO zif_abapgit_environment .
+    CLASS-DATA gi_longtext TYPE REF TO zif_abapgit_longtexts .
+    CLASS-DATA gi_http_agent TYPE REF TO zif_abapgit_http_agent .
+    CLASS-DATA gi_lxe_texts TYPE REF TO zif_abapgit_lxe_texts .
+    CLASS-DATA gi_sap_namespace TYPE REF TO zif_abapgit_sap_namespace .
+    CLASS-DATA gi_sap_report TYPE REF TO zif_abapgit_sap_report.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_factory IMPLEMENTATION.
+ 
+ 
+  METHOD get_code_inspector.
+ 
+    DATA: ls_code_inspector LIKE LINE OF gt_code_inspector.
+    FIELD-SYMBOLS: <ls_code_inspector> TYPE ty_code_inspector_pack.
+ 
+    READ TABLE gt_code_inspector ASSIGNING <ls_code_inspector>
+      WITH TABLE KEY package = iv_package.
+    IF sy-subrc <> 0.
+      ls_code_inspector-package = iv_package.
+ 
+      CREATE OBJECT ls_code_inspector-instance TYPE zcl_abapgit_code_inspector
+        EXPORTING
+          iv_package = iv_package.
+ 
+      INSERT ls_code_inspector
+             INTO TABLE gt_code_inspector
+             ASSIGNING <ls_code_inspector>.
+ 
+    ENDIF.
+ 
+    ri_code_inspector = <ls_code_inspector>-instance.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_cts_api.
+    IF gi_cts_api IS NOT BOUND.
+      CREATE OBJECT gi_cts_api TYPE zcl_abapgit_cts_api.
+    ENDIF.
+ 
+    ri_cts_api = gi_cts_api.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_environment.
+    IF gi_environment IS NOT BOUND.
+      CREATE OBJECT gi_environment TYPE zcl_abapgit_environment.
+    ENDIF.
+    ri_environment = gi_environment.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_http_agent.
+ 
+    IF gi_http_agent IS BOUND.
+      ri_http_agent = gi_http_agent.
+    ELSE.
+      ri_http_agent = zcl_abapgit_http_agent=>create( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_longtexts.
+ 
+    IF gi_longtext IS NOT BOUND.
+      CREATE OBJECT gi_longtext TYPE zcl_abapgit_longtexts.
+    ENDIF.
+    ri_longtexts = gi_longtext.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_lxe_texts.
+ 
+    IF gi_lxe_texts IS NOT BOUND.
+      CREATE OBJECT gi_lxe_texts TYPE zcl_abapgit_lxe_texts.
+    ENDIF.
+    ri_lxe_texts = gi_lxe_texts.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sap_namespace.
+ 
+    IF gi_sap_namespace IS NOT BOUND.
+      CREATE OBJECT gi_sap_namespace TYPE zcl_abapgit_sap_namespace.
+    ENDIF.
+ 
+    ri_namespace = gi_sap_namespace.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sap_package.
+ 
+    DATA: ls_sap_package TYPE ty_sap_package.
+    FIELD-SYMBOLS: <ls_sap_package> TYPE ty_sap_package.
+ 
+    READ TABLE gt_sap_package ASSIGNING <ls_sap_package>
+                              WITH TABLE KEY package = iv_package.
+    IF sy-subrc <> 0.
+ 
+      ls_sap_package-package = iv_package.
+      CREATE OBJECT ls_sap_package-instance TYPE zcl_abapgit_sap_package
+        EXPORTING
+          iv_package = iv_package.
+ 
+      INSERT ls_sap_package
+             INTO TABLE gt_sap_package
+             ASSIGNING <ls_sap_package>.
+ 
+    ENDIF.
+ 
+    ri_sap_package = <ls_sap_package>-instance.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sap_report.
+ 
+    IF gi_sap_report IS NOT BOUND.
+      CREATE OBJECT gi_sap_report TYPE zcl_abapgit_sap_report.
+    ENDIF.
+ 
+    ri_report = gi_sap_report.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_stage_logic.
+ 
+    IF gi_stage_logic IS INITIAL.
+      CREATE OBJECT gi_stage_logic
+        TYPE zcl_abapgit_stage_logic.
+    ENDIF.
+ 
+    ri_logic = gi_stage_logic.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_tadir.
+ 
+    IF gi_tadir IS INITIAL.
+      CREATE OBJECT gi_tadir TYPE zcl_abapgit_tadir.
+    ENDIF.
+ 
+    ri_tadir = gi_tadir.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_INJECTOR                    ', 'CLASS zcl_abapgit_injector DEFINITION
+  PUBLIC
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS set_tadir
+      IMPORTING
+        !ii_tadir TYPE REF TO zif_abapgit_tadir .
+    CLASS-METHODS set_sap_package
+      IMPORTING
+        !iv_package     TYPE devclass
+        !ii_sap_package TYPE REF TO zif_abapgit_sap_package .
+    CLASS-METHODS set_code_inspector
+      IMPORTING
+        !iv_package        TYPE devclass
+        !ii_code_inspector TYPE REF TO zif_abapgit_code_inspector .
+    CLASS-METHODS set_stage_logic
+      IMPORTING
+        !ii_logic TYPE REF TO zif_abapgit_stage_logic .
+    CLASS-METHODS set_cts_api
+      IMPORTING
+        !ii_cts_api TYPE REF TO zif_abapgit_cts_api .
+    CLASS-METHODS set_environment
+      IMPORTING
+        !ii_environment TYPE REF TO zif_abapgit_environment .
+    CLASS-METHODS set_longtexts
+      IMPORTING
+        !ii_longtexts TYPE REF TO zif_abapgit_longtexts .
+    CLASS-METHODS set_http_agent
+      IMPORTING
+        !ii_http_agent TYPE REF TO zif_abapgit_http_agent .
+    CLASS-METHODS set_lxe_texts
+      IMPORTING
+        !ii_lxe_texts TYPE REF TO zif_abapgit_lxe_texts .
+    CLASS-METHODS set_sap_namespace
+      IMPORTING
+        !ii_namespace TYPE REF TO zif_abapgit_sap_namespace .
+    CLASS-METHODS set_sap_report
+      IMPORTING
+        !ii_report TYPE REF TO zif_abapgit_sap_report.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_injector IMPLEMENTATION.
+ 
+ 
+  METHOD set_code_inspector.
+ 
+    DATA: ls_code_inspector LIKE LINE OF zcl_abapgit_factory=>gt_code_inspector.
+    FIELD-SYMBOLS: <ls_code_inspector> LIKE LINE OF zcl_abapgit_factory=>gt_code_inspector.
+ 
+    READ TABLE zcl_abapgit_factory=>gt_code_inspector
+         ASSIGNING <ls_code_inspector>
+         WITH TABLE KEY package = iv_package.
+    IF sy-subrc <> 0.
+ 
+      ls_code_inspector-package = iv_package.
+ 
+      INSERT ls_code_inspector
+             INTO TABLE zcl_abapgit_factory=>gt_code_inspector
+             ASSIGNING <ls_code_inspector>.
+ 
+    ENDIF.
+ 
+    <ls_code_inspector>-instance = ii_code_inspector.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_cts_api.
+    zcl_abapgit_factory=>gi_cts_api = ii_cts_api.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_environment.
+    zcl_abapgit_factory=>gi_environment = ii_environment.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_http_agent.
+    zcl_abapgit_factory=>gi_http_agent = ii_http_agent.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_longtexts.
+    zcl_abapgit_factory=>gi_longtext = ii_longtexts.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_lxe_texts.
+    zcl_abapgit_factory=>gi_lxe_texts = ii_lxe_texts.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_sap_namespace.
+    zcl_abapgit_factory=>gi_sap_namespace = ii_namespace.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_sap_package.
+ 
+    DATA: ls_sap_package TYPE zcl_abapgit_factory=>ty_sap_package.
+    FIELD-SYMBOLS: <ls_sap_package> TYPE zcl_abapgit_factory=>ty_sap_package.
+ 
+    READ TABLE zcl_abapgit_factory=>gt_sap_package
+         ASSIGNING <ls_sap_package>
+         WITH TABLE KEY package = iv_package.
+ 
+    IF sy-subrc <> 0.
+ 
+      ls_sap_package-package = iv_package.
+      INSERT ls_sap_package
+             INTO TABLE zcl_abapgit_factory=>gt_sap_package
+             ASSIGNING <ls_sap_package>.
+ 
+    ENDIF.
+ 
+    <ls_sap_package>-instance = ii_sap_package.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_sap_report.
+    zcl_abapgit_factory=>gi_sap_report = ii_report.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_stage_logic.
+ 
+    zcl_abapgit_factory=>gi_stage_logic = ii_logic.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_tadir.
+    zcl_abapgit_factory=>gi_tadir = ii_tadir.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCL_ABAPGIT_SETTINGS                    ', 'CLASS zcl_abapgit_settings DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_commitmsg_comment_length_dft TYPE i VALUE 50 ##NO_TEXT.
+    CONSTANTS c_commitmsg_body_size_dft TYPE i VALUE 72 ##NO_TEXT.
+    CONSTANTS:
+      BEGIN OF c_icon_scaling,
+        large TYPE c VALUE ''L'',
+        small TYPE c VALUE ''S'',
+      END OF c_icon_scaling .
+    CONSTANTS:
+      BEGIN OF c_ui_theme,
+        default         TYPE string VALUE ''default'',
+        dark            TYPE string VALUE ''dark'',
+        belize          TYPE string VALUE ''belize'',
+        synced_with_gui TYPE string VALUE ''synced_with_gui'',
+      END OF c_ui_theme .
+ 
+    METHODS set_proxy_url
+      IMPORTING
+        !iv_url TYPE string .
+    METHODS set_proxy_port
+      IMPORTING
+        !iv_port TYPE string .
+    METHODS set_proxy_authentication
+      IMPORTING
+        !iv_auth TYPE abap_bool .
+    METHODS set_proxy_bypass
+      IMPORTING
+        !it_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url OPTIONAL .
+    METHODS get_proxy_url
+      RETURNING
+        VALUE(rv_proxy_url) TYPE string .
+    METHODS get_proxy_port
+      RETURNING
+        VALUE(rv_port) TYPE string .
+    METHODS get_proxy_authentication
+      RETURNING
+        VALUE(rv_auth) TYPE abap_bool .
+    METHODS get_proxy_bypass
+      RETURNING
+        VALUE(rt_bypass) TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url .
+    METHODS set_run_critical_tests
+      IMPORTING
+        !iv_run TYPE abap_bool .
+    METHODS get_run_critical_tests
+      RETURNING
+        VALUE(rv_run) TYPE abap_bool .
+    METHODS set_experimental_features
+      IMPORTING
+        !iv_run TYPE abap_bool .
+    METHODS get_experimental_features
+      RETURNING
+        VALUE(rv_run) TYPE abap_bool .
+    METHODS set_max_lines
+      IMPORTING
+        !iv_lines TYPE i .
+    METHODS get_max_lines
+      RETURNING
+        VALUE(rv_lines) TYPE i .
+    METHODS set_adt_jump_enanbled
+      IMPORTING
+        !iv_adt_jump_enabled TYPE abap_bool .
+    METHODS get_adt_jump_enabled
+      RETURNING
+        VALUE(rv_adt_jump_enabled) TYPE abap_bool .
+    METHODS set_commitmsg_comment_length
+      IMPORTING
+        !iv_length TYPE i .
+    METHODS get_commitmsg_comment_length
+      RETURNING
+        VALUE(rv_length) TYPE i .
+    METHODS set_commitmsg_comment_default
+      IMPORTING
+        !iv_default TYPE string .
+    METHODS get_commitmsg_comment_default
+      RETURNING
+        VALUE(rv_default) TYPE string .
+    METHODS set_commitmsg_body_size
+      IMPORTING
+        !iv_length TYPE i .
+    METHODS get_commitmsg_body_size
+      RETURNING
+        VALUE(rv_length) TYPE i .
+    METHODS set_commitmsg_hide_author
+      IMPORTING
+        !iv_hide_author TYPE abap_bool.
+    METHODS get_commitmsg_hide_author
+      RETURNING
+        VALUE(rv_hide_author) TYPE abap_bool.
+    METHODS get_settings_xml
+      RETURNING
+        VALUE(rv_settings_xml) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_user_settings
+      RETURNING
+        VALUE(rs_settings) TYPE zif_abapgit_definitions=>ty_s_user_settings
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_xml_settings
+      IMPORTING
+        !iv_settings_xml TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_defaults .
+    METHODS set_user_settings
+      IMPORTING
+        !is_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings .
+    METHODS get_show_default_repo
+      RETURNING
+        VALUE(rv_show_default_repo) TYPE abap_bool .
+    METHODS set_show_default_repo
+      IMPORTING
+        !iv_show_default_repo TYPE abap_bool .
+    METHODS set_link_hints_enabled
+      IMPORTING
+        !iv_link_hints_enabled TYPE abap_bool .
+    METHODS get_link_hints_enabled
+      RETURNING
+        VALUE(rv_link_hints_enabled) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_link_hint_key
+      IMPORTING
+        !iv_link_hint_key TYPE string .
+    METHODS get_link_hint_key
+      RETURNING
+        VALUE(rv_link_hint_key) TYPE string .
+    METHODS set_parallel_proc_disabled
+      IMPORTING
+        !iv_disable_parallel_proc TYPE abap_bool .
+    METHODS get_parallel_proc_disabled
+      RETURNING
+        VALUE(rv_disable_parallel_proc) TYPE abap_bool .
+    METHODS get_icon_scaling
+      RETURNING
+        VALUE(rv_scaling) TYPE zif_abapgit_definitions=>ty_s_user_settings-icon_scaling .
+    METHODS set_icon_scaling
+      IMPORTING
+        !iv_scaling TYPE zif_abapgit_definitions=>ty_s_user_settings-icon_scaling .
+    METHODS get_ui_theme
+      IMPORTING
+        !iv_resolve_synced TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rv_ui_theme) TYPE zif_abapgit_definitions=>ty_s_user_settings-ui_theme .
+    METHODS set_ui_theme
+      IMPORTING
+        !iv_ui_theme TYPE zif_abapgit_definitions=>ty_s_user_settings-ui_theme .
+    METHODS get_activate_wo_popup
+      RETURNING
+        VALUE(rv_act_wo_popup) TYPE zif_abapgit_definitions=>ty_s_user_settings-activate_wo_popup .
+    METHODS set_activate_wo_popup
+      IMPORTING
+        !iv_act_wo_popup TYPE zif_abapgit_definitions=>ty_s_user_settings-activate_wo_popup .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES: BEGIN OF ty_s_settings,
+             proxy_url                TYPE string,
+             proxy_port               TYPE string,
+             proxy_auth               TYPE string,
+             proxy_bypass             TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url,
+             run_critical_tests       TYPE abap_bool,
+             experimental_features    TYPE abap_bool,
+             commitmsg_comment_length TYPE i,
+             commitmsg_comment_deflt  TYPE string,
+             commitmsg_body_size      TYPE i,
+             commitmsg_hide_author    TYPE abap_bool,
+           END OF ty_s_settings.
+ 
+    DATA: ms_settings      TYPE ty_s_settings,
+          ms_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+    METHODS:
+      set_default_link_hint_key.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_settings IMPLEMENTATION.
+ 
+ 
+  METHOD get_activate_wo_popup.
+    rv_act_wo_popup = ms_user_settings-activate_wo_popup.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_adt_jump_enabled.
+    rv_adt_jump_enabled = ms_user_settings-adt_jump_enabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_commitmsg_body_size.
+    rv_length = ms_settings-commitmsg_body_size.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_commitmsg_comment_default.
+    rv_default = ms_settings-commitmsg_comment_deflt.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_commitmsg_comment_length.
+    rv_length = ms_settings-commitmsg_comment_length.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_commitmsg_hide_author.
+    rv_hide_author = ms_settings-commitmsg_hide_author.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_experimental_features.
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      rv_run = ms_settings-experimental_features.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_icon_scaling.
+    rv_scaling = ms_user_settings-icon_scaling.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_link_hints_enabled.
+    rv_link_hints_enabled = ms_user_settings-link_hints_enabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_link_hint_key.
+    rv_link_hint_key = ms_user_settings-link_hint_key.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_max_lines.
+    rv_lines = ms_user_settings-max_lines.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_parallel_proc_disabled.
+    rv_disable_parallel_proc = ms_user_settings-parallel_proc_disabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_authentication.
+    rv_auth = ms_settings-proxy_auth.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_bypass.
+    rt_bypass = ms_settings-proxy_bypass.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_port.
+    rv_port = ms_settings-proxy_port.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_url.
+    rv_proxy_url = ms_settings-proxy_url.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_run_critical_tests.
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      rv_run = ms_settings-run_critical_tests.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_settings_xml.
+ 
+    DATA: li_output TYPE REF TO zif_abapgit_xml_output.
+ 
+ 
+    CREATE OBJECT li_output TYPE zcl_abapgit_xml_output.
+ 
+    li_output->add( iv_name = zcl_abapgit_persistence_db=>c_type_settings
+                    ig_data = ms_settings ).
+ 
+    rv_settings_xml = li_output->render( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_show_default_repo.
+    rv_show_default_repo = ms_user_settings-show_default_repo.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_ui_theme.
+    DATA lv_frontend_theme TYPE string.
+    DATA lv_cl_gui TYPE string.
+ 
+    lv_cl_gui = ''CL_GUI_RESOURCES''.
+ 
+    rv_ui_theme = ms_user_settings-ui_theme.
+ 
+    IF rv_ui_theme = c_ui_theme-synced_with_gui AND iv_resolve_synced = abap_true.
+      TRY.
+          CALL METHOD (lv_cl_gui)=>get_themename
+            IMPORTING
+              themename              = lv_frontend_theme
+            EXCEPTIONS
+              get_std_resource_error = 1
+              OTHERS                 = 2.
+          IF sy-subrc <> 0.
+            rv_ui_theme = c_ui_theme-default.
+            RETURN.
+          ENDIF.
+        CATCH cx_sy_dyn_call_error.
+          rv_ui_theme = c_ui_theme-default.
+          RETURN.
+      ENDTRY.
+ 
+      CASE lv_frontend_theme.
+        WHEN ''Belize''.
+          rv_ui_theme = c_ui_theme-belize.
+        WHEN OTHERS.
+          rv_ui_theme = c_ui_theme-default.
+      ENDCASE.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_user_settings.
+    rs_settings = ms_user_settings.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_activate_wo_popup.
+    ms_user_settings-activate_wo_popup = iv_act_wo_popup.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_adt_jump_enanbled.
+    ms_user_settings-adt_jump_enabled = iv_adt_jump_enabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_commitmsg_body_size.
+    ms_settings-commitmsg_body_size = iv_length.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_commitmsg_comment_default.
+    ms_settings-commitmsg_comment_deflt = iv_default.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_commitmsg_comment_length.
+    ms_settings-commitmsg_comment_length = iv_length.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_commitmsg_hide_author.
+    ms_settings-commitmsg_hide_author = iv_hide_author.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_defaults.
+ 
+    CLEAR ms_settings.
+ 
+    set_proxy_authentication( abap_false ).
+    set_run_critical_tests( abap_false ).
+    set_experimental_features( abap_false ).
+    set_max_lines( 500 ).
+    set_adt_jump_enanbled( abap_true ).
+    set_show_default_repo( abap_false ).
+    set_commitmsg_comment_length( c_commitmsg_comment_length_dft ).
+    set_commitmsg_body_size( c_commitmsg_body_size_dft ).
+    set_default_link_hint_key( ).
+    set_icon_scaling( '''' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_default_link_hint_key.
+    " Since #5859 ''f'' is used for "focus filter", we use ''t'' as the new default
+    set_link_hint_key( |t| ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_experimental_features.
+    ms_settings-experimental_features = iv_run.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_icon_scaling.
+    ms_user_settings-icon_scaling = iv_scaling.
+    IF ms_user_settings-icon_scaling NA c_icon_scaling.
+      ms_user_settings-icon_scaling = ''''. " Reset to default
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_link_hints_enabled.
+    ms_user_settings-link_hints_enabled = iv_link_hints_enabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_link_hint_key.
+    ms_user_settings-link_hint_key = iv_link_hint_key.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_max_lines.
+    ms_user_settings-max_lines = iv_lines.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_parallel_proc_disabled.
+    ms_user_settings-parallel_proc_disabled = iv_disable_parallel_proc.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_proxy_authentication.
+    ms_settings-proxy_auth = iv_auth.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_proxy_bypass.
+    ms_settings-proxy_bypass = it_bypass.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_proxy_port.
+    ms_settings-proxy_port = iv_port.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_proxy_url.
+    ms_settings-proxy_url = iv_url.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_run_critical_tests.
+    ms_settings-run_critical_tests = iv_run.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_show_default_repo.
+    ms_user_settings-show_default_repo = iv_show_default_repo.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_ui_theme.
+    ms_user_settings-ui_theme = iv_ui_theme.
+    IF ms_user_settings-ui_theme <> c_ui_theme-default
+        AND ms_user_settings-ui_theme <> c_ui_theme-dark
+        AND ms_user_settings-ui_theme <> c_ui_theme-belize
+        AND ms_user_settings-ui_theme <> c_ui_theme-synced_with_gui.
+      ms_user_settings-ui_theme = c_ui_theme-default. " Reset to default
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_user_settings.
+    ms_user_settings = is_user_settings.
+ 
+    IF ms_user_settings-link_hint_key IS INITIAL.
+      set_default_link_hint_key( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_xml_settings.
+ 
+    DATA: lo_input TYPE REF TO zif_abapgit_xml_input.
+ 
+ 
+    CREATE OBJECT lo_input TYPE zcl_abapgit_xml_input EXPORTING iv_xml = iv_settings_xml.
+ 
+    CLEAR ms_settings.
+ 
+    lo_input->read(
+      EXPORTING
+        iv_name = zcl_abapgit_persistence_db=>c_type_settings
+      CHANGING
+        cg_data = ms_settings ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCX_ABAPGIT_EXCEPTION                   ', '"! abapGit general error
+CLASS zcx_abapgit_exception DEFINITION
+  PUBLIC
+  INHERITING FROM cx_static_check
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES if_t100_message .
+ 
+    CONSTANTS:
+      BEGIN OF c_section_text,
+        cause           TYPE string VALUE \`Cause\`,
+        system_response TYPE string VALUE \`System response\`,
+        what_to_do      TYPE string VALUE \`Procedure\`,
+        sys_admin       TYPE string VALUE \`System administration\`,
+      END OF c_section_text .
+    CONSTANTS:
+      BEGIN OF c_section_token,
+        cause           TYPE string VALUE \`&CAUSE&\`,
+        system_response TYPE string VALUE \`&SYSTEM_RESPONSE&\`,
+        what_to_do      TYPE string VALUE \`&WHAT_TO_DO&\`,
+        sys_admin       TYPE string VALUE \`&SYS_ADMIN&\`,
+      END OF c_section_token .
+ 
+    CLASS-DATA null TYPE string.
+ 
+    DATA msgv1 TYPE symsgv READ-ONLY .
+    DATA msgv2 TYPE symsgv READ-ONLY .
+    DATA msgv3 TYPE symsgv READ-ONLY .
+    DATA msgv4 TYPE symsgv READ-ONLY .
+    DATA mv_longtext TYPE string READ-ONLY.
+    DATA mt_callstack TYPE abap_callstack READ-ONLY.
+    DATA mi_log TYPE REF TO zif_abapgit_log READ-ONLY.
+ 
+    "! Raise exception with text
+    "! @parameter iv_text | Text
+    "! @parameter ix_previous | Previous exception
+    "! @parameter ii_log | Log
+    "! @parameter iv_longtext | Longtext
+    "! @raising zcx_abapgit_exception | Exception
+    CLASS-METHODS raise
+      IMPORTING
+        !iv_text     TYPE clike
+        !ix_previous TYPE REF TO cx_root OPTIONAL
+        !ii_log      TYPE REF TO zif_abapgit_log OPTIONAL
+        !iv_longtext TYPE csequence OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    "! Raise exception with T100 message
+    "! <p>
+    "! Will default to sy-msg* variables. These need to be set right before calling this method.
+    "! </p>
+    "! @parameter iv_msgid | Message ID
+    "! @parameter iv_msgno | Message number
+    "! @parameter iv_msgv1 | Message variable 1
+    "! @parameter iv_msgv2 | Message variable 2
+    "! @parameter iv_msgv3 | Message variable 3
+    "! @parameter iv_msgv4 | Message variable 4
+    "! @parameter ii_log | Log
+    "! @parameter ix_previous | Previous exception
+    "! @parameter iv_longtext | Longtext
+    "! @raising zcx_abapgit_exception | Exception
+    CLASS-METHODS raise_t100
+      IMPORTING
+        VALUE(iv_msgid) TYPE symsgid DEFAULT sy-msgid
+        VALUE(iv_msgno) TYPE symsgno DEFAULT sy-msgno
+        VALUE(iv_msgv1) TYPE symsgv DEFAULT sy-msgv1
+        VALUE(iv_msgv2) TYPE symsgv DEFAULT sy-msgv2
+        VALUE(iv_msgv3) TYPE symsgv DEFAULT sy-msgv3
+        VALUE(iv_msgv4) TYPE symsgv DEFAULT sy-msgv4
+        !ii_log         TYPE REF TO zif_abapgit_log OPTIONAL
+        !ix_previous    TYPE REF TO cx_root OPTIONAL
+        !iv_longtext    TYPE csequence OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    "! Raise with text from previous exception
+    "! @parameter ix_previous | Previous exception
+    "! @parameter iv_longtext | Longtext
+    "! @raising zcx_abapgit_exception | Exception
+    CLASS-METHODS raise_with_text
+      IMPORTING
+        !ix_previous TYPE REF TO cx_root
+        !iv_longtext TYPE csequence OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !textid   LIKE if_t100_message=>t100key OPTIONAL
+        !previous LIKE previous OPTIONAL
+        !log      TYPE REF TO zif_abapgit_log OPTIONAL
+        !msgv1    TYPE symsgv OPTIONAL
+        !msgv2    TYPE symsgv OPTIONAL
+        !msgv3    TYPE symsgv OPTIONAL
+        !msgv4    TYPE symsgv OPTIONAL
+        !longtext TYPE csequence OPTIONAL .
+ 
+    METHODS get_source_position
+        REDEFINITION .
+    METHODS if_message~get_longtext
+        REDEFINITION .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_generic_error_msg TYPE string VALUE \`An error occured (ZCX_ABAPGIT_EXCEPTION)\`.
+ 
+    CLASS-METHODS split_text_to_symsg
+      IMPORTING
+        !iv_text      TYPE string
+      RETURNING
+        VALUE(rs_msg) TYPE symsg .
+    METHODS save_callstack .
+    METHODS itf_to_string
+      IMPORTING
+        !it_itf          TYPE tline_tab
+      RETURNING
+        VALUE(rv_result) TYPE string .
+    METHODS get_t100_longtext_itf
+      RETURNING
+        VALUE(rt_itf) TYPE tline_tab .
+    METHODS remove_empty_section
+      IMPORTING
+        !iv_tabix_from TYPE i
+        !iv_tabix_to   TYPE i
+      CHANGING
+        !ct_itf        TYPE tline_tab .
+    METHODS replace_section_head_with_text
+      CHANGING
+        !cs_itf TYPE tline .
+    CLASS-METHODS remove_newlines_from_string
+      IMPORTING
+        iv_string        TYPE string
+      RETURNING
+        VALUE(rv_result) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcx_abapgit_exception IMPLEMENTATION.
+ 
+ 
+  METHOD constructor ##ADT_SUPPRESS_GENERATION.
+ 
+    super->constructor( previous = previous ).
+ 
+    me->msgv1 = msgv1.
+    me->msgv2 = msgv2.
+    me->msgv3 = msgv3.
+    me->msgv4 = msgv4.
+    mi_log = log.
+    mv_longtext = longtext.
+ 
+    CLEAR me->textid.
+ 
+    IF textid IS INITIAL.
+      if_t100_message~t100key = if_t100_message=>default_textid.
+    ELSE.
+      if_t100_message~t100key = textid.
+    ENDIF.
+ 
+    save_callstack( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_source_position.
+ 
+    FIELD-SYMBOLS: <ls_callstack> LIKE LINE OF mt_callstack.
+ 
+    READ TABLE mt_callstack ASSIGNING <ls_callstack>
+                            INDEX 1.
+    IF sy-subrc = 0.
+      program_name = <ls_callstack>-mainprogram.
+      include_name = <ls_callstack>-include.
+      source_line  = <ls_callstack>-line.
+    ELSE.
+      super->get_source_position(
+        IMPORTING
+          program_name = program_name
+          include_name = include_name
+          source_line  = source_line ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_t100_longtext_itf.
+ 
+    DATA: lv_docu_key TYPE doku_obj.
+ 
+    FIELD-SYMBOLS <lv_msgv> TYPE any.
+ 
+    lv_docu_key = if_t100_message~t100key-msgid && if_t100_message~t100key-msgno.
+ 
+    CALL FUNCTION ''DOCU_GET''
+      EXPORTING
+        id     = ''NA''
+        langu  = sy-langu
+        object = lv_docu_key
+        typ    = ''E''
+      TABLES
+        line   = rt_itf
+      EXCEPTIONS
+        OTHERS = 1.
+ 
+    IF sy-subrc = 0.
+      ASSIGN me->(if_t100_message~t100key-attr1) TO <lv_msgv>.
+      IF sy-subrc = 0.
+        REPLACE ALL OCCURRENCES OF ''&V1&'' IN TABLE rt_itf WITH <lv_msgv>.
+      ENDIF.
+      ASSIGN me->(if_t100_message~t100key-attr2) TO <lv_msgv>.
+      IF sy-subrc = 0.
+        REPLACE ALL OCCURRENCES OF ''&V2&'' IN TABLE rt_itf WITH <lv_msgv>.
+      ENDIF.
+      ASSIGN me->(if_t100_message~t100key-attr3) TO <lv_msgv>.
+      IF sy-subrc = 0.
+        REPLACE ALL OCCURRENCES OF ''&V3&'' IN TABLE rt_itf WITH <lv_msgv>.
+      ENDIF.
+      ASSIGN me->(if_t100_message~t100key-attr4) TO <lv_msgv>.
+      IF sy-subrc = 0.
+        REPLACE ALL OCCURRENCES OF ''&V4&'' IN TABLE rt_itf WITH <lv_msgv>.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD if_message~get_longtext.
+    DATA: lv_preserve_newlines_handled TYPE abap_bool VALUE abap_false.
+ 
+    IF mv_longtext IS NOT INITIAL.
+      result = mv_longtext.
+    ELSEIF if_t100_message~t100key IS NOT INITIAL.
+      result = itf_to_string( get_t100_longtext_itf( ) ).
+    ELSE.
+      result = super->get_longtext( preserve_newlines ).
+      lv_preserve_newlines_handled = abap_true.
+    ENDIF.
+ 
+    IF lv_preserve_newlines_handled = abap_false AND preserve_newlines = abap_false.
+      result = remove_newlines_from_string( result ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD itf_to_string.
+ 
+    CONSTANTS: lc_format_section TYPE string VALUE ''U1''.
+ 
+    DATA:
+      lt_stream      TYPE TABLE OF tdline,
+      lt_string      TYPE TABLE OF string,
+      lv_string      LIKE LINE OF lt_string,
+      lt_itf         TYPE tline_tab,
+      lv_has_content TYPE abap_bool,
+      lv_tabix_from  TYPE syst-tabix,
+      lv_tabix_to    TYPE syst-tabix.
+ 
+    FIELD-SYMBOLS: <ls_itf_section>      TYPE tline,
+                   <ls_itf_section_item> TYPE tline.
+ 
+    lt_itf = it_itf.
+ 
+    " You should remember that we replace the U1 format because
+    " that preserves the section header of longtexts.
+    LOOP AT lt_itf ASSIGNING <ls_itf_section>
+                   WHERE tdformat = lc_format_section.
+ 
+      CLEAR:
+        lv_has_content,
+        lv_tabix_to.
+ 
+      lv_tabix_from = sy-tabix.
+ 
+      LOOP AT lt_itf ASSIGNING <ls_itf_section_item>
+                     FROM sy-tabix + 1.
+ 
+        IF <ls_itf_section_item>-tdformat = lc_format_section.
+          lv_tabix_to = sy-tabix.
+          EXIT.
+        ELSEIF <ls_itf_section_item>-tdline IS NOT INITIAL.
+          lv_has_content = abap_true.
+        ENDIF.
+ 
+      ENDLOOP.
+ 
+      IF lv_has_content = abap_false.
+        remove_empty_section(
+          EXPORTING
+            iv_tabix_from = lv_tabix_from
+            iv_tabix_to   = lv_tabix_to
+          CHANGING
+            ct_itf        = lt_itf ).
+        CONTINUE.
+      ENDIF.
+ 
+      replace_section_head_with_text( CHANGING cs_itf = <ls_itf_section> ).
+ 
+    ENDLOOP.
+ 
+    CALL FUNCTION ''CONVERT_ITF_TO_STREAM_TEXT''
+      EXPORTING
+        lf           = ''X''
+      IMPORTING
+        stream_lines = lt_string
+      TABLES
+        itf_text     = lt_itf
+        text_stream  = lt_stream.
+ 
+    LOOP AT lt_string INTO lv_string.
+      IF sy-tabix = 1.
+        rv_result = lv_string.
+      ELSE.
+        CONCATENATE rv_result lv_string
+                    INTO rv_result
+                    SEPARATED BY cl_abap_char_utilities=>newline.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD raise.
+ 
+    DATA lv_text TYPE string.
+ 
+    IF iv_text IS INITIAL.
+      lv_text = c_generic_error_msg.
+    ELSE.
+      lv_text = iv_text.
+    ENDIF.
+ 
+    split_text_to_symsg( lv_text ).
+ 
+    raise_t100(
+      ii_log      = ii_log
+      ix_previous = ix_previous
+      iv_longtext = iv_longtext ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_t100.
+    DATA: ls_t100_key TYPE scx_t100key.
+ 
+    ls_t100_key-msgid = iv_msgid.
+    ls_t100_key-msgno = iv_msgno.
+    ls_t100_key-attr1 = ''MSGV1''.
+    ls_t100_key-attr2 = ''MSGV2''.
+    ls_t100_key-attr3 = ''MSGV3''.
+    ls_t100_key-attr4 = ''MSGV4''.
+ 
+    IF iv_msgid IS INITIAL.
+      CLEAR ls_t100_key.
+    ENDIF.
+ 
+    RAISE EXCEPTION TYPE zcx_abapgit_exception
+      EXPORTING
+        textid   = ls_t100_key
+        log      = ii_log
+        msgv1    = iv_msgv1
+        msgv2    = iv_msgv2
+        msgv3    = iv_msgv3
+        msgv4    = iv_msgv4
+        previous = ix_previous
+        longtext = iv_longtext.
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_with_text.
+    raise(
+      iv_text     = ix_previous->get_text( )
+      ix_previous = ix_previous
+      iv_longtext = iv_longtext ).
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_empty_section.
+    IF iv_tabix_to BETWEEN iv_tabix_from AND lines( ct_itf ).
+      DELETE ct_itf FROM iv_tabix_from TO iv_tabix_to.
+    ELSE.
+      DELETE ct_itf FROM iv_tabix_from.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_newlines_from_string.
+    rv_result = iv_string.
+ 
+    REPLACE ALL OCCURRENCES OF \` \` && cl_abap_char_utilities=>cr_lf IN rv_result WITH \` \`.
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN rv_result WITH \` \`.
+    REPLACE ALL OCCURRENCES OF \` \` && cl_abap_char_utilities=>newline IN rv_result WITH \` \`.
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN rv_result WITH \` \`.
+  ENDMETHOD.
+ 
+ 
+  METHOD replace_section_head_with_text.
+ 
+    CASE cs_itf-tdline.
+      WHEN c_section_token-cause.
+        cs_itf-tdline = c_section_text-cause.
+      WHEN c_section_token-system_response.
+        cs_itf-tdline = c_section_text-system_response.
+      WHEN c_section_token-what_to_do.
+        cs_itf-tdline = c_section_text-what_to_do.
+      WHEN c_section_token-sys_admin.
+        cs_itf-tdline = c_section_text-sys_admin.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_callstack.
+ 
+    FIELD-SYMBOLS: <ls_callstack> LIKE LINE OF mt_callstack.
+ 
+    CALL FUNCTION ''SYSTEM_CALLSTACK''
+      IMPORTING
+        callstack = mt_callstack.
+ 
+    " You should remember that the first lines are from zcx_abapgit_exception
+    " and are removed so that highest level in the callstack is the position where
+    " the exception is raised.
+    "
+    " For the merged report it''s hard to do that, because zcx_abapgit_exception
+    " isn''t visible in the callstack. Therefore we have to check the Events.
+    LOOP AT mt_callstack ASSIGNING <ls_callstack>.
+ 
+      IF <ls_callstack>-mainprogram CP |ZCX_ABAPGIT_EXCEPTION*| " full
+      OR <ls_callstack>-blockname = \`SAVE_CALLSTACK\` " merged
+      OR <ls_callstack>-blockname = \`CONSTRUCTOR\` " merged
+      OR <ls_callstack>-blockname CP \`RAISE*\`. "merged
+        DELETE TABLE mt_callstack FROM <ls_callstack>.
+      ELSE.
+        EXIT.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_text_to_symsg.
+ 
+    DATA ls_msg TYPE symsg.
+ 
+    cl_message_helper=>set_msg_vars_for_clike( iv_text ).
+    ls_msg-msgv1 = sy-msgv1.
+    ls_msg-msgv2 = sy-msgv2.
+    ls_msg-msgv3 = sy-msgv3.
+    ls_msg-msgv4 = sy-msgv4.
+ 
+    " Set syst using generic error message
+    MESSAGE e001(00) WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4 INTO null.
+ 
+    rs_msg = ls_msg.
+ 
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZCX_ABAPGIT_NOT_FOUND                   ', 'CLASS zcx_abapgit_not_found DEFINITION
+  PUBLIC
+  INHERITING FROM cx_static_check
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !textid   LIKE textid OPTIONAL
+        !previous LIKE previous OPTIONAL.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcx_abapgit_not_found IMPLEMENTATION.
+ 
+ 
+  METHOD constructor ##ADT_SUPPRESS_GENERATION.
+    super->constructor(
+      textid   = textid
+      previous = previous ).
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_DEFINITIONS                 ', 'INTERFACE zif_abapgit_definitions
+  PUBLIC .
+ 
+  TYPES:
+    ty_string_tt TYPE STANDARD TABLE OF string WITH DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_item_signature,
+      obj_type TYPE tadir-object,
+      obj_name TYPE tadir-obj_name,
+      devclass TYPE devclass,
+    END OF ty_item_signature .
+  TYPES:
+    BEGIN OF ty_item.
+      INCLUDE TYPE ty_item_signature.
+  TYPES:
+      srcsystem             TYPE tadir-srcsystem,
+      origlang              TYPE tadir-masterlang,
+      inactive              TYPE abap_bool,
+      abap_language_version TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version,
+    END OF ty_item .
+  TYPES:
+    ty_items_tt TYPE STANDARD TABLE OF ty_item WITH DEFAULT KEY .
+  TYPES:
+    ty_items_ts TYPE SORTED TABLE OF ty_item WITH UNIQUE KEY obj_type obj_name .
+  TYPES:
+    BEGIN OF ty_file_item,
+      file TYPE zif_abapgit_git_definitions=>ty_file,
+      item TYPE ty_item,
+    END OF ty_file_item .
+  TYPES:
+    ty_files_item_tt TYPE STANDARD TABLE OF ty_file_item WITH DEFAULT KEY .
+  TYPES:
+    ty_files_item_by_file_tt TYPE SORTED TABLE OF ty_file_item WITH UNIQUE KEY file-path file-filename.
+  TYPES:
+    ty_yes_no         TYPE c LENGTH 1,
+    ty_yes_no_partial TYPE c LENGTH 1.
+  TYPES:
+    BEGIN OF ty_overwrite.
+      INCLUDE TYPE ty_item.
+  TYPES:
+      state    TYPE c LENGTH 2,
+      action   TYPE i,
+      icon     TYPE icon_d,
+      text     TYPE string,
+      decision TYPE ty_yes_no,
+    END OF ty_overwrite .
+  TYPES:
+    ty_overwrite_tt TYPE STANDARD TABLE OF ty_overwrite WITH DEFAULT KEY
+                              WITH UNIQUE HASHED KEY object_type_and_name
+                                   COMPONENTS obj_type obj_name .
+  TYPES:
+    BEGIN OF ty_requirements,
+      met      TYPE ty_yes_no,
+      decision TYPE ty_yes_no,
+    END OF ty_requirements .
+  TYPES:
+    BEGIN OF ty_dependencies,
+      met TYPE ty_yes_no,
+    END OF ty_dependencies .
+  TYPES:
+    BEGIN OF ty_transport_type,
+      request TYPE trfunction,
+      task    TYPE trfunction,
+    END OF ty_transport_type .
+  TYPES:
+    BEGIN OF ty_transport,
+      required  TYPE abap_bool,
+      transport TYPE trkorr,
+      type      TYPE ty_transport_type,
+    END OF ty_transport .
+  TYPES:
+    BEGIN OF ty_deserialize_checks,
+      overwrite       TYPE ty_overwrite_tt,
+      warning_package TYPE ty_overwrite_tt,
+      requirements    TYPE ty_requirements,
+      dependencies    TYPE ty_dependencies,
+      transport       TYPE ty_transport,
+      customizing     TYPE ty_transport,
+    END OF ty_deserialize_checks .
+  TYPES:
+    BEGIN OF ty_delete_checks,
+      transport TYPE ty_transport,
+    END OF ty_delete_checks .
+  TYPES:
+    BEGIN OF ty_metadata,
+      class_   TYPE string,
+      version TYPE string,
+    END OF ty_metadata .
+  TYPES:
+    BEGIN OF ty_repo_file,
+      path       TYPE string,
+      filename   TYPE string,
+      is_changed TYPE abap_bool,
+      rstate     TYPE zif_abapgit_git_definitions=>ty_item_state,
+      lstate     TYPE zif_abapgit_git_definitions=>ty_item_state,
+    END OF ty_repo_file .
+  TYPES:
+    ty_repo_file_tt TYPE STANDARD TABLE OF ty_repo_file WITH DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_object,
+      sha1    TYPE zif_abapgit_git_definitions=>ty_sha1,
+      type    TYPE zif_abapgit_git_definitions=>ty_type,
+      data    TYPE xstring,
+      adler32 TYPE zif_abapgit_git_definitions=>ty_adler32,
+      index   TYPE i,
+    END OF ty_object .
+  TYPES:
+    ty_objects_tt TYPE STANDARD TABLE OF ty_object WITH DEFAULT KEY
+      WITH NON-UNIQUE SORTED KEY sha COMPONENTS sha1
+      WITH NON-UNIQUE SORTED KEY type COMPONENTS type sha1 .
+  TYPES:
+    BEGIN OF ty_tadir,
+      pgmid      TYPE tadir-pgmid,
+      object     TYPE tadir-object,
+      obj_name   TYPE tadir-obj_name,
+      devclass   TYPE tadir-devclass,
+      korrnum    TYPE tadir-korrnum, " used by ZCL_ABAPGIT_DEPENDENCIES->RESOLVE
+      delflag    TYPE tadir-delflag,
+      genflag    TYPE tadir-genflag,
+      path       TYPE string,
+      srcsystem  TYPE tadir-srcsystem,
+      masterlang TYPE tadir-masterlang,
+    END OF ty_tadir .
+  TYPES:
+    ty_tadir_tt TYPE STANDARD TABLE OF ty_tadir WITH DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_result,
+      obj_type  TYPE tadir-object,
+      obj_name  TYPE tadir-obj_name,
+      inactive  TYPE abap_bool,
+      path      TYPE string,
+      filename  TYPE string,
+      package   TYPE devclass,
+      match     TYPE abap_bool,
+      lstate    TYPE zif_abapgit_git_definitions=>ty_item_state,
+      rstate    TYPE zif_abapgit_git_definitions=>ty_item_state,
+      packmove  TYPE abap_bool,
+      srcsystem TYPE tadir-srcsystem,
+      origlang  TYPE tadir-masterlang,
+    END OF ty_result .
+  TYPES:
+    ty_results_tt TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY
+                       WITH NON-UNIQUE SORTED KEY sec_key
+                       COMPONENTS obj_type obj_name.
+  TYPES:
+    ty_results_ts_path TYPE HASHED TABLE OF ty_result WITH UNIQUE KEY path filename .
+  TYPES:
+    BEGIN OF ty_stage_files,
+      local  TYPE ty_files_item_tt,
+      remote TYPE zif_abapgit_git_definitions=>ty_files_tt,
+      status TYPE ty_results_ts_path,
+    END OF ty_stage_files .
+  TYPES:
+    BEGIN OF ty_tpool.
+      INCLUDE TYPE textpool.
+  TYPES: split TYPE c LENGTH 8.
+  TYPES: END OF ty_tpool .
+  TYPES:
+    ty_tpool_tt TYPE STANDARD TABLE OF ty_tpool WITH DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_obj_attribute,
+      cmpname   TYPE seocmpname,
+      attkeyfld TYPE seokeyfld,
+      attbusobj TYPE seobusobj,
+      exposure  TYPE seoexpose,
+    END OF ty_obj_attribute .
+  TYPES:
+    ty_obj_attribute_tt TYPE STANDARD TABLE OF ty_obj_attribute WITH DEFAULT KEY
+                             WITH NON-UNIQUE SORTED KEY cmpname COMPONENTS cmpname .
+  TYPES:
+    BEGIN OF ty_transport_to_branch,
+      branch_name TYPE string,
+      commit_text TYPE string,
+    END OF ty_transport_to_branch .
+ 
+  TYPES:
+    BEGIN OF ty_diff,
+      patch_flag TYPE abap_bool,
+      new_num    TYPE c LENGTH 6,
+      new        TYPE string,
+      result     TYPE c LENGTH 1,
+      old_num    TYPE c LENGTH 6,
+      old        TYPE string,
+      short      TYPE abap_bool,
+      beacon     TYPE i,
+    END OF ty_diff .
+  TYPES:
+    ty_diffs_tt TYPE STANDARD TABLE OF ty_diff
+                     WITH DEFAULT KEY
+                     WITH NON-UNIQUE SORTED KEY new_num COMPONENTS new_num
+                     WITH NON-UNIQUE SORTED KEY old_num COMPONENTS old_num.
+  TYPES:
+    BEGIN OF ty_count,
+      insert TYPE i,
+      delete TYPE i,
+      update TYPE i,
+    END OF ty_count .
+  TYPES:
+    BEGIN OF ty_ancestor,
+      commit TYPE zif_abapgit_git_definitions=>ty_sha1,
+      tree   TYPE zif_abapgit_git_definitions=>ty_sha1,
+      time   TYPE string,
+      body   TYPE string,
+    END OF ty_ancestor .
+  TYPES:
+    BEGIN OF ty_repo_item,
+      obj_type   TYPE tadir-object,
+      obj_name   TYPE tadir-obj_name,
+      inactive   TYPE abap_bool,
+      sortkey    TYPE i,
+      path       TYPE string,
+      is_dir     TYPE abap_bool,
+      changes    TYPE i,
+      lstate     TYPE zif_abapgit_git_definitions=>ty_item_state,
+      rstate     TYPE zif_abapgit_git_definitions=>ty_item_state,
+      files      TYPE ty_repo_file_tt,
+      changed_by TYPE syuname,
+      transport  TYPE trkorr,
+      packmove   TYPE abap_bool,
+      srcsystem  TYPE tadir-srcsystem,
+      origlang   TYPE tadir-masterlang,
+    END OF ty_repo_item .
+  TYPES:
+    ty_repo_item_tt TYPE STANDARD TABLE OF ty_repo_item WITH DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_s_user_settings,
+      max_lines              TYPE i,
+      adt_jump_enabled       TYPE abap_bool,
+      show_default_repo      TYPE abap_bool,
+      link_hints_enabled     TYPE abap_bool,
+      link_hint_key          TYPE c LENGTH 1,
+      parallel_proc_disabled TYPE abap_bool,
+      icon_scaling           TYPE c LENGTH 1,
+      ui_theme               TYPE string,
+      hide_sapgui_hint       TYPE abap_bool,
+      activate_wo_popup      TYPE abap_bool,
+      label_colors           TYPE string,
+    END OF ty_s_user_settings .
+  TYPES:
+    BEGIN OF ty_list_settings,
+      filter           TYPE string,
+      only_favorites   TYPE abap_bool,
+      show_details     TYPE abap_bool,
+      order_by         TYPE string,
+      order_descending TYPE abap_bool,
+    END OF ty_list_settings.
+  TYPES:
+    ty_dokil_tt TYPE STANDARD TABLE OF dokil
+                         WITH NON-UNIQUE DEFAULT KEY .
+  TYPES:
+    BEGIN OF ty_col_spec,
+      tech_name      TYPE string,
+      display_name   TYPE string,
+      css_class      TYPE string,
+      add_tz         TYPE abap_bool,
+      title          TYPE string,
+      allow_order_by TYPE abap_bool,
+    END OF ty_col_spec,
+    ty_col_spec_tt TYPE STANDARD TABLE OF ty_col_spec
+                      WITH NON-UNIQUE KEY tech_name.
+  TYPES:
+    ty_proxy_bypass_url       TYPE c LENGTH 255,
+    ty_range_proxy_bypass_url TYPE RANGE OF ty_proxy_bypass_url.
+  TYPES:
+    BEGIN OF ty_version,
+      major           TYPE i,
+      minor           TYPE i,
+      patch           TYPE i,
+      prerelase       TYPE string,
+      prerelase_patch TYPE i,
+    END OF ty_version.
+  TYPES:
+    ty_deserialization_step TYPE string.
+  TYPES:
+    ty_deserialization_step_tt TYPE STANDARD TABLE OF ty_deserialization_step
+                                          WITH DEFAULT KEY .
+  TYPES ty_sci_result TYPE c LENGTH 1.
+  CONSTANTS:
+    BEGIN OF c_sci_result,
+      no_run  TYPE ty_sci_result VALUE '''',
+      failed  TYPE ty_sci_result VALUE ''F'',
+      warning TYPE ty_sci_result VALUE ''W'',
+      passed  TYPE ty_sci_result VALUE ''P'',
+    END OF c_sci_result.
+  CONSTANTS:
+    BEGIN OF c_diff,
+      unchanged TYPE c LENGTH 1 VALUE '' '',
+      insert    TYPE c LENGTH 1 VALUE ''I'',
+      delete    TYPE c LENGTH 1 VALUE ''D'',
+      update    TYPE c LENGTH 1 VALUE ''U'',
+    END OF c_diff .
+  CONSTANTS:
+    BEGIN OF c_state, " https://git-scm.com/docs/git-status
+      unchanged TYPE zif_abapgit_git_definitions=>ty_item_state VALUE '''',
+      added     TYPE zif_abapgit_git_definitions=>ty_item_state VALUE ''A'',
+      modified  TYPE zif_abapgit_git_definitions=>ty_item_state VALUE ''M'',
+      deleted   TYPE zif_abapgit_git_definitions=>ty_item_state VALUE ''D'',
+      mixed     TYPE zif_abapgit_git_definitions=>ty_item_state VALUE ''*'',
+    END OF c_state .
+  CONSTANTS c_english TYPE spras VALUE ''E'' ##NO_TEXT.
+  CONSTANTS c_root_dir TYPE string VALUE ''/'' ##NO_TEXT.
+  CONSTANTS c_dot_abapgit TYPE string VALUE ''.abapgit.xml'' ##NO_TEXT.
+  CONSTANTS c_author_regex TYPE string VALUE ''^(.+) <(.*)> (\\d{10})\\s?.\\d{4}$'' ##NO_TEXT.
+  CONSTANTS:
+    BEGIN OF c_action,
+      repo_refresh                  TYPE string VALUE ''repo_refresh'',
+      repo_remove                   TYPE string VALUE ''repo_remove'',
+      repo_settings                 TYPE string VALUE ''repo_settings'',
+      repo_local_settings           TYPE string VALUE ''repo_local_settings'',
+      repo_remote_settings          TYPE string VALUE ''repo_remote_settings'',
+      repo_background               TYPE string VALUE ''repo_background'',
+      repo_infos                    TYPE string VALUE ''repo_infos'',
+      repo_purge                    TYPE string VALUE ''repo_purge'',
+      repo_activate_objects         TYPE string VALUE ''activate_objects'',
+      repo_newonline                TYPE string VALUE ''repo_newonline'',
+      repo_newoffline               TYPE string VALUE ''repo_newoffline'',
+      repo_add_all_obj_to_trans_req TYPE string VALUE ''repo_add_all_obj_to_trans_req'',
+      repo_refresh_checksums        TYPE string VALUE ''repo_refresh_checksums'',
+      repo_toggle_fav               TYPE string VALUE ''repo_toggle_fav'',
+      repo_transport_to_branch      TYPE string VALUE ''repo_transport_to_branch'',
+      repo_syntax_check             TYPE string VALUE ''repo_syntax_check'',
+      repo_code_inspector           TYPE string VALUE ''repo_code_inspector'',
+      repo_open_in_master_lang      TYPE string VALUE ''repo_open_in_master_lang'',
+      repo_log                      TYPE string VALUE ''repo_log'',
+      abapgit_home                  TYPE string VALUE ''abapgit_home'',
+      zip_import                    TYPE string VALUE ''zip_import'',
+      zip_export                    TYPE string VALUE ''zip_export'',
+      zip_export_transport          TYPE string VALUE ''zip_export_transport'',
+      zip_package                   TYPE string VALUE ''zip_package'',
+      zip_transport                 TYPE string VALUE ''zip_transport'',
+      zip_object                    TYPE string VALUE ''zip_object'',
+      rfc_compare                   TYPE string VALUE ''rfc_compare'',
+      performance_test              TYPE string VALUE ''performance_test'',
+      ie_devtools                   TYPE string VALUE ''ie_devtools'',
+      git_pull                      TYPE string VALUE ''git_pull'',
+      git_branch_create             TYPE string VALUE ''git_branch_create'',
+      git_branch_switch             TYPE string VALUE ''git_branch_switch'',
+      git_branch_delete             TYPE string VALUE ''git_branch_delete'',
+      git_branch_merge              TYPE string VALUE ''git_branch_merge'',
+      git_tag_create                TYPE string VALUE ''git_tag_create'',
+      git_tag_delete                TYPE string VALUE ''git_tag_delete'',
+      git_tag_switch                TYPE string VALUE ''git_tag_switch'',
+      git_commit                    TYPE string VALUE ''git_commit'',
+      db_display                    TYPE string VALUE ''db_display'',
+      db_edit                       TYPE string VALUE ''db_edit'',
+      bg_update                     TYPE string VALUE ''bg_update'',
+      go_home                       TYPE string VALUE ''go_home'',
+      go_back                       TYPE string VALUE ''go_back'',
+      go_explore                    TYPE string VALUE ''go_explore'',
+      go_repo                       TYPE string VALUE ''go_repo'',
+      go_db                         TYPE string VALUE ''go_db'',
+      go_background                 TYPE string VALUE ''go_background'',
+      go_background_run             TYPE string VALUE ''go_background_run'',
+      go_repo_diff                  TYPE string VALUE ''go_repo_diff'',
+      go_file_diff                  TYPE string VALUE ''go_fill_diff'',
+      go_stage                      TYPE string VALUE ''go_stage'',
+      go_stage_transport            TYPE string VALUE ''go_stage_transport'',
+      go_commit                     TYPE string VALUE ''go_commit'',
+      go_debuginfo                  TYPE string VALUE ''go_debuginfo'',
+      go_settings                   TYPE string VALUE ''go_settings'',
+      go_settings_personal          TYPE string VALUE ''go_settings_personal'',
+      go_tutorial                   TYPE string VALUE ''go_tutorial'',
+      go_patch                      TYPE string VALUE ''go_patch'',
+      jump                          TYPE string VALUE ''jump'',
+      jump_transport                TYPE string VALUE ''jump_transport'',
+      jump_user                     TYPE string VALUE ''jump_user'',
+      url                           TYPE string VALUE ''url'',
+      goto_source                   TYPE string VALUE ''goto_source'',
+      show_callstack                TYPE string VALUE ''show_callstack'',
+      change_order_by               TYPE string VALUE ''change_order_by'',
+      toggle_favorites              TYPE string VALUE ''toggle_favorites'',
+      goto_message                  TYPE string VALUE ''goto_message'',
+      direction                     TYPE string VALUE ''direction'',
+      documentation                 TYPE string VALUE ''documentation'',
+      changelog                     TYPE string VALUE ''changelog'',
+      homepage                      TYPE string VALUE ''homepage'',
+      sponsor                       TYPE string VALUE ''sponsor'',
+      clipboard                     TYPE string VALUE ''clipboard'',
+      yank_to_clipboard             TYPE string VALUE ''yank_to_clipboard'',
+      show_hotkeys                  TYPE string VALUE ''show_hotkeys'',
+    END OF c_action.
+  CONSTANTS c_spagpa_param_repo_key TYPE c LENGTH 20 VALUE ''REPO_KEY'' ##NO_TEXT.
+  CONSTANTS c_spagpa_param_package TYPE c LENGTH 20 VALUE ''PACKAGE'' ##NO_TEXT.
+  CONSTANTS c_yes TYPE ty_yes_no VALUE ''Y''.
+  CONSTANTS c_no TYPE ty_yes_no VALUE ''N''.
+  CONSTANTS c_partial TYPE ty_yes_no_partial VALUE ''P''.
+ 
+  TYPES:
+    ty_method TYPE c LENGTH 1 .
+  TYPES:
+    BEGIN OF ty_stage,
+      file   TYPE zif_abapgit_git_definitions=>ty_file,
+      method TYPE ty_method,
+      status TYPE ty_result,
+    END OF ty_stage .
+  TYPES:
+    ty_stage_tt TYPE SORTED TABLE OF ty_stage
+          WITH UNIQUE KEY file-path file-filename .
+ 
+  CONSTANTS:
+    BEGIN OF c_method,
+      add    TYPE ty_method VALUE ''A'',
+      rm     TYPE ty_method VALUE ''R'',
+      ignore TYPE ty_method VALUE ''I'',
+      skip   TYPE ty_method VALUE ''?'',
+    END OF c_method .
+ 
+  CONSTANTS:
+    BEGIN OF c_abap_language_version,
+      standard         TYPE c VALUE '''',
+      keyuser          TYPE c VALUE ''2'',
+      clouddevelopment TYPE c VALUE ''5'',
+    END OF c_abap_language_version.
+ 
+  TYPES:
+    ty_sap_langu_tab TYPE STANDARD TABLE OF langu WITH DEFAULT KEY.
+  TYPES:
+    ty_languages TYPE STANDARD TABLE OF laiso WITH DEFAULT KEY.
+  TYPES:
+    BEGIN OF ty_i18n_params,
+      main_language         TYPE sy-langu,
+      main_language_only    TYPE abap_bool,
+      translation_languages TYPE ty_languages,
+      use_lxe               TYPE abap_bool,
+    END OF ty_i18n_params .
+  TYPES ty_trrngtrkor_tt TYPE RANGE OF trkorr.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_ENVIRONMENT                 ', 'INTERFACE zif_abapgit_environment
+  PUBLIC.
+  TYPES:
+    BEGIN OF ty_release_sp,
+      release TYPE c LENGTH 10,
+      sp      TYPE c LENGTH 10,
+    END OF ty_release_sp,
+    ty_system_language_filter TYPE RANGE OF spras.
+ 
+  METHODS is_sap_cloud_platform
+    RETURNING
+      VALUE(rv_result) TYPE abap_bool.
+  METHODS is_merged
+    RETURNING
+      VALUE(rv_result) TYPE abap_bool.
+  METHODS is_repo_object_changes_allowed
+    RETURNING
+      VALUE(rv_result) TYPE abap_bool.
+  METHODS compare_with_inactive
+    RETURNING
+      VALUE(rv_result) TYPE abap_bool.
+  METHODS is_restart_required
+    RETURNING
+      VALUE(rv_result) TYPE abap_bool.
+  METHODS is_sap_object_allowed
+    RETURNING
+      VALUE(rv_allowed) TYPE abap_bool.
+  METHODS get_basis_release
+    RETURNING
+      VALUE(rs_result) TYPE ty_release_sp.
+  METHODS get_system_language_filter
+    RETURNING
+      VALUE(rt_system_language_filter) TYPE ty_system_language_filter.
+  METHODS is_variant_maintenance
+    RETURNING
+      VALUE(rv_is_variant_maintenance) TYPE abap_bool.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('ZIF_ABAPGIT_VERSION                     ', 'INTERFACE zif_abapgit_version
+  PUBLIC .
+ 
+  CONSTANTS c_xml_version TYPE string VALUE ''v1.0.0'' ##NO_TEXT.
+  CONSTANTS c_abap_version TYPE string VALUE ''1.124.0'' ##NO_TEXT.
+ 
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_PACKAGE_FACTORY                      ', 'CLASS cl_package_factory DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS load_package
+      IMPORTING
+        i_package_name TYPE devclass
+        VALUE(i_force_reload) TYPE abap_bool OPTIONAL
+      EXPORTING
+        VALUE(e_package) TYPE REF TO if_package
+      EXCEPTIONS
+        object_not_existing
+        unexpected_error
+        intern_err
+        no_access
+        object_locked_and_modified.
+ 
+    CLASS-METHODS create_new_package
+      IMPORTING
+        VALUE(i_reuse_deleted_object) TYPE abap_bool DEFAULT ''X''
+        !i_suppress_dialog            TYPE abap_bool DEFAULT abap_false
+        !i_suppress_access_permission TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        VALUE(e_package) TYPE REF TO if_package
+      CHANGING
+        c_package_data TYPE any.
+ENDCLASS.
+ 
+CLASS cl_package_factory IMPLEMENTATION.
+  METHOD load_package.
+    RAISE object_not_existing.
+  ENDMETHOD.
+ 
+  METHOD create_new_package.
+* this should never be called in unit tests
+    ASSERT 1 = 2.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_PACKAGE                              ', 'INTERFACE if_package PUBLIC.
+  DATA wbo_korr_flag         TYPE c LENGTH 1 READ-ONLY.
+  DATA software_component    TYPE string READ-ONLY.
+  DATA application_component TYPE string READ-ONLY.
+  DATA transport_layer       TYPE string READ-ONLY.
+  DATA changed_by            TYPE string READ-ONLY.
+ 
+  METHODS save
+    IMPORTING
+      i_transport_request TYPE trkorr OPTIONAL
+    EXCEPTIONS
+      object_invalid
+      object_not_changeable
+      cancelled_in_corr
+      permission_failure
+      unexpected_error
+      intern_err.
+ 
+  METHODS delete
+    EXCEPTIONS
+      object_not_empty
+      object_not_changeable
+      object_invalid
+      intern_err.
+ 
+  METHODS set_changeable
+    IMPORTING
+      i_changeable TYPE abap_bool.
+ 
+  METHODS get_changeable
+    EXPORTING
+      e_changeable TYPE abap.
+ 
+  METHODS get_all_attributes
+    EXPORTING
+      e_package_data TYPE scompkdtln
+    EXCEPTIONS
+      object_invalid
+      package_deleted
+      intern_err.
+ 
+  METHODS save_generic
+    IMPORTING
+      i_save_sign         TYPE paksavsign
+      i_transport_request TYPE trkorr OPTIONAL
+      i_suppress_dialog   TYPE abap_bool DEFAULT '' ''
+    EXPORTING
+      e_transport_request TYPE trkorr
+    EXCEPTIONS
+      cancelled_in_corr
+      permission_failure
+      object_not_changeable
+      object_invalid.
+ 
+  METHODS set_all_attributes
+    IMPORTING
+      i_package_data TYPE any
+      i_data_sign TYPE any
+    EXCEPTIONS
+      object_not_changeable
+      object_deleted
+      object_invalid
+      short_text_missing
+      author_not_existing
+      local_package
+      software_component_invalid
+      layer_invalid
+      korrflag_invalid
+      component_not_existing
+      component_missing
+      authorize_failure
+      prefix_in_use
+      unexpected_error
+      intern_err
+      wrong_mainpack_value
+      superpackage_invalid.
+ 
+  METHODS set_permissions_changeable
+    IMPORTING
+      i_changeable              TYPE abap_bool
+      i_suppress_dialog         TYPE abap_bool DEFAULT abap_false
+      i_suppress_language_check TYPE abap_bool DEFAULT abap_false
+    EXPORTING
+      e_deleted_permissions     TYPE any
+    EXCEPTIONS
+      object_already_changeable
+      object_already_unlocked
+      object_locked_by_other_user
+      object_modified
+      object_just_created
+      object_deleted
+      permission_failure
+      object_invalid
+      unexpected_error.
+ 
+  METHODS get_permissions_to_use
+    EXPORTING
+      e_permissions TYPE tpak_permission_to_use_list
+    EXCEPTIONS
+      object_invalid
+      unexpected_error.
+ 
+  METHODS add_permission_to_use
+    IMPORTING
+      i_pkg_permission_data TYPE any
+    EXPORTING
+      e_pkg_permission TYPE REF TO if_package_permission_to_use
+    EXCEPTIONS
+      object_not_changeable
+      object_access_error
+      object_already_existing
+      object_invalid
+      unexpected_error.
+ENDINTERFACE.
+');`);
+  insert.push(`INSERT INTO t100 ("sprsl", "arbgb", "msgnr", "text") VALUES ('E', '00                  ', '001', '&1&2&3&4                                                                 ');
+INSERT INTO t100 ("sprsl", "arbgb", "msgnr", "text") VALUES ('E', '00                  ', '002', 'needed by abapGit unit test                                              ');
+INSERT INTO t100 ("sprsl", "arbgb", "msgnr", "text") VALUES ('E', '00                  ', '003', 'needed by abapGit unit test                                              ');
+`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_CHAR_UTILITIES                  ', 'CLASS cl_abap_char_utilities DEFINITION PUBLIC.
+  PUBLIC SECTION.
+* https://en.wikipedia.org/wiki/Byte_order_mark, 0xEF,0xBB,0xBF
+    CONSTANTS byte_order_mark_utf8   TYPE x LENGTH 3 VALUE ''EFBBBF''.
+    CONSTANTS byte_order_mark_big    TYPE x LENGTH 2 VALUE ''FEFF''.
+    CONSTANTS byte_order_mark_little TYPE x LENGTH 2 VALUE ''FFFE''.
+    CONSTANTS charsize               TYPE i VALUE 2.
+ 
+    CONSTANTS backspace      TYPE abap_char1 VALUE %_backspace.
+    CONSTANTS cr_lf          TYPE abap_cr_lf VALUE %_cr_lf.
+    CONSTANTS form_feed      TYPE abap_char1 VALUE %_formfeed.
+    CONSTANTS horizontal_tab TYPE abap_char1 VALUE %_horizontal_tab.
+    CONSTANTS newline        TYPE abap_char1 VALUE %_newline.
+    CONSTANTS vertical_tab   TYPE abap_char1 VALUE %_vertical_tab.
+ 
+    CONSTANTS maxchar        TYPE abap_char1 VALUE ''_''.
+    CONSTANTS minchar        TYPE abap_char1 VALUE ''_''.
+ 
+    CLASS-METHODS class_constructor.
+ 
+    CLASS-METHODS get_simple_spaces_for_cur_cp
+      RETURNING
+        VALUE(s_str) TYPE string.
+ENDCLASS.
+ 
+CLASS cl_abap_char_utilities IMPLEMENTATION.
+ 
+  METHOD class_constructor.
+    " WRITE ''@KERNEL cl_abap_char_utilities.backspace.set("\\b");''.
+    " WRITE ''@KERNEL cl_abap_char_utilities.cr_lf.set("\\r\\n");''.
+    " WRITE ''@KERNEL cl_abap_char_utilities.form_feed.set("\\f");''.
+    " WRITE ''@KERNEL cl_abap_char_utilities.horizontal_tab.set("\\t");''.
+    WRITE ''@KERNEL cl_abap_char_utilities.maxchar.set(Buffer.from("FDFF", "hex").toString());''.
+    WRITE ''@KERNEL cl_abap_char_utilities.minchar.set(Buffer.from("0000", "hex").toString());''.
+    " WRITE ''@KERNEL cl_abap_char_utilities.newline.set("\\n");''.
+    " WRITE ''@KERNEL cl_abap_char_utilities.vertical_tab.set("\\v");''.
+  ENDMETHOD.
+ 
+  METHOD get_simple_spaces_for_cur_cp.
+    CONCATENATE \` \` horizontal_tab vertical_tab newline cr_lf(1) form_feed INTO s_str.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_EXCEPTIONAL_VALUES              ', 'CLASS cl_abap_exceptional_values DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS get_max_value
+      IMPORTING
+        in_ TYPE any
+      RETURNING
+        VALUE(out) TYPE REF TO data.
+ 
+    CLASS-METHODS get_min_value
+      IMPORTING
+        in_ TYPE any
+      RETURNING
+        VALUE(out) TYPE REF TO data.
+ENDCLASS.
+ 
+CLASS cl_abap_exceptional_values IMPLEMENTATION.
+ 
+  METHOD get_max_value.
+    DATA lv_type     TYPE c LENGTH 1.
+    DATA lv_length   TYPE i.
+    DATA lv_decimals TYPE i.
+    FIELD-SYMBOLS <out> TYPE any.
+ 
+    DESCRIBE FIELD in_ TYPE lv_type.
+ 
+    CASE lv_type.
+      WHEN cl_abap_typedescr=>typekind_int.
+        GET REFERENCE OF cl_abap_math=>max_int4 INTO out.
+      WHEN cl_abap_typedescr=>typekind_packed.
+        DESCRIBE FIELD in_ LENGTH lv_length IN BYTE MODE DECIMALS lv_decimals.
+ 
+        CREATE DATA out TYPE p LENGTH lv_length DECIMALS lv_decimals.
+        ASSIGN out->* TO <out>.
+ 
+        IF lv_length = 3 AND lv_decimals = 1.
+          <out> = ''9999.9''.
+        ELSEIF lv_length = 4 AND lv_decimals = 1.
+          <out> = ''999999.9''.
+        ELSEIF lv_length = 7 AND lv_decimals = 3.
+          <out> = ''9999999999.999''.
+        ELSE.
+          ASSERT 1 = ''todo''.
+        ENDIF.
+      WHEN OTHERS.
+        WRITE ''@KERNEL console.dir(INPUT);''.
+        ASSERT 1 = ''todo''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD get_min_value.
+    DATA lv_type TYPE c LENGTH 1.
+    FIELD-SYMBOLS <out> TYPE any.
+ 
+    DESCRIBE FIELD in_ TYPE lv_type.
+ 
+    CASE lv_type.
+      WHEN cl_abap_typedescr=>typekind_int.
+        GET REFERENCE OF cl_abap_math=>min_int4 INTO out.
+      WHEN cl_abap_typedescr=>typekind_packed.
+        out = get_max_value( in_ ).
+        ASSIGN out->* TO <out>.
+        <out> = <out> * -1.
+      WHEN OTHERS.
+        WRITE ''@KERNEL console.dir(INPUT);''.
+        ASSERT 1 = ''todo''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_FORMAT                          ', 'CLASS cl_abap_format DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CONSTANTS e_html_attr TYPE i VALUE 5.
+    CONSTANTS e_html_text TYPE i VALUE 4.
+    CONSTANTS e_json_string TYPE i VALUE 24.
+    CONSTANTS e_url TYPE i VALUE 12.
+    CONSTANTS e_xml_attr TYPE i VALUE 1.
+ENDCLASS.
+ 
+CLASS cl_abap_format IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_GZIP                            ', 'CLASS cl_abap_gzip DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS decompress_binary
+      IMPORTING
+        gzip_in     TYPE xstring
+      EXPORTING
+        raw_out     TYPE xstring
+        raw_out_len TYPE i.
+ 
+    CLASS-METHODS compress_binary
+      IMPORTING
+        compress_level TYPE i OPTIONAL
+        raw_in         TYPE xstring
+      EXPORTING
+        gzip_out       TYPE xstring
+        gzip_out_len   TYPE i.
+ 
+    CLASS-METHODS decompress_text
+      IMPORTING
+        gzip_in     TYPE xsequence
+        gzip_in_len TYPE i DEFAULT -1
+        conversion  TYPE abap_encod DEFAULT ''DEFAULT''
+      EXPORTING
+        text_out     TYPE csequence
+        text_out_len TYPE i
+      RAISING
+        cx_parameter_invalid_range
+        cx_sy_buffer_overflow
+        cx_sy_conversion_codepage
+        cx_sy_compression_error.
+ 
+    CLASS-METHODS compress_text
+      IMPORTING
+        text_in        TYPE csequence
+        text_in_len    TYPE i DEFAULT -1
+        compress_level TYPE i DEFAULT 6
+        conversion     TYPE abap_encod DEFAULT ''DEFAULT''
+      EXPORTING
+        gzip_out TYPE xsequence
+        gzip_out_len TYPE i
+      RAISING
+        cx_parameter_invalid_range
+        cx_sy_buffer_overflow
+        cx_sy_conversion_codepage
+        cx_sy_compression_error.
+ 
+    CLASS-METHODS decompress_binary_with_header
+      IMPORTING
+        gzip_in TYPE xstring
+      EXPORTING
+        raw_out TYPE xstring
+      RAISING
+        cx_parameter_invalid
+        cx_sy_buffer_overflow
+        cx_sy_compression_error.
+ENDCLASS.
+ 
+CLASS cl_abap_gzip IMPLEMENTATION.
+  METHOD decompress_binary_with_header.
+    WRITE ''@KERNEL const zlib = await import("zlib");''.
+    WRITE ''@KERNEL const buf = Buffer.from(gzip_in.get(), "hex");''.
+    WRITE ''@KERNEL const decompress = zlib.gunzipSync(buf).toString("hex").toUpperCase();''.
+ 
+    WRITE ''@KERNEL raw_out.set(decompress);''.
+  ENDMETHOD.
+ 
+  METHOD decompress_text.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD compress_text.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD decompress_binary.
+    WRITE ''@KERNEL const zlib = await import("zlib");''.
+    WRITE ''@KERNEL const buf = Buffer.from(gzip_in.get(), "hex");''.
+    WRITE ''@KERNEL const decompress = zlib.inflateRawSync(buf).toString("hex").toUpperCase();''.
+ 
+    WRITE ''@KERNEL raw_out.set(decompress);''.
+    raw_out_len = xstrlen( raw_out ).
+  ENDMETHOD.
+ 
+  METHOD compress_binary.
+* todo, input parameter COMPRESS_LEVEL corresponds to "level" in "options" for Node?
+    WRITE ''@KERNEL const zlib = await import("zlib");''.
+    WRITE ''@KERNEL const buf = Buffer.from(raw_in.get(), "hex");''.
+    WRITE ''@KERNEL const gzi = zlib.deflateRawSync(buf).toString("hex").toUpperCase();''.
+ 
+    WRITE ''@KERNEL gzip_out.set(gzi);''.
+    gzip_out_len = xstrlen( gzip_out ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_ZIP                             ', 'CLASS cl_abap_zip DEFINITION PUBLIC.
+ 
+  PUBLIC SECTION.
+    METHODS add
+      IMPORTING
+        name TYPE string
+        content TYPE xstring.
+ 
+    METHODS save
+      RETURNING
+        VALUE(val) TYPE xstring.
+ 
+    METHODS load
+      IMPORTING
+        zip TYPE xstring.
+ 
+    METHODS get
+      IMPORTING
+        name TYPE string
+      EXPORTING
+        content TYPE xstring.
+ 
+    METHODS delete
+      IMPORTING
+        name  TYPE string OPTIONAL
+        index TYPE i DEFAULT 0
+      EXCEPTIONS
+        zip_index_error.
+ 
+    CLASS-METHODS crc32
+      IMPORTING content TYPE xstring
+      RETURNING VALUE(crc) TYPE i.
+ 
+    TYPES: BEGIN OF t_file,
+             name TYPE string,
+             size TYPE i,
+           END OF t_file.
+    TYPES t_files TYPE STANDARD TABLE OF t_file WITH DEFAULT KEY.
+    DATA files TYPE t_files.
+ 
+  PRIVATE SECTION.
+    TYPES: BEGIN OF ty_contents,
+             name          TYPE string,
+* todo, optimize memory usage, dont store both compressed and original,
+             content       TYPE xstring,
+             compressed    TYPE xstring,
+           END OF ty_contents.
+    DATA mt_contents TYPE STANDARD TABLE OF ty_contents WITH DEFAULT KEY.
+ 
+ENDCLASS.
+ 
+CLASS cl_abap_zip IMPLEMENTATION.
+ 
+  METHOD crc32.
+    DATA lo_stream TYPE REF TO lcl_stream.
+    CREATE OBJECT lo_stream.
+    crc = lo_stream->append_crc(
+      iv_little_endian = abap_false
+      iv_xstring       = content ).
+  ENDMETHOD.
+ 
+  METHOD delete.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get.
+    DATA ls_length   TYPE i.
+    DATA ls_contents LIKE LINE OF mt_contents.
+ 
+    READ TABLE mt_contents WITH KEY name = name INTO ls_contents.
+    cl_abap_gzip=>decompress_binary(
+      EXPORTING
+        gzip_in = ls_contents-compressed
+      IMPORTING
+        raw_out = content
+        raw_out_len = ls_length ).
+  ENDMETHOD.
+ 
+  METHOD add.
+    DATA ls_contents LIKE LINE OF mt_contents.
+ 
+    ls_contents-name = name.
+    ls_contents-content = content.
+    cl_abap_gzip=>compress_binary(
+      EXPORTING
+        raw_in   = content
+      IMPORTING
+        gzip_out = ls_contents-compressed ).
+    INSERT ls_contents INTO TABLE mt_contents.
+  ENDMETHOD.
+ 
+  METHOD load.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD save.
+* https://en.wikipedia.org/wiki/ZIP_(file_format)
+* https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
+ 
+    DATA lo_total    TYPE REF TO lcl_stream.
+    DATA lo_file     TYPE REF TO lcl_stream.
+    DATA lo_central  TYPE REF TO lcl_stream.
+    DATA ls_contents LIKE LINE OF mt_contents.
+    DATA lv_buffer   TYPE xstring.
+    DATA lv_tmp      TYPE xstring.
+    DATA lv_start    TYPE i.
+    DATA lo_conv     TYPE REF TO cl_abap_conv_out_ce.
+ 
+    CREATE OBJECT lo_central.
+    CREATE OBJECT lo_total.
+    lo_conv = cl_abap_conv_out_ce=>create( ).
+ 
+    LOOP AT mt_contents INTO ls_contents.
+      lo_conv->convert( EXPORTING data = ls_contents-name
+                        IMPORTING buffer = lv_buffer ).
+ 
+****************************************
+* LOCAL FILE RECORD
+      CREATE OBJECT lo_file.
+* 0, 4, Local file header signature
+      lo_file->append( ''504B0304'' ).
+* 4, 2, Version needed to extract (minimum)
+      lo_file->append( ''1400'' ).
+* 6, 2, General purpose bit flag
+      lo_file->append( ''0000'' ).
+* 8, 2, Compression method; e.g. none = 0, DEFLATE = 8 (or "0x08 0x00")
+      lo_file->append( ''0800'' ).
+* 10, 2, File last modification time
+      lo_file->append( ''0699'' ). "lo_stream->append_time( sy-uzeit ).
+* 12, 2, File last modification date
+      lo_file->append( ''F856'' ). "lo_stream->append_date( sy-datum ).
+* 14, 4, CRC-32 of uncompressed data
+      lo_file->append_crc(
+        iv_little_endian = abap_true
+        iv_xstring       = ls_contents-content ).
+* 18, 4, Compressed size (or 0xffffffff for ZIP64)
+      lo_file->append_int4( xstrlen( ls_contents-compressed ) ).
+* 22, 4, Uncompressed size (or 0xffffffff for ZIP64)
+      lo_file->append_int4( xstrlen( ls_contents-content ) ).
+* 26, 2, File name length (n)
+      lo_file->append_int2( xstrlen( lv_buffer ) ).
+* 28, 2, Extra field length (m)
+      lo_file->append( ''0000'' ).
+* 30, n, File name
+      lo_file->append( lv_buffer ).
+* 30+n, m, Extra field
+* empty
+* compressed data,
+      lo_file->append( ls_contents-compressed ).
+ 
+****************************************
+* CENTRAL DIRECTORY FILE RECORD
+* 0, 4, Central directory file header signature = 0x02014b50
+      lo_central->append( ''504B0102'' ).
+* 4, 2, Version made by
+      lo_central->append( ''1400'' ).
+ 
+* 6, 2, Version needed to extract (minimum)
+* 8, 2, General purpose bit flag
+* 10, 2, Compression method
+* 12, 2, File last modification time
+* 14, 2, File last modification date
+* 16, 4, CRC-32 of uncompressed data
+* 20, 4, Compressed size (or 0xffffffff for ZIP64)
+* 24, 4, Uncompressed size (or 0xffffffff for ZIP64)
+* 28, 2, File name length (n)
+* 30, 2, Extra field length (m)
+      lv_tmp = lo_file->get( ).
+      lo_central->append( lv_tmp+4(26) ).
+ 
+* 32, 2, File comment length (k)
+      lo_central->append_int2( 0 ).
+* 34, 2, Disk number where file starts (or 0xffff for ZIP64)
+      lo_central->append_int2( 0 ).
+* 36, 2, Internal file attributes
+      lo_central->append_int2( 0 ).
+* 38, 4, External file attributes
+      lo_central->append_int4( 0 ).
+* 42, 4, Relative offset of local file header (or 0xffffffff for ZIP64). This is the number of bytes between the start of the first disk on which the file occurs, and the start of the local file header. This allows software reading the central directory to locate the position of the file inside the ZIP file.
+      lo_central->append_int4( xstrlen( lo_total->get( ) ) ).
+* 46, n, File name
+      lo_central->append( lv_buffer ).
+ 
+      lo_total->append( lo_file->get( ) ).
+    ENDLOOP.
+ 
+    lv_start = xstrlen( lo_total->get( ) ).
+    lo_total->append( lo_central->get( ) ).
+ 
+****************************************
+* END OF CENTRAL DIRECTORY
+* 0, 4, End of central directory signature = 0x06054b50
+    lo_total->append( ''504B0506'' ).
+* 4, 2, Number of this disk (or 0xffff for ZIP64)
+    lo_total->append_int2( 0 ).
+* 6, 2, Disk where central directory starts (or 0xffff for ZIP64)
+    lo_total->append_int2( 0 ).
+* 8, 2, Number of central directory records on this disk (or 0xffff for ZIP64)
+    lo_total->append_int2( lines( mt_contents ) ).
+* 10, 2, Total number of central directory records (or 0xffff for ZIP64)
+    lo_total->append_int2( lines( mt_contents ) ).
+* 12, 4, Size of central directory (bytes) (or 0xffffffff for ZIP64)
+    lo_total->append_int4( xstrlen( lo_central->get( ) ) ).
+* 16, 4, Offset of start of central directory, relative to start of archive (or 0xffffffff for ZIP64)
+    lo_total->append_int4( lv_start ).
+* 20, 2, Comment length (n)
+    lo_total->append_int2( 0 ).
+* 22, n, Comment
+* empty
+ 
+    val = lo_total->get( ).
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_DYN_PRG                         ', 'CLASS cl_abap_dyn_prg DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS check_table_name_str
+      IMPORTING
+        val            TYPE csequence
+        packages       TYPE csequence
+      RETURNING
+        VALUE(val_str) TYPE string
+      RAISING
+        cx_abap_not_a_table
+        cx_abap_not_in_package.
+ 
+    CLASS-METHODS check_whitelist_str
+      IMPORTING
+        val            TYPE csequence
+        whitelist      TYPE csequence
+      RETURNING
+        VALUE(val_str) TYPE string
+      RAISING
+        cx_abap_not_in_whitelist.
+ 
+    CLASS-METHODS quote
+      IMPORTING
+        val        TYPE csequence
+      RETURNING
+        VALUE(out) TYPE string.
+ENDCLASS.
+ 
+CLASS cl_abap_dyn_prg IMPLEMENTATION.
+ 
+  METHOD check_table_name_str.
+* allow everything
+    val_str = val.
+  ENDMETHOD.
+ 
+  METHOD check_whitelist_str.
+* allow everything
+    val_str = val.
+  ENDMETHOD.
+ 
+  METHOD quote.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_ABAP_NOT_A_TABLE                     ', 'CLASS cx_abap_not_a_table DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_abap_not_a_table IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_ABAP_NOT_IN_PACKAGE                  ', 'CLASS cx_abap_not_in_package DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_abap_not_in_package IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_ABAP_NOT_IN_WHITELIST                ', 'CLASS cx_abap_not_in_whitelist DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_abap_not_in_whitelist IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_HMAC                            ', 'CLASS cl_abap_hmac DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS calculate_hmac_for_raw
+      IMPORTING
+        if_algorithm   TYPE string DEFAULT ''SHA1''
+        if_key         TYPE xstring
+        if_data        TYPE xstring
+      EXPORTING
+        ef_hmacstring  TYPE string
+        ef_hmacxstring TYPE xstring
+      RAISING
+        cx_abap_message_digest.
+ 
+    CLASS-METHODS calculate_hmac_for_char
+      IMPORTING
+        if_algorithm     TYPE string DEFAULT ''SHA1''
+        if_key           TYPE xstring
+        if_data          TYPE string
+      EXPORTING
+        ef_hmacstring    TYPE string
+        ef_hmacxstring   TYPE xstring
+        ef_hmacb64string TYPE string
+      RAISING
+        cx_abap_message_digest.
+ENDCLASS.
+ 
+CLASS cl_abap_hmac IMPLEMENTATION.
+  METHOD calculate_hmac_for_raw.
+ 
+    DATA lv_algorithm TYPE string.
+ 
+    CLEAR ef_hmacstring.
+    CLEAR ef_hmacxstring.
+ 
+    lv_algorithm = to_lower( if_algorithm ).
+    ASSERT lv_algorithm = ''sha1'' OR lv_algorithm = ''md5'' OR lv_algorithm = ''sha256''.
+ 
+* todo, this doesnt work in browser?
+    WRITE ''@KERNEL const crypto = await import("crypto");''.
+    IF if_key IS INITIAL.
+      WRITE ''@KERNEL var shasum = crypto.createHash(lv_algorithm.get());''.
+      WRITE ''@KERNEL shasum.update(if_data.get(), "hex");''.
+      WRITE ''@KERNEL ef_hmacstring.set(shasum.digest("hex").toUpperCase());''.
+    ELSE.
+      WRITE ''@KERNEL let hmac = crypto.createHmac(lv_algorithm.get(), Buffer.from(if_key.get(), "hex")).update(if_data.get(), "hex").digest("hex").toUpperCase();''.
+      WRITE ''@KERNEL ef_hmacstring.set(hmac);''.
+    ENDIF.
+ 
+    ef_hmacxstring = ef_hmacstring.
+ 
+  ENDMETHOD.
+ 
+  METHOD calculate_hmac_for_char.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_MESSAGE_DIGEST                  ', 'CLASS cl_abap_message_digest DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS calculate_hash_for_raw
+      IMPORTING
+        if_algorithm   TYPE string DEFAULT ''SHA1''
+        if_data        TYPE xstring
+      EXPORTING
+        ef_hashxstring TYPE xstring
+      RAISING
+        cx_abap_message_digest.
+ 
+    CLASS-METHODS calculate_hash_for_char
+      IMPORTING
+        if_algorithm     TYPE string DEFAULT ''SHA1''
+        if_data          TYPE string
+      EXPORTING
+        ef_hashxstring   TYPE xstring
+        ef_hashb64string TYPE string
+      RAISING
+        cx_abap_message_digest.
+ENDCLASS.
+ 
+CLASS cl_abap_message_digest IMPLEMENTATION.
+  METHOD calculate_hash_for_raw.
+ 
+    DATA lv_algorithm TYPE string.
+ 
+    lv_algorithm = to_lower( if_algorithm ).
+    ASSERT lv_algorithm = ''sha1'' OR lv_algorithm = ''md5'' OR lv_algorithm = ''sha256''.
+ 
+* todo, this doesnt work in browser?
+    WRITE ''@KERNEL const crypto = await import("crypto");''.
+    WRITE ''@KERNEL var shasum = crypto.createHash(lv_algorithm.get());''.
+    WRITE ''@KERNEL shasum.update(if_data.get(), "hex");''.
+    WRITE ''@KERNEL ef_hashxstring.set(shasum.digest("hex").toUpperCase());''.
+ 
+  ENDMETHOD.
+ 
+  METHOD calculate_hash_for_char.
+ 
+    DATA lv_algorithm TYPE string.
+ 
+    lv_algorithm = to_lower( if_algorithm ).
+    ASSERT lv_algorithm = ''sha1'' OR lv_algorithm = ''md5'' OR lv_algorithm = ''sha256''.
+ 
+* todo, this doesnt work in browser?
+    WRITE ''@KERNEL const crypto = await import("crypto");''.
+    WRITE ''@KERNEL var shasum = crypto.createHash(lv_algorithm.get());''.
+    WRITE ''@KERNEL shasum.update(if_data.get());''.
+    WRITE ''@KERNEL ef_hashxstring.set(shasum.digest("hex").toUpperCase());''.
+    WRITE ''@KERNEL ef_hashb64string.set(Buffer.from(ef_hashxstring.get(), "hex").toString("base64"));''.
+ 
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_ABAP_MESSAGE_DIGEST                  ', 'CLASS cx_abap_message_digest DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_abap_message_digest IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_MATH                            ', 'CLASS cl_abap_math DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CONSTANTS min_int4 TYPE i VALUE -2147483648.
+    CONSTANTS max_int4 TYPE i VALUE 2147483647.
+ 
+    CONSTANTS round_ceiling   TYPE i VALUE 0.
+    CONSTANTS round_up        TYPE i VALUE 1.
+    CONSTANTS round_half_up   TYPE i VALUE 2.
+    CONSTANTS round_half_even TYPE i VALUE 3.
+    CONSTANTS round_half_down TYPE i VALUE 4.
+    CONSTANTS round_down      TYPE i VALUE 5.
+    CONSTANTS round_floor     TYPE i VALUE 6.
+ENDCLASS.
+ 
+CLASS cl_abap_math IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_RANDOM                          ', 'CLASS cl_abap_random DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS create
+      IMPORTING
+        seed             TYPE i OPTIONAL
+      RETURNING
+        VALUE(ro_random) TYPE REF TO cl_abap_random.
+ 
+    METHODS int
+      RETURNING
+        VALUE(rv_integer) TYPE i.
+ 
+    METHODS intinrange
+      IMPORTING
+        low               TYPE i
+        high              TYPE i
+      RETURNING
+        VALUE(rv_integer) TYPE i.
+ 
+    CLASS-METHODS seed
+      RETURNING
+        VALUE(rv_seed) TYPE i.
+* todo, use "crypto." instead for generating random numbers? see cl_abap_hmac which also uses crypto
+ENDCLASS.
+ 
+CLASS cl_abap_random IMPLEMENTATION.
+  METHOD create.
+    CREATE OBJECT ro_random.
+  ENDMETHOD.
+ 
+  METHOD int.
+* todo, currently only positive integers are returned
+    WRITE ''@KERNEL rv_integer.set(Math.floor(Math.random() * 2147483647));''.
+  ENDMETHOD.
+ 
+  METHOD seed.
+    WRITE ''@KERNEL rv_seed.set(Math.floor(Math.random() * 2147483647));''.
+  ENDMETHOD.
+ 
+  METHOD intinrange.
+* including "low" and "high" numbers
+    DATA lv_interval TYPE i.
+ 
+    ASSERT high > low.
+    ASSERT low >= 0.
+    lv_interval = high - low + 1.
+    rv_integer = abs( int( ) ).
+    rv_integer = rv_integer MOD lv_interval.
+    rv_integer = rv_integer + low.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_RANDOM_INT                      ', 'CLASS cl_abap_random_int DEFINITION PUBLIC FINAL CREATE PRIVATE.
+  PUBLIC SECTION.
+    CLASS-METHODS create
+      IMPORTING
+        seed TYPE i OPTIONAL
+        min  TYPE i DEFAULT -2147483648
+        max  TYPE i DEFAULT 2147483647
+        PREFERRED PARAMETER seed
+      RETURNING
+        VALUE(prng) TYPE REF TO cl_abap_random_int
+      RAISING
+        cx_abap_random.
+ 
+    METHODS get_next
+      RETURNING
+        VALUE(value) TYPE i.
+ 
+  PRIVATE SECTION.
+    DATA mv_min TYPE i.
+    DATA mv_max TYPE i.
+ENDCLASS.
+ 
+CLASS cl_abap_random_int IMPLEMENTATION.
+  METHOD create.
+    CREATE OBJECT prng.
+    prng->mv_min = min.
+    prng->mv_max = max.
+  ENDMETHOD.
+ 
+  METHOD get_next.
+    value = cl_abap_random=>create( )->intinrange(
+      low  = mv_min
+      high = mv_max ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_ABAP_RANDOM                          ', 'CLASS cx_abap_random DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_abap_random IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_MATCHER                         ', 'CLASS cl_abap_matcher DEFINITION PUBLIC.
+ 
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        pattern TYPE clike
+        ignore_case TYPE abap_bool
+        text TYPE clike.
+ 
+    METHODS find_all
+      RETURNING
+        VALUE(rt_matches) TYPE match_result_tab.
+ 
+    METHODS find_next
+      RETURNING
+        VALUE(found) TYPE abap_bool.
+ 
+    METHODS get_submatch
+      IMPORTING
+        index TYPE i
+      RETURNING
+        VALUE(match) TYPE string.
+ 
+    METHODS get_offset
+      RETURNING
+        VALUE(offset) TYPE i.
+ 
+    METHODS match
+      RETURNING
+        VALUE(success) TYPE abap_bool.
+ 
+    METHODS get_length
+      RETURNING
+        VALUE(length) TYPE i.
+ 
+  PRIVATE SECTION.
+    DATA mt_matches TYPE match_result_tab.
+    DATA mv_index TYPE i.
+    DATA mv_text TYPE string.
+    DATA mv_pattern TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS cl_abap_matcher IMPLEMENTATION.
+ 
+  METHOD constructor.
+    IF ignore_case = abap_true.
+      FIND ALL OCCURRENCES OF REGEX pattern IN text RESULTS mt_matches IGNORING CASE.
+    ELSE.
+      FIND ALL OCCURRENCES OF REGEX pattern IN text RESULTS mt_matches.
+    ENDIF.
+    mv_pattern = pattern.
+    mv_text = text.
+  ENDMETHOD.
+ 
+  METHOD match.
+    FIND ALL OCCURRENCES OF REGEX |^{ mv_pattern }$| IN mv_text.
+    success = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+  METHOD find_all.
+    rt_matches = mt_matches.
+  ENDMETHOD.
+ 
+  METHOD find_next.
+    mv_index = mv_index + 1.
+    READ TABLE mt_matches INDEX mv_index TRANSPORTING NO FIELDS.
+    found = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+  METHOD get_submatch.
+    DATA ls_match LIKE LINE OF mt_matches.
+    DATA ls_submatch LIKE LINE OF ls_match-submatches.
+    READ TABLE mt_matches INDEX mv_index INTO ls_match.
+    READ TABLE ls_match-submatches INDEX index INTO ls_submatch.
+    IF sy-subrc = 0.
+      match = mv_text+ls_submatch-offset(ls_submatch-length).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD get_offset.
+    DATA ls_match LIKE LINE OF mt_matches.
+    READ TABLE mt_matches INDEX mv_index INTO ls_match.
+    offset = ls_match-offset.
+  ENDMETHOD.
+ 
+  METHOD get_length.
+    DATA ls_match LIKE LINE OF mt_matches.
+    READ TABLE mt_matches INDEX mv_index INTO ls_match.
+    length = ls_match-length.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_REGEX                           ', 'CLASS cl_abap_regex DEFINITION PUBLIC.
+ 
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        pattern     TYPE clike
+        ignore_case TYPE abap_bool DEFAULT abap_false.
+ 
+    METHODS create_matcher
+      IMPORTING
+        text              TYPE clike
+      RETURNING
+        VALUE(ro_matcher) TYPE REF TO cl_abap_matcher.
+ 
+    CLASS-METHODS create_pcre
+      IMPORTING
+        pattern      TYPE clike
+        ignore_case  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(regex) TYPE REF TO cl_abap_regex.
+ 
+  PRIVATE SECTION.
+    DATA mv_pattern     TYPE string.
+    DATA mv_ignore_case TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+CLASS cl_abap_regex IMPLEMENTATION.
+ 
+  METHOD constructor.
+    mv_pattern = pattern.
+    mv_ignore_case = ignore_case.
+  ENDMETHOD.
+ 
+  METHOD create_pcre.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD create_matcher.
+    CREATE OBJECT ro_matcher
+      EXPORTING
+        pattern     = mv_pattern
+        ignore_case = mv_ignore_case
+        text        = text.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SQL_RESULT_SET                       ', 'CLASS cl_sql_result_set DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    METHODS set_param
+      IMPORTING
+        data_ref TYPE REF TO data
+      RAISING
+        cx_parameter_invalid.
+ 
+    METHODS next
+      RETURNING
+        VALUE(rows_ret) TYPE i
+      RAISING
+        cx_sql_exception.
+ 
+    METHODS close.
+  PRIVATE SECTION.
+    DATA mv_magic TYPE x LENGTH 1.
+    DATA mv_index TYPE i.
+    DATA mv_ref   TYPE REF TO data.
+ENDCLASS.
+ 
+CLASS cl_sql_result_set IMPLEMENTATION.
+ 
+  METHOD set_param.
+    mv_ref = data_ref.
+  ENDMETHOD.
+ 
+  METHOD next.
+* todo, more work needed here
+ 
+    DATA lv_total TYPE i.
+    DATA lv_value TYPE string.
+ 
+    WRITE ''@KERNEL lv_total.set(this.mv_magic.length);''.
+*    WRITE ''@KERNEL console.dir(this.mv_magic);''.
+    WRITE ''@KERNEL const current = this.mv_magic[this.mv_index.get()];''.
+    WRITE ''@KERNEL lv_value.set(Object.values(current)[0]);''.
+ 
+    mv_ref->* = lv_value.
+ 
+    mv_index = mv_index + 1.
+    rows_ret = lv_total - mv_index.
+  ENDMETHOD.
+ 
+  METHOD close.
+* nothing here,
+    RETURN.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SQL_STATEMENT                        ', 'CLASS cl_sql_statement DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    METHODS execute_update
+      IMPORTING
+        statement TYPE string
+      RAISING
+        cx_sql_exception.
+ 
+    METHODS execute_query
+      IMPORTING
+        statement         TYPE string
+      RETURNING
+        VALUE(result_set) TYPE REF TO cl_sql_result_set
+      RAISING
+        cx_sql_exception.
+ENDCLASS.
+ 
+CLASS cl_sql_statement IMPLEMENTATION.
+ 
+  METHOD execute_update.
+ 
+    DATA lv_sql_message TYPE string.
+ 
+    ASSERT statement IS NOT INITIAL.
+ 
+    WRITE ''@KERNEL if (abap.context.databaseConnections["DEFAULT"] === undefined) {''.
+    lv_sql_message = ''not connected to db''.
+    WRITE ''@KERNEL }''.
+    IF lv_sql_message IS NOT INITIAL.
+      RAISE EXCEPTION TYPE cx_sql_exception.
+    ENDIF.
+ 
+    WRITE ''@KERNEL try {''.
+    WRITE ''@KERNEL   await abap.context.databaseConnections["DEFAULT"].execute(statement.get());''.
+    WRITE ''@KERNEL } catch(e) {''.
+    WRITE ''@KERNEL   lv_sql_message.set(e + "");''.
+    WRITE ''@KERNEL }''.
+    IF lv_sql_message IS NOT INITIAL.
+      RAISE EXCEPTION TYPE cx_sql_exception.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD execute_query.
+    DATA lv_sql_message TYPE string.
+ 
+    ASSERT statement IS NOT INITIAL.
+ 
+    WRITE ''@KERNEL if (abap.context.databaseConnections["DEFAULT"] === undefined) {''.
+    lv_sql_message = ''not connected to db''.
+    WRITE ''@KERNEL }''.
+    IF lv_sql_message IS NOT INITIAL.
+      RAISE EXCEPTION TYPE cx_sql_exception.
+    ENDIF.
+ 
+    CREATE OBJECT result_set.
+ 
+    WRITE ''@KERNEL try {''.
+    WRITE ''@KERNEL   const res = await abap.context.databaseConnections["DEFAULT"].select({select: statement.get()});''.
+*    WRITE ''@KERNEL   console.dir(res.rows);''.
+    WRITE ''@KERNEL   result_set.get().mv_magic = res.rows;''.
+    WRITE ''@KERNEL } catch(e) {''.
+    WRITE ''@KERNEL   lv_sql_message.set(e + "");''.
+    WRITE ''@KERNEL }''.
+    IF lv_sql_message IS NOT INITIAL.
+      RAISE EXCEPTION TYPE cx_sql_exception.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SQL_EXCEPTION                        ', 'CLASS cx_sql_exception DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sql_exception IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_BCS                                  ', 'CLASS cl_bcs DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS create_persistent
+      RETURNING
+        VALUE(result) TYPE REF TO cl_bcs
+      RAISING
+        cx_bcs.
+ 
+    METHODS add_recipient
+      IMPORTING
+        i_recipient  TYPE REF TO if_recipient_bcs
+        i_express    TYPE abap_bool OPTIONAL
+        i_copy       TYPE abap_bool OPTIONAL
+        i_blind_copy TYPE abap_bool OPTIONAL
+        i_no_forward TYPE abap_bool OPTIONAL
+      RAISING
+        cx_bcs.
+ 
+    METHODS set_sender
+      IMPORTING
+        i_sender TYPE REF TO if_sender_bcs
+      RAISING
+        cx_bcs.
+ 
+    METHODS set_status_attributes
+      IMPORTING
+        i_requested_status TYPE any.
+ 
+    METHODS set_document
+      IMPORTING
+        i_document TYPE REF TO if_document_bcs
+      RAISING
+        cx_bcs.
+ 
+    METHODS set_message_subject
+      IMPORTING
+        ip_subject TYPE string
+      RAISING
+        cx_bcs.
+ 
+    METHODS send
+      IMPORTING
+        i_with_error_screen TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(result) TYPE abap_bool
+      RAISING
+        cx_bcs.
+ 
+    METHODS set_send_immediately
+      IMPORTING
+        i_send_immediately TYPE abap_bool
+      RAISING
+        cx_bcs.
+ENDCLASS.
+ 
+CLASS cl_bcs IMPLEMENTATION.
+ 
+  METHOD set_document.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_status_attributes.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_send_immediately.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_message_subject.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_sender.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD send.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD create_persistent.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD add_recipient.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_BCS_CONVERT                          ', 'CLASS cl_bcs_convert DEFINITION PUBLIC.
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS string_to_soli
+      IMPORTING
+        iv_string      TYPE string
+      RETURNING
+        VALUE(et_soli) TYPE soli_tab.
+ 
+    CLASS-METHODS xstring_to_solix
+      IMPORTING
+        iv_xstring TYPE xstring
+      RETURNING
+        VALUE(et_solix) TYPE solix_tab.
+ 
+ENDCLASS.
+ 
+CLASS cl_bcs_convert IMPLEMENTATION.
+ 
+  METHOD string_to_soli.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD xstring_to_solix.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_CAM_ADDRESS_BCS                      ', 'CLASS cl_cam_address_bcs DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    INTERFACES if_recipient_bcs.
+    INTERFACES if_sender_bcs.
+ 
+    CLASS-METHODS create_internet_address
+      IMPORTING
+        i_address_string TYPE clike
+        i_address_name   TYPE clike OPTIONAL
+        i_incl_sapuser   TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(result)    TYPE REF TO cl_cam_address_bcs
+      RAISING
+        cx_bcs.
+ 
+ENDCLASS.
+ 
+CLASS cl_cam_address_bcs IMPLEMENTATION.
+ 
+  METHOD create_internet_address.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_DOCUMENT_BCS                         ', 'CLASS cl_document_bcs DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    INTERFACES if_document_bcs.
+ 
+    CLASS-METHODS create_document
+      IMPORTING
+        i_type    TYPE string
+        i_subject TYPE clike
+        i_text    TYPE any OPTIONAL
+        i_length  TYPE i OPTIONAL
+      RETURNING
+        VALUE(result) TYPE REF TO cl_document_bcs
+      RAISING
+        cx_bcs.
+ 
+    METHODS add_attachment
+      IMPORTING
+        i_attachment_type    TYPE string
+        i_attachment_subject TYPE string
+        i_attachment_size    TYPE i OPTIONAL
+        i_att_content_text   TYPE any OPTIONAL
+        i_att_content_hex    TYPE any OPTIONAL
+        i_attachment_header  TYPE soli_tab OPTIONAL
+      RAISING
+        cx_bcs.
+ 
+ENDCLASS.
+ 
+CLASS cl_document_bcs IMPLEMENTATION.
+ 
+  METHOD create_document.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD add_attachment.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_BCS                                  ', 'CLASS cx_bcs DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_bcs IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_DOCUMENT_BCS                         ', 'INTERFACE if_document_bcs PUBLIC.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_RECIPIENT_BCS                        ', 'INTERFACE if_recipient_bcs PUBLIC.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SENDER_BCS                           ', 'INTERFACE if_sender_bcs PUBLIC.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_I18N_LANGUAGES                       ', 'CLASS cl_i18n_languages DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS sap1_to_sap2
+      IMPORTING
+        im_lang_sap1        TYPE sy-langu
+      RETURNING
+        VALUE(re_lang_sap2) TYPE string
+      EXCEPTIONS
+        no_assignment.
+ 
+    CLASS-METHODS sap2_to_sap1
+      IMPORTING
+        im_lang_sap2 TYPE laiso
+      RETURNING
+        VALUE(re_lang_sap1) TYPE sy-langu
+      EXCEPTIONS
+        no_assignment.
+ 
+    CLASS-METHODS sap2_to_iso639_1
+      IMPORTING
+        im_lang_sap2   TYPE laiso
+      EXPORTING
+        ex_lang_iso639 TYPE string
+        ex_country     TYPE land1
+      EXCEPTIONS
+        no_assignment.
+ENDCLASS.
+ 
+CLASS cl_i18n_languages IMPLEMENTATION.
+  METHOD sap2_to_sap1.
+    CASE to_upper( im_lang_sap2 ).
+      WHEN ''SR''.
+        re_lang_sap1 = ''0''.
+      WHEN ''ZH''.
+        re_lang_sap1 = ''1''.
+      WHEN ''TH''.
+        re_lang_sap1 = ''2''.
+      WHEN ''KO''.
+        re_lang_sap1 = ''3''.
+      WHEN ''RO''.
+        re_lang_sap1 = ''4''.
+      WHEN ''SL''.
+        re_lang_sap1 = ''5''.
+      WHEN ''HR''.
+        re_lang_sap1 = ''6''.
+      WHEN ''MS''.
+        re_lang_sap1 = ''7''.
+      WHEN ''UK''.
+        re_lang_sap1 = ''8''.
+      WHEN ''ET''.
+        re_lang_sap1 = ''9''.
+      WHEN ''AR''.
+        re_lang_sap1 = ''A''.
+      WHEN ''HE''.
+        re_lang_sap1 = ''B''.
+      WHEN ''CS''.
+        re_lang_sap1 = ''C''.
+      WHEN ''DE''.
+        re_lang_sap1 = ''D''.
+      WHEN ''EN''.
+        re_lang_sap1 = ''E''.
+      WHEN ''FR''.
+        re_lang_sap1 = ''F''.
+      WHEN ''EL''.
+        re_lang_sap1 = ''G''.
+      WHEN ''HU''.
+        re_lang_sap1 = ''H''.
+      WHEN ''IT''.
+        re_lang_sap1 = ''I''.
+      WHEN ''JA''.
+        re_lang_sap1 = ''J''.
+      WHEN ''DA''.
+        re_lang_sap1 = ''K''.
+      WHEN ''PL''.
+        re_lang_sap1 = ''L''.
+      WHEN ''ZF''.
+        re_lang_sap1 = ''M''.
+      WHEN ''NL''.
+        re_lang_sap1 = ''N''.
+      WHEN ''NO''.
+        re_lang_sap1 = ''O''.
+      WHEN ''PT''.
+        re_lang_sap1 = ''P''.
+      WHEN ''SK''.
+        re_lang_sap1 = ''Q''.
+      WHEN ''RU''.
+        re_lang_sap1 = ''R''.
+      WHEN ''ES''.
+        re_lang_sap1 = ''S''.
+      WHEN ''TR''.
+        re_lang_sap1 = ''T''.
+      WHEN ''FI''.
+        re_lang_sap1 = ''U''.
+      WHEN ''SV''.
+        re_lang_sap1 = ''V''.
+      WHEN ''BG''.
+        re_lang_sap1 = ''W''.
+      WHEN ''LT''.
+        re_lang_sap1 = ''X''.
+      WHEN ''LV''.
+        re_lang_sap1 = ''Y''.
+      WHEN ''Z1''.
+        re_lang_sap1 = ''Z''.
+      WHEN ''AF''.
+        re_lang_sap1 = ''a''.
+      WHEN ''IS''.
+        re_lang_sap1 = ''b''.
+      WHEN ''CA''.
+        re_lang_sap1 = ''c''.
+      WHEN ''SH''.
+        re_lang_sap1 = ''d''.
+      WHEN ''ID''.
+        re_lang_sap1 = ''i''.
+      WHEN ''1Q''.
+        re_lang_sap1 = ''''.
+      WHEN OTHERS.
+        RAISE no_assignment.
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD sap1_to_sap2.
+* todo, ideally this should look up in a database table first
+* if there is no database attached, fallback to the CASE below
+    CASE im_lang_sap1.
+      WHEN ''0''.
+        re_lang_sap2 = ''SR''.
+      WHEN ''1''.
+        re_lang_sap2 = ''ZH''.
+      WHEN ''2''.
+        re_lang_sap2 = ''TH''.
+      WHEN ''3''.
+        re_lang_sap2 = ''KO''.
+      WHEN ''4''.
+        re_lang_sap2 = ''RO''.
+      WHEN ''5''.
+        re_lang_sap2 = ''SL''.
+      WHEN ''6''.
+        re_lang_sap2 = ''HR''.
+      WHEN ''7''.
+        re_lang_sap2 = ''MS''.
+      WHEN ''8''.
+        re_lang_sap2 = ''UK''.
+      WHEN ''9''.
+        re_lang_sap2 = ''ET''.
+      WHEN ''A''.
+        re_lang_sap2 = ''AR''.
+      WHEN ''B''.
+        re_lang_sap2 = ''HE''.
+      WHEN ''C''.
+        re_lang_sap2 = ''CS''.
+      WHEN ''D''.
+        re_lang_sap2 = ''DE''.
+      WHEN ''E''.
+        re_lang_sap2 = ''EN''.
+      WHEN ''F''.
+        re_lang_sap2 = ''FR''.
+      WHEN ''G''.
+        re_lang_sap2 = ''EL''.
+      WHEN ''H''.
+        re_lang_sap2 = ''HU''.
+      WHEN ''I''.
+        re_lang_sap2 = ''IT''.
+      WHEN ''J''.
+        re_lang_sap2 = ''JA''.
+      WHEN ''K''.
+        re_lang_sap2 = ''DA''.
+      WHEN ''L''.
+        re_lang_sap2 = ''PL''.
+      WHEN ''M''.
+        re_lang_sap2 = ''ZF''.
+      WHEN ''N''.
+        re_lang_sap2 = ''NL''.
+      WHEN ''O''.
+        re_lang_sap2 = ''NO''.
+      WHEN ''P''.
+        re_lang_sap2 = ''PT''.
+      WHEN ''Q''.
+        re_lang_sap2 = ''SK''.
+      WHEN ''R''.
+        re_lang_sap2 = ''RU''.
+      WHEN ''S''.
+        re_lang_sap2 = ''ES''.
+      WHEN ''T''.
+        re_lang_sap2 = ''TR''.
+      WHEN ''U''.
+        re_lang_sap2 = ''FI''.
+      WHEN ''V''.
+        re_lang_sap2 = ''SV''.
+      WHEN ''W''.
+        re_lang_sap2 = ''BG''.
+      WHEN ''X''.
+        re_lang_sap2 = ''LT''.
+      WHEN ''Y''.
+        re_lang_sap2 = ''LV''.
+      WHEN ''Z''.
+        re_lang_sap2 = ''Z1''.
+      WHEN ''a''.
+        re_lang_sap2 = ''AF''.
+      WHEN ''b''.
+        re_lang_sap2 = ''IS''.
+      WHEN ''c''.
+        re_lang_sap2 = ''CA''.
+      WHEN ''d''.
+        re_lang_sap2 = ''SH''.
+      WHEN ''i''.
+        re_lang_sap2 = ''ID''.
+      WHEN OTHERS.
+        RAISE no_assignment.
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD sap2_to_iso639_1.
+    CASE im_lang_sap2.
+      WHEN ''SR''.
+        ex_lang_iso639 = ''sr''.
+      WHEN ''ZH''.
+        ex_lang_iso639 = ''zh''.
+        ex_country = ''CN''.
+      WHEN ''TH''.
+        ex_lang_iso639 = ''th''.
+      WHEN ''KO''.
+        ex_lang_iso639 = ''ko''.
+        ex_country = ''KR''.
+      WHEN ''RO''.
+        ex_lang_iso639 = ''ro''.
+        ex_country = ''RO''.
+      WHEN ''SL''.
+        ex_lang_iso639 = ''sl''.
+      WHEN ''HR''.
+        ex_lang_iso639 = ''hr''.
+      WHEN ''MS''.
+        ex_lang_iso639 = ''ms''.
+        ex_country = ''MY''.
+      WHEN ''UK''.
+        ex_lang_iso639 = ''uk''.
+      WHEN ''ET''.
+        ex_lang_iso639 = ''et''.
+      WHEN ''AR''.
+        ex_lang_iso639 = ''ar''.
+        ex_country = ''SA''.
+      WHEN ''HE''.
+        ex_lang_iso639 = ''he''.
+      WHEN ''CS''.
+        ex_lang_iso639 = ''cs''.
+      WHEN ''DE''.
+        ex_lang_iso639 = ''de''.
+        ex_country = ''DE''.
+      WHEN ''EN''.
+        ex_lang_iso639 = ''en''.
+        ex_country = ''US''.
+      WHEN ''FR''.
+        ex_lang_iso639 = ''fr''.
+        ex_country = ''FR''.
+      WHEN ''EL''.
+        ex_lang_iso639 = ''el''.
+      WHEN ''HU''.
+        ex_lang_iso639 = ''hu''.
+      WHEN ''IT''.
+        ex_lang_iso639 = ''it''.
+        ex_country = ''IT''.
+      WHEN ''JA''.
+        ex_lang_iso639 = ''ja''.
+      WHEN ''DA''.
+        ex_lang_iso639 = ''da''.
+      WHEN ''PL''.
+        ex_lang_iso639 = ''pl''.
+      WHEN ''ZF''.
+        ex_lang_iso639 = ''zh''.
+        ex_country = ''TW''.
+      WHEN ''NL''.
+        ex_lang_iso639 = ''nl''.
+        ex_country = ''NL''.
+      WHEN ''NO''.
+        ex_lang_iso639 = ''no''.
+      WHEN ''PT''.
+        ex_lang_iso639 = ''pt''.
+        ex_country = ''BR''.
+      WHEN ''SK''.
+        ex_lang_iso639 = ''sk''.
+      WHEN ''RU''.
+        ex_lang_iso639 = ''ru''.
+        ex_country = ''RU''.
+      WHEN ''ES''.
+        ex_lang_iso639 = ''es''.
+        ex_country = ''ES''.
+      WHEN ''TR''.
+        ex_lang_iso639 = ''tr''.
+      WHEN ''FI''.
+        ex_lang_iso639 = ''fi''.
+      WHEN ''SV''.
+        ex_lang_iso639 = ''sv''.
+      WHEN ''BG''.
+        ex_lang_iso639 = ''bg''.
+      WHEN ''LT''.
+        ex_lang_iso639 = ''lt''.
+      WHEN ''LV''.
+        ex_lang_iso639 = ''lv''.
+      WHEN ''AF''.
+        ex_lang_iso639 = ''af''.
+      WHEN ''IS''.
+        ex_lang_iso639 = ''is''.
+      WHEN ''CA''.
+        ex_lang_iso639 = ''ca''.
+      WHEN ''SH''.
+        ex_lang_iso639 = ''sr''.
+      WHEN ''ID''.
+        ex_lang_iso639 = ''id''.
+      WHEN OTHERS.
+        RAISE no_assignment.
+    ENDCASE.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_MESSAGE_HELPER                       ', 'CLASS cl_message_helper DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS set_msg_vars_for_if_msg
+      IMPORTING
+        text TYPE REF TO if_message
+      EXPORTING
+        VALUE(string) TYPE string.
+ 
+    CLASS-METHODS set_msg_vars_for_clike
+      IMPORTING
+        text TYPE clike.
+ 
+    CLASS-METHODS get_text_for_message
+      IMPORTING
+        text TYPE REF TO if_message
+      RETURNING
+        VALUE(result) TYPE string.
+ 
+    CLASS-METHODS check_msg_kind
+      IMPORTING
+        msg     TYPE REF TO object
+      EXPORTING
+        t100key TYPE scx_t100key
+        textid  TYPE sotr_conc.
+  PRIVATE SECTION.
+    CONSTANTS gc_fallback TYPE string VALUE ''An exception was raised.''.
+ENDCLASS.
+ 
+CLASS cl_message_helper IMPLEMENTATION.
+ 
+  METHOD get_text_for_message.
+ 
+    DATA lv_msgid LIKE sy-msgid.
+    DATA lv_msgno LIKE sy-msgno.
+    DATA lv_msgv1 LIKE sy-msgv1.
+    DATA lv_msgv2 LIKE sy-msgv2.
+    DATA lv_msgv3 LIKE sy-msgv3.
+    DATA lv_msgv4 LIKE sy-msgv4.
+ 
+* when the transpiler can do more, the below can be implemented in ABAP instead of using KERNEL,
+    WRITE ''@KERNEL if (text.get()?.if_t100_message$t100key === undefined) { result.set(this.gc_fallback); return result; };''.
+ 
+    WRITE ''@KERNEL lv_msgid.set(text.get().if_t100_message$t100key.get().msgid);''.
+    WRITE ''@KERNEL lv_msgno.set(text.get().if_t100_message$t100key.get().msgno);''.
+    WRITE ''@KERNEL lv_msgv1.set(text.get()[text.get().if_t100_message$t100key.get().attr1.get().toLowerCase().replace("~", "$").trimEnd()] ? text.get()[text.get().if_t100_message$t100key.get().attr1.get().toLowerCase().replace("~", "$").trimEnd()].get() : "");''.
+    WRITE ''@KERNEL lv_msgv2.set(text.get()[text.get().if_t100_message$t100key.get().attr2.get().toLowerCase().replace("~", "$").trimEnd()] ? text.get()[text.get().if_t100_message$t100key.get().attr2.get().toLowerCase().replace("~", "$").trimEnd()].get() : "");''.
+    WRITE ''@KERNEL lv_msgv3.set(text.get()[text.get().if_t100_message$t100key.get().attr3.get().toLowerCase().replace("~", "$").trimEnd()] ? text.get()[text.get().if_t100_message$t100key.get().attr3.get().toLowerCase().replace("~", "$").trimEnd()].get() : "");''.
+    WRITE ''@KERNEL lv_msgv4.set(text.get()[text.get().if_t100_message$t100key.get().attr4.get().toLowerCase().replace("~", "$").trimEnd()] ? text.get()[text.get().if_t100_message$t100key.get().attr4.get().toLowerCase().replace("~", "$").trimEnd()].get() : "");''.
+ 
+    MESSAGE ID lv_msgid TYPE ''I'' NUMBER lv_msgno WITH lv_msgv1 lv_msgv2 lv_msgv3 lv_msgv4 INTO result.
+ 
+  ENDMETHOD.
+ 
+  METHOD set_msg_vars_for_if_msg.
+    IF text IS INITIAL.
+      RAISE EXCEPTION TYPE cx_sy_message_illegal_text.
+    ENDIF.
+ 
+* first try if_t100_message
+    string = get_text_for_message( text ).
+    IF string <> gc_fallback.
+      CLEAR sy-msgty.
+      RETURN.
+    ENDIF.
+ 
+    string = text->get_text( ).
+    IF string IS INITIAL.
+      ASSERT 1 = ''todo''.
+    ENDIF.
+ 
+    set_msg_vars_for_clike( string ).
+  ENDMETHOD.
+ 
+  METHOD set_msg_vars_for_clike.
+ 
+    DATA lv_char200 TYPE c LENGTH 200.
+ 
+    " move to char200 to avoid checking out of bound
+    lv_char200 = text.
+ 
+    sy-msgid = ''00''.
+    sy-msgno = ''001''.
+ 
+    sy-msgv1 = lv_char200.
+    IF lv_char200+49(1) = space.
+      lv_char200 = lv_char200+49.
+    ELSE.
+      lv_char200 = text+50.
+    ENDIF.
+ 
+    sy-msgv2 = lv_char200.
+    IF lv_char200+49(1) = space.
+      lv_char200 = lv_char200+49.
+    ELSE.
+      lv_char200 = lv_char200+50.
+    ENDIF.
+ 
+    sy-msgv3 = lv_char200.
+    IF lv_char200+49(1) = space.
+      lv_char200 = lv_char200+49.
+    ELSE.
+      lv_char200 = lv_char200+50.
+    ENDIF.
+ 
+    sy-msgv4 = lv_char200.
+ 
+  ENDMETHOD.
+ 
+  METHOD check_msg_kind.
+ 
+    DATA li_t100_message TYPE REF TO if_t100_message.
+ 
+    TRY.
+        li_t100_message ?= msg.
+        t100key = li_t100_message->t100key.
+      CATCH cx_sy_move_cast_error.
+        ASSERT 1 = ''todo''.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_OO_ADT_CLASSRUN                      ', 'INTERFACE if_oo_adt_classrun PUBLIC.
+  METHODS main IMPORTING out TYPE REF TO if_oo_adt_classrun_out.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_OO_ADT_CLASSRUN_OUT                  ', 'INTERFACE if_oo_adt_classrun_out PUBLIC.
+ 
+  METHODS write
+    IMPORTING
+      data TYPE any
+      name TYPE string OPTIONAL
+    RETURNING
+      VALUE(output) TYPE REF TO if_oo_adt_classrun_out.
+ 
+  METHODS get
+    IMPORTING
+      data TYPE any OPTIONAL
+      name TYPE string OPTIONAL PREFERRED PARAMETER data
+    RETURNING
+      VALUE(output) TYPE string.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_CODEPAGE                        ', 'CLASS cl_abap_codepage DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS convert_to
+      IMPORTING
+        codepage      TYPE string OPTIONAL
+        source        TYPE string
+      RETURNING
+        VALUE(output) TYPE xstring.
+ 
+    CLASS-METHODS convert_from
+      IMPORTING
+        codepage      TYPE string OPTIONAL
+        source        TYPE xstring
+      RETURNING
+        VALUE(output) TYPE string.
+ 
+    CLASS-METHODS sap_codepage
+      IMPORTING
+        encoding TYPE string
+      RETURNING
+        VALUE(codepage) TYPE abap_encoding.
+ENDCLASS.
+ 
+CLASS cl_abap_codepage IMPLEMENTATION.
+  METHOD convert_to.
+    DATA conv TYPE REF TO cl_abap_conv_out_ce.
+    conv = cl_abap_conv_out_ce=>create( encoding = ''UTF-8'' ).
+    conv->convert( EXPORTING data   = source
+                   IMPORTING buffer = output ).
+  ENDMETHOD.
+ 
+  METHOD convert_from.
+    DATA conv TYPE REF TO cl_abap_conv_in_ce.
+    DATA data TYPE string.
+    conv = cl_abap_conv_in_ce=>create( encoding = ''UTF-8'' ).
+    conv->convert(
+      EXPORTING input = source
+      IMPORTING data = output ).
+  ENDMETHOD.
+ 
+  METHOD sap_codepage.
+    ASSERT encoding = ''UTF-16LE''.
+    codepage = ''4103''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_CONV_CODEPAGE                   ', 'CLASS cl_abap_conv_codepage DEFINITION PUBLIC FINAL CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create_in
+      RETURNING
+        VALUE(instance) TYPE REF TO if_abap_conv_in
+      RAISING
+        cx_parameter_invalid_range.
+ 
+    CLASS-METHODS create_out
+      RETURNING
+        VALUE(instance) TYPE REF TO if_abap_conv_out
+      RAISING
+        cx_parameter_invalid_range.
+ 
+ENDCLASS.
+ 
+CLASS cl_abap_conv_codepage IMPLEMENTATION.
+ 
+  METHOD create_in.
+    CREATE OBJECT instance TYPE lcl_in.
+  ENDMETHOD.
+ 
+  METHOD create_out.
+    CREATE OBJECT instance TYPE lcl_out.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_CONV_IN_CE                      ', 'CLASS cl_abap_conv_in_ce DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS
+      create
+        IMPORTING
+          encoding    TYPE abap_encoding DEFAULT ''UTF-8''
+          input       TYPE xstring OPTIONAL
+          replacement TYPE char1 DEFAULT ''#''
+          ignore_cerr TYPE abap_bool DEFAULT abap_false
+          endian      TYPE char1 OPTIONAL
+        RETURNING
+          VALUE(ret)  TYPE REF TO cl_abap_conv_in_ce.
+ 
+    CLASS-METHODS
+      uccpi
+        IMPORTING
+          value TYPE i
+        RETURNING
+          VALUE(ret) TYPE string.
+ 
+    TYPES ty_char2 TYPE c LENGTH 2.
+    CLASS-METHODS uccp
+      IMPORTING
+        uccp        TYPE simple
+      RETURNING
+        VALUE(char) TYPE ty_char2.
+ 
+    METHODS convert
+      IMPORTING
+        input TYPE xsequence
+        n     TYPE i OPTIONAL
+      EXPORTING
+        data  TYPE string.
+ 
+    METHODS read
+      IMPORTING
+        n     TYPE i OPTIONAL
+      EXPORTING
+        data  TYPE string.
+  PRIVATE SECTION.
+    DATA mv_input TYPE xstring.
+    DATA mv_js_encoding TYPE string.
+    DATA mv_ignore_cerr TYPE abap_bool.
+ENDCLASS.
+ 
+CLASS cl_abap_conv_in_ce IMPLEMENTATION.
+  METHOD create.
+    ASSERT replacement = ''#''. " todo
+    ASSERT endian IS INITIAL. " todo
+ 
+    CREATE OBJECT ret.
+ 
+    CASE encoding.
+      WHEN ''UTF-8''.
+        ret->mv_js_encoding = ''utf8''.
+      WHEN ''4103''.
+        ret->mv_js_encoding = ''utf-16le''.
+      WHEN OTHERS.
+        ASSERT 1 = ''not supported''.
+    ENDCASE.
+ 
+    ret->mv_input = input.
+    ret->mv_ignore_cerr = ignore_cerr.
+  ENDMETHOD.
+ 
+  METHOD uccp.
+    DATA int TYPE i.
+    DATA hex TYPE x LENGTH 2.
+    hex = uccp.
+    int = hex.
+    TRY.
+        char = uccpi( int ).
+      CATCH cx_sy_conversion_codepage.
+* todo, hmm
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD uccpi.
+    DATA lv_hex TYPE x LENGTH 2.
+    DATA lo_in  TYPE REF TO cl_abap_conv_in_ce.
+ 
+    lv_hex = value.
+    " switch to little endian
+    CONCATENATE lv_hex+1(1) lv_hex(1) INTO lv_hex IN BYTE MODE.
+ 
+    lo_in = create( encoding = ''4103'' ).
+ 
+    lo_in->convert(
+      EXPORTING
+        input = lv_hex
+      IMPORTING
+        data  = ret ).
+  ENDMETHOD.
+ 
+  METHOD convert.
+    DATA lv_error TYPE abap_bool.
+ 
+    ASSERT mv_js_encoding IS NOT INITIAL.
+    WRITE ''@KERNEL let buf = Buffer.from(input.get(), "hex");''.
+ 
+    WRITE ''@KERNEL const util= await import("util");''.
+    WRITE ''@KERNEL const td = new util.TextDecoder(this.mv_js_encoding.get(), {fatal: this.mv_ignore_cerr.get() !== "X"});''.
+    WRITE ''@KERNEL try {''.
+    WRITE ''@KERNEL   data.set(td.decode(buf));''.
+    WRITE ''@KERNEL } catch {''.
+    lv_error = abap_true.
+    WRITE ''@KERNEL }''.
+ 
+    IF lv_error = abap_true.
+      RAISE EXCEPTION TYPE cx_sy_conversion_codepage.
+    ENDIF.
+ 
+* old    WRITE ''@KERNEL let result = buf.toString(this.mv_js_encoding.get());''.
+* old    WRITE ''@KERNEL data.set(result);''.
+  ENDMETHOD.
+ 
+  METHOD read.
+    convert(
+      EXPORTING
+        input = mv_input
+        n     = n
+      IMPORTING
+        data  = data ).
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_CONV_OUT_CE                     ', 'CLASS cl_abap_conv_out_ce DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS
+      create
+        IMPORTING
+          encoding    TYPE abap_encoding OPTIONAL
+          ignore_cerr TYPE abap_bool DEFAULT abap_false
+          endian      TYPE string OPTIONAL
+          replacement TYPE string OPTIONAL
+        RETURNING
+          VALUE(ret)  TYPE REF TO cl_abap_conv_out_ce.
+ 
+    CLASS-METHODS
+      uccpi
+        IMPORTING
+          char       TYPE clike
+        RETURNING
+          VALUE(ret) TYPE i.
+ 
+    TYPES hex02 TYPE x LENGTH 2.
+    CLASS-METHODS uccp
+      IMPORTING
+        char        TYPE clike
+      RETURNING
+        VALUE(uccp) TYPE hex02
+      RAISING
+        cx_sy_conversion_codepage
+        cx_sy_codepage_converter_init
+        cx_parameter_invalid_range.
+ 
+    METHODS
+      convert
+        IMPORTING
+          data   TYPE simple
+          n      TYPE i OPTIONAL
+        EXPORTING
+          buffer TYPE xstring.
+ 
+    METHODS write
+      IMPORTING
+        data TYPE any.
+ 
+    METHODS get_buffer
+      RETURNING
+        VALUE(buffer) TYPE xstring.
+ 
+    METHODS reset.
+  PRIVATE SECTION.
+    DATA mv_js_encoding TYPE string.
+    DATA mv_buffer TYPE xstring.
+ENDCLASS.
+ 
+CLASS cl_abap_conv_out_ce IMPLEMENTATION.
+  METHOD create.
+    CREATE OBJECT ret.
+    CASE encoding.
+      WHEN ''UTF-8'' OR ''''.
+        ret->mv_js_encoding = ''utf8''.
+      WHEN ''4103''.
+        ret->mv_js_encoding = ''utf16le''.
+      WHEN OTHERS.
+        ASSERT 1 = ''not supported''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD uccpi.
+    DATA lo_out TYPE REF TO cl_abap_conv_out_ce.
+    DATA lv_hex TYPE xstring.
+ 
+    lo_out = create( encoding = ''4103'' ).
+    lo_out->convert(
+      EXPORTING
+        data   = char
+      IMPORTING
+        buffer = lv_hex ).
+    ASSERT xstrlen( lv_hex ) = 2.
+    ret = lv_hex(1).
+    ret = ret + lv_hex+1(1) * 255.
+  ENDMETHOD.
+ 
+  METHOD write.
+    DATA res TYPE xstring.
+    convert( EXPORTING data = data
+             IMPORTING buffer = res ).
+    CONCATENATE mv_buffer res INTO mv_buffer IN BYTE MODE.
+  ENDMETHOD.
+ 
+  METHOD get_buffer.
+    buffer = mv_buffer.
+  ENDMETHOD.
+ 
+  METHOD uccp.
+    DATA lv_char TYPE c LENGTH 1.
+    DATA lo_obj  TYPE REF TO cl_abap_conv_out_ce.
+ 
+    lv_char = char(1).
+    lo_obj = create( encoding = ''4103'' ).
+ 
+    lo_obj->convert( EXPORTING data = lv_char
+                     IMPORTING buffer = uccp ).
+ 
+    SHIFT uccp LEFT CIRCULAR IN BYTE MODE.
+  ENDMETHOD.
+ 
+  METHOD reset.
+    CLEAR mv_buffer.
+  ENDMETHOD.
+ 
+  METHOD convert.
+    DATA lv_str TYPE string.
+ 
+    WRITE ''@KERNEL let result = "";''.
+*    WRITE ''@KERNEL console.dir(n);''.
+    IF n IS SUPPLIED.
+      lv_str = data.
+      lv_str = lv_str(n).
+      WRITE ''@KERNEL result = Buffer.from(lv_str.get(), this.mv_js_encoding.get()).toString("hex");''.
+    ELSE.
+      WRITE ''@KERNEL result = Buffer.from(data.get(), this.mv_js_encoding.get()).toString("hex");''.
+    ENDIF.
+    WRITE ''@KERNEL buffer.set(result.toUpperCase());''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_GDT_CONVERSION                       ', 'CLASS cl_gdt_conversion DEFINITION PUBLIC.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS language_code_outbound
+      IMPORTING
+        im_value TYPE spras
+      EXPORTING
+        ex_value TYPE laiso.
+ 
+    CLASS-METHODS language_code_inbound
+      IMPORTING
+        im_value TYPE csequence
+      EXPORTING
+        ex_value TYPE spras
+      RAISING
+        cx_gdt_conversion.
+ 
+    CLASS-METHODS amount_outbound
+      IMPORTING
+        im_value         TYPE p
+        im_currency_code TYPE clike
+      EXPORTING
+        ex_value         TYPE p
+      RAISING
+        cx_gdt_conversion.
+ 
+    CLASS-METHODS country_code_outbound
+      IMPORTING
+        im_value TYPE land1
+      EXPORTING
+        ex_value TYPE csequence
+      RAISING
+        cx_gdt_conversion.
+ 
+    CLASS-METHODS date_time_inbound
+      IMPORTING
+        im_value       TYPE csequence
+      EXPORTING
+        ex_value_short TYPE timestamp
+      RAISING
+        cx_gdt_conversion.
+ 
+    CLASS-METHODS unit_code_inbound
+      IMPORTING
+        im_value TYPE csequence
+      EXPORTING
+        ex_value TYPE msehi
+      RAISING
+        cx_gdt_conversion.
+ 
+    CLASS-METHODS unit_code_outbound
+      IMPORTING
+        im_value TYPE msehi
+      EXPORTING
+        ex_value TYPE csequence
+      RAISING
+        cx_gdt_conversion.
+ 
+ENDCLASS.
+ 
+CLASS cl_gdt_conversion IMPLEMENTATION.
+ 
+  METHOD amount_outbound.
+    CASE im_currency_code.
+      WHEN ''DKK'' OR ''EUR'' OR ''USD''.
+        ex_value = im_value.
+      WHEN ''VND''.
+        ex_value = im_value * 100.
+      WHEN OTHERS.
+        ASSERT 1 = ''todo''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD language_code_inbound.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD unit_code_outbound.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD country_code_outbound.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD date_time_inbound.
+    DATA lv_str TYPE string.
+ 
+    IF im_value NP ''*Z''.
+      ASSERT 1 = ''todo, only handles UTC for now''.
+    ENDIF.
+ 
+    lv_str = im_value.
+    REPLACE ALL OCCURRENCES OF ''-'' IN lv_str WITH ''''.
+    REPLACE ALL OCCURRENCES OF '':'' IN lv_str WITH ''''.
+    REPLACE ALL OCCURRENCES OF ''T'' IN lv_str WITH ''''.
+    REPLACE ALL OCCURRENCES OF ''Z'' IN lv_str WITH ''''.
+    ex_value_short = lv_str.
+  ENDMETHOD.
+ 
+  METHOD unit_code_inbound.
+ 
+* todo, first look up in database, if there is no database connected, fallback to below
+ 
+    CASE im_value.
+      WHEN ''MTR''.
+        ex_value = ''M''.
+      WHEN ''PCE''.
+        ex_value = ''PC''.
+      WHEN ''KGM''.
+        ex_value = ''KG''.
+      WHEN ''LTR''.
+        ex_value = ''L''.
+      WHEN OTHERS.
+        ASSERT 1 = ''todo''.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+  METHOD language_code_outbound.
+ 
+    cl_i18n_languages=>sap1_to_sap2(
+      EXPORTING
+        im_lang_sap1  = im_value
+      RECEIVING
+        re_lang_sap2  = ex_value
+      EXCEPTIONS
+        no_assignment = 1
+        OTHERS        = 2 ).
+    TRANSLATE ex_value TO LOWER CASE.
+    IF sy-subrc <> 0.
+      RAISE EXCEPTION TYPE cx_gdt_conversion.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_GDT_CONVERSION                       ', 'CLASS cx_gdt_conversion DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_gdt_conversion IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_ABAP_CONV_IN                         ', 'INTERFACE if_abap_conv_in PUBLIC.
+ 
+  METHODS convert
+    IMPORTING
+      source TYPE xstring
+    RETURNING
+      VALUE(result) TYPE string
+    RAISING
+      cx_sy_conversion_codepage.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_ABAP_CONV_OUT                        ', 'INTERFACE if_abap_conv_out PUBLIC.
+ 
+  METHODS convert
+    IMPORTING
+      source TYPE string
+    RETURNING
+      VALUE(result) TYPE xstring
+    RAISING
+      cx_sy_conversion_codepage.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_DATFM                           ', 'CLASS cl_abap_datfm DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS conv_date_ext_to_int
+      IMPORTING
+        im_datext    TYPE csequence
+        im_datfmdes  TYPE char1 OPTIONAL
+      EXPORTING
+        ex_datint    TYPE d
+        ex_datfmused TYPE char1
+      RAISING
+        cx_abap_datfm.
+ 
+    CLASS-METHODS get_date_format_des
+      IMPORTING
+        im_datfm      TYPE char1 OPTIONAL
+        im_langu      TYPE spras DEFAULT sy-langu
+        im_plain      TYPE abap_bool DEFAULT abap_false
+        im_long       TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        ex_dateformat TYPE csequence
+      RAISING
+        cx_abap_datfm.
+ 
+  PRIVATE SECTION.
+    CONSTANTS ddmmyyyy_dot_seperated TYPE c VALUE ''1''.
+    CONSTANTS yyyymmdd_dot_seperated TYPE c VALUE ''4''.
+ENDCLASS.
+ 
+CLASS cl_abap_datfm IMPLEMENTATION.
+ 
+  METHOD conv_date_ext_to_int.
+    DATA regex_ddmmyyyy_dot_seperated TYPE string VALUE ''^(0[0-9]|[12][0-9]|3[01])[- \\..](0[0-9]|1[012])[- \\..]\\d\\d\\d\\d$''.
+    DATA regex_yyyymmdd_dot_seperated TYPE string VALUE ''^\\d\\d\\d\\d[- \\..](0[0-9]|1[012])[- \\..](0[0-9]|[12][0-9]|3[01])$''.
+    DATA regex_yyyymmdd_no_dot TYPE string VALUE ''^(\\d{4})(0[0-9]|1[012])(0[0-9]|[12][0-9]|3[01])$''.
+ 
+    IF im_datfmdes <> ddmmyyyy_dot_seperated
+        AND im_datfmdes <> yyyymmdd_dot_seperated.
+      RAISE EXCEPTION TYPE cx_abap_datfm.
+    ENDIF.
+ 
+    FIND ALL OCCURRENCES OF REGEX regex_ddmmyyyy_dot_seperated IN im_datext.
+    IF sy-subrc = 0.
+      ex_datint = im_datext+6(8) && im_datext+3(2) && im_datext(2).
+      ex_datfmused = ddmmyyyy_dot_seperated.
+      RETURN.
+    ENDIF.
+ 
+    FIND ALL OCCURRENCES OF REGEX regex_yyyymmdd_dot_seperated IN im_datext.
+    IF sy-subrc = 0.
+      ex_datint = im_datext(4) && im_datext+5(2) && im_datext+8(2).
+      ex_datfmused = yyyymmdd_dot_seperated.
+      RETURN.
+    ENDIF.
+ 
+    FIND ALL OCCURRENCES OF REGEX regex_yyyymmdd_no_dot IN im_datext.
+    IF sy-subrc = 0.
+      ex_datint = im_datext.
+      ex_datfmused = yyyymmdd_dot_seperated.
+      RETURN.
+    ENDIF.
+ 
+    RAISE EXCEPTION TYPE cx_abap_datfm.
+  ENDMETHOD.
+ 
+  METHOD get_date_format_des.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_TIMEFM                          ', 'CLASS cl_abap_timefm DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS conv_time_ext_to_int
+      IMPORTING
+        time_ext        TYPE csequence
+        is_24_allowed   TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        time_int        TYPE t
+      RAISING
+        cx_abap_timefm_invalid.
+ENDCLASS.
+ 
+CLASS cl_abap_timefm IMPLEMENTATION.
+  METHOD conv_time_ext_to_int.
+    DATA lv_text TYPE string.
+ 
+* todo,
+    ASSERT is_24_allowed = abap_true.
+ 
+    FIND REGEX ''^([0-1]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$'' IN time_ext.
+    IF sy-subrc <> 0.
+      RAISE EXCEPTION TYPE cx_abap_timefm_invalid.
+    ENDIF.
+ 
+    lv_text = time_ext.
+    REPLACE ALL OCCURRENCES OF '':'' IN lv_text WITH ''''.
+    time_int = lv_text.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_TSTMP                           ', 'CLASS cl_abap_tstmp DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS subtract
+      IMPORTING
+        tstmp1        TYPE p
+        tstmp2        TYPE p
+      RETURNING
+        VALUE(r_secs) TYPE i.
+ 
+    CLASS-METHODS add
+      IMPORTING
+        tstmp       TYPE p
+        secs        TYPE numeric
+      RETURNING
+        VALUE(time) TYPE timestamp.
+ 
+    CLASS-METHODS subtractsecs
+      IMPORTING
+        tstmp       TYPE p
+        secs        TYPE numeric
+      RETURNING
+        VALUE(time) TYPE timestamp.
+ 
+    CLASS-METHODS td_add
+      IMPORTING
+        date     TYPE d
+        time     TYPE t
+        secs     TYPE numeric
+      EXPORTING
+        res_date TYPE d
+        res_time TYPE t.
+ 
+    CLASS-METHODS move
+      IMPORTING
+        tstmp_src TYPE p
+      EXPORTING
+        tstmp_tgt TYPE p.
+ 
+    CLASS-METHODS systemtstmp_syst2utc
+      IMPORTING
+        syst_date TYPE d
+        syst_time TYPE t
+      EXPORTING
+        utc_tstmp TYPE p.
+ 
+    CLASS-METHODS move_to_short
+      IMPORTING
+        tstmp_src        TYPE tzntstmpl
+      RETURNING
+        VALUE(tstmp_out) TYPE tzntstmps
+      RAISING
+        cx_parameter_invalid_type
+        cx_parameter_invalid_range.
+ 
+    CLASS-METHODS td_subtract
+      IMPORTING
+        date1 TYPE d
+        time1 TYPE t
+        date2 TYPE d
+        time2 TYPE t
+      EXPORTING
+        res_secs TYPE numeric
+      RAISING
+        cx_parameter_invalid_type
+        cx_parameter_invalid_range.
+ 
+    CLASS-METHODS systemtstmp_utc2syst
+      IMPORTING
+        utc_tstmp TYPE timestamp
+      EXPORTING
+        syst_date TYPE d
+        syst_time TYPE t
+      RAISING
+        cx_parameter_invalid_range.
+ENDCLASS.
+ 
+CLASS cl_abap_tstmp IMPLEMENTATION.
+ 
+  METHOD td_add.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD systemtstmp_utc2syst.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD move.
+* todo, this is most likely wrong, but will also work in some cases
+* todo, input is generic packed? which is unknown to abaplint
+    tstmp_tgt = tstmp_src.
+  ENDMETHOD.
+ 
+  METHOD systemtstmp_syst2utc.
+* system timezone is always UTC for open-abap, so no conversion needed
+    utc_tstmp = |{ syst_date }{ syst_time }|.
+  ENDMETHOD.
+ 
+  METHOD subtract.
+    DATA str TYPE string.
+    str = |{ tstmp1 TIMESTAMP = ISO }|.
+    WRITE ''@KERNEL let t1 = Date.parse(str.get());''.
+    str = |{ tstmp2 TIMESTAMP = ISO }|.
+    WRITE ''@KERNEL let t2 = Date.parse(str.get());''.
+    WRITE ''@KERNEL r_secs.set((t1 - t2)/1000);''.
+  ENDMETHOD.
+ 
+  METHOD add.
+    DATA str TYPE string.
+    str = |{ tstmp TIMESTAMP = ISO }|.
+    WRITE ''@KERNEL let t1 = new Date(Date.parse(str.get() + "Z"));''.
+    WRITE ''@KERNEL t1.setSeconds( t1.getSeconds() + secs.get() );''.
+    WRITE ''@KERNEL time.set(t1.toISOString().slice(0, 19).replace(/-/g, "").replace(/:/g, "").replace("T", ""));''.
+  ENDMETHOD.
+ 
+  METHOD subtractsecs.
+    DATA lv_secs TYPE i.
+    lv_secs = secs * -1.
+    time = add(
+      tstmp = tstmp
+      secs  = lv_secs ).
+  ENDMETHOD.
+ 
+  METHOD move_to_short.
+    move(
+      EXPORTING
+        tstmp_src = tstmp_src
+      IMPORTING
+        tstmp_tgt = tstmp_out ).
+  ENDMETHOD.
+ 
+  METHOD td_subtract.
+    DATA lv_stamp1 TYPE timestamp.
+    DATA lv_stamp2 TYPE timestamp.
+ 
+    CONVERT DATE date1 TIME time1 INTO TIME STAMP lv_stamp1.
+    CONVERT DATE date2 TIME time2 INTO TIME STAMP lv_stamp2.
+ 
+    res_secs = subtract(
+      tstmp1 = lv_stamp1
+      tstmp2 = lv_stamp2 ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_ABAP_DATFM                           ', 'CLASS cx_abap_datfm DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_abap_datfm IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_ABAP_TIMEFM_INVALID                  ', 'CLASS cx_abap_timefm_invalid DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_abap_timefm_invalid IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_DYNAMIC_CHECK                        ', 'CLASS cx_dynamic_check DEFINITION ABSTRACT PUBLIC INHERITING FROM cx_root.
+ 
+ENDCLASS.
+ 
+CLASS cx_dynamic_check IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_NO_CHECK                             ', 'CLASS cx_no_check DEFINITION PUBLIC INHERITING FROM cx_root.
+ 
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        previous TYPE REF TO cx_root OPTIONAL.
+ 
+ENDCLASS.
+ 
+CLASS cx_no_check IMPLEMENTATION.
+ 
+  METHOD constructor.
+    super->constructor( previous = previous ).
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_PARAMETER_INVALID                    ', 'CLASS cx_parameter_invalid DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        textid    LIKE textid OPTIONAL
+        previous  LIKE previous OPTIONAL
+        parameter TYPE string OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_parameter_invalid IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor(
+      textid   = textid
+      previous = previous ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_PARAMETER_INVALID_RANGE              ', 'CLASS cx_parameter_invalid_range DEFINITION PUBLIC INHERITING FROM cx_parameter_invalid.
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        textid    LIKE textid OPTIONAL
+        previous  LIKE previous OPTIONAL
+        parameter TYPE string OPTIONAL
+        value     TYPE string OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_parameter_invalid_range IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor(
+      textid    = textid
+      previous  = previous
+      parameter = parameter ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_PARAMETER_INVALID_TYPE               ', 'CLASS cx_parameter_invalid_type DEFINITION PUBLIC INHERITING FROM cx_parameter_invalid.
+ 
+ENDCLASS.
+ 
+CLASS cx_parameter_invalid_type IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_ROOT                                 ', 'CLASS cx_root DEFINITION ABSTRACT PUBLIC.
+  PUBLIC SECTION.
+    DATA previous TYPE REF TO cx_root.
+    DATA textid   TYPE c LENGTH 32.
+ 
+    METHODS constructor
+      IMPORTING
+        textid   LIKE textid OPTIONAL
+        previous TYPE REF TO cx_root OPTIONAL.
+ 
+    METHODS get_source_position
+      EXPORTING
+        program_name TYPE string
+        include_name TYPE string
+        source_line  TYPE i.
+ 
+    INTERFACES if_message.
+    ALIASES get_longtext FOR if_message~get_longtext.
+    ALIASES get_text FOR if_message~get_text.
+ 
+ENDCLASS.
+ 
+CLASS cx_root IMPLEMENTATION.
+ 
+  METHOD constructor.
+    me->previous = previous.
+    me->textid = textid.
+  ENDMETHOD.
+ 
+  METHOD get_source_position.
+    CLEAR program_name.
+    CLEAR include_name.
+    CLEAR source_line.
+ 
+    WRITE ''@KERNEL source_line.set(this.EXTRA_CX.INTERNAL_LINE || 1);''.
+    WRITE ''@KERNEL program_name.set(this.EXTRA_CX.INTERNAL_FILENAME || "error");''.
+  ENDMETHOD.
+ 
+  METHOD if_message~get_longtext.
+    result = ''OpenAbapGetLongtextDummyValue''.
+  ENDMETHOD.
+ 
+  METHOD if_message~get_text.
+    result = cl_message_helper=>get_text_for_message( me ).
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_STATIC_CHECK                         ', 'CLASS cx_static_check DEFINITION PUBLIC INHERITING FROM cx_root.
+ 
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        textid   LIKE if_t100_message=>t100key OPTIONAL
+        previous TYPE REF TO cx_root OPTIONAL
+        msgv1    TYPE c OPTIONAL
+        msgv2    TYPE c OPTIONAL
+        msgv3    TYPE c OPTIONAL
+        msgv4    TYPE c OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_static_check IMPLEMENTATION.
+ 
+  METHOD constructor.
+    super->constructor(
+      textid   = textid
+      previous = previous ).
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_ARITHMETIC_ERROR                  ', 'CLASS cx_sy_arithmetic_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_arithmetic_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_BUFFER_OVERFLOW                   ', 'CLASS cx_sy_buffer_overflow DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_buffer_overflow IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_CODEPAGE_CONVERTER_INIT           ', 'CLASS cx_sy_codepage_converter_init DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_codepage_converter_init IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_COMPRESSION_ERROR                 ', 'CLASS cx_sy_compression_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_compression_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_CONVERSION_CODEPAGE               ', 'CLASS cx_sy_conversion_codepage DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+  PUBLIC SECTION.
+    DATA source_extract TYPE xstring.
+ENDCLASS.
+ 
+CLASS cx_sy_conversion_codepage IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_CONVERSION_DATA_LOSS              ', 'CLASS cx_sy_conversion_data_loss DEFINITION PUBLIC INHERITING FROM cx_sy_conversion_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_conversion_data_loss IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_CONVERSION_ERROR                  ', 'CLASS cx_sy_conversion_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_conversion_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_CONVERSION_NO_NUMBER              ', 'CLASS cx_sy_conversion_no_number DEFINITION PUBLIC INHERITING FROM cx_sy_conversion_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_conversion_no_number IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_CONVERSION_OVERFLOW               ', 'CLASS cx_sy_conversion_overflow DEFINITION PUBLIC INHERITING FROM cx_sy_conversion_error.
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        textid   LIKE textid OPTIONAL
+        previous LIKE previous OPTIONAL
+        value    TYPE string OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_sy_conversion_overflow IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor(
+      textid   = textid
+      previous = previous ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_CREATE_DATA_ERROR                 ', 'CLASS cx_sy_create_data_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_create_data_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_CREATE_OBJECT_ERROR               ', 'CLASS cx_sy_create_object_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        textid    LIKE textid OPTIONAL
+        previous  LIKE previous OPTIONAL
+        classname TYPE string OPTIONAL.
+ 
+    METHODS if_message~get_text REDEFINITION.
+ 
+    DATA classname TYPE string READ-ONLY.
+ENDCLASS.
+ 
+CLASS cx_sy_create_object_error IMPLEMENTATION.
+ 
+  METHOD constructor.
+    super->constructor(
+      textid   = textid
+      previous = previous ).
+    me->classname = classname.
+  ENDMETHOD.
+ 
+  METHOD if_message~get_text.
+    result = ''The object could not be created: The class ??? does not exist.''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DATA_ACCESS_ERROR                 ', 'CLASS cx_sy_data_access_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_data_access_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DUPLICATE_KEY                     ', 'CLASS cx_sy_duplicate_key DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_duplicate_key IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYN_CALL_ERROR                    ', 'CLASS cx_sy_dyn_call_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_dyn_call_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYN_CALL_ILLEGAL_CLASS            ', 'CLASS cx_sy_dyn_call_illegal_class DEFINITION PUBLIC INHERITING FROM cx_sy_dyn_call_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_dyn_call_illegal_class IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYN_CALL_ILLEGAL_FORM             ', 'CLASS cx_sy_dyn_call_illegal_form DEFINITION PUBLIC INHERITING FROM cx_sy_dyn_call_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_dyn_call_illegal_form IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYN_CALL_ILLEGAL_FUNC             ', 'CLASS cx_sy_dyn_call_illegal_func DEFINITION PUBLIC INHERITING FROM cx_sy_dyn_call_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_dyn_call_illegal_func IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYN_CALL_ILLEGAL_METHOD           ', 'CLASS cx_sy_dyn_call_illegal_method DEFINITION PUBLIC INHERITING FROM cx_sy_dyn_call_error.
+ 
+  PUBLIC SECTION.
+    CONSTANTS private_method TYPE c VALUE ''1''.
+ 
+    METHODS constructor
+      IMPORTING
+        textid     LIKE textid OPTIONAL
+        previous   LIKE previous OPTIONAL
+        classname  TYPE string OPTIONAL
+        methodname TYPE string OPTIONAL.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_dyn_call_illegal_method IMPLEMENTATION.
+ 
+  METHOD constructor.
+    super->constructor( previous = previous ).
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYN_CALL_PARAM_NOT_FOUND          ', 'CLASS cx_sy_dyn_call_param_not_found DEFINITION PUBLIC INHERITING FROM cx_sy_dyn_call_parameter_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_dyn_call_param_not_found IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYN_CALL_PARAMETER_ERROR          ', 'CLASS cx_sy_dyn_call_parameter_error DEFINITION PUBLIC INHERITING FROM cx_sy_dyn_call_error.
+  PUBLIC SECTION.
+    DATA parameter TYPE string.
+ENDCLASS.
+ 
+CLASS cx_sy_dyn_call_parameter_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYNAMIC_OSQL_ERROR                ', 'CLASS cx_sy_dynamic_osql_error DEFINITION PUBLIC INHERITING FROM cx_sy_open_sql_error.
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        sqlmsg TYPE string OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_sy_dynamic_osql_error IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor( sqlmsg = sqlmsg ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_DYNAMIC_OSQL_SEMANTICS            ', 'CLASS cx_sy_dynamic_osql_semantics DEFINITION PUBLIC INHERITING FROM cx_sy_dynamic_osql_error.
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        sqlmsg TYPE string OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_sy_dynamic_osql_semantics IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor( sqlmsg = sqlmsg ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_ITAB_DUPLICATE_KEY                ', 'CLASS cx_sy_itab_duplicate_key DEFINITION PUBLIC INHERITING FROM cx_sy_itab_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_itab_duplicate_key IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_ITAB_ERROR                        ', 'CLASS cx_sy_itab_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_itab_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_ITAB_LINE_NOT_FOUND               ', 'CLASS cx_sy_itab_line_not_found DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_itab_line_not_found IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_MESSAGE_ILLEGAL_TEXT              ', 'CLASS cx_sy_message_illegal_text DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS cx_sy_message_illegal_text IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_MOVE_CAST_ERROR                   ', 'CLASS cx_sy_move_cast_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_move_cast_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_OPEN_SQL_ERROR                    ', 'CLASS cx_sy_open_sql_error DEFINITION PUBLIC INHERITING FROM cx_sy_sql_error.
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        sqlmsg TYPE string OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_sy_open_sql_error IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor( sqlmsg = sqlmsg ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_RANGE_OUT_OF_BOUNDS               ', 'CLASS cx_sy_range_out_of_bounds DEFINITION PUBLIC INHERITING FROM cx_sy_data_access_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_range_out_of_bounds IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_REF_IS_INITIAL                    ', 'CLASS cx_sy_ref_is_initial DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_ref_is_initial IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_SQL_ERROR                         ', 'CLASS cx_sy_sql_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+  PUBLIC SECTION.
+    DATA sqlmsg TYPE string.
+ 
+    METHODS constructor
+      IMPORTING
+        sqlmsg TYPE string OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_sy_sql_error IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor( ).
+    me->sqlmsg = sqlmsg.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_STRG_PAR_VAL                      ', 'CLASS cx_sy_strg_par_val DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS cx_sy_strg_par_val IMPLEMENTATION.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_STRUCT_ATTRIBUTES                 ', 'CLASS cx_sy_struct_attributes DEFINITION PUBLIC INHERITING FROM cx_sy_struct_creation.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_struct_attributes IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_STRUCT_COMP_NAME                  ', 'CLASS cx_sy_struct_comp_name DEFINITION PUBLIC INHERITING FROM cx_sy_struct_creation.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_struct_comp_name IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_STRUCT_COMP_TYPE                  ', 'CLASS cx_sy_struct_comp_type DEFINITION PUBLIC INHERITING FROM cx_sy_struct_creation.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_struct_comp_type IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_STRUCT_CREATION                   ', 'CLASS cx_sy_struct_creation DEFINITION PUBLIC INHERITING FROM cx_sy_type_creation.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_struct_creation IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_TYPE_CREATION                     ', 'CLASS cx_sy_type_creation DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_type_creation IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SY_ZERODIVIDE                        ', 'CLASS cx_sy_zerodivide DEFINITION PUBLIC INHERITING FROM cx_sy_arithmetic_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_sy_zerodivide IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_TRANSFORMATION_ERROR                 ', 'CLASS cx_transformation_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_transformation_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_XSLT_EXCEPTION                       ', 'CLASS cx_xslt_exception DEFINITION PUBLIC INHERITING FROM cx_transformation_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_xslt_exception IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_XSLT_FORMAT_ERROR                    ', 'CLASS cx_xslt_format_error DEFINITION PUBLIC INHERITING FROM cx_xslt_system_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_xslt_format_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_XSLT_RUNTIME_ERROR                   ', 'CLASS cx_xslt_runtime_error DEFINITION PUBLIC INHERITING FROM cx_transformation_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_xslt_runtime_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_XSLT_SERIALIZATION_ERROR             ', 'CLASS cx_xslt_serialization_error DEFINITION PUBLIC INHERITING FROM cx_xslt_system_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_xslt_serialization_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_XSLT_SYSTEM_ERROR                    ', 'CLASS cx_xslt_system_error DEFINITION PUBLIC INHERITING FROM cx_xslt_exception.
+ 
+ENDCLASS.
+ 
+CLASS cx_xslt_system_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_MESSAGE                              ', 'INTERFACE if_message PUBLIC.
+ 
+  METHODS get_text RETURNING VALUE(result) TYPE string.
+ 
+  METHODS get_longtext
+    IMPORTING preserve_newlines TYPE abap_bool OPTIONAL
+    RETURNING VALUE(result) TYPE string.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_T100_DYN_MSG                         ', 'INTERFACE if_t100_dyn_msg PUBLIC.
+ 
+  DATA msgty TYPE symsgty.
+ 
+  DATA msgv1 TYPE symsgv.
+  DATA msgv2 TYPE symsgv.
+  DATA msgv3 TYPE symsgv.
+  DATA msgv4 TYPE symsgv.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_T100_MESSAGE                         ', 'INTERFACE if_t100_message PUBLIC.
+ 
+  DATA t100key TYPE scx_t100key.
+ 
+  CONSTANTS:
+    BEGIN OF default_textid,
+      msgid TYPE symsgid VALUE ''AB'',
+      msgno TYPE symsgno VALUE ''123'',
+      attr1 TYPE scx_attrname VALUE '''',
+      attr2 TYPE scx_attrname VALUE '''',
+      attr3 TYPE scx_attrname VALUE '''',
+      attr4 TYPE scx_attrname VALUE '''',
+    END OF default_textid.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_FUGR_TEST                        ', 'CLASS kernel_fugr_test DEFINITION PUBLIC.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS kernel_fugr_test IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_DEMO_OUTPUT                          ', 'CLASS cl_demo_output DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS write
+      IMPORTING
+        data TYPE any
+        name TYPE string OPTIONAL.
+    CLASS-METHODS clear.
+    CLASS-METHODS display
+      IMPORTING
+      data TYPE any OPTIONAL
+      name TYPE string OPTIONAL PREFERRED PARAMETER data.
+ENDCLASS.
+ 
+CLASS cl_demo_output IMPLEMENTATION.
+  METHOD write.
+    ASSERT 1 = ''not supported''.
+  ENDMETHOD.
+ 
+  METHOD clear.
+    ASSERT 1 = ''not supported''.
+  ENDMETHOD.
+ 
+  METHOD display.
+    ASSERT 1 = ''not supported''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_GUI_CFW                              ', 'CLASS cl_gui_cfw DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS
+      compute_pixel_from_metric
+        IMPORTING
+          x_or_y TYPE c
+          in_     TYPE i
+        RETURNING
+          VALUE(val) TYPE i.
+ 
+    CLASS-METHODS
+      flush.
+ 
+    CLASS-METHODS
+      set_new_ok_code
+        IMPORTING new_code
+          TYPE clike.
+ENDCLASS.
+ 
+CLASS cl_gui_cfw IMPLEMENTATION.
+  METHOD compute_pixel_from_metric.
+    val = 1.
+  ENDMETHOD.
+ 
+  METHOD flush.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD set_new_ok_code.
+    ASSERT 1 = ''not implemented''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_GUI_CONTAINER                        ', 'CLASS cl_gui_container DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-DATA screen0 TYPE REF TO cl_gui_container.
+    CLASS-DATA default_screen TYPE REF TO cl_gui_container.
+    CONSTANTS visible_true TYPE c LENGTH 1 VALUE ''1''.
+    CONSTANTS visible_false TYPE c LENGTH 1 VALUE ''0''.
+ENDCLASS.
+ 
+CLASS cl_gui_container IMPLEMENTATION.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_GUI_FRONTEND_SERVICES                ', 'CLASS cl_gui_frontend_services DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CONSTANTS filetype_all TYPE string VALUE ''abc''.
+    CONSTANTS action_cancel TYPE i VALUE 1.
+    CONSTANTS action_ok TYPE i VALUE 1.
+ 
+    CONSTANTS platform_nt351 TYPE i VALUE 1.
+    CONSTANTS platform_nt40 TYPE i VALUE 2.
+    CONSTANTS platform_nt50 TYPE i VALUE 3.
+    CONSTANTS platform_windows95 TYPE i VALUE 4.
+    CONSTANTS platform_windows98 TYPE i VALUE 5.
+    CONSTANTS platform_windowsxp TYPE i VALUE 6.
+ 
+    CLASS-METHODS
+      gui_download
+        IMPORTING
+          bin_filesize          TYPE i OPTIONAL
+          filename              TYPE string
+          filetype              TYPE string OPTIONAL
+          write_lf              TYPE abap_bool OPTIONAL
+          write_field_separator TYPE char1 OPTIONAL
+        CHANGING
+          data_tab TYPE any.
+ 
+    CLASS-METHODS file_exist
+      IMPORTING
+        file          TYPE string
+      RETURNING
+        VALUE(result) TYPE abap_bool.
+ 
+    CLASS-METHODS
+      directory_list_files
+        IMPORTING
+          directory  TYPE string
+        CHANGING
+          file_table TYPE any
+          count      TYPE i.
+ 
+    CLASS-METHODS
+      gui_upload
+        IMPORTING
+          filename TYPE string
+          filetype TYPE string OPTIONAL
+          codepage TYPE abap_encoding DEFAULT space
+          read_by_line TYPE abap_bool OPTIONAL
+        EXPORTING
+          filelength TYPE i
+        CHANGING
+          data_tab TYPE any.
+ 
+    CLASS-METHODS
+      file_open_dialog
+        IMPORTING
+          window_title      TYPE string OPTIONAL
+          default_filename  TYPE string OPTIONAL
+          default_extension TYPE string OPTIONAL
+          multiselection    TYPE abap_bool OPTIONAL
+          file_filter       TYPE string OPTIONAL
+          initial_directory TYPE string OPTIONAL
+        CHANGING
+          file_table        TYPE filetable
+          rc                TYPE i
+          user_action       TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      get_platform
+        RETURNING
+          VALUE(platform) TYPE i.
+ 
+    CLASS-METHODS
+      file_save_dialog
+        IMPORTING
+          window_title         TYPE string OPTIONAL
+          default_extension    TYPE string OPTIONAL
+          default_file_name    TYPE string OPTIONAL
+          file_filter          TYPE string OPTIONAL
+        CHANGING
+          filename             TYPE string
+          path                 TYPE string
+          fullpath             TYPE string
+          user_action          TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      directory_browse
+        IMPORTING
+          window_title    TYPE string OPTIONAL
+          initial_folder  TYPE string
+        CHANGING
+          selected_folder TYPE string.
+ 
+    CLASS-METHODS
+      execute
+        IMPORTING
+          document          TYPE string OPTIONAL
+          application       TYPE string OPTIONAL
+          parameter         TYPE string OPTIONAL
+          default_directory TYPE string OPTIONAL
+          maximized         TYPE string OPTIONAL
+          minimized         TYPE string OPTIONAL
+          synchronous       TYPE string OPTIONAL
+          operation         TYPE string DEFAULT ''OPEN''.
+ 
+    CLASS-METHODS
+      get_file_separator
+        CHANGING
+          file_separator TYPE string.
+ 
+    CLASS-METHODS
+      directory_exist
+        IMPORTING
+          directory TYPE string
+        RETURNING
+          VALUE(result) TYPE abap_bool.
+ 
+    CLASS-METHODS
+      directory_create
+        IMPORTING
+          directory TYPE string
+        CHANGING
+          rc TYPE i.
+ 
+    CLASS-METHODS
+      clipboard_export
+        IMPORTING
+          no_auth_check TYPE abap_bool OPTIONAL
+        EXPORTING
+          data TYPE any
+        CHANGING
+          rc TYPE i.
+ 
+    CLASS-METHODS
+      get_system_directory
+        CHANGING
+          system_directory TYPE string.
+ 
+    CLASS-METHODS
+      get_gui_version
+        CHANGING
+          version_table TYPE filetable
+          rc            TYPE i.
+ 
+    CLASS-METHODS clipboard_import
+      EXPORTING
+        data   TYPE STANDARD TABLE
+        length TYPE i.
+ 
+    CLASS-METHODS file_delete
+      IMPORTING
+        filename TYPE string
+      CHANGING
+        rc       TYPE i.
+ 
+    CLASS-METHODS get_sapgui_workdir
+      CHANGING
+        sapworkdir TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS cl_gui_frontend_services IMPLEMENTATION.
+  METHOD directory_exist.
+    ASSERT 1 = ''directory_exist not supported''.
+  ENDMETHOD.
+ 
+  METHOD get_sapgui_workdir.
+    ASSERT 1 = ''get_sapgui_workdir not supported''.
+  ENDMETHOD.
+ 
+  METHOD file_exist.
+    ASSERT 1 = ''file_exist not supported''.
+  ENDMETHOD.
+ 
+  METHOD file_delete.
+    ASSERT 1 = ''file_delete not supported''.
+  ENDMETHOD.
+ 
+  METHOD clipboard_import.
+    ASSERT 1 = ''clipboard_import not supported''.
+  ENDMETHOD.
+ 
+  METHOD directory_list_files.
+    ASSERT 1 = ''directory_list_files not supported''.
+  ENDMETHOD.
+ 
+  METHOD directory_create.
+    ASSERT 1 = ''directory_create not supported''.
+  ENDMETHOD.
+ 
+  METHOD gui_download.
+    ASSERT 1 = ''gui_download not supported''.
+  ENDMETHOD.
+ 
+  METHOD get_file_separator.
+    ASSERT 1 = ''get_file_separator not supported''.
+  ENDMETHOD.
+ 
+  METHOD execute.
+    ASSERT 1 = ''execute not supported''.
+  ENDMETHOD.
+ 
+  METHOD directory_browse.
+    ASSERT 1 = ''directory_browse not supported''.
+  ENDMETHOD.
+ 
+  METHOD gui_upload.
+    ASSERT 1 = ''gui_upload not supported''.
+  ENDMETHOD.
+ 
+  METHOD file_open_dialog.
+    ASSERT 1 = ''file_open_dialog not supported''.
+  ENDMETHOD.
+ 
+  METHOD file_save_dialog.
+    ASSERT 1 = ''file_save_dialog not supported''.
+  ENDMETHOD.
+ 
+  METHOD get_platform.
+    platform = platform_windowsxp.
+  ENDMETHOD.
+ 
+  METHOD clipboard_export.
+    ASSERT 1 = ''clipboard_export not supported''.
+  ENDMETHOD.
+ 
+  METHOD get_system_directory.
+    ASSERT 1 = ''get_system_directory not supported''.
+  ENDMETHOD.
+ 
+  METHOD get_gui_version.
+    ASSERT 1 = ''get_gui_verison not supported''.
+  ENDMETHOD.
+ENDCLASS.
+');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_PROGRESS_INDICATOR                   ', 'CLASS cl_progress_indicator DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS progress_indicate
+      IMPORTING
+        i_text               TYPE any OPTIONAL
+        i_processed          TYPE sy-tabix OPTIONAL
+        i_total              TYPE sy-tabix OPTIONAL
+        i_output_immediately TYPE abap_bool OPTIONAL
+      EXPORTING
+        e_progress_sent      TYPE abap_bool.
+ENDCLASS.
+ 
+CLASS cl_progress_indicator IMPLEMENTATION.
+  METHOD progress_indicate.
+* do nothing, gui is not supported, but background logic might indicatoe progress
+    RETURN.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SALV_AGGREGATIONS                    ', 'CLASS cl_salv_aggregations DEFINITION PUBLIC.
+  PUBLIC SECTION.
+ 
+ENDCLASS.
+ 
+CLASS cl_salv_aggregations IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SALV_COLUMN                          ', 'CLASS cl_salv_column DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    METHODS set_technical IMPORTING value TYPE abap_bool DEFAULT abap_true.
+    METHODS set_short_text IMPORTING value TYPE string.
+    METHODS set_medium_text IMPORTING value TYPE string.
+    METHODS set_long_text IMPORTING value TYPE string.
+ENDCLASS.
+ 
+CLASS cl_salv_column IMPLEMENTATION.
+  METHOD set_technical.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_short_text.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_medium_text.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_long_text.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SALV_COLUMNS_TABLE                   ', 'CLASS cl_salv_columns_table DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    METHODS set_cell_type_column
+      IMPORTING value TYPE string.
+    METHODS set_optimize
+      IMPORTING value TYPE abap_bool DEFAULT abap_true.
+    METHODS set_color_column
+      IMPORTING value TYPE string.
+    METHODS get_column
+      IMPORTING columnname TYPE string
+      RETURNING VALUE(value) TYPE REF TO cl_salv_column.
+    METHODS get
+      RETURNING VALUE(value) TYPE string.
+ENDCLASS.
+ 
+CLASS cl_salv_columns_table IMPLEMENTATION.
+  METHOD get_column.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_cell_type_column.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_optimize.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_color_column.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SALV_EVENTS_TABLE                    ', 'CLASS cl_salv_events_table DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    EVENTS double_click
+      EXPORTING
+        VALUE(row)    TYPE i
+        VALUE(column) TYPE string.
+ 
+    EVENTS added_function
+      EXPORTING
+        VALUE(e_salv_function) TYPE string OPTIONAL.
+ 
+    EVENTS link_click
+      EXPORTING
+        VALUE(row) TYPE i
+        VALUE(column) TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS cl_salv_events_table IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SALV_FILTERS                         ', 'CLASS cl_salv_filters DEFINITION PUBLIC.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS cl_salv_filters IMPLEMENTATION.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SALV_FUNCTIONS_LIST                  ', 'CLASS cl_salv_functions_list DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    METHODS set_all IMPORTING flag TYPE abap_bool OPTIONAL.
+    METHODS get_functions RETURNING VALUE(sdf) TYPE string.
+ENDCLASS.
+ 
+CLASS cl_salv_functions_list IMPLEMENTATION.
+  METHOD set_all.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_functions.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SALV_TABLE                           ', 'CLASS cl_salv_table DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CONSTANTS c_functions_all TYPE i VALUE 1.
+    TYPES ty_rows TYPE STANDARD TABLE OF i WITH DEFAULT KEY.
+ 
+    CLASS-METHODS factory
+      IMPORTING
+        r_container TYPE any OPTIONAL
+      EXPORTING
+        r_salv_table TYPE any
+      CHANGING
+        t_table TYPE any.
+    METHODS get_selections RETURNING VALUE(val) TYPE REF TO cl_salv_table.
+    METHODS set_selected_rows IMPORTING val TYPE any.
+    METHODS set_selection_mode IMPORTING val TYPE i.
+    METHODS get_selected_rows RETURNING VALUE(rows) TYPE ty_rows.
+    METHODS close_screen.
+    METHODS refresh.
+    METHODS display.
+    METHODS is_offline RETURNING VALUE(value) TYPE abap_bool.
+    METHODS get_metadata.
+    METHODS set_screen_status
+      IMPORTING
+        pfstatus      TYPE any
+        set_functions TYPE any OPTIONAL
+        report        TYPE any.
+    METHODS set_screen_popup
+      IMPORTING
+        start_column TYPE i
+        end_column   TYPE i
+        start_line   TYPE i
+        end_line     TYPE i.
+    METHODS get_event
+      RETURNING VALUE(val) TYPE REF TO cl_salv_events_table.
+    METHODS get_display_settings
+      RETURNING VALUE(val) TYPE REF TO cl_salv_table.
+    METHODS set_striped_pattern IMPORTING val TYPE any.
+    METHODS set_list_header IMPORTING val TYPE any.
+    METHODS set_top_of_list IMPORTING val TYPE any.
+    METHODS get_columns RETURNING VALUE(val) TYPE REF TO cl_salv_columns_table.
+    METHODS get_functions RETURNING VALUE(val) TYPE REF TO cl_salv_functions_list.
+    METHODS get_aggregations
+      RETURNING
+        VALUE(value) TYPE REF TO cl_salv_aggregations.
+    METHODS get_filters
+      RETURNING
+        VALUE(foo) TYPE REF TO cl_salv_filters.
+ENDCLASS.
+ 
+CLASS cl_salv_table IMPLEMENTATION.
+ 
+  METHOD set_selected_rows.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_filters.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_aggregations.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_functions.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_selected_rows.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_metadata.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_selection_mode.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_striped_pattern.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_list_header.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD factory.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD is_offline.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_selections.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD close_screen.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD refresh.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD display.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD set_screen_status.
+    ASSERT 1 = ''TODO''.
+  ENDMETHOD.
+ 
+  METHOD set_screen_popup.
+    ASSERT 1 = ''TODO''.
+  ENDMETHOD.
+ 
+  METHOD get_event.
+    ASSERT 1 = ''TODO''.
+  ENDMETHOD.
+ 
+  METHOD get_display_settings.
+    ASSERT 1 = ''TODO''.
+  ENDMETHOD.
+ 
+  METHOD set_top_of_list.
+    ASSERT 1 = ''TODO''.
+  ENDMETHOD.
+ 
+  METHOD get_columns.
+    ASSERT 1 = ''TODO''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SALV_ACCESS_ERROR                    ', 'CLASS cx_salv_access_error DEFINITION PUBLIC INHERITING FROM cx_salv_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_salv_access_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SALV_DATA_ERROR                      ', 'CLASS cx_salv_data_error DEFINITION PUBLIC INHERITING FROM cx_salv_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_salv_data_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SALV_ERROR                           ', 'CLASS cx_salv_error DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_salv_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SALV_MSG                             ', 'CLASS cx_salv_msg DEFINITION PUBLIC INHERITING FROM cx_salv_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_salv_msg IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SALV_NOT_FOUND                       ', 'CLASS cx_salv_not_found DEFINITION PUBLIC INHERITING FROM cx_salv_access_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_salv_not_found IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SALV_STATIC_CHECK                    ', 'CLASS cx_salv_static_check DEFINITION PUBLIC INHERITING FROM cx_salv_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_salv_static_check IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SALV_C_BOOL_SAP                      ', 'INTERFACE if_salv_c_bool_sap PUBLIC.
+  CONSTANTS true TYPE abap_bool VALUE abap_true.
+  CONSTANTS false TYPE abap_bool VALUE abap_false.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SALV_C_SELECTION_MODE                ', 'INTERFACE if_salv_c_selection_mode PUBLIC.
+  CONSTANTS cell       TYPE i VALUE 1.
+  CONSTANTS multiple   TYPE i VALUE 2.
+  CONSTANTS none       TYPE i VALUE 3.
+  CONSTANTS row_column TYPE i VALUE 4.
+  CONSTANTS single     TYPE i VALUE 5.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_HTTP_CLIENT                          ', 'CLASS cl_http_client DEFINITION PUBLIC CREATE PRIVATE.
+  PUBLIC SECTION.
+    INTERFACES if_http_client.
+ 
+    CLASS-METHODS create_by_url
+      IMPORTING
+        url           TYPE string
+        ssl_id        TYPE ssfapplssl OPTIONAL
+        proxy_host    TYPE string OPTIONAL
+        proxy_service TYPE string OPTIONAL
+      EXPORTING
+        VALUE(client) TYPE REF TO if_http_client.
+* todo, add classic exceptions
+ 
+    CLASS-METHODS create_by_destination
+      IMPORTING
+        destination   TYPE clike
+      EXPORTING
+        VALUE(client) TYPE REF TO if_http_client.
+* todo, add classic exceptions
+ 
+    METHODS constructor
+      IMPORTING
+        url TYPE string.
+ 
+  PRIVATE SECTION.
+    DATA mv_host TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS cl_http_client IMPLEMENTATION.
+ 
+  METHOD constructor.
+* SSL_ID and proxies are currently ignored
+ 
+    DATA lv_uri TYPE string.
+    DATA lv_query TYPE string.
+ 
+    CREATE OBJECT if_http_client~response TYPE cl_http_entity.
+ 
+    FIND REGEX ''\\w(\\/[\\w\\d\\.\\-\\/]+)'' IN url SUBMATCHES lv_uri.
+    mv_host = url.
+*    WRITE ''@KERNEL console.dir(this.mv_host.get());''.
+*    WRITE ''@KERNEL console.dir(lv_uri.get());''.
+    REPLACE FIRST OCCURRENCE OF lv_uri IN mv_host WITH ''''.
+ 
+    CREATE OBJECT if_http_client~request TYPE cl_http_entity.
+    if_http_client~request->set_header_field(
+      name = ''~request_uri''
+      value = lv_uri ).
+ 
+    FIND REGEX ''\\?(.*)'' IN url SUBMATCHES lv_query.
+    IF sy-subrc = 0.
+      cl_http_utility=>set_query(
+        request = if_http_client~request
+        query   = lv_query ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD create_by_url.
+    CREATE OBJECT client TYPE cl_http_client
+      EXPORTING
+        url = url.
+    sy-subrc = 0. " todo
+  ENDMETHOD.
+ 
+  METHOD if_http_client~authenticate.
+    DATA lv_base64 TYPE string.
+    lv_base64 = cl_http_utility=>encode_base64( |{ username }:{ password }| ).
+    if_http_client~request->set_header_field(
+      name = ''authorization''
+      value = |Basic { lv_base64 }| ).
+  ENDMETHOD.
+ 
+  METHOD if_http_client~close.
+* todo
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD create_by_destination.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_client~send.
+    DATA lv_method        TYPE string.
+    DATA lv_url           TYPE string.
+    DATA lv_body          TYPE string.
+    DATA lv_name          TYPE string.
+    DATA lv_value         TYPE string.
+    DATA lv_content_type  TYPE string.
+    DATA lv_xstr          TYPE xstring.
+    DATA lt_form_fields   TYPE tihttpnvp.
+    DATA lt_header_fields TYPE tihttpnvp.
+    DATA ls_field         LIKE LINE OF lt_header_fields.
+ 
+    lv_method = if_http_client~request->get_method( ).
+    IF lv_method IS INITIAL.
+      lv_method = ''GET''.
+    ENDIF.
+ 
+* default user-agent if not set
+    IF if_http_client~request->get_header_field( ''user-agent'' ) IS INITIAL.
+      if_http_client~request->set_header_field(
+        name  = ''user-agent''
+        value = ''open-abap-http'' ).
+    ENDIF.
+ 
+* building URL
+    lv_url = if_http_client~request->get_header_field( ''~request_uri'' ).
+    REPLACE FIRST OCCURRENCE OF mv_host IN lv_url WITH ''''.
+    lv_url = mv_host && lv_url.
+    if_http_client~request->get_form_fields( CHANGING fields = lt_form_fields ).
+    IF lines( lt_form_fields ) > 0.
+      CASE lv_method.
+        WHEN ''GET''.
+          lv_url = lv_url && ''?'' && cl_http_utility=>fields_to_string( lt_form_fields ).
+        WHEN ''POST''.
+          if_http_client~request->set_cdata( cl_http_utility=>fields_to_string( lt_form_fields ) ).
+      ENDCASE.
+    ENDIF.
+*    WRITE ''@KERNEL console.dir(lv_url.get());''.
+ 
+* building headers
+    if_http_client~request->get_header_fields( CHANGING fields = lt_header_fields ).
+    WRITE ''@KERNEL let headers = {};''.
+    LOOP AT lt_header_fields INTO ls_field WHERE name <> ''~request_uri''.
+      WRITE ''@KERNEL headers[ls_field.get().name.get()] = ls_field.get().value.get();''.
+    ENDLOOP.
+ 
+    lv_content_type = if_http_client~request->get_content_type( ).
+    IF lv_content_type IS NOT INITIAL.
+      WRITE ''@KERNEL headers["content-type"] = lv_content_type.get();''.
+    ENDIF.
+    WRITE ''@KERNEL headers["accept-encoding"] = "gzip";''.
+ 
+*    WRITE ''@KERNEL console.dir(headers);''.
+ 
+    lv_body = if_http_client~request->get_cdata( ).
+*    WRITE ''@KERNEL console.dir(lv_body);''.
+    IF strlen( lv_body ) > 0.
+      WRITE ''@KERNEL headers["content-length"] = lv_body.get().length;''.
+    ENDIF.
+ 
+    WRITE ''@KERNEL const https = await import("https");''.
+    WRITE ''@KERNEL const http = await import("http");''.
+    WRITE ''@KERNEL function postData(url, options, requestBody) {''.
+    WRITE ''@KERNEL   return new Promise((resolve, reject) => {''.
+    WRITE ''@KERNEL     const prot = url.startsWith("http://") ? http : https;''.
+    WRITE ''@KERNEL     const req = prot.request(url, options,''.
+    WRITE ''@KERNEL       (res) => {''.
+    WRITE ''@KERNEL         let chunks = [];''.
+    WRITE ''@KERNEL         res.on("data", (chunk) => {chunks.push(chunk);});''.
+    WRITE ''@KERNEL         res.on("error", reject);''.
+    WRITE ''@KERNEL         res.on("end", () => {''.
+*    WRITE ''@KERNEL           console.dir(res.statusCode + " " + JSON.stringify(res.headers));''.
+*    WRITE ''@KERNEL           if (res.statusCode >= 200 && res.statusCode <= 299) {''.
+    WRITE ''@KERNEL             resolve({statusCode: res.statusCode, headers: res.headers, body: Buffer.concat(chunks)});''.
+*    WRITE ''@KERNEL           } else {''.
+*    WRITE ''@KERNEL             reject("Request failed. status: " + res.statusCode + ", body: " + Buffer.concat(chunks).toString());''.
+*    WRITE ''@KERNEL           }''.
+    WRITE ''@KERNEL         });''.
+    WRITE ''@KERNEL       });''.
+    WRITE ''@KERNEL     req.on("error", reject);''.
+    WRITE ''@KERNEL     req.write(requestBody, "binary");''.
+    WRITE ''@KERNEL     req.end();''.
+    WRITE ''@KERNEL   });''.
+    WRITE ''@KERNEL }''.
+ 
+    WRITE ''@KERNEL const prot = lv_url.get().startsWith("http://") ? http : https;''.
+    WRITE ''@KERNEL if (this.agent === undefined) {this.agent = new prot.Agent({keepAlive: true, maxSockets: 1});}''.
+    WRITE ''@KERNEL let response = await postData(lv_url.get(), {method: lv_method.get(), headers: headers, agent: this.agent}, lv_body.get());''.
+ 
+    " WRITE ''@KERNEL console.dir(response);''.
+    " WRITE ''@KERNEL console.dir(response.headers);''.
+ 
+    WRITE ''@KERNEL for (const h in response.headers) {''.
+    WRITE ''@KERNEL   lv_name.set(h);''.
+    WRITE ''@KERNEL   if (Array.isArray(response.headers[h])) continue;''.
+    WRITE ''@KERNEL   lv_value.set(response.headers[h]);''.
+    if_http_client~response->set_header_field(
+      name  = lv_name
+      value = lv_value ).
+    WRITE ''@KERNEL }''.
+ 
+ 
+    WRITE ''@KERNEL this.if_http_client$response.get().mv_content_type.set(response.headers["content-type"] || "");''.
+    WRITE ''@KERNEL this.if_http_client$response.get().mv_status.set(response.statusCode);''.
+    WRITE ''@KERNEL this.if_http_client$response.get().mv_data.set(response.body.toString("hex").toUpperCase());''.
+*    WRITE ''@KERNEL console.dir(this.if_http_client$response.get().mv_data);''.
+ 
+    lv_value = if_http_client~response->get_header_field( ''content-encoding'' ).
+    IF lv_value = ''gzip''.
+      cl_abap_gzip=>decompress_binary_with_header(
+        EXPORTING
+          gzip_in = if_http_client~response->get_data( )
+        IMPORTING
+          raw_out = lv_xstr ).
+      if_http_client~response->set_data( lv_xstr ).
+    ENDIF.
+ 
+* workaround for classic exceptions, this should work sometime in the transpiler instead
+    sy-subrc = 0.
+ 
+  ENDMETHOD.
+ 
+  METHOD if_http_client~receive.
+* handled in send()
+ 
+* workaround for classic exceptions, this should work sometime in the transpiler instead
+    sy-subrc = 0.
+ 
+  ENDMETHOD.
+ 
+  METHOD if_http_client~get_last_error.
+    if_http_client~response->get_status( IMPORTING code = code ).
+    message = ''todo_open_abap''. " get from one of the response headers?
+  ENDMETHOD.
+ 
+  METHOD if_http_client~send_sap_logon_ticket.
+    ASSERT 2 = ''not supported''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_HTTP_ENTITY                          ', 'CLASS cl_http_entity DEFINITION PUBLIC CREATE PRIVATE.
+  PUBLIC SECTION.
+    INTERFACES if_http_response.
+    INTERFACES if_http_request.
+  PRIVATE SECTION.
+    DATA mv_status       TYPE i.
+    DATA mv_reason       TYPE string.
+    DATA mv_content_type TYPE string.
+    DATA mv_method       TYPE string.
+    DATA mv_data         TYPE xstring.
+    DATA mt_headers      TYPE tihttpnvp.
+    DATA mt_form_fields  TYPE tihttpnvp.
+ENDCLASS.
+ 
+CLASS cl_http_entity IMPLEMENTATION.
+ 
+  METHOD if_http_response~server_cache_expire_rel.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_response~server_cache_expire_default.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_response~server_cache_expire_abs.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_response~server_cache_browser_dependent.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_response~get_raw_message.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_response~copy.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~get_user_agent.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~get_uri_parameter.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~get_raw_message.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~get_form_data.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~get_authorization.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~copy.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~set_authorization.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~add_multipart.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_cookie_field.
+* todo
+    CLEAR field_value.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_compression.
+* todo
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~append_cdata.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~append_cdata2.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~add_cookie_field.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~append_data.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~to_xstring.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~delete_cookie_secure.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_cookies.
+* todo
+    CLEAR cookies.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~delete_form_field.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~delete_form_field_secure.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_cookie.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_data_length.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~from_xstring.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_form_field_cs.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_last_error.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~delete_header_field.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~delete_header_field_secure.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~delete_cookie.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_header_fields.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~suppress_content_type.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_formfield_encoding.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_cookie.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_version.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_serialized_message_length.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_header_field.
+    DATA ls_header LIKE LINE OF mt_headers.
+    READ TABLE mt_headers WITH KEY name = to_lower( name ) INTO ls_header.
+    IF sy-subrc = 0.
+      value = ls_header-value.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_header_fields.
+    fields = mt_headers.
+  ENDMETHOD.
+ 
+  METHOD if_http_response~get_status.
+    code = mv_status.
+    reason = mv_reason.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_cdata.
+    cl_abap_conv_in_ce=>create( encoding = ''UTF-8'' )->convert(
+      EXPORTING input = mv_data
+      IMPORTING data = data ).
+  ENDMETHOD.
+ 
+  METHOD if_http_response~set_status.
+    mv_status = code.
+    mv_reason = reason.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_cdata.
+    cl_abap_conv_out_ce=>create( encoding = ''UTF-8'' )->convert(
+      EXPORTING data = data
+      IMPORTING buffer = mv_data ).
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_content_type.
+    val = if_http_entity~get_header_field( ''content-type'' ).
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_content_type.
+    if_http_entity~set_header_field(
+      name  = ''content-type''
+      value = content_type ).
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_data.
+    data = mv_data.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_data.
+    mv_data = data.
+  ENDMETHOD.
+ 
+  METHOD if_http_response~delete_cookie_at_client.
+    ASSERT 2 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_response~redirect.
+    ASSERT 2 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~num_multiparts.
+* todo
+    num = 0.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_multipart.
+    ASSERT 2 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_form_fields_cs.
+    fields = mt_form_fields.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_form_fields.
+    mt_form_fields = fields.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_form_fields.
+    DATA ls_field LIKE LINE OF mt_form_fields.
+    LOOP AT mt_form_fields INTO ls_field.
+      TRANSLATE ls_field-name TO LOWER CASE.
+      APPEND ls_field TO fields.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~get_form_field.
+    DATA ls_field LIKE LINE OF mt_form_fields.
+    READ TABLE mt_form_fields INTO ls_field WITH KEY name = to_lower( name ).
+    IF sy-subrc = 0.
+      value = ls_field-value.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_header_field.
+    DATA ls_header LIKE LINE OF mt_headers.
+    FIELD-SYMBOLS <ls_header> LIKE LINE OF mt_headers.
+    READ TABLE mt_headers WITH KEY name = to_lower( name ) ASSIGNING <ls_header>.
+    IF sy-subrc = 0.
+      <ls_header>-value = value.
+    ELSE.
+      ls_header-name = to_lower( name ).
+      ls_header-value = value.
+      APPEND ls_header TO mt_headers.
+    ENDIF.
+    IF name = ''~request_method''.
+      if_http_request~set_method( value ).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~set_method.
+    mv_method = method.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~get_method.
+    meth = mv_method.
+  ENDMETHOD.
+ 
+  METHOD if_http_request~set_version.
+    ASSERT 2 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_entity~set_form_field.
+    DATA ls_field LIKE LINE OF mt_form_fields.
+    ls_field-name = name.
+    ls_field-value = value.
+    APPEND ls_field TO mt_form_fields.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_HTTP_SERVER                          ', 'CLASS cl_http_server DEFINITION PUBLIC CREATE PRIVATE.
+  PUBLIC SECTION.
+    CLASS-METHODS get_location
+      IMPORTING
+        application TYPE csequence OPTIONAL
+      EXPORTING
+        port         TYPE string
+        out_protocol TYPE string
+        host         TYPE string.
+ENDCLASS.
+ 
+CLASS cl_http_server IMPLEMENTATION.
+  METHOD get_location.
+    host = ''open-abap.org''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_HTTP_UTILITY                         ', 'CLASS cl_http_utility DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    INTERFACES if_http_utility.
+ 
+    ALIASES decode_base64 FOR if_http_utility~decode_base64.
+    ALIASES encode_base64 FOR if_http_utility~encode_base64.
+    ALIASES escape_url FOR if_http_utility~escape_url.
+    ALIASES fields_to_string FOR if_http_utility~fields_to_string.
+    ALIASES get_last_error FOR if_http_utility~get_last_error.
+    ALIASES string_to_fields FOR if_http_utility~string_to_fields.
+    ALIASES unescape_url FOR if_http_utility~unescape_url.
+ 
+    CLASS-METHODS decode_x_base64
+      IMPORTING
+        encoded TYPE string
+      RETURNING
+        VALUE(decoded) TYPE xstring.
+ 
+    CLASS-METHODS encode_x_base64
+      IMPORTING
+        data           TYPE xstring
+      RETURNING
+        VALUE(encoded) TYPE string.
+ 
+    CLASS-METHODS set_query
+      IMPORTING
+        request TYPE REF TO if_http_request
+        query   TYPE string.
+ 
+    CLASS-METHODS set_request_uri
+      IMPORTING
+        request TYPE REF TO if_http_request
+        uri     TYPE string.
+ 
+    CLASS-METHODS escape_xml_attr_value
+      IMPORTING
+        unescaped      TYPE csequence
+      RETURNING
+        VALUE(escaped) TYPE string.
+ 
+    CLASS-METHODS escape_html
+      IMPORTING
+        unescaped         TYPE string
+        keep_num_char_ref TYPE abap_bool DEFAULT abap_undefined
+      RETURNING
+        VALUE(escaped)    TYPE string.
+ 
+    CLASS-METHODS escape_javascript
+      IMPORTING
+        unescaped      TYPE string
+        inside_html    TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(escaped) TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS cl_http_utility IMPLEMENTATION.
+ 
+  METHOD set_request_uri.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD escape_html.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD escape_javascript.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD escape_xml_attr_value.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_utility~get_last_error.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_http_utility~string_to_fields.
+    DATA tab TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+    DATA str LIKE LINE OF tab.
+    DATA ls_field LIKE LINE OF fields.
+ 
+    SPLIT string AT ''&'' INTO TABLE tab.
+    LOOP AT tab INTO str.
+      SPLIT str AT ''='' INTO ls_field-name ls_field-value.
+      APPEND ls_field TO fields.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD set_query.
+    request->set_form_fields( string_to_fields( query ) ).
+  ENDMETHOD.
+ 
+  METHOD if_http_utility~fields_to_string.
+    DATA tab TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+    DATA str TYPE string.
+    DATA ls_field LIKE LINE OF fields.
+ 
+    LOOP AT fields INTO ls_field.
+      REPLACE ALL OCCURRENCES OF '':'' IN ls_field-value WITH ''%3a''.
+      REPLACE ALL OCCURRENCES OF ''/'' IN ls_field-value WITH ''%2f''.
+      str = ls_field-name && ''='' && ls_field-value.
+      APPEND str TO tab.
+    ENDLOOP.
+    string = concat_lines_of( table = tab sep = ''&'' ).
+  ENDMETHOD.
+ 
+  METHOD encode_x_base64.
+    WRITE ''@KERNEL let buffer = Buffer.from(data.get(), "hex");''.
+    WRITE ''@KERNEL encoded.set(buffer.toString("base64"));''.
+  ENDMETHOD.
+ 
+  METHOD decode_x_base64.
+    WRITE ''@KERNEL let buffer = Buffer.from(encoded.get(), "base64");''.
+    WRITE ''@KERNEL decoded.set(buffer.toString("hex").toUpperCase());''.
+  ENDMETHOD.
+ 
+  METHOD if_http_utility~unescape_url.
+    WRITE ''@KERNEL let foo = escaped.get();''.
+    WRITE ''@KERNEL unescaped.set(decodeURIComponent(foo));''.
+  ENDMETHOD.
+ 
+  METHOD if_http_utility~escape_url.
+    WRITE ''@KERNEL escaped.set(encodeURIComponent(unescaped.get()));''.
+  ENDMETHOD.
+ 
+  METHOD if_http_utility~encode_base64.
+    WRITE ''@KERNEL let buffer = Buffer.from(unencoded.get());''.
+    WRITE ''@KERNEL encoded.set(buffer.toString("base64"));''.
+  ENDMETHOD.
+ 
+  METHOD if_http_utility~decode_base64.
+    WRITE ''@KERNEL let buffer = Buffer.from(encoded.get(), "base64");''.
+    WRITE ''@KERNEL decoded.set(buffer.toString());''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_WEB_HTTP_UTILITY                     ', 'CLASS cl_web_http_utility DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS unescape_url
+      IMPORTING
+        escaped TYPE string
+        options TYPE i OPTIONAL
+      RETURNING
+        VALUE(unescaped) TYPE string.
+ENDCLASS.
+ 
+CLASS cl_web_http_utility IMPLEMENTATION.
+  METHOD unescape_url.
+    unescaped = cl_http_utility=>unescape_url(
+      escaped = escaped
+      options = options ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_HTTP_CLIENT                          ', 'INTERFACE if_http_client PUBLIC.
+  DATA request TYPE REF TO if_http_request.
+  DATA response TYPE REF TO if_http_response.
+  DATA propertytype_logon_popup TYPE i.
+  DATA propertytype_accept_cookie TYPE i.
+ 
+  CONSTANTS co_disabled TYPE i VALUE 0.
+  CONSTANTS co_enabled TYPE i VALUE 1.
+ 
+  METHODS authenticate
+    IMPORTING
+      proxy_authentication TYPE abap_bool OPTIONAL
+      username             TYPE string
+      password             TYPE string.
+ 
+  METHODS close.
+ 
+  METHODS send
+    IMPORTING
+      timeout TYPE i DEFAULT 0
+    EXCEPTIONS
+      http_communication_failure
+      http_invalid_state
+      http_processing_failed
+      http_invalid_timeout.
+ 
+  METHODS receive
+    EXCEPTIONS
+      http_communication_failure
+      http_invalid_state
+      http_processing_failed.
+ 
+  METHODS send_sap_logon_ticket.
+ 
+  METHODS get_last_error
+    EXPORTING
+      code    TYPE i
+      message TYPE string.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_HTTP_ENTITY                          ', 'INTERFACE if_http_entity PUBLIC.
+ 
+  CONSTANTS co_request_method_get TYPE string VALUE ''GET''.
+  CONSTANTS co_request_method_post TYPE string VALUE ''POST''.
+  CONSTANTS co_body_before_query_string TYPE i VALUE 3.
+ 
+  METHODS set_cdata
+    IMPORTING
+      data   TYPE string
+      offset TYPE i OPTIONAL
+      length TYPE i OPTIONAL.
+ 
+  METHODS set_data
+    IMPORTING
+      data TYPE xstring.
+ 
+  METHODS get_header_field
+    IMPORTING
+      name TYPE string
+    RETURNING
+      VALUE(value) TYPE string.
+ 
+  METHODS set_header_field
+    IMPORTING
+      name  TYPE string
+      value TYPE string.
+ 
+  METHODS get_form_fields
+    CHANGING
+      fields TYPE tihttpnvp.
+ 
+  METHODS set_compression.
+ 
+  METHODS add_multipart
+    IMPORTING
+      suppress_content_length TYPE abap_bool DEFAULT abap_false
+    RETURNING
+      VALUE(entity) TYPE REF TO if_http_entity.
+ 
+  METHODS append_cdata IMPORTING data TYPE clike.
+ 
+  METHODS get_form_field IMPORTING name TYPE string RETURNING VALUE(value) TYPE string.
+ 
+  METHODS get_cdata RETURNING VALUE(data) TYPE string.
+ 
+  METHODS get_content_type
+    RETURNING VALUE(val) TYPE string.
+ 
+  METHODS get_serialized_message_length
+    EXPORTING
+      VALUE(body_length) TYPE i
+      VALUE(header_length) TYPE i.
+ 
+  METHODS set_content_type
+    IMPORTING
+      content_type TYPE string.
+ 
+  METHODS get_data
+    RETURNING
+      VALUE(data) TYPE xstring.
+ 
+  METHODS get_header_fields
+    CHANGING
+      fields TYPE tihttpnvp.
+ 
+  METHODS to_xstring
+    RETURNING
+      VALUE(data) TYPE xstring.
+ 
+  METHODS get_cookies
+    CHANGING
+      cookies TYPE any.
+ 
+  METHODS add_cookie_field
+    IMPORTING
+      cookie_name TYPE string
+      cookie_path TYPE string OPTIONAL
+      field_name  TYPE string
+      field_value TYPE string
+      base64      TYPE i DEFAULT 1.
+ 
+  METHODS append_cdata2
+    IMPORTING
+      data     TYPE string
+      encoding TYPE i OPTIONAL
+      offset   TYPE i OPTIONAL
+      length   TYPE i OPTIONAL.
+ 
+  METHODS append_data
+    IMPORTING
+      data   TYPE xstring
+      offset TYPE i OPTIONAL
+      length TYPE i OPTIONAL.
+ 
+  METHODS delete_cookie_secure
+    IMPORTING
+      name TYPE string
+      path TYPE string DEFAULT \`\`.
+ 
+  METHODS delete_form_field
+    IMPORTING
+      name TYPE string.
+ 
+  METHODS delete_form_field_secure
+    IMPORTING
+      name TYPE string.
+ 
+  METHODS from_xstring
+    IMPORTING
+      data TYPE xstring.
+ 
+  METHODS get_cookie
+    IMPORTING
+      name TYPE string
+      path TYPE string DEFAULT \`\`
+    EXPORTING
+      value   TYPE string
+      domain  TYPE string
+      expires TYPE string
+      secure  TYPE i.
+ 
+  METHODS get_cookie_field
+    IMPORTING
+      cookie_name TYPE string
+      cookie_path TYPE string OPTIONAL
+      field_name  TYPE string
+      base64      TYPE i DEFAULT 1
+    RETURNING
+      VALUE(field_value) TYPE string.
+ 
+  METHODS get_data_length
+    EXPORTING
+      VALUE(data_length) TYPE i.
+ 
+  METHODS get_form_fields_cs
+    IMPORTING
+      formfield_encoding TYPE i OPTIONAL
+      search_option      TYPE i DEFAULT co_body_before_query_string
+    CHANGING
+      fields             TYPE tihttpnvp.
+ 
+  METHODS get_form_field_cs
+    IMPORTING
+      name               TYPE string
+      formfield_encoding TYPE i OPTIONAL
+      search_option      TYPE i DEFAULT co_body_before_query_string
+    RETURNING
+      VALUE(value)       TYPE string.
+ 
+  METHODS get_last_error
+    RETURNING
+      VALUE(rc) TYPE i.
+ 
+  METHODS get_multipart
+    IMPORTING
+      index TYPE i
+    RETURNING
+      VALUE(entity) TYPE REF TO if_http_entity.
+ 
+  METHODS get_version
+    RETURNING
+      VALUE(version) TYPE i.
+ 
+  METHODS num_multiparts
+    RETURNING
+      VALUE(num) TYPE i.
+ 
+  METHODS set_cookie
+    IMPORTING
+      name    TYPE string
+      path    TYPE string OPTIONAL
+      value   TYPE string
+      domain  TYPE string OPTIONAL
+      expires TYPE string OPTIONAL
+      secure  TYPE i OPTIONAL.
+ 
+  METHODS set_formfield_encoding
+    IMPORTING
+      formfield_encoding TYPE i.
+ 
+  METHODS set_form_field
+    IMPORTING
+      name  TYPE string
+      value TYPE string.
+ 
+  METHODS set_form_fields
+    IMPORTING
+      fields     TYPE tihttpnvp
+      multivalue TYPE int4 OPTIONAL.
+ 
+  METHODS set_header_fields
+    IMPORTING
+      fields TYPE tihttpnvp.
+ 
+  METHODS suppress_content_type
+    IMPORTING
+      suppress TYPE abap_bool DEFAULT abap_true.
+ 
+  METHODS delete_cookie
+    IMPORTING
+      name TYPE string
+      path TYPE string OPTIONAL.
+ 
+  METHODS delete_header_field
+    IMPORTING
+      name TYPE string.
+ 
+  METHODS delete_header_field_secure
+    IMPORTING
+      name TYPE string.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_HTTP_EXTENSION                       ', 'INTERFACE if_http_extension PUBLIC.
+ 
+  DATA flow_rc TYPE i.
+ 
+  CONSTANTS co_flow_ok             TYPE i VALUE 0.
+  CONSTANTS co_flow_ok_others_mand TYPE i VALUE 2.
+ 
+  METHODS handle_request IMPORTING server TYPE REF TO if_http_server.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_HTTP_REQUEST                         ', 'INTERFACE if_http_request PUBLIC.
+ 
+  CONSTANTS:
+    co_protocol_version_1_1 TYPE string VALUE ''VER11'',
+    co_protocol_version_1_0 TYPE string VALUE ''VER10'',
+    co_request_method_get TYPE string VALUE ''GET'',
+    co_request_method_post TYPE string VALUE ''POST''.
+ 
+  INTERFACES if_http_entity.
+ 
+  ALIASES add_multipart FOR if_http_entity~add_multipart.
+  ALIASES get_cdata FOR if_http_entity~get_cdata.
+  ALIASES get_content_type FOR if_http_entity~get_content_type.
+  ALIASES get_cookie_field FOR if_http_entity~get_cookie_field.
+  ALIASES get_cookies FOR if_http_entity~get_cookies.
+  ALIASES get_data FOR if_http_entity~get_data.
+  ALIASES get_form_field FOR if_http_entity~get_form_field.
+  ALIASES get_form_fields FOR if_http_entity~get_form_fields.
+  ALIASES get_form_fields_cs FOR if_http_entity~get_form_fields_cs.
+  ALIASES get_header_field FOR if_http_entity~get_header_field.
+  ALIASES get_header_fields FOR if_http_entity~get_header_fields.
+  ALIASES get_last_error FOR if_http_entity~get_last_error.
+  ALIASES get_multipart FOR if_http_entity~get_multipart.
+  ALIASES num_multiparts FOR if_http_entity~num_multiparts.
+  ALIASES set_cdata FOR if_http_entity~set_cdata.
+  ALIASES set_compression FOR if_http_entity~set_compression.
+  ALIASES set_content_type FOR if_http_entity~set_content_type.
+  ALIASES set_cookie FOR if_http_entity~set_cookie.
+  ALIASES set_data FOR if_http_entity~set_data.
+  ALIASES set_form_field FOR if_http_entity~set_form_field.
+  ALIASES set_form_fields FOR if_http_entity~set_form_fields.
+  ALIASES set_header_field FOR if_http_entity~set_header_field.
+  ALIASES set_header_fields FOR if_http_entity~set_header_fields.
+ 
+  METHODS set_method
+    IMPORTING
+      method TYPE string.
+ 
+  METHODS get_method
+    RETURNING
+      VALUE(meth) TYPE string.
+ 
+  METHODS set_version
+    IMPORTING
+      version TYPE string.
+ 
+  METHODS set_authorization
+    IMPORTING
+      auth_type TYPE i DEFAULT 1
+      username  TYPE string
+      password  TYPE string.
+ 
+  METHODS copy
+    RETURNING
+      VALUE(request) TYPE REF TO if_http_request.
+ 
+  METHODS get_authorization
+    EXPORTING
+      auth_type TYPE i
+      username  TYPE string
+      password  TYPE string.
+ 
+  METHODS get_form_data
+    IMPORTING
+      name TYPE string
+    CHANGING
+      data TYPE data.
+ 
+  METHODS get_raw_message
+    RETURNING
+      VALUE(data) TYPE xstring.
+ 
+  METHODS get_uri_parameter
+    IMPORTING
+      name         TYPE string
+    RETURNING
+      VALUE(value) TYPE string.
+ 
+  METHODS get_user_agent
+    EXPORTING
+      user_agent_type    TYPE i
+      user_agent_version TYPE i.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_HTTP_RESPONSE                        ', 'INTERFACE if_http_response PUBLIC.
+ 
+  INTERFACES if_http_entity.
+ 
+  ALIASES get_header_field FOR if_http_entity~get_header_field.
+  ALIASES get_cdata FOR if_http_entity~get_cdata.
+  ALIASES get_content_type FOR if_http_entity~get_content_type.
+  ALIASES set_content_type FOR if_http_entity~set_content_type.
+  ALIASES get_data FOR if_http_entity~get_data.
+  ALIASES set_data FOR if_http_entity~set_data.
+  ALIASES get_header_fields FOR if_http_entity~get_header_fields.
+  ALIASES set_header_field FOR if_http_entity~set_header_field.
+  ALIASES set_cdata FOR if_http_entity~set_cdata.
+  ALIASES append_cdata FOR if_http_entity~append_cdata.
+  ALIASES set_cookie FOR if_http_entity~set_cookie.
+  ALIASES delete_header_field FOR if_http_entity~delete_header_field.
+  ALIASES set_compression FOR if_http_entity~set_compression.
+ 
+  METHODS get_status
+    EXPORTING
+      code   TYPE i
+      reason TYPE string.
+ 
+  METHODS set_status
+    IMPORTING
+      code   TYPE i
+      reason TYPE string.
+ 
+  METHODS delete_cookie_at_client
+    IMPORTING
+      name   TYPE string
+      path   TYPE string OPTIONAL
+      domain TYPE string OPTIONAL.
+ 
+  METHODS redirect
+    IMPORTING
+      url                TYPE string
+      permanently        TYPE i OPTIONAL
+      protocol_dependent TYPE i OPTIONAL.
+ 
+  METHODS copy
+    RETURNING
+      VALUE(response) TYPE REF TO if_http_response.
+ 
+  METHODS get_raw_message
+    RETURNING
+      VALUE(data) TYPE xstring.
+ 
+  METHODS server_cache_browser_dependent
+    IMPORTING
+      dependent TYPE boolean DEFAULT abap_true.
+ 
+  METHODS server_cache_expire_abs
+    IMPORTING
+      expires_abs_date  TYPE d OPTIONAL
+      expires_abs_time  TYPE t OPTIONAL
+      etag              TYPE char32 OPTIONAL
+      browser_dependent TYPE boolean DEFAULT abap_false
+      no_ufo_cache      TYPE boolean DEFAULT abap_false.
+ 
+  METHODS server_cache_expire_default
+    IMPORTING
+      etag              TYPE char32 OPTIONAL
+      browser_dependent TYPE boolean DEFAULT abap_false
+      no_ufo_cache      TYPE boolean DEFAULT abap_false.
+ 
+  METHODS server_cache_expire_rel
+    IMPORTING
+      expires_rel       TYPE i
+      etag              TYPE char32 OPTIONAL
+      browser_dependent TYPE boolean DEFAULT abap_false
+      no_ufo_cache      TYPE boolean DEFAULT abap_false.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_HTTP_SERVER                          ', 'INTERFACE if_http_server PUBLIC.
+ 
+  DATA response TYPE REF TO if_http_response.
+  DATA request TYPE REF TO if_http_request.
+ 
+  CONSTANTS authmethod_service             TYPE i VALUE 4.
+  CONSTANTS co_compress_based_on_mime_type TYPE i VALUE 2.
+  CONSTANTS co_disabled                    TYPE i VALUE 0.
+  CONSTANTS co_enabled                     TYPE i VALUE 1.
+  CONSTANTS co_page_error_type             TYPE c LENGTH 1 VALUE ''1''.
+  CONSTANTS co_response_page_option        TYPE c LENGTH 1 VALUE '' ''.
+ 
+  CLASS-DATA session_id TYPE string READ-ONLY.
+  CLASS-DATA authentication_method TYPE i READ-ONLY.
+ 
+  METHODS logoff
+    IMPORTING
+      delete_mysapsso2_cookie TYPE abap_bool OPTIONAL
+      propagate_logoff        TYPE abap_bool OPTIONAL
+      redirect_url            TYPE string OPTIONAL.
+ 
+  METHODS set_session_stateful
+    IMPORTING
+      stateful TYPE i DEFAULT co_enabled
+      path     TYPE string OPTIONAL.
+ 
+  CLASS-METHODS append_field_url
+    IMPORTING
+      name  TYPE string
+      value TYPE string
+    CHANGING
+      url   TYPE string.
+ 
+  METHODS create_abs_url
+    IMPORTING
+      protocol    TYPE string OPTIONAL
+      post        TYPE string OPTIONAL
+      port        TYPE string OPTIONAL
+      path        TYPE string OPTIONAL
+      querystring TYPE string OPTIONAL
+    RETURNING
+      VALUE(url) TYPE string.
+ 
+  METHODS create_rel_url
+    IMPORTING
+      path        TYPE string OPTIONAL
+      querystring TYPE string OPTIONAL
+    RETURNING
+      VALUE(url)  TYPE string.
+ 
+  CLASS-METHODS decode_base64
+    IMPORTING
+      encoded        TYPE string
+    RETURNING
+      VALUE(decoded) TYPE string.
+ 
+  METHODS enable_foreign_session_access
+    IMPORTING
+      url_path              TYPE string
+      user_id               TYPE syuname OPTIONAL
+      one_time_access_token TYPE abap_bool DEFAULT abap_true
+    EXPORTING
+      session_access_token  TYPE string
+    EXCEPTIONS
+      url_path_is_not_supported
+      user_unknown
+      session_is_not_stateful
+      internal_error.
+ 
+  CLASS-METHODS encode_base64
+    IMPORTING
+      unencoded TYPE string
+    RETURNING
+      VALUE(encoded) TYPE string.
+ 
+  CLASS-METHODS escape_html
+    IMPORTING
+      unescaped TYPE string
+    RETURNING
+      VALUE(escaped) TYPE string.
+ 
+  CLASS-METHODS escape_url
+    IMPORTING
+      unescaped TYPE string
+    RETURNING
+      VALUE(escaped) TYPE string.
+ 
+  CLASS-METHODS get_extension_info
+    IMPORTING
+      extension_class TYPE string OPTIONAL
+    EXPORTING
+      urls TYPE string_table.
+ 
+  CLASS-METHODS get_extension_url
+    IMPORTING
+      extension_class TYPE string
+    EXPORTING
+      urls TYPE string_table.
+ 
+  METHODS get_last_error
+    RETURNING
+      VALUE(rc) TYPE i.
+ 
+  CLASS-METHODS get_location
+    IMPORTING
+      protocol            TYPE csequence OPTIONAL
+      application         TYPE csequence OPTIONAL
+      for_domain          TYPE csequence OPTIONAL
+      server              TYPE REF TO if_http_server OPTIONAL
+      use_ticket_protocol TYPE abap_bool DEFAULT abap_true
+    EXPORTING
+      host TYPE string
+      port TYPE string
+      out_protocol TYPE string
+      vh_switch TYPE abap_bool
+    RETURNING
+      VALUE(url_part) TYPE string.
+ 
+  CLASS-METHODS get_location_exception
+    IMPORTING
+      protocol            TYPE csequence OPTIONAL
+      application         TYPE csequence OPTIONAL
+      for_domain          TYPE csequence OPTIONAL
+      server              TYPE REF TO if_http_server OPTIONAL
+      use_ticket_protocol TYPE abap_bool DEFAULT abap_true
+    EXPORTING
+      host                TYPE string
+      port                TYPE string
+      out_protocol        TYPE string
+      vh_switch           TYPE abap_bool
+    RETURNING
+      VALUE(url_part)     TYPE string.
+ 
+  METHODS get_xsrf_token
+    EXPORTING
+      token TYPE string
+    EXCEPTIONS
+      internal_error
+      called_by_public_service.
+ 
+  METHODS send_page.
+ 
+  METHODS set_compression
+    IMPORTING
+      options TYPE i DEFAULT co_compress_based_on_mime_type
+    EXCEPTIONS
+      compression_not_possible.
+ 
+  METHODS set_page
+    IMPORTING
+      response_page_type           TYPE char1 DEFAULT co_page_error_type
+      response_option              TYPE char1 DEFAULT co_response_page_option
+      response_option_page         TYPE any OPTIONAL
+      response_option_redirect_url TYPE any OPTIONAL
+    EXCEPTIONS
+      invalid_parameter
+      document_not_found.
+ 
+  METHODS set_session_stateful_via_url
+    IMPORTING
+      stateful    TYPE i DEFAULT co_enabled
+    CHANGING
+      rewrite_url TYPE string OPTIONAL.
+ 
+  CLASS-METHODS unescape_url
+    IMPORTING
+      escaped          TYPE string
+    RETURNING
+      VALUE(unescaped) TYPE string.
+ 
+  METHODS validate_xsrf_token
+    IMPORTING
+      token      TYPE string OPTIONAL
+    EXPORTING
+      successful TYPE abap_bool
+    EXCEPTIONS
+      token_not_found
+      cookie_not_found
+      internal_error
+      called_by_public_service.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_HTTP_UTILITY                         ', 'INTERFACE if_http_utility PUBLIC.
+ 
+  CLASS-METHODS string_to_fields
+    IMPORTING
+      string        TYPE string
+    RETURNING
+      VALUE(fields) TYPE tihttpnvp.
+ 
+  CLASS-METHODS get_last_error
+    RETURNING
+      VALUE(rc) TYPE i.
+ 
+  CLASS-METHODS unescape_url
+    IMPORTING
+      escaped          TYPE string
+      options          TYPE i OPTIONAL
+    RETURNING
+      VALUE(unescaped) TYPE string.
+ 
+  CLASS-METHODS escape_url
+    IMPORTING
+      unescaped      TYPE string
+    RETURNING
+      VALUE(escaped) TYPE string.
+ 
+  CLASS-METHODS encode_base64
+    IMPORTING
+      unencoded TYPE string
+    RETURNING
+      VALUE(encoded) TYPE string.
+ 
+  CLASS-METHODS fields_to_string
+    IMPORTING
+      fields TYPE tihttpnvp
+    RETURNING
+      VALUE(string) TYPE string.
+ 
+  CLASS-METHODS decode_base64
+    IMPORTING
+      encoded        TYPE string
+    RETURNING
+      VALUE(decoded) TYPE string.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SERIALIZABLE_OBJECT                  ', 'INTERFACE if_serializable_object PUBLIC.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_IXML                                 ', 'CLASS cl_ixml DEFINITION PUBLIC CREATE PRIVATE.
+  PUBLIC SECTION.
+    INTERFACES if_ixml.
+    CLASS-METHODS
+      create
+        RETURNING
+          VALUE(xml) TYPE REF TO if_ixml.
+ENDCLASS.
+ 
+CLASS cl_ixml IMPLEMENTATION.
+  METHOD create.
+    CREATE OBJECT xml TYPE cl_ixml.
+  ENDMETHOD.
+ 
+  METHOD if_ixml~create_encoding.
+    CREATE OBJECT rval TYPE lcl_encoding.
+  ENDMETHOD.
+ 
+  METHOD if_ixml~create_document.
+    CREATE OBJECT doc TYPE lcl_document.
+  ENDMETHOD.
+ 
+  METHOD if_ixml~create_stream_factory.
+    CREATE OBJECT stream TYPE lcl_stream_factory.
+  ENDMETHOD.
+ 
+  METHOD if_ixml~create_renderer.
+    CREATE OBJECT renderer TYPE lcl_renderer
+      EXPORTING
+        ostream  = ostream
+        document = document.
+  ENDMETHOD.
+ 
+  METHOD if_ixml~create_parser.
+    CREATE OBJECT parser TYPE lcl_parser
+      EXPORTING
+        istream  = istream
+        document = document.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML                                 ', 'INTERFACE if_ixml PUBLIC.
+  METHODS create_document
+    RETURNING
+      VALUE(doc) TYPE REF TO if_ixml_document.
+  METHODS create_stream_factory
+    RETURNING
+      VALUE(stream) TYPE REF TO if_ixml_stream_factory.
+  METHODS create_renderer
+    IMPORTING
+      ostream  TYPE REF TO if_ixml_ostream
+      document TYPE REF TO if_ixml_document
+    RETURNING
+      VALUE(renderer) TYPE REF TO if_ixml_renderer.
+  METHODS create_parser
+    IMPORTING
+      stream_factory  TYPE REF TO if_ixml_stream_factory
+      istream  TYPE REF TO if_ixml_istream
+      document TYPE REF TO if_ixml_document
+    RETURNING
+      VALUE(parser) TYPE REF TO if_ixml_parser.
+  METHODS create_encoding
+    IMPORTING
+      byte_order    TYPE string
+      character_set TYPE string
+    RETURNING
+      VALUE(rval) TYPE REF TO if_ixml_encoding.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_ATTRIBUTE                       ', 'INTERFACE if_ixml_attribute PUBLIC.
+  INTERFACES if_ixml_node.
+  METHODS get_value RETURNING VALUE(val) TYPE string.
+  METHODS set_value IMPORTING value TYPE string.
+  METHODS get_name RETURNING VALUE(val) TYPE string.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_DOCUMENT                        ', 'INTERFACE if_ixml_document PUBLIC.
+  INTERFACES if_ixml_node.
+ 
+  METHODS:
+    set_encoding
+      IMPORTING
+        encoding TYPE REF TO object,
+    set_standalone
+      IMPORTING
+        standalone TYPE abap_bool,
+    get_standalone
+      RETURNING
+        VALUE(rval) TYPE abap_bool,
+    set_namespace_prefix
+      IMPORTING
+        prefix TYPE string,
+    append_child
+      IMPORTING
+        new_child TYPE REF TO if_ixml_node,
+    get_first_child
+      RETURNING
+        VALUE(child) TYPE REF TO if_ixml_node,
+    create_attribute_ns
+      IMPORTING
+        name TYPE string
+        prefix TYPE string OPTIONAL
+      RETURNING
+        VALUE(element) TYPE REF TO if_ixml_attribute,
+    create_element_ns
+      IMPORTING
+        name TYPE string
+        prefix TYPE string OPTIONAL
+      RETURNING
+        VALUE(element) TYPE REF TO if_ixml_element,
+    create_element
+      IMPORTING
+        name TYPE string
+      RETURNING
+        VALUE(element) TYPE REF TO if_ixml_element,
+    create_iterator_filtered
+      IMPORTING input TYPE any
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node_iterator,
+    create_filter_and
+      IMPORTING
+        filter1 TYPE any
+        filter2 TYPE any
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_node_filter,
+    create_iterator
+      RETURNING VALUE(rval) TYPE REF TO if_ixml_node_iterator,
+    create_filter_node_type
+      IMPORTING typ TYPE string
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node_filter,
+    create_simple_element_ns
+      IMPORTING
+        name       TYPE string
+        parent     TYPE REF TO if_ixml_node
+        prefix     TYPE string OPTIONAL
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_element,
+    create_filter_attribute
+      IMPORTING
+        name       TYPE string
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_node_filter,
+    create_simple_element
+      IMPORTING
+        name       TYPE string
+        parent     TYPE REF TO if_ixml_node
+        value      TYPE string OPTIONAL
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_element,
+    find_from_name
+      IMPORTING
+        name      TYPE string
+        namespace TYPE string OPTIONAL
+      RETURNING
+        VALUE(element) TYPE REF TO if_ixml_element,
+    find_from_name_ns
+      IMPORTING
+        depth TYPE i OPTIONAL
+        uri   TYPE string OPTIONAL
+        name  TYPE string
+      RETURNING
+        VALUE(element) TYPE REF TO if_ixml_element,
+    find_from_path
+      IMPORTING
+        path TYPE string
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_element,
+    get_elements_by_tag_name_ns
+      IMPORTING
+        name TYPE string
+        namespace TYPE string OPTIONAL
+        uri TYPE string OPTIONAL
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node_collection,
+    get_elements_by_tag_name
+      IMPORTING
+        depth     TYPE i OPTIONAL
+        name      TYPE string
+        namespace TYPE string OPTIONAL
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node_collection,
+    get_root RETURNING VALUE(node) TYPE REF TO if_ixml_node,
+    get_root_element RETURNING VALUE(root) TYPE REF TO if_ixml_element.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_ELEMENT                         ', 'INTERFACE if_ixml_element PUBLIC.
+  INTERFACES if_ixml_node.
+ 
+  METHODS:
+    remove_attribute_ns
+      IMPORTING foo TYPE string,
+    get_attributes
+      RETURNING VALUE(attr) TYPE REF TO if_ixml_named_node_map,
+    get_next
+      RETURNING VALUE(next) TYPE REF TO if_ixml_element,
+    get_name
+      RETURNING VALUE(name) TYPE string,
+    append_child
+      IMPORTING
+        new_child TYPE REF TO if_ixml_node
+      RETURNING
+        VALUE(rc) TYPE i,
+    clone
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node,
+    create_filter_node_type
+      IMPORTING name TYPE string
+      RETURNING VALUE(val) TYPE REF TO any,
+    create_iterator
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node_iterator,
+    find_from_name_ns
+      IMPORTING
+        name      TYPE string
+        namespace TYPE string OPTIONAL
+        uri       TYPE string OPTIONAL
+        depth     TYPE i OPTIONAL
+      RETURNING VALUE(val) TYPE REF TO if_ixml_element,
+    find_from_name
+      IMPORTING
+        name      TYPE string
+        namespace TYPE string OPTIONAL
+        depth     TYPE i OPTIONAL
+      RETURNING VALUE(val) TYPE REF TO if_ixml_element,
+    get_attribute_node
+      IMPORTING name TYPE string
+      RETURNING VALUE(val) TYPE REF TO if_ixml_attribute,
+    get_attribute_ns
+      IMPORTING
+        name TYPE string
+        uri TYPE string OPTIONAL
+      RETURNING
+        VALUE(val) TYPE string,
+    get_attribute
+      IMPORTING
+        name TYPE string
+        namespace TYPE string OPTIONAL
+      RETURNING VALUE(val) TYPE string,
+    get_children
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node_list,
+    get_elements_by_tag_name
+      IMPORTING
+        name TYPE string
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_node_collection,
+    get_elements_by_tag_name_ns
+      IMPORTING
+        name TYPE string
+        uri  TYPE string OPTIONAL
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_node_collection,
+    get_attribute_node_ns
+        IMPORTING
+        name TYPE string
+        uri  TYPE string OPTIONAL
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_attribute,
+    get_first_child
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node,
+    get_value
+      RETURNING VALUE(val) TYPE string,
+    remove_attribute
+      IMPORTING name TYPE string,
+    remove_node,
+    render
+      IMPORTING
+        ostream TYPE REF TO if_ixml_ostream,
+    set_attribute_node_ns
+      IMPORTING
+        attr TYPE any,
+    set_attribute
+      IMPORTING
+        name        TYPE string
+        namespace   TYPE string OPTIONAL
+        value       TYPE string OPTIONAL
+      RETURNING
+        VALUE(rval) TYPE i,
+    set_attribute_ns
+      IMPORTING
+        name   TYPE string
+        prefix TYPE string OPTIONAL
+        value  TYPE string OPTIONAL,
+    set_value
+      IMPORTING
+        value TYPE string
+      RETURNING VALUE(rc) TYPE i.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_ENCODING                        ', 'INTERFACE if_ixml_encoding PUBLIC.
+  CONSTANTS co_platform_endian TYPE string VALUE ''a''.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_ISTREAM                         ', 'INTERFACE if_ixml_istream PUBLIC.
+  METHODS close.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_NAMED_NODE_MAP                  ', 'INTERFACE if_ixml_named_node_map PUBLIC.
+  METHODS:
+    create_iterator
+      RETURNING VALUE(iterator) TYPE REF TO if_ixml_node_iterator,
+    get_length
+      RETURNING VALUE(val) TYPE i,
+    get_named_item_ns
+      IMPORTING name TYPE string
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node,
+    get_named_item
+      IMPORTING name TYPE string
+      RETURNING VALUE(val) TYPE REF TO if_ixml_node,
+    set_named_item_ns
+      IMPORTING node TYPE REF TO if_ixml_node,
+    remove_named_item
+      IMPORTING name TYPE string.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_NODE                            ', 'INTERFACE if_ixml_node PUBLIC.
+  CONSTANTS:
+    co_node_element TYPE i VALUE 0,
+    co_node_text TYPE i VALUE 0.
+  METHODS:
+    append_child IMPORTING new_child TYPE REF TO if_ixml_node,
+    get_attributes RETURNING VALUE(map) TYPE REF TO if_ixml_named_node_map,
+    get_first_child RETURNING VALUE(node) TYPE REF TO if_ixml_node,
+    get_children RETURNING VALUE(val) TYPE REF TO if_ixml_node_list,
+    query_interface
+      IMPORTING foo         TYPE string
+      RETURNING VALUE(rval) TYPE REF TO if_ixml_unknown,
+    remove_node,
+    get_parent RETURNING VALUE(val) TYPE REF TO if_ixml_node,
+    replace_child IMPORTING
+      new_child TYPE string
+      old_child TYPE string,
+    get_name RETURNING VALUE(val) TYPE string,
+    get_depth RETURNING VALUE(val) TYPE i,
+    is_leaf RETURNING VALUE(val) TYPE abap_bool,
+    get_namespace RETURNING VALUE(val) TYPE string,
+    get_value RETURNING VALUE(val) TYPE string,
+    get_type RETURNING VALUE(val) TYPE string,
+    set_name IMPORTING name TYPE string,
+    set_namespace_prefix IMPORTING val TYPE string,
+    remove_child IMPORTING child TYPE REF TO if_ixml_node,
+    set_value IMPORTING value TYPE string.
+ 
+  METHODS get_next
+    RETURNING
+      VALUE(rval) TYPE REF TO if_ixml_node.
+ 
+  METHODS get_namespace_prefix
+    RETURNING
+      VALUE(rv_prefix) TYPE string.
+ 
+  METHODS get_namespace_uri
+    RETURNING
+      VALUE(rval) TYPE string.
+ 
+  METHODS get_height
+    RETURNING
+      VALUE(rval) TYPE i.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_NODE_COLLECTION                 ', 'INTERFACE if_ixml_node_collection PUBLIC.
+  METHODS create_iterator
+    RETURNING
+      VALUE(rval) TYPE REF TO if_ixml_node_iterator.
+ 
+  METHODS get_length
+    RETURNING
+      VALUE(rval) TYPE i.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_NODE_FILTER                     ', 'INTERFACE if_ixml_node_filter PUBLIC.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_NODE_ITERATOR                   ', 'INTERFACE if_ixml_node_iterator PUBLIC.
+ 
+  METHODS reset.
+ 
+  METHODS get_next
+    RETURNING
+      VALUE(rval) TYPE REF TO if_ixml_node.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_NODE_LIST                       ', 'INTERFACE if_ixml_node_list PUBLIC.
+ 
+  METHODS:
+    get_length
+      RETURNING
+        VALUE(length) TYPE i,
+    create_iterator
+      RETURNING VALUE(rval) TYPE REF TO if_ixml_node_iterator,
+    get_item
+      IMPORTING
+        index TYPE i
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_node,
+    create_rev_iterator_filtered
+      IMPORTING
+        filter TYPE any
+      RETURNING
+        VALUE(val) TYPE REF TO if_ixml_node_iterator.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_OSTREAM                         ', 'INTERFACE if_ixml_ostream PUBLIC.
+  METHODS write_string
+    IMPORTING
+      string      TYPE string
+    RETURNING
+      VALUE(rval) TYPE i.
+ 
+  METHODS get_num_written_raw
+    RETURNING
+      VALUE(rval) TYPE i.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_PARSE_ERROR                     ', 'INTERFACE if_ixml_parse_error PUBLIC.
+  METHODS get_reason
+    RETURNING
+      VALUE(reason) TYPE string.
+  METHODS get_line
+    RETURNING
+      VALUE(line) TYPE i.
+  METHODS get_column
+    RETURNING
+      VALUE(column) TYPE i.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_PARSER                          ', 'INTERFACE if_ixml_parser PUBLIC.
+  CONSTANTS co_no_validation TYPE i VALUE 0.
+ 
+  METHODS parse RETURNING VALUE(subrc) TYPE i.
+  METHODS set_normalizing IMPORTING normal TYPE abap_bool.
+  METHODS num_errors RETURNING VALUE(errors) TYPE i.
+  METHODS add_strip_space_element.
+  METHODS get_error
+    IMPORTING
+      index TYPE i
+    RETURNING
+      VALUE(error) TYPE REF TO if_ixml_parse_error.
+  METHODS set_validating
+    IMPORTING
+      mode TYPE i OPTIONAL
+    RETURNING
+      VALUE(rval) TYPE abap_bool.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_RENDERER                        ', 'INTERFACE if_ixml_renderer PUBLIC.
+  METHODS render RETURNING VALUE(rval) TYPE i.
+  METHODS set_normalizing IMPORTING normal TYPE abap_bool.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_STREAM_FACTORY                  ', 'INTERFACE if_ixml_stream_factory PUBLIC.
+  METHODS create_ostream_cstring
+    IMPORTING
+      string TYPE string
+    RETURNING
+      VALUE(stream) TYPE REF TO if_ixml_ostream.
+ 
+  METHODS create_ostream_xstring
+    IMPORTING
+      string TYPE xstring
+    RETURNING
+      VALUE(stream) TYPE REF TO if_ixml_ostream.
+ 
+  METHODS create_istream_string
+    IMPORTING
+      xml TYPE string
+    RETURNING
+      VALUE(stream) TYPE REF TO if_ixml_istream.
+ 
+  METHODS create_istream_xstring
+    IMPORTING
+      xml TYPE xstring
+    RETURNING
+      VALUE(stream) TYPE REF TO if_ixml_istream.
+ 
+  METHODS create_ostream_itable
+    IMPORTING
+      table TYPE table
+    RETURNING
+      VALUE(rval) TYPE REF TO if_ixml_ostream.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_IXML_UNKNOWN                         ', 'INTERFACE if_ixml_unknown PUBLIC.
+  METHODS query_interface
+    IMPORTING
+      iid         TYPE i
+    RETURNING
+      VALUE(rval) TYPE REF TO if_ixml_unknown.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('/UI2/CL_JSON                            ', 'CLASS /ui2/cl_json DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CONSTANTS: BEGIN OF pretty_mode,
+                 low_case   TYPE string VALUE ''low_case'',
+                 camel_case TYPE string VALUE ''camel_case'',
+               END OF pretty_mode.
+ 
+    TYPES tribool TYPE c LENGTH 1.
+ 
+    CLASS-METHODS deserialize
+      IMPORTING
+        json             TYPE string OPTIONAL
+        jsonx            TYPE xstring OPTIONAL
+        pretty_name      TYPE string OPTIONAL
+        assoc_arrays     TYPE abap_bool OPTIONAL
+        assoc_arrays_opt TYPE abap_bool OPTIONAL
+      CHANGING
+        data             TYPE data.
+ 
+    CLASS-METHODS serialize
+      IMPORTING
+        data          TYPE data
+        compress      TYPE abap_bool OPTIONAL
+        pretty_name   TYPE string OPTIONAL
+        assoc_arrays  TYPE abap_bool OPTIONAL
+        ts_as_iso8601 TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(r_json) TYPE string.
+ 
+    CLASS-METHODS generate
+      IMPORTING
+        json        TYPE string
+        pretty_name TYPE string OPTIONAL
+      RETURNING
+        VALUE(rr_data) TYPE REF TO data.
+ 
+  PRIVATE SECTION.
+    CLASS-DATA mo_parsed TYPE REF TO lcl_parser.
+    CLASS-METHODS _deserialize
+      IMPORTING
+        VALUE(prefix) TYPE string
+        pretty_name   TYPE string OPTIONAL
+      CHANGING
+        data          TYPE data.
+ENDCLASS.
+ 
+CLASS /ui2/cl_json IMPLEMENTATION.
+ 
+  METHOD generate.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD serialize.
+    DATA lo_type       TYPE REF TO cl_abap_typedescr.
+    DATA lo_struct     TYPE REF TO cl_abap_structdescr.
+    DATA lt_components TYPE cl_abap_structdescr=>component_table.
+    DATA ls_component  LIKE LINE OF lt_components.
+    DATA ref           TYPE REF TO data.
+    DATA lv_index      TYPE i.
+ 
+    FIELD-SYMBOLS <any> TYPE any.
+    FIELD-SYMBOLS <tab> TYPE ANY TABLE.
+ 
+    lo_type = cl_abap_typedescr=>describe_by_data( data ).
+    CASE lo_type->kind.
+      WHEN cl_abap_typedescr=>kind_elem.
+*        WRITE ''@KERNEL console.dir(lo_type);''.
+        CASE lo_type->type_kind.
+          WHEN cl_abap_typedescr=>typekind_char.
+            IF lo_type->absolute_name = \`\\TYPE-POOL=ABAP\\TYPE=ABAP_BOOL\`.
+              IF data = abap_true.
+                r_json = ''true''.
+              ELSE.
+                r_json = ''false''.
+              ENDIF.
+            ELSEIF data IS INITIAL.
+              r_json = ''""''.
+            ELSE.
+              r_json = ''"'' && escape( val = |{ data }| format = cl_abap_format=>e_json_string )  && ''"''.
+            ENDIF.
+          WHEN cl_abap_typedescr=>typekind_string.
+            r_json = ''"'' && escape( val = data format = cl_abap_format=>e_json_string ) && ''"''.
+          WHEN cl_abap_typedescr=>typekind_int.
+            r_json = |{ data }|.
+          WHEN cl_abap_typedescr=>typekind_packed.
+            IF ts_as_iso8601 = abap_true
+                AND ( lo_type->absolute_name = \`\\TYPE=TIMESTAMP\`
+                OR lo_type->absolute_name = \`\\TYPE=TIMESTAMPL\` ).
+              IF data IS INITIAL.
+                r_json = |""|.
+              ELSE.
+                r_json = |"{ data TIMESTAMP = ISO }.0000000Z"|.
+              ENDIF.
+            ELSE.
+              r_json = |{ data }|.
+            ENDIF.
+          WHEN cl_abap_typedescr=>typekind_date.
+            r_json = |"{ data DATE = ISO }"|.
+          WHEN cl_abap_typedescr=>typekind_time.
+            r_json = |"{ data TIME = ISO }"|.
+          WHEN OTHERS.
+            r_json = data.
+        ENDCASE.
+      WHEN cl_abap_typedescr=>kind_table.
+        r_json = ''[''.
+        ASSIGN data TO <tab>.
+        LOOP AT <tab> ASSIGNING <any>.
+          lv_index = sy-tabix.
+          r_json = r_json && serialize(
+            data          = <any>
+            pretty_name   = pretty_name
+            compress      = compress
+            ts_as_iso8601 = ts_as_iso8601 ).
+          IF lines( data ) <> lv_index.
+            r_json = r_json && '',''.
+          ENDIF.
+        ENDLOOP.
+        r_json = r_json && '']''.
+      WHEN cl_abap_typedescr=>kind_struct.
+        lo_struct ?= lo_type.
+        lt_components = lo_struct->get_components( ).
+        r_json = ''{''.
+        LOOP AT lt_components INTO ls_component.
+          ASSIGN COMPONENT ls_component-name OF STRUCTURE data TO <any>.
+          ASSERT sy-subrc = 0.
+          IF compress = abap_true AND <any> IS INITIAL.
+            CONTINUE.
+          ENDIF.
+          IF pretty_name = pretty_mode-camel_case.
+            r_json = r_json && |"{ to_mixed( to_lower( ls_component-name ) ) }":|.
+          ELSEIF pretty_name = pretty_mode-low_case.
+            r_json = r_json && |"{ to_lower( ls_component-name ) }":|.
+          ELSE.
+            r_json = r_json && |"{ ls_component-name }":|.
+          ENDIF.
+          r_json = r_json && serialize(
+            data          = <any>
+            pretty_name   = pretty_name
+            compress      = compress
+            ts_as_iso8601 = ts_as_iso8601 ).
+          r_json = r_json && '',''.
+        ENDLOOP.
+        IF r_json CP ''*,''.
+          r_json = substring( val = r_json off = 0 len = strlen( r_json ) - 1 ).
+        ENDIF.
+        r_json = r_json && ''}''.
+      WHEN cl_abap_typedescr=>kind_ref.
+        IF data IS INITIAL.
+          r_json = ''null''.
+          RETURN.
+        ENDIF.
+        ASSIGN data->* TO <any>.
+        r_json = serialize(
+          data          = <any>
+          pretty_name   = pretty_name
+          compress      = compress
+          ts_as_iso8601 = ts_as_iso8601 ).
+      WHEN OTHERS.
+        ASSERT 1 = ''cl_json, unknown kind''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD deserialize.
+    CREATE OBJECT mo_parsed.
+ 
+    IF jsonx IS NOT INITIAL.
+      mo_parsed->parse( cl_abap_codepage=>convert_from( jsonx ) ).
+    ELSE.
+      mo_parsed->parse( json ).
+    ENDIF.
+ 
+* todo, this should take the "pretty_name" into account
+    mo_parsed->adjust_names( ).
+ 
+    _deserialize(
+      EXPORTING
+        prefix      = ''''
+        pretty_name = pretty_name
+      CHANGING
+        data        = data ).
+  ENDMETHOD.
+ 
+  METHOD _deserialize.
+    DATA lo_type       TYPE REF TO cl_abap_typedescr.
+    DATA lo_struct     TYPE REF TO cl_abap_structdescr.
+    DATA lo_table      TYPE REF TO cl_abap_tabledescr.
+    DATA lt_components TYPE cl_abap_structdescr=>component_table.
+    DATA ls_component  LIKE LINE OF lt_components.
+    DATA lt_members    TYPE string_table.
+    DATA ref           TYPE REF TO data.
+    DATA lv_name       TYPE string.
+    DATA lv_type       TYPE string.
+    DATA lv_value      TYPE string.
+    DATA lv_member     LIKE LINE OF lt_members.
+ 
+    FIELD-SYMBOLS <any> TYPE any.
+ 
+    lo_type = cl_abap_typedescr=>describe_by_data( data ).
+    prefix = mo_parsed->find_ignore_case( prefix ).
+ 
+*    WRITE ''@KERNEL console.dir(lo_type.get());''.
+    CASE lo_type->kind.
+      WHEN cl_abap_typedescr=>kind_elem.
+*        WRITE ''@KERNEL console.dir(lo_type.get().absolute_name);''.
+        IF lo_type->absolute_name = ''\\TYPE-POOL=ABAP\\TYPE=ABAP_BOOL''
+            OR lo_type->absolute_name = ''\\TYPE=ABAP_BOOLEAN''
+            OR lo_type->absolute_name = ''\\TYPE=FLAG''.
+          data = boolc( mo_parsed->value_string( prefix ) = ''true'' ).
+        ELSEIF lo_type->absolute_name = \`\\TYPE=TIMESTAMP\`
+            OR lo_type->absolute_name = \`\\TYPE=TIMESTAMPL\`.
+          lv_value = mo_parsed->value_string( prefix ).
+          REPLACE ALL OCCURRENCES OF ''-'' IN lv_value WITH ''''.
+          REPLACE ALL OCCURRENCES OF ''T'' IN lv_value WITH ''''.
+          REPLACE ALL OCCURRENCES OF '':'' IN lv_value WITH ''''.
+          REPLACE ALL OCCURRENCES OF ''Z'' IN lv_value WITH ''''.
+          data = lv_value.
+        ELSEIF lo_type->type_kind = cl_abap_typedescr=>typekind_date.
+          lv_value = mo_parsed->value_string( prefix ).
+          REPLACE ALL OCCURRENCES OF ''-'' IN lv_value WITH ''''.
+          IF lv_value CO space.
+            CLEAR data.
+          ELSE.
+            data = lv_value.
+          ENDIF.
+        ELSEIF lo_type->type_kind = cl_abap_typedescr=>typekind_time.
+          lv_value = mo_parsed->value_string( prefix ).
+          REPLACE ALL OCCURRENCES OF '':'' IN lv_value WITH ''''.
+          IF lv_value CO space.
+            CLEAR data.
+          ELSE.
+            data = lv_value.
+          ENDIF.
+        ELSE.
+          data = mo_parsed->value_string( prefix ).
+        ENDIF.
+      WHEN cl_abap_typedescr=>kind_table.
+        lt_members = mo_parsed->members( prefix && ''/'' ).
+        LOOP AT lt_members INTO lv_member.
+*          WRITE ''@KERNEL console.dir(lv_member.get());''.
+          CREATE DATA ref LIKE LINE OF data.
+          ASSIGN ref->* TO <any>.
+          _deserialize(
+            EXPORTING
+              prefix      = prefix && ''/'' && lv_member
+              pretty_name = pretty_name
+            CHANGING
+              data        = <any> ).
+*          WRITE ''@KERNEL console.dir(fs_row_);''.
+          INSERT <any> INTO TABLE data.
+        ENDLOOP.
+      WHEN cl_abap_typedescr=>kind_struct.
+        lo_struct ?= lo_type.
+        lt_components = lo_struct->get_components( ).
+        LOOP AT lt_components INTO ls_component.
+          ASSIGN COMPONENT ls_component-name OF STRUCTURE data TO <any>.
+          ASSERT sy-subrc = 0.
+          CASE pretty_name.
+            WHEN pretty_mode-camel_case.
+              lv_name = to_mixed( to_lower( ls_component-name ) ).
+            WHEN OTHERS.
+              lv_name = to_lower( ls_component-name ).
+          ENDCASE.
+          " WRITE ''@KERNEL console.dir("structure: " + lv_name.get());''.
+          _deserialize(
+            EXPORTING
+              prefix      = prefix && ''/'' && lv_name
+              pretty_name = pretty_name
+            CHANGING
+              data        = <any> ).
+        ENDLOOP.
+      WHEN cl_abap_typedescr=>kind_ref.
+        IF data IS INITIAL.
+          lt_members = mo_parsed->members( prefix && ''/'' ).
+ 
+*          WRITE ''@KERNEL console.dir(prefix.get());''.
+          IF lines( lt_members ) = 0 AND prefix = ''''.
+            RETURN.
+          ENDIF.
+ 
+          lv_type = mo_parsed->get_type( prefix && ''/'' ).
+          IF lv_type IS INITIAL.
+            lv_type = mo_parsed->get_type( prefix ).
+          ENDIF.
+*          WRITE ''@KERNEL console.dir("type: " + lv_type.get());''.
+ 
+          IF lines( lt_members ) > 0 AND lv_type = ''object''.
+            CLEAR lt_components.
+            LOOP AT lt_members INTO lv_member.
+*              WRITE ''@KERNEL console.dir("component: " + lv_member.get());''.
+              CLEAR ls_component.
+              ls_component-name = to_upper( lv_member ).
+              TRANSLATE ls_component-name USING ''-_''.
+              ls_component-type = cl_abap_refdescr=>get_ref_to_data( ).
+              ASSERT ls_component-name IS NOT INITIAL.
+              APPEND ls_component TO lt_components.
+            ENDLOOP.
+            lo_struct = cl_abap_structdescr=>create( lt_components ).
+            CREATE DATA data TYPE HANDLE lo_struct.
+          ELSEIF lines( lt_members ) > 0 AND lv_type = ''array''.
+            lo_table = cl_abap_tabledescr=>create( cl_abap_refdescr=>get_ref_to_data( ) ).
+            CREATE DATA data TYPE HANDLE lo_table.
+          ELSE.
+            CASE lv_type.
+              WHEN ''num''.
+                lv_value = mo_parsed->value_string( prefix ).
+                IF lv_value CO ''-0123456789''.
+                  CREATE DATA data TYPE i.
+                ELSE.
+                  ASSERT 1 = ''todo''.
+                ENDIF.
+              WHEN ''bool''.
+                CREATE DATA data TYPE HANDLE cl_abap_typedescr=>describe_by_name( ''ABAP_BOOL'' ).
+              WHEN ''str''.
+                CREATE DATA data TYPE HANDLE cl_abap_elemdescr=>get_string( ).
+              " WHEN OTHERS.
+              "   ASSERT 1 = ''todo''.
+            ENDCASE.
+          ENDIF.
+        ENDIF.
+        ASSIGN data->* TO <any>.
+        _deserialize(
+          EXPORTING
+            prefix      = prefix
+            pretty_name = pretty_name
+          CHANGING
+            data        = <any> ).
+      WHEN OTHERS.
+        ASSERT 1 = ''cl_json, unknown kind''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_CALL_TRANSFORMATION              ', 'CLASS kernel_call_transformation DEFINITION PUBLIC.
+* handling of ABAP statement CALL TRANSFORMATION
+  PUBLIC SECTION.
+    CLASS-METHODS call IMPORTING input TYPE any.
+  PRIVATE SECTION.
+    CLASS-DATA mi_doc TYPE REF TO if_ixml_document.
+    CLASS-DATA mi_writer TYPE REF TO if_sxml_writer.
+ 
+    CLASS-METHODS parse_xml
+      IMPORTING
+        iv_xml TYPE string.
+ 
+    CLASS-METHODS traverse_write
+      IMPORTING
+        iv_ref TYPE REF TO data.
+ 
+    CLASS-METHODS traverse_write_type
+      IMPORTING
+        iv_ref TYPE REF TO data
+      RETURNING
+        VALUE(rv_type) TYPE string.
+ENDCLASS.
+ 
+CLASS kernel_call_transformation IMPLEMENTATION.
+ 
+  METHOD call.
+* first convert SOURCE to internal format stored in "MI_DOC"?
+* then output to RESULT
+ 
+    DATA lv_name   TYPE string.
+    DATA lv_source TYPE string.
+    DATA lv_result TYPE string.
+    DATA result    TYPE REF TO data.
+    DATA lt_rtab   TYPE abap_trans_resbind_tab.
+    DATA lo_writer TYPE REF TO cl_sxml_string_writer.
+    DATA ls_rtab   LIKE LINE OF lt_rtab.
+    DATA lv_type   TYPE string.
+    DATA lo_data_to_xml TYPE REF TO lcl_data_to_xml.
+ 
+    CLEAR mi_doc.
+    CLEAR mi_writer.
+ 
+*    WRITE ''@KERNEL console.dir(INPUT);''.
+ 
+* only the ID transformation is implemented
+    WRITE ''@KERNEL lv_name.set(INPUT.name.toUpperCase());''.
+    ASSERT lv_name = ''ID''.
+ 
+* Handle input SOURCE
+    WRITE ''@KERNEL if (INPUT.sourceXML?.constructor.name === "ABAPObject") this.mi_doc.set(INPUT.sourceXML);''.
+    WRITE ''@KERNEL if (INPUT.sourceXML?.constructor.name === "String") lv_source.set(INPUT.sourceXML);''.
+    IF lv_source IS NOT INITIAL.
+      IF lv_source(1) = ''<''.
+        lv_type = ''XML''.
+        parse_xml( lv_source ).
+      ELSEIF lv_source(1) = ''{'' OR lv_source(1) = ''[''.
+        lv_type = ''JSON''.
+        mi_doc = kernel_json_to_ixml=>build( lv_source ).
+      ELSE.
+        RAISE EXCEPTION TYPE cx_xslt_format_error.
+      ENDIF.
+    ENDIF.
+ 
+* todo, rewrite this part,
+    WRITE ''@KERNEL if (typeof INPUT.source === "object" && INPUT.resultXML?.constructor.name === "ABAPObject") {''.
+    WRITE ''@KERNEL   this.mi_writer.set(INPUT.resultXML);''.
+    WRITE ''@KERNEL }''.
+*    WRITE ''@KERNEL console.dir(INPUT);''.
+    IF mi_writer IS NOT INITIAL.
+* input is object and write to sxml output
+* todo, rewrite
+      mi_writer->open_element( name = ''object'' ).
+      WRITE ''@KERNEL for (const name in INPUT.source) {''.
+      WRITE ''@KERNEL   lv_name.set(name);''.
+      WRITE ''@KERNEL   if (INPUT.source[name].constructor.name === "FieldSymbol") {''.
+      WRITE ''@KERNEL     result.assign(INPUT.source[name].getPointer());''.
+      WRITE ''@KERNEL   } else {''.
+      WRITE ''@KERNEL     result.assign(INPUT.source[name]);''.
+      WRITE ''@KERNEL   }''.
+      mi_writer->open_element( name = ''str'' ).
+      mi_writer->write_attribute( name = ''name'' value = to_upper( lv_name ) ).
+      traverse_write( result ).
+      mi_writer->close_element( ).
+      WRITE ''@KERNEL }''.
+      mi_writer->close_element( ).
+      RETURN.
+    ENDIF.
+ 
+    WRITE ''@KERNEL if (INPUT.resultXML && INPUT.resultXML.constructor.name === "String") {''.
+    WRITE ''@KERNEL   lv_result.set("X");''.
+    WRITE ''@KERNEL }''.
+    IF lv_result = abap_true.
+      lv_result = ''<?xml version="1.0" encoding="utf-16"?><asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"><asx:values>''.
+      CREATE OBJECT lo_data_to_xml.
+      WRITE ''@KERNEL for (const name in INPUT.source) {''.
+      WRITE ''@KERNEL   lv_name.set(name);''.
+      WRITE ''@KERNEL   if (INPUT.source[name].constructor.name === "FieldSymbol") {''.
+      WRITE ''@KERNEL     result.assign(INPUT.source[name].getPointer());''.
+      WRITE ''@KERNEL   } else {''.
+      WRITE ''@KERNEL     result.assign(INPUT.source[name]);''.
+      WRITE ''@KERNEL   }''.
+      lv_result = lv_result && lo_data_to_xml->run(
+        iv_name = to_upper( lv_name )
+        iv_ref  = result ).
+      WRITE ''@KERNEL }''.
+ 
+      lv_result = lv_result &&
+        |</asx:values>{ lo_data_to_xml->serialize_heap( ) }</asx:abap>|.
+      WRITE ''@KERNEL   INPUT.resultXML.set(lv_result);''.
+      RETURN.
+    ENDIF.
+ 
+    IF lv_source IS INITIAL AND mi_doc IS INITIAL.
+      RAISE EXCEPTION TYPE cx_xslt_runtime_error.
+    ENDIF.
+ 
+    WRITE ''@KERNEL if (INPUT.result.constructor.name === "Table") {''.
+* INPUT.result is an ABAP internal table, dynamic result parameter
+    WRITE ''@KERNEL lt_rtab = INPUT.result;''.
+    LOOP AT lt_rtab INTO ls_rtab.
+      kernel_ixml_xml_to_data=>build(
+        iv_name = ls_rtab-name
+        iv_ref  = ls_rtab-value
+        ii_doc  = mi_doc ).
+    ENDLOOP.
+    WRITE ''@KERNEL } else {''.
+* INPUT.result is a javascript structure
+    WRITE ''@KERNEL for (const name in INPUT.result) {''.
+    WRITE ''@KERNEL   lv_name.set(name.toUpperCase());''.
+    WRITE ''@KERNEL   if (INPUT.result[name].constructor.name === "FieldSymbol") {''.
+    WRITE ''@KERNEL     result.assign(INPUT.result[name].getPointer());''.
+    WRITE ''@KERNEL   } else {''.
+    WRITE ''@KERNEL     result.assign(INPUT.result[name]);''.
+    WRITE ''@KERNEL   }''.
+    IF lv_type = ''JSON''.
+      kernel_ixml_json_to_data=>build(
+        iv_name = lv_name
+        iv_ref  = result
+        ii_doc  = mi_doc ).
+    ELSE.
+      kernel_ixml_xml_to_data=>build(
+        iv_name = lv_name
+        iv_ref  = result
+        ii_doc  = mi_doc ).
+    ENDIF.
+    WRITE ''@KERNEL }''.
+    WRITE ''@KERNEL }''.
+ 
+*    WRITE ''@KERNEL console.dir(INPUT.result.data);''.
+ 
+  ENDMETHOD.
+ 
+  METHOD traverse_write_type.
+    DATA lo_type TYPE REF TO cl_abap_typedescr.
+    lo_type = cl_abap_typedescr=>describe_by_data( iv_ref->* ).
+    CASE lo_type->type_kind.
+      WHEN cl_abap_typedescr=>typekind_int
+          OR cl_abap_typedescr=>typekind_int1
+          OR cl_abap_typedescr=>typekind_int2
+          OR cl_abap_typedescr=>typekind_int8
+          OR cl_abap_typedescr=>typekind_decfloat
+          OR cl_abap_typedescr=>typekind_decfloat16
+          OR cl_abap_typedescr=>typekind_decfloat34.
+        rv_type = ''num''.
+      WHEN OTHERS.
+        rv_type = ''str''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD traverse_write.
+* TODO: refactor this method
+ 
+    DATA lo_type TYPE REF TO cl_abap_typedescr.
+    DATA lo_struc TYPE REF TO cl_abap_structdescr.
+    DATA lt_comps TYPE cl_abap_structdescr=>component_table.
+    DATA ls_compo LIKE LINE OF lt_comps.
+    DATA lv_ref TYPE REF TO data.
+    FIELD-SYMBOLS <any> TYPE any.
+    FIELD-SYMBOLS <table> TYPE ANY TABLE.
+    FIELD-SYMBOLS <field> TYPE any.
+ 
+*     WRITE ''@KERNEL console.dir(iv_ref.getPointer());''.
+    lo_type = cl_abap_typedescr=>describe_by_data( iv_ref->* ).
+*    WRITE ''@KERNEL console.dir(lo_type.get().kind.get());''.
+    CASE lo_type->kind.
+      WHEN cl_abap_typedescr=>kind_struct.
+        mi_writer->open_element( name = ''object'' ).
+ 
+        lo_struc ?= lo_type.
+        lt_comps = lo_struc->get_components( ).
+        ASSIGN iv_ref->* TO <any>.
+        LOOP AT lt_comps INTO ls_compo.
+          ASSIGN COMPONENT ls_compo-name OF STRUCTURE <any> TO <field>.
+          GET REFERENCE OF <field> INTO lv_ref.
+          mi_writer->open_element( name = traverse_write_type( lv_ref ) ).
+          mi_writer->write_attribute( name = ''name'' value = to_upper( ls_compo-name ) ).
+          traverse_write( lv_ref ).
+          mi_writer->close_element( ).
+        ENDLOOP.
+ 
+        mi_writer->close_element( ).
+      WHEN cl_abap_typedescr=>kind_elem.
+        mi_writer->write_value( iv_ref->* ).
+      WHEN cl_abap_typedescr=>kind_table.
+        mi_writer->open_element( name = ''array'' ).
+ 
+        ASSIGN iv_ref->* TO <table>.
+        LOOP AT <table> ASSIGNING <any>.
+          GET REFERENCE OF <any> INTO lv_ref.
+          IF cl_abap_typedescr=>describe_by_data( lv_ref->* )->kind = cl_abap_typedescr=>kind_elem.
+            mi_writer->open_element( name = traverse_write_type( lv_ref ) ).
+          ENDIF.
+          traverse_write( lv_ref ).
+          IF cl_abap_typedescr=>describe_by_data( lv_ref->* )->kind = cl_abap_typedescr=>kind_elem.
+            mi_writer->close_element( ).
+          ENDIF.
+        ENDLOOP.
+ 
+        mi_writer->close_element( ).
+      WHEN OTHERS.
+        ASSERT 1 = ''todo_traverse_write''.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_xml.
+ 
+    DATA li_factory TYPE REF TO if_ixml_stream_factory.
+    DATA li_istream TYPE REF TO if_ixml_istream.
+    DATA li_parser  TYPE REF TO if_ixml_parser.
+    DATA li_ixml    TYPE REF TO if_ixml.
+    DATA lv_subrc   TYPE i.
+ 
+    li_ixml = cl_ixml=>create( ).
+    mi_doc  = li_ixml->create_document( ).
+ 
+    li_factory = li_ixml->create_stream_factory( ).
+    li_istream = li_factory->create_istream_string( iv_xml ).
+    li_parser = li_ixml->create_parser( stream_factory = li_factory
+                                        istream        = li_istream
+                                        document       = mi_doc ).
+    li_parser->add_strip_space_element( ).
+    lv_subrc = li_parser->parse( ).
+    li_istream->close( ).
+ 
+    ASSERT lv_subrc = 0.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_IXML_JSON_TO_DATA                ', 'CLASS kernel_ixml_json_to_data DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS build
+      IMPORTING
+        iv_name TYPE string
+        iv_ref  TYPE REF TO data
+        ii_doc  TYPE REF TO if_ixml_document.
+  PRIVATE SECTION.
+    CLASS-METHODS get_field_name
+      IMPORTING ii_node TYPE REF TO if_ixml_node
+      RETURNING VALUE(rv_name) TYPE string.
+    CLASS-METHODS traverse
+      IMPORTING
+        ii_node TYPE REF TO if_ixml_node
+        iv_ref  TYPE REF TO data.
+ENDCLASS.
+ 
+CLASS kernel_ixml_json_to_data IMPLEMENTATION.
+ 
+  METHOD get_field_name.
+    DATA li_aiterator TYPE REF TO if_ixml_node_iterator.
+    DATA li_anode TYPE REF TO if_ixml_node.
+    DATA attr TYPE REF TO if_ixml_named_node_map.
+ 
+    attr = ii_node->get_attributes( ).
+    IF attr IS NOT INITIAL.
+      li_aiterator = attr->create_iterator( ).
+      DO.
+        li_anode = li_aiterator->get_next( ).
+        IF li_anode IS INITIAL.
+          EXIT. " current loop
+        ENDIF.
+* assume its the name,
+        rv_name = li_anode->get_value( ).
+        RETURN.
+      ENDDO.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD build.
+* assumptions: the top level element is an object containing iv_name
+    DATA li_first    TYPE REF TO if_ixml_node.
+    DATA li_node     TYPE REF TO if_ixml_node.
+    DATA lv_name     TYPE string.
+    DATA li_iterator TYPE REF TO if_ixml_node_iterator.
+ 
+    li_first = ii_doc->get_root( )->get_first_child( ).
+    ASSERT li_first->get_name( ) = ''object''.
+ 
+    li_iterator = li_first->get_children( )->create_iterator( ).
+    DO.
+      li_node = li_iterator->get_next( ).
+      IF li_node IS INITIAL.
+        EXIT. " current loop
+      ENDIF.
+ 
+      lv_name = get_field_name( li_node ).
+      IF lv_name = iv_name.
+*        WRITE ''@KERNEL console.dir("found");''.
+        traverse(
+          iv_ref  = iv_ref
+          ii_node = li_node ).
+        RETURN.
+      ENDIF.
+    ENDDO.
+  ENDMETHOD.
+ 
+  METHOD traverse.
+ 
+    DATA lo_type     TYPE REF TO cl_abap_typedescr.
+    DATA li_child    TYPE REF TO if_ixml_node.
+    DATA lv_name     TYPE string.
+    DATA li_iterator TYPE REF TO if_ixml_node_iterator.
+    DATA lv_ref      TYPE REF TO data.
+ 
+    FIELD-SYMBOLS <any>   TYPE any.
+    FIELD-SYMBOLS <field> TYPE any.
+    FIELD-SYMBOLS <tab>   TYPE ANY TABLE.
+ 
+    lo_type = cl_abap_typedescr=>describe_by_data( iv_ref->* ).
+    CASE lo_type->kind.
+      WHEN cl_abap_typedescr=>kind_struct.
+        ASSERT ii_node->get_name( ) = ''object''.
+        ASSIGN iv_ref->* TO <any>.
+        li_iterator = ii_node->get_children( )->create_iterator( ).
+        DO.
+          li_child = li_iterator->get_next( ).
+          IF li_child IS INITIAL.
+            EXIT. " current loop
+          ENDIF.
+          lv_name = get_field_name( li_child ).
+          ASSIGN COMPONENT lv_name OF STRUCTURE <any> TO <field>.
+          IF sy-subrc = 0.
+            GET REFERENCE OF <field> INTO lv_ref.
+            traverse( ii_node = li_child
+                      iv_ref  = lv_ref ).
+          ENDIF.
+        ENDDO.
+      WHEN cl_abap_typedescr=>kind_elem.
+        li_child = ii_node->get_first_child( ).
+        ASSERT li_child->get_name( ) = ''#text''.
+        ASSIGN iv_ref->* TO <any>.
+        <any> = li_child->get_value( ).
+ 
+        IF lo_type->type_kind = cl_abap_typedescr=>typekind_char
+            OR lo_type->type_kind = cl_abap_typedescr=>typekind_clike
+            OR lo_type->type_kind = cl_abap_typedescr=>typekind_string.
+          REPLACE ALL OCCURRENCES OF ''\\"'' IN <any> WITH ''"''.
+        ENDIF.
+      WHEN cl_abap_typedescr=>kind_table.
+        ASSERT ii_node->get_name( ) = ''array''.
+        ASSIGN iv_ref->* TO <tab>.
+        li_iterator = ii_node->get_children( )->create_iterator( ).
+        DO.
+          li_child = li_iterator->get_next( ).
+          IF li_child IS INITIAL.
+            EXIT. " current loop
+          ENDIF.
+          CREATE DATA lv_ref LIKE LINE OF <tab>.
+          ASSIGN lv_ref->* TO <any>.
+          traverse( ii_node = li_child
+                  iv_ref  = lv_ref ).
+          INSERT <any> INTO TABLE <tab>.
+        ENDDO.
+      WHEN OTHERS.
+        WRITE ''@KERNEL console.dir(lo_type.get().kind.get());''.
+        ASSERT 1 = ''todo''.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_IXML_XML_TO_DATA                 ', 'CLASS kernel_ixml_xml_to_data DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS build
+      IMPORTING
+        iv_name TYPE string
+        iv_ref  TYPE REF TO data
+        ii_doc  TYPE REF TO if_ixml_document.
+  PRIVATE SECTION.
+    CLASS-DATA mi_heap TYPE REF TO if_ixml_element.
+ 
+    CLASS-METHODS traverse
+      IMPORTING
+        ii_node TYPE REF TO if_ixml_node
+        iv_ref  TYPE REF TO data.
+ 
+    CLASS-METHODS find_href_in_heap
+      IMPORTING
+        VALUE(iv_href) TYPE string
+      RETURNING
+        VALUE(ri_node) TYPE REF TO if_ixml_node.
+ENDCLASS.
+ 
+CLASS kernel_ixml_xml_to_data IMPLEMENTATION.
+ 
+  METHOD build.
+ 
+    DATA li_first    TYPE REF TO if_ixml_element.
+    DATA li_node     TYPE REF TO if_ixml_node.
+    DATA lv_name     TYPE string.
+    DATA li_iterator TYPE REF TO if_ixml_node_iterator.
+ 
+    mi_heap = ii_doc->find_from_name_ns( ''heap'' ).
+*    WRITE ''@KERNEL console.dir(this.mi_heap);''.
+ 
+    li_first ?= ii_doc->get_root( )->get_first_child( ).
+ 
+    li_node = li_first->find_from_name_ns(
+      name      = iv_name
+      depth     = 0
+      namespace = '''' ).
+    IF li_node IS NOT INITIAL.
+      traverse( ii_node = li_node
+                iv_ref  = iv_ref ).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD find_href_in_heap.
+ 
+    DATA li_iterator TYPE REF TO if_ixml_node_iterator.
+    DATA li_child    TYPE REF TO if_ixml_node.
+    DATA lv_id       TYPE string.
+ 
+    REPLACE FIRST OCCURRENCE OF ''#'' IN iv_href WITH ''''.
+    ASSERT mi_heap IS NOT INITIAL.
+    ASSERT iv_href IS NOT INITIAL.
+ 
+    li_iterator = mi_heap->get_children( )->create_iterator( ).
+ 
+    DO.
+      li_child = li_iterator->get_next( ).
+      IF li_child IS INITIAL.
+        EXIT. " current loop
+      ENDIF.
+      lv_id = li_child->get_attributes( )->get_named_item_ns( ''id'' )->get_value( ).
+      IF lv_id = iv_href.
+        ri_node = li_child.
+        RETURN.
+      ENDIF.
+    ENDDO.
+ 
+    ASSERT 1 = ''not found in heap''.
+ 
+  ENDMETHOD.
+ 
+  METHOD traverse.
+ 
+    DATA lo_type     TYPE REF TO cl_abap_typedescr.
+    DATA li_child    TYPE REF TO if_ixml_node.
+    DATA li_heap     TYPE REF TO if_ixml_node.
+    DATA li_iname    TYPE REF TO if_ixml_node.
+    DATA lv_name     TYPE string.
+    DATA li_iterator TYPE REF TO if_ixml_node_iterator.
+    DATA lv_ref      TYPE REF TO data.
+    DATA lv_value    TYPE string.
+    DATA li_href     TYPE REF TO if_ixml_node.
+ 
+    FIELD-SYMBOLS <any>   TYPE any.
+    FIELD-SYMBOLS <field> TYPE any.
+    FIELD-SYMBOLS <tab>   TYPE ANY TABLE.
+ 
+    lo_type = cl_abap_typedescr=>describe_by_data( iv_ref->* ).
+    CASE lo_type->kind.
+      WHEN cl_abap_typedescr=>kind_struct.
+        ASSIGN iv_ref->* TO <any>.
+        li_iterator = ii_node->get_children( )->create_iterator( ).
+        DO.
+          li_child = li_iterator->get_next( ).
+          IF li_child IS INITIAL.
+            EXIT. " current loop
+          ENDIF.
+          lv_name = li_child->get_name( ).
+          ASSIGN COMPONENT lv_name OF STRUCTURE <any> TO <field>.
+          IF sy-subrc = 0.
+            GET REFERENCE OF <field> INTO lv_ref.
+            traverse( ii_node = li_child
+                      iv_ref  = lv_ref ).
+          ENDIF.
+        ENDDO.
+      WHEN cl_abap_typedescr=>kind_elem.
+        li_child = ii_node->get_first_child( ).
+        IF li_child IS NOT INITIAL.
+          ASSIGN iv_ref->* TO <any>.
+          <any> = li_child->get_value( ).
+        ENDIF.
+      WHEN cl_abap_typedescr=>kind_table.
+        ASSIGN iv_ref->* TO <tab>.
+        li_iterator = ii_node->get_children( )->create_iterator( ).
+        DO.
+          li_child = li_iterator->get_next( ).
+          IF li_child IS INITIAL.
+            EXIT. " current loop
+          ENDIF.
+          CREATE DATA lv_ref LIKE LINE OF <tab>.
+          ASSIGN lv_ref->* TO <any>.
+          traverse( ii_node = li_child
+                    iv_ref  = lv_ref ).
+          INSERT <any> INTO TABLE <tab>.
+        ENDDO.
+      WHEN cl_abap_typedescr=>kind_ref.
+        ASSIGN iv_ref->* TO <any>.
+        IF <any> IS INITIAL.
+          " WRITE ''@KERNEL lv_rtti_name.set(fs_any_.getPointer().RTTIName);''.
+          " lv_internal = kernel_internal_name=>rtti_to_internal( lv_rtti_name ).
+          " WRITE ''@KERNEL fs_any_.pointer.value = new abap.Classes[lv_internal.get()]();''.
+ 
+          li_href = ii_node->get_attributes( )->get_named_item_ns( ''href'' ).
+          IF li_href IS INITIAL.
+            RETURN.
+          ENDIF.
+          lv_value = li_href->get_value( ).
+          ASSERT lv_value IS NOT INITIAL.
+          li_heap = find_href_in_heap( lv_value ).
+          li_iname = li_heap->get_attributes( )->get_named_item_ns( ''internalName'' ).
+          IF li_iname IS INITIAL.
+* then its a non serializable object, not to be instantiated
+            RETURN.
+          ENDIF.
+          lv_value = li_iname->get_value( ).
+          ASSERT lv_value IS NOT INITIAL.
+*          WRITE ''@KERNEL console.dir(lv_value);''.
+          WRITE ''@KERNEL fs_any_.pointer.value = new abap.Classes[lv_value.get()]();''.
+ 
+          " li_child = ii_node->get_attributes( )->get_named_item_ns( ''href'' ).
+          " WRITE ''@KERNEL console.dir(ii_node.get());''.
+ 
+          li_iterator = li_heap->get_first_child( )->get_children( )->create_iterator( ).
+          DO.
+            li_child = li_iterator->get_next( ).
+            IF li_child IS INITIAL.
+              EXIT. " current loop
+            ENDIF.
+            lv_name = li_child->get_name( ).
+            REPLACE FIRST OCCURRENCE OF ''.'' IN lv_name WITH ''~''.
+ 
+            ASSIGN <any>->(lv_name) TO <field>.
+            IF sy-subrc = 0.
+              GET REFERENCE OF <field> INTO lv_ref.
+              traverse( ii_node = li_child
+                        iv_ref  = lv_ref ).
+            ENDIF.
+*            WRITE ''@KERNEL console.dir(lv_name);''.
+          ENDDO.
+ 
+"           lo_clasdescr ?= cl_abap_typedescr=>describe_by_object_ref( <any> ).
+"           LOOP AT lo_clasdescr->attributes INTO ls_attribute.
+" *            WRITE ''@KERNEL console.dir(ls_attribute.get().name.get());''.
+"             ASSIGN <any>->(ls_attribute-name) TO <field>.
+"             ASSERT sy-subrc = 0.
+"             GET REFERENCE OF <field> INTO lv_ref.
+"             traverse( ii_node = li_heap->get_first_child( )
+"                       iv_ref  = lv_ref ).
+"           ENDLOOP.
+        ELSE.
+          ASSERT 1 = ''todo_ref2''.
+        ENDIF.
+      WHEN OTHERS.
+        WRITE ''@KERNEL console.dir(lo_type.get().kind.get());''.
+        ASSERT 1 = ''todo''.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_JSON_TO_IXML                     ', 'CLASS kernel_json_to_ixml DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS build
+      IMPORTING iv_json TYPE string
+      RETURNING VALUE(ri_doc) TYPE REF TO if_ixml_document.
+ENDCLASS.
+ 
+CLASS kernel_json_to_ixml IMPLEMENTATION.
+ 
+  METHOD build.
+* build IXML by calling SXML json parser and then converting :)
+ 
+    DATA li_reader TYPE REF TO if_sxml_reader.
+    DATA li_node TYPE REF TO if_sxml_node.
+    DATA li_close TYPE REF TO if_sxml_close_element.
+    DATA li_open TYPE REF TO if_sxml_open_element.
+    DATA li_value TYPE REF TO if_sxml_value_node.
+    DATA lt_attributes TYPE if_sxml_attribute=>attributes.
+    DATA li_attribute TYPE REF TO if_sxml_attribute.
+    DATA li_current TYPE REF TO if_ixml_node.
+    DATA lv_name TYPE string.
+    DATA li_map TYPE REF TO if_ixml_named_node_map.
+    DATA li_new TYPE REF TO if_ixml_node.
+    DATA li_element TYPE REF TO if_ixml_element.
+ 
+    li_reader = cl_sxml_string_reader=>create( cl_abap_codepage=>convert_to( iv_json ) ).
+ 
+    ri_doc = cl_ixml=>create( )->create_document( ).
+    li_current = ri_doc->get_root( ).
+ 
+    DO.
+      li_node = li_reader->read_next_node( ).
+      IF li_node IS INITIAL.
+        EXIT.
+      ENDIF.
+ 
+      CASE li_node->type.
+        WHEN if_sxml_node=>co_nt_element_open.
+          li_open ?= li_node.
+*          WRITE: / ''open: '', li_open->qname-name.
+ 
+          CLEAR lv_name.
+          lt_attributes = li_open->get_attributes( ).
+          LOOP AT lt_attributes INTO li_attribute.
+*            WRITE / li_attribute->get_value( ).
+            lv_name = li_attribute->get_value( ).
+          ENDLOOP.
+ 
+          li_element = ri_doc->create_element_ns( li_open->qname-name ).
+          li_new ?= li_element.
+          li_current->append_child( li_new ).
+          li_current = li_new.
+*            WRITE ''@KERNEL console.dir(li_element);''.
+ 
+          IF lv_name IS NOT INITIAL.
+            li_element = ri_doc->create_element_ns( ''name'' ).
+            li_new ?= li_element.
+            li_new->set_value( lv_name ).
+ 
+            li_map = li_current->get_attributes( ).
+            li_map->set_named_item_ns( li_new ).
+          ENDIF.
+ 
+        WHEN if_sxml_node=>co_nt_element_close.
+          li_close ?= li_node.
+*          WRITE: / ''close: '', li_close->qname-name.
+*          IF li_close->qname-name = ''object'' OR li_close->qname-name = ''array''.
+          li_current = li_current->get_parent( ).
+*          ENDIF.
+        WHEN if_sxml_node=>co_nt_value.
+          li_value ?= li_node.
+*          WRITE / li_value->get_value( ).
+*          li_current->set_value( li_value->get_value( ) ).
+ 
+          li_element = ri_doc->create_element_ns( ''#text'' ).
+          li_element->set_value( li_value->get_value( ) ).
+          li_new ?= li_element.
+          li_current->append_child( li_new ).
+ 
+      ENDCASE.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_AUTHORITY_CHECK                  ', 'CLASS kernel_authority_check DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS call.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+CLASS kernel_authority_check IMPLEMENTATION.
+ 
+  METHOD call.
+* add custom implementation here if needed
+    sy-subrc = 0.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_CALL                             ', 'CLASS kernel_call DEFINITION PUBLIC.
+* handling of ABAP statement CALL
+  PUBLIC SECTION.
+    CLASS-METHODS call
+      IMPORTING
+        input TYPE any.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+CLASS kernel_call IMPLEMENTATION.
+ 
+  METHOD call.
+ 
+    DATA uuid TYPE sysuuid_x16.
+    DATA name TYPE string.
+ 
+    WRITE ''@KERNEL name.set(INPUT.name);''.
+ 
+    IF name = ''RFCControl''.
+      uuid = cl_system_uuid=>if_system_uuid_static~create_uuid_x16( ).
+      WRITE ''@KERNEL INPUT.uuid.set(uuid);''.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_CREATE_DATA_HANDLE               ', 'CLASS kernel_create_data_handle DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS call
+      IMPORTING
+        handle TYPE REF TO cl_abap_datadescr
+      CHANGING
+        dref   TYPE REF TO any.
+  PRIVATE SECTION.
+    CLASS-METHODS elem
+      IMPORTING
+        handle TYPE REF TO cl_abap_datadescr
+      CHANGING
+        dref   TYPE REF TO any.
+    CLASS-METHODS struct
+      IMPORTING
+        handle TYPE REF TO cl_abap_datadescr
+      CHANGING
+        dref   TYPE REF TO any.
+    CLASS-METHODS table
+      IMPORTING
+        handle TYPE REF TO cl_abap_datadescr
+      CHANGING
+        dref   TYPE REF TO any.
+    CLASS-METHODS ref
+      IMPORTING
+        handle TYPE REF TO cl_abap_datadescr
+      CHANGING
+        dref   TYPE REF TO any.
+ENDCLASS.
+ 
+CLASS kernel_create_data_handle IMPLEMENTATION.
+ 
+  METHOD call.
+    ASSERT handle IS BOUND.
+ 
+    WRITE ''@KERNEL if (dref.constructor.name === "FieldSymbol") {''.
+    WRITE ''@KERNEL   dref = dref.getPointer();''.
+    WRITE ''@KERNEL }''.
+ 
+    CASE handle->kind.
+      WHEN cl_abap_typedescr=>kind_elem.
+        elem( EXPORTING handle = handle
+              CHANGING dref = dref ).
+      WHEN cl_abap_typedescr=>kind_struct.
+        struct( EXPORTING handle = handle
+                CHANGING dref = dref ).
+      WHEN cl_abap_typedescr=>kind_table.
+        table( EXPORTING handle = handle
+               CHANGING dref = dref ).
+      WHEN cl_abap_typedescr=>kind_ref.
+        ref( EXPORTING handle = handle
+             CHANGING dref = dref ).
+      WHEN OTHERS.
+        WRITE ''@KERNEL console.dir(handle);''.
+        ASSERT 1 = ''todo''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD ref.
+    DATA lo_ref  TYPE REF TO cl_abap_refdescr.
+    DATA lo_data TYPE REF TO cl_abap_datadescr.
+    DATA field   TYPE REF TO data.
+ 
+    lo_ref ?= handle.
+    lo_data ?= lo_ref->get_referenced_type( ).
+    call(
+      EXPORTING
+        handle = lo_data
+      CHANGING
+        dref   = field ).
+ 
+    WRITE ''@KERNEL dref.assign(new abap.types.DataReference(field.getPointer()));''.
+  ENDMETHOD.
+ 
+  METHOD struct.
+    DATA lo_struct     TYPE REF TO cl_abap_structdescr.
+    DATA lt_components TYPE cl_abap_structdescr=>component_table.
+    DATA ls_component  LIKE LINE OF lt_components.
+    DATA field         TYPE REF TO data.
+ 
+    lo_struct ?= handle.
+    lt_components = lo_struct->get_components( ).
+    WRITE ''@KERNEL let obj = {};''.
+    LOOP AT lt_components INTO ls_component.
+*      WRITE ''@KERNEL console.dir(ls_component.get().name);''.
+      call(
+        EXPORTING
+          handle = lo_struct->get_component_type( ls_component-name )
+        CHANGING
+          dref   = field ).
+      WRITE ''@KERNEL obj[ls_component.get().name.get().toLowerCase()] = field.getPointer();''.
+    ENDLOOP.
+    WRITE ''@KERNEL dref.assign(new abap.types.Structure(obj));''.
+  ENDMETHOD.
+ 
+  METHOD table.
+    DATA lo_table     TYPE REF TO cl_abap_tabledescr.
+    DATA lt_keys      TYPE abap_table_keydescr_tab.
+    DATA ls_key       LIKE LINE OF lt_keys.
+    DATA lv_component TYPE string.
+    DATA field        TYPE REF TO data.
+ 
+    lo_table ?= handle.
+ 
+    call(
+      EXPORTING
+        handle = lo_table->get_table_line_type( )
+      CHANGING
+        dref   = field ).
+ 
+    WRITE ''@KERNEL let options = {primaryKey: undefined, keyType: "DEFAULT", withHeader: false};''.
+    WRITE ''@KERNEL options.primaryKey = {name: "primary_key", type: "STANDARD", keyFields: [], isUnique: false};''.
+ 
+* todo, handle secondary keys,
+    lt_keys = lo_table->get_keys( ).
+    LOOP AT lt_keys INTO ls_key WHERE is_primary = abap_true.
+      IF ls_key-access_kind = cl_abap_tabledescr=>tablekind_sorted.
+        WRITE ''@KERNEL options.primaryKey.type = "SORTED";''.
+      ELSEIF ls_key-access_kind = cl_abap_tabledescr=>tablekind_hashed.
+        WRITE ''@KERNEL options.primaryKey.type = "HASHED";''.
+      ENDIF.
+      IF ls_key-is_unique = abap_true.
+        WRITE ''@KERNEL options.primaryKey.isUnique = true;''.
+      ENDIF.
+      LOOP AT ls_key-components INTO lv_component.
+        WRITE ''@KERNEL options.primaryKey.keyFields.push(lv_component.get().toLowerCase());''.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    WRITE ''@KERNEL dref.assign(abap.types.TableFactory.construct(field.getPointer(), options));''.
+  ENDMETHOD.
+ 
+  METHOD elem.
+    DATA lv_half TYPE i.
+    CASE handle->type_kind.
+      WHEN cl_abap_typedescr=>typekind_float.
+        CREATE DATA dref TYPE f.
+      WHEN cl_abap_typedescr=>typekind_string.
+        CREATE DATA dref TYPE string.
+      WHEN cl_abap_typedescr=>typekind_xstring.
+        CREATE DATA dref TYPE xstring.
+      WHEN cl_abap_typedescr=>typekind_int.
+        CREATE DATA dref TYPE i.
+      WHEN cl_abap_typedescr=>typekind_date.
+        CREATE DATA dref TYPE d.
+      WHEN cl_abap_typedescr=>typekind_hex.
+        CREATE DATA dref TYPE x LENGTH handle->length.
+      WHEN cl_abap_typedescr=>typekind_packed.
+        CREATE DATA dref TYPE p LENGTH handle->length DECIMALS handle->decimals.
+      WHEN cl_abap_typedescr=>typekind_char.
+        lv_half = handle->length / 2.
+        CREATE DATA dref TYPE c LENGTH lv_half.
+* todo, this needs some redesign to work properly,
+        WRITE ''@KERNEL dref.getPointer().extra = {"qualifiedName": handle.get().relative_name};''.
+      WHEN cl_abap_typedescr=>typekind_num.
+        lv_half = handle->length / 2.
+        CREATE DATA dref TYPE n LENGTH lv_half.
+      WHEN cl_abap_typedescr=>typekind_time.
+        CREATE DATA dref TYPE t.
+      WHEN cl_abap_typedescr=>typekind_int8.
+        CREATE DATA dref TYPE int8.
+      WHEN OTHERS.
+        WRITE ''@KERNEL console.dir(handle);''.
+        ASSERT 1 = ''todo''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_INTERNAL_NAME                    ', 'CLASS kernel_internal_name DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS internal_to_rtti
+      IMPORTING
+        iv_internal TYPE string
+      RETURNING
+        VALUE(rv_rtti) TYPE string.
+ 
+    CLASS-METHODS rtti_to_internal
+      IMPORTING
+        iv_rtti TYPE string
+      RETURNING
+        VALUE(rv_internal) TYPE string.
+ENDCLASS.
+ 
+CLASS kernel_internal_name IMPLEMENTATION.
+ 
+  METHOD internal_to_rtti.
+    rv_rtti = iv_internal.
+    IF rv_rtti CP ''*CLAS-*''.
+      REPLACE FIRST OCCURRENCE OF ''CLAS-'' IN rv_rtti WITH ''\\CLASS#POOL=''.
+      REPLACE FIRST OCCURRENCE OF ''-'' IN rv_rtti WITH ''\\CLASS=''.
+      REPLACE FIRST OCCURRENCE OF ''#'' IN rv_rtti WITH ''-''.
+    ELSE.
+      rv_rtti = ''\\CLASS='' && rv_rtti.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD rtti_to_internal.
+    rv_internal = iv_rtti.
+    IF rv_internal CP ''\\CLASS=*''.
+      REPLACE FIRST OCCURRENCE OF ''\\CLASS='' IN rv_internal WITH ''''.
+    ELSEIF rv_internal CP ''\\CLASS-POOL=*''.
+      REPLACE FIRST OCCURRENCE OF ''\\CLASS-POOL='' IN rv_internal WITH ''CLAS-''.
+      REPLACE FIRST OCCURRENCE OF ''\\CLASS='' IN rv_internal WITH ''-''.
+      REPLACE FIRST OCCURRENCE OF ''\\INTERFACE='' IN rv_internal WITH ''-''.
+    ENDIF.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_LOCK                             ', 'CLASS kernel_lock DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS enqueue
+      IMPORTING
+        input TYPE any
+      EXCEPTIONS
+        foreign_lock
+        system_failure.
+    CLASS-METHODS dequeue
+      IMPORTING
+        input TYPE any.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+CLASS kernel_lock IMPLEMENTATION.
+ 
+  METHOD enqueue.
+* add custom implementation here if needed
+    sy-subrc = 0.
+  ENDMETHOD.
+ 
+  METHOD dequeue.
+* add custom implementation here if needed
+    sy-subrc = 0.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_PUSH_CHANNELS                    ', 'CLASS kernel_push_channels DEFINITION PUBLIC.
+* handling of ABAP statement WAIT FOR PUSH CHANNELS
+  PUBLIC SECTION.
+    CLASS-METHODS wait.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+CLASS kernel_push_channels IMPLEMENTATION.
+ 
+  METHOD wait.
+* todo, await up to some seconds
+    WRITE ''@KERNEL await new Promise(resolve => setTimeout(resolve, 1000));''.
+* todo, check condition
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_SCAN_ABAP_SOURCE                 ', 'CLASS kernel_scan_abap_source DEFINITION PUBLIC.
+* handling of ABAP statement SCAN ABAP-SOURCE
+  PUBLIC SECTION.
+    CLASS-METHODS call IMPORTING input TYPE any.
+  PRIVATE SECTION.
+    TYPES ty_stokesx TYPE STANDARD TABLE OF stokesx WITH DEFAULT KEY.
+    TYPES ty_sstmnt TYPE STANDARD TABLE OF sstmnt WITH DEFAULT KEY.
+ 
+    CLASS-METHODS call_internal
+      IMPORTING
+        source     TYPE string
+      EXPORTING
+        et_stokesx TYPE ty_stokesx
+        et_sstmnt  TYPE ty_sstmnt.
+ 
+    CONSTANTS: BEGIN OF gc_token,
+                 comment    TYPE c LENGTH 1 VALUE ''C'',
+                 identifier TYPE c LENGTH 1 VALUE ''I'',
+                 list       TYPE c LENGTH 1 VALUE ''L'',
+                 literal    TYPE c LENGTH 1 VALUE ''S'',
+                 pragma     TYPE c LENGTH 1 VALUE ''P'',
+               END OF gc_token.
+ 
+    CONSTANTS: BEGIN OF gc_statement,
+                 comment          TYPE c LENGTH 1 VALUE ''P'',
+                 comment_in_stmnt TYPE c LENGTH 1 VALUE ''S'',
+                 compute_direct   TYPE c LENGTH 1 VALUE ''C'',
+                 empty            TYPE c LENGTH 1 VALUE ''N'',
+                 macro_call       TYPE c LENGTH 1 VALUE ''D'',
+                 macro_definition TYPE c LENGTH 1 VALUE ''M'',
+                 method_direct    TYPE c LENGTH 1 VALUE ''A'',
+                 native_sql       TYPE c LENGTH 1 VALUE ''E'',
+                 pragma           TYPE c LENGTH 1 VALUE ''G'',
+                 standard         TYPE c LENGTH 1 VALUE ''K'',
+               END OF gc_statement.
+ 
+    CLASS-METHODS pass1
+      IMPORTING
+        source        TYPE string
+      EXPORTING
+        et_tokens     TYPE ty_stokesx
+        et_statements TYPE ty_sstmnt.
+ 
+    CLASS-METHODS pass2
+      CHANGING
+        ct_tokens     TYPE ty_stokesx
+        ct_statements TYPE ty_sstmnt.
+ENDCLASS.
+ 
+CLASS kernel_scan_abap_source IMPLEMENTATION.
+ 
+  METHOD call.
+ 
+* non-goal: good performance
+ 
+    DATA lt_sstmnt  TYPE ty_sstmnt.
+    DATA lt_stokes  TYPE stokes_tab.
+    DATA ls_stokes  LIKE LINE OF lt_stokes.
+    DATA lt_stokesx TYPE ty_stokesx.
+    DATA ls_stokesx LIKE LINE OF lt_stokesx.
+    DATA lv_source  TYPE string.
+ 
+    WRITE ''@KERNEL lv_source.set(INPUT.scan_abap_source.array ? INPUT.scan_abap_source.array().map(e => e.get()).join("\\n") : INPUT.scan_abap_source.get());''.
+ 
+    call_internal(
+      EXPORTING
+        source     = lv_source
+      IMPORTING
+        et_stokesx = lt_stokesx
+        et_sstmnt  = lt_sstmnt ).
+ 
+    LOOP AT lt_stokesx INTO ls_stokesx.
+      CLEAR ls_stokes.
+      MOVE-CORRESPONDING ls_stokesx TO ls_stokes.
+      APPEND ls_stokes TO lt_stokes.
+    ENDLOOP.
+ 
+    WRITE ''@KERNEL const len = Object.keys(INPUT.tokens_into.getRowType().get()).length;''.
+    WRITE ''@KERNEL INPUT.tokens_into.set(len == 4 ? lt_stokes : lt_stokesx);''.
+ 
+    WRITE ''@KERNEL INPUT.statements_into.set(lt_sstmnt);''.
+ 
+  ENDMETHOD.
+ 
+  METHOD call_internal.
+ 
+* build tokens in sequence of occurence in the source
+* take care of chained statements
+    pass1(
+      EXPORTING
+        source        = source
+      IMPORTING
+        et_tokens     = et_stokesx
+        et_statements = et_sstmnt ).
+ 
+* move comment tokens and add/change statements to comment type
+    pass2(
+      CHANGING
+        ct_tokens     = et_stokesx
+        ct_statements = et_sstmnt ).
+ 
+  ENDMETHOD.
+ 
+  METHOD pass1.
+    CONSTANTS: BEGIN OF c_mode,
+                 normal  TYPE i VALUE 1,
+                 comment TYPE i VALUE 2,
+               END OF c_mode.
+ 
+    DATA character    TYPE c LENGTH 1.
+    DATA row          TYPE i VALUE 1.
+    DATA column       TYPE i.
+    DATA index        TYPE i.
+    DATA sfrom        TYPE i VALUE 1.
+    DATA mode         TYPE i.
+    DATA chain_tokens TYPE ty_stokesx.
+ 
+    FIELD-SYMBOLS <trow> LIKE LINE OF et_tokens.
+    FIELD-SYMBOLS <srow> LIKE LINE OF et_statements.
+ 
+    mode = c_mode-normal.
+    WHILE source IS NOT INITIAL.
+      character = source(1).
+      source = source+1.
+ 
+      IF <trow> IS NOT ASSIGNED AND character <> '''' AND character <> |\\n|.
+        APPEND INITIAL LINE TO et_tokens ASSIGNING <trow>.
+        <trow>-row = row.
+        <trow>-col = column.
+        <trow>-type = gc_token-identifier.
+      ELSEIF mode = c_mode-normal AND ( character = '''' OR character CA |.,| ).
+        UNASSIGN <trow>.
+"         IF character = '',''.
+" *          WRITE ''@KERNEL console.dir("before");''.
+"           APPEND LINES OF chain_tokens TO et_tokens.
+" *          WRITE ''@KERNEL console.dir("after");''.
+" *          WRITE lines( <tokens> ).
+"         ENDIF.
+      ELSEIF mode = c_mode-normal AND character = '':''.
+        CLEAR chain_tokens.
+        APPEND LINES OF et_tokens FROM sfrom TO chain_tokens.
+        DELETE chain_tokens WHERE type = gc_token-comment.
+*        WRITE ''@KERNEL console.dir(chain_tokens);''.
+      ENDIF.
+ 
+      IF ( mode = c_mode-normal AND character CA |.,| )
+          OR source = ''''.
+        APPEND INITIAL LINE TO et_statements ASSIGNING <srow>.
+        <srow>-terminator = character.
+        <srow>-from = sfrom.
+        <srow>-to = lines( et_tokens ).
+        sfrom = <srow>-to + 1.
+ 
+        IF character = '',''.
+*          WRITE ''@KERNEL console.dir("before");''.
+          APPEND LINES OF chain_tokens TO et_tokens.
+*          WRITE ''@KERNEL console.dir("after");''.
+*          WRITE lines( <tokens> ).
+        ENDIF.
+      ENDIF.
+ 
+      IF character = |\\n|.
+        mode = c_mode-normal.
+        UNASSIGN <trow>.
+        row = row + 1.
+        column = 0.
+      ELSE.
+        IF <trow> IS ASSIGNED.
+          IF ( character = ''*'' AND column = 0 ) OR character = ''"''.
+            mode = c_mode-comment.
+            <trow>-type = gc_token-comment.
+          ENDIF.
+          IF mode = c_mode-comment.
+            <trow>-type = gc_token-comment.
+            CONCATENATE <trow>-str character INTO <trow>-str RESPECTING BLANKS.
+          ELSEIF character <> '':''.
+            <trow>-str = <trow>-str && to_upper( |{ character }| ).
+          ENDIF.
+        ENDIF.
+        column = column + 1.
+      ENDIF.
+ 
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+  METHOD pass2.
+    FIELD-SYMBOLS <ls_statement> LIKE LINE OF ct_statements.
+    DATA ls_statement       LIKE LINE OF ct_statements.
+    DATA ls_token           LIKE LINE OF ct_tokens.
+    DATA contains_comment   TYPE abap_bool.
+    DATA contains_normal    TYPE abap_bool.
+    DATA lv_count           TYPE i.
+    DATA lv_statement_index TYPE i.
+    DATA lt_insert          LIKE ct_tokens.
+    DATA lt_delete          TYPE STANDARD TABLE OF i WITH DEFAULT KEY.
+    DATA lv_index           LIKE LINE OF lt_delete.
+ 
+    LOOP AT ct_statements ASSIGNING <ls_statement>.
+      lv_statement_index = sy-tabix.
+ 
+*      WRITE ''@KERNEL console.dir("statement");''.
+      contains_comment = abap_false.
+      contains_normal = abap_false.
+      LOOP AT ct_tokens INTO ls_token FROM <ls_statement>-from TO <ls_statement>-to.
+        IF ls_token-type = gc_token-comment.
+          contains_comment = abap_true.
+        ELSE.
+          contains_normal = abap_true.
+        ENDIF.
+*        WRITE ''@KERNEL console.dir(ls_token.get().str.get());''.
+      ENDLOOP.
+ 
+      IF contains_comment = abap_true AND contains_normal = abap_true.
+* its a mix, move comments to the front as separate statement
+*        WRITE ''@KERNEL console.dir("from: " + fs_ls_statement_.get().from.get());''.
+*        WRITE ''@KERNEL console.dir("to: " + fs_ls_statement_.get().to.get());''.
+        lv_count = 0.
+        CLEAR lt_insert.
+        CLEAR lt_delete.
+        LOOP AT ct_tokens INTO ls_token FROM <ls_statement>-from TO <ls_statement>-to.
+*          WRITE ''@KERNEL console.dir("token: " + ls_token.get().str.get() + " " + abap.builtin.sy.get().tabix.get());''.
+          IF ls_token-type = gc_token-comment.
+            INSERT sy-tabix INTO lt_delete INDEX 1.
+            INSERT ls_token INTO lt_insert INDEX 1.
+            lv_count = lv_count + 1.
+          ENDIF.
+        ENDLOOP.
+        LOOP AT lt_delete INTO lv_index.
+          DELETE ct_tokens INDEX lv_index.
+        ENDLOOP.
+        LOOP AT lt_insert INTO ls_token.
+          INSERT ls_token INTO ct_tokens INDEX <ls_statement>-from.
+        ENDLOOP.
+ 
+        CLEAR ls_statement.
+        ls_statement-from = <ls_statement>-from.
+        ls_statement-to = <ls_statement>-from + lv_count - 1.
+        ls_statement-type = gc_statement-comment.
+ 
+        <ls_statement>-from = <ls_statement>-from + lv_count.
+ 
+        INSERT ls_statement INTO ct_statements INDEX lv_statement_index.
+      ELSEIF contains_comment = abap_true.
+        <ls_statement>-type = gc_statement-comment.
+      ELSE.
+        <ls_statement>-type = gc_statement-standard.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_NUMBERRANGE_RUNTIME                  ', 'CLASS cl_numberrange_runtime DEFINITION PUBLIC.
+  PUBLIC SECTION.
+ 
+    TYPES nr_interval TYPE c LENGTH 2.
+    TYPES nr_object   TYPE c LENGTH 10.
+    TYPES nr_number   TYPE n LENGTH 20.
+ 
+    CLASS-METHODS number_get
+      IMPORTING
+        nr_range_nr TYPE nr_interval
+        object      TYPE nr_object
+      EXPORTING
+        number      TYPE nr_number
+      RAISING
+        cx_static_check.
+ENDCLASS.
+ 
+CLASS cl_numberrange_runtime IMPLEMENTATION.
+ 
+  METHOD number_get.
+ 
+    CALL FUNCTION ''NUMBER_GET_NEXT''
+      EXPORTING
+        nr_range_nr             = nr_range_nr
+        object                  = object
+      IMPORTING
+        number                  = number
+      EXCEPTIONS
+        interval_not_found      = 1
+        number_range_not_intern = 2
+        object_not_found        = 3
+        quantity_is_0           = 4
+        quantity_is_not_1       = 5
+        interval_overflow       = 6
+        buffer_overflow         = 7
+        OTHERS                  = 8.
+    IF sy-subrc <> 0.
+      RETURN. " todo
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_NUMBERRANGE                      ', 'CLASS kernel_numberrange DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS number_get
+      IMPORTING
+        nr_range_nr TYPE cl_numberrange_runtime=>nr_interval
+        object      TYPE cl_numberrange_runtime=>nr_object
+      EXPORTING
+        number      TYPE cl_numberrange_runtime=>nr_number
+      RAISING
+        cx_static_check.
+  PRIVATE SECTION.
+    TYPES: BEGIN OF ty_status,
+             nr_range_nr TYPE cl_numberrange_runtime=>nr_interval,
+             object      TYPE cl_numberrange_runtime=>nr_object,
+             number      TYPE cl_numberrange_runtime=>nr_number,
+           END OF ty_status.
+    CLASS-DATA status TYPE STANDARD TABLE OF ty_status WITH DEFAULT KEY.
+ENDCLASS.
+ 
+CLASS kernel_numberrange IMPLEMENTATION.
+ 
+  METHOD number_get.
+* for now, only in memory for the current session
+    FIELD-SYMBOLS <row> LIKE LINE OF status.
+    READ TABLE status WITH KEY nr_range_nr = nr_range_nr object = object ASSIGNING <row>.
+    IF sy-subrc = 0.
+      <row>-number = <row>-number + 1.
+    ELSE.
+      APPEND INITIAL LINE TO status ASSIGNING <row>.
+      <row>-nr_range_nr = nr_range_nr.
+      <row>-object = object.
+      <row>-number = 1.
+    ENDIF.
+    number = <row>-number.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_OO_FACTORY                           ', 'CLASS cl_oo_factory DEFINITION PUBLIC CREATE PRIVATE.
+  PUBLIC SECTION.
+    INTERFACES if_oo_clif_source.
+ 
+    CLASS-METHODS create_instance
+      RETURNING
+        VALUE(result) TYPE REF TO cl_oo_factory.
+ 
+    METHODS create_clif_source
+      IMPORTING
+        clif_name     TYPE csequence
+      RETURNING
+        VALUE(result) TYPE REF TO if_oo_clif_source
+      RAISING
+        cx_oo_clif_not_exists.
+ 
+  PRIVATE SECTION.
+    DATA mv_name TYPE string.
+ENDCLASS.
+ 
+CLASS cl_oo_factory IMPLEMENTATION.
+  METHOD create_instance.
+    CREATE OBJECT result.
+  ENDMETHOD.
+ 
+  METHOD create_clif_source.
+* todo, this not correct, should return a new instance, but will work for now
+    result = me.
+    mv_name = to_upper( clif_name ).
+  ENDMETHOD.
+ 
+  METHOD if_oo_clif_source~get_source.
+    DATA ls_data TYPE reposrc.
+    SELECT SINGLE * FROM reposrc INTO ls_data WHERE progname = mv_name.
+    SPLIT ls_data-data AT |\\n| INTO TABLE source.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_OO_CLIF_NOT_EXISTS                   ', 'CLASS cx_oo_clif_not_exists DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_oo_clif_not_exists IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_OO_CLIF_SOURCE                       ', 'INTERFACE if_oo_clif_source PUBLIC.
+  METHODS get_source
+    EXPORTING
+      source TYPE string_table.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_CLASSDESCR                      ', 'CLASS cl_abap_classdescr DEFINITION PUBLIC INHERITING FROM cl_abap_objectdescr.
+  PUBLIC SECTION.
+    CLASS-METHODS get_class_name
+      IMPORTING
+        p_object TYPE REF TO object
+      RETURNING
+        VALUE(p_name) TYPE abap_abstypename.
+ 
+    METHODS get_super_class_type
+      RETURNING
+        VALUE(p_descr_ref) TYPE REF TO cl_abap_classdescr
+      EXCEPTIONS
+        super_class_not_found.
+ 
+    METHODS constructor
+      IMPORTING
+        p_object TYPE any OPTIONAL.
+ENDCLASS.
+ 
+CLASS cl_abap_classdescr IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor( p_object ).
+  ENDMETHOD.
+ 
+  METHOD get_class_name.
+    DATA lv_name TYPE string.
+    WRITE ''@KERNEL lv_name.set(p_object.get().constructor.INTERNAL_NAME);''.
+    p_name = kernel_internal_name=>internal_to_rtti( lv_name ).
+  ENDMETHOD.
+ 
+  METHOD get_super_class_type.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_COMPLEXDESCR                    ', 'CLASS cl_abap_complexdescr DEFINITION PUBLIC INHERITING FROM cl_abap_datadescr.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS cl_abap_complexdescr IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_DATADESCR                       ', 'CLASS cl_abap_datadescr DEFINITION PUBLIC INHERITING FROM cl_abap_typedescr.
+  PUBLIC SECTION.
+    CLASS-METHODS get_data_type_kind
+      IMPORTING
+        p_data             TYPE data
+      RETURNING
+        VALUE(p_type_kind) TYPE abap_typekind.
+ 
+    METHODS applies_to_data
+      IMPORTING
+        p_data TYPE data
+      RETURNING
+        VALUE(p_flag) TYPE abap_bool.
+ENDCLASS.
+ 
+CLASS cl_abap_datadescr IMPLEMENTATION.
+ 
+  METHOD get_data_type_kind.
+    DATA descr TYPE REF TO cl_abap_typedescr.
+    descr = cl_abap_typedescr=>describe_by_data( p_data ).
+    p_type_kind = descr->type_kind.
+  ENDMETHOD.
+ 
+  METHOD applies_to_data.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_ELEMDESCR                       ', 'CLASS cl_abap_elemdescr DEFINITION PUBLIC INHERITING FROM cl_abap_datadescr.
+  PUBLIC SECTION.
+    TYPES:
+      BEGIN OF fixvalue,
+        low        TYPE c LENGTH 10,
+        high       TYPE c LENGTH 10,
+        option     TYPE c LENGTH 2,
+        ddlanguage TYPE c,
+        ddtext     TYPE c LENGTH 60,
+      END OF fixvalue.
+    TYPES fixvalues TYPE STANDARD TABLE OF fixvalue WITH DEFAULT KEY.
+ 
+    DATA output_length TYPE i READ-ONLY.
+    DATA edit_mask TYPE abap_editmask READ-ONLY.
+    DATA help_id TYPE abap_helpid READ-ONLY.
+ 
+    METHODS get_ddic_fixed_values
+      RETURNING
+        VALUE(p_fixed_values) TYPE fixvalues.
+ 
+    METHODS get_ddic_field
+      IMPORTING
+        p_langu TYPE sy-langu DEFAULT sy-langu
+      RETURNING
+        VALUE(p_flddescr) TYPE dfies
+      EXCEPTIONS
+        not_found
+        no_ddic_type.
+ 
+    CLASS-METHODS get_i RETURNING VALUE(r_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_int8 RETURNING VALUE(r_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_f RETURNING VALUE(r_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_d RETURNING VALUE(r_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_t RETURNING VALUE(r_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_string RETURNING VALUE(p_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_c
+      IMPORTING
+        p_length TYPE i
+      RETURNING
+        VALUE(p_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_p
+      IMPORTING
+        p_length   TYPE i
+        p_decimals TYPE i
+      RETURNING
+        VALUE(p_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_n
+      IMPORTING
+        p_length TYPE i
+      RETURNING
+        VALUE(p_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_x
+      IMPORTING
+        p_length TYPE i
+      RETURNING
+        VALUE(p_result) TYPE REF TO cl_abap_elemdescr.
+    CLASS-METHODS get_xstring
+      RETURNING
+        VALUE(p_result) TYPE REF TO cl_abap_elemdescr.
+ 
+ENDCLASS.
+ 
+CLASS cl_abap_elemdescr IMPLEMENTATION.
+ 
+  METHOD get_p.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_n.
+    DATA foo TYPE REF TO data.
+    CREATE DATA foo TYPE n LENGTH p_length.
+    p_result ?= cl_abap_typedescr=>describe_by_data_ref( foo ).
+  ENDMETHOD.
+ 
+  METHOD get_x.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_xstring.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_ddic_field.
+    p_flddescr-tabname  = absolute_name.
+    p_flddescr-inttype  = type_kind.
+    p_flddescr-langu    = sy-langu.
+    p_flddescr-position = 1.
+    p_flddescr-leng     = length.
+    p_flddescr-decimals = decimals.
+ 
+    WRITE ''@KERNEL p_flddescr.get().domname.set(abap.DDIC[this.relative_name.get()]?.domain || "");''.
+ 
+* todo, dfies-convexit
+  ENDMETHOD.
+ 
+  METHOD get_i.
+    DATA foo TYPE i.
+    r_result ?= cl_abap_typedescr=>describe_by_data( foo ).
+  ENDMETHOD.
+ 
+  METHOD get_int8.
+    DATA foo TYPE int8.
+    r_result ?= cl_abap_typedescr=>describe_by_data( foo ).
+  ENDMETHOD.
+ 
+  METHOD get_string.
+    DATA foo TYPE string.
+    p_result ?= cl_abap_typedescr=>describe_by_data( foo ).
+  ENDMETHOD.
+ 
+  METHOD get_f.
+    DATA foo TYPE f.
+    r_result ?= cl_abap_typedescr=>describe_by_data( foo ).
+  ENDMETHOD.
+ 
+  METHOD get_d.
+    DATA foo TYPE d.
+    r_result ?= cl_abap_typedescr=>describe_by_data( foo ).
+  ENDMETHOD.
+ 
+  METHOD get_t.
+    DATA foo TYPE t.
+    r_result ?= cl_abap_typedescr=>describe_by_data( foo ).
+  ENDMETHOD.
+ 
+  METHOD get_c.
+    DATA foo TYPE REF TO data.
+    CREATE DATA foo TYPE c LENGTH p_length.
+    p_result ?= cl_abap_typedescr=>describe_by_data_ref( foo ).
+  ENDMETHOD.
+ 
+  METHOD get_ddic_fixed_values.
+ 
+    DATA lv_dummy TYPE string.
+    DATA lv_name  TYPE string.
+    DATA ls_row   LIKE LINE OF p_fixed_values.
+ 
+    SPLIT absolute_name AT ''='' INTO lv_dummy lv_name.
+ 
+    WRITE ''@KERNEL for (const f of abap.DDIC[lv_name.get()]?.fixedValues || []) {''.
+    CLEAR ls_row.
+    WRITE ''@KERNEL   ls_row.get().low.set(f.low || "");''.
+    WRITE ''@KERNEL   ls_row.get().high.set(f.high || "");''.
+    WRITE ''@KERNEL   ls_row.get().option.set(f.option || "");''.
+    WRITE ''@KERNEL   ls_row.get().ddlanguage.set(f.ddlanguage || "");''.
+    WRITE ''@KERNEL   ls_row.get().ddtext.set(f.ddtext || "");''.
+    APPEND ls_row TO p_fixed_values.
+    WRITE ''@KERNEL }''.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_ENUMDESCR                       ', 'CLASS cl_abap_enumdescr DEFINITION PUBLIC INHERITING FROM cl_abap_elemdescr.
+  PUBLIC SECTION.
+    TYPES: BEGIN OF member,
+             name  TYPE c LENGTH 30,
+             value TYPE string,
+           END OF member.
+    TYPES member_table TYPE STANDARD TABLE OF member WITH KEY name.
+    DATA members TYPE member_table READ-ONLY.
+ENDCLASS.
+ 
+CLASS cl_abap_enumdescr IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_INTFDESCR                       ', 'CLASS cl_abap_intfdescr DEFINITION PUBLIC INHERITING FROM cl_abap_objectdescr.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS cl_abap_intfdescr IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_OBJECTDESCR                     ', 'CLASS cl_abap_objectdescr DEFINITION PUBLIC INHERITING FROM cl_abap_typedescr.
+  PUBLIC SECTION.
+    CONSTANTS changing  TYPE abap_parmkind VALUE ''C''.
+    CONSTANTS exporting TYPE abap_parmkind VALUE ''E''.
+    CONSTANTS importing TYPE abap_parmkind VALUE ''I''.
+    CONSTANTS receiving TYPE abap_parmkind VALUE ''R''.
+    CONSTANTS returning TYPE abap_parmkind VALUE ''R''.
+ 
+    CONSTANTS private   TYPE abap_visibility VALUE ''I''.
+    CONSTANTS protected TYPE abap_visibility VALUE ''O''.
+    CONSTANTS public    TYPE abap_visibility VALUE ''U''.
+ 
+    DATA attributes TYPE abap_attrdescr_tab READ-ONLY.
+    DATA methods    TYPE abap_methdescr_tab READ-ONLY.
+    DATA interfaces TYPE abap_intfdescr_tab READ-ONLY.
+ 
+    METHODS constructor
+      IMPORTING
+        p_object TYPE any OPTIONAL.
+ 
+    METHODS get_attribute_type
+      IMPORTING
+        p_name             TYPE any
+      RETURNING
+        VALUE(p_descr_ref) TYPE REF TO cl_abap_datadescr
+      EXCEPTIONS
+        attribute_not_found.
+ 
+    METHODS get_method_parameter_type
+      IMPORTING
+        p_method_name      TYPE any
+        p_parameter_name   TYPE any
+      RETURNING
+        VALUE(p_descr_ref) TYPE REF TO cl_abap_datadescr
+      EXCEPTIONS
+        parameter_not_found
+        method_not_found.
+ 
+    METHODS get_interface_type
+      IMPORTING
+        p_name             TYPE any
+      RETURNING
+        VALUE(p_descr_ref) TYPE REF TO cl_abap_intfdescr
+      EXCEPTIONS
+        interface_not_found.
+ 
+  PROTECTED SECTION.
+    DATA mv_object_name TYPE string.
+    DATA mv_object_type TYPE string.
+ 
+    TYPES: BEGIN OF ty_attribute_types,
+             name TYPE abap_attrname,
+             type TYPE REF TO cl_abap_datadescr,
+           END OF ty_attribute_types.
+    DATA mt_attribute_types TYPE STANDARD TABLE OF ty_attribute_types WITH DEFAULT KEY.
+ 
+    TYPES: BEGIN OF ty_parameter_types,
+             method    TYPE string,
+             parameter TYPE string,
+             type      TYPE REF TO data,
+           END OF ty_parameter_types.
+    DATA mt_parameter_types TYPE STANDARD TABLE OF ty_parameter_types WITH DEFAULT KEY.
+ENDCLASS.
+ 
+CLASS cl_abap_objectdescr IMPLEMENTATION.
+ 
+  METHOD constructor.
+    DATA lv_name  TYPE abap_attrname.
+    DATA lv_char1 TYPE c LENGTH 1.
+    DATA lv_any   TYPE string.
+ 
+    FIELD-SYMBOLS <attr>      TYPE abap_attrdescr.
+    FIELD-SYMBOLS <intf>      TYPE abap_intfdescr.
+    FIELD-SYMBOLS <method>    TYPE abap_methdescr.
+    FIELD-SYMBOLS <parameter> TYPE abap_parmdescr.
+    FIELD-SYMBOLS <atype>     LIKE LINE OF mt_attribute_types.
+    FIELD-SYMBOLS <ptype>     LIKE LINE OF mt_parameter_types.
+ 
+* set attributes
+    WRITE ''@KERNEL for (const a in p_object.ATTRIBUTES || []) {''.
+    WRITE ''@KERNEL   lv_name.set(a);''.
+    APPEND INITIAL LINE TO attributes ASSIGNING <attr>.
+    APPEND INITIAL LINE TO mt_attribute_types ASSIGNING <atype>.
+    <attr>-name = lv_name.
+    <atype>-name = lv_name.
+    <attr>-is_interface = boolc( lv_name CA ''~'' ).
+    WRITE ''@KERNEL   lv_char1.set(p_object.ATTRIBUTES[a].is_constant);''.
+    <attr>-is_constant = lv_char1.
+    WRITE ''@KERNEL   lv_char1.set(p_object.ATTRIBUTES[a].is_class || "");''.
+    <attr>-is_class = lv_char1.
+    WRITE ''@KERNEL   lv_char1.set(p_object.ATTRIBUTES[a].visibility);''.
+    <attr>-visibility = lv_char1.
+    WRITE ''@KERNEL   lv_any = p_object.ATTRIBUTES[a].type();''.
+    <atype>-type ?= describe_by_data( lv_any ).
+    <attr>-type_kind = <atype>-type->type_kind.
+    <attr>-length = <atype>-type->length.
+    <attr>-decimals = <atype>-type->decimals.
+    WRITE ''@KERNEL }''.
+    SORT attributes BY is_interface DESCENDING name ASCENDING.
+ 
+* set interfaces
+    WRITE ''@KERNEL for (const a of p_object.IMPLEMENTED_INTERFACES || []) {''.
+    WRITE ''@KERNEL   lv_name.set(a);''.
+    APPEND INITIAL LINE TO interfaces ASSIGNING <intf>.
+    <intf>-name = lv_name.
+    WRITE ''@KERNEL }''.
+    SORT interfaces BY name ASCENDING.
+ 
+* set methods
+    WRITE ''@KERNEL for (const a in p_object.METHODS || []) {''.
+    WRITE ''@KERNEL   lv_name.set(a);''.
+    APPEND INITIAL LINE TO methods ASSIGNING <method>.
+    <method>-name = lv_name.
+    WRITE ''@KERNEL   lv_char1.set(p_object.METHODS[a].visibility);''.
+    <method>-visibility = lv_char1.
+* set parameters of methods
+    WRITE ''@KERNEL for (const p in p_object.METHODS[a].parameters || []) {''.
+    APPEND INITIAL LINE TO mt_parameter_types ASSIGNING <ptype>.
+    APPEND INITIAL LINE TO <method>-parameters ASSIGNING <parameter>.
+    <ptype>-method = <method>-name.
+    WRITE ''@KERNEL   lv_name.set(p);''.
+    <parameter>-name = lv_name.
+    <ptype>-parameter = lv_name.
+    WRITE ''@KERNEL   lv_any = p_object.METHODS[a].parameters[p].type();''.
+* hmm, cannot call describe_by_data() here, as it can cause inifnite recursion
+    GET REFERENCE OF lv_any INTO <ptype>-type.
+"     <parameter>-type_kind = <ptype>-type->type_kind.
+"     <parameter>-length = <ptype>-type->length.
+"     <parameter>-decimals = <ptype>-type->decimals.
+" * todo, set PARAM_KIND
+    WRITE ''@KERNEL }''.
+    WRITE ''@KERNEL }''.
+    SORT methods BY name ASCENDING.
+ 
+    super->constructor( ).
+  ENDMETHOD.
+ 
+  METHOD get_method_parameter_type.
+    DATA ls_row LIKE LINE OF mt_parameter_types.
+*    WRITE ''@KERNEL   this.mt_parameter_types.array().map(e => console.dir(e.get()));''.
+    READ TABLE mt_parameter_types INTO ls_row WITH KEY method = p_method_name parameter = p_parameter_name.
+    IF sy-subrc = 0.
+      p_descr_ref ?= describe_by_data( ls_row-type->* ).
+    ELSE.
+      RAISE parameter_not_found.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD get_interface_type.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_attribute_type.
+    DATA lv_name TYPE abap_attrname.
+    DATA ls_type LIKE LINE OF mt_attribute_types.
+ 
+    lv_name = to_upper( p_name ).
+    READ TABLE mt_attribute_types INTO ls_type WITH KEY name = lv_name.
+    IF sy-subrc <> 0.
+      RAISE attribute_not_found.
+    ENDIF.
+    p_descr_ref = ls_type-type.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_REFDESCR                        ', 'CLASS cl_abap_refdescr DEFINITION PUBLIC INHERITING FROM cl_abap_datadescr.
+  PUBLIC SECTION.
+    METHODS get_referenced_type
+      RETURNING VALUE(type) TYPE REF TO cl_abap_typedescr.
+ 
+    CLASS-METHODS get_ref_to_data
+      RETURNING
+        VALUE(p_result) TYPE REF TO cl_abap_refdescr.
+ 
+  PRIVATE SECTION.
+    DATA referenced TYPE REF TO cl_abap_typedescr.
+ENDCLASS.
+ 
+CLASS cl_abap_refdescr IMPLEMENTATION.
+  METHOD get_referenced_type.
+    type = referenced.
+  ENDMETHOD.
+ 
+  METHOD get_ref_to_data.
+    DATA foo TYPE REF TO data.
+    p_result ?= cl_abap_typedescr=>describe_by_data( foo ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_STRUCTDESCR                     ', 'CLASS cl_abap_structdescr DEFINITION PUBLIC INHERITING FROM cl_abap_complexdescr.
+  PUBLIC SECTION.
+    CLASS-METHODS
+      construct_from_data
+        IMPORTING data TYPE any
+        RETURNING VALUE(descr) TYPE REF TO cl_abap_structdescr.
+ 
+    TYPES component       TYPE abap_componentdescr.
+    TYPES component_table TYPE abap_component_tab.
+    TYPES included_view   TYPE abap_component_view_tab.
+    TYPES symbol_table    TYPE abap_component_symbol_tab.
+ 
+    METHODS
+      get_components
+        RETURNING
+          VALUE(rt_components) TYPE component_table.
+ 
+    METHODS
+      get_ddic_field_list
+        IMPORTING
+          p_langu                  TYPE syst-langu DEFAULT sy-langu
+          p_including_substructres TYPE abap_bool DEFAULT abap_false
+        RETURNING
+          VALUE(rt_components)     TYPE ddfields
+        EXCEPTIONS
+          not_found
+          no_ddic_type.
+ 
+    METHODS is_ddic_type
+      RETURNING
+        VALUE(bool) TYPE abap_bool.
+ 
+    METHODS get_component_type
+      IMPORTING
+        p_name             TYPE any
+      RETURNING
+        VALUE(p_descr_ref) TYPE REF TO cl_abap_datadescr
+      EXCEPTIONS
+        component_not_found
+        unsupported_input_type.
+ 
+    METHODS get_included_view
+      IMPORTING
+        p_level         TYPE i OPTIONAL
+      RETURNING
+        VALUE(p_result) TYPE included_view.
+ 
+    CLASS-METHODS get
+      IMPORTING
+        p_components    TYPE component_table
+      RETURNING
+        VALUE(p_result) TYPE REF TO cl_abap_structdescr
+      RAISING
+        cx_sy_struct_creation.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        p_components TYPE component_table
+        p_strict     TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ref)   TYPE REF TO cl_abap_structdescr.
+ 
+    METHODS get_symbols
+      RETURNING
+        VALUE(p_result) TYPE symbol_table.
+ 
+    DATA components  TYPE abap_compdescr_tab.
+    DATA struct_kind TYPE abap_structkind READ-ONLY.
+ 
+  PRIVATE SECTION.
+    METHODS update_components.
+ 
+    TYPES: BEGIN OF ty_refs,
+             name       TYPE string,
+             ref        TYPE REF TO cl_abap_datadescr,
+             suffix     TYPE string,
+             as_include TYPE abap_bool,
+           END OF ty_refs.
+    DATA mt_refs TYPE STANDARD TABLE OF ty_refs WITH DEFAULT KEY.
+ENDCLASS.
+ 
+CLASS cl_abap_structdescr IMPLEMENTATION.
+ 
+  METHOD get_symbols.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD create.
+    DATA ls_component LIKE LINE OF p_components.
+    DATA ls_ref       LIKE LINE OF mt_refs.
+ 
+    IF lines( p_components ) = 0.
+      RAISE EXCEPTION TYPE cx_sy_struct_attributes.
+    ENDIF.
+ 
+    LOOP AT p_components INTO ls_component.
+      IF ls_component-name IS INITIAL.
+        RAISE EXCEPTION TYPE cx_sy_struct_comp_name.
+      ELSEIF ls_component-type IS INITIAL.
+        RAISE EXCEPTION TYPE cx_sy_struct_comp_type.
+      ELSEIF strlen( ls_component-name ) > 30. " todo, use abap_max_comp_name_ln
+        RAISE EXCEPTION TYPE cx_sy_struct_comp_name.
+      ENDIF.
+    ENDLOOP.
+ 
+    CREATE OBJECT ref.
+    LOOP AT p_components INTO ls_component.
+      CLEAR ls_ref.
+      ls_ref-name = ls_component-name.
+      ls_ref-ref  = ls_component-type.
+      APPEND ls_ref TO ref->mt_refs.
+    ENDLOOP.
+    ref->update_components( ).
+ 
+    ref->type_kind = typekind_struct2.
+    ref->kind = kind_struct.
+  ENDMETHOD.
+ 
+  METHOD get_included_view.
+    DATA ls_component LIKE LINE OF components.
+    DATA ls_view      LIKE LINE OF p_result.
+    DATA ls_ref       LIKE LINE OF mt_refs.
+ 
+    LOOP AT components INTO ls_component.
+      CLEAR ls_view.
+ 
+      ls_view-name = ls_component-name.
+      READ TABLE mt_refs WITH KEY name = ls_component-name INTO ls_ref.
+      IF sy-subrc = 0.
+        ls_view-type = ls_ref-ref.
+      ENDIF.
+      IF ls_ref-as_include = abap_true.
+        CONTINUE.
+      ENDIF.
+ 
+      INSERT ls_view INTO TABLE p_result.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD get_ddic_field_list.
+ 
+    DATA lt_components TYPE component_table.
+    DATA ls_component  LIKE LINE OF lt_components.
+    DATA ls_return     LIKE LINE OF rt_components.
+    DATA lv_name       TYPE string.
+    DATA lv_keyfield   TYPE string.
+    DATA lo_elemdescr  TYPE REF TO cl_abap_elemdescr.
+    FIELD-SYMBOLS <component> LIKE LINE OF rt_components.
+ 
+    lt_components = get_components( ).
+ 
+    ASSERT absolute_name CP ''+TYPE=*''.
+    lv_name = absolute_name+6.
+ 
+    LOOP AT lt_components INTO ls_component.
+      CLEAR ls_return.
+      ls_return-tabname = lv_name.
+      ls_return-fieldname = ls_component-name.
+      IF ls_component-type->kind = cl_abap_typedescr=>kind_elem.
+        lo_elemdescr ?= ls_component-type.
+        ls_return-leng = lo_elemdescr->output_length.
+      ENDIF.
+* todo, fill more fields in ls_return
+      APPEND ls_return TO rt_components.
+    ENDLOOP.
+ 
+*    WRITE ''@KERNEL console.dir(abap.DDIC[lv_name.get()]?.keyFields);''.
+    WRITE ''@KERNEL for (const keyfield of abap.DDIC[lv_name.get()]?.keyFields || [] ) {''.
+    WRITE ''@KERNEL lv_keyfield.set(keyfield);''.
+*    WRITE ''@KERNEL console.dir(rt_components.array()[0].get());''.
+    READ TABLE rt_components ASSIGNING <component> WITH KEY fieldname = lv_keyfield.
+    ASSERT sy-subrc = 0.
+    <component>-keyflag = abap_true.
+    WRITE ''@KERNEL }''.
+ 
+  ENDMETHOD.
+ 
+  METHOD is_ddic_type.
+    bool = ddic.
+  ENDMETHOD.
+ 
+  METHOD construct_from_data.
+* todo, this method should be private
+    DATA lv_name       TYPE string.
+    DATA ls_ref        LIKE LINE OF mt_refs.
+    DATA lv_suffix     TYPE string.
+    DATA lv_as_include TYPE abap_bool.
+    DATA lo_datadescr  TYPE REF TO cl_abap_datadescr.
+ 
+    FIELD-SYMBOLS <fs> TYPE any.
+ 
+    CREATE OBJECT descr.
+ 
+* todo, fail if input is not a structure?
+    WRITE ''@KERNEL for (const name of Object.keys(INPUT.data.value)) {''.
+    WRITE ''@KERNEL   lv_name.set(name.toUpperCase());''.
+    ASSIGN COMPONENT lv_name OF STRUCTURE data TO <fs>.
+    lo_datadescr ?= cl_abap_typedescr=>describe_by_data( <fs> ).
+    ls_ref-name = lv_name.
+    ls_ref-ref  = lo_datadescr.
+ 
+    CLEAR lv_as_include.
+    WRITE ''@KERNEL if (INPUT.data?.getAsInclude) {''.
+    WRITE ''@KERNEL   lv_as_include.set(INPUT.data?.getAsInclude()?.[name.toLowerCase()] ? "X" : " ");''.
+    WRITE ''@KERNEL }''.
+    ls_ref-as_include = lv_as_include.
+ 
+    CLEAR lv_suffix.
+    WRITE ''@KERNEL if (INPUT.data?.getSuffix) {''.
+    WRITE ''@KERNEL   lv_as_include.set(INPUT.data?.getSuffix()?.[name.toLowerCase()] || "");''.
+    WRITE ''@KERNEL }''.
+    ls_ref-suffix = lv_suffix.
+ 
+    APPEND ls_ref TO descr->mt_refs.
+    WRITE ''@KERNEL }''.
+ 
+    descr->update_components( ).
+  ENDMETHOD.
+ 
+  METHOD update_components.
+    DATA ls_component LIKE LINE OF components.
+    DATA ls_ref       LIKE LINE OF mt_refs.
+ 
+    CLEAR components.
+    LOOP AT mt_refs INTO ls_ref.
+      CLEAR ls_component.
+      ls_component-name = ls_ref-name.
+      ls_component-type_kind = ls_ref-ref->type_kind.
+      ls_component-length = ls_ref-ref->length.
+      ls_component-decimals = ls_ref-ref->decimals.
+      APPEND ls_component TO components.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD get_components.
+    DATA ls_component LIKE LINE OF components.
+    DATA ret          LIKE LINE OF rt_components.
+    DATA ls_ref       LIKE LINE OF mt_refs.
+ 
+    LOOP AT components INTO ls_component.
+      CLEAR ret.
+      ret-name = ls_component-name.
+      READ TABLE mt_refs INTO ls_ref WITH KEY name = ls_component-name.
+      IF sy-subrc = 0.
+        ret-type = ls_ref-ref.
+      ENDIF.
+      " as_include type abap_bool,
+      " suffix     type string,
+      APPEND ret TO rt_components.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD get_component_type.
+    DATA line LIKE LINE OF mt_refs.
+    READ TABLE mt_refs INTO line WITH KEY name = p_name.
+    IF sy-subrc <> 0.
+      RAISE component_not_found.
+    ELSE.
+      p_descr_ref = line-ref.
+    ENDIF.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_TABLEDESCR                      ', 'CLASS cl_abap_tabledescr DEFINITION PUBLIC INHERITING FROM cl_abap_datadescr.
+  PUBLIC SECTION.
+    DATA has_unique_key TYPE abap_bool READ-ONLY.
+    DATA key            TYPE abap_keydescr_tab READ-ONLY.
+    DATA key_defkind    TYPE abap_keydefkind READ-ONLY.
+    DATA table_kind     TYPE abap_tablekind.
+ 
+    CONSTANTS tablekind_any TYPE c LENGTH 1 VALUE ''A''.
+    CONSTANTS tablekind_std TYPE c LENGTH 1 VALUE ''S''.
+    CONSTANTS tablekind_index TYPE c LENGTH 1 VALUE ''I''.
+    CONSTANTS tablekind_hashed TYPE c LENGTH 1 VALUE ''H''.
+    CONSTANTS tablekind_sorted TYPE c LENGTH 1 VALUE ''O''.
+ 
+    CONSTANTS keydefkind_default TYPE c LENGTH 1 VALUE ''D''.
+    CONSTANTS keydefkind_tableline TYPE c LENGTH 1 VALUE ''L''.
+    CONSTANTS keydefkind_user TYPE c LENGTH 1 VALUE ''U''.
+    CONSTANTS keydefkind_empty TYPE c LENGTH 1 VALUE ''E''.
+ 
+    CLASS-METHODS
+      construct_from_data
+        IMPORTING data TYPE any
+        RETURNING VALUE(descr) TYPE REF TO cl_abap_tabledescr.
+ 
+    METHODS get_table_line_type
+      RETURNING
+        VALUE(type) TYPE REF TO cl_abap_datadescr.
+ 
+    CLASS-METHODS get
+      IMPORTING type TYPE REF TO cl_abap_typedescr
+      RETURNING VALUE(val) TYPE REF TO cl_abap_tabledescr.
+ 
+    CLASS-METHODS get_with_keys
+      IMPORTING
+        p_line_type     TYPE REF TO cl_abap_datadescr
+        p_keys          TYPE abap_table_keydescr_tab
+      RETURNING
+        VALUE(p_result) TYPE REF TO cl_abap_tabledescr.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        p_line_type  TYPE REF TO cl_abap_typedescr
+        p_table_kind TYPE abap_tablekind DEFAULT tablekind_std
+        p_unique     TYPE abap_bool DEFAULT abap_false
+        p_key        TYPE abap_keydescr_tab OPTIONAL
+        p_key_kind   TYPE abap_keydefkind DEFAULT keydefkind_default
+      RETURNING
+        VALUE(ref) TYPE REF TO cl_abap_tabledescr.
+ 
+    METHODS get_keys
+      RETURNING
+        VALUE(p_keys) TYPE abap_table_keydescr_tab.
+ 
+  PRIVATE SECTION.
+    DATA mo_line_type TYPE REF TO cl_abap_typedescr.
+    DATA mt_keys      TYPE abap_table_keydescr_tab.
+ENDCLASS.
+ 
+CLASS cl_abap_tabledescr IMPLEMENTATION.
+ 
+  METHOD create.
+ 
+    CREATE OBJECT ref.
+    ref->has_unique_key = p_unique.
+    ref->mo_line_type   = p_line_type.
+    ref->key            = p_key.
+    ref->key_defkind    = p_key_kind.
+    ref->table_kind     = p_table_kind.
+ 
+    " cl_abap_typedescr
+    ref->type_kind      = typekind_table.
+    ref->kind           = kind_table.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_keys.
+    p_keys = mt_keys.
+  ENDMETHOD.
+ 
+  METHOD get_with_keys.
+ 
+    DATA ls_key LIKE LINE OF p_keys.
+ 
+    IF lines( p_keys ) <> 1.
+      ASSERT 1 = ''todo''.
+    ENDIF.
+    READ TABLE p_keys INDEX 1 INTO ls_key.
+    ASSERT sy-subrc = 0.
+ 
+    CREATE OBJECT p_result.
+    p_result->has_unique_key = ls_key-is_unique.
+    p_result->mo_line_type   = p_line_type.
+    p_result->key_defkind    = ls_key-key_kind.
+    p_result->table_kind     = ls_key-access_kind.
+    p_result->mt_keys        = p_keys.
+ 
+    " cl_abap_typedescr
+    p_result->type_kind      = typekind_table.
+    p_result->kind           = kind_table.
+ 
+  ENDMETHOD.
+ 
+  METHOD get.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD construct_from_data.
+* todo, this method should be private
+    DATA lv_dummy      TYPE i.
+    DATA lv_flag       TYPE abap_bool.
+    DATA lv_str        TYPE string.
+    DATA lv_type       TYPE string.
+    DATA lo_struct     TYPE REF TO cl_abap_structdescr.
+    DATA lt_components TYPE cl_abap_structdescr=>component_table.
+    DATA ls_component  LIKE LINE OF lt_components.
+    DATA ls_key        TYPE LINE OF abap_keydescr_tab.
+ 
+    CREATE OBJECT descr.
+ 
+    WRITE ''@KERNEL lv_flag.set(data.getOptions()?.primaryKey?.isUnique === true ? "X" : "");''.
+    descr->has_unique_key = lv_flag.
+ 
+    WRITE ''@KERNEL lv_type.set(data.getOptions()?.primaryKey?.type || "");''.
+    CASE lv_type.
+      WHEN ''STANDARD''.
+        descr->table_kind = tablekind_std.
+      WHEN ''SORTED''.
+        descr->table_kind = tablekind_sorted.
+      WHEN ''HASHED''.
+        descr->table_kind = tablekind_hashed.
+      WHEN OTHERS.
+        descr->table_kind = tablekind_std.
+    ENDCASE.
+ 
+    WRITE ''@KERNEL lv_dummy = data.getRowType();''.
+    descr->mo_line_type = cl_abap_typedescr=>describe_by_data( lv_dummy ).
+ 
+    WRITE ''@KERNEL lv_flag.set(data.getOptions()?.primaryKey?.keyFields.length > 0 ? "X" : "");''.
+    IF lv_flag = abap_true.
+      descr->key_defkind = keydefkind_user.
+ 
+      WRITE ''@KERNEL for (const k of data.getOptions()?.primaryKey?.keyFields) {''.
+      WRITE ''@KERNEL lv_str.set(k);''.
+      ls_key-name = lv_str.
+      APPEND ls_key TO descr->key.
+      WRITE ''@KERNEL }''.
+ 
+      IF lines( descr->key ) = 1 AND ls_key-name = ''TABLE_LINE''.
+        descr->key_defkind = keydefkind_tableline.
+      ENDIF.
+    ELSE.
+* EMPTY KEY currently not supported in open-abap
+      descr->key_defkind = keydefkind_default.
+      IF descr->mo_line_type->kind = kind_struct.
+        lo_struct ?= descr->mo_line_type.
+        lt_components = lo_struct->get_components( ).
+        LOOP AT lt_components INTO ls_component.
+          ls_key-name = ls_component-name.
+          APPEND ls_key TO descr->key.
+        ENDLOOP.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_table_line_type.
+    type ?= mo_line_type.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_TYPEDESCR                       ', 'CLASS cl_abap_typedescr DEFINITION PUBLIC.
+* todo, this class should be ABSTRACT
+  PUBLIC SECTION.
+    CLASS-METHODS
+      describe_by_data
+        IMPORTING p_data TYPE any
+        RETURNING VALUE(type) TYPE REF TO cl_abap_typedescr.
+ 
+    CLASS-METHODS
+      describe_by_name
+        IMPORTING
+          p_name TYPE clike
+        RETURNING
+          VALUE(type) TYPE REF TO cl_abap_typedescr
+        EXCEPTIONS
+          type_not_found.
+ 
+    CLASS-METHODS
+      describe_by_data_ref
+        IMPORTING p_data_ref TYPE REF TO data
+        RETURNING VALUE(type) TYPE REF TO cl_abap_typedescr.
+ 
+    CLASS-METHODS
+      describe_by_object_ref
+        IMPORTING
+          p_object_ref TYPE REF TO object
+        RETURNING
+          VALUE(p_descr_ref) TYPE REF TO cl_abap_typedescr
+        EXCEPTIONS
+          reference_is_initial.
+ 
+    METHODS get_ddic_header
+      RETURNING
+        VALUE(p_header) TYPE abap_bool. " hmm, todo
+ 
+    METHODS
+      get_relative_name
+        RETURNING
+          VALUE(name) TYPE string.
+ 
+    METHODS
+      is_ddic_type
+        RETURNING
+          VALUE(p_abap_bool) TYPE abap_bool.
+ 
+    METHODS is_instantiatable
+      RETURNING
+        VALUE(p_result) TYPE abap_bool.
+ 
+    METHODS get_ddic_object
+      RETURNING
+        VALUE(p_object) TYPE string_table
+      EXCEPTIONS
+        not_found
+        no_ddic_type.
+ 
+    DATA type_kind     TYPE abap_typekind.
+    DATA kind          TYPE c LENGTH 1.
+    DATA ddic          TYPE abap_bool.
+    DATA length        TYPE i.
+    DATA decimals      TYPE i.
+    DATA absolute_name TYPE string.
+    DATA relative_name TYPE string.
+ 
+    CONSTANTS typekind_any TYPE abap_typekind VALUE ''~''.
+    CONSTANTS typekind_char TYPE abap_typekind VALUE ''C''.
+    CONSTANTS typekind_class TYPE abap_typekind VALUE ''*''.
+    CONSTANTS typekind_clike TYPE abap_typekind VALUE ''&''.
+    CONSTANTS typekind_csequence TYPE abap_typekind VALUE ''?''.
+    CONSTANTS typekind_data TYPE abap_typekind VALUE ''#''.
+    CONSTANTS typekind_date TYPE abap_typekind VALUE ''D''.
+    CONSTANTS typekind_decfloat TYPE abap_typekind VALUE ''/''.
+    CONSTANTS typekind_decfloat16 TYPE abap_typekind VALUE ''a''.
+    CONSTANTS typekind_decfloat34 TYPE abap_typekind VALUE ''e''.
+    CONSTANTS typekind_dref TYPE abap_typekind VALUE ''l''.
+    CONSTANTS typekind_enum TYPE abap_typekind VALUE ''k''.
+    CONSTANTS typekind_float TYPE abap_typekind VALUE ''F''.
+    CONSTANTS typekind_hex TYPE abap_typekind VALUE ''X''.
+    CONSTANTS typekind_int TYPE abap_typekind VALUE ''I''.
+    CONSTANTS typekind_int1 TYPE abap_typekind VALUE ''b''.
+    CONSTANTS typekind_int2 TYPE abap_typekind VALUE ''s''.
+    CONSTANTS typekind_int8 TYPE abap_typekind VALUE ''8''.
+    CONSTANTS typekind_intf TYPE abap_typekind VALUE ''+''.
+    CONSTANTS typekind_num TYPE abap_typekind VALUE ''N''.
+    CONSTANTS typekind_numeric TYPE abap_typekind VALUE ''%''.
+    CONSTANTS typekind_oref TYPE abap_typekind VALUE ''r''.
+    CONSTANTS typekind_packed TYPE abap_typekind VALUE ''P''.
+    CONSTANTS typekind_simple TYPE abap_typekind VALUE ''$''.
+    CONSTANTS typekind_string TYPE abap_typekind VALUE ''g''.
+    CONSTANTS typekind_struct1 TYPE abap_typekind VALUE ''u''.
+    CONSTANTS typekind_struct2 TYPE abap_typekind VALUE ''v''.
+    CONSTANTS typekind_table TYPE abap_typekind VALUE ''h''.
+    CONSTANTS typekind_time TYPE abap_typekind VALUE ''T''.
+    CONSTANTS typekind_utclong TYPE abap_typekind VALUE ''p''.
+    CONSTANTS typekind_w TYPE abap_typekind VALUE ''w''.
+    CONSTANTS typekind_xstring TYPE abap_typekind VALUE ''y''.
+ 
+    CONSTANTS kind_elem   TYPE c LENGTH 1 VALUE ''E''.
+    CONSTANTS kind_struct TYPE c LENGTH 1 VALUE ''S''.
+    CONSTANTS kind_table  TYPE c LENGTH 1 VALUE ''T''.
+    CONSTANTS kind_ref    TYPE c LENGTH 1 VALUE ''R''.
+    CONSTANTS kind_class  TYPE c LENGTH 1 VALUE ''C''.
+    CONSTANTS kind_intf   TYPE c LENGTH 1 VALUE ''I''.
+ 
+  PRIVATE SECTION.
+    CLASS-DATA gv_counter TYPE n LENGTH 10.
+ 
+    CLASS-METHODS
+      describe_by_dashes
+        IMPORTING p_name TYPE clike
+        RETURNING VALUE(type) TYPE REF TO cl_abap_typedescr.
+ENDCLASS.
+ 
+CLASS cl_abap_typedescr IMPLEMENTATION.
+ 
+  METHOD get_ddic_object.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD is_instantiatable.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD describe_by_dashes.
+    DATA lt_parts   TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+    DATA lv_part    LIKE LINE OF lt_parts.
+    DATA lo_current TYPE REF TO cl_abap_typedescr.
+    DATA lo_struct  TYPE REF TO cl_abap_structdescr.
+ 
+    SPLIT p_name AT ''-'' INTO TABLE lt_parts.
+ 
+    LOOP AT lt_parts INTO lv_part.
+      IF lo_current IS INITIAL.
+        lo_current = describe_by_name( lv_part ).
+      ELSEIF lo_current->kind = kind_struct.
+        lo_struct ?= lo_current.
+        lo_current = lo_struct->get_component_type( lv_part ).
+      ENDIF.
+    ENDLOOP.
+ 
+    type = lo_current.
+  ENDMETHOD.
+ 
+  METHOD describe_by_name.
+    DATA ref         TYPE REF TO data.
+    DATA objectdescr TYPE REF TO cl_abap_objectdescr.
+    DATA oo_type     TYPE string.
+    DATA lv_any      TYPE string.
+ 
+* note, p_name might be internal name, so check and skip these,
+    IF p_name CA ''-'' AND p_name NP ''CLAS-*'' AND p_name NP ''PROG-*''.
+      type = describe_by_dashes( p_name ).
+      RETURN.
+    ENDIF.
+ 
+    WRITE ''@KERNEL oo_type.set(abap.Classes[p_name.get().toUpperCase().trimEnd()]?.INTERNAL_TYPE || "");''.
+    WRITE ''@KERNEL lv_any = abap.Classes[p_name.get().toUpperCase().trimEnd()];''.
+ 
+    CASE oo_type.
+      WHEN ''INTF''.
+        CREATE OBJECT type TYPE cl_abap_intfdescr
+          EXPORTING
+            p_object = lv_any.
+        type->type_kind = typekind_intf.
+        type->kind = kind_intf.
+        type->relative_name = to_upper( p_name ).
+        type->absolute_name = ''\\CLASS='' && to_upper( p_name ).
+        objectdescr ?= type.
+        objectdescr->mv_object_name = to_upper( p_name ). " todo, this should give syntax error, as they are not friends
+        objectdescr->mv_object_type = oo_type. " todo, this should give syntax error, as they are not friends
+      WHEN ''CLAS''.
+        CREATE OBJECT type TYPE cl_abap_classdescr.
+        type->type_kind = typekind_class.
+        type->kind = kind_class.
+        type->relative_name = to_upper( p_name ).
+        IF p_name CP ''CLAS-*''.
+          type->absolute_name = kernel_internal_name=>internal_to_rtti( p_name ).
+        ELSE.
+          type->absolute_name = ''\\CLASS='' && to_upper( p_name ).
+        ENDIF.
+        objectdescr ?= type.
+        objectdescr->mv_object_name = to_upper( p_name ). " todo, this should give syntax error, as they are not friends
+        objectdescr->mv_object_type = oo_type. " todo, this should give syntax error, as they are not friends
+      WHEN OTHERS.
+        TRY.
+            CREATE DATA ref TYPE (p_name).
+          CATCH cx_sy_create_data_error.
+            RAISE type_not_found.
+        ENDTRY.
+        type = describe_by_data_ref( ref ).
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD get_relative_name.
+    name = relative_name.
+  ENDMETHOD.
+ 
+  METHOD get_ddic_header.
+    ASSERT 1 = 2.
+  ENDMETHOD.
+ 
+  METHOD is_ddic_type.
+    p_abap_bool = ddic.
+  ENDMETHOD.
+ 
+  METHOD describe_by_data_ref.
+    FIELD-SYMBOLS <ref> TYPE any.
+    ASSIGN p_data_ref->* TO <ref>.
+    type = describe_by_data( <ref> ).
+  ENDMETHOD.
+ 
+  METHOD describe_by_object_ref.
+    DATA lv_name   TYPE string.
+    DATA lo_cdescr TYPE REF TO cl_abap_classdescr.
+    DATA lv_any    TYPE string.
+ 
+    IF p_object_ref IS INITIAL.
+      RAISE reference_is_initial.
+    ENDIF.
+ 
+    WRITE ''@KERNEL lv_any = p_object_ref.get().constructor;''.
+ 
+    CREATE OBJECT lo_cdescr TYPE cl_abap_classdescr
+      EXPORTING
+        p_object = lv_any.
+    lo_cdescr->type_kind = typekind_class.
+    lo_cdescr->kind = kind_class.
+ 
+    WRITE ''@KERNEL lv_name.set(p_object_ref.get().constructor.name.toUpperCase());''.
+ 
+    lo_cdescr->relative_name = lv_name.
+    lo_cdescr->absolute_name = ''\\CLASS='' && lv_name.
+ 
+    p_descr_ref = lo_cdescr.
+  ENDMETHOD.
+ 
+  METHOD describe_by_data.
+ 
+    DATA lo_elem      TYPE REF TO cl_abap_elemdescr.
+    DATA lo_ref       TYPE REF TO cl_abap_refdescr.
+    DATA lv_any       TYPE string.
+    DATA lv_convexit  TYPE string.
+    DATA lv_ddicname  TYPE string.
+    DATA lv_decimals  TYPE i.
+    DATA lv_length    TYPE i.
+    DATA lv_name      TYPE string.
+    DATA lv_prefix    TYPE string.
+    DATA lv_qualified TYPE string.
+    DATA lv_rtti_name TYPE string.
+ 
+    WRITE ''@KERNEL lv_name.set(p_data.constructor.name);''.
+    WRITE ''@KERNEL lv_length.set(p_data.getLength ? p_data.getLength() : 0);''.
+    WRITE ''@KERNEL lv_decimals.set(p_data.getDecimals ? p_data.getDecimals() : 0);''.
+ 
+* These are the constructor names from the js runtime
+    CASE lv_name.
+      WHEN ''Integer''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_int.
+        type->kind = kind_elem.
+        type->length = 4.
+        lo_elem ?= type.
+        lo_elem->output_length = 11.
+        type->absolute_name = ''I''.
+      WHEN ''Integer8''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_int8.
+        type->kind = kind_elem.
+        type->length = 8.
+        lo_elem ?= type.
+        lo_elem->output_length = 20.
+        type->absolute_name = ''INT8''.
+      WHEN ''Numc''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_num.
+        type->kind = kind_elem.
+        type->length = lv_length * 2.
+        lo_elem ?= type.
+        lo_elem->output_length = lv_length.
+      WHEN ''Hex''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_hex.
+        type->kind = kind_elem.
+        type->length = lv_length.
+        lo_elem ?= type.
+        lo_elem->output_length = lv_length * 2.
+      WHEN ''Date''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_date.
+        type->kind = kind_elem.
+        type->length = 16.
+        lo_elem ?= type.
+        lo_elem->output_length = 8.
+        type->absolute_name = ''D''.
+      WHEN ''Packed''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_packed.
+        type->kind = kind_elem.
+        type->length = lv_length.
+        type->decimals = lv_decimals.
+      WHEN ''Time''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_time.
+        type->kind = kind_elem.
+        type->length = 12.
+        lo_elem ?= type.
+        lo_elem->output_length = 6.
+        type->absolute_name = ''T''.
+      WHEN ''Float''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_float.
+        type->kind = kind_elem.
+        type->absolute_name = ''F''.
+      WHEN ''DecFloat34''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_decfloat34.
+        type->kind = kind_elem.
+      WHEN ''Structure''.
+        type ?= cl_abap_structdescr=>construct_from_data( p_data ).
+        type->type_kind = typekind_struct2.
+        type->kind = kind_struct.
+      WHEN ''Table'' OR ''HashedTable''.
+        type ?= cl_abap_tabledescr=>construct_from_data( p_data ).
+        type->type_kind = typekind_table.
+        type->kind = kind_table.
+        type->length = 8. " yea, well, because it is. Pointer size?
+      WHEN ''XString''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_xstring.
+        type->kind = kind_elem.
+        type->length = 8.
+        type->absolute_name = ''XSTRING''.
+      WHEN ''String''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_string.
+        type->kind = kind_elem.
+        type->length = 8.
+        type->absolute_name = ''STRING''.
+      WHEN ''Character''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_char.
+        type->kind = kind_elem.
+        type->length = lv_length * 2.
+        lo_elem ?= type.
+        lo_elem->output_length = lv_length.
+      WHEN ''FieldSymbol''.
+        WRITE ''@KERNEL lv_name = p_data.getPointer();''.
+        type = describe_by_data( lv_name ).
+        RETURN.
+      WHEN ''ABAPObject''.
+        CREATE OBJECT type TYPE cl_abap_refdescr.
+        type->type_kind = typekind_oref.
+        type->kind = kind_ref.
+ 
+        lo_ref ?= type.
+        IF p_data IS INITIAL.
+* note: using the name doesnt work for local classes
+          WRITE ''@KERNEL lv_rtti_name.set(p_data.RTTIName || "");''.
+          IF lv_rtti_name CP ''\\CLASS-POOL=*''.
+* convert to internal name,
+            lv_rtti_name = kernel_internal_name=>rtti_to_internal( lv_rtti_name ).
+            lo_ref->referenced = describe_by_name( lv_rtti_name ).
+          ELSE.
+            WRITE ''@KERNEL lv_name.set(p_data.qualifiedName || "");''.
+            lo_ref->referenced = describe_by_name( lv_name ).
+          ENDIF.
+        ELSE.
+          lo_ref->referenced = describe_by_object_ref( p_data ).
+        ENDIF.
+      WHEN ''UTCLong''.
+        CREATE OBJECT type TYPE cl_abap_elemdescr.
+        type->type_kind = typekind_utclong.
+        type->kind = kind_elem.
+      WHEN ''DataReference''.
+        CREATE OBJECT type TYPE cl_abap_refdescr.
+        type->type_kind = typekind_dref.
+        type->kind = kind_ref.
+ 
+        lo_ref ?= type.
+        WRITE ''@KERNEL lv_any = p_data.type;''.
+        lo_ref->referenced = describe_by_data( lv_any ).
+      WHEN OTHERS.
+        WRITE / lv_name.
+        ASSERT 1 = ''todo_cl_abap_typedescr''.
+    ENDCASE.
+ 
+*    WRITE ''@KERNEL console.dir(p_data);''.
+ 
+    WRITE ''@KERNEL lv_ddicname.set(p_data.getDDICName ? p_data.getDDICName() || "" : "");''.
+    WRITE ''@KERNEL lv_convexit.set(p_data.getConversionExit ? p_data.getConversionExit() || "" : "");''.
+    WRITE ''@KERNEL lv_qualified.set(p_data.getQualifiedName ? p_data.getQualifiedName() || "" : "");''.
+ 
+    IF lv_qualified NA ''-''.
+      type->absolute_name = lv_qualified.
+    ELSEIF lv_ddicname <> ''''.
+      type->absolute_name = lv_ddicname.
+    ENDIF.
+ 
+* this is not completely correct, local type names and ddic names might overlap, but will work for now,
+* todo: use/check getDDICName() in the future,
+    WRITE ''@KERNEL if(abap.DDIC[type.get().absolute_name.get().toUpperCase()]) { type.get().ddic.set("X"); }''.
+ 
+    TRANSLATE type->absolute_name TO UPPER CASE.
+    TRANSLATE type->relative_name TO UPPER CASE.
+ 
+    IF type->absolute_name = ''ABAP_BOOL''.
+      type->relative_name = ''ABAP_BOOL''.
+      type->absolute_name = ''\\TYPE-POOL=ABAP\\TYPE=ABAP_BOOL''.
+    ELSEIF type->absolute_name IS INITIAL.
+      gv_counter = gv_counter + 1.
+      type->absolute_name = ''\\TYPE=%_T000000000000000'' && gv_counter.
+    ELSEIF type->absolute_name CS ''=>''.
+      SPLIT type->absolute_name AT ''=>'' INTO lv_prefix type->absolute_name.
+      type->relative_name = type->absolute_name.
+      type->absolute_name = ''\\CLASS='' && lv_prefix && ''\\TYPE='' && type->absolute_name.
+    ELSEIF type->type_kind = typekind_oref.
+      type->relative_name = type->absolute_name.
+      type->absolute_name = ''\\CLASS='' && type->absolute_name.
+    ELSE.
+      type->relative_name = type->absolute_name.
+      type->absolute_name = ''\\TYPE='' && type->absolute_name.
+    ENDIF.
+ 
+    IF lv_convexit <> ''''.
+      lo_elem->edit_mask = ''=='' && lv_convexit.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SHM_AREA                             ', 'CLASS cl_shm_area DEFINITION PUBLIC INHERITING FROM cx_shm_general_error ABSTRACT.
+  PUBLIC SECTION.
+    CONSTANTS default_instance TYPE shm_inst_name VALUE ''$DEFAULT_INSTANCE$''.
+    CONSTANTS invocation_mode_explicit TYPE shm_constr_invocation_mode VALUE 319200300.
+    CONSTANTS life_context_appserver TYPE shm_life_context VALUE 109200001.
+    CONSTANTS attach_mode_default TYPE shm_attach_mode VALUE 1302197000.
+    CONSTANTS attach_mode_wait TYPE shm_attach_mode VALUE 1302197002.
+    CONSTANTS affect_local_server TYPE shm_affect_server VALUE 281119720.
+ 
+    DATA properties TYPE shm_properties READ-ONLY.
+    DATA inst_name  TYPE shm_inst_name READ-ONLY.
+    DATA client     TYPE mandt READ-ONLY.
+ 
+    METHODS detach_commit
+      RAISING
+        cx_shm_wrong_handle
+        cx_shm_already_detached
+        cx_shm_secondary_commit
+        cx_shm_event_execution_failed
+        cx_shm_completion_error.
+ 
+    METHODS detach
+      RAISING
+        cx_shm_wrong_handle
+        cx_shm_already_detached.
+ 
+    METHODS get_root ABSTRACT
+      RETURNING
+        VALUE(root) TYPE REF TO object
+      RAISING
+        cx_shm_already_detached.
+ 
+    METHODS is_valid
+      RETURNING
+        VALUE(valid) TYPE abap_bool.
+ 
+  PROTECTED SECTION.
+    DATA inst_trace_active TYPE abap_bool VALUE abap_false.
+    DATA inst_trace_service TYPE REF TO if_shm_trace.
+    DATA _lock TYPE %_c_pointer.
+    CONSTANTS attach_mode_wait_2nd_try TYPE shm_attach_mode VALUE 1302197003.
+ 
+    METHODS _attach_read71
+      IMPORTING
+        sneak_mode   TYPE abap_bool DEFAULT abap_false
+        area_name    TYPE shm_area_name
+        life_context TYPE shm_life_context
+      EXPORTING
+        root         TYPE REF TO object
+      RAISING
+        cx_shm_inconsistent
+        cx_shm_no_active_version
+        cx_shm_read_lock_active
+        cx_shm_exclusive_lock_active
+        cx_shm_parameter_error
+        cx_shm_change_lock_active.
+ 
+    METHODS _attach_update70
+      IMPORTING
+        area_name TYPE shm_area_name
+        mode      TYPE shm_attach_mode
+      EXPORTING
+        root      TYPE REF TO object
+      CHANGING
+        wait_time TYPE i OPTIONAL
+      RAISING
+        cx_shm_inconsistent
+        cx_shm_exclusive_lock_active
+        cx_shm_change_lock_active
+        cx_shm_version_limit_exceeded
+        cx_shm_no_active_version
+        cx_shm_parameter_error
+        cx_shm_pending_lock_removed.
+ 
+    METHODS _attach_write70
+      IMPORTING
+        area_name TYPE shm_area_name
+        mode      TYPE shm_attach_mode
+      EXPORTING
+        root      TYPE REF TO object
+      CHANGING
+        wait_time TYPE i OPTIONAL
+      RAISING
+        cx_shm_version_limit_exceeded
+        cx_shm_exclusive_lock_active
+        cx_shm_change_lock_active
+        cx_shm_parameter_error
+        cx_shm_pending_lock_removed.
+ 
+    CLASS-METHODS _invalidate_area71
+      IMPORTING
+        area_name TYPE shm_area_name
+        client TYPE shm_client
+        client_supplied TYPE abap_bool DEFAULT abap_false
+        transactional TYPE abap_bool DEFAULT abap_false
+        client_dependent TYPE abap_bool DEFAULT abap_false
+        terminate_changer TYPE abap_bool
+        affect_server TYPE shm_affect_server
+        life_context TYPE shm_life_context DEFAULT life_context_appserver
+      RETURNING
+        VALUE(rc) TYPE shm_rc
+      RAISING
+        cx_shm_parameter_error.
+ 
+    CLASS-METHODS _invalidate_instance71
+      IMPORTING
+        area_name TYPE shm_area_name
+        inst_name TYPE shm_inst_name
+        client TYPE shm_client
+        client_supplied TYPE abap_bool DEFAULT abap_false
+        transactional TYPE abap_bool DEFAULT abap_false
+        client_dependent TYPE abap_bool DEFAULT abap_false
+        terminate_changer TYPE abap_bool
+        affect_server TYPE shm_affect_server
+        life_context TYPE shm_life_context DEFAULT life_context_appserver
+      RETURNING
+        VALUE(rc) TYPE shm_rc
+      RAISING
+        cx_shm_parameter_error.
+ 
+    METHODS _set_root
+      IMPORTING
+        root TYPE REF TO object
+      RAISING
+        cx_shm_wrong_handle
+        cx_shm_initial_reference.
+ 
+    CLASS-METHODS _detach_area71
+      IMPORTING
+        area_name        TYPE shm_area_name
+        client           TYPE shm_client
+        client_supplied  TYPE abap_bool
+        client_dependent TYPE abap_bool DEFAULT abap_false
+        life_context     TYPE shm_life_context
+      RETURNING
+        VALUE(rc)        TYPE shm_rc.
+ 
+    CLASS-METHODS _free_area71
+      IMPORTING
+        area_name TYPE shm_area_name
+        client TYPE shm_client
+        client_supplied TYPE abap_bool DEFAULT abap_false
+        transactional TYPE abap_bool DEFAULT abap_false
+        client_dependent TYPE abap_bool DEFAULT abap_false
+        terminate_changer TYPE abap_bool
+        affect_server TYPE shm_affect_server
+        life_context TYPE shm_life_context DEFAULT life_context_appserver
+      RETURNING
+        VALUE(rc) TYPE shm_rc
+      RAISING
+        cx_shm_parameter_error.
+ 
+    CLASS-METHODS _get_instance_infos71
+      IMPORTING
+        area_name        TYPE shm_area_name
+        client           TYPE shm_client
+        client_supplied  TYPE abap_bool DEFAULT abap_false
+        client_dependent TYPE abap_bool DEFAULT abap_false
+        life_context     TYPE shm_life_context
+      RETURNING
+        VALUE(infos)     TYPE shm_inst_infos.
+ 
+    CLASS-METHODS _free_instance71
+      IMPORTING
+        area_name         TYPE shm_area_name
+        inst_name         TYPE shm_inst_name
+        client            TYPE shm_client
+        client_supplied   TYPE abap_bool DEFAULT abap_false
+        transactional     TYPE abap_bool DEFAULT abap_false
+        client_dependent  TYPE abap_bool DEFAULT abap_false
+        terminate_changer TYPE abap_bool
+        affect_server     TYPE shm_affect_server
+        life_context      TYPE shm_life_context DEFAULT life_context_appserver
+      RETURNING
+        VALUE(rc)         TYPE shm_rc
+      RAISING
+        cx_shm_parameter_error.
+  PRIVATE SECTION.
+    CLASS-DATA mo_root TYPE REF TO object.
+ENDCLASS.
+ 
+CLASS cl_shm_area IMPLEMENTATION.
+ 
+  METHOD is_valid.
+    valid = abap_true.
+  ENDMETHOD.
+ 
+  METHOD _free_instance71.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD detach_commit.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD detach.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD _attach_read71.
+    DATA created TYPE REF TO object.
+    DATA lv_name TYPE string.
+ 
+    IF sneak_mode = abap_false AND mo_root IS INITIAL.
+      lv_name = area_name.
+* todo, this is an evil workaround
+      REPLACE FIRST OCCURRENCE OF ''_AREA'' IN lv_name WITH ''_ROOT''.
+      CREATE OBJECT created TYPE (lv_name).
+ 
+      _set_root( created ).
+    ENDIF.
+ 
+    root = mo_root.
+  ENDMETHOD.
+ 
+  METHOD _get_instance_infos71.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD _detach_area71.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD _free_area71.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD _set_root.
+    mo_root = root.
+  ENDMETHOD.
+ 
+  METHOD _invalidate_instance71.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD _invalidate_area71.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD _attach_update70.
+    DATA created TYPE REF TO object.
+    DATA lv_name TYPE string.
+ 
+    IF mo_root IS INITIAL.
+* todo, this should respect the auto build flag configuration from the SHMA area
+* todo, this is an evil workaround
+      REPLACE FIRST OCCURRENCE OF ''_AREA'' IN lv_name WITH ''_ROOT''.
+      CREATE OBJECT created TYPE (lv_name).
+ 
+      _set_root( created ).
+    ENDIF.
+* open-abap is currently single threaded, so no lock conflicts
+    root = mo_root.
+  ENDMETHOD.
+ 
+  METHOD _attach_write70.
+* open-abap is currently single threaded, so no lock conflicts
+    RETURN.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SHM_SERVICE                          ', 'CLASS cl_shm_service DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS initialize
+      IMPORTING
+        area_name  TYPE shm_area_name
+        client     TYPE shma_client OPTIONAL
+      EXPORTING
+        attributes TYPE shma_attributes.
+ 
+    CLASS-METHODS get_auto_build_class_name
+      IMPORTING
+        area_name TYPE shm_area_name
+      RETURNING
+        VALUE(auto_build_class_name) TYPE shm_auto_build_class_name
+      RAISING
+        cx_shma_not_configured
+        cx_shma_inconsistent.
+ 
+    CLASS-METHODS trace_get_service
+      IMPORTING
+        !area_name TYPE shm_area_name OPTIONAL
+      RETURNING
+        VALUE(trace_service) TYPE REF TO if_shm_trace.
+ 
+    CLASS-METHODS trace_is_variant_active
+      IMPORTING
+        service_name     TYPE shmm_trc_variant_name
+      RETURNING
+        VALUE(is_active) TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+CLASS cl_shm_service IMPLEMENTATION.
+ 
+  METHOD initialize.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD get_auto_build_class_name.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD trace_get_service.
+* dont dump, this method is called from area CLASS_CONSTRUCTORs
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD trace_is_variant_active.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_ALREADY_DETACHED                 ', 'CLASS cx_shm_already_detached DEFINITION PUBLIC INHERITING FROM cx_shm_general_error.
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        textid    LIKE textid OPTIONAL
+        previous  LIKE previous OPTIONAL
+        area_name TYPE string OPTIONAL
+        inst_name TYPE string OPTIONAL
+        client    TYPE string OPTIONAL.
+ENDCLASS.
+ 
+CLASS cx_shm_already_detached IMPLEMENTATION.
+ 
+  METHOD constructor.
+    RETURN.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_ATTACH_ERROR                     ', 'CLASS cx_shm_attach_error DEFINITION PUBLIC INHERITING FROM cx_shm_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_attach_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_BUILD_FAILED                     ', 'CLASS cx_shm_build_failed DEFINITION PUBLIC INHERITING FROM cx_shm_general_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_build_failed IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_CHANGE_LOCK_ACTIVE               ', 'CLASS cx_shm_change_lock_active DEFINITION PUBLIC INHERITING FROM cx_shm_attach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_change_lock_active IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_COMPLETION_ERROR                 ', 'CLASS cx_shm_completion_error DEFINITION PUBLIC INHERITING FROM cx_shm_detach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_completion_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_DETACH_ERROR                     ', 'CLASS cx_shm_detach_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_detach_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_ERROR                            ', 'CLASS cx_shm_error DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_EVENT_EXECUTION_FAILED           ', 'CLASS cx_shm_event_execution_failed DEFINITION PUBLIC INHERITING FROM cx_shm_completion_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_event_execution_failed IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_EXCLUSIVE_LOCK_ACTIVE            ', 'CLASS cx_shm_exclusive_lock_active DEFINITION PUBLIC INHERITING FROM cx_shm_attach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_exclusive_lock_active IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_GENERAL_ERROR                    ', 'CLASS cx_shm_general_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_general_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_INCONSISTENT                     ', 'CLASS cx_shm_inconsistent DEFINITION PUBLIC INHERITING FROM cx_shm_attach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_inconsistent IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_INITIAL_REFERENCE                ', 'CLASS cx_shm_initial_reference DEFINITION PUBLIC INHERITING FROM cx_shm_general_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_initial_reference IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_NO_ACTIVE_VERSION                ', 'CLASS cx_shm_no_active_version DEFINITION PUBLIC INHERITING FROM cx_shm_attach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_no_active_version IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_PARAMETER_ERROR                  ', 'CLASS cx_shm_parameter_error DEFINITION PUBLIC INHERITING FROM cx_shm_general_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_parameter_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_PENDING_LOCK_REMOVED             ', 'CLASS cx_shm_pending_lock_removed DEFINITION PUBLIC INHERITING FROM cx_shm_attach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_pending_lock_removed IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_READ_LOCK_ACTIVE                 ', 'CLASS cx_shm_read_lock_active DEFINITION PUBLIC INHERITING FROM cx_shm_attach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_read_lock_active IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_SECONDARY_COMMIT                 ', 'CLASS cx_shm_secondary_commit DEFINITION PUBLIC INHERITING FROM cx_shm_detach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_secondary_commit IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_VERSION_LIMIT_EXCEEDED           ', 'CLASS cx_shm_version_limit_exceeded DEFINITION PUBLIC INHERITING FROM cx_shm_attach_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_version_limit_exceeded IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHM_WRONG_HANDLE                     ', 'CLASS cx_shm_wrong_handle DEFINITION PUBLIC INHERITING FROM cx_shm_general_error.
+ 
+ENDCLASS.
+ 
+CLASS cx_shm_wrong_handle IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHMA_DYNAMIC                         ', 'CLASS cx_shma_dynamic DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_shma_dynamic IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHMA_INCONSISTENT                    ', 'CLASS cx_shma_inconsistent DEFINITION PUBLIC INHERITING FROM cx_shma_dynamic.
+ 
+ENDCLASS.
+ 
+CLASS cx_shma_inconsistent IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SHMA_NOT_CONFIGURED                  ', 'CLASS cx_shma_not_configured DEFINITION PUBLIC INHERITING FROM cx_shma_dynamic.
+ 
+ENDCLASS.
+ 
+CLASS cx_shma_not_configured IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SHM_BUILD_INSTANCE                   ', 'INTERFACE if_shm_build_instance PUBLIC.
+  CLASS-METHODS build
+    IMPORTING
+      inst_name       TYPE shm_inst_name              DEFAULT cl_shm_area=>default_instance
+      invocation_mode TYPE shm_constr_invocation_mode DEFAULT cl_shm_area=>invocation_mode_explicit
+    RAISING
+      cx_shm_build_failed.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SHM_TRACE                            ', 'INTERFACE if_shm_trace PUBLIC.
+ 
+  DATA: BEGIN OF variant,
+          def_name         TYPE shmm_trc_variant_name,
+          attach_for_upd   TYPE abap_bool,
+          attach_for_read  TYPE abap_bool,
+          free_area        TYPE abap_bool,
+          detach_area      TYPE abap_bool,
+          set_root         TYPE abap_bool,
+          invalidate_inst  TYPE abap_bool,
+          get_instance_inf TYPE abap_bool,
+          free_instance    TYPE abap_bool,
+          invalidate_area  TYPE abap_bool,
+          build            TYPE abap_bool,
+          attach_for_write TYPE abap_bool,
+          get_root         TYPE abap_bool,
+        END OF variant.
+ 
+  METHODS trin_attach_for_write
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      client    TYPE shm_client DEFAULT sy-mandt
+      mode      TYPE shm_attach_mode DEFAULT cl_shm_area=>attach_mode_default
+      wait_time TYPE i DEFAULT 0.
+ 
+  METHODS trcx_attach_for_write
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      client    TYPE shm_client DEFAULT sy-mandt
+      mode      TYPE shm_attach_mode DEFAULT cl_shm_area=>attach_mode_default
+      wait_time TYPE i DEFAULT 0
+      cx        TYPE REF TO cx_root.
+ 
+  METHODS trin_attach_for_update
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      client    TYPE shm_client DEFAULT sy-mandt
+      mode      TYPE shm_attach_mode DEFAULT cl_shm_area=>attach_mode_default
+      wait_time TYPE i DEFAULT 0.
+ 
+  METHODS trcx_attach_for_update
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      client    TYPE shm_client DEFAULT sy-mandt
+      mode      TYPE shm_attach_mode DEFAULT cl_shm_area=>attach_mode_default
+      wait_time TYPE i DEFAULT 0
+      cx        TYPE REF TO cx_root.
+ 
+  METHODS trin_attach_for_read
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      client    TYPE shm_client DEFAULT sy-mandt.
+ 
+  METHODS trcx_attach_for_read
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      client    TYPE shm_client DEFAULT sy-mandt
+      cx        TYPE REF TO cx_root.
+ 
+  METHODS trin_build
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance.
+ 
+  METHODS trcx_build
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      cx TYPE REF TO cx_root.
+ 
+  METHODS trin_set_root
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name
+      root TYPE REF TO object.
+ 
+  METHODS trcx_set_root
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name
+      root TYPE REF TO object
+      cx TYPE REF TO cx_root.
+ 
+  METHODS trin_detach_area
+    IMPORTING
+      area_name TYPE shm_area_name
+      client TYPE shm_client DEFAULT sy-mandt
+      rc TYPE shm_rc.
+ 
+  METHODS trin_free_area
+    IMPORTING
+      area_name         TYPE shm_area_name
+      client            TYPE shm_client DEFAULT sy-mandt
+      terminate_changer TYPE abap_bool DEFAULT abap_true
+      affect_server     TYPE shm_affect_server OPTIONAL
+      rc                TYPE shm_rc.
+ 
+  METHODS trin_free_instance
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      client TYPE shm_client DEFAULT sy-mandt
+      terminate_changer TYPE abap_bool DEFAULT abap_true
+      affect_server TYPE shm_affect_server OPTIONAL
+      rc TYPE shm_rc.
+ 
+  METHODS trin_get_instance_infos
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name OPTIONAL
+      client TYPE shm_client DEFAULT sy-mandt
+      infos TYPE shm_inst_infos.
+ 
+  METHODS trin_invalidate_area
+    IMPORTING
+      area_name TYPE shm_area_name
+      client TYPE shm_client DEFAULT sy-mandt
+      rc TYPE shm_rc
+      affect_server TYPE shm_affect_server OPTIONAL
+      terminate_changer TYPE abap_bool DEFAULT abap_true.
+ 
+  METHODS trin_invalidate_instance
+    IMPORTING
+      area_name TYPE shm_area_name
+      inst_name TYPE shm_inst_name DEFAULT cl_shm_area=>default_instance
+      client TYPE shm_client DEFAULT sy-mandt
+      terminate_changer TYPE abap_bool DEFAULT abap_true
+      affect_server TYPE shm_affect_server OPTIONAL
+      rc TYPE shm_rc.
+ 
+  METHODS trin_get_root
+    IMPORTING
+      area_name TYPE shm_area_name.
+ 
+  METHODS trcx_get_root
+    IMPORTING
+      area_name TYPE shm_area_name
+      cx        TYPE REF TO cx_root.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_MIME_REPOSITORY_API                  ', 'CLASS cl_mime_repository_api DEFINITION PUBLIC FINAL CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+    INTERFACES if_mr_api.
+    ALIASES get_api FOR if_mr_api~get_api.
+ENDCLASS.
+ 
+CLASS cl_mime_repository_api IMPLEMENTATION.
+  METHOD if_mr_api~get_api.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_mr_api~get.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_mr_api~create_folder.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_mr_api~put.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_mr_api~delete.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_mr_api~file_list.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_mr_api~properties.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD if_mr_api~get_io_for_url.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_MR_API                               ', 'INTERFACE if_mr_api PUBLIC.
+ 
+  CLASS-METHODS get_api
+    IMPORTING
+      i_prefix        TYPE csequence DEFAULT space
+    RETURNING
+      VALUE(r_mr_api) TYPE REF TO if_mr_api.
+ 
+  METHODS get
+    IMPORTING
+      i_url             TYPE csequence
+      i_check_authority TYPE abap_bool DEFAULT abap_true
+    EXPORTING
+      e_is_folder       TYPE abap_bool
+      e_content         TYPE xstring
+      e_mime_type       TYPE csequence
+      e_loio            TYPE skwf_io
+    CHANGING
+      c_language        TYPE langu OPTIONAL
+    EXCEPTIONS
+      parameter_missing
+      error_occured
+      not_found
+      permission_failure.
+ 
+  METHODS create_folder
+    IMPORTING
+      i_url                     TYPE csequence
+      i_language                TYPE langu DEFAULT sy-langu
+      i_description             TYPE csequence OPTIONAL
+      i_check_authority         TYPE abap_bool DEFAULT abap_true
+      i_suppress_package_dialog TYPE abap_bool DEFAULT space
+      i_dev_package             TYPE devclass OPTIONAL
+      i_genflag                 TYPE abap_bool DEFAULT abap_false
+      i_corr_number             TYPE trkorr OPTIONAL
+      i_folder_loio             TYPE skwf_io OPTIONAL
+      i_suppress_dialogs        TYPE abap_bool OPTIONAL
+    EXPORTING
+      e_folder_io               TYPE skwf_io
+    EXCEPTIONS
+      parameter_missing
+      error_occured
+      cancelled
+      permission_failure
+      folder_exists.
+ 
+  METHODS put
+    IMPORTING
+      i_url                     TYPE csequence
+      i_content                 TYPE xstring
+      i_language                TYPE langu DEFAULT sy-langu
+      i_description             TYPE csequence OPTIONAL
+      i_check_authority         TYPE abap_bool DEFAULT abap_true
+      i_suppress_package_dialog TYPE abap_bool DEFAULT space
+      i_dev_package             TYPE devclass OPTIONAL
+      i_genflag                 TYPE abap_bool DEFAULT abap_false
+      i_corr_number             TYPE trkorr OPTIONAL
+      i_new_loio                TYPE skwf_io OPTIONAL
+      i_suppress_dialogs        TYPE abap_bool OPTIONAL
+    EXCEPTIONS
+      parameter_missing
+      error_occured
+      cancelled
+      permission_failure
+      data_inconsistency
+      new_loio_already_exists
+      is_folder.
+ 
+  METHODS delete
+    IMPORTING
+      i_url              TYPE csequence
+      i_delete_children  TYPE abap_bool DEFAULT abap_false
+      i_check_authority  TYPE abap_bool DEFAULT abap_true
+      i_corr_number      TYPE trkorr OPTIONAL
+      i_suppress_dialogs TYPE abap_bool OPTIONAL
+    EXCEPTIONS
+      parameter_missing
+      error_occured
+      cancelled
+      permission_failure
+      not_found.
+ 
+  METHODS file_list
+    IMPORTING
+      i_url             TYPE csequence
+      i_recursive_call  TYPE abap_bool DEFAULT abap_false
+      i_check_authority TYPE abap_bool DEFAULT abap_true
+    EXPORTING
+      e_files           TYPE string_table
+    EXCEPTIONS
+      parameter_missing
+      error_occured
+      not_found
+      permission_failure
+      is_not_folder.
+ 
+  METHODS properties
+    IMPORTING
+      i_url               TYPE csequence
+      i_check_authority   TYPE abap_bool DEFAULT abap_true
+    EXPORTING
+      e_is_folder         TYPE abap_bool
+      e_mime_type         TYPE csequence
+      e_name              TYPE string
+      e_size              TYPE i
+      e_bin_data          TYPE abap_bool
+      e_loio              TYPE skwf_io
+      e_phio              TYPE skwf_io
+      e_language          TYPE langu
+      e_phio_last_changed TYPE string " wrong, delete parameter?
+    EXCEPTIONS
+      parameter_missing
+      error_occured
+      not_found
+      permission_failure.
+ 
+  METHODS get_io_for_url
+    IMPORTING
+      i_url       TYPE csequence
+    EXPORTING
+      e_is_folder TYPE abap_bool
+      e_loio      TYPE skwf_io
+    EXCEPTIONS
+      parameter_missing
+      error_occured
+      not_found.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SXML_STRING_READER                   ', 'CLASS cl_sxml_string_reader DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS create
+      IMPORTING data TYPE xstring
+      RETURNING VALUE(reader) TYPE REF TO if_sxml_reader.
+ENDCLASS.
+ 
+CLASS cl_sxml_string_reader IMPLEMENTATION.
+  METHOD create.
+    CREATE OBJECT reader TYPE lcl_reader
+      EXPORTING
+        iv_json = cl_abap_codepage=>convert_from( data ).
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SXML_STRING_WRITER                   ', 'CLASS cl_sxml_string_writer DEFINITION PUBLIC FINAL CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+    INTERFACES if_sxml_writer.
+ 
+    METHODS constructor
+      IMPORTING
+        type TYPE if_sxml=>xml_stream_type.
+ 
+    METHODS get_output
+      RETURNING
+        VALUE(output) TYPE xstring.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        type                     TYPE if_sxml=>xml_stream_type DEFAULT if_sxml=>co_xt_xml10
+        ignore_conversion_errors TYPE abap_bool DEFAULT abap_false
+        normalizing              TYPE abap_bool DEFAULT abap_false
+        no_empty_elements        TYPE abap_bool DEFAULT abap_false
+        encoding                 TYPE string DEFAULT ''UTF-8''
+        PREFERRED PARAMETER type
+      RETURNING
+        VALUE(writer)            TYPE REF TO cl_sxml_string_writer
+      RAISING
+        cx_sxml_illegal_argument_error.
+ 
+  PRIVATE SECTION.
+    DATA mv_output TYPE xstring.
+    DATA mv_type TYPE if_sxml=>xml_stream_type.
+    DATA mt_stack TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+ 
+    METHODS append_text IMPORTING text TYPE string.
+    METHODS get_text RETURNING VALUE(text) TYPE string.
+ 
+* stack operations
+    METHODS peek RETURNING VALUE(rv_name) TYPE string.
+    METHODS remove RETURNING VALUE(rv_name) TYPE string.
+ENDCLASS.
+ 
+CLASS cl_sxml_string_writer IMPLEMENTATION.
+ 
+  METHOD constructor.
+    mv_type = type.
+  ENDMETHOD.
+ 
+  METHOD create.
+    CREATE OBJECT writer
+      EXPORTING
+        type = type.
+  ENDMETHOD.
+ 
+  METHOD if_sxml_writer~set_option.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD get_output.
+    output = mv_output.
+  ENDMETHOD.
+ 
+  METHOD append_text.
+    DATA append TYPE xstring.
+    append = cl_abap_conv_codepage=>create_out( )->convert( text ).
+    CONCATENATE mv_output append INTO mv_output IN BYTE MODE.
+  ENDMETHOD.
+ 
+  METHOD get_text.
+    text = cl_abap_conv_codepage=>create_in( )->convert( mv_output ).
+  ENDMETHOD.
+ 
+  METHOD if_sxml_writer~open_element.
+    DATA parent TYPE string.
+    parent = peek( ).
+ 
+    IF parent = ''array'' AND get_text( ) NP ''*[''.
+      append_text( '','' ).
+    ENDIF.
+    IF parent = ''object'' AND get_text( ) NP ''*{''.
+      append_text( '','' ).
+    ENDIF.
+ 
+    APPEND name TO mt_stack.
+    CASE name.
+      WHEN ''object''.
+        append_text( ''{'' ).
+      WHEN ''array''.
+        append_text( ''['' ).
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD remove.
+    DATA index TYPE i.
+    index = lines( mt_stack ).
+    READ TABLE mt_stack INDEX index INTO rv_name.
+    DELETE mt_stack INDEX index.
+  ENDMETHOD.
+ 
+  METHOD if_sxml_writer~close_element.
+    DATA name TYPE string.
+    name = remove( ).
+    CASE name.
+      WHEN ''object''.
+        append_text( ''}'' ).
+      WHEN ''array''.
+        append_text( '']'' ).
+    ENDCASE.
+  ENDMETHOD.
+ 
+  METHOD if_sxml_writer~write_attribute.
+    append_text( ''"'' ).
+    append_text( value ).
+    append_text( ''":'' ).
+  ENDMETHOD.
+ 
+  METHOD peek.
+    DATA index TYPE i.
+    index = lines( mt_stack ).
+    READ TABLE mt_stack INDEX index INTO rv_name.
+  ENDMETHOD.
+ 
+  METHOD if_sxml_writer~write_value.
+    DATA name TYPE string.
+    name = peek( ).
+    CASE name.
+      WHEN ''str''.
+        append_text( ''"'' ).
+        append_text( condense( value ) ).
+        append_text( ''"'' ).
+      WHEN ''num''.
+        append_text( condense( value ) ).
+      WHEN OTHERS.
+        WRITE ''@KERNEL console.dir(name);''.
+        ASSERT 1 = ''todo_if_sxml_writer_write_value''.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SXML_ERROR                           ', 'CLASS cx_sxml_error DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_sxml_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SXML_ILLEGAL_ARGUMENT_ERROR          ', 'CLASS cx_sxml_illegal_argument_error DEFINITION PUBLIC INHERITING FROM cx_sxml_error.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS cx_sxml_illegal_argument_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SXML_NAME_ERROR                      ', 'CLASS cx_sxml_name_error DEFINITION PUBLIC INHERITING FROM cx_sxml_error.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS cx_sxml_name_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SXML_PARSE_ERROR                     ', 'CLASS cx_sxml_parse_error DEFINITION PUBLIC INHERITING FROM cx_sxml_error.
+  PUBLIC SECTION.
+    METHODS constructor IMPORTING xml_offset TYPE i.
+    DATA xml_offset TYPE i.
+ENDCLASS.
+ 
+CLASS cx_sxml_parse_error IMPLEMENTATION.
+  METHOD constructor.
+    super->constructor( ).
+    me->xml_offset = xml_offset.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_SXML_STATE_ERROR                     ', 'CLASS cx_sxml_state_error DEFINITION PUBLIC INHERITING FROM cx_sxml_error.
+  PUBLIC SECTION.
+ENDCLASS.
+ 
+CLASS cx_sxml_state_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML                                 ', 'INTERFACE if_sxml PUBLIC.
+ 
+  TYPES xml_stream_type TYPE i.
+ 
+  CONSTANTS co_xt_xml10 TYPE xml_stream_type VALUE 1.
+  CONSTANTS co_xt_binary TYPE xml_stream_type VALUE 2.
+  CONSTANTS co_xt_xop TYPE xml_stream_type VALUE 3.
+  CONSTANTS co_xt_json TYPE xml_stream_type VALUE 4.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML_ATTRIBUTE                       ', 'INTERFACE if_sxml_attribute PUBLIC.
+  TYPES attributes TYPE STANDARD TABLE OF REF TO if_sxml_attribute WITH DEFAULT KEY.
+  DATA: BEGIN OF qname,
+          name TYPE string,
+        END OF qname.
+  DATA value_type TYPE if_sxml_value=>value_type.
+  METHODS get_value RETURNING VALUE(value) TYPE string.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML_CLOSE_ELEMENT                   ', 'INTERFACE if_sxml_close_element PUBLIC.
+  INTERFACES if_sxml_node.
+ 
+  DATA: BEGIN OF qname,
+          name TYPE string,
+        END OF qname.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML_NODE                            ', 'INTERFACE if_sxml_node PUBLIC.
+  TYPES node_type TYPE i.
+  DATA type TYPE node_type.
+ 
+  CONSTANTS co_nt_element_open TYPE node_type VALUE 1.
+  CONSTANTS co_nt_element_close TYPE node_type VALUE 2.
+  CONSTANTS co_nt_value TYPE node_type VALUE 4.
+  CONSTANTS co_nt_attribute TYPE node_type VALUE 32.
+  CONSTANTS co_nt_final TYPE node_type VALUE 128.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML_OPEN_ELEMENT                    ', 'INTERFACE if_sxml_open_element PUBLIC.
+  INTERFACES if_sxml_node.
+ 
+  DATA: BEGIN OF qname,
+          name TYPE string,
+        END OF qname.
+ 
+  METHODS get_attributes
+    RETURNING
+      VALUE(attr) TYPE if_sxml_attribute=>attributes.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML_READER                          ', 'INTERFACE if_sxml_reader PUBLIC.
+  DATA node_type TYPE if_sxml_node=>node_type READ-ONLY.
+  DATA name TYPE string READ-ONLY.
+  DATA value TYPE string READ-ONLY.
+ 
+  METHODS
+    read_next_node
+      RETURNING VALUE(node) TYPE REF TO if_sxml_node.
+ 
+  METHODS
+    next_node
+      IMPORTING
+        value_type TYPE if_sxml_value=>value_type DEFAULT if_sxml_value=>co_vt_text
+      RAISING
+        cx_sxml_parse_error.
+ 
+  METHODS next_attribute
+    IMPORTING
+      value_type TYPE if_sxml_value=>value_type OPTIONAL.
+ 
+  METHODS
+    skip_node
+      IMPORTING
+        writer TYPE REF TO if_sxml_writer OPTIONAL
+      RAISING
+        cx_sxml_parse_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML_VALUE                           ', 'INTERFACE if_sxml_value PUBLIC.
+ 
+  TYPES value_type TYPE i.
+  CONSTANTS co_vt_text TYPE value_type VALUE 2.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML_VALUE_NODE                      ', 'INTERFACE if_sxml_value_node PUBLIC.
+  INTERFACES if_sxml_node.
+  METHODS get_value RETURNING VALUE(val) TYPE string.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXML_WRITER                          ', 'INTERFACE if_sxml_writer PUBLIC.
+ 
+  CONSTANTS co_opt_normalizing TYPE i VALUE 1.
+  CONSTANTS co_opt_no_empty TYPE i VALUE 2.
+  CONSTANTS co_opt_ignore_conv_errros TYPE i VALUE 3.
+  CONSTANTS co_opt_linebreaks TYPE i VALUE 4.
+  CONSTANTS co_opt_indent TYPE i VALUE 5.
+  CONSTANTS co_opt_illegal_char_reject TYPE i VALUE 6.
+  CONSTANTS co_opt_illegal_char_replace TYPE i VALUE 7.
+  CONSTANTS co_opt_illegal_char_replace_by TYPE i VALUE 8.
+  CONSTANTS co_opt_base64_no_lf TYPE i VALUE 9.
+ 
+  METHODS open_element
+    IMPORTING
+      name   TYPE string
+      nsuri  TYPE string OPTIONAL
+      prefix TYPE string OPTIONAL
+    RAISING
+      cx_sxml_state_error
+      cx_sxml_name_error.
+ 
+  METHODS close_element
+    RAISING
+      cx_sxml_state_error.
+ 
+  METHODS write_attribute
+    IMPORTING
+      name   TYPE string
+      nsuri  TYPE string OPTIONAL
+      prefix TYPE string OPTIONAL
+      value  TYPE string OPTIONAL
+    RAISING
+      cx_sxml_state_error
+      cx_sxml_name_error.
+ 
+  METHODS write_value
+    IMPORTING
+      value TYPE string
+    RAISING
+      cx_sxml_state_error.
+ 
+  METHODS set_option
+    IMPORTING
+      option TYPE i
+      value  TYPE abap_bool DEFAULT abap_true.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXMLP_FACTORY                        ', 'INTERFACE if_sxmlp_factory PUBLIC.
+  CLASS-METHODS create_list
+    IMPORTING
+      name        TYPE string
+      nsuri       TYPE string OPTIONAL
+      prefix      TYPE string OPTIONAL
+    RETURNING
+      VALUE(rval) TYPE REF TO if_sxmlp_list.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXMLP_LIST                           ', 'INTERFACE if_sxmlp_list PUBLIC.
+  INTERFACES if_sxmlp_part.
+ 
+  METHODS add_part
+    IMPORTING
+      part TYPE REF TO if_sxmlp_part.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXMLP_PART                           ', 'INTERFACE if_sxmlp_part PUBLIC.
+  METHODS serialize IMPORTING writer TYPE REF TO if_sxml_writer.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SXMLP_SIMPLE                         ', 'INTERFACE if_sxmlp_simple PUBLIC.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_APC_TCP_CLIENT_MANAGER               ', 'CLASS cl_apc_tcp_client_manager DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS create
+      IMPORTING
+        i_host          TYPE string
+        i_port          TYPE string
+        i_frame         TYPE if_abap_channel_types=>ty_apc_tcp_frame
+        i_event_handler TYPE REF TO if_apc_wsp_event_handler
+      RETURNING
+        VALUE(ri_client) TYPE REF TO if_apc_wsp_client
+      RAISING
+        cx_apc_error.
+ENDCLASS.
+ 
+CLASS cl_apc_tcp_client_manager IMPLEMENTATION.
+  METHOD create.
+    CREATE OBJECT ri_client TYPE lcl_client
+      EXPORTING
+        iv_host    = i_host
+        iv_port    = i_port
+        io_handler = i_event_handler.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_APC_WSP_EXT_STATELESS_BASE           ', 'CLASS cl_apc_wsp_ext_stateless_base DEFINITION PUBLIC ABSTRACT.
+  PUBLIC SECTION.
+    INTERFACES if_apc_wsp_extension.
+ENDCLASS.
+ 
+CLASS cl_apc_wsp_ext_stateless_base IMPLEMENTATION.
+  METHOD if_apc_wsp_extension~on_start.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD if_apc_wsp_extension~on_message.
+    RETURN.
+  ENDMETHOD.
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_APC_ERROR                            ', 'CLASS cx_apc_error DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_apc_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_ABAP_CHANNEL_TYPES                   ', 'INTERFACE if_abap_channel_types PUBLIC.
+  TYPES: BEGIN OF ty_apc_tcp_frame,
+           frame_type          TYPE i,
+           fixed_length        TYPE i,
+           terminator          TYPE string,
+           length_field_length TYPE i,
+           length_field_offset TYPE i,
+           length_field_header TYPE i,
+         END OF ty_apc_tcp_frame.
+ 
+  TYPES ty_tihttpnvp TYPE tihttpnvp.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_TCP_FRAME_TYPES                  ', 'INTERFACE if_apc_tcp_frame_types PUBLIC.
+  CONSTANTS co_frame_type_fixed_length TYPE i VALUE 1.
+  CONSTANTS co_frame_type_terminator   TYPE i VALUE 2.
+  CONSTANTS co_frame_type_length_field TYPE i VALUE 3.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_WSP_BINDING_MANAGER              ', 'INTERFACE if_apc_wsp_binding_manager PUBLIC.
+  METHODS bind_amc_message_consumer
+    IMPORTING
+      i_application_id TYPE clike
+      i_channel_id     TYPE clike
+    RAISING
+      cx_apc_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_WSP_CLIENT                       ', 'INTERFACE if_apc_wsp_client PUBLIC.
+  METHODS connect.
+  METHODS close.
+  METHODS get_message_manager
+    RETURNING
+      VALUE(ri_manager) TYPE REF TO if_apc_wsp_message_manager
+    RAISING
+      cx_apc_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_WSP_EVENT_HANDLER                ', 'INTERFACE if_apc_wsp_event_handler PUBLIC.
+  METHODS on_open.
+  METHODS on_message
+    IMPORTING i_message TYPE REF TO if_apc_wsp_message.
+  METHODS on_close.
+  METHODS on_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_WSP_EXTENSION                    ', 'INTERFACE if_apc_wsp_extension PUBLIC.
+  METHODS on_start
+    IMPORTING
+      i_context         TYPE REF TO if_apc_wsp_server_context
+      i_message_manager TYPE REF TO if_apc_wsp_message_manager.
+ 
+  METHODS on_message
+    IMPORTING
+      i_message         TYPE REF TO if_apc_wsp_message
+      i_message_manager TYPE REF TO if_apc_wsp_message_manager
+      i_context         TYPE REF TO if_apc_wsp_server_context.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_WSP_INITIAL_REQUEST              ', 'INTERFACE if_apc_wsp_initial_request PUBLIC.
+  METHODS get_form_fields
+    IMPORTING
+      i_formfield_encoding TYPE i DEFAULT 0
+    CHANGING
+      c_fields             TYPE if_abap_channel_types=>ty_tihttpnvp
+    RAISING
+      cx_apc_error.
+ 
+  METHODS get_header_fields
+    CHANGING
+      c_fields TYPE if_abap_channel_types=>ty_tihttpnvp
+    RAISING
+      cx_apc_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_WSP_MESSAGE                      ', 'INTERFACE if_apc_wsp_message PUBLIC.
+  METHODS get_binary
+    RETURNING VALUE(rv_binary) TYPE xstring
+    RAISING cx_apc_error.
+  METHODS set_binary
+    IMPORTING iv_binary TYPE xsequence
+    RAISING cx_apc_error.
+  METHODS get_text
+    RETURNING VALUE(r_message) TYPE string
+    RAISING cx_apc_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_WSP_MESSAGE_MANAGER              ', 'INTERFACE if_apc_wsp_message_manager PUBLIC.
+  METHODS create_message
+    RETURNING
+      VALUE(ri_message) TYPE REF TO if_apc_wsp_message
+    RAISING
+      cx_apc_error.
+  METHODS send
+    IMPORTING
+      ii_message TYPE REF TO if_apc_wsp_message
+    RAISING
+      cx_apc_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_APC_WSP_SERVER_CONTEXT               ', 'INTERFACE if_apc_wsp_server_context PUBLIC.
+  METHODS get_initial_request
+    RETURNING VALUE(r_initial_request) TYPE REF TO if_apc_wsp_initial_request
+    RAISING cx_apc_error.
+  METHODS get_binding_manager
+    RETURNING VALUE(r_binding_manager) TYPE REF TO if_apc_wsp_binding_manager
+    RAISING cx_apc_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_ABAP_UNIT_ASSERT                     ', 'CLASS cl_abap_unit_assert DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    CLASS-METHODS
+      assert_equals
+        IMPORTING
+          act   TYPE any
+          exp   TYPE any
+          msg   TYPE csequence OPTIONAL
+          tol   TYPE f OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS abort
+      IMPORTING
+        msg    TYPE csequence OPTIONAL
+        detail TYPE csequence OPTIONAL
+        quit   TYPE int1 DEFAULT 2 PREFERRED PARAMETER msg.
+ 
+    CLASS-METHODS
+      assert_differs
+        IMPORTING
+          act   TYPE any
+          exp   TYPE any
+          msg   TYPE csequence OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_number_between
+        IMPORTING
+          lower  TYPE i
+          upper  TYPE i
+          number TYPE i
+          msg    TYPE csequence OPTIONAL
+          quit   TYPE i OPTIONAL
+          level  TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_not_initial
+        IMPORTING
+          act   TYPE any
+          msg   TYPE csequence OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_initial
+        IMPORTING
+          act   TYPE any
+          msg   TYPE csequence OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      skip
+        IMPORTING
+          msg    TYPE csequence
+          detail TYPE csequence OPTIONAL.
+ 
+    CLASS-METHODS
+      fail
+        IMPORTING
+          msg    TYPE csequence OPTIONAL
+          quit   TYPE i OPTIONAL
+          level  TYPE i OPTIONAL
+          detail TYPE csequence OPTIONAL
+        PREFERRED PARAMETER msg.
+ 
+    CLASS-METHODS
+      assert_subrc
+        IMPORTING
+          exp   TYPE i DEFAULT 0
+          act   TYPE i DEFAULT sy-subrc
+          msg   TYPE csequence OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL
+        PREFERRED PARAMETER act.
+ 
+    CLASS-METHODS
+      assert_true
+        IMPORTING
+          act   TYPE abap_bool
+          msg   TYPE csequence OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_false
+        IMPORTING
+          act TYPE abap_bool
+          msg TYPE csequence OPTIONAL
+          quit TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_char_cp
+        IMPORTING
+          act   TYPE clike
+          exp   TYPE clike
+          msg   TYPE string OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_char_np
+        IMPORTING
+          act   TYPE clike
+          exp   TYPE clike
+          msg   TYPE csequence OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_bound
+        IMPORTING
+          act   TYPE any
+          msg   TYPE csequence OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_not_bound
+        IMPORTING
+          act   TYPE any
+          msg   TYPE csequence OPTIONAL
+          quit  TYPE i OPTIONAL
+          level TYPE i OPTIONAL.
+ 
+    CLASS-METHODS
+      assert_text_matches
+        IMPORTING
+          pattern TYPE csequence
+          text    TYPE csequence
+          msg     TYPE csequence OPTIONAL
+          quit    TYPE i OPTIONAL
+          level   TYPE i OPTIONAL.
+ 
+  PRIVATE SECTION.
+    CLASS-METHODS
+      compare_tables
+        IMPORTING
+          act TYPE any
+          exp TYPE any.
+ 
+ENDCLASS.
+ 
+CLASS cl_abap_unit_assert IMPLEMENTATION.
+ 
+  METHOD compare_tables.
+ 
+    DATA index    TYPE i.
+    DATA type1    TYPE REF TO cl_abap_tabledescr.
+    DATA type2    TYPE REF TO cl_abap_tabledescr.
+    DATA lv_match TYPE abap_bool.
+ 
+    FIELD-SYMBOLS <tab1> TYPE INDEX TABLE.
+    FIELD-SYMBOLS <row1> TYPE any.
+    FIELD-SYMBOLS <tab2> TYPE INDEX TABLE.
+    FIELD-SYMBOLS <row2> TYPE any.
+ 
+    IF lines( act ) <> lines( exp ).
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = |Expected table to contain { lines( exp ) } rows, got { lines( act ) }|.
+    ENDIF.
+ 
+    ASSIGN act TO <tab1>.
+    ASSIGN exp TO <tab2>.
+ 
+    type1 ?= cl_abap_typedescr=>describe_by_data( act ).
+    type2 ?= cl_abap_typedescr=>describe_by_data( exp ).
+*    WRITE ''@KERNEL console.dir(type1);''.
+    IF type1->table_kind = cl_abap_tabledescr=>tablekind_hashed
+        OR type2->table_kind = cl_abap_tabledescr=>tablekind_hashed.
+      LOOP AT <tab1> ASSIGNING <row1>.
+        lv_match = abap_false.
+        LOOP AT <tab2> ASSIGNING <row2>.
+          TRY.
+              assert_equals(
+                act = <row1>
+                exp = <row2> ).
+              lv_match = abap_true.
+              EXIT. " current loop
+            CATCH kernel_cx_assert.
+          ENDTRY.
+        ENDLOOP.
+        IF lv_match = abap_false.
+          RAISE EXCEPTION TYPE kernel_cx_assert
+            EXPORTING
+              msg = |Hashed table contents differs|.
+        ENDIF.
+      ENDLOOP.
+    ELSE.
+      DO lines( act ) TIMES.
+        index = sy-index.
+        READ TABLE <tab1> INDEX index ASSIGNING <row1>.
+        assert_subrc( ).
+        READ TABLE <tab2> INDEX index ASSIGNING <row2>.
+        assert_subrc( ).
+        assert_equals(
+          act = <row1>
+          exp = <row2> ).
+      ENDDO.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD assert_text_matches.
+    DATA lv_match TYPE abap_bool.
+    lv_match = boolc( contains(
+      val   = text
+      regex = pattern ) ).
+    IF lv_match = abap_false.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          expected = pattern
+          actual   = text
+          msg      = msg.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD abort.
+    ASSERT 1 = ''todo''.
+  ENDMETHOD.
+ 
+  METHOD assert_bound.
+    IF act IS NOT BOUND.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = |Expected value to be bound|.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_not_bound.
+    IF act IS BOUND.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = |Expected value to not be bound|.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_char_cp.
+    IF act NP exp.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          expected = exp
+          actual   = act
+          msg      = msg.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_char_np.
+    IF act CP exp.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = |Actual: { act }|.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD fail.
+    RAISE EXCEPTION TYPE kernel_cx_assert
+      EXPORTING
+        msg = msg.
+  ENDMETHOD.
+ 
+  METHOD skip.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD assert_differs.
+    TRY.
+        assert_equals(
+          act = act
+          exp = exp ).
+        RAISE EXCEPTION TYPE kernel_cx_assert
+          EXPORTING
+            msg      = |Expected different values|
+            actual   = act
+            expected = exp.
+      CATCH kernel_cx_assert.
+        RETURN.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD assert_true.
+    IF act <> abap_true.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = |Expected abap_true|.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_false.
+    IF act <> abap_false.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = |Expected abap_false|.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_equals.
+    DATA type1  TYPE c LENGTH 1.
+    DATA type2  TYPE c LENGTH 1.
+    DATA diff   TYPE f.
+    DATA lv_exp TYPE string.
+    DATA lv_act TYPE string.
+    DATA lv_msg TYPE string.
+ 
+    DESCRIBE FIELD act TYPE type1.
+    DESCRIBE FIELD exp TYPE type2.
+*    WRITE ''@KERNEL console.dir(type1.get());''.
+*    WRITE ''@KERNEL console.dir(type2.get());''.
+    IF type1 CA ''CgyIFPDTXN8''. " basic types
+      IF type2 IS NOT INITIAL.
+        IF type2 NA ''CgyIFPDTXN8''.
+          RAISE EXCEPTION TYPE kernel_cx_assert
+            EXPORTING
+              msg = |Unexpected types|.
+        ENDIF.
+      ENDIF.
+    ELSEIF type1 IS NOT INITIAL AND type2 IS NOT INITIAL.
+* else check the types are identical
+      IF type1 <> type2.
+        RAISE EXCEPTION TYPE kernel_cx_assert
+          EXPORTING
+            msg = |Unexpected types|.
+      ENDIF.
+    ENDIF.
+ 
+    IF type1 = ''h''.
+      compare_tables(
+        act = act
+        exp = exp ).
+    ELSEIF tol IS SUPPLIED.
+      diff = exp - act.
+*      WRITE ''@KERNEL console.dir(tol);''.
+*      WRITE ''@KERNEL console.dir(diff);''.
+      IF diff >= tol.
+        RAISE EXCEPTION TYPE kernel_cx_assert.
+      ENDIF.
+    ELSEIF act <> exp.
+      lv_act = lcl_dump=>to_string( act ).
+      lv_exp = lcl_dump=>to_string( exp ).
+      IF msg <> ''''.
+        lv_msg = msg.
+      ELSE.
+        lv_msg = |Expected ''{ lv_exp }'', got ''{ lv_act }''|.
+      ENDIF.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg      = lv_msg
+          actual   = lv_act
+          expected = lv_exp.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_not_initial.
+    DATA lv_msg TYPE string.
+    IF act IS INITIAL.
+      lv_msg = msg.
+      IF lv_msg IS INITIAL.
+        lv_msg = |Expected non initial value|.
+      ENDIF.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = lv_msg.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_initial.
+    DATA lv_msg TYPE string.
+    IF act IS NOT INITIAL.
+      lv_msg = msg.
+      IF lv_msg IS INITIAL.
+        lv_msg = |Expected initial value|.
+      ENDIF.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = lv_msg.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_subrc.
+    IF act <> exp.
+      RAISE EXCEPTION TYPE kernel_cx_assert
+        EXPORTING
+          msg = |Expected sy-subrc to equal { exp }, got { act }|.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD assert_number_between.
+    IF number < lower OR number > upper.
+      RAISE EXCEPTION TYPE kernel_cx_assert.
+    ENDIF.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_FUNCTION_TEST_ENVIRONMENT            ', 'CLASS cl_function_test_environment DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    INTERFACES if_function_test_environment.
+ 
+    "! Note: open-abap function module test doubles allows creating doubles for non-existing
+    "! function modules
+    CLASS-METHODS create
+      IMPORTING
+        function_modules                 TYPE if_function_test_environment=>tt_function_dependencies
+      RETURNING
+        VALUE(function_test_environment) TYPE REF TO if_function_test_environment.
+  PRIVATE SECTION.
+    TYPES: BEGIN OF ty_backup,
+             name   TYPE sxco_fm_name,
+             backup TYPE i,
+             double TYPE REF TO if_function_testdouble,
+           END OF ty_backup.
+    CLASS-DATA gt_backup TYPE SORTED TABLE OF ty_backup WITH UNIQUE KEY name.
+ENDCLASS.
+ 
+CLASS cl_function_test_environment IMPLEMENTATION.
+ 
+  METHOD create.
+    DATA lv_module LIKE LINE OF function_modules.
+    DATA ls_row    LIKE LINE OF gt_backup.
+ 
+    ASSERT lines( function_modules ) > 0.
+ 
+    LOOP AT function_modules INTO lv_module.
+      ls_row-name = lv_module.
+      CREATE OBJECT ls_row-double TYPE lcl_double
+        EXPORTING
+          iv_name = lv_module.
+      WRITE ''@KERNEL ls_row.get().backup = abap.FunctionModules[lv_module.get().trimEnd()];''.
+      INSERT ls_row INTO gt_backup.
+    ENDLOOP.
+ 
+    CREATE OBJECT function_test_environment TYPE cl_function_test_environment.
+  ENDMETHOD.
+ 
+  METHOD if_function_test_environment~get_double.
+    FIELD-SYMBOLS <ls_row> LIKE LINE OF gt_backup.
+ 
+    READ TABLE gt_backup ASSIGNING <ls_row> WITH KEY name = function_name.
+    ASSERT sy-subrc = 0.
+ 
+    result = <ls_row>-double.
+  ENDMETHOD.
+ 
+  METHOD if_function_test_environment~clear_doubles.
+    FIELD-SYMBOLS <ls_row> LIKE LINE OF gt_backup.
+ 
+    LOOP AT gt_backup ASSIGNING <ls_row>.
+      WRITE ''@KERNEL abap.FunctionModules[fs_ls_row_.get().name.get().trimEnd()] = fs_ls_row_.get().backup;''.
+    ENDLOOP.
+    CLEAR gt_backup.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_FTD_PARAMETER_NOT_FOUND              ', 'CLASS cx_ftd_parameter_not_found DEFINITION PUBLIC FINAL CREATE PUBLIC INHERITING FROM cx_no_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_ftd_parameter_not_found IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_FTD_INPUT_ARGUMENTS                  ', 'INTERFACE if_ftd_input_arguments PUBLIC.
+ 
+  METHODS get_importing_parameter
+    IMPORTING
+      name          TYPE abap_parmname
+    RETURNING
+      VALUE(result) TYPE REF TO data
+    RAISING
+      cx_ftd_parameter_not_found.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_FTD_INPUT_CONFIG_SETTER              ', 'INTERFACE if_ftd_input_config_setter PUBLIC.
+ 
+  METHODS ignore_all_parameters
+    RETURNING
+      VALUE(output_configuration_setter) TYPE REF TO if_ftd_output_config_setter.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_FTD_INVOCATION_ANSWER                ', 'INTERFACE if_ftd_invocation_answer PUBLIC.
+ 
+  METHODS answer
+    IMPORTING
+      arguments TYPE REF TO if_ftd_input_arguments
+    CHANGING
+      result    TYPE REF TO if_ftd_invocation_result.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_FTD_INVOCATION_RESULT                ', 'INTERFACE if_ftd_invocation_result PUBLIC.
+ 
+  METHODS get_output_configuration
+    RETURNING
+      VALUE(result) TYPE REF TO if_ftd_output_configuration.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_FTD_OUTPUT_CONFIG_SETTER             ', 'INTERFACE if_ftd_output_config_setter PUBLIC.
+ 
+  METHODS then_answer
+    IMPORTING
+      answer      TYPE REF TO if_ftd_invocation_answer
+    RETURNING
+      VALUE(self) TYPE REF TO if_ftd_output_config_setter.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_FTD_OUTPUT_CONFIGURATION             ', 'INTERFACE if_ftd_output_configuration PUBLIC.
+ 
+  METHODS set_exporting_parameter
+    IMPORTING
+      name        TYPE abap_parmname
+      value       TYPE any
+    RETURNING
+      VALUE(self) TYPE REF TO if_ftd_output_configuration
+    RAISING
+      cx_ftd_parameter_not_found.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_FUNCTION_TEST_ENVIRONMENT            ', 'INTERFACE if_function_test_environment PUBLIC.
+ 
+  TYPES tt_function_dependencies TYPE STANDARD TABLE OF sxco_fm_name WITH KEY table_line.
+ 
+  METHODS get_double
+    IMPORTING
+      function_name TYPE sxco_fm_name
+    RETURNING
+      VALUE(result) TYPE REF TO if_function_testdouble.
+ 
+  METHODS clear_doubles.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_FUNCTION_TESTDOUBLE                  ', 'INTERFACE if_function_testdouble PUBLIC.
+ 
+  METHODS configure_call
+    RETURNING
+      VALUE(input_configuration_setter) TYPE REF TO if_ftd_input_config_setter.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_ABAP_UNIT_CONSTANT                   ', 'INTERFACE if_abap_unit_constant PUBLIC.
+  CONSTANTS:
+    BEGIN OF severity,
+      low               TYPE int1 VALUE 0,
+      medium            TYPE int1 VALUE 1,
+      high              TYPE int1 VALUE 2,
+    END OF severity.
+  CONSTANTS:
+    BEGIN OF quit,
+      test   TYPE int1 VALUE 1,
+      no     TYPE int1 VALUE 5,
+    END OF quit.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_AUNIT_CONSTANTS                      ', 'INTERFACE if_aunit_constants PUBLIC.
+  CONSTANTS no        TYPE int1 VALUE 0.
+  CONSTANTS critical  TYPE int1 VALUE 1.
+  CONSTANTS fatal     TYPE int1 VALUE 1.
+  CONSTANTS tolerable TYPE int1 VALUE 1.
+  CONSTANTS method    TYPE int1 VALUE 1.
+  CONSTANTS class_     TYPE int1 VALUE 2.
+ 
+  CONSTANTS: BEGIN OF severity,
+               low    TYPE int1 VALUE 0,
+               medium TYPE int1 VALUE 1,
+               high   TYPE int1 VALUE 2,
+             END OF severity.
+ 
+  CONSTANTS: BEGIN OF quit,
+               no   TYPE int1 VALUE 0,
+               test TYPE int1 VALUE 1,
+             END OF quit.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_CX_ASSERT                        ', 'CLASS kernel_cx_assert DEFINITION PUBLIC INHERITING FROM cx_dynamic_check.
+  PUBLIC SECTION.
+    DATA actual TYPE string.
+    DATA expected TYPE string.
+    DATA msg TYPE string.
+ 
+    METHODS constructor
+      IMPORTING
+        msg      TYPE string
+        previous LIKE previous OPTIONAL
+        expected LIKE expected OPTIONAL
+        actual   LIKE actual OPTIONAL.
+ENDCLASS.
+ 
+CLASS kernel_cx_assert IMPLEMENTATION.
+ 
+  METHOD constructor.
+    super->constructor( previous = previous ).
+    me->expected = expected.
+    me->actual = actual.
+    me->msg = msg.
+    IF me->msg IS INITIAL.
+      me->msg = |Unit test assertion failed|.
+    ENDIF.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('KERNEL_UNIT_RUNNER                      ', 'CLASS kernel_unit_runner DEFINITION PUBLIC.
+  PUBLIC SECTION.
+* as of now, only global classes with local testclasses are supported
+    TYPES: BEGIN OF ty_input_item,
+             class_name     TYPE c LENGTH 30,
+             testclass_name TYPE c LENGTH 30,
+             method_name    TYPE c LENGTH 30,
+           END OF ty_input_item.
+    TYPES ty_input TYPE STANDARD TABLE OF ty_input_item WITH DEFAULT KEY.
+ 
+    TYPES ty_status TYPE string.
+    CONSTANTS: BEGIN OF gc_status,
+                success TYPE ty_status VALUE ''SUCCESS'',
+                failed  TYPE ty_status VALUE ''FAILED'',
+                skipped TYPE ty_status VALUE ''SKIPPED'',
+               END OF gc_status.
+ 
+    TYPES BEGIN OF ty_result_item.
+    INCLUDE TYPE ty_input_item.
+    TYPES: expected    TYPE string,
+             actual      TYPE string,
+             status      TYPE ty_status,
+             runtime     TYPE i,
+             message     TYPE string,
+             js_location TYPE string,
+             console     TYPE string,
+           END OF ty_result_item.
+    TYPES: BEGIN OF ty_result,
+             list TYPE STANDARD TABLE OF ty_result_item WITH DEFAULT KEY,
+             json TYPE string,
+           END OF ty_result.
+ 
+    CLASS-DATA mv_console TYPE string.
+ 
+    CLASS-METHODS run
+      IMPORTING
+        it_input TYPE ty_input
+      RETURNING
+        VALUE(rs_result) TYPE ty_result.
+  PRIVATE SECTION.
+    TYPES: BEGIN OF ty_class_item,
+             class_name     TYPE c LENGTH 30,
+             testclass_name TYPE c LENGTH 30,
+           END OF ty_class_item.
+    TYPES ty_classes TYPE STANDARD TABLE OF ty_class_item WITH DEFAULT KEY.
+ 
+    CLASS-METHODS unique_classes
+      IMPORTING
+       it_input TYPE ty_input
+      RETURNING
+        VALUE(rt_classes) TYPE ty_classes.
+ 
+    CLASS-METHODS to_json
+      IMPORTING it_list TYPE ty_result-list
+      RETURNING VALUE(rv_json) TYPE string.
+ 
+    CLASS-METHODS get_location
+      IMPORTING ix_error TYPE REF TO cx_root
+      RETURNING VALUE(rv_location) TYPE string.
+ENDCLASS.
+ 
+CLASS kernel_unit_runner IMPLEMENTATION.
+ 
+  METHOD get_location.
+    DATA lv_stack TYPE string.
+    DATA lt_lines TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+    DATA lv_found TYPE abap_bool.
+    WRITE ''@KERNEL lv_stack.set(INPUT.ix_error.get().stack);''.
+    SPLIT lv_stack AT |\\n| INTO TABLE lt_lines.
+* find whatever comes after "cl_abap_unit_assert"
+    LOOP AT lt_lines INTO lv_stack.
+      IF lv_stack CP ''*cl_abap_unit_assert*''.
+        lv_found = abap_true.
+        CONTINUE.
+      ELSEIF lv_found = abap_true.
+        REPLACE FIRST OCCURRENCE OF |at | IN lv_stack WITH ''''.
+        rv_location = condense( lv_stack ).
+        EXIT.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD to_json.
+* would like to keep the dependencies of this class minimal,
+* so not using CALL TRANSFORMATION or any other ABAP classes
+ 
+    DATA ls_list    LIKE LINE OF it_list.
+    DATA lt_strings TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+    DATA lv_string  LIKE LINE OF lt_strings.
+    DATA lv_message TYPE string.
+ 
+ 
+    LOOP AT it_list INTO ls_list.
+      lv_message = ls_list-message.
+      REPLACE ALL OCCURRENCES OF |"| IN lv_message WITH |\\"|.
+      REPLACE ALL OCCURRENCES OF |\\n| IN lv_message WITH |\\\\n|.
+ 
+      REPLACE ALL OCCURRENCES OF |"| IN ls_list-expected WITH |\\"|.
+      REPLACE ALL OCCURRENCES OF |\\n| IN ls_list-expected WITH |\\\\n|.
+ 
+      REPLACE ALL OCCURRENCES OF |"| IN ls_list-actual WITH |\\"|.
+      REPLACE ALL OCCURRENCES OF |\\n| IN ls_list-actual WITH |\\\\n|.
+ 
+      REPLACE ALL OCCURRENCES OF |"| IN ls_list-console WITH |\\"|.
+      REPLACE ALL OCCURRENCES OF |\\n| IN ls_list-console WITH |\\\\n|.
+ 
+      lv_string = |\\{"class_name": "{ ls_list-class_name
+        }","testclass_name": "{ ls_list-testclass_name
+        }","method_name": "{ ls_list-method_name
+        }","expected": "{ ls_list-expected
+        }","actual": "{ ls_list-actual
+        }","status": "{ ls_list-status
+        }","runtime": { ls_list-runtime
+        },"console": "{ ls_list-console
+        }","message": "{ lv_message
+        }","js_location": "{ ls_list-js_location }"\\}|.
+      APPEND lv_string TO lt_strings.
+    ENDLOOP.
+    CONCATENATE LINES OF lt_strings INTO rv_json SEPARATED BY '',''.
+    rv_json = ''['' && rv_json && '']''.
+  ENDMETHOD.
+ 
+  METHOD unique_classes.
+    DATA ls_input LIKE LINE OF it_input.
+    DATA ls_class LIKE LINE OF rt_classes.
+    LOOP AT it_input INTO ls_input.
+      MOVE-CORRESPONDING ls_input TO ls_class.
+      INSERT ls_class INTO TABLE rt_classes.
+    ENDLOOP.
+    SORT rt_classes.
+    DELETE ADJACENT DUPLICATES FROM rt_classes.
+  ENDMETHOD.
+ 
+  METHOD run.
+ 
+    DATA ls_input   LIKE LINE OF it_input.
+    DATA lv_time    TYPE i.
+    DATA lo_obj     TYPE REF TO object.
+    DATA lv_name    TYPE string.
+    DATA lt_classes TYPE ty_classes.
+    DATA ls_class   LIKE LINE OF lt_classes.
+    DATA lx_root    TYPE REF TO cx_root.
+    DATA lx_assert  TYPE REF TO kernel_cx_assert.
+    FIELD-SYMBOLS <ls_result> LIKE LINE OF rs_result-list.
+ 
+* todo, respect quit level, default = method?
+ 
+    lt_classes = unique_classes( it_input ).
+ 
+    LOOP AT lt_classes INTO ls_class.
+* this is special, and must match the runtime:
+      lv_name = |CLAS-{ ls_class-class_name }-{ ls_class-testclass_name }|.
+      CREATE OBJECT lo_obj TYPE (lv_name).
+ 
+      TRY.
+          CALL METHOD lo_obj->(''CLASS_SETUP'').
+        CATCH cx_sy_dyn_call_illegal_method.
+      ENDTRY.
+ 
+      LOOP AT it_input INTO ls_input WHERE class_name = ls_class-class_name AND testclass_name = ls_class-testclass_name.
+        APPEND INITIAL LINE TO rs_result-list ASSIGNING <ls_result>.
+        MOVE-CORRESPONDING ls_input TO <ls_result>.
+ 
+        TRY.
+            CALL METHOD lo_obj->(''SETUP'').
+          CATCH cx_sy_dyn_call_illegal_method.
+        ENDTRY.
+ 
+        GET RUN TIME FIELD lv_time.
+        CLEAR mv_console.
+        TRY.
+            CALL METHOD lo_obj->(ls_input-method_name).
+            <ls_result>-status  = gc_status-success.
+            <ls_result>-console = mv_console.
+          CATCH kernel_cx_assert INTO lx_assert.
+            <ls_result>-status      = gc_status-failed.
+            <ls_result>-actual      = lx_assert->actual.
+            <ls_result>-expected    = lx_assert->expected.
+            <ls_result>-message     = lx_assert->msg.
+            <ls_result>-js_location = get_location( lx_assert ).
+            <ls_result>-console     = mv_console.
+          CATCH cx_root INTO lx_root.
+            <ls_result>-status      = gc_status-failed.
+            <ls_result>-message     = |Some exception raised|. " todo, use RTTI to find the class name?
+            <ls_result>-js_location = get_location( lx_root ).
+            <ls_result>-console     = mv_console.
+        ENDTRY.
+        GET RUN TIME FIELD lv_time.
+        <ls_result>-runtime = lv_time.
+ 
+        TRY.
+            CALL METHOD lo_obj->(''TEARDOWN'').
+          CATCH cx_sy_dyn_call_illegal_method.
+        ENDTRY.
+      ENDLOOP.
+ 
+      TRY.
+          CALL METHOD lo_obj->(''CLASS_TEARDOWN'').
+        CATCH cx_sy_dyn_call_illegal_method.
+      ENDTRY.
+ 
+    ENDLOOP.
+ 
+    rs_result-json = to_json( rs_result-list ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_OSQL_TEST_ENVIRONMENT                ', 'CLASS cl_osql_test_environment DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    INTERFACES if_osql_test_environment.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        i_dependency_list TYPE if_osql_test_environment=>ty_t_sobjnames
+      RETURNING
+        VALUE(r_result)   TYPE REF TO if_osql_test_environment.
+ 
+  PRIVATE SECTION.
+    CONSTANTS mv_schema TYPE string VALUE ''double''.
+ 
+    DATA mt_tables TYPE if_osql_test_environment=>ty_t_sobjnames.
+    DATA mo_sql    TYPE REF TO cl_sql_statement.
+ 
+    METHODS initialize.
+ENDCLASS.
+ 
+CLASS cl_osql_test_environment IMPLEMENTATION.
+ 
+  METHOD create.
+    DATA lo_env TYPE REF TO cl_osql_test_environment.
+ 
+    ASSERT sy-dbsys = ''sqlite''.
+ 
+    CREATE OBJECT lo_env.
+    lo_env->mt_tables = i_dependency_list.
+    CREATE OBJECT lo_env->mo_sql.
+    lo_env->initialize( ).
+ 
+    r_result = lo_env.
+ 
+  ENDMETHOD.
+ 
+  METHOD initialize.
+ 
+    DATA lv_table  LIKE LINE OF mt_tables.
+    DATA lv_sql    TYPE string.
+    DATA lo_result TYPE REF TO cl_sql_result_set.
+    DATA lr_ref    TYPE REF TO data.
+    DATA lv_extra  TYPE string.
+ 
+    WRITE ''@KERNEL if (abap.dbo.schemaPrefix !== "") throw new Error("already prefixed");''.
+ 
+* https://www.sqlite.org/lang_attach.html
+    mo_sql->execute_update( |ATTACH DATABASE '':memory:'' AS { mv_schema };| ).
+ 
+    LOOP AT mt_tables INTO lv_table.
+      lv_table = to_lower( lv_table ).
+ 
+      lo_result = mo_sql->execute_query( |SELECT sql FROM main.sqlite_master WHERE type=''table'' AND name=''{ lv_table }'';| ).
+      GET REFERENCE OF lv_sql INTO lr_ref.
+      lo_result->set_param( lr_ref ).
+      lo_result->next( ).
+      lo_result->close( ).
+ 
+      REPLACE FIRST OCCURRENCE OF lv_table IN lv_sql WITH |{ mv_schema }''.''{ lv_table }|.
+      ASSERT sy-subrc = 0.
+ 
+*      WRITE / lv_sql.
+ 
+      mo_sql->execute_update( lv_sql ).
+    ENDLOOP.
+ 
+    lv_extra = |''.''|.
+    WRITE ''@KERNEL abap.dbo.schemaPrefix = this.mv_schema.get() + lv_extra.get();''.
+ 
+  ENDMETHOD.
+ 
+  METHOD if_osql_test_environment~clear_doubles.
+    DATA lv_table LIKE LINE OF mt_tables.
+ 
+    LOOP AT mt_tables INTO lv_table.
+      lv_table = to_lower( lv_table ).
+      mo_sql->execute_update( |DELETE FROM { mv_schema }.{ lv_table };| ).
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD if_osql_test_environment~destroy.
+ 
+* https://www.sqlite.org/lang_detach.html
+    mo_sql->execute_update( |DETACH DATABASE { mv_schema };| ).
+ 
+    WRITE ''@KERNEL abap.dbo.schemaPrefix = "";''.
+ 
+  ENDMETHOD.
+ 
+  METHOD if_osql_test_environment~insert_test_data.
+    DATA lo_table_descr  TYPE REF TO cl_abap_tabledescr.
+    DATA lo_struct_descr TYPE REF TO cl_abap_structdescr.
+    DATA lv_table        TYPE string.
+ 
+    lo_table_descr ?= cl_abap_typedescr=>describe_by_data( i_data ).
+    lo_struct_descr ?= lo_table_descr->get_table_line_type( ).
+    lv_table = lo_struct_descr->get_relative_name( ).
+ 
+* sanity checks,
+    ASSERT lv_table IS NOT INITIAL.
+    READ TABLE mt_tables WITH KEY table_line = lv_table TRANSPORTING NO FIELDS.
+    ASSERT sy-subrc = 0.
+ 
+    INSERT (lv_table) FROM TABLE i_data.
+    ASSERT sy-subrc = 0.
+ 
+    WRITE ''@KERNEL abap.dbo.schemaPrefix = this.mv_schema.get() + ".";''.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_OSQL_TEST_ENVIRONMENT                ', 'INTERFACE if_osql_test_environment PUBLIC.
+ 
+  TYPES ty_s_sobjname  TYPE abap_compname.
+  TYPES ty_t_sobjnames TYPE STANDARD TABLE OF ty_s_sobjname WITH DEFAULT KEY.
+ 
+  METHODS clear_doubles.
+  METHODS destroy.
+ 
+  METHODS insert_test_data
+    IMPORTING
+      i_data TYPE ANY TABLE.
+ 
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CL_SYSTEM_UUID                          ', 'CLASS cl_system_uuid DEFINITION PUBLIC.
+  PUBLIC SECTION.
+    INTERFACES if_system_uuid_rfc4122_static.
+    INTERFACES if_system_uuid_static.
+ 
+    ALIASES create_uuid_c32_static FOR if_system_uuid_static~create_uuid_c32.
+ENDCLASS.
+ 
+CLASS cl_system_uuid IMPLEMENTATION.
+ 
+  METHOD if_system_uuid_static~create_uuid_x16.
+    WRITE ''@KERNEL if (cl_system_uuid.CRYPTO === undefined) cl_system_uuid.CRYPTO = await import("crypto");''.
+    WRITE ''@KERNEL uuid.set(cl_system_uuid.CRYPTO.randomBytes(16).toString("hex").toUpperCase());''.
+  ENDMETHOD.
+ 
+  METHOD if_system_uuid_static~create_uuid_c32.
+    WRITE ''@KERNEL if (cl_system_uuid.CRYPTO === undefined) cl_system_uuid.CRYPTO = await import("crypto");''.
+    WRITE ''@KERNEL uuid.set(cl_system_uuid.CRYPTO.randomBytes(16).toString("hex").toUpperCase());''.
+  ENDMETHOD.
+ 
+  METHOD if_system_uuid_rfc4122_static~create_uuid_c36_by_version.
+    ASSERT version = 4.
+    WRITE ''@KERNEL if (cl_system_uuid.CRYPTO === undefined) cl_system_uuid.CRYPTO = await import("crypto");''.
+    WRITE ''@KERNEL uuid.set(cl_system_uuid.CRYPTO.randomUUID());''.
+  ENDMETHOD.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('CX_UUID_ERROR                           ', 'CLASS cx_uuid_error DEFINITION PUBLIC INHERITING FROM cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS cx_uuid_error IMPLEMENTATION.
+ 
+ENDCLASS.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SYSTEM_UUID_RFC4122_STATIC           ', 'INTERFACE if_system_uuid_rfc4122_static PUBLIC.
+  CLASS-METHODS create_uuid_c36_by_version
+    IMPORTING
+      version TYPE i
+    RETURNING
+      VALUE(uuid) TYPE sysuuid_c36
+    RAISING
+      cx_uuid_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO reposrc ('PROGNAME', 'DATA') VALUES ('IF_SYSTEM_UUID_STATIC                   ', 'INTERFACE if_system_uuid_static PUBLIC.
+  CLASS-METHODS create_uuid_x16
+    RETURNING
+      VALUE(uuid) TYPE sysuuid_x16
+    RAISING
+      cx_uuid_error.
+ 
+  CLASS-METHODS create_uuid_c32
+    RETURNING
+      VALUE(uuid) TYPE sysuuid_c32
+    RAISING
+      cx_uuid_error.
+ENDINTERFACE.');`);
+  insert.push(`INSERT INTO t000 ('mandt', 'cccategory', 'ccnocliind') VALUES ('123', '', '');`);
+  const {setup} = await import("../test/setup.mjs");
+  await setup(globalThis.abap, schemas, insert);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/int1.dtel.mjs.html b/output/int1.dtel.mjs.html new file mode 100644 index 00000000000..cb74cacd1ed --- /dev/null +++ b/output/int1.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/int1.dtel.mjs + + + + + + + + + +
+
+

All files / output int1.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["INT1"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "INT1"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/int2.dtel.mjs.html b/output/int2.dtel.mjs.html new file mode 100644 index 00000000000..e38c66a33ee --- /dev/null +++ b/output/int2.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/int2.dtel.mjs + + + + + + + + + +
+
+

All files / output int2.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["INT2"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "INT2"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/int4.dtel.mjs.html b/output/int4.dtel.mjs.html new file mode 100644 index 00000000000..f128581ae01 --- /dev/null +++ b/output/int4.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/int4.dtel.mjs + + + + + + + + + +
+
+

All files / output int4.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["INT4"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "INT4"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/laiso.dtel.mjs.html b/output/laiso.dtel.mjs.html new file mode 100644 index 00000000000..d273609d79b --- /dev/null +++ b/output/laiso.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/laiso.dtel.mjs + + + + + + + + + +
+
+

All files / output laiso.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LAISO"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/land1.dtel.mjs.html b/output/land1.dtel.mjs.html new file mode 100644 index 00000000000..4dfa94f3f61 --- /dev/null +++ b/output/land1.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/land1.dtel.mjs + + + + + + + + + +
+
+

All files / output land1.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LAND1"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(3, {"qualifiedName":"LAND1","ddicName":"LAND1"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/langu.dtel.mjs.html b/output/langu.dtel.mjs.html new file mode 100644 index 00000000000..a32933deede --- /dev/null +++ b/output/langu.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/langu.dtel.mjs + + + + + + + + + +
+
+

All files / output langu.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LANGU"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lvc_nokeyc.dtel.mjs.html b/output/lvc_nokeyc.dtel.mjs.html new file mode 100644 index 00000000000..47742f5c171 --- /dev/null +++ b/output/lvc_nokeyc.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lvc_nokeyc.dtel.mjs + + + + + + + + + +
+
+

All files / output lvc_nokeyc.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LVC_NOKEYC"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"LVC_NOKEYC","ddicName":"LVC_NOKEYC"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxe_pcx_s1.tabl.mjs.html b/output/lxe_pcx_s1.tabl.mjs.html new file mode 100644 index 00000000000..9ee51e190ac --- /dev/null +++ b/output/lxe_pcx_s1.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/lxe_pcx_s1.tabl.mjs + + + + + + + + + +
+
+

All files / output lxe_pcx_s1.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["LXE_PCX_S1"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"textkey": new abap.types.Character(32, {"qualifiedName":"LXETEXTKEY","ddicName":"LXETEXTKEY"}), "s_text": new abap.types.Character(255, {"qualifiedName":"LXEUNITLIN","ddicName":"LXEUNITLIN"}), "t_text": new abap.types.Character(255, {"qualifiedName":"LXEUNITLIN","ddicName":"LXEUNITLIN"}), "unitmlt": new abap.types.Integer({qualifiedName: "LXEUNITMLT"}), "uppcase": new abap.types.Character(1, {"qualifiedName":"LXEUPPCASE","ddicName":"LXEUPPCASE"}), "texttype": new abap.types.Character(4, {"qualifiedName":"LXETEXTTYPE","ddicName":"LXETEXTTYPE"})}, "LXE_PCX_S1", "LXE_PCX_S1", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxecustmnr.dtel.mjs.html b/output/lxecustmnr.dtel.mjs.html new file mode 100644 index 00000000000..b4dd3e08b3c --- /dev/null +++ b/output/lxecustmnr.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lxecustmnr.dtel.mjs + + + + + + + + + +
+
+

All files / output lxecustmnr.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LXECUSTMNR"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(6, {"qualifiedName":"LXECUSTMNR","ddicName":"LXECUSTMNR"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxeisolang.dtel.mjs.html b/output/lxeisolang.dtel.mjs.html new file mode 100644 index 00000000000..f80c84f3bef --- /dev/null +++ b/output/lxeisolang.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lxeisolang.dtel.mjs + + + + + + + + + +
+
+

All files / output lxeisolang.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LXEISOLANG"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(4, {"qualifiedName":"LXEISOLANG","ddicName":"LXEISOLANG"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxeobjname.dtel.mjs.html b/output/lxeobjname.dtel.mjs.html new file mode 100644 index 00000000000..e9218c2b7a4 --- /dev/null +++ b/output/lxeobjname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lxeobjname.dtel.mjs + + + + + + + + + +
+
+

All files / output lxeobjname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LXEOBJNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(70, {"qualifiedName":"LXEOBJNAME","ddicName":"LXEOBJNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxetextkey.dtel.mjs.html b/output/lxetextkey.dtel.mjs.html new file mode 100644 index 00000000000..5409493403b --- /dev/null +++ b/output/lxetextkey.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lxetextkey.dtel.mjs + + + + + + + + + +
+
+

All files / output lxetextkey.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LXETEXTKEY"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"LXETEXTKEY","ddicName":"LXETEXTKEY"}),
+  "domain": "LXECHAR32",
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxetexttype.dtel.mjs.html b/output/lxetexttype.dtel.mjs.html new file mode 100644 index 00000000000..05c43faeb25 --- /dev/null +++ b/output/lxetexttype.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lxetexttype.dtel.mjs + + + + + + + + + +
+
+

All files / output lxetexttype.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LXETEXTTYPE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(4, {"qualifiedName":"LXETEXTTYPE","ddicName":"LXETEXTTYPE"}),
+  "domain": "LXETEXTTYPE",
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxeunitlin.dtel.mjs.html b/output/lxeunitlin.dtel.mjs.html new file mode 100644 index 00000000000..36f1715a4cb --- /dev/null +++ b/output/lxeunitlin.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lxeunitlin.dtel.mjs + + + + + + + + + +
+
+

All files / output lxeunitlin.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LXEUNITLIN"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(255, {"qualifiedName":"LXEUNITLIN","ddicName":"LXEUNITLIN"}),
+  "domain": "LXEUNITLIN",
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxeunitmlt.dtel.mjs.html b/output/lxeunitmlt.dtel.mjs.html new file mode 100644 index 00000000000..af166dc73da --- /dev/null +++ b/output/lxeunitmlt.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lxeunitmlt.dtel.mjs + + + + + + + + + +
+
+

All files / output lxeunitmlt.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LXEUNITMLT"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "LXEUNITMLT"}),
+  "domain": "LXEUNITLTH",
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/lxeuppcase.dtel.mjs.html b/output/lxeuppcase.dtel.mjs.html new file mode 100644 index 00000000000..4889e441b2a --- /dev/null +++ b/output/lxeuppcase.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/lxeuppcase.dtel.mjs + + + + + + + + + +
+
+

All files / output lxeuppcase.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["LXEUPPCASE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"LXEUPPCASE","ddicName":"LXEUPPCASE"}),
+  "domain": "BOOLE",
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/mandt.dtel.mjs.html b/output/mandt.dtel.mjs.html new file mode 100644 index 00000000000..5bb2f2b4b44 --- /dev/null +++ b/output/mandt.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/mandt.dtel.mjs + + + + + + + + + +
+
+

All files / output mandt.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["MANDT"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(3, {"qualifiedName":"MANDT","ddicName":"MANDT"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/match_result.tabl.mjs.html b/output/match_result.tabl.mjs.html new file mode 100644 index 00000000000..72e4c7e2901 --- /dev/null +++ b/output/match_result.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/match_result.tabl.mjs + + + + + + + + + +
+
+

All files / output match_result.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["MATCH_RESULT"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"line": new abap.types.Integer({qualifiedName: "I"}), "offset": new abap.types.Integer({qualifiedName: "I"}), "length": new abap.types.Integer({qualifiedName: "I"}), "submatches": abap.types.TableFactory.construct(new abap.types.Structure({"offset": new abap.types.Integer({qualifiedName: "I"}), "length": new abap.types.Integer({qualifiedName: "I"})}, "SUBMATCH_RESULT", "SUBMATCH_RESULT", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SUBMATCH_RESULT_TAB")}, "MATCH_RESULT", "MATCH_RESULT", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/match_result_tab.ttyp.mjs.html b/output/match_result_tab.ttyp.mjs.html new file mode 100644 index 00000000000..7811f29d35c --- /dev/null +++ b/output/match_result_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/match_result_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output match_result_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["MATCH_RESULT_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"line": new abap.types.Integer({qualifiedName: "I"}), "offset": new abap.types.Integer({qualifiedName: "I"}), "length": new abap.types.Integer({qualifiedName: "I"}), "submatches": abap.types.TableFactory.construct(new abap.types.Structure({"offset": new abap.types.Integer({qualifiedName: "I"}), "length": new abap.types.Integer({qualifiedName: "I"})}, "SUBMATCH_RESULT", "SUBMATCH_RESULT", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SUBMATCH_RESULT_TAB")}, "MATCH_RESULT", "MATCH_RESULT", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "MATCH_RESULT_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/menge_d.dtel.mjs.html b/output/menge_d.dtel.mjs.html new file mode 100644 index 00000000000..abc739af4e6 --- /dev/null +++ b/output/menge_d.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/menge_d.dtel.mjs + + + + + + + + + +
+
+

All files / output menge_d.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["MENGE_D"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Packed({length: 13, decimals: 3, qualifiedName: "MENGE_D"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/msehi.dtel.mjs.html b/output/msehi.dtel.mjs.html new file mode 100644 index 00000000000..ab6ef026b65 --- /dev/null +++ b/output/msehi.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/msehi.dtel.mjs + + + + + + + + + +
+
+

All files / output msehi.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["MSEHI"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(3, {"qualifiedName":"MSEHI","ddicName":"MSEHI"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/namespace.dtel.mjs.html b/output/namespace.dtel.mjs.html new file mode 100644 index 00000000000..b820e1d766d --- /dev/null +++ b/output/namespace.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/namespace.dtel.mjs + + + + + + + + + +
+
+

All files / output namespace.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["NAMESPACE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(10, {"qualifiedName":"NAMESPACE","ddicName":"NAMESPACE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/number_get_next.fugr.number_get_next.mjs.html b/output/number_get_next.fugr.number_get_next.mjs.html new file mode 100644 index 00000000000..da0ef0c3236 --- /dev/null +++ b/output/number_get_next.fugr.number_get_next.mjs.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for output/number_get_next.fugr.number_get_next.mjs + + + + + + + + + +
+
+

All files / output number_get_next.fugr.number_get_next.mjs

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// number_get_next.fugr.number_get_next.abap
+async function number_get_next(INPUT) {
+  // importing NR_RANGE_NR undefined false
+  let nr_range_nr = INPUT.exporting?.nr_range_nr;
+  // importing OBJECT undefined false
+  let object = INPUT.exporting?.object;
+  // exporting NUMBER undefined true
+  let number = INPUT.importing?.number;
+  if (number === undefined) {
+      number = new abap.types.Character(4);
+  }
+  await abap.Classes['KERNEL_NUMBERRANGE'].number_get({nr_range_nr: nr_range_nr, object: object, number: number});
+  abap.builtin.sy.get().subrc.set(new abap.types.Integer().set(0));
+}
+abap.FunctionModules['NUMBER_GET_NEXT'] = number_get_next;
+//# sourceMappingURL=number_get_next.fugr.number_get_next.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/numc4.dtel.mjs.html b/output/numc4.dtel.mjs.html new file mode 100644 index 00000000000..cac323a0c73 --- /dev/null +++ b/output/numc4.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/numc4.dtel.mjs + + + + + + + + + +
+
+

All files / output numc4.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["NUMC4"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Numc({length: 4, qualifiedName: "NUMC4"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.call_v1_ping.mjs.html b/output/openabap.fugr.call_v1_ping.mjs.html new file mode 100644 index 00000000000..eac1c0f8e66 --- /dev/null +++ b/output/openabap.fugr.call_v1_ping.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/openabap.fugr.call_v1_ping.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.call_v1_ping.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.call_v1_ping.abap
+async function call_v1_ping(INPUT) {
+}
+abap.FunctionModules['CALL_V1_PING'] = call_v1_ping;
+//# sourceMappingURL=openabap.fugr.call_v1_ping.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.conversion_exit_alpha_input.mjs.html b/output/openabap.fugr.conversion_exit_alpha_input.mjs.html new file mode 100644 index 00000000000..fc1455ffd46 --- /dev/null +++ b/output/openabap.fugr.conversion_exit_alpha_input.mjs.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for output/openabap.fugr.conversion_exit_alpha_input.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.conversion_exit_alpha_input.mjs

+
+ +
+ 100% + Statements + 41/41 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 41/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +411x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.conversion_exit_alpha_input.abap
+async function conversion_exit_alpha_input(INPUT) {
+  // importing INPUT CLIKE false
+  let input = INPUT.exporting?.input;
+  // exporting OUTPUT CLIKE true
+  let output = INPUT.importing?.output;
+  if (output === undefined) {
+      output = new abap.types.Character();
+  }
+  let lv_len = new abap.types.Integer({qualifiedName: "I"});
+  let lv_type = new abap.types.Character(1, {});
+  let lv_tmp = new abap.types.String({qualifiedName: "STRING"});
+  lv_tmp.set(input);
+  abap.statements.condense(lv_tmp, {nogaps: false});
+  abap.statements.describe({field: input, type: lv_type});
+  if (abap.compare.eq(lv_type, new abap.types.Character(1).set('g')) || abap.compare.eq(lv_type, new abap.types.Character(1).set('D'))) {
+    abap.statements.describe({field: output, type: lv_type});
+    if (abap.compare.eq(lv_type, new abap.types.Character(1).set('g')) || abap.compare.eq(lv_type, new abap.types.Character(1).set('D'))) {
+      output.set(input);
+      return;
+    }
+    abap.statements.describe({field: output, length: lv_len, mode: 'CHARACTER'});
+  } else {
+    abap.statements.describe({field: input, length: lv_len, mode: 'CHARACTER'});
+  }
+  if (abap.compare.initial(lv_tmp)) {
+    abap.statements.clear(output);
+    return;
+  }
+  const indexBackup1 = abap.builtin.sy.get().index.get();
+  const unique934 = abap.operators.minus(lv_len.get(),abap.builtin.strlen({val: lv_tmp}).get()).get();
+  for (let unique935 = 0; unique935 < unique934; unique935++) {
+    abap.builtin.sy.get().index.set(unique935 + 1);
+    lv_tmp.set(abap.operators.concat(new abap.types.String().set(`0`),lv_tmp));
+  }
+  abap.builtin.sy.get().index.set(indexBackup1);
+  output.set(lv_tmp);
+}
+abap.FunctionModules['CONVERSION_EXIT_ALPHA_INPUT'] = conversion_exit_alpha_input;
+//# sourceMappingURL=openabap.fugr.conversion_exit_alpha_input.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.conversion_exit_alpha_output.mjs.html b/output/openabap.fugr.conversion_exit_alpha_output.mjs.html new file mode 100644 index 00000000000..809b57d9921 --- /dev/null +++ b/output/openabap.fugr.conversion_exit_alpha_output.mjs.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for output/openabap.fugr.conversion_exit_alpha_output.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.conversion_exit_alpha_output.mjs

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.conversion_exit_alpha_output.abap
+async function conversion_exit_alpha_output(INPUT) {
+  // importing INPUT CLIKE false
+  let input = INPUT.exporting?.input;
+  // exporting OUTPUT CLIKE true
+  let output = INPUT.importing?.output;
+  if (output === undefined) {
+      output = new abap.types.Character();
+  }
+  output.set(input);
+  abap.statements.shift(output, {direction: 'LEFT',deletingLeading: new abap.types.Character(1).set('0')});
+  const indexBackup1 = abap.builtin.sy.get().index.get();
+  const unique936 = abap.operators.minus(abap.builtin.strlen({val: input}),abap.builtin.strlen({val: output}).get()).get();
+  for (let unique937 = 0; unique937 < unique936; unique937++) {
+    abap.builtin.sy.get().index.set(unique937 + 1);
+    output.set(abap.operators.concat(output,new abap.types.String().set(` `)));
+  }
+  abap.builtin.sy.get().index.set(indexBackup1);
+}
+abap.FunctionModules['CONVERSION_EXIT_ALPHA_OUTPUT'] = conversion_exit_alpha_output;
+//# sourceMappingURL=openabap.fugr.conversion_exit_alpha_output.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.conversion_exit_isola_input.mjs.html b/output/openabap.fugr.conversion_exit_isola_input.mjs.html new file mode 100644 index 00000000000..65e1f9605c1 --- /dev/null +++ b/output/openabap.fugr.conversion_exit_isola_input.mjs.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for output/openabap.fugr.conversion_exit_isola_input.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.conversion_exit_isola_input.mjs

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.conversion_exit_isola_input.abap
+async function conversion_exit_isola_input(INPUT) {
+  // importing INPUT undefined false
+  let input = INPUT.exporting?.input;
+  // exporting OUTPUT undefined true
+  let output = INPUT.importing?.output;
+  if (output === undefined) {
+      output = new abap.types.Character(4);
+  }
+  output.set((await abap.Classes['CL_I18N_LANGUAGES'].sap2_to_sap1({im_lang_sap2: input})));
+  if (abap.compare.eq(abap.builtin.sy.get().subrc, new abap.types.Integer().set(1))) {
+    throw new abap.ClassicError({classic: "unknown_language"});
+  }
+}
+abap.FunctionModules['CONVERSION_EXIT_ISOLA_INPUT'] = conversion_exit_isola_input;
+//# sourceMappingURL=openabap.fugr.conversion_exit_isola_input.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.conversion_exit_isola_output.mjs.html b/output/openabap.fugr.conversion_exit_isola_output.mjs.html new file mode 100644 index 00000000000..11dc25f0e6b --- /dev/null +++ b/output/openabap.fugr.conversion_exit_isola_output.mjs.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for output/openabap.fugr.conversion_exit_isola_output.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.conversion_exit_isola_output.mjs

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.conversion_exit_isola_output.abap
+async function conversion_exit_isola_output(INPUT) {
+  // importing INPUT undefined false
+  let input = INPUT.exporting?.input;
+  // exporting OUTPUT undefined true
+  let output = INPUT.importing?.output;
+  if (output === undefined) {
+      output = new abap.types.Character(4);
+  }
+  try {
+    output.set(await abap.Classes['CL_I18N_LANGUAGES'].sap1_to_sap2({im_lang_sap1: input}));
+    abap.builtin.sy.get().subrc.set(0);
+  } catch (e) {
+    if (e.classic) {
+        switch (e.classic.toUpperCase()) {
+        case "NO_ASSIGNMENT": abap.builtin.sy.get().subrc.set(1); break;
+        default: abap.builtin.sy.get().subrc.set(2); break;
+          }
+      } else {
+          throw e;
+      }
+    }
+  }
+  abap.FunctionModules['CONVERSION_EXIT_ISOLA_OUTPUT'] = conversion_exit_isola_output;
+//# sourceMappingURL=openabap.fugr.conversion_exit_isola_output.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.convert_itf_to_stream_text.mjs.html b/output/openabap.fugr.convert_itf_to_stream_text.mjs.html new file mode 100644 index 00000000000..2ce2ec3f6fa --- /dev/null +++ b/output/openabap.fugr.convert_itf_to_stream_text.mjs.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for output/openabap.fugr.convert_itf_to_stream_text.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.convert_itf_to_stream_text.mjs

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.convert_itf_to_stream_text.abap
+async function convert_itf_to_stream_text(INPUT) {
+  // importing LF undefined false
+  let lf = INPUT.exporting?.lf;
+  // exporting STREAM_LINES STRING_TABLE true
+  let stream_lines = INPUT.importing?.stream_lines;
+  if (stream_lines === undefined) {
+      stream_lines = abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE");
+  }
+  // tables ITF_TEXT TLINE false
+  let itf_text = INPUT.tables?.itf_text;
+  // tables TEXT_STREAM undefined true
+  let text_stream = INPUT.tables?.text_stream;
+  if (text_stream === undefined) {
+      text_stream = abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":true,"keyType":"DEFAULT"});
+  }
+  abap.statements.clear(stream_lines);
+  abap.statements.clear(text_stream);
+  if (abap.compare.eq(abap.builtin.lines({val: itf_text}), new abap.types.Integer().set(0))) {
+    return;
+  }
+  abap.statements.assert(abap.compare.eq(new abap.types.Character(4).set('todo'), new abap.types.Integer().set(1)));
+}
+abap.FunctionModules['CONVERT_ITF_TO_STREAM_TEXT'] = convert_itf_to_stream_text;
+//# sourceMappingURL=openabap.fugr.convert_itf_to_stream_text.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.docu_get.mjs.html b/output/openabap.fugr.docu_get.mjs.html new file mode 100644 index 00000000000..deb5e2b01be --- /dev/null +++ b/output/openabap.fugr.docu_get.mjs.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for output/openabap.fugr.docu_get.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.docu_get.mjs

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.docu_get.abap
+async function docu_get(INPUT) {
+  // importing ID undefined false
+  let id = INPUT.exporting?.id;
+  // importing LANGU undefined false
+  let langu = INPUT.exporting?.langu;
+  // importing OBJECT undefined false
+  let object = INPUT.exporting?.object;
+  // importing TYP undefined false
+  let typ = INPUT.exporting?.typ;
+  // tables LINE TLINE false
+  let line = INPUT.tables?.line;
+  abap.statements.clear(line);
+  if (abap.compare.eq(id, new abap.types.Character(2).set('NA')) && abap.compare.eq(object, new abap.types.Character(5).set('00001'))) {
+    return;
+  }
+  console.dir(INPUT);
+  abap.statements.assert(abap.compare.eq(new abap.types.Character(4).set('todo'), new abap.types.Integer().set(1)));
+}
+abap.FunctionModules['DOCU_GET'] = docu_get;
+//# sourceMappingURL=openabap.fugr.docu_get.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.function_exists.mjs.html b/output/openabap.fugr.function_exists.mjs.html new file mode 100644 index 00000000000..224ee854078 --- /dev/null +++ b/output/openabap.fugr.function_exists.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/openabap.fugr.function_exists.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.function_exists.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.function_exists.abap
+async function function_exists(INPUT) {
+  // importing FUNCNAME CHAR30 false
+  let funcname = INPUT.exporting?.funcname;
+  let lv_name = new abap.types.String({qualifiedName: "STRING"});
+  let lv_exists = new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});
+  lv_name.set(funcname);
+  abap.statements.condense(lv_name, {nogaps: false});
+  lv_exists.set(abap.FunctionModules[lv_name.get()] === undefined ? " " : "X");
+  if (abap.compare.eq(lv_exists, abap.builtin.abap_false)) {
+    throw new abap.ClassicError({classic: "function_not_exist"});
+  }
+}
+abap.FunctionModules['FUNCTION_EXISTS'] = function_exists;
+//# sourceMappingURL=openabap.fugr.function_exists.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.generate_sec_random.mjs.html b/output/openabap.fugr.generate_sec_random.mjs.html new file mode 100644 index 00000000000..80590890f07 --- /dev/null +++ b/output/openabap.fugr.generate_sec_random.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/openabap.fugr.generate_sec_random.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.generate_sec_random.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.generate_sec_random.abap
+async function generate_sec_random(INPUT) {
+  // importing LENGTH I false
+  let length = INPUT.exporting?.length;
+  // exporting RANDOM XSTRING true
+  let random = INPUT.importing?.random;
+  if (random === undefined) {
+      random = new abap.types.XString({qualifiedName: "XSTRING"});
+  }
+  abap.statements.assert(abap.compare.gt(length, new abap.types.Integer().set(0)));
+  const crypto = await import("crypto");
+  random.set(crypto.randomBytes(length.get()).toString("hex").toUpperCase());
+}
+abap.FunctionModules['GENERATE_SEC_RANDOM'] = generate_sec_random;
+//# sourceMappingURL=openabap.fugr.generate_sec_random.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.get_system_timezone.mjs.html b/output/openabap.fugr.get_system_timezone.mjs.html new file mode 100644 index 00000000000..f3fd349cc93 --- /dev/null +++ b/output/openabap.fugr.get_system_timezone.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/openabap.fugr.get_system_timezone.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.get_system_timezone.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.get_system_timezone.abap
+async function get_system_timezone(INPUT) {
+  // exporting TIMEZONE TIMEZONE true
+  let timezone = INPUT.importing?.timezone;
+  if (timezone === undefined) {
+      timezone = new abap.types.Character(6, {"qualifiedName":"TIMEZONE","ddicName":"TIMEZONE"});
+  }
+  timezone.set(new abap.types.Character(3).set('UTC'));
+}
+abap.FunctionModules['GET_SYSTEM_TIMEZONE'] = get_system_timezone;
+//# sourceMappingURL=openabap.fugr.get_system_timezone.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.system_callstack.mjs.html b/output/openabap.fugr.system_callstack.mjs.html new file mode 100644 index 00000000000..665f65f54ae --- /dev/null +++ b/output/openabap.fugr.system_callstack.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/openabap.fugr.system_callstack.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.system_callstack.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.system_callstack.abap
+async function system_callstack(INPUT) {
+  // exporting CALLSTACK ABAP_CALLSTACK true
+  let callstack = INPUT.importing?.callstack;
+  if (callstack === undefined) {
+      callstack = abap.types.TableFactory.construct(new abap.types.Structure({"mainprogram": new abap.types.Character(40, {}), "include": new abap.types.Character(40, {}), "line": new abap.types.Integer({qualifiedName: "I"}), "blockname": new abap.types.String({qualifiedName: "STRING"})}, "ABAP_CALLSTACK_LINE", "ABAP_CALLSTACK_LINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "ABAP_CALLSTACK");
+  }
+  let fs_fs_ = new abap.types.FieldSymbol(new abap.types.Structure({"mainprogram": new abap.types.Character(40, {}), "include": new abap.types.Character(40, {}), "line": new abap.types.Integer({qualifiedName: "I"}), "blockname": new abap.types.String({qualifiedName: "STRING"})}, "ABAP_CALLSTACK_LINE", "ABAP_CALLSTACK_LINE", {}, {}));
+  fs_fs_.assign(callstack.appendInitial());
+  fs_fs_.get().mainprogram.set(new abap.types.Character(5).set('ZTODO'));
+  fs_fs_.get().include.set(new abap.types.Character(5).set('ZTODO'));
+  fs_fs_.get().line.set(new abap.types.Character(3).set('123'));
+}
+abap.FunctionModules['SYSTEM_CALLSTACK'] = system_callstack;
+//# sourceMappingURL=openabap.fugr.system_callstack.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.system_installed_languages.mjs.html b/output/openabap.fugr.system_installed_languages.mjs.html new file mode 100644 index 00000000000..e5456b94a74 --- /dev/null +++ b/output/openabap.fugr.system_installed_languages.mjs.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for output/openabap.fugr.system_installed_languages.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.system_installed_languages.mjs

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.system_installed_languages.abap
+async function system_installed_languages(INPUT) {
+  // exporting LANGUAGES undefined true
+  let languages = INPUT.importing?.languages;
+  if (languages === undefined) {
+      languages = new abap.types.Character(4);
+  }
+  languages.set(abap.builtin.sy.get().langu);
+  abap.builtin.sy.get().subrc.set(new abap.types.Integer().set(0));
+}
+abap.FunctionModules['SYSTEM_INSTALLED_LANGUAGES'] = system_installed_languages;
+//# sourceMappingURL=openabap.fugr.system_installed_languages.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.text_split.mjs.html b/output/openabap.fugr.text_split.mjs.html new file mode 100644 index 00000000000..f84540a93de --- /dev/null +++ b/output/openabap.fugr.text_split.mjs.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for output/openabap.fugr.text_split.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.text_split.mjs

+
+ +
+ 100% + Statements + 28/28 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 28/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +281x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.text_split.abap
+async function text_split(INPUT) {
+  // importing LENGTH undefined false
+  let length = INPUT.exporting?.length;
+  // importing TEXT undefined false
+  let text = INPUT.exporting?.text;
+  // exporting LINE undefined true
+  let line = INPUT.importing?.line;
+  if (line === undefined) {
+      line = new abap.types.Character(4);
+  }
+  // exporting REST undefined true
+  let rest = INPUT.importing?.rest;
+  if (rest === undefined) {
+      rest = new abap.types.Character(4);
+  }
+  if (abap.compare.lt(abap.builtin.strlen({val: text}), new abap.types.Integer().set(50))) {
+    line.set(text);
+    rest.set(new abap.types.Character(1).set(''));
+  } else {
+    line.set(text.getOffset({length: 50}));
+    rest.set(text.getOffset({offset: 50}));
+    abap.statements.condense(rest, {nogaps: false});
+  }
+}
+abap.FunctionModules['TEXT_SPLIT'] = text_split;
+//# sourceMappingURL=openabap.fugr.text_split.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/openabap.fugr.unit_conversion_simple.mjs.html b/output/openabap.fugr.unit_conversion_simple.mjs.html new file mode 100644 index 00000000000..b7a14ebcdb5 --- /dev/null +++ b/output/openabap.fugr.unit_conversion_simple.mjs.html @@ -0,0 +1,199 @@ + + + + + + Code coverage report for output/openabap.fugr.unit_conversion_simple.mjs + + + + + + + + + +
+
+

All files / output openabap.fugr.unit_conversion_simple.mjs

+
+ +
+ 100% + Statements + 39/39 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 39/39 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +391x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// openabap.fugr.unit_conversion_simple.abap
+async function unit_conversion_simple(INPUT) {
+  // importing INPUT undefined false
+  let input = INPUT.exporting?.input;
+  // importing UNIT_IN MSEHI true
+  let unit_in = INPUT.exporting?.unit_in;
+  if (unit_in === undefined) {
+      unit_in = new abap.types.Character(3, {"qualifiedName":"MSEHI","ddicName":"MSEHI"});
+  }
+  // importing UNIT_OUT MSEHI true
+  let unit_out = INPUT.exporting?.unit_out;
+  if (unit_out === undefined) {
+      unit_out = new abap.types.Character(3, {"qualifiedName":"MSEHI","ddicName":"MSEHI"});
+  }
+  // exporting OUTPUT undefined true
+  let output = INPUT.importing?.output;
+  if (output === undefined) {
+      output = new abap.types.Character(4);
+  }
+  let lv_float = new abap.types.Float({qualifiedName: "F"});
+  if (abap.compare.eq(unit_in, unit_out)) {
+    output.set(input);
+  } else if (abap.compare.eq(unit_in, new abap.types.Character(1).set('G')) && abap.compare.eq(unit_out, new abap.types.Character(2).set('KG'))) {
+    output.set(abap.operators.divide(input,new abap.types.Integer().set(1000)));
+  } else if (abap.compare.eq(unit_in, new abap.types.Character(2).set('M3')) && abap.compare.eq(unit_out, new abap.types.Character(3).set('CDM'))) {
+    output.set(abap.operators.multiply(input,new abap.types.Integer().set(1000)));
+  } else if (abap.compare.eq(unit_in, new abap.types.Character(2).set('LB')) && abap.compare.eq(unit_out, new abap.types.Character(2).set('KG'))) {
+    lv_float.set(new abap.types.Character(10).set('0.45359237'));
+    output.set(abap.operators.multiply(input,lv_float));
+  } else if (abap.compare.eq(unit_in, new abap.types.Character(3).set('FT3')) && abap.compare.eq(unit_out, new abap.types.Character(3).set('CDM'))) {
+    lv_float.set(new abap.types.Character(14).set('28.31684660923'));
+    output.set(abap.operators.multiply(input,lv_float));
+  } else {
+    abap.statements.assert(abap.compare.eq(new abap.types.Integer().set(1), new abap.types.Integer().set(2)));
+  }
+}
+abap.FunctionModules['UNIT_CONVERSION_SIMPLE'] = unit_conversion_simple;
+//# sourceMappingURL=openabap.fugr.unit_conversion_simple.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/parentcl.dtel.mjs.html b/output/parentcl.dtel.mjs.html new file mode 100644 index 00000000000..73e9cf1ff5d --- /dev/null +++ b/output/parentcl.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/parentcl.dtel.mjs + + + + + + + + + +
+
+

All files / output parentcl.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["PARENTCL"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"PARENTCL","ddicName":"PARENTCL"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/progdir.tabl.mjs.html b/output/progdir.tabl.mjs.html new file mode 100644 index 00000000000..6417431c8d2 --- /dev/null +++ b/output/progdir.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/progdir.tabl.mjs + + + + + + + + + +
+
+

All files / output progdir.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["PROGDIR"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"name": new abap.types.Character(40, {}), "state": new abap.types.Character(1, {}), "sqlx": new abap.types.Character(1, {}), "edtx": new abap.types.Character(1, {}), "varcl": new abap.types.Character(1, {}), "dbapl": new abap.types.Character(1, {}), "dbna": new abap.types.Character(2, {}), "clas": new abap.types.Character(4, {}), "type": new abap.types.Character(3, {}), "occurs": new abap.types.Character(1, {}), "subc": new abap.types.Character(1, {}), "appl": new abap.types.Character(1, {}), "secu": new abap.types.Character(8, {}), "cnam": new abap.types.Character(12, {}), "cdat": new abap.types.Date(), "unam": new abap.types.Character(12, {}), "udat": new abap.types.Date(), "vern": new abap.types.Character(6, {}), "levl": new abap.types.Character(4, {}), "rstat": new abap.types.Character(1, {}), "rmand": new abap.types.Character(3, {}), "rload": new abap.types.Character(1, {}), "fixpt": new abap.types.Character(1, {}), "sset": new abap.types.Character(1, {}), "sdate": new abap.types.Date(), "stime": new abap.types.Character(6, {}), "idate": new abap.types.Date(), "itime": new abap.types.Character(6, {}), "ldbname": new abap.types.Character(20, {}), "uccheck": new abap.types.Character(1, {})}, "PROGDIR", "PROGDIR", {}, {}),
+  "keyFields": ["NAME","STATE"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/progname.dtel.mjs.html b/output/progname.dtel.mjs.html new file mode 100644 index 00000000000..50619b7d87b --- /dev/null +++ b/output/progname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/progname.dtel.mjs + + + + + + + + + +
+
+

All files / output progname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["PROGNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(40, {"qualifiedName":"PROGNAME","ddicName":"PROGNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/reposrc.tabl.mjs.html b/output/reposrc.tabl.mjs.html new file mode 100644 index 00000000000..34c3872ea9e --- /dev/null +++ b/output/reposrc.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/reposrc.tabl.mjs + + + + + + + + + +
+
+

All files / output reposrc.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["REPOSRC"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"progname": new abap.types.Character(40, {}), "data": new abap.types.String({qualifiedName: "STRING"}), "unam": new abap.types.Character(12, {}), "udat": new abap.types.Date(), "utime": new abap.types.Time()}, "REPOSRC", "REPOSRC", {}, {}),
+  "keyFields": ["PROGNAME"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/rfcdest.dtel.mjs.html b/output/rfcdest.dtel.mjs.html new file mode 100644 index 00000000000..f185664e6ab --- /dev/null +++ b/output/rfcdest.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/rfcdest.dtel.mjs + + + + + + + + + +
+
+

All files / output rfcdest.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["RFCDEST"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"RFCDEST","ddicName":"RFCDEST"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/rswsourcet.ttyp.mjs.html b/output/rswsourcet.ttyp.mjs.html new file mode 100644 index 00000000000..feca8c6f27b --- /dev/null +++ b/output/rswsourcet.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/rswsourcet.ttyp.mjs + + + + + + + + + +
+
+

All files / output rswsourcet.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["RSWSOURCET"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "RSWSOURCET"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/rzlli_apcl.dtel.mjs.html b/output/rzlli_apcl.dtel.mjs.html new file mode 100644 index 00000000000..c685256a701 --- /dev/null +++ b/output/rzlli_apcl.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/rzlli_apcl.dtel.mjs + + + + + + + + + +
+
+

All files / output rzlli_apcl.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["RZLLI_APCL"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"RZLLI_APCL","ddicName":"RZLLI_APCL"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/salv_s_int4_column.tabl.mjs.html b/output/salv_s_int4_column.tabl.mjs.html new file mode 100644 index 00000000000..8183db977e7 --- /dev/null +++ b/output/salv_s_int4_column.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/salv_s_int4_column.tabl.mjs + + + + + + + + + +
+
+

All files / output salv_s_int4_column.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SALV_S_INT4_COLUMN"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"columnname": new abap.types.Character(30, {}), "value": new abap.types.Integer({qualifiedName: "I"})}, "SALV_S_INT4_COLUMN", "SALV_S_INT4_COLUMN", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/salv_t_int4_column.ttyp.mjs.html b/output/salv_t_int4_column.ttyp.mjs.html new file mode 100644 index 00000000000..e94ab6d8531 --- /dev/null +++ b/output/salv_t_int4_column.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/salv_t_int4_column.ttyp.mjs + + + + + + + + + +
+
+

All files / output salv_t_int4_column.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["SALV_T_INT4_COLUMN"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"columnname": new abap.types.Character(30, {}), "value": new abap.types.Integer({qualifiedName: "I"})}, "SALV_S_INT4_COLUMN", "SALV_S_INT4_COLUMN", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SALV_T_INT4_COLUMN"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sappatchlv.dtel.mjs.html b/output/sappatchlv.dtel.mjs.html new file mode 100644 index 00000000000..3394440e41f --- /dev/null +++ b/output/sappatchlv.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sappatchlv.dtel.mjs + + + + + + + + + +
+
+

All files / output sappatchlv.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SAPPATCHLV"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/saprelease.dtel.mjs.html b/output/saprelease.dtel.mjs.html new file mode 100644 index 00000000000..0d423e2674c --- /dev/null +++ b/output/saprelease.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/saprelease.dtel.mjs + + + + + + + + + +
+
+

All files / output saprelease.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SAPRELEASE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sci_chkv.dtel.mjs.html b/output/sci_chkv.dtel.mjs.html new file mode 100644 index 00000000000..f6e9066c8fb --- /dev/null +++ b/output/sci_chkv.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sci_chkv.dtel.mjs + + + + + + + + + +
+
+

All files / output sci_chkv.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SCI_CHKV"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/scompkdtln.tabl.mjs.html b/output/scompkdtln.tabl.mjs.html new file mode 100644 index 00000000000..df9dd793884 --- /dev/null +++ b/output/scompkdtln.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/scompkdtln.tabl.mjs + + + + + + + + + +
+
+

All files / output scompkdtln.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SCOMPKDTLN"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"devclass": new abap.types.Character(30, {}), "dlvunit": new abap.types.Character(30, {}), "component": new abap.types.Character(20, {}), "ctext": new abap.types.Character(60, {}), "parentcl": new abap.types.Character(30, {}), "pdevclass": new abap.types.Character(4, {}), "as4user": new abap.types.Character(12, {}), "comp_posid": new abap.types.Character(24, {}), "mainpack": new abap.types.Character(1, {}), "created_by": new abap.types.Character(12, {}), "created_on": new abap.types.Date(), "changed_by": new abap.types.Character(12, {}), "changed_on": new abap.types.Date(), "dlvu_text": new abap.types.Character(80, {}), "layer_text": new abap.types.Character(60, {}), "intfprefx": new abap.types.Character(6, {}), "cli_check": new abap.types.Character(1, {}), "namespace": new abap.types.Character(10, {}), "tpclass": new abap.types.Character(1, {}), "korrflag": new abap.types.Character(1, {}), "comp_text": new abap.types.Character(60, {})}, "SCOMPKDTLN", "SCOMPKDTLN", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/scrtext_l.dtel.mjs.html b/output/scrtext_l.dtel.mjs.html new file mode 100644 index 00000000000..7aafa10ba98 --- /dev/null +++ b/output/scrtext_l.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/scrtext_l.dtel.mjs + + + + + + + + + +
+
+

All files / output scrtext_l.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SCRTEXT_L"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(40, {"qualifiedName":"SCRTEXT_L","ddicName":"SCRTEXT_L"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/scrtext_m.dtel.mjs.html b/output/scrtext_m.dtel.mjs.html new file mode 100644 index 00000000000..6a30e927f41 --- /dev/null +++ b/output/scrtext_m.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/scrtext_m.dtel.mjs + + + + + + + + + +
+
+

All files / output scrtext_m.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SCRTEXT_M"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"SCRTEXT_M","ddicName":"SCRTEXT_M"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/scrtext_s.dtel.mjs.html b/output/scrtext_s.dtel.mjs.html new file mode 100644 index 00000000000..8cb61b4d920 --- /dev/null +++ b/output/scrtext_s.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/scrtext_s.dtel.mjs + + + + + + + + + +
+
+

All files / output scrtext_s.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SCRTEXT_S"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(10, {"qualifiedName":"SCRTEXT_S","ddicName":"SCRTEXT_S"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/scx_attrname.dtel.mjs.html b/output/scx_attrname.dtel.mjs.html new file mode 100644 index 00000000000..fe7cb58adbe --- /dev/null +++ b/output/scx_attrname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/scx_attrname.dtel.mjs + + + + + + + + + +
+
+

All files / output scx_attrname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SCX_ATTRNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.String({qualifiedName: "SCX_ATTRNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/scx_t100key.tabl.mjs.html b/output/scx_t100key.tabl.mjs.html new file mode 100644 index 00000000000..14c09a5ab16 --- /dev/null +++ b/output/scx_t100key.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/scx_t100key.tabl.mjs + + + + + + + + + +
+
+

All files / output scx_t100key.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SCX_T100KEY"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"msgid": new abap.types.Character(20, {}), "msgno": new abap.types.Numc({length: 3}), "attr1": new abap.types.Character(255, {}), "attr2": new abap.types.Character(255, {}), "attr3": new abap.types.Character(255, {}), "attr4": new abap.types.Character(255, {})}, "SCX_T100KEY", "SCX_T100KEY", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sdok_class.dtel.mjs.html b/output/sdok_class.dtel.mjs.html new file mode 100644 index 00000000000..572bedff0ee --- /dev/null +++ b/output/sdok_class.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sdok_class.dtel.mjs + + + + + + + + + +
+
+

All files / output sdok_class.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SDOK_CLASS"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}),
+  "domain": "SDOK_CLASS",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sdok_docid.dtel.mjs.html b/output/sdok_docid.dtel.mjs.html new file mode 100644 index 00000000000..6455ab619d7 --- /dev/null +++ b/output/sdok_docid.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sdok_docid.dtel.mjs + + + + + + + + + +
+
+

All files / output sdok_docid.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SDOK_DOCID"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"}),
+  "domain": "SDOK_DOCID",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sdokobject.tabl.mjs.html b/output/sdokobject.tabl.mjs.html new file mode 100644 index 00000000000..36574d94b64 --- /dev/null +++ b/output/sdokobject.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/sdokobject.tabl.mjs + + + + + + + + + +
+
+

All files / output sdokobject.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SDOKOBJECT"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seobusobj.dtel.mjs.html b/output/seobusobj.dtel.mjs.html new file mode 100644 index 00000000000..67d129ebb70 --- /dev/null +++ b/output/seobusobj.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seobusobj.dtel.mjs + + + + + + + + + +
+
+

All files / output seobusobj.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEOBUSOBJ"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"SEOBUSOBJ","ddicName":"SEOBUSOBJ"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seoc.type.mjs.html b/output/seoc.type.mjs.html new file mode 100644 index 00000000000..7593aad92bb --- /dev/null +++ b/output/seoc.type.mjs.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for output/seoc.type.mjs + + + + + + + + + +
+
+

All files / output seoc.type.mjs

+
+ +
+ 100% + Statements + 19/19 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 19/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +191x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const pool = {};
+pool['seoc_version_inactive'] = new abap.types.Numc();
+pool['seoc_version_inactive'].set('0');
+pool['seoc_version_active'] = new abap.types.Numc();
+pool['seoc_version_active'].set('1');
+pool['seoc_exposure_public'] = new abap.types.Numc();
+pool['seoc_exposure_public'].set('2');
+pool['seoc_exposure_protected'] = new abap.types.Numc();
+pool['seoc_exposure_protected'].set('1');
+pool['seoc_exposure_private'] = new abap.types.Numc();
+pool['seoc_exposure_private'].set('0');
+pool['seoc_state_implemented'] = new abap.types.Numc();
+pool['seoc_state_implemented'].set('1');
+pool['seoc_category_exception'] = new abap.types.Numc({length: 2});
+pool['seoc_category_exception'].set(40);
+pool['seoc_category_webdynpro_class'] = new abap.types.Numc({length: 2});
+pool['seoc_category_webdynpro_class'].set(80);
+abap.TypePools['SEOC'] = pool;
+//# sourceMappingURL=seoc.type.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seoclskey.tabl.mjs.html b/output/seoclskey.tabl.mjs.html new file mode 100644 index 00000000000..aa048d649ca --- /dev/null +++ b/output/seoclskey.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/seoclskey.tabl.mjs + + + + + + + + + +
+
+

All files / output seoclskey.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SEOCLSKEY"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seoclsname.dtel.mjs.html b/output/seoclsname.dtel.mjs.html new file mode 100644 index 00000000000..da2452f0b82 --- /dev/null +++ b/output/seoclsname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seoclsname.dtel.mjs + + + + + + + + + +
+
+

All files / output seoclsname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEOCLSNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seocmpname.dtel.mjs.html b/output/seocmpname.dtel.mjs.html new file mode 100644 index 00000000000..8fc354ae970 --- /dev/null +++ b/output/seocmpname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seocmpname.dtel.mjs + + + + + + + + + +
+
+

All files / output seocmpname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEOCMPNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seocmptype.dtel.mjs.html b/output/seocmptype.dtel.mjs.html new file mode 100644 index 00000000000..33959c6b651 --- /dev/null +++ b/output/seocmptype.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seocmptype.dtel.mjs + + + + + + + + + +
+
+

All files / output seocmptype.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEOCMPTYPE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Numc({qualifiedName: "SEOCMPTYPE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seocompo.tabl.mjs.html b/output/seocompo.tabl.mjs.html new file mode 100644 index 00000000000..f15e6927298 --- /dev/null +++ b/output/seocompo.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/seocompo.tabl.mjs + + + + + + + + + +
+
+

All files / output seocompo.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SEOCOMPO"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"clsname": new abap.types.Character(30, {}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "cmptype": new abap.types.Numc({qualifiedName: "SEOCMPTYPE"}), "mtdtype": new abap.types.Numc()}, "SEOCOMPO", "SEOCOMPO", {}, {}),
+  "keyFields": ["CLSNAME","CMPNAME"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seocompotx.tabl.mjs.html b/output/seocompotx.tabl.mjs.html new file mode 100644 index 00000000000..599f3495dba --- /dev/null +++ b/output/seocompotx.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/seocompotx.tabl.mjs + + + + + + + + + +
+
+

All files / output seocompotx.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SEOCOMPOTX"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "langu": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "descript": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"})}, "SEOCOMPOTX", "SEOCOMPOTX", {}, {}),
+  "keyFields": ["CLSNAME","CMPNAME","LANGU"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seodescr.dtel.mjs.html b/output/seodescr.dtel.mjs.html new file mode 100644 index 00000000000..12d34e05503 --- /dev/null +++ b/output/seodescr.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seodescr.dtel.mjs + + + + + + + + + +
+
+

All files / output seodescr.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEODESCR"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seoexpose.dtel.mjs.html b/output/seoexpose.dtel.mjs.html new file mode 100644 index 00000000000..69db78372b2 --- /dev/null +++ b/output/seoexpose.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seoexpose.dtel.mjs + + + + + + + + + +
+
+

All files / output seoexpose.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEOEXPOSE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Numc({qualifiedName: "SEOEXPOSE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seokeyfld.dtel.mjs.html b/output/seokeyfld.dtel.mjs.html new file mode 100644 index 00000000000..b2661a8571c --- /dev/null +++ b/output/seokeyfld.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seokeyfld.dtel.mjs + + + + + + + + + +
+
+

All files / output seokeyfld.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEOKEYFLD"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"SEOKEYFLD","ddicName":"SEOKEYFLD"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seoo.type.mjs.html b/output/seoo.type.mjs.html new file mode 100644 index 00000000000..d1eabffa76c --- /dev/null +++ b/output/seoo.type.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/seoo.type.mjs + + + + + + + + + +
+
+

All files / output seoo.type.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const pool = {};
+pool['seoo_cmptype_attribute'] = new abap.types.Numc();
+pool['seoo_cmptype_attribute'].set('0');
+pool['seoo_cmptype_method'] = new abap.types.Numc();
+pool['seoo_cmptype_method'].set('1');
+pool['seoo_cmptype_event'] = new abap.types.Numc();
+pool['seoo_cmptype_event'].set('2');
+pool['seoo_cmptype_type'] = new abap.types.Numc();
+pool['seoo_cmptype_type'].set('3');
+abap.TypePools['SEOO'] = pool;
+//# sourceMappingURL=seoo.type.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seop.type.mjs.html b/output/seop.type.mjs.html new file mode 100644 index 00000000000..b485e355f6b --- /dev/null +++ b/output/seop.type.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/seop.type.mjs + + + + + + + + + +
+
+

All files / output seop.type.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const pool = {};
+pool['seop_ext_class_locals_def'] = new abap.types.Character(5, {});
+pool['seop_ext_class_locals_def'].set('CCDEF');
+pool['seop_ext_class_locals_imp'] = new abap.types.Character(5, {});
+pool['seop_ext_class_locals_imp'].set('CCIMP');
+pool['seop_ext_class_macros'] = new abap.types.Character(5, {});
+pool['seop_ext_class_macros'].set('CCMAC');
+pool['seop_ext_class_testclasses'] = new abap.types.Character(5, {});
+pool['seop_ext_class_testclasses'].set('CCAU');
+abap.TypePools['SEOP'] = pool;
+//# sourceMappingURL=seop.type.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seos.type.mjs.html b/output/seos.type.mjs.html new file mode 100644 index 00000000000..2bb8f50fd9d --- /dev/null +++ b/output/seos.type.mjs.html @@ -0,0 +1,103 @@ + + + + + + Code coverage report for output/seos.type.mjs + + + + + + + + + +
+
+

All files / output seos.type.mjs

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +71x +1x +1x +1x +1x +1x +1x
const pool = {};
+pool['seos_scotype_parameter'] = new abap.types.Numc();
+pool['seos_scotype_parameter'].set('0');
+pool['seos_scotype_exception'] = new abap.types.Numc();
+pool['seos_scotype_exception'].set('1');
+abap.TypePools['SEOS'] = pool;
+//# sourceMappingURL=seos.type.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seosconame.dtel.mjs.html b/output/seosconame.dtel.mjs.html new file mode 100644 index 00000000000..053707faf5b --- /dev/null +++ b/output/seosconame.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seosconame.dtel.mjs + + + + + + + + + +
+
+

All files / output seosconame.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEOSCONAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"SEOSCONAME","ddicName":"SEOSCONAME"}),
+  "domain": "CHAR30",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seoscotype.dtel.mjs.html b/output/seoscotype.dtel.mjs.html new file mode 100644 index 00000000000..8c5c26a247b --- /dev/null +++ b/output/seoscotype.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/seoscotype.dtel.mjs + + + + + + + + + +
+
+

All files / output seoscotype.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SEOSCOTYPE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Numc({qualifiedName: "SEOSCOTYPE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seosubco.tabl.mjs.html b/output/seosubco.tabl.mjs.html new file mode 100644 index 00000000000..96741479a1d --- /dev/null +++ b/output/seosubco.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/seosubco.tabl.mjs + + + + + + + + + +
+
+

All files / output seosubco.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SEOSUBCO"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"clsname": new abap.types.Character(30, {}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "sconame": new abap.types.Character(30, {"qualifiedName":"SEOSCONAME","ddicName":"SEOSCONAME"}), "cmptype": new abap.types.Numc({qualifiedName: "SEOCMPTYPE"}), "mtdtype": new abap.types.Numc(), "scotype": new abap.types.Numc({qualifiedName: "SEOSCOTYPE"})}, "SEOSUBCO", "SEOSUBCO", {}, {}),
+  "keyFields": ["CLSNAME","CMPNAME","SCONAME"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seosubcotx.tabl.mjs.html b/output/seosubcotx.tabl.mjs.html new file mode 100644 index 00000000000..7cea72cbacc --- /dev/null +++ b/output/seosubcotx.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/seosubcotx.tabl.mjs + + + + + + + + + +
+
+

All files / output seosubcotx.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SEOSUBCOTX"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "sconame": new abap.types.Character(30, {"qualifiedName":"SEOSCONAME","ddicName":"SEOSCONAME"}), "langu": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "descript": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"})}, "SEOSUBCOTX", "SEOSUBCOTX", {}, {}),
+  "keyFields": ["CLSNAME","CMPNAME","SCONAME","LANGU"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/seox.type.mjs.html b/output/seox.type.mjs.html new file mode 100644 index 00000000000..3ddda0df895 --- /dev/null +++ b/output/seox.type.mjs.html @@ -0,0 +1,103 @@ + + + + + + Code coverage report for output/seox.type.mjs + + + + + + + + + +
+
+

All files / output seox.type.mjs

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +71x +1x +1x +1x +1x +1x +1x
const pool = {};
+pool['seox_true'] = new abap.types.Character(1, {});
+pool['seox_true'].set('X');
+pool['seox_false'] = new abap.types.Character(1, {});
+pool['seox_false'].set(' ');
+abap.TypePools['SEOX'] = pool;
+//# sourceMappingURL=seox.type.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_affect_server.dtel.mjs.html b/output/shm_affect_server.dtel.mjs.html new file mode 100644 index 00000000000..744890ef494 --- /dev/null +++ b/output/shm_affect_server.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_affect_server.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_affect_server.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_AFFECT_SERVER"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "SHM_AFFECT_SERVER"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_area_name.dtel.mjs.html b/output/shm_area_name.dtel.mjs.html new file mode 100644 index 00000000000..9833c95d72d --- /dev/null +++ b/output/shm_area_name.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_area_name.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_area_name.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_AREA_NAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_attach_mode.dtel.mjs.html b/output/shm_attach_mode.dtel.mjs.html new file mode 100644 index 00000000000..6d74f62b22b --- /dev/null +++ b/output/shm_attach_mode.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_attach_mode.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_attach_mode.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_ATTACH_MODE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "SHM_ATTACH_MODE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_auto_build_class_name.dtel.mjs.html b/output/shm_auto_build_class_name.dtel.mjs.html new file mode 100644 index 00000000000..944a1be6b5e --- /dev/null +++ b/output/shm_auto_build_class_name.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_auto_build_class_name.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_auto_build_class_name.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_AUTO_BUILD_CLASS_NAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"SHM_AUTO_BUILD_CLASS_NAME","ddicName":"SHM_AUTO_BUILD_CLASS_NAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_client.dtel.mjs.html b/output/shm_client.dtel.mjs.html new file mode 100644 index 00000000000..4e0eb973f65 --- /dev/null +++ b/output/shm_client.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_client.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_client.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_CLIENT"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(3, {"qualifiedName":"SHM_CLIENT","ddicName":"SHM_CLIENT"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_constr_invocation_mode.dtel.mjs.html b/output/shm_constr_invocation_mode.dtel.mjs.html new file mode 100644 index 00000000000..ca3b56710ee --- /dev/null +++ b/output/shm_constr_invocation_mode.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_constr_invocation_mode.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_constr_invocation_mode.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_CONSTR_INVOCATION_MODE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "SHM_CONSTR_INVOCATION_MODE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_inst_info.tabl.mjs.html b/output/shm_inst_info.tabl.mjs.html new file mode 100644 index 00000000000..a6b96783de8 --- /dev/null +++ b/output/shm_inst_info.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/shm_inst_info.tabl.mjs + + + + + + + + + +
+
+

All files / output shm_inst_info.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SHM_INST_INFO"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"client": new abap.types.Character(3, {"qualifiedName":"MANDT","ddicName":"MANDT"}), "name": new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"})}, "SHM_INST_INFO", "SHM_INST_INFO", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_inst_infos.ttyp.mjs.html b/output/shm_inst_infos.ttyp.mjs.html new file mode 100644 index 00000000000..b851d677b63 --- /dev/null +++ b/output/shm_inst_infos.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/shm_inst_infos.ttyp.mjs + + + + + + + + + +
+
+

All files / output shm_inst_infos.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["SHM_INST_INFOS"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"client": new abap.types.Character(3, {"qualifiedName":"MANDT","ddicName":"MANDT"}), "name": new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"})}, "SHM_INST_INFO", "SHM_INST_INFO", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SHM_INST_INFOS"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_inst_name.dtel.mjs.html b/output/shm_inst_name.dtel.mjs.html new file mode 100644 index 00000000000..114ef44a892 --- /dev/null +++ b/output/shm_inst_name.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_inst_name.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_inst_name.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_INST_NAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(80, {"qualifiedName":"SHM_INST_NAME","ddicName":"SHM_INST_NAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_life_context.dtel.mjs.html b/output/shm_life_context.dtel.mjs.html new file mode 100644 index 00000000000..cecb6e5fa81 --- /dev/null +++ b/output/shm_life_context.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_life_context.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_life_context.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_LIFE_CONTEXT"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "SHM_LIFE_CONTEXT"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_properties.tabl.mjs.html b/output/shm_properties.tabl.mjs.html new file mode 100644 index 00000000000..7f6ebbfdfa4 --- /dev/null +++ b/output/shm_properties.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/shm_properties.tabl.mjs + + + + + + + + + +
+
+

All files / output shm_properties.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SHM_PROPERTIES"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"auto_build": new abap.types.Character(1, {}), "has_versions": new abap.types.Character(1, {})}, "SHM_PROPERTIES", "SHM_PROPERTIES", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shm_rc.dtel.mjs.html b/output/shm_rc.dtel.mjs.html new file mode 100644 index 00000000000..1a36574cb2d --- /dev/null +++ b/output/shm_rc.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shm_rc.dtel.mjs + + + + + + + + + +
+
+

All files / output shm_rc.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHM_RC"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "SHM_RC"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shma_attributes.tabl.mjs.html b/output/shma_attributes.tabl.mjs.html new file mode 100644 index 00000000000..4e84d077e63 --- /dev/null +++ b/output/shma_attributes.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/shma_attributes.tabl.mjs + + + + + + + + + +
+
+

All files / output shma_attributes.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SHMA_ATTRIBUTES"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"area_name": new abap.types.Character(30, {"qualifiedName":"SHM_AREA_NAME","ddicName":"SHM_AREA_NAME"}), "properties": new abap.types.Structure({"auto_build": new abap.types.Character(1, {}), "has_versions": new abap.types.Character(1, {})}, "SHM_PROPERTIES", "SHM_PROPERTIES", {}, {}), "auto_build": new abap.types.Character(1, {}), "has_versions": new abap.types.Character(1, {})}, "SHMA_ATTRIBUTES", "SHMA_ATTRIBUTES", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shma_client.dtel.mjs.html b/output/shma_client.dtel.mjs.html new file mode 100644 index 00000000000..e60070eeed0 --- /dev/null +++ b/output/shma_client.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shma_client.dtel.mjs + + + + + + + + + +
+
+

All files / output shma_client.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHMA_CLIENT"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(3, {"qualifiedName":"SHMA_CLIENT","ddicName":"SHMA_CLIENT"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/shmm_trc_variant_name.dtel.mjs.html b/output/shmm_trc_variant_name.dtel.mjs.html new file mode 100644 index 00000000000..0fd36280c28 --- /dev/null +++ b/output/shmm_trc_variant_name.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/shmm_trc_variant_name.dtel.mjs + + + + + + + + + +
+
+

All files / output shmm_trc_variant_name.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SHMM_TRC_VARIANT_NAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"SHMM_TRC_VARIANT_NAME","ddicName":"SHMM_TRC_VARIANT_NAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/skwf_io.tabl.mjs.html b/output/skwf_io.tabl.mjs.html new file mode 100644 index 00000000000..6b3fda3b8a8 --- /dev/null +++ b/output/skwf_io.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/skwf_io.tabl.mjs + + + + + + + + + +
+
+

All files / output skwf_io.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SKWF_IO"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"objtype": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}), "object": new abap.types.Structure({"class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SDOKOBJECT", "SDOKOBJECT", {}, {}), "class": new abap.types.Character(10, {"qualifiedName":"SDOK_CLASS","ddicName":"SDOK_CLASS"}), "objid": new abap.types.Character(32, {"qualifiedName":"SDOK_DOCID","ddicName":"SDOK_DOCID"})}, "SKWF_IO", "SKWF_IO", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/skwf_ioty.dtel.mjs.html b/output/skwf_ioty.dtel.mjs.html new file mode 100644 index 00000000000..d36b3513009 --- /dev/null +++ b/output/skwf_ioty.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/skwf_ioty.dtel.mjs + + + + + + + + + +
+
+

All files / output skwf_ioty.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SKWF_IOTY"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"SKWF_IOTY","ddicName":"SKWF_IOTY"}),
+  "domain": "SKWF_IOTY",
+  "fixedValues": [{"description":"Undefined (= all)","language":"E"},{"description":"Directory","low":"F","language":"E"},{"description":"LOIO","low":"L","language":"E"},{"description":"PHIO","low":"P","language":"E"},{"description":"Relationship","low":"R","language":"E"}],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/so_raw255.dtel.mjs.html b/output/so_raw255.dtel.mjs.html new file mode 100644 index 00000000000..b427b3fac66 --- /dev/null +++ b/output/so_raw255.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/so_raw255.dtel.mjs + + + + + + + + + +
+
+

All files / output so_raw255.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SO_RAW255"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Hex({length: 255}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/so_text255.dtel.mjs.html b/output/so_text255.dtel.mjs.html new file mode 100644 index 00000000000..bc084f21d2d --- /dev/null +++ b/output/so_text255.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/so_text255.dtel.mjs + + + + + + + + + +
+
+

All files / output so_text255.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SO_TEXT255"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(255, {"qualifiedName":"SO_TEXT255","ddicName":"SO_TEXT255"}),
+  "domain": "SO_TEXT255",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sobj_name.dtel.mjs.html b/output/sobj_name.dtel.mjs.html new file mode 100644 index 00000000000..59ae5c23905 --- /dev/null +++ b/output/sobj_name.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sobj_name.dtel.mjs + + + + + + + + + +
+
+

All files / output sobj_name.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SOBJ_NAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(40, {"qualifiedName":"SOBJ_NAME","ddicName":"SOBJ_NAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/soli.tabl.mjs.html b/output/soli.tabl.mjs.html new file mode 100644 index 00000000000..c326ca44af2 --- /dev/null +++ b/output/soli.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/soli.tabl.mjs + + + + + + + + + +
+
+

All files / output soli.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SOLI"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"line": new abap.types.Character(255, {"qualifiedName":"SO_TEXT255","ddicName":"SO_TEXT255"})}, "SOLI", "SOLI", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/soli_tab.ttyp.mjs.html b/output/soli_tab.ttyp.mjs.html new file mode 100644 index 00000000000..06d9e7b8cbc --- /dev/null +++ b/output/soli_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/soli_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output soli_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["SOLI_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"line": new abap.types.Character(255, {"qualifiedName":"SO_TEXT255","ddicName":"SO_TEXT255"})}, "SOLI", "SOLI", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SOLI_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/solix.tabl.mjs.html b/output/solix.tabl.mjs.html new file mode 100644 index 00000000000..951e2e6aeab --- /dev/null +++ b/output/solix.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/solix.tabl.mjs + + + + + + + + + +
+
+

All files / output solix.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SOLIX"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"line": new abap.types.Hex({length: 255})}, "SOLIX", "SOLIX", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/solix_tab.ttyp.mjs.html b/output/solix_tab.ttyp.mjs.html new file mode 100644 index 00000000000..03e9537e80e --- /dev/null +++ b/output/solix_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/solix_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output solix_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["SOLIX_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"line": new abap.types.Hex({length: 255})}, "SOLIX", "SOLIX", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SOLIX_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sotr_conc.dtel.mjs.html b/output/sotr_conc.dtel.mjs.html new file mode 100644 index 00000000000..f0ca8d546f6 --- /dev/null +++ b/output/sotr_conc.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sotr_conc.dtel.mjs + + + + + + + + + +
+
+

All files / output sotr_conc.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SOTR_CONC"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"SOTR_CONC","ddicName":"SOTR_CONC"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/spras.dtel.mjs.html b/output/spras.dtel.mjs.html new file mode 100644 index 00000000000..d808c42ca0e --- /dev/null +++ b/output/spras.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/spras.dtel.mjs + + + + + + + + + +
+
+

All files / output spras.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SPRAS"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/ssfapplssl.dtel.mjs.html b/output/ssfapplssl.dtel.mjs.html new file mode 100644 index 00000000000..fb1aed1f752 --- /dev/null +++ b/output/ssfapplssl.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/ssfapplssl.dtel.mjs + + + + + + + + + +
+
+

All files / output ssfapplssl.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SSFAPPLSSL"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(6, {"qualifiedName":"SSFAPPLSSL","ddicName":"SSFAPPLSSL"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sstmnt.tabl.mjs.html b/output/sstmnt.tabl.mjs.html new file mode 100644 index 00000000000..9eaa6debb5e --- /dev/null +++ b/output/sstmnt.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/sstmnt.tabl.mjs + + + + + + + + + +
+
+

All files / output sstmnt.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SSTMNT"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"level": new abap.types.Integer({qualifiedName: "I"}), "struc": new abap.types.Integer({qualifiedName: "I"}), "from": new abap.types.Integer({qualifiedName: "I"}), "to": new abap.types.Integer({qualifiedName: "I"}), "number": new abap.types.Integer({qualifiedName: "I"}), "colonrow": new abap.types.Integer({qualifiedName: "I"}), "trow": new abap.types.Integer({qualifiedName: "I"}), "coloncol": new abap.types.Integer({qualifiedName: "I"}), "tcol": new abap.types.Integer({qualifiedName: "I"}), "prefixlen": new abap.types.Integer({qualifiedName: "I"}), "type": new abap.types.Character(1, {}), "terminator": new abap.types.Character(1, {}), "enhmt": new abap.types.Integer({qualifiedName: "I"})}, "SSTMNT", "SSTMNT", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sstmnt_tab.ttyp.mjs.html b/output/sstmnt_tab.ttyp.mjs.html new file mode 100644 index 00000000000..d54a0eb4ea6 --- /dev/null +++ b/output/sstmnt_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/sstmnt_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output sstmnt_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["SSTMNT_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"level": new abap.types.Integer({qualifiedName: "I"}), "struc": new abap.types.Integer({qualifiedName: "I"}), "from": new abap.types.Integer({qualifiedName: "I"}), "to": new abap.types.Integer({qualifiedName: "I"}), "number": new abap.types.Integer({qualifiedName: "I"}), "colonrow": new abap.types.Integer({qualifiedName: "I"}), "trow": new abap.types.Integer({qualifiedName: "I"}), "coloncol": new abap.types.Integer({qualifiedName: "I"}), "tcol": new abap.types.Integer({qualifiedName: "I"}), "prefixlen": new abap.types.Integer({qualifiedName: "I"}), "type": new abap.types.Character(1, {}), "terminator": new abap.types.Character(1, {}), "enhmt": new abap.types.Integer({qualifiedName: "I"})}, "SSTMNT", "SSTMNT", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SSTMNT_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sstruc.tabl.mjs.html b/output/sstruc.tabl.mjs.html new file mode 100644 index 00000000000..cf68fe5ffdd --- /dev/null +++ b/output/sstruc.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/sstruc.tabl.mjs + + + + + + + + + +
+
+

All files / output sstruc.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SSTRUC"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"type": new abap.types.Character(1, {}), "stmnt_type": new abap.types.Character(1, {}), "key_start": new abap.types.Character(1, {}), "key_end": new abap.types.Character(1, {}), "stmnt_from": new abap.types.Integer({qualifiedName: "I"}), "stmnt_to": new abap.types.Integer({qualifiedName: "I"}), "struc_from": new abap.types.Integer({qualifiedName: "I"}), "struc_to": new abap.types.Integer({qualifiedName: "I"}), "back": new abap.types.Integer({qualifiedName: "I"})}, "SSTRUC", "SSTRUC", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sstruc_tab.ttyp.mjs.html b/output/sstruc_tab.ttyp.mjs.html new file mode 100644 index 00000000000..a4ca82a27be --- /dev/null +++ b/output/sstruc_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/sstruc_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output sstruc_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["SSTRUC_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(1, {}), "stmnt_type": new abap.types.Character(1, {}), "key_start": new abap.types.Character(1, {}), "key_end": new abap.types.Character(1, {}), "stmnt_from": new abap.types.Integer({qualifiedName: "I"}), "stmnt_to": new abap.types.Integer({qualifiedName: "I"}), "struc_from": new abap.types.Integer({qualifiedName: "I"}), "struc_to": new abap.types.Integer({qualifiedName: "I"}), "back": new abap.types.Integer({qualifiedName: "I"})}, "SSTRUC", "SSTRUC", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SSTRUC_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/stokes.tabl.mjs.html b/output/stokes.tabl.mjs.html new file mode 100644 index 00000000000..159de9caa25 --- /dev/null +++ b/output/stokes.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/stokes.tabl.mjs + + + + + + + + + +
+
+

All files / output stokes.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["STOKES"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"str": new abap.types.String({qualifiedName: "STRING"}), "row": new abap.types.Integer({qualifiedName: "I"}), "col": new abap.types.Integer({qualifiedName: "I"}), "type": new abap.types.Character(1, {})}, "STOKES", "STOKES", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/stokes_tab.ttyp.mjs.html b/output/stokes_tab.ttyp.mjs.html new file mode 100644 index 00000000000..b40a01f8801 --- /dev/null +++ b/output/stokes_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/stokes_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output stokes_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["STOKES_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"str": new abap.types.String({qualifiedName: "STRING"}), "row": new abap.types.Integer({qualifiedName: "I"}), "col": new abap.types.Integer({qualifiedName: "I"}), "type": new abap.types.Character(1, {})}, "STOKES", "STOKES", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STOKES_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/stokesx.tabl.mjs.html b/output/stokesx.tabl.mjs.html new file mode 100644 index 00000000000..d0d0d669568 --- /dev/null +++ b/output/stokesx.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/stokesx.tabl.mjs + + + + + + + + + +
+
+

All files / output stokesx.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["STOKESX"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"str": new abap.types.String({qualifiedName: "STRING"}), "row": new abap.types.Integer({qualifiedName: "I"}), "off2": new abap.types.Integer({qualifiedName: "I"}), "off3": new abap.types.Integer({qualifiedName: "I"}), "col": new abap.types.Integer({qualifiedName: "I"}), "len1": new abap.types.Integer({qualifiedName: "I"}), "len2": new abap.types.Integer({qualifiedName: "I"}), "len3": new abap.types.Integer({qualifiedName: "I"}), "type": new abap.types.Character(1, {})}, "STOKESX", "STOKESX", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/string_table.ttyp.mjs.html b/output/string_table.ttyp.mjs.html new file mode 100644 index 00000000000..0d9e0395410 --- /dev/null +++ b/output/string_table.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/string_table.ttyp.mjs + + + + + + + + + +
+
+

All files / output string_table.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["STRING_TABLE"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/stringtab.ttyp.mjs.html b/output/stringtab.ttyp.mjs.html new file mode 100644 index 00000000000..18c2dd8b72d --- /dev/null +++ b/output/stringtab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/stringtab.ttyp.mjs + + + + + + + + + +
+
+

All files / output stringtab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["STRINGTAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRINGTAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/submatch_result.tabl.mjs.html b/output/submatch_result.tabl.mjs.html new file mode 100644 index 00000000000..0a9eb10b207 --- /dev/null +++ b/output/submatch_result.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/submatch_result.tabl.mjs + + + + + + + + + +
+
+

All files / output submatch_result.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SUBMATCH_RESULT"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"offset": new abap.types.Integer({qualifiedName: "I"}), "length": new abap.types.Integer({qualifiedName: "I"})}, "SUBMATCH_RESULT", "SUBMATCH_RESULT", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/submatch_result_tab.ttyp.mjs.html b/output/submatch_result_tab.ttyp.mjs.html new file mode 100644 index 00000000000..6a5434035d4 --- /dev/null +++ b/output/submatch_result_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/submatch_result_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output submatch_result_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["SUBMATCH_RESULT_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"offset": new abap.types.Integer({qualifiedName: "I"}), "length": new abap.types.Integer({qualifiedName: "I"})}, "SUBMATCH_RESULT", "SUBMATCH_RESULT", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "SUBMATCH_RESULT_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sxco_fm_name.dtel.mjs.html b/output/sxco_fm_name.dtel.mjs.html new file mode 100644 index 00000000000..0976fd040f7 --- /dev/null +++ b/output/sxco_fm_name.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sxco_fm_name.dtel.mjs + + + + + + + + + +
+
+

All files / output sxco_fm_name.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SXCO_FM_NAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"SXCO_FM_NAME","ddicName":"SXCO_FM_NAME"}),
+  "domain": "",
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sxco_transport.dtel.mjs.html b/output/sxco_transport.dtel.mjs.html new file mode 100644 index 00000000000..fe5747d6507 --- /dev/null +++ b/output/sxco_transport.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sxco_transport.dtel.mjs + + + + + + + + + +
+
+

All files / output sxco_transport.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SXCO_TRANSPORT"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"SXCO_TRANSPORT","ddicName":"SXCO_TRANSPORT"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sydate.dtel.mjs.html b/output/sydate.dtel.mjs.html new file mode 100644 index 00000000000..aed8a559a16 --- /dev/null +++ b/output/sydate.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sydate.dtel.mjs + + + + + + + + + +
+
+

All files / output sydate.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYDATE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Date({qualifiedName: "SYDATE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/symsg.tabl.mjs.html b/output/symsg.tabl.mjs.html new file mode 100644 index 00000000000..9fa1728821b --- /dev/null +++ b/output/symsg.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/symsg.tabl.mjs + + + + + + + + + +
+
+

All files / output symsg.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["SYMSG"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"msgty": new abap.types.Character(1, {}), "msgid": new abap.types.Character(20, {}), "msgno": new abap.types.Numc({length: 3}), "msgv1": new abap.types.Character(50, {}), "msgv2": new abap.types.Character(50, {}), "msgv3": new abap.types.Character(50, {}), "msgv4": new abap.types.Character(50, {})}, "SYMSG", "SYMSG", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/symsgid.dtel.mjs.html b/output/symsgid.dtel.mjs.html new file mode 100644 index 00000000000..39d7a2c18da --- /dev/null +++ b/output/symsgid.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/symsgid.dtel.mjs + + + + + + + + + +
+
+

All files / output symsgid.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYMSGID"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"SYMSGID","ddicName":"SYMSGID"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/symsgno.dtel.mjs.html b/output/symsgno.dtel.mjs.html new file mode 100644 index 00000000000..f2044adf3f2 --- /dev/null +++ b/output/symsgno.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/symsgno.dtel.mjs + + + + + + + + + +
+
+

All files / output symsgno.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYMSGNO"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Numc({length: 3, qualifiedName: "SYMSGNO"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/symsgty.dtel.mjs.html b/output/symsgty.dtel.mjs.html new file mode 100644 index 00000000000..160688d0e13 --- /dev/null +++ b/output/symsgty.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/symsgty.dtel.mjs + + + + + + + + + +
+
+

All files / output symsgty.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYMSGTY"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"SYMSGTY","ddicName":"SYMSGTY"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/symsgv.dtel.mjs.html b/output/symsgv.dtel.mjs.html new file mode 100644 index 00000000000..c3ea4661073 --- /dev/null +++ b/output/symsgv.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/symsgv.dtel.mjs + + + + + + + + + +
+
+

All files / output symsgv.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYMSGV"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(50, {"qualifiedName":"SYMSGV","ddicName":"SYMSGV"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/syrepid.dtel.mjs.html b/output/syrepid.dtel.mjs.html new file mode 100644 index 00000000000..93f8a181936 --- /dev/null +++ b/output/syrepid.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/syrepid.dtel.mjs + + + + + + + + + +
+
+

All files / output syrepid.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYREPID"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(40, {"qualifiedName":"SYREPID","ddicName":"SYREPID"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/syst_host.dtel.mjs.html b/output/syst_host.dtel.mjs.html new file mode 100644 index 00000000000..eeece650a08 --- /dev/null +++ b/output/syst_host.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/syst_host.dtel.mjs + + + + + + + + + +
+
+

All files / output syst_host.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYST_HOST"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"SYST_HOST","ddicName":"SYST_HOST"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sysubrc.dtel.mjs.html b/output/sysubrc.dtel.mjs.html new file mode 100644 index 00000000000..b8c38a63d59 --- /dev/null +++ b/output/sysubrc.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sysubrc.dtel.mjs + + + + + + + + + +
+
+

All files / output sysubrc.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYSUBRC"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Integer({qualifiedName: "SYSUBRC"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sysuuid_c32.dtel.mjs.html b/output/sysuuid_c32.dtel.mjs.html new file mode 100644 index 00000000000..c4ef2e25fd8 --- /dev/null +++ b/output/sysuuid_c32.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sysuuid_c32.dtel.mjs + + + + + + + + + +
+
+

All files / output sysuuid_c32.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYSUUID_C32"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(32, {"qualifiedName":"SYSUUID_C32","ddicName":"SYSUUID_C32"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sysuuid_c36.dtel.mjs.html b/output/sysuuid_c36.dtel.mjs.html new file mode 100644 index 00000000000..b7cb011c390 --- /dev/null +++ b/output/sysuuid_c36.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sysuuid_c36.dtel.mjs + + + + + + + + + +
+
+

All files / output sysuuid_c36.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYSUUID_C36"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(36, {"qualifiedName":"SYSUUID_C36","ddicName":"SYSUUID_C36"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/sysuuid_x16.dtel.mjs.html b/output/sysuuid_x16.dtel.mjs.html new file mode 100644 index 00000000000..97b871203cf --- /dev/null +++ b/output/sysuuid_x16.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/sysuuid_x16.dtel.mjs + + + + + + + + + +
+
+

All files / output sysuuid_x16.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYSUUID_X16"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Hex({length: 16}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/syuname.dtel.mjs.html b/output/syuname.dtel.mjs.html new file mode 100644 index 00000000000..082a339d209 --- /dev/null +++ b/output/syuname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/syuname.dtel.mjs + + + + + + + + + +
+
+

All files / output syuname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["SYUNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/t000.tabl.mjs.html b/output/t000.tabl.mjs.html new file mode 100644 index 00000000000..b848a4029bf --- /dev/null +++ b/output/t000.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/t000.tabl.mjs + + + + + + + + + +
+
+

All files / output t000.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["T000"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"mandt": new abap.types.Character(3, {}), "cccategory": new abap.types.Character(1, {}), "ccnocliind": new abap.types.Character(1, {})}, "T000", "T000", {}, {}),
+  "keyFields": ["MANDT"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/t100.tabl.mjs.html b/output/t100.tabl.mjs.html new file mode 100644 index 00000000000..cb36b79e8de --- /dev/null +++ b/output/t100.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/t100.tabl.mjs + + + + + + + + + +
+
+

All files / output t100.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["T100"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"sprsl": new abap.types.Character(1, {}), "arbgb": new abap.types.Character(20, {}), "msgnr": new abap.types.Character(3, {}), "text": new abap.types.Character(73, {})}, "T100", "T100", {}, {}),
+  "keyFields": ["SPRSL","ARBGB","MSGNR"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tabfdpos.dtel.mjs.html b/output/tabfdpos.dtel.mjs.html new file mode 100644 index 00000000000..e0b4f23faed --- /dev/null +++ b/output/tabfdpos.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/tabfdpos.dtel.mjs + + + + + + + + + +
+
+

All files / output tabfdpos.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TABFDPOS"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Numc({length: 4, qualifiedName: "TABFDPOS"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tabname.dtel.mjs.html b/output/tabname.dtel.mjs.html new file mode 100644 index 00000000000..ebc0ef3ac5f --- /dev/null +++ b/output/tabname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/tabname.dtel.mjs + + + + + + + + + +
+
+

All files / output tabname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TABNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"TABNAME","ddicName":"TABNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tadir.tabl.mjs.html b/output/tadir.tabl.mjs.html new file mode 100644 index 00000000000..d123fda71c3 --- /dev/null +++ b/output/tadir.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/tadir.tabl.mjs + + + + + + + + + +
+
+

All files / output tadir.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["TADIR"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"pgmid": new abap.types.Character(4, {}), "object": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {}), "korrnum": new abap.types.Character(10, {}), "delflag": new abap.types.Character(1, {}), "genflag": new abap.types.Character(1, {}), "srcsystem": new abap.types.Character(5, {}), "edtflag": new abap.types.Character(1, {}), "masterlang": new abap.types.Character(1, {})}, "TADIR", "TADIR", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tdevc.tabl.mjs.html b/output/tdevc.tabl.mjs.html new file mode 100644 index 00000000000..3b11ec7527b --- /dev/null +++ b/output/tdevc.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/tdevc.tabl.mjs + + + + + + + + + +
+
+

All files / output tdevc.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["TDEVC"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "dlvunit": new abap.types.Character(30, {}), "component": new abap.types.Character(20, {}), "parentcl": new abap.types.Character(30, {}), "as4user": new abap.types.Character(12, {}), "created_by": new abap.types.Character(12, {}), "created_on": new abap.types.Date(), "ctext": new abap.types.Character(60, {}), "changed_by": new abap.types.Character(12, {}), "changed_on": new abap.types.Date(), "namespace": new abap.types.Character(10, {})}, "TDEVC", "TDEVC", {}, {}),
+  "keyFields": ["DEVCLASS"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tdline.dtel.mjs.html b/output/tdline.dtel.mjs.html new file mode 100644 index 00000000000..2d82c220dcf --- /dev/null +++ b/output/tdline.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/tdline.dtel.mjs + + + + + + + + + +
+
+

All files / output tdline.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TDLINE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(132, {"qualifiedName":"TDLINE","ddicName":"TDLINE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/text20.dtel.mjs.html b/output/text20.dtel.mjs.html new file mode 100644 index 00000000000..daba4aeb921 --- /dev/null +++ b/output/text20.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/text20.dtel.mjs + + + + + + + + + +
+
+

All files / output text20.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TEXT20"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"TEXT20","ddicName":"TEXT20"}),
+  "domain": "TEXT20",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/text200.dtel.mjs.html b/output/text200.dtel.mjs.html new file mode 100644 index 00000000000..a2c5234b0fe --- /dev/null +++ b/output/text200.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/text200.dtel.mjs + + + + + + + + + +
+
+

All files / output text200.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TEXT200"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(200, {"qualifiedName":"TEXT200","ddicName":"TEXT200"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/text255.dtel.mjs.html b/output/text255.dtel.mjs.html new file mode 100644 index 00000000000..31294509a25 --- /dev/null +++ b/output/text255.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/text255.dtel.mjs + + + + + + + + + +
+
+

All files / output text255.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TEXT255"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(255, {"qualifiedName":"TEXT255","ddicName":"TEXT255"}),
+  "domain": "TEXT255",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/text30.dtel.mjs.html b/output/text30.dtel.mjs.html new file mode 100644 index 00000000000..aaffeb639ae --- /dev/null +++ b/output/text30.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/text30.dtel.mjs + + + + + + + + + +
+
+

All files / output text30.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TEXT30"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(30, {"qualifiedName":"TEXT30","ddicName":"TEXT30"}),
+  "domain": "TEXT30",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/text80.dtel.mjs.html b/output/text80.dtel.mjs.html new file mode 100644 index 00000000000..9116e235c66 --- /dev/null +++ b/output/text80.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/text80.dtel.mjs + + + + + + + + + +
+
+

All files / output text80.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TEXT80"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(80, {"qualifiedName":"TEXT80","ddicName":"TEXT80"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/textpool.tabl.mjs.html b/output/textpool.tabl.mjs.html new file mode 100644 index 00000000000..43631a90abf --- /dev/null +++ b/output/textpool.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/textpool.tabl.mjs + + + + + + + + + +
+
+

All files / output textpool.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["TEXTPOOL"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"id": new abap.types.Character(1, {}), "key": new abap.types.Character(8, {}), "entry": new abap.types.Character(255, {}), "length": new abap.types.Integer({qualifiedName: "I"})}, "TEXTPOOL", "TEXTPOOL", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tfdir.tabl.mjs.html b/output/tfdir.tabl.mjs.html new file mode 100644 index 00000000000..5fdddedfdf4 --- /dev/null +++ b/output/tfdir.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/tfdir.tabl.mjs + + + + + + + + + +
+
+

All files / output tfdir.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["TFDIR"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"funcname": new abap.types.Character(30, {})}, "TFDIR", "TFDIR", {}, {}),
+  "keyFields": ["FUNCNAME"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/thead.tabl.mjs.html b/output/thead.tabl.mjs.html new file mode 100644 index 00000000000..6d86fa5f141 --- /dev/null +++ b/output/thead.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/thead.tabl.mjs + + + + + + + + + +
+
+

All files / output thead.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["THEAD"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"tdobject": new abap.types.Character(10, {}), "tdname": new abap.types.Character(70, {}), "tdid": new abap.types.Character(4, {}), "tdspras": new abap.types.Character(1, {}), "tdtitle": new abap.types.Character(50, {}), "tdform": new abap.types.Character(16, {}), "tdstyle": new abap.types.Character(8, {}), "tdversion": new abap.types.Numc({length: 5}), "tdfuser": new abap.types.Character(12, {}), "tdfreles": new abap.types.Character(4, {}), "tdfdate": new abap.types.Date(), "tdftime": new abap.types.Time(), "tdluser": new abap.types.Character(12, {}), "tdlreles": new abap.types.Character(4, {}), "tdldate": new abap.types.Date(), "tdltime": new abap.types.Time(), "tdlinesize": new abap.types.Numc({length: 3}), "tdtxtlines": new abap.types.Numc({length: 5}), "tdhyphenat": new abap.types.Character(1, {}), "tdospras": new abap.types.Character(1, {}), "tdtranstat": new abap.types.Numc(), "tdmacode1": new abap.types.Character(16, {}), "tdmacode2": new abap.types.Character(16, {}), "tdrefobj": new abap.types.Character(10, {}), "tdrefname": new abap.types.Character(70, {}), "tdrefid": new abap.types.Character(4, {}), "tdtexttype": new abap.types.Character(6, {}), "tdcompress": new abap.types.Character(1, {}), "mandt": new abap.types.Character(3, {}), "tdoclass": new abap.types.Character(4, {}), "logsys": new abap.types.Character(10, {})}, "THEAD", "THEAD", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tihttpnvp.ttyp.mjs.html b/output/tihttpnvp.ttyp.mjs.html new file mode 100644 index 00000000000..3792beaf1cd --- /dev/null +++ b/output/tihttpnvp.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/tihttpnvp.ttyp.mjs + + + + + + + + + +
+
+

All files / output tihttpnvp.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["TIHTTPNVP"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "STRING"}), "value": new abap.types.String({qualifiedName: "STRING"})}, "IHTTPNVP", "IHTTPNVP", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TIHTTPNVP"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/timestamp.dtel.mjs.html b/output/timestamp.dtel.mjs.html new file mode 100644 index 00000000000..5a4f9a01d05 --- /dev/null +++ b/output/timestamp.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/timestamp.dtel.mjs + + + + + + + + + +
+
+

All files / output timestamp.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TIMESTAMP"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Packed({length: 15, decimals: 0, qualifiedName: "TIMESTAMP"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/timestampl.dtel.mjs.html b/output/timestampl.dtel.mjs.html new file mode 100644 index 00000000000..48456bdcc86 --- /dev/null +++ b/output/timestampl.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/timestampl.dtel.mjs + + + + + + + + + +
+
+

All files / output timestampl.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TIMESTAMPL"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/timezone.dtel.mjs.html b/output/timezone.dtel.mjs.html new file mode 100644 index 00000000000..c3a578eede7 --- /dev/null +++ b/output/timezone.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/timezone.dtel.mjs + + + + + + + + + +
+
+

All files / output timezone.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TIMEZONE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(6, {"qualifiedName":"TIMEZONE","ddicName":"TIMEZONE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/timn.dtel.mjs.html b/output/timn.dtel.mjs.html new file mode 100644 index 00000000000..daf54967873 --- /dev/null +++ b/output/timn.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/timn.dtel.mjs + + + + + + + + + +
+
+

All files / output timn.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TIMN"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Time({qualifiedName: "TIMN"}),
+  "domain": "TIME",
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tline.tabl.mjs.html b/output/tline.tabl.mjs.html new file mode 100644 index 00000000000..af73b732794 --- /dev/null +++ b/output/tline.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/tline.tabl.mjs + + + + + + + + + +
+
+

All files / output tline.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["TLINE"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tline_tab.ttyp.mjs.html b/output/tline_tab.ttyp.mjs.html new file mode 100644 index 00000000000..6c8519fd868 --- /dev/null +++ b/output/tline_tab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/tline_tab.ttyp.mjs + + + + + + + + + +
+
+

All files / output tline_tab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["TLINE_TAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINE_TAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tlinetab.ttyp.mjs.html b/output/tlinetab.ttyp.mjs.html new file mode 100644 index 00000000000..7403fa524b7 --- /dev/null +++ b/output/tlinetab.ttyp.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/tlinetab.ttyp.mjs + + + + + + + + + +
+
+

All files / output tlinetab.ttyp.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.DDIC["TLINETAB"] = {
+  "objectType": "TTYP",
+  "type": abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINETAB"),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/trfunction.dtel.mjs.html b/output/trfunction.dtel.mjs.html new file mode 100644 index 00000000000..15b9d87f7e4 --- /dev/null +++ b/output/trfunction.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/trfunction.dtel.mjs + + + + + + + + + +
+
+

All files / output trfunction.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TRFUNCTION"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/trkorr.dtel.mjs.html b/output/trkorr.dtel.mjs.html new file mode 100644 index 00000000000..865c46a868b --- /dev/null +++ b/output/trkorr.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/trkorr.dtel.mjs + + + + + + + + + +
+
+

All files / output trkorr.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TRKORR"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/trnspace.tabl.mjs.html b/output/trnspace.tabl.mjs.html new file mode 100644 index 00000000000..af870e66cc0 --- /dev/null +++ b/output/trnspace.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/trnspace.tabl.mjs + + + + + + + + + +
+
+

All files / output trnspace.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["TRNSPACE"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"namespace": new abap.types.Character(10, {}), "editflag": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOLEAN","ddicName":"ABAP_BOOLEAN"})}, "TRNSPACE", "TRNSPACE", {}, {}),
+  "keyFields": ["NAMESPACE"],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/trobjtype.dtel.mjs.html b/output/trobjtype.dtel.mjs.html new file mode 100644 index 00000000000..3afb5f3a575 --- /dev/null +++ b/output/trobjtype.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/trobjtype.dtel.mjs + + + + + + + + + +
+
+

All files / output trobjtype.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TROBJTYPE"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(4, {"qualifiedName":"TROBJTYPE","ddicName":"TROBJTYPE"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tzntstmpl.dtel.mjs.html b/output/tzntstmpl.dtel.mjs.html new file mode 100644 index 00000000000..c194fa9cbe3 --- /dev/null +++ b/output/tzntstmpl.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/tzntstmpl.dtel.mjs + + + + + + + + + +
+
+

All files / output tzntstmpl.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TZNTSTMPL"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TZNTSTMPL"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/tzntstmps.dtel.mjs.html b/output/tzntstmps.dtel.mjs.html new file mode 100644 index 00000000000..342e6868fdf --- /dev/null +++ b/output/tzntstmps.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/tzntstmps.dtel.mjs + + + + + + + + + +
+
+

All files / output tzntstmps.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["TZNTSTMPS"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Packed({length: 15, decimals: 0, qualifiedName: "TZNTSTMPS"}),
+  "domain": "TZNTSTMPS",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/uname.dtel.mjs.html b/output/uname.dtel.mjs.html new file mode 100644 index 00000000000..c51599e1e99 --- /dev/null +++ b/output/uname.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/uname.dtel.mjs + + + + + + + + + +
+
+

All files / output uname.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["UNAME"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(12, {"qualifiedName":"UNAME","ddicName":"UNAME"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/usnam.dtel.mjs.html b/output/usnam.dtel.mjs.html new file mode 100644 index 00000000000..379b31aa9c1 --- /dev/null +++ b/output/usnam.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/usnam.dtel.mjs + + + + + + + + + +
+
+

All files / output usnam.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["USNAM"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(12, {"qualifiedName":"USNAM","ddicName":"USNAM"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/vseointerf.tabl.mjs.html b/output/vseointerf.tabl.mjs.html new file mode 100644 index 00000000000..5d5f8e75434 --- /dev/null +++ b/output/vseointerf.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/vseointerf.tabl.mjs + + + + + + + + + +
+
+

All files / output vseointerf.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["VSEOINTERF"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"clsname": new abap.types.Character(30, {}), "version": new abap.types.Numc(), "langu": new abap.types.Character(1, {}), "descript": new abap.types.Character(60, {}), "uuid": new abap.types.Hex({length: 16}), "category": new abap.types.Numc({length: 2}), "exposure": new abap.types.Numc(), "state": new abap.types.Numc(), "release": new abap.types.Numc(), "author": new abap.types.Character(12, {}), "createdon": new abap.types.Date(), "changedby": new abap.types.Character(12, {}), "changedon": new abap.types.Date(), "chgdanyby": new abap.types.Character(12, {}), "chgdanyon": new abap.types.Date(), "remote": new abap.types.Character(1, {}), "unicode": new abap.types.Character(1, {}), "r3release": new abap.types.Character(10, {}), "clsproxy": new abap.types.Character(1, {})}, "VSEOINTERF", "VSEOINTERF", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/w3mime.tabl.mjs.html b/output/w3mime.tabl.mjs.html new file mode 100644 index 00000000000..6647482fb5f --- /dev/null +++ b/output/w3mime.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/w3mime.tabl.mjs + + + + + + + + + +
+
+

All files / output w3mime.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["W3MIME"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"line": new abap.types.Hex({length: 255})}, "W3MIME", "W3MIME", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/wwwdatatab.tabl.mjs.html b/output/wwwdatatab.tabl.mjs.html new file mode 100644 index 00000000000..5492a41ae62 --- /dev/null +++ b/output/wwwdatatab.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/wwwdatatab.tabl.mjs + + + + + + + + + +
+
+

All files / output wwwdatatab.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["WWWDATATAB"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"relid": new abap.types.Character(2, {}), "objid": new abap.types.Character(40, {})}, "WWWDATATAB", "WWWDATATAB", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/wwwparams.tabl.mjs.html b/output/wwwparams.tabl.mjs.html new file mode 100644 index 00000000000..7db515f59ef --- /dev/null +++ b/output/wwwparams.tabl.mjs.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for output/wwwparams.tabl.mjs + + + + + + + + + +
+
+

All files / output wwwparams.tabl.mjs

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
abap.DDIC["WWWPARAMS"] = {
+  "objectType": "TABL",
+  "type": new abap.types.Structure({"relid": new abap.types.Character(2, {}), "objid": new abap.types.Character(40, {}), "name": new abap.types.Character(50, {}), "value": new abap.types.Character(250, {})}, "WWWPARAMS", "WWWPARAMS", {}, {}),
+  "keyFields": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/xfeld.dtel.mjs.html b/output/xfeld.dtel.mjs.html new file mode 100644 index 00000000000..e506b6cbbf2 --- /dev/null +++ b/output/xfeld.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/xfeld.dtel.mjs + + + + + + + + + +
+
+

All files / output xfeld.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["XFELD"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"XFELD","ddicName":"XFELD"}),
+  "domain": undefined,
+  "fixedValues": undefined,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/xsdboolean.dtel.mjs.html b/output/xsdboolean.dtel.mjs.html new file mode 100644 index 00000000000..d4b8073768e --- /dev/null +++ b/output/xsdboolean.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/xsdboolean.dtel.mjs + + + + + + + + + +
+
+

All files / output xsdboolean.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["XSDBOOLEAN"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Character(1, {"qualifiedName":"XSDBOOLEAN","ddicName":"XSDBOOLEAN"}),
+  "domain": "XSDBOOLEAN",
+  "fixedValues": [{"description":"True","low":"X","language":"E"},{"description":"False","language":"E"}],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/xsdtime_t.dtel.mjs.html b/output/xsdtime_t.dtel.mjs.html new file mode 100644 index 00000000000..ee671470623 --- /dev/null +++ b/output/xsdtime_t.dtel.mjs.html @@ -0,0 +1,100 @@ + + + + + + Code coverage report for output/xsdtime_t.dtel.mjs + + + + + + + + + +
+
+

All files / output xsdtime_t.dtel.mjs

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +61x +1x +1x +1x +1x +1x
abap.DDIC["XSDTIME_T"] = {
+  "objectType": "DTEL",
+  "type": new abap.types.Time({qualifiedName: "XSDTIME_T"}),
+  "domain": "XSDTIME_T",
+  "fixedValues": [],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_css_common.w3mi.mjs.html b/output/zabapgit_css_common.w3mi.mjs.html new file mode 100644 index 00000000000..03bb7b73796 --- /dev/null +++ b/output/zabapgit_css_common.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_css_common.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_css_common.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_CSS_COMMON"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_css_common.w3mi.data.css",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_css_page_db.w3mi.mjs.html b/output/zabapgit_css_page_db.w3mi.mjs.html new file mode 100644 index 00000000000..a4aa7d110ce --- /dev/null +++ b/output/zabapgit_css_page_db.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_css_page_db.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_css_page_db.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_CSS_PAGE_DB"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_css_page_db.w3mi.data.css",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_css_page_db_entry.w3mi.mjs.html b/output/zabapgit_css_page_db_entry.w3mi.mjs.html new file mode 100644 index 00000000000..17baf657c8a --- /dev/null +++ b/output/zabapgit_css_page_db_entry.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_css_page_db_entry.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_css_page_db_entry.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_CSS_PAGE_DB_ENTRY"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_css_page_db_entry.w3mi.data.css",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_css_theme_belize_blue.w3mi.mjs.html b/output/zabapgit_css_theme_belize_blue.w3mi.mjs.html new file mode 100644 index 00000000000..d9383cbcbaf --- /dev/null +++ b/output/zabapgit_css_theme_belize_blue.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_css_theme_belize_blue.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_css_theme_belize_blue.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_CSS_THEME_BELIZE_BLUE"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_css_theme_belize_blue.w3mi.data.css",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_css_theme_dark.w3mi.mjs.html b/output/zabapgit_css_theme_dark.w3mi.mjs.html new file mode 100644 index 00000000000..9f1daa0c314 --- /dev/null +++ b/output/zabapgit_css_theme_dark.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_css_theme_dark.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_css_theme_dark.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_CSS_THEME_DARK"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_css_theme_dark.w3mi.data.css",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_css_theme_default.w3mi.mjs.html b/output/zabapgit_css_theme_default.w3mi.mjs.html new file mode 100644 index 00000000000..185e1847e1b --- /dev/null +++ b/output/zabapgit_css_theme_default.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_css_theme_default.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_css_theme_default.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_CSS_THEME_DEFAULT"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_css_theme_default.w3mi.data.css",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_icon_font.w3mi.mjs.html b/output/zabapgit_icon_font.w3mi.mjs.html new file mode 100644 index 00000000000..b0a2f79aaed --- /dev/null +++ b/output/zabapgit_icon_font.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_icon_font.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_icon_font.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_ICON_FONT"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_icon_font.w3mi.data.woff",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_icon_font_css.w3mi.mjs.html b/output/zabapgit_icon_font_css.w3mi.mjs.html new file mode 100644 index 00000000000..b6016262fac --- /dev/null +++ b/output/zabapgit_icon_font_css.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_icon_font_css.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_icon_font_css.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_ICON_FONT_CSS"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_icon_font_css.w3mi.data.css",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zabapgit_js_common.w3mi.mjs.html b/output/zabapgit_js_common.w3mi.mjs.html new file mode 100644 index 00000000000..fd8d8ba2199 --- /dev/null +++ b/output/zabapgit_js_common.w3mi.mjs.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for output/zabapgit_js_common.w3mi.mjs + + + + + + + + + +
+
+

All files / output zabapgit_js_common.w3mi.mjs

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +41x +1x +1x +1x
abap.W3MI["ZABAPGIT_JS_COMMON"] = {
+  "objectType": "W3MI",
+  "filename": "zabapgit_js_common.w3mi.data.js",
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_aff_intf_v1.intf.mjs.html b/output/zif_abapgit_aff_intf_v1.intf.mjs.html new file mode 100644 index 00000000000..ebf531345d5 --- /dev/null +++ b/output/zif_abapgit_aff_intf_v1.intf.mjs.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for output/zif_abapgit_aff_intf_v1.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_aff_intf_v1.intf.mjs

+
+ +
+ 100% + Statements + 19/19 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 19/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +191x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_aff_intf_v1.intf.abap
+class zif_abapgit_aff_intf_v1 {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_CATEGORY": {"type": () => {return new abap.types.Structure({"general": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "classic_badi": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "business_static_components": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "business_instance_components": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "db_procedure_proxy": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "web_dynpro_runtime": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "enterprise_service": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_AFF_INTF_V1'] = zif_abapgit_aff_intf_v1;
+zif_abapgit_aff_intf_v1.zif_abapgit_aff_intf_v1$co_category = new abap.types.Structure({"general": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "classic_badi": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "business_static_components": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "business_instance_components": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "db_procedure_proxy": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "web_dynpro_runtime": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "enterprise_service": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"})}, undefined, undefined, {}, {});
+zif_abapgit_aff_intf_v1.zif_abapgit_aff_intf_v1$co_category.get().general.set('00');
+zif_abapgit_aff_intf_v1.zif_abapgit_aff_intf_v1$co_category.get().classic_badi.set('01');
+zif_abapgit_aff_intf_v1.zif_abapgit_aff_intf_v1$co_category.get().business_static_components.set('51');
+zif_abapgit_aff_intf_v1.zif_abapgit_aff_intf_v1$co_category.get().business_instance_components.set('52');
+zif_abapgit_aff_intf_v1.zif_abapgit_aff_intf_v1$co_category.get().db_procedure_proxy.set('65');
+zif_abapgit_aff_intf_v1.zif_abapgit_aff_intf_v1$co_category.get().web_dynpro_runtime.set('80');
+zif_abapgit_aff_intf_v1.zif_abapgit_aff_intf_v1$co_category.get().enterprise_service.set('90');
+zif_abapgit_aff_intf_v1.ty_category = new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"});
+zif_abapgit_aff_intf_v1.ty_main = new abap.types.Structure({"format_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AFF_TYPES_V1=>TY_FORMAT_VERSION"}), "header": new abap.types.Structure({"description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "original_language": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_original_language","conversionExit":"ISOLA"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"})}, "zif_abapgit_aff_types_v1=>ty_header_60_src", undefined, {}, {}), "category": new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_aff_intf_v1=>ty_category"}), "proxy": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "descriptions": new abap.types.Structure({"types": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions"), "attributes": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions"), "events": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "parameters": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions")}, "zif_abapgit_aff_oo_types_v1=>ty_event", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_events"), "methods": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "parameters": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions"), "exceptions": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions")}, "zif_abapgit_aff_oo_types_v1=>ty_method", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_methods")}, "zif_abapgit_aff_oo_types_v1=>ty_descriptions", undefined, {}, {})}, "zif_abapgit_aff_intf_v1=>ty_main", undefined, {}, {});
+export {zif_abapgit_aff_intf_v1};
+//# sourceMappingURL=zif_abapgit_aff_intf_v1.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_aff_oo_types_v1.intf.mjs.html b/output/zif_abapgit_aff_oo_types_v1.intf.mjs.html new file mode 100644 index 00000000000..4d3e9a40ec7 --- /dev/null +++ b/output/zif_abapgit_aff_oo_types_v1.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/zif_abapgit_aff_oo_types_v1.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_aff_oo_types_v1.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_aff_oo_types_v1.intf.abap
+class zif_abapgit_aff_oo_types_v1 {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_AFF_OO_TYPES_V1'] = zif_abapgit_aff_oo_types_v1;zif_abapgit_aff_oo_types_v1.ty_component_description = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {});
+zif_abapgit_aff_oo_types_v1.ty_component_descriptions = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions");
+zif_abapgit_aff_oo_types_v1.ty_method = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "parameters": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions"), "exceptions": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions")}, "zif_abapgit_aff_oo_types_v1=>ty_method", undefined, {}, {});
+zif_abapgit_aff_oo_types_v1.ty_methods = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "parameters": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions"), "exceptions": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions")}, "zif_abapgit_aff_oo_types_v1=>ty_method", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_methods");
+zif_abapgit_aff_oo_types_v1.ty_event = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "parameters": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions")}, "zif_abapgit_aff_oo_types_v1=>ty_event", undefined, {}, {});
+zif_abapgit_aff_oo_types_v1.ty_events = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "parameters": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions")}, "zif_abapgit_aff_oo_types_v1=>ty_event", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_events");
+zif_abapgit_aff_oo_types_v1.ty_descriptions = new abap.types.Structure({"types": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions"), "attributes": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions"), "events": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "parameters": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions")}, "zif_abapgit_aff_oo_types_v1=>ty_event", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_events"), "methods": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "parameters": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions"), "exceptions": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"}), "description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_oo_types_v1=>ty_component_description", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_component_descriptions")}, "zif_abapgit_aff_oo_types_v1=>ty_method", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["NAME"]},"secondary":[]}, "zif_abapgit_aff_oo_types_v1=>ty_methods")}, "zif_abapgit_aff_oo_types_v1=>ty_descriptions", undefined, {}, {});
+export {zif_abapgit_aff_oo_types_v1};
+//# sourceMappingURL=zif_abapgit_aff_oo_types_v1.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_aff_registry.intf.mjs.html b/output/zif_abapgit_aff_registry.intf.mjs.html new file mode 100644 index 00000000000..4dbb292f826 --- /dev/null +++ b/output/zif_abapgit_aff_registry.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_aff_registry.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_aff_registry.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_aff_registry.intf.abap
+class zif_abapgit_aff_registry {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"IS_SUPPORTED_OBJECT_TYPE": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_OBJ_TYPE": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_AFF_REGISTRY'] = zif_abapgit_aff_registry;
+export {zif_abapgit_aff_registry};
+//# sourceMappingURL=zif_abapgit_aff_registry.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_aff_type_mapping.intf.mjs.html b/output/zif_abapgit_aff_type_mapping.intf.mjs.html new file mode 100644 index 00000000000..a83a883a0d7 --- /dev/null +++ b/output/zif_abapgit_aff_type_mapping.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_aff_type_mapping.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_aff_type_mapping.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_aff_type_mapping.intf.abap
+class zif_abapgit_aff_type_mapping {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"TO_ABAPGIT": {"visibility": "U", "parameters": {"IV_DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"SOBJ_NAME","ddicName":"SOBJ_NAME"});}, "is_optional": " "}, "ES_DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "TO_AFF": {"visibility": "U", "parameters": {"IV_DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "ES_DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_AFF_TYPE_MAPPING'] = zif_abapgit_aff_type_mapping;
+export {zif_abapgit_aff_type_mapping};
+//# sourceMappingURL=zif_abapgit_aff_type_mapping.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_aff_types_v1.intf.mjs.html b/output/zif_abapgit_aff_types_v1.intf.mjs.html new file mode 100644 index 00000000000..e70273b148b --- /dev/null +++ b/output/zif_abapgit_aff_types_v1.intf.mjs.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for output/zif_abapgit_aff_types_v1.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_aff_types_v1.intf.mjs

+
+ +
+ 100% + Statements + 54/54 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 54/54 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +541x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_aff_types_v1.intf.abap
+class zif_abapgit_aff_types_v1 {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"CO_ABAP_LANGUAGE_VERSION_SRC": {"type": () => {return new abap.types.Structure({"standard": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"}), "key_user": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"}), "cloud_development": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_ABAP_LANGUAGE_VERSION": {"type": () => {return new abap.types.Structure({"standard": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "key_user": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "cloud_development": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_ABAP_LANGUAGE_VERSION_CLOUD": {"type": () => {return new abap.types.Structure({"standard": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_cloud"}), "cloud_development": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_cloud"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_OPTION": {"type": () => {return new abap.types.Structure({"equals": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "between": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "greater_than": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "contains_pattern": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "not_equal": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "not_between": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "not_contains_pattern": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "greater_equal": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "less_than": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "less_equal": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "CO_SIGN": {"type": () => {return new abap.types.Structure({"include": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_sign"}), "exclude": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_sign"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_AFF_TYPES_V1'] = zif_abapgit_aff_types_v1;
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version_src = new abap.types.Structure({"standard": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"}), "key_user": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"}), "cloud_development": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"})}, undefined, undefined, {}, {});
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version_src.get().standard.set('X');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version_src.get().key_user.set('2');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version_src.get().cloud_development.set('5');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version = new abap.types.Structure({"standard": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "key_user": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "cloud_development": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, undefined, undefined, {}, {});
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version.get().standard.set(' ');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version.get().key_user.set('2');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version.get().cloud_development.set('5');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version_cloud = new abap.types.Structure({"standard": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_cloud"}), "cloud_development": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_cloud"})}, undefined, undefined, {}, {});
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version_cloud.get().standard.set(' ');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_abap_language_version_cloud.get().cloud_development.set('5');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option = new abap.types.Structure({"equals": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "between": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "greater_than": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "contains_pattern": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "not_equal": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "not_between": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "not_contains_pattern": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "greater_equal": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "less_than": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"}), "less_equal": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"})}, undefined, undefined, {}, {});
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().equals.set('EQ');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().between.set('BT');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().greater_than.set('GT');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().contains_pattern.set('CP');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().not_equal.set('NE');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().not_between.set('NB');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().not_contains_pattern.set('NP');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().greater_equal.set('GE');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().less_than.set('LT');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_option.get().less_equal.set('LE');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_sign = new abap.types.Structure({"include": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_sign"}), "exclude": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_sign"})}, undefined, undefined, {}, {});
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_sign.get().include.set('I');
+zif_abapgit_aff_types_v1.zif_abapgit_aff_types_v1$co_sign.get().exclude.set('E');
+zif_abapgit_aff_types_v1.ty_format_version = new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AFF_TYPES_V1=>TY_FORMAT_VERSION"});
+zif_abapgit_aff_types_v1.ty_abap_language_version = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"});
+zif_abapgit_aff_types_v1.ty_abap_language_version_cloud = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_cloud"});
+zif_abapgit_aff_types_v1.ty_abap_language_version_src = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"});
+zif_abapgit_aff_types_v1.ty_description_60 = new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"});
+zif_abapgit_aff_types_v1.ty_description_100 = new abap.types.Character(100, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_100"});
+zif_abapgit_aff_types_v1.ty_object_name_30 = new abap.types.Character(30, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_object_name_30"});
+zif_abapgit_aff_types_v1.ty_original_language = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_original_language","conversionExit":"ISOLA"});
+zif_abapgit_aff_types_v1.ty_header_60_src = new abap.types.Structure({"description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "original_language": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_original_language","conversionExit":"ISOLA"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_src"})}, "zif_abapgit_aff_types_v1=>ty_header_60_src", undefined, {}, {});
+zif_abapgit_aff_types_v1.ty_header_60_cloud = new abap.types.Structure({"description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "original_language": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_original_language","conversionExit":"ISOLA"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version_cloud"})}, "zif_abapgit_aff_types_v1=>ty_header_60_cloud", undefined, {}, {});
+zif_abapgit_aff_types_v1.ty_header_60 = new abap.types.Structure({"description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "original_language": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_original_language","conversionExit":"ISOLA"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_aff_types_v1=>ty_header_60", undefined, {}, {});
+zif_abapgit_aff_types_v1.ty_header_60_no_abap_lv = new abap.types.Structure({"description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"}), "original_language": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_original_language","conversionExit":"ISOLA"})}, "zif_abapgit_aff_types_v1=>ty_header_60_no_abap_lv", undefined, {}, {});
+zif_abapgit_aff_types_v1.ty_header_100 = new abap.types.Structure({"description": new abap.types.Character(100, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_100"}), "original_language": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_original_language","conversionExit":"ISOLA"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_aff_types_v1=>ty_header_100", undefined, {}, {});
+zif_abapgit_aff_types_v1.ty_header_only_description = new abap.types.Structure({"description": new abap.types.Character(60, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_description_60"})}, "zif_abapgit_aff_types_v1=>ty_header_only_description", undefined, {}, {});
+zif_abapgit_aff_types_v1.ty_option = new abap.types.Character(2, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_option"});
+zif_abapgit_aff_types_v1.ty_sign = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_sign"});
+export {zif_abapgit_aff_types_v1};
+//# sourceMappingURL=zif_abapgit_aff_types_v1.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_ajson.intf.mjs.html b/output/zif_abapgit_ajson.intf.mjs.html new file mode 100644 index 00000000000..f4b2af3e2b6 --- /dev/null +++ b/output/zif_abapgit_ajson.intf.mjs.html @@ -0,0 +1,241 @@ + + + + + + Code coverage report for output/zif_abapgit_ajson.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_ajson.intf.mjs

+
+ +
+ 100% + Statements + 53/53 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 53/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +531x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_ajson.intf.abap
+class zif_abapgit_ajson {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"MT_JSON_TREE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-NAME"}), "type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-VALUE"}), "index": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-INDEX"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-ORDER"}), "children": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-CHILDREN"})}, "zif_abapgit_ajson_types=>ty_node", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["PATH","NAME"]},"secondary":[{"name":"array_index","type":"SORTED","isUnique":false,"keyFields":["PATH","INDEX"]},{"name":"item_order","type":"SORTED","isUnique":false,"keyFields":["PATH","ORDER"]}]}, "zif_abapgit_ajson_types=>ty_nodes_ts");}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "VERSION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "ORIGIN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "LICENSE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"CLONE": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}}},
+  "FILTER": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "II_FILTER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON_FILTER"});}, "is_optional": " "}}},
+  "MAP": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "II_MAPPER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON_MAPPING"});}, "is_optional": " "}}},
+  "FREEZE": {"visibility": "U", "parameters": {}},
+  "KEEP_ITEM_ORDER": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}}},
+  "FORMAT_DATETIME": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_USE_ISO": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "TO_ABAP_CORRESPONDING_ONLY": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_ENABLE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "OPTS": {"visibility": "U", "parameters": {"RS_OPTS": {"type": () => {return new abap.types.Structure({"read_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "keep_item_order": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "format_datetime": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "to_abap_corresponding_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_ajson=>ty_opts", undefined, {}, {});}, "is_optional": " "}}},
+  "IS_EMPTY": {"visibility": "U", "parameters": {"RV_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "EXISTS": {"visibility": "U", "parameters": {"RV_EXISTS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "MEMBERS": {"visibility": "U", "parameters": {"RT_MEMBERS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE");}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET": {"visibility": "U", "parameters": {"RV_VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_NODE_TYPE": {"visibility": "U", "parameters": {"RV_NODE_TYPE": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_BOOLEAN": {"visibility": "U", "parameters": {"RV_VALUE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_INTEGER": {"visibility": "U", "parameters": {"RV_VALUE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_NUMBER": {"visibility": "U", "parameters": {"RV_VALUE": {"type": () => {return new abap.types.Float({qualifiedName: "F"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_DATE": {"visibility": "U", "parameters": {"RV_VALUE": {"type": () => {return new abap.types.Date({qualifiedName: "D"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_TIMESTAMP": {"visibility": "U", "parameters": {"RV_VALUE": {"type": () => {return new abap.types.Packed({length: 15, decimals: 0, qualifiedName: "TIMESTAMP"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_STRING": {"visibility": "U", "parameters": {"RV_VALUE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SLICE": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "TO_ABAP": {"visibility": "U", "parameters": {"IV_CORRESPONDING": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "EV_CONTAINER": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "ARRAY_TO_STRING_TABLE": {"visibility": "U", "parameters": {"RT_STRING_TABLE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE");}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CLEAR": {"visibility": "U", "parameters": {}},
+  "SET": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_VAL": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "IV_IGNORE_EMPTY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_NODE_TYPE": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"});}, "is_optional": " "}}},
+  "SETX": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PARAM": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_BOOLEAN": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_VAL": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "SET_STRING": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_VAL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}},
+  "SET_INTEGER": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_VAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "SET_DATE": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_VAL": {"type": () => {return new abap.types.Date({qualifiedName: "D"});}, "is_optional": " "}}},
+  "SET_TIMESTAMP": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_VAL": {"type": () => {return new abap.types.Packed({length: 15, decimals: 0, qualifiedName: "TIMESTAMP"});}, "is_optional": " "}}},
+  "SET_NULL": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DELETE": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "TOUCH_ARRAY": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CLEAR": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "PUSH": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_VAL": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "STRINGIFY": {"visibility": "U", "parameters": {"RV_JSON": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_INDENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_AJSON'] = zif_abapgit_ajson;
+zif_abapgit_ajson.zif_abapgit_ajson$version = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_ajson.zif_abapgit_ajson$version.set('v1.1.8');
+zif_abapgit_ajson.zif_abapgit_ajson$origin = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_ajson.zif_abapgit_ajson$origin.set('https://github.com/sbcgua/ajson');
+zif_abapgit_ajson.zif_abapgit_ajson$license = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_ajson.zif_abapgit_ajson$license.set('MIT');
+zif_abapgit_ajson.ty_opts = new abap.types.Structure({"read_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "keep_item_order": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "format_datetime": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "to_abap_corresponding_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_ajson=>ty_opts", undefined, {}, {});
+export {zif_abapgit_ajson};
+//# sourceMappingURL=zif_abapgit_ajson.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_ajson_filter.intf.mjs.html b/output/zif_abapgit_ajson_filter.intf.mjs.html new file mode 100644 index 00000000000..74ac1f09ca8 --- /dev/null +++ b/output/zif_abapgit_ajson_filter.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/zif_abapgit_ajson_filter.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_ajson_filter.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_ajson_filter.intf.abap
+class zif_abapgit_ajson_filter {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"VISIT_TYPE": {"type": () => {return new abap.types.Structure({"value": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER=>TY_VISIT_TYPE"}), "open": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER=>TY_VISIT_TYPE"}), "close": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER=>TY_VISIT_TYPE"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"KEEP_NODE": {"visibility": "U", "parameters": {"RV_KEEP": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IS_NODE": {"type": () => {return new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-NAME"}), "type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-VALUE"}), "index": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-INDEX"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-ORDER"}), "children": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-CHILDREN"})}, "zif_abapgit_ajson_types=>ty_node", undefined, {}, {});}, "is_optional": " "}, "IV_VISIT": {"type": () => {return new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER=>TY_VISIT_TYPE"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_AJSON_FILTER'] = zif_abapgit_ajson_filter;
+zif_abapgit_ajson_filter.zif_abapgit_ajson_filter$visit_type = new abap.types.Structure({"value": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER=>TY_VISIT_TYPE"}), "open": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER=>TY_VISIT_TYPE"}), "close": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER=>TY_VISIT_TYPE"})}, undefined, undefined, {}, {});
+zif_abapgit_ajson_filter.zif_abapgit_ajson_filter$visit_type.get().value.set(0);
+zif_abapgit_ajson_filter.zif_abapgit_ajson_filter$visit_type.get().open.set(1);
+zif_abapgit_ajson_filter.zif_abapgit_ajson_filter$visit_type.get().close.set(2);
+zif_abapgit_ajson_filter.ty_filter_tab = abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON_FILTER"}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["TABLE_LINE"]},"secondary":[]}, "zif_abapgit_ajson_filter=>ty_filter_tab");
+zif_abapgit_ajson_filter.ty_visit_type = new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_FILTER=>TY_VISIT_TYPE"});
+export {zif_abapgit_ajson_filter};
+//# sourceMappingURL=zif_abapgit_ajson_filter.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_ajson_mapping.intf.mjs.html b/output/zif_abapgit_ajson_mapping.intf.mjs.html new file mode 100644 index 00000000000..b8d53f11abf --- /dev/null +++ b/output/zif_abapgit_ajson_mapping.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/zif_abapgit_ajson_mapping.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_ajson_mapping.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_ajson_mapping.intf.abap
+class zif_abapgit_ajson_mapping {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"TO_ABAP": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "TO_JSON": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "RENAME_NODE": {"visibility": "U", "parameters": {"IS_NODE": {"type": () => {return new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-NAME"}), "type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-VALUE"}), "index": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-INDEX"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-ORDER"}), "children": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-CHILDREN"})}, "zif_abapgit_ajson_types=>ty_node", undefined, {}, {});}, "is_optional": " "}, "CV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-NAME"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_AJSON_MAPPING'] = zif_abapgit_ajson_mapping;zif_abapgit_ajson_mapping.ty_mapping_field = new abap.types.Structure({"abap": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING=>TY_MAPPING_FIELD-ABAP"}), "json": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING=>TY_MAPPING_FIELD-JSON"})}, "zif_abapgit_ajson_mapping=>ty_mapping_field", undefined, {}, {});
+zif_abapgit_ajson_mapping.ty_mapping_fields = abap.types.TableFactory.construct(new abap.types.Structure({"abap": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING=>TY_MAPPING_FIELD-ABAP"}), "json": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING=>TY_MAPPING_FIELD-JSON"})}, "zif_abapgit_ajson_mapping=>ty_mapping_field", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"abap","type":"SORTED","isUnique":true,"keyFields":["ABAP"]},{"name":"json","type":"SORTED","isUnique":true,"keyFields":["JSON"]}]}, "zif_abapgit_ajson_mapping=>ty_mapping_fields");
+zif_abapgit_ajson_mapping.ty_rename = new abap.types.Structure({"from": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING=>TY_RENAME-FROM"}), "to": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING=>TY_RENAME-TO"})}, "zif_abapgit_ajson_mapping=>ty_rename", undefined, {}, {});
+zif_abapgit_ajson_mapping.tty_rename_map = abap.types.TableFactory.construct(new abap.types.Structure({"from": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING=>TY_RENAME-FROM"}), "to": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING=>TY_RENAME-TO"})}, "zif_abapgit_ajson_mapping=>ty_rename", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"by_name","type":"SORTED","isUnique":true,"keyFields":["FROM"]}]}, "zif_abapgit_ajson_mapping=>tty_rename_map");
+zif_abapgit_ajson_mapping.ty_table_of = abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON_MAPPING", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON_MAPPING"}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_ajson_mapping=>ty_table_of");
+export {zif_abapgit_ajson_mapping};
+//# sourceMappingURL=zif_abapgit_ajson_mapping.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_ajson_types.intf.mjs.html b/output/zif_abapgit_ajson_types.intf.mjs.html new file mode 100644 index 00000000000..46581e3ca99 --- /dev/null +++ b/output/zif_abapgit_ajson_types.intf.mjs.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for output/zif_abapgit_ajson_types.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_ajson_types.intf.mjs

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_ajson_types.intf.abap
+class zif_abapgit_ajson_types {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"NODE_TYPE": {"type": () => {return new abap.types.Structure({"boolean": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "string": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "number": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "null": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "array": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "object": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_AJSON_TYPES'] = zif_abapgit_ajson_types;
+zif_abapgit_ajson_types.zif_abapgit_ajson_types$node_type = new abap.types.Structure({"boolean": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "string": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "number": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "null": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "array": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "object": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"})}, undefined, undefined, {}, {});
+zif_abapgit_ajson_types.zif_abapgit_ajson_types$node_type.get().boolean.set('bool');
+zif_abapgit_ajson_types.zif_abapgit_ajson_types$node_type.get().string.set('str');
+zif_abapgit_ajson_types.zif_abapgit_ajson_types$node_type.get().number.set('num');
+zif_abapgit_ajson_types.zif_abapgit_ajson_types$node_type.get().null.set('null');
+zif_abapgit_ajson_types.zif_abapgit_ajson_types$node_type.get().array.set('array');
+zif_abapgit_ajson_types.zif_abapgit_ajson_types$node_type.get().object.set('object');
+zif_abapgit_ajson_types.ty_node_type = new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"});
+zif_abapgit_ajson_types.ty_node = new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-NAME"}), "type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-VALUE"}), "index": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-INDEX"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-ORDER"}), "children": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-CHILDREN"})}, "zif_abapgit_ajson_types=>ty_node", undefined, {}, {});
+zif_abapgit_ajson_types.ty_nodes_tt = abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-NAME"}), "type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-VALUE"}), "index": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-INDEX"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-ORDER"}), "children": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-CHILDREN"})}, "zif_abapgit_ajson_types=>ty_node", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["PATH","NAME"]},"secondary":[]}, "zif_abapgit_ajson_types=>ty_nodes_tt");
+zif_abapgit_ajson_types.ty_nodes_ts = abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-NAME"}), "type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE_TYPE"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-VALUE"}), "index": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-INDEX"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-ORDER"}), "children": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_NODE-CHILDREN"})}, "zif_abapgit_ajson_types=>ty_node", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["PATH","NAME"]},"secondary":[{"name":"array_index","type":"SORTED","isUnique":false,"keyFields":["PATH","INDEX"]},{"name":"item_order","type":"SORTED","isUnique":false,"keyFields":["PATH","ORDER"]}]}, "zif_abapgit_ajson_types=>ty_nodes_ts");
+zif_abapgit_ajson_types.ty_path_name = new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_PATH_NAME-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AJSON_TYPES=>TY_PATH_NAME-NAME"})}, "zif_abapgit_ajson_types=>ty_path_name", undefined, {}, {});
+export {zif_abapgit_ajson_types};
+//# sourceMappingURL=zif_abapgit_ajson_types.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_apack_definitions.intf.mjs.html b/output/zif_abapgit_apack_definitions.intf.mjs.html new file mode 100644 index 00000000000..3076d33b1fb --- /dev/null +++ b/output/zif_abapgit_apack_definitions.intf.mjs.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for output/zif_abapgit_apack_definitions.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_apack_definitions.intf.mjs

+
+ +
+ 100% + Statements + 26/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 26/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_apack_definitions.intf.abap
+class zif_abapgit_apack_definitions {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_DOT_APACK_MANIFEST": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_REPOSITORY_TYPE_ABAPGIT": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_REPOSITORY_TYPE"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_APACK_INTERFACE_SAP": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_APACK_INTERFACE_CUST": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_APACK_DEFINITIONS'] = zif_abapgit_apack_definitions;
+zif_abapgit_apack_definitions.zif_abapgit_apack_definitions$c_dot_apack_manifest = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_apack_definitions.zif_abapgit_apack_definitions$c_dot_apack_manifest.set('.apack-manifest.xml');
+zif_abapgit_apack_definitions.zif_abapgit_apack_definitions$c_repository_type_abapgit = new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_REPOSITORY_TYPE"});
+zif_abapgit_apack_definitions.zif_abapgit_apack_definitions$c_repository_type_abapgit.set('abapGit');
+zif_abapgit_apack_definitions.zif_abapgit_apack_definitions$c_apack_interface_sap = new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});
+zif_abapgit_apack_definitions.zif_abapgit_apack_definitions$c_apack_interface_sap.set('IF_APACK_MANIFEST');
+zif_abapgit_apack_definitions.zif_abapgit_apack_definitions$c_apack_interface_cust = new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});
+zif_abapgit_apack_definitions.zif_abapgit_apack_definitions$c_apack_interface_cust.set('ZIF_APACK_MANIFEST');
+zif_abapgit_apack_definitions.ty_dependency = new abap.types.Structure({"group_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-GROUP_ID"}), "artifact_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-ARTIFACT_ID"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-VERSION"}), "sem_version": new abap.types.Structure({"major": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MAJOR"}), "minor": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MINOR"}), "patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PATCH"}), "prerelase": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE"}), "prerelase_patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE_PATCH"})}, "zif_abapgit_definitions=>ty_version", undefined, {}, {}), "git_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-GIT_URL"}), "target_package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_apack_definitions=>ty_dependency", undefined, {}, {});
+zif_abapgit_apack_definitions.ty_dependencies = abap.types.TableFactory.construct(new abap.types.Structure({"group_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-GROUP_ID"}), "artifact_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-ARTIFACT_ID"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-VERSION"}), "sem_version": new abap.types.Structure({"major": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MAJOR"}), "minor": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MINOR"}), "patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PATCH"}), "prerelase": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE"}), "prerelase_patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE_PATCH"})}, "zif_abapgit_definitions=>ty_version", undefined, {}, {}), "git_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-GIT_URL"}), "target_package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_apack_definitions=>ty_dependency", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_apack_definitions=>ty_dependencies");
+zif_abapgit_apack_definitions.ty_repository_type = new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_REPOSITORY_TYPE"});
+zif_abapgit_apack_definitions.ty_descriptor_wo_dependencies = new abap.types.Structure({"group_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-GROUP_ID"}), "artifact_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-ARTIFACT_ID"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-VERSION"}), "sem_version": new abap.types.Structure({"major": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MAJOR"}), "minor": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MINOR"}), "patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PATCH"}), "prerelase": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE"}), "prerelase_patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE_PATCH"})}, "zif_abapgit_definitions=>ty_version", undefined, {}, {}), "repository_type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_REPOSITORY_TYPE"}), "git_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-GIT_URL"})}, "zif_abapgit_apack_definitions=>ty_descriptor_wo_dependencies", undefined, {}, {});
+zif_abapgit_apack_definitions.ty_descriptor = new abap.types.Structure({"group_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-GROUP_ID"}), "artifact_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-ARTIFACT_ID"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-VERSION"}), "sem_version": new abap.types.Structure({"major": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MAJOR"}), "minor": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MINOR"}), "patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PATCH"}), "prerelase": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE"}), "prerelase_patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE_PATCH"})}, "zif_abapgit_definitions=>ty_version", undefined, {}, {}), "repository_type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_REPOSITORY_TYPE"}), "git_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-GIT_URL"}), "dependencies": abap.types.TableFactory.construct(new abap.types.Structure({"group_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-GROUP_ID"}), "artifact_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-ARTIFACT_ID"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-VERSION"}), "sem_version": new abap.types.Structure({"major": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MAJOR"}), "minor": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MINOR"}), "patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PATCH"}), "prerelase": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE"}), "prerelase_patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE_PATCH"})}, "zif_abapgit_definitions=>ty_version", undefined, {}, {}), "git_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-GIT_URL"}), "target_package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_apack_definitions=>ty_dependency", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_apack_definitions=>ty_dependencies")}, "zif_abapgit_apack_definitions=>ty_descriptor", undefined, {}, {});
+zif_abapgit_apack_definitions.ty_descriptors = abap.types.TableFactory.construct(new abap.types.Structure({"group_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-GROUP_ID"}), "artifact_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-ARTIFACT_ID"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-VERSION"}), "sem_version": new abap.types.Structure({"major": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MAJOR"}), "minor": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MINOR"}), "patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PATCH"}), "prerelase": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE"}), "prerelase_patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE_PATCH"})}, "zif_abapgit_definitions=>ty_version", undefined, {}, {}), "repository_type": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_REPOSITORY_TYPE"}), "git_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DESCRIPTOR_WO_DEPENDENCIES-GIT_URL"}), "dependencies": abap.types.TableFactory.construct(new abap.types.Structure({"group_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-GROUP_ID"}), "artifact_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-ARTIFACT_ID"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-VERSION"}), "sem_version": new abap.types.Structure({"major": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MAJOR"}), "minor": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MINOR"}), "patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PATCH"}), "prerelase": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE"}), "prerelase_patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE_PATCH"})}, "zif_abapgit_definitions=>ty_version", undefined, {}, {}), "git_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_APACK_DEFINITIONS=>TY_DEPENDENCY-GIT_URL"}), "target_package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_apack_definitions=>ty_dependency", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_apack_definitions=>ty_dependencies")}, "zif_abapgit_apack_definitions=>ty_descriptor", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_apack_definitions=>ty_descriptors");
+export {zif_abapgit_apack_definitions};
+//# sourceMappingURL=zif_abapgit_apack_definitions.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_auth.intf.mjs.html b/output/zif_abapgit_auth.intf.mjs.html new file mode 100644 index 00000000000..7c9008f6894 --- /dev/null +++ b/output/zif_abapgit_auth.intf.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/zif_abapgit_auth.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_auth.intf.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_auth.intf.abap
+class zif_abapgit_auth {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_AUTHORIZATION": {"type": () => {return new abap.types.Structure({"startup": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"}), "uninstall": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"}), "create_repo": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"}), "transport_to_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"}), "update_local_checksum": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"IS_ALLOWED": {"visibility": "U", "parameters": {"RV_ALLOWED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_AUTHORIZATION": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"});}, "is_optional": " "}, "IV_PARAM": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_AUTH'] = zif_abapgit_auth;
+zif_abapgit_auth.zif_abapgit_auth$c_authorization = new abap.types.Structure({"startup": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"}), "uninstall": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"}), "create_repo": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"}), "transport_to_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"}), "update_local_checksum": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"})}, undefined, undefined, {}, {});
+zif_abapgit_auth.zif_abapgit_auth$c_authorization.get().startup.set('STARTUP');
+zif_abapgit_auth.zif_abapgit_auth$c_authorization.get().uninstall.set('UNINSTALL');
+zif_abapgit_auth.zif_abapgit_auth$c_authorization.get().create_repo.set('CREATE_REPO');
+zif_abapgit_auth.zif_abapgit_auth$c_authorization.get().transport_to_branch.set('TRANSPORT_TO_BRANCH');
+zif_abapgit_auth.zif_abapgit_auth$c_authorization.get().update_local_checksum.set('UPDATE_LOCAL_CHECKSUM');
+zif_abapgit_auth.ty_authorization = new abap.types.String({qualifiedName: "ZIF_ABAPGIT_AUTH=>TY_AUTHORIZATION"});
+export {zif_abapgit_auth};
+//# sourceMappingURL=zif_abapgit_auth.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_background.intf.mjs.html b/output/zif_abapgit_background.intf.mjs.html new file mode 100644 index 00000000000..2d4bc1c6b70 --- /dev/null +++ b/output/zif_abapgit_background.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/zif_abapgit_background.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_background.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_background.intf.abap
+class zif_abapgit_background {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_DESCRIPTION": {"visibility": "U", "parameters": {"RV_DESCRIPTION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_SETTINGS": {"visibility": "U", "parameters": {"CT_SETTINGS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"key": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_BACKGROUND=>TY_SETTINGS-KEY"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_BACKGROUND=>TY_SETTINGS-VALUE"})}, "zif_abapgit_background=>ty_settings", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_background=>ty_settings_tt");}, "is_optional": " "}}},
+  "RUN": {"visibility": "U", "parameters": {"IO_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_REPO_ONLINE", RTTIName: "\\CLASS=ZCL_ABAPGIT_REPO_ONLINE"});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "IT_SETTINGS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"key": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_BACKGROUND=>TY_SETTINGS-KEY"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_BACKGROUND=>TY_SETTINGS-VALUE"})}, "zif_abapgit_background=>ty_settings", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_background=>ty_settings_tt");}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_BACKGROUND'] = zif_abapgit_background;zif_abapgit_background.ty_settings = new abap.types.Structure({"key": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_BACKGROUND=>TY_SETTINGS-KEY"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_BACKGROUND=>TY_SETTINGS-VALUE"})}, "zif_abapgit_background=>ty_settings", undefined, {}, {});
+zif_abapgit_background.ty_settings_tt = abap.types.TableFactory.construct(new abap.types.Structure({"key": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_BACKGROUND=>TY_SETTINGS-KEY"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_BACKGROUND=>TY_SETTINGS-VALUE"})}, "zif_abapgit_background=>ty_settings", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_background=>ty_settings_tt");
+export {zif_abapgit_background};
+//# sourceMappingURL=zif_abapgit_background.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_code_inspector.intf.mjs.html b/output/zif_abapgit_code_inspector.intf.mjs.html new file mode 100644 index 00000000000..42d48d4545b --- /dev/null +++ b/output/zif_abapgit_code_inspector.intf.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/zif_abapgit_code_inspector.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_code_inspector.intf.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_code_inspector.intf.abap
+class zif_abapgit_code_inspector {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"RUN": {"visibility": "U", "parameters": {"RT_LIST": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"objtype": new abap.types.Character(4, {}), "objname": new abap.types.Character(40, {}), "sobjtype": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-sobjtype"}), "sobjname": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-sobjname"}), "kind": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-kind"}), "line": new abap.types.Numc({length: 6, qualifiedName: "zif_abapgit_code_inspector=>ty_result-line"}), "col": new abap.types.Numc({length: 4, qualifiedName: "zif_abapgit_code_inspector=>ty_result-col"}), "code": new abap.types.Character(10, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-code"}), "test": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-test"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_CODE_INSPECTOR=>TY_RESULT-TEXT"}), "param1": new abap.types.Character(80, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-param1"})}, "zif_abapgit_code_inspector=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_code_inspector=>ty_results");}, "is_optional": " "}, "IV_VARIANT": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"});}, "is_optional": " "}, "IV_SAVE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_SUCCESSFUL": {"visibility": "U", "parameters": {"RV_SUCCESS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_SUMMARY": {"visibility": "U", "parameters": {"RV_SUMMARY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "VALIDATE_CHECK_VARIANT": {"visibility": "U", "parameters": {"IV_CHECK_VARIANT_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"});}, "is_optional": " "}}},
+  "LIST_GLOBAL_VARIANTS": {"visibility": "U", "parameters": {"RT_LIST": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "description": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_CODE_INSPECTOR=>TY_VARIANT-DESCRIPTION"})}, "zif_abapgit_code_inspector=>ty_variant", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_code_inspector=>ty_variants");}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_CODE_INSPECTOR'] = zif_abapgit_code_inspector;zif_abapgit_code_inspector.ty_result = new abap.types.Structure({"objtype": new abap.types.Character(4, {}), "objname": new abap.types.Character(40, {}), "sobjtype": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-sobjtype"}), "sobjname": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-sobjname"}), "kind": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-kind"}), "line": new abap.types.Numc({length: 6, qualifiedName: "zif_abapgit_code_inspector=>ty_result-line"}), "col": new abap.types.Numc({length: 4, qualifiedName: "zif_abapgit_code_inspector=>ty_result-col"}), "code": new abap.types.Character(10, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-code"}), "test": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-test"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_CODE_INSPECTOR=>TY_RESULT-TEXT"}), "param1": new abap.types.Character(80, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-param1"})}, "zif_abapgit_code_inspector=>ty_result", undefined, {}, {});
+zif_abapgit_code_inspector.ty_results = abap.types.TableFactory.construct(new abap.types.Structure({"objtype": new abap.types.Character(4, {}), "objname": new abap.types.Character(40, {}), "sobjtype": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-sobjtype"}), "sobjname": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-sobjname"}), "kind": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-kind"}), "line": new abap.types.Numc({length: 6, qualifiedName: "zif_abapgit_code_inspector=>ty_result-line"}), "col": new abap.types.Numc({length: 4, qualifiedName: "zif_abapgit_code_inspector=>ty_result-col"}), "code": new abap.types.Character(10, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-code"}), "test": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-test"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_CODE_INSPECTOR=>TY_RESULT-TEXT"}), "param1": new abap.types.Character(80, {"qualifiedName":"zif_abapgit_code_inspector=>ty_result-param1"})}, "zif_abapgit_code_inspector=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_code_inspector=>ty_results");
+zif_abapgit_code_inspector.ty_variant = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "description": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_CODE_INSPECTOR=>TY_VARIANT-DESCRIPTION"})}, "zif_abapgit_code_inspector=>ty_variant", undefined, {}, {});
+zif_abapgit_code_inspector.ty_variants = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "description": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_CODE_INSPECTOR=>TY_VARIANT-DESCRIPTION"})}, "zif_abapgit_code_inspector=>ty_variant", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_code_inspector=>ty_variants");
+export {zif_abapgit_code_inspector};
+//# sourceMappingURL=zif_abapgit_code_inspector.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_comparator.intf.mjs.html b/output/zif_abapgit_comparator.intf.mjs.html new file mode 100644 index 00000000000..de3e9113e87 --- /dev/null +++ b/output/zif_abapgit_comparator.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_comparator.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_comparator.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_comparator.intf.abap
+class zif_abapgit_comparator {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"COMPARE": {"visibility": "U", "parameters": {"RS_RESULT": {"type": () => {return new abap.types.Structure({"text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_COMPARATOR=>TY_RESULT-TEXT"})}, "zif_abapgit_comparator=>ty_result", undefined, {}, {});}, "is_optional": " "}, "II_REMOTE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_COMPARATOR'] = zif_abapgit_comparator;zif_abapgit_comparator.ty_result = new abap.types.Structure({"text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_COMPARATOR=>TY_RESULT-TEXT"})}, "zif_abapgit_comparator=>ty_result", undefined, {}, {});
+export {zif_abapgit_comparator};
+//# sourceMappingURL=zif_abapgit_comparator.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_cts_api.intf.mjs.html b/output/zif_abapgit_cts_api.intf.mjs.html new file mode 100644 index 00000000000..b0396beb07f --- /dev/null +++ b/output/zif_abapgit_cts_api.intf.mjs.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for output/zif_abapgit_cts_api.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_cts_api.intf.mjs

+
+ +
+ 100% + Statements + 33/33 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 33/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +331x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_cts_api.intf.abap
+class zif_abapgit_cts_api {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_TRANSPORT_TYPE": {"type": () => {return new abap.types.Structure({"wb_request": new abap.types.Character(1, {}), "wb_repair": new abap.types.Character(1, {}), "wb_task": new abap.types.Character(1, {}), "cust_request": new abap.types.Character(1, {}), "cust_task": new abap.types.Character(1, {})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_TRANSPORT_CATEGORY": {"type": () => {return new abap.types.Structure({"workbench": new abap.types.Character(4, {}), "customizing": new abap.types.Character(4, {})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_TRANSPORT_MODE": {"type": () => {return new abap.types.Structure({"insert": new abap.types.Character(1, {}), "delete": new abap.types.Character(1, {})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"GET_TRANSPORT_FOR_OBJECT": {"visibility": "U", "parameters": {"RV_TRANSPORT": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "IS_CHREC_POSSIBLE_FOR_PACKAGE": {"visibility": "U", "parameters": {"RV_POSSIBLE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}}},
+  "GET_TRANSPORTS_FOR_LIST": {"visibility": "U", "parameters": {"RT_TRANSPORTS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "trkorr": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_cts_api=>ty_transport", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":false,"keyFields":["OBJ_TYPE","OBJ_NAME"]},"secondary":[]}, "zif_abapgit_cts_api=>ty_transport_list");}, "is_optional": " "}, "IT_ITEMS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_items_tt");}, "is_optional": " "}}},
+  "GET_R3TR_OBJ_FOR_LIMU_OBJ": {"visibility": "U", "parameters": {"IV_OBJECT": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJ_NAME": {"type": () => {return (() => { throw "Void type: TROBJ_NAME" })();}, "is_optional": " "}, "EV_OBJECT": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "EV_OBJ_NAME": {"type": () => {return (() => { throw "Void type: TROBJ_NAME" })();}, "is_optional": " "}}},
+  "READ_DESCRIPTION": {"visibility": "U", "parameters": {"RV_DESCRIPTION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TRKORR": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}}},
+  "READ_USER": {"visibility": "U", "parameters": {"RV_UNAME": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"UNAME","ddicName":"UNAME"});}, "is_optional": " "}, "IV_TRKORR": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}}},
+  "CREATE_TRANSPORT_ENTRIES": {"visibility": "U", "parameters": {"IV_TRANSPORT": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}, "IT_TABLE_INS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}, "IT_TABLE_UPD": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}, "IT_TABLE_DEL": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}, "IV_TABNAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"TABNAME","ddicName":"TABNAME"});}, "is_optional": " "}}},
+  "INSERT_TRANSPORT_OBJECT": {"visibility": "U", "parameters": {"IV_PGMID": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJECT": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJ_NAME": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"sy-langu","conversionExit":"ISOLA"});}, "is_optional": " "}, "IV_MODE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "EV_OBJECT": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "EV_OBJ_NAME": {"type": () => {return (() => { throw "Void type: TROBJ_NAME" })();}, "is_optional": " "}}},
+  "CONFIRM_TRANSPORT_MESSAGES": {"visibility": "U", "parameters": {"RV_MESSAGES_CONFIRMED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_CTS_API'] = zif_abapgit_cts_api;
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_type = new abap.types.Structure({"wb_request": new abap.types.Character(1, {}), "wb_repair": new abap.types.Character(1, {}), "wb_task": new abap.types.Character(1, {}), "cust_request": new abap.types.Character(1, {}), "cust_task": new abap.types.Character(1, {})}, undefined, undefined, {}, {});
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_type.get().wb_request.set('K');
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_type.get().wb_repair.set('R');
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_type.get().wb_task.set('S');
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_type.get().cust_request.set('W');
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_type.get().cust_task.set('Q');
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_category = new abap.types.Structure({"workbench": new abap.types.Character(4, {}), "customizing": new abap.types.Character(4, {})}, undefined, undefined, {}, {});
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_category.get().workbench.set('SYST');
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_category.get().customizing.set('CUST');
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_mode = new abap.types.Structure({"insert": new abap.types.Character(1, {}), "delete": new abap.types.Character(1, {})}, undefined, undefined, {}, {});
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_mode.get().insert.set('I');
+zif_abapgit_cts_api.zif_abapgit_cts_api$c_transport_mode.get().delete.set('D');
+zif_abapgit_cts_api.ty_transport = new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "trkorr": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_cts_api=>ty_transport", undefined, {}, {});
+zif_abapgit_cts_api.ty_transport_list = abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "trkorr": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_cts_api=>ty_transport", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":false,"keyFields":["OBJ_TYPE","OBJ_NAME"]},"secondary":[]}, "zif_abapgit_cts_api=>ty_transport_list");
+export {zif_abapgit_cts_api};
+//# sourceMappingURL=zif_abapgit_cts_api.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_data_config.intf.mjs.html b/output/zif_abapgit_data_config.intf.mjs.html new file mode 100644 index 00000000000..e3da14857a9 --- /dev/null +++ b/output/zif_abapgit_data_config.intf.mjs.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for output/zif_abapgit_data_config.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_data_config.intf.mjs

+
+ +
+ 100% + Statements + 31/31 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 31/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +311x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_data_config.intf.abap
+class zif_abapgit_data_config {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_DEFAULT_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_DEFAULT_FORMAT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_CONFIG": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_DATA_TYPE": {"type": () => {return new abap.types.Structure({"tabu": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "vdat": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "cdat": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "tdat": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"ADD_CONFIG": {"visibility": "U", "parameters": {"IS_CONFIG": {"type": () => {return new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "skip_initial": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "where": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE")}, "zif_abapgit_data_config=>ty_config", undefined, {}, {});}, "is_optional": " "}}},
+  "FROM_JSON": {"visibility": "U", "parameters": {"IT_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt");}, "is_optional": " "}}},
+  "GET_CONFIGS": {"visibility": "U", "parameters": {"RT_CONFIGS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "skip_initial": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "where": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE")}, "zif_abapgit_data_config=>ty_config", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["TYPE","NAME"]},"secondary":[]}, "zif_abapgit_data_config=>ty_config_tt");}, "is_optional": " "}}},
+  "REMOVE_CONFIG": {"visibility": "U", "parameters": {"IS_CONFIG": {"type": () => {return new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "skip_initial": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "where": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE")}, "zif_abapgit_data_config=>ty_config", undefined, {}, {});}, "is_optional": " "}}},
+  "TO_JSON": {"visibility": "U", "parameters": {"RT_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt");}, "is_optional": " "}}},
+  "UPDATE_CONFIG": {"visibility": "U", "parameters": {"IS_CONFIG": {"type": () => {return new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "skip_initial": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "where": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE")}, "zif_abapgit_data_config=>ty_config", undefined, {}, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_DATA_CONFIG'] = zif_abapgit_data_config;
+zif_abapgit_data_config.zif_abapgit_data_config$c_default_path = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_data_config.zif_abapgit_data_config$c_default_path.set('/data/');
+zif_abapgit_data_config.zif_abapgit_data_config$c_default_format = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_data_config.zif_abapgit_data_config$c_default_format.set('json');
+zif_abapgit_data_config.zif_abapgit_data_config$c_config = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_data_config.zif_abapgit_data_config$c_config.set('conf');
+zif_abapgit_data_config.zif_abapgit_data_config$c_data_type = new abap.types.Structure({"tabu": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "vdat": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "cdat": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "tdat": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"})}, undefined, undefined, {}, {});
+zif_abapgit_data_config.zif_abapgit_data_config$c_data_type.get().tabu.set('TABU');
+zif_abapgit_data_config.zif_abapgit_data_config$c_data_type.get().vdat.set('VDAT');
+zif_abapgit_data_config.zif_abapgit_data_config$c_data_type.get().cdat.set('CDAT');
+zif_abapgit_data_config.zif_abapgit_data_config$c_data_type.get().tdat.set('TDAT');
+zif_abapgit_data_config.ty_data_type = new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"});
+zif_abapgit_data_config.ty_config = new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "skip_initial": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "where": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE")}, "zif_abapgit_data_config=>ty_config", undefined, {}, {});
+zif_abapgit_data_config.ty_config_tt = abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "skip_initial": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "where": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "STRING_TABLE")}, "zif_abapgit_data_config=>ty_config", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["TYPE","NAME"]},"secondary":[]}, "zif_abapgit_data_config=>ty_config_tt");
+export {zif_abapgit_data_config};
+//# sourceMappingURL=zif_abapgit_data_config.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_data_deserializer.intf.mjs.html b/output/zif_abapgit_data_deserializer.intf.mjs.html new file mode 100644 index 00000000000..62afc0d739e --- /dev/null +++ b/output/zif_abapgit_data_deserializer.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/zif_abapgit_data_deserializer.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_data_deserializer.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_data_deserializer.intf.abap
+class zif_abapgit_data_deserializer {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"DESERIALIZE_CHECK": {"visibility": "U", "parameters": {"RS_CHECKS": {"type": () => {return new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {});}, "is_optional": " "}, "IO_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_REPO", RTTIName: "\\CLASS=ZCL_ABAPGIT_REPO"});}, "is_optional": " "}, "II_CONFIG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_DATA_CONFIG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_DATA_CONFIG"});}, "is_optional": " "}}},
+  "DESERIALIZE": {"visibility": "U", "parameters": {"RT_RESULT": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "deletes": new abap.types.DataReference(new abap.types.Character(4)), "updates": new abap.types.DataReference(new abap.types.Character(4)), "inserts": new abap.types.DataReference(new abap.types.Character(4)), "file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), "config": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {})}, "zif_abapgit_data_deserializer=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["TYPE","NAME"]},"secondary":[]}, "zif_abapgit_data_deserializer=>ty_results");}, "is_optional": " "}, "II_CONFIG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_DATA_CONFIG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_DATA_CONFIG"});}, "is_optional": " "}, "IT_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt");}, "is_optional": " "}}},
+  "ACTUALIZE": {"visibility": "U", "parameters": {"RT_ACCESSED_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_tt");}, "is_optional": " "}, "IS_CHECKS": {"type": () => {return new abap.types.Structure({"overwrite": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt"), "warning_package": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt"), "requirements": new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_requirements", undefined, {}, {}), "dependencies": new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_dependencies", undefined, {}, {}), "transport": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {}), "customizing": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {})}, "zif_abapgit_definitions=>ty_deserialize_checks", undefined, {}, {});}, "is_optional": " "}, "IT_RESULT": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "deletes": new abap.types.DataReference(new abap.types.Character(4)), "updates": new abap.types.DataReference(new abap.types.Character(4)), "inserts": new abap.types.DataReference(new abap.types.Character(4)), "file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), "config": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {})}, "zif_abapgit_data_deserializer=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["TYPE","NAME"]},"secondary":[]}, "zif_abapgit_data_deserializer=>ty_results");}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_DATA_DESERIALIZER'] = zif_abapgit_data_deserializer;zif_abapgit_data_deserializer.ty_result = new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "deletes": new abap.types.DataReference(new abap.types.Character(4)), "updates": new abap.types.DataReference(new abap.types.Character(4)), "inserts": new abap.types.DataReference(new abap.types.Character(4)), "file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), "config": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {})}, "zif_abapgit_data_deserializer=>ty_result", undefined, {}, {});
+zif_abapgit_data_deserializer.ty_results = abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {}), "deletes": new abap.types.DataReference(new abap.types.Character(4)), "updates": new abap.types.DataReference(new abap.types.Character(4)), "inserts": new abap.types.DataReference(new abap.types.Character(4)), "file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), "config": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {})}, "zif_abapgit_data_deserializer=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["TYPE","NAME"]},"secondary":[]}, "zif_abapgit_data_deserializer=>ty_results");
+export {zif_abapgit_data_deserializer};
+//# sourceMappingURL=zif_abapgit_data_deserializer.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_data_serializer.intf.mjs.html b/output/zif_abapgit_data_serializer.intf.mjs.html new file mode 100644 index 00000000000..04a45ab6984 --- /dev/null +++ b/output/zif_abapgit_data_serializer.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_data_serializer.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_data_serializer.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_data_serializer.intf.abap
+class zif_abapgit_data_serializer {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"SERIALIZE": {"visibility": "U", "parameters": {"RT_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt");}, "is_optional": " "}, "II_CONFIG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_DATA_CONFIG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_DATA_CONFIG"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_DATA_SERIALIZER'] = zif_abapgit_data_serializer;
+export {zif_abapgit_data_serializer};
+//# sourceMappingURL=zif_abapgit_data_serializer.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_data_supporter.intf.mjs.html b/output/zif_abapgit_data_supporter.intf.mjs.html new file mode 100644 index 00000000000..76ad5377b9b --- /dev/null +++ b/output/zif_abapgit_data_supporter.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_data_supporter.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_data_supporter.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_data_supporter.intf.abap
+class zif_abapgit_data_supporter {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"IS_OBJECT_SUPPORTED": {"visibility": "U", "parameters": {"RV_SUPPORTED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_TYPE": {"type": () => {return new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"});}, "is_optional": " "}, "IV_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_DATA_SUPPORTER'] = zif_abapgit_data_supporter;zif_abapgit_data_supporter.ty_object = new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {})}, "zif_abapgit_data_supporter=>ty_object", undefined, {}, {});
+zif_abapgit_data_supporter.ty_objects = abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {})}, "zif_abapgit_data_supporter=>ty_object", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["TYPE","NAME"]},"secondary":[]}, "zif_abapgit_data_supporter=>ty_objects");
+export {zif_abapgit_data_supporter};
+//# sourceMappingURL=zif_abapgit_data_supporter.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_definitions.intf.mjs.html b/output/zif_abapgit_definitions.intf.mjs.html new file mode 100644 index 00000000000..57f753044a0 --- /dev/null +++ b/output/zif_abapgit_definitions.intf.mjs.html @@ -0,0 +1,682 @@ + + + + + + Code coverage report for output/zif_abapgit_definitions.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_definitions.intf.mjs

+
+ +
+ 100% + Statements + 200/200 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 200/200 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +2001x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_definitions.intf.abap
+class zif_abapgit_definitions {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_SCI_RESULT": {"type": () => {return new abap.types.Structure({"no_run": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"}), "failed": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"}), "warning": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"}), "passed": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_DIFF": {"type": () => {return new abap.types.Structure({"unchanged": new abap.types.Character(1, {}), "insert": new abap.types.Character(1, {}), "delete": new abap.types.Character(1, {}), "update": new abap.types.Character(1, {})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_STATE": {"type": () => {return new abap.types.Structure({"unchanged": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "added": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "modified": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "deleted": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "mixed": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_ENGLISH": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_ROOT_DIR": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_DOT_ABAPGIT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_AUTHOR_REGEX": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_ACTION": {"type": () => {return new abap.types.Structure({"repo_refresh": new abap.types.String({qualifiedName: "STRING"}), "repo_remove": new abap.types.String({qualifiedName: "STRING"}), "repo_settings": new abap.types.String({qualifiedName: "STRING"}), "repo_local_settings": new abap.types.String({qualifiedName: "STRING"}), "repo_remote_settings": new abap.types.String({qualifiedName: "STRING"}), "repo_background": new abap.types.String({qualifiedName: "STRING"}), "repo_infos": new abap.types.String({qualifiedName: "STRING"}), "repo_purge": new abap.types.String({qualifiedName: "STRING"}), "repo_activate_objects": new abap.types.String({qualifiedName: "STRING"}), "repo_newonline": new abap.types.String({qualifiedName: "STRING"}), "repo_newoffline": new abap.types.String({qualifiedName: "STRING"}), "repo_add_all_obj_to_trans_req": new abap.types.String({qualifiedName: "STRING"}), "repo_refresh_checksums": new abap.types.String({qualifiedName: "STRING"}), "repo_toggle_fav": new abap.types.String({qualifiedName: "STRING"}), "repo_transport_to_branch": new abap.types.String({qualifiedName: "STRING"}), "repo_syntax_check": new abap.types.String({qualifiedName: "STRING"}), "repo_code_inspector": new abap.types.String({qualifiedName: "STRING"}), "repo_open_in_master_lang": new abap.types.String({qualifiedName: "STRING"}), "repo_log": new abap.types.String({qualifiedName: "STRING"}), "abapgit_home": new abap.types.String({qualifiedName: "STRING"}), "zip_import": new abap.types.String({qualifiedName: "STRING"}), "zip_export": new abap.types.String({qualifiedName: "STRING"}), "zip_export_transport": new abap.types.String({qualifiedName: "STRING"}), "zip_package": new abap.types.String({qualifiedName: "STRING"}), "zip_transport": new abap.types.String({qualifiedName: "STRING"}), "zip_object": new abap.types.String({qualifiedName: "STRING"}), "rfc_compare": new abap.types.String({qualifiedName: "STRING"}), "performance_test": new abap.types.String({qualifiedName: "STRING"}), "ie_devtools": new abap.types.String({qualifiedName: "STRING"}), "git_pull": new abap.types.String({qualifiedName: "STRING"}), "git_branch_create": new abap.types.String({qualifiedName: "STRING"}), "git_branch_switch": new abap.types.String({qualifiedName: "STRING"}), "git_branch_delete": new abap.types.String({qualifiedName: "STRING"}), "git_branch_merge": new abap.types.String({qualifiedName: "STRING"}), "git_tag_create": new abap.types.String({qualifiedName: "STRING"}), "git_tag_delete": new abap.types.String({qualifiedName: "STRING"}), "git_tag_switch": new abap.types.String({qualifiedName: "STRING"}), "git_commit": new abap.types.String({qualifiedName: "STRING"}), "db_display": new abap.types.String({qualifiedName: "STRING"}), "db_edit": new abap.types.String({qualifiedName: "STRING"}), "bg_update": new abap.types.String({qualifiedName: "STRING"}), "go_home": new abap.types.String({qualifiedName: "STRING"}), "go_back": new abap.types.String({qualifiedName: "STRING"}), "go_explore": new abap.types.String({qualifiedName: "STRING"}), "go_repo": new abap.types.String({qualifiedName: "STRING"}), "go_db": new abap.types.String({qualifiedName: "STRING"}), "go_background": new abap.types.String({qualifiedName: "STRING"}), "go_background_run": new abap.types.String({qualifiedName: "STRING"}), "go_repo_diff": new abap.types.String({qualifiedName: "STRING"}), "go_file_diff": new abap.types.String({qualifiedName: "STRING"}), "go_stage": new abap.types.String({qualifiedName: "STRING"}), "go_stage_transport": new abap.types.String({qualifiedName: "STRING"}), "go_commit": new abap.types.String({qualifiedName: "STRING"}), "go_debuginfo": new abap.types.String({qualifiedName: "STRING"}), "go_settings": new abap.types.String({qualifiedName: "STRING"}), "go_settings_personal": new abap.types.String({qualifiedName: "STRING"}), "go_tutorial": new abap.types.String({qualifiedName: "STRING"}), "go_patch": new abap.types.String({qualifiedName: "STRING"}), "jump": new abap.types.String({qualifiedName: "STRING"}), "jump_transport": new abap.types.String({qualifiedName: "STRING"}), "jump_user": new abap.types.String({qualifiedName: "STRING"}), "url": new abap.types.String({qualifiedName: "STRING"}), "goto_source": new abap.types.String({qualifiedName: "STRING"}), "show_callstack": new abap.types.String({qualifiedName: "STRING"}), "change_order_by": new abap.types.String({qualifiedName: "STRING"}), "toggle_favorites": new abap.types.String({qualifiedName: "STRING"}), "goto_message": new abap.types.String({qualifiedName: "STRING"}), "direction": new abap.types.String({qualifiedName: "STRING"}), "documentation": new abap.types.String({qualifiedName: "STRING"}), "changelog": new abap.types.String({qualifiedName: "STRING"}), "homepage": new abap.types.String({qualifiedName: "STRING"}), "sponsor": new abap.types.String({qualifiedName: "STRING"}), "clipboard": new abap.types.String({qualifiedName: "STRING"}), "yank_to_clipboard": new abap.types.String({qualifiedName: "STRING"}), "show_hotkeys": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_SPAGPA_PARAM_REPO_KEY": {"type": () => {return new abap.types.Character(20, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_SPAGPA_PARAM_PACKAGE": {"type": () => {return new abap.types.Character(20, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_NO": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_PARTIAL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no_partial"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_METHOD": {"type": () => {return new abap.types.Structure({"add": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"}), "rm": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"}), "ignore": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"}), "skip": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_ABAP_LANGUAGE_VERSION": {"type": () => {return new abap.types.Structure({"standard": new abap.types.Character(1, {}), "keyuser": new abap.types.Character(1, {}), "clouddevelopment": new abap.types.Character(1, {})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_DEFINITIONS'] = zif_abapgit_definitions;
+zif_abapgit_definitions.zif_abapgit_definitions$c_sci_result = new abap.types.Structure({"no_run": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"}), "failed": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"}), "warning": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"}), "passed": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"})}, undefined, undefined, {}, {});
+zif_abapgit_definitions.zif_abapgit_definitions$c_sci_result.get().no_run.set('');
+zif_abapgit_definitions.zif_abapgit_definitions$c_sci_result.get().failed.set('F');
+zif_abapgit_definitions.zif_abapgit_definitions$c_sci_result.get().warning.set('W');
+zif_abapgit_definitions.zif_abapgit_definitions$c_sci_result.get().passed.set('P');
+zif_abapgit_definitions.zif_abapgit_definitions$c_diff = new abap.types.Structure({"unchanged": new abap.types.Character(1, {}), "insert": new abap.types.Character(1, {}), "delete": new abap.types.Character(1, {}), "update": new abap.types.Character(1, {})}, undefined, undefined, {}, {});
+zif_abapgit_definitions.zif_abapgit_definitions$c_diff.get().unchanged.set(' ');
+zif_abapgit_definitions.zif_abapgit_definitions$c_diff.get().insert.set('I');
+zif_abapgit_definitions.zif_abapgit_definitions$c_diff.get().delete.set('D');
+zif_abapgit_definitions.zif_abapgit_definitions$c_diff.get().update.set('U');
+zif_abapgit_definitions.zif_abapgit_definitions$c_state = new abap.types.Structure({"unchanged": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "added": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "modified": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "deleted": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "mixed": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"})}, undefined, undefined, {}, {});
+zif_abapgit_definitions.zif_abapgit_definitions$c_state.get().unchanged.set('');
+zif_abapgit_definitions.zif_abapgit_definitions$c_state.get().added.set('A');
+zif_abapgit_definitions.zif_abapgit_definitions$c_state.get().modified.set('M');
+zif_abapgit_definitions.zif_abapgit_definitions$c_state.get().deleted.set('D');
+zif_abapgit_definitions.zif_abapgit_definitions$c_state.get().mixed.set('*');
+zif_abapgit_definitions.zif_abapgit_definitions$c_english = new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});
+zif_abapgit_definitions.zif_abapgit_definitions$c_english.set('E');
+zif_abapgit_definitions.zif_abapgit_definitions$c_root_dir = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_definitions.zif_abapgit_definitions$c_root_dir.set('/');
+zif_abapgit_definitions.zif_abapgit_definitions$c_dot_abapgit = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_definitions.zif_abapgit_definitions$c_dot_abapgit.set('.abapgit.xml');
+zif_abapgit_definitions.zif_abapgit_definitions$c_author_regex = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_definitions.zif_abapgit_definitions$c_author_regex.set('^(.+) <(.*)> (\\d{10})\\s?.\\d{4}$');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action = new abap.types.Structure({"repo_refresh": new abap.types.String({qualifiedName: "STRING"}), "repo_remove": new abap.types.String({qualifiedName: "STRING"}), "repo_settings": new abap.types.String({qualifiedName: "STRING"}), "repo_local_settings": new abap.types.String({qualifiedName: "STRING"}), "repo_remote_settings": new abap.types.String({qualifiedName: "STRING"}), "repo_background": new abap.types.String({qualifiedName: "STRING"}), "repo_infos": new abap.types.String({qualifiedName: "STRING"}), "repo_purge": new abap.types.String({qualifiedName: "STRING"}), "repo_activate_objects": new abap.types.String({qualifiedName: "STRING"}), "repo_newonline": new abap.types.String({qualifiedName: "STRING"}), "repo_newoffline": new abap.types.String({qualifiedName: "STRING"}), "repo_add_all_obj_to_trans_req": new abap.types.String({qualifiedName: "STRING"}), "repo_refresh_checksums": new abap.types.String({qualifiedName: "STRING"}), "repo_toggle_fav": new abap.types.String({qualifiedName: "STRING"}), "repo_transport_to_branch": new abap.types.String({qualifiedName: "STRING"}), "repo_syntax_check": new abap.types.String({qualifiedName: "STRING"}), "repo_code_inspector": new abap.types.String({qualifiedName: "STRING"}), "repo_open_in_master_lang": new abap.types.String({qualifiedName: "STRING"}), "repo_log": new abap.types.String({qualifiedName: "STRING"}), "abapgit_home": new abap.types.String({qualifiedName: "STRING"}), "zip_import": new abap.types.String({qualifiedName: "STRING"}), "zip_export": new abap.types.String({qualifiedName: "STRING"}), "zip_export_transport": new abap.types.String({qualifiedName: "STRING"}), "zip_package": new abap.types.String({qualifiedName: "STRING"}), "zip_transport": new abap.types.String({qualifiedName: "STRING"}), "zip_object": new abap.types.String({qualifiedName: "STRING"}), "rfc_compare": new abap.types.String({qualifiedName: "STRING"}), "performance_test": new abap.types.String({qualifiedName: "STRING"}), "ie_devtools": new abap.types.String({qualifiedName: "STRING"}), "git_pull": new abap.types.String({qualifiedName: "STRING"}), "git_branch_create": new abap.types.String({qualifiedName: "STRING"}), "git_branch_switch": new abap.types.String({qualifiedName: "STRING"}), "git_branch_delete": new abap.types.String({qualifiedName: "STRING"}), "git_branch_merge": new abap.types.String({qualifiedName: "STRING"}), "git_tag_create": new abap.types.String({qualifiedName: "STRING"}), "git_tag_delete": new abap.types.String({qualifiedName: "STRING"}), "git_tag_switch": new abap.types.String({qualifiedName: "STRING"}), "git_commit": new abap.types.String({qualifiedName: "STRING"}), "db_display": new abap.types.String({qualifiedName: "STRING"}), "db_edit": new abap.types.String({qualifiedName: "STRING"}), "bg_update": new abap.types.String({qualifiedName: "STRING"}), "go_home": new abap.types.String({qualifiedName: "STRING"}), "go_back": new abap.types.String({qualifiedName: "STRING"}), "go_explore": new abap.types.String({qualifiedName: "STRING"}), "go_repo": new abap.types.String({qualifiedName: "STRING"}), "go_db": new abap.types.String({qualifiedName: "STRING"}), "go_background": new abap.types.String({qualifiedName: "STRING"}), "go_background_run": new abap.types.String({qualifiedName: "STRING"}), "go_repo_diff": new abap.types.String({qualifiedName: "STRING"}), "go_file_diff": new abap.types.String({qualifiedName: "STRING"}), "go_stage": new abap.types.String({qualifiedName: "STRING"}), "go_stage_transport": new abap.types.String({qualifiedName: "STRING"}), "go_commit": new abap.types.String({qualifiedName: "STRING"}), "go_debuginfo": new abap.types.String({qualifiedName: "STRING"}), "go_settings": new abap.types.String({qualifiedName: "STRING"}), "go_settings_personal": new abap.types.String({qualifiedName: "STRING"}), "go_tutorial": new abap.types.String({qualifiedName: "STRING"}), "go_patch": new abap.types.String({qualifiedName: "STRING"}), "jump": new abap.types.String({qualifiedName: "STRING"}), "jump_transport": new abap.types.String({qualifiedName: "STRING"}), "jump_user": new abap.types.String({qualifiedName: "STRING"}), "url": new abap.types.String({qualifiedName: "STRING"}), "goto_source": new abap.types.String({qualifiedName: "STRING"}), "show_callstack": new abap.types.String({qualifiedName: "STRING"}), "change_order_by": new abap.types.String({qualifiedName: "STRING"}), "toggle_favorites": new abap.types.String({qualifiedName: "STRING"}), "goto_message": new abap.types.String({qualifiedName: "STRING"}), "direction": new abap.types.String({qualifiedName: "STRING"}), "documentation": new abap.types.String({qualifiedName: "STRING"}), "changelog": new abap.types.String({qualifiedName: "STRING"}), "homepage": new abap.types.String({qualifiedName: "STRING"}), "sponsor": new abap.types.String({qualifiedName: "STRING"}), "clipboard": new abap.types.String({qualifiedName: "STRING"}), "yank_to_clipboard": new abap.types.String({qualifiedName: "STRING"}), "show_hotkeys": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_refresh.set('repo_refresh');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_remove.set('repo_remove');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_settings.set('repo_settings');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_local_settings.set('repo_local_settings');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_remote_settings.set('repo_remote_settings');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_background.set('repo_background');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_infos.set('repo_infos');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_purge.set('repo_purge');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_activate_objects.set('activate_objects');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_newonline.set('repo_newonline');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_newoffline.set('repo_newoffline');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_add_all_obj_to_trans_req.set('repo_add_all_obj_to_trans_req');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_refresh_checksums.set('repo_refresh_checksums');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_toggle_fav.set('repo_toggle_fav');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_transport_to_branch.set('repo_transport_to_branch');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_syntax_check.set('repo_syntax_check');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_code_inspector.set('repo_code_inspector');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_open_in_master_lang.set('repo_open_in_master_lang');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().repo_log.set('repo_log');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().abapgit_home.set('abapgit_home');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().zip_import.set('zip_import');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().zip_export.set('zip_export');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().zip_export_transport.set('zip_export_transport');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().zip_package.set('zip_package');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().zip_transport.set('zip_transport');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().zip_object.set('zip_object');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().rfc_compare.set('rfc_compare');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().performance_test.set('performance_test');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().ie_devtools.set('ie_devtools');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_pull.set('git_pull');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_branch_create.set('git_branch_create');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_branch_switch.set('git_branch_switch');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_branch_delete.set('git_branch_delete');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_branch_merge.set('git_branch_merge');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_tag_create.set('git_tag_create');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_tag_delete.set('git_tag_delete');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_tag_switch.set('git_tag_switch');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().git_commit.set('git_commit');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().db_display.set('db_display');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().db_edit.set('db_edit');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().bg_update.set('bg_update');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_home.set('go_home');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_back.set('go_back');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_explore.set('go_explore');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_repo.set('go_repo');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_db.set('go_db');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_background.set('go_background');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_background_run.set('go_background_run');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_repo_diff.set('go_repo_diff');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_file_diff.set('go_fill_diff');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_stage.set('go_stage');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_stage_transport.set('go_stage_transport');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_commit.set('go_commit');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_debuginfo.set('go_debuginfo');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_settings.set('go_settings');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_settings_personal.set('go_settings_personal');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_tutorial.set('go_tutorial');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().go_patch.set('go_patch');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().jump.set('jump');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().jump_transport.set('jump_transport');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().jump_user.set('jump_user');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().url.set('url');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().goto_source.set('goto_source');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().show_callstack.set('show_callstack');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().change_order_by.set('change_order_by');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().toggle_favorites.set('toggle_favorites');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().goto_message.set('goto_message');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().direction.set('direction');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().documentation.set('documentation');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().changelog.set('changelog');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().homepage.set('homepage');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().sponsor.set('sponsor');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().clipboard.set('clipboard');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().yank_to_clipboard.set('yank_to_clipboard');
+zif_abapgit_definitions.zif_abapgit_definitions$c_action.get().show_hotkeys.set('show_hotkeys');
+zif_abapgit_definitions.zif_abapgit_definitions$c_spagpa_param_repo_key = new abap.types.Character(20, {});
+zif_abapgit_definitions.zif_abapgit_definitions$c_spagpa_param_repo_key.set('REPO_KEY');
+zif_abapgit_definitions.zif_abapgit_definitions$c_spagpa_param_package = new abap.types.Character(20, {});
+zif_abapgit_definitions.zif_abapgit_definitions$c_spagpa_param_package.set('PACKAGE');
+zif_abapgit_definitions.zif_abapgit_definitions$c_yes = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"});
+zif_abapgit_definitions.zif_abapgit_definitions$c_yes.set('Y');
+zif_abapgit_definitions.zif_abapgit_definitions$c_no = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"});
+zif_abapgit_definitions.zif_abapgit_definitions$c_no.set('N');
+zif_abapgit_definitions.zif_abapgit_definitions$c_partial = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no_partial"});
+zif_abapgit_definitions.zif_abapgit_definitions$c_partial.set('P');
+zif_abapgit_definitions.zif_abapgit_definitions$c_method = new abap.types.Structure({"add": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"}), "rm": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"}), "ignore": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"}), "skip": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"})}, undefined, undefined, {}, {});
+zif_abapgit_definitions.zif_abapgit_definitions$c_method.get().add.set('A');
+zif_abapgit_definitions.zif_abapgit_definitions$c_method.get().rm.set('R');
+zif_abapgit_definitions.zif_abapgit_definitions$c_method.get().ignore.set('I');
+zif_abapgit_definitions.zif_abapgit_definitions$c_method.get().skip.set('?');
+zif_abapgit_definitions.zif_abapgit_definitions$c_abap_language_version = new abap.types.Structure({"standard": new abap.types.Character(1, {}), "keyuser": new abap.types.Character(1, {}), "clouddevelopment": new abap.types.Character(1, {})}, undefined, undefined, {}, {});
+zif_abapgit_definitions.zif_abapgit_definitions$c_abap_language_version.get().standard.set('');
+zif_abapgit_definitions.zif_abapgit_definitions$c_abap_language_version.get().keyuser.set('2');
+zif_abapgit_definitions.zif_abapgit_definitions$c_abap_language_version.get().clouddevelopment.set('5');
+zif_abapgit_definitions.ty_string_tt = abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_string_tt");
+zif_abapgit_definitions.ty_item_signature = new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_definitions=>ty_item_signature", undefined, {}, {});
+zif_abapgit_definitions.ty_item = new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});
+zif_abapgit_definitions.ty_items_tt = abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_items_tt");
+zif_abapgit_definitions.ty_items_ts = abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]},"secondary":[]}, "zif_abapgit_definitions=>ty_items_ts");
+zif_abapgit_definitions.ty_file_item = new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_definitions=>ty_file_item", undefined, {}, {});
+zif_abapgit_definitions.ty_files_item_tt = abap.types.TableFactory.construct(new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_definitions=>ty_file_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_files_item_tt");
+zif_abapgit_definitions.ty_files_item_by_file_tt = abap.types.TableFactory.construct(new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_definitions=>ty_file_item", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["FILE-PATH","FILE-FILENAME"]},"secondary":[]}, "zif_abapgit_definitions=>ty_files_item_by_file_tt");
+zif_abapgit_definitions.ty_yes_no = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"});
+zif_abapgit_definitions.ty_yes_no_partial = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no_partial"});
+zif_abapgit_definitions.ty_overwrite = new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {});
+zif_abapgit_definitions.ty_overwrite_tt = abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt");
+zif_abapgit_definitions.ty_requirements = new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_requirements", undefined, {}, {});
+zif_abapgit_definitions.ty_dependencies = new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_dependencies", undefined, {}, {});
+zif_abapgit_definitions.ty_transport_type = new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {});
+zif_abapgit_definitions.ty_transport = new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {});
+zif_abapgit_definitions.ty_deserialize_checks = new abap.types.Structure({"overwrite": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt"), "warning_package": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt"), "requirements": new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_requirements", undefined, {}, {}), "dependencies": new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_dependencies", undefined, {}, {}), "transport": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {}), "customizing": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {})}, "zif_abapgit_definitions=>ty_deserialize_checks", undefined, {}, {});
+zif_abapgit_definitions.ty_delete_checks = new abap.types.Structure({"transport": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {})}, "zif_abapgit_definitions=>ty_delete_checks", undefined, {}, {});
+zif_abapgit_definitions.ty_metadata = new abap.types.Structure({"class_": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA-CLASS_"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA-VERSION"})}, "zif_abapgit_definitions=>ty_metadata", undefined, {}, {});
+zif_abapgit_definitions.ty_repo_file = new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_FILE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_FILE-FILENAME"}), "is_changed": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"})}, "zif_abapgit_definitions=>ty_repo_file", undefined, {}, {});
+zif_abapgit_definitions.ty_repo_file_tt = abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_FILE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_FILE-FILENAME"}), "is_changed": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"})}, "zif_abapgit_definitions=>ty_repo_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_repo_file_tt");
+zif_abapgit_definitions.ty_object = new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "type": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OBJECT-DATA"}), "adler32": new abap.types.Hex({length: 4}), "index": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OBJECT-INDEX"})}, "zif_abapgit_definitions=>ty_object", undefined, {}, {});
+zif_abapgit_definitions.ty_objects_tt = abap.types.TableFactory.construct(new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "type": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OBJECT-DATA"}), "adler32": new abap.types.Hex({length: 4}), "index": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OBJECT-INDEX"})}, "zif_abapgit_definitions=>ty_object", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"sha","type":"SORTED","isUnique":false,"keyFields":["SHA1"]},{"name":"type","type":"SORTED","isUnique":false,"keyFields":["TYPE","SHA1"]}]}, "zif_abapgit_definitions=>ty_objects_tt");
+zif_abapgit_definitions.ty_tadir = new abap.types.Structure({"pgmid": new abap.types.Character(4, {}), "object": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {}), "korrnum": new abap.types.Character(10, {}), "delflag": new abap.types.Character(1, {}), "genflag": new abap.types.Character(1, {}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TADIR-PATH"}), "srcsystem": new abap.types.Character(5, {}), "masterlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_tadir", undefined, {}, {});
+zif_abapgit_definitions.ty_tadir_tt = abap.types.TableFactory.construct(new abap.types.Structure({"pgmid": new abap.types.Character(4, {}), "object": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {}), "korrnum": new abap.types.Character(10, {}), "delflag": new abap.types.Character(1, {}), "genflag": new abap.types.Character(1, {}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TADIR-PATH"}), "srcsystem": new abap.types.Character(5, {}), "masterlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_tadir", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_tadir_tt");
+zif_abapgit_definitions.ty_result = new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-FILENAME"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "match": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_result", undefined, {}, {});
+zif_abapgit_definitions.ty_results_tt = abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-FILENAME"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "match": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"sec_key","type":"SORTED","isUnique":false,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_results_tt");
+zif_abapgit_definitions.ty_results_ts_path = abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-FILENAME"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "match": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"HASHED","isUnique":true,"keyFields":["PATH","FILENAME"]},"secondary":[]}, "zif_abapgit_definitions=>ty_results_ts_path");
+zif_abapgit_definitions.ty_stage_files = new abap.types.Structure({"local": abap.types.TableFactory.construct(new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_definitions=>ty_file_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_files_item_tt"), "remote": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt"), "status": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-FILENAME"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "match": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"HASHED","isUnique":true,"keyFields":["PATH","FILENAME"]},"secondary":[]}, "zif_abapgit_definitions=>ty_results_ts_path")}, "zif_abapgit_definitions=>ty_stage_files", undefined, {}, {});
+zif_abapgit_definitions.ty_tpool = new abap.types.Structure({"id": new abap.types.Character(1, {}), "key": new abap.types.Character(8, {}), "entry": new abap.types.Character(255, {}), "length": new abap.types.Integer({qualifiedName: "I"}), "split": new abap.types.Character(8, {"qualifiedName":"zif_abapgit_definitions=>ty_tpool-split"})}, "zif_abapgit_definitions=>ty_tpool", undefined, {}, {});
+zif_abapgit_definitions.ty_tpool_tt = abap.types.TableFactory.construct(new abap.types.Structure({"id": new abap.types.Character(1, {}), "key": new abap.types.Character(8, {}), "entry": new abap.types.Character(255, {}), "length": new abap.types.Integer({qualifiedName: "I"}), "split": new abap.types.Character(8, {"qualifiedName":"zif_abapgit_definitions=>ty_tpool-split"})}, "zif_abapgit_definitions=>ty_tpool", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_tpool_tt");
+zif_abapgit_definitions.ty_obj_attribute = new abap.types.Structure({"cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "attkeyfld": new abap.types.Character(1, {"qualifiedName":"SEOKEYFLD","ddicName":"SEOKEYFLD"}), "attbusobj": new abap.types.Character(1, {"qualifiedName":"SEOBUSOBJ","ddicName":"SEOBUSOBJ"}), "exposure": new abap.types.Numc({qualifiedName: "SEOEXPOSE"})}, "zif_abapgit_definitions=>ty_obj_attribute", undefined, {}, {});
+zif_abapgit_definitions.ty_obj_attribute_tt = abap.types.TableFactory.construct(new abap.types.Structure({"cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "attkeyfld": new abap.types.Character(1, {"qualifiedName":"SEOKEYFLD","ddicName":"SEOKEYFLD"}), "attbusobj": new abap.types.Character(1, {"qualifiedName":"SEOBUSOBJ","ddicName":"SEOBUSOBJ"}), "exposure": new abap.types.Numc({qualifiedName: "SEOEXPOSE"})}, "zif_abapgit_definitions=>ty_obj_attribute", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"cmpname","type":"SORTED","isUnique":false,"keyFields":["CMPNAME"]}]}, "zif_abapgit_definitions=>ty_obj_attribute_tt");
+zif_abapgit_definitions.ty_transport_to_branch = new abap.types.Structure({"branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TRANSPORT_TO_BRANCH-BRANCH_NAME"}), "commit_text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TRANSPORT_TO_BRANCH-COMMIT_TEXT"})}, "zif_abapgit_definitions=>ty_transport_to_branch", undefined, {}, {});
+zif_abapgit_definitions.ty_diff = new abap.types.Structure({"patch_flag": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "new_num": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_definitions=>ty_diff-new_num"}), "new": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DIFF-NEW"}), "result": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_diff-result"}), "old_num": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_definitions=>ty_diff-old_num"}), "old": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DIFF-OLD"}), "short": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "beacon": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DIFF-BEACON"})}, "zif_abapgit_definitions=>ty_diff", undefined, {}, {});
+zif_abapgit_definitions.ty_diffs_tt = abap.types.TableFactory.construct(new abap.types.Structure({"patch_flag": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "new_num": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_definitions=>ty_diff-new_num"}), "new": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DIFF-NEW"}), "result": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_diff-result"}), "old_num": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_definitions=>ty_diff-old_num"}), "old": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DIFF-OLD"}), "short": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "beacon": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DIFF-BEACON"})}, "zif_abapgit_definitions=>ty_diff", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"new_num","type":"SORTED","isUnique":false,"keyFields":["NEW_NUM"]},{"name":"old_num","type":"SORTED","isUnique":false,"keyFields":["OLD_NUM"]}]}, "zif_abapgit_definitions=>ty_diffs_tt");
+zif_abapgit_definitions.ty_count = new abap.types.Structure({"insert": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COUNT-INSERT"}), "delete": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COUNT-DELETE"}), "update": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COUNT-UPDATE"})}, "zif_abapgit_definitions=>ty_count", undefined, {}, {});
+zif_abapgit_definitions.ty_ancestor = new abap.types.Structure({"commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "tree": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "time": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_ANCESTOR-TIME"}), "body": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_ANCESTOR-BODY"})}, "zif_abapgit_definitions=>ty_ancestor", undefined, {}, {});
+zif_abapgit_definitions.ty_repo_item = new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "sortkey": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_ITEM-SORTKEY"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_ITEM-PATH"}), "is_dir": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "changes": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_ITEM-CHANGES"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "files": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_FILE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_FILE-FILENAME"}), "is_changed": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"})}, "zif_abapgit_definitions=>ty_repo_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_repo_file_tt"), "changed_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_repo_item", undefined, {}, {});
+zif_abapgit_definitions.ty_repo_item_tt = abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "sortkey": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_ITEM-SORTKEY"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_ITEM-PATH"}), "is_dir": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "changes": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_ITEM-CHANGES"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "files": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_FILE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_REPO_FILE-FILENAME"}), "is_changed": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"})}, "zif_abapgit_definitions=>ty_repo_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_repo_file_tt"), "changed_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_repo_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_repo_item_tt");
+zif_abapgit_definitions.ty_s_user_settings = new abap.types.Structure({"max_lines": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-MAX_LINES"}), "adt_jump_enabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "show_default_repo": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "link_hints_enabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "link_hint_key": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_s_user_settings-link_hint_key"}), "parallel_proc_disabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "icon_scaling": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_s_user_settings-icon_scaling"}), "ui_theme": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-UI_THEME"}), "hide_sapgui_hint": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "activate_wo_popup": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "label_colors": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-LABEL_COLORS"})}, "zif_abapgit_definitions=>ty_s_user_settings", undefined, {}, {});
+zif_abapgit_definitions.ty_list_settings = new abap.types.Structure({"filter": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_LIST_SETTINGS-FILTER"}), "only_favorites": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "show_details": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "order_by": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_LIST_SETTINGS-ORDER_BY"}), "order_descending": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_definitions=>ty_list_settings", undefined, {}, {});
+zif_abapgit_definitions.ty_dokil_tt = abap.types.TableFactory.construct(new abap.types.Structure({"id": new abap.types.Character(2, {}), "object": new abap.types.Character(60, {}), "langu": new abap.types.Character(1, {}), "typ": new abap.types.Character(1, {}), "version": new abap.types.Numc({length: 4}), "masterlang": new abap.types.Character(1, {}), "txtlines": new abap.types.Numc({length: 5}), "dokstate": new abap.types.Character(1, {}), "selfdef": new abap.types.Character(1, {})}, "DOKIL", "DOKIL", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_dokil_tt");
+zif_abapgit_definitions.ty_col_spec = new abap.types.Structure({"tech_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COL_SPEC-TECH_NAME"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COL_SPEC-DISPLAY_NAME"}), "css_class": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COL_SPEC-CSS_CLASS"}), "add_tz": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "title": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COL_SPEC-TITLE"}), "allow_order_by": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_definitions=>ty_col_spec", undefined, {}, {});
+zif_abapgit_definitions.ty_col_spec_tt = abap.types.TableFactory.construct(new abap.types.Structure({"tech_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COL_SPEC-TECH_NAME"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COL_SPEC-DISPLAY_NAME"}), "css_class": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COL_SPEC-CSS_CLASS"}), "add_tz": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "title": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_COL_SPEC-TITLE"}), "allow_order_by": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_definitions=>ty_col_spec", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["TECH_NAME"]},"secondary":[]}, "zif_abapgit_definitions=>ty_col_spec_tt");
+zif_abapgit_definitions.ty_proxy_bypass_url = new abap.types.Character(255, {"qualifiedName":"zif_abapgit_definitions=>ty_proxy_bypass_url"});
+zif_abapgit_definitions.ty_range_proxy_bypass_url = abap.types.TableFactory.construct(new abap.types.Structure({"sign": new abap.types.Character(1, undefined), "option": new abap.types.Character(2, undefined), "low": new abap.types.Character(255, {"qualifiedName":"zif_abapgit_definitions=>ty_proxy_bypass_url"}), "high": new abap.types.Character(255, {"qualifiedName":"zif_abapgit_definitions=>ty_proxy_bypass_url"})}, undefined, undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_range_proxy_bypass_url");
+zif_abapgit_definitions.ty_version = new abap.types.Structure({"major": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MAJOR"}), "minor": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-MINOR"}), "patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PATCH"}), "prerelase": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE"}), "prerelase_patch": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_VERSION-PRERELASE_PATCH"})}, "zif_abapgit_definitions=>ty_version", undefined, {}, {});
+zif_abapgit_definitions.ty_deserialization_step = new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"});
+zif_abapgit_definitions.ty_deserialization_step_tt = abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_deserialization_step_tt");
+zif_abapgit_definitions.ty_sci_result = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_sci_result"});
+zif_abapgit_definitions.ty_method = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"});
+zif_abapgit_definitions.ty_stage = new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "method": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"}), "status": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-FILENAME"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "match": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_result", undefined, {}, {})}, "zif_abapgit_definitions=>ty_stage", undefined, {}, {});
+zif_abapgit_definitions.ty_stage_tt = abap.types.TableFactory.construct(new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "method": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_method"}), "status": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-FILENAME"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "match": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_result", undefined, {}, {})}, "zif_abapgit_definitions=>ty_stage", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["FILE-PATH","FILE-FILENAME"]},"secondary":[]}, "zif_abapgit_definitions=>ty_stage_tt");
+zif_abapgit_definitions.ty_sap_langu_tab = abap.types.TableFactory.construct(new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_sap_langu_tab");
+zif_abapgit_definitions.ty_languages = abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages");
+zif_abapgit_definitions.ty_i18n_params = new abap.types.Structure({"main_language": new abap.types.Character(1, {"qualifiedName":"sy-langu","conversionExit":"ISOLA"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "translation_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_definitions=>ty_i18n_params", undefined, {}, {});
+zif_abapgit_definitions.ty_trrngtrkor_tt = abap.types.TableFactory.construct(new abap.types.Structure({"sign": new abap.types.Character(1, undefined), "option": new abap.types.Character(2, undefined), "low": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "high": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, undefined, undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_trrngtrkor_tt");
+export {zif_abapgit_definitions};
+//# sourceMappingURL=zif_abapgit_definitions.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_dot_abapgit.intf.mjs.html b/output/zif_abapgit_dot_abapgit.intf.mjs.html new file mode 100644 index 00000000000..5fd4aa9c259 --- /dev/null +++ b/output/zif_abapgit_dot_abapgit.intf.mjs.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for output/zif_abapgit_dot_abapgit.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_dot_abapgit.intf.mjs

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_dot_abapgit.intf.abap
+class zif_abapgit_dot_abapgit {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_FOLDER_LOGIC": {"type": () => {return new abap.types.Structure({"prefix": new abap.types.String({qualifiedName: "STRING"}), "full": new abap.types.String({qualifiedName: "STRING"}), "mixed": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_ABAP_LANGUAGE_VERSION": {"type": () => {return new abap.types.Structure({"standard": new abap.types.String({qualifiedName: "STRING"}), "key_user": new abap.types.String({qualifiedName: "STRING"}), "cloud_development": new abap.types.String({qualifiedName: "STRING"}), "undefined": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_DOT_ABAPGIT'] = zif_abapgit_dot_abapgit;
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_folder_logic = new abap.types.Structure({"prefix": new abap.types.String({qualifiedName: "STRING"}), "full": new abap.types.String({qualifiedName: "STRING"}), "mixed": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_folder_logic.get().prefix.set('PREFIX');
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_folder_logic.get().full.set('FULL');
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_folder_logic.get().mixed.set('MIXED');
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_abap_language_version = new abap.types.Structure({"standard": new abap.types.String({qualifiedName: "STRING"}), "key_user": new abap.types.String({qualifiedName: "STRING"}), "cloud_development": new abap.types.String({qualifiedName: "STRING"}), "undefined": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_abap_language_version.get().standard.set('standard');
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_abap_language_version.get().key_user.set('keyUser');
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_abap_language_version.get().cloud_development.set('cloudDevelopment');
+zif_abapgit_dot_abapgit.zif_abapgit_dot_abapgit$c_abap_language_version.get().undefined.set('undefined');
+zif_abapgit_dot_abapgit.ty_requirement = new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {});
+zif_abapgit_dot_abapgit.ty_requirement_tt = abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt");
+zif_abapgit_dot_abapgit.ty_dot_abapgit = new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {});
+export {zif_abapgit_dot_abapgit};
+//# sourceMappingURL=zif_abapgit_dot_abapgit.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_ecatt.intf.mjs.html b/output/zif_abapgit_ecatt.intf.mjs.html new file mode 100644 index 00000000000..648dad7b01c --- /dev/null +++ b/output/zif_abapgit_ecatt.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/zif_abapgit_ecatt.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_ecatt.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_ecatt.intf.abap
+class zif_abapgit_ecatt {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_ECATT'] = zif_abapgit_ecatt;zif_abapgit_ecatt.ty_invert_validation = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_ecatt=>ty_invert_validation"});
+zif_abapgit_ecatt.ty_error_prio = new abap.types.Numc({qualifiedName: "zif_abapgit_ecatt=>ty_error_prio"});
+zif_abapgit_ecatt.ty_impl_name = new abap.types.Character(30, {"qualifiedName":"zif_abapgit_ecatt=>ty_impl_name"});
+zif_abapgit_ecatt.ty_impl_type = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_ecatt=>ty_impl_type"});
+zif_abapgit_ecatt.ty_impl_subtype = new abap.types.Character(4, {"qualifiedName":"zif_abapgit_ecatt=>ty_impl_subtype"});
+zif_abapgit_ecatt.ty_package = new abap.types.Character(255, {"qualifiedName":"zif_abapgit_ecatt=>ty_package"});
+zif_abapgit_ecatt.ty_impl_det = new abap.types.Structure({"impl_name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_ecatt=>ty_impl_name"}), "impl_type": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_ecatt=>ty_impl_type"}), "impl_subtype": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_ecatt=>ty_impl_subtype"}), "impl_package": new abap.types.Character(255, {"qualifiedName":"zif_abapgit_ecatt=>ty_package"})}, "zif_abapgit_ecatt=>ty_impl_det", undefined, {}, {});
+export {zif_abapgit_ecatt};
+//# sourceMappingURL=zif_abapgit_ecatt.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_ecatt_download.intf.mjs.html b/output/zif_abapgit_ecatt_download.intf.mjs.html new file mode 100644 index 00000000000..b99150a555d --- /dev/null +++ b/output/zif_abapgit_ecatt_download.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_ecatt_download.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_ecatt_download.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_ecatt_download.intf.abap
+class zif_abapgit_ecatt_download {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_XML_STREAM": {"visibility": "U", "parameters": {"RV_XML_STREAM": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_ECATT_DOWNLOAD'] = zif_abapgit_ecatt_download;
+export {zif_abapgit_ecatt_download};
+//# sourceMappingURL=zif_abapgit_ecatt_download.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_ecatt_upload.intf.mjs.html b/output/zif_abapgit_ecatt_upload.intf.mjs.html new file mode 100644 index 00000000000..3a37de5f5a5 --- /dev/null +++ b/output/zif_abapgit_ecatt_upload.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_ecatt_upload.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_ecatt_upload.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_ecatt_upload.intf.abap
+class zif_abapgit_ecatt_upload {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"SET_STREAM_FOR_UPLOAD": {"visibility": "U", "parameters": {"IV_XML": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_ECATT_UPLOAD'] = zif_abapgit_ecatt_upload;
+export {zif_abapgit_ecatt_upload};
+//# sourceMappingURL=zif_abapgit_ecatt_upload.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_environment.intf.mjs.html b/output/zif_abapgit_environment.intf.mjs.html new file mode 100644 index 00000000000..9943a851504 --- /dev/null +++ b/output/zif_abapgit_environment.intf.mjs.html @@ -0,0 +1,136 @@ + + + + + + Code coverage report for output/zif_abapgit_environment.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_environment.intf.mjs

+
+ +
+ 100% + Statements + 18/18 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 18/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +181x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_environment.intf.abap
+class zif_abapgit_environment {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"IS_SAP_CLOUD_PLATFORM": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_MERGED": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_REPO_OBJECT_CHANGES_ALLOWED": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "COMPARE_WITH_INACTIVE": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_RESTART_REQUIRED": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_SAP_OBJECT_ALLOWED": {"visibility": "U", "parameters": {"RV_ALLOWED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_BASIS_RELEASE": {"visibility": "U", "parameters": {"RS_RESULT": {"type": () => {return new abap.types.Structure({"release": new abap.types.Character(10, {"qualifiedName":"zif_abapgit_environment=>ty_release_sp-release"}), "sp": new abap.types.Character(10, {"qualifiedName":"zif_abapgit_environment=>ty_release_sp-sp"})}, "zif_abapgit_environment=>ty_release_sp", undefined, {}, {});}, "is_optional": " "}}},
+  "GET_SYSTEM_LANGUAGE_FILTER": {"visibility": "U", "parameters": {"RT_SYSTEM_LANGUAGE_FILTER": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"sign": new abap.types.Character(1, undefined), "option": new abap.types.Character(2, undefined), "low": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "high": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"})}, undefined, undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_environment=>ty_system_language_filter");}, "is_optional": " "}}},
+  "IS_VARIANT_MAINTENANCE": {"visibility": "U", "parameters": {"RV_IS_VARIANT_MAINTENANCE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_ENVIRONMENT'] = zif_abapgit_environment;zif_abapgit_environment.ty_release_sp = new abap.types.Structure({"release": new abap.types.Character(10, {"qualifiedName":"zif_abapgit_environment=>ty_release_sp-release"}), "sp": new abap.types.Character(10, {"qualifiedName":"zif_abapgit_environment=>ty_release_sp-sp"})}, "zif_abapgit_environment=>ty_release_sp", undefined, {}, {});
+zif_abapgit_environment.ty_system_language_filter = abap.types.TableFactory.construct(new abap.types.Structure({"sign": new abap.types.Character(1, undefined), "option": new abap.types.Character(2, undefined), "low": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "high": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"})}, undefined, undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_environment=>ty_system_language_filter");
+export {zif_abapgit_environment};
+//# sourceMappingURL=zif_abapgit_environment.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_exit.intf.mjs.html b/output/zif_abapgit_exit.intf.mjs.html new file mode 100644 index 00000000000..bd3874881ed --- /dev/null +++ b/output/zif_abapgit_exit.intf.mjs.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for output/zif_abapgit_exit.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_exit.intf.mjs

+
+ +
+ 100% + Statements + 35/35 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 35/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +351x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_exit.intf.abap
+class zif_abapgit_exit {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ADJUST_DISPLAY_COMMIT_URL": {"visibility": "U", "parameters": {"IV_REPO_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_REPO_NAME": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_REPO_KEY": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_COMMIT_HASH": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"});}, "is_optional": " "}, "CV_DISPLAY_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}},
+  "ADJUST_DISPLAY_FILENAME": {"visibility": "U", "parameters": {"RV_FILENAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_FILENAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ALLOW_SAP_OBJECTS": {"visibility": "U", "parameters": {"RV_ALLOWED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "CHANGE_LOCAL_HOST": {"visibility": "U", "parameters": {"CT_HOSTS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_string_tt");}, "is_optional": " "}}},
+  "CHANGE_PROXY_AUTHENTICATION": {"visibility": "U", "parameters": {"IV_REPO_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "CV_PROXY_AUTHENTICATION": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "CHANGE_PROXY_PORT": {"visibility": "U", "parameters": {"IV_REPO_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "CV_PROXY_PORT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CHANGE_PROXY_URL": {"visibility": "U", "parameters": {"IV_REPO_URL": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "CV_PROXY_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CHANGE_SUPPORTED_DATA_OBJECTS": {"visibility": "U", "parameters": {"CT_OBJECTS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(4, {"qualifiedName":"zif_abapgit_data_config=>ty_data_type"}), "name": new abap.types.Character(40, {})}, "zif_abapgit_data_supporter=>ty_object", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["TYPE","NAME"]},"secondary":[]}, "zif_abapgit_data_supporter=>ty_objects");}, "is_optional": " "}}},
+  "CHANGE_SUPPORTED_OBJECT_TYPES": {"visibility": "U", "parameters": {"CT_TYPES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_exit=>ty_object_types");}, "is_optional": " "}}},
+  "CHANGE_TADIR": {"visibility": "U", "parameters": {"IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "CT_TADIR": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"pgmid": new abap.types.Character(4, {}), "object": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {}), "korrnum": new abap.types.Character(10, {}), "delflag": new abap.types.Character(1, {}), "genflag": new abap.types.Character(1, {}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TADIR-PATH"}), "srcsystem": new abap.types.Character(5, {}), "masterlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_tadir", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_tadir_tt");}, "is_optional": " "}}},
+  "CREATE_HTTP_CLIENT": {"visibility": "U", "parameters": {"RI_CLIENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_CLIENT", RTTIName: "\\INTERFACE=IF_HTTP_CLIENT"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CUSTOM_SERIALIZE_ABAP_CLIF": {"visibility": "U", "parameters": {"RT_SOURCE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_string_tt");}, "is_optional": " "}, "IS_CLASS_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"abap_classname"})}, "zif_abapgit_exit=>ty_class_key", undefined, {}, {});}, "is_optional": " "}, "IT_SOURCE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_string_tt");}, "is_optional": " "}}},
+  "DESERIALIZE_POSTPROCESS": {"visibility": "U", "parameters": {"IS_STEP": {"type": () => {return new abap.types.Structure({"step_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_OBJECTS=>TY_STEP_DATA-ORDER"}), "descr": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_OBJECTS=>TY_STEP_DATA-DESCR"}), "syntax_check": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "objects": abap.types.TableFactory.construct(new abap.types.Structure({"obj": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_OBJECT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_OBJECT"}), "xml": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_objects=>ty_deserialization", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_objects=>ty_deserialization_tt")}, "zif_abapgit_objects=>ty_step_data", undefined, {}, {});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}}},
+  "DETERMINE_TRANSPORT_REQUEST": {"visibility": "U", "parameters": {"IO_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_REPO", RTTIName: "\\CLASS=ZCL_ABAPGIT_REPO"});}, "is_optional": " "}, "IV_TRANSPORT_TYPE": {"type": () => {return new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {});}, "is_optional": " "}, "CV_TRANSPORT_REQUEST": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}}},
+  "GET_CI_TESTS": {"visibility": "U", "parameters": {"IV_OBJECT": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "CT_CI_REPOS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_EXIT=>TY_CI_REPO-NAME"}), "clone_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_EXIT=>TY_CI_REPO-CLONE_URL"})}, "zif_abapgit_exit=>ty_ci_repo", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_exit=>ty_ci_repos");}, "is_optional": " "}}},
+  "GET_SSL_ID": {"visibility": "U", "parameters": {"RV_SSL_ID": {"type": () => {return new abap.types.Character(6, {"qualifiedName":"SSFAPPLSSL","ddicName":"SSFAPPLSSL"});}, "is_optional": " "}}},
+  "HTTP_CLIENT": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "II_CLIENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_HTTP_CLIENT", RTTIName: "\\INTERFACE=IF_HTTP_CLIENT"});}, "is_optional": " "}}},
+  "ON_EVENT": {"visibility": "U", "parameters": {"RS_HANDLED": {"type": () => {return new abap.types.Structure({"page": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_RENDERABLE", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_RENDERABLE"}), "state": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_GUI_EVENT_HANDLER=>TY_HANDLING_RESULT-STATE"})}, "zif_abapgit_gui_event_handler=>ty_handling_result", undefined, {}, {});}, "is_optional": " "}, "II_EVENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_EVENT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_EVENT"});}, "is_optional": " "}}},
+  "PRE_CALCULATE_REPO_STATUS": {"visibility": "U", "parameters": {"IS_REPO_META": {"type": () => {return new abap.types.Structure({"key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo", undefined, {}, {});}, "is_optional": " "}, "CT_LOCAL": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_definitions=>ty_file_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_files_item_tt");}, "is_optional": " "}, "CT_REMOTE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt");}, "is_optional": " "}}},
+  "SERIALIZE_POSTPROCESS": {"visibility": "U", "parameters": {"IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "CT_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_definitions=>ty_file_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_files_item_tt");}, "is_optional": " "}}},
+  "VALIDATE_BEFORE_PUSH": {"visibility": "U", "parameters": {"IS_COMMENT": {"type": () => {return new abap.types.Structure({"committer": new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-NAME"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-EMAIL"})}, "zif_abapgit_git_definitions=>ty_git_user", undefined, {}, {}), "author": new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-NAME"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-EMAIL"})}, "zif_abapgit_git_definitions=>ty_git_user", undefined, {}, {}), "comment": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMENT-COMMENT"})}, "zif_abapgit_git_definitions=>ty_comment", undefined, {}, {});}, "is_optional": " "}, "IO_STAGE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STAGE", RTTIName: "\\CLASS=ZCL_ABAPGIT_STAGE"});}, "is_optional": " "}, "IO_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_REPO_ONLINE", RTTIName: "\\CLASS=ZCL_ABAPGIT_REPO_ONLINE"});}, "is_optional": " "}}},
+  "WALL_MESSAGE_LIST": {"visibility": "U", "parameters": {"II_HTML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}}},
+  "WALL_MESSAGE_REPO": {"visibility": "U", "parameters": {"IS_REPO_META": {"type": () => {return new abap.types.Structure({"key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo", undefined, {}, {});}, "is_optional": " "}, "II_HTML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}}},
+  "ENHANCE_REPO_TOOLBAR": {"visibility": "U", "parameters": {"IO_MENU": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_HTML_TOOLBAR", RTTIName: "\\CLASS=ZCL_ABAPGIT_HTML_TOOLBAR"});}, "is_optional": " "}, "IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}, "IV_ACT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_EXIT'] = zif_abapgit_exit;zif_abapgit_exit.ty_ci_repo = new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_EXIT=>TY_CI_REPO-NAME"}), "clone_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_EXIT=>TY_CI_REPO-CLONE_URL"})}, "zif_abapgit_exit=>ty_ci_repo", undefined, {}, {});
+zif_abapgit_exit.ty_ci_repos = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_EXIT=>TY_CI_REPO-NAME"}), "clone_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_EXIT=>TY_CI_REPO-CLONE_URL"})}, "zif_abapgit_exit=>ty_ci_repo", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_exit=>ty_ci_repos");
+zif_abapgit_exit.ty_object_types = abap.types.TableFactory.construct(new abap.types.Character(4, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_exit=>ty_object_types");
+zif_abapgit_exit.ty_class_key = new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"abap_classname"})}, "zif_abapgit_exit=>ty_class_key", undefined, {}, {});
+export {zif_abapgit_exit};
+//# sourceMappingURL=zif_abapgit_exit.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_field_rules.intf.mjs.html b/output/zif_abapgit_field_rules.intf.mjs.html new file mode 100644 index 00000000000..4083728a2b0 --- /dev/null +++ b/output/zif_abapgit_field_rules.intf.mjs.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for output/zif_abapgit_field_rules.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_field_rules.intf.mjs

+
+ +
+ 100% + Statements + 19/19 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 19/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +191x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_field_rules.intf.abap
+class zif_abapgit_field_rules {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_FILL_RULE": {"type": () => {return new abap.types.Structure({"date": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "time": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "timestamp": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "user": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "client": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "package": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"ADD": {"visibility": "U", "parameters": {"RO_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_FIELD_RULES", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_FIELD_RULES"});}, "is_optional": " "}, "IV_TABLE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"TABNAME","ddicName":"TABNAME"});}, "is_optional": " "}, "IV_FIELD": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"FIELDNAME","ddicName":"FIELDNAME"});}, "is_optional": " "}, "IV_FILL_RULE": {"type": () => {return new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"});}, "is_optional": " "}}},
+  "APPLY_CLEAR_LOGIC": {"visibility": "U", "parameters": {"IV_TABLE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"TABNAME","ddicName":"TABNAME"});}, "is_optional": " "}, "CT_DATA": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}}},
+  "APPLY_FILL_LOGIC": {"visibility": "U", "parameters": {"IV_TABLE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"TABNAME","ddicName":"TABNAME"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "CT_DATA": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_FIELD_RULES'] = zif_abapgit_field_rules;
+zif_abapgit_field_rules.zif_abapgit_field_rules$c_fill_rule = new abap.types.Structure({"date": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "time": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "timestamp": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "user": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "client": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"}), "package": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"})}, undefined, undefined, {}, {});
+zif_abapgit_field_rules.zif_abapgit_field_rules$c_fill_rule.get().date.set('DT');
+zif_abapgit_field_rules.zif_abapgit_field_rules$c_fill_rule.get().time.set('TM');
+zif_abapgit_field_rules.zif_abapgit_field_rules$c_fill_rule.get().timestamp.set('TS');
+zif_abapgit_field_rules.zif_abapgit_field_rules$c_fill_rule.get().user.set('UR');
+zif_abapgit_field_rules.zif_abapgit_field_rules$c_fill_rule.get().client.set('CT');
+zif_abapgit_field_rules.zif_abapgit_field_rules$c_fill_rule.get().package.set('PK');
+zif_abapgit_field_rules.ty_fill_rule = new abap.types.Character(2, {"qualifiedName":"zif_abapgit_field_rules=>ty_fill_rule"});
+export {zif_abapgit_field_rules};
+//# sourceMappingURL=zif_abapgit_field_rules.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_frontend_services.intf.mjs.html b/output/zif_abapgit_frontend_services.intf.mjs.html new file mode 100644 index 00000000000..56288e81bdb --- /dev/null +++ b/output/zif_abapgit_frontend_services.intf.mjs.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for output/zif_abapgit_frontend_services.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_frontend_services.intf.mjs

+
+ +
+ 100% + Statements + 27/27 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 27/27 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_frontend_services.intf.abap
+class zif_abapgit_frontend_services {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"FILE_UPLOAD": {"visibility": "U", "parameters": {"RV_XSTR": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "FILE_DOWNLOAD": {"visibility": "U", "parameters": {"IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_XSTR": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "SHOW_FILE_SAVE_DIALOG": {"visibility": "U", "parameters": {"RV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_EXTENSION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_DEFAULT_FILENAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SHOW_FILE_OPEN_DIALOG": {"visibility": "U", "parameters": {"RV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_EXTENSION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_DEFAULT_FILENAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CLIPBOARD_EXPORT": {"visibility": "U", "parameters": {"IV_NO_AUTH_CHECK": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IT_DATA": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}}},
+  "EXECUTE": {"visibility": "U", "parameters": {"IV_DOCUMENT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_APPLICATION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PARAMETER": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_DEFAULT_DIRECTORY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_MAXIMIZED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_MINIMIZED": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_SYNCHRONOUS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_OPERATION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_SYSTEM_DIRECTORY": {"visibility": "U", "parameters": {"CV_SYSTEM_DIRECTORY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DIRECTORY_BROWSE": {"visibility": "U", "parameters": {"IV_WINDOW_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_INITIAL_FOLDER": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "CV_SELECTED_FOLDER": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_FILE_SEPARATOR": {"visibility": "U", "parameters": {"CV_FILE_SEPARATOR": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_frontend_services=>ty_char1"});}, "is_optional": " "}}},
+  "GET_GUI_VERSION": {"visibility": "U", "parameters": {"EV_GUI_RELEASE": {"type": () => {return new abap.types.Numc({length: 4, qualifiedName: "zif_abapgit_frontend_services=>ty_gui_release"});}, "is_optional": " "}, "EV_GUI_SP": {"type": () => {return new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_frontend_services=>ty_gui_sp"});}, "is_optional": " "}, "EV_GUI_PATCH": {"type": () => {return new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_frontend_services=>ty_gui_patch"});}, "is_optional": " "}, "EV_GUI_VERSION_STRING": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DIRECTORY_EXIST": {"visibility": "U", "parameters": {"RV_EXISTS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_DIRECTORY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "DIRECTORY_CREATE": {"visibility": "U", "parameters": {"IV_DIRECTORY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "CV_RC": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GUI_IS_AVAILABLE": {"visibility": "U", "parameters": {"RV_GUI_IS_AVAILABLE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_SAPGUI_FOR_JAVA": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_SAPGUI_FOR_WINDOWS": {"visibility": "U", "parameters": {"RV_RESULT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_WEBGUI": {"visibility": "U", "parameters": {"RV_IS_WEBGUI": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_FRONTEND_SERVICES'] = zif_abapgit_frontend_services;zif_abapgit_frontend_services.ty_char1 = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_frontend_services=>ty_char1"});
+zif_abapgit_frontend_services.ty_gui_release = new abap.types.Numc({length: 4, qualifiedName: "zif_abapgit_frontend_services=>ty_gui_release"});
+zif_abapgit_frontend_services.ty_gui_sp = new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_frontend_services=>ty_gui_sp"});
+zif_abapgit_frontend_services.ty_gui_patch = new abap.types.Numc({length: 2, qualifiedName: "zif_abapgit_frontend_services=>ty_gui_patch"});
+export {zif_abapgit_frontend_services};
+//# sourceMappingURL=zif_abapgit_frontend_services.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_git_definitions.intf.mjs.html b/output/zif_abapgit_git_definitions.intf.mjs.html new file mode 100644 index 00000000000..2a628bba0d5 --- /dev/null +++ b/output/zif_abapgit_git_definitions.intf.mjs.html @@ -0,0 +1,268 @@ + + + + + + Code coverage report for output/zif_abapgit_git_definitions.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_git_definitions.intf.mjs

+
+ +
+ 100% + Statements + 62/62 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 62/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +621x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_git_definitions.intf.abap
+class zif_abapgit_git_definitions {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_CHMOD": {"type": () => {return new abap.types.Structure({"file": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"}), "executable": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"}), "dir": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"}), "submodule": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_TYPE": {"type": () => {return new abap.types.Structure({"commit": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "tree": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "ref_d": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "tag": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "blob": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_GIT_BRANCH_TYPE": {"type": () => {return new abap.types.Structure({"branch": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "lightweight_tag": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "annotated_tag": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "other": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_HEAD_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_GIT_BRANCH": {"type": () => {return new abap.types.Structure({"main": new abap.types.String({qualifiedName: "STRING"}), "prefix": new abap.types.String({qualifiedName: "STRING"}), "heads_prefix": new abap.types.String({qualifiedName: "STRING"}), "heads": new abap.types.String({qualifiedName: "STRING"}), "tags_prefix": new abap.types.String({qualifiedName: "STRING"}), "tags": new abap.types.String({qualifiedName: "STRING"}), "peel": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_GIT_DEFINITIONS'] = zif_abapgit_git_definitions;
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_chmod = new abap.types.Structure({"file": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"}), "executable": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"}), "dir": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"}), "submodule": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, undefined, undefined, {}, {});
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_chmod.get().file.set('100644');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_chmod.get().executable.set('100755');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_chmod.get().dir.set('40000 ');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_chmod.get().submodule.set('160000');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_type = new abap.types.Structure({"commit": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "tree": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "ref_d": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "tag": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"}), "blob": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"})}, undefined, undefined, {}, {});
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_type.get().commit.set('commit');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_type.get().tree.set('tree');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_type.get().ref_d.set('ref_d');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_type.get().tag.set('tag');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_type.get().blob.set('blob');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch_type = new abap.types.Structure({"branch": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "lightweight_tag": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "annotated_tag": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "other": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"})}, undefined, undefined, {}, {});
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch_type.get().branch.set('HD');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch_type.get().lightweight_tag.set('TG');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch_type.get().annotated_tag.set('AT');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch_type.get().other.set('ZZ');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_head_name = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_head_name.set('HEAD');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch = new abap.types.Structure({"main": new abap.types.String({qualifiedName: "STRING"}), "prefix": new abap.types.String({qualifiedName: "STRING"}), "heads_prefix": new abap.types.String({qualifiedName: "STRING"}), "heads": new abap.types.String({qualifiedName: "STRING"}), "tags_prefix": new abap.types.String({qualifiedName: "STRING"}), "tags": new abap.types.String({qualifiedName: "STRING"}), "peel": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch.get().main.set('refs/heads/main');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch.get().prefix.set('refs/');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch.get().heads_prefix.set('refs/heads/');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch.get().heads.set('refs/heads/*');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch.get().tags_prefix.set('refs/tags/');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch.get().tags.set('refs/tags/*');
+zif_abapgit_git_definitions.zif_abapgit_git_definitions$c_git_branch.get().peel.set('^{}');
+zif_abapgit_git_definitions.ty_type = new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_type"});
+zif_abapgit_git_definitions.ty_bitbyte = new abap.types.Character(8, {"qualifiedName":"zif_abapgit_git_definitions=>ty_bitbyte"});
+zif_abapgit_git_definitions.ty_sha1 = new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"});
+zif_abapgit_git_definitions.ty_sha1_tt = abap.types.TableFactory.construct(new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_sha1_tt");
+zif_abapgit_git_definitions.ty_adler32 = new abap.types.Hex({length: 4});
+zif_abapgit_git_definitions.ty_item_state = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"});
+zif_abapgit_git_definitions.ty_file_signature = new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {});
+zif_abapgit_git_definitions.ty_file_signatures_tt = abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_tt");
+zif_abapgit_git_definitions.ty_file_signatures_ts = abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_ts");
+zif_abapgit_git_definitions.ty_file = new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {});
+zif_abapgit_git_definitions.ty_files_tt = abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt");
+zif_abapgit_git_definitions.ty_git_branch_type = new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"});
+zif_abapgit_git_definitions.ty_git_branch = new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "is_head": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-DISPLAY_NAME"})}, "zif_abapgit_git_definitions=>ty_git_branch", undefined, {}, {});
+zif_abapgit_git_definitions.ty_git_branch_list_tt = abap.types.TableFactory.construct(new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "is_head": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-DISPLAY_NAME"})}, "zif_abapgit_git_definitions=>ty_git_branch", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"name_key","type":"SORTED","isUnique":false,"keyFields":["NAME"]}]}, "zif_abapgit_git_definitions=>ty_git_branch_list_tt");
+zif_abapgit_git_definitions.ty_git_tag = new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "object": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-DISPLAY_NAME"}), "tagger_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-TAGGER_NAME"}), "tagger_email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-TAGGER_EMAIL"}), "message": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-MESSAGE"}), "body": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-BODY"})}, "zif_abapgit_git_definitions=>ty_git_tag", undefined, {}, {});
+zif_abapgit_git_definitions.ty_git_user = new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-NAME"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-EMAIL"})}, "zif_abapgit_git_definitions=>ty_git_user", undefined, {}, {});
+zif_abapgit_git_definitions.ty_comment = new abap.types.Structure({"committer": new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-NAME"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-EMAIL"})}, "zif_abapgit_git_definitions=>ty_git_user", undefined, {}, {}), "author": new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-NAME"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-EMAIL"})}, "zif_abapgit_git_definitions=>ty_git_user", undefined, {}, {}), "comment": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMENT-COMMENT"})}, "zif_abapgit_git_definitions=>ty_comment", undefined, {}, {});
+zif_abapgit_git_definitions.ty_chmod = new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"});
+zif_abapgit_git_definitions.ty_expanded = new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {});
+zif_abapgit_git_definitions.ty_expanded_tt = abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt");
+zif_abapgit_git_definitions.ty_create = new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_CREATE-NAME"}), "parent": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_CREATE-PARENT"})}, "zif_abapgit_git_definitions=>ty_create", undefined, {}, {});
+zif_abapgit_git_definitions.ty_commit = new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "parent1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "parent2": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "author": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-AUTHOR"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-EMAIL"}), "time": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-TIME"}), "message": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-MESSAGE"}), "body": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-body"), "branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-BRANCH"}), "merge": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-MERGE"}), "tags": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-tags"), "create": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_CREATE-NAME"}), "parent": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_CREATE-PARENT"})}, "zif_abapgit_git_definitions=>ty_create", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-create"), "compressed": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_git_definitions=>ty_commit", undefined, {}, {});
+zif_abapgit_git_definitions.ty_commit_tt = abap.types.TableFactory.construct(new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "parent1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "parent2": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "author": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-AUTHOR"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-EMAIL"}), "time": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-TIME"}), "message": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-MESSAGE"}), "body": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-body"), "branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-BRANCH"}), "merge": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-MERGE"}), "tags": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-tags"), "create": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_CREATE-NAME"}), "parent": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_CREATE-PARENT"})}, "zif_abapgit_git_definitions=>ty_create", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-create"), "compressed": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_git_definitions=>ty_commit", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit_tt");
+export {zif_abapgit_git_definitions};
+//# sourceMappingURL=zif_abapgit_git_definitions.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_asset_manager.intf.mjs.html b/output/zif_abapgit_gui_asset_manager.intf.mjs.html new file mode 100644 index 00000000000..f1cc8e52a1f --- /dev/null +++ b/output/zif_abapgit_gui_asset_manager.intf.mjs.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_asset_manager.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_asset_manager.intf.mjs

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_asset_manager.intf.abap
+class zif_abapgit_gui_asset_manager {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_ALL_ASSETS": {"visibility": "U", "parameters": {"RT_ASSETS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_ASSET_MANAGER=>TY_WEB_ASSET-URL"}), "type": new abap.types.Character(50, {"qualifiedName":"zif_abapgit_gui_asset_manager=>ty_web_asset-type"}), "subtype": new abap.types.Character(50, {"qualifiedName":"zif_abapgit_gui_asset_manager=>ty_web_asset-subtype"}), "content": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GUI_ASSET_MANAGER=>TY_WEB_ASSET-CONTENT"}), "is_cacheable": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_gui_asset_manager=>ty_web_asset", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_gui_asset_manager=>ty_web_assets");}, "is_optional": " "}}},
+  "GET_ASSET": {"visibility": "U", "parameters": {"RS_ASSET": {"type": () => {return new abap.types.Structure({"url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_ASSET_MANAGER=>TY_WEB_ASSET-URL"}), "type": new abap.types.Character(50, {"qualifiedName":"zif_abapgit_gui_asset_manager=>ty_web_asset-type"}), "subtype": new abap.types.Character(50, {"qualifiedName":"zif_abapgit_gui_asset_manager=>ty_web_asset-subtype"}), "content": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GUI_ASSET_MANAGER=>TY_WEB_ASSET-CONTENT"}), "is_cacheable": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_gui_asset_manager=>ty_web_asset", undefined, {}, {});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_TEXT_ASSET": {"visibility": "U", "parameters": {"RV_ASSET": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_ASSERT_SUBTYPE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "REGISTER_ASSET": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TYPE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CACHABLE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_MIME_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}, "IV_BASE64": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_INLINE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_ASSET_MANAGER'] = zif_abapgit_gui_asset_manager;zif_abapgit_gui_asset_manager.ty_web_asset = new abap.types.Structure({"url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_ASSET_MANAGER=>TY_WEB_ASSET-URL"}), "type": new abap.types.Character(50, {"qualifiedName":"zif_abapgit_gui_asset_manager=>ty_web_asset-type"}), "subtype": new abap.types.Character(50, {"qualifiedName":"zif_abapgit_gui_asset_manager=>ty_web_asset-subtype"}), "content": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GUI_ASSET_MANAGER=>TY_WEB_ASSET-CONTENT"}), "is_cacheable": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_gui_asset_manager=>ty_web_asset", undefined, {}, {});
+zif_abapgit_gui_asset_manager.ty_web_assets = abap.types.TableFactory.construct(new abap.types.Structure({"url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_ASSET_MANAGER=>TY_WEB_ASSET-URL"}), "type": new abap.types.Character(50, {"qualifiedName":"zif_abapgit_gui_asset_manager=>ty_web_asset-type"}), "subtype": new abap.types.Character(50, {"qualifiedName":"zif_abapgit_gui_asset_manager=>ty_web_asset-subtype"}), "content": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GUI_ASSET_MANAGER=>TY_WEB_ASSET-CONTENT"}), "is_cacheable": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_gui_asset_manager=>ty_web_asset", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_gui_asset_manager=>ty_web_assets");
+export {zif_abapgit_gui_asset_manager};
+//# sourceMappingURL=zif_abapgit_gui_asset_manager.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_error_handler.intf.mjs.html b/output/zif_abapgit_gui_error_handler.intf.mjs.html new file mode 100644 index 00000000000..ae14381474c --- /dev/null +++ b/output/zif_abapgit_gui_error_handler.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_error_handler.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_error_handler.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_error_handler.intf.abap
+class zif_abapgit_gui_error_handler {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"HANDLE_ERROR": {"visibility": "U", "parameters": {"RV_HANDLED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IX_ERROR": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCX_ABAPGIT_EXCEPTION", RTTIName: "\\CLASS=ZCX_ABAPGIT_EXCEPTION"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_ERROR_HANDLER'] = zif_abapgit_gui_error_handler;
+export {zif_abapgit_gui_error_handler};
+//# sourceMappingURL=zif_abapgit_gui_error_handler.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_event.intf.mjs.html b/output/zif_abapgit_gui_event.intf.mjs.html new file mode 100644 index 00000000000..9ab30812d19 --- /dev/null +++ b/output/zif_abapgit_gui_event.intf.mjs.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_event.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_event.intf.mjs

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_event.intf.abap
+class zif_abapgit_gui_event {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"MV_ACTION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "MV_GETDATA": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "MT_POSTDATA": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(256, {"qualifiedName":"zif_abapgit_html_viewer=>ty_char256"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_html_viewer=>ty_post_data");}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "MI_GUI_SERVICES": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_SERVICES", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_SERVICES"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "MV_CURRENT_PAGE_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "}};
+  static METHODS = {"QUERY": {"visibility": "U", "parameters": {"RO_STRING_MAP": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STRING_MAP", RTTIName: "\\CLASS=ZCL_ABAPGIT_STRING_MAP"});}, "is_optional": " "}}},
+  "FORM_DATA": {"visibility": "U", "parameters": {"RO_STRING_MAP": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STRING_MAP", RTTIName: "\\CLASS=ZCL_ABAPGIT_STRING_MAP"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_EVENT'] = zif_abapgit_gui_event;
+export {zif_abapgit_gui_event};
+//# sourceMappingURL=zif_abapgit_gui_event.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_event_handler.intf.mjs.html b/output/zif_abapgit_gui_event_handler.intf.mjs.html new file mode 100644 index 00000000000..f1b997798ad --- /dev/null +++ b/output/zif_abapgit_gui_event_handler.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_event_handler.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_event_handler.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_event_handler.intf.abap
+class zif_abapgit_gui_event_handler {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ON_EVENT": {"visibility": "U", "parameters": {"RS_HANDLED": {"type": () => {return new abap.types.Structure({"page": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_RENDERABLE", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_RENDERABLE"}), "state": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_GUI_EVENT_HANDLER=>TY_HANDLING_RESULT-STATE"})}, "zif_abapgit_gui_event_handler=>ty_handling_result", undefined, {}, {});}, "is_optional": " "}, "II_EVENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_EVENT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_EVENT"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_EVENT_HANDLER'] = zif_abapgit_gui_event_handler;zif_abapgit_gui_event_handler.ty_handling_result = new abap.types.Structure({"page": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_RENDERABLE", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_RENDERABLE"}), "state": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_GUI_EVENT_HANDLER=>TY_HANDLING_RESULT-STATE"})}, "zif_abapgit_gui_event_handler=>ty_handling_result", undefined, {}, {});
+export {zif_abapgit_gui_event_handler};
+//# sourceMappingURL=zif_abapgit_gui_event_handler.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_hotkey_ctl.intf.mjs.html b/output/zif_abapgit_gui_hotkey_ctl.intf.mjs.html new file mode 100644 index 00000000000..af4d18acb21 --- /dev/null +++ b/output/zif_abapgit_gui_hotkey_ctl.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_hotkey_ctl.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_hotkey_ctl.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_hotkey_ctl.intf.abap
+class zif_abapgit_gui_hotkey_ctl {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"REGISTER_HOTKEYS": {"visibility": "U", "parameters": {"IT_HOTKEYS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"ui_component": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-UI_COMPONENT"}), "action": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-ACTION"}), "hotkey": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-HOTKEY"}), "description": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-DESCRIPTION"})}, "zif_abapgit_gui_hotkeys=>ty_hotkey_with_descr", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"action","type":"SORTED","isUnique":true,"keyFields":["UI_COMPONENT","ACTION"]}]}, "zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr");}, "is_optional": " "}}},
+  "RESET": {"visibility": "U", "parameters": {}},
+  "GET_REGISTERED_HOTKEYS": {"visibility": "U", "parameters": {"RT_REGISTERED_HOTKEYS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"ui_component": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-UI_COMPONENT"}), "action": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-ACTION"}), "hotkey": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-HOTKEY"}), "description": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-DESCRIPTION"})}, "zif_abapgit_gui_hotkeys=>ty_hotkey_with_descr", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"action","type":"SORTED","isUnique":true,"keyFields":["UI_COMPONENT","ACTION"]}]}, "zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr");}, "is_optional": " "}}},
+  "SET_VISIBLE": {"visibility": "U", "parameters": {"IV_VISIBLE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_HOTKEY_CTL'] = zif_abapgit_gui_hotkey_ctl;
+export {zif_abapgit_gui_hotkey_ctl};
+//# sourceMappingURL=zif_abapgit_gui_hotkey_ctl.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_hotkeys.intf.mjs.html b/output/zif_abapgit_gui_hotkeys.intf.mjs.html new file mode 100644 index 00000000000..abff4a3f5c3 --- /dev/null +++ b/output/zif_abapgit_gui_hotkeys.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_hotkeys.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_hotkeys.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_hotkeys.intf.abap
+class zif_abapgit_gui_hotkeys {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_HOTKEY_ACTIONS": {"visibility": "U", "parameters": {"RT_HOTKEY_ACTIONS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"ui_component": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-UI_COMPONENT"}), "action": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-ACTION"}), "hotkey": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-HOTKEY"}), "description": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-DESCRIPTION"})}, "zif_abapgit_gui_hotkeys=>ty_hotkey_with_descr", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"action","type":"SORTED","isUnique":true,"keyFields":["UI_COMPONENT","ACTION"]}]}, "zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr");}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_HOTKEYS'] = zif_abapgit_gui_hotkeys;zif_abapgit_gui_hotkeys.ty_hotkey_with_descr = new abap.types.Structure({"ui_component": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-UI_COMPONENT"}), "action": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-ACTION"}), "hotkey": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-HOTKEY"}), "description": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-DESCRIPTION"})}, "zif_abapgit_gui_hotkeys=>ty_hotkey_with_descr", undefined, {}, {});
+zif_abapgit_gui_hotkeys.ty_hotkeys_with_descr = abap.types.TableFactory.construct(new abap.types.Structure({"ui_component": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-UI_COMPONENT"}), "action": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-ACTION"}), "hotkey": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-HOTKEY"}), "description": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEYS=>TY_HOTKEY_WITH_DESCR-DESCRIPTION"})}, "zif_abapgit_gui_hotkeys=>ty_hotkey_with_descr", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"action","type":"SORTED","isUnique":true,"keyFields":["UI_COMPONENT","ACTION"]}]}, "zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr");
+export {zif_abapgit_gui_hotkeys};
+//# sourceMappingURL=zif_abapgit_gui_hotkeys.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_html_processor.intf.mjs.html b/output/zif_abapgit_gui_html_processor.intf.mjs.html new file mode 100644 index 00000000000..b2e2cd053a9 --- /dev/null +++ b/output/zif_abapgit_gui_html_processor.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_html_processor.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_html_processor.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_html_processor.intf.abap
+class zif_abapgit_gui_html_processor {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"PROCESS": {"visibility": "U", "parameters": {"RV_HTML": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_HTML": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "II_GUI_SERVICES": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_SERVICES", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_SERVICES"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_HTML_PROCESSOR'] = zif_abapgit_gui_html_processor;
+export {zif_abapgit_gui_html_processor};
+//# sourceMappingURL=zif_abapgit_gui_html_processor.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_jumper.intf.mjs.html b/output/zif_abapgit_gui_jumper.intf.mjs.html new file mode 100644 index 00000000000..1e270498358 --- /dev/null +++ b/output/zif_abapgit_gui_jumper.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_jumper.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_jumper.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_jumper.intf.abap
+class zif_abapgit_gui_jumper {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"JUMP": {"visibility": "U", "parameters": {"RV_EXIT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}, "IS_SUB_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}, "IV_LINE_NUMBER": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IV_NEW_WINDOW": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "JUMP_ADT": {"visibility": "U", "parameters": {"RV_EXIT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}, "IV_SUB_OBJ_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}, "IV_LINE_NUMBER": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "JUMP_BATCH_INPUT": {"visibility": "U", "parameters": {"IV_TCODE": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"sy-tcode"});}, "is_optional": " "}, "IT_BDCDATA": {"type": () => {return abap.types.TableFactory.construct((() => { throw "Void type: BDCDATA" })(), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_gui_jumper=>ty_bdcdata_tt");}, "is_optional": " "}, "IV_NEW_WINDOW": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "JUMP_ABAPGIT": {"visibility": "U", "parameters": {"IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "is_optional": " "}, "IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_JUMPER'] = zif_abapgit_gui_jumper;
+export {zif_abapgit_gui_jumper};
+//# sourceMappingURL=zif_abapgit_gui_jumper.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_menu_provider.intf.mjs.html b/output/zif_abapgit_gui_menu_provider.intf.mjs.html new file mode 100644 index 00000000000..24b0c7d5f20 --- /dev/null +++ b/output/zif_abapgit_gui_menu_provider.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_menu_provider.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_menu_provider.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_menu_provider.intf.abap
+class zif_abapgit_gui_menu_provider {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_MENU": {"visibility": "U", "parameters": {"RO_TOOLBAR": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_HTML_TOOLBAR", RTTIName: "\\CLASS=ZCL_ABAPGIT_HTML_TOOLBAR"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_MENU_PROVIDER'] = zif_abapgit_gui_menu_provider;
+export {zif_abapgit_gui_menu_provider};
+//# sourceMappingURL=zif_abapgit_gui_menu_provider.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_modal.intf.mjs.html b/output/zif_abapgit_gui_modal.intf.mjs.html new file mode 100644 index 00000000000..f691842c1f5 --- /dev/null +++ b/output/zif_abapgit_gui_modal.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_modal.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_modal.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_modal.intf.abap
+class zif_abapgit_gui_modal {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"IS_MODAL": {"visibility": "U", "parameters": {"RV_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_MODAL'] = zif_abapgit_gui_modal;
+export {zif_abapgit_gui_modal};
+//# sourceMappingURL=zif_abapgit_gui_modal.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_page_title.intf.mjs.html b/output/zif_abapgit_gui_page_title.intf.mjs.html new file mode 100644 index 00000000000..1de053b0e43 --- /dev/null +++ b/output/zif_abapgit_gui_page_title.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_page_title.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_page_title.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_page_title.intf.abap
+class zif_abapgit_gui_page_title {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_PAGE_TITLE": {"visibility": "U", "parameters": {"RV_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_PAGE_TITLE'] = zif_abapgit_gui_page_title;
+export {zif_abapgit_gui_page_title};
+//# sourceMappingURL=zif_abapgit_gui_page_title.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_render_item.intf.mjs.html b/output/zif_abapgit_gui_render_item.intf.mjs.html new file mode 100644 index 00000000000..9e340dce1a9 --- /dev/null +++ b/output/zif_abapgit_gui_render_item.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_render_item.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_render_item.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_render_item.intf.abap
+class zif_abapgit_gui_render_item {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"RENDER": {"visibility": "U", "parameters": {"RI_HTML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_ITEM": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "IV_INDEX": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_RENDER_ITEM'] = zif_abapgit_gui_render_item;
+export {zif_abapgit_gui_render_item};
+//# sourceMappingURL=zif_abapgit_gui_render_item.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_renderable.intf.mjs.html b/output/zif_abapgit_gui_renderable.intf.mjs.html new file mode 100644 index 00000000000..5e60e088edd --- /dev/null +++ b/output/zif_abapgit_gui_renderable.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_renderable.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_renderable.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_renderable.intf.abap
+class zif_abapgit_gui_renderable {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"RENDER": {"visibility": "U", "parameters": {"RI_HTML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_RENDERABLE'] = zif_abapgit_gui_renderable;
+export {zif_abapgit_gui_renderable};
+//# sourceMappingURL=zif_abapgit_gui_renderable.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_gui_services.intf.mjs.html b/output/zif_abapgit_gui_services.intf.mjs.html new file mode 100644 index 00000000000..71277ddbdc2 --- /dev/null +++ b/output/zif_abapgit_gui_services.intf.mjs.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for output/zif_abapgit_gui_services.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_gui_services.intf.mjs

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 15/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_gui_services.intf.abap
+class zif_abapgit_gui_services {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CACHE_ASSET": {"visibility": "U", "parameters": {"RV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TEXT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_XDATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_SUBTYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}},
+  "REGISTER_PAGE_ASSET": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TYPE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_MIME_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}, "IV_INLINE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "REGISTER_EVENT_HANDLER": {"visibility": "U", "parameters": {"II_EVENT_HANDLER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_EVENT_HANDLER", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_EVENT_HANDLER"});}, "is_optional": " "}}},
+  "GET_CURRENT_PAGE_NAME": {"visibility": "U", "parameters": {"RV_PAGE_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_HOTKEYS_CTL": {"visibility": "U", "parameters": {"RI_HOTKEY_CTL": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_GUI_HOTKEY_CTL", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_GUI_HOTKEY_CTL"});}, "is_optional": " "}}},
+  "GET_HTML_PARTS": {"visibility": "U", "parameters": {"RO_PARTS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_HTML_PARTS", RTTIName: "\\CLASS=ZCL_ABAPGIT_HTML_PARTS"});}, "is_optional": " "}}},
+  "GET_LOG": {"visibility": "U", "parameters": {"RI_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "IV_CREATE_NEW": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_GUI_SERVICES'] = zif_abapgit_gui_services;
+export {zif_abapgit_gui_services};
+//# sourceMappingURL=zif_abapgit_gui_services.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_html.intf.mjs.html b/output/zif_abapgit_html.intf.mjs.html new file mode 100644 index 00000000000..64fd69823db --- /dev/null +++ b/output/zif_abapgit_html.intf.mjs.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for output/zif_abapgit_html.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_html.intf.mjs

+
+ +
+ 100% + Statements + 33/33 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 33/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +331x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_html.intf.abap
+class zif_abapgit_html {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"MV_CHUNK_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "C_ACTION_TYPE": {"type": () => {return new abap.types.Structure({"sapevent": new abap.types.Character(1, {}), "url": new abap.types.Character(1, {}), "onclick": new abap.types.Character(1, {}), "separator": new abap.types.Character(1, {}), "dummy": new abap.types.Character(1, {})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_HTML_OPT": {"type": () => {return new abap.types.Structure({"strong": new abap.types.Character(1, {}), "cancel": new abap.types.Character(1, {}), "crossout": new abap.types.Character(1, {})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"SET_TITLE": {"visibility": "U", "parameters": {"RI_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ADD": {"visibility": "U", "parameters": {"RI_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IG_CHUNK": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "RENDER": {"visibility": "U", "parameters": {"RV_HTML": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_NO_INDENT_JSCSS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_EMPTY": {"visibility": "U", "parameters": {"RV_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "ADD_A": {"visibility": "U", "parameters": {"RI_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_TXT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_ACT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_QUERY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TYP": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_OPT": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_ID": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_STYLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ADD_CHECKBOX": {"visibility": "U", "parameters": {"RI_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_ID": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CHECKED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "A": {"visibility": "U", "parameters": {"RV_STR": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TXT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_ACT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_QUERY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TYP": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_OPT": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_ID": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_STYLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ICON": {"visibility": "U", "parameters": {"RV_STR": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_HINT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_ONCLICK": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "ADD_ICON": {"visibility": "U", "parameters": {"RI_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_HINT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_ONCLICK": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "WRAP": {"visibility": "U", "parameters": {"RI_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_TAG": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CONTENT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "II_CONTENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_ID": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_HINT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_FORMAT_SINGLE_LINE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "TD": {"visibility": "U", "parameters": {"RI_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_CONTENT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "II_CONTENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_ID": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_HINT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_FORMAT_SINGLE_LINE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "TH": {"visibility": "U", "parameters": {"RI_SELF": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_CONTENT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "II_CONTENT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"});}, "is_optional": " "}, "IV_ID": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CLASS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_HINT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_FORMAT_SINGLE_LINE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_HTML'] = zif_abapgit_html;
+zif_abapgit_html.zif_abapgit_html$c_action_type = new abap.types.Structure({"sapevent": new abap.types.Character(1, {}), "url": new abap.types.Character(1, {}), "onclick": new abap.types.Character(1, {}), "separator": new abap.types.Character(1, {}), "dummy": new abap.types.Character(1, {})}, undefined, undefined, {}, {});
+zif_abapgit_html.zif_abapgit_html$c_action_type.get().sapevent.set('E');
+zif_abapgit_html.zif_abapgit_html$c_action_type.get().url.set('U');
+zif_abapgit_html.zif_abapgit_html$c_action_type.get().onclick.set('C');
+zif_abapgit_html.zif_abapgit_html$c_action_type.get().separator.set('S');
+zif_abapgit_html.zif_abapgit_html$c_action_type.get().dummy.set('_');
+zif_abapgit_html.zif_abapgit_html$c_html_opt = new abap.types.Structure({"strong": new abap.types.Character(1, {}), "cancel": new abap.types.Character(1, {}), "crossout": new abap.types.Character(1, {})}, undefined, undefined, {}, {});
+zif_abapgit_html.zif_abapgit_html$c_html_opt.get().strong.set('E');
+zif_abapgit_html.zif_abapgit_html$c_html_opt.get().cancel.set('C');
+zif_abapgit_html.zif_abapgit_html$c_html_opt.get().crossout.set('X');
+zif_abapgit_html.ty_table_of = abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_html=>ty_table_of");
+export {zif_abapgit_html};
+//# sourceMappingURL=zif_abapgit_html.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_html_form.intf.mjs.html b/output/zif_abapgit_html_form.intf.mjs.html new file mode 100644 index 00000000000..632d9726ba8 --- /dev/null +++ b/output/zif_abapgit_html_form.intf.mjs.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for output/zif_abapgit_html_form.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_html_form.intf.mjs

+
+ +
+ 100% + Statements + 32/32 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 32/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +321x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_html_form.intf.abap
+class zif_abapgit_html_form {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_ROWS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_CMD_TYPE": {"type": () => {return new abap.types.Structure({"input": new abap.types.Integer({qualifiedName: "I"}), "input_main": new abap.types.Integer({qualifiedName: "I"}), "link": new abap.types.Integer({qualifiedName: "I"}), "button": new abap.types.Integer({qualifiedName: "I"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_FIELD_TYPE": {"type": () => {return new abap.types.Structure({"text": new abap.types.Integer({qualifiedName: "I"}), "radio": new abap.types.Integer({qualifiedName: "I"}), "checkbox": new abap.types.Integer({qualifiedName: "I"}), "field_group": new abap.types.Integer({qualifiedName: "I"}), "number": new abap.types.Integer({qualifiedName: "I"}), "textarea": new abap.types.Integer({qualifiedName: "I"}), "table": new abap.types.Integer({qualifiedName: "I"}), "hidden": new abap.types.Integer({qualifiedName: "I"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_HTML_FORM'] = zif_abapgit_html_form;
+zif_abapgit_html_form.zif_abapgit_html_form$c_rows = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_html_form.zif_abapgit_html_form$c_rows.set('rows');
+zif_abapgit_html_form.zif_abapgit_html_form$c_cmd_type = new abap.types.Structure({"input": new abap.types.Integer({qualifiedName: "I"}), "input_main": new abap.types.Integer({qualifiedName: "I"}), "link": new abap.types.Integer({qualifiedName: "I"}), "button": new abap.types.Integer({qualifiedName: "I"})}, undefined, undefined, {}, {});
+zif_abapgit_html_form.zif_abapgit_html_form$c_cmd_type.get().input.set(1);
+zif_abapgit_html_form.zif_abapgit_html_form$c_cmd_type.get().input_main.set(2);
+zif_abapgit_html_form.zif_abapgit_html_form$c_cmd_type.get().link.set(3);
+zif_abapgit_html_form.zif_abapgit_html_form$c_cmd_type.get().button.set(4);
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type = new abap.types.Structure({"text": new abap.types.Integer({qualifiedName: "I"}), "radio": new abap.types.Integer({qualifiedName: "I"}), "checkbox": new abap.types.Integer({qualifiedName: "I"}), "field_group": new abap.types.Integer({qualifiedName: "I"}), "number": new abap.types.Integer({qualifiedName: "I"}), "textarea": new abap.types.Integer({qualifiedName: "I"}), "table": new abap.types.Integer({qualifiedName: "I"}), "hidden": new abap.types.Integer({qualifiedName: "I"})}, undefined, undefined, {}, {});
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type.get().text.set(1);
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type.get().radio.set(2);
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type.get().checkbox.set(3);
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type.get().field_group.set(4);
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type.get().number.set(5);
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type.get().textarea.set(6);
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type.get().table.set(7);
+zif_abapgit_html_form.zif_abapgit_html_form$c_field_type.get().hidden.set(8);
+zif_abapgit_html_form.ty_subitem = new abap.types.Structure({"label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_SUBITEM-LABEL"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_SUBITEM-VALUE"}), "readonly": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_html_form=>ty_subitem", undefined, {}, {});
+zif_abapgit_html_form.ty_subitems = abap.types.TableFactory.construct(new abap.types.Structure({"label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_SUBITEM-LABEL"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_SUBITEM-VALUE"}), "readonly": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_html_form=>ty_subitem", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_html_form=>ty_subitems");
+zif_abapgit_html_form.ty_field = new abap.types.Structure({"type": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-TYPE"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-NAME"}), "label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-LABEL"}), "hint": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-HINT"}), "dblclick": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-DBLCLICK"}), "click": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-CLICK"}), "placeholder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-PLACEHOLDER"}), "required": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-REQUIRED"}), "upper_case": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "item_class": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-ITEM_CLASS"}), "error": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-ERROR"}), "default_value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-DEFAULT_VALUE"}), "side_action": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-SIDE_ACTION"}), "subitems": abap.types.TableFactory.construct(new abap.types.Structure({"label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_SUBITEM-LABEL"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_SUBITEM-VALUE"}), "readonly": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_html_form=>ty_subitem", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_html_form=>ty_subitems"), "readonly": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "password": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "condense": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "min": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-MIN"}), "max": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-MAX"}), "rows": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-ROWS"}), "cols": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-COLS"})}, "zif_abapgit_html_form=>ty_field", undefined, {}, {});
+zif_abapgit_html_form.ty_fields = abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-TYPE"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-NAME"}), "label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-LABEL"}), "hint": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-HINT"}), "dblclick": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-DBLCLICK"}), "click": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-CLICK"}), "placeholder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-PLACEHOLDER"}), "required": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-REQUIRED"}), "upper_case": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "item_class": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-ITEM_CLASS"}), "error": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-ERROR"}), "default_value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-DEFAULT_VALUE"}), "side_action": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-SIDE_ACTION"}), "subitems": abap.types.TableFactory.construct(new abap.types.Structure({"label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_SUBITEM-LABEL"}), "value": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_SUBITEM-VALUE"}), "readonly": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_html_form=>ty_subitem", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_html_form=>ty_subitems"), "readonly": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "password": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "condense": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "min": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-MIN"}), "max": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-MAX"}), "rows": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-ROWS"}), "cols": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_FIELD-COLS"})}, "zif_abapgit_html_form=>ty_field", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"by_name","type":"SORTED","isUnique":true,"keyFields":["NAME"]}]}, "zif_abapgit_html_form=>ty_fields");
+zif_abapgit_html_form.ty_command = new abap.types.Structure({"label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_COMMAND-LABEL"}), "action": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_COMMAND-ACTION"}), "cmd_type": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_HTML_FORM=>TY_COMMAND-CMD_TYPE"})}, "zif_abapgit_html_form=>ty_command", undefined, {}, {});
+export {zif_abapgit_html_form};
+//# sourceMappingURL=zif_abapgit_html_form.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_html_popup.intf.mjs.html b/output/zif_abapgit_html_popup.intf.mjs.html new file mode 100644 index 00000000000..87e4438963c --- /dev/null +++ b/output/zif_abapgit_html_popup.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_html_popup.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_html_popup.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_html_popup.intf.abap
+class zif_abapgit_html_popup {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CREATE_PICKLIST": {"visibility": "U", "parameters": {"RO_PICKLIST": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_GUI_PICKLIST", RTTIName: "\\CLASS=ZCL_ABAPGIT_GUI_PICKLIST"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_HTML_POPUP'] = zif_abapgit_html_popup;
+export {zif_abapgit_html_popup};
+//# sourceMappingURL=zif_abapgit_html_popup.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_html_table.intf.mjs.html b/output/zif_abapgit_html_table.intf.mjs.html new file mode 100644 index 00000000000..e2bd6bda119 --- /dev/null +++ b/output/zif_abapgit_html_table.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/zif_abapgit_html_table.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_html_table.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_html_table.intf.abap
+class zif_abapgit_html_table {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_ROW_ATTRS": {"visibility": "U", "parameters": {"RS_ATTRS": {"type": () => {return new abap.types.Structure({"css_class": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_TABLE=>TY_ROW_ATTRS-CSS_CLASS"})}, "zif_abapgit_html_table=>ty_row_attrs", undefined, {}, {});}, "is_optional": " "}, "IV_ROW_INDEX": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IS_ROW": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "RENDER_CELL": {"visibility": "U", "parameters": {"RS_RENDER": {"type": () => {return new abap.types.Structure({"css_class": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_TABLE=>TY_CELL_RENDER-CSS_CLASS"}), "content": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_TABLE=>TY_CELL_RENDER-CONTENT"}), "html": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"})}, "zif_abapgit_html_table=>ty_cell_render", undefined, {}, {});}, "is_optional": " "}, "IV_ROW_INDEX": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IS_ROW": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}, "IV_COLUMN_ID": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_VALUE": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_HTML_TABLE'] = zif_abapgit_html_table;zif_abapgit_html_table.ty_row_attrs = new abap.types.Structure({"css_class": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_TABLE=>TY_ROW_ATTRS-CSS_CLASS"})}, "zif_abapgit_html_table=>ty_row_attrs", undefined, {}, {});
+zif_abapgit_html_table.ty_cell_render = new abap.types.Structure({"css_class": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_TABLE=>TY_CELL_RENDER-CSS_CLASS"}), "content": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_HTML_TABLE=>TY_CELL_RENDER-CONTENT"}), "html": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTML", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTML"})}, "zif_abapgit_html_table=>ty_cell_render", undefined, {}, {});
+export {zif_abapgit_html_table};
+//# sourceMappingURL=zif_abapgit_html_table.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_html_viewer.intf.mjs.html b/output/zif_abapgit_html_viewer.intf.mjs.html new file mode 100644 index 00000000000..9f5e0f3d9e5 --- /dev/null +++ b/output/zif_abapgit_html_viewer.intf.mjs.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for output/zif_abapgit_html_viewer.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_html_viewer.intf.mjs

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 23/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_html_viewer.intf.abap
+class zif_abapgit_html_viewer {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"M_ID_SAPEVENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"LOAD_DATA": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_SUBTYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_SIZE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "EV_ASSIGNED_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "CT_DATA_TABLE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}}},
+  "SET_REGISTERED_EVENTS": {"visibility": "U", "parameters": {"IT_EVENTS": {"type": () => {return (() => { throw "Void type: CNTL_SIMPLE_EVENTS" })();}, "is_optional": " "}}},
+  "SHOW_URL": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "FREE": {"visibility": "U", "parameters": {}},
+  "CLOSE_DOCUMENT": {"visibility": "U", "parameters": {}},
+  "GET_URL": {"visibility": "U", "parameters": {"RV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "BACK": {"visibility": "U", "parameters": {}},
+  "SET_VISIBLITY": {"visibility": "U", "parameters": {"IV_VISIBLE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "SET_FOCUS": {"visibility": "U", "parameters": {}}};
+}
+abap.Classes['ZIF_ABAPGIT_HTML_VIEWER'] = zif_abapgit_html_viewer;
+zif_abapgit_html_viewer.zif_abapgit_html_viewer$m_id_sapevent = new abap.types.Integer({qualifiedName: "I"});
+zif_abapgit_html_viewer.zif_abapgit_html_viewer$m_id_sapevent.set(1);
+zif_abapgit_html_viewer.ty_char256 = new abap.types.Character(256, {"qualifiedName":"zif_abapgit_html_viewer=>ty_char256"});
+zif_abapgit_html_viewer.ty_post_data = abap.types.TableFactory.construct(new abap.types.Character(256, {"qualifiedName":"zif_abapgit_html_viewer=>ty_char256"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_html_viewer=>ty_post_data");
+zif_abapgit_html_viewer.ty_name_value = new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_html_viewer=>ty_name_value-name"}), "value": new abap.types.Character(250, {"qualifiedName":"zif_abapgit_html_viewer=>ty_name_value-value"})}, "zif_abapgit_html_viewer=>ty_name_value", undefined, {}, {});
+zif_abapgit_html_viewer.ty_query_table = abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.Character(30, {"qualifiedName":"zif_abapgit_html_viewer=>ty_name_value-name"}), "value": new abap.types.Character(250, {"qualifiedName":"zif_abapgit_html_viewer=>ty_name_value-value"})}, "zif_abapgit_html_viewer=>ty_name_value", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_html_viewer=>ty_query_table");
+export {zif_abapgit_html_viewer};
+//# sourceMappingURL=zif_abapgit_html_viewer.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_http_agent.intf.mjs.html b/output/zif_abapgit_http_agent.intf.mjs.html new file mode 100644 index 00000000000..a1d577f2249 --- /dev/null +++ b/output/zif_abapgit_http_agent.intf.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/zif_abapgit_http_agent.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_http_agent.intf.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_http_agent.intf.abap
+class zif_abapgit_http_agent {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_METHODS": {"type": () => {return new abap.types.Structure({"get": new abap.types.String({qualifiedName: "STRING"}), "post": new abap.types.String({qualifiedName: "STRING"}), "put": new abap.types.String({qualifiedName: "STRING"}), "delete": new abap.types.String({qualifiedName: "STRING"}), "patch": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"GLOBAL_HEADERS": {"visibility": "U", "parameters": {"RO_GLOBAL_HEADERS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STRING_MAP", RTTIName: "\\CLASS=ZCL_ABAPGIT_STRING_MAP"});}, "is_optional": " "}}},
+  "REQUEST": {"visibility": "U", "parameters": {"RI_RESPONSE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_HTTP_RESPONSE", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_HTTP_RESPONSE"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_METHOD": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IO_QUERY": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STRING_MAP", RTTIName: "\\CLASS=ZCL_ABAPGIT_STRING_MAP"});}, "is_optional": " "}, "IO_HEADERS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STRING_MAP", RTTIName: "\\CLASS=ZCL_ABAPGIT_STRING_MAP"});}, "is_optional": " "}, "IV_PAYLOAD": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_HTTP_AGENT'] = zif_abapgit_http_agent;
+zif_abapgit_http_agent.zif_abapgit_http_agent$c_methods = new abap.types.Structure({"get": new abap.types.String({qualifiedName: "STRING"}), "post": new abap.types.String({qualifiedName: "STRING"}), "put": new abap.types.String({qualifiedName: "STRING"}), "delete": new abap.types.String({qualifiedName: "STRING"}), "patch": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});
+zif_abapgit_http_agent.zif_abapgit_http_agent$c_methods.get().get.set('GET');
+zif_abapgit_http_agent.zif_abapgit_http_agent$c_methods.get().post.set('POST');
+zif_abapgit_http_agent.zif_abapgit_http_agent$c_methods.get().put.set('PUT');
+zif_abapgit_http_agent.zif_abapgit_http_agent$c_methods.get().delete.set('DELETE');
+zif_abapgit_http_agent.zif_abapgit_http_agent$c_methods.get().patch.set('PATCH');
+export {zif_abapgit_http_agent};
+//# sourceMappingURL=zif_abapgit_http_agent.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_http_response.intf.mjs.html b/output/zif_abapgit_http_response.intf.mjs.html new file mode 100644 index 00000000000..fbb079173e3 --- /dev/null +++ b/output/zif_abapgit_http_response.intf.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/zif_abapgit_http_response.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_http_response.intf.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_http_response.intf.abap
+class zif_abapgit_http_response {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"DATA": {"visibility": "U", "parameters": {"RV_DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "CDATA": {"visibility": "U", "parameters": {"RV_DATA": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "JSON": {"visibility": "U", "parameters": {"RI_JSON": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_AJSON", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_AJSON"});}, "is_optional": " "}}},
+  "IS_OK": {"visibility": "U", "parameters": {"RV_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "CODE": {"visibility": "U", "parameters": {"RV_CODE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "ERROR": {"visibility": "U", "parameters": {"RV_MESSAGE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "HEADERS": {"visibility": "U", "parameters": {"RO_HEADERS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STRING_MAP", RTTIName: "\\CLASS=ZCL_ABAPGIT_STRING_MAP"});}, "is_optional": " "}}},
+  "CLOSE": {"visibility": "U", "parameters": {}}};
+}
+abap.Classes['ZIF_ABAPGIT_HTTP_RESPONSE'] = zif_abapgit_http_response;
+export {zif_abapgit_http_response};
+//# sourceMappingURL=zif_abapgit_http_response.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_i18n_file.intf.mjs.html b/output/zif_abapgit_i18n_file.intf.mjs.html new file mode 100644 index 00000000000..eb6e36a5aa6 --- /dev/null +++ b/output/zif_abapgit_i18n_file.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/zif_abapgit_i18n_file.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_i18n_file.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_i18n_file.intf.abap
+class zif_abapgit_i18n_file {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"RENDER": {"visibility": "U", "parameters": {"RV_DATA": {"type": () => {return new abap.types.XString({qualifiedName: "XSTRING"});}, "is_optional": " "}}},
+  "TRANSLATE": {"visibility": "U", "parameters": {"CT_TEXT_PAIRS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"textkey": new abap.types.Character(32, {"qualifiedName":"LXETEXTKEY","ddicName":"LXETEXTKEY"}), "s_text": new abap.types.Character(255, {"qualifiedName":"LXEUNITLIN","ddicName":"LXEUNITLIN"}), "t_text": new abap.types.Character(255, {"qualifiedName":"LXEUNITLIN","ddicName":"LXEUNITLIN"}), "unitmlt": new abap.types.Integer({qualifiedName: "LXEUNITMLT"}), "uppcase": new abap.types.Character(1, {"qualifiedName":"LXEUPPCASE","ddicName":"LXEUPPCASE"}), "texttype": new abap.types.Character(4, {"qualifiedName":"LXETEXTTYPE","ddicName":"LXETEXTTYPE"})}, "LXE_PCX_S1", "LXE_PCX_S1", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_lxe_texts=>ty_text_pairs");}, "is_optional": " "}}},
+  "EXT": {"visibility": "U", "parameters": {"RV_EXT": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "LANG": {"visibility": "U", "parameters": {"RV_LANG": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_I18N_FILE'] = zif_abapgit_i18n_file;zif_abapgit_i18n_file.ty_table_of = abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_I18N_FILE", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_I18N_FILE"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_i18n_file=>ty_table_of");
+export {zif_abapgit_i18n_file};
+//# sourceMappingURL=zif_abapgit_i18n_file.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_lang_definitions.intf.mjs.html b/output/zif_abapgit_lang_definitions.intf.mjs.html new file mode 100644 index 00000000000..28392d67050 --- /dev/null +++ b/output/zif_abapgit_lang_definitions.intf.mjs.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for output/zif_abapgit_lang_definitions.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_lang_definitions.intf.mjs

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_lang_definitions.intf.abap
+class zif_abapgit_lang_definitions {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_LANG_DEFINITIONS'] = zif_abapgit_lang_definitions;zif_abapgit_lang_definitions.ty_i18n_tpool = new abap.types.Structure({"language": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "textpool": abap.types.TableFactory.construct(new abap.types.Structure({"id": new abap.types.Character(1, {}), "key": new abap.types.Character(8, {}), "entry": new abap.types.Character(255, {}), "length": new abap.types.Integer({qualifiedName: "I"}), "split": new abap.types.Character(8, {"qualifiedName":"zif_abapgit_definitions=>ty_tpool-split"})}, "zif_abapgit_definitions=>ty_tpool", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_tpool_tt")}, "zif_abapgit_lang_definitions=>ty_i18n_tpool", undefined, {}, {});
+zif_abapgit_lang_definitions.ty_i18n_tpools = abap.types.TableFactory.construct(new abap.types.Structure({"language": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "textpool": abap.types.TableFactory.construct(new abap.types.Structure({"id": new abap.types.Character(1, {}), "key": new abap.types.Character(8, {}), "entry": new abap.types.Character(255, {}), "length": new abap.types.Integer({qualifiedName: "I"}), "split": new abap.types.Character(8, {"qualifiedName":"zif_abapgit_definitions=>ty_tpool-split"})}, "zif_abapgit_definitions=>ty_tpool", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_tpool_tt")}, "zif_abapgit_lang_definitions=>ty_i18n_tpool", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_lang_definitions=>ty_i18n_tpools");
+zif_abapgit_lang_definitions.ty_i18n_line = new abap.types.Structure({"language": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "lines": abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINETAB")}, "zif_abapgit_lang_definitions=>ty_i18n_line", undefined, {}, {});
+zif_abapgit_lang_definitions.ty_i18n_lines = abap.types.TableFactory.construct(new abap.types.Structure({"language": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "lines": abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINETAB")}, "zif_abapgit_lang_definitions=>ty_i18n_line", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["LANGUAGE"]},"secondary":[]}, "zif_abapgit_lang_definitions=>ty_i18n_lines");
+zif_abapgit_lang_definitions.ty_langus = abap.types.TableFactory.construct(new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_lang_definitions=>ty_langus");
+export {zif_abapgit_lang_definitions};
+//# sourceMappingURL=zif_abapgit_lang_definitions.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_log.intf.mjs.html b/output/zif_abapgit_log.intf.mjs.html new file mode 100644 index 00000000000..de5ddf4f88f --- /dev/null +++ b/output/zif_abapgit_log.intf.mjs.html @@ -0,0 +1,202 @@ + + + + + + Code coverage report for output/zif_abapgit_log.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_log.intf.mjs

+
+ +
+ 100% + Statements + 40/40 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 40/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +401x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_log.intf.abap
+class zif_abapgit_log {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_STATUS": {"type": () => {return new abap.types.Structure({"ok": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "error": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "warning": new abap.types.Character(1, {"qualifiedName":"sy-msgty"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_LOG_LEVEL": {"type": () => {return new abap.types.Structure({"empty": new abap.types.Integer({qualifiedName: "I"}), "info": new abap.types.Integer({qualifiedName: "I"}), "warning": new abap.types.Integer({qualifiedName: "I"}), "error": new abap.types.Integer({qualifiedName: "I"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"ADD": {"visibility": "U", "parameters": {"IV_MSG": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_TYPE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"sy-msgty"});}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}, "IX_EXC": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"});}, "is_optional": " "}}},
+  "ADD_ERROR": {"visibility": "U", "parameters": {"IV_MSG": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "ADD_INFO": {"visibility": "U", "parameters": {"IV_MSG": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "ADD_WARNING": {"visibility": "U", "parameters": {"IV_MSG": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "ADD_SUCCESS": {"visibility": "U", "parameters": {"IV_MSG": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "ADD_EXCEPTION": {"visibility": "U", "parameters": {"IX_EXC": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"});}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "CLEAR": {"visibility": "U", "parameters": {}},
+  "COUNT": {"visibility": "U", "parameters": {"RV_COUNT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_MESSAGES": {"visibility": "U", "parameters": {"RT_MSG": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_LOG_OUT-TEXT"}), "obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "exception": new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"})}, "zif_abapgit_log=>ty_log_out", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_log=>ty_log_outs");}, "is_optional": " "}}},
+  "GET_ITEM_STATUS": {"visibility": "U", "parameters": {"RT_ITEM_STATUS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {}), "status": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "messages": abap.types.TableFactory.construct(new abap.types.Structure({"text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-TEXT"}), "type": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "level": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-LEVEL"})}, "zif_abapgit_log=>ty_msg", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_log=>ty_msgs")}, "zif_abapgit_log=>ty_item_status_out", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["ITEM-OBJ_TYPE","ITEM-OBJ_NAME"]},"secondary":[]}, "zif_abapgit_log=>ty_item_status_outs");}, "is_optional": " "}}},
+  "GET_STATUS": {"visibility": "U", "parameters": {"RV_STATUS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"sy-msgty"});}, "is_optional": " "}}},
+  "GET_LOG_LEVEL": {"visibility": "U", "parameters": {"RV_LEVEL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "GET_TITLE": {"visibility": "U", "parameters": {"RV_TITLE": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_TITLE": {"visibility": "U", "parameters": {"RI_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "IV_TITLE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}},
+  "MERGE_WITH": {"visibility": "U", "parameters": {"RI_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "IV_MIN_LEVEL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "CLONE": {"visibility": "U", "parameters": {"RI_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_LOG'] = zif_abapgit_log;
+zif_abapgit_log.zif_abapgit_log$c_status = new abap.types.Structure({"ok": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "error": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "warning": new abap.types.Character(1, {"qualifiedName":"sy-msgty"})}, undefined, undefined, {}, {});
+zif_abapgit_log.zif_abapgit_log$c_status.get().ok.set('S');
+zif_abapgit_log.zif_abapgit_log$c_status.get().error.set('E');
+zif_abapgit_log.zif_abapgit_log$c_status.get().warning.set('W');
+zif_abapgit_log.zif_abapgit_log$c_log_level = new abap.types.Structure({"empty": new abap.types.Integer({qualifiedName: "I"}), "info": new abap.types.Integer({qualifiedName: "I"}), "warning": new abap.types.Integer({qualifiedName: "I"}), "error": new abap.types.Integer({qualifiedName: "I"})}, undefined, undefined, {}, {});
+zif_abapgit_log.zif_abapgit_log$c_log_level.get().empty.set(0);
+zif_abapgit_log.zif_abapgit_log$c_log_level.get().info.set(1);
+zif_abapgit_log.zif_abapgit_log$c_log_level.get().warning.set(2);
+zif_abapgit_log.zif_abapgit_log$c_log_level.get().error.set(3);
+zif_abapgit_log.ty_log_out = new abap.types.Structure({"type": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_LOG_OUT-TEXT"}), "obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "exception": new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"})}, "zif_abapgit_log=>ty_log_out", undefined, {}, {});
+zif_abapgit_log.ty_log_outs = abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_LOG_OUT-TEXT"}), "obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "exception": new abap.types.ABAPObject({qualifiedName: "CX_ROOT", RTTIName: "\\CLASS=CX_ROOT"})}, "zif_abapgit_log=>ty_log_out", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_log=>ty_log_outs");
+zif_abapgit_log.ty_msg = new abap.types.Structure({"text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-TEXT"}), "type": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "level": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-LEVEL"})}, "zif_abapgit_log=>ty_msg", undefined, {}, {});
+zif_abapgit_log.ty_msgs = abap.types.TableFactory.construct(new abap.types.Structure({"text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-TEXT"}), "type": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "level": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-LEVEL"})}, "zif_abapgit_log=>ty_msg", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_log=>ty_msgs");
+zif_abapgit_log.ty_item_status_out = new abap.types.Structure({"item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {}), "status": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "messages": abap.types.TableFactory.construct(new abap.types.Structure({"text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-TEXT"}), "type": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "level": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-LEVEL"})}, "zif_abapgit_log=>ty_msg", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_log=>ty_msgs")}, "zif_abapgit_log=>ty_item_status_out", undefined, {}, {});
+zif_abapgit_log.ty_item_status_outs = abap.types.TableFactory.construct(new abap.types.Structure({"item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {}), "status": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "messages": abap.types.TableFactory.construct(new abap.types.Structure({"text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-TEXT"}), "type": new abap.types.Character(1, {"qualifiedName":"sy-msgty"}), "level": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_LOG=>TY_MSG-LEVEL"})}, "zif_abapgit_log=>ty_msg", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_log=>ty_msgs")}, "zif_abapgit_log=>ty_item_status_out", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["ITEM-OBJ_TYPE","ITEM-OBJ_NAME"]},"secondary":[]}, "zif_abapgit_log=>ty_item_status_outs");
+export {zif_abapgit_log};
+//# sourceMappingURL=zif_abapgit_log.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_longtexts.intf.mjs.html b/output/zif_abapgit_longtexts.intf.mjs.html new file mode 100644 index 00000000000..e58cd557bb6 --- /dev/null +++ b/output/zif_abapgit_longtexts.intf.mjs.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for output/zif_abapgit_longtexts.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_longtexts.intf.mjs

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_longtexts.intf.abap
+class zif_abapgit_longtexts {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"CHANGED_BY": {"visibility": "U", "parameters": {"RV_USER": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"});}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}, "IV_LONGTEXT_ID": {"type": () => {return new abap.types.Character(2, {});}, "is_optional": " "}, "IT_DOKIL": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"id": new abap.types.Character(2, {}), "object": new abap.types.Character(60, {}), "langu": new abap.types.Character(1, {}), "typ": new abap.types.Character(1, {}), "version": new abap.types.Numc({length: 4}), "masterlang": new abap.types.Character(1, {}), "txtlines": new abap.types.Numc({length: 5}), "dokstate": new abap.types.Character(1, {}), "selfdef": new abap.types.Character(1, {})}, "DOKIL", "DOKIL", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_dokil_tt");}, "is_optional": " "}}},
+  "SERIALIZE": {"visibility": "U", "parameters": {"RT_LONGTEXTS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"dokil": new abap.types.Structure({"id": new abap.types.Character(2, {}), "object": new abap.types.Character(60, {}), "langu": new abap.types.Character(1, {}), "typ": new abap.types.Character(1, {}), "version": new abap.types.Numc({length: 4}), "masterlang": new abap.types.Character(1, {}), "txtlines": new abap.types.Numc({length: 5}), "dokstate": new abap.types.Character(1, {}), "selfdef": new abap.types.Character(1, {})}, "DOKIL", "DOKIL", {}, {}), "head": new abap.types.Structure({"tdobject": new abap.types.Character(10, {}), "tdname": new abap.types.Character(70, {}), "tdid": new abap.types.Character(4, {}), "tdspras": new abap.types.Character(1, {}), "tdtitle": new abap.types.Character(50, {}), "tdform": new abap.types.Character(16, {}), "tdstyle": new abap.types.Character(8, {}), "tdversion": new abap.types.Numc({length: 5}), "tdfuser": new abap.types.Character(12, {}), "tdfreles": new abap.types.Character(4, {}), "tdfdate": new abap.types.Date(), "tdftime": new abap.types.Time(), "tdluser": new abap.types.Character(12, {}), "tdlreles": new abap.types.Character(4, {}), "tdldate": new abap.types.Date(), "tdltime": new abap.types.Time(), "tdlinesize": new abap.types.Numc({length: 3}), "tdtxtlines": new abap.types.Numc({length: 5}), "tdhyphenat": new abap.types.Character(1, {}), "tdospras": new abap.types.Character(1, {}), "tdtranstat": new abap.types.Numc(), "tdmacode1": new abap.types.Character(16, {}), "tdmacode2": new abap.types.Character(16, {}), "tdrefobj": new abap.types.Character(10, {}), "tdrefname": new abap.types.Character(70, {}), "tdrefid": new abap.types.Character(4, {}), "tdtexttype": new abap.types.Character(6, {}), "tdcompress": new abap.types.Character(1, {}), "mandt": new abap.types.Character(3, {}), "tdoclass": new abap.types.Character(4, {}), "logsys": new abap.types.Character(10, {})}, "THEAD", "THEAD", {}, {}), "lines": abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINE_TAB")}, "zif_abapgit_longtexts=>ty_longtext", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_longtexts=>ty_longtexts");}, "is_optional": " "}, "IV_LONGTEXT_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_LONGTEXT_ID": {"type": () => {return new abap.types.Character(2, {});}, "is_optional": " "}, "IT_DOKIL": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"id": new abap.types.Character(2, {}), "object": new abap.types.Character(60, {}), "langu": new abap.types.Character(1, {}), "typ": new abap.types.Character(1, {}), "version": new abap.types.Numc({length: 4}), "masterlang": new abap.types.Character(1, {}), "txtlines": new abap.types.Numc({length: 5}), "dokstate": new abap.types.Character(1, {}), "selfdef": new abap.types.Character(1, {})}, "DOKIL", "DOKIL", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_dokil_tt");}, "is_optional": " "}, "II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_OUTPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_OUTPUT"});}, "is_optional": " "}, "IO_I18N_PARAMS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_I18N_PARAMS", RTTIName: "\\CLASS=ZCL_ABAPGIT_I18N_PARAMS"});}, "is_optional": " "}}},
+  "DESERIALIZE": {"visibility": "U", "parameters": {"IV_LONGTEXT_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_LONGTEXT_ID": {"type": () => {return new abap.types.Character(2, {});}, "is_optional": " "}, "II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"});}, "is_optional": " "}, "IV_MAIN_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"sy-langu","conversionExit":"ISOLA"});}, "is_optional": " "}}},
+  "DELETE": {"visibility": "U", "parameters": {"IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}, "IV_LONGTEXT_ID": {"type": () => {return new abap.types.Character(2, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_LONGTEXTS'] = zif_abapgit_longtexts;zif_abapgit_longtexts.ty_longtext = new abap.types.Structure({"dokil": new abap.types.Structure({"id": new abap.types.Character(2, {}), "object": new abap.types.Character(60, {}), "langu": new abap.types.Character(1, {}), "typ": new abap.types.Character(1, {}), "version": new abap.types.Numc({length: 4}), "masterlang": new abap.types.Character(1, {}), "txtlines": new abap.types.Numc({length: 5}), "dokstate": new abap.types.Character(1, {}), "selfdef": new abap.types.Character(1, {})}, "DOKIL", "DOKIL", {}, {}), "head": new abap.types.Structure({"tdobject": new abap.types.Character(10, {}), "tdname": new abap.types.Character(70, {}), "tdid": new abap.types.Character(4, {}), "tdspras": new abap.types.Character(1, {}), "tdtitle": new abap.types.Character(50, {}), "tdform": new abap.types.Character(16, {}), "tdstyle": new abap.types.Character(8, {}), "tdversion": new abap.types.Numc({length: 5}), "tdfuser": new abap.types.Character(12, {}), "tdfreles": new abap.types.Character(4, {}), "tdfdate": new abap.types.Date(), "tdftime": new abap.types.Time(), "tdluser": new abap.types.Character(12, {}), "tdlreles": new abap.types.Character(4, {}), "tdldate": new abap.types.Date(), "tdltime": new abap.types.Time(), "tdlinesize": new abap.types.Numc({length: 3}), "tdtxtlines": new abap.types.Numc({length: 5}), "tdhyphenat": new abap.types.Character(1, {}), "tdospras": new abap.types.Character(1, {}), "tdtranstat": new abap.types.Numc(), "tdmacode1": new abap.types.Character(16, {}), "tdmacode2": new abap.types.Character(16, {}), "tdrefobj": new abap.types.Character(10, {}), "tdrefname": new abap.types.Character(70, {}), "tdrefid": new abap.types.Character(4, {}), "tdtexttype": new abap.types.Character(6, {}), "tdcompress": new abap.types.Character(1, {}), "mandt": new abap.types.Character(3, {}), "tdoclass": new abap.types.Character(4, {}), "logsys": new abap.types.Character(10, {})}, "THEAD", "THEAD", {}, {}), "lines": abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINE_TAB")}, "zif_abapgit_longtexts=>ty_longtext", undefined, {}, {});
+zif_abapgit_longtexts.ty_longtexts = abap.types.TableFactory.construct(new abap.types.Structure({"dokil": new abap.types.Structure({"id": new abap.types.Character(2, {}), "object": new abap.types.Character(60, {}), "langu": new abap.types.Character(1, {}), "typ": new abap.types.Character(1, {}), "version": new abap.types.Numc({length: 4}), "masterlang": new abap.types.Character(1, {}), "txtlines": new abap.types.Numc({length: 5}), "dokstate": new abap.types.Character(1, {}), "selfdef": new abap.types.Character(1, {})}, "DOKIL", "DOKIL", {}, {}), "head": new abap.types.Structure({"tdobject": new abap.types.Character(10, {}), "tdname": new abap.types.Character(70, {}), "tdid": new abap.types.Character(4, {}), "tdspras": new abap.types.Character(1, {}), "tdtitle": new abap.types.Character(50, {}), "tdform": new abap.types.Character(16, {}), "tdstyle": new abap.types.Character(8, {}), "tdversion": new abap.types.Numc({length: 5}), "tdfuser": new abap.types.Character(12, {}), "tdfreles": new abap.types.Character(4, {}), "tdfdate": new abap.types.Date(), "tdftime": new abap.types.Time(), "tdluser": new abap.types.Character(12, {}), "tdlreles": new abap.types.Character(4, {}), "tdldate": new abap.types.Date(), "tdltime": new abap.types.Time(), "tdlinesize": new abap.types.Numc({length: 3}), "tdtxtlines": new abap.types.Numc({length: 5}), "tdhyphenat": new abap.types.Character(1, {}), "tdospras": new abap.types.Character(1, {}), "tdtranstat": new abap.types.Numc(), "tdmacode1": new abap.types.Character(16, {}), "tdmacode2": new abap.types.Character(16, {}), "tdrefobj": new abap.types.Character(10, {}), "tdrefname": new abap.types.Character(70, {}), "tdrefid": new abap.types.Character(4, {}), "tdtexttype": new abap.types.Character(6, {}), "tdcompress": new abap.types.Character(1, {}), "mandt": new abap.types.Character(3, {}), "tdoclass": new abap.types.Character(4, {}), "logsys": new abap.types.Character(10, {})}, "THEAD", "THEAD", {}, {}), "lines": abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINE_TAB")}, "zif_abapgit_longtexts=>ty_longtext", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_longtexts=>ty_longtexts");
+export {zif_abapgit_longtexts};
+//# sourceMappingURL=zif_abapgit_longtexts.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_lxe_texts.intf.mjs.html b/output/zif_abapgit_lxe_texts.intf.mjs.html new file mode 100644 index 00000000000..55e8a800f6e --- /dev/null +++ b/output/zif_abapgit_lxe_texts.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_lxe_texts.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_lxe_texts.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_lxe_texts.intf.abap
+class zif_abapgit_lxe_texts {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"SERIALIZE": {"visibility": "U", "parameters": {"IV_OBJECT_TYPE": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}, "IO_I18N_PARAMS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_I18N_PARAMS", RTTIName: "\\CLASS=ZCL_ABAPGIT_I18N_PARAMS"});}, "is_optional": " "}, "II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_OUTPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_OUTPUT"});}, "is_optional": " "}, "IO_FILES": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_OBJECTS_FILES", RTTIName: "\\CLASS=ZCL_ABAPGIT_OBJECTS_FILES"});}, "is_optional": " "}}},
+  "DESERIALIZE": {"visibility": "U", "parameters": {"IV_OBJECT_TYPE": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}, "IO_I18N_PARAMS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_I18N_PARAMS", RTTIName: "\\CLASS=ZCL_ABAPGIT_I18N_PARAMS"});}, "is_optional": " "}, "II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"});}, "is_optional": " "}, "IO_FILES": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_OBJECTS_FILES", RTTIName: "\\CLASS=ZCL_ABAPGIT_OBJECTS_FILES"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_LXE_TEXTS'] = zif_abapgit_lxe_texts;zif_abapgit_lxe_texts.ty_text_pairs = abap.types.TableFactory.construct(new abap.types.Structure({"textkey": new abap.types.Character(32, {"qualifiedName":"LXETEXTKEY","ddicName":"LXETEXTKEY"}), "s_text": new abap.types.Character(255, {"qualifiedName":"LXEUNITLIN","ddicName":"LXEUNITLIN"}), "t_text": new abap.types.Character(255, {"qualifiedName":"LXEUNITLIN","ddicName":"LXEUNITLIN"}), "unitmlt": new abap.types.Integer({qualifiedName: "LXEUNITMLT"}), "uppcase": new abap.types.Character(1, {"qualifiedName":"LXEUPPCASE","ddicName":"LXEUPPCASE"}), "texttype": new abap.types.Character(4, {"qualifiedName":"LXETEXTTYPE","ddicName":"LXETEXTTYPE"})}, "LXE_PCX_S1", "LXE_PCX_S1", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_lxe_texts=>ty_text_pairs");
+export {zif_abapgit_lxe_texts};
+//# sourceMappingURL=zif_abapgit_lxe_texts.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_merge.intf.mjs.html b/output/zif_abapgit_merge.intf.mjs.html new file mode 100644 index 00000000000..068aeb2432f --- /dev/null +++ b/output/zif_abapgit_merge.intf.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/zif_abapgit_merge.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_merge.intf.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_merge.intf.abap
+class zif_abapgit_merge {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_CONFLICTS": {"visibility": "U", "parameters": {"RT_CONFLICTS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-FILENAME"}), "source_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "source_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-SOURCE_DATA"}), "target_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "target_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-TARGET_DATA"}), "result_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "result_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-RESULT_DATA"})}, "zif_abapgit_merge=>ty_merge_conflict", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_merge=>ty_merge_conflict_tt");}, "is_optional": " "}}},
+  "GET_RESULT": {"visibility": "U", "parameters": {"RS_MERGE": {"type": () => {return new abap.types.Structure({"repo": new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_REPO_ONLINE", RTTIName: "\\CLASS=ZCL_ABAPGIT_REPO_ONLINE"}), "source": new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "is_head": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-DISPLAY_NAME"})}, "zif_abapgit_git_definitions=>ty_git_branch", undefined, {}, {}), "target": new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "is_head": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-DISPLAY_NAME"})}, "zif_abapgit_git_definitions=>ty_git_branch", undefined, {}, {}), "common": new abap.types.Structure({"commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "tree": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "time": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_ANCESTOR-TIME"}), "body": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_ANCESTOR-BODY"})}, "zif_abapgit_definitions=>ty_ancestor", undefined, {}, {}), "stree": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt"), "ttree": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt"), "ctree": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt"), "result": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt"), "stage": new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STAGE", RTTIName: "\\CLASS=ZCL_ABAPGIT_STAGE"}), "conflict": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE-CONFLICT"})}, "zif_abapgit_merge=>ty_merge", undefined, {}, {});}, "is_optional": " "}}},
+  "GET_SOURCE_BRANCH": {"visibility": "U", "parameters": {"RV_SOURCE_BRANCH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "HAS_CONFLICTS": {"visibility": "U", "parameters": {"RV_CONFLICTS_EXISTS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "RESOLVE_CONFLICT": {"visibility": "U", "parameters": {"IS_CONFLICT": {"type": () => {return new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-FILENAME"}), "source_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "source_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-SOURCE_DATA"}), "target_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "target_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-TARGET_DATA"}), "result_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "result_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-RESULT_DATA"})}, "zif_abapgit_merge=>ty_merge_conflict", undefined, {}, {});}, "is_optional": " "}}},
+  "RUN": {"visibility": "U", "parameters": {}}};
+}
+abap.Classes['ZIF_ABAPGIT_MERGE'] = zif_abapgit_merge;zif_abapgit_merge.ty_merge = new abap.types.Structure({"repo": new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_REPO_ONLINE", RTTIName: "\\CLASS=ZCL_ABAPGIT_REPO_ONLINE"}), "source": new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "is_head": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-DISPLAY_NAME"})}, "zif_abapgit_git_definitions=>ty_git_branch", undefined, {}, {}), "target": new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "is_head": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-DISPLAY_NAME"})}, "zif_abapgit_git_definitions=>ty_git_branch", undefined, {}, {}), "common": new abap.types.Structure({"commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "tree": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "time": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_ANCESTOR-TIME"}), "body": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_ANCESTOR-BODY"})}, "zif_abapgit_definitions=>ty_ancestor", undefined, {}, {}), "stree": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt"), "ttree": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt"), "ctree": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt"), "result": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-PATH"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_EXPANDED-NAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "chmod": new abap.types.Character(6, {"qualifiedName":"zif_abapgit_git_definitions=>ty_chmod"})}, "zif_abapgit_git_definitions=>ty_expanded", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_expanded_tt"), "stage": new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STAGE", RTTIName: "\\CLASS=ZCL_ABAPGIT_STAGE"}), "conflict": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE-CONFLICT"})}, "zif_abapgit_merge=>ty_merge", undefined, {}, {});
+zif_abapgit_merge.ty_merge_conflict = new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-FILENAME"}), "source_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "source_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-SOURCE_DATA"}), "target_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "target_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-TARGET_DATA"}), "result_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "result_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-RESULT_DATA"})}, "zif_abapgit_merge=>ty_merge_conflict", undefined, {}, {});
+zif_abapgit_merge.ty_merge_conflict_tt = abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-FILENAME"}), "source_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "source_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-SOURCE_DATA"}), "target_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "target_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-TARGET_DATA"}), "result_sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "result_data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_MERGE=>TY_MERGE_CONFLICT-RESULT_DATA"})}, "zif_abapgit_merge=>ty_merge_conflict", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_merge=>ty_merge_conflict_tt");
+export {zif_abapgit_merge};
+//# sourceMappingURL=zif_abapgit_merge.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_object.intf.mjs.html b/output/zif_abapgit_object.intf.mjs.html new file mode 100644 index 00000000000..7a221a39708 --- /dev/null +++ b/output/zif_abapgit_object.intf.mjs.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for output/zif_abapgit_object.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_object.intf.mjs

+
+ +
+ 100% + Statements + 28/28 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 28/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +281x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_object.intf.abap
+class zif_abapgit_object {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"MO_FILES": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_OBJECTS_FILES", RTTIName: "\\CLASS=ZCL_ABAPGIT_OBJECTS_FILES"});}, "visibility": "U", "is_constant": " ", "is_class": " "},
+  "GC_STEP_ID": {"type": () => {return new abap.types.Structure({"early": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "abap": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "ddic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "late": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"SERIALIZE": {"visibility": "U", "parameters": {"IO_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_OUTPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_OUTPUT"});}, "is_optional": " "}}},
+  "DESERIALIZE": {"visibility": "U", "parameters": {"IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IO_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"});}, "is_optional": " "}, "IV_STEP": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "IV_TRANSPORT": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}}},
+  "DELETE": {"visibility": "U", "parameters": {"IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_TRANSPORT": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}}},
+  "EXISTS": {"visibility": "U", "parameters": {"RV_BOOL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_LOCKED": {"visibility": "U", "parameters": {"RV_IS_LOCKED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "IS_ACTIVE": {"visibility": "U", "parameters": {"RV_ACTIVE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "CHANGED_BY": {"visibility": "U", "parameters": {"RV_USER": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"});}, "is_optional": " "}, "IV_EXTRA": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "JUMP": {"visibility": "U", "parameters": {"RV_EXIT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_EXTRA": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_METADATA": {"visibility": "U", "parameters": {"RS_METADATA": {"type": () => {return new abap.types.Structure({"class_": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA-CLASS_"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA-VERSION"})}, "zif_abapgit_definitions=>ty_metadata", undefined, {}, {});}, "is_optional": " "}}},
+  "GET_COMPARATOR": {"visibility": "U", "parameters": {"RI_COMPARATOR": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_COMPARATOR", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_COMPARATOR"});}, "is_optional": " "}}},
+  "GET_DESERIALIZE_STEPS": {"visibility": "U", "parameters": {"RT_STEPS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_deserialization_step_tt");}, "is_optional": " "}}},
+  "GET_DESERIALIZE_ORDER": {"visibility": "U", "parameters": {"RT_OBJECTS_BEFORE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_items_tt");}, "is_optional": " "}, "IT_ALL_OBJECTS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_items_tt");}, "is_optional": " "}}},
+  "MAP_FILENAME_TO_OBJECT": {"visibility": "U", "parameters": {"IV_FILENAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PATH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IO_DOT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_DOT_ABAPGIT", RTTIName: "\\CLASS=ZCL_ABAPGIT_DOT_ABAPGIT"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "CS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "MAP_OBJECT_TO_FILENAME": {"visibility": "U", "parameters": {"IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}, "CV_FILENAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_OBJECT'] = zif_abapgit_object;
+zif_abapgit_object.zif_abapgit_object$gc_step_id = new abap.types.Structure({"early": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "abap": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "ddic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "late": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"})}, undefined, undefined, {}, {});
+zif_abapgit_object.zif_abapgit_object$gc_step_id.get().early.set(`EARLY`);
+zif_abapgit_object.zif_abapgit_object$gc_step_id.get().abap.set(`ABAP`);
+zif_abapgit_object.zif_abapgit_object$gc_step_id.get().ddic.set(`DDIC`);
+zif_abapgit_object.zif_abapgit_object$gc_step_id.get().late.set(`LATE`);
+export {zif_abapgit_object};
+//# sourceMappingURL=zif_abapgit_object.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_object_enho.intf.mjs.html b/output/zif_abapgit_object_enho.intf.mjs.html new file mode 100644 index 00000000000..fe0baa4361b --- /dev/null +++ b/output/zif_abapgit_object_enho.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_object_enho.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_object_enho.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_object_enho.intf.abap
+class zif_abapgit_object_enho {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"DESERIALIZE": {"visibility": "U", "parameters": {"II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}}},
+  "SERIALIZE": {"visibility": "U", "parameters": {"II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_OUTPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_OUTPUT"});}, "is_optional": " "}, "II_ENH_TOOL": {"type": () => {return (() => { throw "Void type: if_enh_tool" })();}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_OBJECT_ENHO'] = zif_abapgit_object_enho;
+export {zif_abapgit_object_enho};
+//# sourceMappingURL=zif_abapgit_object_enho.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_object_enhs.intf.mjs.html b/output/zif_abapgit_object_enhs.intf.mjs.html new file mode 100644 index 00000000000..62833d37f23 --- /dev/null +++ b/output/zif_abapgit_object_enhs.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_object_enhs.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_object_enhs.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_object_enhs.intf.abap
+class zif_abapgit_object_enhs {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"DESERIALIZE": {"visibility": "U", "parameters": {"II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "II_ENH_SPOT_TOOL": {"type": () => {return (() => { throw "Void type: if_enh_spot_tool" })();}, "is_optional": " "}}},
+  "SERIALIZE": {"visibility": "U", "parameters": {"II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_OUTPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_OUTPUT"});}, "is_optional": " "}, "II_ENH_SPOT_TOOL": {"type": () => {return (() => { throw "Void type: if_enh_spot_tool" })();}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_OBJECT_ENHS'] = zif_abapgit_object_enhs;
+export {zif_abapgit_object_enhs};
+//# sourceMappingURL=zif_abapgit_object_enhs.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_object_filter.intf.mjs.html b/output/zif_abapgit_object_filter.intf.mjs.html new file mode 100644 index 00000000000..6ff94fafefb --- /dev/null +++ b/output/zif_abapgit_object_filter.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_object_filter.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_object_filter.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_object_filter.intf.abap
+class zif_abapgit_object_filter {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_FILTER": {"visibility": "U", "parameters": {"RT_FILTER": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"pgmid": new abap.types.Character(4, {}), "object": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {}), "korrnum": new abap.types.Character(10, {}), "delflag": new abap.types.Character(1, {}), "genflag": new abap.types.Character(1, {}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TADIR-PATH"}), "srcsystem": new abap.types.Character(5, {}), "masterlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_tadir", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_tadir_tt");}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_OBJECT_FILTER'] = zif_abapgit_object_filter;
+export {zif_abapgit_object_filter};
+//# sourceMappingURL=zif_abapgit_object_filter.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_objects.intf.mjs.html b/output/zif_abapgit_objects.intf.mjs.html new file mode 100644 index 00000000000..bfdde7888f8 --- /dev/null +++ b/output/zif_abapgit_objects.intf.mjs.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for output/zif_abapgit_objects.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_objects.intf.mjs

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 23/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_objects.intf.abap
+class zif_abapgit_objects {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_DESERIALIZE_ACTION": {"type": () => {return new abap.types.Structure({"no_support": new abap.types.Integer({qualifiedName: "I"}), "none": new abap.types.Integer({qualifiedName: "I"}), "add": new abap.types.Integer({qualifiedName: "I"}), "update": new abap.types.Integer({qualifiedName: "I"}), "overwrite": new abap.types.Integer({qualifiedName: "I"}), "delete": new abap.types.Integer({qualifiedName: "I"}), "delete_add": new abap.types.Integer({qualifiedName: "I"}), "packmove": new abap.types.Integer({qualifiedName: "I"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_OBJECTS'] = zif_abapgit_objects;
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action = new abap.types.Structure({"no_support": new abap.types.Integer({qualifiedName: "I"}), "none": new abap.types.Integer({qualifiedName: "I"}), "add": new abap.types.Integer({qualifiedName: "I"}), "update": new abap.types.Integer({qualifiedName: "I"}), "overwrite": new abap.types.Integer({qualifiedName: "I"}), "delete": new abap.types.Integer({qualifiedName: "I"}), "delete_add": new abap.types.Integer({qualifiedName: "I"}), "packmove": new abap.types.Integer({qualifiedName: "I"})}, undefined, undefined, {}, {});
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action.get().no_support.set(-1);
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action.get().none.set(0);
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action.get().add.set(1);
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action.get().update.set(2);
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action.get().overwrite.set(3);
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action.get().delete.set(4);
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action.get().delete_add.set(5);
+zif_abapgit_objects.zif_abapgit_objects$c_deserialize_action.get().packmove.set(6);
+zif_abapgit_objects.ty_serialization = new abap.types.Structure({"files": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt"), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_objects=>ty_serialization", undefined, {}, {});
+zif_abapgit_objects.ty_deserialization = new abap.types.Structure({"obj": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_OBJECT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_OBJECT"}), "xml": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_objects=>ty_deserialization", undefined, {}, {});
+zif_abapgit_objects.ty_deserialization_tt = abap.types.TableFactory.construct(new abap.types.Structure({"obj": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_OBJECT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_OBJECT"}), "xml": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_objects=>ty_deserialization", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_objects=>ty_deserialization_tt");
+zif_abapgit_objects.ty_step_data = new abap.types.Structure({"step_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_OBJECTS=>TY_STEP_DATA-ORDER"}), "descr": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_OBJECTS=>TY_STEP_DATA-DESCR"}), "syntax_check": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "objects": abap.types.TableFactory.construct(new abap.types.Structure({"obj": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_OBJECT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_OBJECT"}), "xml": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_objects=>ty_deserialization", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_objects=>ty_deserialization_tt")}, "zif_abapgit_objects=>ty_step_data", undefined, {}, {});
+zif_abapgit_objects.ty_step_data_tt = abap.types.TableFactory.construct(new abap.types.Structure({"step_id": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_DESERIALIZATION_STEP"}), "order": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_OBJECTS=>TY_STEP_DATA-ORDER"}), "descr": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_OBJECTS=>TY_STEP_DATA-DESCR"}), "syntax_check": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "objects": abap.types.TableFactory.construct(new abap.types.Structure({"obj": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_OBJECT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_OBJECT"}), "xml": new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_objects=>ty_deserialization", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_objects=>ty_deserialization_tt")}, "zif_abapgit_objects=>ty_step_data", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_objects=>ty_step_data_tt");
+export {zif_abapgit_objects};
+//# sourceMappingURL=zif_abapgit_objects.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_oo_object_fnc.intf.mjs.html b/output/zif_abapgit_oo_object_fnc.intf.mjs.html new file mode 100644 index 00000000000..6e1725baf68 --- /dev/null +++ b/output/zif_abapgit_oo_object_fnc.intf.mjs.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for output/zif_abapgit_oo_object_fnc.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_oo_object_fnc.intf.mjs

+
+ +
+ 100% + Statements + 41/41 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 41/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +411x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_oo_object_fnc.intf.abap
+class zif_abapgit_oo_object_fnc {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_PARTS": {"type": () => {return new abap.types.Structure({"locals_def": new abap.types.String({qualifiedName: "STRING"}), "locals_imp": new abap.types.String({qualifiedName: "STRING"}), "macros": new abap.types.String({qualifiedName: "STRING"}), "testclasses": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"CREATE": {"visibility": "U", "parameters": {"IV_CHECK": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IT_ATTRIBUTES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "attkeyfld": new abap.types.Character(1, {"qualifiedName":"SEOKEYFLD","ddicName":"SEOKEYFLD"}), "attbusobj": new abap.types.Character(1, {"qualifiedName":"SEOBUSOBJ","ddicName":"SEOBUSOBJ"}), "exposure": new abap.types.Numc({qualifiedName: "SEOEXPOSE"})}, "zif_abapgit_definitions=>ty_obj_attribute", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"cmpname","type":"SORTED","isUnique":false,"keyFields":["CMPNAME"]}]}, "zif_abapgit_definitions=>ty_obj_attribute_tt");}, "is_optional": " "}, "CG_PROPERTIES": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "GENERATE_LOCALS": {"visibility": "U", "parameters": {"IS_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}, "IT_LOCAL_DEFINITIONS": {"type": () => {return (() => { throw "Void type: SEOP_SOURCE_STRING" })();}, "is_optional": " "}, "IT_LOCAL_IMPLEMENTATIONS": {"type": () => {return (() => { throw "Void type: SEOP_SOURCE_STRING" })();}, "is_optional": " "}, "IT_LOCAL_MACROS": {"type": () => {return (() => { throw "Void type: SEOP_SOURCE_STRING" })();}, "is_optional": " "}, "IT_LOCAL_TEST_CLASSES": {"type": () => {return (() => { throw "Void type: SEOP_SOURCE_STRING" })();}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}}},
+  "DESERIALIZE_SOURCE": {"visibility": "U", "parameters": {"IS_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}, "IT_SOURCE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_string_tt");}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}}},
+  "INSERT_TEXT_POOL": {"visibility": "U", "parameters": {"IV_CLASS_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "is_optional": " "}, "IT_TEXT_POOL": {"type": () => {return (() => { throw "Void type: TEXTPOOL_TABLE" })();}, "is_optional": " "}, "IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "is_optional": " "}, "IV_STATE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}},
+  "UPDATE_DESCRIPTIONS": {"visibility": "U", "parameters": {"IS_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}, "IT_DESCRIPTIONS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "langu": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "descript": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"})}, "SEOCOMPOTX", "SEOCOMPOTX", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_oo_object_fnc=>ty_seocompotx_tt");}, "is_optional": " "}}},
+  "UPDATE_DESCRIPTIONS_SUB": {"visibility": "U", "parameters": {"IS_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}, "IT_DESCRIPTIONS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "sconame": new abap.types.Character(30, {"qualifiedName":"SEOSCONAME","ddicName":"SEOSCONAME"}), "langu": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "descript": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"})}, "SEOSUBCOTX", "SEOSUBCOTX", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt");}, "is_optional": " "}}},
+  "ADD_TO_ACTIVATION_LIST": {"visibility": "U", "parameters": {"IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "CREATE_SOTR": {"visibility": "U", "parameters": {"IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"SOBJ_NAME","ddicName":"SOBJ_NAME"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_INPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_INPUT"});}, "is_optional": " "}}},
+  "CREATE_DOCUMENTATION": {"visibility": "U", "parameters": {"IT_LINES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINETAB");}, "is_optional": " "}, "IV_ID": {"type": () => {return new abap.types.Character(2, {});}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(60, {});}, "is_optional": " "}, "IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "is_optional": " "}, "IV_NO_MASTERLANG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "DELETE_DOCUMENTATION": {"visibility": "U", "parameters": {"IV_ID": {"type": () => {return new abap.types.Character(2, {});}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(60, {});}, "is_optional": " "}, "IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "is_optional": " "}}},
+  "GET_INCLUDES": {"visibility": "U", "parameters": {"RT_INCLUDES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"programm": new abap.types.Character(40, {"qualifiedName":"SYREPID","ddicName":"SYREPID"})}, "zif_abapgit_oo_object_fnc=>ty_includes", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_oo_object_fnc=>ty_includes_tt");}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"SOBJ_NAME","ddicName":"SOBJ_NAME"});}, "is_optional": " "}}},
+  "EXISTS": {"visibility": "U", "parameters": {"RV_EXISTS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IS_OBJECT_NAME": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}}},
+  "SERIALIZE_ABAP": {"visibility": "U", "parameters": {"RT_SOURCE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_string_tt");}, "is_optional": " "}, "IS_CLASS_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}, "IV_TYPE": {"type": () => {return (() => { throw "Void type: SEOP_INCLUDE_EXT_APP" })();}, "is_optional": " "}}},
+  "GET_SKIP_TEST_CLASSES": {"visibility": "U", "parameters": {"RV_SKIP": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_CLASS_PROPERTIES": {"visibility": "U", "parameters": {"RS_CLASS_PROPERTIES": {"type": () => {return (() => { throw "Void type: VSEOCLASS" })();}, "is_optional": " "}, "IS_CLASS_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}}},
+  "GET_INTERFACE_PROPERTIES": {"visibility": "U", "parameters": {"RS_INTERFACE_PROPERTIES": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {}), "version": new abap.types.Numc(), "langu": new abap.types.Character(1, {}), "descript": new abap.types.Character(60, {}), "uuid": new abap.types.Hex({length: 16}), "category": new abap.types.Numc({length: 2}), "exposure": new abap.types.Numc(), "state": new abap.types.Numc(), "release": new abap.types.Numc(), "author": new abap.types.Character(12, {}), "createdon": new abap.types.Date(), "changedby": new abap.types.Character(12, {}), "changedon": new abap.types.Date(), "chgdanyby": new abap.types.Character(12, {}), "chgdanyon": new abap.types.Date(), "remote": new abap.types.Character(1, {}), "unicode": new abap.types.Character(1, {}), "r3release": new abap.types.Character(10, {}), "clsproxy": new abap.types.Character(1, {})}, "VSEOINTERF", "VSEOINTERF", {}, {});}, "is_optional": " "}, "IS_INTERFACE_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}}},
+  "READ_TEXT_POOL": {"visibility": "U", "parameters": {"RT_TEXT_POOL": {"type": () => {return (() => { throw "Void type: TEXTPOOL_TABLE" })();}, "is_optional": " "}, "IV_CLASS_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "is_optional": " "}, "IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "is_optional": " "}}},
+  "READ_DOCUMENTATION": {"visibility": "U", "parameters": {"RT_LINES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"tdformat": new abap.types.Character(2, {}), "tdline": new abap.types.Character(132, {})}, "TLINE", "TLINE", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "TLINETAB");}, "is_optional": " "}, "IV_ID": {"type": () => {return new abap.types.Character(2, {});}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(60, {});}, "is_optional": " "}, "IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "is_optional": " "}}},
+  "READ_SOTR": {"visibility": "U", "parameters": {"IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"SOBJ_NAME","ddicName":"SOBJ_NAME"});}, "is_optional": " "}, "II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_XML_OUTPUT", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_XML_OUTPUT"});}, "is_optional": " "}, "IO_I18N_PARAMS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_I18N_PARAMS", RTTIName: "\\CLASS=ZCL_ABAPGIT_I18N_PARAMS"});}, "is_optional": " "}}},
+  "READ_DESCRIPTIONS": {"visibility": "U", "parameters": {"RT_DESCRIPTIONS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "langu": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "descript": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"})}, "SEOCOMPOTX", "SEOCOMPOTX", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_oo_object_fnc=>ty_seocompotx_tt");}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "is_optional": " "}, "IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "is_optional": " "}}},
+  "READ_DESCRIPTIONS_SUB": {"visibility": "U", "parameters": {"RT_DESCRIPTIONS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "sconame": new abap.types.Character(30, {"qualifiedName":"SEOSCONAME","ddicName":"SEOSCONAME"}), "langu": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "descript": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"})}, "SEOSUBCOTX", "SEOSUBCOTX", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt");}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "is_optional": " "}, "IV_LANGUAGE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"});}, "is_optional": " "}}},
+  "DELETE": {"visibility": "U", "parameters": {"IS_DELETION_KEY": {"type": () => {return new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"})}, "SEOCLSKEY", "SEOCLSKEY", {}, {});}, "is_optional": " "}}},
+  "READ_SUPERCLASS": {"visibility": "U", "parameters": {"RV_SUPERCLASS": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "is_optional": " "}, "IV_CLASSNAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "is_optional": " "}}},
+  "READ_ATTRIBUTES": {"visibility": "U", "parameters": {"RT_ATTRIBUTES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "attkeyfld": new abap.types.Character(1, {"qualifiedName":"SEOKEYFLD","ddicName":"SEOKEYFLD"}), "attbusobj": new abap.types.Character(1, {"qualifiedName":"SEOBUSOBJ","ddicName":"SEOBUSOBJ"}), "exposure": new abap.types.Numc({qualifiedName: "SEOEXPOSE"})}, "zif_abapgit_definitions=>ty_obj_attribute", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"cmpname","type":"SORTED","isUnique":false,"keyFields":["CMPNAME"]}]}, "zif_abapgit_definitions=>ty_obj_attribute_tt");}, "is_optional": " "}, "IV_OBJECT_NAME": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_OO_OBJECT_FNC'] = zif_abapgit_oo_object_fnc;
+zif_abapgit_oo_object_fnc.zif_abapgit_oo_object_fnc$c_parts = new abap.types.Structure({"locals_def": new abap.types.String({qualifiedName: "STRING"}), "locals_imp": new abap.types.String({qualifiedName: "STRING"}), "macros": new abap.types.String({qualifiedName: "STRING"}), "testclasses": new abap.types.String({qualifiedName: "STRING"})}, undefined, undefined, {}, {});
+zif_abapgit_oo_object_fnc.zif_abapgit_oo_object_fnc$c_parts.get().locals_def.set('locals_def');
+zif_abapgit_oo_object_fnc.zif_abapgit_oo_object_fnc$c_parts.get().locals_imp.set('locals_imp');
+zif_abapgit_oo_object_fnc.zif_abapgit_oo_object_fnc$c_parts.get().macros.set('macros');
+zif_abapgit_oo_object_fnc.zif_abapgit_oo_object_fnc$c_parts.get().testclasses.set('testclasses');
+zif_abapgit_oo_object_fnc.ty_includes = new abap.types.Structure({"programm": new abap.types.Character(40, {"qualifiedName":"SYREPID","ddicName":"SYREPID"})}, "zif_abapgit_oo_object_fnc=>ty_includes", undefined, {}, {});
+zif_abapgit_oo_object_fnc.ty_includes_tt = abap.types.TableFactory.construct(new abap.types.Structure({"programm": new abap.types.Character(40, {"qualifiedName":"SYREPID","ddicName":"SYREPID"})}, "zif_abapgit_oo_object_fnc=>ty_includes", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_oo_object_fnc=>ty_includes_tt");
+zif_abapgit_oo_object_fnc.ty_seocompotx_tt = abap.types.TableFactory.construct(new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "langu": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "descript": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"})}, "SEOCOMPOTX", "SEOCOMPOTX", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_oo_object_fnc=>ty_seocompotx_tt");
+zif_abapgit_oo_object_fnc.ty_seosubcotx_tt = abap.types.TableFactory.construct(new abap.types.Structure({"clsname": new abap.types.Character(30, {"qualifiedName":"SEOCLSNAME","ddicName":"SEOCLSNAME"}), "cmpname": new abap.types.Character(30, {"qualifiedName":"SEOCMPNAME","ddicName":"SEOCMPNAME"}), "sconame": new abap.types.Character(30, {"qualifiedName":"SEOSCONAME","ddicName":"SEOSCONAME"}), "langu": new abap.types.Character(1, {"qualifiedName":"LANGU","ddicName":"LANGU"}), "descript": new abap.types.Character(60, {"qualifiedName":"SEODESCR","ddicName":"SEODESCR"})}, "SEOSUBCOTX", "SEOSUBCOTX", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt");
+export {zif_abapgit_oo_object_fnc};
+//# sourceMappingURL=zif_abapgit_oo_object_fnc.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_persist_repo.intf.mjs.html b/output/zif_abapgit_persist_repo.intf.mjs.html new file mode 100644 index 00000000000..46d88471054 --- /dev/null +++ b/output/zif_abapgit_persist_repo.intf.mjs.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for output/zif_abapgit_persist_repo.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_persist_repo.intf.mjs

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_persist_repo.intf.abap
+class zif_abapgit_persist_repo {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ADD": {"visibility": "U", "parameters": {"RV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_BRANCH_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_BRANCH": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"});}, "is_optional": " "}, "IV_DISPLAY_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_OFFLINE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IS_DOT_ABAPGIT": {"type": () => {return new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {});}, "is_optional": " "}}},
+  "DELETE": {"visibility": "U", "parameters": {"IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "EXISTS": {"visibility": "U", "parameters": {"RV_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "LIST": {"visibility": "U", "parameters": {"RT_REPOS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_repos");}, "is_optional": " "}}},
+  "LIST_BY_KEYS": {"visibility": "U", "parameters": {"RT_REPOS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_repos");}, "is_optional": " "}, "IT_KEYS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_repo_keys");}, "is_optional": " "}}},
+  "LOCK": {"visibility": "U", "parameters": {"IV_MODE": {"type": () => {return (() => { throw "Void type: ENQMODE" })();}, "is_optional": " "}, "IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "READ": {"visibility": "U", "parameters": {"RS_REPO": {"type": () => {return new abap.types.Structure({"key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo", undefined, {}, {});}, "is_optional": " "}, "IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "UPDATE_METADATA": {"visibility": "U", "parameters": {"IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}, "IS_META": {"type": () => {return new abap.types.Structure({"url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo_xml", undefined, {}, {});}, "is_optional": " "}, "IS_CHANGE_MASK": {"type": () => {return new abap.types.Structure({"url": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "branch_name": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "selected_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "package": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "created_by": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "created_at": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "deserialized_by": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "deserialized_at": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "dot_abapgit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "head_branch": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "local_settings": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_persistence=>ty_repo_meta_mask", undefined, {}, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_PERSIST_REPO'] = zif_abapgit_persist_repo;
+export {zif_abapgit_persist_repo};
+//# sourceMappingURL=zif_abapgit_persist_repo.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_persist_repo_cs.intf.mjs.html b/output/zif_abapgit_persist_repo_cs.intf.mjs.html new file mode 100644 index 00000000000..f10a5eee75f --- /dev/null +++ b/output/zif_abapgit_persist_repo_cs.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/zif_abapgit_persist_repo_cs.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_persist_repo_cs.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_persist_repo_cs.intf.abap
+class zif_abapgit_persist_repo_cs {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"UPDATE": {"visibility": "U", "parameters": {"IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}, "IV_CS_BLOB": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_CONTENT-DATA_STR"});}, "is_optional": " "}}},
+  "DELETE": {"visibility": "U", "parameters": {"IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "READ": {"visibility": "U", "parameters": {"RV_CS_BLOB": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_CONTENT-DATA_STR"});}, "is_optional": " "}, "IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_PERSIST_REPO_CS'] = zif_abapgit_persist_repo_cs;
+export {zif_abapgit_persist_repo_cs};
+//# sourceMappingURL=zif_abapgit_persist_repo_cs.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_persist_settings.intf.mjs.html b/output/zif_abapgit_persist_settings.intf.mjs.html new file mode 100644 index 00000000000..dfe421d1ada --- /dev/null +++ b/output/zif_abapgit_persist_settings.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_persist_settings.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_persist_settings.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_persist_settings.intf.abap
+class zif_abapgit_persist_settings {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"MODIFY": {"visibility": "U", "parameters": {"IO_SETTINGS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_SETTINGS", RTTIName: "\\CLASS=ZCL_ABAPGIT_SETTINGS"});}, "is_optional": " "}}},
+  "READ": {"visibility": "U", "parameters": {"RO_SETTINGS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_SETTINGS", RTTIName: "\\CLASS=ZCL_ABAPGIT_SETTINGS"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_PERSIST_SETTINGS'] = zif_abapgit_persist_settings;
+export {zif_abapgit_persist_settings};
+//# sourceMappingURL=zif_abapgit_persist_settings.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_persist_user.intf.mjs.html b/output/zif_abapgit_persist_user.intf.mjs.html new file mode 100644 index 00000000000..ee6cdd1d501 --- /dev/null +++ b/output/zif_abapgit_persist_user.intf.mjs.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for output/zif_abapgit_persist_user.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_persist_user.intf.mjs

+
+ +
+ 100% + Statements + 43/43 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 43/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +431x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_persist_user.intf.abap
+class zif_abapgit_persist_user {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_CHANGES_ONLY": {"visibility": "U", "parameters": {"RV_CHANGES_ONLY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_DEFAULT_GIT_USER_EMAIL": {"visibility": "U", "parameters": {"RV_EMAIL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_DEFAULT_GIT_USER_NAME": {"visibility": "U", "parameters": {"RV_USERNAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_DIFF_UNIFIED": {"visibility": "U", "parameters": {"RV_DIFF_UNIFIED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_FAVORITES": {"visibility": "U", "parameters": {"RT_FAVORITES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_repo_keys");}, "is_optional": " "}}},
+  "GET_HIDE_FILES": {"visibility": "U", "parameters": {"RV_HIDE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_SHOW_FOLDERS": {"visibility": "U", "parameters": {"RV_FOLDERS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_REPO_GIT_USER_EMAIL": {"visibility": "U", "parameters": {"RV_EMAIL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}}},
+  "GET_REPO_GIT_USER_NAME": {"visibility": "U", "parameters": {"RV_USERNAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}}},
+  "GET_REPO_LAST_CHANGE_SEEN": {"visibility": "U", "parameters": {"RV_VERSION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}}},
+  "GET_REPO_LOGIN": {"visibility": "U", "parameters": {"RV_LOGIN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}}},
+  "GET_REPO_SHOW": {"visibility": "U", "parameters": {"RV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "IS_FAVORITE_REPO": {"visibility": "U", "parameters": {"RV_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_REPO_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "SET_DEFAULT_GIT_USER_EMAIL": {"visibility": "U", "parameters": {"IV_EMAIL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_DEFAULT_GIT_USER_NAME": {"visibility": "U", "parameters": {"IV_USERNAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_REPO_GIT_USER_EMAIL": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}, "IV_EMAIL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_REPO_GIT_USER_NAME": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}, "IV_USERNAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_REPO_LAST_CHANGE_SEEN": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}, "IV_VERSION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_REPO_LOGIN": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}, "IV_LOGIN": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_REPO_SHOW": {"visibility": "U", "parameters": {"IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "TOGGLE_CHANGES_ONLY": {"visibility": "U", "parameters": {"RV_CHANGES_ONLY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_ORDER_BY": {"visibility": "U", "parameters": {"RV_ORDER_BY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "SET_ORDER_BY": {"visibility": "U", "parameters": {"RV_ORDER_BY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_ORDER_BY": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_ORDER_DESCENDING": {"visibility": "U", "parameters": {"RV_ORDER_DESCENDING": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "SET_ORDER_DESCENDING": {"visibility": "U", "parameters": {"RV_ORDER_DESCENDING": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_ORDER_DESCENDING": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_DIFF_FIRST": {"visibility": "U", "parameters": {"RV_DIFF_FIRST": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "SET_DIFF_FIRST": {"visibility": "U", "parameters": {"RV_DIFF_FIRST": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_DIFF_FIRST": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "TOGGLE_DIFF_UNIFIED": {"visibility": "U", "parameters": {"RV_DIFF_UNIFIED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "TOGGLE_FAVORITE": {"visibility": "U", "parameters": {"IV_REPO_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "TOGGLE_HIDE_FILES": {"visibility": "U", "parameters": {"RV_HIDE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "TOGGLE_SHOW_FOLDERS": {"visibility": "U", "parameters": {"RV_FOLDERS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_SETTINGS": {"visibility": "U", "parameters": {"RS_USER_SETTINGS": {"type": () => {return new abap.types.Structure({"max_lines": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-MAX_LINES"}), "adt_jump_enabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "show_default_repo": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "link_hints_enabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "link_hint_key": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_s_user_settings-link_hint_key"}), "parallel_proc_disabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "icon_scaling": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_s_user_settings-icon_scaling"}), "ui_theme": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-UI_THEME"}), "hide_sapgui_hint": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "activate_wo_popup": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "label_colors": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-LABEL_COLORS"})}, "zif_abapgit_definitions=>ty_s_user_settings", undefined, {}, {});}, "is_optional": " "}}},
+  "SET_SETTINGS": {"visibility": "U", "parameters": {"IS_USER_SETTINGS": {"type": () => {return new abap.types.Structure({"max_lines": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-MAX_LINES"}), "adt_jump_enabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "show_default_repo": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "link_hints_enabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "link_hint_key": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_s_user_settings-link_hint_key"}), "parallel_proc_disabled": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "icon_scaling": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_s_user_settings-icon_scaling"}), "ui_theme": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-UI_THEME"}), "hide_sapgui_hint": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "activate_wo_popup": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "label_colors": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_S_USER_SETTINGS-LABEL_COLORS"})}, "zif_abapgit_definitions=>ty_s_user_settings", undefined, {}, {});}, "is_optional": " "}}},
+  "GET_LIST_SETTINGS": {"visibility": "U", "parameters": {"RS_LIST_SETTINGS": {"type": () => {return new abap.types.Structure({"filter": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_LIST_SETTINGS-FILTER"}), "only_favorites": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "show_details": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "order_by": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_LIST_SETTINGS-ORDER_BY"}), "order_descending": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_definitions=>ty_list_settings", undefined, {}, {});}, "is_optional": " "}}},
+  "SET_LIST_SETTINGS": {"visibility": "U", "parameters": {"IS_LIST_SETTINGS": {"type": () => {return new abap.types.Structure({"filter": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_LIST_SETTINGS-FILTER"}), "only_favorites": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "show_details": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "order_by": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_LIST_SETTINGS-ORDER_BY"}), "order_descending": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_definitions=>ty_list_settings", undefined, {}, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_PERSIST_USER'] = zif_abapgit_persist_user;zif_abapgit_persist_user.ty_favorites = abap.types.TableFactory.construct(new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_repo_keys");
+export {zif_abapgit_persist_user};
+//# sourceMappingURL=zif_abapgit_persist_user.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_persistence.intf.mjs.html b/output/zif_abapgit_persistence.intf.mjs.html new file mode 100644 index 00000000000..60b53a3ae32 --- /dev/null +++ b/output/zif_abapgit_persistence.intf.mjs.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for output/zif_abapgit_persistence.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_persistence.intf.mjs

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_persistence.intf.abap
+class zif_abapgit_persistence {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_PERSISTENCE'] = zif_abapgit_persistence;zif_abapgit_persistence.ty_type = new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_type"});
+zif_abapgit_persistence.ty_value = new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});
+zif_abapgit_persistence.ty_content = new abap.types.Structure({"type": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_type"}), "value": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "data_str": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_CONTENT-DATA_STR"})}, "zif_abapgit_persistence=>ty_content", undefined, {}, {});
+zif_abapgit_persistence.ty_contents = abap.types.TableFactory.construct(new abap.types.Structure({"type": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_type"}), "value": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "data_str": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_CONTENT-DATA_STR"})}, "zif_abapgit_persistence=>ty_content", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["TYPE","VALUE"]},"secondary":[]}, "zif_abapgit_persistence=>ty_contents");
+zif_abapgit_persistence.ty_local_checksum = new abap.types.Structure({"item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_definitions=>ty_item_signature", undefined, {}, {}), "files": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_tt")}, "zif_abapgit_persistence=>ty_local_checksum", undefined, {}, {});
+zif_abapgit_persistence.ty_local_settings = new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {});
+zif_abapgit_persistence.ty_local_checksum_tt = abap.types.TableFactory.construct(new abap.types.Structure({"item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_definitions=>ty_item_signature", undefined, {}, {}), "files": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_tt")}, "zif_abapgit_persistence=>ty_local_checksum", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_local_checksum_tt");
+zif_abapgit_persistence.ty_local_checksum_by_item_tt = abap.types.TableFactory.construct(new abap.types.Structure({"item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_definitions=>ty_item_signature", undefined, {}, {}), "files": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_tt")}, "zif_abapgit_persistence=>ty_local_checksum", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":false,"keyFields":["ITEM-OBJ_TYPE","ITEM-OBJ_NAME"]},"secondary":[]}, "zif_abapgit_persistence=>ty_local_checksum_by_item_tt");
+zif_abapgit_persistence.ty_repo_xml = new abap.types.Structure({"url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo_xml", undefined, {}, {});
+zif_abapgit_persistence.ty_repo_meta_mask = new abap.types.Structure({"url": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "branch_name": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "selected_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "package": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "created_by": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "created_at": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "deserialized_by": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "deserialized_at": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "dot_abapgit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "head_branch": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "local_settings": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_persistence=>ty_repo_meta_mask", undefined, {}, {});
+zif_abapgit_persistence.ty_repo = new abap.types.Structure({"key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo", undefined, {}, {});
+zif_abapgit_persistence.ty_repos = abap.types.TableFactory.construct(new abap.types.Structure({"key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_repos");
+zif_abapgit_persistence.ty_repo_keys = abap.types.TableFactory.construct(new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_repo_keys");
+export {zif_abapgit_persistence};
+//# sourceMappingURL=zif_abapgit_persistence.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_popups.intf.mjs.html b/output/zif_abapgit_popups.intf.mjs.html new file mode 100644 index 00000000000..53131751905 --- /dev/null +++ b/output/zif_abapgit_popups.intf.mjs.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for output/zif_abapgit_popups.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_popups.intf.mjs

+
+ +
+ 100% + Statements + 30/30 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 30/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +301x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_popups.intf.abap
+class zif_abapgit_popups {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_NEW_BRANCH_LABEL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {"POPUP_SEARCH_HELP": {"visibility": "U", "parameters": {"RV_VALUE": {"type": () => {return (() => { throw "Void type: DDSHRETVAL" })();}, "is_optional": " "}, "IV_TAB_FIELD": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "POPUP_FOLDER_LOGIC": {"visibility": "U", "parameters": {"RV_FOLDER_LOGIC": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CREATE_BRANCH_POPUP": {"visibility": "U", "parameters": {"IV_SOURCE_BRANCH_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "EV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "EV_CANCEL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "BRANCH_LIST_POPUP": {"visibility": "U", "parameters": {"RS_BRANCH": {"type": () => {return new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "is_head": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_BRANCH-DISPLAY_NAME"})}, "zif_abapgit_git_definitions=>ty_git_branch", undefined, {}, {});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_DEFAULT_BRANCH": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_SHOW_NEW_OPTION": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_HIDE_BRANCH": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"});}, "is_optional": " "}, "IV_HIDE_HEAD": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "TAG_LIST_POPUP": {"visibility": "U", "parameters": {"RS_TAG": {"type": () => {return new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "object": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-NAME"}), "type": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_git_definitions=>ty_git_branch_type"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-DISPLAY_NAME"}), "tagger_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-TAGGER_NAME"}), "tagger_email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-TAGGER_EMAIL"}), "message": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-MESSAGE"}), "body": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_TAG-BODY"})}, "zif_abapgit_git_definitions=>ty_git_tag", undefined, {}, {});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "COMMIT_LIST_POPUP": {"visibility": "U", "parameters": {"RS_COMMIT": {"type": () => {return new abap.types.Structure({"sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "parent1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "parent2": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "author": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-AUTHOR"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-EMAIL"}), "time": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-TIME"}), "message": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-MESSAGE"}), "body": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-body"), "branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-BRANCH"}), "merge": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMIT-MERGE"}), "tags": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-tags"), "create": abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_CREATE-NAME"}), "parent": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_CREATE-PARENT"})}, "zif_abapgit_git_definitions=>ty_create", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_commit-create"), "compressed": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_git_definitions=>ty_commit", undefined, {}, {});}, "is_optional": " "}, "IV_REPO_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_BRANCH_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "POPUP_TO_CONFIRM": {"visibility": "U", "parameters": {"RV_ANSWER": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_popups=>ty_char1"});}, "is_optional": " "}, "IV_TITLEBAR": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_TEXT_QUESTION": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_TEXT_BUTTON_1": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_ICON_BUTTON_1": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"zif_abapgit_popups=>ty_icon"});}, "is_optional": " "}, "IV_TEXT_BUTTON_2": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_ICON_BUTTON_2": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"zif_abapgit_popups=>ty_icon"});}, "is_optional": " "}, "IV_DEFAULT_BUTTON": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_popups=>ty_char1"});}, "is_optional": " "}, "IV_DISPLAY_CANCEL_BUTTON": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_popups=>ty_char1"});}, "is_optional": " "}}},
+  "POPUP_TO_CREATE_PACKAGE": {"visibility": "U", "parameters": {"ES_PACKAGE_DATA": {"type": () => {return new abap.types.Structure({"devclass": new abap.types.Character(30, {}), "dlvunit": new abap.types.Character(30, {}), "component": new abap.types.Character(20, {}), "ctext": new abap.types.Character(60, {}), "parentcl": new abap.types.Character(30, {}), "pdevclass": new abap.types.Character(4, {}), "as4user": new abap.types.Character(12, {}), "comp_posid": new abap.types.Character(24, {}), "mainpack": new abap.types.Character(1, {}), "created_by": new abap.types.Character(12, {}), "created_on": new abap.types.Date(), "changed_by": new abap.types.Character(12, {}), "changed_on": new abap.types.Date(), "dlvu_text": new abap.types.Character(80, {}), "layer_text": new abap.types.Character(60, {}), "intfprefx": new abap.types.Character(6, {}), "cli_check": new abap.types.Character(1, {}), "namespace": new abap.types.Character(10, {}), "tpclass": new abap.types.Character(1, {}), "korrflag": new abap.types.Character(1, {}), "comp_text": new abap.types.Character(60, {})}, "SCOMPKDTLN", "SCOMPKDTLN", {}, {});}, "is_optional": " "}, "EV_CREATE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "POPUP_TO_CREATE_TRANSP_BRANCH": {"visibility": "U", "parameters": {"RS_TRANSPORT_BRANCH": {"type": () => {return new abap.types.Structure({"branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TRANSPORT_TO_BRANCH-BRANCH_NAME"}), "commit_text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TRANSPORT_TO_BRANCH-COMMIT_TEXT"})}, "zif_abapgit_definitions=>ty_transport_to_branch", undefined, {}, {});}, "is_optional": " "}, "IT_TRANSPORT_HEADERS": {"type": () => {return (() => { throw "Void type: TRWBO_REQUEST_HEADERS" })();}, "is_optional": " "}}},
+  "POPUP_TO_SELECT_TRANSPORTS": {"visibility": "U", "parameters": {"RT_TRKORR": {"type": () => {return (() => { throw "Void type: TRWBO_REQUEST_HEADERS" })();}, "is_optional": " "}}},
+  "POPUP_TO_SELECT_FROM_LIST": {"visibility": "U", "parameters": {"IT_LIST": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}, "IV_TITLE": {"type": () => {return (() => { throw "Void type: LVC_TITLE" })();}, "is_optional": " "}, "IV_HEADER_TEXT": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_START_COLUMN": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IV_END_COLUMN": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IV_START_LINE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IV_END_LINE": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IV_STRIPED_PATTERN": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_OPTIMIZE_COL_WIDTH": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_SELECTION_MODE": {"type": () => {return (() => { throw "Void type: SALV_DE_CONSTANT" })();}, "is_optional": " "}, "IV_SELECT_COLUMN_TEXT": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IT_COLUMNS_TO_DISPLAY": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_POPUPS=>TY_ALV_COLUMN-NAME"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_POPUPS=>TY_ALV_COLUMN-TEXT"}), "length": (() => { throw "Void type: LVC_OUTLEN" })(), "show_icon": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "center": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_popups=>ty_alv_column", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_popups=>ty_alv_column_tt");}, "is_optional": " "}, "IT_PRESELECTED_ROWS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Integer({qualifiedName: "I"}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["TABLE_LINE"]},"secondary":[]}, "zif_abapgit_popups=>ty_rows");}, "is_optional": " "}, "ET_LIST": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}}},
+  "POPUP_TRANSPORT_REQUEST": {"visibility": "U", "parameters": {"RV_TRANSPORT": {"type": () => {return new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"});}, "is_optional": " "}, "IS_TRANSPORT_TYPE": {"type": () => {return new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {});}, "is_optional": " "}, "IV_USE_DEFAULT_TRANSPORT": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "POPUP_SELECT_TR_REQUESTS": {"visibility": "U", "parameters": {"RT_R_TRKORR": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"sign": new abap.types.Character(1, undefined), "option": new abap.types.Character(2, undefined), "low": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "high": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, undefined, undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_trrngtrkor_tt");}, "is_optional": " "}, "IS_SELECTION": {"type": () => {return (() => { throw "Void type: TRWBO_SELECTION" })();}, "is_optional": " "}, "IV_TITLE": {"type": () => {return (() => { throw "Void type: TRWBO_TITLE" })();}, "is_optional": " "}, "IV_USERNAME_PATTERN": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "POPUP_SELECT_WB_TC_TR_AND_TSK": {"visibility": "U", "parameters": {"RT_R_TRKORR": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"sign": new abap.types.Character(1, undefined), "option": new abap.types.Character(2, undefined), "low": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "high": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, undefined, undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_trrngtrkor_tt");}, "is_optional": " "}}},
+  "POPUP_TO_SELECT_LABELS": {"visibility": "U", "parameters": {"RV_LABELS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_LABELS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "CHOOSE_CODE_INSP_CHECK_VARIANT": {"visibility": "U", "parameters": {"RV_CHECK_VARIANT": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_POPUPS'] = zif_abapgit_popups;
+zif_abapgit_popups.zif_abapgit_popups$c_new_branch_label = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_popups.zif_abapgit_popups$c_new_branch_label.set('+ create new ...');
+zif_abapgit_popups.ty_rows = abap.types.TableFactory.construct(new abap.types.Integer({qualifiedName: "I"}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"SORTED","isUnique":true,"keyFields":["TABLE_LINE"]},"secondary":[]}, "zif_abapgit_popups=>ty_rows");
+zif_abapgit_popups.ty_popup_position = new abap.types.Structure({"start_column": new abap.types.Integer({qualifiedName: "I"}), "start_row": new abap.types.Integer({qualifiedName: "I"}), "end_column": new abap.types.Integer({qualifiedName: "I"}), "end_row": new abap.types.Integer({qualifiedName: "I"})}, "zif_abapgit_popups=>ty_popup_position", undefined, {}, {});
+zif_abapgit_popups.ty_char1 = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_popups=>ty_char1"});
+zif_abapgit_popups.ty_icon = new abap.types.Character(30, {"qualifiedName":"zif_abapgit_popups=>ty_icon"});
+export {zif_abapgit_popups};
+//# sourceMappingURL=zif_abapgit_popups.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_pr_enum_provider.intf.mjs.html b/output/zif_abapgit_pr_enum_provider.intf.mjs.html new file mode 100644 index 00000000000..daa0d41512a --- /dev/null +++ b/output/zif_abapgit_pr_enum_provider.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_pr_enum_provider.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_pr_enum_provider.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_pr_enum_provider.intf.abap
+class zif_abapgit_pr_enum_provider {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"LIST_PULL_REQUESTS": {"visibility": "U", "parameters": {"RT_PULLS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"base_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-BASE_URL"}), "number": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-NUMBER"}), "title": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-TITLE"}), "user": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-USER"}), "head_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-HEAD_URL"}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-HEAD_BRANCH"}), "created_at": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-CREATED_AT"}), "is_for_upstream": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_pr_enum_provider=>ty_pull_request", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["BASE_URL","NUMBER"]},"secondary":[]}, "zif_abapgit_pr_enum_provider=>ty_pull_requests");}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_PR_ENUM_PROVIDER'] = zif_abapgit_pr_enum_provider;zif_abapgit_pr_enum_provider.ty_pull_request = new abap.types.Structure({"base_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-BASE_URL"}), "number": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-NUMBER"}), "title": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-TITLE"}), "user": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-USER"}), "head_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-HEAD_URL"}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-HEAD_BRANCH"}), "created_at": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-CREATED_AT"}), "is_for_upstream": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_pr_enum_provider=>ty_pull_request", undefined, {}, {});
+zif_abapgit_pr_enum_provider.ty_pull_requests = abap.types.TableFactory.construct(new abap.types.Structure({"base_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-BASE_URL"}), "number": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-NUMBER"}), "title": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-TITLE"}), "user": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-USER"}), "head_url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-HEAD_URL"}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-HEAD_BRANCH"}), "created_at": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PR_ENUM_PROVIDER=>TY_PULL_REQUEST-CREATED_AT"}), "is_for_upstream": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_pr_enum_provider=>ty_pull_request", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":["BASE_URL","NUMBER"]},"secondary":[]}, "zif_abapgit_pr_enum_provider=>ty_pull_requests");
+export {zif_abapgit_pr_enum_provider};
+//# sourceMappingURL=zif_abapgit_pr_enum_provider.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_progress.intf.mjs.html b/output/zif_abapgit_progress.intf.mjs.html new file mode 100644 index 00000000000..5843958a441 --- /dev/null +++ b/output/zif_abapgit_progress.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/zif_abapgit_progress.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_progress.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_progress.intf.abap
+class zif_abapgit_progress {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"SHOW": {"visibility": "U", "parameters": {"IV_CURRENT": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}, "IV_TEXT": {"type": () => {return new abap.types.Character();}, "is_optional": " "}}},
+  "SET_TOTAL": {"visibility": "U", "parameters": {"IV_TOTAL": {"type": () => {return new abap.types.Integer({qualifiedName: "I"});}, "is_optional": " "}}},
+  "OFF": {"visibility": "U", "parameters": {}}};
+}
+abap.Classes['ZIF_ABAPGIT_PROGRESS'] = zif_abapgit_progress;
+export {zif_abapgit_progress};
+//# sourceMappingURL=zif_abapgit_progress.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_repo.intf.mjs.html b/output/zif_abapgit_repo.intf.mjs.html new file mode 100644 index 00000000000..66e44644231 --- /dev/null +++ b/output/zif_abapgit_repo.intf.mjs.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for output/zif_abapgit_repo.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_repo.intf.mjs

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_repo.intf.abap
+class zif_abapgit_repo {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"MS_DATA": {"type": () => {return new abap.types.Structure({"key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo", undefined, {}, {});}, "visibility": "U", "is_constant": " ", "is_class": " "}};
+  static METHODS = {"GET_KEY": {"visibility": "U", "parameters": {"RV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "GET_NAME": {"visibility": "U", "parameters": {"RV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "IS_OFFLINE": {"visibility": "U", "parameters": {"RV_OFFLINE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_PACKAGE": {"visibility": "U", "parameters": {"RV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}}},
+  "GET_LOCAL_SETTINGS": {"visibility": "U", "parameters": {"RS_SETTINGS": {"type": () => {return new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {});}, "is_optional": " "}}},
+  "GET_FILES_LOCAL": {"visibility": "U", "parameters": {"RT_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_definitions=>ty_file_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_files_item_tt");}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "II_OBJ_FILTER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_OBJECT_FILTER", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_OBJECT_FILTER"});}, "is_optional": " "}}},
+  "GET_FILES_REMOTE": {"visibility": "U", "parameters": {"RT_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt");}, "is_optional": " "}, "II_OBJ_FILTER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_OBJECT_FILTER", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_OBJECT_FILTER"});}, "is_optional": " "}, "IV_IGNORE_FILES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "REFRESH": {"visibility": "U", "parameters": {"IV_DROP_CACHE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_DROP_LOG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_DOT_ABAPGIT": {"visibility": "U", "parameters": {"RO_DOT_ABAPGIT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_DOT_ABAPGIT", RTTIName: "\\CLASS=ZCL_ABAPGIT_DOT_ABAPGIT"});}, "is_optional": " "}}},
+  "SET_DOT_ABAPGIT": {"visibility": "U", "parameters": {"IO_DOT_ABAPGIT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_DOT_ABAPGIT", RTTIName: "\\CLASS=ZCL_ABAPGIT_DOT_ABAPGIT"});}, "is_optional": " "}}},
+  "DESERIALIZE": {"visibility": "U", "parameters": {"IS_CHECKS": {"type": () => {return new abap.types.Structure({"overwrite": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt"), "warning_package": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt"), "requirements": new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_requirements", undefined, {}, {}), "dependencies": new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_dependencies", undefined, {}, {}), "transport": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {}), "customizing": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {})}, "zif_abapgit_definitions=>ty_deserialize_checks", undefined, {}, {});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}}},
+  "DESERIALIZE_CHECKS": {"visibility": "U", "parameters": {"RS_CHECKS": {"type": () => {return new abap.types.Structure({"overwrite": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt"), "warning_package": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"}), "state": new abap.types.Character(2, {"qualifiedName":"zif_abapgit_definitions=>ty_overwrite-state"}), "action": new abap.types.Integer({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-ACTION"}), "icon": new abap.types.Character(4, {"qualifiedName":"ICON_D","ddicName":"ICON_D"}), "text": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_OVERWRITE-TEXT"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_overwrite", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"object_type_and_name","type":"HASHED","isUnique":true,"keyFields":["OBJ_TYPE","OBJ_NAME"]}]}, "zif_abapgit_definitions=>ty_overwrite_tt"), "requirements": new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"}), "decision": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_requirements", undefined, {}, {}), "dependencies": new abap.types.Structure({"met": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_definitions=>ty_yes_no"})}, "zif_abapgit_definitions=>ty_dependencies", undefined, {}, {}), "transport": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {}), "customizing": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {})}, "zif_abapgit_definitions=>ty_deserialize_checks", undefined, {}, {});}, "is_optional": " "}}},
+  "CHECKSUMS": {"visibility": "U", "parameters": {"RI_CHECKSUMS": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO_CHECKSUMS", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO_CHECKSUMS"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_REPO'] = zif_abapgit_repo;
+export {zif_abapgit_repo};
+//# sourceMappingURL=zif_abapgit_repo.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_repo_checksums.intf.mjs.html b/output/zif_abapgit_repo_checksums.intf.mjs.html new file mode 100644 index 00000000000..4adf9f46c25 --- /dev/null +++ b/output/zif_abapgit_repo_checksums.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/zif_abapgit_repo_checksums.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_repo_checksums.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_repo_checksums.intf.abap
+class zif_abapgit_repo_checksums {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET": {"visibility": "U", "parameters": {"RT_CHECKSUMS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"})}, "zif_abapgit_definitions=>ty_item_signature", undefined, {}, {}), "files": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_tt")}, "zif_abapgit_persistence=>ty_local_checksum", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_persistence=>ty_local_checksum_tt");}, "is_optional": " "}}},
+  "GET_CHECKSUMS_PER_FILE": {"visibility": "U", "parameters": {"RT_CHECKSUMS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_tt");}, "is_optional": " "}}},
+  "REBUILD": {"visibility": "U", "parameters": {}},
+  "UPDATE": {"visibility": "U", "parameters": {"IT_UPDATED_FILES": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"})}, "zif_abapgit_git_definitions=>ty_file_signature", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_git_definitions=>ty_file_signatures_tt");}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_REPO_CHECKSUMS'] = zif_abapgit_repo_checksums;
+export {zif_abapgit_repo_checksums};
+//# sourceMappingURL=zif_abapgit_repo_checksums.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_repo_listener.intf.mjs.html b/output/zif_abapgit_repo_listener.intf.mjs.html new file mode 100644 index 00000000000..ed4ba8df6ac --- /dev/null +++ b/output/zif_abapgit_repo_listener.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_repo_listener.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_repo_listener.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_repo_listener.intf.abap
+class zif_abapgit_repo_listener {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ON_META_CHANGE": {"visibility": "U", "parameters": {"IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}, "IS_META": {"type": () => {return new abap.types.Structure({"url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"}), "selected_commit": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "created_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "created_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "deserialized_by": new abap.types.Character(12, {"qualifiedName":"SYUNAME","ddicName":"SYUNAME"}), "deserialized_at": new abap.types.Packed({length: 21, decimals: 7, qualifiedName: "TIMESTAMPL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"}), "dot_abapgit": new abap.types.Structure({"master_language": new abap.types.Character(1, {"qualifiedName":"SPRAS","ddicName":"SPRAS"}), "i18n_languages": abap.types.TableFactory.construct(new abap.types.Character(2, {"qualifiedName":"LAISO","ddicName":"LAISO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_languages"), "use_lxe": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "starting_folder": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-STARTING_FOLDER"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-FOLDER_LOGIC"}), "ignore": abap.types.TableFactory.construct(new abap.types.String({qualifiedName: "STRING"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit-ignore"), "requirements": abap.types.TableFactory.construct(new abap.types.Structure({"component": new abap.types.Character(30, {}), "min_release": new abap.types.Character(10, {"qualifiedName":"SAPRELEASE","ddicName":"SAPRELEASE"}), "min_patch": new abap.types.Character(10, {"qualifiedName":"SAPPATCHLV","ddicName":"SAPPATCHLV"})}, "zif_abapgit_dot_abapgit=>ty_requirement", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_dot_abapgit=>ty_requirement_tt"), "version_constant": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-VERSION_CONSTANT"}), "abap_language_version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DOT_ABAPGIT=>TY_DOT_ABAPGIT-ABAP_LANGUAGE_VERSION"})}, "zif_abapgit_dot_abapgit=>ty_dot_abapgit", undefined, {}, {}), "head_branch": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-HEAD_BRANCH"}), "local_settings": new abap.types.Structure({"display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-DISPLAY_NAME"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "write_protected": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "only_local_objects": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "code_inspector_check_variant": new abap.types.Character(30, {"qualifiedName":"SCI_CHKV","ddicName":"SCI_CHKV"}), "block_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_language_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_LOCAL_SETTINGS-LABELS"}), "transport_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "customizing_request": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"})}, "zif_abapgit_persistence=>ty_local_settings", undefined, {}, {})}, "zif_abapgit_persistence=>ty_repo_xml", undefined, {}, {});}, "is_optional": " "}, "IS_CHANGE_MASK": {"type": () => {return new abap.types.Structure({"url": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "branch_name": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "selected_commit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "package": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "created_by": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "created_at": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "deserialized_by": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "deserialized_at": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "offline": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "switched_origin": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "dot_abapgit": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "head_branch": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "local_settings": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_persistence=>ty_repo_meta_mask", undefined, {}, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_REPO_LISTENER'] = zif_abapgit_repo_listener;
+export {zif_abapgit_repo_listener};
+//# sourceMappingURL=zif_abapgit_repo_listener.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_repo_online.intf.mjs.html b/output/zif_abapgit_repo_online.intf.mjs.html new file mode 100644 index 00000000000..ec4ccce7536 --- /dev/null +++ b/output/zif_abapgit_repo_online.intf.mjs.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for output/zif_abapgit_repo_online.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_repo_online.intf.mjs

+
+ +
+ 100% + Statements + 20/20 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +201x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_repo_online.intf.abap
+class zif_abapgit_repo_online {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_URL": {"visibility": "U", "parameters": {"RV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}}},
+  "GET_SELECTED_BRANCH": {"visibility": "U", "parameters": {"RV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"});}, "is_optional": " "}}},
+  "SET_URL": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}}},
+  "SELECT_BRANCH": {"visibility": "U", "parameters": {"IV_BRANCH_NAME": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"});}, "is_optional": " "}}},
+  "GET_SELECTED_COMMIT": {"visibility": "U", "parameters": {"RV_SELECTED_COMMIT": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"});}, "is_optional": " "}}},
+  "GET_CURRENT_REMOTE": {"visibility": "U", "parameters": {"RV_SHA1": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"});}, "is_optional": " "}}},
+  "SELECT_COMMIT": {"visibility": "U", "parameters": {"IV_SELECTED_COMMIT": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"});}, "is_optional": " "}}},
+  "SWITCH_ORIGIN": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-URL"});}, "is_optional": " "}, "IV_BRANCH": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-BRANCH_NAME"});}, "is_optional": " "}, "IV_OVERWRITE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_SWITCHED_ORIGIN": {"visibility": "U", "parameters": {"RV_SWITCHED_ORIGIN": {"type": () => {return new abap.types.String({qualifiedName: "ZIF_ABAPGIT_PERSISTENCE=>TY_REPO_XML-SWITCHED_ORIGIN"});}, "is_optional": " "}}},
+  "PUSH": {"visibility": "U", "parameters": {"IS_COMMENT": {"type": () => {return new abap.types.Structure({"committer": new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-NAME"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-EMAIL"})}, "zif_abapgit_git_definitions=>ty_git_user", undefined, {}, {}), "author": new abap.types.Structure({"name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-NAME"}), "email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_GIT_USER-EMAIL"})}, "zif_abapgit_git_definitions=>ty_git_user", undefined, {}, {}), "comment": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_COMMENT-COMMENT"})}, "zif_abapgit_git_definitions=>ty_comment", undefined, {}, {});}, "is_optional": " "}, "IO_STAGE": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_STAGE", RTTIName: "\\CLASS=ZCL_ABAPGIT_STAGE"});}, "is_optional": " "}}},
+  "CREATE_BRANCH": {"visibility": "U", "parameters": {"IV_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_FROM": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"});}, "is_optional": " "}}},
+  "CHECK_FOR_VALID_BRANCH": {"visibility": "U", "parameters": {}}};
+}
+abap.Classes['ZIF_ABAPGIT_REPO_ONLINE'] = zif_abapgit_repo_online;
+export {zif_abapgit_repo_online};
+//# sourceMappingURL=zif_abapgit_repo_online.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_repo_srv.intf.mjs.html b/output/zif_abapgit_repo_srv.intf.mjs.html new file mode 100644 index 00000000000..851a7c33bff --- /dev/null +++ b/output/zif_abapgit_repo_srv.intf.mjs.html @@ -0,0 +1,154 @@ + + + + + + Code coverage report for output/zif_abapgit_repo_srv.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_repo_srv.intf.mjs

+
+ +
+ 100% + Statements + 24/24 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 24/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +241x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_repo_srv.intf.abap
+class zif_abapgit_repo_srv {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"INIT": {"visibility": "U", "parameters": {}},
+  "DELETE": {"visibility": "U", "parameters": {"II_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"});}, "is_optional": " "}}},
+  "GET": {"visibility": "U", "parameters": {"RI_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"});}, "is_optional": " "}, "IV_KEY": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"});}, "is_optional": " "}}},
+  "IS_REPO_INSTALLED": {"visibility": "U", "parameters": {"RV_INSTALLED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_TARGET_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}}},
+  "LIST": {"visibility": "U", "parameters": {"RT_LIST": {"type": () => {return abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_repo_srv=>ty_repo_list");}, "is_optional": " "}}},
+  "LIST_FAVORITES": {"visibility": "U", "parameters": {"RT_LIST": {"type": () => {return abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_repo_srv=>ty_repo_list");}, "is_optional": " "}}},
+  "NEW_OFFLINE": {"visibility": "U", "parameters": {"RI_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_FOLDER_LOGIC": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_LABELS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_IGN_SUBPKG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_MAIN_LANG_ONLY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "NEW_ONLINE": {"visibility": "U", "parameters": {"RI_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"});}, "is_optional": " "}, "IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_BRANCH_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_DISPLAY_NAME": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_FOLDER_LOGIC": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_LABELS": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_IGN_SUBPKG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_MAIN_LANG_ONLY": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "PURGE": {"visibility": "U", "parameters": {"RI_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}, "II_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"});}, "is_optional": " "}, "IS_CHECKS": {"type": () => {return new abap.types.Structure({"transport": new abap.types.Structure({"required": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "transport": new abap.types.Character(20, {"qualifiedName":"TRKORR","ddicName":"TRKORR"}), "type": new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {})}, "zif_abapgit_definitions=>ty_transport", undefined, {}, {})}, "zif_abapgit_definitions=>ty_delete_checks", undefined, {}, {});}, "is_optional": " "}}},
+  "VALIDATE_PACKAGE": {"visibility": "U", "parameters": {"IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_IGN_SUBPKG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_CHK_EXISTS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "VALIDATE_URL": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_CHK_EXISTS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_REPO_FROM_PACKAGE": {"visibility": "U", "parameters": {"IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_IGN_SUBPKG": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "EI_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"});}, "is_optional": " "}, "EV_REASON": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_REPO_FROM_URL": {"visibility": "U", "parameters": {"IV_URL": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "EI_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"});}, "is_optional": " "}, "EV_REASON": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "GET_LABEL_LIST": {"visibility": "U", "parameters": {"RT_LABELS": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_REPO_SRV=>TY_LABEL-LABEL"})}, "zif_abapgit_repo_srv=>ty_label", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"key_label","type":"SORTED","isUnique":false,"keyFields":["LABEL"]}]}, "zif_abapgit_repo_srv=>ty_labels");}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_REPO_SRV'] = zif_abapgit_repo_srv;zif_abapgit_repo_srv.ty_repo_list = abap.types.TableFactory.construct(new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_REPO", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_REPO"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_repo_srv=>ty_repo_list");
+zif_abapgit_repo_srv.ty_label = new abap.types.Structure({"label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_REPO_SRV=>TY_LABEL-LABEL"})}, "zif_abapgit_repo_srv=>ty_label", undefined, {}, {});
+zif_abapgit_repo_srv.ty_labels = abap.types.TableFactory.construct(new abap.types.Structure({"label": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_REPO_SRV=>TY_LABEL-LABEL"})}, "zif_abapgit_repo_srv=>ty_label", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"key_label","type":"SORTED","isUnique":false,"keyFields":["LABEL"]}]}, "zif_abapgit_repo_srv=>ty_labels");
+export {zif_abapgit_repo_srv};
+//# sourceMappingURL=zif_abapgit_repo_srv.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_sap_namespace.intf.mjs.html b/output/zif_abapgit_sap_namespace.intf.mjs.html new file mode 100644 index 00000000000..da7c2778808 --- /dev/null +++ b/output/zif_abapgit_sap_namespace.intf.mjs.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for output/zif_abapgit_sap_namespace.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_sap_namespace.intf.mjs

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_sap_namespace.intf.abap
+class zif_abapgit_sap_namespace {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"EXISTS": {"visibility": "U", "parameters": {"RV_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_NAMESPACE": {"type": () => {return new abap.types.Character(10, {});}, "is_optional": " "}}},
+  "IS_EDITABLE": {"visibility": "U", "parameters": {"RV_YES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_NAMESPACE": {"type": () => {return new abap.types.Character(10, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_SAP_NAMESPACE'] = zif_abapgit_sap_namespace;
+export {zif_abapgit_sap_namespace};
+//# sourceMappingURL=zif_abapgit_sap_namespace.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_sap_package.intf.mjs.html b/output/zif_abapgit_sap_package.intf.mjs.html new file mode 100644 index 00000000000..01b960894a9 --- /dev/null +++ b/output/zif_abapgit_sap_package.intf.mjs.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for output/zif_abapgit_sap_package.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_sap_package.intf.mjs

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +211x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_sap_package.intf.abap
+class zif_abapgit_sap_package {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"VALIDATE_NAME": {"visibility": "U", "parameters": {}},
+  "CREATE": {"visibility": "U", "parameters": {"IS_PACKAGE": {"type": () => {return new abap.types.Structure({"devclass": new abap.types.Character(30, {}), "dlvunit": new abap.types.Character(30, {}), "component": new abap.types.Character(20, {}), "ctext": new abap.types.Character(60, {}), "parentcl": new abap.types.Character(30, {}), "pdevclass": new abap.types.Character(4, {}), "as4user": new abap.types.Character(12, {}), "comp_posid": new abap.types.Character(24, {}), "mainpack": new abap.types.Character(1, {}), "created_by": new abap.types.Character(12, {}), "created_on": new abap.types.Date(), "changed_by": new abap.types.Character(12, {}), "changed_on": new abap.types.Date(), "dlvu_text": new abap.types.Character(80, {}), "layer_text": new abap.types.Character(60, {}), "intfprefx": new abap.types.Character(6, {}), "cli_check": new abap.types.Character(1, {}), "namespace": new abap.types.Character(10, {}), "tpclass": new abap.types.Character(1, {}), "korrflag": new abap.types.Character(1, {}), "comp_text": new abap.types.Character(60, {})}, "SCOMPKDTLN", "SCOMPKDTLN", {}, {});}, "is_optional": " "}}},
+  "CREATE_LOCAL": {"visibility": "U", "parameters": {}},
+  "LIST_SUBPACKAGES": {"visibility": "U", "parameters": {"RT_LIST": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_sap_package=>ty_devclass_tt");}, "is_optional": " "}}},
+  "LIST_SUPERPACKAGES": {"visibility": "U", "parameters": {"RT_LIST": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_sap_package=>ty_devclass_tt");}, "is_optional": " "}}},
+  "READ_PARENT": {"visibility": "U", "parameters": {"RV_PARENTCL": {"type": () => {return new abap.types.Character(30, {});}, "is_optional": " "}}},
+  "READ_DESCRIPTION": {"visibility": "U", "parameters": {"RV_DESCRIPTION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}}},
+  "READ_RESPONSIBLE": {"visibility": "U", "parameters": {"RV_RESPONSIBLE": {"type": () => {return new abap.types.Character(12, {"qualifiedName":"USNAM","ddicName":"USNAM"});}, "is_optional": " "}}},
+  "CREATE_CHILD": {"visibility": "U", "parameters": {"IV_CHILD": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}}},
+  "EXISTS": {"visibility": "U", "parameters": {"RV_BOOL": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "ARE_CHANGES_RECORDED_IN_TR_REQ": {"visibility": "U", "parameters": {"RV_ARE_CHANGES_REC_IN_TR_REQ": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}}},
+  "GET_TRANSPORT_TYPE": {"visibility": "U", "parameters": {"RS_TRANSPORT_TYPE": {"type": () => {return new abap.types.Structure({"request": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"}), "task": new abap.types.Character(1, {"qualifiedName":"TRFUNCTION","ddicName":"TRFUNCTION"})}, "zif_abapgit_definitions=>ty_transport_type", undefined, {}, {});}, "is_optional": " "}}},
+  "GET_TRANSPORT_LAYER": {"visibility": "U", "parameters": {"RV_TRANSPORT_LAYER": {"type": () => {return (() => { throw "Void type: DEVLAYER" })();}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_SAP_PACKAGE'] = zif_abapgit_sap_package;zif_abapgit_sap_package.ty_devclass_tt = abap.types.TableFactory.construct(new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_sap_package=>ty_devclass_tt");
+export {zif_abapgit_sap_package};
+//# sourceMappingURL=zif_abapgit_sap_package.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_sap_report.intf.mjs.html b/output/zif_abapgit_sap_report.intf.mjs.html new file mode 100644 index 00000000000..25e671da7d5 --- /dev/null +++ b/output/zif_abapgit_sap_report.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/zif_abapgit_sap_report.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_sap_report.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_sap_report.intf.abap
+class zif_abapgit_sap_report {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"READ_REPORT": {"visibility": "U", "parameters": {"RT_SOURCE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"line": new abap.types.Character(255, {"qualifiedName":"TEXT255","ddicName":"TEXT255"})}, "ABAPTXT255", "ABAPTXT255", {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"isUnique":false,"type":"STANDARD","keyFields":[],"name":"primary_key"},"secondary":[]}, "ABAPTXT255_TAB");}, "is_optional": " "}, "IV_NAME": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"SYREPID","ddicName":"SYREPID"});}, "is_optional": " "}, "IV_STATE": {"type": () => {return (() => { throw "Void type: R3STATE" })();}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "INSERT_REPORT": {"visibility": "U", "parameters": {"IV_NAME": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"SYREPID","ddicName":"SYREPID"});}, "is_optional": " "}, "IT_SOURCE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}, "IV_STATE": {"type": () => {return (() => { throw "Void type: R3STATE" })();}, "is_optional": " "}, "IV_PROGRAM_TYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_EXTENSION_TYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_VERSION": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_sap_report=>ty_abap_language_version"});}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "UPDATE_REPORT": {"visibility": "U", "parameters": {"RV_UPDATED": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_NAME": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"SYREPID","ddicName":"SYREPID"});}, "is_optional": " "}, "IT_SOURCE": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Character(4), {"withHeader":false,"keyType":"DEFAULT"});}, "is_optional": " "}, "IV_STATE": {"type": () => {return (() => { throw "Void type: R3STATE" })();}, "is_optional": " "}, "IV_PROGRAM_TYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_EXTENSION_TYPE": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"});}, "is_optional": " "}, "IV_VERSION": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_sap_report=>ty_abap_language_version"});}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}},
+  "DELETE_REPORT": {"visibility": "U", "parameters": {"IV_NAME": {"type": () => {return new abap.types.Character(40, {"qualifiedName":"SYREPID","ddicName":"SYREPID"});}, "is_optional": " "}, "IV_RAISE_ERROR": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_VERSION": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"zif_abapgit_sap_report=>ty_abap_language_version"});}, "is_optional": " "}, "IS_ITEM": {"type": () => {return new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_SAP_REPORT'] = zif_abapgit_sap_report;zif_abapgit_sap_report.ty_abap_language_version = new abap.types.Character(1, {"qualifiedName":"zif_abapgit_sap_report=>ty_abap_language_version"});
+export {zif_abapgit_sap_report};
+//# sourceMappingURL=zif_abapgit_sap_report.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_services_git.intf.mjs.html b/output/zif_abapgit_services_git.intf.mjs.html new file mode 100644 index 00000000000..87c7a475ade --- /dev/null +++ b/output/zif_abapgit_services_git.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_services_git.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_services_git.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_services_git.intf.abap
+class zif_abapgit_services_git {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_SERVICES_GIT'] = zif_abapgit_services_git;zif_abapgit_services_git.ty_commit_fields = new abap.types.Structure({"repo_key": new abap.types.Character(12, {"qualifiedName":"zif_abapgit_persistence=>ty_value"}), "committer_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_GIT=>TY_COMMIT_FIELDS-COMMITTER_NAME"}), "committer_email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_GIT=>TY_COMMIT_FIELDS-COMMITTER_EMAIL"}), "author_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_GIT=>TY_COMMIT_FIELDS-AUTHOR_NAME"}), "author_email": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_GIT=>TY_COMMIT_FIELDS-AUTHOR_EMAIL"}), "comment": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_GIT=>TY_COMMIT_FIELDS-COMMENT"}), "body": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_GIT=>TY_COMMIT_FIELDS-BODY"})}, "zif_abapgit_services_git=>ty_commit_fields", undefined, {}, {});
+export {zif_abapgit_services_git};
+//# sourceMappingURL=zif_abapgit_services_git.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_services_repo.intf.mjs.html b/output/zif_abapgit_services_repo.intf.mjs.html new file mode 100644 index 00000000000..b433c7974f6 --- /dev/null +++ b/output/zif_abapgit_services_repo.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_services_repo.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_services_repo.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_services_repo.intf.abap
+class zif_abapgit_services_repo {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_SERVICES_REPO'] = zif_abapgit_services_repo;zif_abapgit_services_repo.ty_repo_params = new abap.types.Structure({"url": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_REPO=>TY_REPO_PARAMS-URL"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "branch_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_REPO=>TY_REPO_PARAMS-BRANCH_NAME"}), "display_name": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_REPO=>TY_REPO_PARAMS-DISPLAY_NAME"}), "folder_logic": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_REPO=>TY_REPO_PARAMS-FOLDER_LOGIC"}), "labels": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_SERVICES_REPO=>TY_REPO_PARAMS-LABELS"}), "ignore_subpackages": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "main_lang_only": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"})}, "zif_abapgit_services_repo=>ty_repo_params", undefined, {}, {});
+export {zif_abapgit_services_repo};
+//# sourceMappingURL=zif_abapgit_services_repo.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_stage_logic.intf.mjs.html b/output/zif_abapgit_stage_logic.intf.mjs.html new file mode 100644 index 00000000000..85f97b217fd --- /dev/null +++ b/output/zif_abapgit_stage_logic.intf.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zif_abapgit_stage_logic.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_stage_logic.intf.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_stage_logic.intf.abap
+class zif_abapgit_stage_logic {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET": {"visibility": "U", "parameters": {"RS_FILES": {"type": () => {return new abap.types.Structure({"local": abap.types.TableFactory.construct(new abap.types.Structure({"file": new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), "item": new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "abap_language_version": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_aff_types_v1=>ty_abap_language_version"})}, "zif_abapgit_definitions=>ty_item", undefined, {}, {})}, "zif_abapgit_definitions=>ty_file_item", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_files_item_tt"), "remote": abap.types.TableFactory.construct(new abap.types.Structure({"path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE_SIGNATURE-FILENAME"}), "sha1": new abap.types.Character(40, {"qualifiedName":"zif_abapgit_git_definitions=>ty_sha1"}), "data": new abap.types.XString({qualifiedName: "ZIF_ABAPGIT_GIT_DEFINITIONS=>TY_FILE-DATA"})}, "zif_abapgit_git_definitions=>ty_file", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[{"name":"file_path","type":"SORTED","isUnique":true,"keyFields":["PATH","FILENAME"]},{"name":"file","type":"SORTED","isUnique":false,"keyFields":["FILENAME"]}]}, "zif_abapgit_git_definitions=>ty_files_tt"), "status": abap.types.TableFactory.construct(new abap.types.Structure({"obj_type": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "inactive": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-PATH"}), "filename": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_RESULT-FILENAME"}), "package": new abap.types.Character(30, {"qualifiedName":"DEVCLASS","ddicName":"DEVCLASS"}), "match": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "lstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "rstate": new abap.types.Character(1, {"qualifiedName":"zif_abapgit_git_definitions=>ty_item_state"}), "packmove": new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"}), "srcsystem": new abap.types.Character(5, {}), "origlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_result", undefined, {}, {}), {"withHeader":false,"keyType":"USER","primaryKey":{"name":"primary_key","type":"HASHED","isUnique":true,"keyFields":["PATH","FILENAME"]},"secondary":[]}, "zif_abapgit_definitions=>ty_results_ts_path")}, "zif_abapgit_definitions=>ty_stage_files", undefined, {}, {});}, "is_optional": " "}, "IO_REPO": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_REPO_ONLINE", RTTIName: "\\CLASS=ZCL_ABAPGIT_REPO_ONLINE"});}, "is_optional": " "}, "II_OBJ_FILTER": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_OBJECT_FILTER", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_OBJECT_FILTER"});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_STAGE_LOGIC'] = zif_abapgit_stage_logic;
+export {zif_abapgit_stage_logic};
+//# sourceMappingURL=zif_abapgit_stage_logic.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_tadir.intf.mjs.html b/output/zif_abapgit_tadir.intf.mjs.html new file mode 100644 index 00000000000..7501a6f68c9 --- /dev/null +++ b/output/zif_abapgit_tadir.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/zif_abapgit_tadir.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_tadir.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_tadir.intf.abap
+class zif_abapgit_tadir {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"GET_OBJECT_PACKAGE": {"visibility": "U", "parameters": {"RV_DEVCLASS": {"type": () => {return new abap.types.Character(30, {});}, "is_optional": " "}, "IV_PGMID": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJECT": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJ_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}}},
+  "READ": {"visibility": "U", "parameters": {"RT_TADIR": {"type": () => {return abap.types.TableFactory.construct(new abap.types.Structure({"pgmid": new abap.types.Character(4, {}), "object": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {}), "korrnum": new abap.types.Character(10, {}), "delflag": new abap.types.Character(1, {}), "genflag": new abap.types.Character(1, {}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TADIR-PATH"}), "srcsystem": new abap.types.Character(5, {}), "masterlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_tadir", undefined, {}, {}), {"withHeader":false,"keyType":"DEFAULT","primaryKey":{"name":"primary_key","type":"STANDARD","isUnique":false,"keyFields":[]},"secondary":[]}, "zif_abapgit_definitions=>ty_tadir_tt");}, "is_optional": " "}, "IV_PACKAGE": {"type": () => {return new abap.types.Character(30, {});}, "is_optional": " "}, "IV_IGNORE_SUBPACKAGES": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IV_ONLY_LOCAL_OBJECTS": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IO_DOT": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZCL_ABAPGIT_DOT_ABAPGIT", RTTIName: "\\CLASS=ZCL_ABAPGIT_DOT_ABAPGIT"});}, "is_optional": " "}, "II_LOG": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "ZIF_ABAPGIT_LOG", RTTIName: "\\INTERFACE=ZIF_ABAPGIT_LOG"});}, "is_optional": " "}}},
+  "READ_SINGLE": {"visibility": "U", "parameters": {"RS_TADIR": {"type": () => {return new abap.types.Structure({"pgmid": new abap.types.Character(4, {}), "object": new abap.types.Character(4, {}), "obj_name": new abap.types.Character(40, {}), "devclass": new abap.types.Character(30, {}), "korrnum": new abap.types.Character(10, {}), "delflag": new abap.types.Character(1, {}), "genflag": new abap.types.Character(1, {}), "path": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_TADIR-PATH"}), "srcsystem": new abap.types.Character(5, {}), "masterlang": new abap.types.Character(1, {})}, "zif_abapgit_definitions=>ty_tadir", undefined, {}, {});}, "is_optional": " "}, "IV_PGMID": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJECT": {"type": () => {return new abap.types.Character(4, {});}, "is_optional": " "}, "IV_OBJ_NAME": {"type": () => {return new abap.types.Character(40, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_TADIR'] = zif_abapgit_tadir;
+export {zif_abapgit_tadir};
+//# sourceMappingURL=zif_abapgit_tadir.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_version.intf.mjs.html b/output/zif_abapgit_version.intf.mjs.html new file mode 100644 index 00000000000..50338001fcc --- /dev/null +++ b/output/zif_abapgit_version.intf.mjs.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for output/zif_abapgit_version.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_version.intf.mjs

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_version.intf.abap
+class zif_abapgit_version {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {"C_XML_VERSION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"},
+  "C_ABAP_VERSION": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "visibility": "U", "is_constant": "X", "is_class": "X"}};
+  static METHODS = {};
+}
+abap.Classes['ZIF_ABAPGIT_VERSION'] = zif_abapgit_version;
+zif_abapgit_version.zif_abapgit_version$c_xml_version = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_version.zif_abapgit_version$c_xml_version.set('v1.0.0');
+zif_abapgit_version.zif_abapgit_version$c_abap_version = new abap.types.String({qualifiedName: "STRING"});
+zif_abapgit_version.zif_abapgit_version$c_abap_version.set('1.124.0');
+export {zif_abapgit_version};
+//# sourceMappingURL=zif_abapgit_version.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_xml_input.intf.mjs.html b/output/zif_abapgit_xml_input.intf.mjs.html new file mode 100644 index 00000000000..384c75f2fef --- /dev/null +++ b/output/zif_abapgit_xml_input.intf.mjs.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for output/zif_abapgit_xml_input.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_xml_input.intf.mjs

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_xml_input.intf.abap
+class zif_abapgit_xml_input {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"READ": {"visibility": "U", "parameters": {"IV_NAME": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "CG_DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "GET_RAW": {"visibility": "U", "parameters": {"RI_RAW": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_DOCUMENT", RTTIName: "\\INTERFACE=IF_IXML_DOCUMENT"});}, "is_optional": " "}}},
+  "GET_METADATA": {"visibility": "U", "parameters": {"RS_METADATA": {"type": () => {return new abap.types.Structure({"class_": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA-CLASS_"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA-VERSION"})}, "zif_abapgit_definitions=>ty_metadata", undefined, {}, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_XML_INPUT'] = zif_abapgit_xml_input;
+export {zif_abapgit_xml_input};
+//# sourceMappingURL=zif_abapgit_xml_input.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zif_abapgit_xml_output.intf.mjs.html b/output/zif_abapgit_xml_output.intf.mjs.html new file mode 100644 index 00000000000..fa746101ca9 --- /dev/null +++ b/output/zif_abapgit_xml_output.intf.mjs.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for output/zif_abapgit_xml_output.intf.mjs + + + + + + + + + +
+
+

All files / output zif_abapgit_xml_output.intf.mjs

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
// zif_abapgit_xml_output.intf.abap
+class zif_abapgit_xml_output {
+  static INTERNAL_TYPE = 'INTF';
+  static ATTRIBUTES = {};
+  static METHODS = {"ADD": {"visibility": "U", "parameters": {"IV_NAME": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "IG_DATA": {"type": () => {return new abap.types.Character(4);}, "is_optional": " "}}},
+  "SET_RAW": {"visibility": "U", "parameters": {"II_RAW": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}}},
+  "ADD_XML": {"visibility": "U", "parameters": {"IV_NAME": {"type": () => {return new abap.types.Character();}, "is_optional": " "}, "II_XML": {"type": () => {return new abap.types.ABAPObject({qualifiedName: "IF_IXML_ELEMENT", RTTIName: "\\INTERFACE=IF_IXML_ELEMENT"});}, "is_optional": " "}}},
+  "RENDER": {"visibility": "U", "parameters": {"RV_XML": {"type": () => {return new abap.types.String({qualifiedName: "STRING"});}, "is_optional": " "}, "IV_NORMALIZE": {"type": () => {return new abap.types.Character(1, {"qualifiedName":"ABAP_BOOL","ddicName":"ABAP_BOOL"});}, "is_optional": " "}, "IS_METADATA": {"type": () => {return new abap.types.Structure({"class_": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA-CLASS_"}), "version": new abap.types.String({qualifiedName: "ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA-VERSION"})}, "zif_abapgit_definitions=>ty_metadata", undefined, {}, {});}, "is_optional": " "}}}};
+}
+abap.Classes['ZIF_ABAPGIT_XML_OUTPUT'] = zif_abapgit_xml_output;
+export {zif_abapgit_xml_output};
+//# sourceMappingURL=zif_abapgit_xml_output.intf.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zw3mi.fugr.wwwdata_export.mjs.html b/output/zw3mi.fugr.wwwdata_export.mjs.html new file mode 100644 index 00000000000..26fadd415ef --- /dev/null +++ b/output/zw3mi.fugr.wwwdata_export.mjs.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for output/zw3mi.fugr.wwwdata_export.mjs + + + + + + + + + +
+
+

All files / output zw3mi.fugr.wwwdata_export.mjs

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// zw3mi.fugr.wwwdata_export.abap
+async function wwwdata_export(INPUT) {
+  // importing KEY WWWDATATAB false
+  let key = INPUT.exporting?.key;
+  // tables MIME W3MIME true
+  let mime = INPUT.tables?.mime;
+  if (mime === undefined) {
+      mime = abap.types.TableFactory.construct(new abap.types.Structure({"line": new abap.types.Hex({length: 255})}, "W3MIME", "W3MIME", {}, {}), {"withHeader":true,"keyType":"DEFAULT"});
+  }
+  abap.statements.assert(abap.compare.eq(new abap.types.Integer().set(1), new abap.types.Character(4).set('todo')));
+}
+abap.FunctionModules['WWWDATA_EXPORT'] = wwwdata_export;
+//# sourceMappingURL=zw3mi.fugr.wwwdata_export.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zw3mi.fugr.wwwdata_import.mjs.html b/output/zw3mi.fugr.wwwdata_import.mjs.html new file mode 100644 index 00000000000..64214a4e5fa --- /dev/null +++ b/output/zw3mi.fugr.wwwdata_import.mjs.html @@ -0,0 +1,199 @@ + + + + + + Code coverage report for output/zw3mi.fugr.wwwdata_import.mjs + + + + + + + + + +
+
+

All files / output zw3mi.fugr.wwwdata_import.mjs

+
+ +
+ 100% + Statements + 39/39 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 39/39 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +391x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// zw3mi.fugr.wwwdata_import.abap
+async function wwwdata_import(INPUT) {
+  // importing KEY WWWDATATAB false
+  let key = INPUT.exporting?.key;
+  // tables MIME W3MIME true
+  let mime = INPUT.tables?.mime;
+  if (mime === undefined) {
+      mime = abap.types.TableFactory.construct(new abap.types.Structure({"line": new abap.types.Hex({length: 255})}, "W3MIME", "W3MIME", {}, {}), {"withHeader":true,"keyType":"DEFAULT"});
+  }
+  let filename = new abap.types.String({qualifiedName: "STRING"});
+  let xstr = new abap.types.XString({qualifiedName: "XSTRING"});
+  let row = new abap.types.Structure({"line": new abap.types.Hex({length: 255})}, "W3MIME", "W3MIME", {}, {});
+  let len = new abap.types.Integer({qualifiedName: "I"});
+  abap.statements.clear(mime);
+  filename.set(abap.W3MI[key.get().objid.get().trimEnd()].filename);
+  const fs = await import("fs");
+  const path = await import("path");
+  const url = await import("url");
+  const __filename = url.fileURLToPath(import.meta.url);
+  const __dirname = path.dirname(__filename);
+  xstr.set(fs.readFileSync(__dirname + path.sep + filename.get()).toString("hex").toUpperCase());
+  const indexBackup1 = abap.builtin.sy.get().index.get();
+  let unique1073 = 1;
+  while (abap.compare.gt(abap.builtin.xstrlen({val: xstr}), new abap.types.Integer().set(0))) {
+    abap.builtin.sy.get().index.set(unique1073++);
+    len.set(new abap.types.Integer().set(255));
+    if (abap.compare.lt(abap.builtin.xstrlen({val: xstr}), len)) {
+      len.set(abap.builtin.xstrlen({val: xstr}));
+    }
+    row.get().line.set(xstr.getOffset({length: len}));
+    abap.statements.append({source: row, target: mime});
+    xstr.set(xstr.getOffset({offset: len}));
+  }
+  abap.builtin.sy.get().index.set(indexBackup1);
+  abap.builtin.sy.get().subrc.set(new abap.types.Integer().set(0));
+}
+abap.FunctionModules['WWWDATA_IMPORT'] = wwwdata_import;
+//# sourceMappingURL=zw3mi.fugr.wwwdata_import.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zw3mi.fugr.wwwparams_insert.mjs.html b/output/zw3mi.fugr.wwwparams_insert.mjs.html new file mode 100644 index 00000000000..c0301e155d7 --- /dev/null +++ b/output/zw3mi.fugr.wwwparams_insert.mjs.html @@ -0,0 +1,109 @@ + + + + + + Code coverage report for output/zw3mi.fugr.wwwparams_insert.mjs + + + + + + + + + +
+
+

All files / output zw3mi.fugr.wwwparams_insert.mjs

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +91x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// zw3mi.fugr.wwwparams_insert.abap
+async function wwwparams_insert(INPUT) {
+  // importing PARAMS WWWPARAMS false
+  let params = INPUT.exporting?.params;
+  abap.statements.assert(abap.compare.eq(new abap.types.Integer().set(1), new abap.types.Character(4).set('todo')));
+}
+abap.FunctionModules['WWWPARAMS_INSERT'] = wwwparams_insert;
+//# sourceMappingURL=zw3mi.fugr.wwwparams_insert.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/output/zw3mi.fugr.wwwparams_read.mjs.html b/output/zw3mi.fugr.wwwparams_read.mjs.html new file mode 100644 index 00000000000..469d6db3d4f --- /dev/null +++ b/output/zw3mi.fugr.wwwparams_read.mjs.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for output/zw3mi.fugr.wwwparams_read.mjs + + + + + + + + + +
+
+

All files / output zw3mi.fugr.wwwparams_read.mjs

+
+ +
+ 100% + Statements + 34/34 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 34/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +341x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x
const {cx_root} = await import("./cx_root.clas.mjs");
+// zw3mi.fugr.wwwparams_read.abap
+async function wwwparams_read(INPUT) {
+  // importing RELID WWWPARAMS-RELID false
+  let relid = INPUT.exporting?.relid;
+  // importing OBJID WWWPARAMS-OBJID false
+  let objid = INPUT.exporting?.objid;
+  // importing NAME C false
+  let name = INPUT.exporting?.name;
+  // exporting VALUE C true
+  let value = INPUT.importing?.value;
+  if (value === undefined) {
+      value = new abap.types.Character(1, {});
+  }
+  let filename = new abap.types.String({qualifiedName: "STRING"});
+  let filesize = new abap.types.Integer({qualifiedName: "I"});
+  filename.set(abap.W3MI[objid.get().trimEnd()].filename);
+  const fs = await import("fs");
+  const path = await import("path");
+  const url = await import("url");
+  const __filename = url.fileURLToPath(import.meta.url);
+  const __dirname = path.dirname(__filename);
+  const buf = fs.readFileSync(__dirname + path.sep + filename.get());
+  if (abap.compare.eq(name, new abap.types.Character(8).set('filesize'))) {
+    filesize.set(buf.length);
+    value.set(filesize);
+    abap.statements.condense(value, {nogaps: false});
+  } else {
+    abap.statements.assert(abap.compare.eq(new abap.types.Integer().set(1), new abap.types.Character(4).set('todo')));
+  }
+  abap.builtin.sy.get().subrc.set(new abap.types.Integer().set(0));
+}
+abap.FunctionModules['WWWPARAMS_READ'] = wwwparams_read;
+//# sourceMappingURL=zw3mi.fugr.wwwparams_read.mjs.map
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/prettify.css b/prettify.css new file mode 100644 index 00000000000..b317a7cda31 --- /dev/null +++ b/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/prettify.js b/prettify.js new file mode 100644 index 00000000000..b3225238f26 --- /dev/null +++ b/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/sort-arrow-sprite.png b/sort-arrow-sprite.png new file mode 100644 index 00000000000..6ed68316eb3 Binary files /dev/null and b/sort-arrow-sprite.png differ diff --git a/sorter.js b/sorter.js new file mode 100644 index 00000000000..2bb296a8ca8 --- /dev/null +++ b/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/src/apack/index.html b/src/apack/index.html new file mode 100644 index 00000000000..ffff5b768ef --- /dev/null +++ b/src/apack/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/apack + + + + + + + + + +
+
+

All files src/apack

+
+ +
+ 75.98% + Statements + 212/279 +
+ + +
+ 71.42% + Branches + 5/7 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 75.98% + Lines + 212/279 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_apack_reader.clas.abap +
+
71.24%166/23350%2/466.66%2/371.24%166/233
zcl_abapgit_apack_reader.clas.testclasses.abap +
+
100%46/46100%3/3100%3/3100%46/46
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/apack/zcl_abapgit_apack_reader.clas.abap.html b/src/apack/zcl_abapgit_apack_reader.clas.abap.html new file mode 100644 index 00000000000..ef54624b48c --- /dev/null +++ b/src/apack/zcl_abapgit_apack_reader.clas.abap.html @@ -0,0 +1,784 @@ + + + + + + Code coverage report for src/apack/zcl_abapgit_apack_reader.clas.abap + + + + + + + + + +
+
+

All files / src/apack zcl_abapgit_apack_reader.clas.abap

+
+ +
+ 71.24% + Statements + 166/233 +
+ + +
+ 50% + Branches + 2/4 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 71.24% + Lines + 166/233 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +2341x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_apack_reader DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES ty_package_name TYPE devclass .
+ 
+    CLASS-METHODS create_instance
+      IMPORTING
+        !iv_package_name          TYPE ty_package_name
+      RETURNING
+        VALUE(ro_manifest_reader) TYPE REF TO zcl_abapgit_apack_reader .
+    CLASS-METHODS deserialize
+      IMPORTING
+        !iv_package_name          TYPE ty_package_name
+        !iv_xstr                  TYPE xstring
+      RETURNING
+        VALUE(ro_manifest_reader) TYPE REF TO zcl_abapgit_apack_reader
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_manifest_descriptor
+      RETURNING
+        VALUE(rs_manifest_descriptor) TYPE zif_abapgit_apack_definitions=>ty_descriptor
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_manifest_descriptor
+      IMPORTING
+        !is_manifest_descriptor TYPE zif_abapgit_apack_definitions=>ty_descriptor
+      RAISING
+        zcx_abapgit_exception.
+    METHODS copy_manifest_descriptor
+      IMPORTING
+        !io_manifest_provider TYPE REF TO object
+      RAISING
+        zcx_abapgit_exception.
+    METHODS has_manifest
+      RETURNING
+        VALUE(rv_has_manifest) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      IMPORTING
+        !iv_package_name TYPE ty_package_name .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_s_manifest_declaration,
+        clsname  TYPE seoclsname,
+        devclass TYPE devclass,
+      END OF ty_s_manifest_declaration .
+ 
+    DATA mv_package_name TYPE ty_package_name .
+    DATA ms_cached_descriptor TYPE zif_abapgit_apack_definitions=>ty_descriptor .
+    DATA mv_is_cached TYPE abap_bool .
+ 
+    CLASS-METHODS from_xml
+      IMPORTING
+        iv_xml         TYPE string
+      RETURNING
+        VALUE(rs_data) TYPE zif_abapgit_apack_definitions=>ty_descriptor.
+ 
+    METHODS format_version
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_apack_reader IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mv_package_name = iv_package_name.
+  ENDMETHOD.
+ 
+ 
+  METHOD copy_manifest_descriptor.
+
+    DATA: ls_my_manifest_wo_deps TYPE zif_abapgit_apack_definitions=>ty_descriptor_wo_dependencies,
+          ls_my_dependency       TYPE zif_abapgit_apack_definitions=>ty_dependency,
+          ls_descriptor          TYPE zif_abapgit_apack_definitions=>ty_descriptor,
+          lv_descriptor_cust     TYPE string,
+          lv_descriptor_sap      TYPE string.
+
+    FIELD-SYMBOLS: <lg_descriptor>   TYPE any,
+                   <lt_dependencies> TYPE ANY TABLE,
+                   <lg_dependency>   TYPE any.
+
+    lv_descriptor_cust = zif_abapgit_apack_definitions=>c_apack_interface_cust && '~DESCRIPTOR'.
+    lv_descriptor_sap  = zif_abapgit_apack_definitions=>c_apack_interface_sap && '~DESCRIPTOR'.
+
+    ASSIGN io_manifest_provider->(lv_descriptor_cust) TO <lg_descriptor>.
+    IF <lg_descriptor> IS NOT ASSIGNED.
+      ASSIGN io_manifest_provider->(lv_descriptor_sap) TO <lg_descriptor>.
+    ENDIF.
+    IF <lg_descriptor> IS ASSIGNED.
+      " A little more complex than a normal MOVE-CORRSPONDING
+      " to avoid dumps in case of future updates to the dependencies table structure
+      ASSIGN COMPONENT 'DEPENDENCIES' OF STRUCTURE <lg_descriptor> TO <lt_dependencies>.
+      IF <lt_dependencies> IS ASSIGNED.
+        LOOP AT <lt_dependencies> ASSIGNING <lg_dependency>.
+          MOVE-CORRESPONDING <lg_dependency> TO ls_my_dependency.
+          INSERT ls_my_dependency INTO TABLE ls_descriptor-dependencies.
+        ENDLOOP.
+        MOVE-CORRESPONDING <lg_descriptor> TO ls_my_manifest_wo_deps.
+        MOVE-CORRESPONDING ls_my_manifest_wo_deps TO ls_descriptor.
+      ENDIF.
+    ENDIF.
+
+    set_manifest_descriptor( ls_descriptor ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD create_instance.
+    CREATE OBJECT ro_manifest_reader
+      EXPORTING
+        iv_package_name = iv_package_name.
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize.
+ 
+    DATA: lv_xml  TYPE string,
+          ls_data TYPE zif_abapgit_apack_definitions=>ty_descriptor.
+ 
+    lv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( iv_xstr ).
+ 
+    ls_data = from_xml( lv_xml ).
+ 
+    ro_manifest_reader = create_instance( iv_package_name ).
+ 
+    ro_manifest_reader = create_instance( iv_package_name ).
+    ro_manifest_reader->set_manifest_descriptor( ls_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_version.
+ 
+    FIELD-SYMBOLS: <ls_dependency> TYPE zif_abapgit_apack_definitions=>ty_dependency.
+ 
+    TRANSLATE ms_cached_descriptor-version TO LOWER CASE.
+    ms_cached_descriptor-sem_version = zcl_abapgit_version=>conv_str_to_version( ms_cached_descriptor-version ).
+ 
+    LOOP AT ms_cached_descriptor-dependencies ASSIGNING <ls_dependency>.
+      <ls_dependency>-sem_version = zcl_abapgit_version=>conv_str_to_version( <ls_dependency>-version ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = iv_xml.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = 'accept_data_loss'
+      SOURCE XML lv_xml
+      RESULT data = rs_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_manifest_descriptor.
+ 
+    DATA: lo_manifest_provider       TYPE REF TO object,
+          ls_manifest_implementation TYPE ty_s_manifest_declaration.
+ 
+    IF mv_is_cached IS INITIAL AND mv_package_name IS NOT INITIAL.
+      SELECT SINGLE seometarel~clsname tadir~devclass FROM seometarel "#EC CI_NOORDER
+         INNER JOIN tadir ON seometarel~clsname = tadir~obj_name "#EC CI_BUFFJOIN
+         INTO ls_manifest_implementation
+         WHERE tadir~pgmid = 'R3TR' AND
+               tadir~object = 'CLAS' AND
+               seometarel~version = '1' AND
+               seometarel~refclsname = zif_abapgit_apack_definitions=>c_apack_interface_cust AND
+               tadir~devclass = mv_package_name.
+      IF ls_manifest_implementation IS INITIAL.
+        SELECT SINGLE seometarel~clsname tadir~devclass FROM seometarel "#EC CI_NOORDER
+           INNER JOIN tadir ON seometarel~clsname = tadir~obj_name "#EC CI_BUFFJOIN
+           INTO ls_manifest_implementation
+           WHERE tadir~pgmid = 'R3TR' AND
+                 tadir~object = 'CLAS' AND
+                 seometarel~version = '1' AND
+                 seometarel~refclsname = zif_abapgit_apack_definitions=>c_apack_interface_sap AND
+                 tadir~devclass = mv_package_name.
+      ENDIF.
+      IF ls_manifest_implementation IS NOT INITIAL.
+        TRY.
+            CREATE OBJECT lo_manifest_provider TYPE (ls_manifest_implementation-clsname).
+          CATCH cx_sy_create_object_error.
+            CLEAR: rs_manifest_descriptor.
+        ENDTRY.
+        IF lo_manifest_provider IS BOUND.
+          copy_manifest_descriptor( lo_manifest_provider ).
+        ENDIF.
+      ENDIF.
+
+      mv_is_cached = abap_true.
+
+    ENDIF.
+ 
+    rs_manifest_descriptor = ms_cached_descriptor.
+  ENDMETHOD.
+ 
+ 
+  METHOD has_manifest.
+ 
+    DATA: ls_returned_manifest TYPE zif_abapgit_apack_definitions=>ty_descriptor.
+ 
+    ls_returned_manifest = get_manifest_descriptor( ).
+ 
+    rv_has_manifest = abap_false.
+    IF ls_returned_manifest IS NOT INITIAL.
+      rv_has_manifest = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_manifest_descriptor.
+    mv_is_cached = abap_true.
+    ms_cached_descriptor = is_manifest_descriptor.
+    format_version( ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/apack/zcl_abapgit_apack_reader.clas.testclasses.abap.html b/src/apack/zcl_abapgit_apack_reader.clas.testclasses.abap.html new file mode 100644 index 00000000000..1cfad3d2360 --- /dev/null +++ b/src/apack/zcl_abapgit_apack_reader.clas.testclasses.abap.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/apack/zcl_abapgit_apack_reader.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/apack zcl_abapgit_apack_reader.clas.testclasses.abap

+
+ +
+ 100% + Statements + 46/46 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 46/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
*"* use this source file for your ABAP unit test classes
+CLASS ltcl_apack_manifest_reader DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
+  PRIVATE SECTION.
+    METHODS:
+      setup RAISING cx_static_check,
+      manifest_descriptor FOR TESTING RAISING cx_static_check,
+      verify_own_descriptor IMPORTING is_manifest_descriptor TYPE zif_abapgit_apack_definitions=>ty_descriptor.
+ 
+    DATA: mo_manifest_reader TYPE REF TO zcl_abapgit_apack_reader.
+ENDCLASS.
+ 
+CLASS ltcl_apack_manifest_reader IMPLEMENTATION.
+ 
+  METHOD manifest_descriptor.
+    verify_own_descriptor( mo_manifest_reader->get_manifest_descriptor( ) ).
+  ENDMETHOD.
+ 
+  METHOD setup.
+    DATA: ls_apack_manifest_descriptor TYPE zif_abapgit_apack_definitions=>ty_descriptor.
+ 
+    ls_apack_manifest_descriptor-group_id = 'github.com/abapGit'.
+    ls_apack_manifest_descriptor-artifact_id = 'abapGit'.
+    ls_apack_manifest_descriptor-version = '1.42'.
+    ls_apack_manifest_descriptor-git_url = 'https://github.com/abapGit/abapGit.git'.
+ 
+    mo_manifest_reader = zcl_abapgit_apack_reader=>create_instance( '$TMP' ).
+    mo_manifest_reader->set_manifest_descriptor( ls_apack_manifest_descriptor ).
+ 
+  ENDMETHOD.
+ 
+  METHOD verify_own_descriptor.
+    cl_abap_unit_assert=>assert_not_initial( is_manifest_descriptor ).
+    cl_abap_unit_assert=>assert_equals( exp = 'github.com/abapGit'
+                                        act = is_manifest_descriptor-group_id ).
+    cl_abap_unit_assert=>assert_equals( exp = 'abapGit'
+                                        act = is_manifest_descriptor-artifact_id ).
+    cl_abap_unit_assert=>assert_equals( exp = '1.42'
+                                        act = is_manifest_descriptor-version ).
+    " Repository type is added automatically by serializer later
+    cl_abap_unit_assert=>assert_initial( is_manifest_descriptor-repository_type ).
+    cl_abap_unit_assert=>assert_equals( exp = 'https://github.com/abapGit/abapGit.git'
+                                        act = is_manifest_descriptor-git_url ).
+    cl_abap_unit_assert=>assert_initial( is_manifest_descriptor-dependencies ).
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/background/index.html b/src/background/index.html new file mode 100644 index 00000000000..346918a4272 --- /dev/null +++ b/src/background/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/background + + + + + + + + + +
+
+

All files src/background

+
+ +
+ 63.84% + Statements + 385/603 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 63.84% + Lines + 385/603 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_background.clas.abap +
+
100%143/143100%0/0100%0/0100%143/143
zcl_abapgit_background_pull.clas.abap +
+
65.21%30/46100%0/00%0/165.21%30/46
zcl_abapgit_background_push_au.clas.abap +
+
45.2%113/250100%0/00%0/345.2%113/250
zcl_abapgit_background_push_fi.clas.abap +
+
60.36%99/164100%0/00%0/260.36%99/164
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/background/zcl_abapgit_background.clas.abap.html b/src/background/zcl_abapgit_background.clas.abap.html new file mode 100644 index 00000000000..98cdc41463c --- /dev/null +++ b/src/background/zcl_abapgit_background.clas.abap.html @@ -0,0 +1,514 @@ + + + + + + Code coverage report for src/background/zcl_abapgit_background.clas.abap + + + + + + + + + +
+
+

All files / src/background zcl_abapgit_background.clas.abap

+
+ +
+ 100% + Statements + 143/143 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 143/143 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +1441x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_background DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES: BEGIN OF ty_method,
+             class       TYPE seoclsname,
+             description TYPE string,
+           END OF ty_method.
+ 
+    TYPES: ty_methods TYPE SORTED TABLE OF ty_method WITH UNIQUE KEY class.
+ 
+    CLASS-METHODS run
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS list_methods
+      RETURNING VALUE(rt_methods) TYPE ty_methods.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_BACKGROUND IMPLEMENTATION.
+ 
+ 
+  METHOD list_methods.
+ 
+    DATA: ls_method       LIKE LINE OF rt_methods,
+          ls_key          TYPE seoclskey,
+          lt_implementing TYPE seor_implementing_keys,
+          ls_implementing LIKE LINE OF lt_implementing.
+ 
+    FIELD-SYMBOLS: <ls_method> LIKE LINE OF rt_methods.
+ 
+ 
+* in order to handle local classes in the compiled report
+    ls_method-class = 'ZCL_ABAPGIT_BACKGROUND_PULL'.
+    INSERT ls_method INTO TABLE rt_methods.
+    ls_method-class = 'ZCL_ABAPGIT_BACKGROUND_PUSH_AU'.
+    INSERT ls_method INTO TABLE rt_methods.
+    ls_method-class = 'ZCL_ABAPGIT_BACKGROUND_PUSH_FI'.
+    INSERT ls_method INTO TABLE rt_methods.
+ 
+    ls_key-clsname = 'ZIF_ABAPGIT_BACKGROUND'.
+ 
+    CALL FUNCTION 'SEO_INTERFACE_IMPLEM_GET_ALL'
+      EXPORTING
+        intkey       = ls_key
+      IMPORTING
+        impkeys      = lt_implementing
+      EXCEPTIONS
+        not_existing = 1
+        OTHERS       = 2 ##FM_SUBRC_OK.
+    LOOP AT lt_implementing INTO ls_implementing.
+      ls_method-class = ls_implementing-clsname.
+      INSERT ls_method INTO TABLE rt_methods.
+    ENDLOOP.
+ 
+    LOOP AT rt_methods ASSIGNING <ls_method>.
+      CALL METHOD (<ls_method>-class)=>zif_abapgit_background~get_description
+        RECEIVING
+          rv_description = <ls_method>-description.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    CONSTANTS: lc_enq_type TYPE c LENGTH 12 VALUE 'BACKGROUND'.
+ 
+    DATA: lo_per        TYPE REF TO zcl_abapgit_persist_background,
+          lo_repo       TYPE REF TO zcl_abapgit_repo_online,
+          lt_list       TYPE zcl_abapgit_persist_background=>ty_background_keys,
+          li_background TYPE REF TO zif_abapgit_background,
+          li_log        TYPE REF TO zif_abapgit_log,
+          lx_error      TYPE REF TO zcx_abapgit_exception,
+          lv_repo_name  TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_list> LIKE LINE OF lt_list.
+ 
+ 
+    CALL FUNCTION 'ENQUEUE_EZABAPGIT'
+      EXPORTING
+        mode_zabapgit  = 'E'
+        type           = lc_enq_type
+        _scope         = '3'
+      EXCEPTIONS
+        foreign_lock   = 1
+        system_failure = 2
+        OTHERS         = 3.
+    IF sy-subrc <> 0.
+      WRITE: / 'Another intance of the program is already running'.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT lo_per.
+    lt_list = lo_per->list( ).
+ 
+    WRITE: / 'Background mode'.
+ 
+    LOOP AT lt_list ASSIGNING <ls_list>.
+      CREATE OBJECT li_log TYPE zcl_abapgit_log.
+ 
+      TRY.
+          lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( <ls_list>-key ).
+          lv_repo_name = lo_repo->get_name( ).
+          WRITE: / <ls_list>-method, lv_repo_name.
+ 
+          zcl_abapgit_login_manager=>set(
+            iv_uri      = lo_repo->get_url( )
+            iv_username = <ls_list>-username
+            iv_password = <ls_list>-password ).
+ 
+          CREATE OBJECT li_background TYPE (<ls_list>-method).
+ 
+          li_background->run(
+            io_repo     = lo_repo
+            ii_log      = li_log
+            it_settings = <ls_list>-settings ).
+ 
+          " Clear auth buffer to allow different user/password per repository in background mode
+          zcl_abapgit_login_manager=>clear( ).
+ 
+        CATCH zcx_abapgit_exception INTO lx_error.
+          li_log->add_exception( lx_error ).
+      ENDTRY.
+ 
+      zcl_abapgit_log_viewer=>write_log( li_log ).
+    ENDLOOP.
+ 
+    IF lines( lt_list ) = 0.
+      WRITE: / 'Nothing configured'.
+    ENDIF.
+ 
+    CALL FUNCTION 'DEQUEUE_EZABAPGIT'
+      EXPORTING
+        type = lc_enq_type.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/background/zcl_abapgit_background_pull.clas.abap.html b/src/background/zcl_abapgit_background_pull.clas.abap.html new file mode 100644 index 00000000000..8927c5d4650 --- /dev/null +++ b/src/background/zcl_abapgit_background_pull.clas.abap.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/background/zcl_abapgit_background_pull.clas.abap + + + + + + + + + +
+
+

All files / src/background zcl_abapgit_background_pull.clas.abap

+
+ +
+ 65.21% + Statements + 30/46 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 65.21% + Lines + 30/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_background_pull DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_background .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_background_pull IMPLEMENTATION.
+ 
+ 
+  METHOD zif_abapgit_background~get_description.
+ 
+    rv_description = 'Automatic pull'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_settings.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~run.
+
+    DATA: ls_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks.
+
+    FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF ls_checks-overwrite.
+
+
+    ls_checks = io_repo->deserialize_checks( ).
+
+    LOOP AT ls_checks-overwrite ASSIGNING <ls_overwrite>.
+      <ls_overwrite>-decision = zif_abapgit_definitions=>c_yes.
+    ENDLOOP.
+
+    io_repo->deserialize( is_checks = ls_checks
+                          ii_log    = ii_log ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/background/zcl_abapgit_background_push_au.clas.abap.html b/src/background/zcl_abapgit_background_push_au.clas.abap.html new file mode 100644 index 00000000000..e4adce53601 --- /dev/null +++ b/src/background/zcl_abapgit_background_push_au.clas.abap.html @@ -0,0 +1,835 @@ + + + + + + Code coverage report for src/background/zcl_abapgit_background_push_au.clas.abap + + + + + + + + + +
+
+

All files / src/background zcl_abapgit_background_push_au.clas.abap

+
+ +
+ 45.2% + Statements + 113/250 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 45.2% + Lines + 113/250 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +2511x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_background_push_au DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_background .
+  PROTECTED SECTION.
+ 
+    DATA mi_log TYPE REF TO zif_abapgit_log .
+ 
+    METHODS build_comment
+      IMPORTING
+        !is_files         TYPE zif_abapgit_definitions=>ty_stage_files
+      RETURNING
+        VALUE(rv_comment) TYPE string .
+    METHODS push_auto
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo_online
+      RAISING
+        zcx_abapgit_exception .
+    METHODS determine_user_details
+      IMPORTING
+        !iv_changed_by TYPE syuname
+      RETURNING
+        VALUE(rs_user) TYPE zif_abapgit_git_definitions=>ty_git_user .
+    METHODS push_deletions
+      IMPORTING
+        !io_repo  TYPE REF TO zcl_abapgit_repo_online
+        !is_files TYPE zif_abapgit_definitions=>ty_stage_files
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_background_push_au IMPLEMENTATION.
+ 
+ 
+  METHOD build_comment.
+ 
+    DATA: lt_objects TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          lv_str     TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_local> LIKE LINE OF is_files-local.
+ 
+ 
+    LOOP AT is_files-local ASSIGNING <ls_local>.
+      lv_str = |{ <ls_local>-item-obj_type } { <ls_local>-item-obj_name }|.
+      APPEND lv_str TO lt_objects.
+    ENDLOOP.
+ 
+    SORT lt_objects AS TEXT.
+    DELETE ADJACENT DUPLICATES FROM lt_objects.
+ 
+    IF lines( lt_objects ) = 1.
+      rv_comment = |BG: { lv_str }|.
+    ELSE.
+      rv_comment = 'BG: Multiple objects'.
+      LOOP AT lt_objects INTO lv_str.
+        CONCATENATE rv_comment cl_abap_char_utilities=>newline lv_str INTO rv_comment.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_user_details.
+ 
+    DATA: lo_user_record TYPE REF TO zcl_abapgit_user_record.
+ 
+ 
+    lo_user_record = zcl_abapgit_user_record=>get_instance( iv_changed_by ).
+    rs_user-name = lo_user_record->get_name( ).
+    rs_user-email = lo_user_record->get_email( ).
+ 
+*   If no email, fall back to localhost/default email
+    IF rs_user-email IS INITIAL.
+      rs_user-email = |{ iv_changed_by }@localhost|.
+    ENDIF.
+ 
+*   If no full name maintained, just use changed by user name
+    IF rs_user-name IS INITIAL.
+      rs_user-name  = iv_changed_by.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push_auto.
+
+    TYPES: BEGIN OF ty_changed,
+             filename   TYPE string,
+             path       TYPE string,
+             changed_by TYPE syuname,
+           END OF ty_changed.
+
+    DATA: ls_comment    TYPE zif_abapgit_git_definitions=>ty_comment,
+          ls_files      TYPE zif_abapgit_definitions=>ty_stage_files,
+          lt_changed    TYPE STANDARD TABLE OF ty_changed WITH DEFAULT KEY,
+          lt_users      TYPE STANDARD TABLE OF syuname WITH DEFAULT KEY,
+          ls_user_files LIKE ls_files,
+          lv_changed_by LIKE LINE OF lt_users,
+          lo_stage      TYPE REF TO zcl_abapgit_stage.
+
+    FIELD-SYMBOLS: <ls_changed> LIKE LINE OF lt_changed,
+                   <ls_remote>  LIKE LINE OF ls_files-remote,
+                   <ls_local>   LIKE LINE OF ls_files-local.
+
+
+    ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
+
+    LOOP AT ls_files-local ASSIGNING <ls_local>.
+      lv_changed_by = zcl_abapgit_objects=>changed_by(
+        is_item     = <ls_local>-item
+        iv_filename = <ls_local>-file-filename ).
+      APPEND lv_changed_by TO lt_users.
+      APPEND INITIAL LINE TO lt_changed ASSIGNING <ls_changed>.
+      <ls_changed>-changed_by = lv_changed_by.
+      <ls_changed>-filename   = <ls_local>-file-filename.
+      <ls_changed>-path       = <ls_local>-file-path.
+    ENDLOOP.
+
+    SORT lt_users ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM lt_users.
+
+    LOOP AT lt_users INTO lv_changed_by.
+      CLEAR: ls_comment.
+
+*     Fill user details
+      ls_comment-committer = determine_user_details( lv_changed_by ).
+
+      CREATE OBJECT lo_stage.
+
+      CLEAR ls_user_files.
+
+      LOOP AT ls_files-local ASSIGNING <ls_local>.
+        READ TABLE lt_changed WITH KEY
+          path = <ls_local>-file-path
+          filename = <ls_local>-file-filename
+          changed_by = lv_changed_by
+          TRANSPORTING NO FIELDS.
+        IF sy-subrc = 0.
+          mi_log->add_info( |stage: {
+            ls_comment-committer-name } {
+            <ls_local>-file-path } {
+            <ls_local>-file-filename }| ).
+
+          lo_stage->add( iv_path     = <ls_local>-file-path
+                         iv_filename = <ls_local>-file-filename
+                         iv_data     = <ls_local>-file-data ).
+
+          APPEND <ls_local> TO ls_user_files-local.
+
+          LOOP AT ls_files-remote ASSIGNING <ls_remote>
+              USING KEY file
+              WHERE filename = <ls_local>-file-filename
+              AND path <> <ls_local>-file-path
+              AND filename <> 'package.devc.xml'.
+            mi_log->add_info( |rm: { <ls_remote>-path } { <ls_remote>-filename }| ).
+
+* rm old file when object has moved
+            lo_stage->rm(
+              iv_path     = <ls_remote>-path
+              iv_filename = <ls_remote>-filename ).
+            EXIT. " assumption: only one file
+          ENDLOOP.
+        ENDIF.
+      ENDLOOP.
+
+      ls_comment-comment = build_comment( ls_user_files ).
+
+      io_repo->push( is_comment = ls_comment
+                     io_stage   = lo_stage ).
+    ENDLOOP.
+
+    IF lines( ls_files-remote ) > 0.
+      push_deletions( io_repo  = io_repo
+                      is_files = ls_files ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD push_deletions.
+
+    DATA: lo_stage   TYPE REF TO zcl_abapgit_stage,
+          ls_comment TYPE zif_abapgit_git_definitions=>ty_comment.
+
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF is_files-remote.
+
+    ASSERT lines( is_files-remote ) > 0.
+
+    CREATE OBJECT lo_stage.
+
+    ls_comment-comment = 'BG: Deletion'.
+
+    LOOP AT is_files-remote ASSIGNING <ls_remote>.
+
+      mi_log->add_info( |removed: { <ls_remote>-path } { <ls_remote>-filename }| ).
+
+      lo_stage->rm( iv_path     = <ls_remote>-path
+                    iv_filename = <ls_remote>-filename ).
+
+      CONCATENATE ls_comment-comment cl_abap_char_utilities=>newline <ls_remote>-filename
+        INTO ls_comment-comment.
+
+    ENDLOOP.
+
+    ls_comment-committer-name  = 'Deletion'.
+    ls_comment-committer-email = 'deletion@localhost'.
+
+    io_repo->push( is_comment = ls_comment
+                   io_stage   = lo_stage ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_description.
+ 
+    rv_description = 'Automatic push, auto author'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_settings.
+ 
+    RETURN.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~run.
+
+    DATA: ls_files TYPE zif_abapgit_definitions=>ty_stage_files.
+
+    mi_log = ii_log.
+    ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
+
+    IF lines( ls_files-local ) = 0 AND lines( ls_files-remote ) = 0.
+      ii_log->add_info( 'Nothing to stage' ).
+      RETURN.
+    ENDIF.
+
+    push_auto( io_repo ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/background/zcl_abapgit_background_push_fi.clas.abap.html b/src/background/zcl_abapgit_background_push_fi.clas.abap.html new file mode 100644 index 00000000000..34de0aabdc5 --- /dev/null +++ b/src/background/zcl_abapgit_background_push_fi.clas.abap.html @@ -0,0 +1,577 @@ + + + + + + Code coverage report for src/background/zcl_abapgit_background_push_fi.clas.abap + + + + + + + + + +
+
+

All files / src/background zcl_abapgit_background_push_fi.clas.abap

+
+ +
+ 60.36% + Statements + 99/164 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 60.36% + Lines + 99/164 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +1651x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_background_push_fi DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_background .
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_settings,
+        name  TYPE string VALUE 'NAME',
+        email TYPE string VALUE 'EMAIL',
+      END OF c_settings .
+    DATA mi_log TYPE REF TO zif_abapgit_log .
+ 
+    METHODS build_comment
+      IMPORTING
+        !is_files         TYPE zif_abapgit_definitions=>ty_stage_files
+      RETURNING
+        VALUE(rv_comment) TYPE string .
+    METHODS push_fixed
+      IMPORTING
+        !io_repo  TYPE REF TO zcl_abapgit_repo_online
+        !iv_name  TYPE string
+        !iv_email TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_background_push_fi IMPLEMENTATION.
+ 
+ 
+  METHOD build_comment.
+ 
+    DATA: lt_objects TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          lv_str     TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_local> LIKE LINE OF is_files-local.
+ 
+ 
+    LOOP AT is_files-local ASSIGNING <ls_local>.
+      lv_str = |{ <ls_local>-item-obj_type } { <ls_local>-item-obj_name }|.
+      APPEND lv_str TO lt_objects.
+    ENDLOOP.
+ 
+    SORT lt_objects AS TEXT.
+    DELETE ADJACENT DUPLICATES FROM lt_objects.
+ 
+    IF lines( lt_objects ) = 1.
+      rv_comment = |BG: { lv_str }|.
+    ELSE.
+      rv_comment = 'BG: Multiple objects'.
+      LOOP AT lt_objects INTO lv_str.
+        CONCATENATE rv_comment cl_abap_char_utilities=>newline lv_str INTO rv_comment.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push_fixed.
+
+    DATA: ls_comment TYPE zif_abapgit_git_definitions=>ty_comment,
+          ls_files   TYPE zif_abapgit_definitions=>ty_stage_files,
+          lo_stage   TYPE REF TO zcl_abapgit_stage.
+
+    FIELD-SYMBOLS: <ls_local>  LIKE LINE OF ls_files-local,
+                   <ls_remote> LIKE LINE OF ls_files-remote.
+
+
+    ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
+    ASSERT lines( ls_files-local ) > 0
+        OR lines( ls_files-remote ) > 0.
+
+    CREATE OBJECT lo_stage.
+
+    LOOP AT ls_files-local ASSIGNING <ls_local>.
+      mi_log->add_info( |stage: { <ls_local>-file-path } { <ls_local>-file-filename }| ).
+      lo_stage->add( iv_path     = <ls_local>-file-path
+                     iv_filename = <ls_local>-file-filename
+                     iv_data     = <ls_local>-file-data ).
+    ENDLOOP.
+
+    LOOP AT ls_files-remote ASSIGNING <ls_remote>.
+
+      mi_log->add_info( |removed: { <ls_remote>-path } { <ls_remote>-filename }| ).
+
+      lo_stage->rm( iv_path     = <ls_remote>-path
+                    iv_filename = <ls_remote>-filename ).
+
+    ENDLOOP.
+
+    ls_comment-committer-name  = iv_name.
+    ls_comment-committer-email = iv_email.
+    ls_comment-comment         = build_comment( ls_files ).
+
+    io_repo->push( is_comment = ls_comment
+                   io_stage   = lo_stage ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_description.
+ 
+    rv_description = 'Automatic push, fixed author'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~get_settings.
+ 
+    DATA: ls_setting LIKE LINE OF ct_settings.
+ 
+ 
+    READ TABLE ct_settings WITH KEY key = c_settings-name INTO ls_setting.
+    IF sy-subrc <> 0.
+      ls_setting-key = c_settings-name.
+      ls_setting-value = 'foobar'.
+      APPEND ls_setting TO ct_settings.
+    ENDIF.
+ 
+    READ TABLE ct_settings WITH KEY key = c_settings-email INTO ls_setting.
+    IF sy-subrc <> 0.
+      ls_setting-key = c_settings-email.
+      ls_setting-value = 'foobar@localhost'.
+      APPEND ls_setting TO ct_settings.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_background~run.
+
+    DATA: ls_files   TYPE zif_abapgit_definitions=>ty_stage_files,
+          ls_setting LIKE LINE OF it_settings,
+          lv_name    TYPE string,
+          lv_email   TYPE string.
+
+    mi_log = ii_log.
+    ls_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo ).
+
+    IF lines( ls_files-local ) = 0 AND lines( ls_files-remote ) = 0.
+      ii_log->add_info( 'Nothing to stage' ).
+      RETURN.
+    ENDIF.
+
+    READ TABLE it_settings WITH KEY key = c_settings-name INTO ls_setting. "#EC CI_SUBRC
+    lv_name = ls_setting-value.
+
+    READ TABLE it_settings WITH KEY key = c_settings-email INTO ls_setting. "#EC CI_SUBRC
+    lv_email = ls_setting-value.
+
+    push_fixed(
+      io_repo  = io_repo
+      iv_name  = lv_name
+      iv_email = lv_email ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/index.html b/src/cts/index.html new file mode 100644 index 00000000000..bae8e3ab2a2 --- /dev/null +++ b/src/cts/index.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for src/cts + + + + + + + + + +
+
+

All files src/cts

+
+ +
+ 87.91% + Statements + 1833/2085 +
+ + +
+ 89.79% + Branches + 44/49 +
+ + +
+ 68.42% + Functions + 26/38 +
+ + +
+ 87.91% + Lines + 1833/2085 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_cts_api.clas.abap +
+
82.42%394/478100%0/00%0/382.42%394/478
zcl_abapgit_default_transport.clas.abap +
+
53.09%120/226100%0/00%0/653.09%120/226
zcl_abapgit_transport.clas.abap +
+
100%457/457100%0/0100%0/0100%457/457
zcl_abapgit_transport_2_branch.clas.abap +
+
55.68%49/88100%0/00%0/255.68%49/88
zcl_abapgit_transport_mass.clas.abap +
+
100%68/68100%0/0100%0/0100%68/68
zcl_abapgit_transport_mass.clas.locals_imp.abap +
+
92.76%205/221100%0/00%0/192.76%205/221
zcl_abapgit_transport_objects.clas.abap +
+
96.7%88/9182.35%14/17100%1/196.7%88/91
zcl_abapgit_transport_objects.clas.testclasses.abap +
+
99.12%452/45693.75%30/32100%25/2599.12%452/456
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/zcl_abapgit_cts_api.clas.abap.html b/src/cts/zcl_abapgit_cts_api.clas.abap.html new file mode 100644 index 00000000000..8d70960ee0d --- /dev/null +++ b/src/cts/zcl_abapgit_cts_api.clas.abap.html @@ -0,0 +1,1519 @@ + + + + + + Code coverage report for src/cts/zcl_abapgit_cts_api.clas.abap + + + + + + + + + +
+
+

All files / src/cts zcl_abapgit_cts_api.clas.abap

+
+ +
+ 82.42% + Statements + 394/478 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 82.42% + Lines + 394/478 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +4791x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
"! Change transport system API
+CLASS zcl_abapgit_cts_api DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_cts_api.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA: mv_confirm_transp_msgs_called TYPE abap_bool.
+ 
+    "! Returns the transport request / task the object is currently locked in
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter iv_object_name | Object name
+    "! @parameter rv_transport | Transport request / task
+    "! @raising zcx_abapgit_exception | Object is not locked in a transport
+    METHODS get_current_transport_for_obj
+      IMPORTING
+        !iv_program_id      TYPE pgmid DEFAULT 'R3TR'
+        !iv_object_type     TYPE trobjtype
+        !iv_object_name     TYPE sobj_name
+      RETURNING
+        VALUE(rv_transport) TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    "! Returns the transport request / task that includes the object (even if not locked)
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter iv_object_name | Object name
+    "! @parameter rv_transport | Transport request / task
+    "! @raising zcx_abapgit_exception | Object is not locked in a transport
+    METHODS get_current_transport_from_db
+      IMPORTING
+        !iv_program_id      TYPE pgmid DEFAULT 'R3TR'
+        !iv_object_type     TYPE trobjtype
+        !iv_object_name     TYPE sobj_name
+      RETURNING
+        VALUE(rv_transport) TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    "! Check if the object is currently locked in a transport
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter iv_object_name | Object name
+    "! @parameter rv_locked | Object is locked
+    "! @raising zcx_abapgit_exception | Object type is not lockable
+    METHODS is_object_locked_in_transport
+      IMPORTING
+        !iv_program_id   TYPE pgmid DEFAULT 'R3TR'
+        !iv_object_type  TYPE trobjtype
+        !iv_object_name  TYPE sobj_name
+      RETURNING
+        VALUE(rv_locked) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    "! Check if the object type is lockable
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter rv_lockable | Lockable
+    METHODS is_object_type_lockable
+      IMPORTING
+        !iv_program_id     TYPE pgmid DEFAULT 'R3TR'
+        !iv_object_type    TYPE trobjtype
+      RETURNING
+        VALUE(rv_lockable) TYPE abap_bool .
+    "! Check if the object type can be transported
+    "! @parameter iv_program_id | Program ID
+    "! @parameter iv_object_type | Object type
+    "! @parameter rv_transportable | Transportable
+    METHODS is_object_type_transportable
+      IMPORTING
+        !iv_program_id          TYPE pgmid DEFAULT 'R3TR'
+        !iv_object_type         TYPE trobjtype
+      RETURNING
+        VALUE(rv_transportable) TYPE abap_bool .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_cts_api IMPLEMENTATION.
+ 
+ 
+  METHOD get_current_transport_for_obj.
+    DATA: lv_object_lockable   TYPE abap_bool,
+          lv_locked            TYPE abap_bool,
+          lv_transport_request TYPE trkorr,
+          lv_task              TYPE trkorr,
+          lv_tr_object_name    TYPE trobj_name.
+ 
+    lv_tr_object_name = iv_object_name.
+ 
+    CALL FUNCTION 'TR_CHECK_OBJECT_LOCK'
+      EXPORTING
+        wi_pgmid             = iv_program_id
+        wi_object            = iv_object_type
+        wi_objname           = lv_tr_object_name
+      IMPORTING
+        we_lockable_object   = lv_object_lockable
+        we_locked            = lv_locked
+        we_lock_order        = lv_transport_request
+        we_lock_task         = lv_task
+      EXCEPTIONS
+        empty_key            = 1
+        no_systemname        = 2
+        no_systemtype        = 3
+        unallowed_lock_order = 4
+        OTHERS               = 5.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    IF lv_locked = abap_false.
+      zcx_abapgit_exception=>raise( |Object { iv_program_id }-{ iv_object_type }-{ iv_object_name } is not locked| ).
+    ENDIF.
+ 
+    IF lv_object_lockable = abap_false.
+      zcx_abapgit_exception=>raise( |Object type { iv_program_id }-{ iv_object_type } not lockable| ).
+    ENDIF.
+ 
+    rv_transport = lv_transport_request.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_current_transport_from_db.
+ 
+    " This method is used for objects that are included in transports but not locked
+    " for example, namespaces (NSPC)
+    SELECT SINGLE a~trkorr FROM e070 AS a JOIN e071 AS b ON a~trkorr = b~trkorr
+      INTO rv_transport
+      WHERE ( a~trstatus = 'D' OR a~trstatus = 'L' )
+        AND a~trfunction <> 'G'
+        AND b~pgmid = iv_program_id AND b~object = iv_object_type AND b~obj_name = iv_object_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_object_locked_in_transport.
+    DATA: ls_object_key        TYPE e071,
+          lv_type_check_result TYPE c LENGTH 1,
+          ls_lock_key          TYPE tlock_int,
+          lv_lock_flag         TYPE c LENGTH 1.
+ 
+    ls_object_key-pgmid = iv_program_id.
+    ls_object_key-object = iv_object_type.
+    ls_object_key-obj_name = iv_object_name.
+ 
+    CALL FUNCTION 'TR_CHECK_TYPE'
+      EXPORTING
+        wi_e071     = ls_object_key
+      IMPORTING
+        pe_result   = lv_type_check_result
+        we_lock_key = ls_lock_key.
+ 
+    IF lv_type_check_result <> 'L'.
+      zcx_abapgit_exception=>raise( |Object type { iv_program_id }-{ iv_object_type } not lockable| ).
+    ENDIF.
+ 
+    CALL FUNCTION 'TRINT_CHECK_LOCKS'
+      EXPORTING
+        wi_lock_key = ls_lock_key
+      IMPORTING
+        we_lockflag = lv_lock_flag
+      EXCEPTIONS
+        empty_key   = 1
+        OTHERS      = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    rv_locked = boolc( lv_lock_flag <> space ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_object_type_lockable.
+    DATA: ls_object_key        TYPE e071,
+          lv_type_check_result TYPE c LENGTH 1.
+ 
+    ls_object_key-pgmid = iv_program_id.
+    ls_object_key-object = iv_object_type.
+    ls_object_key-obj_name = '_'. " Dummy value #2071
+ 
+    CALL FUNCTION 'TR_CHECK_TYPE'
+      EXPORTING
+        wi_e071   = ls_object_key
+      IMPORTING
+        pe_result = lv_type_check_result.
+ 
+    rv_lockable = boolc( lv_type_check_result = 'L' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_object_type_transportable.
+    DATA: ls_object_key        TYPE e071,
+          lv_type_check_result TYPE c LENGTH 1.
+ 
+    ls_object_key-pgmid = iv_program_id.
+    ls_object_key-object = iv_object_type.
+    ls_object_key-obj_name = '_'. " Dummy value #2071
+ 
+    CALL FUNCTION 'TR_CHECK_TYPE'
+      EXPORTING
+        wi_e071   = ls_object_key
+      IMPORTING
+        pe_result = lv_type_check_result.
+ 
+    rv_transportable = boolc( lv_type_check_result CA 'RTL' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~create_transport_entries.
+
+    DATA lt_tables      TYPE tredt_objects.
+    DATA lt_table_keys  TYPE STANDARD TABLE OF e071k.
+    DATA lv_with_dialog TYPE abap_bool.
+
+    cl_table_utilities_brf=>create_transport_entries(
+      EXPORTING
+        it_table_ins = it_table_ins
+        it_table_upd = it_table_upd
+        it_table_del = it_table_del
+        iv_tabname   = iv_tabname
+      CHANGING
+        ct_e071      = lt_tables
+        ct_e071k     = lt_table_keys ).
+
+    " cl_table_utilities_brf=>write_transport_entries does not allow passing a request
+
+    CALL FUNCTION 'TR_OBJECTS_CHECK'
+      TABLES
+        wt_ko200                = lt_tables
+      EXCEPTIONS
+        cancel_edit_other_error = 1
+        show_only_other_error   = 2
+        OTHERS                  = 3.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    IF iv_transport IS INITIAL.
+      lv_with_dialog = abap_true.
+    ENDIF.
+
+    CALL FUNCTION 'TRINT_OBJECTS_CHECK_AND_INSERT'
+      EXPORTING
+        iv_order       = iv_transport
+        iv_with_dialog = lv_with_dialog
+      CHANGING
+        ct_ko200       = lt_tables
+        ct_e071k       = lt_table_keys
+      EXCEPTIONS
+        OTHERS         = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~get_r3tr_obj_for_limu_obj.
+
+    CLEAR ev_object.
+    CLEAR ev_obj_name.
+
+    CALL FUNCTION 'GET_R3TR_OBJECT_FROM_LIMU_OBJ'
+      EXPORTING
+        p_limu_objtype = iv_object
+        p_limu_objname = iv_obj_name
+      IMPORTING
+        p_r3tr_objtype = ev_object
+        p_r3tr_objname = ev_obj_name
+      EXCEPTIONS
+        no_mapping     = 1
+        OTHERS         = 2.
+    IF sy-subrc <> 0 OR ev_obj_name IS INITIAL.
+      zcx_abapgit_exception=>raise( |No R3TR Object found for { iv_object } { iv_obj_name }| ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~get_transports_for_list.
+ 
+    DATA lv_request TYPE trkorr.
+    DATA lt_tlock TYPE SORTED TABLE OF tlock WITH NON-UNIQUE KEY object hikey.
+    DATA ls_object_key TYPE e071.
+    DATA lv_type_check_result TYPE c LENGTH 1.
+    DATA ls_lock_key TYPE tlock_int.
+    DATA ls_transport LIKE LINE OF rt_transports.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF it_items.
+    FIELD-SYMBOLS <ls_tlock> LIKE LINE OF lt_tlock.
+ 
+* Workarounds to improve performance, note that IT_ITEMS might
+* contain 1000s of rows, see standard logic in function module
+* TR_CHECK_OBJECT_LOCK
+ 
+* avoid database lookups in TLOCK for each item,
+    SELECT * FROM tlock INTO TABLE lt_tlock.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT it_items ASSIGNING <ls_item>.
+      CLEAR lv_request.
+ 
+      ls_object_key-pgmid = 'R3TR'.
+      ls_object_key-object = <ls_item>-obj_type.
+      ls_object_key-obj_name = <ls_item>-obj_name.
+ 
+      CALL FUNCTION 'TR_CHECK_TYPE'
+        EXPORTING
+          wi_e071     = ls_object_key
+        IMPORTING
+          we_lock_key = ls_lock_key
+          pe_result   = lv_type_check_result.
+ 
+      IF lv_type_check_result = 'L'.
+        LOOP AT lt_tlock ASSIGNING <ls_tlock>
+            WHERE object =  ls_lock_key-obj
+            AND   hikey  >= ls_lock_key-low
+            AND   lokey  <= ls_lock_key-hi.               "#EC PORTABLE
+          lv_request = <ls_tlock>-trkorr.
+          EXIT.
+        ENDLOOP.
+      ELSEIF is_object_type_transportable( <ls_item>-obj_type ) = abap_true.
+        lv_request = get_current_transport_from_db(
+          iv_object_type = <ls_item>-obj_type
+          iv_object_name = <ls_item>-obj_name ).
+      ENDIF.
+ 
+      IF lv_request IS NOT INITIAL.
+        ls_transport-obj_type = <ls_item>-obj_type.
+        ls_transport-obj_name = <ls_item>-obj_name.
+        ls_transport-trkorr = lv_request.
+        INSERT ls_transport INTO TABLE rt_transports.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~get_transport_for_object.
+ 
+    IF is_item-obj_type IS NOT INITIAL AND is_item-obj_name IS NOT INITIAL.
+ 
+      IF is_object_type_lockable( is_item-obj_type ) = abap_true AND
+         is_object_locked_in_transport(
+           iv_object_type = is_item-obj_type
+           iv_object_name = is_item-obj_name ) = abap_true.
+ 
+        rv_transport = get_current_transport_for_obj(
+          iv_object_type = is_item-obj_type
+          iv_object_name = is_item-obj_name ).
+ 
+      ELSEIF is_object_type_transportable( is_item-obj_type ) = abap_true.
+ 
+        rv_transport = get_current_transport_from_db(
+          iv_object_type = is_item-obj_type
+          iv_object_name = is_item-obj_name ).
+ 
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~insert_transport_object.
+
+    CALL FUNCTION 'RS_CORR_INSERT'
+      EXPORTING
+        object              = iv_obj_name
+        object_class        = iv_object
+        devclass            = iv_package
+        master_language     = iv_language
+        mode                = iv_mode
+        global_lock         = abap_true
+        suppress_dialog     = abap_true
+      EXCEPTIONS
+        cancelled           = 1
+        permission_failure  = 2
+        unknown_objectclass = 3
+        OTHERS              = 4.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~is_chrec_possible_for_package.
+    IF iv_package IS NOT INITIAL.
+      rv_possible = zcl_abapgit_factory=>get_sap_package( iv_package )->are_changes_recorded_in_tr_req( ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~read_description.
+ 
+    SELECT SINGLE as4text FROM e07t
+      INTO rv_description
+      WHERE trkorr = iv_trkorr
+      AND langu = sy-langu ##SUBRC_OK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~read_user.
+ 
+    SELECT SINGLE as4user FROM e070 INTO rv_uname
+      WHERE trkorr = iv_trkorr ##SUBRC_OK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_cts_api~confirm_transport_messages.
+ 
+    TYPES: BEGIN OF ty_s_message,
+             id TYPE symsgid,
+             ty TYPE symsgty,
+             no TYPE symsgno,
+             v1 TYPE symsgv,
+             v2 TYPE symsgv,
+             v3 TYPE symsgv,
+             v4 TYPE symsgv,
+           END OF ty_s_message.
+ 
+    DATA ls_message TYPE ty_s_message.
+ 
+    FIELD-SYMBOLS: <lt_confirmed_messages> TYPE STANDARD TABLE.
+ 
+    IF mv_confirm_transp_msgs_called = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " remember the call to avoid duplicates in GT_CONFIRMED_MESSAGES
+    mv_confirm_transp_msgs_called = abap_true.
+ 
+ 
+    " Auto-confirm certain messages (requires SAP Note 1609940)
+    PERFORM dummy IN PROGRAM saplstrd IF FOUND.  "load function group STRD once into memory
+ 
+    ASSIGN ('(SAPLSTRD)GT_CONFIRMED_MESSAGES') TO <lt_confirmed_messages>.
+ 
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    " Object can only be created in package of namespace
+    ls_message-id = 'TR'.
+    ls_message-no = '007'.
+    INSERT ls_message INTO TABLE <lt_confirmed_messages>.
+ 
+    " Original system set to "SAP"
+    ls_message-id = 'TR'.
+    ls_message-no = '013'.
+    INSERT ls_message INTO TABLE <lt_confirmed_messages>.
+ 
+    " Make repairs in foreign namespaces only if they are urgent
+    ls_message-id = 'TR'.
+    ls_message-no = '852'.
+    INSERT ls_message INTO TABLE <lt_confirmed_messages>.
+ 
+    " Make repairs in foreign namespaces only if they are urgent
+    ls_message-id = 'TK'.
+    ls_message-no = '016'.
+    INSERT ls_message INTO TABLE <lt_confirmed_messages>.
+ 
+    rv_messages_confirmed = abap_true.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/zcl_abapgit_default_transport.clas.abap.html b/src/cts/zcl_abapgit_default_transport.clas.abap.html new file mode 100644 index 00000000000..7de7e9a489b --- /dev/null +++ b/src/cts/zcl_abapgit_default_transport.clas.abap.html @@ -0,0 +1,763 @@ + + + + + + Code coverage report for src/cts/zcl_abapgit_default_transport.clas.abap + + + + + + + + + +
+
+

All files / src/cts zcl_abapgit_default_transport.clas.abap

+
+ +
+ 53.09% + Statements + 120/226 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 53.09% + Lines + 120/226 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +2271x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x + 
CLASS zcl_abapgit_default_transport DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      get_instance
+        RETURNING
+          VALUE(ro_instance) TYPE REF TO zcl_abapgit_default_transport
+        RAISING
+          zcx_abapgit_exception.
+ 
+    METHODS:
+      constructor
+        RAISING
+          zcx_abapgit_exception,
+ 
+      set
+        IMPORTING
+          iv_transport TYPE trkorr
+        RAISING
+          zcx_abapgit_exception,
+ 
+      reset
+        RAISING
+          zcx_abapgit_exception,
+      get
+        RETURNING
+          VALUE(rs_default_task) TYPE e070use
+        RAISING
+          zcx_abapgit_exception .
+ 
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_instance TYPE REF TO zcl_abapgit_default_transport .
+    DATA mv_is_set_by_abapgit TYPE abap_bool .
+    DATA ms_save TYPE e070use .
+ 
+    METHODS store
+      RAISING
+        zcx_abapgit_exception .
+    METHODS restore
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_internal
+      IMPORTING
+        !iv_transport TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    METHODS clear
+      IMPORTING
+        !is_default_task TYPE e070use
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_default_transport IMPLEMENTATION.
+ 
+ 
+  METHOD clear.
+
+    CALL FUNCTION 'TR_TASK_RESET'
+      EXPORTING
+        iv_username      = is_default_task-username
+        iv_order         = is_default_task-ordernum
+        iv_task          = is_default_task-tasknum
+        iv_dialog        = abap_false
+      EXCEPTIONS
+        invalid_username = 1
+        invalid_order    = 2
+        invalid_task     = 3
+        OTHERS           = 4.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    store( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get.
+ 
+    DATA: lt_e070use TYPE STANDARD TABLE OF e070use.
+ 
+    CALL FUNCTION 'TR_TASK_GET'
+      TABLES
+        tt_e070use       = lt_e070use
+      EXCEPTIONS
+        invalid_username = 1
+        invalid_category = 2
+        invalid_client   = 3
+        OTHERS           = 4.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    READ TABLE lt_e070use INTO rs_default_task
+                          INDEX 1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    IF go_instance IS NOT BOUND.
+      CREATE OBJECT go_instance.
+    ENDIF.
+ 
+    ro_instance = go_instance.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reset.
+
+    DATA: ls_default_task TYPE e070use.
+
+    IF mv_is_set_by_abapgit = abap_false.
+      " if the default transport request task isn't set
+      " by us there is nothing to do.
+      RETURN.
+    ENDIF.
+
+    CLEAR mv_is_set_by_abapgit.
+
+    ls_default_task = get( ).
+
+    IF ls_default_task IS NOT INITIAL.
+
+      clear( ls_default_task ).
+
+    ENDIF.
+
+    restore( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD restore.
+
+    IF ms_save IS INITIAL.
+      " There wasn't a default transport request before
+      " so we needn't restore anything.
+      RETURN.
+    ENDIF.
+
+    CALL FUNCTION 'TR_TASK_SET'
+      EXPORTING
+        iv_order          = ms_save-ordernum
+        iv_task           = ms_save-tasknum
+      EXCEPTIONS
+        invalid_username  = 1
+        invalid_category  = 2
+        invalid_client    = 3
+        invalid_validdays = 4
+        invalid_order     = 5
+        invalid_task      = 6
+        OTHERS            = 7.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set.
+
+    " checks whether object changes of the package are rerorded in transport
+    " requests. If true then we set the default task, so that no annoying
+    " transport request popups are shown while deserializing.
+
+    IF mv_is_set_by_abapgit = abap_true.
+      " the default transport request task is already set by us
+      " -> no reason to do it again.
+      RETURN.
+    ENDIF.
+
+    IF iv_transport IS INITIAL.
+      zcx_abapgit_exception=>raise( |No transport request was supplied| ).
+    ENDIF.
+
+    set_internal( iv_transport ).
+
+    mv_is_set_by_abapgit = abap_true.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_internal.
+
+    CALL FUNCTION 'TR_TASK_SET'
+      EXPORTING
+        iv_order          = iv_transport
+        iv_validdays      = 1
+      EXCEPTIONS
+        invalid_username  = 1
+        invalid_category  = 2
+        invalid_client    = 3
+        invalid_validdays = 4
+        invalid_order     = 5
+        invalid_task      = 6
+        OTHERS            = 7.
+
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD store.
+
+    ms_save = get( ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/zcl_abapgit_transport.clas.abap.html b/src/cts/zcl_abapgit_transport.clas.abap.html new file mode 100644 index 00000000000..8e09a9fbd3e --- /dev/null +++ b/src/cts/zcl_abapgit_transport.clas.abap.html @@ -0,0 +1,1456 @@ + + + + + + Code coverage report for src/cts/zcl_abapgit_transport.clas.abap + + + + + + + + + +
+
+

All files / src/cts zcl_abapgit_transport.clas.abap

+
+ +
+ 100% + Statements + 457/457 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 457/457 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +4581x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_transport DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+* todo, add interfaces for this class, consider merging zcl_abapgit_transport_mass into this class?
+    CLASS-METHODS zip
+      IMPORTING
+        !iv_show_log_popup TYPE abap_bool DEFAULT abap_true
+        !iv_logic          TYPE string OPTIONAL
+        !is_trkorr         TYPE trwbo_request_header OPTIONAL
+      RETURNING
+        VALUE(rv_xstr)     TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS to_tadir
+      IMPORTING
+        !it_transport_headers TYPE trwbo_request_headers
+        !iv_deleted_objects   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_tadir)       TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS add_all_objects_to_trans_req
+      IMPORTING
+        iv_key TYPE zif_abapgit_persistence=>ty_value
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS read
+      IMPORTING
+        !is_trkorr        TYPE trwbo_request_header OPTIONAL
+      RETURNING
+        VALUE(rs_request) TYPE trwbo_request
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS validate_transport_request
+      IMPORTING
+        iv_transport_request TYPE trkorr
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS read_requests
+      IMPORTING
+        !it_trkorr         TYPE trwbo_request_headers
+      RETURNING
+        VALUE(rt_requests) TYPE trwbo_requests
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS find_top_package
+      IMPORTING
+        !it_tadir         TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RETURNING
+        VALUE(rv_package) TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS resolve
+      IMPORTING
+        !it_requests        TYPE trwbo_requests
+        !iv_deleted_objects TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_tadir)     TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+    CLASS-METHODS collect_all_objects
+      IMPORTING
+        iv_key            TYPE zif_abapgit_persistence=>ty_value
+      RETURNING
+        VALUE(rt_objects) TYPE tr_objects
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS show_log
+      IMPORTING
+        it_log   TYPE sprot_u_tab
+        iv_title TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_transport IMPLEMENTATION.
+ 
+ 
+  METHOD add_all_objects_to_trans_req.
+ 
+    DATA:
+      ls_request      TYPE trwbo_request_header,
+      lt_e071         TYPE tr_objects,
+      lv_text         TYPE string,
+      lv_answer       TYPE c LENGTH 1,
+      lv_lock_objects TYPE trparflag,
+      lt_log          TYPE sprot_u_tab.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+                    iv_titlebar              = `Lock objects?`
+                    iv_text_question         = `Shall all objects be locked in the transport request?`
+                    iv_display_cancel_button = abap_true ).
+ 
+    CASE lv_answer.
+      WHEN '1'.
+        lv_lock_objects = abap_true.
+      WHEN '2'.
+        lv_lock_objects = abap_false.
+      WHEN OTHERS.
+        RETURN.
+    ENDCASE.
+ 
+    lt_e071 = collect_all_objects( iv_key ).
+ 
+    " We used TR_REQUEST_CHOICE before, but it issues its error log with
+    " write lists which are not compatible with abapGit.
+    " There we user TRINT_REQUEST_CHOICE which returns the error log
+    " and display the log ourselve.
+    CALL FUNCTION 'TRINT_REQUEST_CHOICE'
+      EXPORTING
+        iv_request_types     = 'FTCOK'
+        iv_lock_objects      = lv_lock_objects
+        iv_with_error_log    = abap_false
+      IMPORTING
+        es_request           = ls_request
+        et_log               = lt_log
+      TABLES
+        it_e071              = lt_e071
+      EXCEPTIONS
+        invalid_request      = 1
+        invalid_request_type = 2
+        user_not_owner       = 3
+        no_objects_appended  = 4
+        enqueue_error        = 5
+        cancelled_by_user    = 6
+        recursive_call       = 7
+        OTHERS               = 8.
+    IF sy-subrc = 0.
+      lv_text = |Objects successfully added to { ls_request-trkorr }|.
+      MESSAGE lv_text TYPE 'S'.
+      RETURN.
+    ENDIF.
+ 
+    IF lines( lt_log ) > 0.
+      show_log(
+          it_log   = lt_log
+          iv_title = `Error log` ).
+    ELSE.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD collect_all_objects.
+ 
+    DATA:
+      lt_objects     TYPE scts_tadir,
+      lt_objects_all LIKE lt_objects,
+      ls_e071        LIKE LINE OF rt_objects,
+      lo_repo        TYPE REF TO zcl_abapgit_repo,
+      lv_package     TYPE zif_abapgit_persistence=>ty_repo-package,
+      lt_packages    TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    FIELD-SYMBOLS:
+      <lv_package> TYPE devclass,
+      <ls_object>  TYPE tadir.
+ 
+    lo_repo    ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    lv_package  = lo_repo->get_package( ).
+    lt_packages = zcl_abapgit_factory=>get_sap_package( lv_package )->list_subpackages( ).
+    INSERT lv_package INTO TABLE lt_packages.
+ 
+    LOOP AT lt_packages ASSIGNING <lv_package>.
+ 
+      CLEAR: lt_objects.
+ 
+      CALL FUNCTION 'TRINT_SELECT_OBJECTS'
+        EXPORTING
+          iv_devclass       = <lv_package>
+          iv_via_selscreen  = abap_false
+        IMPORTING
+          et_objects_tadir  = lt_objects
+        EXCEPTIONS
+          cancelled_by_user = 1
+          invalid_input     = 2
+          OTHERS            = 3.
+ 
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      INSERT LINES OF lt_objects INTO TABLE lt_objects_all.
+ 
+    ENDLOOP.
+ 
+    IF lines( lt_objects_all ) = 0.
+      zcx_abapgit_exception=>raise( |No objects found| ).
+    ENDIF.
+ 
+    LOOP AT lt_objects_all ASSIGNING <ls_object>.
+ 
+      CLEAR: ls_e071.
+ 
+      MOVE-CORRESPONDING <ls_object> TO ls_e071.
+      INSERT ls_e071 INTO TABLE rt_objects.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_top_package.
+* assumption: all objects in transport share a common super package
+ 
+    DATA: lt_obj   TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+          lt_super TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+          lv_super LIKE LINE OF lt_super,
+          lv_index TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
+ 
+ 
+    READ TABLE it_tadir INDEX 1 ASSIGNING <ls_tadir>.
+    ASSERT sy-subrc = 0.
+    lt_super = zcl_abapgit_factory=>get_sap_package( <ls_tadir>-devclass )->list_superpackages( ).
+ 
+    LOOP AT it_tadir ASSIGNING <ls_tadir>.
+      lt_obj = zcl_abapgit_factory=>get_sap_package( <ls_tadir>-devclass )->list_superpackages( ).
+ 
+* filter out possibilities from lt_super
+      LOOP AT lt_super INTO lv_super.
+        lv_index = sy-tabix.
+        READ TABLE lt_obj FROM lv_super TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          DELETE lt_super INDEX lv_index.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    READ TABLE lt_super INDEX lines( lt_super ) INTO rv_package.
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    rs_request-h-trkorr = is_trkorr-trkorr.
+ 
+    CALL FUNCTION 'TRINT_READ_REQUEST'
+      EXPORTING
+        iv_read_e070       = abap_true
+        iv_read_e07t       = abap_true
+        iv_read_e070c      = abap_true
+        iv_read_e070m      = abap_true
+        iv_read_objs_keys  = abap_true
+        iv_read_objs       = abap_true
+        iv_read_attributes = abap_true
+      CHANGING
+        cs_request         = rs_request
+      EXCEPTIONS
+        error_occured      = 1
+        OTHERS             = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_requests.
+    DATA lt_requests LIKE rt_requests.
+    FIELD-SYMBOLS <ls_trkorr> LIKE LINE OF it_trkorr.
+ 
+    LOOP AT it_trkorr ASSIGNING <ls_trkorr>.
+      CALL FUNCTION 'TR_READ_REQUEST_WITH_TASKS'
+        EXPORTING
+          iv_trkorr     = <ls_trkorr>-trkorr
+        IMPORTING
+          et_requests   = lt_requests
+        EXCEPTIONS
+          invalid_input = 1
+          OTHERS        = 2.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      APPEND LINES OF lt_requests TO rt_requests.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve.
+    DATA: lv_object    TYPE tadir-object,
+          lv_obj_name  TYPE tadir-obj_name,
+          ls_tadir     TYPE zif_abapgit_definitions=>ty_tadir,
+          lv_result    TYPE trpari-s_checked,
+          ls_tadir_sap TYPE tadir.
+ 
+    FIELD-SYMBOLS: <ls_request> LIKE LINE OF it_requests,
+                   <ls_object>  LIKE LINE OF <ls_request>-objects.
+ 
+ 
+    LOOP AT it_requests ASSIGNING <ls_request>.
+      LOOP AT <ls_request>-objects ASSIGNING <ls_object>.
+        " VARX, see https://github.com/abapGit/abapGit/issues/3107
+        IF <ls_object>-pgmid = 'LIMU' AND <ls_object>-object <> 'VARX'.
+          CALL FUNCTION 'TR_CHECK_TYPE'
+            EXPORTING
+              wi_e071   = <ls_object>
+            IMPORTING
+              we_tadir  = ls_tadir_sap
+              pe_result = lv_result.
+          IF lv_result NA 'TL' OR ls_tadir_sap IS INITIAL.
+            zcx_abapgit_exception=>raise( 'error from TR_CHECK_TYPE' ).
+          ENDIF.
+          lv_object   = ls_tadir_sap-object.
+          lv_obj_name = ls_tadir_sap-obj_name.
+        ELSE.
+          lv_object   = <ls_object>-object.
+          lv_obj_name = <ls_object>-obj_name.
+        ENDIF.
+ 
+        ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
+          iv_object   = lv_object
+          iv_obj_name = lv_obj_name ).
+ 
+        IF ls_tadir-delflag IS INITIAL OR iv_deleted_objects = abap_true.
+          APPEND ls_tadir TO rt_tadir.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    SORT rt_tadir BY object ASCENDING obj_name ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM rt_tadir COMPARING object obj_name.
+    DELETE rt_tadir WHERE table_line IS INITIAL.
+  ENDMETHOD.
+ 
+ 
+  METHOD show_log.
+ 
+    DATA: li_log     TYPE REF TO zif_abapgit_log,
+          lv_message TYPE string.
+    FIELD-SYMBOLS: <ls_log> TYPE sprot_u.
+ 
+    CREATE OBJECT li_log TYPE zcl_abapgit_log
+      EXPORTING
+        iv_title = iv_title.
+ 
+    LOOP AT it_log ASSIGNING <ls_log>.
+ 
+      MESSAGE ID <ls_log>-ag TYPE <ls_log>-severity NUMBER <ls_log>-msgnr
+       WITH <ls_log>-var1 <ls_log>-var2 <ls_log>-var3 <ls_log>-var4
+       INTO lv_message.
+ 
+      li_log->add(
+          iv_msg  = lv_message
+          iv_type = <ls_log>-severity ).
+ 
+    ENDLOOP.
+ 
+    zcl_abapgit_log_viewer=>show_log( li_log ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_tadir.
+    DATA: lt_requests TYPE trwbo_requests.
+ 
+ 
+    IF lines( it_transport_headers ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    lt_requests = read_requests( it_transport_headers ).
+    rt_tadir = resolve(
+      it_requests        = lt_requests
+      iv_deleted_objects = iv_deleted_objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_transport_request.
+ 
+    CONSTANTS:
+      BEGIN OF c_tr_status,
+        modifiable                   TYPE trstatus VALUE 'D',
+        modifiable_protected         TYPE trstatus VALUE 'L',
+        release_started              TYPE trstatus VALUE 'O',
+        released                     TYPE trstatus VALUE 'R',
+        released_with_import_protect TYPE trstatus VALUE 'N', " Released (with Import Protection for Repaired Objects)
+      END OF c_tr_status.
+ 
+    DATA:
+      ls_trkorr  TYPE trwbo_request_header,
+      ls_request TYPE trwbo_request.
+ 
+    ls_trkorr-trkorr = iv_transport_request.
+ 
+    ls_request = read( ls_trkorr ).
+ 
+    IF  ls_request-h-trstatus <> c_tr_status-modifiable
+    AND ls_request-h-trstatus <> c_tr_status-modifiable_protected.
+      " Task/request &1 has already been released
+      MESSAGE e064(tk) WITH iv_transport_request INTO zcx_abapgit_exception=>null.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zip.
+ 
+    DATA: lt_requests       TYPE trwbo_requests,
+          lt_tadir          TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          lv_package        TYPE devclass,
+          lo_dot_abapgit    TYPE REF TO zcl_abapgit_dot_abapgit,
+          ls_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings,
+          lt_trkorr         TYPE trwbo_request_headers.
+ 
+ 
+    IF is_trkorr IS SUPPLIED.
+      APPEND is_trkorr TO lt_trkorr.
+    ELSE.
+      lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
+    ENDIF.
+ 
+    IF lines( lt_trkorr ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    lt_requests = read_requests( lt_trkorr ).
+    lt_tadir = resolve( lt_requests ).
+    IF lines( lt_tadir ) = 0.
+      zcx_abapgit_exception=>raise( 'empty transport' ).
+    ENDIF.
+ 
+    lv_package = find_top_package( lt_tadir ).
+    IF lv_package IS INITIAL.
+      zcx_abapgit_exception=>raise( 'error finding super package' ).
+    ENDIF.
+ 
+    lo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ).
+    IF iv_logic IS SUPPLIED AND iv_logic IS NOT INITIAL.
+      lo_dot_abapgit->set_folder_logic( iv_logic ).
+    ELSE.
+      lo_dot_abapgit->set_folder_logic( zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ) ).
+    ENDIF.
+ 
+    rv_xstr = zcl_abapgit_zip=>export(
+      iv_package        = lv_package
+      io_dot_abapgit    = lo_dot_abapgit
+      is_local_settings = ls_local_settings
+      it_filter         = lt_tadir
+      iv_show_log       = iv_show_log_popup ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/zcl_abapgit_transport_2_branch.clas.abap.html b/src/cts/zcl_abapgit_transport_2_branch.clas.abap.html new file mode 100644 index 00000000000..9026cd05ae7 --- /dev/null +++ b/src/cts/zcl_abapgit_transport_2_branch.clas.abap.html @@ -0,0 +1,349 @@ + + + + + + Code coverage report for src/cts/zcl_abapgit_transport_2_branch.clas.abap + + + + + + + + + +
+
+

All files / src/cts zcl_abapgit_transport_2_branch.clas.abap

+
+ +
+ 55.68% + Statements + 49/88 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 55.68% + Lines + 49/88 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +891x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_transport_2_branch DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS create
+      IMPORTING
+        !io_repository          TYPE REF TO zcl_abapgit_repo_online
+        !is_transport_to_branch TYPE zif_abapgit_definitions=>ty_transport_to_branch
+        !it_transport_objects   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    METHODS generate_commit_message
+      IMPORTING
+        !is_transport_to_branch TYPE zif_abapgit_definitions=>ty_transport_to_branch
+      RETURNING
+        VALUE(rs_comment)       TYPE zif_abapgit_git_definitions=>ty_comment .
+    METHODS stage_transport_objects
+      IMPORTING
+        !it_transport_objects TYPE zif_abapgit_definitions=>ty_tadir_tt
+        !io_stage             TYPE REF TO zcl_abapgit_stage
+        !is_stage_objects     TYPE zif_abapgit_definitions=>ty_stage_files
+        !it_object_statuses   TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_TRANSPORT_2_BRANCH IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    DATA:
+      lv_branch_name     TYPE string,
+      ls_comment         TYPE zif_abapgit_git_definitions=>ty_comment,
+      lo_stage           TYPE REF TO zcl_abapgit_stage,
+      ls_stage_objects   TYPE zif_abapgit_definitions=>ty_stage_files,
+      lt_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt.
+
+    lv_branch_name = zcl_abapgit_git_branch_list=>complete_heads_branch_name(
+        zcl_abapgit_git_branch_list=>normalize_branch_name( is_transport_to_branch-branch_name ) ).
+
+    io_repository->create_branch( lv_branch_name ).
+
+    CREATE OBJECT lo_stage.
+
+    ls_stage_objects = zcl_abapgit_factory=>get_stage_logic( )->get( io_repository ).
+
+    lt_object_statuses = io_repository->status( ).
+
+    stage_transport_objects(
+       it_transport_objects = it_transport_objects
+       io_stage             = lo_stage
+       is_stage_objects     = ls_stage_objects
+       it_object_statuses   = lt_object_statuses ).
+
+    ls_comment = generate_commit_message( is_transport_to_branch ).
+
+    io_repository->push( is_comment = ls_comment
+                         io_stage   = lo_stage ).
+  ENDMETHOD.
+ 
+ 
+  METHOD generate_commit_message.
+    rs_comment-committer-name  = sy-uname.
+    rs_comment-committer-email = |{ rs_comment-committer-name }@localhost|.
+    rs_comment-comment         = is_transport_to_branch-commit_text.
+  ENDMETHOD.
+ 
+ 
+  METHOD stage_transport_objects.
+    DATA lo_transport_objects TYPE REF TO zcl_abapgit_transport_objects.
+    CREATE OBJECT lo_transport_objects
+      EXPORTING
+        it_transport_objects = it_transport_objects.
+
+    lo_transport_objects->to_stage(
+      io_stage           = io_stage
+      is_stage_objects   = is_stage_objects
+      it_object_statuses = it_object_statuses ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/zcl_abapgit_transport_mass.clas.abap.html b/src/cts/zcl_abapgit_transport_mass.clas.abap.html new file mode 100644 index 00000000000..57d256e8d17 --- /dev/null +++ b/src/cts/zcl_abapgit_transport_mass.clas.abap.html @@ -0,0 +1,289 @@ + + + + + + Code coverage report for src/cts/zcl_abapgit_transport_mass.clas.abap + + + + + + + + + +
+
+

All files / src/cts zcl_abapgit_transport_mass.clas.abap

+
+ +
+ 100% + Statements + 68/68 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 68/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_transport_mass DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_transport
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS run .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_transport_mass IMPLEMENTATION.
+ 
+ 
+  METHOD run.
+ 
+    DATA:
+      lt_trkorr           TYPE trwbo_request_headers,
+      lo_transport_zipper TYPE REF TO lcl_transport_zipper,
+      lx_except           TYPE REF TO cx_root,
+      lv_folder           TYPE string,
+      lv_text             TYPE string.
+ 
+    TRY.
+ 
+        lt_trkorr = lcl_gui=>select_tr_requests( ).
+ 
+        IF lt_trkorr[] IS NOT INITIAL.
+ 
+          lv_folder = lcl_gui=>f4_folder( ).
+ 
+          IF lv_folder IS INITIAL.
+* Empty folder
+            zcx_abapgit_exception=>raise( 'Empty destination folder' ).
+          ENDIF.
+ 
+* Instantiate transport zipper object that will also create the timestamped output folder
+          CREATE OBJECT lo_transport_zipper TYPE lcl_transport_zipper
+            EXPORTING
+              iv_folder = lv_folder.
+ 
+* Generate the local zip files from the given list of transport requests
+          lo_transport_zipper->generate_files(
+            it_trkorr = lt_trkorr
+            ig_logic  = zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ) ).
+ 
+* Open output folder if user asked it
+          lcl_gui=>open_folder_frontend( lo_transport_zipper->get_folder( ) ).
+ 
+        ELSE.
+* No data found for the provided selection criterias
+          zcx_abapgit_exception=>raise( 'No transport requests selected' ).
+        ENDIF.
+ 
+      CATCH zcx_abapgit_exception INTO lx_except.
+ 
+        lv_text = lx_except->get_text( ).
+        MESSAGE lv_text TYPE 'S' DISPLAY LIKE 'E'.
+ 
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/zcl_abapgit_transport_mass.clas.locals_imp.abap.html b/src/cts/zcl_abapgit_transport_mass.clas.locals_imp.abap.html new file mode 100644 index 00000000000..04e8e827ded --- /dev/null +++ b/src/cts/zcl_abapgit_transport_mass.clas.locals_imp.abap.html @@ -0,0 +1,748 @@ + + + + + + Code coverage report for src/cts/zcl_abapgit_transport_mass.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/cts zcl_abapgit_transport_mass.clas.locals_imp.abap

+
+ +
+ 92.76% + Statements + 205/221 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 92.76% + Lines + 205/221 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +2221x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS lcl_gui DEFINITION FINAL.
+  PUBLIC SECTION.
+    CLASS-METHODS f4_folder
+      RETURNING
+        VALUE(rv_folder) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS open_folder_frontend
+      IMPORTING
+        iv_folder TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS select_tr_requests
+      RETURNING
+        VALUE(rt_trkorr) TYPE trwbo_request_headers.
+ 
+  PRIVATE SECTION.
+    CLASS-DATA gv_last_folder TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS lcl_gui IMPLEMENTATION.
+ 
+  METHOD f4_folder.
+ 
+    DATA: lv_title   TYPE string,
+          lo_fe_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    lo_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+    lv_title = 'Choose the destination folder for the ZIP files'.
+ 
+    lo_fe_serv->directory_browse(
+      EXPORTING
+         iv_window_title   = lv_title
+         iv_initial_folder = gv_last_folder
+      CHANGING
+        cv_selected_folder = rv_folder ).
+ 
+    "Store the last directory for user friendly UI
+    gv_last_folder = rv_folder.
+ 
+  ENDMETHOD.
+ 
+  METHOD open_folder_frontend.
+    IF iv_folder IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = iv_folder ).
+  ENDMETHOD.
+ 
+  METHOD select_tr_requests.
+ 
+    DATA: ls_popup     TYPE strhi_popup,
+          ls_selection TYPE trwbo_selection.
+ 
+    ls_popup-start_column = 5.
+    ls_popup-start_row    = 5.
+ 
+    " Prepare the selection
+    ls_selection-trkorrpattern = space.
+    ls_selection-client        = space.
+    ls_selection-stdrequest    = space.
+    ls_selection-reqfunctions  = 'K'.
+    ls_selection-reqstatus     = 'RNODL'.
+ 
+    " Call transport selection popup
+    CALL FUNCTION 'TRINT_SELECT_REQUESTS'
+      EXPORTING
+        iv_username_pattern    = '*'
+        iv_via_selscreen       = 'X'
+        is_selection           = ls_selection
+        iv_complete_projects   = space
+        iv_title               = 'ABAPGit Transport Mass Downloader'
+        is_popup               = ls_popup
+      IMPORTING
+        et_requests            = rt_trkorr
+      EXCEPTIONS
+        action_aborted_by_user = 1
+        OTHERS                 = 2.
+    IF sy-subrc <> 0.
+      CLEAR rt_trkorr.
+    ELSE.
+      SORT rt_trkorr BY trkorr.
+      DELETE ADJACENT DUPLICATES FROM rt_trkorr COMPARING trkorr.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_transport_zipper DEFINITION FINAL.
+  PUBLIC SECTION.
+    TYPES ty_folder TYPE string.
+    TYPES ty_filename TYPE string.
+ 
+    CONSTANTS c_zip_ext TYPE string VALUE '.zip'.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_folder TYPE ty_folder
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS generate_files
+      IMPORTING
+        it_trkorr TYPE trwbo_request_headers
+        ig_logic  TYPE any
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_folder
+      RETURNING
+        VALUE(rv_full_folder) TYPE ty_folder.
+ 
+    CLASS-METHODS does_folder_exist
+      IMPORTING
+        iv_folder              TYPE string
+      RETURNING
+        VALUE(rv_folder_exist) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+    DATA: mv_timestamp   TYPE string,
+          mv_separator   TYPE c,
+          mv_full_folder TYPE ty_folder.
+ 
+    METHODS get_full_folder
+      IMPORTING
+        iv_folder             TYPE ty_folder
+      RETURNING
+        VALUE(rv_full_folder) TYPE ty_folder
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_filename
+      IMPORTING
+        is_trkorr          TYPE trwbo_request_header
+      RETURNING
+        VALUE(rv_filename) TYPE ty_filename.
+ 
+ENDCLASS.
+ 
+CLASS lcl_transport_zipper IMPLEMENTATION.
+ 
+  METHOD constructor.
+    DATA lo_fe_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    lo_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    mv_timestamp = |{ sy-datlo }_{ sy-timlo }|.
+    mv_full_folder = get_full_folder( iv_folder ).
+ 
+    TRY.
+        lo_fe_serv->get_file_separator( CHANGING cv_file_separator = mv_separator ).
+      CATCH zcx_abapgit_exception.
+        "Default MS Windows separator
+        mv_separator = '\'.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD get_folder.
+    rv_full_folder = mv_full_folder.
+  ENDMETHOD.
+ 
+  METHOD does_folder_exist.
+    rv_folder_exist = zcl_abapgit_ui_factory=>get_frontend_services( )->directory_exist( iv_directory = iv_folder ).
+  ENDMETHOD.
+ 
+  METHOD get_full_folder.
+ 
+    DATA: lv_sep     TYPE c,
+          lv_rc      TYPE i,
+          lo_fe_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    lo_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lo_fe_serv->get_file_separator( CHANGING cv_file_separator = lv_sep ).
+    rv_full_folder = |{ iv_folder }{ lv_sep }{ mv_timestamp }|.
+ 
+    IF does_folder_exist( rv_full_folder ) = abap_false.
+      lo_fe_serv->directory_create(
+        EXPORTING
+          iv_directory = rv_full_folder
+        CHANGING
+          cv_rc        = lv_rc ).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD get_filename.
+ 
+    " Generate filename
+    rv_filename = |{ is_trkorr-trkorr }_{ is_trkorr-as4text }_{ mv_timestamp }{ c_zip_ext }|.
+ 
+    " Remove reserved characters (for Windows based systems)
+    TRANSLATE rv_filename USING '/ \ : " * > < ? | '.
+ 
+    rv_filename = |{ mv_full_folder }{ mv_separator }{ rv_filename }|.
+ 
+  ENDMETHOD.
+ 
+  METHOD generate_files.
+
+    DATA: ls_trkorr       LIKE LINE OF it_trkorr,
+          lv_zipbinstring TYPE xstring.
+
+    LOOP AT it_trkorr INTO ls_trkorr.
+
+      lv_zipbinstring = zcl_abapgit_transport_mass=>zip( is_trkorr         = ls_trkorr
+                                                         iv_logic          = ig_logic
+                                                         iv_show_log_popup = abap_false ).
+
+      zcl_abapgit_zip=>save_binstring_to_localfile( iv_binstring = lv_zipbinstring
+                                                    iv_filename  = get_filename( ls_trkorr ) ).
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/zcl_abapgit_transport_objects.clas.abap.html b/src/cts/zcl_abapgit_transport_objects.clas.abap.html new file mode 100644 index 00000000000..36f2c6de53b --- /dev/null +++ b/src/cts/zcl_abapgit_transport_objects.clas.abap.html @@ -0,0 +1,358 @@ + + + + + + Code coverage report for src/cts/zcl_abapgit_transport_objects.clas.abap + + + + + + + + + +
+
+

All files / src/cts zcl_abapgit_transport_objects.clas.abap

+
+ +
+ 96.7% + Statements + 88/91 +
+ + +
+ 82.35% + Branches + 14/17 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 96.7% + Lines + 88/91 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +921x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +2x +2x +  +5x +5x +5x +5x +5x +5x +5x +1x +1x +  +4x +4x +4x +4x +4x +15x +15x +15x +15x +15x +15x +15x +15x +1x +1x +  +15x +15x +15x +15x +15x +15x +15x +11x +1x +1x +1x +1x +15x +11x +1x + 
CLASS zcl_abapgit_transport_objects DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_transport_objects TYPE zif_abapgit_definitions=>ty_tadir_tt .
+    METHODS to_stage
+      IMPORTING
+        !io_stage           TYPE REF TO zcl_abapgit_stage
+        !is_stage_objects   TYPE zif_abapgit_definitions=>ty_stage_files
+        !it_object_statuses TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_transport_objects TYPE zif_abapgit_definitions=>ty_tadir_tt .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_transport_objects IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mt_transport_objects = it_transport_objects.
+  ENDMETHOD.
+ 
+ 
+  METHOD to_stage.
+    DATA: ls_transport_object LIKE LINE OF mt_transport_objects,
+          ls_local_file       TYPE zif_abapgit_definitions=>ty_file_item,
+          ls_object_status    TYPE zif_abapgit_definitions=>ty_result.
+ 
+    LOOP AT mt_transport_objects INTO ls_transport_object.
+      LOOP AT it_object_statuses INTO ls_object_status
+          WHERE obj_name = ls_transport_object-obj_name
+          AND obj_type = ls_transport_object-object
+          AND NOT lstate IS INITIAL.
+ 
+        CASE ls_object_status-lstate.
+          WHEN zif_abapgit_definitions=>c_state-added OR zif_abapgit_definitions=>c_state-modified.
+            IF ls_transport_object-delflag = abap_true.
+              zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name
+                } should be added/modified, but has deletion flag in transport| ).
+            ENDIF.
+ 
+            READ TABLE is_stage_objects-local
+                  INTO ls_local_file
+              WITH KEY item-obj_name = ls_transport_object-obj_name
+                       item-obj_type = ls_transport_object-object
+                       file-filename = ls_object_status-filename.
+            IF sy-subrc <> 0.
+              zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name
+                } not found in the local repository files| ).
+            ELSE.
+              io_stage->add(
+                iv_path     = ls_local_file-file-path
+                iv_filename = ls_local_file-file-filename
+                iv_data     = ls_local_file-file-data ).
+            ENDIF.
+          WHEN zif_abapgit_definitions=>c_state-deleted.
+* SUSC, see https://github.com/abapGit/abapGit/issues/2772
+            IF ls_transport_object-delflag = abap_false
+                AND ls_transport_object-object <> 'SUSC'
+                AND ls_transport_object-object <> 'IWOM'
+                AND ls_transport_object-object <> 'IWMO'
+                AND ls_transport_object-object <> 'IWSG'
+                AND ls_transport_object-object <> 'IWSV'.
+              zcx_abapgit_exception=>raise( |Object { ls_transport_object-obj_name
+                } should be removed, but has NO deletion flag in transport| ).
+            ENDIF.
+            io_stage->rm(
+              iv_path     = ls_object_status-path
+              iv_filename = ls_object_status-filename ).
+          WHEN OTHERS.
+            ASSERT 0 = 1. "Unexpected state
+        ENDCASE.
+      ENDLOOP.
+      IF sy-subrc <> 0.
+        " Since not all objects in a transport might be in the local repo
+        " i.e generated SADL objects, we don't add these objects to
+        " the stage.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/cts/zcl_abapgit_transport_objects.clas.testclasses.abap.html b/src/cts/zcl_abapgit_transport_objects.clas.testclasses.abap.html new file mode 100644 index 00000000000..14faa10d59b --- /dev/null +++ b/src/cts/zcl_abapgit_transport_objects.clas.testclasses.abap.html @@ -0,0 +1,1453 @@ + + + + + + Code coverage report for src/cts/zcl_abapgit_transport_objects.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/cts zcl_abapgit_transport_objects.clas.testclasses.abap

+
+ +
+ 99.12% + Statements + 452/456 +
+ + +
+ 93.75% + Branches + 30/32 +
+ + +
+ 100% + Functions + 25/25 +
+ + +
+ 99.12% + Lines + 452/456 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +4571x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +15x +15x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +15x +15x +15x +15x +15x +15x +1x +1x +17x +17x +17x +17x +17x +17x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +15x +15x +15x +15x +15x +15x +15x +11x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +  +4x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +3x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +1x +1x + 
 
+CLASS ltcl_transport_objects DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      add_new_to_local_files         FOR TESTING RAISING cx_static_check,
+      modified_to_new_local_files    FOR TESTING RAISING cx_static_check,
+      transport_not_in_repository    FOR TESTING RAISING cx_static_check,
+      object_not_in_local_files      FOR TESTING RAISING cx_static_check,
+      cant_be_added_with_del_flag    FOR TESTING RAISING cx_static_check,
+      cant_be_modified_with_del_flag FOR TESTING RAISING cx_static_check,
+      deleted_to_removed_files       FOR TESTING RAISING cx_static_check,
+      should_remove_no_delflag_iwmo FOR TESTING RAISING cx_static_check,
+      should_remove_no_delflag_iwom FOR TESTING RAISING cx_static_check,
+      should_remove_no_delflag_iwsg FOR TESTING RAISING cx_static_check,
+      should_remove_no_delflag_iwsv FOR TESTING RAISING cx_static_check,
+      should_remove_no_delflag_susc FOR TESTING RAISING cx_static_check,
+      shouldnt_remove_no_delflag FOR TESTING RAISING cx_static_check,
+      should_add_all_local_files FOR TESTING RAISING cx_static_check,
+      should_delete_all_related  FOR TESTING RAISING cx_static_check,
+      setup,
+      given_the_transport_object
+        IMPORTING iv_obj_name TYPE string
+                  iv_obj_type TYPE string
+                  iv_delflag  TYPE abap_bool OPTIONAL,
+      given_the_object_status
+        IMPORTING
+          iv_obj_name TYPE string OPTIONAL
+          iv_obj_type TYPE string OPTIONAL
+          iv_filename TYPE string OPTIONAL
+          iv_path     TYPE string OPTIONAL
+          iv_lstate   TYPE char1,
+      given_the_local_file
+        IMPORTING iv_obj_name          TYPE string
+                  iv_obj_type          TYPE string
+                  iv_filename          TYPE string
+                  iv_path              TYPE string
+                  iv_data              TYPE string
+        RETURNING VALUE(rs_local_file) TYPE zif_abapgit_definitions=>ty_file_item,
+      when_staging
+        RAISING zcx_abapgit_exception,
+      then_file_should_be_added
+        IMPORTING
+          is_local_file TYPE zif_abapgit_definitions=>ty_file_item,
+      then_it_should_raise_exception
+        IMPORTING
+          iv_with_text TYPE string,
+      then_it_should_remove_at_stage
+        IMPORTING
+          iv_filename TYPE string
+          iv_path     TYPE string,
+      then_it_should_not_raise_excpt.
+ 
+    DATA: mo_transport_objects TYPE REF TO zcl_abapgit_transport_objects,
+          mt_transport_objects TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          mt_object_statuses   TYPE zif_abapgit_definitions=>ty_results_tt,
+          ms_stage_objects     TYPE zif_abapgit_definitions=>ty_stage_files,
+          mo_stage             TYPE REF TO zcl_abapgit_stage.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_transport_objects IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_stage.
+  ENDMETHOD.
+ 
+  METHOD add_new_to_local_files.
+    DATA ls_local_file TYPE zif_abapgit_definitions=>ty_file_item.
+ 
+    given_the_transport_object(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS' ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_filename   = 'CL_FOO.abap'
+      iv_lstate     = zif_abapgit_definitions=>c_state-added ).
+ 
+    ls_local_file = given_the_local_file(
+      iv_obj_name = 'CL_FOO'
+      iv_obj_type = 'CLAS'
+      iv_filename = 'CL_FOO.abap'
+      iv_path     = '/path'
+      iv_data     = 'data' ).
+ 
+    when_staging( ).
+ 
+    then_file_should_be_added( ls_local_file ).
+  ENDMETHOD.
+  METHOD modified_to_new_local_files.
+    DATA ls_local_file TYPE zif_abapgit_definitions=>ty_file_item.
+    given_the_transport_object(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS' ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_filename   = 'CL_FOO.abap'
+      iv_lstate     = zif_abapgit_definitions=>c_state-modified ).
+ 
+    ls_local_file = given_the_local_file(
+      iv_obj_name = 'CL_FOO'
+      iv_obj_type = 'CLAS'
+      iv_filename = 'CL_FOO.abap'
+      iv_path     = '/path'
+      iv_data     = 'data' ).
+ 
+    when_staging( ).
+ 
+    then_file_should_be_added( ls_local_file ).
+  ENDMETHOD.
+  METHOD should_add_all_local_files.
+    "Not only .abap, but also .xml and other includes
+    DATA ls_abap_local_file TYPE zif_abapgit_definitions=>ty_file_item.
+    DATA ls_xml_local_file  TYPE zif_abapgit_definitions=>ty_file_item.
+ 
+    given_the_transport_object(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS' ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_filename   = 'CL_FOO.abap'
+      iv_lstate     = zif_abapgit_definitions=>c_state-modified ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_filename   = 'CL_FOO.xml'
+      iv_lstate     = zif_abapgit_definitions=>c_state-modified ).
+ 
+    ls_abap_local_file = given_the_local_file(
+      iv_obj_name = 'CL_FOO'
+      iv_obj_type = 'CLAS'
+      iv_filename = 'CL_FOO.abap'
+      iv_path     = '/path'
+      iv_data     = 'data' ).
+ 
+    ls_xml_local_file = given_the_local_file(
+      iv_obj_name = 'CL_FOO'
+      iv_obj_type = 'CLAS'
+      iv_filename = 'CL_FOO.xml'
+      iv_path     = '/path'
+      iv_data     = 'data' ).
+ 
+    when_staging( ).
+ 
+    then_file_should_be_added( ls_abap_local_file ).
+    then_file_should_be_added( ls_xml_local_file ).
+  ENDMETHOD.
+  METHOD transport_not_in_repository.
+    given_the_transport_object(
+      iv_obj_name   = 'CL_A_CLASS_NOT_IN_REPO'
+      iv_obj_type   = 'CLAS' ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_lstate     = zif_abapgit_definitions=>c_state-added ).
+ 
+    then_it_should_not_raise_excpt( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD object_not_in_local_files.
+ 
+    given_the_transport_object(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS' ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_lstate     = zif_abapgit_definitions=>c_state-added ).
+ 
+    given_the_local_file(
+      iv_obj_name = 'CL_ANOTHER_LOCAL_FILE'
+      iv_obj_type = 'CLAS'
+      iv_filename = 'CL_FOO.abap'
+      iv_path     = '/path'
+      iv_data     = 'data' ).
+    then_it_should_raise_exception( 'Object CL_FOO not found in the local repository files' ).
+  ENDMETHOD.
+ 
+  METHOD cant_be_added_with_del_flag.
+    given_the_transport_object(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_delflag    = abap_true ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_lstate     = zif_abapgit_definitions=>c_state-added ).
+ 
+    then_it_should_raise_exception( 'Object CL_FOO should be added/modified, but has deletion flag in transport' ).
+  ENDMETHOD.
+ 
+  METHOD cant_be_modified_with_del_flag.
+    given_the_transport_object(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_delflag    = abap_true ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_lstate     = zif_abapgit_definitions=>c_state-modified ).
+ 
+    then_it_should_raise_exception( 'Object CL_FOO should be added/modified, but has deletion flag in transport' ).
+  ENDMETHOD.
+ 
+  METHOD deleted_to_removed_files.
+    given_the_transport_object(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_delflag    = abap_true ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_filename   = 'CL_FOO.abap'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    when_staging( ).
+ 
+    then_it_should_remove_at_stage(
+      iv_filename = 'CL_FOO.abap'
+      iv_path     = '/a_path' ).
+  ENDMETHOD.
+ 
+  METHOD should_delete_all_related.
+    "i.e. Should also delete the XMLs related to the transport objects
+    given_the_transport_object(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_delflag    = abap_true ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_filename   = 'CL_FOO.abap'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_filename   = 'CL_FOO.xml'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    when_staging( ).
+ 
+    then_it_should_remove_at_stage(
+      iv_filename = 'CL_FOO.abap'
+      iv_path     = '/a_path' ).
+ 
+    then_it_should_remove_at_stage(
+      iv_filename = 'CL_FOO.xml'
+      iv_path     = '/a_path' ).
+  ENDMETHOD.
+ 
+  METHOD should_remove_no_delflag_iwmo.
+    given_the_transport_object(
+       iv_obj_name   = 'ZFOO'
+       iv_obj_type   = 'IWMO'
+       iv_delflag    = abap_false ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'ZFOO'
+      iv_obj_type   = 'IWMO'
+      iv_filename   = 'zfoo.iwmo.xml'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    then_it_should_not_raise_excpt( ).
+  ENDMETHOD.
+ 
+  METHOD should_remove_no_delflag_iwom.
+    given_the_transport_object(
+       iv_obj_name   = 'ZFOO'
+       iv_obj_type   = 'IWOM'
+       iv_delflag    = abap_false ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'ZFOO'
+      iv_obj_type   = 'IWOM'
+      iv_filename   = 'zfoo.iwom.xml'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    then_it_should_not_raise_excpt( ).
+  ENDMETHOD.
+ 
+  METHOD should_remove_no_delflag_iwsg.
+    given_the_transport_object(
+       iv_obj_name   = 'ZFOO'
+       iv_obj_type   = 'IWSG'
+       iv_delflag    = abap_false ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'ZFOO'
+      iv_obj_type   = 'IWSG'
+      iv_filename   = 'zfoo.iwsg.xml'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    then_it_should_not_raise_excpt( ).
+  ENDMETHOD.
+ 
+  METHOD should_remove_no_delflag_iwsv.
+    given_the_transport_object(
+       iv_obj_name   = 'ZFOO'
+       iv_obj_type   = 'IWSV'
+       iv_delflag    = abap_false ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'ZFOO'
+      iv_obj_type   = 'IWSV'
+      iv_filename   = 'zfoo.iwsv.xml'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    then_it_should_not_raise_excpt( ).
+  ENDMETHOD.
+ 
+  METHOD should_remove_no_delflag_susc.
+    given_the_transport_object(
+       iv_obj_name   = 'ZFOO'
+       iv_obj_type   = 'SUSC'
+       iv_delflag    = abap_false ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'ZFOO'
+      iv_obj_type   = 'SUSC'
+      iv_filename   = 'zfoo.susc.xml'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    then_it_should_not_raise_excpt( ).
+  ENDMETHOD.
+ 
+  METHOD shouldnt_remove_no_delflag.
+    given_the_transport_object(
+       iv_obj_name   = 'CL_FOO'
+       iv_obj_type   = 'CLAS'
+       iv_delflag    = abap_false ).
+ 
+    given_the_object_status(
+      iv_obj_name   = 'CL_FOO'
+      iv_obj_type   = 'CLAS'
+      iv_filename   = 'CL_FOO.abap'
+      iv_path       = '/a_path'
+      iv_lstate     = zif_abapgit_definitions=>c_state-deleted ).
+ 
+    then_it_should_raise_exception( 'Object CL_FOO should be removed, but has NO deletion flag in transport' ).
+  ENDMETHOD.
+ 
+  METHOD given_the_transport_object.
+    DATA ls_transport_object TYPE zif_abapgit_definitions=>ty_tadir.
+    ls_transport_object-obj_name = iv_obj_name.
+    ls_transport_object-object   = iv_obj_type.
+    ls_transport_object-delflag  = iv_delflag.
+    APPEND ls_transport_object TO mt_transport_objects.
+  ENDMETHOD.
+ 
+  METHOD given_the_object_status.
+    DATA ls_object_status TYPE zif_abapgit_definitions=>ty_result.
+    ls_object_status-obj_name = iv_obj_name.
+    ls_object_status-obj_type = iv_obj_type.
+    ls_object_status-filename = iv_filename.
+    ls_object_status-path     = iv_path.
+    ls_object_status-lstate   = iv_lstate.
+    APPEND ls_object_status  TO mt_object_statuses.
+  ENDMETHOD.
+ 
+  METHOD given_the_local_file.
+    rs_local_file-item-obj_name = iv_obj_name.
+    rs_local_file-item-obj_type = iv_obj_type.
+    rs_local_file-file-filename = iv_filename.
+    rs_local_file-file-path     = iv_path.
+    rs_local_file-file-data     = iv_data.
+    APPEND rs_local_file TO ms_stage_objects-local.
+  ENDMETHOD.
+ 
+  METHOD when_staging.
+    CREATE OBJECT mo_transport_objects
+      EXPORTING
+        it_transport_objects = mt_transport_objects.
+    mo_transport_objects->to_stage(
+      io_stage           = mo_stage
+      is_stage_objects   = ms_stage_objects
+      it_object_statuses = mt_object_statuses ).
+  ENDMETHOD.
+ 
+  METHOD then_file_should_be_added.
+    DATA: lt_staged_objects TYPE zif_abapgit_definitions=>ty_stage_tt.
+    lt_staged_objects = mo_stage->get_all( ).
+ 
+    READ TABLE lt_staged_objects TRANSPORTING NO FIELDS
+      WITH KEY
+      file-filename = is_local_file-file-filename
+      file-path     = is_local_file-file-path
+      file-data     = is_local_file-file-data
+      method        = zif_abapgit_definitions=>c_method-add.
+    IF sy-subrc <> 0.
+      cl_abap_unit_assert=>fail( |Object { is_local_file-file-filename } not added to stage| ).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD then_it_should_raise_exception.
+    DATA: lx_exception TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        when_staging( ).
+        cl_abap_unit_assert=>fail( 'Should have raised exception' ).
+      CATCH zcx_abapgit_exception INTO lx_exception.
+        cl_abap_unit_assert=>assert_equals(
+          act = lx_exception->get_text( )
+          exp = iv_with_text ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD then_it_should_remove_at_stage.
+ 
+    DATA: lt_staged_objects TYPE zif_abapgit_definitions=>ty_stage_tt.
+ 
+    lt_staged_objects = mo_stage->get_all( ).
+ 
+    READ TABLE lt_staged_objects TRANSPORTING NO FIELDS
+      WITH KEY
+      file-filename  = iv_filename
+      file-path      = iv_path.
+    IF sy-subrc <> 0.
+      cl_abap_unit_assert=>fail( |Object { iv_filename } not removed in stage| ).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD then_it_should_not_raise_excpt.
+    DATA: lx_exception TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        when_staging( ).
+      CATCH zcx_abapgit_exception INTO lx_exception.
+        cl_abap_unit_assert=>fail( 'Should not have raised exception' ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/index.html b/src/data/index.html new file mode 100644 index 00000000000..0ac88383e25 --- /dev/null +++ b/src/data/index.html @@ -0,0 +1,281 @@ + + + + + + Code coverage report for src/data + + + + + + + + + +
+
+

All files src/data

+
+ +
+ 93.23% + Statements + 1530/1641 +
+ + +
+ 78.04% + Branches + 32/41 +
+ + +
+ 78.57% + Functions + 22/28 +
+ + +
+ 93.23% + Lines + 1530/1641 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_data_config.clas.abap +
+
88.57%124/140100%4/460%3/588.57%124/140
zcl_abapgit_data_config.clas.testclasses.abap +
+
100%105/105100%4/4100%4/4100%105/105
zcl_abapgit_data_deserializer.clas.abap +
+
77.93%272/34950%1/20%0/277.93%272/349
zcl_abapgit_data_deserializer.clas.testclasses.abap +
+
100%234/234100%4/4100%4/4100%234/234
zcl_abapgit_data_factory.clas.abap +
+
100%69/69100%1/1100%0/0100%69/69
zcl_abapgit_data_injector.clas.abap +
+
89.47%34/38100%1/133.33%1/389.47%34/38
zcl_abapgit_data_serializer.clas.abap +
+
93.43%128/13757.14%4/7100%0/093.43%128/137
zcl_abapgit_data_serializer.clas.testclasses.abap +
+
100%86/86100%4/4100%4/4100%86/86
zcl_abapgit_data_supporter.clas.abap +
+
97.56%80/8250%1/2100%1/197.56%80/82
zcl_abapgit_data_supporter.clas.testclasses.abap +
+
100%67/67100%2/2100%2/2100%67/67
zcl_abapgit_data_utils.clas.abap +
+
98.85%260/26342.85%3/7100%0/098.85%260/263
zcl_abapgit_data_utils.clas.testclasses.abap +
+
100%71/71100%3/3100%3/3100%71/71
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_config.clas.abap.html b/src/data/zcl_abapgit_data_config.clas.abap.html new file mode 100644 index 00000000000..b619bc24230 --- /dev/null +++ b/src/data/zcl_abapgit_data_config.clas.abap.html @@ -0,0 +1,505 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_config.clas.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_config.clas.abap

+
+ +
+ 88.57% + Statements + 124/140 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 60% + Functions + 3/5 +
+ + +
+ 88.57% + Lines + 124/140 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +1411x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x + 
CLASS zcl_abapgit_data_config DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_data_config .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_config TYPE zif_abapgit_data_config=>ty_config_tt .
+ 
+    METHODS dump
+      IMPORTING
+        !is_config     TYPE zif_abapgit_data_config=>ty_config
+      RETURNING
+        VALUE(rv_json) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_config IMPLEMENTATION.
+ 
+ 
+  METHOD dump.
+ 
+    DATA lo_ajson TYPE REF TO zcl_abapgit_ajson.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    TRY.
+        lo_ajson = zcl_abapgit_ajson=>create_empty( ).
+        lo_ajson->zif_abapgit_ajson~set(
+          iv_path = '/'
+          iv_val  = is_config ).
+        rv_json = zcl_abapgit_convert=>string_to_xstring_utf8( lo_ajson->stringify( 2 ) ).
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~add_config.
+ 
+    DATA lv_where TYPE string.
+ 
+    FIELD-SYMBOLS <ls_config> LIKE LINE OF mt_config.
+ 
+    ASSERT is_config-type IS NOT INITIAL.
+    ASSERT is_config-name IS NOT INITIAL.
+    ASSERT is_config-name = to_upper( is_config-name ).
+ 
+    INSERT is_config INTO TABLE mt_config.
+    IF sy-subrc <> 0.
+* append to existing
+      READ TABLE mt_config ASSIGNING <ls_config> WITH KEY type = is_config-type name = is_config-name.
+      ASSERT sy-subrc = 0.
+      LOOP AT is_config-where INTO lv_where.
+        READ TABLE <ls_config>-where TRANSPORTING NO FIELDS WITH KEY table_line = lv_where.
+        IF sy-subrc <> 0.
+          INSERT lv_where INTO TABLE <ls_config>-where.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~from_json.
+ 
+    DATA ls_file LIKE LINE OF it_files.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+    DATA lo_ajson TYPE REF TO zcl_abapgit_ajson.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    CLEAR mt_config.
+    LOOP AT it_files INTO ls_file
+        USING KEY file_path
+        WHERE path = zif_abapgit_data_config=>c_default_path
+        AND filename CP |*.{ zif_abapgit_data_config=>c_config }.{ zif_abapgit_data_config=>c_default_format }|.
+      TRY.
+          lo_ajson = zcl_abapgit_ajson=>parse( zcl_abapgit_convert=>xstring_to_string_utf8( ls_file-data ) ).
+          lo_ajson->zif_abapgit_ajson~to_abap( IMPORTING ev_container = ls_config ).
+        CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+          zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
+      ENDTRY.
+ 
+      zif_abapgit_data_config~add_config( ls_config ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~get_configs.
+    rt_configs = mt_config.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~remove_config.
+
+    ASSERT is_config-type IS NOT INITIAL.
+    ASSERT is_config-name IS NOT INITIAL.
+    ASSERT is_config-name = to_upper( is_config-name ).
+
+    DELETE mt_config WHERE name = is_config-name AND type = is_config-type.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Not found' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~to_json.
+ 
+    DATA ls_config LIKE LINE OF mt_config.
+    DATA ls_file LIKE LINE OF rt_files.
+ 
+    ls_file-path = zif_abapgit_data_config=>c_default_path.
+ 
+    LOOP AT mt_config INTO ls_config.
+      ls_file-data = dump( ls_config ).
+      ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ).
+      ls_config-type = zif_abapgit_data_config=>c_config.
+      ls_file-filename = zcl_abapgit_data_utils=>build_data_filename( ls_config ).
+      APPEND ls_file TO rt_files.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_config~update_config.
+
+    zif_abapgit_data_config~remove_config( is_config ).
+    zif_abapgit_data_config~add_config( is_config ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_config.clas.testclasses.abap.html b/src/data/zcl_abapgit_data_config.clas.testclasses.abap.html new file mode 100644 index 00000000000..49f7b7f326e --- /dev/null +++ b/src/data/zcl_abapgit_data_config.clas.testclasses.abap.html @@ -0,0 +1,400 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_config.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_config.clas.testclasses.abap

+
+ +
+ 100% + Statements + 105/105 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 105/105 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +1061x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    DATA mv_json TYPE string.
+    DATA ms_config TYPE zif_abapgit_data_config=>ty_config.
+ 
+    METHODS setup.
+    METHODS double_add_config FOR TESTING RAISING cx_static_check.
+    METHODS to_json FOR TESTING RAISING cx_static_check.
+    METHODS from_json
+      IMPORTING it_files TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING   cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    mv_json = |\{\n| &&
+      |  "name": "DUMMY",\n| &&
+      |  "skip_initial": false,\n| &&
+      |  "type": "TABU",\n| &&
+      |  "where": [\n| &&
+      |    "DUMMY"\n| &&
+      |  ]\n| &&
+      |\}|.
+ 
+    ms_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+    ms_config-name  = 'DUMMY'.
+    APPEND 'DUMMY' TO ms_config-where.
+ 
+  ENDMETHOD.
+ 
+  METHOD double_add_config.
+ 
+    DATA li_config TYPE REF TO zif_abapgit_data_config.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+ 
+    CREATE OBJECT li_config TYPE zcl_abapgit_data_config.
+ 
+    ls_config-name = 'HELLO'.
+    ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+    APPEND 'foo' TO ls_config-where.
+ 
+    li_config->add_config( ls_config ).
+ 
+    CLEAR ls_config-where.
+    APPEND 'bar' TO ls_config-where.
+    li_config->add_config( ls_config ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( li_config->get_configs( ) )
+      exp = 1 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_json.
+ 
+    DATA li_config TYPE REF TO zif_abapgit_data_config.
+    DATA lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    DATA ls_file LIKE LINE OF lt_files.
+    DATA lv_json TYPE string.
+ 
+ 
+    CREATE OBJECT li_config TYPE zcl_abapgit_data_config.
+    li_config->add_config( ms_config ).
+ 
+    lt_files = li_config->to_json( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_files )
+      exp = 1 ).
+ 
+    READ TABLE lt_files INDEX 1 INTO ls_file.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( ls_file-data ).
+ 
+    lv_json = zcl_abapgit_convert=>xstring_to_string_utf8( ls_file-data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_json
+      exp = mv_json ).
+ 
+    from_json( lt_files ).
+ 
+  ENDMETHOD.
+ 
+  METHOD from_json.
+ 
+    DATA li_config TYPE REF TO zif_abapgit_data_config.
+ 
+    CREATE OBJECT li_config TYPE zcl_abapgit_data_config.
+ 
+    li_config->from_json( it_files ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( li_config->get_configs( ) )
+      exp = 1 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_deserializer.clas.abap.html b/src/data/zcl_abapgit_data_deserializer.clas.abap.html new file mode 100644 index 00000000000..2032aa7c0f0 --- /dev/null +++ b/src/data/zcl_abapgit_data_deserializer.clas.abap.html @@ -0,0 +1,1132 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_deserializer.clas.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_deserializer.clas.abap

+
+ +
+ 77.93% + Statements + 272/349 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 77.93% + Lines + 272/349 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +3501x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_data_deserializer DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_data_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_data_deserializer .
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS convert_json_to_itab
+      IMPORTING
+        !is_file TYPE zif_abapgit_git_definitions=>ty_file
+        !ir_data TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception .
+    METHODS preview_database_changes
+      IMPORTING
+        !iv_name         TYPE tadir-obj_name
+        !it_where        TYPE string_table
+        !ir_lc_data      TYPE REF TO data
+        !ir_db_data      TYPE REF TO data
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_data_deserializer=>ty_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS write_database_table
+      IMPORTING
+        !iv_name TYPE tadir-obj_name
+        !ir_del  TYPE REF TO data
+        !ir_ins  TYPE REF TO data
+        !ir_upd  TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_database_table
+      IMPORTING
+        !iv_name       TYPE tadir-obj_name
+        !it_where      TYPE string_table
+      RETURNING
+        VALUE(rr_data) TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception .
+    METHODS determine_transport_request
+      IMPORTING
+        io_repo                     TYPE REF TO zcl_abapgit_repo
+        iv_transport_type           TYPE zif_abapgit_definitions=>ty_transport_type
+      RETURNING
+        VALUE(rv_transport_request) TYPE trkorr.
+    METHODS is_table_allowed_to_edit
+      IMPORTING
+        !is_result                TYPE zif_abapgit_data_deserializer=>ty_result
+      RETURNING
+        VALUE(rv_allowed_to_edit) TYPE abap_bool .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_deserializer IMPLEMENTATION.
+ 
+ 
+  METHOD convert_json_to_itab.
+
+    DATA lo_ajson TYPE REF TO zcl_abapgit_ajson.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+
+    FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
+
+    ASSIGN ir_data->* TO <lg_tab>.
+
+    TRY.
+        lo_ajson = zcl_abapgit_ajson=>parse( zcl_abapgit_convert=>xstring_to_string_utf8( is_file-data ) ).
+        lo_ajson->zif_abapgit_ajson~to_abap( IMPORTING ev_container = <lg_tab> ).
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_transport_request.
+ 
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+    " Use transport from repo settings if maintained, or determine via user exit.
+    " If transport keeps empty here, it'll requested later via popup.
+    rv_transport_request = io_repo->get_local_settings( )-customizing_request.
+ 
+    li_exit->determine_transport_request(
+      EXPORTING
+        io_repo              = io_repo
+        iv_transport_type    = iv_transport_type
+      CHANGING
+        cv_transport_request = rv_transport_request ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_table_allowed_to_edit.
+ 
+    " Is the object supported (by default or based on exit)?
+    rv_allowed_to_edit = zcl_abapgit_data_factory=>get_supporter( )->is_object_supported(
+      iv_type = is_result-type
+      iv_name = is_result-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD preview_database_changes.
+ 
+* method currently distinguishes between records be deleted and inserted (comparison of complete record)
+ 
+    FIELD-SYMBOLS <lg_old> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_new> TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_del> TYPE any.
+    FIELD-SYMBOLS <ls_ins> TYPE any.
+    FIELD-SYMBOLS <ls_upd> TYPE any.
+    FIELD-SYMBOLS <lg_del> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_ins> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_upd> TYPE ANY TABLE.
+ 
+    ASSIGN ir_db_data->* TO <lg_old>.
+    ASSIGN ir_lc_data->* TO <lg_new>.
+ 
+    rs_result-type = zif_abapgit_data_config=>c_data_type-tabu.
+    rs_result-name = iv_name.
+    rs_result-deletes = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    rs_result-inserts = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    rs_result-updates = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    ASSIGN rs_result-deletes->* TO <lg_del>.
+    ASSIGN rs_result-inserts->* TO <lg_ins>.
+    ASSIGN rs_result-updates->* TO <lg_upd>.
+ 
+    <lg_del> = <lg_old>.
+    <lg_ins> = <lg_new>.
+ 
+    " Remove identical records
+    LOOP AT <lg_del> ASSIGNING <ls_del>.
+      READ TABLE <lg_ins> ASSIGNING <ls_ins> FROM <ls_del>.
+      IF sy-subrc = 0.
+        IF <ls_del> <> <ls_ins>.
+          " Identical key but not identical component values
+          INSERT <ls_ins> INTO TABLE <lg_upd>.
+        ENDIF.
+        DELETE TABLE <lg_del> FROM <ls_del>.
+        DELETE TABLE <lg_ins> FROM <ls_ins>.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_database_table.
+ 
+    DATA lv_where LIKE LINE OF it_where.
+ 
+    FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
+ 
+    rr_data = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    ASSIGN rr_data->* TO <lg_tab>.
+ 
+    LOOP AT it_where INTO lv_where.
+      SELECT * FROM (iv_name) APPENDING TABLE <lg_tab> WHERE (lv_where).
+    ENDLOOP.
+    IF lines( it_where ) = 0.
+      SELECT * FROM (iv_name) INTO TABLE <lg_tab>.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD write_database_table.
+
+    FIELD-SYMBOLS <lg_del> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_ins> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lg_upd> TYPE ANY TABLE.
+
+    IF zcl_abapgit_data_utils=>does_table_exist( iv_name ) = abap_false.
+      zcx_abapgit_exception=>raise( |Table { iv_name } not found for data deserialization| ).
+    ENDIF.
+
+    ASSIGN ir_del->* TO <lg_del>.
+    ASSIGN ir_ins->* TO <lg_ins>.
+    ASSIGN ir_upd->* TO <lg_upd>.
+
+    IF lines( <lg_del> ) > 0.
+      DELETE (iv_name) FROM TABLE <lg_del>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Error deleting { lines( <lg_del> ) } records from table { iv_name }| ).
+      ENDIF.
+    ENDIF.
+
+    IF lines( <lg_ins> ) > 0.
+      INSERT (iv_name) FROM TABLE <lg_ins>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Error inserting { lines( <lg_ins> ) } records into table { iv_name }| ).
+      ENDIF.
+    ENDIF.
+
+    IF lines( <lg_upd> ) > 0.
+      UPDATE (iv_name) FROM TABLE <lg_upd>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Error updating { lines( <lg_upd> ) } records into table { iv_name }| ).
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_deserializer~actualize.
+ 
+* this method updates the database
+ 
+    DATA ls_result  LIKE LINE OF it_result.
+    DATA li_cts_api TYPE REF TO zif_abapgit_cts_api.
+    DATA ls_file    LIKE LINE OF rt_accessed_files.
+ 
+    FIELD-SYMBOLS:
+      <lt_ins> TYPE ANY TABLE,
+      <lt_del> TYPE ANY TABLE,
+      <lt_upd> TYPE ANY TABLE.
+ 
+    LOOP AT it_result INTO ls_result.
+      ASSERT ls_result-type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+      ASSERT ls_result-name IS NOT INITIAL.
+ 
+      " Did the user flagged this object for update?
+      READ TABLE is_checks-overwrite TRANSPORTING NO FIELDS
+        WITH KEY object_type_and_name
+        COMPONENTS
+          obj_type = ls_result-type
+          obj_name = ls_result-name
+          decision = zif_abapgit_definitions=>c_yes.
+      IF sy-subrc <>  0.
+        CONTINUE.
+      ENDIF.
+ 
+      IF is_table_allowed_to_edit( ls_result ) = abap_false.
+        zcx_abapgit_exception=>raise( |Table { ls_result-name } not supported for updating data| ).
+      ENDIF.
+ 
+      write_database_table(
+        iv_name = ls_result-name
+        ir_del  = ls_result-deletes
+        ir_ins  = ls_result-inserts
+        ir_upd  = ls_result-updates ).
+ 
+      ASSIGN ls_result-inserts->* TO <lt_ins>.
+      ASSIGN ls_result-deletes->* TO <lt_del>.
+      ASSIGN ls_result-updates->* TO <lt_upd>.
+ 
+      IF zcl_abapgit_data_utils=>is_customizing_table( ls_result-name ) = abap_true.
+        IF li_cts_api IS INITIAL.
+          li_cts_api = zcl_abapgit_factory=>get_cts_api( ).
+        ENDIF.
+ 
+        li_cts_api->create_transport_entries(
+          iv_transport = is_checks-customizing-transport
+          it_table_ins = <lt_ins>
+          it_table_upd = <lt_upd>
+          it_table_del = <lt_del>
+          iv_tabname   = |{ ls_result-name }| ).
+      ENDIF.
+ 
+      INSERT ls_result-file INTO TABLE rt_accessed_files. " data file
+      INSERT ls_result-config INTO TABLE rt_accessed_files. " config file
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_deserializer~deserialize.
+ 
+* this method does not persist any changes to the database
+ 
+    DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+    DATA ls_config  LIKE LINE OF lt_configs.
+    DATA lr_lc_data TYPE REF TO data.
+    DATA lr_db_data TYPE REF TO data.
+    DATA ls_file    LIKE LINE OF it_files.
+    DATA ls_result  LIKE LINE OF rt_result.
+ 
+    lt_configs = ii_config->get_configs( ).
+ 
+    LOOP AT lt_configs INTO ls_config.
+      ASSERT ls_config-type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+      ASSERT ls_config-name IS NOT INITIAL.
+ 
+      lr_lc_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ).
+ 
+      READ TABLE it_files INTO ls_file
+        WITH KEY file_path
+        COMPONENTS path     = zif_abapgit_data_config=>c_default_path
+                   filename = zcl_abapgit_data_utils=>build_data_filename( ls_config ).
+      IF sy-subrc = 0.
+        convert_json_to_itab(
+          ir_data = lr_lc_data
+          is_file = ls_file ).
+
+        lr_db_data = read_database_table(
+          iv_name  = ls_config-name
+          it_where = ls_config-where ).
+
+        ls_result = preview_database_changes(
+          iv_name    = ls_config-name
+          it_where   = ls_config-where
+          ir_lc_data = lr_lc_data
+          ir_db_data = lr_db_data ).
+
+        MOVE-CORRESPONDING ls_file TO ls_result-file. " data file
+
+        READ TABLE it_files INTO ls_file
+          WITH KEY file_path
+          COMPONENTS path     = zif_abapgit_data_config=>c_default_path
+                     filename = zcl_abapgit_data_utils=>build_config_filename( ls_config ).
+        ASSERT sy-subrc = 0.
+
+        MOVE-CORRESPONDING ls_file TO ls_result-config. " config file
+
+        INSERT ls_result INTO TABLE rt_result.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_deserializer~deserialize_check.
+ 
+    DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+ 
+    lt_configs = ii_config->get_configs( ).
+ 
+    IF lt_configs IS NOT INITIAL.
+      rs_checks-required     = abap_true.
+      rs_checks-type-request = zif_abapgit_cts_api=>c_transport_type-cust_request.
+      rs_checks-type-task    = zif_abapgit_cts_api=>c_transport_type-cust_task.
+      rs_checks-transport    = determine_transport_request(
+                                 io_repo           = io_repo
+                                 iv_transport_type = rs_checks-type ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap.html b/src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap.html new file mode 100644 index 00000000000..7b74b7292ab --- /dev/null +++ b/src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap.html @@ -0,0 +1,787 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_deserializer.clas.testclasses.abap

+
+ +
+ 100% + Statements + 234/234 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 234/234 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +2351x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION DEFERRED.
+CLASS zcl_abapgit_data_deserializer DEFINITION LOCAL FRIENDS ltcl_test.
+ 
+CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS test1 FOR TESTING RAISING cx_static_check.
+    METHODS preview_database_changes_ins FOR TESTING RAISING cx_static_check.
+    METHODS preview_database_changes_upd FOR TESTING RAISING cx_static_check.
+    METHODS preview_database_changes_del FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD test1.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_data_deserializer.
+    DATA li_config TYPE REF TO zif_abapgit_data_config.
+    DATA lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_data_deserializer.
+    CREATE OBJECT li_config TYPE zcl_abapgit_data_config.
+ 
+    ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name = 'T100'.
+ 
+    li_config->add_config( ls_config ).
+ 
+    " this does not change the database. it just gives a preview of changes
+    li_cut->deserialize(
+      ii_config = li_config
+      it_files  = lt_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD preview_database_changes_ins.
+ 
+    CONSTANTS: lc_msgnr TYPE c LENGTH 3 VALUE '999'.
+ 
+    DATA: li_cut     TYPE REF TO zcl_abapgit_data_deserializer,
+          ls_config  TYPE zif_abapgit_data_config=>ty_config,
+          lr_db_data TYPE REF TO data,
+          lr_lc_data TYPE REF TO data,
+          ls_t100    TYPE t100,
+          ls_result  TYPE zif_abapgit_data_deserializer=>ty_result.
+ 
+    FIELD-SYMBOLS: <lt_db_data> TYPE ANY TABLE,
+                   <lt_lc_data> TYPE ANY TABLE,
+                   <lg_ins>     TYPE ANY TABLE,
+                   <ls_ins>     TYPE t100,
+                   <lg_upd>     TYPE ANY TABLE,
+                   <lg_del>     TYPE ANY TABLE.
+ 
+    ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name = 'T100'.
+ 
+    lr_db_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ).
+    ASSIGN lr_db_data->* TO <lt_db_data>.
+    lr_lc_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ).
+    ASSIGN lr_lc_data->* TO <lt_lc_data>.
+ 
+    " Create test data for INSERT
+    ls_t100-sprsl = sy-langu.
+    ls_t100-arbgb = 'AUNIT_ABAPGIT'.
+    ls_t100-msgnr = lc_msgnr.
+    ls_t100-text  = |abapGit aunit test|.
+    INSERT ls_t100 INTO TABLE <lt_lc_data>.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_data_deserializer.
+    ls_result = li_cut->preview_database_changes(
+      iv_name    = ls_config-name
+      it_where   = ls_config-where
+      ir_db_data = lr_db_data
+      ir_lc_data = lr_lc_data ).
+ 
+    ASSIGN ls_result-inserts->* TO <lg_ins>.
+    ASSIGN ls_result-updates->* TO <lg_upd>.
+    ASSIGN ls_result-deletes->* TO <lg_del>.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 1
+      act = lines( <lg_ins> ) ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( <lg_upd> ) ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( <lg_del> ) ).
+ 
+    LOOP AT <lg_ins> ASSIGNING <ls_ins>.
+      cl_abap_unit_assert=>assert_equals(
+        exp = lc_msgnr
+        act = <ls_ins>-msgnr ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD preview_database_changes_upd.
+ 
+    CONSTANTS: lc_msgnr TYPE c LENGTH 3 VALUE '999'.
+ 
+    DATA: li_cut     TYPE REF TO zcl_abapgit_data_deserializer,
+          ls_config  TYPE zif_abapgit_data_config=>ty_config,
+          lr_db_data TYPE REF TO data,
+          lr_lc_data TYPE REF TO data,
+          ls_t100    TYPE t100,
+          ls_result  TYPE zif_abapgit_data_deserializer=>ty_result.
+ 
+    FIELD-SYMBOLS: <lt_db_data> TYPE ANY TABLE,
+                   <lt_lc_data> TYPE ANY TABLE,
+                   <lg_ins>     TYPE ANY TABLE,
+                   <lg_upd>     TYPE ANY TABLE,
+                   <ls_upd>     TYPE t100,
+                   <lg_del>     TYPE ANY TABLE.
+ 
+    ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name = 'T100'.
+ 
+    lr_db_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ).
+    ASSIGN lr_db_data->* TO <lt_db_data>.
+    lr_lc_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ).
+    ASSIGN lr_lc_data->* TO <lt_lc_data>.
+ 
+    " Create test data for UPDATE
+    ls_t100-sprsl = sy-langu.
+    ls_t100-arbgb = |AUNIT_ABAPGIT|.
+    ls_t100-msgnr = lc_msgnr.
+    ls_t100-text  = |abapGit aunit test|.
+    INSERT ls_t100 INTO TABLE <lt_db_data>.
+ 
+    ls_t100-sprsl = sy-langu.
+    ls_t100-arbgb = 'AUNIT_ABAPGIT'.
+    ls_t100-msgnr = lc_msgnr.
+    ls_t100-text  = |abapGit aunit test UPDATE|.
+    INSERT ls_t100 INTO TABLE <lt_lc_data>.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_data_deserializer.
+    ls_result = li_cut->preview_database_changes(
+      iv_name    = ls_config-name
+      it_where   = ls_config-where
+      ir_db_data = lr_db_data
+      ir_lc_data = lr_lc_data ).
+ 
+    ASSIGN ls_result-inserts->* TO <lg_ins>.
+    ASSIGN ls_result-updates->* TO <lg_upd>.
+    ASSIGN ls_result-deletes->* TO <lg_del>.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( <lg_ins> ) ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 1
+      act = lines( <lg_upd> ) ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( <lg_del> ) ).
+ 
+    LOOP AT <lg_upd> ASSIGNING <ls_upd>.
+      cl_abap_unit_assert=>assert_equals(
+        exp = lc_msgnr
+        act = <ls_upd>-msgnr ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD preview_database_changes_del.
+ 
+    CONSTANTS: lc_msgnr TYPE c LENGTH 3 VALUE '999'.
+ 
+    DATA: li_cut     TYPE REF TO zcl_abapgit_data_deserializer,
+          ls_config  TYPE zif_abapgit_data_config=>ty_config,
+          lr_db_data TYPE REF TO data,
+          lr_lc_data TYPE REF TO data,
+          ls_t100    TYPE t100,
+          ls_result  TYPE zif_abapgit_data_deserializer=>ty_result.
+ 
+    FIELD-SYMBOLS: <lt_db_data> TYPE ANY TABLE,
+                   <lt_lc_data> TYPE ANY TABLE,
+                   <lg_ins>     TYPE ANY TABLE,
+                   <lg_upd>     TYPE ANY TABLE,
+                   <lg_del>     TYPE ANY TABLE,
+                   <ls_del>     TYPE t100.
+ 
+    ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name = 'T100'.
+ 
+    lr_db_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ).
+    ASSIGN lr_db_data->* TO <lt_db_data>.
+    lr_lc_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ).
+    ASSIGN lr_lc_data->* TO <lt_lc_data>.
+ 
+    " Create test data for DELETE
+    ls_t100-sprsl = sy-langu.
+    ls_t100-arbgb = 'AUNIT_ABAPGIT'.
+    ls_t100-msgnr = lc_msgnr.
+    ls_t100-text  = |abapGit aunit test DELETE|.
+    INSERT ls_t100 INTO TABLE <lt_db_data>.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_data_deserializer.
+    ls_result = li_cut->preview_database_changes(
+      iv_name    = ls_config-name
+      it_where   = ls_config-where
+      ir_db_data = lr_db_data
+      ir_lc_data = lr_lc_data ).
+ 
+    ASSIGN ls_result-inserts->* TO <lg_ins>.
+    ASSIGN ls_result-updates->* TO <lg_upd>.
+    ASSIGN ls_result-deletes->* TO <lg_del>.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( <lg_ins> ) ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( <lg_upd> ) ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 1
+      act = lines( <lg_del> ) ).
+ 
+    LOOP AT <lg_del> ASSIGNING <ls_del>.
+      cl_abap_unit_assert=>assert_equals(
+        exp = lc_msgnr
+        act = <ls_del>-msgnr ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_factory.clas.abap.html b/src/data/zcl_abapgit_data_factory.clas.abap.html new file mode 100644 index 00000000000..19da912a065 --- /dev/null +++ b/src/data/zcl_abapgit_data_factory.clas.abap.html @@ -0,0 +1,292 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_factory.clas.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_factory.clas.abap

+
+ +
+ 100% + Statements + 69/69 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 69/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +701x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_data_factory DEFINITION
+  PUBLIC
+  CREATE PUBLIC
+  GLOBAL FRIENDS zcl_abapgit_data_injector .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_supporter
+      RETURNING
+        VALUE(ri_supporter) TYPE REF TO zif_abapgit_data_supporter .
+    CLASS-METHODS get_serializer
+      RETURNING
+        VALUE(ri_serializer) TYPE REF TO zif_abapgit_data_serializer .
+    CLASS-METHODS get_deserializer
+      RETURNING
+        VALUE(ri_deserializer) TYPE REF TO zif_abapgit_data_deserializer .
+    CLASS-METHODS get_config
+      RETURNING
+        VALUE(ri_config) TYPE REF TO zif_abapgit_data_config .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_supporter TYPE REF TO zif_abapgit_data_supporter .
+    CLASS-DATA gi_serializer TYPE REF TO zif_abapgit_data_serializer .
+    CLASS-DATA gi_deserializer TYPE REF TO zif_abapgit_data_deserializer .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_factory IMPLEMENTATION.
+ 
+ 
+  METHOD get_config.
+    CREATE OBJECT ri_config TYPE zcl_abapgit_data_config.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_deserializer.
+ 
+    IF gi_deserializer IS INITIAL.
+      CREATE OBJECT gi_deserializer TYPE zcl_abapgit_data_deserializer.
+    ENDIF.
+ 
+    ri_deserializer = gi_deserializer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_serializer.
+ 
+    IF gi_serializer IS INITIAL.
+      CREATE OBJECT gi_serializer TYPE zcl_abapgit_data_serializer.
+    ENDIF.
+ 
+    ri_serializer = gi_serializer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_supporter.
+ 
+    IF gi_supporter IS INITIAL.
+      CREATE OBJECT gi_supporter TYPE zcl_abapgit_data_supporter.
+    ENDIF.
+ 
+    ri_supporter = gi_supporter.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_injector.clas.abap.html b/src/data/zcl_abapgit_data_injector.clas.abap.html new file mode 100644 index 00000000000..3dfe6b7b55e --- /dev/null +++ b/src/data/zcl_abapgit_data_injector.clas.abap.html @@ -0,0 +1,199 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_injector.clas.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_injector.clas.abap

+
+ +
+ 89.47% + Statements + 34/38 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 89.47% + Lines + 34/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +391x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_data_injector DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS set_supporter
+      IMPORTING
+        !ii_supporter TYPE REF TO zif_abapgit_data_supporter .
+    METHODS set_serializer
+      IMPORTING
+        !ii_serializer TYPE REF TO zif_abapgit_data_serializer .
+    METHODS set_deserializer
+      IMPORTING
+        !ii_deserializer TYPE REF TO zif_abapgit_data_deserializer .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_injector IMPLEMENTATION.
+ 
+ 
+  METHOD set_deserializer.
+    zcl_abapgit_data_factory=>gi_deserializer = ii_deserializer.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_serializer.
+    zcl_abapgit_data_factory=>gi_serializer = ii_serializer.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_supporter.
+    zcl_abapgit_data_factory=>gi_supporter = ii_supporter.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_serializer.clas.abap.html b/src/data/zcl_abapgit_data_serializer.clas.abap.html new file mode 100644 index 00000000000..bf6b4e94aad --- /dev/null +++ b/src/data/zcl_abapgit_data_serializer.clas.abap.html @@ -0,0 +1,496 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_serializer.clas.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_serializer.clas.abap

+
+ +
+ 93.43% + Statements + 128/137 +
+ + +
+ 57.14% + Branches + 4/7 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 93.43% + Lines + 128/137 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +1381x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_data_serializer DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_data_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_data_serializer .
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_max_records TYPE i VALUE 20000 ##NO_TEXT.
+ 
+    METHODS convert_itab_to_json
+      IMPORTING
+        !ir_data         TYPE REF TO data
+        !iv_skip_initial TYPE abap_bool
+      RETURNING
+        VALUE(rv_data)   TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_database_table
+      IMPORTING
+        !iv_name       TYPE tadir-obj_name
+        !it_where      TYPE string_table
+      RETURNING
+        VALUE(rr_data) TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_serializer IMPLEMENTATION.
+ 
+ 
+  METHOD convert_itab_to_json.
+ 
+    DATA lo_ajson  TYPE REF TO zcl_abapgit_ajson.
+    DATA lv_string TYPE string.
+    DATA lx_ajson  TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
+ 
+    ASSIGN ir_data->* TO <lg_tab>.
+ 
+    TRY.
+        lo_ajson = zcl_abapgit_ajson=>create_empty( ).
+        lo_ajson->keep_item_order( ).
+        lo_ajson->set(
+          iv_path = '/'
+          iv_val = <lg_tab> ).
+ 
+        IF iv_skip_initial = abap_true.
+          lo_ajson = zcl_abapgit_ajson=>create_from(
+            ii_source_json = lo_ajson
+            ii_filter = zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) ).
+        ENDIF.
+ 
+        lv_string = lo_ajson->stringify( 2 ).
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
+    ENDTRY.
+ 
+    rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_database_table.
+ 
+    DATA lv_records TYPE i.
+    DATA lv_where LIKE LINE OF it_where.
+    DATA lx_sql TYPE REF TO cx_sy_sql_error.
+ 
+    FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
+ 
+    rr_data = zcl_abapgit_data_utils=>build_table_itab( iv_name ).
+    ASSIGN rr_data->* TO <lg_tab>.
+ 
+    TRY.
+        LOOP AT it_where INTO lv_where.
+          SELECT * FROM (iv_name) APPENDING TABLE <lg_tab> WHERE (lv_where).
+        ENDLOOP.
+        IF lines( it_where ) = 0.
+          SELECT * FROM (iv_name) INTO TABLE <lg_tab>.
+        ENDIF.
+      CATCH cx_sy_sql_error INTO lx_sql.
+        zcx_abapgit_exception=>raise(
+          iv_text     = lx_sql->get_text( )
+          ix_previous = lx_sql ).
+    ENDTRY.
+ 
+    lv_records = lines( <lg_tab> ).
+    IF lv_records > c_max_records.
+      zcx_abapgit_exception=>raise( |Too many records selected from table { iv_name
+        } (selected { lv_records }, max { c_max_records })| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_serializer~serialize.
+ 
+    DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+    DATA ls_config  LIKE LINE OF lt_configs.
+    DATA ls_file    LIKE LINE OF rt_files.
+    DATA lr_data    TYPE REF TO data.
+ 
+    ls_file-path = zif_abapgit_data_config=>c_default_path.
+    lt_configs = ii_config->get_configs( ).
+ 
+    LOOP AT lt_configs INTO ls_config.
+      ASSERT ls_config-type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+      ASSERT ls_config-name IS NOT INITIAL.
+ 
+      IF zcl_abapgit_data_utils=>does_table_exist( ls_config-name ) = abap_true.
+        lr_data = read_database_table(
+          iv_name  = ls_config-name
+          it_where = ls_config-where ).
+ 
+        ls_file-data = convert_itab_to_json(
+          ir_data         = lr_data
+          iv_skip_initial = ls_config-skip_initial ).
+      ELSE.
+        ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( '[]' ).
+      ENDIF.
+ 
+      ls_file-filename = zcl_abapgit_data_utils=>build_data_filename( ls_config ).
+      ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ).
+      APPEND ls_file TO rt_files.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap.html b/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap.html new file mode 100644 index 00000000000..7c4b4fa1218 --- /dev/null +++ b/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap.html @@ -0,0 +1,343 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_serializer.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_serializer.clas.testclasses.abap

+
+ +
+ 100% + Statements + 86/86 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 86/86 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +871x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION DEFERRED.
+CLASS zcl_abapgit_data_serializer DEFINITION LOCAL FRIENDS ltcl_test.
+ 
+CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    DATA mi_cut TYPE REF TO zif_abapgit_data_serializer.
+    DATA mi_config TYPE REF TO zif_abapgit_data_config.
+ 
+    METHODS:
+      setup,
+      serialize FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_error_table FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_error_field FOR TESTING RAISING zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mi_cut TYPE zcl_abapgit_data_serializer.
+    CREATE OBJECT mi_config TYPE zcl_abapgit_data_config.
+  ENDMETHOD.
+ 
+  METHOD serialize.
+ 
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+    DATA lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    DATA lv_where LIKE LINE OF ls_config-where.
+ 
+    ls_config-type = 'TABU'.
+    ls_config-name = 'T000'.
+    lv_where = |MANDT = '{ sy-mandt }'|.
+    APPEND lv_where TO ls_config-where.
+ 
+    mi_config->add_config( ls_config ).
+ 
+    lt_files = mi_cut->serialize( mi_config ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_files )
+      exp = 1 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD serialize_error_table.
+ 
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+    DATA lv_where LIKE LINE OF ls_config-where.
+ 
+    ls_config-type = 'TABU'.
+    ls_config-name = 'SDFSDFSDFSDFSDF'.
+    lv_where = |MANDT = '{ sy-mandt }'|.
+    APPEND lv_where TO ls_config-where.
+ 
+    mi_config->add_config( ls_config ).
+ 
+    TRY.
+        mi_cut->serialize( mi_config ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD serialize_error_field.
+ 
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+    DATA lv_where LIKE LINE OF ls_config-where.
+ 
+    ls_config-type = 'TABU'.
+    ls_config-name = 'T000'.
+    lv_where = |SDFSDFSDF = '{ sy-mandt }'|.
+    APPEND lv_where TO ls_config-where.
+ 
+    mi_config->add_config( ls_config ).
+ 
+    TRY.
+        mi_cut->serialize( mi_config ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_supporter.clas.abap.html b/src/data/zcl_abapgit_data_supporter.clas.abap.html new file mode 100644 index 00000000000..698fe9f025f --- /dev/null +++ b/src/data/zcl_abapgit_data_supporter.clas.abap.html @@ -0,0 +1,331 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_supporter.clas.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_supporter.clas.abap

+
+ +
+ 97.56% + Statements + 80/82 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 97.56% + Lines + 80/82 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +831x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_data_supporter DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_data_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_data_supporter.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_supported_objects TYPE zif_abapgit_data_supporter=>ty_objects.
+ 
+    METHODS get_supported_objects.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_supporter IMPLEMENTATION.
+ 
+ 
+  METHOD get_supported_objects.
+ 
+    DATA:
+      lt_tables  TYPE STANDARD TABLE OF tabname,
+      lv_tabname TYPE tabname,
+      ls_object  LIKE LINE OF mt_supported_objects,
+      li_exit    TYPE REF TO zif_abapgit_exit.
+ 
+    " For safety reasons, by default only customer-defined customizing tables are supported
+    SELECT dd02l~tabname
+      FROM dd09l JOIN dd02l
+        ON dd09l~tabname = dd02l~tabname
+        AND dd09l~as4local = dd02l~as4local
+        AND dd09l~as4vers = dd02l~as4vers
+      INTO TABLE lt_tables
+      WHERE dd02l~tabclass = 'TRANSP'
+        AND dd09l~tabart = 'APPL2'
+        AND dd09l~as4user <> 'SAP'
+        AND dd09l~as4local = 'A' "Only active tables
+        AND dd02l~contflag = 'C'. "Only customizing tables
+ 
+    LOOP AT lt_tables INTO lv_tabname.
+      ls_object-type = zif_abapgit_data_config=>c_data_type-tabu.
+      ls_object-name = lv_tabname.
+      INSERT ls_object INTO TABLE mt_supported_objects.
+    ENDLOOP.
+ 
+    " The list of supported objects can be enhanced using an exit
+    " Name patterns are allowed. For example, TABU T009*
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->change_supported_data_objects( CHANGING ct_objects =  mt_supported_objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_data_supporter~is_object_supported.
+ 
+    FIELD-SYMBOLS <ls_object> LIKE LINE OF mt_supported_objects.
+ 
+    IF mt_supported_objects IS INITIAL.
+      get_supported_objects( ).
+    ENDIF.
+ 
+    READ TABLE mt_supported_objects TRANSPORTING NO FIELDS
+      WITH TABLE KEY type = iv_type name = iv_name.
+    IF sy-subrc = 0.
+      rv_supported = abap_true.
+    ELSE.
+      " Check if object name matches pattern
+      LOOP AT mt_supported_objects ASSIGNING <ls_object> WHERE type = iv_type.
+        IF iv_name CP <ls_object>-name.
+          rv_supported = abap_true.
+          RETURN.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_supporter.clas.testclasses.abap.html b/src/data/zcl_abapgit_data_supporter.clas.testclasses.abap.html new file mode 100644 index 00000000000..2c5f636fa53 --- /dev/null +++ b/src/data/zcl_abapgit_data_supporter.clas.testclasses.abap.html @@ -0,0 +1,286 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_supporter.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_supporter.clas.testclasses.abap

+
+ +
+ 100% + Statements + 67/67 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 67/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +681x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_supporter_mock DEFINITION.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_data_supporter.
+ENDCLASS.
+ 
+CLASS lcl_supporter_mock IMPLEMENTATION.
+  METHOD zif_abapgit_data_supporter~is_object_supported.
+ 
+    IF iv_type = zif_abapgit_data_config=>c_data_type-tabu AND iv_name = 'T005'.
+      rv_supported = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_supporter DEFINITION FOR TESTING RISK LEVEL HARMLESS
+  DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      is_not_supported FOR TESTING,
+      is_supported FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_data_supporter DEFINITION LOCAL FRIENDS ltcl_supporter.
+ 
+CLASS ltcl_supporter IMPLEMENTATION.
+ 
+  METHOD is_not_supported.
+ 
+    DATA lv_act TYPE abap_bool.
+ 
+    " By default, SAP tables are not supported
+    lv_act = zcl_abapgit_data_factory=>get_supporter( )->is_object_supported(
+      iv_type = zif_abapgit_data_config=>c_data_type-tabu
+      iv_name = 'T005' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+  METHOD is_supported.
+ 
+    DATA lo_mock TYPE REF TO lcl_supporter_mock.
+    DATA lo_inject TYPE REF TO zcl_abapgit_data_injector.
+    DATA lv_act TYPE abap_bool.
+ 
+    " Mock sets table T005 to be supported
+    CREATE OBJECT lo_mock.
+    CREATE OBJECT lo_inject.
+    lo_inject->set_supporter( lo_mock ).
+ 
+    lv_act = zcl_abapgit_data_factory=>get_supporter( )->is_object_supported(
+      iv_type = zif_abapgit_data_config=>c_data_type-tabu
+      iv_name = 'T005' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_utils.clas.abap.html b/src/data/zcl_abapgit_data_utils.clas.abap.html new file mode 100644 index 00000000000..b8933a7f42e --- /dev/null +++ b/src/data/zcl_abapgit_data_utils.clas.abap.html @@ -0,0 +1,874 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_utils.clas.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_utils.clas.abap

+
+ +
+ 98.85% + Statements + 260/263 +
+ + +
+ 42.85% + Branches + 3/7 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.85% + Lines + 260/263 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +2641x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +21x +  +  +21x +21x +21x +21x +21x +21x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_data_utils DEFINITION
+  PUBLIC
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS build_table_itab
+      IMPORTING
+        !iv_name       TYPE tadir-obj_name
+      RETURNING
+        VALUE(rr_data) TYPE REF TO data
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS build_data_filename
+      IMPORTING
+        !is_config         TYPE zif_abapgit_data_config=>ty_config
+      RETURNING
+        VALUE(rv_filename) TYPE string.
+    CLASS-METHODS build_config_filename
+      IMPORTING
+        !is_config         TYPE zif_abapgit_data_config=>ty_config
+      RETURNING
+        VALUE(rv_filename) TYPE string.
+    CLASS-METHODS jump
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_exit) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS does_table_exist
+      IMPORTING
+        !iv_name         TYPE tadir-obj_name
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool.
+    CLASS-METHODS is_customizing_table
+      IMPORTING
+        !iv_name              TYPE tadir-obj_name
+      RETURNING
+        VALUE(rv_customizing) TYPE abap_bool.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES ty_names TYPE STANDARD TABLE OF abap_compname WITH DEFAULT KEY .
+    CLASS-METHODS list_key_fields
+      IMPORTING
+        !iv_name        TYPE tadir-obj_name
+      RETURNING
+        VALUE(rt_names) TYPE ty_names
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_data_utils IMPLEMENTATION.
+ 
+ 
+  METHOD build_config_filename.
+ 
+    rv_filename = to_lower( |{ is_config-name }.{ zif_abapgit_data_config=>c_config }|
+      && |.{ zif_abapgit_data_config=>c_default_format }| ).
+ 
+    REPLACE ALL OCCURRENCES OF '/' IN rv_filename WITH '#'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_data_filename.
+ 
+    rv_filename = to_lower( |{ is_config-name }.{ is_config-type }|
+      && |.{ zif_abapgit_data_config=>c_default_format }| ).
+ 
+    REPLACE ALL OCCURRENCES OF '/' IN rv_filename WITH '#'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_table_itab.
+ 
+    DATA lo_type   TYPE REF TO cl_abap_typedescr.
+    DATA lo_data   TYPE REF TO cl_abap_structdescr.
+    DATA lo_table  TYPE REF TO cl_abap_tabledescr.
+    DATA lt_keys   TYPE abap_table_keydescr_tab.
+    DATA lt_names  TYPE ty_names.
+ 
+    FIELD-SYMBOLS <lv_name>      LIKE LINE OF lt_names.
+    FIELD-SYMBOLS <ls_key>       LIKE LINE OF lt_keys.
+    FIELD-SYMBOLS <ls_component> LIKE LINE OF <ls_key>-components.
+ 
+    cl_abap_structdescr=>describe_by_name(
+      EXPORTING
+        p_name         = iv_name
+      RECEIVING
+        p_descr_ref    = lo_type
+      EXCEPTIONS
+        type_not_found = 1 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Table { iv_name } not found for data serialization| ).
+    ENDIF.
+ 
+    TRY.
+        lo_data ?= lo_type.
+ 
+        " Get primary key to ensure unique entries
+        IF lo_data->is_ddic_type( ) = abap_true.
+          lt_names = list_key_fields( iv_name ).
+ 
+          APPEND INITIAL LINE TO lt_keys ASSIGNING <ls_key>.
+          <ls_key>-access_kind = cl_abap_tabledescr=>tablekind_sorted.
+          <ls_key>-key_kind    = cl_abap_tabledescr=>keydefkind_user.
+          <ls_key>-is_primary  = abap_true.
+          <ls_key>-is_unique   = abap_true.
+ 
+          LOOP AT lt_names ASSIGNING <lv_name>.
+            APPEND INITIAL LINE TO <ls_key>-components ASSIGNING <ls_component>.
+            <ls_component>-name = <lv_name>.
+          ENDLOOP.
+        ENDIF.
+ 
+        IF lines( lt_names ) = 0.
+          lo_table = cl_abap_tabledescr=>get( lo_data ).
+        ELSE.
+          lo_table = cl_abap_tabledescr=>get_with_keys(
+            p_line_type = lo_data
+            p_keys      = lt_keys ).
+        ENDIF.
+ 
+        CREATE DATA rr_data TYPE HANDLE lo_table.
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( |Error creating internal table for data serialization| ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD does_table_exist.
+ 
+    " This is slow but ensures that the table actually exists and is not just buffered by RTTI
+    " If we just rely on RTTI, uninstalling and reinstalling a table in the same session will lead to dumps
+    TRY.
+        build_table_itab( iv_name ).
+        rv_exists = abap_true.
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_customizing_table.
+ 
+    DATA lv_contflag       TYPE c LENGTH 1.
+    DATA lo_table          TYPE REF TO object.
+    DATA lo_content        TYPE REF TO object.
+    DATA lo_delivery_class TYPE REF TO object.
+    FIELD-SYMBOLS <ls_any> TYPE any.
+ 
+    TRY.
+        CALL METHOD ('XCO_CP_ABAP_DICTIONARY')=>database_table
+          EXPORTING
+            iv_name           = iv_name(16)
+          RECEIVING
+            ro_database_table = lo_table.
+        CALL METHOD lo_table->('IF_XCO_DATABASE_TABLE~CONTENT')
+          RECEIVING
+            ro_content = lo_content.
+        CALL METHOD lo_content->('IF_XCO_DBT_CONTENT~GET_DELIVERY_CLASS')
+          RECEIVING
+            ro_delivery_class = lo_delivery_class.
+        ASSIGN lo_delivery_class->('VALUE') TO <ls_any>.
+        lv_contflag = <ls_any>.
+      CATCH cx_sy_dyn_call_illegal_class.
+        SELECT SINGLE contflag FROM ('DD02L') INTO lv_contflag WHERE tabname = iv_name.
+    ENDTRY.
+ 
+    IF lv_contflag = 'C'.
+      rv_customizing = abap_true.
+    ELSEIF lv_contflag IS NOT INITIAL.
+      rv_customizing = abap_false.
+    ELSE.
+      rv_customizing = abap_undefined. " table does not exist
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump.
+ 
+    " Run SE16 with authorization check
+    CALL FUNCTION 'RS_TABLE_LIST_CREATE'
+      EXPORTING
+        table_name         = is_item-obj_name
+      EXCEPTIONS
+        table_is_structure = 1
+        table_not_exists   = 2
+        db_not_exists      = 3
+        no_permission      = 4
+        no_change_allowed  = 5
+        table_is_gtt       = 6
+        OTHERS             = 7.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Table { is_item-obj_name } cannot be displayed| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD list_key_fields.
+    DATA lo_obj        TYPE REF TO object.
+    DATA lv_tabname    TYPE c LENGTH 16.
+    DATA lr_ddfields   TYPE REF TO data.
+    DATA lv_workaround TYPE c LENGTH 20.
+    DATA lr_struct     TYPE REF TO cl_abap_structdescr.
+    FIELD-SYMBOLS <lg_any> TYPE any.
+    FIELD-SYMBOLS <lv_field> TYPE simple.
+    FIELD-SYMBOLS <lt_ddfields> TYPE ANY TABLE.
+ 
+* convert to correct type,
+    lv_tabname = iv_name.
+ 
+    TRY.
+        CALL METHOD ('XCO_CP_ABAP_DICTIONARY')=>database_table
+          EXPORTING
+            iv_name           = lv_tabname
+          RECEIVING
+            ro_database_table = lo_obj.
+        ASSIGN lo_obj->('IF_XCO_DATABASE_TABLE~FIELDS->IF_XCO_DBT_FIELDS_FACTORY~KEY') TO <lg_any>.
+        IF sy-subrc  <> 0.
+* fallback to RTTI, KEY field does not exist in S/4 2020
+          RAISE EXCEPTION TYPE cx_sy_dyn_call_illegal_class.
+        ENDIF.
+        lo_obj = <lg_any>.
+        CALL METHOD lo_obj->('IF_XCO_DBT_FIELDS~GET_NAMES')
+          RECEIVING
+            rt_names = rt_names.
+      CATCH cx_sy_dyn_call_illegal_class cx_no_check.
+        lv_workaround = 'DDFIELDS'.
+        CREATE DATA lr_ddfields TYPE (lv_workaround).
+        ASSIGN lr_ddfields->* TO <lt_ddfields>.
+        ASSERT sy-subrc = 0.
+        lr_struct ?= cl_abap_typedescr=>describe_by_name( lv_tabname ).
+        lr_struct->get_ddic_field_list(
+          RECEIVING
+            p_field_list = <lt_ddfields>
+          EXCEPTIONS
+            not_found    = 1
+            no_ddic_type = 2 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise( |Table { iv_name } not found| ).
+        ENDIF.
+        LOOP AT <lt_ddfields> ASSIGNING <lg_any>.
+          ASSIGN COMPONENT 'KEYFLAG' OF STRUCTURE <lg_any> TO <lv_field>.
+          IF sy-subrc <> 0 OR <lv_field> <> abap_true.
+            CONTINUE.
+          ENDIF.
+          ASSIGN COMPONENT 'FIELDNAME' OF STRUCTURE <lg_any> TO <lv_field>.
+          ASSERT sy-subrc = 0.
+          APPEND <lv_field> TO rt_names.
+        ENDLOOP.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/data/zcl_abapgit_data_utils.clas.testclasses.abap.html b/src/data/zcl_abapgit_data_utils.clas.testclasses.abap.html new file mode 100644 index 00000000000..9c69269bcb9 --- /dev/null +++ b/src/data/zcl_abapgit_data_utils.clas.testclasses.abap.html @@ -0,0 +1,298 @@ + + + + + + Code coverage report for src/data/zcl_abapgit_data_utils.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/data zcl_abapgit_data_utils.clas.testclasses.abap

+
+ +
+ 100% + Statements + 71/71 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 71/71 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +721x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_data_utils_test DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
+ 
+  PRIVATE SECTION.
+    METHODS build_data_filename FOR TESTING RAISING cx_static_check.
+    METHODS build_config_filename FOR TESTING RAISING cx_static_check.
+    METHODS build_table_itab FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_data_utils_test IMPLEMENTATION.
+ 
+  METHOD build_data_filename.
+ 
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+ 
+    ls_config-name = 'T100'.
+    ls_config-type = 'TABU'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_data_utils=>build_data_filename( ls_config )
+      exp = 't100.tabu.json' ).
+ 
+    ls_config-name = '/NSPC/T200'.
+    ls_config-type = 'TABU'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_data_utils=>build_data_filename( ls_config )
+      exp = '#nspc#t200.tabu.json' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD build_config_filename.
+ 
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+ 
+    ls_config-name = 'T100'.
+    ls_config-type = 'TABU'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_data_utils=>build_config_filename( ls_config )
+      exp = 't100.conf.json' ).
+ 
+    ls_config-name = '/NSPC/T200'.
+    ls_config-type = 'TABU'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_data_utils=>build_config_filename( ls_config )
+      exp = '#nspc#t200.conf.json' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD build_table_itab.
+ 
+    DATA lr_data TYPE REF TO data.
+    DATA ls_row  TYPE t100.
+    FIELD-SYMBOLS <lt_tab> TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_row> TYPE any.
+ 
+    lr_data = zcl_abapgit_data_utils=>build_table_itab( 'T100' ).
+    ASSIGN lr_data->* TO <lt_tab>.
+ 
+* test that the table works with basic itab operations,
+    INSERT ls_row INTO TABLE <lt_tab>.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+    READ TABLE <lt_tab> ASSIGNING <ls_row> FROM ls_row.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/exits/index.html b/src/exits/index.html new file mode 100644 index 00000000000..34259db4359 --- /dev/null +++ b/src/exits/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/exits + + + + + + + + + +
+
+

All files src/exits

+
+ +
+ 55.96% + Statements + 258/461 +
+ + +
+ 43.75% + Branches + 7/16 +
+ + +
+ 36.84% + Functions + 7/19 +
+ + +
+ 55.96% + Lines + 258/461 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_auth.clas.abap +
+
100%36/36100%0/0100%0/0100%36/36
zcl_abapgit_auth.clas.testclasses.abap +
+
100%23/23100%1/1100%1/1100%23/23
zcl_abapgit_exit.clas.abap +
+
49.5%199/40240%6/1533.33%6/1849.5%199/402
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/exits/zcl_abapgit_auth.clas.abap.html b/src/exits/zcl_abapgit_auth.clas.abap.html new file mode 100644 index 00000000000..50eff38cb76 --- /dev/null +++ b/src/exits/zcl_abapgit_auth.clas.abap.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for src/exits/zcl_abapgit_auth.clas.abap + + + + + + + + + +
+
+

All files / src/exits zcl_abapgit_auth.clas.abap

+
+ +
+ 100% + Statements + 36/36 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 36/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +371x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_auth DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS is_allowed
+      IMPORTING
+        !iv_authorization TYPE zif_abapgit_auth=>ty_authorization
+        !iv_param         TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_allowed) TYPE abap_bool .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_auth IMPLEMENTATION.
+ 
+ 
+  METHOD is_allowed.
+ 
+    DATA: li_auth TYPE REF TO zif_abapgit_auth.
+ 
+    TRY.
+        CREATE OBJECT li_auth TYPE ('ZCL_ABAPGIT_AUTH_EXIT').
+        rv_allowed = li_auth->is_allowed( iv_authorization = iv_authorization
+                                          iv_param         = iv_param ).
+      CATCH cx_sy_create_object_error.
+        rv_allowed = abap_true.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/exits/zcl_abapgit_auth.clas.testclasses.abap.html b/src/exits/zcl_abapgit_auth.clas.testclasses.abap.html new file mode 100644 index 00000000000..06faae0cce5 --- /dev/null +++ b/src/exits/zcl_abapgit_auth.clas.testclasses.abap.html @@ -0,0 +1,154 @@ + + + + + + Code coverage report for src/exits/zcl_abapgit_auth.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/exits zcl_abapgit_auth.clas.testclasses.abap

+
+ +
+ 100% + Statements + 23/23 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 23/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +241x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
 
+CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS default_is_allow FOR TESTING.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD default_is_allow.
+ 
+    DATA lv_allowed TYPE abap_bool.
+ 
+    lv_allowed = zcl_abapgit_auth=>is_allowed( 'DUMMY_UNIT_TEST' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_allowed
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/exits/zcl_abapgit_exit.clas.abap.html b/src/exits/zcl_abapgit_exit.clas.abap.html new file mode 100644 index 00000000000..27611655a8f --- /dev/null +++ b/src/exits/zcl_abapgit_exit.clas.abap.html @@ -0,0 +1,1291 @@ + + + + + + Code coverage report for src/exits/zcl_abapgit_exit.clas.abap + + + + + + + + + +
+
+

All files / src/exits zcl_abapgit_exit.clas.abap

+
+ +
+ 49.5% + Statements + 199/402 +
+ + +
+ 40% + Branches + 6/15 +
+ + +
+ 33.33% + Functions + 6/18 +
+ + +
+ 49.5% + Lines + 199/402 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +4031x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +  +  +  +  +  +2x +2x +1x +1x +1x +2x +2x +  +  +  +  +  +  +  +  +  +2x +2x +1x +1x +1x +2x +2x +  +  +  +  +  +  +  +  +  +2x +2x +1x +1x +1x +2x +2x +  +  +  +  +  +  +  +  +  +2x +2x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +  +  +  +  +  +  +  +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_exit DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_exit .
+ 
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ri_exit) TYPE REF TO zif_abapgit_exit .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_exit TYPE REF TO zif_abapgit_exit .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_exit IMPLEMENTATION.
+ 
+ 
+  METHOD get_instance.
+ 
+    DATA lv_class_name TYPE string.
+ 
+    lv_class_name = 'ZCL_ABAPGIT_USER_EXIT'.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      " Prevent accidental usage of exit handlers in the developer version
+      lv_class_name = |\\PROGRAM={ sy-repid }\\CLASS={ lv_class_name }|.
+    ENDIF.
+ 
+    IF gi_exit IS INITIAL.
+      TRY.
+          CREATE OBJECT gi_exit TYPE (lv_class_name).
+        CATCH cx_sy_create_object_error ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+    CREATE OBJECT ri_exit TYPE zcl_abapgit_exit.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~adjust_display_commit_url.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->adjust_display_commit_url(
+            EXPORTING
+              iv_repo_url    = iv_repo_url
+              iv_repo_name   = iv_repo_name
+              iv_repo_key    = iv_repo_key
+              iv_commit_hash = iv_commit_hash
+            CHANGING
+              cv_display_url = cv_display_url ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~adjust_display_filename.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rv_filename = gi_exit->adjust_display_filename( iv_filename ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+    IF rv_filename IS INITIAL.
+      rv_filename = iv_filename.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~allow_sap_objects.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rv_allowed = gi_exit->allow_sap_objects( ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_local_host.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_local_host( CHANGING ct_hosts = ct_hosts ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_proxy_authentication.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_proxy_authentication(
+            EXPORTING
+              iv_repo_url             = iv_repo_url
+            CHANGING
+              cv_proxy_authentication = cv_proxy_authentication ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_proxy_port.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_proxy_port(
+            EXPORTING
+              iv_repo_url   = iv_repo_url
+            CHANGING
+              cv_proxy_port = cv_proxy_port ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_proxy_url.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_proxy_url(
+            EXPORTING
+              iv_repo_url  = iv_repo_url
+            CHANGING
+              cv_proxy_url = cv_proxy_url ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_supported_data_objects.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_supported_data_objects( CHANGING ct_objects = ct_objects ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_supported_object_types.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_supported_object_types( CHANGING ct_types = ct_types ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~change_tadir.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->change_tadir(
+            EXPORTING
+              iv_package = iv_package
+              ii_log     = ii_log
+            CHANGING
+              ct_tadir   = ct_tadir ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~create_http_client.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          ri_client = gi_exit->create_http_client( iv_url ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~custom_serialize_abap_clif.
+ 
+    " This exit might be called twice per object
+    " 1st call: it_source = initial
+    "    Can be used for serializing complete source
+    "    If source is returned, there will be no second call
+    " 2nd call: it_source = code as serialized by abapGit
+    "    Can be used for post-processing of source
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rt_source = gi_exit->custom_serialize_abap_clif(
+            is_class_key = is_class_key
+            it_source    = it_source ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+    IF rt_source IS INITIAL.
+      rt_source = it_source.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~deserialize_postprocess.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->deserialize_postprocess( is_step = is_step
+                                            ii_log  = ii_log ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~determine_transport_request.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->determine_transport_request(
+            EXPORTING
+              io_repo              = io_repo
+              iv_transport_type    = iv_transport_type
+            CHANGING
+              cv_transport_request = cv_transport_request ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~get_ci_tests.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->get_ci_tests(
+            EXPORTING
+              iv_object   = iv_object
+            CHANGING
+              ct_ci_repos = ct_ci_repos ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~get_ssl_id.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rv_ssl_id = gi_exit->get_ssl_id( ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+    IF rv_ssl_id IS INITIAL.
+      rv_ssl_id = 'ANONYM'.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~http_client.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->http_client(
+            iv_url    = iv_url
+            ii_client = ii_client ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~on_event.
+ 
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          rs_handled = gi_exit->on_event( ii_event ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~pre_calculate_repo_status.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->pre_calculate_repo_status(
+            EXPORTING
+              is_repo_meta = is_repo_meta
+            CHANGING
+              ct_local     = ct_local
+              ct_remote    = ct_remote ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~serialize_postprocess.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->serialize_postprocess(
+            EXPORTING
+              iv_package = iv_package
+              ii_log     = ii_log
+            CHANGING
+              ct_files   = ct_files ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~validate_before_push.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->validate_before_push(
+            is_comment = is_comment
+            io_stage   = io_stage
+            io_repo    = io_repo ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~wall_message_list.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->wall_message_list( ii_html ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_exit~wall_message_repo.
+
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->wall_message_repo(
+            is_repo_meta = is_repo_meta
+            ii_html      = ii_html ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+  METHOD zif_abapgit_exit~enhance_repo_toolbar.
+    IF gi_exit IS NOT INITIAL.
+      TRY.
+          gi_exit->enhance_repo_toolbar(
+            io_menu = io_menu
+            iv_key  = iv_key
+            iv_act  = iv_act ).
+        CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER.
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/index.html b/src/git/index.html new file mode 100644 index 00000000000..4bde3164856 --- /dev/null +++ b/src/git/index.html @@ -0,0 +1,401 @@ + + + + + + Code coverage report for src/git + + + + + + + + + +
+
+

All files src/git

+
+ +
+ 97.94% + Statements + 5857/5980 +
+ + +
+ 75.22% + Branches + 167/222 +
+ + +
+ 100% + Functions + 111/111 +
+ + +
+ 97.94% + Lines + 5857/5980 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_git_add_patch.clas.abap +
+
100%117/117100%4/4100%0/0100%117/117
zcl_abapgit_git_add_patch.clas.testclasses.abap +
+
100%711/711100%19/19100%19/19100%711/711
zcl_abapgit_git_branch_list.clas.abap +
+
93.59%307/32870%21/30100%0/093.59%307/328
zcl_abapgit_git_branch_list.clas.testclasses.abap +
+
100%160/160100%7/7100%6/6100%160/160
zcl_abapgit_git_commit.clas.abap +
+
98.8%330/33475%6/8100%2/298.8%330/334
zcl_abapgit_git_commit.clas.testclasses.abap +
+
100%318/318100%21/21100%21/21100%318/318
zcl_abapgit_git_pack.clas.abap +
+
94.44%901/95441.93%13/31100%0/094.44%901/954
zcl_abapgit_git_pack.clas.locals_imp.abap +
+
100%25/25100%0/0100%0/0100%25/25
zcl_abapgit_git_pack.clas.testclasses.abap +
+
100%794/794100%37/37100%37/37100%794/794
zcl_abapgit_git_porcelain.clas.abap +
+
99.27%821/82757.14%4/7100%2/299.27%821/827
zcl_abapgit_git_porcelain.clas.testclasses.abap +
+
100%153/153100%8/8100%8/8100%153/153
zcl_abapgit_git_tag.clas.abap +
+
100%72/72100%0/0100%0/0100%72/72
zcl_abapgit_git_time.clas.abap +
+
100%78/78100%0/0100%0/0100%78/78
zcl_abapgit_git_time.clas.testclasses.abap +
+
100%42/42100%2/2100%2/2100%42/42
zcl_abapgit_git_transport.clas.abap +
+
92.53%409/44233.33%10/30100%0/092.53%409/442
zcl_abapgit_git_transport.clas.testclasses.abap +
+
100%180/180100%6/6100%6/6100%180/180
zcl_abapgit_git_utils.clas.abap +
+
96.59%85/8833.33%1/3100%0/096.59%85/88
zcl_abapgit_git_utils.clas.testclasses.abap +
+
100%75/75100%4/4100%4/4100%75/75
zcl_abapgit_hash.clas.abap +
+
98.55%205/2080%0/1100%0/098.55%205/208
zcl_abapgit_hash.clas.testclasses.abap +
+
100%74/74100%4/4100%4/4100%74/74
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_add_patch.clas.abap.html b/src/git/zcl_abapgit_git_add_patch.clas.abap.html new file mode 100644 index 00000000000..91230ccb195 --- /dev/null +++ b/src/git/zcl_abapgit_git_add_patch.clas.abap.html @@ -0,0 +1,436 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_add_patch.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_add_patch.clas.abap

+
+ +
+ 100% + Statements + 117/117 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 117/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +1181x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +1x +1x +1x +1x +3x +3x +1x +1x +1x +1x +7x +7x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_add_patch DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          it_diff TYPE zif_abapgit_definitions=>ty_diffs_tt,
+ 
+      get_patch
+        RETURNING
+          VALUE(rt_patch) TYPE string_table
+        RAISING
+          zcx_abapgit_exception,
+ 
+      get_patch_binary
+        RETURNING
+          VALUE(rv_patch_binary) TYPE xstring
+        RAISING
+          zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA:
+      mt_diff  TYPE zif_abapgit_definitions=>ty_diffs_tt,
+      mt_patch TYPE string_table.
+ 
+    METHODS:
+      calculate_patch
+        RETURNING
+          VALUE(rt_patch) TYPE string_table
+        RAISING
+          zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GIT_ADD_PATCH IMPLEMENTATION.
+ 
+ 
+  METHOD calculate_patch.
+ 
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
+ 
+    LOOP AT mt_diff ASSIGNING <ls_diff>.
+ 
+      CASE <ls_diff>-result.
+        WHEN zif_abapgit_definitions=>c_diff-unchanged.
+ 
+          INSERT <ls_diff>-old INTO TABLE rt_patch.
+ 
+        WHEN zif_abapgit_definitions=>c_diff-insert.
+ 
+          IF <ls_diff>-patch_flag = abap_true.
+            INSERT <ls_diff>-new INTO TABLE rt_patch.
+          ENDIF.
+ 
+        WHEN zif_abapgit_definitions=>c_diff-delete.
+ 
+          IF <ls_diff>-patch_flag = abap_false.
+            INSERT <ls_diff>-old INTO TABLE rt_patch.
+          ENDIF.
+ 
+        WHEN zif_abapgit_definitions=>c_diff-update.
+ 
+          IF <ls_diff>-patch_flag = abap_true.
+            INSERT <ls_diff>-new INTO TABLE rt_patch.
+          ELSE.
+            INSERT <ls_diff>-old INTO TABLE rt_patch.
+          ENDIF.
+ 
+        WHEN OTHERS.
+ 
+          zcx_abapgit_exception=>raise( |Unknown result| ).
+ 
+      ENDCASE.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    mt_diff = it_diff.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_patch.
+ 
+    IF mt_patch IS INITIAL.
+      mt_patch = calculate_patch( ).
+    ENDIF.
+ 
+    rt_patch = mt_patch.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_patch_binary.
+ 
+    DATA: lv_string TYPE string.
+ 
+    IF mt_patch IS INITIAL.
+      mt_patch = calculate_patch( ).
+    ENDIF.
+ 
+    CONCATENATE LINES OF mt_patch INTO lv_string SEPARATED BY cl_abap_char_utilities=>newline.
+    lv_string = lv_string && cl_abap_char_utilities=>newline.
+ 
+    rv_patch_binary = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_add_patch.clas.testclasses.abap.html b/src/git/zcl_abapgit_git_add_patch.clas.testclasses.abap.html new file mode 100644 index 00000000000..69588e86a02 --- /dev/null +++ b/src/git/zcl_abapgit_git_add_patch.clas.testclasses.abap.html @@ -0,0 +1,2218 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_add_patch.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_add_patch.clas.testclasses.abap

+
+ +
+ 100% + Statements + 711/711 +
+ + +
+ 100% + Branches + 19/19 +
+ + +
+ 100% + Functions + 19/19 +
+ + +
+ 100% + Lines + 711/711 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +7121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +60x +60x +60x +60x +60x +60x +60x +60x +60x +60x +60x +60x +60x +60x +1x +1x +1x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +1x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
*"* use this source file for your ABAP unit test classes
+ 
+CLASS ltcl_calculate_patch DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      single_insert FOR TESTING RAISING cx_static_check,
+      multiple_adjacent_insert FOR TESTING RAISING cx_static_check,
+      multiple_non_adjacent_insert FOR TESTING RAISING cx_static_check,
+      multiple_partial_insert FOR TESTING RAISING cx_static_check,
+ 
+      single_delete FOR TESTING RAISING cx_static_check,
+      multiple_adjacend_delete FOR TESTING RAISING cx_static_check,
+      multiple_non_adjacent_delete FOR TESTING RAISING cx_static_check,
+      multiple_partial_delete FOR TESTING RAISING cx_static_check,
+ 
+      single_update FOR TESTING RAISING cx_static_check,
+      multiple_adjacend_update FOR TESTING RAISING cx_static_check,
+      multiple_non_adjacent_update FOR TESTING RAISING cx_static_check,
+      multiple_partial_update FOR TESTING RAISING cx_static_check,
+ 
+      mixed FOR TESTING RAISING cx_static_check,
+ 
+      no_diff FOR TESTING RAISING cx_static_check,
+ 
+      unknown_result_type FOR TESTING RAISING cx_static_check.
+ 
+    METHODS:
+      given_diff
+        IMPORTING
+          iv_patch_flag TYPE zif_abapgit_definitions=>ty_diff-patch_flag
+          iv_new_num    TYPE zif_abapgit_definitions=>ty_diff-new_num
+          iv_new        TYPE zif_abapgit_definitions=>ty_diff-new
+          iv_result     TYPE zif_abapgit_definitions=>ty_diff-result
+          iv_old_num    TYPE zif_abapgit_definitions=>ty_diff-old_num
+          iv_old        TYPE zif_abapgit_definitions=>ty_diff-old
+          iv_short      TYPE zif_abapgit_definitions=>ty_diff-short DEFAULT 'X'
+          iv_beacon     TYPE zif_abapgit_definitions=>ty_diff-beacon DEFAULT 1,
+ 
+      when_patch_is_calculated,
+ 
+      then_patch_should_be
+        IMPORTING
+          iv_exp_patch TYPE string,
+      then_exception_is_raised.
+ 
+    DATA:
+      mt_diff  TYPE zif_abapgit_definitions=>ty_diffs_tt,
+      mt_patch TYPE string_table,
+      mx_error TYPE REF TO zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_calculate_patch IMPLEMENTATION.
+ 
+  METHOD single_insert.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Test`.'
+                iv_result     = 'I'
+                iv_old_num    = '     '
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    3'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    2'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Test`.\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_adjacent_insert.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Test`.'
+                iv_result     = 'I'
+                iv_old_num    = '     '
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    3'
+                iv_new        = 'write: `Hello world`.'
+                iv_result     = 'I'
+                iv_old_num    = '     '
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    4'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    2'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Test`.\n| &&
+      |write: `Hello world`.\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_non_adjacent_insert.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Test`.'
+                iv_result     = 'I'
+                iv_old_num    = '     '
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    3'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    2'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    4'
+                iv_new        = 'write: `Hello world`.'
+                iv_result     = 'I'
+                iv_old_num    = '     '
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    5'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    3'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Test`.\n| &&
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_partial_insert.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Test`.'
+                iv_result     = 'I'
+                iv_old_num    = '     '
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    3'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    2'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    4'
+                iv_new        = 'write: `Hello world`.'
+                iv_result     = 'I'
+                iv_old_num    = '     '
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    5'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    3'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Test`.\n| &&
+      |\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD single_delete.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    2'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    3'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be( |\n\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_adjacend_delete.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    3'
+                iv_old        = 'write: `Hello world`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    2'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    4'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be( |\n\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_non_adjacent_delete.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    3'
+                iv_old        = 'write: `Hello world`.' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    4'
+                iv_old        = 'write: `Hello 123`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    2'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    5'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Hello world`.| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_partial_delete.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    3'
+                iv_old        = 'write: `Hello world`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    4'
+                iv_old        = 'write: `Hello 123`.' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '     '
+                iv_new        = ' '
+                iv_result     = 'D'
+                iv_old_num    = '    5'
+                iv_old        = 'write: `Hello test`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    2'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    6'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |write: `Hello 123`.\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD single_update.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Hello world`.'
+                iv_result     = 'U'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    3'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    3'
+                iv_old        = ' ' ).
+ 
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_adjacend_update.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Hello world`.'
+                iv_result     = 'U'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    3'
+                iv_new        = 'write: `Test`.'
+                iv_result     = 'U'
+                iv_old_num    = '    3'
+                iv_old        = 'write: `Hello world`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    4'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    4'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |write: `Test`.\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_non_adjacent_update.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Hello world`.'
+                iv_result     = 'U'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    3'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    3'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    4'
+                iv_new        = 'write: `Test`.'
+                iv_result     = 'U'
+                iv_old_num    = '    4'
+                iv_old        = 'write: `Hello world`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    5'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    5'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |\n| &&
+      |write: `Test`.\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multiple_partial_update.
+ 
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Hello world`.'
+                iv_result     = 'U'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    3'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    3'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    4'
+                iv_new        = 'write: `Test`.'
+                iv_result     = 'U'
+                iv_old_num    = '    4'
+                iv_old        = 'write: `Hello world`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    5'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    5'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |\n| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD mixed.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    2'
+                iv_new        = 'write: `Hello world`.'
+                iv_result     = 'U'
+                iv_old_num    = '    2'
+                iv_old        = 'write: `Test`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    3'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    3'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    4'
+                iv_new        = 'write: `Test`.'
+                iv_result     = 'U'
+                iv_old_num    = '    4'
+                iv_old        = 'write: `Hello world`.' ).
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    5'
+                iv_new        = ' '
+                iv_result     = ' '
+                iv_old_num    = '    5'
+                iv_old        = ' ' ).
+ 
+    given_diff( iv_patch_flag = 'X'
+                iv_new_num    = '    6'
+                iv_new        = 'write: `newline`.'
+                iv_result     = 'I'
+                iv_old_num    = '     '
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be(
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |\n| &&
+      |write: `Hello world`.\n| &&
+      |\n| &&
+      |write: `newline`.\n| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD no_diff.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = '" new'
+                iv_result     = ' '
+                iv_old_num    = '    1'
+                iv_old        = '" old' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_patch_should_be( |" old| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD unknown_result_type.
+ 
+    given_diff( iv_patch_flag = ' '
+                iv_new_num    = '    1'
+                iv_new        = ' '
+                iv_result     = 'X'
+                iv_old_num    = '    1'
+                iv_old        = ' ' ).
+ 
+    when_patch_is_calculated( ).
+ 
+    then_exception_is_raised( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD given_diff.
+ 
+    DATA: ls_diff LIKE LINE OF mt_diff.
+ 
+    ls_diff-patch_flag = iv_patch_flag.
+    ls_diff-new_num    = iv_new_num.
+    ls_diff-new        = iv_new.
+    ls_diff-result     = iv_result.
+    ls_diff-old_num    = iv_old_num.
+    ls_diff-old        = iv_old.
+    ls_diff-short      = iv_short.
+    ls_diff-beacon     = iv_beacon.
+    INSERT ls_diff INTO TABLE mt_diff.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD when_patch_is_calculated.
+ 
+    DATA: lo_git_add_patch TYPE REF TO zcl_abapgit_git_add_patch.
+ 
+    CREATE OBJECT lo_git_add_patch
+      EXPORTING
+        it_diff = mt_diff.
+ 
+    TRY.
+        mt_patch = lo_git_add_patch->get_patch( ).
+      CATCH zcx_abapgit_exception INTO mx_error ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD then_patch_should_be.
+ 
+    DATA: lt_patch TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          lv_patch LIKE LINE OF lt_patch.
+ 
+    FIELD-SYMBOLS: <lv_patch> LIKE LINE OF mt_patch.
+ 
+    SPLIT iv_exp_patch AT |\n| INTO TABLE lt_patch IN CHARACTER MODE.
+ 
+    LOOP AT lt_patch INTO lv_patch.
+      READ TABLE mt_patch INDEX sy-tabix ASSIGNING <lv_patch>.
+      cl_abap_unit_assert=>assert_subrc( ).
+ 
+      cl_abap_unit_assert=>assert_equals(
+        exp = lv_patch
+        act = <lv_patch> ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD then_exception_is_raised.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |Unknown result|
+      act = mx_error->get_text( ) ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_branch_list.clas.abap.html b/src/git/zcl_abapgit_git_branch_list.clas.abap.html new file mode 100644 index 00000000000..25bf6885db8 --- /dev/null +++ b/src/git/zcl_abapgit_git_branch_list.clas.abap.html @@ -0,0 +1,1069 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_branch_list.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_branch_list.clas.abap

+
+ +
+ 93.59% + Statements + 307/328 +
+ + +
+ 70% + Branches + 21/30 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 93.59% + Lines + 307/328 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +3291x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +1x +1x +16x +5x +5x +5x +  +  +5x +5x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +1x +7x +7x +1x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_branch_list DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING
+        !iv_data TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS find_by_name
+      IMPORTING
+        !iv_branch_name  TYPE clike
+      RETURNING
+        VALUE(rs_branch) TYPE zif_abapgit_git_definitions=>ty_git_branch
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_head_symref
+      RETURNING
+        VALUE(rv_head_symref) TYPE string .
+    METHODS get_all
+      RETURNING
+        VALUE(rt_branches) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_branches_only
+      RETURNING
+        VALUE(rt_branches) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_tags_only             " For potential future use
+      RETURNING
+        VALUE(rt_tags) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_display_name
+      IMPORTING
+        !iv_branch_name        TYPE clike
+      RETURNING
+        VALUE(rv_display_name) TYPE string .
+    CLASS-METHODS get_type
+      IMPORTING
+        !iv_branch_name       TYPE clike
+        !it_result            TYPE string_table OPTIONAL
+        !iv_current_row_index TYPE sy-tabix OPTIONAL
+      RETURNING
+        VALUE(rv_type)        TYPE zif_abapgit_git_definitions=>ty_git_branch_type .
+    CLASS-METHODS complete_heads_branch_name
+      IMPORTING
+        !iv_branch_name TYPE clike
+      RETURNING
+        VALUE(rv_name)  TYPE string .
+    CLASS-METHODS normalize_branch_name
+      IMPORTING
+        !iv_branch_name TYPE clike
+      RETURNING
+        VALUE(rv_name)  TYPE string .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt .
+    DATA mv_head_symref TYPE string .
+ 
+    CLASS-METHODS skip_first_pkt
+      IMPORTING
+        !iv_data       TYPE string
+      RETURNING
+        VALUE(rv_data) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS find_tag_by_name
+      IMPORTING
+        !iv_branch_name  TYPE string
+      RETURNING
+        VALUE(rs_branch) TYPE zif_abapgit_git_definitions=>ty_git_branch
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS parse_branch_list
+      IMPORTING
+        !iv_data        TYPE string
+      EXPORTING
+        !et_list        TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+        !ev_head_symref TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS parse_head_params
+      IMPORTING
+        !iv_data              TYPE string
+      RETURNING
+        VALUE(rv_head_symref) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_branch_list IMPLEMENTATION.
+ 
+ 
+  METHOD complete_heads_branch_name.
+    IF iv_branch_name CP zif_abapgit_git_definitions=>c_git_branch-heads.
+      rv_name = iv_branch_name.
+    ELSE.
+      rv_name = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && iv_branch_name.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    parse_branch_list(
+      EXPORTING
+        iv_data        = iv_data
+      IMPORTING
+        et_list        = mt_branches
+        ev_head_symref = mv_head_symref ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_by_name.
+ 
+    IF iv_branch_name IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Branch name empty' ).
+    ENDIF.
+ 
+    IF iv_branch_name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+      rs_branch = find_tag_by_name( iv_branch_name ).
+    ELSE.
+ 
+      READ TABLE mt_branches INTO rs_branch
+        WITH TABLE KEY name_key
+        COMPONENTS name = iv_branch_name.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Branch { get_display_name( iv_branch_name )
+          } not found. Use 'Branch' > 'Switch' to select a different branch| ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_tag_by_name.
+ 
+    READ TABLE mt_branches INTO rs_branch
+        WITH TABLE KEY name_key
+        COMPONENTS name = zcl_abapgit_git_tag=>add_peel( iv_branch_name ).
+    IF sy-subrc <> 0.
+ 
+      READ TABLE mt_branches INTO rs_branch
+        WITH TABLE KEY name_key
+        COMPONENTS name = iv_branch_name.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( 'Branch not found' ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_all.
+ 
+    rt_branches = mt_branches.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_branches_only.
+    FIELD-SYMBOLS <ls_branch> LIKE LINE OF mt_branches.
+ 
+    LOOP AT mt_branches ASSIGNING <ls_branch>.
+      IF <ls_branch>-type = zif_abapgit_git_definitions=>c_git_branch_type-branch.
+        APPEND <ls_branch> TO rt_branches.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_display_name.
+    rv_display_name = iv_branch_name.
+ 
+    IF rv_display_name CP zif_abapgit_git_definitions=>c_git_branch-heads.
+      REPLACE FIRST OCCURRENCE OF zif_abapgit_git_definitions=>c_git_branch-heads_prefix IN rv_display_name WITH ''.
+    ELSEIF rv_display_name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+      rv_display_name = zcl_abapgit_git_tag=>remove_tag_prefix( zcl_abapgit_git_tag=>remove_peel( rv_display_name ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_head_symref.
+    rv_head_symref = mv_head_symref.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_tags_only.
+    FIELD-SYMBOLS <ls_branch> LIKE LINE OF mt_branches.
+ 
+    LOOP AT mt_branches ASSIGNING <ls_branch>
+        WHERE type = zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag
+        OR type = zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag.
+      APPEND <ls_branch> TO rt_tags.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_type.
+ 
+    FIELD-SYMBOLS: <lv_result> TYPE LINE OF string_table.
+ 
+    rv_type = zif_abapgit_git_definitions=>c_git_branch_type-other.
+ 
+    IF iv_branch_name CP zif_abapgit_git_definitions=>c_git_branch-heads OR
+       iv_branch_name = zif_abapgit_git_definitions=>c_head_name.
+      rv_type = zif_abapgit_git_definitions=>c_git_branch_type-branch.
+ 
+    ELSEIF iv_branch_name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+
+      READ TABLE it_result ASSIGNING <lv_result>
+                           INDEX iv_current_row_index + 1.
+      IF sy-subrc = 0 AND <lv_result> CP '*' && zcl_abapgit_git_tag=>add_peel( iv_branch_name ).
+        rv_type = zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag.
+      ELSE.
+        rv_type = zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag.
+      ENDIF.
+
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_branch_name.
+ 
+    rv_name = iv_branch_name. " Force convert to string
+    REPLACE ALL OCCURRENCES OF ` ` IN rv_name WITH '-'. " Disallow space in branch name
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_branch_list.
+ 
+    DATA: lt_result            TYPE TABLE OF string,
+          lv_hash              TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_name              TYPE string,
+          lv_head_params       TYPE string,
+          lv_char              TYPE c,
+          lv_data              LIKE LINE OF lt_result,
+          lv_current_row_index TYPE syst-tabix.
+ 
+    FIELD-SYMBOLS: <ls_branch> LIKE LINE OF et_list.
+ 
+    CLEAR: et_list, ev_head_symref.
+ 
+    lv_data = skip_first_pkt( iv_data ).
+    SPLIT lv_data AT cl_abap_char_utilities=>newline INTO TABLE lt_result.
+ 
+    LOOP AT lt_result INTO lv_data.
+      lv_current_row_index = sy-tabix.
+ 
+      IF sy-tabix = 1 AND strlen( lv_data ) > 12 AND lv_data(4) = '0000' AND lv_data+8(3) = 'ERR'.
+        lv_name = lv_data+8.
+        zcx_abapgit_exception=>raise( lv_name ).
+      ELSEIF sy-tabix = 1 AND strlen( lv_data ) > 49.
+        lv_hash = lv_data+8.
+        lv_name = lv_data+49.
+        lv_char = zcl_abapgit_git_utils=>get_null( ).
+ 
+        SPLIT lv_name AT lv_char INTO lv_name lv_head_params.
+        ev_head_symref = parse_head_params( lv_head_params ).
+        IF ev_head_symref IS INITIAL AND lv_name CS 'refs/heads/'.
+          ev_head_symref = lv_name.
+        ENDIF.
+      ELSEIF sy-tabix > 1 AND strlen( lv_data ) > 45.
+        lv_hash = lv_data+4.
+        lv_name = lv_data+45.
+      ELSEIF sy-tabix = 1 AND strlen( lv_data ) = 8 AND lv_data(8) = '00000000'.
+        zcx_abapgit_exception=>raise( 'No branches, create branch manually by adding file' ).
+      ELSE.
+        CONTINUE.
+      ENDIF.
+ 
+      ASSERT lv_name IS NOT INITIAL.
+ 
+      APPEND INITIAL LINE TO et_list ASSIGNING <ls_branch>.
+      <ls_branch>-sha1         = lv_hash.
+      <ls_branch>-name         = lv_name.
+      <ls_branch>-display_name = get_display_name( lv_name ).
+      <ls_branch>-type         = get_type( iv_branch_name       = lv_name
+                                           it_result            = lt_result
+                                           iv_current_row_index = lv_current_row_index ).
+      IF <ls_branch>-name = zif_abapgit_git_definitions=>c_head_name OR <ls_branch>-name = ev_head_symref.
+        <ls_branch>-is_head = abap_true.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_head_params.
+ 
+    DATA: ls_match    TYPE match_result,
+          ls_submatch LIKE LINE OF ls_match-submatches.
+ 
+    FIND FIRST OCCURRENCE OF REGEX '\ssymref=HEAD:([^\s]+)' IN iv_data RESULTS ls_match.
+    READ TABLE ls_match-submatches INTO ls_submatch INDEX 1.
+    IF sy-subrc IS INITIAL.
+      rv_head_symref = iv_data+ls_submatch-offset(ls_submatch-length).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD skip_first_pkt.
+ 
+    DATA: lv_hex    TYPE x LENGTH 1,
+          lv_length TYPE i.
+ 
+* channel
+    ASSERT iv_data(2) = '00'.
+ 
+    lv_hex = to_upper( iv_data+2(2) ).
+    lv_length = lv_hex.
+ 
+    rv_data = iv_data+lv_length.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_branch_list.clas.testclasses.abap.html b/src/git/zcl_abapgit_git_branch_list.clas.testclasses.abap.html new file mode 100644 index 00000000000..596b5c41f2e --- /dev/null +++ b/src/git/zcl_abapgit_git_branch_list.clas.testclasses.abap.html @@ -0,0 +1,565 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_branch_list.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_branch_list.clas.testclasses.abap

+
+ +
+ 100% + Statements + 160/160 +
+ + +
+ 100% + Branches + 7/7 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 160/160 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +1611x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_parse DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_branch_list DEFINITION LOCAL FRIENDS ltcl_parse.
+ 
+CLASS ltcl_parse DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      parse
+        IMPORTING
+          iv_expected_lines TYPE i DEFAULT 2
+        RAISING
+          zcx_abapgit_exception.
+ 
+    METHODS:
+      parse_ok_without_first_lf FOR TESTING RAISING zcx_abapgit_exception,
+      parse_works FOR TESTING RAISING zcx_abapgit_exception,
+      captcha_response_is_caught FOR TESTING RAISING zcx_abapgit_exception,
+      parse_raw FOR TESTING RAISING cx_static_check,
+      use_refs_if_head_is_missing FOR TESTING RAISING cx_static_check.
+ 
+    DATA: mt_data TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_parse IMPLEMENTATION.
+ 
+  METHOD parse.
+ 
+    DATA: lv_data TYPE string,
+          lt_list TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt.
+ 
+    CONCATENATE LINES OF mt_data INTO lv_data SEPARATED BY cl_abap_char_utilities=>newline.
+ 
+    zcl_abapgit_git_branch_list=>parse_branch_list(
+      EXPORTING
+        iv_data = lv_data
+      IMPORTING
+        et_list = lt_list ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( lt_list ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_list )
+      exp = iv_expected_lines ).
+ 
+    READ TABLE lt_list WITH TABLE KEY name_key
+                       COMPONENTS name = zif_abapgit_git_definitions=>c_git_branch-main
+                       TRANSPORTING NO FIELDS.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_ok_without_first_lf.
+ 
+* without linefeed after first pkt-line
+*
+* see https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt
+*
+* "unless otherwise noted the usual pkt-line LF rules apply: the sender SHOULD include a
+* LF, but the receiver MUST NOT complain if it is not present"
+ 
+    APPEND '001d# service=git-upload-pack000000d2b5d5f1f84ebcaeb8a299edd14c959518e9d81bb5 HEAD#asdf' TO mt_data.
+    APPEND '003fb5d5f1f84ebcaeb8a299edd14c959518e9d81bb5 refs/heads/main' TO mt_data.
+    APPEND '0000' TO mt_data.
+ 
+    parse( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_works.
+ 
+    APPEND '001e# service=git-upload-pack' TO mt_data.
+    APPEND '000001080e6fe6b311f789ccbac6c5122702d4f48a4f6bda HEAD#asdf' TO mt_data.
+    APPEND '003f0e6fe6b311f789ccbac6c5122702d4f48a4f6bda refs/heads/main' TO mt_data.
+ 
+    parse( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD captcha_response_is_caught.
+ 
+* https://github.com/abapGit/abapGit/issues/4523
+ 
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+    DATA lv_data TYPE string.
+ 
+    lv_data = |001e\n service=git-upload-pack\n00000230ERR CAPTCHA required\nYour Bitbucket account etc..|.
+    APPEND lv_data TO mt_data.
+ 
+    TRY.
+        parse( ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        cl_abap_unit_assert=>assert_char_cp(
+          act = lx_error->get_text( )
+          exp = '*CAPTCHA*' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD use_refs_if_head_is_missing.
+ 
+    " https://github.com/abapGit/abapGit/issues/4703
+    " In case HEAD is missing, it should use refs/heads/xxxxx as the default branch
+ 
+    APPEND '001e# service=git-upload-pack' TO mt_data.
+    APPEND '000000f7e6e5b066fb4177bf0780bf343ab2de06368dd973 refs/heads/main' TO mt_data.
+    APPEND '0000' TO mt_data.
+ 
+    parse( iv_expected_lines = 1 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_raw.
+* this is a real as hex, which contains the null value
+    DATA lv_xstr TYPE xstring.
+    DATA lv_data TYPE string.
+    DATA lv_ref TYPE string.
+ 
+    lv_xstr = '303031652320736572766963653D6769742D7570'
+    && '6C6F61642D7061636B0A30303030303135346639'
+    && '6563323364366439333561613764633236656531'
+    && '3431633762343666656564396434363835652048'
+    && '454144006D756C74695F61636B207468696E2D70'
+    && '61636B20736964652D62616E6420736964652D62'
+    && '616E642D36346B206F66732D64656C7461207368'
+    && '616C6C6F772064656570656E2D73696E63652064'
+    && '656570656E2D6E6F742064656570656E2D72656C'
+    && '6174697665206E6F2D70726F677265737320696E'
+    && '636C7564652D746167206D756C74695F61636B5F'
+    && '64657461696C656420616C6C6F772D7469702D73'
+    && '6861312D696E2D77616E7420616C6C6F772D7265'
+    && '61636861626C652D736861312D696E2D77616E74'
+    && '206E6F2D646F6E652073796D7265663D48454144'
+    && '3A726566732F68656164732F6D61696E2066696C'
+    && '746572206F626A6563742D666F726D61743D7368'
+    && '6131206167656E743D6769742F6769746875622D'
+    && '673964323537636462383634300A303033646639'
+    && '6563323364366439333561613764633236656531'
+    && '3431633762343666656564396434363835652072'
+    && '6566732F68656164732F6D61696E0A30303030'.
+ 
+    lv_data = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstr ).
+ 
+    zcl_abapgit_git_branch_list=>parse_branch_list(
+      EXPORTING
+        iv_data        = lv_data
+      IMPORTING
+        ev_head_symref = lv_ref ).
+ 
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lv_ref
+      exp = 'refs/heads/main' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_commit.clas.abap.html b/src/git/zcl_abapgit_git_commit.clas.abap.html new file mode 100644 index 00000000000..48f6b9eb858 --- /dev/null +++ b/src/git/zcl_abapgit_git_commit.clas.abap.html @@ -0,0 +1,1087 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_commit.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_commit.clas.abap

+
+ +
+ 98.8% + Statements + 330/334 +
+ + +
+ 75% + Branches + 6/8 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 98.8% + Lines + 330/334 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +3351x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_commit DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    TYPES:
+      BEGIN OF ty_pull_result,
+        commits TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+        commit  TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_pull_result .
+ 
+    CLASS-METHODS get_by_branch
+      IMPORTING
+        !iv_branch_name       TYPE string
+        !iv_repo_url          TYPE string
+        !iv_deepen_level      TYPE i
+        !iv_sorted            TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rs_pull_result) TYPE ty_pull_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_by_commit
+      IMPORTING
+        !iv_commit_hash   TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_repo_url      TYPE string
+        !iv_deepen_level  TYPE i
+      RETURNING
+        VALUE(rt_commits) TYPE zif_abapgit_git_definitions=>ty_commit_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS parse_commits
+      IMPORTING
+        !it_objects       TYPE zif_abapgit_definitions=>ty_objects_tt
+      RETURNING
+        VALUE(rt_commits) TYPE zif_abapgit_git_definitions=>ty_commit_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sort_commits
+      CHANGING
+        !ct_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS reverse_sort_order
+      CHANGING
+        !ct_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt .
+    CLASS-METHODS clear_missing_parents CHANGING ct_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES: ty_sha1_range TYPE RANGE OF zif_abapgit_git_definitions=>ty_sha1 .
+ 
+    CLASS-METHODS get_1st_child_commit
+      IMPORTING
+        it_commit_sha1s TYPE ty_sha1_range
+      EXPORTING
+        et_commit_sha1s TYPE ty_sha1_range
+        es_1st_commit   TYPE zif_abapgit_git_definitions=>ty_commit
+      CHANGING
+        ct_commits      TYPE zif_abapgit_git_definitions=>ty_commit_tt .
+ 
+    CLASS-METHODS is_missing
+      IMPORTING
+        it_commits       TYPE zif_abapgit_git_definitions=>ty_commit_tt
+        iv_sha1          TYPE zif_abapgit_git_definitions=>ty_sha1
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool.
+ 
+    CLASS-METHODS extract_author_data
+      IMPORTING
+        !iv_author TYPE string
+      EXPORTING
+        !ev_author TYPE zif_abapgit_git_definitions=>ty_commit-author
+        !ev_email  TYPE zif_abapgit_git_definitions=>ty_commit-email
+        !ev_time   TYPE zif_abapgit_git_definitions=>ty_commit-time
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_commit IMPLEMENTATION.
+ 
+  METHOD extract_author_data.
+ 
+    " unix time stamps are in same time zone, so ignore the zone
+    FIND REGEX zif_abapgit_definitions=>c_author_regex IN iv_author
+      SUBMATCHES
+      ev_author
+      ev_email
+      ev_time.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error author regex value='{ iv_author }'| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD clear_missing_parents.
+ 
+    "Part of #4719 to handle cut commit sequences, todo
+ 
+    FIELD-SYMBOLS: <ls_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    LOOP AT ct_commits ASSIGNING <ls_commit>.
+ 
+      IF is_missing( it_commits = ct_commits
+                     iv_sha1  = <ls_commit>-parent1 ) = abap_true.
+        CLEAR <ls_commit>-parent1.
+      ENDIF.
+ 
+      IF is_missing( it_commits = ct_commits
+                     iv_sha1  = <ls_commit>-parent2 ) = abap_true.
+        CLEAR <ls_commit>-parent2.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_1st_child_commit.
+ 
+    DATA: lt_1stchild_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+          ls_parent           LIKE LINE OF it_commit_sha1s,
+          lt_commit_sha1s     LIKE it_commit_sha1s.
+ 
+    FIELD-SYMBOLS: <ls_child_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    CLEAR: es_1st_commit.
+ 
+* get all reachable next commits
+    lt_commit_sha1s = it_commit_sha1s.
+    LOOP AT ct_commits ASSIGNING <ls_child_commit> WHERE parent1 IN lt_commit_sha1s
+                                                      OR parent2 IN lt_commit_sha1s.
+      INSERT <ls_child_commit> INTO TABLE lt_1stchild_commits.
+    ENDLOOP.
+ 
+* return oldest one
+    SORT lt_1stchild_commits BY time ASCENDING.
+    READ TABLE lt_1stchild_commits INTO es_1st_commit INDEX 1.
+ 
+* remove from available commits
+    DELETE ct_commits WHERE sha1 = es_1st_commit-sha1.
+ 
+* set relevant parent commit sha1s
+    IF lines( lt_1stchild_commits ) = 1.
+      CLEAR et_commit_sha1s.
+    ELSE.
+      et_commit_sha1s = it_commit_sha1s.
+    ENDIF.
+ 
+    ls_parent-sign   = 'I'.
+    ls_parent-option = 'EQ'.
+    ls_parent-low    = es_1st_commit-sha1.
+    INSERT ls_parent INTO TABLE et_commit_sha1s.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_by_branch.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          lt_objects  TYPE zif_abapgit_definitions=>ty_objects_tt.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( 1 ).
+ 
+    li_progress->show(
+      iv_current = 1
+      iv_text    = |Get git commits { iv_repo_url }| ).
+ 
+    zcl_abapgit_git_transport=>upload_pack_by_branch(
+      EXPORTING
+        iv_url          = iv_repo_url
+        iv_branch_name  = iv_branch_name
+        iv_deepen_level = iv_deepen_level
+      IMPORTING
+        ev_branch       = rs_pull_result-commit
+        et_objects      = lt_objects ).
+ 
+    DELETE lt_objects WHERE type <> zif_abapgit_git_definitions=>c_type-commit.
+ 
+    rs_pull_result-commits = parse_commits( lt_objects ).
+ 
+    IF iv_sorted = abap_true.
+      sort_commits( CHANGING ct_commits = rs_pull_result-commits ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_by_commit.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          lt_objects  TYPE zif_abapgit_definitions=>ty_objects_tt.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( 1 ).
+ 
+    li_progress->show(
+      iv_current = 1
+      iv_text    = |Get git commits { iv_repo_url }| ).
+ 
+    zcl_abapgit_git_transport=>upload_pack_by_commit(
+      EXPORTING
+        iv_url          = iv_repo_url
+        iv_deepen_level = iv_deepen_level
+        iv_hash         = iv_commit_hash
+      IMPORTING
+        et_objects      = lt_objects ).
+ 
+    DELETE lt_objects WHERE type <> zif_abapgit_git_definitions=>c_type-commit.
+ 
+    rt_commits = parse_commits( lt_objects ).
+    sort_commits( CHANGING ct_commits = rt_commits ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_missing.
+ 
+    IF iv_sha1 IS NOT INITIAL.
+ 
+      READ TABLE it_commits
+        TRANSPORTING NO FIELDS
+        WITH KEY sha1 = iv_sha1.
+      rv_result = boolc( sy-subrc <> 0 ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_commits.
+ 
+    DATA: ls_commit TYPE zif_abapgit_git_definitions=>ty_commit,
+          lt_body   TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          ls_raw    TYPE zcl_abapgit_git_pack=>ty_commit.
+ 
+    FIELD-SYMBOLS: <ls_object> LIKE LINE OF it_objects,
+                   <lv_body>   TYPE string.
+ 
+ 
+    LOOP AT it_objects ASSIGNING <ls_object> USING KEY type
+        WHERE type = zif_abapgit_git_definitions=>c_type-commit.
+      ls_raw = zcl_abapgit_git_pack=>decode_commit( <ls_object>-data ).
+ 
+      CLEAR ls_commit.
+      ls_commit-sha1 = <ls_object>-sha1.
+      ls_commit-parent1 = ls_raw-parent.
+      ls_commit-parent2 = ls_raw-parent2.
+ 
+      SPLIT ls_raw-body AT cl_abap_char_utilities=>newline INTO TABLE lt_body.
+ 
+      READ TABLE lt_body WITH KEY table_line = ' -----END PGP SIGNATURE-----' TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        DELETE lt_body TO sy-tabix.
+        DELETE lt_body TO 2.
+      ENDIF.
+ 
+      READ TABLE lt_body INDEX 1 INTO ls_commit-message.  "#EC CI_SUBRC
+      " The second line is always empty. Therefore we omit it.
+      LOOP AT lt_body ASSIGNING <lv_body>
+                      FROM 3.
+        INSERT <lv_body> INTO TABLE ls_commit-body.
+      ENDLOOP.
+ 
+      extract_author_data(
+        EXPORTING
+          iv_author = ls_raw-author
+        IMPORTING
+          ev_author = ls_commit-author
+          ev_email  = ls_commit-email
+          ev_time   = ls_commit-time ).
+ 
+      APPEND ls_commit TO rt_commits.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reverse_sort_order.
+ 
+    DATA: lt_commits           TYPE zif_abapgit_git_definitions=>ty_commit_tt.
+    FIELD-SYMBOLS: <ls_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    LOOP AT ct_commits ASSIGNING <ls_commit>.
+      INSERT <ls_commit> INTO lt_commits INDEX 1.
+    ENDLOOP.
+    ct_commits = lt_commits.
+    FREE lt_commits.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sort_commits.
+ 
+    DATA: lt_sorted_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+          ls_next_commit    TYPE zif_abapgit_git_definitions=>ty_commit,
+          lt_parents        TYPE ty_sha1_range,
+          ls_parent         LIKE LINE OF lt_parents.
+ 
+    FIELD-SYMBOLS: <ls_initial_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    " find initial commit
+    READ TABLE ct_commits ASSIGNING <ls_initial_commit> WITH KEY parent1 = space.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Cannot find initial commit. Too many commits. Action not possible.| ).
+    ENDIF.
+ 
+    ls_parent-sign   = 'I'.
+    ls_parent-option = 'EQ'.
+    ls_parent-low    = <ls_initial_commit>-sha1.
+    INSERT ls_parent INTO TABLE lt_parents.
+ 
+    " first commit
+    INSERT <ls_initial_commit> INTO TABLE lt_sorted_commits.
+ 
+    " remove from available commits
+    DELETE ct_commits WHERE sha1 = <ls_initial_commit>-sha1.
+ 
+    DO.
+      get_1st_child_commit( EXPORTING it_commit_sha1s = lt_parents
+                            IMPORTING et_commit_sha1s = lt_parents
+                                      es_1st_commit   = ls_next_commit
+                            CHANGING  ct_commits      = ct_commits ).
+      IF ls_next_commit IS INITIAL.
+        EXIT. "DO
+      ENDIF.
+      INSERT ls_next_commit INTO TABLE lt_sorted_commits.
+    ENDDO.
+ 
+    ct_commits = lt_sorted_commits.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_commit.clas.testclasses.abap.html b/src/git/zcl_abapgit_git_commit.clas.testclasses.abap.html new file mode 100644 index 00000000000..8c5e359bc7b --- /dev/null +++ b/src/git/zcl_abapgit_git_commit.clas.testclasses.abap.html @@ -0,0 +1,1039 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_commit.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_commit.clas.testclasses.abap

+
+ +
+ 100% + Statements + 318/318 +
+ + +
+ 100% + Branches + 21/21 +
+ + +
+ 100% + Functions + 21/21 +
+ + +
+ 100% + Lines + 318/318 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +3191x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +1x +1x +4x +4x +4x +4x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_commit DEFINITION LOCAL FRIENDS ltcl_test.
+ 
+ 
+CLASS ltcl_test DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS:
+      parse_commits FOR TESTING RAISING zcx_abapgit_exception,
+      check_author_regex FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD parse_commits.
+ 
+    DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt,
+          lt_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+          ls_commit  LIKE LINE OF lt_commits,
+          ls_object  LIKE LINE OF lt_objects.
+ 
+ 
+    ls_object-type = zif_abapgit_git_definitions=>c_type-commit.
+    ls_object-data = '7472656520396335376238613931336465306539' &&
+      '3735333630633261306330643638363037306162' &&
+      '61343965650A706172656E742036393532346462' &&
+      '3139363263383839366566343364323861616131' &&
+      '396536366533373263653364620A617574686F72' &&
+      '206C6172736870203C6C617273687040686F746D' &&
+      '61696C2E636F6D3E203135333236313133353020' &&
+      '2B303030300A636F6D6D6974746572206C617273' &&
+      '6870203C6C617273687040686F746D61696C2E63' &&
+      '6F6D3E2031353332363131333530202B30303030' &&
+      '0A0A56494557'.
+    APPEND ls_object TO lt_objects.
+ 
+    lt_commits = zcl_abapgit_git_commit=>parse_commits( lt_objects ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_commits )
+      exp = 1 ).
+ 
+    READ TABLE lt_commits INTO ls_commit INDEX 1.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_commit-message
+      exp = 'VIEW' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD check_author_regex.
+ 
+    DATA: lt_objects         TYPE zif_abapgit_definitions=>ty_objects_tt,
+          lt_commits         TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+          ls_object          LIKE LINE OF lt_objects,
+          ls_git_pack_commit TYPE zcl_abapgit_git_pack=>ty_commit.
+ 
+ 
+    ls_object-type = zif_abapgit_git_definitions=>c_type-commit.
+    ls_git_pack_commit-tree      = 'dummy'.
+    ls_git_pack_commit-committer = 'dummy'.
+ 
+    ls_git_pack_commit-author = 'Lastname, Firstname <mail@mail.com> 1532611350 +0000'.
+    ls_object-data = zcl_abapgit_git_pack=>encode_commit( ls_git_pack_commit ).
+    APPEND ls_object TO lt_objects.
+ 
+    ls_git_pack_commit-author = 'Soeren Mueller <mail@mail.com> 1532611350 +0000'.
+    ls_object-data = zcl_abapgit_git_pack=>encode_commit( ls_git_pack_commit ).
+    APPEND ls_object TO lt_objects.
+ 
+    ls_git_pack_commit-author = 'S#ren M#ller <mail@mail.com> 1532611350 +0000'.
+    ls_object-data = zcl_abapgit_git_pack=>encode_commit( ls_git_pack_commit ).
+    APPEND ls_object TO lt_objects.
+ 
+    ls_git_pack_commit-author = 'Dr. Werner Mueller <mail@mail.com> 1532611350 +0000'.
+    ls_object-data = zcl_abapgit_git_pack=>encode_commit( ls_git_pack_commit ).
+    APPEND ls_object TO lt_objects.
+ 
+    ls_git_pack_commit-author = 'SAP*........ <SAP*........@localhost> 1535375483 +0200'.
+    ls_object-data = zcl_abapgit_git_pack=>encode_commit( ls_git_pack_commit ).
+    APPEND ls_object TO lt_objects.
+ 
+    ls_git_pack_commit-author = |Soeren %26 Sascha <soerenschlegel87@gmail.com> 1557574255 +0000|.
+    ls_object-data = zcl_abapgit_git_pack=>encode_commit( ls_git_pack_commit ).
+    APPEND ls_object TO lt_objects.
+ 
+    lt_commits = zcl_abapgit_git_commit=>parse_commits( lt_objects ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+       act = lines( lt_commits )
+       exp = 6 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltc_parent_handling DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_commit DEFINITION LOCAL FRIENDS ltc_parent_handling.
+CLASS ltc_parent_handling DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA mt_commits TYPE zif_abapgit_git_definitions=>ty_commit_tt.
+    METHODS blank_not_missing FOR TESTING RAISING cx_static_check.
+    METHODS parent_is_missing FOR TESTING RAISING cx_static_check.
+    METHODS parent_is_found FOR TESTING RAISING cx_static_check.
+    METHODS missing_parent1_cleared FOR TESTING RAISING cx_static_check.
+    METHODS missing_parent2_cleared FOR TESTING RAISING cx_static_check.
+    METHODS matched_parent1_remains FOR TESTING RAISING cx_static_check.
+    METHODS given_commit_sha1 IMPORTING iv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1.
+    METHODS parent_should_be_missing IMPORTING iv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1.
+    METHODS parent_should_not_be_missing IMPORTING iv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1.
+    METHODS given_commit IMPORTING iv_sha1    TYPE zif_abapgit_git_definitions=>ty_sha1
+                                   iv_parent1 TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL
+                                   iv_parent2 TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL.
+ENDCLASS.
+ 
+ 
+CLASS ltc_parent_handling IMPLEMENTATION.
+ 
+  METHOD blank_not_missing.
+    given_commit_sha1( 'F00' ).
+    parent_should_not_be_missing( '' ).
+  ENDMETHOD.
+ 
+  METHOD parent_is_missing.
+    given_commit_sha1( 'F00' ).
+    parent_should_be_missing( 'BA5' ).
+  ENDMETHOD.
+ 
+  METHOD parent_is_found.
+    given_commit_sha1( 'F00' ).
+    parent_should_not_be_missing( 'F00' ).
+  ENDMETHOD.
+ 
+  METHOD missing_parent1_cleared.
+ 
+    DATA ls_commit TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    given_commit( iv_sha1 = 'F00'
+                  iv_parent1 = 'BA5' ).
+    zcl_abapgit_git_commit=>clear_missing_parents( CHANGING ct_commits = mt_commits ).
+ 
+    READ TABLE mt_commits INDEX 1 INTO ls_commit.
+    cl_abap_unit_assert=>assert_equals( act = ls_commit-parent1
+                                        exp = '' ).
+  ENDMETHOD.
+ 
+  METHOD missing_parent2_cleared.
+ 
+    DATA ls_commit TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    given_commit( iv_sha1 = 'F00'
+                  iv_parent2 = 'BA5' ).
+    zcl_abapgit_git_commit=>clear_missing_parents( CHANGING ct_commits = mt_commits ).
+ 
+    READ TABLE mt_commits INDEX 1 INTO ls_commit.
+    cl_abap_unit_assert=>assert_equals( act = ls_commit-parent2
+                                        exp = '' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD matched_parent1_remains.
+ 
+    DATA ls_commit TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    given_commit( iv_sha1 = 'F00' ).
+    given_commit( iv_sha1 = 'BA5'
+                  iv_parent1 = 'F00' ).
+ 
+    zcl_abapgit_git_commit=>clear_missing_parents( CHANGING ct_commits = mt_commits ).
+ 
+    READ TABLE mt_commits INDEX 2 INTO ls_commit.
+    cl_abap_unit_assert=>assert_equals( act = ls_commit-parent1
+                                        exp = 'F00' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD given_commit_sha1.
+    DATA ls_commit TYPE zif_abapgit_git_definitions=>ty_commit.
+ 
+    ls_commit-sha1 = iv_sha1.
+    APPEND ls_commit TO mt_commits.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parent_should_be_missing.
+    cl_abap_unit_assert=>assert_true(
+        zcl_abapgit_git_commit=>is_missing( it_commits = mt_commits
+                                            iv_sha1    = iv_sha1 ) ).
+  ENDMETHOD.
+ 
+  METHOD parent_should_not_be_missing.
+    cl_abap_unit_assert=>assert_false(
+        zcl_abapgit_git_commit=>is_missing( it_commits = mt_commits
+                                            iv_sha1    = iv_sha1 ) ).
+  ENDMETHOD.
+ 
+  METHOD given_commit.
+    FIELD-SYMBOLS: <ls_commit> TYPE zif_abapgit_git_definitions=>ty_commit.
+    APPEND INITIAL LINE TO mt_commits ASSIGNING <ls_commit>.
+    <ls_commit>-sha1 = iv_sha1.
+    <ls_commit>-parent1 = iv_parent1.
+    <ls_commit>-parent2 = iv_parent2.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_extract_author_data DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_commit DEFINITION LOCAL FRIENDS ltcl_extract_author_data.
+ 
+CLASS ltcl_extract_author_data DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS extract_author_data1 FOR TESTING RAISING cx_static_check.
+    METHODS extract_author_data2 FOR TESTING RAISING cx_static_check.
+    METHODS extract_author_data3 FOR TESTING RAISING cx_static_check.
+    METHODS extract_author_data4 FOR TESTING RAISING cx_static_check.
+    METHODS extract_author_data5 FOR TESTING RAISING cx_static_check.
+    METHODS extract_author_data6 FOR TESTING RAISING cx_static_check.
+    METHODS extract_author_data7 FOR TESTING RAISING cx_static_check.
+    METHODS extract_author_data8 FOR TESTING RAISING cx_static_check.
+    METHODS extract_author_data9 FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_extract_author_data IMPLEMENTATION.
+ 
+  METHOD extract_author_data1.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data( 'Volker Jägle äÖüß <github@beimir.net> 1573216988 +0000' ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( |Language-related special characters in author name are allowed.| ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD extract_author_data2.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data(
+          'pull[bot&%#$] <39814207+pull[bot]@users.noreply.github.com> 1573216988 +0000' ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( |Special characters in author name are allowed.| ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD extract_author_data3.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data(
+          'pull[bot] <39814207+pull[bot]@users.noreply.github.com> 1573216988 +00001' ).
+        cl_abap_unit_assert=>fail( |+00001 shouldn't be valid cause it's too long.| ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD extract_author_data4.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data(
+          'pull[bot] <39814207+pull[bot]@users.noreply.github.com> 15732169881 +0000' ).
+        cl_abap_unit_assert=>fail( |Value shouldn't be valid cause time is invalid.| ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD extract_author_data5.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data(
+          '<39814207+pull[bot]@users.noreply.github.com> 1573216988 +0000' ).
+        cl_abap_unit_assert=>fail( |Value shouldn't be valid cause no author name was supplied.| ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD extract_author_data6.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data( 'pull[bot] 1573216988 +0000' ).
+        cl_abap_unit_assert=>fail( |Value shouldn't be valid cause no email was supplied.| ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD extract_author_data7.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data( 'pull[bot] <39814207+pull[bot]@users.noreply.github.com> +0000' ).
+        cl_abap_unit_assert=>fail( |Value shouldn't be valid cause no time was supplied.| ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD extract_author_data8.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data(
+          'pull[bot] <39814207+pull[bot]@users.noreply.github.com> 1573216988' ).
+        cl_abap_unit_assert=>fail( |Value shouldn't be valid cause +0000 wasn't supplied.| ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD extract_author_data9.
+    TRY.
+        zcl_abapgit_git_commit=>extract_author_data(
+          '<pull[bot]()> <39814207+pull[bot]@users.noreply.github.com> 1573216988 +0000' ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( |Value should be valid though brackets are in author name.| ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_pack.clas.abap.html b/src/git/zcl_abapgit_git_pack.clas.abap.html new file mode 100644 index 00000000000..baf791dae1c --- /dev/null +++ b/src/git/zcl_abapgit_git_pack.clas.abap.html @@ -0,0 +1,2947 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_pack.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_pack.clas.abap

+
+ +
+ 94.44% + Statements + 901/954 +
+ + +
+ 41.93% + Branches + 13/31 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 94.44% + Lines + 901/954 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +9551x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +  +  +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +11x +18x +18x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +11x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +11x +11x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_pack DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    TYPES:
+      BEGIN OF ty_node,
+        chmod TYPE zif_abapgit_git_definitions=>ty_chmod,
+        name  TYPE string,
+        sha1  TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_node .
+    TYPES:
+      ty_nodes_tt TYPE STANDARD TABLE OF ty_node WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_commit,
+        tree      TYPE zif_abapgit_git_definitions=>ty_sha1,
+        parent    TYPE zif_abapgit_git_definitions=>ty_sha1,
+        parent2   TYPE zif_abapgit_git_definitions=>ty_sha1,
+        author    TYPE string,
+        committer TYPE string,
+        gpgsig    TYPE string,
+        body      TYPE string,
+      END OF ty_commit .
+    TYPES:
+      BEGIN OF ty_tag,
+        object       TYPE string,
+        type         TYPE string,
+        tag          TYPE string,
+        tagger_name  TYPE string,
+        tagger_email TYPE string,
+        message      TYPE string,
+        body         TYPE string,
+      END OF ty_tag .
+ 
+    CLASS-METHODS decode
+      IMPORTING
+        !iv_data          TYPE xstring
+      RETURNING
+        VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS decode_tree
+      IMPORTING
+        !iv_data        TYPE xstring
+      RETURNING
+        VALUE(rt_nodes) TYPE ty_nodes_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS decode_commit
+      IMPORTING
+        !iv_data         TYPE xstring
+      RETURNING
+        VALUE(rs_commit) TYPE ty_commit
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS decode_tag
+      IMPORTING
+        !iv_data      TYPE xstring
+      RETURNING
+        VALUE(rs_tag) TYPE ty_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS encode
+      IMPORTING
+        !it_objects    TYPE zif_abapgit_definitions=>ty_objects_tt
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS encode_tree
+      IMPORTING
+        !it_nodes      TYPE ty_nodes_tt
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS encode_commit
+      IMPORTING
+        !is_commit     TYPE ty_commit
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS encode_tag
+      IMPORTING
+        !is_tag        TYPE ty_tag
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      c_pack_start TYPE x LENGTH 4 VALUE '5041434B' ##NO_TEXT.
+    CONSTANTS:
+      c_zlib       TYPE x LENGTH 2 VALUE '789C' ##NO_TEXT.
+    CONSTANTS:
+      c_zlib_hmm   TYPE x LENGTH 2 VALUE '7801' ##NO_TEXT.
+    CONSTANTS:                                                    " PACK
+      c_version    TYPE x LENGTH 4 VALUE '00000002' ##NO_TEXT.
+ 
+    CLASS-METHODS decode_deltas
+      CHANGING
+        !ct_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delta
+      IMPORTING
+        !is_object  TYPE zif_abapgit_definitions=>ty_object
+      CHANGING
+        !ct_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delta_header
+      IMPORTING
+        !io_stream       TYPE REF TO lcl_stream
+      RETURNING
+        VALUE(rv_header) TYPE i .
+    CLASS-METHODS sort_tree
+      IMPORTING
+        !it_nodes       TYPE ty_nodes_tt
+      RETURNING
+        VALUE(rt_nodes) TYPE ty_nodes_tt .
+    CLASS-METHODS get_type
+      IMPORTING
+        !iv_x          TYPE x
+      RETURNING
+        VALUE(rv_type) TYPE zif_abapgit_git_definitions=>ty_type
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_length
+      EXPORTING
+        !ev_length TYPE i
+      CHANGING
+        !cv_data   TYPE xstring .
+    CLASS-METHODS type_and_length
+      IMPORTING
+        !iv_type          TYPE zif_abapgit_git_definitions=>ty_type
+        !iv_length        TYPE i
+      RETURNING
+        VALUE(rv_xstring) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS zlib_decompress
+      CHANGING
+        !cv_data         TYPE xstring
+        !cv_decompressed TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_pack IMPLEMENTATION.
+ 
+ 
+  METHOD decode.
+ 
+    DATA: lv_x              TYPE x,
+          lv_data           TYPE xstring,
+          lv_type           TYPE c LENGTH 6,
+          lv_zlib           TYPE x LENGTH 2,
+          lv_objects        TYPE i,
+          lv_len            TYPE i,
+          lv_sha1           TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_ref_delta      TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_compressed_len TYPE i,
+          lv_compressed     TYPE xstring,
+          lv_decompressed   TYPE xstring,
+          lv_decompress_len TYPE i,
+          lv_xstring        TYPE xstring,
+          lv_expected       TYPE i,
+          ls_object         LIKE LINE OF rt_objects,
+          lv_uindex         TYPE sy-index.
+ 
+ 
+    lv_data = iv_data.
+ 
+* header
+    IF NOT xstrlen( lv_data ) > 4 OR lv_data(4) <> c_pack_start.
+      zcx_abapgit_exception=>raise( |Unexpected pack header| ).
+    ENDIF.
+    lv_data = lv_data+4.
+ 
+* version
+    IF lv_data(4) <> c_version.
+      zcx_abapgit_exception=>raise( |Version not supported| ).
+    ENDIF.
+    lv_data = lv_data+4.
+ 
+* number of objects
+    lv_xstring = lv_data(4).
+    lv_objects = zcl_abapgit_convert=>xstring_to_int( lv_xstring ).
+    lv_data = lv_data+4.
+ 
+ 
+    DO lv_objects TIMES.
+ 
+      lv_uindex = sy-index.
+ 
+      lv_x = lv_data(1).
+      lv_type = get_type( lv_x ).
+ 
+      get_length( IMPORTING ev_length = lv_expected
+                  CHANGING cv_data = lv_data ).
+ 
+      IF lv_type = zif_abapgit_git_definitions=>c_type-ref_d.
+        lv_ref_delta = lv_data(20).
+        lv_data = lv_data+20.
+      ENDIF.
+ 
+* strip header, '789C', CMF + FLG
+      lv_zlib = lv_data(2).
+      IF lv_zlib <> c_zlib AND lv_zlib <> c_zlib_hmm.
+        zcx_abapgit_exception=>raise( |Unexpected zlib header| ).
+      ENDIF.
+      lv_data = lv_data+2.
+ 
+*******************************
+ 
+      IF lv_zlib = c_zlib.
+        cl_abap_gzip=>decompress_binary(
+          EXPORTING
+            gzip_in     = lv_data
+          IMPORTING
+            raw_out     = lv_decompressed
+            raw_out_len = lv_decompress_len ).
+ 
+        IF lv_expected <> lv_decompress_len.
+          zcx_abapgit_exception=>raise( |Decompression falied| ).
+        ENDIF.
+ 
+        cl_abap_gzip=>compress_binary(
+          EXPORTING
+            raw_in         = lv_decompressed
+          IMPORTING
+            gzip_out       = lv_compressed
+            gzip_out_len   = lv_compressed_len ).
+ 
+        IF lv_compressed(lv_compressed_len) <> lv_data(lv_compressed_len).
+          "Lets try with zlib before error in out for good
+          "This fixes issues with TFS 2017 and visualstudio.com Git repos
+          zlib_decompress( CHANGING cv_data = lv_data
+                                    cv_decompressed = lv_decompressed ).
+        ELSE.
+          lv_data = lv_data+lv_compressed_len.
+        ENDIF.
+ 
+      ELSEIF lv_zlib = c_zlib_hmm.
+* cl_abap_gzip compression works for header '789C', but does not work for
+* '7801', call custom implementation of DEFLATE algorithm.
+* The custom implementation could handle both, but most likely the kernel
+* implementation runs faster than the custom ABAP.
+        zlib_decompress( CHANGING cv_data = lv_data
+                                  cv_decompressed = lv_decompressed ).
+      ENDIF.
+ 
+      CLEAR ls_object.
+      ls_object-adler32 = lv_data(4).
+      lv_data = lv_data+4. " skip adler checksum
+ 
+      IF lv_type = zif_abapgit_git_definitions=>c_type-ref_d.
+        ls_object-sha1 = lv_ref_delta.
+        TRANSLATE ls_object-sha1 TO LOWER CASE.
+      ELSE.
+        ls_object-sha1 = zcl_abapgit_hash=>sha1(
+          iv_type = lv_type
+          iv_data = lv_decompressed ).
+      ENDIF.
+      ls_object-type = lv_type.
+      ls_object-data = lv_decompressed.
+      ls_object-index = lv_uindex.
+      APPEND ls_object TO rt_objects.
+    ENDDO.
+ 
+* check SHA1 at end of pack
+    lv_len = xstrlen( iv_data ) - 20.
+    lv_xstring = iv_data(lv_len).
+    lv_sha1 = zcl_abapgit_hash=>sha1_raw( lv_xstring ).
+    IF to_upper( lv_sha1 ) <> lv_data.
+      zcx_abapgit_exception=>raise( |SHA1 at end of pack doesnt match| ).
+    ENDIF.
+ 
+    decode_deltas( CHANGING ct_objects = rt_objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_commit.
+ 
+    DATA: lv_string        TYPE string,
+          lv_word          TYPE string,
+          lv_offset        TYPE i,
+          lv_length        TYPE i,
+          lv_length_gpgsig TYPE i,
+          lv_trash         TYPE string ##NEEDED,
+          lt_string        TYPE TABLE OF string.
+ 
+    FIELD-SYMBOLS: <lv_string> LIKE LINE OF lt_string.
+ 
+ 
+    lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_data ).
+ 
+    SPLIT lv_string AT cl_abap_char_utilities=>newline INTO TABLE lt_string.
+ 
+    LOOP AT lt_string ASSIGNING <lv_string>.
+      lv_length = strlen( <lv_string> ) + 1.
+      lv_string = lv_string+lv_length.
+ 
+      SPLIT <lv_string> AT space INTO lv_word lv_trash.
+      CASE lv_word.
+        WHEN 'tree'.
+          rs_commit-tree = <lv_string>+5.
+        WHEN 'parent'.
+          IF rs_commit-parent IS INITIAL.
+            rs_commit-parent = <lv_string>+7.
+          ELSE.
+            rs_commit-parent2 = <lv_string>+7.
+          ENDIF.
+        WHEN 'author'.
+          rs_commit-author = <lv_string>+7.
+        WHEN 'committer'.
+          rs_commit-committer = <lv_string>+10.
+          EXIT. " current loop
+        WHEN OTHERS.
+          ASSERT 1 = 0.
+      ENDCASE.
+ 
+    ENDLOOP.
+ 
+    lv_length = strlen( lv_string ).
+    IF lv_length >= 6 AND lv_string+0(6) = 'gpgsig'.
+      FIND REGEX |-----END PGP SIGNATURE-----[[:space:]]+|
+        IN lv_string
+        MATCH OFFSET lv_offset
+        MATCH LENGTH lv_length.
+      lv_length = lv_length - 1.
+      lv_length_gpgsig = lv_offset + lv_length - 7.
+      lv_length = lv_offset + lv_length.
+      rs_commit-gpgsig = lv_string+7(lv_length_gpgsig).
+      lv_string = lv_string+lv_length.
+    ENDIF.
+ 
+    rs_commit-body = lv_string+1.
+ 
+    IF rs_commit-author IS INITIAL
+        OR rs_commit-committer IS INITIAL
+        OR rs_commit-tree IS INITIAL.
+      zcx_abapgit_exception=>raise( |multiple parents? not supported| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_deltas.
+ 
+    DATA: ls_object   LIKE LINE OF ct_objects,
+          li_progress TYPE REF TO zif_abapgit_progress,
+          lt_deltas   LIKE ct_objects.
+ 
+ 
+    LOOP AT ct_objects INTO ls_object
+        USING KEY type
+        WHERE type = zif_abapgit_git_definitions=>c_type-ref_d.
+      INSERT ls_object INTO TABLE lt_deltas.
+    ENDLOOP.
+ 
+    DELETE ct_objects
+      USING KEY type
+      WHERE type = zif_abapgit_git_definitions=>c_type-ref_d.
+ 
+    "Restore correct Delta Order
+    SORT lt_deltas BY index.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( lt_deltas ) ).
+ 
+    LOOP AT lt_deltas INTO ls_object.
+      li_progress->show( iv_current = sy-tabix
+                         iv_text    = 'Decode deltas' ).
+ 
+      delta( EXPORTING is_object = ls_object
+             CHANGING ct_objects = ct_objects ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_tag.
+ 
+    DATA: lv_string TYPE string,
+          lv_word   TYPE string,
+          lv_trash  TYPE string ##NEEDED,
+          lt_string TYPE TABLE OF string.
+ 
+    FIELD-SYMBOLS: <lv_string> LIKE LINE OF lt_string.
+ 
+ 
+    lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_data ).
+ 
+    SPLIT lv_string AT cl_abap_char_utilities=>newline INTO TABLE lt_string.
+ 
+    LOOP AT lt_string ASSIGNING <lv_string>.
+ 
+      SPLIT <lv_string> AT space INTO lv_word lv_trash.
+ 
+      CASE lv_word.
+        WHEN 'object'.
+          rs_tag-object = lv_trash.
+        WHEN 'type'.
+          rs_tag-type = lv_trash.
+        WHEN 'tag'.
+          rs_tag-tag = lv_trash.
+        WHEN 'tagger'.
+ 
+          FIND FIRST OCCURRENCE OF REGEX `(.*)<(.*)>`
+                     IN lv_trash
+                     SUBMATCHES rs_tag-tagger_name
+                                rs_tag-tagger_email.
+ 
+          rs_tag-tagger_name = condense( rs_tag-tagger_name ).
+ 
+        WHEN ''.
+          " ignore blank lines
+          CONTINUE.
+        WHEN OTHERS.
+ 
+          " these are the non empty line which don't start with a key word
+          " the first one is the message, the rest are cumulated to the body
+ 
+          IF rs_tag-message IS INITIAL.
+            rs_tag-message = <lv_string>.
+          ELSE.
+
+            IF rs_tag-body IS NOT INITIAL.
+              rs_tag-body = rs_tag-body && cl_abap_char_utilities=>newline.
+            ENDIF.
+
+            rs_tag-body = rs_tag-body && <lv_string>.
+
+          ENDIF.
+ 
+      ENDCASE.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_tree.
+ 
+    CONSTANTS: lc_sha_length TYPE i VALUE 20,
+               lc_null       TYPE x VALUE '00'.
+ 
+    DATA: lv_xstring TYPE xstring,
+          lv_chmod   TYPE zif_abapgit_git_definitions=>ty_chmod,
+          lv_name    TYPE string,
+          lv_string  TYPE string,
+          lv_len     TYPE i,
+          lv_offset  TYPE i,
+          lv_cursor  TYPE i,
+          lv_match   TYPE i,
+          ls_node    TYPE ty_node.
+ 
+ 
+    DO.
+      FIND FIRST OCCURRENCE OF lc_null IN SECTION OFFSET lv_cursor OF iv_data
+        IN BYTE MODE MATCH OFFSET lv_match.
+      IF sy-subrc <> 0.
+        EXIT.
+      ENDIF.
+ 
+      lv_len = lv_match - lv_cursor.
+      lv_xstring = iv_data+lv_cursor(lv_len).
+ 
+      lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstring ).
+      SPLIT lv_string AT space INTO lv_chmod lv_name.
+ 
+      CLEAR ls_node.
+      ls_node-chmod = lv_chmod.
+      IF ls_node-chmod <> zif_abapgit_git_definitions=>c_chmod-dir
+          AND ls_node-chmod <> zif_abapgit_git_definitions=>c_chmod-file
+          AND ls_node-chmod <> zif_abapgit_git_definitions=>c_chmod-executable
+          AND ls_node-chmod <> zif_abapgit_git_definitions=>c_chmod-submodule.
+        zcx_abapgit_exception=>raise( |Unknown chmod| ).
+      ENDIF.
+ 
+      lv_offset = lv_match + 1.
+      ls_node-name = lv_name.
+      ls_node-sha1 = iv_data+lv_offset(lc_sha_length).
+      TRANSLATE ls_node-sha1 TO LOWER CASE.
+      APPEND ls_node TO rt_nodes.
+ 
+      lv_cursor = lv_match + 1 + lc_sha_length.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delta.
+ 
+    CONSTANTS: lc_1   TYPE x VALUE '01',
+               lc_2   TYPE x VALUE '02',
+               lc_4   TYPE x VALUE '04',
+               lc_8   TYPE x VALUE '08',
+               lc_16  TYPE x VALUE '10',
+               lc_32  TYPE x VALUE '20',
+               lc_64  TYPE x VALUE '40',
+               lc_128 TYPE x VALUE '80'.
+ 
+    DATA: lv_base   TYPE xstring,
+          lv_result TYPE xstring,
+          lv_offset TYPE i,
+          lo_stream TYPE REF TO lcl_stream,
+          lv_sha1   TYPE zif_abapgit_git_definitions=>ty_sha1,
+          ls_object LIKE LINE OF ct_objects,
+          lv_len    TYPE i,
+          lv_tmp    TYPE xstring,
+          lv_org    TYPE x.
+ 
+    FIELD-SYMBOLS: <ls_object> LIKE LINE OF ct_objects.
+ 
+ 
+    CREATE OBJECT lo_stream
+      EXPORTING
+        iv_data = is_object-data.
+ 
+* find base
+    READ TABLE ct_objects ASSIGNING <ls_object>
+      WITH KEY sha COMPONENTS sha1 = is_object-sha1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Base not found, { is_object-sha1 }| ).
+    ELSEIF <ls_object>-type = zif_abapgit_git_definitions=>c_type-ref_d.
+* sanity check
+      zcx_abapgit_exception=>raise( |Delta, base eq delta| ).
+    ENDIF.
+ 
+    lv_base = <ls_object>-data.
+ 
+* skip the 2 headers
+    delta_header( lo_stream ).
+    delta_header( lo_stream ).
+ 
+    WHILE xstrlen( lo_stream->get( ) ) > 0.
+ 
+      lv_org = lo_stream->eat_byte( ).
+ 
+      IF lv_org BIT-AND lc_128 = lc_128. " MSB = 1
+ 
+        lv_offset = 0.
+        IF lv_org BIT-AND lc_1 = lc_1.
+          lv_offset = lo_stream->eat_byte( ).
+        ENDIF.
+        IF lv_org BIT-AND lc_2 = lc_2.
+          lv_offset = lv_offset + lo_stream->eat_byte( ) * 256.
+        ENDIF.
+        IF lv_org BIT-AND lc_4 = lc_4.
+          lv_offset = lv_offset + lo_stream->eat_byte( ) * 65536.
+        ENDIF.
+        IF lv_org BIT-AND lc_8 = lc_8.
+          lv_offset = lv_offset + lo_stream->eat_byte( ) * 16777216. " hmm, overflow?
+        ENDIF.
+ 
+        lv_len = 0.
+        IF lv_org BIT-AND lc_16 = lc_16.
+          lv_len = lo_stream->eat_byte( ).
+        ENDIF.
+        IF lv_org BIT-AND lc_32 = lc_32.
+          lv_len = lv_len + lo_stream->eat_byte( ) * 256.
+        ENDIF.
+        IF lv_org BIT-AND lc_64 = lc_64.
+          lv_len = lv_len + lo_stream->eat_byte( ) * 65536.
+        ENDIF.
+ 
+        IF lv_len = 0.
+          lv_len = 65536.
+        ENDIF.
+ 
+        CONCATENATE lv_result lv_base+lv_offset(lv_len)
+          INTO lv_result IN BYTE MODE.
+      ELSE. " lv_bitbyte(1) = '0'
+* insert from delta
+        lv_len = lv_org. " convert to int
+        lv_tmp = lo_stream->eat_bytes( lv_len ).
+        CONCATENATE lv_result lv_tmp INTO lv_result IN BYTE MODE.
+      ENDIF.
+ 
+    ENDWHILE.
+ 
+    lv_sha1 = zcl_abapgit_hash=>sha1( iv_type = <ls_object>-type
+                                      iv_data = lv_result ).
+ 
+    CLEAR ls_object.
+    ls_object-sha1 = lv_sha1.
+    ls_object-type = <ls_object>-type.
+    ls_object-data = lv_result.
+    ls_object-index = <ls_object>-index. "Retain sort index
+    APPEND ls_object TO ct_objects.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delta_header.
+ 
+    DATA: lv_bitbyte TYPE zif_abapgit_git_definitions=>ty_bitbyte,
+          lv_bits    TYPE string,
+          lv_x       TYPE x.
+ 
+ 
+    lv_bits = ''.
+    DO.
+      lv_x = io_stream->eat_byte( ).
+      lv_bitbyte = zcl_abapgit_convert=>x_to_bitbyte( lv_x ).
+      CONCATENATE lv_bitbyte+1 lv_bits INTO lv_bits.
+      IF lv_bitbyte(1) = '0'.
+        EXIT. " current loop
+      ENDIF.
+    ENDDO.
+    rv_header = zcl_abapgit_convert=>bitbyte_to_int( lv_bits ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD encode.
+ 
+    DATA: lv_sha1          TYPE x LENGTH 20,
+          lv_adler32       TYPE zif_abapgit_git_definitions=>ty_adler32,
+          lv_compressed    TYPE xstring,
+          lv_xstring       TYPE xstring,
+          li_progress      TYPE REF TO zif_abapgit_progress,
+          lv_objects_total TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_object>  LIKE LINE OF it_objects.
+ 
+ 
+    rv_data = c_pack_start.
+ 
+    CONCATENATE rv_data c_version INTO rv_data IN BYTE MODE.
+ 
+    lv_xstring = zcl_abapgit_convert=>int_to_xstring4( lines( it_objects ) ).
+    CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE.
+ 
+    lv_objects_total = lines( it_objects ).
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lv_objects_total ).
+ 
+    LOOP AT it_objects ASSIGNING <ls_object>.
+      IF sy-tabix MOD 200 = 0.
+        li_progress->show(
+          iv_current = sy-tabix
+          iv_text    = |Encoding objects ( { sy-tabix } of { lv_objects_total } )| ).
+      ENDIF.
+ 
+      lv_xstring = type_and_length(
+        iv_type   = <ls_object>-type
+        iv_length = xstrlen( <ls_object>-data ) ).
+      CONCATENATE rv_data lv_xstring INTO rv_data IN BYTE MODE.
+ 
+      cl_abap_gzip=>compress_binary(
+        EXPORTING
+          raw_in   = <ls_object>-data
+        IMPORTING
+          gzip_out = lv_compressed ).
+ 
+      CONCATENATE rv_data c_zlib lv_compressed INTO rv_data IN BYTE MODE.
+ 
+      IF NOT <ls_object>-adler32 IS INITIAL.
+        lv_adler32 = <ls_object>-adler32.
+      ELSE.
+        lv_adler32 = zcl_abapgit_hash=>adler32( <ls_object>-data ).
+      ENDIF.
+      CONCATENATE rv_data lv_adler32 INTO rv_data IN BYTE MODE.
+ 
+    ENDLOOP.
+ 
+    lv_sha1 = to_upper( zcl_abapgit_hash=>sha1_raw( rv_data ) ).
+    CONCATENATE rv_data lv_sha1 INTO rv_data IN BYTE MODE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD encode_commit.
+ 
+    DATA: lv_string       TYPE string,
+          lv_tmp          TYPE string,
+          lv_tree_lower   TYPE string,
+          lv_parent_lower TYPE string.
+ 
+ 
+    lv_tree_lower = is_commit-tree.
+    TRANSLATE lv_tree_lower TO LOWER CASE.
+ 
+    lv_string = ''.
+ 
+    CONCATENATE 'tree' lv_tree_lower INTO lv_tmp SEPARATED BY space.
+    CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+ 
+    IF NOT is_commit-parent IS INITIAL.
+      lv_parent_lower = is_commit-parent.
+      TRANSLATE lv_parent_lower TO LOWER CASE.
+ 
+      CONCATENATE 'parent' lv_parent_lower
+        INTO lv_tmp SEPARATED BY space.
+      CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+    ENDIF.
+ 
+    IF NOT is_commit-parent2 IS INITIAL.
+      lv_parent_lower = is_commit-parent2.
+      TRANSLATE lv_parent_lower TO LOWER CASE.
+
+      CONCATENATE 'parent' lv_parent_lower
+        INTO lv_tmp SEPARATED BY space.
+      CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+    ENDIF.
+ 
+    CONCATENATE 'author' is_commit-author
+      INTO lv_tmp SEPARATED BY space.
+    CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+ 
+    CONCATENATE 'committer' is_commit-committer
+      INTO lv_tmp SEPARATED BY space.
+    CONCATENATE lv_string lv_tmp cl_abap_char_utilities=>newline INTO lv_string.
+ 
+    IF NOT is_commit-gpgsig IS INITIAL.
+      CONCATENATE 'gpgsig' is_commit-gpgsig
+        INTO lv_tmp SEPARATED BY space.
+      CONCATENATE lv_string lv_tmp INTO lv_string.
+    ENDIF.
+ 
+    CONCATENATE lv_string cl_abap_char_utilities=>newline is_commit-body INTO lv_string.
+ 
+    rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD encode_tag.
+ 
+    DATA: lv_string TYPE string,
+          lv_time   TYPE zcl_abapgit_git_time=>ty_unixtime.
+ 
+    lv_time = zcl_abapgit_git_time=>get_unix( ).
+ 
+    lv_string = |object { is_tag-object }{ cl_abap_char_utilities=>newline }|
+             && |type { is_tag-type }{ cl_abap_char_utilities=>newline }|
+             && |tag { zcl_abapgit_git_tag=>remove_tag_prefix( is_tag-tag ) }{ cl_abap_char_utilities=>newline }|
+             && |tagger { is_tag-tagger_name } <{ is_tag-tagger_email }> { lv_time }|
+             && |{ cl_abap_char_utilities=>newline }|
+             && |{ cl_abap_char_utilities=>newline }|
+             && |{ is_tag-message }|.
+ 
+    rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD encode_tree.
+ 
+    CONSTANTS: lc_null TYPE x VALUE '00'.
+ 
+    DATA: lv_string  TYPE string,
+          lt_nodes   LIKE it_nodes,
+          lv_hex20   TYPE x LENGTH 20,
+          lv_xstring TYPE xstring.
+ 
+    FIELD-SYMBOLS: <ls_node> LIKE LINE OF it_nodes.
+ 
+ 
+    lt_nodes = sort_tree( it_nodes ).
+ 
+    LOOP AT lt_nodes ASSIGNING <ls_node>.
+      ASSERT NOT <ls_node>-chmod IS INITIAL.
+      ASSERT NOT <ls_node>-name IS INITIAL.
+      ASSERT NOT <ls_node>-sha1 IS INITIAL.
+ 
+      CONCATENATE <ls_node>-chmod <ls_node>-name INTO lv_string SEPARATED BY space.
+      lv_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+      lv_hex20 = to_upper( <ls_node>-sha1 ).
+      CONCATENATE rv_data lv_xstring lc_null lv_hex20 INTO rv_data IN BYTE MODE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_length.
+ 
+* https://github.com/git/git/blob/master/Documentation/technical/pack-format.txt
+ 
+* n-byte sizeN (as long as MSB is set, each 7-bit)
+*    size0..sizeN form 4+7+7+..+7 bit integer, size0
+*    is the least significant part, and sizeN is the
+*    most significant part.
+ 
+    DATA: lv_x           TYPE x,
+          lv_length_bits TYPE string,
+          lv_bitbyte     TYPE zif_abapgit_git_definitions=>ty_bitbyte.
+ 
+ 
+    lv_x = cv_data(1).
+    lv_bitbyte = zcl_abapgit_convert=>x_to_bitbyte( lv_x ).
+ 
+    cv_data = cv_data+1.
+    lv_length_bits = lv_bitbyte+4.
+ 
+    WHILE lv_bitbyte(1) <> '0'.
+      lv_x = cv_data(1).
+      lv_bitbyte = zcl_abapgit_convert=>x_to_bitbyte( lv_x ).
+      cv_data = cv_data+1.
+      CONCATENATE lv_bitbyte+1 lv_length_bits INTO lv_length_bits.
+    ENDWHILE.
+ 
+    ev_length = zcl_abapgit_convert=>bitbyte_to_int( lv_length_bits ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_type.
+ 
+    CONSTANTS: lc_mask TYPE x VALUE 112.
+    DATA: lv_xtype TYPE x.
+ 
+    lv_xtype = iv_x BIT-AND lc_mask.
+ 
+    CASE lv_xtype.
+      WHEN 16.
+        rv_type = zif_abapgit_git_definitions=>c_type-commit.
+      WHEN 32.
+        rv_type = zif_abapgit_git_definitions=>c_type-tree.
+      WHEN 48.
+        rv_type = zif_abapgit_git_definitions=>c_type-blob.
+      WHEN 64.
+        rv_type = zif_abapgit_git_definitions=>c_type-tag.
+      WHEN 112.
+        rv_type = zif_abapgit_git_definitions=>c_type-ref_d.
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise( |Todo, unknown git pack type| ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sort_tree.
+ 
+    TYPES: BEGIN OF ty_sort,
+             sort TYPE string,
+             node TYPE ty_node,
+           END OF ty_sort.
+ 
+    DATA: lt_sort TYPE STANDARD TABLE OF ty_sort WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS: <ls_sort> LIKE LINE OF lt_sort,
+                   <ls_node> LIKE LINE OF it_nodes.
+ 
+ 
+    LOOP AT it_nodes ASSIGNING <ls_node>.
+      APPEND INITIAL LINE TO lt_sort ASSIGNING <ls_sort>.
+      IF <ls_node>-chmod = zif_abapgit_git_definitions=>c_chmod-dir.
+        CONCATENATE <ls_node>-name '/' INTO <ls_sort>-sort.
+      ELSE.
+        <ls_sort>-sort = <ls_node>-name.
+      ENDIF.
+      <ls_sort>-node = <ls_node>.
+    ENDLOOP.
+ 
+* following has to be done, or unpack will fail on server side
+    SORT lt_sort BY sort ASCENDING.
+ 
+    LOOP AT lt_sort ASSIGNING <ls_sort>.
+      APPEND <ls_sort>-node TO rt_nodes.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD type_and_length.
+ 
+* see http://stefan.saasen.me/articles/git-clone-in-haskell-from-the-bottom-up/#pack_file_objects
+ 
+    DATA: lv_type   TYPE i,
+          lv_length TYPE i,
+          lv_hex    TYPE x LENGTH 1.
+ 
+ 
+    CASE iv_type.
+      WHEN zif_abapgit_git_definitions=>c_type-commit.
+        lv_type = 16.
+      WHEN zif_abapgit_git_definitions=>c_type-tree.
+        lv_type = 32.
+      WHEN zif_abapgit_git_definitions=>c_type-blob.
+        lv_type = 48.
+      WHEN zif_abapgit_git_definitions=>c_type-tag.
+        lv_type = 64.
+      WHEN zif_abapgit_git_definitions=>c_type-ref_d.
+        lv_type = 112.
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise( |Unexpected object type while encoding pack| ).
+    ENDCASE.
+ 
+    lv_length = iv_length.
+ 
+* first byte
+    IF lv_length > 15.
+      lv_hex = 128.
+    ENDIF.
+    lv_hex = lv_hex + lv_type + lv_length MOD 16.
+    rv_xstring = lv_hex.
+    lv_length = lv_length DIV 16.
+ 
+* subsequent bytes
+    WHILE lv_length >= 128.
+      lv_hex = 128 + lv_length MOD 128.
+      CONCATENATE rv_xstring lv_hex INTO rv_xstring IN BYTE MODE.
+      lv_length = lv_length DIV 128.
+    ENDWHILE.
+ 
+* last byte
+    IF lv_length > 0.
+      lv_hex = lv_length.
+      CONCATENATE rv_xstring lv_hex INTO rv_xstring IN BYTE MODE.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zlib_decompress.
+ 
+    DATA: ls_data           TYPE zcl_abapgit_zlib=>ty_decompress,
+          lv_compressed_len TYPE i,
+          lv_adler32        TYPE zif_abapgit_git_definitions=>ty_adler32.
+ 
+ 
+    ls_data = zcl_abapgit_zlib=>decompress( cv_data ).
+    lv_compressed_len = ls_data-compressed_len.
+    cv_decompressed = ls_data-raw.
+ 
+    IF lv_compressed_len IS INITIAL.
+      zcx_abapgit_exception=>raise( |Decompression falied :o/| ).
+    ENDIF.
+ 
+    cv_data = cv_data+lv_compressed_len.
+ 
+    lv_adler32 = zcl_abapgit_hash=>adler32( cv_decompressed ).
+    IF cv_data(4) <> lv_adler32.
+      cv_data = cv_data+1.
+    ENDIF.
+    IF cv_data(4) <> lv_adler32.
+      cv_data = cv_data+1.
+    ENDIF.
+    IF cv_data(4) <> lv_adler32.
+      zcx_abapgit_exception=>raise( |Wrong Adler checksum| ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_pack.clas.locals_imp.abap.html b/src/git/zcl_abapgit_git_pack.clas.locals_imp.abap.html new file mode 100644 index 00000000000..8022cf0b7ad --- /dev/null +++ b/src/git/zcl_abapgit_git_pack.clas.locals_imp.abap.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_pack.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_pack.clas.locals_imp.abap

+
+ +
+ 100% + Statements + 25/25 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 25/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
*"* use this source file for the definition and implementation of
+*"* local helper classes, interface definitions and type
+*"* declarations
+ 
+CLASS lcl_stream IMPLEMENTATION.
+ 
+  METHOD constructor.
+    mv_data = iv_data.
+  ENDMETHOD.
+ 
+  METHOD eat_byte.
+    rv_x = mv_data(1).
+    mv_data = mv_data+1.
+  ENDMETHOD.
+ 
+  METHOD get.
+    rv_data = mv_data.
+  ENDMETHOD.
+ 
+  METHOD eat_bytes.
+    rv_x = mv_data(iv_length).
+    mv_data = mv_data+iv_length.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_pack.clas.testclasses.abap.html b/src/git/zcl_abapgit_git_pack.clas.testclasses.abap.html new file mode 100644 index 00000000000..8e5fc4ccd6b --- /dev/null +++ b/src/git/zcl_abapgit_git_pack.clas.testclasses.abap.html @@ -0,0 +1,2467 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_pack.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_pack.clas.testclasses.abap

+
+ +
+ 100% + Statements + 794/794 +
+ + +
+ 100% + Branches + 37/37 +
+ + +
+ 100% + Functions + 37/37 +
+ + +
+ 100% + Lines + 794/794 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +7951x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +1x +1x +18x +18x +18x +18x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_tree DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      test01 FOR TESTING RAISING zcx_abapgit_exception,
+      test02 FOR TESTING RAISING zcx_abapgit_exception,
+      test03 FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_tree IMPLEMENTATION.
+ 
+  METHOD test01.
+ 
+    DATA: lt_nodes  TYPE zcl_abapgit_git_pack=>ty_nodes_tt,
+          ls_node   LIKE LINE OF lt_nodes,
+          lv_data   TYPE xstring,
+          lt_result TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    CLEAR ls_node.
+    ls_node-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+    ls_node-name = 'foobar.txt'.
+    ls_node-sha1 = '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
+    APPEND ls_node TO lt_nodes.
+ 
+    lv_data = zcl_abapgit_git_pack=>encode_tree( lt_nodes ).
+    lt_result = zcl_abapgit_git_pack=>decode_tree( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = lt_nodes
+        act = lt_result ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test02.
+ 
+    DATA: lt_nodes  TYPE zcl_abapgit_git_pack=>ty_nodes_tt,
+          ls_node   LIKE LINE OF lt_nodes,
+          lv_data   TYPE xstring,
+          lt_result TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    CLEAR ls_node.
+    ls_node-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+    ls_node-name = 'foobar.txt'.
+    ls_node-sha1 = '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
+    APPEND ls_node TO lt_nodes.
+ 
+    CLEAR ls_node.
+    ls_node-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+    ls_node-name = 'something.md'.
+    ls_node-sha1 = '1236cb3c4b7f0b3600b64f744cde614a283a88dc'.
+    APPEND ls_node TO lt_nodes.
+ 
+    lv_data = zcl_abapgit_git_pack=>encode_tree( lt_nodes ).
+    lt_result = zcl_abapgit_git_pack=>decode_tree( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = lt_nodes
+        act = lt_result ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test03.
+ 
+    DATA: lt_nodes  TYPE zcl_abapgit_git_pack=>ty_nodes_tt,
+          ls_node   LIKE LINE OF lt_nodes,
+          lv_data   TYPE xstring,
+          lt_result TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    CLEAR ls_node.
+    ls_node-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+    ls_node-name = 'foobar.txt'.
+    ls_node-sha1 = '0000003c4b7f0b3600b64f744cde614a28000000'.
+    APPEND ls_node TO lt_nodes.
+ 
+    lv_data = zcl_abapgit_git_pack=>encode_tree( lt_nodes ).
+    lt_result = zcl_abapgit_git_pack=>decode_tree( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = lt_nodes
+        act = lt_result ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_type_and_length DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_pack DEFINITION LOCAL FRIENDS ltcl_type_and_length.
+ 
+CLASS ltcl_type_and_length DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      test
+        IMPORTING
+          iv_length   TYPE i
+          iv_type     TYPE zif_abapgit_git_definitions=>ty_type DEFAULT zif_abapgit_git_definitions=>c_type-commit
+          iv_expected TYPE xstring
+        RAISING
+          zcx_abapgit_exception,
+      type_and_length_0 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_1 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_10 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_15 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_16 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_17 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_100 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_128 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_2047 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_2048 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_90000 FOR TESTING RAISING zcx_abapgit_exception,
+      type_and_length_1000000 FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_type_and_length IMPLEMENTATION.
+ 
+  METHOD test.
+ 
+    DATA: lv_result TYPE xstring.
+ 
+    lv_result = zcl_abapgit_git_pack=>type_and_length(
+      iv_type   = iv_type
+      iv_length = iv_length ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = iv_expected ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_100.
+ 
+    test( iv_length   = 100
+          iv_expected = '9406' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_2047.
+ 
+    test( iv_length   = 2047
+          iv_expected = '9F7F' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_2048.
+ 
+    test( iv_length   = 2048
+          iv_expected = '908001' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_90000.
+ 
+    test( iv_length   = 90000
+          iv_type     = zif_abapgit_git_definitions=>c_type-blob
+          iv_expected = 'B0F92B' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_10.
+ 
+    test( iv_length   = 10
+          iv_expected = '1A' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_1000000.
+ 
+    test( iv_length   = 1000000
+          iv_expected = '90A4E803' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_0.
+ 
+    test( iv_length   = 0
+          iv_expected = '10' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_128.
+ 
+    test( iv_length   = 128
+          iv_expected = '9008' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_1.
+ 
+    test( iv_length   = 1
+          iv_expected = '11' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_15.
+ 
+    test( iv_length   = 15
+          iv_expected = '1F' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_16.
+ 
+    test( iv_length   = 16
+          iv_expected = '9001' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD type_and_length_17.
+ 
+    test( iv_length   = 17
+          iv_expected = '9101' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_pack DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_pack DEFINITION LOCAL FRIENDS ltcl_pack.
+ 
+CLASS ltcl_pack DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+ 
+    CONSTANTS: c_sha TYPE zif_abapgit_git_definitions=>ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
+ 
+    METHODS:
+      commit FOR TESTING
+        RAISING zcx_abapgit_exception,
+      commit_newline FOR TESTING
+        RAISING zcx_abapgit_exception,
+      signed_commit FOR TESTING
+        RAISING zcx_abapgit_exception,
+      pack_short FOR TESTING
+        RAISING zcx_abapgit_exception,
+      pack_long FOR TESTING
+        RAISING zcx_abapgit_exception,
+      pack_multiple FOR TESTING
+        RAISING zcx_abapgit_exception,
+      sort_tree1 FOR TESTING,
+      sort_tree2 FOR TESTING.
+ 
+    METHODS:
+      object_blob
+        IMPORTING iv_data          TYPE xstring
+        RETURNING VALUE(rs_object) TYPE zif_abapgit_definitions=>ty_object
+        RAISING   zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_pack IMPLEMENTATION.
+ 
+  METHOD sort_tree1.
+ 
+    DATA: lt_tree TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    FIELD-SYMBOLS: <ls_tree> LIKE LINE OF lt_tree.
+ 
+ 
+    APPEND INITIAL LINE TO lt_tree ASSIGNING <ls_tree>.
+    <ls_tree>-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+    <ls_tree>-name  = 'b.txt'.
+    <ls_tree>-sha1  = '0123'.
+ 
+    APPEND INITIAL LINE TO lt_tree ASSIGNING <ls_tree>.
+    <ls_tree>-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+    <ls_tree>-name  = 'a.txt'.
+    <ls_tree>-sha1  = '0123'.
+ 
+    lt_tree = zcl_abapgit_git_pack=>sort_tree( lt_tree ).
+ 
+    READ TABLE lt_tree INDEX 1 ASSIGNING <ls_tree>.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = <ls_tree>-name
+      exp = 'a.txt' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD sort_tree2.
+ 
+    DATA: lt_tree TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    FIELD-SYMBOLS: <ls_tree> LIKE LINE OF lt_tree.
+ 
+ 
+    APPEND INITIAL LINE TO lt_tree ASSIGNING <ls_tree>.
+    <ls_tree>-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+    <ls_tree>-name  = 'foo.txt'.
+    <ls_tree>-sha1  = '0123'.
+ 
+    APPEND INITIAL LINE TO lt_tree ASSIGNING <ls_tree>.
+    <ls_tree>-chmod = zif_abapgit_git_definitions=>c_chmod-dir.
+    <ls_tree>-name  = 'foo'.
+    <ls_tree>-sha1  = '0123'.
+ 
+    lt_tree = zcl_abapgit_git_pack=>sort_tree( lt_tree ).
+ 
+    READ TABLE lt_tree INDEX 1 ASSIGNING <ls_tree>.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = <ls_tree>-name
+      exp = 'foo.txt' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD pack_multiple.
+ 
+    CONSTANTS: lc_data TYPE x LENGTH 15 VALUE '123456789ABCDEF545794254754554',
+               lc_sha  TYPE zif_abapgit_git_definitions=>ty_sha1 VALUE '5f46cb3c4b7f0b3600b64f744cde614a283a88dc'.
+ 
+    DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt,
+          ls_object  LIKE LINE OF lt_objects,
+          lt_nodes   TYPE zcl_abapgit_git_pack=>ty_nodes_tt,
+          ls_node    LIKE LINE OF lt_nodes,
+          ls_commit  TYPE zcl_abapgit_git_pack=>ty_commit,
+          lt_result  TYPE zif_abapgit_definitions=>ty_objects_tt,
+          lv_data    TYPE xstring.
+ 
+ 
+* blob
+    lv_data = lc_data.
+    CLEAR ls_object.
+    ls_object-sha1 = zcl_abapgit_hash=>sha1_blob( lv_data ).
+    ls_object-type = zif_abapgit_git_definitions=>c_type-blob.
+    ls_object-data = lv_data.
+    ls_object-index = 1.
+    ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ).
+    APPEND ls_object TO lt_objects.
+ 
+* commit
+    CLEAR ls_commit.
+    ls_commit-tree      = lc_sha.
+    ls_commit-parent    = lc_sha.
+    ls_commit-author    = 'John Foobar'.
+    ls_commit-committer = 'John Foobar'.
+    ls_commit-body      = 'body'.
+    lv_data = zcl_abapgit_git_pack=>encode_commit( ls_commit ).
+    CLEAR ls_object.
+    ls_object-sha1 = zcl_abapgit_hash=>sha1_commit( lv_data ).
+    ls_object-type = zif_abapgit_git_definitions=>c_type-commit.
+    ls_object-data = lv_data.
+    ls_object-index = 2.
+    ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ).
+    APPEND ls_object TO lt_objects.
+ 
+* tree
+    CLEAR ls_node.
+    ls_node-chmod     = '12456'.
+    ls_node-name      = 'foobar.abap'.
+    ls_node-sha1      = lc_sha.
+    APPEND ls_node TO lt_nodes.
+    lv_data = zcl_abapgit_git_pack=>encode_tree( lt_nodes ).
+    CLEAR ls_object.
+    ls_object-sha1 = zcl_abapgit_hash=>sha1_tree( lv_data ).
+    ls_object-type = zif_abapgit_git_definitions=>c_type-tree.
+    ls_object-data = lv_data.
+    ls_object-index = 3.
+    ls_object-adler32 = zcl_abapgit_hash=>adler32( lv_data ).
+    APPEND ls_object TO lt_objects.
+ 
+ 
+    CLEAR lv_data.
+    lv_data = zcl_abapgit_git_pack=>encode( lt_objects ).
+    lt_result = zcl_abapgit_git_pack=>decode( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = lt_objects
+        act = lt_result ).
+ 
+  ENDMETHOD.
+ 
+  METHOD object_blob.
+ 
+    rs_object-sha1 = zcl_abapgit_hash=>sha1_blob( iv_data ).
+    rs_object-type = zif_abapgit_git_definitions=>c_type-blob.
+    rs_object-data = iv_data.
+    rs_object-index = 1.
+    rs_object-adler32 = zcl_abapgit_hash=>adler32( iv_data ).
+ 
+  ENDMETHOD.
+ 
+  METHOD pack_short.
+ 
+    CONSTANTS: lc_data TYPE x LENGTH 8 VALUE '0123456789ABCDEF'.
+ 
+    DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt,
+          ls_object  LIKE LINE OF lt_objects,
+          lt_result  TYPE zif_abapgit_definitions=>ty_objects_tt,
+          lv_data    TYPE xstring.
+ 
+ 
+    lv_data = lc_data.
+ 
+    ls_object = object_blob( lv_data ).
+    APPEND ls_object TO lt_objects.
+ 
+    CLEAR lv_data.
+    lv_data = zcl_abapgit_git_pack=>encode( lt_objects ).
+    lt_result = zcl_abapgit_git_pack=>decode( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = lt_objects
+        act = lt_result ).
+ 
+  ENDMETHOD.
+ 
+  METHOD pack_long.
+ 
+    CONSTANTS: lc_data TYPE x LENGTH 8 VALUE '0123456789ABCDEF'.
+ 
+    DATA: lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt,
+          ls_object  LIKE LINE OF lt_objects,
+          lv_xstring TYPE xstring,
+          lt_result  TYPE zif_abapgit_definitions=>ty_objects_tt,
+          lv_data    TYPE xstring.
+ 
+ 
+    lv_xstring = lc_data.
+    DO 20 TIMES.
+      CONCATENATE lv_xstring lv_data INTO lv_data IN BYTE MODE.
+    ENDDO.
+ 
+    ls_object = object_blob( lv_data ).
+    APPEND ls_object TO lt_objects.
+ 
+    CLEAR lv_data.
+    lv_data = zcl_abapgit_git_pack=>encode( lt_objects ).
+    lt_result = zcl_abapgit_git_pack=>decode( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = lt_objects
+        act = lt_result ).
+ 
+  ENDMETHOD.
+ 
+  METHOD commit.
+ 
+    DATA: ls_commit TYPE zcl_abapgit_git_pack=>ty_commit,
+          ls_result TYPE zcl_abapgit_git_pack=>ty_commit,
+          lv_data   TYPE xstring.
+ 
+ 
+    ls_commit-tree      = c_sha.
+    ls_commit-parent    = c_sha.
+    ls_commit-author    = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
+    ls_commit-committer = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
+    ls_commit-body      = 'very informative'.
+ 
+    lv_data = zcl_abapgit_git_pack=>encode_commit( ls_commit ).
+    ls_result = zcl_abapgit_git_pack=>decode_commit( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = ls_commit
+        act = ls_result ).
+ 
+  ENDMETHOD.
+ 
+  METHOD commit_newline.
+ 
+    DATA: ls_commit TYPE zcl_abapgit_git_pack=>ty_commit,
+          ls_result TYPE zcl_abapgit_git_pack=>ty_commit,
+          lv_data   TYPE xstring.
+ 
+ 
+    ls_commit-tree      = c_sha.
+    ls_commit-parent    = c_sha.
+    ls_commit-author    = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
+    ls_commit-committer = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
+    ls_commit-body      = 'very informative'
+                        && cl_abap_char_utilities=>newline
+                        && cl_abap_char_utilities=>newline.
+ 
+    lv_data = zcl_abapgit_git_pack=>encode_commit( ls_commit ).
+    ls_result = zcl_abapgit_git_pack=>decode_commit( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = ls_commit
+        act = ls_result ).
+ 
+  ENDMETHOD.
+ 
+  METHOD signed_commit.
+ 
+    DATA: ls_commit TYPE zcl_abapgit_git_pack=>ty_commit,
+          ls_result TYPE zcl_abapgit_git_pack=>ty_commit,
+          lv_data   TYPE xstring.
+ 
+    ls_commit-tree      = c_sha.
+    ls_commit-parent    = c_sha.
+    ls_commit-author    = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
+    ls_commit-committer = 'larshp <larshp@hotmail.com> 1387823471 +0100'.
+    ls_commit-body      = 'very informative'.
+    ls_commit-gpgsig    = '-----END PGP SIGNATURE-----'
+                          && |{ cl_abap_char_utilities=>newline } { cl_abap_char_utilities=>newline }|.
+ 
+    lv_data = zcl_abapgit_git_pack=>encode_commit( ls_commit ).
+    ls_result = zcl_abapgit_git_pack=>decode_commit( lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = ls_commit
+        act = ls_result ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_git_pack_decode_commit DEFINITION FOR TESTING
+    RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      decode1 FOR TESTING
+        RAISING zcx_abapgit_exception,
+      decode2 FOR TESTING
+        RAISING zcx_abapgit_exception,
+      decode3 FOR TESTING
+        RAISING zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+    DATA: ms_raw TYPE zcl_abapgit_git_pack=>ty_commit,
+          mv_str TYPE string.
+ 
+    METHODS:
+      setup,
+      decode
+        RAISING zcx_abapgit_exception,
+      add
+        IMPORTING iv_string TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_git_pack_decode_commit IMPLEMENTATION.
+ 
+  METHOD setup.
+    CLEAR ms_raw.
+    CLEAR mv_str.
+  ENDMETHOD.
+ 
+  METHOD add.
+ 
+    CONCATENATE mv_str iv_string cl_abap_char_utilities=>newline INTO mv_str.
+ 
+  ENDMETHOD.
+ 
+  METHOD decode.
+ 
+    DATA: lv_xstr TYPE xstring.
+ 
+ 
+    lv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8( mv_str ).
+ 
+    ms_raw = zcl_abapgit_git_pack=>decode_commit( lv_xstr ).
+ 
+  ENDMETHOD.
+ 
+  METHOD decode1.
+ 
+    add( 'tree tree' ).
+    add( 'parent parent1' ).
+    add( 'parent parent2' ).
+    add( 'author author' ).
+    add( 'committer committer' ).
+    add( '' ).
+    add( 'comment' ).
+ 
+    decode( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-tree
+      exp = 'tree' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-author
+      exp = 'author' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-committer
+      exp = 'committer' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-parent
+      exp = 'parent1' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-parent2
+      exp = 'parent2' ).
+ 
+    cl_abap_unit_assert=>assert_char_cp(
+      act = ms_raw-body
+      exp = 'comment+' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD decode2.
+ 
+    add( 'tree tree' ).
+    add( 'author author' ).
+    add( 'committer committer' ).
+    add( '' ).
+    add( 'comment' ).
+ 
+    decode( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-tree
+      exp = 'tree' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-author
+      exp = 'author' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-committer
+      exp = 'committer' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-parent
+      exp = '' ).
+ 
+    cl_abap_unit_assert=>assert_char_cp(
+      act = ms_raw-body
+      exp = 'comment+' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD decode3.
+ 
+    add( 'tree tree' ).
+    add( 'parent parent1' ).
+    add( 'author author' ).
+    add( 'committer committer' ).
+    add( '' ).
+    add( 'comment' ).
+ 
+    decode( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-tree
+      exp = 'tree' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-author
+      exp = 'author' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-committer
+      exp = 'committer' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ms_raw-parent
+      exp = 'parent1' ).
+ 
+    cl_abap_unit_assert=>assert_char_cp(
+      act = ms_raw-body
+      exp = 'comment+' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_tag DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      decode_tag FOR TESTING RAISING cx_static_check.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_tag IMPLEMENTATION.
+ 
+  METHOD decode_tag.
+ 
+    DATA: lv_test_data TYPE string,
+          lv_xstring   TYPE xstring,
+          ls_tag       TYPE zcl_abapgit_git_pack=>ty_tag.
+ 
+    lv_test_data = |object 175f9a21b15a9012c97a3dd15aea6d74d4204b6b\n|
+                && |type commit\n|
+                && |tag tag_1\n|
+                && |tagger Christian Guenter <christianguenter@googlemail.com> 1526718052 +0000\n|
+                && |\n|
+                && |This is an annotated tag\n|.
+ 
+    lv_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( lv_test_data ).
+ 
+    ls_tag = zcl_abapgit_git_pack=>decode_tag( lv_xstring ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |175f9a21b15a9012c97a3dd15aea6d74d4204b6b|
+      act = ls_tag-object ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'commit'
+      act = ls_tag-type ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'tag_1'
+      act = ls_tag-tag ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'Christian Guenter'
+      act = ls_tag-tagger_name ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'christianguenter@googlemail.com'
+      act = ls_tag-tagger_email ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'This is an annotated tag'
+      act = ls_tag-message ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_get_length DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_pack DEFINITION LOCAL FRIENDS ltcl_get_length.
+ 
+CLASS ltcl_get_length DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      test
+        IMPORTING
+          iv_data     TYPE xstring
+          iv_expected TYPE i,
+      length_0 FOR TESTING RAISING zcx_abapgit_exception,
+      length_1 FOR TESTING RAISING zcx_abapgit_exception,
+      length_15 FOR TESTING RAISING zcx_abapgit_exception,
+      length_31 FOR TESTING RAISING zcx_abapgit_exception,
+      length_22783 FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_get_length IMPLEMENTATION.
+ 
+  METHOD test.
+ 
+    DATA lv_length TYPE i.
+    DATA lv_data TYPE xstring.
+ 
+    lv_data = iv_data.
+ 
+    zcl_abapgit_git_pack=>get_length(
+      IMPORTING
+        ev_length = lv_length
+      CHANGING
+        cv_data   = lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_length
+      exp = iv_expected ).
+ 
+  ENDMETHOD.
+ 
+  METHOD length_0.
+ 
+    test(
+      iv_data     = '00'
+      iv_expected = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD length_1.
+ 
+    test(
+      iv_data     = '01'
+      iv_expected = 1 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD length_15.
+* four least significant bits set
+    test(
+      iv_data     = '0F'
+      iv_expected = 15 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD length_31.
+ 
+    test(
+      iv_data     = '8F01'
+      iv_expected = 31 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD length_22783.
+ 
+    test(
+      iv_data     = '8F8F0B'
+      iv_expected = 22783 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_porcelain.clas.abap.html b/src/git/zcl_abapgit_git_porcelain.clas.abap.html new file mode 100644 index 00000000000..14b587aa5e0 --- /dev/null +++ b/src/git/zcl_abapgit_git_porcelain.clas.abap.html @@ -0,0 +1,2566 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_porcelain.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_porcelain.clas.abap

+
+ +
+ 99.27% + Statements + 821/827 +
+ + +
+ 57.14% + Branches + 4/7 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 99.27% + Lines + 821/827 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +8281x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_porcelain DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_pull_result,
+        files   TYPE zif_abapgit_git_definitions=>ty_files_tt,
+        objects TYPE zif_abapgit_definitions=>ty_objects_tt,
+        commit  TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_pull_result .
+    TYPES:
+      BEGIN OF ty_push_result,
+        new_files     TYPE zif_abapgit_git_definitions=>ty_files_tt,
+        branch        TYPE zif_abapgit_git_definitions=>ty_sha1,
+        updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
+        new_objects   TYPE zif_abapgit_definitions=>ty_objects_tt,
+      END OF ty_push_result .
+ 
+    CLASS-METHODS pull_by_branch
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_branch_name  TYPE string
+        !iv_deepen_level TYPE i DEFAULT 1
+      RETURNING
+        VALUE(rs_result) TYPE ty_pull_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS pull_by_commit
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_commit_hash  TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_deepen_level TYPE i DEFAULT 1
+      RETURNING
+        VALUE(rs_result) TYPE ty_pull_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS push
+      IMPORTING
+        !is_comment      TYPE zif_abapgit_git_definitions=>ty_comment
+        !io_stage        TYPE REF TO zcl_abapgit_stage
+        !it_old_objects  TYPE zif_abapgit_definitions=>ty_objects_tt
+        !iv_parent       TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_url          TYPE string
+        !iv_branch_name  TYPE string
+      RETURNING
+        VALUE(rs_result) TYPE ty_push_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_branch
+      IMPORTING
+        !iv_url  TYPE string
+        !iv_name TYPE string
+        !iv_from TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_tag
+      IMPORTING
+        !iv_url TYPE string
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_branch
+      IMPORTING
+        !iv_url    TYPE string
+        !is_branch TYPE zif_abapgit_git_definitions=>ty_git_branch
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_tag
+      IMPORTING
+        !iv_url TYPE string
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS full_tree
+      IMPORTING
+        !it_objects        TYPE zif_abapgit_definitions=>ty_objects_tt
+        !iv_parent         TYPE zif_abapgit_git_definitions=>ty_sha1
+      RETURNING
+        VALUE(rt_expanded) TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_tree,
+        path TYPE string,
+        data TYPE xstring,
+        sha1 TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_tree .
+    TYPES:
+      ty_trees_tt TYPE STANDARD TABLE OF ty_tree WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_folder,
+        path  TYPE string,
+        count TYPE i,
+        sha1  TYPE zif_abapgit_git_definitions=>ty_sha1,
+      END OF ty_folder .
+    TYPES:
+      ty_folders_tt TYPE STANDARD TABLE OF ty_folder WITH DEFAULT KEY .
+ 
+    CONSTANTS c_zero TYPE zif_abapgit_git_definitions=>ty_sha1
+      VALUE '0000000000000000000000000000000000000000' ##NO_TEXT.
+ 
+    CLASS-METHODS build_trees
+      IMPORTING
+        !it_expanded    TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+      RETURNING
+        VALUE(rt_trees) TYPE ty_trees_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS find_folders
+      IMPORTING
+        !it_expanded      TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+      RETURNING
+        VALUE(rt_folders) TYPE ty_folders_tt .
+    CLASS-METHODS pull
+      IMPORTING
+        !iv_commit      TYPE zif_abapgit_git_definitions=>ty_sha1
+        !it_objects     TYPE zif_abapgit_definitions=>ty_objects_tt
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS walk
+      IMPORTING
+        !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+        !iv_sha1    TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_path    TYPE string
+      CHANGING
+        !ct_files   TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS walk_tree
+      IMPORTING
+        !it_objects        TYPE zif_abapgit_definitions=>ty_objects_tt
+        !iv_tree           TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_base           TYPE string
+      RETURNING
+        VALUE(rt_expanded) TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS receive_pack_push
+      IMPORTING
+        !is_comment     TYPE zif_abapgit_git_definitions=>ty_comment
+        !it_trees       TYPE ty_trees_tt
+        !it_blobs       TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !iv_parent      TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_parent2     TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL
+        !iv_url         TYPE string
+        !iv_branch_name TYPE string
+      EXPORTING
+        !ev_new_commit  TYPE zif_abapgit_git_definitions=>ty_sha1
+        !et_new_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+        !ev_new_tree    TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_annotated_tag
+      IMPORTING
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_lightweight_tag
+      IMPORTING
+        is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+        iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_annotated_tag
+      IMPORTING
+        !iv_url TYPE string
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_lightweight_tag
+      IMPORTING
+        !iv_url TYPE string
+        !is_tag TYPE zif_abapgit_git_definitions=>ty_git_tag
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS empty_packfile
+      RETURNING
+        VALUE(rv_pack) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_porcelain IMPLEMENTATION.
+ 
+ 
+  METHOD build_trees.
+ 
+    DATA: lt_nodes   TYPE zcl_abapgit_git_pack=>ty_nodes_tt,
+          ls_tree    LIKE LINE OF rt_trees,
+          lv_len     TYPE i,
+          lt_folders TYPE ty_folders_tt.
+ 
+    FIELD-SYMBOLS: <ls_folder> LIKE LINE OF lt_folders,
+                   <ls_node>   LIKE LINE OF lt_nodes,
+                   <ls_sub>    LIKE LINE OF lt_folders,
+                   <ls_exp>    LIKE LINE OF it_expanded.
+ 
+ 
+    lt_folders = find_folders( it_expanded ).
+ 
+* start with the deepest folders
+    SORT lt_folders BY count DESCENDING.
+ 
+    LOOP AT lt_folders ASSIGNING <ls_folder>.
+      CLEAR lt_nodes.
+ 
+* files
+      LOOP AT it_expanded ASSIGNING <ls_exp> WHERE path = <ls_folder>-path.
+        APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
+        <ls_node>-chmod = <ls_exp>-chmod.
+        <ls_node>-name  = <ls_exp>-name.
+        <ls_node>-sha1  = <ls_exp>-sha1.
+      ENDLOOP.
+ 
+* folders
+      LOOP AT lt_folders ASSIGNING <ls_sub> WHERE count = <ls_folder>-count + 1.
+        lv_len = strlen( <ls_folder>-path ).
+        IF strlen( <ls_sub>-path ) > lv_len AND <ls_sub>-path(lv_len) = <ls_folder>-path.
+          APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
+          <ls_node>-chmod = zif_abapgit_git_definitions=>c_chmod-dir.
+ 
+* extract folder name, this can probably be done easier using regular expressions
+          <ls_node>-name = <ls_sub>-path+lv_len.
+          lv_len = strlen( <ls_node>-name ) - 1.
+          <ls_node>-name = <ls_node>-name(lv_len).
+ 
+          <ls_node>-sha1 = <ls_sub>-sha1.
+        ENDIF.
+      ENDLOOP.
+ 
+      CLEAR ls_tree.
+      ls_tree-path = <ls_folder>-path.
+      ls_tree-data = zcl_abapgit_git_pack=>encode_tree( lt_nodes ).
+      ls_tree-sha1 = zcl_abapgit_hash=>sha1_tree( ls_tree-data ).
+      APPEND ls_tree TO rt_trees.
+ 
+      <ls_folder>-sha1 = ls_tree-sha1.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_annotated_tag.
+ 
+    DATA: lv_tag          TYPE xstring,
+          lt_objects      TYPE zif_abapgit_definitions=>ty_objects_tt,
+          lv_pack         TYPE xstring,
+          ls_object       LIKE LINE OF lt_objects,
+          ls_tag          TYPE zcl_abapgit_git_pack=>ty_tag,
+          lv_new_tag_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1.
+ 
+* new tag
+    ls_tag-object       = is_tag-sha1.
+    ls_tag-type         = zif_abapgit_git_definitions=>c_type-commit.
+    ls_tag-tag          = is_tag-name.
+    ls_tag-tagger_name  = is_tag-tagger_name.
+    ls_tag-tagger_email = is_tag-tagger_email.
+    ls_tag-message      = is_tag-message
+                      && |{ cl_abap_char_utilities=>newline }|
+                      && |{ cl_abap_char_utilities=>newline }|
+                      && is_tag-body.
+ 
+    lv_tag = zcl_abapgit_git_pack=>encode_tag( ls_tag ).
+ 
+    lv_new_tag_sha1 = zcl_abapgit_hash=>sha1_tag( lv_tag ).
+ 
+    ls_object-sha1  = lv_new_tag_sha1.
+    ls_object-type  = zif_abapgit_git_definitions=>c_type-tag.
+    ls_object-data  = lv_tag.
+    ls_object-index = 1.
+    APPEND ls_object TO lt_objects.
+ 
+    lv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = c_zero
+      iv_new         = lv_new_tag_sha1
+      iv_branch_name = is_tag-name
+      iv_pack        = lv_pack ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_branch.
+ 
+    IF iv_name CS ` `.
+      zcx_abapgit_exception=>raise( 'Branch name cannot contain blank spaces' ).
+    ENDIF.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = c_zero
+      iv_new         = iv_from
+      iv_branch_name = iv_name
+      iv_pack        = empty_packfile( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_lightweight_tag.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = c_zero
+      iv_new         = is_tag-sha1
+      iv_branch_name = is_tag-name
+      iv_pack        = empty_packfile( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_tag.
+ 
+    IF is_tag-name CS ` `.
+      zcx_abapgit_exception=>raise( 'Tag name cannot contain blank spaces' ).
+    ENDIF.
+ 
+    CASE is_tag-type.
+      WHEN zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag.
+ 
+        create_annotated_tag(
+          is_tag = is_tag
+          iv_url = iv_url ).
+ 
+      WHEN zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag.
+ 
+        create_lightweight_tag(
+          is_tag = is_tag
+          iv_url = iv_url ).
+ 
+      WHEN OTHERS.
+ 
+        zcx_abapgit_exception=>raise( |Invalid tag type: { is_tag-type }| ).
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_annotated_tag.
+ 
+    DATA:
+      lo_branches TYPE REF TO zcl_abapgit_git_branch_list,
+      lv_tag      TYPE string,
+      ls_tag      TYPE zif_abapgit_git_definitions=>ty_git_branch,
+      lt_tags     TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt.
+ 
+    " For annotated tags, find the correct commit
+    lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
+    lt_tags     = lo_branches->get_tags_only( ).
+    lv_tag      = zcl_abapgit_git_tag=>remove_peel( is_tag-name ).
+ 
+    READ TABLE lt_tags INTO ls_tag WITH KEY name_key COMPONENTS name = lv_tag.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Annotated tag { lv_tag } not found| ).
+    ENDIF.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = ls_tag-sha1
+      iv_new         = c_zero
+      iv_branch_name = ls_tag-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_branch.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = is_branch-sha1
+      iv_new         = c_zero
+      iv_branch_name = is_branch-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_lightweight_tag.
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = is_tag-sha1
+      iv_new         = c_zero
+      iv_branch_name = is_tag-name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_tag.
+ 
+    IF is_tag-name CS zif_abapgit_git_definitions=>c_git_branch-peel.
+ 
+      delete_annotated_tag(
+        is_tag = is_tag
+        iv_url = iv_url ).
+ 
+    ELSE.
+ 
+      delete_lightweight_tag(
+        is_tag = is_tag
+        iv_url = iv_url ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD empty_packfile.
+ 
+    " For avoiding "client MUST send an empty packfile" error
+    " https://github.com/git/git/blob/master/Documentation/gitprotocol-pack.txt#L595-L599
+ 
+    DATA lt_objects TYPE zif_abapgit_definitions=>ty_objects_tt.
+ 
+    rv_pack = zcl_abapgit_git_pack=>encode( lt_objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_folders.
+ 
+    DATA: lt_paths TYPE TABLE OF string,
+          lv_split TYPE string,
+          lv_path  TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_folder> LIKE LINE OF rt_folders,
+                   <ls_new>    LIKE LINE OF rt_folders,
+                   <ls_exp>    LIKE LINE OF it_expanded.
+ 
+ 
+    LOOP AT it_expanded ASSIGNING <ls_exp>.
+      READ TABLE rt_folders WITH KEY path = <ls_exp>-path TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        APPEND INITIAL LINE TO rt_folders ASSIGNING <ls_folder>.
+        <ls_folder>-path = <ls_exp>-path.
+      ENDIF.
+    ENDLOOP.
+ 
+* add empty folders
+    LOOP AT rt_folders ASSIGNING <ls_folder>.
+      SPLIT <ls_folder>-path AT '/' INTO TABLE lt_paths.
+ 
+      CLEAR lv_path.
+      LOOP AT lt_paths INTO lv_split.
+        CONCATENATE lv_path lv_split '/' INTO lv_path.
+        READ TABLE rt_folders WITH KEY path = lv_path TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          APPEND INITIAL LINE TO rt_folders ASSIGNING <ls_new>.
+          <ls_new>-path = lv_path.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    LOOP AT rt_folders ASSIGNING <ls_folder>.
+      FIND ALL OCCURRENCES OF '/' IN <ls_folder>-path MATCH COUNT <ls_folder>-count.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD full_tree.
+ 
+    DATA: ls_object LIKE LINE OF it_objects,
+          ls_commit TYPE zcl_abapgit_git_pack=>ty_commit.
+ 
+    READ TABLE it_objects INTO ls_object
+      WITH KEY type COMPONENTS
+        type = zif_abapgit_git_definitions=>c_type-commit
+        sha1 = iv_parent.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'commit not found' ).
+    ENDIF.
+    ls_commit = zcl_abapgit_git_pack=>decode_commit( ls_object-data ).
+ 
+    rt_expanded = walk_tree( it_objects = it_objects
+                             iv_tree    = ls_commit-tree
+                             iv_base    = '/' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pull.
+ 
+    DATA: ls_object TYPE zif_abapgit_definitions=>ty_object,
+          ls_commit TYPE zcl_abapgit_git_pack=>ty_commit.
+ 
+    READ TABLE it_objects INTO ls_object
+      WITH KEY type COMPONENTS
+        type = zif_abapgit_git_definitions=>c_type-commit
+        sha1 = iv_commit.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Commit/Branch not found.' ).
+    ENDIF.
+ 
+    ls_commit = zcl_abapgit_git_pack=>decode_commit( ls_object-data ).
+ 
+    walk( EXPORTING it_objects = it_objects
+                    iv_sha1    = ls_commit-tree
+                    iv_path    = '/'
+          CHANGING  ct_files   = rt_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pull_by_branch.
+ 
+    zcl_abapgit_git_transport=>upload_pack_by_branch(
+      EXPORTING
+        iv_url          = iv_url
+        iv_branch_name  = iv_branch_name
+        iv_deepen_level = iv_deepen_level
+      IMPORTING
+        et_objects      = rs_result-objects
+        ev_branch       = rs_result-commit ).
+ 
+    rs_result-files = pull( iv_commit  = rs_result-commit
+                            it_objects = rs_result-objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pull_by_commit.
+ 
+    zcl_abapgit_git_transport=>upload_pack_by_commit(
+      EXPORTING
+        iv_url          = iv_url
+        iv_hash         = iv_commit_hash
+        iv_deepen_level = iv_deepen_level
+      IMPORTING
+        et_objects      = rs_result-objects
+        ev_commit       = rs_result-commit ).
+ 
+    rs_result-files = pull( iv_commit  = rs_result-commit
+                            it_objects = rs_result-objects ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push.
+ 
+    DATA: lt_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt,
+          lt_blobs    TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lv_sha1     TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_new_tree TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lt_trees    TYPE ty_trees_tt,
+          lt_stage    TYPE zif_abapgit_definitions=>ty_stage_tt.
+ 
+    FIELD-SYMBOLS: <ls_stage>   LIKE LINE OF lt_stage,
+                   <ls_updated> LIKE LINE OF rs_result-updated_files,
+                   <ls_exp>     LIKE LINE OF lt_expanded.
+ 
+    lt_expanded = full_tree( it_objects = it_old_objects
+                             iv_parent  = iv_parent ).
+ 
+    lt_stage = io_stage->get_all( ).
+    LOOP AT lt_stage ASSIGNING <ls_stage>.
+ 
+      " Save file ref to updated files table
+      APPEND INITIAL LINE TO rs_result-updated_files ASSIGNING <ls_updated>.
+      MOVE-CORRESPONDING <ls_stage>-file TO <ls_updated>.
+ 
+      CASE <ls_stage>-method.
+        WHEN zif_abapgit_definitions=>c_method-add.
+ 
+          APPEND <ls_stage>-file TO lt_blobs.
+ 
+          READ TABLE lt_expanded ASSIGNING <ls_exp> WITH KEY
+            name = <ls_stage>-file-filename
+            path = <ls_stage>-file-path.
+          IF sy-subrc <> 0. " new files
+            APPEND INITIAL LINE TO lt_expanded ASSIGNING <ls_exp>.
+            <ls_exp>-name  = <ls_stage>-file-filename.
+            <ls_exp>-path  = <ls_stage>-file-path.
+            <ls_exp>-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+          ENDIF.
+ 
+          lv_sha1 = zcl_abapgit_hash=>sha1_blob( <ls_stage>-file-data ).
+          IF <ls_exp>-sha1 <> lv_sha1.
+            <ls_exp>-sha1 = lv_sha1.
+          ENDIF.
+ 
+          <ls_updated>-sha1 = lv_sha1.   "New sha1
+ 
+        WHEN zif_abapgit_definitions=>c_method-rm.
+          DELETE lt_expanded
+            WHERE name = <ls_stage>-file-filename
+            AND path = <ls_stage>-file-path.
+          ASSERT sy-subrc = 0.
+ 
+          CLEAR <ls_updated>-sha1.       " Mark as deleted
+ 
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( 'stage method not supported, todo' ).
+      ENDCASE.
+    ENDLOOP.
+ 
+    lt_trees = build_trees( lt_expanded ).
+ 
+    receive_pack_push(
+      EXPORTING
+        is_comment     = is_comment
+        it_trees       = lt_trees
+        iv_branch_name = iv_branch_name
+        iv_url         = iv_url
+        iv_parent      = iv_parent
+        iv_parent2     = io_stage->get_merge_source( )
+        it_blobs       = lt_blobs
+      IMPORTING
+        ev_new_commit  = rs_result-branch
+        et_new_objects = rs_result-new_objects
+        ev_new_tree    = lv_new_tree ).
+ 
+    APPEND LINES OF it_old_objects TO rs_result-new_objects.
+ 
+    walk( EXPORTING it_objects = rs_result-new_objects
+                    iv_sha1    = lv_new_tree
+                    iv_path    = '/'
+          CHANGING  ct_files   = rs_result-new_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD receive_pack_push.
+ 
+    DATA: lv_time   TYPE zcl_abapgit_git_time=>ty_unixtime,
+          lv_commit TYPE xstring,
+          lv_pack   TYPE xstring,
+          ls_object LIKE LINE OF et_new_objects,
+          ls_commit TYPE zcl_abapgit_git_pack=>ty_commit,
+          lv_uindex TYPE sy-index.
+ 
+    FIELD-SYMBOLS: <ls_tree> LIKE LINE OF it_trees,
+                   <ls_blob> LIKE LINE OF it_blobs.
+ 
+ 
+    lv_time = zcl_abapgit_git_time=>get_unix( ).
+ 
+    READ TABLE it_trees ASSIGNING <ls_tree> WITH KEY path = '/'.
+    ASSERT sy-subrc = 0.
+ 
+* new commit
+    ls_commit-committer = |{ is_comment-committer-name
+      } <{ is_comment-committer-email }> { lv_time }|.
+    IF is_comment-author-name IS NOT INITIAL.
+      ls_commit-author = |{ is_comment-author-name
+        } <{ is_comment-author-email }> { lv_time }|.
+    ELSE.
+      ls_commit-author = ls_commit-committer.
+    ENDIF.
+ 
+    ls_commit-tree      = <ls_tree>-sha1.
+    ls_commit-parent    = iv_parent.
+    ls_commit-parent2   = iv_parent2.
+    ls_commit-body      = is_comment-comment.
+    lv_commit = zcl_abapgit_git_pack=>encode_commit( ls_commit ).
+ 
+    ls_object-sha1 = zcl_abapgit_hash=>sha1_commit( lv_commit ).
+    ls_object-type = zif_abapgit_git_definitions=>c_type-commit.
+    ls_object-data = lv_commit.
+    APPEND ls_object TO et_new_objects.
+ 
+    LOOP AT it_trees ASSIGNING <ls_tree>.
+      CLEAR ls_object.
+      ls_object-sha1 = <ls_tree>-sha1.
+ 
+      READ TABLE et_new_objects
+        WITH KEY type COMPONENTS
+          type = zif_abapgit_git_definitions=>c_type-tree
+          sha1 = ls_object-sha1
+        TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+* two identical trees added at the same time, only add one to the pack
+        CONTINUE.
+      ENDIF.
+ 
+      ls_object-type = zif_abapgit_git_definitions=>c_type-tree.
+      ls_object-data = <ls_tree>-data.
+      lv_uindex = lv_uindex + 1.
+      ls_object-index = lv_uindex.
+      APPEND ls_object TO et_new_objects.
+    ENDLOOP.
+ 
+    LOOP AT it_blobs ASSIGNING <ls_blob>.
+      CLEAR ls_object.
+      ls_object-sha1 = zcl_abapgit_hash=>sha1_blob( <ls_blob>-data ).
+ 
+      READ TABLE et_new_objects
+        WITH KEY type COMPONENTS
+          type = zif_abapgit_git_definitions=>c_type-blob
+          sha1 = ls_object-sha1
+        TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+* two identical files added at the same time, only add one blob to the pack
+        CONTINUE.
+      ENDIF.
+ 
+      ls_object-type = zif_abapgit_git_definitions=>c_type-blob.
+* note <ls_blob>-data can be empty, #1857 allow empty files - some more checks needed?
+      ls_object-data = <ls_blob>-data.
+      lv_uindex = lv_uindex + 1.
+      ls_object-index = lv_uindex.
+      APPEND ls_object TO et_new_objects.
+    ENDLOOP.
+ 
+    lv_pack = zcl_abapgit_git_pack=>encode( et_new_objects ).
+ 
+    ev_new_commit = zcl_abapgit_hash=>sha1_commit( lv_commit ).
+ 
+    zcl_abapgit_git_transport=>receive_pack(
+      iv_url         = iv_url
+      iv_old         = iv_parent
+      iv_new         = ev_new_commit
+      iv_branch_name = iv_branch_name
+      iv_pack        = lv_pack ).
+ 
+    ev_new_tree = ls_commit-tree.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD walk.
+ 
+    DATA: lv_path  TYPE string,
+          ls_file  LIKE LINE OF ct_files,
+          lt_nodes TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    FIELD-SYMBOLS: <ls_tree> LIKE LINE OF it_objects,
+                   <ls_blob> LIKE LINE OF it_objects,
+                   <ls_node> LIKE LINE OF lt_nodes.
+ 
+ 
+    READ TABLE it_objects ASSIGNING <ls_tree>
+      WITH KEY type COMPONENTS
+        type = zif_abapgit_git_definitions=>c_type-tree
+        sha1 = iv_sha1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Walk, tree not found' ).
+    ENDIF.
+ 
+    lt_nodes = zcl_abapgit_git_pack=>decode_tree( <ls_tree>-data ).
+ 
+    LOOP AT lt_nodes ASSIGNING <ls_node>.
+      IF <ls_node>-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+        READ TABLE it_objects ASSIGNING <ls_blob>
+          WITH KEY type COMPONENTS
+            type = zif_abapgit_git_definitions=>c_type-blob
+            sha1 = <ls_node>-sha1.
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise( 'Walk, blob not found' ).
+        ENDIF.
+ 
+        CLEAR ls_file.
+        ls_file-path     = iv_path.
+        ls_file-filename = <ls_node>-name.
+        ls_file-data     = <ls_blob>-data.
+        ls_file-sha1     = <ls_blob>-sha1.
+        APPEND ls_file TO ct_files.
+      ENDIF.
+    ENDLOOP.
+ 
+    LOOP AT lt_nodes ASSIGNING <ls_node> WHERE chmod = zif_abapgit_git_definitions=>c_chmod-dir.
+      CONCATENATE iv_path <ls_node>-name '/' INTO lv_path.
+ 
+      walk( EXPORTING it_objects = it_objects
+                      iv_sha1    = <ls_node>-sha1
+                      iv_path    = lv_path
+            CHANGING  ct_files   = ct_files ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD walk_tree.
+ 
+    DATA: ls_object   LIKE LINE OF it_objects,
+          lt_expanded LIKE rt_expanded,
+          lt_nodes    TYPE zcl_abapgit_git_pack=>ty_nodes_tt.
+ 
+    FIELD-SYMBOLS: <ls_exp>  LIKE LINE OF rt_expanded,
+                   <ls_node> LIKE LINE OF lt_nodes.
+ 
+ 
+    READ TABLE it_objects INTO ls_object
+      WITH KEY type COMPONENTS
+        type = zif_abapgit_git_definitions=>c_type-tree
+        sha1 = iv_tree.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'tree not found' ).
+    ENDIF.
+    lt_nodes = zcl_abapgit_git_pack=>decode_tree( ls_object-data ).
+ 
+    LOOP AT lt_nodes ASSIGNING <ls_node>.
+      CASE <ls_node>-chmod.
+        WHEN zif_abapgit_git_definitions=>c_chmod-file
+            OR zif_abapgit_git_definitions=>c_chmod-executable
+            OR zif_abapgit_git_definitions=>c_chmod-submodule.
+          APPEND INITIAL LINE TO rt_expanded ASSIGNING <ls_exp>.
+          <ls_exp>-path  = iv_base.
+          <ls_exp>-name  = <ls_node>-name.
+          <ls_exp>-sha1  = <ls_node>-sha1.
+          <ls_exp>-chmod = <ls_node>-chmod.
+        WHEN zif_abapgit_git_definitions=>c_chmod-dir.
+          lt_expanded = walk_tree(
+            it_objects = it_objects
+            iv_tree    = <ls_node>-sha1
+            iv_base    = iv_base && <ls_node>-name && '/' ).
+          APPEND LINES OF lt_expanded TO rt_expanded.
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( 'walk_tree: unknown chmod' ).
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap.html b/src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap.html new file mode 100644 index 00000000000..3f7398404f8 --- /dev/null +++ b/src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap.html @@ -0,0 +1,544 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_porcelain.clas.testclasses.abap

+
+ +
+ 100% + Statements + 153/153 +
+ + +
+ 100% + Branches + 8/8 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 100% + Lines + 153/153 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +1541x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +1x +1x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_git_porcelain DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_porcelain DEFINITION LOCAL FRIENDS ltcl_git_porcelain.
+ 
+CLASS ltcl_git_porcelain DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      setup,
+      append
+        IMPORTING iv_path TYPE string
+                  iv_name TYPE string,
+      single_file FOR TESTING
+        RAISING zcx_abapgit_exception,
+      two_files_same_path FOR TESTING
+        RAISING zcx_abapgit_exception,
+      root_empty FOR TESTING
+        RAISING zcx_abapgit_exception,
+      namespaces FOR TESTING
+        RAISING zcx_abapgit_exception,
+      more_sub FOR TESTING
+        RAISING zcx_abapgit_exception,
+      sub FOR TESTING
+        RAISING zcx_abapgit_exception.
+ 
+    DATA: mt_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt,
+          mt_trees    TYPE zcl_abapgit_git_porcelain=>ty_trees_tt.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_git_porcelain IMPLEMENTATION.
+ 
+  METHOD setup.
+    CLEAR mt_expanded.
+    CLEAR mt_trees.
+  ENDMETHOD.
+ 
+  METHOD append.
+ 
+    FIELD-SYMBOLS: <ls_expanded> LIKE LINE OF mt_expanded.
+ 
+ 
+    APPEND INITIAL LINE TO mt_expanded ASSIGNING <ls_expanded>.
+    <ls_expanded>-path  = iv_path.
+    <ls_expanded>-name  = iv_name.
+    <ls_expanded>-sha1  = 'a'.
+    <ls_expanded>-chmod = zif_abapgit_git_definitions=>c_chmod-file.
+ 
+  ENDMETHOD.
+ 
+  METHOD single_file.
+ 
+    append( iv_path = '/'
+            iv_name = 'foobar.txt' ).
+ 
+    mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mt_trees )
+      exp = 1 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD two_files_same_path.
+ 
+    append( iv_path = '/'
+            iv_name = 'foo.txt' ).
+ 
+    append( iv_path = '/'
+            iv_name = 'bar.txt' ).
+ 
+    mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mt_trees )
+      exp = 1 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD sub.
+ 
+    append( iv_path = '/'
+            iv_name = 'foo.txt' ).
+ 
+    append( iv_path = '/sub/'
+            iv_name = 'bar.txt' ).
+ 
+    mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mt_trees )
+      exp = 2 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD more_sub.
+ 
+    FIELD-SYMBOLS: <ls_tree> LIKE LINE OF mt_trees.
+ 
+    append( iv_path = '/src/foo_a/foo_a1/'
+            iv_name = 'a1.txt' ).
+ 
+    append( iv_path = '/src/foo_a/foo_a2/'
+            iv_name = 'a2.txt' ).
+ 
+    mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mt_trees )
+      exp = 5 ).
+ 
+    LOOP AT mt_trees ASSIGNING <ls_tree>.
+      cl_abap_unit_assert=>assert_not_initial( <ls_tree>-data ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD namespaces.
+ 
+    FIELD-SYMBOLS: <ls_tree> LIKE LINE OF mt_trees.
+ 
+    append( iv_path = '/src/#foo#a/#foo#a1/'
+            iv_name = 'a1.txt' ).
+ 
+    append( iv_path = '/src/#foo#a/#foo#a2/'
+            iv_name = 'a2.txt' ).
+ 
+    mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mt_trees )
+      exp = 5 ).
+ 
+    LOOP AT mt_trees ASSIGNING <ls_tree>.
+      cl_abap_unit_assert=>assert_not_initial( <ls_tree>-data ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD root_empty.
+ 
+    append( iv_path = '/sub/'
+            iv_name = 'bar.txt' ).
+ 
+    mt_trees = zcl_abapgit_git_porcelain=>build_trees( mt_expanded ).
+ 
+* so 2 total trees are expected: '/' and '/sub/'
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mt_trees )
+      exp = 2 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_tag.clas.abap.html b/src/git/zcl_abapgit_git_tag.clas.abap.html new file mode 100644 index 00000000000..9fc0a3da212 --- /dev/null +++ b/src/git/zcl_abapgit_git_tag.clas.abap.html @@ -0,0 +1,301 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_tag.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_tag.clas.abap

+
+ +
+ 100% + Statements + 72/72 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 72/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +731x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_tag DEFINITION
+  PUBLIC
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS add_tag_prefix
+      IMPORTING
+        !iv_text       TYPE csequence
+      RETURNING
+        VALUE(rv_text) TYPE string.
+ 
+    CLASS-METHODS remove_tag_prefix
+      IMPORTING
+        !iv_text       TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string.
+ 
+    CLASS-METHODS add_peel
+      IMPORTING
+        !iv_text       TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string.
+ 
+    CLASS-METHODS remove_peel
+      IMPORTING
+        !iv_text       TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_tag IMPLEMENTATION.
+ 
+ 
+  METHOD add_peel.
+ 
+    rv_text = iv_text && zif_abapgit_git_definitions=>c_git_branch-peel.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_tag_prefix.
+ 
+    rv_text = zif_abapgit_git_definitions=>c_git_branch-tags_prefix && iv_text.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_peel.
+ 
+    rv_text = iv_text.
+ 
+    REPLACE zif_abapgit_git_definitions=>c_git_branch-peel IN rv_text WITH ''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_tag_prefix.
+ 
+    rv_text = iv_text.
+ 
+    REPLACE FIRST OCCURRENCE OF zif_abapgit_git_definitions=>c_git_branch-tags_prefix
+            IN rv_text
+            WITH ''.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_time.clas.abap.html b/src/git/zcl_abapgit_git_time.clas.abap.html new file mode 100644 index 00000000000..16acaa82d21 --- /dev/null +++ b/src/git/zcl_abapgit_git_time.clas.abap.html @@ -0,0 +1,319 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_time.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_time.clas.abap

+
+ +
+ 100% + Statements + 78/78 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 78/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +791x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_time DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      ty_unixtime TYPE c LENGTH 16 .
+ 
+    CLASS-METHODS get_unix
+      RETURNING
+        VALUE(rv_time) TYPE ty_unixtime
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_utc
+      IMPORTING
+        !iv_unix TYPE ty_unixtime
+      EXPORTING
+        !ev_date TYPE sy-datum
+        !ev_time TYPE sy-uzeit .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_time IMPLEMENTATION.
+ 
+ 
+  METHOD get_unix.
+* returns seconds since unix epoch, including timezone indicator
+ 
+    CONSTANTS lc_epoch TYPE timestamp VALUE '19700101000000'.
+    DATA lv_time TYPE timestamp.
+    DATA lv_seconds TYPE i.
+ 
+    GET TIME STAMP FIELD lv_time.
+ 
+    lv_seconds = cl_abap_tstmp=>subtract(
+      tstmp1 = lv_time
+      tstmp2 = lc_epoch ).
+ 
+    rv_time = lv_seconds.
+    CONDENSE rv_time.
+    rv_time+11 = '+000000'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_utc.
+ 
+    CONSTANTS lc_epoch TYPE d VALUE '19700101'.
+ 
+    DATA: lv_i       TYPE i,
+          lv_utcdiff TYPE t,
+          lv_utcsign TYPE c LENGTH 1.
+ 
+ 
+    lv_i = iv_unix(10).
+    lv_utcsign = iv_unix+11.
+    lv_utcdiff = iv_unix+12.
+ 
+    " GMT + time-zone
+    CASE lv_utcsign.
+      WHEN '+'.
+        lv_i = lv_i + lv_utcdiff.
+      WHEN '-'.
+        lv_i = lv_i - lv_utcdiff.
+    ENDCASE.
+ 
+    ev_time = lv_i MOD 86400.
+    lv_i = lv_i - ev_time.
+    lv_i = lv_i / 86400.
+    ev_date = lv_i + lc_epoch.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_time.clas.testclasses.abap.html b/src/git/zcl_abapgit_git_time.clas.testclasses.abap.html new file mode 100644 index 00000000000..1400767429f --- /dev/null +++ b/src/git/zcl_abapgit_git_time.clas.testclasses.abap.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_time.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_time.clas.testclasses.abap

+
+ +
+ 100% + Statements + 42/42 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 42/42 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +431x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_time_test DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS get_unix FOR TESTING RAISING cx_static_check.
+    METHODS get_utc FOR TESTING.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_time_test IMPLEMENTATION.
+ 
+  METHOD get_unix.
+ 
+    DATA: lv_time TYPE zcl_abapgit_git_time=>ty_unixtime.
+ 
+    lv_time = zcl_abapgit_git_time=>get_unix( ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( lv_time ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_utc.
+ 
+    DATA: lv_date TYPE sy-datum,
+          lv_time TYPE sy-uzeit.
+ 
+    zcl_abapgit_git_time=>get_utc(
+      EXPORTING
+        iv_unix = '1574605521'
+      IMPORTING
+        ev_date = lv_date
+        ev_time = lv_time ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( lv_date ).
+    cl_abap_unit_assert=>assert_not_initial( lv_time ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_transport.clas.abap.html b/src/git/zcl_abapgit_git_transport.clas.abap.html new file mode 100644 index 00000000000..5cfb142f379 --- /dev/null +++ b/src/git/zcl_abapgit_git_transport.clas.abap.html @@ -0,0 +1,1411 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_transport.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_transport.clas.abap

+
+ +
+ 92.53% + Statements + 409/442 +
+ + +
+ 33.33% + Branches + 10/30 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 92.53% + Lines + 409/442 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +4431x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +  +1x +1x +1x +1x +1x +  +1x +1x +1x +  +4x +  +  +4x +4x +4x +4x +4x +1x +1x +  +1x +  +1x +  +1x +  +1x +  +1x +  +1x +  +1x +  +1x +1x +1x +  +  +  +  +  +4x +  +3x +1x +1x +1x +4x +1x +1x +1x +3x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +4x +4x +4x +8x +8x +8x +8x +8x +1x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_transport DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+* remote to local
+    CLASS-METHODS upload_pack_by_branch
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_branch_name  TYPE string
+        !iv_deepen_level TYPE i DEFAULT 1
+        !it_branches     TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt OPTIONAL
+      EXPORTING
+        !et_objects      TYPE zif_abapgit_definitions=>ty_objects_tt
+        !ev_branch       TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS upload_pack_by_commit
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_hash         TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL
+        !iv_deepen_level TYPE i DEFAULT 0
+      EXPORTING
+        !et_objects      TYPE zif_abapgit_definitions=>ty_objects_tt
+        !ev_commit       TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+* local to remote
+    CLASS-METHODS receive_pack
+      IMPORTING
+        !iv_url         TYPE string
+        !iv_old         TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_new         TYPE zif_abapgit_git_definitions=>ty_sha1
+        !iv_branch_name TYPE string
+        !iv_pack        TYPE xstring OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS branches
+      IMPORTING
+        !iv_url               TYPE string
+      RETURNING
+        VALUE(ro_branch_list) TYPE REF TO zcl_abapgit_git_branch_list
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_service,
+        receive TYPE string VALUE 'receive',                  "#EC NOTEXT
+        upload  TYPE string VALUE 'upload',                   "#EC NOTEXT
+      END OF c_service .
+ 
+    CLASS-METHODS check_report_status
+      IMPORTING
+        !iv_string TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS branch_list
+      IMPORTING
+        !iv_url         TYPE string
+        !iv_service     TYPE string
+      EXPORTING
+        !eo_client      TYPE REF TO zcl_abapgit_http_client
+        !eo_branch_list TYPE REF TO zcl_abapgit_git_branch_list
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS find_branch
+      IMPORTING
+        !iv_url         TYPE string
+        !iv_service     TYPE string
+        !iv_branch_name TYPE string
+      EXPORTING
+        !eo_client      TYPE REF TO zcl_abapgit_http_client
+        !ev_branch      TYPE zif_abapgit_git_definitions=>ty_sha1
+        !eo_branch_list TYPE REF TO zcl_abapgit_git_branch_list
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS parse
+      EXPORTING
+        !ev_pack TYPE xstring
+      CHANGING
+        !cv_data TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS upload_pack
+      IMPORTING
+        !io_client        TYPE REF TO zcl_abapgit_http_client
+        !iv_url           TYPE string
+        !iv_deepen_level  TYPE i DEFAULT 0
+        !it_hashes        TYPE zif_abapgit_git_definitions=>ty_sha1_tt
+      RETURNING
+        VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_transport IMPLEMENTATION.
+ 
+ 
+  METHOD branches.
+ 
+    DATA: lo_client TYPE REF TO zcl_abapgit_http_client.
+ 
+ 
+    branch_list(
+      EXPORTING
+        iv_url         = iv_url
+        iv_service     = c_service-upload
+      IMPORTING
+        eo_client      = lo_client
+        eo_branch_list = ro_branch_list ).
+ 
+    lo_client->close( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD branch_list.
+ 
+    CONSTANTS lc_content_regex TYPE string VALUE '^[0-9a-f]{4}#'.
+    CONSTANTS lc_content_type  TYPE string VALUE 'application/x-git-<service>-pack-advertisement'.
+ 
+    DATA: lv_data TYPE string.
+    DATA: lv_expected_content_type TYPE string.
+ 
+    eo_client = zcl_abapgit_http=>create_by_url(
+      iv_url     = iv_url
+      iv_service = iv_service ).
+ 
+    lv_expected_content_type = lc_content_type.
+    REPLACE '<service>' IN lv_expected_content_type WITH iv_service.
+ 
+    eo_client->check_smart_response(
+        iv_expected_content_type = lv_expected_content_type
+        iv_content_regex         = lc_content_regex ).
+ 
+    lv_data = eo_client->get_cdata( ).
+ 
+    CREATE OBJECT eo_branch_list
+      EXPORTING
+        iv_data = lv_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_report_status.
+ 
+    DATA:
+      lv_string        TYPE string,
+      lv_error         TYPE string,
+      lv_unpack_status TYPE string,
+      lv_unpack_code   TYPE string,
+      lv_unpack_text   TYPE string,
+      lv_commnd_status TYPE string,
+      lv_commnd_code   TYPE string,
+      lv_commnd_text   TYPE string.
+ 
+    " Based on https://git-scm.com/docs/pack-protocol/2.2.3#_report_status
+    lv_string = iv_string.
+ 
+    IF lv_string = ''.
+      lv_error = 'Unexpected empty reply'.
+    ELSEIF strlen( lv_string ) < 4.
+      lv_error = 'Missing pkt length for unpack status'.
+    ELSE.
+      lv_string = lv_string+4.
+      SPLIT lv_string AT cl_abap_char_utilities=>newline INTO lv_unpack_status lv_string.
+      SPLIT lv_unpack_status AT space INTO lv_unpack_text lv_unpack_code.
+ 
+      IF lv_unpack_text <> 'unpack'.
+        lv_error = 'Unexpected unpack status'.
+      ELSEIF lv_unpack_code <> 'ok'.
+        lv_error = |Unpack not ok ({ lv_unpack_code })|.
+      ELSEIF lv_string = ''.
+        lv_error = 'Unexpected command status'.
+      ELSEIF strlen( lv_string ) < 4.
+        lv_error = 'Missing pkt length for command status'.
+      ELSE.
+        lv_string = lv_string+4.
+        SPLIT lv_string AT cl_abap_char_utilities=>newline INTO lv_commnd_status lv_string.
+        SPLIT lv_commnd_status AT space INTO lv_commnd_code lv_commnd_text.
+ 
+        IF lv_commnd_code <> 'ok'. "=ng
+          " Some pre-defined error messages
+          IF lv_commnd_text CP '*pre-receive hook declined*'.
+            lv_error = 'Pre-receive hook declined'.
+          ELSEIF lv_commnd_text CP '*protected branch hook declined*'.
+            lv_error = 'Protected branch hook declined'.
+          ELSEIF lv_commnd_text CP '*push declined due to email privacy*'.
+            lv_error = 'Push declined due to email privacy'.
+          ELSEIF lv_commnd_text CP '*funny refname*'.
+            lv_error = 'Funny refname'.
+          ELSEIF lv_commnd_text CP '*failed to update ref*'.
+            lv_error = 'Failed to update ref'.
+          ELSEIF lv_commnd_text CP '*missing necessary objects*'.
+            lv_error = 'Missing necessary objects'.
+          ELSEIF lv_commnd_text CP '*refusing to delete the current branch*'.
+            lv_error = 'Branch delete not allowed'.
+          ELSEIF lv_commnd_text CP '*cannot lock ref*reference already exists*'.
+            lv_error = 'Branch already exists'.
+          ELSEIF lv_commnd_text CP '*cannot lock ref*but expected*'.
+            lv_error = 'Branch cannot be locked'.
+          ELSEIF lv_commnd_text CP '*invalid committer*'.
+            lv_error = 'Invalid committer'.
+          ELSE.
+            " Otherwise return full error message
+            lv_error = lv_commnd_text.
+          ENDIF.
+        ELSEIF strlen( lv_string ) < 4.
+          lv_error = 'Missing flush-pkt'.
+        ELSEIF lv_string <> '0000' AND lv_string <> '00000000'.
+          " We update only one reference at a time so this should be the end
+          lv_error = 'Unexpected end of status (flush-pkt)'.
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+    IF lv_error IS NOT INITIAL.
+      zcx_abapgit_exception=>raise( |Git protocol error: { lv_error }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_branch.
+ 
+    branch_list(
+      EXPORTING
+        iv_url          = iv_url
+        iv_service      = iv_service
+      IMPORTING
+        eo_client       = eo_client
+        eo_branch_list  = eo_branch_list ).
+ 
+    IF ev_branch IS SUPPLIED.
+      ev_branch = eo_branch_list->find_by_name( iv_branch_name )-sha1.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    CONSTANTS: lc_band1 TYPE x VALUE '01'.
+ 
+    DATA: lv_len      TYPE i,
+          lv_contents TYPE xstring,
+          lv_pack     TYPE xstring.
+ 
+ 
+    WHILE xstrlen( cv_data ) >= 4.
+      lv_len = zcl_abapgit_git_utils=>length_utf8_hex( cv_data ).
+ 
+      IF lv_len > xstrlen( cv_data ).
+        zcx_abapgit_exception=>raise( 'parse, string length too large' ).
+      ENDIF.
+ 
+      lv_contents = cv_data(lv_len).
+      IF lv_len = 0.
+        cv_data = cv_data+4.
+        CONTINUE.
+      ELSE.
+        cv_data = cv_data+lv_len.
+      ENDIF.
+ 
+      lv_contents = lv_contents+4.
+ 
+      IF xstrlen( lv_contents ) > 1 AND lv_contents(1) = lc_band1.
+        CONCATENATE lv_pack lv_contents+1 INTO lv_pack IN BYTE MODE.
+      ENDIF.
+ 
+    ENDWHILE.
+ 
+    ev_pack = lv_pack.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD receive_pack.
+ 
+    DATA: lo_client   TYPE REF TO zcl_abapgit_http_client,
+          lv_cmd_pkt  TYPE string,
+          lv_line     TYPE string,
+          lv_tmp      TYPE xstring,
+          lv_xstring  TYPE xstring,
+          lv_string   TYPE string,
+          lv_cap_list TYPE string,
+          lv_buffer   TYPE string.
+ 
+ 
+    find_branch(
+      EXPORTING
+        iv_url         = iv_url
+        iv_service     = c_service-receive
+        iv_branch_name = iv_branch_name
+      IMPORTING
+        eo_client      = lo_client ).
+ 
+    lo_client->set_headers(
+      iv_url     = iv_url
+      iv_service = c_service-receive ).
+ 
+    lv_cap_list = 'report-status'.
+ 
+    lv_line = iv_old &&
+              ` ` &&
+              iv_new &&
+              ` ` &&
+              iv_branch_name &&
+              zcl_abapgit_git_utils=>get_null( ) &&
+              ` ` &&
+              lv_cap_list &&
+              cl_abap_char_utilities=>newline.
+    lv_cmd_pkt = zcl_abapgit_git_utils=>pkt_string( lv_line ).
+ 
+    lv_buffer = lv_cmd_pkt && '0000'.
+    lv_tmp = zcl_abapgit_convert=>string_to_xstring_utf8( lv_buffer ).
+ 
+    CONCATENATE lv_tmp iv_pack INTO lv_xstring IN BYTE MODE.
+ 
+    lv_xstring = lo_client->send_receive_close( lv_xstring ).
+ 
+    lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xstring ).
+ 
+    check_report_status( lv_string ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD upload_pack.
+ 
+    DATA: lv_capa    TYPE string,
+          lv_line    TYPE string,
+          lv_buffer  TYPE string,
+          lv_xstring TYPE xstring,
+          lv_pack    TYPE xstring.
+ 
+    FIELD-SYMBOLS: <lv_hash> LIKE LINE OF it_hashes.
+ 
+ 
+    io_client->set_headers( iv_url     = iv_url
+                            iv_service = c_service-upload ).
+ 
+    LOOP AT it_hashes FROM 1 ASSIGNING <lv_hash>.
+      IF sy-tabix = 1.
+        lv_capa = 'side-band-64k no-progress multi_ack'.
+        lv_line = 'want' && ` ` && <lv_hash>
+          && ` ` && lv_capa && cl_abap_char_utilities=>newline.
+      ELSE.
+        lv_line = 'want' && ` ` && <lv_hash>
+          && cl_abap_char_utilities=>newline.
+      ENDIF.
+      lv_buffer = lv_buffer && zcl_abapgit_git_utils=>pkt_string( lv_line ).
+    ENDLOOP.
+ 
+    IF iv_deepen_level > 0.
+      lv_buffer = lv_buffer && zcl_abapgit_git_utils=>pkt_string( |deepen { iv_deepen_level }| &&
+        cl_abap_char_utilities=>newline ).
+    ENDIF.
+ 
+    lv_buffer = lv_buffer
+             && '0000'
+             && '0009done' && cl_abap_char_utilities=>newline.
+ 
+    lv_xstring = io_client->send_receive_close( zcl_abapgit_convert=>string_to_xstring_utf8( lv_buffer ) ).
+ 
+    parse( IMPORTING ev_pack = lv_pack
+           CHANGING  cv_data = lv_xstring ).
+ 
+    IF lv_pack IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Response could not be parsed - empty pack returned.' ).
+    ENDIF.
+ 
+    rt_objects = zcl_abapgit_git_pack=>decode( lv_pack ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD upload_pack_by_branch.
+ 
+    DATA: lo_client TYPE REF TO zcl_abapgit_http_client,
+          lt_hashes TYPE zif_abapgit_git_definitions=>ty_sha1_tt.
+ 
+    FIELD-SYMBOLS: <ls_branch> LIKE LINE OF it_branches.
+ 
+ 
+    CLEAR: et_objects,
+           ev_branch.
+ 
+    find_branch(
+      EXPORTING
+        iv_url         = iv_url
+        iv_service     = c_service-upload
+        iv_branch_name = iv_branch_name
+      IMPORTING
+        eo_client      = lo_client
+        ev_branch      = ev_branch ).
+ 
+    IF it_branches IS INITIAL.
+      APPEND ev_branch TO lt_hashes.
+    ELSE.
+      LOOP AT it_branches ASSIGNING <ls_branch>.
+        APPEND <ls_branch>-sha1 TO lt_hashes.
+      ENDLOOP.
+    ENDIF.
+ 
+    et_objects = upload_pack( io_client       = lo_client
+                              iv_url          = iv_url
+                              iv_deepen_level = iv_deepen_level
+                              it_hashes       = lt_hashes ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD upload_pack_by_commit.
+ 
+    DATA: lo_client TYPE REF TO zcl_abapgit_http_client,
+          lt_hashes TYPE zif_abapgit_git_definitions=>ty_sha1_tt.
+ 
+ 
+    CLEAR: et_objects,
+           ev_commit.
+ 
+    APPEND iv_hash TO lt_hashes.
+    ev_commit = iv_hash.
+ 
+    lo_client = zcl_abapgit_http=>create_by_url(
+      iv_url     = iv_url
+      iv_service = c_service-upload ).
+ 
+    et_objects = upload_pack( io_client       = lo_client
+                              iv_url          = iv_url
+                              iv_deepen_level = iv_deepen_level
+                              it_hashes       = lt_hashes ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_transport.clas.testclasses.abap.html b/src/git/zcl_abapgit_git_transport.clas.testclasses.abap.html new file mode 100644 index 00000000000..23eaf9ace0c --- /dev/null +++ b/src/git/zcl_abapgit_git_transport.clas.testclasses.abap.html @@ -0,0 +1,625 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_transport.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_transport.clas.testclasses.abap

+
+ +
+ 100% + Statements + 180/180 +
+ + +
+ 100% + Branches + 6/6 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 180/180 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +1811x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_git_transport DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_transport DEFINITION LOCAL FRIENDS ltcl_git_transport.
+ 
+CLASS ltcl_git_transport DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      all_ok FOR TESTING RAISING cx_static_check,
+      unpack_error FOR TESTING RAISING cx_static_check,
+      command_error FOR TESTING RAISING cx_static_check,
+      flush_error FOR TESTING RAISING cx_static_check,
+      parse FOR TESTING RAISING cx_static_check,
+      gitlab_flush_all_ok FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_git_transport IMPLEMENTATION.
+ 
+  METHOD parse.
+ 
+    DATA lv_data TYPE xstring.
+    DATA lv_pack TYPE xstring.
+ 
+    lv_data = '303033347368616C6C6F77206639656332336436'
+      && '6439333561613764633236656531343163376234'
+      && '3666656564396434363835653030303030303038'
+      && '4E414B0A30323564015041434B00000002000000'
+      && '059E0C789C958BC109C3300C00FF9EC2FF428965'
+      && '59B2A194AE22273209244D70D4FD1BE804BDCFC1'
+      && 'C15957F543454488A47168A9317023168446B932'
+      && 'C53171014E44EA0EE9FA361F529BA4D594558443'
+      && '4C5827E0C20C5090545498931664271F9BF7EE57'
+      && 'E9E77CF8C7CFAF79B74D96F53EEEDBD307CC9902'
+      && '9610FC6DB87057DD1633FD7373A6A77D0161323D'
+      && '31A307789C33343030333151D04B4C4A2C48CF2C'
+      && 'D1ABC8CD61A85FBB4172EFBBF6E6BC39974DD41E'
+      && 'BFEE08889FB0DA10A22EC8D5D1C5D7552F378561'
+      && 'F3E315727BDDAF7059C5DEE7EFF415E369E4D2EF'
+      && '842A4ACBCF4F4A2CD22BA928617877E244D7E46F'
+      && 'EF44457F377B7C3AA874FE9633D35900D7032E45'
+      && 'B31E789C6D91D16A83301486EF7D8AE0FD92ED6E'
+      && '484C093515C1EA5007BB93D45A974D8D9854DDB3'
+      && 'ED628FB45798D5C26CF1EEFCFFF7710827BFDF3F'
+      && '78335425E8F2560959DBE6137C34415E67F228EA'
+      && 'C236CFFAF4F06C6E8881B91A2C7EE00D18F55A59'
+      && '63B4CD77AD1B0BA1BEEFA1E20DCC64852ECA6898'
+      && 'B71B8901A6051D2FCFB91A13C00E4DE86500784F'
+      && 'E38445A94F03F795BA8C308CEEABC98B131A255E'
+      && 'E0A6BBD07758441046F7D5E4CD73EA87AEB7252F'
+      && '11DB796F18DD9493E6B94118CDAB01163AAF0882'
+      && '85D0A2A8659B6334354BE87B5B16C46C85448C3A'
+      && '7B06ABE30A6B78F6C98B1C7E2859AF60A85BDE09'
+      && '05BFAA72859EA43CF016EA412F2046FF2FC7E87A'
+      && '468C96E79DD3E52B88F10759BF90313D789C5356'
+      && '70CD2D28A9E42A492D2EE102001BCB042734789C'
+      && 'CBCDCFE7020003ED0156C43280EA381436A38EE5'
+      && 'E78491FF99CEAAC43A30303036017530303030'.
+ 
+    zcl_abapgit_git_transport=>parse(
+      IMPORTING
+        ev_pack = lv_pack
+      CHANGING
+        cv_data = lv_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = xstrlen( lv_data )
+      exp = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = xstrlen( lv_pack )
+      exp = 601 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD all_ok.
+ 
+    DATA lv_status TYPE string.
+ 
+    lv_status = `000eunpack ok` &&
+      cl_abap_char_utilities=>newline &&
+      `0017ok refs/heads/main` &&
+      cl_abap_char_utilities=>newline &&
+      `00000000`.
+    TRY.
+        zcl_abapgit_git_transport=>check_report_status( lv_status ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD unpack_error.
+ 
+    DATA lv_status TYPE string.
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+ 
+    lv_status = `0012unpack failed` &&
+      cl_abap_char_utilities=>newline &&
+      `00000000`.
+ 
+    TRY.
+        zcl_abapgit_git_transport=>check_report_status( lv_status ).
+ 
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        cl_abap_unit_assert=>assert_equals(
+          act = lx_error->get_text( )
+          exp = 'Git protocol error: Unpack not ok (failed)' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD command_error.
+ 
+    DATA lv_status TYPE string.
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+ 
+    lv_status = `000eunpack ok` &&
+      cl_abap_char_utilities=>newline &&
+      `009fng refs/heads/main cannot lock ref 'refs/heads/main':` &&
+      ` is at 625990aec9a9ebacbb99021804ce07bb6c350d05 but expected 77d2cfba9595de4c247d26b12cd40ce6cb75d61e` &&
+      cl_abap_char_utilities=>newline &&
+      `00000000`.
+ 
+    TRY.
+        zcl_abapgit_git_transport=>check_report_status( lv_status ).
+ 
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        cl_abap_unit_assert=>assert_equals(
+          act = lx_error->get_text( )
+          exp = 'Git protocol error: Branch cannot be locked' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD flush_error.
+ 
+    DATA lv_status TYPE string.
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+ 
+    lv_status = `000eunpack ok` &&
+      cl_abap_char_utilities=>newline &&
+      `0017ok refs/heads/main` &&
+      cl_abap_char_utilities=>newline &&
+      '0020ok refs/heads/main'. " example for more data instead of flush
+ 
+    TRY.
+        zcl_abapgit_git_transport=>check_report_status( lv_status ).
+ 
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        cl_abap_unit_assert=>assert_equals(
+          act = lx_error->get_text( )
+          exp = 'Git protocol error: Unexpected end of status (flush-pkt)' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD gitlab_flush_all_ok.
+ 
+    " GitLab and Bitbucket use 0000 opposed to GitHub which uses 00000000
+ 
+    DATA lv_status TYPE string.
+ 
+    lv_status = `000eunpack ok` &&
+      cl_abap_char_utilities=>newline &&
+      `0019ok refs/heads/master` &&
+      cl_abap_char_utilities=>newline &&
+      `0000`.
+ 
+    TRY.
+        zcl_abapgit_git_transport=>check_report_status( lv_status ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_utils.clas.abap.html b/src/git/zcl_abapgit_git_utils.clas.abap.html new file mode 100644 index 00000000000..eb9da9acfea --- /dev/null +++ b/src/git/zcl_abapgit_git_utils.clas.abap.html @@ -0,0 +1,349 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_utils.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_utils.clas.abap

+
+ +
+ 96.59% + Statements + 85/88 +
+ + +
+ 33.33% + Branches + 1/3 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 96.59% + Lines + 85/88 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +891x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_git_utils DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      ty_null TYPE c LENGTH 1 .
+ 
+    CLASS-METHODS get_null
+      RETURNING
+        VALUE(rv_c) TYPE ty_null .
+    CLASS-METHODS pkt_string
+      IMPORTING
+        !iv_string    TYPE string
+      RETURNING
+        VALUE(rv_pkt) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS length_utf8_hex
+      IMPORTING
+        !iv_data      TYPE xstring
+      RETURNING
+        VALUE(rv_len) TYPE i
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_utils IMPLEMENTATION.
+ 
+ 
+  METHOD get_null.
+ 
+* must be length 4, or it gives a syntax error on lower versions
+    DATA: lv_x TYPE x LENGTH 4 VALUE '00000000'.
+    FIELD-SYMBOLS <lv_y> TYPE c.
+ 
+    ASSIGN lv_x TO <lv_y> CASTING.
+    rv_c = <lv_y>.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD length_utf8_hex.
+ 
+    DATA: lv_xstring TYPE xstring,
+          lv_char4   TYPE c LENGTH 4,
+          lv_x       TYPE x LENGTH 2.
+ 
+    IF xstrlen( iv_data ) < 4.
+      zcx_abapgit_exception=>raise( 'error converting to hex, LENGTH_UTF8_HEX' ).
+    ENDIF.
+ 
+    lv_xstring = iv_data(4).
+ 
+    lv_char4 = zcl_abapgit_convert=>xstring_to_string_utf8(
+      iv_data   = lv_xstring
+      iv_length = 4 ).
+ 
+    TRANSLATE lv_char4 TO UPPER CASE.
+    lv_x = lv_char4.
+    rv_len = lv_x.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pkt_string.
+ 
+    DATA: lv_x   TYPE x,
+          lv_len TYPE i.
+ 
+ 
+    lv_len = strlen( iv_string ).
+ 
+    IF lv_len >= 255.
+      zcx_abapgit_exception=>raise( 'PKT, todo' ).
+    ENDIF.
+ 
+    lv_x = lv_len + 4.
+ 
+    rv_pkt = '00' && lv_x && iv_string.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_git_utils.clas.testclasses.abap.html b/src/git/zcl_abapgit_git_utils.clas.testclasses.abap.html new file mode 100644 index 00000000000..a9e2e35682e --- /dev/null +++ b/src/git/zcl_abapgit_git_utils.clas.testclasses.abap.html @@ -0,0 +1,310 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_git_utils.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_git_utils.clas.testclasses.abap

+
+ +
+ 100% + Statements + 75/75 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 75/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +761x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_git_utils DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_cut TYPE REF TO zcl_abapgit_git_utils.
+ 
+    METHODS:
+      setup,
+      get_null FOR TESTING,
+      pkt_string FOR TESTING RAISING zcx_abapgit_exception,
+      length_utf8_hex FOR TESTING RAISING zcx_abapgit_exception.
+ENDCLASS.
+ 
+CLASS ltcl_git_utils IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_cut.
+  ENDMETHOD.
+ 
+  METHOD get_null.
+ 
+    CONSTANTS lc_null TYPE x LENGTH 2 VALUE '0000'.
+ 
+    DATA lv_c TYPE c LENGTH 1.
+ 
+    FIELD-SYMBOLS <lv_x> TYPE x.
+ 
+    lv_c = mo_cut->get_null( ).
+ 
+    ASSIGN lv_c TO <lv_x> CASTING.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = <lv_x>
+      exp = lc_null ).
+ 
+  ENDMETHOD.
+ 
+  METHOD pkt_string.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_cut->pkt_string( 'test' )
+      exp = '0008test' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD length_utf8_hex.
+ 
+    DATA lv_result TYPE i.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_cut->length_utf8_hex( '30303030' )
+      exp = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_cut->length_utf8_hex( '30303334' )
+      exp = 52 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_cut->length_utf8_hex( '303061354D617263' )
+      exp = 165 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_cut->length_utf8_hex( '66666666' )
+      exp = 65535 ).
+ 
+    " too short
+    TRY.
+        lv_result = mo_cut->length_utf8_hex( '00' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_hash.clas.abap.html b/src/git/zcl_abapgit_hash.clas.abap.html new file mode 100644 index 00000000000..d2c99ae08bb --- /dev/null +++ b/src/git/zcl_abapgit_hash.clas.abap.html @@ -0,0 +1,709 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_hash.clas.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_hash.clas.abap

+
+ +
+ 98.55% + Statements + 205/208 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.55% + Lines + 205/208 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +2091x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_hash DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS adler32
+      IMPORTING
+        !iv_xstring        TYPE xstring
+      RETURNING
+        VALUE(rv_checksum) TYPE zif_abapgit_git_definitions=>ty_adler32 .
+    CLASS-METHODS sha1
+      IMPORTING
+        !iv_type       TYPE zif_abapgit_git_definitions=>ty_type
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_commit
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_tree
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_tag
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_blob
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_raw
+      IMPORTING
+        !iv_data       TYPE xstring
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS sha1_string
+      IMPORTING
+        !iv_data       TYPE string
+      RETURNING
+        VALUE(rv_sha1) TYPE zif_abapgit_git_definitions=>ty_sha1
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_hash IMPLEMENTATION.
+ 
+ 
+  METHOD adler32.
+ 
+    CONSTANTS: lc_adler TYPE i VALUE 65521,
+               lc_max_b TYPE i VALUE 1800000000.
+ 
+    DATA: lv_index TYPE i,
+          lv_a     TYPE i VALUE 1,
+          lv_b     TYPE i VALUE 0,
+          lv_x     TYPE x LENGTH 2,
+          lv_ca    TYPE c LENGTH 4,
+          lv_cb    TYPE c LENGTH 4,
+          lv_char8 TYPE c LENGTH 8.
+ 
+ 
+    DO xstrlen( iv_xstring ) TIMES.
+      lv_index = sy-index - 1.
+ 
+      lv_a = lv_a + iv_xstring+lv_index(1).
+      lv_b = lv_b + lv_a.
+ 
+* delay the MOD operation until the integer might overflow
+* articles describe 5552 additions are allowed, but this assumes unsigned integers
+* instead of allowing a fixed number of additions before running MOD, then
+* just compare value of lv_b, this is 1 operation less than comparing and adding
+      IF lv_b > lc_max_b.
+        lv_a = lv_a MOD lc_adler.
+        lv_b = lv_b MOD lc_adler.
+      ENDIF.
+    ENDDO.
+ 
+    lv_a = lv_a MOD lc_adler.
+    lv_b = lv_b MOD lc_adler.
+ 
+    lv_x = lv_a.
+    lv_ca = lv_x.
+ 
+    lv_x = lv_b.
+    lv_cb = lv_x.
+ 
+    CONCATENATE lv_cb lv_ca INTO lv_char8.
+ 
+    rv_checksum = lv_char8.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1.
+ 
+    DATA: lv_len     TYPE i,
+          lv_char10  TYPE c LENGTH 10,
+          lv_string  TYPE string,
+          lv_xstring TYPE xstring.
+ 
+ 
+    lv_len = xstrlen( iv_data ).
+    lv_char10 = lv_len.
+    CONDENSE lv_char10.
+    CONCATENATE iv_type lv_char10 INTO lv_string SEPARATED BY space.
+    lv_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ).
+ 
+    lv_string = lv_xstring.
+    CONCATENATE lv_string '00' INTO lv_string.
+    lv_xstring = lv_string.
+ 
+    CONCATENATE lv_xstring iv_data INTO lv_xstring IN BYTE MODE.
+ 
+    rv_sha1 = sha1_raw( lv_xstring ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_blob.
+    rv_sha1 = sha1( iv_type = zif_abapgit_git_definitions=>c_type-blob
+                    iv_data = iv_data ).
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_commit.
+    rv_sha1 = sha1( iv_type = zif_abapgit_git_definitions=>c_type-commit
+                    iv_data = iv_data ).
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_raw.
+ 
+    DATA: lv_hash  TYPE string,
+          lv_key   TYPE xstring,
+          lx_error TYPE REF TO cx_abap_message_digest.
+    TRY.
+        cl_abap_hmac=>calculate_hmac_for_raw(
+      EXPORTING
+        if_key        = lv_key
+        if_data       = iv_data
+      IMPORTING
+        ef_hmacstring = lv_hash ).
+      CATCH cx_abap_message_digest INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+    rv_sha1 = lv_hash.
+    TRANSLATE rv_sha1 TO LOWER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_string.
+ 
+    DATA: lv_hash  TYPE string,
+          lv_key   TYPE xstring,
+          lx_error TYPE REF TO cx_abap_message_digest.
+    TRY.
+        cl_abap_hmac=>calculate_hmac_for_char(
+      EXPORTING
+        if_key        = lv_key
+        if_data       = iv_data
+      IMPORTING
+        ef_hmacstring = lv_hash ).
+      CATCH cx_abap_message_digest INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+    rv_sha1 = lv_hash.
+    TRANSLATE rv_sha1 TO LOWER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_tag.
+    rv_sha1 = sha1( iv_type = zif_abapgit_git_definitions=>c_type-tag
+                    iv_data = iv_data ).
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_tree.
+    rv_sha1 = sha1( iv_type = zif_abapgit_git_definitions=>c_type-tree
+                    iv_data = iv_data ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zcl_abapgit_hash.clas.testclasses.abap.html b/src/git/zcl_abapgit_hash.clas.testclasses.abap.html new file mode 100644 index 00000000000..ca92277409a --- /dev/null +++ b/src/git/zcl_abapgit_hash.clas.testclasses.abap.html @@ -0,0 +1,307 @@ + + + + + + Code coverage report for src/git/zcl_abapgit_hash.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git zcl_abapgit_hash.clas.testclasses.abap

+
+ +
+ 100% + Statements + 74/74 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 74/74 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +751x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
 
+CLASS ltcl_test DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      adler32 FOR TESTING,
+      sha1 FOR TESTING RAISING zcx_abapgit_exception,
+      sha1_raw_valid FOR TESTING RAISING zcx_abapgit_exception,
+      sha1_raw_empty FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD adler32.
+ 
+    DATA: lv_adler TYPE zif_abapgit_git_definitions=>ty_adler32.
+ 
+    lv_adler = zcl_abapgit_hash=>adler32( '1122334455667788' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_adler
+      exp = '08000265' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD sha1.
+ 
+    DATA: lv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1.
+ 
+    lv_sha1 = zcl_abapgit_hash=>sha1(
+      iv_type = zif_abapgit_git_definitions=>c_type-commit
+      iv_data = '112211221122' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_sha1
+      exp = 'af2261a340c5188baf86a64a581d22012303023c' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sha1_raw_valid.
+ 
+    DATA: lv_sha1  TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_input TYPE xstring.
+ 
+    lv_input = 'C5188BAF86A64A581D2201'.
+    lv_sha1 = zcl_abapgit_hash=>sha1_raw( lv_input ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_sha1
+      exp = '0ec2eba75071f87988ced3237cae5ec7c5efd795' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD sha1_raw_empty.
+ 
+    DATA: lv_sha1  TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_input TYPE xstring.
+ 
+* a value like 'LOREM_IPSUM' will get an empty xstring,
+    lv_input = ''.
+    lv_sha1 = zcl_abapgit_hash=>sha1_raw( lv_input ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_sha1
+      exp = 'da39a3ee5e6b4b0d3255bfef95601890afd80709' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/index.html b/src/git/zlib/index.html new file mode 100644 index 00000000000..59842cd1380 --- /dev/null +++ b/src/git/zlib/index.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for src/git/zlib + + + + + + + + + +
+
+

All files src/git/zlib

+
+ +
+ 99.82% + Statements + 1152/1154 +
+ + +
+ 96.96% + Branches + 32/33 +
+ + +
+ 100% + Functions + 13/13 +
+ + +
+ 99.82% + Lines + 1152/1154 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_zlib.clas.abap +
+
99.57%471/47392.3%12/13100%0/099.57%471/473
zcl_abapgit_zlib.clas.testclasses.abap +
+
100%226/226100%5/5100%5/5100%226/226
zcl_abapgit_zlib_convert.clas.abap +
+
100%80/80100%0/0100%0/0100%80/80
zcl_abapgit_zlib_convert.clas.testclasses.abap +
+
100%61/61100%4/4100%4/4100%61/61
zcl_abapgit_zlib_huffman.clas.abap +
+
100%102/102100%4/4100%0/0100%102/102
zcl_abapgit_zlib_huffman.clas.testclasses.abap +
+
100%53/53100%2/2100%2/2100%53/53
zcl_abapgit_zlib_stream.clas.abap +
+
100%106/106100%4/4100%1/1100%106/106
zcl_abapgit_zlib_stream.clas.testclasses.abap +
+
100%53/53100%1/1100%1/1100%53/53
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/zcl_abapgit_zlib.clas.abap.html b/src/git/zlib/zcl_abapgit_zlib.clas.abap.html new file mode 100644 index 00000000000..2e8768d950d --- /dev/null +++ b/src/git/zlib/zcl_abapgit_zlib.clas.abap.html @@ -0,0 +1,1504 @@ + + + + + + Code coverage report for src/git/zlib/zcl_abapgit_zlib.clas.abap + + + + + + + + + +
+
+

All files / src/git/zlib zcl_abapgit_zlib.clas.abap

+
+ +
+ 99.57% + Statements + 471/473 +
+ + +
+ 92.3% + Branches + 12/13 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 99.57% + Lines + 471/473 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +4741x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1399x +1399x +1399x +5430x +5430x +5430x +5430x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +796x +796x +1x +4x +4x +212x +212x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +156x +156x +19x +19x +1x +1x +1x +19x +8x +8x +10x +10x +19x +19x +19x +19x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_zlib DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_decompress,
+        raw            TYPE xstring,
+        compressed_len TYPE i,
+      END OF ty_decompress .
+ 
+    CLASS-METHODS decompress
+      IMPORTING
+        !iv_compressed TYPE xsequence
+      RETURNING
+        VALUE(rs_data) TYPE ty_decompress .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS: c_maxdcodes TYPE i VALUE 30.
+ 
+    CLASS-DATA: gv_out      TYPE xstring,
+                go_lencode  TYPE REF TO zcl_abapgit_zlib_huffman,
+                go_distcode TYPE REF TO zcl_abapgit_zlib_huffman,
+                go_stream   TYPE REF TO zcl_abapgit_zlib_stream.
+ 
+    TYPES: BEGIN OF ty_pair,
+             length   TYPE i,
+             distance TYPE i,
+           END OF ty_pair.
+ 
+    CLASS-METHODS:
+      decode
+        IMPORTING io_huffman       TYPE REF TO zcl_abapgit_zlib_huffman
+        RETURNING VALUE(rv_symbol) TYPE i,
+      map_length
+        IMPORTING iv_code          TYPE i
+        RETURNING VALUE(rv_length) TYPE i,
+      map_distance
+        IMPORTING iv_code            TYPE i
+        RETURNING VALUE(rv_distance) TYPE i,
+      dynamic,
+      fixed,
+      not_compressed,
+      decode_loop,
+      read_pair
+        IMPORTING iv_length      TYPE i
+        RETURNING VALUE(rs_pair) TYPE ty_pair,
+      copy_out
+        IMPORTING is_pair TYPE ty_pair.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZLIB IMPLEMENTATION.
+ 
+ 
+  METHOD copy_out.
+ 
+* copy one byte at a time, it is not possible to copy using
+* string offsets, as it might copy data that does not exist
+* in mv_out yet
+ 
+    DATA: lv_distance TYPE i,
+          lv_index    TYPE i,
+          lv_x        TYPE x LENGTH 1.
+ 
+ 
+    lv_distance = xstrlen( gv_out ) - is_pair-distance.
+    DO is_pair-length TIMES.
+      lv_index = sy-index - 1 + lv_distance.
+      lv_x = gv_out+lv_index(1).
+      CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode.
+ 
+    DATA: lv_bit   TYPE c LENGTH 1,
+          lv_len   TYPE i,
+          lv_count TYPE i,
+          lv_code  TYPE i,
+          lv_index TYPE i,
+          lv_first TYPE i,
+          lv_bits  TYPE string.
+ 
+ 
+    DO zcl_abapgit_zlib_huffman=>c_maxbits TIMES.
+      lv_len = sy-index.
+ 
+      lv_bit = go_stream->take_bits( 1 ).
+      CONCATENATE lv_bits lv_bit INTO lv_bits.
+      lv_code = zcl_abapgit_zlib_convert=>bits_to_int( lv_bits ).
+      lv_count = io_huffman->get_count( lv_len ).
+ 
+      IF lv_code - lv_count < lv_first.
+        rv_symbol = io_huffman->get_symbol( lv_index + lv_code - lv_first + 1 ).
+        RETURN.
+      ENDIF.
+      lv_index = lv_index + lv_count.
+      lv_first = lv_first + lv_count.
+      lv_first = lv_first * 2.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decode_loop.
+ 
+    DATA lv_x TYPE x.
+    DATA lv_symbol TYPE i.
+ 
+    DO.
+      lv_symbol = decode( go_lencode ).
+ 
+      IF lv_symbol < 256.
+        lv_x = zcl_abapgit_zlib_convert=>int_to_hex( lv_symbol ).
+        CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE.
+      ELSEIF lv_symbol = 256.
+        EXIT.
+      ELSE.
+        copy_out( read_pair( lv_symbol ) ).
+      ENDIF.
+ 
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decompress.
+ 
+    DATA: lv_bfinal TYPE c LENGTH 1,
+          lv_btype  TYPE c LENGTH 2.
+ 
+ 
+    IF iv_compressed IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    CLEAR gv_out.
+    CREATE OBJECT go_stream
+      EXPORTING
+        iv_data = iv_compressed.
+ 
+    DO.
+      lv_bfinal = go_stream->take_bits( 1 ).
+ 
+      lv_btype = go_stream->take_bits( 2 ).
+      CASE lv_btype.
+        WHEN '00'.
+          not_compressed( ).
+        WHEN '01'.
+          fixed( ).
+          decode_loop( ).
+        WHEN '10'.
+          dynamic( ).
+          decode_loop( ).
+        WHEN OTHERS.
+          ASSERT 1 = 0.
+      ENDCASE.
+ 
+      IF lv_bfinal = '1'.
+        EXIT.
+      ENDIF.
+ 
+    ENDDO.
+ 
+    rs_data-raw = gv_out.
+    rs_data-compressed_len = xstrlen( iv_compressed ) - go_stream->remaining( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dynamic.
+ 
+    DATA: lv_nlen    TYPE i,
+          lv_ndist   TYPE i,
+          lv_ncode   TYPE i,
+          lv_index   TYPE i,
+          lv_length  TYPE i,
+          lv_symbol  TYPE i,
+          lt_order   TYPE TABLE OF i,
+          lt_lengths TYPE zcl_abapgit_zlib_huffman=>ty_lengths,
+          lt_dists   TYPE zcl_abapgit_zlib_huffman=>ty_lengths.
+ 
+    FIELD-SYMBOLS: <lv_length> LIKE LINE OF lt_lengths.
+ 
+ 
+    APPEND 16 TO lt_order.
+    APPEND 17 TO lt_order.
+    APPEND 18 TO lt_order.
+    APPEND 0 TO lt_order.
+    APPEND 8 TO lt_order.
+    APPEND 7 TO lt_order.
+    APPEND 9 TO lt_order.
+    APPEND 6 TO lt_order.
+    APPEND 10 TO lt_order.
+    APPEND 5 TO lt_order.
+    APPEND 11 TO lt_order.
+    APPEND 4 TO lt_order.
+    APPEND 12 TO lt_order.
+    APPEND 3 TO lt_order.
+    APPEND 13 TO lt_order.
+    APPEND 2 TO lt_order.
+    APPEND 14 TO lt_order.
+    APPEND 1 TO lt_order.
+    APPEND 15 TO lt_order.
+ 
+    lv_nlen = go_stream->take_int( 5 ) + 257.
+    lv_ndist = go_stream->take_int( 5 ) + 1.
+    lv_ncode = go_stream->take_int( 4 ) + 4.
+ 
+    DO 19 TIMES.
+      APPEND 0 TO lt_lengths.
+    ENDDO.
+ 
+    DO lv_ncode TIMES.
+      READ TABLE lt_order INDEX sy-index INTO lv_index.
+      ASSERT sy-subrc = 0.
+      lv_index = lv_index + 1.
+      READ TABLE lt_lengths INDEX lv_index ASSIGNING <lv_length>.
+      ASSERT sy-subrc = 0.
+      <lv_length> = go_stream->take_int( 3 ).
+    ENDDO.
+ 
+    CREATE OBJECT go_lencode
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+    CLEAR lt_lengths.
+    WHILE lines( lt_lengths ) < lv_nlen + lv_ndist.
+      lv_symbol = decode( go_lencode ).
+ 
+      IF lv_symbol < 16.
+        APPEND lv_symbol TO lt_lengths.
+      ELSE.
+        lv_length = 0.
+        IF lv_symbol = 16.
+          READ TABLE lt_lengths INDEX lines( lt_lengths ) INTO lv_length.
+          ASSERT sy-subrc = 0.
+          lv_symbol = go_stream->take_int( 2 ) + 3.
+        ELSEIF lv_symbol = 17.
+          lv_symbol = go_stream->take_int( 3 ) + 3.
+        ELSE.
+          lv_symbol = go_stream->take_int( 7 ) + 11.
+        ENDIF.
+        DO lv_symbol TIMES.
+          APPEND lv_length TO lt_lengths.
+        ENDDO.
+      ENDIF.
+    ENDWHILE.
+ 
+    lt_dists = lt_lengths.
+    DELETE lt_lengths FROM lv_nlen + 1.
+    DELETE lt_dists TO lv_nlen.
+ 
+    CREATE OBJECT go_lencode
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+    CREATE OBJECT go_distcode
+      EXPORTING
+        it_lengths = lt_dists.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD fixed.
+ 
+    DATA: lt_lengths TYPE zcl_abapgit_zlib_huffman=>ty_lengths.
+ 
+ 
+    DO 144 TIMES.
+      APPEND 8 TO lt_lengths.
+    ENDDO.
+    DO 112 TIMES.
+      APPEND 9 TO lt_lengths.
+    ENDDO.
+    DO 24 TIMES.
+      APPEND 7 TO lt_lengths.
+    ENDDO.
+    DO 8 TIMES.
+      APPEND 8 TO lt_lengths.
+    ENDDO.
+ 
+    CREATE OBJECT go_lencode
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+    CLEAR lt_lengths.
+    DO c_maxdcodes TIMES.
+      APPEND 5 TO lt_lengths.
+    ENDDO.
+ 
+    CREATE OBJECT go_distcode
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_distance.
+ 
+    CASE iv_code.
+      WHEN 0.
+        rv_distance = go_stream->take_int( 0 ) + 1.
+      WHEN 1.
+        rv_distance = go_stream->take_int( 0 ) + 2.
+      WHEN 2.
+        rv_distance = go_stream->take_int( 0 ) + 3.
+      WHEN 3.
+        rv_distance = go_stream->take_int( 0 ) + 4.
+      WHEN 4.
+        rv_distance = go_stream->take_int( 1 ) + 5.
+      WHEN 5.
+        rv_distance = go_stream->take_int( 1 ) + 7.
+      WHEN 6.
+        rv_distance = go_stream->take_int( 2 ) + 9.
+      WHEN 7.
+        rv_distance = go_stream->take_int( 2 ) + 13.
+      WHEN 8.
+        rv_distance = go_stream->take_int( 3 ) + 17.
+      WHEN 9.
+        rv_distance = go_stream->take_int( 3 ) + 25.
+      WHEN 10.
+        rv_distance = go_stream->take_int( 4 ) + 33.
+      WHEN 11.
+        rv_distance = go_stream->take_int( 4 ) + 49.
+      WHEN 12.
+        rv_distance = go_stream->take_int( 5 ) + 65.
+      WHEN 13.
+        rv_distance = go_stream->take_int( 5 ) + 97.
+      WHEN 14.
+        rv_distance = go_stream->take_int( 6 ) + 129.
+      WHEN 15.
+        rv_distance = go_stream->take_int( 6 ) + 193.
+      WHEN 16.
+        rv_distance = go_stream->take_int( 7 ) + 257.
+      WHEN 17.
+        rv_distance = go_stream->take_int( 7 ) + 385.
+      WHEN 18.
+        rv_distance = go_stream->take_int( 8 ) + 513.
+      WHEN 19.
+        rv_distance = go_stream->take_int( 8 ) + 769.
+      WHEN 20.
+        rv_distance = go_stream->take_int( 9 ) + 1025.
+      WHEN 21.
+        rv_distance = go_stream->take_int( 9 ) + 1537.
+      WHEN 22.
+        rv_distance = go_stream->take_int( 10 ) + 2049.
+      WHEN 23.
+        rv_distance = go_stream->take_int( 10 ) + 3073.
+      WHEN 24.
+        rv_distance = go_stream->take_int( 11 ) + 4097.
+      WHEN 25.
+        rv_distance = go_stream->take_int( 11 ) + 6145.
+      WHEN 26.
+        rv_distance = go_stream->take_int( 12 ) + 8193.
+      WHEN 27.
+        rv_distance = go_stream->take_int( 12 ) + 12289.
+      WHEN 28.
+        rv_distance = go_stream->take_int( 13 ) + 16385.
+      WHEN 29.
+        rv_distance = go_stream->take_int( 13 ) + 24577.
+      WHEN OTHERS.
+        ASSERT 1 = 0.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_length.
+ 
+    CASE iv_code.
+      WHEN 257.
+        rv_length = go_stream->take_int( 0 ) + 3.
+      WHEN 258.
+        rv_length = go_stream->take_int( 0 ) + 4.
+      WHEN 259.
+        rv_length = go_stream->take_int( 0 ) + 5.
+      WHEN 260.
+        rv_length = go_stream->take_int( 0 ) + 6.
+      WHEN 261.
+        rv_length = go_stream->take_int( 0 ) + 7.
+      WHEN 262.
+        rv_length = go_stream->take_int( 0 ) + 8.
+      WHEN 263.
+        rv_length = go_stream->take_int( 0 ) + 9.
+      WHEN 264.
+        rv_length = go_stream->take_int( 0 ) + 10.
+      WHEN 265.
+        rv_length = go_stream->take_int( 1 ) + 11.
+      WHEN 266.
+        rv_length = go_stream->take_int( 1 ) + 13.
+      WHEN 267.
+        rv_length = go_stream->take_int( 1 ) + 15.
+      WHEN 268.
+        rv_length = go_stream->take_int( 1 ) + 17.
+      WHEN 269.
+        rv_length = go_stream->take_int( 2 ) + 19.
+      WHEN 270.
+        rv_length = go_stream->take_int( 2 ) + 23.
+      WHEN 271.
+        rv_length = go_stream->take_int( 2 ) + 27.
+      WHEN 272.
+        rv_length = go_stream->take_int( 2 ) + 31.
+      WHEN 273.
+        rv_length = go_stream->take_int( 3 ) + 35.
+      WHEN 274.
+        rv_length = go_stream->take_int( 3 ) + 43.
+      WHEN 275.
+        rv_length = go_stream->take_int( 3 ) + 51.
+      WHEN 276.
+        rv_length = go_stream->take_int( 3 ) + 59.
+      WHEN 277.
+        rv_length = go_stream->take_int( 4 ) + 67.
+      WHEN 278.
+        rv_length = go_stream->take_int( 4 ) + 83.
+      WHEN 279.
+        rv_length = go_stream->take_int( 4 ) + 99.
+      WHEN 280.
+        rv_length = go_stream->take_int( 4 ) + 115.
+      WHEN 281.
+        rv_length = go_stream->take_int( 5 ) + 131.
+      WHEN 282.
+        rv_length = go_stream->take_int( 5 ) + 163.
+      WHEN 283.
+        rv_length = go_stream->take_int( 5 ) + 195.
+      WHEN 284.
+        rv_length = go_stream->take_int( 5 ) + 227.
+      WHEN 285.
+        rv_length = go_stream->take_int( 0 ) + 258.
+      WHEN OTHERS.
+        ASSERT 1 = 0.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD not_compressed.
+ 
+    DATA: lv_len  TYPE i,
+          lv_nlen TYPE i ##NEEDED.
+    DATA lv_bytes TYPE xstring.
+ 
+* skip any remaining bits in current partially processed byte
+    go_stream->clear_bits( ).
+ 
+    lv_len = go_stream->take_int( 16 ).
+    lv_nlen = go_stream->take_int( 16 ).
+ 
+    lv_bytes = go_stream->take_bytes( lv_len ).
+    CONCATENATE gv_out lv_bytes INTO gv_out IN BYTE MODE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_pair.
+ 
+    DATA: lv_symbol TYPE i.
+ 
+ 
+    rs_pair-length = map_length( iv_length ).
+ 
+    lv_symbol = decode( go_distcode ).
+    rs_pair-distance = map_distance( lv_symbol ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/zcl_abapgit_zlib.clas.testclasses.abap.html b/src/git/zlib/zcl_abapgit_zlib.clas.testclasses.abap.html new file mode 100644 index 00000000000..417cb974158 --- /dev/null +++ b/src/git/zlib/zcl_abapgit_zlib.clas.testclasses.abap.html @@ -0,0 +1,763 @@ + + + + + + Code coverage report for src/git/zlib/zcl_abapgit_zlib.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git/zlib zcl_abapgit_zlib.clas.testclasses.abap

+
+ +
+ 100% + Statements + 226/226 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 226/226 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +2271x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
 
+CLASS ltcl_zlib DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      fixed FOR TESTING RAISING cx_dynamic_check,
+      dynamic_simple FOR TESTING RAISING cx_dynamic_check zcx_abapgit_exception,
+      dynamic_another FOR TESTING RAISING cx_dynamic_check zcx_abapgit_exception,
+      dynamic FOR TESTING RAISING cx_dynamic_check zcx_abapgit_exception,
+      not_compressed FOR TESTING RAISING cx_dynamic_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_zlib IMPLEMENTATION.
+ 
+  METHOD fixed.
+ 
+    DATA: ls_data TYPE zcl_abapgit_zlib=>ty_decompress.
+ 
+    CONSTANTS:
+      lc_raw        TYPE xstring VALUE '48656C6C6F20576F726C64210D0A',
+      lc_compressed TYPE xstring VALUE 'F348CDC9C95708CF2FCA4951E4E5020024E90455'.
+ 
+ 
+    ls_data = zcl_abapgit_zlib=>decompress( lc_compressed ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( ls_data-raw ).
+    cl_abap_unit_assert=>assert_equals( act = ls_data-raw
+                                        exp = lc_raw ).
+ 
+  ENDMETHOD.
+ 
+  METHOD not_compressed.
+ 
+    DATA: ls_data TYPE zcl_abapgit_zlib=>ty_decompress.
+ 
+    CONSTANTS:
+      lc_raw        TYPE xstring VALUE '4142434445464748494A4B4C',
+      lc_compressed TYPE xstring VALUE '010C00F3FF4142434445464748494A4B4C'.
+ 
+ 
+    ls_data = zcl_abapgit_zlib=>decompress( lc_compressed ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( ls_data-raw ).
+    cl_abap_unit_assert=>assert_equals( act = ls_data-raw
+                                        exp = lc_raw ).
+ 
+  ENDMETHOD.
+ 
+  METHOD dynamic_simple.
+ 
+    DATA: ls_data       TYPE zcl_abapgit_zlib=>ty_decompress,
+          lv_compressed TYPE xstring,
+          lv_decoded    TYPE xstring.
+ 
+ 
+    lv_compressed = |05804109000008C4AA184EC1C7E0C08FF5C70EA43E470B1A0B045D|.
+ 
+    lv_decoded = zcl_abapgit_convert=>string_to_xstring_utf8( |hello world| ).
+ 
+    ls_data = zcl_abapgit_zlib=>decompress( lv_compressed ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( ls_data-raw ).
+    cl_abap_unit_assert=>assert_equals( act = ls_data-raw
+                                        exp = lv_decoded ).
+ 
+  ENDMETHOD.
+ 
+  METHOD dynamic_another.
+ 
+    DATA: ls_data       TYPE zcl_abapgit_zlib=>ty_decompress,
+          lv_compressed TYPE xstring,
+          lv_decoded    TYPE xstring.
+ 
+ 
+    lv_compressed = |25CCD10903310C04D156B680904AD284628963C1929D93D4FF| &&
+      |19F23DBCF9ACDB1CDCD90E5D73DD4816C4AD5E182BD24659F50D516EE6605CB0| &&
+      |C913D3F400183B7D29CA7C1FCC18546A47A10B53BE670FABFFDAE0728540267F| &&
+      |2DEF07|.
+ 
+    lv_decoded = zcl_abapgit_convert=>string_to_xstring_utf8(
+      |Lorem ipsum dolor sit amet, consectetur adipiscing elit, | &&
+      |sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.| ).
+ 
+    ls_data = zcl_abapgit_zlib=>decompress( lv_compressed ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( ls_data-raw ).
+    cl_abap_unit_assert=>assert_equals( act = ls_data-raw
+                                        exp = lv_decoded ).
+ 
+  ENDMETHOD.
+ 
+  METHOD dynamic.
+ 
+    DATA: ls_data       TYPE zcl_abapgit_zlib=>ty_decompress,
+          lv_compressed TYPE xstring,
+          lv_decoded    TYPE xstring.
+ 
+ 
+    lv_compressed = |75555D6FE246147DF7AFB8521F1610A0AA8F911A| &&
+      |C9C1A6B5969034711A352FCE605FF074CD8C3B33| &&
+      |86657FFD9E191302DBEC8B857DBFCFB9F7F00BED| &&
+      |2BD1EC8A52ABB5DC448FF13D3DF38A92836A8DA6| &&
+      |F806EFF1E26FEACD9D114E9B288A46A34C59279A| &&
+      |66348A46946D5B6D1CB99A49AFFEE5D2595A1BBD| &&
+      |25D56D36EC682D1BA64E556CA8118EADA38D7464| &&
+      |B8616161B0526D087517D9F23392C5A5933BB811| &&
+      |B29FA7846966D81B9E13126DDBC85238A9156A69| &&
+      |432F68B298DDDDDEE3B19C677FF81613DEEAD0DF| &&
+      |8771EF61497A7B87ECE9572E3BA4F7639CE53FB3| &&
+      |9C8370EE42831FCB0F7DB7B5501B26ABB77C848F| &&
+      |76A2E9D892501559B163383D70233A55D6FD00BE| &&
+      |938BC44E93E5BEA532A4B301FC27CB186C427155| &&
+      |013F812A7A1D32A010B850ACC086469DC3F9875A| &&
+      |3878A3BE2719ECA9CA37D2B3FB16358111483E27| &&
+      |451EDF2C52D408442B273DF27ECCB38C3EBC15D6| &&
+      |861CC73E02FFBE1D6DE4462AD104239A09B12B34| &&
+      |045E3DE35239366B51326DD9D51A88B02BFC2686| &&
+      |44538AA2D7D757B1126DD4E8A2DCB6FD77FA9D08| &&
+      |1B5BB85ADAC9357E942D462ABE217040C36994CD| &&
+      |E9DC7D725D0B5B08BF528C153F4E094FCA1E295B| &&
+      |6679162FA61152FE1055864DBB889846E932C9E6| &&
+      |D3284AE23CF6FEA709B017CEE8A6C182E7FFDCA7| &&
+      |F490CE29BFA36F725F4A3F124DFD0C1FB9FF7F1A| &&
+      |B92EDFA7F949D8E4FA02AB4118E0049D8708E54E| &&
+      |EFB00218801981CD396E05875D7580442BB2252B| &&
+      |61A4B657E0F98D88A77B4C9816C94D317FB8BB3D| &&
+      |1E94A7F404207E9D26BEF81E489E505973F985E4| &&
+      |3ADC52D919E317D21EACE32D494B07DD19AA78C7| &&
+      |8D6EB7EFA629E5609558D9CE604B9DDFD7177262| &&
+      |D5F89B31908AB6C21656B497AEF62D40B07CCF82| &&
+      |F0599056CD015B4509EF8EB5CE978868F6673AFB| &&
+      |0CCB048DC88ACA963E25A34F3D3213CA8D5036C8| &&
+      |D8DEE0FA41E52C14B80A906988823966B5BE8817| &&
+      |09770A6985AB077FC5E32C1F3FE5E3FB6438262B| &&
+      |B72DFA79F709117E160CE88CC44841235F72DCD4| &&
+      |E86DCA3DCABCA945E10E2D83CC5F7FA3C1F3454F| &&
+      |43AF6E4BED7A11B8F5870C593EE0A6B9BDFA998E| &&
+      |D1E081FFEBA4017E5E300396FE0E4F087F8CEA90| &&
+      |560C7F26D329E5FD7B09F0D8F7FF0614B7AD9789| &&
+      |75B0AC21664755F6FF003D4947C74123BF304DA0| &&
+      |FCA536204077CA8D69DD41E72D0E8ED598F86BC9| &&
+      |0D9E9E8861E01CCAB1626ABB55236D8DDE012316| &&
+      |558082338D26C5DEA4A986AA92D215440566DFAE| &&
+      |9F75FEB49CE5D9DDB24817E96DBACC1F7B176C2E| &&
+      |86F14BF21DD2B86583A502789C33343030333151| &&
+      |284A4D4CC94DD5CB4D61E8F9CF526533B9F99E89| &&
+      |F5DD0E11137B1563BF8D9300E5B40D39B801789C| &&
+      |0BCBCF4CD15308CFCCC951484A554849CD492D49| &&
+      |050A700100650107AFB643789C5D524B8FDA3010| &&
+      |BEFB578C38ED4AD1F621F5D29B49CC6235C49163| &&
+      |96720C8921AE428C62A768FF7D6702BBDB564242| &&
+      |F3F85EE398CEC2461AC85D638760E1018B47C652| &&
+      |7F791DDDA98BF0D03CC2D7CF5FBE81AEBBA9077E| &&
+      |AD47CB5869C7B30BC1F9015C80CE8EF6F00AA7B1| &&
+      |1EA26D13388ED6823F42D3D5E3C926103DD4C32B| &&
+      |5CEC1810E00FB176831B4E5043833A0C37638734| &&
+      |C11F23D1E3720B7508BE7135F241EB9BE96C8758| &&
+      |47D23BBADE067888687C51DD118BC759A4B575CF| &&
+      |DC00347B1BC1D5C5CE4F11461BE2E81AE248C00D| &&
+      |4D3FB5E4E16DDCBBB3BB2B107C0E1F18924E0113| &&
+      |90CF04CEBE7547FAB773ACCB74E85DE812681D51| &&
+      |1FA688CD40CDF99609E5F8E44708B6EF193238F4| &&
+      |3D67FD7037EF90F50B1D34DE4F14A873EDFCF9DF| &&
+      |242EB0E3340E2869674CEBF164B3E22FDB44EAD0|.
+ 
+    lv_decoded = zcl_abapgit_convert=>string_to_xstring_utf8(
+         |# wdalv_config\nSAP Web Dynpro ABAP ALV |
+      && |configurator\n\n\n**Install**\n* Import |
+      && |the objects from nugget file under lates|
+      && |t git release using SAPLINK\n* Activate |
+      && |all the objects\n* Create WD application|
+      && |s for ZALV_COMP_CONFIG\n\n**Demo**\n* Cr|
+      && |eate WD application for ZALV_DEMO\n* Exe|
+      && |cute the application\n* Execute configur|
+      && |ator application (ZALV_COMP_CONFIG)\n* C|
+      && |hange some config values and save\n* Rel|
+      && |aunch ZALV_DEMO application to see the c|
+      && |hanges\n\n\n**Use**\n- Add usage of ZALV|
+      && | component to any component that uses SA|
+      && |P standand ALV component - SALV_WD_TABLE|
+      && |\n- Instantiate ZALV component and pass |
+      && |ALV usage object of original ALV to ZALV|
+      && | by calling interface method set_alv_usa|
+      && |ge. \n\n```abap\nlo_cmp_usage =   wd_thi|
+      && |s->wd_cpuse_zalv( ).\nIF lo_cmp_usage->h|
+      && |as_active_component( ) IS INITIAL.\n    |
+      && |lo_cmp_usage->create_component( ).\nENDI|
+      && |F.\n\nDATA lo_interfacecontroller TYPE R|
+      && |EF TO ziwci_alv .\nlo_interfacecontrolle|
+      && |r =   wd_this->wd_cpifc_zalv( ).\n\nlo_i|
+      && |nterfacecontroller->set_alv_usage(\n    |
+      && |alv_usage =  lo_alv_usage\n  ).\n```\n\n|
+      && |- For production scenarios: In method UP|
+      && |DATE_DB_FROM_CONFIG of component control|
+      && |ler of component ZALV - check if the cur|
+      && |rent system is your development system. |
+      && |This ensures that Z tables are updated w|
+      && |ith config meta data only in Dev system.|
+      && | \n\n```abap\n  CHECK sy-sysid cp 'D*'.\n|
+      && |```\n- Transport wrapper Config: For ot|
+      && |her systems in the transport path(QA,IT,|
+      && |UT,PD), simply transport the table entri|
+      && |es from ZTALV* tables where config_type |
+      && |= 02 (Wrapper Config)\n\n**Note**\n- Man|
+      && |datory step: Execute the application (Re|
+      && |quired for updating Z tables with config|
+      && | meta data ) before running ALV configur|
+      && |ator App\n- If ALV functions from config|
+      && |urator (like - record count, full screen|
+      && |, excel export) are to be published then|
+      && | main application need to have node mapp|
+      && |ing for FUNCTION_ELEMENTS node of ALV. \n\n| ).
+ 
+    ls_data = zcl_abapgit_zlib=>decompress( lv_compressed ).
+ 
+    cl_abap_unit_assert=>assert_not_initial( ls_data-raw ).
+    cl_abap_unit_assert=>assert_equals( act = ls_data-raw
+                                        exp = lv_decoded ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/zcl_abapgit_zlib_convert.clas.abap.html b/src/git/zlib/zcl_abapgit_zlib_convert.clas.abap.html new file mode 100644 index 00000000000..d29a209f156 --- /dev/null +++ b/src/git/zlib/zcl_abapgit_zlib_convert.clas.abap.html @@ -0,0 +1,325 @@ + + + + + + Code coverage report for src/git/zlib/zcl_abapgit_zlib_convert.clas.abap + + + + + + + + + +
+
+

All files / src/git/zlib zcl_abapgit_zlib_convert.clas.abap

+
+ +
+ 100% + Statements + 80/80 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 80/80 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +811x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_zlib_convert DEFINITION
+  PUBLIC FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS hex_to_bits
+      IMPORTING
+        !iv_hex        TYPE xsequence
+      RETURNING
+        VALUE(rv_bits) TYPE string.
+ 
+    CLASS-METHODS bits_to_int
+      IMPORTING
+        !iv_bits      TYPE clike
+      RETURNING
+        VALUE(rv_int) TYPE i.
+ 
+    CLASS-METHODS int_to_hex
+      IMPORTING
+        !iv_int       TYPE i
+      RETURNING
+        VALUE(rv_hex) TYPE xstring.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZLIB_CONVERT IMPLEMENTATION.
+ 
+ 
+  METHOD bits_to_int.
+ 
+    DATA: lv_c    TYPE c LENGTH 1,
+          lv_bits TYPE string.
+ 
+    lv_bits = iv_bits.
+ 
+    WHILE NOT lv_bits IS INITIAL.
+      lv_c = lv_bits.
+      rv_int = rv_int * 2.
+      rv_int = rv_int + lv_c.
+      lv_bits = lv_bits+1.
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD hex_to_bits.
+ 
+    DATA: lv_x   TYPE x LENGTH 1,
+          lv_c   TYPE c LENGTH 1,
+          lv_bit TYPE i,
+          lv_hex TYPE xstring.
+ 
+ 
+    lv_hex = iv_hex.
+    WHILE NOT lv_hex IS INITIAL.
+      lv_x = lv_hex.
+      DO 8 TIMES.
+        lv_bit = sy-index.
+        GET BIT lv_bit OF lv_x INTO lv_c.
+        CONCATENATE rv_bits lv_c INTO rv_bits.
+      ENDDO.
+      lv_hex = lv_hex+1.
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD int_to_hex.
+ 
+    DATA: lv_x TYPE x.
+ 
+ 
+    lv_x = iv_int.
+    rv_hex = lv_x.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/zcl_abapgit_zlib_convert.clas.testclasses.abap.html b/src/git/zlib/zcl_abapgit_zlib_convert.clas.testclasses.abap.html new file mode 100644 index 00000000000..3fa805277b0 --- /dev/null +++ b/src/git/zlib/zcl_abapgit_zlib_convert.clas.testclasses.abap.html @@ -0,0 +1,268 @@ + + + + + + Code coverage report for src/git/zlib/zcl_abapgit_zlib_convert.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git/zlib zcl_abapgit_zlib_convert.clas.testclasses.abap

+
+ +
+ 100% + Statements + 61/61 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 61/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +621x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
 
+CLASS ltcl_test DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_cut TYPE REF TO zcl_abapgit_zlib_convert.
+ 
+    METHODS:
+      setup,
+      bits_to_int FOR TESTING,
+      hex_to_bits FOR TESTING,
+      int_to_hex FOR TESTING.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_cut.
+  ENDMETHOD.
+ 
+  METHOD bits_to_int.
+ 
+    DATA: lv_result TYPE i.
+ 
+    lv_result = mo_cut->bits_to_int( '111' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = 7 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD hex_to_bits.
+ 
+    DATA: lv_bits TYPE string.
+ 
+    lv_bits = mo_cut->hex_to_bits( '0101' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_bits
+      exp = '0000000100000001' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD int_to_hex.
+ 
+    DATA: lv_hex TYPE xstring.
+ 
+    lv_hex = mo_cut->int_to_hex( 64 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_hex
+      exp = '40' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/zcl_abapgit_zlib_huffman.clas.abap.html b/src/git/zlib/zcl_abapgit_zlib_huffman.clas.abap.html new file mode 100644 index 00000000000..4f0c9931adc --- /dev/null +++ b/src/git/zlib/zcl_abapgit_zlib_huffman.clas.abap.html @@ -0,0 +1,391 @@ + + + + + + Code coverage report for src/git/zlib/zcl_abapgit_zlib_huffman.clas.abap + + + + + + + + + +
+
+

All files / src/git/zlib zcl_abapgit_zlib_huffman.clas.abap

+
+ +
+ 100% + Statements + 102/102 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 102/102 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +1031x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +719x +719x +779x +779x +779x +779x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +719x +719x +779x +779x +779x +779x +779x +779x +779x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_zlib_huffman DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      ty_lengths TYPE STANDARD TABLE OF i WITH DEFAULT KEY .
+ 
+    CONSTANTS c_maxbits TYPE i VALUE 15 ##NO_TEXT.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_lengths TYPE ty_lengths .
+    METHODS get_count
+      IMPORTING
+        !iv_index       TYPE i
+      RETURNING
+        VALUE(rv_value) TYPE i .
+    METHODS get_symbol
+      IMPORTING
+        !iv_index       TYPE i
+      RETURNING
+        VALUE(rv_value) TYPE i .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA: mt_count  TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
+          mt_symbol TYPE STANDARD TABLE OF i WITH DEFAULT KEY.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZLIB_HUFFMAN IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lv_index  TYPE i,
+          lt_offset TYPE TABLE OF i,
+          lv_length LIKE LINE OF it_lengths,
+          lv_prev   TYPE i,
+          lv_count  LIKE LINE OF mt_count.
+ 
+    FIELD-SYMBOLS: <lv_offset> LIKE LINE OF lt_offset,
+                   <lv_symbol> LIKE LINE OF mt_symbol,
+                   <lv_i>      LIKE LINE OF it_lengths.
+ 
+ 
+    DO c_maxbits TIMES.
+      APPEND 0 TO mt_count.
+    ENDDO.
+    LOOP AT it_lengths INTO lv_index.
+      IF lv_index = 0.
+        CONTINUE.
+      ENDIF.
+      READ TABLE mt_count INDEX lv_index ASSIGNING <lv_i>.
+      ASSERT sy-subrc = 0.
+      <lv_i> = <lv_i> + 1.
+    ENDLOOP.
+ 
+************
+ 
+    APPEND 0 TO lt_offset.
+    DO c_maxbits - 1 TIMES.
+      READ TABLE mt_count INDEX sy-index INTO lv_count.
+      ASSERT sy-subrc = 0.
+      lv_prev = lv_prev + lv_count.
+      APPEND lv_prev TO lt_offset.
+    ENDDO.
+ 
+    DO lines( it_lengths ) TIMES.
+      APPEND 0 TO mt_symbol.
+    ENDDO.
+    DO lines( it_lengths ) TIMES.
+      lv_index = sy-index.
+      READ TABLE it_lengths INDEX lv_index INTO lv_length.
+      ASSERT sy-subrc = 0.
+      IF lv_length = 0.
+        CONTINUE.
+      ENDIF.
+      READ TABLE lt_offset INDEX lv_length ASSIGNING <lv_offset>.
+      ASSERT sy-subrc = 0.
+      READ TABLE mt_symbol INDEX <lv_offset> + 1 ASSIGNING <lv_symbol>.
+      ASSERT sy-subrc = 0.
+      <lv_symbol> = lv_index - 1.
+      <lv_offset> = <lv_offset> + 1.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_count.
+    READ TABLE mt_count INDEX iv_index INTO rv_value.     "#EC CI_SUBRC
+  ENDMETHOD.
+ 
+ 
+  METHOD get_symbol.
+    READ TABLE mt_symbol INDEX iv_index INTO rv_value.    "#EC CI_SUBRC
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/zcl_abapgit_zlib_huffman.clas.testclasses.abap.html b/src/git/zlib/zcl_abapgit_zlib_huffman.clas.testclasses.abap.html new file mode 100644 index 00000000000..eed0adb3c02 --- /dev/null +++ b/src/git/zlib/zcl_abapgit_zlib_huffman.clas.testclasses.abap.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for src/git/zlib/zcl_abapgit_zlib_huffman.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git/zlib zcl_abapgit_zlib_huffman.clas.testclasses.abap

+
+ +
+ 100% + Statements + 53/53 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 53/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +541x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS create1 FOR TESTING RAISING cx_static_check.
+    METHODS create2 FOR TESTING RAISING cx_static_check.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD create1.
+ 
+    DATA lo_huffman TYPE REF TO zcl_abapgit_zlib_huffman.
+    DATA lt_lengths TYPE zcl_abapgit_zlib_huffman=>ty_lengths.
+ 
+ 
+    DO 10 TIMES.
+      APPEND 8 TO lt_lengths.
+    ENDDO.
+ 
+    CREATE OBJECT lo_huffman
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+  ENDMETHOD.
+ 
+  METHOD create2.
+ 
+    DATA lo_huffman TYPE REF TO zcl_abapgit_zlib_huffman.
+    DATA lt_lengths TYPE zcl_abapgit_zlib_huffman=>ty_lengths.
+ 
+ 
+    DO 144 TIMES.
+      APPEND 8 TO lt_lengths.
+    ENDDO.
+    DO 112 TIMES.
+      APPEND 9 TO lt_lengths.
+    ENDDO.
+    DO 24 TIMES.
+      APPEND 7 TO lt_lengths.
+    ENDDO.
+    DO 8 TIMES.
+      APPEND 8 TO lt_lengths.
+    ENDDO.
+ 
+    CREATE OBJECT lo_huffman
+      EXPORTING
+        it_lengths = lt_lengths.
+ 
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/zcl_abapgit_zlib_stream.clas.abap.html b/src/git/zlib/zcl_abapgit_zlib_stream.clas.abap.html new file mode 100644 index 00000000000..d93dbb36991 --- /dev/null +++ b/src/git/zlib/zcl_abapgit_zlib_stream.clas.abap.html @@ -0,0 +1,403 @@ + + + + + + Code coverage report for src/git/zlib/zcl_abapgit_zlib_stream.clas.abap + + + + + + + + + +
+
+

All files / src/git/zlib zcl_abapgit_zlib_stream.clas.abap

+
+ +
+ 100% + Statements + 106/106 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 106/106 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +1071x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1063x +1063x +1063x +1063x +1x +1x +1058x +1058x +1058x +6253x +6253x +6253x +6253x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_zlib_stream DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_data TYPE xstring .
+    METHODS take_bits
+      IMPORTING
+        !iv_length     TYPE i
+      RETURNING
+        VALUE(rv_bits) TYPE string .
+    METHODS take_int
+      IMPORTING
+        !iv_length    TYPE i
+      RETURNING
+        VALUE(rv_int) TYPE i .
+    METHODS remaining
+      RETURNING
+        VALUE(rv_length) TYPE i .
+    "! Take bytes, there's an implicit realignment to start at the beginning of a byte
+    "! i.e. if next bit of current byte is not the first bit, then this byte is skipped
+    "! and the bytes are taken from the next one.
+    "! @parameter iv_length | <p class="shorttext synchronized" lang="en"></p>
+    "! @parameter rv_bytes | <p class="shorttext synchronized" lang="en"></p>
+    METHODS take_bytes
+      IMPORTING
+        !iv_length      TYPE i
+      RETURNING
+        VALUE(rv_bytes) TYPE xstring .
+    METHODS clear_bits .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mv_bits TYPE string .
+    DATA mv_compressed TYPE xstring .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZLIB_STREAM IMPLEMENTATION.
+ 
+ 
+  METHOD clear_bits.
+    CLEAR mv_bits.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    mv_compressed = iv_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remaining.
+ 
+    rv_length = xstrlen( mv_compressed ) + 1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD take_bits.
+ 
+    DATA: lv_left  TYPE i,
+          lv_index TYPE i,
+          lv_x     TYPE x LENGTH 1.
+ 
+ 
+    WHILE strlen( rv_bits ) < iv_length.
+      IF mv_bits IS INITIAL.
+        lv_x = mv_compressed(1).
+        mv_bits = zcl_abapgit_zlib_convert=>hex_to_bits( lv_x ).
+        mv_compressed = mv_compressed+1.
+      ENDIF.
+      lv_left = iv_length - strlen( rv_bits ).
+      IF lv_left >= strlen( mv_bits ).
+        CONCATENATE mv_bits rv_bits INTO rv_bits.
+        CLEAR mv_bits.
+      ELSE.
+        lv_index = strlen( mv_bits ) - lv_left.
+        CONCATENATE mv_bits+lv_index(lv_left) rv_bits INTO rv_bits.
+        mv_bits = mv_bits(lv_index).
+      ENDIF.
+ 
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD take_bytes.
+ 
+    rv_bytes = mv_compressed(iv_length).
+    mv_compressed = mv_compressed+iv_length.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD take_int.
+ 
+    rv_int = zcl_abapgit_zlib_convert=>bits_to_int( take_bits( iv_length ) ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap.html b/src/git/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap.html new file mode 100644 index 00000000000..0100222c469 --- /dev/null +++ b/src/git/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for src/git/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git/zlib zcl_abapgit_zlib_stream.clas.testclasses.abap

+
+ +
+ 100% + Statements + 53/53 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 53/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +541x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
 
+CLASS ltcl_test DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS test FOR TESTING.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD test.
+ 
+    DATA: lo_stream    TYPE REF TO zcl_abapgit_zlib_stream,
+          lv_remaining TYPE i,
+          lv_int       TYPE i,
+          lv_bits      TYPE string,
+          lv_bytes     TYPE xstring.
+ 
+ 
+    CREATE OBJECT lo_stream
+      EXPORTING
+        iv_data = '112233445566'.
+ 
+    lv_bits = lo_stream->take_bits( 8 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_bits
+      exp = '00010001' ).
+ 
+    lv_remaining = lo_stream->remaining( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_remaining
+      exp = 6 ).
+ 
+    lv_int = lo_stream->take_int( 8 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_int
+      exp = 34 ).
+ 
+    lv_bytes = lo_stream->take_bytes( 2 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_bytes
+      exp = '3344' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git_platform/index.html b/src/git_platform/index.html new file mode 100644 index 00000000000..301cfe73f2b --- /dev/null +++ b/src/git_platform/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/git_platform + + + + + + + + + +
+
+

All files src/git_platform

+
+ +
+ 95.45% + Statements + 399/418 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 95.45% + Lines + 399/418 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_git_url.clas.abap +
+
83.18%94/113100%0/00%0/183.18%94/113
zcl_abapgit_git_url.clas.testclasses.abap +
+
100%57/57100%1/1100%1/1100%57/57
zcl_abapgit_pr_enum_github.clas.abap +
+
100%146/146100%0/0100%0/0100%146/146
zcl_abapgit_pr_enumerator.clas.abap +
+
100%102/102100%0/0100%0/0100%102/102
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git_platform/zcl_abapgit_git_url.clas.abap.html b/src/git_platform/zcl_abapgit_git_url.clas.abap.html new file mode 100644 index 00000000000..17247d2d521 --- /dev/null +++ b/src/git_platform/zcl_abapgit_git_url.clas.abap.html @@ -0,0 +1,424 @@ + + + + + + Code coverage report for src/git_platform/zcl_abapgit_git_url.clas.abap + + + + + + + + + +
+
+

All files / src/git_platform zcl_abapgit_git_url.clas.abap

+
+ +
+ 83.18% + Statements + 94/113 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 83.18% + Lines + 94/113 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +1141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_git_url DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS get_commit_display_url
+      IMPORTING
+        !io_repo      TYPE REF TO zcl_abapgit_repo_online
+      RETURNING
+        VALUE(rv_url) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS validate_url
+      IMPORTING
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+    METHODS get_default_commit_display_url
+      IMPORTING
+        !iv_repo_url         TYPE string
+        !iv_hash             TYPE zif_abapgit_git_definitions=>ty_sha1
+      RETURNING
+        VALUE(rv_commit_url) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_git_url IMPLEMENTATION.
+ 
+ 
+  METHOD get_commit_display_url.
+ 
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    rv_url = get_default_commit_display_url(
+      iv_repo_url = io_repo->get_url( )
+      iv_hash     = io_repo->get_current_remote( ) ).
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->adjust_display_commit_url(
+      EXPORTING
+        iv_repo_url    = io_repo->get_url( )
+        iv_repo_name   = io_repo->get_name( )
+        iv_repo_key    = io_repo->get_key( )
+        iv_commit_hash = io_repo->get_current_remote( )
+      CHANGING
+        cv_display_url = rv_url ).
+ 
+    IF rv_url IS INITIAL.
+      zcx_abapgit_exception=>raise( |provider not yet supported| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_default_commit_display_url.
+ 
+    DATA ls_result TYPE match_result.
+    FIELD-SYMBOLS <ls_provider_match> TYPE submatch_result.
+ 
+    rv_commit_url = iv_repo_url.
+ 
+    FIND REGEX '^http(?:s)?:\/\/(?:www\.)?(github\.com|bitbucket\.org|gitlab\.com)\/'
+      IN rv_commit_url
+      RESULTS ls_result.
+    IF sy-subrc = 0.
+      READ TABLE ls_result-submatches INDEX 1 ASSIGNING <ls_provider_match>.
+      CASE rv_commit_url+<ls_provider_match>-offset(<ls_provider_match>-length).
+        WHEN 'github.com'.
+          REPLACE REGEX '\.git$' IN rv_commit_url WITH space.
+          rv_commit_url = rv_commit_url && |/commit/| && iv_hash.
+        WHEN 'bitbucket.org'.
+          REPLACE REGEX '\.git$' IN rv_commit_url WITH space.
+          rv_commit_url = rv_commit_url && |/commits/| && iv_hash.
+        WHEN 'gitlab.com'.
+          REPLACE REGEX '\.git$' IN rv_commit_url WITH space.
+          rv_commit_url = rv_commit_url && |/-/commit/| && iv_hash.
+      ENDCASE.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_url.
+
+    DATA lv_provider TYPE string.
+
+    lv_provider = zcl_abapgit_url=>host( to_lower( iv_url ) ).
+
+    " Provider-specific check for URLs that don't work
+    IF lv_provider CS 'gitlab.com'.
+      FIND REGEX '\.git$' IN iv_url IGNORING CASE.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( 'Repo URL for GitLab must end in ".git"' ).
+      ENDIF.
+    ELSEIF lv_provider CS 'dev.azure.com'.
+      FIND REGEX '\.git$' IN iv_url IGNORING CASE.
+      IF sy-subrc = 0.
+        zcx_abapgit_exception=>raise( 'Repo URL for Azure DevOps must not end in ".git"' ).
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git_platform/zcl_abapgit_git_url.clas.testclasses.abap.html b/src/git_platform/zcl_abapgit_git_url.clas.testclasses.abap.html new file mode 100644 index 00000000000..17c0424c6ef --- /dev/null +++ b/src/git_platform/zcl_abapgit_git_url.clas.testclasses.abap.html @@ -0,0 +1,256 @@ + + + + + + Code coverage report for src/git_platform/zcl_abapgit_git_url.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/git_platform zcl_abapgit_git_url.clas.testclasses.abap

+
+ +
+ 100% + Statements + 57/57 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 57/57 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +581x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_repo_online DEFINITION DEFERRED.
+CLASS zcl_abapgit_git_url DEFINITION LOCAL FRIENDS ltcl_repo_online.
+ 
+CLASS ltcl_repo_online DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      test_repo_commit_show_urls FOR TESTING RAISING cx_static_check.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_repo_online IMPLEMENTATION.
+ 
+  METHOD test_repo_commit_show_urls.
+ 
+    TYPES: BEGIN OF ty_show_url_test,
+             repo_url TYPE string,
+             show_url TYPE string,
+           END OF  ty_show_url_test,
+           ty_show_url_tests TYPE STANDARD TABLE OF ty_show_url_test WITH DEFAULT KEY.
+ 
+    DATA: ls_provider_urls TYPE ty_show_url_test,
+          lt_test_urls     TYPE ty_show_url_tests,
+          lv_testhash      TYPE zif_abapgit_git_definitions=>ty_sha1 VALUE 'my-SHA1-hash',
+          lo_cut           TYPE REF TO zcl_abapgit_git_url,
+          lv_show_url      TYPE zif_abapgit_persistence=>ty_repo-url.
+ 
+    FIELD-SYMBOLS <ls_provider_urls> TYPE ty_show_url_test.
+ 
+    CREATE OBJECT lo_cut.
+ 
+    ls_provider_urls-repo_url = |https://github.com/abapGit/abapGit.git|.
+    ls_provider_urls-show_url = |https://github.com/abapGit/abapGit/commit/{ lv_testhash }|.
+    APPEND ls_provider_urls TO lt_test_urls.
+    ls_provider_urls-repo_url = |http://github.com/abapGit/abapGit.git|.
+    ls_provider_urls-show_url = |http://github.com/abapGit/abapGit/commit/{ lv_testhash }|.
+    APPEND ls_provider_urls TO lt_test_urls.
+    ls_provider_urls-repo_url = |https://bitbucket.org/abapGit/abapGit.git|.
+    ls_provider_urls-show_url = |https://bitbucket.org/abapGit/abapGit/commits/{ lv_testhash }|.
+    APPEND ls_provider_urls TO lt_test_urls.
+    ls_provider_urls-repo_url = |https://gitlab.com/abapGit/abapGit.git|.
+    ls_provider_urls-show_url = |https://gitlab.com/abapGit/abapGit/-/commit/{ lv_testhash }|.
+    APPEND ls_provider_urls TO lt_test_urls.
+ 
+    LOOP AT lt_test_urls ASSIGNING <ls_provider_urls>.
+      lv_show_url = lo_cut->get_default_commit_display_url(
+        iv_repo_url = <ls_provider_urls>-repo_url
+        iv_hash     = lv_testhash ).
+ 
+      cl_abap_unit_assert=>assert_equals(
+        exp = <ls_provider_urls>-show_url
+        act = lv_show_url ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git_platform/zcl_abapgit_pr_enum_github.clas.abap.html b/src/git_platform/zcl_abapgit_pr_enum_github.clas.abap.html new file mode 100644 index 00000000000..dd059d1cbf8 --- /dev/null +++ b/src/git_platform/zcl_abapgit_pr_enum_github.clas.abap.html @@ -0,0 +1,523 @@ + + + + + + Code coverage report for src/git_platform/zcl_abapgit_pr_enum_github.clas.abap + + + + + + + + + +
+
+

All files / src/git_platform zcl_abapgit_pr_enum_github.clas.abap

+
+ +
+ 100% + Statements + 146/146 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 146/146 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +1471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_pr_enum_github DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_pr_enum_provider .
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_user_and_repo TYPE string
+        !ii_http_agent    TYPE REF TO zif_abapgit_http_agent
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_info,
+        repo_json TYPE REF TO zif_abapgit_ajson,
+        pulls     TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests,
+      END OF ty_info.
+ 
+    DATA mi_http_agent TYPE REF TO zif_abapgit_http_agent.
+    DATA mv_repo_url TYPE string.
+ 
+    METHODS fetch_repo_by_url
+      IMPORTING
+        iv_repo_url    TYPE string
+      RETURNING
+        VALUE(rs_info) TYPE ty_info
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS convert_list
+      IMPORTING
+        ii_json         TYPE REF TO zif_abapgit_ajson
+      RETURNING
+        VALUE(rt_pulls) TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests.
+ 
+    METHODS clean_url
+      IMPORTING
+        iv_url        TYPE string
+      RETURNING
+        VALUE(rv_url) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PR_ENUM_GITHUB IMPLEMENTATION.
+ 
+ 
+  METHOD clean_url.
+    rv_url = replace(
+      val = iv_url
+      regex = '\{.*\}$'
+      with = '' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    mv_repo_url   = |https://api.github.com/repos/{ iv_user_and_repo }|.
+    mi_http_agent = ii_http_agent.
+    mi_http_agent->global_headers( )->set(
+      iv_key = 'Accept'
+      iv_val = 'application/vnd.github.v3+json' ).
+ 
+    IF zcl_abapgit_login_manager=>get( mv_repo_url ) IS NOT INITIAL.
+      mi_http_agent->global_headers( )->set(
+        iv_key = 'Authorization'
+        iv_val = zcl_abapgit_login_manager=>get( mv_repo_url ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD convert_list.
+ 
+    DATA lt_items TYPE string_table.
+    DATA lv_i TYPE string.
+    FIELD-SYMBOLS <ls_p> LIKE LINE OF rt_pulls.
+ 
+    lt_items = ii_json->members( '/' ).
+ 
+    LOOP AT lt_items INTO lv_i.
+      APPEND INITIAL LINE TO rt_pulls ASSIGNING <ls_p>.
+      <ls_p>-base_url        = ii_json->get( |/{ lv_i }/base/repo/clone_url| ).
+      <ls_p>-number          = ii_json->get( |/{ lv_i }/number| ).
+      <ls_p>-title           = ii_json->get( |/{ lv_i }/title| ).
+      <ls_p>-user            = ii_json->get( |/{ lv_i }/user/login| ).
+      <ls_p>-head_url        = ii_json->get( |/{ lv_i }/head/repo/clone_url| ).
+      <ls_p>-head_branch     = ii_json->get( |/{ lv_i }/head/ref| ).
+      <ls_p>-created_at      = ii_json->get( |/{ lv_i }/created_at| ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD fetch_repo_by_url.
+ 
+    DATA li_pulls_json TYPE REF TO zif_abapgit_ajson.
+    DATA lv_pull_url TYPE string.
+    DATA li_response TYPE REF TO zif_abapgit_http_response.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    li_response = mi_http_agent->request( iv_repo_url ).
+ 
+    TRY.
+        rs_info-repo_json = li_response->json( ).
+        li_response->headers( ). " for debug
+        lv_pull_url = clean_url( rs_info-repo_json->get( '/pulls_url' ) ).
+        IF lv_pull_url IS INITIAL OR rs_info-repo_json->get( '/message' ) = 'Not Found'.
+          RETURN.
+        ENDIF.
+        li_pulls_json = mi_http_agent->request( lv_pull_url )->json( ).
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        zcx_abapgit_exception=>raise_with_text( lx_ajson ).
+    ENDTRY.
+ 
+    rs_info-pulls = convert_list( li_pulls_json ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_pr_enum_provider~list_pull_requests.
+ 
+    DATA lv_upstream_url TYPE string.
+    DATA ls_repo_info TYPE ty_info.
+    FIELD-SYMBOLS <ls_p> LIKE LINE OF ls_repo_info-pulls.
+ 
+    ls_repo_info = fetch_repo_by_url( mv_repo_url ).
+    APPEND LINES OF ls_repo_info-pulls TO rt_pulls.
+ 
+    IF ls_repo_info-repo_json->get_boolean( '/fork' ) = abap_true.
+      lv_upstream_url = ls_repo_info-repo_json->get( '/source/url' ). " parent ?
+      ls_repo_info = fetch_repo_by_url( lv_upstream_url ).
+      LOOP AT ls_repo_info-pulls ASSIGNING <ls_p>.
+        <ls_p>-is_for_upstream = abap_true.
+        APPEND <ls_p> TO rt_pulls.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/git_platform/zcl_abapgit_pr_enumerator.clas.abap.html b/src/git_platform/zcl_abapgit_pr_enumerator.clas.abap.html new file mode 100644 index 00000000000..5a9fc211026 --- /dev/null +++ b/src/git_platform/zcl_abapgit_pr_enumerator.clas.abap.html @@ -0,0 +1,391 @@ + + + + + + Code coverage report for src/git_platform/zcl_abapgit_pr_enumerator.clas.abap + + + + + + + + + +
+
+

All files / src/git_platform zcl_abapgit_pr_enumerator.clas.abap

+
+ +
+ 100% + Statements + 102/102 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 102/102 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +1031x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_pr_enumerator DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_pulls
+      RETURNING
+        VALUE(rt_pulls) TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS new
+      IMPORTING
+        iv_url             TYPE string
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_pr_enumerator
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mv_repo_url TYPE string.
+    DATA mi_enum_provider TYPE REF TO zif_abapgit_pr_enum_provider.
+ 
+    CLASS-METHODS create_provider
+      IMPORTING
+        iv_repo_url        TYPE string
+      RETURNING
+        VALUE(ri_provider) TYPE REF TO zif_abapgit_pr_enum_provider
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_pr_enumerator IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    mv_repo_url = to_lower( iv_url ).
+    TRY.
+        mi_enum_provider = create_provider( mv_repo_url ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_provider.
+ 
+    DATA li_agent TYPE REF TO zif_abapgit_http_agent.
+    DATA lv_user TYPE string.
+    DATA lv_repo TYPE string.
+ 
+    li_agent = zcl_abapgit_factory=>get_http_agent( ).
+ 
+    FIND ALL OCCURRENCES OF REGEX 'github\.com\/([^\/]+)\/([^\/]+)'
+      IN iv_repo_url
+      SUBMATCHES lv_user lv_repo.
+    IF sy-subrc = 0.
+      lv_repo = replace(
+        val = lv_repo
+        regex = '\.git$'
+        with = '' ).
+      CREATE OBJECT ri_provider TYPE zcl_abapgit_pr_enum_github
+        EXPORTING
+          iv_user_and_repo = |{ lv_user }/{ lv_repo }|
+          ii_http_agent    = li_agent.
+    ELSE.
+      zcx_abapgit_exception=>raise( |PR enumeration is not supported for { iv_repo_url }| ).
+    ENDIF.
+ 
+    " TODO somewhen more providers
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_pulls.
+ 
+    IF mi_enum_provider IS NOT BOUND.
+      RETURN.
+    ENDIF.
+ 
+    rt_pulls = mi_enum_provider->list_pull_requests( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance EXPORTING iv_url = iv_url.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/index.html b/src/http/index.html new file mode 100644 index 00000000000..8d005497ac7 --- /dev/null +++ b/src/http/index.html @@ -0,0 +1,266 @@ + + + + + + Code coverage report for src/http + + + + + + + + + +
+
+

All files src/http

+
+ +
+ 93.12% + Statements + 1516/1628 +
+ + +
+ 67.3% + Branches + 35/52 +
+ + +
+ 87.09% + Functions + 27/31 +
+ + +
+ 93.12% + Lines + 1516/1628 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_http.clas.abap +
+
89.28%225/25214.28%1/7100%1/189.28%225/252
zcl_abapgit_http_agent.clas.abap +
+
100%152/152100%0/0100%0/0100%152/152
zcl_abapgit_http_agent.clas.locals_imp.abap +
+
97.46%77/79100%0/00%0/197.46%77/79
zcl_abapgit_http_client.clas.abap +
+
88.83%183/20655.55%5/983.33%5/688.83%183/206
zcl_abapgit_http_digest.clas.abap +
+
68.86%115/167100%0/00%0/268.86%115/167
zcl_abapgit_login_manager.clas.abap +
+
98.57%138/14066.66%2/3100%0/098.57%138/140
zcl_abapgit_login_manager.clas.testclasses.abap +
+
100%79/79100%5/5100%5/5100%79/79
zcl_abapgit_proxy_auth.clas.abap +
+
100%53/53100%0/0100%0/0100%53/53
zcl_abapgit_proxy_config.clas.abap +
+
98.21%110/1120%0/2100%0/098.21%110/112
zcl_abapgit_url.clas.abap +
+
97.61%164/16860%6/10100%0/097.61%164/168
zcl_abapgit_url.clas.testclasses.abap +
+
100%220/220100%16/16100%16/16100%220/220
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_http.clas.abap.html b/src/http/zcl_abapgit_http.clas.abap.html new file mode 100644 index 00000000000..d4eeed837a1 --- /dev/null +++ b/src/http/zcl_abapgit_http.clas.abap.html @@ -0,0 +1,841 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_http.clas.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_http.clas.abap

+
+ +
+ 89.28% + Statements + 225/252 +
+ + +
+ 14.28% + Branches + 1/7 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 89.28% + Lines + 225/252 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +2531x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_http DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_scheme,
+        digest TYPE string VALUE 'Digest',
+      END OF c_scheme .
+ 
+    CLASS-METHODS get_agent
+      RETURNING
+        VALUE(rv_agent) TYPE string .
+    CLASS-METHODS create_by_url
+      IMPORTING
+        !iv_url          TYPE string
+        !iv_service      TYPE string
+      RETURNING
+        VALUE(ro_client) TYPE REF TO zcl_abapgit_http_client
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS check_auth_requested
+      IMPORTING
+        !ii_client               TYPE REF TO if_http_client
+      RETURNING
+        VALUE(rv_auth_requested) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_local_system
+      IMPORTING
+        !iv_url        TYPE string
+      RETURNING
+        VALUE(rv_bool) TYPE abap_bool .
+    CLASS-METHODS acquire_login_details
+      IMPORTING
+        !ii_client       TYPE REF TO if_http_client
+        !io_client       TYPE REF TO zcl_abapgit_http_client
+        !iv_url          TYPE string
+      RETURNING
+        VALUE(rv_scheme) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTTP IMPLEMENTATION.
+ 
+ 
+  METHOD acquire_login_details.
+ 
+    DATA: lv_default_user TYPE string,
+          lv_user         TYPE string,
+          lv_pass         TYPE string,
+          lo_digest       TYPE REF TO zcl_abapgit_http_digest.
+ 
+ 
+    lv_default_user = zcl_abapgit_persistence_user=>get_instance( )->get_repo_login( iv_url ).
+    lv_user         = lv_default_user.
+ 
+    zcl_abapgit_password_dialog=>popup(
+      EXPORTING
+        iv_repo_url     = iv_url
+      CHANGING
+        cv_user         = lv_user
+        cv_pass         = lv_pass ).
+ 
+    IF lv_user IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Unauthorized access. Check your credentials' ).
+    ENDIF.
+ 
+    IF lv_user <> lv_default_user.
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_login(
+        iv_url   = iv_url
+        iv_login = lv_user ).
+    ENDIF.
+ 
+    rv_scheme = ii_client->response->get_header_field( 'www-authenticate' ).
+    FIND REGEX '^(\w+)' IN rv_scheme SUBMATCHES rv_scheme.
+ 
+    CASE rv_scheme.
+      WHEN c_scheme-digest.
+* https://en.wikipedia.org/wiki/Digest_access_authentication
+* e.g. used by https://www.gerritcodereview.com/
+        CREATE OBJECT lo_digest
+          EXPORTING
+            ii_client   = ii_client
+            iv_username = lv_user
+            iv_password = lv_pass.
+        lo_digest->run( ii_client ).
+        io_client->set_digest( lo_digest ).
+      WHEN OTHERS.
+* https://en.wikipedia.org/wiki/Basic_access_authentication
+        ii_client->authenticate(
+          username = lv_user
+          password = lv_pass ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_auth_requested.
+ 
+    DATA: lv_code TYPE i.
+ 
+    ii_client->response->get_status( IMPORTING code = lv_code ).
+    IF lv_code = 401.
+      rv_auth_requested = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_by_url.
+ 
+    DATA: lv_uri                 TYPE string,
+          lv_scheme              TYPE string,
+          lv_authorization       TYPE string,
+          li_client              TYPE REF TO if_http_client,
+          lo_proxy_configuration TYPE REF TO zcl_abapgit_proxy_config,
+          lv_text                TYPE string.
+ 
+ 
+    CREATE OBJECT lo_proxy_configuration.
+ 
+    li_client = zcl_abapgit_exit=>get_instance( )->create_http_client( iv_url ).
+ 
+    IF li_client IS NOT BOUND.
+ 
+      cl_http_client=>create_by_url(
+        EXPORTING
+          url                = zcl_abapgit_url=>host( iv_url )
+          ssl_id             = zcl_abapgit_exit=>get_instance( )->get_ssl_id( )
+          proxy_host         = lo_proxy_configuration->get_proxy_url( iv_url )
+          proxy_service      = lo_proxy_configuration->get_proxy_port( iv_url )
+        IMPORTING
+          client             = li_client
+        EXCEPTIONS
+          argument_not_found = 1
+          plugin_not_active  = 2
+          internal_error     = 3
+          OTHERS             = 4 ).
+      IF sy-subrc <> 0.
+        CASE sy-subrc.
+          WHEN 1.
+            " make sure:
+            " a) SSL is setup properly in STRUST
+            lv_text = 'HTTPS ARGUMENT_NOT_FOUND | STRUST/SSL Setup correct?'.
+          WHEN OTHERS.
+            lv_text = 'While creating HTTP Client'.
+
+        ENDCASE.
+        zcx_abapgit_exception=>raise( lv_text ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+    IF lo_proxy_configuration->get_proxy_authentication( iv_url ) = abap_true.
+      zcl_abapgit_proxy_auth=>run( li_client ).
+    ENDIF.
+ 
+    CREATE OBJECT ro_client
+      EXPORTING
+        ii_client = li_client.
+ 
+    IF is_local_system( iv_url ) = abap_true.
+      li_client->send_sap_logon_ticket( ).
+    ENDIF.
+ 
+    li_client->request->set_cdata( '' ).
+    li_client->request->set_header_field(
+        name  = '~request_method'
+        value = 'GET' ).
+    li_client->request->set_header_field(
+        name  = 'user-agent'
+        value = get_agent( ) ).
+    lv_uri = zcl_abapgit_url=>path_name( iv_url ) &&
+             '/info/refs?service=git-' &&
+             iv_service &&
+             '-pack'.
+    li_client->request->set_header_field(
+        name  = '~request_uri'
+        value = lv_uri ).
+ 
+    " Disable internal auth dialog (due to its unclarity)
+    li_client->propertytype_logon_popup = if_http_client=>co_disabled.
+ 
+    lv_authorization = zcl_abapgit_login_manager=>load( iv_url ).
+    IF lv_authorization IS NOT INITIAL.
+      li_client->request->set_header_field(
+        name  = 'authorization'
+        value = lv_authorization ).
+      li_client->propertytype_logon_popup = li_client->co_disabled.
+    ENDIF.
+ 
+    zcl_abapgit_exit=>get_instance( )->http_client(
+      iv_url    = iv_url
+      ii_client = li_client ).
+ 
+    ro_client->send_receive( ).
+    IF check_auth_requested( li_client ) = abap_true.
+      lv_scheme = acquire_login_details( ii_client = li_client
+                                         io_client = ro_client
+                                         iv_url    = iv_url ).
+      ro_client->send_receive( ).
+    ENDIF.
+    ro_client->check_http_200( ).
+ 
+    IF lv_scheme <> c_scheme-digest.
+      zcl_abapgit_login_manager=>save(
+        iv_uri           = iv_url
+        iv_authorization = li_client->request->get_header_field( 'authorization' ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_agent.
+ 
+* bitbucket require agent prefix = "git/"
+* also see https://github.com/abapGit/abapGit/issues/1432
+    rv_agent = |git/2.0 (abapGit { zif_abapgit_version=>c_abap_version })|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_local_system.
+ 
+    DATA: lv_host TYPE string,
+          lt_list TYPE zif_abapgit_definitions=>ty_string_tt,
+          li_exit TYPE REF TO zif_abapgit_exit.
+ 
+ 
+    cl_http_server=>get_location( IMPORTING host = lv_host ).
+    APPEND lv_host TO lt_list.
+ 
+    APPEND 'localhost' TO lt_list.
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->change_local_host( CHANGING ct_hosts = lt_list ).
+ 
+    FIND REGEX 'https?://([^/^:]*)' IN iv_url SUBMATCHES lv_host.
+ 
+    READ TABLE lt_list WITH KEY table_line = lv_host TRANSPORTING NO FIELDS.
+    rv_bool = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_http_agent.clas.abap.html b/src/http/zcl_abapgit_http_agent.clas.abap.html new file mode 100644 index 00000000000..28276bd9a76 --- /dev/null +++ b/src/http/zcl_abapgit_http_agent.clas.abap.html @@ -0,0 +1,541 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_http_agent.clas.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_http_agent.clas.abap

+
+ +
+ 100% + Statements + 152/152 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 152/152 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +1531x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_http_agent DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_http_agent .
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_instance) TYPE REF TO zif_abapgit_http_agent .
+ 
+    METHODS constructor.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_global_headers TYPE REF TO zcl_abapgit_string_map.
+ 
+    CLASS-METHODS attach_payload
+      IMPORTING
+        ii_request TYPE REF TO if_http_request
+        iv_payload TYPE any
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTTP_AGENT IMPLEMENTATION.
+ 
+ 
+  METHOD attach_payload.
+ 
+    DATA lo_type TYPE REF TO cl_abap_typedescr.
+    lo_type = cl_abap_typedescr=>describe_by_data( iv_payload ).
+ 
+    IF lo_type->type_kind = cl_abap_typedescr=>typekind_xstring.
+      ii_request->set_data( iv_payload ).
+ 
+    ELSEIF lo_type->type_kind = cl_abap_typedescr=>typekind_string.
+      ii_request->set_cdata( iv_payload ).
+ 
+    ELSE.
+      zcx_abapgit_exception=>raise( |Unexpected payload type { lo_type->absolute_name }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    CREATE OBJECT mo_global_headers.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    CREATE OBJECT ri_instance TYPE zcl_abapgit_http_agent.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_http_agent~global_headers.
+ 
+    ro_global_headers = mo_global_headers.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_http_agent~request.
+ 
+    DATA li_client TYPE REF TO if_http_client.
+    DATA lo_proxy_configuration TYPE REF TO zcl_abapgit_proxy_config.
+    DATA lv_code TYPE i.
+    DATA lv_message TYPE string.
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF io_query->mt_entries.
+ 
+    CREATE OBJECT lo_proxy_configuration.
+ 
+    cl_http_client=>create_by_url(
+      EXPORTING
+        url           = iv_url
+        ssl_id        = zcl_abapgit_exit=>get_instance( )->get_ssl_id( )
+        proxy_host    = lo_proxy_configuration->get_proxy_url( iv_url )
+        proxy_service = lo_proxy_configuration->get_proxy_port( iv_url )
+      IMPORTING
+        client = li_client ).
+ 
+    li_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).
+    li_client->request->set_method( iv_method ).
+ 
+    IF io_query IS BOUND.
+      LOOP AT io_query->mt_entries ASSIGNING <ls_entry>.
+        li_client->request->set_form_field(
+          name  = <ls_entry>-k
+          value = <ls_entry>-v ).
+      ENDLOOP.
+    ENDIF.
+ 
+    LOOP AT mo_global_headers->mt_entries ASSIGNING <ls_entry>.
+      li_client->request->set_header_field(
+        name  = to_lower( <ls_entry>-k )
+        value = <ls_entry>-v ).
+    ENDLOOP.
+ 
+    IF io_headers IS BOUND.
+      LOOP AT io_headers->mt_entries ASSIGNING <ls_entry>.
+        li_client->request->set_header_field(
+          name  = to_lower( <ls_entry>-k )
+          value = <ls_entry>-v ).
+      ENDLOOP.
+    ENDIF.
+ 
+    IF iv_method = zif_abapgit_http_agent=>c_methods-post
+      OR iv_method = zif_abapgit_http_agent=>c_methods-put
+      OR iv_method = zif_abapgit_http_agent=>c_methods-patch.
+      attach_payload(
+        ii_request = li_client->request
+        iv_payload = iv_payload ).
+    ENDIF.
+ 
+    li_client->send(
+      EXCEPTIONS
+        http_communication_failure = 1
+        http_invalid_state         = 2
+        http_processing_failed     = 3
+        http_invalid_timeout       = 4
+        OTHERS                     = 5 ).
+    IF sy-subrc = 0.
+      li_client->receive(
+        EXCEPTIONS
+          http_communication_failure = 1
+          http_invalid_state         = 2
+          http_processing_failed     = 3
+          OTHERS                     = 4 ).
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      li_client->get_last_error(
+        IMPORTING
+          code    = lv_code
+          message = lv_message ).
+      zcx_abapgit_exception=>raise( |HTTP error: [{ lv_code }] { lv_message }| ).
+    ENDIF.
+ 
+    ri_response = lcl_http_response=>create( li_client ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_http_agent.clas.locals_imp.abap.html b/src/http/zcl_abapgit_http_agent.clas.locals_imp.abap.html new file mode 100644 index 00000000000..e42a859037d --- /dev/null +++ b/src/http/zcl_abapgit_http_agent.clas.locals_imp.abap.html @@ -0,0 +1,322 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_http_agent.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_http_agent.clas.locals_imp.abap

+
+ +
+ 97.46% + Statements + 77/79 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 97.46% + Lines + 77/79 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +801x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_http_response DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_http_response.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        ii_client          TYPE REF TO if_http_client
+      RETURNING
+        VALUE(ri_response) TYPE REF TO zif_abapgit_http_response.
+ 
+  PRIVATE SECTION.
+    DATA mi_client TYPE REF TO if_http_client.
+    DATA mi_response TYPE REF TO if_http_response.
+ENDCLASS.
+ 
+CLASS lcl_http_response IMPLEMENTATION.
+ 
+  METHOD create.
+    DATA lo_response TYPE REF TO lcl_http_response.
+    CREATE OBJECT lo_response.
+    lo_response->mi_client   = ii_client.
+    lo_response->mi_response = ii_client->response.
+    ri_response ?= lo_response.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_http_response~close.
+    mi_client->close( ).
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_http_response~is_ok.
+    DATA lv_code TYPE i.
+    lv_code = zif_abapgit_http_response~code( ).
+    rv_yes = boolc( lv_code >= 200 AND lv_code < 300 ).
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_http_response~data.
+    rv_data = mi_response->get_data( ).
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_http_response~cdata.
+    rv_data = mi_response->get_cdata( ).
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_http_response~code.
+    DATA lv_msg TYPE string ##NEEDED.
+    mi_response->get_status(
+      IMPORTING
+        reason = lv_msg " for debug
+        code   = rv_code ).
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_http_response~json.
+ 
+    ri_json = zcl_abapgit_ajson=>parse( zif_abapgit_http_response~cdata( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_http_response~error.
+    rv_message = mi_response->get_cdata( ).
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_http_response~headers.
+ 
+    DATA lt_headers TYPE tihttpnvp.
+    FIELD-SYMBOLS <ls_h> LIKE LINE OF lt_headers.
+ 
+    CREATE OBJECT ro_headers.
+ 
+    mi_response->get_header_fields( CHANGING fields = lt_headers ).
+    LOOP AT lt_headers ASSIGNING <ls_h>.
+      ro_headers->set(
+        iv_key = <ls_h>-name
+        iv_val = <ls_h>-value ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_http_client.clas.abap.html b/src/http/zcl_abapgit_http_client.clas.abap.html new file mode 100644 index 00000000000..cbabcd28d51 --- /dev/null +++ b/src/http/zcl_abapgit_http_client.clas.abap.html @@ -0,0 +1,703 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_http_client.clas.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_http_client.clas.abap

+
+ +
+ 88.83% + Statements + 183/206 +
+ + +
+ 55.55% + Branches + 5/9 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 88.83% + Lines + 183/206 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +2071x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x + 
CLASS zcl_abapgit_http_client DEFINITION PUBLIC CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS:
+      constructor
+        IMPORTING ii_client TYPE REF TO if_http_client,
+      close,
+      set_digest
+        IMPORTING io_digest TYPE REF TO zcl_abapgit_http_digest,
+      send_receive_close
+        IMPORTING iv_data        TYPE xstring
+        RETURNING VALUE(rv_data) TYPE xstring
+        RAISING   zcx_abapgit_exception,
+      get_cdata
+        RETURNING VALUE(rv_value) TYPE string,
+      check_http_200
+        RAISING zcx_abapgit_exception,
+      check_smart_response
+        IMPORTING iv_expected_content_type TYPE string
+                  iv_content_regex         TYPE string
+        RAISING   zcx_abapgit_exception,
+      send_receive
+        RAISING zcx_abapgit_exception,
+      set_headers
+        IMPORTING iv_url     TYPE string
+                  iv_service TYPE string
+        RAISING   zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+    DATA: mi_client TYPE REF TO if_http_client,
+          mo_digest TYPE REF TO zcl_abapgit_http_digest.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_http_client IMPLEMENTATION.
+ 
+ 
+  METHOD check_http_200.
+ 
+    DATA: lv_code TYPE i,
+          lv_text TYPE string.
+ 
+    mi_client->response->get_status( IMPORTING code = lv_code ).
+    CASE lv_code.
+      WHEN 200.
+        RETURN. " Success, OK
+      WHEN 302.
+        zcx_abapgit_exception=>raise( 'Resource access temporarily redirected (HTTP 302). Check the URL' ).
+      WHEN 401.
+        zcx_abapgit_exception=>raise( 'Unauthorized access to resource (HTTP 401). Check your credentials' ).
+      WHEN 403.
+        zcx_abapgit_exception=>raise( 'Access to resource forbidden (HTTP 403)' ).
+      WHEN 404.
+        zcx_abapgit_exception=>raise( 'Resource not found (HTTP 404). Check the URL' ).
+      WHEN 407.
+        zcx_abapgit_exception=>raise( 'Proxy authentication required (HTTP 407). Check your credentials' ).
+      WHEN 408.
+        zcx_abapgit_exception=>raise( 'Request timeout (HTTP 408)' ).
+      WHEN 415.
+        zcx_abapgit_exception=>raise( 'Unsupported media type (HTTP 415)' ).
+      WHEN 422.
+        zcx_abapgit_exception=>raise( 'Unprocessable entity (HTTP 422). Check, if URL has to end with ".git"' ).
+      WHEN OTHERS.
+        lv_text = mi_client->response->get_cdata( ).
+        zcx_abapgit_exception=>raise( |(HTTP { lv_code }) { lv_text }| ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_smart_response.
+ 
+    DATA: lv_content_type TYPE string.
+    DATA: lv_data         TYPE string.
+ 
+    IF iv_expected_content_type IS NOT INITIAL.
+      lv_content_type = mi_client->response->get_content_type( ).
+      IF lv_content_type <> iv_expected_content_type.
+        zcx_abapgit_exception=>raise( 'Wrong Content-Type sent by server - no fallback to the dumb protocol!' ).
+      ENDIF.
+    ENDIF.
+ 
+    IF iv_content_regex IS NOT INITIAL.
+      lv_data = mi_client->response->get_cdata( ).
+      FIND REGEX iv_content_regex IN lv_data.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( 'Wrong Content sent by server' ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD close.
+    mi_client->close( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mi_client = ii_client.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_cdata.
+    rv_value = mi_client->response->get_cdata( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD send_receive.
+ 
+    DATA: lv_text    TYPE string,
+          lv_code    TYPE i,
+          lv_message TYPE string.
+ 
+    mi_client->send(
+      EXCEPTIONS
+        http_communication_failure = 1
+        http_invalid_state         = 2
+        http_processing_failed     = 3
+        http_invalid_timeout       = 4
+        OTHERS                     = 5 ).
+ 
+    IF sy-subrc = 0.
+      mi_client->receive(
+        EXCEPTIONS
+          http_communication_failure = 1
+          http_invalid_state         = 2
+          http_processing_failed     = 3
+          OTHERS                     = 4 ).
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      " in case of HTTP_COMMUNICATION_FAILURE
+      " make sure:
+      " a) SSL is setup properly in STRUST
+      " b) no firewalls
+      " check trace file in transaction SMICM
+
+      mi_client->get_last_error(
+        IMPORTING
+          code    = lv_code
+          message = lv_message ).
+
+      lv_text = |HTTP error { lv_code } occured: { lv_message }|.
+
+      zcx_abapgit_exception=>raise( lv_text ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD send_receive_close.
+ 
+* do not use set_cdata as it modifies the Content-Type header field
+    mi_client->request->set_data( iv_data ).
+    send_receive( ).
+    check_http_200( ).
+    rv_data = mi_client->response->get_data( ).
+    mi_client->close( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_digest.
+    mo_digest = io_digest.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_headers.
+ 
+    DATA: lv_value TYPE string.
+ 
+ 
+    mi_client->request->set_header_field(
+        name  = '~request_method'
+        value = 'POST' ).
+ 
+    lv_value = zcl_abapgit_url=>path_name( iv_url ) &&
+      '/git-' &&
+      iv_service &&
+      '-pack'.
+    mi_client->request->set_header_field(
+        name  = '~request_uri'
+        value = lv_value ).
+ 
+    lv_value = 'application/x-git-'
+                  && iv_service && '-pack-request'.
+    mi_client->request->set_header_field(
+        name  = 'Content-Type'
+        value = lv_value ).
+ 
+    lv_value = 'application/x-git-'
+                  && iv_service && '-pack-result'.
+    mi_client->request->set_header_field(
+        name  = 'Accept'
+        value = lv_value ).
+ 
+    IF mo_digest IS BOUND.
+      mo_digest->run( mi_client ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_http_digest.clas.abap.html b/src/http/zcl_abapgit_http_digest.clas.abap.html new file mode 100644 index 00000000000..eb8e3f7bd8b --- /dev/null +++ b/src/http/zcl_abapgit_http_digest.clas.abap.html @@ -0,0 +1,586 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_http_digest.clas.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_http_digest.clas.abap

+
+ +
+ 68.86% + Statements + 115/167 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 68.86% + Lines + 115/167 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +1681x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_http_digest DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !ii_client   TYPE REF TO if_http_client
+        !iv_username TYPE string
+        !iv_password TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS run
+      IMPORTING
+        !ii_client TYPE REF TO if_http_client
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA: mv_ha1      TYPE string,
+          mv_username TYPE string,
+          mv_realm    TYPE string,
+          mv_qop      TYPE string,
+          mv_nonce    TYPE string.
+ 
+    CLASS-DATA: gv_nc TYPE n LENGTH 8.
+ 
+    CLASS-METHODS:
+      md5
+        IMPORTING
+                  iv_data        TYPE string
+        RETURNING
+                  VALUE(rv_hash) TYPE string
+        RAISING   zcx_abapgit_exception.
+ 
+    METHODS:
+      hash
+        IMPORTING
+                  iv_qop             TYPE string
+                  iv_nonce           TYPE string
+                  iv_uri             TYPE string
+                  iv_method          TYPE string
+                  iv_cnonse          TYPE string
+        RETURNING
+                  VALUE(rv_response) TYPE string
+        RAISING   zcx_abapgit_exception,
+      parse
+        IMPORTING
+          ii_client TYPE REF TO if_http_client.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTTP_DIGEST IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    parse( ii_client ).
+ 
+    mv_ha1 = md5( |{ iv_username }:{ mv_realm }:{ iv_password }| ).
+ 
+    mv_username = iv_username.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD hash.
+ 
+    DATA: lv_ha2 TYPE string.
+ 
+ 
+    lv_ha2 = md5( |{ iv_method }:{ iv_uri }| ).
+ 
+    ASSERT NOT iv_cnonse IS INITIAL.
+ 
+    rv_response = md5( |{ mv_ha1 }:{ iv_nonce }:{ gv_nc }:{ iv_cnonse }:{ iv_qop }:{ lv_ha2 }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD md5.
+ 
+    DATA lv_xstr TYPE xstring.
+    DATA lv_hash TYPE xstring.
+    DATA lv_empty TYPE xstring.
+ 
+    lv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8( iv_data ).
+ 
+    TRY.
+        cl_abap_hmac=>calculate_hmac_for_raw(
+          EXPORTING
+            if_algorithm   = 'MD5'
+            if_key         = lv_empty
+            if_data        = lv_xstr
+          IMPORTING
+            ef_hmacxstring = lv_hash ).
+      CATCH cx_abap_message_digest.
+        zcx_abapgit_exception=>raise( 'error calculating md5' ).
+    ENDTRY.
+ 
+    rv_hash = lv_hash.
+    TRANSLATE rv_hash TO LOWER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+
+    DATA: lv_value TYPE string.
+
+
+    lv_value = ii_client->response->get_header_field( 'www-authenticate' ).
+
+    FIND REGEX 'realm="([\w ]+)"' IN lv_value SUBMATCHES mv_realm.
+    FIND REGEX 'qop="(\w+)"' IN lv_value SUBMATCHES mv_qop.
+    FIND REGEX 'nonce="([\w=/+\$]+)"' IN lv_value SUBMATCHES mv_nonce.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+
+    DATA: lv_response TYPE string,
+          lv_method   TYPE string,
+          lv_cnonce   TYPE string,
+          lv_uri      TYPE string,
+          lv_auth     TYPE string.
+
+
+    ASSERT NOT mv_nonce IS INITIAL.
+
+    lv_method = ii_client->request->get_header_field( '~request_method' ).
+    lv_uri = ii_client->request->get_header_field( '~request_uri' ).
+
+    CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
+      EXPORTING
+        number_chars  = 24
+      IMPORTING
+        random_string = lv_cnonce.
+
+    lv_response = hash(
+      iv_qop    = mv_qop
+      iv_nonce  = mv_nonce
+      iv_uri    = lv_uri
+      iv_method = lv_method
+      iv_cnonse = lv_cnonce ).
+
+* client response
+    lv_auth = |Digest username="{ mv_username
+      }", realm="{ mv_realm
+      }", nonce="{ mv_nonce
+      }", uri="{ lv_uri
+      }", qop={ mv_qop
+      }, nc={ gv_nc
+      }, cnonce="{ lv_cnonce
+      }", response="{ lv_response }"|.
+
+    ii_client->request->set_header_field(
+      name  = 'Authorization'
+      value = lv_auth ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_login_manager.clas.abap.html b/src/http/zcl_abapgit_login_manager.clas.abap.html new file mode 100644 index 00000000000..ac7e5a61248 --- /dev/null +++ b/src/http/zcl_abapgit_login_manager.clas.abap.html @@ -0,0 +1,505 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_login_manager.clas.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_login_manager.clas.abap

+
+ +
+ 98.57% + Statements + 138/140 +
+ + +
+ 66.66% + Branches + 2/3 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.57% + Lines + 138/140 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +1411x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_login_manager DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS load
+      IMPORTING
+        !iv_uri                 TYPE string
+      RETURNING
+        VALUE(rv_authorization) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS save
+      IMPORTING
+        !iv_uri           TYPE string
+        !iv_authorization TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS clear .
+    CLASS-METHODS set
+      IMPORTING
+        !iv_uri        TYPE string
+        !iv_username   TYPE string
+        !iv_password   TYPE string
+      RETURNING
+        VALUE(rv_auth) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get
+      IMPORTING
+        !iv_uri        TYPE string
+      RETURNING
+        VALUE(rv_auth) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_auth,
+        uri           TYPE string,
+        authorization TYPE string,
+      END OF ty_auth .
+ 
+    CLASS-DATA:
+      gt_auth TYPE TABLE OF ty_auth WITH DEFAULT KEY .
+ 
+    CLASS-METHODS append
+      IMPORTING
+        !iv_uri  TYPE string
+        !iv_auth TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_LOGIN_MANAGER IMPLEMENTATION.
+ 
+ 
+  METHOD append.
+ 
+    FIELD-SYMBOLS: <ls_auth> LIKE LINE OF gt_auth.
+ 
+    READ TABLE gt_auth WITH KEY uri = zcl_abapgit_url=>host( iv_uri )
+      TRANSPORTING NO FIELDS.
+    IF sy-subrc <> 0.
+      APPEND INITIAL LINE TO gt_auth ASSIGNING <ls_auth>.
+      <ls_auth>-uri           = zcl_abapgit_url=>host( iv_uri ).
+      <ls_auth>-authorization = iv_auth.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD clear.
+ 
+    CLEAR gt_auth.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get.
+ 
+    DATA ls_auth LIKE LINE OF gt_auth.
+ 
+    READ TABLE gt_auth INTO ls_auth WITH KEY uri = zcl_abapgit_url=>host( iv_uri ).
+    IF sy-subrc = 0.
+      rv_auth = ls_auth-authorization.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD load.
+ 
+    DATA ls_auth LIKE LINE OF gt_auth.
+ 
+    READ TABLE gt_auth INTO ls_auth WITH KEY uri = zcl_abapgit_url=>host( iv_uri ).
+    IF sy-subrc = 0.
+      rv_authorization = ls_auth-authorization.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save.
+ 
+    IF NOT iv_authorization IS INITIAL.
+      append( iv_uri  = iv_uri
+              iv_auth = iv_authorization ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set.
+ 
+    DATA: lv_concat TYPE string.
+ 
+    ASSERT NOT iv_uri IS INITIAL.
+ 
+    IF iv_username IS INITIAL OR iv_password IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    CONCATENATE iv_username ':' iv_password INTO lv_concat.
+ 
+    rv_auth = cl_http_utility=>encode_base64( lv_concat ).
+ 
+    CONCATENATE 'Basic' rv_auth INTO rv_auth
+      SEPARATED BY space.
+ 
+    append( iv_uri  = iv_uri
+            iv_auth = rv_auth ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_login_manager.clas.testclasses.abap.html b/src/http/zcl_abapgit_login_manager.clas.testclasses.abap.html new file mode 100644 index 00000000000..d1c2b44711f --- /dev/null +++ b/src/http/zcl_abapgit_login_manager.clas.testclasses.abap.html @@ -0,0 +1,322 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_login_manager.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_login_manager.clas.testclasses.abap

+
+ +
+ 100% + Statements + 79/79 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 79/79 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +801x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_login_manager DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    CONSTANTS: c_username TYPE string VALUE 'Aladdin',
+               c_password TYPE string VALUE 'OpenSesame'.
+ 
+    METHODS:
+      setup,
+      teardown,
+      encoding FOR TESTING RAISING zcx_abapgit_exception,
+      save FOR TESTING RAISING zcx_abapgit_exception,
+      same_server FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_login_manager IMPLEMENTATION.
+ 
+  METHOD setup.
+    zcl_abapgit_login_manager=>clear( ).
+  ENDMETHOD.
+ 
+  METHOD teardown.
+    zcl_abapgit_login_manager=>clear( ).
+  ENDMETHOD.
+ 
+  METHOD save.
+ 
+    CONSTANTS lc_uri TYPE string VALUE 'https://abapgit.org/foo/bar'.
+    CONSTANTS lc_auth TYPE string VALUE 'foobar'.
+ 
+    zcl_abapgit_login_manager=>save(
+      iv_uri           = lc_uri
+      iv_authorization = lc_auth ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_login_manager=>get( lc_uri )
+      exp = lc_auth ).
+ 
+  ENDMETHOD.
+ 
+  METHOD encoding.
+ 
+    DATA lv_auth TYPE string.
+ 
+    lv_auth = zcl_abapgit_login_manager=>set(
+      iv_uri      = 'https://github.com/abapGit/abapGit.git'
+      iv_username = c_username
+      iv_password = c_password ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_auth
+      exp = 'Basic QWxhZGRpbjpPcGVuU2VzYW1l' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD same_server.
+ 
+    CONSTANTS: lc_github1 TYPE string VALUE 'https://github.com/abapGit/abapGit.git',
+               lc_github2 TYPE string VALUE 'https://github.com/larshp/Foobar.git'.
+ 
+    DATA: lv_auth1 TYPE string,
+          lv_auth2 TYPE string.
+ 
+ 
+    zcl_abapgit_login_manager=>set(
+      iv_uri      = lc_github1
+      iv_username = c_username
+      iv_password = c_password ).
+ 
+    lv_auth1 = zcl_abapgit_login_manager=>load( lc_github1 ).
+    lv_auth2 = zcl_abapgit_login_manager=>load( lc_github2 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_auth1
+      exp = lv_auth2 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_proxy_auth.clas.abap.html b/src/http/zcl_abapgit_proxy_auth.clas.abap.html new file mode 100644 index 00000000000..5fe2d6f4b57 --- /dev/null +++ b/src/http/zcl_abapgit_proxy_auth.clas.abap.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_proxy_auth.clas.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_proxy_auth.clas.abap

+
+ +
+ 100% + Statements + 53/53 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 53/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +541x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_proxy_auth DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      run
+        IMPORTING ii_client TYPE REF TO if_http_client
+        RAISING   zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+    CLASS-DATA: gv_username TYPE string,
+                gv_password TYPE string.
+ 
+    CLASS-METHODS: enter RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PROXY_AUTH IMPLEMENTATION.
+ 
+ 
+  METHOD enter.
+ 
+    zcl_abapgit_password_dialog=>popup(
+      EXPORTING
+        iv_repo_url = 'Proxy Authentication'
+      CHANGING
+        cv_user     = gv_username
+        cv_pass     = gv_password ).
+ 
+    IF gv_username IS INITIAL OR gv_password IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Proxy auth failed' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    IF gv_username IS INITIAL OR gv_password IS INITIAL.
+      enter( ).
+    ENDIF.
+ 
+    ii_client->authenticate(
+      proxy_authentication = abap_true
+      username             = gv_username
+      password             = gv_password ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_proxy_config.clas.abap.html b/src/http/zcl_abapgit_proxy_config.clas.abap.html new file mode 100644 index 00000000000..59b70e56cf8 --- /dev/null +++ b/src/http/zcl_abapgit_proxy_config.clas.abap.html @@ -0,0 +1,421 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_proxy_config.clas.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_proxy_config.clas.abap

+
+ +
+ 98.21% + Statements + 110/112 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.21% + Lines + 110/112 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +1131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_proxy_config DEFINITION PUBLIC FINAL CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor,
+ 
+      get_proxy_url
+        IMPORTING
+          iv_repo_url         TYPE csequence OPTIONAL
+        RETURNING
+          VALUE(rv_proxy_url) TYPE string,
+ 
+      get_proxy_port
+        IMPORTING
+          iv_repo_url    TYPE csequence OPTIONAL
+        RETURNING
+          VALUE(rv_port) TYPE string,
+ 
+      get_proxy_authentication
+        IMPORTING
+          iv_repo_url    TYPE csequence OPTIONAL
+        RETURNING
+          VALUE(rv_auth) TYPE abap_bool.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA: mo_settings TYPE REF TO zcl_abapgit_settings,
+          mi_exit     TYPE REF TO zif_abapgit_exit.
+ 
+    METHODS:
+      bypass_proxy
+        IMPORTING
+          iv_repo_url            TYPE csequence OPTIONAL
+        RETURNING
+          VALUE(rv_bypass_proxy) TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PROXY_CONFIG IMPLEMENTATION.
+ 
+ 
+  METHOD bypass_proxy.
+ 
+    DATA lt_proxy_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url.
+ 
+    lt_proxy_bypass = mo_settings->get_proxy_bypass( ).
+ 
+    IF lt_proxy_bypass IS NOT INITIAL
+    AND iv_repo_url IN lt_proxy_bypass.
+      rv_bypass_proxy = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    mi_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_authentication.
+ 
+    IF bypass_proxy( iv_repo_url ) = abap_false.
+      rv_auth = mo_settings->get_proxy_authentication( ).
+    ENDIF.
+ 
+    mi_exit->change_proxy_authentication(
+      EXPORTING
+        iv_repo_url            = iv_repo_url
+      CHANGING
+        cv_proxy_authentication = rv_auth ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_port.
+ 
+    IF bypass_proxy( iv_repo_url ) = abap_false.
+      rv_port = mo_settings->get_proxy_port( ).
+    ENDIF.
+ 
+    mi_exit->change_proxy_port(
+      EXPORTING
+        iv_repo_url  = iv_repo_url
+      CHANGING
+        cv_proxy_port = rv_port ).
+ 
+    CONDENSE rv_port.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_url.
+ 
+    IF bypass_proxy( iv_repo_url ) = abap_false.
+      rv_proxy_url = mo_settings->get_proxy_url( ).
+    ENDIF.
+ 
+    mi_exit->change_proxy_url(
+      EXPORTING
+        iv_repo_url = iv_repo_url
+      CHANGING
+        cv_proxy_url = rv_proxy_url ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_url.clas.abap.html b/src/http/zcl_abapgit_url.clas.abap.html new file mode 100644 index 00000000000..88f06f4a19d --- /dev/null +++ b/src/http/zcl_abapgit_url.clas.abap.html @@ -0,0 +1,589 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_url.clas.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_url.clas.abap

+
+ +
+ 97.61% + Statements + 164/168 +
+ + +
+ 60% + Branches + 6/10 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 97.61% + Lines + 164/168 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +1691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +3x +3x +  +  +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +12x +12x +12x +2x +  +12x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x + 
CLASS zcl_abapgit_url DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS validate
+      IMPORTING
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS host
+      IMPORTING
+        !iv_url        TYPE string
+      RETURNING
+        VALUE(rv_host) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS name
+      IMPORTING
+        !iv_url        TYPE string
+        !iv_validate   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_name) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS path_name
+      IMPORTING
+        !iv_url             TYPE string
+      RETURNING
+        VALUE(rv_path_name) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_abapgit_repo
+      IMPORTING
+        !iv_url           TYPE string
+      RETURNING
+        VALUE(rv_abapgit) TYPE abap_bool .
+    CLASS-METHODS url_address
+      IMPORTING
+        !iv_url          TYPE string
+      RETURNING
+        VALUE(rv_adress) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS regex
+      IMPORTING
+        !iv_url  TYPE string
+      EXPORTING
+        !ev_host TYPE string
+        !ev_path TYPE string
+        !ev_name TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_url IMPLEMENTATION.
+ 
+ 
+  METHOD host.
+ 
+    regex( EXPORTING iv_url = iv_url
+           IMPORTING ev_host = rv_host ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_abapgit_repo.
+ 
+    IF iv_url CS 'github.com' AND ( iv_url CP '*/abapGit' OR iv_url CP '*/abapGit.git' ).
+      rv_abapgit = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD name.
+ 
+    DATA: lv_path TYPE string.
+ 
+    TRY.
+        regex( EXPORTING iv_url = iv_url
+               IMPORTING ev_name = rv_name
+                         ev_path = lv_path ).
+ 
+        IF rv_name IS INITIAL.
+          FIND REGEX '([\w-]+)/$' IN lv_path SUBMATCHES rv_name.
+          IF sy-subrc <> 0.
+            zcx_abapgit_exception=>raise( 'Malformed URL' ).
+          ENDIF.
+        ENDIF.
+ 
+      CATCH zcx_abapgit_exception.
+        IF iv_validate = abap_true.
+          zcx_abapgit_exception=>raise( 'Malformed URL' ).
+        ELSE.
+          rv_name = 'URL error (fix repo with "Advanced > Change Remote")'.
+        ENDIF.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD path_name.
+ 
+    DATA: lv_host TYPE string ##NEEDED.
+ 
+    FIND REGEX '(.*://[^/]*)(.*)' IN iv_url
+      SUBMATCHES lv_host rv_path_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD regex.
+ 
+    FIND REGEX '^(https?://[^/]*)(.*/)(.*)\.git$' IN iv_url
+      SUBMATCHES ev_host ev_path ev_name.
+    IF sy-subrc <> 0.
+      FIND REGEX '^(https?://[^/]*)(.*/)(.*)$' IN iv_url
+        SUBMATCHES ev_host ev_path ev_name.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( 'Malformed URL' ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD url_address.
+ 
+    DATA:
+      lv_host TYPE string,
+      lv_path TYPE string,
+      lv_name TYPE string,
+      lv_len  TYPE i.
+ 
+    regex( EXPORTING iv_url  = iv_url
+           IMPORTING ev_host = lv_host
+                     ev_path = lv_path
+                     ev_name = lv_name ).
+ 
+    IF lv_path IS INITIAL AND lv_name IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Malformed URL' ).
+    ELSEIF lv_name IS INITIAL.
+      lv_len = strlen( lv_path ) - 1.
+      IF lv_path+lv_len(1) = '/'.
+        lv_path = lv_path(lv_len).
+      ENDIF.
+    ENDIF.
+ 
+    rv_adress = |{ lv_host }{ lv_path }{ lv_name }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate.
+ 
+    name( iv_url      = iv_url
+          iv_validate = abap_true ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/http/zcl_abapgit_url.clas.testclasses.abap.html b/src/http/zcl_abapgit_url.clas.testclasses.abap.html new file mode 100644 index 00000000000..5bd1777015a --- /dev/null +++ b/src/http/zcl_abapgit_url.clas.testclasses.abap.html @@ -0,0 +1,745 @@ + + + + + + Code coverage report for src/http/zcl_abapgit_url.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/http zcl_abapgit_url.clas.testclasses.abap

+
+ +
+ 100% + Statements + 220/220 +
+ + +
+ 100% + Branches + 16/16 +
+ + +
+ 100% + Functions + 16/16 +
+ + +
+ 100% + Lines + 220/220 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +2211x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS:
+      repo_host FOR TESTING RAISING zcx_abapgit_exception,
+      repo_name1 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_name2 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_name3 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_name4 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_name5 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_address1 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_address2 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_address3 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_address4 FOR TESTING RAISING zcx_abapgit_exception,
+      repo_address5_dots FOR TESTING RAISING zcx_abapgit_exception,
+      repo_address6_dots_and_git FOR TESTING RAISING zcx_abapgit_exception,
+      repo_error FOR TESTING,
+      url_validate1 FOR TESTING,
+      url_validate2 FOR TESTING,
+      url_validate3 FOR TESTING.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD repo_error.
+ 
+    TRY.
+        zcl_abapgit_url=>host( 'not a real url' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.                      "#EC NO_HANDLER
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_host.
+ 
+    DATA: lv_host TYPE string.
+ 
+    lv_host = zcl_abapgit_url=>host( 'https://github.com/larshp/Foobar.git' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'https://github.com'
+        act = lv_host ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_name1.
+ 
+    DATA: lv_name TYPE string.
+ 
+    lv_name = zcl_abapgit_url=>name( 'https://github.com/larshp/Foobar.git' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'Foobar'
+        act = lv_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_name2.
+ 
+    DATA: lv_name TYPE string.
+ 
+    lv_name = zcl_abapgit_url=>name( 'https://git.hanatrial.ondemand.com/p12345trial/yay' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'yay'
+        act = lv_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_name3.
+ 
+    DATA: lv_name TYPE string.
+ 
+    lv_name = zcl_abapgit_url=>name( 'https://github.com/larshp/Foobar/' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'Foobar'
+        act = lv_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_name4.
+ 
+    DATA: lv_name TYPE string.
+ 
+    lv_name = zcl_abapgit_url=>name( 'https://github.com/larshp/foo-bar/' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'foo-bar'
+        act = lv_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_name5.
+ 
+    DATA: lv_name TYPE string.
+ 
+    lv_name = zcl_abapgit_url=>name( 'https://github.com/larshp/foo_bar/' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'foo_bar'
+        act = lv_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_address1.
+ 
+    DATA:
+      lv_url_address TYPE string.
+ 
+    lv_url_address = zcl_abapgit_url=>url_address( 'https://github.com/abapGit/abapGit.git' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'https://github.com/abapGit/abapGit'
+        act = lv_url_address ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_address2.
+ 
+    DATA:
+      lv_url_address TYPE string.
+ 
+    lv_url_address = zcl_abapgit_url=>url_address( 'https://git.hanatrial.ondemand.com/abapGit/abapGit.git' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'https://git.hanatrial.ondemand.com/abapGit/abapGit'
+        act = lv_url_address ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_address3.
+ 
+    DATA:
+      lv_url_address TYPE string.
+ 
+    lv_url_address = zcl_abapgit_url=>url_address( 'https://github.com/abapGit/abapGit/' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'https://github.com/abapGit/abapGit'
+        act = lv_url_address ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_address4.
+ 
+    DATA:
+      lv_url_address TYPE string.
+ 
+    lv_url_address = zcl_abapgit_url=>url_address( 'https://github.com/abapGit/abapGit' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'https://github.com/abapGit/abapGit'
+        act = lv_url_address ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_address5_dots.
+ 
+    DATA:
+      lv_url_address TYPE string.
+ 
+    lv_url_address = zcl_abapgit_url=>url_address( 'https://github.com/jfilak/abap.awesome.app1' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'https://github.com/jfilak/abap.awesome.app1'
+        act = lv_url_address ).
+ 
+  ENDMETHOD.
+ 
+  METHOD repo_address6_dots_and_git.
+ 
+    DATA:
+      lv_url_address TYPE string.
+ 
+    lv_url_address = zcl_abapgit_url=>url_address( 'https://github.com/jfilak/abap.awesome.app1.git' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+        exp = 'https://github.com/jfilak/abap.awesome.app1'
+        act = lv_url_address ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD url_validate1.
+ 
+    TRY.
+        zcl_abapgit_url=>validate( 'http://github.com/larshp/Foobar.git' ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD url_validate2.
+ 
+    TRY.
+        zcl_abapgit_url=>validate( 'https://github.com/larshp/Foobar.git' ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD url_validate3.
+ 
+    TRY.
+        zcl_abapgit_url=>validate( 'XYZ://github.com/larshp/Foobar.git' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.                      "#EC NO_HANDLER
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/index.html b/src/index.html new file mode 100644 index 00000000000..48981e07195 --- /dev/null +++ b/src/index.html @@ -0,0 +1,206 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 89.83% + Statements + 1758/1957 +
+ + +
+ 85.71% + Branches + 48/56 +
+ + +
+ 53.96% + Functions + 34/63 +
+ + +
+ 89.83% + Lines + 1758/1957 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_factory.clas.abap +
+
98.23%222/22660%3/5100%0/098.23%222/226
zcl_abapgit_injector.clas.abap +
+
100%143/143100%1/1100%0/0100%143/143
zcl_abapgit_injector.clas.testclasses.abap +
+
62.63%57/91100%0/00%0/362.63%57/91
zcl_abapgit_settings.clas.abap +
+
82.65%405/490100%1/14.34%1/2382.65%405/490
zcx_abapgit_exception.clas.abap +
+
89.34%411/46064.7%11/1725%1/489.34%411/460
zcx_abapgit_exception.clas.testclasses.abap +
+
94.8%493/520100%32/3296.96%32/3394.8%493/520
zcx_abapgit_not_found.clas.abap +
+
100%27/27100%0/0100%0/0100%27/27
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/inspect/index.html b/src/inspect/index.html new file mode 100644 index 00000000000..9f12f9c5c2d --- /dev/null +++ b/src/inspect/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/inspect + + + + + + + + + +
+
+

All files src/inspect

+
+ +
+ 87.65% + Statements + 362/413 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 87.65% + Lines + 362/413 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_code_inspector.clas.abap +
+
87.65%362/413100%0/00%0/387.65%362/413
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/inspect/zcl_abapgit_code_inspector.clas.abap.html b/src/inspect/zcl_abapgit_code_inspector.clas.abap.html new file mode 100644 index 00000000000..baaf9f14cc3 --- /dev/null +++ b/src/inspect/zcl_abapgit_code_inspector.clas.abap.html @@ -0,0 +1,1324 @@ + + + + + + Code coverage report for src/inspect/zcl_abapgit_code_inspector.clas.abap + + + + + + + + + +
+
+

All files / src/inspect zcl_abapgit_code_inspector.clas.abap

+
+ +
+ 87.65% + Statements + 362/413 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 87.65% + Lines + 362/413 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +4141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_code_inspector DEFINITION
+  PUBLIC
+  CREATE PROTECTED
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_code_inspector .
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+    DATA mv_package TYPE devclass .
+ 
+    METHODS create_variant
+      IMPORTING
+        !iv_variant       TYPE sci_chkv
+      RETURNING
+        VALUE(ro_variant) TYPE REF TO cl_ci_checkvariant
+      RAISING
+        zcx_abapgit_exception .
+    METHODS cleanup
+      IMPORTING
+        !io_set TYPE REF TO cl_ci_objectset
+      RAISING
+        zcx_abapgit_exception .
+    METHODS skip_object
+      IMPORTING
+        !is_obj        TYPE scir_objs
+      RETURNING
+        VALUE(rv_skip) TYPE abap_bool.
+  PRIVATE SECTION.
+ 
+    DATA mv_success TYPE abap_bool .
+    DATA mv_summary TYPE string.
+ 
+    TYPES: ty_run_mode TYPE c LENGTH 1.
+ 
+    CONSTANTS:
+      BEGIN OF co_run_mode,
+        run_with_popup   TYPE ty_run_mode VALUE 'P',
+        run_after_popup  TYPE ty_run_mode VALUE 'A',
+        run_via_rfc      TYPE ty_run_mode VALUE 'R',
+        run_in_batch     TYPE ty_run_mode VALUE 'B',
+        run_loc_parallel TYPE ty_run_mode VALUE 'L',
+        run_direct       TYPE ty_run_mode VALUE 'L',
+      END OF co_run_mode .
+    DATA mo_inspection TYPE REF TO cl_ci_inspection .
+    DATA mv_name TYPE sci_objs .
+    DATA mv_run_mode TYPE c LENGTH 1 .
+ 
+    METHODS create_objectset
+      RETURNING
+        VALUE(ro_set) TYPE REF TO cl_ci_objectset .
+    METHODS run_inspection
+      IMPORTING
+        !io_inspection TYPE REF TO cl_ci_inspection
+      RETURNING
+        VALUE(rt_list) TYPE scit_alvlist
+      RAISING
+        zcx_abapgit_exception .
+    METHODS create_inspection
+      IMPORTING
+        !io_set              TYPE REF TO cl_ci_objectset
+        !io_variant          TYPE REF TO cl_ci_checkvariant
+      RETURNING
+        VALUE(ro_inspection) TYPE REF TO cl_ci_inspection
+      RAISING
+        zcx_abapgit_exception .
+    METHODS decide_run_mode
+      RETURNING
+        VALUE(rv_run_mode) TYPE ty_run_mode .
+    METHODS filter_inspection
+      CHANGING
+        !ct_list TYPE scit_alvlist .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_CODE_INSPECTOR IMPLEMENTATION.
+ 
+ 
+  METHOD cleanup.
+
+    IF mo_inspection IS BOUND.
+
+      mo_inspection->delete(
+        EXCEPTIONS
+          locked              = 1
+          error_in_enqueue    = 2
+          not_authorized      = 3
+          exceptn_appl_exists = 4
+          OTHERS              = 5 ).
+
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Couldn't delete inspection. Subrc = { sy-subrc }| ).
+      ENDIF.
+
+    ENDIF.
+
+    io_set->delete(
+      EXCEPTIONS
+        exists_in_insp   = 1
+        locked           = 2
+        error_in_enqueue = 3
+        not_authorized   = 4
+        exists_in_objs   = 5
+        OTHERS           = 6 ).
+
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Couldn't delete objectset. Subrc = { sy-subrc }| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    IF iv_package IS INITIAL.
+      zcx_abapgit_exception=>raise( |Please supply package| ).
+    ENDIF.
+ 
+    mv_package = iv_package.
+ 
+    " We create the inspection and objectset with dummy names.
+    " Because we want to persist them so we can run it in parallel.
+    " Both are deleted afterwards.
+    mv_name = |{ sy-uname }_{ sy-datum }_{ sy-uzeit }|.
+    mv_run_mode = decide_run_mode( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_inspection.
+ 
+    cl_ci_inspection=>create(
+      EXPORTING
+        p_user           = sy-uname
+        p_name           = mv_name
+      RECEIVING
+        p_ref            = ro_inspection
+      EXCEPTIONS
+        locked           = 1
+        error_in_enqueue = 2
+        not_authorized   = 3
+        OTHERS           = 4 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Failed to create inspection. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+    ro_inspection->set(
+      p_chkv = io_variant
+      p_objs = io_set ).
+ 
+    ro_inspection->save(
+      EXCEPTIONS
+        missing_information = 1
+        insp_no_name        = 2
+        not_enqueued        = 3
+        OTHERS              = 4 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Failed to save inspection. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_objectset.
+ 
+    DATA: lt_objs       TYPE scit_objs,
+          ls_obj        TYPE scir_objs,
+          lt_objs_check TYPE scit_objs,
+          ls_item       TYPE zif_abapgit_definitions=>ty_item,
+          lt_packages   TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    lt_packages = zcl_abapgit_factory=>get_sap_package( mv_package )->list_subpackages( ).
+    INSERT mv_package INTO TABLE lt_packages.
+ 
+    SELECT object AS objtype obj_name AS objname
+      FROM tadir
+      INTO CORRESPONDING FIELDS OF TABLE lt_objs
+      FOR ALL ENTRIES IN lt_packages
+      WHERE devclass = lt_packages-table_line
+      AND delflag = abap_false
+      AND pgmid = 'R3TR' ##TOO_MANY_ITAB_FIELDS.        "#EC CI_GENBUFF
+ 
+    LOOP AT lt_objs INTO ls_obj.
+ 
+      IF skip_object( ls_obj ) = abap_true.
+        CONTINUE.
+      ENDIF.
+ 
+      ls_item-obj_type = ls_obj-objtype.
+      ls_item-obj_name = ls_obj-objname.
+ 
+      IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+        CONTINUE.
+      ENDIF.
+ 
+      INSERT ls_obj INTO TABLE lt_objs_check.
+ 
+    ENDLOOP.
+ 
+    ro_set = cl_ci_objectset=>save_from_list(
+      p_name    = mv_name
+      p_objects = lt_objs_check ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_variant.
+ 
+    IF iv_variant IS INITIAL.
+      zcx_abapgit_exception=>raise( |No check variant supplied.| ).
+    ENDIF.
+ 
+    cl_ci_checkvariant=>get_ref(
+      EXPORTING
+        p_user                   = ''
+        p_name                   = iv_variant
+      RECEIVING
+        p_ref                    = ro_variant
+      EXCEPTIONS
+        chkv_not_exists          = 1
+        missing_parameter        = 2
+        OTHERS                   = 3 ).
+ 
+    CASE sy-subrc.
+      WHEN 1.
+        zcx_abapgit_exception=>raise( |Check variant { iv_variant } doesn't exist| ).
+      WHEN 2.
+        zcx_abapgit_exception=>raise( |Parameter missing for check variant { iv_variant }| ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD decide_run_mode.
+ 
+    DATA lo_settings TYPE REF TO zcl_abapgit_settings.
+    lo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    IF sy-batch = abap_true.
+      " We have to disable parallelization in batch because of lock errors.
+      rv_run_mode = co_run_mode-run_via_rfc.
+    ELSEIF lo_settings->get_parallel_proc_disabled( ) = abap_false.
+      rv_run_mode = co_run_mode-run_loc_parallel.
+    ELSE.
+      rv_run_mode = co_run_mode-run_via_rfc.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_inspection.
+
+    " Remove findings in LSVIM* includes which are part of generated maintenance screens
+    DELETE ct_list WHERE sobjtype = 'PROG' AND sobjname CP 'LSVIM*'.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD run_inspection.
+ 
+    io_inspection->run(
+      EXPORTING
+        p_howtorun            = mv_run_mode
+      EXCEPTIONS
+        invalid_check_version = 1
+        OTHERS                = 2 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Code inspector run failed. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+    io_inspection->plain_list( IMPORTING p_list = rt_list ).
+ 
+    filter_inspection( CHANGING ct_list = rt_list ).
+ 
+    SORT rt_list BY objtype objname test code sobjtype sobjname line col.
+ 
+    DELETE ADJACENT DUPLICATES FROM rt_list.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD skip_object.
+ 
+    DATA ls_program_type TYPE subc.
+ 
+    CASE is_obj-objtype.
+      WHEN 'PROG'.
+ 
+        SELECT SINGLE subc
+          INTO ls_program_type
+          FROM trdir
+          WHERE name = is_obj-objname.
+ 
+        rv_skip = boolc( ls_program_type = 'I' ). " Include program.
+ 
+      WHEN OTHERS.
+        rv_skip = abap_false.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~get_summary.
+    rv_summary = mv_summary.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~is_successful.
+ 
+    rv_success = mv_success.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~list_global_variants.
+ 
+    SELECT scichkv_hd~checkvname AS name
+      scichkv_tx~text AS description
+      INTO TABLE rt_list
+      FROM scichkv_hd
+      LEFT OUTER JOIN scichkv_tx
+      ON scichkv_hd~checkvid = scichkv_tx~checkvid
+      AND scichkv_hd~ciuser  = scichkv_tx~ciuser
+      AND scichkv_tx~language = sy-langu
+      WHERE scichkv_hd~ciuser = space.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~run.
+ 
+    DATA: lo_set     TYPE REF TO cl_ci_objectset,
+          lo_variant TYPE REF TO cl_ci_checkvariant,
+          lv_count   TYPE i,
+          lt_list    TYPE scit_alvlist,
+          ls_list    LIKE LINE OF lt_list,
+          ls_result  LIKE LINE OF rt_list,
+          lo_timer   TYPE REF TO zcl_abapgit_timer,
+          lx_error   TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        lo_set = create_objectset( ).
+ 
+        lv_count = lines( lo_set->iobjlst-objects ).
+        IF lv_count = 0.
+          " no objects, nothing to check
+          RETURN.
+        ENDIF.
+ 
+        lo_timer = zcl_abapgit_timer=>create( iv_count = lv_count )->start( ).
+ 
+        lo_variant = create_variant( iv_variant ).
+ 
+        mo_inspection = create_inspection(
+          io_set     = lo_set
+          io_variant = lo_variant ).
+ 
+        lt_list = run_inspection( mo_inspection ).
+ 
+        cleanup( lo_set ).
+ 
+        LOOP AT lt_list INTO ls_list.
+          MOVE-CORRESPONDING ls_list TO ls_result.
+          INSERT ls_result INTO TABLE rt_list.
+        ENDLOOP.
+ 
+        IF iv_save = abap_true.
+          READ TABLE rt_list TRANSPORTING NO FIELDS WITH KEY kind = 'E'.
+          mv_success = boolc( sy-subrc <> 0 ).
+        ENDIF.
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+ 
+        " ensure cleanup
+        cleanup( lo_set ).
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+ 
+    ENDTRY.
+ 
+    mv_summary = lo_timer->end( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_code_inspector~validate_check_variant.
+
+    cl_ci_checkvariant=>get_ref(
+      EXPORTING
+        p_user                   = ''
+        p_name                   = iv_check_variant_name
+      EXCEPTIONS
+        chkv_not_exists          = 1
+        missing_parameter        = 2
+        OTHERS                   = 3 ).
+
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |No valid check variant { iv_check_variant_name  }| ).
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/index.html b/src/json/index.html new file mode 100644 index 00000000000..3b610af9801 --- /dev/null +++ b/src/json/index.html @@ -0,0 +1,296 @@ + + + + + + Code coverage report for src/json + + + + + + + + + +
+
+

All files src/json

+
+ +
+ 98.32% + Statements + 10208/10382 +
+ + +
+ 88.4% + Branches + 488/552 +
+ + +
+ 97.47% + Functions + 193/198 +
+ + +
+ 98.32% + Lines + 10208/10382 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_ajson.clas.abap +
+
96.99%936/96587.03%94/108100%4/496.99%936/965
zcl_abapgit_ajson.clas.locals_imp.abap +
+
95.67%1946/203481.56%177/21794.44%17/1895.67%1946/2034
zcl_abapgit_ajson.clas.testclasses.abap +
+
99.3%4706/473999.23%130/13199.18%122/12399.3%4706/4739
zcl_abapgit_ajson_filter_lib.clas.abap +
+
100%58/58100%0/0100%0/0100%58/58
zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap +
+
96.52%139/14477.77%7/90%0/196.52%139/144
zcl_abapgit_ajson_filter_lib.clas.testclasses.abap +
+
100%230/230100%7/7100%7/7100%230/230
zcl_abapgit_ajson_mapping.clas.abap +
+
100%156/156100%0/0100%0/0100%156/156
zcl_abapgit_ajson_mapping.clas.locals_imp.abap +
+
96.48%329/34177.77%14/1875%6/896.48%329/341
zcl_abapgit_ajson_mapping.clas.testclasses.abap +
+
100%544/544100%20/20100%20/20100%544/544
zcl_abapgit_ajson_utilities.clas.abap +
+
98.94%374/37891.66%22/24100%5/598.94%374/378
zcl_abapgit_ajson_utilities.clas.testclasses.abap +
+
100%543/543100%7/7100%7/7100%543/543
zcx_abapgit_ajson_error.clas.abap +
+
97.81%134/13785.71%6/7100%1/197.81%134/137
zcx_abapgit_ajson_error.clas.testclasses.abap +
+
100%113/113100%4/4100%4/4100%113/113
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson.clas.abap.html b/src/json/zcl_abapgit_ajson.clas.abap.html new file mode 100644 index 00000000000..17c2fb1db77 --- /dev/null +++ b/src/json/zcl_abapgit_ajson.clas.abap.html @@ -0,0 +1,2980 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson.clas.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson.clas.abap

+
+ +
+ 96.99% + Statements + 936/965 +
+ + +
+ 87.03% + Branches + 94/108 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 96.99% + Lines + 936/965 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +9661x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +37x +37x +24x +24x +24x +37x +14x +14x +37x +37x +37x +37x +37x +35x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +154x +154x +25x +25x +25x +25x +6x +6x +6x +25x +25x +1x +17x +17x +8x +8x +7x +7x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +84x +84x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +65x +65x +65x +65x +65x +65x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +114x +114x +40x +40x +11x +10x +10x +10x +40x +113x +113x +113x +113x +113x +305x +305x +305x +191x +191x +1x +1x +1x +1x +1x +1x +271x +5x +  +271x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +4x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +4x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +17x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +20x +20x +20x +20x +1x +  +19x +19x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +210x +210x +210x +1x +9x +9x +201x +201x +1x +1x +  +  +201x +201x +201x +29x +  +  +  +  +  +  +  +29x +29x +29x +29x +29x +29x +29x +29x +172x +172x +1x +171x +171x +171x +171x +171x +171x +171x +171x +171x +171x +171x +171x +171x +171x +9x +7x +7x +1x +162x +5x +5x +169x +169x +41x +41x +41x +41x +41x +41x +41x +41x +41x +128x +128x +128x +128x +128x +128x +128x +128x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +26x +1x +1x +1x +25x +8x +8x +8x +8x +24x +1x +1x +1x +1x +16x +7x +7x +7x +7x +7x +7x +5x +8x +8x +3x +3x +3x +3x +3x +8x +8x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +27x +27x +27x +4x +4x +4x +4x +4x +4x +23x +23x +2x +2x +2x +2x +21x +21x +23x +23x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +1x +1x +18x +18x +18x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +10x +10x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_ajson DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_ajson .
+ 
+    ALIASES:
+      is_empty FOR zif_abapgit_ajson~is_empty,
+      exists FOR zif_abapgit_ajson~exists,
+      members FOR zif_abapgit_ajson~members,
+      get FOR zif_abapgit_ajson~get,
+      get_boolean FOR zif_abapgit_ajson~get_boolean,
+      get_integer FOR zif_abapgit_ajson~get_integer,
+      get_number FOR zif_abapgit_ajson~get_number,
+      get_date FOR zif_abapgit_ajson~get_date,
+      get_timestamp FOR zif_abapgit_ajson~get_timestamp,
+      get_string FOR zif_abapgit_ajson~get_string,
+      slice FOR zif_abapgit_ajson~slice,
+      to_abap FOR zif_abapgit_ajson~to_abap,
+      array_to_string_table FOR zif_abapgit_ajson~array_to_string_table.
+ 
+    ALIASES:
+      clear FOR zif_abapgit_ajson~clear,
+      set FOR zif_abapgit_ajson~set,
+      setx FOR zif_abapgit_ajson~setx,
+      set_boolean FOR zif_abapgit_ajson~set_boolean,
+      set_string FOR zif_abapgit_ajson~set_string,
+      set_integer FOR zif_abapgit_ajson~set_integer,
+      set_date FOR zif_abapgit_ajson~set_date,
+      set_timestamp FOR zif_abapgit_ajson~set_timestamp,
+      set_null FOR zif_abapgit_ajson~set_null,
+      delete FOR zif_abapgit_ajson~delete,
+      touch_array FOR zif_abapgit_ajson~touch_array,
+      push FOR zif_abapgit_ajson~push,
+      stringify FOR zif_abapgit_ajson~stringify.
+ 
+    ALIASES:
+      clone FOR zif_abapgit_ajson~clone,
+      filter FOR zif_abapgit_ajson~filter,
+      map FOR zif_abapgit_ajson~map.
+ 
+    ALIASES:
+      mt_json_tree FOR zif_abapgit_ajson~mt_json_tree,
+      keep_item_order FOR zif_abapgit_ajson~keep_item_order,
+      format_datetime FOR zif_abapgit_ajson~format_datetime,
+      to_abap_corresponding_only FOR zif_abapgit_ajson~to_abap_corresponding_only,
+      freeze FOR zif_abapgit_ajson~freeze.
+ 
+    CLASS-METHODS parse
+      IMPORTING
+        !iv_json            TYPE string
+        !iv_freeze          TYPE abap_bool DEFAULT abap_false
+        !ii_custom_mapping  TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        !iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+ 
+    CLASS-METHODS create_empty " Might be deprecated, prefer using new( ) or create object
+      IMPORTING
+        !ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+        iv_format_datetime TYPE abap_bool DEFAULT abap_true
+        iv_to_abap_corresponding_only TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson.
+ 
+    " Experimental ! May change
+    CLASS-METHODS create_from " TODO, rename to 'from' ?
+      IMPORTING
+        !ii_source_json TYPE REF TO zif_abapgit_ajson
+        !ii_filter TYPE REF TO zif_abapgit_ajson_filter OPTIONAL " Might be deprecated, use filter() instead
+        !ii_mapper TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL " Might be deprecated, use map() instead
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+ 
+    METHODS constructor
+      IMPORTING
+        iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+        iv_format_datetime TYPE abap_bool DEFAULT abap_true
+        iv_to_abap_corresponding_only TYPE abap_bool DEFAULT abap_false.
+    CLASS-METHODS new
+      IMPORTING
+        iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+        iv_format_datetime TYPE abap_bool DEFAULT abap_true
+        iv_to_abap_corresponding_only TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson.
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_float_regex TYPE REF TO cl_abap_regex.
+ 
+    DATA ms_opts TYPE zif_abapgit_ajson=>ty_opts.
+    DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping. " DEPRECATED, will be removed
+ 
+    METHODS get_item
+      IMPORTING
+        iv_path        TYPE string
+      RETURNING
+        VALUE(rv_item) TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    METHODS prove_path_exists
+      IMPORTING
+        iv_path              TYPE string
+      RETURNING
+        VALUE(rr_end_node) TYPE REF TO zif_abapgit_ajson_types=>ty_node
+      RAISING
+        zcx_abapgit_ajson_error.
+    METHODS delete_subtree
+      IMPORTING
+        iv_path           TYPE string
+        iv_name           TYPE string
+        ir_parent         TYPE REF TO zif_abapgit_ajson_types=>ty_node OPTIONAL
+      RETURNING
+        VALUE(rs_top_node) TYPE zif_abapgit_ajson_types=>ty_node.
+    METHODS read_only_watchdog
+      RAISING
+        zcx_abapgit_ajson_error.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ajson IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    ms_opts-keep_item_order = iv_keep_item_order.
+    ms_opts-to_abap_corresponding_only = iv_to_abap_corresponding_only.
+    format_datetime( iv_format_datetime ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create_empty.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_to_abap_corresponding_only = iv_to_abap_corresponding_only
+        iv_format_datetime = iv_format_datetime
+        iv_keep_item_order = iv_keep_item_order.
+    ro_instance->mi_custom_mapping = ii_custom_mapping.
+  ENDMETHOD.
+ 
+ 
+  METHOD create_from.
+ 
+    DATA lo_mutator_queue TYPE REF TO lcl_mutator_queue.
+ 
+    IF ii_source_json IS NOT BOUND.
+      zcx_abapgit_ajson_error=>raise( 'Source not bound' ).
+    ENDIF.
+ 
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_to_abap_corresponding_only = ii_source_json->opts( )-to_abap_corresponding_only
+        iv_format_datetime = ii_source_json->opts( )-format_datetime
+        iv_keep_item_order = ii_source_json->opts( )-keep_item_order.
+ 
+    IF ii_filter IS NOT BOUND AND ii_mapper IS NOT BOUND.
+      ro_instance->mt_json_tree = ii_source_json->mt_json_tree.
+    ELSE.
+      CREATE OBJECT lo_mutator_queue.
+      IF ii_mapper IS BOUND.
+        " Mapping goes first. But maybe it should be a freely definable queue of processors ?
+        lo_mutator_queue->add( lcl_mapper_runner=>new( ii_mapper ) ).
+      ENDIF.
+      IF ii_filter IS BOUND.
+        lo_mutator_queue->add( lcl_filter_runner=>new( ii_filter ) ).
+      ENDIF.
+      lo_mutator_queue->lif_mutator_runner~run(
+        EXPORTING
+          it_source_tree = ii_source_json->mt_json_tree
+        IMPORTING
+          et_dest_tree = ro_instance->mt_json_tree ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_subtree.
+ 
+    DATA lv_parent_path TYPE string.
+    DATA lr_parent LIKE ir_parent.
+ 
+    READ TABLE mt_json_tree INTO rs_top_node
+      WITH KEY
+        path = iv_path
+        name = iv_name.
+    IF sy-subrc <> 0.
+      RETURN. " Not found ? nothing to delete !
+    ENDIF.
+ 
+    DELETE mt_json_tree INDEX sy-tabix. " where path = iv_path and name = iv_name.
+ 
+    IF rs_top_node-children > 0. " only for objects and arrays
+      lv_parent_path = iv_path && iv_name && '/*'.
+      DELETE mt_json_tree WHERE path CP lv_parent_path.
+    ENDIF.
+ 
+    " decrement parent children
+    IF ir_parent IS SUPPLIED.
+      ir_parent->children = ir_parent->children - 1.
+    ELSE.
+      lr_parent = get_item( iv_path ).
+      IF lr_parent IS NOT INITIAL.
+        lr_parent->children = lr_parent->children - 1.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_item.
+ 
+    FIELD-SYMBOLS <item> LIKE LINE OF mt_json_tree.
+    DATA ls_path_name TYPE zif_abapgit_ajson_types=>ty_path_name.
+    ls_path_name = lcl_utils=>split_path( iv_path ).
+ 
+    READ TABLE mt_json_tree
+      ASSIGNING <item>
+      WITH KEY
+        path = ls_path_name-path
+        name = ls_path_name-name.
+    IF sy-subrc = 0.
+      GET REFERENCE OF <item> INTO rv_item.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_to_abap_corresponding_only = iv_to_abap_corresponding_only
+        iv_format_datetime = iv_format_datetime
+        iv_keep_item_order = iv_keep_item_order.
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA lo_parser TYPE REF TO lcl_json_parser.
+ 
+    CREATE OBJECT ro_instance.
+    CREATE OBJECT lo_parser.
+    ro_instance->mt_json_tree = lo_parser->parse(
+      iv_json            = iv_json
+      iv_keep_item_order = iv_keep_item_order ).
+    ro_instance->mi_custom_mapping = ii_custom_mapping.
+    ro_instance->ms_opts-keep_item_order = iv_keep_item_order.
+ 
+    IF iv_freeze = abap_true.
+      ro_instance->freeze( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD prove_path_exists.
+ 
+    DATA lt_path TYPE string_table.
+    DATA lr_node_parent LIKE rr_end_node.
+    DATA lv_cur_path TYPE string.
+    DATA lv_cur_name TYPE string.
+    DATA ls_new_node LIKE LINE OF mt_json_tree.
+ 
+    SPLIT iv_path AT '/' INTO TABLE lt_path.
+    DELETE lt_path WHERE table_line IS INITIAL.
+ 
+    DO.
+      lr_node_parent = rr_end_node.
+      READ TABLE mt_json_tree REFERENCE INTO rr_end_node
+        WITH KEY
+          path = lv_cur_path
+          name = lv_cur_name.
+      IF sy-subrc <> 0. " New node, assume it is always object as it has a named child, use touch_array to init array
+        CLEAR ls_new_node.
+        IF lr_node_parent IS NOT INITIAL. " if has parent
+          lr_node_parent->children = lr_node_parent->children + 1.
+          IF lr_node_parent->type = zif_abapgit_ajson_types=>node_type-array.
+            ls_new_node-index = lcl_utils=>validate_array_index(
+              iv_path  = lv_cur_path
+              iv_index = lv_cur_name ).
+          ENDIF.
+        ENDIF.
+        ls_new_node-path = lv_cur_path.
+        ls_new_node-name = lv_cur_name.
+        ls_new_node-type = zif_abapgit_ajson_types=>node_type-object.
+        INSERT ls_new_node INTO TABLE mt_json_tree REFERENCE INTO rr_end_node.
+      ENDIF.
+      lv_cur_path = lv_cur_path && lv_cur_name && '/'.
+      READ TABLE lt_path INDEX sy-index INTO lv_cur_name.
+      IF sy-subrc <> 0.
+        EXIT. " no more segments
+      ENDIF.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_only_watchdog.
+    IF ms_opts-read_only = abap_true.
+      zcx_abapgit_ajson_error=>raise( 'This json instance is read only' ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~array_to_string_table.
+ 
+    DATA lv_normalized_path TYPE string.
+    DATA lr_node TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    FIELD-SYMBOLS <item> LIKE LINE OF mt_json_tree.
+ 
+    lv_normalized_path = lcl_utils=>normalize_path( iv_path ).
+    lr_node = get_item( iv_path ).
+ 
+    IF lr_node IS INITIAL.
+      zcx_abapgit_ajson_error=>raise( |Path not found: { iv_path }| ).
+    ENDIF.
+    IF lr_node->type <> zif_abapgit_ajson_types=>node_type-array.
+      zcx_abapgit_ajson_error=>raise( |Array expected at: { iv_path }| ).
+    ENDIF.
+ 
+    LOOP AT mt_json_tree ASSIGNING <item> WHERE path = lv_normalized_path.
+      CASE <item>-type.
+        WHEN zif_abapgit_ajson_types=>node_type-number OR zif_abapgit_ajson_types=>node_type-string.
+          APPEND <item>-value TO rt_string_table.
+        WHEN zif_abapgit_ajson_types=>node_type-null.
+          APPEND '' TO rt_string_table.
+        WHEN zif_abapgit_ajson_types=>node_type-boolean.
+          DATA lv_tmp TYPE string.
+          IF <item>-value = 'true'.
+            lv_tmp = abap_true.
+          ELSE.
+            CLEAR lv_tmp.
+          ENDIF.
+          APPEND lv_tmp TO rt_string_table.
+        WHEN OTHERS.
+          zcx_abapgit_ajson_error=>raise( |Cannot convert [{ <item>-type
+            }] to string at [{ <item>-path }{ <item>-name }]| ).
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~clear.
+ 
+    read_only_watchdog( ).
+    CLEAR mt_json_tree.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~clone.
+    ri_json = create_from( me ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~delete.
+ 
+    read_only_watchdog( ).
+ 
+    DATA ls_split_path TYPE zif_abapgit_ajson_types=>ty_path_name.
+    ls_split_path = lcl_utils=>split_path( iv_path ).
+ 
+    delete_subtree(
+      iv_path = ls_split_path-path
+      iv_name = ls_split_path-name ).
+ 
+    ri_json = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~exists.
+    rv_exists = boolc( get_item( iv_path ) IS NOT INITIAL ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~filter.
+    ri_json = create_from(
+      ii_source_json = me
+      ii_filter      = ii_filter ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~format_datetime.
+    ms_opts-format_datetime = iv_use_iso.
+    ri_json = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~freeze.
+    ms_opts-read_only = abap_true.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL.
+      rv_value = lr_item->value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_boolean.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS INITIAL OR lr_item->type = zif_abapgit_ajson_types=>node_type-null.
+      RETURN.
+    ELSEIF lr_item->type = zif_abapgit_ajson_types=>node_type-boolean.
+      rv_value = boolc( lr_item->value = 'true' ).
+    ELSEIF lr_item->value IS NOT INITIAL.
+      rv_value = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_date.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    DATA lv_y TYPE c LENGTH 4.
+    DATA lv_m TYPE c LENGTH 2.
+    DATA lv_d TYPE c LENGTH 2.
+ 
+    lr_item = get_item( iv_path ).
+ 
+    IF lr_item IS NOT INITIAL AND lr_item->type = zif_abapgit_ajson_types=>node_type-string.
+      FIND FIRST OCCURRENCE OF REGEX '^(\d{4})-(\d{2})-(\d{2})(T|$)'
+        IN lr_item->value
+        SUBMATCHES lv_y lv_m lv_d.
+      CONCATENATE lv_y lv_m lv_d INTO rv_value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_integer.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL AND lr_item->type = zif_abapgit_ajson_types=>node_type-number.
+      rv_value = lr_item->value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_node_type.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL.
+      rv_node_type = lr_item->type.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_number.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL AND lr_item->type = zif_abapgit_ajson_types=>node_type-number.
+      rv_value = lr_item->value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_string.
+ 
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    lr_item = get_item( iv_path ).
+    IF lr_item IS NOT INITIAL AND lr_item->type <> zif_abapgit_ajson_types=>node_type-null.
+      rv_value = lr_item->value.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~get_timestamp.
+ 
+    DATA lo_to_abap TYPE REF TO lcl_json_to_abap.
+    DATA lr_item TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+ 
+    lr_item = get_item( iv_path ).
+ 
+    IF lr_item IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT lo_to_abap.
+ 
+    TRY.
+        rv_value = lo_to_abap->to_timestamp( lr_item->value ).
+      CATCH zcx_abapgit_ajson_error.
+        RETURN.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~is_empty.
+    rv_yes = boolc( lines( mt_json_tree ) = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~keep_item_order.
+    ms_opts-keep_item_order = abap_true.
+    ri_json = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~map.
+    ri_json = create_from(
+      ii_source_json = me
+      ii_mapper      = ii_mapper ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~members.
+ 
+    DATA lv_normalized_path TYPE string.
+    FIELD-SYMBOLS <item> LIKE LINE OF mt_json_tree.
+ 
+    lv_normalized_path = lcl_utils=>normalize_path( iv_path ).
+ 
+    LOOP AT mt_json_tree ASSIGNING <item> WHERE path = lv_normalized_path.
+      APPEND <item>-name TO rt_members.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~opts.
+    rs_opts = ms_opts.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~push.
+ 
+    DATA lr_parent TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    DATA lr_new_node TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+ 
+    read_only_watchdog( ).
+ 
+    lr_parent = get_item( iv_path ).
+ 
+    IF lr_parent IS INITIAL.
+      zcx_abapgit_ajson_error=>raise( |Path [{ iv_path }] does not exist| ).
+    ENDIF.
+ 
+    IF lr_parent->type <> zif_abapgit_ajson_types=>node_type-array.
+      zcx_abapgit_ajson_error=>raise( |Path [{ iv_path }] is not array| ).
+    ENDIF.
+ 
+    DATA lt_new_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA ls_new_path TYPE zif_abapgit_ajson_types=>ty_path_name.
+    DATA lv_new_index TYPE i.
+ 
+    lv_new_index     = lr_parent->children + 1.
+    ls_new_path-path = lcl_utils=>normalize_path( iv_path ).
+    ls_new_path-name = |{ lv_new_index }|.
+ 
+    lt_new_nodes = lcl_abap_to_json=>convert(
+      is_opts            = ms_opts
+      iv_data   = iv_val
+      is_prefix = ls_new_path ).
+    READ TABLE lt_new_nodes INDEX 1 REFERENCE INTO lr_new_node. " assume first record is the array item - not ideal !
+    ASSERT sy-subrc = 0.
+    lr_new_node->index = lv_new_index.
+ 
+    " update data
+    lr_parent->children = lv_new_index.
+    INSERT LINES OF lt_new_nodes INTO TABLE mt_json_tree.
+ 
+    ri_json = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set.
+ 
+    DATA ls_split_path TYPE zif_abapgit_ajson_types=>ty_path_name.
+    DATA lr_parent TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    DATA ls_deleted_node TYPE zif_abapgit_ajson_types=>ty_node.
+    DATA lv_item_order TYPE zif_abapgit_ajson_types=>ty_node-order.
+ 
+    read_only_watchdog( ).
+ 
+    ri_json = me.
+ 
+    IF iv_val IS INITIAL AND iv_ignore_empty = abap_true AND iv_node_type IS INITIAL.
+      RETURN. " nothing to assign
+    ENDIF.
+ 
+    IF iv_node_type IS NOT INITIAL
+      AND iv_node_type <> zif_abapgit_ajson_types=>node_type-boolean AND iv_node_type <> zif_abapgit_ajson_types=>node_type-null
+      AND iv_node_type <> zif_abapgit_ajson_types=>node_type-number AND iv_node_type <> zif_abapgit_ajson_types=>node_type-string.
+      zcx_abapgit_ajson_error=>raise( |Unexpected type { iv_node_type }| ).
+    ENDIF.
+ 
+    ls_split_path = lcl_utils=>split_path( iv_path ).
+    IF ls_split_path IS INITIAL. " Assign root, exceptional processing
+      IF iv_node_type IS NOT INITIAL.
+        mt_json_tree = lcl_abap_to_json=>insert_with_type(
+          is_opts            = ms_opts
+          iv_data            = iv_val
+          iv_type            = iv_node_type
+          is_prefix          = ls_split_path
+          ii_custom_mapping  = mi_custom_mapping ).
+      ELSE.
+        mt_json_tree = lcl_abap_to_json=>convert(
+          is_opts            = ms_opts
+          iv_data            = iv_val
+          is_prefix          = ls_split_path
+          ii_custom_mapping  = mi_custom_mapping ).
+      ENDIF.
+      RETURN.
+    ENDIF.
+ 
+    " Ensure whole path exists
+    lr_parent = prove_path_exists( ls_split_path-path ).
+    ASSERT lr_parent IS NOT INITIAL.
+ 
+    " delete if exists with subtree
+    ls_deleted_node = delete_subtree(
+      ir_parent = lr_parent
+      iv_path   = ls_split_path-path
+      iv_name   = ls_split_path-name ).
+    lv_item_order = ls_deleted_node-order.
+ 
+    " convert to json
+    DATA lt_new_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA lv_array_index TYPE i.
+ 
+    IF lr_parent->type = zif_abapgit_ajson_types=>node_type-array.
+      lv_array_index = lcl_utils=>validate_array_index(
+        iv_path  = ls_split_path-path
+        iv_index = ls_split_path-name ).
+    ELSEIF lr_parent->type = zif_abapgit_ajson_types=>node_type-object
+      AND lv_item_order = 0 AND ms_opts-keep_item_order = abap_true.
+      lv_item_order = lr_parent->children + 1.
+    ENDIF.
+ 
+    IF iv_node_type IS NOT INITIAL.
+      lt_new_nodes = lcl_abap_to_json=>insert_with_type(
+        is_opts            = ms_opts
+        iv_item_order      = lv_item_order
+        iv_data            = iv_val
+        iv_type            = iv_node_type
+        iv_array_index     = lv_array_index
+        is_prefix          = ls_split_path
+        ii_custom_mapping  = mi_custom_mapping ).
+    ELSE.
+      lt_new_nodes = lcl_abap_to_json=>convert(
+        is_opts            = ms_opts
+        iv_item_order      = lv_item_order
+        iv_data            = iv_val
+        iv_array_index     = lv_array_index
+        is_prefix          = ls_split_path
+        ii_custom_mapping  = mi_custom_mapping ).
+    ENDIF.
+ 
+    " update nodes
+    IF lines( lt_new_nodes ) > 0.
+      lr_parent->children = lr_parent->children + 1.
+      INSERT LINES OF lt_new_nodes INTO TABLE mt_json_tree.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~setx.
+ 
+    DATA lv_path TYPE string.
+    DATA lv_val TYPE string.
+    DATA lv_int TYPE i.
+    DATA lv_dec TYPE decfloat34.
+    DATA lv_last TYPE i.
+ 
+    IF iv_param IS INITIAL.
+      ri_json = me.
+      RETURN.
+    ENDIF.
+ 
+    SPLIT iv_param AT ':' INTO lv_path lv_val.
+    CONDENSE lv_path.
+    CONDENSE lv_val.
+ 
+    IF lv_val IS INITIAL.
+      ri_json = me.
+      RETURN. " Hmm ? or empty string ? or null ?
+    ENDIF.
+ 
+    IF go_float_regex IS NOT BOUND.
+      CREATE OBJECT go_float_regex EXPORTING pattern = '^([1-9][0-9]*|0)\.[0-9]+$'.
+      " expects fractional, because ints are detected separately
+    ENDIF.
+ 
+    IF lv_val = 'null'.
+      zif_abapgit_ajson~set_null( lv_path ).
+    ELSEIF lv_val = 'true'.
+      zif_abapgit_ajson~set_boolean(
+        iv_path = lv_path
+        iv_val  = abap_true ).
+    ELSEIF lv_val = 'false'.
+      zif_abapgit_ajson~set_boolean(
+        iv_path = lv_path
+        iv_val  = abap_false ).
+    ELSEIF lv_val CO '0123456789'.
+      lv_int = lv_val.
+      zif_abapgit_ajson~set_integer(
+        iv_path = lv_path
+        iv_val  = lv_int ).
+    ELSEIF lv_val CO '0123456789.' AND go_float_regex->create_matcher( text = lv_val )->match( ) = abap_true.
+      lv_dec = lv_val.
+      zif_abapgit_ajson~set(
+        iv_path = lv_path
+        iv_val  = lv_dec ).
+    ELSEIF lv_val+0(1) = '{' OR lv_val+0(1) = '['.
+      "Expect object/array, but no further checks, parser will catch errors
+      zif_abapgit_ajson~set(
+        iv_path = lv_path
+        iv_val  = parse(
+          iv_json = lv_val
+          iv_keep_item_order = ms_opts-keep_item_order ) ).
+    ELSE. " string
+      lv_last = strlen( lv_val ) - 1.
+      IF lv_val+0(1) = '"' AND lv_val+lv_last(1) = '"'.
+        lv_val = substring(
+          val = lv_val
+          off = 1
+          len = lv_last - 1 ).
+      ENDIF.
+      zif_abapgit_ajson~set_string(
+        iv_path = lv_path
+        iv_val  = lv_val ).
+    ENDIF.
+ 
+    ri_json = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_boolean.
+ 
+    ri_json = me.
+ 
+    DATA lv_bool TYPE abap_bool.
+    lv_bool = boolc( iv_val IS NOT INITIAL ).
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_bool ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_date.
+ 
+    ri_json = me.
+ 
+    DATA lv_val TYPE string.
+    lv_val = lcl_abap_to_json=>format_date( iv_val ).
+ 
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_val ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_integer.
+ 
+    ri_json = me.
+ 
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = iv_val ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_null.
+ 
+    ri_json = me.
+ 
+    DATA lv_null_ref TYPE REF TO data.
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_null_ref ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_string.
+ 
+    ri_json = me.
+ 
+    DATA lv_val TYPE string.
+    lv_val = iv_val.
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_val ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~set_timestamp.
+ 
+    ri_json = me.
+ 
+    DATA lv_timestamp_iso TYPE string.
+    lv_timestamp_iso = lcl_abap_to_json=>format_timestamp( iv_val ).
+ 
+    zif_abapgit_ajson~set(
+      iv_ignore_empty = abap_false
+      iv_path = iv_path
+      iv_val  = lv_timestamp_iso ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~slice.
+ 
+    DATA lo_section         TYPE REF TO zcl_abapgit_ajson.
+    DATA ls_item            LIKE LINE OF mt_json_tree.
+    DATA lv_normalized_path TYPE string.
+    DATA ls_path_parts      TYPE zif_abapgit_ajson_types=>ty_path_name.
+    DATA lv_path_len        TYPE i.
+    DATA lv_path_pattern    TYPE string.
+ 
+    CREATE OBJECT lo_section.
+    lv_normalized_path = lcl_utils=>normalize_path( iv_path ).
+    lv_path_len        = strlen( lv_normalized_path ).
+    ls_path_parts      = lcl_utils=>split_path( lv_normalized_path ).
+ 
+    READ TABLE mt_json_tree INTO ls_item
+      WITH KEY path = ls_path_parts-path name = ls_path_parts-name.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    CLEAR: ls_item-path, ls_item-name, ls_item-order. " this becomes a new root
+    INSERT ls_item INTO TABLE lo_section->mt_json_tree.
+ 
+    lv_path_pattern = lv_normalized_path && `*`.
+ 
+    LOOP AT mt_json_tree INTO ls_item WHERE path CP lv_path_pattern.
+ 
+      ls_item-path = substring( val = ls_item-path
+                                off = lv_path_len - 1 ). " less closing '/'
+      INSERT ls_item INTO TABLE lo_section->mt_json_tree.
+ 
+    ENDLOOP.
+ 
+    ri_json = lo_section.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~stringify.
+ 
+    rv_json = lcl_json_serializer=>stringify(
+      it_json_tree       = mt_json_tree
+      iv_keep_item_order = ms_opts-keep_item_order
+      iv_indent          = iv_indent ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~touch_array.
+ 
+    DATA lr_node TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+    DATA ls_deleted_node TYPE zif_abapgit_ajson_types=>ty_node.
+    DATA ls_new_node LIKE LINE OF mt_json_tree.
+    DATA ls_split_path TYPE zif_abapgit_ajson_types=>ty_path_name.
+ 
+    read_only_watchdog( ).
+ 
+    ls_split_path = lcl_utils=>split_path( iv_path ).
+    IF ls_split_path IS INITIAL. " Assign root, exceptional processing
+      ls_new_node-path = ls_split_path-path.
+      ls_new_node-name = ls_split_path-name.
+      ls_new_node-type = zif_abapgit_ajson_types=>node_type-array.
+      INSERT ls_new_node INTO TABLE mt_json_tree.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_clear = abap_true.
+      ls_deleted_node = delete_subtree(
+        iv_path = ls_split_path-path
+        iv_name = ls_split_path-name ).
+    ELSE.
+      lr_node = get_item( iv_path ).
+    ENDIF.
+ 
+    IF lr_node IS INITIAL. " Or node was cleared
+ 
+      DATA lr_parent TYPE REF TO zif_abapgit_ajson_types=>ty_node.
+      lr_parent = prove_path_exists( ls_split_path-path ).
+      ASSERT lr_parent IS NOT INITIAL.
+ 
+      lr_parent->children = lr_parent->children + 1.
+ 
+      ls_new_node-path = ls_split_path-path.
+      ls_new_node-name = ls_split_path-name.
+      ls_new_node-type = zif_abapgit_ajson_types=>node_type-array.
+ 
+      IF ms_opts-keep_item_order = abap_true AND ls_deleted_node IS NOT INITIAL.
+        ls_new_node-order = ls_deleted_node-order.
+      ENDIF.
+ 
+      INSERT ls_new_node INTO TABLE mt_json_tree.
+ 
+    ELSEIF lr_node->type <> zif_abapgit_ajson_types=>node_type-array.
+      zcx_abapgit_ajson_error=>raise( |Path [{ iv_path }] already used and is not array| ).
+    ENDIF.
+ 
+    ri_json = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~to_abap.
+ 
+    DATA lo_to_abap TYPE REF TO lcl_json_to_abap.
+ 
+    CLEAR ev_container.
+    CREATE OBJECT lo_to_abap
+      EXPORTING
+        iv_corresponding  = boolc( iv_corresponding = abap_true OR ms_opts-to_abap_corresponding_only = abap_true )
+        ii_custom_mapping = mi_custom_mapping.
+ 
+    lo_to_abap->to_abap(
+      EXPORTING
+        it_nodes    = zif_abapgit_ajson~mt_json_tree
+      CHANGING
+        c_container = ev_container ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson~to_abap_corresponding_only.
+    ms_opts-to_abap_corresponding_only = iv_enable.
+    ri_json = me.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap.html b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap.html new file mode 100644 index 00000000000..163f04211ca --- /dev/null +++ b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap.html @@ -0,0 +1,6187 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson.clas.locals_imp.abap

+
+ +
+ 95.67% + Statements + 1946/2034 +
+ + +
+ 81.56% + Branches + 177/217 +
+ + +
+ 94.44% + Functions + 17/18 +
+ + +
+ 95.67% + Lines + 1946/2034 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +20351x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +  +20x +20x +2x +  +1x +1x +1x +1x +1x +1x +1x +6x +6x +1x +2x +2x +1x +1x +16x +16x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +53x +53x +299x +299x +299x +75x +75x +299x +299x +299x +299x +299x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +2434x +83x +83x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +800x +800x +800x +800x +800x +80x +80x +80x +720x +720x +720x +720x +720x +720x +720x +80x +80x +720x +800x +  +  +800x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +83x +83x +  +  +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +350x +350x +350x +350x +350x +81x +81x +81x +81x +350x +350x +249x +63x +63x +186x +186x +249x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +350x +23x +23x +23x +350x +350x +350x +350x +350x +350x +142x +142x +142x +142x +142x +142x +142x +142x +11x +11x +11x +11x +142x +142x +142x +118x +118x +118x +118x +142x +142x +142x +142x +23x +23x +23x +142x +142x +350x +350x +1x +1x +129x +129x +129x +129x +129x +129x +11x +129x +17x +17x +101x +101x +129x +129x +129x +129x +129x +49x +49x +93x +93x +129x +129x +129x +129x +23x +23x +129x +129x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +33x +33x +33x +33x +33x +33x +33x +33x +33x +33x +33x +33x +33x +33x +22x +22x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +23x +1x +111x +111x +1x +1x +1x +1x +142x +142x +142x +142x +5x +5x +5x +5x +3x +3x +5x +137x +137x +142x +142x +142x +142x +142x +142x +142x +142x +142x +142x +142x +142x +142x +142x +142x +142x +6x +3x +  +3x +3x +3x +6x +142x +142x +142x +142x +142x +142x +142x +142x +142x +142x +22x +22x +9x +9x +9x +22x +136x +136x +136x +1x +1x +1x +1x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +9x +9x +9x +9x +9x +9x +9x +9x +15x +15x +15x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +167x +167x +167x +164x +164x +164x +167x +3x +3x +167x +167x +191x +191x +191x +107x +2x +2x +  +107x +107x +107x +107x +107x +1x +1x +  +52x +52x +39x +39x +39x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +1x +  +50x +50x +50x +50x +107x +107x +107x +1x +  +24x +24x +24x +24x +107x +107x +107x +107x +107x +107x +107x +107x +107x +13x +13x +13x +1x +  +13x +13x +13x +13x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +107x +1x +1x +112x +112x +112x +112x +  +  +112x +112x +112x +112x +112x +112x +112x +112x +112x +112x +112x +112x +112x +112x +112x +112x +112x +3x +112x +4x +4x +73x +73x +112x +112x +112x +112x +112x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +  +  +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +323x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +323x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +  +  +  +323x +323x +323x +323x +1x +1x +12x +12x +12x +12x +12x +  +  +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +21x +21x +12x +12x +12x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +244x +244x +244x +244x +244x +244x +244x +244x +244x +12x +12x +244x +244x +244x +244x +244x +244x +29x +29x +12x +12x +17x +17x +244x +1x +1x +1x +1x +  +  +  +215x +214x +214x +130x +130x +214x +3x +3x +3x +3x +  +  +84x +2x +2x +2x +2x +  +  +81x +79x +79x +79x +  +  +  +244x +244x +244x +244x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +  +  +  +4x +4x +1x +1x +4x +4x +4x +4x +4x +  +  +  +4x +4x +4x +4x +1x +1x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +  +  +43x +43x +43x +43x +43x +43x +10x +10x +10x +10x +43x +43x +23x +23x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +  +  +  +  +  +  +  +  +  +  +  +43x +43x +43x +43x +43x +43x +43x +11x +11x +11x +43x +43x +9x +9x +43x +43x +36x +36x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +43x +1x +1x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +1x +1x +1x +1x +20x +20x +4x +4x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +41x +41x +41x +41x +41x +41x +41x +41x +41x +  +41x +  +41x +  +41x +41x +  +  +41x +  +  +  +  +  +  +41x +41x +41x +41x +41x +41x +41x +41x +41x +  +  +  +  +41x +41x +  +  +41x +41x +41x +41x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +1x +1x +41x +41x +41x +41x +41x +41x +41x +41x +41x +15x +15x +41x +41x +41x +41x +41x +41x +9x +9x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +2x +2x +41x +41x +41x +41x +41x +41x +43x +43x +5x +5x +5x +43x +57x +57x +57x +41x +41x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +24x +24x +24x +24x +24x +24x +2x +2x +2x +2x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +20x +20x +1x +1x +66x +66x +66x +66x +66x +66x +66x +66x +119x +119x +119x +119x +119x +119x +119x +1x +1x +1x +  +119x +125x +125x +125x +125x +1x +1x +1x +  +124x +124x +124x +66x +44x +44x +44x +44x +44x +66x +66x +64x +64x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +37x +37x +37x +37x +37x +37x +37x +37x +37x +37x +  +  +  +37x +37x +37x +37x +37x +1x +1x +37x +37x +37x +37x +1x +1x +1x +37x +37x +37x +37x +37x +37x +36x +35x +35x +1x +1x + 
**********************************************************************
+* UTILS
+**********************************************************************
+ 
+INTERFACE lif_kind.
+ 
+  TYPES ty_kind TYPE c LENGTH 1.
+ 
+  CONSTANTS:
+    any         TYPE ty_kind VALUE cl_abap_typedescr=>typekind_any,
+    date        TYPE ty_kind VALUE cl_abap_typedescr=>typekind_date,
+    time        TYPE ty_kind VALUE cl_abap_typedescr=>typekind_time,
+    packed      TYPE ty_kind VALUE cl_abap_typedescr=>typekind_packed,
+    table       TYPE ty_kind VALUE cl_abap_typedescr=>typekind_table,
+    struct_flat TYPE ty_kind VALUE cl_abap_typedescr=>typekind_struct1,
+    struct_deep TYPE ty_kind VALUE cl_abap_typedescr=>typekind_struct2,
+    data_ref    TYPE ty_kind VALUE cl_abap_typedescr=>typekind_dref,
+    object_ref  TYPE ty_kind VALUE cl_abap_typedescr=>typekind_oref,
+    enum        TYPE ty_kind VALUE 'k'. " cl_abap_typedescr=>typekind_enum not in lower releases
+ 
+  CONSTANTS:
+    BEGIN OF numeric,
+      int1       TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_int1,
+      int2       TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_int2,
+      int4       TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_int,
+      int8       TYPE ty_kind VALUE '8', " cl_abap_tabledescr=>typekind_int8 not in lower releases
+      float      TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_float,
+      packed     TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_packed,
+      decfloat16 TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_decfloat16,
+      decfloat34 TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_decfloat34,
+    END OF numeric.
+ 
+  CONSTANTS:
+    BEGIN OF texts,
+      char   TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_char,
+      numc   TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_num,
+      string TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_string,
+    END OF texts.
+ 
+  CONSTANTS:
+    BEGIN OF binary,
+      hex     TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_hex,
+      xstring TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_xstring,
+    END OF binary.
+ 
+  CONSTANTS:
+    BEGIN OF deep_targets,
+      table       TYPE ty_kind VALUE cl_abap_typedescr=>typekind_table,
+      struct_flat TYPE ty_kind VALUE cl_abap_typedescr=>typekind_struct1,
+      struct_deep TYPE ty_kind VALUE cl_abap_typedescr=>typekind_struct2,
+      data_ref    TYPE ty_kind VALUE cl_abap_typedescr=>typekind_dref,
+      object_ref  TYPE ty_kind VALUE cl_abap_typedescr=>typekind_oref,
+    END OF deep_targets.
+ 
+ENDINTERFACE.
+ 
+CLASS lcl_utils DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS normalize_path
+      IMPORTING
+        iv_path TYPE string
+      RETURNING
+        VALUE(rv_path) TYPE string.
+    CLASS-METHODS split_path
+      IMPORTING
+        iv_path TYPE string
+      RETURNING
+        VALUE(rv_path_name) TYPE zif_abapgit_ajson_types=>ty_path_name.
+    CLASS-METHODS validate_array_index
+      IMPORTING
+        iv_path TYPE string
+        iv_index TYPE string
+      RETURNING
+        VALUE(rv_index) TYPE i
+      RAISING
+        zcx_abapgit_ajson_error.
+    CLASS-METHODS string_to_xstring_utf8
+      IMPORTING
+        iv_str TYPE string
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring.
+ 
+ENDCLASS.
+ 
+CLASS lcl_utils IMPLEMENTATION.
+ 
+  METHOD string_to_xstring_utf8.
+ 
+    DATA lo_conv TYPE REF TO object.
+    DATA lv_out_ce TYPE string.
+ 
+    lv_out_ce = 'CL_ABAP_CONV_OUT_CE'.
+ 
+    TRY.
+        CALL METHOD ('CL_ABAP_CONV_CODEPAGE')=>create_out
+        RECEIVING
+          instance = lo_conv.
+        CALL METHOD lo_conv->('IF_ABAP_CONV_OUT~CONVERT')
+        EXPORTING
+          source = iv_str
+        RECEIVING
+          result = rv_xstr.
+      CATCH cx_sy_dyn_call_illegal_class.
+        CALL METHOD (lv_out_ce)=>create
+        EXPORTING
+          encoding = 'UTF-8'
+        RECEIVING
+          conv = lo_conv.
+        CALL METHOD lo_conv->('CONVERT')
+        EXPORTING
+          data = iv_str
+        IMPORTING
+          buffer = rv_xstr.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD validate_array_index.
+ 
+    IF NOT iv_index CO '0123456789'.
+      zcx_abapgit_ajson_error=>raise( |Cannot add non-numeric key [{ iv_index }] to array [{ iv_path }]| ).
+    ENDIF.
+    rv_index = iv_index.
+    IF rv_index = 0.
+      zcx_abapgit_ajson_error=>raise( |Cannot add zero key to array [{ iv_path }]| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD normalize_path.
+ 
+    rv_path = iv_path.
+    IF strlen( rv_path ) = 0.
+      rv_path = '/'.
+    ENDIF.
+    IF rv_path+0(1) <> '/'.
+      rv_path = '/' && rv_path.
+    ENDIF.
+    IF substring( val = rv_path
+                  off = strlen( rv_path ) - 1 ) <> '/'.
+      rv_path = rv_path && '/'.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD split_path.
+ 
+    DATA lv_offs TYPE i.
+    DATA lv_len TYPE i.
+    DATA lv_trim_slash TYPE i.
+ 
+    lv_len = strlen( iv_path ).
+    IF lv_len = 0 OR iv_path = '/'.
+      RETURN. " empty path is the alias for root item = '' + ''
+    ENDIF.
+ 
+    IF substring( val = iv_path
+                  off = lv_len - 1 ) = '/'.
+      lv_trim_slash = 1. " ignore last '/'
+    ENDIF.
+ 
+    lv_offs = find( val = reverse( iv_path )
+                    sub = '/'
+                    off = lv_trim_slash ).
+    IF lv_offs = -1.
+      lv_offs  = lv_len. " treat whole string as the 'name' part
+    ENDIF.
+    lv_offs = lv_len - lv_offs.
+ 
+    rv_path_name-path = normalize_path( substring( val = iv_path
+                                                   len = lv_offs ) ).
+    rv_path_name-name = substring( val = iv_path
+                                   off = lv_offs
+                                   len = lv_len - lv_offs - lv_trim_slash ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+**********************************************************************
+* PARSER
+**********************************************************************
+ 
+CLASS lcl_json_parser DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    METHODS parse
+      IMPORTING
+        iv_json TYPE string
+        iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_json_tree) TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_stack_tt TYPE STANDARD TABLE OF REF TO zif_abapgit_ajson_types=>ty_node.
+ 
+    DATA mt_stack TYPE ty_stack_tt.
+    DATA mv_stack_path TYPE string.
+    DATA mv_keep_item_order TYPE abap_bool.
+ 
+    METHODS raise
+      IMPORTING
+        iv_error TYPE string
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS _parse
+      IMPORTING
+        iv_json TYPE string
+      RETURNING
+        VALUE(rt_json_tree) TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error cx_dynamic_check. " cx_sxml_error is not released on Steampunk #153
+ 
+    METHODS _get_location
+      IMPORTING
+        iv_json            TYPE string
+        iv_offset          TYPE i
+      RETURNING
+        VALUE(rv_location) TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS lcl_json_parser IMPLEMENTATION.
+ 
+  METHOD parse.
+    DATA lx_sxml_parse TYPE REF TO cx_sxml_parse_error.
+    DATA lx_sxml TYPE REF TO cx_dynamic_check.
+    DATA lv_location TYPE string.
+ 
+    mv_keep_item_order = iv_keep_item_order.
+ 
+    TRY.
+      " TODO sane JSON check:
+      " JSON can be true,false,null,(-)digits
+      " or start from " or from {
+        rt_json_tree = _parse( iv_json ).
+      CATCH cx_sxml_parse_error INTO lx_sxml_parse.
+        lv_location = _get_location(
+        iv_json   = iv_json
+        iv_offset = lx_sxml_parse->xml_offset ).
+        zcx_abapgit_ajson_error=>raise(
+        iv_msg      = |Json parsing error (SXML): { lx_sxml_parse->get_text( ) }|
+        iv_location = lv_location ).
+      CATCH cx_dynamic_check INTO lx_sxml. " cx_sxml_error
+        zcx_abapgit_ajson_error=>raise(
+        iv_msg      = |Json parsing error (SXML): { lx_sxml->get_text( ) }|
+        iv_location = '@PARSER' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD _get_location.
+ 
+    DATA lv_json TYPE string.
+    DATA lv_offset TYPE i.
+    DATA lt_text TYPE TABLE OF string.
+    DATA lv_text TYPE string.
+    DATA lv_line TYPE i.
+    DATA lv_pos TYPE i.
+ 
+    lv_offset = iv_offset.
+    IF lv_offset < 0.
+      lv_offset = 0.
+    ENDIF.
+    IF lv_offset > strlen( iv_json ).
+      lv_offset = strlen( iv_json ).
+    ENDIF.
+ 
+    lv_json = iv_json(lv_offset).
+ 
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf
+      IN lv_json WITH cl_abap_char_utilities=>newline.
+ 
+    SPLIT lv_json AT cl_abap_char_utilities=>newline INTO TABLE lt_text.
+ 
+    lv_line = lines( lt_text ).
+    IF lv_line = 0.
+      lv_line = 1.
+      lv_pos = 1.
+    ELSE.
+      READ TABLE lt_text INDEX lv_line INTO lv_text.
+      lv_pos = strlen( lv_text ) + 1.
+    ENDIF.
+ 
+    rv_location = |Line { lv_line }, Offset { lv_pos }|.
+ 
+  ENDMETHOD.
+ 
+  METHOD _parse.
+ 
+    DATA lo_reader TYPE REF TO if_sxml_reader.
+    DATA lr_stack_top LIKE LINE OF mt_stack.
+    DATA lo_node TYPE REF TO if_sxml_node.
+    FIELD-SYMBOLS <item> LIKE LINE OF rt_json_tree.
+ 
+    CLEAR mt_stack.
+    CLEAR mv_stack_path.
+    IF iv_json IS INITIAL.
+      RETURN.
+    ENDIF.
+    lo_reader = cl_sxml_string_reader=>create( lcl_utils=>string_to_xstring_utf8( iv_json ) ).
+ 
+    " TODO: self protection, check non-empty, check starting from object ...
+ 
+    DO.
+      lo_node = lo_reader->read_next_node( ).
+      IF lo_node IS NOT BOUND.
+        EXIT.
+      ENDIF.
+ 
+ 
+      CASE lo_node->type.
+        WHEN if_sxml_node=>co_nt_element_open.
+          DATA lt_attributes TYPE if_sxml_attribute=>attributes.
+          DATA lo_attr LIKE LINE OF lt_attributes.
+          DATA lo_open TYPE REF TO if_sxml_open_element.
+          lo_open ?= lo_node.
+ 
+          APPEND INITIAL LINE TO rt_json_tree ASSIGNING <item>.
+ 
+          <item>-type = lo_open->qname-name.
+ 
+          READ TABLE mt_stack INDEX 1 INTO lr_stack_top.
+          IF sy-subrc = 0.
+            " Using string is faster than rebuilding path from stack
+            <item>-path = mv_stack_path.
+            lr_stack_top->children = lr_stack_top->children + 1.
+ 
+            IF lr_stack_top->type = `array`. " This is parser type not ajson type
+              <item>-name = |{ lr_stack_top->children }|.
+              <item>-index = lr_stack_top->children.
+            ELSE.
+              lt_attributes = lo_open->get_attributes( ).
+              LOOP AT lt_attributes INTO lo_attr.
+                IF lo_attr->qname-name = 'name' AND lo_attr->value_type = if_sxml_value=>co_vt_text.
+                  <item>-name = lo_attr->get_value( ).
+                ENDIF.
+              ENDLOOP.
+              IF mv_keep_item_order = abap_true.
+                <item>-order = lr_stack_top->children.
+              ENDIF.
+            ENDIF.
+            IF <item>-name IS INITIAL.
+              raise( 'Node without name (maybe not JSON)' ).
+            ENDIF.
+          ENDIF.
+ 
+          GET REFERENCE OF <item> INTO lr_stack_top.
+          INSERT lr_stack_top INTO mt_stack INDEX 1.
+          " add path component
+          mv_stack_path = mv_stack_path && <item>-name && '/'.
+ 
+        WHEN if_sxml_node=>co_nt_element_close.
+          DATA lo_close TYPE REF TO if_sxml_close_element.
+          lo_close ?= lo_node.
+ 
+          READ TABLE mt_stack INDEX 1 INTO lr_stack_top.
+          DELETE mt_stack INDEX 1.
+          IF lo_close->qname-name <> lr_stack_top->type.
+            raise( 'Unexpected closing node type' ).
+          ENDIF.
+ 
+          " remove last path component
+          mv_stack_path = substring( val = mv_stack_path
+                                     len = find( val = mv_stack_path sub = '/' occ = -2 ) + 1 ).
+        WHEN if_sxml_node=>co_nt_value.
+          DATA lo_value TYPE REF TO if_sxml_value_node.
+          lo_value ?= lo_node.
+ 
+          <item>-value = lo_value->get_value( ).
+ 
+        WHEN OTHERS.
+          raise( 'Unexpected node type' ).
+      ENDCASE.
+    ENDDO.
+ 
+    IF lines( mt_stack ) > 0.
+      raise( 'Unexpected end of data' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD raise.
+
+    zcx_abapgit_ajson_error=>raise(
+      iv_location = mv_stack_path
+      iv_msg      = |JSON PARSER: { iv_error } @ { mv_stack_path }| ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* SERIALIZER
+**********************************************************************
+ 
+CLASS lcl_json_serializer DEFINITION FINAL CREATE PRIVATE.
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS stringify
+      IMPORTING
+        it_json_tree TYPE zif_abapgit_ajson_types=>ty_nodes_ts
+        iv_indent TYPE i DEFAULT 0
+        iv_keep_item_order TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_json_string) TYPE string
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    CLASS-METHODS class_constructor.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gv_comma_with_lf TYPE string.
+ 
+    DATA mt_json_tree TYPE zif_abapgit_ajson_types=>ty_nodes_ts.
+    DATA mv_keep_item_order TYPE abap_bool.
+    DATA mt_buffer TYPE string_table.
+    DATA mv_indent_step TYPE i.
+    DATA mv_level TYPE i.
+ 
+    CLASS-METHODS escape_string
+      IMPORTING
+        iv_unescaped TYPE string
+      RETURNING
+        VALUE(rv_escaped) TYPE string.
+ 
+    METHODS _stringify
+      RETURNING
+        VALUE(rv_json_string) TYPE string
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS stringify_node
+      IMPORTING
+        is_node TYPE zif_abapgit_ajson_types=>ty_node
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS stringify_set
+      IMPORTING
+        iv_parent_path TYPE string
+        iv_array TYPE abap_bool
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS lcl_json_serializer IMPLEMENTATION.
+ 
+  METHOD class_constructor.
+    gv_comma_with_lf = ',' && cl_abap_char_utilities=>newline.
+  ENDMETHOD.
+ 
+  METHOD stringify.
+ 
+    DATA lo TYPE REF TO lcl_json_serializer.
+    CREATE OBJECT lo.
+    lo->mt_json_tree = it_json_tree.
+    lo->mv_indent_step = iv_indent.
+    lo->mv_keep_item_order = iv_keep_item_order.
+    rv_json_string = lo->_stringify( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD _stringify.
+ 
+    FIELD-SYMBOLS <n> LIKE LINE OF mt_json_tree.
+    READ TABLE mt_json_tree ASSIGNING <n>
+      WITH KEY
+        path = ''
+        name = ''. " Root
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    stringify_node( <n> ).
+ 
+    rv_json_string = concat_lines_of( table = mt_buffer ).
+ 
+  ENDMETHOD.
+ 
+  METHOD stringify_node.
+ 
+    DATA lv_item TYPE string.
+    DATA lv_indent_prefix TYPE string.
+ 
+    IF mv_indent_step > 0.
+      lv_indent_prefix = repeat( val = ` `
+                                 occ = mv_indent_step * mv_level ).
+      lv_item = lv_indent_prefix.
+    ENDIF.
+ 
+    IF is_node-name IS NOT INITIAL AND is_node-index IS INITIAL. " Not root, not array item
+      IF mv_indent_step > 0.
+        lv_item = lv_item && |"{ is_node-name }": |.
+      ELSE.
+        lv_item = |"{ is_node-name }":|.
+      ENDIF.
+    ENDIF.
+ 
+    CASE is_node-type.
+      WHEN zif_abapgit_ajson_types=>node_type-array.
+        lv_item = lv_item && '['.
+      WHEN zif_abapgit_ajson_types=>node_type-object.
+        lv_item = lv_item && '{'.
+      WHEN zif_abapgit_ajson_types=>node_type-string.
+        lv_item = lv_item && |"{ escape_string( is_node-value ) }"|.
+      WHEN zif_abapgit_ajson_types=>node_type-boolean OR zif_abapgit_ajson_types=>node_type-number.
+        lv_item = lv_item && is_node-value.
+      WHEN zif_abapgit_ajson_types=>node_type-null.
+        lv_item = lv_item && 'null'.
+      WHEN OTHERS.
+        zcx_abapgit_ajson_error=>raise(
+          iv_msg = |Unexpected type [{ is_node-type }]|
+          iv_location = is_node-path && is_node-name ).
+    ENDCASE.
+ 
+    IF mv_indent_step > 0
+      AND ( is_node-type = zif_abapgit_ajson_types=>node_type-array OR is_node-type = zif_abapgit_ajson_types=>node_type-object )
+      AND is_node-children > 0.
+      mv_level = mv_level + 1.
+      lv_item = lv_item && cl_abap_char_utilities=>newline.
+    ENDIF.
+ 
+    APPEND lv_item TO mt_buffer.
+ 
+    " finish complex item
+ 
+    IF is_node-type = zif_abapgit_ajson_types=>node_type-array OR is_node-type = zif_abapgit_ajson_types=>node_type-object.
+      DATA lv_children_path TYPE string.
+      DATA lv_tail TYPE string.
+ 
+      lv_children_path = is_node-path && is_node-name && '/'. " for root: path = '' and name = '', so result is '/'
+ 
+      CASE is_node-type.
+        WHEN zif_abapgit_ajson_types=>node_type-array.
+          IF is_node-children > 0.
+            stringify_set(
+              iv_parent_path = lv_children_path
+              iv_array       = abap_true ).
+          ENDIF.
+          lv_tail = ']'.
+        WHEN zif_abapgit_ajson_types=>node_type-object.
+          IF is_node-children > 0.
+            stringify_set(
+              iv_parent_path = lv_children_path
+              iv_array       = abap_false ).
+          ENDIF.
+          lv_tail = '}'.
+      ENDCASE.
+ 
+      IF mv_indent_step > 0 AND is_node-children > 0.
+        lv_tail = lv_indent_prefix && lv_tail.
+        mv_level = mv_level - 1.
+      ENDIF.
+      APPEND lv_tail TO mt_buffer.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD stringify_set.
+ 
+    DATA lv_tab_key TYPE string.
+    DATA lv_first_done TYPE abap_bool.
+    FIELD-SYMBOLS <n> LIKE LINE OF mt_json_tree.
+ 
+    IF iv_array = abap_true.
+      lv_tab_key = 'array_index'. " path + index
+    ELSEIF mv_keep_item_order = abap_true.
+      lv_tab_key = 'item_order'. " path + order
+    ELSE.
+      lv_tab_key = 'primary_key'. " path + name
+    ENDIF.
+ 
+    LOOP AT mt_json_tree ASSIGNING <n> USING KEY (lv_tab_key) WHERE path = iv_parent_path.
+      IF lv_first_done = abap_false.
+        lv_first_done = abap_true.
+      ELSEIF mv_indent_step > 0.
+        APPEND gv_comma_with_lf TO mt_buffer.
+      ELSE.
+        APPEND ',' TO mt_buffer.
+      ENDIF.
+      stringify_node( <n> ).
+    ENDLOOP.
+ 
+    IF mv_indent_step > 0 AND lv_first_done = abap_true. " only of items were in the list
+      APPEND cl_abap_char_utilities=>newline TO mt_buffer.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD escape_string.
+ 
+    rv_escaped = iv_unescaped.
+    IF rv_escaped CA |"\\\t\n\r|.
+      " TODO consider performance ...
+      " see also https://www.json.org/json-en.html
+      rv_escaped = replace(
+        val = rv_escaped
+        sub = '\'
+        with = '\\'
+        occ = 0 ).
+      rv_escaped = replace(
+        val = rv_escaped
+        sub = |\n|
+        with = '\n'
+        occ = 0 ).
+      rv_escaped = replace(
+        val = rv_escaped
+        sub = |\r|
+        with = '\r'
+        occ = 0 ).
+      rv_escaped = replace(
+        val = rv_escaped
+        sub = |\t|
+        with = '\t'
+        occ = 0 ).
+      rv_escaped = replace(
+        val = rv_escaped
+        sub = '"'
+        with = '\"'
+        occ = 0 ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+**********************************************************************
+* JSON_TO_ABAP
+**********************************************************************
+ 
+CLASS lcl_json_to_abap DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_corresponding  TYPE abap_bool DEFAULT abap_false
+        !ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL.
+ 
+    METHODS to_abap
+      IMPORTING
+        it_nodes     TYPE zif_abapgit_ajson_types=>ty_nodes_ts
+      CHANGING
+        c_container TYPE any
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS to_timestamp
+      IMPORTING
+        iv_value         TYPE zif_abapgit_ajson_types=>ty_node-value
+      RETURNING
+        VALUE(rv_result) TYPE timestamp
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS to_date
+      IMPORTING
+        iv_value         TYPE zif_abapgit_ajson_types=>ty_node-value
+      RETURNING
+        VALUE(rv_result) TYPE d
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_type_cache,
+        type_path         TYPE string,
+        target_field_name TYPE string,
+        dd                TYPE REF TO cl_abap_datadescr,
+        type_kind         LIKE lif_kind=>any,
+        tab_item_buf      TYPE REF TO data,
+      END OF ty_type_cache.
+    DATA mt_node_type_cache TYPE HASHED TABLE OF ty_type_cache WITH UNIQUE KEY type_path.
+ 
+    DATA mr_nodes TYPE REF TO zif_abapgit_ajson_types=>ty_nodes_ts.
+    DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA mv_corresponding TYPE abap_bool.
+ 
+    METHODS any_to_abap
+      IMPORTING
+        iv_path        TYPE string
+        is_parent_type TYPE ty_type_cache OPTIONAL
+        i_container_ref TYPE REF TO data
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS value_to_abap
+      IMPORTING
+        is_node      TYPE zif_abapgit_ajson_types=>ty_node
+        is_node_type TYPE ty_type_cache
+        i_container_ref TYPE REF TO data
+      RAISING
+        zcx_abapgit_ajson_error
+        cx_sy_conversion_no_number.
+ 
+    METHODS get_node_type
+      IMPORTING
+        is_node            TYPE zif_abapgit_ajson_types=>ty_node OPTIONAL " Empty for root
+        is_parent_type     TYPE ty_type_cache OPTIONAL
+        i_container_ref    TYPE REF TO data OPTIONAL
+      RETURNING
+        VALUE(rs_node_type) TYPE ty_type_cache
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS lcl_json_to_abap IMPLEMENTATION.
+ 
+  METHOD constructor.
+    mi_custom_mapping = ii_custom_mapping.
+    mv_corresponding  = iv_corresponding.
+  ENDMETHOD.
+ 
+  METHOD to_abap.
+ 
+    DATA lr_ref TYPE REF TO data.
+ 
+    CLEAR c_container. " what about data/obj refs ?
+    CLEAR mt_node_type_cache.
+ 
+    GET REFERENCE OF c_container INTO lr_ref.
+    GET REFERENCE OF it_nodes INTO mr_nodes.
+ 
+    get_node_type( i_container_ref = lr_ref ). " Pre-cache root node type
+ 
+    any_to_abap(
+      iv_path         = ''
+      i_container_ref = lr_ref ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_node_type.
+ 
+    DATA lv_node_type_path TYPE string.
+    DATA lo_sdescr TYPE REF TO cl_abap_structdescr.
+    DATA lo_tdescr TYPE REF TO cl_abap_tabledescr.
+    DATA lo_ddescr TYPE REF TO cl_abap_datadescr.
+ 
+    " Calculate type path
+    IF is_parent_type-type_kind = lif_kind=>table.
+      lv_node_type_path = is_parent_type-type_path && '/-'. " table item type
+    ELSEIF is_parent_type-type_kind IS NOT INITIAL.
+      lv_node_type_path = is_parent_type-type_path && '/' && is_node-name.
+    ENDIF. " For root node lv_node_type_path remains ''
+ 
+    " Get or create cached
+    READ TABLE mt_node_type_cache INTO rs_node_type WITH KEY type_path = lv_node_type_path.
+    IF sy-subrc <> 0.
+ 
+      rs_node_type-type_path         = lv_node_type_path.
+ 
+      IF mi_custom_mapping IS BOUND.
+        rs_node_type-target_field_name = to_upper( mi_custom_mapping->to_abap(
+          iv_path = is_node-path
+          iv_name = is_node-name ) ).
+        IF rs_node_type-target_field_name IS INITIAL.
+          rs_node_type-target_field_name = to_upper( is_node-name ).
+        ENDIF.
+      ELSE.
+        rs_node_type-target_field_name = to_upper( is_node-name ).
+      ENDIF.
+ 
+      CASE is_parent_type-type_kind.
+        WHEN lif_kind=>table.
+          lo_tdescr ?= is_parent_type-dd.
+          rs_node_type-dd = lo_tdescr->get_table_line_type( ).
+ 
+        WHEN lif_kind=>struct_flat OR lif_kind=>struct_deep.
+          lo_sdescr ?= is_parent_type-dd.
+          lo_sdescr->get_component_type(
+            EXPORTING
+              p_name      = rs_node_type-target_field_name
+            RECEIVING
+              p_descr_ref = rs_node_type-dd
+            EXCEPTIONS
+              component_not_found = 4 ).
+          IF sy-subrc <> 0.
+            IF mv_corresponding = abap_false.
+              zcx_abapgit_ajson_error=>raise( |Path not found| ).
+            ELSE.
+              CLEAR rs_node_type.
+              RETURN.
+            ENDIF.
+          ENDIF.
+ 
+        WHEN ''. " Root node
+          rs_node_type-dd ?= cl_abap_typedescr=>describe_by_data_ref( i_container_ref ).
+ 
+        WHEN OTHERS.
+          zcx_abapgit_ajson_error=>raise( |Unexpected parent type| ).
+      ENDCASE.
+ 
+      rs_node_type-type_kind         = rs_node_type-dd->type_kind. " for caching and cleaner unintialized access
+      IF rs_node_type-type_kind = lif_kind=>table.
+        lo_tdescr ?= rs_node_type-dd.
+        IF lo_tdescr->table_kind <> cl_abap_tabledescr=>tablekind_std.
+          lo_ddescr = lo_tdescr->get_table_line_type( ).
+          CREATE DATA rs_node_type-tab_item_buf TYPE HANDLE lo_ddescr.
+        ENDIF.
+      ENDIF.
+ 
+      INSERT rs_node_type INTO TABLE mt_node_type_cache.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD any_to_abap.
+ 
+    DATA ls_node_type LIKE LINE OF mt_node_type_cache.
+    DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
+    DATA lx_root TYPE REF TO cx_root.
+    DATA lr_target_field TYPE REF TO data.
+ 
+    FIELD-SYMBOLS <n> TYPE zif_abapgit_ajson_types=>ty_node.
+    FIELD-SYMBOLS <parent_stdtab> TYPE STANDARD TABLE.
+    FIELD-SYMBOLS <parent_anytab> TYPE ANY TABLE.
+    FIELD-SYMBOLS <parent_struc> TYPE any.
+    FIELD-SYMBOLS <tab_item> TYPE any.
+ 
+    " Assign container
+    CASE is_parent_type-type_kind.
+      WHEN lif_kind=>table.
+        IF is_parent_type-tab_item_buf IS BOUND. " Indirect hint that table was sorted/hashed, see get_node_type.
+          ASSIGN i_container_ref->* TO <parent_anytab>.
+          ASSERT sy-subrc = 0.
+ 
+          lr_target_field = is_parent_type-tab_item_buf. " For hashed/sorted table - same buffer for all children
+          ASSIGN is_parent_type-tab_item_buf->* TO <tab_item>.
+          ASSERT sy-subrc = 0.
+ 
+        ELSE.
+          ASSIGN i_container_ref->* TO <parent_stdtab>.
+          ASSERT sy-subrc = 0.
+        ENDIF.
+ 
+      WHEN lif_kind=>struct_flat OR lif_kind=>struct_deep.
+        ASSIGN i_container_ref->* TO <parent_struc>.
+        ASSERT sy-subrc = 0.
+    ENDCASE.
+ 
+    TRY.
+ 
+      " array_index because stringified index goes in wrong order [1, 10, 2 ...]
+        LOOP AT mr_nodes->* ASSIGNING <n> USING KEY array_index WHERE path = iv_path.
+ 
+        " Get or create type cache record
+          IF is_parent_type-type_kind <> lif_kind=>table OR ls_node_type-type_kind IS INITIAL.
+          " table records are the same, no need to refetch twice
+ 
+            ls_node_type = get_node_type(
+            is_node        = <n>
+            is_parent_type = is_parent_type ).
+ 
+            IF mv_corresponding = abap_true AND ls_node_type IS INITIAL.
+              CONTINUE.
+            ENDIF.
+ 
+          ENDIF.
+ 
+        " Validate node type
+          IF ls_node_type-type_kind = lif_kind=>data_ref OR
+           ls_node_type-type_kind = lif_kind=>object_ref.
+          " TODO maybe in future
+            zcx_abapgit_ajson_error=>raise( 'Cannot assign to ref' ).
+          ENDIF.
+ 
+        " Find target field reference
+          CASE is_parent_type-type_kind.
+            WHEN lif_kind=>table.
+              IF NOT ls_node_type-target_field_name CO '0123456789'.
+              " Does not affect anything actually but for integrity
+                zcx_abapgit_ajson_error=>raise( 'Need index to access tables' ).
+              ENDIF.
+ 
+              IF is_parent_type-tab_item_buf IS NOT BOUND. " Indirect hint that table was srt/hsh, see get_node_type
+                APPEND INITIAL LINE TO <parent_stdtab> REFERENCE INTO lr_target_field.
+                ASSERT sy-subrc = 0.
+              ENDIF.
+ 
+            WHEN lif_kind=>struct_flat OR lif_kind=>struct_deep.
+              FIELD-SYMBOLS <field> TYPE any.
+              ASSIGN COMPONENT ls_node_type-target_field_name OF STRUCTURE <parent_struc> TO <field>.
+              ASSERT sy-subrc = 0.
+              GET REFERENCE OF <field> INTO lr_target_field.
+ 
+            WHEN ''. " Root node
+              lr_target_field = i_container_ref.
+ 
+            WHEN OTHERS.
+              zcx_abapgit_ajson_error=>raise( 'Unexpected parent type' ).
+          ENDCASE.
+ 
+        " Process value assignment
+          CASE <n>-type.
+            WHEN zif_abapgit_ajson_types=>node_type-object.
+              IF ls_node_type-type_kind <> lif_kind=>struct_flat AND
+               ls_node_type-type_kind <> lif_kind=>struct_deep.
+                zcx_abapgit_ajson_error=>raise( 'Expected structure' ).
+              ENDIF.
+              any_to_abap(
+              iv_path         = <n>-path && <n>-name && '/'
+              is_parent_type  = ls_node_type
+              i_container_ref = lr_target_field ).
+ 
+            WHEN zif_abapgit_ajson_types=>node_type-array.
+              IF NOT ls_node_type-type_kind = lif_kind=>table.
+                zcx_abapgit_ajson_error=>raise( 'Expected table' ).
+              ENDIF.
+              any_to_abap(
+              iv_path         = <n>-path && <n>-name && '/'
+              is_parent_type  = ls_node_type
+              i_container_ref = lr_target_field ).
+ 
+            WHEN OTHERS.
+              value_to_abap(
+              is_node         = <n>
+              is_node_type    = ls_node_type
+              i_container_ref = lr_target_field ).
+          ENDCASE.
+ 
+          IF is_parent_type-tab_item_buf IS BOUND. " Indirect hint that table was sorted/hashed, see get_node_type.
+            TRY.
+                INSERT <tab_item> INTO TABLE <parent_anytab>.
+                IF sy-subrc <> 0.
+                  zcx_abapgit_ajson_error=>raise( 'Duplicate insertion' ).
+                ENDIF.
+              CATCH cx_sy_itab_duplicate_key.
+                zcx_abapgit_ajson_error=>raise( 'Duplicate insertion' ).
+            ENDTRY.
+          ENDIF.
+ 
+        ENDLOOP.
+ 
+      CATCH zcx_abapgit_ajson_error INTO lx_ajson.
+        IF lx_ajson->location IS INITIAL.
+          lx_ajson->set_location( <n>-path && <n>-name ).
+        ENDIF.
+        RAISE EXCEPTION lx_ajson.
+      CATCH cx_sy_conversion_no_number.
+        zcx_abapgit_ajson_error=>raise(
+        iv_msg = 'Source is not a number'
+        iv_location = <n>-path && <n>-name ).
+      CATCH cx_root INTO lx_root.
+        zcx_abapgit_ajson_error=>raise(
+        iv_msg = lx_root->get_text( )
+        iv_location = <n>-path && <n>-name ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD value_to_abap.
+ 
+    FIELD-SYMBOLS <container> TYPE any.
+ 
+    IF is_node_type-type_kind CA lif_kind=>deep_targets.
+      zcx_abapgit_ajson_error=>raise( |Unsupported target for value [{ is_node_type-type_kind }]| ).
+    ENDIF.
+ 
+    ASSIGN i_container_ref->* TO <container>.
+    ASSERT sy-subrc = 0.
+ 
+    CASE is_node-type.
+      WHEN zif_abapgit_ajson_types=>node_type-null.
+        " Do nothing
+      WHEN zif_abapgit_ajson_types=>node_type-boolean.
+        " TODO: check type ?
+        <container> = boolc( is_node-value = 'true' ).
+      WHEN zif_abapgit_ajson_types=>node_type-number.
+        " TODO: check type ?
+        <container> = is_node-value.
+ 
+      WHEN zif_abapgit_ajson_types=>node_type-string.
+        " TODO: check type ?
+        IF is_node_type-type_kind = lif_kind=>date AND is_node-value IS NOT INITIAL.
+          <container> = to_date( is_node-value ).
+        ELSEIF is_node_type-type_kind = lif_kind=>packed AND is_node-value IS NOT INITIAL.
+          <container> = to_timestamp( is_node-value ).
+        ELSE.
+          <container> = is_node-value.
+        ENDIF.
+      WHEN OTHERS.
+        zcx_abapgit_ajson_error=>raise( |Unexpected JSON type [{ is_node-type }]| ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+  METHOD to_date.
+ 
+    DATA lv_y TYPE c LENGTH 4.
+    DATA lv_m TYPE c LENGTH 2.
+    DATA lv_d TYPE c LENGTH 2.
+ 
+    FIND FIRST OCCURRENCE OF REGEX '^(\d{4})-(\d{2})-(\d{2})(T|$)'
+      IN iv_value
+      SUBMATCHES lv_y lv_m lv_d.
+    IF sy-subrc <> 0.
+      zcx_abapgit_ajson_error=>raise( 'Unexpected date format' ).
+    ENDIF.
+    CONCATENATE lv_y lv_m lv_d INTO rv_result.
+ 
+  ENDMETHOD.
+ 
+  METHOD to_timestamp.
+ 
+    CONSTANTS lc_utc TYPE c LENGTH 6 VALUE 'UTC'.
+    CONSTANTS lc_regex_ts_with_hour TYPE string
+      VALUE `^(\d{4})-(\d{2})-(\d{2})(T)(\d{2}):(\d{2}):(\d{2})(\+)(\d{2}):(\d{2})`.
+    CONSTANTS lc_regex_ts_utc TYPE string
+      VALUE `^(\d{4})-(\d{2})-(\d{2})(T)(\d{2}):(\d{2}):(\d{2})(Z|$)`.
+ 
+    DATA:
+      BEGIN OF ls_timestamp,
+        year         TYPE c LENGTH 4,
+        month        TYPE c LENGTH 2,
+        day          TYPE c LENGTH 2,
+        t            TYPE c LENGTH 1,
+        hour         TYPE c LENGTH 2,
+        minute       TYPE c LENGTH 2,
+        second       TYPE c LENGTH 2,
+        local_sign   TYPE c LENGTH 1,
+        local_hour   TYPE c LENGTH 2,
+        local_minute TYPE c LENGTH 2,
+      END OF ls_timestamp.
+ 
+    DATA lv_date TYPE d.
+    DATA lv_time TYPE t.
+    DATA lv_seconds_conv TYPE i.
+    DATA lv_timestamp TYPE timestampl.
+ 
+    FIND FIRST OCCURRENCE OF REGEX lc_regex_ts_with_hour
+      IN iv_value SUBMATCHES
+        ls_timestamp-year ls_timestamp-month ls_timestamp-day ls_timestamp-t
+        ls_timestamp-hour ls_timestamp-minute ls_timestamp-second
+        ls_timestamp-local_sign ls_timestamp-local_hour ls_timestamp-local_minute.
+ 
+    IF sy-subrc = 0.
+ 
+      lv_seconds_conv = ( ls_timestamp-local_hour * 3600 ) + ( ls_timestamp-local_minute * 60 ).
+ 
+    ELSE.
+ 
+      FIND FIRST OCCURRENCE OF REGEX lc_regex_ts_utc
+        IN iv_value SUBMATCHES
+          ls_timestamp-year ls_timestamp-month ls_timestamp-day ls_timestamp-t
+          ls_timestamp-hour ls_timestamp-minute ls_timestamp-second.
+ 
+      IF sy-subrc <> 0.
+        zcx_abapgit_ajson_error=>raise( 'Unexpected timestamp format' ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+    CONCATENATE ls_timestamp-year ls_timestamp-month ls_timestamp-day INTO lv_date.
+    CONCATENATE ls_timestamp-hour ls_timestamp-minute ls_timestamp-second INTO lv_time.
+ 
+    CONVERT DATE lv_date TIME lv_time INTO TIME STAMP lv_timestamp TIME ZONE lc_utc.
+ 
+    TRY.
+ 
+        CASE ls_timestamp-local_sign.
+          WHEN '-'.
+            lv_timestamp = cl_abap_tstmp=>add(
+            tstmp = lv_timestamp
+            secs  = lv_seconds_conv ).
+          WHEN '+'.
+            lv_timestamp = cl_abap_tstmp=>subtractsecs(
+            tstmp = lv_timestamp
+            secs  = lv_seconds_conv ).
+        ENDCASE.
+ 
+      CATCH cx_parameter_invalid_range cx_parameter_invalid_type.
+        zcx_abapgit_ajson_error=>raise( 'Unexpected error calculating timestamp' ).
+    ENDTRY.
+ 
+    IF lv_timestamp IS NOT INITIAL.
+      cl_abap_tstmp=>move(
+        EXPORTING
+          tstmp_src = lv_timestamp
+        IMPORTING
+          tstmp_tgt = rv_result ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* ABAP_TO_JSON
+**********************************************************************
+ 
+CLASS lcl_abap_to_json DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS convert
+      IMPORTING
+        iv_data            TYPE any
+        is_prefix          TYPE zif_abapgit_ajson_types=>ty_path_name OPTIONAL
+        iv_array_index     TYPE i DEFAULT 0
+        ii_custom_mapping  TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        is_opts            TYPE zif_abapgit_ajson=>ty_opts OPTIONAL
+        iv_item_order      TYPE i DEFAULT 0
+      RETURNING
+        VALUE(rt_nodes)   TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    CLASS-METHODS insert_with_type
+      IMPORTING
+        iv_data            TYPE any
+        iv_type            TYPE zif_abapgit_ajson_types=>ty_node_type
+        is_prefix          TYPE zif_abapgit_ajson_types=>ty_path_name OPTIONAL
+        iv_array_index     TYPE i DEFAULT 0
+        ii_custom_mapping  TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        is_opts            TYPE zif_abapgit_ajson=>ty_opts OPTIONAL
+        iv_item_order      TYPE i DEFAULT 0
+      RETURNING
+        VALUE(rt_nodes)   TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    CLASS-METHODS format_date
+      IMPORTING
+        iv_date TYPE d
+      RETURNING
+        VALUE(rv_str) TYPE string.
+    CLASS-METHODS format_time
+      IMPORTING
+        iv_time TYPE t
+      RETURNING
+        VALUE(rv_str) TYPE string.
+    CLASS-METHODS format_timestamp
+      IMPORTING
+        iv_ts TYPE timestamp
+      RETURNING
+        VALUE(rv_str) TYPE string.
+ 
+    CLASS-METHODS class_constructor.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gv_ajson_absolute_type_name TYPE string.
+    DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA mv_keep_item_order TYPE abap_bool.
+    DATA mv_format_datetime TYPE abap_bool.
+ 
+    METHODS convert_any
+      IMPORTING
+        iv_data TYPE any
+        io_type TYPE REF TO cl_abap_typedescr
+        is_prefix TYPE zif_abapgit_ajson_types=>ty_path_name
+        iv_index TYPE i DEFAULT 0
+        iv_item_order TYPE i DEFAULT 0
+      CHANGING
+        ct_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS convert_ajson
+      IMPORTING
+        io_json TYPE REF TO zif_abapgit_ajson
+        is_prefix TYPE zif_abapgit_ajson_types=>ty_path_name
+        iv_index TYPE i DEFAULT 0
+        iv_item_order TYPE i DEFAULT 0
+      CHANGING
+        ct_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS convert_value
+      IMPORTING
+        iv_data TYPE any
+        io_type TYPE REF TO cl_abap_typedescr
+        is_prefix TYPE zif_abapgit_ajson_types=>ty_path_name
+        iv_index TYPE i DEFAULT 0
+        iv_item_order TYPE i DEFAULT 0
+      CHANGING
+        ct_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS convert_ref
+      IMPORTING
+        iv_data TYPE any
+        is_prefix TYPE zif_abapgit_ajson_types=>ty_path_name
+        iv_index TYPE i DEFAULT 0
+        iv_item_order TYPE i DEFAULT 0
+      CHANGING
+        ct_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS convert_struc
+      IMPORTING
+        iv_data TYPE any
+        io_type TYPE REF TO cl_abap_typedescr
+        is_prefix TYPE zif_abapgit_ajson_types=>ty_path_name
+        iv_index TYPE i DEFAULT 0
+        iv_item_order TYPE i DEFAULT 0
+      CHANGING
+        ct_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+        cs_root  TYPE zif_abapgit_ajson_types=>ty_node OPTIONAL
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS convert_table
+      IMPORTING
+        iv_data TYPE any
+        io_type TYPE REF TO cl_abap_typedescr
+        is_prefix TYPE zif_abapgit_ajson_types=>ty_path_name
+        iv_index TYPE i DEFAULT 0
+        iv_item_order TYPE i DEFAULT 0
+      CHANGING
+        ct_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+    METHODS insert_value_with_type
+      IMPORTING
+        iv_data TYPE any
+        iv_type TYPE zif_abapgit_ajson_types=>ty_node_type
+        io_type TYPE REF TO cl_abap_typedescr
+        is_prefix TYPE zif_abapgit_ajson_types=>ty_path_name
+        iv_index TYPE i DEFAULT 0
+        iv_item_order TYPE i DEFAULT 0
+      CHANGING
+        ct_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS lcl_abap_to_json IMPLEMENTATION.
+ 
+  METHOD class_constructor.
+ 
+    DATA lo_dummy TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_type TYPE REF TO cl_abap_refdescr.
+    lo_type ?= cl_abap_typedescr=>describe_by_data( lo_dummy ).
+    gv_ajson_absolute_type_name = lo_type->get_referenced_type( )->absolute_name.
+ 
+  ENDMETHOD.
+ 
+  METHOD convert.
+ 
+    DATA lo_type TYPE REF TO cl_abap_typedescr.
+    DATA lo_converter TYPE REF TO lcl_abap_to_json.
+ 
+    lo_type = cl_abap_typedescr=>describe_by_data( iv_data ).
+ 
+    CREATE OBJECT lo_converter.
+    lo_converter->mi_custom_mapping  = ii_custom_mapping.
+    lo_converter->mv_keep_item_order = is_opts-keep_item_order.
+    lo_converter->mv_format_datetime = is_opts-format_datetime.
+ 
+    lo_converter->convert_any(
+      EXPORTING
+        iv_data       = iv_data
+        io_type       = lo_type
+        is_prefix     = is_prefix
+        iv_index      = iv_array_index
+        iv_item_order = iv_item_order
+      CHANGING
+        ct_nodes = rt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD convert_any.
+ 
+    CASE io_type->kind.
+      WHEN cl_abap_typedescr=>kind_elem.
+        convert_value(
+          EXPORTING
+            iv_data   = iv_data
+            io_type   = io_type
+            is_prefix = is_prefix
+            iv_index  = iv_index
+            iv_item_order = iv_item_order
+          CHANGING
+            ct_nodes = ct_nodes ).
+ 
+      WHEN cl_abap_typedescr=>kind_struct.
+        convert_struc(
+          EXPORTING
+            iv_data   = iv_data
+            io_type   = io_type
+            is_prefix = is_prefix
+            iv_index  = iv_index
+            iv_item_order = iv_item_order
+          CHANGING
+            ct_nodes = ct_nodes ).
+ 
+      WHEN cl_abap_typedescr=>kind_table.
+        convert_table(
+          EXPORTING
+            iv_data   = iv_data
+            io_type   = io_type
+            is_prefix = is_prefix
+            iv_index  = iv_index
+            iv_item_order = iv_item_order
+          CHANGING
+            ct_nodes = ct_nodes ).
+ 
+      WHEN OTHERS.
+ 
+        IF io_type->type_kind = lif_kind=>data_ref OR iv_data IS INITIAL.
+          " Convert data references and initial references to other types (like ref to class or interface)
+          " Initial references will result in "null"
+          convert_ref(
+            EXPORTING
+              iv_data   = iv_data
+              is_prefix = is_prefix
+              iv_index  = iv_index
+              iv_item_order = iv_item_order
+            CHANGING
+              ct_nodes = ct_nodes ).
+ 
+        ELSEIF io_type->type_kind = lif_kind=>object_ref
+          AND cl_abap_typedescr=>describe_by_object_ref( iv_data )->absolute_name = gv_ajson_absolute_type_name.
+          convert_ajson(
+            EXPORTING
+              io_json   = iv_data
+              is_prefix = is_prefix
+              iv_index  = iv_index
+              iv_item_order = iv_item_order
+            CHANGING
+              ct_nodes = ct_nodes ).
+        ELSE.
+          zcx_abapgit_ajson_error=>raise( |Unsupported type [{ io_type->type_kind
+            }] @{ is_prefix-path && is_prefix-name }| ).
+        ENDIF.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+  METHOD convert_ajson.
+ 
+    FIELD-SYMBOLS <src> LIKE LINE OF ct_nodes.
+    FIELD-SYMBOLS <dst> LIKE LINE OF ct_nodes.
+ 
+    IF io_json IS NOT BOUND.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT io_json->mt_json_tree ASSIGNING <src>.
+      APPEND <src> TO ct_nodes ASSIGNING <dst>.
+ 
+      IF <dst>-path IS INITIAL AND <dst>-name IS INITIAL. " root node
+        <dst>-path  = is_prefix-path.
+        <dst>-name  = is_prefix-name.
+        <dst>-index = iv_index.
+        <dst>-order = iv_item_order.
+      ELSE.
+        <dst>-path = is_prefix-path && is_prefix-name && <dst>-path.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD format_date.
+    IF iv_date IS NOT INITIAL.
+      rv_str = iv_date+0(4) && '-' && iv_date+4(2) && '-' && iv_date+6(2).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD format_time.
+    IF iv_time IS NOT INITIAL.
+      rv_str = iv_time+0(2) && ':' && iv_time+2(2) && ':' && iv_time+4(2).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD format_timestamp.
+ 
+    CONSTANTS lc_utc TYPE c LENGTH 6 VALUE 'UTC'.
+ 
+    DATA lv_date TYPE d.
+    DATA lv_time TYPE t.
+ 
+    CONVERT TIME STAMP iv_ts TIME ZONE lc_utc
+      INTO DATE lv_date TIME lv_time.
+ 
+    rv_str =
+      lv_date+0(4) && '-' && lv_date+4(2) && '-' && lv_date+6(2) &&
+      'T' &&
+      lv_time+0(2) && ':' && lv_time+2(2) && ':' && lv_time+4(2) &&
+      'Z'.
+ 
+  ENDMETHOD.
+ 
+  METHOD convert_value.
+ 
+    DATA ls_node LIKE LINE OF ct_nodes.
+ 
+    ls_node-path  = is_prefix-path.
+    ls_node-name  = is_prefix-name.
+    ls_node-index = iv_index.
+    ls_node-order = iv_item_order.
+ 
+    IF ls_node-name IS INITIAL.
+      ls_node-name  = is_prefix-name.
+    ENDIF.
+ 
+    IF io_type->absolute_name = '\TYPE-POOL=ABAP\TYPE=ABAP_BOOL'
+        OR io_type->absolute_name = '\TYPE=ABAP_BOOLEAN'
+        OR io_type->absolute_name = '\TYPE=XSDBOOLEAN'
+        OR io_type->absolute_name = '\TYPE=FLAG'
+        OR io_type->absolute_name = '\TYPE=XFELD'.
+      ls_node-type = zif_abapgit_ajson_types=>node_type-boolean.
+      IF iv_data IS NOT INITIAL.
+        ls_node-value = 'true'.
+      ELSE.
+        ls_node-value = 'false'.
+      ENDIF.
+    ELSEIF io_type->absolute_name = '\TYPE=TIMESTAMP'.
+      IF mv_format_datetime = abap_true.
+        ls_node-type  = zif_abapgit_ajson_types=>node_type-string.
+        ls_node-value = format_timestamp( iv_data ).
+      ELSE.
+        ls_node-type  = zif_abapgit_ajson_types=>node_type-number.
+        ls_node-value = |{ iv_data }|.
+      ENDIF.
+    ELSEIF io_type->type_kind CO lif_kind=>texts OR
+           io_type->type_kind CO lif_kind=>binary OR
+           io_type->type_kind CO lif_kind=>enum.
+      ls_node-type = zif_abapgit_ajson_types=>node_type-string.
+      ls_node-value = |{ iv_data }|.
+    ELSEIF io_type->type_kind = lif_kind=>date.
+      ls_node-type = zif_abapgit_ajson_types=>node_type-string.
+      IF mv_format_datetime = abap_true.
+        ls_node-value = format_date( iv_data ).
+      ELSE.
+        ls_node-value = |{ iv_data }|.
+      ENDIF.
+    ELSEIF io_type->type_kind = lif_kind=>time.
+      ls_node-type = zif_abapgit_ajson_types=>node_type-string.
+      IF mv_format_datetime = abap_true.
+        ls_node-value = format_time( iv_data ).
+      ELSE.
+        ls_node-value = |{ iv_data }|.
+      ENDIF.
+    ELSEIF io_type->type_kind CO lif_kind=>numeric.
+      ls_node-type = zif_abapgit_ajson_types=>node_type-number.
+      ls_node-value = |{ iv_data }|.
+    ELSE.
+      zcx_abapgit_ajson_error=>raise( |Unexpected elementary type [{
+        io_type->type_kind }] @{ is_prefix-path && is_prefix-name }| ).
+    ENDIF.
+ 
+    APPEND ls_node TO ct_nodes.
+ 
+  ENDMETHOD.
+ 
+  METHOD convert_ref.
+ 
+    DATA ls_node LIKE LINE OF ct_nodes.
+ 
+    ls_node-path  = is_prefix-path.
+    ls_node-name  = is_prefix-name.
+    ls_node-index = iv_index.
+    ls_node-order = iv_item_order.
+ 
+    IF mi_custom_mapping IS BOUND.
+      ls_node-name = mi_custom_mapping->to_json(
+        iv_path = is_prefix-path
+        iv_name = is_prefix-name ).
+    ENDIF.
+ 
+    IF ls_node-name IS INITIAL.
+      ls_node-name  = is_prefix-name.
+    ENDIF.
+ 
+    IF iv_data IS INITIAL.
+      ls_node-type  = zif_abapgit_ajson_types=>node_type-null.
+      ls_node-value = 'null'.
+    ELSE.
+      " TODO support data references
+      zcx_abapgit_ajson_error=>raise( |Unexpected reference @{ is_prefix-path && is_prefix-name }| ).
+    ENDIF.
+ 
+    APPEND ls_node TO ct_nodes.
+ 
+  ENDMETHOD.
+ 
+  METHOD convert_struc.
+ 
+    DATA lo_struc TYPE REF TO cl_abap_structdescr.
+    DATA lt_comps TYPE cl_abap_structdescr=>component_table.
+    DATA ls_next_prefix LIKE is_prefix.
+    DATA lv_mapping_prefix_name LIKE is_prefix-name.
+    DATA lv_item_order TYPE i.
+    DATA ls_root LIKE LINE OF ct_nodes.
+ 
+    FIELD-SYMBOLS <root> LIKE ls_root.
+    FIELD-SYMBOLS <c> LIKE LINE OF lt_comps.
+    FIELD-SYMBOLS <val> TYPE any.
+ 
+    " Object root
+ 
+    IF cs_root IS SUPPLIED. " call for include structure
+      ASSIGN cs_root TO <root>.
+    ELSE. " First call
+      ls_root-path  = is_prefix-path.
+      ls_root-name  = is_prefix-name.
+      ls_root-type  = zif_abapgit_ajson_types=>node_type-object.
+      ls_root-index = iv_index.
+ 
+      IF mi_custom_mapping IS BOUND.
+        ls_root-name = mi_custom_mapping->to_json(
+          iv_path = is_prefix-path
+          iv_name = is_prefix-name ).
+      ENDIF.
+ 
+      IF ls_root-name IS INITIAL.
+        ls_root-name  = is_prefix-name.
+      ENDIF.
+ 
+      ls_root-order = iv_item_order.
+ 
+      APPEND ls_root TO ct_nodes ASSIGNING <root>.
+ 
+    ENDIF.
+ 
+    " Object attributes
+ 
+    lo_struc ?= io_type.
+    lt_comps = lo_struc->get_components( ).
+    " get_components is potentially much slower than lo_struc->components
+    " but ! we still need it to identify booleans
+    " and rtti seems to cache type descriptions really well (https://github.com/sbcgua/benchmarks.git)
+    " the structures will be repeated in real life
+ 
+    ls_next_prefix-path = is_prefix-path && <root>-name && '/'.
+ 
+    LOOP AT lt_comps ASSIGNING <c>.
+      CLEAR lv_mapping_prefix_name.
+ 
+      IF <c>-as_include = abap_true.
+
+        convert_struc(
+          EXPORTING
+            iv_data   = iv_data
+            io_type   = <c>-type
+            is_prefix = is_prefix
+          CHANGING
+            cs_root  = <root>
+            ct_nodes = ct_nodes ).
+
+      ELSE.
+ 
+        <root>-children = <root>-children + 1.
+        ls_next_prefix-name = to_lower( <c>-name ).
+        ASSIGN COMPONENT <c>-name OF STRUCTURE iv_data TO <val>.
+        ASSERT sy-subrc = 0.
+ 
+        IF mi_custom_mapping IS BOUND AND <c>-type->kind = cl_abap_typedescr=>kind_elem.
+          lv_mapping_prefix_name = mi_custom_mapping->to_json( iv_path = ls_next_prefix-path
+                                                               iv_name = ls_next_prefix-name ).
+        ENDIF.
+ 
+        IF lv_mapping_prefix_name IS NOT INITIAL.
+          ls_next_prefix-name = lv_mapping_prefix_name.
+        ENDIF.
+ 
+        IF mv_keep_item_order = abap_true.
+          lv_item_order = <root>-children.
+        ENDIF.
+ 
+        convert_any(
+          EXPORTING
+            iv_data   = <val>
+            io_type   = <c>-type
+            is_prefix = ls_next_prefix
+            iv_item_order = lv_item_order
+          CHANGING
+            ct_nodes = ct_nodes ).
+ 
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD convert_table.
+ 
+    DATA lo_table TYPE REF TO cl_abap_tabledescr.
+    DATA lo_ltype TYPE REF TO cl_abap_typedescr.
+    DATA ls_next_prefix LIKE is_prefix.
+    DATA lv_tabix TYPE sy-tabix.
+    DATA ls_root LIKE LINE OF ct_nodes.
+ 
+    FIELD-SYMBOLS <root> LIKE ls_root.
+    FIELD-SYMBOLS <tab> TYPE ANY TABLE.
+    FIELD-SYMBOLS <val> TYPE any.
+ 
+    " Array root
+ 
+    ls_root-path  = is_prefix-path.
+    ls_root-name  = is_prefix-name.
+    ls_root-type  = zif_abapgit_ajson_types=>node_type-array.
+    ls_root-index = iv_index.
+    ls_root-order = iv_item_order.
+ 
+    IF mi_custom_mapping IS BOUND.
+      ls_root-name = mi_custom_mapping->to_json(
+        iv_path = is_prefix-path
+        iv_name = is_prefix-name ).
+    ENDIF.
+ 
+    IF ls_root-name IS INITIAL.
+      ls_root-name  = is_prefix-name.
+    ENDIF.
+ 
+    APPEND ls_root TO ct_nodes ASSIGNING <root>.
+ 
+    " Array items
+ 
+    lo_table ?= io_type.
+    lo_ltype  = lo_table->get_table_line_type( ).
+ 
+    ls_next_prefix-path = is_prefix-path && <root>-name && '/'.
+    ASSIGN iv_data TO <tab>.
+ 
+    lv_tabix = 1.
+    LOOP AT <tab> ASSIGNING <val>.
+      ls_next_prefix-name = to_lower( |{ lv_tabix }| ).
+ 
+      convert_any(
+        EXPORTING
+          iv_data   = <val>
+          io_type   = lo_ltype
+          is_prefix = ls_next_prefix
+          iv_index  = <root>-children + 1
+        CHANGING
+          ct_nodes = ct_nodes ).
+ 
+      <root>-children = <root>-children + 1.
+      lv_tabix = lv_tabix + 1.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD insert_with_type.
+ 
+    DATA lo_type TYPE REF TO cl_abap_typedescr.
+    DATA lo_converter TYPE REF TO lcl_abap_to_json.
+ 
+    lo_type = cl_abap_typedescr=>describe_by_data( iv_data ).
+ 
+    CREATE OBJECT lo_converter.
+    lo_converter->mi_custom_mapping  = ii_custom_mapping.
+    lo_converter->mv_keep_item_order = is_opts-keep_item_order.
+    lo_converter->mv_format_datetime = is_opts-format_datetime.
+ 
+    lo_converter->insert_value_with_type(
+      EXPORTING
+        iv_data       = iv_data
+        iv_type       = iv_type
+        io_type       = lo_type
+        is_prefix     = is_prefix
+        iv_index      = iv_array_index
+        iv_item_order = iv_item_order
+      CHANGING
+        ct_nodes = rt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD insert_value_with_type.
+ 
+    DATA lv_prefix TYPE string.
+    DATA ls_node LIKE LINE OF ct_nodes.
+ 
+    lv_prefix = is_prefix-path && is_prefix-name.
+    IF io_type->type_kind CO lif_kind=>texts OR
+       io_type->type_kind CO lif_kind=>date OR
+       io_type->type_kind CO lif_kind=>time.
+      IF iv_type = zif_abapgit_ajson_types=>node_type-boolean AND iv_data <> 'true' AND iv_data <> 'false'.
+        zcx_abapgit_ajson_error=>raise( |Unexpected boolean value [{ iv_data }] @{ lv_prefix }| ).
+      ELSEIF iv_type = zif_abapgit_ajson_types=>node_type-null AND iv_data IS NOT INITIAL.
+        zcx_abapgit_ajson_error=>raise( |Unexpected null value [{ iv_data }] @{ lv_prefix }| ).
+      ELSEIF iv_type = zif_abapgit_ajson_types=>node_type-number AND iv_data CN '0123456789. E+-'.
+        zcx_abapgit_ajson_error=>raise( |Unexpected numeric value [{ iv_data }] @{ lv_prefix }| ).
+      ELSEIF iv_type <> zif_abapgit_ajson_types=>node_type-string AND iv_type <> zif_abapgit_ajson_types=>node_type-boolean
+        AND iv_type <> zif_abapgit_ajson_types=>node_type-null AND iv_type <> zif_abapgit_ajson_types=>node_type-number.
+        zcx_abapgit_ajson_error=>raise( |Unexpected type for value [{ iv_type },{ iv_data }] @{ lv_prefix }| ).
+      ENDIF.
+    ELSEIF io_type->type_kind CO lif_kind=>numeric.
+      IF iv_type <> zif_abapgit_ajson_types=>node_type-number.
+        zcx_abapgit_ajson_error=>raise( |Unexpected value for numeric [{ iv_data }] @{ lv_prefix }| ).
+      ENDIF.
+    ELSE.
+      zcx_abapgit_ajson_error=>raise( |Unexpected type [{ io_type->type_kind }] @{ lv_prefix }| ).
+    ENDIF.
+ 
+    ls_node-path  = is_prefix-path.
+    ls_node-name  = is_prefix-name.
+    ls_node-index = iv_index.
+    ls_node-value = iv_data.
+    ls_node-type  = iv_type.
+    ls_node-order = iv_item_order.
+ 
+    IF mi_custom_mapping IS BOUND.
+      ls_node-name = mi_custom_mapping->to_json(
+        iv_path = is_prefix-path
+        iv_name = is_prefix-name ).
+    ENDIF.
+ 
+    IF ls_node-name IS INITIAL.
+      ls_node-name  = is_prefix-name.
+    ENDIF.
+ 
+    APPEND ls_node TO ct_nodes.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* MUTATOR INTERFACE
+**********************************************************************
+ 
+INTERFACE lif_mutator_runner.
+  METHODS run
+    IMPORTING
+      it_source_tree TYPE zif_abapgit_ajson_types=>ty_nodes_ts
+    EXPORTING
+      et_dest_tree TYPE zif_abapgit_ajson_types=>ty_nodes_ts
+    RAISING
+      zcx_abapgit_ajson_error.
+ENDINTERFACE.
+ 
+**********************************************************************
+* FILTER RUNNER
+**********************************************************************
+ 
+CLASS lcl_filter_runner DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES lif_mutator_runner.
+    CLASS-METHODS new
+      IMPORTING
+        ii_filter TYPE REF TO zif_abapgit_ajson_filter
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO lcl_filter_runner.
+    METHODS constructor
+      IMPORTING
+        ii_filter TYPE REF TO zif_abapgit_ajson_filter.
+ 
+  PRIVATE SECTION.
+    DATA mi_filter TYPE REF TO zif_abapgit_ajson_filter.
+    DATA mr_source_tree TYPE REF TO zif_abapgit_ajson_types=>ty_nodes_ts.
+    DATA mr_dest_tree TYPE REF TO zif_abapgit_ajson_types=>ty_nodes_ts.
+ 
+    METHODS walk
+      IMPORTING
+        iv_path TYPE string
+      CHANGING
+        cs_parent TYPE zif_abapgit_ajson_types=>ty_node OPTIONAL
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS lcl_filter_runner IMPLEMENTATION.
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance EXPORTING ii_filter = ii_filter.
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    ASSERT ii_filter IS BOUND.
+    mi_filter = ii_filter.
+  ENDMETHOD.
+ 
+  METHOD lif_mutator_runner~run.
+ 
+    CLEAR et_dest_tree.
+    GET REFERENCE OF it_source_tree INTO mr_source_tree.
+    GET REFERENCE OF et_dest_tree INTO mr_dest_tree.
+ 
+    walk( iv_path = '' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD walk.
+ 
+    DATA ls_node TYPE zif_abapgit_ajson_types=>ty_node.
+ 
+    LOOP AT mr_source_tree->* INTO ls_node WHERE path = iv_path.
+      CASE ls_node-type.
+        WHEN zif_abapgit_ajson_types=>node_type-boolean OR zif_abapgit_ajson_types=>node_type-null
+          OR zif_abapgit_ajson_types=>node_type-number OR zif_abapgit_ajson_types=>node_type-string.
+ 
+          IF mi_filter->keep_node( ls_node ) = abap_false.
+            CONTINUE.
+          ENDIF.
+ 
+        WHEN zif_abapgit_ajson_types=>node_type-array OR zif_abapgit_ajson_types=>node_type-object.
+ 
+          IF mi_filter->keep_node(
+              is_node  = ls_node
+              iv_visit = zif_abapgit_ajson_filter=>visit_type-open ) = abap_false.
+            CONTINUE.
+          ENDIF.
+ 
+          " Intentionally clear AFTER "open"
+          CLEAR ls_node-children.
+ 
+          walk(
+            EXPORTING
+              iv_path = iv_path && ls_node-name && `/`
+            CHANGING
+              cs_parent    = ls_node ).
+ 
+          IF mi_filter->keep_node(
+              is_node  = ls_node
+              iv_visit = zif_abapgit_ajson_filter=>visit_type-close ) = abap_false.
+            CONTINUE.
+          ENDIF.
+ 
+        WHEN OTHERS.
+          zcx_abapgit_ajson_error=>raise( |Unexpected node type { ls_node-type }| ).
+      ENDCASE.
+ 
+      IF cs_parent IS SUPPLIED.
+        cs_parent-children = cs_parent-children + 1.
+        IF cs_parent-type = zif_abapgit_ajson_types=>node_type-array.
+          ls_node-name  = |{ cs_parent-children }|.
+          ls_node-index = cs_parent-children.
+        ENDIF.
+      ENDIF.
+      INSERT ls_node INTO TABLE mr_dest_tree->*.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* MAPPER RUNNER
+**********************************************************************
+ 
+CLASS lcl_mapper_runner DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES lif_mutator_runner.
+    CLASS-METHODS new
+      IMPORTING
+        ii_mapper TYPE REF TO zif_abapgit_ajson_mapping
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO lcl_mapper_runner.
+    METHODS constructor
+      IMPORTING
+        ii_mapper TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+  PRIVATE SECTION.
+    DATA mi_mapper TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA mr_source_tree TYPE REF TO zif_abapgit_ajson_types=>ty_nodes_ts.
+    DATA mr_dest_tree TYPE REF TO zif_abapgit_ajson_types=>ty_nodes_ts.
+ 
+    METHODS process_deep_node
+      IMPORTING
+        iv_path         TYPE string
+        iv_renamed_path TYPE string
+        iv_node_type    TYPE zif_abapgit_ajson_types=>ty_node-type
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS lcl_mapper_runner IMPLEMENTATION.
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance EXPORTING ii_mapper = ii_mapper.
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    ASSERT ii_mapper IS BOUND.
+    mi_mapper = ii_mapper.
+  ENDMETHOD.
+ 
+  METHOD lif_mutator_runner~run.
+ 
+    FIELD-SYMBOLS <root> LIKE LINE OF it_source_tree.
+ 
+    READ TABLE it_source_tree WITH KEY path = `` name = `` ASSIGNING <root>.
+    IF sy-subrc <> 0
+      OR NOT ( <root>-type = zif_abapgit_ajson_types=>node_type-array OR <root>-type = zif_abapgit_ajson_types=>node_type-object ).
+      " empty or one-value-only tree
+      et_dest_tree = it_source_tree.
+      RETURN.
+    ENDIF.
+ 
+    CLEAR et_dest_tree.
+    GET REFERENCE OF it_source_tree INTO mr_source_tree.
+    GET REFERENCE OF et_dest_tree INTO mr_dest_tree.
+    INSERT <root> INTO TABLE et_dest_tree.
+ 
+    process_deep_node(
+      iv_path         = `/`
+      iv_renamed_path = `/`
+      iv_node_type    = <root>-type ).
+ 
+  ENDMETHOD.
+ 
+  METHOD process_deep_node.
+ 
+ 
+    FIELD-SYMBOLS <item> LIKE LINE OF mr_source_tree->*.
+    DATA ls_renamed_node LIKE <item>.
+ 
+    LOOP AT mr_source_tree->* ASSIGNING <item> WHERE path = iv_path.
+      ls_renamed_node = <item>.
+      IF iv_node_type <> zif_abapgit_ajson_types=>node_type-array.
+        " don't rename array item names -> they are numeric index
+        mi_mapper->rename_node(
+          EXPORTING
+            is_node = <item>
+          CHANGING
+            cv_name = ls_renamed_node-name ).
+        IF ls_renamed_node-name IS INITIAL.
+          zcx_abapgit_ajson_error=>raise(
+            iv_msg  = 'Renamed node name cannot be empty'
+            is_node = <item> ).
+        ENDIF.
+      ENDIF.
+      ls_renamed_node-path = iv_renamed_path.
+ 
+      INSERT ls_renamed_node INTO TABLE mr_dest_tree->*.
+      IF sy-subrc <> 0. " = 4 ?
+        zcx_abapgit_ajson_error=>raise(
+          iv_msg  = 'Renamed node has a duplicate'
+          is_node = ls_renamed_node ).
+      ENDIF.
+ 
+      " maybe also catch CX_SY_ITAB_DUPLICATE_KEY but secondary keys are not changed here, so not for now
+ 
+      IF <item>-type = zif_abapgit_ajson_types=>node_type-array OR <item>-type = zif_abapgit_ajson_types=>node_type-object.
+        process_deep_node(
+          iv_path         = iv_path && <item>-name && `/`
+          iv_renamed_path = iv_renamed_path && ls_renamed_node-name && `/`
+          iv_node_type    = <item>-type ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* MUTATOR QUEUE
+**********************************************************************
+ 
+CLASS lcl_mutator_queue DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES lif_mutator_runner.
+    CLASS-METHODS new
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO lcl_mutator_queue.
+    METHODS add
+      IMPORTING
+        ii_mutator TYPE REF TO lif_mutator_runner
+      RETURNING
+        VALUE(ro_self) TYPE REF TO lcl_mutator_queue.
+ 
+  PRIVATE SECTION.
+    DATA mt_queue TYPE STANDARD TABLE OF REF TO lif_mutator_runner.
+ 
+ENDCLASS.
+ 
+CLASS lcl_mutator_queue IMPLEMENTATION.
+ 
+  METHOD add.
+    IF ii_mutator IS BOUND.
+      APPEND ii_mutator TO mt_queue.
+    ENDIF.
+    ro_self = me.
+  ENDMETHOD.
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance.
+  ENDMETHOD.
+ 
+  METHOD lif_mutator_runner~run.
+ 
+    DATA li_mutator TYPE REF TO lif_mutator_runner.
+    DATA lv_qsize TYPE i.
+    FIELD-SYMBOLS <from> LIKE it_source_tree.
+    FIELD-SYMBOLS <to> LIKE it_source_tree.
+    DATA lr_buf TYPE REF TO zif_abapgit_ajson_types=>ty_nodes_ts.
+ 
+    lv_qsize = lines( mt_queue ).
+ 
+    IF lv_qsize = 0.
+      et_dest_tree = it_source_tree.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT mt_queue INTO li_mutator.
+      IF sy-tabix = 1.
+        ASSIGN it_source_tree TO <from>.
+      ELSE.
+        ASSIGN lr_buf->* TO <from>.
+      ENDIF.
+ 
+      IF sy-tabix = lv_qsize.
+        ASSIGN et_dest_tree TO <to>.
+      ELSE.
+        CREATE DATA lr_buf.
+        ASSIGN lr_buf->* TO <to>.
+      ENDIF.
+ 
+      li_mutator->run(
+        EXPORTING
+          it_source_tree = <from>
+        IMPORTING
+          et_dest_tree = <to> ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson.clas.testclasses.abap.html b/src/json/zcl_abapgit_ajson.clas.testclasses.abap.html new file mode 100644 index 00000000000..4ecd4c30276 --- /dev/null +++ b/src/json/zcl_abapgit_ajson.clas.testclasses.abap.html @@ -0,0 +1,14302 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson.clas.testclasses.abap

+
+ +
+ 99.3% + Statements + 4706/4739 +
+ + +
+ 99.23% + Branches + 130/131 +
+ + +
+ 99.18% + Functions + 122/123 +
+ + +
+ 99.3% + Lines + 4706/4739 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039 +2040 +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056 +2057 +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072 +2073 +2074 +2075 +2076 +2077 +2078 +2079 +2080 +2081 +2082 +2083 +2084 +2085 +2086 +2087 +2088 +2089 +2090 +2091 +2092 +2093 +2094 +2095 +2096 +2097 +2098 +2099 +2100 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +2109 +2110 +2111 +2112 +2113 +2114 +2115 +2116 +2117 +2118 +2119 +2120 +2121 +2122 +2123 +2124 +2125 +2126 +2127 +2128 +2129 +2130 +2131 +2132 +2133 +2134 +2135 +2136 +2137 +2138 +2139 +2140 +2141 +2142 +2143 +2144 +2145 +2146 +2147 +2148 +2149 +2150 +2151 +2152 +2153 +2154 +2155 +2156 +2157 +2158 +2159 +2160 +2161 +2162 +2163 +2164 +2165 +2166 +2167 +2168 +2169 +2170 +2171 +2172 +2173 +2174 +2175 +2176 +2177 +2178 +2179 +2180 +2181 +2182 +2183 +2184 +2185 +2186 +2187 +2188 +2189 +2190 +2191 +2192 +2193 +2194 +2195 +2196 +2197 +2198 +2199 +2200 +2201 +2202 +2203 +2204 +2205 +2206 +2207 +2208 +2209 +2210 +2211 +2212 +2213 +2214 +2215 +2216 +2217 +2218 +2219 +2220 +2221 +2222 +2223 +2224 +2225 +2226 +2227 +2228 +2229 +2230 +2231 +2232 +2233 +2234 +2235 +2236 +2237 +2238 +2239 +2240 +2241 +2242 +2243 +2244 +2245 +2246 +2247 +2248 +2249 +2250 +2251 +2252 +2253 +2254 +2255 +2256 +2257 +2258 +2259 +2260 +2261 +2262 +2263 +2264 +2265 +2266 +2267 +2268 +2269 +2270 +2271 +2272 +2273 +2274 +2275 +2276 +2277 +2278 +2279 +2280 +2281 +2282 +2283 +2284 +2285 +2286 +2287 +2288 +2289 +2290 +2291 +2292 +2293 +2294 +2295 +2296 +2297 +2298 +2299 +2300 +2301 +2302 +2303 +2304 +2305 +2306 +2307 +2308 +2309 +2310 +2311 +2312 +2313 +2314 +2315 +2316 +2317 +2318 +2319 +2320 +2321 +2322 +2323 +2324 +2325 +2326 +2327 +2328 +2329 +2330 +2331 +2332 +2333 +2334 +2335 +2336 +2337 +2338 +2339 +2340 +2341 +2342 +2343 +2344 +2345 +2346 +2347 +2348 +2349 +2350 +2351 +2352 +2353 +2354 +2355 +2356 +2357 +2358 +2359 +2360 +2361 +2362 +2363 +2364 +2365 +2366 +2367 +2368 +2369 +2370 +2371 +2372 +2373 +2374 +2375 +2376 +2377 +2378 +2379 +2380 +2381 +2382 +2383 +2384 +2385 +2386 +2387 +2388 +2389 +2390 +2391 +2392 +2393 +2394 +2395 +2396 +2397 +2398 +2399 +2400 +2401 +2402 +2403 +2404 +2405 +2406 +2407 +2408 +2409 +2410 +2411 +2412 +2413 +2414 +2415 +2416 +2417 +2418 +2419 +2420 +2421 +2422 +2423 +2424 +2425 +2426 +2427 +2428 +2429 +2430 +2431 +2432 +2433 +2434 +2435 +2436 +2437 +2438 +2439 +2440 +2441 +2442 +2443 +2444 +2445 +2446 +2447 +2448 +2449 +2450 +2451 +2452 +2453 +2454 +2455 +2456 +2457 +2458 +2459 +2460 +2461 +2462 +2463 +2464 +2465 +2466 +2467 +2468 +2469 +2470 +2471 +2472 +2473 +2474 +2475 +2476 +2477 +2478 +2479 +2480 +2481 +2482 +2483 +2484 +2485 +2486 +2487 +2488 +2489 +2490 +2491 +2492 +2493 +2494 +2495 +2496 +2497 +2498 +2499 +2500 +2501 +2502 +2503 +2504 +2505 +2506 +2507 +2508 +2509 +2510 +2511 +2512 +2513 +2514 +2515 +2516 +2517 +2518 +2519 +2520 +2521 +2522 +2523 +2524 +2525 +2526 +2527 +2528 +2529 +2530 +2531 +2532 +2533 +2534 +2535 +2536 +2537 +2538 +2539 +2540 +2541 +2542 +2543 +2544 +2545 +2546 +2547 +2548 +2549 +2550 +2551 +2552 +2553 +2554 +2555 +2556 +2557 +2558 +2559 +2560 +2561 +2562 +2563 +2564 +2565 +2566 +2567 +2568 +2569 +2570 +2571 +2572 +2573 +2574 +2575 +2576 +2577 +2578 +2579 +2580 +2581 +2582 +2583 +2584 +2585 +2586 +2587 +2588 +2589 +2590 +2591 +2592 +2593 +2594 +2595 +2596 +2597 +2598 +2599 +2600 +2601 +2602 +2603 +2604 +2605 +2606 +2607 +2608 +2609 +2610 +2611 +2612 +2613 +2614 +2615 +2616 +2617 +2618 +2619 +2620 +2621 +2622 +2623 +2624 +2625 +2626 +2627 +2628 +2629 +2630 +2631 +2632 +2633 +2634 +2635 +2636 +2637 +2638 +2639 +2640 +2641 +2642 +2643 +2644 +2645 +2646 +2647 +2648 +2649 +2650 +2651 +2652 +2653 +2654 +2655 +2656 +2657 +2658 +2659 +2660 +2661 +2662 +2663 +2664 +2665 +2666 +2667 +2668 +2669 +2670 +2671 +2672 +2673 +2674 +2675 +2676 +2677 +2678 +2679 +2680 +2681 +2682 +2683 +2684 +2685 +2686 +2687 +2688 +2689 +2690 +2691 +2692 +2693 +2694 +2695 +2696 +2697 +2698 +2699 +2700 +2701 +2702 +2703 +2704 +2705 +2706 +2707 +2708 +2709 +2710 +2711 +2712 +2713 +2714 +2715 +2716 +2717 +2718 +2719 +2720 +2721 +2722 +2723 +2724 +2725 +2726 +2727 +2728 +2729 +2730 +2731 +2732 +2733 +2734 +2735 +2736 +2737 +2738 +2739 +2740 +2741 +2742 +2743 +2744 +2745 +2746 +2747 +2748 +2749 +2750 +2751 +2752 +2753 +2754 +2755 +2756 +2757 +2758 +2759 +2760 +2761 +2762 +2763 +2764 +2765 +2766 +2767 +2768 +2769 +2770 +2771 +2772 +2773 +2774 +2775 +2776 +2777 +2778 +2779 +2780 +2781 +2782 +2783 +2784 +2785 +2786 +2787 +2788 +2789 +2790 +2791 +2792 +2793 +2794 +2795 +2796 +2797 +2798 +2799 +2800 +2801 +2802 +2803 +2804 +2805 +2806 +2807 +2808 +2809 +2810 +2811 +2812 +2813 +2814 +2815 +2816 +2817 +2818 +2819 +2820 +2821 +2822 +2823 +2824 +2825 +2826 +2827 +2828 +2829 +2830 +2831 +2832 +2833 +2834 +2835 +2836 +2837 +2838 +2839 +2840 +2841 +2842 +2843 +2844 +2845 +2846 +2847 +2848 +2849 +2850 +2851 +2852 +2853 +2854 +2855 +2856 +2857 +2858 +2859 +2860 +2861 +2862 +2863 +2864 +2865 +2866 +2867 +2868 +2869 +2870 +2871 +2872 +2873 +2874 +2875 +2876 +2877 +2878 +2879 +2880 +2881 +2882 +2883 +2884 +2885 +2886 +2887 +2888 +2889 +2890 +2891 +2892 +2893 +2894 +2895 +2896 +2897 +2898 +2899 +2900 +2901 +2902 +2903 +2904 +2905 +2906 +2907 +2908 +2909 +2910 +2911 +2912 +2913 +2914 +2915 +2916 +2917 +2918 +2919 +2920 +2921 +2922 +2923 +2924 +2925 +2926 +2927 +2928 +2929 +2930 +2931 +2932 +2933 +2934 +2935 +2936 +2937 +2938 +2939 +2940 +2941 +2942 +2943 +2944 +2945 +2946 +2947 +2948 +2949 +2950 +2951 +2952 +2953 +2954 +2955 +2956 +2957 +2958 +2959 +2960 +2961 +2962 +2963 +2964 +2965 +2966 +2967 +2968 +2969 +2970 +2971 +2972 +2973 +2974 +2975 +2976 +2977 +2978 +2979 +2980 +2981 +2982 +2983 +2984 +2985 +2986 +2987 +2988 +2989 +2990 +2991 +2992 +2993 +2994 +2995 +2996 +2997 +2998 +2999 +3000 +3001 +3002 +3003 +3004 +3005 +3006 +3007 +3008 +3009 +3010 +3011 +3012 +3013 +3014 +3015 +3016 +3017 +3018 +3019 +3020 +3021 +3022 +3023 +3024 +3025 +3026 +3027 +3028 +3029 +3030 +3031 +3032 +3033 +3034 +3035 +3036 +3037 +3038 +3039 +3040 +3041 +3042 +3043 +3044 +3045 +3046 +3047 +3048 +3049 +3050 +3051 +3052 +3053 +3054 +3055 +3056 +3057 +3058 +3059 +3060 +3061 +3062 +3063 +3064 +3065 +3066 +3067 +3068 +3069 +3070 +3071 +3072 +3073 +3074 +3075 +3076 +3077 +3078 +3079 +3080 +3081 +3082 +3083 +3084 +3085 +3086 +3087 +3088 +3089 +3090 +3091 +3092 +3093 +3094 +3095 +3096 +3097 +3098 +3099 +3100 +3101 +3102 +3103 +3104 +3105 +3106 +3107 +3108 +3109 +3110 +3111 +3112 +3113 +3114 +3115 +3116 +3117 +3118 +3119 +3120 +3121 +3122 +3123 +3124 +3125 +3126 +3127 +3128 +3129 +3130 +3131 +3132 +3133 +3134 +3135 +3136 +3137 +3138 +3139 +3140 +3141 +3142 +3143 +3144 +3145 +3146 +3147 +3148 +3149 +3150 +3151 +3152 +3153 +3154 +3155 +3156 +3157 +3158 +3159 +3160 +3161 +3162 +3163 +3164 +3165 +3166 +3167 +3168 +3169 +3170 +3171 +3172 +3173 +3174 +3175 +3176 +3177 +3178 +3179 +3180 +3181 +3182 +3183 +3184 +3185 +3186 +3187 +3188 +3189 +3190 +3191 +3192 +3193 +3194 +3195 +3196 +3197 +3198 +3199 +3200 +3201 +3202 +3203 +3204 +3205 +3206 +3207 +3208 +3209 +3210 +3211 +3212 +3213 +3214 +3215 +3216 +3217 +3218 +3219 +3220 +3221 +3222 +3223 +3224 +3225 +3226 +3227 +3228 +3229 +3230 +3231 +3232 +3233 +3234 +3235 +3236 +3237 +3238 +3239 +3240 +3241 +3242 +3243 +3244 +3245 +3246 +3247 +3248 +3249 +3250 +3251 +3252 +3253 +3254 +3255 +3256 +3257 +3258 +3259 +3260 +3261 +3262 +3263 +3264 +3265 +3266 +3267 +3268 +3269 +3270 +3271 +3272 +3273 +3274 +3275 +3276 +3277 +3278 +3279 +3280 +3281 +3282 +3283 +3284 +3285 +3286 +3287 +3288 +3289 +3290 +3291 +3292 +3293 +3294 +3295 +3296 +3297 +3298 +3299 +3300 +3301 +3302 +3303 +3304 +3305 +3306 +3307 +3308 +3309 +3310 +3311 +3312 +3313 +3314 +3315 +3316 +3317 +3318 +3319 +3320 +3321 +3322 +3323 +3324 +3325 +3326 +3327 +3328 +3329 +3330 +3331 +3332 +3333 +3334 +3335 +3336 +3337 +3338 +3339 +3340 +3341 +3342 +3343 +3344 +3345 +3346 +3347 +3348 +3349 +3350 +3351 +3352 +3353 +3354 +3355 +3356 +3357 +3358 +3359 +3360 +3361 +3362 +3363 +3364 +3365 +3366 +3367 +3368 +3369 +3370 +3371 +3372 +3373 +3374 +3375 +3376 +3377 +3378 +3379 +3380 +3381 +3382 +3383 +3384 +3385 +3386 +3387 +3388 +3389 +3390 +3391 +3392 +3393 +3394 +3395 +3396 +3397 +3398 +3399 +3400 +3401 +3402 +3403 +3404 +3405 +3406 +3407 +3408 +3409 +3410 +3411 +3412 +3413 +3414 +3415 +3416 +3417 +3418 +3419 +3420 +3421 +3422 +3423 +3424 +3425 +3426 +3427 +3428 +3429 +3430 +3431 +3432 +3433 +3434 +3435 +3436 +3437 +3438 +3439 +3440 +3441 +3442 +3443 +3444 +3445 +3446 +3447 +3448 +3449 +3450 +3451 +3452 +3453 +3454 +3455 +3456 +3457 +3458 +3459 +3460 +3461 +3462 +3463 +3464 +3465 +3466 +3467 +3468 +3469 +3470 +3471 +3472 +3473 +3474 +3475 +3476 +3477 +3478 +3479 +3480 +3481 +3482 +3483 +3484 +3485 +3486 +3487 +3488 +3489 +3490 +3491 +3492 +3493 +3494 +3495 +3496 +3497 +3498 +3499 +3500 +3501 +3502 +3503 +3504 +3505 +3506 +3507 +3508 +3509 +3510 +3511 +3512 +3513 +3514 +3515 +3516 +3517 +3518 +3519 +3520 +3521 +3522 +3523 +3524 +3525 +3526 +3527 +3528 +3529 +3530 +3531 +3532 +3533 +3534 +3535 +3536 +3537 +3538 +3539 +3540 +3541 +3542 +3543 +3544 +3545 +3546 +3547 +3548 +3549 +3550 +3551 +3552 +3553 +3554 +3555 +3556 +3557 +3558 +3559 +3560 +3561 +3562 +3563 +3564 +3565 +3566 +3567 +3568 +3569 +3570 +3571 +3572 +3573 +3574 +3575 +3576 +3577 +3578 +3579 +3580 +3581 +3582 +3583 +3584 +3585 +3586 +3587 +3588 +3589 +3590 +3591 +3592 +3593 +3594 +3595 +3596 +3597 +3598 +3599 +3600 +3601 +3602 +3603 +3604 +3605 +3606 +3607 +3608 +3609 +3610 +3611 +3612 +3613 +3614 +3615 +3616 +3617 +3618 +3619 +3620 +3621 +3622 +3623 +3624 +3625 +3626 +3627 +3628 +3629 +3630 +3631 +3632 +3633 +3634 +3635 +3636 +3637 +3638 +3639 +3640 +3641 +3642 +3643 +3644 +3645 +3646 +3647 +3648 +3649 +3650 +3651 +3652 +3653 +3654 +3655 +3656 +3657 +3658 +3659 +3660 +3661 +3662 +3663 +3664 +3665 +3666 +3667 +3668 +3669 +3670 +3671 +3672 +3673 +3674 +3675 +3676 +3677 +3678 +3679 +3680 +3681 +3682 +3683 +3684 +3685 +3686 +3687 +3688 +3689 +3690 +3691 +3692 +3693 +3694 +3695 +3696 +3697 +3698 +3699 +3700 +3701 +3702 +3703 +3704 +3705 +3706 +3707 +3708 +3709 +3710 +3711 +3712 +3713 +3714 +3715 +3716 +3717 +3718 +3719 +3720 +3721 +3722 +3723 +3724 +3725 +3726 +3727 +3728 +3729 +3730 +3731 +3732 +3733 +3734 +3735 +3736 +3737 +3738 +3739 +3740 +3741 +3742 +3743 +3744 +3745 +3746 +3747 +3748 +3749 +3750 +3751 +3752 +3753 +3754 +3755 +3756 +3757 +3758 +3759 +3760 +3761 +3762 +3763 +3764 +3765 +3766 +3767 +3768 +3769 +3770 +3771 +3772 +3773 +3774 +3775 +3776 +3777 +3778 +3779 +3780 +3781 +3782 +3783 +3784 +3785 +3786 +3787 +3788 +3789 +3790 +3791 +3792 +3793 +3794 +3795 +3796 +3797 +3798 +3799 +3800 +3801 +3802 +3803 +3804 +3805 +3806 +3807 +3808 +3809 +3810 +3811 +3812 +3813 +3814 +3815 +3816 +3817 +3818 +3819 +3820 +3821 +3822 +3823 +3824 +3825 +3826 +3827 +3828 +3829 +3830 +3831 +3832 +3833 +3834 +3835 +3836 +3837 +3838 +3839 +3840 +3841 +3842 +3843 +3844 +3845 +3846 +3847 +3848 +3849 +3850 +3851 +3852 +3853 +3854 +3855 +3856 +3857 +3858 +3859 +3860 +3861 +3862 +3863 +3864 +3865 +3866 +3867 +3868 +3869 +3870 +3871 +3872 +3873 +3874 +3875 +3876 +3877 +3878 +3879 +3880 +3881 +3882 +3883 +3884 +3885 +3886 +3887 +3888 +3889 +3890 +3891 +3892 +3893 +3894 +3895 +3896 +3897 +3898 +3899 +3900 +3901 +3902 +3903 +3904 +3905 +3906 +3907 +3908 +3909 +3910 +3911 +3912 +3913 +3914 +3915 +3916 +3917 +3918 +3919 +3920 +3921 +3922 +3923 +3924 +3925 +3926 +3927 +3928 +3929 +3930 +3931 +3932 +3933 +3934 +3935 +3936 +3937 +3938 +3939 +3940 +3941 +3942 +3943 +3944 +3945 +3946 +3947 +3948 +3949 +3950 +3951 +3952 +3953 +3954 +3955 +3956 +3957 +3958 +3959 +3960 +3961 +3962 +3963 +3964 +3965 +3966 +3967 +3968 +3969 +3970 +3971 +3972 +3973 +3974 +3975 +3976 +3977 +3978 +3979 +3980 +3981 +3982 +3983 +3984 +3985 +3986 +3987 +3988 +3989 +3990 +3991 +3992 +3993 +3994 +3995 +3996 +3997 +3998 +3999 +4000 +4001 +4002 +4003 +4004 +4005 +4006 +4007 +4008 +4009 +4010 +4011 +4012 +4013 +4014 +4015 +4016 +4017 +4018 +4019 +4020 +4021 +4022 +4023 +4024 +4025 +4026 +4027 +4028 +4029 +4030 +4031 +4032 +4033 +4034 +4035 +4036 +4037 +4038 +4039 +4040 +4041 +4042 +4043 +4044 +4045 +4046 +4047 +4048 +4049 +4050 +4051 +4052 +4053 +4054 +4055 +4056 +4057 +4058 +4059 +4060 +4061 +4062 +4063 +4064 +4065 +4066 +4067 +4068 +4069 +4070 +4071 +4072 +4073 +4074 +4075 +4076 +4077 +4078 +4079 +4080 +4081 +4082 +4083 +4084 +4085 +4086 +4087 +4088 +4089 +4090 +4091 +4092 +4093 +4094 +4095 +4096 +4097 +4098 +4099 +4100 +4101 +4102 +4103 +4104 +4105 +4106 +4107 +4108 +4109 +4110 +4111 +4112 +4113 +4114 +4115 +4116 +4117 +4118 +4119 +4120 +4121 +4122 +4123 +4124 +4125 +4126 +4127 +4128 +4129 +4130 +4131 +4132 +4133 +4134 +4135 +4136 +4137 +4138 +4139 +4140 +4141 +4142 +4143 +4144 +4145 +4146 +4147 +4148 +4149 +4150 +4151 +4152 +4153 +4154 +4155 +4156 +4157 +4158 +4159 +4160 +4161 +4162 +4163 +4164 +4165 +4166 +4167 +4168 +4169 +4170 +4171 +4172 +4173 +4174 +4175 +4176 +4177 +4178 +4179 +4180 +4181 +4182 +4183 +4184 +4185 +4186 +4187 +4188 +4189 +4190 +4191 +4192 +4193 +4194 +4195 +4196 +4197 +4198 +4199 +4200 +4201 +4202 +4203 +4204 +4205 +4206 +4207 +4208 +4209 +4210 +4211 +4212 +4213 +4214 +4215 +4216 +4217 +4218 +4219 +4220 +4221 +4222 +4223 +4224 +4225 +4226 +4227 +4228 +4229 +4230 +4231 +4232 +4233 +4234 +4235 +4236 +4237 +4238 +4239 +4240 +4241 +4242 +4243 +4244 +4245 +4246 +4247 +4248 +4249 +4250 +4251 +4252 +4253 +4254 +4255 +4256 +4257 +4258 +4259 +4260 +4261 +4262 +4263 +4264 +4265 +4266 +4267 +4268 +4269 +4270 +4271 +4272 +4273 +4274 +4275 +4276 +4277 +4278 +4279 +4280 +4281 +4282 +4283 +4284 +4285 +4286 +4287 +4288 +4289 +4290 +4291 +4292 +4293 +4294 +4295 +4296 +4297 +4298 +4299 +4300 +4301 +4302 +4303 +4304 +4305 +4306 +4307 +4308 +4309 +4310 +4311 +4312 +4313 +4314 +4315 +4316 +4317 +4318 +4319 +4320 +4321 +4322 +4323 +4324 +4325 +4326 +4327 +4328 +4329 +4330 +4331 +4332 +4333 +4334 +4335 +4336 +4337 +4338 +4339 +4340 +4341 +4342 +4343 +4344 +4345 +4346 +4347 +4348 +4349 +4350 +4351 +4352 +4353 +4354 +4355 +4356 +4357 +4358 +4359 +4360 +4361 +4362 +4363 +4364 +4365 +4366 +4367 +4368 +4369 +4370 +4371 +4372 +4373 +4374 +4375 +4376 +4377 +4378 +4379 +4380 +4381 +4382 +4383 +4384 +4385 +4386 +4387 +4388 +4389 +4390 +4391 +4392 +4393 +4394 +4395 +4396 +4397 +4398 +4399 +4400 +4401 +4402 +4403 +4404 +4405 +4406 +4407 +4408 +4409 +4410 +4411 +4412 +4413 +4414 +4415 +4416 +4417 +4418 +4419 +4420 +4421 +4422 +4423 +4424 +4425 +4426 +4427 +4428 +4429 +4430 +4431 +4432 +4433 +4434 +4435 +4436 +4437 +4438 +4439 +4440 +4441 +4442 +4443 +4444 +4445 +4446 +4447 +4448 +4449 +4450 +4451 +4452 +4453 +4454 +4455 +4456 +4457 +4458 +4459 +4460 +4461 +4462 +4463 +4464 +4465 +4466 +4467 +4468 +4469 +4470 +4471 +4472 +4473 +4474 +4475 +4476 +4477 +4478 +4479 +4480 +4481 +4482 +4483 +4484 +4485 +4486 +4487 +4488 +4489 +4490 +4491 +4492 +4493 +4494 +4495 +4496 +4497 +4498 +4499 +4500 +4501 +4502 +4503 +4504 +4505 +4506 +4507 +4508 +4509 +4510 +4511 +4512 +4513 +4514 +4515 +4516 +4517 +4518 +4519 +4520 +4521 +4522 +4523 +4524 +4525 +4526 +4527 +4528 +4529 +4530 +4531 +4532 +4533 +4534 +4535 +4536 +4537 +4538 +4539 +4540 +4541 +4542 +4543 +4544 +4545 +4546 +4547 +4548 +4549 +4550 +4551 +4552 +4553 +4554 +4555 +4556 +4557 +4558 +4559 +4560 +4561 +4562 +4563 +4564 +4565 +4566 +4567 +4568 +4569 +4570 +4571 +4572 +4573 +4574 +4575 +4576 +4577 +4578 +4579 +4580 +4581 +4582 +4583 +4584 +4585 +4586 +4587 +4588 +4589 +4590 +4591 +4592 +4593 +4594 +4595 +4596 +4597 +4598 +4599 +4600 +4601 +4602 +4603 +4604 +4605 +4606 +4607 +4608 +4609 +4610 +4611 +4612 +4613 +4614 +4615 +4616 +4617 +4618 +4619 +4620 +4621 +4622 +4623 +4624 +4625 +4626 +4627 +4628 +4629 +4630 +4631 +4632 +4633 +4634 +4635 +4636 +4637 +4638 +4639 +4640 +4641 +4642 +4643 +4644 +4645 +4646 +4647 +4648 +4649 +4650 +4651 +4652 +4653 +4654 +4655 +4656 +4657 +4658 +4659 +4660 +4661 +4662 +4663 +4664 +4665 +4666 +4667 +4668 +4669 +4670 +4671 +4672 +4673 +4674 +4675 +4676 +4677 +4678 +4679 +4680 +4681 +4682 +4683 +4684 +4685 +4686 +4687 +4688 +4689 +4690 +4691 +4692 +4693 +4694 +4695 +4696 +4697 +4698 +4699 +4700 +4701 +4702 +4703 +4704 +4705 +4706 +4707 +4708 +4709 +4710 +4711 +4712 +4713 +4714 +4715 +4716 +4717 +4718 +4719 +4720 +4721 +4722 +4723 +4724 +4725 +4726 +4727 +4728 +4729 +4730 +4731 +4732 +4733 +4734 +4735 +4736 +4737 +4738 +4739 +47401x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +543x +1x +1x +1x +1x +1x +1x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +12x +12x +12x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +10x +10x +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +15x +7x +7x +15x +1x +1x +15x +15x +  +  +15x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +2x +2x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
**********************************************************************
+* UTIL
+**********************************************************************
+CLASS lcl_nodes_helper DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    DATA mt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    METHODS add
+      IMPORTING
+        iv_str TYPE string.
+    METHODS clear.
+    METHODS sorted
+      RETURNING
+        VALUE(rt_nodes) TYPE zif_abapgit_ajson_types=>ty_nodes_ts.
+ 
+ENDCLASS.
+ 
+CLASS lcl_nodes_helper IMPLEMENTATION.
+  METHOD add.
+ 
+    FIELD-SYMBOLS <n> LIKE LINE OF mt_nodes.
+    DATA lv_children TYPE string.
+    DATA lv_index TYPE string.
+    DATA lv_order TYPE string.
+ 
+    APPEND INITIAL LINE TO mt_nodes ASSIGNING <n>.
+ 
+    SPLIT iv_str AT '|' INTO
+      <n>-path
+      <n>-name
+      <n>-type
+      <n>-value
+      lv_index
+      lv_children
+      lv_order.
+    CONDENSE <n>-path.
+    CONDENSE <n>-name.
+    CONDENSE <n>-type.
+    CONDENSE <n>-value.
+    <n>-index = lv_index.
+    <n>-children = lv_children.
+    <n>-order = lv_order.
+ 
+  ENDMETHOD.
+ 
+  METHOD sorted.
+    rt_nodes = mt_nodes.
+  ENDMETHOD.
+ 
+  METHOD clear.
+    CLEAR mt_nodes.
+  ENDMETHOD.
+ENDCLASS.
+ 
+**********************************************************************
+* PARSER
+**********************************************************************
+ 
+CLASS ltcl_parser_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS sample_json
+      IMPORTING
+        iv_separator TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_json) TYPE string.
+ 
+  PRIVATE SECTION.
+    DATA mo_cut TYPE REF TO lcl_json_parser.
+    DATA mo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    METHODS setup.
+    METHODS parse FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_keeping_order FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_string FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_number FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_float FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_boolean FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_false FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_null FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_date FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_bare_values FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS parse_error FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS duplicate_key FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS non_json FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_parser_test IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_cut.
+    CREATE OBJECT mo_nodes.
+  ENDMETHOD.
+ 
+  METHOD parse_bare_values.
+ 
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    mo_nodes->add( ' | |str |abc | |0' ).
+    lt_act = mo_cut->parse( '"abc"' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+ 
+    mo_nodes->clear( ).
+    mo_nodes->add( ' | |num |-123 | |0' ).
+    lt_act = mo_cut->parse( '-123' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+ 
+    mo_nodes->clear( ).
+    mo_nodes->add( ' | |bool |true | |0' ).
+    lt_act = mo_cut->parse( 'true' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+ 
+    mo_nodes->clear( ).
+    mo_nodes->add( ' | |bool |false | |0' ).
+    lt_act = mo_cut->parse( 'false' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+ 
+    mo_nodes->clear( ).
+    mo_nodes->add( ' | |null | | |0' ).
+    lt_act = mo_cut->parse( 'null' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_error.
+
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA lx_err TYPE REF TO zcx_abapgit_ajson_error.
+    TRY.
+        lt_act = mo_cut->parse( 'abc' ).
+        cl_abap_unit_assert=>fail( 'Parsing of string w/o quotes must fail (spec)' ).
+      CATCH zcx_abapgit_ajson_error INTO lx_err.
+        cl_abap_unit_assert=>assert_char_cp(
+        act = lx_err->get_text( )
+        exp = '*parsing error*' ).
+        cl_abap_unit_assert=>assert_char_cp(
+        act = lx_err->location
+        exp = 'Line 1, Offset 1' ).
+    ENDTRY.
+
+    TRY.
+        lt_act = mo_cut->parse( '{' && cl_abap_char_utilities=>newline
+        && '"ok": "abc",' && cl_abap_char_utilities=>newline
+        && '"error"' && cl_abap_char_utilities=>newline
+        && '}' ).
+        cl_abap_unit_assert=>fail( 'Parsing of invalid JSON must fail (spec)' ).
+      CATCH zcx_abapgit_ajson_error INTO lx_err.
+        cl_abap_unit_assert=>assert_char_cp(
+        act = lx_err->get_text( )
+        exp = '*parsing error*' ).
+        cl_abap_unit_assert=>assert_char_cp(
+        act = lx_err->location
+        exp = 'Line 3, Offset 8' ).
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+  METHOD parse_string.
+    mo_nodes->add( '                 |         |object |                        |  |1' ).
+    mo_nodes->add( '/                |string   |str    |abc                     |  |0' ).
+ 
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    lt_act = mo_cut->parse( '{"string": "abc"}' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+  ENDMETHOD.
+ 
+  METHOD parse_number.
+    mo_nodes->add( '                 |         |object |                        |  |1' ).
+    mo_nodes->add( '/                |number   |num    |123                     |  |0' ).
+ 
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    lt_act = mo_cut->parse( '{"number": 123}' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+  ENDMETHOD.
+ 
+  METHOD parse_float.
+    mo_nodes->add( '                 |         |object |                        |  |1' ).
+    mo_nodes->add( '/                |float    |num    |123.45                  |  |0' ).
+ 
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    CREATE OBJECT mo_cut.
+    lt_act = mo_cut->parse( '{"float": 123.45}' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+  ENDMETHOD.
+ 
+  METHOD parse_boolean.
+    mo_nodes->add( '                 |         |object |                        |  |1' ).
+    mo_nodes->add( '/                |boolean  |bool   |true                    |  |0' ).
+ 
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    lt_act = mo_cut->parse( '{"boolean": true}' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+  ENDMETHOD.
+ 
+  METHOD parse_false.
+    mo_nodes->add( '                 |         |object |                        |  |1' ).
+    mo_nodes->add( '/                |false    |bool   |false                   |  |0' ).
+ 
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    lt_act = mo_cut->parse( '{"false": false}' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+  ENDMETHOD.
+ 
+  METHOD parse_null.
+    mo_nodes->add( '                 |         |object |                        |  |1' ).
+    mo_nodes->add( '/                |null     |null   |                        |  |0' ).
+ 
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    lt_act = mo_cut->parse( '{"null": null}' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+  ENDMETHOD.
+ 
+  METHOD parse_date.
+    mo_nodes->add( '                 |         |object |                        |  |1' ).
+    mo_nodes->add( '/                |date     |str    |2020-03-15              |  |0' ).
+ 
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    lt_act = mo_cut->parse( '{"date": "2020-03-15"}' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = mo_nodes->mt_nodes ).
+  ENDMETHOD.
+ 
+  METHOD sample_json.
+ 
+    rv_json =
+      '{\n' &&
+      '  "string": "abc",\n' &&
+      '  "number": 123,\n' &&
+      '  "float": 123.45,\n' &&
+      '  "boolean": true,\n' &&
+      '  "false": false,\n' &&
+      '  "null": null,\n' &&
+      '  "date": "2020-03-15",\n' &&
+      '  "issues": [\n' &&
+      '    {\n' &&
+      '      "message": "Indentation problem ...",\n' &&
+      '      "key": "indentation",\n' &&
+      '      "start": {\n' &&
+      '        "row": 4,\n' &&
+      '        "col": 3\n' &&
+      '      },\n' &&
+      '      "end": {\n' &&
+      '        "row": 4,\n' &&
+      '        "col": 26\n' &&
+      '      },\n' &&
+      '      "filename": "./zxxx.prog.abap"\n' &&
+      '    },\n' &&
+      '    {\n' &&
+      '      "message": "Remove space before XXX",\n' &&
+      '      "key": "space_before_dot",\n' &&
+      '      "start": {\n' &&
+      '        "row": 3,\n' &&
+      '        "col": 21\n' &&
+      '      },\n' &&
+      '      "end": {\n' &&
+      '        "row": 3,\n' &&
+      '        "col": 22\n' &&
+      '      },\n' &&
+      '      "filename": "./zxxx.prog.abap"\n' &&
+      '    }\n' &&
+      '  ]\n' &&
+      '}'.
+ 
+    REPLACE ALL OCCURRENCES OF '\n' IN rv_json WITH iv_separator.
+ 
+  ENDMETHOD.
+ 
+  METHOD parse.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_parser.
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '                 |         |object |                        |  |8' ).
+    lo_nodes->add( '/                |string   |str    |abc                     |  |0' ).
+    lo_nodes->add( '/                |number   |num    |123                     |  |0' ).
+    lo_nodes->add( '/                |float    |num    |123.45                  |  |0' ).
+    lo_nodes->add( '/                |boolean  |bool   |true                    |  |0' ).
+    lo_nodes->add( '/                |false    |bool   |false                   |  |0' ).
+    lo_nodes->add( '/                |null     |null   |                        |  |0' ).
+    lo_nodes->add( '/                |date     |str    |2020-03-15              |  |0' ).
+    lo_nodes->add( '/                |issues   |array  |                        |  |2' ).
+    lo_nodes->add( '/issues/         |1        |object |                        |1 |5' ).
+    lo_nodes->add( '/issues/1/       |message  |str    |Indentation problem ... |  |0' ).
+    lo_nodes->add( '/issues/1/       |key      |str    |indentation             |  |0' ).
+    lo_nodes->add( '/issues/1/       |start    |object |                        |  |2' ).
+    lo_nodes->add( '/issues/1/start/ |row      |num    |4                       |  |0' ).
+    lo_nodes->add( '/issues/1/start/ |col      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/1/       |end      |object |                        |  |2' ).
+    lo_nodes->add( '/issues/1/end/   |row      |num    |4                       |  |0' ).
+    lo_nodes->add( '/issues/1/end/   |col      |num    |26                      |  |0' ).
+    lo_nodes->add( '/issues/1/       |filename |str    |./zxxx.prog.abap        |  |0' ).
+    lo_nodes->add( '/issues/         |2        |object |                        |2 |5' ).
+    lo_nodes->add( '/issues/2/       |message  |str    |Remove space before XXX |  |0' ).
+    lo_nodes->add( '/issues/2/       |key      |str    |space_before_dot        |  |0' ).
+    lo_nodes->add( '/issues/2/       |start    |object |                        |  |2' ).
+    lo_nodes->add( '/issues/2/start/ |row      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/2/start/ |col      |num    |21                      |  |0' ).
+    lo_nodes->add( '/issues/2/       |end      |object |                        |  |2' ).
+    lo_nodes->add( '/issues/2/end/   |row      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/2/end/   |col      |num    |22                      |  |0' ).
+    lo_nodes->add( '/issues/2/       |filename |str    |./zxxx.prog.abap        |  |0' ).
+ 
+    CREATE OBJECT lo_cut.
+    lt_act = lo_cut->parse( sample_json( ) ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lo_nodes->mt_nodes ).
+ 
+    lt_act = lo_cut->parse( sample_json( |{ cl_abap_char_utilities=>newline }| ) ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lo_nodes->mt_nodes ).
+ 
+    lt_act = lo_cut->parse( sample_json( |{ cl_abap_char_utilities=>cr_lf }| ) ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lo_nodes->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_keeping_order.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_parser.
+    DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '                 |         |object |                        |  |8 |0' ).
+    lo_nodes->add( '/                |string   |str    |abc                     |  |0 |1' ).
+    lo_nodes->add( '/                |number   |num    |123                     |  |0 |2' ).
+    lo_nodes->add( '/                |float    |num    |123.45                  |  |0 |3' ).
+    lo_nodes->add( '/                |boolean  |bool   |true                    |  |0 |4' ).
+    lo_nodes->add( '/                |false    |bool   |false                   |  |0 |5' ).
+    lo_nodes->add( '/                |null     |null   |                        |  |0 |6' ).
+    lo_nodes->add( '/                |date     |str    |2020-03-15              |  |0 |7' ).
+    lo_nodes->add( '/                |issues   |array  |                        |  |2 |8' ).
+    lo_nodes->add( '/issues/         |1        |object |                        |1 |5 |0' ).
+    lo_nodes->add( '/issues/1/       |message  |str    |Indentation problem ... |  |0 |1' ).
+    lo_nodes->add( '/issues/1/       |key      |str    |indentation             |  |0 |2' ).
+    lo_nodes->add( '/issues/1/       |start    |object |                        |  |2 |3' ).
+    lo_nodes->add( '/issues/1/start/ |row      |num    |4                       |  |0 |1' ).
+    lo_nodes->add( '/issues/1/start/ |col      |num    |3                       |  |0 |2' ).
+    lo_nodes->add( '/issues/1/       |end      |object |                        |  |2 |4' ).
+    lo_nodes->add( '/issues/1/end/   |row      |num    |4                       |  |0 |1' ).
+    lo_nodes->add( '/issues/1/end/   |col      |num    |26                      |  |0 |2' ).
+    lo_nodes->add( '/issues/1/       |filename |str    |./zxxx.prog.abap        |  |0 |5' ).
+    lo_nodes->add( '/issues/         |2        |object |                        |2 |5 |0' ).
+    lo_nodes->add( '/issues/2/       |message  |str    |Remove space before XXX |  |0 |1' ).
+    lo_nodes->add( '/issues/2/       |key      |str    |space_before_dot        |  |0 |2' ).
+    lo_nodes->add( '/issues/2/       |start    |object |                        |  |2 |3' ).
+    lo_nodes->add( '/issues/2/start/ |row      |num    |3                       |  |0 |1' ).
+    lo_nodes->add( '/issues/2/start/ |col      |num    |21                      |  |0 |2' ).
+    lo_nodes->add( '/issues/2/       |end      |object |                        |  |2 |4' ).
+    lo_nodes->add( '/issues/2/end/   |row      |num    |3                       |  |0 |1' ).
+    lo_nodes->add( '/issues/2/end/   |col      |num    |22                      |  |0 |2' ).
+    lo_nodes->add( '/issues/2/       |filename |str    |./zxxx.prog.abap        |  |0 |5' ).
+ 
+    CREATE OBJECT lo_cut.
+    lt_act = lo_cut->parse(
+      iv_json = sample_json( )
+      iv_keep_item_order = abap_true ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lo_nodes->mt_nodes ).
+ 
+    lt_act = lo_cut->parse(
+      iv_json = sample_json( |{ cl_abap_char_utilities=>newline }| )
+      iv_keep_item_order = abap_true ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lo_nodes->mt_nodes ).
+ 
+    lt_act = lo_cut->parse(
+      iv_json = sample_json( |{ cl_abap_char_utilities=>cr_lf }| )
+      iv_keep_item_order = abap_true ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lo_nodes->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD duplicate_key.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_parser.
+    DATA lx TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    TRY.
+        CREATE OBJECT lo_cut.
+        lo_cut->parse( '{ "a" = 1, "a" = 1 }' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_not_initial( lx ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD non_json.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_parser.
+    DATA lx TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    TRY.
+        CREATE OBJECT lo_cut.
+        lo_cut->parse( '<html><head><title>X</title></head><body><h1>Y</h1></body></html>' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_not_initial( lx ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* SERIALIZER
+**********************************************************************
+ 
+CLASS ltcl_serializer_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS sample_json
+      RETURNING
+        VALUE(rv_json) TYPE string.
+    CLASS-METHODS sample_nodes
+      RETURNING
+        VALUE(rt_nodes) TYPE zif_abapgit_ajson_types=>ty_nodes_ts.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS stringify_condensed FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS stringify_indented FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS array_index FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS item_order FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS simple_indented FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS empty_set FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS escape_string FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS empty FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_serializer_test IMPLEMENTATION.
+ 
+  METHOD sample_json.
+ 
+    rv_json =
+      '{\n' &&
+      '  "boolean": true,\n' &&
+      '  "date": "2020-03-15",\n' &&
+      '  "false": false,\n' &&
+      '  "float": 123.45,\n' &&
+      '  "issues": [\n' &&
+      '    {\n' &&
+      '      "end": {\n' &&
+      '        "col": 26,\n' &&
+      '        "row": 4\n' &&
+      '      },\n' &&
+      '      "filename": "./zxxx.prog.abap",\n' &&
+      '      "key": "indentation",\n' &&
+      '      "message": "Indentation problem ...",\n' &&
+      '      "start": {\n' &&
+      '        "col": 3,\n' &&
+      '        "row": 4\n' &&
+      '      }\n' &&
+      '    },\n' &&
+      '    {\n' &&
+      '      "end": {\n' &&
+      '        "col": 22,\n' &&
+      '        "row": 3\n' &&
+      '      },\n' &&
+      '      "filename": "./zxxx.prog.abap",\n' &&
+      '      "key": "space_before_dot",\n' &&
+      '      "message": "Remove space before XXX",\n' &&
+      '      "start": {\n' &&
+      '        "col": 21,\n' &&
+      '        "row": 3\n' &&
+      '      }\n' &&
+      '    }\n' &&
+      '  ],\n' &&
+      '  "null": null,\n' &&
+      '  "number": 123,\n' &&
+      '  "string": "abc"\n' &&
+      '}'.
+ 
+    rv_json = replace(
+      val = rv_json
+      sub = '\n'
+      with = cl_abap_char_utilities=>newline
+      occ = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD sample_nodes.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '                 |         |object |                        |  |8' ).
+    lo_nodes->add( '/                |string   |str    |abc                     |  |0' ).
+    lo_nodes->add( '/                |number   |num    |123                     |  |0' ).
+    lo_nodes->add( '/                |float    |num    |123.45                  |  |0' ).
+    lo_nodes->add( '/                |boolean  |bool   |true                    |  |0' ).
+    lo_nodes->add( '/                |false    |bool   |false                   |  |0' ).
+    lo_nodes->add( '/                |null     |null   |                        |  |0' ).
+    lo_nodes->add( '/                |date     |str    |2020-03-15              |  |0' ).
+    lo_nodes->add( '/                |issues   |array  |                        |  |2' ).
+    lo_nodes->add( '/issues/         |1        |object |                        |1 |5' ).
+    lo_nodes->add( '/issues/1/       |message  |str    |Indentation problem ... |  |0' ).
+    lo_nodes->add( '/issues/1/       |key      |str    |indentation             |  |0' ).
+    lo_nodes->add( '/issues/1/       |start    |object |                        |  |2' ).
+    lo_nodes->add( '/issues/1/start/ |row      |num    |4                       |  |0' ).
+    lo_nodes->add( '/issues/1/start/ |col      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/1/       |end      |object |                        |  |2' ).
+    lo_nodes->add( '/issues/1/end/   |row      |num    |4                       |  |0' ).
+    lo_nodes->add( '/issues/1/end/   |col      |num    |26                      |  |0' ).
+    lo_nodes->add( '/issues/1/       |filename |str    |./zxxx.prog.abap        |  |0' ).
+    lo_nodes->add( '/issues/         |2        |object |                        |2 |5' ).
+    lo_nodes->add( '/issues/2/       |message  |str    |Remove space before XXX |  |0' ).
+    lo_nodes->add( '/issues/2/       |key      |str    |space_before_dot        |  |0' ).
+    lo_nodes->add( '/issues/2/       |start    |object |                        |  |2' ).
+    lo_nodes->add( '/issues/2/start/ |row      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/2/start/ |col      |num    |21                      |  |0' ).
+    lo_nodes->add( '/issues/2/       |end      |object |                        |  |2' ).
+    lo_nodes->add( '/issues/2/end/   |row      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/2/end/   |col      |num    |22                      |  |0' ).
+    lo_nodes->add( '/issues/2/       |filename |str    |./zxxx.prog.abap        |  |0' ).
+ 
+    rt_nodes = lo_nodes->sorted( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD stringify_condensed.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+ 
+    lv_act = lcl_json_serializer=>stringify( sample_nodes( ) ).
+    lv_exp = sample_json( ).
+ 
+    lv_exp = replace(
+      val = lv_exp
+      sub = cl_abap_char_utilities=>newline
+      with = ''
+      occ = 0 ).
+    CONDENSE lv_exp.
+    lv_exp = replace(
+      val = lv_exp
+      sub = `: `
+      with = ':'
+      occ = 0 ).
+    lv_exp = replace(
+      val = lv_exp
+      sub = `{ `
+      with = '{'
+      occ = 0 ).
+    lv_exp = replace(
+      val = lv_exp
+      sub = `[ `
+      with = '['
+      occ = 0 ).
+    lv_exp = replace(
+      val = lv_exp
+      sub = ` }`
+      with = '}'
+      occ = 0 ).
+    lv_exp = replace(
+      val = lv_exp
+      sub = ` ]`
+      with = ']'
+      occ = 0 ).
+    lv_exp = replace(
+      val = lv_exp
+      sub = `, `
+      with = ','
+      occ = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD stringify_indented.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+ 
+    lv_act = lcl_json_serializer=>stringify(
+      it_json_tree = sample_nodes( )
+      iv_indent    = 2 ).
+    lv_exp = sample_json( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD array_index.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '                |    |array  |                        |  |3' ).
+    lo_nodes->add( '/               |1   |str    |abc                     |2 |0' ).
+    lo_nodes->add( '/               |2   |num    |123                     |1 |0' ).
+    lo_nodes->add( '/               |3   |num    |123.45                  |3 |0' ).
+ 
+    lv_act = lcl_json_serializer=>stringify( lo_nodes->sorted( ) ).
+    lv_exp = '[123,"abc",123.45]'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD item_order.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '                |       |object |                   |  |3 |0' ).
+    lo_nodes->add( '/               |beta   |str    |b                  |  |0 |3' ).
+    lo_nodes->add( '/               |zulu   |str    |z                  |  |0 |1' ).
+    lo_nodes->add( '/               |alpha  |str    |a                  |  |0 |2' ).
+ 
+    lv_act = lcl_json_serializer=>stringify( lo_nodes->sorted( ) ).
+    lv_exp = '{"alpha":"a","beta":"b","zulu":"z"}'. " NAME order ! (it is also a UT)
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+    lv_act = lcl_json_serializer=>stringify(
+      it_json_tree = lo_nodes->sorted( )
+      iv_keep_item_order = abap_true ).
+    lv_exp = '{"zulu":"z","alpha":"a","beta":"b"}'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD simple_indented.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '                |    |array  |                        |  |3' ).
+    lo_nodes->add( '/               |1   |object |                        |2 |2' ).
+    lo_nodes->add( '/1/             |a   |num    |1                       |  |0' ).
+    lo_nodes->add( '/1/             |b   |num    |2                       |  |0' ).
+    lo_nodes->add( '/               |2   |num    |123                     |1 |0' ).
+    lo_nodes->add( '/               |3   |num    |123.45                  |3 |0' ).
+ 
+    lv_act = lcl_json_serializer=>stringify(
+      it_json_tree = lo_nodes->sorted( )
+      iv_indent    = 2 ).
+    lv_exp = '[\n' &&
+    '  123,\n' &&
+    '  {\n' &&
+    '    "a": 1,\n' &&
+    '    "b": 2\n' &&
+    '  },\n' &&
+    '  123.45\n' &&
+    ']'.
+    lv_exp = replace(
+      val = lv_exp
+      sub = '\n'
+      with = cl_abap_char_utilities=>newline
+      occ = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD empty_set.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '                |    |array  |                        |  |0' ).
+ 
+    lv_act = lcl_json_serializer=>stringify(
+      it_json_tree = lo_nodes->sorted( )
+      iv_indent    = 0 ).
+    lv_exp = '[]'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+    lv_act = lcl_json_serializer=>stringify(
+      it_json_tree = lo_nodes->sorted( )
+      iv_indent    = 2 ).
+    lv_exp = '[]'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD escape_string.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+    DATA lv_val TYPE string.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lv_val = 'a' && '"' && '\' && cl_abap_char_utilities=>horizontal_tab && cl_abap_char_utilities=>cr_lf.
+    lo_nodes->add( | \| \|str \|{ lv_val }\| \|0| ).
+ 
+    lv_act = lcl_json_serializer=>stringify( lo_nodes->sorted( ) ).
+    lv_exp = '"a\"\\\t\r\n"'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD empty.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+ 
+    lv_act = lcl_json_serializer=>stringify( lo_nodes->sorted( ) ).
+    lv_exp = ''.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* UTILS
+**********************************************************************
+ 
+CLASS ltcl_utils_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS normalize_path FOR TESTING.
+    METHODS split_path FOR TESTING.
+    METHODS validate_array_index FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS string_to_xstring_utf8 FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_ajson DEFINITION LOCAL FRIENDS ltcl_utils_test.
+ 
+CLASS ltcl_utils_test IMPLEMENTATION.
+ 
+  METHOD string_to_xstring_utf8.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>string_to_xstring_utf8( '123' )
+      exp = '313233' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD validate_array_index.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>validate_array_index( iv_path = 'x' iv_index = '123' )
+      exp = 123 ).
+ 
+    TRY.
+        lcl_utils=>validate_array_index( iv_path = 'x'
+                                         iv_index = 'a' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+    TRY.
+        lcl_utils=>validate_array_index( iv_path = 'x'
+                                         iv_index = '0' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD normalize_path.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>normalize_path( '' )
+      exp = '/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>normalize_path( '/' )
+      exp = '/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>normalize_path( 'abc' )
+      exp = '/abc/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>normalize_path( '/abc' )
+      exp = '/abc/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>normalize_path( 'abc/' )
+      exp = '/abc/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>normalize_path( '/abc/' )
+      exp = '/abc/' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD split_path.
+ 
+    DATA ls_exp TYPE zif_abapgit_ajson_types=>ty_path_name.
+    DATA lv_path TYPE string.
+ 
+    lv_path     = ''. " alias to root
+    ls_exp-path = ''.
+    ls_exp-name = ''.
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>split_path( lv_path )
+      exp = ls_exp ).
+ 
+    lv_path     = '/'.
+    ls_exp-path = ''.
+    ls_exp-name = ''.
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>split_path( lv_path )
+      exp = ls_exp ).
+ 
+    lv_path     = '/abc/'.
+    ls_exp-path = '/'.
+    ls_exp-name = 'abc'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>split_path( lv_path )
+      exp = ls_exp ).
+ 
+    lv_path     = 'abc'.
+    ls_exp-path = '/'.
+    ls_exp-name = 'abc'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>split_path( lv_path )
+      exp = ls_exp ).
+ 
+    lv_path     = '/abc'.
+    ls_exp-path = '/'.
+    ls_exp-name = 'abc'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>split_path( lv_path )
+      exp = ls_exp ).
+ 
+    lv_path     = 'abc/'.
+    ls_exp-path = '/'.
+    ls_exp-name = 'abc'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>split_path( lv_path )
+      exp = ls_exp ).
+ 
+    lv_path     = '/abc/xyz'.
+    ls_exp-path = '/abc/'.
+    ls_exp-name = 'xyz'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>split_path( lv_path )
+      exp = ls_exp ).
+ 
+    lv_path     = '/abc/xyz/'.
+    ls_exp-path = '/abc/'.
+    ls_exp-name = 'xyz'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lcl_utils=>split_path( lv_path )
+      exp = ls_exp ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* READER
+**********************************************************************
+ 
+CLASS ltcl_reader_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS get_value FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS get_node_type FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS exists FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS value_integer FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS value_number FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS value_boolean FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS value_string FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS members FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS slice FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS array_to_string_table FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS get_date FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS get_timestamp FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_ajson DEFINITION LOCAL FRIENDS ltcl_reader_test.
+ 
+CLASS ltcl_reader_test IMPLEMENTATION.
+ 
+  METHOD slice.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '          |         |array  |                        |  |2' ).
+    lo_nodes->add( '/         |1        |object |                        |1 |5' ).
+    lo_nodes->add( '/1/       |message  |str    |Indentation problem ... |  |0' ).
+    lo_nodes->add( '/1/       |key      |str    |indentation             |  |0' ).
+    lo_nodes->add( '/1/       |start    |object |                        |  |2' ).
+    lo_nodes->add( '/1/start/ |row      |num    |4                       |  |0' ).
+    lo_nodes->add( '/1/start/ |col      |num    |3                       |  |0' ).
+    lo_nodes->add( '/1/       |end      |object |                        |  |2' ).
+    lo_nodes->add( '/1/end/   |row      |num    |4                       |  |0' ).
+    lo_nodes->add( '/1/end/   |col      |num    |26                      |  |0' ).
+    lo_nodes->add( '/1/       |filename |str    |./zxxx.prog.abap        |  |0' ).
+    lo_nodes->add( '/         |2        |object |                        |2 |5' ).
+    lo_nodes->add( '/2/       |message  |str    |Remove space before XXX |  |0' ).
+    lo_nodes->add( '/2/       |key      |str    |space_before_dot        |  |0' ).
+    lo_nodes->add( '/2/       |start    |object |                        |  |2' ).
+    lo_nodes->add( '/2/start/ |row      |num    |3                       |  |0' ).
+    lo_nodes->add( '/2/start/ |col      |num    |21                      |  |0' ).
+    lo_nodes->add( '/2/       |end      |object |                        |  |2' ).
+    lo_nodes->add( '/2/end/   |row      |num    |3                       |  |0' ).
+    lo_nodes->add( '/2/end/   |col      |num    |22                      |  |0' ).
+    lo_nodes->add( '/2/       |filename |str    |./zxxx.prog.abap        |  |0' ).
+ 
+ 
+    lo_cut = zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+    lo_cut ?= lo_cut->zif_abapgit_ajson~slice( '/issues' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+    " **********************************************************************
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '                 |         |object |                        |  |8' ).
+    lo_nodes->add( '/                |string   |str    |abc                     |  |0' ).
+    lo_nodes->add( '/                |number   |num    |123                     |  |0' ).
+    lo_nodes->add( '/                |float    |num    |123.45                  |  |0' ).
+    lo_nodes->add( '/                |boolean  |bool   |true                    |  |0' ).
+    lo_nodes->add( '/                |false    |bool   |false                   |  |0' ).
+    lo_nodes->add( '/                |null     |null   |                        |  |0' ).
+    lo_nodes->add( '/                |date     |str    |2020-03-15              |  |0' ).
+    lo_nodes->add( '/                |issues   |array  |                        |  |2' ).
+    lo_nodes->add( '/issues/         |1        |object |                        |1 |5' ).
+    lo_nodes->add( '/issues/1/       |message  |str    |Indentation problem ... |  |0' ).
+    lo_nodes->add( '/issues/1/       |key      |str    |indentation             |  |0' ).
+    lo_nodes->add( '/issues/1/       |start    |object |                        |  |2' ).
+    lo_nodes->add( '/issues/1/start/ |row      |num    |4                       |  |0' ).
+    lo_nodes->add( '/issues/1/start/ |col      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/1/       |end      |object |                        |  |2' ).
+    lo_nodes->add( '/issues/1/end/   |row      |num    |4                       |  |0' ).
+    lo_nodes->add( '/issues/1/end/   |col      |num    |26                      |  |0' ).
+    lo_nodes->add( '/issues/1/       |filename |str    |./zxxx.prog.abap        |  |0' ).
+    lo_nodes->add( '/issues/         |2        |object |                        |2 |5' ).
+    lo_nodes->add( '/issues/2/       |message  |str    |Remove space before XXX |  |0' ).
+    lo_nodes->add( '/issues/2/       |key      |str    |space_before_dot        |  |0' ).
+    lo_nodes->add( '/issues/2/       |start    |object |                        |  |2' ).
+    lo_nodes->add( '/issues/2/start/ |row      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/2/start/ |col      |num    |21                      |  |0' ).
+    lo_nodes->add( '/issues/2/       |end      |object |                        |  |2' ).
+    lo_nodes->add( '/issues/2/end/   |row      |num    |3                       |  |0' ).
+    lo_nodes->add( '/issues/2/end/   |col      |num    |22                      |  |0' ).
+    lo_nodes->add( '/issues/2/       |filename |str    |./zxxx.prog.abap        |  |0' ).
+ 
+    lo_cut = zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+    lo_cut ?= lo_cut->zif_abapgit_ajson~slice( '/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+    " **********************************************************************
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '  |         |object |                        | |2' ).
+    lo_nodes->add( '/ |row      |num    |3                       | |0' ).
+    lo_nodes->add( '/ |col      |num    |21                      | |0' ).
+ 
+    lo_cut = zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+    lo_cut ?= lo_cut->zif_abapgit_ajson~slice( '/issues/2/start/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_value.
+ 
+    DATA lo_cut TYPE REF TO zif_abapgit_ajson.
+    lo_cut ?= zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get( '/string' )
+      exp = 'abc' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get( '/string/' )
+      exp = 'abc' ). " Hmmm ?
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get( '/boolean' )
+      exp = 'true' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get( '/issues/2/start/row' )
+      exp = '3' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_node_type.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+    li_cut = zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/' )
+      exp = zif_abapgit_ajson_types=>node_type-object ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/string' )
+      exp = zif_abapgit_ajson_types=>node_type-string ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/number' )
+      exp = zif_abapgit_ajson_types=>node_type-number ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/float' )
+      exp = zif_abapgit_ajson_types=>node_type-number ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/boolean' )
+      exp = zif_abapgit_ajson_types=>node_type-boolean ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/false' )
+      exp = zif_abapgit_ajson_types=>node_type-boolean ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/null' )
+      exp = zif_abapgit_ajson_types=>node_type-null ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/date' )
+      exp = zif_abapgit_ajson_types=>node_type-string ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get_node_type( '/issues' )
+      exp = zif_abapgit_ajson_types=>node_type-array ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_date.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lv_exp TYPE d.
+ 
+    CREATE OBJECT lo_cut.
+    lv_exp = '20200728'.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '  |         |object |                        | |1' ).
+    lo_nodes->add( '/ |date1    |str    |2020-07-28              | |0' ).
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->zif_abapgit_ajson~get_date( '/date1' )
+      exp = lv_exp ).
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '  |         |object |                        | |1' ).
+    lo_nodes->add( '/ |date1    |str    |2020-07-28T01:00:00Z    | |0' ).
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->zif_abapgit_ajson~get_date( '/date1' )
+      exp = lv_exp ).
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '  |         |object |                        | |1' ).
+    lo_nodes->add( '/ |date1    |str    |20200728                | |0' ).
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->zif_abapgit_ajson~get_date( '/date1' )
+      exp = '' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_timestamp.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lv_exp TYPE timestamp VALUE `20200728000000`.
+ 
+    CREATE OBJECT lo_cut.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '  |         |object |                        | |1' ).
+    lo_nodes->add( '/ |timestamp|str    |2020-07-28T00:00:00Z    | |0' ).
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->zif_abapgit_ajson~get_timestamp( '/timestamp' )
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD exists.
+ 
+    DATA lo_cut TYPE REF TO zif_abapgit_ajson.
+    lo_cut ?= zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->exists( '/string' )
+      exp = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->exists( '/string/' )
+      exp = abap_true ). " mmmm ?
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->exists( '/xxx' )
+      exp = abap_false ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->exists( '/issues/2/start/row' )
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+  METHOD value_integer.
+ 
+    DATA lo_cut TYPE REF TO zif_abapgit_ajson.
+    lo_cut ?= zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_integer( '/string' )
+      exp = 0 ). " Hmmmm ????
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_integer( '/number' )
+      exp = 123 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_integer( '/float' )
+      exp = 123 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD value_number.
+ 
+    DATA lo_cut TYPE REF TO zif_abapgit_ajson.
+    lo_cut ?= zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_number( '/string' )
+      exp = 0 ). " Hmmmm ????
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_number( '/number' )
+      exp = +'123.0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_number( '/float' )
+      exp = +'123.45' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD value_boolean.
+ 
+    DATA lo_cut TYPE REF TO zif_abapgit_ajson.
+    lo_cut ?= zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_boolean( '/string' )
+      exp = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_boolean( '/number' )
+      exp = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_boolean( '/xxx' )
+      exp = abap_false ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_boolean( '/boolean' )
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+  METHOD value_string.
+ 
+    DATA lo_cut TYPE REF TO zif_abapgit_ajson.
+    lo_cut ?= zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_string( '/string' )
+      exp = 'abc' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_string( '/number' )
+      exp = '123' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_string( '/xxx' )
+      exp = '' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get_string( '/boolean' )
+      exp = 'true' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD members.
+ 
+    DATA lt_exp TYPE string_table.
+    DATA lo_cut TYPE REF TO zif_abapgit_ajson.
+    lo_cut ?= zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+    CLEAR lt_exp.
+    APPEND '1' TO lt_exp.
+    APPEND '2' TO lt_exp.
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->members( '/issues' )
+      exp = lt_exp ).
+ 
+    CLEAR lt_exp.
+    APPEND 'col' TO lt_exp.
+    APPEND 'row' TO lt_exp.
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->members( '/issues/1/start/' )
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD array_to_string_table.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lt_act TYPE string_table.
+    DATA lt_exp TYPE string_table.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '  |         |array  |                        | |6' ).
+    lo_nodes->add( '/ |1        |num    |123                     |1|0' ).
+    lo_nodes->add( '/ |2        |num    |234                     |2|0' ).
+    lo_nodes->add( '/ |3        |str    |abc                     |3|0' ).
+    lo_nodes->add( '/ |4        |bool   |true                    |4|0' ).
+    lo_nodes->add( '/ |5        |bool   |false                   |5|0' ).
+    lo_nodes->add( '/ |6        |null   |null                    |6|0' ).
+ 
+    APPEND '123' TO lt_exp.
+    APPEND '234' TO lt_exp.
+    APPEND 'abc' TO lt_exp.
+    APPEND 'X' TO lt_exp.
+    APPEND '' TO lt_exp.
+    APPEND '' TO lt_exp.
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    lt_act = lo_cut->zif_abapgit_ajson~array_to_string_table( '/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+    " negative
+    DATA lx TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '  |         |object |                        | |1' ).
+    lo_nodes->add( '/ |a        |str    |abc                     | |0' ).
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    TRY.
+        lo_cut->zif_abapgit_ajson~array_to_string_table( '/x' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Path not found: /x' ).
+    ENDTRY.
+ 
+    TRY.
+        lo_cut->zif_abapgit_ajson~array_to_string_table( '/' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Array expected at: /' ).
+    ENDTRY.
+ 
+    TRY.
+        lo_cut->zif_abapgit_ajson~array_to_string_table( '/a' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Array expected at: /a' ).
+    ENDTRY.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '  |         |array  |                        | |1' ).
+    lo_nodes->add( '/ |1        |object |                        |1|0' ).
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    TRY.
+        lo_cut->zif_abapgit_ajson~array_to_string_table( '/' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Cannot convert [object] to string at [/1]' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+**********************************************************************
+* JSON TO ABAP
+**********************************************************************
+ 
+CLASS ltcl_json_to_abap DEFINITION
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT
+  FINAL.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_struc,
+        a TYPE string,
+        b TYPE i,
+      END OF ty_struc,
+      tty_struc TYPE STANDARD TABLE OF ty_struc WITH KEY a,
+      tty_struc_sorted TYPE SORTED TABLE OF ty_struc WITH UNIQUE KEY a,
+      tty_struc_hashed TYPE HASHED TABLE OF ty_struc WITH UNIQUE KEY a,
+      BEGIN OF ty_complex,
+        str   TYPE string,
+        int   TYPE i,
+        float TYPE f,
+        bool  TYPE abap_bool,
+        obj   TYPE ty_struc,
+        tab   TYPE tty_struc,
+        tab_plain  TYPE string_table,
+        tab_hashed TYPE tty_struc_hashed,
+        oref  TYPE REF TO object,
+        date1 TYPE d,
+        date2 TYPE d,
+        timestamp1 TYPE timestamp,
+        timestamp2 TYPE timestamp,
+        timestamp3 TYPE timestamp,
+      END OF ty_complex.
+ 
+    METHODS to_abap_struc
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_timestamp_initial
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_value
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_array
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_array_of_arrays_simple
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_array_of_arrays
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_w_tab_of_struc
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_w_plain_tab
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_hashed_tab
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_sorted_tab
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_hashed_plain_tab
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_negative
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_corresponding
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_corresponding_negative
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_corresponding_public
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+    METHODS to_abap_corresponding_pub_neg
+      FOR TESTING
+      RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_ajson DEFINITION LOCAL FRIENDS ltcl_json_to_abap.
+ 
+CLASS ltcl_json_to_abap IMPLEMENTATION.
+ 
+  METHOD to_abap_struc.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA ls_mock TYPE ty_complex.
+    DATA ls_exp  TYPE ty_complex.
+    DATA lv_exp_date TYPE d VALUE '20200728'.
+    DATA lv_exp_timestamp TYPE timestamp VALUE '20200728000000'.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |object |                          | ' ).
+    lo_nodes->add( '/      |str        |str    |hello                     | ' ).
+    lo_nodes->add( '/      |int        |num    |5                         | ' ).
+    lo_nodes->add( '/      |float      |num    |5.5                       | ' ).
+    lo_nodes->add( '/      |bool       |bool   |true                      | ' ).
+    lo_nodes->add( '/      |obj        |object |                          | ' ).
+    lo_nodes->add( '/obj/  |a          |str    |world                     | ' ).
+    lo_nodes->add( '/      |tab        |array  |                          | ' ).
+    lo_nodes->add( '/      |date1      |str    |2020-07-28                | ' ).
+    lo_nodes->add( '/      |date2      |str    |2020-07-28T00:00:00Z      | ' ).
+    lo_nodes->add( '/      |timestamp1 |str    |2020-07-28T00:00:00       | ' ).
+    lo_nodes->add( '/      |timestamp2 |str    |2020-07-28T00:00:00Z      | ' ).
+    lo_nodes->add( '/      |timestamp3 |str    |2020-07-28T01:00:00+01:00 | ' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = ls_mock ).
+ 
+    ls_exp-str        = 'hello'.
+    ls_exp-int        = 5.
+    ls_exp-float      = '5.5'.
+    ls_exp-bool       = abap_true.
+    ls_exp-obj-a      = 'world'.
+    ls_exp-date1      = lv_exp_date.
+    ls_exp-date2      = lv_exp_date.
+    ls_exp-timestamp1 = lv_exp_timestamp.
+    ls_exp-timestamp2 = lv_exp_timestamp.
+    ls_exp-timestamp3 = lv_exp_timestamp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_mock
+      exp = ls_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_timestamp_initial.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA lv_mock TYPE timestamp.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |str    |0000-00-00T00:00:00Z| ' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = lv_mock ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_mock
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_value.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA lv_mock TYPE string.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |str    |hello                     | ' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = lv_mock ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_mock
+      exp = 'hello' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_array.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA lt_mock TYPE string_table.
+    DATA lt_exp TYPE string_table.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |array    |                     | ' ).
+    lo_nodes->add( '/      |1          |str      |One                  |1' ).
+    lo_nodes->add( '/      |2          |str      |Two                  |2' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = lt_mock ).
+ 
+    APPEND 'One' TO lt_exp.
+    APPEND 'Two' TO lt_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_mock
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_array_of_arrays_simple.
+ 
+    DATA lo_cut   TYPE REF TO lcl_json_to_abap.
+    DATA lt_mock  TYPE TABLE OF string_table.
+    DATA lt_exp   TYPE TABLE OF string_table.
+    DATA lt_tmp   TYPE string_table.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |array    |                    | ' ).
+    lo_nodes->add( '/      |1          |array    |                    |1' ).
+    lo_nodes->add( '/      |2          |array    |                    |2' ).
+    lo_nodes->add( '/1/    |1          |str      |One                 |1' ).
+    lo_nodes->add( '/2/    |1          |str      |Two                 |1' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = lt_mock ).
+ 
+    APPEND 'One' TO lt_tmp.
+    APPEND lt_tmp TO lt_exp.
+    CLEAR lt_tmp.
+    APPEND 'Two' TO lt_tmp.
+    APPEND lt_tmp TO lt_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_mock
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_array_of_arrays.
+ 
+    DATA lo_cut   TYPE REF TO lcl_json_to_abap.
+    DATA lt_mock  TYPE TABLE OF string_table.
+    DATA lt_exp   TYPE TABLE OF string_table.
+    DATA lt_tmp   TYPE string_table.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |array    |                    | ' ).
+    lo_nodes->add( '/      |1          |array    |                    |1' ).
+    lo_nodes->add( '/      |2          |array    |                    |2' ).
+    lo_nodes->add( '/1/    |1          |str      |One                 |1' ).
+    lo_nodes->add( '/1/    |2          |str      |Two                 |2' ).
+    lo_nodes->add( '/2/    |1          |str      |Three               |1' ).
+    lo_nodes->add( '/2/    |2          |str      |Four                |2' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = lt_mock ).
+ 
+    APPEND 'One' TO lt_tmp.
+    APPEND 'Two' TO lt_tmp.
+    APPEND lt_tmp TO lt_exp.
+    CLEAR lt_tmp.
+    APPEND 'Three' TO lt_tmp.
+    APPEND 'Four' TO lt_tmp.
+    APPEND lt_tmp TO lt_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_mock
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_w_tab_of_struc.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA ls_mock TYPE ty_complex.
+    DATA ls_exp  TYPE ty_complex.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |object |                          | ' ).
+    lo_nodes->add( '/      |tab        |array  |                          | ' ).
+    lo_nodes->add( '/tab/  |1          |object |                          |1' ).
+    lo_nodes->add( '/tab/1/|a          |str    |One                       | ' ).
+    lo_nodes->add( '/tab/  |2          |object |                          |2' ).
+    lo_nodes->add( '/tab/2/|a          |str    |Two                       | ' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = ls_mock ).
+ 
+    DATA ls_elem LIKE LINE OF ls_exp-tab.
+    ls_elem-a = 'One'.
+    APPEND ls_elem TO ls_exp-tab.
+    ls_elem-a = 'Two'.
+    APPEND ls_elem TO ls_exp-tab.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_mock
+      exp = ls_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_w_plain_tab.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA ls_mock TYPE ty_complex.
+    DATA ls_exp  TYPE ty_complex.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '             |           |object |                          | ' ).
+    lo_nodes->add( '/            |tab_plain  |array  |                          | ' ).
+    lo_nodes->add( '/tab_plain/  |1          |str    |One                       |1' ).
+    lo_nodes->add( '/tab_plain/  |2          |str    |Two                       |2' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = ls_mock ).
+ 
+    APPEND 'One' TO ls_exp-tab_plain.
+    APPEND 'Two' TO ls_exp-tab_plain.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_mock
+      exp = ls_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_hashed_plain_tab.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA lt_mock TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
+    DATA lt_exp  TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '            |           |array  |                          | ' ).
+    lo_nodes->add( '/           |1          |str    |One                       |1' ).
+    lo_nodes->add( '/           |2          |str    |Two                       |2' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = lt_mock ).
+ 
+    INSERT `One` INTO TABLE lt_exp.
+    INSERT `Two` INTO TABLE lt_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_mock
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_hashed_tab.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA lt_mock TYPE tty_struc_hashed.
+    DATA lt_exp  TYPE tty_struc_hashed.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '              |           |array  |                          | ' ).
+    lo_nodes->add( '/             |1          |object |                          |1' ).
+    lo_nodes->add( '/             |2          |object |                          |2' ).
+    lo_nodes->add( '/1/           |a          |str    |One                       | ' ).
+    lo_nodes->add( '/1/           |b          |num    |1                         | ' ).
+    lo_nodes->add( '/2/           |a          |str    |Two                       | ' ).
+    lo_nodes->add( '/2/           |b          |num    |2                         | ' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = lt_mock ).
+ 
+    DATA ls_elem LIKE LINE OF lt_exp.
+    ls_elem-a = 'One'.
+    ls_elem-b = 1.
+    INSERT ls_elem INTO TABLE lt_exp.
+    ls_elem-a = 'Two'.
+    ls_elem-b = 2.
+    INSERT ls_elem INTO TABLE lt_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_mock
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_sorted_tab.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA lt_mock TYPE tty_struc_sorted.
+    DATA lt_exp  TYPE tty_struc_sorted.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '              |           |array  |                          | ' ).
+    lo_nodes->add( '/             |1          |object |                          |1' ).
+    lo_nodes->add( '/             |2          |object |                          |2' ).
+    lo_nodes->add( '/1/           |a          |str    |One                       | ' ).
+    lo_nodes->add( '/1/           |b          |num    |1                         | ' ).
+    lo_nodes->add( '/2/           |a          |str    |Two                       | ' ).
+    lo_nodes->add( '/2/           |b          |num    |2                         | ' ).
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = lt_mock ).
+ 
+    DATA ls_elem LIKE LINE OF lt_exp.
+    ls_elem-a = 'One'.
+    ls_elem-b = 1.
+    INSERT ls_elem INTO TABLE lt_exp.
+    ls_elem-a = 'Two'.
+    ls_elem-b = 2.
+    INSERT ls_elem INTO TABLE lt_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_mock
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_negative.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA lx TYPE REF TO zcx_abapgit_ajson_error.
+    DATA ls_mock TYPE ty_complex.
+ 
+    CREATE OBJECT lo_cut.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    TRY.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '     |      |object | ' ).
+        lo_nodes->add( '/    |str   |object | ' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = ls_mock ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Expected structure' ).
+    ENDTRY.
+ 
+    TRY.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '     |      |object | ' ).
+        lo_nodes->add( '/    |str   |array  | ' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = ls_mock ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Expected table' ).
+    ENDTRY.
+ 
+    TRY.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '     |      |object |      ' ).
+        lo_nodes->add( '/    |int   |str    |hello ' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = ls_mock ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Source is not a number' ).
+    ENDTRY.
+ 
+    TRY.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '     |      |object |        ' ).
+        lo_nodes->add( '/    |date1 |str    |baddate ' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = ls_mock ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Unexpected date format' ).
+    ENDTRY.
+ 
+    TRY.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '    |        |object |        ' ).
+        lo_nodes->add( '/   |missing |str    |123     ' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = ls_mock ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Path not found' ).
+    ENDTRY.
+ 
+    TRY.
+        DATA lt_str TYPE string_table.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '      |     |array  |      | ' ).
+        lo_nodes->add( '/     |a    |str    |hello |1' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = lt_str ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Need index to access tables' ).
+    ENDTRY.
+ 
+    TRY.
+        DATA lr_obj TYPE REF TO object.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '      |     |str  |hello      | ' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = lr_obj ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Cannot assign to ref' ).
+    ENDTRY.
+ 
+    TRY.
+        DATA lr_data TYPE REF TO data.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '      |     |str  |hello      | ' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = lr_data ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Cannot assign to ref' ).
+    ENDTRY.
+ 
+    TRY.
+        DATA lt_hashed TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
+        CREATE OBJECT lo_nodes.
+        lo_nodes->add( '            |           |array  |                          | ' ).
+        lo_nodes->add( '/           |1          |str    |One                       |1' ).
+        lo_nodes->add( '/           |2          |str    |One                       |2' ).
+ 
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = lt_hashed ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Duplicate insertion' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_corresponding.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA ls_act TYPE ty_struc.
+    DATA ls_exp  TYPE ty_struc.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |object |                          | ' ).
+    lo_nodes->add( '/      |a          |str    |test                      | ' ).
+    lo_nodes->add( '/      |c          |num    |24022022                  | ' ).
+ 
+    ls_exp-a  = 'test'.
+ 
+    CREATE OBJECT lo_cut
+      EXPORTING
+        iv_corresponding = abap_true.
+ 
+    lo_cut->to_abap(
+      EXPORTING
+        it_nodes    = lo_nodes->sorted( )
+      CHANGING
+        c_container = ls_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_act
+      exp = ls_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_corresponding_negative.
+ 
+    DATA lo_cut TYPE REF TO lcl_json_to_abap.
+    DATA ls_act TYPE ty_struc.
+    DATA ls_exp  TYPE ty_struc.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lx TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |object |                          | ' ).
+    lo_nodes->add( '/      |a          |str    |test                      | ' ).
+    lo_nodes->add( '/      |c          |num    |24022022                  | ' ).
+ 
+    ls_exp-a  = 'test'.
+    ls_exp-b  = 24022022.
+ 
+    TRY.
+        CREATE OBJECT lo_cut.
+        lo_cut->to_abap(
+        EXPORTING
+          it_nodes    = lo_nodes->sorted( )
+        CHANGING
+          c_container = ls_act ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Path not found' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD to_abap_corresponding_public.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA ls_act TYPE ty_struc.
+    DATA ls_exp  TYPE ty_struc.
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |object |                          | ' ).
+    lo_nodes->add( '/      |a          |str    |test                      | ' ).
+    lo_nodes->add( '/      |c          |num    |24022022                  | ' ).
+ 
+    ls_exp-a  = 'test'.
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    lo_cut->to_abap(
+      EXPORTING
+        iv_corresponding = abap_true
+      IMPORTING
+        ev_container     = ls_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_act
+      exp = ls_exp ).
+ 
+    CLEAR ls_act.
+    li_json = lo_cut->to_abap_corresponding_only( ).
+    li_json->to_abap( IMPORTING ev_container = ls_act ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_act
+      exp = ls_exp ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_abap_corresponding_pub_neg.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA ls_act TYPE ty_struc.
+    DATA ls_exp  TYPE ty_struc.
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lx TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '       |           |object |                          | ' ).
+    lo_nodes->add( '/      |a          |str    |test                      | ' ).
+    lo_nodes->add( '/      |c          |num    |24022022                  | ' ).
+ 
+    ls_exp-a  = 'test'.
+ 
+    CREATE OBJECT lo_cut.
+    lo_cut->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    TRY.
+        lo_cut->to_abap( IMPORTING ev_container = ls_act ).
+ 
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Path not found' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* WRITER
+**********************************************************************
+ 
+CLASS ltcl_writer_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS set_ajson FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_value FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS ignore_empty FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_obj FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_obj_w_date_time FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_tab FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_tab_hashed FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_tab_nested_struct FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS prove_path_exists FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS delete_subtree FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS delete FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS arrays FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS arrays_negative FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS root_assignment FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_bool_abap_bool FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_bool_int FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_bool_tab FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_str FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_int FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_date FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_timestamp FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS read_only FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_array_obj FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_with_type FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS overwrite_w_keep_order_touch FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS overwrite_w_keep_order_set FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS setx FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS setx_float FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS setx_complex FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS setx_complex_w_keep_order FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+    METHODS set_with_type_slice
+      IMPORTING
+        io_json_in TYPE REF TO zcl_abapgit_ajson
+        io_json_out TYPE REF TO zif_abapgit_ajson
+        iv_path TYPE string
+      RAISING
+        zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_ajson DEFINITION LOCAL FRIENDS ltcl_writer_test.
+ 
+CLASS ltcl_writer_test IMPLEMENTATION.
+ 
+  METHOD prove_path_exists.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |a     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/     |b     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/   |c     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/c/ |d     |object |     ||0' ).
+ 
+    lo_cut->prove_path_exists( '/a/b/c/d/' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '         |      |object |     ||1' ).
+    lo_nodes_exp->add( '/        |a     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/      |b     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/    |c     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/c/  |d     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/c/d |e     |object |     ||0' ).
+    lo_cut->prove_path_exists( '/a/b/c/d/e/' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD delete_subtree.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |a     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/     |b     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/   |c     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/c/ |d     |object |     ||0' ).
+ 
+    lo_cut->mt_json_tree = lo_nodes_exp->mt_nodes.
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |a     |object |     ||0' ).
+ 
+    lo_cut->delete_subtree(
+      iv_path = '/a/'
+      iv_name = 'b' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD delete.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |a     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/     |b     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/   |c     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/c/ |d     |object |     ||0' ).
+ 
+    lo_cut->mt_json_tree = lo_nodes_exp->mt_nodes.
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |a     |object |     ||0' ).
+ 
+    lo_cut->zif_abapgit_ajson~delete( iv_path = '/a/b' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |a     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/     |b     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/   |c     |object |     ||1' ).
+    lo_nodes_exp->add( '/a/b/c/ |d     |object |     ||0' ).
+ 
+    lo_cut->mt_json_tree = lo_nodes_exp->mt_nodes.
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |a     |object |     ||0' ).
+ 
+    lo_cut->zif_abapgit_ajson~delete( iv_path = '/a/b/' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_ajson.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lo_src TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_src = zcl_abapgit_ajson=>create_empty( ).
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    " Prepare source
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     ||1' ).
+    lo_nodes->add( '/       |x     |object |     ||2' ).
+    lo_nodes->add( '/x/     |b     |str    |abc  ||0' ).
+    lo_nodes->add( '/x/     |c     |num    |10   ||0' ).
+    lo_src->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    " Test 1 - assign root
+    li_writer->set(
+      iv_path = ''
+      iv_val  = lo_src ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+    li_writer->set(
+      iv_path = '/'
+      iv_val  = lo_src ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+    " Test 2 - assign deep
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     ||1' ).
+    lo_nodes->add( '/       |a     |object |     ||1' ).
+    lo_nodes->add( '/a/     |b     |object |     ||1' ).
+    lo_nodes->add( '/a/b/     |c     |object |     ||1' ).
+    lo_nodes->add( '/a/b/c/   |x     |object |     ||2' ).
+    lo_nodes->add( '/a/b/c/x/ |b     |str    |abc  ||0' ).
+    lo_nodes->add( '/a/b/c/x/ |c     |num    |10   ||0' ).
+ 
+    li_writer->clear( ).
+    li_writer->set(
+      iv_path = '/a/b/c'
+      iv_val  = lo_src ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+    " Test 3 - assign rewrite
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     ||1' ).
+    lo_nodes->add( '/       |a     |object |     ||1' ).
+    lo_nodes->add( '/a/       |b     |object |     ||1' ).
+    lo_nodes->add( '/a/b/     |x     |object |     ||2' ).
+    lo_nodes->add( '/a/b/x/   |b     |str    |abc  ||0' ).
+    lo_nodes->add( '/a/b/x/   |c     |num    |10   ||0' ).
+ 
+    li_writer->set(
+      iv_path = '/a/b'
+      iv_val  = lo_src ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_value.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    " Prepare source
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     ||1' ).
+    lo_nodes->add( '/       |x     |object |     ||2' ).
+    lo_nodes->add( '/x/     |b     |str    |abc  ||0' ).
+    lo_nodes->add( '/x/     |c     |num    |10   ||0' ).
+ 
+    li_writer->set(
+      iv_path = '/x/b'
+      iv_val  = 'abc' ).
+    li_writer->set(
+      iv_path = '/x/c'
+      iv_val  = 10 ).
+    li_writer->set( " ignore empty
+      iv_path = '/x/d'
+      iv_val  = 0 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD ignore_empty.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty( ).
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     ||1' ).
+    lo_nodes->add( '/       |a     |num    |1    ||0' ).
+ 
+    li_cut->set(
+      iv_path = '/a'
+      iv_val  = 1 ).
+    li_cut->set( " ignore empty
+      iv_path = '/b'
+      iv_val  = 0 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     ||2' ).
+    lo_nodes->add( '/       |a     |num    |1    ||0' ).
+    lo_nodes->add( '/       |b     |num    |0    ||0' ).
+ 
+    li_cut->set(
+      iv_ignore_empty = abap_false
+      iv_path = '/b'
+      iv_val  = 0 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_obj.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    DATA:
+      BEGIN OF ls_struc,
+        b TYPE string VALUE 'abc',
+        c TYPE i VALUE 10,
+        d TYPE d VALUE '20220401',
+      END OF ls_struc.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    " Prepare source
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |           ||1' ).
+    lo_nodes->add( '/       |x     |object |           ||3' ).
+    lo_nodes->add( '/x/     |b     |str    |abc        ||0' ).
+    lo_nodes->add( '/x/     |c     |num    |10         ||0' ).
+    lo_nodes->add( '/x/     |d     |str    |2022-04-01 ||0' ).
+ 
+    li_writer->set(
+      iv_path = '/x'
+      iv_val  = ls_struc ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_obj_w_date_time.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lo_cut TYPE REF TO zif_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    DATA:
+      BEGIN OF ls_struc,
+        d       TYPE d VALUE '20220401',
+        d_empty TYPE d,
+        t       TYPE t VALUE '200103',
+        t_empty TYPE t,
+        ts      TYPE timestamp VALUE '20220401200103',
+        p(5)    TYPE p DECIMALS 2 VALUE '123.45',
+      END OF ls_struc.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( )->format_datetime( ).
+    li_writer = lo_cut.
+ 
+    " Prepare source
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '      |        |object |           ||6' ).
+    lo_nodes->add( '/     |d       |str    |2022-04-01 ||0' ).
+    lo_nodes->add( '/     |d_empty |str    |           ||0' ).
+    lo_nodes->add( '/     |t       |str    |20:01:03   ||0' ).
+    lo_nodes->add( '/     |t_empty |str    |           ||0' ).
+    lo_nodes->add( '/     |ts      |str    |2022-04-01T20:01:03Z ||0' ).
+    lo_nodes->add( '/     |p       |num    |123.45     ||0' ).
+ 
+    li_writer->set(
+      iv_path = '/'
+      iv_val  = ls_struc ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_tab.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+    DATA lt_tab TYPE string_table.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    APPEND 'hello' TO lt_tab.
+    APPEND 'world' TO lt_tab.
+ 
+    " Prepare source
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     | |1' ).
+    lo_nodes->add( '/       |x     |array  |     | |2' ).
+    lo_nodes->add( '/x/     |1     |str    |hello|1|0' ).
+    lo_nodes->add( '/x/     |2     |str    |world|2|0' ).
+ 
+    li_writer->set(
+      iv_path = '/x'
+      iv_val  = lt_tab ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_tab_hashed.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+    DATA lt_tab TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    INSERT `hello` INTO TABLE lt_tab.
+    INSERT `world` INTO TABLE lt_tab.
+ 
+    " Prepare source
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     | |1' ).
+    lo_nodes->add( '/       |x     |array  |     | |2' ).
+    lo_nodes->add( '/x/     |1     |str    |hello|1|0' ).
+    lo_nodes->add( '/x/     |2     |str    |world|2|0' ).
+ 
+    li_writer->set(
+      iv_path = '/x'
+      iv_val  = lt_tab ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_tab_nested_struct.
+ 
+    TYPES:
+      BEGIN OF ty_include,
+        str TYPE string,
+        int TYPE i,
+      END OF ty_include,
+      BEGIN OF ty_struct.
+        INCLUDE TYPE ty_include.
+    TYPES: dat TYPE xstring,
+      END OF ty_struct,
+      ty_tab TYPE STANDARD TABLE OF ty_struct WITH KEY str.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+    DATA ls_tab TYPE ty_struct.
+    DATA lt_tab TYPE ty_tab.
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty( ).
+ 
+    ls_tab-str = 'hello'.
+    ls_tab-int = 123.
+    ls_tab-dat = '4041'.
+    INSERT ls_tab INTO TABLE lt_tab.
+    ls_tab-str = 'world'.
+    ls_tab-int = 456.
+    ls_tab-dat = '6061'.
+    INSERT ls_tab INTO TABLE lt_tab.
+ 
+    " prepare source
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |array  |     |0|2' ).
+    lo_nodes->add( '/       |1     |object |     |1|3' ).
+    lo_nodes->add( '/       |2     |object |     |2|3' ).
+    lo_nodes->add( '/1/     |dat   |str    |4041 |0|0' ).
+    lo_nodes->add( '/1/     |int   |num    |123  |0|0' ).
+    lo_nodes->add( '/1/     |str   |str    |hello|0|0' ).
+    lo_nodes->add( '/2/     |dat   |str    |6061 |0|0' ).
+    lo_nodes->add( '/2/     |int   |num    |456  |0|0' ).
+    lo_nodes->add( '/2/     |str   |str    |world|0|0' ).
+ 
+    li_cut->set(
+      iv_path = '/'
+      iv_val  = lt_tab ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->mt_json_tree
+      exp = lo_nodes->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD arrays.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    " touch
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     | |1' ).
+    lo_nodes_exp->add( '/       |a     |array  |     | |0' ).
+ 
+    li_writer->touch_array( iv_path = '/a' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " add string
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     | |1' ).
+    lo_nodes_exp->add( '/       |a     |array  |     | |1' ).
+    lo_nodes_exp->add( '/a/     |1     |str    |hello|1|0' ).
+ 
+    li_writer->push(
+      iv_path = '/a'
+      iv_val  = 'hello' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " add obj
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     | |1' ).
+    lo_nodes_exp->add( '/       |a     |array  |     | |2' ).
+    lo_nodes_exp->add( '/a/     |1     |str    |hello|1|0' ).
+    lo_nodes_exp->add( '/a/     |2     |object |     |2|1' ).
+    lo_nodes_exp->add( '/a/2/   |x     |str    |world| |0' ).
+ 
+    DATA:
+      BEGIN OF ls_dummy,
+        x TYPE string VALUE 'world',
+      END OF ls_dummy.
+ 
+    li_writer->push(
+      iv_path = '/a'
+      iv_val  = ls_dummy ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " re-touch
+    li_writer->touch_array( iv_path = '/a' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " re-touch with clear
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     | |1' ).
+    lo_nodes_exp->add( '/       |a     |array  |     | |0' ).
+ 
+    li_writer->touch_array(
+      iv_path = '/a'
+      iv_clear = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " free-add array item (index must be updated)
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     | |1' ).
+    lo_nodes_exp->add( '/       |a     |array  |     | |2' ).
+    lo_nodes_exp->add( '/a/     |1     |object |     |1|1' ).
+    lo_nodes_exp->add( '/a/1/   |x     |num    |123  | |0' ).
+    lo_nodes_exp->add( '/a/     |2     |num    |234  |2|0' ).
+ 
+    li_writer->set(
+      iv_path = '/a/1/x'
+      iv_val  = 123 ).
+    li_writer->set(
+      iv_path = '/a/2'
+      iv_val  = 234 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD arrays_negative.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    li_writer->touch_array( iv_path = '/a' ).
+    li_writer->push(
+      iv_path = '/a'
+      iv_val = 123 ).
+ 
+    " touch another node
+    DATA lx TYPE REF TO zcx_abapgit_ajson_error.
+    TRY.
+        li_writer->touch_array( iv_path = '/a/1' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Path [/a/1] already used and is not array' ).
+    ENDTRY.
+ 
+    " push to not array
+    TRY.
+        li_writer->push(
+        iv_path = '/a/1'
+        iv_val  = 123 ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Path [/a/1] is not array' ).
+    ENDTRY.
+ 
+    " push to not array
+    TRY.
+        li_writer->push(
+        iv_path = '/x'
+        iv_val  = 123 ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Path [/x] does not exist' ).
+    ENDTRY.
+ 
+    " set array item with non-numeric key
+    TRY.
+        li_writer->set(
+        iv_path = '/a/abc/x'
+        iv_val  = 123 ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Cannot add non-numeric key [abc] to array [/a/]' ).
+    ENDTRY.
+ 
+    TRY.
+        li_writer->set(
+        iv_path = '/a/abc'
+        iv_val  = 123 ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Cannot add non-numeric key [abc] to array [/a/]' ).
+    ENDTRY.
+ 
+    " set array item with zero key
+    TRY.
+        li_writer->set(
+        iv_path = '/a/0'
+        iv_val  = 123 ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx.
+        cl_abap_unit_assert=>assert_equals(
+        act = lx->message
+        exp = 'Cannot add zero key to array [/a/]' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD root_assignment.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+    DATA:
+      BEGIN OF ls_dummy,
+        x TYPE string VALUE 'hello',
+      END OF ls_dummy.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    " object
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |x     |str    |hello||0' ).
+ 
+    li_writer->set(
+      iv_path = '/'
+      iv_val  = ls_dummy ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " object empty path
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |     ||1' ).
+    lo_nodes_exp->add( '/       |x     |str    |hello||0' ).
+ 
+    li_writer->clear( ).
+    li_writer->set(
+      iv_path = ''
+      iv_val  = ls_dummy ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " array
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |array  |     | |1' ).
+    lo_nodes_exp->add( '/       |1     |str    |hello|1|0' ).
+ 
+    li_writer->clear( ).
+    li_writer->touch_array( iv_path = '' ).
+    li_writer->push(
+      iv_path = ''
+      iv_val  = 'hello' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " value
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |str    |hello||0' ).
+ 
+    li_writer->clear( ).
+    li_writer->set(
+      iv_path = ''
+      iv_val  = 'hello' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_bool_abap_bool.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    " abap_bool
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |      ||2' ).
+    lo_nodes_exp->add( '/       |a     |bool   |true  ||0' ).
+    lo_nodes_exp->add( '/       |b     |bool   |false ||0' ).
+ 
+    li_writer->set_boolean(
+      iv_path = '/a'
+      iv_val  = abap_true ).
+    li_writer->set_boolean(
+      iv_path = '/b'
+      iv_val  = abap_false ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_bool_int.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    " int
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |      ||2' ).
+    lo_nodes_exp->add( '/       |a     |bool   |true  ||0' ).
+    lo_nodes_exp->add( '/       |b     |bool   |false ||0' ).
+ 
+    li_writer->set_boolean(
+      iv_path = '/a'
+      iv_val  = 1 ).
+    li_writer->set_boolean(
+      iv_path = '/b'
+      iv_val  = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_bool_tab.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+    DATA lt_tab TYPE string_table.
+ 
+    " tab
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |      ||2' ).
+    lo_nodes_exp->add( '/       |a     |bool   |true  ||0' ).
+    lo_nodes_exp->add( '/       |b     |bool   |false ||0' ).
+ 
+    APPEND 'hello' TO lt_tab.
+    li_writer->set_boolean(
+      iv_path = '/a'
+      iv_val  = lt_tab ).
+    CLEAR lt_tab.
+    li_writer->set_boolean(
+      iv_path = '/b'
+      iv_val  = lt_tab ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_str.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+    DATA lv_date TYPE d.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |         ||3' ).
+    lo_nodes_exp->add( '/       |a     |str    |123      ||0' ).
+    lo_nodes_exp->add( '/       |b     |str    |X        ||0' ).
+    lo_nodes_exp->add( '/       |c     |str    |20200705 ||0' ).
+ 
+    li_writer->set_string(
+      iv_path = '/a'
+      iv_val  = '123' ).
+    li_writer->set_string(
+      iv_path = '/b'
+      iv_val  = abap_true ).
+    lv_date = '20200705'.
+    li_writer->set_string(
+      iv_path = '/c'
+      iv_val  = lv_date ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_int.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |         ||1' ).
+    lo_nodes_exp->add( '/       |a     |num    |123      ||0' ).
+ 
+    li_writer->set_integer(
+      iv_path = '/a'
+      iv_val  = 123 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_date.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+    DATA lv_date TYPE d.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |           ||2' ).
+    lo_nodes_exp->add( '/       |a     |str    |2020-07-05 ||0' ).
+    lo_nodes_exp->add( '/       |b     |str    |           ||0' ).
+ 
+    lv_date = '20200705'.
+    li_writer->set_date(
+      iv_path = '/a'
+      iv_val  = lv_date ).
+ 
+    CLEAR lv_date.
+    li_writer->set_date(
+      iv_path = '/b'
+      iv_val  = lv_date ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_timestamp.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+    DATA lv_timestamp TYPE timestamp.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |object |                     ||1' ).
+    lo_nodes_exp->add( '/       |a     |str    |2021-05-05T12:00:00Z ||0' ).
+ 
+    lv_timestamp = '20210505120000'.
+    li_writer->set_timestamp(
+      iv_path = '/a'
+      iv_val  = lv_timestamp ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD read_only.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    " Prepare source
+    li_writer->set(
+      iv_path = '/a'
+      iv_val  = 'abc' ).
+    li_writer->touch_array( iv_path = '/b' ).
+    li_writer->push(
+      iv_path = '/b'
+      iv_val  = 'abc' ).
+ 
+    lo_cut->freeze( ).
+ 
+    TRY.
+        li_writer->set(
+        iv_path = '/c'
+        iv_val  = 'abc' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+    TRY.
+        li_writer->touch_array( iv_path = '/d' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+    TRY.
+        li_writer->push(
+        iv_path = '/b'
+        iv_val  = 'xyz' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+    TRY.
+        li_writer->delete( iv_path = '/a' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+    TRY.
+        li_writer->clear( ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD set_array_obj.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '                 |         |object |                        |  |1' ).
+    lo_nodes_exp->add( '/                |issues   |array  |                        |  |2' ).
+    lo_nodes_exp->add( '/issues/         |1        |object |                        |1 |1' ).
+    lo_nodes_exp->add( '/issues/         |2        |object |                        |2 |1' ).
+    lo_nodes_exp->add( '/issues/1/       |end      |object |                        |  |2' ).
+    lo_nodes_exp->add( '/issues/1/end/   |col      |num    |26                      |  |0' ).
+    lo_nodes_exp->add( '/issues/1/end/   |row      |num    |4                       |  |0' ).
+    lo_nodes_exp->add( '/issues/2/       |end      |object |                        |  |2' ).
+    lo_nodes_exp->add( '/issues/2/end/   |col      |num    |22                      |  |0' ).
+    lo_nodes_exp->add( '/issues/2/end/   |row      |num    |3                       |  |0' ).
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    li_writer->touch_array( iv_path = '/issues' ).
+    li_writer->set(
+      iv_path = '/issues/1/end/col'
+      iv_val  = 26 ).
+    li_writer->set(
+      iv_path = '/issues/1/end/row'
+      iv_val  = 4 ).
+    li_writer->set(
+      iv_path = '/issues/2/end/col'
+      iv_val  = 22 ).
+    li_writer->set(
+      iv_path = '/issues/2/end/row'
+      iv_val  = 3 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_with_type.
+ 
+    DATA lo_sample TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_sample = zcl_abapgit_ajson=>parse( ltcl_parser_test=>sample_json( ) ).
+ 
+    lo_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    set_with_type_slice( io_json_in  = lo_sample
+                         io_json_out = li_writer
+                         iv_path     = '/' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->mt_json_tree
+      exp = lo_sample->mt_json_tree ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_with_type_slice.
+ 
+    DATA lv_path TYPE string.
+ 
+    FIELD-SYMBOLS <node> LIKE LINE OF io_json_in->mt_json_tree.
+ 
+    LOOP AT io_json_in->mt_json_tree ASSIGNING <node> WHERE path = iv_path.
+      lv_path = <node>-path && <node>-name && '/'.
+      CASE <node>-type.
+        WHEN zif_abapgit_ajson_types=>node_type-array.
+          io_json_out->touch_array( lv_path ).
+          set_with_type_slice( io_json_in  = io_json_in
+                               io_json_out = io_json_out
+                               iv_path     = lv_path ).
+        WHEN zif_abapgit_ajson_types=>node_type-object.
+          set_with_type_slice( io_json_in  = io_json_in
+                               io_json_out = io_json_out
+                               iv_path     = lv_path ).
+        WHEN OTHERS.
+          io_json_out->set(
+            iv_path      = lv_path
+            iv_val       = <node>-value
+            iv_node_type = <node>-type ).
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD overwrite_w_keep_order_set.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+    DATA:
+      BEGIN OF ls_dummy,
+        b TYPE i,
+        a TYPE i,
+      END OF ls_dummy.
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty(
+    )->set(
+      iv_ignore_empty = abap_false
+      iv_path = '/'
+      iv_val  = ls_dummy ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"a":0,"b":0}' ). " ordered by path, name
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty(
+    )->keep_item_order(
+    )->set(
+      iv_ignore_empty = abap_false
+      iv_path = '/'
+      iv_val  = ls_dummy ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"b":0,"a":0}' ). " ordered by structure order
+ 
+    li_cut->set(
+      iv_path  = '/a'
+      iv_val   = 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"b":0,"a":1}' ). " still ordered after overwrite
+ 
+  ENDMETHOD.
+ 
+  METHOD overwrite_w_keep_order_touch.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+    DATA:
+      BEGIN OF ls_dummy,
+        b TYPE i,
+        a TYPE string_table,
+      END OF ls_dummy.
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty(
+    )->set(
+      iv_ignore_empty = abap_false
+      iv_path = '/'
+      iv_val  = ls_dummy ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"a":[],"b":0}' ). " ordered by path, name
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty(
+    )->keep_item_order(
+    )->set(
+      iv_ignore_empty = abap_false
+      iv_path = '/'
+      iv_val  = ls_dummy ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"b":0,"a":[]}' ). " ordered by structure order
+ 
+    li_cut->touch_array(
+      iv_path  = '/a'
+      iv_clear = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"b":0,"a":[]}' ). " still ordered after touch with clear
+ 
+  ENDMETHOD.
+ 
+  METHOD setx.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:1' )->stringify( )
+      exp = '{"a":1}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a : 1' )->stringify( )
+      exp = '{"a":1}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:"1"' )->stringify( )
+      exp = '{"a":"1"}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:abc' )->stringify( )
+      exp = '{"a":"abc"}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:null' )->stringify( )
+      exp = '{"a":null}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:true' )->stringify( )
+      exp = '{"a":true}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:"true"' )->stringify( )
+      exp = '{"a":"true"}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:false' )->stringify( )
+      exp = '{"a":false}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a/b:1' )->stringify( )
+      exp = '{"a":{"b":1}}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/:1' )->stringify( )
+      exp = '1' ). " Because set( path = '/' ) would write root node
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( ':1' )->stringify( )
+      exp = '1' ). " Because set( path = '' ) would write root node
+ 
+*    cl_abap_unit_assert=>assert_equals(
+*      act = zcl_ajson=>new( )->setx( '' )->stringify( )
+*      exp = '{}' ). " problem is that root node not set so it is not an object
+ 
+*    cl_abap_unit_assert=>assert_equals(
+*      act = zcl_ajson=>new( )->setx( '/a:' )->stringify( )
+*      exp = '{}' ). " should setx ignore empty values or set an empty string ? Or null ?
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:""' )->stringify( )
+      exp = '{"a":""}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD setx_float.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:1.123' )->stringify( )
+      exp = '{"a":1.123}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:00.123' )->stringify( )
+      exp = '{"a":"00.123"}' ). " not a number
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:.123' )->stringify( )
+      exp = '{"a":".123"}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:123.' )->stringify( )
+      exp = '{"a":"123."}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:1..123' )->stringify( )
+      exp = '{"a":"1..123"}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD setx_complex.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:{"b" : 1}' )->stringify( )
+      exp = '{"a":{"b":1}}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:{}' )->stringify( )
+      exp = '{"a":{}}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:[1, 2]' )->stringify( )
+      exp = '{"a":[1,2]}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>new( )->setx( '/a:[]' )->stringify( )
+      exp = '{"a":[]}' ).
+ 
+    TRY.
+        zcl_abapgit_ajson=>new( )->setx( '/a:{"b" : 1' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_ajson=>new( )->setx( '/a:[1, 2' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD setx_complex_w_keep_order.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+    DATA:
+      BEGIN OF ls_dummy,
+        f TYPE i VALUE 5,
+        e TYPE i VALUE 6,
+      END OF ls_dummy.
+ 
+    li_cut = zcl_abapgit_ajson=>new( iv_keep_item_order = abap_true ).
+    li_cut->setx( '/c:3' ).
+    li_cut->set(
+      iv_path = '/b'
+      iv_val  = ls_dummy ).
+    li_cut->setx( '/a:1' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"c":3,"b":{"f":5,"e":6},"a":1}' ).
+ 
+    li_cut->setx( '/b:{"z":9,"y":8}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"c":3,"b":{"z":9,"y":8},"a":1}' ).
+    " TODO: a subtle bug here. The '/b:{"z":9,"y":8}' creates a json internally
+    " without the ordering. It's just by chance that this UT passes, but the implementation
+    " does not guarantee it. The parser should be instructed to keep the order of the parsed json
+ 
+    li_cut->setx( '/0:9' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->stringify( )
+      exp = '{"c":3,"b":{"z":9,"y":8},"a":1,"0":9}' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+**********************************************************************
+* INTEGRATED
+**********************************************************************
+CLASS ltcl_integrated DEFINITION
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT
+  FINAL.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_loc,
+        row TYPE i,
+        col TYPE i,
+      END OF ty_loc,
+      BEGIN OF ty_issue,
+        message TYPE string,
+        key TYPE string,
+        filename TYPE string,
+        start TYPE ty_loc,
+        end TYPE ty_loc,
+      END OF ty_issue,
+      tt_issues TYPE STANDARD TABLE OF ty_issue WITH KEY message key,
+      BEGIN OF ty_target,
+        string TYPE string,
+        number TYPE i,
+        float TYPE f,
+        boolean TYPE abap_bool,
+        false TYPE abap_bool,
+        null TYPE string,
+        date TYPE string, " ??? TODO
+        issues TYPE tt_issues,
+      END OF ty_target.
+ 
+    METHODS reader FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS array_index FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS array_simple FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS stringify FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS item_order_integrated FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS chaining FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS push_json FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS is_empty FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_integrated IMPLEMENTATION.
+ 
+  METHOD array_simple.
+ 
+    DATA lt_act TYPE string_table.
+    DATA lt_exp TYPE string_table.
+    DATA lv_exp TYPE string.
+ 
+    DATA lv_src TYPE string.
+    lv_src = '['.
+    DO 10 TIMES.
+      IF sy-index <> 1.
+        lv_src = lv_src && `, `.
+      ENDIF.
+      lv_src = lv_src && |"{ sy-index }"|.
+      lv_exp = |{ sy-index }|.
+      APPEND lv_exp TO lt_exp.
+    ENDDO.
+    lv_src = lv_src && ']'.
+ 
+    DATA li_reader TYPE REF TO zif_abapgit_ajson.
+    li_reader = zcl_abapgit_ajson=>parse( lv_src ).
+    li_reader->to_abap( IMPORTING ev_container = lt_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD array_index.
+ 
+    DATA lt_act TYPE TABLE OF ty_loc.
+    DATA lt_exp TYPE TABLE OF ty_loc.
+    DATA ls_exp TYPE ty_loc.
+ 
+    DATA lv_src TYPE string.
+    lv_src = '['.
+    DO 10 TIMES.
+      IF sy-index <> 1.
+        lv_src = lv_src && `, `.
+      ENDIF.
+      lv_src = lv_src && |\{ "row": { sy-index } \}|.
+      ls_exp-row = sy-index.
+      APPEND ls_exp TO lt_exp.
+    ENDDO.
+    lv_src = lv_src && ']'.
+ 
+    DATA li_reader TYPE REF TO zif_abapgit_ajson.
+    li_reader = zcl_abapgit_ajson=>parse( lv_src ).
+    li_reader->to_abap( IMPORTING ev_container = lt_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD reader.
+ 
+    DATA lv_source TYPE string.
+    DATA li_reader TYPE REF TO zif_abapgit_ajson.
+ 
+    lv_source = ltcl_parser_test=>sample_json( ).
+    li_reader = zcl_abapgit_ajson=>parse( lv_source ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_reader->get( '/string' )
+      exp = 'abc' ).
+ 
+    DATA ls_act TYPE ty_target.
+    DATA ls_exp TYPE ty_target.
+    FIELD-SYMBOLS <i> LIKE LINE OF ls_exp-issues.
+ 
+    ls_exp-string = 'abc'.
+    ls_exp-number = 123.
+    ls_exp-float = '123.45'.
+    ls_exp-boolean = abap_true.
+    ls_exp-false = abap_false.
+    ls_exp-date = '2020-03-15'.
+ 
+    APPEND INITIAL LINE TO ls_exp-issues ASSIGNING <i>.
+    <i>-message  = 'Indentation problem ...'.
+    <i>-key      = 'indentation'.
+    <i>-filename = './zxxx.prog.abap'.
+    <i>-start-row = 4.
+    <i>-start-col = 3.
+    <i>-end-row   = 4.
+    <i>-end-col   = 26.
+ 
+    APPEND INITIAL LINE TO ls_exp-issues ASSIGNING <i>.
+    <i>-message  = 'Remove space before XXX'.
+    <i>-key      = 'space_before_dot'.
+    <i>-filename = './zxxx.prog.abap'.
+    <i>-start-row = 3.
+    <i>-start-col = 21.
+    <i>-end-row   = 3.
+    <i>-end-col   = 22.
+ 
+    li_reader->to_abap( IMPORTING ev_container = ls_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_act
+      exp = ls_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD stringify.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
+    DATA li_writer TYPE REF TO zif_abapgit_ajson.
+    DATA lv_exp TYPE string.
+    DATA: BEGIN OF ls_dummy, x TYPE i, END OF ls_dummy.
+    DATA: BEGIN OF ls_data, str TYPE string, cls TYPE REF TO zcl_abapgit_ajson, END OF ls_data.
+ 
+    ls_dummy-x = 1.
+    lo_cut    = zcl_abapgit_ajson=>create_empty( ).
+    li_writer = lo_cut.
+ 
+    li_writer->set(
+      iv_path = '/a'
+      iv_val  = 1 ).
+    li_writer->set(
+      iv_path = '/b'
+      iv_val  = 'B' ).
+    li_writer->set(
+      iv_path = '/c'
+      iv_val  = abap_true ).
+    li_writer->set_null( iv_path = '/d' ).
+ 
+    " simple test
+    lv_exp = '{"a":1,"b":"B","c":true,"d":null}'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->stringify( )
+      exp = lv_exp ).
+ 
+    li_writer->touch_array( iv_path = '/e' ).
+    li_writer->touch_array( iv_path = '/f' ).
+    li_writer->push(
+      iv_path = '/f'
+      iv_val  = 5 ).
+    li_writer->push(
+      iv_path = '/f'
+      iv_val  = ls_dummy ).
+    li_writer->set(
+      iv_path = '/g'
+      iv_val  = ls_dummy ).
+ 
+    " complex test
+    lv_exp = '{"a":1,"b":"B","c":true,"d":null,"e":[],"f":[5,{"x":1}],"g":{"x":1}}'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->stringify( )
+      exp = lv_exp ).
+ 
+    " complex test indented
+    lv_exp =
+      '{\n' &&
+      '  "a": 1,\n' &&
+      '  "b": "B",\n' &&
+      '  "c": true,\n' &&
+      '  "d": null,\n' &&
+      '  "e": [],\n' &&
+      '  "f": [\n' &&
+      '    5,\n' &&
+      '    {\n' &&
+      '      "x": 1\n' &&
+      '    }\n' &&
+      '  ],\n' &&
+      '  "g": {\n' &&
+      '    "x": 1\n' &&
+      '  }\n' &&
+      '}'.
+    lv_exp = replace(
+      val = lv_exp
+      sub = '\n'
+      with = cl_abap_char_utilities=>newline
+      occ = 0 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->stringify( iv_indent = 2 )
+      exp = lv_exp ).
+ 
+    " structure with initial ref to class
+    ls_data-str = 'test'.
+ 
+    li_writer = lo_cut.
+    li_writer->set(
+      iv_path = '/'
+      iv_val  = ls_data ).
+ 
+    lv_exp = '{"cls":null,"str":"test"}'.
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->stringify( )
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD item_order_integrated.
+ 
+    DATA:
+      BEGIN OF ls_dummy,
+        zulu TYPE string,
+        alpha TYPE string,
+        beta TYPE string,
+      END OF ls_dummy.
+ 
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+ 
+    ls_dummy-alpha = 'a'.
+    ls_dummy-beta  = 'b'.
+    ls_dummy-zulu  = 'z'.
+ 
+    " NAME order
+    li_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_cut->set(
+      iv_path = '/'
+      iv_val  = ls_dummy ).
+ 
+    lv_act = li_cut->stringify( ).
+    lv_exp = '{"alpha":"a","beta":"b","zulu":"z"}'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+    " STRUC order (keep)
+    li_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_cut->keep_item_order( ).
+    li_cut->set(
+      iv_path = '/'
+      iv_val  = ls_dummy ).
+ 
+    lv_act = li_cut->stringify( ).
+    lv_exp = '{"zulu":"z","alpha":"a","beta":"b"}'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD chaining.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty( ).
+ 
+    cl_abap_unit_assert=>assert_bound(
+      li_cut->set(
+        iv_path = '/a'
+        iv_val  = 1 ) ).
+ 
+    cl_abap_unit_assert=>assert_bound( li_cut->delete( iv_path = '/a' ) ).
+ 
+    cl_abap_unit_assert=>assert_bound( li_cut->touch_array( iv_path = '/array' ) ).
+ 
+    cl_abap_unit_assert=>assert_bound(
+      li_cut->push(
+        iv_path = '/array'
+        iv_val  = '1' ) ).
+ 
+    cl_abap_unit_assert=>assert_bound( li_cut->keep_item_order( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD push_json.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+    DATA li_sub TYPE REF TO zif_abapgit_ajson.
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty( ).
+    li_sub = zcl_abapgit_ajson=>create_empty( )->set(
+      iv_path = 'a'
+      iv_val  = '1' ).
+ 
+    li_cut->touch_array( '/list' ).
+    li_cut->push(
+      iv_path = '/list'
+      iv_val  = 'hello' ).
+    li_cut->push(
+      iv_path = '/list'
+      iv_val  = zcl_abapgit_ajson=>create_empty( )->set(
+        iv_path = 'a'
+        iv_val  = '1' ) ).
+    li_cut->push(
+      iv_path = '/list'
+      iv_val  = zcl_abapgit_ajson=>create_empty( )->set(
+        iv_path = '/'
+        iv_val  = 'world' ) ).
+ 
+    lv_act = li_cut->stringify( ).
+    lv_exp = '{"list":["hello",{"a":"1"},"world"]}'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD is_empty.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_ajson.
+ 
+    li_cut = zcl_abapgit_ajson=>create_empty( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_true
+      act = li_cut->is_empty( ) ).
+ 
+    li_cut->set(
+      iv_path = '/x'
+      iv_val  = '123' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_false
+      act = li_cut->is_empty( ) ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* ABAP TO JSON
+**********************************************************************
+CLASS ltcl_abap_to_json DEFINITION
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT
+  FINAL.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_struc,
+        a TYPE string,
+        b TYPE i,
+        c TYPE abap_bool,
+        d TYPE xsdboolean,
+      END OF ty_struc,
+      tt_struc TYPE STANDARD TABLE OF ty_struc WITH KEY a,
+      BEGIN OF ty_struc_complex.
+        INCLUDE TYPE ty_struc.
+    TYPES:
+        el TYPE string,
+        struc TYPE ty_struc,
+        tab TYPE tt_struc,
+        stab TYPE string_table,
+      END OF ty_struc_complex.
+ 
+    METHODS set_ajson FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_value_number FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_value_string FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_value_true FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_value_false FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_value_xsdboolean FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_value_timestamp FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_value_timestamp_initial FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_null FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_obj FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_array FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS set_complex_obj FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS prefix FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_ajson DEFINITION LOCAL FRIENDS ltcl_abap_to_json.
+ 
+CLASS ltcl_abap_to_json IMPLEMENTATION.
+ 
+  METHOD set_ajson.
+ 
+    DATA lo_nodes TYPE REF TO lcl_nodes_helper.
+    DATA lo_src TYPE REF TO zcl_abapgit_ajson.
+    lo_src = zcl_abapgit_ajson=>create_empty( ).
+ 
+    CREATE OBJECT lo_nodes.
+    lo_nodes->add( '        |      |object |     ||1' ).
+    lo_nodes->add( '/       |a     |object |     ||1' ).
+    lo_nodes->add( '/a/     |b     |object |     ||1' ).
+    lo_nodes->add( '/a/b/   |c     |object |     ||0' ).
+    lo_src->mt_json_tree = lo_nodes->mt_nodes.
+ 
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = lo_src ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_value_number.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    " number
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |num |1     ||' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_value_string.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    " string
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |str |abc     ||' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = 'abc' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_value_true.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    " true
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |bool |true     ||' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_value_false.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    " false
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |bool |false    ||' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = abap_false ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_value_xsdboolean.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    DATA lv_xsdboolean TYPE xsdboolean.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |bool |true     ||' ).
+ 
+    lv_xsdboolean = 'X'.
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = lv_xsdboolean ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_null.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA lv_null_ref TYPE REF TO data.
+ 
+    " null
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |null |null ||' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = lv_null_ref ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_value_timestamp.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA lv_timezone TYPE timezone VALUE ''.
+ 
+    DATA lv_timestamp TYPE timestamp.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |str |2022-08-31T00:00:00Z||' ).
+ 
+    CONVERT DATE '20220831' TIME '000000'
+      INTO TIME STAMP lv_timestamp TIME ZONE lv_timezone.
+    lt_nodes = lcl_abap_to_json=>convert( lcl_abap_to_json=>format_timestamp( lv_timestamp ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_value_timestamp_initial.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    DATA lv_timestamp TYPE timestamp.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '        |      |str |0000-00-00T00:00:00Z||' ).
+ 
+    lv_timestamp = 0.
+    lt_nodes = lcl_abap_to_json=>convert( lcl_abap_to_json=>format_timestamp( lv_timestamp ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD prefix.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    DATA ls_prefix TYPE zif_abapgit_ajson_types=>ty_path_name.
+ 
+    ls_prefix-path = '/a/'.
+    ls_prefix-name = 'b'.
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '/a/       |b     |num |1     ||' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert(
+      iv_data   = 1
+      is_prefix = ls_prefix ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_obj.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA ls_struc TYPE ty_struc.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    ls_struc-a = 'abc'.
+    ls_struc-b = 10.
+    ls_struc-c = abap_true.
+    ls_struc-d = 'X'.
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |object |     ||4' ).
+    lo_nodes_exp->add( '/      |a     |str    |abc  ||0' ).
+    lo_nodes_exp->add( '/      |b     |num    |10   ||0' ).
+    lo_nodes_exp->add( '/      |c     |bool   |true ||0' ).
+    lo_nodes_exp->add( '/      |d     |bool   |true ||0' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = ls_struc ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_complex_obj.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA ls_struc TYPE ty_struc_complex.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+    FIELD-SYMBOLS <i> LIKE LINE OF ls_struc-tab.
+ 
+    ls_struc-a = 'abc'.
+    ls_struc-b = 10.
+    ls_struc-c = abap_true.
+    ls_struc-d = 'X'.
+    ls_struc-el = 'elem'.
+ 
+    ls_struc-struc-a = 'deep'.
+    ls_struc-struc-b = 123.
+ 
+    APPEND 'hello' TO ls_struc-stab.
+    APPEND 'world' TO ls_struc-stab.
+ 
+    APPEND INITIAL LINE TO ls_struc-tab ASSIGNING <i>.
+    <i>-a = 'abc'.
+    APPEND INITIAL LINE TO ls_struc-tab ASSIGNING <i>.
+    <i>-a = 'bcd'.
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |object |     ||8' ).
+    lo_nodes_exp->add( '/      |a     |str    |abc  ||0' ).
+    lo_nodes_exp->add( '/      |b     |num    |10   ||0' ).
+    lo_nodes_exp->add( '/      |c     |bool   |true ||0' ).
+    lo_nodes_exp->add( '/      |d     |bool   |true ||0' ).
+    lo_nodes_exp->add( '/      |el    |str    |elem ||0' ).
+    lo_nodes_exp->add( '/      |struc |object |     ||4' ).
+    lo_nodes_exp->add( '/struc/|a     |str    |deep ||0' ).
+    lo_nodes_exp->add( '/struc/|b     |num    |123  ||0' ).
+    lo_nodes_exp->add( '/struc/|c     |bool   |false||0' ).
+    lo_nodes_exp->add( '/struc/|d     |bool   |false||0' ).
+ 
+    lo_nodes_exp->add( '/      |tab   |array  |     | |2' ).
+    lo_nodes_exp->add( '/tab/  |1     |object |     |1|4' ).
+    lo_nodes_exp->add( '/tab/1/|a     |str    |abc  | |0' ).
+    lo_nodes_exp->add( '/tab/1/|b     |num    |0    | |0' ).
+    lo_nodes_exp->add( '/tab/1/|c     |bool   |false| |0' ).
+    lo_nodes_exp->add( '/tab/1/|d     |bool   |false| |0' ).
+    lo_nodes_exp->add( '/tab/  |2     |object |     |2|4' ).
+    lo_nodes_exp->add( '/tab/2/|a     |str    |bcd  | |0' ).
+    lo_nodes_exp->add( '/tab/2/|b     |num    |0    | |0' ).
+    lo_nodes_exp->add( '/tab/2/|c     |bool   |false| |0' ).
+    lo_nodes_exp->add( '/tab/2/|d     |bool   |false| |0' ).
+ 
+    lo_nodes_exp->add( '/      |stab  |array  |     | |2' ).
+    lo_nodes_exp->add( '/stab/ |1     |str    |hello|1|0' ).
+    lo_nodes_exp->add( '/stab/ |2     |str    |world|2|0' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = ls_struc ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD set_array.
+ 
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+    DATA lt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
+ 
+    DATA lt_tab TYPE TABLE OF ty_struc.
+    FIELD-SYMBOLS <s> LIKE LINE OF lt_tab.
+ 
+    APPEND INITIAL LINE TO lt_tab ASSIGNING <s>.
+    <s>-a = 'abc'.
+    <s>-b = 10.
+    APPEND INITIAL LINE TO lt_tab ASSIGNING <s>.
+    <s>-a = 'bcd'.
+    <s>-b = 20.
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |array  |     | |2' ).
+    lo_nodes_exp->add( '/      |1     |object |     |1|4' ).
+    lo_nodes_exp->add( '/1/    |a     |str    |abc  | |0' ).
+    lo_nodes_exp->add( '/1/    |b     |num    |10   | |0' ).
+    lo_nodes_exp->add( '/1/    |c     |bool   |false| |0' ).
+    lo_nodes_exp->add( '/1/    |d     |bool   |false| |0' ).
+    lo_nodes_exp->add( '/      |2     |object |     |2|4' ).
+    lo_nodes_exp->add( '/2/    |a     |str    |bcd  | |0' ).
+    lo_nodes_exp->add( '/2/    |b     |num    |20   | |0' ).
+    lo_nodes_exp->add( '/2/    |c     |bool   |false| |0' ).
+    lo_nodes_exp->add( '/2/    |d     |bool   |false| |0' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = lt_tab ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+    DATA lt_strtab TYPE string_table.
+    APPEND 'abc' TO lt_strtab.
+    APPEND 'bcd' TO lt_strtab.
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |array  |     | |2' ).
+    lo_nodes_exp->add( '/      |1     |str    |abc  |1|0' ).
+    lo_nodes_exp->add( '/      |2     |str    |bcd  |2|0' ).
+ 
+    lt_nodes = lcl_abap_to_json=>convert( iv_data = lt_strtab ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_nodes
+      exp = lo_nodes_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* FILTER TEST
+**********************************************************************
+ 
+CLASS ltcl_filter_test DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_ajson_filter.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_visit_history,
+        path TYPE string,
+        type TYPE zif_abapgit_ajson_filter=>ty_visit_type,
+      END OF ty_visit_history.
+ 
+    DATA mt_visit_history TYPE TABLE OF ty_visit_history.
+ 
+    METHODS simple_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS array_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS visit_types FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ 
+ENDCLASS.
+ 
+CLASS ltcl_filter_test IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_ajson_filter~keep_node.
+ 
+    DATA ls_visit_history LIKE LINE OF mt_visit_history.
+ 
+    IF iv_visit > 0.
+      ls_visit_history-type = iv_visit.
+      ls_visit_history-path = is_node-path && is_node-name && '/'.
+      APPEND ls_visit_history TO mt_visit_history.
+    ENDIF.
+ 
+    rv_keep = boolc( NOT is_node-name CA 'xX' AND NOT is_node-value CA 'xX' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD simple_test.
+ 
+    DATA lo_json TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_json_filtered TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lo_json = zcl_abapgit_ajson=>create_empty( ).
+    lo_json->set(
+      iv_path = '/a'
+      iv_val  = 1 ).
+    lo_json->set(
+      iv_path = '/b'
+      iv_val  = 1 ).
+    lo_json->set(
+      iv_path = '/x'
+      iv_val  = 1 ).
+    lo_json->set(
+      iv_path = '/c/x'
+      iv_val  = 1 ).
+    lo_json->set(
+      iv_path = '/c/y'
+      iv_val  = 1 ).
+ 
+    lo_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = lo_json
+      ii_filter      = me ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |object |     | |3' ).
+    lo_nodes_exp->add( '/      |a     |num    |1    | |0' ).
+    lo_nodes_exp->add( '/      |b     |num    |1    | |0' ).
+    lo_nodes_exp->add( '/      |c     |object |     | |1' ).
+    lo_nodes_exp->add( '/c/    |y     |num    |1    | |0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_json_filtered->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD array_test.
+ 
+    DATA lo_json TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_json_filtered TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lo_json = zcl_abapgit_ajson=>create_empty( ).
+    lo_json->touch_array( '/' ).
+    lo_json->push(
+      iv_path = '/'
+      iv_val  = 'a' ).
+    lo_json->push(
+      iv_path = '/'
+      iv_val  = 'x' ).
+    lo_json->push(
+      iv_path = '/'
+      iv_val  = 'b' ).
+ 
+    lo_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = lo_json
+      ii_filter      = me ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |array  |     | |2' ).
+    lo_nodes_exp->add( '/      |1     |str    |a    |1|0' ).
+    lo_nodes_exp->add( '/      |2     |str    |b    |2|0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_json_filtered->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD visit_types.
+ 
+    DATA lo_json TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_json_filtered TYPE REF TO zcl_abapgit_ajson.
+ 
+    DATA lt_visits_exp LIKE mt_visit_history.
+    FIELD-SYMBOLS <v> LIKE LINE OF lt_visits_exp.
+ 
+    DATA:
+      BEGIN OF ls_dummy,
+        d TYPE i VALUE 10,
+        e TYPE i VALUE 20,
+      END OF ls_dummy.
+ 
+    CLEAR mt_visit_history.
+ 
+    lo_json = zcl_abapgit_ajson=>create_empty( ).
+    lo_json->touch_array( '/' ).
+    lo_json->push(
+      iv_path = '/'
+      iv_val  = 'a' ).
+    lo_json->push(
+      iv_path = '/'
+      iv_val  = 'b' ).
+    lo_json->push(
+      iv_path = '/'
+      iv_val  = ls_dummy ).
+ 
+    lo_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = lo_json
+      ii_filter      = me ).
+ 
+    APPEND INITIAL LINE TO lt_visits_exp ASSIGNING <v>.
+    <v>-path = '/'.
+    <v>-type = zif_abapgit_ajson_filter=>visit_type-open.
+    APPEND INITIAL LINE TO lt_visits_exp ASSIGNING <v>.
+    <v>-path = '/3/'.
+    <v>-type = zif_abapgit_ajson_filter=>visit_type-open.
+    APPEND INITIAL LINE TO lt_visits_exp ASSIGNING <v>.
+    <v>-path = '/3/'.
+    <v>-type = zif_abapgit_ajson_filter=>visit_type-close.
+    APPEND INITIAL LINE TO lt_visits_exp ASSIGNING <v>.
+    <v>-path = '/'.
+    <v>-type = zif_abapgit_ajson_filter=>visit_type-close.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mt_visit_history
+      exp = lt_visits_exp ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* MAPPER TEST
+**********************************************************************
+ 
+CLASS ltcl_mapper_test DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_ajson_mapping.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS simple_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS array_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS duplication_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS empty_name_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS trivial FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_mapper_test IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+    IF cv_name+0(1) = 'a'.
+      cv_name = to_upper( cv_name ).
+    ENDIF.
+    IF cv_name = 'set_this_empty'.
+      CLEAR cv_name.
+    ENDIF.
+    " watch dog for array
+    IF is_node-index <> 0.
+      cl_abap_unit_assert=>fail( 'rename must not be called for direct array items' ).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+  ENDMETHOD.
+ 
+  METHOD simple_test.
+ 
+    DATA lo_json TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_json_filtered TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lo_json = zcl_abapgit_ajson=>create_empty( ).
+    lo_json->set(
+      iv_path = '/ab'
+      iv_val  = 1 ).
+    lo_json->set(
+      iv_path = '/bc'
+      iv_val  = 2 ).
+    lo_json->set(
+      iv_path = '/c/ax'
+      iv_val  = 3 ).
+    lo_json->set(
+      iv_path = '/c/by'
+      iv_val  = 4 ).
+    lo_json->set(
+      iv_path = '/a/ax'
+      iv_val  = 5 ).
+    lo_json->set(
+      iv_path = '/a/by'
+      iv_val  = 6 ).
+ 
+    lo_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = lo_json
+      ii_mapper      = me ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |object |     | |4' ).
+    lo_nodes_exp->add( '/      |AB    |num    |1    | |0' ).
+    lo_nodes_exp->add( '/      |bc    |num    |2    | |0' ).
+    lo_nodes_exp->add( '/      |c     |object |     | |2' ).
+    lo_nodes_exp->add( '/c/    |AX    |num    |3    | |0' ).
+    lo_nodes_exp->add( '/c/    |by    |num    |4    | |0' ).
+    lo_nodes_exp->add( '/      |A     |object |     | |2' ).
+    lo_nodes_exp->add( '/A/    |AX    |num    |5    | |0' ).
+    lo_nodes_exp->add( '/A/    |by    |num    |6    | |0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_json_filtered->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD array_test.
+ 
+    DATA lo_json TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_json_filtered TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lo_json = zcl_abapgit_ajson=>create_empty( ).
+    lo_json->touch_array( iv_path = '/' ).
+    lo_json->set(
+      iv_path = '/1/ab'
+      iv_val  = 1 ).
+    lo_json->set(
+      iv_path = '/1/bc'
+      iv_val  = 2 ).
+    lo_json->set(
+      iv_path = '/2/ax'
+      iv_val  = 3 ).
+    lo_json->set(
+      iv_path = '/2/by'
+      iv_val  = 4 ).
+ 
+    lo_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = lo_json
+      ii_mapper      = me ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |array  |     | |2' ).
+    lo_nodes_exp->add( '/      |1     |object |     |1|2' ).
+    lo_nodes_exp->add( '/      |2     |object |     |2|2' ).
+    lo_nodes_exp->add( '/1/    |AB    |num    |1    | |0' ).
+    lo_nodes_exp->add( '/1/    |bc    |num    |2    | |0' ).
+    lo_nodes_exp->add( '/2/    |AX    |num    |3    | |0' ).
+    lo_nodes_exp->add( '/2/    |by    |num    |4    | |0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_json_filtered->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+  ENDMETHOD.
+ 
+  METHOD duplication_test.
+ 
+    DATA lo_json TYPE REF TO zcl_abapgit_ajson.
+    DATA lx_err TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    lo_json = zcl_abapgit_ajson=>create_empty( ).
+    lo_json->set(
+      iv_path = '/ab'
+      iv_val  = 1 ).
+    lo_json->set(
+      iv_path = '/AB'
+      iv_val  = 2 ).
+ 
+    TRY.
+        zcl_abapgit_ajson=>create_from(
+        ii_source_json = lo_json
+        ii_mapper      = me ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx_err.
+        cl_abap_unit_assert=>assert_char_cp(
+        act = lx_err->get_text( )
+        exp = 'Renamed node has a duplicate @/AB' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD trivial.
+ 
+    DATA lo_json TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_json_filtered TYPE REF TO zcl_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lo_json = zcl_abapgit_ajson=>create_empty( ).
+    lo_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = lo_json
+      ii_mapper      = me ).
+    cl_abap_unit_assert=>assert_initial( lo_json_filtered->mt_json_tree ).
+ 
+    lo_json->set(
+      iv_path = '/'
+      iv_val  = 1 ).
+    lo_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = lo_json
+      ii_mapper      = me ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |num    |1    | |0' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_json_filtered->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD empty_name_test.
+ 
+    DATA lo_json TYPE REF TO zcl_abapgit_ajson.
+    DATA lx_err TYPE REF TO zcx_abapgit_ajson_error.
+ 
+    lo_json = zcl_abapgit_ajson=>create_empty( ).
+    lo_json->set(
+      iv_path = '/set_this_empty'
+      iv_val  = 1 ).
+ 
+    TRY.
+        zcl_abapgit_ajson=>create_from(
+        ii_source_json = lo_json
+        ii_mapper      = me ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_ajson_error INTO lx_err.
+        cl_abap_unit_assert=>assert_char_cp(
+        act = lx_err->get_text( )
+        exp = 'Renamed node name cannot be empty @/set_this_empty' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* CLONING TEST
+**********************************************************************
+ 
+CLASS ltcl_cloning_test DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_ajson_mapping.
+    INTERFACES zif_abapgit_ajson_filter.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS clone_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS filter_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS mapper_test FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS mapper_and_filter FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS opts_copying FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_cloning_test IMPLEMENTATION.
+ 
+  METHOD clone_test.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_new TYPE REF TO zif_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/ab'
+      iv_val  = 1 ).
+    li_json->set(
+      iv_path = '/xy'
+      iv_val  = 2 ).
+ 
+    li_json_new = li_json->clone( ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |object |     | |2' ).
+    lo_nodes_exp->add( '/      |ab    |num    |1    | |0' ).
+    lo_nodes_exp->add( '/      |xy    |num    |2    | |0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_new->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+    " ensure disconnection
+    li_json->set(
+      iv_path = '/ab'
+      iv_val  = 5 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json->get_integer( '/ab' )
+      exp = 5 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_new->get_integer( '/ab' )
+      exp = 1 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD filter_test.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_new TYPE REF TO zif_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/ab'
+      iv_val  = 1 ).
+    li_json->set(
+      iv_path = '/xy'
+      iv_val  = 2 ).
+ 
+    li_json_new = li_json->filter( me ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |object |     | |1' ).
+    lo_nodes_exp->add( '/      |ab    |num    |1    | |0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_new->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD mapper_test.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_new TYPE REF TO zif_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/ab'
+      iv_val  = 1 ).
+    li_json->set(
+      iv_path = '/xy'
+      iv_val  = 2 ).
+ 
+    li_json_new = li_json->map( me ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |object |     | |2' ).
+    lo_nodes_exp->add( '/      |AB    |num    |1    | |0' ).
+    lo_nodes_exp->add( '/      |xy    |num    |2    | |0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_new->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+    IF cv_name+0(1) = 'a'.
+      cv_name = to_upper( cv_name ).
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_filter~keep_node.
+    rv_keep = boolc( is_node-name IS INITIAL OR is_node-name+0(1) <> 'x' ).
+  ENDMETHOD.
+ 
+  METHOD mapper_and_filter.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_new TYPE REF TO zif_abapgit_ajson.
+    DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
+ 
+    li_json = zcl_abapgit_ajson=>new( ).
+    li_json->set(
+      iv_path = '/ab'
+      iv_val  = 1 ).
+    li_json->set(
+      iv_path = '/bc'
+      iv_val  = 2 ).
+    li_json->set(
+      iv_path = '/xy'
+      iv_val  = 3 ).
+ 
+    li_json_new = zcl_abapgit_ajson=>create_from(
+      ii_source_json = li_json
+      ii_filter = me
+      ii_mapper = me ).
+ 
+    CREATE OBJECT lo_nodes_exp.
+    lo_nodes_exp->add( '       |      |object |     | |2' ).
+    lo_nodes_exp->add( '/      |AB    |num    |1    | |0' ).
+    lo_nodes_exp->add( '/      |bc    |num    |2    | |0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_new->mt_json_tree
+      exp = lo_nodes_exp->sorted( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD opts_copying.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_new TYPE REF TO zif_abapgit_ajson.
+ 
+    li_json = zcl_abapgit_ajson=>new( )->keep_item_order( ).
+    li_json->set(
+      iv_path = '/ab'
+      iv_val  = 1 ).
+ 
+    li_json_new = li_json->clone( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_new->opts( )-keep_item_order
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson_filter_lib.clas.abap.html b/src/json/zcl_abapgit_ajson_filter_lib.clas.abap.html new file mode 100644 index 00000000000..21eb475163b --- /dev/null +++ b/src/json/zcl_abapgit_ajson_filter_lib.clas.abap.html @@ -0,0 +1,259 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson_filter_lib.clas.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson_filter_lib.clas.abap

+
+ +
+ 100% + Statements + 58/58 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 58/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +591x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_ajson_filter_lib DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create_empty_filter
+      RETURNING
+        VALUE(ri_filter) TYPE REF TO zif_abapgit_ajson_filter
+      RAISING
+        zcx_abapgit_ajson_error .
+    CLASS-METHODS create_path_filter
+      IMPORTING
+        !it_skip_paths TYPE string_table OPTIONAL
+        !iv_skip_paths TYPE string OPTIONAL
+        !iv_pattern_search TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_filter) TYPE REF TO zif_abapgit_ajson_filter
+      RAISING
+        zcx_abapgit_ajson_error .
+    CLASS-METHODS create_and_filter
+      IMPORTING
+        !it_filters TYPE zif_abapgit_ajson_filter=>ty_filter_tab
+      RETURNING
+        VALUE(ri_filter) TYPE REF TO zif_abapgit_ajson_filter
+      RAISING
+        zcx_abapgit_ajson_error .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ajson_filter_lib IMPLEMENTATION.
+ 
+ 
+  METHOD create_and_filter.
+    CREATE OBJECT ri_filter TYPE lcl_and_filter
+      EXPORTING
+        it_filters = it_filters.
+  ENDMETHOD.
+ 
+ 
+  METHOD create_empty_filter.
+    CREATE OBJECT ri_filter TYPE lcl_empty_filter.
+  ENDMETHOD.
+ 
+ 
+  METHOD create_path_filter.
+    CREATE OBJECT ri_filter TYPE lcl_paths_filter
+      EXPORTING
+        iv_pattern_search = iv_pattern_search
+        it_skip_paths = it_skip_paths
+        iv_skip_paths = iv_skip_paths.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap.html b/src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap.html new file mode 100644 index 00000000000..cd5e1b800e3 --- /dev/null +++ b/src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap.html @@ -0,0 +1,517 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap

+
+ +
+ 96.52% + Statements + 139/144 +
+ + +
+ 77.77% + Branches + 7/9 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 96.52% + Lines + 139/144 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +1451x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +11x +11x +3x +3x +3x +11x +11x +29x +29x +29x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +  +  +  +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
**********************************************************************
+*  FILTER EMPTY VALUES
+**********************************************************************
+ 
+CLASS lcl_empty_filter DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_ajson_filter.
+ENDCLASS.
+ 
+CLASS lcl_empty_filter IMPLEMENTATION.
+  METHOD zif_abapgit_ajson_filter~keep_node.
+ 
+    rv_keep = boolc(
+      ( iv_visit = zif_abapgit_ajson_filter=>visit_type-value AND is_node-value IS NOT INITIAL ) OR
+      ( iv_visit <> zif_abapgit_ajson_filter=>visit_type-value AND is_node-children > 0 ) ).
+    " children = 0 on open for initially empty nodes and on close for filtered ones
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+**********************************************************************
+*  FILTER PREDEFINED PATHS
+**********************************************************************
+ 
+CLASS lcl_paths_filter DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_ajson_filter.
+    METHODS constructor
+      IMPORTING
+        it_skip_paths TYPE string_table OPTIONAL
+        iv_skip_paths TYPE string OPTIONAL
+        iv_pattern_search TYPE abap_bool
+      RAISING
+        zcx_abapgit_ajson_error.
+  PRIVATE SECTION.
+    DATA mt_skip_paths TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
+    DATA mv_pattern_search TYPE abap_bool.
+ENDCLASS.
+ 
+CLASS lcl_paths_filter IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_ajson_filter~keep_node.
+ 
+    DATA lv_full_path TYPE string.
+    FIELD-SYMBOLS <p> LIKE LINE OF mt_skip_paths.
+ 
+    lv_full_path = is_node-path && is_node-name.
+ 
+    IF mv_pattern_search = abap_true.
+      rv_keep = abap_true.
+      LOOP AT mt_skip_paths ASSIGNING <p>.
+        IF lv_full_path CP <p>.
+          rv_keep = abap_false.
+          EXIT.
+        ENDIF.
+      ENDLOOP.
+    ELSE.
+      READ TABLE mt_skip_paths WITH KEY table_line = lv_full_path TRANSPORTING NO FIELDS.
+      rv_keep = boolc( sy-subrc <> 0 ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD constructor.
+ 
+    DATA lv_s TYPE string.
+    DATA lt_tab TYPE string_table.
+    FIELD-SYMBOLS <s> TYPE string.
+ 
+    IF boolc( iv_skip_paths IS INITIAL ) = boolc( it_skip_paths IS INITIAL ). " XOR
+      zcx_abapgit_ajson_error=>raise( 'no filter path specified' ).
+    ENDIF.
+ 
+    LOOP AT it_skip_paths INTO lv_s.
+      lv_s = to_lower( lv_s ).
+      APPEND lv_s TO lt_tab.
+    ENDLOOP.
+ 
+    IF iv_skip_paths IS NOT INITIAL.
+      SPLIT iv_skip_paths AT ',' INTO TABLE lt_tab.
+      LOOP AT lt_tab ASSIGNING <s>.
+        IF <s> IS INITIAL.
+          DELETE lt_tab INDEX sy-tabix.
+          CONTINUE.
+        ENDIF.
+        <s> = condense( to_lower( <s> ) ).
+      ENDLOOP.
+    ENDIF.
+ 
+    SORT lt_tab BY table_line.
+    DELETE ADJACENT DUPLICATES FROM lt_tab.
+ 
+    mt_skip_paths = lt_tab.
+    mv_pattern_search = iv_pattern_search.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* MULTI FILTER
+**********************************************************************
+ 
+CLASS lcl_and_filter DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_ajson_filter.
+    METHODS constructor
+      IMPORTING
+        it_filters TYPE zif_abapgit_ajson_filter=>ty_filter_tab
+      RAISING
+        zcx_abapgit_ajson_error.
+  PRIVATE SECTION.
+    DATA mt_filters TYPE zif_abapgit_ajson_filter=>ty_filter_tab.
+ENDCLASS.
+ 
+CLASS lcl_and_filter IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_ajson_filter~keep_node.
+ 
+    DATA li_filter LIKE LINE OF mt_filters.
+ 
+    rv_keep = abap_true.
+    LOOP AT mt_filters INTO li_filter.
+      rv_keep = li_filter->keep_node(
+        is_node  = is_node
+        iv_visit = iv_visit ).
+      IF rv_keep = abap_false.
+        RETURN.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD constructor.
+ 
+    DATA li_filter LIKE LINE OF it_filters.
+ 
+    LOOP AT it_filters INTO li_filter WHERE table_line IS BOUND.
+      APPEND li_filter TO mt_filters.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap.html b/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap.html new file mode 100644 index 00000000000..d52fbbfccb0 --- /dev/null +++ b/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap.html @@ -0,0 +1,775 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson_filter_lib.clas.testclasses.abap

+
+ +
+ 100% + Statements + 230/230 +
+ + +
+ 100% + Branches + 7/7 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 230/230 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +2311x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_filters_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+  PRIVATE SECTION.
+    METHODS empty_filter_simple FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS empty_filter_deep FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS path_filter FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS path_filter_string FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS path_filter_w_patterns FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS path_filter_deep FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS and_filter FOR TESTING RAISING zcx_abapgit_ajson_error.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_filters_test IMPLEMENTATION.
+ 
+  METHOD empty_filter_simple.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_filtered TYPE REF TO zif_abapgit_ajson.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/a'
+      iv_val  = '1' ).
+    li_json->set(
+      iv_path = '/b'
+      iv_val  = '' ).
+    li_json->set(
+      iv_path = '/c'
+      iv_val  = '3' ).
+    li_json->set(
+      iv_path = '/d'
+      iv_val  = 0 ).
+ 
+    li_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = li_json
+      ii_filter = zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_filtered->stringify( )
+      exp = '{"a":"1","c":"3"}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD empty_filter_deep.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_filtered TYPE REF TO zif_abapgit_ajson.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/a'
+      iv_val  = '1' ).
+    li_json->set(
+      iv_path = '/b/c'
+      iv_val  = '' ).
+    li_json->set(
+      iv_path = '/b/d'
+      iv_val  = 0 ).
+    li_json->set(
+      iv_path = '/d/e'
+      iv_val  = 0 ).
+ 
+    li_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = li_json
+      ii_filter = zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_filtered->stringify( )
+      exp = '{"a":"1"}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD path_filter.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_filtered TYPE REF TO zif_abapgit_ajson.
+    DATA lt_paths TYPE string_table.
+ 
+    APPEND '/b/c' TO lt_paths.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/a'
+      iv_val  = '1' ).
+    li_json->set(
+      iv_path = '/b/c'
+      iv_val  = '2' ).
+    li_json->set(
+      iv_path = '/c/d'
+      iv_val  = '3' ).
+ 
+    li_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = li_json
+      ii_filter = zcl_abapgit_ajson_filter_lib=>create_path_filter( it_skip_paths = lt_paths ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_filtered->stringify( )
+      exp = '{"a":"1","b":{},"c":{"d":"3"}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD path_filter_string.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_filtered TYPE REF TO zif_abapgit_ajson.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/a'
+      iv_val  = '1' ).
+    li_json->set(
+      iv_path = '/b/c'
+      iv_val  = '2' ).
+    li_json->set(
+      iv_path = '/c/d'
+      iv_val  = '3' ).
+ 
+    li_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = li_json
+      ii_filter = zcl_abapgit_ajson_filter_lib=>create_path_filter( iv_skip_paths = '/b/c,/c/d' ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_filtered->stringify( )
+      exp = '{"a":"1","b":{},"c":{}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD path_filter_w_patterns.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_filtered TYPE REF TO zif_abapgit_ajson.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/@meta'
+      iv_val  = 'meta' ).
+    li_json->set(
+      iv_path = '/a'
+      iv_val  = '1' ).
+    li_json->set(
+      iv_path = '/b/c'
+      iv_val  = '2' ).
+    li_json->set(
+      iv_path = '/c/d'
+      iv_val  = '3' ).
+    li_json->set(
+      iv_path = '/c/@meta2'
+      iv_val  = 'meta2' ).
+ 
+    li_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = li_json
+      ii_filter = zcl_abapgit_ajson_filter_lib=>create_path_filter(
+        iv_skip_paths = '/*/c,*/@*'
+        iv_pattern_search = abap_true ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_filtered->stringify( )
+      exp = '{"a":"1","b":{},"c":{"d":"3"}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD path_filter_deep.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_filtered TYPE REF TO zif_abapgit_ajson.
+    DATA lt_paths TYPE string_table.
+ 
+    APPEND '/b' TO lt_paths.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/a'
+      iv_val  = '1' ).
+    li_json->set(
+      iv_path = '/b/c'
+      iv_val  = '2' ).
+    li_json->set(
+      iv_path = '/b/d'
+      iv_val  = 'x' ).
+    li_json->set(
+      iv_path = '/c/d'
+      iv_val  = '3' ).
+ 
+    li_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = li_json
+      ii_filter = zcl_abapgit_ajson_filter_lib=>create_path_filter( it_skip_paths = lt_paths ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_filtered->stringify( )
+      exp = '{"a":"1","c":{"d":"3"}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD and_filter.
+ 
+    DATA li_json TYPE REF TO zif_abapgit_ajson.
+    DATA li_json_filtered TYPE REF TO zif_abapgit_ajson.
+    DATA lt_filters TYPE zif_abapgit_ajson_filter=>ty_filter_tab.
+ 
+    APPEND zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) TO lt_filters.
+    APPEND zcl_abapgit_ajson_filter_lib=>create_path_filter( iv_skip_paths = '/c' ) TO lt_filters.
+ 
+    li_json = zcl_abapgit_ajson=>create_empty( ).
+    li_json->set(
+      iv_path = '/a'
+      iv_val  = '1' ).
+    li_json->set(
+      iv_path = '/b'
+      iv_val  = '' ).
+    li_json->set(
+      iv_path = '/c'
+      iv_val  = '3' ).
+    li_json->set(
+      iv_path = '/d'
+      iv_val  = 0 ).
+ 
+    li_json_filtered = zcl_abapgit_ajson=>create_from(
+      ii_source_json = li_json
+      ii_filter = zcl_abapgit_ajson_filter_lib=>create_and_filter( lt_filters ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_json_filtered->stringify( )
+      exp = '{"a":"1"}' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson_mapping.clas.abap.html b/src/json/zcl_abapgit_ajson_mapping.clas.abap.html new file mode 100644 index 00000000000..2e35180bd0d --- /dev/null +++ b/src/json/zcl_abapgit_ajson_mapping.clas.abap.html @@ -0,0 +1,553 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson_mapping.clas.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson_mapping.clas.abap

+
+ +
+ 100% + Statements + 156/156 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 156/156 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +1571x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_ajson_mapping DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF rename_by,
+        attr_name TYPE i VALUE 0,
+        full_path TYPE i VALUE 1,
+        pattern TYPE i VALUE 2,
+        " regex type i value 3, " TODO add if needed in future
+      END OF rename_by.
+ 
+    CLASS-METHODS create_camel_case " DEPRECATED
+      IMPORTING
+        it_mapping_fields   TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
+        iv_first_json_upper TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ri_mapping)   TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_upper_case
+      IMPORTING
+        it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_lower_case
+      IMPORTING
+        it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_field_mapping " DEPRECATED
+      IMPORTING
+        it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_rename
+      IMPORTING
+        it_rename_map TYPE zif_abapgit_ajson_mapping=>tty_rename_map
+        iv_rename_by TYPE i DEFAULT rename_by-attr_name
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_compound_mapper
+      IMPORTING
+        ii_mapper1 TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        ii_mapper2 TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        ii_mapper3 TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
+        it_more TYPE zif_abapgit_ajson_mapping=>ty_table_of OPTIONAL
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_to_snake_case
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+    CLASS-METHODS create_to_camel_case
+      IMPORTING
+        iv_first_json_upper TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ajson_mapping IMPLEMENTATION.
+ 
+ 
+  METHOD create_camel_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_mapping_camel
+      EXPORTING
+        it_mapping_fields   = it_mapping_fields
+        iv_first_json_upper = iv_first_json_upper.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_compound_mapper.
+ 
+    DATA lt_queue TYPE zif_abapgit_ajson_mapping=>ty_table_of.
+ 
+    APPEND ii_mapper1 TO lt_queue.
+    APPEND ii_mapper2 TO lt_queue.
+    APPEND ii_mapper3 TO lt_queue.
+    APPEND LINES OF it_more TO lt_queue.
+    DELETE lt_queue WHERE table_line IS INITIAL.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_compound_mapper
+      EXPORTING
+        it_queue = lt_queue.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_field_mapping.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_mapping_fields
+      EXPORTING
+        it_mapping_fields = it_mapping_fields.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_lower_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_mapping_to_lower
+      EXPORTING
+        it_mapping_fields = it_mapping_fields.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_rename.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_rename
+      EXPORTING
+        it_rename_map = it_rename_map
+        iv_rename_by = iv_rename_by.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_to_camel_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_to_camel
+      EXPORTING
+        iv_first_json_upper = iv_first_json_upper.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_to_snake_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_to_snake.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_upper_case.
+ 
+    CREATE OBJECT ri_mapping TYPE lcl_mapping_to_upper
+      EXPORTING
+        it_mapping_fields = it_mapping_fields.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson_mapping.clas.locals_imp.abap.html b/src/json/zcl_abapgit_ajson_mapping.clas.locals_imp.abap.html new file mode 100644 index 00000000000..30c123d477f --- /dev/null +++ b/src/json/zcl_abapgit_ajson_mapping.clas.locals_imp.abap.html @@ -0,0 +1,1108 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson_mapping.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson_mapping.clas.locals_imp.abap

+
+ +
+ 96.48% + Statements + 329/341 +
+ + +
+ 77.77% + Branches + 14/18 +
+ + +
+ 75% + Functions + 6/8 +
+ + +
+ 96.48% + Lines + 329/341 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +3421x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +1x +1x +1x +20x +20x +20x +20x +20x +20x +6x +6x +20x +20x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +11x +11x +11x +11x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +32x +32x +32x +32x +32x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +35x +35x +35x +35x +35x +35x +35x +35x +35x +5x +5x +30x +30x +35x +35x +35x +35x +35x +35x +35x +35x +35x +35x +35x +35x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_mapping_fields IMPLEMENTATION. "DEPRECATED
+ 
+ 
+  METHOD constructor.
+ 
+    DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
+ 
+    LOOP AT it_mapping_fields INTO ls_mapping_field.
+      ls_mapping_field-abap = to_upper( ls_mapping_field-abap ).
+      INSERT ls_mapping_field INTO TABLE mt_mapping_fields.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+ 
+    DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
+ 
+    READ TABLE mt_mapping_fields INTO ls_mapping_field
+      WITH KEY json COMPONENTS json = iv_name.
+    IF sy-subrc = 0.
+      rv_result = ls_mapping_field-abap.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+ 
+    DATA lv_field TYPE string.
+    DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
+ 
+    lv_field = to_upper( iv_name ).
+ 
+    READ TABLE mt_mapping_fields INTO ls_mapping_field
+      WITH KEY abap COMPONENTS abap = lv_field.
+    IF sy-subrc = 0.
+      rv_result = ls_mapping_field-json.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_rename IMPLEMENTATION.
+ 
+  METHOD constructor.
+    mt_rename_map = it_rename_map.
+    mv_rename_by = iv_rename_by.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+ 
+    DATA lv_full_path TYPE string.
+    DATA lv_pair_found TYPE abap_bool.
+    FIELD-SYMBOLS <r> LIKE LINE OF mt_rename_map.
+ 
+    CASE mv_rename_by.
+      WHEN zcl_abapgit_ajson_mapping=>rename_by-attr_name.
+        READ TABLE mt_rename_map ASSIGNING <r> WITH TABLE KEY by_name COMPONENTS from = cv_name.
+        lv_pair_found = boolc( sy-subrc = 0 ).
+      WHEN zcl_abapgit_ajson_mapping=>rename_by-full_path.
+        lv_full_path = is_node-path && cv_name.
+        READ TABLE mt_rename_map ASSIGNING <r> WITH TABLE KEY by_name COMPONENTS from = lv_full_path.
+        lv_pair_found = boolc( sy-subrc = 0 ).
+      WHEN zcl_abapgit_ajson_mapping=>rename_by-pattern.
+        lv_full_path = is_node-path && cv_name.
+        LOOP AT mt_rename_map ASSIGNING <r>.
+          IF lv_full_path CP <r>-from.
+            lv_pair_found = abap_true.
+            EXIT.
+          ENDIF.
+        ENDLOOP.
+      WHEN OTHERS.
+        lv_pair_found = abap_false. " No rename
+    ENDCASE.
+ 
+    IF lv_pair_found = abap_true.
+      cv_name = <r>-to.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_mapping_to_upper IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    mi_mapping_fields = zcl_abapgit_ajson_mapping=>create_field_mapping( it_mapping_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+ 
+    rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
+                                            iv_name = iv_name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+ 
+    rv_result = mi_mapping_fields->to_json( iv_path = iv_path
+                                            iv_name = iv_name ).
+ 
+    IF rv_result IS NOT INITIAL. " Mapping found
+      RETURN.
+    ENDIF.
+ 
+    rv_result = to_upper( iv_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+ 
+    cv_name = to_upper( cv_name ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+CLASS lcl_mapping_to_lower IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    mi_mapping_fields = zcl_abapgit_ajson_mapping=>create_field_mapping( it_mapping_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+ 
+    rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
+                                            iv_name = iv_name ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+ 
+    rv_result = mi_mapping_fields->to_json( iv_path = iv_path
+                                            iv_name = iv_name ).
+ 
+    IF rv_result IS NOT INITIAL. " Mapping found
+      RETURN.
+    ENDIF.
+ 
+    rv_result = to_lower( iv_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+ 
+    cv_name = to_lower( cv_name ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+CLASS lcl_mapping_camel IMPLEMENTATION. "DEPRECATED
+ 
+ 
+  METHOD constructor.
+ 
+    mi_mapping_fields   = zcl_abapgit_ajson_mapping=>create_field_mapping( it_mapping_fields ).
+    mv_first_json_upper = iv_first_json_upper.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+ 
+    rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
+                                            iv_name = iv_name ).
+ 
+    IF rv_result IS NOT INITIAL. " Mapping found
+      RETURN.
+    ENDIF.
+ 
+    rv_result = iv_name.
+ 
+    REPLACE ALL OCCURRENCES OF REGEX `([a-z])([A-Z])` IN rv_result WITH `$1_$2`.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+ 
+    TYPES ty_token TYPE c LENGTH 255.
+    DATA lt_tokens TYPE STANDARD TABLE OF ty_token.
+    DATA lv_from TYPE i.
+    FIELD-SYMBOLS <token> LIKE LINE OF lt_tokens.
+ 
+    rv_result = mi_mapping_fields->to_json( iv_path = iv_path
+                                            iv_name = iv_name ).
+ 
+    IF rv_result IS NOT INITIAL. " Mapping found
+      RETURN.
+    ENDIF.
+ 
+    rv_result = iv_name.
+ 
+    REPLACE ALL OCCURRENCES OF `__` IN rv_result WITH `*`.
+ 
+    TRANSLATE rv_result TO LOWER CASE.
+    TRANSLATE rv_result USING `/_:_~_`.
+ 
+    IF mv_first_json_upper = abap_true.
+      lv_from = 1.
+    ELSE.
+      lv_from = 2.
+    ENDIF.
+ 
+    SPLIT rv_result AT `_` INTO TABLE lt_tokens.
+    LOOP AT lt_tokens ASSIGNING <token> FROM lv_from.
+      TRANSLATE <token>(1) TO UPPER CASE.
+    ENDLOOP.
+ 
+    CONCATENATE LINES OF lt_tokens INTO rv_result.
+    REPLACE ALL OCCURRENCES OF `*` IN rv_result WITH `_`.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_compound_mapper IMPLEMENTATION.
+ 
+  METHOD constructor.
+    mt_queue = it_queue.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+ 
+    DATA ls_node LIKE is_node.
+    DATA li_mapper LIKE LINE OF mt_queue.
+ 
+    ls_node = is_node.
+ 
+    LOOP AT mt_queue INTO li_mapper.
+      li_mapper->rename_node(
+        EXPORTING
+          is_node = ls_node
+        CHANGING
+          cv_name = cv_name ).
+      ls_node-name = cv_name.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_to_snake IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+ 
+    REPLACE ALL OCCURRENCES OF REGEX `([a-z])([A-Z])` IN cv_name WITH `$1_$2`.
+    cv_name = to_lower( cv_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_to_camel IMPLEMENTATION.
+ 
+  METHOD constructor.
+    mv_first_json_upper = iv_first_json_upper.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~rename_node.
+ 
+    TYPES lty_token TYPE c LENGTH 255.
+    CONSTANTS lc_forced_underscore_marker TYPE c LENGTH 1 VALUE cl_abap_char_utilities=>horizontal_tab.
+ 
+    DATA lt_tokens TYPE STANDARD TABLE OF lty_token.
+    DATA lv_from TYPE i.
+    FIELD-SYMBOLS <token> LIKE LINE OF lt_tokens.
+ 
+    IF mv_first_json_upper = abap_true.
+      lv_from = 1.
+    ELSE.
+      lv_from = 2.
+    ENDIF.
+    REPLACE ALL OCCURRENCES OF `__` IN cv_name WITH lc_forced_underscore_marker. " Force underscore
+ 
+    SPLIT cv_name AT `_` INTO TABLE lt_tokens.
+    DELETE lt_tokens WHERE table_line IS INITIAL.
+    LOOP AT lt_tokens ASSIGNING <token> FROM lv_from.
+      TRANSLATE <token>+0(1) TO UPPER CASE.
+    ENDLOOP.
+ 
+    CONCATENATE LINES OF lt_tokens INTO cv_name.
+    REPLACE ALL OCCURRENCES OF lc_forced_underscore_marker IN cv_name WITH `_`.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_abap.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_ajson_mapping~to_json.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap.html b/src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap.html new file mode 100644 index 00000000000..56c155aa549 --- /dev/null +++ b/src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap.html @@ -0,0 +1,1717 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson_mapping.clas.testclasses.abap

+
+ +
+ 100% + Statements + 544/544 +
+ + +
+ 100% + Branches + 20/20 +
+ + +
+ 100% + Functions + 20/20 +
+ + +
+ 100% + Lines + 544/544 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +5451x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test_mappers DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      from_json_to_json FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_abap FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_json FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_json_nested_struc FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_json_nested_table FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_json_first_lower FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+    METHODS:
+      to_snake FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_camel FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_camel_1st_upper FOR TESTING RAISING zcx_abapgit_ajson_error,
+      rename_by_attr FOR TESTING RAISING zcx_abapgit_ajson_error,
+      rename_by_path FOR TESTING RAISING zcx_abapgit_ajson_error,
+      rename_by_pattern FOR TESTING RAISING zcx_abapgit_ajson_error,
+      compound_mapper FOR TESTING RAISING zcx_abapgit_ajson_error,
+      test_to_upper FOR TESTING RAISING zcx_abapgit_ajson_error,
+      test_to_lower FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test_mappers IMPLEMENTATION.
+ 
+ 
+  METHOD from_json_to_json.
+ 
+    DATA:
+      lo_ajson TYPE REF TO zcl_abapgit_ajson.
+ 
+    lo_ajson =
+        zcl_abapgit_ajson=>parse(
+            iv_json           = `{"fieldData":"field_value"}`
+            ii_custom_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ) ).
+ 
+    lo_ajson->set_string( iv_path = `/fieldData`
+                          iv_val = 'E' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_ajson->stringify( )
+      exp = '{"fieldData":"E"}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_abap.
+ 
+    DATA:
+      lo_ajson   TYPE REF TO zcl_abapgit_ajson,
+      li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA:
+      BEGIN OF ls_result,
+        field_data TYPE string,
+      END OF ls_result.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( ).
+ 
+    lo_ajson = zcl_abapgit_ajson=>parse( iv_json = '{"FieldData":"field_value"}'
+                                         ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->to_abap( IMPORTING ev_container = ls_result ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_result-field_data
+      exp = 'field_value' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_json.
+ 
+    DATA:
+      lo_ajson   TYPE REF TO zcl_abapgit_ajson,
+      li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA:
+      BEGIN OF ls_result,
+        field_data TYPE string,
+      END OF ls_result.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ).
+ 
+    ls_result-field_data = 'field_value'.
+ 
+    lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->set( iv_path = '/'
+                   iv_val = ls_result ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_ajson->stringify( )
+      exp = '{"fieldData":"field_value"}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_json_nested_struc.
+ 
+    DATA:
+      lo_ajson   TYPE REF TO zcl_abapgit_ajson,
+      li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA:
+      BEGIN OF ls_result,
+        field_data TYPE string,
+        BEGIN OF struc_data,
+          field_more TYPE string,
+        END OF struc_data,
+      END OF ls_result.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ).
+ 
+    ls_result-field_data = 'field_value'.
+    ls_result-struc_data-field_more = 'field_more'.
+ 
+    lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->set( iv_path = '/'
+                   iv_val = ls_result ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_ajson->stringify( )
+      exp = '{"fieldData":"field_value","strucData":{"fieldMore":"field_more"}}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_json_nested_table.
+ 
+    DATA:
+      lo_ajson   TYPE REF TO zcl_abapgit_ajson,
+      li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA:
+      lv_value TYPE string,
+      BEGIN OF ls_result,
+        field_data TYPE string,
+        BEGIN OF struc_data,
+          field_more TYPE string_table,
+        END OF struc_data,
+      END OF ls_result.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ).
+ 
+    ls_result-field_data = 'field_value'.
+    lv_value = 'field_more'.
+    INSERT lv_value INTO TABLE ls_result-struc_data-field_more.
+ 
+    lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->set( iv_path = '/'
+                   iv_val = ls_result ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_ajson->stringify( )
+      exp = '{"fieldData":"field_value","strucData":{"fieldMore":["field_more"]}}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_json_first_lower.
+ 
+    DATA:
+      lo_ajson   TYPE REF TO zcl_abapgit_ajson,
+      li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA:
+      BEGIN OF ls_result,
+        field_data TYPE string,
+      END OF ls_result.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( ).
+ 
+    ls_result-field_data = 'field_value'.
+ 
+    lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->set( iv_path = '/'
+                   iv_val = ls_result ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_ajson->stringify( )
+      exp = '{"FieldData":"field_value"}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD test_to_upper.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"a":1,"b":{"c":2}}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_upper_case( ) )->stringify( )
+      exp = '{"A":1,"B":{"C":2}}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>parse( '{"a":1,"b":{"c":2}}'
+        )->map( zcl_abapgit_ajson_mapping=>create_upper_case( )
+        )->stringify( )
+      exp = '{"A":1,"B":{"C":2}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_to_lower.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"A":1,"B":{"C":2}}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_lower_case( ) )->stringify( )
+      exp = '{"a":1,"b":{"c":2}}' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>parse( '{"A":1,"B":{"C":2}}'
+        )->map( zcl_abapgit_ajson_mapping=>create_lower_case( )
+        )->stringify( )
+      exp = '{"a":1,"b":{"c":2}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD rename_by_attr.
+ 
+    DATA lt_map TYPE zif_abapgit_ajson_mapping=>tty_rename_map.
+    FIELD-SYMBOLS <i> LIKE LINE OF lt_map.
+ 
+    APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
+    <i>-from = 'a'.
+    <i>-to   = 'x'.
+    APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
+    <i>-from = 'c'.
+    <i>-to   = 'y'.
+    APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
+    <i>-from = 'd'.
+    <i>-to   = 'z'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"a":1,"b":{"c":2},"d":{"e":3}}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_rename( lt_map
+        ) )->stringify( )
+      exp = '{"b":{"y":2},"x":1,"z":{"e":3}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD rename_by_path.
+ 
+    DATA lt_map TYPE zif_abapgit_ajson_mapping=>tty_rename_map.
+    FIELD-SYMBOLS <i> LIKE LINE OF lt_map.
+ 
+    APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
+    <i>-from = '/b/a'.
+    <i>-to   = 'x'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"a":1,"b":{"a":2},"c":{"a":3}}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_rename(
+          it_rename_map = lt_map
+          iv_rename_by  = zcl_abapgit_ajson_mapping=>rename_by-full_path
+        ) )->stringify( )
+      exp = '{"a":1,"b":{"x":2},"c":{"a":3}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD rename_by_pattern.
+ 
+    DATA lt_map TYPE zif_abapgit_ajson_mapping=>tty_rename_map.
+    FIELD-SYMBOLS <i> LIKE LINE OF lt_map.
+ 
+    APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
+    <i>-from = '/*/this*'.
+    <i>-to   = 'x'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"andthisnot":1,"b":{"thisone":2},"c":{"a":3}}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_rename(
+          it_rename_map = lt_map
+          iv_rename_by  = zcl_abapgit_ajson_mapping=>rename_by-pattern
+        ) )->stringify( )
+      exp = '{"andthisnot":1,"b":{"x":2},"c":{"a":3}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD compound_mapper.
+ 
+    DATA lt_map TYPE zif_abapgit_ajson_mapping=>tty_rename_map.
+    FIELD-SYMBOLS <i> LIKE LINE OF lt_map.
+ 
+    APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
+    <i>-from = '/b/a'.
+    <i>-to   = 'x'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"a":1,"b":{"a":2},"c":{"a":3}}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_compound_mapper(
+          ii_mapper1 = zcl_abapgit_ajson_mapping=>create_rename(
+            it_rename_map = lt_map
+            iv_rename_by  = zcl_abapgit_ajson_mapping=>rename_by-full_path )
+          ii_mapper2 = zcl_abapgit_ajson_mapping=>create_upper_case( ) )
+        )->stringify( )
+      exp = '{"A":1,"B":{"X":2},"C":{"A":3}}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_snake.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"aB":1,"BbC":2,"cD":{"xY":3},"ZZ":4}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_to_snake_case( )
+        )->stringify( )
+      exp = '{"a_b":1,"bb_c":2,"c_d":{"x_y":3},"zz":4}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_camel.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"a_b":1,"bb_c":2,"c_d":{"x_y":3},"zz":4}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_to_camel_case( )
+        )->stringify( )
+      exp = '{"aB":1,"bbC":2,"cD":{"xY":3},"zz":4}' ).
+ 
+    " Forced underscore
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"a__b":1}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_to_camel_case( )
+        )->stringify( )
+      exp = '{"a_b":1}' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD to_camel_1st_upper.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_ajson=>create_from(
+        ii_source_json = zcl_abapgit_ajson=>parse( '{"aj_bc":1,"bb_c":2,"c_d":{"xq_yq":3},"zz":4}' )
+        ii_mapper      = zcl_abapgit_ajson_mapping=>create_to_camel_case( iv_first_json_upper = abap_true )
+        )->stringify( )
+      exp = '{"AjBc":1,"BbC":2,"CD":{"XqYq":3},"Zz":4}' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ltcl_fields DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      to_json_without_path FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_json_with_path FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_abap FOR TESTING RAISING zcx_abapgit_ajson_error,
+      to_json IMPORTING iv_path TYPE string RETURNING VALUE(rv_result) TYPE string RAISING zcx_abapgit_ajson_error.
+ 
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_fields IMPLEMENTATION.
+ 
+ 
+  METHOD to_abap.
+ 
+    DATA:
+      lo_ajson          TYPE REF TO zcl_abapgit_ajson,
+      li_mapping        TYPE REF TO zif_abapgit_ajson_mapping,
+      lt_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields,
+      ls_mapping_field  LIKE LINE OF lt_mapping_fields.
+    DATA:
+      BEGIN OF ls_result,
+        abap_field TYPE string,
+        field      TYPE string,
+      END OF ls_result.
+ 
+    CLEAR ls_mapping_field.
+    ls_mapping_field-abap  = 'ABAP_FIELD'.
+    ls_mapping_field-json = 'json.field'.
+    INSERT ls_mapping_field INTO TABLE lt_mapping_fields.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_field_mapping( lt_mapping_fields ).
+ 
+    lo_ajson =
+        zcl_abapgit_ajson=>parse( iv_json = '{"field":"value","json.field":"field_value"}'
+                                  ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->to_abap( IMPORTING ev_container = ls_result ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_result-abap_field
+      exp = 'field_value' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_result-field
+      exp = 'value' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_json_without_path.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = to_json( `/` )
+      exp = '{"field":"value","json.field":"field_value"}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_json_with_path.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = to_json( '/samplePath' )
+      exp = '{"samplePath":{"field":"value","json.field":"field_value"}}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_json.
+ 
+    DATA:
+      lo_ajson          TYPE REF TO zcl_abapgit_ajson,
+      li_mapping        TYPE REF TO zif_abapgit_ajson_mapping,
+      lt_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields,
+      ls_mapping_field  LIKE LINE OF lt_mapping_fields.
+    DATA:
+      BEGIN OF ls_result,
+        abap_field TYPE string,
+        field      TYPE string,
+      END OF ls_result.
+ 
+    CLEAR ls_mapping_field.
+    ls_mapping_field-abap  = 'ABAP_FIELD'.
+    ls_mapping_field-json = 'json.field'.
+    INSERT ls_mapping_field INTO TABLE lt_mapping_fields.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_field_mapping( lt_mapping_fields ).
+ 
+    ls_result-abap_field = 'field_value'.
+    ls_result-field      = 'value'.
+ 
+    lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->set( iv_path = iv_path
+                   iv_val = ls_result ).
+ 
+    rv_result = lo_ajson->stringify( ).
+ 
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ltcl_to_lower DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      to_json FOR TESTING RAISING zcx_abapgit_ajson_error.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_to_lower IMPLEMENTATION.
+ 
+ 
+  METHOD to_json.
+ 
+    DATA:
+      lo_ajson   TYPE REF TO zcl_abapgit_ajson,
+      li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA:
+      BEGIN OF ls_result,
+        field_data TYPE string,
+      END OF ls_result.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_lower_case( ).
+ 
+    ls_result-field_data = 'field_value'.
+ 
+    lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->set( iv_path = '/'
+                   iv_val = ls_result ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_ajson->stringify( )
+      exp = '{"field_data":"field_value"}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ltcl_to_upper DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      to_json FOR TESTING RAISING zcx_abapgit_ajson_error.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_to_upper IMPLEMENTATION.
+ 
+ 
+  METHOD to_json.
+ 
+    DATA:
+      lo_ajson   TYPE REF TO zcl_abapgit_ajson,
+      li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
+    DATA:
+      BEGIN OF ls_result,
+        field_data TYPE string,
+      END OF ls_result.
+ 
+    li_mapping = zcl_abapgit_ajson_mapping=>create_upper_case( ).
+ 
+    ls_result-field_data = 'field_value'.
+ 
+    lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
+ 
+    lo_ajson->set( iv_path = '/'
+                   iv_val = ls_result ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_ajson->stringify( )
+      exp = '{"FIELD_DATA":"field_value"}' ).
+ 
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson_utilities.clas.abap.html b/src/json/zcl_abapgit_ajson_utilities.clas.abap.html new file mode 100644 index 00000000000..a0707451f70 --- /dev/null +++ b/src/json/zcl_abapgit_ajson_utilities.clas.abap.html @@ -0,0 +1,1219 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson_utilities.clas.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson_utilities.clas.abap

+
+ +
+ 98.94% + Statements + 374/378 +
+ + +
+ 91.66% + Branches + 22/24 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 98.94% + Lines + 374/378 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +3791x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +37x +37x +37x +37x +37x +37x +37x +37x +35x +35x +35x +35x +35x +35x +35x +1x +1x +35x +37x +37x +37x +37x +37x +37x +37x +37x +1x +1x +37x +37x +37x +37x +37x +37x +37x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +1x +1x +1x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +53x +53x +53x +50x +50x +50x +50x +50x +50x +50x +50x +50x +50x +3x +3x +3x +3x +3x +3x +50x +50x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +53x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +22x +22x +22x +1x +1x +1x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +27x +51x +51x +51x +7x +7x +7x +7x +7x +7x +51x +5x +5x +5x +1x +1x +1x +1x +1x +5x +27x +27x +27x +27x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +25x +1x +2x +2x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_ajson_utilities DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS new
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson_utilities.
+    METHODS diff
+      IMPORTING
+        !iv_json_a            TYPE string OPTIONAL
+        !iv_json_b            TYPE string OPTIONAL
+        !io_json_a            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !io_json_b            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !iv_keep_empty_arrays TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        !eo_insert            TYPE REF TO zif_abapgit_ajson
+        !eo_delete            TYPE REF TO zif_abapgit_ajson
+        !eo_change            TYPE REF TO zif_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS merge
+      IMPORTING
+        !iv_json_a            TYPE string OPTIONAL
+        !iv_json_b            TYPE string OPTIONAL
+        !io_json_a            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !io_json_b            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !iv_keep_empty_arrays TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_json)        TYPE REF TO zif_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS sort
+      IMPORTING
+        !iv_json         TYPE string OPTIONAL
+        !io_json         TYPE REF TO zif_abapgit_ajson OPTIONAL
+      RETURNING
+        VALUE(rv_sorted) TYPE string
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS is_equal
+      IMPORTING
+        !iv_json_a            TYPE string OPTIONAL
+        !iv_json_b            TYPE string OPTIONAL
+        !ii_json_a            TYPE REF TO zif_abapgit_ajson OPTIONAL
+        !ii_json_b            TYPE REF TO zif_abapgit_ajson OPTIONAL
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool
+      RAISING
+        zcx_abapgit_ajson_error .
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mo_json_a TYPE REF TO zif_abapgit_ajson .
+    DATA mo_json_b TYPE REF TO zif_abapgit_ajson .
+    DATA mo_insert TYPE REF TO zif_abapgit_ajson .
+    DATA mo_delete TYPE REF TO zif_abapgit_ajson .
+    DATA mo_change TYPE REF TO zif_abapgit_ajson .
+ 
+    METHODS normalize_input
+      IMPORTING
+        !iv_json       TYPE string OPTIONAL
+        !io_json       TYPE REF TO zif_abapgit_ajson OPTIONAL
+      RETURNING
+        VALUE(ro_json) TYPE REF TO zif_abapgit_ajson
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS diff_a_b
+      IMPORTING
+        !iv_path TYPE string
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS diff_b_a
+      IMPORTING
+        !iv_path  TYPE string
+        !iv_array TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_ajson_error .
+    METHODS delete_empty_nodes
+      IMPORTING
+        !io_json              TYPE REF TO zif_abapgit_ajson
+        !iv_keep_empty_arrays TYPE abap_bool
+      RAISING
+        zcx_abapgit_ajson_error .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION.
+ 
+ 
+  METHOD delete_empty_nodes.
+ 
+    DATA ls_json_tree LIKE LINE OF io_json->mt_json_tree.
+    DATA lv_done TYPE abap_bool.
+ 
+    DO.
+      lv_done = abap_true.
+ 
+      IF iv_keep_empty_arrays = abap_false.
+        LOOP AT io_json->mt_json_tree INTO ls_json_tree
+          WHERE type = zif_abapgit_ajson_types=>node_type-array AND children = 0.
+ 
+          io_json->delete( ls_json_tree-path && ls_json_tree-name ).
+ 
+        ENDLOOP.
+        IF sy-subrc = 0.
+          lv_done = abap_false.
+        ENDIF.
+      ENDIF.
+ 
+      LOOP AT io_json->mt_json_tree INTO ls_json_tree
+        WHERE type = zif_abapgit_ajson_types=>node_type-object AND children = 0.
+ 
+        io_json->delete( ls_json_tree-path && ls_json_tree-name ).
+ 
+      ENDLOOP.
+      IF sy-subrc = 0.
+        lv_done = abap_false.
+      ENDIF.
+ 
+      IF lv_done = abap_true.
+        EXIT. " nothing else to delete
+      ENDIF.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD diff.
+ 
+    mo_json_a = normalize_input(
+      iv_json = iv_json_a
+      io_json = io_json_a ).
+ 
+    mo_json_b = normalize_input(
+      iv_json = iv_json_b
+      io_json = io_json_b ).
+ 
+    mo_insert = zcl_abapgit_ajson=>create_empty( ).
+    mo_delete = zcl_abapgit_ajson=>create_empty( ).
+    mo_change = zcl_abapgit_ajson=>create_empty( ).
+ 
+    diff_a_b( '/' ).
+    diff_b_a( '/' ).
+ 
+    eo_insert ?= mo_insert.
+    eo_delete ?= mo_delete.
+    eo_change ?= mo_change.
+ 
+    delete_empty_nodes(
+      io_json              = eo_insert
+      iv_keep_empty_arrays = iv_keep_empty_arrays ).
+    delete_empty_nodes(
+      io_json              = eo_delete
+      iv_keep_empty_arrays = iv_keep_empty_arrays ).
+    delete_empty_nodes(
+      io_json              = eo_change
+      iv_keep_empty_arrays = iv_keep_empty_arrays ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD diff_a_b.
+ 
+    DATA:
+      lv_path_a TYPE string,
+      lv_path_b TYPE string.
+ 
+    FIELD-SYMBOLS:
+      <node_a> LIKE LINE OF mo_json_a->mt_json_tree,
+      <node_b> LIKE LINE OF mo_json_a->mt_json_tree.
+ 
+    LOOP AT mo_json_a->mt_json_tree ASSIGNING <node_a> WHERE path = iv_path.
+      lv_path_a = <node_a>-path && <node_a>-name && '/'.
+ 
+      READ TABLE mo_json_b->mt_json_tree ASSIGNING <node_b>
+        WITH TABLE KEY path = <node_a>-path name = <node_a>-name.
+      IF sy-subrc = 0.
+        lv_path_b = <node_b>-path && <node_b>-name && '/'.
+ 
+        IF <node_a>-type = <node_b>-type.
+          CASE <node_a>-type.
+            WHEN zif_abapgit_ajson_types=>node_type-array.
+              mo_insert->touch_array( lv_path_a ).
+              mo_change->touch_array( lv_path_a ).
+              mo_delete->touch_array( lv_path_a ).
+              diff_a_b( lv_path_a ).
+            WHEN zif_abapgit_ajson_types=>node_type-object.
+              diff_a_b( lv_path_a ).
+            WHEN OTHERS.
+              IF <node_a>-value <> <node_b>-value.
+                " save as changed value
+                mo_change->set(
+                  iv_path      = lv_path_b
+                  iv_val       = <node_b>-value
+                  iv_node_type = <node_b>-type ).
+              ENDIF.
+          ENDCASE.
+        ELSE.
+          " save changed type as delete + insert
+          CASE <node_a>-type.
+            WHEN zif_abapgit_ajson_types=>node_type-array.
+              mo_delete->touch_array( lv_path_a ).
+              diff_a_b( lv_path_a ).
+            WHEN zif_abapgit_ajson_types=>node_type-object.
+              diff_a_b( lv_path_a ).
+            WHEN OTHERS.
+              mo_delete->set(
+                iv_path      = lv_path_a
+                iv_val       = <node_a>-value
+                iv_node_type = <node_a>-type ).
+          ENDCASE.
+          CASE <node_b>-type.
+            WHEN zif_abapgit_ajson_types=>node_type-array.
+              mo_insert->touch_array( lv_path_b ).
+              diff_b_a( lv_path_b ).
+            WHEN zif_abapgit_ajson_types=>node_type-object.
+              diff_b_a( lv_path_b ).
+            WHEN OTHERS.
+              mo_insert->set(
+                iv_path      = lv_path_b
+                iv_val       = <node_b>-value
+                iv_node_type = <node_b>-type ).
+          ENDCASE.
+        ENDIF.
+      ELSE.
+        " save as delete
+        CASE <node_a>-type.
+          WHEN zif_abapgit_ajson_types=>node_type-array.
+            mo_delete->touch_array( lv_path_a ).
+            diff_a_b( lv_path_a ).
+          WHEN zif_abapgit_ajson_types=>node_type-object.
+            diff_a_b( lv_path_a ).
+          WHEN OTHERS.
+            mo_delete->set(
+              iv_path      = lv_path_a
+              iv_val       = <node_a>-value
+              iv_node_type = <node_a>-type ).
+        ENDCASE.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD diff_b_a.
+ 
+    DATA lv_path TYPE string.
+ 
+    FIELD-SYMBOLS <node_b> LIKE LINE OF mo_json_b->mt_json_tree.
+ 
+    LOOP AT mo_json_b->mt_json_tree ASSIGNING <node_b> WHERE path = iv_path.
+      lv_path = <node_b>-path && <node_b>-name && '/'.
+ 
+      CASE <node_b>-type.
+        WHEN zif_abapgit_ajson_types=>node_type-array.
+          mo_insert->touch_array( lv_path ).
+          diff_b_a(
+            iv_path  = lv_path
+            iv_array = abap_true ).
+        WHEN zif_abapgit_ajson_types=>node_type-object.
+          diff_b_a( lv_path ).
+        WHEN OTHERS.
+          IF iv_array = abap_false.
+            READ TABLE mo_json_a->mt_json_tree TRANSPORTING NO FIELDS
+              WITH TABLE KEY path = <node_b>-path name = <node_b>-name.
+            IF sy-subrc <> 0.
+              " save as insert
+              mo_insert->set(
+                iv_path      = lv_path
+                iv_val       = <node_b>-value
+                iv_node_type = <node_b>-type ).
+            ENDIF.
+          ELSE.
+            READ TABLE mo_insert->mt_json_tree TRANSPORTING NO FIELDS
+              WITH KEY path = <node_b>-path value = <node_b>-value.
+            IF sy-subrc <> 0.
+              " save as new array value
+              mo_insert->push(
+                iv_path = iv_path
+                iv_val  = <node_b>-value ).
+            ENDIF.
+          ENDIF.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_equal.
+ 
+    DATA li_ins TYPE REF TO zif_abapgit_ajson.
+    DATA li_del TYPE REF TO zif_abapgit_ajson.
+    DATA li_mod TYPE REF TO zif_abapgit_ajson.
+ 
+    diff(
+      EXPORTING
+        iv_json_a = iv_json_a
+        iv_json_b = iv_json_b
+        io_json_a = ii_json_a
+        io_json_b = ii_json_b
+      IMPORTING
+        eo_insert = li_ins
+        eo_delete = li_del
+        eo_change = li_mod ).
+ 
+    rv_yes = boolc(
+      li_ins->is_empty( ) = abap_true AND
+      li_del->is_empty( ) = abap_true AND
+      li_mod->is_empty( ) = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD merge.
+ 
+    mo_json_a = normalize_input(
+      iv_json = iv_json_a
+      io_json = io_json_a ).
+ 
+    mo_json_b = normalize_input(
+      iv_json = iv_json_b
+      io_json = io_json_b ).
+ 
+    " Start with first JSON...
+    mo_insert = mo_json_a.
+ 
+    " ...and add all nodes from second JSON
+    diff_b_a( '/' ).
+ 
+    ro_json ?= mo_insert.
+ 
+    delete_empty_nodes(
+      io_json              = ro_json
+      iv_keep_empty_arrays = iv_keep_empty_arrays ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance.
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_input.
+ 
+    IF boolc( iv_json IS INITIAL ) = boolc( io_json IS INITIAL ).
+      zcx_abapgit_ajson_error=>raise( 'Either supply JSON string or instance, but not both' ).
+    ENDIF.
+ 
+    IF iv_json IS NOT INITIAL.
+      ro_json = zcl_abapgit_ajson=>parse( iv_json ).
+    ELSEIF io_json IS NOT INITIAL.
+      ro_json = io_json.
+    ELSE.
+      zcx_abapgit_ajson_error=>raise( 'Supply either JSON string or instance' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sort.
+ 
+    DATA lo_json TYPE REF TO zif_abapgit_ajson.
+ 
+    lo_json = normalize_input(
+      iv_json = iv_json
+      io_json = io_json ).
+ 
+    " Nodes are parsed into a sorted table, so no explicit sorting required
+    rv_sorted = lo_json->stringify( 2 ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcl_abapgit_ajson_utilities.clas.testclasses.abap.html b/src/json/zcl_abapgit_ajson_utilities.clas.testclasses.abap.html new file mode 100644 index 00000000000..aaa817c726e --- /dev/null +++ b/src/json/zcl_abapgit_ajson_utilities.clas.testclasses.abap.html @@ -0,0 +1,1714 @@ + + + + + + Code coverage report for src/json/zcl_abapgit_ajson_utilities.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/json zcl_abapgit_ajson_utilities.clas.testclasses.abap

+
+ +
+ 100% + Statements + 543/543 +
+ + +
+ 100% + Branches + 7/7 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 543/543 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +5441x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +36x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
**********************************************************************
+* UTIL
+**********************************************************************
+ 
+CLASS lcl_nodes_helper DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    DATA mt_nodes TYPE zif_abapgit_ajson_types=>ty_nodes_tt READ-ONLY.
+ 
+    METHODS add
+      IMPORTING
+        iv_str TYPE string.
+    METHODS sorted
+      RETURNING
+        VALUE(rt_nodes) TYPE zif_abapgit_ajson_types=>ty_nodes_ts.
+ 
+ENDCLASS.
+ 
+CLASS lcl_nodes_helper IMPLEMENTATION.
+  METHOD add.
+ 
+    FIELD-SYMBOLS <n> LIKE LINE OF mt_nodes.
+    DATA lv_children TYPE string.
+    DATA lv_index TYPE string.
+ 
+    APPEND INITIAL LINE TO mt_nodes ASSIGNING <n>.
+ 
+    SPLIT iv_str AT '|' INTO
+      <n>-path
+      <n>-name
+      <n>-type
+      <n>-value
+      lv_index
+      lv_children.
+    CONDENSE <n>-path.
+    CONDENSE <n>-name.
+    CONDENSE <n>-type.
+    CONDENSE <n>-value.
+    <n>-index = lv_index.
+    <n>-children = lv_children.
+ 
+  ENDMETHOD.
+ 
+  METHOD sorted.
+    rt_nodes = mt_nodes.
+  ENDMETHOD.
+ENDCLASS.
+ 
+**********************************************************************
+* PARSER
+**********************************************************************
+ 
+CLASS ltcl_parser_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS sample_json
+      IMPORTING
+        iv_separator   TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_json) TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_parser_test IMPLEMENTATION.
+ 
+  METHOD sample_json.
+ 
+    rv_json =
+      '{\n' &&
+      '  "string": "abc",\n' &&
+      '  "number": 123,\n' &&
+      '  "float": 123.45,\n' &&
+      '  "boolean": true,\n' &&
+      '  "false": false,\n' &&
+      '  "null": null,\n' &&
+      '  "date": "2020-03-15",\n' &&
+      '  "issues": [\n' &&
+      '    {\n' &&
+      '      "message": "Indentation problem ...",\n' &&
+      '      "key": "indentation",\n' &&
+      '      "start": {\n' &&
+      '        "row": 4,\n' &&
+      '        "col": 3\n' &&
+      '      },\n' &&
+      '      "end": {\n' &&
+      '        "row": 4,\n' &&
+      '        "col": 26\n' &&
+      '      },\n' &&
+      '      "filename": "./zxxx.prog.abap"\n' &&
+      '    },\n' &&
+      '    {\n' &&
+      '      "message": "Remove space before XXX",\n' &&
+      '      "key": "space_before_dot",\n' &&
+      '      "start": {\n' &&
+      '        "row": 3,\n' &&
+      '        "col": 21\n' &&
+      '      },\n' &&
+      '      "end": {\n' &&
+      '        "row": 3,\n' &&
+      '        "col": 22\n' &&
+      '      },\n' &&
+      '      "filename": "./zxxx.prog.abap"\n' &&
+      '    }\n' &&
+      '  ]\n' &&
+      '}'.
+ 
+    REPLACE ALL OCCURRENCES OF '\n' IN rv_json WITH iv_separator.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* JSON UTILITIES
+**********************************************************************
+ 
+CLASS ltcl_json_utils DEFINITION
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT
+  FINAL.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS json_diff FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS json_diff_types FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS json_diff_arrays FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS json_merge FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS json_sort FOR TESTING RAISING zcx_abapgit_ajson_error.
+    METHODS is_equal FOR TESTING RAISING zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_json_utils IMPLEMENTATION.
+ 
+  METHOD json_diff.
+ 
+    DATA:
+      lv_json       TYPE string,
+      lo_util       TYPE REF TO zcl_abapgit_ajson_utilities,
+      lo_insert     TYPE REF TO zif_abapgit_ajson,
+      lo_delete     TYPE REF TO zif_abapgit_ajson,
+      lo_change     TYPE REF TO zif_abapgit_ajson,
+      lo_insert_exp TYPE REF TO lcl_nodes_helper,
+      lo_delete_exp TYPE REF TO lcl_nodes_helper,
+      lo_change_exp TYPE REF TO lcl_nodes_helper.
+ 
+    lv_json =
+      '{\n' &&
+      '  "string": "abc",\n' && " no changes
+      '  "number": 789,\n' &&   " changed value
+      '  "float": 123.45,\n' &&
+      '  "boolean": "true",\n' && " changed type
+      '  "true": true,\n' &&    " insert
+*      '  "false": false,\n' &&    " delete
+      '  "null": null,\n' &&
+      '  "date": "2020-03-15",\n' &&
+      '  "issues": [\n' &&
+      '    {\n' &&
+      '      "message": "Indentation problem ...",\n' &&
+      '      "key": "indentation",\n' &&
+      '      "start": {\n' &&
+      '        "row": 5,\n' &&  " array change
+      '        "col": 3\n' &&
+      '      },\n' &&
+      '      "end": {\n' &&
+      '        "new": 1,\n' &&  " array insert
+*      '        "row": 4,\n' && " array delete
+      '        "col": 26\n' &&
+      '      },\n' &&
+      '      "filename": "./zxxx.prog.abap"\n' &&
+      '    },\n' &&
+      '    {\n' &&
+      '      "message": "Remove space before XXX",\n' &&
+      '      "key": "space_before_dot",\n' &&
+      '      "start": {\n' &&
+      '        "row": 3,\n' &&
+      '        "col": 21\n' &&
+      '      },\n' &&
+      '      "end": {\n' &&
+      '        "row": 3,\n' &&
+      '        "col": 22\n' &&
+      '      },\n' &&
+      '      "filename": "./zxxx.prog.abap"\n' &&
+      '    }\n' &&
+      '  ]\n' &&
+      '}'.
+ 
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_json WITH cl_abap_char_utilities=>newline.
+ 
+    CREATE OBJECT lo_insert_exp.
+    lo_insert_exp->add( '                |        |object |        |0|3' ).
+    lo_insert_exp->add( '/               |boolean |str    |true    |0|0' ). " changed type (insert new)
+    lo_insert_exp->add( '/               |issues  |array  |        |0|1' ).
+    lo_insert_exp->add( '/               |true    |bool   |true    |0|0' ). " insert
+    lo_insert_exp->add( '/issues/        |1       |object |        |1|1' ).
+    lo_insert_exp->add( '/issues/1/      |end     |object |        |0|1' ).
+    lo_insert_exp->add( '/issues/1/end/  |new     |num    |1       |0|0' ). " array insert
+ 
+    CREATE OBJECT lo_delete_exp.
+    lo_delete_exp->add( '                |        |object |        |0|3' ).
+    lo_delete_exp->add( '/               |boolean |bool   |true    |0|0' ). " changed type (delete old)
+    lo_delete_exp->add( '/               |false   |bool   |false   |0|0' ). " delete
+    lo_delete_exp->add( '/               |issues  |array  |        |0|1' ).
+    lo_delete_exp->add( '/issues/        |1       |object |        |1|1' ).
+    lo_delete_exp->add( '/issues/1/      |end     |object |        |0|1' ).
+    lo_delete_exp->add( '/issues/1/end/  |row     |num    |4       |0|0' ). " array delete
+ 
+    CREATE OBJECT lo_change_exp.
+    lo_change_exp->add( '                |        |object |        |0|2' ).
+    lo_change_exp->add( '/               |issues  |array  |        |0|1' ).
+    lo_change_exp->add( '/               |number  |num    |789     |0|0' ). " changed value
+    lo_change_exp->add( '/issues/        |1       |object |        |1|1' ).
+    lo_change_exp->add( '/issues/1/      |start   |object |        |0|1' ).
+    lo_change_exp->add( '/issues/1/start/|row     |num    |5       |0|0' ). " array change
+ 
+    CREATE OBJECT lo_util.
+ 
+    lo_util->diff(
+      EXPORTING
+        iv_json_a = ltcl_parser_test=>sample_json( )
+        iv_json_b = lv_json
+      IMPORTING
+        eo_insert = lo_insert
+        eo_delete = lo_delete
+        eo_change = lo_change ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_insert->mt_json_tree
+      exp = lo_insert_exp->mt_nodes ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_delete->mt_json_tree
+      exp = lo_delete_exp->mt_nodes ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_change->mt_json_tree
+      exp = lo_change_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD json_diff_types.
+ 
+    DATA:
+      lv_json_a     TYPE string,
+      lv_json_b     TYPE string,
+      lo_util       TYPE REF TO zcl_abapgit_ajson_utilities,
+      lo_insert     TYPE REF TO zif_abapgit_ajson,
+      lo_delete     TYPE REF TO zif_abapgit_ajson,
+      lo_change     TYPE REF TO zif_abapgit_ajson,
+      lo_insert_exp TYPE REF TO lcl_nodes_helper,
+      lo_delete_exp TYPE REF TO lcl_nodes_helper.
+ 
+    " Change single value to array
+    lv_json_a =
+      '{\n' &&
+      '  "string": "abc",\n' &&
+      '  "number": 123\n' &&
+      '}'.
+ 
+    lv_json_b =
+      '{\n' &&
+      '  "string": [\n' &&
+      '    "a",\n' &&
+      '    "b",\n' &&
+      '    "c"\n' &&
+      '  ],\n' &&
+      '  "number": 123\n' &&
+      '}'.
+ 
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_json_a WITH cl_abap_char_utilities=>newline.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_json_b WITH cl_abap_char_utilities=>newline.
+ 
+    CREATE OBJECT lo_insert_exp.
+    lo_insert_exp->add( '                |        |object |        |0|1' ).
+    lo_insert_exp->add( '/               |string  |array  |        |0|3' ).
+    lo_insert_exp->add( '/string/        |1       |str    |a       |1|0' ).
+    lo_insert_exp->add( '/string/        |2       |str    |b       |2|0' ).
+    lo_insert_exp->add( '/string/        |3       |str    |c       |3|0' ).
+ 
+    CREATE OBJECT lo_delete_exp.
+    lo_delete_exp->add( '                |        |object |        |0|1' ).
+    lo_delete_exp->add( '/               |string  |str    |abc     |0|0' ).
+ 
+    CREATE OBJECT lo_util.
+ 
+    lo_util->diff(
+      EXPORTING
+        iv_json_a = lv_json_a
+        iv_json_b = lv_json_b
+      IMPORTING
+        eo_insert = lo_insert
+        eo_delete = lo_delete
+        eo_change = lo_change ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_insert->mt_json_tree
+      exp = lo_insert_exp->mt_nodes ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_delete->mt_json_tree
+      exp = lo_delete_exp->mt_nodes ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_change->mt_json_tree )
+      exp = 0 ).
+ 
+    " Change array to single value
+    lo_util->diff(
+      EXPORTING
+        iv_json_a = lv_json_b
+        iv_json_b = lv_json_a
+      IMPORTING
+        eo_insert = lo_insert
+        eo_delete = lo_delete
+        eo_change = lo_change ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_insert->mt_json_tree
+      exp = lo_delete_exp->mt_nodes ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_delete->mt_json_tree
+      exp = lo_insert_exp->mt_nodes ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_change->mt_json_tree )
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD json_diff_arrays.
+ 
+    DATA:
+      lv_json_a     TYPE string,
+      lv_json_b     TYPE string,
+      lo_util       TYPE REF TO zcl_abapgit_ajson_utilities,
+      lo_insert     TYPE REF TO zif_abapgit_ajson,
+      lo_delete     TYPE REF TO zif_abapgit_ajson,
+      lo_change     TYPE REF TO zif_abapgit_ajson,
+      lo_insert_exp TYPE REF TO lcl_nodes_helper.
+ 
+    " Add empty array
+    lv_json_a =
+      '{\n' &&
+      '  "number": 123\n' &&
+      '}'.
+ 
+    lv_json_b =
+      '{\n' &&
+      '  "names": [],\n' &&
+      '  "number": 123\n' &&
+      '}'.
+ 
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_json_a WITH cl_abap_char_utilities=>newline.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_json_b WITH cl_abap_char_utilities=>newline.
+ 
+    CREATE OBJECT lo_util.
+ 
+    " Empty arrays are ignored by default
+    lo_util->diff(
+      EXPORTING
+        iv_json_a = lv_json_a
+        iv_json_b = lv_json_b
+      IMPORTING
+        eo_insert = lo_insert
+        eo_delete = lo_delete
+        eo_change = lo_change ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_insert->mt_json_tree )
+      exp = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_delete->mt_json_tree )
+      exp = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_change->mt_json_tree )
+      exp = 0 ).
+ 
+    " Keep empty arrays
+    lo_util->diff(
+      EXPORTING
+        iv_json_a = lv_json_a
+        iv_json_b = lv_json_b
+        iv_keep_empty_arrays = abap_true
+      IMPORTING
+        eo_insert = lo_insert
+        eo_delete = lo_delete
+        eo_change = lo_change ).
+ 
+    CREATE OBJECT lo_insert_exp.
+    lo_insert_exp->add( '                |        |object |        |0|1' ).
+    lo_insert_exp->add( '/               |names   |array  |        |0|0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_insert->mt_json_tree
+      exp = lo_insert_exp->mt_nodes ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_delete->mt_json_tree )
+      exp = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_change->mt_json_tree )
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD json_merge.
+ 
+    DATA:
+      lv_json_a    TYPE string,
+      lv_json_b    TYPE string,
+      lo_util      TYPE REF TO zcl_abapgit_ajson_utilities,
+      lo_merge     TYPE REF TO zif_abapgit_ajson,
+      lo_merge_exp TYPE REF TO lcl_nodes_helper.
+ 
+    " Merge new value of b into a
+    lv_json_a =
+      '{\n' &&
+      '  "string": [\n' &&
+      '    "a",\n' &&
+      '    "c"\n' &&
+      '  ],\n' &&
+      '  "number": 123\n' &&
+      '}'.
+ 
+    lv_json_b =
+      '{\n' &&
+      '  "string": [\n' &&
+      '    "a",\n' &&
+      '    "b"\n' && " new array value
+      '  ],\n' &&
+      '  "number": 456,\n' && " existing values are not overwritten
+      '  "float": 123.45\n' &&
+      '}'.
+ 
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_json_a WITH cl_abap_char_utilities=>newline.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_json_b WITH cl_abap_char_utilities=>newline.
+ 
+    CREATE OBJECT lo_merge_exp.
+    lo_merge_exp->add( '                |        |object |        |0|3' ).
+    lo_merge_exp->add( '/               |float   |num    |123.45  |0|0' ).
+    lo_merge_exp->add( '/               |number  |num    |123     |0|0' ).
+    lo_merge_exp->add( '/               |string  |array  |        |0|3' ).
+    lo_merge_exp->add( '/string/        |1       |str    |a       |1|0' ).
+    lo_merge_exp->add( '/string/        |2       |str    |c       |2|0' ).
+    lo_merge_exp->add( '/string/        |3       |str    |b       |3|0' ).
+ 
+    CREATE OBJECT lo_util.
+ 
+    lo_merge = lo_util->merge(
+      iv_json_a = lv_json_a
+      iv_json_b = lv_json_b ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_merge->mt_json_tree
+      exp = lo_merge_exp->mt_nodes ).
+ 
+  ENDMETHOD.
+ 
+  METHOD json_sort.
+ 
+    DATA:
+      lv_json       TYPE string,
+      lo_util       TYPE REF TO zcl_abapgit_ajson_utilities,
+      lv_sorted     TYPE string,
+      lv_sorted_exp TYPE string.
+ 
+    lv_json =
+      '{\n' &&
+      '  "string": "abc",\n' &&
+      '  "number": 789,\n' &&
+      '  "float": 123.45,\n' &&
+      '  "boolean": "true",\n' &&
+      '  "true": true,\n' &&
+      '  "false": false,\n' &&
+      '  "null": null,\n' &&
+      '  "date": "2020-03-15"\n' &&
+      '}'.
+ 
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_json WITH cl_abap_char_utilities=>newline.
+ 
+    lv_sorted_exp =
+      '{\n' &&
+      '  "boolean": "true",\n' &&
+      '  "date": "2020-03-15",\n' &&
+      '  "false": false,\n' &&
+      '  "float": 123.45,\n' &&
+      '  "null": null,\n' &&
+      '  "number": 789,\n' &&
+      '  "string": "abc",\n' &&
+      '  "true": true\n' &&
+      '}'.
+ 
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_sorted_exp WITH cl_abap_char_utilities=>newline.
+ 
+    CREATE OBJECT lo_util.
+ 
+    lv_sorted = lo_util->sort( iv_json = lv_json ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_sorted
+      exp = lv_sorted_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD is_equal.
+ 
+    cl_abap_unit_assert=>assert_true(
+      zcl_abapgit_ajson_utilities=>new( )->is_equal(
+        ii_json_a = zcl_abapgit_ajson=>parse( '{"a":1,"b":2}' )
+        ii_json_b = zcl_abapgit_ajson=>parse( '{"a":1,"b":2}' ) ) ).
+ 
+    cl_abap_unit_assert=>assert_true(
+      zcl_abapgit_ajson_utilities=>new( )->is_equal(
+        iv_json_a = '{"a":1,"b":2}'
+        iv_json_b = '{"a":1,"b":2}' ) ).
+ 
+    cl_abap_unit_assert=>assert_false(
+      zcl_abapgit_ajson_utilities=>new( )->is_equal(
+        iv_json_a = '{"a":1,"b":2}'
+        iv_json_b = '{"a":1,"b":3}' ) ).
+ 
+    cl_abap_unit_assert=>assert_false(
+      zcl_abapgit_ajson_utilities=>new( )->is_equal(
+        iv_json_a = '{"a":1,"b":2}'
+        iv_json_b = '{"a":1,"b":2,"c":3}' ) ).
+ 
+    cl_abap_unit_assert=>assert_false(
+      zcl_abapgit_ajson_utilities=>new( )->is_equal(
+        iv_json_a = '{"a":1,"b":2,"c":3}'
+        iv_json_b = '{"a":1,"b":2}' ) ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcx_abapgit_ajson_error.clas.abap.html b/src/json/zcx_abapgit_ajson_error.clas.abap.html new file mode 100644 index 00000000000..d3df13989dc --- /dev/null +++ b/src/json/zcx_abapgit_ajson_error.clas.abap.html @@ -0,0 +1,496 @@ + + + + + + Code coverage report for src/json/zcx_abapgit_ajson_error.clas.abap + + + + + + + + + +
+
+

All files / src/json zcx_abapgit_ajson_error.clas.abap

+
+ +
+ 97.81% + Statements + 134/137 +
+ + +
+ 85.71% + Branches + 6/7 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 97.81% + Lines + 134/137 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +1381x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +51x +51x +51x +51x +51x +51x +51x +51x +51x +17x +51x +3x +3x +3x +3x +3x +3x +51x +51x +20x +20x +31x +31x +51x +51x +51x +51x +51x +51x +51x +51x +51x +51x +1x + 
class zcx_abapgit_ajson_error definition
+  public
+  inheriting from CX_STATIC_CHECK
+  final
+  create public .
+ 
+public section.
+ 
+  interfaces IF_T100_MESSAGE .
+ 
+  types:
+    ty_rc type c length 4 .
+ 
+  constants:
+    begin of ZCX_AJSON_ERROR,
+      msgid type symsgid value '00',
+      msgno type symsgno value '001',
+      attr1 type scx_attrname value 'A1',
+      attr2 type scx_attrname value 'A2',
+      attr3 type scx_attrname value 'A3',
+      attr4 type scx_attrname value 'A4',
+    end of ZCX_AJSON_ERROR .
+  data RC type TY_RC read-only .
+  data MESSAGE type STRING read-only .
+  data LOCATION type STRING read-only .
+  data A1 type SYMSGV read-only .
+  data A2 type SYMSGV read-only .
+  data A3 type SYMSGV read-only .
+  data A4 type SYMSGV read-only .
+ 
+  methods CONSTRUCTOR
+    importing
+      !TEXTID like IF_T100_MESSAGE=>T100KEY optional
+      !PREVIOUS like PREVIOUS optional
+      !RC type TY_RC optional
+      !MESSAGE type STRING optional
+      !LOCATION type STRING optional
+      !A1 type SYMSGV optional
+      !A2 type SYMSGV optional
+      !A3 type SYMSGV optional
+      !A4 type SYMSGV optional .
+  class-methods RAISE
+    importing
+      !IV_MSG type STRING
+      !IV_LOCATION type STRING optional
+      !IS_NODE type ANY optional
+    raising
+      zcx_abapgit_ajson_error .
+  methods SET_LOCATION
+    importing
+      !IV_LOCATION type STRING optional
+      !IS_NODE type ANY optional
+    preferred parameter IV_LOCATION .
+protected section.
+private section.
+  types:
+    begin of ty_message_parts,
+      a1 like a1,
+      a2 like a1,
+      a3 like a1,
+      a4 like a1,
+    end of ty_message_parts.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcx_abapgit_ajson_error IMPLEMENTATION.
+ 
+ 
+method CONSTRUCTOR.
+CALL METHOD SUPER->CONSTRUCTOR
+EXPORTING
+PREVIOUS = PREVIOUS
+.
+me->RC = RC .
+me->MESSAGE = MESSAGE .
+me->LOCATION = LOCATION .
+me->A1 = A1 .
+me->A2 = A2 .
+me->A3 = A3 .
+me->A4 = A4 .
+clear me->textid.
+if textid is initial.
+  IF_T100_MESSAGE~T100KEY = ZCX_AJSON_ERROR .
+else.
+  IF_T100_MESSAGE~T100KEY = TEXTID.
+endif.
+endmethod.
+ 
+ 
+method raise.
+ 
+  data lx type ref to zcx_abapgit_ajson_error.
+ 
+  create object lx exporting message = iv_msg.
+  lx->set_location(
+    iv_location = iv_location
+    is_node     = is_node ).
+  raise exception lx.
+ 
+endmethod.
+ 
+ 
+method set_location.
+ 
+  data ls_msg type ty_message_parts.
+  data lv_location type string.
+  data lv_tmp type string.
+  field-symbols <path> type string.
+  field-symbols <name> type string.
+ 
+  if iv_location is not initial.
+    lv_location = iv_location.
+  elseif is_node is not initial.
+    assign component 'PATH' of structure is_node to <path>.
+    assign component 'NAME' of structure is_node to <name>.
+    if <path> is assigned and <name> is assigned.
+      lv_location = <path> && <name>.
+    endif.
+  endif.
+ 
+  if lv_location is not initial.
+    lv_tmp = message && | @{ lv_location }|.
+  else.
+    lv_tmp = message.
+  endif.
+ 
+  ls_msg = lv_tmp.
+ 
+  location = lv_location.
+  a1       = ls_msg-a1.
+  a2       = ls_msg-a2.
+  a3       = ls_msg-a3.
+  a4       = ls_msg-a4.
+ 
+endmethod.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/json/zcx_abapgit_ajson_error.clas.testclasses.abap.html b/src/json/zcx_abapgit_ajson_error.clas.testclasses.abap.html new file mode 100644 index 00000000000..26a980b0f02 --- /dev/null +++ b/src/json/zcx_abapgit_ajson_error.clas.testclasses.abap.html @@ -0,0 +1,424 @@ + + + + + + Code coverage report for src/json/zcx_abapgit_ajson_error.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/json zcx_abapgit_ajson_error.clas.testclasses.abap

+
+ +
+ 100% + Statements + 113/113 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 113/113 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +1141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
class ltcl_error definition
+  for testing
+  risk level harmless
+  duration short
+  final.
+ 
+  private section.
+ 
+    methods raise for testing.
+    methods raise_w_location for testing.
+    methods raise_w_node for testing.
+    methods set_location for testing.
+ 
+endclass.
+ 
+class ltcl_error implementation.
+ 
+  method raise.
+ 
+    data lx type ref to zcx_abapgit_ajson_error.
+    data lv_msg type string.
+ 
+    lv_msg = repeat( val = 'a'
+                     occ = 50 ) && repeat( val = 'b'
+                                           occ = 50 ) && '123'.
+ 
+    try.
+      zcx_abapgit_ajson_error=>raise( lv_msg ).
+      cl_abap_unit_assert=>fail( ).
+    catch zcx_abapgit_ajson_error into lx.
+      cl_abap_unit_assert=>assert_equals(
+        exp = lv_msg
+        act = lx->get_text( ) ).
+    endtry.
+ 
+  endmethod.
+ 
+  method raise_w_location.
+ 
+    data lx type ref to zcx_abapgit_ajson_error.
+ 
+    try.
+      zcx_abapgit_ajson_error=>raise( iv_msg = 'a'
+                                      iv_location = 'b' ).
+      cl_abap_unit_assert=>fail( ).
+    catch zcx_abapgit_ajson_error into lx.
+      cl_abap_unit_assert=>assert_equals(
+        exp = 'a @b'
+        act = lx->get_text( ) ).
+    endtry.
+ 
+  endmethod.
+ 
+  method raise_w_node.
+ 
+    data lx type ref to zcx_abapgit_ajson_error.
+    data ls_node type zif_abapgit_ajson_types=>ty_node.
+ 
+    ls_node-path = '/x/'.
+    ls_node-name = 'y'.
+ 
+    try.
+      zcx_abapgit_ajson_error=>raise( iv_msg = 'a'
+                                      is_node = ls_node ).
+      cl_abap_unit_assert=>fail( ).
+    catch zcx_abapgit_ajson_error into lx.
+      cl_abap_unit_assert=>assert_equals(
+        exp = 'a @/x/y'
+        act = lx->get_text( ) ).
+    endtry.
+ 
+  endmethod.
+ 
+  method set_location.
+ 
+    data lx type ref to zcx_abapgit_ajson_error.
+ 
+    try.
+      zcx_abapgit_ajson_error=>raise( iv_msg = 'a'
+                                      iv_location = 'b' ).
+      cl_abap_unit_assert=>fail( ).
+    catch zcx_abapgit_ajson_error into lx.
+      cl_abap_unit_assert=>assert_equals(
+        exp = lx->location
+        act = 'b' ).
+      lx->set_location( 'c' ).
+      cl_abap_unit_assert=>assert_equals(
+        exp = lx->location
+        act = 'c' ).
+      cl_abap_unit_assert=>assert_equals(
+        exp = 'a @c'
+        act = lx->get_text( ) ).
+    endtry.
+ 
+    try.
+      zcx_abapgit_ajson_error=>raise( iv_msg = 'a' ).
+      cl_abap_unit_assert=>fail( ).
+    catch zcx_abapgit_ajson_error into lx.
+      cl_abap_unit_assert=>assert_equals(
+        exp = lx->location
+        act = '' ).
+      lx->set_location( 'c' ).
+      cl_abap_unit_assert=>assert_equals(
+        exp = lx->location
+        act = 'c' ).
+      cl_abap_unit_assert=>assert_equals(
+        exp = 'a @c'
+        act = lx->get_text( ) ).
+    endtry.
+ 
+  endmethod.
+ 
+endclass.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/aff/index.html b/src/objects/aff/index.html new file mode 100644 index 00000000000..162a8161d6d --- /dev/null +++ b/src/objects/aff/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/objects/aff + + + + + + + + + +
+
+

All files src/objects/aff

+
+ +
+ 99.62% + Statements + 534/536 +
+ + +
+ 96.07% + Branches + 49/51 +
+ + +
+ 100% + Functions + 21/21 +
+ + +
+ 99.62% + Lines + 534/536 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_aff_registry.clas.abap +
+
100%92/92100%11/11100%1/1100%92/92
zcl_abapgit_aff_registry.clas.testclasses.abap +
+
100%90/90100%10/10100%10/10100%90/90
zcl_abapgit_json_handler.clas.abap +
+
99.29%282/28485.71%12/14100%8/899.29%282/284
zcl_abapgit_json_handler.clas.locals_imp.abap +
+
100%70/70100%16/16100%2/2100%70/70
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/aff/zcl_abapgit_aff_registry.clas.abap.html b/src/objects/aff/zcl_abapgit_aff_registry.clas.abap.html new file mode 100644 index 00000000000..d1f061960f2 --- /dev/null +++ b/src/objects/aff/zcl_abapgit_aff_registry.clas.abap.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for src/objects/aff/zcl_abapgit_aff_registry.clas.abap + + + + + + + + + +
+
+

All files / src/objects/aff zcl_abapgit_aff_registry.clas.abap

+
+ +
+ 100% + Statements + 92/92 +
+ + +
+ 100% + Branches + 11/11 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 92/92 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +931x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +67x +67x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +10x +1x +1x +1x +65x +65x +1x +1x + 
CLASS zcl_abapgit_aff_registry DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_aff_registry.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          io_settings TYPE REF TO zcl_abapgit_settings OPTIONAL.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_registry_entry,
+        obj_type     TYPE tadir-object,
+        experimental TYPE abap_bool,
+      END OF ty_registry_entry.
+ 
+    CLASS-DATA:
+      gt_registry TYPE HASHED TABLE OF ty_registry_entry WITH UNIQUE KEY obj_type.
+ 
+    DATA:
+      mo_settings TYPE REF TO zcl_abapgit_settings.
+    METHODS initialize_registry_table.
+ 
+    CLASS-METHODS:
+      register
+        IMPORTING
+          iv_obj_type     TYPE tadir-object
+          iv_experimental TYPE abap_bool DEFAULT abap_false.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_aff_registry IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    IF io_settings IS SUPPLIED.
+      mo_settings = io_settings.
+    ELSE.
+      mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD initialize_registry_table.
+    register( iv_obj_type = 'CHKC' ).
+    register( iv_obj_type = 'CHKO' ).
+    register( iv_obj_type = 'CHKV' ).
+    register( iv_obj_type = 'EVTB' ).
+    register( iv_obj_type = 'EEEC' ).
+    register( iv_obj_type = 'GSMP' ).
+    register( iv_obj_type     = 'INTF'
+              iv_experimental = abap_true ).
+    register( iv_obj_type = 'SMBC' ).
+    register( iv_obj_type = 'NONT' ).
+    register( iv_obj_type = 'RONT' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD register.
+    DATA ls_registry_entry TYPE ty_registry_entry.
+ 
+    ls_registry_entry-obj_type = iv_obj_type.
+    ls_registry_entry-experimental = iv_experimental.
+    INSERT ls_registry_entry INTO TABLE gt_registry.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_aff_registry~is_supported_object_type.
+ 
+    DATA ls_registry_entry TYPE ty_registry_entry.
+ 
+    IF gt_registry IS INITIAL.
+      initialize_registry_table( ).
+    ENDIF.
+ 
+    READ TABLE gt_registry WITH TABLE KEY obj_type = iv_obj_type INTO ls_registry_entry.
+    IF sy-subrc = 0 AND ls_registry_entry-experimental = abap_false.
+      rv_result = abap_true.
+    ELSEIF sy-subrc = 0 AND mo_settings->get_experimental_features( ) = abap_true.
+      rv_result = abap_true.
+    ELSE.
+      rv_result = abap_false.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/aff/zcl_abapgit_aff_registry.clas.testclasses.abap.html b/src/objects/aff/zcl_abapgit_aff_registry.clas.testclasses.abap.html new file mode 100644 index 00000000000..09afd5b1309 --- /dev/null +++ b/src/objects/aff/zcl_abapgit_aff_registry.clas.testclasses.abap.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for src/objects/aff/zcl_abapgit_aff_registry.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/aff zcl_abapgit_aff_registry.clas.testclasses.abap

+
+ +
+ 100% + Statements + 90/90 +
+ + +
+ 100% + Branches + 10/10 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 100% + Lines + 90/90 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +911x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
"! @testing zcl_abapgit_filename_logic
+CLASS ltcl_aff_registry DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      assert_that
+        IMPORTING
+          iv_obj_type     TYPE tadir-object
+          iv_is_supported TYPE abap_bool
+          iv_experimental TYPE abap_bool DEFAULT abap_false,
+      clas_not_supported FOR TESTING RAISING cx_static_check,
+      chkc FOR TESTING RAISING cx_static_check,
+      chko FOR TESTING RAISING cx_static_check,
+      chkv FOR TESTING RAISING cx_static_check,
+      evtb FOR TESTING RAISING cx_static_check,
+      gsmp FOR TESTING RAISING cx_static_check,
+      intf_not_supported FOR TESTING RAISING cx_static_check,
+      intf_experimental FOR TESTING RAISING cx_static_check,
+      smbc FOR TESTING RAISING cx_static_check.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_aff_registry IMPLEMENTATION.
+ 
+  METHOD assert_that.
+    DATA:
+      lo_cut           TYPE REF TO zif_abapgit_aff_registry,
+      lo_settings_stub TYPE REF TO zcl_abapgit_settings,
+      lv_act           TYPE abap_bool.
+ 
+ 
+    CREATE OBJECT lo_settings_stub.
+    lo_settings_stub->set_experimental_features( iv_experimental ).
+    CREATE OBJECT lo_cut TYPE zcl_abapgit_aff_registry
+      EXPORTING
+        io_settings = lo_settings_stub.
+    lv_act = lo_cut->is_supported_object_type( iv_obj_type ).
+    cl_abap_unit_assert=>assert_equals( exp = iv_is_supported
+                                        act = lv_act ).
+  ENDMETHOD.
+ 
+  METHOD clas_not_supported.
+    assert_that( iv_obj_type = 'CLAS'
+                 iv_is_supported = abap_false ).
+  ENDMETHOD.
+ 
+  METHOD chkc.
+    assert_that( iv_obj_type = 'CHKC'
+                 iv_is_supported = abap_true ).
+  ENDMETHOD.
+ 
+  METHOD chko.
+    assert_that( iv_obj_type = 'CHKO'
+                 iv_is_supported = abap_true ).
+  ENDMETHOD.
+ 
+  METHOD chkv.
+    assert_that( iv_obj_type = 'CHKV'
+                 iv_is_supported = abap_true ).
+  ENDMETHOD.
+ 
+  METHOD evtb.
+    assert_that( iv_obj_type = 'EVTB'
+                 iv_is_supported = abap_true ).
+  ENDMETHOD.
+ 
+  METHOD gsmp.
+    assert_that( iv_obj_type = 'GSMP'
+                 iv_is_supported = abap_true ).
+  ENDMETHOD.
+ 
+  METHOD intf_not_supported.
+    assert_that( iv_obj_type = 'INTF'
+                 iv_is_supported = abap_false ).
+  ENDMETHOD.
+ 
+  METHOD intf_experimental.
+    assert_that( iv_obj_type = 'INTF'
+                 iv_is_supported = abap_true
+                 iv_experimental = abap_true ).
+  ENDMETHOD.
+ 
+  METHOD smbc.
+    assert_that( iv_obj_type = 'SMBC'
+                 iv_is_supported = abap_true ).
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/aff/zcl_abapgit_json_handler.clas.abap.html b/src/objects/aff/zcl_abapgit_json_handler.clas.abap.html new file mode 100644 index 00000000000..fbdb32889ff --- /dev/null +++ b/src/objects/aff/zcl_abapgit_json_handler.clas.abap.html @@ -0,0 +1,937 @@ + + + + + + Code coverage report for src/objects/aff/zcl_abapgit_json_handler.clas.abap + + + + + + + + + +
+
+

All files / src/objects/aff zcl_abapgit_json_handler.clas.abap

+
+ +
+ 99.29% + Statements + 282/284 +
+ + +
+ 85.71% + Branches + 12/14 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 99.29% + Lines + 282/284 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +2851x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +1x +1x +  +1x +1x +1x +2x +2x +2x +2x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +  +1x +1x +1x +2x +2x +2x +2x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x + 
CLASS zcl_abapgit_json_handler DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_json_abap_mapping,
+        json TYPE string,
+        abap TYPE string,
+      END OF ty_json_abap_mapping .
+    TYPES:
+      ty_json_abap_mappings TYPE STANDARD TABLE OF ty_json_abap_mapping WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_enum_mapping,
+        path     TYPE string,
+        mappings TYPE ty_json_abap_mappings,
+      END OF ty_enum_mapping .
+    TYPES:
+      ty_enum_mappings TYPE TABLE OF ty_enum_mapping WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_path_value_pair,
+        path  TYPE string,
+        value TYPE string,
+      END OF ty_path_value_pair .
+    TYPES:
+      ty_skip_paths TYPE STANDARD TABLE OF ty_path_value_pair WITH KEY path .
+ 
+    "! Serializes data to xstring. Type of data is specified in the
+    "! implementing class.
+    "!
+    "! @parameter iv_data | data to be serialized
+    "! @parameter iv_enum_mappings | ABAP/JSON value mappings
+    "! @parameter iv_skip_paths | path/value pairs to be skipped during serialization
+    "! @parameter rv_result | serialized data
+    METHODS serialize
+      IMPORTING
+        !iv_data          TYPE data
+        !iv_enum_mappings TYPE ty_enum_mappings OPTIONAL
+        !iv_skip_paths    TYPE ty_skip_paths OPTIONAL
+      RETURNING
+        VALUE(rv_result)  TYPE xstring
+      RAISING
+        cx_static_check .
+    "! Deserializes xstring into data. The type of data is specified in
+    "! the implementing class
+    "!
+    "! @parameter iv_content | xstring to be deserialized
+    "! @parameter iv_defaults | path-value pairs that apply if value is initial
+    "! @parameter ev_data | data of the xstring
+    METHODS deserialize
+      IMPORTING
+        !iv_content       TYPE xstring
+        !iv_defaults      TYPE ty_skip_paths OPTIONAL
+        !iv_enum_mappings TYPE ty_enum_mappings OPTIONAL
+      EXPORTING
+        !ev_data          TYPE data
+      RAISING
+        cx_static_check .
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS:
+      map2json_original_language
+        CHANGING co_ajson TYPE REF TO zif_abapgit_ajson
+        RAISING  zcx_abapgit_ajson_error,
+      map2json_custom_enum
+        IMPORTING it_enum_mappings TYPE ty_enum_mappings
+        CHANGING  co_ajson         TYPE REF TO zif_abapgit_ajson
+        RAISING   zcx_abapgit_ajson_error,
+      map2json_abap_language_version
+        CHANGING co_ajson TYPE REF TO zif_abapgit_ajson
+        RAISING  zcx_abapgit_ajson_error,
+      "! Get the enum mapping from object handler, as other enums as well
+      map2abap_abap_language_version
+        CHANGING co_ajson TYPE REF TO zif_abapgit_ajson
+        RAISING  zcx_abapgit_ajson_error,
+      "! For deserialization
+      map2abap_original_language
+        CHANGING co_ajson TYPE REF TO zif_abapgit_ajson
+        RAISING  zcx_abapgit_ajson_error,
+      "! For deserialization
+      set_defaults
+        IMPORTING it_defaults TYPE ty_skip_paths
+        CHANGING  co_ajson    TYPE REF TO zif_abapgit_ajson
+        RAISING   zcx_abapgit_ajson_error,
+      map2abap_custom_enum
+        IMPORTING it_enum_mappings TYPE ty_enum_mappings
+        CHANGING  co_ajson         TYPE REF TO zif_abapgit_ajson
+        RAISING   zcx_abapgit_ajson_error.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_JSON_HANDLER IMPLEMENTATION.
+ 
+ 
+  METHOD deserialize.
+    DATA lv_json    TYPE string.
+    DATA lo_ajson   TYPE REF TO zif_abapgit_ajson.
+ 
+    CLEAR ev_data.
+ 
+    lv_json = zcl_abapgit_convert=>xstring_to_string_utf8( iv_content ).
+ 
+    lo_ajson = zcl_abapgit_ajson=>parse( iv_json = lv_json
+      )->map( zcl_abapgit_ajson_mapping=>create_to_snake_case( ) ).
+ 
+    map2abap_original_language( CHANGING co_ajson = lo_ajson ).
+    set_defaults( EXPORTING it_defaults = iv_defaults
+                  CHANGING  co_ajson    = lo_ajson ).
+    map2abap_abap_language_version( CHANGING co_ajson = lo_ajson ).
+    map2abap_custom_enum( EXPORTING it_enum_mappings = iv_enum_mappings
+                          CHANGING co_ajson          = lo_ajson  ).
+ 
+    lo_ajson->to_abap( IMPORTING ev_container = ev_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map2abap_abap_language_version.
+    DATA:
+      lv_enum_abap TYPE string,
+      lv_enum_json TYPE string.
+ 
+ 
+    lv_enum_json = co_ajson->get_string( '/header/abap_language_version' ).
+    IF lv_enum_json = 'standard'.
+      lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
+    ELSEIF lv_enum_json = 'cloudDevelopment'.
+      lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development.
+    ELSEIF lv_enum_json = 'keyUser'.
+      lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-key_user.
+    ENDIF.
+ 
+    co_ajson->set_string( iv_path = '/header/abap_language_version'
+                          iv_val  = lv_enum_abap ).
+  ENDMETHOD.
+ 
+ 
+  METHOD map2abap_custom_enum.
+    DATA:
+      lv_enum_json    TYPE string,
+      ls_enum_mapping TYPE ty_enum_mapping,
+      ls_mapping      TYPE ty_json_abap_mapping.
+ 
+ 
+    LOOP AT it_enum_mappings INTO ls_enum_mapping.
+      lv_enum_json = co_ajson->get_string( ls_enum_mapping-path ).
+      READ TABLE ls_enum_mapping-mappings WITH KEY json = lv_enum_json INTO ls_mapping.
+      IF sy-subrc = 0.
+        co_ajson->set_string( iv_path = ls_enum_mapping-path
+                              iv_val  = ls_mapping-abap ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD map2abap_original_language.
+    DATA:
+      lv_iso_language      TYPE laiso,
+      lv_original_language TYPE sy-langu.
+ 
+ 
+    lv_iso_language = co_ajson->get_string( '/header/original_language' ).
+ 
+    CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
+      EXPORTING
+        input  = lv_iso_language
+      IMPORTING
+        output = lv_original_language.
+ 
+    co_ajson->set_string( iv_path = '/header/original_language'
+                          iv_val  = lv_original_language ).
+  ENDMETHOD.
+ 
+ 
+  METHOD map2json_abap_language_version.
+    DATA:
+      lv_enum_abap TYPE string,
+      lv_enum_json TYPE string.
+ 
+ 
+    lv_enum_abap = co_ajson->get_string( '/header/abapLanguageVersion' ).
+    IF lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard
+      OR lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
+      lv_enum_json = 'standard'.
+    ELSEIF lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development.
+      lv_enum_json = 'cloudDevelopment'.
+    ELSEIF lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-key_user.
+      lv_enum_json = 'keyUser'.
+    ENDIF.
+ 
+    co_ajson->set_string( iv_path = '/header/abapLanguageVersion'
+                          iv_val  = lv_enum_json ).
+  ENDMETHOD.
+ 
+ 
+  METHOD map2json_custom_enum.
+    DATA:
+      lv_enum_abap    TYPE string,
+      ls_enum_mapping TYPE ty_enum_mapping,
+      ls_mapping      TYPE ty_json_abap_mapping.
+ 
+ 
+    LOOP AT it_enum_mappings INTO ls_enum_mapping.
+      lv_enum_abap = co_ajson->get_string( ls_enum_mapping-path ).
+      READ TABLE ls_enum_mapping-mappings WITH KEY abap = lv_enum_abap INTO ls_mapping.
+      IF sy-subrc = 0.
+        co_ajson->set_string( iv_path = ls_enum_mapping-path
+                              iv_val  = ls_mapping-json ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD map2json_original_language.
+    DATA:
+      lv_iso_language      TYPE laiso,
+      lv_original_language TYPE sy-langu.
+ 
+ 
+    lv_original_language = co_ajson->get_string( '/header/originalLanguage' ).
+ 
+    CALL FUNCTION 'CONVERSION_EXIT_ISOLA_OUTPUT'
+      EXPORTING
+        input  = lv_original_language
+      IMPORTING
+        output = lv_iso_language.
+ 
+    TRANSLATE lv_iso_language TO LOWER CASE.
+    co_ajson->set_string( iv_path = '/header/originalLanguage'
+                          iv_val  = lv_iso_language ).
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+    DATA: lt_st_source TYPE abap_trans_srcbind_tab,
+          lv_json      TYPE string,
+          lo_ajson     TYPE REF TO zif_abapgit_ajson,
+          lo_filter    TYPE REF TO lcl_aff_filter.
+ 
+    FIELD-SYMBOLS: <lg_source> LIKE LINE OF lt_st_source.
+ 
+    APPEND INITIAL LINE TO lt_st_source ASSIGNING <lg_source>.
+    GET REFERENCE OF iv_data INTO <lg_source>-value.
+ 
+    lo_ajson = zcl_abapgit_ajson=>new( iv_keep_item_order = abap_true
+      )->set( iv_path = '/'
+              iv_val  = iv_data
+      )->map( zcl_abapgit_ajson_mapping=>create_to_camel_case( ) ).
+ 
+    map2json_original_language( CHANGING co_ajson = lo_ajson ).
+    map2json_abap_language_version( CHANGING co_ajson = lo_ajson ).
+    map2json_custom_enum( EXPORTING it_enum_mappings = iv_enum_mappings
+                          CHANGING co_ajson          = lo_ajson ).
+ 
+    CREATE OBJECT lo_filter EXPORTING iv_skip_paths = iv_skip_paths.
+ 
+    " files end with an empty line (EOF)
+    lv_json = lo_ajson->clone( )->filter( lo_filter )->stringify( 2 ) && cl_abap_char_utilities=>newline.
+ 
+    rv_result = zcl_abapgit_convert=>string_to_xstring_utf8( lv_json ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_defaults.
+    DATA:
+      lv_enum_json TYPE string,
+      ls_default   TYPE ty_path_value_pair.
+ 
+ 
+    LOOP AT it_defaults INTO ls_default.
+      lv_enum_json = co_ajson->get_string( ls_default-path ).
+      IF lv_enum_json = ``.
+        co_ajson->set_string( iv_path = ls_default-path
+                              iv_val  = ls_default-value ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/aff/zcl_abapgit_json_handler.clas.locals_imp.abap.html b/src/objects/aff/zcl_abapgit_json_handler.clas.locals_imp.abap.html new file mode 100644 index 00000000000..95910fdb0bb --- /dev/null +++ b/src/objects/aff/zcl_abapgit_json_handler.clas.locals_imp.abap.html @@ -0,0 +1,295 @@ + + + + + + Code coverage report for src/objects/aff/zcl_abapgit_json_handler.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/objects/aff zcl_abapgit_json_handler.clas.locals_imp.abap

+
+ +
+ 100% + Statements + 70/70 +
+ + +
+ 100% + Branches + 16/16 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 70/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +711x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +30x +30x +30x +2x +2x +2x +30x +28x +1x +1x +1x +1x +27x +27x +27x +1x +1x +10x +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_aff_filter DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_ajson_filter.
+    TYPES:
+      BEGIN OF ty_path_value_pair,
+        path  TYPE string,
+        value TYPE string,
+      END OF ty_path_value_pair,
+      ty_skip_paths TYPE STANDARD TABLE OF ty_path_value_pair WITH KEY path.
+ 
+    METHODS constructor
+      IMPORTING iv_skip_paths TYPE ty_skip_paths OPTIONAL
+      RAISING   zcx_abapgit_ajson_error.
+  PRIVATE SECTION.
+    DATA mt_skip_paths TYPE ty_skip_paths.
+ENDCLASS.
+ 
+CLASS lcl_aff_filter IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_ajson_filter~keep_node.
+ 
+    DATA lv_path TYPE string.
+ 
+    lv_path = is_node-path && is_node-name.
+ 
+    READ TABLE mt_skip_paths WITH KEY path = lv_path value = is_node-value TRANSPORTING NO FIELDS.
+    IF boolc( sy-subrc = 0 ) = abap_true
+      AND iv_visit = zif_abapgit_ajson_filter=>visit_type-value.
+      rv_keep = abap_false.
+      RETURN.
+    ELSE.
+      READ TABLE mt_skip_paths WITH KEY path = lv_path TRANSPORTING NO FIELDS.
+      IF boolc( sy-subrc = 0 ) = abap_true
+        AND iv_visit = zif_abapgit_ajson_filter=>visit_type-value.
+        rv_keep = abap_true.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    IF is_node-type = 'bool' AND is_node-value = 'false' AND iv_visit = zif_abapgit_ajson_filter=>visit_type-value.
+      rv_keep = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    " AFF: if INTEGER type is initial (0) then is will be skipped
+    "      However, if type is $required, it should be serialized.
+    IF NOT ( ( iv_visit = zif_abapgit_ajson_filter=>visit_type-value AND is_node-value IS NOT INITIAL ) OR
+         ( iv_visit <> zif_abapgit_ajson_filter=>visit_type-value AND is_node-children > 0 ) ).
+      rv_keep = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    rv_keep = abap_true.
+ 
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    " extract annotations and build table for values to be skipped ( path/name | value )
+    DATA lo_abap_language_pair TYPE ty_path_value_pair.
+    lo_abap_language_pair-path = `/header/abapLanguageVersion`.
+    lo_abap_language_pair-value = 'standard'.
+ 
+    APPEND lo_abap_language_pair TO mt_skip_paths.
+ 
+    IF iv_skip_paths IS NOT INITIAL.
+      APPEND LINES OF iv_skip_paths TO mt_skip_paths.
+    ENDIF.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/index.html b/src/objects/core/index.html new file mode 100644 index 00000000000..c6f7e76b9ce --- /dev/null +++ b/src/objects/core/index.html @@ -0,0 +1,326 @@ + + + + + + Code coverage report for src/objects/core + + + + + + + + + +
+
+

All files src/objects/core

+
+ +
+ 82.09% + Statements + 4256/5184 +
+ + +
+ 83.56% + Branches + 122/146 +
+ + +
+ 67.16% + Functions + 90/134 +
+ + +
+ 82.09% + Lines + 4256/5184 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_dependencies.clas.abap +
+
100%378/378100%0/0100%0/0100%378/378
zcl_abapgit_dependencies.clas.testclasses.abap +
+
96.19%202/210100%6/655.55%5/996.19%202/210
zcl_abapgit_file_deserialize.clas.abap +
+
80.59%216/26833.33%2/6100%0/080.59%216/268
zcl_abapgit_file_deserialize.clas.testclasses.abap +
+
100%460/460100%33/33100%33/33100%460/460
zcl_abapgit_filename_logic.clas.abap +
+
100%299/299100%9/9100%0/0100%299/299
zcl_abapgit_filename_logic.clas.testclasses.abap +
+
99.5%398/400100%7/787.5%7/899.5%398/400
zcl_abapgit_folder_logic.clas.abap +
+
88.21%217/24660.86%14/23100%1/188.21%217/246
zcl_abapgit_folder_logic.clas.testclasses.abap +
+
95.29%587/61696.55%28/2965%26/4095.29%587/616
zcl_abapgit_item_graph.clas.abap +
+
100%106/106100%3/3100%2/2100%106/106
zcl_abapgit_item_graph.clas.testclasses.abap +
+
100%60/60100%1/1100%1/1100%60/60
zcl_abapgit_objects_files.clas.abap +
+
85.26%411/48260%6/1055.55%5/985.26%411/482
zcl_abapgit_objects_files.clas.testclasses.abap +
+
100%223/223100%7/7100%7/7100%223/223
zcl_abapgit_serialize.clas.abap +
+
47%330/70233.33%3/90%0/1047%330/702
zcl_abapgit_serialize.clas.testclasses.abap +
+
34.19%106/310100%3/333.33%3/934.19%106/310
zcl_abapgit_tadir.clas.abap +
+
62.02%263/424100%0/00%0/562.02%263/424
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_dependencies.clas.abap.html b/src/objects/core/zcl_abapgit_dependencies.clas.abap.html new file mode 100644 index 00000000000..4516622c175 --- /dev/null +++ b/src/objects/core/zcl_abapgit_dependencies.clas.abap.html @@ -0,0 +1,1219 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_dependencies.clas.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_dependencies.clas.abap

+
+ +
+ 100% + Statements + 378/378 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 378/378 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +3791x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_dependencies DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS resolve
+      CHANGING
+        !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_dependency,
+        depname  TYPE dd02l-tabname,
+        deptyp   TYPE c LENGTH 4,
+        deplocal TYPE dd02l-as4local,
+        refname  TYPE dd02l-tabname,
+        reftyp   TYPE c LENGTH 4,
+        kind     TYPE c LENGTH 1,
+      END OF ty_dependency .
+    TYPES:
+      ty_dedenpencies TYPE STANDARD TABLE OF ty_dependency
+                                 WITH NON-UNIQUE DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_item,
+        obj_type TYPE tadir-object,
+        obj_name TYPE tadir-obj_name,
+        devclass TYPE devclass,
+      END OF ty_item .
+ 
+    CLASS-METHODS resolve_ddic
+      CHANGING
+        !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_ddls_dependencies
+      IMPORTING
+        iv_ddls_name         TYPE tadir-obj_name
+      RETURNING
+        VALUE(rt_dependency) TYPE ty_dedenpencies.
+    CLASS-METHODS resolve_packages
+      CHANGING
+        ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_dependencies IMPLEMENTATION.
+ 
+ 
+  METHOD get_ddls_dependencies.
+ 
+    DATA: lt_ddls_name TYPE TABLE OF ddsymtab,
+          ls_ddls_name TYPE ddsymtab.
+ 
+    ls_ddls_name-name = iv_ddls_name.
+    INSERT ls_ddls_name INTO TABLE lt_ddls_name.
+ 
+    PERFORM ('DDLS_GET_DEP') IN PROGRAM ('RADMASDL')
+                             TABLES lt_ddls_name rt_dependency.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve.
+ 
+    DATA: lv_tabclass TYPE dd02l-tabclass.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir.
+ 
+    " misuse field KORRNUM to fix deletion sequence
+    " higher value means later deletion
+ 
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+      CASE <ls_tadir>-object.
+        WHEN 'DEVC'.
+          " Packages last
+          <ls_tadir>-korrnum = '999000'.
+        WHEN 'DOMA'.
+          <ls_tadir>-korrnum = '900000'.
+        WHEN 'SPRX'.
+          <ls_tadir>-korrnum = '850000'.
+        WHEN 'WEBI'.
+          <ls_tadir>-korrnum = '840000'.
+        WHEN 'PARA'.
+          " PARA after DTEL
+          <ls_tadir>-korrnum = '810000'.
+        WHEN 'DTEL'.
+          <ls_tadir>-korrnum = '800000'.
+        WHEN 'SHLP'.
+          " SHLP after TABL
+          <ls_tadir>-korrnum = '760000'.
+        WHEN 'TTYP' OR 'TABL' OR 'VIEW'.
+          SELECT SINGLE tabclass FROM dd02l
+            INTO lv_tabclass
+            WHERE tabname = <ls_tadir>-obj_name
+            AND as4local = 'A'
+            AND as4vers = '0000'.
+          IF sy-subrc = 0 AND lv_tabclass = 'APPEND'.
+            " delete append structures before database tables
+            <ls_tadir>-korrnum = '730000'.
+          ELSE.
+            <ls_tadir>-korrnum = '750000'.
+          ENDIF.
+        WHEN 'ENQU'.
+          " ENQU before TABL
+          <ls_tadir>-korrnum = '725000'.
+        WHEN 'DDLS'.
+          " DDLS after DCLS but before other DDIC
+          <ls_tadir>-korrnum = '720000'.
+        WHEN 'DDLX'.
+          " DDLX before DDLS
+          <ls_tadir>-korrnum = '719000'.
+        WHEN 'AUTH'.
+          " AUTH after DCLS
+          <ls_tadir>-korrnum = '715000'.
+        WHEN 'SUSH'.
+          " SUSH after SUSC
+          <ls_tadir>-korrnum = '712000'.
+        WHEN 'SUSC'.
+          " SUSC after SUSO
+          <ls_tadir>-korrnum = '711000'.
+        WHEN 'SUSO'.
+          " SUSO after DCLS
+          <ls_tadir>-korrnum = '710000'.
+        WHEN 'DCLS'.
+          " AUTH and SUSO after DCLS
+          <ls_tadir>-korrnum = '705000'.
+        WHEN 'IASP'.
+          <ls_tadir>-korrnum = '552000'.
+        WHEN 'IARP'.
+          <ls_tadir>-korrnum = '551000'.
+        WHEN 'IATU'.
+          <ls_tadir>-korrnum = '550000'.
+        WHEN 'ACID'.
+          " ACID after PROG/FUGR/CLAS
+          <ls_tadir>-korrnum = '300000'.
+        WHEN 'FUGR'.
+          <ls_tadir>-korrnum = '260000'.
+        WHEN 'PROG'.
+          " delete includes after main programs
+          SELECT COUNT(*) FROM reposrc
+            WHERE progname = <ls_tadir>-obj_name
+            AND r3state = 'A'
+            AND subc = 'I'.
+          IF sy-subrc = 0.
+            <ls_tadir>-korrnum = '250000'.
+          ELSE.
+            <ls_tadir>-korrnum = '240000'.
+          ENDIF.
+        WHEN 'INTF'.
+          <ls_tadir>-korrnum = '230000'.
+        WHEN 'CLAS'.
+          <ls_tadir>-korrnum = '220000'.
+        WHEN 'IDOC'.
+          <ls_tadir>-korrnum = '200000'.
+        WHEN 'IOBJ'.
+          <ls_tadir>-korrnum = '195000'.
+        WHEN 'ODSO'.
+          <ls_tadir>-korrnum = '190000'.
+        WHEN 'WDCA'.
+          <ls_tadir>-korrnum = '174000'.
+        WHEN 'WDYA'.
+          <ls_tadir>-korrnum = '173000'.
+        WHEN 'WDCC'.
+          <ls_tadir>-korrnum = '172000'.
+        WHEN 'WDYN'.
+          <ls_tadir>-korrnum = '171000'.
+        WHEN 'IEXT'.
+          <ls_tadir>-korrnum = '150000'.
+        WHEN 'SAPC'.
+          " SAPC after SICF
+          <ls_tadir>-korrnum = '140000'.
+        WHEN 'PINF'.
+          " PINF before exposed objects
+          <ls_tadir>-korrnum = '130000'.
+        WHEN OTHERS.
+          <ls_tadir>-korrnum = '100000'.
+      ENDCASE.
+    ENDLOOP.
+ 
+    resolve_ddic( CHANGING ct_tadir = ct_tadir ).
+    resolve_packages( CHANGING ct_tadir = ct_tadir ).
+ 
+    SORT ct_tadir BY korrnum ASCENDING.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve_ddic.
+* this will make sure the deletion sequence of structures/tables work
+* in case they have dependencies with .INCLUDE
+ 
+    TYPES: BEGIN OF ty_edge,
+             from TYPE ty_item,
+             to   TYPE ty_item,
+           END OF ty_edge.
+ 
+    DATA: lt_nodes        TYPE TABLE OF ty_item,
+          lt_edges        TYPE TABLE OF ty_edge,
+          lt_findstrings  TYPE TABLE OF rsfind,
+          lv_plus         TYPE i VALUE 1,
+          lv_find_obj_cls TYPE euobj-id,
+          lv_index        TYPE i,
+          lv_before       TYPE i,
+          lt_founds       TYPE TABLE OF rsfindlst,
+          lt_scope        TYPE STANDARD TABLE OF seu_obj,
+          lt_dependency   TYPE ty_dedenpencies.
+ 
+    FIELD-SYMBOLS: <ls_tadir_ddls>      TYPE zif_abapgit_definitions=>ty_tadir,
+                   <ls_dependency>      TYPE ty_dependency,
+                   <ls_tadir_dependent> TYPE zif_abapgit_definitions=>ty_tadir,
+                   <ls_tadir>           LIKE LINE OF ct_tadir,
+                   <ls_edge>            LIKE LINE OF lt_edges,
+                   <ls_found>           LIKE LINE OF lt_founds,
+                   <ls_node>            LIKE LINE OF lt_nodes.
+ 
+    " build nodes
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>
+        WHERE object = 'TABL'
+        OR object = 'VIEW'
+        OR object = 'TTYP'.
+      APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
+      <ls_node>-obj_name = <ls_tadir>-obj_name.
+      <ls_node>-obj_type = <ls_tadir>-object.
+    ENDLOOP.
+ 
+    APPEND 'TABL' TO lt_scope.
+    APPEND 'VIEW' TO lt_scope.
+    APPEND 'STRU' TO lt_scope.
+    APPEND 'TTYP' TO lt_scope.
+ 
+    " build edges
+    LOOP AT lt_nodes ASSIGNING <ls_node>.
+ 
+      CLEAR lt_findstrings.
+      APPEND <ls_node>-obj_name TO lt_findstrings.
+      lv_find_obj_cls = <ls_node>-obj_type.
+ 
+      CALL FUNCTION 'RS_EU_CROSSREF'
+        EXPORTING
+          i_find_obj_cls           = lv_find_obj_cls
+        TABLES
+          i_findstrings            = lt_findstrings
+          o_founds                 = lt_founds
+          i_scope_object_cls       = lt_scope
+        EXCEPTIONS
+          not_executed             = 1
+          not_found                = 2
+          illegal_object           = 3
+          no_cross_for_this_object = 4
+          batch                    = 5
+          batchjob_error           = 6
+          wrong_type               = 7
+          object_not_exist         = 8
+          OTHERS                   = 9.
+      IF sy-subrc <> 0.
+        CONTINUE.
+      ENDIF.
+ 
+      LOOP AT lt_founds ASSIGNING <ls_found>.
+        APPEND INITIAL LINE TO lt_edges ASSIGNING <ls_edge>.
+        <ls_edge>-from = <ls_node>.
+ 
+        <ls_edge>-to-obj_name   = <ls_found>-object.
+        CASE <ls_found>-object_cls.
+          WHEN 'DS'
+              OR 'DT'.
+            <ls_edge>-to-obj_type = 'TABL'.
+          WHEN 'DV'.
+            <ls_edge>-to-obj_type = 'VIEW'.
+          WHEN 'DA'.
+            <ls_edge>-to-obj_type = 'TTYP'.
+          WHEN OTHERS.
+            zcx_abapgit_exception=>raise( 'resolve_ddic, unknown object_cls' ).
+        ENDCASE.
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+    " build DDLS edges
+    SORT ct_tadir. "binary search
+    LOOP AT ct_tadir ASSIGNING <ls_tadir_ddls>
+                     WHERE object = 'DDLS'.
+ 
+      CLEAR: lt_dependency.
+ 
+      APPEND INITIAL LINE TO lt_nodes ASSIGNING <ls_node>.
+      <ls_node>-obj_name = <ls_tadir_ddls>-obj_name.
+      <ls_node>-obj_type = <ls_tadir_ddls>-object.
+ 
+      lt_dependency = get_ddls_dependencies( <ls_tadir_ddls>-obj_name ).
+ 
+      LOOP AT lt_dependency ASSIGNING <ls_dependency>
+                            WHERE deptyp = 'DDLS'
+                            AND refname = <ls_tadir_ddls>-obj_name.
+ 
+        READ TABLE ct_tadir ASSIGNING <ls_tadir_dependent>
+                            WITH KEY pgmid    = 'R3TR'
+                                     object   = 'DDLS'
+                                     obj_name = <ls_dependency>-depname
+                            BINARY SEARCH.
+        CHECK sy-subrc = 0.
+ 
+        APPEND INITIAL LINE TO lt_edges ASSIGNING <ls_edge>.
+        <ls_edge>-from = <ls_node>.
+        <ls_edge>-to-obj_name = <ls_dependency>-depname.
+        <ls_edge>-to-obj_type = 'DDLS'.
+ 
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+    DO.
+      lv_before = lines( lt_nodes ).
+      LOOP AT lt_nodes ASSIGNING <ls_node>.
+        lv_index = sy-tabix.
+        READ TABLE lt_edges WITH KEY
+          from-obj_name = <ls_node>-obj_name
+          from-obj_type = <ls_node>-obj_type
+          TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          LOOP AT ct_tadir ASSIGNING <ls_tadir>
+              WHERE obj_name = <ls_node>-obj_name
+              AND object = <ls_node>-obj_type.
+            <ls_tadir>-korrnum = <ls_tadir>-korrnum + lv_plus.
+            CONDENSE <ls_tadir>-korrnum.
+          ENDLOOP.
+          DELETE lt_edges
+            WHERE to-obj_name = <ls_node>-obj_name
+            AND to-obj_type = <ls_node>-obj_type.
+          DELETE lt_nodes INDEX lv_index.
+          EXIT. " make sure the sequence is fixed
+        ENDIF.
+      ENDLOOP.
+      IF lv_before = lines( lt_nodes ).
+        EXIT.
+      ENDIF.
+      lv_plus = lv_plus + 1.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve_packages.
+ 
+    DATA: lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    FIELD-SYMBOLS: <ls_tadir>            LIKE LINE OF ct_tadir,
+                   <lv_subpackage>       LIKE LINE OF lt_subpackages,
+                   <ls_tadir_subpackage> LIKE LINE OF ct_tadir.
+ 
+    " List subpackage before corresponding superpackage
+ 
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>
+                     WHERE object = 'DEVC'.
+ 
+      lt_subpackages = zcl_abapgit_factory=>get_sap_package( |{ <ls_tadir>-obj_name }| )->list_subpackages( ).
+ 
+      LOOP AT lt_subpackages ASSIGNING <lv_subpackage>.
+ 
+        READ TABLE ct_tadir ASSIGNING <ls_tadir_subpackage>
+                            WITH KEY object   = 'DEVC'
+                                     obj_name = <lv_subpackage>.
+        IF sy-subrc = 0.
+          <ls_tadir_subpackage>-korrnum = condense( |{ <ls_tadir_subpackage>-korrnum - 1 }| ).
+        ENDIF.
+ 
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_dependencies.clas.testclasses.abap.html b/src/objects/core/zcl_abapgit_dependencies.clas.testclasses.abap.html new file mode 100644 index 00000000000..853fd7ea573 --- /dev/null +++ b/src/objects/core/zcl_abapgit_dependencies.clas.testclasses.abap.html @@ -0,0 +1,715 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_dependencies.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_dependencies.clas.testclasses.abap

+
+ +
+ 96.19% + Statements + 202/210 +
+ + +
+ 100% + Branches + 6/6 +
+ + +
+ 55.55% + Functions + 5/9 +
+ + +
+ 96.19% + Lines + 202/210 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +2111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +2x +2x +2x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x + 
CLASS ltcl_sap_package DEFINITION FOR TESTING.
+ 
+  PUBLIC SECTION.
+    TYPES:
+      ty_package TYPE STANDARD TABLE OF devclass
+                                WITH NON-UNIQUE DEFAULT KEY.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          iv_package TYPE devclass,
+ 
+      set_sub_packages
+        IMPORTING
+          it_sub_packages TYPE ty_package.
+ 
+    INTERFACES: zif_abapgit_sap_package.
+ 
+  PRIVATE SECTION.
+    DATA: mv_package      TYPE devclass,
+          mt_sub_packages TYPE ty_package.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_sap_package IMPLEMENTATION.
+ 
+  METHOD constructor.
+ 
+    mv_package = iv_package.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_subpackages.
+ 
+    IF mv_package = 'Z_MAIN'.
+ 
+      rt_list = mt_sub_packages.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_sub_packages.
+ 
+    mt_sub_packages = it_sub_packages.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create. "##needed
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_child. "##needed
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_local. "##needed
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~exists. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_parent. "##needed
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_resolve_packages DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mt_tadir        TYPE zif_abapgit_definitions=>ty_tadir_tt,
+      mt_sub_packages TYPE ltcl_sap_package=>ty_package.
+ 
+    METHODS:
+      resolve_single FOR TESTING RAISING cx_static_check,
+ 
+      given_tadir
+        IMPORTING
+          iv_object        TYPE tadir-object
+          iv_obj_name      TYPE tadir-obj_name
+          iv_korrnum       TYPE tadir-korrnum
+          iv_super_package TYPE devclass,
+ 
+      when_packages_are_resolved,
+ 
+      then_korrnum_should_be
+        IMPORTING
+          iv_line    TYPE i
+          iv_korrnum TYPE tadir-korrnum.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_dependencies DEFINITION LOCAL FRIENDS ltcl_resolve_packages.
+ 
+CLASS ltcl_resolve_packages IMPLEMENTATION.
+ 
+  METHOD resolve_single.
+ 
+ 
+    given_tadir( iv_object        = 'DEVC'
+                 iv_obj_name      = 'Z_MAIN'
+                 iv_korrnum       = '9990'
+                 iv_super_package = '' ).
+ 
+    given_tadir( iv_object        = 'DEVC'
+                 iv_obj_name      = 'Z_SUB1'
+                 iv_korrnum       = '9990'
+                 iv_super_package = 'Z_MAIN' ).
+ 
+    given_tadir( iv_object        = 'DEVC'
+                 iv_obj_name      = 'Z_SUB2'
+                 iv_korrnum       = '9990'
+                 iv_super_package = 'Z_MAIN' ).
+ 
+    when_packages_are_resolved( ).
+ 
+    then_korrnum_should_be( iv_line    = 1
+                            iv_korrnum = '9990' ).
+    then_korrnum_should_be( iv_line    = 2
+                            iv_korrnum = '9989' ).
+    then_korrnum_should_be( iv_line    = 3
+                            iv_korrnum = '9989' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_tadir.
+ 
+    DATA: ls_tadir   LIKE LINE OF mt_tadir,
+          lv_package TYPE devclass.
+ 
+    ls_tadir-object   = iv_object.
+    ls_tadir-obj_name = iv_obj_name.
+    ls_tadir-korrnum  = iv_korrnum.
+    INSERT ls_tadir INTO TABLE mt_tadir.
+ 
+    IF iv_super_package IS NOT INITIAL.
+      lv_package = iv_obj_name.
+      INSERT lv_package INTO TABLE mt_sub_packages.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD when_packages_are_resolved.
+ 
+    DATA: lo_mock_sap_package TYPE REF TO ltcl_sap_package.
+ 
+    CREATE OBJECT lo_mock_sap_package
+      EXPORTING
+        iv_package = 'Z_MAIN'.
+ 
+    lo_mock_sap_package->set_sub_packages( mt_sub_packages ).
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = 'Z_MAIN'
+                                           ii_sap_package = lo_mock_sap_package ).
+ 
+    zcl_abapgit_dependencies=>resolve_packages( CHANGING ct_tadir = mt_tadir ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD then_korrnum_should_be.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF mt_tadir.
+ 
+    READ TABLE mt_tadir INDEX iv_line
+                        ASSIGNING <ls_tadir>.
+ 
+    cl_abap_unit_assert=>assert_equals( exp = iv_korrnum
+                                        act = <ls_tadir>-korrnum ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_file_deserialize.clas.abap.html b/src/objects/core/zcl_abapgit_file_deserialize.clas.abap.html new file mode 100644 index 00000000000..d3411a69e80 --- /dev/null +++ b/src/objects/core/zcl_abapgit_file_deserialize.clas.abap.html @@ -0,0 +1,889 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_file_deserialize.clas.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_file_deserialize.clas.abap

+
+ +
+ 80.59% + Statements + 216/268 +
+ + +
+ 33.33% + Branches + 2/6 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 80.59% + Lines + 216/268 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +2691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_file_deserialize DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_results
+      IMPORTING
+        !io_repo          TYPE REF TO zcl_abapgit_repo
+        !ii_log           TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS filter_files_to_deserialize
+      IMPORTING
+        !it_results       TYPE zif_abapgit_definitions=>ty_results_tt
+        !ii_log           TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt .
+    CLASS-METHODS prioritize_deser
+      IMPORTING
+        !ii_log           TYPE REF TO zif_abapgit_log
+        !it_results       TYPE zif_abapgit_definitions=>ty_results_tt
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt .
+    CLASS-METHODS map_results_to_items
+      IMPORTING
+        !it_results     TYPE zif_abapgit_definitions=>ty_results_tt
+      RETURNING
+        VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_file_deserialize IMPLEMENTATION.
+ 
+ 
+  METHOD filter_files_to_deserialize.
+ 
+    DATA lt_objects LIKE rt_results.
+    DATA lr_object  TYPE REF TO zif_abapgit_definitions=>ty_result.
+    DATA ls_item    TYPE zif_abapgit_definitions=>ty_item.
+    DATA lv_tabix   TYPE sy-tabix.
+ 
+    rt_results = it_results.
+ 
+    "preparation for object logging, sort all file entries by objects
+    IF ii_log IS BOUND.
+      lt_objects = rt_results.
+      SORT lt_objects
+        BY obj_type
+           obj_name.
+      DELETE ADJACENT DUPLICATES FROM lt_objects COMPARING obj_type obj_name.
+      DELETE lt_objects WHERE obj_type IS INITIAL AND obj_name IS INITIAL.
+    ENDIF.
+ 
+    "ignore objects w/o changes
+    DELETE rt_results WHERE match = abap_true.     " Full match
+    "log objects w/o changes
+    IF sy-subrc = 0 AND ii_log IS BOUND.
+      SORT rt_results BY obj_type obj_name.
+      LOOP AT lt_objects REFERENCE INTO lr_object.
+        lv_tabix = sy-tabix.
+        READ TABLE rt_results WITH KEY obj_type = lr_object->obj_type
+                                       obj_name = lr_object->obj_name
+                              BINARY SEARCH TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          "all parts of the objects have not changed
+          ls_item-devclass = lr_object->package.
+          ls_item-obj_type = lr_object->obj_type.
+          ls_item-obj_name = lr_object->obj_name.
+          ii_log->add_success(
+            iv_msg  = |Object { ls_item-obj_name } (type { ls_item-obj_type }) not changed; no import required|
+            is_item = ls_item ).
+          "ignore object for further messages
+          DELETE lt_objects INDEX lv_tabix.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+    "ignore objects w/o object type
+    DELETE rt_results WHERE obj_type IS INITIAL.
+    "log objects w/o object type
+    IF sy-subrc = 0 AND ii_log IS BOUND.
+      " Note: Moving the CHECK condition to the LOOP WHERE clause will lead to a
+      " syntax warning in higher releases and syntax error in 702
+      LOOP AT lt_objects REFERENCE INTO lr_object.
+        CHECK lr_object->obj_type IS INITIAL AND lr_object->obj_name IS NOT INITIAL.
+        ls_item-devclass = lr_object->package.
+        ls_item-obj_type = lr_object->obj_type.
+        ls_item-obj_name = lr_object->obj_name.
+        ii_log->add_warning(
+          iv_msg  = |Object type for { ls_item-obj_name } not defined - will be ignored by abapGit|
+          is_item = ls_item ).
+      ENDLOOP.
+      DELETE lt_objects WHERE obj_type IS INITIAL.
+    ENDIF.
+ 
+    "ignore objects that exists only local
+    DELETE rt_results WHERE lstate = zif_abapgit_definitions=>c_state-added AND rstate IS INITIAL.
+    "ignore objects that where deleted remotely
+    DELETE rt_results WHERE rstate = zif_abapgit_definitions=>c_state-deleted.
+    "log objects that exists only local or where deleted remotely
+    IF sy-subrc = 0 AND ii_log IS BOUND.
+      SORT rt_results BY obj_type obj_name.
+      LOOP AT lt_objects REFERENCE INTO lr_object.
+        lv_tabix = sy-tabix.
+        READ TABLE rt_results WITH KEY obj_type = lr_object->obj_type
+                                       obj_name = lr_object->obj_name
+                              BINARY SEARCH TRANSPORTING NO FIELDS.
+        IF sy-subrc <> 0.
+          "all parts exists only local
+          "no log message; ignore object for further messages
+          DELETE lt_objects INDEX lv_tabix.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+    "ignore table content
+    DELETE rt_results WHERE path = zif_abapgit_data_config=>c_default_path.
+ 
+    SORT rt_results
+      BY obj_type ASCENDING
+         obj_name ASCENDING
+         rstate   DESCENDING  " ensures that non-empty rstate is kept
+         lstate   DESCENDING. " ensures that non-empty lstate is kept
+    DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_results.
+ 
+    DATA lt_results TYPE zif_abapgit_definitions=>ty_results_tt.
+ 
+    lt_results = filter_files_to_deserialize(
+      it_results = zcl_abapgit_file_status=>status( io_repo )
+      ii_log     = ii_log ).
+ 
+    rt_results = prioritize_deser(
+      ii_log     = ii_log
+      it_results = lt_results ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_results_to_items.
+ 
+    DATA ls_item LIKE LINE OF rt_items.
+    FIELD-SYMBOLS: <ls_result> TYPE zif_abapgit_definitions=>ty_result.
+ 
+    LOOP AT it_results ASSIGNING <ls_result>.
+      ls_item-devclass = <ls_result>-package.
+      ls_item-obj_type = <ls_result>-obj_type.
+      ls_item-obj_name = <ls_result>-obj_name.
+      INSERT ls_item INTO TABLE rt_items.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD prioritize_deser.
+ 
+    DATA lt_items    TYPE zif_abapgit_definitions=>ty_items_tt.
+    DATA ls_item     LIKE LINE OF lt_items.
+    DATA lt_requires TYPE zif_abapgit_definitions=>ty_items_tt.
+    DATA ls_require  LIKE LINE OF lt_requires.
+    DATA ls_result   LIKE LINE OF it_results.
+    DATA lo_graph    TYPE REF TO zcl_abapgit_item_graph.
+ 
+    lt_items = map_results_to_items( it_results ).
+ 
+    CREATE OBJECT lo_graph EXPORTING it_items = lt_items.
+ 
+    LOOP AT lt_items INTO ls_item.
+      CLEAR lt_requires.
+ 
+* TODO: BEGIN extract to object handler method in ZIF_ABAPGIT_OBJECT:
+*    METHODS get_deserialize_order
+*      IMPORTING
+*        it_items TYPE ty_items_tt
+*      RETURNING
+*        VALUE(rt_requries) TYPE ty_items_tt
+ 
+      CASE ls_item-obj_type.
+        WHEN 'SPRX'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'WEBI'.
+        WHEN 'CLAS'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'SPRX'
+            AND obj_type <> 'INTF'
+            AND obj_type <> 'XSLT'.
+        WHEN 'PROG'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'XSLT'.
+        WHEN 'INTF'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'SPRX'
+            AND obj_type <> 'XSLT'.
+        WHEN 'TABL'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'SPRX'.
+        WHEN 'IARP'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'IASP'.
+        WHEN 'IATU' OR 'IAXU'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'IASP'
+            AND obj_type <> 'PROG'
+            AND obj_type <> 'IARP'.
+        WHEN 'DCLS'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'DDLS'.
+        WHEN 'ODSO'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'IOBJ'.
+        WHEN 'SCP1'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'TOBJ'.
+        WHEN 'CHAR'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'OTGR'.
+        WHEN 'PINF'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'CLAS'
+            AND obj_type <> 'INTF'
+            AND obj_type <> 'TABL'
+            AND obj_type <> 'DOMA'
+            AND obj_type <> 'DTEL'.
+        WHEN 'DEVC'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'PINF'.
+        WHEN 'ENHC'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'ENHO'.
+        WHEN 'ENHO'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'ENSC' AND obj_type <> 'ENHS'.
+        WHEN 'ENSC'.
+          lt_requires = lt_items.
+          DELETE lt_requires WHERE obj_type <> 'ENHS'.
+      ENDCASE.
+* TODO: END extract to object handler method
+ 
+      LOOP AT lt_requires INTO ls_require.
+        lo_graph->add_edge(
+          is_from = ls_require
+          is_to   = ls_item ).
+      ENDLOOP.
+    ENDLOOP.
+ 
+    WHILE lo_graph->has_vertices( ) = abap_true.
+      ls_item = lo_graph->get_next( ii_log ).
+      READ TABLE it_results INTO ls_result WITH KEY sec_key COMPONENTS
+        obj_name = ls_item-obj_name
+        obj_type = ls_item-obj_type.
+      ASSERT sy-subrc = 0.
+      APPEND ls_result TO rt_results.
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap.html b/src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap.html new file mode 100644 index 00000000000..8b5c6497b76 --- /dev/null +++ b/src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap.html @@ -0,0 +1,1465 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_file_deserialize.clas.testclasses.abap

+
+ +
+ 100% + Statements + 460/460 +
+ + +
+ 100% + Branches + 33/33 +
+ + +
+ 100% + Functions + 33/33 +
+ + +
+ 100% + Lines + 460/460 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +4611x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +1x +1x +1x +8x +8x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +18x +18x +18x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +42x +42x +42x +42x +42x +42x +42x +42x +1x +1x +1x +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +1x +1x +1x +42x +42x +42x +42x +42x +42x +42x +42x +42x +42x +42x +42x +1x +1x + 
CLASS ltcl_filter_files_to_deser DEFINITION DEFERRED.
+CLASS ltcl_prio_deserialization DEFINITION DEFERRED.
+ 
+CLASS zcl_abapgit_file_deserialize DEFINITION LOCAL FRIENDS ltcl_filter_files_to_deser.
+CLASS zcl_abapgit_file_deserialize DEFINITION LOCAL FRIENDS ltcl_prio_deserialization.
+ 
+CLASS ltcl_filter_files_to_deser DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_objects TYPE REF TO zcl_abapgit_file_deserialize,
+      mt_result  TYPE zif_abapgit_definitions=>ty_results_tt.
+ 
+    METHODS:
+      setup,
+      filter_duplicates FOR TESTING RAISING cx_static_check,
+      filter_duplicates_rstate FOR TESTING RAISING cx_static_check,
+      filter_duplicates_lstate FOR TESTING RAISING cx_static_check,
+      filter_duplicates_match FOR TESTING RAISING cx_static_check,
+      filter_duplicates_init_objtype FOR TESTING RAISING cx_static_check,
+      filter_duplicates_changes_01 FOR TESTING RAISING cx_static_check,
+      filter_duplicates_changes_02 FOR TESTING RAISING cx_static_check,
+      filter_duplicates_deleted FOR TESTING RAISING cx_static_check,
+ 
+      given_result
+        IMPORTING
+          iv_result_line TYPE string,
+ 
+      when_filter_is_applied.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_filter_files_to_deser IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mo_objects.
+ 
+  ENDMETHOD.
+ 
+  METHOD filter_duplicates.
+ 
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;| ).
+ 
+    when_filter_is_applied( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 1
+      act = lines( mt_result ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_duplicates_rstate.
+ 
+    DATA: ls_exp LIKE LINE OF mt_result,
+          ls_act LIKE LINE OF mt_result.
+ 
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;A| ).
+ 
+    READ TABLE mt_result INDEX 2 INTO ls_exp.
+ 
+    when_filter_is_applied( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 1
+      act = lines( mt_result ) ).
+ 
+    READ TABLE mt_result INDEX 1 INTO ls_act.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = ls_exp
+      act = ls_act ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_duplicates_lstate.
+ 
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;A;| ).
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;A;| ).
+ 
+    when_filter_is_applied( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( mt_result ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_duplicates_match.
+ 
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;X;;| ).
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;X;;| ).
+ 
+    when_filter_is_applied( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( mt_result ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_duplicates_init_objtype.
+ 
+    given_result( |;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.abap;;;;| ).
+    given_result( |;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;| ).
+ 
+    when_filter_is_applied( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( mt_result ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD filter_duplicates_changes_01.
+ 
+    DATA: ls_exp LIKE LINE OF mt_result,
+          ls_act LIKE LINE OF mt_result.
+ 
+    " test different order since SORT object,obj_name is non-deterministic
+    given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;M;M| ).
+    given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.testclasses.abap;;;;M| ).
+ 
+    READ TABLE mt_result INDEX 1 INTO ls_exp.
+ 
+    when_filter_is_applied( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 1
+      act = lines( mt_result ) ).
+ 
+    READ TABLE mt_result INDEX 1 INTO ls_act.
+ 
+    " expect M,M
+    cl_abap_unit_assert=>assert_equals(
+      exp = ls_exp
+      act = ls_act ).
+ 
+  ENDMETHOD.
+ 
+  METHOD filter_duplicates_changes_02.
+ 
+    DATA: ls_exp LIKE LINE OF mt_result,
+          ls_act LIKE LINE OF mt_result.
+ 
+    " test different order since SORT object,obj_name is non-deterministic
+    given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.abap;;;;M| ).
+    given_result( |CLAS;ZAG_UNIT_TEST;;/src/;zag_unit_test.clas.testclasses.abap;;;M;M| ).
+ 
+    READ TABLE mt_result INDEX 2 INTO ls_exp.
+ 
+    when_filter_is_applied( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 1
+      act = lines( mt_result ) ).
+ 
+    READ TABLE mt_result INDEX 1 INTO ls_act.
+ 
+    " expect M,M
+    cl_abap_unit_assert=>assert_equals(
+      exp = ls_exp
+      act = ls_act ).
+ 
+  ENDMETHOD.
+ 
+  METHOD filter_duplicates_deleted.
+ 
+    given_result( |PROG;ZAG_UNIT_TEST;;/src/;zag_unit_test.prog.xml;;;;D| ).
+ 
+    when_filter_is_applied( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( mt_result ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD given_result.
+ 
+    DATA: ls_result LIKE LINE OF mt_result.
+ 
+    SPLIT iv_result_line
+      AT ';'
+      INTO ls_result-obj_type
+           ls_result-obj_name
+           ls_result-inactive
+           ls_result-path
+           ls_result-filename
+           ls_result-package
+           ls_result-match
+           ls_result-lstate
+           ls_result-rstate.
+ 
+    INSERT ls_result INTO TABLE mt_result.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD when_filter_is_applied.
+ 
+    mt_result = mo_objects->filter_files_to_deserialize( mt_result ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_prio_deserialization DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      setup,
+      ddls_before_dcls FOR TESTING RAISING cx_static_check,
+      webi_before_sprx FOR TESTING RAISING cx_static_check,
+      iasp_before_iarp FOR TESTING RAISING cx_static_check,
+      iarp_before_iatu FOR TESTING RAISING cx_static_check,
+      prog_before_iaxu FOR TESTING RAISING cx_static_check,
+      iobj_before_odso FOR TESTING RAISING cx_static_check,
+      tobj_before_scp1 FOR TESTING RAISING cx_static_check,
+      otgr_before_char FOR TESTING RAISING cx_static_check,
+      sprx_before_clas FOR TESTING RAISING cx_static_check,
+      sprx_before_intf FOR TESTING RAISING cx_static_check,
+      sprx_before_tabl FOR TESTING RAISING cx_static_check,
+      pinf_before_devc FOR TESTING RAISING cx_static_check,
+      clas_before_pinf FOR TESTING RAISING cx_static_check,
+      enhs_before_ensc FOR TESTING RAISING cx_static_check,
+      ensc_before_enho FOR TESTING RAISING cx_static_check,
+      enho_before_enhc FOR TESTING RAISING cx_static_check,
+      xslt_before_clas FOR TESTING RAISING cx_static_check,
+      xslt_before_prog FOR TESTING RAISING cx_static_check,
+ 
+      given
+        IMPORTING
+          iv_object_type TYPE string,
+      when_deser_is_priorized,
+      check
+        IMPORTING
+          iv_exp_object_type TYPE string.
+ 
+    DATA:
+      mo_objects          TYPE REF TO zcl_abapgit_file_deserialize,
+      mt_input            TYPE zif_abapgit_definitions=>ty_results_tt,
+      mt_output           TYPE zif_abapgit_definitions=>ty_results_tt,
+      mv_counter          TYPE i,
+      mv_exp_output_tabix TYPE i.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_prio_deserialization IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_objects.
+    mv_exp_output_tabix = 0.
+  ENDMETHOD.
+ 
+  METHOD enhs_before_ensc.
+    given( 'ENSC' ).
+    given( 'ENHS' ).
+    when_deser_is_priorized( ).
+    check( 'ENHS' ).
+    check( 'ENSC' ).
+  ENDMETHOD.
+ 
+  METHOD ensc_before_enho.
+    given( 'ENHO' ).
+    given( 'ENSC' ).
+    when_deser_is_priorized( ).
+    check( 'ENSC' ).
+    check( 'ENHO' ).
+  ENDMETHOD.
+ 
+  METHOD enho_before_enhc.
+    given( 'ENHC' ).
+    given( 'ENHO' ).
+    when_deser_is_priorized( ).
+    check( 'ENHO' ).
+    check( 'ENHC' ).
+  ENDMETHOD.
+ 
+  METHOD sprx_before_clas.
+    given( 'CLAS' ).
+    given( 'SPRX' ).
+    when_deser_is_priorized( ).
+    check( 'SPRX' ).
+    check( 'CLAS' ).
+  ENDMETHOD.
+ 
+  METHOD sprx_before_intf.
+    given( 'INTF' ).
+    given( 'SPRX' ).
+    when_deser_is_priorized( ).
+    check( 'SPRX' ).
+    check( 'INTF' ).
+  ENDMETHOD.
+ 
+  METHOD sprx_before_tabl.
+    given( 'TABL' ).
+    given( 'SPRX' ).
+    when_deser_is_priorized( ).
+    check( 'SPRX' ).
+    check( 'TABL' ).
+  ENDMETHOD.
+ 
+  METHOD otgr_before_char.
+    given( 'CHAR' ).
+    given( 'OTGR' ).
+    when_deser_is_priorized( ).
+    check( 'OTGR' ).
+    check( 'CHAR' ).
+  ENDMETHOD.
+ 
+  METHOD pinf_before_devc.
+    given( 'DEVC' ).
+    given( 'PINF' ).
+    when_deser_is_priorized( ).
+    check( 'PINF' ).
+    check( 'DEVC' ).
+  ENDMETHOD.
+ 
+  METHOD tobj_before_scp1.
+    given( 'SCP1' ).
+    given( 'TOBJ' ).
+    when_deser_is_priorized( ).
+    check( 'TOBJ' ).
+    check( 'SCP1' ).
+  ENDMETHOD.
+ 
+  METHOD iobj_before_odso.
+    given( 'ODSO' ).
+    given( 'IOBJ' ).
+    when_deser_is_priorized( ).
+    check( 'IOBJ' ).
+    check( 'ODSO' ).
+  ENDMETHOD.
+ 
+  METHOD iasp_before_iarp.
+    given( 'IARP' ).
+    given( 'IASP' ).
+    when_deser_is_priorized( ).
+    check( 'IASP' ).
+    check( 'IARP' ).
+  ENDMETHOD.
+ 
+  METHOD iarp_before_iatu.
+    given( 'IATU' ).
+    given( 'IARP' ).
+    when_deser_is_priorized( ).
+    check( 'IARP' ).
+    check( 'IATU' ).
+  ENDMETHOD.
+ 
+  METHOD prog_before_iaxu.
+    given( 'IAXU' ).
+    given( 'PROG' ).
+    when_deser_is_priorized( ).
+    check( 'PROG' ).
+    check( 'IAXU' ).
+  ENDMETHOD.
+ 
+  METHOD webi_before_sprx.
+    given( 'SPRX' ).
+    given( 'WEBI' ).
+    when_deser_is_priorized( ).
+    check( 'WEBI' ).
+    check( 'SPRX' ).
+  ENDMETHOD.
+ 
+  METHOD clas_before_pinf.
+    given( 'PINF' ).
+    given( 'CLAS' ).
+    when_deser_is_priorized( ).
+    check( 'CLAS' ).
+    check( 'PINF' ).
+  ENDMETHOD.
+ 
+  METHOD xslt_before_clas.
+    given( 'INTF' ).
+    given( 'CLAS' ).
+    given( 'XSLT' ).
+    given( 'INTF' ).
+    given( 'CLAS' ).
+    given( 'XSLT' ).
+    when_deser_is_priorized( ).
+    check( 'XSLT' ).
+    check( 'XSLT' ).
+    check( 'INTF' ).
+    check( 'INTF' ).
+    check( 'CLAS' ).
+    check( 'CLAS' ).
+  ENDMETHOD.
+ 
+  METHOD xslt_before_prog.
+    given( 'PROG' ).
+    given( 'XSLT' ).
+    when_deser_is_priorized( ).
+    check( 'XSLT' ).
+    check( 'PROG' ).
+  ENDMETHOD.
+ 
+  METHOD ddls_before_dcls.
+    given( 'DCLS' ).
+    given( 'DDLS' ).
+    given( 'DCLS' ).
+    given( 'DDLS' ).
+    when_deser_is_priorized( ).
+    check( 'DDLS' ).
+    check( 'DDLS' ).
+    check( 'DCLS' ).
+    check( 'DCLS' ).
+  ENDMETHOD.
+ 
+  METHOD given.
+ 
+    DATA ls_input LIKE LINE OF mt_input.
+    ls_input-obj_type = iv_object_type.
+    ls_input-obj_name = mv_counter.
+    INSERT ls_input INTO TABLE mt_input.
+    mv_counter = mv_counter + 1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD when_deser_is_priorized.
+ 
+    DATA lo_log TYPE REF TO zcl_abapgit_log.
+ 
+    CREATE OBJECT lo_log.
+ 
+    mt_output = mo_objects->prioritize_deser(
+      ii_log     = lo_log
+      it_results = mt_input ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check.
+ 
+    DATA: ls_output LIKE LINE OF mt_output.
+ 
+    mv_exp_output_tabix = mv_exp_output_tabix + 1.
+ 
+    READ TABLE mt_output INTO ls_output INDEX mv_exp_output_tabix.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = iv_exp_object_type
+      act = ls_output-obj_type ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_filename_logic.clas.abap.html b/src/objects/core/zcl_abapgit_filename_logic.clas.abap.html new file mode 100644 index 00000000000..0d1abaa8845 --- /dev/null +++ b/src/objects/core/zcl_abapgit_filename_logic.clas.abap.html @@ -0,0 +1,982 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_filename_logic.clas.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_filename_logic.clas.abap

+
+ +
+ 100% + Statements + 299/299 +
+ + +
+ 100% + Branches + 9/9 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 299/299 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +3001x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +45x +45x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +2x +44x +44x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_filename_logic DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_package_file,
+        obj_name  TYPE c LENGTH 7 VALUE 'package',
+        sep1      TYPE c LENGTH 1 VALUE '.',
+        obj_type  TYPE c LENGTH 4 VALUE 'devc',
+        sep2      TYPE c LENGTH 1 VALUE '.',
+        extension TYPE c LENGTH 3 VALUE 'xml',
+      END OF c_package_file.
+ 
+    CONSTANTS:
+      BEGIN OF c_json_file,
+        extension TYPE c LENGTH 4 VALUE 'json',
+      END OF c_json_file.
+ 
+    CLASS-METHODS detect_obj_definition
+      IMPORTING
+        !iv_type    TYPE string
+        !iv_ext     TYPE string
+      EXPORTING
+        !ev_is_xml  TYPE abap_bool
+        !ev_is_json TYPE abap_bool.
+ 
+    CLASS-METHODS is_obj_definition_file
+      IMPORTING
+        !iv_filename  TYPE string
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+ 
+    CLASS-METHODS file_to_object
+      IMPORTING
+        !iv_filename TYPE string
+        !iv_path     TYPE string
+        !iv_devclass TYPE devclass OPTIONAL
+        !io_dot      TYPE REF TO zcl_abapgit_dot_abapgit
+      EXPORTING
+        !es_item     TYPE zif_abapgit_definitions=>ty_item
+        !ev_is_xml   TYPE abap_bool
+        !ev_is_json  TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS object_to_file
+      IMPORTING
+        !is_item           TYPE zif_abapgit_definitions=>ty_item
+        !iv_ext            TYPE string
+        !iv_extra          TYPE clike OPTIONAL
+      RETURNING
+        VALUE(rv_filename) TYPE string .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA:
+      go_aff_registry TYPE REF TO zif_abapgit_aff_registry.
+ 
+    CLASS-METHODS name_escape
+      IMPORTING
+        !iv_name       TYPE csequence
+      RETURNING
+        VALUE(rv_name) TYPE string.
+ 
+    CLASS-METHODS name_unescape
+      IMPORTING
+        !iv_name       TYPE csequence
+      RETURNING
+        VALUE(rv_name) TYPE string.
+ 
+    CLASS-METHODS map_filename_to_object
+      IMPORTING
+        !iv_filename TYPE string
+        !iv_path     TYPE string
+        !iv_package  TYPE devclass
+        !io_dot      TYPE REF TO zcl_abapgit_dot_abapgit
+      CHANGING
+        cs_item      TYPE zif_abapgit_definitions=>ty_item
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS map_object_to_filename
+      IMPORTING
+        !is_item    TYPE zif_abapgit_definitions=>ty_item
+      CHANGING
+        cv_filename TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_filename_logic IMPLEMENTATION.
+ 
+ 
+  METHOD detect_obj_definition.
+ 
+    ev_is_xml  = boolc( iv_ext = to_upper( c_package_file-extension ) AND strlen( iv_type ) = 4 ).
+    ev_is_json = boolc( iv_ext = to_upper( c_json_file-extension ) AND strlen( iv_type ) = 4 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD file_to_object.
+ 
+    DATA:
+      lv_name TYPE string,
+      lv_type TYPE string,
+      lv_ext  TYPE string.
+ 
+    " Guess object type and name
+    SPLIT to_upper( iv_filename ) AT '.' INTO lv_name lv_type lv_ext.
+ 
+    " Handle namespaces
+    REPLACE ALL OCCURRENCES OF '#' IN lv_name WITH '/'.
+    REPLACE ALL OCCURRENCES OF '#' IN lv_type WITH '/'.
+    REPLACE ALL OCCURRENCES OF '#' IN lv_ext WITH '/'.
+ 
+    " Assume AFF namespace convention
+    CREATE OBJECT go_aff_registry TYPE zcl_abapgit_aff_registry.
+ 
+    IF go_aff_registry->is_supported_object_type( |{ lv_type }| ) = abap_true.
+      REPLACE ALL OCCURRENCES OF '(' IN lv_name WITH '/'.
+      REPLACE ALL OCCURRENCES OF ')' IN lv_name WITH '/'.
+    ENDIF.
+ 
+    " Get original object name
+    lv_name = name_unescape( lv_name ).
+ 
+    CLEAR es_item.
+    es_item-obj_type = lv_type.
+    es_item-obj_name = lv_name.
+ 
+    " Get mapping specific to object type
+    map_filename_to_object(
+      EXPORTING
+        iv_filename = iv_filename
+        iv_path     = iv_path
+        io_dot      = io_dot
+        iv_package  = iv_devclass
+      CHANGING
+        cs_item     = es_item ).
+ 
+    detect_obj_definition(
+      EXPORTING
+        iv_ext     = lv_ext
+        iv_type    = lv_type
+      IMPORTING
+        ev_is_xml  = ev_is_xml
+        ev_is_json = ev_is_json ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_obj_definition_file.
+ 
+    DATA:
+      lv_xml  TYPE abap_bool,
+      lv_json TYPE abap_bool,
+      lv_name TYPE string,
+      lv_type TYPE string,
+      lv_ext  TYPE string.
+ 
+    SPLIT to_upper( iv_filename ) AT '.' INTO lv_name lv_type lv_ext.
+ 
+    detect_obj_definition(
+      EXPORTING
+        iv_ext     = lv_ext
+        iv_type    = lv_type
+      IMPORTING
+        ev_is_xml  = lv_xml
+        ev_is_json = lv_json ).
+ 
+    rv_yes = boolc( lv_json = abap_true OR lv_xml = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_filename_to_object.
+ 
+    DATA lv_class TYPE seoclsname.
+ 
+    " TODO: Add check for supported object types to avoid calls to non-existing classes
+    " zcl_abapgit_objects=>is_type_supported( is_item-obj_type )
+    " This will trigger class constructor of zcl_abapgit_objects_bridge reading table seometarel
+    " which is currently not supported by abaplint test runner
+ 
+    TRY.
+        lv_class = 'ZCL_ABAPGIT_OBJECT_' && cs_item-obj_type.
+ 
+        CALL METHOD (lv_class)=>('ZIF_ABAPGIT_OBJECT~MAP_FILENAME_TO_OBJECT')
+          EXPORTING
+            iv_filename = iv_filename
+            iv_path     = iv_path
+            io_dot      = io_dot
+            iv_package  = iv_package
+          CHANGING
+            cs_item     = cs_item.
+      CATCH cx_sy_dyn_call_illegal_class ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_object_to_filename.
+ 
+    DATA lv_class TYPE seoclsname.
+ 
+    " TODO: Add check for supported object types to avoid calls to non-existing classes
+    " zcl_abapgit_objects=>is_type_supported( is_item-obj_type )
+    " This will trigger class constructor of zcl_abapgit_objects_bridge reading table seometarel
+    " which is currently not supported by abaplint test runner
+ 
+    TRY.
+        lv_class = 'ZCL_ABAPGIT_OBJECT_' && is_item-obj_type.
+ 
+        CALL METHOD (lv_class)=>('ZIF_ABAPGIT_OBJECT~MAP_OBJECT_TO_FILENAME')
+          EXPORTING
+            is_item     = is_item
+          CHANGING
+            cv_filename = cv_filename.
+      CATCH cx_sy_dyn_call_illegal_class ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD name_escape.
+    " Some characters in object names cause problems when identifying the object later
+    " -> we escape these characters here
+    " cl_http_utility=>escape_url doesn't do dots but escapes slash which we use for namespaces
+    " -> we escape just some selected characters
+    rv_name = iv_name.
+    REPLACE ALL OCCURRENCES OF `#` IN rv_name WITH '%23'.
+    REPLACE ALL OCCURRENCES OF `%` IN rv_name WITH '%25'.
+    REPLACE ALL OCCURRENCES OF `.` IN rv_name WITH '%2e'.
+    REPLACE ALL OCCURRENCES OF `<` IN rv_name WITH '%3c'.
+    REPLACE ALL OCCURRENCES OF `=` IN rv_name WITH '%3d'.
+    REPLACE ALL OCCURRENCES OF `>` IN rv_name WITH '%3e'.
+    REPLACE ALL OCCURRENCES OF `?` IN rv_name WITH '%3f'.
+  ENDMETHOD.
+ 
+ 
+  METHOD name_unescape.
+    " Replace all %xy with encoded character
+    rv_name = cl_http_utility=>unescape_url( iv_name ).
+  ENDMETHOD.
+ 
+ 
+  METHOD object_to_file.
+ 
+    DATA lv_obj_name TYPE string.
+    DATA lv_nb_of_slash TYPE string.
+ 
+    " Get escaped object name
+    lv_obj_name = to_lower( name_escape( is_item-obj_name ) ).
+ 
+    IF iv_extra IS INITIAL.
+      CONCATENATE lv_obj_name '.' is_item-obj_type INTO rv_filename.
+    ELSE.
+      CONCATENATE lv_obj_name '.' is_item-obj_type '.' iv_extra INTO rv_filename.
+    ENDIF.
+ 
+    IF iv_ext IS NOT INITIAL.
+      CONCATENATE rv_filename '.' iv_ext INTO rv_filename.
+    ENDIF.
+ 
+    " Get mapping specific to object type
+    TRY.
+        map_object_to_filename(
+          EXPORTING
+            is_item     = is_item
+          CHANGING
+            cv_filename = rv_filename ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+ 
+    " Handle namespaces
+    CREATE OBJECT go_aff_registry TYPE zcl_abapgit_aff_registry.
+ 
+    IF go_aff_registry->is_supported_object_type( is_item-obj_type ) = abap_true.
+      FIND ALL OCCURRENCES OF `/` IN rv_filename MATCH COUNT lv_nb_of_slash.
+      IF lv_nb_of_slash = 2.
+        REPLACE FIRST OCCURRENCE OF `/` IN rv_filename WITH `(`.
+        REPLACE `/` IN rv_filename WITH `)`.
+      ENDIF.
+    ELSE.
+      REPLACE ALL OCCURRENCES OF '/' IN rv_filename WITH '#'.
+    ENDIF.
+ 
+    TRANSLATE rv_filename TO LOWER CASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_filename_logic.clas.testclasses.abap.html b/src/objects/core/zcl_abapgit_filename_logic.clas.testclasses.abap.html new file mode 100644 index 00000000000..f9b30eac5a7 --- /dev/null +++ b/src/objects/core/zcl_abapgit_filename_logic.clas.testclasses.abap.html @@ -0,0 +1,1285 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_filename_logic.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_filename_logic.clas.testclasses.abap

+
+ +
+ 99.5% + Statements + 398/400 +
+ + +
+ 100% + Branches + 7/7 +
+ + +
+ 87.5% + Functions + 7/8 +
+ + +
+ 99.5% + Lines + 398/400 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +4011x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_run_checks DEFINITION DEFERRED.
+CLASS zcl_abapgit_filename_logic DEFINITION LOCAL FRIENDS ltcl_run_checks.
+ 
+CLASS lcl_memory_settings DEFINITION.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_persist_settings.
+ENDCLASS.
+ 
+CLASS lcl_memory_settings IMPLEMENTATION.
+  METHOD zif_abapgit_persist_settings~modify.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_persist_settings~read.
+    CREATE OBJECT ro_settings.
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_run_checks DEFINITION FOR TESTING RISK LEVEL HARMLESS
+  DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    DATA mo_dot TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+    METHODS:
+      setup,
+      is_obj_def_file FOR TESTING,
+      dot_abapgit FOR TESTING RAISING zcx_abapgit_exception,
+      file_to_object FOR TESTING RAISING zcx_abapgit_exception,
+      object_to_file FOR TESTING RAISING zcx_abapgit_exception,
+      file_to_object_package FOR TESTING RAISING zcx_abapgit_exception,
+      object_to_file_package FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_run_checks IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    DATA li_memory TYPE REF TO lcl_memory_settings.
+ 
+    " Assume for unit tests that starting folder is /src/ with prefix logic
+    mo_dot = zcl_abapgit_dot_abapgit=>build_default( ).
+ 
+    CREATE OBJECT li_memory.
+    zcl_abapgit_persist_injector=>set_settings( li_memory ).
+ 
+  ENDMETHOD.
+ 
+  METHOD dot_abapgit.
+ 
+    DATA lv_is_xml TYPE abap_bool.
+ 
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = zif_abapgit_definitions=>c_dot_abapgit
+        iv_path     = '/'
+        io_dot      = mo_dot
+      IMPORTING
+        ev_is_xml   = lv_is_xml ).
+ 
+    " .abapgit.xml is not considered an "XML file" since it does not represent an object (item)
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_false
+      act = lv_is_xml ).
+ 
+  ENDMETHOD.
+ 
+  METHOD is_obj_def_file.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_filename_logic=>is_obj_definition_file( zif_abapgit_definitions=>c_dot_abapgit )
+      exp = abap_false ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_filename_logic=>is_obj_definition_file( 'ztest.prog.xml' )
+      exp = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_filename_logic=>is_obj_definition_file( 'ztest.prog.json' )
+      exp = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_filename_logic=>is_obj_definition_file( 'ztest.prog.abap' )
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+  METHOD file_to_object.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lv_is_xml TYPE abap_bool.
+    DATA lv_is_json TYPE abap_bool.
+ 
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = 'zprogram.prog.abap'
+        iv_path     = '/src/'
+        iv_devclass = '$PACK'
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item
+        ev_is_xml   = lv_is_xml ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'PROG'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ZPROGRAM'
+      act = ls_item-obj_name ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_false
+      act = lv_is_xml ).
+ 
+    " Subpackage
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = 'zprogram.prog.abap'
+        iv_path     = '/src/subpack/'
+        iv_devclass = '$PACK'
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item
+        ev_is_xml   = lv_is_xml ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'PROG'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ZPROGRAM'
+      act = ls_item-obj_name ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_false
+      act = lv_is_xml ).
+ 
+    " XML
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = 'zprogram.prog.xml'
+        iv_path     = '/src/'
+        iv_devclass = '$PACK'
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item
+        ev_is_xml   = lv_is_xml ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'PROG'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ZPROGRAM'
+      act = ls_item-obj_name ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_true
+      act = lv_is_xml ).
+ 
+    " With special characters
+    zcl_abapgit_filename_logic=>file_to_object(
+     EXPORTING
+       iv_filename = 'ztest%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3dvc.prog.abap'
+       iv_path     = '/src/'
+       iv_devclass = '$PACK'
+       io_dot      = mo_dot
+     IMPORTING
+       es_item     = ls_item
+       ev_is_xml   = lv_is_xml ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'PROG'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ZTEST=========================VC'
+      act = ls_item-obj_name ).
+ 
+    zcl_abapgit_filename_logic=>file_to_object(
+     EXPORTING
+       iv_filename = 'zmime_%3c%3e_%3f.w3mi.jpg'
+       iv_path     = '/src/'
+       iv_devclass = '$PACK'
+       io_dot      = mo_dot
+     IMPORTING
+       es_item     = ls_item
+       ev_is_xml   = lv_is_xml ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'W3MI'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ZMIME_<>_?'
+      act = ls_item-obj_name ).
+ 
+    zcl_abapgit_filename_logic=>file_to_object(
+     EXPORTING
+       iv_filename = 'ztest(name).w3mi.data,json'
+       iv_path     = '/src/'
+       iv_devclass = '$PACK'
+       io_dot      = mo_dot
+     IMPORTING
+       es_item     = ls_item
+       ev_is_xml   = lv_is_xml ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'W3MI'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ZTEST(NAME)'
+      act = ls_item-obj_name ).
+ 
+    " AFF file
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = 'ztest.chko.json'
+        iv_path     = '/src/'
+        iv_devclass = '$PACK'
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item
+        ev_is_json  = lv_is_json ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'CHKO'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ZTEST'
+      act = ls_item-obj_name ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_true
+      act = lv_is_json ).
+ 
+ 
+    " AFF file with namespace
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = '(abcd)ztest.chko.json'
+        iv_path     = '/src/'
+        iv_devclass = '$PACK'
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item
+        ev_is_json  = lv_is_json ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'CHKO'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = '/ABCD/ZTEST'
+      act = ls_item-obj_name ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_true
+      act = lv_is_json ).
+ 
+  ENDMETHOD.
+ 
+  METHOD object_to_file.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lv_filename TYPE string.
+ 
+    ls_item-obj_type = 'PROG'.
+    ls_item-obj_name = 'ZPROGRAM'.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item = ls_item
+      iv_ext  = 'abap' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'zprogram.prog.abap'
+      act = lv_filename ).
+ 
+    " With namespace
+    ls_item-obj_type = 'PROG'.
+    ls_item-obj_name = '/TEST/ZPROGRAM'.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item = ls_item
+      iv_ext  = 'abap' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = '#test#zprogram.prog.abap'
+      act = lv_filename ).
+ 
+    " With extra extension
+    ls_item-obj_type = 'CLAS'.
+    ls_item-obj_name = 'ZCLASS'.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ls_item
+      iv_ext   = 'abap'
+      iv_extra = 'testclasses' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'zclass.clas.testclasses.abap'
+      act = lv_filename ).
+ 
+    " With special characters
+    ls_item-obj_type = 'PROG'.
+    ls_item-obj_name = 'ZTEST=========================VC'.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ls_item
+      iv_ext   = 'abap' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ztest%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3d%3dvc.prog.abap'
+      act = lv_filename ).
+ 
+    ls_item-obj_type = 'W3MI'.
+    ls_item-obj_name = 'ZMIME_<>_?'.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ls_item
+      iv_ext   = 'jpg' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'zmime_%3c%3e_%3f.w3mi.jpg'
+      act = lv_filename ).
+ 
+    ls_item-obj_type = 'W3MI'.
+    ls_item-obj_name = 'ZTEST(NAME)'.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ls_item
+      iv_ext   = 'json' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'ztest(name).w3mi.json'
+      act = lv_filename ).
+ 
+    " AFF object with namespace
+    ls_item-obj_type = 'CHKO'.
+    ls_item-obj_name = '/TEST/ZTEST'.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ls_item
+      iv_ext   = 'json' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = '(test)ztest.chko.json'
+      act = lv_filename ).
+ 
+  ENDMETHOD.
+ 
+  METHOD file_to_object_package.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+ 
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = 'package.devc.xml'
+        iv_path     = '/src/'
+        iv_devclass = '$PACK'
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'DEVC'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = '$PACK'
+      act = ls_item-obj_name ).
+ 
+    " Subpackage
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = 'package.devc.xml'
+        iv_path     = '/src/subpack/'
+        iv_devclass = '$PACK'
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'DEVC'
+      act = ls_item-obj_type ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = '$PACK_SUBPACK'
+      act = ls_item-obj_name ).
+ 
+  ENDMETHOD.
+ 
+  METHOD object_to_file_package.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lv_filename TYPE string.
+ 
+    ls_item-obj_type = 'DEVC'.
+    ls_item-obj_name = 'ZPACKAGE'.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item = ls_item
+      iv_ext  = 'xml' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'package.devc.xml'
+      act = lv_filename ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_folder_logic.clas.abap.html b/src/objects/core/zcl_abapgit_folder_logic.clas.abap.html new file mode 100644 index 00000000000..544debb4c93 --- /dev/null +++ b/src/objects/core/zcl_abapgit_folder_logic.clas.abap.html @@ -0,0 +1,823 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_folder_logic.clas.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_folder_logic.clas.abap

+
+ +
+ 88.21% + Statements + 217/246 +
+ + +
+ 60.86% + Branches + 14/23 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 88.21% + Lines + 217/246 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +2471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +14x +14x +1x +1x +1x +5x +5x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +37x +37x +17x +17x +17x +17x +17x +17x +17x +12x +12x +12x +12x +12x +3x +3x +12x +12x +12x +12x +  +  +  +  +  +  +  +12x +12x +12x +12x +  +  +  +  +12x +12x +12x +12x +12x +12x +  +  +  +12x +12x +8x +8x +12x +  +  +  +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +17x +11x +11x +6x +6x +6x +6x +6x +17x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_folder_logic DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS package_to_path
+      IMPORTING
+        !iv_top        TYPE devclass
+        !io_dot        TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_package    TYPE devclass
+      RETURNING
+        VALUE(rv_path) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS path_to_package
+      IMPORTING
+        !iv_top                  TYPE devclass
+        !io_dot                  TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_path                 TYPE string
+        !iv_create_if_not_exists TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rv_package)        TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_folder_logic .
+  PROTECTED SECTION.
+ 
+    METHODS get_parent
+      IMPORTING
+        !iv_top          TYPE devclass
+        !iv_package      TYPE devclass
+      RETURNING
+        VALUE(rv_parent) TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_devclass_info,
+        devclass  TYPE devclass,
+        namespace TYPE namespace,
+        parentcl  TYPE parentcl,
+      END OF ty_devclass_info .
+    TYPES:
+      ty_devclass_info_tt TYPE SORTED TABLE OF ty_devclass_info
+        WITH UNIQUE KEY devclass .
+    DATA mt_top_subpackages TYPE ty_devclass_info_tt .
+    DATA mt_parent TYPE ty_devclass_info_tt .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_folder_logic IMPLEMENTATION.
+ 
+ 
+  METHOD get_instance.
+    CREATE OBJECT ro_instance.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_parent.
+    DATA: ls_parent LIKE LINE OF mt_parent.
+ 
+    " Check that package is included in the TOP package hierarchy
+    IF mt_top_subpackages IS INITIAL.
+      mt_top_subpackages = zcl_abapgit_factory=>get_sap_package( iv_top )->list_subpackages( ).
+    ENDIF.
+ 
+    READ TABLE mt_top_subpackages TRANSPORTING NO FIELDS WITH KEY devclass = iv_package.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    "Determine Parent Package
+    READ TABLE mt_parent INTO ls_parent
+      WITH TABLE KEY devclass = iv_package.
+    IF sy-subrc <> 0.
+      rv_parent = zcl_abapgit_factory=>get_sap_package( iv_package )->read_parent( ).
+      ls_parent-devclass = iv_package.
+      ls_parent-parentcl = rv_parent.
+      INSERT ls_parent INTO TABLE mt_parent.
+    ELSE.
+      rv_parent = ls_parent-parentcl.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD package_to_path.
+ 
+    DATA: lv_len          TYPE i,
+          lv_path         TYPE string,
+          lv_message      TYPE string,
+          lv_parentcl     TYPE tdevc-parentcl,
+          lv_folder_logic TYPE string.
+ 
+    IF iv_top = iv_package.
+      rv_path = io_dot->get_starting_folder( ).
+    ELSE.
+      lv_parentcl = get_parent(
+        iv_top     = iv_top
+        iv_package = iv_package ).
+ 
+      " If the parent package can not be determined, we return an initial path and handle
+      " it outside of this class (in zcl_abapgit_file_status)
+      IF lv_parentcl IS NOT INITIAL.
+        lv_folder_logic = io_dot->get_folder_logic( ).
+        CASE lv_folder_logic.
+          WHEN zif_abapgit_dot_abapgit=>c_folder_logic-full.
+            lv_len = 0.
+            IF iv_package(1) = '$'.
+              lv_len = 1.
+            ENDIF.
+          WHEN zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+            lv_len = strlen( lv_parentcl ).
+ 
+            IF iv_package(lv_len) <> lv_parentcl.
+* if abapGit project is installed in package ZZZ, all subpackages should be named
+* ZZZ_something. This will define the folder name in the zip file to be "something",
+* similarily with online projects. Alternatively change to FULL folder logic
+              lv_message = 'PREFIX: Unexpected package naming (' && iv_package && ')'
+                           && 'you might switch the folder logic'.
+              zcx_abapgit_exception=>raise( lv_message ).
+            ENDIF.
+          WHEN zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+            lv_len = strlen( iv_top ).
+ 
+            IF iv_package(lv_len) <> iv_top.
+              lv_message = 'MIXED: Unexpected package naming (' && iv_package && ')'
+                           && 'you might switch the folder logic'.
+              zcx_abapgit_exception=>raise( lv_message ).
+            ENDIF.
+          WHEN OTHERS.
+            zcx_abapgit_exception=>raise( |Invalid folder logic: { lv_folder_logic }| ).
+        ENDCASE.
+ 
+        lv_path = iv_package+lv_len.
+        IF strlen( lv_path ) = 0.
+          zcx_abapgit_exception=>raise( |Folder logic: length = 0, parent: {
+            lv_parentcl }, child: { iv_package }| ).
+        ENDIF.
+ 
+        IF lv_path(1) = '_'.
+          lv_path = lv_path+1.
+        ENDIF.
+        IF strlen( lv_path ) = 0.
+          zcx_abapgit_exception=>raise( |Folder logic: length = 0, parent: {
+            lv_parentcl }, child: { iv_package }| ).
+        ENDIF.
+ 
+        TRANSLATE lv_path USING '/#'.
+        TRANSLATE lv_path TO LOWER CASE.
+        CONCATENATE lv_path '/' INTO lv_path.
+ 
+        rv_path = package_to_path( iv_top     = iv_top
+                                   io_dot     = io_dot
+                                   iv_package = lv_parentcl ).
+ 
+        CONCATENATE rv_path lv_path INTO rv_path.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD path_to_package.
+ 
+    DATA: lv_length               TYPE i,
+          lv_parent               TYPE devclass,
+          ls_package              TYPE scompkdtln,
+          lv_new                  TYPE string,
+          lv_path                 TYPE string,
+          lv_absolute_name        TYPE string,
+          lv_folder_logic         TYPE string,
+          lt_unique_package_names TYPE HASHED TABLE OF devclass WITH UNIQUE KEY table_line.
+ 
+    lv_length  = strlen( io_dot->get_starting_folder( ) ).
+    IF lv_length > strlen( iv_path ).
+* treat as not existing locally
+      RETURN.
+    ENDIF.
+    lv_path    = iv_path+lv_length.
+    lv_parent  = iv_top.
+    rv_package = iv_top.
+ 
+    " Automatically create package using minimal properties
+    " Details will be updated during deserialization
+    IF iv_create_if_not_exists = abap_true.
+      IF iv_top(1) = '$'.
+        zcl_abapgit_factory=>get_sap_package( iv_top )->create_local( ).
+      ELSE.
+        ls_package-devclass = iv_top.
+        ls_package-ctext = iv_top.
+        ls_package-as4user = sy-uname.
+        zcl_abapgit_factory=>get_sap_package( iv_top )->create( ls_package ).
+      ENDIF.
+    ENDIF.
+ 
+    INSERT iv_top INTO TABLE lt_unique_package_names.
+ 
+    WHILE lv_path CA '/'.
+      SPLIT lv_path AT '/' INTO lv_new lv_path.
+ 
+      lv_folder_logic = io_dot->get_folder_logic( ).
+      CASE lv_folder_logic.
+        WHEN zif_abapgit_dot_abapgit=>c_folder_logic-full.
+          lv_absolute_name = lv_new.
+          TRANSLATE lv_absolute_name USING '#/'.
+          IF iv_top(1) = '$'.
+            CONCATENATE '$' lv_absolute_name INTO lv_absolute_name.
+          ENDIF.
+        WHEN zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+          CONCATENATE rv_package '_' lv_new INTO lv_absolute_name.
+        WHEN zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+          CONCATENATE iv_top '_' lv_new INTO lv_absolute_name.
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( |Invalid folder logic: { lv_folder_logic }| ).
+      ENDCASE.
+ 
+      TRANSLATE lv_absolute_name TO UPPER CASE.
+ 
+      IF strlen( lv_absolute_name ) > 30.
+        zcx_abapgit_exception=>raise( |Package { lv_absolute_name } exceeds ABAP 30-characters name limit| ).
+      ENDIF.
+ 
+      rv_package = lv_absolute_name.
+      READ TABLE lt_unique_package_names TRANSPORTING NO FIELDS
+        WITH TABLE KEY table_line = rv_package.
+      IF sy-subrc = 0.
+        zcx_abapgit_exception=>raise( |Package { rv_package } has a subpackage with the same name| ).
+      ELSE.
+        INSERT rv_package INTO TABLE lt_unique_package_names.
+      ENDIF.
+ 
+      IF zcl_abapgit_factory=>get_sap_package( rv_package )->exists( ) = abap_false AND
+          iv_create_if_not_exists = abap_true.
+
+        zcl_abapgit_factory=>get_sap_package( lv_parent )->create_child( rv_package ).
+      ENDIF.
+ 
+      lv_parent = rv_package.
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap.html b/src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap.html new file mode 100644 index 00000000000..d2bfd02f3f0 --- /dev/null +++ b/src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap.html @@ -0,0 +1,1933 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_folder_logic.clas.testclasses.abap

+
+ +
+ 95.29% + Statements + 587/616 +
+ + +
+ 96.55% + Branches + 28/29 +
+ + +
+ 65% + Functions + 26/40 +
+ + +
+ 95.29% + Lines + 587/616 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +6171x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +  +15x +15x +15x +15x +15x +15x +15x +15x +15x +15x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +11x +11x +1x +1x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +1x +1x +  +  +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_folder_logic_helper DEFINITION FOR TESTING FINAL.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS: test
+      IMPORTING
+                iv_starting TYPE string
+                iv_top      TYPE devclass
+                iv_logic    TYPE string
+                iv_package  TYPE devclass
+                iv_path     TYPE string
+      RAISING   zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic_helper IMPLEMENTATION.
+ 
+  METHOD test.
+ 
+    DATA: lv_path    TYPE string,
+          lv_package TYPE devclass,
+          lo_dot     TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+ 
+    lo_dot = zcl_abapgit_dot_abapgit=>build_default( ).
+    lo_dot->set_starting_folder( iv_starting ).
+    lo_dot->set_folder_logic( iv_logic ).
+ 
+    lv_package = zcl_abapgit_folder_logic=>get_instance( )->path_to_package(
+      iv_top  = iv_top
+      io_dot  = lo_dot
+      iv_path = iv_path ).
+ 
+    lv_path = zcl_abapgit_folder_logic=>get_instance( )->package_to_path(
+      iv_top     = iv_top
+      io_dot     = lo_dot
+      iv_package = iv_package ).
+ 
+    IF lv_path IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Unable to determine path' ).
+    ENDIF.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_package
+      exp = iv_package ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_path
+      exp = iv_path ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic_package DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PUBLIC SECTION.
+    INTERFACES: zif_abapgit_sap_package.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic_package IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_sap_package~list_subpackages.
+    DATA lv_devclass TYPE devclass.
+    lv_devclass = '$TOP_BAR'.
+    INSERT lv_devclass INTO TABLE rt_list.
+    lv_devclass = '$TOP_FOO_BAR'.
+    INSERT lv_devclass INTO TABLE rt_list.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_parent.
+    rv_parentcl = '$TOP_FOO'.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_child.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~exists.
+    rv_bool = abap_true.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_local.
+    RETURN.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PUBLIC SECTION.
+    INTERFACES: zif_abapgit_sap_package.
+ 
+  PRIVATE SECTION.
+    CONSTANTS: c_top TYPE devclass VALUE '$TOP',
+               c_src TYPE string VALUE '/src/'.
+ 
+    METHODS:
+      setup,
+      prefix1 FOR TESTING RAISING zcx_abapgit_exception,
+      prefix2 FOR TESTING RAISING zcx_abapgit_exception,
+      prefix3 FOR TESTING RAISING zcx_abapgit_exception,
+      prefix_error1 FOR TESTING RAISING zcx_abapgit_exception,
+      mixed1 FOR TESTING RAISING zcx_abapgit_exception,
+      mixed2 FOR TESTING RAISING zcx_abapgit_exception,
+      mixed3 FOR TESTING RAISING zcx_abapgit_exception,
+      mixed_error1 FOR TESTING RAISING zcx_abapgit_exception,
+      full1 FOR TESTING RAISING zcx_abapgit_exception,
+      full2 FOR TESTING RAISING zcx_abapgit_exception,
+      full3 FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic IMPLEMENTATION.
+ 
+  " Test packages:
+  "
+  " $TOP
+  " > $TOP_FOO
+  " > > $TOP_BAR
+  " > > $TOP_FOO_BAR
+  "
+  " $FOOBAR (outside of $TOP)
+  METHOD zif_abapgit_sap_package~list_subpackages.
+    DATA lv_devclass TYPE devclass.
+    lv_devclass = '$TOP_BAR'.
+    INSERT lv_devclass INTO TABLE rt_list.
+    lv_devclass = '$TOP_FOO'.
+    INSERT lv_devclass INTO TABLE rt_list.
+    lv_devclass = '$TOP_FOO_BAR'.
+    INSERT lv_devclass INTO TABLE rt_list.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_parent.
+    rv_parentcl = c_top.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_child.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~exists.
+    rv_bool = abap_true.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_local.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD setup.
+ 
+    DATA lo_top_foo TYPE REF TO ltcl_folder_logic_package.
+ 
+    CREATE OBJECT lo_top_foo.
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = c_top
+                                           ii_sap_package = me ).
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '$TOP_FOO'
+                                           ii_sap_package = me ).
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '$FOOBAR'
+                                           ii_sap_package = me ).
+ 
+    " Add sub-packages of $TOP_FOO
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '$TOP_BAR'
+                                           ii_sap_package = lo_top_foo ).
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '$TOP_FOO_BAR'
+                                           ii_sap_package = lo_top_foo ).
+ 
+  ENDMETHOD.
+ 
+  METHOD prefix1.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_package  = c_top
+      iv_path     = c_src ).
+  ENDMETHOD.
+ 
+  METHOD prefix2.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_package  = '$TOP_FOO'
+      iv_path     = '/src/foo/' ).
+  ENDMETHOD.
+ 
+  METHOD prefix3.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_package  = '$TOP_FOO_BAR'
+      iv_path     = '/src/foo/bar/' ).
+  ENDMETHOD.
+ 
+  METHOD prefix_error1.
+* PREFIX mode, top package is $TOP, so all subpackages should be named $TOP_something
+    TRY.
+        ltcl_folder_logic_helper=>test(
+          iv_starting = c_src
+          iv_top      = c_top
+          iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+          iv_package  = '$FOOBAR'
+          iv_path     = '/src/' ).
+        cl_abap_unit_assert=>fail( 'Error expected' ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD mixed1.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+      iv_package  = c_top
+      iv_path     = c_src ).
+  ENDMETHOD.
+ 
+  METHOD mixed2.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+      iv_package  = '$TOP_FOO'
+      iv_path     = '/src/foo/' ).
+  ENDMETHOD.
+ 
+  METHOD mixed3.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+      iv_package  = '$TOP_BAR'
+      iv_path     = '/src/foo/bar/' ).
+  ENDMETHOD.
+ 
+  METHOD mixed_error1.
+* MIXED mode, top package is $TOP, so all subpackages should be named $TOP_something
+    TRY.
+        ltcl_folder_logic_helper=>test(
+          iv_starting = c_src
+          iv_top      = c_top
+          iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+          iv_package  = '$FOOBAR'
+          iv_path     = '/src/' ).
+        cl_abap_unit_assert=>fail( 'Error expected' ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD full1.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-full
+      iv_package  = c_top
+      iv_path     = c_src ).
+  ENDMETHOD.
+ 
+  METHOD full2.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-full
+      iv_package  = '$TOP_FOO'
+      iv_path     = '/src/top_foo/' ).
+  ENDMETHOD.
+ 
+  METHOD full3.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-full
+      iv_package  = '$TOP_BAR'
+      iv_path     = '/src/top_foo/top_bar/' ).
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic_namespaces DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PUBLIC SECTION.
+    INTERFACES: zif_abapgit_sap_package.
+ 
+  PRIVATE SECTION.
+    CONSTANTS: c_top TYPE devclass VALUE '/TEST/TOOLS',
+               c_src TYPE string VALUE '/src/'.
+ 
+    METHODS:
+      setup,
+      prefix1 FOR TESTING RAISING zcx_abapgit_exception,
+      prefix2 FOR TESTING RAISING zcx_abapgit_exception,
+      mixed1 FOR TESTING RAISING zcx_abapgit_exception,
+      mixed2 FOR TESTING RAISING zcx_abapgit_exception,
+      full1 FOR TESTING RAISING zcx_abapgit_exception,
+      full2 FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic_namespaces IMPLEMENTATION.
+ 
+  " Test packages:
+  "
+  " /TEST/TOOLS
+  " > /TEST/T1
+  " > /TEST/TOOLS_T1
+  METHOD zif_abapgit_sap_package~list_subpackages.
+    DATA lv_devclass TYPE devclass.
+    lv_devclass = '/TEST/T1'.
+    INSERT lv_devclass INTO TABLE rt_list.
+    lv_devclass = '/TEST/TOOLS_T1'.
+    INSERT lv_devclass INTO TABLE rt_list.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_parent.
+    rv_parentcl = c_top.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_child.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~exists.
+    rv_bool = abap_true.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_local.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD setup.
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = c_top
+                                           ii_sap_package = me ).
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '/TEST/T1'
+                                           ii_sap_package = me ).
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '/TEST/TOOLS_T1'
+                                           ii_sap_package = me ).
+ 
+  ENDMETHOD.
+ 
+  METHOD prefix1.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_package  = c_top
+      iv_path     = c_src ).
+  ENDMETHOD.
+ 
+  METHOD prefix2.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_package  = '/TEST/TOOLS_T1'
+      iv_path     = '/src/t1/' ).
+  ENDMETHOD.
+ 
+  METHOD mixed1.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+      iv_package  = c_top
+      iv_path     = c_src ).
+  ENDMETHOD.
+ 
+  METHOD mixed2.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+      iv_package  = '/TEST/TOOLS_T1'
+      iv_path     = '/src/t1/' ).
+  ENDMETHOD.
+ 
+  METHOD full1.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-full
+      iv_package  = c_top
+      iv_path     = c_src ).
+  ENDMETHOD.
+ 
+  METHOD full2.
+    ltcl_folder_logic_helper=>test(
+      iv_starting = c_src
+      iv_top      = c_top
+      iv_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-full
+      iv_package  = '/TEST/T1'
+      iv_path     = '/src/#test#t1/' ).
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic_no_parent DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PUBLIC SECTION.
+    INTERFACES: zif_abapgit_sap_package.
+ 
+  PRIVATE SECTION.
+    CONSTANTS: c_top TYPE devclass VALUE '$TOP',
+               c_src TYPE string VALUE '/src/'.
+ 
+    DATA mo_dot TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+    METHODS:
+      setup,
+      test IMPORTING iv_folder_logic TYPE string RAISING zcx_abapgit_exception,
+      prefix FOR TESTING RAISING zcx_abapgit_exception,
+      mixed FOR TESTING RAISING zcx_abapgit_exception,
+      full FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_folder_logic_no_parent IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_subpackages.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_parent.
+    rv_parentcl = ''.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_child.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~exists.
+    rv_bool = abap_true.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_local.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD setup.
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = c_top
+                                           ii_sap_package = me ).
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '$FOOBAR'
+                                           ii_sap_package = me ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test.
+ 
+    DATA lv_path TYPE string.
+ 
+    mo_dot = zcl_abapgit_dot_abapgit=>build_default( ).
+    mo_dot->set_starting_folder( c_src ).
+    mo_dot->set_folder_logic( iv_folder_logic ).
+ 
+    lv_path = zcl_abapgit_folder_logic=>get_instance( )->package_to_path(
+      iv_top     = c_top
+      io_dot     = mo_dot
+      iv_package = '$FOOBAR' ).
+ 
+    " If package is not in the package hierarchy i.e. a sub-package of $TOP, then return no path
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_path
+      exp = '' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD prefix.
+    test( zif_abapgit_dot_abapgit=>c_folder_logic-prefix ).
+  ENDMETHOD.
+ 
+  METHOD mixed.
+    test( zif_abapgit_dot_abapgit=>c_folder_logic-mixed ).
+  ENDMETHOD.
+ 
+  METHOD full.
+    test( zif_abapgit_dot_abapgit=>c_folder_logic-full ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_item_graph.clas.abap.html b/src/objects/core/zcl_abapgit_item_graph.clas.abap.html new file mode 100644 index 00000000000..e87ff07ecbe --- /dev/null +++ b/src/objects/core/zcl_abapgit_item_graph.clas.abap.html @@ -0,0 +1,403 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_item_graph.clas.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_item_graph.clas.abap

+
+ +
+ 100% + Statements + 106/106 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 106/106 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +1071x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +33x +33x +33x +33x +33x +33x +33x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +44x +44x +44x +44x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +44x +44x +44x +44x +44x +44x +44x +44x +44x +44x +1x + 
CLASS zcl_abapgit_item_graph DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_items TYPE zif_abapgit_definitions=>ty_items_tt .
+    METHODS add_edge
+      IMPORTING
+        !is_from TYPE zif_abapgit_definitions=>ty_item
+        !is_to   TYPE zif_abapgit_definitions=>ty_item .
+    METHODS has_vertices
+      RETURNING
+        VALUE(rv_bool) TYPE abap_bool .
+    METHODS get_next
+      IMPORTING
+        !ii_log        TYPE REF TO zif_abapgit_log
+      RETURNING
+        VALUE(rs_item) TYPE zif_abapgit_definitions=>ty_item .
+  PRIVATE SECTION.
+    TYPES: BEGIN OF ty_edge,
+             from TYPE zif_abapgit_definitions=>ty_item,
+             to   TYPE zif_abapgit_definitions=>ty_item,
+           END OF ty_edge.
+ 
+    DATA mt_vertices TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_item WITH DEFAULT KEY.
+    DATA mt_edges TYPE STANDARD TABLE OF ty_edge WITH DEFAULT KEY
+                       WITH NON-UNIQUE SORTED KEY sec_key
+                       COMPONENTS to.
+    DATA mv_warning TYPE abap_bool.
+ 
+    METHODS remove_vertex IMPORTING iv_index TYPE i.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ITEM_GRAPH IMPLEMENTATION.
+ 
+ 
+  METHOD add_edge.
+    DATA ls_edge LIKE LINE OF mt_edges.
+    ASSERT is_from IS NOT INITIAL.
+    ASSERT is_to IS NOT INITIAL.
+    ls_edge-from = is_from.
+    ls_edge-to   = is_to.
+    APPEND ls_edge TO mt_edges.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    INSERT LINES OF it_items INTO TABLE mt_vertices.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_next.
+* find a vertex with no inbound edges, if it does not exist pick anything
+ 
+    DATA ls_vertex LIKE LINE OF mt_vertices.
+    DATA lv_index  TYPE i.
+ 
+    LOOP AT mt_vertices INTO ls_vertex.
+      lv_index = sy-tabix.
+      READ TABLE mt_edges WITH KEY sec_key COMPONENTS
+        to-obj_type = ls_vertex-obj_type
+        to-obj_name = ls_vertex-obj_name
+        TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        remove_vertex( lv_index ).
+        rs_item = ls_vertex.
+        RETURN.
+      ENDIF.
+    ENDLOOP.
+ 
+    IF mv_warning = abap_false.
+* only issue the warning once per graph
+      ii_log->add_warning( |Cycle detected in item graph| ).
+      mv_warning = abap_true.
+    ENDIF.
+ 
+    READ TABLE mt_vertices INTO rs_item INDEX 1.
+    ASSERT sy-subrc = 0.
+    remove_vertex( 1 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD has_vertices.
+    rv_bool = boolc( lines( mt_vertices ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_vertex.
+    DATA ls_vertex LIKE LINE OF mt_vertices.
+ 
+    READ TABLE mt_vertices INDEX iv_index INTO ls_vertex.
+    ASSERT sy-subrc = 0.
+ 
+    DELETE mt_vertices INDEX iv_index.
+    DELETE mt_edges WHERE
+      from-obj_type = ls_vertex-obj_type AND
+      from-obj_name = ls_vertex-obj_name.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_item_graph.clas.testclasses.abap.html b/src/objects/core/zcl_abapgit_item_graph.clas.testclasses.abap.html new file mode 100644 index 00000000000..ef5dee82590 --- /dev/null +++ b/src/objects/core/zcl_abapgit_item_graph.clas.testclasses.abap.html @@ -0,0 +1,265 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_item_graph.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_item_graph.clas.testclasses.abap

+
+ +
+ 100% + Statements + 60/60 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 60/60 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +611x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS basic FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD basic.
+ 
+    DATA lo_graph TYPE REF TO zcl_abapgit_item_graph.
+    DATA li_log   TYPE REF TO zif_abapgit_log.
+    DATA lt_items TYPE zif_abapgit_definitions=>ty_items_tt.
+    DATA ls_item1 LIKE LINE OF lt_items.
+    DATA ls_item2 LIKE LINE OF lt_items.
+    DATA ls_next LIKE LINE OF lt_items.
+ 
+    CREATE OBJECT li_log TYPE zcl_abapgit_log.
+ 
+    ls_item1-obj_type = 'TYPE'.
+    ls_item1-obj_type = '1111'.
+    APPEND ls_item1 TO lt_items.
+ 
+    ls_item2-obj_type = 'TYPE'.
+    ls_item2-obj_type = '2222'.
+    APPEND ls_item2 TO lt_items.
+ 
+    CREATE OBJECT lo_graph EXPORTING it_items = lt_items.
+ 
+    lo_graph->add_edge(
+      is_from = ls_item1
+      is_to   = ls_item2 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_graph->has_vertices( )
+      exp = abap_true ).
+ 
+    ls_next = lo_graph->get_next( li_log ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_next-obj_name
+      exp = ls_item1-obj_name ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_graph->has_vertices( )
+      exp = abap_true ).
+ 
+    ls_next = lo_graph->get_next( li_log ).
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_next-obj_name
+      exp = ls_item2-obj_name ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_graph->has_vertices( )
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_objects_files.clas.abap.html b/src/objects/core/zcl_abapgit_objects_files.clas.abap.html new file mode 100644 index 00000000000..4f64abf0045 --- /dev/null +++ b/src/objects/core/zcl_abapgit_objects_files.clas.abap.html @@ -0,0 +1,1531 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_objects_files.clas.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_objects_files.clas.abap

+
+ +
+ 85.26% + Statements + 411/482 +
+ + +
+ 60% + Branches + 6/10 +
+ + +
+ 55.55% + Functions + 5/9 +
+ + +
+ 85.26% + Lines + 411/482 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +4831x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +5x +5x +5x +5x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +  +  +6x +6x +6x +1x + 
CLASS zcl_abapgit_objects_files DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !is_item TYPE zif_abapgit_definitions=>ty_item
+        !iv_path TYPE string OPTIONAL .
+    METHODS add_string
+      IMPORTING
+        !iv_extra  TYPE clike OPTIONAL
+        !iv_ext    TYPE string
+        !iv_string TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_string
+      IMPORTING
+        !iv_extra        TYPE clike OPTIONAL
+        !iv_ext          TYPE string
+      RETURNING
+        VALUE(rv_string) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_xml
+      IMPORTING
+        !iv_extra     TYPE clike OPTIONAL
+        !ii_xml       TYPE REF TO zif_abapgit_xml_output
+        !iv_normalize TYPE abap_bool DEFAULT abap_true
+        !is_metadata  TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_xml
+      IMPORTING
+        !iv_extra     TYPE clike OPTIONAL
+      RETURNING
+        VALUE(ri_xml) TYPE REF TO zif_abapgit_xml_input
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_abap
+      IMPORTING
+        !iv_extra      TYPE clike OPTIONAL
+        !iv_error      TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rt_abap) TYPE abaptxt255_tab
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_abap
+      IMPORTING
+        !iv_extra TYPE clike OPTIONAL
+        !it_abap  TYPE STANDARD TABLE
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add
+      IMPORTING
+        !is_file TYPE zif_abapgit_git_definitions=>ty_file .
+    METHODS add_raw
+      IMPORTING
+        !iv_extra TYPE clike OPTIONAL
+        !iv_ext   TYPE string
+        !iv_data  TYPE xstring.
+    METHODS read_raw
+      IMPORTING
+        !iv_extra      TYPE clike OPTIONAL
+        !iv_ext        TYPE string
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_files
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    METHODS set_files
+      IMPORTING
+        !it_files TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    METHODS get_accessed_files
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt .
+    METHODS contains_file
+      IMPORTING
+        !iv_extra         TYPE clike OPTIONAL
+        !iv_ext           TYPE string
+      RETURNING
+        VALUE(rv_present) TYPE abap_bool .
+    METHODS get_file_pattern
+      RETURNING
+        VALUE(rv_pattern) TYPE string .
+    METHODS is_json_metadata
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool.
+    METHODS add_i18n_file
+      IMPORTING
+        !ii_i18n_file TYPE REF TO zif_abapgit_i18n_file
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_i18n_files
+      RETURNING
+        VALUE(rt_i18n_files) TYPE zif_abapgit_i18n_file=>ty_table_of
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+ 
+    METHODS read_file
+      IMPORTING
+        !iv_filename   TYPE string
+        !iv_error      TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rv_data) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    DATA ms_item TYPE zif_abapgit_definitions=>ty_item .
+    DATA mt_accessed_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt .
+    DATA mt_files TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    DATA mv_path TYPE string .
+ 
+    METHODS mark_accessed
+      IMPORTING
+        !iv_path TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_file TYPE zif_abapgit_git_definitions=>ty_file-filename.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_OBJECTS_FILES IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+    APPEND is_file TO mt_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD add_abap.
+ 
+    DATA: lv_source TYPE string,
+          ls_file   TYPE zif_abapgit_git_definitions=>ty_file.
+ 
+ 
+    CONCATENATE LINES OF it_abap INTO lv_source SEPARATED BY cl_abap_char_utilities=>newline.
+* when editing files via eg. GitHub web interface it adds a newline at end of file
+    lv_source = lv_source && cl_abap_char_utilities=>newline.
+ 
+    ls_file-path = '/'.
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = 'abap' ).
+    ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_source ).
+ 
+    APPEND ls_file TO mt_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_i18n_file.
+
+    DATA ls_file TYPE zif_abapgit_git_definitions=>ty_file.
+
+    ls_file-data = ii_i18n_file->render( ).
+    IF ls_file-data IS INITIAL.
+      RETURN. " Don't add empty files
+    ENDIF.
+
+    ls_file-path     = '/'.
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = |i18n.{ ii_i18n_file->lang( ) }|
+      iv_ext   = ii_i18n_file->ext( ) ).
+
+    APPEND ls_file TO mt_files.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_raw.
+ 
+    DATA: ls_file TYPE zif_abapgit_git_definitions=>ty_file.
+ 
+    ls_file-path     = '/'.
+    ls_file-data     = iv_data.
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+ 
+    APPEND ls_file TO mt_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD add_string.
+
+    DATA: ls_file TYPE zif_abapgit_git_definitions=>ty_file.
+
+
+    ls_file-path = '/'.
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+    ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( iv_string ).
+
+    APPEND ls_file TO mt_files.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_xml.
+
+    DATA: lv_xml  TYPE string,
+          ls_file TYPE zif_abapgit_git_definitions=>ty_file.
+
+    lv_xml = ii_xml->render( iv_normalize = iv_normalize
+                             is_metadata = is_metadata ).
+    ls_file-path = '/'.
+
+    ls_file-filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = 'xml' ).
+
+    REPLACE FIRST OCCURRENCE
+      OF REGEX '<\?xml version="1\.0" encoding="[\w-]+"\?>'
+      IN lv_xml
+      WITH '<?xml version="1.0" encoding="utf-8"?>'.
+    ASSERT sy-subrc = 0.
+
+    ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_xml ).
+
+    APPEND ls_file TO mt_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    ms_item = is_item.
+    mv_path = iv_path.
+  ENDMETHOD.
+ 
+ 
+  METHOD contains_file.
+    DATA: lv_filename TYPE string.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+ 
+    IF mv_path IS NOT INITIAL.
+      READ TABLE mt_files TRANSPORTING NO FIELDS
+          WITH KEY file_path
+          COMPONENTS path     = mv_path
+                     filename = lv_filename.
+    ELSE.
+      READ TABLE mt_files TRANSPORTING NO FIELDS
+          WITH KEY file
+          COMPONENTS filename = lv_filename.
+    ENDIF.
+ 
+    IF sy-subrc = 0.
+      rv_present = abap_true.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_accessed_files.
+    rt_files = mt_accessed_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_files.
+    rt_files = mt_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_file_pattern.
+    rv_pattern = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_ext   = '*' ).
+    " Escape special characters for use with 'covers pattern' (CP)
+    REPLACE ALL OCCURRENCES OF '#' IN rv_pattern WITH '##'.
+    REPLACE ALL OCCURRENCES OF '+' IN rv_pattern WITH '#+'.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_json_metadata.
+ 
+    DATA lv_pattern TYPE string.
+ 
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF mt_files.
+ 
+    lv_pattern = |*.{ to_lower( ms_item-obj_type ) }.json|.
+ 
+    LOOP AT mt_files ASSIGNING <ls_file> WHERE filename CP lv_pattern.
+      rv_result = abap_true.
+      EXIT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD mark_accessed.
+ 
+    FIELD-SYMBOLS <ls_accessed> LIKE LINE OF mt_accessed_files.
+ 
+    READ TABLE mt_accessed_files TRANSPORTING NO FIELDS
+      WITH KEY path = iv_path filename = iv_file.
+    IF sy-subrc > 0. " Not found ? -> Add
+      APPEND INITIAL LINE TO mt_accessed_files ASSIGNING <ls_accessed>.
+      <ls_accessed>-path     = iv_path.
+      <ls_accessed>-filename = iv_file.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_abap.
+ 
+    DATA: lv_filename TYPE string,
+          lv_data     TYPE xstring,
+          lv_abap     TYPE string.
+ 
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = 'abap' ).
+ 
+    lv_data = read_file( iv_filename = lv_filename
+                         iv_error    = iv_error ).
+ 
+    IF lv_data IS INITIAL. " Post-handling of iv_error = false
+      RETURN.
+    ENDIF.
+ 
+    lv_abap = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+ 
+    SPLIT lv_abap AT cl_abap_char_utilities=>newline INTO TABLE rt_abap.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_file.
+ 
+    FIELD-SYMBOLS <ls_file>     LIKE LINE OF mt_files.
+ 
+    IF mv_path IS NOT INITIAL.
+      READ TABLE mt_files ASSIGNING <ls_file>
+          WITH KEY file_path
+          COMPONENTS path     = mv_path
+                     filename = iv_filename.
+    ELSE.
+      READ TABLE mt_files ASSIGNING <ls_file>
+          WITH KEY file
+          COMPONENTS filename = iv_filename.
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      IF iv_error = abap_true.
+        zcx_abapgit_exception=>raise( |File not found: { iv_filename }| ).
+      ELSE.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    " Update access table
+    mark_accessed(
+      iv_path = <ls_file>-path
+      iv_file = <ls_file>-filename ).
+ 
+    rv_data = <ls_file>-data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_i18n_files.
+ 
+    DATA lv_lang TYPE laiso.
+    DATA lv_ext TYPE string.
+    DATA lo_po TYPE REF TO zcl_abapgit_po_file.
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF mt_files.
+ 
+    LOOP AT mt_files ASSIGNING <ls_file>.
+ 
+      " TODO: Maybe this should be in zcl_abapgit_filename_logic
+      FIND FIRST OCCURRENCE OF REGEX 'i18n\.([^.]{2})\.([^.]+)$' IN <ls_file>-filename SUBMATCHES lv_lang lv_ext.
+      CHECK sy-subrc = 0.
+ 
+      CASE lv_ext.
+        WHEN 'po'.
+          CREATE OBJECT lo_po EXPORTING iv_lang = lv_lang.
+          lo_po->parse( <ls_file>-data ).
+          APPEND lo_po TO rt_i18n_files.
+        WHEN OTHERS.
+          CONTINUE. " Unsupported i18n file type
+      ENDCASE.
+ 
+      mark_accessed(
+        iv_path = <ls_file>-path
+        iv_file = <ls_file>-filename ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_raw.
+ 
+    DATA: lv_filename TYPE string.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+ 
+    rv_data = read_file( lv_filename ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_string.
+ 
+    DATA: lv_filename TYPE string,
+          lv_data     TYPE xstring.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = iv_ext ).
+ 
+    lv_data = read_file( lv_filename ).
+ 
+    rv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_xml.
+ 
+    DATA: lv_filename TYPE string,
+          lv_data     TYPE xstring,
+          lv_xml      TYPE string.
+ 
+    lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+      is_item  = ms_item
+      iv_extra = iv_extra
+      iv_ext   = 'xml' ).
+ 
+    lv_data = read_file( lv_filename ).
+ 
+    lv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+ 
+    CREATE OBJECT ri_xml
+      TYPE zcl_abapgit_xml_input
+      EXPORTING
+        iv_xml      = lv_xml
+        iv_filename = lv_filename.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_files.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files.
+ 
+    CLEAR mt_files.
+ 
+    " Set only files matching the pattern for this object
+    " If a path has been defined in the constructor, then the path has to match, too
+    LOOP AT it_files ASSIGNING <ls_file> WHERE filename CP get_file_pattern( ).
+      IF mv_path IS INITIAL.
+        INSERT <ls_file> INTO TABLE mt_files.
+      ELSEIF mv_path = <ls_file>-path.
+        INSERT <ls_file> INTO TABLE mt_files.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_objects_files.clas.testclasses.abap.html b/src/objects/core/zcl_abapgit_objects_files.clas.testclasses.abap.html new file mode 100644 index 00000000000..175e28155a9 --- /dev/null +++ b/src/objects/core/zcl_abapgit_objects_files.clas.testclasses.abap.html @@ -0,0 +1,754 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_objects_files.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_objects_files.clas.testclasses.abap

+
+ +
+ 100% + Statements + 223/223 +
+ + +
+ 100% + Branches + 7/7 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 223/223 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +2241x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_objects_files DEFINITION FOR TESTING
+  DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA: mo_cut TYPE REF TO zcl_abapgit_objects_files.
+ 
+    METHODS setup
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS get_program_data
+      IMPORTING
+        iv_line_break    TYPE clike
+      RETURNING
+        VALUE(rv_result) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS get_xml_data
+      RETURNING
+        VALUE(rv_result) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS get_expected_abap_source
+      RETURNING
+        VALUE(rt_result) TYPE abaptxt255_tab.
+ 
+    METHODS read_abap FOR TESTING RAISING cx_static_check.
+    METHODS read_xml FOR TESTING RAISING cx_static_check.
+    METHODS get_file_pattern FOR TESTING.
+    METHODS is_json_metadata FOR TESTING.
+    METHODS is_not_json_metadata FOR TESTING.
+    METHODS read_i18n_files FOR TESTING RAISING cx_static_check.
+ENDCLASS.
+ 
+CLASS ltcl_objects_files IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    DATA lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    DATA ls_item  TYPE zif_abapgit_definitions=>ty_item.
+    FIELD-SYMBOLS: <ls_files> LIKE LINE OF lt_files.
+ 
+    " filenames are lower case
+    APPEND INITIAL LINE TO lt_files ASSIGNING <ls_files>.
+    <ls_files>-filename = 'zlf.prog.abap'.
+    <ls_files>-data = get_program_data( cl_abap_char_utilities=>newline ).
+    APPEND INITIAL LINE TO lt_files ASSIGNING <ls_files>.
+    <ls_files>-filename = 'zlf.prog.xml'.
+    <ls_files>-data = get_xml_data( ).
+    APPEND INITIAL LINE TO lt_files ASSIGNING <ls_files>.
+    <ls_files>-filename = 'zlf.prog.i18n.de.po'.
+    APPEND INITIAL LINE TO lt_files ASSIGNING <ls_files>.
+    <ls_files>-filename = 'zlf.prog.i18n.es.po'.
+    APPEND INITIAL LINE TO lt_files ASSIGNING <ls_files>.
+    <ls_files>-filename = 'zlf.prog.i18n.cz.other'.
+ 
+    " object type and name are upper case
+    ls_item-obj_type = 'PROG'.
+    ls_item-obj_name = 'ZLF'.
+    CREATE OBJECT mo_cut
+      EXPORTING
+        is_item = ls_item.
+    mo_cut->set_files( lt_files ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_program_data.
+    DATA: lv_abap_source TYPE string.
+ 
+    CONCATENATE 'My first program' iv_line_break 'has syntax errors' INTO lv_abap_source.
+    rv_result = zcl_abapgit_convert=>string_to_xstring_utf8( lv_abap_source ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_xml_data.
+    DATA: lv_xml_source TYPE string.
+ 
+    lv_xml_source = '<?xml version="1.0" encoding="utf-8"?>' &&
+      '<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">' &&
+        '<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">' &&
+          '<asx:values>' &&
+            '<PROGDIR>' &&
+              '<NAME>ZLF</NAME>' &&
+              '<SUBC>1</SUBC>' &&
+              '<RLOAD>E</RLOAD>' &&
+              '<FIXPT>X</FIXPT>' &&
+              '<UCCHECK>X</UCCHECK>' &&
+            '</PROGDIR>' &&
+          '</asx:values>' &&
+        '</asx:abap>' &&
+      '</abapGit>'.
+ 
+    rv_result = zcl_abapgit_convert=>string_to_xstring_utf8( lv_xml_source ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_expected_abap_source.
+ 
+    APPEND 'My first program' TO rt_result.
+    APPEND 'has syntax errors' TO rt_result.
+ 
+  ENDMETHOD.
+ 
+  METHOD read_abap.
+ 
+    cl_abap_unit_assert=>assert_equals( exp = get_expected_abap_source( )
+      act = mo_cut->read_abap( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD read_xml.
+    DATA: BEGIN OF ls_exp_prog_metadata,
+            name       TYPE progname VALUE 'ZLF',
+            subc(1)    TYPE c VALUE '1',
+            rload(1)   TYPE c VALUE 'E',
+            fixpt(1)   TYPE c VALUE 'X',
+            uccheck(1) TYPE c VALUE 'X',
+          END OF ls_exp_prog_metadata,
+          ls_act_prog_metadata LIKE ls_exp_prog_metadata,
+          ls_exp_metadata      TYPE zif_abapgit_definitions=>ty_metadata,
+          li_xml               TYPE REF TO zif_abapgit_xml_input.
+ 
+    ls_exp_metadata-class = 'LCL_OBJECT_PROG'.
+    ls_exp_metadata-version = 'v1.0.0'.
+ 
+    li_xml = mo_cut->read_xml( ).
+    li_xml->read( EXPORTING iv_name = 'PROGDIR' CHANGING cg_data = ls_act_prog_metadata ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = ls_exp_prog_metadata
+      act = ls_act_prog_metadata ).
+    cl_abap_unit_assert=>assert_equals( exp = ls_exp_metadata
+      act = mo_cut->read_xml( )->get_metadata( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_file_pattern.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+ 
+    " filenames are lower case
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'zlf.prog.*'
+      act = mo_cut->get_file_pattern( ) ).
+ 
+    " object type and name are upper case
+    ls_item-obj_type = 'PROG'.
+    ls_item-obj_name = '/TEST/ZLF'.
+ 
+    CREATE OBJECT mo_cut
+      EXPORTING
+        is_item = ls_item.
+ 
+    " filenames are lower case
+    cl_abap_unit_assert=>assert_equals(
+      exp = '##test##zlf.prog.*'
+      act = mo_cut->get_file_pattern( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD is_json_metadata.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lv_data TYPE xstring.
+ 
+    " object type and name are upper case
+    ls_item-obj_type = 'CHKO'.
+    ls_item-obj_name = 'Z_AFF_EXAMPLE_CHKO'.
+ 
+    CREATE OBJECT mo_cut
+      EXPORTING
+        is_item = ls_item.
+ 
+    mo_cut->add_raw( iv_data = lv_data
+                     iv_ext  = 'json' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_true
+      act = mo_cut->is_json_metadata( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD is_not_json_metadata.
+ 
+    " checks PROG ZLF (see setup)
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_false
+      act = mo_cut->is_json_metadata( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD read_i18n_files.
+ 
+    DATA lt_i18n_files TYPE zif_abapgit_i18n_file=>ty_table_of.
+    DATA li_f LIKE LINE OF lt_i18n_files.
+ 
+    lt_i18n_files = mo_cut->read_i18n_files( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_i18n_files )
+      exp = 2 ).
+ 
+    LOOP AT lt_i18n_files INTO li_f.
+      CASE sy-tabix.
+        WHEN 1.
+          cl_abap_unit_assert=>assert_equals(
+            act = li_f->lang( )
+            exp = 'de' ).
+        WHEN 2.
+          cl_abap_unit_assert=>assert_equals(
+            act = li_f->lang( )
+            exp = 'es' ).
+      ENDCASE.
+    ENDLOOP.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mo_cut->get_accessed_files( ) )
+      exp = 2 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_serialize.clas.abap.html b/src/objects/core/zcl_abapgit_serialize.clas.abap.html new file mode 100644 index 00000000000..156ede47c01 --- /dev/null +++ b/src/objects/core/zcl_abapgit_serialize.clas.abap.html @@ -0,0 +1,2191 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_serialize.clas.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_serialize.clas.abap

+
+ +
+ 47% + Statements + 330/702 +
+ + +
+ 33.33% + Branches + 3/9 +
+ + +
+ 0% + Functions + 0/10 +
+ + +
+ 47% + Lines + 330/702 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +7031x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_serialize DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !io_dot_abapgit    TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL
+        !is_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS on_end_of_task
+      IMPORTING
+        !p_task TYPE clike ##NEEDED.
+    METHODS serialize
+      IMPORTING
+        !iv_package          TYPE devclass OPTIONAL
+        !it_tadir            TYPE zif_abapgit_definitions=>ty_tadir_tt
+        !ii_log              TYPE REF TO zif_abapgit_log OPTIONAL
+        !iv_force_sequential TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_files)      TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS files_local
+      IMPORTING
+        !iv_package     TYPE devclass
+        !ii_log         TYPE REF TO zif_abapgit_log
+        !it_filter      TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL
+        !ii_data_config TYPE REF TO zif_abapgit_data_config OPTIONAL
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_unsupported_count,
+        obj_type TYPE tadir-object,
+        obj_name TYPE tadir-obj_name,
+        count    TYPE i,
+      END OF ty_unsupported_count .
+    TYPES:
+      ty_unsupported_count_tt TYPE HASHED TABLE OF ty_unsupported_count WITH UNIQUE KEY obj_type .
+    TYPES:
+      ty_char32 TYPE c LENGTH 32 .
+ 
+    CLASS-DATA gv_max_threads TYPE i .
+    DATA mt_files TYPE zif_abapgit_definitions=>ty_files_item_tt .
+    DATA mv_free TYPE i .
+    DATA mi_log TYPE REF TO zif_abapgit_log .
+    DATA mv_group TYPE rzlli_apcl .
+    DATA mo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit.
+    DATA ms_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings.
+    DATA ms_i18n_params TYPE zif_abapgit_definitions=>ty_i18n_params.
+ 
+    METHODS add_apack
+      IMPORTING
+        !iv_package TYPE devclass
+      CHANGING
+        !ct_files   TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_data
+      IMPORTING
+        !ii_data_config TYPE REF TO zif_abapgit_data_config
+      CHANGING
+        !ct_files       TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_dot_abapgit
+      CHANGING
+        !ct_files TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_to_return
+      IMPORTING
+        !iv_path      TYPE string
+        !is_file_item TYPE zif_abapgit_objects=>ty_serialization .
+    METHODS run_parallel
+      IMPORTING
+        !is_tadir TYPE zif_abapgit_definitions=>ty_tadir
+        !iv_task  TYPE ty_char32
+      RAISING
+        zcx_abapgit_exception .
+    METHODS run_sequential
+      IMPORTING
+        !is_tadir TYPE zif_abapgit_definitions=>ty_tadir
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_objects
+      IMPORTING
+        !iv_package     TYPE devclass
+        !ii_log         TYPE REF TO zif_abapgit_log
+        !it_filter      TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL
+      CHANGING
+        VALUE(ct_files) TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS determine_max_threads
+      IMPORTING
+        !iv_force_sequential TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_threads)    TYPE i
+      RAISING
+        zcx_abapgit_exception .
+    METHODS filter_unsupported_objects
+      CHANGING
+        !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt .
+    METHODS filter_ignored_objects
+      IMPORTING
+        !iv_package TYPE devclass
+      CHANGING
+        !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+    CLASS-METHODS determine_i18n_params
+      IMPORTING
+        !io_dot TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_main_language_only TYPE abap_bool
+      RETURNING
+        VALUE(rs_i18n_params) TYPE zif_abapgit_definitions=>ty_i18n_params
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_serialize IMPLEMENTATION.
+ 
+ 
+  METHOD add_apack.
+
+    DATA ls_apack_file TYPE zif_abapgit_git_definitions=>ty_file.
+
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF ct_files.
+
+
+    ls_apack_file = zcl_abapgit_apack_helper=>to_file( iv_package ).
+    IF ls_apack_file IS NOT INITIAL.
+      APPEND INITIAL LINE TO ct_files ASSIGNING <ls_file>.
+      <ls_file>-file = ls_apack_file.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_data.
+
+    DATA lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    DATA ls_file LIKE LINE OF lt_files.
+
+    FIELD-SYMBOLS <ls_return> LIKE LINE OF ct_files.
+
+    IF ii_data_config IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    lt_files = ii_data_config->to_json( ).
+    LOOP AT lt_files INTO ls_file.
+      APPEND INITIAL LINE TO ct_files ASSIGNING <ls_return>.
+      <ls_return>-file = ls_file.
+
+      " Derive object from config filename (namespace + escaping)
+      zcl_abapgit_filename_logic=>file_to_object(
+        EXPORTING
+          iv_filename = <ls_return>-file-filename
+          iv_path     = <ls_return>-file-path
+          io_dot      = mo_dot_abapgit
+        IMPORTING
+          es_item     = <ls_return>-item ).
+
+      <ls_return>-item-obj_type = zif_abapgit_data_config=>c_data_type-tabu. " todo
+    ENDLOOP.
+
+    lt_files = zcl_abapgit_data_factory=>get_serializer( )->serialize( ii_data_config ).
+    LOOP AT lt_files INTO ls_file.
+      APPEND INITIAL LINE TO ct_files ASSIGNING <ls_return>.
+      <ls_return>-file = ls_file.
+
+      " Derive object from data filename (namespace + escaping)
+      zcl_abapgit_filename_logic=>file_to_object(
+        EXPORTING
+          iv_filename = <ls_return>-file-filename
+          iv_path     = <ls_return>-file-path
+          io_dot      = mo_dot_abapgit
+        IMPORTING
+          es_item     = <ls_return>-item ).
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_dot_abapgit.
+
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF ct_files.
+
+    APPEND INITIAL LINE TO ct_files ASSIGNING <ls_file>.
+    <ls_file>-file = mo_dot_abapgit->to_file( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_objects.
+
+    DATA: lo_filter TYPE REF TO zcl_abapgit_repo_filter,
+          lv_force  TYPE abap_bool,
+          lt_found  LIKE ct_files,
+          lt_tadir  TYPE zif_abapgit_definitions=>ty_tadir_tt.
+
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+      iv_package            = iv_package
+      iv_ignore_subpackages = ms_local_settings-ignore_subpackages
+      iv_only_local_objects = ms_local_settings-only_local_objects
+      io_dot                = mo_dot_abapgit
+      ii_log                = ii_log ).
+
+    CREATE OBJECT lo_filter.
+
+    lo_filter->apply( EXPORTING it_filter = it_filter
+                      CHANGING  ct_tadir  = lt_tadir ).
+
+* if there are less than 10 objects run in single thread
+* this helps a lot when debugging, plus performance gain
+* with low number of objects does not matter much
+    lv_force = boolc( lines( lt_tadir ) < 10 ).
+
+    lt_found = serialize(
+      iv_package          = iv_package
+      it_tadir            = lt_tadir
+      ii_log              = ii_log
+      iv_force_sequential = lv_force ).
+    APPEND LINES OF lt_found TO ct_files.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_to_return.
+
+    FIELD-SYMBOLS: <ls_file>   LIKE LINE OF is_file_item-files,
+                   <ls_return> LIKE LINE OF mt_files.
+
+
+    LOOP AT is_file_item-files ASSIGNING <ls_file>.
+      APPEND INITIAL LINE TO mt_files ASSIGNING <ls_return>.
+      <ls_return>-file = <ls_file>.
+      <ls_return>-file-path = iv_path.
+      <ls_return>-item = is_file_item-item.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA lo_settings TYPE REF TO zcl_abapgit_settings.
+ 
+    lo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true
+        OR lo_settings->get_parallel_proc_disabled( ) = abap_true.
+      gv_max_threads = 1.
+    ENDIF.
+ 
+    mv_group = 'parallel_generators'.
+ 
+    mo_dot_abapgit = io_dot_abapgit.
+    ms_local_settings = is_local_settings.
+ 
+    ms_i18n_params = determine_i18n_params(
+      io_dot = io_dot_abapgit
+      iv_main_language_only = is_local_settings-main_language_only ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_i18n_params.
+ 
+    " TODO: unify with ZCL_ABAPGIT_OBJECTS=>DETERMINE_I18N_PARAMS, same code
+ 
+    IF io_dot IS BOUND.
+      rs_i18n_params-main_language         = io_dot->get_main_language( ).
+      rs_i18n_params-use_lxe               = io_dot->use_lxe( ).
+      rs_i18n_params-main_language_only    = iv_main_language_only.
+      rs_i18n_params-translation_languages = zcl_abapgit_lxe_texts=>get_translation_languages(
+        iv_main_language  = io_dot->get_main_language( )
+        it_i18n_languages = io_dot->get_i18n_languages( ) ).
+    ENDIF.
+ 
+    IF rs_i18n_params-main_language IS INITIAL.
+      rs_i18n_params-main_language = sy-langu.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_max_threads.
+ 
+    IF iv_force_sequential = abap_true.
+      rv_threads = 1.
+      RETURN.
+    ENDIF.
+ 
+    IF gv_max_threads >= 1.
+* SPBT_INITIALIZE gives error PBT_ENV_ALREADY_INITIALIZED if called
+* multiple times in same session
+      rv_threads = gv_max_threads.
+      RETURN.
+    ENDIF.
+ 
+    CALL FUNCTION 'FUNCTION_EXISTS'
+      EXPORTING
+        funcname           = 'Z_ABAPGIT_SERIALIZE_PARALLEL'
+      EXCEPTIONS
+        function_not_exist = 1
+        OTHERS             = 2.
+    IF sy-subrc <> 0.
+      gv_max_threads = 1.
+    ELSE.
+* todo, add possibility to set group name in user exit
+      CALL FUNCTION 'SPBT_INITIALIZE'
+        EXPORTING
+          group_name                     = mv_group
+        IMPORTING
+          free_pbt_wps                   = gv_max_threads
+        EXCEPTIONS
+          invalid_group_name             = 1
+          internal_error                 = 2
+          pbt_env_already_initialized    = 3
+          currently_no_resources_avail   = 4
+          no_pbt_resources_found         = 5
+          cant_init_different_pbt_groups = 6
+          OTHERS                         = 7.
+      IF sy-subrc <> 0.
+*   fallback to running sequentially. If SPBT_INITIALIZE fails, check transactions
+*   RZ12, SM50, SM21, SARFC
+        gv_max_threads = 1.
+      ENDIF.
+    ENDIF.
+ 
+    IF gv_max_threads > 1.
+      gv_max_threads = gv_max_threads - 1.
+    ENDIF.
+ 
+    ASSERT gv_max_threads >= 1.
+ 
+    IF gv_max_threads > 32.
+* https://en.wikipedia.org/wiki/Amdahl%27s_law
+      gv_max_threads = 32.
+    ENDIF.
+ 
+    rv_threads = gv_max_threads.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD files_local.
+ 
+* serializes objects, including .abapgit.xml, apack, and takes into account local settings
+ 
+    add_dot_abapgit( CHANGING ct_files = rt_files ).
+ 
+    add_apack(
+      EXPORTING
+        iv_package = iv_package
+      CHANGING
+        ct_files   = rt_files ).
+ 
+    add_data(
+      EXPORTING
+        ii_data_config = ii_data_config
+      CHANGING
+        ct_files       = rt_files ).
+ 
+    add_objects(
+      EXPORTING
+        iv_package = iv_package
+        ii_log     = ii_log
+        it_filter  = it_filter
+      CHANGING
+        ct_files   = rt_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_ignored_objects.
+
+    DATA:
+      ls_ignored_count TYPE ty_unsupported_count,
+      lt_ignored_count TYPE ty_unsupported_count_tt,
+      lo_folder_logic  TYPE REF TO zcl_abapgit_folder_logic,
+      ls_item          TYPE zif_abapgit_definitions=>ty_item,
+      lv_path          TYPE string,
+      lv_filename      TYPE string.
+
+    FIELD-SYMBOLS:
+      <ls_tadir>         LIKE LINE OF ct_tadir,
+      <ls_ignored_count> TYPE ty_unsupported_count.
+
+    " Ignore logic requires .abapGit.xml
+    IF mo_dot_abapgit IS INITIAL OR iv_package IS INITIAL OR mi_log IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
+
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+      CLEAR: ls_ignored_count.
+
+      ls_item-obj_type = <ls_tadir>-object.
+      ls_item-obj_name = <ls_tadir>-obj_name.
+
+      IF <ls_tadir>-devclass IS NOT INITIAL.
+        lv_path = lo_folder_logic->package_to_path(
+          iv_top     = iv_package
+          io_dot     = mo_dot_abapgit
+          iv_package = <ls_tadir>-devclass ).
+      ELSE.
+        lv_path = mo_dot_abapgit->get_starting_folder( ).
+      ENDIF.
+
+      lv_filename = zcl_abapgit_filename_logic=>object_to_file(
+        is_item  = ls_item
+        iv_ext   = '*' ).
+
+      IF mo_dot_abapgit->is_ignored(
+        iv_path     = lv_path
+        iv_filename = lv_filename ) = abap_false.
+        CONTINUE.
+      ENDIF.
+
+      READ TABLE lt_ignored_count ASSIGNING <ls_ignored_count> WITH TABLE KEY obj_type = <ls_tadir>-object.
+      IF sy-subrc <> 0.
+        ls_ignored_count-obj_type = <ls_tadir>-object.
+        ls_ignored_count-count    = 1.
+        ls_ignored_count-obj_name = <ls_tadir>-obj_name.
+        INSERT ls_ignored_count INTO TABLE lt_ignored_count ASSIGNING <ls_ignored_count>.
+      ELSE.
+        CLEAR: <ls_ignored_count>-obj_name.
+        <ls_ignored_count>-count = <ls_ignored_count>-count + 1.
+      ENDIF.
+      " init object so we can remove these entries afterwards
+      CLEAR <ls_tadir>-object.
+    ENDLOOP.
+    IF lt_ignored_count IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    " remove ignored objects
+    DELETE ct_tadir WHERE object IS INITIAL.
+
+    LOOP AT lt_ignored_count ASSIGNING <ls_ignored_count>.
+      IF <ls_ignored_count>-count = 1.
+        mi_log->add_warning( iv_msg  = |Object { <ls_ignored_count>-obj_type } {
+                                       <ls_ignored_count>-obj_name } ignored| ).
+      ELSE.
+        mi_log->add_warning( iv_msg  = |Object type { <ls_ignored_count>-obj_type } with {
+                                       <ls_ignored_count>-count } objects ignored| ).
+      ENDIF.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_unsupported_objects.
+
+    DATA: ls_unsupported_count TYPE ty_unsupported_count,
+          lt_supported_types   TYPE zcl_abapgit_objects=>ty_types_tt,
+          lt_unsupported_count TYPE ty_unsupported_count_tt.
+
+    FIELD-SYMBOLS: <ls_tadir>             LIKE LINE OF ct_tadir,
+                   <ls_unsupported_count> TYPE ty_unsupported_count.
+
+    lt_supported_types = zcl_abapgit_objects=>supported_list( ).
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+      CLEAR: ls_unsupported_count.
+      READ TABLE lt_supported_types WITH KEY table_line = <ls_tadir>-object TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        CONTINUE.
+      ENDIF.
+
+      READ TABLE lt_unsupported_count ASSIGNING <ls_unsupported_count>
+                                      WITH TABLE KEY obj_type = <ls_tadir>-object.
+      IF sy-subrc <> 0.
+        ls_unsupported_count-obj_type = <ls_tadir>-object.
+        ls_unsupported_count-count    = 1.
+        ls_unsupported_count-obj_name = <ls_tadir>-obj_name.
+        INSERT ls_unsupported_count INTO TABLE lt_unsupported_count ASSIGNING <ls_unsupported_count>.
+      ELSE.
+        CLEAR: <ls_unsupported_count>-obj_name.
+        <ls_unsupported_count>-count = <ls_unsupported_count>-count + 1.
+      ENDIF.
+      CLEAR: <ls_tadir>-object.
+    ENDLOOP.
+    IF lt_unsupported_count IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    DELETE ct_tadir WHERE object IS INITIAL.
+    IF mi_log IS BOUND.
+      LOOP AT lt_unsupported_count ASSIGNING <ls_unsupported_count>.
+        IF <ls_unsupported_count>-count = 1.
+          mi_log->add_error( iv_msg  = |Object type { <ls_unsupported_count>-obj_type } not supported, {
+                                       <ls_unsupported_count>-obj_name } ignored| ).
+        ELSE.
+          mi_log->add_error( iv_msg  = |Object type { <ls_unsupported_count>-obj_type } not supported, {
+                                       <ls_unsupported_count>-count } objects ignored| ).
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD on_end_of_task.
+
+* this method will be called from the parallel processing, thus it must be public
+
+    DATA: lv_result    TYPE xstring,
+          lv_path      TYPE string,
+          lv_mess      TYPE c LENGTH 200,
+          ls_file_item TYPE zif_abapgit_objects=>ty_serialization.
+
+
+    RECEIVE RESULTS FROM FUNCTION 'Z_ABAPGIT_SERIALIZE_PARALLEL'
+      IMPORTING
+        ev_result             = lv_result
+        ev_path               = lv_path
+      EXCEPTIONS
+        error                 = 1
+        system_failure        = 2 MESSAGE lv_mess
+        communication_failure = 3 MESSAGE lv_mess
+        OTHERS = 4.
+    IF sy-subrc <> 0.
+      IF NOT mi_log IS INITIAL.
+        IF NOT lv_mess IS INITIAL.
+          mi_log->add_error( lv_mess ).
+        ELSE.
+          mi_log->add_error( |{ sy-msgv1 }{ sy-msgv2 }{ sy-msgv3 }{ sy-msgv3 }| ).
+        ENDIF.
+      ENDIF.
+    ELSE.
+      IMPORT data = ls_file_item FROM DATA BUFFER lv_result. "#EC CI_SUBRC
+      ASSERT sy-subrc = 0.
+      add_to_return( is_file_item = ls_file_item
+                     iv_path      = lv_path ).
+    ENDIF.
+
+    mv_free = mv_free + 1.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD run_parallel.
+
+    DATA: lv_msg  TYPE c LENGTH 100,
+          lv_task TYPE c LENGTH 32,
+          lv_free LIKE mv_free.
+
+
+    ASSERT mv_free > 0.
+
+    DO.
+      lv_task = |{ iv_task }-{ sy-index }|.
+      CALL FUNCTION 'Z_ABAPGIT_SERIALIZE_PARALLEL'
+        STARTING NEW TASK lv_task
+        DESTINATION IN GROUP mv_group
+        CALLING on_end_of_task ON END OF TASK
+        EXPORTING
+          iv_obj_type           = is_tadir-object
+          iv_obj_name           = is_tadir-obj_name
+          iv_devclass           = is_tadir-devclass
+          iv_path               = is_tadir-path
+          iv_language           = ms_i18n_params-main_language
+          iv_main_language_only = ms_i18n_params-main_language_only
+          it_translation_langs  = ms_i18n_params-translation_languages
+          iv_use_lxe            = ms_i18n_params-use_lxe
+        EXCEPTIONS
+          system_failure        = 1 MESSAGE lv_msg
+          communication_failure = 2 MESSAGE lv_msg
+          resource_failure      = 3
+          OTHERS                = 4.
+      IF sy-subrc = 3.
+        lv_free = mv_free.
+        WAIT UNTIL mv_free <> lv_free UP TO 1 SECONDS.
+        CONTINUE.
+      ELSEIF sy-subrc <> 0.
+        ASSERT lv_msg = '' AND 0 = 1.
+      ENDIF.
+      EXIT.
+    ENDDO.
+
+    mv_free = mv_free - 1.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD run_sequential.
+
+    DATA: lx_error     TYPE REF TO zcx_abapgit_exception,
+          ls_file_item TYPE zif_abapgit_objects=>ty_serialization.
+
+
+    ls_file_item-item-obj_type  = is_tadir-object.
+    ls_file_item-item-obj_name  = is_tadir-obj_name.
+    ls_file_item-item-devclass  = is_tadir-devclass.
+    ls_file_item-item-srcsystem = is_tadir-srcsystem.
+
+    TRY.
+        ls_file_item = zcl_abapgit_objects=>serialize(
+          is_item        = ls_file_item-item
+          io_i18n_params = zcl_abapgit_i18n_params=>new( is_params = ms_i18n_params ) ).
+
+        add_to_return( is_file_item = ls_file_item
+                       iv_path      = is_tadir-path ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        IF NOT mi_log IS INITIAL.
+          mi_log->add_exception(
+              ix_exc  = lx_error
+              is_item = ls_file_item-item ).
+        ENDIF.
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+ 
+* serializes only objects
+ 
+    DATA: lv_max      TYPE i,
+          lv_count    TYPE i,
+          li_progress TYPE REF TO zif_abapgit_progress,
+          li_exit     TYPE REF TO zif_abapgit_exit,
+          lo_timer    TYPE REF TO zcl_abapgit_timer,
+          lt_tadir    TYPE zif_abapgit_definitions=>ty_tadir_tt.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
+ 
+ 
+    CLEAR mt_files.
+ 
+    lv_max = determine_max_threads( iv_force_sequential ).
+    mv_free = lv_max.
+    mi_log = ii_log.
+ 
+    lt_tadir = it_tadir.
+    filter_unsupported_objects( CHANGING ct_tadir = lt_tadir ).
+ 
+    filter_ignored_objects(
+      EXPORTING
+        iv_package = iv_package
+      CHANGING
+        ct_tadir   = lt_tadir ).
+ 
+    lv_count = lines( lt_tadir ).
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lv_count ).
+ 
+    lo_timer = zcl_abapgit_timer=>create(
+      iv_text  = 'Serialize:'
+      iv_count = lv_count )->start( ).
+ 
+    LOOP AT lt_tadir ASSIGNING <ls_tadir>.
+ 
+      li_progress->show(
+        iv_current = sy-tabix
+        iv_text    = |Serialize { <ls_tadir>-obj_name }, { lv_max } threads| ).
+ 
+      IF lv_max = 1.
+        run_sequential( <ls_tadir> ).
+      ELSE.
+        run_parallel(
+          is_tadir = <ls_tadir>
+          iv_task  = |{ sy-tabix }| ).
+        WAIT UNTIL mv_free > 0 UP TO 120 SECONDS.
+      ENDIF.
+    ENDLOOP.
+ 
+    li_progress->off( ).
+ 
+    WAIT UNTIL mv_free = lv_max UP TO 120 SECONDS.
+    rt_files = mt_files.
+    FREE mt_files.
+ 
+*   Call postprocessing
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+    li_exit->serialize_postprocess(
+      EXPORTING
+        iv_package = iv_package
+        ii_log     = ii_log
+      CHANGING
+        ct_files   = rt_files ).
+ 
+    lo_timer->end( abap_true ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap.html b/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap.html new file mode 100644 index 00000000000..eca5d4ee665 --- /dev/null +++ b/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap.html @@ -0,0 +1,1015 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_serialize.clas.testclasses.abap

+
+ +
+ 34.19% + Statements + 106/310 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 33.33% + Functions + 3/9 +
+ + +
+ 34.19% + Lines + 106/310 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +3111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS ltcl_determine_max_threads DEFINITION DEFERRED.
+CLASS zcl_abapgit_serialize DEFINITION LOCAL FRIENDS ltcl_determine_max_threads.
+ 
+CLASS ltcl_determine_max_threads DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_cut TYPE REF TO zcl_abapgit_serialize.
+ 
+    METHODS:
+      setup,
+      determine_max_threads FOR TESTING RAISING zcx_abapgit_exception,
+      force FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_determine_max_threads IMPLEMENTATION.
+ 
+  METHOD setup.
+    TRY.
+        CREATE OBJECT mo_cut.
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( 'Error creating serializer' ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD determine_max_threads.
+ 
+    DATA: lv_threads TYPE i.
+ 
+    lv_threads = mo_cut->determine_max_threads( ).
+ 
+    cl_abap_unit_assert=>assert_differs(
+      act = lv_threads
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD force.
+ 
+    DATA: lv_threads TYPE i.
+ 
+    lv_threads = mo_cut->determine_max_threads( abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_threads
+      exp = 1 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_serialize DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_dot TYPE REF TO zcl_abapgit_dot_abapgit,
+      mo_cut TYPE REF TO zcl_abapgit_serialize.
+ 
+    METHODS:
+      setup,
+      test FOR TESTING RAISING zcx_abapgit_exception,
+      unsupported FOR TESTING RAISING zcx_abapgit_exception,
+      ignored FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_serialize IMPLEMENTATION.
+ 
+  METHOD setup.
+
+    mo_dot = zcl_abapgit_dot_abapgit=>build_default( ).
+
+    TRY.
+        CREATE OBJECT mo_cut
+          EXPORTING
+            io_dot_abapgit = mo_dot.
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( 'Error creating serializer' ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD test.
+
+    DATA: lt_tadir      TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          lt_sequential TYPE zif_abapgit_definitions=>ty_files_item_tt,
+          lt_parallel   TYPE zif_abapgit_definitions=>ty_files_item_tt.
+
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF lt_tadir.
+
+
+    APPEND INITIAL LINE TO lt_tadir ASSIGNING <ls_tadir>.
+    <ls_tadir>-object   = 'PROG'.
+    <ls_tadir>-obj_name = 'RSABAPPROGRAM'.
+    <ls_tadir>-devclass = 'PACKAGE'.
+    <ls_tadir>-path     = 'foobar'.
+    <ls_tadir>-masterlang = sy-langu.
+
+    lt_sequential = mo_cut->serialize(
+      it_tadir            = lt_tadir
+      iv_force_sequential = abap_true ).
+
+    lt_parallel = mo_cut->serialize(
+      it_tadir            = lt_tadir
+      iv_force_sequential = abap_false ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_sequential
+      exp = lt_parallel ).
+
+  ENDMETHOD.
+ 
+  METHOD unsupported.
+
+    DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          ls_msg   TYPE zif_abapgit_log=>ty_log_out,
+          lt_msg   TYPE zif_abapgit_log=>ty_log_outs,
+          li_log1  TYPE REF TO zif_abapgit_log,
+          li_log2  TYPE REF TO zif_abapgit_log.
+
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF lt_tadir.
+
+
+    APPEND INITIAL LINE TO lt_tadir ASSIGNING <ls_tadir>.
+    <ls_tadir>-object   = 'ABCD'.
+    <ls_tadir>-obj_name = 'OBJECT'.
+
+    CREATE OBJECT li_log1 TYPE zcl_abapgit_log.
+    mo_cut->serialize(
+      it_tadir            = lt_tadir
+      ii_log              = li_log1
+      iv_force_sequential = abap_true ).
+
+    CREATE OBJECT li_log2 TYPE zcl_abapgit_log.
+    mo_cut->serialize(
+      it_tadir            = lt_tadir
+      ii_log              = li_log2
+      iv_force_sequential = abap_false ).
+
+    lt_msg = li_log1->get_messages( ).
+    READ TABLE lt_msg INTO ls_msg INDEX 1.
+    cl_abap_unit_assert=>assert_subrc( ).
+
+    cl_abap_unit_assert=>assert_char_cp(
+      act = ls_msg-text
+      exp = '*Object type ABCD not supported*' ).
+
+    lt_msg = li_log2->get_messages( ).
+    READ TABLE lt_msg INTO ls_msg INDEX 1.
+    cl_abap_unit_assert=>assert_subrc( ).
+
+    cl_abap_unit_assert=>assert_char_cp(
+      act = ls_msg-text
+      exp = '*Object type ABCD not supported*' ).
+
+  ENDMETHOD.
+ 
+  METHOD ignored.
+
+    DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          ls_msg   TYPE zif_abapgit_log=>ty_log_out,
+          lt_msg   TYPE zif_abapgit_log=>ty_log_outs,
+          li_log1  TYPE REF TO zif_abapgit_log,
+          li_log2  TYPE REF TO zif_abapgit_log.
+
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF lt_tadir.
+
+    mo_dot->add_ignore(
+      iv_path     = '/src/'
+      iv_filename = 'zcl_test_ignore.clas.*' ).
+
+    APPEND INITIAL LINE TO lt_tadir ASSIGNING <ls_tadir>.
+    <ls_tadir>-object   = 'CLAS'.
+    <ls_tadir>-obj_name = 'ZCL_TEST'.
+    <ls_tadir>-devclass = '$ZTEST'.
+
+    APPEND INITIAL LINE TO lt_tadir ASSIGNING <ls_tadir>.
+    <ls_tadir>-object   = 'CLAS'.
+    <ls_tadir>-obj_name = 'ZCL_TEST_IGNORE'.
+    <ls_tadir>-devclass = '$ZTEST'.
+
+    CREATE OBJECT li_log1 TYPE zcl_abapgit_log.
+    mo_cut->serialize(
+      iv_package          = '$ZTEST'
+      it_tadir            = lt_tadir
+      ii_log              = li_log1
+      iv_force_sequential = abap_true ).
+
+    CREATE OBJECT li_log2 TYPE zcl_abapgit_log.
+    mo_cut->serialize(
+      iv_package          = '$ZTEST'
+      it_tadir            = lt_tadir
+      ii_log              = li_log2
+      iv_force_sequential = abap_false ).
+
+    lt_msg = li_log1->get_messages( ).
+    READ TABLE lt_msg INTO ls_msg INDEX 1.
+    cl_abap_unit_assert=>assert_subrc( ).
+
+    cl_abap_unit_assert=>assert_char_cp(
+      act = ls_msg-text
+      exp = '*Object CLAS ZCL_TEST_IGNORE ignored*' ).
+
+    lt_msg = li_log2->get_messages( ).
+    READ TABLE lt_msg INTO ls_msg INDEX 1.
+    cl_abap_unit_assert=>assert_subrc( ).
+
+    cl_abap_unit_assert=>assert_char_cp(
+      act = ls_msg-text
+      exp = '*Object CLAS ZCL_TEST_IGNORE ignored*' ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_i18n DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    CONSTANTS:
+      c_english TYPE sy-langu VALUE 'E',
+      c_german  TYPE sy-langu VALUE 'D'.
+ 
+    DATA:
+      mo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit,
+      mo_cut         TYPE REF TO zcl_abapgit_serialize.
+ 
+    METHODS:
+      setup,
+      test FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_i18n IMPLEMENTATION.
+ 
+  METHOD setup.
+    DATA ls_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
+
+    " Main language: English, Translations: German
+    ls_data-master_language = c_english.
+    " ls_data-i18n_languages needs to be initial to get classic I18N data
+
+    TRY.
+        CREATE OBJECT mo_dot_abapgit
+          EXPORTING
+            is_data = ls_data.
+
+        CREATE OBJECT mo_cut
+          EXPORTING
+            io_dot_abapgit = mo_dot_abapgit.
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( 'Error creating serializer' ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD test.
+
+    DATA: lt_tadir      TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          lt_result     TYPE zif_abapgit_definitions=>ty_files_item_tt,
+          lv_xml        TYPE string,
+          lo_input      TYPE REF TO zcl_abapgit_xml_input,
+          ls_dd02v      TYPE dd02v,
+          lt_i18n_langs TYPE TABLE OF langu.
+
+    FIELD-SYMBOLS: <ls_tadir>      LIKE LINE OF lt_tadir,
+                   <ls_result>     LIKE LINE OF lt_result,
+                   <ls_i18n_langs> LIKE LINE OF lt_i18n_langs.
+
+    " Assumption: Table T100 has at least English and German description
+    APPEND INITIAL LINE TO lt_tadir ASSIGNING <ls_tadir>.
+    <ls_tadir>-object   = 'TABL'.
+    <ls_tadir>-obj_name = 'T100'.
+    <ls_tadir>-devclass = 'PACKAGE'.
+    <ls_tadir>-path     = 'foobar'.
+
+    lt_result = mo_cut->serialize( lt_tadir ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_result )
+      exp = 1 ).
+
+    READ TABLE lt_result ASSIGNING <ls_result> INDEX 1.
+    ASSERT sy-subrc = 0.
+
+    lv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( <ls_result>-file-data ).
+
+    CREATE OBJECT lo_input
+      EXPORTING
+        iv_xml = lv_xml.
+
+    lo_input->zif_abapgit_xml_input~read( EXPORTING iv_name = 'DD02V'
+                                          CHANGING  cg_data = ls_dd02v ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_dd02v-ddlanguage
+      exp = c_english ).
+
+    lo_input->zif_abapgit_xml_input~read( EXPORTING iv_name = 'I18N_LANGS'
+                                          CHANGING  cg_data = lt_i18n_langs ).
+
+    cl_abap_unit_assert=>assert_not_initial( lt_i18n_langs ).
+
+    READ TABLE lt_i18n_langs ASSIGNING <ls_i18n_langs> WITH KEY table_line = c_german.
+    cl_abap_unit_assert=>assert_subrc( ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/core/zcl_abapgit_tadir.clas.abap.html b/src/objects/core/zcl_abapgit_tadir.clas.abap.html new file mode 100644 index 00000000000..5b9621a3fa5 --- /dev/null +++ b/src/objects/core/zcl_abapgit_tadir.clas.abap.html @@ -0,0 +1,1357 @@ + + + + + + Code coverage report for src/objects/core/zcl_abapgit_tadir.clas.abap + + + + + + + + + +
+
+

All files / src/objects/core zcl_abapgit_tadir.clas.abap

+
+ +
+ 62.02% + Statements + 263/424 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 62.02% + Lines + 263/424 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +4251x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_tadir DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_tadir .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS check_exists
+      IMPORTING
+        !it_tadir       TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RETURNING
+        VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build
+      IMPORTING
+        !iv_package            TYPE tadir-devclass
+        !io_dot                TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false
+        !iv_only_local_objects TYPE abap_bool DEFAULT abap_false
+        !ii_log                TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_tadir)        TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS select_objects
+      IMPORTING
+        !iv_package            TYPE tadir-devclass
+        !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false
+        !iv_only_local_objects TYPE abap_bool
+      EXPORTING
+        !et_packages           TYPE zif_abapgit_sap_package=>ty_devclass_tt
+        !et_tadir              TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_local_packages
+      IMPORTING
+        !it_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt
+      CHANGING
+        !ct_tadir    TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_namespaces
+      IMPORTING
+        !iv_package TYPE devclass
+      CHANGING
+        !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_namespace
+      IMPORTING
+        !iv_package TYPE devclass
+        !iv_object  TYPE csequence
+      CHANGING
+        !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS determine_path
+      IMPORTING
+        !iv_package TYPE tadir-devclass
+        !io_dot     TYPE REF TO zcl_abapgit_dot_abapgit
+      CHANGING
+        !ct_tadir   TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_sots_excluded
+      IMPORTING
+        !it_packages      TYPE zif_abapgit_sap_package=>ty_devclass_tt
+      RETURNING
+        VALUE(rv_exclude) TYPE abap_bool.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_tadir IMPLEMENTATION.
+ 
+ 
+  METHOD add_local_packages.
+
+    FIELD-SYMBOLS:
+      <lv_package> LIKE LINE OF it_packages,
+      <ls_tadir>   LIKE LINE OF ct_tadir.
+
+    LOOP AT it_packages ASSIGNING <lv_package>.
+
+      " Local packages are not in TADIR, only in TDEVC, act as if they were
+      IF <lv_package> CP '$*'. " OR <package> CP 'T*' ).
+        APPEND INITIAL LINE TO ct_tadir ASSIGNING <ls_tadir>.
+        <ls_tadir>-pgmid      = 'R3TR'.
+        <ls_tadir>-object     = 'DEVC'.
+        <ls_tadir>-obj_name   = <lv_package>.
+        <ls_tadir>-devclass   = <lv_package>.
+        <ls_tadir>-srcsystem  = sy-sysid.
+        <ls_tadir>-masterlang = sy-langu.
+      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_namespace.
+
+    DATA:
+      lv_name      TYPE progname,
+      lv_namespace TYPE namespace.
+
+    FIELD-SYMBOLS <ls_tadir> LIKE LINE OF ct_tadir.
+
+    lv_name = iv_object.
+
+    CALL FUNCTION 'RS_NAME_SPLIT_NAMESPACE'
+      EXPORTING
+        name_with_namespace = lv_name
+      IMPORTING
+        namespace           = lv_namespace
+      EXCEPTIONS
+        delimiter_error     = 1
+        OTHERS              = 2.
+
+    IF sy-subrc = 0 AND lv_namespace IS NOT INITIAL.
+
+      READ TABLE ct_tadir TRANSPORTING NO FIELDS
+        WITH KEY pgmid = 'R3TR' object = 'NSPC' obj_name = lv_namespace.
+      IF sy-subrc <> 0.
+        APPEND INITIAL LINE TO ct_tadir ASSIGNING <ls_tadir>.
+        <ls_tadir>-pgmid      = 'R3TR'.
+        <ls_tadir>-object     = 'NSPC'.
+        <ls_tadir>-obj_name   = lv_namespace.
+        <ls_tadir>-devclass   = iv_package.
+        <ls_tadir>-srcsystem  = sy-sysid.
+        <ls_tadir>-masterlang = sy-langu.
+      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_namespaces.
+
+    FIELD-SYMBOLS <ls_tadir> LIKE LINE OF ct_tadir.
+
+    " Namespaces are not in TADIR, but are necessary for creating objects in transportable packages
+    LOOP AT ct_tadir ASSIGNING <ls_tadir> WHERE obj_name(1) = '/'.
+      add_namespace(
+        EXPORTING
+          iv_package = iv_package
+          iv_object  = <ls_tadir>-obj_name
+        CHANGING
+          ct_tadir   = ct_tadir ).
+    ENDLOOP.
+
+    " Root package of repo might not exist yet but needs to be considered, too
+    IF iv_package CP '/*'.
+      add_namespace(
+        EXPORTING
+          iv_package = iv_package
+          iv_object  = iv_package
+        CHANGING
+          ct_tadir   = ct_tadir ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD build.
+ 
+    DATA lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    select_objects(
+      EXPORTING
+        iv_package            = iv_package
+        iv_ignore_subpackages = iv_ignore_subpackages
+        iv_only_local_objects = iv_only_local_objects
+      IMPORTING
+        et_tadir              = rt_tadir
+        et_packages           = lt_packages ).
+ 
+    add_local_packages(
+      EXPORTING
+        it_packages = lt_packages
+      CHANGING
+        ct_tadir    = rt_tadir ).
+ 
+    add_namespaces(
+      EXPORTING
+        iv_package = iv_package
+      CHANGING
+        ct_tadir   = rt_tadir ).
+ 
+    determine_path(
+      EXPORTING
+        iv_package = iv_package
+        io_dot     = io_dot
+      CHANGING
+        ct_tadir   = rt_tadir ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_exists.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          ls_item     TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
+ 
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( it_tadir ) ).
+ 
+* rows from database table TADIR are not removed for
+* transportable objects until the transport is released
+    LOOP AT it_tadir ASSIGNING <ls_tadir>.
+      IF sy-tabix MOD 200 = 0.
+        li_progress->show(
+          iv_current = sy-tabix
+          iv_text    = |Check object exists { <ls_tadir>-object } { <ls_tadir>-obj_name }| ).
+      ENDIF.
+ 
+      ls_item-obj_type = <ls_tadir>-object.
+      ls_item-obj_name = <ls_tadir>-obj_name.
+      ls_item-devclass = <ls_tadir>-devclass.
+ 
+      IF zcl_abapgit_objects=>exists( ls_item ) = abap_true.
+        APPEND <ls_tadir> TO rt_tadir.
+      ENDIF.
+    ENDLOOP.
+ 
+    li_progress->off( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_path.
+
+    DATA:
+      lv_path         TYPE string,
+      lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic,
+      lv_last_package TYPE devclass VALUE cl_abap_char_utilities=>horizontal_tab.
+
+    FIELD-SYMBOLS <ls_tadir> LIKE LINE OF ct_tadir.
+
+    lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
+
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+
+      IF lv_last_package <> <ls_tadir>-devclass.
+        "Change in Package
+        lv_last_package = <ls_tadir>-devclass.
+
+        IF NOT io_dot IS INITIAL.
+          lv_path = lo_folder_logic->package_to_path(
+            iv_top     = iv_package
+            io_dot     = io_dot
+            iv_package = <ls_tadir>-devclass ).
+        ENDIF.
+      ENDIF.
+
+      <ls_tadir>-path = lv_path.
+      <ls_tadir>-korrnum = ''.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD is_sots_excluded.
+ 
+    " Todo: once all OTR longtexts are handled by object-specific class,
+    " we can exclude SOTS completely (just like SOTR)
+    " Until then, we need an object-type specific check here
+ 
+    DATA:
+      lt_concepts TYPE STANDARD TABLE OF sotr_headu-concept,
+      lv_count    TYPE i.
+ 
+    ASSERT it_packages IS NOT INITIAL.
+ 
+    rv_exclude = abap_false.
+ 
+    " Get all OTR longtexts
+    SELECT concept FROM sotr_headu INTO TABLE lt_concepts
+      FOR ALL ENTRIES IN it_packages WHERE paket = it_packages-table_line.
+    IF lines( lt_concepts ) > 0.
+      " Check if there are any texts related to objects that do not serialize these texts (yet)
+      " If yes, we need to keep processing SOTS
+      SELECT COUNT(*) FROM sotr_useu INTO lv_count
+        FOR ALL ENTRIES IN lt_concepts WHERE concept = lt_concepts-table_line
+        AND NOT ( pgmid = 'R3TR' AND object = 'SICF' )
+        AND NOT ( pgmid = 'LIMU' AND object = 'CPUB' ).
+      IF lv_count > 0.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    " If no, SOTS can be excluded from the TADIR selection
+    rv_exclude = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD select_objects.
+
+    DATA:
+      lt_excludes  TYPE RANGE OF trobjtype,
+      ls_exclude   LIKE LINE OF lt_excludes,
+      lt_srcsystem TYPE RANGE OF tadir-srcsystem,
+      ls_srcsystem LIKE LINE OF lt_srcsystem.
+
+    " Determine packages to read
+    IF iv_ignore_subpackages = abap_false.
+      et_packages = zcl_abapgit_factory=>get_sap_package( iv_package )->list_subpackages( ).
+    ENDIF.
+    INSERT iv_package INTO et_packages INDEX 1.
+
+    " Exclude object types with tadir entries that are included elsewhere
+    ls_exclude-sign   = 'I'.
+    ls_exclude-option = 'EQ'.
+    ls_exclude-low    = 'SOTR'. " automatically created for SAP packages (DEVC)
+    APPEND ls_exclude TO lt_excludes.
+    ls_exclude-low    = 'SFB1'. " covered by business function sets (SFBS)
+    APPEND ls_exclude TO lt_excludes.
+    ls_exclude-low    = 'SFB2'. " covered by business functions (SFBF)
+    APPEND ls_exclude TO lt_excludes.
+    ls_exclude-low    = 'STOB'. " auto generated by core data services (DDLS)
+    APPEND ls_exclude TO lt_excludes.
+
+    IF is_sots_excluded( et_packages ) = abap_true.
+      ls_exclude-low = 'SOTS'.
+      APPEND ls_exclude TO lt_excludes.
+    ENDIF.
+
+    " Limit to objects belonging to this system
+    IF iv_only_local_objects = abap_true.
+      ls_srcsystem-sign   = 'I'.
+      ls_srcsystem-option = 'EQ'.
+      ls_srcsystem-low    = sy-sysid.
+      APPEND ls_srcsystem TO lt_srcsystem.
+    ENDIF.
+
+    IF et_packages IS NOT INITIAL.
+      SELECT * FROM tadir INTO CORRESPONDING FIELDS OF TABLE et_tadir
+        FOR ALL ENTRIES IN et_packages
+        WHERE devclass = et_packages-table_line
+        AND pgmid      = 'R3TR'
+        AND object     NOT IN lt_excludes
+        AND delflag    = abap_false
+        AND srcsystem  IN lt_srcsystem
+        ORDER BY PRIMARY KEY ##TOO_MANY_ITAB_FIELDS. "#EC CI_GENBUFF "#EC CI_SUBRC
+    ENDIF.
+
+    SORT et_tadir BY devclass pgmid object obj_name.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_tadir~get_object_package.
+ 
+    DATA: ls_tadir TYPE zif_abapgit_definitions=>ty_tadir,
+          ls_item  TYPE zif_abapgit_definitions=>ty_item.
+ 
+    ls_tadir = zif_abapgit_tadir~read_single(
+      iv_pgmid    = iv_pgmid
+      iv_object   = iv_object
+      iv_obj_name = iv_obj_name ).
+ 
+    IF ls_tadir-delflag = abap_true.
+      RETURN. "Mark for deletion -> return nothing
+    ENDIF.
+ 
+    ls_item-obj_type = ls_tadir-object.
+    ls_item-obj_name = ls_tadir-obj_name.
+    ls_item-devclass = ls_tadir-devclass.
+ 
+    IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    rv_devclass = ls_tadir-devclass.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_tadir~read.
+ 
+    DATA: li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    " Start recursion
+    " hmm, some problems here, should TADIR also build path?
+    rt_tadir = build(
+      iv_package            = iv_package
+      io_dot                = io_dot
+      iv_ignore_subpackages = iv_ignore_subpackages
+      iv_only_local_objects = iv_only_local_objects
+      ii_log                = ii_log ).
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->change_tadir(
+      EXPORTING
+        iv_package = iv_package
+        ii_log     = ii_log
+      CHANGING
+        ct_tadir   = rt_tadir ).
+ 
+    rt_tadir = check_exists( rt_tadir ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_tadir~read_single.
+ 
+    SELECT SINGLE * FROM tadir INTO CORRESPONDING FIELDS OF rs_tadir
+      WHERE pgmid = iv_pgmid
+      AND object = iv_object
+      AND obj_name = iv_obj_name.                         "#EC CI_SUBRC
+    CLEAR rs_tadir-korrnum.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/index.html b/src/objects/index.html new file mode 100644 index 00000000000..1b66ea89397 --- /dev/null +++ b/src/objects/index.html @@ -0,0 +1,251 @@ + + + + + + Code coverage report for src/objects + + + + + + + + + +
+
+

All files src/objects

+
+ +
+ 69.85% + Statements + 4431/6343 +
+ + +
+ 75.6% + Branches + 31/41 +
+ + +
+ 24.13% + Functions + 21/87 +
+ + +
+ 69.85% + Lines + 4431/6343 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_object_devc.clas.abap +
+
29.15%263/9020%0/10%0/729.15%263/902
zcl_abapgit_object_intf.clas.abap +
+
71.55%478/66850%4/844.44%4/971.55%478/668
zcl_abapgit_object_intf.clas.locals_imp.abap +
+
84.75%528/623100%1/133.33%1/384.75%528/623
zcl_abapgit_object_intf.clas.testclasses.abap +
+
98.77%483/489100%12/1266.66%12/1898.77%483/489
zcl_abapgit_objects.clas.abap +
+
100%1292/1292100%0/0100%0/0100%1292/1292
zcl_abapgit_objects.clas.testclasses.abap +
+
47.44%223/470100%0/00%0/2747.44%223/470
zcl_abapgit_objects_bridge.clas.abap +
+
89.45%229/256100%0/00%0/389.45%229/256
zcl_abapgit_objects_program.clas.abap +
+
55.56%629/113268.75%11/1611.11%1/955.56%629/1132
zcl_abapgit_objects_program.clas.testclasses.abap +
+
100%122/122100%2/2100%2/2100%122/122
zcl_abapgit_objects_super.clas.abap +
+
47.3%184/389100%1/111.11%1/947.3%184/389
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/jump/index.html b/src/objects/jump/index.html new file mode 100644 index 00000000000..e6cc2488a39 --- /dev/null +++ b/src/objects/jump/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/objects/jump + + + + + + + + + +
+
+

All files src/objects/jump

+
+ +
+ 86.55% + Statements + 502/580 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 86.55% + Lines + 502/580 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_adt_link.clas.abap +
+
100%248/248100%0/0100%0/0100%248/248
zcl_abapgit_gui_jumper.clas.abap +
+
76.5%254/332100%0/00%0/276.5%254/332
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/jump/zcl_abapgit_adt_link.clas.abap.html b/src/objects/jump/zcl_abapgit_adt_link.clas.abap.html new file mode 100644 index 00000000000..a7fb19cb947 --- /dev/null +++ b/src/objects/jump/zcl_abapgit_adt_link.clas.abap.html @@ -0,0 +1,829 @@ + + + + + + Code coverage report for src/objects/jump/zcl_abapgit_adt_link.clas.abap + + + + + + + + + +
+
+

All files / src/objects/jump zcl_abapgit_adt_link.clas.abap

+
+ +
+ 100% + Statements + 248/248 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 248/248 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +2491x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_adt_link DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS jump
+      IMPORTING
+        !iv_obj_name     TYPE zif_abapgit_definitions=>ty_item-obj_name
+        !iv_obj_type     TYPE zif_abapgit_definitions=>ty_item-obj_type
+        !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name OPTIONAL
+        !iv_line_number  TYPE i OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS link_transport
+      IMPORTING
+        iv_transport TYPE trkorr
+      RETURNING
+        VALUE(rv_link) TYPE string.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS generate
+      IMPORTING
+        !iv_obj_name     TYPE zif_abapgit_definitions=>ty_item-obj_name
+        !iv_obj_type     TYPE zif_abapgit_definitions=>ty_item-obj_type
+        !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name OPTIONAL
+        !iv_line_number  TYPE i OPTIONAL
+      RETURNING
+        VALUE(rv_result) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS get_adt_objects_and_names
+      IMPORTING
+        iv_obj_name       TYPE zif_abapgit_definitions=>ty_item-obj_name
+        iv_obj_type       TYPE zif_abapgit_definitions=>ty_item-obj_type
+      EXPORTING
+        eo_adt_uri_mapper TYPE REF TO object
+        eo_adt_objectref  TYPE REF TO object
+        ev_program        TYPE progname
+        ev_include        TYPE progname
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS is_adt_jump_possible
+      IMPORTING
+        io_object                      TYPE REF TO cl_wb_object
+        io_adt                         TYPE REF TO object
+      RETURNING
+        VALUE(rv_is_adt_jump_possible) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_adt_link IMPLEMENTATION.
+ 
+  METHOD link_transport.
+* call to CL_CTS_ADT_TM_URI_BUILDER=>CREATE_ADT_URI replaced with logic that works on all systems,
+    rv_link = |adt://{ sy-sysid }/sap/bc/adt/cts/transportrequests/{ iv_transport }|.
+  ENDMETHOD.
+ 
+  METHOD generate.
+ 
+    DATA: lv_adt_link       TYPE string.
+    DATA: lo_adt_uri_mapper TYPE REF TO object.
+    DATA: lo_adt_objref     TYPE REF TO object.
+    DATA: lo_adt_sub_objref TYPE REF TO object.
+    DATA: lv_program        TYPE progname.
+    DATA: lv_include        TYPE progname.
+ 
+    FIELD-SYMBOLS: <lv_uri> TYPE string.
+ 
+    get_adt_objects_and_names(
+      EXPORTING
+        iv_obj_name       = iv_obj_name
+        iv_obj_type       = iv_obj_type
+      IMPORTING
+        eo_adt_uri_mapper = lo_adt_uri_mapper
+        eo_adt_objectref  = lo_adt_objref
+        ev_program        = lv_program
+        ev_include        = lv_include ).
+ 
+    TRY.
+        IF iv_sub_obj_name IS NOT INITIAL.
+ 
+          IF ( lv_program <> iv_obj_name AND lv_include IS INITIAL ) OR
+             ( lv_program = lv_include AND iv_sub_obj_name IS NOT INITIAL ).
+            lv_include = iv_sub_obj_name.
+          ENDIF.
+ 
+          CALL METHOD lo_adt_uri_mapper->('IF_ADT_URI_MAPPER~MAP_INCLUDE_TO_OBJREF')
+            EXPORTING
+              program     = lv_program
+              include     = lv_include
+              line        = iv_line_number
+              line_offset = 0
+              end_line    = iv_line_number
+              end_offset  = 1
+            RECEIVING
+              result      = lo_adt_sub_objref.
+          IF lo_adt_sub_objref IS NOT INITIAL.
+            lo_adt_objref = lo_adt_sub_objref.
+          ENDIF.
+ 
+        ENDIF.
+ 
+        ASSIGN ('LO_ADT_OBJREF->REF_DATA-URI') TO <lv_uri>.
+        ASSERT sy-subrc = 0.
+ 
+        CONCATENATE 'adt://' sy-sysid <lv_uri> INTO lv_adt_link.
+ 
+        rv_result = lv_adt_link.
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_adt_objects_and_names.
+ 
+    DATA lv_obj_type       TYPE trobjtype.
+    DATA lv_obj_name       TYPE trobj_name.
+    DATA lo_object         TYPE REF TO cl_wb_object.
+    DATA lo_adt            TYPE REF TO object.
+ 
+    FIELD-SYMBOLS <lv_uri> TYPE string.
+ 
+    lv_obj_name = iv_obj_name.
+    lv_obj_type = iv_obj_type.
+ 
+    TRY.
+        cl_wb_object=>create_from_transport_key(
+          EXPORTING
+            p_object    = lv_obj_type
+            p_obj_name  = lv_obj_name
+          RECEIVING
+            p_wb_object = lo_object
+          EXCEPTIONS
+            OTHERS      = 1 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
+        ENDIF.
+ 
+        CALL METHOD ('CL_ADT_TOOLS_CORE_FACTORY')=>('GET_INSTANCE')
+          RECEIVING
+            result = lo_adt.
+ 
+        IF is_adt_jump_possible( io_object = lo_object
+                                 io_adt    = lo_adt ) = abap_false.
+          zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
+        ENDIF.
+ 
+        CALL METHOD lo_adt->('IF_ADT_TOOLS_CORE_FACTORY~GET_URI_MAPPER')
+          RECEIVING
+            result = eo_adt_uri_mapper.
+ 
+        CALL METHOD eo_adt_uri_mapper->('IF_ADT_URI_MAPPER~MAP_WB_OBJECT_TO_OBJREF')
+          EXPORTING
+            wb_object = lo_object
+          RECEIVING
+            result    = eo_adt_objectref.
+ 
+        ASSIGN ('EO_ADT_OBJECTREF->REF_DATA-URI') TO <lv_uri>.
+        ASSERT sy-subrc = 0.
+ 
+        CALL METHOD eo_adt_uri_mapper->('IF_ADT_URI_MAPPER~MAP_OBJREF_TO_INCLUDE')
+          EXPORTING
+            uri     = <lv_uri>
+          IMPORTING
+            program = ev_program
+            include = ev_include.
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_adt_jump_possible.
+ 
+    DATA: lo_wb_request         TYPE REF TO cl_wb_request,
+          lo_adt_uri_mapper_vit TYPE REF TO object,
+          lv_vit_wb_request     TYPE abap_bool.
+ 
+    cl_wb_request=>create_from_object_ref(
+      EXPORTING
+        p_wb_object       = io_object
+      RECEIVING
+        p_wb_request      = lo_wb_request
+      EXCEPTIONS
+        illegal_operation = 1
+        cancelled         = 2
+        OTHERS            = 3 ).
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
+    ENDIF.
+ 
+    TRY.
+        CALL METHOD io_adt->('IF_ADT_TOOLS_CORE_FACTORY~GET_URI_MAPPER_VIT')
+          RECEIVING
+            result = lo_adt_uri_mapper_vit.
+ 
+        CALL METHOD lo_adt_uri_mapper_vit->('IF_ADT_URI_MAPPER_VIT~IS_VIT_WB_REQUEST')
+          EXPORTING
+            wb_request = lo_wb_request
+          RECEIVING
+            result     = lv_vit_wb_request.
+ 
+        rv_is_adt_jump_possible = boolc( NOT lv_vit_wb_request = abap_true ).
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump.
+ 
+    DATA lv_adt_link TYPE string.
+ 
+    TRY.
+        lv_adt_link = generate(
+          iv_obj_name     = iv_obj_name
+          iv_obj_type     = iv_obj_type
+          iv_sub_obj_name = iv_sub_obj_name
+          iv_line_number  = iv_line_number ).
+ 
+        zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ).
+ 
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/jump/zcl_abapgit_gui_jumper.clas.abap.html b/src/objects/jump/zcl_abapgit_gui_jumper.clas.abap.html new file mode 100644 index 00000000000..e525763cc11 --- /dev/null +++ b/src/objects/jump/zcl_abapgit_gui_jumper.clas.abap.html @@ -0,0 +1,1081 @@ + + + + + + Code coverage report for src/objects/jump/zcl_abapgit_gui_jumper.clas.abap + + + + + + + + + +
+
+

All files / src/objects/jump zcl_abapgit_gui_jumper.clas.abap

+
+ +
+ 76.5% + Statements + 254/332 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 76.5% + Lines + 254/332 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +3331x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_gui_jumper DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_jumper.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS jump_tr
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_exit) TYPE abap_bool.
+ 
+    METHODS jump_wb
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+        !iv_new_window TYPE abap_bool
+      RETURNING
+        VALUE(rv_exit) TYPE abap_bool.
+ 
+    METHODS jump_wb_line
+      IMPORTING
+        !is_item         TYPE zif_abapgit_definitions=>ty_item
+        !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
+        !iv_sub_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type
+        !iv_line_number  TYPE i
+        !iv_new_window   TYPE abap_bool
+      RETURNING
+        VALUE(rv_exit)   TYPE abap_bool.
+ 
+    METHODS jump_bw
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+        !iv_new_window TYPE abap_bool
+      RETURNING
+        VALUE(rv_exit) TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_jumper IMPLEMENTATION.
+ 
+ 
+  METHOD jump_bw.
+ 
+    DATA:
+      lv_exit  TYPE abap_bool,
+      lv_tlogo TYPE c LENGTH 4, "rstlogo
+      lv_objnm TYPE c LENGTH 40. "rsawbnobjnm
+ 
+    lv_tlogo = is_item-obj_type.
+    lv_objnm = is_item-obj_name.
+ 
+    TRY.
+        CALL METHOD ('CL_RSAWBN_AWB')=>('IS_SUPPORTED_NAVIGATION')
+          EXPORTING
+            i_tlogo               = lv_tlogo
+            i_fcode               = 'DISPLAY'
+          IMPORTING
+            re_is_supported_fcode = lv_exit.
+ 
+        IF lv_exit = abap_false.
+          RETURN.
+        ENDIF.
+      CATCH cx_root.
+        " Not a BW system
+        RETURN.
+    ENDTRY.
+ 
+    TRY.
+        CALL METHOD ('CL_RSAWBN_AWB')=>('NAVIGATE_FROM_APPLICATION')
+          EXPORTING
+            i_tlogo                = lv_tlogo
+            i_objnm                = lv_objnm
+            i_new_mode             = iv_new_window
+          IMPORTING
+            e_exit_own_application = lv_exit.
+ 
+      CATCH cx_root.
+        " Older release without i_new_mode
+        CALL METHOD ('CL_RSAWBN_AWB')=>('NAVIGATE_FROM_APPLICATION')
+          EXPORTING
+            i_tlogo                = lv_tlogo
+            i_objnm                = lv_objnm
+          IMPORTING
+            e_exit_own_application = lv_exit.
+    ENDTRY.
+ 
+    rv_exit = lv_exit.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_tr.
+ 
+    DATA:
+      lv_e071_object   TYPE e071-object,
+      lv_e071_obj_name TYPE e071-obj_name.
+ 
+    lv_e071_object   = is_item-obj_type.
+    lv_e071_obj_name = is_item-obj_name.
+ 
+    CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
+      EXPORTING
+        iv_action         = 'SHOW'
+        iv_pgmid          = 'R3TR'
+        iv_object         = lv_e071_object
+        iv_obj_name       = lv_e071_obj_name
+      EXCEPTIONS
+        jump_not_possible = 1
+        OTHERS            = 2.
+ 
+    rv_exit = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_wb.
+ 
+    CALL FUNCTION 'RS_TOOL_ACCESS'
+      EXPORTING
+        operation           = 'SHOW'
+        object_name         = is_item-obj_name
+        object_type         = is_item-obj_type
+        devclass            = is_item-devclass
+        in_new_window       = iv_new_window
+      EXCEPTIONS
+        not_executed        = 1
+        invalid_object_type = 2
+        OTHERS              = 3.
+ 
+    rv_exit = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_wb_line.
+ 
+    IF iv_line_number IS NOT INITIAL AND iv_sub_obj_type IS NOT INITIAL AND iv_sub_obj_name IS NOT INITIAL.
+ 
+      " For the line navigation we have to supply the sub object type (iv_sub_obj_type).
+      " If we use is_item-obj_type it navigates only to the object.
+      CALL FUNCTION 'RS_TOOL_ACCESS'
+        EXPORTING
+          operation           = 'SHOW'
+          object_name         = is_item-obj_name
+          object_type         = iv_sub_obj_type
+          devclass            = is_item-devclass
+          include             = iv_sub_obj_name
+          position            = iv_line_number
+          in_new_window       = iv_new_window
+        EXCEPTIONS
+          not_executed        = 1
+          invalid_object_type = 2
+          OTHERS              = 3.
+ 
+      rv_exit = boolc( sy-subrc = 0 ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_jumper~jump.
+ 
+    " WebGUI cannot open windows or ADT
+    IF zcl_abapgit_ui_factory=>get_frontend_services( )->is_webgui( ) = abap_true.
+      zcx_abapgit_exception=>raise( |Jump not possible in WebGUI| ).
+    ENDIF.
+ 
+    " Try all generic jump options
+ 
+    " 1) ADT Jump
+    rv_exit = zif_abapgit_gui_jumper~jump_adt(
+      is_item         = is_item
+      iv_sub_obj_name = is_sub_item-obj_name
+      iv_line_number  = iv_line_number ).
+ 
+    IF rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " 2) WB Jump with Line Number
+    rv_exit = jump_wb_line(
+      is_item         = is_item
+      iv_sub_obj_name = is_sub_item-obj_name
+      iv_sub_obj_type = is_sub_item-obj_type
+      iv_line_number  = iv_line_number
+      iv_new_window   = iv_new_window ).
+ 
+    IF rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " 3) WB Jump without Line Number
+    rv_exit = jump_wb(
+      is_item       = is_item
+      iv_new_window = iv_new_window ).
+ 
+    IF rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " 4) Transport Tool Jump
+    rv_exit = jump_tr( is_item ).
+ 
+    IF rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " 5) BW Jump
+    rv_exit = jump_bw(
+      is_item       = is_item
+      iv_new_window = iv_new_window ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_jumper~jump_abapgit.
+
+    DATA lt_spagpa        TYPE STANDARD TABLE OF rfc_spagpa.
+    DATA ls_spagpa        LIKE LINE OF lt_spagpa.
+    DATA lv_save_sy_langu TYPE sy-langu.
+    DATA lv_subrc         TYPE syst-subrc.
+    DATA lv_tcode         TYPE tcode.
+
+    " https://blogs.sap.com/2017/01/13/logon-language-sy-langu-and-rfc/
+
+    lv_tcode = zcl_abapgit_services_abapgit=>get_abapgit_tcode( ).
+
+    lv_save_sy_langu = sy-langu.
+    SET LOCALE LANGUAGE iv_language.
+
+    ls_spagpa-parid  = zif_abapgit_definitions=>c_spagpa_param_repo_key.
+    ls_spagpa-parval = iv_key.
+    INSERT ls_spagpa INTO TABLE lt_spagpa.
+
+    CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+      DESTINATION 'NONE'
+      STARTING NEW TASK 'ABAPGIT'
+      EXPORTING
+        tcode                   = lv_tcode
+      TABLES
+        spagpa_tab              = lt_spagpa
+      EXCEPTIONS
+        call_transaction_denied = 1
+        tcode_invalid           = 2
+        communication_failure   = 3
+        system_failure          = 4
+        OTHERS                  = 5.
+
+    lv_subrc = sy-subrc.
+
+    SET LOCALE LANGUAGE lv_save_sy_langu.
+
+    IF lv_subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error from ABAP4_CALL_TRANSACTION. Subrc = { lv_subrc }| ).
+    ENDIF.
+
+    MESSAGE 'Repository opened in a new window' TYPE 'S'.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_jumper~jump_adt.
+ 
+    " Open object in ADT (if enabled)
+ 
+    DATA lv_adt_jump_enabled TYPE abap_bool.
+ 
+    lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
+ 
+    IF lv_adt_jump_enabled = abap_true.
+      TRY.
+          zcl_abapgit_adt_link=>jump(
+            iv_obj_name     = is_item-obj_name
+            iv_obj_type     = is_item-obj_type
+            iv_sub_obj_name = iv_sub_obj_name
+            iv_line_number  = iv_line_number ).
+ 
+          rv_exit = abap_true.
+        CATCH zcx_abapgit_exception ##NO_HANDLER.
+          " Use fallback
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_jumper~jump_batch_input.
+
+    DATA lv_msg TYPE c LENGTH 80.
+
+    IF iv_new_window = abap_true.
+      CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+        STARTING NEW TASK 'GIT'
+        EXPORTING
+          tcode                 = iv_tcode
+          mode_val              = 'E'
+        TABLES
+          using_tab             = it_bdcdata
+        EXCEPTIONS
+          system_failure        = 1 MESSAGE lv_msg
+          communication_failure = 2 MESSAGE lv_msg
+          resource_failure      = 3
+          OTHERS                = 4.
+    ELSE.
+      CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
+        EXPORTING
+          tcode     = iv_tcode
+          mode_val  = 'E'
+        TABLES
+          using_tab = it_bdcdata
+        EXCEPTIONS
+          OTHERS    = 4.
+    ENDIF.
+
+    CASE sy-subrc.
+      WHEN 1 OR 2.
+        zcx_abapgit_exception=>raise( |Batch input error for transaction { iv_tcode }: { lv_msg }| ).
+      WHEN 3 OR 4.
+        zcx_abapgit_exception=>raise( |Batch input error for transaction { iv_tcode }| ).
+    ENDCASE.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/oo/index.html b/src/objects/oo/index.html new file mode 100644 index 00000000000..435b7a82b8a --- /dev/null +++ b/src/objects/oo/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/objects/oo + + + + + + + + + +
+
+

All files src/objects/oo

+
+ +
+ 71.31% + Statements + 460/645 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/15 +
+ + +
+ 71.31% + Lines + 460/645 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_oo_base.clas.abap +
+
77.11%219/284100%0/00%0/1277.11%219/284
zcl_abapgit_oo_factory.clas.abap +
+
87.09%27/310%0/2100%0/087.09%27/31
zcl_abapgit_oo_interface.clas.abap +
+
64.84%214/330100%0/00%0/364.84%214/330
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/oo/zcl_abapgit_oo_base.clas.abap.html b/src/objects/oo/zcl_abapgit_oo_base.clas.abap.html new file mode 100644 index 00000000000..db3f6e6ff8b --- /dev/null +++ b/src/objects/oo/zcl_abapgit_oo_base.clas.abap.html @@ -0,0 +1,937 @@ + + + + + + Code coverage report for src/objects/oo/zcl_abapgit_oo_base.clas.abap + + + + + + + + + +
+
+

All files / src/objects/oo zcl_abapgit_oo_base.clas.abap

+
+ +
+ 77.11% + Statements + 219/284 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/12 +
+ + +
+ 77.11% + Lines + 219/284 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +2851x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_oo_base DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_oo_object_fnc .
+  PROTECTED SECTION.
+    CLASS-METHODS:
+      convert_attrib_to_vseoattrib
+        IMPORTING iv_clsname           TYPE seoclsname
+                  it_attributes        TYPE zif_abapgit_definitions=>ty_obj_attribute_tt
+        RETURNING VALUE(rt_vseoattrib) TYPE seoo_attributes_r.
+ 
+  PRIVATE SECTION.
+    CONSTANTS c_docu_state_active TYPE dokstate VALUE 'A'. " See include SDOC_CONSTANTS
+    DATA mv_skip_test_classes TYPE abap_bool .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_oo_base IMPLEMENTATION.
+ 
+ 
+  METHOD convert_attrib_to_vseoattrib.
+    FIELD-SYMBOLS: <ls_attribute>  LIKE LINE OF it_attributes,
+                   <ls_vseoattrib> LIKE LINE OF rt_vseoattrib.
+ 
+    LOOP AT it_attributes ASSIGNING <ls_attribute>.
+      INSERT INITIAL LINE INTO TABLE rt_vseoattrib ASSIGNING <ls_vseoattrib>.
+      MOVE-CORRESPONDING <ls_attribute> TO <ls_vseoattrib>.
+      <ls_vseoattrib>-clsname = iv_clsname.
+      <ls_vseoattrib>-state = seoc_state_implemented.
+      <ls_vseoattrib>-exposure = <ls_attribute>-exposure.
+      UNASSIGN <ls_vseoattrib>.
+    ENDLOOP.
+    UNASSIGN <ls_attribute>.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~add_to_activation_list.
+    zcl_abapgit_objects_activation=>add_item( is_item ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~create.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~create_documentation.
+    CALL FUNCTION 'DOCU_UPD'
+      EXPORTING
+        id            = iv_id
+        langu         = iv_language
+        object        = iv_object_name
+        no_masterlang = iv_no_masterlang
+        state         = c_docu_state_active
+      TABLES
+        line          = it_lines
+      EXCEPTIONS
+        ret_code      = 1
+        OTHERS        = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~create_sotr.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~delete.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~delete_documentation.
+    CALL FUNCTION 'DOCU_DEL'
+      EXPORTING
+        id       = iv_id
+        langu    = iv_language
+        object   = iv_object_name
+        typ      = 'E'
+      EXCEPTIONS
+        ret_code = 1
+        OTHERS   = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error from DOCU_DEL' ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~deserialize_source.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~exists.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~generate_locals.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_class_properties.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_includes.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_interface_properties.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_skip_test_classes.
+    rv_skip = mv_skip_test_classes.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~insert_text_pool.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_attributes.
+    SELECT cmpname attbusobj attkeyfld exposure
+      FROM seocompodf
+      INTO CORRESPONDING FIELDS OF TABLE rt_attributes
+      WHERE clsname = iv_object_name
+        AND ( attbusobj <> space OR attkeyfld <> space )
+        AND version = '1'
+      ORDER BY PRIMARY KEY.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_descriptions.
+    FIELD-SYMBOLS <ls_description> LIKE LINE OF rt_descriptions.
+ 
+    IF iv_language IS INITIAL.
+      " load all languages
+      SELECT * FROM seocompotx INTO TABLE rt_descriptions
+             WHERE clsname   = iv_object_name
+               AND descript <> ''
+             ORDER BY PRIMARY KEY.                        "#EC CI_SUBRC
+    ELSE.
+      " load main language
+      SELECT * FROM seocompotx INTO TABLE rt_descriptions
+              WHERE clsname   = iv_object_name
+                AND langu     = iv_language
+                AND descript <> ''
+              ORDER BY PRIMARY KEY.                       "#EC CI_SUBRC
+    ENDIF.
+ 
+    LOOP AT rt_descriptions ASSIGNING <ls_description>.
+      CLEAR <ls_description>-clsname.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_descriptions_sub.
+    FIELD-SYMBOLS <ls_description> LIKE LINE OF rt_descriptions.
+ 
+    IF iv_language IS INITIAL.
+      " load all languages
+      SELECT * FROM seosubcotx INTO TABLE rt_descriptions
+             WHERE clsname   = iv_object_name
+               AND descript <> ''
+             ORDER BY PRIMARY KEY.                        "#EC CI_SUBRC
+    ELSE.
+      " load main language
+      SELECT * FROM seosubcotx INTO TABLE rt_descriptions
+              WHERE clsname   = iv_object_name
+                AND langu     = iv_language
+                AND descript <> ''
+              ORDER BY PRIMARY KEY.                       "#EC CI_SUBRC
+    ENDIF.
+ 
+    LOOP AT rt_descriptions ASSIGNING <ls_description>.
+      CLEAR <ls_description>-clsname.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_documentation.
+    DATA: lv_state  TYPE dokstate,
+          lt_lines  TYPE tlinetab.
+ 
+    CALL FUNCTION 'DOCU_GET'
+      EXPORTING
+        id                     = iv_id
+        langu                  = iv_language
+        object                 = iv_object_name
+        version_active_or_last = space " retrieve active version
+      IMPORTING
+        dokstate               = lv_state
+      TABLES
+        line                   = lt_lines
+      EXCEPTIONS
+        no_docu_on_screen      = 1
+        no_docu_self_def       = 2
+        no_docu_temp           = 3
+        ret_code               = 4
+        OTHERS                 = 5.
+    IF sy-subrc = 0 AND lv_state = c_docu_state_active.
+      rt_lines = lt_lines.
+    ELSE.
+      CLEAR rt_lines.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_sotr.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_superclass.
+    SELECT SINGLE refclsname FROM vseoextend INTO rv_superclass
+      WHERE clsname = iv_classname.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_text_pool.
+    ASSERT 0 = 1. "Subclass responsibility
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~serialize_abap.
+    DATA lo_oo_serializer TYPE REF TO zcl_abapgit_oo_serializer.
+    CREATE OBJECT lo_oo_serializer.
+    CASE iv_type.
+      WHEN seop_ext_class_locals_def.
+        rt_source = lo_oo_serializer->serialize_locals_def( is_class_key ).
+      WHEN seop_ext_class_locals_imp.
+        rt_source = lo_oo_serializer->serialize_locals_imp( is_class_key ).
+      WHEN seop_ext_class_macros.
+        rt_source = lo_oo_serializer->serialize_macros( is_class_key ).
+      WHEN seop_ext_class_testclasses.
+        rt_source = lo_oo_serializer->serialize_testclasses( is_class_key ).
+        mv_skip_test_classes = lo_oo_serializer->are_test_classes_skipped( ).
+      WHEN OTHERS.
+        rt_source = lo_oo_serializer->serialize_abap_clif_source( is_class_key ).
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~update_descriptions.
+    DATA lt_descriptions LIKE it_descriptions.
+    FIELD-SYMBOLS <ls_description> LIKE LINE OF it_descriptions.
+
+    lt_descriptions = it_descriptions.
+    LOOP AT lt_descriptions ASSIGNING <ls_description>.
+      <ls_description>-clsname = is_key-clsname.
+    ENDLOOP.
+    DELETE FROM seocompotx WHERE clsname = is_key-clsname. "#EC CI_SUBRC
+    INSERT seocompotx FROM TABLE lt_descriptions.         "#EC CI_SUBRC
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~update_descriptions_sub.
+    DATA lt_descriptions LIKE it_descriptions.
+    FIELD-SYMBOLS <ls_description> LIKE LINE OF it_descriptions.
+
+    lt_descriptions = it_descriptions.
+    LOOP AT lt_descriptions ASSIGNING <ls_description>.
+      <ls_description>-clsname = is_key-clsname.
+    ENDLOOP.
+    DELETE FROM seosubcotx WHERE clsname = is_key-clsname. "#EC CI_SUBRC
+    INSERT seosubcotx FROM TABLE lt_descriptions.         "#EC CI_SUBRC
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/oo/zcl_abapgit_oo_factory.clas.abap.html b/src/objects/oo/zcl_abapgit_oo_factory.clas.abap.html new file mode 100644 index 00000000000..a133191f626 --- /dev/null +++ b/src/objects/oo/zcl_abapgit_oo_factory.clas.abap.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/objects/oo/zcl_abapgit_oo_factory.clas.abap + + + + + + + + + +
+
+

All files / src/objects/oo zcl_abapgit_oo_factory.clas.abap

+
+ +
+ 87.09% + Statements + 27/31 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 87.09% + Lines + 27/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +321x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +  +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_oo_factory DEFINITION PUBLIC.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      make
+        IMPORTING
+          iv_object_type                   TYPE tadir-object
+        RETURNING
+          VALUE(ri_object_oriented_object) TYPE REF TO zif_abapgit_oo_object_fnc.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_object_oriented_object TYPE REF TO zif_abapgit_oo_object_fnc .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_oo_factory IMPLEMENTATION.
+ 
+ 
+  METHOD make.
+    IF gi_object_oriented_object IS BOUND.
+      ri_object_oriented_object = gi_object_oriented_object.
+      RETURN.
+    ENDIF.
+    IF iv_object_type = 'CLAS'.
+      CREATE OBJECT ri_object_oriented_object TYPE zcl_abapgit_oo_class.
+    ELSEIF iv_object_type = 'INTF'.
+      CREATE OBJECT ri_object_oriented_object TYPE zcl_abapgit_oo_interface.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/oo/zcl_abapgit_oo_interface.clas.abap.html b/src/objects/oo/zcl_abapgit_oo_interface.clas.abap.html new file mode 100644 index 00000000000..8fcbe654aa9 --- /dev/null +++ b/src/objects/oo/zcl_abapgit_oo_interface.clas.abap.html @@ -0,0 +1,1075 @@ + + + + + + Code coverage report for src/objects/oo/zcl_abapgit_oo_interface.clas.abap + + + + + + + + + +
+
+

All files / src/objects/oo zcl_abapgit_oo_interface.clas.abap

+
+ +
+ 64.84% + Statements + 214/330 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 64.84% + Lines + 214/330 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +3311x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_oo_interface DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_oo_base
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS zif_abapgit_oo_object_fnc~create
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~delete
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~get_includes
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~get_interface_properties
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~deserialize_source
+        REDEFINITION .
+    METHODS zif_abapgit_oo_object_fnc~exists
+        REDEFINITION .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS update_report
+      IMPORTING
+        !iv_program       TYPE syrepid
+        !it_source        TYPE string_table
+        !iv_package       TYPE devclass
+      RETURNING
+        VALUE(rv_updated) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS update_meta
+      IMPORTING
+        !iv_name   TYPE seoclsname
+        !it_source TYPE rswsourcet
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS init_scanner
+      IMPORTING
+        !it_source        TYPE zif_abapgit_definitions=>ty_string_tt
+        !iv_name          TYPE seoclsname
+      RETURNING
+        VALUE(ro_scanner) TYPE REF TO cl_oo_source_scanner_interface
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_oo_interface IMPLEMENTATION.
+ 
+ 
+  METHOD init_scanner.
+ 
+    DATA: lx_exc       TYPE REF TO cx_root,
+          lv_message   TYPE string,
+          lv_classname TYPE abap_abstypename.
+ 
+    FIELD-SYMBOLS: <lv_line> TYPE i.
+ 
+    TRY.
+        ro_scanner = cl_oo_source_scanner_interface=>create_interface_scanner(
+          clif_name = iv_name
+          source    = it_source ).
+        ro_scanner->scan( ).
+      CATCH cx_clif_scan_error.
+        zcx_abapgit_exception=>raise( 'error initializing INTF scanner' ).
+      CATCH cx_root INTO lx_exc.
+        lv_classname = cl_abap_classdescr=>get_class_name( lx_exc ).
+        IF lv_classname = '\CLASS=CX_OO_CLIF_SCAN_ERROR_DETAIL'.
+          ASSIGN lx_exc->('SOURCE_POSITION-LINE') TO <lv_line>.
+          ASSERT sy-subrc = 0.
+          lv_message = |{ lx_exc->get_text( ) }, line { <lv_line> }|.
+        ELSE.
+          lv_message = lx_exc->get_text( ).
+        ENDIF.
+        zcx_abapgit_exception=>raise( lv_message ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_meta.
+ 
+    DATA: lo_update     TYPE REF TO cl_oo_interface_section_source,
+          lx_error      TYPE REF TO cx_oo_source_save_failure,
+          ls_clskey     TYPE seoclskey,
+          lv_scan_error TYPE abap_bool.
+ 
+ 
+    ls_clskey-clsname = iv_name.
+ 
+    TRY.
+        CALL FUNCTION 'SEO_BUFFER_REFRESH'
+          EXPORTING
+            cifkey  = ls_clskey
+            version = seoc_version_active.
+        CREATE OBJECT lo_update TYPE ('CL_OO_INTERFACE_SECTION_SOURCE')
+          EXPORTING
+            intkey                        = ls_clskey
+            state                         = 'A'
+            source                        = it_source
+          EXCEPTIONS
+            interface_not_existing        = 1
+            read_source_error             = 2
+            OTHERS                        = 3 ##SUBRC_OK.
+      CATCH cx_sy_dyn_call_param_not_found.
+* downport to 702, see https://github.com/abapGit/abapGit/issues/933
+* this will READ REPORT instead of using it_source, which should be okay
+        CREATE OBJECT lo_update TYPE cl_oo_interface_section_source
+          EXPORTING
+            intkey                 = ls_clskey
+            state                  = 'A'
+          EXCEPTIONS
+            interface_not_existing = 1
+            read_source_error      = 2
+            OTHERS                 = 3.
+    ENDTRY.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    lo_update->set_dark_mode( abap_true ).
+ 
+    lo_update->scan_section_source(
+      RECEIVING
+        scan_error             = lv_scan_error
+      EXCEPTIONS
+        scan_abap_source_error = 1
+        OTHERS                 = 2 ).
+    IF sy-subrc <> 0 OR lv_scan_error = abap_true.
+      zcx_abapgit_exception=>raise( |INTF, error while scanning source. Subrc = { sy-subrc }| ).
+    ENDIF.
+ 
+* this will update the SEO* database tables
+    TRY.
+        lo_update->revert_scan_result( ).
+      CATCH cx_oo_source_save_failure INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_report.
+    rv_updated = zcl_abapgit_factory=>get_sap_report( )->update_report(
+      iv_name    = iv_program
+      iv_package = iv_package
+      it_source  = it_source ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~create.
+
+    DATA:
+      lt_vseoattrib    TYPE seoo_attributes_r,
+      ls_interface_key TYPE seoclskey,
+      ls_properties    TYPE vseointerf.
+
+    FIELD-SYMBOLS: <lv_clsname> TYPE seoclsname.
+
+    ASSIGN COMPONENT 'CLSNAME' OF STRUCTURE cg_properties TO <lv_clsname>.
+    ASSERT sy-subrc = 0.
+
+    " Get existing interface properties and check if the interface
+    " needs to be created/updated (or is the same)
+    IF iv_check = abap_true.
+      ls_interface_key-clsname = <lv_clsname>.
+      ls_properties = zif_abapgit_oo_object_fnc~get_interface_properties( ls_interface_key ).
+
+      IF ls_properties = cg_properties.
+        RETURN.
+      ENDIF.
+    ENDIF.
+
+    lt_vseoattrib = convert_attrib_to_vseoattrib(
+                      iv_clsname    = <lv_clsname>
+                      it_attributes = it_attributes ).
+
+    " Hardcode STATE (#2612)
+    ls_properties = cg_properties.
+    ls_properties-state = seoc_state_implemented.
+
+    TRY.
+        CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE'
+          EXPORTING
+            devclass        = iv_package
+            overwrite       = abap_true
+            version         = seoc_version_active
+            suppress_dialog = abap_true " Parameter missing in 702
+          CHANGING
+            interface       = ls_properties
+            attributes      = lt_vseoattrib
+          EXCEPTIONS
+            existing        = 1
+            is_class        = 2
+            db_error        = 3
+            component_error = 4
+            no_access       = 5
+            other           = 6
+            OTHERS          = 7.
+      CATCH cx_sy_dyn_call_param_not_found.
+        CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE'
+          EXPORTING
+            devclass        = iv_package
+            overwrite       = abap_true
+            version         = seoc_version_active
+          CHANGING
+            interface       = ls_properties
+            attributes      = lt_vseoattrib
+          EXCEPTIONS
+            existing        = 1
+            is_class        = 2
+            db_error        = 3
+            component_error = 4
+            no_access       = 5
+            other           = 6
+            OTHERS          = 7.
+    ENDTRY.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~delete.
+    CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE'
+      EXPORTING
+        intkey       = is_deletion_key
+      EXCEPTIONS
+        not_existing = 1
+        is_class     = 2
+        db_error     = 3
+        no_access    = 4
+        other        = 5
+        OTHERS       = 6.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~deserialize_source.
+
+    DATA: lv_updated TYPE abap_bool,
+          lv_program TYPE program,
+          lo_scanner TYPE REF TO cl_oo_source_scanner_interface,
+          lt_public  TYPE seop_source_string.
+
+    "Buffer needs to be refreshed,
+    "otherwise standard SAP CLIF_SOURCE reorder methods alphabetically
+    CALL FUNCTION 'SEO_BUFFER_INIT'.
+    CALL FUNCTION 'SEO_BUFFER_REFRESH'
+      EXPORTING
+        cifkey  = is_key
+        version = seoc_version_inactive.
+
+    lo_scanner = init_scanner(
+      it_source = it_source
+      iv_name   = is_key-clsname ).
+
+    lt_public = lo_scanner->get_interface_section_source( ).
+    IF lt_public IS NOT INITIAL.
+      lv_program = cl_oo_classname_service=>get_intfsec_name( is_key-clsname ).
+      lv_updated = update_report( iv_program = lv_program
+                                  iv_package = iv_package
+                                  it_source  = lt_public ).
+      IF lv_updated = abap_true.
+        update_meta( iv_name   = is_key-clsname
+                     it_source = lt_public ).
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~exists.
+    CALL FUNCTION 'SEO_INTERFACE_EXISTENCE_CHECK'
+      EXPORTING
+        intkey        = is_object_name
+      EXCEPTIONS
+        not_specified = 1
+        not_existing  = 2
+        is_class      = 3
+        no_text       = 4
+        inconsistent  = 5
+        OTHERS        = 6.
+    rv_exists = boolc( sy-subrc = 0 OR sy-subrc = 4 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_includes.
+    DATA lv_interface_name TYPE seoclsname.
+    lv_interface_name = iv_object_name.
+    APPEND cl_oo_classname_service=>get_interfacepool_name( lv_interface_name ) TO rt_includes.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_interface_properties.
+    CALL FUNCTION 'SEO_CLIF_GET'
+      EXPORTING
+        cifkey       = is_interface_key
+        version      = seoc_version_active
+      IMPORTING
+        interface    = rs_interface_properties
+      EXCEPTIONS
+        not_existing = 1
+        deleted      = 2
+        model_only   = 3
+        OTHERS       = 4.
+    IF sy-subrc = 1.
+      RETURN. " in case only inactive version exists
+    ELSEIF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    CLEAR:
+      " TODO 2023-08-01: Clear rs_interface_properties-state (#2612)
+      rs_interface_properties-uuid,
+      rs_interface_properties-author,
+      rs_interface_properties-createdon,
+      rs_interface_properties-changedby,
+      rs_interface_properties-changedon,
+      rs_interface_properties-chgdanyby,
+      rs_interface_properties-chgdanyon,
+      rs_interface_properties-r3release,
+      rs_interface_properties-version.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/rules/index.html b/src/objects/rules/index.html new file mode 100644 index 00000000000..c3781799548 --- /dev/null +++ b/src/objects/rules/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/objects/rules + + + + + + + + + +
+
+

All files src/objects/rules

+
+ +
+ 52.13% + Statements + 61/117 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 52.13% + Lines + 61/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_field_rules.clas.abap +
+
52.13%61/117100%0/00%0/352.13%61/117
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/rules/zcl_abapgit_field_rules.clas.abap.html b/src/objects/rules/zcl_abapgit_field_rules.clas.abap.html new file mode 100644 index 00000000000..e5a1589054e --- /dev/null +++ b/src/objects/rules/zcl_abapgit_field_rules.clas.abap.html @@ -0,0 +1,436 @@ + + + + + + Code coverage report for src/objects/rules/zcl_abapgit_field_rules.clas.abap + + + + + + + + + +
+
+

All files / src/objects/rules zcl_abapgit_field_rules.clas.abap

+
+ +
+ 52.13% + Statements + 61/117 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 52.13% + Lines + 61/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +1181x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_field_rules DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_field_rules.
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ro_result) TYPE REF TO zif_abapgit_field_rules.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_item,
+        tabname   TYPE tabname,
+        fieldname TYPE fieldname,
+        fill_rule TYPE zif_abapgit_field_rules=>ty_fill_rule,
+      END OF ty_item,
+      ty_items TYPE SORTED TABLE OF ty_item WITH UNIQUE KEY tabname fieldname.
+ 
+    DATA mt_item TYPE ty_items.
+ 
+    METHODS fill_value
+      IMPORTING
+        iv_rule    TYPE zif_abapgit_field_rules=>ty_fill_rule
+        iv_package TYPE devclass
+      CHANGING
+        cv_value   TYPE any.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_FIELD_RULES IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_result TYPE zcl_abapgit_field_rules.
+  ENDMETHOD.
+ 
+ 
+  METHOD fill_value.
+    CASE iv_rule.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-date.
+        cv_value = sy-datum.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-time.
+        cv_value = sy-uzeit.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-timestamp.
+        GET TIME STAMP FIELD cv_value.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-user.
+        cv_value = sy-uname.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-client.
+        cv_value = sy-mandt.
+      WHEN zif_abapgit_field_rules=>c_fill_rule-package.
+        cv_value = iv_package.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_field_rules~add.
+    DATA ls_item TYPE ty_item.
+ 
+    ls_item-tabname   = iv_table.
+    ls_item-fieldname = iv_field.
+    ls_item-fill_rule = iv_fill_rule.
+    INSERT ls_item INTO TABLE mt_item.
+ 
+    ro_self = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_field_rules~apply_clear_logic.
+    DATA ls_item TYPE ty_item.
+
+    FIELD-SYMBOLS <ls_data> TYPE any.
+    FIELD-SYMBOLS <lv_value> TYPE any.
+
+    IF mt_item IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    LOOP AT ct_data ASSIGNING <ls_data>.
+      LOOP AT mt_item INTO ls_item WHERE tabname = iv_table.
+        ASSIGN COMPONENT ls_item-fieldname OF STRUCTURE <ls_data> TO <lv_value>.
+        IF sy-subrc = 0.
+          CLEAR <lv_value>.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_field_rules~apply_fill_logic.
+    DATA ls_item TYPE ty_item.
+
+    FIELD-SYMBOLS <ls_data> TYPE any.
+    FIELD-SYMBOLS <lv_value> TYPE any.
+
+    IF mt_item IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    LOOP AT ct_data ASSIGNING <ls_data>.
+      LOOP AT mt_item INTO ls_item WHERE tabname = iv_table.
+        ASSIGN COMPONENT ls_item-fieldname OF STRUCTURE <ls_data> TO <lv_value>.
+        IF sy-subrc = 0.
+          fill_value(
+            EXPORTING
+              iv_rule    = ls_item-fill_rule
+              iv_package = iv_package
+            CHANGING
+              cv_value   = <lv_value> ).
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/sap/index.html b/src/objects/sap/index.html new file mode 100644 index 00000000000..1ef01ff8273 --- /dev/null +++ b/src/objects/sap/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/objects/sap + + + + + + + + + +
+
+

All files src/objects/sap

+
+ +
+ 59.16% + Statements + 368/622 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 59.16% + Lines + 368/622 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_sap_namespace.clas.abap +
+
100%29/29100%0/0100%0/0100%29/29
zcl_abapgit_sap_package.clas.abap +
+
57.42%232/404100%0/00%0/457.42%232/404
zcl_abapgit_sap_report.clas.abap +
+
56.61%107/189100%0/00%0/356.61%107/189
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/sap/zcl_abapgit_sap_namespace.clas.abap.html b/src/objects/sap/zcl_abapgit_sap_namespace.clas.abap.html new file mode 100644 index 00000000000..77a5debd8f6 --- /dev/null +++ b/src/objects/sap/zcl_abapgit_sap_namespace.clas.abap.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/objects/sap/zcl_abapgit_sap_namespace.clas.abap + + + + + + + + + +
+
+

All files / src/objects/sap zcl_abapgit_sap_namespace.clas.abap

+
+ +
+ 100% + Statements + 29/29 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 29/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +301x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_sap_namespace DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_sap_namespace.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_SAP_NAMESPACE IMPLEMENTATION.
+ 
+ 
+  METHOD zif_abapgit_sap_namespace~exists.
+    DATA lv_editflag TYPE trnspace-editflag.
+    SELECT SINGLE editflag FROM trnspace INTO lv_editflag WHERE namespace = iv_namespace.
+    rv_yes = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_namespace~is_editable.
+    DATA lv_editflag TYPE trnspace-editflag.
+    SELECT SINGLE editflag FROM trnspace INTO lv_editflag WHERE namespace = iv_namespace.
+    rv_yes = boolc( sy-subrc = 0 AND lv_editflag = 'X' ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/sap/zcl_abapgit_sap_package.clas.abap.html b/src/objects/sap/zcl_abapgit_sap_package.clas.abap.html new file mode 100644 index 00000000000..15d2a750d5d --- /dev/null +++ b/src/objects/sap/zcl_abapgit_sap_package.clas.abap.html @@ -0,0 +1,1297 @@ + + + + + + Code coverage report for src/objects/sap/zcl_abapgit_sap_package.clas.abap + + + + + + + + + +
+
+

All files / src/objects/sap zcl_abapgit_sap_package.clas.abap

+
+ +
+ 57.42% + Statements + 232/404 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 57.42% + Lines + 232/404 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +4051x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_sap_package DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_sap_package .
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_package TYPE devclass .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA: mv_package TYPE devclass.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_sap_package IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mv_package = iv_package.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req.
+ 
+    DATA: li_package TYPE REF TO if_package.
+ 
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = mv_package
+      IMPORTING
+        e_package                  = li_package
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5
+        OTHERS                     = 6 ).
+ 
+    CASE sy-subrc.
+      WHEN 0.
+        rv_are_changes_rec_in_tr_req = li_package->wbo_korr_flag.
+      WHEN 1.
+        " For new packages, derive from package name
+        rv_are_changes_rec_in_tr_req = boolc( mv_package(1) <> '$' ).
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise_t100( ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~create.
+
+    DATA: lv_err     TYPE string,
+          li_package TYPE REF TO if_package,
+          ls_package LIKE is_package.
+
+
+    ASSERT NOT is_package-devclass IS INITIAL.
+
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = is_package-devclass
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5 ).
+    IF sy-subrc = 0.
+      " Package already exists. We assume this is fine. Its properties might be changed later at
+      " DEVC deserialization.
+      RETURN.
+    ENDIF.
+
+    ls_package = is_package.
+
+    " Set software component to 'HOME' if none is set at this point.
+    " Otherwise SOFTWARE_COMPONENT_INVALID will be raised.
+    IF ls_package-dlvunit IS INITIAL.
+      ls_package-dlvunit = 'HOME'.
+    ENDIF.
+
+    " For transportable packages, get default transport and layer
+    IF ls_package-devclass(1) <> '$' AND ls_package-pdevclass IS INITIAL.
+      ls_package-pdevclass = zif_abapgit_sap_package~get_transport_layer( ).
+    ENDIF.
+
+    cl_package_factory=>create_new_package(
+      EXPORTING
+        i_reuse_deleted_object     = abap_true
+*        i_suppress_dialog          = abap_true " does not exist in 730
+      IMPORTING
+        e_package                  = li_package
+      CHANGING
+        c_package_data             = ls_package
+      EXCEPTIONS
+        object_already_existing    = 1
+        object_just_created        = 2
+        not_authorized             = 3
+        wrong_name_prefix          = 4
+        undefined_name             = 5
+        reserved_local_name        = 6
+        invalid_package_name       = 7
+        short_text_missing         = 8
+        software_component_invalid = 9
+        layer_invalid              = 10
+        author_not_existing        = 11
+        component_not_existing     = 12
+        component_missing          = 13
+        prefix_in_use              = 14
+        unexpected_error           = 15
+        intern_err                 = 16
+        no_access                  = 17
+*        invalid_translation_depth  = 18
+*        wrong_mainpack_value       = 19
+*        superpackage_invalid       = 20
+*        error_in_cts_checks        = 21
+        OTHERS                     = 18 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    li_package->save(
+*      EXPORTING
+*        i_suppress_dialog     = abap_true    " Controls whether popups can be transmitted
+      EXCEPTIONS
+        object_invalid        = 1
+        object_not_changeable = 2
+        cancelled_in_corr     = 3
+        permission_failure    = 4
+        unexpected_error      = 5
+        intern_err            = 6
+        OTHERS                = 7 ).
+    IF sy-subrc <> 0.
+
+      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
+        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_err.
+
+      " Here we have to delete the package,
+      " otherwise it would remain in the memory
+      " and cannot created again in this session.
+      li_package->delete(
+        EXCEPTIONS
+          object_not_empty      = 1
+          object_not_changeable = 2
+          object_invalid        = 3
+          intern_err            = 4
+          OTHERS                = 5 ).
+
+      zcx_abapgit_exception=>raise( lv_err ).
+
+    ENDIF.
+
+    li_package->set_changeable( abap_false ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~create_child.
+
+    DATA: li_parent TYPE REF TO if_package,
+          ls_child  TYPE scompkdtln.
+
+
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = mv_package
+      IMPORTING
+        e_package                  = li_parent
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    ls_child-devclass  = iv_child.
+    ls_child-dlvunit   = li_parent->software_component.
+    ls_child-component = li_parent->application_component.
+    ls_child-ctext     = iv_child.
+    ls_child-parentcl  = mv_package.
+    ls_child-pdevclass = li_parent->transport_layer.
+    ls_child-as4user   = sy-uname.
+
+    zif_abapgit_sap_package~create( ls_child ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~create_local.
+
+    DATA: ls_package TYPE scompkdtln.
+
+
+    ls_package-devclass  = mv_package.
+    ls_package-ctext     = mv_package.
+    ls_package-parentcl  = '$TMP'.
+    ls_package-dlvunit   = 'LOCAL'.
+    ls_package-as4user   = sy-uname.
+
+    zif_abapgit_sap_package~create( ls_package ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~exists.
+ 
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = mv_package
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5 ).
+    rv_bool = boolc( sy-subrc <> 1 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer.
+ 
+    " Get default transport layer
+    CALL FUNCTION 'TR_GET_TRANSPORT_TARGET'
+      EXPORTING
+        iv_use_default             = abap_true
+        iv_get_layer_only          = abap_true
+      IMPORTING
+        ev_layer                   = rv_transport_layer
+      EXCEPTIONS
+        wrong_call                 = 1
+        invalid_input              = 2
+        cts_initialization_failure = 3
+        OTHERS                     = 4.
+    IF sy-subrc <> 0.
+      " Return empty layer (i.e. "local workbench request" for the package)
+      CLEAR rv_transport_layer.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type.
+ 
+    DATA:
+      lv_pkg_name TYPE e071-obj_name,
+      lv_obj_name TYPE tadir-obj_name,
+      lv_role     TYPE trnrole.
+ 
+    lv_pkg_name = mv_package.
+    lv_obj_name = mv_package.
+ 
+    CALL FUNCTION 'TR_GET_REQUEST_TYPE'
+      EXPORTING
+        iv_pgmid          = 'R3TR'
+        iv_object         = 'DEVC'
+        iv_obj_name       = lv_pkg_name
+      IMPORTING
+        ev_request_type   = rs_transport_type-request
+        ev_task_type      = rs_transport_type-task
+      EXCEPTIONS
+        no_request_needed = 1
+        invalid_object    = 2
+        system_error      = 3
+        OTHERS            = 4.
+ 
+    CASE sy-subrc.
+      WHEN 0 OR 1.
+        RETURN.
+      WHEN 2.
+        " For new packages, set to workbench request
+        rs_transport_type-request = 'K'.
+ 
+        CALL FUNCTION 'TR_GET_NAMESPACE_AND_ROLE'
+          EXPORTING
+            iv_pgmid                   = 'R3TR'
+            iv_object                  = 'DEVC'
+            iv_objname                 = lv_obj_name
+          IMPORTING
+            ev_role                    = lv_role
+          EXCEPTIONS
+            namespace_not_existing     = 1
+            invalid_object             = 2
+            namespace_not_determinable = 3
+            OTHERS                     = 4.
+        IF sy-subrc = 0 AND lv_role = 'C'.
+          " Namespace with repair license requires repair task
+          rs_transport_type-task = 'R'.
+        ELSE.
+          " Otherweise use correction task
+          rs_transport_type-task = 'S'.
+        ENDIF.
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise_t100( ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~list_subpackages.
+ 
+    DATA: lt_list     LIKE rt_list.
+ 
+    SELECT devclass FROM tdevc
+      INTO TABLE lt_list
+      WHERE parentcl = mv_package
+      ORDER BY PRIMARY KEY.               "#EC CI_SUBRC "#EC CI_GENBUFF
+ 
+    rt_list = lt_list.
+    WHILE lines( lt_list ) > 0.
+ 
+      SELECT devclass FROM tdevc
+        INTO TABLE lt_list
+        FOR ALL ENTRIES IN lt_list
+        WHERE parentcl = lt_list-table_line
+        ORDER BY PRIMARY KEY.             "#EC CI_SUBRC "#EC CI_GENBUFF
+      APPEND LINES OF lt_list TO rt_list.
+ 
+    ENDWHILE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages.
+ 
+    DATA: lt_list   LIKE rt_list,
+          lv_parent TYPE tdevc-parentcl.
+ 
+ 
+    APPEND mv_package TO rt_list.
+ 
+    lv_parent = zif_abapgit_sap_package~read_parent( ).
+ 
+    IF sy-subrc = 0 AND NOT lv_parent IS INITIAL.
+      lt_list = zcl_abapgit_factory=>get_sap_package( lv_parent )->list_superpackages( ).
+      APPEND LINES OF lt_list TO rt_list.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+ 
+    SELECT SINGLE ctext FROM tdevct INTO rv_description
+      WHERE devclass = mv_package AND spras = sy-langu ##SUBRC_OK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~read_parent.
+ 
+    SELECT SINGLE parentcl FROM tdevc INTO rv_parentcl
+      WHERE devclass = mv_package.                      "#EC CI_GENBUFF
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Inconsistent package structure! Cannot find parent for { mv_package }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    SELECT SINGLE as4user FROM tdevc
+      INTO rv_responsible
+      WHERE devclass = mv_package ##SUBRC_OK.           "#EC CI_GENBUFF
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+
+    IF mv_package IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Package name must not be empty' ).
+    ENDIF.
+
+    IF mv_package = '$TMP'.
+      zcx_abapgit_exception=>raise( 'It is not possible to use $TMP, use a different (local) package' ).
+    ENDIF.
+
+    " Check if package name is allowed
+    cl_package_helper=>check_package_name(
+      EXPORTING
+        i_package_name       = mv_package
+      EXCEPTIONS
+        undefined_name       = 1
+        wrong_name_prefix    = 2
+        reserved_local_name  = 3
+        invalid_package_name = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Package name { mv_package } is not valid| ).
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/sap/zcl_abapgit_sap_report.clas.abap.html b/src/objects/sap/zcl_abapgit_sap_report.clas.abap.html new file mode 100644 index 00000000000..2151d1d63e3 --- /dev/null +++ b/src/objects/sap/zcl_abapgit_sap_report.clas.abap.html @@ -0,0 +1,652 @@ + + + + + + Code coverage report for src/objects/sap/zcl_abapgit_sap_report.clas.abap + + + + + + + + + +
+
+

All files / src/objects/sap zcl_abapgit_sap_report.clas.abap

+
+ +
+ 56.61% + Statements + 107/189 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 56.61% + Lines + 107/189 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +1901x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_sap_report DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_sap_report.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS get_language_version
+      IMPORTING
+        iv_package        TYPE devclass
+        iv_version        TYPE zif_abapgit_sap_report=>ty_abap_language_version
+      RETURNING
+        VALUE(rv_version) TYPE zif_abapgit_sap_report=>ty_abap_language_version.
+ 
+    METHODS authorization_check
+      IMPORTING
+        iv_mode    TYPE csequence
+        is_item    TYPE zif_abapgit_definitions=>ty_item
+        iv_version TYPE zif_abapgit_sap_report=>ty_abap_language_version OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_sap_report IMPLEMENTATION.
+ 
+ 
+  METHOD authorization_check.
+
+    IF is_item IS NOT INITIAL.
+      " TODO: Check for ABAP Language Version (ABAP_LANGU_VERSION_UPON_INSERT = iv_version)
+      CALL FUNCTION 'RS_ACCESS_PERMISSION'
+        EXPORTING
+          mode                     = iv_mode
+          object                   = is_item-obj_name
+          object_class             = is_item-obj_type
+          suppress_corr_check      = abap_true
+          suppress_language_check  = abap_true
+          suppress_extend_dialog   = abap_true
+        EXCEPTIONS
+          canceled_in_corr         = 1
+          enqueued_by_user         = 2
+          enqueue_system_failure   = 3
+          illegal_parameter_values = 4
+          locked_by_author         = 5
+          no_modify_permission     = 6
+          no_show_permission       = 7
+          permission_failure       = 8
+          request_language_denied  = 9
+          OTHERS                   = 10.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD get_language_version.
+ 
+    ASSERT iv_version CA ' X25'.
+ 
+    " TODO: Determine ABAP Language Version
+    " https://github.com/abapGit/abapGit/issues/6154#issuecomment-1503566920)
+ 
+    " For now, use default for ABAP source code
+    IF zcl_abapgit_factory=>get_environment( )->is_sap_cloud_platform( ) = abap_true.
+      rv_version = '5'. " abap_for_cloud_development
+    ELSE.
+      rv_version = 'X'. " standard_abap
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_report~delete_report.
+
+    authorization_check(
+      iv_mode = 'DELETE'
+      is_item = is_item ).
+
+    DELETE REPORT iv_name.
+
+    IF sy-subrc <> 0 AND iv_raise_error = abap_true.
+      zcx_abapgit_exception=>raise( |Error deleting report { iv_name }| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_report~insert_report.
+
+    DATA lv_version TYPE zif_abapgit_sap_report=>ty_abap_language_version ##NEEDED.
+    DATA lv_obj_name TYPE e071-obj_name.
+
+    ASSERT iv_state CA ' AI'.
+    ASSERT iv_program_type CA ' 1FIJKMST'.
+
+    lv_version = get_language_version(
+      iv_package = iv_package
+      iv_version = iv_version ).
+
+    authorization_check(
+      iv_mode    = 'MODIFY'
+      is_item    = is_item
+      iv_version = lv_version ).
+
+    " TODO: Add `VERSION lv_version` but it's not supported in lower releases
+    IF iv_state IS INITIAL.
+      INSERT REPORT iv_name FROM it_source.
+        "VERSION lv_version.
+    ELSEIF iv_program_type IS INITIAL AND iv_extension_type IS INITIAL.
+      INSERT REPORT iv_name FROM it_source
+        STATE   iv_state.
+        "VERSION lv_version.
+    ELSEIF iv_extension_type IS INITIAL.
+      INSERT REPORT iv_name FROM it_source
+        STATE        iv_state
+        PROGRAM TYPE iv_program_type.
+        "VERSION      lv_version.
+    ELSE.
+      INSERT REPORT iv_name FROM it_source
+        STATE          iv_state
+        EXTENSION TYPE iv_extension_type
+        PROGRAM TYPE   iv_program_type.
+        "VERSION        lv_version.
+    ENDIF.
+
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error inserting report { iv_name }| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_report~read_report.
+ 
+    ASSERT iv_state CA ' AI'.
+ 
+    authorization_check(
+      iv_mode = 'SHOW'
+      is_item = is_item ).
+ 
+    IF iv_state IS INITIAL.
+      READ REPORT iv_name INTO rt_source.
+    ELSE.
+      READ REPORT iv_name INTO rt_source STATE iv_state.
+    ENDIF.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error reading report { iv_name }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_sap_report~update_report.
+ 
+    DATA lt_new TYPE string_table.
+    DATA lt_old TYPE string_table.
+ 
+    lt_new = it_source.
+    lt_old = zif_abapgit_sap_report~read_report( iv_name ).
+ 
+    IF lt_old <> lt_new.
+      zif_abapgit_sap_report~insert_report(
+        iv_name            = iv_name
+        it_source          = it_source
+        iv_state           = iv_state
+        iv_program_type    = iv_program_type
+        iv_extension_type  = iv_extension_type
+        iv_package         = iv_package
+        iv_version         = iv_version
+        is_item            = is_item ).
+ 
+      rv_updated = abap_true.
+    ELSE.
+      rv_updated = abap_false.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/index.html b/src/objects/texts/index.html new file mode 100644 index 00000000000..03971c28243 --- /dev/null +++ b/src/objects/texts/index.html @@ -0,0 +1,266 @@ + + + + + + Code coverage report for src/objects/texts + + + + + + + + + +
+
+

All files src/objects/texts

+
+ +
+ 88.64% + Statements + 2748/3100 +
+ + +
+ 82.5% + Branches + 66/80 +
+ + +
+ 61.11% + Functions + 22/36 +
+ + +
+ 88.64% + Lines + 2748/3100 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_i18n_params.clas.abap +
+
95.43%209/21976.47%13/17100%4/495.43%209/219
zcl_abapgit_i18n_params.clas.testclasses.abap +
+
100%174/174100%3/3100%3/3100%174/174
zcl_abapgit_longtexts.clas.abap +
+
87.18%245/28175%3/433.33%1/387.18%245/281
zcl_abapgit_longtexts.clas.testclasses.abap +
+
100%61/61100%2/2100%2/2100%61/61
zcl_abapgit_lxe_texts.clas.abap +
+
70.68%545/77187.5%7/80%0/870.68%545/771
zcl_abapgit_lxe_texts.clas.testclasses.abap +
+
100%132/132100%3/3100%3/3100%132/132
zcl_abapgit_po_file.clas.abap +
+
97.6%366/37578.94%30/38100%4/497.6%366/375
zcl_abapgit_po_file.clas.testclasses.abap +
+
100%262/262100%5/5100%5/5100%262/262
zcl_abapgit_sotr_handler.clas.abap +
+
100%386/386100%0/0100%0/0100%386/386
zcl_abapgit_sotr_handler.clas.testclasses.abap +
+
35.45%39/110100%0/00%0/435.45%39/110
zcl_abapgit_sots_handler.clas.abap +
+
100%329/329100%0/0100%0/0100%329/329
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_i18n_params.clas.abap.html b/src/objects/texts/zcl_abapgit_i18n_params.clas.abap.html new file mode 100644 index 00000000000..2d294dddc6c --- /dev/null +++ b/src/objects/texts/zcl_abapgit_i18n_params.clas.abap.html @@ -0,0 +1,742 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_i18n_params.clas.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_i18n_params.clas.abap

+
+ +
+ 95.43% + Statements + 209/219 +
+ + +
+ 76.47% + Branches + 13/17 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 95.43% + Lines + 209/219 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +2201x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +3x +3x +3x +3x +3x +3x +3x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +  +4x +4x +4x +4x +1x +1x +3x +2x +2x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +  +2x +2x +2x +2x +1x +1x +2x +1x +1x +1x + 
CLASS zcl_abapgit_i18n_params DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    DATA ms_params TYPE zif_abapgit_definitions=>ty_i18n_params READ-ONLY .
+ 
+    CLASS-METHODS new
+      IMPORTING
+        !iv_main_language      TYPE spras DEFAULT zif_abapgit_definitions=>c_english
+        !iv_main_language_only TYPE abap_bool DEFAULT abap_false
+        !it_translation_langs  TYPE zif_abapgit_definitions=>ty_languages OPTIONAL
+        !iv_use_lxe            TYPE abap_bool DEFAULT abap_false
+        !is_params             TYPE zif_abapgit_definitions=>ty_i18n_params OPTIONAL
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_i18n_params .
+    METHODS constructor
+      IMPORTING
+        !iv_main_language      TYPE spras DEFAULT zif_abapgit_definitions=>c_english
+        !iv_main_language_only TYPE abap_bool DEFAULT abap_false
+        !it_translation_langs  TYPE zif_abapgit_definitions=>ty_languages OPTIONAL
+        !iv_use_lxe            TYPE abap_bool DEFAULT abap_false
+        !is_params             TYPE zif_abapgit_definitions=>ty_i18n_params OPTIONAL .
+ 
+    METHODS is_lxe_applicable
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS build_language_filter
+      RETURNING
+        VALUE(rt_language_filter) TYPE zif_abapgit_environment=>ty_system_language_filter .
+    METHODS trim_saplang_list
+      CHANGING
+        ct_sap_langs  TYPE zif_abapgit_definitions=>ty_sap_langu_tab
+      RAISING
+        zcx_abapgit_exception.
+    METHODS trim_saplang_keyed_table
+      IMPORTING
+        iv_lang_field_name  TYPE abap_compname
+        iv_keep_master_lang TYPE abap_bool DEFAULT abap_false  "sy-langu OPTIONAL
+      CHANGING
+        ct_tab              TYPE STANDARD TABLE
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    CLASS-METHODS iso_langs_to_lang_filter
+      IMPORTING
+        it_iso_filter      TYPE zif_abapgit_definitions=>ty_languages
+      RETURNING
+        VALUE(rt_language_filter) TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_I18N_PARAMS IMPLEMENTATION.
+ 
+ 
+  METHOD build_language_filter.
+    IF mt_language_filter IS INITIAL.
+      " translation_languages are includes, system langs are excludes, so the do not interfere
+      IF ms_params-translation_languages IS NOT INITIAL.
+        mt_language_filter = iso_langs_to_lang_filter( ms_params-translation_languages ).
+      ELSE.
+        mt_language_filter = zcl_abapgit_factory=>get_environment( )->get_system_language_filter( ).
+      ENDIF.
+    ENDIF.
+    rt_language_filter = mt_language_filter.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    IF is_params IS NOT INITIAL.
+      ms_params = is_params.
+    ELSE.
+      ms_params-main_language         = iv_main_language.
+      ms_params-main_language_only    = iv_main_language_only.
+      ms_params-translation_languages = it_translation_langs.
+      ms_params-use_lxe               = iv_use_lxe.
+    ENDIF.
+    ASSERT ms_params-main_language IS NOT INITIAL.
+  ENDMETHOD.
+ 
+ 
+  METHOD iso_langs_to_lang_filter.
+ 
+    DATA lv_laiso LIKE LINE OF it_iso_filter.
+    DATA lv_langu TYPE sy-langu.
+    DATA ls_range LIKE LINE OF rt_language_filter.
+ 
+    ls_range-sign = 'I'.
+    ls_range-option = 'EQ'.
+ 
+    LOOP AT it_iso_filter INTO lv_laiso.
+ 
+      cl_i18n_languages=>sap2_to_sap1(
+        EXPORTING
+          im_lang_sap2  = lv_laiso
+        RECEIVING
+          re_lang_sap1  = lv_langu
+        EXCEPTIONS
+          no_assignment = 1
+          OTHERS        = 2 ).
+      IF sy-subrc <> 0.
+        CONTINUE.
+      ENDIF.
+ 
+      ls_range-low = lv_langu.
+      APPEND ls_range TO rt_language_filter.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_lxe_applicable.
+ 
+    rv_yes = boolc( ms_params-main_language_only = abap_false AND
+       ms_params-use_lxe = abap_true AND
+       ms_params-translation_languages IS NOT INITIAL ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_main_language      = iv_main_language
+        iv_main_language_only = iv_main_language_only
+        it_translation_langs  = it_translation_langs
+        iv_use_lxe            = iv_use_lxe
+        is_params             = is_params.
+  ENDMETHOD.
+ 
+ 
+  METHOD trim_saplang_keyed_table.
+ 
+    DATA lv_laiso TYPE laiso.
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_i> TYPE any.
+    FIELD-SYMBOLS <lv_langu> TYPE sy-langu.
+ 
+    IF ms_params-translation_languages IS INITIAL OR iv_lang_field_name IS INITIAL.
+      RETURN. " Nothing to filter
+    ENDIF.
+ 
+    LOOP AT ct_tab ASSIGNING <ls_i>.
+      lv_index = sy-tabix.
+      ASSIGN COMPONENT iv_lang_field_name OF STRUCTURE <ls_i> TO <lv_langu>.
+      ASSERT sy-subrc = 0.
+ 
+      IF iv_keep_master_lang = abap_true AND <lv_langu> = ms_params-main_language.
+        CONTINUE. " Just keep it
+      ENDIF.
+ 
+      cl_i18n_languages=>sap1_to_sap2(
+        EXPORTING
+          im_lang_sap1  = <lv_langu>
+        RECEIVING
+          re_lang_sap2  = lv_laiso
+        EXCEPTIONS
+          no_assignment = 1
+          OTHERS        = 2 ).
+      IF sy-subrc <> 0.
+        DELETE ct_tab INDEX lv_index. " Not in the list anyway ...
+        CONTINUE.
+      ENDIF.
+ 
+      " Not a sorted table, but presumably the list is small, so no significant performance flow
+      READ TABLE ms_params-translation_languages TRANSPORTING NO FIELDS WITH KEY table_line = lv_laiso.
+      IF sy-subrc <> 0.
+        DELETE ct_tab INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD trim_saplang_list.
+ 
+    DATA lv_langu TYPE sy-langu.
+    DATA lv_laiso TYPE laiso.
+    DATA lv_index TYPE i.
+ 
+    IF ms_params-translation_languages IS INITIAL.
+      RETURN. " Nothing to filter
+    ENDIF.
+ 
+    LOOP AT ct_sap_langs INTO lv_langu.
+      lv_index = sy-tabix.
+ 
+      cl_i18n_languages=>sap1_to_sap2(
+        EXPORTING
+          im_lang_sap1  = lv_langu
+        RECEIVING
+          re_lang_sap2  = lv_laiso
+        EXCEPTIONS
+          no_assignment = 1
+          OTHERS        = 2 ).
+      IF sy-subrc <> 0.
+        DELETE ct_sap_langs INDEX lv_index. " Not in the list anyway ...
+        CONTINUE.
+      ENDIF.
+ 
+      " Not a sorted table, but presumably the list is small, so no significant performance flow
+      READ TABLE ms_params-translation_languages TRANSPORTING NO FIELDS WITH KEY table_line = lv_laiso.
+      IF sy-subrc <> 0.
+        DELETE ct_sap_langs INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_i18n_params.clas.testclasses.abap.html b/src/objects/texts/zcl_abapgit_i18n_params.clas.testclasses.abap.html new file mode 100644 index 00000000000..5d8553fdad4 --- /dev/null +++ b/src/objects/texts/zcl_abapgit_i18n_params.clas.testclasses.abap.html @@ -0,0 +1,607 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_i18n_params.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_i18n_params.clas.testclasses.abap

+
+ +
+ 100% + Statements + 174/174 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 174/174 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +1751x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_i18n_params_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS iso_langs_to_lang_filter FOR TESTING.
+    METHODS filter_sap_langs FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS filter_sap_langs_tab FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_i18n_params DEFINITION LOCAL FRIENDS ltcl_i18n_params_test.
+ 
+CLASS ltcl_i18n_params_test IMPLEMENTATION.
+ 
+  METHOD iso_langs_to_lang_filter.
+ 
+    DATA lt_filter TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lt_act TYPE zif_abapgit_environment=>ty_system_language_filter.
+    DATA lt_exp TYPE zif_abapgit_environment=>ty_system_language_filter.
+    DATA ls_range LIKE LINE OF lt_act.
+ 
+    APPEND 'EN' TO lt_filter.
+    APPEND 'DE' TO lt_filter.
+ 
+    ls_range-sign   = 'I'.
+    ls_range-option = 'EQ'.
+    ls_range-low    = 'E'.
+    APPEND ls_range TO lt_exp.
+    ls_range-low    = 'D'.
+    APPEND ls_range TO lt_exp.
+ 
+    lt_act = zcl_abapgit_i18n_params=>iso_langs_to_lang_filter( lt_filter ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD filter_sap_langs.
+ 
+    DATA lt_act TYPE zif_abapgit_definitions=>ty_sap_langu_tab.
+    DATA lt_exp TYPE zif_abapgit_definitions=>ty_sap_langu_tab.
+    DATA lt_filter TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lo_p TYPE REF TO zcl_abapgit_i18n_params.
+ 
+    APPEND 'DE' TO lt_filter.
+    APPEND 'EN' TO lt_filter.
+ 
+    APPEND 'E' TO lt_act.
+    APPEND 'D' TO lt_act.
+    APPEND 'S' TO lt_act.
+ 
+    APPEND 'E' TO lt_exp.
+    APPEND 'D' TO lt_exp.
+ 
+    lo_p = zcl_abapgit_i18n_params=>new(
+      iv_main_language = '?'
+      it_translation_langs = lt_filter ).
+    lo_p->trim_saplang_list( CHANGING ct_sap_langs = lt_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+    " Empty filter
+    CLEAR: lt_act, lt_exp, lt_filter.
+    APPEND 'E' TO lt_act.
+    APPEND 'D' TO lt_act.
+ 
+    APPEND 'E' TO lt_exp.
+    APPEND 'D' TO lt_exp.
+ 
+    lo_p = zcl_abapgit_i18n_params=>new(
+      iv_main_language = '?'
+      it_translation_langs = lt_filter ).
+    lo_p->trim_saplang_list( CHANGING ct_sap_langs = lt_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD filter_sap_langs_tab.
+ 
+    DATA:
+      BEGIN OF ls_i,
+        spras TYPE sy-langu,
+        stuff TYPE string,
+      END OF ls_i.
+ 
+    DATA lt_act LIKE TABLE OF ls_i.
+    DATA lt_exp LIKE TABLE OF ls_i.
+    DATA lt_filter TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lo_p TYPE REF TO zcl_abapgit_i18n_params.
+ 
+    APPEND 'DE' TO lt_filter.
+    APPEND 'EN' TO lt_filter.
+ 
+    ls_i-spras = 'E'.
+    APPEND ls_i TO lt_act.
+    ls_i-spras = 'D'.
+    APPEND ls_i TO lt_act.
+    ls_i-spras = 'S'.
+    APPEND ls_i TO lt_act.
+ 
+    ls_i-spras = 'E'.
+    APPEND ls_i TO lt_exp.
+    ls_i-spras = 'D'.
+    APPEND ls_i TO lt_exp.
+ 
+    lo_p = zcl_abapgit_i18n_params=>new(
+      iv_main_language = '?'
+      it_translation_langs = lt_filter ).
+    lo_p->trim_saplang_keyed_table(
+      EXPORTING
+        iv_lang_field_name = 'SPRAS'
+      CHANGING
+        ct_tab = lt_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+    " Keep master lang
+    CLEAR lt_filter.
+    APPEND 'DE' TO lt_filter.
+ 
+    lo_p = zcl_abapgit_i18n_params=>new(
+      iv_main_language = 'E'
+      it_translation_langs = lt_filter ).
+    lo_p->trim_saplang_keyed_table(
+      EXPORTING
+        iv_lang_field_name  = 'SPRAS'
+        iv_keep_master_lang = abap_true
+      CHANGING
+        ct_tab = lt_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+    " Empty filter
+    CLEAR: lt_act, lt_exp, lt_filter.
+    ls_i-spras = 'E'.
+    APPEND ls_i TO lt_act.
+    ls_i-spras = 'D'.
+    APPEND ls_i TO lt_act.
+ 
+    ls_i-spras = 'E'.
+    APPEND ls_i TO lt_exp.
+    ls_i-spras = 'D'.
+    APPEND ls_i TO lt_exp.
+ 
+    lo_p = zcl_abapgit_i18n_params=>new(
+      iv_main_language = '?'
+      it_translation_langs = lt_filter ).
+    lo_p->trim_saplang_keyed_table(
+      EXPORTING
+        iv_lang_field_name = 'SPRAS'
+      CHANGING
+        ct_tab = lt_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_act
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_longtexts.clas.abap.html b/src/objects/texts/zcl_abapgit_longtexts.clas.abap.html new file mode 100644 index 00000000000..854cd0347f3 --- /dev/null +++ b/src/objects/texts/zcl_abapgit_longtexts.clas.abap.html @@ -0,0 +1,928 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_longtexts.clas.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_longtexts.clas.abap

+
+ +
+ 87.18% + Statements + 245/281 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 87.18% + Lines + 245/281 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +2821x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_longtexts DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_longtexts.
+ 
+  PROTECTED SECTION.
+ 
+    METHODS read
+      IMPORTING
+        !iv_object_name     TYPE clike
+        !iv_longtext_id     TYPE dokil-id
+        !it_dokil           TYPE zif_abapgit_definitions=>ty_dokil_tt
+        !iv_main_lang_only  TYPE abap_bool DEFAULT abap_false
+        !iv_clear_fields    TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rt_longtexts) TYPE zif_abapgit_longtexts=>ty_longtexts
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_docu_state_active TYPE dokstate VALUE 'A' ##NO_TEXT.
+ 
+    METHODS escape_name
+      IMPORTING
+        !iv_longtext_id  TYPE dokil-id
+        !iv_object_name  TYPE clike
+      RETURNING
+        VALUE(rv_object) TYPE dokil-object.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_LONGTEXTS IMPLEMENTATION.
+ 
+ 
+  METHOD escape_name.
+    " Prepare name for SQL LIKE condition
+    rv_object = iv_object_name.
+ 
+    IF 'CA,CE,CO,CT,IA,IE,IO,WC,FU,FX,DI,IS,PS' CS iv_longtext_id.
+      " Document types of objects with sub-objects
+      rv_object+30 = '%'.
+    ELSEIF 'OD' CS iv_longtext_id.
+      rv_object+10 = '%'.
+    ENDIF.
+ 
+    rv_object = replace(
+      val  = rv_object
+      sub  = '_'
+      with = '#_'
+      occ  = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    DATA: ls_longtext TYPE zif_abapgit_longtexts=>ty_longtext,
+          lv_object   TYPE dokil-object,
+          lt_dokil    TYPE zif_abapgit_definitions=>ty_dokil_tt.
+ 
+    FIELD-SYMBOLS: <ls_dokil> LIKE LINE OF lt_dokil.
+ 
+    lv_object = escape_name(
+      iv_longtext_id = iv_longtext_id
+      iv_object_name = iv_object_name ).
+ 
+    IF lines( it_dokil ) > 0.
+ 
+      lt_dokil = it_dokil.
+ 
+      IF iv_main_lang_only = abap_true.
+        DELETE lt_dokil WHERE masterlang <> abap_true.
+      ENDIF.
+ 
+    ELSEIF iv_longtext_id IS NOT INITIAL.
+      IF iv_main_lang_only = abap_true.
+        SELECT * FROM dokil
+                 INTO TABLE lt_dokil
+                 WHERE id     = iv_longtext_id
+                 AND object LIKE lv_object ESCAPE '#'
+                 AND masterlang = abap_true
+                 ORDER BY PRIMARY KEY.
+      ELSE.
+        SELECT * FROM dokil
+                 INTO TABLE lt_dokil
+                 WHERE id     = iv_longtext_id
+                 AND object LIKE lv_object ESCAPE '#'
+                 ORDER BY PRIMARY KEY.
+      ENDIF.
+    ELSE.
+ 
+      zcx_abapgit_exception=>raise( |serialize_longtexts parameter error| ).
+ 
+    ENDIF.
+ 
+    LOOP AT lt_dokil ASSIGNING <ls_dokil>
+                     WHERE txtlines > 0.
+ 
+      CLEAR: ls_longtext.
+ 
+      ls_longtext-dokil = <ls_dokil>.
+ 
+      CALL FUNCTION 'DOCU_READ'
+        EXPORTING
+          id      = <ls_dokil>-id
+          langu   = <ls_dokil>-langu
+          object  = <ls_dokil>-object
+          typ     = <ls_dokil>-typ
+          version = <ls_dokil>-version
+        IMPORTING
+          head    = ls_longtext-head
+        TABLES
+          line    = ls_longtext-lines.
+ 
+      IF iv_clear_fields = abap_true.
+        CLEAR: ls_longtext-head-tdfuser,
+               ls_longtext-head-tdfreles,
+               ls_longtext-head-tdfdate,
+               ls_longtext-head-tdftime,
+               ls_longtext-head-tdluser,
+               ls_longtext-head-tdlreles,
+               ls_longtext-head-tdldate,
+               ls_longtext-head-tdltime.
+      ENDIF.
+ 
+      INSERT ls_longtext INTO TABLE rt_longtexts.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_longtexts~changed_by.
+ 
+    DATA: lt_longtexts TYPE zif_abapgit_longtexts=>ty_longtexts.
+    FIELD-SYMBOLS: <ls_longtext> TYPE zif_abapgit_longtexts=>ty_longtext.
+ 
+    lt_longtexts = read( iv_object_name  = iv_object_name
+                         iv_longtext_id  = iv_longtext_id
+                         it_dokil        = it_dokil
+                         iv_clear_fields = abap_false ).
+ 
+    READ TABLE lt_longtexts INDEX 1 ASSIGNING <ls_longtext>.
+    IF sy-subrc = 0.
+      rv_user = <ls_longtext>-head-tdluser.
+      IF rv_user IS INITIAL.
+        rv_user = <ls_longtext>-head-tdfuser.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_longtexts~delete.
+
+    DATA: lt_dokil  TYPE zif_abapgit_definitions=>ty_dokil_tt,
+          lv_object TYPE dokil-object.
+
+    FIELD-SYMBOLS: <ls_dokil> TYPE dokil.
+
+    lv_object = escape_name(
+      iv_longtext_id = iv_longtext_id
+      iv_object_name = iv_object_name ).
+
+    SELECT * FROM dokil
+      INTO TABLE lt_dokil
+      WHERE id     = iv_longtext_id
+      AND   object LIKE lv_object ESCAPE '#'.
+
+    LOOP AT lt_dokil ASSIGNING <ls_dokil>.
+
+      CALL FUNCTION 'DOCU_DEL'
+        EXPORTING
+          id       = <ls_dokil>-id
+          langu    = <ls_dokil>-langu
+          object   = <ls_dokil>-object
+          typ      = <ls_dokil>-typ
+        EXCEPTIONS
+          ret_code = 1
+          OTHERS   = 2.
+
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_longtexts~deserialize.
+ 
+    DATA: lt_longtexts    TYPE zif_abapgit_longtexts=>ty_longtexts,
+          lv_object       TYPE dokil-object,
+          lt_dokil        TYPE zif_abapgit_definitions=>ty_dokil_tt,
+          lv_no_main_lang TYPE dokil-masterlang.
+ 
+    FIELD-SYMBOLS: <ls_longtext> TYPE zif_abapgit_longtexts=>ty_longtext,
+                   <ls_dokil>    TYPE dokil.
+ 
+    lv_object = escape_name(
+      iv_longtext_id = iv_longtext_id
+      iv_object_name = iv_object_name ).
+ 
+    ii_xml->read(
+      EXPORTING
+        iv_name = iv_longtext_name
+      CHANGING
+        cg_data = lt_longtexts ).
+ 
+    LOOP AT lt_longtexts ASSIGNING <ls_longtext>.
+ 
+      lv_no_main_lang = boolc( iv_main_language <> <ls_longtext>-dokil-langu ).
+ 
+      CALL FUNCTION 'DOCU_UPDATE'
+        EXPORTING
+          head          = <ls_longtext>-head
+          state         = c_docu_state_active
+          typ           = <ls_longtext>-dokil-typ
+          version       = <ls_longtext>-dokil-version
+          no_masterlang = lv_no_main_lang
+        TABLES
+          line          = <ls_longtext>-lines.
+ 
+    ENDLOOP.
+ 
+    " Read existing texts and check if they were deserialized above
+    " If not, delete the texts
+    SELECT * FROM dokil
+      INTO TABLE lt_dokil
+      WHERE id     = iv_longtext_id
+      AND   object LIKE lv_object ESCAPE '#'.
+ 
+    LOOP AT lt_dokil ASSIGNING <ls_dokil>.
+ 
+      READ TABLE lt_longtexts TRANSPORTING NO FIELDS WITH KEY
+        dokil-id     = <ls_dokil>-id
+        dokil-langu  = <ls_dokil>-langu
+        dokil-object = <ls_dokil>-object
+        dokil-typ    = <ls_dokil>-typ.
+      IF sy-subrc <> 0.
+        CALL FUNCTION 'DOCU_DEL'
+          EXPORTING
+            id       = <ls_dokil>-id
+            langu    = <ls_dokil>-langu
+            object   = <ls_dokil>-object
+            typ      = <ls_dokil>-typ
+          EXCEPTIONS
+            ret_code = 1
+            OTHERS   = 2.
+ 
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_longtexts~serialize.
+ 
+    rt_longtexts = read( iv_object_name    = iv_object_name
+                         iv_longtext_id    = iv_longtext_id
+                         it_dokil          = it_dokil
+                         iv_main_lang_only = io_i18n_params->ms_params-main_language_only ).
+ 
+    IF rt_longtexts IS SUPPLIED.
+      RETURN.
+    ENDIF.
+ 
+    ii_xml->add( iv_name = iv_longtext_name
+                 ig_data = rt_longtexts ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap.html b/src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap.html new file mode 100644 index 00000000000..6a0025adad3 --- /dev/null +++ b/src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap.html @@ -0,0 +1,268 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_longtexts.clas.testclasses.abap

+
+ +
+ 100% + Statements + 61/61 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 61/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +621x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_longtexts DEFINITION FOR TESTING RISK LEVEL HARMLESS
+  DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    DATA mo_cut TYPE REF TO zcl_abapgit_longtexts.
+ 
+    METHODS:
+      setup,
+      escape_name FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_longtexts DEFINITION LOCAL FRIENDS ltcl_longtexts.
+ 
+CLASS ltcl_longtexts IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_cut.
+  ENDMETHOD.
+ 
+  METHOD escape_name.
+ 
+    DATA lv_act TYPE dokil-object.
+ 
+    " no sub-objects
+    lv_act = mo_cut->escape_name(
+      iv_longtext_id = 'CL'
+      iv_object_name = 'ZTEST' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = 'ZTEST' ).
+ 
+    lv_act = mo_cut->escape_name(
+      iv_longtext_id = 'CL'
+      iv_object_name = 'ZCL_TEST_TEXT' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = 'ZCL#_TEST#_TEXT' ).
+ 
+    " with sub-objects
+    lv_act = mo_cut->escape_name(
+      iv_longtext_id = 'CA'
+      iv_object_name = 'ZTEST' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = 'ZTEST                         %' ).
+ 
+    lv_act = mo_cut->escape_name(
+      iv_longtext_id = 'CA'
+      iv_object_name = 'ZCL_TEST_TEXT' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = 'ZCL#_TEST#_TEXT                 %' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_lxe_texts.clas.abap.html b/src/objects/texts/zcl_abapgit_lxe_texts.clas.abap.html new file mode 100644 index 00000000000..af38e59b89c --- /dev/null +++ b/src/objects/texts/zcl_abapgit_lxe_texts.clas.abap.html @@ -0,0 +1,2398 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_lxe_texts.clas.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_lxe_texts.clas.abap

+
+ +
+ 70.68% + Statements + 545/771 +
+ + +
+ 87.5% + Branches + 7/8 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 70.68% + Lines + 545/771 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +7721x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_lxe_texts DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_lxe_texts .
+ 
+    CLASS-METHODS class_constructor.
+    CLASS-METHODS get_translation_languages
+      IMPORTING
+        !iv_main_language   TYPE spras
+        !it_i18n_languages  TYPE zif_abapgit_definitions=>ty_languages
+      RETURNING
+        VALUE(rt_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS get_installed_languages
+      RETURNING
+        VALUE(rt_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS convert_lang_string_to_table
+      IMPORTING
+        !iv_langs              TYPE string
+        !iv_skip_main_language TYPE spras OPTIONAL
+      RETURNING
+        VALUE(rt_languages)    TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS convert_table_to_lang_string
+      IMPORTING
+        !it_languages   TYPE zif_abapgit_definitions=>ty_languages
+      RETURNING
+        VALUE(rv_langs) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS detect_unsupported_languages
+      IMPORTING
+        !it_languages                   TYPE zif_abapgit_definitions=>ty_languages
+      RETURNING
+        VALUE(rt_unsupported_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_object_supported
+      IMPORTING
+        iv_object_type TYPE tadir-object
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_custmnr TYPE lxecustmnr VALUE '999999'.
+    " The value for ABAP system translation is always 999999 (from lxecustmnr docs)
+ 
+    TYPES:
+      BEGIN OF ty_lxe_translation,
+        source_lang TYPE lxeisolang,
+        target_lang TYPE lxeisolang,
+        custmnr     TYPE lxecustmnr,
+        objtype     TYPE trobjtype,
+        objname     TYPE lxeobjname,
+        text_pairs  TYPE zif_abapgit_lxe_texts=>ty_text_pairs,
+      END OF ty_lxe_translation.
+    TYPES:
+      ty_lxe_translations TYPE STANDARD TABLE OF ty_lxe_translation WITH DEFAULT KEY .
+ 
+    CLASS-DATA gt_installed_languages_cache TYPE zif_abapgit_definitions=>ty_languages.
+    CLASS-DATA gt_supported_obj_types TYPE STANDARD TABLE OF tadir-object.
+ 
+    DATA mo_i18n_params TYPE REF TO zcl_abapgit_i18n_params.
+    DATA mi_xml_out     TYPE REF TO zif_abapgit_xml_output.
+    DATA mi_xml_in      TYPE REF TO zif_abapgit_xml_input.
+    DATA mo_files       TYPE REF TO zcl_abapgit_objects_files.
+ 
+    METHODS serialize_xml
+      IMPORTING
+        !iv_lxe_text_name TYPE string DEFAULT 'LXE_TEXTS'
+        !iv_object_type   TYPE tadir-object
+        !iv_object_name   TYPE tadir-obj_name
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS serialize_as_po
+      IMPORTING
+        !iv_object_type   TYPE tadir-object
+        !iv_object_name   TYPE tadir-obj_name
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS deserialize_xml
+      IMPORTING
+        !iv_lxe_text_name TYPE string DEFAULT 'LXE_TEXTS'
+        !iv_object_type   TYPE tadir-object OPTIONAL
+        !iv_object_name   TYPE tadir-obj_name OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS deserialize_from_po
+      IMPORTING
+        !iv_object_type   TYPE tadir-object
+        !iv_object_name   TYPE tadir-obj_name
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS get_lang_iso4
+      IMPORTING
+        iv_src         TYPE laiso
+      RETURNING
+        VALUE(rv_iso4) TYPE lxeisolang
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_lxe_object_list
+      IMPORTING
+        iv_object_type     TYPE trobjtype
+        iv_object_name     TYPE sobj_name
+      RETURNING
+        VALUE(rt_obj_list) TYPE lxe_tt_colob .
+    METHODS read_lxe_object_text_pair
+      IMPORTING
+        iv_s_lang                TYPE lxeisolang
+        iv_t_lang                TYPE lxeisolang
+        iv_custmnr               TYPE lxecustmnr
+        iv_objtype               TYPE trobjtype
+        iv_objname               TYPE lxeobjname
+        iv_read_only             TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rt_text_pairs_tmp) TYPE ty_lxe_translation-text_pairs
+      RAISING
+        zcx_abapgit_exception.
+    METHODS write_lxe_object_text_pair
+      IMPORTING
+        iv_s_lang  TYPE lxeisolang
+        iv_t_lang  TYPE lxeisolang
+        iv_custmnr TYPE lxecustmnr
+        iv_objtype TYPE trobjtype
+        iv_objname TYPE lxeobjname
+        it_pcx_s1  TYPE ty_lxe_translation-text_pairs
+      RAISING
+        zcx_abapgit_exception.
+    METHODS read_text_items
+      IMPORTING
+        iv_object_type       TYPE tadir-object
+        iv_object_name       TYPE tadir-obj_name
+      RETURNING
+        VALUE(rt_text_items) TYPE ty_lxe_translations
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS langu_to_laiso_safe
+      IMPORTING
+        iv_langu        TYPE sy-langu
+      RETURNING
+        VALUE(rv_laiso) TYPE laiso
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS iso4_to_iso2
+      IMPORTING
+        iv_lxe_lang     TYPE lxeisolang
+      RETURNING
+        VALUE(rv_laiso) TYPE laiso
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS check_langs_versus_installed
+      IMPORTING
+        it_languages    TYPE zif_abapgit_definitions=>ty_languages
+        it_installed    TYPE zif_abapgit_definitions=>ty_languages
+      EXPORTING
+        et_intersection TYPE zif_abapgit_definitions=>ty_languages
+        et_missfits     TYPE zif_abapgit_definitions=>ty_languages.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_LXE_TEXTS IMPLEMENTATION.
+ 
+ 
+  METHOD check_langs_versus_installed.
+ 
+    DATA lt_installed_hash TYPE HASHED TABLE OF laiso WITH UNIQUE KEY table_line.
+    FIELD-SYMBOLS <lv_lang> LIKE LINE OF it_languages.
+ 
+    CLEAR: et_intersection, et_missfits.
+    lt_installed_hash = it_installed.
+ 
+    LOOP AT it_languages ASSIGNING <lv_lang>.
+      READ TABLE lt_installed_hash WITH KEY table_line = <lv_lang> TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        APPEND <lv_lang> TO et_intersection.
+      ELSE.
+        APPEND <lv_lang> TO et_missfits.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_constructor.
+ 
+    APPEND 'CLAS' TO gt_supported_obj_types.
+    APPEND 'DOMA' TO gt_supported_obj_types.
+    APPEND 'DTEL' TO gt_supported_obj_types.
+    APPEND 'FUGR' TO gt_supported_obj_types.
+    APPEND 'MSAG' TO gt_supported_obj_types.
+    APPEND 'PARA' TO gt_supported_obj_types.
+    APPEND 'PROG' TO gt_supported_obj_types.
+    APPEND 'SHI3' TO gt_supported_obj_types.
+    APPEND 'TABL' TO gt_supported_obj_types.
+    APPEND 'TRAN' TO gt_supported_obj_types.
+    APPEND 'VIEW' TO gt_supported_obj_types.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD convert_lang_string_to_table.
+ 
+    DATA:
+      lt_langs_str          TYPE string_table,
+      lv_laiso              TYPE laiso,
+      lv_skip_main_lang_iso TYPE laiso.
+ 
+    FIELD-SYMBOLS:
+      <lv_str>  LIKE LINE OF lt_langs_str.
+ 
+    " Keep * as indicator for 'all installed languages'
+    IF iv_langs = '*'.
+      APPEND iv_langs TO rt_languages.
+      RETURN.
+    ENDIF.
+ 
+    " Convert string of 2-letter ISO languages into table of sy-langu codes
+    SPLIT iv_langs AT ',' INTO TABLE lt_langs_str.
+ 
+    LOOP AT lt_langs_str ASSIGNING <lv_str>.
+      lv_laiso = condense( to_upper( <lv_str> ) ).
+      APPEND lv_laiso TO rt_languages.
+    ENDLOOP.
+ 
+    IF iv_skip_main_language IS NOT INITIAL.
+      lv_skip_main_lang_iso = langu_to_laiso_safe( iv_skip_main_language ).
+      DELETE rt_languages WHERE table_line = lv_skip_main_lang_iso.
+    ENDIF.
+ 
+    SORT rt_languages.
+    DELETE ADJACENT DUPLICATES FROM rt_languages.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD convert_table_to_lang_string.
+ 
+    DATA:
+      lt_langs_str TYPE string_table.
+ 
+    FIELD-SYMBOLS:
+      <lv_lang> LIKE LINE OF it_languages,
+      <lv_str>  TYPE string.
+ 
+    " Convert table of sy-langu codes into string of 2-letter ISO languages
+    LOOP AT it_languages ASSIGNING <lv_lang>.
+      " Keep * as indicator for 'all installed languages'
+      IF <lv_lang> = '*'.
+        CLEAR lt_langs_str.
+        APPEND '*' TO lt_langs_str.
+        EXIT.
+      ENDIF.
+ 
+      APPEND INITIAL LINE TO lt_langs_str ASSIGNING <lv_str>.
+      <lv_str> = <lv_lang>.
+    ENDLOOP.
+ 
+    CONCATENATE LINES OF lt_langs_str INTO rv_langs SEPARATED BY ','.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_from_po.
+
+    DATA lv_lang LIKE LINE OF mo_i18n_params->ms_params-translation_languages.
+    DATA lt_po_files TYPE zif_abapgit_i18n_file=>ty_table_of.
+    DATA li_po LIKE LINE OF lt_po_files.
+    DATA lt_text_pairs_tmp TYPE ty_lxe_translation-text_pairs.
+    DATA lt_obj_list TYPE lxe_tt_colob.
+    DATA lv_main_lang TYPE lxeisolang.
+    DATA lv_target_lang TYPE lxeisolang.
+
+    FIELD-SYMBOLS <lv_lxe_object> LIKE LINE OF lt_obj_list.
+
+    lt_obj_list = get_lxe_object_list(
+      iv_object_name = iv_object_name
+      iv_object_type = iv_object_type ).
+
+    IF lt_obj_list IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    lt_po_files  = mo_files->read_i18n_files( ).
+    lv_main_lang = get_lang_iso4( langu_to_laiso_safe( mo_i18n_params->ms_params-main_language ) ).
+
+    LOOP AT mo_i18n_params->ms_params-translation_languages INTO lv_lang.
+      lv_target_lang = get_lang_iso4( lv_lang ).
+
+      LOOP AT lt_po_files INTO li_po.
+        IF li_po->lang( ) = to_lower( lv_lang ). " Not quite efficient but the list is presumably very short
+          EXIT.
+        ELSE.
+          CLEAR li_po.
+        ENDIF.
+      ENDLOOP.
+
+      CHECK li_po IS BOUND. " Ignore missing files, missing translation is not a crime
+
+      LOOP AT lt_obj_list ASSIGNING <lv_lxe_object>.
+
+        lt_text_pairs_tmp = read_lxe_object_text_pair(
+          iv_s_lang    = lv_main_lang
+          iv_t_lang    = lv_target_lang
+          iv_custmnr   = <lv_lxe_object>-custmnr
+          iv_objtype   = <lv_lxe_object>-objtype
+          iv_objname   = <lv_lxe_object>-objname
+          iv_read_only = abap_false ).
+
+        li_po->translate( CHANGING ct_text_pairs = lt_text_pairs_tmp ).
+        " TODO maybe optimize, check if values have changed
+
+        write_lxe_object_text_pair(
+          iv_s_lang  = lv_main_lang
+          iv_t_lang  = lv_target_lang
+          iv_custmnr = <lv_lxe_object>-custmnr
+          iv_objtype = <lv_lxe_object>-objtype
+          iv_objname = <lv_lxe_object>-objname
+          it_pcx_s1  = lt_text_pairs_tmp ).
+
+      ENDLOOP.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_xml.
+
+    DATA:
+      lt_lxe_texts      TYPE ty_lxe_translations,
+      ls_lxe_item       LIKE LINE OF lt_lxe_texts,
+      lt_text_pairs_tmp LIKE ls_lxe_item-text_pairs.
+
+    mi_xml_in->read(
+      EXPORTING iv_name = iv_lxe_text_name
+      CHANGING  cg_data = lt_lxe_texts ).
+
+    LOOP AT lt_lxe_texts INTO ls_lxe_item.
+      " Call Read first for buffer prefill
+
+      lt_text_pairs_tmp = read_lxe_object_text_pair(
+        iv_s_lang    = ls_lxe_item-source_lang
+        iv_t_lang    = ls_lxe_item-target_lang
+        iv_custmnr   = ls_lxe_item-custmnr
+        iv_objtype   = ls_lxe_item-objtype
+        iv_objname   = ls_lxe_item-objname
+        iv_read_only = abap_false ).
+
+      "Call actual Write FM
+      write_lxe_object_text_pair(
+        iv_s_lang  = ls_lxe_item-source_lang
+        iv_t_lang  = ls_lxe_item-target_lang
+        iv_custmnr = ls_lxe_item-custmnr
+        iv_objtype = ls_lxe_item-objtype
+        iv_objname = ls_lxe_item-objname
+        it_pcx_s1  = ls_lxe_item-text_pairs ).
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD detect_unsupported_languages.
+ 
+    check_langs_versus_installed(
+      EXPORTING
+        it_languages = it_languages
+        it_installed = get_installed_languages( )
+      IMPORTING
+        et_missfits = rt_unsupported_languages ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_installed_languages.
+ 
+    DATA:
+      lv_index               TYPE i,
+      lv_langu               TYPE sy-langu,
+      lv_laiso               TYPE laiso,
+      lv_installed_languages TYPE string,
+      lt_language_filter     TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    IF gt_installed_languages_cache IS INITIAL.
+      CALL FUNCTION 'SYSTEM_INSTALLED_LANGUAGES'
+        IMPORTING
+          languages       = lv_installed_languages
+        EXCEPTIONS
+          sapgparam_error = 1                " Error requesting profile parameter
+          OTHERS          = 2.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( 'Fail to get system SYSTEM_INSTALLED_LANGUAGES' ).
+      ENDIF.
+ 
+      lt_language_filter = zcl_abapgit_factory=>get_environment( )->get_system_language_filter( ).
+ 
+      DO strlen( lv_installed_languages ) TIMES.
+        lv_index = sy-index - 1.
+        lv_langu = lv_installed_languages+lv_index(1).
+ 
+        IF lv_langu NOT IN lt_language_filter.
+          CONTINUE.
+        ENDIF.
+ 
+        lv_laiso = langu_to_laiso_safe( lv_langu ).
+        APPEND lv_laiso TO gt_installed_languages_cache.
+      ENDDO.
+    ENDIF.
+ 
+    rt_languages = gt_installed_languages_cache.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_lang_iso4.
+ 
+    DATA lv_lang_iso639 TYPE laiso.
+    DATA lv_country     TYPE land1.
+ 
+    cl_i18n_languages=>sap2_to_iso639_1(
+      EXPORTING
+        im_lang_sap2   = iv_src
+      IMPORTING
+        ex_lang_iso639 = lv_lang_iso639
+        ex_country     = lv_country
+      EXCEPTIONS
+        no_assignment  = 1
+        OTHERS         = 2 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Failed to convert [{ iv_src }] lang to iso639| ).
+    ENDIF.
+ 
+    CONCATENATE lv_lang_iso639 lv_country INTO rv_iso4.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_lxe_object_list.
+ 
+    DATA lv_object_name TYPE trobj_name.
+ 
+    lv_object_name = iv_object_name.
+ 
+    CALL FUNCTION 'LXE_OBJ_EXPAND_TRANSPORT_OBJ'
+      EXPORTING
+        pgmid           = 'R3TR'
+        object          = iv_object_type
+        obj_name        = lv_object_name
+      TABLES
+        ex_colob        = rt_obj_list
+      EXCEPTIONS
+        unknown_object  = 1
+        unknown_ta_type = 2
+        OTHERS          = 3.
+    IF sy-subrc <> 0.
+      RETURN. " Ignore error and return empty list
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_translation_languages.
+ 
+    " Returns a list of translation languages for serialization
+    " If the setting is initial, no translations shall be serialized
+    " If the setting is `*`, all all installed system languages shall be serialized
+    " Else, the setting shall contain all languages to be serialized
+ 
+    DATA lv_main_lang_laiso TYPE laiso.
+ 
+    IF it_i18n_languages IS NOT INITIAL.
+      READ TABLE it_i18n_languages TRANSPORTING NO FIELDS WITH KEY table_line = '*'.
+      IF sy-subrc = 0.
+        rt_languages = get_installed_languages( ).
+      ELSE.
+        check_langs_versus_installed(
+          EXPORTING
+            it_languages = it_i18n_languages
+            it_installed = get_installed_languages( )
+          IMPORTING
+            et_intersection = rt_languages ).
+      ENDIF.
+    ENDIF.
+ 
+    " Remove main language from translation languages
+    lv_main_lang_laiso = langu_to_laiso_safe( iv_main_language ).
+    DELETE rt_languages WHERE table_line = lv_main_lang_laiso.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD iso4_to_iso2.
+    rv_laiso = iv_lxe_lang+0(2).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_object_supported.
+    READ TABLE gt_supported_obj_types TRANSPORTING NO FIELDS WITH KEY table_line = iv_object_type.
+    rv_yes = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD langu_to_laiso_safe.
+ 
+    cl_i18n_languages=>sap1_to_sap2(
+      EXPORTING
+        im_lang_sap1  = iv_langu
+      RECEIVING
+        re_lang_sap2  = rv_laiso
+      EXCEPTIONS
+        no_assignment = 1
+        OTHERS        = 2 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Could not convert lang [{ iv_langu }] to ISO| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_lxe_object_text_pair.
+ 
+    DATA:
+      lv_error TYPE lxestring.
+ 
+    TRY.
+        CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ'
+          EXPORTING
+            s_lang    = iv_s_lang
+            t_lang    = iv_t_lang
+            custmnr   = iv_custmnr
+            objtype   = iv_objtype
+            objname   = iv_objname
+            read_only = iv_read_only
+          IMPORTING
+            err_msg   = lv_error  " doesn't exist in NW <= 750
+          TABLES
+            lt_pcx_s1 = rt_text_pairs_tmp.
+        IF lv_error IS NOT INITIAL.
+          zcx_abapgit_exception=>raise( lv_error ).
+        ENDIF.
+ 
+      CATCH cx_sy_dyn_call_param_not_found.
+ 
+        CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_READ'
+          EXPORTING
+            s_lang    = iv_s_lang
+            t_lang    = iv_t_lang
+            custmnr   = iv_custmnr
+            objtype   = iv_objtype
+            objname   = iv_objname
+            read_only = iv_read_only
+          TABLES
+            lt_pcx_s1 = rt_text_pairs_tmp.
+ 
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_text_items.
+ 
+    DATA:
+      lt_obj_list      TYPE lxe_tt_colob,
+      lv_main_lang     TYPE lxeisolang,
+      ls_lxe_text_item LIKE LINE OF rt_text_items.
+ 
+    FIELD-SYMBOLS:
+      <lv_language>   LIKE LINE OF mo_i18n_params->ms_params-translation_languages,
+      <lv_lxe_object> LIKE LINE OF lt_obj_list.
+ 
+    lt_obj_list = get_lxe_object_list(
+      iv_object_name = iv_object_name
+      iv_object_type = iv_object_type ).
+ 
+    IF lt_obj_list IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " Get list of languages that need to be serialized (already resolves * and installed languages)
+    lv_main_lang = get_lang_iso4( langu_to_laiso_safe( mo_i18n_params->ms_params-main_language ) ).
+ 
+    LOOP AT lt_obj_list ASSIGNING <lv_lxe_object>.
+      CLEAR ls_lxe_text_item.
+      ls_lxe_text_item-custmnr = <lv_lxe_object>-custmnr.
+      ls_lxe_text_item-objtype = <lv_lxe_object>-objtype.
+      ls_lxe_text_item-objname = <lv_lxe_object>-objname.
+ 
+      LOOP AT mo_i18n_params->ms_params-translation_languages ASSIGNING <lv_language>.
+        ls_lxe_text_item-source_lang = lv_main_lang.
+        ls_lxe_text_item-target_lang = get_lang_iso4( <lv_language> ).
+        IF ls_lxe_text_item-source_lang = ls_lxe_text_item-target_lang.
+          CONTINUE. " if source = target -> skip
+        ENDIF.
+ 
+        ls_lxe_text_item-text_pairs = read_lxe_object_text_pair(
+          iv_s_lang    = ls_lxe_text_item-source_lang
+          iv_t_lang    = ls_lxe_text_item-target_lang
+          iv_custmnr   = ls_lxe_text_item-custmnr
+          iv_objtype   = ls_lxe_text_item-objtype
+          iv_objname   = ls_lxe_text_item-objname ).
+ 
+        IF ls_lxe_text_item-text_pairs IS NOT INITIAL.
+          APPEND ls_lxe_text_item TO rt_text_items.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_as_po.
+
+    DATA lt_lxe_texts TYPE ty_lxe_translations.
+    DATA lo_po_file TYPE REF TO zcl_abapgit_po_file.
+    DATA lv_lang LIKE LINE OF mo_i18n_params->ms_params-translation_languages.
+    FIELD-SYMBOLS <ls_translation> LIKE LINE OF lt_lxe_texts.
+
+    lt_lxe_texts = read_text_items(
+      iv_object_name   = iv_object_name
+      iv_object_type   = iv_object_type ).
+
+    LOOP AT mo_i18n_params->ms_params-translation_languages INTO lv_lang.
+      lv_lang = to_lower( lv_lang ).
+      CREATE OBJECT lo_po_file
+        EXPORTING
+          iv_lang = lv_lang.
+      LOOP AT lt_lxe_texts ASSIGNING <ls_translation>.
+        IF iso4_to_iso2( <ls_translation>-target_lang ) = lv_lang.
+          lo_po_file->push_text_pairs(
+            iv_objtype    = <ls_translation>-objtype
+            iv_objname    = <ls_translation>-objname
+            it_text_pairs = <ls_translation>-text_pairs ).
+        ENDIF.
+      ENDLOOP.
+      mo_files->add_i18n_file( lo_po_file ).
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_xml.
+
+    DATA lt_lxe_texts TYPE ty_lxe_translations.
+
+    lt_lxe_texts = read_text_items(
+      iv_object_name   = iv_object_name
+      iv_object_type   = iv_object_type ).
+
+    IF lines( lt_lxe_texts ) > 0.
+      mi_xml_out->add(
+        iv_name = iv_lxe_text_name
+        ig_data = lt_lxe_texts ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD write_lxe_object_text_pair.
+
+    DATA:
+      lv_error TYPE lxestring.
+
+    TRY.
+        CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_WRITE'
+          EXPORTING
+            s_lang    = iv_s_lang
+            t_lang    = iv_t_lang
+            custmnr   = iv_custmnr
+            objtype   = iv_objtype
+            objname   = iv_objname
+          IMPORTING
+            err_msg   = lv_error  " doesn't exist in NW <= 750
+          TABLES
+            lt_pcx_s1 = it_pcx_s1.
+        IF lv_error IS NOT INITIAL.
+          zcx_abapgit_exception=>raise( lv_error ).
+        ENDIF.
+
+      CATCH cx_sy_dyn_call_param_not_found.
+
+        CALL FUNCTION 'LXE_OBJ_TEXT_PAIR_WRITE'
+          EXPORTING
+            s_lang    = iv_s_lang
+            t_lang    = iv_t_lang
+            custmnr   = iv_custmnr
+            objtype   = iv_objtype
+            objname   = iv_objname
+          TABLES
+            lt_pcx_s1 = it_pcx_s1.
+
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_lxe_texts~deserialize.
+
+    IF is_object_supported( iv_object_type ) = abap_false.
+      RETURN.
+    ENDIF.
+
+    mo_i18n_params = io_i18n_params.
+    mi_xml_in      = ii_xml.
+    mo_files       = io_files.
+
+    " MAYBE TODO: see comment in serialize
+
+    IF 1 = 1.
+      deserialize_from_po(
+        iv_object_type = iv_object_type
+        iv_object_name = iv_object_name ).
+    ELSE.
+      deserialize_xml(
+        iv_object_type = iv_object_type
+        iv_object_name = iv_object_name ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_lxe_texts~serialize.
+
+    IF is_object_supported( iv_object_type ) = abap_false.
+      RETURN.
+    ENDIF.
+
+    mo_i18n_params = io_i18n_params.
+    mi_xml_out     = ii_xml.
+    mo_files       = io_files.
+
+    " MAYBE TODO
+    " if other formats are needed, including the old in-XML approach
+    " here is the place to implement it. Supposed architecture:
+    " I18N_PARAMS should contain an option which format to use
+    " The option should be originally maintained in dot_abapgit structures (e.g. `translation_storage_format`)
+    " Consequently it comes here
+    " The serialize method can read it and call a corresponding submethod,
+    " e.g. serialize_xml or serialize_as_po or ...
+    " both ii_xml and io_files are accessible intentionally to enable both XML based or file based formats
+    " access to json can be easily added too,
+    " or maybe (maybe) some kind of zif_ag_object_ctl with all DAO instead
+
+    IF 1 = 1.
+      serialize_as_po(
+        iv_object_type = iv_object_type
+        iv_object_name = iv_object_name ).
+    ELSE.
+      serialize_xml(
+        iv_object_type = iv_object_type
+        iv_object_name = iv_object_name ).
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_lxe_texts.clas.testclasses.abap.html b/src/objects/texts/zcl_abapgit_lxe_texts.clas.testclasses.abap.html new file mode 100644 index 00000000000..015b8eb59bd --- /dev/null +++ b/src/objects/texts/zcl_abapgit_lxe_texts.clas.testclasses.abap.html @@ -0,0 +1,481 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_lxe_texts.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_lxe_texts.clas.testclasses.abap

+
+ +
+ 100% + Statements + 132/132 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 132/132 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +1331x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_lxe_texts DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      check_langs_versus_installed FOR TESTING RAISING zcx_abapgit_exception,
+      lang_string_to_table FOR TESTING,
+      table_to_lang_string FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_lxe_texts DEFINITION LOCAL FRIENDS ltcl_lxe_texts.
+ 
+CLASS ltcl_lxe_texts IMPLEMENTATION.
+ 
+  METHOD check_langs_versus_installed.
+ 
+    DATA lt_testsuite TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lt_installed TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lt_intersections_act TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lt_intersections_exp TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lt_missfits_act TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lt_missfits_exp TYPE zif_abapgit_definitions=>ty_languages.
+ 
+    lt_installed         = zcl_abapgit_lxe_texts=>convert_lang_string_to_table( 'EN,DE,ES,IT,SK,FR' ).
+    lt_testsuite         = zcl_abapgit_lxe_texts=>convert_lang_string_to_table( 'ZA,EN,FR,DE,JP' ).
+    lt_intersections_exp = zcl_abapgit_lxe_texts=>convert_lang_string_to_table( 'EN,FR,DE' ).
+    lt_missfits_exp      = zcl_abapgit_lxe_texts=>convert_lang_string_to_table( 'ZA,JP' ).
+ 
+    zcl_abapgit_lxe_texts=>check_langs_versus_installed(
+      EXPORTING
+        it_languages = lt_testsuite
+        it_installed = lt_installed
+      IMPORTING
+        et_intersection = lt_intersections_act
+        et_missfits     = lt_missfits_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_intersections_act
+      exp = lt_intersections_exp ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_missfits_act
+      exp = lt_missfits_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD lang_string_to_table.
+ 
+    DATA lt_act TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lt_exp TYPE zif_abapgit_definitions=>ty_languages.
+ 
+    TRY.
+        lt_act = zcl_abapgit_lxe_texts=>convert_lang_string_to_table(
+                   iv_langs              = 'en , de, es'
+                   iv_skip_main_language = 'E' ).
+ 
+        APPEND 'DE' TO lt_exp.
+        APPEND 'ES' TO lt_exp.
+ 
+        cl_abap_unit_assert=>assert_equals(
+          act = lt_act
+          exp = lt_exp ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+    TRY.
+        lt_act = zcl_abapgit_lxe_texts=>convert_lang_string_to_table(
+                   iv_langs              = 'en , DE, es'
+                   iv_skip_main_language = 'E' ).
+ 
+        cl_abap_unit_assert=>assert_equals(
+          act = lt_act
+          exp = lt_exp ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+    TRY.
+        lt_act = zcl_abapgit_lxe_texts=>convert_lang_string_to_table(
+                   iv_langs              = '*'
+                   iv_skip_main_language = 'E' ).
+ 
+        CLEAR lt_exp.
+        APPEND '*' TO lt_exp.
+ 
+        cl_abap_unit_assert=>assert_equals(
+          act = lt_act
+          exp = lt_exp ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD table_to_lang_string.
+ 
+    DATA lt_langu TYPE zif_abapgit_definitions=>ty_languages.
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+ 
+    TRY.
+        APPEND 'DE' TO lt_langu.
+        APPEND 'ES' TO lt_langu.
+ 
+        lv_act = zcl_abapgit_lxe_texts=>convert_table_to_lang_string( lt_langu ).
+        lv_exp = 'DE,ES'.
+ 
+        cl_abap_unit_assert=>assert_equals(
+          act = lv_act
+          exp = lv_exp ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+    TRY.
+        CLEAR lt_langu.
+        APPEND '*' TO lt_langu.
+ 
+        lv_act = zcl_abapgit_lxe_texts=>convert_table_to_lang_string( lt_langu ).
+        lv_exp = '*'.
+ 
+        cl_abap_unit_assert=>assert_equals(
+          act = lv_act
+          exp = lv_exp ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_po_file.clas.abap.html b/src/objects/texts/zcl_abapgit_po_file.clas.abap.html new file mode 100644 index 00000000000..143469186d4 --- /dev/null +++ b/src/objects/texts/zcl_abapgit_po_file.clas.abap.html @@ -0,0 +1,1210 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_po_file.clas.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_po_file.clas.abap

+
+ +
+ 97.6% + Statements + 366/375 +
+ + +
+ 78.94% + Branches + 30/38 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 97.6% + Lines + 366/375 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +3761x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +9x +4x +4x +4x +5x +5x +4x +4x +5x +5x +9x +11x +11x +11x +11x +11x +11x +10x +10x +11x +8x +8x +8x +8x +8x +3x +  +11x +11x +11x +6x +5x +5x +5x +5x +2x +  +11x +11x +11x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +  +23x +23x +1x +2x +  +21x +21x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x + 
CLASS zcl_abapgit_po_file DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_i18n_file.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_lang TYPE laiso.
+ 
+    METHODS parse
+      IMPORTING
+        iv_xdata TYPE xstring
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS push_text_pairs
+      IMPORTING
+        iv_objtype    TYPE trobjtype
+        iv_objname    TYPE lxeobjname
+        it_text_pairs TYPE zif_abapgit_lxe_texts=>ty_text_pairs
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_comment,
+        translator TYPE i VALUE 1,
+        extracted  TYPE i VALUE 2,
+        reference  TYPE i VALUE 3,
+        flag       TYPE i VALUE 4,
+        previous   TYPE i VALUE 5,
+      END OF c_comment.
+    TYPES:
+      BEGIN OF ty_comment,
+        kind TYPE i,
+        text TYPE string,
+      END OF ty_comment.
+    TYPES:
+      BEGIN OF ty_msg_pair,
+        source   TYPE string,
+        target   TYPE string,
+        comments TYPE STANDARD TABLE OF ty_comment WITH KEY kind text,
+      END OF ty_msg_pair.
+ 
+ 
+    DATA mv_lang TYPE laiso.
+    DATA mt_pairs TYPE SORTED TABLE OF ty_msg_pair WITH UNIQUE KEY source.
+ 
+    METHODS build_po_body
+      RETURNING
+        VALUE(ro_buf) TYPE REF TO zcl_abapgit_string_buffer.
+    METHODS build_po_head
+      RETURNING
+        VALUE(ro_buf) TYPE REF TO zcl_abapgit_string_buffer.
+    METHODS parse_po
+      IMPORTING
+        iv_data TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS get_comment_marker
+      IMPORTING
+        iv_comment_kind  TYPE i
+      RETURNING
+        VALUE(rv_marker) TYPE string.
+ 
+    CLASS-METHODS quote
+      IMPORTING
+        iv_text        TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string.
+    CLASS-METHODS unquote
+      IMPORTING
+        iv_text        TYPE string
+      RETURNING
+        VALUE(rv_text) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PO_FILE IMPLEMENTATION.
+ 
+ 
+  METHOD build_po_body.
+ 
+    FIELD-SYMBOLS <ls_pair> LIKE LINE OF mt_pairs.
+    FIELD-SYMBOLS <ls_comment> LIKE LINE OF <ls_pair>-comments.
+ 
+    CREATE OBJECT ro_buf.
+ 
+    LOOP AT mt_pairs ASSIGNING <ls_pair>.
+      IF sy-tabix <> 1.
+        ro_buf->add( '' ).
+      ENDIF.
+ 
+      " TODO integrate translator comments ?
+ 
+      SORT <ls_pair>-comments BY kind.
+      LOOP AT <ls_pair>-comments ASSIGNING <ls_comment>.
+        ro_buf->add( |#{ get_comment_marker( <ls_comment>-kind ) } { <ls_comment>-text }| ).
+      ENDLOOP.
+ 
+      ro_buf->add( |msgid { quote( <ls_pair>-source ) }| ).
+      ro_buf->add( |msgstr { quote( <ls_pair>-target ) }| ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_po_head.
+ 
+    CREATE OBJECT ro_buf.
+ 
+    " TODO, more headers ? sample: https://www.gnu.org/software/trans-coord/manual/gnun/html_node/PO-Header.html
+    " TODO, does \n really necessary ? check editors support for non-\n
+    " TODO, should be unfuzzy for final version, and potentially should have more fields
+ 
+    ro_buf->add( '#, fuzzy' ).
+    ro_buf->add( 'msgid ""' ).
+    ro_buf->add( 'msgstr ""' ).
+    ro_buf->add( '"MIME-Version: 1.0\n"' ).
+    ro_buf->add( '"Content-Type: text/plain; charset=UTF-8\n"' ).
+    ro_buf->add( '"Content-Transfer-Encoding: 8bit\n"' ).
+    ro_buf->add( '' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_lang = to_lower( iv_lang ).
+  ENDMETHOD.
+ 
+ 
+  METHOD get_comment_marker.
+    CASE iv_comment_kind.
+      WHEN c_comment-translator.
+        rv_marker = ''.
+      WHEN c_comment-extracted.
+        rv_marker = '.'.
+      WHEN c_comment-reference.
+        rv_marker = ':'.
+      WHEN c_comment-flag.
+        rv_marker = ','.
+      WHEN c_comment-previous.
+        rv_marker = '|'.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA lv_xdata TYPE xstring.
+    DATA lv_data TYPE string.
+ 
+    IF xstrlen( iv_xdata ) > 3 AND iv_xdata(3) = cl_abap_char_utilities=>byte_order_mark_utf8.
+      lv_xdata = iv_xdata+3.
+    ELSE.
+      lv_xdata = iv_xdata.
+    ENDIF.
+ 
+    lv_data = zcl_abapgit_convert=>xstring_to_string_utf8( lv_xdata ).
+ 
+    parse_po( lv_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_po.
+ 
+    CONSTANTS:
+      BEGIN OF c_state,
+        wait_id  TYPE i VALUE 0,
+        wait_str TYPE i VALUE 1,
+        wait_eos TYPE i VALUE 2,
+        " TODO msgctx
+      END OF c_state.
+ 
+    DATA lv_state TYPE i VALUE c_state-wait_id.
+    DATA lt_lines TYPE string_table.
+    DATA ls_pair LIKE LINE OF mt_pairs.
+    DATA lv_whitespace TYPE c LENGTH 2.
+    FIELD-SYMBOLS <lv_i> TYPE string.
+ 
+    lv_whitespace = ` ` && cl_abap_char_utilities=>horizontal_tab.
+ 
+    SPLIT iv_data AT cl_abap_char_utilities=>newline INTO TABLE lt_lines.
+    APPEND '' TO lt_lines. " terminator
+ 
+    LOOP AT lt_lines ASSIGNING <lv_i>.
+      IF lv_state = c_state-wait_eos.
+        IF strlen( <lv_i> ) >= 1 AND <lv_i>+0(1) = '"'.
+          ls_pair-target = ls_pair-target && unquote( <lv_i> ).
+          CONTINUE.
+        ELSE.
+          lv_state = c_state-wait_id.
+          IF ls_pair-source IS NOT INITIAL. " skip header entry for now
+            INSERT ls_pair INTO TABLE mt_pairs. " Sorted, duplicates will not be inserted
+          ENDIF.
+          CLEAR ls_pair.
+        ENDIF.
+      ENDIF.
+ 
+      CASE lv_state.
+        WHEN c_state-wait_id.
+          IF <lv_i> IS INITIAL
+            OR <lv_i>+0(1) = '#' " TODO, potentially parse comments in future, to re-integrate
+            OR <lv_i> CO lv_whitespace.
+            CONTINUE.
+          ENDIF.
+          IF strlen( <lv_i> ) >= 6 AND <lv_i>+0(6) = `msgid `. " w/trailing space
+            ls_pair-source = unquote( substring(
+              val = <lv_i>
+              off = 6 ) ).
+            lv_state = c_state-wait_str.
+          ELSE.
+            zcx_abapgit_exception=>raise( 'PO file format error: expected msgid' ).
+          ENDIF.
+ 
+        WHEN c_state-wait_str.
+          IF strlen( <lv_i> ) >= 7 AND <lv_i>+0(7) = `msgstr `. " w/trailing space
+            ls_pair-target = unquote( substring(
+              val = <lv_i>
+              off = 7 ) ).
+            lv_state = c_state-wait_eos.
+          ELSE.
+            zcx_abapgit_exception=>raise( 'PO file format error: expected msgstr' ).
+          ENDIF.
+ 
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD push_text_pairs.
+ 
+    DATA ls_out LIKE LINE OF mt_pairs.
+    FIELD-SYMBOLS <ls_in> LIKE LINE OF it_text_pairs.
+    FIELD-SYMBOLS <ls_out> LIKE LINE OF mt_pairs.
+    DATA ls_comment LIKE LINE OF <ls_out>-comments.
+ 
+    LOOP AT it_text_pairs ASSIGNING <ls_in>.
+      CHECK <ls_in>-s_text IS NOT INITIAL.
+ 
+      READ TABLE mt_pairs ASSIGNING <ls_out> WITH KEY source = <ls_in>-s_text.
+      IF sy-subrc <> 0.
+        ls_out-source = <ls_in>-s_text.
+        INSERT ls_out INTO  TABLE mt_pairs ASSIGNING <ls_out>.
+        ASSERT sy-subrc = 0.
+      ENDIF.
+ 
+      IF <ls_out>-target IS INITIAL. " For a case of orig text duplication
+        <ls_out>-target = <ls_in>-t_text.
+      ENDIF.
+ 
+      ls_comment-kind = c_comment-reference.
+      ls_comment-text = condense( |{ iv_objtype }/{ iv_objname }/{ <ls_in>-textkey }| )
+        && |, maxlen={ <ls_in>-unitmlt }|.
+      APPEND ls_comment TO <ls_out>-comments.
+      ASSERT sy-subrc = 0.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD quote.
+    rv_text = '"' && replace(
+      val  = iv_text
+      sub  = '"'
+      with = '\"'
+      occ  = 0 ) && '"'.
+  ENDMETHOD.
+ 
+ 
+  METHOD unquote.
+ 
+    DATA lv_len TYPE i.
+    DATA lv_prev_char TYPE i.
+ 
+    rv_text = iv_text.
+    SHIFT rv_text RIGHT DELETING TRAILING space. " Measure perf ? Could be slowish, maybe use find
+    SHIFT rv_text LEFT DELETING LEADING space.
+    lv_len = strlen( rv_text ).
+ 
+    IF lv_len < 2.
+      zcx_abapgit_exception=>raise( 'PO file format error: bad quoting' ).
+    ENDIF.
+ 
+    lv_prev_char = lv_len - 1.
+    IF rv_text+0(1) <> '"' OR rv_text+lv_prev_char(1) <> '"'.
+      zcx_abapgit_exception=>raise( 'PO file format error: bad quoting' ).
+    ENDIF.
+ 
+    lv_prev_char = lv_prev_char - 1.
+    IF lv_len >= 3 AND rv_text+lv_prev_char(1) = '\'. " escaped quote
+      zcx_abapgit_exception=>raise( 'PO file format error: bad quoting' ).
+    ENDIF.
+ 
+    rv_text = substring(
+      val = rv_text
+      off = 1
+      len = lv_len - 2 ).
+ 
+    rv_text = replace(
+      val  = rv_text
+      sub  = '\"'
+      with = '"'
+      occ  = 0 ).
+ 
+    rv_text = replace(
+      val  = rv_text
+      sub  = '\n'
+      with = cl_abap_char_utilities=>newline
+      occ  = 0 ).
+ 
+    " TODO: theoretically there can be unescaped " - is it a problem ? check standard
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_i18n_file~ext.
+    rv_ext = 'po'.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_i18n_file~lang.
+    rv_lang = mv_lang.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_i18n_file~render.
+ 
+    DATA lv_str TYPE string.
+ 
+    lv_str = build_po_body( )->join_w_newline_and_flush( ).
+ 
+    IF lv_str IS NOT INITIAL.
+      lv_str = build_po_head( )->join_w_newline_and_flush( )
+        && cl_abap_char_utilities=>newline
+        && lv_str
+        && cl_abap_char_utilities=>newline. " Trailing LF
+      rv_data = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_str ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_i18n_file~translate.
+ 
+    FIELD-SYMBOLS <ls_lxe> LIKE LINE OF ct_text_pairs.
+    FIELD-SYMBOLS <ls_tr> LIKE LINE OF mt_pairs.
+    DATA lv_idx TYPE i.
+ 
+    LOOP AT ct_text_pairs ASSIGNING <ls_lxe>.
+      CHECK <ls_lxe>-s_text IS NOT INITIAL.
+      lv_idx = sy-tabix.
+ 
+      READ TABLE mt_pairs ASSIGNING <ls_tr> WITH KEY source = <ls_lxe>-s_text.
+      IF sy-subrc = 0 AND <ls_tr>-target IS NOT INITIAL.
+        <ls_lxe>-t_text = <ls_tr>-target.
+      ELSE.
+        DELETE ct_text_pairs INDEX lv_idx. " Otherwise error in LXE FMs for empty translation
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_po_file.clas.testclasses.abap.html b/src/objects/texts/zcl_abapgit_po_file.clas.testclasses.abap.html new file mode 100644 index 00000000000..b432e47e62c --- /dev/null +++ b/src/objects/texts/zcl_abapgit_po_file.clas.testclasses.abap.html @@ -0,0 +1,871 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_po_file.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_po_file.clas.testclasses.abap

+
+ +
+ 100% + Statements + 262/262 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 262/262 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +2631x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_po_file DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS po_body FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS parse_happy_path FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS parse_negative FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS unquote FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS multiline_parsing FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_po_file DEFINITION LOCAL FRIENDS ltcl_po_file.
+ 
+CLASS ltcl_po_file IMPLEMENTATION.
+ 
+  METHOD po_body.
+ 
+    DATA lo_po TYPE REF TO zcl_abapgit_po_file.
+    DATA lt_lxe_pairs TYPE zif_abapgit_lxe_texts=>ty_text_pairs.
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+    DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
+ 
+    FIELD-SYMBOLS <ls_p> LIKE LINE OF lt_lxe_pairs.
+ 
+    CREATE OBJECT lo_po EXPORTING iv_lang = 'xx'.
+ 
+    APPEND INITIAL LINE TO lt_lxe_pairs ASSIGNING <ls_p>.
+    <ls_p>-textkey = 'K1'.
+    <ls_p>-unitmlt = 10.
+    <ls_p>-s_text  = 'Hello'.
+    <ls_p>-t_text  = 'Hello DE'.
+    APPEND INITIAL LINE TO lt_lxe_pairs ASSIGNING <ls_p>.
+    <ls_p>-textkey = 'K2    X'. " To condense
+    <ls_p>-unitmlt = 11.
+    <ls_p>-s_text  = 'Hello'. " Intentional duplicate !
+    <ls_p>-t_text  = 'Hello DE 2'.
+    APPEND INITIAL LINE TO lt_lxe_pairs ASSIGNING <ls_p>.
+    <ls_p>-textkey = 'K3'.
+    <ls_p>-unitmlt = 12.
+    <ls_p>-s_text  = 'World'.
+    <ls_p>-t_text  = 'World "DE"'.
+ 
+    lo_po->push_text_pairs(
+      iv_objtype = 'T1'
+      iv_objname = 'OBJ1'
+      it_text_pairs = lt_lxe_pairs ).
+ 
+    lv_act = lo_po->build_po_body( )->join_w_newline_and_flush( ).
+ 
+    CREATE OBJECT lo_buf.
+ 
+    lo_buf->add( '#: T1/OBJ1/K1, maxlen=10'
+      )->add( '#: T1/OBJ1/K2 X, maxlen=11'
+      )->add( 'msgid "Hello"'
+      )->add( 'msgstr "Hello DE"'
+      )->add( ''
+      )->add( '#: T1/OBJ1/K3, maxlen=12'
+      )->add( 'msgid "World"'
+      )->add( 'msgstr "World \"DE\""' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lo_buf->join_w_newline_and_flush( ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_happy_path.
+ 
+    DATA lo_po TYPE REF TO zcl_abapgit_po_file.
+    DATA lt_lxe_pairs_act TYPE zif_abapgit_lxe_texts=>ty_text_pairs.
+    DATA lt_lxe_pairs_exp TYPE zif_abapgit_lxe_texts=>ty_text_pairs.
+    DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
+ 
+    FIELD-SYMBOLS <ls_p> LIKE LINE OF lt_lxe_pairs_act.
+ 
+    APPEND INITIAL LINE TO lt_lxe_pairs_exp ASSIGNING <ls_p>.
+    <ls_p>-textkey = 'K1'.
+    <ls_p>-unitmlt = 10.
+    <ls_p>-s_text  = 'Hello'. " Intentional duplicate ! same translation is applied
+    <ls_p>-t_text  = 'Hello DE 2'.
+    APPEND INITIAL LINE TO lt_lxe_pairs_exp ASSIGNING <ls_p>.
+    <ls_p>-textkey = 'K2    X'.
+    <ls_p>-unitmlt = 11.
+    <ls_p>-s_text  = 'Hello'. " Intentional duplicate !
+    <ls_p>-t_text  = 'Hello DE 2'.
+    APPEND INITIAL LINE TO lt_lxe_pairs_exp ASSIGNING <ls_p>.
+    <ls_p>-textkey = 'K3'.
+    <ls_p>-unitmlt = 12.
+    <ls_p>-s_text  = 'World'.
+    <ls_p>-t_text  = 'World DE'.
+ 
+    lt_lxe_pairs_act = lt_lxe_pairs_exp.
+    LOOP AT lt_lxe_pairs_act ASSIGNING <ls_p>.
+      CLEAR <ls_p>-t_text.
+    ENDLOOP.
+ 
+    CREATE OBJECT lo_buf.
+ 
+    lo_buf->add( 'msgid ""'
+      )->add( 'msgstr ""'
+      )->add( '"some header stuff"'
+      )->add( ''
+      )->add( '#: T1/OBJ1/K1, maxlen=10'
+      )->add( '#: T1/OBJ1/K2 X, maxlen=11'
+      )->add( 'msgid "Hello"'
+      )->add( 'msgstr "Hello DE 2"'
+      )->add( ''
+      )->add( '#: T1/OBJ1/K3, maxlen=12'
+      )->add( 'msgid "World"'
+      )->add( 'msgstr "World DE"' ).
+ 
+    CREATE OBJECT lo_po EXPORTING iv_lang = 'xx'.
+    lo_po->parse_po( lo_buf->join_w_newline_and_flush( ) ).
+    lo_po->zif_abapgit_i18n_file~translate( CHANGING ct_text_pairs = lt_lxe_pairs_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_lxe_pairs_act
+      exp = lt_lxe_pairs_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_negative.
+ 
+    DATA lo_po TYPE REF TO zcl_abapgit_po_file.
+ 
+    CREATE OBJECT lo_po EXPORTING iv_lang = 'xx'.
+ 
+    TRY.
+        lo_po->parse_po( zcl_abapgit_string_buffer=>new(
+          )->add( 'wrong'
+          )->add( 'format'
+          )->join_w_newline_and_flush( ) ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        lo_po->parse_po( zcl_abapgit_string_buffer=>new(
+          )->add( 'msgid "a"'
+          )->add( 'wrong tag'
+          )->join_w_newline_and_flush( ) ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        lo_po->parse_po( zcl_abapgit_string_buffer=>new(
+          )->add( '""'
+          )->add( ''
+          )->join_w_newline_and_flush( ) ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        lo_po->parse_po( zcl_abapgit_string_buffer=>new(
+          )->add( 'msgid "a"'
+          )->add( '# comment'
+          )->add( 'msgstr "b"'
+          )->join_w_newline_and_flush( ) ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        lo_po->parse_po( zcl_abapgit_string_buffer=>new(
+          )->add( 'msgid "a"'
+          )->add( 'msgstr "'
+          )->join_w_newline_and_flush( ) ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        lo_po->parse_po( zcl_abapgit_string_buffer=>new(
+          )->add( 'msgid"a"'
+          )->add( 'msgstr"b"'
+          )->join_w_newline_and_flush( ) ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD unquote.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_po_file=>unquote( ` "abc \"123" ` )
+      exp = 'abc "123' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_po_file=>unquote( ` "" ` )
+      exp = '' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_po_file=>unquote( ` "\n" ` )
+      exp = |{ cl_abap_char_utilities=>newline }| ).
+ 
+    TRY.
+        zcl_abapgit_po_file=>unquote( `abc \"123"` ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_po_file=>unquote( `"abc \"123` ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_po_file=>unquote( `"abc \"` ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_po_file=>unquote( `"` ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD multiline_parsing.
+ 
+    DATA lo_po TYPE REF TO zcl_abapgit_po_file.
+    FIELD-SYMBOLS <ls_p> LIKE LINE OF lo_po->mt_pairs.
+ 
+    CREATE OBJECT lo_po EXPORTING iv_lang = 'xx'.
+    lo_po->parse_po( zcl_abapgit_string_buffer=>new(
+      )->add( 'msgid "a"'
+      )->add( 'msgstr "1\n"'
+      )->add( '"2"'
+      )->join_w_newline_and_flush( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_po->mt_pairs )
+      exp = 1 ).
+    READ TABLE lo_po->mt_pairs INDEX 1 ASSIGNING <ls_p>.
+    cl_abap_unit_assert=>assert_subrc( ).
+    cl_abap_unit_assert=>assert_equals(
+      act = <ls_p>-target
+      exp = |1{ cl_abap_char_utilities=>newline }2| ).
+ 
+    CREATE OBJECT lo_po EXPORTING iv_lang = 'xx'.
+    lo_po->parse_po( zcl_abapgit_string_buffer=>new(
+      )->add( 'msgid "a"'
+      )->add( 'msgstr ""'
+      )->add( '"2\n"'
+      )->add( '"3"'
+      )->join_w_newline_and_flush( ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lo_po->mt_pairs )
+      exp = 1 ).
+    READ TABLE lo_po->mt_pairs INDEX 1 ASSIGNING <ls_p>.
+    cl_abap_unit_assert=>assert_subrc( ).
+    cl_abap_unit_assert=>assert_equals(
+      act = <ls_p>-target
+      exp = |2{ cl_abap_char_utilities=>newline }3| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_sotr_handler.clas.abap.html b/src/objects/texts/zcl_abapgit_sotr_handler.clas.abap.html new file mode 100644 index 00000000000..1b9c9b01d27 --- /dev/null +++ b/src/objects/texts/zcl_abapgit_sotr_handler.clas.abap.html @@ -0,0 +1,1243 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_sotr_handler.clas.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_sotr_handler.clas.abap

+
+ +
+ 100% + Statements + 386/386 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 386/386 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +3871x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_sotr_handler DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_sotr,
+        header  TYPE sotr_head,
+        entries TYPE sotr_text_tt,
+      END OF ty_sotr .
+    TYPES:
+      ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY .
+    TYPES:
+      ty_sotr_use_tt TYPE STANDARD TABLE OF sotr_use WITH DEFAULT KEY .
+ 
+    CLASS-METHODS read_sotr
+      IMPORTING
+        !iv_pgmid    TYPE pgmid DEFAULT 'R3TR'
+        !iv_object   TYPE trobjtype
+        !iv_obj_name TYPE csequence
+        !io_xml      TYPE REF TO zif_abapgit_xml_output OPTIONAL
+        !io_i18n_params TYPE REF TO zcl_abapgit_i18n_params
+      EXPORTING
+        !et_sotr     TYPE ty_sotr_tt
+        !et_sotr_use TYPE ty_sotr_use_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_sotr
+      IMPORTING
+        !iv_package TYPE devclass
+        !io_xml     TYPE REF TO zif_abapgit_xml_input
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_sotr_from_data
+      IMPORTING
+        !iv_package  TYPE devclass
+        !it_sotr     TYPE ty_sotr_tt
+        !it_sotr_use TYPE ty_sotr_use_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_sotr
+      IMPORTING
+        !iv_pgmid    TYPE pgmid DEFAULT 'R3TR'
+        !iv_object   TYPE trobjtype
+        !iv_obj_name TYPE csequence
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete_sotr_package
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+    CLASS-METHODS get_sotr_usage
+      IMPORTING
+        !iv_pgmid          TYPE pgmid
+        !iv_object         TYPE trobjtype
+        !iv_obj_name       TYPE csequence
+      RETURNING
+        VALUE(rt_sotr_use) TYPE ty_sotr_use_tt.
+ 
+    CLASS-METHODS get_sotr_4_concept
+      IMPORTING
+        !iv_concept    TYPE sotr_conc
+      RETURNING
+        VALUE(rs_sotr) TYPE ty_sotr .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_SOTR_HANDLER IMPLEMENTATION.
+ 
+ 
+  METHOD create_sotr.
+ 
+    DATA:
+      lt_sotr     TYPE ty_sotr_tt,
+      lt_sotr_use TYPE ty_sotr_use_tt.
+ 
+    io_xml->read( EXPORTING iv_name = 'SOTR'
+                  CHANGING cg_data = lt_sotr ).
+    io_xml->read( EXPORTING iv_name = 'SOTR_USE'
+                  CHANGING cg_data = lt_sotr_use ).
+ 
+    create_sotr_from_data(
+      iv_package  = iv_package
+      it_sotr     = lt_sotr
+      it_sotr_use = lt_sotr_use ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_sotr_from_data.
+ 
+    DATA:
+      lt_objects TYPE sotr_objects,
+      ls_paket   TYPE sotr_pack,
+      lv_alias   TYPE sotr_head-alias_name,
+      lv_object  LIKE LINE OF lt_objects.
+ 
+    FIELD-SYMBOLS: <ls_sotr> LIKE LINE OF it_sotr.
+ 
+    LOOP AT it_sotr ASSIGNING <ls_sotr>.
+      CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS'
+        EXPORTING
+          object_vector    = <ls_sotr>-header-objid_vec
+        IMPORTING
+          objects          = lt_objects
+        EXCEPTIONS
+          object_not_found = 1
+          OTHERS           = 2.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      READ TABLE lt_objects INDEX 1 INTO lv_object.
+      ASSERT sy-subrc = 0.
+ 
+      ls_paket-paket = iv_package.
+ 
+      " Replace package in alias with new package
+      lv_alias = <ls_sotr>-header-alias_name.
+      IF lv_alias CS '/'.
+        lv_alias = iv_package && lv_alias+sy-fdpos(*).
+      ENDIF.
+ 
+      CALL FUNCTION 'SOTR_CREATE_CONCEPT'
+        EXPORTING
+          paket                         = ls_paket
+          crea_lan                      = <ls_sotr>-header-crea_lan
+          alias_name                    = lv_alias
+          object                        = lv_object
+          entries                       = <ls_sotr>-entries
+          concept_default               = <ls_sotr>-header-concept
+        EXCEPTIONS
+          package_missing               = 1
+          crea_lan_missing              = 2
+          object_missing                = 3
+          paket_does_not_exist          = 4
+          alias_already_exist           = 5
+          object_type_not_found         = 6
+          langu_missing                 = 7
+          identical_context_not_allowed = 8
+          text_too_long                 = 9
+          error_in_update               = 10
+          no_master_langu               = 11
+          error_in_concept_id           = 12
+          alias_not_allowed             = 13
+          tadir_entry_creation_failed   = 14
+          internal_error                = 15
+          error_in_correction           = 16
+          user_cancelled                = 17
+          no_entry_found                = 18
+          OTHERS                        = 19.
+      IF sy-subrc <> 0 AND sy-subrc <> 5.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDLOOP.
+ 
+    CALL FUNCTION 'SOTR_USAGE_MODIFY'
+      EXPORTING
+        sotr_usage = it_sotr_use.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_sotr.
+ 
+    DATA lt_sotr_use TYPE ty_sotr_use_tt.
+ 
+    FIELD-SYMBOLS <ls_sotr_use> LIKE LINE OF lt_sotr_use.
+ 
+    lt_sotr_use = get_sotr_usage( iv_pgmid    = iv_pgmid
+                                  iv_object   = iv_object
+                                  iv_obj_name = iv_obj_name ).
+ 
+    " Remove any usage to ensure deletion, see function module BTFR_CHECK
+    DELETE sotr_use FROM TABLE lt_sotr_use ##SUBRC_OK.
+ 
+    LOOP AT lt_sotr_use ASSIGNING <ls_sotr_use> WHERE concept IS NOT INITIAL.
+ 
+      CALL FUNCTION 'SOTR_DELETE_CONCEPT'
+        EXPORTING
+          concept             = <ls_sotr_use>-concept
+        EXCEPTIONS
+          no_entry_found      = 1
+          text_not_found      = 2
+          invalid_package     = 3
+          text_not_changeable = 4
+          text_enqueued       = 5
+          no_correction       = 6
+          parameter_error     = 7
+          OTHERS              = 8.
+      IF sy-subrc > 2.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_sotr_package.
+ 
+    DATA lt_sotr_head TYPE STANDARD TABLE OF sotr_head WITH DEFAULT KEY.
+    DATA lv_obj_name TYPE tadir-obj_name.
+ 
+    FIELD-SYMBOLS <ls_sotr_head> LIKE LINE OF lt_sotr_head.
+ 
+    SELECT * FROM sotr_head INTO TABLE lt_sotr_head WHERE paket = iv_package.
+ 
+    LOOP AT lt_sotr_head ASSIGNING <ls_sotr_head> WHERE concept IS NOT INITIAL.
+ 
+      CALL FUNCTION 'SOTR_DELETE_CONCEPT'
+        EXPORTING
+          concept             = <ls_sotr_head>-concept
+        EXCEPTIONS
+          no_entry_found      = 1
+          text_not_found      = 2
+          invalid_package     = 3
+          text_not_changeable = 4
+          text_enqueued       = 5
+          no_correction       = 6
+          parameter_error     = 7
+          OTHERS              = 8.
+      IF sy-subrc > 2.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    " Nothing left, then delete SOTR from TADIR
+    SELECT * FROM sotr_head INTO TABLE lt_sotr_head WHERE paket = iv_package.
+    IF sy-subrc <> 0.
+      SELECT SINGLE obj_name FROM tadir INTO lv_obj_name
+        WHERE pgmid = 'R3TR' AND object = 'SOTR' AND obj_name = iv_package.
+      IF sy-subrc = 0.
+        CALL FUNCTION 'TR_TADIR_INTERFACE'
+          EXPORTING
+            wi_delete_tadir_entry = abap_true
+            wi_test_modus         = abap_false
+            wi_tadir_pgmid        = 'R3TR'
+            wi_tadir_object       = 'SOTR'
+            wi_tadir_obj_name     = lv_obj_name
+          EXCEPTIONS
+            OTHERS                = 1 ##FM_SUBRC_OK.
+ 
+        IF zcl_abapgit_factory=>get_sap_package( iv_package )->are_changes_recorded_in_tr_req( ) = abap_true.
+ 
+          zcl_abapgit_factory=>get_cts_api( )->insert_transport_object(
+            iv_object   = 'SOTR'
+            iv_obj_name = lv_obj_name
+            iv_package  = iv_package
+            iv_mode     = zif_abapgit_cts_api=>c_transport_mode-delete ).
+ 
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sotr_4_concept.
+ 
+    DATA: ls_header  TYPE ty_sotr-header,
+          lv_paket   LIKE ls_header-alias_name,
+          lt_entries TYPE ty_sotr-entries.
+ 
+    FIELD-SYMBOLS: <ls_entry> LIKE LINE OF lt_entries.
+ 
+    CALL FUNCTION 'SOTR_GET_CONCEPT'
+      EXPORTING
+        concept        = iv_concept
+      IMPORTING
+        header         = ls_header
+      TABLES
+        entries        = lt_entries
+      EXCEPTIONS
+        no_entry_found = 1
+        OTHERS         = 2.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    " If alias contains package, remove it
+    lv_paket = ls_header-paket && '/'.
+    IF ls_header-alias_name CS lv_paket.
+      ls_header-alias_name = replace(
+        val  = ls_header-alias_name
+        sub  = lv_paket
+        with = '/'
+        occ  = 1 ).
+    ENDIF.
+ 
+    CLEAR: ls_header-paket,
+           ls_header-crea_name,
+           ls_header-crea_tstut,
+           ls_header-chan_name,
+           ls_header-chan_tstut,
+           ls_header-system_id.
+ 
+    LOOP AT lt_entries ASSIGNING <ls_entry>.
+      CLEAR: <ls_entry>-version,
+             <ls_entry>-crea_name,
+             <ls_entry>-crea_tstut,
+             <ls_entry>-chan_name,
+             <ls_entry>-chan_tstut.
+    ENDLOOP.
+ 
+    rs_sotr-header  = ls_header.
+    rs_sotr-entries = lt_entries.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sotr_usage.
+ 
+    DATA: lv_obj_name TYPE trobj_name.
+ 
+    lv_obj_name = iv_obj_name.
+ 
+    " Objects with multiple components
+    IF iv_pgmid = 'LIMU' AND ( iv_object CP 'WDY*' OR iv_object = 'WAPP' ).
+      lv_obj_name+30 = '%'.
+    ENDIF.
+ 
+    CALL FUNCTION 'SOTR_USAGE_READ'
+      EXPORTING
+        pgmid          = iv_pgmid
+        object         = iv_object
+        obj_name       = lv_obj_name
+      IMPORTING
+        sotr_usage     = rt_sotr_use
+      EXCEPTIONS
+        no_entry_found = 1
+        error_in_pgmid = 2
+        OTHERS         = 3.
+    IF sy-subrc = 0.
+      SORT rt_sotr_use.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_sotr.
+ 
+    FIELD-SYMBOLS <ls_sotr_use> LIKE LINE OF et_sotr_use.
+ 
+    DATA: lv_sotr            TYPE ty_sotr,
+          lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    " OTR short text usage: see TABLE BTFR_OBJ_IDS
+    " LIMU: CPUB, WAPP, WDYC, WDYD, WDYV
+    " R3TR: ENHC, ENHO, ENHS, ENSC, SCGR, SMIF, WDCA, WDCC, WEBI, WEBS
+ 
+    et_sotr_use = get_sotr_usage( iv_pgmid    = iv_pgmid
+                                  iv_object   = iv_object
+                                  iv_obj_name = iv_obj_name ).
+ 
+    LOOP AT et_sotr_use ASSIGNING <ls_sotr_use> WHERE concept IS NOT INITIAL.
+      lv_sotr = get_sotr_4_concept( <ls_sotr_use>-concept ).
+ 
+      IF io_xml IS BOUND AND io_i18n_params->ms_params-main_language_only = abap_true.
+        DELETE lv_sotr-entries WHERE langu <> io_i18n_params->ms_params-main_language.
+        CHECK lv_sotr-entries IS NOT INITIAL.
+      ENDIF.
+      lt_language_filter = io_i18n_params->build_language_filter( ).
+      DELETE lv_sotr-entries WHERE NOT langu IN lt_language_filter
+        AND langu <> io_i18n_params->ms_params-main_language.
+      CHECK lv_sotr-entries IS NOT INITIAL.
+ 
+      INSERT lv_sotr INTO TABLE et_sotr.
+    ENDLOOP.
+ 
+    IF io_xml IS BOUND.
+      io_xml->add( iv_name = 'SOTR'
+                   ig_data = et_sotr ).
+      io_xml->add( iv_name = 'SOTR_USE'
+                   ig_data = et_sotr_use ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_sotr_handler.clas.testclasses.abap.html b/src/objects/texts/zcl_abapgit_sotr_handler.clas.testclasses.abap.html new file mode 100644 index 00000000000..b9071e92284 --- /dev/null +++ b/src/objects/texts/zcl_abapgit_sotr_handler.clas.testclasses.abap.html @@ -0,0 +1,415 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_sotr_handler.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_sotr_handler.clas.testclasses.abap

+
+ +
+ 35.45% + Statements + 39/110 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 35.45% + Lines + 39/110 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +1111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS ltcl_sotr_handler DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+  PRIVATE SECTION.
+    METHODS is_wd_component_existing
+      IMPORTING iv_component_name                  TYPE sobj_name
+      RETURNING VALUE(rv_is_wd_component_existing) TYPE abap_bool.
+    METHODS sotr_wda_0001 FOR TESTING.
+    METHODS sotr_wda_0003_not_exist FOR TESTING.
+    METHODS sotr_wda_0004 FOR TESTING.
+    METHODS sotr_cx_0002 FOR TESTING.
+ENDCLASS.
+ 
+CLASS ltcl_sotr_handler IMPLEMENTATION.
+  METHOD is_wd_component_existing.
+    DATA ls_repository TYPE wdy_rr_cluster.
+    DATA lv_component_name TYPE string.
+ 
+    lv_component_name = iv_component_name.
+    TRY.
+        "need to regenerate for unit test to work
+        CALL FUNCTION 'WDR_REPOSITORY_INFO'
+          EXPORTING
+            component_name = lv_component_name
+            extended_read  = abap_true
+          IMPORTING
+            repository     = ls_repository.
+        IF ls_repository IS NOT INITIAL.
+          rv_is_wd_component_existing = abap_true.
+        ENDIF.
+      CATCH cx_wdr_rr_exception.
+        "ignore and return false
+    ENDTRY.
+  ENDMETHOD.
+  METHOD sotr_wda_0001.
+    CONSTANTS lc_wd_component_name TYPE sobj_name VALUE 'SALV_WD_TEST_TABLE_SIMPLE'.
+    DATA lt_sotr TYPE zcl_abapgit_sotr_handler=>ty_sotr_tt.
+    IF is_wd_component_existing( lc_wd_component_name ) = abap_true.
+      TRY.
+          zcl_abapgit_sotr_handler=>read_sotr(
+            EXPORTING
+              iv_pgmid    = 'LIMU'
+              iv_object   = 'WDYV'
+              iv_obj_name = lc_wd_component_name
+              io_i18n_params = zcl_abapgit_i18n_params=>new( )
+            IMPORTING
+              et_sotr     = lt_sotr ).
+          cl_abap_unit_assert=>assert_not_initial( lt_sotr ).
+        CATCH zcx_abapgit_exception.
+          cl_abap_unit_assert=>fail( quit = if_aunit_constants=>method ).
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+  METHOD sotr_wda_0003_not_exist.
+    CONSTANTS lc_wd_not_exist_component_name TYPE sobj_name VALUE '_NOT_EXISTING'.
+    DATA lt_sotr TYPE zcl_abapgit_sotr_handler=>ty_sotr_tt.
+    IF is_wd_component_existing( lc_wd_not_exist_component_name ) <> abap_true.
+      TRY.
+          zcl_abapgit_sotr_handler=>read_sotr(
+            EXPORTING
+              iv_pgmid    = 'LIMU'
+              iv_object   = 'WDYV'
+              iv_obj_name = lc_wd_not_exist_component_name
+              io_i18n_params = zcl_abapgit_i18n_params=>new( )
+            IMPORTING
+              et_sotr     = lt_sotr ).
+          cl_abap_unit_assert=>assert_initial( lt_sotr ).
+        CATCH zcx_abapgit_exception.
+          cl_abap_unit_assert=>fail( quit = if_aunit_constants=>method ).
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+  METHOD sotr_wda_0004.
+    CONSTANTS lc_wd_component_name TYPE sobj_name VALUE 'SALV_WD_TEST_TABLE_SELECT'.
+    DATA lt_sotr TYPE zcl_abapgit_sotr_handler=>ty_sotr_tt.
+    IF is_wd_component_existing( lc_wd_component_name ) = abap_true.
+      TRY.
+          zcl_abapgit_sotr_handler=>read_sotr(
+            EXPORTING
+              iv_pgmid    = 'LIMU'
+              iv_object   = 'WDYV'
+              iv_obj_name = lc_wd_component_name
+              io_i18n_params = zcl_abapgit_i18n_params=>new( )
+            IMPORTING
+              et_sotr     = lt_sotr ).
+          IF lines( lt_sotr ) < 50.
+            cl_abap_unit_assert=>fail( quit = if_aunit_constants=>method ).
+          ENDIF.
+        CATCH zcx_abapgit_exception.
+          cl_abap_unit_assert=>fail( quit = if_aunit_constants=>method ).
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+  METHOD sotr_cx_0002.
+    DATA lt_sotr TYPE zcl_abapgit_sotr_handler=>ty_sotr_tt.
+    TRY.
+        zcl_abapgit_sotr_handler=>read_sotr(
+          EXPORTING
+            iv_pgmid    = 'LIMU'
+            iv_object   = 'CPUB'
+            iv_obj_name = 'CX_ABAP_INVALID_NAME'
+            io_i18n_params = zcl_abapgit_i18n_params=>new( )
+          IMPORTING
+            et_sotr     = lt_sotr ).
+        cl_abap_unit_assert=>assert_not_initial( lt_sotr ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( quit = if_aunit_constants=>method ).
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/texts/zcl_abapgit_sots_handler.clas.abap.html b/src/objects/texts/zcl_abapgit_sots_handler.clas.abap.html new file mode 100644 index 00000000000..34d57aa9ce1 --- /dev/null +++ b/src/objects/texts/zcl_abapgit_sots_handler.clas.abap.html @@ -0,0 +1,1072 @@ + + + + + + Code coverage report for src/objects/texts/zcl_abapgit_sots_handler.clas.abap + + + + + + + + + +
+
+

All files / src/objects/texts zcl_abapgit_sots_handler.clas.abap

+
+ +
+ 100% + Statements + 329/329 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 329/329 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +3301x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_sots_handler DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_sots,
+        header  TYPE sotr_headu,
+        entries TYPE sotr_textl_tt,
+      END OF ty_sots.
+    TYPES:
+      ty_sots_tt TYPE STANDARD TABLE OF ty_sots WITH DEFAULT KEY.
+    TYPES:
+      ty_sots_use_tt TYPE STANDARD TABLE OF sotr_useu WITH DEFAULT KEY.
+ 
+    CLASS-METHODS read_sots
+      IMPORTING
+        !iv_pgmid    TYPE pgmid DEFAULT 'R3TR'
+        !iv_object   TYPE trobjtype
+        !iv_obj_name TYPE csequence
+        !io_xml      TYPE REF TO zif_abapgit_xml_output OPTIONAL
+        !io_i18n_params TYPE REF TO zcl_abapgit_i18n_params
+      EXPORTING
+        !et_sots     TYPE ty_sots_tt
+        !et_sots_use TYPE ty_sots_use_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS create_sots
+      IMPORTING
+        !iv_package TYPE devclass
+        !io_xml     TYPE REF TO zif_abapgit_xml_input OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS create_sots_from_data
+      IMPORTING
+        !iv_package  TYPE devclass
+        !it_sots     TYPE ty_sots_tt OPTIONAL
+        !it_sots_use TYPE ty_sots_use_tt OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS delete_sots
+      IMPORTING
+        !iv_pgmid    TYPE pgmid DEFAULT 'R3TR'
+        !iv_object   TYPE trobjtype
+        !iv_obj_name TYPE csequence
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS get_sots_usage
+      IMPORTING
+        !iv_pgmid          TYPE pgmid
+        !iv_object         TYPE trobjtype
+        !iv_obj_name       TYPE csequence
+      RETURNING
+        VALUE(rt_sots_use) TYPE ty_sots_use_tt.
+ 
+    CLASS-METHODS get_sots_4_concept
+      IMPORTING
+        !iv_concept    TYPE sotr_conc
+      RETURNING
+        VALUE(rs_sots) TYPE ty_sots.
+ 
+  PRIVATE SECTION.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_SOTS_HANDLER IMPLEMENTATION.
+ 
+ 
+  METHOD create_sots.
+ 
+    DATA:
+      lt_sots     TYPE ty_sots_tt,
+      lt_sots_use TYPE ty_sots_use_tt.
+ 
+    io_xml->read( EXPORTING iv_name = 'SOTS'
+                  CHANGING  cg_data = lt_sots ).
+    io_xml->read( EXPORTING iv_name = 'SOTS_USE'
+                  CHANGING  cg_data = lt_sots_use ).
+ 
+    create_sots_from_data(
+      iv_package  = iv_package
+      it_sots     = lt_sots
+      it_sots_use = lt_sots_use ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_sots_from_data.
+ 
+    DATA:
+      lt_objects         TYPE sotr_objects,
+      lv_object          LIKE LINE OF lt_objects,
+      lv_subrc           TYPE sy-subrc,
+      ls_header          TYPE btfr_head,
+      lt_text_tab        TYPE sotr_text_tt,
+      lt_string_tab      TYPE sotr_textl_tt,
+      ls_entry           LIKE LINE OF lt_string_tab,
+      lv_concept         TYPE sotr_conc,
+      lv_concept_default TYPE sotr_conc.
+ 
+    FIELD-SYMBOLS <ls_sots> LIKE LINE OF it_sots.
+ 
+    LOOP AT it_sots ASSIGNING <ls_sots>.
+ 
+      CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS'
+        EXPORTING
+          object_vector    = <ls_sots>-header-objid_vec
+        IMPORTING
+          objects          = lt_objects
+        EXCEPTIONS
+          object_not_found = 1
+          OTHERS           = 2.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      READ TABLE lt_objects INDEX 1 INTO lv_object.
+      ASSERT sy-subrc = 0.
+ 
+      " Reimplementation of SOTR_STRING_CREATE_CONCEPT because we can't supply
+      " concept and it would then be generated.
+ 
+      LOOP AT <ls_sots>-entries INTO ls_entry.
+        ls_entry-langu   = <ls_sots>-header-crea_lan.
+        ls_entry-concept = <ls_sots>-header-concept.
+        INSERT ls_entry INTO TABLE lt_string_tab.
+      ENDLOOP.
+ 
+      MOVE-CORRESPONDING <ls_sots>-header TO ls_header.
+      ls_header-paket = iv_package.
+ 
+      lv_concept = <ls_sots>-header-concept.
+ 
+      PERFORM btfr_create IN PROGRAM saplsotr_db_string
+        USING    lv_object
+                 sy-langu
+                 abap_false
+                 abap_true
+        CHANGING lt_text_tab
+                 lt_string_tab
+                 ls_header
+                 lv_concept
+                 lv_concept_default
+                 lv_subrc.
+ 
+      CASE lv_subrc.
+        WHEN 1.
+          MESSAGE e100(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 2.
+          MESSAGE e101(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 3.
+          MESSAGE i305(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 4.
+          " The concept will be created in the non-original system (not an error)
+        WHEN 5.
+          MESSAGE e504(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 6.
+          MESSAGE e035(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 7.
+          MESSAGE e170(sotr_mess) INTO zcx_abapgit_exception=>null.
+        WHEN 9.
+          MESSAGE e102(sotr_mess) INTO zcx_abapgit_exception=>null.
+      ENDCASE.
+ 
+      IF lv_subrc <> 0 AND lv_subrc <> 4.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    CALL FUNCTION 'SOTR_USAGE_STRING_MODIFY'
+      EXPORTING
+        sotr_usage = it_sots_use.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_sots.
+ 
+    DATA:
+      ls_sots     TYPE ty_sots,
+      lt_sots_use TYPE ty_sots_use_tt.
+ 
+    FIELD-SYMBOLS <ls_sots_use> LIKE LINE OF lt_sots_use.
+ 
+    lt_sots_use = get_sots_usage( iv_pgmid    = iv_pgmid
+                                  iv_object   = iv_object
+                                  iv_obj_name = iv_obj_name ).
+ 
+    " Remove any usage to ensure deletion, see function module BTFR_CHECK
+    DELETE sotr_useu FROM TABLE lt_sots_use ##SUBRC_OK.
+ 
+    LOOP AT lt_sots_use ASSIGNING <ls_sots_use> WHERE concept IS NOT INITIAL.
+ 
+      CALL FUNCTION 'BTFR_DELETE_SINGLE_TEXT'
+        EXPORTING
+          concept             = <ls_sots_use>-concept
+          flag_string         = abap_true
+        EXCEPTIONS
+          text_not_found      = 1 "ok
+          invalid_package     = 3
+          text_not_changeable = 4
+          text_enqueued       = 5
+          no_correction       = 6
+          parameter_error     = 7
+          OTHERS              = 8.
+      IF sy-subrc > 2.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sots_4_concept.
+ 
+    DATA: ls_header  TYPE ty_sots-header,
+          lt_entries TYPE ty_sots-entries.
+ 
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF lt_entries.
+ 
+    CALL FUNCTION 'SOTR_STRING_GET_CONCEPT'
+      EXPORTING
+        concept        = iv_concept
+      IMPORTING
+        header         = ls_header
+        entries        = lt_entries
+      EXCEPTIONS
+        no_entry_found = 1
+        OTHERS         = 2.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    CLEAR: ls_header-paket,
+           ls_header-crea_name,
+           ls_header-crea_tstut,
+           ls_header-chan_name,
+           ls_header-chan_tstut,
+           ls_header-system_id.
+ 
+    LOOP AT lt_entries ASSIGNING <ls_entry>.
+      CLEAR: <ls_entry>-version,
+             <ls_entry>-crea_name,
+             <ls_entry>-crea_tstut,
+             <ls_entry>-chan_name,
+             <ls_entry>-chan_tstut.
+    ENDLOOP.
+ 
+    rs_sots-header  = ls_header.
+    rs_sots-entries = lt_entries.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sots_usage.
+ 
+    DATA: lv_obj_name TYPE trobj_name.
+ 
+    lv_obj_name = iv_obj_name.
+ 
+    " Objects with multiple components
+    IF iv_pgmid = 'LIMU' AND ( iv_object CP 'WDY*' OR iv_object = 'WAPP' ).
+      lv_obj_name+30 = '%'.
+    ENDIF.
+ 
+    CALL FUNCTION 'SOTR_USAGE_STRING_READ'
+      EXPORTING
+        pgmid          = iv_pgmid
+        object         = iv_object
+        obj_name       = lv_obj_name
+      IMPORTING
+        sotr_usage     = rt_sots_use
+      EXCEPTIONS
+        no_entry_found = 1
+        error_in_pgmid = 2
+        OTHERS         = 3.
+    IF sy-subrc = 0.
+      SORT rt_sots_use.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_sots.
+ 
+    FIELD-SYMBOLS <ls_sots_use> LIKE LINE OF et_sots_use.
+ 
+    DATA ls_sots TYPE ty_sots.
+ 
+    " OTR long text (string) usage: see TABLE BTFR_OBJ_IDS
+    " LIMU: CPUB, WAPP
+    " R3TR: SICF, SMIF, XSLT
+ 
+    et_sots_use = get_sots_usage( iv_pgmid    = iv_pgmid
+                                  iv_object   = iv_object
+                                  iv_obj_name = iv_obj_name ).
+ 
+    LOOP AT et_sots_use ASSIGNING <ls_sots_use> WHERE concept IS NOT INITIAL.
+      ls_sots = get_sots_4_concept( <ls_sots_use>-concept ).
+ 
+      IF io_i18n_params->ms_params-main_language_only = abap_true.
+        DELETE ls_sots-entries WHERE langu <> io_i18n_params->ms_params-main_language.
+        CHECK ls_sots-entries IS NOT INITIAL.
+      ENDIF.
+ 
+      INSERT ls_sots INTO TABLE et_sots.
+    ENDLOOP.
+ 
+    IF io_xml IS BOUND.
+      io_xml->add( iv_name = 'SOTS'
+                   ig_data = et_sots ).
+      io_xml->add( iv_name = 'SOTS_USE'
+                   ig_data = et_sots_use ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_object_devc.clas.abap.html b/src/objects/zcl_abapgit_object_devc.clas.abap.html new file mode 100644 index 00000000000..e83207794a9 --- /dev/null +++ b/src/objects/zcl_abapgit_object_devc.clas.abap.html @@ -0,0 +1,2791 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_object_devc.clas.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_object_devc.clas.abap

+
+ +
+ 29.15% + Statements + 263/902 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 29.15% + Lines + 263/902 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +9031x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_object_devc DEFINITION PUBLIC
+  INHERITING FROM zcl_abapgit_objects_super
+  FINAL.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_object.
+ 
+    METHODS:
+      constructor IMPORTING is_item     TYPE zif_abapgit_definitions=>ty_item
+                            iv_language TYPE spras.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mv_local_devclass TYPE devclass .
+ 
+    METHODS get_package
+      RETURNING
+        VALUE(ri_package) TYPE REF TO if_package
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_pinf_usages
+      IMPORTING
+        !ii_package    TYPE REF TO if_package
+        !it_usage_data TYPE scomppdata
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_lock
+      IMPORTING
+        !ii_package TYPE REF TO if_package
+        !iv_lock    TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS unlock_and_raise_error
+      IMPORTING
+        !ii_package TYPE REF TO if_package
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_empty
+      IMPORTING
+        !iv_package_name   TYPE devclass
+      RETURNING
+        VALUE(rv_is_empty) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS load_package
+      IMPORTING
+        !iv_package_name  TYPE devclass
+      RETURNING
+        VALUE(ri_package) TYPE REF TO if_package
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_local
+      IMPORTING
+        !iv_package_name   TYPE devclass
+      RETURNING
+        VALUE(rv_is_local) TYPE abap_bool .
+    METHODS remove_obsolete_tadir
+      IMPORTING
+        !iv_package_name TYPE devclass .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_object_devc IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor( is_item     = is_item
+                        iv_language = iv_language ).
+    IF is_item-devclass IS NOT INITIAL.
+      mv_local_devclass = is_item-devclass.
+    ELSE.
+      mv_local_devclass = is_item-obj_name.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_package.
+    IF zif_abapgit_object~exists( ) = abap_true.
+      ri_package = load_package( mv_local_devclass ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_empty.
+ 
+    DATA: lv_object_name TYPE tadir-obj_name,
+          lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt.
+ 
+    lt_subpackages = zcl_abapgit_factory=>get_sap_package( iv_package_name )->list_subpackages( ).
+ 
+    IF lines( lt_subpackages ) > 0.
+      rv_is_empty = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    " Ignore the SOTR if is linked to the current SAP package (DEVC)
+    SELECT SINGLE obj_name
+           FROM tadir
+           INTO lv_object_name
+           WHERE pgmid = 'R3TR'
+           AND NOT ( ( object = 'DEVC' OR object = 'SOTR' ) AND obj_name = iv_package_name )
+           AND devclass = iv_package_name.
+    rv_is_empty = boolc( sy-subrc <> 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_local.
+ 
+    DATA lv_dlvunit TYPE tdevc-dlvunit.
+ 
+    SELECT SINGLE dlvunit FROM tdevc INTO lv_dlvunit
+        WHERE devclass = iv_package_name AND intsys <> 'SAP'.
+    IF sy-subrc = 0 AND lv_dlvunit = 'LOCAL'.
+      rv_is_local = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD load_package.
+ 
+    cl_package_factory=>load_package(
+      EXPORTING
+        i_package_name             = iv_package_name
+        i_force_reload             = abap_true
+      IMPORTING
+        e_package                  = ri_package
+      EXCEPTIONS
+        object_not_existing        = 1
+        unexpected_error           = 2
+        intern_err                 = 3
+        no_access                  = 4
+        object_locked_and_modified = 5
+        OTHERS                     = 6 ).
+    IF sy-subrc = 1.
+      RETURN.
+    ELSEIF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_obsolete_tadir.
+
+    DATA:
+      lv_pack  TYPE devclass,
+      lt_pack  TYPE STANDARD TABLE OF devclass,
+      ls_tadir TYPE zif_abapgit_definitions=>ty_tadir,
+      lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
+      ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+    " TADIR entries must remain for transportable packages
+    IF is_local( iv_package_name ) = abap_false.
+      RETURN.
+    ENDIF.
+
+    " Clean-up sub packages first
+    SELECT devclass FROM tdevc INTO TABLE lt_pack WHERE parentcl = iv_package_name.
+
+    LOOP AT lt_pack INTO lv_pack.
+      remove_obsolete_tadir( lv_pack ).
+    ENDLOOP.
+
+    " Remove TADIR entries for objects that do not exist anymore
+    SELECT * FROM tadir INTO CORRESPONDING FIELDS OF TABLE lt_tadir
+      WHERE devclass = iv_package_name ##TOO_MANY_ITAB_FIELDS.
+
+    LOOP AT lt_tadir INTO ls_tadir.
+      ls_item-obj_type = ls_tadir-object.
+      ls_item-obj_name = ls_tadir-obj_name.
+
+      IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+        CALL FUNCTION 'TR_TADIR_INTERFACE'
+          EXPORTING
+            wi_delete_tadir_entry = abap_true
+            wi_tadir_pgmid        = 'R3TR'
+            wi_tadir_object       = ls_tadir-object
+            wi_tadir_obj_name     = ls_tadir-obj_name
+            wi_test_modus         = abap_false
+          EXCEPTIONS
+            OTHERS                = 1 ##FM_SUBRC_OK.
+      ENDIF.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_lock.
+
+    DATA: lv_changeable TYPE abap_bool.
+
+    ii_package->get_changeable( IMPORTING e_changeable = lv_changeable ).
+    IF lv_changeable <> iv_lock.
+      TRY.
+          CALL METHOD ii_package->('SET_CHANGEABLE')
+            EXPORTING
+              i_changeable                = iv_lock
+              i_suppress_dialog           = abap_true " Parameter missing in 702
+            EXCEPTIONS
+              object_locked_by_other_user = 1
+              permission_failure          = 2
+              object_already_changeable   = 3
+              object_already_unlocked     = 4
+              object_just_created         = 5
+              object_deleted              = 6
+              object_modified             = 7
+              object_not_existing         = 8
+              object_invalid              = 9
+              unexpected_error            = 10
+              OTHERS                      = 11.
+        CATCH cx_sy_dyn_call_param_not_found.
+          ii_package->set_changeable(
+            EXPORTING
+              i_changeable                = iv_lock
+            EXCEPTIONS
+              object_locked_by_other_user = 1
+              permission_failure          = 2
+              object_already_changeable   = 3
+              object_already_unlocked     = 4
+              object_just_created         = 5
+              object_deleted              = 6
+              object_modified             = 7
+              object_not_existing         = 8
+              object_invalid              = 9
+              unexpected_error            = 10
+              OTHERS                      = 11 ).
+      ENDTRY.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+
+    TRY.
+        CALL METHOD ii_package->('SET_PERMISSIONS_CHANGEABLE')
+          EXPORTING
+            i_changeable                = iv_lock
+            i_suppress_dialog           = abap_true " Parameter missing in 702
+          EXCEPTIONS
+            object_already_changeable   = 1
+            object_already_unlocked     = 2
+            object_locked_by_other_user = 3
+            object_modified             = 4
+            object_just_created         = 5
+            object_deleted              = 6
+            permission_failure          = 7
+            object_invalid              = 8
+            unexpected_error            = 9
+            OTHERS                      = 10.
+      CATCH cx_sy_dyn_call_param_not_found.
+        ii_package->set_permissions_changeable(
+          EXPORTING
+            i_changeable                = iv_lock
+          EXCEPTIONS
+            object_already_changeable   = 1
+            object_already_unlocked     = 2
+            object_locked_by_other_user = 3
+            object_modified             = 4
+            object_just_created         = 5
+            object_deleted              = 6
+            permission_failure          = 7
+            object_invalid              = 8
+            unexpected_error            = 9
+            OTHERS                      = 10 ).
+    ENDTRY.
+    IF ( sy-subrc = 1 AND iv_lock = abap_true ) OR ( sy-subrc = 2 AND iv_lock = abap_false ).
+      " There's no getter to find out beforehand...
+    ELSEIF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD unlock_and_raise_error.
+
+    DATA ls_msg TYPE bal_s_msg.
+
+    " Remember message since unlock overwrites it (for example with XT465)
+    MOVE-CORRESPONDING sy TO ls_msg.
+
+    set_lock( ii_package = ii_package
+              iv_lock    = abap_false ).
+
+    zcx_abapgit_exception=>raise_t100(
+      iv_msgid = ls_msg-msgid
+      iv_msgno = ls_msg-msgno
+      iv_msgv1 = ls_msg-msgv1
+      iv_msgv2 = ls_msg-msgv2
+      iv_msgv3 = ls_msg-msgv3
+      iv_msgv4 = ls_msg-msgv4 ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD update_pinf_usages.
+    DATA: lt_current_permissions TYPE tpak_permission_to_use_list,
+          li_usage               TYPE REF TO if_package_permission_to_use,
+          ls_data_sign           TYPE scomppsign,
+          ls_add_permission_data TYPE pkgpermdat,
+          lt_handled             TYPE SORTED TABLE OF i WITH UNIQUE KEY table_line.
+    FIELD-SYMBOLS: <ls_usage_data> LIKE LINE OF it_usage_data.
+
+    " Get the current permissions
+    ii_package->get_permissions_to_use(
+      IMPORTING
+        e_permissions    = lt_current_permissions
+      EXCEPTIONS
+        object_invalid   = 1
+        unexpected_error = 2
+        OTHERS           = 3 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    ls_data_sign-err_sever = abap_true.
+
+    " New permissions
+    LOOP AT it_usage_data ASSIGNING <ls_usage_data>.
+      READ TABLE lt_current_permissions
+           WITH KEY table_line->package_interface_name = <ls_usage_data>-intf_name
+           INTO li_usage.
+
+      IF sy-subrc = 0 AND li_usage IS BOUND.
+        INSERT sy-tabix INTO TABLE lt_handled.
+
+        " Permission already exists, update attributes
+        li_usage->set_all_attributes(
+          EXPORTING
+            i_permission_data     = <ls_usage_data>
+            i_data_sign           = ls_data_sign
+          EXCEPTIONS
+            object_not_changeable = 1
+            object_invalid        = 2
+            intern_err            = 3
+            OTHERS                = 4 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+
+      ELSE.
+        " Permission does not exist yet, add it
+        MOVE-CORRESPONDING <ls_usage_data> TO ls_add_permission_data.
+        ii_package->add_permission_to_use(
+          EXPORTING
+            i_pkg_permission_data   = ls_add_permission_data
+          EXCEPTIONS
+            object_not_changeable   = 1
+            object_access_error     = 2
+            object_already_existing = 3
+            object_invalid          = 4
+            unexpected_error        = 5
+            OTHERS                  = 6 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+
+      ENDIF.
+
+      FREE li_usage.
+    ENDLOOP.
+
+    " Delete missing usages
+    LOOP AT lt_current_permissions INTO li_usage.
+      READ TABLE lt_handled WITH TABLE KEY table_line = sy-tabix TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        CONTINUE.
+      ENDIF.
+
+      li_usage->delete(
+        EXCEPTIONS
+          object_not_changeable = 1
+          object_invalid        = 2
+*          deletion_not_allowed  = 3 downport, does not exist in 7.30
+          intern_err            = 4
+          OTHERS                = 5 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~changed_by.
+    DATA li_package TYPE REF TO if_package.
+ 
+    li_package = get_package( ).
+    IF li_package IS BOUND.
+      rv_user = li_package->changed_by.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~delete.
+
+    DATA: li_package TYPE REF TO if_package,
+          lv_package TYPE devclass.
+
+    " Package deletion is a bit tricky. A package can only be deleted if there are no objects
+    " contained in it. This includes subpackages, so first the leaf packages need to be deleted.
+    " Unfortunately deleted objects that are still contained in an unreleased transport request
+    " also count towards the contained objects counter.
+    " -> Currently we delete only empty packages
+    "
+    " If objects are deleted, the TADIR entry is deleted when the transport request is released.
+    " So before we can delete the package, the transport which deletes the objects
+    " in the package has to be released.
+
+    lv_package = ms_item-obj_name.
+
+    " Remove remaining OTR entries
+    zcl_abapgit_sotr_handler=>delete_sotr_package( iv_package ).
+
+    remove_obsolete_tadir( lv_package ).
+
+    IF is_empty( lv_package ) = abap_true.
+
+      li_package = load_package( lv_package ).
+
+      IF li_package IS NOT BOUND.
+        RETURN.
+      ENDIF.
+
+      IF lv_package(1) = '$'.
+        zcl_abapgit_persist_packages=>get_instance( )->modify( lv_package ).
+      ENDIF.
+
+      set_lock( ii_package = li_package
+                iv_lock    = abap_true ).
+
+      TRY.
+          CALL METHOD li_package->('DELETE')
+            EXPORTING
+              i_suppress_dialog     = abap_true  " Parameter missing in 702
+            EXCEPTIONS
+              object_not_empty      = 1
+              object_not_changeable = 2
+              object_invalid        = 3
+              intern_err            = 4
+              OTHERS                = 5.
+
+        CATCH cx_sy_dyn_call_param_not_found.
+
+          li_package->delete(
+            EXCEPTIONS
+              object_not_empty      = 1
+              object_not_changeable = 2
+              object_invalid        = 3
+              intern_err            = 4
+              OTHERS                = 5 ).
+
+      ENDTRY.
+
+      IF sy-subrc <> 0.
+        unlock_and_raise_error( li_package ).
+      ENDIF.
+
+      TRY.
+          CALL METHOD li_package->('SAVE')
+            EXPORTING
+              i_suppress_dialog     = abap_true
+            EXCEPTIONS
+              object_invalid        = 1
+              object_not_changeable = 2
+              cancelled_in_corr     = 3
+              permission_failure    = 4
+              unexpected_error      = 5
+              intern_err            = 6
+              OTHERS                = 7.
+
+        CATCH cx_sy_dyn_call_param_not_found.
+
+          li_package->save(
+            EXCEPTIONS
+              object_invalid        = 1
+              object_not_changeable = 2
+              cancelled_in_corr     = 3
+              permission_failure    = 4
+              unexpected_error      = 5
+              intern_err            = 6
+              OTHERS                = 7 ).
+
+      ENDTRY.
+
+      IF sy-subrc <> 0.
+        unlock_and_raise_error( li_package ).
+      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~deserialize.
+    DATA: li_package      TYPE REF TO if_package,
+          ls_package_data TYPE scompkdtln,
+          ls_data_sign    TYPE scompksign,
+          lt_usage_data   TYPE scomppdata,
+          ls_save_sign    TYPE paksavsign.
+
+    FIELD-SYMBOLS: <ls_usage_data> TYPE scomppdtln.
+
+
+    mv_local_devclass = iv_package.
+
+    io_xml->read(
+      EXPORTING
+        iv_name = 'DEVC'
+      CHANGING
+        cg_data = ls_package_data ).
+
+    IF mv_local_devclass(1) = '$'.
+      IF ls_package_data-mainpack = 'X'.
+        zcx_abapgit_exception=>raise( |Main package { iv_package } cannot be used in local package| ).
+      ELSEIF ls_package_data-mainpack = 'S'.
+        zcx_abapgit_exception=>raise( |Structure package { iv_package } cannot be used in local package| ).
+      ENDIF.
+    ENDIF.
+
+    li_package = get_package( ).
+
+    " Swap out repository package name with the local installation package name
+    ls_package_data-devclass = mv_local_devclass.
+    IF li_package IS BOUND.
+      ls_package_data-pdevclass = li_package->transport_layer.
+    ENDIF.
+
+    " For local packages store application component
+    IF ls_package_data-devclass(1) = '$'.
+      zcl_abapgit_persist_packages=>get_instance( )->modify(
+        iv_package    = ls_package_data-devclass
+        iv_component  = ls_package_data-component
+        iv_comp_posid = ls_package_data-comp_posid ).
+    ENDIF.
+
+    " Parent package is not changed. Assume the folder logic already created the package and set
+    " the hierarchy before.
+    CLEAR ls_package_data-parentcl.
+
+* Fields not set:
+* korrflag
+* dlvunit
+* parentcl
+* cli_check
+* intprefx
+    ls_data_sign-ctext            = abap_true.
+    ls_data_sign-as4user          = abap_true.
+    ls_data_sign-pdevclass        = abap_true.
+    ls_data_sign-comp_posid       = abap_true.
+    ls_data_sign-component        = abap_true.
+    ls_data_sign-perminher        = abap_true.
+    ls_data_sign-packtype         = abap_true.
+    ls_data_sign-restricted       = abap_true.
+    ls_data_sign-mainpack         = abap_true.
+    ls_data_sign-srv_check        = abap_true.
+    ls_data_sign-ext_alias        = abap_true.
+    ls_data_sign-project_guid     = abap_true.
+    ls_data_sign-project_id       = abap_true.
+    ls_data_sign-project_passdown = abap_true.
+
+    IF ls_package_data-ctext IS INITIAL.
+      ls_package_data-ctext = mv_local_devclass.
+    ENDIF.
+    IF ls_package_data-dlvunit IS INITIAL.
+      ls_package_data-dlvunit = 'HOME'.
+    ENDIF.
+
+    ls_package_data-as4user = sy-uname.
+
+    IF li_package IS BOUND.
+      " Package already exists, change it
+      set_lock( ii_package = li_package
+                iv_lock    = abap_true ).
+
+      li_package->set_all_attributes(
+        EXPORTING
+          i_package_data             = ls_package_data
+          i_data_sign                = ls_data_sign
+        EXCEPTIONS
+          object_not_changeable      = 1
+          object_deleted             = 2
+          object_invalid             = 3
+          short_text_missing         = 4
+          author_not_existing        = 5
+          local_package              = 6
+          software_component_invalid = 7
+          layer_invalid              = 8
+          korrflag_invalid           = 9
+          component_not_existing     = 10
+          component_missing          = 11
+          authorize_failure          = 12
+          prefix_in_use              = 13
+          unexpected_error           = 14
+          intern_err                 = 15
+*          wrong_mainpack_value       = 16  downport, does not exist in 7.30
+*          superpackage_invalid       = 17  downport, does not exist in 7.30
+          OTHERS                     = 18 ).
+      IF sy-subrc <> 0.
+        unlock_and_raise_error( li_package ).
+      ENDIF.
+
+    ELSE.
+      " Package does not exist yet, create it
+      " This shouldn't really happen, because the folder logic initially creates the packages.
+      cl_package_factory=>create_new_package(
+        IMPORTING
+          e_package                  = li_package
+        CHANGING
+          c_package_data             = ls_package_data
+        EXCEPTIONS
+          object_already_existing    = 1
+          object_just_created        = 2
+          not_authorized             = 3
+          wrong_name_prefix          = 4
+          undefined_name             = 5
+          reserved_local_name        = 6
+          invalid_package_name       = 7
+          short_text_missing         = 8
+          software_component_invalid = 9
+          layer_invalid              = 10
+          author_not_existing        = 11
+          component_not_existing     = 12
+          component_missing          = 13
+          prefix_in_use              = 14
+          unexpected_error           = 15
+          intern_err                 = 16
+          no_access                  = 17
+*          invalid_translation_depth  = 18 downport, does not exist in 7.30
+*          wrong_mainpack_value       = 19 downport, does not exist in 7.30
+*          superpackage_invalid       = 20 downport, does not exist in 7.30
+*          error_in_cts_checks        = 21 downport, does not exist in 7.31
+          OTHERS                     = 22 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+
+    " Load package interface usages
+    TRY.
+        io_xml->read(
+          EXPORTING
+            iv_name = 'PERMISSION'
+          CHANGING
+            cg_data = lt_usage_data ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+        " No permissions saved
+    ENDTRY.
+
+    LOOP AT lt_usage_data ASSIGNING <ls_usage_data>.
+      <ls_usage_data>-client_pak = mv_local_devclass.
+    ENDLOOP.
+
+    update_pinf_usages( ii_package    = li_package
+                        it_usage_data = lt_usage_data ).
+
+    ls_save_sign-pack = abap_true.
+    ls_save_sign-permis = abap_true.
+    ls_save_sign-elems = abap_true.
+    ls_save_sign-interf = abap_true.
+    li_package->save_generic(
+      EXPORTING
+        i_save_sign           = ls_save_sign
+        i_transport_request   = iv_transport
+        i_suppress_dialog     = abap_true
+      EXCEPTIONS
+        cancelled_in_corr     = 1
+        permission_failure    = 2
+        object_not_changeable = 3
+        object_invalid        = 4
+        OTHERS                = 5 ).
+    IF sy-subrc <> 0.
+      unlock_and_raise_error( li_package ).
+    ENDIF.
+
+    set_lock( ii_package = li_package
+              iv_lock    = abap_false ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~exists.
+    " Check remote package if deserialize has not been called before this
+    IF mv_local_devclass IS INITIAL.
+      rv_bool = abap_false.
+    ELSE.
+      cl_package_helper=>check_package_existence(
+        EXPORTING
+          i_package_name          = mv_local_devclass
+        IMPORTING
+          e_package_exists        = rv_bool
+        EXCEPTIONS
+          intern_err              = 1
+          OTHERS                  = 2 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_comparator.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_order.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_steps.
+    APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_metadata.
+    rs_metadata = get_metadata( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_active.
+    rv_active = is_active( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_locked.
+ 
+    DATA: lv_object TYPE eqegraarg.
+ 
+    lv_object = |DV{ ms_item-obj_name }|.
+    OVERLAY lv_object WITH '                                          '.
+    lv_object = lv_object && '*'.
+ 
+    rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'EEUDB'
+                                            iv_argument    = lv_object ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~jump.
+    " Covered by ZCL_ABAPGIT_OBJECTS=>JUMP
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_filename_to_object.
+ 
+    IF iv_filename <> zcl_abapgit_filename_logic=>c_package_file.
+      zcx_abapgit_exception=>raise( |Unexpected filename for package { cs_item-obj_name }| ).
+    ENDIF.
+ 
+    " Try to get a unique package name for DEVC by using the path
+    cs_item-obj_name = zcl_abapgit_folder_logic=>get_instance( )->path_to_package(
+      iv_top                  = iv_package
+      io_dot                  = io_dot
+      iv_create_if_not_exists = abap_false
+      iv_path                 = iv_path ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_object_to_filename.
+ 
+    " Packages have a fixed filename so that the repository can be installed to a different
+    " package(-hierarchy) on the client and not show up as a different package in the repo.
+    cv_filename = zcl_abapgit_filename_logic=>c_package_file.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~serialize.
+    DATA: ls_package_data TYPE scompkdtln,
+          ls_package_comp TYPE zcl_abapgit_persist_packages=>ty_package,
+          li_package      TYPE REF TO if_package,
+          lt_intf_usages  TYPE tpak_permission_to_use_list,
+          lt_usage_data   TYPE scomppdata,
+          ls_usage_data   TYPE scomppdtln,
+          li_usage        TYPE REF TO if_package_permission_to_use.
+
+    FIELD-SYMBOLS: <lg_field> TYPE any.
+
+
+    li_package = get_package( ).
+    IF li_package IS NOT BOUND.
+      zcx_abapgit_exception=>raise( |Could not find package to serialize.| ).
+    ENDIF.
+
+    li_package->get_all_attributes(
+      IMPORTING
+        e_package_data  = ls_package_data
+      EXCEPTIONS
+        object_invalid  = 1
+        package_deleted = 2
+        intern_err      = 3
+        OTHERS          = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    " For local packages get application component
+    IF is_local( ls_package_data-devclass ) = abap_true.
+      ls_package_comp = zcl_abapgit_persist_packages=>get_instance( )->read( ls_package_data-devclass ).
+      ls_package_data-component  = ls_package_comp-component.
+      ls_package_data-comp_posid = ls_package_comp-comp_posid.
+    ENDIF.
+
+    CLEAR: ls_package_data-devclass,
+           ls_package_data-parentcl.
+
+    " Clear administrative data to prevent diffs
+    CLEAR: ls_package_data-created_by,
+           ls_package_data-created_on,
+           ls_package_data-changed_by,
+           ls_package_data-changed_on,
+           ls_package_data-as4user.
+
+    " Clear text descriptions that might be localized
+    CLEAR: ls_package_data-comp_text,
+           ls_package_data-dlvu_text,
+           ls_package_data-layer_text.
+
+    " Clear obsolete fields
+    CLEAR: ls_package_data-intfprefx,
+           ls_package_data-cli_check.
+
+    ASSIGN COMPONENT 'TRANSLATION_DEPTH_TEXT'
+           OF STRUCTURE ls_package_data
+           TO <lg_field>.
+    IF sy-subrc = 0.
+      CLEAR: <lg_field>.
+    ENDIF.
+
+    ASSIGN COMPONENT 'TRANSLATION_GRAPH_DEPTH_TEXT'
+           OF STRUCTURE ls_package_data
+           TO <lg_field>.
+    IF sy-subrc = 0.
+      CLEAR: <lg_field>.
+    ENDIF.
+
+    " Clear things related to local installation package
+    CLEAR: ls_package_data-namespace,
+           ls_package_data-dlvunit,
+           ls_package_data-tpclass,
+           ls_package_data-pdevclass.
+
+    " Not usable on customer systems
+    ASSIGN COMPONENT 'TRANSLATION_DEPTH'
+           OF STRUCTURE ls_package_data
+           TO <lg_field>.
+    IF sy-subrc = 0.
+      CLEAR: <lg_field>.
+    ENDIF.
+
+    ASSIGN COMPONENT 'TRANSLATION_GRAPH_DEPTH'
+           OF STRUCTURE ls_package_data
+           TO <lg_field>.
+    IF sy-subrc = 0.
+      CLEAR: <lg_field>.
+    ENDIF.
+
+    CLEAR: ls_package_data-korrflag.
+
+    io_xml->add( iv_name = 'DEVC'
+                 ig_data = ls_package_data ).
+
+    " Save package interface usages
+    li_package->get_permissions_to_use(
+      IMPORTING
+        e_permissions    = lt_intf_usages
+      EXCEPTIONS
+        object_invalid   = 1
+        unexpected_error = 2
+        OTHERS           = 3 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    LOOP AT lt_intf_usages INTO li_usage.
+      li_usage->get_all_attributes(
+        IMPORTING
+          e_permission_data = ls_usage_data
+        EXCEPTIONS
+          object_invalid    = 1
+          intern_err        = 2
+          OTHERS            = 3 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+
+      CLEAR: ls_usage_data-pack_name, ls_usage_data-client_pak.
+
+      APPEND ls_usage_data TO lt_usage_data.
+    ENDLOOP.
+
+    IF lt_usage_data IS NOT INITIAL.
+      io_xml->add( iv_name = 'PERMISSION'
+                   ig_data = lt_usage_data ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_object_intf.clas.abap.html b/src/objects/zcl_abapgit_object_intf.clas.abap.html new file mode 100644 index 00000000000..cc80a997103 --- /dev/null +++ b/src/objects/zcl_abapgit_object_intf.clas.abap.html @@ -0,0 +1,2089 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_object_intf.clas.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_object_intf.clas.abap

+
+ +
+ 71.55% + Statements + 478/668 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 44.44% + Functions + 4/9 +
+ + +
+ 71.55% + Lines + 478/668 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +6691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_object_intf DEFINITION PUBLIC FINAL INHERITING FROM zcl_abapgit_objects_program.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_object.
+ 
+    TYPES:
+      BEGIN OF ty_docu,
+        lines      TYPE tlinetab,
+        i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_lines,
+      END OF ty_docu.
+ 
+    TYPES:
+      BEGIN OF ty_intf,
+        vseointerf      TYPE vseointerf,
+        docu            TYPE ty_docu,
+        description     TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt,
+        description_sub TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt,
+      END OF ty_intf.
+ 
+    METHODS constructor
+      IMPORTING
+        is_item     TYPE zif_abapgit_definitions=>ty_item
+        iv_language TYPE spras.
+  PROTECTED SECTION.
+    METHODS deserialize_proxy
+      IMPORTING
+        iv_transport TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_docu
+      IMPORTING
+        !ii_xml  TYPE REF TO zif_abapgit_xml_input
+        !is_docu TYPE ty_docu
+      RAISING
+        zcx_abapgit_exception .
+    METHODS serialize_docu
+      IMPORTING
+                !ii_xml              TYPE REF TO zif_abapgit_xml_output
+                !it_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus OPTIONAL
+                !iv_clsname          TYPE seoclsname
+      RETURNING VALUE(rs_docu)       TYPE ty_docu
+      RAISING
+                zcx_abapgit_exception.
+    METHODS serialize_descr
+      IMPORTING
+                !ii_xml               TYPE REF TO zif_abapgit_xml_output
+                !iv_clsname           TYPE seoclsname
+      RETURNING VALUE(rs_description) TYPE ty_intf-description
+      RAISING
+                zcx_abapgit_exception.
+    METHODS serialize_descr_sub
+      IMPORTING
+                !ii_xml               TYPE REF TO zif_abapgit_xml_output
+                !iv_clsname           TYPE seoclsname
+      RETURNING VALUE(rs_description) TYPE ty_intf-description_sub
+      RAISING
+                zcx_abapgit_exception.
+    METHODS serialize_xml
+      IMPORTING
+        !io_xml TYPE REF TO zif_abapgit_xml_output
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_longtext_name,
+        attributes TYPE string VALUE 'LONGTEXTS_IA',
+        methods    TYPE string VALUE 'LONGTEXTS_IO',
+        events     TYPE string VALUE 'LONGTEXTS_IE',
+      END OF c_longtext_name.
+ 
+    CONSTANTS:
+      BEGIN OF c_longtext_id,
+        interface  TYPE dokil-id VALUE 'IF',
+        attributes TYPE dokil-id VALUE 'IA',
+        methods    TYPE dokil-id VALUE 'IO',
+        events     TYPE dokil-id VALUE 'IE',
+      END OF c_longtext_id.
+ 
+    DATA mi_object_oriented_object_fct TYPE REF TO zif_abapgit_oo_object_fnc .
+ 
+    METHODS deserialize_pre_ddic
+      IMPORTING
+        ii_xml     TYPE REF TO zif_abapgit_xml_input
+        iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS deserialize_descriptions
+      IMPORTING
+        it_description TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt OPTIONAL.
+    METHODS deserialize_descr_sub
+      IMPORTING
+        it_description TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt OPTIONAL.
+    METHODS read_xml
+      IMPORTING
+                ii_xml         TYPE REF TO zif_abapgit_xml_input
+      RETURNING VALUE(rs_intf) TYPE ty_intf
+      RAISING
+                zcx_abapgit_exception.
+    METHODS read_json
+      RETURNING VALUE(rs_intf) TYPE ty_intf
+      RAISING
+                zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_OBJECT_INTF IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor(
+      is_item     = is_item
+      iv_language = iv_language ).
+    mi_object_oriented_object_fct = zcl_abapgit_oo_factory=>make( ms_item-obj_type ).
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_descriptions.
+    DATA:  ls_clskey TYPE seoclskey.
+    ls_clskey-clsname = ms_item-obj_name.
+ 
+    mi_object_oriented_object_fct->update_descriptions(
+      is_key          = ls_clskey
+      it_descriptions = it_description ).
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_descr_sub.
+    DATA:  ls_clskey TYPE seoclskey.
+    ls_clskey-clsname = ms_item-obj_name.
+ 
+    mi_object_oriented_object_fct->update_descriptions_sub(
+      is_key          = ls_clskey
+      it_descriptions = it_description ).
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_docu.
+    DATA: lv_object     TYPE dokhl-object,
+          ls_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_line.
+ 
+    lv_object = ms_item-obj_name.
+ 
+    IF lines( is_docu-lines ) = 0.
+      mi_object_oriented_object_fct->delete_documentation(
+        iv_id          = c_longtext_id-interface
+        iv_object_name = lv_object
+        iv_language    = mv_language ).
+      RETURN.
+    ENDIF.
+ 
+    mi_object_oriented_object_fct->create_documentation(
+      it_lines       = is_docu-lines
+      iv_id          = c_longtext_id-interface
+      iv_object_name = lv_object
+      iv_language    = mv_language ).
+ 
+    LOOP AT is_docu-i18n_lines INTO ls_i18n_lines.
+      mi_object_oriented_object_fct->create_documentation(
+        it_lines         = ls_i18n_lines-lines
+        iv_id            = c_longtext_id-interface
+        iv_object_name   = lv_object
+        iv_language      = ls_i18n_lines-language
+        iv_no_masterlang = abap_true ).
+    ENDLOOP.
+ 
+    deserialize_longtexts(
+      ii_xml           = ii_xml
+      iv_longtext_name = c_longtext_name-attributes
+      iv_longtext_id   = c_longtext_id-attributes ).
+ 
+    deserialize_longtexts(
+      ii_xml           = ii_xml
+      iv_longtext_name = c_longtext_name-methods
+      iv_longtext_id   = c_longtext_id-methods ).
+ 
+    deserialize_longtexts(
+      ii_xml           = ii_xml
+      iv_longtext_name = c_longtext_name-events
+      iv_longtext_id   = c_longtext_id-events ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_pre_ddic.
+
+    DATA ls_intf TYPE ty_intf.
+
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+      ls_intf = read_json( ).
+    ELSE.
+      ii_xml->read( EXPORTING iv_name = 'VSEOINTERF'
+                    CHANGING  cg_data = ls_intf-vseointerf ).
+    ENDIF.
+
+    mi_object_oriented_object_fct->create(
+      EXPORTING
+        iv_check      = abap_false
+        iv_package    = iv_package
+      CHANGING
+        cg_properties = ls_intf-vseointerf ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_proxy.
+
+    DATA: lv_transport    TYPE trkorr,
+          li_proxy_object TYPE REF TO if_px_main,
+          lv_name         TYPE prx_r3name,
+          lx_proxy_fault  TYPE REF TO cx_proxy_fault.
+
+    lv_name = ms_item-obj_name.
+
+    lv_transport = iv_transport.
+
+    TRY.
+        li_proxy_object = cl_pxn_factory=>create(
+                              application  = 'PROXY_UI'
+                              display_only = abap_false
+                              saveable     = abap_true
+                          )->if_pxn_factory~load_by_abap_name(
+                              object   = ms_item-obj_type
+                              obj_name = lv_name ).
+
+        li_proxy_object->activate(
+          EXPORTING
+            activate_all     = abap_true
+          CHANGING
+            transport_number = lv_transport ).
+
+        li_proxy_object->dequeue( ).
+
+      CATCH cx_proxy_fault INTO lx_proxy_fault.
+        IF li_proxy_object IS BOUND.
+          TRY.
+              li_proxy_object->dequeue( ).
+            CATCH cx_proxy_fault ##NO_HANDLER.
+          ENDTRY.
+        ENDIF.
+        zcx_abapgit_exception=>raise_with_text( lx_proxy_fault ).
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read_json.
+    DATA lv_json_data TYPE xstring.
+    DATA ls_intf_aff TYPE zif_abapgit_aff_intf_v1=>ty_main.
+    DATA lo_aff_mapper TYPE REF TO zif_abapgit_aff_type_mapping.
+ 
+    lv_json_data = zif_abapgit_object~mo_files->read_raw( iv_ext = 'json' ).
+    ls_intf_aff = lcl_aff_metadata_handler=>deserialize( lv_json_data ).
+ 
+    CREATE OBJECT lo_aff_mapper TYPE lcl_aff_type_mapping.
+    lo_aff_mapper->to_abapgit( EXPORTING iv_data = ls_intf_aff
+                                         iv_object_name = ms_item-obj_name
+                               IMPORTING es_data = rs_intf ).
+  ENDMETHOD.
+ 
+ 
+  METHOD read_xml.
+    ii_xml->read( EXPORTING iv_name = 'VSEOINTERF'
+                  CHANGING  cg_data = rs_intf-vseointerf ).
+    ii_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
+                  CHANGING  cg_data = rs_intf-description ).
+    ii_xml->read( EXPORTING iv_name = 'DESCRIPTIONS_SUB'
+                  CHANGING  cg_data = rs_intf-description_sub ).
+    ii_xml->read( EXPORTING iv_name = 'LINES'
+                  CHANGING  cg_data = rs_intf-docu-lines ).
+    ii_xml->read( EXPORTING iv_name = 'I18N_LINES'
+                  CHANGING  cg_data = rs_intf-docu-i18n_lines ).
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_descr.
+ 
+    DATA: lt_descriptions    TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt,
+          lv_language        TYPE spras,
+          lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    IF mo_i18n_params->ms_params-main_language_only = abap_true.
+      lv_language = mv_language.
+    ENDIF.
+ 
+    lt_descriptions = mi_object_oriented_object_fct->read_descriptions(
+      iv_object_name = iv_clsname
+      iv_language    = lv_language ).
+ 
+    " Remove technical languages
+    lt_language_filter = mo_i18n_params->build_language_filter( ).
+    DELETE lt_descriptions WHERE NOT langu IN lt_language_filter AND langu <> mv_language.
+ 
+    IF lines( lt_descriptions ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    rs_description = lt_descriptions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_descr_sub.
+ 
+    DATA: lt_descriptions    TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt,
+          lv_language        TYPE spras,
+          lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter.
+ 
+    IF mo_i18n_params->ms_params-main_language_only = abap_true.
+      lv_language = mv_language.
+    ENDIF.
+ 
+    lt_descriptions = mi_object_oriented_object_fct->read_descriptions_sub(
+      iv_object_name = iv_clsname
+      iv_language    = lv_language ).
+ 
+    " Remove technical languages
+    lt_language_filter = mo_i18n_params->build_language_filter( ).
+    DELETE lt_descriptions WHERE NOT langu IN lt_language_filter AND langu <> mv_language.
+ 
+    IF lines( lt_descriptions ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    rs_description = lt_descriptions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_docu.
+ 
+    DATA: lt_lines      TYPE tlinetab,
+          lv_object     TYPE dokhl-object,
+          lv_langu      TYPE sy-langu,
+          lt_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_lines,
+          ls_i18n_lines TYPE zif_abapgit_lang_definitions=>ty_i18n_line.
+ 
+    lv_object = iv_clsname.
+ 
+    lt_lines = mi_object_oriented_object_fct->read_documentation(
+      iv_id          = c_longtext_id-interface
+      iv_object_name = lv_object
+      iv_language    = mv_language ).
+ 
+    rs_docu-lines = lt_lines.
+ 
+    IF mo_i18n_params->ms_params-main_language_only = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT it_langu_additional INTO lv_langu.
+ 
+      lt_lines = mi_object_oriented_object_fct->read_documentation(
+        iv_id          = c_longtext_id-interface
+        iv_object_name = lv_object
+        iv_language    = lv_langu ).
+ 
+      IF lines( lt_lines ) > 0.
+        CLEAR ls_i18n_lines.
+        ls_i18n_lines-language = lv_langu.
+        ls_i18n_lines-lines    = lt_lines.
+        INSERT ls_i18n_lines INTO TABLE lt_i18n_lines.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    rs_docu-i18n_lines = lt_i18n_lines.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_xml.
+
+    DATA:
+      ls_intf             TYPE ty_intf,
+      ls_clskey           TYPE seoclskey,
+      lv_serialized_data  TYPE xstring,
+      lt_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus.
+
+    ls_clskey-clsname = ms_item-obj_name.
+
+    ls_intf-vseointerf = mi_object_oriented_object_fct->get_interface_properties( ls_clskey ).
+
+    " Select all active translations of documentation
+    " Skip main language - it was already serialized
+    SELECT DISTINCT langu
+      INTO TABLE lt_langu_additional
+      FROM dokhl
+      WHERE id     = c_longtext_id-interface
+        AND object = ls_clskey-clsname
+        AND langu  <> mv_language.
+
+    ls_intf-docu = serialize_docu(
+      ii_xml              = io_xml
+      iv_clsname          = ls_clskey-clsname
+      it_langu_additional = lt_langu_additional ).
+
+    ls_intf-description = serialize_descr( ii_xml     = io_xml
+                                           iv_clsname = ls_clskey-clsname ).
+    ls_intf-description_sub = serialize_descr_sub( ii_xml     = io_xml
+                                                   iv_clsname = ls_clskey-clsname ).
+
+    " HERE: switch with feature flag for XML or JSON file format
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+      lv_serialized_data = lcl_aff_metadata_handler=>serialize( ls_intf ).
+      zif_abapgit_object~mo_files->add_raw( iv_ext  = 'json'
+                                            iv_data = lv_serialized_data ).
+
+    ELSE.
+      io_xml->add( iv_name = 'VSEOINTERF'
+                   ig_data = ls_intf-vseointerf ).
+      io_xml->add( iv_name = 'DESCRIPTIONS'
+                   ig_data = ls_intf-description ).
+      io_xml->add( iv_name = 'DESCRIPTIONS_SUB'
+                   ig_data = ls_intf-description_sub ).
+      io_xml->add( iv_name = 'LINES'
+                   ig_data = ls_intf-docu-lines ).
+      io_xml->add( iv_name = 'I18N_LINES'
+                   ig_data = ls_intf-docu-i18n_lines ).
+
+      serialize_longtexts(
+        ii_xml           = io_xml
+        iv_longtext_name = c_longtext_name-attributes
+        iv_longtext_id   = c_longtext_id-attributes ).
+
+      serialize_longtexts(
+        ii_xml           = io_xml
+        iv_longtext_name = c_longtext_name-methods
+        iv_longtext_id   = c_longtext_id-methods ).
+
+      serialize_longtexts(
+        ii_xml           = io_xml
+        iv_longtext_name = c_longtext_name-events
+        iv_longtext_id   = c_longtext_id-events ).
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~changed_by.
+    TYPES: BEGIN OF ty_includes,
+             programm TYPE syrepid,
+           END OF ty_includes.
+ 
+    TYPES: BEGIN OF ty_reposrc,
+             unam  TYPE reposrc-unam,
+             udat  TYPE reposrc-udat,
+             utime TYPE reposrc-utime,
+           END OF ty_reposrc.
+ 
+    DATA: lt_reposrc  TYPE STANDARD TABLE OF ty_reposrc,
+          ls_reposrc  LIKE LINE OF lt_reposrc,
+          lt_includes TYPE STANDARD TABLE OF ty_includes.
+ 
+    lt_includes = mi_object_oriented_object_fct->get_includes( ms_item-obj_name ).
+    ASSERT lines( lt_includes ) > 0.
+ 
+    SELECT unam udat utime FROM reposrc
+      INTO TABLE lt_reposrc
+      FOR ALL ENTRIES IN lt_includes
+      WHERE progname = lt_includes-programm
+      AND r3state = 'A'.
+    IF sy-subrc <> 0.
+      rv_user = c_user_unknown.
+    ELSE.
+      SORT lt_reposrc BY udat DESCENDING utime DESCENDING.
+      READ TABLE lt_reposrc INDEX 1 INTO ls_reposrc.
+      ASSERT sy-subrc = 0.
+      rv_user = ls_reposrc-unam.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~delete.
+    DATA: ls_clskey     TYPE seoclskey,
+          ls_vseointerf TYPE vseointerf.
+
+    ls_clskey-clsname = ms_item-obj_name.
+    ls_vseointerf = mi_object_oriented_object_fct->get_interface_properties( ls_clskey ).
+
+    IF ls_vseointerf-clsproxy = abap_true.
+      " Proxy interfaces are managed via SPRX
+      RETURN.
+    ENDIF.
+
+    IF zif_abapgit_object~exists( ) = abap_false.
+      RETURN.
+    ENDIF.
+
+    corr_insert( iv_package ).
+
+    mi_object_oriented_object_fct->delete( ls_clskey ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~deserialize.
+    DATA: lt_source TYPE rswsourcet,
+          ls_clskey TYPE seoclskey,
+          ls_intf   TYPE ty_intf.
+ 
+    IF iv_step = zif_abapgit_object=>gc_step_id-abap.
+      " HERE: switch with feature flag between XML and JSON file format
+      IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+        ls_intf = read_json( ).
+      ELSE.
+        ls_intf = read_xml( io_xml ).
+      ENDIF.
+ 
+      IF ls_intf-vseointerf-clsproxy = abap_true.
+        " Proxy interfaces are managed via SPRX
+        deserialize_proxy( iv_transport ).
+
+      ELSE.
+        mi_object_oriented_object_fct->create(
+          EXPORTING
+            iv_check      = abap_true
+            iv_package    = iv_package
+          CHANGING
+            cg_properties = ls_intf-vseointerf ).
+ 
+        ls_clskey-clsname = ms_item-obj_name.
+        lt_source = zif_abapgit_object~mo_files->read_abap( ).
+        mi_object_oriented_object_fct->deserialize_source(
+          is_key     = ls_clskey
+          iv_package = iv_package
+          it_source  = lt_source ).
+ 
+        deserialize_descriptions( it_description = ls_intf-description ).
+ 
+        deserialize_descr_sub( it_description = ls_intf-description_sub ).
+ 
+        deserialize_docu(
+          is_docu = ls_intf-docu
+          ii_xml  = io_xml ).
+ 
+        mi_object_oriented_object_fct->add_to_activation_list( ms_item ).
+      ENDIF.
+ 
+    ELSEIF iv_step = zif_abapgit_object=>gc_step_id-early.
+
+      " If interface does not exist, create it
+      " so DDIC that depends on it does not fail activation
+      IF zif_abapgit_object~exists( ) = abap_false.
+        deserialize_pre_ddic(
+          ii_xml     = io_xml
+          iv_package = iv_package ).
+      ELSE.
+        corr_insert( iv_package ).
+      ENDIF.
+
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~exists.
+ 
+    DATA: ls_class_key TYPE seoclskey,
+          lv_category  TYPE seoclassdf-category.
+ 
+    ls_class_key-clsname = ms_item-obj_name.
+ 
+    rv_bool = mi_object_oriented_object_fct->exists( ls_class_key ).
+ 
+    IF rv_bool = abap_true.
+      SELECT SINGLE category FROM seoclassdf INTO lv_category
+        WHERE clsname = ls_class_key-clsname
+        AND ( version = '1'
+        OR version = '0' ) ##WARN_OK.                   "#EC CI_GENBUFF
+      IF sy-subrc = 0 AND lv_category = seoc_category_webdynpro_class.
+        rv_bool = abap_false.
+      ELSE.
+        SELECT SINGLE obj_name FROM sproxhdr INTO ls_class_key-clsname
+          WHERE object = 'INTF' AND obj_name = ls_class_key-clsname.
+        IF sy-subrc = 0.
+          " generated by proxy
+          rv_bool = abap_false.
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_comparator.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_order.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_steps.
+    APPEND zif_abapgit_object=>gc_step_id-early TO rt_steps.
+    APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_metadata.
+    rs_metadata = get_metadata( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_active.
+    rv_active = is_active( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_locked.
+ 
+    DATA: lv_object TYPE eqegraarg.
+ 
+    lv_object = |{ ms_item-obj_name }|.
+    OVERLAY lv_object WITH '==============================P'.
+    lv_object = lv_object && '*'.
+ 
+    rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESEOCLASS'
+                                            iv_argument    = lv_object ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~jump.
+    " Covered by ZCL_ABAPGIT_OBJECTS=>JUMP
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_filename_to_object.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_object_to_filename.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~serialize.
+
+    DATA: lt_source        TYPE seop_source_string,
+          ls_interface_key TYPE seoclskey.
+
+    ls_interface_key-clsname = ms_item-obj_name.
+
+    IF zif_abapgit_object~exists( ) = abap_false.
+      RETURN.
+    ENDIF.
+
+    CALL FUNCTION 'SEO_BUFFER_REFRESH'
+      EXPORTING
+        version = seoc_version_active
+        force   = abap_true.
+    CALL FUNCTION 'SEO_BUFFER_REFRESH'
+      EXPORTING
+        version = seoc_version_inactive
+        force   = abap_true.
+
+    lt_source = mi_object_oriented_object_fct->serialize_abap( ls_interface_key ).
+
+    zif_abapgit_object~mo_files->add_abap( lt_source ).
+
+    serialize_xml( io_xml ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap.html b/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap.html new file mode 100644 index 00000000000..dd5bb2d408d --- /dev/null +++ b/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap.html @@ -0,0 +1,1954 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_object_intf.clas.locals_imp.abap

+
+ +
+ 84.75% + Statements + 528/623 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 84.75% + Lines + 528/623 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +6241x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_aff_helper DEFINITION.
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      get_descriptions_compo_subco
+        IMPORTING iv_language          TYPE sy-langu
+                  iv_clif_name         TYPE seoclsname
+        RETURNING VALUE(rs_properties) TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions ,
+      get_descr_comp_subc_w_exposure
+        IMPORTING iv_language          TYPE sy-langu
+                  iv_clif_name         TYPE seoclsname
+                  iv_exposure          TYPE seoexpose DEFAULT seoc_exposure_public
+        RETURNING VALUE(rs_properties) TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions ,
+      set_descriptions_compo_subco
+        IMPORTING iv_clif_name  TYPE seoclsname
+                  iv_language   TYPE langu
+                  is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions .
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_component,
+        visibility TYPE seoexpose,
+        cmpname    TYPE seocmpname,
+        descript   TYPE seodescr,
+        cmptype    TYPE seocmptype,
+      END OF ty_component,
+      BEGIN OF ty_sub_component,
+        cmpname  TYPE seocmpname,
+        sconame  TYPE seosconame,
+        descript TYPE seodescr,
+        scotype  TYPE seoscotype,
+      END OF ty_sub_component,
+      ty_compontents     TYPE STANDARD TABLE OF ty_component,
+      ty_sub_compontents TYPE STANDARD TABLE OF ty_sub_component.
+ 
+    CLASS-METHODS:
+      get_attributes
+        IMPORTING is_components    TYPE ty_compontents
+        RETURNING VALUE(rs_result) TYPE zif_abapgit_aff_oo_types_v1=>ty_component_descriptions,
+      get_methods
+        IMPORTING is_components     TYPE ty_compontents
+                  is_sub_components TYPE ty_sub_compontents
+        RETURNING VALUE(rs_result)  TYPE zif_abapgit_aff_oo_types_v1=>ty_methods,
+      get_types
+        IMPORTING is_components    TYPE ty_compontents
+        RETURNING VALUE(rs_result) TYPE zif_abapgit_aff_oo_types_v1=>ty_component_descriptions,
+      get_events
+        IMPORTING is_components     TYPE ty_compontents
+                  is_sub_components TYPE ty_sub_compontents
+        RETURNING VALUE(rs_result)  TYPE zif_abapgit_aff_oo_types_v1=>ty_events,
+      set_methods
+        IMPORTING iv_clif_name  TYPE seoclsname
+                  iv_language   TYPE langu
+                  is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions,
+      set_attributes
+        IMPORTING iv_clif_name  TYPE seoclsname
+                  iv_language   TYPE langu
+                  is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions,
+      set_events
+        IMPORTING iv_clif_name  TYPE seoclsname
+                  iv_language   TYPE langu
+                  is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions,
+      set_types
+        IMPORTING iv_clif_name  TYPE seoclsname
+                  iv_language   TYPE langu
+                  is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions .
+ENDCLASS.
+ 
+ 
+CLASS lcl_aff_helper IMPLEMENTATION.
+ 
+  METHOD get_descr_comp_subc_w_exposure.
+    DATA:
+      lt_components     TYPE ty_compontents,
+      lt_sub_components TYPE ty_sub_compontents.
+ 
+ 
+    SELECT df~exposure AS visibility component~cmpname component_text~descript component~cmptype
+      INTO TABLE lt_components
+      FROM seocompo AS component
+      LEFT OUTER JOIN seocompotx AS component_text
+      ON component~cmpname = component_text~cmpname AND component~clsname = component_text~clsname AND
+         component_text~langu = iv_language
+      INNER JOIN seocompodf AS df
+      ON component~clsname = df~clsname AND
+         component~cmpname = df~cmpname
+      WHERE component~clsname = iv_clif_name AND
+            df~exposure       = iv_exposure.           "#EC CI_BUFFJOIN
+ 
+    SELECT sub_component~cmpname sub_component~sconame sub_component_text~descript sub_component~scotype
+      INTO TABLE lt_sub_components
+      FROM seosubco AS sub_component JOIN seosubcotx AS sub_component_text
+      ON  sub_component~clsname = sub_component_text~clsname
+          AND sub_component~cmpname = sub_component_text~cmpname
+          AND sub_component~sconame = sub_component_text~sconame
+      INNER JOIN seocompodf AS df
+      ON sub_component~clsname = df~clsname AND
+         sub_component~cmpname = df~cmpname
+      WHERE sub_component~clsname    = iv_clif_name
+        AND df~exposure              = iv_exposure
+        AND sub_component_text~langu = iv_language
+        AND sub_component_text~descript <> space.      "#EC CI_BUFFJOIN
+ 
+ 
+ 
+    rs_properties-attributes = get_attributes( lt_components ).
+    rs_properties-methods = get_methods( is_components = lt_components
+                                         is_sub_components = lt_sub_components ).
+    rs_properties-events = get_events( is_components = lt_components
+                                       is_sub_components = lt_sub_components ).
+    rs_properties-types = get_types( lt_components ).
+  ENDMETHOD.
+ 
+ 
+  METHOD get_descriptions_compo_subco.
+    TYPES:
+      BEGIN OF ty_helper_type,
+        cmpname  TYPE seocmpname,
+        descript TYPE seodescr,
+        cmptype  TYPE seocmptype,
+      END OF ty_helper_type.
+    DATA:
+      lt_components     TYPE STANDARD TABLE OF ty_helper_type,
+      lt_sub_components TYPE ty_sub_compontents,
+      lt_components_exp TYPE ty_compontents,
+      ls_component_exp  LIKE LINE OF lt_components_exp.
+    FIELD-SYMBOLS:
+      <ls_component> LIKE LINE OF lt_components.
+ 
+ 
+    SELECT component~cmpname component_text~descript component~cmptype
+      INTO TABLE lt_components
+      FROM seocompo AS component
+     LEFT OUTER JOIN seocompotx AS component_text
+      ON component~cmpname = component_text~cmpname AND component~clsname    = component_text~clsname
+                                                    AND component_text~langu = iv_language
+      WHERE component~clsname = iv_clif_name.          "#EC CI_BUFFJOIN
+ 
+    SELECT sub_component~cmpname sub_component~sconame sub_component_text~descript sub_component~scotype
+      INTO TABLE lt_sub_components
+      FROM seosubco AS sub_component JOIN seosubcotx AS sub_component_text
+      ON sub_component~clsname      = sub_component_text~clsname
+          AND sub_component~cmpname = sub_component_text~cmpname
+          AND sub_component~sconame = sub_component_text~sconame
+      WHERE sub_component~clsname    = iv_clif_name
+        AND sub_component_text~langu = iv_language
+        AND sub_component_text~descript <> space.      "#EC CI_BUFFJOIN
+ 
+    LOOP AT lt_components ASSIGNING <ls_component>.
+      CLEAR ls_component_exp.
+      MOVE-CORRESPONDING <ls_component> TO ls_component_exp.
+      INSERT ls_component_exp INTO TABLE lt_components_exp.
+    ENDLOOP.
+ 
+    rs_properties-attributes = get_attributes( lt_components_exp ).
+    rs_properties-methods = get_methods( is_components = lt_components_exp
+                                         is_sub_components = lt_sub_components ).
+    rs_properties-events = get_events( is_components = lt_components_exp
+                                       is_sub_components = lt_sub_components ).
+    rs_properties-types = get_types( lt_components_exp ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_attributes.
+    DATA:
+      lo_component TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+    FIELD-SYMBOLS <lo_attribute> TYPE ty_component.
+ 
+    LOOP AT is_components ASSIGNING <lo_attribute> WHERE cmptype = seoo_cmptype_attribute AND descript IS NOT INITIAL.
+      lo_component-name = <lo_attribute>-cmpname.
+      lo_component-description = <lo_attribute>-descript.
+      INSERT lo_component INTO TABLE rs_result.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD get_methods.
+    DATA:
+      lo_method    TYPE zif_abapgit_aff_oo_types_v1=>ty_method,
+      lo_exception TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description,
+      lo_parameter TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+ 
+    FIELD-SYMBOLS <ls_sub_component> TYPE ty_sub_component.
+    FIELD-SYMBOLS <ls_component> TYPE ty_component.
+ 
+    LOOP AT is_components ASSIGNING <ls_component> WHERE cmptype = seoo_cmptype_method.
+      lo_method-name = <ls_component>-cmpname.
+      lo_method-description = <ls_component>-descript.
+ 
+      LOOP AT is_sub_components ASSIGNING <ls_sub_component> WHERE cmpname = <ls_component>-cmpname.
+        CASE <ls_sub_component>-scotype.
+          WHEN seos_scotype_parameter.
+            lo_parameter-name = <ls_sub_component>-sconame.
+            lo_parameter-description = <ls_sub_component>-descript.
+            INSERT lo_parameter INTO TABLE lo_method-parameters.
+          WHEN seos_scotype_exception.
+            lo_exception-name = <ls_sub_component>-sconame.
+            lo_exception-description = <ls_sub_component>-descript.
+            INSERT lo_exception INTO TABLE lo_method-exceptions.
+        ENDCASE.
+      ENDLOOP.
+ 
+      IF lo_method-description IS NOT INITIAL
+          OR lo_method-exceptions IS NOT INITIAL
+          OR lo_method-parameters IS NOT INITIAL.
+        INSERT lo_method INTO TABLE rs_result.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD get_types.
+    DATA:
+        lo_type TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+    FIELD-SYMBOLS: <ls_types> TYPE ty_component.
+ 
+    LOOP AT is_components ASSIGNING <ls_types>
+        WHERE cmptype = seoo_cmptype_type AND descript IS NOT INITIAL.
+      lo_type-name = <ls_types>-cmpname.
+      lo_type-description = <ls_types>-descript.
+      INSERT lo_type INTO TABLE rs_result.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+  METHOD get_events.
+    DATA:
+      lo_parameter TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description,
+      lo_event     TYPE zif_abapgit_aff_oo_types_v1=>ty_event.
+    FIELD-SYMBOLS <ls_event> TYPE ty_component.
+    FIELD-SYMBOLS <ls_sub_component> TYPE ty_sub_component.
+ 
+    LOOP AT is_components ASSIGNING <ls_event> WHERE cmptype = seoo_cmptype_event.
+      lo_event-name = <ls_event>-cmpname.
+      lo_event-description = <ls_event>-descript.
+ 
+      LOOP AT is_sub_components ASSIGNING <ls_sub_component> WHERE cmpname = <ls_event>-cmpname.
+        lo_parameter-name = <ls_sub_component>-sconame.
+        lo_parameter-description = <ls_sub_component>-descript.
+        INSERT lo_parameter INTO TABLE lo_event-parameters.
+      ENDLOOP.
+ 
+      IF lo_event-description IS NOT INITIAL OR lo_event-parameters IS NOT INITIAL.
+        INSERT lo_event INTO TABLE rs_result.
+      ENDIF.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_attributes.
+    DATA:
+      lo_attribute TYPE seocompotx.
+    FIELD-SYMBOLS: <ls_attribute> TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+ 
+    LOOP AT is_properties-attributes ASSIGNING <ls_attribute>.
+      lo_attribute-clsname  = iv_clif_name.
+      lo_attribute-cmpname  = <ls_attribute>-name.
+      lo_attribute-langu    = iv_language.
+      lo_attribute-descript = <ls_attribute>-description.
+      MODIFY seocompotx FROM lo_attribute.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_methods.
+    DATA:
+      lo_method           TYPE seocompotx,
+      lo_method_exception TYPE seosubcotx,
+      lo_method_parameter TYPE seosubcotx.
+    FIELD-SYMBOLS: <ls_method>    TYPE zif_abapgit_aff_oo_types_v1=>ty_method,
+                   <ls_parameter> TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description,
+                   <ls_exception> TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+ 
+    LOOP AT is_properties-methods ASSIGNING <ls_method>.
+      lo_method-clsname  = iv_clif_name.
+      lo_method-cmpname  = <ls_method>-name.
+      lo_method-langu    = iv_language.
+      lo_method-descript = <ls_method>-description.
+      MODIFY seocompotx FROM lo_method.
+ 
+      LOOP AT <ls_method>-parameters ASSIGNING <ls_parameter>.
+        lo_method_parameter-clsname  = iv_clif_name.
+        lo_method_parameter-cmpname  = <ls_method>-name.
+        lo_method_parameter-sconame  = <ls_parameter>-name.
+        lo_method_parameter-langu    = iv_language.
+        lo_method_parameter-descript = <ls_parameter>-description.
+        MODIFY seosubcotx FROM lo_method_parameter.
+      ENDLOOP.
+ 
+      LOOP AT <ls_method>-exceptions ASSIGNING <ls_exception>.
+        lo_method_exception-clsname  = iv_clif_name.
+        lo_method_exception-cmpname  = <ls_method>-name.
+        lo_method_exception-sconame  = <ls_exception>-name.
+        lo_method_exception-langu    = iv_language.
+        lo_method_exception-descript = <ls_exception>-description.
+        MODIFY seosubcotx FROM lo_method_exception.
+      ENDLOOP.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_events.
+    DATA:
+      lo_event_parameter TYPE seosubcotx,
+      lo_event           TYPE seocompotx.
+    FIELD-SYMBOLS: <ls_event>     TYPE zif_abapgit_aff_oo_types_v1=>ty_event,
+                   <ls_parameter> TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+ 
+    LOOP AT is_properties-events ASSIGNING <ls_event>.
+      lo_event-clsname  = iv_clif_name.
+      lo_event-cmpname  = <ls_event>-name.
+      lo_event-langu    = iv_language.
+      lo_event-descript = <ls_event>-description.
+      MODIFY seocompotx FROM lo_event.
+ 
+      LOOP AT <ls_event>-parameters ASSIGNING <ls_parameter>.
+        lo_event_parameter-clsname  = iv_clif_name.
+        lo_event_parameter-cmpname  = <ls_event>-name.
+        lo_event_parameter-sconame  = <ls_parameter>-name.
+        lo_event_parameter-langu    = iv_language.
+        lo_event_parameter-descript = <ls_parameter>-description.
+        MODIFY seosubcotx FROM lo_event_parameter.
+      ENDLOOP.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_types.
+    DATA:
+      lo_type TYPE seocompotx.
+    FIELD-SYMBOLS: <ls_type> TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+ 
+    LOOP AT is_properties-types ASSIGNING <ls_type>.
+      lo_type-clsname  = iv_clif_name.
+      lo_type-cmpname  = <ls_type>-name.
+      lo_type-langu    = iv_language.
+      lo_type-descript = <ls_type>-description.
+      MODIFY seocompotx FROM lo_type.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_descriptions_compo_subco.
+    set_attributes( is_properties = is_properties
+                    iv_clif_name = iv_clif_name
+                    iv_language = iv_language ).
+    set_methods( is_properties = is_properties
+                 iv_clif_name = iv_clif_name
+                 iv_language = iv_language ).
+    set_events( is_properties = is_properties
+                iv_clif_name = iv_clif_name
+                iv_language = iv_language ).
+    set_types( is_properties = is_properties
+               iv_clif_name = iv_clif_name
+               iv_language = iv_language ).
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_aff_type_mapping DEFINITION.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_aff_type_mapping.
+  PRIVATE SECTION.
+    METHODS set_abapgit_descriptions
+      IMPORTING is_clsname          TYPE seoclsname
+                is_intf_aff         TYPE zif_abapgit_aff_intf_v1=>ty_main
+      EXPORTING et_descriptions     TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt
+                et_descriptions_sub TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt.
+ENDCLASS.
+ 
+CLASS lcl_aff_type_mapping IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_aff_type_mapping~to_aff.
+    DATA:
+      ls_data_abapgit TYPE zcl_abapgit_object_intf=>ty_intf,
+      ls_data_aff     TYPE zif_abapgit_aff_intf_v1=>ty_main.
+ 
+    ls_data_abapgit = iv_data.
+ 
+    ls_data_aff-format_version = '1'.
+ 
+    " get header
+    ls_data_aff-header-description = ls_data_abapgit-vseointerf-descript.
+    ls_data_aff-header-abap_language_version = ls_data_abapgit-vseointerf-unicode.
+    ls_data_aff-header-original_language = ls_data_abapgit-vseointerf-langu.
+ 
+    " get category and proxy
+    ls_data_aff-category = ls_data_abapgit-vseointerf-category.
+    ls_data_aff-proxy = ls_data_abapgit-vseointerf-clsproxy.
+ 
+    " get descriptions
+    ls_data_aff-descriptions = lcl_aff_helper=>get_descriptions_compo_subco(
+                              iv_language  = ls_data_aff-header-original_language
+                              iv_clif_name = ls_data_abapgit-vseointerf-clsname ).
+ 
+    es_data = ls_data_aff.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_aff_type_mapping~to_abapgit.
+    DATA:
+      ls_data_abapgit TYPE zcl_abapgit_object_intf=>ty_intf,
+      ls_data_aff     TYPE zif_abapgit_aff_intf_v1=>ty_main,
+      lv_classname    TYPE seoclsname.
+
+
+    ls_data_aff = iv_data.
+
+    lv_classname = iv_object_name.
+
+    set_abapgit_descriptions( EXPORTING is_clsname          = lv_classname
+                                        is_intf_aff         = ls_data_aff
+                              IMPORTING et_descriptions     = ls_data_abapgit-description
+                                        et_descriptions_sub = ls_data_abapgit-description_sub ).
+
+    ls_data_abapgit-vseointerf-clsname = iv_object_name.
+    ls_data_abapgit-vseointerf-descript = ls_data_aff-header-description.
+    ls_data_abapgit-vseointerf-category = ls_data_aff-category.
+    ls_data_abapgit-vseointerf-unicode  = ls_data_aff-header-abap_language_version.
+    ls_data_abapgit-vseointerf-langu    = ls_data_aff-header-original_language.
+    ls_data_abapgit-vseointerf-clsproxy = ls_data_aff-proxy.
+    ls_data_abapgit-vseointerf-exposure = seoc_exposure_public.
+    ls_data_abapgit-vseointerf-state    = seoc_state_implemented.
+
+    es_data = ls_data_abapgit.
+
+  ENDMETHOD.
+ 
+  METHOD set_abapgit_descriptions.
+
+    DATA ls_description       TYPE seocompotx.
+    DATA ls_description_subco TYPE seosubcotx.
+    FIELD-SYMBOLS <ls_description>      TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description.
+    FIELD-SYMBOLS <ls_meth_description> TYPE zif_abapgit_aff_oo_types_v1=>ty_method.
+    FIELD-SYMBOLS <ls_evt_description>  TYPE zif_abapgit_aff_oo_types_v1=>ty_event.
+
+
+    LOOP AT is_intf_aff-descriptions-types ASSIGNING <ls_description>.
+      ls_description-clsname  = is_clsname.
+      ls_description-cmpname  = <ls_description>-name.
+      ls_description-langu    = is_intf_aff-header-original_language.
+      ls_description-descript = <ls_description>-description.
+      APPEND ls_description TO et_descriptions.
+    ENDLOOP.
+
+    LOOP AT is_intf_aff-descriptions-attributes ASSIGNING <ls_description>.
+      ls_description-clsname  = is_clsname.
+      ls_description-cmpname  = <ls_description>-name.
+      ls_description-langu    = is_intf_aff-header-original_language.
+      ls_description-descript = <ls_description>-description.
+      APPEND ls_description TO et_descriptions.
+    ENDLOOP.
+
+    LOOP AT is_intf_aff-descriptions-methods ASSIGNING <ls_meth_description>.
+      ls_description-clsname  = is_clsname.
+      ls_description-cmpname  = <ls_meth_description>-name.
+      ls_description-langu    = is_intf_aff-header-original_language.
+      ls_description-descript = <ls_meth_description>-description.
+      APPEND ls_description TO et_descriptions.
+
+      LOOP AT <ls_meth_description>-parameters ASSIGNING <ls_description>.
+        ls_description_subco-clsname  = ls_description-clsname.
+        ls_description_subco-cmpname  = ls_description-cmpname.
+        ls_description_subco-langu    = ls_description-langu.
+        ls_description_subco-sconame  = <ls_description>-name.
+        ls_description_subco-descript = <ls_description>-description.
+        APPEND ls_description_subco TO et_descriptions_sub.
+      ENDLOOP.
+
+      LOOP AT <ls_meth_description>-exceptions ASSIGNING <ls_description>.
+        ls_description_subco-clsname  = ls_description-clsname.
+        ls_description_subco-cmpname  = ls_description-cmpname.
+        ls_description_subco-langu    = ls_description-langu.
+        ls_description_subco-sconame  = <ls_description>-name.
+        ls_description_subco-descript = <ls_description>-description.
+        APPEND ls_description_subco TO et_descriptions_sub.
+      ENDLOOP.
+    ENDLOOP.
+
+    LOOP AT is_intf_aff-descriptions-events ASSIGNING <ls_evt_description>.
+      ls_description-clsname  = is_clsname.
+      ls_description-cmpname  = <ls_evt_description>-name.
+      ls_description-langu    = is_intf_aff-header-original_language.
+      ls_description-descript = <ls_evt_description>-description.
+      APPEND ls_description TO et_descriptions.
+
+      LOOP AT <ls_evt_description>-parameters ASSIGNING <ls_description>.
+        ls_description_subco-clsname  = ls_description-clsname.
+        ls_description_subco-cmpname  = ls_description-cmpname.
+        ls_description_subco-langu    = ls_description-langu.
+        ls_description_subco-sconame  = <ls_description>-name.
+        ls_description_subco-descript = <ls_description>-description.
+        APPEND ls_description_subco TO et_descriptions_sub.
+      ENDLOOP.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+CLASS lcl_aff_metadata_handler DEFINITION.
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS serialize
+      IMPORTING is_intf          TYPE zcl_abapgit_object_intf=>ty_intf
+      RETURNING VALUE(rv_result) TYPE xstring
+      RAISING   zcx_abapgit_exception.
+    CLASS-METHODS deserialize
+      IMPORTING iv_data          TYPE xstring
+      RETURNING VALUE(rv_result) TYPE zif_abapgit_aff_intf_v1=>ty_main
+      RAISING   zcx_abapgit_exception.
+  PRIVATE SECTION.
+    CLASS-METHODS:
+      "! For serialization
+      "! @parameter rt_result | Map/table that associates ABAP values to JSON values (enums)
+      get_mappings
+        RETURNING VALUE(rt_result) TYPE zcl_abapgit_json_handler=>ty_enum_mappings,
+      "! For serialization
+      "! @parameter rt_result | Paths that will not be serialized (depending on value)
+      get_paths_to_skip
+        RETURNING VALUE(rt_result) TYPE zcl_abapgit_json_handler=>ty_skip_paths.
+ENDCLASS.
+ 
+CLASS lcl_aff_metadata_handler IMPLEMENTATION.
+ 
+  METHOD serialize.
+    DATA:
+      ls_data_aff      TYPE zif_abapgit_aff_intf_v1=>ty_main,
+      lx_exception     TYPE REF TO cx_root,
+      lo_aff_handler   TYPE REF TO zcl_abapgit_json_handler,
+      lo_aff_mapper    TYPE REF TO zif_abapgit_aff_type_mapping,
+      lt_enum_mappings TYPE zcl_abapgit_json_handler=>ty_enum_mappings,
+      lt_paths_to_skip TYPE zcl_abapgit_json_handler=>ty_skip_paths.
+ 
+ 
+    CREATE OBJECT lo_aff_mapper TYPE lcl_aff_type_mapping.
+    lo_aff_mapper->to_aff( EXPORTING iv_data = is_intf
+                           IMPORTING es_data = ls_data_aff ).
+ 
+    lt_enum_mappings = get_mappings( ).
+    lt_paths_to_skip = get_paths_to_skip( ).
+ 
+    CREATE OBJECT lo_aff_handler.
+    TRY.
+        rv_result = lo_aff_handler->serialize( iv_data          = ls_data_aff
+                                               iv_enum_mappings = lt_enum_mappings
+                                               iv_skip_paths    = lt_paths_to_skip ).
+      CATCH cx_root INTO lx_exception.
+        zcx_abapgit_exception=>raise_with_text( lx_exception ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_mappings.
+    DATA:
+      ls_category_mapping   TYPE zcl_abapgit_json_handler=>ty_enum_mapping,
+      ls_json_abap_mapping  TYPE zcl_abapgit_json_handler=>ty_json_abap_mapping,
+      lt_json_abap_mappings TYPE zcl_abapgit_json_handler=>ty_json_abap_mappings.
+ 
+    ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-general.
+    ls_json_abap_mapping-json = 'standard'.
+    APPEND ls_json_abap_mapping TO lt_json_abap_mappings.
+    ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-classic_badi.
+    ls_json_abap_mapping-json = 'classicBadi'.
+    APPEND ls_json_abap_mapping TO lt_json_abap_mappings.
+    ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-business_static_components.
+    ls_json_abap_mapping-json = 'businessStaticComponents'.
+    APPEND ls_json_abap_mapping TO lt_json_abap_mappings.
+    ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-db_procedure_proxy.
+    ls_json_abap_mapping-json = 'dbProcedureProxy'.
+    APPEND ls_json_abap_mapping TO lt_json_abap_mappings.
+    ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-web_dynpro_runtime.
+    ls_json_abap_mapping-json = 'webDynproRuntime'.
+    APPEND ls_json_abap_mapping TO lt_json_abap_mappings.
+    ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-enterprise_service.
+    ls_json_abap_mapping-json = 'enterpriseService'.
+    APPEND ls_json_abap_mapping TO lt_json_abap_mappings.
+ 
+    ls_category_mapping-path = '/category'.
+    ls_category_mapping-mappings = lt_json_abap_mappings.
+ 
+    APPEND ls_category_mapping TO rt_result.
+  ENDMETHOD.
+ 
+  METHOD get_paths_to_skip.
+    DATA:
+      ls_path_to_skipp TYPE zcl_abapgit_json_handler=>ty_path_value_pair.
+ 
+    ls_path_to_skipp-path  = '/category'.
+    ls_path_to_skipp-value = 'standard'.
+ 
+    APPEND ls_path_to_skipp TO rt_result.
+  ENDMETHOD.
+ 
+  METHOD deserialize.
+    DATA:
+      lo_ajson                      TYPE REF TO zcl_abapgit_json_handler,
+      lx_exception                  TYPE REF TO cx_static_check,
+      lt_enum_mappings              TYPE zcl_abapgit_json_handler=>ty_enum_mappings,
+      lt_default_abap_langu_version TYPE zcl_abapgit_json_handler=>ty_path_value_pair,
+      lt_values_for_initial         TYPE zcl_abapgit_json_handler=>ty_skip_paths.
+ 
+    lt_values_for_initial = get_paths_to_skip( ).
+ 
+    lt_default_abap_langu_version-path  = '/header/abap_language_version'.
+    lt_default_abap_langu_version-value = 'standard'.
+    APPEND lt_default_abap_langu_version TO lt_values_for_initial.
+ 
+    lt_enum_mappings = get_mappings( ).
+ 
+ 
+    CREATE OBJECT lo_ajson.
+    TRY.
+        lo_ajson->deserialize(
+           EXPORTING
+             iv_content = iv_data
+             iv_defaults = lt_values_for_initial
+             iv_enum_mappings = lt_enum_mappings
+           IMPORTING
+             ev_data    = rv_result ).
+      CATCH cx_static_check INTO lx_exception.
+        zcx_abapgit_exception=>raise_with_text( lx_exception ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_object_intf.clas.testclasses.abap.html b/src/objects/zcl_abapgit_object_intf.clas.testclasses.abap.html new file mode 100644 index 00000000000..f378e3eb344 --- /dev/null +++ b/src/objects/zcl_abapgit_object_intf.clas.testclasses.abap.html @@ -0,0 +1,1552 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_object_intf.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_object_intf.clas.testclasses.abap

+
+ +
+ 98.77% + Statements + 483/489 +
+ + +
+ 100% + Branches + 12/12 +
+ + +
+ 66.66% + Functions + 12/18 +
+ + +
+ 98.77% + Lines + 483/489 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +4901x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_unit_test DEFINITION DEFERRED.
+CLASS zcl_abapgit_object_intf DEFINITION LOCAL FRIENDS ltcl_unit_test.
+ 
+CLASS lth_oo_object_fnc DEFINITION FINAL FOR TESTING.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_oo_object_fnc.
+ 
+    DATA:
+      mv_create_package     TYPE devclass,
+      ms_create_vseointerf  TYPE vseointerf,
+      ms_deserialize_key    TYPE seoclskey,
+      mt_deserialize_source TYPE zif_abapgit_definitions=>ty_string_tt,
+      ms_descriptions_key   TYPE seoclskey,
+      mt_descriptions       TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt,
+      ms_activation_item    TYPE zif_abapgit_definitions=>ty_item,
+      mt_docu_lines         TYPE tlinetab,
+      mv_docu_id            TYPE dokhl-id,
+      mv_docu_object_name   TYPE dokhl-object,
+      mv_docu_langu         TYPE spras.
+ENDCLASS.
+ 
+CLASS lth_oo_object_fnc IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_oo_object_fnc~add_to_activation_list.
+    ms_activation_item = is_item.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~create.
+    mv_create_package = iv_package.
+    ms_create_vseointerf = cg_properties.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~create_documentation.
+    mt_docu_lines = it_lines.
+    mv_docu_id = iv_id.
+    mv_docu_object_name = iv_object_name.
+    mv_docu_langu =   iv_language.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~create_sotr.
+  ENDMETHOD.
+  METHOD zif_abapgit_oo_object_fnc~delete.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~delete_documentation.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~deserialize_source.
+    ms_deserialize_key = is_key.
+    mt_deserialize_source = it_source.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~exists.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~generate_locals.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_class_properties.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_includes.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_interface_properties.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~get_skip_test_classes.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~insert_text_pool.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_attributes.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_descriptions.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_descriptions_sub.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_documentation.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_sotr.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_superclass.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~read_text_pool.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~serialize_abap.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~update_descriptions.
+    ms_descriptions_key = is_key.
+    mt_descriptions = it_descriptions.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_oo_object_fnc~update_descriptions_sub.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_unit_test DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_cut        TYPE REF TO zif_abapgit_object,
+      mo_log        TYPE REF TO zcl_abapgit_log,
+      mo_object_fnc TYPE REF TO lth_oo_object_fnc,
+      ms_item       TYPE zif_abapgit_definitions=>ty_item.
+ 
+    METHODS:
+      setup,
+ 
+      get_xml
+        RETURNING VALUE(rv_xml) TYPE string,
+      get_source
+        RETURNING VALUE(rt_source) TYPE rswsourcet,
+ 
+      deserializes FOR TESTING RAISING cx_static_check.
+ENDCLASS.
+ 
+CLASS ltcl_unit_test IMPLEMENTATION.
+ 
+  METHOD setup.
+    DATA lo_cut TYPE REF TO zcl_abapgit_object_intf.
+ 
+    ms_item-obj_name = 'ZIF_ABAPGIT_TEST_INTF'.
+    ms_item-obj_type = 'INTF'.
+ 
+    CREATE OBJECT lo_cut
+      EXPORTING
+        is_item     = ms_item
+        iv_language = 'E'.
+ 
+    CREATE OBJECT lo_cut->zif_abapgit_object~mo_files
+      EXPORTING
+        is_item = ms_item.
+ 
+    CREATE OBJECT mo_log.
+ 
+    CREATE OBJECT mo_object_fnc.
+    lo_cut->mi_object_oriented_object_fct  = mo_object_fnc.
+ 
+    mo_cut = lo_cut.
+ 
+  ENDMETHOD.
+ 
+  METHOD deserializes.
+    DATA lo_xmlin TYPE REF TO zcl_abapgit_xml_input.
+    DATA ls_expected_vseointerf TYPE vseointerf.
+    DATA ls_expected_clskey TYPE seoclskey.
+    DATA ls_expected_description TYPE seocompotx.
+    DATA lt_expected_descriptions TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt.
+    DATA ls_expected_docu_line TYPE tline.
+    DATA lt_expected_docu_lines TYPE tlinetab.
+ 
+    CREATE OBJECT lo_xmlin TYPE zcl_abapgit_xml_input
+      EXPORTING
+        iv_xml = get_xml( ).
+ 
+    mo_cut->mo_files->add_abap( get_source( ) ).
+ 
+    mo_cut->deserialize(
+      iv_package   = 'MY_PACKAGE'
+      io_xml       = lo_xmlin
+      iv_step      = zif_abapgit_object=>gc_step_id-abap
+      ii_log       = mo_log
+      iv_transport = 'XXX12345678' ).
+ 
+ 
+    cl_abap_unit_assert=>assert_equals( exp = 'MY_PACKAGE'
+                                        act = mo_object_fnc->mv_create_package ).
+ 
+    ls_expected_vseointerf-clsname = 'ZIF_ABAPGIT_TEST_INTF'.
+    ls_expected_vseointerf-langu = 'E'.
+    ls_expected_vseointerf-descript = 'Test interface for abap git'.
+    ls_expected_vseointerf-exposure = '2'.
+    ls_expected_vseointerf-state = '1'.
+    ls_expected_vseointerf-unicode = 'X'.
+    cl_abap_unit_assert=>assert_equals( exp = ls_expected_vseointerf
+                                        act = mo_object_fnc->ms_create_vseointerf ).
+ 
+    ls_expected_clskey-clsname = 'ZIF_ABAPGIT_TEST_INTF'.
+    cl_abap_unit_assert=>assert_equals( exp = ls_expected_clskey
+                                        act = mo_object_fnc->ms_deserialize_key ).
+    cl_abap_unit_assert=>assert_equals( exp = ls_expected_clskey
+                                        act = mo_object_fnc->ms_deserialize_key ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = ls_expected_clskey
+                                        act = mo_object_fnc->ms_descriptions_key ).
+    ls_expected_description-clsname = 'ZIF_ABAPGIT_TEST_INTF'.
+    ls_expected_description-cmpname = 'ONE_METHOD'.
+    ls_expected_description-langu = 'E'.
+    ls_expected_description-descript = 'Method One, one, one, one, ...'.
+    APPEND ls_expected_description TO lt_expected_descriptions.
+    cl_abap_unit_assert=>assert_equals( exp = lt_expected_descriptions
+                                        act = mo_object_fnc->mt_descriptions ).
+    cl_abap_unit_assert=>assert_equals( exp = ms_item
+                                        act = mo_object_fnc->ms_activation_item ).
+ 
+    ls_expected_docu_line-tdformat = 'U1'.
+    ls_expected_docu_line-tdline = '&MEANING&'.
+    APPEND ls_expected_docu_line TO lt_expected_docu_lines.
+    ls_expected_docu_line-tdformat = 'AS'.
+    ls_expected_docu_line-tdline = 'Interface for abap git unit tests.'.
+    APPEND ls_expected_docu_line TO lt_expected_docu_lines.
+    cl_abap_unit_assert=>assert_equals( exp = lt_expected_docu_lines
+                                        act = mo_object_fnc->mt_docu_lines ).
+    cl_abap_unit_assert=>assert_equals( exp = 'IF'
+                                        act = mo_object_fnc->mv_docu_id ).
+    cl_abap_unit_assert=>assert_equals( exp = 'E'
+                                        act = mo_object_fnc->mv_docu_langu ).
+    cl_abap_unit_assert=>assert_equals( exp = 'ZIF_ABAPGIT_TEST_INTF'
+                                        act = mo_object_fnc->mv_docu_object_name ).
+  ENDMETHOD.
+ 
+  METHOD get_xml.
+    rv_xml =
+    '<?xml version="1.0" encoding="UTF-8"?><abapGit version="v1.0.0">' &&
+    '  <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">' &&
+    '    <asx:values>' &&
+    '      <VSEOINTERF>' &&
+    '        <CLSNAME>ZIF_ABAPGIT_TEST_INTF</CLSNAME>' &&
+    '        <LANGU>E</LANGU>' &&
+    '        <DESCRIPT>Test interface for abap git</DESCRIPT>' &&
+    '        <EXPOSURE>2</EXPOSURE>' &&
+    '        <STATE>1</STATE>' &&
+    '        <UNICODE>X</UNICODE>' &&
+    '      </VSEOINTERF>' &&
+    '      <DESCRIPTIONS>' &&
+    '        <SEOCOMPOTX>' &&
+    '          <CLSNAME>ZIF_ABAPGIT_TEST_INTF</CLSNAME>' &&
+    '          <CMPNAME>ONE_METHOD</CMPNAME>' &&
+    '          <LANGU>E</LANGU>' &&
+    '          <DESCRIPT>Method One, one, one, one, ...</DESCRIPT>' &&
+    '        </SEOCOMPOTX>' &&
+    '      </DESCRIPTIONS>' &&
+    '      <LINES>' &&
+    '        <TLINE>' &&
+    '          <TDFORMAT>U1</TDFORMAT>' &&
+    '          <TDLINE>&amp;MEANING&amp;</TDLINE>' &&
+    '        </TLINE>' &&
+    '        <TLINE>' &&
+    '          <TDFORMAT>AS</TDFORMAT>' &&
+    '          <TDLINE>Interface for abap git unit tests.</TDLINE>' &&
+    '        </TLINE>' &&
+    '      </LINES>' &&
+    '    </asx:values>' &&
+    '  </asx:abap>' &&
+    '</abapGit>'.
+  ENDMETHOD.
+ 
+  METHOD get_source.
+    APPEND 'interface zif_abapgit_test_intf' TO rt_source.
+    APPEND '  public.' TO rt_source.
+    APPEND '  methods:' TO rt_source.
+    APPEND '    one_method' TO rt_source.
+    APPEND '      returning value(rv_value) type string.' TO rt_source.
+    APPEND '' TO rt_source.
+    APPEND 'endinterface.' TO rt_source.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_aff_metadata DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+  PRIVATE SECTION.
+    METHODS:
+      deserialize_defaults FOR TESTING RAISING cx_static_check,
+      deserialize_non_defaults FOR TESTING RAISING cx_static_check,
+      serialize_non_default FOR TESTING RAISING cx_static_check,
+      serialize_default FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_aff_metadata IMPLEMENTATION.
+ 
+  METHOD serialize_default.
+    DATA:
+      lv_expected        TYPE string,
+      lv_actual          TYPE string,
+      lv_serialized_data TYPE xstring,
+      lv_is_equal        TYPE abap_bool,
+      ls_intf            TYPE zcl_abapgit_object_intf=>ty_intf.
+ 
+    ls_intf-vseointerf-unicode = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
+    ls_intf-vseointerf-descript = `abc`.
+    ls_intf-vseointerf-langu = `E`.
+    ls_intf-vseointerf-category = zif_abapgit_aff_intf_v1=>co_category-general.
+    ls_intf-vseointerf-clsproxy = abap_false.
+ 
+    lv_serialized_data = lcl_aff_metadata_handler=>serialize( ls_intf ).
+ 
+    lv_expected =
+      `{` && cl_abap_char_utilities=>newline &&
+      `  "formatVersion": "1",` && cl_abap_char_utilities=>newline &&
+      `  "header": {` && cl_abap_char_utilities=>newline &&
+      `    "description": "abc",` && cl_abap_char_utilities=>newline &&
+      `    "originalLanguage": "en"` && cl_abap_char_utilities=>newline &&
+      `  }` && cl_abap_char_utilities=>newline &&
+      `}` && cl_abap_char_utilities=>newline.
+ 
+    lv_actual = cl_abap_codepage=>convert_from( lv_serialized_data ).
+ 
+    lv_is_equal = zcl_abapgit_ajson_utilities=>new( )->is_equal(
+      iv_json_a = lv_actual
+      iv_json_b = lv_expected ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_is_equal
+      exp = abap_true ).
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_non_default.
+    DATA:
+      lv_expected        TYPE string,
+      lv_actual          TYPE string,
+      lv_serialized_data TYPE xstring,
+      lv_is_equal        TYPE abap_bool,
+      ls_intf            TYPE zcl_abapgit_object_intf=>ty_intf.
+ 
+    ls_intf-vseointerf-unicode = zif_abapgit_aff_types_v1=>co_abap_language_version_src-key_user.
+    ls_intf-vseointerf-descript = `abc`.
+    ls_intf-vseointerf-langu = `F`.
+    ls_intf-vseointerf-category = zif_abapgit_aff_intf_v1=>co_category-db_procedure_proxy.
+    ls_intf-vseointerf-clsproxy = abap_true.
+ 
+    lv_serialized_data = lcl_aff_metadata_handler=>serialize( ls_intf ).
+ 
+    lv_expected =
+      `{` && cl_abap_char_utilities=>newline &&
+      `  "formatVersion": "1",` && cl_abap_char_utilities=>newline &&
+      `  "header": {` && cl_abap_char_utilities=>newline &&
+      `    "description": "abc",` && cl_abap_char_utilities=>newline &&
+      `    "originalLanguage": "fr",` && cl_abap_char_utilities=>newline &&
+      `    "abapLanguageVersion": "keyUser"` && cl_abap_char_utilities=>newline &&
+      `  },` && cl_abap_char_utilities=>newline &&
+      `  "category": "dbProcedureProxy",` && cl_abap_char_utilities=>newline &&
+      `  "proxy": true` && cl_abap_char_utilities=>newline &&
+      `}` && cl_abap_char_utilities=>newline.
+ 
+    lv_actual = cl_abap_codepage=>convert_from( lv_serialized_data ).
+ 
+    lv_is_equal = zcl_abapgit_ajson_utilities=>new( )->is_equal(
+      iv_json_a = lv_actual
+      iv_json_b = lv_expected ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_is_equal
+      exp = abap_true ).
+  ENDMETHOD.
+ 
+  METHOD deserialize_non_defaults.
+    DATA:
+      lv_source                  TYPE string,
+      lv_source_xstring          TYPE xstring,
+      ls_description_type        TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description,
+      ls_description_attr        TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description,
+      ls_description_meth_param  TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description,
+      ls_description_meth_params TYPE zif_abapgit_aff_oo_types_v1=>ty_component_descriptions,
+      ls_description_even        TYPE zif_abapgit_aff_oo_types_v1=>ty_event,
+      ls_description_meth        TYPE zif_abapgit_aff_oo_types_v1=>ty_method,
+      ls_actual                  TYPE zif_abapgit_aff_intf_v1=>ty_main,
+      ls_expected                TYPE zif_abapgit_aff_intf_v1=>ty_main.
+ 
+ 
+    ls_expected-format_version = `1`.
+    ls_expected-header-description = 'abc'.
+    ls_expected-header-original_language = 'F'.
+    ls_expected-header-abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_src-key_user.
+    ls_expected-category = zif_abapgit_aff_intf_v1=>co_category-db_procedure_proxy.
+    ls_expected-proxy = abap_true.
+ 
+    ls_description_type-name = 'TY_EXAMPLE_TYPE'.
+    ls_description_type-description = 'This is an example type'.
+    APPEND ls_description_type TO ls_expected-descriptions-types.
+ 
+    ls_description_attr-name = 'CO_EXAMPLE_CONSTANT'.
+    ls_description_attr-description = 'This is an example constant'.
+    APPEND ls_description_attr TO ls_expected-descriptions-attributes.
+ 
+    ls_description_even-name = 'EXAMPLE_EVENT'.
+    ls_description_even-description = 'This is an example event'.
+    APPEND ls_description_even TO ls_expected-descriptions-events.
+ 
+    ls_description_meth_param-name = 'I_PARAM'.
+    ls_description_meth_param-description = 'This is an example parameter'.
+    APPEND ls_description_meth_param TO ls_description_meth_params.
+ 
+    ls_description_meth-name = 'EXAMPLE_METHOD'.
+    ls_description_meth-description = 'This is an example method'.
+    ls_description_meth-parameters = ls_description_meth_params.
+    APPEND ls_description_meth TO ls_expected-descriptions-methods.
+ 
+    lv_source =
+      `{` && cl_abap_char_utilities=>newline &&
+      `  "formatVersion": "1",` && cl_abap_char_utilities=>newline &&
+      `  "header": {` && cl_abap_char_utilities=>newline &&
+      `    "description": "abc",` && cl_abap_char_utilities=>newline &&
+      `    "originalLanguage": "fr",` && cl_abap_char_utilities=>newline &&
+      `    "abapLanguageVersion": "keyUser"` && cl_abap_char_utilities=>newline &&
+      `  },` && cl_abap_char_utilities=>newline &&
+      `  "category": "dbProcedureProxy",` && cl_abap_char_utilities=>newline &&
+      `  "proxy": true,` && cl_abap_char_utilities=>newline &&
+      `  "descriptions": {` && cl_abap_char_utilities=>newline &&
+      `    "types": [` && cl_abap_char_utilities=>newline &&
+      `      {` && cl_abap_char_utilities=>newline &&
+      `        "name": "TY_EXAMPLE_TYPE",` && cl_abap_char_utilities=>newline &&
+      `        "description": "This is an example type"` && cl_abap_char_utilities=>newline &&
+      `      }` && cl_abap_char_utilities=>newline &&
+      `    ],` && cl_abap_char_utilities=>newline &&
+      `    "attributes": [` && cl_abap_char_utilities=>newline &&
+      `      {` && cl_abap_char_utilities=>newline &&
+      `        "name": "CO_EXAMPLE_CONSTANT",` && cl_abap_char_utilities=>newline &&
+      `        "description": "This is an example constant"` && cl_abap_char_utilities=>newline &&
+      `      }` && cl_abap_char_utilities=>newline &&
+      `    ],` && cl_abap_char_utilities=>newline &&
+      `    "events": [` && cl_abap_char_utilities=>newline &&
+      `      {` && cl_abap_char_utilities=>newline &&
+      `        "name": "EXAMPLE_EVENT",` && cl_abap_char_utilities=>newline &&
+      `        "description": "This is an example event"` && cl_abap_char_utilities=>newline &&
+      `      }` && cl_abap_char_utilities=>newline &&
+      `    ],` && cl_abap_char_utilities=>newline &&
+      `    "methods": [` && cl_abap_char_utilities=>newline &&
+      `      {` && cl_abap_char_utilities=>newline &&
+      `        "name": "EXAMPLE_METHOD",` && cl_abap_char_utilities=>newline &&
+      `        "description": "This is an example method",` && cl_abap_char_utilities=>newline &&
+      `        "parameters": [` && cl_abap_char_utilities=>newline &&
+      `          {` && cl_abap_char_utilities=>newline &&
+      `            "name": "I_PARAM",` && cl_abap_char_utilities=>newline &&
+      `            "description": "This is an example parameter"` && cl_abap_char_utilities=>newline &&
+      `          }` && cl_abap_char_utilities=>newline &&
+      `        ]` && cl_abap_char_utilities=>newline &&
+      `      }` && cl_abap_char_utilities=>newline &&
+      `    ]` && cl_abap_char_utilities=>newline &&
+      `  }` && cl_abap_char_utilities=>newline &&
+      `}` && cl_abap_char_utilities=>newline.
+ 
+    lv_source_xstring = cl_abap_codepage=>convert_to( lv_source ).
+ 
+    " cut
+    ls_actual = lcl_aff_metadata_handler=>deserialize( lv_source_xstring ).
+ 
+    cl_abap_unit_assert=>assert_equals( act = ls_actual
+                                        exp = ls_expected ).
+  ENDMETHOD.
+ 
+  METHOD deserialize_defaults.
+    DATA:
+      lv_source         TYPE string,
+      lv_source_xstring TYPE xstring,
+      ls_actual         TYPE zif_abapgit_aff_intf_v1=>ty_main,
+      ls_expected       TYPE zif_abapgit_aff_intf_v1=>ty_main.
+ 
+ 
+    ls_expected-format_version = `1`.
+    ls_expected-header-description = 'abc'.
+    ls_expected-header-original_language = 'F'.
+    ls_expected-header-abap_language_version = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
+    ls_expected-category = zif_abapgit_aff_intf_v1=>co_category-general.
+    ls_expected-proxy = abap_false.
+ 
+    lv_source =
+      `{` && cl_abap_char_utilities=>newline &&
+      `  "formatVersion": "1",` && cl_abap_char_utilities=>newline &&
+      `  "header": {` && cl_abap_char_utilities=>newline &&
+      `    "description": "abc",` && cl_abap_char_utilities=>newline &&
+      `    "originalLanguage": "fr"` && cl_abap_char_utilities=>newline &&
+      `  }` && cl_abap_char_utilities=>newline &&
+      `}` && cl_abap_char_utilities=>newline.
+ 
+    lv_source_xstring = cl_abap_codepage=>convert_to( lv_source ).
+ 
+    " cut
+    ls_actual = lcl_aff_metadata_handler=>deserialize( lv_source_xstring ).
+ 
+    cl_abap_unit_assert=>assert_equals( act = ls_actual
+                                        exp = ls_expected ).
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_objects.clas.abap.html b/src/objects/zcl_abapgit_objects.clas.abap.html new file mode 100644 index 00000000000..e0e986b85fd --- /dev/null +++ b/src/objects/zcl_abapgit_objects.clas.abap.html @@ -0,0 +1,3961 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_objects.clas.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_objects.clas.abap

+
+ +
+ 100% + Statements + 1292/1292 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 1292/1292 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +12931x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_objects DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      ty_types_tt TYPE SORTED TABLE OF tadir-object WITH UNIQUE KEY table_line .
+    TYPES:
+      BEGIN OF ty_serialization,
+        files TYPE zif_abapgit_git_definitions=>ty_files_tt,
+        item  TYPE zif_abapgit_definitions=>ty_item,
+      END OF ty_serialization .
+ 
+    CLASS-METHODS serialize
+      IMPORTING
+        !is_item                 TYPE zif_abapgit_definitions=>ty_item
+        !io_i18n_params          TYPE REF TO zcl_abapgit_i18n_params
+      RETURNING
+        VALUE(rs_files_and_item) TYPE ty_serialization
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS deserialize
+      IMPORTING
+        !io_repo                 TYPE REF TO zcl_abapgit_repo
+        !is_checks               TYPE zif_abapgit_definitions=>ty_deserialize_checks
+        !ii_log                  TYPE REF TO zif_abapgit_log
+      RETURNING
+        VALUE(rt_accessed_files) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS deserialize_checks
+      IMPORTING
+        !io_repo         TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS delete
+      IMPORTING
+        !it_tadir  TYPE zif_abapgit_definitions=>ty_tadir_tt
+        !is_checks TYPE zif_abapgit_definitions=>ty_delete_checks OPTIONAL
+        !ii_log    TYPE REF TO zif_abapgit_log OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS jump
+      IMPORTING
+        !is_item        TYPE zif_abapgit_definitions=>ty_item
+        !is_sub_item    TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !iv_filename    TYPE string OPTIONAL
+        !iv_line_number TYPE i OPTIONAL
+        !iv_new_window  TYPE abap_bool DEFAULT abap_true
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS changed_by
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+        !is_sub_item   TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !iv_filename   TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_user) TYPE syuname .
+    CLASS-METHODS is_supported
+      IMPORTING
+        !is_item        TYPE zif_abapgit_definitions=>ty_item
+        !iv_native_only TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_bool)  TYPE abap_bool .
+    CLASS-METHODS is_type_supported
+      IMPORTING
+        !iv_obj_type   TYPE zif_abapgit_definitions=>ty_item-obj_type
+      RETURNING
+        VALUE(rv_bool) TYPE abap_bool .
+    CLASS-METHODS exists
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_bool) TYPE abap_bool .
+    CLASS-METHODS supported_list
+      RETURNING
+        VALUE(rt_types) TYPE ty_types_tt .
+    CLASS-METHODS is_active
+      IMPORTING
+        !is_item         TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_active) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_supported_types,
+        obj_type  TYPE tadir-object,
+        supported TYPE abap_bool,
+      END OF ty_supported_types.
+ 
+    TYPES: ty_supported_types_tt TYPE SORTED TABLE OF ty_supported_types WITH UNIQUE KEY obj_type.
+ 
+    TYPES:
+      BEGIN OF ty_obj_serializer_item,
+        item     TYPE zif_abapgit_definitions=>ty_item,
+        metadata TYPE zif_abapgit_definitions=>ty_metadata,
+      END OF ty_obj_serializer_item .
+    TYPES:
+      ty_obj_serializer_map TYPE SORTED TABLE OF ty_obj_serializer_item WITH UNIQUE KEY item .
+ 
+    CLASS-DATA gt_obj_serializer_map TYPE ty_obj_serializer_map .
+    CLASS-DATA gt_supported_obj_types TYPE ty_supported_types_tt .
+    CLASS-DATA gv_supported_obj_types_loaded TYPE abap_bool .
+ 
+    CLASS-METHODS check_duplicates
+      IMPORTING
+        !it_files TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS class_name
+      IMPORTING
+        !is_item             TYPE zif_abapgit_definitions=>ty_item
+      RETURNING
+        VALUE(rv_class_name) TYPE string .
+    CLASS-METHODS update_package_tree
+      IMPORTING
+        !iv_package TYPE devclass .
+    CLASS-METHODS delete_object
+      IMPORTING
+        !iv_package   TYPE devclass
+        !is_item      TYPE zif_abapgit_definitions=>ty_item
+        !iv_transport TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS compare_remote_to_local
+      IMPORTING
+        !ii_object TYPE REF TO zif_abapgit_object
+        !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !is_result TYPE zif_abapgit_definitions=>ty_result
+        !ii_log    TYPE REF TO zif_abapgit_log
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS deserialize_steps
+      IMPORTING
+        !it_steps     TYPE zif_abapgit_objects=>ty_step_data_tt
+        !ii_log       TYPE REF TO zif_abapgit_log
+        !iv_transport TYPE trkorr
+      CHANGING
+        !ct_files     TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS deserialize_objects
+      IMPORTING
+        !is_step      TYPE zif_abapgit_objects=>ty_step_data
+        !ii_log       TYPE REF TO zif_abapgit_log
+        !iv_transport TYPE trkorr
+      CHANGING
+        !ct_files     TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS check_objects_locked
+      IMPORTING
+        !iv_language TYPE spras
+        !it_items    TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS create_object
+      IMPORTING
+        !is_item        TYPE zif_abapgit_definitions=>ty_item
+        !io_i18n_params TYPE REF TO zcl_abapgit_i18n_params OPTIONAL
+        !is_metadata    TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
+        !iv_native_only TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_obj)   TYPE REF TO zif_abapgit_object
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS map_tadir_to_items
+      IMPORTING
+        !it_tadir       TYPE zif_abapgit_definitions=>ty_tadir_tt
+      RETURNING
+        VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt .
+    CLASS-METHODS map_results_to_items
+      IMPORTING
+        !it_results     TYPE zif_abapgit_definitions=>ty_results_tt
+      RETURNING
+        VALUE(rt_items) TYPE zif_abapgit_definitions=>ty_items_tt .
+    CLASS-METHODS get_deserialize_steps
+      RETURNING
+        VALUE(rt_steps) TYPE zif_abapgit_objects=>ty_step_data_tt .
+    CLASS-METHODS check_main_package
+      IMPORTING
+        !iv_package  TYPE devclass
+        !iv_obj_type TYPE tadir-object
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS change_package_assignments
+      IMPORTING
+        !is_item TYPE zif_abapgit_definitions=>ty_item
+        !ii_log  TYPE REF TO zif_abapgit_log .
+    CLASS-METHODS determine_i18n_params
+      IMPORTING
+        !io_dot                TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_main_language_only TYPE abap_bool
+      RETURNING
+        VALUE(rs_i18n_params)  TYPE zif_abapgit_definitions=>ty_i18n_params
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS get_extra_from_filename
+      IMPORTING
+        !iv_filename    TYPE string
+      RETURNING
+        VALUE(rv_extra) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_objects IMPLEMENTATION.
+ 
+ 
+  METHOD changed_by.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    " For unsupported objects, return empty string
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        li_obj = create_object( is_item ).
+        rv_user = li_obj->changed_by( get_extra_from_filename( iv_filename ) ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+        " Ignore errors
+    ENDTRY.
+ 
+    IF rv_user IS INITIAL.
+      " Eg. ".abapgit.xml" file
+      rv_user = zcl_abapgit_objects_super=>c_user_unknown.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD change_package_assignments.
+ 
+    CALL FUNCTION 'TR_TADIR_INTERFACE'
+      EXPORTING
+        wi_tadir_pgmid    = 'R3TR'
+        wi_tadir_object   = is_item-obj_type
+        wi_tadir_obj_name = is_item-obj_name
+        wi_tadir_devclass = is_item-devclass
+        wi_test_modus     = abap_false
+      EXCEPTIONS
+        OTHERS            = 1.
+    IF sy-subrc = 0.
+      ii_log->add_success( iv_msg  = |Object { is_item-obj_name } assigned to package { is_item-devclass }|
+                           is_item = is_item ).
+    ELSE.
+      ii_log->add_error( iv_msg  = |Package change of object { is_item-obj_name } failed|
+                         is_item = is_item ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_duplicates.
+ 
+    DATA: lt_files          TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lv_path           TYPE string,
+          lv_filename       TYPE string,
+          lt_duplicates     TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+          lv_duplicates     LIKE LINE OF lt_duplicates,
+          lv_all_duplicates TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files.
+ 
+    lt_files = it_files.
+    SORT lt_files BY path ASCENDING filename ASCENDING.
+ 
+    LOOP AT lt_files ASSIGNING <ls_file>.
+      IF lv_path = <ls_file>-path AND lv_filename = <ls_file>-filename.
+        CONCATENATE <ls_file>-path <ls_file>-filename INTO lv_duplicates.
+        APPEND lv_duplicates TO lt_duplicates.
+      ENDIF.
+      lv_path = <ls_file>-path.
+      lv_filename = <ls_file>-filename.
+    ENDLOOP.
+ 
+    IF lt_duplicates IS NOT INITIAL.
+      CONCATENATE LINES OF lt_duplicates INTO lv_all_duplicates SEPARATED BY `, `.
+      zcx_abapgit_exception=>raise( |Duplicates: { lv_all_duplicates }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_main_package.
+ 
+    " check package restrictions, closed package, descriptive or
+    " functional package
+    cl_pak_object_types=>check_object_type(
+      EXPORTING
+        i_working_mode         = 'I'
+        i_package_name         = iv_package
+        i_pgmid                = 'R3TR'
+        i_object_type          = iv_obj_type
+      EXCEPTIONS
+        wrong_object_type      = 1
+        package_not_extensible = 2
+        package_not_loaded     = 3
+        OTHERS                 = 4 ).
+    CASE sy-subrc.
+      WHEN 0.
+        RETURN.
+      WHEN 2.
+        zcx_abapgit_exception=>raise( |Object type { iv_obj_type } not allowed for package { iv_package }| ).
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise_t100(  ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_objects_locked.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    FIELD-SYMBOLS: <ls_item> LIKE LINE OF it_items.
+ 
+    LOOP AT it_items ASSIGNING <ls_item>.
+ 
+      " You should remember that we ignore not supported objects here,
+      " because otherwise the process aborts which is not desired
+      IF is_type_supported( <ls_item>-obj_type ) = abap_false.
+        CONTINUE.
+      ENDIF.
+ 
+      li_obj = create_object( <ls_item> ).
+ 
+      IF li_obj->is_locked( ) = abap_true.
+        zcx_abapgit_exception=>raise( |Object { <ls_item>-obj_type } { <ls_item>-obj_name } |
+                                   && |is locked. Action not possible.| ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_name.
+ 
+    CONCATENATE 'ZCL_ABAPGIT_OBJECT_' is_item-obj_type INTO rv_class_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD compare_remote_to_local.
+* this method is used for comparing local with remote objects
+* before pull, this is useful eg. when overwriting a TABL object.
+* only the main XML file is used for comparison
+ 
+    DATA: ls_remote_file    TYPE zif_abapgit_git_definitions=>ty_file,
+          li_remote_version TYPE REF TO zif_abapgit_xml_input,
+          lv_count          TYPE i,
+          ls_result         TYPE zif_abapgit_comparator=>ty_result,
+          lv_answer         TYPE string,
+          li_comparator     TYPE REF TO zif_abapgit_comparator,
+          ls_item           TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIND ALL OCCURRENCES OF '.' IN is_result-filename MATCH COUNT lv_count.
+ 
+    IF is_result-filename CS '.XML' AND lv_count = 2.
+      IF ii_object->exists( ) = abap_false.
+        RETURN.
+      ENDIF.
+ 
+      READ TABLE it_remote WITH KEY file
+        COMPONENTS filename = is_result-filename INTO ls_remote_file.
+      IF sy-subrc <> 0. "if file does not exist in remote, we don't need to validate
+        RETURN.
+      ENDIF.
+ 
+      li_comparator = ii_object->get_comparator( ).
+      IF NOT li_comparator IS BOUND.
+        RETURN.
+      ENDIF.
+ 
+      CREATE OBJECT li_remote_version
+        TYPE zcl_abapgit_xml_input
+        EXPORTING
+          iv_xml      = zcl_abapgit_convert=>xstring_to_string_utf8( ls_remote_file-data )
+          iv_filename = ls_remote_file-filename.
+ 
+      ls_result = li_comparator->compare( ii_remote = li_remote_version
+                                          ii_log = ii_log ).
+      IF ls_result-text IS INITIAL.
+        RETURN.
+      ENDIF.
+ 
+      "log comparison result
+      ls_item-obj_type = is_result-obj_type.
+      ls_item-obj_name = is_result-obj_name.
+      ii_log->add_warning( iv_msg = ls_result-text
+                           is_item = ls_item ).
+ 
+      "continue or abort?
+      IF zcl_abapgit_ui_factory=>get_frontend_services( )->gui_is_available( ) = abap_true.
+        lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+          iv_titlebar              = 'Warning'
+          iv_text_question         = ls_result-text
+          iv_text_button_1         = 'Pull Anyway'
+          iv_icon_button_1         = 'ICON_OKAY'
+          iv_text_button_2         = 'Cancel'
+          iv_icon_button_2         = 'ICON_CANCEL'
+          iv_default_button        = '2'
+          iv_display_cancel_button = abap_false ).
+ 
+        IF lv_answer = '2'.
+          zcx_abapgit_exception=>raise( |Deserialization for object { is_result-obj_name } | &
+                                        |(type { is_result-obj_type }) aborted by user| ).
+        ENDIF.
+      ELSE.
+        zcx_abapgit_exception=>raise( |Deserialization for object { is_result-obj_name } | &
+                                      |(type { is_result-obj_type }) aborted, user descision required| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_object.
+ 
+    DATA: lv_message            TYPE string,
+          lv_class_name         TYPE string,
+          ls_obj_serializer_map LIKE LINE OF gt_obj_serializer_map.
+    DATA lo_obj_base TYPE REF TO zcl_abapgit_objects_super.
+    DATA lo_i18n_params TYPE REF TO zcl_abapgit_i18n_params.
+ 
+    IF io_i18n_params IS BOUND.
+      lo_i18n_params = io_i18n_params.
+    ELSE.
+      lo_i18n_params = zcl_abapgit_i18n_params=>new( ). " All defaults
+    ENDIF.
+ 
+    READ TABLE gt_obj_serializer_map
+      INTO ls_obj_serializer_map WITH KEY item = is_item.
+    IF sy-subrc = 0.
+      lv_class_name = ls_obj_serializer_map-metadata-class.
+    ELSEIF is_metadata IS NOT INITIAL.
+*        Metadata is provided only on deserialization
+*        Once this has been triggered, the same deserializer shall be used
+*        for subsequent processes.
+*        Thus, buffer the metadata afterwards
+      ls_obj_serializer_map-item      = is_item.
+      ls_obj_serializer_map-metadata  = is_metadata.
+      INSERT ls_obj_serializer_map INTO TABLE gt_obj_serializer_map.
+      lv_class_name = is_metadata-class.
+    ELSE.
+      lv_class_name = class_name( is_item ).
+    ENDIF.
+ 
+    REPLACE FIRST OCCURRENCE OF 'LCL' IN lv_class_name WITH 'ZCL_ABAPGIT'.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      " Prevent accidental usage of object handlers in the developer version
+      lv_class_name = |\\PROGRAM={ sy-repid }\\CLASS={ lv_class_name }|.
+    ENDIF.
+ 
+    TRY.
+        CREATE OBJECT ri_obj TYPE (lv_class_name)
+          EXPORTING
+            is_item     = is_item
+            iv_language = lo_i18n_params->ms_params-main_language.
+      CATCH cx_sy_create_object_error.
+        lv_message = |Object type { is_item-obj_type } is not supported by this system|.
+        IF iv_native_only = abap_false.
+          TRY. " 2nd step, try looking for plugins
+              CREATE OBJECT ri_obj TYPE zcl_abapgit_objects_bridge
+                EXPORTING
+                  is_item = is_item.
+            CATCH cx_sy_create_object_error.
+              zcx_abapgit_exception=>raise( lv_message ).
+          ENDTRY.
+        ELSE. " No native support? -> fail
+          zcx_abapgit_exception=>raise( lv_message ).
+        ENDIF.
+    ENDTRY.
+ 
+    IF ri_obj IS BOUND.
+      lo_obj_base ?= ri_obj.
+      lo_obj_base->mo_i18n_params = lo_i18n_params.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete.
+ 
+    DATA: ls_item     TYPE zif_abapgit_definitions=>ty_item,
+          li_progress TYPE REF TO zif_abapgit_progress,
+          lt_tadir    LIKE it_tadir,
+          lt_deleted  LIKE it_tadir,
+          lt_items    TYPE zif_abapgit_definitions=>ty_items_tt,
+          lx_error    TYPE REF TO zcx_abapgit_exception,
+          lv_count    TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF it_tadir.
+ 
+    IF it_tadir IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lt_tadir = it_tadir.
+ 
+    IF ii_log IS BOUND.
+      IF lines( lt_tadir ) = 1.
+        ii_log->add_info( |>>> Deleting 1 object| ).
+      ELSE.
+        ii_log->add_info( |>>> Deleting { lines( lt_tadir ) } objects| ).
+      ENDIF.
+    ENDIF.
+ 
+    IF is_checks-transport-required = abap_true.
+      zcl_abapgit_default_transport=>get_instance( )->set( is_checks-transport-transport ).
+    ENDIF.
+ 
+    TRY.
+        zcl_abapgit_dependencies=>resolve( CHANGING ct_tadir = lt_tadir ).
+ 
+        li_progress = zcl_abapgit_progress=>get_instance( lines( lt_tadir ) ).
+ 
+        lt_items = map_tadir_to_items( lt_tadir ).
+ 
+        check_objects_locked( iv_language = zif_abapgit_definitions=>c_english
+                              it_items    = lt_items ).
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+        zcl_abapgit_default_transport=>get_instance( )->reset( ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+    lv_count = 1.
+    DO.
+      CLEAR lt_deleted.
+      LOOP AT lt_tadir ASSIGNING <ls_tadir>.
+        li_progress->show( iv_current = lv_count
+                           iv_text    = |Delete { <ls_tadir>-obj_name }| ).
+ 
+        CLEAR ls_item.
+        ls_item-obj_type = <ls_tadir>-object.
+        ls_item-obj_name = <ls_tadir>-obj_name.
+ 
+        TRY.
+            delete_object(
+              iv_package   = <ls_tadir>-devclass
+              is_item      = ls_item
+              iv_transport = is_checks-transport-transport ).
+ 
+            INSERT <ls_tadir> INTO TABLE lt_deleted.
+            DELETE lt_tadir.
+            lv_count = lv_count + 1.
+ 
+            " make sure to save object deletions
+            COMMIT WORK.
+ 
+            IF ii_log IS BOUND.
+              ii_log->add_info( iv_msg  = |Object { ls_item-obj_type } { ls_item-obj_name } deleted|
+                                is_item = ls_item ).
+            ENDIF.
+ 
+          CATCH zcx_abapgit_exception INTO lx_error.
+            IF ii_log IS BOUND.
+              ii_log->add_exception( ix_exc  = lx_error
+                                     is_item = ls_item ).
+              ii_log->add_error( iv_msg  = |Deletion of object { ls_item-obj_name } failed|
+                                 is_item = ls_item ).
+            ENDIF.
+        ENDTRY.
+ 
+      ENDLOOP.
+ 
+      " Exit if done or nothing else was deleted
+      IF lines( lt_tadir ) = 0 OR lines( lt_deleted ) = 0.
+        EXIT.
+      ENDIF.
+    ENDDO.
+ 
+    zcl_abapgit_default_transport=>get_instance( )->reset( ).
+ 
+    IF lx_error IS BOUND AND lines( lt_tadir ) > 0.
+      zcx_abapgit_exception=>raise( 'Error during uninstall. Check the log.' ).
+    ENDIF.
+ 
+    li_progress->off( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_object.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    " Nothing to do for unsupported objects
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    li_obj = create_object( is_item ).
+    li_obj->delete( iv_package   = iv_package
+                    iv_transport = iv_transport ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize.
+ 
+    DATA: ls_item     TYPE zif_abapgit_definitions=>ty_item,
+          li_obj      TYPE REF TO zif_abapgit_object,
+          lt_remote   TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lv_package  TYPE devclass,
+          lo_files    TYPE REF TO zcl_abapgit_objects_files,
+          ls_metadata TYPE zif_abapgit_definitions=>ty_metadata,
+          lo_xml      TYPE REF TO zif_abapgit_xml_input,
+          lt_results  TYPE zif_abapgit_definitions=>ty_results_tt,
+          li_progress TYPE REF TO zif_abapgit_progress,
+          lv_path     TYPE string,
+          lt_items    TYPE zif_abapgit_definitions=>ty_items_tt,
+          lt_steps_id TYPE zif_abapgit_definitions=>ty_deserialization_step_tt,
+          lt_steps    TYPE zif_abapgit_objects=>ty_step_data_tt,
+          lx_exc      TYPE REF TO zcx_abapgit_exception.
+    DATA lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
+    DATA lo_i18n_params TYPE REF TO zcl_abapgit_i18n_params.
+    DATA lo_timer TYPE REF TO zcl_abapgit_timer.
+    DATA lo_abap_language_vers TYPE REF TO zcl_abapgit_abap_language_vers.
+ 
+    FIELD-SYMBOLS: <ls_result>  TYPE zif_abapgit_definitions=>ty_result,
+                   <lv_step_id> TYPE LINE OF zif_abapgit_definitions=>ty_deserialization_step_tt,
+                   <ls_step>    TYPE LINE OF zif_abapgit_objects=>ty_step_data_tt,
+                   <ls_deser>   TYPE LINE OF zif_abapgit_objects=>ty_deserialization_tt.
+ 
+    lt_steps = get_deserialize_steps( ).
+ 
+    lv_package = io_repo->get_package( ).
+ 
+    IF is_checks-transport-required = abap_true.
+      zcl_abapgit_default_transport=>get_instance( )->set( is_checks-transport-transport ).
+    ENDIF.
+ 
+    zcl_abapgit_objects_activation=>clear( ).
+ 
+    lt_remote = io_repo->get_files_remote( iv_ignore_files = abap_true ).
+ 
+    lt_results = zcl_abapgit_file_deserialize=>get_results(
+      io_repo = io_repo
+      ii_log = ii_log ).
+ 
+    IF lt_results IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    zcl_abapgit_objects_check=>checks_adjust(
+      EXPORTING
+        io_repo    = io_repo
+        is_checks  = is_checks
+      CHANGING
+        ct_results = lt_results ).
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( lt_results ) ).
+ 
+    lt_items = map_results_to_items( lt_results ).
+ 
+    lo_timer = zcl_abapgit_timer=>create(
+      iv_text  = 'Deserialize:'
+      iv_count = lines( lt_items ) )->start( ).
+ 
+    zcl_abapgit_factory=>get_cts_api( )->confirm_transport_messages( ).
+ 
+    check_objects_locked( iv_language = io_repo->get_dot_abapgit( )->get_main_language( )
+                          it_items    = lt_items ).
+ 
+    lo_i18n_params = zcl_abapgit_i18n_params=>new( is_params = determine_i18n_params(
+      io_dot                = io_repo->get_dot_abapgit( )
+      iv_main_language_only = io_repo->get_local_settings( )-main_language_only ) ).
+ 
+    IF lines( lt_items ) = 1.
+      ii_log->add_info( |>>> Deserializing 1 object| ).
+    ELSE.
+      ii_log->add_info( |>>> Deserializing { lines( lt_items ) } objects| ).
+    ENDIF.
+ 
+    CREATE OBJECT lo_abap_language_vers.
+ 
+    lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
+    LOOP AT lt_results ASSIGNING <ls_result>.
+      li_progress->show( iv_current = sy-tabix
+                         iv_text    = |Prepare Deserialize: { <ls_result>-obj_type } { <ls_result>-obj_name }| ).
+ 
+      CLEAR ls_item.
+      ls_item-obj_type = <ls_result>-obj_type.
+      ls_item-obj_name = <ls_result>-obj_name.
+ 
+      "error handling & logging added
+      TRY.
+          IF ls_item-obj_type <> 'NSPC'.
+            " If package does not exist yet, it will be created with this call
+            lv_package = lo_folder_logic->path_to_package(
+              iv_top  = io_repo->get_package( )
+              io_dot  = io_repo->get_dot_abapgit( )
+              iv_path = <ls_result>-path ).
+ 
+            check_main_package(
+              iv_package  = lv_package
+              iv_obj_type = ls_item-obj_type ).
+          ENDIF.
+ 
+          IF ls_item-obj_type = 'DEVC'.
+            " Packages have the same filename across different folders. The path needs to be supplied
+            " to find the correct file.
+            lv_path = <ls_result>-path.
+          ENDIF.
+ 
+          ls_item-devclass = lv_package.
+          ls_item-abap_language_version = lo_abap_language_vers->get_abap_language_vers_by_objt(
+                                                                    iv_object_type = ls_item-obj_type
+                                                                    iv_package = lv_package ).
+ 
+          IF <ls_result>-packmove = abap_true.
+            " Move object to new package
+            change_package_assignments( is_item = ls_item
+                                        ii_log  = ii_log ).
+            " No other changes required
+            CONTINUE.
+          ENDIF.
+ 
+          " Create or update object
+          CREATE OBJECT lo_files
+            EXPORTING
+              is_item = ls_item
+              iv_path = lv_path.
+ 
+          lo_files->set_files( lt_remote ).
+ 
+          IF lo_files->is_json_metadata( ) = abap_false.
+            "analyze XML in order to instantiate the proper serializer
+            lo_xml = lo_files->read_xml( ).
+            ls_metadata = lo_xml->get_metadata( ).
+          ELSE.
+            " there's no XML and metadata for JSON format
+            CLEAR: lo_xml, ls_metadata.
+          ENDIF.
+ 
+          li_obj = create_object(
+            is_item        = ls_item
+            is_metadata    = ls_metadata
+            io_i18n_params = lo_i18n_params ).
+ 
+          compare_remote_to_local(
+            ii_object = li_obj
+            it_remote = lt_remote
+            is_result = <ls_result>
+            ii_log    = ii_log ).
+ 
+          li_obj->mo_files = lo_files.
+ 
+          "get required steps for deserialize the object
+          lt_steps_id = li_obj->get_deserialize_steps( ).
+ 
+          LOOP AT lt_steps_id ASSIGNING <lv_step_id>.
+            READ TABLE lt_steps WITH KEY step_id = <lv_step_id> ASSIGNING <ls_step>.
+            ASSERT sy-subrc = 0.
+            IF <lv_step_id> = zif_abapgit_object=>gc_step_id-ddic AND
+               zcl_abapgit_objects_activation=>is_ddic_type( ls_item-obj_type ) = abap_false.
+              " DDIC only for DDIC objects
+              zcx_abapgit_exception=>raise( |Step { <lv_step_id> } is only for DDIC objects| ).
+            ENDIF.
+            APPEND INITIAL LINE TO <ls_step>-objects ASSIGNING <ls_deser>.
+            <ls_deser>-item    = ls_item.
+            <ls_deser>-obj     = li_obj.
+            <ls_deser>-xml     = lo_xml.
+            <ls_deser>-package = lv_package.
+          ENDLOOP.
+ 
+          " LXE, TODO refactor and move below activation
+          IF lo_i18n_params->is_lxe_applicable( ) = abap_true.
+            zcl_abapgit_factory=>get_lxe_texts( )->deserialize(
+              iv_object_type = ls_item-obj_type
+              iv_object_name = ls_item-obj_name
+              io_i18n_params = lo_i18n_params
+              ii_xml         = lo_xml
+              io_files       = lo_files ).
+          ENDIF.
+ 
+          CLEAR: lv_path, lv_package.
+ 
+        CATCH zcx_abapgit_exception INTO lx_exc.
+          ii_log->add_exception( ix_exc = lx_exc
+                                 is_item = ls_item ).
+          ii_log->add_error( iv_msg = |Import of object { ls_item-obj_name } failed|
+                             is_item = ls_item ).
+          "object should not be part of any deserialization step
+          CONTINUE.
+      ENDTRY.
+ 
+    ENDLOOP.
+ 
+    li_progress->off( ).
+ 
+    "run deserialize for all steps and its objects
+    deserialize_steps(
+      EXPORTING
+        it_steps     = lt_steps
+        ii_log       = ii_log
+        iv_transport = is_checks-transport-transport
+      CHANGING
+        ct_files     = rt_accessed_files ).
+ 
+    " TODO: LXE translations (objects has been activated by now)
+ 
+    update_package_tree( io_repo->get_package( ) ).
+ 
+    zcl_abapgit_default_transport=>get_instance( )->reset( ).
+ 
+    lo_timer->end( abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_checks.
+ 
+    rs_checks = zcl_abapgit_objects_check=>deserialize_checks( io_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_objects.
+ 
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          li_exit     TYPE REF TO zif_abapgit_exit,
+          lx_exc      TYPE REF TO zcx_abapgit_exception.
+ 
+    FIELD-SYMBOLS: <ls_obj> LIKE LINE OF is_step-objects.
+ 
+ 
+    zcl_abapgit_objects_activation=>clear( ).
+ 
+    ii_log->add_success( |>> Step { is_step-order } - { is_step-descr }| ).
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( is_step-objects ) ).
+ 
+    LOOP AT is_step-objects ASSIGNING <ls_obj>.
+      li_progress->show(
+        iv_current = sy-tabix
+        iv_text    = |Step { is_step-order } - { is_step-descr }:| &&
+                     | { <ls_obj>-item-obj_type } { <ls_obj>-item-obj_name }| ).
+ 
+      TRY.
+          <ls_obj>-obj->deserialize( iv_package   = <ls_obj>-package
+                                     io_xml       = <ls_obj>-xml
+                                     iv_step      = is_step-step_id
+                                     ii_log       = ii_log
+                                     iv_transport = iv_transport ).
+          APPEND LINES OF <ls_obj>-obj->mo_files->get_accessed_files( ) TO ct_files.
+ 
+          ii_log->add_success( iv_msg = |Object { <ls_obj>-item-obj_name } imported|
+                               is_item = <ls_obj>-item ).
+ 
+        CATCH zcx_abapgit_exception INTO lx_exc.
+          ii_log->add_exception( ix_exc = lx_exc
+                                 is_item = <ls_obj>-item ).
+          ii_log->add_error( iv_msg = |Import of object { <ls_obj>-item-obj_name } failed|
+                             is_item = <ls_obj>-item ).
+      ENDTRY.
+ 
+    ENDLOOP.
+ 
+    li_progress->show( iv_current = lines( is_step-objects )
+                       iv_text    = |Step { is_step-order } - Activating Objects| ).
+ 
+    CASE is_step-step_id.
+      WHEN zif_abapgit_object=>gc_step_id-ddic.
+        zcl_abapgit_objects_activation=>activate(
+          iv_ddic = abap_true
+          ii_log  = ii_log ).
+      WHEN zif_abapgit_object=>gc_step_id-abap.
+        zcl_abapgit_objects_activation=>activate(
+          iv_ddic = abap_false
+          ii_log  = ii_log ).
+      WHEN zif_abapgit_object=>gc_step_id-late.
+        " late can have both DDIC (like TABL with REF TO) and non-DDIC objects
+        zcl_abapgit_objects_activation=>activate(
+          iv_ddic = abap_true
+          ii_log  = ii_log ).
+        zcl_abapgit_objects_activation=>activate(
+          iv_ddic = abap_false
+          ii_log  = ii_log ).
+    ENDCASE.
+ 
+    li_progress->off( ).
+ 
+*   Call postprocessing
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+    li_exit->deserialize_postprocess( is_step = is_step
+                                      ii_log  = ii_log ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_steps.
+ 
+    FIELD-SYMBOLS <ls_step> LIKE LINE OF it_steps.
+ 
+    LOOP AT it_steps ASSIGNING <ls_step>.
+      deserialize_objects(
+        EXPORTING
+          is_step      = <ls_step>
+          ii_log       = ii_log
+          iv_transport = iv_transport
+        CHANGING
+          ct_files     = ct_files ).
+    ENDLOOP.
+ 
+    SORT ct_files BY path ASCENDING filename ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM ct_files. " Just in case
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_i18n_params.
+ 
+    " TODO: unify with ZCL_ABAPGIT_SERIALIZE=>DETERMINE_I18N_PARAMS, same code
+ 
+    IF io_dot IS BOUND.
+      rs_i18n_params-main_language         = io_dot->get_main_language( ).
+      rs_i18n_params-use_lxe               = io_dot->use_lxe( ).
+      rs_i18n_params-main_language_only    = iv_main_language_only.
+      rs_i18n_params-translation_languages = zcl_abapgit_lxe_texts=>get_translation_languages(
+        iv_main_language  = io_dot->get_main_language( )
+        it_i18n_languages = io_dot->get_i18n_languages( ) ).
+    ENDIF.
+ 
+    IF rs_i18n_params-main_language IS INITIAL.
+      rs_i18n_params-main_language = sy-langu.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD exists.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    " Might be called for objects without tadir entry
+    IF is_item IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " For unsupported objects, assume object exists
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      rv_bool = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        li_obj = create_object( is_item ).
+        rv_bool = li_obj->exists( ).
+      CATCH zcx_abapgit_exception.
+        " Ignore errors and assume the object exists
+        rv_bool = abap_true.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_deserialize_steps.
+    FIELD-SYMBOLS: <ls_step> TYPE LINE OF zif_abapgit_objects=>ty_step_data_tt.
+ 
+    APPEND INITIAL LINE TO rt_steps ASSIGNING <ls_step>.
+    <ls_step>-step_id      = zif_abapgit_object=>gc_step_id-early.
+    <ls_step>-descr        = 'Pre-process Objects'.
+    <ls_step>-syntax_check = abap_false.
+    <ls_step>-order        = 1.
+ 
+    APPEND INITIAL LINE TO rt_steps ASSIGNING <ls_step>.
+    <ls_step>-step_id      = zif_abapgit_object=>gc_step_id-ddic.
+    <ls_step>-descr        = 'Deserialize DDIC Objects'.
+    <ls_step>-syntax_check = abap_false.
+    <ls_step>-order        = 2.
+ 
+    APPEND INITIAL LINE TO rt_steps ASSIGNING <ls_step>.
+    <ls_step>-step_id      = zif_abapgit_object=>gc_step_id-abap.
+    <ls_step>-descr        = 'Deserialize non-DDIC Objects'.
+    <ls_step>-syntax_check = abap_false.
+    <ls_step>-order        = 3.
+ 
+    APPEND INITIAL LINE TO rt_steps ASSIGNING <ls_step>.
+    <ls_step>-step_id      = zif_abapgit_object=>gc_step_id-late.
+    <ls_step>-descr        = 'Post-process Objects'.
+    <ls_step>-syntax_check = abap_true.
+    <ls_step>-order        = 4.
+ 
+    SORT rt_steps BY order. " ensure correct processing order
+  ENDMETHOD.
+ 
+ 
+  METHOD get_extra_from_filename.
+ 
+    IF iv_filename IS NOT INITIAL.
+      FIND REGEX '\..*\.([\-a-z0-9_%]*)\.' IN iv_filename SUBMATCHES rv_extra.
+      IF sy-subrc = 0.
+        rv_extra = cl_http_utility=>unescape_url( rv_extra ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_active.
+ 
+    DATA: li_obj TYPE REF TO zif_abapgit_object.
+ 
+    " For unsupported objects, assume active state
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      rv_active = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        li_obj = create_object( is_item ).
+        rv_active = li_obj->is_active( ).
+      CATCH cx_sy_dyn_call_illegal_method
+            cx_sy_ref_is_initial
+            zcx_abapgit_exception.
+        " Ignore errors and assume active state
+        rv_active = abap_true.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_supported.
+ 
+    TRY.
+        create_object(
+          is_item        = is_item
+          iv_native_only = iv_native_only ).
+        rv_bool = abap_true.
+      CATCH zcx_abapgit_exception.
+        rv_bool = abap_false.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_type_supported.
+ 
+    DATA: ls_item               TYPE zif_abapgit_definitions=>ty_item,
+          ls_supported_obj_type TYPE ty_supported_types.
+ 
+    FIELD-SYMBOLS <ls_supported_obj_type> TYPE ty_supported_types.
+ 
+    IF iv_obj_type IS INITIAL.
+      " empty object type should never exist
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE gt_supported_obj_types
+      ASSIGNING <ls_supported_obj_type>
+      WITH KEY obj_type = iv_obj_type.
+ 
+    IF sy-subrc <> 0.
+ 
+      ls_item-obj_type = iv_obj_type.
+ 
+      ls_supported_obj_type-obj_type  = iv_obj_type.
+      ls_supported_obj_type-supported = is_supported( ls_item ).
+ 
+      INSERT ls_supported_obj_type INTO TABLE gt_supported_obj_types.
+ 
+      rv_bool = ls_supported_obj_type-supported.
+      RETURN.
+ 
+    ENDIF.
+ 
+    rv_bool = <ls_supported_obj_type>-supported.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump.
+ 
+    DATA: li_obj  TYPE REF TO zif_abapgit_object,
+          lv_exit TYPE abap_bool.
+ 
+    " Nothing to do for unsupported objects
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      zcx_abapgit_exception=>raise( |Object type { is_item-obj_type } is not supported by this system| ).
+    ENDIF.
+ 
+    " Nothing to do if object does not exist
+    li_obj = create_object( is_item ).
+ 
+    IF li_obj->exists( ) = abap_false.
+      zcx_abapgit_exception=>raise( |Object { is_item-obj_type } { is_item-obj_name } doesn't exist| ).
+    ENDIF.
+ 
+    " First priority object-specific handler
+    lv_exit = li_obj->jump( get_extra_from_filename( iv_filename ) ).
+ 
+    IF lv_exit = abap_false.
+      " Open object in new window with generic jumper
+      lv_exit = zcl_abapgit_objects_factory=>get_gui_jumper( )->jump(
+        is_item        = is_item
+        is_sub_item    = is_sub_item
+        iv_line_number = iv_line_number
+        iv_new_window  = iv_new_window ).
+    ENDIF.
+ 
+    IF lv_exit = abap_false.
+      zcx_abapgit_exception=>raise( |Jump to { is_item-obj_type } { is_item-obj_name } not possible| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_results_to_items.
+ 
+    DATA: ls_item LIKE LINE OF rt_items.
+    FIELD-SYMBOLS: <ls_result> TYPE zif_abapgit_definitions=>ty_result.
+ 
+    LOOP AT it_results ASSIGNING <ls_result>.
+ 
+      ls_item-devclass = <ls_result>-package.
+      ls_item-obj_type = <ls_result>-obj_type.
+      ls_item-obj_name = <ls_result>-obj_name.
+      INSERT ls_item INTO TABLE rt_items.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_tadir_to_items.
+ 
+    DATA: ls_item LIKE LINE OF rt_items.
+    FIELD-SYMBOLS: <ls_tadir> TYPE zif_abapgit_definitions=>ty_tadir.
+ 
+    LOOP AT it_tadir ASSIGNING <ls_tadir>.
+ 
+      ls_item-devclass = <ls_tadir>-devclass.
+      ls_item-obj_type = <ls_tadir>-object.
+      ls_item-obj_name = <ls_tadir>-obj_name.
+      INSERT ls_item INTO TABLE rt_items.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+ 
+    DATA: li_obj   TYPE REF TO zif_abapgit_object,
+          lx_error TYPE REF TO zcx_abapgit_exception,
+          li_xml   TYPE REF TO zif_abapgit_xml_output,
+          lo_files TYPE REF TO zcl_abapgit_objects_files.
+ 
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF rs_files_and_item-files.
+ 
+    IF is_type_supported( is_item-obj_type ) = abap_false.
+      zcx_abapgit_exception=>raise( |Object type ignored, not supported: {
+        is_item-obj_type }-{
+        is_item-obj_name }| ).
+    ENDIF.
+ 
+    li_obj = create_object(
+      is_item        = is_item
+      io_i18n_params = io_i18n_params ).
+ 
+    CREATE OBJECT lo_files EXPORTING is_item = is_item.
+    li_obj->mo_files = lo_files. " TODO move into create_object
+ 
+    CREATE OBJECT li_xml TYPE zcl_abapgit_xml_output.
+ 
+    rs_files_and_item-item = is_item.
+ 
+    TRY.
+        li_obj->serialize( li_xml ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        rs_files_and_item-item-inactive = boolc( li_obj->is_active( ) = abap_false ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+    IF io_i18n_params->is_lxe_applicable( ) = abap_true.
+      zcl_abapgit_factory=>get_lxe_texts( )->serialize(
+        iv_object_type = is_item-obj_type
+        iv_object_name = is_item-obj_name
+        io_i18n_params = io_i18n_params
+        io_files       = lo_files
+        ii_xml         = li_xml ).
+    ENDIF.
+ 
+    IF lo_files->is_json_metadata( ) = abap_false.
+      lo_files->add_xml(
+        ii_xml      = li_xml
+        is_metadata = li_obj->get_metadata( ) ).
+    ENDIF.
+ 
+    rs_files_and_item-files = lo_files->get_files( ).
+ 
+    check_duplicates( rs_files_and_item-files ).
+ 
+    rs_files_and_item-item-inactive = boolc( li_obj->is_active( ) = abap_false ).
+ 
+    LOOP AT rs_files_and_item-files ASSIGNING <ls_file>.
+      <ls_file>-sha1 = zcl_abapgit_hash=>sha1_blob( <ls_file>-data ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD supported_list.
+ 
+    DATA lt_objects            TYPE STANDARD TABLE OF ko100.
+    DATA ls_item               TYPE zif_abapgit_definitions=>ty_item.
+    DATA ls_supported_obj_type TYPE ty_supported_types.
+    DATA lt_types              TYPE zif_abapgit_exit=>ty_object_types.
+    DATA lv_type               LIKE LINE OF lt_types.
+    DATA li_exit               TYPE REF TO zif_abapgit_exit.
+ 
+    FIELD-SYMBOLS <ls_object> LIKE LINE OF lt_objects.
+    FIELD-SYMBOLS <ls_supported_obj_type> TYPE ty_supported_types.
+ 
+    IF gv_supported_obj_types_loaded = abap_true.
+      LOOP AT gt_supported_obj_types ASSIGNING <ls_supported_obj_type> WHERE supported = abap_true.
+        INSERT <ls_supported_obj_type>-obj_type INTO TABLE rt_types.
+      ENDLOOP.
+      RETURN.
+    ENDIF.
+ 
+    " delete content because it might be filled already by method IS_TYPE_SUPPORTED
+    CLEAR gt_supported_obj_types.
+ 
+    CALL FUNCTION 'TR_OBJECT_TABLE'
+      TABLES
+        wt_object_text = lt_objects
+      EXCEPTIONS
+        OTHERS         = 1 ##FM_SUBRC_OK.
+ 
+    LOOP AT lt_objects ASSIGNING <ls_object> WHERE pgmid = 'R3TR'.
+      INSERT <ls_object>-object INTO TABLE lt_types.
+    ENDLOOP.
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->change_supported_object_types( CHANGING ct_types = lt_types ).
+ 
+    LOOP AT lt_types INTO lv_type.
+      ls_item-obj_type = lv_type.
+ 
+      ls_supported_obj_type-obj_type  = lv_type.
+      ls_supported_obj_type-supported = is_supported( ls_item ).
+ 
+      INSERT ls_supported_obj_type INTO TABLE gt_supported_obj_types.
+ 
+      IF ls_supported_obj_type-supported = abap_true.
+        INSERT ls_supported_obj_type-obj_type INTO TABLE rt_types.
+      ENDIF.
+    ENDLOOP.
+ 
+    gv_supported_obj_types_loaded = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_package_tree.
+ 
+    DATA: lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+          lv_package  LIKE LINE OF lt_packages,
+          lv_tree     TYPE dirtree-tname.
+ 
+ 
+    lt_packages = zcl_abapgit_factory=>get_sap_package( iv_package )->list_subpackages( ).
+    APPEND iv_package TO lt_packages.
+ 
+    LOOP AT lt_packages INTO lv_package.
+* update package tree for SE80
+      lv_tree = 'EU_' && lv_package.
+      CALL FUNCTION 'WB_TREE_ACTUALIZE'
+        EXPORTING
+          tree_name              = lv_tree
+          without_crossreference = abap_true
+          with_tcode_index       = abap_true.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_objects.clas.testclasses.abap.html b/src/objects/zcl_abapgit_objects.clas.testclasses.abap.html new file mode 100644 index 00000000000..ee16b7043a1 --- /dev/null +++ b/src/objects/zcl_abapgit_objects.clas.testclasses.abap.html @@ -0,0 +1,1495 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_objects.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_objects.clas.testclasses.abap

+
+ +
+ 47.44% + Statements + 223/470 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/27 +
+ + +
+ 47.44% + Lines + 223/470 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +4711x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS ltcl_object_types DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      type_supported FOR TESTING RAISING zcx_abapgit_exception,
+      not_exist FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_object_types IMPLEMENTATION.
+ 
+  METHOD type_supported.
+
+    cl_abap_unit_assert=>assert_equals(
+      act  = zcl_abapgit_objects=>is_type_supported( 'PROG' )
+      exp  = abap_true ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act  = zcl_abapgit_objects=>is_type_supported( 'ZXYZ' )
+      exp  = abap_false ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act  = zcl_abapgit_objects=>is_type_supported( '' )
+      exp  = abap_false ).
+
+  ENDMETHOD.
+ 
+  METHOD not_exist.
+
+    DATA: ls_item   TYPE zif_abapgit_definitions=>ty_item,
+          lv_exists TYPE abap_bool,
+          lt_types  TYPE zcl_abapgit_objects=>ty_types_tt.
+
+    FIELD-SYMBOLS: <lv_type> LIKE LINE OF lt_types.
+
+
+    lt_types = zcl_abapgit_objects=>supported_list( ).
+
+    cl_abap_unit_assert=>assert_not_initial( lt_types ).
+
+    LOOP AT lt_types ASSIGNING <lv_type>.
+      CLEAR ls_item.
+      ls_item-obj_name = 'ZABAPGIT_FOOBAR'.
+      ls_item-obj_type = <lv_type>.
+      lv_exists = zcl_abapgit_objects=>exists( ls_item ).
+
+      cl_abap_unit_assert=>assert_equals(
+        act  = lv_exists
+        exp  = abap_false
+        msg  = ls_item-obj_type
+        quit = if_aunit_constants=>no ).
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_serialize DEFINITION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS ltcl_serialize DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS:
+      check
+        IMPORTING VALUE(is_item) TYPE zif_abapgit_definitions=>ty_item
+        RAISING   zcx_abapgit_exception,
+      serialize_tabl FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_shlp FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_view FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_auth FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_clas FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_intf FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_doma FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_dtel FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_fugr FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_msag FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_prog FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_tran FOR TESTING RAISING zcx_abapgit_exception,
+      serialize_ttyp FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_serialize IMPLEMENTATION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS ltcl_serialize IMPLEMENTATION.
+ 
+  METHOD serialize_shlp.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'SHLP'.
+    ls_item-obj_name = 'USER_LOGON'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_view.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'VIEW'.
+    ls_item-obj_name = 'VUSR02_HEADER'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_tabl.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'TABL'.
+    ls_item-obj_name = 'USR02'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_auth.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'AUTH'.
+    ls_item-obj_name = 'AREA'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_clas.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'CLAS'.
+    ls_item-obj_name = 'CL_GUI_FRONTEND_SERVICES'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_intf.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+    ls_item-obj_type = 'INTF'.
+    ls_item-obj_name = 'IF_BADI_TADIR_CHANGED'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_doma.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'DOMA'.
+    ls_item-obj_name = 'PGMID'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_dtel.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'DTEL'.
+    ls_item-obj_name = 'PGMID'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_fugr.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'FUGR'.
+    ls_item-obj_name = 'SRFC'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_msag.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'MSAG'.
+    ls_item-obj_name = '00'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_prog.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'PROG'.
+    ls_item-obj_name = 'SAPLWBABAP'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_tran.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'TRAN'.
+    ls_item-obj_name = 'SE38'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD serialize_ttyp.
+
+    DATA: ls_item  TYPE zif_abapgit_definitions=>ty_item.
+
+
+    ls_item-obj_type = 'TTYP'.
+    ls_item-obj_name = 'ABAPPROG'.
+
+    check( ls_item ).
+
+  ENDMETHOD.
+ 
+  METHOD check.
+
+    DATA: ls_files_item TYPE zcl_abapgit_objects=>ty_serialization.
+
+    ls_files_item = zcl_abapgit_objects=>serialize(
+      is_item        = is_item
+      io_i18n_params = zcl_abapgit_i18n_params=>new( iv_main_language = zif_abapgit_definitions=>c_english ) ).
+
+    cl_abap_unit_assert=>assert_not_initial( ls_files_item-files ).
+    cl_abap_unit_assert=>assert_equals( act = ls_files_item-item
+                                        exp = is_item ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_object_ddls_mock DEFINITION FOR TESTING.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_object.
+    METHODS:
+      constructor
+        IMPORTING
+          is_item     TYPE zif_abapgit_definitions=>ty_item
+          iv_language TYPE spras.
+ 
+  PRIVATE SECTION.
+    DATA ms_item TYPE zif_abapgit_definitions=>ty_item.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_object_ddls_mock IMPLEMENTATION.
+ 
+  METHOD constructor.
+ 
+    ms_item = is_item.
+ 
+* dummy use of variable
+    IF iv_language = 'E'.
+      RETURN.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~is_locked.
+ 
+    CASE ms_item-obj_name.
+      WHEN 'Z_TEST_DDLS'.
+ 
+        rv_is_locked = abap_true.
+ 
+      WHEN 'Z_TEST_DDLS2'.
+ 
+        rv_is_locked = abap_false.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~get_deserialize_steps. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~get_deserialize_order. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~changed_by. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~get_comparator. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~delete. "##needed
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~deserialize. "##needed
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~exists. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~get_metadata. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~jump. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~serialize. "##needed
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~is_active. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~map_filename_to_object. "##needed
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_object~map_object_to_filename. "##needed
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_check_objects_locked DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mt_given_items    TYPE zif_abapgit_definitions=>ty_items_tt,
+      mv_exception_text TYPE string.
+ 
+    METHODS:
+      throw_excp_if_object_is_locked FOR TESTING RAISING cx_static_check,
+      no_excp_if_obj_is_not_locked FOR TESTING RAISING cx_static_check,
+      given_locked_object,
+      when_check_objects_locked,
+      then_exception_shd_be_raised,
+      given_not_locked_object,
+      then_no_exception_shd_occur,
+      given_object
+        IMPORTING
+          iv_object_name TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_objects DEFINITION LOCAL FRIENDS ltcl_check_objects_locked.
+ 
+CLASS ltcl_check_objects_locked IMPLEMENTATION.
+ 
+  METHOD throw_excp_if_object_is_locked.
+
+    given_locked_object( ).
+    when_check_objects_locked( ).
+    then_exception_shd_be_raised( ).
+
+  ENDMETHOD.
+ 
+  METHOD no_excp_if_obj_is_not_locked.
+
+    given_not_locked_object( ).
+    when_check_objects_locked( ).
+    then_no_exception_shd_occur( ).
+
+  ENDMETHOD.
+ 
+  METHOD given_locked_object.
+
+    given_object( 'Z_TEST_DDLS' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD when_check_objects_locked.
+
+    DATA: lx_error TYPE REF TO zcx_abapgit_exception.
+
+    TRY.
+        zcl_abapgit_objects=>check_objects_locked( iv_language = 'E'
+                                                   it_items    = mt_given_items ).
+
+      CATCH zcx_abapgit_exception INTO lx_error.
+        mv_exception_text = lx_error->get_text( ).
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD then_exception_shd_be_raised.
+
+    cl_abap_unit_assert=>assert_equals(
+      exp = |Object DDLS Z_TEST_DDLS is locked. Action not possible.|
+      act = mv_exception_text ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD given_not_locked_object.
+
+    given_object( 'Z_TEST_DDLS2' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD then_no_exception_shd_occur.
+
+    cl_abap_unit_assert=>assert_initial( mv_exception_text ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD given_object.
+
+    CONSTANTS:
+      lc_obj_type TYPE string VALUE 'DDLS'.
+
+    DATA:
+      ls_item               LIKE LINE OF mt_given_items,
+      ls_obj_serializer_map LIKE LINE OF zcl_abapgit_objects=>gt_obj_serializer_map.
+
+    ls_item-obj_type = lc_obj_type.
+    ls_item-obj_name = iv_object_name.
+    INSERT ls_item INTO TABLE mt_given_items.
+
+    ls_obj_serializer_map-item-obj_type = lc_obj_type.
+    ls_obj_serializer_map-item-obj_name = iv_object_name.
+    ls_obj_serializer_map-metadata-class = '\CLASS-POOL=ZCL_ABAPGIT_OBJECTS\CLASS=LTCL_OBJECT_DDLS_MOCK'.
+    INSERT ls_obj_serializer_map INTO TABLE zcl_abapgit_objects=>gt_obj_serializer_map.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_objects_bridge.clas.abap.html b/src/objects/zcl_abapgit_objects_bridge.clas.abap.html new file mode 100644 index 00000000000..109f8cf7ec0 --- /dev/null +++ b/src/objects/zcl_abapgit_objects_bridge.clas.abap.html @@ -0,0 +1,853 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_objects_bridge.clas.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_objects_bridge.clas.abap

+
+ +
+ 89.45% + Statements + 229/256 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 89.45% + Lines + 229/256 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +2571x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_objects_bridge DEFINITION PUBLIC FINAL CREATE PUBLIC INHERITING FROM zcl_abapgit_objects_super.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item
+      RAISING   cx_sy_create_object_error.
+ 
+    INTERFACES zif_abapgit_object.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mo_plugin TYPE REF TO object.
+ 
+    CLASS-METHODS initialize.
+ 
+    " Metadata flags (late_deser, delete_tadir, and ddic) are not required by abapGit anymore
+    " We keep them to stay compatible with old bridge implementation
+    TYPES:
+      BEGIN OF ty_metadata,
+        class        TYPE string,
+        version      TYPE string,
+        late_deser   TYPE abap_bool,
+        delete_tadir TYPE abap_bool,
+        ddic         TYPE abap_bool,
+      END OF ty_metadata .
+ 
+    TYPES: BEGIN OF ty_s_objtype_map,
+             obj_typ      TYPE tadir-object,
+             plugin_class TYPE seoclsname,
+           END OF ty_s_objtype_map,
+           ty_t_objtype_map TYPE SORTED TABLE OF ty_s_objtype_map WITH UNIQUE KEY obj_typ.
+ 
+    CLASS-DATA gv_init TYPE abap_bool.
+    CLASS-DATA gt_objtype_map TYPE ty_t_objtype_map.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_objects_bridge IMPLEMENTATION.
+ 
+ 
+  METHOD initialize.
+ 
+    DATA lt_plugin_class    TYPE STANDARD TABLE OF seoclsname WITH DEFAULT KEY.
+    DATA lv_plugin_class    LIKE LINE OF lt_plugin_class.
+    DATA lo_plugin          TYPE REF TO object.
+    DATA lt_plugin_obj_type TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY.
+    DATA ls_objtype_map     LIKE LINE OF gt_objtype_map.
+ 
+    IF gv_init = abap_true.
+      RETURN.
+    ENDIF.
+    gv_init = abap_true.
+ 
+    SELECT clsname
+      FROM seometarel
+      INTO TABLE lt_plugin_class
+      WHERE refclsname LIKE 'ZCL_ABAPGITP_OBJECT%'
+      AND version = '1'
+      ORDER BY clsname.                                   "#EC CI_SUBRC
+ 
+    CLEAR gt_objtype_map.
+    LOOP AT lt_plugin_class INTO lv_plugin_class
+        WHERE table_line <> 'ZCL_ABAPGITP_OBJECT_BY_SOBJ'.
+* have the generic plugin only as fallback
+      TRY.
+          CREATE OBJECT lo_plugin TYPE (lv_plugin_class).
+        CATCH cx_sy_create_object_error.
+          CONTINUE. ">>>>>>>>>>>>>>
+      ENDTRY.
+ 
+      CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES')
+        IMPORTING
+          rt_obj_type = lt_plugin_obj_type.
+ 
+      ls_objtype_map-plugin_class = lv_plugin_class.
+      LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ.
+        INSERT ls_objtype_map INTO TABLE gt_objtype_map.
+        IF sy-subrc <> 0.
+* No exception in class-contructor possible.
+* Anyway, a shortdump is more appropriate in this case
+          ASSERT 'There must not be' =
+            |multiple abapGit-Plugins for the same object type {
+            ls_objtype_map-obj_typ }|.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP. "at plugins
+ 
+* and the same for the generic plugin if exists
+* have the generic plugin only as fallback
+    LOOP AT lt_plugin_class INTO lv_plugin_class
+        WHERE table_line = 'ZCL_ABAPGITP_OBJECT_BY_SOBJ'.
+      CREATE OBJECT lo_plugin TYPE (lv_plugin_class).
+ 
+      CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES')
+        RECEIVING
+          rt_obj_type = lt_plugin_obj_type.
+ 
+      ls_objtype_map-plugin_class = lv_plugin_class.
+      LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ.
+        INSERT ls_objtype_map INTO TABLE gt_objtype_map. "knowingly ignore the subrc
+      ENDLOOP.
+    ENDLOOP. "at plugins
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA ls_objtype_map LIKE LINE OF gt_objtype_map.
+ 
+    super->constructor( is_item = is_item
+                        iv_language = zif_abapgit_definitions=>c_english ).
+ 
+    initialize( ).
+ 
+*    determine the responsible plugin
+    READ TABLE gt_objtype_map INTO ls_objtype_map
+      WITH TABLE KEY obj_typ = is_item-obj_type.
+    IF sy-subrc = 0.
+      CREATE OBJECT mo_plugin TYPE (ls_objtype_map-plugin_class).
+ 
+      CALL METHOD mo_plugin->('SET_ITEM')
+        EXPORTING
+          iv_obj_type = is_item-obj_type
+          iv_obj_name = is_item-obj_name.
+    ELSE.
+      RAISE EXCEPTION TYPE cx_sy_create_object_error
+        EXPORTING
+          classname = 'LCL_OBJECTS_BRIDGE'.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~changed_by.
+    rv_user = c_user_unknown. " todo
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~delete.
+    DATA lx_plugin TYPE REF TO cx_static_check.
+
+    TRY.
+        CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~DELETE').
+      CATCH cx_static_check INTO lx_plugin.
+        zcx_abapgit_exception=>raise( lx_plugin->get_text( ) ).
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~deserialize.
+
+    DATA: lx_plugin        TYPE REF TO cx_static_check.
+
+    TRY.
+        CALL METHOD mo_plugin->('WRAP_DESERIALIZE')
+          EXPORTING
+            iv_package = iv_package
+            io_xml     = io_xml.
+      CATCH cx_static_check INTO lx_plugin.
+        zcx_abapgit_exception=>raise( lx_plugin->get_text( ) ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~exists.
+ 
+    CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~EXISTS')
+      RECEIVING
+        rv_bool = rv_bool.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_comparator.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_order.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_deserialize_steps.
+ 
+    DATA ls_meta TYPE ty_metadata.
+ 
+    CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~GET_METADATA')
+      RECEIVING
+        rs_metadata = ls_meta.
+ 
+    IF ls_meta-late_deser = abap_true.
+      APPEND zif_abapgit_object=>gc_step_id-late TO rt_steps.
+    ELSEIF ls_meta-ddic = abap_true.
+      APPEND zif_abapgit_object=>gc_step_id-ddic TO rt_steps.
+    ELSE.
+      APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~get_metadata.
+ 
+    DATA ls_meta TYPE ty_metadata.
+ 
+    CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~GET_METADATA')
+      RECEIVING
+        rs_metadata = ls_meta.
+ 
+    MOVE-CORRESPONDING ls_meta TO rs_metadata.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_active.
+    rv_active = abap_true.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~is_locked.
+ 
+    rv_is_locked = abap_false.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~jump.
+ 
+    CALL METHOD mo_plugin->('ZIF_ABAPGITP_PLUGIN~JUMP').
+    rv_exit = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_filename_to_object.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~map_object_to_filename.
+    RETURN.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_object~serialize.
+
+    CALL METHOD mo_plugin->('WRAP_SERIALIZE')
+      EXPORTING
+        io_xml = io_xml.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_objects_program.clas.abap.html b/src/objects/zcl_abapgit_objects_program.clas.abap.html new file mode 100644 index 00000000000..a66b06b65eb --- /dev/null +++ b/src/objects/zcl_abapgit_objects_program.clas.abap.html @@ -0,0 +1,3481 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_objects_program.clas.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_objects_program.clas.abap

+
+ +
+ 55.56% + Statements + 629/1132 +
+ + +
+ 68.75% + Branches + 11/16 +
+ + +
+ 11.11% + Functions + 1/9 +
+ + +
+ 55.56% + Lines + 629/1132 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +11331x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +4x +4x +4x +4x +1x +1x +3x +3x +3x +4x +1x +1x +1x +2x +2x +2x +  +  +2x +2x +2x +2x +  +  +2x +2x +2x +2x +  +  +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_objects_program DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_objects_super
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_progdir,
+        name    TYPE progdir-name,
+        state   TYPE progdir-state,
+        sqlx    TYPE progdir-sqlx,
+        edtx    TYPE progdir-edtx,
+        varcl   TYPE progdir-varcl,
+        dbapl   TYPE progdir-dbapl,
+        dbna    TYPE progdir-dbna,
+        clas    TYPE progdir-clas,
+        type    TYPE progdir-type,
+        occurs  TYPE progdir-occurs,
+        subc    TYPE progdir-subc,
+        appl    TYPE progdir-appl,
+        secu    TYPE progdir-secu,
+        cnam    TYPE progdir-cnam,
+        cdat    TYPE progdir-cdat,
+        unam    TYPE progdir-unam,
+        udat    TYPE progdir-udat,
+        vern    TYPE progdir-vern,
+        levl    TYPE progdir-levl,
+        rstat   TYPE progdir-rstat,
+        rmand   TYPE progdir-rmand,
+        rload   TYPE progdir-rload,
+        fixpt   TYPE progdir-fixpt,
+        sset    TYPE progdir-sset,
+        sdate   TYPE progdir-sdate,
+        stime   TYPE progdir-stime,
+        idate   TYPE progdir-idate,
+        itime   TYPE progdir-itime,
+        ldbname TYPE progdir-ldbname,
+        uccheck TYPE progdir-uccheck,
+      END OF ty_progdir.
+    TYPES:
+      BEGIN OF ty_cua,
+        adm TYPE rsmpe_adm,
+        sta TYPE STANDARD TABLE OF rsmpe_stat WITH DEFAULT KEY,
+        fun TYPE STANDARD TABLE OF rsmpe_funt WITH DEFAULT KEY,
+        men TYPE STANDARD TABLE OF rsmpe_men WITH DEFAULT KEY,
+        mtx TYPE STANDARD TABLE OF rsmpe_mnlt WITH DEFAULT KEY,
+        act TYPE STANDARD TABLE OF rsmpe_act WITH DEFAULT KEY,
+        but TYPE STANDARD TABLE OF rsmpe_but WITH DEFAULT KEY,
+        pfk TYPE STANDARD TABLE OF rsmpe_pfk WITH DEFAULT KEY,
+        set TYPE STANDARD TABLE OF rsmpe_staf WITH DEFAULT KEY,
+        doc TYPE STANDARD TABLE OF rsmpe_atrt WITH DEFAULT KEY,
+        tit TYPE STANDARD TABLE OF rsmpe_titt WITH DEFAULT KEY,
+        biv TYPE STANDARD TABLE OF rsmpe_buts WITH DEFAULT KEY,
+      END OF ty_cua.
+ 
+    METHODS serialize_program
+      IMPORTING
+        !io_xml     TYPE REF TO zif_abapgit_xml_output OPTIONAL
+        !is_item    TYPE zif_abapgit_definitions=>ty_item
+        !io_files   TYPE REF TO zcl_abapgit_objects_files
+        !iv_program TYPE syrepid OPTIONAL
+        !iv_extra   TYPE clike OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS read_progdir
+      IMPORTING
+        !iv_program       TYPE syrepid
+      RETURNING
+        VALUE(rs_progdir) TYPE ty_progdir.
+    METHODS deserialize_program
+      IMPORTING
+        !is_progdir TYPE ty_progdir
+        !it_source  TYPE abaptxt255_tab
+        !it_tpool   TYPE textpool_table
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+ 
+    TYPES:
+      ty_spaces_tt TYPE STANDARD TABLE OF i WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_dynpro,
+        header     TYPE rpy_dyhead,
+        containers TYPE dycatt_tab,
+        fields     TYPE dyfatc_tab,
+        flow_logic TYPE swydyflow,
+        spaces     TYPE ty_spaces_tt,
+      END OF ty_dynpro .
+    TYPES:
+      ty_dynpro_tt TYPE STANDARD TABLE OF ty_dynpro WITH DEFAULT KEY .
+ 
+    METHODS strip_generation_comments
+      CHANGING
+        ct_source TYPE STANDARD TABLE. " tab of string or charX
+    METHODS serialize_dynpros
+      IMPORTING
+        !iv_program_name TYPE syrepid
+      RETURNING
+        VALUE(rt_dynpro) TYPE ty_dynpro_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS serialize_cua
+      IMPORTING
+        !iv_program_name TYPE syrepid
+      RETURNING
+        VALUE(rs_cua)    TYPE ty_cua
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_dynpros
+      IMPORTING
+        !it_dynpros TYPE ty_dynpro_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_textpool
+      IMPORTING
+        !iv_program    TYPE syrepid
+        !it_tpool      TYPE textpool_table
+        !iv_language   TYPE sy-langu OPTIONAL
+        !iv_is_include TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_cua
+      IMPORTING
+        !iv_program_name TYPE syrepid
+        !is_cua          TYPE ty_cua
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_any_dynpro_locked
+      IMPORTING
+        !iv_program                    TYPE syrepid
+      RETURNING
+        VALUE(rv_is_any_dynpro_locked) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_cua_locked
+      IMPORTING
+        !iv_program             TYPE syrepid
+      RETURNING
+        VALUE(rv_is_cua_locked) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_text_locked
+      IMPORTING
+        !iv_program              TYPE syrepid
+      RETURNING
+        VALUE(rv_is_text_locked) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS add_tpool
+      IMPORTING
+        !it_tpool       TYPE textpool_table
+      RETURNING
+        VALUE(rt_tpool) TYPE zif_abapgit_definitions=>ty_tpool_tt .
+    CLASS-METHODS read_tpool
+      IMPORTING
+        !it_tpool       TYPE zif_abapgit_definitions=>ty_tpool_tt
+      RETURNING
+        VALUE(rt_tpool) TYPE zif_abapgit_definitions=>ty_tpool_tt .
+  PRIVATE SECTION.
+    METHODS:
+      uncondense_flow
+        IMPORTING it_flow        TYPE swydyflow
+                  it_spaces      TYPE ty_spaces_tt
+        RETURNING VALUE(rt_flow) TYPE swydyflow.
+ 
+    CLASS-METHODS auto_correct_cua_adm
+      IMPORTING
+        is_cua TYPE ty_cua
+      CHANGING
+        cs_adm TYPE rsmpe_adm.
+ 
+    METHODS get_program_title
+      IMPORTING
+        !it_tpool       TYPE textpool_table
+      RETURNING
+        VALUE(rv_title) TYPE repti .
+    METHODS insert_program
+      IMPORTING
+        !is_progdir TYPE ty_progdir
+        !it_source  TYPE abaptxt255_tab
+        !iv_title   TYPE repti
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_program
+      IMPORTING
+        !is_progdir TYPE ty_progdir
+        !it_source  TYPE abaptxt255_tab
+        !iv_title   TYPE repti
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_progdir
+      IMPORTING
+        !is_progdir TYPE ty_progdir
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_objects_program IMPLEMENTATION.
+ 
+ 
+  METHOD add_tpool.
+ 
+    FIELD-SYMBOLS: <ls_tpool_in>  LIKE LINE OF it_tpool,
+                   <ls_tpool_out> LIKE LINE OF rt_tpool.
+ 
+ 
+    LOOP AT it_tpool ASSIGNING <ls_tpool_in>.
+      APPEND INITIAL LINE TO rt_tpool ASSIGNING <ls_tpool_out>.
+      MOVE-CORRESPONDING <ls_tpool_in> TO <ls_tpool_out>.
+      IF <ls_tpool_out>-id = 'S'.
+        <ls_tpool_out>-split = <ls_tpool_out>-entry.
+        <ls_tpool_out>-entry = <ls_tpool_out>-entry+8.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD auto_correct_cua_adm.
+    " issue #1807 automatic correction of CUA interfaces saved incorrectly in the past (ADM was not saved in the XML)
+ 
+    CONSTANTS:
+      lc_num_n_space TYPE string VALUE ' 0123456789',
+      lc_num_only    TYPE string VALUE '0123456789'.
+ 
+    FIELD-SYMBOLS:
+      <ls_pfk> TYPE rsmpe_pfk,
+      <ls_act> TYPE rsmpe_act,
+      <ls_men> TYPE rsmpe_men.
+ 
+    IF cs_adm IS NOT INITIAL
+        AND cs_adm-actcode CO lc_num_n_space
+        AND cs_adm-mencode CO lc_num_n_space
+        AND cs_adm-pfkcode CO lc_num_n_space. "Check performed in form check_adm of include LSMPIF03
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT is_cua-act ASSIGNING <ls_act>.
+      IF <ls_act>-code+6(14) IS INITIAL AND <ls_act>-code(6) CO lc_num_only.
+        cs_adm-actcode = <ls_act>-code.
+      ENDIF.
+    ENDLOOP.
+ 
+    LOOP AT is_cua-men ASSIGNING <ls_men>.
+      IF <ls_men>-code+6(14) IS INITIAL AND <ls_men>-code(6) CO lc_num_only.
+        cs_adm-mencode = <ls_men>-code.
+      ENDIF.
+    ENDLOOP.
+ 
+    LOOP AT is_cua-pfk ASSIGNING <ls_pfk>.
+      IF <ls_pfk>-code+6(14) IS INITIAL AND <ls_pfk>-code(6) CO lc_num_only.
+        cs_adm-pfkcode = <ls_pfk>-code.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_cua.
+
+    DATA: ls_tr_key TYPE trkey,
+          ls_adm    TYPE rsmpe_adm.
+
+
+    IF lines( is_cua-sta ) = 0
+        AND lines( is_cua-fun ) = 0
+        AND lines( is_cua-men ) = 0
+        AND lines( is_cua-mtx ) = 0
+        AND lines( is_cua-act ) = 0
+        AND lines( is_cua-but ) = 0
+        AND lines( is_cua-pfk ) = 0
+        AND lines( is_cua-set ) = 0
+        AND lines( is_cua-doc ) = 0
+        AND lines( is_cua-tit ) = 0
+        AND lines( is_cua-biv ) = 0.
+      RETURN.
+    ENDIF.
+
+    SELECT SINGLE devclass INTO ls_tr_key-devclass
+      FROM tadir
+      WHERE pgmid = 'R3TR'
+      AND object = ms_item-obj_type
+      AND obj_name = ms_item-obj_name.                  "#EC CI_GENBUFF
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'not found in tadir' ).
+    ENDIF.
+
+    ls_tr_key-obj_type = ms_item-obj_type.
+    ls_tr_key-obj_name = ms_item-obj_name.
+    ls_tr_key-sub_type = 'CUAD'.
+    ls_tr_key-sub_name = iv_program_name.
+
+    ls_adm = is_cua-adm.
+    auto_correct_cua_adm( EXPORTING is_cua = is_cua CHANGING cs_adm = ls_adm ).
+
+    sy-tcode = 'SE41' ##WRITE_OK. " evil hack, workaround to handle fixes in note 2159455
+    CALL FUNCTION 'RS_CUA_INTERNAL_WRITE'
+      EXPORTING
+        program   = iv_program_name
+        language  = mv_language
+        tr_key    = ls_tr_key
+        adm       = ls_adm
+        state     = 'I'
+      TABLES
+        sta       = is_cua-sta
+        fun       = is_cua-fun
+        men       = is_cua-men
+        mtx       = is_cua-mtx
+        act       = is_cua-act
+        but       = is_cua-but
+        pfk       = is_cua-pfk
+        set       = is_cua-set
+        doc       = is_cua-doc
+        tit       = is_cua-tit
+        biv       = is_cua-biv
+      EXCEPTIONS
+        not_found = 1
+        OTHERS    = 2.
+    IF sy-subrc <> 0.
+* if moving code from SAPlink, see https://github.com/abapGit/abapGit/issues/562
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    zcl_abapgit_objects_activation=>add(
+      iv_type = 'CUAD'
+      iv_name = iv_program_name ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_dynpros.
+
+    CONSTANTS lc_rpyty_force_off TYPE c LENGTH 1 VALUE '/'.
+
+    DATA: lv_name            TYPE dwinactiv-obj_name,
+          lt_d020s_to_delete TYPE TABLE OF d020s,
+          ls_d020s           LIKE LINE OF lt_d020s_to_delete,
+          ls_dynpro          LIKE LINE OF it_dynpros.
+
+    FIELD-SYMBOLS: <ls_field> TYPE rpy_dyfatc.
+
+    " Delete DYNPROs which are not in the list
+    CALL FUNCTION 'RS_SCREEN_LIST'
+      EXPORTING
+        dynnr     = ''
+        progname  = ms_item-obj_name
+      TABLES
+        dynpros   = lt_d020s_to_delete
+      EXCEPTIONS
+        not_found = 1
+        OTHERS    = 2.
+    IF sy-subrc = 2.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    SORT lt_d020s_to_delete BY dnum ASCENDING.
+
+* ls_dynpro is changed by the function module, a field-symbol will cause
+* the program to dump since it_dynpros cannot be changed
+    LOOP AT it_dynpros INTO ls_dynpro.
+
+      READ TABLE lt_d020s_to_delete WITH KEY dnum = ls_dynpro-header-screen
+        TRANSPORTING NO FIELDS
+        BINARY SEARCH.
+      IF sy-subrc = 0.
+        DELETE lt_d020s_to_delete INDEX sy-tabix.
+      ENDIF.
+
+      " todo: kept for compatibility, remove after grace period #3680
+      ls_dynpro-flow_logic = uncondense_flow(
+        it_flow = ls_dynpro-flow_logic
+        it_spaces = ls_dynpro-spaces ).
+
+
+      LOOP AT ls_dynpro-fields ASSIGNING <ls_field>.
+* if the DDIC element has a PARAMETER_ID and the flag "from_dict" is active
+* the import will enable the SET-/GET_PARAM flag. In this case: "force off"
+        IF <ls_field>-param_id IS NOT INITIAL
+            AND <ls_field>-from_dict = abap_true.
+          IF <ls_field>-set_param IS INITIAL.
+            <ls_field>-set_param = lc_rpyty_force_off.
+          ENDIF.
+          IF <ls_field>-get_param IS INITIAL.
+            <ls_field>-get_param = lc_rpyty_force_off.
+          ENDIF.
+        ENDIF.
+
+* If the previous conditions are met the value 'F' will be taken over
+* during de-serialization potentially overlapping other fields in the screen,
+* we set the tag to the correct value 'X'
+        IF <ls_field>-type = 'CHECK'
+            AND <ls_field>-from_dict = abap_true
+            AND <ls_field>-text IS INITIAL
+            AND <ls_field>-modific IS INITIAL.
+          <ls_field>-modific = 'X'.
+        ENDIF.
+
+        "fix for issue #2747:
+        IF <ls_field>-foreignkey IS INITIAL.
+          <ls_field>-foreignkey = lc_rpyty_force_off.
+        ENDIF.
+
+      ENDLOOP.
+
+      CALL FUNCTION 'RPY_DYNPRO_INSERT'
+        EXPORTING
+          header                 = ls_dynpro-header
+          suppress_exist_checks  = abap_true
+        TABLES
+          containers             = ls_dynpro-containers
+          fields_to_containers   = ls_dynpro-fields
+          flow_logic             = ls_dynpro-flow_logic
+        EXCEPTIONS
+          cancelled              = 1
+          already_exists         = 2
+          program_not_exists     = 3
+          not_executed           = 4
+          missing_required_field = 5
+          illegal_field_value    = 6
+          field_not_allowed      = 7
+          not_generated          = 8
+          illegal_field_position = 9
+          OTHERS                 = 10.
+      IF sy-subrc <> 2 AND sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+* todo, RPY_DYNPRO_UPDATE?
+
+      CONCATENATE ls_dynpro-header-program ls_dynpro-header-screen
+        INTO lv_name RESPECTING BLANKS.
+      ASSERT NOT lv_name IS INITIAL.
+
+      zcl_abapgit_objects_activation=>add(
+        iv_type = 'DYNP'
+        iv_name = lv_name ).
+
+    ENDLOOP.
+
+    " Delete obsolete screens
+    LOOP AT lt_d020s_to_delete INTO ls_d020s.
+
+      CALL FUNCTION 'RS_SCRP_DELETE'
+        EXPORTING
+          dynnr                  = ls_d020s-dnum
+          progname               = ms_item-obj_name
+          with_popup             = abap_false
+        EXCEPTIONS
+          enqueued_by_user       = 1
+          enqueue_system_failure = 2
+          not_executed           = 3
+          not_exists             = 4
+          no_modify_permission   = 5
+          popup_canceled         = 6.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_program.
+
+    DATA:
+      lv_progname TYPE reposrc-progname,
+      lv_title    TYPE rglif-title.
+
+    zcl_abapgit_factory=>get_cts_api( )->insert_transport_object(
+      iv_object   = 'ABAP'
+      iv_obj_name = is_progdir-name
+      iv_package  = iv_package
+      iv_language = mv_language ).
+
+    lv_title = get_program_title( it_tpool ).
+
+    " Check if program already exists
+    SELECT SINGLE progname FROM reposrc INTO lv_progname
+      WHERE progname = is_progdir-name
+      AND r3state = 'A'.
+
+    IF sy-subrc = 0.
+      update_program(
+        is_progdir = is_progdir
+        it_source  = it_source
+        iv_title   = lv_title ).
+    ELSE.
+      insert_program(
+        is_progdir = is_progdir
+        it_source  = it_source
+        iv_title   = lv_title
+        iv_package = iv_package ).
+    ENDIF.
+
+    update_progdir( is_progdir ).
+
+    zcl_abapgit_objects_activation=>add(
+      iv_type = 'REPS'
+      iv_name = is_progdir-name ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_textpool.
+
+    DATA lv_language TYPE sy-langu.
+    DATA lv_state    TYPE c.
+    DATA lv_delete   TYPE abap_bool.
+
+    IF iv_language IS INITIAL.
+      lv_language = mv_language.
+    ELSE.
+      lv_language = iv_language.
+    ENDIF.
+
+    IF lv_language = mv_language.
+      lv_state = 'I'. "Textpool in main language needs to be activated
+    ELSE.
+      lv_state = 'A'. "Translations are always active
+    ENDIF.
+
+    IF it_tpool IS INITIAL.
+      IF iv_is_include = abap_false OR lv_state = 'A'.
+        DELETE TEXTPOOL iv_program "Remove initial description from textpool if
+          LANGUAGE lv_language     "original program does not have a textpool
+          STATE lv_state.
+
+        lv_delete = abap_true.
+      ELSE.
+        INSERT TEXTPOOL iv_program "In case of includes: Deletion of textpool in
+          FROM it_tpool            "main language cannot be activated because
+          LANGUAGE lv_language     "this woul activate the deletion of the textpool
+          STATE lv_state.          "of the mail program -> insert empty textpool
+      ENDIF.
+    ELSE.
+      INSERT TEXTPOOL iv_program
+        FROM it_tpool
+        LANGUAGE lv_language
+        STATE lv_state.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( 'error from INSERT TEXTPOOL' ).
+      ENDIF.
+    ENDIF.
+
+    IF lv_state = 'I'. "Textpool in main language needs to be activated
+      zcl_abapgit_objects_activation=>add(
+        iv_type   = 'REPT'
+        iv_name   = iv_program
+        iv_delete = lv_delete ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_program_title.
+ 
+    DATA ls_tpool LIKE LINE OF it_tpool.
+ 
+    FIELD-SYMBOLS <lg_any> TYPE any.
+ 
+    READ TABLE it_tpool INTO ls_tpool WITH KEY id = 'R'.
+    IF sy-subrc = 0.
+      " there is a bug in RPY_PROGRAM_UPDATE, the header line of TTAB is not
+      " cleared, so the title length might be inherited from a different program.
+      ASSIGN ('(SAPLSIFP)TTAB') TO <lg_any>.
+      IF sy-subrc = 0.
+        CLEAR <lg_any>.
+      ENDIF.
+ 
+      rv_title = ls_tpool-entry.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_program.
+
+    CALL FUNCTION 'RPY_PROGRAM_INSERT'
+      EXPORTING
+        development_class = iv_package
+        program_name      = is_progdir-name
+        program_type      = is_progdir-subc
+        title_string      = iv_title
+        save_inactive     = 'I'
+        suppress_dialog   = abap_true
+      TABLES
+        source_extended   = it_source
+      EXCEPTIONS
+        already_exists    = 1
+        cancelled         = 2
+        name_not_allowed  = 3
+        permission_error  = 4
+        OTHERS            = 5.
+    IF sy-subrc = 3.
+
+      " For cases that standard function does not handle (like FUGR),
+      " we save active and inactive version of source with the given PROGRAM TYPE.
+      " Without the active version, the code will not be visible in case of activation errors.
+      zcl_abapgit_factory=>get_sap_report( )->insert_report(
+        iv_name         = is_progdir-name
+        iv_package      = iv_package
+        it_source       = it_source
+        iv_state        = 'A'
+        iv_program_type = is_progdir-subc ).
+
+      zcl_abapgit_factory=>get_sap_report( )->insert_report(
+        iv_name         = is_progdir-name
+        iv_package      = iv_package
+        it_source       = it_source
+        iv_state        = 'I'
+        iv_program_type = is_progdir-subc ).
+
+    ELSEIF sy-subrc > 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD is_any_dynpro_locked.
+ 
+    DATA: lt_dynpros TYPE ty_dynpro_tt,
+          lv_object  TYPE seqg3-garg.
+ 
+    FIELD-SYMBOLS: <ls_dynpro> TYPE ty_dynpro.
+ 
+    lt_dynpros = serialize_dynpros( iv_program ).
+ 
+    LOOP AT lt_dynpros ASSIGNING <ls_dynpro>.
+ 
+      lv_object = |{ <ls_dynpro>-header-screen }{ <ls_dynpro>-header-program }|.
+ 
+      IF exists_a_lock_entry_for( iv_lock_object = 'ESCRP'
+                                  iv_argument    = lv_object ) = abap_true.
+        rv_is_any_dynpro_locked = abap_true.
+        EXIT.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_cua_locked.
+ 
+    DATA: lv_object TYPE eqegraarg.
+ 
+    lv_object = |CU{ iv_program }|.
+    OVERLAY lv_object WITH '                                          '.
+    lv_object = lv_object && '*'.
+ 
+    rv_is_cua_locked = exists_a_lock_entry_for( iv_lock_object = 'ESCUAPAINT'
+                                                iv_argument    = lv_object ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_text_locked.
+ 
+    DATA: lv_object TYPE eqegraarg.
+ 
+    lv_object = |*{ iv_program }|.
+ 
+    rv_is_text_locked = exists_a_lock_entry_for( iv_lock_object = 'EABAPTEXTE'
+                                                 iv_argument    = lv_object ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_progdir.
+ 
+    DATA: ls_sapdir TYPE progdir.
+ 
+ 
+    CALL FUNCTION 'READ_PROGDIR'
+      EXPORTING
+        i_progname = iv_program
+        i_state    = 'A'
+      IMPORTING
+        e_progdir  = ls_sapdir.
+    MOVE-CORRESPONDING ls_sapdir TO rs_progdir.
+ 
+    CLEAR: rs_progdir-edtx,
+           rs_progdir-cnam,
+           rs_progdir-cdat,
+           rs_progdir-unam,
+           rs_progdir-udat,
+           rs_progdir-levl,
+           rs_progdir-vern,
+           rs_progdir-rmand,
+           rs_progdir-sdate,
+           rs_progdir-stime,
+           rs_progdir-idate,
+           rs_progdir-itime,
+           rs_progdir-varcl,
+           rs_progdir-state.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_tpool.
+ 
+    FIELD-SYMBOLS: <ls_tpool_in>  LIKE LINE OF it_tpool,
+                   <ls_tpool_out> LIKE LINE OF rt_tpool.
+ 
+ 
+    LOOP AT it_tpool ASSIGNING <ls_tpool_in>.
+      APPEND INITIAL LINE TO rt_tpool ASSIGNING <ls_tpool_out>.
+      MOVE-CORRESPONDING <ls_tpool_in> TO <ls_tpool_out>.
+      IF <ls_tpool_out>-id = 'S'.
+        CONCATENATE <ls_tpool_in>-split <ls_tpool_in>-entry
+          INTO <ls_tpool_out>-entry
+          RESPECTING BLANKS.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_cua.
+ 
+    CALL FUNCTION 'RS_CUA_INTERNAL_FETCH'
+      EXPORTING
+        program         = iv_program_name
+        language        = mv_language
+        state           = 'A'
+      IMPORTING
+        adm             = rs_cua-adm
+      TABLES
+        sta             = rs_cua-sta
+        fun             = rs_cua-fun
+        men             = rs_cua-men
+        mtx             = rs_cua-mtx
+        act             = rs_cua-act
+        but             = rs_cua-but
+        pfk             = rs_cua-pfk
+        set             = rs_cua-set
+        doc             = rs_cua-doc
+        tit             = rs_cua-tit
+        biv             = rs_cua-biv
+      EXCEPTIONS
+        not_found       = 1
+        unknown_version = 2
+        OTHERS          = 3.
+    IF sy-subrc > 1.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_dynpros.
+    DATA: ls_header               TYPE rpy_dyhead,
+          lt_containers           TYPE dycatt_tab,
+          lt_fields_to_containers TYPE dyfatc_tab,
+          lt_flow_logic           TYPE swydyflow,
+          lt_d020s                TYPE TABLE OF d020s,
+          lt_fieldlist_int        TYPE TABLE OF d021s. "internal format
+ 
+    FIELD-SYMBOLS: <ls_d020s>       LIKE LINE OF lt_d020s,
+                   <lv_outputstyle> TYPE scrpostyle,
+                   <ls_container>   LIKE LINE OF lt_containers,
+                   <ls_field>       LIKE LINE OF lt_fields_to_containers,
+                   <ls_dynpro>      LIKE LINE OF rt_dynpro,
+                   <ls_field_int>   LIKE LINE OF lt_fieldlist_int.
+ 
+    "#2746: relevant flag values (taken from include MSEUSBIT)
+    CONSTANTS: lc_flg1ddf TYPE x VALUE '20',
+               lc_flg3fku TYPE x VALUE '08',
+               lc_flg3for TYPE x VALUE '04',
+               lc_flg3fdu TYPE x VALUE '02'.
+ 
+ 
+    CALL FUNCTION 'RS_SCREEN_LIST'
+      EXPORTING
+        dynnr     = ''
+        progname  = iv_program_name
+      TABLES
+        dynpros   = lt_d020s
+      EXCEPTIONS
+        not_found = 1
+        OTHERS    = 2.
+    IF sy-subrc = 2.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    SORT lt_d020s BY dnum ASCENDING.
+ 
+* loop dynpros and skip generated selection screens
+    LOOP AT lt_d020s ASSIGNING <ls_d020s>
+        WHERE type <> 'S' AND type <> 'W' AND type <> 'J'
+        AND NOT dnum IS INITIAL.
+ 
+      CALL FUNCTION 'RPY_DYNPRO_READ'
+        EXPORTING
+          progname             = iv_program_name
+          dynnr                = <ls_d020s>-dnum
+        IMPORTING
+          header               = ls_header
+        TABLES
+          containers           = lt_containers
+          fields_to_containers = lt_fields_to_containers
+          flow_logic           = lt_flow_logic
+        EXCEPTIONS
+          cancelled            = 1
+          not_found            = 2
+          permission_error     = 3
+          OTHERS               = 4.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+ 
+      "#2746: we need the dynpro fields in internal format:
+      FREE lt_fieldlist_int.
+ 
+      CALL FUNCTION 'RPY_DYNPRO_READ_NATIVE'
+        EXPORTING
+          progname  = iv_program_name
+          dynnr     = <ls_d020s>-dnum
+        TABLES
+          fieldlist = lt_fieldlist_int.
+ 
+ 
+      LOOP AT lt_fields_to_containers ASSIGNING <ls_field>.
+* output style is a NUMC field, the XML conversion will fail if it contains invalid value
+* field does not exist in all versions
+        ASSIGN COMPONENT 'OUTPUTSTYLE' OF STRUCTURE <ls_field> TO <lv_outputstyle>.
+        IF sy-subrc = 0 AND <lv_outputstyle> = '  '.
+          CLEAR <lv_outputstyle>.
+        ENDIF.
+ 
+        "2746: we apply the same logic as in SAPLWBSCREEN
+        "for setting or unsetting the foreignkey field:
+        UNASSIGN <ls_field_int>.
+        READ TABLE lt_fieldlist_int ASSIGNING <ls_field_int> WITH KEY fnam = <ls_field>-name.
+        IF <ls_field_int> IS ASSIGNED.
+          IF <ls_field_int>-flg1 O lc_flg1ddf AND
+              <ls_field_int>-flg3 O lc_flg3for AND
+              <ls_field_int>-flg3 Z lc_flg3fdu AND
+              <ls_field_int>-flg3 Z lc_flg3fku.
+            <ls_field>-foreignkey = 'X'.
+          ELSE.
+            CLEAR <ls_field>-foreignkey.
+          ENDIF.
+        ENDIF.
+ 
+        IF <ls_field>-from_dict = abap_true AND
+           <ls_field>-modific   <> 'F' AND
+           <ls_field>-modific   <> 'X'.
+          CLEAR <ls_field>-text.
+        ENDIF.
+      ENDLOOP.
+ 
+      LOOP AT lt_containers ASSIGNING <ls_container>.
+        IF <ls_container>-c_resize_v = abap_false.
+          CLEAR <ls_container>-c_line_min.
+        ENDIF.
+        IF <ls_container>-c_resize_h = abap_false.
+          CLEAR <ls_container>-c_coln_min.
+        ENDIF.
+      ENDLOOP.
+ 
+      APPEND INITIAL LINE TO rt_dynpro ASSIGNING <ls_dynpro>.
+      <ls_dynpro>-header     = ls_header.
+      <ls_dynpro>-containers = lt_containers.
+      <ls_dynpro>-fields     = lt_fields_to_containers.
+ 
+      <ls_dynpro>-flow_logic = lt_flow_logic.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_program.
+
+    DATA: ls_progdir      TYPE ty_progdir,
+          lv_program_name TYPE syrepid,
+          lt_dynpros      TYPE ty_dynpro_tt,
+          ls_cua          TYPE ty_cua,
+          lt_source       TYPE TABLE OF abaptxt255,
+          lt_tpool        TYPE textpool_table,
+          ls_tpool        LIKE LINE OF lt_tpool,
+          li_xml          TYPE REF TO zif_abapgit_xml_output.
+
+    IF iv_program IS INITIAL.
+      lv_program_name = is_item-obj_name.
+    ELSE.
+      lv_program_name = iv_program.
+    ENDIF.
+
+    zcl_abapgit_language=>set_current_language( mv_language ).
+
+    CALL FUNCTION 'RPY_PROGRAM_READ'
+      EXPORTING
+        program_name     = lv_program_name
+        with_includelist = abap_false
+        with_lowercase   = abap_true
+      TABLES
+        source_extended  = lt_source
+        textelements     = lt_tpool
+      EXCEPTIONS
+        cancelled        = 1
+        not_found        = 2
+        permission_error = 3
+        OTHERS           = 4.
+
+    IF sy-subrc = 2.
+      zcl_abapgit_language=>restore_login_language( ).
+      RETURN.
+    ELSEIF sy-subrc <> 0.
+      zcl_abapgit_language=>restore_login_language( ).
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    zcl_abapgit_language=>restore_login_language( ).
+
+    ls_progdir = read_progdir( lv_program_name ).
+
+    IF io_xml IS BOUND.
+      li_xml = io_xml.
+    ELSE.
+      CREATE OBJECT li_xml TYPE zcl_abapgit_xml_output.
+    ENDIF.
+
+    li_xml->add( iv_name = 'PROGDIR'
+                 ig_data = ls_progdir ).
+    IF ls_progdir-subc = '1' OR ls_progdir-subc = 'M'.
+      lt_dynpros = serialize_dynpros( lv_program_name ).
+      li_xml->add( iv_name = 'DYNPROS'
+                   ig_data = lt_dynpros ).
+
+      ls_cua = serialize_cua( lv_program_name ).
+      IF NOT ls_cua IS INITIAL.
+        li_xml->add( iv_name = 'CUA'
+                     ig_data = ls_cua ).
+      ENDIF.
+    ENDIF.
+
+    READ TABLE lt_tpool WITH KEY id = 'R' INTO ls_tpool.
+    IF sy-subrc = 0 AND ls_tpool-key = '' AND ls_tpool-length = 0.
+      DELETE lt_tpool INDEX sy-tabix.
+    ENDIF.
+
+    li_xml->add( iv_name = 'TPOOL'
+                 ig_data = add_tpool( lt_tpool ) ).
+
+    IF NOT io_xml IS BOUND.
+      io_files->add_xml( iv_extra = iv_extra
+                         ii_xml   = li_xml ).
+    ENDIF.
+
+    strip_generation_comments( CHANGING ct_source = lt_source ).
+
+    io_files->add_abap( iv_extra = iv_extra
+                        it_abap  = lt_source ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD strip_generation_comments.
+ 
+    FIELD-SYMBOLS <lv_line> TYPE any. " Assuming CHAR (e.g. abaptxt255_tab) or string (FUGR)
+ 
+    IF ms_item-obj_type <> 'FUGR'.
+      RETURN.
+    ENDIF.
+ 
+    " Case 1: MV FM main prog and TOPs
+    READ TABLE ct_source INDEX 1 ASSIGNING <lv_line>.
+    IF sy-subrc = 0 AND <lv_line> CP '#**regenerated at *'.
+      DELETE ct_source INDEX 1.
+      RETURN.
+    ENDIF.
+ 
+    " Case 2: MV FM includes
+    IF lines( ct_source ) < 5. " Generation header length
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 1 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP '#*---*'.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 2 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP '#**'.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 3 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP '#**generation date:*'.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 4 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP '#**generator version:*'.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE ct_source INDEX 5 ASSIGNING <lv_line>.
+    ASSERT sy-subrc = 0.
+    IF NOT <lv_line> CP '#*---*'.
+      RETURN.
+    ENDIF.
+ 
+    DELETE ct_source INDEX 4.
+    DELETE ct_source INDEX 3.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD uncondense_flow.
+ 
+    DATA: lv_spaces LIKE LINE OF it_spaces.
+ 
+    FIELD-SYMBOLS: <ls_flow>   LIKE LINE OF it_flow,
+                   <ls_output> LIKE LINE OF rt_flow.
+ 
+ 
+    LOOP AT it_flow ASSIGNING <ls_flow>.
+      APPEND INITIAL LINE TO rt_flow ASSIGNING <ls_output>.
+      <ls_output>-line = <ls_flow>-line.
+ 
+      READ TABLE it_spaces INDEX sy-tabix INTO lv_spaces.
+      IF sy-subrc = 0.
+        SHIFT <ls_output>-line RIGHT BY lv_spaces PLACES IN CHARACTER MODE.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update_progdir.
+
+    DATA ls_progdir_new TYPE progdir.
+
+    CALL FUNCTION 'READ_PROGDIR'
+      EXPORTING
+        i_progname = is_progdir-name
+        i_state    = 'I'
+      IMPORTING
+        e_progdir  = ls_progdir_new
+      EXCEPTIONS
+        not_exists = 1
+        OTHERS     = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error reading program directory' ).
+    ENDIF.
+
+    ls_progdir_new-ldbname = is_progdir-ldbname.
+    ls_progdir_new-dbna    = is_progdir-dbna.
+    ls_progdir_new-dbapl   = is_progdir-dbapl.
+    ls_progdir_new-rload   = is_progdir-rload.
+    ls_progdir_new-fixpt   = is_progdir-fixpt.
+    ls_progdir_new-varcl   = is_progdir-varcl.
+    ls_progdir_new-appl    = is_progdir-appl.
+    ls_progdir_new-rstat   = is_progdir-rstat.
+    ls_progdir_new-sqlx    = is_progdir-sqlx.
+    ls_progdir_new-uccheck = is_progdir-uccheck.
+    ls_progdir_new-clas    = is_progdir-clas.
+    ls_progdir_new-secu    = is_progdir-secu.
+
+    CALL FUNCTION 'UPDATE_PROGDIR'
+      EXPORTING
+        i_progdir    = ls_progdir_new
+        i_progname   = ls_progdir_new-name
+        i_state      = ls_progdir_new-state
+      EXCEPTIONS
+        not_executed = 1
+        OTHERS       = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error updating program directory' ).
+    ENDIF.
+
+    " function UPDATE_PROGDIR does not update VARCL, so we do it here
+    SELECT SINGLE * FROM progdir INTO ls_progdir_new
+      WHERE name  = ls_progdir_new-name
+        AND state = ls_progdir_new-state.
+    IF sy-subrc = 0 AND is_progdir-varcl <> ls_progdir_new-varcl.
+      UPDATE progdir SET varcl = is_progdir-varcl
+        WHERE name  = ls_progdir_new-name
+          AND state = ls_progdir_new-state.               "#EC CI_SUBRC
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD update_program.
+
+    zcl_abapgit_language=>set_current_language( mv_language ).
+
+    CALL FUNCTION 'RPY_PROGRAM_UPDATE'
+      EXPORTING
+        program_name     = is_progdir-name
+        title_string     = iv_title
+        save_inactive    = 'I'
+      TABLES
+        source_extended  = it_source
+      EXCEPTIONS
+        cancelled        = 1
+        permission_error = 2
+        not_found        = 3
+        OTHERS           = 4.
+
+    IF sy-subrc <> 0.
+      zcl_abapgit_language=>restore_login_language( ).
+
+      IF sy-msgid = 'EU' AND sy-msgno = '510'.
+        zcx_abapgit_exception=>raise( 'User is currently editing program' ).
+      ELSEIF sy-msgid = 'EU' AND sy-msgno = '522'.
+        " for generated table maintenance function groups, the author is set to SAP* instead of the user which
+        " generates the function group. This hits some standard checks, pulling new code again sets the author
+        " to the current user which avoids the check
+        zcx_abapgit_exception=>raise( |Delete function group and pull again, { is_progdir-name } (EU522)| ).
+      ELSE.
+        zcx_abapgit_exception=>raise_t100( ).
+      ENDIF.
+    ENDIF.
+
+    zcl_abapgit_language=>restore_login_language( ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_objects_program.clas.testclasses.abap.html b/src/objects/zcl_abapgit_objects_program.clas.testclasses.abap.html new file mode 100644 index 00000000000..9c9d383ed1d --- /dev/null +++ b/src/objects/zcl_abapgit_objects_program.clas.testclasses.abap.html @@ -0,0 +1,451 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_objects_program.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_objects_program.clas.testclasses.abap

+
+ +
+ 100% + Statements + 122/122 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 122/122 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +1231x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PRIVATE SECTION.
+    METHODS strip_generation_comments_1 FOR TESTING.
+    METHODS strip_generation_comments_2 FOR TESTING.
+ENDCLASS.
+ 
+CLASS zcl_abapgit_objects_program DEFINITION LOCAL FRIENDS ltcl_test.
+ 
+CLASS ltcl_test IMPLEMENTATION.
+  METHOD strip_generation_comments_1.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_objects_program.
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lt_src_orig TYPE abaptxt255_tab.
+    DATA lt_src_act TYPE abaptxt255_tab.
+    DATA lt_src_exp TYPE abaptxt255_tab.
+ 
+ 
+    APPEND '*---------------------------------------------------------------------*' TO lt_src_orig.
+    APPEND '*    view related data declarations' TO lt_src_orig.
+    APPEND '*   generation date: 03.02.2022 at 13:19:02' TO lt_src_orig.
+    APPEND '*   view maintenance generator version: #001407#' TO lt_src_orig.
+    APPEND '*---------------------------------------------------------------------*' TO lt_src_orig.
+    APPEND 'some code starts here' TO lt_src_orig.
+ 
+    APPEND '*---------------------------------------------------------------------*' TO lt_src_exp.
+    APPEND '*    view related data declarations' TO lt_src_exp.
+    APPEND '*---------------------------------------------------------------------*' TO lt_src_exp.
+    APPEND 'some code starts here' TO lt_src_exp.
+ 
+    " case 1, not FUGR, should skip
+    ls_item-obj_type = 'PROG'.
+    CREATE OBJECT lo_cut
+      EXPORTING
+        iv_language = 'E'
+        is_item     = ls_item.
+ 
+    lt_src_act = lt_src_orig.
+    lo_cut->strip_generation_comments( CHANGING ct_source = lt_src_act ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_src_act
+      exp = lt_src_orig ).
+ 
+    " case 2, FUGR
+    ls_item-obj_type = 'FUGR'.
+    CREATE OBJECT lo_cut
+      EXPORTING
+        iv_language = 'E'
+        is_item     = ls_item.
+ 
+    lt_src_act = lt_src_orig.
+    lo_cut->strip_generation_comments( CHANGING ct_source = lt_src_act ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_src_act
+      exp = lt_src_exp ).
+ 
+    " case 3, wrong pattern
+ 
+    CLEAR lt_src_orig.
+    APPEND '*---------------------------------------------------------------------*' TO lt_src_orig.
+    APPEND '* extra line' TO lt_src_orig.
+    APPEND '*    view related data declarations' TO lt_src_orig.
+    APPEND '*   generation date: 03.02.2022 at 13:19:02' TO lt_src_orig.
+    APPEND '*   view maintenance generator version: #001407#' TO lt_src_orig.
+    APPEND '*---------------------------------------------------------------------*' TO lt_src_orig.
+    APPEND 'some code starts here' TO lt_src_orig.
+ 
+    ls_item-obj_type = 'FUGR'.
+    CREATE OBJECT lo_cut
+      EXPORTING
+        iv_language = 'E'
+        is_item     = ls_item.
+ 
+    lt_src_act = lt_src_orig.
+    lo_cut->strip_generation_comments( CHANGING ct_source = lt_src_act ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_src_act
+      exp = lt_src_orig ).
+ 
+  ENDMETHOD.
+ 
+  METHOD strip_generation_comments_2.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_objects_program.
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lt_src_orig TYPE abaptxt255_tab.
+    DATA lt_src_act TYPE abaptxt255_tab.
+    DATA lt_src_exp TYPE abaptxt255_tab.
+ 
+ 
+    APPEND '* regenerated at 06.06.2022 10:47:40' TO lt_src_orig.
+    APPEND 'some code 1' TO lt_src_orig.
+    APPEND 'some code 2' TO lt_src_orig.
+    APPEND 'some code 3' TO lt_src_orig.
+    APPEND 'some code 4' TO lt_src_orig.
+    APPEND 'some code 5' TO lt_src_orig.
+ 
+    APPEND 'some code 1' TO lt_src_exp.
+    APPEND 'some code 2' TO lt_src_exp.
+    APPEND 'some code 3' TO lt_src_exp.
+    APPEND 'some code 4' TO lt_src_exp.
+    APPEND 'some code 5' TO lt_src_exp.
+ 
+    " case 1, not FUGR, should skip
+    ls_item-obj_type = 'FUGR'.
+    CREATE OBJECT lo_cut
+      EXPORTING
+        iv_language = 'E'
+        is_item     = ls_item.
+ 
+    lt_src_act = lt_src_orig.
+    lo_cut->strip_generation_comments( CHANGING ct_source = lt_src_act ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_src_act
+      exp = lt_src_exp ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/objects/zcl_abapgit_objects_super.clas.abap.html b/src/objects/zcl_abapgit_objects_super.clas.abap.html new file mode 100644 index 00000000000..f71b91aade9 --- /dev/null +++ b/src/objects/zcl_abapgit_objects_super.clas.abap.html @@ -0,0 +1,1252 @@ + + + + + + Code coverage report for src/objects/zcl_abapgit_objects_super.clas.abap + + + + + + + + + +
+
+

All files / src/objects zcl_abapgit_objects_super.clas.abap

+
+ +
+ 47.3% + Statements + 184/389 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 11.11% + Functions + 1/9 +
+ + +
+ 47.3% + Lines + 184/389 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +3901x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_objects_super DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC
+  GLOBAL FRIENDS zcl_abapgit_objects .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_user_unknown TYPE syuname VALUE 'UNKNOWN'.
+ 
+    METHODS constructor
+      IMPORTING
+        !is_item     TYPE zif_abapgit_definitions=>ty_item
+        !iv_language TYPE spras .
+  PROTECTED SECTION.
+ 
+    DATA ms_item TYPE zif_abapgit_definitions=>ty_item .
+    DATA mo_i18n_params TYPE REF TO zcl_abapgit_i18n_params .
+    DATA mv_language TYPE spras .
+ 
+    METHODS get_metadata
+      RETURNING
+        VALUE(rs_metadata) TYPE zif_abapgit_definitions=>ty_metadata .
+    METHODS corr_insert
+      IMPORTING
+        !iv_package      TYPE devclass
+        !ig_object_class TYPE any OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS tadir_insert
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    METHODS tadir_delete
+      RAISING
+        zcx_abapgit_exception .
+    METHODS exists_a_lock_entry_for
+      IMPORTING
+        !iv_lock_object               TYPE string
+        !iv_argument                  TYPE seqg3-garg OPTIONAL
+      RETURNING
+        VALUE(rv_exists_a_lock_entry) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_default_package
+      IMPORTING
+        !iv_package TYPE devclass .
+    METHODS set_default_transport
+      IMPORTING
+        !iv_transport TYPE trkorr.
+    METHODS serialize_longtexts
+      IMPORTING
+        !ii_xml           TYPE REF TO zif_abapgit_xml_output
+        !iv_longtext_id   TYPE dokil-id OPTIONAL
+        !it_dokil         TYPE zif_abapgit_definitions=>ty_dokil_tt OPTIONAL
+        !iv_longtext_name TYPE string DEFAULT 'LONGTEXTS'
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_longtexts
+      IMPORTING
+        !ii_xml           TYPE REF TO zif_abapgit_xml_input
+        !iv_longtext_id   TYPE dokil-id OPTIONAL
+        !iv_longtext_name TYPE string DEFAULT 'LONGTEXTS'
+      RAISING
+        zcx_abapgit_exception .
+    METHODS delete_longtexts
+      IMPORTING
+        !iv_longtext_id TYPE dokil-id
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_active
+      RETURNING
+        VALUE(rv_active) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS delete_ddic
+      IMPORTING
+        VALUE(iv_objtype)              TYPE string
+        VALUE(iv_no_ask)               TYPE abap_bool DEFAULT abap_true
+        VALUE(iv_no_ask_delete_append) TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_OBJECTS_SUPER IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    ms_item = is_item.
+    ASSERT NOT ms_item IS INITIAL.
+    mv_language = iv_language.
+    ASSERT NOT mv_language IS INITIAL.
+  ENDMETHOD.
+ 
+ 
+  METHOD corr_insert.
+
+    DATA: lv_object       TYPE trobj_name,
+          lv_object_class TYPE tadir-object.
+
+    IF ig_object_class IS NOT INITIAL.
+      lv_object_class = ig_object_class.
+      IF ig_object_class = 'DICT'.
+        CONCATENATE ms_item-obj_type ms_item-obj_name INTO lv_object.
+      ELSE.
+        lv_object = ms_item-obj_name.
+      ENDIF.
+    ELSE.
+      lv_object_class = ms_item-obj_type.
+      lv_object       = ms_item-obj_name.
+    ENDIF.
+
+    zcl_abapgit_factory=>get_cts_api( )->insert_transport_object(
+      iv_object   = lv_object_class
+      iv_obj_name = lv_object
+      iv_package  = iv_package
+      iv_language = mv_language ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_ddic.
+
+    DATA: lv_objname TYPE rsedd0-ddobjname,
+          lv_objtype TYPE rsedd0-ddobjtype.
+
+    lv_objname = ms_item-obj_name.
+    lv_objtype = iv_objtype.
+
+    TRY.
+        CALL FUNCTION 'RS_DD_DELETE_OBJ'
+          EXPORTING
+            no_ask               = iv_no_ask
+            objname              = lv_objname
+            objtype              = lv_objtype
+            no_ask_delete_append = iv_no_ask_delete_append
+          EXCEPTIONS
+            not_executed         = 1
+            object_not_found     = 2
+            object_not_specified = 3
+            permission_failure   = 4
+            dialog_needed        = 5
+            OTHERS               = 6.
+      CATCH cx_sy_dyn_call_param_not_found.
+        TRY.
+            " try to force deletion for APPENDs
+            CALL FUNCTION 'RS_DD_DELETE_OBJ'
+              EXPORTING
+                no_ask               = iv_no_ask
+                objname              = lv_objname
+                objtype              = lv_objtype
+                aie_force_deletion   = iv_no_ask_delete_append
+              EXCEPTIONS
+                not_executed         = 1
+                object_not_found     = 2
+                object_not_specified = 3
+                permission_failure   = 4
+                dialog_needed        = 5
+                OTHERS               = 6.
+          CATCH cx_sy_dyn_call_param_not_found.
+            " no_ask_delete_append and aie_force_deletion not available in lower releases
+            CALL FUNCTION 'RS_DD_DELETE_OBJ'
+              EXPORTING
+                no_ask               = iv_no_ask
+                objname              = lv_objname
+                objtype              = lv_objtype
+              EXCEPTIONS
+                not_executed         = 1
+                object_not_found     = 2
+                object_not_specified = 3
+                permission_failure   = 4
+                dialog_needed        = 5
+                OTHERS               = 6.
+        ENDTRY.
+    ENDTRY.
+
+    IF sy-subrc = 5.
+      zcx_abapgit_exception=>raise( |Object { ms_item-obj_type } { ms_item-obj_name
+                                    } has dependencies and must be deleted manually| ).
+    ELSEIF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error deleting { ms_item-obj_type } { ms_item-obj_name }| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_longtexts.
+
+    zcl_abapgit_factory=>get_longtexts( )->delete(
+        iv_longtext_id = iv_longtext_id
+        iv_object_name = ms_item-obj_name  ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_longtexts.
+ 
+    zcl_abapgit_factory=>get_longtexts( )->deserialize(
+      ii_xml           = ii_xml
+      iv_longtext_name = iv_longtext_name
+      iv_object_name   = ms_item-obj_name
+      iv_longtext_id   = iv_longtext_id
+      iv_main_language = mv_language ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD exists_a_lock_entry_for.
+ 
+    DATA: lt_lock_entries TYPE STANDARD TABLE OF seqg3.
+ 
+    CALL FUNCTION 'ENQUEUE_READ'
+      EXPORTING
+        guname                = '*'
+        garg                  = iv_argument
+      TABLES
+        enq                   = lt_lock_entries
+      EXCEPTIONS
+        communication_failure = 1
+        system_failure        = 2
+        OTHERS                = 3.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    READ TABLE lt_lock_entries TRANSPORTING NO FIELDS
+                               WITH KEY gobj = iv_lock_object.
+    IF sy-subrc = 0.
+      rv_exists_a_lock_entry = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_metadata.
+ 
+    DATA: lv_class TYPE string.
+ 
+    lv_class = cl_abap_classdescr=>describe_by_object_ref( me )->get_relative_name( ).
+ 
+    REPLACE FIRST OCCURRENCE OF 'ZCL_ABAPGIT' IN lv_class WITH 'LCL'.
+ 
+    rs_metadata-class = lv_class.
+    rs_metadata-version = 'v1.0.0'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_active.
+ 
+    rv_active = zcl_abapgit_objects_activation=>is_active( ms_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize_longtexts.
+
+    zcl_abapgit_factory=>get_longtexts( )->serialize(
+        iv_object_name   = ms_item-obj_name
+        iv_longtext_name = iv_longtext_name
+        iv_longtext_id   = iv_longtext_id
+        it_dokil         = it_dokil
+        io_i18n_params   = mo_i18n_params
+        ii_xml           = ii_xml  ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_default_package.
+
+    " In certain cases we need to set the package via ABAP memory
+    " because we can't supply it via the APIs.
+    "
+    " Set default package, see function module RS_CORR_INSERT FORM get_current_devclass.
+    "
+    " We use ABAP memory instead the SET parameter because it is
+    " more reliable. SET parameter doesn't work when multiple objects
+    " are deserialized which uses the ABAP memory mechanism.
+    " We don't need to reset the memory as it is done in above mentioned form routine.
+
+    EXPORT current_devclass FROM iv_package TO MEMORY ID 'EUK'.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_default_transport.
+
+    " In certain cases we need to set the transport via ABAP memory
+    " because we can't supply it via the APIs.
+    "
+    " See function module RS_CORR_INSERT
+
+    EXPORT tasknr FROM iv_transport TO MEMORY ID 'EUT'.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD tadir_delete.
+
+    CALL FUNCTION 'TR_TADIR_INTERFACE'
+      EXPORTING
+        wi_delete_tadir_entry          = abap_true
+        wi_tadir_pgmid                 = 'R3TR'
+        wi_tadir_object                = ms_item-obj_type
+        wi_tadir_obj_name              = ms_item-obj_name
+        wi_test_modus                  = abap_false
+      EXCEPTIONS
+        tadir_entry_not_existing       = 1
+        tadir_entry_ill_type           = 2
+        no_systemname                  = 3
+        no_systemtype                  = 4
+        original_system_conflict       = 5
+        object_reserved_for_devclass   = 6
+        object_exists_global           = 7
+        object_exists_local            = 8
+        object_is_distributed          = 9
+        obj_specification_not_unique   = 10
+        no_authorization_to_delete     = 11
+        devclass_not_existing          = 12
+        simultanious_set_remove_repair = 13
+        order_missing                  = 14
+        no_modification_of_head_syst   = 15
+        pgmid_object_not_allowed       = 16
+        masterlanguage_not_specified   = 17
+        devclass_not_specified         = 18
+        specify_owner_unique           = 19
+        loc_priv_objs_no_repair        = 20
+        gtadir_not_reached             = 21
+        object_locked_for_order        = 22
+        change_of_class_not_allowed    = 23
+        no_change_from_sap_to_tmp      = 24
+        OTHERS                         = 25.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD tadir_insert.
+
+    CALL FUNCTION 'TR_TADIR_INTERFACE'
+      EXPORTING
+        wi_test_modus                  = abap_false
+        wi_tadir_pgmid                 = 'R3TR'
+        wi_tadir_object                = ms_item-obj_type
+        wi_tadir_obj_name              = ms_item-obj_name
+        wi_tadir_author                = sy-uname
+        wi_tadir_devclass              = iv_package
+        wi_tadir_masterlang            = mv_language
+        iv_delflag                     = abap_false
+      EXCEPTIONS
+        tadir_entry_not_existing       = 1
+        tadir_entry_ill_type           = 2
+        no_systemname                  = 3
+        no_systemtype                  = 4
+        original_system_conflict       = 5
+        object_reserved_for_devclass   = 6
+        object_exists_global           = 7
+        object_exists_local            = 8
+        object_is_distributed          = 9
+        obj_specification_not_unique   = 10
+        no_authorization_to_delete     = 11
+        devclass_not_existing          = 12
+        simultanious_set_remove_repair = 13
+        order_missing                  = 14
+        no_modification_of_head_syst   = 15
+        pgmid_object_not_allowed       = 16
+        masterlanguage_not_specified   = 17
+        devclass_not_specified         = 18
+        specify_owner_unique           = 19
+        loc_priv_objs_no_repair        = 20
+        gtadir_not_reached             = 21
+        object_locked_for_order        = 22
+        change_of_class_not_allowed    = 23
+        no_change_from_sap_to_tmp      = 24
+        OTHERS                         = 25.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/index.html b/src/persist/index.html new file mode 100644 index 00000000000..8a2946fa05c --- /dev/null +++ b/src/persist/index.html @@ -0,0 +1,281 @@ + + + + + + Code coverage report for src/persist + + + + + + + + + +
+
+

All files src/persist

+
+ +
+ 77.28% + Statements + 1732/2241 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/37 +
+ + +
+ 77.28% + Lines + 1732/2241 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_persist_background.clas.abap +
+
88%154/175100%0/00%0/288%154/175
zcl_abapgit_persist_factory.clas.abap +
+
93.22%55/590%0/2100%0/093.22%55/59
zcl_abapgit_persist_injector.clas.abap +
+
100%48/48100%0/0100%0/0100%48/48
zcl_abapgit_persist_migrate.clas.abap +
+
100%321/321100%0/0100%0/0100%321/321
zcl_abapgit_persist_migrate.clas.locals_imp.abap +
+
82.85%58/70100%0/00%0/182.85%58/70
zcl_abapgit_persist_packages.clas.abap +
+
74.35%116/156100%0/00%0/274.35%116/156
zcl_abapgit_persist_packages.clas.testclasses.abap +
+
35.29%24/68100%0/00%0/235.29%24/68
zcl_abapgit_persist_settings.clas.abap +
+
69.33%52/75100%0/00%0/169.33%52/75
zcl_abapgit_persistence_db.clas.abap +
+
72.02%206/286100%0/00%0/572.02%206/286
zcl_abapgit_persistence_repo.clas.abap +
+
75.54%275/364100%0/00%0/675.54%275/364
zcl_abapgit_persistence_user.clas.abap +
+
76.98%388/504100%0/00%0/1376.98%388/504
zcl_abapgit_persistence_user.clas.testclasses.abap +
+
30.43%35/115100%0/00%0/530.43%35/115
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persist_background.clas.abap.html b/src/persist/zcl_abapgit_persist_background.clas.abap.html new file mode 100644 index 00000000000..aebc1bbeda3 --- /dev/null +++ b/src/persist/zcl_abapgit_persist_background.clas.abap.html @@ -0,0 +1,610 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persist_background.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persist_background.clas.abap

+
+ +
+ 88% + Statements + 154/175 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 88% + Lines + 154/175 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +1761x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_persist_background DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_xml,
+        method   TYPE string,
+        username TYPE string,
+        password TYPE string,
+        settings TYPE zif_abapgit_background=>ty_settings_tt,
+      END OF ty_xml .
+    TYPES:
+      BEGIN OF ty_background,
+        key TYPE zif_abapgit_persistence=>ty_value.
+        INCLUDE TYPE ty_xml.
+    TYPES: END OF ty_background .
+    TYPES:
+      ty_background_keys TYPE STANDARD TABLE OF ty_background WITH DEFAULT KEY .
+ 
+    METHODS constructor .
+    METHODS list
+      RETURNING
+        VALUE(rt_list) TYPE ty_background_keys
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_by_key
+      IMPORTING
+        !iv_key        TYPE ty_background-key
+      RETURNING
+        VALUE(rs_data) TYPE ty_background
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found .
+    METHODS modify
+      IMPORTING
+        !is_data TYPE ty_background
+      RAISING
+        zcx_abapgit_exception .
+    METHODS delete
+      IMPORTING
+        !iv_key TYPE ty_background-key
+      RAISING
+        zcx_abapgit_exception .
+    METHODS exists
+      IMPORTING
+        !iv_key       TYPE ty_background-key
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_db TYPE REF TO zcl_abapgit_persistence_db .
+ 
+    METHODS from_xml
+      IMPORTING
+        !iv_string    TYPE string
+      RETURNING
+        VALUE(rs_xml) TYPE ty_xml
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_xml
+      IMPORTING
+        !is_background   TYPE ty_background
+      RETURNING
+        VALUE(rv_string) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSIST_BACKGROUND IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mo_db = zcl_abapgit_persistence_db=>get_instance( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD delete.
+
+    TRY.
+        mo_db->read( iv_type  = zcl_abapgit_persistence_db=>c_type_background
+                     iv_value = iv_key ).
+      CATCH zcx_abapgit_not_found.
+        RETURN.
+    ENDTRY.
+
+    mo_db->delete( iv_type  = zcl_abapgit_persistence_db=>c_type_background
+                   iv_value = iv_key ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD exists.
+ 
+    TRY.
+        mo_db->read( iv_type  = zcl_abapgit_persistence_db=>c_type_background
+                     iv_value = iv_key ).
+        rv_yes = abap_true.
+      CATCH zcx_abapgit_not_found.
+        rv_yes = abap_false.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = 'accept_data_loss'
+      SOURCE XML iv_string
+      RESULT data = rs_xml.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_by_key.
+ 
+    DATA: lt_list TYPE ty_background_keys.
+ 
+    lt_list = list( ).
+ 
+    READ TABLE lt_list WITH KEY key = iv_key INTO rs_data.
+    IF sy-subrc <> 0.
+      RAISE EXCEPTION TYPE zcx_abapgit_not_found.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD list.
+ 
+    DATA: lt_list TYPE zif_abapgit_persistence=>ty_contents,
+          ls_xml  TYPE ty_xml.
+ 
+    FIELD-SYMBOLS: <ls_list>   LIKE LINE OF lt_list,
+                   <ls_output> LIKE LINE OF rt_list.
+ 
+ 
+    lt_list = mo_db->list_by_type( zcl_abapgit_persistence_db=>c_type_background ).
+ 
+    LOOP AT lt_list ASSIGNING <ls_list>.
+      ls_xml = from_xml( <ls_list>-data_str ).
+ 
+      APPEND INITIAL LINE TO rt_list ASSIGNING <ls_output>.
+      MOVE-CORRESPONDING ls_xml TO <ls_output>.
+      <ls_output>-key = <ls_list>-value.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD modify.
+
+    ASSERT NOT is_data-key IS INITIAL.
+
+    mo_db->modify(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_background
+      iv_value = is_data-key
+      iv_data  = to_xml( is_data ) ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+    DATA: ls_xml TYPE ty_xml.
+ 
+    MOVE-CORRESPONDING is_background TO ls_xml.
+ 
+    CALL TRANSFORMATION id
+      SOURCE data = ls_xml
+      RESULT XML rv_string.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persist_factory.clas.abap.html b/src/persist/zcl_abapgit_persist_factory.clas.abap.html new file mode 100644 index 00000000000..66eb9586d81 --- /dev/null +++ b/src/persist/zcl_abapgit_persist_factory.clas.abap.html @@ -0,0 +1,262 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persist_factory.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persist_factory.clas.abap

+
+ +
+ 93.22% + Statements + 55/59 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 93.22% + Lines + 55/59 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +601x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_persist_factory DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_persist_injector .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_repo
+      RETURNING
+        VALUE(ri_repo) TYPE REF TO zif_abapgit_persist_repo .
+    CLASS-METHODS get_repo_cs
+      RETURNING
+        VALUE(ri_repo_cs) TYPE REF TO zif_abapgit_persist_repo_cs .
+    CLASS-METHODS get_settings
+      RETURNING
+        VALUE(ri_settings) TYPE REF TO zif_abapgit_persist_settings .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_repo TYPE REF TO zif_abapgit_persist_repo .
+    CLASS-DATA gi_repo_cs TYPE REF TO zif_abapgit_persist_repo_cs .
+    CLASS-DATA gi_settings TYPE REF TO zif_abapgit_persist_settings .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSIST_FACTORY IMPLEMENTATION.
+ 
+ 
+  METHOD get_repo.
+ 
+    IF gi_repo IS INITIAL.
+      CREATE OBJECT gi_repo TYPE zcl_abapgit_persistence_repo.
+    ENDIF.
+ 
+    ri_repo = gi_repo.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_repo_cs.
+ 
+    IF gi_repo_cs IS INITIAL.
+      CREATE OBJECT gi_repo_cs TYPE zcl_abapgit_persistence_repo.
+    ENDIF.
+ 
+    ri_repo_cs = gi_repo_cs.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_settings.
+ 
+    IF gi_settings IS INITIAL.
+      CREATE OBJECT gi_settings TYPE zcl_abapgit_persist_settings.
+    ENDIF.
+ 
+    ri_settings = gi_settings.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persist_injector.clas.abap.html b/src/persist/zcl_abapgit_persist_injector.clas.abap.html new file mode 100644 index 00000000000..74476029b3b --- /dev/null +++ b/src/persist/zcl_abapgit_persist_injector.clas.abap.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persist_injector.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persist_injector.clas.abap

+
+ +
+ 100% + Statements + 48/48 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 48/48 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +491x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_persist_injector DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  FOR TESTING .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS set_repo
+      IMPORTING
+        !ii_repo TYPE REF TO zif_abapgit_persist_repo .
+ 
+    CLASS-METHODS set_repo_cs
+      IMPORTING
+        !ii_repo_cs TYPE REF TO zif_abapgit_persist_repo_cs .
+ 
+    CLASS-METHODS set_settings
+      IMPORTING
+        !ii_settings TYPE REF TO zif_abapgit_persist_settings .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSIST_INJECTOR IMPLEMENTATION.
+ 
+ 
+  METHOD set_repo.
+ 
+    zcl_abapgit_persist_factory=>gi_repo = ii_repo.
+ 
+  ENDMETHOD.
+ 
+  METHOD set_repo_cs.
+ 
+    zcl_abapgit_persist_factory=>gi_repo_cs = ii_repo_cs.
+ 
+  ENDMETHOD.
+ 
+  METHOD set_settings.
+ 
+    zcl_abapgit_persist_factory=>gi_settings = ii_settings.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persist_migrate.clas.abap.html b/src/persist/zcl_abapgit_persist_migrate.clas.abap.html new file mode 100644 index 00000000000..beb54a20a34 --- /dev/null +++ b/src/persist/zcl_abapgit_persist_migrate.clas.abap.html @@ -0,0 +1,1048 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persist_migrate.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persist_migrate.clas.abap

+
+ +
+ 100% + Statements + 321/321 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 321/321 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +3221x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_persist_migrate DEFINITION PUBLIC CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS: run RAISING zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS c_text TYPE string VALUE 'Generated by abapGit' ##NO_TEXT.
+ 
+    CLASS-METHODS table_create
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS table_exists
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool.
+    CLASS-METHODS lock_create
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS lock_exists
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool.
+    CLASS-METHODS gui_status_create
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS gui_status_exists
+      RETURNING
+        VALUE(rv_exists) TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_persist_migrate IMPLEMENTATION.
+ 
+ 
+  METHOD gui_status_create.
+ 
+    DATA ls_cua TYPE zcl_abapgit_objects_program=>ty_cua.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      RETURN. " No autocreation for full version
+    ENDIF.
+ 
+    IF gui_status_exists( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    ls_cua = lcl_own_cua_provider=>get( ).
+ 
+    IF ls_cua IS INITIAL. " Full version or something wrong with abapmerged version
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        lcl_cua_interface=>new( )->put_own_cua( ls_cua ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD gui_status_exists.
+ 
+    DATA ls_own_cua TYPE zcl_abapgit_objects_program=>ty_cua.
+    DATA ls_new_cua TYPE zcl_abapgit_objects_program=>ty_cua.
+    DATA lv_x_own TYPE xstring.
+    DATA lv_x_new TYPE xstring.
+    DATA lv_h_own TYPE zif_abapgit_git_definitions=>ty_sha1.
+    DATA lv_h_new TYPE zif_abapgit_git_definitions=>ty_sha1.
+ 
+    TRY.
+        ls_own_cua = lcl_cua_interface=>new( )->get_own_cua( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    IF ls_own_cua IS INITIAL.
+      rv_exists = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    ls_new_cua = lcl_own_cua_provider=>get( ).
+    IF ls_new_cua IS INITIAL.
+      rv_exists = abap_true. " own exists and new is not - nothing to compare with
+      RETURN.
+    ENDIF.
+ 
+    EXPORT data = ls_own_cua TO DATA BUFFER lv_x_own.
+    EXPORT data = ls_new_cua TO DATA BUFFER lv_x_new.
+ 
+    TRY.
+        lv_h_own = zcl_abapgit_hash=>sha1_raw( lv_x_own ).
+        lv_h_new = zcl_abapgit_hash=>sha1_raw( lv_x_new ).
+      CATCH zcx_abapgit_exception.
+        rv_exists = abap_true. " own exists and some issue with calculating hash ... assume own is OK
+        RETURN.
+    ENDTRY.
+ 
+    " New exists and differs from own - then it is really new, needs to be installed
+    rv_exists = boolc( lv_h_own = lv_h_new ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD lock_create.
+ 
+    DATA: lv_obj_name TYPE tadir-obj_name,
+          ls_dd25v    TYPE dd25v,
+          lt_dd26e    TYPE STANDARD TABLE OF dd26e WITH DEFAULT KEY,
+          lt_dd27p    TYPE STANDARD TABLE OF dd27p WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS: <ls_dd26e> LIKE LINE OF lt_dd26e,
+                   <ls_dd27p> LIKE LINE OF lt_dd27p.
+ 
+ 
+    ls_dd25v-viewname   = zcl_abapgit_persistence_db=>c_lock.
+    ls_dd25v-aggtype    = 'E'.
+    ls_dd25v-roottab    = zcl_abapgit_persistence_db=>c_tabname.
+    ls_dd25v-ddlanguage = zif_abapgit_definitions=>c_english.
+    ls_dd25v-ddtext     = c_text.
+ 
+    APPEND INITIAL LINE TO lt_dd26e ASSIGNING <ls_dd26e>.
+    <ls_dd26e>-viewname   = zcl_abapgit_persistence_db=>c_lock.
+    <ls_dd26e>-tabname    = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd26e>-tabpos     = '0001'.
+    <ls_dd26e>-fortabname = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd26e>-enqmode    = 'E'.
+ 
+    APPEND INITIAL LINE TO lt_dd27p ASSIGNING <ls_dd27p>.
+    <ls_dd27p>-viewname  = zcl_abapgit_persistence_db=>c_lock.
+    <ls_dd27p>-objpos    = '0001'.
+    <ls_dd27p>-viewfield = 'TYPE'.
+    <ls_dd27p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd27p>-fieldname = 'TYPE'.
+    <ls_dd27p>-keyflag   = abap_true.
+ 
+    APPEND INITIAL LINE TO lt_dd27p ASSIGNING <ls_dd27p>.
+    <ls_dd27p>-viewname  = zcl_abapgit_persistence_db=>c_lock.
+    <ls_dd27p>-objpos    = '0002'.
+    <ls_dd27p>-viewfield = 'VALUE'.
+    <ls_dd27p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd27p>-fieldname = 'VALUE'.
+    <ls_dd27p>-keyflag   = abap_true.
+ 
+    CALL FUNCTION 'DDIF_ENQU_PUT'
+      EXPORTING
+        name              = zcl_abapgit_persistence_db=>c_lock
+        dd25v_wa          = ls_dd25v
+      TABLES
+        dd26e_tab         = lt_dd26e
+        dd27p_tab         = lt_dd27p
+      EXCEPTIONS
+        enqu_not_found    = 1
+        name_inconsistent = 2
+        enqu_inconsistent = 3
+        put_failure       = 4
+        put_refused       = 5
+        OTHERS            = 6.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    lv_obj_name = zcl_abapgit_persistence_db=>c_lock.
+    CALL FUNCTION 'TR_TADIR_INTERFACE'
+      EXPORTING
+        wi_tadir_pgmid    = 'R3TR'
+        wi_tadir_object   = 'ENQU'
+        wi_tadir_obj_name = lv_obj_name
+        wi_set_genflag    = abap_true
+        wi_test_modus     = abap_false
+        wi_tadir_devclass = '$TMP'
+      EXCEPTIONS
+        OTHERS            = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    CALL FUNCTION 'DDIF_ENQU_ACTIVATE'
+      EXPORTING
+        name        = zcl_abapgit_persistence_db=>c_lock
+      EXCEPTIONS
+        not_found   = 1
+        put_failure = 2
+        OTHERS      = 3.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'migrate, error from DDIF_ENQU_ACTIVATE' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD lock_exists.
+ 
+    DATA: lv_viewname TYPE dd25l-viewname.
+ 
+    SELECT SINGLE viewname FROM dd25l INTO lv_viewname
+      WHERE viewname = zcl_abapgit_persistence_db=>c_lock.
+    rv_exists = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    IF table_exists( ) = abap_false.
+      table_create( ).
+    ENDIF.
+ 
+    IF lock_exists( ) = abap_false.
+      lock_create( ).
+    ENDIF.
+ 
+    gui_status_create( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD table_create.
+ 
+    DATA: lv_rc       LIKE sy-subrc,
+          lv_obj_name TYPE tadir-obj_name,
+          ls_dd02v    TYPE dd02v,
+          ls_dd09l    TYPE dd09l,
+          lt_dd03p    TYPE STANDARD TABLE OF dd03p WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS: <ls_dd03p> LIKE LINE OF lt_dd03p.
+ 
+    ls_dd02v-tabname    = zcl_abapgit_persistence_db=>c_tabname.
+    ls_dd02v-ddlanguage = zif_abapgit_definitions=>c_english.
+    ls_dd02v-tabclass   = 'TRANSP'.
+    ls_dd02v-ddtext     = c_text.
+    ls_dd02v-contflag   = 'L'.
+    ls_dd02v-exclass    = '1'.
+ 
+    ls_dd09l-tabname  = zcl_abapgit_persistence_db=>c_tabname.
+    ls_dd09l-as4local = 'A'.
+    ls_dd09l-tabkat   = '1'.
+    ls_dd09l-tabart   = 'APPL1'.
+    ls_dd09l-bufallow = 'N'.
+ 
+    APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
+    <ls_dd03p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd03p>-fieldname = 'TYPE'.
+    <ls_dd03p>-position  = '0001'.
+    <ls_dd03p>-keyflag   = 'X'.
+    <ls_dd03p>-datatype  = 'CHAR'.
+    <ls_dd03p>-leng      = '000012'.
+ 
+    APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
+    <ls_dd03p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd03p>-fieldname = 'VALUE'.
+    <ls_dd03p>-position  = '0002'.
+    <ls_dd03p>-keyflag   = 'X'.
+    <ls_dd03p>-datatype  = 'CHAR'.
+    <ls_dd03p>-leng      = '000012'.
+ 
+    APPEND INITIAL LINE TO lt_dd03p ASSIGNING <ls_dd03p>.
+    <ls_dd03p>-tabname   = zcl_abapgit_persistence_db=>c_tabname.
+    <ls_dd03p>-fieldname = 'DATA_STR'.
+    <ls_dd03p>-position  = '0003'.
+    <ls_dd03p>-datatype  = 'STRG'.
+ 
+    CALL FUNCTION 'DDIF_TABL_PUT'
+      EXPORTING
+        name              = zcl_abapgit_persistence_db=>c_tabname
+        dd02v_wa          = ls_dd02v
+        dd09l_wa          = ls_dd09l
+      TABLES
+        dd03p_tab         = lt_dd03p
+      EXCEPTIONS
+        tabl_not_found    = 1
+        name_inconsistent = 2
+        tabl_inconsistent = 3
+        put_failure       = 4
+        put_refused       = 5
+        OTHERS            = 6.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    lv_obj_name = zcl_abapgit_persistence_db=>c_tabname.
+    CALL FUNCTION 'TR_TADIR_INTERFACE'
+      EXPORTING
+        wi_tadir_pgmid    = 'R3TR'
+        wi_tadir_object   = 'TABL'
+        wi_tadir_obj_name = lv_obj_name
+        wi_set_genflag    = abap_true
+        wi_test_modus     = abap_false
+        wi_tadir_devclass = '$TMP'
+      EXCEPTIONS
+        OTHERS            = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    CALL FUNCTION 'DDIF_TABL_ACTIVATE'
+      EXPORTING
+        name        = zcl_abapgit_persistence_db=>c_tabname
+        auth_chk    = abap_false
+      IMPORTING
+        rc          = lv_rc
+      EXCEPTIONS
+        not_found   = 1
+        put_failure = 2
+        OTHERS      = 3.
+    IF sy-subrc <> 0 OR lv_rc <> 0.
+      zcx_abapgit_exception=>raise( 'migrate, error from DDIF_TABL_ACTIVATE' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD table_exists.
+ 
+    DATA: lv_tabname TYPE dd02l-tabname.
+ 
+    SELECT SINGLE tabname FROM dd02l INTO lv_tabname
+      WHERE tabname = zcl_abapgit_persistence_db=>c_tabname.
+    rv_exists = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persist_migrate.clas.locals_imp.abap.html b/src/persist/zcl_abapgit_persist_migrate.clas.locals_imp.abap.html new file mode 100644 index 00000000000..fc8f64c7fd7 --- /dev/null +++ b/src/persist/zcl_abapgit_persist_migrate.clas.locals_imp.abap.html @@ -0,0 +1,295 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persist_migrate.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persist_migrate.clas.locals_imp.abap

+
+ +
+ 82.85% + Statements + 58/70 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 82.85% + Lines + 58/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +711x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_cua_interface DEFINITION INHERITING FROM zcl_abapgit_objects_program FINAL.
+  PUBLIC SECTION.
+    CLASS-METHODS new
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO lcl_cua_interface.
+    METHODS get_own_cua
+      RETURNING
+        VALUE(rs_cua) TYPE ty_cua
+      RAISING
+        zcx_abapgit_exception.
+    METHODS put_own_cua
+      IMPORTING
+        is_cua TYPE ty_cua
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+CLASS lcl_cua_interface IMPLEMENTATION.
+ 
+  METHOD new.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+ 
+    SELECT SINGLE devclass object obj_name INTO (ls_item-devclass, ls_item-obj_type, ls_item-obj_name)
+      FROM tadir
+      WHERE pgmid  = 'R3TR'
+      AND object   = 'PROG'
+      AND obj_name = sy-cprog.
+ 
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_language = 'E'
+        is_item = ls_item.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_own_cua.
+ 
+    rs_cua = serialize_cua( iv_program_name = sy-cprog ).
+ 
+  ENDMETHOD.
+ 
+  METHOD put_own_cua.
+
+    DATA li_log TYPE REF TO zif_abapgit_log.
+
+    deserialize_cua(
+      is_cua          = is_cua
+      iv_program_name = ms_item-obj_name ).
+
+    CREATE OBJECT li_log TYPE zcl_abapgit_log.
+    zcl_abapgit_objects_activation=>activate( ii_log = li_log ).
+    zcl_abapgit_objects_activation=>clear( ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_own_cua_provider DEFINITION FINAL.
+  PUBLIC SECTION.
+    CLASS-METHODS get
+      RETURNING
+        VALUE(rs_cua) TYPE zcl_abapgit_objects_program=>ty_cua.
+ENDCLASS.
+ 
+CLASS lcl_own_cua_provider IMPLEMENTATION.
+  METHOD get.
+    " @@abapmerge include-cua zabapgit.prog.xml > rs_cua
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persist_packages.clas.abap.html b/src/persist/zcl_abapgit_persist_packages.clas.abap.html new file mode 100644 index 00000000000..99ea12e4da3 --- /dev/null +++ b/src/persist/zcl_abapgit_persist_packages.clas.abap.html @@ -0,0 +1,553 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persist_packages.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persist_packages.clas.abap

+
+ +
+ 74.35% + Statements + 116/156 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 74.35% + Lines + 116/156 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +1571x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_persist_packages DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_package,
+        devclass   TYPE scompkdtln-devclass,
+        component  TYPE scompkdtln-component,
+        comp_posid TYPE scompkdtln-comp_posid,
+      END OF ty_package .
+    TYPES:
+      ty_packages TYPE HASHED TABLE OF ty_package WITH UNIQUE KEY devclass .
+ 
+    METHODS init .
+    METHODS modify
+      IMPORTING
+        !iv_package    TYPE scompkdtln-devclass
+        !iv_component  TYPE scompkdtln-component OPTIONAL
+        !iv_comp_posid TYPE scompkdtln-comp_posid OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read
+      IMPORTING
+        !iv_package       TYPE scompkdtln-devclass
+      RETURNING
+        VALUE(rs_package) TYPE ty_package .
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ro_persist) TYPE REF TO zcl_abapgit_persist_packages .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_persist TYPE REF TO zcl_abapgit_persist_packages.
+    DATA mt_packages TYPE ty_packages.
+ 
+    METHODS from_xml
+      IMPORTING
+        iv_xml             TYPE string
+      RETURNING
+        VALUE(rt_packages) TYPE ty_packages
+      RAISING
+        zcx_abapgit_exception.
+    METHODS to_xml
+      IMPORTING
+        it_packages   TYPE ty_packages
+      RETURNING
+        VALUE(rv_xml) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_persist_packages IMPLEMENTATION.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA lo_input TYPE REF TO zif_abapgit_xml_input.
+ 
+    CREATE OBJECT lo_input TYPE zcl_abapgit_xml_input EXPORTING iv_xml = iv_xml.
+ 
+    lo_input->read(
+      EXPORTING
+        iv_name = zcl_abapgit_persistence_db=>c_type_packages
+      CHANGING
+        cg_data = rt_packages ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    IF go_persist IS NOT BOUND.
+      CREATE OBJECT go_persist.
+    ENDIF.
+    ro_persist = go_persist.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init.
+
+    TRY.
+        " Might have changed in another session so always get latest
+        mt_packages = from_xml( zcl_abapgit_persistence_db=>get_instance( )->read(
+          iv_type  = zcl_abapgit_persistence_db=>c_type_packages
+          iv_value = '' ) ).
+      CATCH zcx_abapgit_exception zcx_abapgit_not_found ##NO_HANDLER.
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD modify.
+
+    DATA ls_package LIKE LINE OF mt_packages.
+
+    FIELD-SYMBOLS <ls_package> LIKE LINE OF mt_packages.
+
+    init( ).
+
+    IF iv_component IS INITIAL AND iv_comp_posid IS INITIAL.
+      DELETE mt_packages WHERE devclass = iv_package.
+    ELSE.
+      READ TABLE mt_packages ASSIGNING <ls_package> WITH TABLE KEY devclass = iv_package.
+      IF sy-subrc = 0.
+        <ls_package>-component  = iv_component.
+        <ls_package>-comp_posid = iv_comp_posid.
+      ELSE.
+        ls_package-devclass   = iv_package.
+        ls_package-component  = iv_component.
+        ls_package-comp_posid = iv_comp_posid.
+        INSERT ls_package INTO TABLE mt_packages.
+      ENDIF.
+    ENDIF.
+
+    zcl_abapgit_persistence_db=>get_instance( )->modify(
+      iv_type       = zcl_abapgit_persistence_db=>c_type_packages
+      iv_value      = ''
+      iv_data       = to_xml( mt_packages ) ).
+
+    COMMIT WORK AND WAIT.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    init( ).
+ 
+    READ TABLE mt_packages INTO rs_package WITH TABLE KEY devclass = iv_package.
+    IF sy-subrc <> 0.
+      rs_package-devclass = iv_package. " no component
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+ 
+    DATA li_output TYPE REF TO zif_abapgit_xml_output.
+ 
+    CREATE OBJECT li_output TYPE zcl_abapgit_xml_output.
+ 
+    li_output->add(
+      iv_name = zcl_abapgit_persistence_db=>c_type_packages
+      ig_data = it_packages ).
+ 
+    rv_xml = li_output->render( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persist_packages.clas.testclasses.abap.html b/src/persist/zcl_abapgit_persist_packages.clas.testclasses.abap.html new file mode 100644 index 00000000000..45718e59373 --- /dev/null +++ b/src/persist/zcl_abapgit_persist_packages.clas.testclasses.abap.html @@ -0,0 +1,289 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persist_packages.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persist_packages.clas.testclasses.abap

+
+ +
+ 35.29% + Statements + 24/68 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 35.29% + Lines + 24/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS ltcl_packages DEFINITION
+  FOR TESTING
+  RISK LEVEL CRITICAL
+  DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    CONSTANTS:
+      c_package    TYPE tdevc-devclass VALUE '$TEST$ABAPGIT$',
+      c_component  TYPE tdevc-component VALUE 'HLB0009083',  "BC-ABA
+      c_comp_posid TYPE scompkdtln-comp_posid VALUE 'BC-ABA'.
+ 
+    METHODS:
+      test_package FOR TESTING,
+      teardown.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_packages IMPLEMENTATION.
+ 
+  METHOD test_package.
+
+    DATA lo_packages TYPE REF TO zcl_abapgit_persist_packages.
+    DATA ls_package TYPE zcl_abapgit_persist_packages=>ty_package.
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+
+    lo_packages = zcl_abapgit_persist_packages=>get_instance( ).
+
+    TRY.
+        lo_packages->modify(
+          iv_package    = c_package
+          iv_component  = c_component
+          iv_comp_posid = c_comp_posid ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        cl_abap_unit_assert=>fail( msg = lx_error->get_text( ) ).
+    ENDTRY.
+
+    TRY.
+        ls_package = lo_packages->read( c_package ).
+
+        cl_abap_unit_assert=>assert_equals(
+          act = ls_package-component
+          exp = c_component ).
+
+        cl_abap_unit_assert=>assert_equals(
+          act = ls_package-comp_posid
+          exp = c_comp_posid ).
+
+      CATCH zcx_abapgit_exception INTO lx_error.
+        cl_abap_unit_assert=>fail( msg = lx_error->get_text( ) ).
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+  METHOD teardown.
+
+    DATA lo_packages TYPE REF TO zcl_abapgit_persist_packages.
+
+    lo_packages = zcl_abapgit_persist_packages=>get_instance( ).
+
+    " Remove test data
+    TRY.
+        lo_packages->modify( c_package ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persist_settings.clas.abap.html b/src/persist/zcl_abapgit_persist_settings.clas.abap.html new file mode 100644 index 00000000000..5d929e109d4 --- /dev/null +++ b/src/persist/zcl_abapgit_persist_settings.clas.abap.html @@ -0,0 +1,310 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persist_settings.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persist_settings.clas.abap

+
+ +
+ 69.33% + Statements + 52/75 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 69.33% + Lines + 52/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +761x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_persist_settings DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_persist_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_persist_settings .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSIST_SETTINGS IMPLEMENTATION.
+ 
+ 
+  METHOD zif_abapgit_persist_settings~modify.
+
+    DATA: lv_settings      TYPE string,
+          ls_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+
+
+    lv_settings = io_settings->get_settings_xml( ).
+
+    zcl_abapgit_persistence_db=>get_instance( )->modify(
+      iv_type       = zcl_abapgit_persistence_db=>c_type_settings
+      iv_value      = ''
+      iv_data       = lv_settings ).
+
+    ls_user_settings = io_settings->get_user_settings( ).
+
+    zcl_abapgit_persistence_user=>get_instance( )->set_settings( ls_user_settings ).
+
+    " Settings have been modified: Update Buffered Settings
+    IF mo_settings IS BOUND.
+      mo_settings->set_xml_settings( lv_settings ).
+      mo_settings->set_user_settings( ls_user_settings ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_settings~read.
+ 
+    IF mo_settings IS BOUND.
+      " Return Buffered Settings
+      ro_settings = mo_settings.
+      RETURN.
+    ENDIF.
+ 
+    " Settings have changed or have not yet been loaded
+    CREATE OBJECT ro_settings.
+ 
+    TRY.
+ 
+        ro_settings->set_xml_settings(
+          zcl_abapgit_persistence_db=>get_instance( )->read(
+            iv_type  = zcl_abapgit_persistence_db=>c_type_settings
+            iv_value = '' ) ).
+ 
+        ro_settings->set_user_settings( zcl_abapgit_persistence_user=>get_instance( )->get_settings( ) ).
+ 
+      CATCH zcx_abapgit_not_found zcx_abapgit_exception.
+ 
+        ro_settings->set_defaults( ).
+ 
+    ENDTRY.
+ 
+    mo_settings = ro_settings.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persistence_db.clas.abap.html b/src/persist/zcl_abapgit_persistence_db.clas.abap.html new file mode 100644 index 00000000000..ccd1718fa5e --- /dev/null +++ b/src/persist/zcl_abapgit_persistence_db.clas.abap.html @@ -0,0 +1,943 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persistence_db.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persistence_db.clas.abap

+
+ +
+ 72.02% + Statements + 206/286 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 72.02% + Lines + 206/286 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +2871x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_persistence_db DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+    CONSTANTS c_tabname TYPE c LENGTH 30 VALUE 'ZABAPGIT' ##NO_TEXT.
+    CONSTANTS c_lock TYPE c LENGTH 30 VALUE 'EZABAPGIT' ##NO_TEXT.
+ 
+    CONSTANTS:
+      c_type_settings   TYPE zif_abapgit_persistence=>ty_type VALUE 'SETTINGS' ##NO_TEXT,
+      c_type_repo       TYPE zif_abapgit_persistence=>ty_type VALUE 'REPO' ##NO_TEXT,
+      c_type_repo_csum  TYPE zif_abapgit_persistence=>ty_type VALUE 'REPO_CS' ##NO_TEXT,
+      c_type_background TYPE zif_abapgit_persistence=>ty_type VALUE 'BACKGROUND' ##NO_TEXT,
+      c_type_packages   TYPE zif_abapgit_persistence=>ty_type VALUE 'PACKAGES' ##NO_TEXT,
+      c_type_user       TYPE zif_abapgit_persistence=>ty_type VALUE 'USER' ##NO_TEXT.
+ 
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ro_db) TYPE REF TO zcl_abapgit_persistence_db .
+    METHODS add
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+        !iv_data  TYPE zif_abapgit_persistence=>ty_content-data_str
+      RAISING
+        zcx_abapgit_exception .
+    METHODS delete
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+      RAISING
+        zcx_abapgit_exception .
+    METHODS list
+      RETURNING
+        VALUE(rt_content) TYPE zif_abapgit_persistence=>ty_contents .
+    METHODS list_by_type
+      IMPORTING
+        !iv_type          TYPE zif_abapgit_persistence=>ty_type
+      RETURNING
+        VALUE(rt_content) TYPE zif_abapgit_persistence=>ty_contents .
+    METHODS list_by_keys
+      IMPORTING it_keys            TYPE zif_abapgit_persistence=>ty_repo_keys
+                iv_type            TYPE zif_abapgit_persistence=>ty_type
+      RETURNING VALUE(rt_contents) TYPE zif_abapgit_persistence=>ty_contents.
+    METHODS lock
+      IMPORTING
+        !iv_mode  TYPE enqmode DEFAULT 'E'
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+      RAISING
+        zcx_abapgit_exception .
+    METHODS modify
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+        !iv_data  TYPE zif_abapgit_persistence=>ty_content-data_str
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read
+      IMPORTING
+        !iv_type       TYPE zif_abapgit_persistence=>ty_type
+        !iv_value      TYPE zif_abapgit_persistence=>ty_content-value
+      RETURNING
+        VALUE(rv_data) TYPE zif_abapgit_persistence=>ty_content-data_str
+      RAISING
+        zcx_abapgit_not_found .
+    METHODS update
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+        !iv_value TYPE zif_abapgit_persistence=>ty_content-value
+        !iv_data  TYPE zif_abapgit_persistence=>ty_content-data_str
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS validate_entry_type
+      IMPORTING
+        !iv_type  TYPE zif_abapgit_persistence=>ty_type
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_db TYPE REF TO zcl_abapgit_persistence_db .
+    DATA mv_update_function TYPE funcname .
+ 
+    METHODS get_update_function
+      RETURNING
+        VALUE(rv_funcname) TYPE funcname .
+    METHODS validate_and_unprettify_xml
+      IMPORTING
+        !iv_xml       TYPE string
+      RETURNING
+        VALUE(rv_xml) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSISTENCE_DB IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+
+    DATA ls_table TYPE zif_abapgit_persistence=>ty_content.
+
+    validate_entry_type( iv_type ).
+    ls_table-type  = iv_type.
+    ls_table-value = iv_value.
+    ls_table-data_str = iv_data.
+
+    INSERT (c_tabname) FROM ls_table.                     "#EC CI_SUBRC
+    ASSERT sy-subrc = 0.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD delete.
+
+    lock( iv_type  = iv_type
+          iv_value = iv_value ).
+
+    " Ignore errors since record might not exist
+    DELETE FROM (c_tabname)
+      WHERE type = iv_type
+      AND value = iv_value.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    IF go_db IS NOT BOUND.
+      CREATE OBJECT go_db.
+    ENDIF.
+    ro_db = go_db.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_update_function.
+    IF mv_update_function IS INITIAL.
+      mv_update_function = 'CALL_V1_PING'.
+      CALL FUNCTION 'FUNCTION_EXISTS'
+        EXPORTING
+          funcname = mv_update_function
+        EXCEPTIONS
+          OTHERS   = 2.
+ 
+      IF sy-subrc <> 0.
+        mv_update_function = 'BANK_OBJ_WORKL_RELEASE_LOCKS'.
+      ENDIF.
+    ENDIF.
+    rv_funcname = mv_update_function.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD list.
+    SELECT * FROM (c_tabname)
+      INTO TABLE rt_content.                              "#EC CI_SUBRC
+  ENDMETHOD.
+ 
+ 
+  METHOD list_by_keys.
+    FIELD-SYMBOLS: <ls_key> LIKE LINE OF it_keys.
+    LOOP AT it_keys ASSIGNING <ls_key>.
+      SELECT * FROM (c_tabname)
+      APPENDING TABLE rt_contents
+      WHERE value = <ls_key> AND
+            type  = iv_type.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD list_by_type.
+    SELECT * FROM (c_tabname)
+      INTO TABLE rt_content
+      WHERE type = iv_type
+      ORDER BY PRIMARY KEY.                               "#EC CI_SUBRC
+  ENDMETHOD.
+ 
+ 
+  METHOD lock.
+    DATA: lv_dummy_update_function TYPE funcname.
+
+    CALL FUNCTION 'ENQUEUE_EZABAPGIT'
+      EXPORTING
+        mode_zabapgit  = iv_mode
+        type           = iv_type
+        value          = iv_value
+      EXCEPTIONS
+        foreign_lock   = 1
+        system_failure = 2
+        OTHERS         = 3.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    lv_dummy_update_function = get_update_function( ).
+
+* trigger dummy update task to automatically release locks at commit
+    CALL FUNCTION lv_dummy_update_function
+      IN UPDATE TASK.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD modify.
+
+    DATA: ls_content TYPE zif_abapgit_persistence=>ty_content.
+
+    lock( iv_type  = iv_type
+          iv_value = iv_value ).
+
+    ls_content-type  = iv_type.
+    ls_content-value = iv_value.
+    ls_content-data_str = iv_data.
+
+    MODIFY (c_tabname) FROM ls_content.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'DB modify failed' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+ 
+    SELECT SINGLE data_str FROM (c_tabname) INTO rv_data
+      WHERE type = iv_type
+      AND value = iv_value.
+    IF sy-subrc <> 0.
+      RAISE EXCEPTION TYPE zcx_abapgit_not_found.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD update.
+
+    DATA lv_data LIKE iv_data.
+
+    IF iv_data CS '<?xml'.
+      lv_data = validate_and_unprettify_xml( iv_data ).
+    ELSE.
+      lv_data = iv_data.
+    ENDIF.
+
+    lock( iv_type  = iv_type
+          iv_value = iv_value ).
+
+    UPDATE (c_tabname) SET data_str = lv_data
+      WHERE type  = iv_type
+      AND value = iv_value.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'DB update failed' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_and_unprettify_xml.
+ 
+    rv_xml = zcl_abapgit_xml_pretty=>print(
+      iv_xml           = iv_xml
+      iv_unpretty      = abap_true
+      iv_ignore_errors = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_entry_type.
+ 
+    IF NOT (
+      iv_type = c_type_repo OR
+      iv_type = c_type_repo_csum OR
+      iv_type = c_type_user OR
+      iv_type = c_type_settings OR
+      iv_type = c_type_background OR
+      iv_type = c_type_packages ).
+      zcx_abapgit_exception=>raise( |Invalid DB entry type [{ iv_type }]| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persistence_repo.clas.abap.html b/src/persist/zcl_abapgit_persistence_repo.clas.abap.html new file mode 100644 index 00000000000..9ba9336faee --- /dev/null +++ b/src/persist/zcl_abapgit_persistence_repo.clas.abap.html @@ -0,0 +1,1177 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persistence_repo.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persistence_repo.clas.abap

+
+ +
+ 75.54% + Statements + 275/364 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 75.54% + Lines + 275/364 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +3651x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_persistence_repo DEFINITION
+  PUBLIC
+  CREATE PROTECTED
+  GLOBAL FRIENDS zcl_abapgit_persist_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_persist_repo .
+    INTERFACES zif_abapgit_persist_repo_cs .
+ 
+    METHODS constructor .
+    METHODS rewrite_repo_meta
+      IMPORTING
+        !iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found.
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mt_meta_fields TYPE STANDARD TABLE OF abap_compname.
+    DATA mo_db TYPE REF TO zcl_abapgit_persistence_db .
+ 
+    METHODS from_xml
+      IMPORTING
+        !iv_repo_xml_string TYPE string
+      RETURNING
+        VALUE(rs_repo)      TYPE zif_abapgit_persistence=>ty_repo_xml
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_xml
+      IMPORTING
+        !is_repo                  TYPE zif_abapgit_persistence=>ty_repo
+      RETURNING
+        VALUE(rv_repo_xml_string) TYPE string .
+    METHODS get_next_id
+      RETURNING
+        VALUE(rv_next_repo_id) TYPE zif_abapgit_persistence=>ty_content-value
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_repo_from_content
+      IMPORTING
+        is_content    TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_persistence=>ty_repo
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PERSISTENCE_REPO IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA ls_dummy_meta_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask.
+    DATA ls_dummy_meta      TYPE zif_abapgit_persistence=>ty_repo_xml.
+    DATA lo_type_meta_mask  TYPE REF TO cl_abap_structdescr.
+    DATA lo_type_meta       TYPE REF TO cl_abap_structdescr.
+    FIELD-SYMBOLS <ls_comp> LIKE LINE OF lo_type_meta_mask->components.
+ 
+    " Collect actual list of fields in repo meta data (used in update_meta)
+    lo_type_meta_mask ?= cl_abap_structdescr=>describe_by_data( ls_dummy_meta_mask ).
+    lo_type_meta      ?= cl_abap_structdescr=>describe_by_data( ls_dummy_meta ).
+    LOOP AT lo_type_meta_mask->components ASSIGNING <ls_comp>.
+      APPEND <ls_comp>-name TO mt_meta_fields.
+    ENDLOOP.
+ 
+    mo_db = zcl_abapgit_persistence_db=>get_instance( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = iv_repo_xml_string.
+ 
+* fix downward compatibility
+    REPLACE ALL OCCURRENCES OF '<_--28C_TYPE_REPO_--29>' IN lv_xml WITH '<REPO>'.
+    REPLACE ALL OCCURRENCES OF '</_--28C_TYPE_REPO_--29>' IN lv_xml WITH '</REPO>'.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = 'accept_data_loss'
+      SOURCE XML lv_xml
+      RESULT repo = rs_repo.
+ 
+* automatic migration of old fields
+* todo, keep for transition period until 2022-12-31, then remove all of these
+    FIND FIRST OCCURRENCE OF '</HEAD_BRANCH><WRITE_PROTECT>X</WRITE_PROTECT>' IN lv_xml.
+    IF sy-subrc = 0.
+      rs_repo-local_settings-write_protected = abap_true.
+    ENDIF.
+    FIND FIRST OCCURRENCE OF '<IGNORE_SUBPACKAGES>X</IGNORE_SUBPACKAGES></REPO>' IN lv_xml.
+    IF sy-subrc = 0.
+      rs_repo-local_settings-ignore_subpackages = abap_true.
+    ENDIF.
+    FIND FIRST OCCURRENCE OF '<SERIALIZE_MASTER_LANG_ONLY>X</SERIALIZE_MASTER_LANG_ONLY>' IN lv_xml.
+    IF sy-subrc = 0.
+      rs_repo-local_settings-main_language_only = abap_true.
+    ENDIF.
+ 
+    IF rs_repo IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Inconsistent repo metadata' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_next_id.
+ 
+* todo: Lock the complete persistence in order to prevent concurrent repo-creation
+* however the current approach will most likely work in almost all cases
+ 
+    DATA: lt_content TYPE zif_abapgit_persistence=>ty_contents.
+ 
+    FIELD-SYMBOLS: <ls_content> LIKE LINE OF lt_content.
+ 
+ 
+    rv_next_repo_id = 1.
+ 
+    lt_content = mo_db->list_by_type( zcl_abapgit_persistence_db=>c_type_repo ).
+    LOOP AT lt_content ASSIGNING <ls_content>.
+      IF <ls_content>-value >= rv_next_repo_id.
+        rv_next_repo_id = <ls_content>-value + 1.
+      ENDIF.
+    ENDLOOP.
+ 
+    SHIFT rv_next_repo_id RIGHT DELETING TRAILING space.
+    TRANSLATE rv_next_repo_id USING ' 0'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_repo_from_content.
+    MOVE-CORRESPONDING from_xml( is_content-data_str ) TO rs_result.
+    IF rs_result-local_settings-write_protected = abap_false AND
+       zcl_abapgit_factory=>get_environment( )->is_repo_object_changes_allowed( ) = abap_false.
+      rs_result-local_settings-write_protected = abap_true.
+    ENDIF.
+    rs_result-key = is_content-value.
+  ENDMETHOD.
+ 
+ 
+  METHOD rewrite_repo_meta.
+
+    DATA lv_old_blob TYPE string.
+    DATA lv_new_blob TYPE string.
+    DATA ls_repo_meta TYPE zif_abapgit_persistence=>ty_repo.
+
+    lv_old_blob = mo_db->read(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+      iv_value = iv_repo_key ).
+
+    MOVE-CORRESPONDING from_xml( lv_old_blob ) TO ls_repo_meta.
+    lv_new_blob = to_xml( ls_repo_meta ).
+
+    mo_db->update(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+      iv_value = iv_repo_key
+      iv_data  = lv_new_blob ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+ 
+    DATA: ls_xml TYPE zif_abapgit_persistence=>ty_repo_xml.
+ 
+ 
+    MOVE-CORRESPONDING is_repo TO ls_xml.
+ 
+    CALL TRANSFORMATION id
+      SOURCE repo = ls_xml
+      RESULT XML rv_repo_xml_string.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo_cs~delete.
+
+    mo_db->delete(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo_csum
+      iv_value = iv_key ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo_cs~read.
+ 
+    rv_cs_blob = mo_db->read(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo_csum
+      iv_value = iv_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo_cs~update.
+
+    mo_db->modify(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo_csum
+      iv_value = iv_key
+      iv_data  = iv_cs_blob ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~add.
+ 
+    DATA: ls_repo        TYPE zif_abapgit_persistence=>ty_repo,
+          lv_repo_as_xml TYPE string.
+ 
+ 
+    ls_repo-url          = iv_url.
+    ls_repo-branch_name  = iv_branch_name.
+    ls_repo-package      = iv_package.
+    ls_repo-offline      = iv_offline.
+    ls_repo-created_by   = sy-uname.
+    GET TIME STAMP FIELD ls_repo-created_at.
+    ls_repo-dot_abapgit  = is_dot_abapgit.
+ 
+    ls_repo-local_settings-display_name = iv_display_name.
+ 
+    lv_repo_as_xml = to_xml( ls_repo ).
+ 
+    rv_key = get_next_id( ).
+ 
+    mo_db->add( iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+                iv_value = rv_key
+                iv_data  = lv_repo_as_xml ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~delete.
+
+    DATA: lo_background TYPE REF TO zcl_abapgit_persist_background.
+
+    CREATE OBJECT lo_background.
+    lo_background->delete( iv_key ).
+
+    mo_db->delete( iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+                   iv_value = iv_key ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~exists.
+ 
+    DATA lt_keys TYPE zif_abapgit_persistence=>ty_repo_keys.
+    DATA lt_content TYPE zif_abapgit_persistence=>ty_contents.
+ 
+    APPEND iv_key TO lt_keys.
+ 
+    lt_content = mo_db->list_by_keys(
+      it_keys = lt_keys
+      iv_type = zcl_abapgit_persistence_db=>c_type_repo ).
+ 
+    rv_yes = boolc( lines( lt_content ) > 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~list.
+ 
+    DATA: lt_content TYPE zif_abapgit_persistence=>ty_contents,
+          ls_content LIKE LINE OF lt_content,
+          ls_repo    LIKE LINE OF rt_repos.
+ 
+    lt_content = mo_db->list_by_type( zcl_abapgit_persistence_db=>c_type_repo ).
+ 
+    LOOP AT lt_content INTO ls_content.
+      ls_repo = get_repo_from_content( ls_content ).
+      INSERT ls_repo INTO TABLE rt_repos.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~list_by_keys.
+    DATA: lt_content TYPE zif_abapgit_persistence=>ty_contents,
+          ls_content LIKE LINE OF lt_content,
+          ls_repo    LIKE LINE OF rt_repos.
+ 
+    lt_content = mo_db->list_by_keys(
+      it_keys = it_keys
+      iv_type = zcl_abapgit_persistence_db=>c_type_repo ).
+ 
+    LOOP AT lt_content INTO ls_content.
+      ls_repo = get_repo_from_content( ls_content ).
+      INSERT ls_repo INTO TABLE rt_repos.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~lock.
+
+    mo_db->lock( iv_mode  = iv_mode
+                 iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+                 iv_value = iv_key ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~read.
+ 
+    DATA lt_repo TYPE zif_abapgit_persistence=>ty_repos.
+ 
+    lt_repo = zif_abapgit_persist_repo~list( ).
+ 
+    READ TABLE lt_repo INTO rs_repo WITH KEY key = iv_key.
+    IF sy-subrc <> 0.
+      RAISE EXCEPTION TYPE zcx_abapgit_not_found.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_repo~update_metadata.
+
+    DATA:
+      lv_blob            TYPE zif_abapgit_persistence=>ty_content-data_str,
+      ls_persistent_meta TYPE zif_abapgit_persistence=>ty_repo.
+
+    FIELD-SYMBOLS <lv_field>   LIKE LINE OF mt_meta_fields.
+    FIELD-SYMBOLS <lg_dst>     TYPE any.
+    FIELD-SYMBOLS <lg_src>     TYPE any.
+    FIELD-SYMBOLS <lv_changed> TYPE abap_bool.
+
+    ASSERT NOT iv_key IS INITIAL.
+
+    IF is_change_mask IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    " Validations
+    IF is_change_mask-url = abap_true AND is_meta-url IS INITIAL.
+      zcx_abapgit_exception=>raise( 'update, url empty' ).
+    ENDIF.
+
+    ls_persistent_meta = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key )->ms_data.
+
+    " Update
+    LOOP AT mt_meta_fields ASSIGNING <lv_field>.
+      ASSIGN COMPONENT <lv_field> OF STRUCTURE is_change_mask TO <lv_changed>.
+      ASSERT sy-subrc = 0.
+      CHECK <lv_changed> = abap_true.
+      ASSIGN COMPONENT <lv_field> OF STRUCTURE ls_persistent_meta TO <lg_dst>.
+      ASSERT sy-subrc = 0.
+      ASSIGN COMPONENT <lv_field> OF STRUCTURE is_meta TO <lg_src>.
+      ASSERT sy-subrc = 0.
+      <lg_dst> = <lg_src>.
+    ENDLOOP.
+
+    lv_blob = to_xml( ls_persistent_meta ).
+
+    mo_db->update( iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+                   iv_value = iv_key
+                   iv_data  = lv_blob ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persistence_user.clas.abap.html b/src/persist/zcl_abapgit_persistence_user.clas.abap.html new file mode 100644 index 00000000000..43cbad69e9e --- /dev/null +++ b/src/persist/zcl_abapgit_persistence_user.clas.abap.html @@ -0,0 +1,1597 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persistence_user.clas.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persistence_user.clas.abap

+
+ +
+ 76.98% + Statements + 388/504 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/13 +
+ + +
+ 76.98% + Lines + 388/504 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +5051x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_persistence_user DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_persist_user .
+ 
+    CLASS-METHODS get_instance
+      IMPORTING
+        !iv_user       TYPE sy-uname DEFAULT sy-uname
+      RETURNING
+        VALUE(ri_user) TYPE REF TO zif_abapgit_persist_user
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !iv_user TYPE sy-uname DEFAULT sy-uname
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_repo_config,
+        url              TYPE zif_abapgit_persistence=>ty_repo-url,
+        login            TYPE string,
+        git_user         TYPE zif_abapgit_git_definitions=>ty_git_user,
+        last_change_seen TYPE string,
+      END OF ty_repo_config .
+    TYPES:
+      ty_repo_configs TYPE STANDARD TABLE OF ty_repo_config WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_user,
+        default_git_user TYPE zif_abapgit_git_definitions=>ty_git_user,
+        repo_show        TYPE zif_abapgit_persistence=>ty_repo-key,
+        hide_files       TYPE abap_bool,
+        changes_only     TYPE abap_bool,
+        order_by         TYPE string,
+        order_descending TYPE abap_bool,
+        diff_first       TYPE abap_bool,
+        diff_unified     TYPE abap_bool,
+        favorites        TYPE zif_abapgit_persist_user=>ty_favorites,
+        repo_config      TYPE ty_repo_configs,
+        settings         TYPE zif_abapgit_definitions=>ty_s_user_settings,
+        show_folders     TYPE abap_bool,
+        list_settings    TYPE zif_abapgit_definitions=>ty_list_settings,
+      END OF ty_user .
+ 
+    DATA mv_user TYPE sy-uname .
+    DATA ms_user TYPE ty_user.
+    CLASS-DATA gi_current_user TYPE REF TO zif_abapgit_persist_user .
+ 
+    METHODS from_xml
+      IMPORTING
+        !iv_xml        TYPE string
+      RETURNING
+        VALUE(rs_user) TYPE ty_user
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_repo_config
+      IMPORTING
+        !iv_url               TYPE zif_abapgit_persistence=>ty_repo-url
+      RETURNING
+        VALUE(rs_repo_config) TYPE ty_repo_config
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_xml
+      IMPORTING
+        !is_user      TYPE ty_user
+      RETURNING
+        VALUE(rv_xml) TYPE string .
+    METHODS update
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_repo_config
+      IMPORTING
+        !iv_url         TYPE zif_abapgit_persistence=>ty_repo-url
+        !is_repo_config TYPE ty_repo_config
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_persistence_user IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mv_user = iv_user.
+    read( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = iv_xml.
+ 
+* fix downward compatibility
+    REPLACE ALL OCCURRENCES OF '<_--28C_TYPE_USER_--29>' IN lv_xml WITH '<USER>'.
+    REPLACE ALL OCCURRENCES OF '</_--28C_TYPE_USER_--29>' IN lv_xml WITH '</USER>'.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = 'accept_data_loss'
+      SOURCE XML lv_xml
+      RESULT user = rs_user.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    IF iv_user = sy-uname ##USER_OK.
+      IF gi_current_user IS NOT BOUND.
+        CREATE OBJECT gi_current_user TYPE zcl_abapgit_persistence_user.
+      ENDIF.
+      ri_user = gi_current_user.
+    ELSE.
+      CREATE OBJECT ri_user TYPE zcl_abapgit_persistence_user
+        EXPORTING
+          iv_user = iv_user.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read.
+
+    DATA: lv_xml TYPE string.
+
+    TRY.
+        lv_xml = zcl_abapgit_persistence_db=>get_instance( )->read(
+          iv_type  = zcl_abapgit_persistence_db=>c_type_user
+          iv_value = mv_user ).
+      CATCH zcx_abapgit_not_found.
+        RETURN.
+    ENDTRY.
+
+    ms_user = from_xml( lv_xml ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read_repo_config.
+    DATA lv_url TYPE string.
+    lv_url = to_lower( iv_url ).
+    READ TABLE ms_user-repo_config INTO rs_repo_config WITH KEY url = lv_url.
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+    CALL TRANSFORMATION id
+      SOURCE user = is_user
+      RESULT XML rv_xml.
+  ENDMETHOD.
+ 
+ 
+  METHOD update.
+
+    DATA: lv_xml TYPE string.
+
+    lv_xml = to_xml( ms_user ).
+
+    zcl_abapgit_persistence_db=>get_instance( )->modify(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_user
+      iv_value = mv_user
+      iv_data  = lv_xml ).
+
+    COMMIT WORK AND WAIT.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD update_repo_config.
+
+    DATA: lv_key  TYPE string.
+
+    FIELD-SYMBOLS <ls_repo_config> TYPE ty_repo_config.
+
+    lv_key  = to_lower( iv_url ).
+
+    READ TABLE ms_user-repo_config ASSIGNING <ls_repo_config> WITH KEY url = lv_key.
+    IF sy-subrc IS NOT INITIAL.
+      APPEND INITIAL LINE TO ms_user-repo_config ASSIGNING <ls_repo_config>.
+    ENDIF.
+    <ls_repo_config>     = is_repo_config.
+    <ls_repo_config>-url = lv_key.
+
+    update( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_changes_only.
+ 
+    rv_changes_only = ms_user-changes_only.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_default_git_user_email.
+ 
+    rv_email = ms_user-default_git_user-email.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_default_git_user_name.
+ 
+    rv_username = ms_user-default_git_user-name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_diff_first.
+    rv_diff_first = ms_user-diff_first.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_diff_unified.
+ 
+    rv_diff_unified = ms_user-diff_unified.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_favorites.
+ 
+    rt_favorites = ms_user-favorites.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_hide_files.
+ 
+    rv_hide = ms_user-hide_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_list_settings.
+ 
+    rs_list_settings = ms_user-list_settings.
+ 
+    IF rs_list_settings IS INITIAL.
+      " for performance reasons, set "only favorites" as a default
+      IF zcl_abapgit_repo_srv=>get_instance( )->list_favorites( ) IS NOT INITIAL.
+        rs_list_settings-only_favorites = abap_true.
+      ENDIF.
+ 
+      rs_list_settings-order_by = |NAME|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_order_by.
+    rv_order_by = ms_user-order_by.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_order_descending.
+    rv_order_descending = ms_user-order_descending.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_git_user_email.
+ 
+    rv_email = read_repo_config( iv_url )-git_user-email.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_git_user_name.
+ 
+    rv_username = read_repo_config( iv_url )-git_user-name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_last_change_seen.
+ 
+    rv_version = read_repo_config( iv_url )-last_change_seen.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_login.
+ 
+    rv_login = read_repo_config( iv_url )-login.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_repo_show.
+ 
+    rv_key = ms_user-repo_show.
+ 
+    IF rv_key IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    " Check if repo exists
+    TRY.
+        zcl_abapgit_persistence_db=>get_instance( )->read(
+          iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+          iv_value = rv_key ).
+      CATCH zcx_abapgit_not_found.
+        " remove invalid key
+        CLEAR rv_key.
+        zif_abapgit_persist_user~set_repo_show( rv_key ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_settings.
+ 
+    rs_user_settings = ms_user-settings.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~get_show_folders.
+ 
+    rv_folders = ms_user-show_folders.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~is_favorite_repo.
+ 
+    READ TABLE ms_user-favorites TRANSPORTING NO FIELDS
+      WITH KEY table_line = iv_repo_key.
+ 
+    rv_yes = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_default_git_user_email.
+
+    ms_user-default_git_user-email = iv_email.
+    update( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_default_git_user_name.
+
+    ms_user-default_git_user-name = iv_username.
+    update( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_diff_first.
+    ms_user-diff_first = iv_diff_first.
+    update( ).
+    rv_diff_first = ms_user-diff_first.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_list_settings.
+    ms_user-list_settings = is_list_settings.
+    update( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_order_by.
+    ms_user-order_by = iv_order_by.
+    update( ).
+    rv_order_by = ms_user-order_by.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_order_descending.
+    ms_user-order_descending = iv_order_descending.
+    update( ).
+    rv_order_descending = ms_user-order_descending.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_git_user_email.
+
+    DATA: ls_repo_config TYPE ty_repo_config.
+
+    ls_repo_config                = read_repo_config( iv_url ).
+    ls_repo_config-git_user-email = iv_email.
+    update_repo_config( iv_url = iv_url
+                        is_repo_config = ls_repo_config ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_git_user_name.
+
+    DATA: ls_repo_config TYPE ty_repo_config.
+
+    ls_repo_config               = read_repo_config( iv_url ).
+    ls_repo_config-git_user-name = iv_username.
+    update_repo_config( iv_url = iv_url
+                        is_repo_config = ls_repo_config ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_last_change_seen.
+
+    DATA: ls_repo_config TYPE ty_repo_config.
+
+    ls_repo_config                  = read_repo_config( iv_url ).
+    ls_repo_config-last_change_seen = iv_version.
+    update_repo_config( iv_url = iv_url
+                        is_repo_config = ls_repo_config ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_login.
+
+    DATA: ls_repo_config TYPE ty_repo_config.
+
+    ls_repo_config       = read_repo_config( iv_url ).
+    ls_repo_config-login = iv_login.
+    update_repo_config( iv_url = iv_url
+                        is_repo_config = ls_repo_config ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_repo_show.
+
+    ms_user-repo_show = iv_key.
+    update( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~set_settings.
+
+    ms_user-settings = is_user_settings.
+    update( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_changes_only.
+ 
+    ms_user-changes_only = boolc( ms_user-changes_only = abap_false ).
+    update( ).
+ 
+    rv_changes_only = ms_user-changes_only.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_diff_unified.
+ 
+    ms_user-diff_unified = boolc( ms_user-diff_unified = abap_false ).
+    update( ).
+ 
+    rv_diff_unified = ms_user-diff_unified.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_favorite.
+
+    READ TABLE ms_user-favorites TRANSPORTING NO FIELDS
+      WITH KEY table_line = iv_repo_key.
+
+    IF sy-subrc = 0.
+      DELETE ms_user-favorites INDEX sy-tabix.
+    ELSE.
+      APPEND iv_repo_key TO ms_user-favorites.
+    ENDIF.
+
+    update( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_hide_files.
+ 
+    ms_user-hide_files = boolc( ms_user-hide_files = abap_false ).
+    update( ).
+ 
+    rv_hide = ms_user-hide_files.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_persist_user~toggle_show_folders.
+    ms_user-show_folders = boolc( ms_user-show_folders = abap_false ).
+    update( ).
+ 
+    rv_folders = ms_user-show_folders.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap.html b/src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap.html new file mode 100644 index 00000000000..b049ff22616 --- /dev/null +++ b/src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap.html @@ -0,0 +1,430 @@ + + + + + + Code coverage report for src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/persist zcl_abapgit_persistence_user.clas.testclasses.abap

+
+ +
+ 30.43% + Statements + 35/115 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 30.43% + Lines + 35/115 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +1161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +1x + 
CLASS ltcl_user DEFINITION
+  FOR TESTING
+  RISK LEVEL CRITICAL
+  DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    CONSTANTS:
+      c_abap_user TYPE sy-uname VALUE 'ABAPGIT_TEST',
+      c_git_user  TYPE string VALUE 'abapgit_tester',
+      c_repo_url  TYPE string VALUE 'https://github.com/abapGit/abapGit'.
+ 
+    DATA:
+      mi_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    METHODS:
+      set_get_git_user   FOR TESTING RAISING zcx_abapgit_exception,
+      set_get_repo_show  FOR TESTING RAISING zcx_abapgit_exception,
+      set_get_settings   FOR TESTING RAISING zcx_abapgit_exception,
+      set_get_repo_login FOR TESTING RAISING zcx_abapgit_exception,
+      teardown RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_user IMPLEMENTATION.
+ 
+  METHOD set_get_git_user.
+
+    DATA: lv_user TYPE string.
+
+    mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
+    mi_user->set_default_git_user_name( c_git_user ).
+
+    FREE mi_user.
+
+    mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
+    lv_user = mi_user->get_default_git_user_name( ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_user
+      exp = c_git_user ).
+
+  ENDMETHOD.
+ 
+  METHOD set_get_repo_show.
+
+    DATA: lv_key      TYPE zif_abapgit_persistence=>ty_repo-key,
+          lv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key.
+
+    SELECT MIN( value ) FROM (zcl_abapgit_persistence_db=>c_tabname) INTO lv_repo_key
+      WHERE type = zcl_abapgit_persistence_db=>c_type_repo.
+    IF sy-subrc <> 0.
+      RETURN. " can't test
+    ENDIF.
+
+    mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
+    mi_user->set_repo_show( lv_repo_key ).
+
+    FREE mi_user.
+
+    mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
+    lv_key = mi_user->get_repo_show( ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_key
+      exp = lv_repo_key ).
+
+  ENDMETHOD.
+ 
+  METHOD set_get_repo_login.
+
+    DATA: lv_login TYPE string.
+
+    mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
+    mi_user->set_repo_login( iv_url = c_repo_url
+                             iv_login = c_git_user ).
+
+    FREE mi_user.
+
+    mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
+    lv_login = mi_user->get_repo_login( c_repo_url ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_login
+      exp = c_git_user ).
+
+  ENDMETHOD.
+ 
+  METHOD set_get_settings.
+
+    DATA: ls_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+
+    ls_settings-show_default_repo = abap_true.
+
+    mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
+    mi_user->set_settings( ls_settings ).
+
+    FREE mi_user.
+
+    mi_user = zcl_abapgit_persistence_user=>get_instance( c_abap_user ).
+    ls_settings = mi_user->get_settings( ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_settings-show_default_repo
+      exp = abap_true ).
+
+  ENDMETHOD.
+ 
+  METHOD teardown.
+    " Delete test user settings
+    zcl_abapgit_persistence_db=>get_instance( )->delete(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_user
+      iv_value = c_abap_user ).
+    CALL FUNCTION 'DB_COMMIT'.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/progress/index.html b/src/progress/index.html new file mode 100644 index 00000000000..aaac0743405 --- /dev/null +++ b/src/progress/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/progress + + + + + + + + + +
+
+

All files src/progress

+
+ +
+ 69.46% + Statements + 91/131 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 69.46% + Lines + 91/131 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_progress.clas.abap +
+
69.46%91/131100%2/233.33%1/369.46%91/131
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/progress/zcl_abapgit_progress.clas.abap.html b/src/progress/zcl_abapgit_progress.clas.abap.html new file mode 100644 index 00000000000..981da1d1755 --- /dev/null +++ b/src/progress/zcl_abapgit_progress.clas.abap.html @@ -0,0 +1,478 @@ + + + + + + Code coverage report for src/progress/zcl_abapgit_progress.clas.abap + + + + + + + + + +
+
+

All files / src/progress zcl_abapgit_progress.clas.abap

+
+ +
+ 69.46% + Statements + 91/131 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 69.46% + Lines + 91/131 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +1321x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +7x +7x +7x +7x +7x +7x +7x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_progress DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PROTECTED .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_progress .
+ 
+    CLASS-METHODS set_instance
+      IMPORTING
+        !ii_progress TYPE REF TO zif_abapgit_progress .
+    CLASS-METHODS get_instance
+      IMPORTING
+        !iv_total          TYPE i
+      RETURNING
+        VALUE(ri_progress) TYPE REF TO zif_abapgit_progress .
+  PROTECTED SECTION.
+ 
+    DATA mv_total TYPE i .
+    CLASS-DATA gi_progress TYPE REF TO zif_abapgit_progress .
+ 
+    METHODS calc_pct
+      IMPORTING
+        !iv_current   TYPE i
+      RETURNING
+        VALUE(rv_pct) TYPE i .
+  PRIVATE SECTION.
+ 
+    DATA mv_cv_time_next TYPE sy-uzeit .
+    DATA mv_cv_datum_next TYPE sy-datum .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_progress IMPLEMENTATION.
+ 
+ 
+  METHOD calc_pct.
+ 
+    DATA: lv_f TYPE f.
+ 
+    lv_f = ( iv_current / mv_total ) * 100.
+    rv_pct = lv_f.
+ 
+    IF rv_pct = 100.
+      rv_pct = 99.
+    ELSEIF rv_pct = 0.
+      rv_pct = 1.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+* max one progress indicator at a time is supported
+ 
+    IF gi_progress IS INITIAL.
+      CREATE OBJECT gi_progress TYPE zcl_abapgit_progress.
+    ENDIF.
+ 
+    gi_progress->set_total( iv_total ).
+ 
+    ri_progress = gi_progress.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_instance.
+ 
+    gi_progress = ii_progress.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_progress~off.
+
+    " Clear the status bar
+    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_progress~set_total.
+ 
+    mv_total = iv_total.
+ 
+    CLEAR mv_cv_time_next.
+    CLEAR mv_cv_datum_next.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_progress~show.
+
+    DATA: lv_pct  TYPE i,
+          lv_time TYPE t.
+
+    CONSTANTS: lc_wait_secs TYPE i VALUE 2.
+
+    GET TIME.
+    lv_time = sy-uzeit.
+    IF mv_cv_time_next IS INITIAL AND mv_cv_datum_next IS INITIAL.
+      mv_cv_time_next  = lv_time.
+      mv_cv_datum_next = sy-datum.
+    ENDIF.
+
+    "We only do a progress indication if enough time has passed
+    IF lv_time >= mv_cv_time_next
+        AND sy-datum = mv_cv_datum_next
+        OR sy-datum > mv_cv_datum_next.
+
+      lv_pct = calc_pct( iv_current ).
+
+      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
+        EXPORTING
+          percentage = lv_pct
+          text       = iv_text.
+      mv_cv_time_next = lv_time + lc_wait_secs.
+
+    ENDIF.
+    IF sy-datum > mv_cv_datum_next.
+      mv_cv_datum_next = sy-datum.
+    ENDIF.
+    IF mv_cv_time_next < lv_time.
+      mv_cv_datum_next = sy-datum + 1.
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/index.html b/src/repo/index.html new file mode 100644 index 00000000000..6b02ca93784 --- /dev/null +++ b/src/repo/index.html @@ -0,0 +1,341 @@ + + + + + + Code coverage report for src/repo + + + + + + + + + +
+
+

All files src/repo

+
+ +
+ 77.58% + Statements + 5293/6822 +
+ + +
+ 80.23% + Branches + 138/172 +
+ + +
+ 48.7% + Functions + 75/154 +
+ + +
+ 77.58% + Lines + 5293/6822 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_dot_abapgit.clas.abap +
+
96.31%366/38073.33%11/1550%4/896.31%366/380
zcl_abapgit_dot_abapgit.clas.testclasses.abap +
+
83.49%86/103100%1/150%1/283.49%86/103
zcl_abapgit_file_status.clas.abap +
+
92.59%525/56786.48%32/3780%4/592.59%525/567
zcl_abapgit_file_status.clas.locals_imp.abap +
+
98.07%306/31285%17/20100%6/698.07%306/312
zcl_abapgit_file_status.clas.testclasses.abap +
+
78.25%1166/1490100%28/2875%27/3678.25%1166/1490
zcl_abapgit_repo.clas.abap +
+
63.51%597/94025%5/2016%4/2563.51%597/940
zcl_abapgit_repo.clas.testclasses.abap +
+
100%153/153100%10/10100%10/10100%153/153
zcl_abapgit_repo_checksums.clas.abap +
+
96.41%215/22388.88%8/985.71%6/796.41%215/223
zcl_abapgit_repo_checksums.clas.locals_imp.abap +
+
95%247/26070.58%12/17100%0/095%247/260
zcl_abapgit_repo_checksums.clas.testclasses.abap +
+
98.11%572/583100%14/1456.52%13/2398.11%572/583
zcl_abapgit_repo_content_list.clas.abap +
+
73.02%249/341100%0/00%0/473.02%249/341
zcl_abapgit_repo_cs_migration.clas.abap +
+
100%117/117100%0/0100%0/0100%117/117
zcl_abapgit_repo_filter.clas.abap +
+
25.9%43/166100%0/00%0/325.9%43/166
zcl_abapgit_repo_offline.clas.abap +
+
74.24%49/66100%0/00%0/274.24%49/66
zcl_abapgit_repo_online.clas.abap +
+
41.68%168/403100%0/00%0/1141.68%168/403
zcl_abapgit_repo_srv.clas.abap +
+
60.44%434/7180%0/10%0/1260.44%434/718
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_dot_abapgit.clas.abap.html b/src/repo/zcl_abapgit_dot_abapgit.clas.abap.html new file mode 100644 index 00000000000..d51b3eded41 --- /dev/null +++ b/src/repo/zcl_abapgit_dot_abapgit.clas.abap.html @@ -0,0 +1,1225 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_dot_abapgit.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_dot_abapgit.clas.abap

+
+ +
+ 96.31% + Statements + 366/380 +
+ + +
+ 73.33% + Branches + 11/15 +
+ + +
+ 50% + Functions + 4/8 +
+ + +
+ 96.31% + Lines + 366/380 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +3811x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +16x +16x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +14x +14x +1x +1x +1x +14x +14x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +20x +20x +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +41x +41x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x + 
CLASS zcl_abapgit_dot_abapgit DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS build_default
+      RETURNING
+        VALUE(ro_dot_abapgit) TYPE REF TO zcl_abapgit_dot_abapgit .
+    CLASS-METHODS deserialize
+      IMPORTING
+        !iv_xstr              TYPE xstring
+      RETURNING
+        VALUE(ro_dot_abapgit) TYPE REF TO zcl_abapgit_dot_abapgit
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !is_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
+    METHODS serialize
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_file
+      RETURNING
+        VALUE(rs_file) TYPE zif_abapgit_git_definitions=>ty_file
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_data
+      RETURNING
+        VALUE(rs_data) TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
+    METHODS add_ignore
+      IMPORTING
+        !iv_path     TYPE string
+        !iv_filename TYPE string .
+    METHODS is_ignored
+      IMPORTING
+        !iv_path          TYPE string
+        !iv_filename      TYPE string
+      RETURNING
+        VALUE(rv_ignored) TYPE abap_bool .
+    METHODS remove_ignore
+      IMPORTING
+        !iv_path     TYPE string
+        !iv_filename TYPE string .
+    METHODS get_starting_folder
+      RETURNING
+        VALUE(rv_path) TYPE string .
+    METHODS get_folder_logic
+      RETURNING
+        VALUE(rv_logic) TYPE string .
+    METHODS set_folder_logic
+      IMPORTING
+        !iv_logic TYPE string .
+    METHODS set_starting_folder
+      IMPORTING
+        !iv_path TYPE string .
+    METHODS get_main_language
+      RETURNING
+        VALUE(rv_language) TYPE spras .
+    METHODS get_i18n_languages
+      RETURNING
+        VALUE(rt_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_i18n_languages
+      IMPORTING
+        VALUE(it_languages) TYPE zif_abapgit_definitions=>ty_languages
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_signature
+      RETURNING
+        VALUE(rs_signature) TYPE zif_abapgit_git_definitions=>ty_file_signature
+      RAISING
+        zcx_abapgit_exception .
+    METHODS use_lxe
+      IMPORTING
+        !iv_yes       TYPE abap_bool DEFAULT abap_undefined
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS get_requirements
+      RETURNING
+        VALUE(rt_requirements) TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt .
+    METHODS set_requirements
+      IMPORTING
+        !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt .
+    METHODS get_version_constant
+      RETURNING
+        VALUE(rv_version_constant) TYPE string .
+    METHODS set_version_constant
+      IMPORTING
+        !iv_version_constant TYPE csequence .
+    METHODS get_abap_language_version
+      RETURNING
+        VALUE(rv_abap_language_version) TYPE string .
+    METHODS set_abap_language_version
+      IMPORTING
+        !iv_abap_language_version TYPE string .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA ms_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
+ 
+    CLASS-METHODS to_xml
+      IMPORTING
+        !is_data      TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit
+      RETURNING
+        VALUE(rv_xml) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS from_xml
+      IMPORTING
+        !iv_xml        TYPE string
+      RETURNING
+        VALUE(rs_data) TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_DOT_ABAPGIT IMPLEMENTATION.
+ 
+ 
+  METHOD add_ignore.
+ 
+    DATA: lv_name TYPE string.
+ 
+    FIELD-SYMBOLS: <lv_ignore> LIKE LINE OF ms_data-ignore.
+ 
+ 
+    lv_name = iv_path && iv_filename.
+ 
+    READ TABLE ms_data-ignore FROM lv_name TRANSPORTING NO FIELDS.
+    IF sy-subrc = 0.
+      RETURN.
+    ENDIF.
+ 
+    APPEND INITIAL LINE TO ms_data-ignore ASSIGNING <lv_ignore>.
+    <lv_ignore> = lv_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_default.
+ 
+    DATA: ls_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
+ 
+ 
+    ls_data-master_language = sy-langu.
+    ls_data-starting_folder = '/src/'.
+    ls_data-folder_logic    = zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+ 
+    CREATE OBJECT ro_dot_abapgit
+      EXPORTING
+        is_data = ls_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    ms_data = is_data.
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize.
+ 
+    DATA: lv_xml  TYPE string,
+          ls_data TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
+ 
+ 
+    lv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( iv_xstr ).
+ 
+    ls_data = from_xml( lv_xml ).
+ 
+    CREATE OBJECT ro_dot_abapgit
+      EXPORTING
+        is_data = ls_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_xml.
+ 
+    DATA: lv_xml TYPE string.
+ 
+    lv_xml = iv_xml.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = 'accept_data_loss'
+      SOURCE XML lv_xml
+      RESULT data = rs_data.
+ 
+* downward compatibility
+    IF rs_data-folder_logic IS INITIAL.
+      rs_data-folder_logic = zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_data.
+    rs_data = ms_data.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_folder_logic.
+    rv_logic = ms_data-folder_logic.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_i18n_languages.
+    rt_languages = ms_data-i18n_languages.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_main_language.
+    rv_language = ms_data-master_language.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_requirements.
+    rt_requirements = ms_data-requirements.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_signature.
+ 
+    rs_signature-path     = zif_abapgit_definitions=>c_root_dir.
+    rs_signature-filename = zif_abapgit_definitions=>c_dot_abapgit.
+    rs_signature-sha1     = zcl_abapgit_hash=>sha1_blob( serialize( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_starting_folder.
+    rv_path = ms_data-starting_folder.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_version_constant.
+    rv_version_constant = ms_data-version_constant.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_ignored.
+ 
+    DATA: lv_name     TYPE string,
+          lv_starting TYPE string,
+          lv_dot      TYPE string,
+          lv_ignore   TYPE string.
+ 
+ 
+    lv_name = iv_path && iv_filename.
+ 
+    CONCATENATE ms_data-starting_folder '*' INTO lv_starting.
+ 
+    " Always allow .abapgit.xml and .apack-manifest.xml
+    CONCATENATE '/' zif_abapgit_definitions=>c_dot_abapgit INTO lv_dot.
+    IF lv_name = lv_dot.
+      RETURN.
+    ENDIF.
+    CONCATENATE '/' zif_abapgit_apack_definitions=>c_dot_apack_manifest INTO lv_dot.
+    IF lv_name = lv_dot.
+      RETURN.
+    ENDIF.
+ 
+    " Ignore all files matching pattern in ignore list
+    LOOP AT ms_data-ignore INTO lv_ignore.
+      IF lv_name CP lv_ignore.
+        rv_ignored = abap_true.
+        RETURN.
+      ENDIF.
+    ENDLOOP.
+ 
+    " Ignore all files outside of starting folder tree
+    IF ms_data-starting_folder <> '/' AND NOT lv_name CP lv_starting.
+      rv_ignored = abap_true.
+    ENDIF.
+ 
+    IF iv_path = zif_abapgit_data_config=>c_default_path.
+      rv_ignored = abap_false.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_ignore.
+ 
+    DATA: lv_name TYPE string.
+ 
+ 
+    lv_name = iv_path && iv_filename.
+ 
+    DELETE TABLE ms_data-ignore FROM lv_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+ 
+    DATA lv_xml TYPE string.
+ 
+    lv_xml = to_xml( ms_data ).
+ 
+    rv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_xml ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_folder_logic.
+    ms_data-folder_logic = iv_logic.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_i18n_languages.
+    ms_data-i18n_languages = it_languages.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_requirements.
+    ms_data-requirements = it_requirements.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_starting_folder.
+    ms_data-starting_folder = iv_path.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_version_constant.
+    ms_data-version_constant = iv_version_constant.
+  ENDMETHOD.
+ 
+ 
+  METHOD to_file.
+    rs_file-path     = zif_abapgit_definitions=>c_root_dir.
+    rs_file-filename = zif_abapgit_definitions=>c_dot_abapgit.
+    rs_file-data     = serialize( ).
+    rs_file-sha1     = zcl_abapgit_hash=>sha1_blob( rs_file-data ).
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS initial_components = 'suppress'
+      SOURCE data = is_data
+      RESULT XML rv_xml.
+ 
+    rv_xml = zcl_abapgit_xml_pretty=>print( rv_xml ).
+ 
+    REPLACE FIRST OCCURRENCE
+      OF REGEX '<\?xml version="1\.0" encoding="[\w-]+"\?>'
+      IN rv_xml
+      WITH '<?xml version="1.0" encoding="utf-8"?>'.
+    ASSERT sy-subrc = 0.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD use_lxe.
+ 
+    IF iv_yes <> abap_undefined.
+      ms_data-use_lxe = iv_yes.
+    ENDIF.
+ 
+    rv_yes = ms_data-use_lxe.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_abap_language_version.
+    rv_abap_language_version = ms_data-abap_language_version.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_abap_language_version.
+    ms_data-abap_language_version = iv_abap_language_version.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_dot_abapgit.clas.testclasses.abap.html b/src/repo/zcl_abapgit_dot_abapgit.clas.testclasses.abap.html new file mode 100644 index 00000000000..ae825888139 --- /dev/null +++ b/src/repo/zcl_abapgit_dot_abapgit.clas.testclasses.abap.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_dot_abapgit.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_dot_abapgit.clas.testclasses.abap

+
+ +
+ 83.49% + Statements + 86/103 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 83.49% + Lines + 86/103 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +1041x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_dot_abapgit DEFINITION DEFERRED.
+CLASS zcl_abapgit_dot_abapgit DEFINITION LOCAL FRIENDS ltcl_dot_abapgit.
+ 
+CLASS ltcl_dot_abapgit DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      identity FOR TESTING
+        RAISING zcx_abapgit_exception,
+      ignore FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_dot_abapgit IMPLEMENTATION.
+ 
+  METHOD identity.
+
+    DATA: lo_dot    TYPE REF TO zcl_abapgit_dot_abapgit,
+          ls_before TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit,
+          ls_after  TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
+
+
+    lo_dot = zcl_abapgit_dot_abapgit=>build_default( ).
+    ls_before = lo_dot->ms_data.
+
+    lo_dot = zcl_abapgit_dot_abapgit=>deserialize( lo_dot->serialize( ) ).
+    ls_after = lo_dot->ms_data.
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_after
+      exp = ls_before ).
+
+  ENDMETHOD.
+ 
+  METHOD ignore.
+ 
+    CONSTANTS: lc_path     TYPE string VALUE '/src/',
+               lc_root     TYPE string VALUE '/',
+               lc_filename TYPE string VALUE 'foobar.txt'.
+ 
+    DATA: lv_ignored TYPE abap_bool,
+          lo_dot     TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+ 
+    lo_dot = zcl_abapgit_dot_abapgit=>build_default( ).
+ 
+    " Any file in default starting folder /src/ should not be ignored
+    lv_ignored = lo_dot->is_ignored( iv_path = lc_path
+                                     iv_filename = lc_filename ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_ignored
+      exp = abap_false ).
+ 
+    " Add file to ignore list -> expect to be ignored
+    lo_dot->add_ignore( iv_path = lc_path
+                        iv_filename = lc_filename ).
+ 
+    lv_ignored = lo_dot->is_ignored( iv_path = lc_path
+                                     iv_filename = lc_filename ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_ignored
+      exp = abap_true ).
+ 
+    " Remove file from ignore list -> expect to be allowed
+    lo_dot->remove_ignore( iv_path = lc_path
+                           iv_filename = lc_filename ).
+ 
+    lv_ignored = lo_dot->is_ignored( iv_path = lc_path
+                                     iv_filename = lc_filename ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_ignored
+      exp = abap_false ).
+ 
+    " .abapgit.xml and .apack-manifest.xml must always be allowed
+    lv_ignored = lo_dot->is_ignored( iv_path = lc_root
+                                     iv_filename = zif_abapgit_definitions=>c_dot_abapgit ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_ignored
+      exp = abap_false ).
+ 
+    lv_ignored = lo_dot->is_ignored( iv_path = lc_root
+                                     iv_filename = zif_abapgit_apack_definitions=>c_dot_apack_manifest ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_ignored
+      exp = abap_false ).
+ 
+    " File in root must be ignored since it's not under starting folder
+    lv_ignored = lo_dot->is_ignored( iv_path = lc_root
+                                     iv_filename = 'abaplint.json' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_ignored
+      exp = abap_true ).
+ 
+    " File under starting folder must not be ignored
+    lv_ignored = lo_dot->is_ignored( iv_path = lc_path
+                                     iv_filename = 'ztest.prog.abap' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_ignored
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_file_status.clas.abap.html b/src/repo/zcl_abapgit_file_status.clas.abap.html new file mode 100644 index 00000000000..bebf9abfcd5 --- /dev/null +++ b/src/repo/zcl_abapgit_file_status.clas.abap.html @@ -0,0 +1,1786 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_file_status.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_file_status.clas.abap

+
+ +
+ 92.59% + Statements + 525/567 +
+ + +
+ 86.48% + Branches + 32/37 +
+ + +
+ 80% + Functions + 4/5 +
+ + +
+ 92.59% + Lines + 525/567 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +5681x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +5x +5x +5x +5x +5x +5x +5x +5x +5x +4x +3x +3x +4x +3x +3x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +4x +4x +4x +12x +12x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +8x +8x +8x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +7x +7x +7x +7x +7x +7x +7x +7x +7x +3x +3x +3x +3x +3x +3x +1x +1x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +12x +12x +12x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +1x +1x +1x +4x +12x +12x +12x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_file_status DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS status
+      IMPORTING
+        !io_repo          TYPE REF TO zcl_abapgit_repo
+        !ii_log           TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_root_package TYPE devclass
+        !io_dot          TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mv_root_package TYPE devclass.
+    DATA mo_dot          TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+    METHODS calculate_status
+      IMPORTING
+        !it_local         TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_remote        TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !it_cur_state     TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS process_local
+      IMPORTING
+        !it_local     TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_state_idx TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+      CHANGING
+        !ct_remote    TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !ct_items     TYPE zif_abapgit_definitions=>ty_items_tt
+        !ct_results   TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS process_items
+      IMPORTING
+        !it_unprocessed_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+      CHANGING
+        !ct_items    TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS process_remote
+      IMPORTING
+        !it_local     TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_unprocessed_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !it_state_idx TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+        !it_items_idx TYPE zif_abapgit_definitions=>ty_items_ts
+      CHANGING
+        !ct_results   TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS build_existing
+      IMPORTING
+        !is_local        TYPE zif_abapgit_definitions=>ty_file_item
+        !is_remote       TYPE zif_abapgit_git_definitions=>ty_file
+        !it_state        TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_definitions=>ty_result .
+    CLASS-METHODS build_new_local
+      IMPORTING
+        !is_local        TYPE zif_abapgit_definitions=>ty_file_item
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_definitions=>ty_result .
+    METHODS build_new_remote
+      IMPORTING
+        !is_remote       TYPE zif_abapgit_git_definitions=>ty_file
+        !it_items_idx    TYPE zif_abapgit_definitions=>ty_items_ts
+        !it_state_idx    TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+      RETURNING
+        VALUE(rs_result) TYPE zif_abapgit_definitions=>ty_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_object_package
+      IMPORTING
+        !iv_object         TYPE tadir-object
+        !iv_obj_name       TYPE tadir-obj_name
+      RETURNING
+        VALUE(rv_devclass) TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS check_local_remote_consistency
+      IMPORTING
+        !is_local        TYPE zif_abapgit_definitions=>ty_file_item
+        !is_remote       TYPE zif_abapgit_git_definitions=>ty_file
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS ensure_state
+      IMPORTING
+        !it_local         TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_cur_state     TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RETURNING
+        VALUE(rt_state) TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_file_status IMPLEMENTATION.
+ 
+ 
+  METHOD build_existing.
+ 
+    DATA ls_file_sig LIKE LINE OF it_state.
+ 
+    " Item
+    rs_result-obj_type  = is_local-item-obj_type.
+    rs_result-obj_name  = is_local-item-obj_name.
+    rs_result-package   = is_local-item-devclass.
+    rs_result-srcsystem = is_local-item-srcsystem.
+    rs_result-origlang  = is_local-item-origlang.
+    rs_result-inactive  = is_local-item-inactive.
+ 
+    " File
+    rs_result-path     = is_local-file-path.
+    rs_result-filename = is_local-file-filename.
+ 
+    rs_result-match    = boolc( is_local-file-sha1 = is_remote-sha1 ).
+    IF rs_result-match = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " Match against current state
+    READ TABLE it_state INTO ls_file_sig
+      WITH KEY
+        path     = is_local-file-path
+        filename = is_local-file-filename
+      BINARY SEARCH.
+ 
+    IF sy-subrc = 0.
+      IF ls_file_sig-sha1 <> is_local-file-sha1.
+        rs_result-lstate = zif_abapgit_definitions=>c_state-modified.
+      ENDIF.
+      IF ls_file_sig-sha1 <> is_remote-sha1.
+        rs_result-rstate = zif_abapgit_definitions=>c_state-modified.
+      ENDIF.
+    ELSE.
+      " This is a strange situation. As both local and remote exist
+      " the state should also be present. Maybe this is a first run of the code.
+      " In this case just compare hashes directly and mark both changed
+      " the user will presumably decide what to do after checking the actual diff
+      rs_result-lstate = zif_abapgit_definitions=>c_state-modified.
+      rs_result-rstate = zif_abapgit_definitions=>c_state-modified.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_new_local.
+ 
+    " Item
+    rs_result-obj_type  = is_local-item-obj_type.
+    rs_result-obj_name  = is_local-item-obj_name.
+    rs_result-package   = is_local-item-devclass.
+    rs_result-srcsystem = is_local-item-srcsystem.
+    rs_result-origlang  = is_local-item-origlang.
+    rs_result-inactive  = is_local-item-inactive.
+ 
+    " File
+    rs_result-path     = is_local-file-path.
+    rs_result-filename = is_local-file-filename.
+ 
+    " Match
+    rs_result-match    = abap_false.
+    rs_result-lstate   = zif_abapgit_definitions=>c_state-added.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_new_remote.
+ 
+    DATA ls_item     LIKE LINE OF it_items_idx.
+    DATA ls_file_sig LIKE LINE OF it_state_idx.
+ 
+    " Common and default part
+    rs_result-path     = is_remote-path.
+    rs_result-filename = is_remote-filename.
+    rs_result-match    = abap_false.
+    rs_result-rstate   = zif_abapgit_definitions=>c_state-added.
+ 
+    zcl_abapgit_filename_logic=>file_to_object(
+      EXPORTING
+        iv_filename = is_remote-filename
+        iv_path     = is_remote-path
+        iv_devclass = mv_root_package
+        io_dot      = mo_dot
+      IMPORTING
+        es_item     = ls_item ).
+ 
+    " Check if in item index + get package
+    READ TABLE it_items_idx INTO ls_item
+      WITH KEY
+        obj_type = ls_item-obj_type
+        obj_name = ls_item-obj_name.
+ 
+    IF sy-subrc = 0.
+ 
+      " Completely new (xml, abap) and new file in an existing object
+      rs_result-obj_type  = ls_item-obj_type.
+      rs_result-obj_name  = ls_item-obj_name.
+      rs_result-package   = ls_item-devclass.
+      rs_result-srcsystem = sy-sysid.
+      rs_result-origlang  = sy-langu.
+ 
+      READ TABLE it_state_idx INTO ls_file_sig
+        WITH KEY
+          path     = is_remote-path
+          filename = is_remote-filename.
+ 
+      " Existing file but from another package
+      " was not added during local file proc as was not in tadir for repo package
+      IF sy-subrc = 0.
+        IF ls_file_sig-sha1 = is_remote-sha1.
+          rs_result-match = abap_true.
+          CLEAR rs_result-rstate.
+        ELSE.
+          rs_result-rstate = zif_abapgit_definitions=>c_state-modified.
+        ENDIF.
+
+        " Item is in state and in cache but with no package - it was deleted
+        " OR devclass is the same as repo package (see #532)
+        IF ls_item-devclass IS INITIAL OR ls_item-devclass = mv_root_package.
+          rs_result-match  = abap_false.
+          rs_result-lstate = zif_abapgit_definitions=>c_state-deleted.
+        ENDIF.
+      ENDIF.
+ 
+    ELSE. " Completely unknown file, probably non-abapgit
+      ASSERT 1 = 1. " No action, just follow defaults
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD calculate_status.
+ 
+    DATA:
+      lt_remote        LIKE it_remote,
+      lt_items         TYPE zif_abapgit_definitions=>ty_items_tt,
+      lt_items_by_obj  TYPE zif_abapgit_definitions=>ty_items_ts, " Sorted by obj_type+obj_name
+      lt_state_by_file TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts. " Sorted by path+filename
+ 
+    lt_state_by_file = ensure_state( " Index by file
+      it_cur_state = it_cur_state
+      it_local     = it_local ).
+    lt_remote        = it_remote.
+ 
+    " Process local files and new local files
+    process_local(
+      EXPORTING
+        it_local     = it_local
+        it_state_idx = lt_state_by_file
+      CHANGING
+        ct_remote    = lt_remote
+        ct_items     = lt_items
+        ct_results   = rt_results ).
+ 
+    " Remove processed remotes (with cleared SHA1)
+    DELETE lt_remote WHERE sha1 IS INITIAL.
+ 
+    " Complete item index for unmarked remote files
+    process_items( " TODO: rename ?
+      EXPORTING
+        it_unprocessed_remote = lt_remote
+      CHANGING
+        ct_items              = lt_items ).
+ 
+    " The item list was not unique by now, just collected as "mention" list
+    SORT lt_items DESCENDING. " Default key - type, name, pkg, ...
+    DELETE ADJACENT DUPLICATES FROM lt_items COMPARING obj_type obj_name.
+    lt_items_by_obj = lt_items.
+ 
+    " Process new remote files (marked above with empty SHA1)
+    process_remote(
+      EXPORTING
+        it_local              = it_local
+        it_unprocessed_remote = lt_remote
+        it_state_idx          = lt_state_by_file
+        it_items_idx          = lt_items_by_obj
+      CHANGING
+        ct_results            = rt_results ).
+ 
+    SORT rt_results BY
+      obj_type ASCENDING
+      obj_name ASCENDING
+      filename ASCENDING
+      path ASCENDING.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_local_remote_consistency.
+    IF is_remote-sha1 IS INITIAL.
+      IF is_local-file-filename = zcl_abapgit_filename_logic=>c_package_file.
+        zcx_abapgit_exception=>raise(
+          |Package name conflict { is_local-item-obj_type } { is_local-item-obj_name }. | &&
+          |Rename package or use FULL folder logic| ).
+      ELSE.
+        zcx_abapgit_exception=>raise(
+          |Checksum conflict { is_local-item-obj_type } { is_local-item-obj_name }. | &&
+          |Please create an issue on Github| ).
+      ENDIF.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_root_package = iv_root_package.
+    mo_dot          = io_dot.
+  ENDMETHOD.
+ 
+ 
+  METHOD ensure_state.
+ 
+    FIELD-SYMBOLS <ls_state> LIKE LINE OF rt_state.
+    FIELD-SYMBOLS <ls_local> LIKE LINE OF it_local.
+ 
+    IF lines( it_cur_state ) = 0.
+      " Empty state is usually not expected. Maybe for new repos.
+      " In this case suppose the local state is unchanged
+      LOOP AT it_local ASSIGNING <ls_local>.
+        APPEND INITIAL LINE TO rt_state ASSIGNING <ls_state>.
+        MOVE-CORRESPONDING <ls_local>-file TO <ls_state>.
+      ENDLOOP.
+    ELSE.
+      rt_state = it_cur_state.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_object_package.
+    DATA: lv_name    TYPE devclass,
+          li_package TYPE REF TO zif_abapgit_sap_package.
+ 
+    rv_devclass = zcl_abapgit_factory=>get_tadir( )->get_object_package(
+      iv_object   = iv_object
+      iv_obj_name = iv_obj_name ).
+    IF rv_devclass IS INITIAL AND iv_object = 'DEVC' AND iv_obj_name(1) = '$'.
+      " local packages usually have no tadir entry
+      lv_name = iv_obj_name.
+      li_package = zcl_abapgit_factory=>get_sap_package( lv_name ).
+      IF li_package->exists( ) = abap_true.
+        rv_devclass = lv_name.
+      ENDIF.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD process_items.
+ 
+    DATA:
+      ls_item         LIKE LINE OF ct_items,
+      lv_is_xml       TYPE abap_bool,
+      lv_is_json      TYPE abap_bool,
+      lv_sub_fetched  TYPE abap_bool,
+      lt_sub_packages TYPE SORTED TABLE OF devclass WITH UNIQUE KEY table_line.
+ 
+    FIELD-SYMBOLS <ls_remote> LIKE LINE OF it_unprocessed_remote.
+ 
+    LOOP AT it_unprocessed_remote ASSIGNING <ls_remote>.
+ 
+      zcl_abapgit_filename_logic=>file_to_object(
+        EXPORTING
+          iv_filename = <ls_remote>-filename
+          iv_path     = <ls_remote>-path
+          io_dot      = mo_dot
+          iv_devclass = mv_root_package
+        IMPORTING
+          es_item     = ls_item
+          ev_is_xml   = lv_is_xml
+          ev_is_json  = lv_is_json ).
+ 
+      CHECK lv_is_xml = abap_true OR lv_is_json = abap_true. " only object definitions
+ 
+      ls_item-devclass = get_object_package(
+        iv_object   = ls_item-obj_type
+        iv_obj_name = ls_item-obj_name ).
+ 
+      IF ls_item-devclass IS NOT INITIAL AND mv_root_package <> ls_item-devclass.
+        IF lv_sub_fetched = abap_false.
+          lt_sub_packages = zcl_abapgit_factory=>get_sap_package( mv_root_package )->list_subpackages( ).
+          lv_sub_fetched  = abap_true.
+        ENDIF.
+ 
+        " Make sure the package is under the repo main package
+        READ TABLE lt_sub_packages TRANSPORTING NO FIELDS
+          WITH KEY table_line = ls_item-devclass.
+        IF sy-subrc <> 0 AND ls_item-obj_type = 'DEVC'.
+          CLEAR ls_item-devclass.
+        ENDIF.
+      ENDIF.
+ 
+      APPEND ls_item TO ct_items.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD process_local.
+ 
+    FIELD-SYMBOLS:
+      <ls_remote> LIKE LINE OF ct_remote,
+      <ls_result> LIKE LINE OF ct_results,
+      <ls_state>  LIKE LINE OF it_state_idx,
+      <ls_local>  LIKE LINE OF it_local.
+ 
+    LOOP AT it_local ASSIGNING <ls_local>.
+      " Skip ignored files
+      CHECK mo_dot->is_ignored(
+        iv_path     = <ls_local>-file-path
+        iv_filename = <ls_local>-file-filename ) = abap_false.
+ 
+      IF <ls_local>-item IS NOT INITIAL
+        AND zcl_abapgit_filename_logic=>is_obj_definition_file( <ls_local>-file-filename ) = abap_true.
+        " Collect for item index
+        APPEND <ls_local>-item TO ct_items.
+      ENDIF.
+ 
+      APPEND INITIAL LINE TO ct_results ASSIGNING <ls_result>.
+ 
+      " Find a match in remote
+      READ TABLE ct_remote ASSIGNING <ls_remote>
+        WITH KEY file_path
+        COMPONENTS
+          path     = <ls_local>-file-path
+          filename = <ls_local>-file-filename.
+      IF sy-subrc = 0.  " Both local and remote exist
+        check_local_remote_consistency(
+          is_local  = <ls_local>
+          is_remote = <ls_remote> ).
+        <ls_result> = build_existing(
+          is_local  = <ls_local>
+          is_remote = <ls_remote>
+          it_state  = it_state_idx ).
+        CLEAR <ls_remote>-sha1. " Mark as processed
+      ELSE. " Only local exists
+        <ls_result> = build_new_local( <ls_local> ).
+        " Check if same file exists in different location
+        READ TABLE ct_remote ASSIGNING <ls_remote>
+          WITH KEY file
+          COMPONENTS filename = <ls_local>-file-filename.
+        IF sy-subrc = 0 AND <ls_local>-file-sha1 = <ls_remote>-sha1.
+          " If yes, then it was probably moved
+          <ls_result>-packmove = abap_true.
+        ELSEIF sy-subrc = 4.
+          " Check if file existed before and was deleted remotely
+          READ TABLE it_state_idx ASSIGNING <ls_state>
+            WITH KEY
+              path     = <ls_local>-file-path
+              filename = <ls_local>-file-filename.
+          IF sy-subrc = 0.
+            IF <ls_local>-file-sha1 = <ls_state>-sha1.
+              <ls_result>-lstate = zif_abapgit_definitions=>c_state-unchanged.
+            ELSE.
+              <ls_result>-lstate = zif_abapgit_definitions=>c_state-modified.
+            ENDIF.
+            <ls_result>-rstate = zif_abapgit_definitions=>c_state-deleted. " ??
+          ENDIF.
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD process_remote.
+ 
+    FIELD-SYMBOLS:
+      <ls_remote> LIKE LINE OF it_unprocessed_remote,
+      <ls_result> LIKE LINE OF ct_results,
+      <ls_local>  LIKE LINE OF it_local.
+ 
+    LOOP AT it_unprocessed_remote ASSIGNING <ls_remote>.
+ 
+      APPEND INITIAL LINE TO ct_results ASSIGNING <ls_result>.
+ 
+      <ls_result> = build_new_remote(
+        is_remote   = <ls_remote>
+        it_items_idx = it_items_idx
+        it_state_idx = it_state_idx ).
+ 
+      " Check if same file exists in different location (not for generic package files)
+      READ TABLE it_local ASSIGNING <ls_local>
+        WITH KEY file-filename = <ls_remote>-filename.
+      IF sy-subrc = 0 AND <ls_remote>-filename <> zcl_abapgit_filename_logic=>c_package_file.
+        <ls_result>-match = abap_false.
+        <ls_result>-lstate = zif_abapgit_definitions=>c_state-deleted.
+        <ls_result>-rstate = zif_abapgit_definitions=>c_state-unchanged.
+        IF <ls_local>-file-sha1 = <ls_remote>-sha1.
+          <ls_result>-packmove = abap_true.
+        ENDIF.
+      ELSE.
+        " Check if file existed before and was deleted locally
+        READ TABLE it_state_idx TRANSPORTING NO FIELDS
+          WITH KEY
+            path     = <ls_remote>-path
+            filename = <ls_remote>-filename.
+        IF sy-subrc = 0.
+          <ls_result>-match  = abap_false.
+          <ls_result>-lstate = zif_abapgit_definitions=>c_state-deleted.
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD status.
+ 
+    DATA lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt.
+    DATA lt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+    DATA lo_instance TYPE REF TO zcl_abapgit_file_status.
+    DATA lo_consistency_checks TYPE REF TO lcl_status_consistency_checks.
+ 
+    lt_local = io_repo->get_files_local( ii_log = ii_log ).
+ 
+    IF lines( lt_local ) <= 2.
+      " Less equal two means that we have only the .abapgit.xml and the package in
+      " our local repository. In this case we have to update our local .abapgit.xml
+      " from the remote one. Otherwise we get errors when e.g. the folder starting
+      " folder is different.
+      io_repo->find_remote_dot_abapgit( ).
+    ENDIF.
+ 
+    lt_remote = io_repo->get_files_remote( iv_ignore_files = abap_true ).
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->pre_calculate_repo_status(
+      EXPORTING
+        is_repo_meta = io_repo->ms_data
+      CHANGING
+        ct_local  = lt_local
+        ct_remote = lt_remote ).
+ 
+    CREATE OBJECT lo_instance
+      EXPORTING
+        iv_root_package = io_repo->get_package( )
+        io_dot          = io_repo->get_dot_abapgit( ).
+ 
+    rt_results = lo_instance->calculate_status(
+      it_local     = lt_local
+      it_remote    = lt_remote
+      it_cur_state = io_repo->zif_abapgit_repo~checksums( )->get_checksums_per_file( ) ).
+ 
+    IF ii_log IS BOUND.
+      " This method just adds messages to the log. No log, nothing to do here
+      CREATE OBJECT lo_consistency_checks
+        EXPORTING
+          iv_root_package = io_repo->get_package( )
+          io_dot          = io_repo->get_dot_abapgit( ).
+      ii_log->merge_with( lo_consistency_checks->run_checks( rt_results ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_file_status.clas.locals_imp.abap.html b/src/repo/zcl_abapgit_file_status.clas.locals_imp.abap.html new file mode 100644 index 00000000000..333870ce167 --- /dev/null +++ b/src/repo/zcl_abapgit_file_status.clas.locals_imp.abap.html @@ -0,0 +1,1021 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_file_status.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_file_status.clas.locals_imp.abap

+
+ +
+ 98.07% + Statements + 306/312 +
+ + +
+ 85% + Branches + 17/20 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 98.07% + Lines + 306/312 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +3131x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +18x +18x +18x +18x +18x +18x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +1x +1x +1x +9x +9x +9x +9x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +1x +1x +9x +9x +1x +1x +9x +9x +9x +9x +9x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +1x +1x +1x +9x +9x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +  +  +9x +9x +9x +9x +9x +9x +  +  +  +9x +9x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +  +9x +2x +2x +9x +9x +9x +9x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +2x +2x +2x +2x +2x +2x +2x +9x +9x +9x +9x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +1x +1x + 
CLASS lcl_status_consistency_checks DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_root_package TYPE devclass
+        io_dot          TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+    METHODS run_checks
+      IMPORTING
+        it_results    TYPE zif_abapgit_definitions=>ty_results_tt
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PRIVATE SECTION.
+ 
+    DATA mv_root_package TYPE devclass.
+    DATA mo_dot          TYPE REF TO zcl_abapgit_dot_abapgit.
+    DATA mi_log          TYPE REF TO zif_abapgit_log.
+ 
+    METHODS check_package_move
+      IMPORTING
+        !it_results TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_files_folder
+      IMPORTING
+        !it_results TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_package_sub_package
+      IMPORTING
+        !it_results TYPE zif_abapgit_definitions=>ty_results_tt
+        !iv_top     TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_package_folder
+      IMPORTING
+        !it_results TYPE zif_abapgit_definitions=>ty_results_tt
+        !io_dot     TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_top     TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_multiple_files
+      IMPORTING
+        !it_results TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_namespace
+      IMPORTING
+        !it_results      TYPE zif_abapgit_definitions=>ty_results_tt
+        !iv_root_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+ 
+ENDCLASS.
+ 
+CLASS lcl_status_consistency_checks IMPLEMENTATION.
+ 
+  METHOD constructor.
+    mv_root_package = iv_root_package.
+    mo_dot          = io_dot.
+  ENDMETHOD.
+ 
+  METHOD run_checks.
+ 
+    CREATE OBJECT mi_log TYPE zcl_abapgit_log.
+ 
+    " Find all objects which were assigned to a different package
+    check_package_move( it_results ).
+ 
+    " Check files for one object is in the same folder
+    check_files_folder( it_results ).
+ 
+    " Check that sub packages are included in the package hierarchy
+    check_package_sub_package(
+      it_results = it_results
+      iv_top     = mv_root_package ).
+ 
+    " Check that objects are created in package corresponding to folder
+    check_package_folder(
+      it_results = it_results
+      io_dot     = mo_dot
+      iv_top     = mv_root_package ).
+ 
+    " Check for multiple files with same filename
+    check_multiple_files( it_results ).
+ 
+    " Check if namespaces exist already
+    check_namespace(
+      it_results      = it_results
+      iv_root_package = mv_root_package ).
+ 
+    ri_log = mi_log.
+ 
+  ENDMETHOD.
+ 
+  METHOD check_files_folder.
+ 
+    DATA:
+      ls_item     TYPE zif_abapgit_definitions=>ty_item,
+      lt_res_sort LIKE it_results,
+      lt_item_idx LIKE it_results.
+ 
+    FIELD-SYMBOLS:
+      <ls_result>     LIKE LINE OF it_results,
+      <ls_result_idx> LIKE LINE OF it_results.
+ 
+    " TODO optimize ?
+    " sort by obj, path
+    " loop, and compare to first object record
+ 
+    " Collect object index
+    lt_res_sort = it_results.
+    SORT lt_res_sort BY obj_type ASCENDING obj_name ASCENDING.
+ 
+    LOOP AT it_results ASSIGNING <ls_result> WHERE NOT obj_type IS INITIAL AND packmove = abap_false.
+ 
+      IF NOT ( <ls_result>-obj_type = ls_item-obj_type
+          AND <ls_result>-obj_name = ls_item-obj_name ).
+        APPEND INITIAL LINE TO lt_item_idx ASSIGNING <ls_result_idx>.
+        <ls_result_idx>-obj_type = <ls_result>-obj_type.
+        <ls_result_idx>-obj_name = <ls_result>-obj_name.
+        <ls_result_idx>-path     = <ls_result>-path.
+        MOVE-CORRESPONDING <ls_result> TO ls_item.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    LOOP AT it_results ASSIGNING <ls_result>
+      WHERE NOT obj_type IS INITIAL AND obj_type <> 'DEVC' AND packmove = abap_false.
+ 
+      READ TABLE lt_item_idx ASSIGNING <ls_result_idx>
+        WITH KEY obj_type = <ls_result>-obj_type obj_name = <ls_result>-obj_name
+        BINARY SEARCH. " Sorted above
+ 
+      IF sy-subrc <> 0 OR <ls_result>-path <> <ls_result_idx>-path. " All paths are same
+        mi_log->add_warning( |Files for object { <ls_result>-obj_type } { <ls_result>-obj_name }|
+         && | are not placed in the same folder| ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD check_multiple_files.
+ 
+    DATA:
+      lt_res_sort LIKE it_results,
+      ls_file     TYPE zif_abapgit_git_definitions=>ty_file_signature.
+ 
+    FIELD-SYMBOLS <ls_result> LIKE LINE OF it_results.
+ 
+    lt_res_sort = it_results.
+    SORT lt_res_sort BY filename ASCENDING.
+ 
+    LOOP AT lt_res_sort ASSIGNING <ls_result> WHERE obj_type <> 'DEVC' AND packmove = abap_false.
+      IF <ls_result>-filename IS NOT INITIAL AND <ls_result>-filename = ls_file-filename.
+        mi_log->add_warning( |Multiple files with same filename, { <ls_result>-filename }| ).
+      ENDIF.
+ 
+      IF <ls_result>-filename IS INITIAL.
+        mi_log->add_warning( |Filename is empty for object { <ls_result>-obj_type } { <ls_result>-obj_name }| ).
+      ENDIF.
+ 
+      MOVE-CORRESPONDING <ls_result> TO ls_file.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_namespace.
+ 
+    DATA:
+      li_namespace       TYPE REF TO zif_abapgit_sap_namespace,
+      lv_namespace       TYPE namespace,
+      lt_namespace       TYPE TABLE OF namespace,
+      lv_namespace_found TYPE abap_bool.
+ 
+    FIELD-SYMBOLS <ls_result> LIKE LINE OF it_results.
+ 
+    " Collect all namespaces based on name of xml- and json-files
+    LOOP AT it_results ASSIGNING <ls_result>.
+      FIND REGEX '^#([a-zA-Z0-9]+)#.*\..*\.xml$' IN <ls_result>-filename SUBMATCHES lv_namespace.
+      IF sy-subrc = 0.
+        lv_namespace = '/' && to_upper( lv_namespace ) && '/'.
+        COLLECT lv_namespace INTO lt_namespace.
+      ENDIF.
+      FIND REGEX '^\(([a-zA-Z0-9]+)\).*\..*\.json$' IN <ls_result>-filename SUBMATCHES lv_namespace.
+      IF sy-subrc = 0.
+        lv_namespace = '/' && to_upper( lv_namespace ) && '/'.
+        COLLECT lv_namespace INTO lt_namespace.
+      ENDIF.
+    ENDLOOP.
+ 
+    li_namespace = zcl_abapgit_factory=>get_sap_namespace( ).
+ 
+    LOOP AT lt_namespace INTO lv_namespace.
+      IF iv_root_package CS lv_namespace.
+        lv_namespace_found = abap_true.
+      ENDIF.
+ 
+      IF li_namespace->exists( lv_namespace ) = abap_false.
+        mi_log->add_warning( |Namespace { lv_namespace } does not exist.|
+          && | Pull it first (or create it in transaction SE03)| ).
+      ELSEIF li_namespace->is_editable( lv_namespace ) = abap_false.
+        mi_log->add_warning( |Namespace { lv_namespace } is not modifiable. Check it in transaction SE03| ).
+      ENDIF.
+    ENDLOOP.
+ 
+    IF lt_namespace IS NOT INITIAL AND lv_namespace_found = abap_false.
+      mi_log->add_error( |Package { iv_root_package } is not part of the contained namespaces.|
+          && | Remove repository and use a different package| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_package_folder.
+ 
+    DATA:
+      lv_path         TYPE string,
+      lv_object       TYPE string,
+      lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
+ 
+    FIELD-SYMBOLS <ls_result> LIKE LINE OF it_results.
+ 
+    lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
+ 
+    LOOP AT it_results ASSIGNING <ls_result>
+      WHERE NOT package IS INITIAL AND NOT path IS INITIAL AND packmove = abap_false.
+ 
+      lv_path = lo_folder_logic->package_to_path(
+        iv_top     = iv_top
+        io_dot     = io_dot
+        iv_package = <ls_result>-package ).
+ 
+      lv_object = |{ <ls_result>-obj_type } { <ls_result>-obj_name }|.
+ 
+      IF lv_path IS INITIAL.
+        mi_log->add_error( |{ lv_object } already exists outside of { iv_top } package hierarchy| ).
+      ELSEIF lv_path <> <ls_result>-path.
+        mi_log->add_warning( |Package and path do not match for object { lv_object }| ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_package_move.
+ 
+    DATA lt_move_idx LIKE it_results.
+ 
+    FIELD-SYMBOLS:
+      <ls_result>      LIKE LINE OF it_results,
+      <ls_result_move> LIKE LINE OF it_results.
+ 
+    " TODO: optimize ?
+    " delete where packmove = false, delete adj duplicates and fire messages ?
+    LOOP AT it_results ASSIGNING <ls_result>
+      WHERE lstate = zif_abapgit_definitions=>c_state-added AND packmove = abap_true.
+ 
+      READ TABLE lt_move_idx TRANSPORTING NO FIELDS
+        WITH KEY
+          obj_type = <ls_result>-obj_type
+          obj_name = <ls_result>-obj_name
+        BINARY SEARCH. " Sorted since it_result is sorted
+      IF sy-subrc <> 0.
+        mi_log->add_warning( |Changed package assignment for object|
+          && | { <ls_result>-obj_type } { <ls_result>-obj_name }| ).
+        APPEND INITIAL LINE TO lt_move_idx ASSIGNING <ls_result_move>.
+        <ls_result_move>-obj_type = <ls_result>-obj_type.
+        <ls_result_move>-obj_name = <ls_result>-obj_name.
+        <ls_result_move>-path     = <ls_result>-path.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_package_sub_package.
+ 
+    DATA lv_msg TYPE string.
+ 
+    FIELD-SYMBOLS <ls_result> LIKE LINE OF it_results.
+ 
+    LOOP AT it_results ASSIGNING <ls_result> USING KEY sec_key
+                       WHERE package IS INITIAL AND obj_type = 'DEVC'.
+ 
+      IF zcl_abapgit_factory=>get_sap_package( |{ <ls_result>-obj_name }| )->exists( ) = abap_true.
+        " If package already exist but is not included in the package hierarchy of
+        " the package assigned to the repository, then a manual change of the package
+        " is required i.e. setting a parent package to the repo package (or one of its
+        " subpackages). We don't do this automatically since it's not clear where in the
+        " hierarchy the new package should be located or whether the sub package shall be
+        " removed from the repo.
+        lv_msg = |Package { <ls_result>-obj_name } already exists but is not a sub-package of { iv_top }. |
+              && |Check your package and folder logic, and either assign { <ls_result>-obj_name } |
+              && |to the package hierarchy of { iv_top } or remove package { <ls_result>-obj_name } |
+              && |from the repository.|.
+        mi_log->add_warning( lv_msg ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_file_status.clas.testclasses.abap.html b/src/repo/zcl_abapgit_file_status.clas.testclasses.abap.html new file mode 100644 index 00000000000..d14ce7d4a10 --- /dev/null +++ b/src/repo/zcl_abapgit_file_status.clas.testclasses.abap.html @@ -0,0 +1,4555 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_file_status.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_file_status.clas.testclasses.abap

+
+ +
+ 78.25% + Statements + 1166/1490 +
+ + +
+ 100% + Branches + 28/28 +
+ + +
+ 75% + Functions + 27/36 +
+ + +
+ 78.25% + Lines + 1166/1490 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +14911x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +29x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +1x +1x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +10x +10x +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_run_checks DEFINITION DEFERRED.
+CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_run_checks.
+ 
+CLASS ltcl_util DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+  PUBLIC SECTION.
+    CLASS-METHODS check_contains
+      IMPORTING
+        ii_log     TYPE REF TO zif_abapgit_log
+        iv_pattern TYPE string.
+ENDCLASS.
+ 
+CLASS ltcl_util IMPLEMENTATION.
+  METHOD check_contains.
+    DATA lt_messages TYPE zif_abapgit_log=>ty_log_outs.
+    DATA ls_message LIKE LINE OF lt_messages.
+    DATA lv_contains TYPE abap_bool.
+ 
+    lt_messages = ii_log->get_messages( ).
+    LOOP AT lt_messages INTO ls_message.
+      IF ls_message-text CP iv_pattern.
+        lv_contains = abap_true.
+        EXIT.
+      ENDIF.
+    ENDLOOP.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_contains
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_run_checks DEFINITION FOR TESTING RISK LEVEL HARMLESS
+  DURATION SHORT FINAL.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_sap_package.
+    INTERFACES zif_abapgit_sap_namespace.
+ 
+  PRIVATE SECTION.
+    DATA: mt_results  TYPE zif_abapgit_definitions=>ty_results_tt,
+          mo_instance TYPE REF TO lcl_status_consistency_checks,
+          mo_dot      TYPE REF TO zcl_abapgit_dot_abapgit,
+          mi_log      TYPE REF TO zif_abapgit_log.
+ 
+    METHODS:
+      append_result IMPORTING iv_obj_type TYPE trobjtype
+                              iv_obj_name TYPE sobj_name
+                              iv_match    TYPE abap_bool
+                              iv_lstate   TYPE char1
+                              iv_rstate   TYPE char1
+                              iv_package  TYPE devclass
+                              iv_path     TYPE string
+                              iv_filename TYPE string
+                              iv_packmove TYPE abap_bool OPTIONAL,
+      setup,
+      positive FOR TESTING RAISING zcx_abapgit_exception,
+      neg_diff_path_for_same_obj FOR TESTING RAISING zcx_abapgit_exception,
+      neg_incorrect_path_vs_pack FOR TESTING RAISING zcx_abapgit_exception,
+      neg_similar_filenames FOR TESTING RAISING zcx_abapgit_exception,
+      neg_empty_filenames FOR TESTING RAISING zcx_abapgit_exception,
+      package_move FOR TESTING RAISING zcx_abapgit_exception,
+      check_namespace FOR TESTING RAISING zcx_abapgit_exception,
+      check_namespace_aff FOR TESTING RAISING zcx_abapgit_exception,
+      check_sub_package FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_run_checks IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_subpackages.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_parent.
+    rv_parentcl = '$MAIN'.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_child.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~exists.
+    rv_bool = abap_true.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_local.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_namespace~exists.
+    rv_yes = boolc( iv_namespace <> 'NOTEXIST' ).
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_namespace~is_editable.
+  ENDMETHOD.
+ 
+  METHOD append_result.
+ 
+    DATA ls_result LIKE LINE OF mt_results.
+ 
+    ls_result-inactive = abap_false.
+ 
+    ls_result-obj_type = iv_obj_type.
+    ls_result-obj_name = iv_obj_name.
+    ls_result-match    = iv_match.
+    ls_result-lstate   = iv_lstate.
+    ls_result-rstate   = iv_rstate.
+    ls_result-package  = iv_package.
+    ls_result-path     = iv_path.
+    ls_result-filename = iv_filename.
+    ls_result-packmove = iv_packmove.
+ 
+    APPEND ls_result TO mt_results.
+ 
+  ENDMETHOD.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mi_log TYPE zcl_abapgit_log.
+ 
+    mo_dot = zcl_abapgit_dot_abapgit=>build_default( ).
+    mo_dot->set_starting_folder( '/' ).  " assumed by unit tests
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '$MAIN'
+                                           ii_sap_package = me ).
+ 
+    zcl_abapgit_injector=>set_sap_package( iv_package     = '$MAIN_SUB'
+                                           ii_sap_package = me ).
+ 
+    zcl_abapgit_injector=>set_sap_namespace( me ).
+ 
+    CREATE OBJECT mo_instance
+      EXPORTING
+        iv_root_package = '$Z$'
+        io_dot          = mo_dot.
+ 
+  ENDMETHOD.
+ 
+  METHOD positive.
+ 
+    " 0 Positive
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = 'ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zclass1.clas.abap' ).
+ 
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = 'ZCLASS1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zclass1.clas.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = 'ZDOMA1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zdoma1.doma.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = 'ZDOMA2'
+                   iv_match    = ' '
+                   iv_lstate   = 'M'
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zdoma2.doma.xml' ).
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD neg_diff_path_for_same_obj.
+ 
+    " 1 Negative, different path for same object
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = 'ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zclass1.clas.abap' ).
+ 
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = 'ZCLASS1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/sub'
+                   iv_filename = 'zclass1.clas.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = 'ZDOMA1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zdoma1.doma.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = 'ZDOMA2'
+                   iv_match    = ' '
+                   iv_lstate   = 'M'
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zdoma2.doma.xml' ).
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    " This one is not pure - incorrect path also triggers path vs package check
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 2 ).
+ 
+    ltcl_util=>check_contains(
+      ii_log     = mi_log
+      iv_pattern = |Files for object *| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD neg_incorrect_path_vs_pack.
+ 
+    " 2 Negative, incorrect path vs package
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = '$$ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zclass1.clas.abap' ).
+ 
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = '$$ZCLASS1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zclass1.clas.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = '$$ZDOMA1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/sub'
+                   iv_filename = '$$zdoma1.doma.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = '$$ZDOMA2'
+                   iv_match    = ' '
+                   iv_lstate   = 'M'
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zdoma2.doma.xml' ).
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 1 ).
+ 
+    ltcl_util=>check_contains(
+      ii_log     = mi_log
+      iv_pattern = |Package and path do not match for object*| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD neg_similar_filenames.
+ 
+    " 3 Negative, similar filenames
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = '$$ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zclass1.clas.abap' ).
+ 
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = '$$ZCLASS1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zclass1.clas.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = '$$ZDOMA1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zdoma1.doma.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = '$$ZDOMA2'
+                   iv_match    = ' '
+                   iv_lstate   = 'M'
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zdoma1.doma.xml' ).
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 1 ).
+ 
+    ltcl_util=>check_contains(
+      ii_log     = mi_log
+      iv_pattern = |Multiple files with same filename, *| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD neg_empty_filenames.
+ 
+    " 4 Negative, empty filenames
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = '$$ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zclass1.clas.abap' ).
+ 
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = '$$ZCLASS1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '$$zclass1.clas.xml' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = '$$ZDOMA1'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = '' ).
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 1 ).
+ 
+    ltcl_util=>check_contains(
+      ii_log     = mi_log
+      iv_pattern = |Filename is empty for object *| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD package_move.
+ 
+    " 5 Changed package assignment
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = 'ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zclass1.clas.abap'
+                   iv_packmove = 'X' ).
+ 
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = 'ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = 'A'
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$SUB'
+                   iv_path     = '/sub'
+                   iv_filename = 'zclass1.clas.abap'
+                   iv_packmove = 'X' ).
+ 
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = 'ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zclass1.clas.xml'
+                   iv_packmove = 'X' ).
+ 
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = 'ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = 'A'
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$SUB'
+                   iv_path     = '/sub'
+                   iv_filename = 'zclass1.clas.xml'
+                   iv_packmove = 'X' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = 'ZDOMA1'
+                   iv_match    = ' '
+                   iv_lstate   = 'A'
+                   iv_rstate   = ' '
+                   iv_package  = '$Z$'
+                   iv_path     = '/'
+                   iv_filename = 'zdoma1.doma.xml'
+                   iv_packmove = 'X' ).
+ 
+    append_result( iv_obj_type = 'DOMA'
+                   iv_obj_name = 'ZDOMA2'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '$Z$SUB'
+                   iv_path     = '/sub'
+                   iv_filename = 'zdoma1.doma.xml'
+                   iv_packmove = 'X' ).
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    " Three files, but only two msg (for two changed objects)
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 2 ).
+ 
+    ltcl_util=>check_contains(
+      ii_log     = mi_log
+      iv_pattern = |Changed package assignment for object*| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD check_namespace.
+ 
+    " 6 Missing namespace
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = '/NOTEXIST/ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '/NOTEXIST/Z'
+                   iv_path     = '/'
+                   iv_filename = '#notexist#zclass1.clas.xml' ).
+ 
+    CREATE OBJECT mo_instance
+      EXPORTING
+        iv_root_package = '/NOTEXIST/Z'
+        io_dot          = mo_dot.
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 1 ).
+ 
+    ltcl_util=>check_contains(
+      ii_log     = mi_log
+      iv_pattern = |Namespace *| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD check_namespace_aff.
+ 
+    " 6 Missing namespace
+    append_result( iv_obj_type = 'CLAS'
+                   iv_obj_name = '/NOTEXIST/ZCLASS1'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'A'
+                   iv_package  = '/NOTEXIST/Z'
+                   iv_path     = '/'
+                   iv_filename = '(notexist)zclass1.clas.json' ).
+ 
+    CREATE OBJECT mo_instance
+      EXPORTING
+        iv_root_package = '/NOTEXIST/Z'
+        io_dot          = mo_dot.
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 1 ).
+ 
+    ltcl_util=>check_contains(
+      ii_log     = mi_log
+      iv_pattern = |Namespace *| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD check_sub_package.
+ 
+    append_result( iv_obj_type = 'DEVC'
+                   iv_obj_name = '$MAIN'
+                   iv_match    = 'X'
+                   iv_lstate   = ' '
+                   iv_rstate   = ' '
+                   iv_package  = '$MAIN'
+                   iv_path     = '/'
+                   iv_filename = 'package.devc.xml' ).
+ 
+    append_result( iv_obj_type = 'DEVC'
+                   iv_obj_name = '$MAIN_SUB'
+                   iv_match    = ' '
+                   iv_lstate   = ' '
+                   iv_rstate   = 'X'
+                   iv_package  = ''
+                   iv_path     = ''
+                   iv_filename = 'package.devc.xml' ).
+ 
+    CREATE OBJECT mo_instance
+      EXPORTING
+        iv_root_package = '$MAIN'
+        io_dot          = mo_dot.
+ 
+    mi_log = mo_instance->run_checks( mt_results ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_log->count( )
+      exp = 1 ).
+ 
+    ltcl_util=>check_contains(
+      ii_log     = mi_log
+      iv_pattern = |Package $MAIN_SUB already exists but is not a sub-package of $MAIN*| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_status_result DEFINITION.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor
+        IMPORTING
+          it_results TYPE zif_abapgit_definitions=>ty_results_tt,
+      get_line
+        IMPORTING
+          iv_line        TYPE i
+        RETURNING
+          VALUE(rs_data) TYPE zif_abapgit_definitions=>ty_result,
+      assert_lines
+        IMPORTING
+          iv_lines TYPE i
+          iv_msg   TYPE csequence OPTIONAL.
+ 
+  PRIVATE SECTION.
+    DATA: mt_results TYPE zif_abapgit_definitions=>ty_results_tt.
+ 
+ENDCLASS.
+ 
+CLASS lcl_status_result IMPLEMENTATION.
+ 
+  METHOD constructor.
+ 
+    mt_results = it_results.
+    SORT mt_results BY path filename.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_line.
+ 
+    READ TABLE mt_results INDEX iv_line INTO rs_data.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD assert_lines.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mt_results )
+      exp = iv_lines
+      msg = iv_msg ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_status_helper DEFINITION DEFERRED.
+CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_status_helper.
+ 
+CLASS ltcl_status_helper DEFINITION FOR TESTING.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_tadir.
+ 
+    METHODS:
+      constructor,
+      add_tadir
+        IMPORTING
+          iv_obj_type TYPE tadir-object
+          iv_obj_name TYPE tadir-obj_name
+          iv_devclass TYPE tadir-devclass,
+      add_remote
+        IMPORTING
+          iv_path     TYPE string DEFAULT '/'
+          iv_filename TYPE string
+          iv_sha1     TYPE zif_abapgit_git_definitions=>ty_sha1,
+      add_local
+        IMPORTING
+          iv_path     TYPE string DEFAULT '/'
+          iv_filename TYPE string
+          iv_sha1     TYPE zif_abapgit_git_definitions=>ty_sha1
+          iv_obj_type TYPE tadir-object OPTIONAL
+          iv_obj_name TYPE tadir-obj_name OPTIONAL
+          iv_devclass TYPE devclass DEFAULT '$Z$'
+          iv_inactive TYPE abap_bool DEFAULT abap_false,
+      add_state
+        IMPORTING
+          iv_path     TYPE string DEFAULT '/'
+          iv_filename TYPE string
+          iv_sha1     TYPE zif_abapgit_git_definitions=>ty_sha1,
+      run
+        IMPORTING
+          iv_devclass      TYPE devclass DEFAULT '$Z$'
+        RETURNING
+          VALUE(ro_result) TYPE REF TO lcl_status_result
+        RAISING
+          zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES: BEGIN OF ty_tadir,
+             obj_type TYPE tadir-object,
+             obj_name TYPE tadir-obj_name,
+             devclass TYPE tadir-devclass,
+           END OF ty_tadir.
+ 
+    DATA:
+      mt_tadir  TYPE STANDARD TABLE OF ty_tadir WITH DEFAULT KEY,
+      mt_local  TYPE zif_abapgit_definitions=>ty_files_item_tt,
+      mt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt,
+      mt_state  TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_status_helper IMPLEMENTATION.
+ 
+  METHOD constructor.
+ 
+    zcl_abapgit_injector=>set_tadir( me ).
+ 
+  ENDMETHOD.
+ 
+  METHOD add_tadir.
+ 
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF mt_tadir.
+ 
+    APPEND INITIAL LINE TO mt_tadir ASSIGNING <ls_tadir>.
+    <ls_tadir>-obj_type = iv_obj_type.
+    <ls_tadir>-obj_name = iv_obj_name.
+    <ls_tadir>-devclass = iv_devclass.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_tadir~get_object_package.
+ 
+    DATA: ls_tadir LIKE LINE OF mt_tadir.
+ 
+    IF lines( mt_tadir ) > 0.
+      READ TABLE mt_tadir INTO ls_tadir WITH KEY
+        obj_type = iv_object
+        obj_name = iv_obj_name.
+      cl_abap_unit_assert=>assert_subrc( ).
+ 
+      rv_devclass = ls_tadir-devclass.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_tadir~read.
+    cl_abap_unit_assert=>fail( ).
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_tadir~read_single.
+    cl_abap_unit_assert=>fail( ).
+  ENDMETHOD.
+ 
+  METHOD add_remote.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
+ 
+    APPEND INITIAL LINE TO mt_remote ASSIGNING <ls_remote>.
+    <ls_remote>-path     = iv_path.
+    <ls_remote>-filename = iv_filename.
+    <ls_remote>-sha1     = iv_sha1.
+ 
+  ENDMETHOD.
+ 
+  METHOD add_local.
+ 
+    FIELD-SYMBOLS: <ls_local> LIKE LINE OF mt_local.
+ 
+    APPEND INITIAL LINE TO mt_local ASSIGNING <ls_local>.
+    <ls_local>-item-obj_type = iv_obj_type.
+    <ls_local>-item-obj_name = iv_obj_name.
+    <ls_local>-item-devclass = iv_devclass.
+    <ls_local>-item-inactive = iv_inactive.
+    <ls_local>-file-path     = iv_path.
+    <ls_local>-file-filename = iv_filename.
+    <ls_local>-file-sha1     = iv_sha1.
+ 
+  ENDMETHOD.
+ 
+  METHOD add_state.
+ 
+    FIELD-SYMBOLS: <ls_state> LIKE LINE OF mt_state.
+ 
+    APPEND INITIAL LINE TO mt_state ASSIGNING <ls_state>.
+    <ls_state>-path     = iv_path.
+    <ls_state>-filename = iv_filename.
+    <ls_state>-sha1     = iv_sha1.
+ 
+  ENDMETHOD.
+ 
+  METHOD run.
+ 
+    DATA: lt_results  TYPE zif_abapgit_definitions=>ty_results_tt,
+          lo_instance TYPE REF TO zcl_abapgit_file_status,
+          lo_dot      TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+    lo_dot = zcl_abapgit_dot_abapgit=>build_default( ).
+    lo_dot->set_starting_folder( '/' ). " assumed by unit tests
+ 
+    CREATE OBJECT lo_instance
+      EXPORTING
+        iv_root_package = iv_devclass
+        io_dot          = lo_dot.
+ 
+    lt_results = lo_instance->calculate_status(
+      it_local     = mt_local
+      it_remote    = mt_remote
+      it_cur_state = mt_state ).
+ 
+    CREATE OBJECT ro_result
+      EXPORTING
+        it_results = lt_results.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_calculate_status DEFINITION DEFERRED.
+CLASS zcl_abapgit_file_status DEFINITION LOCAL FRIENDS ltcl_calculate_status.
+ 
+CLASS ltcl_calculate_status DEFINITION FOR TESTING RISK LEVEL HARMLESS
+  DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_helper TYPE REF TO ltcl_status_helper,
+      mo_result TYPE REF TO lcl_status_result.
+ 
+    METHODS:
+      setup,
+      complete_local,
+      complete_remote,
+      complete_state,
+      only_remote FOR TESTING RAISING zcx_abapgit_exception,
+      deleted_remote FOR TESTING RAISING zcx_abapgit_exception,
+      only_local FOR TESTING RAISING zcx_abapgit_exception,
+      match_file FOR TESTING RAISING zcx_abapgit_exception,
+      diff FOR TESTING RAISING zcx_abapgit_exception,
+      moved FOR TESTING RAISING zcx_abapgit_exception,
+      inactive FOR TESTING RAISING zcx_abapgit_exception,
+      local_outside_main FOR TESTING RAISING zcx_abapgit_exception,
+      complete FOR TESTING RAISING zcx_abapgit_exception,
+      only_local2 FOR TESTING RAISING zcx_abapgit_exception,
+      only_remote2 FOR TESTING RAISING zcx_abapgit_exception,
+      only_remote3 FOR TESTING RAISING zcx_abapgit_exception.
+ENDCLASS.
+ 
+CLASS ltcl_calculate_status IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mo_helper.
+ 
+  ENDMETHOD.
+ 
+  METHOD only_remote.
+ 
+    mo_helper->add_remote(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = 'D1' ).
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-rstate
+      exp = zif_abapgit_definitions=>c_state-added ).
+ 
+  ENDMETHOD.
+ 
+  METHOD deleted_remote.
+
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_remotel.prog.xml'
+      iv_sha1     = '1011' ).
+
+* this remote has to be there, even tho its not related
+* SUBRC = 4 vs SUBRC = 8 during READ TABLE
+    mo_helper->add_remote(
+      iv_path     = '/'
+      iv_filename = 'zzz.xml'
+      iv_sha1     = '1017' ).
+
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_remotel.prog.xml'
+      iv_sha1     = '1011' ).
+
+    mo_result = mo_helper->run( ).
+
+    mo_result->assert_lines( 2 ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 2 )-rstate
+      exp = zif_abapgit_definitions=>c_state-deleted ).
+
+  ENDMETHOD.
+ 
+  METHOD only_local.
+ 
+    mo_helper->add_local(
+      iv_obj_type = 'DOMA'
+      iv_obj_name = '$$ZDOMA1'
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = 'D1' ).
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-lstate
+      exp = zif_abapgit_definitions=>c_state-added ).
+ 
+  ENDMETHOD.
+ 
+  METHOD match_file.
+ 
+    mo_helper->add_local(
+      iv_obj_type = 'DOMA'
+      iv_obj_name = '$$ZDOMA1'
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = 'D1' ).
+ 
+    mo_helper->add_remote(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = 'D1' ).
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-match
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+  METHOD diff.
+ 
+    " Modified both
+    CREATE OBJECT mo_helper.
+    mo_helper->add_local(
+      iv_obj_type = 'DOMA'
+      iv_obj_name = '$$ZDOMA1'
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '12345' ).
+ 
+    mo_helper->add_remote(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '54321' ).
+ 
+    mo_helper->add_state(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = 'xxx' ).
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-lstate
+      exp = zif_abapgit_definitions=>c_state-modified ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-rstate
+      exp = zif_abapgit_definitions=>c_state-modified ).
+ 
+    " Modified local only
+    CREATE OBJECT mo_helper.
+    mo_helper->add_local(
+      iv_obj_type = 'DOMA'
+      iv_obj_name = '$$ZDOMA1'
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '12345' ).
+ 
+    mo_helper->add_remote(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '54321' ).
+ 
+    mo_helper->add_state(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '54321' ).
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-lstate
+      exp = zif_abapgit_definitions=>c_state-modified ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-rstate
+      exp = zif_abapgit_definitions=>c_state-unchanged ).
+ 
+    " Modified remote only
+    CREATE OBJECT mo_helper.
+    mo_helper->add_local(
+      iv_obj_type = 'DOMA'
+      iv_obj_name = '$$ZDOMA1'
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '12345' ).
+ 
+    mo_helper->add_remote(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '54321' ).
+ 
+    mo_helper->add_state(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '12345' ).
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-lstate
+      exp = zif_abapgit_definitions=>c_state-unchanged ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-rstate
+      exp = zif_abapgit_definitions=>c_state-modified ).
+ 
+  ENDMETHOD.
+ 
+  METHOD moved.
+ 
+    mo_helper->add_local(
+     iv_obj_type = 'DOMA'
+     iv_obj_name = '$$ZDOMA1'
+     iv_filename = '$$zdoma1.doma.xml'
+     iv_path     = '/foo/'
+     iv_devclass = 'FOO'
+     iv_sha1     = 'D1' ).
+ 
+    mo_helper->add_remote(
+     iv_filename = '$$zdoma1.doma.xml'
+     iv_path     = '/bar/'
+     iv_sha1     = 'D1' ).
+ 
+    mo_helper->add_tadir(
+      iv_obj_type = 'DOMA'
+      iv_obj_name = '$$ZDOMA1'
+      iv_devclass = 'FOO' ).
+ 
+    mo_result = mo_helper->run( iv_devclass = 'FOO' ).
+ 
+    mo_result->assert_lines(
+      iv_lines = 2
+      iv_msg   = 'there must be a status calculated for both files, they are in different folders' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD inactive.
+ 
+    mo_helper->add_local(
+      iv_obj_type = 'DOMA'
+      iv_obj_name = '$$ZDOMA1'
+      iv_inactive = abap_true
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '12345' ).
+ 
+    mo_helper->add_remote(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '54321' ).
+ 
+    mo_helper->add_state(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = 'xxx' ).
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-inactive
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+  METHOD local_outside_main.
+ 
+    mo_helper->add_tadir(
+      iv_obj_type = 'DOMA'
+      iv_obj_name = '$$ZDOMA1'
+      iv_devclass = '$OUTSIDE$' ).
+ 
+    mo_helper->add_remote(
+      iv_filename = '$$zdoma1.doma.xml'
+      iv_sha1     = '54321' ).
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    " it should appear as not existing locally
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-rstate
+      exp = zif_abapgit_definitions=>c_state-added ).
+ 
+  ENDMETHOD.
+ 
+  METHOD complete_local.
+
+    mo_helper->add_local(
+      iv_path     = '/'
+      iv_filename = '.abapgit.xml'
+      iv_sha1     = '1017' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_created_locally.prog.abap'
+      iv_sha1     = '1001' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_created_locally.prog.xml'
+      iv_sha1     = '1022' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_remotely.prog.abap'
+      iv_sha1     = '1016' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_remotely.prog.xml'
+      iv_sha1     = '1003' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_both.prog.abap'
+      iv_sha1     = '1028' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_both.prog.xml'
+      iv_sha1     = '1032' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_locally.prog.abap'
+      iv_sha1     = '1023' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_locally.prog.xml'
+      iv_sha1     = '1033' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_remotely.prog.abap'
+      iv_sha1     = '1018' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_remotely.prog.xml'
+      iv_sha1     = '1011' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_mod_del.prog.abap'
+      iv_sha1     = '1012' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_mod_del.prog.xml'
+      iv_sha1     = '1006' ).
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '1027' ).
+    mo_helper->add_local(
+      iv_path     = '/src/sub/'
+      iv_filename = 'ztest_move_package.prog.xml'
+      iv_sha1     = '1040' ).
+    mo_helper->add_local(
+      iv_path     = '/src/sub/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '1041' ).
+    mo_helper->add_local(
+      iv_path     = '/src/sub/'
+      iv_filename = 'ztest_move_package_w_change.prog.xml'
+      iv_sha1     = '1042' ).
+
+  ENDMETHOD.
+ 
+  METHOD complete_remote.
+
+    mo_helper->add_remote(
+      iv_path     = '/'
+      iv_filename = '.abapgit.xml'
+      iv_sha1     = '1017' ).
+    mo_helper->add_remote(
+      iv_path     = '/'
+      iv_filename = 'README.md'
+      iv_sha1     = '1007' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '1027' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_created_remotely.prog.abap'
+      iv_sha1     = '1025' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_created_remotely.prog.xml'
+      iv_sha1     = '1015' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_del_mod.prog.abap'
+      iv_sha1     = '1024' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_del_mod.prog.xml'
+      iv_sha1     = '1013' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_locally.prog.abap'
+      iv_sha1     = '1008' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_locally.prog.xml'
+      iv_sha1     = '1009' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_both.prog.abap'
+      iv_sha1     = '1002' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_both.prog.xml'
+      iv_sha1     = '1030' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_locally.prog.abap'
+      iv_sha1     = '1026' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_locally.prog.xml'
+      iv_sha1     = '1021' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_remotely.prog.abap'
+      iv_sha1     = '1019' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_remotely.prog.xml'
+      iv_sha1     = '1031' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_move_package.prog.xml'
+      iv_sha1     = '1040' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/sub/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '1041' ).
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_move_package_w_change.prog.xml'
+      iv_sha1     = '2042' ).
+
+  ENDMETHOD.
+ 
+  METHOD complete_state.
+
+    mo_helper->add_state(
+      iv_path     = '/'
+      iv_filename = '.abapgit.xml'
+      iv_sha1     = '1017' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '1027' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_locally.prog.abap'
+      iv_sha1     = '1008' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_locally.prog.xml'
+      iv_sha1     = '1009' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_remotely.prog.abap'
+      iv_sha1     = '1016' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_remotely.prog.xml'
+      iv_sha1     = '1003' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_del_mod.prog.abap'
+      iv_sha1     = '1020' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_del_mod.prog.xml'
+      iv_sha1     = '1029' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_both.prog.abap'
+      iv_sha1     = '1010' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_both.prog.xml'
+      iv_sha1     = '1004' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_locally.prog.abap'
+      iv_sha1     = '1026' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_locally.prog.xml'
+      iv_sha1     = '1021' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_remotely.prog.abap'
+      iv_sha1     = '1018' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_modified_remotely.prog.xml'
+      iv_sha1     = '1011' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_mod_del.prog.abap'
+      iv_sha1     = '1014' ).
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_mod_del.prog.xml'
+      iv_sha1     = '1005' ).
+    mo_helper->add_state(
+      iv_path     = '/src/sub/'
+      iv_filename = 'ztest_move_package.prog.xml'
+      iv_sha1     = '1040' ).
+    mo_helper->add_state(
+      iv_path     = '/src/sub/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '1041' ).
+    mo_helper->add_state(
+      iv_path     = '/src/sub/'
+      iv_filename = 'ztest_move_package_w_change.prog.xml'
+      iv_sha1     = '1042' ).
+
+  ENDMETHOD.
+ 
+  METHOD complete.
+
+    DATA:
+      ls_line TYPE zif_abapgit_definitions=>ty_result,
+      lv_act  TYPE c LENGTH 4,
+      lv_exp  TYPE c LENGTH 4.
+
+    complete_local( ).
+    complete_remote( ).
+    complete_state( ).
+
+    mo_result = mo_helper->run( ).
+
+    mo_result->assert_lines( 26 ).
+
+    DO 26 TIMES.
+      ls_line = mo_result->get_line( sy-index ).
+      lv_act+0(1) = ls_line-match.
+      lv_act+1(1) = ls_line-lstate.
+      lv_act+2(1) = ls_line-rstate.
+      lv_act+3(1) = ls_line-packmove.
+      CASE sy-index.
+        WHEN 1.
+          lv_exp = 'X  '. " no changes
+        WHEN 2.
+          lv_exp = '  A'. " add remote
+        WHEN 3.
+          lv_exp = 'X  '. " no change
+        WHEN 4 OR 5.
+          lv_exp = ' A '. " add local
+        WHEN 6 OR 7.
+          lv_exp = '  A'. " add remote
+        WHEN 8 OR 9.
+          lv_exp = ' DM'. " delete local, modify remote
+        WHEN 10 OR 11.
+          lv_exp = ' D '. " delete local
+        WHEN 12 OR 13.
+          lv_exp = '  D'. " delete remote
+        WHEN 14 OR 15.
+          lv_exp = ' MD'. " modify local, delete remote
+        WHEN 16 OR 17.
+          lv_exp = ' MM'. " modify both sides
+        WHEN 18 OR 19.
+          lv_exp = ' M '. " modify local
+        WHEN 20 OR 21.
+          lv_exp = '  M'. " modify remote
+        WHEN 22.
+          lv_exp = ' D X'. " package move (no change)
+        WHEN 23.
+          lv_exp = ' D  '. " package move with change
+        WHEN 24.
+          lv_exp = 'X   '. " no chagen
+        WHEN 25.
+          lv_exp = ' A X'. " package move (no change)
+        WHEN 26.
+          lv_exp = ' A  '. " package move with change
+      ENDCASE.
+
+      cl_abap_unit_assert=>assert_equals(
+        act = lv_act
+        exp = lv_exp
+        msg = |Line { sy-index }: { ls_line-filename }| ).
+    ENDDO.
+
+  ENDMETHOD.
+ 
+  METHOD only_local2.
+ 
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_remotely.prog.abap'
+      iv_sha1     = '1016' ).
+ 
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'ztest_deleted_remotely.prog.abap'
+      iv_sha1     = '2016' ). " different checksum
+ 
+    mo_result = mo_helper->run( ).
+ 
+    mo_result->assert_lines( 1 ).
+ 
+    " it should appear as deleted remotely
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-lstate
+      exp = zif_abapgit_definitions=>c_state-added ).
+ 
+  ENDMETHOD.
+ 
+  METHOD only_remote2.
+ 
+    " Add local class implementation
+    mo_helper->add_local(
+      iv_path     = '/src/sub/'
+      iv_obj_name = 'ZCL_CLAS'
+      iv_obj_type = 'CLAS'
+      iv_filename = 'zcl_clas.clas.abap'
+      iv_sha1     = '112233' ).
+ 
+    mo_helper->add_remote(
+      iv_path     = '/src/sub/'
+      iv_filename = 'zcl_clas.clas.abap'
+      iv_sha1     = '332211' ).
+ 
+    mo_helper->add_remote(
+      iv_path     = '/src/sub/'
+      iv_filename = 'zcl_clas.clas.locals_imp.abap'
+      iv_sha1     = '1111' ).
+ 
+    mo_helper->add_state(
+      iv_path     = '/src/sub/'
+      iv_filename = 'zcl_clas.clas.locals_imp.abap'
+      iv_sha1     = '1111' ).
+ 
+    mo_result = mo_helper->run( iv_devclass = '$DIFFERENT' ).
+ 
+    mo_result->assert_lines( 2 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 2 )-match
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+  METHOD only_remote3.
+ 
+    " Add subpackage remotely
+    mo_helper->add_local(
+      iv_path     = '/src/'
+      iv_obj_name = '$DIFFERENT'
+      iv_obj_type = 'DEVC'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '112233' ).
+ 
+    mo_helper->add_remote(
+      iv_path     = '/src/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '112233' ).
+ 
+    mo_helper->add_remote(
+      iv_path     = '/src/sub/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '332211' ).
+ 
+    mo_helper->add_state(
+      iv_path     = '/src/'
+      iv_filename = 'package.devc.xml'
+      iv_sha1     = '112233' ).
+ 
+    mo_result = mo_helper->run( iv_devclass = '$DIFFERENT' ).
+ 
+    mo_result->assert_lines( 2 ).
+ 
+    " main package matches
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 1 )-match
+      exp = abap_true ).
+ 
+    " subpackage should appear as added remotely
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 2 )-lstate
+      exp = zif_abapgit_definitions=>c_state-unchanged ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_result->get_line( 2 )-rstate
+      exp = zif_abapgit_definitions=>c_state-added ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo.clas.abap.html b/src/repo/zcl_abapgit_repo.clas.abap.html new file mode 100644 index 00000000000..2040269ac97 --- /dev/null +++ b/src/repo/zcl_abapgit_repo.clas.abap.html @@ -0,0 +1,2905 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo.clas.abap

+
+ +
+ 63.51% + Statements + 597/940 +
+ + +
+ 25% + Branches + 5/20 +
+ + +
+ 16% + Functions + 4/25 +
+ + +
+ 63.51% + Lines + 597/940 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +9411x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +  +  +  +1x +1x +  +  +  +1x +1x +  +  +  +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +  +  +  +  +  +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +2x +2x +2x +2x +2x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_repo DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_repo .
+ 
+    ALIASES ms_data
+      FOR zif_abapgit_repo~ms_data .
+    ALIASES deserialize
+      FOR zif_abapgit_repo~deserialize .
+    ALIASES deserialize_checks
+      FOR zif_abapgit_repo~deserialize_checks .
+    ALIASES get_dot_abapgit
+      FOR zif_abapgit_repo~get_dot_abapgit .
+    ALIASES get_files_local
+      FOR zif_abapgit_repo~get_files_local .
+    ALIASES get_files_remote
+      FOR zif_abapgit_repo~get_files_remote .
+    ALIASES get_key
+      FOR zif_abapgit_repo~get_key .
+    ALIASES get_local_settings
+      FOR zif_abapgit_repo~get_local_settings .
+    ALIASES get_name
+      FOR zif_abapgit_repo~get_name .
+    ALIASES get_package
+      FOR zif_abapgit_repo~get_package .
+    ALIASES is_offline
+      FOR zif_abapgit_repo~is_offline .
+    ALIASES refresh
+      FOR zif_abapgit_repo~refresh .
+    ALIASES set_dot_abapgit
+      FOR zif_abapgit_repo~set_dot_abapgit .
+ 
+    METHODS bind_listener
+      IMPORTING
+        !ii_listener TYPE REF TO zif_abapgit_repo_listener .
+    METHODS check_and_create_package
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !is_data TYPE zif_abapgit_persistence=>ty_repo .
+    METHODS create_new_log
+      IMPORTING
+        !iv_title     TYPE string OPTIONAL
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log .
+    METHODS delete_checks
+      RETURNING
+        VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_delete_checks
+      RAISING
+        zcx_abapgit_exception .
+    METHODS find_remote_dot_abapgit
+      RETURNING
+        VALUE(ro_dot) TYPE REF TO zcl_abapgit_dot_abapgit
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_data_config
+      RETURNING
+        VALUE(ri_config) TYPE REF TO zif_abapgit_data_config
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_dot_apack
+      RETURNING
+        VALUE(ro_dot_apack) TYPE REF TO zcl_abapgit_apack_reader .
+    METHODS get_log
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log .
+    METHODS get_unsupported_objects_local
+      RETURNING
+        VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS has_remote_source
+      ABSTRACT
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS refresh_local_object
+      IMPORTING
+        !iv_obj_type TYPE tadir-object
+        !iv_obj_name TYPE tadir-obj_name
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_local_objects
+      RAISING
+        zcx_abapgit_exception .
+    METHODS remove_ignored_files
+      CHANGING
+        !ct_files TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS reset_status .
+    METHODS set_files_remote
+      IMPORTING
+        !it_files TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    METHODS set_local_settings
+      IMPORTING
+        !is_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings
+      RAISING
+        zcx_abapgit_exception .
+    METHODS status
+      IMPORTING
+        !ii_log           TYPE REF TO zif_abapgit_log OPTIONAL
+      RETURNING
+        VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS switch_repo_type
+      IMPORTING
+        !iv_offline TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    DATA mt_local TYPE zif_abapgit_definitions=>ty_files_item_tt .
+    DATA mt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt .
+    DATA mv_request_local_refresh TYPE abap_bool .
+    DATA mv_request_remote_refresh TYPE abap_bool .
+    DATA mt_status TYPE zif_abapgit_definitions=>ty_results_tt .
+    DATA mi_log TYPE REF TO zif_abapgit_log .
+    DATA mi_listener TYPE REF TO zif_abapgit_repo_listener .
+    DATA mo_apack_reader TYPE REF TO zcl_abapgit_apack_reader .
+    DATA mi_data_config TYPE REF TO zif_abapgit_data_config .
+ 
+    METHODS find_remote_dot_apack
+      RETURNING
+        VALUE(ro_dot) TYPE REF TO zcl_abapgit_apack_reader
+      RAISING
+        zcx_abapgit_exception .
+    METHODS reset_remote .
+    METHODS set
+      IMPORTING
+        !iv_url             TYPE zif_abapgit_persistence=>ty_repo-url OPTIONAL
+        !iv_branch_name     TYPE zif_abapgit_persistence=>ty_repo-branch_name OPTIONAL
+        !iv_selected_commit TYPE zif_abapgit_persistence=>ty_repo-selected_commit OPTIONAL
+        !iv_head_branch     TYPE zif_abapgit_persistence=>ty_repo-head_branch OPTIONAL
+        !iv_offline         TYPE zif_abapgit_persistence=>ty_repo-offline OPTIONAL
+        !is_dot_abapgit     TYPE zif_abapgit_persistence=>ty_repo-dot_abapgit OPTIONAL
+        !is_local_settings  TYPE zif_abapgit_persistence=>ty_repo-local_settings OPTIONAL
+        !iv_deserialized_at TYPE zif_abapgit_persistence=>ty_repo-deserialized_at OPTIONAL
+        !iv_deserialized_by TYPE zif_abapgit_persistence=>ty_repo-deserialized_by OPTIONAL
+        !iv_switched_origin TYPE zif_abapgit_persistence=>ty_repo-switched_origin OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_dot_apack
+      IMPORTING
+        !io_dot_apack TYPE REF TO zcl_abapgit_apack_reader
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    METHODS check_for_restart .
+    METHODS check_language
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_write_protect
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_data
+      IMPORTING
+        !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      CHANGING
+        !ct_files  TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_dot_abapgit
+      CHANGING
+        !ct_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS deserialize_objects
+      IMPORTING
+        !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+        !ii_log    TYPE REF TO zif_abapgit_log
+      CHANGING
+        !ct_files  TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS normalize_local_settings
+      CHANGING
+        !cs_local_settings TYPE zif_abapgit_persistence=>ty_local_settings .
+    METHODS notify_listener
+      IMPORTING
+        !is_change_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask
+      RAISING
+        zcx_abapgit_exception .
+    METHODS update_last_deserialize
+      RAISING
+        zcx_abapgit_exception .
+    METHODS check_abap_language_version
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REPO IMPLEMENTATION.
+ 
+ 
+  METHOD bind_listener.
+    mi_listener = ii_listener.
+  ENDMETHOD.
+ 
+ 
+  METHOD check_and_create_package.
+
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lv_package TYPE devclass.
+
+    ls_item-obj_type = 'DEVC'.
+    ls_item-obj_name = iv_package.
+
+    IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+      " Check if any package is included in remote
+      READ TABLE mt_remote TRANSPORTING NO FIELDS
+        WITH KEY file
+        COMPONENTS filename = zcl_abapgit_filename_logic=>c_package_file.
+      IF sy-subrc <> 0.
+        " If not, prompt to create it
+        lv_package = zcl_abapgit_services_basis=>create_package( iv_package ).
+        IF lv_package IS NOT INITIAL.
+          COMMIT WORK AND WAIT.
+        ENDIF.
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD check_for_restart.
+
+    CONSTANTS:
+      lc_abapgit_prog TYPE progname VALUE `ZABAPGIT`.
+
+    " If abapGit was used to update itself, then restart to avoid LOAD_PROGRAM_&_MISMATCH dumps
+    " because abapGit code was changed at runtime
+    IF zcl_abapgit_ui_factory=>get_frontend_services( )->gui_is_available( ) = abap_true AND
+       zcl_abapgit_url=>is_abapgit_repo( ms_data-url ) = abap_true AND
+       sy-batch = abap_false AND
+       sy-cprog = lc_abapgit_prog.
+
+      IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_show_default_repo( ) = abap_false.
+        MESSAGE 'abapGit was updated and will restart itself' TYPE 'I'.
+      ENDIF.
+
+      SUBMIT (sy-cprog).
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD check_language.
+
+    DATA:
+      lv_main_language  TYPE spras,
+      lv_error_message  TYPE string,
+      lv_error_longtext TYPE string.
+
+    " for deserialize, assumes find_remote_dot_abapgit has been called before (or language won't be defined)
+    lv_main_language = get_dot_abapgit( )->get_main_language( ).
+
+    IF lv_main_language <> sy-langu.
+
+      lv_error_message = |Current login language |
+                      && |'{ zcl_abapgit_convert=>conversion_exit_isola_output( sy-langu ) }'|
+                      && | does not match main language |
+                      && |'{ zcl_abapgit_convert=>conversion_exit_isola_output( lv_main_language ) }'.|.
+
+      " Feature open in main language only exists if abapGit tcode is present
+      IF zcl_abapgit_services_abapgit=>get_abapgit_tcode( ) IS INITIAL.
+        lv_error_message = lv_error_message && | Please logon in main language and retry.|.
+        lv_error_longtext = |For the Advanced menu option 'Open in Main Language' to be available a transaction code| &&
+                            | must be assigned to report { sy-cprog }.|.
+      ELSE.
+        lv_error_message = lv_error_message && | Select 'Advanced' > 'Open in Main Language'|.
+      ENDIF.
+
+      zcx_abapgit_exception=>raise( iv_text     = lv_error_message
+                                    iv_longtext = lv_error_longtext ).
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD check_write_protect.
+
+    IF get_local_settings( )-write_protected = abap_true.
+      zcx_abapgit_exception=>raise( 'Cannot deserialize. Local code is write-protected by repo config' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    ASSERT NOT is_data-key IS INITIAL.
+ 
+    ms_data = is_data.
+    mv_request_remote_refresh = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_new_log.
+ 
+    CREATE OBJECT mi_log TYPE zcl_abapgit_log.
+    mi_log->set_title( iv_title ).
+ 
+    ri_log = mi_log.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_checks.
+ 
+    DATA: li_package TYPE REF TO zif_abapgit_sap_package.
+ 
+    check_write_protect( ).
+    check_language( ).
+ 
+    li_package = zcl_abapgit_factory=>get_sap_package( get_package( ) ).
+    rs_checks-transport-required = li_package->are_changes_recorded_in_tr_req( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_data.
+
+    DATA:
+      lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
+      lt_result        TYPE zif_abapgit_data_deserializer=>ty_results.
+
+    "Deserialize data
+    lt_result = zcl_abapgit_data_factory=>get_deserializer( )->deserialize(
+      ii_config  = get_data_config( )
+      it_files   = get_files_remote( ) ).
+
+    "Save deserialized data to DB and add entries to transport requests
+    lt_updated_files = zcl_abapgit_data_factory=>get_deserializer( )->actualize(
+      it_result = lt_result
+      is_checks = is_checks ).
+
+    INSERT LINES OF lt_updated_files INTO TABLE ct_files.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_dot_abapgit.
+    INSERT get_dot_abapgit( )->get_signature( ) INTO TABLE ct_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD deserialize_objects.
+
+    DATA:
+      lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt,
+      lx_error         TYPE REF TO zcx_abapgit_exception.
+
+    TRY.
+        lt_updated_files = zcl_abapgit_objects=>deserialize(
+          io_repo   = me
+          is_checks = is_checks
+          ii_log    = ii_log ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        " Ensure to reset default transport request task
+        zcl_abapgit_default_transport=>get_instance( )->reset( ).
+        refresh( iv_drop_log = abap_false ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+
+    INSERT LINES OF lt_updated_files INTO TABLE ct_files.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD find_remote_dot_abapgit.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
+ 
+    get_files_remote( ).
+ 
+    READ TABLE mt_remote ASSIGNING <ls_remote>
+      WITH KEY file_path
+      COMPONENTS path     = zif_abapgit_definitions=>c_root_dir
+                 filename = zif_abapgit_definitions=>c_dot_abapgit.
+    IF sy-subrc = 0.
+      ro_dot = zcl_abapgit_dot_abapgit=>deserialize( <ls_remote>-data ).
+      set_dot_abapgit( ro_dot ).
+      COMMIT WORK AND WAIT. " to release lock
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_remote_dot_apack.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
+ 
+    get_files_remote( ).
+ 
+    READ TABLE mt_remote ASSIGNING <ls_remote>
+      WITH KEY file_path
+      COMPONENTS path     = zif_abapgit_definitions=>c_root_dir
+                 filename = zif_abapgit_apack_definitions=>c_dot_apack_manifest.
+    IF sy-subrc = 0.
+      ro_dot = zcl_abapgit_apack_reader=>deserialize( iv_package_name = ms_data-package
+                                                      iv_xstr         = <ls_remote>-data ).
+      set_dot_apack( ro_dot ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_data_config.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF mt_remote.
+ 
+    IF mi_data_config IS BOUND.
+      ri_config = mi_data_config.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT ri_config TYPE zcl_abapgit_data_config.
+    mi_data_config = ri_config.
+ 
+    " Assume remote data has been loaded already
+    READ TABLE mt_remote ASSIGNING <ls_remote>
+      WITH KEY file_path
+      COMPONENTS path = zif_abapgit_data_config=>c_default_path.
+    IF sy-subrc = 0.
+      ri_config->from_json( mt_remote ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_dot_apack.
+    IF mo_apack_reader IS NOT BOUND.
+      mo_apack_reader = zcl_abapgit_apack_reader=>create_instance( ms_data-package ).
+    ENDIF.
+ 
+    ro_dot_apack = mo_apack_reader.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_log.
+    ri_log = mi_log.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_unsupported_objects_local.
+ 
+    DATA: lt_tadir           TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          lt_supported_types TYPE zcl_abapgit_objects=>ty_types_tt.
+ 
+    FIELD-SYMBOLS: <ls_tadir>  LIKE LINE OF lt_tadir,
+                   <ls_object> LIKE LINE OF rt_objects.
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+                      iv_package            = ms_data-package
+                      iv_ignore_subpackages = ms_data-local_settings-ignore_subpackages
+                      iv_only_local_objects = ms_data-local_settings-only_local_objects
+                      io_dot                = get_dot_abapgit( ) ).
+ 
+    lt_supported_types = zcl_abapgit_objects=>supported_list( ).
+    LOOP AT lt_tadir ASSIGNING <ls_tadir>.
+      READ TABLE lt_supported_types WITH KEY table_line = <ls_tadir>-object TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        APPEND INITIAL LINE TO rt_objects ASSIGNING <ls_object>.
+        MOVE-CORRESPONDING <ls_tadir> TO <ls_object>.
+        <ls_object>-obj_type = <ls_tadir>-object.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_local_settings.
+
+    cs_local_settings-labels = zcl_abapgit_repo_labels=>normalize( cs_local_settings-labels ).
+
+    " TODO: more validation and normalization ?
+
+  ENDMETHOD.
+ 
+ 
+  METHOD notify_listener.
+ 
+    DATA ls_meta_slug TYPE zif_abapgit_persistence=>ty_repo_xml.
+ 
+    IF mi_listener IS BOUND.
+      MOVE-CORRESPONDING ms_data TO ls_meta_slug.
+      mi_listener->on_meta_change(
+        iv_key         = ms_data-key
+        is_meta        = ls_meta_slug
+        is_change_mask = is_change_mask ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local_object.
+
+    DATA:
+      ls_tadir           TYPE zif_abapgit_definitions=>ty_tadir,
+      lt_tadir           TYPE zif_abapgit_definitions=>ty_tadir_tt,
+      lt_new_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt,
+      lo_serialize       TYPE REF TO zcl_abapgit_serialize.
+
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+                   iv_package = ms_data-package
+                   io_dot     = get_dot_abapgit( ) ).
+
+    DELETE mt_local WHERE item-obj_type = iv_obj_type
+                    AND   item-obj_name = iv_obj_name.
+
+    READ TABLE lt_tadir INTO ls_tadir
+                        WITH KEY object   = iv_obj_type
+                                 obj_name = iv_obj_name.
+    IF sy-subrc <> 0 OR ls_tadir-delflag = abap_true.
+      " object doesn't exist anymore, nothing todo here
+      RETURN.
+    ENDIF.
+
+    CLEAR lt_tadir.
+    INSERT ls_tadir INTO TABLE lt_tadir.
+
+    CREATE OBJECT lo_serialize.
+    lt_new_local_files = lo_serialize->serialize(
+      iv_package = ms_data-package
+      it_tadir   = lt_tadir ).
+
+    INSERT LINES OF lt_new_local_files INTO TABLE mt_local.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local_objects.
+
+    mv_request_local_refresh = abap_true.
+    get_files_local( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_ignored_files.
+
+    DATA lo_dot TYPE REF TO zcl_abapgit_dot_abapgit.
+    DATA lv_index TYPE sy-index.
+
+    FIELD-SYMBOLS <ls_files> LIKE LINE OF ct_files.
+
+    lo_dot = get_dot_abapgit( ).
+
+    " Skip ignored files
+    LOOP AT ct_files ASSIGNING <ls_files>.
+      lv_index = sy-tabix.
+      IF lo_dot->is_ignored( iv_path     = <ls_files>-path
+                             iv_filename = <ls_files>-filename ) = abap_true.
+        DELETE ct_files INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD reset_remote.
+    CLEAR mt_remote.
+    mv_request_remote_refresh = abap_true.
+    reset_status( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD reset_status.
+    CLEAR mt_status.
+  ENDMETHOD.
+ 
+ 
+  METHOD set.
+ 
+* TODO: refactor, maybe use zcl_abapgit_string_map ?
+ 
+    DATA: ls_mask TYPE zif_abapgit_persistence=>ty_repo_meta_mask.
+ 
+ 
+    ASSERT iv_url IS SUPPLIED
+      OR iv_branch_name IS SUPPLIED
+      OR iv_selected_commit IS SUPPLIED
+      OR iv_head_branch IS SUPPLIED
+      OR iv_offline IS SUPPLIED
+      OR is_dot_abapgit IS SUPPLIED
+      OR is_local_settings IS SUPPLIED
+      OR iv_deserialized_by IS SUPPLIED
+      OR iv_deserialized_at IS SUPPLIED
+      OR iv_switched_origin IS SUPPLIED.
+ 
+ 
+    IF iv_url IS SUPPLIED.
+      ms_data-url = iv_url.
+      ls_mask-url = abap_true.
+    ENDIF.
+ 
+    IF iv_branch_name IS SUPPLIED.
+      ms_data-branch_name = iv_branch_name.
+      ls_mask-branch_name = abap_true.
+    ENDIF.
+ 
+    IF iv_selected_commit IS SUPPLIED.
+      ms_data-selected_commit = iv_selected_commit.
+      ls_mask-selected_commit = abap_true.
+    ENDIF.
+ 
+    IF iv_head_branch IS SUPPLIED.
+      ms_data-head_branch = iv_head_branch.
+      ls_mask-head_branch = abap_true.
+    ENDIF.
+ 
+    IF iv_offline IS SUPPLIED.
+      ms_data-offline = iv_offline.
+      ls_mask-offline = abap_true.
+    ENDIF.
+ 
+    IF is_dot_abapgit IS SUPPLIED.
+      ms_data-dot_abapgit = is_dot_abapgit.
+      ls_mask-dot_abapgit = abap_true.
+    ENDIF.
+ 
+    IF is_local_settings IS SUPPLIED.
+      ms_data-local_settings = is_local_settings.
+      ls_mask-local_settings = abap_true.
+      normalize_local_settings( CHANGING cs_local_settings = ms_data-local_settings ).
+    ENDIF.
+ 
+    IF iv_deserialized_at IS SUPPLIED OR iv_deserialized_by IS SUPPLIED.
+      ms_data-deserialized_at = iv_deserialized_at.
+      ms_data-deserialized_by = iv_deserialized_by.
+      ls_mask-deserialized_at = abap_true.
+      ls_mask-deserialized_by = abap_true.
+    ENDIF.
+ 
+    IF iv_switched_origin IS SUPPLIED.
+      ms_data-switched_origin = iv_switched_origin.
+      ls_mask-switched_origin = abap_true.
+    ENDIF.
+ 
+    notify_listener( ls_mask ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_dot_apack.
+    get_dot_apack( ).
+    mo_apack_reader->set_manifest_descriptor( io_dot_apack->get_manifest_descriptor( ) ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_files_remote.
+ 
+    mt_remote = it_files.
+    mv_request_remote_refresh = abap_false.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_local_settings.
+
+    set( is_local_settings = is_settings ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD status.
+ 
+    IF lines( mt_status ) = 0.
+      mt_status = zcl_abapgit_file_status=>status( io_repo = me
+                                                   ii_log  = ii_log ).
+ 
+    ENDIF.
+ 
+    rt_results = mt_status.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_repo_type.
+
+    IF iv_offline = ms_data-offline.
+      zcx_abapgit_exception=>raise( |Cannot switch_repo_type, offline already = "{ ms_data-offline }"| ).
+    ENDIF.
+
+    IF iv_offline = abap_true. " On-line -> OFFline
+      set( iv_url             = zcl_abapgit_url=>name( ms_data-url )
+           iv_branch_name     = ''
+           iv_selected_commit = ''
+           iv_head_branch     = ''
+           iv_offline         = abap_true ).
+    ELSE. " OFFline -> On-line
+      set( iv_offline = abap_false ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD update_last_deserialize.
+
+    DATA: lv_deserialized_at TYPE zif_abapgit_persistence=>ty_repo-deserialized_at,
+          lv_deserialized_by TYPE zif_abapgit_persistence=>ty_repo-deserialized_by.
+
+    GET TIME STAMP FIELD lv_deserialized_at.
+    lv_deserialized_by = sy-uname.
+
+    set( iv_deserialized_at = lv_deserialized_at
+         iv_deserialized_by = lv_deserialized_by ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~checksums.
+ 
+    CREATE OBJECT ri_checksums TYPE zcl_abapgit_repo_checksums
+      EXPORTING
+        iv_repo_key = ms_data-key.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~deserialize.
+
+    DATA lt_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt.
+
+    find_remote_dot_abapgit( ).
+    find_remote_dot_apack( ).
+
+    check_write_protect( ).
+    check_language( ).
+
+    IF is_checks-requirements-met = zif_abapgit_definitions=>c_no AND is_checks-requirements-decision IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Requirements not met and undecided' ).
+    ENDIF.
+
+    IF is_checks-dependencies-met = zif_abapgit_definitions=>c_no.
+      zcx_abapgit_exception=>raise( 'APACK dependencies not met' ).
+    ENDIF.
+
+    IF is_checks-transport-required = abap_true AND is_checks-transport-transport IS INITIAL.
+      zcx_abapgit_exception=>raise( |No transport request was supplied| ).
+    ENDIF.
+
+    deserialize_dot_abapgit( CHANGING ct_files = lt_updated_files ).
+
+    deserialize_objects(
+      EXPORTING
+        is_checks = is_checks
+        ii_log    = ii_log
+      CHANGING
+        ct_files  = lt_updated_files ).
+
+    deserialize_data(
+      EXPORTING
+        is_checks = is_checks
+      CHANGING
+        ct_files  = lt_updated_files ).
+
+    CLEAR mt_local. " Should be before CS update which uses NEW local
+
+    zif_abapgit_repo~checksums( )->update( lt_updated_files ).
+
+    update_last_deserialize( ).
+    reset_status( ).
+
+    COMMIT WORK AND WAIT.
+
+    check_for_restart( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~deserialize_checks.
+ 
+    DATA: lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+          lt_dependencies TYPE zif_abapgit_apack_definitions=>ty_dependencies.
+ 
+    find_remote_dot_abapgit( ).
+    find_remote_dot_apack( ).
+ 
+    check_write_protect( ).
+    check_language( ).
+    check_abap_language_version( ).
+ 
+    rs_checks = zcl_abapgit_objects=>deserialize_checks( me ).
+ 
+    lt_requirements = get_dot_abapgit( )->get_data( )-requirements.
+    rs_checks-requirements-met = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements ).
+ 
+    lt_dependencies = get_dot_apack( )->get_manifest_descriptor( )-dependencies.
+    rs_checks-dependencies-met = zcl_abapgit_apack_helper=>are_dependencies_met( lt_dependencies ).
+ 
+    rs_checks-customizing = zcl_abapgit_data_factory=>get_deserializer( )->deserialize_check(
+      io_repo   = me
+      ii_config = get_data_config( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_dot_abapgit.
+    CREATE OBJECT ro_dot_abapgit
+      EXPORTING
+        is_data = ms_data-dot_abapgit.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_files_local.
+ 
+    DATA lo_serialize TYPE REF TO zcl_abapgit_serialize.
+    DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    " Serialization happened before and no refresh request
+    IF lines( mt_local ) > 0 AND mv_request_local_refresh = abap_false.
+      rt_files = mt_local.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT lo_serialize
+      EXPORTING
+        io_dot_abapgit    = get_dot_abapgit( )
+        is_local_settings = get_local_settings( ).
+ 
+    IF ii_obj_filter IS NOT INITIAL.
+      lt_filter = ii_obj_filter->get_filter( ).
+    ENDIF.
+ 
+    rt_files = lo_serialize->files_local(
+      iv_package     = get_package( )
+      ii_data_config = get_data_config( )
+      ii_log         = ii_log
+      it_filter      = lt_filter ).
+ 
+    mt_local                 = rt_files.
+    mv_request_local_refresh = abap_false. " Fulfill refresh
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_files_remote.
+    DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    DATA lr_filter TYPE REF TO zcl_abapgit_repo_filter.
+ 
+    rt_files = mt_remote.
+    IF ii_obj_filter IS NOT INITIAL.
+      lt_filter = ii_obj_filter->get_filter( ).
+
+      CREATE OBJECT lr_filter.
+      lr_filter->apply_object_filter(
+        EXPORTING
+          it_filter   = lt_filter
+          io_dot      = get_dot_abapgit( )
+          iv_devclass = get_package( )
+        CHANGING
+          ct_files    = rt_files ).
+
+    ENDIF.
+ 
+    IF iv_ignore_files = abap_true.
+      remove_ignored_files( CHANGING ct_files = rt_files ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_key.
+    rv_key = ms_data-key.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_local_settings.
+ 
+    rs_settings = ms_data-local_settings.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_name.
+ 
+    rv_name = ms_data-local_settings-display_name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_package.
+    rv_package = ms_data-package.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~is_offline.
+    rv_offline = ms_data-offline.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~refresh.
+
+    mv_request_local_refresh = abap_true.
+    reset_remote( ).
+
+    IF iv_drop_log = abap_true.
+      CLEAR mi_log.
+    ENDIF.
+
+    IF iv_drop_cache = abap_true.
+      CLEAR mt_local.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~set_dot_abapgit.
+    set( is_dot_abapgit = io_dot_abapgit->get_data( ) ).
+  ENDMETHOD.
+ 
+ 
+  METHOD check_abap_language_version.
+
+    DATA lo_abapgit_abap_language_vers TYPE REF TO zcl_abapgit_abap_language_vers.
+    DATA lv_text TYPE string.
+    CREATE OBJECT lo_abapgit_abap_language_vers.
+
+    IF lo_abapgit_abap_language_vers->is_import_allowed( io_repo = me
+                                                         iv_package = ms_data-package ) = abap_false.
+      lv_text = |Repository cannot be imported. | &&
+                |ABAP Language Version of linked package is not compatible with repository settings.|.
+      zcx_abapgit_exception=>raise( iv_text = lv_text ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo.clas.testclasses.abap.html b/src/repo/zcl_abapgit_repo.clas.testclasses.abap.html new file mode 100644 index 00000000000..6d76b4bf4d6 --- /dev/null +++ b/src/repo/zcl_abapgit_repo.clas.testclasses.abap.html @@ -0,0 +1,544 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo.clas.testclasses.abap

+
+ +
+ 100% + Statements + 153/153 +
+ + +
+ 100% + Branches + 10/10 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 100% + Lines + 153/153 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +1541x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
*"* use this source file for your ABAP unit test classes
+CLASS ltcl_find_remote_dot_abapgit DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    CONSTANTS: c_dummy_repo_key TYPE zif_abapgit_persistence=>ty_value VALUE '000000001'.
+    METHODS:
+      positive FOR TESTING RAISING cx_static_check,
+      new_repo_needs_no_dot_abapgit FOR TESTING RAISING cx_static_check,
+ 
+      given_any_repo,
+      when_find_remote_dot_abapgit,
+      then_dot_abapgit_is_bound,
+      then_no_exception_is_raised,
+      given_dot_abapgit_file
+        RAISING zcx_abapgit_exception,
+      given_no_dot_abapgit_file,
+      then_dot_abapgit_is_not_bound,
+      given_repo_has_files
+        IMPORTING
+          iv_number_of_files TYPE i.
+ 
+    DATA:
+      mo_repo        TYPE REF TO zcl_abapgit_repo,
+      mx_error       TYPE REF TO zcx_abapgit_exception,
+      mo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_find_remote_dot_abapgit IMPLEMENTATION.
+ 
+  METHOD positive.
+ 
+    given_any_repo( ).
+    given_dot_abapgit_file( ).
+ 
+    when_find_remote_dot_abapgit( ).
+ 
+    then_dot_abapgit_is_bound( ).
+    then_no_exception_is_raised( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new_repo_needs_no_dot_abapgit.
+ 
+    given_any_repo( ).
+    given_repo_has_files( 3 ). " a few random files
+    given_no_dot_abapgit_file( ).
+ 
+    when_find_remote_dot_abapgit( ).
+ 
+    then_dot_abapgit_is_not_bound( ).
+    then_no_exception_is_raised( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_any_repo.
+ 
+    DATA: ls_data TYPE zif_abapgit_persistence=>ty_repo.
+ 
+    ls_data-key = c_dummy_repo_key.
+ 
+    " online/offline doesn't matter...
+    CREATE OBJECT mo_repo TYPE zcl_abapgit_repo_offline
+      EXPORTING
+        is_data = ls_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_dot_abapgit_file.
+ 
+    DATA:
+      lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt,
+      ls_file  LIKE LINE OF lt_files.
+ 
+    ls_file-path = zif_abapgit_definitions=>c_root_dir.
+    ls_file-filename = zif_abapgit_definitions=>c_dot_abapgit.
+    ls_file-data = zcl_abapgit_convert=>string_to_xstring(
+                         |<?xml version="1.0" encoding="utf-8"?>|
+                      && |<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">|
+                      && | <asx:values>|
+                      && |  <DATA>|
+                      && |   <MASTER_LANGUAGE>E</MASTER_LANGUAGE>|
+                      && |   <STARTING_FOLDER>/src/</STARTING_FOLDER>|
+                      && |   <FOLDER_LOGIC>PREFIX</FOLDER_LOGIC>|
+                      && |   <IGNORE>|
+                      && |    <item>/.gitignore</item>|
+                      && |    <item>/LICENSE</item>|
+                      && |    <item>/README.md</item>|
+                      && |    <item>/package.json</item>|
+                      && |    <item>/.travis.yml</item>|
+                      && |   </IGNORE>|
+                      && |  </DATA>|
+                      && | </asx:values>|
+                      && |</asx:abap>| ).
+    INSERT ls_file INTO TABLE lt_files.
+ 
+    mo_repo->set_files_remote( lt_files ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_no_dot_abapgit_file.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD when_find_remote_dot_abapgit.
+ 
+    TRY.
+        mo_dot_abapgit = mo_repo->find_remote_dot_abapgit( ).
+      CATCH zcx_abapgit_exception INTO mx_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD then_dot_abapgit_is_bound.
+    cl_abap_unit_assert=>assert_bound( mo_dot_abapgit ).
+  ENDMETHOD.
+ 
+ 
+  METHOD then_no_exception_is_raised.
+    cl_abap_unit_assert=>assert_not_bound( mx_error ).
+  ENDMETHOD.
+ 
+ 
+  METHOD then_dot_abapgit_is_not_bound.
+    cl_abap_unit_assert=>assert_not_bound( mo_dot_abapgit ).
+  ENDMETHOD.
+ 
+ 
+  METHOD given_repo_has_files.
+ 
+    DATA: lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          ls_file  LIKE LINE OF lt_files.
+ 
+    ls_file-path = zif_abapgit_definitions=>c_root_dir.
+ 
+    DO iv_number_of_files TIMES.
+      ls_file-filename = |File_{ sy-index }|.
+      INSERT ls_file INTO TABLE lt_files.
+    ENDDO.
+ 
+    mo_repo->set_files_remote( lt_files ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_checksums.clas.abap.html b/src/repo/zcl_abapgit_repo_checksums.clas.abap.html new file mode 100644 index 00000000000..6d6a583572d --- /dev/null +++ b/src/repo/zcl_abapgit_repo_checksums.clas.abap.html @@ -0,0 +1,754 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_checksums.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_checksums.clas.abap

+
+ +
+ 96.41% + Statements + 215/223 +
+ + +
+ 88.88% + Branches + 8/9 +
+ + +
+ 85.71% + Functions + 6/7 +
+ + +
+ 96.41% + Lines + 215/223 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +2241x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +  +  +2x +2x +2x +2x +2x +2x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_repo_checksums DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_repo_checksums.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS force_write
+      IMPORTING
+        it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_local_files_by_item_tt TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_file_item WITH NON-UNIQUE KEY item.
+ 
+    DATA mv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key.
+    DATA mi_repo TYPE REF TO zif_abapgit_repo.
+ 
+    METHODS remove_non_code_related_files
+      CHANGING
+        !ct_local_files TYPE ty_local_files_by_item_tt.
+ 
+    METHODS build_checksums_from_files
+      IMPORTING
+        it_local     TYPE ty_local_files_by_item_tt
+      RETURNING
+        VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+    METHODS save_checksums
+      IMPORTING
+        it_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS add_meta
+      CHANGING
+        cv_cs_blob TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS extract_meta
+      CHANGING
+*        co_string_map - return string map with meta when it is needed
+        cv_cs_blob TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REPO_CHECKSUMS IMPLEMENTATION.
+ 
+ 
+  METHOD add_meta.
+ 
+    DATA lv_meta_str TYPE string.
+ 
+    lv_meta_str = |#repo_name#{ mi_repo->get_name( ) }|.
+ 
+    cv_cs_blob = lv_meta_str && |\n| && cv_cs_blob.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_checksums_from_files.
+ 
+    DATA ls_last_item TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS:
+      <ls_checksum>    LIKE LINE OF rt_checksums,
+      <ls_local>       LIKE LINE OF it_local,
+      <ls_cs_file_sig> LIKE LINE OF <ls_checksum>-files.
+ 
+    " This methods is run at repo creation moment or manually by user
+    " In the first case it assumes that the local state is the CURRENT state
+    " Thus the idea is to copy local state to checksums
+    " The second case is an exception, when we acknoledge that the state is unknown
+    " Thus copying the local to checksums is the "best guess"
+ 
+    LOOP AT it_local ASSIGNING <ls_local>.
+      IF ls_last_item <> <ls_local>-item OR sy-tabix = 1. " First or New item reached ?
+        APPEND INITIAL LINE TO rt_checksums ASSIGNING <ls_checksum>.
+        MOVE-CORRESPONDING <ls_local>-item TO <ls_checksum>-item.
+        ls_last_item       = <ls_local>-item.
+      ENDIF.
+ 
+      APPEND INITIAL LINE TO <ls_checksum>-files ASSIGNING <ls_cs_file_sig>.
+      MOVE-CORRESPONDING <ls_local>-file TO <ls_cs_file_sig>.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    ASSERT iv_repo_key IS NOT INITIAL.
+    mv_repo_key = iv_repo_key.
+    mi_repo = zcl_abapgit_repo_srv=>get_instance( )->get( mv_repo_key ).
+    " Should be safe as repo_srv is supposed to be single source of repo instances
+  ENDMETHOD.
+ 
+ 
+  METHOD extract_meta.
+ 
+    DATA lv_meta_str TYPE string.
+ 
+    IF cv_cs_blob+0(1) <> '#'.
+      RETURN. " No meta ? just ignore it
+    ENDIF.
+ 
+    SPLIT cv_cs_blob AT |\n| INTO lv_meta_str cv_cs_blob.
+    " Just remove the header meta string - this is OK for now.
+    " There is just repo name for the moment - needed to for DB util and potential debug
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD force_write.
+
+    " for migration only for the moment
+
+    save_checksums( it_checksums ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_non_code_related_files.
+ 
+    DELETE ct_local_files
+      WHERE item IS INITIAL
+      AND NOT ( file-path = zif_abapgit_definitions=>c_root_dir
+      AND file-filename = zif_abapgit_definitions=>c_dot_abapgit ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_checksums.
+ 
+    DATA lv_cs_blob TYPE string.
+ 
+    lv_cs_blob = lcl_checksum_serializer=>serialize( it_checksums ).
+    add_meta( CHANGING cv_cs_blob = lv_cs_blob ).
+    zcl_abapgit_persist_factory=>get_repo_cs( )->update(
+      iv_key     = mv_repo_key
+      iv_cs_blob = lv_cs_blob ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_checksums~get.
+ 
+    DATA lv_cs_blob TYPE string.
+ 
+    TRY.
+        lv_cs_blob = zcl_abapgit_persist_factory=>get_repo_cs( )->read( iv_key = mv_repo_key ).
+      CATCH zcx_abapgit_exception zcx_abapgit_not_found.
+        " Ignore currently, it's not critical for execution, just return empty
+        RETURN.
+    ENDTRY.
+ 
+    IF lv_cs_blob IS NOT INITIAL.
+      extract_meta( CHANGING cv_cs_blob = lv_cs_blob ).
+      rt_checksums = lcl_checksum_serializer=>deserialize( lv_cs_blob ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_checksums~get_checksums_per_file.
+ 
+    DATA lt_checksums   TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    FIELD-SYMBOLS <ls_object> LIKE LINE OF lt_checksums.
+ 
+    lt_checksums = zif_abapgit_repo_checksums~get( ).
+ 
+    LOOP AT lt_checksums ASSIGNING <ls_object>.
+      APPEND LINES OF <ls_object>-files TO rt_checksums.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_checksums~rebuild.
+ 
+    DATA lt_local     TYPE ty_local_files_by_item_tt.
+    DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+    lt_local  = mi_repo->get_files_local( ).
+    remove_non_code_related_files( CHANGING ct_local_files = lt_local ).
+ 
+    lt_checksums = build_checksums_from_files( lt_local ).
+    save_checksums( lt_checksums ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_checksums~update.
+ 
+    DATA lt_checksums   TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lt_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt.
+ 
+    lt_checksums   = zif_abapgit_repo_checksums~get( ).
+    lt_local_files = mi_repo->get_files_local( ).
+ 
+    lt_checksums = lcl_update_calculator=>calculate_updated(
+      it_current_checksums = lt_checksums
+      it_local_files       = lt_local_files
+      it_updated_files     = it_updated_files ).
+ 
+    save_checksums( lt_checksums ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_checksums.clas.locals_imp.abap.html b/src/repo/zcl_abapgit_repo_checksums.clas.locals_imp.abap.html new file mode 100644 index 00000000000..541d8f4a0b8 --- /dev/null +++ b/src/repo/zcl_abapgit_repo_checksums.clas.locals_imp.abap.html @@ -0,0 +1,865 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_checksums.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_checksums.clas.locals_imp.abap

+
+ +
+ 95% + Statements + 247/260 +
+ + +
+ 70.58% + Branches + 12/17 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 95% + Lines + 247/260 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +2611x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +16x +  +  +  +16x +16x +16x +16x +16x +  +  +  +1x +1x +1x +10x +10x +10x +10x +  +  +  +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +7x +7x +7x +7x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +4x +4x +  +  +4x +4x +4x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_checksum_serializer DEFINITION
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_splitter TYPE string VALUE `|`.
+    CONSTANTS c_root TYPE string VALUE `@`.
+ 
+    CLASS-METHODS serialize
+      IMPORTING
+        it_checksums     TYPE zif_abapgit_persistence=>ty_local_checksum_tt
+      RETURNING
+        VALUE(rv_string) TYPE string.
+ 
+    CLASS-METHODS deserialize
+      IMPORTING
+        iv_string           TYPE string
+      RETURNING
+        VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS lcl_checksum_serializer IMPLEMENTATION.
+ 
+ 
+  METHOD deserialize.
+ 
+    DATA lt_buf_tab TYPE string_table.
+    DATA lv_buf TYPE string.
+    DATA lt_checksums LIKE rt_checksums.
+ 
+    FIELD-SYMBOLS <ls_cs> LIKE LINE OF lt_checksums.
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
+ 
+    SPLIT iv_string AT |\n| INTO TABLE lt_buf_tab.
+ 
+    LOOP AT lt_buf_tab INTO lv_buf.
+      CHECK lv_buf IS NOT INITIAL. " In fact this is a bug ... it cannot be empty, maybe raise
+ 
+      IF lv_buf+0(1) = '/'.
+        IF <ls_cs> IS NOT ASSIGNED.
+          " Incorrect checksums structure, maybe raise, though it is not critical for execution
+          RETURN.
+        ENDIF.
+ 
+        APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
+        SPLIT lv_buf AT c_splitter INTO <ls_file>-path <ls_file>-filename <ls_file>-sha1.
+ 
+        IF <ls_file>-path IS INITIAL OR <ls_file>-filename IS INITIAL OR <ls_file>-sha1 IS INITIAL.
+          " Incorrect checksums struture, maybe raise, though it is not critical for execution
+          RETURN.
+        ENDIF.
+      ELSEIF lv_buf = c_root. " Root
+        APPEND INITIAL LINE TO lt_checksums ASSIGNING <ls_cs>. " Empty item
+      ELSE.
+        APPEND INITIAL LINE TO lt_checksums ASSIGNING <ls_cs>.
+        SPLIT lv_buf AT c_splitter INTO <ls_cs>-item-obj_type <ls_cs>-item-obj_name <ls_cs>-item-devclass.
+ 
+        IF <ls_cs>-item-obj_type IS INITIAL OR <ls_cs>-item-obj_name IS INITIAL OR <ls_cs>-item-devclass IS INITIAL.
+          " Incorrect checksums structure, maybe raise, though it is not critical for execution
+          RETURN.
+        ENDIF.
+ 
+      ENDIF.
+    ENDLOOP.
+ 
+    rt_checksums = lt_checksums.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD serialize.
+ 
+    DATA lt_buf_tab TYPE string_table.
+    DATA lv_buf TYPE string.
+    DATA lt_checksums_sorted TYPE zif_abapgit_persistence=>ty_local_checksum_by_item_tt.
+ 
+    FIELD-SYMBOLS <ls_cs> LIKE LINE OF it_checksums.
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
+ 
+    lt_checksums_sorted = it_checksums.
+ 
+    LOOP AT lt_checksums_sorted ASSIGNING <ls_cs>.
+ 
+      IF lines( <ls_cs>-files ) = 0.
+        CONTINUE.
+      ENDIF.
+ 
+      IF <ls_cs>-item-obj_type IS NOT INITIAL.
+        CONCATENATE <ls_cs>-item-obj_type <ls_cs>-item-obj_name <ls_cs>-item-devclass
+          INTO lv_buf
+          SEPARATED BY c_splitter.
+      ELSE.
+        lv_buf = c_root.
+      ENDIF.
+      APPEND lv_buf TO lt_buf_tab.
+ 
+      LOOP AT <ls_cs>-files ASSIGNING <ls_file>.
+ 
+        CONCATENATE <ls_file>-path <ls_file>-filename <ls_file>-sha1
+          INTO lv_buf
+          SEPARATED BY c_splitter.
+        APPEND lv_buf TO lt_buf_tab.
+ 
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+    rv_string = concat_lines_of(
+      table = lt_buf_tab
+      sep   = |\n| ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+**********************************************************************
+* UPDATE CALCULATOR
+**********************************************************************
+ 
+CLASS lcl_update_calculator DEFINITION
+  FINAL
+  CREATE PUBLIC.
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS calculate_updated
+      IMPORTING
+        it_updated_files TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt
+        it_current_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
+        it_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RETURNING
+        VALUE(rt_checksums) TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS process_updated_files
+      CHANGING
+        ct_update_index TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+        ct_checksums    TYPE zif_abapgit_persistence=>ty_local_checksum_by_item_tt.
+ 
+    CLASS-METHODS add_new_files
+      IMPORTING
+        it_local        TYPE zif_abapgit_definitions=>ty_files_item_tt
+        it_update_index TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts
+      CHANGING
+        ct_checksums    TYPE zif_abapgit_persistence=>ty_local_checksum_by_item_tt.
+ 
+ENDCLASS.
+ 
+CLASS lcl_update_calculator IMPLEMENTATION.
+ 
+  METHOD calculate_updated.
+ 
+    DATA lt_update_index TYPE zif_abapgit_git_definitions=>ty_file_signatures_ts.
+    DATA lt_checksums_sorted TYPE zif_abapgit_persistence=>ty_local_checksum_by_item_tt.
+ 
+    lt_checksums_sorted = it_current_checksums.
+    lt_update_index     = it_updated_files.
+ 
+    process_updated_files(
+      CHANGING
+        ct_update_index = lt_update_index
+        ct_checksums    = lt_checksums_sorted ).
+ 
+    add_new_files(
+      EXPORTING
+        it_update_index = lt_update_index
+        it_local        = it_local_files
+      CHANGING
+        ct_checksums    = lt_checksums_sorted ).
+ 
+    rt_checksums = lt_checksums_sorted.
+ 
+  ENDMETHOD.
+ 
+  METHOD process_updated_files.
+ 
+    DATA lv_cs_row  TYPE i.
+    DATA lv_file_row  TYPE i.
+ 
+    FIELD-SYMBOLS <ls_checksum>  LIKE LINE OF ct_checksums.
+    FIELD-SYMBOLS <ls_file>      LIKE LINE OF <ls_checksum>-files.
+    FIELD-SYMBOLS <ls_new_state> LIKE LINE OF ct_update_index.
+ 
+    " Loop through current checksum state, update sha1 for common files
+ 
+    LOOP AT ct_checksums ASSIGNING <ls_checksum>.
+      lv_cs_row = sy-tabix.
+ 
+      LOOP AT <ls_checksum>-files ASSIGNING <ls_file>.
+        lv_file_row = sy-tabix.
+ 
+        READ TABLE ct_update_index ASSIGNING <ls_new_state>
+          WITH KEY
+            path     = <ls_file>-path
+            filename = <ls_file>-filename.
+        IF sy-subrc <> 0.
+          CONTINUE. " Missing in updated files -> nothing to update, skip
+        ENDIF.
+ 
+        IF <ls_new_state>-sha1 IS INITIAL. " Empty input sha1 is a deletion marker
+          DELETE <ls_checksum>-files INDEX lv_file_row.
+        ELSE.
+          <ls_file>-sha1 = <ls_new_state>-sha1.  " Update sha1
+          CLEAR <ls_new_state>-sha1.             " Mark as processed
+        ENDIF.
+      ENDLOOP.
+ 
+      IF lines( <ls_checksum>-files ) = 0. " Remove empty objects
+        DELETE ct_checksums INDEX lv_cs_row.
+      ENDIF.
+    ENDLOOP.
+ 
+    DELETE ct_update_index WHERE sha1 IS INITIAL. " Remove processed
+ 
+  ENDMETHOD.
+ 
+  METHOD add_new_files.
+ 
+    DATA lt_local_sorted TYPE zif_abapgit_definitions=>ty_files_item_by_file_tt.
+    DATA ls_checksum LIKE LINE OF ct_checksums.
+    FIELD-SYMBOLS <ls_checksum> LIKE LINE OF ct_checksums.
+    FIELD-SYMBOLS <ls_new_file> LIKE LINE OF it_update_index.
+    FIELD-SYMBOLS <ls_local>    LIKE LINE OF lt_local_sorted.
+ 
+    lt_local_sorted = it_local.
+ 
+    " Add new files - not deleted and not marked as processed
+    LOOP AT it_update_index ASSIGNING <ls_new_file>.
+ 
+      READ TABLE lt_local_sorted ASSIGNING <ls_local>
+        WITH KEY
+          file-path     = <ls_new_file>-path
+          file-filename = <ls_new_file>-filename.
+      IF sy-subrc <> 0.
+        " The file should be in locals, however:
+        " if the deserialization fails, the local file might not be there
+        " in this case no new CS added, and the file will appear to be remote+new
+        CONTINUE.
+      ENDIF.
+ 
+      READ TABLE ct_checksums ASSIGNING <ls_checksum>
+        WITH KEY
+          item-obj_type = <ls_local>-item-obj_type
+          item-obj_name = <ls_local>-item-obj_name.
+      IF sy-subrc <> 0.
+        MOVE-CORRESPONDING <ls_local>-item TO ls_checksum-item.
+        INSERT ls_checksum INTO TABLE ct_checksums ASSIGNING <ls_checksum>.
+      ENDIF.
+ 
+      APPEND <ls_new_file> TO <ls_checksum>-files.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_checksums.clas.testclasses.abap.html b/src/repo/zcl_abapgit_repo_checksums.clas.testclasses.abap.html new file mode 100644 index 00000000000..725f41a1801 --- /dev/null +++ b/src/repo/zcl_abapgit_repo_checksums.clas.testclasses.abap.html @@ -0,0 +1,1834 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_checksums.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_checksums.clas.testclasses.abap

+
+ +
+ 98.11% + Statements + 572/583 +
+ + +
+ 100% + Branches + 14/14 +
+ + +
+ 56.52% + Functions + 13/23 +
+ + +
+ 98.11% + Lines + 572/583 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +5841x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +1x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +2x +2x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
**********************************************************************
+* SERIALIZER
+**********************************************************************
+ 
+CLASS ltcl_test_checksum_serializer DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+  PUBLIC SECTION.
+    METHODS serialize FOR TESTING.
+    METHODS serialize_w_zero_item FOR TESTING.
+    METHODS deserialize FOR TESTING.
+    METHODS deserialize_w_root_file FOR TESTING.
+ 
+    CLASS-METHODS get_mock
+      EXPORTING
+        et_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt
+        ev_str       TYPE string.
+    CLASS-METHODS space_to_separator
+      IMPORTING
+        iv_str TYPE string
+      RETURNING
+        VALUE(rv_str) TYPE string.
+ENDCLASS.
+ 
+CLASS ltcl_test_checksum_serializer IMPLEMENTATION.
+ 
+  METHOD get_mock.
+ 
+    FIELD-SYMBOLS <ls_cs> LIKE LINE OF et_checksums.
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
+ 
+    CLEAR et_checksums.
+ 
+    APPEND INITIAL LINE TO et_checksums ASSIGNING <ls_cs>.
+    <ls_cs>-item-devclass = '$PKG'.
+    <ls_cs>-item-obj_type = 'DEVC'.
+    <ls_cs>-item-obj_name = '$PKG'.
+    APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
+    <ls_file>-path     = '/'.
+    <ls_file>-filename = '$pkg.devc.xml'.
+    <ls_file>-sha1     = 'hash3'.
+ 
+    APPEND INITIAL LINE TO et_checksums ASSIGNING <ls_cs>.
+    <ls_cs>-item-devclass = '$PKG'.
+    <ls_cs>-item-obj_type = 'PROG'.
+    <ls_cs>-item-obj_name = 'ZHELLO'.
+    APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
+    <ls_file>-path     = '/'.
+    <ls_file>-filename = 'zhello.prog.abap'.
+    <ls_file>-sha1     = 'hash1'.
+    APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
+    <ls_file>-path     = '/'.
+    <ls_file>-filename = 'zhello.prog.xml'.
+    <ls_file>-sha1     = 'hash2'.
+ 
+    ev_str = space_to_separator(
+      |DEVC $PKG $PKG\n| &&
+      |/ $pkg.devc.xml hash3\n| &&
+      |PROG ZHELLO $PKG\n| &&
+      |/ zhello.prog.abap hash1\n| &&
+      |/ zhello.prog.xml hash2| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD space_to_separator.
+ 
+    rv_str = replace(
+      val  = iv_str
+      sub  = ` `
+      with = `|`
+      occ  = 0 ).
+    " This way it's easier to read and adjust :)
+ 
+  ENDMETHOD.
+ 
+  METHOD serialize.
+ 
+    DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lv_act TYPE string.
+    DATA lv_exp TYPE string.
+ 
+    get_mock(
+      IMPORTING
+        et_checksums = lt_checksums
+        ev_str       = lv_exp ).
+ 
+    lv_act = lcl_checksum_serializer=>serialize( lt_checksums ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD deserialize.
+ 
+    DATA lt_checksums_exp TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lt_checksums_act TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lv_str TYPE string.
+ 
+    get_mock(
+      IMPORTING
+        et_checksums = lt_checksums_exp
+        ev_str       = lv_str ).
+ 
+    lt_checksums_act = lcl_checksum_serializer=>deserialize( lv_str ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_checksums_act
+      exp = lt_checksums_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD serialize_w_zero_item.
+ 
+    DATA lt_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lv_act TYPE string.
+ 
+    FIELD-SYMBOLS <ls_cs> LIKE LINE OF lt_checksums.
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
+ 
+    APPEND INITIAL LINE TO lt_checksums ASSIGNING <ls_cs>. " empty item !
+ 
+    lv_act = lcl_checksum_serializer=>serialize( lt_checksums ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = '' ).
+ 
+    APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
+    <ls_file>-path     = '/'.
+    <ls_file>-filename = '.gitignore'.
+    <ls_file>-sha1     = 'whatever'.
+    APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
+    <ls_file>-path     = '/'.
+    <ls_file>-filename = '.abapgit.xml'.
+    <ls_file>-sha1     = 'hashZ'.
+ 
+    lv_act = lcl_checksum_serializer=>serialize( lt_checksums ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = space_to_separator(
+        |@\n| &&
+        |/ .gitignore whatever\n| && " it's OK, helper doesn't filter irrelevant files
+        |/ .abapgit.xml hashZ| ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD deserialize_w_root_file.
+ 
+    DATA lt_checksums_exp TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lt_checksums_act TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+    FIELD-SYMBOLS <ls_cs> LIKE LINE OF lt_checksums_exp.
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF <ls_cs>-files.
+ 
+    APPEND INITIAL LINE TO lt_checksums_exp ASSIGNING <ls_cs>. " empty item !
+    APPEND INITIAL LINE TO <ls_cs>-files ASSIGNING <ls_file>.
+    <ls_file>-path     = '/'.
+    <ls_file>-filename = '.abapgit.xml'.
+    <ls_file>-sha1     = 'hashZ'.
+ 
+    lt_checksums_act = lcl_checksum_serializer=>deserialize( space_to_separator(
+      |@\n| &&
+      |/ .abapgit.xml hashZ| ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_checksums_act
+      exp = lt_checksums_exp ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* CHECKSUMS
+**********************************************************************
+ 
+CLASS ltcl_test_checksums DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_persist_repo_cs.
+ 
+    DATA mv_last_update_key TYPE zif_abapgit_persistence=>ty_repo-key.
+    DATA mv_last_update_cs_blob TYPE zif_abapgit_persistence=>ty_content-data_str.
+ 
+    METHODS get FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS rebuild_simple FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS rebuild_w_dot_abapgit FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS update_simple FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* HELPERS
+**********************************************************************
+ 
+CLASS lcl_repo_mock DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_repo.
+    INTERFACES zif_abapgit_repo_srv.
+    DATA mt_local_files TYPE zif_abapgit_definitions=>ty_files_item_tt.
+    DATA mt_remote_files TYPE zif_abapgit_git_definitions=>ty_files_tt.
+ENDCLASS.
+ 
+CLASS lcl_repo_mock IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_repo_srv~get.
+    IF iv_key = '1'.
+      ri_repo = me.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_repo~get_files_local.
+    rt_files = mt_local_files.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_repo~get_files_remote.
+    rt_files = mt_remote_files.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_repo~get_key.
+    rv_key = '1'.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_repo~get_name.
+    rv_name = 'test'.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~checksums.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_repo_srv~init.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~delete.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~get_local_settings.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~get_package.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~get_repo_from_package.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~get_repo_from_url.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~is_offline.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~deserialize.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~deserialize_checks.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~set_dot_abapgit.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~get_dot_abapgit.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~is_repo_installed.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~list.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~list_favorites.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~new_offline.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~new_online.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~purge.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo~refresh.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~validate_package.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~validate_url.
+  ENDMETHOD.
+  METHOD zif_abapgit_repo_srv~get_label_list.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS lcl_local_file_builder DEFINITION FINAL.
+  PUBLIC SECTION.
+    DATA mt_tab TYPE zif_abapgit_definitions=>ty_files_item_tt.
+    METHODS add IMPORTING iv_str TYPE string.
+ENDCLASS.
+ 
+CLASS lcl_local_file_builder IMPLEMENTATION.
+  METHOD add.
+    DATA ls_item LIKE LINE OF mt_tab.
+    DATA lv_tmp TYPE string.
+    lv_tmp = iv_str.
+    CONDENSE lv_tmp.
+    SPLIT lv_tmp AT space INTO
+      ls_item-item-devclass
+      ls_item-item-obj_type
+      ls_item-item-obj_name
+      ls_item-file-path
+      ls_item-file-filename
+      ls_item-file-sha1.
+    IF ls_item-item-devclass = '@'. " Root items
+      CLEAR: ls_item-item-devclass, ls_item-item-obj_type, ls_item-item-obj_name.
+    ENDIF.
+    APPEND ls_item TO mt_tab.
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS lcl_remote_file_builder DEFINITION FINAL.
+  PUBLIC SECTION.
+    DATA mt_tab TYPE zif_abapgit_git_definitions=>ty_files_tt.
+    METHODS add IMPORTING iv_str TYPE string.
+ENDCLASS.
+ 
+CLASS lcl_remote_file_builder IMPLEMENTATION.
+  METHOD add.
+    DATA ls_item LIKE LINE OF mt_tab.
+    DATA lv_tmp TYPE string.
+    lv_tmp = iv_str.
+    CONDENSE lv_tmp.
+    SPLIT lv_tmp AT space INTO
+      ls_item-path
+      ls_item-filename
+      ls_item-sha1.
+    APPEND ls_item TO mt_tab.
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS lcl_file_sig_builder DEFINITION FINAL.
+  PUBLIC SECTION.
+    DATA mt_tab TYPE zif_abapgit_git_definitions=>ty_file_signatures_tt.
+    METHODS add IMPORTING iv_str TYPE string.
+ENDCLASS.
+ 
+CLASS lcl_file_sig_builder IMPLEMENTATION.
+  METHOD add.
+    DATA ls_item LIKE LINE OF mt_tab.
+    DATA lv_tmp TYPE string.
+    lv_tmp = iv_str.
+    CONDENSE lv_tmp.
+    SPLIT lv_tmp AT space INTO
+      ls_item-path
+      ls_item-filename
+      ls_item-sha1.
+    APPEND ls_item TO mt_tab.
+  ENDMETHOD.
+ENDCLASS.
+ 
+**********************************************************************
+* CHECKSUMS UT
+**********************************************************************
+ 
+CLASS ltcl_test_checksums IMPLEMENTATION.
+ 
+  METHOD get.
+ 
+    DATA lo_mock TYPE REF TO lcl_repo_mock.
+    DATA li_cut TYPE REF TO zif_abapgit_repo_checksums.
+    DATA lt_checksums_exp TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+ 
+    CREATE OBJECT lo_mock.
+    zcl_abapgit_repo_srv=>inject_instance( lo_mock ).
+    zcl_abapgit_persist_injector=>set_repo_cs( me ).
+ 
+    ltcl_test_checksum_serializer=>get_mock( IMPORTING et_checksums = lt_checksums_exp ).
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_repo_checksums
+      EXPORTING
+        iv_repo_key = '1'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->get( )
+      exp = lt_checksums_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD rebuild_simple.
+ 
+    DATA lo_mock TYPE REF TO lcl_repo_mock.
+    DATA li_cut TYPE REF TO zif_abapgit_repo_checksums.
+    DATA lv_cs_exp TYPE string.
+    DATA lo_l_builder TYPE REF TO lcl_local_file_builder.
+    DATA lo_r_builder TYPE REF TO lcl_remote_file_builder.
+ 
+    CREATE OBJECT lo_mock.
+    zcl_abapgit_repo_srv=>inject_instance( lo_mock ).
+    zcl_abapgit_persist_injector=>set_repo_cs( me ).
+ 
+    " Local
+    CREATE OBJECT lo_l_builder.
+    lo_l_builder->add( '$PKG PROG ZHELLO / zhello.prog.abap hash1' ).
+    lo_l_builder->add( '$PKG PROG ZHELLO / zhello.prog.xml  hash2' ).
+    lo_l_builder->add( '$PKG DEVC $PKG   / $pkg.devc.xml    hash3' ).
+    lo_mock->mt_local_files = lo_l_builder->mt_tab.
+ 
+    " Remote
+    CREATE OBJECT lo_r_builder.
+    lo_r_builder->add( '/ zhello.prog.abap hash1' ).
+    lo_r_builder->add( '/ zhello.prog.xml  hash2' ).
+    lo_r_builder->add( '/ $pkg.devc.xml    hash3' ).
+    lo_mock->mt_remote_files = lo_r_builder->mt_tab.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_repo_checksums
+      EXPORTING
+        iv_repo_key = '1'.
+ 
+    li_cut->rebuild( ).
+ 
+    lv_cs_exp = ltcl_test_checksum_serializer=>space_to_separator(
+      |#repo_name#test\n| &&
+      |DEVC $PKG $PKG\n| &&
+      |/ $pkg.devc.xml hash3\n| &&
+      |PROG ZHELLO $PKG\n| &&
+      |/ zhello.prog.abap hash1\n| &&
+      |/ zhello.prog.xml hash2| ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mv_last_update_key
+      exp = '1' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mv_last_update_cs_blob
+      exp = lv_cs_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD update_simple.
+ 
+    DATA lo_mock TYPE REF TO lcl_repo_mock.
+    DATA li_cut TYPE REF TO zif_abapgit_repo_checksums.
+    DATA lv_cs_exp TYPE string.
+    DATA lo_f_builder TYPE REF TO lcl_file_sig_builder.
+ 
+    CREATE OBJECT lo_mock.
+ 
+    zcl_abapgit_repo_srv=>inject_instance( lo_mock ).
+    zcl_abapgit_persist_injector=>set_repo_cs( me ).
+ 
+    CREATE OBJECT lo_f_builder.
+    lo_f_builder->add( '/ zhello.prog.abap hash1' ).
+    lo_f_builder->add( '/ zhello.prog.xml  hashNEW' ).
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_repo_checksums
+      EXPORTING
+        iv_repo_key = '1'.
+ 
+    li_cut->update( lo_f_builder->mt_tab ).
+ 
+    lv_cs_exp = ltcl_test_checksum_serializer=>space_to_separator(
+      |#repo_name#test\n| &&
+      |DEVC $PKG $PKG\n| &&
+      |/ $pkg.devc.xml hash3\n| &&
+      |PROG ZHELLO $PKG\n| &&
+      |/ zhello.prog.abap hash1\n| &&
+      |/ zhello.prog.xml hashNEW| ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mv_last_update_key
+      exp = '1' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mv_last_update_cs_blob
+      exp = lv_cs_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_persist_repo_cs~delete.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_persist_repo_cs~read.
+ 
+    IF iv_key = '1'.
+      ltcl_test_checksum_serializer=>get_mock( IMPORTING ev_str = rv_cs_blob ).
+      rv_cs_blob = |#repo_name#test\n{ rv_cs_blob }|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_persist_repo_cs~update.
+    mv_last_update_key     = iv_key.
+    mv_last_update_cs_blob = iv_cs_blob.
+  ENDMETHOD.
+ 
+  METHOD rebuild_w_dot_abapgit.
+ 
+    DATA lo_mock TYPE REF TO lcl_repo_mock.
+    DATA li_cut TYPE REF TO zif_abapgit_repo_checksums.
+    DATA lv_cs_exp TYPE string.
+    DATA lo_l_builder TYPE REF TO lcl_local_file_builder.
+    DATA lo_r_builder TYPE REF TO lcl_remote_file_builder.
+ 
+    CREATE OBJECT lo_mock.
+    zcl_abapgit_repo_srv=>inject_instance( lo_mock ).
+    zcl_abapgit_persist_injector=>set_repo_cs( me ).
+ 
+    " Local
+    CREATE OBJECT lo_l_builder.
+    lo_l_builder->add( '@ @ @ / .abapgit.xml hashZ' ).
+    lo_l_builder->add( '@ @ @ / .gitignore   whatever' ).
+    lo_l_builder->add( '$PKG DEVC $PKG   / $pkg.devc.xml    hash3' ).
+    lo_mock->mt_local_files = lo_l_builder->mt_tab.
+ 
+    " Remote
+    CREATE OBJECT lo_r_builder.
+    lo_r_builder->add( '/ .abapgit.xml     hashZ' ).
+    lo_r_builder->add( '/ .gitignore       whatever' ).
+    lo_r_builder->add( '/ $pkg.devc.xml    hash3' ).
+    lo_mock->mt_remote_files = lo_r_builder->mt_tab.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_repo_checksums
+      EXPORTING
+        iv_repo_key = '1'.
+ 
+    li_cut->rebuild( ).
+ 
+    lv_cs_exp = ltcl_test_checksum_serializer=>space_to_separator(
+      |#repo_name#test\n| &&
+      |@\n| &&
+      |/ .abapgit.xml hashZ\n| &&
+      |DEVC $PKG $PKG\n| &&
+      |/ $pkg.devc.xml hash3| ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mv_last_update_cs_blob
+      exp = lv_cs_exp ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+**********************************************************************
+* UPDATE CALCULATOR
+**********************************************************************
+ 
+CLASS ltcl_update_calculator_test DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS simple_test FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_update_calculator_test IMPLEMENTATION.
+ 
+  METHOD simple_test.
+ 
+    DATA lt_cs_current TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lt_cs_exp TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lt_cs_act TYPE zif_abapgit_persistence=>ty_local_checksum_tt.
+    DATA lo_l_builder TYPE REF TO lcl_local_file_builder.
+    DATA lo_f_builder TYPE REF TO lcl_file_sig_builder.
+ 
+    CREATE OBJECT lo_f_builder.
+    lo_f_builder->add( '/ zhello.prog.abap hash1' ).
+    lo_f_builder->add( '/ zhello.prog.xml  hashNEW' ).
+ 
+    CREATE OBJECT lo_l_builder.
+    lo_l_builder->add( '$PKG PROG ZHELLO / zhello.prog.abap hash1' ).
+    lo_l_builder->add( '$PKG PROG ZHELLO / zhello.prog.xml  hash2' ).
+    lo_l_builder->add( '$PKG DEVC $PKG   / $pkg.devc.xml    hash3' ).
+ 
+    lt_cs_current = lcl_checksum_serializer=>deserialize( ltcl_test_checksum_serializer=>space_to_separator(
+      |DEVC $PKG $PKG\n| &&
+      |/ $pkg.devc.xml hash3\n| &&
+      |PROG ZHELLO $PKG\n| &&
+      |/ zhello.prog.abap hash1\n| &&
+      |/ zhello.prog.xml hash2| ) ).
+ 
+    lt_cs_exp = lcl_checksum_serializer=>deserialize( ltcl_test_checksum_serializer=>space_to_separator(
+      |DEVC $PKG $PKG\n| &&
+      |/ $pkg.devc.xml hash3\n| &&
+      |PROG ZHELLO $PKG\n| &&
+      |/ zhello.prog.abap hash1\n| &&
+      |/ zhello.prog.xml hashNEW| ) ).
+ 
+    lt_cs_act = lcl_update_calculator=>calculate_updated(
+      it_current_checksums = lt_cs_current
+      it_updated_files     = lo_f_builder->mt_tab
+      it_local_files       = lo_l_builder->mt_tab ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lt_cs_act
+      exp = lt_cs_exp ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_content_list.clas.abap.html b/src/repo/zcl_abapgit_repo_content_list.clas.abap.html new file mode 100644 index 00000000000..307299f1531 --- /dev/null +++ b/src/repo/zcl_abapgit_repo_content_list.clas.abap.html @@ -0,0 +1,1108 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_content_list.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_content_list.clas.abap

+
+ +
+ 73.02% + Statements + 249/341 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 73.02% + Lines + 249/341 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +3421x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_repo_content_list DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    METHODS constructor
+      IMPORTING io_repo TYPE REF TO zcl_abapgit_repo.
+ 
+    METHODS list
+      IMPORTING iv_path              TYPE string
+                iv_by_folders        TYPE abap_bool OPTIONAL
+                iv_changes_only      TYPE abap_bool OPTIONAL
+                iv_transports        TYPE abap_bool OPTIONAL
+      RETURNING VALUE(rt_repo_items) TYPE zif_abapgit_definitions=>ty_repo_item_tt
+      RAISING   zcx_abapgit_exception.
+ 
+    METHODS get_log
+      RETURNING VALUE(ri_log) TYPE REF TO zif_abapgit_log.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS: BEGIN OF c_sortkey,
+                 default    TYPE i VALUE 9999,
+                 parent_dir TYPE i VALUE 0,
+                 dir        TYPE i VALUE 1,
+                 orphan     TYPE i VALUE 2,
+                 changed    TYPE i VALUE 3,
+                 inactive   TYPE i VALUE 4,
+               END OF c_sortkey.
+ 
+    DATA: mo_repo TYPE REF TO zcl_abapgit_repo,
+          mi_log  TYPE REF TO zif_abapgit_log.
+ 
+    METHODS build_repo_items_local_only
+      RETURNING VALUE(rt_repo_items) TYPE zif_abapgit_definitions=>ty_repo_item_tt
+      RAISING   zcx_abapgit_exception.
+ 
+    METHODS build_repo_items_with_remote
+      RETURNING VALUE(rt_repo_items) TYPE zif_abapgit_definitions=>ty_repo_item_tt
+      RAISING   zcx_abapgit_exception.
+ 
+    METHODS build_folders
+      IMPORTING iv_cur_dir    TYPE string
+      CHANGING  ct_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt
+      RAISING   zcx_abapgit_exception.
+ 
+    METHODS determine_transports
+      CHANGING ct_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt.
+ 
+    METHODS filter_changes
+      CHANGING ct_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt.
+ 
+    METHODS check_repo_size
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_content_list IMPLEMENTATION.
+ 
+ 
+  METHOD build_folders.
+
+    DATA: lv_index    TYPE i,
+          lt_subitems LIKE ct_repo_items,
+          ls_subitem  LIKE LINE OF ct_repo_items,
+          ls_folder   LIKE LINE OF ct_repo_items.
+
+    DATA lo_state TYPE REF TO zcl_abapgit_item_state.
+
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF ct_repo_items.
+
+
+    LOOP AT ct_repo_items ASSIGNING <ls_item>.
+      lv_index = sy-tabix.
+      CHECK <ls_item>-path <> iv_cur_dir. " files in target dir - just leave them be
+
+      IF zcl_abapgit_path=>is_subdir( iv_path = <ls_item>-path
+                                      iv_parent = iv_cur_dir ) = abap_true.
+        ls_subitem-changes = <ls_item>-changes.
+        ls_subitem-path    = <ls_item>-path.
+        ls_subitem-lstate  = <ls_item>-lstate.
+        ls_subitem-rstate  = <ls_item>-rstate.
+        APPEND ls_subitem TO lt_subitems.
+      ENDIF.
+
+      DELETE ct_repo_items INDEX lv_index.
+    ENDLOOP.
+
+    SORT lt_subitems BY path ASCENDING.
+
+    LOOP AT lt_subitems ASSIGNING <ls_item>.
+      AT NEW path.
+        CLEAR ls_folder.
+        ls_folder-path    = <ls_item>-path.
+        ls_folder-sortkey = c_sortkey-dir. " Directory
+        ls_folder-is_dir  = abap_true.
+        CREATE OBJECT lo_state.
+      ENDAT.
+
+      ls_folder-changes = ls_folder-changes + <ls_item>-changes.
+      lo_state->sum_with_repo_item( <ls_item> ).
+
+      AT END OF path.
+        ls_folder-lstate = lo_state->local( ).
+        ls_folder-rstate = lo_state->remote( ).
+        APPEND ls_folder TO ct_repo_items.
+      ENDAT.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD build_repo_items_local_only.
+ 
+    DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          ls_item  TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS: <ls_repo_item> LIKE LINE OF rt_repo_items,
+                   <ls_tadir>     LIKE LINE OF lt_tadir.
+ 
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+      iv_package            = mo_repo->get_package( )
+      iv_ignore_subpackages = mo_repo->get_local_settings( )-ignore_subpackages
+      iv_only_local_objects = mo_repo->get_local_settings( )-only_local_objects
+      io_dot                = mo_repo->get_dot_abapgit( ) ).
+ 
+    LOOP AT lt_tadir ASSIGNING <ls_tadir>.
+      APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>.
+      <ls_repo_item>-obj_type  = <ls_tadir>-object.
+      <ls_repo_item>-obj_name  = <ls_tadir>-obj_name.
+      <ls_repo_item>-path      = <ls_tadir>-path.
+      <ls_repo_item>-srcsystem = <ls_tadir>-srcsystem.
+      MOVE-CORRESPONDING <ls_repo_item> TO ls_item.
+      <ls_repo_item>-inactive = boolc( zcl_abapgit_objects=>is_active( ls_item ) = abap_false ).
+      IF <ls_repo_item>-inactive = abap_true.
+        <ls_repo_item>-sortkey = c_sortkey-inactive.
+      ELSE.
+        <ls_repo_item>-sortkey = c_sortkey-default.      " Default sort key
+      ENDIF.
+ 
+      IF <ls_repo_item>-obj_type IS NOT INITIAL.
+        MOVE-CORRESPONDING <ls_repo_item> TO ls_item.
+        IF zcl_abapgit_objects=>exists( ls_item ) = abap_true.
+          <ls_repo_item>-changed_by = zcl_abapgit_objects=>changed_by( ls_item ).
+        ENDIF.
+        CLEAR ls_item.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_repo_items_with_remote.
+ 
+    DATA:
+      lo_state      TYPE REF TO zcl_abapgit_item_state,
+      ls_file       TYPE zif_abapgit_definitions=>ty_repo_file,
+      lt_status     TYPE zif_abapgit_definitions=>ty_results_tt,
+      ls_item       TYPE zif_abapgit_definitions=>ty_item,
+      ls_previous   LIKE ls_item,
+      lv_changed_by TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_status>    LIKE LINE OF lt_status,
+                   <ls_repo_item> LIKE LINE OF rt_repo_items.
+ 
+ 
+    lt_status = mo_repo->status( mi_log ).
+ 
+    LOOP AT lt_status ASSIGNING <ls_status>.
+      AT NEW obj_name. "obj_type + obj_name
+        APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>.
+        <ls_repo_item>-obj_type  = <ls_status>-obj_type.
+        <ls_repo_item>-obj_name  = <ls_status>-obj_name.
+        <ls_repo_item>-inactive  = <ls_status>-inactive.
+        <ls_repo_item>-sortkey   = c_sortkey-default. " Default sort key
+        <ls_repo_item>-changes   = 0.
+        <ls_repo_item>-path      = <ls_status>-path.
+        <ls_repo_item>-srcsystem = <ls_status>-srcsystem.
+        CREATE OBJECT lo_state.
+      ENDAT.
+ 
+      IF <ls_status>-filename IS NOT INITIAL.
+        MOVE-CORRESPONDING <ls_status> TO ls_file.
+        ls_file-is_changed = boolc( <ls_status>-match = abap_false ). " TODO refactor
+        APPEND ls_file TO <ls_repo_item>-files.
+ 
+        IF <ls_status>-inactive = abap_true AND <ls_repo_item>-sortkey > c_sortkey-changed.
+          <ls_repo_item>-sortkey = c_sortkey-inactive.
+        ENDIF.
+ 
+        IF ls_file-is_changed = abap_true.
+          <ls_repo_item>-sortkey = c_sortkey-changed. " Changed files
+          <ls_repo_item>-changes = <ls_repo_item>-changes + 1.
+          lo_state->sum_with_status_item( <ls_status> ).
+        ENDIF.
+      ENDIF.
+ 
+      IF <ls_repo_item>-changes > 0 AND <ls_repo_item>-obj_type IS NOT INITIAL.
+        MOVE-CORRESPONDING <ls_repo_item> TO ls_item.
+        IF ls_previous = ls_item.
+          <ls_repo_item>-changed_by = lv_changed_by.
+        ELSEIF zcl_abapgit_objects=>exists( ls_item ) = abap_true.
+          <ls_repo_item>-changed_by = zcl_abapgit_objects=>changed_by( ls_item ).
+          ls_previous = ls_item.
+          lv_changed_by = <ls_repo_item>-changed_by.
+        ENDIF.
+        CLEAR ls_item.
+      ENDIF.
+ 
+      AT END OF obj_name. "obj_type + obj_name
+        IF <ls_repo_item>-obj_type IS INITIAL.
+          <ls_repo_item>-sortkey = c_sortkey-orphan. "Virtual objects
+        ENDIF.
+        <ls_repo_item>-lstate = lo_state->local( ).
+        <ls_repo_item>-rstate = lo_state->remote( ).
+        <ls_repo_item>-packmove = lo_state->is_reassigned( ).
+      ENDAT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_repo_size.
+
+    CONSTANTS lc_new_repo_size TYPE i VALUE 10.
+
+    DATA lt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt.
+
+    lt_remote = mo_repo->get_files_remote( ).
+
+    IF lines( lt_remote ) > lc_new_repo_size.
+      " Less files means it's a new repo (with just readme and license, for example) which is ok
+      READ TABLE lt_remote TRANSPORTING NO FIELDS
+        WITH KEY file_path
+        COMPONENTS path     = zif_abapgit_definitions=>c_root_dir
+                   filename = zif_abapgit_definitions=>c_dot_abapgit.
+      IF sy-subrc <> 0.
+        mi_log->add_warning( |Cannot find .abapgit.xml - Is this an abapGit repository?| ).
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mo_repo = io_repo.
+    CREATE OBJECT mi_log TYPE zcl_abapgit_log.
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_transports.
+
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF ct_repo_items.
+
+    LOOP AT ct_repo_items ASSIGNING <ls_item>.
+      ls_item-obj_type = <ls_item>-obj_type.
+      ls_item-obj_name = <ls_item>-obj_name.
+      TRY.
+          <ls_item>-transport = zcl_abapgit_factory=>get_cts_api( )->get_transport_for_object( ls_item ).
+        CATCH zcx_abapgit_exception ##NO_HANDLER.
+          " Ignore errors related to object check when trying to get transport
+      ENDTRY.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_changes.
+
+    FIELD-SYMBOLS: <ls_item> TYPE zif_abapgit_definitions=>ty_repo_item.
+
+    DELETE ct_repo_items WHERE changes = 0 AND inactive = abap_false.
+    LOOP AT ct_repo_items ASSIGNING <ls_item> WHERE inactive = abap_false.
+      DELETE <ls_item>-files WHERE is_changed = abap_false.
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_log.
+    DATA li_repo_log TYPE REF TO zif_abapgit_log.
+    DATA lt_repo_msg TYPE zif_abapgit_log=>ty_log_outs.
+    DATA lr_repo_msg TYPE REF TO zif_abapgit_log=>ty_log_out.
+ 
+    ri_log = mi_log.
+ 
+    "add warning and error messages from repo log
+    li_repo_log = mo_repo->get_log( ).
+    IF li_repo_log IS BOUND.
+      lt_repo_msg = li_repo_log->get_messages( ).
+      LOOP AT lt_repo_msg REFERENCE INTO lr_repo_msg WHERE type CA 'EW'.
+        CASE lr_repo_msg->type.
+          WHEN 'E'.
+            ri_log->add_error( lr_repo_msg->text ).
+          WHEN 'W'.
+            ri_log->add_warning( lr_repo_msg->text ).
+          WHEN OTHERS.
+            CONTINUE.
+        ENDCASE.
+      ENDLOOP.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD list.
+ 
+    mi_log->clear( ).
+ 
+    IF mo_repo->has_remote_source( ) = abap_true.
+      rt_repo_items = build_repo_items_with_remote( ).
+      check_repo_size( ).
+    ELSE.
+      rt_repo_items = build_repo_items_local_only( ).
+    ENDIF.
+ 
+    IF iv_by_folders = abap_true.
+      build_folders(
+        EXPORTING iv_cur_dir    = iv_path
+        CHANGING  ct_repo_items = rt_repo_items ).
+    ENDIF.
+ 
+    IF iv_changes_only = abap_true.
+      " There are never changes for offline repositories
+      filter_changes( CHANGING ct_repo_items = rt_repo_items ).
+    ENDIF.
+ 
+    IF iv_transports = abap_true.
+      determine_transports( CHANGING ct_repo_items = rt_repo_items ).
+    ENDIF.
+ 
+    SORT rt_repo_items BY
+      sortkey ASCENDING
+      path ASCENDING
+      obj_name ASCENDING.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_cs_migration.clas.abap.html b/src/repo/zcl_abapgit_repo_cs_migration.clas.abap.html new file mode 100644 index 00000000000..bd6a855b47d --- /dev/null +++ b/src/repo/zcl_abapgit_repo_cs_migration.clas.abap.html @@ -0,0 +1,436 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_cs_migration.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_cs_migration.clas.abap

+
+ +
+ 100% + Statements + 117/117 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 117/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +1181x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_repo_cs_migration DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS run
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      ty_repo_ids TYPE SORTED TABLE OF zif_abapgit_persistence=>ty_repo-key WITH UNIQUE KEY table_line.
+ 
+    CLASS-METHODS get_unconverted_repo_ids
+      RETURNING
+        VALUE(rt_repo_ids) TYPE ty_repo_ids.
+    CLASS-METHODS clear_repo_metadata
+      IMPORTING
+        iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found.
+    CLASS-METHODS convert_checksums
+      IMPORTING
+        iv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception
+        zcx_abapgit_not_found.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REPO_CS_MIGRATION IMPLEMENTATION.
+ 
+ 
+  METHOD clear_repo_metadata.
+ 
+    DATA lo_repo_persistence TYPE REF TO zcl_abapgit_persistence_repo.
+ 
+    lo_repo_persistence ?= zcl_abapgit_persist_factory=>get_repo( ).
+    lo_repo_persistence->rewrite_repo_meta( iv_repo_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD convert_checksums.
+ 
+    DATA lo_cs TYPE REF TO zcl_abapgit_repo_checksums.
+    DATA lv_xml TYPE zif_abapgit_persistence=>ty_content-data_str.
+    DATA:
+      BEGIN OF ls_repo_extract,
+        local_checksums TYPE zif_abapgit_persistence=>ty_local_checksum_tt,
+      END OF ls_repo_extract.
+ 
+    lv_xml = zcl_abapgit_persistence_db=>get_instance( )->read(
+      iv_type  = zcl_abapgit_persistence_db=>c_type_repo
+      iv_value = iv_repo_key ).
+ 
+    REPLACE ALL OCCURRENCES OF '<_--28C_TYPE_REPO_--29>' IN lv_xml WITH '<REPO>'.
+    REPLACE ALL OCCURRENCES OF '</_--28C_TYPE_REPO_--29>' IN lv_xml WITH '</REPO>'.
+ 
+    CALL TRANSFORMATION id
+      OPTIONS value_handling = 'accept_data_loss'
+      SOURCE XML lv_xml
+      RESULT repo = ls_repo_extract.
+ 
+    IF lines( ls_repo_extract-local_checksums ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    CREATE OBJECT lo_cs EXPORTING iv_repo_key = iv_repo_key.
+    lo_cs->force_write( ls_repo_extract-local_checksums ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_unconverted_repo_ids.
+ 
+    DATA lt_cs_ids TYPE ty_repo_ids.
+    DATA lv_repo_id LIKE LINE OF rt_repo_ids.
+    DATA lv_index TYPE i.
+ 
+    SELECT value FROM (zcl_abapgit_persistence_db=>c_tabname)
+      INTO TABLE rt_repo_ids
+      WHERE type = zcl_abapgit_persistence_db=>c_type_repo.
+    SELECT value FROM (zcl_abapgit_persistence_db=>c_tabname)
+      INTO TABLE lt_cs_ids
+      WHERE type = zcl_abapgit_persistence_db=>c_type_repo_csum.
+ 
+    LOOP AT rt_repo_ids INTO lv_repo_id.
+      lv_index = sy-tabix.
+      READ TABLE lt_cs_ids TRANSPORTING NO FIELDS WITH KEY table_line = lv_repo_id.
+      IF sy-subrc = 0. " Already converted
+        DELETE rt_repo_ids INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    DATA lt_repo_ids TYPE ty_repo_ids.
+    DATA lv_repo_id LIKE LINE OF lt_repo_ids.
+ 
+    lt_repo_ids = get_unconverted_repo_ids( ).
+ 
+    LOOP AT lt_repo_ids INTO lv_repo_id.
+      convert_checksums( lv_repo_id ).
+      clear_repo_metadata( lv_repo_id ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_filter.clas.abap.html b/src/repo/zcl_abapgit_repo_filter.clas.abap.html new file mode 100644 index 00000000000..23899626c7e --- /dev/null +++ b/src/repo/zcl_abapgit_repo_filter.clas.abap.html @@ -0,0 +1,583 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_filter.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_filter.clas.abap

+
+ +
+ 25.9% + Statements + 43/166 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 25.9% + Lines + 43/166 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +1671x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_repo_filter DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    METHODS apply
+      IMPORTING
+        it_filter TYPE zif_abapgit_definitions=>ty_tadir_tt
+      CHANGING
+        ct_tadir  TYPE zif_abapgit_definitions=>ty_tadir_tt .
+ 
+    METHODS apply_object_filter
+      IMPORTING
+        it_filter   TYPE zif_abapgit_definitions=>ty_tadir_tt
+        io_dot      TYPE REF TO zcl_abapgit_dot_abapgit OPTIONAL
+        iv_devclass TYPE devclass OPTIONAL
+      CHANGING
+        ct_files    TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+ 
+    METHODS filter_generated_tadir
+      CHANGING
+        !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt .
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_filter IMPLEMENTATION.
+ 
+ 
+  METHOD apply.
+
+    DATA: lt_filter TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_tadir
+                      WITH NON-UNIQUE KEY object obj_name,
+          lv_index  TYPE i.
+
+    FIELD-SYMBOLS: <ls_tadir> LIKE LINE OF ct_tadir.
+
+    filter_generated_tadir( CHANGING ct_tadir = ct_tadir ).
+
+    IF lines( it_filter ) = 0.
+      RETURN.
+    ENDIF.
+
+    lt_filter = it_filter.
+
+* this is another loop at TADIR, but typically the filter is blank
+    LOOP AT ct_tadir ASSIGNING <ls_tadir>.
+      lv_index = sy-tabix.
+      READ TABLE lt_filter TRANSPORTING NO FIELDS WITH KEY object = <ls_tadir>-object
+                                                           obj_name = <ls_tadir>-obj_name
+                                                  BINARY SEARCH.
+      IF sy-subrc <> 0.
+        DELETE ct_tadir INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_object_filter.
+    DATA lr_file TYPE REF TO zif_abapgit_git_definitions=>ty_file.
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA ls_tadir TYPE zif_abapgit_definitions=>ty_tadir.
+    DATA lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    DATA lt_filter TYPE SORTED TABLE OF zif_abapgit_definitions=>ty_tadir
+                      WITH NON-UNIQUE KEY object obj_name.
+
+    lt_filter = it_filter.
+
+    LOOP AT ct_files REFERENCE INTO lr_file.
+      IF lr_file->filename = zif_abapgit_definitions=>c_dot_abapgit.
+        CONTINUE.
+      ENDIF.
+
+      zcl_abapgit_filename_logic=>file_to_object(
+        EXPORTING
+          iv_filename = lr_file->filename
+          iv_path     = lr_file->path
+          iv_devclass = iv_devclass
+          io_dot      = io_dot
+        IMPORTING
+          es_item     = ls_item ).
+
+      CLEAR lt_tadir.
+      CLEAR ls_tadir.
+
+      ls_tadir-object = ls_item-obj_type.
+      ls_tadir-obj_name = ls_item-obj_name.
+      ls_tadir-devclass = ls_item-devclass.
+
+      INSERT ls_tadir INTO TABLE lt_tadir.
+
+      filter_generated_tadir( CHANGING ct_tadir = lt_tadir ).
+
+      IF lt_tadir IS INITIAL.
+        DELETE ct_files.
+        CONTINUE.
+      ENDIF.
+
+      READ TABLE lt_filter TRANSPORTING NO FIELDS
+      WITH KEY object = ls_tadir-object
+               obj_name = ls_tadir-obj_name
+      BINARY SEARCH.
+
+      IF sy-subrc <> 0.
+        DELETE ct_files.
+      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD filter_generated_tadir.
+
+    DATA: ls_tadir     TYPE zif_abapgit_definitions=>ty_tadir,
+          ls_tadir_gen TYPE zif_abapgit_definitions=>ty_tadir,
+          lv_cd_object TYPE cdobjectcl,
+          lt_cd_names  TYPE STANDARD TABLE OF cdnames,
+          ls_cd_names  TYPE cdnames,
+          lt_tcdrs     TYPE STANDARD TABLE OF tcdrs,
+          ls_tcdrs     TYPE tcdrs.
+
+    LOOP AT ct_tadir INTO ls_tadir WHERE pgmid = 'R3TR' AND object = 'CHDO'.
+      CLEAR: lv_cd_object, lt_cd_names, ls_tadir_gen, lt_tcdrs, ls_tcdrs.
+
+      lv_cd_object = ls_tadir-obj_name.
+
+      CALL FUNCTION 'CDNAMES_GET'
+        EXPORTING
+          iv_object        = lv_cd_object
+        TABLES
+          it_names         = lt_cd_names
+          it_tcdrs         = lt_tcdrs
+        EXCEPTIONS
+          object_space     = 1
+          object_not_found = 2
+          OTHERS           = 3.
+      IF sy-subrc <> 0.
+        CONTINUE.
+      ENDIF.
+
+      LOOP AT lt_cd_names INTO ls_cd_names.
+        DELETE ct_tadir WHERE pgmid = 'R3TR'
+                          AND ( ( object = 'PROG'
+                              AND ( obj_name = ls_cd_names-repnamec
+                                 OR obj_name = ls_cd_names-repnamet
+                                 OR obj_name = ls_cd_names-repnamefix
+                                 OR obj_name = ls_cd_names-repnamevar ) )
+                               OR object = 'FUGR' AND obj_name = ls_cd_names-fgrp ).
+      ENDLOOP.
+
+      LOOP AT lt_tcdrs INTO ls_tcdrs.
+        DELETE ct_tadir WHERE pgmid = 'R3TR' AND object = 'TABL' AND obj_name = ls_tcdrs-tabname.
+      ENDLOOP.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_offline.clas.abap.html b/src/repo/zcl_abapgit_repo_offline.clas.abap.html new file mode 100644 index 00000000000..a0d91f888c3 --- /dev/null +++ b/src/repo/zcl_abapgit_repo_offline.clas.abap.html @@ -0,0 +1,283 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_offline.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_offline.clas.abap

+
+ +
+ 74.24% + Statements + 49/66 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 74.24% + Lines + 49/66 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +671x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_repo_offline DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_repo
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS set_name
+      IMPORTING
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS zif_abapgit_repo~get_name
+        REDEFINITION .
+    METHODS has_remote_source
+        REDEFINITION .
+  PROTECTED SECTION.
+ 
+    METHODS reset_remote
+        REDEFINITION .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_offline IMPLEMENTATION.
+ 
+ 
+  METHOD has_remote_source.
+    rv_yes = boolc( lines( mt_remote ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD reset_remote.
+
+    DATA lt_backup LIKE mt_remote.
+
+    " online repo has online source to renew data from, offline does not
+    " so offline repo preserves the remote
+    " in case of partial pull failure the user will immediately see the new difference
+    " UI will detect "pullable" content based on mt_status
+    " in the uniform way both for online and offline repos
+    " for more details see discussion in 2096 and 1953
+
+    lt_backup = mt_remote.
+    super->reset_remote( ).
+    set_files_remote( lt_backup ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_name.
+    set( iv_url = iv_url ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_name.
+    rv_name = super->get_name( ).
+ 
+    IF rv_name IS INITIAL.
+      rv_name = ms_data-url.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_online.clas.abap.html b/src/repo/zcl_abapgit_repo_online.clas.abap.html new file mode 100644 index 00000000000..643823a5324 --- /dev/null +++ b/src/repo/zcl_abapgit_repo_online.clas.abap.html @@ -0,0 +1,1294 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_online.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_online.clas.abap

+
+ +
+ 41.68% + Statements + 168/403 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/11 +
+ + +
+ 41.68% + Lines + 168/403 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +4041x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_repo_online DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_repo
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_repo_online .
+ 
+    ALIASES create_branch
+      FOR zif_abapgit_repo_online~create_branch .
+    ALIASES get_current_remote
+      FOR zif_abapgit_repo_online~get_current_remote .
+    ALIASES get_selected_branch
+      FOR zif_abapgit_repo_online~get_selected_branch .
+    ALIASES get_selected_commit
+      FOR zif_abapgit_repo_online~get_selected_commit .
+    ALIASES get_url
+      FOR zif_abapgit_repo_online~get_url .
+    ALIASES push
+      FOR zif_abapgit_repo_online~push .
+    ALIASES select_branch
+      FOR zif_abapgit_repo_online~select_branch .
+    ALIASES select_commit
+      FOR zif_abapgit_repo_online~select_commit .
+    ALIASES set_url
+      FOR zif_abapgit_repo_online~set_url .
+    ALIASES switch_origin
+      FOR zif_abapgit_repo_online~switch_origin .
+    ALIASES get_switched_origin
+      FOR zif_abapgit_repo_online~get_switched_origin.
+ 
+ 
+ 
+    METHODS zif_abapgit_repo~get_files_remote
+        REDEFINITION .
+    METHODS zif_abapgit_repo~get_name
+        REDEFINITION .
+    METHODS has_remote_source
+        REDEFINITION .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_objects TYPE zif_abapgit_definitions=>ty_objects_tt .
+    DATA mv_current_commit TYPE zif_abapgit_git_definitions=>ty_sha1 .
+ 
+    METHODS handle_stage_ignore
+      IMPORTING
+        !io_stage TYPE REF TO zcl_abapgit_stage
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_objects
+      IMPORTING
+        !it_objects TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS fetch_remote
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_objects
+      RETURNING
+        VALUE(rt_objects) TYPE zif_abapgit_definitions=>ty_objects_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS raise_error_if_branch_exists
+      IMPORTING
+        iv_name TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_online IMPLEMENTATION.
+ 
+ 
+  METHOD fetch_remote.
+
+    DATA: li_progress TYPE REF TO zif_abapgit_progress,
+          ls_pull     TYPE zcl_abapgit_git_porcelain=>ty_pull_result.
+
+    IF mv_request_remote_refresh = abap_false.
+      RETURN.
+    ENDIF.
+
+    li_progress = zcl_abapgit_progress=>get_instance( 1 ).
+
+    li_progress->show( iv_current = 1
+                       iv_text    = 'Fetch remote files' ).
+
+    IF get_selected_commit( ) IS INITIAL.
+      ls_pull = zcl_abapgit_git_porcelain=>pull_by_branch( iv_url         = get_url( )
+                                                           iv_branch_name = get_selected_branch( ) ).
+    ELSE.
+      ls_pull = zcl_abapgit_git_porcelain=>pull_by_commit( iv_url         = get_url( )
+                                                           iv_commit_hash = get_selected_commit( ) ).
+    ENDIF.
+
+    set_files_remote( ls_pull-files ).
+    set_objects( ls_pull-objects ).
+    mv_current_commit = ls_pull-commit.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD get_objects.
+    fetch_remote( ).
+    rt_objects = mt_objects.
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_stage_ignore.
+
+    DATA: lv_add         TYPE abap_bool,
+          lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit,
+          lt_stage       TYPE zif_abapgit_definitions=>ty_stage_tt.
+
+    FIELD-SYMBOLS: <ls_stage> LIKE LINE OF lt_stage.
+
+
+    lo_dot_abapgit = get_dot_abapgit( ).
+    lt_stage = io_stage->get_all( ).
+    LOOP AT lt_stage ASSIGNING <ls_stage> WHERE method = zif_abapgit_definitions=>c_method-ignore.
+
+      lo_dot_abapgit->add_ignore(
+        iv_path     = <ls_stage>-file-path
+        iv_filename = <ls_stage>-file-filename ).
+
+      " remove it from the staging object, as the action is handled here
+      io_stage->reset( iv_path     = <ls_stage>-file-path
+                       iv_filename = <ls_stage>-file-filename ).
+
+      lv_add = abap_true.
+
+    ENDLOOP.
+
+    IF lv_add = abap_true.
+      io_stage->add(
+        iv_path     = zif_abapgit_definitions=>c_root_dir
+        iv_filename = zif_abapgit_definitions=>c_dot_abapgit
+        iv_data     = lo_dot_abapgit->serialize( ) ).
+
+      set_dot_abapgit( lo_dot_abapgit ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD has_remote_source.
+    rv_yes = abap_true.
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_error_if_branch_exists.
+
+    DATA:
+      lt_branches     TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+      lv_display_name TYPE string.
+
+    lt_branches = zcl_abapgit_git_transport=>branches( get_url( ) )->get_branches_only( ).
+
+    READ TABLE lt_branches WITH TABLE KEY name_key
+                           COMPONENTS name = iv_name
+                           TRANSPORTING NO FIELDS.
+    IF sy-subrc = 0.
+      lv_display_name = zcl_abapgit_git_branch_list=>get_display_name( iv_name ).
+      zcx_abapgit_exception=>raise( |Branch '{ lv_display_name }' already exists| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_objects.
+    mt_objects = it_objects.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~check_for_valid_branch.
+
+    DATA:
+      lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list,
+      lv_branch      TYPE string,
+      lv_head        TYPE string,
+      lv_msg         TYPE string.
+
+    lv_branch = get_selected_branch( ).
+
+    IF lv_branch IS NOT INITIAL.
+      lo_branch_list = zcl_abapgit_git_transport=>branches( get_url( ) ).
+
+      TRY.
+          lo_branch_list->find_by_name( lv_branch ).
+        CATCH zcx_abapgit_exception.
+          " branch does not exist, fallback to head
+          lv_head = lo_branch_list->get_head_symref( ).
+          IF lo_branch_list->get_type( lv_branch ) = zif_abapgit_git_definitions=>c_git_branch_type-branch.
+            lv_msg = 'Branch'.
+          ELSE.
+            lv_msg = 'Tag'.
+          ENDIF.
+          lv_msg = |{ lv_msg } { lo_branch_list->get_display_name( lv_branch ) } does not exist.|
+                && | Switched to { lo_branch_list->get_display_name( lv_head ) }|.
+          MESSAGE lv_msg TYPE 'S'.
+          select_branch( lv_head ).
+      ENDTRY.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~create_branch.
+
+    DATA: lv_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1.
+
+    ASSERT iv_name CP zif_abapgit_git_definitions=>c_git_branch-heads.
+
+    IF iv_from IS INITIAL.
+      lv_sha1 = get_current_remote( ).
+    ELSE.
+      lv_sha1 = iv_from.
+    ENDIF.
+
+    raise_error_if_branch_exists( iv_name ).
+
+    zcl_abapgit_git_porcelain=>create_branch(
+      iv_url  = get_url( )
+      iv_name = iv_name
+      iv_from = lv_sha1 ).
+
+    " automatically switch to new branch
+    select_branch( iv_name ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_current_remote.
+    fetch_remote( ).
+    rv_sha1 = mv_current_commit.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_selected_branch.
+    rv_name = ms_data-branch_name.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_selected_commit.
+    rv_selected_commit = ms_data-selected_commit.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_switched_origin.
+    rv_switched_origin = ms_data-switched_origin.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~get_url.
+    rv_url = ms_data-url.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~push.
+
+* assumption: PUSH is done on top of the currently selected branch
+
+    DATA: ls_push   TYPE zcl_abapgit_git_porcelain=>ty_push_result,
+          lv_text   TYPE string,
+          lv_parent TYPE zif_abapgit_git_definitions=>ty_sha1.
+
+
+    IF ms_data-branch_name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+      lv_text = |You're working on a tag. Currently it's not |
+             && |possible to push on tags. Consider creating a branch instead|.
+      zcx_abapgit_exception=>raise( lv_text ).
+    ENDIF.
+
+    IF ms_data-selected_commit IS NOT INITIAL.
+      lv_text = 'You are currently checked out in a commit.'.
+      lv_text = |{ lv_text } You must be on a branch to push|.
+      zcx_abapgit_exception=>raise( lv_text ).
+    ENDIF.
+
+    IF ms_data-local_settings-block_commit = abap_true
+        AND zcl_abapgit_factory=>get_code_inspector( get_package( )
+          )->is_successful( ) = abap_false.
+      zcx_abapgit_exception=>raise( |A successful code inspection is required| ).
+    ENDIF.
+
+    handle_stage_ignore( io_stage ).
+
+    IF get_selected_commit( ) IS INITIAL.
+      lv_parent = get_current_remote( ).
+    ELSE.
+      lv_parent = get_selected_commit( ).
+    ENDIF.
+
+    ls_push = zcl_abapgit_git_porcelain=>push(
+      is_comment     = is_comment
+      io_stage       = io_stage
+      iv_branch_name = get_selected_branch( )
+      iv_url         = get_url( )
+      iv_parent      = lv_parent
+      it_old_objects = get_objects( ) ).
+
+    set_objects( ls_push-new_objects ).
+    set_files_remote( ls_push-new_files ).
+
+    mv_current_commit = ls_push-branch.
+
+    zif_abapgit_repo~checksums( )->update( ls_push-updated_files ).
+
+    reset_status( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~select_branch.
+
+    reset_remote( ).
+    set( iv_branch_name     = iv_branch_name
+         iv_selected_commit = space ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~select_commit.
+
+    reset_remote( ).
+    set( iv_selected_commit = iv_selected_commit ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~set_url.
+
+    reset_remote( ).
+    set( iv_url = iv_url ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_online~switch_origin.
+
+    DATA lv_offs TYPE i.
+
+    " For repo settings page
+    IF iv_overwrite = abap_true.
+      set( iv_switched_origin = iv_url ).
+      RETURN.
+    ENDIF.
+
+    IF iv_url IS INITIAL.
+      IF ms_data-switched_origin IS INITIAL.
+        RETURN.
+      ELSE.
+        lv_offs = find(
+          val = reverse( ms_data-switched_origin )
+          sub = '@' ).
+        IF lv_offs = -1.
+          zcx_abapgit_exception=>raise( 'Incorrect format of switched origin' ).
+        ENDIF.
+        lv_offs = strlen( ms_data-switched_origin ) - lv_offs - 1.
+        set_url( substring(
+          val = ms_data-switched_origin
+          len = lv_offs ) ).
+        select_branch( substring(
+          val = ms_data-switched_origin
+          off = lv_offs + 1 ) ).
+        set( iv_switched_origin = '' ).
+      ENDIF.
+    ELSEIF ms_data-switched_origin IS INITIAL.
+      set( iv_switched_origin = ms_data-url && '@' && ms_data-branch_name ).
+      set_url( iv_url ).
+      select_branch( iv_branch ).
+    ELSE.
+      zcx_abapgit_exception=>raise( 'Cannot switch origin twice' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_files_remote.
+    fetch_remote( ).
+    rt_files = super->get_files_remote(
+      ii_obj_filter   = ii_obj_filter
+      iv_ignore_files = iv_ignore_files ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo~get_name.
+    rv_name = super->get_name( ).
+    IF rv_name IS INITIAL.
+      TRY.
+          rv_name = zcl_abapgit_url=>name( ms_data-url ).
+          rv_name = cl_http_utility=>unescape_url( rv_name ).
+        CATCH zcx_abapgit_exception.
+          rv_name = 'New online repo'. "unlikely fallback
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/repo/zcl_abapgit_repo_srv.clas.abap.html b/src/repo/zcl_abapgit_repo_srv.clas.abap.html new file mode 100644 index 00000000000..3a0c4b5bf9a --- /dev/null +++ b/src/repo/zcl_abapgit_repo_srv.clas.abap.html @@ -0,0 +1,2239 @@ + + + + + + Code coverage report for src/repo/zcl_abapgit_repo_srv.clas.abap + + + + + + + + + +
+
+

All files / src/repo zcl_abapgit_repo_srv.clas.abap

+
+ +
+ 60.44% + Statements + 434/718 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/12 +
+ + +
+ 60.44% + Lines + 434/718 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +7191x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_repo_srv DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_repo_srv .
+    INTERFACES zif_abapgit_repo_listener .
+ 
+    CLASS-METHODS get_instance
+      RETURNING
+        VALUE(ri_srv) TYPE REF TO zif_abapgit_repo_srv .
+    CLASS-METHODS inject_instance
+      IMPORTING
+        ii_srv TYPE REF TO zif_abapgit_repo_srv.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_ref TYPE REF TO zif_abapgit_repo_srv .
+    DATA mv_init TYPE abap_bool.
+    DATA mv_only_favorites TYPE abap_bool.
+    DATA mt_list TYPE zif_abapgit_repo_srv=>ty_repo_list .
+ 
+    METHODS determine_branch_name
+      IMPORTING
+        !iv_name       TYPE string
+        !iv_url        TYPE string
+      RETURNING
+        VALUE(rv_name) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_all
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_favorites
+      RAISING
+        zcx_abapgit_exception .
+    METHODS instantiate_and_add
+      IMPORTING
+        !is_repo_meta  TYPE zif_abapgit_persistence=>ty_repo
+      RETURNING
+        VALUE(ri_repo) TYPE REF TO zif_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add
+      IMPORTING
+        !ii_repo TYPE REF TO zif_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+    METHODS reinstantiate_repo
+      IMPORTING
+        !iv_key  TYPE zif_abapgit_persistence=>ty_repo-key
+        !is_meta TYPE zif_abapgit_persistence=>ty_repo_xml
+      RAISING
+        zcx_abapgit_exception .
+    METHODS validate_sub_super_packages
+      IMPORTING
+        !iv_package    TYPE devclass
+        !it_repos      TYPE zif_abapgit_persistence=>ty_repos
+        !iv_ign_subpkg TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        VALUE(ei_repo) TYPE REF TO zif_abapgit_repo
+        !ev_reason     TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_repo_srv IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+
+    DATA li_repo LIKE LINE OF mt_list.
+    DATA lo_repo TYPE REF TO zcl_abapgit_repo.
+
+    LOOP AT mt_list INTO li_repo.
+      IF li_repo->ms_data-key = ii_repo->ms_data-key.
+        IF li_repo = ii_repo.
+          RETURN.
+        ENDIF.
+        zcx_abapgit_exception=>raise( 'identical keys' ).
+      ENDIF.
+    ENDLOOP.
+
+    lo_repo ?= ii_repo. " TODO, refactor later
+    lo_repo->bind_listener( me ).
+    APPEND ii_repo TO mt_list.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_branch_name.
+ 
+    DATA lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list.
+ 
+    rv_name = iv_name.
+    IF rv_name IS INITIAL.
+      ASSERT NOT iv_url IS INITIAL.
+      lo_branch_list = zcl_abapgit_git_transport=>branches( iv_url ).
+      rv_name = lo_branch_list->get_head_symref( ).
+    ELSEIF -1 = find(
+        val = rv_name
+        sub = zif_abapgit_git_definitions=>c_git_branch-heads_prefix ).
+      " Assume short branch name was received
+      rv_name = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && rv_name.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+    IF gi_ref IS INITIAL.
+      CREATE OBJECT gi_ref TYPE zcl_abapgit_repo_srv.
+    ENDIF.
+    ri_srv = gi_ref.
+  ENDMETHOD.
+ 
+ 
+  METHOD inject_instance.
+    gi_ref = ii_srv.
+  ENDMETHOD.
+ 
+ 
+  METHOD instantiate_and_add.
+ 
+    IF is_repo_meta-offline = abap_false.
+      CREATE OBJECT ri_repo TYPE zcl_abapgit_repo_online
+        EXPORTING
+          is_data = is_repo_meta.
+    ELSE.
+      CREATE OBJECT ri_repo TYPE zcl_abapgit_repo_offline
+        EXPORTING
+          is_data = is_repo_meta.
+    ENDIF.
+    add( ri_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_all.
+
+    DATA: lt_list TYPE zif_abapgit_persistence=>ty_repos.
+
+    FIELD-SYMBOLS: <ls_list> LIKE LINE OF lt_list.
+
+    CLEAR mt_list.
+
+    lt_list = zcl_abapgit_persist_factory=>get_repo( )->list( ).
+    LOOP AT lt_list ASSIGNING <ls_list>.
+      instantiate_and_add( <ls_list> ).
+    ENDLOOP.
+
+    mv_init = abap_true.
+    mv_only_favorites = abap_false.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_favorites.
+
+    DATA: lt_list           TYPE zif_abapgit_persistence=>ty_repos,
+          lt_user_favorites TYPE zif_abapgit_persist_user=>ty_favorites.
+
+    DATA li_repo TYPE REF TO zif_abapgit_repo.
+    DATA lv_repo_index TYPE i.
+    DATA lo_repo_db TYPE REF TO zif_abapgit_persist_repo.
+
+    FIELD-SYMBOLS: <ls_repo_record> LIKE LINE OF lt_list.
+
+    lo_repo_db        = zcl_abapgit_persist_factory=>get_repo( ).
+    lt_user_favorites = zcl_abapgit_persistence_user=>get_instance( )->get_favorites( ).
+    lt_list           = lo_repo_db->list_by_keys( lt_user_favorites ).
+
+    SORT lt_list BY package.
+
+    LOOP AT mt_list INTO li_repo.
+      lv_repo_index = sy-tabix.
+
+      READ TABLE lt_list TRANSPORTING NO FIELDS WITH KEY package = li_repo->get_package( ).
+      IF sy-subrc = 0.
+        DELETE lt_list INDEX sy-tabix.
+        CONTINUE. " Leave the repo be
+      ELSEIF lo_repo_db->exists( li_repo->get_key( ) ) = abap_false.
+        " Not a fav, and also does not exist, probably uninstalled
+        DELETE mt_list INDEX lv_repo_index.
+      ENDIF.
+
+    ENDLOOP.
+
+    " Create remaining (new) favs
+    LOOP AT lt_list ASSIGNING <ls_repo_record>.
+      instantiate_and_add( <ls_repo_record> ).
+    ENDLOOP.
+
+    mv_init = abap_true.
+    mv_only_favorites = abap_true.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD reinstantiate_repo.
+
+    DATA li_repo      TYPE REF TO zif_abapgit_repo.
+    DATA ls_full_meta TYPE zif_abapgit_persistence=>ty_repo.
+
+    li_repo = zif_abapgit_repo_srv~get( iv_key ).
+    DELETE TABLE mt_list FROM li_repo.
+    ASSERT sy-subrc IS INITIAL.
+
+    MOVE-CORRESPONDING is_meta TO ls_full_meta.
+    ls_full_meta-key = iv_key.
+
+    instantiate_and_add( ls_full_meta ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_sub_super_packages.
+
+    DATA:
+      ls_repo     LIKE LINE OF it_repos,
+      li_package  TYPE REF TO zif_abapgit_sap_package,
+      lt_packages TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+      li_repo     TYPE REF TO zif_abapgit_repo.
+
+    LOOP AT it_repos INTO ls_repo.
+      li_repo = zif_abapgit_repo_srv~get( ls_repo-key ).
+
+      li_package = zcl_abapgit_factory=>get_sap_package( ls_repo-package ).
+      IF li_package->exists( ) = abap_false.
+        " Skip dangling repository
+        CONTINUE.
+      ENDIF.
+
+      CLEAR lt_packages.
+      IF li_repo->get_local_settings( )-ignore_subpackages = abap_false.
+        APPEND LINES OF li_package->list_subpackages( ) TO lt_packages.
+        READ TABLE lt_packages TRANSPORTING NO FIELDS
+          WITH KEY table_line = iv_package.
+        IF sy-subrc = 0.
+          ei_repo = li_repo.
+          ev_reason = |Repository { li_repo->get_name( ) } already contains { iv_package } |.
+          RETURN.
+        ENDIF.
+      ENDIF.
+
+      IF iv_ign_subpkg = abap_false.
+        APPEND LINES OF li_package->list_superpackages( ) TO lt_packages.
+        READ TABLE lt_packages TRANSPORTING NO FIELDS
+          WITH KEY table_line = iv_package.
+        IF sy-subrc = 0.
+          ei_repo = li_repo.
+          ev_reason = |Repository { li_repo->get_name( ) } already contains subpackage of { iv_package } |.
+          RETURN.
+        ENDIF.
+      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_listener~on_meta_change.
+
+    DATA li_persistence TYPE REF TO zif_abapgit_persist_repo.
+
+    li_persistence = zcl_abapgit_persist_factory=>get_repo( ).
+    li_persistence->update_metadata(
+      iv_key         = iv_key
+      is_meta        = is_meta
+      is_change_mask = is_change_mask ).
+
+
+    " Recreate repo instance if type changed
+    " Instances in mt_list are of *_online and *_offline type
+    " If type is changed object should be recreated from the proper class
+    " TODO refactor, e.g. unify repo logic in one class
+    IF is_change_mask-offline = abap_true.
+      reinstantiate_repo(
+        iv_key  = iv_key
+        is_meta = is_meta ).
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~delete.
+
+    zcl_abapgit_persist_factory=>get_repo( )->delete( ii_repo->get_key( ) ).
+    zcl_abapgit_persist_factory=>get_repo_cs( )->delete( ii_repo->get_key( ) ).
+
+    " If favorite, remove it
+    IF zcl_abapgit_persistence_user=>get_instance( )->is_favorite_repo( ii_repo->get_key( ) ) = abap_true.
+      zcl_abapgit_persistence_user=>get_instance( )->toggle_favorite( ii_repo->get_key( ) ).
+    ENDIF.
+
+    DELETE TABLE mt_list FROM ii_repo.
+    ASSERT sy-subrc = 0.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~get.
+ 
+    FIELD-SYMBOLS: <li_repo> LIKE LINE OF mt_list.
+ 
+    IF mv_init = abap_false.
+      refresh_all( ).
+    ENDIF.
+ 
+    DO 2 TIMES.
+      " Repo might have been created in another session. Try again after refresh
+      IF sy-index = 2.
+        refresh_all( ).
+      ENDIF.
+      LOOP AT mt_list ASSIGNING <li_repo>.
+        IF <li_repo>->ms_data-key = iv_key.
+          ri_repo = <li_repo>.
+          RETURN.
+        ENDIF.
+      ENDLOOP.
+    ENDDO.
+ 
+    zcx_abapgit_exception=>raise( |Repository not found in database. Key: REPO, { iv_key }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~get_label_list.
+ 
+    DATA:
+      lt_repo           TYPE zif_abapgit_repo_srv=>ty_repo_list,
+      ls_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings,
+      lt_labels         TYPE string_table,
+      ls_label          LIKE LINE OF rt_labels.
+ 
+    FIELD-SYMBOLS:
+      <ls_repo>  TYPE REF TO zif_abapgit_repo,
+      <lv_label> TYPE LINE OF string_table.
+ 
+    lt_repo = zif_abapgit_repo_srv~list( ).
+ 
+    LOOP AT lt_repo ASSIGNING <ls_repo>.
+ 
+      ls_local_settings = <ls_repo>->get_local_settings( ).
+      lt_labels = zcl_abapgit_repo_labels=>split( ls_local_settings-labels ).
+ 
+      LOOP AT lt_labels ASSIGNING <lv_label>.
+        ls_label-label = <lv_label>.
+        INSERT ls_label INTO TABLE rt_labels.
+      ENDLOOP.
+ 
+    ENDLOOP.
+ 
+    SORT rt_labels.
+    DELETE ADJACENT DUPLICATES FROM rt_labels.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~get_repo_from_package.
+
+    DATA:
+      lt_repos TYPE zif_abapgit_persistence=>ty_repos,
+      lv_name  TYPE zif_abapgit_persistence=>ty_local_settings-display_name,
+      lv_owner TYPE zif_abapgit_persistence=>ty_local_settings-display_name.
+
+    FIELD-SYMBOLS:
+      <ls_repo> LIKE LINE OF lt_repos.
+
+    " check if package is already in use for a different repository
+    lt_repos = zcl_abapgit_persist_factory=>get_repo( )->list( ).
+    READ TABLE lt_repos WITH KEY package = iv_package ASSIGNING <ls_repo>.
+    IF sy-subrc = 0.
+      ei_repo = get_instance( )->get( <ls_repo>-key ).
+      lv_name = ei_repo->get_name( ).
+      lv_owner = <ls_repo>-created_by.
+      ev_reason = |Package { iv_package } already versioned as { lv_name } by { lv_owner }|.
+    ELSE.
+      " check if package is include as sub-package in a different repo
+      validate_sub_super_packages(
+        EXPORTING
+          iv_package    = iv_package
+          it_repos      = lt_repos
+          iv_ign_subpkg = iv_ign_subpkg
+        IMPORTING
+          ei_repo       = ei_repo
+          ev_reason     = ev_reason ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~get_repo_from_url.
+
+    DATA:
+      lt_repos                TYPE zif_abapgit_persistence=>ty_repos,
+      lv_current_repo_address TYPE string,
+      lv_check_repo_address   TYPE string,
+      lv_repo_path            TYPE string,
+      lv_name                 TYPE zif_abapgit_persistence=>ty_local_settings-display_name,
+      lv_owner                TYPE zif_abapgit_persistence=>ty_local_settings-display_name.
+
+    FIELD-SYMBOLS:
+      <ls_repo> LIKE LINE OF lt_repos.
+
+    CLEAR:
+      ei_repo, ev_reason.
+
+    lv_current_repo_address = zcl_abapgit_url=>url_address( iv_url ).
+
+    " check if url is already in use for a different package
+    lt_repos = zcl_abapgit_persist_factory=>get_repo( )->list( ).
+    LOOP AT lt_repos ASSIGNING <ls_repo> WHERE offline = abap_false.
+
+      lv_check_repo_address = zcl_abapgit_url=>url_address( <ls_repo>-url ).
+
+      IF lv_current_repo_address = lv_check_repo_address.
+        ei_repo      = get_instance( )->get( <ls_repo>-key ).
+        lv_repo_path = zcl_abapgit_url=>path_name( iv_url ).
+        lv_name      = ei_repo->get_name( ).
+        lv_owner     = <ls_repo>-created_by.
+        ev_reason    = |Repository { lv_repo_path } already versioned as { lv_name } by { lv_owner }|.
+        RETURN.
+      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~init.
+    CLEAR mv_init.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~is_repo_installed.
+ 
+    DATA: lt_repo        TYPE zif_abapgit_repo_srv=>ty_repo_list,
+          li_repo        TYPE REF TO zif_abapgit_repo,
+          lv_url         TYPE string,
+          lv_package     TYPE devclass,
+          lo_repo_online TYPE REF TO zcl_abapgit_repo_online,
+          lv_err         TYPE string.
+ 
+    lt_repo = zif_abapgit_repo_srv~list( ).
+ 
+    LOOP AT lt_repo INTO li_repo.
+      CHECK li_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= li_repo.
+ 
+      lv_url     = lo_repo_online->get_url( ).
+      lv_package = lo_repo_online->get_package( ).
+      CHECK to_upper( lv_url ) = to_upper( iv_url ).
+ 
+      " Validate bindings
+      "TODO refactor: move this message out of this method
+      IF iv_target_package IS NOT INITIAL AND iv_target_package <> lv_package.
+        lv_err = |Installation to package { lv_package } detected. |
+              && |Cancelling installation|.
+        zcx_abapgit_exception=>raise( lv_err ).
+      ENDIF.
+ 
+      rv_installed = abap_true.
+      EXIT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~list.
+ 
+    IF mv_init = abap_false OR mv_only_favorites = abap_true.
+      refresh_all( ).
+    ENDIF.
+ 
+    rt_list = mt_list.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~list_favorites.
+ 
+    DATA lt_user_favorites TYPE zif_abapgit_persist_user=>ty_favorites.
+    DATA li_repo TYPE REF TO zif_abapgit_repo.
+ 
+    lt_user_favorites = zcl_abapgit_persistence_user=>get_instance( )->get_favorites( ).
+    SORT lt_user_favorites BY table_line.
+ 
+    IF mv_init = abap_false OR mv_only_favorites = abap_false.
+      refresh_favorites( ).
+    ENDIF.
+ 
+    LOOP AT mt_list INTO li_repo.
+      READ TABLE lt_user_favorites
+        TRANSPORTING NO FIELDS
+        WITH KEY table_line = li_repo->get_key( ).
+      IF sy-subrc = 0.
+        APPEND li_repo TO rt_list.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~new_offline.
+ 
+    DATA: ls_repo        TYPE zif_abapgit_persistence=>ty_repo,
+          lv_key         TYPE zif_abapgit_persistence=>ty_repo-key,
+          lo_repo        TYPE REF TO zcl_abapgit_repo_offline,
+          lo_dot_abapgit TYPE REF TO zcl_abapgit_dot_abapgit.
+ 
+ 
+    IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-create_repo ) = abap_false.
+      zcx_abapgit_exception=>raise( 'Not authorized' ).
+    ENDIF.
+ 
+    zif_abapgit_repo_srv~validate_package(
+      iv_package    = iv_package
+      iv_ign_subpkg = iv_ign_subpkg ).
+ 
+    IF iv_url IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Missing display name for repo' ).
+    ENDIF.
+ 
+    lo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ).
+    lo_dot_abapgit->set_folder_logic( iv_folder_logic ).
+ 
+    lv_key = zcl_abapgit_persist_factory=>get_repo( )->add(
+      iv_url          = iv_url
+      iv_branch_name  = ''
+      iv_package      = iv_package
+      iv_offline      = abap_true
+      is_dot_abapgit  = lo_dot_abapgit->get_data( ) ).
+ 
+    TRY.
+        ls_repo = zcl_abapgit_persist_factory=>get_repo( )->read( lv_key ).
+      CATCH zcx_abapgit_not_found.
+        zcx_abapgit_exception=>raise( 'new_offline not found' ).
+    ENDTRY.
+ 
+    lo_repo ?= instantiate_and_add( ls_repo ).
+ 
+    IF ls_repo-local_settings-ignore_subpackages <> iv_ign_subpkg.
+      ls_repo-local_settings-ignore_subpackages = iv_ign_subpkg.
+    ENDIF.
+    ls_repo-local_settings-main_language_only = iv_main_lang_only.
+    ls_repo-local_settings-labels = iv_labels.
+ 
+    lo_repo->set_local_settings( ls_repo-local_settings ).
+    lo_repo->check_and_create_package( iv_package ).
+ 
+    ri_repo = lo_repo.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~new_online.
+ 
+    DATA: ls_repo        TYPE zif_abapgit_persistence=>ty_repo,
+          lo_repo        TYPE REF TO zcl_abapgit_repo_online,
+          lv_branch_name LIKE iv_branch_name,
+          lv_key         TYPE zif_abapgit_persistence=>ty_repo-key,
+          ls_dot_abapgit TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit,
+          lv_url         TYPE string.
+ 
+ 
+    ASSERT NOT iv_url IS INITIAL
+      AND NOT iv_package IS INITIAL.
+ 
+    lv_url = condense( iv_url ).
+ 
+    IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-create_repo ) = abap_false.
+      zcx_abapgit_exception=>raise( 'Not authorized' ).
+    ENDIF.
+ 
+    zif_abapgit_repo_srv~validate_package(
+      iv_package    = iv_package
+      iv_ign_subpkg = iv_ign_subpkg ).
+ 
+    zif_abapgit_repo_srv~validate_url( lv_url ).
+ 
+    lv_branch_name = determine_branch_name(
+      iv_name = iv_branch_name
+      iv_url  = lv_url ).
+ 
+    ls_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ).
+    ls_dot_abapgit-folder_logic = iv_folder_logic.
+ 
+    lv_key = zcl_abapgit_persist_factory=>get_repo( )->add(
+      iv_url          = lv_url
+      iv_branch_name  = lv_branch_name " local !
+      iv_display_name = iv_display_name
+      iv_package      = iv_package
+      iv_offline      = abap_false
+      is_dot_abapgit  = ls_dot_abapgit ).
+ 
+    TRY.
+        ls_repo = zcl_abapgit_persist_factory=>get_repo( )->read( lv_key ).
+      CATCH zcx_abapgit_not_found.
+        zcx_abapgit_exception=>raise( 'new_online not found' ).
+    ENDTRY.
+ 
+    lo_repo ?= instantiate_and_add( ls_repo ).
+ 
+    IF ls_repo-local_settings-ignore_subpackages <> iv_ign_subpkg.
+      ls_repo-local_settings-ignore_subpackages = iv_ign_subpkg.
+    ENDIF.
+    ls_repo-local_settings-main_language_only = iv_main_lang_only.
+    ls_repo-local_settings-labels = iv_labels.
+ 
+    lo_repo->set_local_settings( ls_repo-local_settings ).
+    lo_repo->refresh( ).
+    lo_repo->find_remote_dot_abapgit( ).
+    lo_repo->check_and_create_package( iv_package ).
+ 
+    ri_repo = lo_repo.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~purge.
+ 
+* uninstalls all objects, no UI or popups in this class
+ 
+* todo, this should be a method on the repo instead?
+ 
+    DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    DATA: lx_error TYPE REF TO zcx_abapgit_exception.
+    DATA lo_repo TYPE REF TO zcl_abapgit_repo.
+ 
+    lo_repo ?= ii_repo. " TODO, remove later
+    ri_log = lo_repo->create_new_log( 'Uninstall Log' ).
+ 
+    IF ii_repo->get_local_settings( )-write_protected = abap_true.
+      zcx_abapgit_exception=>raise( 'Cannot purge. Local code is write-protected by repo config' ).
+    ELSEIF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-uninstall ) = abap_false.
+      zcx_abapgit_exception=>raise( 'Not authorized' ).
+    ENDIF.
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read( ii_repo->get_package( ) ).
+ 
+    TRY.
+        zcl_abapgit_objects=>delete( it_tadir  = lt_tadir
+                                     is_checks = is_checks
+                                     ii_log    = ri_log ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        " If uninstall fails, repo needs a refresh to show which objects where deleted and which not
+        ii_repo->refresh( iv_drop_log = abap_false ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+    zif_abapgit_repo_srv~delete( ii_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~validate_package.
+
+    DATA: lv_as4user TYPE tdevc-as4user,
+          li_repo    TYPE REF TO zif_abapgit_repo,
+          lv_reason  TYPE string.
+
+    zcl_abapgit_factory=>get_sap_package( iv_package )->validate_name( ).
+
+    " Check if package owned by SAP is allowed (new packages are ok, since they are created automatically)
+    lv_as4user = zcl_abapgit_factory=>get_sap_package( iv_package )->read_responsible( ).
+
+    IF sy-subrc = 0 AND lv_as4user = 'SAP' AND
+      zcl_abapgit_factory=>get_environment( )->is_sap_object_allowed( ) = abap_false.
+      zcx_abapgit_exception=>raise( |Package { iv_package } not allowed, responsible user = 'SAP'| ).
+    ENDIF.
+
+    " Check if package is already used in another repo
+    IF iv_chk_exists = abap_true.
+      zif_abapgit_repo_srv~get_repo_from_package(
+        EXPORTING
+          iv_package    = iv_package
+          iv_ign_subpkg = iv_ign_subpkg
+        IMPORTING
+          ei_repo       = li_repo
+          ev_reason     = lv_reason ).
+
+      IF li_repo IS BOUND.
+        zcx_abapgit_exception=>raise( lv_reason ).
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_repo_srv~validate_url.
+
+    DATA:
+      li_repo   TYPE REF TO zif_abapgit_repo,
+      lv_reason TYPE string.
+
+    zcl_abapgit_url=>validate( iv_url ).
+
+    IF iv_chk_exists = abap_true.
+      zif_abapgit_repo_srv~get_repo_from_url(
+        EXPORTING
+          iv_url    = iv_url
+        IMPORTING
+          ei_repo   = li_repo
+          ev_reason = lv_reason ).
+      IF li_repo IS BOUND.
+        zcx_abapgit_exception=>raise( lv_reason ).
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/stage/index.html b/src/stage/index.html new file mode 100644 index 00000000000..9603f3276cd --- /dev/null +++ b/src/stage/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/stage + + + + + + + + + +
+
+

All files src/stage

+
+ +
+ 96.22% + Statements + 255/265 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 60% + Functions + 3/5 +
+ + +
+ 96.22% + Lines + 255/265 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_stage.clas.abap +
+
94.01%157/16775%3/460%3/594.01%157/167
zcl_abapgit_stage_logic.clas.abap +
+
100%98/98100%0/0100%0/0100%98/98
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/stage/zcl_abapgit_stage.clas.abap.html b/src/stage/zcl_abapgit_stage.clas.abap.html new file mode 100644 index 00000000000..668147b3025 --- /dev/null +++ b/src/stage/zcl_abapgit_stage.clas.abap.html @@ -0,0 +1,586 @@ + + + + + + Code coverage report for src/stage/zcl_abapgit_stage.clas.abap + + + + + + + + + +
+
+

All files / src/stage zcl_abapgit_stage.clas.abap

+
+ +
+ 94.01% + Statements + 157/167 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 60% + Functions + 3/5 +
+ + +
+ 94.01% + Lines + 157/167 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +1681x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +  +  +  +12x +12x +12x +12x +12x +12x +12x +12x +12x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +8x +8x +8x +8x +8x +1x + 
CLASS zcl_abapgit_stage DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS method_description
+      IMPORTING
+        !iv_method            TYPE zif_abapgit_definitions=>ty_method
+      RETURNING
+        VALUE(rv_description) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !iv_merge_source TYPE zif_abapgit_git_definitions=>ty_sha1 OPTIONAL .
+    METHODS add
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+        !iv_data     TYPE xstring
+        !is_status   TYPE zif_abapgit_definitions=>ty_result OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS reset
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+      RAISING
+        zcx_abapgit_exception .
+    METHODS rm
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+        !is_status   TYPE zif_abapgit_definitions=>ty_result OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS ignore
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_merge_source
+      RETURNING
+        VALUE(rv_source) TYPE zif_abapgit_git_definitions=>ty_sha1 .
+    METHODS count
+      RETURNING
+        VALUE(rv_count) TYPE i .
+    METHODS get_all
+      RETURNING
+        VALUE(rt_stage) TYPE zif_abapgit_definitions=>ty_stage_tt .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_stage TYPE zif_abapgit_definitions=>ty_stage_tt .
+    DATA mv_merge_source TYPE zif_abapgit_git_definitions=>ty_sha1 .
+ 
+    METHODS append
+      IMPORTING
+        !iv_path     TYPE zif_abapgit_git_definitions=>ty_file-path
+        !iv_filename TYPE zif_abapgit_git_definitions=>ty_file-filename
+        !iv_method   TYPE zif_abapgit_definitions=>ty_method
+        !is_status   TYPE zif_abapgit_definitions=>ty_result OPTIONAL
+        !iv_data     TYPE xstring OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_stage IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+ 
+    append( iv_path     = iv_path
+            iv_filename = iv_filename
+            iv_method   = zif_abapgit_definitions=>c_method-add
+            is_status   = is_status
+            iv_data     = iv_data ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD append.
+ 
+    DATA: ls_stage LIKE LINE OF mt_stage.
+ 
+    FIELD-SYMBOLS: <ls_stage> LIKE LINE OF mt_stage.
+ 
+ 
+    READ TABLE mt_stage WITH KEY
+      file-path     = iv_path
+      file-filename = iv_filename
+      ASSIGNING <ls_stage>.
+    IF sy-subrc = 0.
+      <ls_stage>-file-data = iv_data.
+      <ls_stage>-method    = iv_method.
+    ELSE.
+      ls_stage-file-path     = iv_path.
+      ls_stage-file-filename = iv_filename.
+      ls_stage-file-data     = iv_data.
+      ls_stage-method        = iv_method.
+      ls_stage-status        = is_status.
+      INSERT ls_stage INTO TABLE mt_stage.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_merge_source = iv_merge_source.
+  ENDMETHOD.
+ 
+ 
+  METHOD count.
+    rv_count = lines( mt_stage ).
+  ENDMETHOD.
+ 
+ 
+  METHOD get_all.
+    rt_stage = mt_stage.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_merge_source.
+    rv_source = mv_merge_source.
+  ENDMETHOD.
+ 
+ 
+  METHOD ignore.
+    append( iv_path     = iv_path
+            iv_filename = iv_filename
+            iv_method   = zif_abapgit_definitions=>c_method-ignore ).
+  ENDMETHOD.
+ 
+ 
+  METHOD method_description.
+ 
+    CASE iv_method.
+      WHEN zif_abapgit_definitions=>c_method-add.
+        rv_description = 'add'.
+      WHEN zif_abapgit_definitions=>c_method-rm.
+        rv_description = 'remove'.
+      WHEN zif_abapgit_definitions=>c_method-ignore.
+        rv_description = 'ignore'.
+      WHEN OTHERS.
+        zcx_abapgit_exception=>raise( 'unknown staging method type' ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD reset.
+    DELETE mt_stage WHERE file-path = iv_path AND file-filename = iv_filename.
+    ASSERT sy-subrc = 0.
+  ENDMETHOD.
+ 
+ 
+  METHOD rm.
+    append( iv_path     = iv_path
+            iv_filename = iv_filename
+            is_status   = is_status
+            iv_method   = zif_abapgit_definitions=>c_method-rm ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/stage/zcl_abapgit_stage_logic.clas.abap.html b/src/stage/zcl_abapgit_stage_logic.clas.abap.html new file mode 100644 index 00000000000..58abccf8652 --- /dev/null +++ b/src/stage/zcl_abapgit_stage_logic.clas.abap.html @@ -0,0 +1,379 @@ + + + + + + Code coverage report for src/stage/zcl_abapgit_stage_logic.clas.abap + + + + + + + + + +
+
+

All files / src/stage zcl_abapgit_stage_logic.clas.abap

+
+ +
+ 100% + Statements + 98/98 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 98/98 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +991x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_stage_logic DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_stage_logic .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CLASS-METHODS:
+      remove_ignored
+        IMPORTING io_repo  TYPE REF TO zcl_abapgit_repo_online
+        CHANGING  cs_files TYPE zif_abapgit_definitions=>ty_stage_files,
+      remove_identical
+        CHANGING cs_files TYPE zif_abapgit_definitions=>ty_stage_files.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_stage_logic IMPLEMENTATION.
+ 
+ 
+  METHOD remove_identical.
+ 
+    DATA: lv_index  TYPE i,
+          ls_remote LIKE LINE OF cs_files-remote.
+ 
+    FIELD-SYMBOLS: <ls_local> LIKE LINE OF cs_files-local.
+ 
+    SORT cs_files-remote BY path filename.
+ 
+    LOOP AT cs_files-local ASSIGNING <ls_local>.
+      lv_index = sy-tabix.
+ 
+      READ TABLE cs_files-remote INTO ls_remote
+        WITH KEY path = <ls_local>-file-path filename = <ls_local>-file-filename
+        BINARY SEARCH.
+      IF sy-subrc = 0.
+        DELETE cs_files-remote INDEX sy-tabix.
+        IF ls_remote-sha1 = <ls_local>-file-sha1.
+          DELETE cs_files-local INDEX lv_index.
+        ENDIF.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_ignored.
+ 
+    DATA: lv_index TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF cs_files-remote,
+                   <ls_local>  LIKE LINE OF cs_files-local.
+ 
+ 
+    LOOP AT cs_files-remote ASSIGNING <ls_remote>.
+      lv_index = sy-tabix.
+ 
+      IF io_repo->get_dot_abapgit( )->is_ignored(
+          iv_path     = <ls_remote>-path
+          iv_filename = <ls_remote>-filename ) = abap_true.
+        DELETE cs_files-remote INDEX lv_index.
+      ELSEIF <ls_remote>-path = zif_abapgit_definitions=>c_root_dir
+          AND <ls_remote>-filename = zif_abapgit_definitions=>c_dot_abapgit.
+        " Remove .abapgit from remotes - it cannot be removed or ignored
+        DELETE cs_files-remote INDEX lv_index.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    LOOP AT cs_files-local ASSIGNING <ls_local>.
+      lv_index = sy-tabix.
+ 
+      IF io_repo->get_dot_abapgit( )->is_ignored(
+          iv_path     = <ls_local>-file-path
+          iv_filename = <ls_local>-file-filename ) = abap_true.
+        DELETE cs_files-local INDEX lv_index.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_stage_logic~get.
+ 
+    rs_files-local  = io_repo->get_files_local( ii_obj_filter = ii_obj_filter ).
+    rs_files-remote = io_repo->get_files_remote( ii_obj_filter ).
+    rs_files-status = io_repo->status( ).
+    remove_identical( CHANGING cs_files = rs_files ).
+    remove_ignored( EXPORTING io_repo  = io_repo
+                    CHANGING  cs_files = rs_files ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/index.html b/src/syntax/index.html new file mode 100644 index 00000000000..64f043e8e14 --- /dev/null +++ b/src/syntax/index.html @@ -0,0 +1,266 @@ + + + + + + Code coverage report for src/syntax + + + + + + + + + +
+
+

All files src/syntax

+
+ +
+ 93.03% + Statements + 3287/3533 +
+ + +
+ 92.78% + Branches + 90/97 +
+ + +
+ 89.09% + Functions + 49/55 +
+ + +
+ 93.03% + Lines + 3287/3533 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_syntax_abap.clas.abap +
+
100%306/306100%13/1350%1/2100%306/306
zcl_abapgit_syntax_abap.clas.testclasses.abap +
+
99.54%882/88694.73%18/19100%18/1899.54%882/886
zcl_abapgit_syntax_css.clas.abap +
+
81.02%397/490100%0/00%0/181.02%397/490
zcl_abapgit_syntax_factory.clas.abap +
+
100%46/46100%0/0100%0/0100%46/46
zcl_abapgit_syntax_highlighter.clas.abap +
+
91.9%284/30992.85%13/1450%2/491.9%284/309
zcl_abapgit_syntax_js.clas.abap +
+
68.21%206/302100%0/00%0/168.21%206/302
zcl_abapgit_syntax_json.clas.abap +
+
97.69%127/13085.71%6/7100%1/197.69%127/130
zcl_abapgit_syntax_json.clas.testclasses.abap +
+
100%45/45100%4/4100%4/4100%45/45
zcl_abapgit_syntax_txt.clas.abap +
+
100%37/37100%0/0100%0/0100%37/37
zcl_abapgit_syntax_xml.clas.abap +
+
88.46%161/18282.35%14/1750%1/288.46%161/182
zcl_abapgit_syntax_xml.clas.testclasses.abap +
+
99.5%796/80095.65%22/23100%22/2299.5%796/800
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_abap.clas.abap.html b/src/syntax/zcl_abapgit_syntax_abap.clas.abap.html new file mode 100644 index 00000000000..e1ec1990371 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_abap.clas.abap.html @@ -0,0 +1,1003 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_abap.clas.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_abap.clas.abap

+
+ +
+ 100% + Statements + 306/306 +
+ + +
+ 100% + Branches + 13/13 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 100% + Lines + 306/306 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +3071x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +1x +1x +1x +11x +11x +11x +11x +11x +14x +11x +2x +2x +2x +2x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +12x +5x +5x +12x +1x +1x +1x +7x +3x +3x +3x +3x +3x +3x +3x +12x +12x +12x +11x +11x +11x +11x +11x +11x +11x +11x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +19x +19x +1x +1x +1x +1x + 
CLASS zcl_abapgit_syntax_abap DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS class_constructor.
+    METHODS constructor.
+ 
+    CONSTANTS:
+      BEGIN OF c_css,
+        keyword TYPE string VALUE 'keyword',
+        text    TYPE string VALUE 'text',
+        comment TYPE string VALUE 'comment',
+      END OF c_css,
+ 
+      BEGIN OF c_token,
+        keyword TYPE c VALUE 'K',
+        text    TYPE c VALUE 'T',
+        comment TYPE c VALUE 'C',
+      END OF c_token,
+ 
+      BEGIN OF c_regex,
+        comment TYPE string VALUE '##|"|^\*',
+        text    TYPE string VALUE '`|''|\||\{|\}',
+        keyword TYPE string VALUE '&&|\b[-_a-z0-9]+\b',
+      END OF c_regex.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-DATA gt_keywords TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
+ 
+    CLASS-METHODS init_keywords.
+    CLASS-METHODS is_keyword
+      IMPORTING iv_chunk      TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    METHODS order_matches REDEFINITION.
+    METHODS parse_line REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_SYNTAX_ABAP IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+ 
+    init_keywords( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Initialize instances of regular expression
+    add_rule( iv_regex = c_regex-keyword
+              iv_token = c_token-keyword
+              iv_style = c_css-keyword ).
+ 
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+    add_rule( iv_regex = c_regex-text
+              iv_token = c_token-text
+              iv_style = c_css-text ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init_keywords.
+ 
+    DATA: lv_keywords TYPE string,
+          lt_keywords TYPE STANDARD TABLE OF string.
+ 
+    lv_keywords =
+     '&&|?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING' &&
+      '|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS' &&
+      '|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE' &&
+      '|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT' &&
+      '|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY' &&
+      '|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN' &&
+      '|BETWEEN|BIG|BINARY|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK' &&
+      '|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT' &&
+      '|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS' &&
+      '|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED' &&
+      '|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHARACTER|CHARLEN' &&
+      '|CHAR-TO-HEX|CHECK|CHECKBOX|CI_|CIRCULAR|CLASS|CLASS-CODING|CLASS-DATA' &&
+      '|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE' &&
+      '|CN|CO|COALESCE|CODE|CODING|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY' &&
+      '|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COLLECT|COLOR|COLUMN|COLUMNS' &&
+      '|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS' &&
+      '|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT' &&
+      '|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION' &&
+      '|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE' &&
+      '|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION' &&
+      '|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE' &&
+      '|DAYLIGHT|DBMAXLEN|DD/MM/YY|DD/MM/YYYY|DDMMYY|DEALLOCATE|DECIMAL_SHIFT|DECIMALS' &&
+      '|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING' &&
+      '|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY' &&
+      '|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING' &&
+      '|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO' &&
+      '|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|ENDAT|ENDCASE' &&
+      '|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|END-ENHANCEMENT-SECTION' &&
+      '|ENDEXEC|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE' &&
+      '|END-LINES|ENDLOOP|ENDMETHOD|ENDMODULE|END-OF-DEFINITION|END-OF-FILE' &&
+      '|END-OF-PAGE|END-OF-SELECTION|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE' &&
+      '|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENTS|ENHANCEMENT-SECTION' &&
+      '|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING' &&
+      '|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTIONS|EXCEPTION-TABLE|EXCLUDE|EXCLUDING' &&
+      '|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT' &&
+      '|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD' &&
+      '|FIELD-GROUPS|FIELDS|FIELD-SYMBOL|FIELD-SYMBOLS|FILE|FILTER|FILTERS|FILTER-TABLE' &&
+      '|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM' &&
+      '|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTIONALITY' &&
+      '|FUNCTION-POOL|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT' &&
+      '|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEADER|HEADERS' &&
+      '|HEADING|HEAD-LINES|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID' &&
+      '|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION' &&
+      '|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE' &&
+      '|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL' &&
+      '|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE' &&
+      '|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS' &&
+      '|ISO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND' &&
+      '|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS' &&
+      '|LEFTSPACE|LEGACY|LENGTH|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINEFEED' &&
+      '|LINES|LINE-SELECTION|LINE-SIZE|LIST|LISTBOX|LIST-PROCESSING|LITTLE|LLANG' &&
+      '|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG10|LOGFILE|LOGICAL' &&
+      '|LOG-POINT|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN' &&
+      '|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE' &&
+      '|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM/DD/YY' &&
+      '|MM/DD/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING' &&
+      '|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING' &&
+      '|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NODE|NODES|NO-DISPLAY' &&
+      '|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NON-UNICODE|NON-UNIQUE' &&
+      '|NO-SCROLLING|NO-SIGN|NOT|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NP|NS|NULL|NUMBER' &&
+      '|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF' &&
+      '|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT' &&
+      '|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE' &&
+      '|PAGES|PARAMETER|PARAMETERS|PARAMETER-TABLE|PART|PARTIALLY|PATTERN|PERCENTAGE' &&
+      '|PERFORM|PERFORMING|PERSON|PF1|PF2|PF3|PF4|PF5|PF6|PF7|PF8|PF9|PF10|PF11|PF12' &&
+      '|PF13|PF14|PF15|PF-STATUS|PINK|PLACES|POOL|POS_HIGH|POS_LOW' &&
+      '|POSITION|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL' &&
+      '|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC' &&
+      '|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES' &&
+      '|RAW|READ|READER|READ-ONLY|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION' &&
+      '|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE' &&
+      '|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION' &&
+      '|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE' &&
+      '|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE' &&
+      '|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RUN|SAP' &&
+      '|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC' &&
+      '|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH' &&
+      '|SECONDARY|SECONDS|SECTION|SELECT|SELECTION|SELECTIONS|SELECTION-SCREEN|SELECTION-SET' &&
+      '|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS|SEND|SEPARATE|SEPARATED|SET' &&
+      '|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE' &&
+      '|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL' &&
+      '|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|STARTING|START-OF-SELECTION|STATE' &&
+      '|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE' &&
+      '|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT' &&
+      '|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH' &&
+      '|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE' &&
+      '|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP' &&
+      '|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP' &&
+      '|TIMEZONE|TITLE|TITLEBAR|TITLE-LINES|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE' &&
+      '|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE' &&
+      '|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES' &&
+      '|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL' &&
+      '|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES' &&
+      '|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER' &&
+      '|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK' &&
+      '|WRITE|WRITER|X|XML|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE' &&
+      '|BINTOHEX|CHAR|CLNT|CONCAT_WITH_SPACE|CURR|DATS|DATS_ADD_DAYS|DATS_ADD_MONTHS' &&
+      '|DATS_DAYS_BETWEEN|DATS_IS_VALID|DEC|END-OF-EDITING|END-TEST-INJECTION|END-TEST-SEAM' &&
+      '|ENDWITH|ENUM|HEXTOBIN|INSTANCE|INSTR|LANG|LTRIM|NUMC|PUSH' &&
+      '|QUAN|RETURNS|RPAD|RTRIM|SSTRING|START-OF-EDITING|TEST-INJECTION|TEST-SEAM|TIMS' &&
+      '|TIMS_IS_VALID|TSTMP_ADD_SECONDS|TSTMP_CURRENT_UTCTIMESTAMP|TSTMP_IS_VALID' &&
+      '|TSTMP_SECONDS_BETWEEN|B|D|DECFLOAT16|DECFLOAT34|F|INT8|N|P|S|STRING|T|UTCLONG|XSTRING' &&
+      '|ABAP_BOOL|ACCP|CUKY|DF16_DEC|DF16_RAW|DF34_DEC|DF34_RAW|FLTP' &&
+      '|INT1|INT2|INT4|LCHR|LRAW|RAWSTRING|DF16_SCL|DF34_SCL' &&
+      '|PREC|VARC|CLIKE|CSEQUENCE|DECFLOAT|NUMERIC|XSEQUENCE|ME|SYST|SY' &&
+      '|BIT-SET|BOOLC|BOOLX|CHAR_OFF|CMAX|CMIN|CONCAT_LINES_OF|CONTAINS|CONTAINS_ANY_NOT_OF' &&
+      '|CONTAINS_ANY_OF|COUNT_ANY_NOT_OF|COUNT_ANY_OF|FIND_ANY_NOT_OF|FIND_ANY_OF|FIND_END' &&
+      '|FROM_MIXED|IPOW|LINE_EXISTS|LINE_INDEX|MATCHES|NMAX|NMIN|REPEAT|RESCALE|REVERSE' &&
+      '|SEGMENT|SHIFT_LEFT|SHIFT_RIGHT|SUBSTRING_AFTER|SUBSTRING_BEFORE|SUBSTRING_FROM|SUBSTRING_TO' &&
+      '|TO_LOWER|TO_MIXED|TO_UPPER|UTCLONG_ADD|UTCLONG_CURRENT|UTCLONG_DIFF|XSDBOOL'.
+ 
+ 
+    SPLIT lv_keywords AT '|' INTO TABLE lt_keywords.
+    " remove duplicates to avoid dumps when converting to a hash table
+    SORT lt_keywords BY table_line ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM lt_keywords.
+    gt_keywords = lt_keywords. " Hash table
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_keyword.
+ 
+    DATA lv_str TYPE string.
+ 
+    lv_str = to_upper( iv_chunk ).
+    READ TABLE gt_keywords WITH KEY table_line = lv_str TRANSPORTING NO FIELDS.
+    rv_yes = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+ 
+    DATA:
+      lv_index      TYPE sy-tabix,
+      lv_line_len   TYPE i,
+      lv_prev_token TYPE c.
+ 
+    FIELD-SYMBOLS:
+      <ls_prev>  TYPE ty_match,
+      <ls_match> TYPE ty_match.
+ 
+    SORT ct_matches BY offset.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      lv_index = sy-tabix.
+ 
+      " Delete matches after open text match
+      IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
+        DELETE ct_matches INDEX lv_index.
+        CONTINUE.
+      ENDIF.
+ 
+      CASE <ls_match>-token.
+        WHEN c_token-keyword.
+          IF <ls_match>-offset > 0
+              AND substring( val = iv_line
+                             off = ( <ls_match>-offset - 1 )
+                             len = 1 ) CA '-<'.
+            " Delete match if keyword is part of structure or field symbol
+            DELETE ct_matches INDEX lv_index.
+            CONTINUE.
+          ENDIF.
+ 
+        WHEN c_token-comment.
+          <ls_match>-length = lv_line_len - <ls_match>-offset.
+          DELETE ct_matches FROM lv_index + 1.
+          CONTINUE.
+ 
+        WHEN c_token-text.
+          <ls_match>-text_tag = substring( val = iv_line
+                                        off = <ls_match>-offset
+                                        len = <ls_match>-length ).
+          IF lv_prev_token = c_token-text.
+            IF <ls_match>-text_tag = <ls_prev>-text_tag.
+              <ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
+              CLEAR lv_prev_token.
+            ELSEIF <ls_prev>-text_tag = '}' AND <ls_match>-text_tag = '{'.
+              <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset - 1.  " Shift } out of scope
+              <ls_prev>-offset = <ls_prev>-offset + 1.                   " Shift { out of scope
+              CLEAR lv_prev_token.
+            ELSEIF <ls_match>-text_tag = '{'.
+              <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset.
+              CLEAR lv_prev_token.
+            ELSEIF <ls_prev>-text_tag = '}'.
+              <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset.
+              <ls_prev>-offset = <ls_prev>-offset + 1.                   " Shift } out of scope
+              CLEAR lv_prev_token.
+            ENDIF.
+            DELETE ct_matches INDEX lv_index.
+            CONTINUE.
+          ENDIF.
+ 
+      ENDCASE.
+ 
+      lv_prev_token = <ls_match>-token.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line. "REDEFINITION
+ 
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
+ 
+    rt_matches = super->parse_line( iv_line ).
+ 
+    " Remove non-keywords
+    LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
+      lv_index = sy-tabix.
+      IF abap_false = is_keyword( substring( val = iv_line
+                                             off = <ls_match>-offset
+                                             len = <ls_match>-length ) ).
+        DELETE rt_matches INDEX lv_index.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_abap.clas.testclasses.abap.html b/src/syntax/zcl_abapgit_syntax_abap.clas.testclasses.abap.html new file mode 100644 index 00000000000..1d994ec53b3 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_abap.clas.testclasses.abap.html @@ -0,0 +1,2743 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_abap.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_abap.clas.testclasses.abap

+
+ +
+ 99.54% + Statements + 882/886 +
+ + +
+ 94.73% + Branches + 18/19 +
+ + +
+ 100% + Functions + 18/18 +
+ + +
+ 99.54% + Lines + 882/886 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +8871x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +  +  +  +  +8x +8x +8x +8x +1x +1x +48x +48x +48x +48x +48x +48x +48x +1x +1x +28x +28x +28x +28x +28x +28x +28x +28x +1x +1x +56x +56x +56x +56x +56x +56x +56x +56x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_abapgit_syntax_abap DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+     mo_cut TYPE REF TO zcl_abapgit_syntax_abap.
+ 
+    METHODS:
+      setup,
+      report_header FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_abapgit_syntax_abap IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mo_cut.
+ 
+  ENDMETHOD.
+ 
+  METHOD report_header.
+ 
+    DATA lv_act TYPE string.
+ 
+    lv_act = mo_cut->process_line( |REPORT zfoo.| ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="keyword">REPORT</span> zfoo.|
+      act = lv_act ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_syntax_basic_logic DEFINITION DEFERRED.
+CLASS zcl_abapgit_syntax_abap DEFINITION LOCAL FRIENDS ltcl_syntax_basic_logic.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_syntax_basic_logic DEFINITION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS ltcl_syntax_basic_logic DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS
+    DURATION SHORT.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mo_syntax_highlighter TYPE REF TO zcl_abapgit_syntax_abap.
+ 
+    METHODS:
+      setup,
+      process_line  FOR TESTING,
+      format_line   FOR TESTING,
+      apply_style   FOR TESTING.
+ 
+ENDCLASS.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_syntax_highlighter IMPLEMENTATION
+*----------------------------------------------------------------------*
+CLASS ltcl_syntax_basic_logic IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_syntax_highlighter.
+  ENDMETHOD.
+ 
+  METHOD format_line.
+ 
+    DATA:
+      lv_line     TYPE string,
+      lv_line_act TYPE string,
+      lv_line_exp TYPE string.
+ 
+    lv_line = 'call function ''FM_NAME''. " Commented'.
+ 
+    lv_line_exp =
+      '<span class="keyword">call</span>' &&
+      ' <span class="keyword">function</span>' &&
+      | <span class="text">'FM_NAME'</span>.| &&
+      ' <span class="comment">" Commented</span>'.
+ 
+    lv_line_act = mo_syntax_highlighter->process_line( lv_line ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = lv_line_exp
+                                        act = lv_line_act
+                                        msg = |Error during formating: { lv_line }| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD apply_style.
+ 
+    DATA lv_line_act TYPE string.
+ 
+    " Call the method and compare results
+    lv_line_act = mo_syntax_highlighter->apply_style(
+      iv_line  = 'CALL FUNCTION'
+      iv_class = zcl_abapgit_syntax_abap=>c_css-keyword ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_line_act
+      exp = '<span class="keyword">CALL FUNCTION</span>'
+      msg = 'Failure during applying of style.' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD process_line.
+ 
+    DATA lv_line_act TYPE string.
+ 
+    " Call the method with empty parameter and compare results
+    lv_line_act = mo_syntax_highlighter->process_line( '' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_line_act
+      exp = ''
+      msg = 'Failure in method process_line.' ).
+ 
+    " Call the method with non-empty line and compare results
+    lv_line_act = mo_syntax_highlighter->process_line( '* CALL FUNCTION' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_line_act
+      exp = '<span class="comment">* CALL FUNCTION</span>'
+      msg = 'Failure in method process_line.' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_syntax_cases DEFINITION DEFERRED.
+CLASS zcl_abapgit_syntax_abap DEFINITION LOCAL FRIENDS ltcl_syntax_cases.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_syntax_cases definition
+*----------------------------------------------------------------------*
+CLASS ltcl_syntax_cases DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS
+    DURATION SHORT.
+ 
+  PRIVATE SECTION.
+ 
+    DATA:
+      mt_after_parse  TYPE zcl_abapgit_syntax_abap=>ty_match_tt,
+      mt_after_order  TYPE zcl_abapgit_syntax_abap=>ty_match_tt,
+      mt_after_extend TYPE zcl_abapgit_syntax_abap=>ty_match_tt.
+ 
+    METHODS:
+      do_test IMPORTING iv_line TYPE string,
+      generate_parse IMPORTING iv_token  TYPE c
+                               iv_offset TYPE i
+                               iv_length TYPE i,
+      generate_order IMPORTING iv_token    TYPE c
+                               iv_offset   TYPE i
+                               iv_length   TYPE i
+                               iv_text_tag TYPE string,
+      generate_extend IMPORTING iv_token    TYPE c
+                                iv_offset   TYPE i
+                                iv_length   TYPE i
+                                iv_text_tag TYPE string,
+      test_abap_01 FOR TESTING,
+      test_abap_02 FOR TESTING,
+      test_abap_03 FOR TESTING,
+      test_abap_04 FOR TESTING,
+      test_abap_05 FOR TESTING,
+      test_abap_06 FOR TESTING,
+      test_abap_07 FOR TESTING,
+      test_abap_08 FOR TESTING.
+ 
+ENDCLASS.
+*----------------------------------------------------------------------*
+*       CLASS ltcl_syntax_cases IMPLEMENTATION
+*----------------------------------------------------------------------*
+CLASS ltcl_syntax_cases IMPLEMENTATION.
+ 
+  METHOD do_test.
+ 
+    DATA: lt_matches_act TYPE zcl_abapgit_syntax_abap=>ty_match_tt,
+          ls_match       LIKE LINE OF lt_matches_act,
+          lv_offs        TYPE i,
+          lo_syntax      TYPE REF TO zcl_abapgit_syntax_abap.
+ 
+ 
+    CREATE OBJECT lo_syntax.
+    lt_matches_act = lo_syntax->parse_line( iv_line ).
+ 
+    SORT lt_matches_act BY offset.
+ 
+    cl_abap_unit_assert=>assert_equals( exp = mt_after_parse
+                                        act = lt_matches_act
+                                        msg = |Error during parsing: { iv_line }| ).
+ 
+    lo_syntax->order_matches( EXPORTING iv_line    = iv_line
+                       CHANGING  ct_matches = lt_matches_act ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = mt_after_order
+                                        act = lt_matches_act
+                                        msg = |Error during ordering: { iv_line }| ).
+ 
+    lo_syntax->extend_matches(
+      EXPORTING
+        iv_line    = iv_line
+      CHANGING
+        ct_matches = lt_matches_act ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = mt_after_extend
+                                        act = lt_matches_act
+                                        msg = |Error during extending: { iv_line }| ).
+ 
+    " Check consistency
+    lv_offs = 0.
+    LOOP AT lt_matches_act INTO ls_match.
+      IF ls_match-offset <> lv_offs.
+        cl_abap_unit_assert=>assert_equals( exp = lv_offs
+                                            act = ls_match-offset
+                                            msg = | Error during consistency check: { sy-tabix }| ).
+      ENDIF.
+      lv_offs = lv_offs + ls_match-length.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD generate_parse.
+    DATA ls_match TYPE zcl_abapgit_syntax_abap=>ty_match.
+ 
+    ls_match-token    = iv_token.
+    ls_match-offset   = iv_offset.
+    ls_match-length   = iv_length.
+    APPEND ls_match TO mt_after_parse.
+  ENDMETHOD.
+ 
+  METHOD generate_order.
+    DATA ls_match TYPE zcl_abapgit_syntax_abap=>ty_match.
+ 
+    ls_match-token    = iv_token.
+    ls_match-offset   = iv_offset.
+    ls_match-length   = iv_length.
+    ls_match-text_tag = iv_text_tag.
+    APPEND ls_match TO mt_after_order.
+  ENDMETHOD.
+ 
+  METHOD generate_extend.
+    DATA ls_match TYPE zcl_abapgit_syntax_abap=>ty_match.
+ 
+    ls_match-token    = iv_token.
+    ls_match-offset   = iv_offset.
+    ls_match-length   = iv_length.
+    ls_match-text_tag = iv_text_tag.
+    APPEND ls_match TO mt_after_extend.
+  ENDMETHOD.
+ 
+******************************************************
+* Test parsing and ordering of comments              *
+******************************************************
+  METHOD test_abap_01.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = '* commented out line with key word data'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'C'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 12
+                    iv_length = 3 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 16
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 21
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 26
+                    iv_length = 3 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 30
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 35
+                    iv_length = 4 ).
+ 
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'C'
+                    iv_offset   = 0
+                    iv_length   = 39
+                    iv_text_tag = '' ).
+ 
+    " Generate table with expected values after ordering
+    generate_extend( iv_token    = 'C'
+                     iv_offset   = 0
+                     iv_length   = 39
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+******************************************************
+* Test parsing and ordering of remainder of string   *
+******************************************************
+  METHOD test_abap_02.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = 'data: lv_var_name type string.'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 0
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 18
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 23
+                    iv_length = 6 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 0
+                    iv_length   = 4
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 18
+                    iv_length   = 4
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 23
+                    iv_length   = 6
+                    iv_text_tag = '' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 0
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 4
+                     iv_length   = 14
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 18
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 22
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 23
+                     iv_length   = 6
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 29
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+******************************************************
+* Test parsing and ordering of key words & texts     *
+******************************************************
+  METHOD test_abap_03.
+ 
+    DATA lv_line TYPE string.
+ 
+ 
+    lv_line = 'call function ''FM_NAME''. " Commented'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 0
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 5
+                    iv_length = 8 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 14
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 22
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'C'
+                    iv_offset = 25
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 0
+                    iv_length   = 4
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 5
+                    iv_length   = 8
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 14
+                    iv_length   = 9
+                    iv_text_tag = '''' ).
+    generate_order( iv_token    = 'C'
+                    iv_offset   = 25
+                    iv_length   = 11
+                    iv_text_tag = '' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 0
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 4
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 5
+                     iv_length   = 8
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 13
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 14
+                     iv_length   = 9
+                     iv_text_tag = '''' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 23
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'C'
+                     iv_offset   = 25
+                     iv_length   = 11
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+******************************************************
+* Test parsing and ordering of key words in texts    *
+******************************************************
+  METHOD test_abap_04.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = 'constants: lc_var type string value ''simpletext data simpletext''.'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 0
+                    iv_length = 9 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 18
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 23
+                    iv_length = 6 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 30
+                    iv_length = 5 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 36
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 48
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 63
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 0
+                    iv_length   = 9
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 18
+                    iv_length   = 4
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 23
+                    iv_length   = 6
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 30
+                    iv_length   = 5
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 36
+                    iv_length   = 28
+                    iv_text_tag = '''' ).
+ 
+    " Generate table with expected values after ordering
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 0
+                     iv_length   = 9
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 9
+                     iv_length   = 9
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 18
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 22
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 23
+                     iv_length   = 6
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 29
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 30
+                     iv_length   = 5
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 35
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 36
+                     iv_length   = 28
+                     iv_text_tag = '''' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 64
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+******************************************************
+* Test parsing and ordering texts in curly brackets  *
+******************************************************
+  METHOD test_abap_05.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = 'a = |{ b }={ c }|.'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 4
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 5
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 7
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 9
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 11
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 13
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 15
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 16
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 4
+                    iv_length   = 1
+                    iv_text_tag = '|' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 7
+                    iv_length   = 1
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 10
+                    iv_length   = 1
+                    iv_text_tag = '}' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 13
+                    iv_length   = 1
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 16
+                    iv_length   = 1
+                    iv_text_tag = '}' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 0
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 4
+                     iv_length   = 1
+                     iv_text_tag = '|' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 5
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 7
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 8
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 10
+                     iv_length   = 1
+                     iv_text_tag = '}' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 11
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 13
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 14
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 16
+                     iv_length   = 1
+                     iv_text_tag = '}' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 17
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+******************************************************
+* Test parsing and ordering of texts                 *
+******************************************************
+  METHOD test_abap_06.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = 'lv_line = lc_constant && |XYZ { ''ab'' && |ac{ ''UU'' }| }|'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 22
+                    iv_length = 2 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 25
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 30
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 32
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 35
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 37
+                    iv_length = 2 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 40
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 43
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 45
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 48
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 50
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 51
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 53
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'T'
+                    iv_offset = 54
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 22
+                    iv_length   = 2
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 25
+                    iv_length   = 5
+                    iv_text_tag = '|' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 32
+                    iv_length   = 4
+                    iv_text_tag = '''' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 37
+                    iv_length   = 2
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 40
+                    iv_length   = 3
+                    iv_text_tag = '|' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 45
+                    iv_length   = 4
+                    iv_text_tag = '''' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 51
+                    iv_length   = 1
+                    iv_text_tag = '}' ).
+    generate_order( iv_token    = 'T'
+                    iv_offset   = 54
+                    iv_length   = 1
+                    iv_text_tag = '}' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 0
+                     iv_length   = 22
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 22
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 24
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 25
+                     iv_length   = 5
+                     iv_text_tag = '|' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 30
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 32
+                     iv_length   = 4
+                     iv_text_tag = '''' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 36
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 37
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 39
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 40
+                     iv_length   = 3
+                     iv_text_tag = '|' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 43
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 45
+                     iv_length   = 4
+                     iv_text_tag = '''' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 49
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 51
+                     iv_length   = 1
+                     iv_text_tag = '}' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 52
+                     iv_length   = 2
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'T'
+                     iv_offset   = 54
+                     iv_length   = 1
+                     iv_text_tag = '}' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+********************************************************
+* Check that '*' in select statement is not a match    *
+********************************************************
+  METHOD test_abap_07.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = 'SELECT * FROM foo'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 0
+                    iv_length = 6 ).
+ 
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 9
+                    iv_length = 4 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 0
+                    iv_length   = 6
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'K'
+                    iv_offset   = 9
+                    iv_length   = 4
+                    iv_text_tag = '' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 0
+                     iv_length   = 6
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 6
+                     iv_length   = 3
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'K'
+                     iv_offset   = 9
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 13
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+********************************************************
+* Test parsing and ordering of key words in structures *
+********************************************************
+  METHOD test_abap_08.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = 'lv_length = <match>-length.'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 13
+                    iv_length = 5 ).
+    generate_parse( iv_token  = 'K'
+                    iv_offset = 20
+                    iv_length = 6 ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 0
+                     iv_length   = 27
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_css.clas.abap.html b/src/syntax/zcl_abapgit_syntax_css.clas.abap.html new file mode 100644 index 00000000000..afece9f45f2 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_css.clas.abap.html @@ -0,0 +1,1555 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_css.clas.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_css.clas.abap

+
+ +
+ 81.02% + Statements + 397/490 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 81.02% + Lines + 397/490 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +4911x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_syntax_css DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    " CSS Standard            https://www.w3.org/TR/css-2018/
+    " CSS Reference           https://www.w3schools.com/cssref/default.asp
+ 
+    " We used a mixture of above as reference for the keyword list
+    " 1) CSS Properties       https://www.w3schools.com/cssref/default.asp
+    " 2) CSS Values & Units   https://www.w3schools.com/cssref/css_units.asp
+    " 3) CSS Selectors        https://www.w3.org/TR/css-2018/#selectors
+    " 4) CSS Functions        https://www.w3schools.com/cssref/css_functions.asp
+    " 5) CSS Colors           https://www.w3schools.com/colors/colors_names.asp
+    " 6) CSS Extensions
+    " 7) CSS At-Rules         https://www.w3.org/TR/css-2018/#at-rules
+    " 8) HTML Tags
+ 
+    CONSTANTS:
+      BEGIN OF c_css,
+        keyword    TYPE string VALUE 'keyword',
+        text       TYPE string VALUE 'text',
+        comment    TYPE string VALUE 'comment',
+        selectors  TYPE string VALUE 'selectors',
+        units      TYPE string VALUE 'units',
+        properties TYPE string VALUE 'properties',
+        values     TYPE string VALUE 'values',
+        functions  TYPE string VALUE 'functions',
+        colors     TYPE string VALUE 'colors',
+        extensions TYPE string VALUE 'extensions',
+        at_rules   TYPE string VALUE 'at_rules',
+        html       TYPE string VALUE 'html',
+      END OF c_css .
+    CONSTANTS:
+      BEGIN OF c_token,
+        keyword    TYPE c VALUE 'K',
+        text       TYPE c VALUE 'T',
+        comment    TYPE c VALUE 'C',
+        selectors  TYPE c VALUE 'S',
+        units      TYPE c VALUE 'U',
+        properties TYPE c VALUE 'P',
+        values     TYPE c VALUE 'V',
+        functions  TYPE c VALUE 'F',
+        colors     TYPE c VALUE 'Z',
+        extensions TYPE c VALUE 'E',
+        at_rules   TYPE c VALUE 'A',
+        html       TYPE c VALUE 'H',
+      END OF c_token .
+    CONSTANTS:
+      BEGIN OF c_regex,
+        " comments /* ... */
+        comment   TYPE string VALUE '\/\*.*\*\/|\/\*|\*\/',
+        " single or double quoted strings
+        text      TYPE string VALUE '("[^"]*")|(''[^'']*'')|(`[^`]*`)',
+        " in general keywords don't contain numbers (except -ms-scrollbar-3dlight-color)
+        keyword   TYPE string VALUE '\b[a-z3@\-]+\b',
+        " selectors begin with :
+        selectors TYPE string VALUE ':[:a-z]+\b',
+        " units
+        units     TYPE string
+        VALUE '\b[0-9\. ]+(ch|cm|em|ex|in|mm|pc|pt|px|vh|vmax|vmin|vw)\b|\b[0-9\. ]+%',
+      END OF c_regex .
+ 
+    CLASS-METHODS class_constructor .
+    METHODS constructor .
+  PROTECTED SECTION.
+    TYPES: ty_token TYPE c LENGTH 1.
+ 
+    TYPES: BEGIN OF ty_keyword,
+             keyword TYPE string,
+             token   TYPE ty_token,
+           END OF ty_keyword.
+ 
+    CLASS-DATA gt_keywords TYPE HASHED TABLE OF ty_keyword WITH UNIQUE KEY keyword.
+    CLASS-DATA gv_comment TYPE abap_bool.
+ 
+    CLASS-METHODS init_keywords.
+    CLASS-METHODS insert_keywords
+      IMPORTING
+        iv_keywords TYPE string
+        iv_token    TYPE ty_token.
+    CLASS-METHODS is_keyword
+      IMPORTING iv_chunk      TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    METHODS order_matches REDEFINITION.
+    METHODS parse_line REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_css IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+ 
+    init_keywords( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Reset indicator for multi-line comments
+    CLEAR gv_comment.
+ 
+    " Initialize instances of regular expression
+    add_rule( iv_regex = c_regex-keyword
+              iv_token = c_token-keyword
+              iv_style = c_css-keyword ).
+ 
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+    add_rule( iv_regex = c_regex-text
+              iv_token = c_token-text
+              iv_style = c_css-text ).
+ 
+    add_rule( iv_regex = c_regex-selectors
+              iv_token = c_token-selectors
+              iv_style = c_css-selectors ).
+ 
+    add_rule( iv_regex = c_regex-units
+              iv_token = c_token-units
+              iv_style = c_css-units ).
+ 
+    " Styles for keywords
+    add_rule( iv_regex = ''
+              iv_token = c_token-html
+              iv_style = c_css-html ).
+ 
+    add_rule( iv_regex = ''
+              iv_token = c_token-properties
+              iv_style = c_css-properties ).
+ 
+    add_rule( iv_regex = ''
+              iv_token = c_token-values
+              iv_style = c_css-values ).
+ 
+    add_rule( iv_regex = ''
+              iv_token = c_token-functions
+              iv_style = c_css-functions ).
+ 
+    add_rule( iv_regex = ''
+              iv_token = c_token-colors
+              iv_style = c_css-colors ).
+ 
+    add_rule( iv_regex = ''
+              iv_token = c_token-extensions
+              iv_style = c_css-extensions ).
+ 
+    add_rule( iv_regex = ''
+              iv_token = c_token-at_rules
+              iv_style = c_css-at_rules ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init_keywords.
+ 
+    DATA: lv_keywords TYPE string.
+ 
+    CLEAR gt_keywords.
+ 
+    " 1) CSS Properties
+    lv_keywords =
+    'align-content|align-items|align-self|animation|animation-delay|animation-direction|animation-duration|' &&
+    'animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|' &&
+    'backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|' &&
+    'background-image|background-origin|background-position|background-repeat|background-size|border|' &&
+    'border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|' &&
+    'border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|' &&
+    'border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|' &&
+    'border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|' &&
+    'border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|' &&
+    'border-top-style|border-top-width|border-width|box-decoration-break|box-shadow|box-sizing|caption-side|' &&
+    'caret-color|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|' &&
+    'column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|' &&
+    'counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|' &&
+    'flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-kerning|font-size|font-size-adjust|' &&
+    'font-stretch|font-style|font-variant|font-weight|grid|grid-area|grid-auto-columns|grid-auto-flow|' &&
+    'grid-auto-rows|grid-column|grid-column-end|grid-column-gap|grid-column-start|grid-gap|grid-row|' &&
+    'grid-row-end|grid-row-gap|grid-row-start|grid-template|grid-template-areas|grid-template-columns|' &&
+    'grid-template-rows|hanging-punctuation|height|hyphens|isolation|justify-content|' &&
+    'letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|' &&
+    'margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|media|min-height|min-width|' &&
+    'mix-blend-mode|object-fit|object-position|opacity|order|outline|outline-color|outline-offset|' &&
+    'outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|' &&
+    'padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|' &&
+    'perspective-origin|pointer-events|position|quotes|resize|scroll-behavior|tab-size|table-layout|' &&
+    'text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|' &&
+    'text-decoration-style|text-indent|text-justify|text-overflow|text-rendering|text-shadow|text-transform|' &&
+    'transform|transform-origin|transform-style|transition|transition-delay|transition-duration|' &&
+    'transition-property|transition-timing-function|unicode-bidi|user-select|vertical-align|visibility|' &&
+    'white-space|width|word-break|word-spacing|word-wrap|writing-mode|z-index'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-properties ).
+ 
+    " 2) CSS Values
+    lv_keywords =
+    'absolute|all|auto|block|bold|border-box|both|bottom|center|counter|cover|dashed|fixed|hidden|important|' &&
+    'inherit|initial|inline-block|italic|left|max-content|middle|min-content|no-repeat|none|normal|pointer|' &&
+    'relative|rem|right|solid|table-cell|text|top|transparent|underline|url'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-values ).
+ 
+    " 3) CSS Selectors
+    lv_keywords =
+    ':active|::after|::before|:checked|:disabled|:empty|:enabled|:first-child|::first-letter|::first-line|' &&
+    ':first-of-type|:focus|:hover|:lang|:last-child|:last-of-type|:link|:not|:nth-child|:nth-last-child|' &&
+    ':nth-last-of-type|:nth-of-type|:only-child|:only-of-type|:root|:target|:visited'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-selectors ).
+ 
+    " 4) CSS Functions
+    lv_keywords =
+    'attr|calc|cubic-bezier|hsl|hsla|linear-gradient|radial-gradient|repeating-linear-gradient|' &&
+    'repeating-radial-gradient|rgb|rgba|rotate|scale|translateX|translateY|var'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-functions ).
+ 
+    " 5) CSS Colors
+    lv_keywords =
+    '#|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|' &&
+    'burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|' &&
+    'darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|' &&
+    'darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|' &&
+    'deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|' &&
+    'ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|' &&
+    'lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|' &&
+    'lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|' &&
+    'lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|' &&
+    'mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|' &&
+    'mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|' &&
+    'orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|' &&
+    'peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|' &&
+    'seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|' &&
+    'tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-colors ).
+ 
+    " 6) CSS Extensions
+    lv_keywords =
+    'moz|moz-binding|moz-border-bottom-colors|moz-border-left-colors|moz-border-right-colors|' &&
+    'moz-border-top-colors|moz-box-align|moz-box-direction|moz-box-flex|moz-box-ordinal-group|' &&
+    'moz-box-orient|moz-box-pack|moz-box-shadow|moz-context-properties|moz-float-edge|' &&
+    'moz-force-broken-image-icon|moz-image-region|moz-orient|moz-osx-font-smoothing|' &&
+    'moz-outline-radius|moz-outline-radius-bottomleft|moz-outline-radius-bottomright|' &&
+    'moz-outline-radius-topleft|moz-outline-radius-topright|moz-stack-sizing|moz-system-metric|' &&
+    'moz-transform|moz-transform-origin|moz-transition|moz-transition-delay|moz-user-focus|' &&
+    'moz-user-input|moz-user-modify|moz-window-dragging|moz-window-shadow|ms|ms-accelerator|' &&
+    'ms-block-progression|ms-content-zoom-chaining|ms-content-zoom-limit|' &&
+    'ms-content-zoom-limit-max|ms-content-zoom-limit-min|ms-content-zoom-snap|' &&
+    'ms-content-zoom-snap-points|ms-content-zoom-snap-type|ms-content-zooming|ms-filter|' &&
+    'ms-flow-from|ms-flow-into|ms-high-contrast-adjust|ms-hyphenate-limit-chars|' &&
+    'ms-hyphenate-limit-lines|ms-hyphenate-limit-zone|ms-ime-align|ms-overflow-style|' &&
+    'ms-scroll-chaining|ms-scroll-limit|ms-scroll-limit-x-max|ms-scroll-limit-x-min|' &&
+    'ms-scroll-limit-y-max|ms-scroll-limit-y-min|ms-scroll-rails|ms-scroll-snap-points-x|' &&
+    'ms-scroll-snap-points-y|ms-scroll-snap-x|ms-scroll-snap-y|ms-scroll-translation|' &&
+    'ms-scrollbar-3dlight-color|ms-scrollbar-arrow-color|ms-scrollbar-base-color|' &&
+    'ms-scrollbar-darkshadow-color|ms-scrollbar-face-color|ms-scrollbar-highlight-color|' &&
+    'ms-scrollbar-shadow-color|ms-scrollbar-track-color|ms-transform|ms-text-autospace|' &&
+    'ms-touch-select|ms-wrap-flow|ms-wrap-margin|ms-wrap-through|o|o-transform|webkit|' &&
+    'webkit-animation-trigger|webkit-app-region|webkit-appearance|webkit-aspect-ratio|' &&
+    'webkit-backdrop-filter|webkit-background-composite|webkit-border-after|' &&
+    'webkit-border-after-color|webkit-border-after-style|webkit-border-after-width|' &&
+    'webkit-border-before|webkit-border-before-color|webkit-border-before-style|' &&
+    'webkit-border-before-width|webkit-border-end|webkit-border-end-color|' &&
+    'webkit-border-end-style|webkit-border-end-width|webkit-border-fit|' &&
+    'webkit-border-horizontal-spacing|webkit-border-radius|webkit-border-start|' &&
+    'webkit-border-start-color|webkit-border-start-style|webkit-border-start-width|' &&
+    'webkit-border-vertical-spacing|webkit-box-align|webkit-box-direction|webkit-box-flex|' &&
+    'webkit-box-flex-group|webkit-box-lines|webkit-box-ordinal-group|webkit-box-orient|' &&
+    'webkit-box-pack|webkit-box-reflect|webkit-box-shadow|webkit-column-axis|' &&
+    'webkit-column-break-after|webkit-column-break-before|webkit-column-break-inside|' &&
+    'webkit-column-progression|webkit-cursor-visibility|webkit-dashboard-region|' &&
+    'webkit-font-size-delta|webkit-font-smoothing|webkit-highlight|webkit-hyphenate-character|' &&
+    'webkit-hyphenate-limit-after|webkit-hyphenate-limit-before|webkit-hyphenate-limit-lines|' &&
+    'webkit-initial-letter|webkit-line-align|webkit-line-box-contain|webkit-line-clamp|' &&
+    'webkit-line-grid|webkit-line-snap|webkit-locale|webkit-logical-height|' &&
+    'webkit-logical-width|webkit-margin-after|webkit-margin-after-collapse|' &&
+    'webkit-margin-before|webkit-margin-before-collapse|webkit-margin-bottom-collapse|' &&
+    'webkit-margin-collapse|webkit-margin-end|webkit-margin-start|webkit-margin-top-collapse|' &&
+    'webkit-marquee|webkit-marquee-direction|webkit-marquee-increment|' &&
+    'webkit-marquee-repetition|webkit-marquee-speed|webkit-marquee-style|webkit-mask-box-image|' &&
+    'webkit-mask-box-image-outset|webkit-mask-box-image-repeat|webkit-mask-box-image-slice|' &&
+    'webkit-mask-box-image-source|webkit-mask-box-image-width|webkit-mask-repeat-x|' &&
+    'webkit-mask-repeat-y|webkit-mask-source-type|webkit-max-logical-height|' &&
+    'webkit-max-logical-width|webkit-min-logical-height|webkit-min-logical-width|' &&
+    'webkit-nbsp-mode|webkit-padding-after|webkit-padding-before|webkit-padding-end|' &&
+    'webkit-padding-start|webkit-perspective-origin-x|webkit-perspective-origin-y|' &&
+    'webkit-print-color-adjust|webkit-rtl-ordering|webkit-svg-shadow|' &&
+    'webkit-tap-highlight-color|webkit-text-combine|webkit-text-decoration-skip|' &&
+    'webkit-text-decorations-in-effect|webkit-text-fill-color|webkit-text-security|' &&
+    'webkit-text-stroke|webkit-text-stroke-color|webkit-text-stroke-width|webkit-text-zoom|' &&
+    'webkit-transform|webkit-transform-origin|webkit-transform-origin-x|' &&
+    'webkit-transform-origin-y|webkit-transform-origin-z|webkit-transition|' &&
+    'webkit-transition-delay|webkit-user-drag|webkit-user-modify|overflow-clip-box|' &&
+    'overflow-clip-box-block|overflow-clip-box-inline|zoom'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-extensions ).
+ 
+    " 6) CSS At-Rules
+    lv_keywords =
+    '@|charset|counter-style|font-face|import|keyframes'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-at_rules ).
+ 
+    " 7) HTML tage
+    lv_keywords =
+    'doctyype|a|abbr|acronym|address|applet|area|b|base|basefont|bdo|bgsound|big|blink|blockquote|' &&
+    'body|br|button|caption|center|cite|code|col|colgroup|dd|del|dfn|dir|div|dl|dt|em|embed|fieldset|' &&
+    'font|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|hr|html|i|iframe|ilayer|img|input|ins|isindex|' &&
+    'kbd|keygen|label|layer|legend|li|link|listing|map|menu|meta|multicol|nobr|noembed|noframes|' &&
+    'nolayer|noscript|object|ol|optgroup|option|p|param|plaintext|pre|q|s|samp|script|select|server|' &&
+    'small|sound|spacer|span|strike|strong|style|sub|sup|tbody|textarea|title|tt|u|ul|var|wbr|xmp|' &&
+    'xsl|xml|accesskey|action|align|alink|alt|background|balance|behavior|bgcolor|bgproperties|' &&
+    'border|bordercolor|bordercolordark|bordercolorlight|bottommargin|checked|class|classid|clear|' &&
+    'code|codebase|codetype|color|cols|colspan|compact|content|controls|coords|data|datafld|' &&
+    'dataformatas|datasrc|direction|disabled|dynsrc|enctype|event|face|for|frame|frameborder|' &&
+    'framespacing|height|hidden|href|hspace|http-equiv|id|ismap|lang|language|leftmargin|link|loop|' &&
+    'lowsrc|marginheight|marginwidth|maxlength|mayscript|method|methods|multiple|name|nohref|' &&
+    'noresize|noshade|nowrap|palette|pluginspage|public|readonly|rel|rev|rightmargin|rows|rowspan|' &&
+    'rules|scroll|scrollamount|scrolldelay|scrolling|selected|shape|size|span|src|start|style|' &&
+    'tabindex|target|text|title|topmargin|truespeed|type|url|urn|usemap|valign|value|vlink|volume|' &&
+    'vrml|vspace|width|wrap|apply-templates|attribute|choose|comment|define-template-set|' &&
+    'entity-ref|eval|expr|for-each|if|match|no-entities|node-name|order-by|otherwise|select|' &&
+    'stylesheet|template|test|value-of|version|when|xmlns|xsl|cellpadding|cellspacing|table|td|' &&
+    'tfoot|th|thead|tr'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-html ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_keywords.
+ 
+    DATA: lt_keywords TYPE STANDARD TABLE OF string,
+          ls_keyword  TYPE ty_keyword.
+ 
+    FIELD-SYMBOLS: <lv_keyword> TYPE any.
+ 
+    SPLIT iv_keywords AT '|' INTO TABLE lt_keywords.
+ 
+    LOOP AT lt_keywords ASSIGNING <lv_keyword>.
+      CLEAR ls_keyword.
+      ls_keyword-keyword = <lv_keyword>.
+      ls_keyword-token = iv_token.
+      INSERT ls_keyword INTO TABLE gt_keywords.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_keyword.
+ 
+    DATA lv_str TYPE string.
+ 
+    lv_str = to_lower( iv_chunk ).
+    READ TABLE gt_keywords WITH TABLE KEY keyword = lv_str TRANSPORTING NO FIELDS.
+    rv_yes = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+
+    DATA:
+      lv_match      TYPE string,
+      lv_line_len   TYPE i,
+      lv_cmmt_end   TYPE i,
+      lv_prev_end   TYPE i,
+      lv_prev_token TYPE c.
+
+    FIELD-SYMBOLS:
+      <ls_prev>    TYPE ty_match,
+      <ls_match>   TYPE ty_match,
+      <ls_keyword> TYPE ty_keyword.
+
+    " Longest matches
+    SORT ct_matches BY offset length DESCENDING.
+
+    lv_line_len = strlen( iv_line ).
+
+    " Check if this is part of multi-line comment and mark it accordingly
+    IF gv_comment = abap_true.
+      READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        CLEAR ct_matches.
+        APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
+        <ls_match>-token = c_token-comment.
+        <ls_match>-offset = 0.
+        <ls_match>-length = lv_line_len.
+        RETURN.
+      ENDIF.
+    ENDIF.
+
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      " Delete matches after open text match
+      IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
+        CLEAR <ls_match>-token.
+        CONTINUE.
+      ENDIF.
+
+      lv_match = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+
+      CASE <ls_match>-token.
+        WHEN c_token-keyword.
+          " Skip keyword that's part of previous (longer) keyword
+          IF <ls_match>-offset < lv_prev_end.
+            CLEAR <ls_match>-token.
+            CONTINUE.
+          ENDIF.
+
+          " Map generic keyword to specific CSS token
+          lv_match = to_lower( lv_match ).
+          READ TABLE gt_keywords ASSIGNING <ls_keyword> WITH TABLE KEY keyword = lv_match.
+          IF sy-subrc = 0.
+            <ls_match>-token = <ls_keyword>-token.
+          ENDIF.
+
+        WHEN c_token-comment.
+          IF lv_match = '/*'.
+            DELETE ct_matches WHERE offset > <ls_match>-offset.
+            <ls_match>-length = lv_line_len - <ls_match>-offset.
+            gv_comment = abap_true.
+          ELSEIF lv_match = '*/'.
+            DELETE ct_matches WHERE offset < <ls_match>-offset.
+            <ls_match>-length = <ls_match>-offset + 2.
+            <ls_match>-offset = 0.
+            gv_comment = abap_false.
+          ELSE.
+            lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
+            DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
+          ENDIF.
+
+        WHEN c_token-text.
+          <ls_match>-text_tag = lv_match.
+          IF lv_prev_token = c_token-text.
+            IF <ls_match>-text_tag = <ls_prev>-text_tag.
+              <ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
+              CLEAR lv_prev_token.
+            ENDIF.
+            CLEAR <ls_match>-token.
+            CONTINUE.
+          ENDIF.
+
+      ENDCASE.
+
+      lv_prev_token = <ls_match>-token.
+      lv_prev_end   = <ls_match>-offset + <ls_match>-length.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+
+    DELETE ct_matches WHERE token IS INITIAL.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line. "REDEFINITION
+ 
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
+ 
+    rt_matches = super->parse_line( iv_line ).
+ 
+    " Remove non-keywords
+    LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
+      lv_index = sy-tabix.
+      IF abap_false = is_keyword( substring( val = iv_line
+                                             off = <ls_match>-offset
+                                             len = <ls_match>-length ) ).
+        CLEAR <ls_match>-token.
+      ENDIF.
+    ENDLOOP.
+ 
+    DELETE rt_matches WHERE token IS INITIAL.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_factory.clas.abap.html b/src/syntax/zcl_abapgit_syntax_factory.clas.abap.html new file mode 100644 index 00000000000..d5a219d00b1 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_factory.clas.abap.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_factory.clas.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_factory.clas.abap

+
+ +
+ 100% + Statements + 46/46 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 46/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_syntax_factory DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_filename       TYPE string
+        !iv_hidden_chars   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_syntax_highlighter .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_factory IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+ 
+    " Create instance of highighter dynamically dependent on syntax type
+    IF iv_filename CP '*.abap'.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_abap.
+    ELSEIF iv_filename CP '*.xml' OR iv_filename CP '*.html'.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_xml.
+    ELSEIF iv_filename CP '*.css'.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_css.
+    ELSEIF iv_filename CP '*.js'.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_js.
+    ELSEIF iv_filename CP '*.json' OR iv_filename CP '*.jsonc'.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_json.
+    ELSEIF iv_filename CP '*.txt' OR iv_filename CP '*.ini'  OR iv_filename CP '*.text'.
+      CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_txt.
+    ELSE.
+      CLEAR ro_instance.
+    ENDIF.
+ 
+    IF ro_instance IS BOUND.
+      ro_instance->set_hidden_chars( iv_hidden_chars ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_highlighter.clas.abap.html b/src/syntax/zcl_abapgit_syntax_highlighter.clas.abap.html new file mode 100644 index 00000000000..d8f71a97a31 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_highlighter.clas.abap.html @@ -0,0 +1,1012 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_highlighter.clas.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_highlighter.clas.abap

+
+ +
+ 91.9% + Statements + 284/309 +
+ + +
+ 92.85% + Branches + 13/14 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 91.9% + Lines + 284/309 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +3101x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +120x +120x +120x +120x +117x +117x +117x +117x +117x +120x +120x +120x +120x +120x +120x +120x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +48x +48x +20x +20x +1x +1x +1x +1x +1x +34x +34x +34x +34x +34x +34x +34x +34x +34x +34x +34x +34x +34x +34x +34x +51x +51x +51x +51x +51x +51x +34x +34x +34x +34x +34x +7x +7x +7x +7x +7x +7x +34x +34x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +128x +128x +128x +128x +128x +54x +54x +54x +33x +33x +33x +33x +33x +54x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x + 
CLASS zcl_abapgit_syntax_highlighter DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS process_line
+      IMPORTING
+        !iv_line       TYPE string
+      RETURNING
+        VALUE(rv_line) TYPE string .
+    METHODS set_hidden_chars
+      IMPORTING
+        !iv_hidden_chars TYPE abap_bool .
+  PROTECTED SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_match,
+        token    TYPE c LENGTH 1,  " Type of matches
+        offset   TYPE i,      " Beginning position of the string that should be formatted
+        length   TYPE i,      " Length of the string that should be formatted
+        text_tag TYPE string, " Type of text tag
+      END OF ty_match .
+    TYPES:
+      ty_match_tt  TYPE STANDARD TABLE OF ty_match WITH DEFAULT KEY .
+    TYPES:
+      BEGIN OF ty_rule,
+        regex             TYPE REF TO cl_abap_regex,
+        token             TYPE c LENGTH 1,
+        style             TYPE string,
+        relevant_submatch TYPE i,
+      END OF ty_rule .
+ 
+    CONSTANTS c_token_none TYPE c VALUE '.' ##NO_TEXT.
+    DATA:
+      mt_rules TYPE STANDARD TABLE OF ty_rule .
+    DATA mv_hidden_chars TYPE abap_bool .
+ 
+    METHODS add_rule
+      IMPORTING
+        !iv_regex    TYPE string
+        !iv_token    TYPE c
+        !iv_style    TYPE string
+        !iv_submatch TYPE i OPTIONAL .
+    METHODS parse_line
+      IMPORTING
+        !iv_line          TYPE string
+      RETURNING
+        VALUE(rt_matches) TYPE ty_match_tt .
+    METHODS order_matches
+      IMPORTING
+        !iv_line    TYPE string
+      CHANGING
+        !ct_matches TYPE ty_match_tt .
+    METHODS extend_matches
+      IMPORTING
+        !iv_line    TYPE string
+      CHANGING
+        !ct_matches TYPE ty_match_tt .
+    METHODS format_line
+      IMPORTING
+        !iv_line       TYPE string
+        !it_matches    TYPE ty_match_tt
+      RETURNING
+        VALUE(rv_line) TYPE string .
+    METHODS apply_style
+      IMPORTING
+        !iv_line       TYPE string
+        !iv_class      TYPE string
+      RETURNING
+        VALUE(rv_line) TYPE string .
+    METHODS is_whitespace
+      IMPORTING
+        !iv_string       TYPE string
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool .
+    METHODS show_hidden_chars
+      IMPORTING
+        !iv_line       TYPE string
+      RETURNING
+        VALUE(rv_line) TYPE string .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_highlighter IMPLEMENTATION.
+ 
+ 
+  METHOD add_rule.
+ 
+    DATA ls_rule LIKE LINE OF mt_rules.
+ 
+    IF NOT iv_regex IS INITIAL.
+      CREATE OBJECT ls_rule-regex
+        EXPORTING
+          pattern     = iv_regex
+          ignore_case = abap_true.
+    ENDIF.
+ 
+    ls_rule-token         = iv_token.
+    ls_rule-style         = iv_style.
+    ls_rule-relevant_submatch = iv_submatch.
+    APPEND ls_rule TO mt_rules.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_style.
+ 
+    DATA lv_escaped TYPE string.
+ 
+    lv_escaped = escape( val    = iv_line
+                         format = cl_abap_format=>e_html_text ).
+ 
+    lv_escaped = show_hidden_chars( lv_escaped ).
+ 
+    IF iv_class IS NOT INITIAL.
+      rv_line = |<span class="{ iv_class }">{ lv_escaped }</span>|.
+    ELSE.
+      rv_line = lv_escaped.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD extend_matches.
+ 
+    DATA: lv_line_len TYPE i,
+          lv_last_pos TYPE i VALUE 0,
+          lv_length   TYPE i,
+          ls_match    TYPE ty_match.
+ 
+    FIELD-SYMBOLS <ls_match> TYPE ty_match.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    SORT ct_matches BY offset.
+ 
+    " Add entries refering to parts of text that should not be formatted
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      IF <ls_match>-offset > lv_last_pos.
+        lv_length = <ls_match>-offset - lv_last_pos.
+        ls_match-token  = c_token_none.
+        ls_match-offset = lv_last_pos.
+        ls_match-length = lv_length.
+        INSERT ls_match INTO ct_matches INDEX sy-tabix.
+      ENDIF.
+      lv_last_pos = <ls_match>-offset + <ls_match>-length.
+    ENDLOOP.
+ 
+    " Add remainder of the string
+    IF lv_line_len > lv_last_pos.
+      lv_length = lv_line_len - lv_last_pos.
+      ls_match-token  = c_token_none.
+      ls_match-offset = lv_last_pos.
+      ls_match-length = lv_length.
+      APPEND ls_match TO ct_matches.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_line.
+ 
+    DATA:
+      lv_chunk TYPE string,
+      ls_rule  LIKE LINE OF mt_rules.
+ 
+    FIELD-SYMBOLS <ls_match> TYPE ty_match.
+ 
+    LOOP AT it_matches ASSIGNING <ls_match>.
+      lv_chunk = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+ 
+      CLEAR ls_rule. " Failed read equals no style
+      READ TABLE mt_rules INTO ls_rule WITH KEY token = <ls_match>-token.
+ 
+      lv_chunk = apply_style( iv_line  = lv_chunk
+                              iv_class = ls_rule-style ).
+ 
+      rv_line = rv_line && lv_chunk.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_whitespace.
+ 
+    DATA: lv_whitespace TYPE string.
+ 
+    "/^\s+$/
+    lv_whitespace = ` ` && cl_abap_char_utilities=>horizontal_tab && cl_abap_char_utilities=>cr_lf.
+ 
+    rv_result = boolc( iv_string CO lv_whitespace ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line.
+ 
+    DATA:
+      lo_regex   TYPE REF TO cl_abap_regex,
+      lo_matcher TYPE REF TO cl_abap_matcher,
+      lt_result  TYPE match_result_tab,
+      ls_match   TYPE ty_match.
+ 
+    FIELD-SYMBOLS:
+      <ls_regex>    LIKE LINE OF mt_rules,
+      <ls_result>   TYPE match_result,
+      <ls_submatch> LIKE LINE OF <ls_result>-submatches.
+ 
+ 
+    " Process syntax-dependent regex table and find all matches
+    LOOP AT mt_rules ASSIGNING <ls_regex> WHERE regex IS BOUND.
+      lo_regex   = <ls_regex>-regex.
+      lo_matcher = lo_regex->create_matcher( text = iv_line ).
+      lt_result  = lo_matcher->find_all( ).
+ 
+      " Save matches into custom table with predefined tokens
+      LOOP AT lt_result ASSIGNING <ls_result>.
+        CLEAR: ls_match.
+        IF <ls_regex>-relevant_submatch = 0.
+          ls_match-token  = <ls_regex>-token.
+          ls_match-offset = <ls_result>-offset.
+          ls_match-length = <ls_result>-length.
+          APPEND ls_match TO rt_matches.
+        ELSE.
+          READ TABLE <ls_result>-submatches ASSIGNING <ls_submatch> INDEX <ls_regex>-relevant_submatch.
+          "submatch might be empty if only discarted parts matched
+          IF sy-subrc = 0 AND <ls_submatch>-offset >= 0 AND <ls_submatch>-length > 0.
+            ls_match-token  = <ls_regex>-token.
+            ls_match-offset = <ls_submatch>-offset.
+            ls_match-length = <ls_submatch>-length.
+            APPEND ls_match TO rt_matches.
+          ENDIF.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD process_line.
+ 
+    DATA: lt_matches TYPE ty_match_tt.
+ 
+    IF iv_line IS INITIAL OR is_whitespace( iv_line ) = abap_true.
+      rv_line = show_hidden_chars( iv_line ).
+      RETURN.
+    ENDIF.
+ 
+    lt_matches = parse_line( iv_line ).
+ 
+    order_matches( EXPORTING iv_line    = iv_line
+                   CHANGING  ct_matches = lt_matches ).
+ 
+    extend_matches( EXPORTING iv_line    = iv_line
+                    CHANGING  ct_matches = lt_matches ).
+ 
+    rv_line = format_line( iv_line    = iv_line
+                           it_matches = lt_matches ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_hidden_chars.
+    mv_hidden_chars = iv_hidden_chars.
+  ENDMETHOD.
+ 
+ 
+  METHOD show_hidden_chars.
+ 
+    DATA lv_bom TYPE x LENGTH 3.
+ 
+    rv_line = iv_line.
+ 
+    IF mv_hidden_chars = abap_true.
+      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN rv_line WITH '&nbsp;&rarr;&nbsp;'.
+      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf(1)       IN rv_line WITH '&para;'.
+      REPLACE ALL OCCURRENCES OF ` `                                    IN rv_line WITH '&middot;'.
+      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>form_feed IN rv_line
+        WITH '<span class="red">&odash;</span>'.
+
+      IF strlen( rv_line ) BETWEEN 1 AND 2.
+        TRY.
+            lv_bom = zcl_abapgit_convert=>string_to_xstring( rv_line ).
+          CATCH zcx_abapgit_exception ##NO_HANDLER.
+        ENDTRY.
+        IF lv_bom(2) = cl_abap_char_utilities=>byte_order_mark_big.
+          rv_line = '<span class="red">&squf;</span>'. " UTF-16 big-endian (FE FF)
+        ENDIF.
+        IF lv_bom(2) = cl_abap_char_utilities=>byte_order_mark_little.
+          rv_line = '<span class="red">&compfn;</span>'. " UTF-16 little-endian (FF FE)
+        ENDIF.
+        IF lv_bom(3) = cl_abap_char_utilities=>byte_order_mark_utf8.
+          rv_line = '<span class="red">&curren;</span>'. " UTF-8 (EF BB BF)
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_js.clas.abap.html b/src/syntax/zcl_abapgit_syntax_js.clas.abap.html new file mode 100644 index 00000000000..8e6b444de8b --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_js.clas.abap.html @@ -0,0 +1,991 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_js.clas.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_js.clas.abap

+
+ +
+ 68.21% + Statements + 206/302 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 68.21% + Lines + 206/302 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +3031x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_syntax_js DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      " JavaScript
+      " 1) General keywords
+      " 2) Variable types
+      " 3) HTML Tags
+      BEGIN OF c_css,
+        keyword   TYPE string VALUE 'keyword',
+        text      TYPE string VALUE 'text',
+        comment   TYPE string VALUE 'comment',
+        variables TYPE string VALUE 'variables',
+      END OF c_css .
+    CONSTANTS:
+      BEGIN OF c_token,
+        keyword   TYPE c VALUE 'K',
+        text      TYPE c VALUE 'T',
+        comment   TYPE c VALUE 'C',
+        variables TYPE c VALUE 'V',
+      END OF c_token .
+    CONSTANTS:
+      BEGIN OF c_regex,
+        " comments /* ... */ or //
+        comment TYPE string VALUE '\/\*.*\*\/|\/\*|\*\/|\/\/',
+        " single or double quoted strings
+        text    TYPE string VALUE '"|''|`',
+        " in general keywords don't contain numbers (except -ms-scrollbar-3dlight-color)
+        keyword TYPE string VALUE '\b[a-z-]+\b',
+      END OF c_regex .
+ 
+    CLASS-METHODS class_constructor .
+    METHODS constructor .
+  PROTECTED SECTION.
+    TYPES: ty_token TYPE c LENGTH 1.
+ 
+    TYPES: BEGIN OF ty_keyword,
+             keyword TYPE string,
+             token   TYPE ty_token,
+           END OF ty_keyword.
+ 
+    CLASS-DATA gt_keywords TYPE HASHED TABLE OF ty_keyword WITH UNIQUE KEY keyword.
+    CLASS-DATA gv_comment TYPE abap_bool.
+ 
+    CLASS-METHODS init_keywords.
+    CLASS-METHODS insert_keywords
+      IMPORTING
+        iv_keywords TYPE string
+        iv_token    TYPE ty_token.
+    CLASS-METHODS is_keyword
+      IMPORTING iv_chunk      TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    METHODS order_matches REDEFINITION.
+    METHODS parse_line REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_js IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+ 
+    init_keywords( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Reset indicator for multi-line comments
+    CLEAR gv_comment.
+ 
+    " Initialize instances of regular expression
+    add_rule( iv_regex = c_regex-keyword
+              iv_token = c_token-keyword
+              iv_style = c_css-keyword ).
+ 
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+    add_rule( iv_regex = c_regex-text
+              iv_token = c_token-text
+              iv_style = c_css-text ).
+ 
+    " Styles for keywords
+    add_rule( iv_regex = ''
+              iv_token = c_token-variables
+              iv_style = c_css-variables ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init_keywords.
+ 
+    DATA: lv_keywords TYPE string.
+ 
+    CLEAR gt_keywords.
+ 
+    " 1) General keywords
+    lv_keywords =
+    'alert|all|body|break|bytetostring|case|continue|default|delete|do|document|else|event|export|for|function|if|' &&
+    'import|in|innerhtml|isnan|item|mimetypes|navigator|new|onabort|onblur|onchange|onclick|ondblclick|ondragdrop|' &&
+    'onerror|onfocus|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|' &&
+    'onmove|onreset|onselect|onsubmit|onunload|onresize|options|parsefloat|parseint|prototype|return|screen|switch|' &&
+    'unit|var|void|while|window|with|anchor|applet|area|button|checkbox|fileupload|form|frame|hidden|link|mimetype|' &&
+    'password|plugin|radio|reset|select|submit|text|textarea|abs|acos|alert|anchor|asin|atan|atan2|back|big|blink|' &&
+    'blur|bold|captureevents|ceil|charat|charcodeat|clearinterval|cleartimeout|click|close|concat|confirm|cos|' &&
+    'disableexternalcapture|enableexternalcapture|eval|exp|find|fixed|floor|focus|fontcolor|fontsize|forward|' &&
+    'fromcharcode|getdate|getday|getelementbyid|gethours|getminutes|getmonth|getoptionvalue|getoptionvaluecount|' &&
+    'getseconds|getselection|gettime|gettimezoneoffset|getyear|go|handleevent|home|indexof|italics|javaenabled|join|' &&
+    'lastindexof|link|load|log|match|max|min|moveabove|movebelow|moveby|moveto|movetoabsolute|open|parse|plugins|' &&
+    'pop|pow|preference|print|prompt|push|random|refresh|releaseevents|reload|replace|reset|resizeby|resizeto|' &&
+    'reverse|round|routeevent|scroll|scrollby|scrollto|search|select|setdate|sethours|setinterval|setminutes|' &&
+    'setmonth|setseconds|settime|settimeout|setyear|shift|sin|slice|small|sort|splice|split|sqrt|stop|strike|sub|' &&
+    'submit|substr|substring|sup|taintenabled|tan|togmtstring|tolocalestring|tolowercase|tostring|touppercase|' &&
+    'unshift|unwatch|utc|valueof|watch|write|writeln|e|ln10|ln2|log10e|log2e|max_value|min_value|negative_infinity|' &&
+    'nan|pi|positive_infinity|url|above|action|alinkcolor|anchors|appcodename|appname|appversion|applets|arguments|' &&
+    'arity|availheight|availwidth|background|backgroundcolor|below|bgcolor|border|bottom|caller|cancelbubble|' &&
+    'checked|clientheight|clientwidth|clientx|clienty|clip|closed|color|colordepth|complete|constructor|cookie|' &&
+    'count|current|defaultchecked|defaultselected|defaultstatus|defaultvalue|description|display|document|domain|' &&
+    'elements|embeds|enabledplugin|encoding|false|fgcolor|filename|form|formname|forms|frames|hash|height|history|' &&
+    'host|hostname|href|hspace|images|innerheight|innerwidth|language|lastmodified|layers|left|length|linkcolor|' &&
+    'links|location|locationbar|lowsrc|menubar|method|mimetypes|name|next|null|offsetheight|offsetleft|offsetparent|' &&
+    'offsetwidth|opener|outerheight|outerwidth|pagex|pagexoffset|pagey|pageyoffset|parent|parentlayer|pathname|' &&
+    'personalbar|pixeldepth|platform|plugins|port|poswidth|previous|protocol|prototype|referrer|right|scrolltop|' &&
+    'scrollbars|search|selected|selectedindex|self|siblingabove|siblingbelow|src|srcelement|status|statusbar|style|' &&
+    'suffixes|tags|target|text|this|title|toolbar|top|true|type|useragent|value|visibility|vlinkcolor|vspace|width|' &&
+    'window|zindex'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-keyword ).
+ 
+    " 2) Variable types
+    lv_keywords =
+    'array|boolean|date|function|image|layer|math|number|object|option|regexp|string'.
+    insert_keywords( iv_keywords = lv_keywords
+                     iv_token = c_token-variables ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_keywords.
+ 
+    DATA: lt_keywords TYPE STANDARD TABLE OF string,
+          ls_keyword  TYPE ty_keyword.
+ 
+    FIELD-SYMBOLS: <lv_keyword> TYPE any.
+ 
+    SPLIT iv_keywords AT '|' INTO TABLE lt_keywords.
+ 
+    LOOP AT lt_keywords ASSIGNING <lv_keyword>.
+      CLEAR ls_keyword.
+      ls_keyword-keyword = <lv_keyword>.
+      ls_keyword-token = iv_token.
+      INSERT ls_keyword INTO TABLE gt_keywords.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_keyword.
+ 
+    DATA lv_str TYPE string.
+ 
+    lv_str = to_lower( iv_chunk ).
+    READ TABLE gt_keywords WITH TABLE KEY keyword = lv_str TRANSPORTING NO FIELDS.
+    rv_yes = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+
+    DATA:
+      lv_match      TYPE string,
+      lv_line_len   TYPE i,
+      lv_cmmt_end   TYPE i,
+      lv_prev_end   TYPE i,
+      lv_prev_token TYPE c.
+
+    FIELD-SYMBOLS:
+      <ls_prev>    TYPE ty_match,
+      <ls_match>   TYPE ty_match,
+      <ls_keyword> TYPE ty_keyword.
+
+    " Longest matches
+    SORT ct_matches BY offset length DESCENDING.
+
+    lv_line_len = strlen( iv_line ).
+
+    " Check if this is part of multi-line comment and mark it accordingly
+    IF gv_comment = abap_true.
+      READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        CLEAR ct_matches.
+        APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
+        <ls_match>-token = c_token-comment.
+        <ls_match>-offset = 0.
+        <ls_match>-length = lv_line_len.
+        RETURN.
+      ENDIF.
+    ENDIF.
+
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      " Delete matches after open text match
+      IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
+        CLEAR <ls_match>-token.
+        CONTINUE.
+      ENDIF.
+
+      lv_match = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+
+      CASE <ls_match>-token.
+        WHEN c_token-keyword.
+          " Skip keyword that's part of previous (longer) keyword
+          IF <ls_match>-offset < lv_prev_end.
+            CLEAR <ls_match>-token.
+            CONTINUE.
+          ENDIF.
+
+          " Map generic keyword to specific token
+          lv_match = to_lower( lv_match ).
+          READ TABLE gt_keywords ASSIGNING <ls_keyword> WITH TABLE KEY keyword = lv_match.
+          IF sy-subrc = 0.
+            <ls_match>-token = <ls_keyword>-token.
+          ENDIF.
+
+        WHEN c_token-comment.
+          IF lv_match = '/*'.
+            DELETE ct_matches WHERE offset > <ls_match>-offset.
+            <ls_match>-length = lv_line_len - <ls_match>-offset.
+            gv_comment = abap_true.
+          ELSEIF lv_match = '//'.
+            DELETE ct_matches WHERE offset > <ls_match>-offset.
+            <ls_match>-length = lv_line_len - <ls_match>-offset.
+          ELSEIF lv_match = '*/'.
+            DELETE ct_matches WHERE offset < <ls_match>-offset.
+            <ls_match>-length = <ls_match>-offset + 2.
+            <ls_match>-offset = 0.
+            gv_comment = abap_false.
+          ELSE.
+            lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
+            DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
+          ENDIF.
+
+        WHEN c_token-text.
+          <ls_match>-text_tag = lv_match.
+          IF lv_prev_token = c_token-text.
+            IF <ls_match>-text_tag = <ls_prev>-text_tag.
+              <ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
+              CLEAR lv_prev_token.
+            ENDIF.
+            CLEAR <ls_match>-token.
+            CONTINUE.
+          ENDIF.
+
+      ENDCASE.
+
+      lv_prev_token = <ls_match>-token.
+      lv_prev_end   = <ls_match>-offset + <ls_match>-length.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+
+    DELETE ct_matches WHERE token IS INITIAL.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line. "REDEFINITION
+ 
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
+ 
+    rt_matches = super->parse_line( iv_line ).
+ 
+    " Remove non-keywords
+    LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
+      lv_index = sy-tabix.
+      IF abap_false = is_keyword( substring( val = iv_line
+                                             off = <ls_match>-offset
+                                             len = <ls_match>-length ) ).
+        CLEAR <ls_match>-token.
+      ENDIF.
+    ENDLOOP.
+ 
+    DELETE rt_matches WHERE token IS INITIAL.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_json.clas.abap.html b/src/syntax/zcl_abapgit_syntax_json.clas.abap.html new file mode 100644 index 00000000000..a193fa58aaa --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_json.clas.abap.html @@ -0,0 +1,475 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_json.clas.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_json.clas.abap

+
+ +
+ 97.69% + Statements + 127/130 +
+ + +
+ 85.71% + Branches + 6/7 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 97.69% + Lines + 127/130 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +1311x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +  +3x +3x +3x +3x +3x +3x +8x +8x +4x +4x +4x +4x +4x +4x +4x +8x +6x +6x +6x +6x +3x +3x +3x +3x +3x +3x +3x +2x +2x +3x +3x +3x +1x + 
CLASS zcl_abapgit_syntax_json DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      " JSON... This was easy :-)
+      " JSONC... With comments
+      BEGIN OF c_css,
+        keyword TYPE string VALUE 'selectors',              "#EC NOTEXT
+        text    TYPE string VALUE 'text',                   "#EC NOTEXT
+        values  TYPE string VALUE 'properties',             "#EC NOTEXT
+        comment TYPE string VALUE 'comment',                "#EC NOTEXT
+      END OF c_css.
+    CONSTANTS:
+      BEGIN OF c_token,
+        keyword TYPE c VALUE 'K',                           "#EC NOTEXT
+        text    TYPE c VALUE 'T',                           "#EC NOTEXT
+        values  TYPE c VALUE 'V',                           "#EC NOTEXT
+        comment TYPE c VALUE 'C',                           "#EC NOTEXT
+      END OF c_token.
+    CONSTANTS:
+      BEGIN OF c_regex,
+        " comments /* ... */ or //
+        comment TYPE string VALUE '\/\*.*\*\/|\/\*|\*\/|\/\/', "#EC NOTEXT
+        " not much here
+        keyword TYPE string VALUE 'true|false|null',        "#EC NOTEXT
+        " double quoted strings
+        text    TYPE string VALUE '"',                      "#EC NOTEXT
+      END OF c_regex.
+ 
+    METHODS constructor.
+  PROTECTED SECTION.
+ 
+    METHODS order_matches REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_json IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Initialize instances of regular expression
+ 
+    add_rule( iv_regex = c_regex-keyword
+              iv_token = c_token-keyword
+              iv_style = c_css-keyword ).
+ 
+    " Style for keys
+    add_rule( iv_regex = c_regex-text
+              iv_token = c_token-text
+              iv_style = c_css-text ).
+ 
+    " Style for values
+    add_rule( iv_regex = ''
+              iv_token = c_token-values
+              iv_style = c_css-values ).
+ 
+    " JSONC comments
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+ 
+    DATA:
+      lv_match      TYPE string,
+      lv_count      TYPE i,
+      lv_line_len   TYPE i,
+      lv_prev_token TYPE c.
+ 
+    FIELD-SYMBOLS:
+      <ls_prev>  TYPE ty_match,
+      <ls_match> TYPE ty_match.
+ 
+    " Longest matches
+    SORT ct_matches BY offset length DESCENDING.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      " Delete matches after open text match
+      IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
+        CLEAR <ls_match>-token.
+        CONTINUE.
+      ENDIF.
+ 
+      lv_match = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+ 
+      IF <ls_match>-token = c_token-text.
+        <ls_match>-text_tag = lv_match.
+        IF lv_prev_token = c_token-text.
+          IF <ls_match>-text_tag = <ls_prev>-text_tag.
+            <ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
+            CLEAR lv_prev_token.
+          ENDIF.
+          CLEAR <ls_match>-token.
+          CONTINUE.
+        ENDIF.
+      ENDIF.
+ 
+      lv_prev_token = <ls_match>-token.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+ 
+    DELETE ct_matches WHERE token IS INITIAL.
+ 
+    " Switch style of second text match to values
+    LOOP AT ct_matches ASSIGNING <ls_match> WHERE token = c_token-text.
+      lv_count = lv_count + 1.
+      IF lv_count >= 2.
+        <ls_match>-token = c_token-values.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap.html b/src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap.html new file mode 100644 index 00000000000..557bc37ee1d --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap.html @@ -0,0 +1,220 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_json.clas.testclasses.abap

+
+ +
+ 100% + Statements + 45/45 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 45/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +461x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_abapgit_syntax_json DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+     mo_cut TYPE REF TO zcl_abapgit_syntax_json.
+ 
+    METHODS:
+      setup,
+      key_value FOR TESTING RAISING cx_static_check,
+      comment_1 FOR TESTING RAISING cx_static_check,
+      comment_2 FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_abapgit_syntax_json IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mo_cut.
+ 
+  ENDMETHOD.
+ 
+  METHOD key_value.
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_cut->process_line( |"key":"value"| )
+      exp = |<span class="text">"key"</span>:<span class="properties">"value"</span>| ).
+  ENDMETHOD.
+ 
+  METHOD comment_1.
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_cut->process_line( |"key":"value" // comment| )
+      exp = |<span class="text">"key"</span>:<span class="properties">"value"</span>|
+         && | <span class="comment">//</span> comment| ).
+  ENDMETHOD.
+ 
+  METHOD comment_2.
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_cut->process_line( |/* comment */| )
+      exp = |<span class="comment">/* comment */</span>| ).
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_txt.clas.abap.html b/src/syntax/zcl_abapgit_syntax_txt.clas.abap.html new file mode 100644 index 00000000000..6e553b4dd4c --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_txt.clas.abap.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_txt.clas.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_txt.clas.abap

+
+ +
+ 100% + Statements + 37/37 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 37/37 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +381x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_syntax_txt DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor .
+ 
+    METHODS process_line
+        REDEFINITION .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_txt IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " No rules for plain text files
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD process_line.
+ 
+    rv_line = apply_style(
+      iv_line  = iv_line
+      iv_class = '' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.abap.html b/src/syntax/zcl_abapgit_syntax_xml.clas.abap.html new file mode 100644 index 00000000000..fe0ce60b42c --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.abap.html @@ -0,0 +1,631 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_xml.clas.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_xml.clas.abap

+
+ +
+ 88.46% + Statements + 161/182 +
+ + +
+ 82.35% + Branches + 14/17 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 88.46% + Lines + 161/182 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +1831x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +  +  +  +  +  +  +  +  +  +  +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +7x +7x +7x +7x +7x +7x +20x +8x +8x +7x +7x +7x +8x +18x +18x +20x +20x +20x +20x +20x +20x +20x +20x +  +  +  +  +  +  +  +  +  +20x +20x +20x +10x +10x +20x +20x +1x +1x +1x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +20x +1x +1x +1x +  +  +1x +1x +20x +20x +1x + 
CLASS zcl_abapgit_syntax_xml DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_syntax_highlighter
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_css,
+        xml_tag  TYPE string VALUE 'xml_tag',
+        attr     TYPE string VALUE 'attr',
+        attr_val TYPE string VALUE 'attr_val',
+        comment  TYPE string VALUE 'comment',
+      END OF c_css .
+    CONSTANTS:
+      BEGIN OF c_token,
+        xml_tag  TYPE c VALUE 'X',
+        attr     TYPE c VALUE 'A',
+        attr_val TYPE c VALUE 'V',
+        comment  TYPE c VALUE 'C',
+      END OF c_token .
+    CONSTANTS:
+      BEGIN OF c_regex,
+        "for XML tags, we will use a submatch
+        " main pattern includes quoted strings so we can ignore < and > in attr values
+        xml_tag  TYPE string VALUE '(?:"[^"]*")|(?:''[^'']*'')|(?:`[^`]*`)|([<>])',
+        attr     TYPE string VALUE '(?:^|\s)[-a-z:_0-9]+\s*(?==\s*["|''|`])',
+        attr_val TYPE string VALUE '("[^"]*")|(''[^'']*'')|(`[^`]*`)',
+        " comments <!-- ... -->
+        comment  TYPE string VALUE '[\<]!--.*--[\>]|[\<]!--|--[\>]',
+      END OF c_regex .
+ 
+    METHODS constructor .
+  PROTECTED SECTION.
+    CLASS-DATA gv_comment TYPE abap_bool.
+ 
+    METHODS order_matches REDEFINITION.
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_syntax_xml IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    " Reset indicator for multi-line comments
+    CLEAR gv_comment.
+ 
+    " Initialize instances of regular expressions
+    add_rule( iv_regex    = c_regex-xml_tag
+              iv_token    = c_token-xml_tag
+              iv_style    = c_css-xml_tag
+              iv_submatch = 1 ).
+ 
+    add_rule( iv_regex = c_regex-attr
+              iv_token = c_token-attr
+              iv_style = c_css-attr ).
+ 
+    add_rule( iv_regex = c_regex-attr_val
+              iv_token = c_token-attr_val
+              iv_style = c_css-attr_val ).
+ 
+    add_rule( iv_regex = c_regex-comment
+              iv_token = c_token-comment
+              iv_style = c_css-comment ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD order_matches.
+ 
+    DATA:
+      lv_match      TYPE string,
+      lv_line_len   TYPE i,
+      lv_cmmt_end   TYPE i,
+      lv_index      TYPE sy-tabix,
+      lv_prev_token TYPE c,
+      lv_state      TYPE c VALUE 'O'. " O - for open tag; C - for closed tag;
+ 
+    FIELD-SYMBOLS:
+      <ls_prev>  TYPE ty_match,
+      <ls_match> TYPE ty_match.
+ 
+    SORT ct_matches BY offset.
+ 
+    lv_line_len = strlen( iv_line ).
+ 
+    " Check if this is part of multi-line comment and mark it accordingly
+    IF gv_comment = abap_true.
+      READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        CLEAR ct_matches.
+        APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
+        <ls_match>-token = c_token-comment.
+        <ls_match>-offset = 0.
+        <ls_match>-length = lv_line_len.
+        RETURN.
+      ENDIF.
+    ENDIF.
+ 
+    LOOP AT ct_matches ASSIGNING <ls_match>.
+      lv_index = sy-tabix.
+ 
+      lv_match = substring( val = iv_line
+                            off = <ls_match>-offset
+                            len = <ls_match>-length ).
+ 
+      CASE <ls_match>-token.
+        WHEN c_token-xml_tag.
+          <ls_match>-text_tag = lv_match.
+ 
+          " No other matches between two tags
+          IF <ls_match>-text_tag = '>' AND lv_prev_token = c_token-xml_tag.
+            lv_state = 'C'.
+            <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset + <ls_match>-length.
+            DELETE ct_matches INDEX lv_index.
+            CONTINUE.
+ 
+            " Adjust length and offset of closing tag
+          ELSEIF <ls_match>-text_tag = '>' AND lv_prev_token <> c_token-xml_tag.
+            lv_state = 'C'.
+            IF <ls_prev> IS ASSIGNED.
+              <ls_match>-length = <ls_match>-offset - <ls_prev>-offset - <ls_prev>-length + <ls_match>-length.
+              <ls_match>-offset = <ls_prev>-offset + <ls_prev>-length.
+            ENDIF.
+          ELSE.
+            lv_state = 'O'.
+          ENDIF.
+ 
+        WHEN c_token-comment.
+          IF lv_match = '<!--'.
+            DELETE ct_matches WHERE offset > <ls_match>-offset.
+            DELETE ct_matches WHERE offset = <ls_match>-offset AND token = c_token-xml_tag.
+            <ls_match>-length = lv_line_len - <ls_match>-offset.
+            gv_comment = abap_true.
+          ELSEIF lv_match = '-->'.
+            DELETE ct_matches WHERE offset < <ls_match>-offset.
+            <ls_match>-length = <ls_match>-offset + 3.
+            <ls_match>-offset = 0.
+            gv_comment = abap_false.
+          ELSE.
+            lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
+            DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
+            DELETE ct_matches WHERE offset = <ls_match>-offset AND token = c_token-xml_tag.
+          ENDIF.
+ 
+        WHEN OTHERS.
+          IF lv_prev_token = c_token-xml_tag.
+            <ls_prev>-length = <ls_match>-offset - <ls_prev>-offset. " Extend length of the opening tag
+          ENDIF.
+ 
+          IF lv_state = 'C'.  " Delete all matches between tags
+            DELETE ct_matches INDEX lv_index.
+            CONTINUE.
+          ENDIF.
+ 
+      ENDCASE.
+ 
+      lv_prev_token = <ls_match>-token.
+      ASSIGN <ls_match> TO <ls_prev>.
+    ENDLOOP.
+ 
+    "if the last XML tag is not closed, extend it to the end of the tag
+    IF lv_prev_token = c_token-xml_tag
+        AND <ls_prev> IS ASSIGNED
+        AND <ls_prev>-length  = 1
+        AND <ls_prev>-text_tag = '<'.
+ 
+      FIND REGEX '<\s*[^\s]*' IN iv_line+<ls_prev>-offset MATCH LENGTH <ls_prev>-length.
+      IF sy-subrc <> 0.
+        <ls_prev>-length = 1.
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap.html b/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap.html new file mode 100644 index 00000000000..57235818768 --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap.html @@ -0,0 +1,2485 @@ + + + + + + Code coverage report for src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/syntax zcl_abapgit_syntax_xml.clas.testclasses.abap

+
+ +
+ 99.5% + Statements + 796/800 +
+ + +
+ 95.65% + Branches + 22/23 +
+ + +
+ 100% + Functions + 22/22 +
+ + +
+ 99.5% + Lines + 796/800 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +8011x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +  +  +  +  +9x +9x +9x +9x +1x +1x +36x +36x +36x +36x +36x +36x +36x +1x +1x +31x +31x +31x +31x +31x +31x +31x +31x +1x +1x +41x +41x +41x +41x +41x +41x +41x +41x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_abapgit_syntax_xml DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_cut TYPE REF TO zcl_abapgit_syntax_xml.
+ 
+    METHODS:
+      setup,
+      sole_closing_xml_tag FOR TESTING RAISING cx_static_check,
+      complete_xml_tag FOR TESTING RAISING cx_static_check,
+      complete_xml_tag_with_closing FOR TESTING RAISING cx_static_check,
+      empty_attributes FOR TESTING RAISING cx_static_check,
+      open_tags FOR TESTING RAISING cx_static_check,
+      attributes_only FOR TESTING RAISING cx_static_check,
+      attribute_value_equal_signs FOR TESTING RAISING cx_static_check,
+      multi_line_comments FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_abapgit_syntax_xml IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mo_cut.
+ 
+  ENDMETHOD.
+ 
+  METHOD sole_closing_xml_tag.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="xml_tag">&gt;</span>|
+      act = mo_cut->process_line( |>| ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD complete_xml_tag.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="xml_tag">&lt;tag&gt;</span>|
+      act = mo_cut->process_line( |<tag>| ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD complete_xml_tag_with_closing.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="xml_tag">&lt;tag/&gt;</span>|
+      act = mo_cut->process_line( |<tag/>| ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD empty_attributes.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="xml_tag">&lt;ECTD</span>|
+         && |<span class="attr"> SAPRL</span>=|
+         && |<span class="attr_val">"751"</span>|
+         && |<span class="attr"> VERSION</span>=|
+         && |<span class="attr_val">"1.5"</span>|
+         && |<span class="attr"> DOWNLOADDATE</span>=<span class="attr_val">""</span>|
+         && |<span class="attr"> DOWNLOADTIME</span>=<span class="attr_val">""</span>|
+         && |<span class="xml_tag">&gt;</span>|
+      act = mo_cut->process_line( |<ECTD SAPRL="751" VERSION="1.5" DOWNLOADDATE="" DOWNLOADTIME="">| ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD attributes_only.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="attr"> SAPRL</span>=|
+         && |<span class="attr_val">"751"</span>|
+         && |<span class="attr"> VERSION</span>=|
+         && |<span class="attr_val">"&gt;1.5"</span>|
+      act = mo_cut->process_line( | SAPRL="751" VERSION=">1.5"| ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="attr">SAPRL</span>=|
+         && |<span class="attr_val">"751"</span>|
+         && |<span class="attr"> VERSION</span>=|
+         && |<span class="attr_val">'&gt;1.5'</span>|
+      act = mo_cut->process_line( |SAPRL="751" VERSION='>1.5'| ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD open_tags.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="xml_tag">&lt;ECTD</span>|
+      act = mo_cut->process_line( |<ECTD| ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="xml_tag">&lt;ECTD</span>|
+         && |<span class="attr"> SAPRL</span>=|
+         && |<span class="attr_val">"751"</span>|
+         && |<span class="attr"> VERSION</span>=|
+         && |<span class="attr_val">"1.5"</span>|
+      act = mo_cut->process_line( |<ECTD SAPRL="751" VERSION="1.5"| ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD attribute_value_equal_signs.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="xml_tag">&lt;meta</span>|
+         && |<span class="attr"> name</span>=|
+         && |<span class="attr_val">"viewport"</span>|
+         && |<span class="attr"> content</span>=|
+         && |<span class="attr_val">"width=device, initial=1.0, maximum=1.0"</span>|
+         && |<span class="xml_tag">&gt;</span>|
+      act = mo_cut->process_line( |<meta name="viewport" content="width=device, initial=1.0, maximum=1.0">| ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD multi_line_comments.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="comment">&lt;!-- comment</span>|
+      act = mo_cut->process_line( |<!-- comment| ) ).
+ 
+    " New instance (i.e. different file)
+    CREATE OBJECT mo_cut.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |<span class="xml_tag">&lt;tag&gt;</span>|
+      act = mo_cut->process_line( |<tag>| ) ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_syntax_cases DEFINITION DEFERRED.
+CLASS zcl_abapgit_syntax_xml DEFINITION LOCAL FRIENDS ltcl_syntax_cases.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_syntax_cases definition
+*----------------------------------------------------------------------*
+CLASS ltcl_syntax_cases DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS
+    DURATION SHORT.
+ 
+  PRIVATE SECTION.
+ 
+    DATA:
+      mt_after_parse  TYPE zcl_abapgit_syntax_xml=>ty_match_tt,
+      mt_after_order  TYPE zcl_abapgit_syntax_xml=>ty_match_tt,
+      mt_after_extend TYPE zcl_abapgit_syntax_xml=>ty_match_tt.
+ 
+    METHODS:
+      do_test IMPORTING iv_line TYPE string,
+      generate_parse IMPORTING iv_token  TYPE c
+                               iv_offset TYPE i
+                               iv_length TYPE i,
+      generate_order IMPORTING iv_token    TYPE c
+                               iv_offset   TYPE i
+                               iv_length   TYPE i
+                               iv_text_tag TYPE string,
+      generate_extend IMPORTING iv_token    TYPE c
+                                iv_offset   TYPE i
+                                iv_length   TYPE i
+                                iv_text_tag TYPE string,
+      test_xml_01 FOR TESTING,
+      test_xml_02 FOR TESTING,
+      test_xml_03 FOR TESTING,
+      test_xml_04 FOR TESTING,
+      test_xml_05 FOR TESTING,
+      test_xml_06 FOR TESTING,
+      test_xml_07 FOR TESTING,
+      test_xml_08 FOR TESTING,
+      test_xml_09 FOR TESTING.
+ 
+ENDCLASS.
+*----------------------------------------------------------------------*
+*       CLASS ltcl_syntax_cases IMPLEMENTATION
+*----------------------------------------------------------------------*
+CLASS ltcl_syntax_cases IMPLEMENTATION.
+ 
+  METHOD do_test.
+ 
+    DATA: lt_matches_act TYPE zcl_abapgit_syntax_xml=>ty_match_tt,
+          ls_match       LIKE LINE OF lt_matches_act,
+          lv_offs        TYPE i,
+          lo_syntax      TYPE REF TO zcl_abapgit_syntax_xml.
+ 
+ 
+    CREATE OBJECT lo_syntax.
+    lt_matches_act = lo_syntax->parse_line( iv_line ).
+ 
+    SORT lt_matches_act BY offset.
+ 
+    cl_abap_unit_assert=>assert_equals( exp = mt_after_parse
+                                        act = lt_matches_act
+                                        msg = | Error during parsing: { iv_line }| ).
+ 
+    lo_syntax->order_matches( EXPORTING iv_line    = iv_line
+                       CHANGING  ct_matches = lt_matches_act ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = mt_after_order
+                                        act = lt_matches_act
+                                        msg = | Error during ordering: { iv_line }| ).
+ 
+    lo_syntax->extend_matches(
+      EXPORTING
+        iv_line    = iv_line
+      CHANGING
+        ct_matches = lt_matches_act ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = mt_after_extend
+                                        act = lt_matches_act
+                                        msg = | Error during extending: { iv_line }| ).
+ 
+    " Check consistency
+    lv_offs = 0.
+    LOOP AT lt_matches_act INTO ls_match.
+      IF ls_match-offset <> lv_offs.
+        cl_abap_unit_assert=>assert_equals( exp = lv_offs
+                                            act = ls_match-offset
+                                            msg = | Error during consistency check: { sy-tabix }| ).
+      ENDIF.
+      lv_offs = lv_offs + ls_match-length.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD generate_parse.
+    DATA ls_match TYPE zcl_abapgit_syntax_xml=>ty_match.
+ 
+    ls_match-token    = iv_token.
+    ls_match-offset   = iv_offset.
+    ls_match-length   = iv_length.
+    APPEND ls_match TO mt_after_parse.
+  ENDMETHOD.
+ 
+  METHOD generate_order.
+    DATA ls_match TYPE zcl_abapgit_syntax_xml=>ty_match.
+ 
+    ls_match-token    = iv_token.
+    ls_match-offset   = iv_offset.
+    ls_match-length   = iv_length.
+    ls_match-text_tag = iv_text_tag.
+    APPEND ls_match TO mt_after_order.
+  ENDMETHOD.
+ 
+  METHOD generate_extend.
+    DATA ls_match TYPE zcl_abapgit_syntax_xml=>ty_match.
+ 
+    ls_match-token    = iv_token.
+    ls_match-offset   = iv_offset.
+    ls_match-length   = iv_length.
+    ls_match-text_tag = iv_text_tag.
+    APPEND ls_match TO mt_after_extend.
+  ENDMETHOD.
+ 
+********************************************************
+* Test parsing and ordering of tags in xml             *
+********************************************************
+  METHOD test_xml_01.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = '<tag>Text</tag>'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 4
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 9
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 14
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+ 
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 0
+                    iv_length   = 5
+                    iv_text_tag = '<' ).
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 9
+                    iv_length   = 6
+                    iv_text_tag = '<' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 0
+                     iv_length   = 5
+                     iv_text_tag = '<' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 5
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 9
+                     iv_length   = 6
+                     iv_text_tag = '<' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_xml_02.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = '<tag/>'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 5
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 0
+                    iv_length   = 6
+                    iv_text_tag = '<' ).
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 0
+                     iv_length   = 6
+                     iv_text_tag = '<' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_xml_03.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = '<tag attribute="value"/>'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'A'
+                    iv_offset = 4
+                    iv_length = 10 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 15
+                    iv_length = 7 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 23
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 0
+                    iv_length   = 4
+                    iv_text_tag = '<' ).
+    generate_order( iv_token    = 'A'
+                    iv_offset   = 4
+                    iv_length   = 10
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'V'
+                    iv_offset   = 15
+                    iv_length   = 7
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 22
+                    iv_length   = 2
+                    iv_text_tag = '>' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 0
+                     iv_length   = 4
+                     iv_text_tag = '<' ).
+    generate_extend( iv_token    = 'A'
+                     iv_offset   = 4
+                     iv_length   = 10
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 14
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'V'
+                     iv_offset   = 15
+                     iv_length   = 7
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 22
+                     iv_length   = 2
+                     iv_text_tag = '>' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_xml_04.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = '<?xml version="1.0"?>'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'A'
+                    iv_offset = 5
+                    iv_length = 8 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 14
+                    iv_length = 5 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 20
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 0
+                    iv_length   = 5
+                    iv_text_tag = '<' ).
+    generate_order( iv_token    = 'A'
+                    iv_offset   = 5
+                    iv_length   = 8
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'V'
+                    iv_offset   = 14
+                    iv_length   = 5
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 19
+                    iv_length   = 2
+                    iv_text_tag = '>' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 0
+                     iv_length   = 5
+                     iv_text_tag = '<' ).
+    generate_extend( iv_token    = 'A'
+                     iv_offset   = 5
+                     iv_length   = 8
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 13
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'V'
+                     iv_offset   = 14
+                     iv_length   = 5
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 19
+                     iv_length   = 2
+                     iv_text_tag = '>' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_xml_05.
+ 
+    DATA lv_line TYPE string.
+ 
+    lv_line = '<ns:tag ns:a1="v1" ns:a2=''v2''>"text"</ns:tag>'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'A'
+                    iv_offset = 7
+                    iv_length = 6 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 14
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'A'
+                    iv_offset = 18
+                    iv_length = 6 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 25
+                    iv_length = 4 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 29
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 30
+                    iv_length = 6 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 36
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 44
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 0
+                    iv_length   = 7
+                    iv_text_tag = '<' ).
+    generate_order( iv_token    = 'A'
+                    iv_offset   = 7
+                    iv_length   = 6
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'V'
+                    iv_offset   = 14
+                    iv_length   = 4
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'A'
+                    iv_offset   = 18
+                    iv_length   = 6
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'V'
+                    iv_offset   = 25
+                    iv_length   = 4
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 29
+                    iv_length   = 1
+                    iv_text_tag = '>' ).
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 36
+                    iv_length   = 9
+                    iv_text_tag = '<' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 0
+                     iv_length   = 7
+                     iv_text_tag = '<' ).
+    generate_extend( iv_token    = 'A'
+                     iv_offset   = 7
+                     iv_length   = 6
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 13
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'V'
+                     iv_offset   = 14
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'A'
+                     iv_offset   = 18
+                     iv_length   = 6
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 24
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'V'
+                     iv_offset   = 25
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 29
+                     iv_length   = 1
+                     iv_text_tag = '>' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 30
+                     iv_length   = 6
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 36
+                     iv_length   = 9
+                     iv_text_tag = '<' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_xml_06.
+    DATA lv_line TYPE string.
+ 
+    "unclosed tag
+    lv_line = '<ns:tag ns:a1="v1"'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'A'
+                    iv_offset = 7
+                    iv_length = 6 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 14
+                    iv_length = 4 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 0
+                    iv_length   = 7
+                    iv_text_tag = '<' ).
+    generate_order( iv_token    = 'A'
+                    iv_offset   = 7
+                    iv_length   = 6
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'V'
+                    iv_offset   = 14
+                    iv_length   = 4
+                    iv_text_tag = '' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 0
+                     iv_length   = 7
+                     iv_text_tag = '<' ).
+    generate_extend( iv_token    = 'A'
+                     iv_offset   = 7
+                     iv_length   = 6
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 13
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'V'
+                     iv_offset   = 14
+                     iv_length   = 4
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_xml_07.
+    "invalid XML characters in a string
+    DATA lv_line TYPE string.
+ 
+    "xml special characters in attribute
+    lv_line = '<tag attribute=" '' > "/>'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'A'
+                    iv_offset = 4
+                    iv_length = 10 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 15
+                    iv_length = 7 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 23
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 0
+                    iv_length   = 4
+                    iv_text_tag = '<' ).
+    generate_order( iv_token    = 'A'
+                    iv_offset   = 4
+                    iv_length   = 10
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'V'
+                    iv_offset   = 15
+                    iv_length   = 7
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 22
+                    iv_length   = 2
+                    iv_text_tag = '>' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 0
+                     iv_length   = 4
+                     iv_text_tag = '<' ).
+    generate_extend( iv_token    = 'A'
+                     iv_offset   = 4
+                     iv_length   = 10
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 14
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'V'
+                     iv_offset   = 15
+                     iv_length   = 7
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 22
+                     iv_length   = 2
+                     iv_text_tag = '>' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_xml_08.
+    "invalid XML characters in a string
+    DATA lv_line TYPE string.
+ 
+    "attribute at beginning of line
+    lv_line = 'attribute=''>" '''.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'A'
+                    iv_offset = 0
+                    iv_length = 9 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 10
+                    iv_length = 5 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'A'
+                    iv_offset   = 0
+                    iv_length   = 9
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'V'
+                    iv_offset   = 10
+                    iv_length   = 5
+                    iv_text_tag = '' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'A'
+                     iv_offset   = 0
+                     iv_length   = 9
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 9
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'V'
+                     iv_offset   = 10
+                     iv_length   = 5
+                     iv_text_tag = '' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_xml_09.
+    "back quotes used for attribute values (HTML)
+    DATA lv_line TYPE string.
+ 
+    lv_line = '<tag attribute=`value`/>'.
+ 
+    " Generate table with expected values after parsing
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 0
+                    iv_length = 1 ).
+    generate_parse( iv_token  = 'A'
+                    iv_offset = 4
+                    iv_length = 10 ).
+    generate_parse( iv_token  = 'V'
+                    iv_offset = 15
+                    iv_length = 7 ).
+    generate_parse( iv_token  = 'X'
+                    iv_offset = 23
+                    iv_length = 1 ).
+ 
+    " Generate table with expected values after ordering
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 0
+                    iv_length   = 4
+                    iv_text_tag = '<' ).
+    generate_order( iv_token    = 'A'
+                    iv_offset   = 4
+                    iv_length   = 10
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'V'
+                    iv_offset   = 15
+                    iv_length   = 7
+                    iv_text_tag = '' ).
+    generate_order( iv_token    = 'X'
+                    iv_offset   = 22
+                    iv_length   = 2
+                    iv_text_tag = '>' ).
+ 
+    " Generate table with expected values after extending
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 0
+                     iv_length   = 4
+                     iv_text_tag = '<' ).
+    generate_extend( iv_token    = 'A'
+                     iv_offset   = 4
+                     iv_length   = 10
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = '.'
+                     iv_offset   = 14
+                     iv_length   = 1
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'V'
+                     iv_offset   = 15
+                     iv_length   = 7
+                     iv_text_tag = '' ).
+    generate_extend( iv_token    = 'X'
+                     iv_offset   = 22
+                     iv_length   = 2
+                     iv_text_tag = '>' ).
+ 
+    do_test( lv_line ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/index.html b/src/ui/core/index.html new file mode 100644 index 00000000000..7912166e679 --- /dev/null +++ b/src/ui/core/index.html @@ -0,0 +1,371 @@ + + + + + + Code coverage report for src/ui/core + + + + + + + + + +
+
+

All files src/ui/core

+
+ +
+ 89.76% + Statements + 3262/3634 +
+ + +
+ 85.4% + Branches + 117/137 +
+ + +
+ 67.1% + Functions + 51/76 +
+ + +
+ 89.76% + Lines + 3262/3634 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_gui.clas.abap +
+
62.91%363/577100%0/00%0/1162.91%363/577
zcl_abapgit_gui_asset_manager.clas.abap +
+
95.48%169/17770%14/20100%1/195.48%169/177
zcl_abapgit_gui_asset_manager.clas.testclasses.abap +
+
100%168/168100%6/6100%6/6100%168/168
zcl_abapgit_gui_css_processor.clas.abap +
+
98.78%162/16490%9/10100%2/298.78%162/164
zcl_abapgit_gui_css_processor.clas.testclasses.abap +
+
100%292/292100%11/11100%11/11100%292/292
zcl_abapgit_gui_event.clas.abap +
+
98.05%101/1030%0/1100%0/098.05%101/103
zcl_abapgit_gui_event.clas.testclasses.abap +
+
100%165/165100%5/5100%5/5100%165/165
zcl_abapgit_gui_hotkey_ctl.clas.abap +
+
87.85%188/214100%0/00%0/387.85%188/214
zcl_abapgit_gui_html_processor.clas.abap +
+
99.45%184/18590.9%10/11100%3/399.45%184/185
zcl_abapgit_gui_html_processor.clas.testclasses.abap +
+
99.14%231/233100%6/675%6/899.14%231/233
zcl_abapgit_gui_utils.clas.abap +
+
100%48/48100%2/2100%0/0100%48/48
zcl_abapgit_gui_utils.clas.testclasses.abap +
+
100%63/63100%2/2100%2/2100%63/63
zcl_abapgit_html.clas.abap +
+
97.35%552/56775.55%34/45100%1/197.35%552/567
zcl_abapgit_html.clas.testclasses.abap +
+
100%242/242100%11/11100%11/11100%242/242
zcl_abapgit_html_parts.clas.abap +
+
100%109/109100%6/6100%2/2100%109/109
zcl_abapgit_html_parts.clas.testclasses.abap +
+
100%89/89100%1/1100%1/1100%89/89
zcl_abapgit_html_viewer_gui.clas.abap +
+
46.87%90/192100%0/00%0/946.87%90/192
zcx_abapgit_cancel.clas.abap +
+
100%46/46100%0/0100%0/0100%46/46
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui.clas.abap.html b/src/ui/core/zcl_abapgit_gui.clas.abap.html new file mode 100644 index 00000000000..218fa9be239 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui.clas.abap.html @@ -0,0 +1,1816 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui.clas.abap

+
+ +
+ 62.91% + Statements + 363/577 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/11 +
+ + +
+ 62.91% + Lines + 363/577 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +5781x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_gui DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_services .
+ 
+    CONSTANTS:
+      BEGIN OF c_event_state,
+        not_handled         TYPE i VALUE 0,
+        re_render           TYPE i VALUE 1,
+        new_page            TYPE i VALUE 2,
+        go_back             TYPE i VALUE 3,
+        no_more_act         TYPE i VALUE 4,
+        new_page_w_bookmark TYPE i VALUE 5,
+        go_back_to_bookmark TYPE i VALUE 6,
+        new_page_replacing  TYPE i VALUE 7,
+      END OF c_event_state .
+    METHODS go_home
+      IMPORTING
+        iv_action TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS back
+      IMPORTING
+        !iv_to_bookmark TYPE abap_bool DEFAULT abap_false
+        !iv_graceful    TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_exit)  TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS back_graceful
+      RETURNING
+        VALUE(rv_handled) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS on_event
+      FOR EVENT sapevent OF zif_abapgit_html_viewer
+      IMPORTING
+        !action
+        !frame
+        !getdata
+        !postdata
+        !query_table .
+    METHODS constructor
+      IMPORTING
+        !io_component         TYPE REF TO object OPTIONAL
+        !ii_asset_man         TYPE REF TO zif_abapgit_gui_asset_manager OPTIONAL
+        !ii_hotkey_ctl        TYPE REF TO zif_abapgit_gui_hotkey_ctl OPTIONAL
+        !ii_html_processor    TYPE REF TO zif_abapgit_gui_html_processor OPTIONAL
+        !iv_rollback_on_error TYPE abap_bool DEFAULT abap_true
+      RAISING
+        zcx_abapgit_exception .
+    METHODS free .
+    METHODS set_focus
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_page_stack,
+        page     TYPE REF TO zif_abapgit_gui_renderable,
+        bookmark TYPE abap_bool,
+      END OF ty_page_stack .
+ 
+    DATA mv_rollback_on_error TYPE abap_bool .
+    DATA mi_cur_page TYPE REF TO zif_abapgit_gui_renderable .
+    DATA mt_stack             TYPE STANDARD TABLE OF ty_page_stack .
+    DATA mt_event_handlers    TYPE STANDARD TABLE OF REF TO zif_abapgit_gui_event_handler .
+    DATA mi_router TYPE REF TO zif_abapgit_gui_event_handler .
+    DATA mi_asset_man TYPE REF TO zif_abapgit_gui_asset_manager .
+    DATA mi_hotkey_ctl TYPE REF TO zif_abapgit_gui_hotkey_ctl .
+    DATA mi_html_processor TYPE REF TO zif_abapgit_gui_html_processor .
+    DATA mi_html_viewer TYPE REF TO zif_abapgit_html_viewer .
+    DATA mo_html_parts TYPE REF TO zcl_abapgit_html_parts .
+    DATA mi_common_log TYPE REF TO zif_abapgit_log .
+ 
+ 
+    METHODS cache_html
+      IMPORTING
+        !iv_text      TYPE string
+      RETURNING
+        VALUE(rv_url) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS startup
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render
+      RAISING
+        zcx_abapgit_exception .
+    METHODS call_page
+      IMPORTING
+        !ii_page          TYPE REF TO zif_abapgit_gui_renderable
+        !iv_with_bookmark TYPE abap_bool DEFAULT abap_false
+        !iv_replacing     TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+    METHODS handle_action
+      IMPORTING
+        !iv_action   TYPE c
+        !iv_getdata  TYPE c OPTIONAL
+        !it_postdata TYPE zif_abapgit_html_viewer=>ty_post_data OPTIONAL .
+    METHODS handle_error
+      IMPORTING
+        !ix_exception TYPE REF TO zcx_abapgit_exception .
+    METHODS is_page_modal
+      IMPORTING
+        !ii_page      TYPE REF TO zif_abapgit_gui_renderable
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI IMPLEMENTATION.
+ 
+ 
+  METHOD back.
+ 
+    DATA lv_index TYPE i.
+    DATA ls_stack LIKE LINE OF mt_stack.
+ 
+    " If viewer is showing Internet page, then use browser navigation
+    IF mi_html_viewer->get_url( ) CP 'http*'.
+      mi_html_viewer->back( ).
+      RETURN.
+    ENDIF.
+ 
+    lv_index = lines( mt_stack ).
+ 
+    IF lv_index = 0.
+      rv_exit = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_graceful = abap_true AND back_graceful( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    DO lv_index TIMES.
+      READ TABLE mt_stack INDEX lv_index INTO ls_stack.
+      ASSERT sy-subrc = 0.
+ 
+      DELETE mt_stack INDEX lv_index.
+      ASSERT sy-subrc = 0.
+ 
+      lv_index = lv_index - 1.
+ 
+      IF iv_to_bookmark = abap_false OR ls_stack-bookmark = abap_true.
+        EXIT.
+      ENDIF.
+    ENDDO.
+ 
+    mi_cur_page = ls_stack-page. " last page always stays
+    render( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD back_graceful.
+ 
+    DATA li_handler TYPE REF TO zif_abapgit_gui_event_handler.
+    DATA ls_handled TYPE zif_abapgit_gui_event_handler=>ty_handling_result.
+ 
+    " This code can be potentially improved
+    " Why send go_back to the topmost handler only ? It makes sense to notify the whole stack
+    " But than how to handle re-render ? render if at least one handler asks for it ?
+    " Probably that's the way but needs a relevant example. Postponed arch decision.
+    READ TABLE mt_event_handlers INTO li_handler INDEX 1.
+    IF sy-subrc = 0.
+      ls_handled = li_handler->on_event( zcl_abapgit_gui_event=>new(
+        iv_action       = zif_abapgit_definitions=>c_action-go_back
+        ii_gui_services = me ) ).
+      IF ls_handled-state = c_event_state-re_render. " soft exit, probably popup
+        render( ).
+        rv_handled = abap_true.
+      ELSEIF ls_handled-state = c_event_state-no_more_act. " soft exit, probably GUI popup
+        rv_handled = abap_true.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD cache_html.
+ 
+    rv_url = zif_abapgit_gui_services~cache_asset(
+      iv_text    = iv_text
+      iv_type    = 'text'
+      iv_subtype = 'html' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD call_page.
+
+    DATA: ls_stack TYPE ty_page_stack.
+
+    IF iv_replacing = abap_false AND NOT mi_cur_page IS INITIAL.
+      ls_stack-page     = mi_cur_page.
+      ls_stack-bookmark = iv_with_bookmark.
+      APPEND ls_stack TO mt_stack.
+    ENDIF.
+
+    mi_cur_page = ii_page.
+    render( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    IF io_component IS BOUND.
+      IF zcl_abapgit_gui_utils=>is_renderable( io_component ) = abap_true.
+        mi_cur_page ?= io_component. " direct page
+      ELSE.
+        IF zcl_abapgit_gui_utils=>is_event_handler( io_component ) = abap_false.
+          zcx_abapgit_exception=>raise( 'Component must be renderable or be an event handler' ).
+        ENDIF.
+        mi_router ?= io_component.
+      ENDIF.
+    ENDIF.
+ 
+    CREATE OBJECT mo_html_parts.
+ 
+    mv_rollback_on_error = iv_rollback_on_error.
+    mi_asset_man      = ii_asset_man.
+    mi_hotkey_ctl     = ii_hotkey_ctl.
+    mi_html_processor = ii_html_processor. " Maybe improve to middlewares stack ??
+    startup( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD free.
+
+    SET HANDLER on_event FOR mi_html_viewer ACTIVATION space.
+    mi_html_viewer->close_document( ).
+    mi_html_viewer->free( ).
+    FREE mi_html_viewer.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD go_home.
+
+    DATA: ls_stack LIKE LINE OF mt_stack,
+          lv_mode  TYPE tabname.
+
+    IF mi_router IS BOUND.
+      CLEAR: mt_stack, mt_event_handlers.
+      APPEND mi_router TO mt_event_handlers.
+
+      on_event( action = |{ iv_action }| ).
+    ELSE.
+      IF lines( mt_stack ) > 0.
+        READ TABLE mt_stack INTO ls_stack INDEX 1.
+        mi_cur_page = ls_stack-page.
+      ENDIF.
+      render( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_action.
+
+    DATA:
+      lx_exception TYPE REF TO zcx_abapgit_exception,
+      li_handler   TYPE REF TO zif_abapgit_gui_event_handler,
+      li_event     TYPE REF TO zif_abapgit_gui_event,
+      ls_handled   TYPE zif_abapgit_gui_event_handler=>ty_handling_result.
+
+    CREATE OBJECT li_event TYPE zcl_abapgit_gui_event
+      EXPORTING
+        ii_gui_services = me
+        iv_action       = iv_action
+        iv_getdata      = iv_getdata
+        it_postdata     = it_postdata.
+
+    TRY.
+        LOOP AT mt_event_handlers INTO li_handler.
+          ls_handled = li_handler->on_event( li_event ).
+          IF ls_handled-state IS NOT INITIAL AND ls_handled-state <> c_event_state-not_handled. " is handled
+            EXIT.
+          ENDIF.
+        ENDLOOP.
+
+        IF is_page_modal( mi_cur_page ) = abap_true AND NOT (
+          ls_handled-state = c_event_state-re_render OR
+          ls_handled-state = c_event_state-go_back OR
+          ls_handled-state = c_event_state-no_more_act ).
+          " Restrict new page switching from modals
+          ls_handled-state = c_event_state-no_more_act.
+        ENDIF.
+
+        CASE ls_handled-state.
+          WHEN c_event_state-re_render.
+            render( ).
+          WHEN c_event_state-new_page.
+            call_page( ls_handled-page ).
+          WHEN c_event_state-new_page_w_bookmark.
+            call_page(
+              ii_page = ls_handled-page
+              iv_with_bookmark = abap_true ).
+          WHEN c_event_state-new_page_replacing.
+            call_page(
+              ii_page = ls_handled-page
+              iv_replacing = abap_true ).
+          WHEN c_event_state-go_back.
+            back( ).
+          WHEN c_event_state-go_back_to_bookmark.
+            back( iv_to_bookmark = abap_true ).
+          WHEN c_event_state-no_more_act.
+            " Do nothing, handling completed
+          WHEN OTHERS.
+            zcx_abapgit_exception=>raise( |Unknown action: { iv_action }| ).
+        ENDCASE.
+
+      CATCH zcx_abapgit_cancel ##NO_HANDLER.
+        " Do nothing = gc_event_state-no_more_act
+      CATCH zcx_abapgit_exception INTO lx_exception.
+        handle_error( lx_exception ).
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_error.
+
+    DATA: li_gui_error_handler TYPE REF TO zif_abapgit_gui_error_handler,
+          lx_exception         TYPE REF TO cx_root.
+
+    IF mv_rollback_on_error = abap_true.
+      ROLLBACK WORK.
+    ENDIF.
+
+    TRY.
+        li_gui_error_handler ?= mi_cur_page.
+
+        IF li_gui_error_handler IS BOUND AND li_gui_error_handler->handle_error( ix_exception ) = abap_true.
+          " We rerender the current page to display the error box
+          render( ).
+        ELSEIF ix_exception->mi_log IS BOUND.
+          mi_common_log = ix_exception->mi_log.
+          IF mi_common_log->get_log_level( ) >= zif_abapgit_log=>c_log_level-warning.
+            zcl_abapgit_log_viewer=>show_log( mi_common_log ).
+          ENDIF.
+        ELSE.
+          MESSAGE ix_exception TYPE 'S' DISPLAY LIKE 'E'.
+        ENDIF.
+
+      CATCH zcx_abapgit_exception cx_sy_move_cast_error INTO lx_exception.
+        " In case of fire we just fallback to plain old message
+        MESSAGE lx_exception TYPE 'S' DISPLAY LIKE 'E'.
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD is_page_modal.
+ 
+    DATA li_modal TYPE REF TO zif_abapgit_gui_modal.
+ 
+    TRY.
+        IF ii_page IS BOUND.
+          li_modal ?= ii_page.
+          rv_yes = li_modal->is_modal( ).
+        ENDIF.
+      CATCH cx_sy_move_cast_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD on_event.
+
+    handle_action(
+      iv_action   = action
+      iv_getdata  = getdata
+      it_postdata = postdata ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render.
+
+    DATA: lv_url  TYPE string,
+          lv_html TYPE string,
+          li_html TYPE REF TO zif_abapgit_html.
+
+    IF mi_cur_page IS NOT BOUND.
+      zcx_abapgit_exception=>raise( 'GUI error: no current page' ).
+    ENDIF.
+
+    CLEAR mt_event_handlers.
+    mo_html_parts->clear( ).
+
+    IF mi_router IS BOUND AND is_page_modal( mi_cur_page ) = abap_false.
+      " No global commands in modals
+      APPEND mi_router TO mt_event_handlers.
+    ENDIF.
+
+    IF mi_hotkey_ctl IS BOUND.
+      mi_hotkey_ctl->reset( ).
+    ENDIF.
+
+    li_html = mi_cur_page->render( ).
+    lv_html = li_html->render( iv_no_indent_jscss = abap_true ).
+
+    IF mi_html_processor IS BOUND.
+      lv_html = mi_html_processor->process(
+        iv_html         = lv_html
+        ii_gui_services = me ).
+    ENDIF.
+
+    lv_url = cache_html( lv_html ).
+    mi_html_viewer->show_url( lv_url ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_focus.
+    mi_html_viewer->set_focus( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD startup.
+
+    DATA: lt_events TYPE cntl_simple_events,
+          ls_event  LIKE LINE OF lt_events,
+          lt_assets TYPE zif_abapgit_gui_asset_manager=>ty_web_assets.
+
+    FIELD-SYMBOLS <ls_asset> LIKE LINE OF lt_assets.
+
+
+    mi_html_viewer = zcl_abapgit_ui_factory=>get_html_viewer( ).
+
+    IF mi_asset_man IS BOUND.
+      lt_assets = mi_asset_man->get_all_assets( ).
+      LOOP AT lt_assets ASSIGNING <ls_asset> WHERE is_cacheable = abap_true.
+        zif_abapgit_gui_services~cache_asset(
+          iv_xdata   = <ls_asset>-content
+          iv_url     = <ls_asset>-url
+          iv_type    = <ls_asset>-type
+          iv_subtype = <ls_asset>-subtype ).
+      ENDLOOP.
+    ENDIF.
+
+    ls_event-eventid    = mi_html_viewer->m_id_sapevent.
+    ls_event-appl_event = abap_true.
+    APPEND ls_event TO lt_events.
+
+    mi_html_viewer->set_registered_events( lt_events ).
+    SET HANDLER on_event FOR mi_html_viewer.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~cache_asset.
+ 
+    TYPES ty_hex TYPE x LENGTH 200.
+    TYPES ty_char TYPE c LENGTH 200.
+ 
+    DATA: lt_xdata TYPE STANDARD TABLE OF ty_hex WITH DEFAULT KEY,
+          lv_size  TYPE i,
+          lt_html  TYPE STANDARD TABLE OF ty_char WITH DEFAULT KEY.
+ 
+    ASSERT iv_text IS SUPPLIED OR iv_xdata IS SUPPLIED.
+ 
+    IF iv_text IS SUPPLIED. " String input
+      zcl_abapgit_convert=>string_to_tab(
+         EXPORTING
+           iv_str  = iv_text
+         IMPORTING
+           ev_size = lv_size
+           et_tab  = lt_html ).
+ 
+      mi_html_viewer->load_data(
+        EXPORTING
+          iv_type         = iv_type
+          iv_subtype      = iv_subtype
+          iv_size         = lv_size
+          iv_url          = iv_url
+        IMPORTING
+          ev_assigned_url = rv_url
+        CHANGING
+          ct_data_table   = lt_html ).
+    ELSE. " Raw input
+      zcl_abapgit_convert=>xstring_to_bintab(
+        EXPORTING
+          iv_xstr   = iv_xdata
+        IMPORTING
+          ev_size   = lv_size
+          et_bintab = lt_xdata ).
+ 
+      mi_html_viewer->load_data(
+        EXPORTING
+          iv_type         = iv_type
+          iv_subtype      = iv_subtype
+          iv_size         = lv_size
+          iv_url          = iv_url
+        IMPORTING
+          ev_assigned_url = rv_url
+        CHANGING
+          ct_data_table   = lt_xdata ).
+    ENDIF.
+ 
+    ASSERT sy-subrc = 0. " Image data error
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~get_current_page_name.
+ 
+    DATA li_page_hoc TYPE REF TO zcl_abapgit_gui_page_hoc.
+ 
+    IF mi_cur_page IS BOUND.
+      rv_page_name = cl_abap_classdescr=>describe_by_object_ref( mi_cur_page )->get_relative_name( ).
+ 
+      " For HOC components return name of child component instead
+      IF rv_page_name = 'ZCL_ABAPGIT_GUI_PAGE_HOC'.
+        li_page_hoc ?= mi_cur_page.
+        IF li_page_hoc->get_child( ) IS BOUND.
+          rv_page_name = cl_abap_classdescr=>describe_by_object_ref(
+                           li_page_hoc->get_child( ) )->get_relative_name( ).
+        ENDIF.
+      ENDIF.
+    ENDIF." ELSE - return is empty => initial page
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~get_hotkeys_ctl.
+    ri_hotkey_ctl = mi_hotkey_ctl.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~get_html_parts.
+    ro_parts = mo_html_parts.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~get_log.
+ 
+    IF iv_create_new = abap_true OR mi_common_log IS NOT BOUND.
+      CREATE OBJECT mi_common_log TYPE zcl_abapgit_log.
+    ENDIF.
+ 
+    ri_log = mi_common_log.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~register_event_handler.
+    ASSERT ii_event_handler IS BOUND.
+    INSERT ii_event_handler INTO mt_event_handlers INDEX 1.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_services~register_page_asset.
+
+    " Maybe forbid registering cachable existing assets, maybe this is the right place (see also asset_man commments)
+
+    mi_asset_man->register_asset(
+      iv_url = iv_url
+      iv_type = iv_type
+      iv_mime_name = iv_mime_name
+      iv_inline = iv_inline
+      " This registering will happen after initialization so all cachable already cached
+      iv_cachable = abap_false ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_asset_manager.clas.abap.html b/src/ui/core/zcl_abapgit_gui_asset_manager.clas.abap.html new file mode 100644 index 00000000000..4f994ceddf3 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_asset_manager.clas.abap.html @@ -0,0 +1,616 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_asset_manager.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_asset_manager.clas.abap

+
+ +
+ 95.48% + Statements + 169/177 +
+ + +
+ 70% + Branches + 14/20 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 95.48% + Lines + 169/177 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +1781x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +21x +21x +1x +  +20x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +34x +34x +34x +34x +34x +34x +34x +34x +2x +34x +30x +30x +34x +34x +34x +34x +34x +34x +1x + 
CLASS zcl_abapgit_gui_asset_manager DEFINITION PUBLIC FINAL CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_asset_manager.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_asset_manager) TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_asset_entry.
+        INCLUDE TYPE zif_abapgit_gui_asset_manager~ty_web_asset.
+    TYPES: mime_name TYPE wwwdatatab-objid,
+      END OF ty_asset_entry.
+    TYPES:
+      ty_asset_register TYPE STANDARD TABLE OF ty_asset_entry WITH KEY url.
+ 
+    DATA mt_asset_register TYPE ty_asset_register.
+ 
+    METHODS get_mime_asset
+      IMPORTING
+        iv_mime_name    TYPE c
+      RETURNING
+        VALUE(rv_xdata) TYPE xstring
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS load_asset
+      IMPORTING
+        is_asset_entry  TYPE ty_asset_entry
+      RETURNING
+        VALUE(rs_asset) TYPE zif_abapgit_gui_asset_manager~ty_web_asset
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_asset_manager IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ri_asset_manager TYPE zcl_abapgit_gui_asset_manager.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_mime_asset.
+ 
+    DATA: ls_key    TYPE wwwdatatab,
+          lv_size_c TYPE wwwparams-value,
+          lv_size   TYPE i,
+          lt_w3mime TYPE STANDARD TABLE OF w3mime,
+          ls_w3mime LIKE LINE OF lt_w3mime.
+ 
+    ls_key-relid = 'MI'.
+    ls_key-objid = iv_mime_name.
+ 
+    " Get exact file size
+    CALL FUNCTION 'WWWPARAMS_READ'
+      EXPORTING
+        relid            = ls_key-relid
+        objid            = ls_key-objid
+        name             = 'filesize'
+      IMPORTING
+        value            = lv_size_c
+      EXCEPTIONS
+        entry_not_exists = 1.
+ 
+    IF sy-subrc IS NOT INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_size = lv_size_c.
+ 
+    " Get binary data
+    CALL FUNCTION 'WWWDATA_IMPORT'
+      EXPORTING
+        key               = ls_key
+      TABLES
+        mime              = lt_w3mime
+      EXCEPTIONS
+        wrong_object_type = 1
+        import_error      = 2.
+ 
+    IF sy-subrc IS NOT INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    LOOP AT lt_w3mime INTO ls_w3mime.
+      CONCATENATE rv_xdata ls_w3mime-line INTO rv_xdata IN BYTE MODE.
+    ENDLOOP.
+    rv_xdata = rv_xdata(lv_size).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD load_asset.
+ 
+    MOVE-CORRESPONDING is_asset_entry TO rs_asset.
+    IF rs_asset-content IS INITIAL AND is_asset_entry-mime_name IS NOT INITIAL.
+      " inline content has the priority
+      rs_asset-content = get_mime_asset( is_asset_entry-mime_name ).
+    ENDIF.
+    IF rs_asset-content IS INITIAL.
+      zcx_abapgit_exception=>raise( |failed to load GUI asset: { is_asset_entry-url }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_asset_manager~get_all_assets.
+ 
+    FIELD-SYMBOLS <ls_a> LIKE LINE OF mt_asset_register.
+ 
+    LOOP AT mt_asset_register ASSIGNING <ls_a>.
+      APPEND load_asset( <ls_a> ) TO rt_assets.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_asset_manager~get_asset.
+ 
+    FIELD-SYMBOLS <ls_a> LIKE LINE OF mt_asset_register.
+ 
+    READ TABLE mt_asset_register WITH KEY url = iv_url ASSIGNING <ls_a>.
+    IF <ls_a> IS NOT ASSIGNED.
+      zcx_abapgit_exception=>raise( |Cannot find GUI asset: { iv_url }| ).
+    ENDIF.
+    rs_asset = load_asset( <ls_a> ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_asset_manager~get_text_asset.
+ 
+    DATA ls_asset TYPE zif_abapgit_gui_asset_manager~ty_web_asset.
+    ls_asset = zif_abapgit_gui_asset_manager~get_asset( iv_url ).
+ 
+    IF ls_asset-type <> 'text'.
+      zcx_abapgit_exception=>raise( |Not a text asset: { iv_url }| ).
+    ENDIF.
+ 
+    IF iv_assert_subtype IS NOT INITIAL AND ls_asset-subtype <> iv_assert_subtype.
+      zcx_abapgit_exception=>raise( |Wrong subtype ({ iv_assert_subtype }): { iv_url }| ).
+    ENDIF.
+ 
+    rv_asset = zcl_abapgit_convert=>xstring_to_string_utf8( ls_asset-content ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_asset_manager~register_asset.
+ 
+    DATA ls_asset LIKE LINE OF mt_asset_register.
+ 
+    SPLIT iv_type AT '/' INTO ls_asset-type ls_asset-subtype.
+    ls_asset-url          = iv_url.
+    ls_asset-mime_name    = iv_mime_name.
+    ls_asset-is_cacheable = iv_cachable.
+    IF iv_base64 IS NOT INITIAL.
+      ls_asset-content = zcl_abapgit_convert=>base64_to_xstring( iv_base64 ).
+    ELSEIF iv_inline IS NOT INITIAL.
+      ls_asset-content = zcl_abapgit_convert=>string_to_xstring( iv_inline ).
+    ENDIF.
+ 
+    DELETE mt_asset_register WHERE url = iv_url.
+    " TODO: Maybe forbid averwriting cachable assets as they were probably already cached ... agrueable
+    APPEND ls_asset TO mt_asset_register.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_asset_manager.clas.testclasses.abap.html b/src/ui/core/zcl_abapgit_gui_asset_manager.clas.testclasses.abap.html new file mode 100644 index 00000000000..a38b63ecb66 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_asset_manager.clas.testclasses.abap.html @@ -0,0 +1,589 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_asset_manager.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_asset_manager.clas.testclasses.abap

+
+ +
+ 100% + Statements + 168/168 +
+ + +
+ 100% + Branches + 6/6 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 168/168 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +1691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_abapgit_gui_asset_manager DEFINITION
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS get_inline_asset FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS get_text_asset FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS get_mime_asset FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS get_base64_asset FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS get_all FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS register_and_overwrite FOR TESTING RAISING zcx_abapgit_exception.
+ENDCLASS.
+ 
+CLASS ltcl_abapgit_gui_asset_manager IMPLEMENTATION.
+ 
+  METHOD get_inline_asset.
+ 
+    DATA li_assetman TYPE REF TO zif_abapgit_gui_asset_manager.
+    DATA ls_asset TYPE zif_abapgit_gui_asset_manager=>ty_web_asset.
+ 
+    li_assetman = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    li_assetman->register_asset(
+      iv_url       = 'css/common.css'
+      iv_type      = 'text/css'
+      iv_inline    = 'ABC' ).
+ 
+    ls_asset = li_assetman->get_asset( 'css/common.css' ).
+ 
+    cl_abap_unit_assert=>assert_equals( act = ls_asset-type
+                                        exp = 'text' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_asset-subtype
+                                        exp = 'css' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_convert=>xstring_to_string_utf8( ls_asset-content )
+      exp = 'ABC' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_text_asset.
+ 
+    DATA li_assetman TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    li_assetman = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    li_assetman->register_asset(
+      iv_url       = 'css/common.css'
+      iv_type      = 'text/css'
+      iv_inline    = 'ABC' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_assetman->get_text_asset( 'css/common.css' )
+      exp = 'ABC' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_assetman->get_text_asset(
+        iv_url = 'css/common.css'
+        iv_assert_subtype = 'css' )
+      exp = 'ABC' ).
+ 
+    TRY.
+        li_assetman->get_text_asset(
+          iv_url = 'css/common.css'
+          iv_assert_subtype = 'xyz' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+        " no futher check
+    ENDTRY.
+ 
+    li_assetman->register_asset(
+      iv_url       = 'css/common.xyz'
+      iv_type      = 'nottext/bin'
+      iv_inline    = 'XYZ' ).
+ 
+    TRY.
+        li_assetman->get_text_asset( 'css/common.xyz' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+        " no futher check
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_mime_asset.
+ 
+    DATA li_assetman TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    li_assetman = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    li_assetman->register_asset(
+      iv_url       = 'css/common.css'
+      iv_type      = 'text/css'
+      iv_mime_name = 'ZABAPGIT_CSS_COMMON' ).
+ 
+    cl_abap_unit_assert=>assert_char_cp(
+      act = li_assetman->get_text_asset( 'css/common.css' )
+      exp = '*ABAPGIT COMMON CSS*' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_base64_asset.
+ 
+    DATA li_assetman TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    li_assetman = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    li_assetman->register_asset(
+      iv_url    = 'css/common.css'
+      iv_type   = 'text/css'
+      iv_base64 = 'QEE=' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_assetman->get_text_asset( 'css/common.css' )
+      exp = '@A' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_all.
+ 
+    DATA li_assetman TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    li_assetman = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    li_assetman->register_asset(
+      iv_url    = 'css/common.css'
+      iv_type   = 'text/css'
+      iv_base64 = 'QEE=' ).
+ 
+    li_assetman->register_asset(
+      iv_url    = 'css/common2.css'
+      iv_type   = 'text/css'
+      iv_inline = 'ABC' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( li_assetman->get_all_assets( ) )
+      exp = 2 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD register_and_overwrite.
+ 
+    DATA li_assetman TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    li_assetman = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    li_assetman->register_asset(
+      iv_url    = 'css/common.css'
+      iv_type   = 'text/css'
+      iv_inline = 'XYZ' ).
+ 
+    li_assetman->register_asset(
+      iv_url    = 'css/common.css'
+      iv_type   = 'text/css'
+      iv_inline = 'ABC' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( li_assetman->get_all_assets( ) )
+      exp = 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_assetman->get_text_asset( 'css/common.css' )
+      exp = 'ABC' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_css_processor.clas.abap.html b/src/ui/core/zcl_abapgit_gui_css_processor.clas.abap.html new file mode 100644 index 00000000000..56a4789e3c5 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_css_processor.clas.abap.html @@ -0,0 +1,577 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_css_processor.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_css_processor.clas.abap

+
+ +
+ 98.78% + Statements + 162/164 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 98.78% + Lines + 162/164 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +1651x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +16x +16x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +7x +7x +7x +7x +7x +7x +7x +2x +2x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +14x +14x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +12x +8x +8x +8x +8x +8x +8x +8x +12x +12x +12x +12x +  +  +12x +1x + 
CLASS zcl_abapgit_gui_css_processor DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor
+        IMPORTING
+          ii_asset_manager TYPE REF TO zif_abapgit_gui_asset_manager,
+      add_file
+        IMPORTING
+          iv_url TYPE string,
+      process
+        RETURNING
+          VALUE(rv_result) TYPE string
+        RAISING   zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_css_var,
+        name  TYPE string,
+        value TYPE string,
+      END OF ty_css_var,
+      ty_css_vars TYPE SORTED TABLE OF ty_css_var WITH UNIQUE KEY name.
+ 
+    METHODS:
+      get_css_vars_in_string
+        IMPORTING
+          iv_string           TYPE string
+        RETURNING
+          VALUE(rt_variables) TYPE ty_css_vars,
+      resolve_var_recursively
+        IMPORTING
+          iv_variable_name TYPE string
+        CHANGING
+          ct_variables     TYPE ty_css_vars
+        RAISING
+          zcx_abapgit_exception.
+    DATA:
+      mi_asset_manager TYPE REF TO zif_abapgit_gui_asset_manager,
+      mt_files         TYPE string_table.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_CSS_PROCESSOR IMPLEMENTATION.
+ 
+ 
+  METHOD add_file.
+    APPEND iv_url TO mt_files.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mi_asset_manager = ii_asset_manager.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_css_vars_in_string.
+    CONSTANTS: lc_root_pattern     TYPE string VALUE `:root\s*\{([^\}]*)\}`,
+               lc_variable_pattern TYPE string VALUE `\-\-([\w\d-]+)\s*:\s*([^\n\r;]*);`.
+    DATA: lv_root     TYPE string,
+          lo_matcher  TYPE REF TO cl_abap_matcher,
+          lo_regex    TYPE REF TO cl_abap_regex,
+          ls_variable LIKE LINE OF rt_variables.
+ 
+    " Only the :root element may define variables for now
+ 
+    FIND FIRST OCCURRENCE OF REGEX lc_root_pattern IN iv_string SUBMATCHES lv_root.
+    IF sy-subrc = 0 AND lv_root IS NOT INITIAL.
+      CREATE OBJECT lo_regex
+        EXPORTING
+          pattern = lc_variable_pattern.
+      lo_matcher = lo_regex->create_matcher( text = lv_root ).
+      WHILE lo_matcher->find_next( ) = abap_true.
+        ls_variable-name = lo_matcher->get_submatch( 1 ).
+        ls_variable-value = lo_matcher->get_submatch( 2 ).
+        INSERT ls_variable INTO TABLE rt_variables.
+        IF sy-subrc <> 0.
+          MODIFY TABLE rt_variables FROM ls_variable.
+        ENDIF.
+      ENDWHILE.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD process.
+    DATA:
+          lt_contents         TYPE STANDARD TABLE OF string,
+          lv_content          TYPE string,
+          lt_css_variables    TYPE ty_css_vars,
+          lt_css_vars_in_file TYPE ty_css_vars.
+    FIELD-SYMBOLS: <lv_url>          TYPE string,
+                   <ls_css_variable> LIKE LINE OF lt_css_vars_in_file,
+                   <lv_content>      LIKE LINE OF lt_contents.
+ 
+    " 1. Determine all variables and their values. Later definitions overwrite previous ones.
+    LOOP AT mt_files ASSIGNING <lv_url>.
+      lv_content = mi_asset_manager->get_text_asset(
+        iv_url = <lv_url>
+        iv_assert_subtype = 'css' ).
+ 
+      lt_css_vars_in_file = get_css_vars_in_string( lv_content ).
+ 
+      LOOP AT lt_css_vars_in_file ASSIGNING <ls_css_variable>.
+        INSERT <ls_css_variable> INTO TABLE lt_css_variables.
+        IF sy-subrc <> 0.
+          MODIFY TABLE lt_css_variables FROM <ls_css_variable>.
+        ENDIF.
+      ENDLOOP.
+ 
+      APPEND lv_content TO lt_contents.
+    ENDLOOP.
+ 
+    " 2. Replace all variable usages in variables
+    LOOP AT lt_css_variables ASSIGNING <ls_css_variable> WHERE value CS 'var(--'.
+      resolve_var_recursively( EXPORTING iv_variable_name = <ls_css_variable>-name
+                               CHANGING  ct_variables     = lt_css_variables ).
+    ENDLOOP.
+ 
+    " 3. Replace all other variable usages by inlining the values.
+    LOOP AT lt_contents ASSIGNING <lv_content>.
+      LOOP AT lt_css_variables ASSIGNING <ls_css_variable>.
+        REPLACE ALL OCCURRENCES OF |var(--{ <ls_css_variable>-name })|
+                IN <lv_content>
+                WITH <ls_css_variable>-value.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    rv_result = concat_lines_of( table = lt_contents
+                                 sep = cl_abap_char_utilities=>newline ).
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve_var_recursively.
+    CONSTANTS: lc_variable_usage_pattern TYPE string VALUE `var\(\-\-([^\)]*)\)`.
+    DATA: lv_variable_name  TYPE string.
+    FIELD-SYMBOLS: <ls_variable>       LIKE LINE OF ct_variables,
+                   <ls_other_variable> LIKE LINE OF ct_variables.
+ 
+    READ TABLE ct_variables WITH TABLE KEY name = iv_variable_name ASSIGNING <ls_variable>.
+    IF sy-subrc = 0.
+      DO.
+        FIND FIRST OCCURRENCE OF REGEX lc_variable_usage_pattern
+             IN <ls_variable>-value
+             SUBMATCHES lv_variable_name.
+        IF sy-subrc = 0.
+          resolve_var_recursively( EXPORTING iv_variable_name = lv_variable_name
+                                   CHANGING  ct_variables     = ct_variables ).
+          READ TABLE ct_variables WITH TABLE KEY name = lv_variable_name ASSIGNING <ls_other_variable>.
+          REPLACE FIRST OCCURRENCE OF |var(--{ lv_variable_name })|
+                  IN <ls_variable>-value
+                  WITH <ls_other_variable>-value.
+        ELSE.
+          EXIT.
+        ENDIF.
+      ENDDO.
+    ELSE.
+      zcx_abapgit_exception=>raise( |CSS variable { iv_variable_name } not resolveable| ).
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_css_processor.clas.testclasses.abap.html b/src/ui/core/zcl_abapgit_gui_css_processor.clas.testclasses.abap.html new file mode 100644 index 00000000000..04048809a5f --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_css_processor.clas.testclasses.abap.html @@ -0,0 +1,961 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_css_processor.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_css_processor.clas.testclasses.abap

+
+ +
+ 100% + Statements + 292/292 +
+ + +
+ 100% + Branches + 11/11 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 100% + Lines + 292/292 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +2931x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +9x +9x +1x +1x +10x +10x +10x +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test_base DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT ABSTRACT.
+  PUBLIC SECTION.
+  PROTECTED SECTION.
+    METHODS:
+      add_file IMPORTING iv_url     TYPE string
+                         iv_content TYPE string OPTIONAL
+               RAISING   zcx_abapgit_exception.
+    DATA:
+      mi_asset_manager TYPE REF TO zif_abapgit_gui_asset_manager,
+      mo_cut           TYPE REF TO zcl_abapgit_gui_css_processor.
+  PRIVATE SECTION.
+    METHODS:
+      setup.
+ENDCLASS.
+ 
+CLASS ltcl_test_base IMPLEMENTATION.
+  METHOD setup.
+    mi_asset_manager = zcl_abapgit_gui_asset_manager=>create( ).
+    CREATE OBJECT mo_cut
+      EXPORTING
+        ii_asset_manager = mi_asset_manager.
+  ENDMETHOD.
+ 
+  METHOD add_file.
+    mi_asset_manager->register_asset(
+      iv_url = iv_url
+      iv_type = 'text/css'
+      iv_inline = iv_content ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_single_file DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT INHERITING FROM ltcl_test_base.
+  PUBLIC SECTION.
+    METHODS:
+      test_file_exists FOR TESTING RAISING zcx_abapgit_exception,
+      test_file_does_not_exist FOR TESTING,
+      test_empty_file FOR TESTING RAISING zcx_abapgit_exception,
+      test_no_variables FOR TESTING RAISING zcx_abapgit_exception,
+      test_simple_variables FOR TESTING RAISING zcx_abapgit_exception,
+      test_complex_variables FOR TESTING RAISING zcx_abapgit_exception,
+      test_overwrite FOR TESTING RAISING zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+CLASS ltcl_single_file IMPLEMENTATION.
+  METHOD test_file_exists.
+    add_file( iv_url = 'does/exist.css'
+              iv_content = |body \{\}\n| ).
+    mo_cut->add_file( 'does/exist.css' ).
+    TRY.
+        mo_cut->process( ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD test_file_does_not_exist.
+    mo_cut->add_file( 'not/existing.css' ).
+    TRY.
+        mo_cut->process( ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD test_empty_file.
+    add_file( 'does/exist.css' ).
+    mo_cut->add_file( 'does/exist.css' ).
+    TRY.
+        mo_cut->process( ).
+        cl_abap_unit_assert=>fail( ). " Assetman fails on empty content
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD test_no_variables.
+    DATA: lv_content TYPE string.
+ 
+    lv_content =
+      `body {\n` &&
+      `  font-family: 'Arial', serif;\n` &&
+      `  background: #000000;\n` &&
+      `  color: #ffffff;\n` &&
+      `}\n`.
+    add_file( iv_url = 'novars.css'
+              iv_content = lv_content ).
+ 
+    mo_cut->add_file( 'novars.css' ).
+    cl_abap_unit_assert=>assert_equals( act = mo_cut->process( )
+                                        exp = lv_content ).
+  ENDMETHOD.
+ 
+  METHOD test_simple_variables.
+    DATA: lv_content  TYPE string,
+          lv_expected TYPE string.
+ 
+    lv_content =
+      `:root {\n` &&
+      `  --my-bg-color: #123456;\n` &&
+      `}\n` &&
+      `body {\n` &&
+      `  font-family: 'Arial', serif;\n` &&
+      `  background: var(--my-bg-color);\n` &&
+      `  color: #ffffff;\n` &&
+      `}\n`.
+    add_file( iv_url = 'simple.css'
+              iv_content = lv_content ).
+ 
+    lv_expected =
+      `:root {\n` &&
+      `  --my-bg-color: #123456;\n` &&
+      `}\n` &&
+      `body {\n` &&
+      `  font-family: 'Arial', serif;\n` &&
+      `  background: #123456;\n` &&
+      `  color: #ffffff;\n` &&
+      `}\n`.
+ 
+    mo_cut->add_file( 'simple.css' ).
+    cl_abap_unit_assert=>assert_equals( act = mo_cut->process( )
+                                        exp = lv_expected ).
+  ENDMETHOD.
+ 
+  METHOD test_complex_variables.
+    DATA: lv_content  TYPE string,
+          lv_expected TYPE string.
+ 
+    lv_content =
+      `:root {\n` &&
+      `  --primary-color: #0099FF;\n` &&
+      `  --dark-percentage: 15%;\n` &&
+      `  --primary-color-dark: calc(var(--primary-color) + var(--dark-percentage));\n` &&
+      `  --my-bg-color: var(--primary-color-dark);\n` &&
+      `}\n` &&
+      `body {\n` &&
+      `  font-family: 'Arial', serif;\n` &&
+      `  background: var(--my-bg-color);\n` &&
+      `  color: #ffffff;\n` &&
+      `}\n`.
+    add_file( iv_url = 'complex.css'
+              iv_content = lv_content ).
+ 
+    lv_expected =
+      `:root {\n` &&
+      `  --primary-color: #0099FF;\n` &&
+      `  --dark-percentage: 15%;\n` &&
+      `  --primary-color-dark: calc(#0099FF + 15%);\n` &&
+      `  --my-bg-color: calc(#0099FF + 15%);\n` &&
+      `}\n` &&
+      `body {\n` &&
+      `  font-family: 'Arial', serif;\n` &&
+      `  background: calc(#0099FF + 15%);\n` &&
+      `  color: #ffffff;\n` &&
+      `}\n`.
+ 
+    mo_cut->add_file( 'complex.css' ).
+    cl_abap_unit_assert=>assert_equals( act = mo_cut->process( )
+                                        exp = lv_expected ).
+  ENDMETHOD.
+ 
+  METHOD test_overwrite.
+    DATA: lv_content  TYPE string,
+          lv_expected TYPE string.
+ 
+    lv_content =
+      `:root {\n` &&
+      `  --var3: 5;\n` &&
+      `  --var1: var(--var2);\n` &&
+      `  --var2: var(--var3);\n` &&
+      `  --var3: 1;\n` &&
+      `}\n` &&
+      `body {\n` &&
+      `  width: var(--var1);\n` &&
+      `}\n`.
+    add_file( iv_url = 'overwrite.css'
+              iv_content = lv_content ).
+ 
+    lv_expected =
+      `:root {\n` &&
+      `  --var3: 5;\n` &&
+      `  --var1: 1;\n` &&
+      `  --var2: 1;\n` &&
+      `  --var3: 1;\n` &&
+      `}\n` &&
+      `body {\n` &&
+      `  width: 1;\n` &&
+      `}\n`.
+ 
+    mo_cut->add_file( 'overwrite.css' ).
+    cl_abap_unit_assert=>assert_equals( act = mo_cut->process( )
+                                        exp = lv_expected ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_multiple_files DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT INHERITING FROM ltcl_test_base.
+  PUBLIC SECTION.
+    METHODS:
+      test_simple FOR TESTING RAISING zcx_abapgit_exception,
+      test_overwrite FOR TESTING RAISING zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+CLASS ltcl_multiple_files IMPLEMENTATION.
+  METHOD test_simple.
+    DATA: lv_file1    TYPE string,
+          lv_file2    TYPE string,
+          lv_expected TYPE string.
+ 
+    lv_file1 =
+      `:root {\n` &&
+      `  --var2: var(--var3);\n` &&
+      `  --var3: 6;\n` &&
+      `}`.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_file1 WITH cl_abap_char_utilities=>newline.
+    add_file( iv_url = 'file1.css'
+              iv_content = lv_file1 ).
+    mo_cut->add_file( 'file1.css' ).
+ 
+    lv_file2 =
+      `:root {\n` &&
+      `  --var3: 19;\n` &&
+      `}`.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_file2 WITH cl_abap_char_utilities=>newline.
+    add_file( iv_url = 'file2.css'
+              iv_content = lv_file2 ).
+    mo_cut->add_file( 'file2.css' ).
+ 
+    lv_expected =
+      `:root {\n` &&
+      `  --var2: 19;\n` &&
+      `  --var3: 6;\n` &&
+      `}\n` &&
+      `:root {\n` &&
+      `  --var3: 19;\n` &&
+      `}`.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_expected WITH cl_abap_char_utilities=>newline.
+ 
+    cl_abap_unit_assert=>assert_equals( act = mo_cut->process( )
+                                        exp = lv_expected ).
+  ENDMETHOD.
+ 
+  METHOD test_overwrite.
+    DATA: lv_file1    TYPE string,
+          lv_file2    TYPE string,
+          lv_expected TYPE string.
+ 
+    lv_file1 =
+      `:root {\n` &&
+      `  --var3: 5;\n` &&
+      `  --var1: var(--var2);\n` &&
+      `  --var2: var(--var3);\n` &&
+      `  --var3: 6;\n` &&
+      `}\n` &&
+      `body {\n` &&
+      `  width: var(--var1);\n` &&
+      `}\n`.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_file1 WITH cl_abap_char_utilities=>newline.
+    add_file( iv_url = 'file1.css'
+              iv_content = lv_file1 ).
+    mo_cut->add_file( 'file1.css' ).
+ 
+    lv_file2 =
+      `:root {\n` &&
+      `  --var3: 19;\n` &&
+      `}\n`.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_file2 WITH cl_abap_char_utilities=>newline.
+    add_file( iv_url = 'file2.css'
+              iv_content = lv_file2 ).
+    mo_cut->add_file( 'file2.css' ).
+ 
+    lv_expected =
+      `:root {\n` &&
+      `  --var3: 5;\n` &&
+      `  --var1: 19;\n` &&
+      `  --var2: 19;\n` &&
+      `  --var3: 6;\n` &&
+      `}\n` &&
+      `body {\n` &&
+      `  width: 19;\n` &&
+      `}\n` &&
+      `\n` &&
+      `:root {\n` &&
+      `  --var3: 19;\n` &&
+      `}\n`.
+    REPLACE ALL OCCURRENCES OF '\n' IN lv_expected WITH cl_abap_char_utilities=>newline.
+ 
+    cl_abap_unit_assert=>assert_equals( act = mo_cut->process( )
+                                        exp = lv_expected ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_event.clas.abap.html b/src/ui/core/zcl_abapgit_gui_event.clas.abap.html new file mode 100644 index 00000000000..d6fc73f77f8 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_event.clas.abap.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_event.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_event.clas.abap

+
+ +
+ 98.05% + Statements + 101/103 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.05% + Lines + 101/103 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +1041x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_event DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event .
+ 
+    CLASS-METHODS new
+      IMPORTING
+        !ii_gui_services   TYPE REF TO zif_abapgit_gui_services OPTIONAL
+        !iv_action         TYPE clike
+        !iv_getdata        TYPE clike OPTIONAL
+        !it_postdata       TYPE zif_abapgit_html_viewer=>ty_post_data OPTIONAL
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_gui_event.
+    METHODS constructor
+      IMPORTING
+        !ii_gui_services TYPE REF TO zif_abapgit_gui_services OPTIONAL
+        !iv_action       TYPE clike
+        !iv_getdata      TYPE clike OPTIONAL
+        !it_postdata     TYPE zif_abapgit_html_viewer=>ty_post_data OPTIONAL .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mo_query TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+ 
+    METHODS fields_to_map
+      IMPORTING
+        it_fields            TYPE tihttpnvp
+      RETURNING
+        VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_event IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    " Edge Webview control returns upper case action but abapGit requires lower case (#4841)
+    zif_abapgit_gui_event~mi_gui_services = ii_gui_services.
+    zif_abapgit_gui_event~mv_action       = to_lower( iv_action ).
+    zif_abapgit_gui_event~mv_getdata      = iv_getdata.
+    zif_abapgit_gui_event~mt_postdata     = it_postdata.
+ 
+    IF ii_gui_services IS BOUND.
+      zif_abapgit_gui_event~mv_current_page_name = ii_gui_services->get_current_page_name( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD fields_to_map.
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF it_fields.
+ 
+    CREATE OBJECT ro_string_map EXPORTING iv_case_insensitive = abap_true.
+    LOOP AT it_fields ASSIGNING <ls_field>.
+      ro_string_map->set(
+        iv_key = <ls_field>-name
+        iv_val = <ls_field>-value ).
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        ii_gui_services = ii_gui_services
+        iv_action       = iv_action
+        iv_getdata      = iv_getdata
+        it_postdata     = it_postdata.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event~form_data.
+ 
+    IF mo_form_data IS NOT BOUND.
+      mo_form_data = fields_to_map(
+        zcl_abapgit_html_action_utils=>parse_post_form_data( zif_abapgit_gui_event~mt_postdata ) ).
+      mo_form_data->freeze( ).
+    ENDIF.
+    ro_string_map = mo_form_data.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event~query.
+ 
+    IF mo_query IS NOT BOUND.
+      mo_query = fields_to_map(
+        zcl_abapgit_html_action_utils=>parse_fields( zif_abapgit_gui_event~mv_getdata ) ).
+      mo_query->freeze( ).
+    ENDIF.
+    ro_string_map = mo_query.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap.html b/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap.html new file mode 100644 index 00000000000..bd23e56e634 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap.html @@ -0,0 +1,580 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_event.clas.testclasses.abap

+
+ +
+ 100% + Statements + 165/165 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 165/165 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +1661x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_event DEFINITION
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT
+  FINAL.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS query_wrong_data FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS form_wrong_data FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS query FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS form_data FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS immutability FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_event IMPLEMENTATION.
+ 
+  METHOD query_wrong_data.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_gui_event.
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
+      EXPORTING
+        iv_action = 'XXX'
+        iv_getdata = 'not_a_param'.
+ 
+    lo_map = li_cut->query( ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->size( )
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD form_wrong_data.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_gui_event.
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
+      EXPORTING
+        iv_action = 'XXX'.
+ 
+    lo_map = li_cut->form_data( ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->size( )
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD query.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_gui_event.
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
+      EXPORTING
+        iv_action = 'XXX'
+        iv_getdata = 'a=b&b=c'.
+ 
+    " Cross check just in case
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->form_data( )->size( )
+      exp = 0 ).
+ 
+    lo_map = li_cut->query( ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->size( )
+      exp = 2 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->get( 'a' )
+      exp = 'b' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->get( 'b' )
+      exp = 'c' ).
+ 
+    " Case insensitivity
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->get( 'A' )
+      exp = 'b' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->get( 'B' )
+      exp = 'c' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD form_data.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_gui_event.
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+    DATA lt_postdata TYPE zif_abapgit_html_viewer=>ty_post_data.
+ 
+    APPEND 'a=b&b=c' TO lt_postdata.
+    CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
+      EXPORTING
+        iv_action   = 'XXX'
+        it_postdata = lt_postdata.
+ 
+    " Cross check just in case
+    cl_abap_unit_assert=>assert_equals(
+      act = li_cut->query( )->size( )
+      exp = 0 ).
+ 
+    lo_map = li_cut->form_data( ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->size( )
+      exp = 2 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->get( 'a' )
+      exp = 'b' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->get( 'b' )
+      exp = 'c' ).
+ 
+    " Case insensitivity
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->size( )
+      exp = 2 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->get( 'A' )
+      exp = 'b' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_map->get( 'B' )
+      exp = 'c' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD immutability.
+ 
+    DATA li_cut TYPE REF TO zif_abapgit_gui_event.
+    DATA lo_x TYPE REF TO zcx_abapgit_exception.
+ 
+    CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
+      EXPORTING
+        iv_getdata = 'a=b&b=c'
+        iv_action  = 'XXX'.
+ 
+    TRY.
+        li_cut->form_data( )->set(
+          iv_key = 'x'
+          iv_val = 'y' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO lo_x.
+        cl_abap_unit_assert=>assert_char_cp(
+          act = lo_x->get_text( )
+          exp = '*immutable*' ).
+    ENDTRY.
+ 
+    TRY.
+        li_cut->query( )->set(
+          iv_key = 'x'
+          iv_val = 'y' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO lo_x.
+        cl_abap_unit_assert=>assert_char_cp(
+          act = lo_x->get_text( )
+          exp = '*immutable*' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_hotkey_ctl.clas.abap.html b/src/ui/core/zcl_abapgit_gui_hotkey_ctl.clas.abap.html new file mode 100644 index 00000000000..6476d33ecb2 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_hotkey_ctl.clas.abap.html @@ -0,0 +1,727 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_hotkey_ctl.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_hotkey_ctl.clas.abap

+
+ +
+ 87.85% + Statements + 188/214 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 87.85% + Lines + 188/214 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +2151x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_hotkey_ctl DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_hotkeys.
+    INTERFACES zif_abapgit_gui_hotkey_ctl.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CONSTANTS c_showhotkeys_action TYPE string VALUE `showHotkeys` ##NO_TEXT.
+ 
+    CLASS-METHODS should_show_hint
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA:
+      mt_hotkeys       TYPE zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr,
+      ms_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings,
+      mv_visible       TYPE abap_bool.
+    CLASS-DATA gv_hint_was_shown TYPE abap_bool .
+ 
+    METHODS render_scripts
+      IMPORTING
+        !it_hotkeys    TYPE zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_HOTKEY_CTL IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    ms_user_settings = zcl_abapgit_persistence_user=>get_instance( )->get_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    DATA lv_json TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_hotkey> LIKE LINE OF it_hotkeys.
+ 
+    lv_json = `{`.
+ 
+    LOOP AT it_hotkeys ASSIGNING <ls_hotkey>.
+ 
+      IF sy-tabix > 1.
+        lv_json = lv_json && |,|.
+      ENDIF.
+ 
+      lv_json = lv_json && |  "{ <ls_hotkey>-hotkey }" : "{ <ls_hotkey>-action }" |.
+ 
+    ENDLOOP.
+ 
+    lv_json = lv_json && `}`.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( |setKeyBindings({ lv_json });| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD should_show_hint.
+    IF gv_hint_was_shown = abap_false.
+      rv_yes = abap_true.
+      gv_hint_was_shown = abap_true.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA ls_hotkey LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey-ui_component = 'Hotkeys'.
+    ls_hotkey-action       = c_showhotkeys_action.
+    ls_hotkey-description  = 'Show Hotkeys Help'.
+    ls_hotkey-hotkey       = '?'.
+    INSERT ls_hotkey INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkey_ctl~get_registered_hotkeys.
+    rt_registered_hotkeys = mt_hotkeys.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkey_ctl~register_hotkeys.
+
+    FIELD-SYMBOLS <ls_hotkey> LIKE LINE OF it_hotkeys.
+
+    " Compress duplicates
+    LOOP AT it_hotkeys ASSIGNING <ls_hotkey>.
+      READ TABLE mt_hotkeys WITH KEY hotkey = <ls_hotkey>-hotkey TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0. " If found command with same hotkey
+        DELETE mt_hotkeys INDEX sy-tabix. " Later registered commands enjoys the priority
+      ENDIF.
+
+      IF  ms_user_settings-link_hints_enabled = abap_true
+      AND ms_user_settings-link_hint_key      = <ls_hotkey>-hotkey.
+        " Link hint activation key is more important
+        CONTINUE.
+      ENDIF.
+
+      APPEND <ls_hotkey> TO mt_hotkeys.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkey_ctl~reset.
+    CLEAR mt_hotkeys.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkey_ctl~set_visible.
+
+    mv_visible = iv_visible.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA:
+      lv_hint               TYPE string,
+      lt_registered_hotkeys TYPE zif_abapgit_gui_hotkeys=>ty_hotkeys_with_descr,
+      lv_hotkey             TYPE string,
+      ls_user_settings      TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+    FIELD-SYMBOLS <ls_hotkey> LIKE LINE OF lt_registered_hotkeys.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lt_registered_hotkeys = zif_abapgit_gui_hotkey_ctl~get_registered_hotkeys( ).
+    SORT lt_registered_hotkeys BY ui_component description.
+ 
+    register_deferred_script( render_scripts( lt_registered_hotkeys ) ).
+ 
+    " Render hotkeys
+    ri_html->add( '<ul class="hotkeys">' ).
+    LOOP AT lt_registered_hotkeys ASSIGNING <ls_hotkey>.
+      ri_html->add( |<li>|
+        && |<span class="key-id">{ <ls_hotkey>-hotkey }</span>|
+        && |<span class="key-descr">{ <ls_hotkey>-description }</span>|
+        && |</li>| ).
+    ENDLOOP.
+ 
+    " render link hints activation key
+    ls_user_settings = zcl_abapgit_persistence_user=>get_instance( )->get_settings( ).
+    IF ls_user_settings-link_hints_enabled = abap_true.
+      ri_html->add( |<li>|
+         && |<span class="key-id">{ ls_user_settings-link_hint_key }</span>|
+         && |<span class="key-descr">Link Hints</span>|
+         && |</li>| ).
+      ri_html->add( |<li>|
+         && |<span class="key-id">y{ ls_user_settings-link_hint_key }</span>|
+         && |<span class="key-descr">Copy Link Text</span>|
+         && |</li>| ).
+    ENDIF.
+ 
+    ri_html->add( '</ul>' ).
+ 
+    CLEAR lv_hotkey.
+ 
+    READ TABLE lt_registered_hotkeys ASSIGNING <ls_hotkey>
+      WITH KEY action = c_showhotkeys_action.
+    IF sy-subrc = 0.
+      lv_hotkey = <ls_hotkey>-hotkey.
+    ENDIF.
+ 
+    lv_hint = |Close window with upper right corner 'X'|.
+    IF lv_hotkey IS NOT INITIAL.
+      lv_hint = lv_hint && | or press '{ <ls_hotkey>-hotkey }'|.
+    ENDIF.
+ 
+    ri_html = zcl_abapgit_gui_chunk_lib=>render_infopanel(
+      iv_div_id     = 'hotkeys'
+      iv_title      = 'Hotkeys'
+      iv_hint       = lv_hint
+      iv_hide       = boolc( mv_visible = abap_false )
+      iv_scrollable = abap_false
+      io_content    = ri_html ).
+ 
+    IF lv_hotkey IS NOT INITIAL AND should_show_hint( ) = abap_true.
+      ri_html->add( |<div id="hotkeys-hint" class="corner-hint">|
+        && |Press '{ <ls_hotkey>-hotkey }' to get keyboard shortcuts list|
+        && |</div>| ).
+    ENDIF.
+ 
+    " Always reset visibility here. Closing of the popup has to be done by the
+    " user and is handeled in JS.
+    mv_visible = abap_false.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_html_processor.clas.abap.html b/src/ui/core/zcl_abapgit_gui_html_processor.clas.abap.html new file mode 100644 index 00000000000..8ced29954c4 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_html_processor.clas.abap.html @@ -0,0 +1,640 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_html_processor.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_html_processor.clas.abap

+
+ +
+ 99.45% + Statements + 184/185 +
+ + +
+ 90.9% + Branches + 10/11 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 99.45% + Lines + 184/185 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +1861x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +4x +3x +3x +3x +3x +3x +2x +2x +2x +2x +2x +2x +2x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_html_processor DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_css_build_name TYPE string VALUE 'css/bundle.css'.
+    CONSTANTS c_preprocess_marker TYPE string VALUE `<!-- abapgit HTML preprocessor -->`.
+    CONSTANTS c_comment_start TYPE string VALUE `<!--`.
+    CONSTANTS c_comment_end TYPE string VALUE `-->`.
+ 
+    INTERFACES zif_abapgit_gui_html_processor .
+ 
+    METHODS constructor
+      IMPORTING
+        ii_asset_man TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    METHODS preserve_css
+      IMPORTING
+        !iv_css_url TYPE string .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mt_preserve_css TYPE string_table.
+    DATA mi_asset_man TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    METHODS patch_html
+      IMPORTING
+        iv_html TYPE string
+      EXPORTING
+        ev_html TYPE string
+        et_css_urls TYPE string_table
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS is_preserved
+      IMPORTING
+        !iv_css_url TYPE string
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+ 
+    METHODS find_head_offset
+      IMPORTING
+        iv_html            TYPE string
+      RETURNING
+        VALUE(rv_head_end) TYPE i
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_HTML_PROCESSOR IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mi_asset_man = ii_asset_man.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_preserved.
+    READ TABLE mt_preserve_css TRANSPORTING NO FIELDS WITH KEY table_line = iv_css_url.
+    rv_yes = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD patch_html.
+ 
+    CONSTANTS lc_css_re TYPE string VALUE `<link\s+rel="stylesheet"\s+type="text/css"\s+href="(\S+)">`.
+ 
+    DATA lv_head_end TYPE i.
+    DATA lo_css_re   TYPE REF TO cl_abap_regex.
+    DATA lo_matcher  TYPE REF TO cl_abap_matcher.
+    DATA lv_css_path TYPE string.
+    DATA lv_marker   TYPE string.
+ 
+    DATA lv_off TYPE i.
+    DATA lv_len TYPE i.
+    DATA lv_cur TYPE i.
+ 
+    DATA lv_css_build TYPE string VALUE '<link rel="stylesheet" type="text/css" href="$BUILD_NAME">'.
+    REPLACE FIRST OCCURRENCE OF '$BUILD_NAME' IN lv_css_build WITH c_css_build_name. " Mmmm
+ 
+    CLEAR: ev_html, et_css_urls.
+ 
+    lv_head_end = find_head_offset( iv_html ).
+ 
+    CREATE OBJECT lo_css_re
+      EXPORTING
+        ignore_case = abap_true
+        pattern     = lc_css_re.
+ 
+    lo_matcher = lo_css_re->create_matcher( text = substring( val = iv_html len = lv_head_end ) ).
+    WHILE lo_matcher->find_next( ) = abap_true.
+      lv_css_path = lo_matcher->get_submatch( 1 ).
+      IF abap_false = is_preserved( lv_css_path ).
+        lv_off = lo_matcher->get_offset( ).
+        lv_len = lo_matcher->get_length( ).
+        ev_html = ev_html && substring( val = iv_html
+                                        off = lv_cur
+                                        len = lv_off - lv_cur ).
+        ev_html = ev_html && c_comment_start && substring( val = iv_html
+                                                           off = lv_off
+                                                           len = lv_len ) && c_comment_end.
+        lv_cur  = lv_off + lv_len.
+        APPEND lv_css_path TO et_css_urls.
+      ENDIF.
+    ENDWHILE.
+ 
+    ev_html = ev_html && substring( val = iv_html
+                                    off = lv_cur
+                                    len = lv_head_end - lv_cur ).
+    IF lines( et_css_urls ) > 0.
+      lv_marker = cl_abap_char_utilities=>newline
+        && `    ` " Assume 4 space indent, maybe improve and detect ?
+        && c_preprocess_marker
+        && cl_abap_char_utilities=>newline
+        && `    `.
+      ev_html = ev_html && lv_marker && lv_css_build.
+    ENDIF.
+    ev_html = ev_html && substring( val = iv_html
+                                    off = lv_head_end ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD preserve_css.
+    APPEND iv_css_url TO mt_preserve_css.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_html_processor~process.
+ 
+    DATA lo_css_processor TYPE REF TO zcl_abapgit_gui_css_processor.
+    DATA lt_css_urls TYPE string_table.
+    DATA lv_css_build TYPE string.
+ 
+    FIELD-SYMBOLS <lv_url> LIKE LINE OF lt_css_urls.
+ 
+    patch_html(
+      EXPORTING
+        iv_html = iv_html
+      IMPORTING
+        ev_html = rv_html
+        et_css_urls = lt_css_urls ).
+ 
+    IF lines( lt_css_urls ) > 0.
+      CREATE OBJECT lo_css_processor
+        EXPORTING
+          ii_asset_manager = mi_asset_man.
+ 
+      LOOP AT lt_css_urls ASSIGNING <lv_url>.
+        lo_css_processor->add_file( <lv_url> ).
+      ENDLOOP.
+ 
+      lv_css_build = lo_css_processor->process( ).
+ 
+      ii_gui_services->cache_asset(
+        iv_url     = |{ c_css_build_name }|
+        iv_type    = 'text'
+        iv_subtype = 'css'
+        iv_text    = lv_css_build ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD find_head_offset.
+ 
+    rv_head_end = find( val = iv_html
+                        regex = |{ cl_abap_char_utilities=>newline }?\\s*</head>|
+                        case = abap_false ).
+    IF rv_head_end <= 0.
+      rv_head_end = find( val = iv_html
+                          regex = |</head>|
+                          case = abap_false ).
+      IF rv_head_end <= 0.
+        zcx_abapgit_exception=>raise( 'HTML preprocessor: </head> not found' ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_html_processor.clas.testclasses.abap.html b/src/ui/core/zcl_abapgit_gui_html_processor.clas.testclasses.abap.html new file mode 100644 index 00000000000..ce2d9c53d9e --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_html_processor.clas.testclasses.abap.html @@ -0,0 +1,784 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_html_processor.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_html_processor.clas.testclasses.abap

+
+ +
+ 99.14% + Statements + 231/233 +
+ + +
+ 100% + Branches + 6/6 +
+ + +
+ 75% + Functions + 6/8 +
+ + +
+ 99.14% + Lines + 231/233 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +2341x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_gui_mock DEFINITION FOR TESTING FINAL.
+  PUBLIC SECTION.
+    TYPES:
+      BEGIN OF ty_cache_signature,
+        url  TYPE string,
+        type TYPE string,
+        data TYPE string,
+      END OF ty_cache_signature.
+ 
+    INTERFACES zif_abapgit_gui_services.
+ 
+    METHODS get_asset RETURNING VALUE(rs_asset) TYPE ty_cache_signature.
+ 
+  PRIVATE SECTION.
+    DATA ms_last_cache_signature TYPE ty_cache_signature.
+ENDCLASS.
+ 
+CLASS ltcl_gui_mock IMPLEMENTATION.
+  METHOD zif_abapgit_gui_services~cache_asset.
+    ms_last_cache_signature-url  = iv_url.
+    ms_last_cache_signature-type = iv_type && '/' && iv_subtype.
+    ms_last_cache_signature-data = iv_text.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~register_event_handler.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~get_current_page_name.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~get_hotkeys_ctl.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~get_html_parts.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~get_log.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~register_page_asset.
+  ENDMETHOD.
+ 
+  METHOD get_asset.
+    rs_asset = ms_last_cache_signature.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_html_processor_test DEFINITION DEFERRED.
+CLASS zcl_abapgit_gui_html_processor DEFINITION LOCAL FRIENDS ltcl_html_processor_test.
+ 
+CLASS ltcl_html_processor_test DEFINITION
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS
+  FINAL.
+ 
+  PRIVATE SECTION.
+    DATA mv_source TYPE string.
+    DATA mo_cut TYPE REF TO zcl_abapgit_gui_html_processor.
+    DATA mo_gui_mock TYPE REF TO ltcl_gui_mock.
+ 
+    METHODS render_html
+      IMPORTING
+        iv_src         TYPE string
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+    METHODS setup RAISING zcx_abapgit_exception.
+    METHODS process_typical FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS process_with_preserve FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS process_no_css FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS process_fails FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS find_head_closing_tag FOR TESTING RAISING zcx_abapgit_exception.
+ENDCLASS.
+ 
+CLASS ltcl_html_processor_test IMPLEMENTATION.
+ 
+  METHOD render_html.
+    rv_html = iv_src.
+    REPLACE ALL OCCURRENCES OF '\n' IN rv_html WITH cl_abap_char_utilities=>newline.
+  ENDMETHOD.
+ 
+  METHOD setup.
+ 
+    DATA li_asset_man TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    li_asset_man = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    li_asset_man->register_asset( iv_url = 'css/style1.css'
+                                  iv_type = 'text/css'
+                                  iv_inline = 'dummy1' ).
+    li_asset_man->register_asset( iv_url = 'css/style2.css'
+                                  iv_type = 'text/css'
+                                  iv_inline = 'dummy2' ).
+    li_asset_man->register_asset( iv_url = 'css/style3.css'
+                                  iv_type = 'text/css'
+                                  iv_inline = 'dummy3' ).
+ 
+    CREATE OBJECT mo_cut
+      EXPORTING
+        ii_asset_man = li_asset_man.
+ 
+    CREATE OBJECT mo_gui_mock.
+ 
+    mv_source = render_html(
+      `<html>\n` &&
+      `  <head>\n` &&
+      `    <title>abapGit</title>\n` &&
+      `    <LINK  rel="stylesheet" type="text/css" href="css/style1.css">\n` && " +case & extra space
+      `    <link rel="stylesheet" type="text/css" href="css/style2.css">\n` &&
+      `    <link rel="stylesheet" type="text/css" href="css/style3.css">\n` &&
+      `    <script type="text/javascript" src="js/common.js"></script>\n` &&
+      `  </head>\n` &&
+      `  <body>hello</body>\n` &&
+      `</html>\n` ).
+ 
+  ENDMETHOD.
+ 
+  METHOD process_typical.
+ 
+    DATA lv_act TYPE string.
+ 
+    lv_act = mo_cut->zif_abapgit_gui_html_processor~process(
+      iv_html = mv_source
+      ii_gui_services = mo_gui_mock ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = render_html(
+        `<html>\n` &&
+        `  <head>\n` &&
+        `    <title>abapGit</title>\n` &&
+        `    <!--<LINK  rel="stylesheet" type="text/css" href="css/style1.css">-->\n` &&
+        `    <!--<link rel="stylesheet" type="text/css" href="css/style2.css">-->\n` &&
+        `    <!--<link rel="stylesheet" type="text/css" href="css/style3.css">-->\n` &&
+        `    <script type="text/javascript" src="js/common.js"></script>\n` &&
+        `    <!-- abapgit HTML preprocessor -->\n` &&
+        `    <link rel="stylesheet" type="text/css" href="css/bundle.css">\n` &&
+        `  </head>\n` &&
+        `  <body>hello</body>\n` &&
+        `</html>\n`
+      ) ).
+ 
+    " GUI call checks
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_gui_mock->get_asset( )-url
+      exp = 'css/bundle.css' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_gui_mock->get_asset( )-type
+      exp = 'text/css' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_gui_mock->get_asset( )-data
+      exp = render_html( 'dummy1\ndummy2\ndummy3' ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD process_with_preserve.
+ 
+    DATA lv_act TYPE string.
+ 
+    mo_cut->preserve_css( 'css/style2.css' ).
+    lv_act = mo_cut->zif_abapgit_gui_html_processor~process(
+      iv_html = mv_source
+      ii_gui_services = mo_gui_mock ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = render_html(
+        `<html>\n` &&
+        `  <head>\n` &&
+        `    <title>abapGit</title>\n` &&
+        `    <!--<LINK  rel="stylesheet" type="text/css" href="css/style1.css">-->\n` &&
+        `    <link rel="stylesheet" type="text/css" href="css/style2.css">\n` && " Preserved
+        `    <!--<link rel="stylesheet" type="text/css" href="css/style3.css">-->\n` &&
+        `    <script type="text/javascript" src="js/common.js"></script>\n` &&
+        `    <!-- abapgit HTML preprocessor -->\n` &&
+        `    <link rel="stylesheet" type="text/css" href="css/bundle.css">\n` &&
+        `  </head>\n` &&
+        `  <body>hello</body>\n` &&
+        `</html>\n`
+      ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD process_no_css.
+ 
+    DATA lv_act TYPE string.
+ 
+    lv_act = mo_cut->zif_abapgit_gui_html_processor~process(
+      iv_html = '<html><head></head></html>'
+      ii_gui_services = mo_gui_mock ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_act
+      exp = '<html><head></head></html>' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD process_fails.
+ 
+    TRY.
+        " BTW this is valid HTML, maybe refactor the code ...
+        mo_cut->zif_abapgit_gui_html_processor~process(
+          iv_html = '<html><body></body></html>'
+          ii_gui_services = mo_gui_mock ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_head_closing_tag.
+    "given
+    DATA: lv_head_end TYPE i,
+          lv_html     TYPE string.
+ 
+    lv_html = '<!DOCTYPE html><html><head><title>abapGit</title><link rel="stylesheet" type="text/css" ' &&
+              'href="css/common.css"><link rel="stylesheet" type="text/css" href="css/ag-icons.css">' &&
+              '<link rel="stylesheet" type="text/css" href="css/theme-default.css"><script type="text/javascript"' &&
+              ' src="js/common.js"></script></head>'.
+ 
+    "when
+    TRY.
+        lv_head_end = mo_cut->find_head_offset( iv_html = lv_html ).
+      CATCH zcx_abapgit_exception.
+        cl_abap_unit_assert=>fail( msg = 'HEAD closing tag could not be found' ).
+    ENDTRY.
+ 
+    "then
+    cl_abap_unit_assert=>assert_equals(
+          act = lv_head_end
+          exp = 299
+          msg = 'Head closing tag was not found' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_utils.clas.abap.html b/src/ui/core/zcl_abapgit_gui_utils.clas.abap.html new file mode 100644 index 00000000000..05fed6285bd --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_utils.clas.abap.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_utils.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_utils.clas.abap

+
+ +
+ 100% + Statements + 48/48 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 48/48 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +491x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_utils DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS is_renderable
+      IMPORTING
+        !io_obj TYPE REF TO object
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    CLASS-METHODS is_event_handler
+      IMPORTING
+        !io_obj TYPE REF TO object
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_UTILS IMPLEMENTATION.
+ 
+ 
+  METHOD is_event_handler.
+    DATA li_event_handler TYPE REF TO zif_abapgit_gui_event_handler.
+    TRY.
+        li_event_handler ?= io_obj.
+        rv_yes = abap_true.
+      CATCH cx_sy_move_cast_error.
+        rv_yes = abap_false.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_renderable.
+    DATA li_renderable TYPE REF TO zif_abapgit_gui_renderable.
+    TRY.
+        li_renderable ?= io_obj.
+        rv_yes = abap_true.
+      CATCH cx_sy_move_cast_error.
+        rv_yes = abap_false.
+    ENDTRY.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_gui_utils.clas.testclasses.abap.html b/src/ui/core/zcl_abapgit_gui_utils.clas.testclasses.abap.html new file mode 100644 index 00000000000..0ec914ad521 --- /dev/null +++ b/src/ui/core/zcl_abapgit_gui_utils.clas.testclasses.abap.html @@ -0,0 +1,274 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_gui_utils.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_gui_utils.clas.testclasses.abap

+
+ +
+ 100% + Statements + 63/63 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 63/63 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +641x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_renderable DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_renderable.
+ENDCLASS.
+CLASS lcl_renderable IMPLEMENTATION.
+  METHOD zif_abapgit_gui_renderable~render.
+  ENDMETHOD.
+ENDCLASS.
+CLASS lcl_handler DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_event_handler.
+ENDCLASS.
+CLASS lcl_handler IMPLEMENTATION.
+  METHOD zif_abapgit_gui_event_handler~on_event.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_gui_utils DEFINITION FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS is_renderable FOR TESTING.
+    METHODS is_event_handler FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_gui_utils IMPLEMENTATION.
+ 
+  METHOD is_renderable.
+ 
+    DATA lo_handler TYPE REF TO lcl_handler.
+    DATA lo_renderable TYPE REF TO lcl_renderable.
+ 
+    CREATE OBJECT lo_handler.
+    CREATE OBJECT lo_renderable.
+ 
+    cl_abap_unit_assert=>assert_equals( exp = abap_true
+                                        act = zcl_abapgit_gui_utils=>is_renderable( lo_renderable ) ).
+    cl_abap_unit_assert=>assert_equals( exp = abap_false
+                                        act = zcl_abapgit_gui_utils=>is_renderable( lo_handler ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD is_event_handler.
+ 
+    DATA lo_handler TYPE REF TO lcl_handler.
+    DATA lo_renderable TYPE REF TO lcl_renderable.
+ 
+    CREATE OBJECT lo_handler.
+    CREATE OBJECT lo_renderable.
+ 
+    cl_abap_unit_assert=>assert_equals( exp = abap_false
+                                        act = zcl_abapgit_gui_utils=>is_event_handler( lo_renderable ) ).
+    cl_abap_unit_assert=>assert_equals( exp = abap_true
+                                        act = zcl_abapgit_gui_utils=>is_event_handler( lo_handler ) ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_html.clas.abap.html b/src/ui/core/zcl_abapgit_html.clas.abap.html new file mode 100644 index 00000000000..aed0ab320c3 --- /dev/null +++ b/src/ui/core/zcl_abapgit_html.clas.abap.html @@ -0,0 +1,1786 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_html.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_html.clas.abap

+
+ +
+ 97.35% + Statements + 552/567 +
+ + +
+ 75.55% + Branches + 34/45 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 97.35% + Lines + 552/567 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +5681x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +  +  +85x +  +  +85x +  +  +85x +85x +85x +85x +85x +85x +85x +25x +25x +25x +60x +60x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +85x +50x +25x +25x +25x +25x +50x +50x +50x +85x +85x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +  +5x +1x +1x +5x +5x +5x +1x +1x +5x +5x +5x +5x +5x +5x +80x +  +  +  +  +  +80x +1x +1x +1x +1x +1x +80x +23x +23x +80x +80x +80x +80x +48x +48x +48x +80x +80x +80x +1x +1x +1x +  +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +1x +1x +10x +10x +8x +8x +2x +8x +4x +4x +8x +6x +6x +8x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_html DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_html .
+ 
+    CONSTANTS c_indent_size TYPE i VALUE 2 ##NO_TEXT.
+ 
+    CLASS-METHODS class_constructor .
+    CLASS-METHODS create
+      IMPORTING
+        !iv_initial_chunk  TYPE any OPTIONAL
+      RETURNING
+        VALUE(ri_instance) TYPE REF TO zif_abapgit_html.
+ 
+    CLASS-METHODS icon
+      IMPORTING
+        !iv_name      TYPE string
+        !iv_hint      TYPE string OPTIONAL
+        !iv_class     TYPE string OPTIONAL
+        !iv_onclick   TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_str) TYPE string .
+    CLASS-METHODS checkbox
+      IMPORTING
+        iv_id          TYPE string OPTIONAL
+        iv_checked     TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(rv_html) TYPE string .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_indent_context,
+        no_indent_jscss TYPE abap_bool,
+        within_style    TYPE abap_bool,
+        within_js       TYPE abap_bool,
+        within_textarea TYPE abap_bool,
+        indent          TYPE i,
+        indent_str      TYPE string,
+      END OF ty_indent_context .
+    TYPES:
+      BEGIN OF ty_study_result,
+        style_open     TYPE abap_bool,
+        style_close    TYPE abap_bool,
+        script_open    TYPE abap_bool,
+        script_close   TYPE abap_bool,
+        textarea_open  TYPE abap_bool,
+        textarea_close TYPE abap_bool,
+        tag_close      TYPE abap_bool,
+        curly_close    TYPE abap_bool,
+        openings       TYPE i,
+        closings       TYPE i,
+        singles        TYPE i,
+      END OF ty_study_result .
+ 
+    CLASS-DATA go_single_tags_re TYPE REF TO cl_abap_regex .
+    DATA mt_buffer TYPE string_table .
+    CLASS-DATA gv_spaces TYPE string .
+    CLASS-DATA gv_debug_mode TYPE abap_bool .
+ 
+    METHODS indent_line
+      CHANGING
+        !cs_context TYPE ty_indent_context
+        !cv_line    TYPE string .
+    METHODS study_line
+      IMPORTING
+        !iv_line         TYPE string
+        !is_context      TYPE ty_indent_context
+      RETURNING
+        VALUE(rs_result) TYPE ty_study_result .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML IMPLEMENTATION.
+ 
+ 
+  METHOD checkbox.
+ 
+    DATA: lv_checked TYPE string.
+ 
+    IF iv_checked = abap_true.
+      lv_checked = |checked|.
+    ENDIF.
+ 
+    rv_html = |<input type="checkbox" { lv_checked } |.
+    IF iv_id IS NOT INITIAL.
+      rv_html = rv_html && |id="{ iv_id }"|.
+    ENDIF.
+ 
+    rv_html = rv_html && `/>`.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_constructor.
+ 
+    DATA lv_mode TYPE tabname.
+ 
+    CREATE OBJECT go_single_tags_re
+      EXPORTING
+        pattern     = '<(AREA|BASE|BR|COL|COMMAND|EMBED|HR|IMG|INPUT|LINK|META|PARAM|SOURCE|!)'
+        ignore_case = abap_false.
+ 
+    gv_spaces = repeat(
+      val = ` `
+      occ = 200 ).
+ 
+    GET PARAMETER ID 'DBT' FIELD lv_mode.
+    gv_debug_mode = boolc( lv_mode = 'HREF' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ri_instance TYPE zcl_abapgit_html.
+    IF iv_initial_chunk IS NOT INITIAL.
+      ri_instance->add( iv_initial_chunk ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD icon.
+ 
+    DATA: lv_hint       TYPE string,
+          lv_name       TYPE string,
+          lv_color      TYPE string,
+          lv_class      TYPE string,
+          lv_large_icon TYPE string,
+          lv_xpixel     TYPE i,
+          lv_onclick    TYPE string.
+ 
+    SPLIT iv_name AT '/' INTO lv_name lv_color.
+ 
+    IF iv_hint IS NOT INITIAL.
+      lv_hint  = | title="{ iv_hint }"|.
+    ENDIF.
+    IF iv_onclick IS NOT INITIAL.
+      lv_onclick = | onclick="{ iv_onclick }"|.
+    ENDIF.
+    IF iv_class IS NOT INITIAL.
+      lv_class = | { iv_class }|.
+    ENDIF.
+    IF lv_color IS NOT INITIAL.
+      lv_color = | { lv_color }|.
+    ENDIF.
+ 
+    lv_xpixel = cl_gui_cfw=>compute_pixel_from_metric( x_or_y = 'X'
+                                                       in = 1 ).
+    IF lv_xpixel >= 2.
+      lv_large_icon = ' large'.
+    ENDIF.
+ 
+    rv_str = |<i class="icon{ lv_large_icon } icon-{ lv_name }{ lv_color }|.
+    rv_str = |{ rv_str }{ lv_class }"{ lv_onclick }{ lv_hint }></i>|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD indent_line.
+ 
+    DATA: ls_study  TYPE ty_study_result,
+          lv_spaces TYPE i.
+ 
+    ls_study = study_line(
+      is_context = cs_context
+      iv_line    = cv_line ).
+ 
+    " No indent for textarea tags
+    IF ls_study-textarea_open = abap_true.
+      cs_context-within_textarea = abap_true.
+      RETURN.
+    ELSEIF ls_study-textarea_close = abap_true.
+      cs_context-within_textarea = abap_false.
+      RETURN.
+    ELSEIF cs_context-within_textarea = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    " First closing tag - shift back exceptionally
+    IF ( ls_study-script_close = abap_true
+        OR ls_study-style_close = abap_true
+        OR ls_study-curly_close = abap_true
+        OR ls_study-tag_close = abap_true )
+        AND cs_context-indent > 0.
+      lv_spaces = ( cs_context-indent - 1 ) * c_indent_size.
+      cv_line  = gv_spaces(lv_spaces) && cv_line.
+    ELSE.
+      cv_line = cs_context-indent_str && cv_line.
+    ENDIF.
+ 
+    " Context status update
+    CASE abap_true.
+      WHEN ls_study-script_open.
+        cs_context-within_js    = abap_true.
+        cs_context-within_style = abap_false.
+      WHEN ls_study-style_open.
+        cs_context-within_js    = abap_false.
+        cs_context-within_style = abap_true.
+      WHEN ls_study-script_close OR ls_study-style_close.
+        cs_context-within_js    = abap_false.
+        cs_context-within_style = abap_false.
+        ls_study-closings       = ls_study-closings + 1.
+    ENDCASE.
+ 
+    " More-less logic chosen due to possible double tags in a line '<a><b>'
+    IF ls_study-openings <> ls_study-closings.
+      IF ls_study-openings > ls_study-closings.
+        cs_context-indent = cs_context-indent + 1.
+      ELSEIF cs_context-indent > 0. " AND ls_study-openings < ls_study-closings
+        cs_context-indent = cs_context-indent - 1.
+      ENDIF.
+      lv_spaces = cs_context-indent * c_indent_size.
+      cs_context-indent_str = gv_spaces(lv_spaces).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD study_line.
+ 
+    DATA: lv_line TYPE string,
+          lv_len  TYPE i.
+ 
+    lv_line = to_upper( shift_left( val = iv_line
+                                    sub = ` ` ) ).
+    lv_len  = strlen( lv_line ).
+ 
+    " Some assumptions for simplification and speed
+    " - style & scripts tag should be opened/closed in a separate line
+    " - style & scripts opening and closing in one line is possible but only once
+ 
+    " TODO & Issues
+    " - What if the string IS a well formed html already not just single line ?
+ 
+    IF is_context-within_js = abap_true OR is_context-within_style = abap_true.
+ 
+      IF is_context-within_js = abap_true AND lv_len >= 8 AND lv_line(8) = '</SCRIPT'.
+        rs_result-script_close = abap_true.
+      ELSEIF is_context-within_style = abap_true AND lv_len >= 7 AND lv_line(7) = '</STYLE'.
+        rs_result-style_close = abap_true.
+      ENDIF.
+ 
+      IF is_context-no_indent_jscss = abap_false.
+        IF lv_len >= 1 AND lv_line(1) = '}'.
+          rs_result-curly_close = abap_true.
+        ENDIF.
+ 
+        FIND ALL OCCURRENCES OF '{' IN lv_line MATCH COUNT rs_result-openings.
+        FIND ALL OCCURRENCES OF '}' IN lv_line MATCH COUNT rs_result-closings.
+      ENDIF.
+ 
+    ELSE.
+      IF lv_len >= 7 AND lv_line(7) = '<SCRIPT'.
+        FIND FIRST OCCURRENCE OF '</SCRIPT' IN lv_line.
+        IF sy-subrc > 0. " Not found
+          rs_result-script_open = abap_true.
+        ENDIF.
+      ENDIF.
+      IF lv_len >= 6 AND lv_line(6) = '<STYLE'.
+        FIND FIRST OCCURRENCE OF '</STYLE' IN lv_line.
+        IF sy-subrc > 0. " Not found
+          rs_result-style_open = abap_true.
+        ENDIF.
+      ENDIF.
+      IF lv_len >= 2 AND lv_line(2) = '</'.
+        rs_result-tag_close = abap_true.
+      ENDIF.
+ 
+      FIND ALL OCCURRENCES OF '<'  IN lv_line MATCH COUNT rs_result-openings.
+      FIND ALL OCCURRENCES OF '</' IN lv_line MATCH COUNT rs_result-closings.
+      IF rs_result-closings <> rs_result-openings.
+* if everything is closings, there are no single tags
+        FIND ALL OCCURRENCES OF REGEX go_single_tags_re IN lv_line MATCH COUNT rs_result-singles.
+      ENDIF.
+      rs_result-openings = rs_result-openings - rs_result-closings - rs_result-singles.
+ 
+    ENDIF.
+ 
+    " Textarea (same assumptions as above)
+    IF is_context-within_textarea = abap_true AND lv_len >= 10 AND lv_line(10) = '</TEXTAREA'.
+      rs_result-textarea_close = abap_true.
+    ELSEIF is_context-within_textarea = abap_false AND lv_len >= 9 AND lv_line(9) = '<TEXTAREA'.
+      FIND FIRST OCCURRENCE OF '</TEXTAREA' IN lv_line.
+      IF sy-subrc > 0. " Not found
+        rs_result-textarea_open = abap_true.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~a.
+ 
+    DATA: lv_class TYPE string,
+          lv_href  TYPE string,
+          lv_click TYPE string,
+          lv_id    TYPE string,
+          lv_act   TYPE string,
+          lv_style TYPE string,
+          lv_title TYPE string.
+ 
+    lv_class = iv_class.
+ 
+    IF iv_opt CA zif_abapgit_html=>c_html_opt-strong.
+      lv_class = lv_class && ' emphasis'.
+    ENDIF.
+    IF iv_opt CA zif_abapgit_html=>c_html_opt-cancel.
+      lv_class = lv_class && ' attention'.
+    ENDIF.
+    IF iv_opt CA zif_abapgit_html=>c_html_opt-crossout.
+      lv_class = lv_class && ' crossout grey'.
+    ENDIF.
+    IF lv_class IS NOT INITIAL.
+      SHIFT lv_class LEFT DELETING LEADING space.
+      lv_class = | class="{ lv_class }"|.
+    ENDIF.
+ 
+    lv_href = ' href="#"'. " Default, dummy
+    lv_act  = iv_act.
+    IF ( iv_act IS NOT INITIAL OR iv_typ = zif_abapgit_html=>c_action_type-dummy )
+        AND iv_opt NA zif_abapgit_html=>c_html_opt-crossout.
+      CASE iv_typ.
+        WHEN zif_abapgit_html=>c_action_type-url.
+          IF iv_query IS NOT INITIAL.
+            lv_act = lv_act && `?` && iv_query.
+          ENDIF.
+          lv_href  = | href="{ lv_act }"|.
+        WHEN zif_abapgit_html=>c_action_type-sapevent.
+          IF iv_query IS NOT INITIAL.
+            lv_act = lv_act && `?` && iv_query.
+          ENDIF.
+          lv_href  = | href="sapevent:{ lv_act }"|.
+        WHEN zif_abapgit_html=>c_action_type-onclick.
+          lv_href  = ' href="#"'.
+          lv_click = | onclick="{ iv_act }"|.
+        WHEN zif_abapgit_html=>c_action_type-dummy.
+          lv_href  = ' href="#"'.
+      ENDCASE.
+    ENDIF.
+ 
+    IF iv_id IS NOT INITIAL.
+      lv_id = | id="{ iv_id }"|.
+    ENDIF.
+ 
+    IF iv_style IS NOT INITIAL.
+      lv_style = | style="{ iv_style }"|.
+    ENDIF.
+ 
+    IF iv_title IS NOT INITIAL.
+      lv_title = | title="{ iv_title }"|.
+    ENDIF.
+ 
+    " Debug option to display href-link on hover
+    IF gv_debug_mode = abap_true.
+      lv_title = | title="{ escape(
+        val    = lv_href
+        format = cl_abap_format=>e_html_attr ) }"|.
+    ENDIF.
+ 
+    rv_str = |<a{ lv_id }{ lv_class }{ lv_href }{ lv_click }{ lv_style }{ lv_title }>|
+          && |{ iv_txt }</a>|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~add.
+ 
+    DATA: lv_type TYPE c,
+          li_renderable TYPE REF TO zif_abapgit_gui_renderable,
+          lx_error TYPE REF TO zcx_abapgit_exception,
+          lo_html TYPE REF TO zcl_abapgit_html.
+ 
+    FIELD-SYMBOLS: <lt_tab> TYPE string_table.
+ 
+    lv_type = cl_abap_typedescr=>describe_by_data( ig_chunk )->type_kind.
+ 
+    CASE lv_type.
+      WHEN 'C' OR 'g'.  " Char or string
+        APPEND ig_chunk TO mt_buffer.
+      WHEN 'h'.         " Table
+        ASSIGN ig_chunk TO <lt_tab>. " Assuming table of strings ! Will dump otherwise
+        APPEND LINES OF <lt_tab> TO mt_buffer.
+      WHEN 'r'.         " Object ref
+        ASSERT ig_chunk IS BOUND. " Dev mistake
+        TRY.
+            lo_html ?= ig_chunk.
+          CATCH cx_sy_move_cast_error.
+            TRY.
+                li_renderable ?= ig_chunk.
+                lo_html ?= li_renderable->render( ).
+              CATCH cx_sy_move_cast_error.
+                ASSERT 1 = 0. " Dev mistake
+              CATCH zcx_abapgit_exception INTO lx_error.
+                lo_html ?= create( |<span class="error">Render error: { lx_error->get_text( ) }</span>| ).
+            ENDTRY.
+        ENDTRY.
+        APPEND LINES OF lo_html->mt_buffer TO mt_buffer.
+      WHEN OTHERS.
+        ASSERT 1 = 0. " Dev mistake
+    ENDCASE.
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~add_a.
+ 
+    zif_abapgit_html~add( zif_abapgit_html~a(
+      iv_txt   = iv_txt
+      iv_act   = iv_act
+      iv_query = iv_query
+      iv_typ   = iv_typ
+      iv_opt   = iv_opt
+      iv_class = iv_class
+      iv_id    = iv_id
+      iv_style = iv_style
+      iv_title = iv_title ) ).
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~add_checkbox.
+ 
+    zif_abapgit_html~add( checkbox(
+      iv_id      = iv_id
+      iv_checked = iv_checked ) ).
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~add_icon.
+ 
+    zif_abapgit_html~add( icon(
+      iv_name    = iv_name
+      iv_class   = iv_class
+      iv_hint    = iv_hint
+      iv_onclick = iv_onclick ) ).
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~icon.
+ 
+    rv_str = icon(
+      iv_name    = iv_name
+      iv_hint    = iv_hint
+      iv_class   = iv_class
+      iv_onclick = iv_onclick ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~is_empty.
+    rv_yes = boolc( lines( mt_buffer ) = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~render.
+ 
+    DATA: ls_context TYPE ty_indent_context,
+          lt_temp    TYPE string_table.
+ 
+    FIELD-SYMBOLS: <lv_line>   LIKE LINE OF lt_temp,
+                   <lv_line_c> LIKE LINE OF lt_temp.
+ 
+    ls_context-no_indent_jscss = iv_no_indent_jscss.
+ 
+    LOOP AT mt_buffer ASSIGNING <lv_line>.
+      APPEND <lv_line> TO lt_temp ASSIGNING <lv_line_c>.
+      indent_line( CHANGING cs_context = ls_context cv_line = <lv_line_c> ).
+    ENDLOOP.
+ 
+    CONCATENATE LINES OF lt_temp INTO rv_html SEPARATED BY cl_abap_char_utilities=>newline.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~set_title.
+    zif_abapgit_html~mv_chunk_title = iv_title.
+    ri_self = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~td.
+    zif_abapgit_html~wrap(
+      iv_format_single_line = iv_format_single_line
+      iv_tag   = 'td'
+      iv_content = iv_content
+      ii_content = ii_content
+      iv_id    = iv_id
+      iv_class = iv_class
+      iv_hint  = iv_hint ).
+    ri_self = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~th.
+    zif_abapgit_html~wrap(
+      iv_format_single_line = iv_format_single_line
+      iv_tag   = 'th'
+      iv_content = iv_content
+      ii_content = ii_content
+      iv_id    = iv_id
+      iv_class = iv_class
+      iv_hint  = iv_hint ).
+    ri_self = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html~wrap.
+ 
+    DATA lv_open_tag TYPE string.
+    DATA lv_close_tag TYPE string.
+ 
+    DATA: lv_class TYPE string,
+          lv_id    TYPE string,
+          lv_title TYPE string.
+ 
+    IF iv_id IS NOT INITIAL.
+      lv_id = | id="{ iv_id }"|.
+    ENDIF.
+ 
+    IF iv_class IS NOT INITIAL.
+      lv_class = | class="{ iv_class }"|.
+    ENDIF.
+ 
+    IF iv_hint IS NOT INITIAL.
+      lv_title = | title="{ iv_hint }"|.
+    ENDIF.
+ 
+    lv_open_tag = |<{ iv_tag }{ lv_id }{ lv_class }{ lv_title }>|.
+    lv_close_tag = |</{ iv_tag }>|.
+ 
+    IF ii_content IS NOT BOUND AND iv_content IS INITIAL.
+      lv_open_tag = lv_open_tag && lv_close_tag.
+      CLEAR lv_close_tag.
+    ENDIF.
+ 
+    IF iv_format_single_line = abap_true AND iv_content IS NOT INITIAL.
+      zif_abapgit_html~add( lv_open_tag && iv_content && lv_close_tag ).
+    ELSE.
+      zif_abapgit_html~add( lv_open_tag ).
+      IF ii_content IS BOUND.
+        zif_abapgit_html~add( ii_content ).
+      ELSEIF iv_content IS NOT INITIAL.
+        zif_abapgit_html~add( iv_content ).
+      ENDIF.
+      IF lv_close_tag IS NOT INITIAL.
+        zif_abapgit_html~add( lv_close_tag ).
+      ENDIF.
+    ENDIF.
+ 
+    ri_self = me.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_html.clas.testclasses.abap.html b/src/ui/core/zcl_abapgit_html.clas.testclasses.abap.html new file mode 100644 index 00000000000..cc278edaaf1 --- /dev/null +++ b/src/ui/core/zcl_abapgit_html.clas.testclasses.abap.html @@ -0,0 +1,811 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_html.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_html.clas.testclasses.abap

+
+ +
+ 100% + Statements + 242/242 +
+ + +
+ 100% + Branches + 11/11 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 100% + Lines + 242/242 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +2431x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_good_renderable DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_renderable.
+ENDCLASS.
+CLASS lcl_good_renderable IMPLEMENTATION.
+  METHOD zif_abapgit_gui_renderable~render.
+    ri_html = zcl_abapgit_html=>create( 'Hello' ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS lcl_bad_renderable DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_renderable.
+ENDCLASS.
+CLASS lcl_bad_renderable IMPLEMENTATION.
+  METHOD zif_abapgit_gui_renderable~render.
+    zcx_abapgit_exception=>raise( 'Fail!' ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_html DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA mo_html TYPE REF TO zif_abapgit_html.
+ 
+    METHODS:
+      wrap    FOR TESTING RAISING zcx_abapgit_exception,
+      add_renderable FOR TESTING RAISING zcx_abapgit_exception,
+      td      FOR TESTING RAISING zcx_abapgit_exception,
+      th      FOR TESTING RAISING zcx_abapgit_exception,
+      wrap_ii FOR TESTING RAISING zcx_abapgit_exception,
+      indent1 FOR TESTING RAISING zcx_abapgit_exception,
+      indent2 FOR TESTING RAISING zcx_abapgit_exception,
+      indent3 FOR TESTING RAISING zcx_abapgit_exception,
+      indent4 FOR TESTING RAISING zcx_abapgit_exception,
+      style1  FOR TESTING RAISING zcx_abapgit_exception.
+ 
+    METHODS:
+      setup.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_html IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_html TYPE zcl_abapgit_html.
+  ENDMETHOD.
+ 
+  METHOD indent1.
+ 
+    DATA lv_exp TYPE string.
+ 
+    mo_html->add( '<td>' ).
+    mo_html->add( 'hello world' ).
+    mo_html->add( '</td>' ).
+ 
+    lv_exp = '<td>' && cl_abap_char_utilities=>newline &&
+             '  hello world' && cl_abap_char_utilities=>newline &&
+             '</td>'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD indent2.
+ 
+    DATA lv_exp TYPE string.
+ 
+    mo_html->add( '<td>' ).
+    mo_html->add( '<input name="comment" type="text">' ).
+    mo_html->add( '</td>' ).
+ 
+    lv_exp = '<td>' && cl_abap_char_utilities=>newline &&
+             '  <input name="comment" type="text">' && cl_abap_char_utilities=>newline &&
+             '</td>'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD indent3.
+ 
+    DATA lv_exp TYPE string.
+ 
+    mo_html->add( '<td>' ).
+    mo_html->add( '<textarea name="body" rows="10" cols="72"></textarea>' ).
+    mo_html->add( '</td>' ).
+ 
+    lv_exp = '<td>' && cl_abap_char_utilities=>newline &&
+             '  <textarea name="body" rows="10" cols="72"></textarea>' && cl_abap_char_utilities=>newline &&
+             '</td>'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD indent4.
+ 
+    DATA lv_exp TYPE string.
+ 
+    mo_html->add( '<td>' ).
+    mo_html->add( 'foo<br>bar' ).
+    mo_html->add( '</td>' ).
+ 
+    lv_exp = '<td>' && cl_abap_char_utilities=>newline &&
+             '  foo<br>bar' && cl_abap_char_utilities=>newline &&
+             '</td>'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD style1.
+ 
+    DATA lv_exp TYPE string.
+ 
+    mo_html->add( '<style type="text/css">' ).
+    mo_html->add( '.class1 { color: red }' ).
+    mo_html->add( '.class2 {' ).
+    mo_html->add( 'color: red' ).
+    mo_html->add( '}' ).
+    mo_html->add( '</style>' ).
+ 
+    lv_exp = '<style type="text/css">' && cl_abap_char_utilities=>newline &&
+             '  .class1 { color: red }' && cl_abap_char_utilities=>newline &&
+             '  .class2 {' && cl_abap_char_utilities=>newline &&
+             '    color: red' && cl_abap_char_utilities=>newline &&
+             '  }' && cl_abap_char_utilities=>newline &&
+             '</style>'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp = lv_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD td.
+ 
+    mo_html->td( 'Hello' ).
+    mo_html->td(
+      iv_format_single_line = abap_false
+      iv_content = 'Hello' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp =
+        '<td>Hello</td>' && cl_abap_char_utilities=>newline &&
+        '<td>' && cl_abap_char_utilities=>newline &&
+        '  Hello' && cl_abap_char_utilities=>newline &&
+        '</td>' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD th.
+ 
+    mo_html->th( 'Hello' ).
+    mo_html->th(
+      iv_format_single_line = abap_false
+      iv_content = 'Hello' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp =
+        '<th>Hello</th>' && cl_abap_char_utilities=>newline &&
+        '<th>' && cl_abap_char_utilities=>newline &&
+        '  Hello' && cl_abap_char_utilities=>newline &&
+        '</th>' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD wrap_ii.
+ 
+    mo_html->wrap(
+      iv_tag     = 'td'
+      ii_content = zcl_abapgit_html=>create( )->add( 'Hello' ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp =
+        '<td>' && cl_abap_char_utilities=>newline &&
+        '  Hello' && cl_abap_char_utilities=>newline &&
+        '</td>' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD wrap.
+ 
+    mo_html->wrap( iv_tag = 'td' ).
+    mo_html->wrap(
+      iv_tag     = 'td'
+      iv_content = 'Hello' ).
+    mo_html->wrap(
+      iv_tag     = 'td'
+      iv_class   = 'class'
+      iv_hint    = 'hint'
+      iv_id      = 'id'
+      iv_content = 'Hello' ).
+    mo_html->wrap(
+      iv_tag     = 'td'
+      iv_content = 'Hello'
+      iv_format_single_line = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_html->render( )
+      exp =
+        '<td></td>' && cl_abap_char_utilities=>newline &&
+        '<td>' && cl_abap_char_utilities=>newline &&
+        '  Hello' && cl_abap_char_utilities=>newline &&
+        '</td>' && cl_abap_char_utilities=>newline &&
+        '<td id="id" class="class" title="hint">' && cl_abap_char_utilities=>newline &&
+        '  Hello' && cl_abap_char_utilities=>newline &&
+        '</td>' && cl_abap_char_utilities=>newline &&
+        '<td>Hello</td>' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD add_renderable.
+ 
+    DATA lo_good TYPE REF TO lcl_good_renderable.
+    DATA lo_bad TYPE REF TO lcl_bad_renderable.
+ 
+    CREATE OBJECT lo_good.
+    CREATE OBJECT lo_bad.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_html=>create( lo_good )->render( )
+      exp = 'Hello' ).
+ 
+    cl_abap_unit_assert=>assert_char_cp(
+      act = zcl_abapgit_html=>create( lo_bad )->render( )
+      exp = '<span*Fail!*' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_html_parts.clas.abap.html b/src/ui/core/zcl_abapgit_html_parts.clas.abap.html new file mode 100644 index 00000000000..51d9d521489 --- /dev/null +++ b/src/ui/core/zcl_abapgit_html_parts.clas.abap.html @@ -0,0 +1,412 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_html_parts.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_html_parts.clas.abap

+
+ +
+ 100% + Statements + 109/109 +
+ + +
+ 100% + Branches + 6/6 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 109/109 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +1101x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x + 
CLASS zcl_abapgit_html_parts DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS add_part
+      IMPORTING
+        !iv_collection TYPE string
+        !ii_part TYPE REF TO zif_abapgit_html .
+    METHODS get_parts
+      IMPORTING
+        !iv_collection TYPE string
+      RETURNING
+        VALUE(rt_parts) TYPE zif_abapgit_html=>ty_table_of .
+    METHODS get_collection_names
+      RETURNING
+        VALUE(rt_list) TYPE string_table .
+    METHODS get_collection_size
+      IMPORTING
+        !iv_collection TYPE string
+      RETURNING
+        VALUE(rv_size) TYPE i .
+    METHODS clear.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_named_collection,
+        name TYPE string,
+        pile TYPE zif_abapgit_html=>ty_table_of,
+      END OF ty_named_collection.
+    TYPES:
+      ty_named_collections TYPE STANDARD TABLE OF ty_named_collection WITH KEY name.
+ 
+    DATA mt_part_collections TYPE ty_named_collections.
+ 
+    METHODS get_collection
+      IMPORTING
+        !iv_collection TYPE string
+        !iv_create_if_missing TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rr_collection) TYPE REF TO ty_named_collection .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_PARTS IMPLEMENTATION.
+ 
+ 
+  METHOD add_part.
+ 
+    DATA lr_collection TYPE REF TO ty_named_collection.
+    lr_collection = get_collection(
+      iv_collection = iv_collection
+      iv_create_if_missing = abap_true ).
+    APPEND ii_part TO lr_collection->pile.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD clear.
+    CLEAR mt_part_collections.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_collection.
+ 
+    READ TABLE mt_part_collections REFERENCE INTO rr_collection WITH KEY name = iv_collection.
+    IF sy-subrc <> 0 AND iv_create_if_missing = abap_true.
+      APPEND INITIAL LINE TO mt_part_collections REFERENCE INTO rr_collection.
+      rr_collection->name = iv_collection.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_collection_names.
+ 
+    FIELD-SYMBOLS <ls_coll> LIKE LINE OF mt_part_collections.
+    LOOP AT mt_part_collections ASSIGNING <ls_coll>.
+      APPEND <ls_coll>-name TO rt_list.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_collection_size.
+ 
+    DATA lr_collection TYPE REF TO ty_named_collection.
+    lr_collection = get_collection( iv_collection ).
+    IF lr_collection IS BOUND.
+      rv_size = lines( lr_collection->pile ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_parts.
+ 
+    DATA lr_collection TYPE REF TO ty_named_collection.
+    lr_collection = get_collection( iv_collection ).
+    IF lr_collection IS BOUND.
+      rt_parts = lr_collection->pile.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_html_parts.clas.testclasses.abap.html b/src/ui/core/zcl_abapgit_html_parts.clas.testclasses.abap.html new file mode 100644 index 00000000000..87ab0dd043f --- /dev/null +++ b/src/ui/core/zcl_abapgit_html_parts.clas.testclasses.abap.html @@ -0,0 +1,352 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_html_parts.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_html_parts.clas.testclasses.abap

+
+ +
+ 100% + Statements + 89/89 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 89/89 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +901x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_part_collections DEFINITION
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT
+  FINAL.
+ 
+  PUBLIC SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS test FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_part_collections IMPLEMENTATION.
+ 
+  METHOD test.
+ 
+    DATA lo_html1 TYPE REF TO zcl_abapgit_html.
+    DATA lo_html2 TYPE REF TO zcl_abapgit_html.
+    DATA lo_html3 TYPE REF TO zcl_abapgit_html.
+    DATA lo_html_tmp TYPE REF TO zif_abapgit_html.
+    DATA lo_parts TYPE REF TO zcl_abapgit_html_parts.
+    DATA lt_col_exp TYPE string_table.
+    DATA lt_parts_act TYPE zif_abapgit_html=>ty_table_of.
+ 
+    CREATE OBJECT lo_html1.
+    CREATE OBJECT lo_html2.
+    CREATE OBJECT lo_html3.
+ 
+    CREATE OBJECT lo_parts.
+    lo_parts->add_part(
+      iv_collection = 'ABC'
+      ii_part = lo_html1 ).
+    lo_parts->add_part(
+      iv_collection = 'ABC'
+      ii_part = lo_html2 ).
+    lo_parts->add_part(
+      iv_collection = 'XYZ'
+      ii_part = lo_html3 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_parts->get_collection_size( 'ABC' )
+      exp = 2 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_parts->get_collection_size( 'XYZ' )
+      exp = 1 ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_parts->get_collection_size( '123' )
+      exp = 0 ).
+ 
+    APPEND 'ABC' TO lt_col_exp.
+    APPEND 'XYZ' TO lt_col_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_parts->get_collection_names( )
+      exp = lt_col_exp ).
+ 
+    lt_parts_act = lo_parts->get_parts( 'ABC' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_parts_act )
+      exp = 2 ).
+    READ TABLE lt_parts_act INTO lo_html_tmp INDEX 1.
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_html_tmp
+      exp = lo_html1 ).
+    READ TABLE lt_parts_act INTO lo_html_tmp INDEX 2.
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_html_tmp
+      exp = lo_html2 ).
+ 
+    lt_parts_act = lo_parts->get_parts( 'XYZ' ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_parts_act )
+      exp = 1 ).
+    READ TABLE lt_parts_act INTO lo_html_tmp INDEX 1.
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_html_tmp
+      exp = lo_html3 ).
+ 
+    lt_parts_act = lo_parts->get_parts( '123' ).
+    cl_abap_unit_assert=>assert_initial( lt_parts_act ).
+ 
+    lo_parts->clear( ).
+    cl_abap_unit_assert=>assert_initial( lo_parts->get_collection_names( ) ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcl_abapgit_html_viewer_gui.clas.abap.html b/src/ui/core/zcl_abapgit_html_viewer_gui.clas.abap.html new file mode 100644 index 00000000000..1c634c39af1 --- /dev/null +++ b/src/ui/core/zcl_abapgit_html_viewer_gui.clas.abap.html @@ -0,0 +1,661 @@ + + + + + + Code coverage report for src/ui/core/zcl_abapgit_html_viewer_gui.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcl_abapgit_html_viewer_gui.clas.abap

+
+ +
+ 46.87% + Statements + 90/192 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 46.87% + Lines + 90/192 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +1931x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_html_viewer_gui DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_html_viewer .
+ 
+    METHODS constructor
+      IMPORTING
+        !io_container           TYPE REF TO cl_gui_container DEFAULT cl_gui_container=>screen0
+        !iv_disable_query_table TYPE abap_bool DEFAULT abap_true .
+  PROTECTED SECTION.
+ 
+    DATA mo_html_viewer TYPE REF TO cl_gui_html_viewer .
+ 
+    METHODS on_event
+        FOR EVENT sapevent OF cl_gui_html_viewer
+      IMPORTING
+        !action
+        !frame
+        !getdata
+        !postdata
+        !query_table .
+ 
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_html_viewer_gui IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lt_events TYPE cntl_simple_events,
+          ls_event  LIKE LINE OF lt_events.
+ 
+    CREATE OBJECT mo_html_viewer
+      EXPORTING
+        query_table_disabled = iv_disable_query_table
+        parent               = io_container.
+ 
+    ls_event-eventid    = zif_abapgit_html_viewer=>m_id_sapevent.
+    ls_event-appl_event = abap_true.
+    APPEND ls_event TO lt_events.
+ 
+    mo_html_viewer->set_registered_events( lt_events ).
+    SET HANDLER on_event FOR mo_html_viewer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD on_event.
+
+    RAISE EVENT zif_abapgit_html_viewer~sapevent
+      EXPORTING
+        action      = action
+        frame       = frame
+        getdata     = getdata
+        postdata    = postdata
+        query_table = query_table.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~back.
+
+    mo_html_viewer->go_back( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~close_document.
+
+    mo_html_viewer->close_document( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~free.
+
+    mo_html_viewer->free( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~get_url.
+ 
+    DATA lv_url TYPE c LENGTH 250.
+    mo_html_viewer->get_current_url( IMPORTING url = lv_url ).
+    cl_gui_cfw=>flush( ).
+    rv_url = lv_url.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~load_data.
+
+    DATA lv_url TYPE c LENGTH 250.
+    DATA lv_assigned TYPE c LENGTH 250.
+
+    ASSERT strlen( iv_url ) <= 250.
+    lv_url = iv_url.
+    mo_html_viewer->load_data(
+      EXPORTING
+        url                    = lv_url
+        type                   = iv_type
+        subtype                = iv_subtype
+        size                   = iv_size
+      IMPORTING
+        assigned_url           = lv_assigned
+      CHANGING
+        data_table             = ct_data_table
+      EXCEPTIONS
+        dp_invalid_parameter   = 1
+        dp_error_general       = 2
+        cntl_error             = 3
+        " html_syntax_notcorrect = 4  " not in lower releases
+        OTHERS                 = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error loading data for HTML viewer' ).
+    ENDIF.
+    ev_assigned_url = lv_assigned.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~set_focus.
+    cl_gui_control=>set_focus(
+      EXPORTING
+        control           = mo_html_viewer
+      EXCEPTIONS
+        cntl_error        = 1
+        cntl_system_error = 2
+        OTHERS            = 3 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error in: cl_gui_control=>set_focus - SUBRC = { sy-subrc }| ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~set_registered_events.
+
+    mo_html_viewer->set_registered_events(
+      EXPORTING
+        events                    = it_events
+      EXCEPTIONS
+        cntl_error                = 1
+        cntl_system_error         = 2
+        illegal_event_combination = 3
+        OTHERS                    = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error registering events for HTML viewer' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~set_visiblity.
+    DATA: lv_visible TYPE c LENGTH 1.
+
+    IF iv_visible = abap_true.
+      lv_visible = cl_gui_container=>visible_true.
+    ELSE.
+      lv_visible = cl_gui_container=>visible_false.
+    ENDIF.
+
+    mo_html_viewer->set_visible( lv_visible ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_viewer~show_url.
+
+    DATA lv_url TYPE c LENGTH 250.
+    lv_url = iv_url.
+    mo_html_viewer->show_url(
+      EXPORTING
+        url                    = lv_url
+      EXCEPTIONS
+        cntl_error             = 1
+        cnht_error_not_allowed = 2
+        cnht_error_parameter   = 3
+        dp_error_general       = 4
+        OTHERS                 = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error showing URL in HTML viewer' ).
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/core/zcx_abapgit_cancel.clas.abap.html b/src/ui/core/zcx_abapgit_cancel.clas.abap.html new file mode 100644 index 00000000000..1654c8bf7db --- /dev/null +++ b/src/ui/core/zcx_abapgit_cancel.clas.abap.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/ui/core/zcx_abapgit_cancel.clas.abap + + + + + + + + + +
+
+

All files / src/ui/core zcx_abapgit_cancel.clas.abap

+
+ +
+ 100% + Statements + 46/46 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 46/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcx_abapgit_cancel DEFINITION
+  PUBLIC
+  INHERITING FROM zcx_abapgit_exception
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !textid   LIKE if_t100_message=>t100key OPTIONAL
+        !previous LIKE previous OPTIONAL
+        !log      TYPE REF TO zif_abapgit_log OPTIONAL
+        !msgv1    TYPE symsgv OPTIONAL
+        !msgv2    TYPE symsgv OPTIONAL
+        !msgv3    TYPE symsgv OPTIONAL
+        !msgv4    TYPE symsgv OPTIONAL
+        !longtext TYPE csequence OPTIONAL.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcx_abapgit_cancel IMPLEMENTATION.
+ 
+ 
+  METHOD constructor ##ADT_SUPPRESS_GENERATION.
+    super->constructor(
+      previous = previous
+      log      = log
+      msgv1    = msgv1
+      msgv2    = msgv2
+      msgv3    = msgv3
+      msgv4    = msgv4
+      longtext = longtext ).
+ 
+    CLEAR me->textid.
+ 
+    IF textid IS INITIAL.
+      if_t100_message~t100key = if_t100_message=>default_textid.
+    ELSE.
+      if_t100_message~t100key = textid.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/index.html b/src/ui/index.html new file mode 100644 index 00000000000..b6a48edfa89 --- /dev/null +++ b/src/ui/index.html @@ -0,0 +1,236 @@ + + + + + + Code coverage report for src/ui + + + + + + + + + +
+
+

All files src/ui

+
+ +
+ 33.97% + Statements + 1770/5209 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/37 +
+ + +
+ 33.97% + Lines + 1770/5209 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zabapgit_js_common.w3mi.data.js +
+
0%0/25160%0/10%0/10%0/2516
zcl_abapgit_frontend_services.clas.abap +
+
50.8%221/435100%0/00%0/850.8%221/435
zcl_abapgit_password_dialog.clas.abap +
+
100%75/75100%0/0100%0/0100%75/75
zcl_abapgit_popups.clas.abap +
+
81.83%802/980100%0/00%0/681.83%802/980
zcl_abapgit_popups.clas.locals_imp.abap +
+
37.48%292/779100%0/00%0/1437.48%292/779
zcl_abapgit_ui_factory.clas.abap +
+
98.94%187/1890%0/1100%0/098.94%187/189
zcl_abapgit_ui_injector.clas.abap +
+
100%64/64100%0/0100%0/0100%64/64
zcl_abapgit_ui_injector.clas.locals_imp.abap +
+
92.85%26/28100%0/00%0/292.85%26/28
zcl_abapgit_ui_injector.clas.testclasses.abap +
+
72.02%103/143100%0/00%0/672.02%103/143
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/index.html b/src/ui/lib/index.html new file mode 100644 index 00000000000..728f6c3b0ab --- /dev/null +++ b/src/ui/lib/index.html @@ -0,0 +1,356 @@ + + + + + + Code coverage report for src/ui/lib + + + + + + + + + +
+
+

All files src/ui/lib

+
+ +
+ 91.89% + Statements + 5897/6417 +
+ + +
+ 90.58% + Branches + 77/85 +
+ + +
+ 59.25% + Functions + 32/54 +
+ + +
+ 91.89% + Lines + 5897/6417 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_gui_buttons.clas.abap +
+
100%70/70100%0/0100%0/0100%70/70
zcl_abapgit_gui_chunk_lib.clas.abap +
+
100%1461/1461100%0/0100%0/0100%1461/1461
zcl_abapgit_gui_chunk_lib.clas.testclasses.abap +
+
100%49/49100%3/3100%3/3100%49/49
zcl_abapgit_gui_component.clas.abap +
+
63.88%69/108100%0/00%0/463.88%69/108
zcl_abapgit_gui_in_page_modal.clas.abap +
+
100%82/82100%0/0100%0/0100%82/82
zcl_abapgit_gui_page.clas.abap +
+
85.84%461/537100%0/00%0/685.84%461/537
zcl_abapgit_gui_page_hoc.clas.abap +
+
100%147/147100%0/0100%0/0100%147/147
zcl_abapgit_gui_picklist.clas.abap +
+
95.52%256/268100%0/00%0/195.52%256/268
zcl_abapgit_html_action_utils.clas.abap +
+
100%321/321100%5/5100%0/0100%321/321
zcl_abapgit_html_action_utils.clas.testclasses.abap +
+
100%363/363100%14/14100%14/14100%363/363
zcl_abapgit_html_form.clas.abap +
+
61.65%582/9440%0/20%0/861.65%582/944
zcl_abapgit_html_form_utils.clas.abap +
+
91.61%284/31086.84%33/38100%1/191.61%284/310
zcl_abapgit_html_form_utils.clas.testclasses.abap +
+
99.53%648/651100%10/1076.92%10/1399.53%648/651
zcl_abapgit_html_table.clas.abap +
+
99.01%201/20388.88%8/9100%3/399.01%201/203
zcl_abapgit_html_table.clas.testclasses.abap +
+
100%102/102100%4/4100%1/1100%102/102
zcl_abapgit_html_toolbar.clas.abap +
+
100%277/277100%0/0100%0/0100%277/277
zcl_abapgit_log_viewer.clas.abap +
+
100%524/524100%0/0100%0/0100%524/524
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_gui_buttons.clas.abap.html b/src/ui/lib/zcl_abapgit_gui_buttons.clas.abap.html new file mode 100644 index 00000000000..cd76b1ffb24 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_gui_buttons.clas.abap.html @@ -0,0 +1,295 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_gui_buttons.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_gui_buttons.clas.abap

+
+ +
+ 100% + Statements + 70/70 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 70/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +711x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_buttons DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS new_online
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS new_offline
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS advanced
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS help
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS repo_list
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS settings
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+    CLASS-METHODS experimental
+      RETURNING VALUE(rv_html_string) TYPE string.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_buttons IMPLEMENTATION.
+ 
+ 
+  METHOD advanced.
+    rv_html_string = `<i class="icon icon-tools-solid"></i>`.
+  ENDMETHOD.
+ 
+ 
+  METHOD experimental.
+    rv_html_string = `<i class="icon icon-vial-solid red"></i>`.
+  ENDMETHOD.
+ 
+ 
+  METHOD help.
+    rv_html_string = `<i class="icon icon-question-circle-solid"></i>`.
+  ENDMETHOD.
+ 
+ 
+  METHOD new_offline.
+    rv_html_string = `<i class="icon icon-plug"></i> New Offline`.
+  ENDMETHOD.
+ 
+ 
+  METHOD new_online.
+    rv_html_string = `<i class="icon icon-cloud-upload-alt"></i> New Online`.
+  ENDMETHOD.
+ 
+ 
+  METHOD repo_list.
+    rv_html_string = `<i class="icon icon-bars"></i> Repository List`.
+  ENDMETHOD.
+ 
+ 
+  METHOD settings.
+    rv_html_string = `<i class="icon icon-cog"></i> Settings`.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap.html b/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap.html new file mode 100644 index 00000000000..92748cb774d --- /dev/null +++ b/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap.html @@ -0,0 +1,4468 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_gui_chunk_lib.clas.abap

+
+ +
+ 100% + Statements + 1461/1461 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 1461/1461 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +14621x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_chunk_lib DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_event_signature,
+        method TYPE string,
+        name   TYPE string,
+      END OF  ty_event_signature .
+ 
+    CLASS-METHODS class_constructor .
+    CLASS-METHODS render_error
+      IMPORTING
+        !ix_error       TYPE REF TO zcx_abapgit_exception OPTIONAL
+        !iv_error       TYPE string OPTIONAL
+        !iv_extra_style TYPE string OPTIONAL
+      RETURNING
+        VALUE(ri_html)  TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_repo_top
+      IMPORTING
+        !io_repo               TYPE REF TO zcl_abapgit_repo
+        !iv_show_package       TYPE abap_bool DEFAULT abap_true
+        !iv_show_branch        TYPE abap_bool DEFAULT abap_true
+        !iv_show_commit        TYPE abap_bool DEFAULT abap_true
+        !iv_show_edit          TYPE abap_bool DEFAULT abap_false
+        !iv_interactive_branch TYPE abap_bool DEFAULT abap_false
+        !io_news               TYPE REF TO zcl_abapgit_news OPTIONAL
+      RETURNING
+        VALUE(ri_html)         TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_item_state
+      IMPORTING
+        !iv_lstate     TYPE char1
+        !iv_rstate     TYPE char1
+      RETURNING
+        VALUE(rv_html) TYPE string .
+    CLASS-METHODS render_js_error_banner
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_news
+      IMPORTING
+        !io_news       TYPE REF TO zcl_abapgit_news
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_commit_popup
+      IMPORTING
+        !iv_content    TYPE csequence
+        !iv_id         TYPE csequence
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_error_message_box
+      IMPORTING
+        !ix_error      TYPE REF TO zcx_abapgit_exception
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_order_by_header_cells
+      IMPORTING
+        !it_col_spec         TYPE zif_abapgit_definitions=>ty_col_spec_tt
+        !iv_order_by         TYPE string
+        !iv_order_descending TYPE abap_bool
+      RETURNING
+        VALUE(ri_html)       TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_warning_banner
+      IMPORTING
+        !iv_text       TYPE string
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_infopanel
+      IMPORTING
+        !iv_div_id     TYPE string
+        !iv_title      TYPE string
+        !iv_hide       TYPE abap_bool DEFAULT abap_true
+        !iv_hint       TYPE string OPTIONAL
+        !iv_scrollable TYPE abap_bool DEFAULT abap_true
+        !io_content    TYPE REF TO zif_abapgit_html
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_event_as_form
+      IMPORTING
+        !is_event      TYPE ty_event_signature
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS render_repo_palette
+      IMPORTING
+        iv_action      TYPE string
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS advanced_submenu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS help_submenu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS back_toolbar
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS settings_toolbar
+      IMPORTING
+        !iv_act        TYPE string
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS settings_repo_toolbar
+      IMPORTING
+        !iv_key        TYPE zif_abapgit_persistence=>ty_repo-key
+        !iv_act        TYPE string
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    CLASS-METHODS render_branch_name
+      IMPORTING
+        !iv_branch      TYPE string OPTIONAL
+        !iv_repo_key    TYPE zif_abapgit_persistence=>ty_value OPTIONAL
+        !io_repo        TYPE REF TO zcl_abapgit_repo_online OPTIONAL
+        !iv_interactive TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ri_html)  TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_repo_url
+      IMPORTING
+        iv_url                        TYPE zif_abapgit_persistence=>ty_repo-url
+        iv_render_remote_edit_for_key TYPE zif_abapgit_persistence=>ty_repo-key OPTIONAL
+      RETURNING
+        VALUE(ri_html)                TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_package_name
+      IMPORTING
+        !iv_package        TYPE devclass
+        !iv_interactive    TYPE abap_bool DEFAULT abap_true
+        !iv_suppress_title TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_html)     TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_user_name
+      IMPORTING
+        !iv_username       TYPE syuname
+        !iv_interactive    TYPE abap_bool DEFAULT abap_true
+        !iv_icon_only      TYPE abap_bool DEFAULT abap_false
+        !iv_suppress_title TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_html)     TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_transport
+      IMPORTING
+        !iv_transport   TYPE trkorr
+        !iv_interactive TYPE abap_bool DEFAULT abap_true
+        !iv_icon_only   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_html)  TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS render_sci_result
+      IMPORTING
+        ii_html       TYPE REF TO zif_abapgit_html
+        iv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result.
+ 
+    CLASS-METHODS render_path
+      IMPORTING
+        !iv_path        TYPE string
+        !iv_interactive TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ri_html)  TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS render_timestamp
+      IMPORTING
+        iv_timestamp       TYPE timestampl
+      RETURNING
+        VALUE(rv_rendered) TYPE string.
+ 
+    CLASS-METHODS render_text_input
+      IMPORTING
+        iv_name        TYPE string
+        iv_label       TYPE string
+        iv_value       TYPE string OPTIONAL
+        iv_max_length  TYPE string OPTIONAL
+        iv_autofocus   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html.
+ 
+    CLASS-METHODS shorten_repo_url
+      IMPORTING
+        iv_full_url         TYPE string
+        iv_max_length       TYPE i DEFAULT 60
+      RETURNING
+        VALUE(rv_shortened) TYPE string.
+ 
+    CLASS-METHODS render_label_list
+      IMPORTING
+        it_labels           TYPE string_table
+        io_label_colors     TYPE REF TO zcl_abapgit_string_map
+        iv_clickable_action TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_html)      TYPE string.
+ 
+    CLASS-METHODS render_help_hint
+      IMPORTING
+        iv_text_to_wrap TYPE string
+      RETURNING
+        VALUE(rv_html)  TYPE string.
+ 
+    CLASS-METHODS get_item_icon
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+    CLASS-METHODS get_item_link
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+  PROTECTED SECTION.
+ 
+    CLASS-METHODS render_repo_top_commit_hash
+      IMPORTING
+        !ii_html        TYPE REF TO zif_abapgit_html
+        !io_repo_online TYPE REF TO zcl_abapgit_repo_online
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gv_time_zone TYPE timezone .
+ 
+    CLASS-METHODS get_t100_text
+      IMPORTING
+        !iv_msgid      TYPE scx_t100key-msgid
+        !iv_msgno      TYPE scx_t100key-msgno
+      RETURNING
+        VALUE(rv_text) TYPE string .
+    CLASS-METHODS normalize_program_name
+      IMPORTING
+        !iv_program_name                  TYPE sy-repid
+      RETURNING
+        VALUE(rv_normalized_program_name) TYPE string .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION.
+ 
+ 
+  METHOD advanced_submenu.
+ 
+    DATA lv_supports_ie_devtools TYPE abap_bool.
+ 
+    lv_supports_ie_devtools = zcl_abapgit_ui_factory=>get_frontend_services( )->is_sapgui_for_windows( ).
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add(
+      iv_txt = 'Database Utility'
+      iv_act = zif_abapgit_definitions=>c_action-go_db
+    )->add(
+      iv_txt = 'Package to ZIP'
+      iv_act = zif_abapgit_definitions=>c_action-zip_package
+    )->add(
+      iv_txt = 'Transport to ZIP'
+      iv_act = zif_abapgit_definitions=>c_action-zip_transport
+    )->add(
+      iv_txt = 'Object to Files'
+      iv_act = zif_abapgit_definitions=>c_action-zip_object
+    )->add(
+      iv_txt = 'Debug Info'
+      iv_act = zif_abapgit_definitions=>c_action-go_debuginfo ).
+ 
+    IF lv_supports_ie_devtools = abap_true.
+      ro_menu->add(
+        iv_txt = 'Open IE DevTools'
+        iv_act = zif_abapgit_definitions=>c_action-ie_devtools ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD back_toolbar.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-back'.
+ 
+    ro_menu->add(
+      iv_txt = 'Back'
+      iv_act = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_constructor.
+ 
+    DATA lv_fm TYPE string.
+    lv_fm = 'GET_SYSTEM_TIMEZONE'.
+ 
+    TRY.
+        CALL METHOD ('CL_ABAP_TSTMP')=>get_system_timezone
+          RECEIVING
+            system_timezone = gv_time_zone.
+      CATCH cx_sy_dyn_call_illegal_method.
+        CALL FUNCTION lv_fm
+          IMPORTING
+            timezone            = gv_time_zone
+          EXCEPTIONS
+            customizing_missing = 1
+            OTHERS              = 2.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_item_icon.
+ 
+    CASE is_item-obj_type.
+      WHEN 'PROG' OR 'CLAS' OR 'FUGR' OR 'INTF' OR 'TYPE'.
+        rv_html = zcl_abapgit_html=>icon( iv_name = 'file-code/darkgrey'
+                                          iv_hint = 'Code' ).
+      WHEN 'W3MI' OR 'W3HT' OR 'SFPF'.
+        rv_html = zcl_abapgit_html=>icon( iv_name = 'file-image/darkgrey'
+                                          iv_hint = 'Binary' ).
+      WHEN 'DEVC'.
+        rv_html = zcl_abapgit_html=>icon( iv_name = 'box/darkgrey'
+                                          iv_hint = 'Package' ).
+      WHEN ''.
+        rv_html = space. " no icon
+      WHEN OTHERS.
+        rv_html = zcl_abapgit_html=>icon( 'file-alt/darkgrey' ).
+    ENDCASE.
+ 
+    IF is_item-is_dir = abap_true.
+      rv_html = zcl_abapgit_html=>icon( iv_name = 'folder/darkgrey'
+                                        iv_hint = 'Folder' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_item_link.
+ 
+    DATA lv_encode TYPE string.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+ 
+    CREATE OBJECT li_html TYPE zcl_abapgit_html.
+ 
+    lv_encode = zcl_abapgit_html_action_utils=>jump_encode(
+      iv_obj_type = is_item-obj_type
+      iv_obj_name = is_item-obj_name ).
+ 
+    rv_html = li_html->a(
+      iv_txt = |{ is_item-obj_name }|
+      iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_encode }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_t100_text.
+ 
+    MESSAGE ID iv_msgid TYPE 'S' NUMBER iv_msgno WITH '&1' '&2' '&3' '&4' INTO rv_text.
+ 
+    " Don't return any generic messages like `&1 &2 &3 &4`
+    IF rv_text CO ' 0123456789&'.
+      CLEAR rv_text.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD help_submenu.
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add(
+      iv_txt = 'Tutorial'
+      iv_act = zif_abapgit_definitions=>c_action-go_tutorial
+    )->add(
+      iv_txt = 'Documentation'
+      iv_act = zif_abapgit_definitions=>c_action-documentation
+    )->add(
+      iv_txt = 'Explore'
+      iv_act = zif_abapgit_definitions=>c_action-go_explore
+    )->add(
+      iv_txt = 'Changelog'
+      iv_act = zif_abapgit_definitions=>c_action-changelog
+    )->add(
+      iv_txt = 'Hotkeys'
+      iv_act = zif_abapgit_definitions=>c_action-show_hotkeys ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_program_name.
+ 
+    rv_normalized_program_name = substring_before(
+      val   = iv_program_name
+      regex = `(=+CP)?$` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_branch_name.
+ 
+    DATA:
+      lv_key              TYPE string,
+      lv_branch           TYPE string,
+      lv_selected_commit  TYPE string,
+      lv_commit_short_sha TYPE string,
+      lv_text             TYPE string,
+      lv_icon             TYPE string,
+      lv_hint             TYPE string,
+      lv_class            TYPE string.
+ 
+    IF iv_repo_key IS NOT INITIAL.
+      lv_key = iv_repo_key.
+    ELSEIF io_repo IS BOUND.
+      lv_key = io_repo->get_key( ).
+    ELSE.
+      zcx_abapgit_exception=>raise( 'Either iv_repo_key or io_repo must be supplied' ).
+    ENDIF.
+ 
+    IF iv_branch IS NOT INITIAL.
+      lv_branch = iv_branch.
+      lv_text = zcl_abapgit_git_branch_list=>get_display_name( lv_branch ).
+    ELSEIF io_repo IS BOUND.
+      lv_selected_commit = io_repo->get_selected_commit( ).
+      IF lv_selected_commit IS NOT INITIAL.
+        "Convert to short commit. Example: (ae623b9...)
+        lv_commit_short_sha = lv_selected_commit+0(7).
+        lv_text = |({ lv_commit_short_sha }...)|.
+      ELSE.
+        lv_branch = io_repo->get_selected_branch( ).
+        lv_text = zcl_abapgit_git_branch_list=>get_display_name( lv_branch ).
+      ENDIF.
+    ELSE.
+      zcx_abapgit_exception=>raise( 'Either iv_branch or io_repo must be supplied' ).
+    ENDIF.
+ 
+    CASE zcl_abapgit_git_branch_list=>get_type( lv_branch ).
+      WHEN zif_abapgit_git_definitions=>c_git_branch_type-branch.
+        lv_class = 'branch branch_branch'.
+        lv_icon  = 'code-branch/grey70'.
+        lv_hint  = 'Current branch'.
+      WHEN zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag
+        OR zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag.
+        lv_class = 'branch'.
+        lv_icon  = 'tag-solid/grey70'.
+        lv_hint  = 'Current tag'.
+      WHEN OTHERS.
+        lv_class = 'branch branch_branch'.
+        lv_icon  = 'code-branch/grey70'.
+        lv_hint  = 'Current commit'.
+    ENDCASE.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( |<span class="{ lv_class }">| ).
+    ri_html->add_icon( iv_name = lv_icon
+                       iv_hint = lv_hint ).
+    IF iv_interactive = abap_true.
+      ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ lv_key }|
+                      iv_txt = lv_text ).
+    ELSE.
+      ri_html->add( lv_text ).
+    ENDIF.
+    ri_html->add( '</span>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_commit_popup.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<ul class="hotkeys">' ).
+    ri_html->add( |<li>| && |<span>{ iv_content }</span>| && |</li>| ).
+    ri_html->add( '</ul>' ).
+ 
+    ri_html = render_infopanel(
+      iv_div_id     = |{ iv_id }|
+      iv_title      = 'Commit details'
+      iv_hide       = abap_true
+      iv_scrollable = abap_false
+      io_content    = ri_html ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_error.
+ 
+    DATA lv_error TYPE string.
+    DATA lv_class TYPE string VALUE 'panel error center'.
+ 
+    IF iv_extra_style IS NOT INITIAL.
+      lv_class = lv_class && ` ` && iv_extra_style.
+    ENDIF.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF ix_error IS BOUND.
+      lv_error = ix_error->get_text( ).
+    ELSE.
+      lv_error = iv_error.
+    ENDIF.
+ 
+    ri_html->add( |<div class="{ lv_class }">| ).
+    ri_html->add( |{ ri_html->icon( 'exclamation-circle/red' ) } { lv_error }| ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_error_message_box.
+ 
+    DATA:
+      lv_error_text          TYPE string,
+      lv_longtext            TYPE string,
+      lt_longtext_paragraphs TYPE string_table,
+      lv_program_name        TYPE sy-repid,
+      lv_title               TYPE string,
+      lv_text                TYPE string.
+    FIELD-SYMBOLS:
+      <lv_longtext_paragraph> TYPE string.
+ 
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_error_text = ix_error->get_text( ).
+    lv_longtext = ix_error->if_message~get_longtext( abap_true ).
+ 
+    IF lv_longtext IS NOT INITIAL.
+      lv_error_text = |{ lv_error_text } <span class="emphasis">More...</span>|.
+ 
+      REPLACE FIRST OCCURRENCE OF REGEX
+        |({ zcx_abapgit_exception=>c_section_text-cause }{ cl_abap_char_utilities=>newline })|
+        IN lv_longtext WITH |<h3>$1</h3>|.
+ 
+      REPLACE FIRST OCCURRENCE OF REGEX
+        |({ zcx_abapgit_exception=>c_section_text-system_response }{ cl_abap_char_utilities=>newline })|
+        IN lv_longtext WITH |<h3>$1</h3>|.
+ 
+      REPLACE FIRST OCCURRENCE OF REGEX
+        |({ zcx_abapgit_exception=>c_section_text-what_to_do }{ cl_abap_char_utilities=>newline })|
+        IN lv_longtext WITH |<h3>$1</h3>|.
+ 
+      REPLACE FIRST OCCURRENCE OF REGEX
+        |({ zcx_abapgit_exception=>c_section_text-sys_admin }{ cl_abap_char_utilities=>newline })|
+        IN lv_longtext WITH |<h3>$1</h3>|.
+ 
+      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf
+        IN lv_longtext
+        WITH cl_abap_char_utilities=>newline.
+ 
+      SPLIT lv_longtext AT cl_abap_char_utilities=>newline INTO TABLE lt_longtext_paragraphs.
+      CLEAR lv_longtext.
+ 
+      LOOP AT lt_longtext_paragraphs ASSIGNING <lv_longtext_paragraph>.
+        CONDENSE <lv_longtext_paragraph>.
+ 
+        IF <lv_longtext_paragraph> IS INITIAL.
+          CONTINUE.
+        ENDIF.
+ 
+        lv_longtext = |{ lv_longtext }<p>{ <lv_longtext_paragraph> }</p>{ cl_abap_char_utilities=>newline }|.
+      ENDLOOP.
+    ENDIF.
+ 
+    ri_html->add( |<div id="message" class="message-panel">| ).
+    ri_html->add( |{ ri_html->icon( 'exclamation-circle/red' ) } { lv_error_text }| ).
+    ri_html->add( |<div class="message-panel-bar">| ).
+ 
+    ri_html->add_a(
+      iv_txt   = `&#x274c;`
+      iv_act   = `toggleDisplay('message')`
+      iv_class = `close-btn`
+      iv_typ   = zif_abapgit_html=>c_action_type-onclick ).
+ 
+    ri_html->add( |</div>| ).
+ 
+    ri_html->add( |<div class="message-panel-bar message-panel-commands">| ).
+ 
+    IF ix_error->if_t100_message~t100key-msgid IS NOT INITIAL.
+ 
+      lv_title = get_t100_text(
+        iv_msgid = ix_error->if_t100_message~t100key-msgid
+        iv_msgno = ix_error->if_t100_message~t100key-msgno ).
+ 
+      IF lv_title IS NOT INITIAL.
+        lv_text = |Message ({ ix_error->if_t100_message~t100key-msgid }/{ ix_error->if_t100_message~t100key-msgno })|.
+ 
+        ri_html->add_a(
+          iv_txt   = lv_text
+          iv_typ   = zif_abapgit_html=>c_action_type-sapevent
+          iv_act   = zif_abapgit_definitions=>c_action-goto_message
+          iv_title = lv_title
+          iv_id    = `a_goto_message` ).
+      ENDIF.
+    ENDIF.
+ 
+    ix_error->get_source_position( IMPORTING program_name = lv_program_name ).
+ 
+    lv_title = normalize_program_name( lv_program_name ).
+ 
+    ri_html->add_a(
+      iv_txt   = `Goto source`
+      iv_act   = zif_abapgit_definitions=>c_action-goto_source
+      iv_typ   = zif_abapgit_html=>c_action_type-sapevent
+      iv_title = lv_title
+      iv_id    = `a_goto_source` ).
+ 
+    ri_html->add_a(
+      iv_txt = `Callstack`
+      iv_act = zif_abapgit_definitions=>c_action-show_callstack
+      iv_typ = zif_abapgit_html=>c_action_type-sapevent
+      iv_id  = `a_callstack` ).
+ 
+    ri_html->add( |</div>| ).
+    ri_html->add( |<div class="message-panel-commands">| ).
+    ri_html->add( |{ lv_longtext }| ).
+    ri_html->add( |</div>| ).
+    ri_html->add( |</div>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_event_as_form.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add(
+      |<form id="form_{ is_event-name }" method="{ is_event-method }" action="sapevent:{ is_event-name }"></form>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_help_hint.
+ 
+    " TODO potentially move to or integrate with zcl_abapgit_html_form
+ 
+    DATA lt_fragments TYPE string_table.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+    li_html = zcl_abapgit_html=>create( ).
+ 
+    APPEND `<div class="form-field-help-tooltip">` TO lt_fragments.
+    APPEND li_html->icon(
+      iv_name = 'question-circle-solid'
+      iv_class = 'blue' ) TO lt_fragments.
+    APPEND `<div class="form-field-help-tooltip-text">` TO lt_fragments.
+    APPEND iv_text_to_wrap TO lt_fragments.
+    APPEND `</div>` TO lt_fragments.
+    APPEND `</div>` TO lt_fragments.
+ 
+    rv_html = concat_lines_of( table = lt_fragments ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_infopanel.
+ 
+    DATA lv_display TYPE string.
+    DATA lv_class TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_hide = abap_true. " Initially hide
+      lv_display = 'display:none'.
+    ENDIF.
+ 
+    lv_class = 'info-panel'.
+    IF iv_scrollable = abap_false. " Initially hide
+      lv_class = lv_class && ' info-panel-fixed'.
+    ENDIF.
+ 
+    ri_html->add( |<div id="{ iv_div_id }" class="{ lv_class }" style="{ lv_display }">| ).
+ 
+    ri_html->add( |<div class="info-title">{ iv_title }|
+               && '<div class="float-right">'
+               && ri_html->a(
+                    iv_txt   = '&#x274c;'
+                    iv_typ   = zif_abapgit_html=>c_action_type-onclick
+                    iv_act   = |toggleDisplay('{ iv_div_id }')|
+                    iv_class = 'close-btn' )
+               && '</div></div>' ).
+ 
+    IF iv_hint IS NOT INITIAL.
+      ri_html->add( '<div class="info-hint">'
+        && ri_html->icon( iv_name = 'exclamation-triangle'
+                          iv_class = 'pad-right' )
+        && iv_hint
+        && '</div>' ).
+    ENDIF.
+ 
+    ri_html->add( |<div class="info-list">| ).
+    ri_html->add( io_content ).
+    ri_html->add( '</div>' ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_state.
+ 
+    DATA: lv_system TYPE string.
+ 
+    FIELD-SYMBOLS <lv_state> TYPE char1.
+ 
+ 
+    rv_html = '<span class="state-block">'.
+ 
+    DO 2 TIMES.
+      CASE sy-index.
+        WHEN 1.
+          ASSIGN iv_lstate TO <lv_state>.
+          lv_system = 'Local:'.
+        WHEN 2.
+          ASSIGN iv_rstate TO <lv_state>.
+          lv_system = 'Remote:'.
+      ENDCASE.
+ 
+      CASE <lv_state>.
+        WHEN zif_abapgit_definitions=>c_state-unchanged.  "None or unchanged
+          IF iv_lstate = zif_abapgit_definitions=>c_state-added OR iv_rstate = zif_abapgit_definitions=>c_state-added.
+            rv_html = rv_html && |<span class="none" title="{ lv_system } Not exists">X</span>|.
+          ELSE.
+            rv_html = rv_html && |<span class="none" title="{ lv_system } No changes">&nbsp;</span>|.
+          ENDIF.
+        WHEN zif_abapgit_definitions=>c_state-modified.   "Changed
+          rv_html = rv_html && |<span class="changed" title="{ lv_system } Modified">M</span>|.
+        WHEN zif_abapgit_definitions=>c_state-added.      "Added new
+          rv_html = rv_html && |<span class="added" title="{ lv_system } Added new">A</span>|.
+        WHEN zif_abapgit_definitions=>c_state-mixed.      "Multiple changes (multifile)
+          rv_html = rv_html && |<span class="mixed" title="{ lv_system } Multiple changes">&#x25A0;</span>|.
+        WHEN zif_abapgit_definitions=>c_state-deleted.    "Deleted
+          rv_html = rv_html && |<span class="deleted" title="{ lv_system } Deleted">D</span>|.
+      ENDCASE.
+    ENDDO.
+ 
+    rv_html = rv_html && '</span>'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_js_error_banner.
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( '<div id="js-error-banner" class="dummydiv error">' ).
+    ri_html->add( |{ ri_html->icon( 'exclamation-triangle/red' ) }| &&
+                  ' If this does not disappear soon,' &&
+                  ' then there is a JS init error, please log an issue' ).
+    ri_html->add( '</div>' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD render_label_list.
+ 
+    DATA lt_fragments TYPE string_table.
+    DATA lv_l TYPE string.
+    DATA lv_class TYPE string.
+    DATA lv_style TYPE string.
+    DATA ls_parsed_color TYPE zcl_abapgit_repo_labels=>ty_color.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+ 
+    IF it_labels IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    li_html = zcl_abapgit_html=>create( ).
+ 
+    APPEND `<ul class="repo-labels">` TO lt_fragments.
+ 
+    LOOP AT it_labels INTO lv_l WHERE table_line IS NOT INITIAL.
+      CLEAR lv_class.
+      CLEAR lv_style.
+      ls_parsed_color = zcl_abapgit_repo_labels=>parse_color( io_label_colors->get( lv_l ) ).
+      IF ls_parsed_color-cls IS NOT INITIAL.
+        lv_class = | class="rl-{ ls_parsed_color-cls }"|.
+      ELSEIF ls_parsed_color-fg IS NOT INITIAL OR ls_parsed_color-bg IS NOT INITIAL.
+        lv_style = ` style="`.
+        IF ls_parsed_color-fg IS NOT INITIAL.
+          lv_style = lv_style && |color:#{ ls_parsed_color-fg };|.
+        ENDIF.
+        IF ls_parsed_color-bg IS NOT INITIAL.
+          lv_style = lv_style && |background-color:#{ ls_parsed_color-bg };|.
+          lv_style = lv_style && |border-color:#{ ls_parsed_color-bg };|.
+        ENDIF.
+        lv_style = lv_style && `"`.
+      ENDIF.
+ 
+      IF iv_clickable_action IS NOT INITIAL.
+        lv_l = li_html->a(
+          iv_txt = lv_l
+          iv_act = |{ iv_clickable_action }|
+          iv_class = 'command'
+          iv_query = lv_l ).
+      ENDIF.
+      lv_l = |<li{ lv_class }{ lv_style }>{ lv_l }</li>|.
+      APPEND lv_l TO lt_fragments.
+    ENDLOOP.
+ 
+    APPEND `</ul>` TO lt_fragments.
+ 
+    rv_html = concat_lines_of( table = lt_fragments ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_news.
+ 
+    DATA: lv_text TYPE string,
+          lv_hint TYPE string,
+          lv_ul   TYPE abap_bool,
+          lt_log  TYPE zcl_abapgit_news=>ty_logs.
+ 
+    FIELD-SYMBOLS: <ls_line> LIKE LINE OF lt_log.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF io_news IS NOT BOUND OR io_news->has_news( ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    lt_log = io_news->get_log( ).
+ 
+    " Render news
+    LOOP AT lt_log ASSIGNING <ls_line>.
+      IF <ls_line>-is_header = abap_true.
+        IF <ls_line>-pos_to_cur > 0.
+          lv_text = <ls_line>-text && '<span class="version-marker update">update</span>'.
+        ELSEIF <ls_line>-pos_to_cur = 0.
+          lv_text = <ls_line>-text && '<span class="version-marker">current</span>'.
+        ELSE. " < 0
+          lv_text = <ls_line>-text.
+        ENDIF.
+        IF lv_ul = abap_true.
+          ri_html->add( |</ul>| ).
+        ENDIF.
+        ri_html->add( |<h1>{ lv_text }</h1>| ).
+        ri_html->add( |<ul>| ).
+        lv_ul = abap_true.
+      ELSE.
+        <ls_line>-text = escape( val    = <ls_line>-text
+                                 format = cl_abap_format=>e_html_text ).
+        ri_html->add( |<li>{ <ls_line>-text }</li>| ).
+      ENDIF.
+    ENDLOOP.
+    IF lv_ul = abap_true.
+      ri_html->add( |</ul>| ).
+    ENDIF.
+ 
+    " Wrap
+    IF io_news->has_important( ) = abap_true.
+      lv_hint = 'Please note changes marked with "!"'.
+    ENDIF.
+ 
+    ri_html = render_infopanel(
+      iv_div_id  = 'news'
+      iv_title   = 'Announcement of the latest changes'
+      iv_hint    = lv_hint
+      iv_hide    = boolc( io_news->has_unseen( ) = abap_false )
+      io_content = ri_html ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_order_by_header_cells.
+ 
+    DATA:
+      lv_tmp       TYPE string,
+      lv_disp_name TYPE string.
+ 
+    FIELD-SYMBOLS <ls_col> LIKE LINE OF it_col_spec.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    LOOP AT it_col_spec ASSIGNING <ls_col>.
+      " e.g. <th class="ro-detail">Created at [{ gv_time_zone }]</th>
+      lv_tmp = '<th'.
+      IF <ls_col>-css_class IS NOT INITIAL.
+        lv_tmp = lv_tmp && | class="{ <ls_col>-css_class }"|.
+      ENDIF.
+      lv_tmp = lv_tmp && '>'.
+ 
+      IF <ls_col>-display_name IS NOT INITIAL.
+        lv_disp_name = <ls_col>-display_name.
+        IF <ls_col>-add_tz = abap_true.
+          lv_disp_name = lv_disp_name && | [{ gv_time_zone }]|.
+        ENDIF.
+        IF <ls_col>-tech_name = iv_order_by.
+          IF iv_order_descending = abap_true.
+            lv_tmp = lv_tmp && ri_html->a(
+              iv_txt   = lv_disp_name
+              iv_act   = |{ zif_abapgit_definitions=>c_action-change_order_by }|
+              iv_title = <ls_col>-title ).
+          ELSE.
+            lv_tmp = lv_tmp && ri_html->a(
+              iv_txt   = lv_disp_name
+              iv_act   = |{ zif_abapgit_definitions=>c_action-direction }?direction=DESCENDING|
+              iv_title = <ls_col>-title ).
+          ENDIF.
+        ELSEIF <ls_col>-allow_order_by = abap_true.
+          lv_tmp = lv_tmp && ri_html->a(
+            iv_txt   = lv_disp_name
+            iv_act   = |{ zif_abapgit_definitions=>c_action-change_order_by }?orderBy={ <ls_col>-tech_name }|
+            iv_title = <ls_col>-title ).
+        ELSE.
+          lv_tmp = lv_tmp && lv_disp_name.
+        ENDIF.
+      ENDIF.
+      IF <ls_col>-tech_name = iv_order_by
+      AND iv_order_by IS NOT INITIAL.
+        IF iv_order_descending = abap_true.
+          lv_tmp = lv_tmp && | &#x25BE;|. " arrow down
+        ELSE.
+          lv_tmp = lv_tmp && | &#x25B4;|. " arrow up
+        ENDIF.
+      ENDIF.
+ 
+      lv_tmp = lv_tmp && '</th>'.
+      ri_html->add( lv_tmp ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_package_name.
+ 
+    DATA:
+      lv_obj_name TYPE tadir-obj_name,
+      lv_jump     TYPE string,
+      lv_title    TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_package IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_suppress_title = abap_false.
+      lv_title = zcl_abapgit_factory=>get_sap_package( iv_package )->read_description( ).
+    ENDIF.
+ 
+    lv_obj_name = iv_package.
+    lv_jump = zcl_abapgit_html_action_utils=>jump_encode(
+      iv_obj_type = 'DEVC'
+      iv_obj_name = lv_obj_name ).
+ 
+    ri_html->add( |<span class="package-box">| ).
+    ri_html->add_icon( iv_name = 'box/grey70'
+                       iv_hint = 'SAP package' ).
+    IF iv_interactive = abap_true.
+      ri_html->add_a( iv_act   = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_jump }|
+                      iv_title = lv_title
+                      iv_txt   = |{ iv_package }| ).
+    ELSE.
+      ri_html->add( iv_package ).
+    ENDIF.
+    ri_html->add( '</span>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_path.
+ 
+    DATA:
+      lv_path    TYPE string,
+      lv_jump    TYPE string,
+      lv_folder  TYPE string,
+      lt_folders TYPE STANDARD TABLE OF string WITH DEFAULT KEY.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_path IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_jump = |{ zcl_abapgit_gui_page_repo_view=>c_actions-change_dir }?PATH=|.
+ 
+    ri_html->add( |<span class="path-box">| ).
+ 
+    IF iv_interactive = abap_true.
+      SPLIT iv_path AT '/' INTO TABLE lt_folders.
+ 
+      LOOP AT lt_folders INTO lv_folder.
+        IF lv_folder IS INITIAL.
+          " root
+          lv_path = '/'.
+        ELSEIF sy-tabix < lines( lt_folders ).
+          lv_path = lv_path && lv_folder && '/'.
+          ri_html->add_a( iv_act = lv_jump && lv_path
+                          iv_txt = lv_folder ).
+        ELSE.
+          " no link for current folder
+          ri_html->add( | <strong>{ lv_folder }</strong> | ).
+        ENDIF.
+        ri_html->add( '/' ).
+      ENDLOOP.
+    ELSE.
+      ri_html->add( iv_path ).
+    ENDIF.
+ 
+    ri_html->add( '</span>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_palette.
+ 
+    DATA lt_repo_obj_list TYPE zif_abapgit_repo_srv=>ty_repo_list.
+    DATA lt_repo_list TYPE zif_abapgit_persistence=>ty_repos.
+    DATA lv_repo_json TYPE string.
+    DATA lv_size TYPE i.
+    DATA ls_repo_data LIKE LINE OF lt_repo_list.
+ 
+    FIELD-SYMBOLS:
+      <ls_repo>     LIKE LINE OF lt_repo_list,
+      <lr_repo_obj> LIKE LINE OF lt_repo_obj_list.
+ 
+    lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+ 
+    LOOP AT lt_repo_obj_list ASSIGNING <lr_repo_obj>.
+      ls_repo_data = <lr_repo_obj>->ms_data.
+      ls_repo_data-local_settings-display_name = <lr_repo_obj>->get_name( ).
+      APPEND ls_repo_data TO lt_repo_list.
+    ENDLOOP.
+ 
+    lv_size = lines( lt_repo_list ).
+    SORT lt_repo_list BY local_settings-display_name AS TEXT.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( 'var repoCatalog = [' ). " Maybe separate this into another method if needed in more places
+    LOOP AT lt_repo_list ASSIGNING <ls_repo>.
+      lv_repo_json = |\{ key: "{ <ls_repo>-key
+        }", isOffline: "{ <ls_repo>-offline
+        }", displayName: "{ <ls_repo>-local_settings-display_name }"  \}|.
+      IF sy-tabix < lv_size.
+        lv_repo_json = lv_repo_json && ','.
+      ENDIF.
+      ri_html->add( lv_repo_json ).
+    ENDLOOP.
+    ri_html->add( '];' ).
+ 
+    ri_html->add( |var gGoRepoPalette = new CommandPalette(createRepoCatalogEnumerator(repoCatalog, "{
+      iv_action }"), \{| ).
+    ri_html->add( '  toggleKey: "F2",' ).
+    ri_html->add( '  hotkeyDescription: "Go to Repository ..."' ).
+    ri_html->add( '});' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_top.
+ 
+    DATA: lo_repo_online TYPE REF TO zcl_abapgit_repo_online,
+          lo_pback       TYPE REF TO zcl_abapgit_persist_background,
+          lx_error       TYPE REF TO zcx_abapgit_exception,
+          lv_hint        TYPE string,
+          lv_icon        TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    CREATE OBJECT lo_pback.
+ 
+    IF io_repo->is_offline( ) = abap_true.
+      lv_icon = 'plug/darkgrey'.
+      lv_hint = 'Offline Repository'.
+    ELSE.
+      lv_icon = 'cloud-upload-alt/blue'.
+      lv_hint = 'On-line Repository'.
+    ENDIF.
+ 
+    ri_html->add( '<table class="w100"><tr>' ).
+ 
+    ri_html->add( '<td class="repo_name">' ).
+ 
+    " Repo type and name
+    ri_html->add_icon( iv_name = lv_icon
+                       iv_hint = lv_hint ).
+    ri_html->add( |<span class="name">{ io_repo->get_name( ) }</span>| ).
+    IF io_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= io_repo.
+ 
+      ri_html->add_a( iv_txt   = lo_repo_online->get_url( )
+                      iv_act   = |{ zif_abapgit_definitions=>c_action-url }?url=|
+                              && |{ lo_repo_online->get_url( ) }|
+                      iv_class = |url| ).
+    ENDIF.
+ 
+    IF iv_show_edit = abap_true.
+      ri_html->add_a( iv_txt   = ri_html->icon( iv_name  = 'edit-solid'
+                                                iv_class = 'pad-sides'
+                                                iv_hint  = 'Change Remote' )
+                      iv_act   = |{ zif_abapgit_definitions=>c_action-repo_remote_settings }?| &&
+                                 |key={ io_repo->get_key( ) }|
+                      iv_class = |url| ).
+    ENDIF.
+ 
+    IF io_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= io_repo.
+ 
+      ri_html->add_a( iv_txt   = ri_html->icon( iv_name  = 'copy-solid'
+                                                iv_class = 'pad-sides'
+                                                iv_hint  = 'Copy URL to Clipboard' )
+                      iv_act   = |{ zif_abapgit_definitions=>c_action-clipboard }| &&
+                                 |?clipboard={ lo_repo_online->get_url( ) }|
+                      iv_class = |url| ).
+    ENDIF.
+ 
+    IF io_repo->is_offline( ) = abap_false AND iv_show_commit = abap_true.
+      TRY.
+          render_repo_top_commit_hash( ii_html        = ri_html
+                                       io_repo_online = lo_repo_online ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          " In case of missing or wrong credentials, show message in status bar
+          lv_hint = lx_error->get_text( ).
+          IF lv_hint CS 'credentials'.
+            MESSAGE lv_hint TYPE 'S' DISPLAY LIKE 'E'.
+          ENDIF.
+      ENDTRY.
+    ENDIF.
+ 
+    " News
+    IF io_news IS BOUND AND io_news->has_news( ) = abap_true.
+      IF io_news->has_updates( ) = abap_true.
+        lv_icon = 'arrow-circle-up/warning'.
+      ELSE.
+        lv_icon = 'arrow-circle-up'.
+      ENDIF.
+      ri_html->add_a( iv_act   = |toggleDisplay('news')|
+                      iv_typ   = zif_abapgit_html=>c_action_type-onclick
+                      iv_txt   = ri_html->icon( iv_name  = lv_icon
+                                                iv_class = 'pad-sides'
+                                                iv_hint  = 'Display Changelog' )
+                      iv_class = |url| ).
+    ENDIF.
+    ri_html->add( '</td>' ).
+ 
+    ri_html->add( '<td class="repo_attr right">' ).
+ 
+    " Fav
+    IF abap_true = zcl_abapgit_persistence_user=>get_instance( )->is_favorite_repo( io_repo->get_key( ) ).
+      lv_icon = 'star/blue'.
+    ELSE.
+      lv_icon = 'star/grey'.
+    ENDIF.
+    ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?key={ io_repo->get_key( ) }|
+                    iv_txt = ri_html->icon( iv_name  = lv_icon
+                                            iv_class = 'pad-sides'
+                                            iv_hint  = 'Toggle Favorite' ) ).
+ 
+    " BG
+    IF lo_pback->exists( io_repo->get_key( ) ) = abap_true.
+      ri_html->add( '<span class="bg_marker" title="background">BG</span>' ).
+    ENDIF.
+ 
+    " Write protect
+    IF io_repo->get_local_settings( )-write_protected = abap_true.
+      ri_html->add_icon( iv_name = 'lock/grey70'
+                         iv_hint = 'Locked from Pulls' ).
+    ENDIF.
+ 
+    " Branch
+    IF io_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= io_repo.
+      IF iv_show_branch = abap_true.
+        ri_html->add( render_branch_name( io_repo        = lo_repo_online
+                                          iv_interactive = iv_interactive_branch ) ).
+      ENDIF.
+    ENDIF.
+ 
+    " Package
+    IF iv_show_package = abap_true.
+      ri_html->add( render_package_name( io_repo->get_package( ) ) ).
+    ENDIF.
+ 
+    ri_html->add( '</td>' ).
+    ri_html->add( '</tr></table>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_top_commit_hash.
+ 
+    DATA: lv_commit_hash       TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_commit_short_hash TYPE zif_abapgit_git_definitions=>ty_sha1,
+          lv_display_url       TYPE zif_abapgit_persistence=>ty_repo-url,
+          lo_url               TYPE REF TO zcl_abapgit_git_url,
+          lv_icon_commit       TYPE string.
+ 
+    lv_commit_hash = io_repo_online->get_current_remote( ).
+    lv_commit_short_hash = lv_commit_hash(7).
+ 
+    lv_icon_commit = ii_html->icon( iv_name  = 'code-commit'
+                                    iv_class = 'pad-sides'
+                                    iv_hint  = 'Commit' ).
+ 
+    CREATE OBJECT lo_url.
+ 
+    TRY.
+        lv_display_url = lo_url->get_commit_display_url( io_repo_online ).
+ 
+        ii_html->add_a( iv_txt   = |{ lv_icon_commit }{ lv_commit_short_hash }|
+                        iv_act   = |{ zif_abapgit_definitions=>c_action-url }?url={ lv_display_url }|
+                        iv_title = 'Commit'
+                        iv_class = |url| ).
+      CATCH zcx_abapgit_exception.
+        ii_html->add( |<span class="url">{ lv_icon_commit }{ lv_commit_short_hash }</span>| ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_url.
+ 
+    ri_html = zcl_abapgit_html=>create( )->add_a(
+      iv_txt   = shorten_repo_url( iv_url )
+      iv_title = iv_url
+      iv_act   = |{ zif_abapgit_definitions=>c_action-url }?url={ iv_url }| ).
+ 
+    IF iv_render_remote_edit_for_key IS NOT INITIAL.
+      ri_html->add_a(
+        iv_txt   = ri_html->icon(
+          iv_name  = 'edit-solid'
+          iv_class = 'pad-sides'
+          iv_hint  = 'Change remote' )
+        iv_act   = |{ zif_abapgit_definitions=>c_action-repo_remote_settings }?key={ iv_render_remote_edit_for_key }|
+        iv_class = |remote_repo| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_sci_result.
+ 
+    DATA lv_icon TYPE string.
+ 
+    lv_icon = ii_html->icon(
+      iv_name = 'bug-solid'
+      iv_hint = 'Code inspector result' ).
+ 
+    CASE iv_sci_result.
+      WHEN zif_abapgit_definitions=>c_sci_result-passed.
+        ii_html->add( |<span class="boxed green-filled-set">{ lv_icon }PASSED</span>| ).
+      WHEN zif_abapgit_definitions=>c_sci_result-failed.
+        ii_html->add( |<span class="boxed red-filled-set">{ lv_icon }FAILED</span>| ).
+      WHEN zif_abapgit_definitions=>c_sci_result-warning.
+        ii_html->add( |<span class="boxed yellow-filled-set">{ lv_icon }WARN</span>| ).
+      WHEN OTHERS. " Including NO_RUN
+        RETURN.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_text_input.
+ 
+    DATA lv_attrs TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_value IS NOT INITIAL.
+      lv_attrs = | value="{ iv_value }"|.
+    ENDIF.
+ 
+    IF iv_max_length IS NOT INITIAL.
+      lv_attrs = lv_attrs && | maxlength="{ iv_max_length }"|.
+    ENDIF.
+ 
+    IF iv_autofocus = abap_true.
+      lv_attrs = lv_attrs && | autofocus|.
+    ENDIF.
+ 
+    ri_html->add( |<label for="{ iv_name }">{ iv_label }</label>| ).
+    ri_html->add( |<input id="{ iv_name }" name="{ iv_name }" type="text"{ lv_attrs }>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_timestamp.
+ 
+    DATA lv_date TYPE d.
+    DATA lv_time TYPE t.
+ 
+    CONVERT TIME STAMP iv_timestamp
+      TIME ZONE gv_time_zone
+      INTO DATE lv_date
+      TIME      lv_time.
+ 
+    rv_rendered = |{ lv_date DATE = USER } { lv_time TIME = USER }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_transport.
+ 
+    DATA:
+      lv_title TYPE string,
+      lv_jump  TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_transport IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_title = zcl_abapgit_factory=>get_cts_api( )->read_description( iv_transport ).
+ 
+    lv_jump = |{ zif_abapgit_definitions=>c_action-jump_transport }?transport={ iv_transport }|.
+ 
+    IF iv_icon_only = abap_true.
+      ri_html->add_a( iv_act   = lv_jump
+                      iv_title = |Transport { iv_transport }|
+                      iv_txt   = zcl_abapgit_html=>icon( 'truck-solid/darkgrey' ) ).
+    ELSE.
+      ri_html->add( |<span class="transport-box">| ).
+ 
+      ri_html->add_icon( iv_name = 'truck-solid/grey70'
+                         iv_hint = 'Transport' ).
+      IF iv_interactive = abap_true.
+        ri_html->add_a( iv_act   = lv_jump
+                        iv_title = lv_title
+                        iv_txt   = |{ iv_transport }| ).
+      ELSE.
+        ri_html->add( iv_transport ).
+      ENDIF.
+ 
+      ri_html->add( '</span>' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_user_name.
+ 
+    DATA:
+      lv_title TYPE string,
+      lv_jump  TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_username IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_username <> zcl_abapgit_objects_super=>c_user_unknown AND iv_suppress_title = abap_false.
+      lv_title = zcl_abapgit_user_record=>get_title( iv_username ).
+    ENDIF.
+ 
+    lv_jump = |{ zif_abapgit_definitions=>c_action-jump_user }?user={ iv_username }|.
+ 
+    IF iv_icon_only = abap_true.
+      ri_html->add_a( iv_act   = lv_jump
+                      iv_title = lv_title
+                      iv_txt   = zcl_abapgit_html=>icon( 'user-solid/darkgrey' ) ).
+    ELSE.
+      ri_html->add( |<span class="user-box">| ).
+ 
+      ri_html->add_icon( iv_name = 'user-solid/grey70'
+                         iv_hint = 'User name' ).
+      IF iv_interactive = abap_true AND iv_username <> zcl_abapgit_objects_super=>c_user_unknown.
+        ri_html->add_a( iv_act   = lv_jump
+                        iv_title = lv_title
+                        iv_txt   = |{ iv_username }| ).
+      ELSE.
+        ri_html->add( iv_username ).
+      ENDIF.
+ 
+      ri_html->add( '</span>' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_warning_banner.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( '<div class="dummydiv warning">' ).
+    ri_html->add( |{ ri_html->icon( 'exclamation-triangle/yellow' ) } { iv_text }| ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD settings_repo_toolbar.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-repo-settings'.
+ 
+    ro_menu->add(
+      iv_txt = 'Repository'
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_settings )
+    )->add(
+      iv_txt = 'Local'
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_local_settings }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_local_settings )
+    )->add(
+      iv_txt = 'Remote'
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_settings }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_remote_settings )
+    )->add(
+      iv_txt = 'Background'
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_background }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_background )
+    )->add(
+      iv_txt = 'Stats'
+      iv_act = |{ zif_abapgit_definitions=>c_action-repo_infos }?key={ iv_key }|
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_infos ) ).
+ 
+    zcl_abapgit_exit=>get_instance(  )->enhance_repo_toolbar(
+       io_menu = ro_menu
+       iv_key  = iv_key
+       iv_act  = iv_act ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD settings_toolbar.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-settings'.
+ 
+    ro_menu->add(
+      iv_txt = 'Global'
+      iv_act = zif_abapgit_definitions=>c_action-go_settings
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-go_settings )
+    )->add(
+      iv_txt = 'Personal'
+      iv_act = zif_abapgit_definitions=>c_action-go_settings_personal
+      iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-go_settings_personal ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD shorten_repo_url.
+    DATA lv_new_length TYPE i.
+    DATA lv_length_to_truncate_to TYPE i.
+ 
+    rv_shortened = iv_full_url.
+ 
+    REPLACE FIRST OCCURRENCE OF 'https://' IN rv_shortened WITH ''.
+    REPLACE FIRST OCCURRENCE OF 'http://' IN rv_shortened WITH ''.
+    IF rv_shortened CP '*.git'.
+      lv_new_length = strlen( rv_shortened ) - 4.
+      rv_shortened  = rv_shortened(lv_new_length).
+    ENDIF.
+ 
+    IF strlen( rv_shortened ) > iv_max_length.
+      lv_length_to_truncate_to = iv_max_length - 3.
+      rv_shortened = rv_shortened(lv_length_to_truncate_to) && `...`.
+    ENDIF.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.testclasses.abap.html b/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.testclasses.abap.html new file mode 100644 index 00000000000..83cfe24d7ed --- /dev/null +++ b/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.testclasses.abap.html @@ -0,0 +1,232 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_gui_chunk_lib.clas.testclasses.abap

+
+ +
+ 100% + Statements + 49/49 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 49/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +501x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
*"* use this source file for your ABAP unit test classes
+CLASS ltcl_normalize_program_name DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_chunk_lib TYPE REF TO zcl_abapgit_gui_chunk_lib.
+ 
+    METHODS:
+      setup,
+      class FOR TESTING RAISING cx_static_check,
+      program FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_gui_chunk_lib DEFINITION LOCAL FRIENDS ltcl_normalize_program_name.
+ 
+CLASS ltcl_normalize_program_name IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mo_chunk_lib.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_chunk_lib->normalize_program_name( 'ZCL_ABAPGIT_FRONTEND_SERVICES=CP' )
+      exp = `ZCL_ABAPGIT_FRONTEND_SERVICES` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD program.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_chunk_lib->normalize_program_name( 'ZABAPGIT_FULL' )
+      exp = `ZABAPGIT_FULL` ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_chunk_lib->normalize_program_name( 'ZSOME_PROG_ENDING_WITH_CP' )
+      exp = `ZSOME_PROG_ENDING_WITH_CP` ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_gui_component.clas.abap.html b/src/ui/lib/zcl_abapgit_gui_component.clas.abap.html new file mode 100644 index 00000000000..0d863deb39a --- /dev/null +++ b/src/ui/lib/zcl_abapgit_gui_component.clas.abap.html @@ -0,0 +1,409 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_gui_component.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_gui_component.clas.abap

+
+ +
+ 63.88% + Statements + 69/108 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 63.88% + Lines + 69/108 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +1091x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_gui_component DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_html_parts,
+        scripts      TYPE string VALUE 'scripts',
+        hidden_forms TYPE string VALUE 'hidden_forms',
+      END OF c_html_parts.
+ 
+  PROTECTED SECTION.
+ 
+    METHODS register_deferred_script
+      IMPORTING
+        ii_part TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+    METHODS gui_services
+      RETURNING
+        VALUE(ri_gui_services) TYPE REF TO zif_abapgit_gui_services
+      RAISING
+        zcx_abapgit_exception.
+    METHODS register_handlers
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PRIVATE SECTION.
+    DATA mi_gui_services TYPE REF TO zif_abapgit_gui_services.
+ 
+    METHODS register_event_handler
+      IMPORTING
+        ii_event_handler TYPE REF TO zif_abapgit_gui_event_handler OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS register_hotkeys
+      IMPORTING
+        ii_hotkey_provider TYPE REF TO zif_abapgit_gui_hotkeys OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_COMPONENT IMPLEMENTATION.
+ 
+ 
+  METHOD gui_services.
+    IF mi_gui_services IS NOT BOUND.
+      mi_gui_services = zcl_abapgit_ui_factory=>get_gui_services( ).
+    ENDIF.
+    ri_gui_services = mi_gui_services.
+  ENDMETHOD.
+ 
+ 
+  METHOD register_deferred_script.
+    gui_services( )->get_html_parts( )->add_part(
+      iv_collection = c_html_parts-scripts
+      ii_part       = ii_part ).
+  ENDMETHOD.
+ 
+ 
+  METHOD register_event_handler.
+
+    DATA li_event_handler TYPE REF TO zif_abapgit_gui_event_handler.
+
+    IF ii_event_handler IS BOUND.
+      li_event_handler = ii_event_handler.
+    ELSE.
+      TRY.
+          li_event_handler ?= me.
+        CATCH cx_root.
+          RETURN.
+      ENDTRY.
+    ENDIF.
+
+    gui_services( )->register_event_handler( li_event_handler ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD register_handlers.
+    register_event_handler( ).
+    register_hotkeys( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD register_hotkeys.
+
+    DATA li_hotkey_provider TYPE REF TO zif_abapgit_gui_hotkeys.
+
+    IF ii_hotkey_provider IS BOUND.
+      li_hotkey_provider = ii_hotkey_provider.
+    ELSE.
+      TRY.
+          li_hotkey_provider ?= me.
+        CATCH cx_root.
+          RETURN.
+      ENDTRY.
+    ENDIF.
+
+    gui_services( )->get_hotkeys_ctl( )->register_hotkeys( li_hotkey_provider->get_hotkey_actions( ) ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_gui_in_page_modal.clas.abap.html b/src/ui/lib/zcl_abapgit_gui_in_page_modal.clas.abap.html new file mode 100644 index 00000000000..d419958f933 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_gui_in_page_modal.clas.abap.html @@ -0,0 +1,331 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_gui_in_page_modal.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_gui_in_page_modal.clas.abap

+
+ +
+ 100% + Statements + 82/82 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 82/82 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +831x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_in_page_modal DEFINITION
+  PUBLIC
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_child      TYPE REF TO zif_abapgit_gui_renderable
+        !iv_width      TYPE i OPTIONAL
+        !iv_height     TYPE i OPTIONAL
+      RETURNING
+        VALUE(ro_wrap) TYPE REF TO zcl_abapgit_gui_in_page_modal
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !ii_child  TYPE REF TO zif_abapgit_gui_renderable
+        !iv_width  TYPE i OPTIONAL
+        !iv_height TYPE i OPTIONAL.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mi_child TYPE REF TO zif_abapgit_gui_renderable.
+ 
+    DATA:
+      BEGIN OF ms_attrs,
+        width  TYPE i,
+        height TYPE i,
+      END OF ms_attrs.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_in_page_modal IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    ms_attrs-width  = iv_width.
+    ms_attrs-height = iv_height.
+    mi_child        = ii_child.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_wrap
+      EXPORTING
+        ii_child  = ii_child
+        iv_width  = iv_width
+        iv_height = iv_height.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lo_style TYPE REF TO zcl_abapgit_string_buffer.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    CREATE OBJECT lo_style.
+ 
+    IF ms_attrs-width IS NOT INITIAL.
+      lo_style->add( |width:{ ms_attrs-width }px;| ).
+    ENDIF.
+    IF ms_attrs-height IS NOT INITIAL.
+      lo_style->add( |height:{ ms_attrs-height }px;| ).
+    ENDIF.
+ 
+    ri_html->add( |<div class="modal" style="{ lo_style->join_w_space_and_flush( ) }">| ).
+    ri_html->add( |<div class="modal-guts">| ).
+    ri_html->add( mi_child->render( ) ).
+    ri_html->add( |</div>| ).
+    ri_html->add( |</div>| ).
+    ri_html->add( |<div class="modal-overlay"></div>| ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_gui_page.clas.abap.html b/src/ui/lib/zcl_abapgit_gui_page.clas.abap.html new file mode 100644 index 00000000000..a432ce12e51 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_gui_page.clas.abap.html @@ -0,0 +1,1696 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_gui_page.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_gui_page.clas.abap

+
+ +
+ 85.84% + Statements + 461/537 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 85.84% + Lines + 461/537 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +5381x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT
+  INHERITING FROM zcl_abapgit_gui_component
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_gui_modal,
+      zif_abapgit_gui_renderable,
+      zif_abapgit_gui_event_handler,
+      zif_abapgit_gui_error_handler.
+ 
+    TYPES:
+      BEGIN OF ty_control,
+        page_layout         TYPE string,
+        page_title          TYPE string,
+        page_menu           TYPE REF TO zcl_abapgit_html_toolbar,
+        page_menu_provider  TYPE REF TO zif_abapgit_gui_menu_provider,
+        page_title_provider TYPE REF TO zif_abapgit_gui_page_title,
+        extra_css_url       TYPE string,
+        extra_js_url        TYPE string,
+        show_as_modal       TYPE abap_bool,
+      END OF  ty_control .
+ 
+    METHODS constructor RAISING zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_page_layout,
+        centered   TYPE string VALUE `centered`,
+        full_width TYPE string VALUE `full_width`,
+      END OF c_page_layout.
+ 
+    DATA ms_control TYPE ty_control .
+ 
+    METHODS render_content " TODO refactor, render child directly
+      ABSTRACT
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+  PRIVATE SECTION.
+ 
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings .
+    DATA mx_error TYPE REF TO zcx_abapgit_exception .
+    DATA mo_exception_viewer TYPE REF TO zcl_abapgit_exception_viewer .
+ 
+    METHODS render_deferred_parts
+      IMPORTING
+        !ii_html          TYPE REF TO zif_abapgit_html
+        !iv_part_category TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS html_head
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS header_stylesheet_links
+      IMPORTING
+        ii_html TYPE REF TO zif_abapgit_html .
+    METHODS header_script_links
+      IMPORTING
+        ii_html TYPE REF TO zif_abapgit_html .
+    METHODS title
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS footer
+      IMPORTING
+        !iv_time       TYPE string
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_link_hints
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_browser_control_warning
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_command_palettes
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_hotkey_overview
+      RETURNING
+        VALUE(ro_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_error_message_box
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_version_details
+      RETURNING
+        VALUE(rv_version) TYPE string.
+    METHODS is_edge_control_warning_needed
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+    ms_control-page_layout = c_page_layout-centered.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD footer.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div id="footer">' ).
+    ri_html->add( '<table class="w100"><tr>' ).
+ 
+    ri_html->add( '<td class="w40 sponsor">' ).
+    ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-sponsor
+                    iv_txt = ri_html->icon( iv_name = 'heart-regular/pink'
+                                            iv_hint = 'Sponsor us' ) ).
+    ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-sponsor
+                    iv_txt = 'Sponsor us' ).
+    ri_html->add( '</td>' ).
+ 
+    ri_html->add( '<td class="center">' ).
+    ri_html->add( '<div class="logo">' ).
+    ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-homepage
+                    iv_txt = ri_html->icon( 'git-alt' ) ).
+    ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-homepage
+                    iv_txt = ri_html->icon( iv_name = 'abapgit'
+                                            iv_hint = iv_time ) ).
+    ri_html->add( '</div>' ).
+    ri_html->add( |<div id="footer-version" class="version">{ get_version_details( ) }</div>| ).
+    ri_html->add( '</td>' ).
+ 
+    ri_html->add( '<td id="debug-output" class="w40"></td>' ).
+ 
+    ri_html->add( '</tr></table>' ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_version_details.
+ 
+    DATA lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    rv_version = zif_abapgit_version=>c_abap_version.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      rv_version = rv_version && ` - Standalone Version`.
+    ELSE.
+      rv_version = rv_version && ` - Developer Version`.
+    ENDIF.
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    CASE abap_true.
+      WHEN lo_frontend_serv->is_webgui( ).
+        rv_version = rv_version && ` - Web`.
+      WHEN lo_frontend_serv->is_sapgui_for_windows( ).
+        rv_version = rv_version && ` - Win`.
+      WHEN lo_frontend_serv->is_sapgui_for_java( ).
+        rv_version = rv_version && ` - Java`.
+      WHEN OTHERS.
+* eg. open-abap?
+        rv_version = rv_version && ` - Unknown`.
+    ENDCASE.
+ 
+    " Will be filled by JS method displayBrowserControlFooter
+    rv_version = rv_version && '<span id="browser-control-footer"></span>'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD header_script_links.
+
+    ii_html->add( '<script src="js/common.js"></script>' ).
+
+    IF ms_control-extra_js_url IS NOT INITIAL.
+      ii_html->add( |<script src="{ ms_control-extra_js_url }"></script>| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD header_stylesheet_links.
+
+    ii_html->add( '<link rel="stylesheet" type="text/css" href="css/common.css">' ).
+    ii_html->add( '<link rel="stylesheet" type="text/css" href="css/ag-icons.css">' ).
+
+    " Themes
+    ii_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-default.css">' ). " Theme basis
+    CASE mo_settings->get_ui_theme( ).
+      WHEN zcl_abapgit_settings=>c_ui_theme-dark.
+        ii_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-dark.css">' ).
+      WHEN zcl_abapgit_settings=>c_ui_theme-belize.
+        ii_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-belize-blue.css">' ).
+    ENDCASE.
+
+    " Page stylesheets
+    IF ms_control-extra_css_url IS NOT INITIAL.
+      ii_html->add( |<link rel="stylesheet" type="text/css" href="{ ms_control-extra_css_url }">| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD html_head.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<head>' ).
+ 
+    ri_html->add( '<meta http-equiv="content-type" content="text/html; charset=utf-8">' ).
+    ri_html->add( '<meta http-equiv="X-UA-Compatible" content="IE=11,10,9,8" />' ).
+ 
+    ri_html->add( '<title>abapGit</title>' ).
+ 
+    header_stylesheet_links( ri_html ).
+    header_script_links( ri_html ).
+ 
+    CASE mo_settings->get_icon_scaling( ). " Enforce icon scaling
+      WHEN mo_settings->c_icon_scaling-large.
+        ri_html->add( '<style>.icon { font-size: 200% }</style>' ).
+      WHEN mo_settings->c_icon_scaling-small.
+        ri_html->add( '<style>.icon.large { font-size: inherit }</style>' ).
+    ENDCASE.
+ 
+    ri_html->add( '</head>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_browser_control_warning.
+
+    DATA li_documentation_link TYPE REF TO zif_abapgit_html.
+
+    CREATE OBJECT li_documentation_link TYPE zcl_abapgit_html.
+
+    li_documentation_link->add_a(
+        iv_txt = 'Documentation'
+        iv_typ = zif_abapgit_html=>c_action_type-url
+        iv_act =  'https://docs.abapgit.org/guide-sapgui.html#sap-gui-for-windows' ).
+
+    ii_html->add( '<div id="browser-control-warning" class="browser-control-warning">' ).
+    ii_html->add( zcl_abapgit_gui_chunk_lib=>render_warning_banner(
+                    |Attention: You use Edge browser control. |
+                 && |There are several known malfunctions. See |
+                 && li_documentation_link->render( ) ) ).
+    ii_html->add( '</div>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_command_palettes.
+
+    ii_html->add( 'var gCommandPalette = new CommandPalette(enumerateUiActions, {' ).
+    ii_html->add( '  toggleKey: "F1",' ).
+    ii_html->add( '  hotkeyDescription: "Command ..."' ).
+    ii_html->add( '});' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_deferred_parts.
+
+    DATA lt_parts TYPE zif_abapgit_html=>ty_table_of.
+    DATA li_part LIKE LINE OF lt_parts.
+
+    lt_parts = gui_services( )->get_html_parts( )->get_parts( iv_part_category ).
+    LOOP AT lt_parts INTO li_part.
+      ii_html->add( li_part ).
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_error_message_box.
+ 
+    " You should remember that the we have to instantiate ro_html even
+    " it's overwritten further down. Because ADD checks whether it's
+    " bound.
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " You should remember that we render the message panel only
+    " if we have an error.
+    IF mx_error IS NOT BOUND.
+      RETURN.
+    ENDIF.
+ 
+    ri_html = zcl_abapgit_gui_chunk_lib=>render_error_message_box( mx_error ).
+ 
+    " You should remember that the exception viewer dispatches the events of
+    " error message panel
+    CREATE OBJECT mo_exception_viewer
+      EXPORTING
+        ix_error = mx_error.
+ 
+    " You should remember that we render the message panel just once
+    " for each exception/error text.
+    CLEAR:
+      mx_error.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_hotkey_overview.
+ 
+    DATA lo_hotkeys_component TYPE REF TO zif_abapgit_gui_renderable.
+ 
+    lo_hotkeys_component ?= gui_services( )->get_hotkeys_ctl( ). " Mmmm ...
+    ro_html = lo_hotkeys_component->render( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_link_hints.
+
+    DATA: lv_link_hint_key TYPE c LENGTH 1.
+
+    lv_link_hint_key = mo_settings->get_link_hint_key( ).
+
+    IF mo_settings->get_link_hints_enabled( ) = abap_true AND lv_link_hint_key IS NOT INITIAL.
+
+      ii_html->add( |activateLinkHints("{ lv_link_hint_key }");| ).
+      ii_html->add( |setInitialFocusWithQuerySelector('#header', false);| ).
+      ii_html->add( |enableArrowListNavigation();| ).
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    render_deferred_parts(
+      ii_html          = ri_html
+      iv_part_category = c_html_parts-scripts ).
+ 
+    render_link_hints( ri_html ).
+    render_command_palettes( ri_html ).
+    ri_html->add( |toggleBrowserControlWarning();| ).
+    ri_html->add( |displayBrowserControlFooter();| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD title.
+ 
+    DATA lo_page_menu LIKE ms_control-page_menu.
+    DATA lv_page_title TYPE string.
+ 
+    lo_page_menu = ms_control-page_menu.
+    IF lo_page_menu IS NOT BOUND AND ms_control-page_menu_provider IS BOUND.
+      lo_page_menu = ms_control-page_menu_provider->get_menu( ).
+    ENDIF.
+ 
+    lv_page_title = ms_control-page_title.
+    IF ms_control-page_title_provider IS BOUND.
+      lv_page_title = ms_control-page_title_provider->get_page_title( ).
+    ENDIF.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div id="header">' ).
+ 
+    ri_html->add( '<div class="logo">' ).
+    ri_html->add_a(
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home
+      iv_txt = ri_html->icon( 'git-alt' ) ).
+    ri_html->add_a(
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home
+      iv_txt = ri_html->icon( 'abapgit' ) ).
+    ri_html->add( '</div>' ).
+ 
+    ri_html->add( |<div class="page-title"><span class="spacer">&#x25BA;</span>{ lv_page_title }</div>| ).
+ 
+    IF lo_page_menu IS BOUND.
+      ri_html->add( '<div class="float-right">' ).
+      ri_html->add( lo_page_menu->render( iv_right = abap_true ) ).
+      ri_html->add( '</div>' ).
+    ENDIF.
+ 
+    IF is_edge_control_warning_needed( ) = abap_true.
+      render_browser_control_warning( ri_html ).
+    ENDIF.
+ 
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_error_handler~handle_error.
+ 
+    mx_error = ix_error.
+    rv_handled = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-goto_source.
+ 
+        IF mo_exception_viewer IS BOUND.
+          mo_exception_viewer->goto_source( ).
+        ENDIF.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-show_callstack.
+ 
+        IF mo_exception_viewer IS BOUND.
+          mo_exception_viewer->show_callstack( ).
+        ENDIF.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-goto_message.
+ 
+        IF mo_exception_viewer IS BOUND.
+          mo_exception_viewer->goto_message( ).
+        ENDIF.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_modal~is_modal.
+    rv_yes = boolc( ms_control-show_as_modal = abap_true ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA:
+      li_script TYPE REF TO zif_abapgit_html,
+      lo_timer  TYPE REF TO zcl_abapgit_timer.
+ 
+    register_handlers( ).
+ 
+    lo_timer = zcl_abapgit_timer=>create( )->start( ).
+ 
+    " Real page
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<!DOCTYPE html>' ).
+    ri_html->add( '<html lang="en">' ).
+    ri_html->add( html_head( ) ).
+    ri_html->add( |<body class="{ ms_control-page_layout }">| ).
+ 
+    ri_html->add( title( ) ).
+ 
+    ri_html->add( '<div class="not_sticky">' ).
+ 
+    ri_html->add( render_content( ) ). " TODO -> render child
+ 
+    ri_html->add( render_hotkey_overview( ) ).
+    ri_html->add( render_error_message_box( ) ).
+ 
+    render_deferred_parts(
+      ii_html          = ri_html
+      iv_part_category = c_html_parts-hidden_forms ).
+ 
+    ri_html->add( footer( lo_timer->end( ) ) ).
+ 
+    ri_html->add( '</div>' ).
+ 
+    li_script = scripts( ).
+ 
+    IF li_script IS BOUND AND li_script->is_empty( ) = abap_false.
+      ri_html->add( '<script>' ).
+      ri_html->add( li_script ).
+      ri_html->add( 'confirmInitialized();' ).
+      ri_html->add( '</script>' ).
+    ENDIF.
+ 
+    ri_html->add( '</body>' ).
+    ri_html->add( '</html>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_edge_control_warning_needed.
+ 
+    DATA:
+      lv_gui_release       TYPE zif_abapgit_frontend_services=>ty_gui_release,
+      lv_gui_sp            TYPE zif_abapgit_frontend_services=>ty_gui_sp,
+      lv_gui_patch         TYPE zif_abapgit_frontend_services=>ty_gui_patch,
+      li_frontend_services TYPE REF TO zif_abapgit_frontend_services.
+ 
+    " With SAGUI 8.00 PL3 and 7.70 PL13 edge browser control is basically working.
+    " For lower releases we render the browser control warning
+    " an toggle it via JS function toggleBrowserControlWarning.
+ 
+    rv_result = abap_true.
+ 
+    TRY.
+        li_frontend_services = zcl_abapgit_ui_factory=>get_frontend_services( ).
+        li_frontend_services->get_gui_version(
+          IMPORTING
+            ev_gui_release        = lv_gui_release
+            ev_gui_sp             = lv_gui_sp
+            ev_gui_patch          = lv_gui_patch ).
+ 
+      CATCH zcx_abapgit_exception.
+        RETURN.
+    ENDTRY.
+ 
+    IF lv_gui_release >= '7700' AND lv_gui_sp >= '1' AND lv_gui_patch >= '13'
+    OR lv_gui_release >= '8000' AND lv_gui_sp >= '1' AND lv_gui_patch >= '3'.
+      rv_result = abap_false.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_gui_page_hoc.clas.abap.html b/src/ui/lib/zcl_abapgit_gui_page_hoc.clas.abap.html new file mode 100644 index 00000000000..b17ca1ae22a --- /dev/null +++ b/src/ui/lib/zcl_abapgit_gui_page_hoc.clas.abap.html @@ -0,0 +1,526 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_gui_page_hoc.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_gui_page_hoc.clas.abap

+
+ +
+ 100% + Statements + 147/147 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 147/147 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +1481x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_hoc DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_child_component     TYPE REF TO zif_abapgit_gui_renderable
+        !iv_page_title          TYPE string OPTIONAL
+        !iv_page_layout         TYPE string DEFAULT zcl_abapgit_gui_page=>c_page_layout-centered
+        !io_page_menu           TYPE REF TO zcl_abapgit_html_toolbar OPTIONAL
+        !ii_page_menu_provider  TYPE REF TO zif_abapgit_gui_menu_provider OPTIONAL
+        !ii_page_title_provider TYPE REF TO zif_abapgit_gui_page_title OPTIONAL
+        !iv_extra_css_url       TYPE string OPTIONAL
+        !iv_extra_js_url        TYPE string OPTIONAL
+        !iv_show_as_modal       TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_page_wrap)     TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_child
+      RETURNING
+        VALUE(ri_child) TYPE REF TO zif_abapgit_gui_renderable.
+    METHODS constructor
+      IMPORTING
+        !ii_child_component TYPE REF TO zif_abapgit_gui_renderable
+        !is_control         TYPE zcl_abapgit_gui_page=>ty_control
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+ 
+    METHODS render_content
+        REDEFINITION.
+  PRIVATE SECTION.
+ 
+    DATA mi_child TYPE REF TO zif_abapgit_gui_renderable .
+ 
+    METHODS detect_modal
+      RETURNING
+        VALUE(rv_is_modal) TYPE abap_bool.
+ 
+    METHODS detect_menu_provider
+      RETURNING
+        VALUE(ri_ref) TYPE REF TO zif_abapgit_gui_menu_provider.
+ 
+    METHODS detect_title_provider
+      RETURNING
+        VALUE(ri_ref) TYPE REF TO zif_abapgit_gui_page_title.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_hoc IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    mi_child = ii_child_component.
+    ms_control = is_control.
+ 
+    IF ms_control-show_as_modal = abap_false.
+      ms_control-show_as_modal = detect_modal( ).
+    ENDIF.
+ 
+    IF ms_control-page_menu_provider IS NOT BOUND.
+      ms_control-page_menu_provider = detect_menu_provider( ).
+    ENDIF.
+ 
+    IF ms_control-page_title_provider IS NOT BOUND.
+      ms_control-page_title_provider = detect_title_provider( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_page TYPE REF TO zcl_abapgit_gui_page_hoc.
+    DATA ls_control TYPE zcl_abapgit_gui_page=>ty_control.
+ 
+    ls_control-page_title          = iv_page_title.
+    ls_control-page_layout         = iv_page_layout.
+    ls_control-page_menu           = io_page_menu.
+    ls_control-page_menu_provider  = ii_page_menu_provider.
+    ls_control-page_title_provider = ii_page_title_provider.
+    ls_control-extra_css_url       = iv_extra_css_url.
+    ls_control-extra_js_url        = iv_extra_js_url.
+    ls_control-show_as_modal       = iv_show_as_modal.
+ 
+    CREATE OBJECT lo_page
+      EXPORTING
+        ii_child_component = ii_child_component
+        is_control         = ls_control.
+ 
+    ri_page_wrap = lo_page.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD detect_menu_provider.
+    TRY.
+        ri_ref ?= mi_child.
+      CATCH cx_sy_move_cast_error.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD detect_modal.
+ 
+    DATA li_modal TYPE REF TO zif_abapgit_gui_modal.
+ 
+    TRY.
+        li_modal ?= mi_child.
+        rv_is_modal = li_modal->is_modal( ).
+      CATCH cx_sy_move_cast_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD detect_title_provider.
+    TRY.
+        ri_ref ?= mi_child.
+      CATCH cx_sy_move_cast_error.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_child.
+    ri_child = mi_child.
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    IF mi_child IS BOUND.
+      ri_html = mi_child->render( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_gui_picklist.clas.abap.html b/src/ui/lib/zcl_abapgit_gui_picklist.clas.abap.html new file mode 100644 index 00000000000..e4df91fefe7 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_gui_picklist.clas.abap.html @@ -0,0 +1,889 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_gui_picklist.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_gui_picklist.clas.abap

+
+ +
+ 95.52% + Statements + 256/268 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 95.52% + Lines + 256/268 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +2691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_picklist DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+    INTERFACES zif_abapgit_gui_page_title.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_list          TYPE STANDARD TABLE
+        !iv_id            TYPE string OPTIONAL
+        !iv_in_page       TYPE abap_bool DEFAULT abap_false
+        !iv_title         TYPE string DEFAULT 'Choose from list'
+        !iv_attr_name     TYPE abap_compname OPTIONAL
+        !ii_item_renderer TYPE REF TO zif_abapgit_gui_render_item OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_result_idx
+      RETURNING
+        VALUE(rv_index) TYPE i.
+    METHODS get_result_item
+      CHANGING
+        !cs_selected TYPE any.
+    METHODS was_cancelled
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+    METHODS is_fulfilled
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+    METHODS id
+      RETURNING
+        VALUE(rv_id) TYPE string.
+    METHODS is_in_page
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+    METHODS set_id
+      IMPORTING
+        iv_id        TYPE string
+      RETURNING
+        VALUE(ro_me) TYPE REF TO zcl_abapgit_gui_picklist.
+    METHODS set_in_page
+      IMPORTING
+        iv_in_page   TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ro_me) TYPE REF TO zcl_abapgit_gui_picklist.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        back   TYPE string VALUE 'back',
+        choose TYPE string VALUE 'choose',
+      END OF c_event.
+ 
+    CONSTANTS c_radio_name TYPE string VALUE 'radio'.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mr_list TYPE REF TO data.
+    DATA mv_selected TYPE i.
+    DATA mv_cancelled TYPE abap_bool.
+    DATA mv_fulfilled TYPE abap_bool.
+    DATA mv_attr_name TYPE abap_compname.
+    DATA mi_item_renderer TYPE REF TO zif_abapgit_gui_render_item.
+    DATA mv_in_page TYPE abap_bool.
+    DATA mv_id TYPE string.
+    DATA mv_title TYPE string.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception.
+    METHODS return_state
+      RETURNING
+        VALUE(rv_state) TYPE zif_abapgit_gui_event_handler=>ty_handling_result-state.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_picklist IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    FIELD-SYMBOLS <lt_tab> TYPE STANDARD TABLE.
+ 
+    super->constructor( ).
+ 
+    " copy contents of table to local scope
+    CREATE DATA mr_list LIKE it_list.
+    ASSIGN mr_list->* TO <lt_tab>.
+    APPEND LINES OF it_list TO <lt_tab>.
+ 
+    mv_attr_name = to_upper( iv_attr_name ).
+    mi_item_renderer = ii_item_renderer.
+    mv_in_page = iv_in_page.
+    mv_id      = iv_id.
+    mv_title   = iv_title.
+ 
+    IF mi_item_renderer IS NOT BOUND AND mv_attr_name IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Renderer or attr name required' ).
+    ENDIF.
+ 
+    CREATE OBJECT mo_form_data.
+    CREATE OBJECT mo_validation_log.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    FIELD-SYMBOLS <lt_list> TYPE ANY TABLE.
+    FIELD-SYMBOLS <lv_val> TYPE any.
+    FIELD-SYMBOLS <ls_row> TYPE any.
+    DATA lv_index TYPE i.
+    DATA lv_label TYPE string.
+ 
+    ro_form = zcl_abapgit_html_form=>create( ).
+ 
+    ro_form->radio(
+      iv_name     = c_radio_name
+      iv_label    = mv_title ).
+ 
+    ASSIGN mr_list->* TO <lt_list>.
+    LOOP AT <lt_list> ASSIGNING <ls_row>.
+      lv_index = sy-tabix.
+ 
+      IF mv_attr_name IS NOT INITIAL.
+        ASSIGN COMPONENT mv_attr_name OF STRUCTURE <ls_row> TO <lv_val>.
+        ASSERT sy-subrc = 0.
+        lv_label = <lv_val>.
+      ELSEIF mi_item_renderer IS BOUND.
+        lv_label = mi_item_renderer->render(
+          iv_item  = <ls_row>
+          iv_index = lv_index )->render( ).
+      ENDIF.
+ 
+      ro_form->option(
+        iv_label = lv_label
+        iv_value = |{ lv_index }| ).
+ 
+    ENDLOOP.
+ 
+    ro_form->command(
+      iv_label    = 'Choose'
+      iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action   = c_event-choose
+    )->command(
+      iv_label    = 'Back'
+      iv_action   = c_event-back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_result_idx.
+    rv_index = mv_selected.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_result_item.
+
+    FIELD-SYMBOLS <lt_tab> TYPE STANDARD TABLE.
+
+    CLEAR cs_selected.
+
+    IF mv_selected > 0.
+      ASSIGN mr_list->* TO <lt_tab>.
+      READ TABLE <lt_tab> INDEX mv_selected INTO cs_selected.
+      ASSERT sy-subrc = 0.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD id.
+    rv_id = mv_id.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_fulfilled.
+    rv_yes = mv_fulfilled.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_in_page.
+    rv_yes = mv_in_page.
+  ENDMETHOD.
+ 
+ 
+  METHOD return_state.
+    IF mv_in_page = abap_true.
+      rv_state = zcl_abapgit_gui=>c_event_state-re_render.
+    ELSE.
+      rv_state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_id.
+    mv_id = iv_id.
+    ro_me = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_in_page.
+    mv_in_page = iv_in_page.
+    ro_me = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD was_cancelled.
+    rv_yes = mv_cancelled.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+    mo_validation_log->clear( ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-back OR zif_abapgit_definitions=>c_action-go_back.
+        " Handle go_back as a "graceful back" - implicit cancel by F3/ESC
+        mv_fulfilled = abap_true.
+        mv_cancelled = abap_true.
+        rs_handled-state = return_state( ).
+      WHEN c_event-choose.
+        mv_selected = mo_form_data->get( c_radio_name ).
+        IF mv_selected = 0.
+          mo_validation_log->set(
+            iv_key = c_radio_name
+            iv_val = 'You have to select one item' ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          mv_fulfilled = abap_true.
+          rs_handled-state = return_state( ).
+        ENDIF.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_page_title~get_page_title.
+    rv_title = mv_title.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    ri_html = zcl_abapgit_html=>create( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    register_handlers( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_html_action_utils.clas.abap.html b/src/ui/lib/zcl_abapgit_html_action_utils.clas.abap.html new file mode 100644 index 00000000000..2155c3b2ac0 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_html_action_utils.clas.abap.html @@ -0,0 +1,1048 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_html_action_utils.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_html_action_utils.clas.abap

+
+ +
+ 100% + Statements + 321/321 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 321/321 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +3221x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +31x +31x +31x +31x +1x +1x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_html_action_utils DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS parse_post_form_data
+      IMPORTING
+        !it_post_data    TYPE zif_abapgit_html_viewer=>ty_post_data
+        !iv_upper_cased  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_fields) TYPE tihttpnvp .
+    CLASS-METHODS parse_fields
+      IMPORTING
+        !iv_string       TYPE clike
+        !iv_upper_cased  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rt_fields) TYPE tihttpnvp .
+    CLASS-METHODS jump_encode
+      IMPORTING
+        !iv_obj_type     TYPE tadir-object
+        !iv_obj_name     TYPE tadir-obj_name
+        !iv_filename     TYPE string OPTIONAL
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS dir_encode
+      IMPORTING
+        !iv_path         TYPE string
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS file_encode
+      IMPORTING
+        !iv_key          TYPE zif_abapgit_persistence=>ty_repo-key
+        !ig_file         TYPE any
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS obj_encode
+      IMPORTING
+        !iv_key          TYPE zif_abapgit_persistence=>ty_repo-key
+        !ig_object       TYPE any
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS class_constructor .
+    CLASS-METHODS dbkey_encode
+      IMPORTING
+        !is_key          TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rv_string) TYPE string .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gv_non_breaking_space TYPE string .
+ 
+    CLASS-METHODS parse_fields_upper_case_name
+      IMPORTING
+        !iv_string       TYPE clike
+      RETURNING
+        VALUE(rt_fields) TYPE tihttpnvp .
+    CLASS-METHODS translate_postdata
+      IMPORTING
+        !it_postdata     TYPE zif_abapgit_html_viewer=>ty_post_data
+      RETURNING
+        VALUE(rv_string) TYPE string .
+    CLASS-METHODS field_keys_to_upper
+      CHANGING
+        !ct_fields TYPE tihttpnvp .
+    CLASS-METHODS add_field
+      IMPORTING
+        !iv_name  TYPE string
+        !ig_field TYPE any
+      CHANGING
+        !ct_field TYPE tihttpnvp .
+    CLASS-METHODS unescape
+      IMPORTING
+        !iv_string       TYPE string
+      RETURNING
+        VALUE(rv_string) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
+ 
+ 
+  METHOD add_field.
+ 
+    DATA ls_field LIKE LINE OF ct_field.
+ 
+    FIELD-SYMBOLS <lg_src> TYPE any.
+ 
+    ls_field-name = iv_name.
+ 
+    CASE cl_abap_typedescr=>describe_by_data( ig_field )->kind.
+      WHEN cl_abap_typedescr=>kind_elem.
+        ls_field-value = ig_field.
+      WHEN cl_abap_typedescr=>kind_struct.
+        ASSIGN COMPONENT iv_name OF STRUCTURE ig_field TO <lg_src>.
+        ASSERT <lg_src> IS ASSIGNED.
+        ls_field-value = <lg_src>.
+      WHEN OTHERS.
+        ASSERT 0 = 1.
+    ENDCASE.
+ 
+    APPEND ls_field TO ct_field.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD class_constructor.
+ 
+    CONSTANTS lc_nbsp TYPE xstring VALUE 'C2A0'. " &nbsp;
+ 
+    TRY.
+        gv_non_breaking_space = zcl_abapgit_convert=>xstring_to_string_utf8( lc_nbsp ).
+      CATCH zcx_abapgit_exception.
+        ASSERT 0 = 1.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dbkey_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+ 
+    add_field( EXPORTING iv_name = 'TYPE'
+                         ig_field = is_key-type CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = 'VALUE'
+                         ig_field = is_key-value CHANGING ct_field = lt_fields ).
+ 
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dir_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+    add_field( EXPORTING iv_name = 'PATH'
+                         ig_field = iv_path CHANGING ct_field = lt_fields ).
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD field_keys_to_upper.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF ct_fields.
+ 
+    LOOP AT ct_fields ASSIGNING <ls_field>.
+      <ls_field>-name = to_upper( <ls_field>-name ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD file_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+ 
+ 
+    add_field( EXPORTING iv_name = 'KEY'
+                         ig_field = iv_key CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = 'PATH'
+                         ig_field = ig_file CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = 'FILENAME'
+                         ig_field = ig_file CHANGING ct_field = lt_fields ).
+ 
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+ 
+ 
+    add_field( EXPORTING iv_name = 'TYPE'
+                         ig_field = iv_obj_type CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = 'NAME'
+                         ig_field = iv_obj_name CHANGING ct_field = lt_fields ).
+ 
+    IF iv_filename IS NOT INITIAL.
+      add_field( EXPORTING iv_name = 'FILE'
+                           ig_field = iv_filename CHANGING ct_field = lt_fields ).
+    ENDIF.
+ 
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD obj_encode.
+ 
+    DATA: lt_fields TYPE tihttpnvp.
+ 
+ 
+    add_field( EXPORTING iv_name = 'KEY'
+                         ig_field = iv_key CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = 'OBJ_TYPE'
+                         ig_field = ig_object CHANGING ct_field = lt_fields ).
+    add_field( EXPORTING iv_name = 'OBJ_NAME'
+                         ig_field = ig_object CHANGING ct_field = lt_fields ).
+ 
+    rv_string = cl_http_utility=>fields_to_string( lt_fields ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_fields.
+ 
+    DATA:
+      lt_substrings TYPE string_table,
+      ls_field      LIKE LINE OF rt_fields.
+ 
+    FIELD-SYMBOLS <lv_substring> LIKE LINE OF lt_substrings.
+ 
+    SPLIT iv_string AT '&' INTO TABLE lt_substrings.
+ 
+    LOOP AT lt_substrings ASSIGNING <lv_substring>.
+ 
+      CLEAR ls_field.
+      " On attempt to change unescaping -> run unit tests to check !
+ 
+      " Unescape name and value separately
+      ls_field-name = unescape( substring_before(
+        val = <lv_substring>
+        sub = '=' ) ).
+ 
+      ls_field-value = unescape( substring_after(
+        val = <lv_substring>
+        sub = '=' ) ).
+ 
+      IF ls_field IS INITIAL. " Not a field with proper structure
+        CONTINUE.
+      ENDIF.
+ 
+      APPEND ls_field TO rt_fields.
+ 
+    ENDLOOP.
+ 
+    IF iv_upper_cased = abap_true.
+      field_keys_to_upper( CHANGING ct_fields = rt_fields ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_fields_upper_case_name.
+ 
+    rt_fields = parse_fields(
+      iv_string      = iv_string
+      iv_upper_cased = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_post_form_data.
+ 
+    DATA lv_serialized_post_data TYPE string.
+ 
+    lv_serialized_post_data = translate_postdata( it_post_data ).
+    IF iv_upper_cased = abap_true.
+      rt_fields = parse_fields_upper_case_name( lv_serialized_post_data ).
+    ELSE.
+      rt_fields = parse_fields( lv_serialized_post_data ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD translate_postdata.
+ 
+    DATA: lt_post_data       TYPE zif_abapgit_html_viewer=>ty_post_data,
+          ls_last_line       LIKE LINE OF it_postdata,
+          lv_last_line_index TYPE i.
+ 
+    IF it_postdata IS INITIAL.
+      RETURN. "Nothing to do
+    ENDIF.
+ 
+    lt_post_data = it_postdata.
+ 
+    "Save the last line for separate merge, because we don't need its trailing spaces
+    WHILE ls_last_line IS INITIAL.
+      lv_last_line_index = lines( lt_post_data ).
+      READ TABLE lt_post_data INTO ls_last_line INDEX lv_last_line_index.
+      "Avoid trailing null values (see isssue #4832)
+      "todo, keep until SAP GUI for Java is fixed (remove on 2022-12-31)
+      ls_last_line = replace( val  = ls_last_line
+                              sub  = zcl_abapgit_git_utils=>get_null( )
+                              with = space
+                              occ  = 0 ).
+      DELETE lt_post_data INDEX lv_last_line_index.
+    ENDWHILE.
+ 
+    CONCATENATE LINES OF lt_post_data INTO rv_string
+      IN CHARACTER MODE RESPECTING BLANKS.
+    CONCATENATE rv_string ls_last_line INTO rv_string
+      IN CHARACTER MODE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD unescape.
+ 
+* do not use cl_http_utility as it does strange things with the encoding
+    rv_string = iv_string.
+ 
+* todo, more to be added here
+    REPLACE ALL OCCURRENCES OF '%3A' IN rv_string WITH ':' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF '%3D' IN rv_string WITH '=' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF '%2F' IN rv_string WITH '/' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF '%25' IN rv_string WITH '%' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF '%26' IN rv_string WITH '&' IGNORING CASE.
+    REPLACE ALL OCCURRENCES OF gv_non_breaking_space IN rv_string WITH ` `.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_html_action_utils.clas.testclasses.abap.html b/src/ui/lib/zcl_abapgit_html_action_utils.clas.testclasses.abap.html new file mode 100644 index 00000000000..fe73bb502c9 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_html_action_utils.clas.testclasses.abap.html @@ -0,0 +1,1174 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_html_action_utils.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_html_action_utils.clas.testclasses.abap

+
+ +
+ 100% + Statements + 363/363 +
+ + +
+ 100% + Branches + 14/14 +
+ + +
+ 100% + Functions + 14/14 +
+ + +
+ 100% + Lines + 363/363 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +3641x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +9x +9x +9x +9x +1x +1x +6x +6x +6x +6x +1x +1x +3x +3x +3x +3x +1x +1x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +25x +1x +1x +8x +8x +8x +8x +8x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_html_action_utils DEFINITION FOR TESTING RISK LEVEL HARMLESS
+  DURATION SHORT FINAL.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS class_constructor.
+    METHODS parse_fields_simple_case FOR TESTING.
+    METHODS parse_fields_advanced_case FOR TESTING.
+    METHODS parse_fields_unescape FOR TESTING.
+    METHODS parse_fields_unescape_nbsp FOR TESTING.
+    METHODS parse_fields_german_umlauts FOR TESTING.
+    METHODS parse_fields_wrong_format FOR TESTING.
+    METHODS parse_post_form_data FOR TESTING.
+    METHODS parse_fields_webgui FOR TESTING.
+    METHODS parse_fields_special_chars FOR TESTING.
+ 
+  PRIVATE SECTION.
+ 
+    CONSTANTS: BEGIN OF c_german_umlaut_as_hex,
+                 lower_case_ae TYPE xstring VALUE 'C3A4',
+                 lower_case_oe TYPE xstring VALUE 'C3B6',
+                 lower_case_ue TYPE xstring VALUE 'C3BC',
+               END OF c_german_umlaut_as_hex.
+ 
+    CLASS-DATA: BEGIN OF gs_german_umlaut_as_char,
+                  lower_case_ae TYPE string,
+                  lower_case_oe TYPE string,
+                  lower_case_ue TYPE string,
+                END OF gs_german_umlaut_as_char.
+ 
+    DATA mv_given_parse_string TYPE string.
+    DATA mt_parsed_fields TYPE tihttpnvp.
+ 
+    METHODS _given_string_is
+      IMPORTING
+        iv_string TYPE string.
+    METHODS _when_fields_are_parsed_upper.
+    METHODS _when_fields_are_parsed.
+    METHODS _then_fields_should_be
+      IMPORTING
+        iv_index TYPE i
+        iv_name  TYPE string
+        iv_value TYPE string.
+    METHODS _then_field_count_should_be
+      IMPORTING
+        iv_count TYPE i.
+ 
+    CLASS-METHODS _hex_to_char
+      IMPORTING
+        iv_x        TYPE xstring
+      RETURNING
+        VALUE(rv_s) TYPE string.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_html_action_utils DEFINITION LOCAL FRIENDS ltcl_html_action_utils.
+ 
+CLASS ltcl_html_action_utils IMPLEMENTATION.
+ 
+  METHOD class_constructor.
+ 
+    gs_german_umlaut_as_char-lower_case_ae = _hex_to_char( c_german_umlaut_as_hex-lower_case_ae ).
+    gs_german_umlaut_as_char-lower_case_oe = _hex_to_char( c_german_umlaut_as_hex-lower_case_oe ).
+    gs_german_umlaut_as_char-lower_case_ue = _hex_to_char( c_german_umlaut_as_hex-lower_case_ue ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_fields_simple_case.
+ 
+    _given_string_is( `committer_name=Gustav Gans` ).
+ 
+    _when_fields_are_parsed_upper( ).
+ 
+    _then_fields_should_be( iv_index = 1
+                            iv_name = `COMMITTER_NAME`
+                            iv_value = `Gustav Gans` ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_fields_advanced_case.
+ 
+    _given_string_is( `committer_name=Albert Schweitzer&`
+                   && `committer_email=albert.schweitzer@googlemail.com&`
+                   && `comment=dummy comment&`
+                   && `body=Message body<<new>><<new>>with line break<<new>>&`
+                   && `author_name=Karl Klammer&`
+                   && `author_email=karl@klammer.com` ).
+ 
+    _when_fields_are_parsed_upper( ).
+ 
+    _then_fields_should_be( iv_index = 1
+                            iv_name  = `COMMITTER_NAME`
+                            iv_value = `Albert Schweitzer` ).
+ 
+    _then_fields_should_be( iv_index = 2
+                            iv_name  = `COMMITTER_EMAIL`
+                            iv_value = `albert.schweitzer@googlemail.com` ).
+ 
+    _then_fields_should_be( iv_index = 3
+                            iv_name  = `COMMENT`
+                            iv_value = `dummy comment` ).
+ 
+    _then_fields_should_be( iv_index = 4
+                            iv_name  = `BODY`
+                            iv_value = `Message body<<new>><<new>>with line break<<new>>` ).
+ 
+    _then_fields_should_be( iv_index = 5
+                            iv_name  = `AUTHOR_NAME`
+                            iv_value = `Karl Klammer` ).
+ 
+    _then_fields_should_be( iv_index = 6
+                            iv_name  = `AUTHOR_EMAIL`
+                            iv_value = `karl@klammer.com` ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_fields_unescape.
+ 
+    " file status = '?', used in staging page
+    _given_string_is( '/SRC/ZFOOBAR.PROG.ABAP=%3F' ).
+ 
+    _when_fields_are_parsed_upper( ).
+    _then_field_count_should_be( 1 ).
+ 
+    _then_fields_should_be(
+      iv_index = 1
+      iv_name  = '/SRC/ZFOOBAR.PROG.ABAP'
+      iv_value = '?' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_fields_unescape_nbsp.
+ 
+    " non-breaking space (&nbsp;)
+    _given_string_is( '/src/ztest_rfc.fugr.xml=%3F&/src/ztest_rfc'
+                   && zcl_abapgit_html_action_utils=>gv_non_breaking_space
+                   && zcl_abapgit_html_action_utils=>gv_non_breaking_space
+                   && zcl_abapgit_html_action_utils=>gv_non_breaking_space
+                   && 'rf.sush.xml=A' ).
+ 
+    _when_fields_are_parsed( ).
+    _then_field_count_should_be( 2 ).
+ 
+    _then_fields_should_be(
+      iv_index = 1
+      iv_name  = '/src/ztest_rfc.fugr.xml'
+      iv_value = '?' ).
+ 
+    _then_fields_should_be(
+      iv_index = 2
+      iv_name  = '/src/ztest_rfc   rf.sush.xml'
+      iv_value = 'A' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_fields_german_umlauts.
+ 
+    DATA: lv_ae       TYPE string,
+          lv_oe       TYPE string,
+          lv_ue       TYPE string,
+          lv_ae_oe_ue TYPE string.
+ 
+ 
+    lv_ae = gs_german_umlaut_as_char-lower_case_ae.
+    lv_oe = gs_german_umlaut_as_char-lower_case_oe.
+    lv_ue = gs_german_umlaut_as_char-lower_case_ue.
+ 
+    lv_ae_oe_ue = lv_ae && lv_oe && lv_ue.
+ 
+    _given_string_is( |committer_name=Christian G{ lv_ue }nter&|
+                   && |committer_email=guenne@googlemail.com&|
+                   && |comment={ lv_ae_oe_ue }&|
+                   && |body=Message body<<new>><<new>>with line break<<new>>and umlauts. { lv_ae_oe_ue }&|
+                   && |author_name=Gerd Schr{ lv_oe }der&|
+                   && |author_email=gerd@schroeder.com| ).
+ 
+    _when_fields_are_parsed_upper( ).
+ 
+    _then_fields_should_be( iv_index = 1
+                            iv_name  = `COMMITTER_NAME`
+                            iv_value = |Christian G{ lv_ue }nter| ).
+ 
+    _then_fields_should_be( iv_index = 2
+                            iv_name  = `COMMITTER_EMAIL`
+                            iv_value = `guenne@googlemail.com` ).
+ 
+    _then_fields_should_be( iv_index = 3
+                            iv_name  = `COMMENT`
+                            iv_value = lv_ae_oe_ue ).
+ 
+    _then_fields_should_be( iv_index = 4
+                            iv_name  = `BODY`
+                            iv_value = |Message body<<new>><<new>>with line break<<new>>and umlauts. { lv_ae_oe_ue }| ).
+ 
+    _then_fields_should_be( iv_index = 5
+                            iv_name  = `AUTHOR_NAME`
+                            iv_value = |Gerd Schr{ lv_oe }der| ).
+ 
+    _then_fields_should_be( iv_index = 6
+                            iv_name  = `AUTHOR_EMAIL`
+                            iv_value = `gerd@schroeder.com` ).
+ 
+  ENDMETHOD.
+ 
+  METHOD _given_string_is.
+ 
+    mv_given_parse_string = iv_string.
+ 
+  ENDMETHOD.
+ 
+  METHOD _when_fields_are_parsed_upper.
+ 
+    mt_parsed_fields = zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( mv_given_parse_string ).
+ 
+  ENDMETHOD.
+ 
+  METHOD _when_fields_are_parsed.
+ 
+    mt_parsed_fields = zcl_abapgit_html_action_utils=>parse_fields( mv_given_parse_string ).
+ 
+  ENDMETHOD.
+ 
+  METHOD _then_fields_should_be.
+ 
+    FIELD-SYMBOLS: <ls_parsed_field> LIKE LINE OF mt_parsed_fields.
+ 
+    READ TABLE mt_parsed_fields ASSIGNING <ls_parsed_field> INDEX iv_index.
+ 
+    cl_abap_unit_assert=>assert_subrc(
+      exp = 0
+      msg = |No parsed field found at index { iv_index }| ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = <ls_parsed_field>-name
+      exp = iv_name
+      msg = |Name at index { iv_index } should be { iv_name }| ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = <ls_parsed_field>-value
+      exp = iv_value
+      msg = |Value at index { iv_index } should be { iv_value }| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD _then_field_count_should_be.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( mt_parsed_fields )
+      exp = iv_count
+      msg = |Field count { lines( mt_parsed_fields ) } should be { iv_count }| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD _hex_to_char.
+ 
+    DATA lo_conv TYPE REF TO cl_abap_conv_in_ce.
+ 
+    lo_conv = cl_abap_conv_in_ce=>create( ).
+    lo_conv->convert( EXPORTING input = iv_x IMPORTING data = rv_s ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_fields_wrong_format.
+ 
+    _given_string_is( `some_query_string_without_param_structure` ).
+    _when_fields_are_parsed_upper( ).
+    _then_field_count_should_be( 0 ).
+ 
+    _given_string_is( `some_query_string_without_param_structure&a=b` ).
+    _when_fields_are_parsed_upper( ).
+    _then_field_count_should_be( 1 ).
+    _then_fields_should_be(
+      iv_index = 1
+      iv_name  = 'A'
+      iv_value = 'b' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_post_form_data.
+ 
+    DATA lt_post_data TYPE zif_abapgit_html_viewer=>ty_post_data.
+    DATA lv_line LIKE LINE OF lt_post_data.
+    DATA lv_long_name LIKE LINE OF lt_post_data.
+    DATA lv_size TYPE i.
+ 
+    DESCRIBE FIELD lv_line LENGTH lv_size IN CHARACTER MODE.
+    lv_long_name = repeat(
+      val = 'x'
+      occ = lv_size - 4 ).
+    lv_line = 'a=b&' && lv_long_name.
+ 
+    APPEND lv_line TO lt_post_data.
+    APPEND '=y' TO lt_post_data.
+ 
+    mt_parsed_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( lt_post_data ).
+    _then_field_count_should_be( 2 ).
+    _then_fields_should_be(
+      iv_index = 1
+      iv_name  = 'a'
+      iv_value = 'b' ).
+    _then_fields_should_be(
+      iv_index = 2
+      iv_name  = |{ lv_long_name }|
+      iv_value = 'y' ).
+ 
+    mt_parsed_fields = zcl_abapgit_html_action_utils=>parse_post_form_data(
+      it_post_data = lt_post_data
+      iv_upper_cased = abap_true ).
+    _then_field_count_should_be( 2 ).
+    _then_fields_should_be(
+      iv_index = 1
+      iv_name  = 'A'
+      iv_value = 'b' ).
+    _then_fields_should_be(
+      iv_index = 2
+      iv_name  = |{ to_upper( lv_long_name ) }|
+      iv_value = 'y' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_fields_webgui.
+ 
+    _given_string_is( `KEY=000000000019&PATH=%2fsrc%2f&FILENAME=%2fnsp%2ftest_ddls_bug2.ddls.asddls` ).
+    _when_fields_are_parsed( ).
+    _then_field_count_should_be( 3 ).
+ 
+    _then_fields_should_be(
+      iv_index = 1
+      iv_name  = 'KEY'
+      iv_value = '000000000019' ).
+ 
+    _then_fields_should_be(
+      iv_index = 2
+      iv_name  = 'PATH'
+      iv_value = '/src/' ).
+ 
+    _then_fields_should_be(
+      iv_index = 3
+      iv_name  = 'FILENAME'
+      iv_value = '/nsp/test_ddls_bug2.ddls.asddls' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse_fields_special_chars.
+ 
+    DATA lv_string TYPE string.
+ 
+    " URL encoded data
+    lv_string = `TEST=!"#$%25%26'()*+,-./09:;<%3d>?@AZ[\]^_``az{|}~¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿`.
+ 
+    _given_string_is( lv_string ).
+    _when_fields_are_parsed( ).
+    _then_field_count_should_be( 1 ).
+ 
+    _then_fields_should_be(
+      iv_index = 1
+      iv_name  = 'TEST'
+      iv_value = `!"#$%&'()*+,-./09:;<=>?@AZ[\]^_``az{|}~¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿` ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_html_form.clas.abap.html b/src/ui/lib/zcl_abapgit_html_form.clas.abap.html new file mode 100644 index 00000000000..ebb3f6b3161 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_html_form.clas.abap.html @@ -0,0 +1,2917 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_html_form.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_html_form.clas.abap

+
+ +
+ 61.65% + Statements + 582/944 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 61.65% + Lines + 582/944 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +9451x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_html_form DEFINITION
+  PUBLIC
+  FINAL
+  INHERITING FROM zcl_abapgit_gui_component
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_html_form .
+    INTERFACES zif_abapgit_gui_hotkeys .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_form_id    TYPE csequence OPTIONAL
+        !iv_help_page  TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form .
+    METHODS render
+      IMPORTING
+        !iv_form_class     TYPE csequence DEFAULT 'dialog-form'
+        !io_values         TYPE REF TO zcl_abapgit_string_map
+        !io_validation_log TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      RETURNING
+        VALUE(ri_html)     TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS command
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_action     TYPE csequence
+        !iv_cmd_type   TYPE i DEFAULT zif_abapgit_html_form=>c_cmd_type-input
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS text
+      IMPORTING
+        !iv_label       TYPE csequence
+        !iv_name        TYPE csequence
+        !iv_hint        TYPE csequence OPTIONAL
+        !iv_required    TYPE abap_bool DEFAULT abap_false
+        !iv_upper_case  TYPE abap_bool DEFAULT abap_false
+        !iv_readonly    TYPE abap_bool DEFAULT abap_false
+        !iv_password    TYPE abap_bool DEFAULT abap_false
+        !iv_condense    TYPE abap_bool OPTIONAL
+        !iv_placeholder TYPE csequence OPTIONAL
+        !iv_side_action TYPE csequence OPTIONAL
+        !iv_min         TYPE i DEFAULT cl_abap_math=>min_int4
+        !iv_max         TYPE i DEFAULT cl_abap_math=>max_int4
+      RETURNING
+        VALUE(ro_self)  TYPE REF TO zcl_abapgit_html_form .
+    METHODS textarea
+      IMPORTING
+        !iv_label       TYPE csequence
+        !iv_name        TYPE csequence
+        !iv_hint        TYPE csequence OPTIONAL
+        !iv_required    TYPE abap_bool DEFAULT abap_false
+        !iv_readonly    TYPE abap_bool DEFAULT abap_false
+        !iv_placeholder TYPE csequence OPTIONAL
+        !iv_rows        TYPE i OPTIONAL
+        !iv_cols        TYPE i OPTIONAL
+        !iv_upper_case  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_self)  TYPE REF TO zcl_abapgit_html_form .
+    METHODS number
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_name       TYPE csequence
+        !iv_hint       TYPE csequence OPTIONAL
+        !iv_required   TYPE abap_bool DEFAULT abap_false
+        !iv_readonly   TYPE abap_bool DEFAULT abap_false
+        !iv_min        TYPE i DEFAULT cl_abap_math=>min_int4
+        !iv_max        TYPE i DEFAULT cl_abap_math=>max_int4
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS checkbox
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_name       TYPE csequence
+        !iv_hint       TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS radio
+      IMPORTING
+        !iv_label         TYPE csequence
+        !iv_name          TYPE csequence
+        !iv_default_value TYPE csequence OPTIONAL
+        !iv_hint          TYPE csequence OPTIONAL
+        !iv_condense      TYPE abap_bool DEFAULT abap_false
+        !iv_action        TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_self)    TYPE REF TO zcl_abapgit_html_form .
+    METHODS option
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_value      TYPE csequence
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS table
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_name       TYPE csequence
+        !iv_hint       TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS column
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_width      TYPE csequence OPTIONAL
+        !iv_readonly   TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS start_group
+      IMPORTING
+        !iv_label      TYPE csequence
+        !iv_name       TYPE csequence
+        !iv_hint       TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS hidden
+      IMPORTING
+        !iv_name       TYPE csequence
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form .
+    METHODS get_fields
+      RETURNING
+        VALUE(rt_fields) TYPE zif_abapgit_html_form=>ty_fields .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_attr,
+        value       TYPE string,
+        error       TYPE string,
+        hint        TYPE string,
+        readonly    TYPE string,
+        placeholder TYPE string,
+        required    TYPE string,
+        autofocus   TYPE string,
+      END OF ty_attr .
+ 
+    DATA mt_fields TYPE zif_abapgit_html_form=>ty_fields .
+    DATA:
+      mt_commands TYPE STANDARD TABLE OF zif_abapgit_html_form=>ty_command .
+    DATA mv_form_id TYPE string .
+    DATA mv_help_page TYPE string .
+ 
+    METHODS render_field
+      IMPORTING
+        !ii_html           TYPE REF TO zif_abapgit_html
+        !io_values         TYPE REF TO zcl_abapgit_string_map
+        !io_validation_log TYPE REF TO zcl_abapgit_string_map
+        !is_field          TYPE zif_abapgit_html_form=>ty_field
+        !iv_autofocus      TYPE abap_bool .
+    METHODS render_field_text
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+    METHODS render_field_textarea
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+    METHODS render_field_checkbox
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+    METHODS render_field_radio
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+    METHODS render_field_table
+      IMPORTING
+        !ii_html   TYPE REF TO zif_abapgit_html
+        !is_field  TYPE zif_abapgit_html_form=>ty_field
+        !is_attr   TYPE ty_attr
+        !io_values TYPE REF TO zcl_abapgit_string_map .
+    METHODS render_command
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_cmd  TYPE zif_abapgit_html_form=>ty_command .
+    METHODS render_field_hidden
+      IMPORTING
+        !ii_html  TYPE REF TO zif_abapgit_html
+        !is_field TYPE zif_abapgit_html_form=>ty_field
+        !is_attr  TYPE ty_attr .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_FORM IMPLEMENTATION.
+ 
+ 
+  METHOD checkbox.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-checkbox.
+    ls_field-name  = iv_name.
+    ls_field-label = iv_label.
+    ls_field-hint  = iv_hint.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD column.
+ 
+    FIELD-SYMBOLS <ls_last> LIKE LINE OF mt_fields.
+    DATA ls_column LIKE LINE OF <ls_last>-subitems.
+    DATA lv_size TYPE i.
+ 
+    lv_size = lines( mt_fields ).
+    ASSERT lv_size > 0. " Exception ? Maybe add zcx_no_check ?
+ 
+    READ TABLE mt_fields INDEX lv_size ASSIGNING <ls_last>.
+    ASSERT sy-subrc = 0.
+    ASSERT <ls_last>-type = zif_abapgit_html_form=>c_field_type-table.
+ 
+    ls_column-label    = iv_label.
+    ls_column-value    = iv_width.
+    ls_column-readonly = iv_readonly.
+ 
+    APPEND ls_column TO <ls_last>-subitems.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD command.
+ 
+    DATA ls_cmd LIKE LINE OF mt_commands.
+ 
+    ASSERT iv_cmd_type BETWEEN 1 AND 4.
+ 
+    ls_cmd-label    = iv_label.
+    ls_cmd-action   = iv_action.
+    ls_cmd-cmd_type = iv_cmd_type.
+ 
+    APPEND ls_cmd TO mt_commands.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lv_ts TYPE timestampl.
+ 
+    CREATE OBJECT ro_form.
+    ro_form->mv_form_id = iv_form_id.
+    ro_form->mv_help_page = iv_help_page.
+ 
+    IF ro_form->mv_form_id IS INITIAL.
+      GET TIME STAMP FIELD lv_ts.
+      ro_form->mv_form_id = |form_{ lv_ts }|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_fields.
+    rt_fields = mt_fields.
+  ENDMETHOD.
+ 
+ 
+  METHOD hidden.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-hidden.
+    ls_field-name  = iv_name.
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD number.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type     = zif_abapgit_html_form=>c_field_type-number.
+    ls_field-name     = iv_name.
+    ls_field-label    = iv_label.
+    ls_field-readonly = iv_readonly.
+    ls_field-min      = iv_min.
+    ls_field-max      = iv_max.
+    ls_field-hint     = iv_hint.
+    ls_field-required = iv_required.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD option.
+ 
+    FIELD-SYMBOLS <ls_last> LIKE LINE OF mt_fields.
+    DATA ls_option LIKE LINE OF <ls_last>-subitems.
+    DATA lv_size TYPE i.
+ 
+    lv_size = lines( mt_fields ).
+    ASSERT lv_size > 0. " Exception ? Maybe add zcx_no_check ?
+ 
+    READ TABLE mt_fields INDEX lv_size ASSIGNING <ls_last>.
+    ASSERT sy-subrc = 0.
+    ASSERT <ls_last>-type = zif_abapgit_html_form=>c_field_type-radio. " Or dropdown - TODO in future
+ 
+    ls_option-label = iv_label.
+    ls_option-value = iv_value.
+ 
+    APPEND ls_option TO <ls_last>-subitems.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD radio.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-radio.
+    ls_field-name  = iv_name.
+    ls_field-label = iv_label.
+    ls_field-default_value = iv_default_value.
+    ls_field-hint  = iv_hint.
+    ls_field-click = iv_action.
+ 
+    " put options into one column instead of side-by-side
+    ls_field-condense = iv_condense.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF mt_fields.
+    FIELD-SYMBOLS <ls_cmd> LIKE LINE OF mt_commands.
+    DATA lv_hint TYPE string.
+    DATA ls_form_id TYPE string.
+    DATA ls_form_action TYPE string.
+    DATA lv_cur_group TYPE string.
+    DATA lv_url TYPE string.
+    DATA lv_autofocus TYPE abap_bool.
+ 
+    IF mv_form_id IS NOT INITIAL.
+      ls_form_id = | id="{ mv_form_id }"|.
+    ENDIF.
+    LOOP AT mt_commands ASSIGNING <ls_cmd> WHERE cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main.
+      ls_form_action = | action="sapevent:{ <ls_cmd>-action }"|.
+      EXIT.
+    ENDLOOP.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<div class="dialog { iv_form_class }">| ). " to center use 'dialog-form-center'
+    ri_html->add( |<form method="post"{ ls_form_id }{ ls_form_action }>| ).
+ 
+    " Add hidden button that triggers main command when pressing enter
+    LOOP AT mt_commands ASSIGNING <ls_cmd> WHERE cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main.
+      ri_html->add( |<button type="submit" formaction="sapevent:{ <ls_cmd>-action }" class="hidden-submit"|
+                 && | aria-hidden="true" tabindex="-1"></button>| ).
+      EXIT.
+    ENDLOOP.
+ 
+    lv_autofocus = abap_true.
+    LOOP AT mt_fields ASSIGNING <ls_field>.
+      AT FIRST.
+        IF <ls_field>-type <> zif_abapgit_html_form=>c_field_type-field_group.
+          ri_html->add( |<ul>| ).
+        ENDIF.
+      ENDAT.
+ 
+      IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-field_group.
+        IF lv_cur_group IS NOT INITIAL AND lv_cur_group <> <ls_field>-name.
+          ri_html->add( |</ul>| ).
+          ri_html->add( |</fieldset>| ).
+        ENDIF.
+        IF <ls_field>-hint IS NOT INITIAL.
+          lv_hint = | title="{ <ls_field>-hint }"|.
+        ELSE.
+          lv_hint = ''.
+        ENDIF.
+        lv_cur_group = <ls_field>-name.
+        ri_html->add( |<fieldset name="{ <ls_field>-name }">| ).
+        ri_html->add( |<legend{ lv_hint }>{ <ls_field>-label }</legend>| ).
+        ri_html->add( |<ul>| ).
+        CONTINUE.
+      ENDIF.
+ 
+      render_field(
+        ii_html           = ri_html
+        io_values         = io_values
+        io_validation_log = io_validation_log
+        is_field          = <ls_field>
+        iv_autofocus      = lv_autofocus ).
+ 
+      lv_autofocus = abap_false.
+ 
+      AT LAST.
+        ri_html->add( |</ul>| ).
+        IF lv_cur_group IS NOT INITIAL.
+          ri_html->add( |</fieldset>| ).
+        ENDIF.
+      ENDAT.
+    ENDLOOP.
+ 
+    ri_html->add( |<ul>| ).
+    ri_html->add( |<li class="dialog-commands">| ).
+ 
+    IF mv_help_page IS NOT INITIAL.
+      lv_url = escape( val    = mv_help_page
+                       format = cl_abap_format=>e_url ).
+      ri_html->add_a(
+        iv_txt   = zcl_abapgit_gui_buttons=>help( )
+        iv_act   = |{ zif_abapgit_definitions=>c_action-url }?url={ lv_url }|
+        iv_class = 'dialog-help'
+        iv_title = 'Help' ).
+    ENDIF.
+ 
+    LOOP AT mt_commands ASSIGNING <ls_cmd>.
+      render_command(
+        ii_html = ri_html
+        is_cmd  = <ls_cmd> ).
+    ENDLOOP.
+ 
+    ri_html->add( |</li>| ).
+    ri_html->add( |</ul>| ).
+    ri_html->add( |</form>| ).
+    ri_html->add( |</div>| ).
+ 
+    register_handlers( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_command.
+
+    CASE is_cmd-cmd_type.
+      WHEN zif_abapgit_html_form=>c_cmd_type-link.
+
+        ii_html->add_a(
+          iv_txt   = is_cmd-label
+          iv_act   = is_cmd-action
+          iv_class = 'dialog-commands' ).
+
+      WHEN zif_abapgit_html_form=>c_cmd_type-button.
+
+        ii_html->add( |<button type="submit" name="action" value="{ is_cmd-action }"|
+                   && | class="action-commands">{ is_cmd-label }</button>| ).
+
+      WHEN zif_abapgit_html_form=>c_cmd_type-input.
+
+        ii_html->add( |<input type="submit" value="{ is_cmd-label }" formaction="sapevent:{ is_cmd-action }">| ).
+
+      WHEN zif_abapgit_html_form=>c_cmd_type-input_main.
+
+        ii_html->add( |<input type="submit" value="{ is_cmd-label }" class="main">| ).
+
+      WHEN OTHERS.
+        ASSERT 0 = 1.
+
+    ENDCASE.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field.
+
+    DATA:
+      ls_attr       TYPE ty_attr,
+      lv_item_class TYPE string.
+
+    " Get value and validation error
+    ls_attr-value = io_values->get( is_field-name ).
+
+    IF is_field-type <> zif_abapgit_html_form=>c_field_type-textarea.
+      ls_attr-value = escape( val    = ls_attr-value
+                              format = cl_abap_format=>e_html_attr ).
+    ENDIF.
+
+    IF io_validation_log IS BOUND.
+      ls_attr-error = io_validation_log->get( is_field-name ).
+      IF ls_attr-error IS NOT INITIAL.
+        ls_attr-error = escape( val    = ls_attr-error
+                                format = cl_abap_format=>e_html_text ).
+        ls_attr-error = |<small>{ ls_attr-error }</small>|.
+      ENDIF.
+    ENDIF.
+
+    " Prepare field attributes
+    IF is_field-required = abap_true.
+      ls_attr-required = ' <em>*</em>'.
+    ENDIF.
+
+    IF is_field-hint IS NOT INITIAL.
+      ls_attr-hint = escape( val    = is_field-hint
+                             format = cl_abap_format=>e_html_attr ).
+      ls_attr-hint = | title="{ ls_attr-hint }"|.
+    ENDIF.
+
+    IF is_field-placeholder IS NOT INITIAL.
+      ls_attr-placeholder = escape( val    = is_field-placeholder
+                                    format = cl_abap_format=>e_html_attr ).
+      ls_attr-placeholder = | placeholder="{ ls_attr-placeholder }"|.
+    ENDIF.
+
+    IF is_field-readonly = abap_true.
+      ls_attr-readonly = ' readonly'.
+    ENDIF.
+
+    IF iv_autofocus = abap_true.
+      ls_attr-autofocus = ' autofocus'.
+    ENDIF.
+
+    " Prepare item class
+    lv_item_class = is_field-item_class.
+    IF ls_attr-error IS NOT INITIAL.
+      lv_item_class = condense( lv_item_class && ' error' ).
+    ENDIF.
+    IF is_field-type = zif_abapgit_html_form=>c_field_type-text AND is_field-max BETWEEN 1 AND 20.
+      " Reduced width for short fields
+      lv_item_class = lv_item_class && ' w40'.
+    ENDIF.
+    IF is_field-type = zif_abapgit_html_form=>c_field_type-hidden.
+      lv_item_class = lv_item_class && ' hidden'.
+    ENDIF.
+    IF lv_item_class IS NOT INITIAL.
+      lv_item_class = | class="{ lv_item_class }"|.
+    ENDIF.
+
+    " Render field
+    ii_html->add( |<li{ lv_item_class }>| ).
+
+    CASE is_field-type.
+      WHEN zif_abapgit_html_form=>c_field_type-text OR zif_abapgit_html_form=>c_field_type-number.
+
+        render_field_text(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+
+      WHEN zif_abapgit_html_form=>c_field_type-textarea.
+
+        render_field_textarea(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+
+      WHEN zif_abapgit_html_form=>c_field_type-checkbox.
+
+        render_field_checkbox(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+
+      WHEN zif_abapgit_html_form=>c_field_type-radio.
+
+        render_field_radio(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+
+      WHEN zif_abapgit_html_form=>c_field_type-table.
+
+        render_field_table(
+          ii_html   = ii_html
+          is_field  = is_field
+          is_attr   = ls_attr
+          io_values = io_values ).
+
+      WHEN zif_abapgit_html_form=>c_field_type-hidden.
+
+        render_field_hidden(
+          ii_html  = ii_html
+          is_field = is_field
+          is_attr  = ls_attr ).
+
+      WHEN OTHERS.
+        ASSERT 1 = 0.
+    ENDCASE.
+
+    ii_html->add( '</li>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_checkbox.
+
+    DATA lv_checked TYPE string.
+
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+
+    IF is_attr-value = abap_true OR is_attr-value = 'on'.
+      " boolc return ` ` which is not initial -> bug after 1st validation
+      lv_checked = ' checked'.
+    ENDIF.
+
+    ii_html->add( |<input type="checkbox" name="{ is_field-name }" id="{ is_field-name }"| &&
+                  |{ lv_checked }{ is_attr-readonly }{ is_attr-autofocus }>| ).
+    ii_html->add( |<label for="{ is_field-name }"{ is_attr-hint }>{ is_field-label }</label>| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_hidden.
+
+    ii_html->add( |<input type="hidden" name="{ is_field-name }" id="{ is_field-name }" value="{ is_attr-value }">| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_radio.
+
+    DATA:
+      lv_checked   TYPE string,
+      lv_opt_id    TYPE string,
+      lv_opt_value TYPE string,
+      lv_onclick   TYPE string.
+
+    FIELD-SYMBOLS <ls_opt> LIKE LINE OF is_field-subitems.
+
+    ii_html->add( |<label{ is_attr-hint }>{ is_field-label }</label>| ).
+
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+
+    ii_html->add( |<div class="radio-container">| ).
+
+    LOOP AT is_field-subitems ASSIGNING <ls_opt>.
+      lv_opt_value = escape( val    = <ls_opt>-value
+                             format = cl_abap_format=>e_html_attr ).
+
+      CLEAR lv_checked.
+      IF is_attr-value = lv_opt_value OR ( is_attr-value IS INITIAL AND lv_opt_value = is_field-default_value ).
+        lv_checked = ' checked'.
+      ENDIF.
+
+      CLEAR lv_onclick.
+      IF is_field-click IS NOT INITIAL.
+        lv_onclick = |onclick="document.getElementById('{ mv_form_id }').action = 'sapevent:|
+                  && |{ is_field-click }'; document.getElementById('{ mv_form_id }').submit()"|.
+      ENDIF.
+
+      lv_opt_id = |{ is_field-name }{ sy-tabix }|.
+      IF is_field-condense = abap_true.
+        ii_html->add( '<div>' ).
+      ENDIF.
+      ii_html->add( |<input type="radio" name="{ is_field-name }" id="{ lv_opt_id }"|
+                 && | value="{ lv_opt_value }"{ lv_checked }{ is_attr-autofocus }|
+                 && | { lv_onclick }>| ).
+      ii_html->add( |<label for="{ lv_opt_id }">{ <ls_opt>-label }</label>| ).
+      IF is_field-condense = abap_true.
+        ii_html->add( '</div>' ).
+      ENDIF.
+    ENDLOOP.
+
+    ii_html->add( '</div>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_table.
+
+    DATA:
+      lv_value    TYPE string,
+      lv_readonly TYPE string,
+      lv_rows     TYPE i,
+      lv_cell_id  TYPE string.
+
+    FIELD-SYMBOLS <ls_subitem> LIKE LINE OF is_field-subitems.
+
+    ii_html->add( |<label for="{ is_field-name }"{ is_attr-hint }>{ is_field-label }</label>| ).
+
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+
+    lv_rows = io_values->get( |{ is_field-name }-{ zif_abapgit_html_form=>c_rows }| ).
+
+    " Render table only if there are some data rows
+    IF lv_rows > 0.
+
+      ii_html->add( |<table name="{ is_field-name }" id="{ is_field-name }" class="table-container">| ).
+
+      ii_html->add( |<thead>| ).
+      ii_html->add( |<tr>| ).
+      LOOP AT is_field-subitems ASSIGNING <ls_subitem>.
+        CLEAR lv_value.
+        IF <ls_subitem>-value IS NOT INITIAL.
+          lv_value = escape( val    = <ls_subitem>-value
+                             format = cl_abap_format=>e_html_attr ).
+          lv_value = | width="{ lv_value }"|.
+        ENDIF.
+        ii_html->add( |<td{ lv_value }>{ <ls_subitem>-label }</td>| ).
+      ENDLOOP.
+      ii_html->add( |</tr>| ).
+      ii_html->add( |</thead>| ).
+
+      ii_html->add( |<tbody>| ).
+      DO lv_rows TIMES.
+        lv_rows = sy-index.
+        ii_html->add( |<tr>| ).
+        LOOP AT is_field-subitems ASSIGNING <ls_subitem>.
+          lv_cell_id = |{ is_field-name }-{ lv_rows }-{ sy-tabix }|.
+          lv_value = escape( val    = io_values->get( lv_cell_id )
+                             format = cl_abap_format=>e_html_attr ).
+          CLEAR lv_readonly.
+          IF <ls_subitem>-readonly = abap_true.
+            lv_readonly = | readonly|.
+          ENDIF.
+          ii_html->add( |<td><input type="text" name="{ lv_cell_id }" id="{
+                        lv_cell_id }" value="{ lv_value }"{ lv_readonly }></td>| ).
+        ENDLOOP.
+        ii_html->add( |</tr>| ).
+      ENDDO.
+      ii_html->add( |</tbody>| ).
+
+      ii_html->add( |</table>| ).
+
+    ELSE.
+      ii_html->add( |<input type="text" name="{ is_field-name }" id="{
+                    is_field-name }" value="Not available" readonly>| ).
+    ENDIF.
+
+    " Hidden field with number of rows to simplify getting values from form
+    lv_value = |{ is_field-name }-{ zif_abapgit_html_form=>c_rows }|.
+    ii_html->add( |<input type="number" name="{ lv_value }" id="{ lv_value }"|
+               && | value="{ lv_rows }" style="display:none">| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_text.
+
+    DATA:
+      lv_type      TYPE string,
+      lv_minlength TYPE string,
+      lv_maxlength TYPE string.
+
+    ii_html->add( |<label for="{ is_field-name }"{ is_attr-hint }>{ is_field-label }{ is_attr-required }</label>| ).
+
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+
+    IF is_field-side_action IS NOT INITIAL.
+      ii_html->add( '<div class="input-container">' ). " Ugly :(
+    ENDIF.
+
+    IF is_field-type = zif_abapgit_html_form=>c_field_type-number.
+      lv_type = 'number'.
+    ELSEIF is_field-password = abap_true.
+      lv_type = 'password'.
+    ELSE.
+      lv_type = 'text'.
+    ENDIF.
+
+    IF is_field-min > 0.
+      lv_minlength = | minlength={ is_field-min }|.
+    ENDIF.
+    IF is_field-max > 0 AND is_field-max < cl_abap_math=>max_int4.
+      lv_maxlength = | maxlength={ is_field-max }|.
+    ENDIF.
+
+    ii_html->add( |<input type="{ lv_type }" name="{ is_field-name }" id="{ is_field-name }"|
+               && | value="{ is_attr-value }"{ is_field-dblclick }{ is_attr-placeholder }|
+               && |{ is_attr-readonly }{ is_attr-autofocus }{ lv_minlength }{ lv_maxlength }>| ).
+
+    IF is_field-side_action IS NOT INITIAL.
+      ii_html->add( '</div>' ).
+      ii_html->add( '<div class="command-container">' ).
+      ii_html->add( |<input type="submit" value="&#x2026;" formaction="sapevent:{ is_field-side_action }"|
+                 && | title="{ is_field-label }">| ).
+      ii_html->add( '</div>' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_field_textarea.
+
+    DATA lv_rows TYPE string.
+    DATA lv_cols TYPE string.
+    DATA lv_html TYPE string.
+
+    ii_html->add( |<label for="{ is_field-name }"{ is_attr-hint }>{ is_field-label }{ is_attr-required }</label>| ).
+
+    IF is_attr-error IS NOT INITIAL.
+      ii_html->add( is_attr-error ).
+    ENDIF.
+
+    IF is_field-rows > 0.
+      lv_rows = | rows="{ is_field-rows }"|.
+    ELSEIF is_attr-value IS NOT INITIAL.
+      lv_rows = | rows="{ lines( zcl_abapgit_convert=>split_string( is_attr-value ) ) + 1 }"|.
+    ENDIF.
+
+    IF is_field-cols > 0.
+      lv_cols = | cols="{ is_field-cols }"|.
+    ENDIF.
+
+    " Avoid adding line-breaks inside textarea tag (except for the actual value)
+    lv_html = |<textarea name="{ is_field-name }" id="{ is_field-name }"{ lv_rows }{ lv_cols }|
+           && |{ is_attr-readonly }{ is_attr-autofocus }{ is_attr-placeholder }>|.
+    lv_html = lv_html && escape( val    = is_attr-value
+                                 format = cl_abap_format=>e_html_attr ).
+    lv_html = lv_html && |</textarea>|.
+
+    ii_html->add( lv_html ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD start_group.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-field_group.
+    ls_field-label = iv_label.
+    ls_field-name  = iv_name.
+    ls_field-hint  = iv_hint.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD table.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type  = zif_abapgit_html_form=>c_field_type-table.
+    ls_field-name  = iv_name.
+    ls_field-label = iv_label.
+    ls_field-hint  = iv_hint.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD text.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type       = zif_abapgit_html_form=>c_field_type-text.
+    ls_field-name       = iv_name.
+    ls_field-label      = iv_label.
+    ls_field-upper_case = iv_upper_case.
+    ls_field-readonly   = iv_readonly.
+    ls_field-min        = iv_min.
+    ls_field-max        = iv_max.
+    ls_field-password   = iv_password.
+    ls_field-condense   = iv_condense.
+    ls_field-hint       = iv_hint.
+    ls_field-required   = iv_required.
+    ls_field-placeholder = iv_placeholder.
+ 
+    IF iv_side_action IS NOT INITIAL AND mv_form_id IS NOT INITIAL.
+      ls_field-item_class = 'with-command'.
+      ls_field-side_action = iv_side_action.
+      ls_field-dblclick = | ondblclick="document.getElementById('{ mv_form_id }').action = 'sapevent:|
+                       && |{ iv_side_action }'; document.getElementById('{ mv_form_id }').submit()"|.
+    ENDIF.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD textarea.
+ 
+    DATA ls_field LIKE LINE OF mt_fields.
+ 
+    ls_field-type        = zif_abapgit_html_form=>c_field_type-textarea.
+    ls_field-name        = iv_name.
+    ls_field-label       = iv_label.
+    ls_field-readonly    = iv_readonly.
+    ls_field-hint        = iv_hint.
+    ls_field-required    = iv_required.
+    ls_field-placeholder = iv_placeholder.
+    ls_field-rows        = iv_rows.
+    ls_field-cols        = iv_cols.
+    ls_field-upper_case  = iv_upper_case.
+ 
+    APPEND ls_field TO mt_fields.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+    FIELD-SYMBOLS: <ls_command> TYPE zif_abapgit_html_form=>ty_command.
+ 
+    ls_hotkey_action-ui_component = |Form-{ mv_form_id }|.
+ 
+    READ TABLE mt_commands WITH KEY cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
+                           ASSIGNING <ls_command>.
+    IF sy-subrc = 0.
+      ls_hotkey_action-description = <ls_command>-label.
+      ls_hotkey_action-action      = <ls_command>-action.
+      ls_hotkey_action-hotkey      = |Enter|.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    READ TABLE mt_commands WITH KEY action = zif_abapgit_definitions=>c_action-go_back
+                           ASSIGNING <ls_command>.
+    IF sy-subrc = 0.
+      ls_hotkey_action-description = <ls_command>-label.
+      ls_hotkey_action-action      = <ls_command>-action.
+      ls_hotkey_action-hotkey      = |F3|.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_html_form_utils.clas.abap.html b/src/ui/lib/zcl_abapgit_html_form_utils.clas.abap.html new file mode 100644 index 00000000000..b9a5b045b8d --- /dev/null +++ b/src/ui/lib/zcl_abapgit_html_form_utils.clas.abap.html @@ -0,0 +1,1015 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_html_form_utils.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_html_form_utils.clas.abap

+
+ +
+ 91.61% + Statements + 284/310 +
+ + +
+ 86.84% + Branches + 33/38 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 91.61% + Lines + 284/310 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +3111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +1x +3x +3x +3x +3x +3x +3x +3x +1x +1x +3x +1x +14x +  +  +  +  +11x +11x +19x +19x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +2x +2x +2x +1x +6x +6x +1x +1x +1x +6x +2x +2x +2x +2x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_html_form_utils DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_form            TYPE REF TO zcl_abapgit_html_form
+      RETURNING
+        VALUE(ro_form_util) TYPE REF TO zcl_abapgit_html_form_utils .
+    CLASS-METHODS is_dirty
+      IMPORTING
+        !io_form_data    TYPE REF TO zcl_abapgit_string_map
+        !io_compare_with TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rv_dirty) TYPE abap_bool .
+ 
+    METHODS constructor
+      IMPORTING
+        !io_form TYPE REF TO zcl_abapgit_html_form .
+    METHODS normalize
+      IMPORTING
+        !io_form_data       TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS validate
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_empty
+      IMPORTING
+        !io_form_data   TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rv_empty) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_data
+      IMPORTING
+        !io_form_data TYPE REF TO zcl_abapgit_string_map .
+    METHODS exit
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+        !io_check_changes_versus TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      RETURNING
+        VALUE(rv_state)          TYPE i
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_form      TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_FORM_UTILS IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mo_form = io_form.
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_form_util
+      EXPORTING
+        io_form = io_form.
+  ENDMETHOD.
+ 
+ 
+  METHOD exit.
+ 
+    DATA lv_answer TYPE c LENGTH 1.
+    DATA lo_compare_with LIKE io_check_changes_versus.
+ 
+    lo_compare_with = io_check_changes_versus.
+    IF lo_compare_with IS NOT BOUND.
+      " TODO: remove this if and make io_check_changes_versus mandatory once all forms are converted
+      lo_compare_with = mo_form_data.
+    ENDIF.
+ 
+    IF is_dirty(
+      io_form_data    = io_form_data
+      io_compare_with = lo_compare_with ) = abap_true.
+      lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+        iv_display_cancel_button = abap_false
+        iv_titlebar       = 'abapGit - Unsaved Changes'
+        iv_text_question  = 'There are unsaved changes. Do you want to exit the form?'
+        iv_default_button = '2' ).
+ 
+      IF lv_answer = '1'.
+        rv_state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
+      ELSE.
+        rv_state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      ENDIF.
+    ELSE.
+      rv_state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_dirty.
+    rv_dirty = boolc( io_form_data->mt_entries <> io_compare_with->mt_entries ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_empty.
+ 
+    DATA:
+      lt_fields TYPE zif_abapgit_html_form=>ty_fields,
+      lv_value  TYPE string,
+      lv_rows   TYPE i,
+      lv_row    TYPE i.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF lt_fields.
+ 
+    rv_empty = abap_true.
+    lt_fields = mo_form->get_fields( ).
+    LOOP AT lt_fields ASSIGNING <ls_field> WHERE type <> zif_abapgit_html_form=>c_field_type-field_group.
+      lv_value = condense(
+        val = io_form_data->get( <ls_field>-name )
+        del = ` ` ).
+ 
+      IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-number.
+        rv_empty = boolc( lv_value IS INITIAL OR lv_value = '0' ).
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-table.
+        lv_rows = io_form_data->get( |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }| ).
+        DO lv_rows TIMES.
+          lv_row = sy-index.
+          DO lines( <ls_field>-subitems ) TIMES.
+            lv_value = io_form_data->get( |{ <ls_field>-name }-{ lv_row }-{ sy-index }| ).
+            rv_empty = boolc( lv_value IS INITIAL ).
+            IF rv_empty <> abap_true.
+              RETURN.
+            ENDIF.
+          ENDDO.
+        ENDDO.
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-textarea.
+        REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_value WITH ''.
+        REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN lv_value WITH ''.
+        rv_empty = boolc( lv_value IS INITIAL ).
+      ELSE.
+        rv_empty = boolc( lv_value IS INITIAL ).
+      ENDIF.
+ 
+      IF rv_empty <> abap_true.
+        RETURN.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize.
+ 
+    DATA:
+      lt_fields TYPE zif_abapgit_html_form=>ty_fields,
+      lv_value  TYPE string,
+      lv_rows   TYPE i,
+      lv_row    TYPE i,
+      lv_len    TYPE i.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF lt_fields.
+ 
+    CREATE OBJECT ro_form_data.
+ 
+    IF io_form_data->is_empty( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    lt_fields = mo_form->get_fields( ).
+    LOOP AT lt_fields ASSIGNING <ls_field> WHERE type <> zif_abapgit_html_form=>c_field_type-field_group
+      AND type <> zif_abapgit_html_form=>c_field_type-hidden.
+ 
+      CLEAR lv_value.
+      lv_value = io_form_data->get( <ls_field>-name ).
+      IF <ls_field>-condense = abap_true.
+        lv_value = condense( val = lv_value
+                             del = ` ` ).
+      ENDIF.
+ 
+      IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-checkbox.
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = boolc( lv_value = 'on' ) ) ##TYPE.
+      ELSEIF ( <ls_field>-type = zif_abapgit_html_form=>c_field_type-text
+          OR <ls_field>-type = zif_abapgit_html_form=>c_field_type-textarea )
+          AND <ls_field>-upper_case = abap_true.
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = to_upper( lv_value ) ).
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-number.
+        " Numeric value is checked in validation
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = condense( val = lv_value del = ` ` ) ).
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-table.
+        lv_rows = io_form_data->get( |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }| ).
+        DO lv_rows TIMES.
+          lv_row = sy-index.
+          DO lines( <ls_field>-subitems ) TIMES.
+            lv_value = io_form_data->get( |{ <ls_field>-name }-{ lv_row }-{ sy-index }| ).
+            ro_form_data->set(
+              iv_key = |{ <ls_field>-name }-{ lv_row }-{ sy-index }|
+              iv_val = lv_value ).
+          ENDDO.
+        ENDDO.
+        ro_form_data->set(
+          iv_key = |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }|
+          iv_val = |{ lv_rows }| ).
+      ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-textarea.
+        REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_value
+          WITH cl_abap_char_utilities=>newline.
+
+        " Remove last line if empty (ie 2x newline)
+        lv_len = strlen( lv_value ) - 2.
+        IF lv_len >= 0 AND lv_value+lv_len(1) = cl_abap_char_utilities=>newline.
+          lv_len = lv_len + 1.
+          lv_value = lv_value(lv_len).
+        ENDIF.
+
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = lv_value ).
+      ELSE.
+        ro_form_data->set(
+          iv_key = <ls_field>-name
+          iv_val = lv_value ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_data.
+    mo_form_data = io_form_data.
+  ENDMETHOD.
+ 
+ 
+  METHOD validate.
+ 
+    DATA:
+      lt_fields TYPE zif_abapgit_html_form=>ty_fields,
+      lv_value  TYPE string,
+      lv_number TYPE i.
+ 
+    FIELD-SYMBOLS <ls_field> LIKE LINE OF lt_fields.
+ 
+    CREATE OBJECT ro_validation_log.
+ 
+    lt_fields = mo_form->get_fields( ).
+    LOOP AT lt_fields ASSIGNING <ls_field>.
+      lv_value = io_form_data->get( <ls_field>-name ).
+      IF <ls_field>-condense = abap_true.
+        lv_value = condense( val = lv_value
+                             del = ` ` ).
+      ENDIF.
+      IF <ls_field>-required IS NOT INITIAL AND lv_value IS INITIAL.
+        ro_validation_log->set(
+          iv_key = <ls_field>-name
+          iv_val = |{ <ls_field>-label } cannot be empty| ).
+      ENDIF.
+      CASE <ls_field>-type.
+        WHEN zif_abapgit_html_form=>c_field_type-text.
+          IF <ls_field>-min <> cl_abap_math=>min_int4 AND strlen( lv_value ) < <ls_field>-min.
+            ro_validation_log->set(
+              iv_key = <ls_field>-name
+              iv_val = |{ <ls_field>-label } must not be shorter than { <ls_field>-min } characters| ).
+          ENDIF.
+          IF <ls_field>-max <> cl_abap_math=>max_int4 AND strlen( lv_value ) > <ls_field>-max.
+            ro_validation_log->set(
+              iv_key = <ls_field>-name
+              iv_val = |{ <ls_field>-label } must not be longer than { <ls_field>-max } characters| ).
+          ENDIF.
+        WHEN zif_abapgit_html_form=>c_field_type-number.
+          TRY.
+              lv_number = lv_value.
+            CATCH cx_root.
+              ro_validation_log->set(
+                iv_key = <ls_field>-name
+                iv_val = |{ <ls_field>-label } is not numeric| ).
+              CONTINUE.
+          ENDTRY.
+          IF <ls_field>-min <> cl_abap_math=>min_int4 AND lv_number < <ls_field>-min.
+            ro_validation_log->set(
+              iv_key = <ls_field>-name
+              iv_val = |{ <ls_field>-label } must not be lower than { <ls_field>-min }| ).
+          ENDIF.
+          IF <ls_field>-max <> cl_abap_math=>max_int4 AND lv_number > <ls_field>-max.
+            ro_validation_log->set(
+              iv_key = <ls_field>-name
+              iv_val = |{ <ls_field>-label } must not be higher than { <ls_field>-max }| ).
+          ENDIF.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_html_form_utils.clas.testclasses.abap.html b/src/ui/lib/zcl_abapgit_html_form_utils.clas.testclasses.abap.html new file mode 100644 index 00000000000..f624157f33b --- /dev/null +++ b/src/ui/lib/zcl_abapgit_html_form_utils.clas.testclasses.abap.html @@ -0,0 +1,2038 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_html_form_utils.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_html_form_utils.clas.testclasses.abap

+
+ +
+ 99.53% + Statements + 648/651 +
+ + +
+ 100% + Branches + 10/10 +
+ + +
+ 76.92% + Functions + 10/13 +
+ + +
+ 99.53% + Lines + 648/651 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +6521x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +8x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_popups_mock DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    TYPES:
+      ty_user_decision TYPE string.
+ 
+    CONSTANTS:
+      BEGIN OF c_user_decision,
+        cancel  TYPE ty_user_decision VALUE 'cancel',
+        confirm TYPE ty_user_decision VALUE 'confirm',
+      END OF c_user_decision.
+ 
+    INTERFACES:
+      zif_abapgit_popups.
+ 
+    METHODS:
+      was_confirm_popup_shown
+        RETURNING
+          VALUE(rv_popup_shown) TYPE abap_bool,
+ 
+      set_user_decision
+        IMPORTING
+          iv_user_decision TYPE ty_user_decision.
+ 
+  PRIVATE SECTION.
+    DATA:
+      BEGIN OF ms_called,
+        popup_to_confirm TYPE abap_bool,
+      END OF ms_called,
+      mv_user_decision TYPE ty_user_decision.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_popups_mock IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_popups~branch_list_popup.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~commit_list_popup.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~create_branch_popup.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_folder_logic.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_search_help.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_confirm.
+ 
+    ms_called-popup_to_confirm = abap_true.
+ 
+    CASE mv_user_decision.
+      WHEN c_user_decision-cancel.
+        rv_answer = 'A'.
+      WHEN c_user_decision-confirm.
+        rv_answer = '1'.
+      WHEN OTHERS.
+        cl_abap_unit_assert=>fail( ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_create_package.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_create_transp_branch.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_from_list.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_transports.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_transport_request.
+  ENDMETHOD.
+ 
+  METHOD was_confirm_popup_shown.
+    rv_popup_shown = ms_called-popup_to_confirm.
+  ENDMETHOD.
+ 
+  METHOD set_user_decision.
+    mv_user_decision = iv_user_decision.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_select_tr_requests.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_select_wb_tc_tr_and_tsk.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~tag_list_popup.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_labels.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~choose_code_insp_check_variant.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_test_form DEFINITION
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT
+  FINAL.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_popups_mock TYPE REF TO ltcl_popups_mock.
+ 
+    METHODS setup.
+    METHODS validate1 FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS validate2 FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS validate3 FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS normalize FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS is_empty FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS exit_clean FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS exit_dirty_confirm FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS exit_dirty_cancel FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_test_form IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mo_popups_mock TYPE ltcl_popups_mock.
+    zcl_abapgit_ui_injector=>set_popups( mo_popups_mock ).
+ 
+  ENDMETHOD.
+ 
+  METHOD validate1.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_log TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_form      = zcl_abapgit_html_form=>create( ).
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+ 
+    lo_form->text(
+      iv_name     = 'field1'
+      iv_required = abap_true
+      iv_label    = 'Field name 1'
+    )->text(
+      iv_name  = 'field2'
+      iv_label = 'Field name 2' ).
+ 
+    lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 1 ).
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lo_log->get( 'field1' )
+      exp = '*cannot be empty' ).
+ 
+    lo_form_data->set(
+      iv_key = 'field1'
+      iv_val = '' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 1 ).
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lo_log->get( 'field1' )
+      exp = '*cannot be empty' ).
+ 
+    lo_form_data->set(
+      iv_key = 'field1'
+      iv_val = 'xyz' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD validate2.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_log TYPE REF TO zcl_abapgit_string_map.
+ 
+    " New form
+    lo_form = zcl_abapgit_html_form=>create( ).
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+ 
+    lo_form->text(
+      iv_name  = 'field3'
+      iv_min   = 3
+      iv_max   = 10
+      iv_label = 'Field name 3' ).
+ 
+    lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ).
+ 
+    lo_form_data->set(
+      iv_key = 'field3'
+      iv_val = 'xy' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 1 ).
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lo_log->get( 'field3' )
+      exp = '*must not be shorter*' ).
+ 
+    lo_form_data->set(
+      iv_key = 'field3'
+      iv_val = '01234567890123' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 1 ).
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lo_log->get( 'field3' )
+      exp = '*must not be longer*' ).
+ 
+    lo_form_data->set(
+      iv_key = 'field3'
+      iv_val = 'xyz!' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD validate3.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_log TYPE REF TO zcl_abapgit_string_map.
+ 
+    " New form
+    lo_form = zcl_abapgit_html_form=>create( ).
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+ 
+    lo_form->number(
+      iv_name  = 'field4'
+      iv_min   = 100
+      iv_max   = 200
+      iv_label = 'Field name 4' ).
+ 
+    lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ).
+ 
+    lo_form_data->set(
+      iv_key = 'field4'
+      iv_val = '123-456' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 1 ).
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lo_log->get( 'field4' )
+      exp = '*is not numeric*' ).
+ 
+    lo_form_data->set(
+      iv_key = 'field4'
+      iv_val = '50' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 1 ).
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lo_log->get( 'field4' )
+      exp = '*must not be lower*' ).
+ 
+    lo_form_data->set(
+      iv_key = 'field4'
+      iv_val = '250' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 1 ).
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lo_log->get( 'field4' )
+      exp = '*must not be higher*' ).
+ 
+    lo_form_data->set(
+      iv_key = 'field4'
+      iv_val = '150' ).
+ 
+    lo_log = lo_cut->validate( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_log->size( )
+      exp = 0 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD normalize.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_normalized_act TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_normalized_exp TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_form           = zcl_abapgit_html_form=>create( ).
+    lo_form_data      = zcl_abapgit_string_map=>create( iv_case_insensitive = abap_true ).
+    lo_normalized_exp = zcl_abapgit_string_map=>create( ).
+ 
+    lo_form->text(
+      iv_name  = 'field1'
+      iv_label = 'Field name 1'
+    )->text(
+      iv_name       = 'field2'
+      iv_upper_case = abap_true
+      iv_label      = 'Field name 2'
+    )->text(
+      iv_name  = 'field3'
+      iv_label = 'Field name 3'
+    )->checkbox(
+      iv_name  = 'chk1'
+      iv_label = 'Checkbox1'
+    )->checkbox(
+      iv_name  = 'chk2'
+      iv_label = 'Checkbox2'
+    )->number(
+      iv_name  = 'num1'
+      iv_label = 'Number 1'
+    )->table(
+      iv_name  = 'tab1'
+      iv_label = 'Table 1'
+    )->column( 'Column 1'
+    )->column( 'Column 2'
+    )->number(
+      iv_name  = |tab1-{ zif_abapgit_html_form=>c_rows }|
+      iv_label = 'Number of Rows' ). " simulate hidden form field
+ 
+    lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ).
+ 
+    lo_form_data->set(
+      iv_key = 'field1'
+      iv_val = 'val1' ).
+    lo_form_data->set(
+      iv_key = 'field2'
+      iv_val = 'val2' ).
+    " Intentionally field3 is not specificed
+    lo_form_data->set(
+      iv_key = 'chk1'
+      iv_val = '' ).
+    lo_form_data->set(
+      iv_key = 'chk2'
+      iv_val = 'on' ).
+    lo_form_data->set(
+      iv_key = 'chk3'
+      iv_val = 'on' ). " Extra field - filtered by normalizing
+ 
+    lo_form_data->set(
+      iv_key = 'num1'
+      iv_val = '   1234' ).
+ 
+    " Table with 2 rows, 2 columns
+    lo_form_data->set(
+      iv_key = |tab1-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = '2' ).
+    lo_form_data->set(
+      iv_key = |tab1-1-1|
+      iv_val = 'abc' ).
+    lo_form_data->set(
+      iv_key = |tab1-1-2|
+      iv_val = '123' ).
+    lo_form_data->set(
+      iv_key = |tab1-2-1|
+      iv_val = '' ).
+    lo_form_data->set(
+      iv_key = |tab1-2-2|
+      iv_val = '0' ).
+ 
+    lo_normalized_exp->set(
+      iv_key = 'field1'
+      iv_val = 'val1' ).
+    lo_normalized_exp->set(
+      iv_key = 'field2'
+      iv_val = 'VAL2' ).
+    lo_normalized_exp->set(
+      iv_key = 'field3'
+      iv_val = '' ). " But it is present in normalized
+    lo_normalized_exp->set(
+      iv_key = 'chk1'
+      iv_val = ` ` ). " hmmm
+    lo_normalized_exp->set(
+      iv_key = 'chk2'
+      iv_val = 'X' ).
+    lo_normalized_exp->set(
+      iv_key = 'chk2'
+      iv_val = 'X' ).
+ 
+    lo_normalized_exp->set(
+      iv_key = 'num1'
+      iv_val = '1234' ).
+ 
+    lo_normalized_exp->set(
+      iv_key = |tab1-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = '2' ).
+    lo_normalized_exp->set(
+      iv_key = |tab1-1-1|
+      iv_val = 'abc' ).
+    lo_normalized_exp->set(
+      iv_key = |tab1-1-2|
+      iv_val = '123' ).
+    lo_normalized_exp->set(
+      iv_key = |tab1-2-1|
+      iv_val = '' ).
+    lo_normalized_exp->set(
+      iv_key = |tab1-2-2|
+      iv_val = '0' ).
+ 
+    lo_normalized_act = lo_cut->normalize( lo_form_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_normalized_act->mt_entries
+      exp = lo_normalized_exp->mt_entries ).
+ 
+  ENDMETHOD.
+ 
+  METHOD is_empty.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_form      = zcl_abapgit_html_form=>create( ).
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+ 
+    lo_form->text(
+      iv_name  = 'field1'
+      iv_label = 'Field name 1'
+    )->checkbox(
+      iv_name  = 'chk1'
+      iv_label = 'Checkbox1'
+    )->number(
+      iv_name  = 'num1'
+      iv_label = 'Number 1'
+    )->table(
+      iv_name  = 'tab1'
+      iv_label = 'Table 1'
+    )->column( 'Column 1'
+    )->column( 'Column 2'
+    )->number(
+      iv_name  = |tab1-{ zif_abapgit_html_form=>c_rows }|
+      iv_label = 'Number of Rows' ). " simulate hidden form field
+ 
+    lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( lo_form_data )
+      exp = abap_true ).
+ 
+    lo_form_data->set(
+      iv_key = 'field1'
+      iv_val = 'val1' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( lo_form_data )
+      exp = abap_false ).
+ 
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+    lo_form_data->set(
+      iv_key = 'chk1'
+      iv_val = 'X' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( lo_form_data )
+      exp = abap_false ).
+ 
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+    lo_form_data->set(
+      iv_key = 'num1'
+      iv_val = '123' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( lo_form_data )
+      exp = abap_false ).
+ 
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+    lo_form_data->set(
+      iv_key = 'num1'
+      iv_val = '0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( lo_form_data )
+      exp = abap_true ).
+ 
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+    lo_form_data->set(
+      iv_key = |tab1-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = '2' ).
+    lo_form_data->set(
+      iv_key = |tab1-1-1|
+      iv_val = '' ).
+    lo_form_data->set(
+      iv_key = |tab1-1-2|
+      iv_val = '' ).
+    lo_form_data->set(
+      iv_key = |tab1-2-1|
+      iv_val = '' ).
+    lo_form_data->set(
+      iv_key = |tab1-2-2|
+      iv_val = 'Hello' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( lo_form_data )
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+  METHOD exit_clean.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_orig TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_form      = zcl_abapgit_html_form=>create( ).
+    lo_form_orig = zcl_abapgit_string_map=>create( ).
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+ 
+    lo_form->text(
+      iv_name  = 'field'
+      iv_label = 'Field name' ).
+ 
+    lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ).
+ 
+    " Clean form (no changes)
+    lo_form_orig->set(
+      iv_key = 'field'
+      iv_val = 'val' ).
+ 
+    lo_cut->set_data( lo_form_orig ).
+ 
+    lo_form_data->set(
+      iv_key = 'field'
+      iv_val = 'val' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->exit( lo_form_data )
+      exp = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_popups_mock->was_confirm_popup_shown( )
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+  METHOD exit_dirty_confirm.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_orig TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_form      = zcl_abapgit_html_form=>create( ).
+    lo_form_orig = zcl_abapgit_string_map=>create( ).
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+ 
+    lo_form->text(
+      iv_name  = 'field'
+      iv_label = 'Field name' ).
+ 
+    lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ).
+ 
+    " Dirty form (changed field value)
+    lo_form_orig = zcl_abapgit_string_map=>create( ).
+ 
+    lo_cut->set_data( lo_form_orig ).
+ 
+    lo_form_data->set(
+      iv_key = 'field'
+      iv_val = 'val' ).
+ 
+    mo_popups_mock->set_user_decision( ltcl_popups_mock=>c_user_decision-confirm ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->exit( lo_form_data )
+      exp = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_popups_mock->was_confirm_popup_shown( )
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+  METHOD exit_dirty_cancel.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_orig TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_form      = zcl_abapgit_html_form=>create( ).
+    lo_form_orig = zcl_abapgit_string_map=>create( ).
+    lo_form_data = zcl_abapgit_string_map=>create( ).
+ 
+    lo_form->text(
+      iv_name  = 'field'
+      iv_label = 'Field name' ).
+ 
+    lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ).
+ 
+    " Dirty form (changed field value)
+    lo_form_orig = zcl_abapgit_string_map=>create( ).
+ 
+    lo_cut->set_data( lo_form_orig ).
+ 
+    lo_form_data->set(
+      iv_key = 'field'
+      iv_val = 'val' ).
+ 
+    mo_popups_mock->set_user_decision( ltcl_popups_mock=>c_user_decision-cancel ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->exit( lo_form_data )
+      exp = zcl_abapgit_gui=>c_event_state-no_more_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mo_popups_mock->was_confirm_popup_shown( )
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_html_table.clas.abap.html b/src/ui/lib/zcl_abapgit_html_table.clas.abap.html new file mode 100644 index 00000000000..613bf74d105 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_html_table.clas.abap.html @@ -0,0 +1,694 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_html_table.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_html_table.clas.abap

+
+ +
+ 99.01% + Statements + 201/203 +
+ + +
+ 88.88% + Branches + 8/9 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 99.01% + Lines + 201/203 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +2041x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +3x +3x +  +  +3x +2x +2x +2x +1x +1x +1x +2x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_html_table DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_renderer    TYPE REF TO zif_abapgit_html_table
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_html_table .
+    " probably th css_class
+    " maybe auto class for td
+    METHODS define_column
+      IMPORTING
+        !iv_column_id  TYPE string
+        !iv_column_title TYPE string OPTIONAL
+        !iv_from_field TYPE abap_compname OPTIONAL
+      RETURNING
+        VALUE(ro_self)  TYPE REF TO zcl_abapgit_html_table .
+    " Maybe also data_provider
+    " Record Limit
+    METHODS render
+      IMPORTING
+        !iv_id         TYPE csequence OPTIONAL
+        !iv_css_class  TYPE csequence OPTIONAL
+        !it_data       TYPE ANY TABLE
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_column,
+        column_id TYPE string,
+        column_title TYPE string,
+        from_field  TYPE abap_compname,
+      END OF ty_column,
+      ty_columns TYPE STANDARD TABLE OF ty_column WITH KEY column_id.
+ 
+ 
+    DATA mi_renderer TYPE REF TO zif_abapgit_html_table.
+    DATA mt_columns TYPE ty_columns.
+    DATA mi_html TYPE REF TO zif_abapgit_html.
+ 
+    METHODS render_thead
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS render_tbody
+      IMPORTING
+        it_data TYPE ANY TABLE
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS render_row
+      IMPORTING
+        iv_row_index TYPE i
+        is_row TYPE any
+      RAISING
+        zcx_abapgit_exception .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_HTML_TABLE IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    ASSERT ii_renderer IS BOUND.
+    CREATE OBJECT ro_instance.
+    ro_instance->mi_renderer = ii_renderer.
+  ENDMETHOD.
+ 
+ 
+  METHOD define_column.
+ 
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF mt_columns.
+ 
+    ASSERT iv_column_id IS NOT INITIAL.
+    ro_self = me.
+ 
+    APPEND INITIAL LINE TO mt_columns ASSIGNING <ls_c>.
+    <ls_c>-column_id    = iv_column_id.
+    <ls_c>-column_title = iv_column_title.
+    <ls_c>-from_field   = to_upper( iv_from_field ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render.
+ 
+    DATA lv_attrs TYPE string.
+ 
+    IF iv_id IS NOT INITIAL.
+      lv_attrs = lv_attrs && | id="{ iv_id }"|.
+    ENDIF.
+ 
+    IF iv_css_class IS NOT INITIAL.
+      lv_attrs = lv_attrs && | class="{ iv_css_class }"|.
+    ENDIF.
+ 
+    CREATE OBJECT mi_html TYPE zcl_abapgit_html.
+    ri_html = mi_html.
+ 
+    mi_html->add( |<table{ lv_attrs }>| ).
+    render_thead( ).
+    render_tbody( it_data ).
+    mi_html->add( '</table>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_row.
+ 
+    DATA ls_render TYPE zif_abapgit_html_table=>ty_cell_render.
+    DATA lv_dummy TYPE string.
+    FIELD-SYMBOLS <ls_col> LIKE LINE OF mt_columns.
+    FIELD-SYMBOLS <lv_val> TYPE any.
+ 
+    LOOP AT mt_columns ASSIGNING <ls_col>.
+      IF <ls_col>-from_field IS NOT INITIAL AND <ls_col>-from_field <> '-'.
+        ASSIGN COMPONENT <ls_col>-from_field OF STRUCTURE is_row TO <lv_val>.
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise( |html_table: cannot assign field [{ <ls_col>-from_field }]| ).
+        ENDIF.
+      ELSEIF <ls_col>-from_field <> '-'.
+        <ls_col>-from_field = to_upper( <ls_col>-column_id ). " Try column_id
+        ASSIGN COMPONENT <ls_col>-from_field OF STRUCTURE is_row TO <lv_val>.
+        IF sy-subrc <> 0.
+          <ls_col>-from_field = '-'. " Don't try assignments anymore
+          ASSIGN lv_dummy TO <lv_val>.
+        ENDIF.
+      ELSE.
+        ASSIGN lv_dummy TO <lv_val>.
+      ENDIF.
+      ls_render = mi_renderer->render_cell(
+        iv_row_index = iv_row_index
+        is_row       = is_row
+        iv_column_id = <ls_col>-column_id
+        iv_value     = <lv_val> ).
+      mi_html->td(
+        iv_content = ls_render-content
+        ii_content = ls_render-html
+        iv_class   = ls_render-css_class ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_tbody.
+ 
+    DATA ls_row_attrs TYPE zif_abapgit_html_table=>ty_row_attrs.
+    DATA lv_row_attrs TYPE string.
+    DATA lv_index TYPE i.
+ 
+    FIELD-SYMBOLS <ls_i> TYPE any.
+ 
+    mi_html->add( '<tbody>' ).
+ 
+    LOOP AT it_data ASSIGNING <ls_i>.
+      lv_index = sy-tabix.
+      ls_row_attrs = mi_renderer->get_row_attrs(
+        iv_row_index = lv_index
+        is_row       = <ls_i> ).
+      CLEAR lv_row_attrs.
+      IF ls_row_attrs-css_class IS NOT INITIAL.
+        lv_row_attrs = lv_row_attrs && | class="{ ls_row_attrs-css_class }"|.
+      ENDIF.
+      mi_html->add( |<tr{ lv_row_attrs }>| ).
+      render_row(
+        iv_row_index = lv_index
+        is_row       = <ls_i> ).
+      mi_html->add( '</tr>' ).
+    ENDLOOP.
+ 
+    mi_html->add( '</tbody>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_thead.
+ 
+    FIELD-SYMBOLS <ls_col> LIKE LINE OF mt_columns.
+ 
+    mi_html->add( '<thead>' ).
+    mi_html->add( '<tr>' ).
+ 
+    LOOP AT mt_columns ASSIGNING <ls_col>.
+      mi_html->th( iv_content = <ls_col>-column_title ).
+    ENDLOOP.
+ 
+    mi_html->add( '</tr>' ).
+    mi_html->add( '</thead>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_html_table.clas.testclasses.abap.html b/src/ui/lib/zcl_abapgit_html_table.clas.testclasses.abap.html new file mode 100644 index 00000000000..70c11009e30 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_html_table.clas.testclasses.abap.html @@ -0,0 +1,391 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_html_table.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_html_table.clas.testclasses.abap

+
+ +
+ 100% + Statements + 102/102 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 102/102 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +1031x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +1x +1x +1x +1x +2x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test_simple_table DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_html_table.
+ 
+    TYPES:
+      BEGIN OF ty_simple_data,
+        col1 TYPE string,
+        col2 TYPE i,
+        col3 TYPE i,
+        col4 TYPE REF TO data,
+      END OF ty_simple_data.
+ 
+    METHODS simple_render FOR TESTING RAISING zcx_abapgit_exception.
+ENDCLASS.
+ 
+CLASS ltcl_test_simple_table IMPLEMENTATION.
+  METHOD zif_abapgit_html_table~get_row_attrs.
+    rs_attrs-css_class = |r{ iv_row_index }|.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_html_table~render_cell.
+    rs_render-css_class = 'cell'.
+    IF iv_column_id = 'colX'.
+      IF iv_row_index = 2.
+        rs_render-html = zcl_abapgit_html=>create( )->add( 'XHTML' ).
+      ELSE.
+        rs_render-content = 'X'.
+      ENDIF.
+    ELSE.
+      rs_render-content = |{ iv_value }|.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD simple_render.
+ 
+    DATA lo_tab TYPE REF TO zcl_abapgit_html_table.
+    DATA lt_dummy_data TYPE TABLE OF ty_simple_data.
+    DATA lv_html_act TYPE string.
+    DATA li_html_exp TYPE REF TO zif_abapgit_html.
+    FIELD-SYMBOLS <ls_i> LIKE LINE OF lt_dummy_data.
+ 
+    lo_tab = zcl_abapgit_html_table=>create( ii_renderer = me
+      )->define_column(
+        iv_column_id = 'col1'
+        iv_column_title = 'Col 1'
+      )->define_column(
+        iv_column_id = 'col2'
+        iv_column_title = 'Col 2'
+        iv_from_field = 'col3'
+      )->define_column( 'colX' ).
+ 
+    APPEND INITIAL LINE TO lt_dummy_data ASSIGNING <ls_i>.
+    <ls_i>-col1 = 'Hello'.
+    <ls_i>-col2 = 1.
+    <ls_i>-col3 = 10.
+    APPEND INITIAL LINE TO lt_dummy_data ASSIGNING <ls_i>.
+    <ls_i>-col1 = 'World'.
+    <ls_i>-col2 = 2.
+    <ls_i>-col3 = 20.
+ 
+    lv_html_act = lo_tab->render(
+      iv_id        = 'tabid'
+      iv_css_class = 'tabclass'
+      it_data      = lt_dummy_data )->render( ).
+ 
+    CREATE OBJECT li_html_exp TYPE zcl_abapgit_html.
+ 
+    li_html_exp->add(
+      '<table id="tabid" class="tabclass">' )->add(
+      '<thead>' )->add(
+      '<tr>' )->add(
+      '<th>Col 1</th>' )->add(
+      '<th>Col 2</th>' )->add(
+      '<th></th>' )->add(
+      '</tr>' )->add(
+      '</thead>' )->add(
+      '<tbody>' )->add(
+      '<tr class="r1">' )->add(
+      '<td class="cell">Hello</td>' )->add(
+      '<td class="cell">10</td>' )->add(
+      '<td class="cell">X</td>' )->add(
+      '</tr>' )->add(
+      '<tr class="r2">' )->add(
+      '<td class="cell">World</td>' )->add(
+      '<td class="cell">20</td>' )->add(
+      '<td class="cell">' )->add(
+      'XHTML' )->add(
+      '</td>' )->add(
+      '</tr>' )->add(
+      '</tbody>' )->add(
+      '</table>' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_html_act
+      exp = li_html_exp->render( ) ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_html_toolbar.clas.abap.html b/src/ui/lib/zcl_abapgit_html_toolbar.clas.abap.html new file mode 100644 index 00000000000..3a1a8e38182 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_html_toolbar.clas.abap.html @@ -0,0 +1,916 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_html_toolbar.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_html_toolbar.clas.abap

+
+ +
+ 100% + Statements + 277/277 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 277/277 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +2781x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_html_toolbar DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_id TYPE string OPTIONAL
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_html_toolbar.
+    METHODS constructor
+      IMPORTING
+        !iv_id TYPE string OPTIONAL .
+    METHODS add
+      IMPORTING
+        !iv_txt        TYPE string
+        !io_sub        TYPE REF TO zcl_abapgit_html_toolbar OPTIONAL
+        !iv_typ        TYPE c DEFAULT zif_abapgit_html=>c_action_type-sapevent
+        !iv_act        TYPE string OPTIONAL
+        !iv_ico        TYPE string OPTIONAL
+        !iv_cur        TYPE abap_bool OPTIONAL
+        !iv_opt        TYPE c OPTIONAL
+        !iv_chk        TYPE abap_bool DEFAULT abap_undefined
+        !iv_aux        TYPE string OPTIONAL
+        !iv_id         TYPE string OPTIONAL
+        !iv_title      TYPE string OPTIONAL
+        !iv_class      TYPE string OPTIONAL
+        !iv_li_class   TYPE string OPTIONAL
+      RETURNING
+        VALUE(ro_self) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS count_items
+      RETURNING
+        VALUE(rv_count) TYPE i .
+    METHODS render
+      IMPORTING
+        !iv_right      TYPE abap_bool OPTIONAL
+        !iv_sort       TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_as_droplist
+      IMPORTING
+        !iv_label      TYPE string
+        !iv_right      TYPE abap_bool OPTIONAL
+        !iv_sort       TYPE abap_bool OPTIONAL
+        !iv_corner     TYPE abap_bool OPTIONAL
+        !iv_action     TYPE string OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_item,
+        txt      TYPE string,
+        act      TYPE string,
+        ico      TYPE string,
+        sub      TYPE REF TO zcl_abapgit_html_toolbar,
+        opt      TYPE c LENGTH 1,
+        typ      TYPE c LENGTH 1,
+        cur      TYPE abap_bool,
+        chk      TYPE abap_bool,
+        aux      TYPE string,
+        id       TYPE string,
+        title    TYPE string,
+        class    TYPE string,
+        li_class TYPE string,
+      END OF ty_item .
+    TYPES:
+      ty_items TYPE STANDARD TABLE OF ty_item .
+ 
+    DATA mt_items TYPE ty_items .
+    DATA mv_id TYPE string .
+ 
+    METHODS render_items
+      IMPORTING
+        !iv_sort       TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_html_toolbar IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+    DATA ls_item TYPE ty_item.
+ 
+    ASSERT iv_typ = zif_abapgit_html=>c_action_type-separator  " sep doesn't have action
+      OR iv_typ = zif_abapgit_html=>c_action_type-onclick      " click may have no action (assigned in JS)
+      OR iv_typ = zif_abapgit_html=>c_action_type-dummy        " dummy may have no action
+      OR iv_act IS INITIAL AND io_sub IS NOT INITIAL
+      OR iv_act IS NOT INITIAL AND io_sub IS INITIAL. " Only one supplied
+ 
+    ASSERT NOT ( iv_chk <> abap_undefined AND io_sub IS NOT INITIAL ).
+ 
+    ls_item-txt   = iv_txt.
+    ls_item-act   = iv_act.
+    ls_item-ico   = iv_ico.
+    ls_item-sub   = io_sub.
+    ls_item-opt   = iv_opt.
+    ls_item-typ   = iv_typ.
+    ls_item-cur   = iv_cur.
+    ls_item-chk   = iv_chk.
+    ls_item-aux   = iv_aux.
+    ls_item-id    = iv_id.
+    ls_item-title = iv_title.
+    ls_item-class = iv_class.
+    ls_item-li_class = iv_li_class.
+ 
+    APPEND ls_item TO mt_items.
+ 
+    ro_self = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_id = iv_id.
+  ENDMETHOD.
+ 
+  METHOD create.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_id = iv_id.
+  ENDMETHOD.
+ 
+ 
+  METHOD count_items.
+    rv_count = lines( mt_items ).
+  ENDMETHOD.
+ 
+ 
+  METHOD render.
+ 
+    DATA: lv_class TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_class = 'nav-container'.
+    IF iv_right = abap_true.
+      lv_class = lv_class && ' float-right'.
+    ENDIF.
+ 
+    ri_html->add( |<div class="{ lv_class }">| ).
+    ri_html->add( render_items( iv_sort = iv_sort ) ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_as_droplist.
+ 
+    DATA: lv_class TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_class = 'nav-container'.
+    IF iv_right = abap_true.
+      lv_class = lv_class && ' float-right'.
+    ENDIF.
+    IF iv_corner = abap_true.
+      lv_class = lv_class && ' corner'.
+    ENDIF.
+ 
+    ri_html->add( |<div class="{ lv_class }">| ).
+    ri_html->add( '<ul><li>' ).
+    ri_html->add_a( iv_txt = iv_label
+                    iv_typ = zif_abapgit_html=>c_action_type-sapevent
+                    iv_act = iv_action ).
+    ri_html->add( '<div class="minizone"></div>' ).
+    ri_html->add( render_items( iv_sort = iv_sort ) ).
+    ri_html->add( '</li></ul>' ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_items.
+ 
+    DATA: lv_class       TYPE string,
+          lv_class_value TYPE string,
+          lv_icon        TYPE string,
+          lv_id          TYPE string,
+          lv_check       TYPE string,
+          lv_aux         TYPE string,
+          lv_has_icons   TYPE abap_bool.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF mt_items.
+ 
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF iv_sort = abap_true.
+      SORT mt_items BY txt ASCENDING AS TEXT.
+    ENDIF.
+ 
+    " Check has icons or check boxes
+    LOOP AT mt_items ASSIGNING <ls_item> WHERE ico IS NOT INITIAL OR chk <> abap_undefined.
+      lv_has_icons = abap_true.
+      lv_class     = ' class="with-icons"'.
+      EXIT.
+    ENDLOOP.
+ 
+    IF mv_id IS NOT INITIAL.
+      lv_id = | id="{ mv_id }"|.
+    ENDIF.
+ 
+    ri_html->add( |<ul{ lv_id }{ lv_class }>| ).
+ 
+    " Render items
+    LOOP AT mt_items ASSIGNING <ls_item>.
+      CLEAR: lv_class, lv_class_value, lv_icon.
+ 
+      IF <ls_item>-typ = zif_abapgit_html=>c_action_type-separator.
+        ri_html->add( |<li class="separator">{ <ls_item>-txt }</li>| ).
+        CONTINUE.
+      ENDIF.
+ 
+      IF lv_has_icons = abap_true.
+        IF <ls_item>-chk = abap_true.
+          lv_icon  = ri_html->icon( 'check/blue' ).
+          lv_check = ' data-check="X"'.
+        ELSEIF <ls_item>-chk = abap_false.
+          lv_icon = ri_html->icon( 'check/grey' ).
+          lv_check = ' data-check=""'.
+        ELSE. " abap_undefined -> not a check box
+          lv_icon = ri_html->icon( <ls_item>-ico ).
+        ENDIF.
+      ENDIF.
+ 
+ 
+      IF <ls_item>-cur = abap_true.
+        IF <ls_item>-li_class IS INITIAL.
+          lv_class_value =  'current-menu-item'.
+        ELSE.
+          lv_class_value =  |current-menu-item { <ls_item>-li_class }|.
+        ENDIF.
+      ELSE.
+        lv_class_value =  <ls_item>-li_class.
+      ENDIF.
+      IF lv_class_value IS NOT INITIAL.
+        lv_class =   | class="{ lv_class_value }"|.
+      ENDIF.
+      IF <ls_item>-aux IS NOT INITIAL.
+        lv_aux = | data-aux="{ <ls_item>-aux }"|.
+      ENDIF.
+ 
+      ri_html->add( |<li{ lv_class }{ lv_check }{ lv_aux }>| ).
+ 
+      IF <ls_item>-sub IS INITIAL.
+        ri_html->add_a( iv_txt   = lv_icon && <ls_item>-txt
+                        iv_typ   = <ls_item>-typ
+                        iv_act   = <ls_item>-act
+                        iv_id    = <ls_item>-id
+                        iv_opt   = <ls_item>-opt
+                        iv_title = <ls_item>-title
+                        iv_class = <ls_item>-class ).
+      ELSE.
+        ri_html->add_a( iv_txt   = lv_icon && <ls_item>-txt
+                        iv_typ   = zif_abapgit_html=>c_action_type-dummy
+                        iv_act   = ''
+                        iv_id    = <ls_item>-id
+                        iv_opt   = <ls_item>-opt
+                        iv_title = <ls_item>-title
+                        iv_class = <ls_item>-class ).
+        ri_html->add( <ls_item>-sub->render_items( iv_sort ) ).
+      ENDIF.
+      ri_html->add( '</li>' ).
+ 
+    ENDLOOP.
+ 
+    ri_html->add( '</ul>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/lib/zcl_abapgit_log_viewer.clas.abap.html b/src/ui/lib/zcl_abapgit_log_viewer.clas.abap.html new file mode 100644 index 00000000000..515e575f314 --- /dev/null +++ b/src/ui/lib/zcl_abapgit_log_viewer.clas.abap.html @@ -0,0 +1,1657 @@ + + + + + + Code coverage report for src/ui/lib/zcl_abapgit_log_viewer.clas.abap + + + + + + + + + +
+
+

All files / src/ui/lib zcl_abapgit_log_viewer.clas.abap

+
+ +
+ 100% + Statements + 524/524 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 524/524 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +5251x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_log_viewer DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS show_log
+      IMPORTING
+        !ii_log TYPE REF TO zif_abapgit_log .
+    CLASS-METHODS to_html
+      IMPORTING
+        !ii_log        TYPE REF TO zif_abapgit_log
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    CLASS-METHODS write_log
+      IMPORTING
+        !ii_log TYPE REF TO zif_abapgit_log .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_log_out,
+        type      TYPE icon_d,
+        msg       TYPE string,
+        obj_type  TYPE trobjtype,
+        obj_name  TYPE sobj_name,
+        exception TYPE REF TO cx_root,
+        longtext  TYPE icon_d,
+        t100      TYPE icon_d,
+        source    TYPE icon_d,
+        callstack TYPE icon_d,
+        cell_type TYPE salv_t_int4_column,
+      END OF ty_log_out.
+    TYPES:
+      ty_log_outs TYPE STANDARD TABLE OF ty_log_out
+                                WITH NON-UNIQUE DEFAULT KEY.
+ 
+    CLASS-METHODS:
+      prepare_log_for_display
+        IMPORTING
+          ii_log            TYPE REF TO zif_abapgit_log
+        RETURNING
+          VALUE(rt_log_out) TYPE ty_log_outs,
+ 
+      show_longtext
+        IMPORTING
+          is_log TYPE ty_log_out
+        RAISING
+          zcx_abapgit_exception,
+ 
+      goto_source
+        IMPORTING
+          is_log TYPE ty_log_out
+        RAISING
+          zcx_abapgit_exception,
+ 
+      goto_callstack
+        IMPORTING
+          is_log TYPE ty_log_out
+        RAISING
+          zcx_abapgit_exception,
+ 
+      goto_t100_message
+        IMPORTING
+          is_log TYPE ty_log_out
+        RAISING
+          zcx_abapgit_exception,
+ 
+      on_link_click FOR EVENT link_click OF cl_salv_events_table
+        IMPORTING row column,
+ 
+      dispatch
+        IMPORTING
+          is_log    TYPE ty_log_out
+          iv_column TYPE salv_de_column
+        RAISING
+          zcx_abapgit_exception,
+ 
+      calculate_cell_type,
+ 
+      get_exception_viewer
+        IMPORTING
+          is_log                     TYPE ty_log_out
+        RETURNING
+          VALUE(ro_exception_viewer) TYPE REF TO zcl_abapgit_exception_viewer.
+ 
+    CLASS-DATA:
+      gt_log TYPE ty_log_outs.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_LOG_VIEWER IMPLEMENTATION.
+ 
+ 
+  METHOD calculate_cell_type.
+ 
+    FIELD-SYMBOLS: <ls_log> LIKE LINE OF gt_log.
+    DATA: ls_cell_type LIKE LINE OF <ls_log>-cell_type.
+ 
+    LOOP AT gt_log ASSIGNING <ls_log>.
+ 
+      IF <ls_log>-longtext IS NOT INITIAL.
+        ls_cell_type-columnname = `LONGTEXT`.
+        ls_cell_type-value      = if_salv_c_cell_type=>hotspot.
+        INSERT ls_cell_type INTO TABLE <ls_log>-cell_type.
+      ENDIF.
+ 
+      IF <ls_log>-t100 IS NOT INITIAL.
+        ls_cell_type-columnname = `T100`.
+        ls_cell_type-value      = if_salv_c_cell_type=>hotspot.
+        INSERT ls_cell_type INTO TABLE <ls_log>-cell_type.
+      ENDIF.
+ 
+      IF <ls_log>-source IS NOT INITIAL.
+        ls_cell_type-columnname = `SOURCE`.
+        ls_cell_type-value      = if_salv_c_cell_type=>hotspot.
+        INSERT ls_cell_type INTO TABLE <ls_log>-cell_type.
+      ENDIF.
+ 
+      IF <ls_log>-callstack IS NOT INITIAL.
+        ls_cell_type-columnname = `CALLSTACK`.
+        ls_cell_type-value      = if_salv_c_cell_type=>hotspot.
+        INSERT ls_cell_type INTO TABLE <ls_log>-cell_type.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dispatch.
+ 
+    CASE iv_column.
+      WHEN `LONGTEXT`.
+ 
+        show_longtext( is_log ).
+ 
+      WHEN `T100`.
+ 
+        goto_t100_message( is_log ).
+ 
+      WHEN `SOURCE`.
+ 
+        goto_source( is_log ).
+ 
+      WHEN `CALLSTACK`.
+ 
+        goto_callstack( is_log ).
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_exception_viewer.
+ 
+    DATA:
+      lx_abapgit TYPE REF TO zcx_abapgit_exception.
+ 
+    ASSERT is_log-exception IS BOUND.
+    lx_abapgit ?= is_log-exception.
+ 
+    CREATE OBJECT ro_exception_viewer
+      EXPORTING
+        ix_error = lx_abapgit.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD goto_callstack.
+ 
+    get_exception_viewer( is_log )->show_callstack( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD goto_source.
+ 
+    get_exception_viewer( is_log )->goto_source( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD goto_t100_message.
+ 
+    get_exception_viewer( is_log )->goto_message( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD on_link_click.
+ 
+    DATA: lx_error TYPE REF TO zcx_abapgit_exception.
+    FIELD-SYMBOLS: <ls_log> TYPE ty_log_out.
+ 
+    IF row IS INITIAL
+    OR column IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE gt_log ASSIGNING <ls_log>
+                      INDEX row.
+    ASSERT sy-subrc = 0.
+ 
+    TRY.
+        dispatch(
+            is_log    = <ls_log>
+            iv_column = column ).
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+        MESSAGE lx_error TYPE 'S' DISPLAY LIKE 'E'.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD prepare_log_for_display.
+ 
+    DATA: lt_message      TYPE zif_abapgit_log=>ty_log_outs,
+          lr_message      TYPE REF TO zif_abapgit_log=>ty_log_out,
+          ls_log          TYPE ty_log_out,
+          li_t100_message TYPE REF TO if_t100_message,
+          lx_abapgit      TYPE REF TO zcx_abapgit_exception.
+ 
+    lt_message = ii_log->get_messages( ).
+ 
+    LOOP AT lt_message REFERENCE INTO lr_message.
+ 
+      CLEAR: ls_log.
+ 
+      ls_log-msg = lr_message->text.
+      ls_log-exception = lr_message->exception.
+ 
+      CASE lr_message->type.
+        WHEN 'E' OR 'A' OR 'X'.
+          ls_log-type = icon_led_red.
+        WHEN 'W'.
+          ls_log-type = icon_led_yellow.
+        WHEN 'I' OR 'S'.
+          ls_log-type = icon_led_green.
+        WHEN OTHERS.
+          ls_log-type = icon_led_inactive.
+      ENDCASE.
+ 
+      IF lr_message->exception IS BOUND.
+ 
+        TRY.
+            li_t100_message ?= lr_message->exception.
+ 
+            IF li_t100_message->t100key IS NOT INITIAL.
+              ls_log-t100 = icon_message_information.
+            ENDIF.
+ 
+          CATCH cx_sy_move_cast_error ##NO_HANDLER.
+        ENDTRY.
+ 
+        TRY.
+            lx_abapgit ?= lr_message->exception.
+ 
+            IF lx_abapgit->mt_callstack IS NOT INITIAL.
+              ls_log-longtext  = icon_system_help.
+              ls_log-callstack = icon_stack.
+              ls_log-source    = icon_abap.
+            ENDIF.
+ 
+          CATCH cx_sy_move_cast_error ##NO_HANDLER.
+        ENDTRY.
+ 
+      ENDIF.
+ 
+      ls_log-obj_type = lr_message->obj_type.
+      ls_log-obj_name = lr_message->obj_name.
+ 
+      INSERT ls_log INTO TABLE rt_log_out.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD show_log.
+ 
+    DATA: lr_log         TYPE REF TO ty_log_out,
+          lo_alv         TYPE REF TO cl_salv_table,
+          lx_error       TYPE REF TO cx_salv_error,
+          lo_form_header TYPE REF TO cl_salv_form_header_info,
+          lo_columns     TYPE REF TO cl_salv_columns_table,
+          lo_column      TYPE REF TO cl_salv_column,
+          lo_functions   TYPE REF TO cl_salv_functions_list,
+          ls_position    TYPE zif_abapgit_popups=>ty_popup_position,
+          lv_add_obj_col TYPE abap_bool,
+          lo_event       TYPE REF TO cl_salv_events_table.
+ 
+    gt_log = prepare_log_for_display( ii_log ).
+ 
+    "check if log contains any object info
+    LOOP AT gt_log REFERENCE INTO lr_log.
+      IF lr_log->obj_type IS NOT INITIAL OR lr_log->obj_name IS NOT INITIAL.
+        lv_add_obj_col = abap_true.
+      ENDIF.
+    ENDLOOP.
+ 
+    TRY.
+        cl_salv_table=>factory(
+          IMPORTING
+            r_salv_table = lo_alv
+          CHANGING
+            t_table      = gt_log ).
+ 
+        lo_functions = lo_alv->get_functions( ).
+        lo_functions->set_all( ).
+ 
+        lo_alv->get_display_settings( )->set_list_header( |abapGit Log Viewer| ).
+ 
+        lo_columns = lo_alv->get_columns( ).
+ 
+        lo_columns->set_optimize( ).
+        lo_columns->set_cell_type_column( |CELL_TYPE| ).
+ 
+        calculate_cell_type( ).
+ 
+        lo_column = lo_columns->get_column( |TYPE| ).
+        lo_column->set_medium_text( |Type| ).
+ 
+        lo_column = lo_columns->get_column( |MSG| ).
+        lo_column->set_medium_text( |Message| ).
+ 
+        lo_column = lo_columns->get_column( |LONGTEXT| ).
+        lo_column->set_medium_text( |Longtext| ).
+ 
+        lo_column = lo_columns->get_column( |T100| ).
+        lo_column->set_medium_text( |Goto message| ).
+ 
+        lo_column = lo_columns->get_column( |SOURCE| ).
+        lo_column->set_medium_text( |Goto source| ).
+ 
+        lo_column = lo_columns->get_column( |CALLSTACK| ).
+        lo_column->set_medium_text( |Show callstack| ).
+ 
+        IF lv_add_obj_col = abap_true.
+          lo_column = lo_columns->get_column( |OBJ_TYPE| ).
+          lo_column->set_medium_text( |Object Type| ).
+ 
+          lo_column = lo_columns->get_column( |OBJ_NAME| ).
+          lo_column->set_medium_text( |Object Name| ).
+        ELSE.
+          "hide object columns
+          lo_column = lo_columns->get_column( |OBJ_TYPE| ).
+          lo_column->set_technical( abap_true ).
+ 
+          lo_column = lo_columns->get_column( |OBJ_NAME| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        "hide empty columns
+        LOOP AT gt_log TRANSPORTING NO FIELDS WHERE t100 IS NOT INITIAL.
+          EXIT.
+        ENDLOOP.
+        IF sy-subrc <> 0.
+          lo_column = lo_columns->get_column( |T100| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        LOOP AT gt_log TRANSPORTING NO FIELDS WHERE source IS NOT INITIAL.
+          EXIT.
+        ENDLOOP.
+        IF sy-subrc <> 0.
+          lo_column = lo_columns->get_column( |SOURCE| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        LOOP AT gt_log TRANSPORTING NO FIELDS WHERE longtext IS NOT INITIAL.
+          EXIT.
+        ENDLOOP.
+        IF sy-subrc <> 0.
+          lo_column = lo_columns->get_column( |LONGTEXT| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        LOOP AT gt_log TRANSPORTING NO FIELDS WHERE callstack IS NOT INITIAL.
+          EXIT.
+        ENDLOOP.
+        IF sy-subrc <> 0.
+          lo_column = lo_columns->get_column( |CALLSTACK| ).
+          lo_column->set_technical( abap_true ).
+        ENDIF.
+ 
+        ls_position = zcl_abapgit_popups=>center(
+          iv_width  = 125
+          iv_height = 20 ).
+ 
+        lo_alv->set_screen_popup( start_column = ls_position-start_column
+                                  end_column   = ls_position-end_column
+                                  start_line   = ls_position-start_row
+                                  end_line     = ls_position-end_row ).
+ 
+        CREATE OBJECT lo_form_header
+          EXPORTING
+            text = ii_log->get_title( ).
+ 
+        lo_alv->set_top_of_list( lo_form_header ).
+ 
+        lo_event = lo_alv->get_event( ).
+ 
+        SET HANDLER on_link_click FOR lo_event.
+ 
+        lo_alv->display( ).
+ 
+      CATCH cx_salv_error INTO lx_error.
+        MESSAGE lx_error TYPE 'S' DISPLAY LIKE 'E'.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD show_longtext.
+ 
+    DATA: lx_abapgit TYPE REF TO zcx_abapgit_exception.
+ 
+    DATA: lv_docu_object TYPE dokhl-object,
+          lt_dummy1      TYPE TABLE OF dselc,
+          lt_dummy2      TYPE TABLE OF dval,
+          ls_help_info   TYPE help_info.
+ 
+    IF is_log-exception IS NOT BOUND.
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        lx_abapgit ?= is_log-exception.
+      CATCH cx_sy_move_cast_error.
+        RETURN.
+    ENDTRY.
+ 
+    lv_docu_object   = lx_abapgit->if_t100_message~t100key-msgid.
+    lv_docu_object+2 = lx_abapgit->if_t100_message~t100key-msgno.
+ 
+    ls_help_info-call       = 'D'.
+    ls_help_info-spras      = sy-langu.
+    ls_help_info-messageid  = lx_abapgit->if_t100_message~t100key-msgid.
+    ls_help_info-messagenr  = lx_abapgit->if_t100_message~t100key-msgno.
+    ls_help_info-message    = is_log-msg.
+    ls_help_info-title      = 'Longtext'.
+    ls_help_info-docuid     = 'NA'.
+    ls_help_info-docuobject = lv_docu_object.
+    ls_help_info-msgv1      = lx_abapgit->msgv1.
+    ls_help_info-msgv2      = lx_abapgit->msgv2.
+    ls_help_info-msgv3      = lx_abapgit->msgv3.
+    ls_help_info-msgv4      = lx_abapgit->msgv4.
+ 
+    CALL FUNCTION 'HELP_START'
+      EXPORTING
+        help_infos   = ls_help_info
+      TABLES
+        dynpselect   = lt_dummy1
+        dynpvaluetab = lt_dummy2
+      EXCEPTIONS
+        OTHERS       = 1.
+ 
+    IF sy-subrc IS NOT INITIAL.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD to_html.
+ 
+    DATA: lt_message TYPE zif_abapgit_log=>ty_log_outs,
+          lr_message TYPE REF TO zif_abapgit_log=>ty_log_out,
+          lv_class   TYPE string,
+          lv_icon    TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF ii_log->count( ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    lt_message = ii_log->get_messages( ).
+ 
+    LOOP AT lt_message REFERENCE INTO lr_message.
+      CASE lr_message->type.
+        WHEN 'W'.
+          lv_icon  = 'attention'.
+          lv_class = 'warning'.
+        WHEN 'E'.
+          lv_icon  = 'error'.
+          lv_class = 'error'.
+        WHEN OTHERS. " ??? unexpected
+          lv_icon  = 'error'.
+          lv_class = 'error'.
+      ENDCASE.
+ 
+      ri_html->add( |<span class="{ lv_class }">| ).
+      ri_html->add_icon( lv_icon ).
+      ri_html->add( lr_message->text ).
+      ri_html->add( '</span>' ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD write_log.
+ 
+    DATA: lt_message TYPE zif_abapgit_log=>ty_log_outs,
+          lr_message TYPE REF TO zif_abapgit_log=>ty_log_out,
+          lv_text    TYPE string.
+ 
+    lt_message = ii_log->get_messages( ).
+ 
+    LOOP AT lt_message REFERENCE INTO lr_message.
+      IF lr_message->obj_name IS NOT INITIAL AND lr_message->obj_type IS NOT INITIAL.
+        lv_text = |{ lr_message->type }: { lr_message->text } ({ lr_message->obj_type }/{ lr_message->obj_name })|.
+      ELSE.
+        lv_text = |{ lr_message->type }: { lr_message->text }|.
+      ENDIF.
+      WRITE: / lv_text.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/index.html b/src/ui/pages/index.html new file mode 100644 index 00000000000..d1d0408d728 --- /dev/null +++ b/src/ui/pages/index.html @@ -0,0 +1,611 @@ + + + + + + Code coverage report for src/ui/pages + + + + + + + + + +
+
+

All files src/ui/pages

+
+ +
+ 83.31% + Statements + 12920/15507 +
+ + +
+ 84% + Branches + 21/25 +
+ + +
+ 13.22% + Functions + 16/121 +
+ + +
+ 83.31% + Lines + 12920/15507 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_gui_page_addofflin.clas.abap +
+
95%266/280100%0/00%0/195%266/280
zcl_abapgit_gui_page_addonline.clas.abap +
+
95.85%324/338100%0/00%0/195.85%324/338
zcl_abapgit_gui_page_code_insp.clas.abap +
+
91.63%285/311100%0/00%0/291.63%285/311
zcl_abapgit_gui_page_codi_base.clas.abap +
+
50.29%170/338100%0/00%0/350.29%170/338
zcl_abapgit_gui_page_commit.clas.abap +
+
96.51%526/545100%0/00%0/196.51%526/545
zcl_abapgit_gui_page_data.clas.abap +
+
77.68%289/37225%1/40%0/477.68%289/372
zcl_abapgit_gui_page_data.clas.testclasses.abap +
+
100%72/72100%4/4100%4/4100%72/72
zcl_abapgit_gui_page_db.clas.abap +
+
97.76%569/582100%0/00%0/197.76%569/582
zcl_abapgit_gui_page_db_entry.clas.abap +
+
84.71%255/301100%0/00%0/484.71%255/301
zcl_abapgit_gui_page_debuginfo.clas.abap +
+
100%453/453100%0/0100%0/0100%453/453
zcl_abapgit_gui_page_diff.clas.abap +
+
70.57%981/1390100%0/00%0/1770.57%981/1390
zcl_abapgit_gui_page_ex_object.clas.abap +
+
87%154/177100%0/00%0/187%154/177
zcl_abapgit_gui_page_ex_pckage.clas.abap +
+
92.39%158/171100%0/00%0/192.39%158/171
zcl_abapgit_gui_page_merge.clas.abap +
+
92.18%224/243100%0/00%0/192.18%224/243
zcl_abapgit_gui_page_merge_res.clas.abap +
+
88.09%481/546100%0/00%0/388.09%481/546
zcl_abapgit_gui_page_merge_sel.clas.abap +
+
95.47%190/199100%0/00%0/195.47%190/199
zcl_abapgit_gui_page_patch.clas.abap +
+
55.88%380/68080%4/50%0/1555.88%380/680
zcl_abapgit_gui_page_patch.clas.testclasses.abap +
+
100%225/225100%12/12100%12/12100%225/225
zcl_abapgit_gui_page_repo_over.clas.abap +
+
71.99%761/1057100%0/00%0/1371.99%761/1057
zcl_abapgit_gui_page_repo_over.clas.locals_imp.abap +
+
100%36/36100%0/0100%0/0100%36/36
zcl_abapgit_gui_page_repo_view.clas.abap +
+
90.7%1230/1356100%0/00%0/490.7%1230/1356
zcl_abapgit_gui_page_run_bckg.clas.abap +
+
78%78/100100%0/00%0/178%78/100
zcl_abapgit_gui_page_runit.clas.abap +
+
100%313/313100%0/0100%0/0100%313/313
zcl_abapgit_gui_page_sett_bckg.clas.abap +
+
84.72%294/347100%0/00%0/184.72%294/347
zcl_abapgit_gui_page_sett_glob.clas.abap +
+
84.57%318/376100%0/00%0/284.57%318/376
zcl_abapgit_gui_page_sett_info.clas.abap +
+
57.92%347/599100%0/00%0/657.92%347/599
zcl_abapgit_gui_page_sett_locl.clas.abap +
+
80.9%449/555100%0/00%0/680.9%449/555
zcl_abapgit_gui_page_sett_pers.clas.abap +
+
91.68%375/409100%0/00%0/191.68%375/409
zcl_abapgit_gui_page_sett_remo.clas.abap +
+
75%840/1120100%0/00%0/1075%840/1120
zcl_abapgit_gui_page_sett_repo.clas.abap +
+
86.79%401/462100%0/00%0/186.79%401/462
zcl_abapgit_gui_page_stage.clas.abap +
+
94.93%844/889100%0/00%0/294.93%844/889
zcl_abapgit_gui_page_syntax.clas.abap +
+
88%110/125100%0/00%0/188%110/125
zcl_abapgit_gui_page_tags.clas.abap +
+
95.58%390/408100%0/00%0/195.58%390/408
zcl_abapgit_gui_page_tutorial.clas.abap +
+
100%132/132100%0/0100%0/0100%132/132
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_addofflin.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_addofflin.clas.abap.html new file mode 100644 index 00000000000..f6c8746a499 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_addofflin.clas.abap.html @@ -0,0 +1,925 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_addofflin.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_addofflin.clas.abap

+
+ +
+ 95% + Statements + 266/280 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 95% + Lines + 266/280 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +2811x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_addofflin DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        url                TYPE string VALUE 'url',
+        package            TYPE string VALUE 'package',
+        folder_logic       TYPE string VALUE 'folder_logic',
+        labels             TYPE string VALUE 'labels',
+        ignore_subpackages TYPE string VALUE 'ignore_subpackages',
+        main_lang_only     TYPE string VALUE 'main_lang_only',
+      END OF c_id .
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        go_back          TYPE string VALUE 'go-back',
+        choose_package   TYPE string VALUE 'choose-package',
+        choose_labels    TYPE string VALUE 'choose-labels',
+        create_package   TYPE string VALUE 'create-package',
+        add_offline_repo TYPE string VALUE 'add-repo-offline',
+      END OF c_event .
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form .
+ 
+    METHODS choose_labels
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN IMPLEMENTATION.
+ 
+ 
+  METHOD choose_labels.
+
+    DATA:
+      lv_old_labels TYPE string,
+      lv_new_labels TYPE string.
+
+    lv_old_labels = mo_form_data->get( c_id-labels ).
+
+    lv_new_labels = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_labels( lv_old_labels ).
+
+    mo_form_data->set(
+      iv_key = c_id-labels
+      iv_val = lv_new_labels ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_addofflin.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'New Offline Repository'
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = 'add-repo-offline-form'
+                iv_help_page = 'https://docs.abapgit.org/guide-offline-install.html' ).
+ 
+    ro_form->text(
+      iv_name        = c_id-url
+      iv_required    = abap_true
+      iv_label       = 'Repository Name'
+      iv_hint        = 'Unique name for repository'
+    )->text(
+      iv_name        = c_id-package
+      iv_side_action = c_event-choose_package
+      iv_required    = abap_true
+      iv_upper_case  = abap_true
+      iv_label       = 'Package'
+      iv_hint        = 'SAP package for repository (should be a dedicated one)'
+      iv_placeholder = 'Z... / $...'
+    )->radio(
+      iv_name        = c_id-folder_logic
+      iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_label       = 'Folder Logic'
+      iv_hint        = 'Define how package folders are named in repository'
+    )->option(
+      iv_label       = 'Prefix'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+    )->option(
+      iv_label       = 'Full'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-full
+    )->option(
+      iv_label       = 'Mixed'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+    )->text(
+      iv_name        = c_id-labels
+      iv_side_action = c_event-choose_labels
+      iv_label       = |Labels (comma-separated, allowed chars: "{ zcl_abapgit_repo_labels=>c_allowed_chars }")|
+      iv_hint        = 'Comma-separated labels for grouping and repo organization (optional)'
+    )->checkbox(
+      iv_name        = c_id-ignore_subpackages
+      iv_label       = 'Ignore Subpackages'
+      iv_hint        = 'Synchronize root package only'
+    )->checkbox(
+      iv_name        = c_id-main_lang_only
+      iv_label       = 'Serialize Main Language Only'
+      iv_hint        = 'Ignore translations, serialize just main language'
+    )->command(
+      iv_label       = 'Create Offline Repo'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-add_offline_repo
+    )->command(
+      iv_label       = 'Create Package'
+      iv_action      = c_event-create_package
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = c_event-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA lx_err TYPE REF TO zcx_abapgit_exception.
+ 
+    ro_validation_log = mo_form_util->validate( io_form_data ).
+ 
+    IF io_form_data->get( c_id-package ) IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_repo_srv=>get_instance( )->validate_package(
+            iv_package    = |{ io_form_data->get( c_id-package ) }|
+            iv_ign_subpkg = |{ io_form_data->get( c_id-ignore_subpackages ) }| ).
+        CATCH zcx_abapgit_exception INTO lx_err.
+          ro_validation_log->set(
+            iv_key = c_id-package
+            iv_val = lx_err->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+        AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-full
+        AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+      ro_validation_log->set(
+        iv_key = c_id-folder_logic
+        iv_val = |Invalid folder logic { io_form_data->get( c_id-folder_logic ) }| ).
+    ENDIF.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate( io_form_data->get( c_id-labels ) ).
+      CATCH zcx_abapgit_exception INTO lx_err.
+        ro_validation_log->set(
+          iv_key = c_id-labels
+          iv_val = lx_err->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA: ls_repo_params      TYPE zif_abapgit_services_repo=>ty_repo_params,
+          lo_new_offline_repo TYPE REF TO zcl_abapgit_repo_offline.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-create_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_services_basis=>create_package(
+            iv_prefill_package = |{ mo_form_data->get( c_id-package ) }| ) ).
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          mo_validation_log = validate_form( mo_form_data ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+ 
+      WHEN c_event-choose_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( 'TDEVC-DEVCLASS' ) ).
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          mo_validation_log = validate_form( mo_form_data ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+ 
+      WHEN c_event-choose_labels.
+ 
+        choose_labels( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-add_offline_repo.
+ 
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          mo_form_data->to_abap( CHANGING cs_container = ls_repo_params ).
+          lo_new_offline_repo = zcl_abapgit_services_repo=>new_offline( ls_repo_params ).
+          rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lo_new_offline_repo->get_key( ) ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. " Display errors
+        ENDIF.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="form-container">' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_addonline.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_addonline.clas.abap.html new file mode 100644 index 00000000000..359e25c54dc --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_addonline.clas.abap.html @@ -0,0 +1,1099 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_addonline.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_addonline.clas.abap

+
+ +
+ 95.85% + Statements + 324/338 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 95.85% + Lines + 324/338 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +3391x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_addonline DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        url                TYPE string VALUE 'url',
+        package            TYPE string VALUE 'package',
+        branch_name        TYPE string VALUE 'branch_name',
+        display_name       TYPE string VALUE 'display_name',
+        labels             TYPE string VALUE 'labels',
+        folder_logic       TYPE string VALUE 'folder_logic',
+        ignore_subpackages TYPE string VALUE 'ignore_subpackages',
+        main_lang_only     TYPE string VALUE 'main_lang_only',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        go_back         TYPE string VALUE 'go-back',
+        choose_package  TYPE string VALUE 'choose-package',
+        create_package  TYPE string VALUE 'create-package',
+        choose_branch   TYPE string VALUE 'choose-branch',
+        choose_labels   TYPE string VALUE 'choose-labels',
+        add_online_repo TYPE string VALUE 'add-repo-online',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+ 
+    METHODS validate_form
+      IMPORTING
+        io_form_data             TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+ 
+    METHODS choose_labels
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_addonline IMPLEMENTATION.
+ 
+ 
+  METHOD choose_labels.
+
+    DATA:
+      lv_old_labels TYPE string,
+      lv_new_labels TYPE string.
+
+    lv_old_labels = mo_form_data->get( c_id-labels ).
+
+    lv_new_labels = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_labels( lv_old_labels ).
+
+    mo_form_data->set(
+      iv_key = c_id-labels
+      iv_val = lv_new_labels ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_addonline.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'New Online Repository'
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = 'add-repo-online-form'
+                iv_help_page = 'https://docs.abapgit.org/guide-online-install.html' ).
+ 
+    ro_form->text(
+      iv_name        = c_id-url
+      iv_required    = abap_true
+      iv_condense    = abap_true
+      iv_label       = 'Git Repository URL'
+      iv_hint        = 'HTTPS address of the repository'
+      iv_placeholder = 'https://github.com/...git'
+    )->text(
+      iv_name        = c_id-package
+      iv_side_action = c_event-choose_package
+      iv_required    = abap_true
+      iv_upper_case  = abap_true
+      iv_label       = 'Package'
+      iv_hint        = 'SAP package for repository (should be a dedicated one)'
+      iv_placeholder = 'Z... / $...'
+    )->text(
+      iv_name        = c_id-branch_name
+      iv_side_action = c_event-choose_branch
+      iv_label       = 'Branch'
+      iv_hint        = 'Switch to a specific branch (default: autodetect)'
+      iv_placeholder = 'Autodetect default branch'
+    )->radio(
+      iv_name        = c_id-folder_logic
+      iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_label       = 'Folder Logic'
+      iv_hint        = 'Define how package folders are named in repository'
+    )->option(
+      iv_label       = 'Prefix'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+    )->option(
+      iv_label       = 'Full'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-full
+    )->option(
+      iv_label       = 'Mixed'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+    )->text(
+      iv_name        = c_id-display_name
+      iv_label       = 'Display Name'
+      iv_hint        = 'Name to show instead of original repository name (optional)'
+    )->text(
+      iv_name        = c_id-labels
+      iv_side_action = c_event-choose_labels
+      iv_label       = |Labels (comma-separated, allowed chars: "{ zcl_abapgit_repo_labels=>c_allowed_chars }")|
+      iv_hint        = 'Comma-separated labels for grouping and repo organization (optional)'
+    )->checkbox(
+      iv_name        = c_id-ignore_subpackages
+      iv_label       = 'Ignore Subpackages'
+      iv_hint        = 'Synchronize root package only'
+    )->checkbox(
+      iv_name        = c_id-main_lang_only
+      iv_label       = 'Serialize Main Language Only'
+      iv_hint        = 'Ignore translations, serialize just main language'
+    )->command(
+      iv_label       = 'Create Online Repo'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-add_online_repo
+    )->command(
+      iv_label       = 'Create Package'
+      iv_action      = c_event-create_package
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = c_event-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lv_url TYPE string,
+      lo_url TYPE REF TO zcl_abapgit_git_url,
+      lx_err TYPE REF TO zcx_abapgit_exception.
+ 
+    ro_validation_log = mo_form_util->validate( io_form_data ).
+ 
+    lv_url = io_form_data->get( c_id-url ).
+    IF lv_url IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_repo_srv=>get_instance( )->validate_url( lv_url ).
+ 
+          " Provider-specific URL check
+          CREATE OBJECT lo_url.
+          lo_url->validate_url( lv_url ).
+        CATCH zcx_abapgit_exception INTO lx_err.
+          ro_validation_log->set(
+            iv_key = c_id-url
+            iv_val = lx_err->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF io_form_data->get( c_id-package ) IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_repo_srv=>get_instance( )->validate_package(
+            iv_package    = |{ io_form_data->get( c_id-package ) }|
+            iv_ign_subpkg = |{ io_form_data->get( c_id-ignore_subpackages ) }| ).
+        CATCH zcx_abapgit_exception INTO lx_err.
+          ro_validation_log->set(
+            iv_key = c_id-package
+            iv_val = lx_err->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+        AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-full
+        AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+      ro_validation_log->set(
+        iv_key = c_id-folder_logic
+        iv_val = |Invalid folder logic { io_form_data->get( c_id-folder_logic ) }| ).
+    ENDIF.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate( io_form_data->get( c_id-labels ) ).
+      CATCH zcx_abapgit_exception INTO lx_err.
+        ro_validation_log->set(
+          iv_key = c_id-labels
+          iv_val = lx_err->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA: ls_repo_params     TYPE zif_abapgit_services_repo=>ty_repo_params,
+          lo_new_online_repo TYPE REF TO zcl_abapgit_repo_online.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-create_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_services_basis=>create_package(
+            iv_prefill_package = |{ mo_form_data->get( c_id-package ) }| ) ).
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          mo_validation_log = validate_form( mo_form_data ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+ 
+      WHEN c_event-choose_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( 'TDEVC-DEVCLASS' ) ).
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          mo_validation_log = validate_form( mo_form_data ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+ 
+      WHEN c_event-choose_branch.
+ 
+        mo_validation_log = validate_form( mo_form_data ).
+        IF mo_validation_log->has( c_id-url ) = abap_true.
+          mo_validation_log->set(
+            iv_key = c_id-branch_name
+            iv_val = 'Check URL issues' ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. " Display errors
+          RETURN.
+        ENDIF.
+        mo_form_data->set(
+          iv_key = c_id-branch_name
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->branch_list_popup( mo_form_data->get( c_id-url ) )-name ).
+ 
+        IF mo_form_data->get( c_id-branch_name ) IS INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ELSE.
+          mo_form_data->set(
+            iv_key = c_id-branch_name
+            iv_val = replace( " strip technical
+              val = mo_form_data->get( c_id-branch_name )
+              sub = zif_abapgit_git_definitions=>c_git_branch-heads_prefix
+              with = '' ) ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+      WHEN c_event-choose_labels.
+ 
+        choose_labels( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-add_online_repo.
+ 
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          mo_form_data->to_abap( CHANGING cs_container = ls_repo_params ).
+          lo_new_online_repo = zcl_abapgit_services_repo=>new_online( ls_repo_params ).
+          rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lo_new_online_repo->get_key( ) ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. " Display errors
+        ENDIF.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="form-container">' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( '</div>' ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_code_insp.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_code_insp.clas.abap.html new file mode 100644 index 00000000000..0f61ce7610a --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_code_insp.clas.abap.html @@ -0,0 +1,1018 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_code_insp.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_code_insp.clas.abap

+
+ +
+ 91.63% + Statements + 285/311 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 91.63% + Lines + 285/311 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +3121x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_code_insp DEFINITION PUBLIC FINAL CREATE PUBLIC
+    INHERITING FROM zcl_abapgit_gui_page_codi_base.
+ 
+  PUBLIC SECTION.
+    INTERFACES: zif_abapgit_gui_hotkeys.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          io_repo          TYPE REF TO zcl_abapgit_repo
+          io_stage         TYPE REF TO zcl_abapgit_stage OPTIONAL
+          iv_check_variant TYPE sci_chkv OPTIONAL
+        RAISING
+          zcx_abapgit_exception,
+ 
+      is_nothing_to_display
+        RETURNING
+          VALUE(rv_yes) TYPE abap_bool,
+ 
+      zif_abapgit_gui_event_handler~on_event
+        REDEFINITION,
+ 
+      zif_abapgit_gui_renderable~render
+        REDEFINITION.
+ 
+  PROTECTED SECTION.
+ 
+    METHODS:
+      render_content   REDEFINITION.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_stage         TYPE REF TO zcl_abapgit_stage,
+      mv_check_variant TYPE sci_chkv.
+ 
+    METHODS:
+      build_menu
+        RETURNING
+          VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar
+        RAISING
+          zcx_abapgit_exception,
+ 
+      run_code_inspector
+        RAISING
+          zcx_abapgit_exception,
+ 
+      has_inspection_errors
+        RETURNING
+          VALUE(rv_has_inspection_errors) TYPE abap_bool,
+ 
+      is_stage_allowed
+        RETURNING
+          VALUE(rv_is_stage_allowed) TYPE abap_bool,
+ 
+      ask_user_for_check_variant
+        RETURNING
+          VALUE(rv_check_variant) TYPE sci_chkv
+        RAISING
+          zcx_abapgit_exception,
+ 
+      determine_check_variant
+        RAISING
+          zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_code_insp IMPLEMENTATION.
+ 
+ 
+  METHOD ask_user_for_check_variant.
+ 
+    rv_check_variant = zcl_abapgit_ui_factory=>get_popups( )->choose_code_insp_check_variant( ).
+ 
+    IF rv_check_variant IS INITIAL.
+      zcx_abapgit_exception=>raise( |Please select a check variant.| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_menu.
+ 
+    DATA: lv_opt TYPE c LENGTH 1.
+ 
+    ro_menu = build_base_menu( ).
+ 
+    IF is_stage_allowed( ) = abap_false.
+      lv_opt = zif_abapgit_html=>c_html_opt-crossout.
+    ENDIF.
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    IF mo_stage IS BOUND.
+ 
+      " Staging info already available, we can directly
+      " offer to commit
+ 
+      ro_menu->add( iv_txt = 'Commit'
+                    iv_act = c_actions-commit
+                    iv_cur = abap_false
+                    iv_opt = lv_opt ).
+ 
+    ELSE.
+ 
+      ro_menu->add( iv_txt = 'Stage'
+                    iv_act = c_actions-stage
+                    iv_cur = abap_false
+                    iv_opt = lv_opt ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    mo_repo = io_repo.
+    mo_stage = io_stage.
+    mv_check_variant = iv_check_variant.
+    ms_control-page_title = 'Code Inspector'.
+    determine_check_variant( ).
+    run_code_inspector( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD determine_check_variant.
+
+    IF mv_check_variant IS NOT INITIAL.
+      RETURN.
+    ENDIF.
+
+    mv_check_variant = mo_repo->get_local_settings( )-code_inspector_check_variant.
+
+    IF mv_check_variant IS INITIAL.
+      mv_check_variant = ask_user_for_check_variant( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD has_inspection_errors.
+ 
+    READ TABLE mt_result TRANSPORTING NO FIELDS
+                         WITH KEY kind = 'E'.
+    rv_has_inspection_errors = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_nothing_to_display.
+    rv_yes = boolc( lines( mt_result ) = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_stage_allowed.
+ 
+    rv_is_stage_allowed = boolc( NOT ( mo_repo->get_local_settings( )-block_commit = abap_true
+                                           AND has_inspection_errors( ) = abap_true ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( `<div class="repo">` ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( io_repo        = mo_repo
+                                                              iv_show_commit = abap_false ) ).
+    ri_html->add( `</div>` ).
+ 
+    IF mv_check_variant IS INITIAL.
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_error( iv_error = 'No check variant supplied.' ) ).
+      RETURN.
+    ENDIF.
+ 
+    register_handlers( ).
+ 
+    ri_html->add( render_variant(
+      iv_variant = mv_check_variant
+      iv_summary = mv_summary ) ).
+ 
+    IF lines( mt_result ) = 0.
+      ri_html->add( '<div class="dummydiv success">' ).
+      ri_html->add( ri_html->icon( 'check' ) ).
+      ri_html->add( 'No code inspector findings' ).
+      ri_html->add( '</div>' ).
+    ELSE.
+      render_result(
+        ii_html   = ri_html
+        it_result = mt_result ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run_code_inspector.
+
+    DATA: li_code_inspector TYPE REF TO zif_abapgit_code_inspector.
+
+    li_code_inspector = zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( ) ).
+
+    mt_result = li_code_inspector->run(
+      iv_variant = |{ mv_check_variant }|
+      iv_save    = abap_true ).
+
+    mv_summary = li_code_inspector->get_summary( ).
+
+    DELETE mt_result WHERE kind = 'N'.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA lo_repo_online TYPE REF TO zcl_abapgit_repo_online.
+    DATA lv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-stage.
+ 
+        lo_repo_online ?= mo_repo.
+ 
+        IF is_stage_allowed( ) = abap_true.
+          " we need to refresh as the source might have changed
+          lo_repo_online->refresh( ).
+ 
+          READ TABLE mt_result TRANSPORTING NO FIELDS WITH KEY kind = 'E'.
+          IF sy-subrc = 0.
+            lv_sci_result = zif_abapgit_definitions=>c_sci_result-failed.
+          ELSE.
+            READ TABLE mt_result TRANSPORTING NO FIELDS WITH KEY kind = 'W'.
+            IF sy-subrc = 0.
+              lv_sci_result = zif_abapgit_definitions=>c_sci_result-warning.
+            ELSE.
+              lv_sci_result = zif_abapgit_definitions=>c_sci_result-passed.
+            ENDIF.
+          ENDIF.
+ 
+          CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_stage
+            EXPORTING
+              io_repo       = lo_repo_online
+              iv_sci_result = lv_sci_result.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+        ELSE.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+        ENDIF.
+ 
+      WHEN c_actions-commit.
+ 
+        lo_repo_online ?= mo_repo.
+ 
+        IF is_stage_allowed( ) = abap_true.
+ 
+          rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+            io_repo  = lo_repo_online
+            io_stage = mo_stage ).
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+        ELSE.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+        ENDIF.
+ 
+      WHEN c_actions-rerun.
+ 
+        run_code_inspector( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN OTHERS.
+        rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = 'Code inspector'.
+ 
+    ls_hotkey_action-description = |Stage|.
+    ls_hotkey_action-action = c_actions-stage.
+    ls_hotkey_action-hotkey = |s|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Re-Run|.
+    ls_hotkey_action-action = c_actions-rerun.
+    ls_hotkey_action-hotkey = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    ms_control-page_menu = build_menu( ).
+    ri_html = super->zif_abapgit_gui_renderable~render( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_codi_base.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_codi_base.clas.abap.html new file mode 100644 index 00000000000..e5f2ce77c31 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_codi_base.clas.abap.html @@ -0,0 +1,1099 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_codi_base.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_codi_base.clas.abap

+
+ +
+ 50.29% + Statements + 170/338 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 50.29% + Lines + 170/338 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +3391x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_codi_base DEFINITION PUBLIC ABSTRACT INHERITING FROM zcl_abapgit_gui_page.
+  PUBLIC SECTION.
+    METHODS:
+      zif_abapgit_gui_event_handler~on_event
+        REDEFINITION.
+ 
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_actions,
+        rerun  TYPE string VALUE 'rerun' ##NO_TEXT,
+        sort_1 TYPE string VALUE 'sort_1'  ##NO_TEXT,
+        sort_2 TYPE string VALUE 'sort_2'  ##NO_TEXT,
+        sort_3 TYPE string VALUE 'sort_3'  ##NO_TEXT,
+        stage  TYPE string VALUE 'stage' ##NO_TEXT,
+        commit TYPE string VALUE 'commit' ##NO_TEXT,
+      END OF c_actions .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mt_result TYPE zif_abapgit_code_inspector=>ty_results .
+    DATA mv_summary TYPE string.
+ 
+    METHODS render_variant
+      IMPORTING
+        !iv_variant    TYPE sci_chkv
+        !iv_summary    TYPE string
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_result
+      IMPORTING
+        !ii_html   TYPE REF TO zif_abapgit_html
+        !it_result TYPE zif_abapgit_code_inspector=>ty_results .
+    METHODS render_result_line
+      IMPORTING
+        !ii_html   TYPE REF TO zif_abapgit_html
+        !is_result TYPE zif_abapgit_code_inspector=>ty_result .
+    METHODS build_nav_link
+      IMPORTING
+        !is_result     TYPE zif_abapgit_code_inspector=>ty_result
+      RETURNING
+        VALUE(rv_link) TYPE string .
+    METHODS jump
+      IMPORTING
+        !is_item        TYPE zif_abapgit_definitions=>ty_item
+        !is_sub_item    TYPE zif_abapgit_definitions=>ty_item
+        !iv_line_number TYPE i
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_base_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+  PRIVATE SECTION.
+    CONSTANTS c_object_separator TYPE c LENGTH 1 VALUE '|'.
+    CONSTANTS c_ci_sig TYPE string VALUE 'cinav:'.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_codi_base IMPLEMENTATION.
+ 
+ 
+  METHOD build_base_menu.
+ 
+    DATA:
+      lo_sort_menu TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CREATE OBJECT lo_sort_menu.
+ 
+    lo_sort_menu->add(
+      iv_txt = 'By Object, Check, Sub-object'
+      iv_act = c_actions-sort_1
+    )->add(
+      iv_txt = 'By Object, Sub-object, Line'
+      iv_act = c_actions-sort_2
+    )->add(
+      iv_txt = 'By Check, Object, Sub-object'
+      iv_act = c_actions-sort_3 ).
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add( iv_txt = 'Sort'
+                  io_sub = lo_sort_menu ).
+ 
+    ro_menu->add( iv_txt = 'Re-Run'
+                  iv_act = c_actions-rerun
+                  iv_cur = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_nav_link.
+ 
+    rv_link = |{ c_ci_sig }| &&
+      |{ is_result-objtype }{ is_result-objname }| &&
+      |{ c_object_separator }{ is_result-sobjtype }{ is_result-sobjname }| &&
+      |{ c_object_separator }{ is_result-line }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump.
+
+    DATA: lo_test             TYPE REF TO cl_ci_test_root,
+          ls_info             TYPE scir_rest,
+          lo_result           TYPE REF TO cl_ci_result_root,
+          lv_adt_jump_enabled TYPE abap_bool,
+          lv_line_number      TYPE i,
+          ls_item             TYPE zif_abapgit_definitions=>ty_item,
+          ls_sub_item         TYPE zif_abapgit_definitions=>ty_item.
+
+    FIELD-SYMBOLS: <ls_result> LIKE LINE OF mt_result.
+
+
+    IF is_sub_item IS NOT INITIAL.
+      READ TABLE mt_result WITH KEY objtype  = is_item-obj_type
+                                    objname  = is_item-obj_name
+                                    sobjtype = is_sub_item-obj_type
+                                    sobjname = is_sub_item-obj_name
+                                    line     = iv_line_number
+                           ASSIGNING <ls_result>.
+    ELSE.
+      READ TABLE mt_result WITH KEY objtype = is_item-obj_type
+                                    objname = is_item-obj_name
+                                    line    = iv_line_number
+                           ASSIGNING <ls_result>.
+    ENDIF.
+    ASSERT <ls_result> IS ASSIGNED.
+    ls_item-obj_name = <ls_result>-objname.
+    ls_item-obj_type = <ls_result>-objtype.
+
+    ls_sub_item-obj_name = <ls_result>-sobjname.
+    ls_sub_item-obj_type = <ls_result>-sobjtype.
+
+    " see SCI_LCL_DYNP_530 / HANDLE_DOUBLE_CLICK
+
+    lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
+
+    TRY.
+        IF lv_adt_jump_enabled = abap_true.
+
+          lv_line_number = <ls_result>-line.
+
+          zcl_abapgit_objects=>jump(
+            is_item        = ls_item
+            is_sub_item    = ls_sub_item
+            iv_line_number = lv_line_number ).
+          RETURN.
+
+        ENDIF.
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+
+    TRY.
+        CALL METHOD ('CL_CI_TESTS')=>('GET_TEST_REF')
+          EXPORTING
+            p_test   = <ls_result>-test
+          RECEIVING
+            p_result = lo_test.
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( |Jump to object not supported in your NW release| ).
+    ENDTRY.
+
+    lo_result = lo_test->get_result_node( <ls_result>-kind ).
+
+    MOVE-CORRESPONDING <ls_result> TO ls_info.
+
+    lo_result->set_info( ls_info ).
+    lo_result->if_ci_test~navigate( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_result.
+
+    CONSTANTS: lc_limit TYPE i VALUE 500.
+    FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_result.
+
+    ii_html->add( '<div class="ci-result">' ).
+
+    LOOP AT it_result ASSIGNING <ls_result> TO lc_limit.
+      render_result_line(
+        ii_html = ii_html
+        is_result = <ls_result> ).
+    ENDLOOP.
+
+    ii_html->add( '</div>' ).
+
+    IF lines( it_result ) > lc_limit.
+      ii_html->add( '<div class="dummydiv warning">' ).
+      ii_html->add( ii_html->icon( 'exclamation-triangle' ) ).
+      ii_html->add( |Only first { lc_limit } findings shown in list!| ).
+      ii_html->add( '</div>' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_result_line.
+
+    DATA: lv_class   TYPE string,
+          lv_obj_txt TYPE string,
+          lv_msg     TYPE string,
+          lv_line    TYPE i,
+          ls_mtdkey  TYPE seocpdkey.
+
+    CASE is_result-kind.
+      WHEN 'E'.
+        lv_class = 'ci-error'.
+      WHEN 'W'.
+        lv_class = 'ci-warning'.
+      WHEN OTHERS.
+        lv_class = 'ci-info'.
+    ENDCASE.
+
+    lv_msg = escape( val = is_result-text
+                     format = cl_abap_format=>e_html_attr ).
+
+    IF is_result-sobjname IS INITIAL OR
+       ( is_result-sobjname = is_result-objname AND
+         is_result-sobjtype = is_result-objtype ).
+      lv_obj_txt = |{ is_result-objtype } { is_result-objname }|.
+    ELSEIF is_result-objtype = 'CLAS' OR
+         ( is_result-objtype = 'PROG' AND NOT is_result-sobjname+30(*) IS INITIAL ).
+      TRY.
+          CASE is_result-sobjname+30(*).
+            WHEN 'CCDEF'.
+              lv_obj_txt = |CLAS { is_result-objname } : Local Definitions|.
+            WHEN 'CCIMP'.
+              lv_obj_txt = |CLAS { is_result-objname } : Local Implementations|.
+            WHEN 'CCMAC'.
+              lv_obj_txt = |CLAS { is_result-objname } : Macros|.
+            WHEN 'CCAU'.
+              lv_obj_txt = |CLAS { is_result-objname } : Test Classes|.
+            WHEN 'CU'.
+              lv_obj_txt = |CLAS { is_result-objname } : Public Section|.
+            WHEN 'CO'.
+              lv_obj_txt = |CLAS { is_result-objname } : Protected Section|.
+            WHEN 'CI'.
+              lv_obj_txt = |CLAS { is_result-objname } : Private Section|.
+            WHEN OTHERS.
+              cl_oo_classname_service=>get_method_by_include(
+                EXPORTING
+                  incname             = is_result-sobjname
+                RECEIVING
+                  mtdkey              = ls_mtdkey
+                EXCEPTIONS
+                  class_not_existing  = 1
+                  method_not_existing = 2
+                  OTHERS              = 3 ).
+              IF sy-subrc = 0.
+                lv_obj_txt = |CLAS { ls_mtdkey-clsname }->{ ls_mtdkey-cpdname }|.
+              ELSE.
+                lv_obj_txt = |{ is_result-objtype } { is_result-sobjname }|.
+              ENDIF.
+
+          ENDCASE.
+        CATCH cx_root.
+          lv_obj_txt = ''. "use default below
+      ENDTRY.
+    ENDIF.
+    IF lv_obj_txt IS INITIAL.
+      lv_obj_txt = |{ is_result-objtype } { is_result-objname } &gt; { is_result-sobjtype } { is_result-sobjname }|.
+    ENDIF.
+    lv_line = is_result-line. " convert from numc to integer
+    lv_obj_txt = |{ lv_obj_txt } [ @{ lv_line } ]|.
+
+    ii_html->add( |<li class="{ lv_class }">| ).
+    ii_html->add_a(
+      iv_txt = lv_obj_txt
+      iv_act = build_nav_link( is_result )
+      iv_typ = zif_abapgit_html=>c_action_type-sapevent ).
+    ii_html->add( |<span>{ lv_msg }</span>| ).
+    ii_html->add( '</li>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_variant.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="ci-head">' ).
+    ri_html->add( |Code inspector check variant <span class="ci-variant">{ iv_variant }</span>|
+               && | completed ({ iv_summary })| ).
+    ri_html->add( `</div>` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    DATA: ls_item          TYPE zif_abapgit_definitions=>ty_item,
+          ls_sub_item      TYPE zif_abapgit_definitions=>ty_item,
+          lv_temp          TYPE string,
+          lv_main_object   TYPE string,
+          lv_sub_object    TYPE string,
+          lv_line_number_s TYPE string,
+          lv_line_number   TYPE i.
+ 
+    lv_temp = replace( val   = ii_event->mv_action
+                       regex = |^{ c_ci_sig }|
+                       with  = `` ).
+ 
+    IF lv_temp <> ii_event->mv_action. " CI navigation request detected
+ 
+      SPLIT lv_temp AT c_object_separator INTO lv_main_object lv_sub_object lv_line_number_s.
+      ls_item-obj_type = to_upper( lv_main_object(4) ).
+      ls_item-obj_name = to_upper( lv_main_object+4(*) ).
+ 
+      IF lv_sub_object IS NOT INITIAL.
+        ls_sub_item-obj_type = to_upper( lv_sub_object(4) ).
+        ls_sub_item-obj_name = to_upper( lv_sub_object+4(*) ).
+      ENDIF.
+ 
+      lv_line_number = lv_line_number_s.
+ 
+      jump( is_item        = ls_item
+            is_sub_item    = ls_sub_item
+            iv_line_number = lv_line_number ).
+ 
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+    ENDIF.
+ 
+    CASE ii_event->mv_action.
+ 
+      WHEN c_actions-sort_1.
+        SORT mt_result BY objtype objname test code sobjtype sobjname line col.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_actions-sort_2.
+        SORT mt_result BY objtype objname sobjtype sobjname line col test code.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_actions-sort_3.
+        SORT mt_result BY test code objtype objname sobjtype sobjname line col.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap.html new file mode 100644 index 00000000000..8fd7d54fb62 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap.html @@ -0,0 +1,1720 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_commit.clas.abap

+
+ +
+ 96.51% + Statements + 526/545 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 96.51% + Lines + 526/545 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +5461x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_commit DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo_online
+        !io_stage      TYPE REF TO zcl_abapgit_stage
+        !iv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result DEFAULT zif_abapgit_definitions=>c_sci_result-no_run
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo_online
+        !io_stage      TYPE REF TO zcl_abapgit_stage
+        !iv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        committer       TYPE string VALUE 'committer',
+        committer_name  TYPE string VALUE 'committer_name',
+        committer_email TYPE string VALUE 'committer_email',
+        message         TYPE string VALUE 'message',
+        comment         TYPE string VALUE 'comment',
+        body            TYPE string VALUE 'body',
+        author          TYPE string VALUE 'author',
+        author_name     TYPE string VALUE 'author_name',
+        author_email    TYPE string VALUE 'author_email',
+        new_branch_name TYPE string VALUE 'new_branch_name',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        commit TYPE string VALUE 'commit',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings.
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online.
+    DATA mo_stage TYPE REF TO zcl_abapgit_stage.
+    DATA mt_stage TYPE zif_abapgit_definitions=>ty_stage_tt.
+    DATA ms_commit TYPE zif_abapgit_services_git=>ty_commit_fields.
+    DATA mv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result.
+ 
+    METHODS render_stage_summary
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+    METHODS render_stage_details
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+    METHODS get_defaults
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_committer_name
+      RETURNING
+        VALUE(rv_user) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_committer_email
+      RETURNING
+        VALUE(rv_email) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_comment_default
+      RETURNING
+        VALUE(rv_text) TYPE string.
+    METHODS get_comment_object
+      IMPORTING
+        !it_stage      TYPE zif_abapgit_definitions=>ty_stage_tt
+      RETURNING
+        VALUE(rv_text) TYPE string.
+    METHODS get_comment_file
+      IMPORTING
+        !it_stage      TYPE zif_abapgit_definitions=>ty_stage_tt
+      RETURNING
+        VALUE(rv_text) TYPE string.
+    METHODS branch_name_to_internal
+      IMPORTING
+        iv_branch_name            TYPE string
+      RETURNING
+        VALUE(rv_new_branch_name) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION.
+ 
+ 
+  METHOD branch_name_to_internal.
+    rv_new_branch_name = zcl_abapgit_git_branch_list=>complete_heads_branch_name(
+      zcl_abapgit_git_branch_list=>normalize_branch_name( iv_branch_name ) ).
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    mo_repo       = io_repo.
+    mo_stage      = io_stage.
+    mt_stage      = mo_stage->get_all( ).
+    mv_sci_result = iv_sci_result.
+ 
+    " Get settings from DB
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_commit.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo       = io_repo
+        io_stage      = io_stage
+        iv_sci_result = iv_sci_result.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Commit'
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_comment_default.
+ 
+    rv_text = mo_settings->get_commitmsg_comment_default( ).
+ 
+    IF rv_text IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    REPLACE '$FILE'   IN rv_text WITH get_comment_file( mt_stage ).
+    REPLACE '$OBJECT' IN rv_text WITH get_comment_object( mt_stage ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_comment_file.
+ 
+    DATA lv_count TYPE i.
+ 
+    FIELD-SYMBOLS <ls_stage> LIKE LINE OF it_stage.
+ 
+    lv_count = lines( it_stage ).
+ 
+    IF lv_count = 1.
+      " Just one file so we use the file name
+      READ TABLE it_stage ASSIGNING <ls_stage> INDEX 1.
+      ASSERT sy-subrc = 0.
+ 
+      rv_text = <ls_stage>-file-filename.
+    ELSE.
+      " For multiple file we use the count instead
+      rv_text = |{ lv_count } files|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_comment_object.
+ 
+    DATA:
+      lv_count TYPE i,
+      ls_item  TYPE zif_abapgit_definitions=>ty_item,
+      lt_items TYPE zif_abapgit_definitions=>ty_items_tt.
+ 
+    FIELD-SYMBOLS <ls_stage> LIKE LINE OF it_stage.
+ 
+    " Get objects
+    LOOP AT it_stage ASSIGNING <ls_stage>.
+      CLEAR ls_item.
+      ls_item-obj_type = <ls_stage>-status-obj_type.
+      ls_item-obj_name = <ls_stage>-status-obj_name.
+      COLLECT ls_item INTO lt_items.
+    ENDLOOP.
+ 
+    lv_count = lines( lt_items ).
+ 
+    IF lv_count = 1.
+      " Just one object so we use the object name
+      READ TABLE lt_items INTO ls_item INDEX 1.
+      ASSERT sy-subrc = 0.
+ 
+      CONCATENATE ls_item-obj_type ls_item-obj_name INTO rv_text SEPARATED BY space.
+    ELSE.
+      " For multiple objects we use the count instead
+      rv_text = |{ lv_count } objects|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_committer_email.
+ 
+    DATA li_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    rv_email = li_user->get_repo_git_user_email( mo_repo->get_url( ) ).
+    IF rv_email IS INITIAL.
+      rv_email = li_user->get_default_git_user_email( ).
+    ENDIF.
+    IF rv_email IS INITIAL.
+      " get default from user record
+      rv_email = zcl_abapgit_user_record=>get_instance( sy-uname )->get_email( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_committer_name.
+ 
+    DATA li_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    rv_user  = li_user->get_repo_git_user_name( mo_repo->get_url( ) ).
+    IF rv_user IS INITIAL.
+      rv_user  = li_user->get_default_git_user_name( ).
+    ENDIF.
+    IF rv_user IS INITIAL.
+      " get default from user record
+      rv_user = zcl_abapgit_user_record=>get_instance( sy-uname )->get_name( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_defaults.
+
+    ms_commit-committer_name  = get_committer_name( ).
+    ms_commit-committer_email = get_committer_email( ).
+    ms_commit-comment         = get_comment_default( ).
+
+    " Committer
+    mo_form_data->set(
+      iv_key = c_id-committer_name
+      iv_val = ms_commit-committer_name ).
+    mo_form_data->set(
+      iv_key = c_id-committer_email
+      iv_val = ms_commit-committer_email ).
+
+    " Message
+    mo_form_data->set(
+      iv_key = c_id-comment
+      iv_val = ms_commit-comment ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA: lv_commitmsg_comment_length TYPE i.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = 'commit-form'
+      iv_help_page = 'https://docs.abapgit.org/guide-stage-commit.html' ).
+ 
+    lv_commitmsg_comment_length =  mo_settings->get_commitmsg_comment_length( ).
+ 
+    ro_form->text(
+      iv_name        = c_id-comment
+      iv_label       = 'Comment'
+      iv_required    = abap_true
+      iv_max         = lv_commitmsg_comment_length
+      iv_placeholder = |Add a mandatory comment with max { lv_commitmsg_comment_length } characters|
+    )->textarea(
+      iv_name        = c_id-body
+      iv_label       = 'Body'
+      iv_rows        = 6
+      iv_cols        = mo_settings->get_commitmsg_body_size( )
+      iv_placeholder = 'Add an optional description...'
+    )->text(
+      iv_name        = c_id-committer_name
+      iv_label       = 'Committer Name'
+      iv_required    = abap_true
+    )->text(
+      iv_name        = c_id-committer_email
+      iv_label       = 'Committer Email'
+      iv_required    = abap_true ).
+ 
+    IF mo_settings->get_commitmsg_hide_author( ) IS INITIAL.
+      ro_form->text(
+        iv_name        = c_id-author_name
+        iv_label       = 'Author Name'
+        iv_placeholder = 'Optionally, specify an author (same as committer by default)'
+      )->text(
+        iv_name        = c_id-author_email
+        iv_label       = 'Author Email' ).
+    ENDIF.
+ 
+    ro_form->text(
+      iv_name        = c_id-new_branch_name
+      iv_label       = 'New Branch Name'
+      iv_placeholder = 'Optionally, enter a new branch name for this commit'
+      iv_condense    = abap_true ).
+ 
+ 
+    ro_form->command(
+      iv_label       = 'Commit'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-commit
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_stage_details.
+ 
+    FIELD-SYMBOLS <ls_stage> LIKE LINE OF mt_stage.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<table class="stage_tab">' ).
+    ri_html->add( '<thead>' ).
+    ri_html->add( '<tr>' ).
+    ri_html->add( '<th colspan="3">Staged Files (See <a href="#top">Summary</a> Above)</th>' ).
+    ri_html->add( '</tr>' ).
+    ri_html->add( '</thead>' ).
+ 
+    ri_html->add( '<tbody>' ).
+    LOOP AT mt_stage ASSIGNING <ls_stage>.
+      ri_html->add( '<tr>' ).
+      ri_html->add( '<td>' ).
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state(
+        iv_lstate = <ls_stage>-status-lstate
+        iv_rstate = <ls_stage>-status-rstate ) ).
+      ri_html->add( '</td>' ).
+      ri_html->add( '<td class="method">' ).
+      ri_html->add( zcl_abapgit_stage=>method_description( <ls_stage>-method ) ).
+      ri_html->add( '</td>' ).
+      ri_html->add( '<td>' ).
+      ri_html->add( <ls_stage>-file-path && <ls_stage>-file-filename ).
+      ri_html->add( '</td>' ).
+      ri_html->add( '</tr>' ).
+    ENDLOOP.
+    ri_html->add( '</tbody>' ).
+ 
+    ri_html->add( '</table>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_stage_summary.
+ 
+    DATA:
+      BEGIN OF ls_sum,
+        method TYPE string,
+        count  TYPE i,
+      END OF ls_sum,
+      lt_sum LIKE STANDARD TABLE OF ls_sum WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS <ls_stage> LIKE LINE OF mt_stage.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    LOOP AT mt_stage ASSIGNING <ls_stage>.
+      ls_sum-method = <ls_stage>-method.
+      ls_sum-count  = 1.
+      COLLECT ls_sum INTO lt_sum.
+    ENDLOOP.
+ 
+    ri_html->add( 'Stage Summary: ' ).
+ 
+    READ TABLE lt_sum INTO ls_sum WITH TABLE KEY method = zif_abapgit_definitions=>c_method-add.
+    IF sy-subrc = 0.
+      ri_html->add( |<span class="diff_banner diff_ins" title="add">+ { ls_sum-count }</span>| ).
+    ENDIF.
+    READ TABLE lt_sum INTO ls_sum WITH TABLE KEY method = zif_abapgit_definitions=>c_method-rm.
+    IF sy-subrc = 0.
+      ri_html->add( |<span class="diff_banner diff_del" title="remove">- { ls_sum-count }</span>| ).
+    ENDIF.
+    READ TABLE lt_sum INTO ls_sum WITH TABLE KEY method = zif_abapgit_definitions=>c_method-ignore.
+    IF sy-subrc = 0.
+      ri_html->add( |<span class="diff_banner diff_upd" title="ignore">~ { ls_sum-count }</span>| ).
+    ENDIF.
+ 
+    IF lines( mt_stage ) = 1.
+      ri_html->add( 'file' ).
+    ELSE.
+      ri_html->add( 'files' ).
+    ENDIF.
+ 
+    ri_html->add( '(See <a href="#stage-details">Details</a> Below)' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA: lt_branches        TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+          lv_new_branch_name TYPE string.
+ 
+    ro_validation_log = mo_form_util->validate( io_form_data ).
+ 
+    IF zcl_abapgit_utils=>is_valid_email( io_form_data->get( c_id-committer_email ) ) = abap_false.
+      ro_validation_log->set(
+        iv_key = c_id-committer_email
+        iv_val = |Invalid email address| ).
+    ENDIF.
+ 
+    IF zcl_abapgit_utils=>is_valid_email( io_form_data->get( c_id-author_email ) ) = abap_false.
+      ro_validation_log->set(
+        iv_key = c_id-author_email
+        iv_val = |Invalid email address| ).
+    ENDIF.
+ 
+    lv_new_branch_name = io_form_data->get( c_id-new_branch_name ).
+    IF lv_new_branch_name IS NOT INITIAL.
+      " check if branch already exists
+      lt_branches = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) )->get_branches_only( ).
+      READ TABLE lt_branches TRANSPORTING NO FIELDS WITH TABLE KEY name_key
+        COMPONENTS name = branch_name_to_internal( lv_new_branch_name ).
+      IF sy-subrc = 0.
+        ro_validation_log->set(
+          iv_key = c_id-new_branch_name
+          iv_val = |Branch already exists| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    DATA lv_new_branch_name   TYPE string.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-commit.
+        " Validate form entries before committing
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+ 
+          " new branch fields not needed in commit data
+          mo_form_data->strict( abap_false ).
+ 
+          mo_form_data->to_abap( CHANGING cs_container = ms_commit ).
+ 
+          REPLACE ALL OCCURRENCES
+            OF cl_abap_char_utilities=>cr_lf
+            IN ms_commit-body
+            WITH cl_abap_char_utilities=>newline.
+ 
+          lv_new_branch_name = mo_form_data->get( c_id-new_branch_name ).
+          " create new branch and commit to it if branch name is not empty
+          IF lv_new_branch_name IS NOT INITIAL.
+            lv_new_branch_name = branch_name_to_internal( lv_new_branch_name ).
+            " creates a new branch and automatically switches to it
+            mo_repo->create_branch( lv_new_branch_name ).
+          ENDIF.
+ 
+          zcl_abapgit_services_git=>commit(
+            is_commit = ms_commit
+            io_repo   = mo_repo
+            io_stage  = mo_stage ).
+ 
+ 
+          MESSAGE 'Commit was successful' TYPE 'S'.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    IF mo_form_util->is_empty( mo_form_data ) = abap_true.
+      get_defaults( ).
+    ENDIF.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="repo">' ).
+    ri_html->add( '<div id="top" class="paddings">' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( mo_repo ) ).
+    ri_html->add( '</div>' ).
+ 
+    ri_html->add( '<div id="stage-summary" class="dialog w800px paddings">' ).
+    ri_html->add( render_stage_summary( ) ).
+    ri_html->add( '</div>' ).
+ 
+    ri_html->add( mo_form->render(
+      iv_form_class     = 'w800px'
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+ 
+    ri_html->add( '<div id="stage-details" class="dialog w800px">' ).
+    ri_html->add( render_stage_details( ) ).
+    ri_html->add( '</div>' ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_data.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_data.clas.abap.html new file mode 100644 index 00000000000..3c705483105 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_data.clas.abap.html @@ -0,0 +1,1201 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_data.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_data.clas.abap

+
+ +
+ 77.68% + Statements + 289/372 +
+ + +
+ 25% + Branches + 1/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 77.68% + Lines + 289/372 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +3731x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +  +  +1x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_data DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event
+        REDEFINITION .
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        add               TYPE string VALUE 'add',
+        update            TYPE string VALUE 'update',
+        remove            TYPE string VALUE 'remove',
+        add_via_transport TYPE string VALUE 'add_via_transport',
+      END OF c_event .
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        table        TYPE string VALUE 'table',
+        where        TYPE string VALUE 'where',
+        skip_initial TYPE string VALUE 'skip_initial',
+      END OF c_id .
+ 
+    DATA mi_config TYPE REF TO zif_abapgit_data_config .
+ 
+    METHODS render_content
+        REDEFINITION .
+  PRIVATE SECTION.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+ 
+    CLASS-METHODS concatenated_key_to_where
+      IMPORTING
+        !iv_table       TYPE tabname
+        !iv_tabkey      TYPE clike
+      RETURNING
+        VALUE(rv_where) TYPE string .
+    METHODS add_via_transport
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS build_where
+      IMPORTING
+        !io_map         TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rt_where) TYPE string_table .
+    METHODS render_add
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_existing
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS event_add
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS event_remove
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS event_update
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_data IMPLEMENTATION.
+ 
+ 
+  METHOD add_via_transport.
+
+    DATA lt_trkorr  TYPE trwbo_request_headers.
+    DATA ls_trkorr  LIKE LINE OF lt_trkorr.
+    DATA ls_request TYPE trwbo_request.
+    DATA ls_key     LIKE LINE OF ls_request-keys.
+    DATA lv_where   TYPE string.
+    DATA ls_config  TYPE zif_abapgit_data_config=>ty_config.
+
+
+    lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
+    IF lines( lt_trkorr ) <> 1.
+      RETURN.
+    ENDIF.
+
+    READ TABLE lt_trkorr INDEX 1 INTO ls_trkorr.
+    ASSERT sy-subrc = 0.
+
+    ls_request = zcl_abapgit_transport=>read( ls_trkorr ).
+
+    IF lines( ls_request-keys ) = 0.
+      zcx_abapgit_exception=>raise( |No keys found, select task| ).
+    ENDIF.
+
+    LOOP AT ls_request-keys INTO ls_key WHERE object = 'TABU'.
+      ASSERT ls_key-objname IS NOT INITIAL.
+      ASSERT ls_key-tabkey IS NOT INITIAL.
+
+      CLEAR ls_config.
+      ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+      ls_config-name = to_upper( ls_key-objname ).
+      lv_where = concatenated_key_to_where(
+        iv_table  = ls_key-objname
+        iv_tabkey = ls_key-tabkey ).
+      APPEND lv_where TO ls_config-where.
+      mi_config->add_config( ls_config ).
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add( iv_txt = 'Add Via Transport'
+                  iv_act = c_event-add_via_transport ).
+    ro_menu->add( iv_txt = 'Back'
+                  iv_act = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_where.
+ 
+    DATA lv_where LIKE LINE OF rt_where.
+ 
+    SPLIT io_map->get( c_id-where ) AT |\n| INTO TABLE rt_where.
+ 
+    DELETE rt_where WHERE table_line IS INITIAL.
+ 
+    LOOP AT rt_where INTO lv_where.
+      IF strlen( lv_where ) <= 2.
+        DELETE rt_where INDEX sy-tabix.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD concatenated_key_to_where.
+ 
+    DATA lo_structdescr TYPE REF TO cl_abap_structdescr.
+    DATA lt_fields      TYPE ddfields.
+    DATA ls_field       LIKE LINE OF lt_fields.
+    DATA lv_key         TYPE c LENGTH 900.
+ 
+    lv_key = iv_tabkey.
+    lo_structdescr ?= cl_abap_typedescr=>describe_by_name( iv_table ).
+ 
+    lt_fields = lo_structdescr->get_ddic_field_list( ).
+ 
+    LOOP AT lt_fields INTO ls_field WHERE keyflag = abap_true.
+      IF ls_field-position = '0001' AND ls_field-datatype = 'CLNT'.
+        lv_key = lv_key+ls_field-leng.
+        CONTINUE.
+      ENDIF.
+      IF lv_key = |*|.
+        EXIT. " current loop
+      ENDIF.
+      IF NOT rv_where IS INITIAL.
+        rv_where = |{ rv_where } AND |.
+      ENDIF.
+      rv_where = |{ rv_where }{ to_lower( ls_field-fieldname ) } = '{ lv_key(ls_field-leng) }'|.
+      lv_key = lv_key+ls_field-leng.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    ms_control-page_title = 'Data'.
+    ms_control-page_menu = build_menu( ).
+ 
+    mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    mi_config = mo_repo->get_data_config( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD event_add.
+
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+
+    lo_map = ii_event->form_data( ).
+
+    ls_config-type         = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name         = to_upper( lo_map->get( c_id-table ) ).
+    ls_config-skip_initial = lo_map->get( c_id-skip_initial ).
+    ls_config-where        = build_where( lo_map ).
+
+    mi_config->add_config( ls_config ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD event_remove.
+
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+
+    lo_map = ii_event->form_data( ).
+
+    ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name = to_upper( lo_map->get( c_id-table ) ).
+
+    mi_config->remove_config( ls_config ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD event_update.
+
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+    DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
+
+    lo_map = ii_event->form_data( ).
+
+    ls_config-type         = zif_abapgit_data_config=>c_data_type-tabu.
+    ls_config-name         = to_upper( lo_map->get( c_id-table ) ).
+    ls_config-skip_initial = lo_map->has( to_upper( c_id-skip_initial ) ).
+    ls_config-where        = build_where( lo_map ).
+
+    mi_config->update_config( ls_config ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_add.
+ 
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    CREATE OBJECT lo_form_data.
+ 
+    lo_form = zcl_abapgit_html_form=>create( ).
+    lo_form->text(
+      iv_label    = 'Table'
+      iv_name     = c_id-table
+      iv_required = abap_true ).
+ 
+    lo_form->checkbox(
+      iv_label = 'Skip Initial Values'
+      iv_name  = c_id-skip_initial ).
+ 
+    lo_form->textarea(
+      iv_label       = 'Where'
+      iv_placeholder = 'Conditions separated by newline'
+      iv_name        = c_id-where ).
+ 
+    lo_form->command(
+      iv_label       = 'Add'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-add ).
+    ri_html->add( lo_form->render( lo_form_data ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( '<div class="repo">' ).
+    ri_html->add( render_existing( ) ).
+    ri_html->add( render_add( ) ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_existing.
+ 
+    DATA lo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
+    DATA ls_config LIKE LINE OF lt_configs.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    CREATE OBJECT lo_form_data.
+ 
+    lt_configs = mi_config->get_configs( ).
+ 
+    LOOP AT lt_configs INTO ls_config.
+      lo_form = zcl_abapgit_html_form=>create(  ).
+      CREATE OBJECT lo_form_data.
+ 
+      lo_form_data->set(
+        iv_key = c_id-table
+        iv_val = |{ ls_config-name }| ).
+      lo_form->text(
+        iv_label    = 'Table'
+        iv_name     = c_id-table
+        iv_readonly = abap_true ).
+ 
+      lo_form_data->set(
+        iv_key = c_id-skip_initial
+        iv_val = ls_config-skip_initial ).
+      lo_form->checkbox(
+        iv_label = 'Skip Initial Values'
+        iv_name  = c_id-skip_initial ).
+ 
+      lo_form_data->set(
+        iv_key = c_id-where
+        iv_val = concat_lines_of( table = ls_config-where sep = |\n| ) ).
+      lo_form->textarea(
+        iv_label       = 'Where'
+        iv_placeholder = 'Conditions separated by newline'
+        iv_name        = c_id-where ).
+ 
+      lo_form->command(
+        iv_label       = 'Update'
+        iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+        iv_action      = c_event-update ).
+      lo_form->command(
+        iv_label       = 'Remove'
+        iv_action      = c_event-remove ).
+      ri_html->add( lo_form->render( lo_form_data ) ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-add.
+        event_add( ii_event ).
+        mo_repo->refresh( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_event-update.
+        event_update( ii_event ).
+        mo_repo->refresh( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_event-remove.
+        event_remove( ii_event ).
+        mo_repo->refresh( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_event-add_via_transport.
+        add_via_transport( ).
+        mo_repo->refresh( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_data.clas.testclasses.abap.html b/src/ui/pages/zcl_abapgit_gui_page_data.clas.testclasses.abap.html new file mode 100644 index 00000000000..f03a7878071 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_data.clas.testclasses.abap.html @@ -0,0 +1,301 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_data.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_data.clas.testclasses.abap

+
+ +
+ 100% + Statements + 72/72 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 72/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +731x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION DEFERRED.
+CLASS zcl_abapgit_gui_page_data DEFINITION LOCAL FRIENDS ltcl_test.
+ 
+CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS concatenated_key_to_where1 FOR TESTING RAISING cx_static_check.
+    METHODS concatenated_key_to_where2 FOR TESTING RAISING cx_static_check.
+    METHODS concatenated_key_to_where3 FOR TESTING RAISING cx_static_check.
+    METHODS concatenated_key_to_where4 FOR TESTING RAISING cx_static_check.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD concatenated_key_to_where1.
+ 
+    DATA lv_where TYPE string.
+ 
+    lv_where = zcl_abapgit_gui_page_data=>concatenated_key_to_where(
+      iv_table  = 'T100'
+      iv_tabkey = 'EABC55555555555555555001' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_where
+      exp = |sprsl = 'E' AND arbgb = 'ABC55555555555555555' AND msgnr = '001'| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD concatenated_key_to_where2.
+ 
+    DATA lv_where TYPE string.
+ 
+    lv_where = zcl_abapgit_gui_page_data=>concatenated_key_to_where(
+      iv_table  = 'T100'
+      iv_tabkey = 'ESHORT' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_where
+      exp = |sprsl = 'E' AND arbgb = 'SHORT' AND msgnr = ''| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD concatenated_key_to_where3.
+ 
+    DATA lv_where TYPE string.
+ 
+    lv_where = zcl_abapgit_gui_page_data=>concatenated_key_to_where(
+      iv_table  = 'T100'
+      iv_tabkey = 'ESHORT               001' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_where
+      exp = |sprsl = 'E' AND arbgb = 'SHORT' AND msgnr = '001'| ).
+ 
+  ENDMETHOD.
+ 
+  METHOD concatenated_key_to_where4.
+ 
+    DATA lv_where TYPE string.
+ 
+    lv_where = zcl_abapgit_gui_page_data=>concatenated_key_to_where(
+      iv_table  = 'T100'
+      iv_tabkey = 'ESHORT               0' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_where
+      exp = |sprsl = 'E' AND arbgb = 'SHORT' AND msgnr = '0'| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_db.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_db.clas.abap.html new file mode 100644 index 00000000000..64c20fc70fd --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_db.clas.abap.html @@ -0,0 +1,1831 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_db.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_db.clas.abap

+
+ +
+ 97.76% + Statements + 569/582 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 97.76% + Lines + 569/582 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +5831x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_db DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+    INTERFACES zif_abapgit_gui_menu_provider.
+    INTERFACES zif_abapgit_html_table.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_action,
+        delete  TYPE string VALUE 'delete',
+        backup  TYPE string VALUE 'backup',
+        restore TYPE string VALUE 'restore',
+      END OF c_action.
+ 
+    CONSTANTS c_css_url TYPE string VALUE 'css/page_db.css'.
+ 
+    TYPES:
+      BEGIN OF ty_explanation,
+        value TYPE string,
+        extra TYPE string,
+      END OF ty_explanation.
+ 
+    DATA mt_methods TYPE zcl_abapgit_background=>ty_methods.
+ 
+    METHODS register_stylesheet
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_table
+      IMPORTING
+        it_db_entries TYPE zif_abapgit_persistence=>ty_contents
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS do_backup_db
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS do_delete_entry
+      IMPORTING
+        !is_key TYPE zif_abapgit_persistence=>ty_content
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS do_restore_db
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS explain_content
+      IMPORTING
+        !is_data       TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rv_text) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS explain_content_repo
+      IMPORTING
+        !is_data  TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rs_expl) TYPE ty_explanation
+      RAISING
+        zcx_abapgit_exception.
+    METHODS explain_content_repo_cs
+      IMPORTING
+        !is_data  TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rs_expl) TYPE ty_explanation
+      RAISING
+        zcx_abapgit_exception.
+    METHODS explain_content_background
+      IMPORTING
+        !is_data  TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rs_expl) TYPE ty_explanation
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_DB IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    register_stylesheet( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_db.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title         = 'Database Utility'
+      iv_extra_css_url      = c_css_url
+      ii_page_menu_provider = lo_component
+      ii_child_component    = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD do_backup_db.
+ 
+    DATA:
+      lt_data     TYPE zif_abapgit_persistence=>ty_contents,
+      lo_zip      TYPE REF TO cl_abap_zip,
+      lv_zip      TYPE xstring,
+      lv_path     TYPE string,
+      lv_filename TYPE string,
+      li_fe_serv  TYPE REF TO zif_abapgit_frontend_services.
+ 
+    FIELD-SYMBOLS:
+      <ls_data> LIKE LINE OF lt_data.
+ 
+    lt_data = zcl_abapgit_persistence_db=>get_instance( )->list( ).
+ 
+    CREATE OBJECT lo_zip.
+ 
+    LOOP AT lt_data ASSIGNING <ls_data>.
+      CONCATENATE <ls_data>-type '_' <ls_data>-value '.xml' INTO lv_filename.
+      lo_zip->add(
+        name    = lv_filename
+        content = zcl_abapgit_convert=>string_to_xstring_utf8( <ls_data>-data_str ) ).
+    ENDLOOP.
+ 
+    lv_zip = lo_zip->save( ).
+ 
+    CONCATENATE 'abapGit_Backup_' sy-datlo '_' sy-timlo INTO lv_filename.
+ 
+    li_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lv_path = li_fe_serv->show_file_save_dialog(
+      iv_title            = 'abapGit Backup'
+      iv_extension        = 'zip'
+      iv_default_filename = lv_filename ).
+ 
+    li_fe_serv->file_download(
+      iv_path = lv_path
+      iv_xstr = lv_zip ).
+ 
+    MESSAGE 'abapGit Backup successfully saved' TYPE 'S'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD do_delete_entry.
+ 
+    DATA lv_answer TYPE c LENGTH 1.
+ 
+    ASSERT is_key-type IS NOT INITIAL.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar              = 'Warning'
+      iv_text_question         = |Are you sure you want to delete entry { is_key-type } { is_key-value }?|
+      iv_text_button_1         = 'Yes'
+      iv_icon_button_1         = 'ICON_DELETE'
+      iv_text_button_2         = 'No'
+      iv_icon_button_2         = 'ICON_CANCEL'
+      iv_default_button        = '2'
+      iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer = '2'.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    zcl_abapgit_persistence_db=>get_instance( )->delete(
+      iv_type  = is_key-type
+      iv_value = is_key-value ).
+ 
+    " If deleting repo, also delete corresponding checksums
+    " Other way around is ok, since checksums are automatically recreated
+    IF is_key-type = zcl_abapgit_persistence_db=>c_type_repo.
+      zcl_abapgit_persistence_db=>get_instance( )->delete(
+        iv_type  = zcl_abapgit_persistence_db=>c_type_repo_csum
+        iv_value = is_key-value ).
+ 
+      " Initialize repo list
+      zcl_abapgit_repo_srv=>get_instance( )->init( ).
+      " TODO: think how to remove this code,
+      " maybe implement subscription in persistence_db,
+      " so that repo_srv receive a notification on add/delete
+    ENDIF.
+ 
+    COMMIT WORK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD do_restore_db.
+ 
+    DATA:
+      lv_answer   TYPE c LENGTH 1,
+      lo_zip      TYPE REF TO cl_abap_zip,
+      lv_zip      TYPE xstring,
+      lv_path     TYPE string,
+      lv_filename TYPE string,
+      lv_data     TYPE xstring,
+      ls_data     TYPE zif_abapgit_persistence=>ty_content,
+      lt_data     TYPE zif_abapgit_persistence=>ty_contents,
+      lt_data_old TYPE zif_abapgit_persistence=>ty_contents,
+      li_fe_serv  TYPE REF TO zif_abapgit_frontend_services.
+ 
+    FIELD-SYMBOLS:
+      <ls_zipfile> LIKE LINE OF lo_zip->files.
+ 
+    li_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lv_path = li_fe_serv->show_file_open_dialog(
+      iv_title            = 'Restore abapGit Backup'
+      iv_extension        = 'zip'
+      iv_default_filename = 'abapGit_Backup_*.zip' ).
+ 
+    lv_zip = li_fe_serv->file_upload( lv_path ).
+ 
+    CREATE OBJECT lo_zip.
+ 
+    lo_zip->load(
+      EXPORTING
+        zip             = lv_zip
+      EXCEPTIONS
+        zip_parse_error = 1
+        OTHERS          = 2 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error loading ZIP file' ).
+    ENDIF.
+ 
+    LOOP AT lo_zip->files ASSIGNING <ls_zipfile>.
+      CLEAR ls_data.
+      lv_filename = <ls_zipfile>-name.
+      REPLACE '.xml' IN lv_filename WITH ''.
+      SPLIT lv_filename AT '_' INTO ls_data-type ls_data-value.
+ 
+      " Validate DB key
+      TRY.
+          zcl_abapgit_persistence_db=>validate_entry_type( ls_data-type ).
+        CATCH zcx_abapgit_exception.
+          zcx_abapgit_exception=>raise( |Invalid DB entry type. This is not an abapGit Backup| ).
+      ENDTRY.
+ 
+      lo_zip->get(
+        EXPORTING
+          name                    = <ls_zipfile>-name
+        IMPORTING
+          content                 = lv_data
+        EXCEPTIONS
+          zip_index_error         = 1
+          zip_decompression_error = 2
+          OTHERS                  = 3 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Error getting file { <ls_zipfile>-name } from ZIP| ).
+      ENDIF.
+ 
+      ls_data-data_str = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+      INSERT ls_data INTO TABLE lt_data.
+    ENDLOOP.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar              = 'Warning'
+      iv_text_question         = 'All existing repositories and settings will be deleted and overwritten! Continue?'
+      iv_text_button_1         = 'Restore'
+      iv_icon_button_1         = 'ICON_IMPORT'
+      iv_text_button_2         = 'Cancel'
+      iv_icon_button_2         = 'ICON_CANCEL'
+      iv_default_button        = '2'
+      iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer <> '1'.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    lt_data_old = zcl_abapgit_persistence_db=>get_instance( )->list( ).
+    LOOP AT lt_data_old INTO ls_data.
+      zcl_abapgit_persistence_db=>get_instance( )->delete(
+        iv_type  = ls_data-type
+        iv_value = ls_data-value ).
+    ENDLOOP.
+ 
+    COMMIT WORK AND WAIT.
+ 
+    LOOP AT lt_data INTO ls_data.
+      zcl_abapgit_persistence_db=>get_instance( )->add(
+        iv_type  = ls_data-type
+        iv_value = ls_data-value
+        iv_data  = ls_data-data_str ).
+    ENDLOOP.
+ 
+    COMMIT WORK AND WAIT.
+ 
+    MESSAGE 'abapGit Backup successfully restored' TYPE 'S'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD explain_content.
+ 
+    DATA lv_descr TYPE string.
+    DATA ls_explanation TYPE ty_explanation.
+ 
+    CASE is_data-type.
+      WHEN zcl_abapgit_persistence_db=>c_type_repo.
+        lv_descr       = 'Repo Settings'.
+        ls_explanation = explain_content_repo( is_data ).
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_background.
+        lv_descr       = 'Background Settings'.
+        ls_explanation = explain_content_background( is_data ).
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_user.
+        lv_descr       = 'Personal Settings'.
+        ls_explanation-value = zcl_abapgit_user_record=>get_instance( is_data-value )->get_name( ).
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_settings.
+        lv_descr       = 'Global Settings'.
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_packages.
+        lv_descr       = 'Local Package Details'.
+ 
+      WHEN zcl_abapgit_persistence_db=>c_type_repo_csum.
+        lv_descr       = 'Repo Checksums'.
+        ls_explanation = explain_content_repo_cs( is_data ).
+ 
+      WHEN OTHERS.
+        IF strlen( is_data-data_str ) >= 250.
+          ls_explanation-value = is_data-data_str(250).
+        ELSE.
+          ls_explanation-value = is_data-data_str.
+        ENDIF.
+ 
+        ls_explanation-value = escape(
+          val    = ls_explanation-value
+          format = cl_abap_format=>e_html_attr ).
+        ls_explanation-value = |<pre>{ ls_explanation-value }</pre>|.
+ 
+    ENDCASE.
+ 
+    IF ls_explanation-value IS NOT INITIAL.
+      lv_descr = |{ lv_descr }: |.
+    ENDIF.
+ 
+    IF ls_explanation-extra IS NOT INITIAL.
+      ls_explanation-extra = | ({ ls_explanation-extra })|.
+    ENDIF.
+ 
+    rv_text = |{ lv_descr }<strong>{ ls_explanation-value }</strong>{ ls_explanation-extra }|.
+ 
+    IF strlen( rv_text ) >= 250.
+      rv_text = rv_text(250) && '...'.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD explain_content_background.
+ 
+    DATA:
+      ls_result TYPE match_result,
+      ls_match  TYPE submatch_result,
+      lv_class  TYPE string,
+      ls_method LIKE LINE OF mt_methods.
+ 
+    rs_expl-value = |{ zcl_abapgit_repo_srv=>get_instance( )->get( is_data-value )->get_name( ) }|.
+ 
+    FIND FIRST OCCURRENCE OF REGEX '<METHOD>(.*)</METHOD>'
+      IN is_data-data_str IGNORING CASE RESULTS ls_result.
+    READ TABLE ls_result-submatches INTO ls_match INDEX 1.
+    IF sy-subrc = 0.
+      lv_class = is_data-data_str+ls_match-offset(ls_match-length).
+    ENDIF.
+ 
+    IF mt_methods IS INITIAL.
+      mt_methods = zcl_abapgit_background=>list_methods( ).
+    ENDIF.
+ 
+    READ TABLE mt_methods INTO ls_method WITH TABLE KEY class = lv_class.
+    IF sy-subrc = 0.
+      rs_expl-extra = ls_method-description.
+    ELSE.
+      rs_expl-extra = lv_class.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD explain_content_repo.
+ 
+    DATA:
+      ls_result TYPE match_result,
+      ls_match  TYPE submatch_result,
+      lv_cnt    TYPE i.
+ 
+    FIND FIRST OCCURRENCE OF REGEX '<OFFLINE/>'
+      IN is_data-data_str IGNORING CASE MATCH COUNT lv_cnt.
+    IF lv_cnt > 0.
+      rs_expl-extra = 'Online'.
+    ELSE.
+      rs_expl-extra = 'Offline'.
+    ENDIF.
+ 
+    FIND FIRST OCCURRENCE OF REGEX '<DISPLAY_NAME>(.*)</DISPLAY_NAME>'
+      IN is_data-data_str IGNORING CASE RESULTS ls_result.
+    READ TABLE ls_result-submatches INTO ls_match INDEX 1.
+    IF sy-subrc = 0.
+      rs_expl-value = is_data-data_str+ls_match-offset(ls_match-length).
+    ENDIF.
+ 
+    IF rs_expl-value IS INITIAL.
+      FIND FIRST OCCURRENCE OF REGEX '<URL>(.*)</URL>'
+        IN is_data-data_str IGNORING CASE RESULTS ls_result.
+      READ TABLE ls_result-submatches INTO ls_match INDEX 1.
+      IF sy-subrc = 0.
+        rs_expl-value = is_data-data_str+ls_match-offset(ls_match-length).
+        IF lv_cnt > 0.
+          rs_expl-value = zcl_abapgit_url=>name( rs_expl-value ).
+        ENDIF.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD explain_content_repo_cs.
+ 
+    DATA lt_lines TYPE string_table.
+ 
+    IF strlen( is_data-data_str ) > 0.
+      SPLIT is_data-data_str AT cl_abap_char_utilities=>newline INTO TABLE lt_lines.
+      rs_expl-extra = |{ lines( lt_lines ) } lines|.
+ 
+      READ TABLE lt_lines INDEX 1 INTO rs_expl-value.
+      IF sy-subrc = 0.
+        REPLACE '#repo_name#' IN rs_expl-value WITH ''.
+        rs_expl-value = escape(
+          val    = rs_expl-value
+          format = cl_abap_format=>e_html_attr ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD register_stylesheet.
+
+    DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
+
+    CREATE OBJECT lo_buf.
+
+    " @@abapmerge include zabapgit_css_page_db.w3mi.data.css > lo_buf->add( '$$' ).
+    gui_services( )->register_page_asset(
+      iv_url       = c_css_url
+      iv_type      = 'text/css'
+      iv_mime_name = 'ZABAPGIT_CSS_PAGE_DB'
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table.
+ 
+    ri_html = zcl_abapgit_html_table=>create( ii_renderer = me
+      )->define_column(
+        iv_column_id = 'type'
+        iv_column_title = 'Type'
+      )->define_column(
+        iv_column_id = 'value'
+        iv_column_title = 'Key'
+      )->define_column(
+        iv_column_id = 'expl'
+        iv_column_title = 'Data'
+      )->define_column( 'cmd'
+      )->render( it_db_entries ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA ls_db TYPE zif_abapgit_persistence=>ty_content.
+    DATA lo_query TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_query = ii_event->query( ).
+    CASE ii_event->mv_action.
+      WHEN c_action-delete.
+        lo_query->to_abap( CHANGING cs_container = ls_db ).
+        do_delete_entry( ls_db ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_action-backup.
+        do_backup_db( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_action-restore.
+        do_restore_db( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_menu_provider~get_menu.
+ 
+    CREATE OBJECT ro_toolbar.
+ 
+    ro_toolbar->add(
+      iv_txt = 'Backup'
+      iv_act = c_action-backup ).
+    ro_toolbar->add(
+      iv_txt = 'Restore'
+      iv_act = c_action-restore ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lt_db_entries TYPE zif_abapgit_persistence=>ty_contents.
+ 
+    register_handlers( ).
+ 
+    lt_db_entries = zcl_abapgit_persistence_db=>get_instance( )->list( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="db-list">' ).
+    ri_html->add( render_table( lt_db_entries ) ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_table~get_row_attrs.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_table~render_cell.
+ 
+    DATA lv_action  TYPE string.
+    DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CASE iv_column_id.
+      WHEN 'type' OR 'value'.
+        rs_render-content = |{ iv_value }|.
+      WHEN 'expl'.
+        rs_render-content   = explain_content( is_row ).
+        rs_render-css_class = 'data'.
+      WHEN 'cmd'.
+        lv_action  = zcl_abapgit_html_action_utils=>dbkey_encode( is_row ).
+        lo_toolbar = zcl_abapgit_html_toolbar=>create(
+          )->add(
+            iv_txt = 'Display'
+            iv_act = |{ zif_abapgit_definitions=>c_action-db_display }?{ lv_action }|
+          )->add(
+            iv_txt = 'Edit'
+            iv_act = |{ zif_abapgit_definitions=>c_action-db_edit }?{ lv_action }|
+          )->add(
+            iv_txt = 'Delete'
+            iv_act = |{ c_action-delete }?{ lv_action }| ).
+        rs_render-html = lo_toolbar->render( ).
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_db_entry.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_db_entry.clas.abap.html new file mode 100644 index 00000000000..eeac4fed543 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_db_entry.clas.abap.html @@ -0,0 +1,988 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_db_entry.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_db_entry.clas.abap

+
+ +
+ 84.71% + Statements + 255/301 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 84.71% + Lines + 255/301 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +3021x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_db_entry DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+    INTERFACES zif_abapgit_gui_page_title .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !is_key        TYPE zif_abapgit_persistence=>ty_content
+        !iv_edit_mode  TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !is_key       TYPE zif_abapgit_persistence=>ty_content
+        !iv_edit_mode TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+    CONSTANTS:
+      BEGIN OF c_action,
+        update      TYPE string VALUE 'update',
+        switch_mode TYPE string VALUE 'switch_mode',
+      END OF c_action .
+ 
+    CONSTANTS c_edit_form_id TYPE string VALUE `db_form`.
+    CONSTANTS c_css_url TYPE string VALUE 'css/page_db_entry.css'.
+ 
+    DATA ms_key TYPE zif_abapgit_persistence=>ty_content.
+    DATA mv_edit_mode TYPE abap_bool.
+ 
+    METHODS register_stylesheet
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_view
+      IMPORTING
+        iv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str
+        ii_html         TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_edit
+      IMPORTING
+        iv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str
+        ii_html         TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_header
+      IMPORTING
+        ii_html    TYPE REF TO zif_abapgit_html
+        io_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    METHODS build_toolbar
+      RETURNING
+        VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CLASS-METHODS render_entry_tag
+      IMPORTING
+        is_key         TYPE zif_abapgit_persistence=>ty_content
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+    CLASS-METHODS dbcontent_decode
+      IMPORTING
+        io_form_data      TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rs_content) TYPE zif_abapgit_persistence=>ty_content
+      RAISING
+        zcx_abapgit_exception .
+ 
+    CLASS-METHODS do_update
+      IMPORTING
+        is_content TYPE zif_abapgit_persistence=>ty_content
+      RAISING
+        zcx_abapgit_exception .
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_DB_ENTRY IMPLEMENTATION.
+ 
+ 
+  METHOD build_toolbar.
+ 
+    CREATE OBJECT ro_toolbar.
+ 
+    IF mv_edit_mode = abap_true.
+      ro_toolbar->add(
+        iv_act = |submitFormById('{ c_edit_form_id }');|
+        iv_txt = 'Save'
+        iv_typ = zif_abapgit_html=>c_action_type-onclick
+        iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+    ELSE.
+      ro_toolbar->add(
+        iv_act = |{ c_action-switch_mode }|
+        iv_txt = 'Edit' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    register_stylesheet( ).
+    mv_edit_mode = iv_edit_mode.
+    ms_key       = is_key.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_db_entry.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        iv_edit_mode = iv_edit_mode
+        is_key       = is_key.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_extra_css_url       = c_css_url
+      ii_page_title_provider = lo_component
+      ii_child_component     = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD dbcontent_decode.
+ 
+    rs_content-type     = io_form_data->get( 'TYPE' ).
+    rs_content-value    = io_form_data->get( 'VALUE' ).
+    rs_content-data_str = io_form_data->get( 'XMLDATA' ).
+ 
+    IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ???
+      rs_content-data_str = rs_content-data_str+1.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD do_update.
+ 
+    ASSERT is_content-type IS NOT INITIAL.
+ 
+    zcl_abapgit_persistence_db=>get_instance( )->update(
+      iv_type  = is_content-type
+      iv_value = is_content-value
+      iv_data  = is_content-data_str ).
+ 
+    COMMIT WORK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD register_stylesheet.
+
+    DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
+
+    CREATE OBJECT lo_buf.
+
+    " @@abapmerge include zabapgit_css_page_db_entry.w3mi.data.css > lo_buf->add( '$$' ).
+    gui_services( )->register_page_asset(
+      iv_url       = c_css_url
+      iv_type      = 'text/css'
+      iv_mime_name = 'ZABAPGIT_CSS_PAGE_DB_ENTRY'
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_edit.
+
+    DATA lv_formatted TYPE string.
+
+    lv_formatted = escape(
+      val    = zcl_abapgit_xml_pretty=>print( iv_raw_db_value )
+      format = cl_abap_format=>e_html_attr ).
+
+    " Form
+    ii_html->add( |<form id="{ c_edit_form_id }" method="post" action="sapevent:{ c_action-update }">| ).
+    ii_html->add( |<input type="hidden" name="type" value="{ ms_key-type }">| ).
+    ii_html->add( |<input type="hidden" name="value" value="{ ms_key-value }">| ).
+    ii_html->add( |<textarea rows="20" cols="100" name="xmldata">{ lv_formatted }</textarea>| ).
+    ii_html->add( '</form>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_entry_tag.
+ 
+    rv_html =
+      |<dl class="entry-tag">| &&
+      |<div><dt>Type</dt><dd>{ is_key-type }</dd></div>| &&
+      |<div><dt>Key</dt><dd>{ is_key-value }</dd></div>| &&
+      |</dl>|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_header.
+
+    ii_html->add( '<div class="toolbar">' ).
+    ii_html->add( io_toolbar->render( iv_right = abap_true ) ).
+    ii_html->add( render_entry_tag( ms_key ) ).
+    ii_html->add( '</div>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_view.
+
+    DATA lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter.
+    DATA lv_formatted   TYPE string.
+
+    " Create syntax highlighter
+    lo_highlighter = zcl_abapgit_syntax_factory=>create( '*.xml' ).
+    lv_formatted   = lo_highlighter->process_line( zcl_abapgit_xml_pretty=>print( iv_raw_db_value ) ).
+
+    ii_html->add( |<pre class="syntax-hl">{ lv_formatted }</pre>| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_action-switch_mode.
+        mv_edit_mode = boolc( mv_edit_mode = abap_false ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_action-update.
+        do_update( dbcontent_decode( ii_event->form_data( ) ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_page_title~get_page_title.
+ 
+    IF mv_edit_mode = abap_true.
+      rv_title = 'Config Edit'.
+    ELSE.
+      rv_title = 'Config Display'.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str.
+ 
+    register_handlers( ).
+ 
+    TRY.
+        lv_raw_db_value = zcl_abapgit_persistence_db=>get_instance( )->read(
+          iv_type  = ms_key-type
+          iv_value = ms_key-value ).
+      CATCH zcx_abapgit_not_found ##NO_HANDLER.
+    ENDTRY.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="db-entry">' ).
+ 
+    render_header(
+      ii_html    = ri_html
+      io_toolbar = build_toolbar( ) ).
+ 
+    IF mv_edit_mode = abap_true.
+      zcl_abapgit_persistence_db=>get_instance( )->lock(
+        iv_type  = ms_key-type
+        iv_value = ms_key-value ).
+      render_edit(
+        iv_raw_db_value = lv_raw_db_value
+        ii_html         = ri_html ).
+    ELSE.
+      render_view(
+        iv_raw_db_value = lv_raw_db_value
+        ii_html         = ri_html ).
+    ENDIF.
+ 
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_debuginfo.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_debuginfo.clas.abap.html new file mode 100644 index 00000000000..8d1711f5612 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_debuginfo.clas.abap.html @@ -0,0 +1,1444 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_debuginfo.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_debuginfo.clas.abap

+
+ +
+ 100% + Statements + 453/453 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 453/453 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +4541x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_debuginfo DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_exit_standalone TYPE syrepid VALUE 'ZABAPGIT_USER_EXIT' ##NO_TEXT.
+    CONSTANTS c_exit_class TYPE c LENGTH 30 VALUE 'ZCL_ABAPGIT_USER_EXIT' ##NO_TEXT.
+    CONSTANTS c_exit_interface TYPE c LENGTH 30 VALUE 'ZIF_ABAPGIT_EXIT' ##NO_TEXT.
+    CONSTANTS:
+      BEGIN OF c_action,
+        save TYPE string VALUE 'save',
+        back TYPE string VALUE 'back',
+      END OF c_action.
+    DATA mv_html TYPE string .
+ 
+    CLASS-METHODS build_toolbar
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar.
+    METHODS render_debug_info
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_exit_info
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_exit_info_methods
+      IMPORTING
+        !it_source     TYPE string_table
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_supported_object_types
+      RETURNING
+        VALUE(rv_html) TYPE string .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_jump_object
+      IMPORTING
+        !iv_obj_type   TYPE csequence DEFAULT 'CLAS'
+        !iv_obj_name   TYPE csequence
+      RETURNING
+        VALUE(rv_html) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_debuginfo IMPLEMENTATION.
+ 
+ 
+  METHOD build_toolbar.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-debug'.
+ 
+    ro_menu->add(
+      iv_txt = 'Save'
+      iv_act = c_action-save ).
+    ro_menu->add(
+      iv_txt = 'Back'
+      iv_act = c_action-back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_debuginfo.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Debug Info'
+      io_page_menu       = build_toolbar( )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_jump_object.
+ 
+    DATA lv_encode TYPE string.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+ 
+    CREATE OBJECT li_html TYPE zcl_abapgit_html.
+ 
+    lv_encode = zcl_abapgit_html_action_utils=>jump_encode( iv_obj_type = |{ iv_obj_type }|
+                                                            iv_obj_name = |{ iv_obj_name }| ).
+ 
+    rv_html = li_html->a(
+      iv_txt = |{ iv_obj_name }|
+      iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_encode }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_debug_info.
+ 
+    DATA: ls_release       TYPE zif_abapgit_environment=>ty_release_sp,
+          lv_gui_version   TYPE string,
+          lv_devclass      TYPE devclass,
+          lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+    TRY.
+        lo_frontend_serv->get_gui_version( IMPORTING ev_gui_version_string = lv_gui_version ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+        " Continue rendering even if this fails
+    ENDTRY.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      ri_html->add( '<h2>abapGit - Standalone Version</h2>' ).
+      ri_html->add( '<div>To keep abapGit up-to-date (or also to contribute) you need to' ).
+      ri_html->add( |install it as a repository ({ ri_html->a(
+        iv_txt = 'Developer Version'
+        iv_act = 'https://github.com/abapGit/abapGit'
+        iv_typ = zif_abapgit_html=>c_action_type-url ) }).</div>| ).
+    ELSE.
+      lv_devclass = zcl_abapgit_services_abapgit=>is_installed( ).
+      ri_html->add( '<h2>abapGit - Developer Version</h2>' ).
+      ri_html->add( |<div>abapGit is installed in package { lv_devclass }</div>| ).
+    ENDIF.
+ 
+    ri_html->add( '<br><div>' ).
+    ri_html->add_a(
+      iv_txt = 'Contribution guidelines for abapGit'
+      iv_act = 'https://github.com/abapGit/abapGit/blob/main/CONTRIBUTING.md'
+      iv_typ = zif_abapgit_html=>c_action_type-url ).
+    ri_html->add( '</div>' ).
+ 
+    ls_release = zcl_abapgit_factory=>get_environment( )->get_basis_release( ).
+ 
+    ri_html->add( '<h2>Environment</h2>' ).
+ 
+    ri_html->add( |<table>| ).
+    ri_html->add( |<tr><td>abapGit version:</td><td>{ zif_abapgit_version=>c_abap_version }</td></tr>| ).
+    ri_html->add( |<tr><td>XML version:    </td><td>{ zif_abapgit_version=>c_xml_version }</td></tr>| ).
+    ri_html->add( |<tr><td>GUI version:    </td><td>{ lv_gui_version }</td></tr>| ).
+    ri_html->add( |<tr><td>APACK version:  </td><td>{
+                  zcl_abapgit_apack_migration=>c_apack_interface_version }</td></tr>| ).
+    ri_html->add( |<tr><td>LCL_TIME:       </td><td>{ zcl_abapgit_git_time=>get_unix( ) }</td></tr>| ).
+    ri_html->add( |<tr><td>SY time:        </td><td>{ sy-datum } { sy-uzeit } { sy-tzone }</td></tr>| ).
+    ri_html->add( |<tr><td>SY release:     </td><td>{ ls_release-release } SP { ls_release-sp }</td></tr>| ).
+    ri_html->add( |</table>| ).
+    ri_html->add( |<br>| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_exit_info.
+ 
+    DATA lt_source TYPE string_table.
+    DATA ls_class_key TYPE seoclskey.
+    DATA lo_oo_serializer TYPE REF TO zcl_abapgit_oo_serializer.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<h2>User Exits</h2>' ).
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true.
+      " Standalone version
+      lt_source = zcl_abapgit_factory=>get_sap_report( )->read_report( c_exit_standalone ).
+      IF sy-subrc = 0.
+        ri_html->add( |<div>User exits are active (include { get_jump_object(
+          iv_obj_type = 'PROG'
+          iv_obj_name = c_exit_standalone ) } found)</div><br>| ).
+        ri_html->add( render_exit_info_methods( lt_source ) ).
+      ELSE.
+        ri_html->add( |<div>No user exits implemented (include { c_exit_standalone } not found)</div><br>| ).
+      ENDIF.
+    ELSE.
+      " Developer version
+      TRY.
+          ls_class_key-clsname = c_exit_class.
+          CREATE OBJECT lo_oo_serializer.
+          lt_source = lo_oo_serializer->serialize_abap_clif_source( ls_class_key ).
+ 
+          ri_html->add( |<div>User exits are active (class { get_jump_object( c_exit_class ) } found)</div><br>| ).
+          ri_html->add( render_exit_info_methods( lt_source ) ).
+        CATCH cx_root.
+          ri_html->add( |<div>No user exits implemented (class { c_exit_class } not found)</div><br>| ).
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_exit_info_methods.
+ 
+    DATA:
+      lo_scanner TYPE REF TO cl_oo_source_scanner_class,
+      lx_exc     TYPE REF TO cx_root,
+      lt_methods TYPE cl_oo_source_scanner_class=>type_method_implementations,
+      lv_method  LIKE LINE OF lt_methods,
+      lt_source  TYPE seop_source_string,
+      lv_source  TYPE string,
+      lv_rest    TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<table border="1px"><thead><tr>' ).
+    ri_html->add( '<td>Exit</td><td class="center">Implemented?</td>' ).
+    ri_html->add( '</tr></thead><tbody>' ).
+ 
+    TRY.
+        lo_scanner = cl_oo_source_scanner_class=>create_class_scanner(
+          clif_name = c_exit_class
+          source    = it_source ).
+        lo_scanner->scan( ).
+ 
+        lt_methods = lo_scanner->get_method_implementations( ).
+ 
+        LOOP AT lt_methods INTO lv_method WHERE table_line CS c_exit_interface.
+          lt_source = lo_scanner->get_method_impl_source( lv_method ).
+          DELETE lt_source INDEX 1.
+          DELETE lt_source INDEX lines( lt_source ).
+          CONCATENATE LINES OF lt_source INTO lv_source.
+          lv_source = to_upper( condense(
+            val = lv_source
+            del = ` ` ) ).
+          SPLIT lv_method AT '~' INTO lv_rest lv_method.
+          ri_html->add( |<tr><td>{ lv_method }</td><td class="center">|  ).
+          IF lv_source IS INITIAL OR lv_source = 'RETURN.' OR lv_source = 'EXIT.'.
+            ri_html->add( 'No' ).
+          ELSE.
+            ri_html->add( '<strong>Yes</strong>' ).
+          ENDIF.
+          ri_html->add( |</td></tr>| ).
+        ENDLOOP.
+ 
+      CATCH cx_root INTO lx_exc.
+        ri_html->add( |<tr><td colspan="2">{ lx_exc->get_text( ) }</td></tr>| ).
+    ENDTRY.
+ 
+    ri_html->add( '</tbody></table>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( 'debugOutput("<table><tr><td>Browser:</td><td>" + navigator.userAgent + ' &&
+      '"</td></tr><tr><td>Frontend time:</td><td>" + new Date() + "</td></tr></table>", "debug_info");' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_supported_object_types.
+ 
+    DATA: lv_list     TYPE string,
+          li_html     TYPE REF TO zif_abapgit_html,
+          lt_types    TYPE zcl_abapgit_objects=>ty_types_tt,
+          lv_type     LIKE LINE OF lt_types,
+          lt_obj      TYPE STANDARD TABLE OF ko100 WITH DEFAULT KEY,
+          lv_class    TYPE seoclsname,
+          li_object   TYPE REF TO zif_abapgit_object,
+          ls_item     TYPE zif_abapgit_definitions=>ty_item,
+          ls_metadata TYPE zif_abapgit_definitions=>ty_metadata,
+          lv_step     TYPE zif_abapgit_definitions=>ty_deserialization_step,
+          lt_steps    TYPE zif_abapgit_definitions=>ty_deserialization_step_tt.
+ 
+    FIELD-SYMBOLS: <ls_obj> TYPE ko100.
+ 
+    CALL FUNCTION 'TR_OBJECT_TABLE'
+      TABLES
+        wt_object_text = lt_obj.
+ 
+    lt_types = zcl_abapgit_objects=>supported_list( ).
+ 
+    CREATE OBJECT li_html TYPE zcl_abapgit_html.
+ 
+    rv_html = '<h2>Object Types</h2>'.
+ 
+    rv_html = rv_html && li_html->a(
+      iv_txt = 'Complete list of object types supported by abapGit'
+      iv_act = 'https://docs.abapgit.org/ref-supported.html'
+      iv_typ = zif_abapgit_html=>c_action_type-url ).
+ 
+    rv_html = rv_html && |<br><br>Supported object types in <strong>this</strong> system:<br><br>|.
+ 
+    rv_html = rv_html && |<table border="1px"><thead><tr>|.
+    rv_html = rv_html && |<td>Object</td><td>Description</td><td>Class</td><td>Version</td>|.
+    rv_html = rv_html && |<td>Steps</td>|.
+    rv_html = rv_html && |</tr></thead><tbody>|.
+ 
+    LOOP AT lt_types INTO lv_type.
+      lv_class = 'ZCL_ABAPGIT_OBJECT_' && lv_type.
+ 
+      rv_html = rv_html && |<tr>|.
+ 
+      rv_html = rv_html && |<td>{ lv_type }</td>|.
+ 
+      READ TABLE lt_obj ASSIGNING <ls_obj> WITH KEY pgmid = 'R3TR' object = lv_type.
+      IF sy-subrc = 0.
+        rv_html = rv_html && |<td>{ <ls_obj>-text }</td>|.
+      ELSE.
+        rv_html = rv_html && |<td class="warning">No description</td>|.
+      ENDIF.
+ 
+ 
+      TRY.
+          ls_item-obj_type = lv_type.
+          ls_item-obj_name = 'TEST'.
+ 
+          CREATE OBJECT li_object TYPE (lv_class)
+            EXPORTING
+              is_item     = ls_item
+              iv_language = sy-langu.
+ 
+          rv_html = rv_html && |<td>{ get_jump_object( lv_class ) }</td>|.
+ 
+        CATCH cx_sy_create_object_error.
+          TRY. " 2nd step, try looking for plugins
+              CREATE OBJECT li_object TYPE zcl_abapgit_objects_bridge
+                EXPORTING
+                  is_item = ls_item.
+            CATCH cx_sy_create_object_error.
+              rv_html = rv_html && |<td class="error" colspan="5">{ lv_class } - error instantiating class</td>|.
+              CONTINUE.
+          ENDTRY.
+ 
+          rv_html = rv_html && |<td>{ get_jump_object( lv_class ) } (Plug-in)</td>|.
+      ENDTRY.
+ 
+      ls_metadata = li_object->get_metadata( ).
+ 
+      rv_html = rv_html && |<td>{ ls_metadata-version }</td>|.
+ 
+      lt_steps = li_object->get_deserialize_steps( ).
+ 
+      CLEAR lv_list.
+      LOOP AT lt_steps INTO lv_step.
+        CASE lv_step.
+          WHEN zif_abapgit_object=>gc_step_id-early.
+            lv_step = |<i>{ lv_step } (1)</i>|.
+          WHEN zif_abapgit_object=>gc_step_id-ddic.
+            lv_step = |<strong>{ lv_step } (2)</strong>|.
+          WHEN zif_abapgit_object=>gc_step_id-abap.
+            lv_step = |{ lv_step } (3)|.
+          WHEN zif_abapgit_object=>gc_step_id-late.
+            lv_step = |<i>{ lv_step } (4)</i>|.
+          WHEN OTHERS.
+            ASSERT 1 = 2.
+        ENDCASE.
+        IF lv_list IS INITIAL.
+          lv_list = lv_step.
+        ELSE.
+          lv_list = lv_list && `, ` && lv_step.
+        ENDIF.
+      ENDLOOP.
+ 
+      rv_html = rv_html && |<td>{ lv_list }</td>|.
+ 
+      rv_html = rv_html && |</tr>|.
+ 
+    ENDLOOP.
+ 
+    rv_html = rv_html && |</tbody></table>|.
+    rv_html = rv_html && |<br>|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA:
+      lv_path     TYPE string,
+      lv_filename TYPE string,
+      li_fe_serv  TYPE REF TO zif_abapgit_frontend_services.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_action-save.
+ 
+        CONCATENATE 'abapGit_Debug_Info_' sy-datlo '_' sy-timlo '.html' INTO lv_filename.
+ 
+        li_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+        lv_path = li_fe_serv->show_file_save_dialog(
+          iv_title            = 'abapGit - Debug Info'
+          iv_extension        = 'html'
+          iv_default_filename = lv_filename ).
+ 
+        li_fe_serv->file_download(
+          iv_path = lv_path
+          iv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8( mv_html ) ).
+ 
+        MESSAGE 'abapGit Debug Info successfully saved' TYPE 'S'.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN c_action-back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div id="debug_info" class="debug_container">' ).
+    ri_html->add( render_debug_info( ) ).
+    ri_html->add( '</div>' ).
+ 
+    ri_html->add( '<div id="exit_info" class="debug_container">' ).
+    ri_html->add( render_exit_info( ) ).
+    ri_html->add( '</div>' ).
+ 
+    ri_html->add( '<div id="supported_objects" class="debug_container">' ).
+    ri_html->add( render_supported_object_types( ) ).
+    ri_html->add( '</div>' ).
+ 
+    mv_html = '<!DOCTYPE html><html lang="en"><title>abapGit Debug Info</title></head>'.
+    mv_html = |<body>{ ri_html->render( ) }</body></html>|.
+ 
+    register_deferred_script( render_scripts( ) ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_diff.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_diff.clas.abap.html new file mode 100644 index 00000000000..bead4c3babc --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_diff.clas.abap.html @@ -0,0 +1,4255 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_diff.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_diff.clas.abap

+
+ +
+ 70.57% + Statements + 981/1390 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/17 +
+ + +
+ 70.57% + Lines + 981/1390 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +13911x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_diff DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_gui_hotkeys.
+ 
+    TYPES:
+      BEGIN OF ty_file_diff,
+        path       TYPE string,
+        filename   TYPE string,
+        obj_type   TYPE string,
+        obj_name   TYPE string,
+        lstate     TYPE c LENGTH 1,
+        rstate     TYPE c LENGTH 1,
+        fstate     TYPE c LENGTH 1, " FILE state - Abstraction for shorter ifs
+        o_diff     TYPE REF TO zcl_abapgit_diff,
+        changed_by TYPE syuname,
+        type       TYPE string,
+      END OF ty_file_diff.
+    TYPES:
+      ty_file_diffs TYPE STANDARD TABLE OF ty_file_diff
+                        WITH NON-UNIQUE DEFAULT KEY
+                        WITH NON-UNIQUE SORTED KEY secondary
+                             COMPONENTS path filename.
+ 
+    CONSTANTS:
+      BEGIN OF c_fstate,
+        local  TYPE c LENGTH 1 VALUE 'L',
+        remote TYPE c LENGTH 1 VALUE 'R',
+        both   TYPE c LENGTH 1 VALUE 'B',
+      END OF c_fstate.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_key    TYPE zif_abapgit_persistence=>ty_repo-key
+        !is_file   TYPE zif_abapgit_git_definitions=>ty_file OPTIONAL
+        !is_object TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !it_files  TYPE zif_abapgit_definitions=>ty_stage_tt OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event
+        REDEFINITION.
+  PROTECTED SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_actions,
+        toggle_unified         TYPE string VALUE 'toggle_unified',
+        toggle_hidden_chars    TYPE string VALUE 'toggle_hidden_chars',
+        toggle_ignore_indent   TYPE string VALUE 'toggle_ignore_indent',
+        toggle_ignore_comments TYPE string VALUE 'toggle_ignore_comments',
+        toggle_ignore_case     TYPE string VALUE 'toggle_ignore_case',
+        refresh_prefix         TYPE string VALUE 'refresh',
+        refresh_all            TYPE string VALUE 'refresh_all',
+        refresh_local          TYPE string VALUE 'refresh_local',
+        refresh_local_object   TYPE string VALUE 'refresh_local_object',
+      END OF c_actions ,
+      BEGIN OF c_action_texts,
+        refresh_all   TYPE string VALUE `Refresh All`,
+        refresh_local TYPE string VALUE `Refresh Local`,
+      END OF c_action_texts,
+      BEGIN OF c_action_titles,
+        refresh_local TYPE string VALUE `Refresh all local objects, without refreshing the remote`,
+        refresh_all   TYPE string VALUE `Complete refresh of all objects, local and remote`,
+      END OF c_action_titles.
+ 
+    DATA mv_unified TYPE abap_bool VALUE abap_true ##NO_TEXT.
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mt_diff_files TYPE ty_file_diffs .
+ 
+    METHODS get_normalized_fname_with_path
+      IMPORTING
+        !is_diff           TYPE ty_file_diff
+      RETURNING
+        VALUE(rv_filename) TYPE string .
+    METHODS normalize_path
+      IMPORTING
+        !iv_path             TYPE string
+      RETURNING
+        VALUE(rv_normalized) TYPE string .
+    METHODS normalize_filename
+      IMPORTING
+        !iv_filename         TYPE string
+      RETURNING
+        VALUE(rv_normalized) TYPE string .
+    METHODS add_menu_end
+      IMPORTING
+        !io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS calculate_diff
+      IMPORTING
+        !is_file   TYPE zif_abapgit_git_definitions=>ty_file OPTIONAL
+        !is_object TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !it_files  TYPE zif_abapgit_definitions=>ty_stage_tt OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_menu_begin
+      IMPORTING
+        !io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS render_table_head_non_unified
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_diff TYPE ty_file_diff .
+    METHODS render_beacon_begin_of_row
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_diff TYPE ty_file_diff .
+    METHODS render_diff_head_after_state
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_diff TYPE ty_file_diff .
+    METHODS insert_nav
+      RETURNING
+        VALUE(rv_insert_nav) TYPE abap_bool .
+    METHODS render_line_split_row
+      IMPORTING
+        !ii_html      TYPE REF TO zif_abapgit_html
+        !iv_filename  TYPE string
+        !is_diff_line TYPE zif_abapgit_definitions=>ty_diff
+        !iv_index     TYPE sy-tabix
+        !iv_fstate    TYPE char1
+        !iv_new       TYPE string
+        !iv_old       TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS set_layout.
+    METHODS refresh
+      IMPORTING
+        iv_action TYPE clike
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_full
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_local
+      RAISING
+        zcx_abapgit_exception .
+    METHODS refresh_local_object
+      IMPORTING
+        iv_action TYPE clike
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_refresh
+      IMPORTING
+        iv_action            TYPE string
+      RETURNING
+        VALUE(rv_is_refrseh) TYPE abap_bool.
+    METHODS modify_files_before_diff_calc
+      IMPORTING
+        it_diff_files_old TYPE ty_file_diffs
+      RETURNING
+        VALUE(rt_files)   TYPE zif_abapgit_definitions=>ty_stage_tt.
+    METHODS add_view_sub_menu
+      IMPORTING
+        io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+ 
+    METHODS render_content
+        REDEFINITION .
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_view,
+        hidden_chars    TYPE abap_bool,
+        ignore_indent   TYPE abap_bool,
+        ignore_comments TYPE abap_bool,
+        ignore_case     TYPE abap_bool,
+      END OF ty_view.
+    DATA mt_delayed_lines TYPE zif_abapgit_definitions=>ty_diffs_tt .
+    DATA mv_repo_key TYPE zif_abapgit_persistence=>ty_repo-key .
+    DATA mv_seed TYPE string .                    " Unique page id to bind JS sessionStorage
+    DATA ms_view TYPE ty_view.
+ 
+    METHODS render_diff
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_diff_head
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_table_head
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_beacon
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_line_no_diffs
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_line_split
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff
+        !iv_filename   TYPE string
+        !iv_fstate     TYPE char1
+        !iv_index      TYPE sy-tabix
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_line_unified
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS append_diff
+      IMPORTING
+        !it_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+        !it_local  TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !is_status TYPE zif_abapgit_definitions=>ty_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_binary
+      IMPORTING
+        !iv_d1        TYPE xstring
+        !iv_d2        TYPE xstring
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS add_jump_sub_menu
+      IMPORTING
+        !io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS add_filter_sub_menu
+      IMPORTING
+        !io_menu TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS render_lines
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_table_head_unified
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_file_requested
+      IMPORTING
+        it_files                    TYPE zif_abapgit_definitions=>ty_stage_tt
+        is_status                   TYPE zif_abapgit_definitions=>ty_result
+      RETURNING
+        VALUE(rv_is_file_requested) TYPE abap_bool.
+    METHODS has_diffs
+      IMPORTING
+        !it_diffs           TYPE zif_abapgit_definitions=>ty_diffs_tt
+      RETURNING
+        VALUE(rv_has_diffs) TYPE abap_bool.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION.
+ 
+ 
+  METHOD add_filter_sub_menu.
+
+    DATA:
+      lo_sub_filter TYPE REF TO zcl_abapgit_html_toolbar,
+      lv_user       TYPE string,
+      lt_extensions TYPE SORTED TABLE OF string WITH UNIQUE DEFAULT KEY,
+      lt_obj_types  TYPE SORTED TABLE OF string WITH UNIQUE DEFAULT KEY,
+      lt_users      TYPE SORTED TABLE OF string WITH UNIQUE DEFAULT KEY.
+
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff_files,
+                   <lv_i>    TYPE string.
+
+    " Get unique filter values
+    LOOP AT mt_diff_files ASSIGNING <ls_diff>.
+      lv_user = <ls_diff>-changed_by.
+      INSERT <ls_diff>-type INTO TABLE lt_extensions.
+      INSERT <ls_diff>-obj_type INTO TABLE lt_obj_types.
+      INSERT lv_user INTO TABLE lt_users.
+    ENDLOOP.
+
+    IF lines( lt_extensions ) > 1 OR lines( lt_obj_types ) > 1 OR lines( lt_users ) > 1.
+      CREATE OBJECT lo_sub_filter EXPORTING iv_id = 'diff-filter'.
+
+      IF lines( lt_users ) > 1.
+        lo_sub_filter->add( iv_txt = 'Only my changes'
+                            iv_typ = zif_abapgit_html=>c_action_type-onclick
+                            iv_aux = |{ sy-uname }|
+                            iv_chk = abap_false ).
+      ENDIF.
+
+      " File extensions
+      IF lines( lt_extensions ) > 1.
+        lo_sub_filter->add( iv_txt = 'Extension'
+                            iv_typ = zif_abapgit_html=>c_action_type-separator ).
+        LOOP AT lt_extensions ASSIGNING <lv_i>.
+          lo_sub_filter->add( iv_txt = <lv_i>
+                       iv_typ = zif_abapgit_html=>c_action_type-onclick
+                       iv_aux = 'extension'
+                       iv_chk = abap_true ).
+        ENDLOOP.
+      ENDIF.
+
+      " Object types
+      IF lines( lt_obj_types ) > 1.
+        lo_sub_filter->add( iv_txt = 'Object Type'
+                            iv_typ = zif_abapgit_html=>c_action_type-separator ).
+        LOOP AT lt_obj_types ASSIGNING <lv_i>.
+          lo_sub_filter->add( iv_txt = <lv_i>
+                       iv_typ = zif_abapgit_html=>c_action_type-onclick
+                       iv_aux = 'object-type'
+                       iv_chk = abap_true ).
+        ENDLOOP.
+      ENDIF.
+
+      " Changed by
+      IF lines( lt_users ) > 1.
+        lo_sub_filter->add( iv_txt = 'Changed By'
+                            iv_typ = zif_abapgit_html=>c_action_type-separator ).
+        LOOP AT lt_users ASSIGNING <lv_i>.
+          lo_sub_filter->add( iv_txt = <lv_i>
+                       iv_typ = zif_abapgit_html=>c_action_type-onclick
+                       iv_aux = 'changed-by'
+                       iv_chk = abap_true ).
+        ENDLOOP.
+      ENDIF.
+
+      io_menu->add( iv_txt = 'Filter'
+                    io_sub = lo_sub_filter ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_jump_sub_menu.
+
+    DATA: lo_sub_jump    TYPE REF TO zcl_abapgit_html_toolbar,
+          lv_jump_target TYPE string.
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff_files.
+
+    CREATE OBJECT lo_sub_jump EXPORTING iv_id = 'jump'.
+
+    LOOP AT mt_diff_files ASSIGNING <ls_diff>.
+
+      lv_jump_target = <ls_diff>-path && <ls_diff>-filename.
+
+      lo_sub_jump->add(
+          iv_id  = |li_jump_{ sy-tabix }|
+          iv_txt = lv_jump_target
+          iv_typ = zif_abapgit_html=>c_action_type-onclick ).
+
+    ENDLOOP.
+
+    io_menu->add( iv_txt = 'Jump'
+                  io_sub = lo_sub_jump ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_menu_begin.
+
+    io_menu->add(
+        iv_txt   = c_action_texts-refresh_local
+        iv_typ   = zif_abapgit_html=>c_action_type-sapevent
+        iv_act   = c_actions-refresh_local
+        iv_id    = c_actions-refresh_local
+        iv_title = c_action_titles-refresh_local ).
+
+    io_menu->add(
+        iv_txt   = c_action_texts-refresh_all
+        iv_typ   = zif_abapgit_html=>c_action_type-sapevent
+        iv_act   = c_actions-refresh_all
+        iv_id    = c_actions-refresh_all
+        iv_title = c_action_titles-refresh_all ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_menu_end.
+
+    io_menu->add( iv_txt = 'Split/Unified'
+                  iv_act = c_actions-toggle_unified ).
+
+    add_view_sub_menu( io_menu ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_view_sub_menu.
+
+    DATA lo_sub_view TYPE REF TO zcl_abapgit_html_toolbar.
+
+    CREATE OBJECT lo_sub_view EXPORTING iv_id = 'diff-view'.
+
+    lo_sub_view->add( iv_txt = 'Show Hidden Characters'
+                      iv_act = c_actions-toggle_hidden_chars
+                      iv_chk = ms_view-hidden_chars ).
+
+    lo_sub_view->add( iv_txt = 'Ignore Whitespace'
+                      iv_act = c_actions-toggle_ignore_indent
+                      iv_chk = ms_view-ignore_indent ).
+
+    lo_sub_view->add( iv_txt = 'Ignore Comments'
+                      iv_act = c_actions-toggle_ignore_comments
+                      iv_chk = ms_view-ignore_comments ).
+
+    lo_sub_view->add( iv_txt = 'Ignore Pretty-Print Case'
+                      iv_act = c_actions-toggle_ignore_case
+                      iv_chk = ms_view-ignore_case ).
+
+    io_menu->add( iv_txt = 'View'
+                  io_sub = lo_sub_view ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD append_diff.
+
+    DATA:
+      lv_offs    TYPE i,
+      ls_r_dummy LIKE LINE OF it_remote ##NEEDED,
+      ls_l_dummy LIKE LINE OF it_local  ##NEEDED.
+
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF it_remote,
+                   <ls_local>  LIKE LINE OF it_local,
+                   <ls_diff>   LIKE LINE OF mt_diff_files.
+
+
+    READ TABLE it_remote ASSIGNING <ls_remote>
+      WITH KEY file_path
+       COMPONENTS path     = is_status-path
+                  filename = is_status-filename.
+    IF sy-subrc <> 0.
+      ASSIGN ls_r_dummy TO <ls_remote>.
+    ENDIF.
+
+    READ TABLE it_local ASSIGNING <ls_local>
+      WITH KEY file-filename = is_status-filename
+               file-path     = is_status-path.
+    IF sy-subrc <> 0.
+      ASSIGN ls_l_dummy TO <ls_local>.
+    ENDIF.
+
+    IF <ls_local> IS INITIAL AND <ls_remote> IS INITIAL.
+      zcx_abapgit_exception=>raise( |DIFF: file not found { is_status-filename }| ).
+    ENDIF.
+
+    APPEND INITIAL LINE TO mt_diff_files ASSIGNING <ls_diff>.
+    <ls_diff>-path     = is_status-path.
+    <ls_diff>-filename = is_status-filename.
+    <ls_diff>-obj_type = is_status-obj_type.
+    <ls_diff>-obj_name = is_status-obj_name.
+    <ls_diff>-lstate   = is_status-lstate.
+    <ls_diff>-rstate   = is_status-rstate.
+
+    IF <ls_diff>-lstate IS NOT INITIAL AND <ls_diff>-rstate IS NOT INITIAL.
+      <ls_diff>-fstate = c_fstate-both.
+    ELSEIF <ls_diff>-lstate IS NOT INITIAL.
+      <ls_diff>-fstate = c_fstate-local.
+    ELSE. "rstate IS NOT INITIAL, lstate = empty.
+      <ls_diff>-fstate = c_fstate-remote.
+    ENDIF.
+
+    " Changed by
+    IF <ls_local>-item-obj_type IS NOT INITIAL.
+      <ls_diff>-changed_by = zcl_abapgit_objects=>changed_by(
+        is_item     = <ls_local>-item
+        iv_filename = is_status-filename ).
+    ENDIF.
+    IF <ls_diff>-changed_by IS INITIAL.
+      <ls_diff>-changed_by = zcl_abapgit_objects_super=>c_user_unknown.
+    ENDIF.
+
+    " Extension
+    IF <ls_local>-file-filename IS NOT INITIAL.
+      <ls_diff>-type = reverse( <ls_local>-file-filename ).
+    ELSE.
+      <ls_diff>-type = reverse( <ls_remote>-filename ).
+    ENDIF.
+
+    FIND FIRST OCCURRENCE OF '.' IN <ls_diff>-type MATCH OFFSET lv_offs.
+    <ls_diff>-type = reverse( substring( val = <ls_diff>-type
+                                         len = lv_offs ) ).
+    IF <ls_diff>-type <> 'xml' AND <ls_diff>-type <> 'abap'.
+      <ls_diff>-type = 'other'.
+    ENDIF.
+
+    IF <ls_diff>-type = 'other'
+       AND is_binary( iv_d1 = <ls_remote>-data
+                      iv_d2 = <ls_local>-file-data ) = abap_true.
+      <ls_diff>-type = 'binary'.
+    ENDIF.
+
+    " Diff data
+    IF <ls_diff>-type <> 'binary'.
+      IF <ls_diff>-fstate = c_fstate-remote. " Remote file leading changes
+        CREATE OBJECT <ls_diff>-o_diff
+          EXPORTING
+            iv_new                = <ls_remote>-data
+            iv_old                = <ls_local>-file-data
+            iv_ignore_indentation = ms_view-ignore_indent
+            iv_ignore_comments    = ms_view-ignore_comments
+            iv_ignore_case        = ms_view-ignore_case.
+      ELSE.             " Local leading changes or both were modified
+        CREATE OBJECT <ls_diff>-o_diff
+          EXPORTING
+            iv_new                = <ls_local>-file-data
+            iv_old                = <ls_remote>-data
+            iv_ignore_indentation = ms_view-ignore_indent
+            iv_ignore_comments    = ms_view-ignore_comments
+            iv_ignore_case        = ms_view-ignore_case.
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-main'.
+ 
+    add_menu_begin( ro_menu ).
+    add_jump_sub_menu( ro_menu ).
+    add_filter_sub_menu( ro_menu ).
+    add_menu_end( ro_menu ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD calculate_diff.
+
+    DATA: lt_remote TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lt_local  TYPE zif_abapgit_definitions=>ty_files_item_tt,
+          lt_status TYPE zif_abapgit_definitions=>ty_results_tt.
+
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+
+    FIELD-SYMBOLS: <ls_status> LIKE LINE OF lt_status.
+
+    CLEAR: mt_diff_files.
+
+    lt_remote = mo_repo->get_files_remote( ).
+    lt_local  = mo_repo->get_files_local( ).
+    mo_repo->reset_status( ).
+    lt_status = mo_repo->status( ).
+
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+    li_exit->pre_calculate_repo_status(
+      EXPORTING
+        is_repo_meta = mo_repo->ms_data
+      CHANGING
+        ct_local  = lt_local
+        ct_remote = lt_remote ).
+
+    IF is_file IS NOT INITIAL.        " Diff for one file
+
+      READ TABLE lt_status ASSIGNING <ls_status>
+        WITH KEY path = is_file-path filename = is_file-filename.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |File { is_file-path }{ is_file-filename } not found| ).
+      ENDIF.
+
+      append_diff( it_remote = lt_remote
+                   it_local  = lt_local
+                   is_status = <ls_status> ).
+
+    ELSEIF is_object IS NOT INITIAL.  " Diff for whole object
+
+      LOOP AT lt_status ASSIGNING <ls_status>
+          USING KEY sec_key
+          WHERE obj_type = is_object-obj_type
+          AND obj_name = is_object-obj_name
+          AND match IS INITIAL.
+        append_diff( it_remote = lt_remote
+                     it_local  = lt_local
+                     is_status = <ls_status> ).
+      ENDLOOP.
+
+    ELSE.                             " Diff for the whole repo
+
+      SORT lt_status BY
+        path ASCENDING
+        filename ASCENDING.
+      LOOP AT lt_status ASSIGNING <ls_status> WHERE match IS INITIAL.
+
+        IF is_file_requested( it_files  = it_files
+                              is_status = <ls_status> ) = abap_true.
+
+          append_diff( it_remote = lt_remote
+                       it_local  = lt_local
+                       is_status = <ls_status> ).
+
+        ENDIF.
+
+      ENDLOOP.
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lv_ts TYPE timestamp.
+ 
+    super->constructor( ).
+    ms_control-page_title = 'Diff'.
+    mv_unified            = zcl_abapgit_persistence_user=>get_instance( )->get_diff_unified( ).
+    set_layout( ).
+    mv_repo_key           = iv_key.
+    mo_repo              ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    GET TIME STAMP FIELD lv_ts.
+    mv_seed = |diff{ lv_ts }|. " Generate based on time
+ 
+    ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed
+ 
+    calculate_diff(
+        is_file   = is_file
+        is_object = is_object
+        it_files  = it_files ).
+ 
+    IF lines( mt_diff_files ) = 0.
+      zcx_abapgit_exception=>raise(
+        'There are no differences to show. The local state completely matches the remote repository.' ).
+    ENDIF.
+ 
+    ms_control-page_menu = build_menu( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_normalized_fname_with_path.
+ 
+    rv_filename = normalize_path( is_diff-path )
+               && `_`
+               && normalize_filename( is_diff-filename ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD has_diffs.
+ 
+    LOOP AT it_diffs TRANSPORTING NO FIELDS WHERE result IS NOT INITIAL.
+      rv_has_diffs = abap_true.
+      EXIT.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_nav.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_binary.
+ 
+    FIELD-SYMBOLS <lv_data> LIKE iv_d1.
+ 
+    IF iv_d1 IS NOT INITIAL. " One of them might be new and so empty
+      ASSIGN iv_d1 TO <lv_data>.
+    ELSE.
+      ASSIGN iv_d2 TO <lv_data>.
+    ENDIF.
+ 
+    rv_yes = zcl_abapgit_utils=>is_binary( <lv_data> ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_file_requested.
+ 
+    IF lines( it_files ) = 0.
+      rv_is_file_requested = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE it_files WITH KEY file-path     = is_status-path
+                                 file-filename = is_status-filename
+                        TRANSPORTING NO FIELDS.
+    rv_is_file_requested = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_refresh.
+ 
+    FIND FIRST OCCURRENCE OF REGEX |^{ c_actions-refresh_prefix }| IN iv_action.
+    rv_is_refrseh = boolc( sy-subrc = 0 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD modify_files_before_diff_calc.
+ 
+    DATA ls_file LIKE LINE OF rt_files.
+ 
+    FIELD-SYMBOLS <ls_diff_file_old> TYPE ty_file_diff.
+ 
+    " We need to supply files again in calculate_diff. Because
+    " we only want to refresh the visible files. Otherwise all
+    " diff files would appear.
+    " Which is not wanted when we previously only selected particular files.
+    LOOP AT it_diff_files_old ASSIGNING <ls_diff_file_old>.
+      CLEAR ls_file.
+      MOVE-CORRESPONDING <ls_diff_file_old> TO ls_file-file.
+      INSERT ls_file INTO TABLE rt_files.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_filename.
+ 
+    rv_normalized = replace( val  = iv_filename
+                             sub  = '.'
+                             occ  = 0
+                             with = '_' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_path.
+ 
+    rv_normalized = replace( val  = iv_path
+                             sub  = '/'
+                             occ  = 0
+                             with = '_' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh.
+
+    DATA:
+      lt_diff_files_old TYPE ty_file_diffs,
+      lt_files          TYPE zif_abapgit_definitions=>ty_stage_tt.
+
+
+    lt_diff_files_old = mt_diff_files.
+
+    CASE iv_action.
+      WHEN c_actions-refresh_all.
+        refresh_full( ).
+      WHEN c_actions-refresh_local.
+        refresh_local( ).
+      WHEN OTHERS.
+        refresh_local_object( iv_action ).
+    ENDCASE.
+
+    lt_files = modify_files_before_diff_calc( lt_diff_files_old ).
+
+    calculate_diff( it_files = lt_files ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_full.
+    mo_repo->refresh( abap_true ).
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local.
+    mo_repo->refresh_local_objects( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local_object.
+
+    DATA:
+      lv_regex    TYPE string,
+      lv_obj_type TYPE tadir-object,
+      lv_obj_name TYPE tadir-obj_name.
+
+    lv_regex = c_actions-refresh_local_object && `_(\w{4})_(.*)`.
+
+    FIND FIRST OCCURRENCE OF REGEX lv_regex
+      IN iv_action
+      SUBMATCHES lv_obj_type lv_obj_name.
+
+    IF sy-subrc = 0.
+      mo_repo->refresh_local_object(
+          iv_obj_type = lv_obj_type
+          iv_obj_name = lv_obj_name ).
+    ELSE.
+      zcx_abapgit_exception=>raise( |Invalid refresh action { iv_action }| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_beacon.
+ 
+    DATA: lv_beacon  TYPE string,
+          lt_beacons TYPE zif_abapgit_definitions=>ty_string_tt.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF is_diff_line-beacon > 0.
+      lt_beacons = is_diff-o_diff->get_beacons( ).
+      READ TABLE lt_beacons INTO lv_beacon INDEX is_diff_line-beacon.
+    ELSE.
+      lv_beacon = '---'.
+    ENDIF.
+ 
+    ri_html->add( '<thead class="nav_line">' ).
+    ri_html->add( '<tr>' ).
+ 
+    render_beacon_begin_of_row(
+      ii_html = ri_html
+      is_diff = is_diff ).
+ 
+    IF mv_unified = abap_true.
+      ri_html->add( '<th class="num"></th>' ).
+      ri_html->add( '<th class="mark"></th>' ).
+      ri_html->add( |<th>@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
+    ELSE.
+      ri_html->add( |<th colspan="6">@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
+    ENDIF.
+ 
+    ri_html->add( '</tr>' ).
+    ri_html->add( '</thead>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_beacon_begin_of_row.
+
+    ii_html->add( '<th class="num"></th>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    DATA: ls_diff_file LIKE LINE OF mt_diff_files,
+          li_progress  TYPE REF TO zif_abapgit_progress.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    li_progress = zcl_abapgit_progress=>get_instance( lines( mt_diff_files ) ).
+ 
+    ri_html->add( `<div class="repo">` ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( mo_repo ) ).
+    ri_html->add( `</div>` ).
+ 
+    ri_html->add( |<div id="diff-list" data-repo-key="{ mv_repo_key }">| ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_js_error_banner( ) ).
+    LOOP AT mt_diff_files INTO ls_diff_file.
+      li_progress->show(
+        iv_current = sy-tabix
+        iv_text    = |Render Diff - { ls_diff_file-filename }| ).
+ 
+      ri_html->add( render_diff( ls_diff_file ) ).
+    ENDLOOP.
+    IF sy-subrc <> 0.
+      ri_html->add( |No more diffs| ).
+    ENDIF.
+    ri_html->add( '</div>' ).
+ 
+    register_deferred_script( render_scripts( ) ).
+ 
+    li_progress->off( ).
+ 
+    register_handlers( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<div class="diff" data-extension="{ is_diff-type
+      }" data-object-type="{ is_diff-obj_type
+      }" data-changed-by="{ is_diff-changed_by
+      }" data-file="{ is_diff-path && is_diff-filename }">| ).
+    ri_html->add( render_diff_head( is_diff ) ).
+ 
+    " Content
+    IF is_diff-type <> 'binary'.
+      ri_html->add( '<div class="diff_content">' ).
+      ri_html->add( |<table class="diff_tab syntax-hl" id="{ is_diff-filename }">| ).
+      ri_html->add( render_table_head( is_diff ) ).
+      ri_html->add( render_lines( is_diff ) ).
+      ri_html->add( '</table>' ).
+    ELSE.
+      ri_html->add( '<div class="diff_content paddings center grey">' ).
+      ri_html->add( 'The content seems to be binary.' ).
+      ri_html->add( 'Cannot display as diff.' ).
+    ENDIF.
+    ri_html->add( '</div>' ).
+ 
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff_head.
+ 
+    DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count,
+          lv_jump  TYPE string,
+          lv_link  TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="diff_head">' ).
+ 
+    ri_html->add_icon(
+      iv_name    = 'chevron-down'
+      iv_hint    = 'Collapse/Expand'
+      iv_class   = 'cursor-pointer'
+      iv_onclick = 'onDiffCollapse(event)' ).
+ 
+    IF is_diff-type <> 'binary'.
+      ls_stats = is_diff-o_diff->stats( ).
+      IF is_diff-fstate = c_fstate-both. " Merge stats into 'update' if both were changed
+        ls_stats-update = ls_stats-update + ls_stats-insert + ls_stats-delete.
+        CLEAR: ls_stats-insert, ls_stats-delete.
+      ENDIF.
+ 
+      ri_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
+      ri_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
+      ri_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
+    ENDIF.
+ 
+    " no links for nonexistent or deleted objects
+    IF NOT ( is_diff-lstate = zif_abapgit_definitions=>c_state-unchanged AND
+             is_diff-rstate = zif_abapgit_definitions=>c_state-added ) AND
+         NOT is_diff-lstate = zif_abapgit_definitions=>c_state-deleted.
+ 
+      lv_jump = zcl_abapgit_html_action_utils=>jump_encode(
+        iv_obj_type = |{ is_diff-obj_type }|
+        iv_obj_name = |{ is_diff-obj_name }|
+        iv_filename = is_diff-filename ).
+ 
+      lv_link = ri_html->a(
+        iv_txt = |{ is_diff-path }{ is_diff-filename }|
+        iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_jump }| ).
+    ENDIF.
+ 
+    IF lv_link IS NOT INITIAL.
+      ri_html->add( |<span class="diff_name">{ lv_link }</span>| ).
+    ELSE.
+      ri_html->add( |<span class="diff_name">{ is_diff-path }{ is_diff-filename }</span>| ).
+    ENDIF.
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state(
+      iv_lstate = is_diff-lstate
+      iv_rstate = is_diff-rstate ) ).
+ 
+    render_diff_head_after_state(
+      ii_html = ri_html
+      is_diff = is_diff ).
+ 
+    ri_html->add( '<span class="diff_changed_by">Last Changed by: ' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( is_diff-changed_by ) ).
+    ri_html->add( '</span>' ).
+ 
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff_head_after_state.
+
+    IF is_diff-fstate = c_fstate-both AND mv_unified = abap_true.
+      ii_html->add( '<span class="attention pad-sides">Attention: Unified mode'
+                 && ' highlighting for MM assumes local file is newer ! </span>' ).
+    ENDIF.
+
+    IF is_diff-obj_type IS NOT INITIAL AND is_diff-obj_name IS NOT INITIAL.
+      ii_html->add( '<span class="repo_name">' ).
+      ii_html->add_a( iv_txt   = ii_html->icon( iv_name  = 'redo-alt-solid'
+                                                iv_class = 'pad-sides'
+                                                iv_hint  = 'Local refresh of this object' )
+                      iv_act   = |{ c_actions-refresh_local_object }_{ is_diff-obj_type }_{ is_diff-obj_name }|
+                      iv_class = |url| ).
+      ii_html->add( '</span>' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_lines.
+ 
+    DATA: lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter,
+          lt_diffs       TYPE zif_abapgit_definitions=>ty_diffs_tt,
+          lv_insert_nav  TYPE abap_bool,
+          lv_tabix       TYPE syst-tabix.
+ 
+    FIELD-SYMBOLS <ls_diff> LIKE LINE OF lt_diffs.
+    FIELD-SYMBOLS <ls_diff_line> LIKE LINE OF lt_diffs.
+ 
+    lo_highlighter = zcl_abapgit_syntax_factory=>create( iv_filename     = is_diff-filename
+                                                         iv_hidden_chars = ms_view-hidden_chars ).
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lt_diffs = is_diff-o_diff->get( ).
+ 
+    IF has_diffs( lt_diffs ) = abap_false.
+      ri_html->add( render_line_no_diffs( ) ).
+      RETURN.
+    ENDIF.
+ 
+    lv_insert_nav = insert_nav( ).
+ 
+    LOOP AT lt_diffs ASSIGNING <ls_diff>.
+ 
+      lv_tabix = sy-tabix.
+ 
+      IF <ls_diff>-short = abap_false.
+        lv_insert_nav = abap_true.
+        CONTINUE.
+      ENDIF.
+ 
+      IF lv_insert_nav = abap_true. " Insert separator line with navigation
+        " Get line where diff really starts
+        READ TABLE lt_diffs ASSIGNING <ls_diff_line> INDEX lv_tabix + 8.
+        IF sy-subrc <> 0.
+          " Occurs only for small files/diffs with less than 8 lines.
+          " Therefore let's use the first line as beacon
+          ASSIGN <ls_diff> TO <ls_diff_line>.
+          ASSERT <ls_diff_line> IS ASSIGNED.
+        ENDIF.
+        ri_html->add( render_beacon( is_diff_line = <ls_diff_line>
+                                     is_diff      = is_diff ) ).
+        lv_insert_nav = abap_false.
+      ENDIF.
+ 
+      IF lo_highlighter IS BOUND.
+        <ls_diff>-new = lo_highlighter->process_line( <ls_diff>-new ).
+        <ls_diff>-old = lo_highlighter->process_line( <ls_diff>-old ).
+      ELSE.
+        <ls_diff>-new = escape( val    = <ls_diff>-new
+                                format = cl_abap_format=>e_html_attr ).
+        <ls_diff>-old = escape( val    = <ls_diff>-old
+                                format = cl_abap_format=>e_html_attr ).
+      ENDIF.
+ 
+      CONDENSE <ls_diff>-new_num. "get rid of leading spaces
+      CONDENSE <ls_diff>-old_num.
+ 
+      IF mv_unified = abap_true.
+        ri_html->add( render_line_unified( is_diff_line = <ls_diff> ) ).
+      ELSE.
+        ri_html->add( render_line_split( is_diff_line = <ls_diff>
+                                         iv_filename  = get_normalized_fname_with_path( is_diff )
+                                         iv_fstate    = is_diff-fstate
+                                         iv_index     = lv_tabix ) ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF mv_unified = abap_true.
+      ri_html->add( render_line_unified( ) ). " Release delayed lines
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_no_diffs.
+ 
+    DATA ls_diff_line TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF mv_unified = abap_true.
+      ls_diff_line-old = 'No diffs found'.
+      ri_html->add( render_line_unified( is_diff_line = ls_diff_line ) ).
+    ELSE.
+      ls_diff_line-new = 'No diffs found'.
+      ri_html->add( render_line_split( is_diff_line = ls_diff_line
+                                       iv_filename  = ''
+                                       iv_fstate    = ''
+                                       iv_index     = 1 ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_split.
+ 
+    DATA: lv_new  TYPE string,
+          lv_old  TYPE string,
+          lv_mark TYPE string,
+          lv_bg   TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " Note: CSS classes "new" and "old" are used to enable column-based copy to clipboard
+ 
+    " New line
+    lv_mark = ` `.
+    IF is_diff_line-result IS NOT INITIAL.
+      IF iv_fstate = c_fstate-both OR is_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+        lv_bg = ' diff_upd'.
+        lv_mark = `~`.
+      ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-insert.
+        lv_bg = ' diff_ins'.
+        lv_mark = `+`.
+      ENDIF.
+    ENDIF.
+    lv_new = |<td class="num diff_others" line-num="{ is_diff_line-new_num }"></td>|
+          && |<td class="mark diff_others">{ lv_mark }</td>|
+          && |<td class="code{ lv_bg } diff_left new">{ is_diff_line-new }</td>|.
+ 
+    " Old line
+    CLEAR lv_bg.
+    lv_mark = ` `.
+    IF is_diff_line-result IS NOT INITIAL.
+      IF iv_fstate = c_fstate-both OR is_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+        lv_bg = ' diff_upd'.
+        lv_mark = `~`.
+      ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-delete.
+        lv_bg = ' diff_del'.
+        lv_mark = `-`.
+      ENDIF.
+    ENDIF.
+    lv_old = |<td class="num diff_others" line-num="{ is_diff_line-old_num }"></td>|
+          && |<td class="mark diff_others">{ lv_mark }</td>|
+          && |<td class="code{ lv_bg } diff_right old">{ is_diff_line-old }</td>|.
+ 
+    " render line, inverse sides if remote is newer
+    ri_html->add( '<tr class="diff_line">' ).
+ 
+    render_line_split_row(
+        ii_html                = ri_html
+        iv_filename            = iv_filename
+        is_diff_line           = is_diff_line
+        iv_index               = iv_index
+        iv_fstate              = iv_fstate
+        iv_old                 = lv_old
+        iv_new                 = lv_new ).
+ 
+    ri_html->add( '</tr>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_split_row.
+
+    IF iv_fstate = c_fstate-remote. " Remote file leading changes
+      ii_html->add( iv_old ). " local
+      ii_html->add( iv_new ). " remote
+    ELSE.             " Local leading changes or both were modified
+      ii_html->add( iv_new ). " local
+      ii_html->add( iv_old ). " remote
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_unified.
+ 
+    FIELD-SYMBOLS <ls_diff_line> LIKE LINE OF mt_delayed_lines.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " Note: CSS classes "new" and "old" are used to enable column-based copy to clipboard
+ 
+    " Release delayed subsequent update lines
+    IF is_diff_line-result <> zif_abapgit_definitions=>c_diff-update.
+      LOOP AT mt_delayed_lines ASSIGNING <ls_diff_line>.
+        ri_html->add( '<tr class="diff_line">' ).
+        ri_html->add( |<td class="num diff_others" line-num="{ <ls_diff_line>-old_num }"></td>|
+                   && |<td class="num diff_others" line-num=""></td>|
+                   && |<td class="mark diff_others">-</td>|
+                   && |<td class="code diff_del diff_unified old">{ <ls_diff_line>-old }</td>| ).
+        ri_html->add( '</tr>' ).
+      ENDLOOP.
+      LOOP AT mt_delayed_lines ASSIGNING <ls_diff_line>.
+        ri_html->add( '<tr class="diff_line">' ).
+        ri_html->add( |<td class="num diff_others" line-num=""></td>|
+                   && |<td class="num diff_others" line-num="{ <ls_diff_line>-new_num }"></td>|
+                   && |<td class="mark diff_others">+</td>|
+                   && |<td class="code diff_ins diff_unified new">{ <ls_diff_line>-new }</td>| ).
+        ri_html->add( '</tr>' ).
+      ENDLOOP.
+      CLEAR mt_delayed_lines.
+    ENDIF.
+ 
+    ri_html->add( '<tr class="diff_line">' ).
+    CASE is_diff_line-result.
+      WHEN zif_abapgit_definitions=>c_diff-update.
+        APPEND is_diff_line TO mt_delayed_lines. " Delay output of subsequent updates
+      WHEN zif_abapgit_definitions=>c_diff-insert.
+        ri_html->add( |<td class="num diff_others" line-num=""></td>|
+                   && |<td class="num diff_others" line-num="{ is_diff_line-new_num }"></td>|
+                   && |<td class="mark diff_others">+</td>|
+                   && |<td class="code diff_ins diff_unified new">{ is_diff_line-new }</td>| ).
+      WHEN zif_abapgit_definitions=>c_diff-delete.
+        ri_html->add( |<td class="num diff_others" line-num="{ is_diff_line-old_num }"></td>|
+                   && |<td class="num diff_others" line-num=""></td>|
+                   && |<td class="mark diff_others">-</td>|
+                   && |<td class="code diff_del diff_unified old">{ is_diff_line-old }</td>| ).
+      WHEN OTHERS. "none
+        ri_html->add( |<td class="num diff_others" line-num="{ is_diff_line-old_num }"></td>|
+                   && |<td class="num diff_others" line-num="{ is_diff_line-new_num }"></td>|
+                   && |<td class="mark diff_others">&nbsp;</td>|
+                   && |<td class="code diff_unified">{ is_diff_line-old }</td>| ).
+    ENDCASE.
+    ri_html->add( '</tr>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+ 
+    ri_html->add( 'restoreScrollPosition();' ).
+    ri_html->add( 'var gHelper = new DiffHelper({' ).
+    ri_html->add( |  seed:        "{ mv_seed }",| ).
+    ri_html->add( '  ids: {' ).
+    ri_html->add( '    jump:        "jump",' ).
+    ri_html->add( '    diffList:    "diff-list",' ).
+    ri_html->add( '    filterMenu:  "diff-filter",' ).
+    ri_html->add( '  }' ).
+    ri_html->add( '});' ).
+ 
+    ri_html->add( 'addMarginBottom();' ).
+ 
+    ri_html->add( 'var gGoJumpPalette = new CommandPalette(enumerateJumpAllFiles, {' ).
+    ri_html->add( '  toggleKey: "F2",' ).
+    ri_html->add( '  hotkeyDescription: "Jump to File ..."' ).
+    ri_html->add( '});' ).
+ 
+    " Feature for selecting ABAP code by column and copy to clipboard
+    ri_html->add( 'var columnSelection = new DiffColumnSelection();' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( '<thead class="header">' ).
+    ri_html->add( '<tr>' ).
+ 
+    IF mv_unified = abap_true.
+ 
+      render_table_head_unified( ri_html ).
+ 
+    ELSE.
+ 
+      render_table_head_non_unified(
+          ii_html = ri_html
+          is_diff = is_diff ).
+ 
+    ENDIF.
+ 
+    ri_html->add( '</tr>' ).
+    ri_html->add( '</thead>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head_non_unified.
+
+    ii_html->add( '<th class="num"></th>' ).
+    ii_html->add( '<th class="mark"></th>' ).
+    ii_html->add( '<th>LOCAL</th>' ).
+    ii_html->add( '<th class="num"></th>' ).
+    ii_html->add( '<th class="mark"></th>' ).
+    ii_html->add( '<th>REMOTE</th>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head_unified.
+
+    ii_html->add( '<th class="num">old</th>' ).
+    ii_html->add( '<th class="num">new</th>' ).
+    ii_html->add( '<th class="mark"></th>' ).
+    ii_html->add( '<th>code</th>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_layout.
+
+    IF mv_unified = abap_true.
+      ms_control-page_layout = c_page_layout-centered.
+    ELSE.
+      ms_control-page_layout = c_page_layout-full_width.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA ls_view LIKE ms_view.
+ 
+    ls_view = ms_view.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-toggle_unified. " Toggle file diplay
+ 
+        mv_unified = zcl_abapgit_persistence_user=>get_instance( )->toggle_diff_unified( ).
+        set_layout( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-toggle_hidden_chars. " Toggle display of hidden characters
+ 
+        ms_view-hidden_chars = boolc( ms_view-hidden_chars = abap_false ).
+ 
+      WHEN c_actions-toggle_ignore_indent. " Toggle ignore indentation
+ 
+        ms_view-ignore_indent = boolc( ms_view-ignore_indent = abap_false ).
+ 
+      WHEN c_actions-toggle_ignore_comments. " Toggle ignore comments
+ 
+        ms_view-ignore_comments = boolc( ms_view-ignore_comments = abap_false ).
+ 
+      WHEN c_actions-toggle_ignore_case. " Toggle case sensitivity
+ 
+        ms_view-ignore_case = boolc( ms_view-ignore_case = abap_false ).
+ 
+      WHEN OTHERS.
+ 
+        IF is_refresh( ii_event->mv_action ) = abap_true.
+ 
+          refresh( ii_event->mv_action ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+        ELSE.
+ 
+          rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+ 
+        ENDIF.
+ 
+    ENDCASE.
+ 
+    " If view has changed, refresh local files recalculating diff, and update menu
+    IF ms_view <> ls_view.
+      refresh( c_actions-refresh_local ).
+      ms_control-page_menu = build_menu( ).
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = 'Diff'.
+ 
+    ls_hotkey_action-description = |Refresh Local|.
+    ls_hotkey_action-action      = c_actions-refresh_local.
+    ls_hotkey_action-hotkey      = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Refresh All|.
+    ls_hotkey_action-action      = c_actions-refresh_all.
+    ls_hotkey_action-hotkey      = |a|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Toogle Split/Unified|.
+    ls_hotkey_action-action      = c_actions-toggle_unified.
+    ls_hotkey_action-hotkey      = |u|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Toogle Hidden Characters|.
+    ls_hotkey_action-action      = c_actions-toggle_hidden_chars.
+    ls_hotkey_action-hotkey      = |h|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_ex_object.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_ex_object.clas.abap.html new file mode 100644 index 00000000000..94f535c9dc0 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_ex_object.clas.abap.html @@ -0,0 +1,616 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_ex_object.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_ex_object.clas.abap

+
+ +
+ 87% + Statements + 154/177 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 87% + Lines + 154/177 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +1781x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_ex_object DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS:
+      BEGIN OF c_id,
+        object_type TYPE string VALUE 'object_type',
+        object_name TYPE string VALUE 'object_name',
+        only_main   TYPE string VALUE 'only_main',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        go_back            TYPE string VALUE 'go-back',
+        export             TYPE string VALUE 'export',
+        choose_object_type TYPE string VALUE 'choose-object-type',
+      END OF c_event.
+ 
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+ 
+    METHODS export_object
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_EX_OBJECT IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+ 
+    CREATE OBJECT mo_form_data.
+    mo_form_data->set(
+      iv_key = c_id-only_main
+      iv_val = abap_true ).
+ 
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_ex_object.
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Export Objects to Files'
+      ii_child_component = lo_component ).
+  ENDMETHOD.
+ 
+ 
+  METHOD export_object.
+    DATA lv_object_type TYPE trobjtype.
+    DATA lt_names TYPE STANDARD TABLE OF sobj_name WITH DEFAULT KEY.
+    DATA lv_name LIKE LINE OF lt_names.
+    DATA lv_list TYPE string.
+    DATA lv_only_main TYPE abap_bool.
+
+    lv_object_type = mo_form_data->get( c_id-object_type ).
+    lv_list = mo_form_data->get( c_id-object_name ).
+    lv_only_main = mo_form_data->get( c_id-only_main ).
+
+    REPLACE ALL OCCURRENCES OF |\r| IN lv_list WITH ''.
+    SPLIT lv_list AT |\n| INTO TABLE lt_names.
+
+    LOOP AT lt_names INTO lv_name.
+      IF lv_name IS INITIAL.
+        CONTINUE.
+      ENDIF.
+      zcl_abapgit_zip=>export_object(
+        iv_main_language_only = lv_only_main
+        iv_object_type        = lv_object_type
+        iv_object_name        = lv_name ).
+    ENDLOOP.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+    ro_form = zcl_abapgit_html_form=>create( iv_form_id = 'export-object-to-files' ).
+ 
+    ro_form->text(
+      iv_label       = 'Object Type'
+      iv_name        = c_id-object_type
+      iv_required    = abap_true
+      iv_upper_case  = abap_true
+      iv_side_action = c_event-choose_object_type ).
+ 
+    ro_form->textarea(
+      iv_label       = 'Object Names'
+      iv_name        = c_id-object_name
+      iv_required    = abap_true
+      iv_placeholder = 'One object name per line'
+      iv_upper_case  = abap_true ).
+ 
+    ro_form->checkbox(
+      iv_label = 'Only Main Language'
+      iv_name  = c_id-only_main ).
+ 
+    ro_form->command(
+      iv_label       = 'Export'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-export
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = c_event-go_back ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-go_back.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-export.
+ 
+        export_object( ).
+        MESSAGE 'Object successfully exported' TYPE 'S'.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-choose_object_type.
+ 
+        mo_form_data->set(
+          iv_key = c_id-object_type
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( 'TADIR-OBJECT' ) ).
+ 
+        IF mo_form_data->get( c_id-object_type ) IS NOT INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="form-container">' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( '</div>' ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_ex_pckage.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_ex_pckage.clas.abap.html new file mode 100644 index 00000000000..28e40d02196 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_ex_pckage.clas.abap.html @@ -0,0 +1,598 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_ex_pckage.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_ex_pckage.clas.abap

+
+ +
+ 92.39% + Statements + 158/171 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 92.39% + Lines + 158/171 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +1721x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_ex_pckage DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CONSTANTS:
+      BEGIN OF c_id,
+        package        TYPE string VALUE 'package',
+        folder_logic   TYPE string VALUE 'folder_logic',
+        main_lang_only TYPE string VALUE 'main_lang_only',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        go_back        TYPE string VALUE 'go-back',
+        export_package TYPE string VALUE 'export-package',
+        choose_package TYPE string VALUE 'choose-object-type',
+      END OF c_event.
+ 
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+ 
+    METHODS export_package
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_EX_PCKAGE IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_ex_pckage.
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Export Package to ZIP'
+      ii_child_component = lo_component ).
+  ENDMETHOD.
+ 
+ 
+  METHOD export_package.
+    DATA lv_package TYPE devclass.
+    DATA lv_folder_logic TYPE string.
+    DATA lv_main_lang_only TYPE abap_bool.
+
+    lv_package        = mo_form_data->get( c_id-package ).
+    lv_folder_logic   = mo_form_data->get( c_id-folder_logic ).
+    lv_main_lang_only = mo_form_data->get( c_id-main_lang_only ).
+
+    zcl_abapgit_zip=>export_package(
+        iv_package        = lv_package
+        iv_folder_logic   = lv_folder_logic
+        iv_main_lang_only = lv_main_lang_only ).
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+    ro_form = zcl_abapgit_html_form=>create( iv_form_id = 'export-package-to-files' ).
+ 
+    ro_form->text(
+      iv_name          = c_id-package
+      iv_label         = 'Package'
+      iv_required      = abap_true
+      iv_upper_case    = abap_true
+      iv_side_action   = c_event-choose_package
+    )->radio(
+      iv_name          = c_id-folder_logic
+      iv_label         = 'Folder Logic'
+      iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_hint          = 'Define how package folders are named in repository'
+    )->option(
+      iv_label         = 'Prefix'
+      iv_value         = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+    )->option(
+      iv_label         = 'Full'
+      iv_value         = zif_abapgit_dot_abapgit=>c_folder_logic-full
+    )->option(
+      iv_label         = 'Mixed'
+      iv_value         = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+    )->checkbox(
+      iv_name          = c_id-main_lang_only
+      iv_label         = 'Serialize Main Language Only'
+      iv_hint          = 'Ignore translations, serialize just main language'
+    )->command(
+      iv_label         = 'Export Package to ZIP'
+      iv_action        = c_event-export_package
+      iv_cmd_type      = zif_abapgit_html_form=>c_cmd_type-input_main
+    )->command(
+      iv_label         = 'Back'
+      iv_action        = c_event-go_back ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_event-go_back.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-export_package.
+ 
+        mo_validation_log = mo_form_util->validate( mo_form_data ).
+        IF mo_validation_log->is_empty( ) = abap_false.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          export_package( ).
+          MESSAGE 'Package successfully exported' TYPE 'S'.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+        ENDIF.
+ 
+      WHEN c_event-choose_package.
+ 
+        mo_form_data->set(
+          iv_key = c_id-package
+          iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( 'TDEVC-DEVCLASS' ) ).
+ 
+        IF mo_form_data->get( c_id-package ) IS NOT INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDIF.
+    ENDCASE.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_merge.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_merge.clas.abap.html new file mode 100644 index 00000000000..db2ef3d728c --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_merge.clas.abap.html @@ -0,0 +1,814 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_merge.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_merge.clas.abap

+
+ +
+ 92.18% + Statements + 224/243 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 92.18% + Lines + 224/243 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +2441x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_merge DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        io_repo   TYPE REF TO zcl_abapgit_repo_online
+        iv_source TYPE string
+        iv_target TYPE string
+      RAISING
+        zcx_abapgit_exception .
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event
+        REDEFINITION.
+  PROTECTED SECTION.
+    METHODS render_content REDEFINITION.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online .
+    DATA mi_merge TYPE REF TO zif_abapgit_merge .
+    CONSTANTS:
+      BEGIN OF c_actions,
+        merge         TYPE string VALUE 'merge' ##NO_TEXT,
+        res_conflicts TYPE string VALUE 'res_conflicts' ##NO_TEXT,
+      END OF c_actions .
+ 
+    METHODS show_file
+      IMPORTING
+        !it_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt
+        !ii_html     TYPE REF TO zif_abapgit_html
+        !is_file     TYPE zif_abapgit_git_definitions=>ty_expanded
+        !is_result   TYPE zif_abapgit_git_definitions=>ty_expanded .
+    METHODS build_menu
+      IMPORTING
+        VALUE(iv_with_conflict) TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ro_menu)          TYPE REF TO zcl_abapgit_html_toolbar .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_merge IMPLEMENTATION.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu.
+ 
+    ro_menu->add( iv_txt = 'Merge'
+                  iv_act = c_actions-merge
+                  iv_cur = abap_false ).
+ 
+    IF iv_with_conflict = abap_true.
+      ro_menu->add( iv_txt = 'Resolve Conflicts'
+                    iv_act = c_actions-res_conflicts ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    mo_repo = io_repo.
+ 
+    io_repo->select_branch( |{ zif_abapgit_git_definitions=>c_git_branch-heads_prefix }{ iv_target }| ).
+ 
+    CREATE OBJECT mi_merge TYPE zcl_abapgit_merge
+      EXPORTING
+        io_repo          = io_repo
+        iv_source_branch = iv_source.
+    mi_merge->run( ).
+ 
+    ms_control-page_title = 'Merge'.
+    ms_control-page_menu  = build_menu( mi_merge->has_conflicts( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    DATA: ls_merge  TYPE zif_abapgit_merge=>ty_merge,
+          lt_files  LIKE ls_merge-stree,
+          ls_result LIKE LINE OF ls_merge-result.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF lt_files.
+ 
+    ls_merge = mi_merge->get_result( ).
+ 
+    "If now exists no conflicts anymore, conflicts button should disappear
+    ms_control-page_menu = build_menu( mi_merge->has_conflicts( ) ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div id="toc">' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+      io_repo         = mo_repo
+      iv_show_package = abap_false
+      iv_show_branch  = abap_false ) ).
+ 
+    ri_html->add( '<table>' ).
+    ri_html->add( '<tr>' ).
+    ri_html->add( '<td>Source</td>' ).
+    ri_html->add( '<td>' ).
+    ri_html->add( ls_merge-source-name ).
+    ri_html->add( '</td></tr>' ).
+    ri_html->add( '<tr>' ).
+    ri_html->add( '<td>Target</td>' ).
+    ri_html->add( '<td>' ).
+    ri_html->add( ls_merge-target-name ).
+    ri_html->add( '</td></tr>' ).
+    ri_html->add( '<tr>' ).
+    ri_html->add( '<td>Ancestor</td>' ).
+    ri_html->add( '<td>' ).
+    ri_html->add( ls_merge-common-commit ).
+    ri_html->add( '</td></tr>' ).
+    ri_html->add( '</table>' ).
+ 
+    ri_html->add( '<br>' ).
+ 
+    APPEND LINES OF ls_merge-stree TO lt_files.
+    APPEND LINES OF ls_merge-ttree TO lt_files.
+    APPEND LINES OF ls_merge-ctree TO lt_files.
+    SORT lt_files BY path DESCENDING name ASCENDING.
+    DELETE ADJACENT DUPLICATES FROM lt_files COMPARING path name.
+ 
+    ri_html->add( '<table>' ).
+    ri_html->add( '<tr>' ).
+    ri_html->add( '<td><u>Source</u></td>' ).
+    ri_html->add( '<td></td>' ).
+    ri_html->add( '<td><u>Target</u></td>' ).
+    ri_html->add( '<td></td>' ).
+    ri_html->add( '<td><u>Ancestor</u></td>' ).
+    ri_html->add( '<td></td>' ).
+    ri_html->add( '<td><u>Result</u></td>' ).
+    ri_html->add( '<td></td>' ).
+    ri_html->add( '</tr>' ).
+    LOOP AT lt_files ASSIGNING <ls_file>.
+      CLEAR ls_result.
+      READ TABLE ls_merge-result INTO ls_result
+        WITH KEY path = <ls_file>-path name = <ls_file>-name.
+ 
+      ri_html->add( '<tr>' ).
+      show_file( it_expanded = ls_merge-stree
+                 ii_html     = ri_html
+                 is_file     = <ls_file>
+                 is_result   = ls_result ).
+      show_file( it_expanded = ls_merge-ttree
+                 ii_html     = ri_html
+                 is_file     = <ls_file>
+                 is_result   = ls_result ).
+      show_file( it_expanded = ls_merge-ctree
+                 ii_html     = ri_html
+                 is_file     = <ls_file>
+                 is_result   = ls_result ).
+      show_file( it_expanded = ls_merge-result
+                 ii_html     = ri_html
+                 is_file     = <ls_file>
+                 is_result   = ls_result ).
+      ri_html->add( '</tr>' ).
+    ENDLOOP.
+    ri_html->add( '</table>' ).
+    ri_html->add( '<br>' ).
+    ri_html->add( '<b>' ).
+    ri_html->add( ls_merge-conflict ).
+    ri_html->add( '</b>' ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD show_file.
+
+    FIELD-SYMBOLS: <ls_show> LIKE LINE OF it_expanded.
+
+
+    READ TABLE it_expanded ASSIGNING <ls_show>
+        WITH KEY
+        path = is_file-path
+        name = is_file-name.
+    IF sy-subrc = 0.
+      IF <ls_show>-sha1 = is_result-sha1.
+        ii_html->add( |<td>{ <ls_show>-path }{ <ls_show>-name }</td><td><b>{ <ls_show>-sha1(7) }</b></td>| ).
+      ELSE.
+        ii_html->add( |<td>{ <ls_show>-path }{ <ls_show>-name }</td><td>{ <ls_show>-sha1(7) }</td>| ).
+      ENDIF.
+    ELSE.
+      ii_html->add( '<td></td><td></td>' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-merge.
+        IF mi_merge->has_conflicts( ) = abap_true.
+          zcx_abapgit_exception=>raise( 'conflicts exists' ).
+        ENDIF.
+ 
+        IF mi_merge->get_result( )-stage->count( ) = 0.
+          zcx_abapgit_exception=>raise( 'nothing to merge' ).
+        ENDIF.
+ 
+        IF mo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL.
+ 
+          CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_code_insp
+            EXPORTING
+              io_repo  = mo_repo
+              io_stage = mi_merge->get_result( )-stage.
+ 
+        ELSE.
+ 
+          rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+            io_repo  = mo_repo
+            io_stage = mi_merge->get_result( )-stage ).
+ 
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_actions-res_conflicts.
+ 
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_merge_res
+          EXPORTING
+            io_repo       = mo_repo
+            io_merge_page = me
+            io_merge      = mi_merge.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN OTHERS.
+        rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_merge_res.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_merge_res.clas.abap.html new file mode 100644 index 00000000000..235b1e827d7 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_merge_res.clas.abap.html @@ -0,0 +1,1723 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_merge_res.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_merge_res.clas.abap

+
+ +
+ 88.09% + Statements + 481/546 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 88.09% + Lines + 481/546 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +5471x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_merge_res DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        io_repo       TYPE REF TO zcl_abapgit_repo_online
+        io_merge_page TYPE REF TO zcl_abapgit_gui_page_merge
+        io_merge      TYPE REF TO zif_abapgit_merge
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event
+        REDEFINITION .
+  PROTECTED SECTION.
+    METHODS render_content REDEFINITION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_file_diff,
+        path       TYPE string,
+        filename   TYPE string,
+        lstate     TYPE char1,
+        rstate     TYPE char1,
+        fstate     TYPE char1, " FILE state - Abstraction for shorter ifs
+        o_diff     TYPE REF TO zcl_abapgit_diff,
+        changed_by TYPE syuname,
+        type       TYPE string,
+      END OF ty_file_diff .
+ 
+    CONSTANTS:
+      BEGIN OF c_actions,
+        toggle_mode  TYPE string VALUE 'toggle_mode' ##NO_TEXT,
+        apply_merge  TYPE string VALUE 'apply_merge' ##NO_TEXT,
+        apply_source TYPE string VALUE 'apply_source' ##NO_TEXT,
+        apply_target TYPE string VALUE 'apply_target' ##NO_TEXT,
+        cancel       TYPE string VALUE 'cancel' ##NO_TEXT,
+      END OF c_actions .
+    CONSTANTS:
+      BEGIN OF c_merge_mode,
+        selection TYPE string VALUE 'selection' ##NO_TEXT,
+        merge     TYPE string VALUE 'merge' ##NO_TEXT,
+      END OF c_merge_mode .
+    DATA mo_merge TYPE REF TO zif_abapgit_merge .
+    DATA mo_merge_page TYPE REF TO zcl_abapgit_gui_page_merge .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online .
+    DATA ms_diff_file TYPE ty_file_diff .
+    DATA mv_current_conflict_index TYPE sy-tabix .
+    DATA mv_merge_mode TYPE string .
+    DATA mt_conflicts TYPE zif_abapgit_merge=>ty_merge_conflict_tt .
+ 
+    METHODS apply_merged_content
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS is_binary
+      IMPORTING
+        !iv_d1        TYPE xstring
+        !iv_d2        TYPE xstring
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS render_beacon
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_diff
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_diff_head
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_lines
+      IMPORTING
+        !is_diff       TYPE ty_file_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_line_split
+      IMPORTING
+        !is_diff_line  TYPE zif_abapgit_definitions=>ty_diff
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_table_head
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS resolve_diff
+      RAISING
+        zcx_abapgit_exception .
+    METHODS toggle_merge_mode .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_merge_res IMPLEMENTATION.
+ 
+ 
+  METHOD apply_merged_content.
+
+    DATA:
+      lv_merge_content    TYPE string,
+      lv_new_file_content TYPE xstring.
+
+    FIELD-SYMBOLS:
+      <ls_conflict> TYPE zif_abapgit_merge=>ty_merge_conflict.
+
+    lv_merge_content = ii_event->form_data( )->get( 'MERGE_CONTENT' ).
+
+    REPLACE ALL OCCURRENCES
+      OF cl_abap_char_utilities=>cr_lf IN lv_merge_content WITH cl_abap_char_utilities=>newline.
+
+    lv_new_file_content = zcl_abapgit_convert=>string_to_xstring_utf8( lv_merge_content ).
+
+    READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+    <ls_conflict>-result_sha1 = zcl_abapgit_hash=>sha1_blob( lv_new_file_content ).
+    <ls_conflict>-result_data = lv_new_file_content.
+    mo_merge->resolve_conflict( <ls_conflict> ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu.
+    ro_menu->add( iv_txt = 'Toggle merge mode'
+                  iv_act = c_actions-toggle_mode ).
+    ro_menu->add( iv_txt = 'Cancel'
+                  iv_act = c_actions-cancel ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    mo_repo = io_repo.
+    ms_control-page_title = 'Resolve Conflicts'.
+    ms_control-page_menu  = build_menu( ).
+ 
+    mo_merge_page = io_merge_page.
+    mo_merge = io_merge.
+    mv_merge_mode = c_merge_mode-selection.
+    mv_current_conflict_index = 1.
+    mt_conflicts = io_merge->get_conflicts( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_binary.
+ 
+    FIELD-SYMBOLS <lv_data> LIKE iv_d1.
+ 
+ 
+    IF iv_d1 IS NOT INITIAL. " One of them might be new and so empty
+      ASSIGN iv_d1 TO <lv_data>.
+    ELSE.
+      ASSIGN iv_d2 TO <lv_data>.
+    ENDIF.
+ 
+    rv_yes = zcl_abapgit_utils=>is_binary( <lv_data> ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_beacon.
+ 
+    DATA: lv_beacon  TYPE string,
+          lt_beacons TYPE zif_abapgit_definitions=>ty_string_tt.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF is_diff_line-beacon > 0.
+      lt_beacons = is_diff-o_diff->get_beacons( ).
+      READ TABLE lt_beacons INTO lv_beacon INDEX is_diff_line-beacon.
+    ELSE.
+      lv_beacon = '---'.
+    ENDIF.
+ 
+ 
+    ri_html->add( '<thead class="nav_line">' ).
+    ri_html->add( '<tr>' ).
+ 
+    ri_html->add( '<th class="num"></th>' ).
+    ri_html->add( |<th colspan="3">@@ { is_diff_line-new_num } @@ { lv_beacon }</th>| ).
+ 
+    ri_html->add( '</tr>' ).
+    ri_html->add( '</thead>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    resolve_diff( ).
+    IF ms_diff_file IS INITIAL.
+      zcx_abapgit_exception=>raise( 'no conflict found' ).
+    ENDIF.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( |<div id="diff-list" data-repo-key="{ mo_repo->get_key( ) }">| ).
+    ri_html->add( render_diff( ms_diff_file ) ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff.
+ 
+    DATA: lv_target_content TYPE string.
+    FIELD-SYMBOLS: <ls_conflict> TYPE zif_abapgit_merge=>ty_merge_conflict.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<div class="diff" data-type="{ is_diff-type
+      }" data-changed-by="{ is_diff-changed_by
+      }" data-file="{ is_diff-path && is_diff-filename }">| ).
+    ri_html->add( render_diff_head( is_diff ) ).
+ 
+    " Content
+    IF is_diff-type <> 'binary'.
+ 
+      IF mv_merge_mode = c_merge_mode-selection.
+        ri_html->add( '<div class="diff_content">' ).
+        ri_html->add( '<table class="diff_tab syntax-hl">' ).
+        ri_html->add( render_table_head( ) ).
+        ri_html->add( render_lines( is_diff ) ).
+        ri_html->add( '</table>' ).
+        ri_html->add( '</div>' ).
+      ELSE.
+ 
+        "Table for Div-Table and textarea
+        ri_html->add( '<div class="diff_content">' ).
+        ri_html->add( '<table class="w100">' ).
+        ri_html->add( '<thead class="header">' ).
+        ri_html->add( '<tr>' ).
+        ri_html->add( '<th>Code</th>' ).
+        ri_html->add( '<th>Merge - ' ).
+        ri_html->add_a( iv_act = 'submitFormById(''merge_form'');'
+                        iv_txt = 'Apply'
+                        iv_typ = zif_abapgit_html=>c_action_type-onclick
+                        iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+        ri_html->add( '</th> ' ).
+        ri_html->add( '</tr>' ).
+        ri_html->add( '</thead>' ).
+        ri_html->add( '<td>' ).
+ 
+        "Diff-Table of source and target file
+        ri_html->add( '<table class="diff_tab syntax-hl">' ).
+        ri_html->add( render_table_head( ) ).
+        ri_html->add( render_lines( is_diff ) ).
+        ri_html->add( '</table>' ).
+ 
+        READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+        IF sy-subrc = 0.
+          lv_target_content = zcl_abapgit_convert=>xstring_to_string_utf8( <ls_conflict>-target_data ).
+          lv_target_content = escape( val = lv_target_content
+                                      format = cl_abap_format=>e_html_text ).
+        ENDIF.
+ 
+        ri_html->add( '</td>' ).
+        ri_html->add( '<td>' ).
+        ri_html->add( '<div class="form-container">' ).
+        ri_html->add( |<form id="merge_form" class="aligned-form w100" accept-charset="UTF-8"| ).
+        ri_html->add( |method="post" action="sapevent:apply_merge">| ).
+        ri_html->add( |<textarea id="merge_content" name="merge_content" class="w100" | ).
+        ri_html->add( |rows="{ lines( is_diff-o_diff->get( ) ) }">{ lv_target_content }</textarea>| ).
+        ri_html->add( '<input type="submit" class="hidden-submit">' ).
+        ri_html->add( '</form>' ).
+        ri_html->add( '</div>' ).
+        ri_html->add( '</td>' ).
+        ri_html->add( '</table>' ).
+        ri_html->add( '</div>' ).
+      ENDIF.
+    ELSE.
+      ri_html->add( '<div class="diff_content paddings center grey">' ).
+      ri_html->add( 'The content seems to be binary.' ).
+      ri_html->add( 'Cannot display as diff.' ).
+      ri_html->add( '</div>' ).
+    ENDIF.
+ 
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff_head.
+ 
+    DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="diff_head">' ).
+ 
+    IF is_diff-type <> 'binary' AND is_diff-o_diff IS NOT INITIAL.
+      ls_stats = is_diff-o_diff->stats( ).
+      ri_html->add( |<span class="diff_banner diff_ins">+ { ls_stats-insert }</span>| ).
+      ri_html->add( |<span class="diff_banner diff_del">- { ls_stats-delete }</span>| ).
+      ri_html->add( |<span class="diff_banner diff_upd">~ { ls_stats-update }</span>| ).
+    ENDIF.
+ 
+    ri_html->add( |<span class="diff_name">{ is_diff-filename }</span>| ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_lines.
+ 
+    DATA: lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter,
+          lt_diffs       TYPE zif_abapgit_definitions=>ty_diffs_tt,
+          lv_insert_nav  TYPE abap_bool.
+ 
+    FIELD-SYMBOLS <ls_diff>  LIKE LINE OF lt_diffs.
+ 
+    lo_highlighter = zcl_abapgit_syntax_factory=>create( is_diff-filename ).
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lt_diffs = is_diff-o_diff->get( ).
+ 
+    LOOP AT lt_diffs ASSIGNING <ls_diff>.
+      IF <ls_diff>-short = abap_false.
+        lv_insert_nav = abap_true.
+        CONTINUE.
+      ENDIF.
+ 
+      IF lv_insert_nav = abap_true. " Insert separator line with navigation
+        ri_html->add( render_beacon( is_diff_line = <ls_diff>
+                                     is_diff = is_diff ) ).
+        lv_insert_nav = abap_false.
+      ENDIF.
+ 
+      IF lo_highlighter IS BOUND.
+        <ls_diff>-new = lo_highlighter->process_line( <ls_diff>-new ).
+        <ls_diff>-old = lo_highlighter->process_line( <ls_diff>-old ).
+      ELSE.
+        <ls_diff>-new = escape( val = <ls_diff>-new
+                                format = cl_abap_format=>e_html_attr ).
+        <ls_diff>-old = escape( val = <ls_diff>-old
+                                format = cl_abap_format=>e_html_attr ).
+      ENDIF.
+ 
+      CONDENSE <ls_diff>-new_num. "get rid of leading spaces
+      CONDENSE <ls_diff>-old_num.
+ 
+      ri_html->add( render_line_split( <ls_diff> ) ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_split.
+ 
+    DATA: lv_new  TYPE string,
+          lv_old  TYPE string,
+          lv_mark TYPE string,
+          lv_bg   TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " New line
+    lv_mark = ` `.
+    IF is_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+      lv_bg = ' diff_upd'.
+      lv_mark = `~`.
+    ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-insert.
+      lv_bg = ' diff_ins'.
+      lv_mark = `+`.
+    ENDIF.
+    lv_new = |<td class="num" line-num="{ is_diff_line-new_num }"></td>|
+          && |<td class="code{ lv_bg }">{ lv_mark }{ is_diff_line-new }</td>|.
+ 
+    " Old line
+    CLEAR lv_bg.
+    lv_mark = ` `.
+    IF is_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+      lv_bg = ' diff_upd'.
+      lv_mark = `~`.
+    ELSEIF is_diff_line-result = zif_abapgit_definitions=>c_diff-delete.
+      lv_bg = ' diff_del'.
+      lv_mark = `-`.
+    ENDIF.
+    lv_old = |<td class="num" line-num="{ is_diff_line-old_num }"></td>|
+          && |<td class="code{ lv_bg }">{ lv_mark }{ is_diff_line-old }</td>|.
+ 
+    " render line, inverse sides if remote is newer
+    ri_html->add( '<tr>' ).
+    ri_html->add( lv_old ). " Target
+    ri_html->add( lv_new ). " Source
+    ri_html->add( '</tr>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<thead class="header">' ).
+    ri_html->add( '<tr>' ).
+    ri_html->add( '<th class="num"></th>' ).
+ 
+    IF mv_merge_mode = c_merge_mode-selection.
+      ri_html->add( '<form id="target_form" method="post" action="sapevent:apply_target">' ).
+      ri_html->add( '<th>Target - ' && mo_repo->get_selected_branch( ) && ' - ' ).
+      ri_html->add_a( iv_act = 'submitFormById(''target_form'');'
+                      iv_txt = 'Apply'
+                      iv_typ = zif_abapgit_html=>c_action_type-onclick
+                      iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ri_html->add( '</th> ' ).
+      ri_html->add( '</form>' ).
+      ri_html->add( '<th class="num"></th>' ).
+      ri_html->add( '<form id="source_form" method="post" action="sapevent:apply_source">' ).
+      ri_html->add( '<th>Source  - ' && mo_merge->get_source_branch( ) && ' - ' ).
+      ri_html->add_a( iv_act = 'submitFormById(''source_form'');'
+                      iv_txt = 'Apply'
+                      iv_typ = zif_abapgit_html=>c_action_type-onclick
+                      iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ri_html->add( '</th> ' ).
+      ri_html->add( '</form>' ).
+    ELSE.
+      ri_html->add( '<th>Target - ' && mo_repo->get_selected_branch( ) && '</th> ' ).
+      ri_html->add( '<th class="num"></th>' ).
+      ri_html->add( '<th>Source - ' && mo_merge->get_source_branch( ) && '</th> ' ).
+    ENDIF.
+ 
+    ri_html->add( '</tr>' ).
+    ri_html->add( '</thead>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD resolve_diff.
+
+    DATA: lv_offs TYPE i.
+    FIELD-SYMBOLS: <ls_conflict> TYPE zif_abapgit_merge=>ty_merge_conflict.
+
+    CLEAR ms_diff_file.
+
+    READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+
+    ms_diff_file-path     = <ls_conflict>-path.
+    ms_diff_file-filename = <ls_conflict>-filename.
+    ms_diff_file-type = reverse( <ls_conflict>-filename ).
+
+    FIND FIRST OCCURRENCE OF '.' IN ms_diff_file-type MATCH OFFSET lv_offs.
+    ms_diff_file-type = reverse( substring( val = ms_diff_file-type
+                                            len = lv_offs ) ).
+    IF ms_diff_file-type <> 'xml' AND ms_diff_file-type <> 'abap'.
+      ms_diff_file-type = 'other'.
+    ENDIF.
+
+    IF ms_diff_file-type = 'other'
+    AND is_binary( iv_d1 = <ls_conflict>-source_data
+                   iv_d2 = <ls_conflict>-target_data ) = abap_true.
+      ms_diff_file-type = 'binary'.
+    ENDIF.
+
+    IF ms_diff_file-type <> 'binary'.
+      CREATE OBJECT ms_diff_file-o_diff
+        EXPORTING
+          iv_new = <ls_conflict>-source_data
+          iv_old = <ls_conflict>-target_data.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD toggle_merge_mode.
+
+    IF mv_merge_mode = c_merge_mode-selection.
+      mv_merge_mode = c_merge_mode-merge.
+    ELSE.
+      mv_merge_mode = c_merge_mode-selection.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    FIELD-SYMBOLS: <ls_conflict> TYPE zif_abapgit_merge=>ty_merge_conflict.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-apply_merge
+        OR c_actions-apply_source
+        OR c_actions-apply_target
+        OR c_actions-cancel.
+ 
+        CASE ii_event->mv_action.
+          WHEN c_actions-apply_merge.
+            apply_merged_content( ii_event ).
+ 
+          WHEN c_actions-apply_source.
+            READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+            <ls_conflict>-result_sha1 = <ls_conflict>-source_sha1.
+            <ls_conflict>-result_data = <ls_conflict>-source_data.
+            mo_merge->resolve_conflict( <ls_conflict> ).
+ 
+          WHEN c_actions-apply_target.
+            READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
+            <ls_conflict>-result_sha1 = <ls_conflict>-target_sha1.
+            <ls_conflict>-result_data = <ls_conflict>-target_data.
+            mo_merge->resolve_conflict( <ls_conflict> ).
+ 
+        ENDCASE.
+ 
+        mv_current_conflict_index = mv_current_conflict_index + 1.
+        IF mv_current_conflict_index > lines( mt_conflicts ).
+          CLEAR mv_current_conflict_index.
+        ENDIF.
+ 
+        IF mv_current_conflict_index IS NOT INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ELSE.
+          rs_handled-page = mo_merge_page.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+        ENDIF.
+ 
+      WHEN c_actions-toggle_mode.
+        toggle_merge_mode( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap.html new file mode 100644 index 00000000000..efe62d35db0 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap.html @@ -0,0 +1,682 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_merge_sel.clas.abap

+
+ +
+ 95.47% + Statements + 190/199 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 95.47% + Lines + 190/199 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +2001x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_merge_sel DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_repo       TYPE REF TO zif_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !ii_repo TYPE REF TO zif_abapgit_repo
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        branches TYPE string VALUE 'branches',
+        source   TYPE string VALUE 'source',
+        target   TYPE string VALUE 'target',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        merge TYPE string VALUE 'merge',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils.
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online.
+    DATA mt_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt.
+ 
+    METHODS read_branches
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_merge_sel IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_form_data.
+    mo_repo ?= ii_repo.
+ 
+    read_branches( ).
+ 
+    mo_form = get_form_schema( ).
+    mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_merge_sel.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        ii_repo = ii_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Merge Branches'
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    FIELD-SYMBOLS <ls_branch> LIKE LINE OF mt_branches.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = 'merge-branches-form'
+                iv_help_page = 'https://docs.abapgit.org/' ). " todo, add docs
+ 
+    ro_form->start_group(
+      iv_name  = c_id-branches
+      iv_label = 'Branch Selection'
+      iv_hint  = 'Select the branches that should be merged'
+    )->radio(
+      iv_name          = c_id-source
+      iv_label         = 'Source Branch'
+      iv_default_value = substring(
+                           val = mo_repo->get_selected_branch( )
+                           off = 11 )
+      iv_condense      = abap_true ).
+ 
+    LOOP AT mt_branches ASSIGNING <ls_branch>.
+      ro_form->option(
+        iv_label = <ls_branch>-display_name
+        iv_value = <ls_branch>-display_name ).
+    ENDLOOP.
+ 
+    ro_form->radio(
+      iv_name     = c_id-target
+      iv_label    = 'Target Branch'
+      iv_condense = abap_true ).
+ 
+    LOOP AT mt_branches ASSIGNING <ls_branch>.
+      ro_form->option(
+        iv_label = <ls_branch>-display_name
+        iv_value = <ls_branch>-display_name ).
+    ENDLOOP.
+ 
+    ro_form->command(
+      iv_label    = 'Preview Merge'
+      iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action   = c_event-merge
+    )->command(
+      iv_label    = 'Back'
+      iv_action   = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_branches.
+
+    DATA lo_branches TYPE REF TO zcl_abapgit_git_branch_list.
+
+    lo_branches = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) ).
+    mt_branches = lo_branches->get_branches_only( ).
+
+    DELETE mt_branches WHERE name = zif_abapgit_git_definitions=>c_head_name.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA lo_merge TYPE REF TO zcl_abapgit_gui_page_merge.
+ 
+    mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-merge.
+        IF mo_form_data->get( c_id-source ) = mo_form_data->get( c_id-target ).
+          zcx_abapgit_exception=>raise( 'Select different branches' ).
+        ENDIF.
+ 
+        CREATE OBJECT lo_merge
+          EXPORTING
+            io_repo   = mo_repo
+            iv_source = mo_form_data->get( c_id-source )
+            iv_target = mo_form_data->get( c_id-target ).
+ 
+        rs_handled-page = lo_merge.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( `<div class="repo">` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_false ) ).
+ 
+    ri_html->add( mo_form->render( io_values = mo_form_data ) ).
+ 
+    ri_html->add( `</div>` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_patch.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_patch.clas.abap.html new file mode 100644 index 00000000000..9c3d422b73b --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_patch.clas.abap.html @@ -0,0 +1,2125 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_patch.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_patch.clas.abap

+
+ +
+ 55.88% + Statements + 380/680 +
+ + +
+ 80% + Branches + 4/5 +
+ + +
+ 0% + Functions + 0/15 +
+ + +
+ 55.88% + Lines + 380/680 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +6811x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_patch DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_page_diff
+  CREATE PUBLIC .
+ 
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor
+        IMPORTING
+          iv_key        TYPE zif_abapgit_persistence=>ty_repo-key
+          is_file       TYPE zif_abapgit_git_definitions=>ty_file OPTIONAL
+          is_object     TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+          it_files      TYPE zif_abapgit_definitions=>ty_stage_tt OPTIONAL
+        RAISING
+          zcx_abapgit_exception,
+ 
+      zif_abapgit_gui_event_handler~on_event REDEFINITION,
+      zif_abapgit_gui_hotkeys~get_hotkey_actions REDEFINITION.
+ 
+    CLASS-METHODS:
+      get_patch_data
+        IMPORTING
+          iv_patch      TYPE string
+        EXPORTING
+          ev_filename   TYPE string
+          ev_line_index TYPE string
+        RAISING
+          zcx_abapgit_exception.
+  PROTECTED SECTION.
+    METHODS:
+      render_content REDEFINITION,
+      add_menu_begin REDEFINITION,
+      add_menu_end REDEFINITION,
+      render_table_head_non_unified REDEFINITION,
+      render_beacon_begin_of_row REDEFINITION,
+      render_diff_head_after_state REDEFINITION,
+      insert_nav REDEFINITION,
+      render_line_split_row REDEFINITION,
+      refresh REDEFINITION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES ty_patch_action TYPE string .
+ 
+    CONSTANTS:
+      BEGIN OF c_patch_actions,
+        stage TYPE string VALUE 'patch_stage',
+      END OF c_patch_actions .
+    CONSTANTS:
+      BEGIN OF c_patch_action,
+        add    TYPE ty_patch_action VALUE 'add',
+        remove TYPE ty_patch_action VALUE 'remove',
+      END OF c_patch_action .
+    DATA mo_stage TYPE REF TO zcl_abapgit_stage .
+    DATA mv_section_count TYPE i .
+    DATA mv_pushed TYPE abap_bool .
+    DATA mo_repo_online TYPE REF TO zcl_abapgit_repo_online .
+ 
+    METHODS render_patch
+      IMPORTING
+        !ii_html      TYPE REF TO zif_abapgit_html
+        !iv_filename  TYPE string
+        !is_diff_line TYPE zif_abapgit_definitions=>ty_diff
+        !iv_index     TYPE sy-tabix
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_patch_head
+      IMPORTING
+        !ii_html TYPE REF TO zif_abapgit_html
+        !is_diff TYPE ty_file_diff .
+    METHODS start_staging
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS apply_patch_from_form_fields
+      IMPORTING
+        !ii_event TYPE REF TO zif_abapgit_gui_event
+      RAISING
+        zcx_abapgit_exception .
+    METHODS restore_patch_flags
+      IMPORTING
+        !it_diff_files_old TYPE ty_file_diffs
+      RAISING
+        zcx_abapgit_exception .
+    METHODS add_to_stage
+      RAISING
+        zcx_abapgit_exception .
+    METHODS apply_patch_all
+      IMPORTING
+        !iv_patch      TYPE string
+        !iv_patch_flag TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS are_all_lines_patched
+      IMPORTING
+        !it_diff                        TYPE zif_abapgit_definitions=>ty_diffs_tt
+      RETURNING
+        VALUE(rv_are_all_lines_patched) TYPE abap_bool .
+    METHODS apply_patch_for
+      IMPORTING
+        !iv_filename   TYPE string
+        !iv_line_index TYPE string
+        !iv_patch_flag TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_diff_object
+      IMPORTING
+        !iv_filename   TYPE string
+      RETURNING
+        VALUE(ro_diff) TYPE REF TO zcl_abapgit_diff
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_diff_line
+      IMPORTING
+        !io_diff       TYPE REF TO zcl_abapgit_diff
+        !iv_line_index TYPE string
+      RETURNING
+        VALUE(rs_diff) TYPE zif_abapgit_definitions=>ty_diff
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_patch_line_possible
+      IMPORTING
+        !is_diff_line                    TYPE zif_abapgit_definitions=>ty_diff
+      RETURNING
+        VALUE(rv_is_patch_line_possible) TYPE abap_bool .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION.
+ 
+ 
+  METHOD add_menu_begin.
+
+    io_menu->add(
+        iv_txt   = c_action_texts-refresh_local
+        iv_typ   = zif_abapgit_html=>c_action_type-dummy
+        iv_act   = c_actions-refresh_local
+        iv_id    = c_actions-refresh_local
+        iv_title = c_action_titles-refresh_local ).
+
+    io_menu->add(
+        iv_txt   = c_action_texts-refresh_all
+        iv_typ   = zif_abapgit_html=>c_action_type-dummy
+        iv_act   = c_actions-refresh_all
+        iv_id    = c_actions-refresh_all
+        iv_title = c_action_titles-refresh_all ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_menu_end.
+
+    io_menu->add( iv_txt = 'Stage'
+                  iv_act = c_patch_actions-stage
+                  iv_id  = 'stage'
+                  iv_typ = zif_abapgit_html=>c_action_type-dummy ).
+
+    add_view_sub_menu( io_menu ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD add_to_stage.
+
+    DATA: lt_diff              TYPE zif_abapgit_definitions=>ty_diffs_tt,
+          lv_something_patched TYPE abap_bool,
+          ls_status            TYPE zif_abapgit_definitions=>ty_result,
+          lv_patch             TYPE xstring,
+          lo_git_add_patch     TYPE REF TO zcl_abapgit_git_add_patch.
+
+    FIELD-SYMBOLS: <ls_diff_file> TYPE ty_file_diff.
+
+    LOOP AT mt_diff_files ASSIGNING <ls_diff_file>.
+
+      IF <ls_diff_file>-o_diff IS NOT BOUND.
+        " When we deal with binary files we don't have a diff object.
+        " There's nothing to do because they cannot be patched
+        CONTINUE.
+      ENDIF.
+
+      lt_diff = <ls_diff_file>-o_diff->get( ).
+
+      READ TABLE lt_diff TRANSPORTING NO FIELDS
+                         WITH KEY patch_flag = abap_true.
+      CHECK sy-subrc = 0.
+
+      lv_something_patched = abap_true.
+
+      CREATE OBJECT lo_git_add_patch
+        EXPORTING
+          it_diff = <ls_diff_file>-o_diff->get( ).
+
+      lv_patch = lo_git_add_patch->get_patch_binary( ).
+
+      IF <ls_diff_file>-lstate = 'D' AND are_all_lines_patched( lt_diff ) = abap_true.
+
+        ls_status-lstate = zif_abapgit_definitions=>c_state-deleted.
+        mo_stage->rm(
+          iv_path     = <ls_diff_file>-path
+          is_status   = ls_status
+          iv_filename = <ls_diff_file>-filename ).
+
+      ELSE.
+
+        IF <ls_diff_file>-lstate = 'A' AND are_all_lines_patched( lt_diff ) = abap_true.
+          ls_status-lstate = zif_abapgit_definitions=>c_state-added.
+        ELSE.
+          ls_status-lstate = zif_abapgit_definitions=>c_state-modified.
+        ENDIF.
+
+        mo_stage->add(
+          iv_path     = <ls_diff_file>-path
+          iv_filename = <ls_diff_file>-filename
+          is_status   = ls_status
+          iv_data     = lv_patch ).
+
+      ENDIF.
+
+    ENDLOOP.
+
+    IF lv_something_patched = abap_false.
+      zcx_abapgit_exception=>raise( |Nothing added| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_patch_all.
+
+    DATA: lv_filename   TYPE string,
+          lt_patch      TYPE string_table,
+          lv_line_index TYPE string.
+
+    FIELD-SYMBOLS: <lv_patch>     TYPE LINE OF string_table.
+
+    SPLIT iv_patch AT ',' INTO TABLE lt_patch.
+
+    LOOP AT lt_patch ASSIGNING <lv_patch>.
+
+      get_patch_data(
+        EXPORTING
+          iv_patch      = <lv_patch>
+        IMPORTING
+          ev_filename   = lv_filename
+          ev_line_index = lv_line_index ).
+
+      apply_patch_for( iv_filename   = lv_filename
+                       iv_line_index = lv_line_index
+                       iv_patch_flag = iv_patch_flag ).
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_patch_for.
+
+    DATA: lo_diff      TYPE REF TO zcl_abapgit_diff,
+          ls_diff_line TYPE zif_abapgit_definitions=>ty_diff,
+          lv_line      TYPE i.
+
+    lo_diff = get_diff_object( iv_filename ).
+
+    ls_diff_line = get_diff_line( io_diff       = lo_diff
+                                  iv_line_index = iv_line_index ).
+
+    CASE ls_diff_line-result.
+      WHEN zif_abapgit_definitions=>c_diff-update
+        OR zif_abapgit_definitions=>c_diff-insert.
+
+        lv_line = ls_diff_line-new_num.
+
+        lo_diff->set_patch_new( iv_line_new   = lv_line
+                                iv_patch_flag = iv_patch_flag ).
+
+      WHEN zif_abapgit_definitions=>c_diff-delete.
+
+        lv_line = ls_diff_line-old_num.
+
+        lo_diff->set_patch_old( iv_line_old   = lv_line
+                                iv_patch_flag = iv_patch_flag ).
+
+    ENDCASE.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_patch_from_form_fields.
+
+    DATA:
+      lv_add    TYPE string,
+      lv_remove TYPE string.
+
+    lv_add    = ii_event->form_data( )->get( c_patch_action-add ).
+    lv_remove = ii_event->form_data( )->get( c_patch_action-remove ).
+
+    apply_patch_all( iv_patch      = lv_add
+                     iv_patch_flag = abap_true ).
+
+    apply_patch_all( iv_patch      = lv_remove
+                     iv_patch_flag = abap_false ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD are_all_lines_patched.
+ 
+    DATA: lv_patch_count TYPE i.
+ 
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    LOOP AT it_diff ASSIGNING <ls_diff>
+                    WHERE patch_flag = abap_true.
+      lv_patch_count = lv_patch_count + 1.
+    ENDLOOP.
+ 
+    rv_are_all_lines_patched = boolc( lv_patch_count = lines( it_diff ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor(
+      iv_key    = iv_key
+      is_file   = is_file
+      is_object = is_object
+      it_files  = it_files ).
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      zcx_abapgit_exception=>raise( |Patching is only possible for online repositories.| ).
+    ENDIF.
+ 
+    mo_repo_online ?= mo_repo.
+ 
+    " While patching we always want to be in split mode
+    CLEAR: mv_unified.
+    set_layout( ).
+    CREATE OBJECT mo_stage.
+ 
+    ms_control-page_title = 'Patch'.
+    ms_control-page_menu = build_menu( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_diff_line.
+ 
+    DATA: lt_diff       TYPE zif_abapgit_definitions=>ty_diffs_tt,
+          lv_line_index TYPE sy-tabix.
+ 
+ 
+    lv_line_index = iv_line_index.
+    lt_diff = io_diff->get( ).
+ 
+    READ TABLE lt_diff INTO rs_diff
+                       INDEX lv_line_index.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Invalid line index { lv_line_index }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_diff_object.
+ 
+    FIELD-SYMBOLS: <ls_diff_file> LIKE LINE OF mt_diff_files.
+ 
+    LOOP AT mt_diff_files ASSIGNING <ls_diff_file>.
+      IF get_normalized_fname_with_path( <ls_diff_file> ) = iv_filename.
+        ro_diff = <ls_diff_file>-o_diff.
+        EXIT.
+      ENDIF.
+    ENDLOOP.
+ 
+    IF ro_diff IS NOT BOUND.
+      zcx_abapgit_exception=>raise( |Invalid filename { iv_filename }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_patch_data.
+ 
+    DATA: lv_section TYPE string.
+ 
+    CLEAR: ev_filename, ev_line_index.
+ 
+    FIND FIRST OCCURRENCE OF REGEX `patch_line` && `_(.*)_(\d)+_(\d+)`
+         IN iv_patch
+         SUBMATCHES ev_filename lv_section ev_line_index.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Invalid patch| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD insert_nav.
+ 
+    " add beacon at beginning of file
+    rv_insert_nav = abap_true.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_patch_line_possible.
+ 
+    IF is_diff_line-result = zif_abapgit_definitions=>c_diff-update
+    OR is_diff_line-result = zif_abapgit_definitions=>c_diff-insert
+    OR is_diff_line-result = zif_abapgit_definitions=>c_diff-delete.
+      rv_is_patch_line_possible = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh.
+
+    DATA: lt_diff_files_old TYPE ty_file_diffs.
+
+    lt_diff_files_old = mt_diff_files.
+
+    super->refresh( iv_action ).
+
+    restore_patch_flags( lt_diff_files_old ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_beacon_begin_of_row.
+
+    mv_section_count = mv_section_count + 1.
+
+    ii_html->add( |<th class="patch">| ).
+    ii_html->add_checkbox( iv_id = |patch_section_{ get_normalized_fname_with_path( is_diff ) }_{ mv_section_count }| ).
+    ii_html->add( '</th>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CLEAR: mv_section_count.
+ 
+    IF mv_pushed = abap_true.
+      refresh_full( ).
+      calculate_diff( ).
+      CLEAR: mv_pushed.
+    ENDIF.
+ 
+    register_handlers( ).
+ 
+    ri_html = super->render_content( ).
+ 
+    register_deferred_script( render_scripts( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_diff_head_after_state.
+
+    DATA: lv_act_id TYPE string.
+
+    lv_act_id = |{ c_actions-refresh_local_object }_{ is_diff-obj_type }_{ is_diff-obj_name }|.
+
+    IF is_diff-obj_type IS NOT INITIAL AND is_diff-obj_name IS NOT INITIAL.
+      " Dummy link is handled in JS (based on ID)
+      ii_html->add( '<span class="repo_name">' ).
+      ii_html->add_a( iv_txt   = ii_html->icon( iv_name  = 'redo-alt-solid'
+                                                iv_class = 'pad-sides'
+                                                iv_hint  = 'Local refresh of this object' )
+                      iv_id    = lv_act_id
+                      iv_act   = lv_act_id
+                      iv_typ   = zif_abapgit_html=>c_action_type-dummy
+                      iv_class = |url| ).
+      ii_html->add( '</span>' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_line_split_row.
+
+    render_patch( ii_html      = ii_html
+                  iv_filename  = iv_filename
+                  is_diff_line = is_diff_line
+                  iv_index     = iv_index ).
+
+    super->render_line_split_row(
+        ii_html      = ii_html
+        iv_filename  = iv_filename
+        is_diff_line = is_diff_line
+        iv_index     = iv_index
+        iv_fstate    = iv_fstate
+        iv_new       = iv_new
+        iv_old       = iv_old ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_patch.
+
+    CONSTANTS:
+      BEGIN OF lc_css_class,
+        patch TYPE string VALUE `patch`,
+      END OF lc_css_class.
+
+    DATA:
+      lv_id                TYPE string,
+      lv_patched           TYPE abap_bool,
+      lv_is_patch_possible TYPE abap_bool.
+
+    lv_patched = get_diff_object( iv_filename )->is_line_patched( iv_index ).
+
+    lv_is_patch_possible = is_patch_line_possible( is_diff_line ).
+
+    IF lv_is_patch_possible = abap_true.
+
+      lv_id = |{ iv_filename }_{ mv_section_count }_{ iv_index }|.
+
+      ii_html->add( |<td class="{ lc_css_class-patch }">| ).
+      ii_html->add_checkbox(
+          iv_id      = |patch_line_{ lv_id }|
+          iv_checked = lv_patched ).
+      ii_html->add( |</td>| ).
+
+    ELSE.
+
+      ii_html->add( |<td class="{ lc_css_class-patch }">| ).
+      ii_html->add( |</td>| ).
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_patch_head.
+
+    ii_html->add( |<th class="patch">| ).
+    ii_html->add_checkbox( |patch_file_{ get_normalized_fname_with_path( is_diff ) }| ).
+    ii_html->add( '</th>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( 'preparePatch();' ).
+    ri_html->add( 'registerStagePatch();' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_head_non_unified.
+
+    render_patch_head( ii_html = ii_html
+                       is_diff = is_diff ).
+
+    super->render_table_head_non_unified(
+        ii_html = ii_html
+        is_diff = is_diff ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD restore_patch_flags.
+
+    DATA:
+      lt_diff_old TYPE zif_abapgit_definitions=>ty_diffs_tt.
+
+    FIELD-SYMBOLS:
+      <ls_diff_file>     TYPE ty_file_diff,
+      <ls_diff_file_old> TYPE ty_file_diff,
+      <ls_diff_old>      TYPE zif_abapgit_definitions=>ty_diff.
+
+    LOOP AT mt_diff_files ASSIGNING <ls_diff_file>.
+
+      READ TABLE it_diff_files_old ASSIGNING <ls_diff_file_old>
+                                   WITH KEY secondary
+                                   COMPONENTS path     = <ls_diff_file>-path
+                                              filename = <ls_diff_file>-filename.
+      IF sy-subrc <> 0.
+        CONTINUE. " e.g. new objects
+      ENDIF.
+
+      IF <ls_diff_file_old>-o_diff IS NOT BOUND.
+        CONTINUE. " e.g. binary files
+      ENDIF.
+
+      lt_diff_old = <ls_diff_file_old>-o_diff->get( ).
+
+      LOOP AT lt_diff_old ASSIGNING <ls_diff_old>
+                          WHERE patch_flag = abap_true.
+
+        <ls_diff_file>-o_diff->set_patch_by_old_diff(
+            is_diff_old   = <ls_diff_old>
+            iv_patch_flag = abap_true ).
+
+      ENDLOOP.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD start_staging.
+
+    apply_patch_from_form_fields( ii_event ).
+    add_to_stage( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_patch_actions-stage.
+ 
+        start_staging( ii_event ).
+ 
+        rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+          io_repo  = mo_repo_online
+          io_stage = mo_stage ).
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN OTHERS.
+ 
+        IF is_refresh( ii_event->mv_action ) = abap_true.
+ 
+          apply_patch_from_form_fields( ii_event ).
+          refresh( ii_event->mv_action ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+        ELSE.
+ 
+          rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+ 
+        ENDIF.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = 'Patch'.
+ 
+    ls_hotkey_action-description = |Stage Changes|.
+    ls_hotkey_action-action      = |stagePatch|.
+    ls_hotkey_action-hotkey      = |s|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Refresh Local|.
+    ls_hotkey_action-action      = |refreshLocal|.
+    ls_hotkey_action-hotkey      = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Refresh All|.
+    ls_hotkey_action-action      = |refreshAll|.
+    ls_hotkey_action-hotkey      = |a|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_patch.clas.testclasses.abap.html b/src/ui/pages/zcl_abapgit_gui_page_patch.clas.testclasses.abap.html new file mode 100644 index 00000000000..c5215adc339 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_patch.clas.testclasses.abap.html @@ -0,0 +1,760 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_patch.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_patch.clas.testclasses.abap

+
+ +
+ 100% + Statements + 225/225 +
+ + +
+ 100% + Branches + 12/12 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 100% + Lines + 225/225 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +2261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +1x +1x +1x +3x +3x +3x +3x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +1x +1x + 
*"* use this source file for your ABAP unit test classes
+ 
+CLASS ltcl_get_patch_data DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      get_patch_data_add FOR TESTING RAISING cx_static_check,
+      get_patch_data_remove FOR TESTING RAISING cx_static_check,
+      invalid_patch_missing_file FOR TESTING RAISING cx_static_check,
+      invalid_patch_missing_index FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_is_patch_line_possible DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mv_is_patch_line_possible TYPE abap_bool,
+      ms_diff_line              TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    METHODS:
+      initial_diff_line FOR TESTING RAISING cx_static_check,
+      for_update_patch_shd_be_possbl FOR TESTING RAISING cx_static_check,
+      for_insert_patch_shd_be_possbl FOR TESTING RAISING cx_static_check,
+      for_delete_patch_shd_be_possbl FOR TESTING RAISING cx_static_check,
+ 
+      given_diff_line
+        IMPORTING
+          is_diff_line TYPE zif_abapgit_definitions=>ty_diff OPTIONAL,
+ 
+      when_is_patch_line_possible,
+ 
+      then_patch_shd_be_possible,
+      then_patch_shd_not_be_possible.
+ 
+ENDCLASS.
+ 
+CLASS zcl_abapgit_gui_page_patch DEFINITION LOCAL FRIENDS ltcl_is_patch_line_possible.
+ 
+CLASS ltcl_get_patch_data IMPLEMENTATION.
+ 
+  METHOD get_patch_data_add.
+ 
+    DATA: lv_file_name  TYPE string,
+          lv_line_index TYPE string.
+ 
+    zcl_abapgit_gui_page_patch=>get_patch_data(
+      EXPORTING
+        iv_patch      = |patch_line_zcl_test_git_add_p.clas.abap_0_19|
+      IMPORTING
+        ev_filename   = lv_file_name
+        ev_line_index = lv_line_index ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |zcl_test_git_add_p.clas.abap|
+      act = lv_file_name ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |19|
+      act = lv_line_index ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_patch_data_remove.
+ 
+    DATA: lv_file_name  TYPE string,
+          lv_line_index TYPE string.
+ 
+    zcl_abapgit_gui_page_patch=>get_patch_data(
+      EXPORTING
+        iv_patch      = |patch_line_ztest_patch.prog.abap_0_39|
+      IMPORTING
+        ev_filename   = lv_file_name
+        ev_line_index = lv_line_index ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |ztest_patch.prog.abap|
+      act = lv_file_name ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = |39|
+      act = lv_line_index ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD invalid_patch_missing_file.
+ 
+    DATA: lv_file_name  TYPE string,
+          lv_line_index TYPE string,
+          lx_error      TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        zcl_abapgit_gui_page_patch=>get_patch_data(
+          EXPORTING
+            iv_patch      = |patch_39|
+          IMPORTING
+            ev_filename   = lv_file_name
+            ev_line_index = lv_line_index ).
+ 
+        cl_abap_unit_assert=>fail( ).
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+        cl_abap_unit_assert=>assert_equals(
+          exp = |Invalid patch|
+          act = lx_error->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD invalid_patch_missing_index.
+ 
+    DATA: lv_file_name  TYPE string,
+          lv_line_index TYPE string,
+          lx_error      TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        zcl_abapgit_gui_page_patch=>get_patch_data(
+          EXPORTING
+            iv_patch      = |patch_ztest_patch.prog.abap|
+          IMPORTING
+            ev_filename   = lv_file_name
+            ev_line_index = lv_line_index ).
+ 
+        cl_abap_unit_assert=>fail( ).
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+        cl_abap_unit_assert=>assert_equals(
+          exp = |Invalid patch|
+          act = lx_error->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ltcl_is_patch_line_possible IMPLEMENTATION.
+ 
+  METHOD initial_diff_line.
+ 
+    given_diff_line( ).
+    when_is_patch_line_possible( ).
+    then_patch_shd_not_be_possible( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD for_update_patch_shd_be_possbl.
+ 
+    DATA: ls_diff_line TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    ls_diff_line-result = zif_abapgit_definitions=>c_diff-update.
+ 
+    given_diff_line( ls_diff_line ).
+    when_is_patch_line_possible( ).
+    then_patch_shd_be_possible( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD for_insert_patch_shd_be_possbl.
+ 
+    DATA: ls_diff_line TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    ls_diff_line-result = zif_abapgit_definitions=>c_diff-insert.
+ 
+    given_diff_line( ls_diff_line ).
+    when_is_patch_line_possible( ).
+    then_patch_shd_be_possible( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD for_delete_patch_shd_be_possbl.
+ 
+    DATA: ls_diff_line TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    ls_diff_line-result = zif_abapgit_definitions=>c_diff-delete.
+ 
+    given_diff_line( ls_diff_line ).
+    when_is_patch_line_possible( ).
+    then_patch_shd_be_possible( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD when_is_patch_line_possible.
+ 
+    mv_is_patch_line_possible = zcl_abapgit_gui_page_patch=>is_patch_line_possible( ms_diff_line ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD then_patch_shd_be_possible.
+ 
+    cl_abap_unit_assert=>assert_not_initial(
+        act = mv_is_patch_line_possible
+        msg = |Patch should be possible| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD then_patch_shd_not_be_possible.
+ 
+    cl_abap_unit_assert=>assert_initial(
+        act = mv_is_patch_line_possible
+        msg = |Patch should not be possible| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_diff_line.
+ 
+    ms_diff_line = is_diff_line.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap.html new file mode 100644 index 00000000000..d9317509574 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap.html @@ -0,0 +1,3256 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_repo_over.clas.abap

+
+ +
+ 71.99% + Statements + 761/1057 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/13 +
+ + +
+ 71.99% + Lines + 761/1057 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +10581x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_repo_over DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES:
+      zif_abapgit_gui_event_handler,
+      zif_abapgit_gui_hotkeys,
+      zif_abapgit_gui_menu_provider,
+      zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_only_favorites TYPE abap_bool OPTIONAL
+      RETURNING
+        VALUE(ri_page)     TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_only_favorites TYPE abap_bool OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_overview,
+        favorite            TYPE string,
+        "! True for offline, false for online repo
+        type                TYPE string,
+        key                 TYPE zif_abapgit_persistence=>ty_value,
+        name                TYPE string,
+        labels              TYPE string_table,
+        url                 TYPE string,
+        package             TYPE devclass,
+        branch              TYPE string,
+        created_by          TYPE syuname,
+        created_at          TYPE string,
+        created_at_raw      TYPE timestampl,
+        deserialized_by     TYPE syuname,
+        deserialized_at     TYPE string,
+        deserialized_at_raw TYPE timestampl,
+        write_protected     TYPE abap_bool,
+      END OF ty_overview,
+      ty_overviews TYPE STANDARD TABLE OF ty_overview
+                   WITH NON-UNIQUE DEFAULT KEY.
+    CONSTANTS:
+      BEGIN OF c_action,
+        select       TYPE string VALUE 'select',
+        apply_filter TYPE string VALUE 'apply_filter',
+        label_filter TYPE string VALUE 'label_filter',
+      END OF c_action,
+      c_label_filter_prefix TYPE string VALUE `label:`,
+      c_raw_field_suffix    TYPE string VALUE `_RAW` ##NO_TEXT.
+ 
+    DATA: mt_all_labels   TYPE string_table,
+          mo_label_colors TYPE REF TO zcl_abapgit_string_map.
+    DATA ms_list_settings TYPE zif_abapgit_definitions=>ty_list_settings.
+ 
+    METHODS set_order_by
+      IMPORTING
+        !iv_order_by TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_order_direction
+      IMPORTING
+        !iv_order_descending TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_filter
+      IMPORTING
+        it_postdata TYPE zif_abapgit_html_viewer=>ty_post_data
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS:
+      apply_filter
+        CHANGING
+          ct_overview TYPE ty_overviews,
+ 
+      map_repo_list_to_overview
+        IMPORTING
+          it_repo_obj_list   TYPE zif_abapgit_repo_srv=>ty_repo_list
+        RETURNING
+          VALUE(rt_overview) TYPE ty_overviews
+        RAISING
+          zcx_abapgit_exception,
+ 
+      render_repo_list
+        IMPORTING
+          ii_html     TYPE REF TO zif_abapgit_html
+          it_overview TYPE ty_overviews
+        RAISING
+          zcx_abapgit_exception,
+ 
+      render_table_header
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html,
+ 
+      render_table_footer
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html,
+ 
+      render_table_body
+        IMPORTING
+          ii_html      TYPE REF TO zif_abapgit_html
+          it_repo_list TYPE ty_overviews
+        RAISING
+          zcx_abapgit_exception,
+ 
+      render_table_item
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html
+          is_repo TYPE ty_overview
+        RAISING
+          zcx_abapgit_exception,
+ 
+      render_header_bar
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html,
+ 
+      render_header_label_list
+        IMPORTING
+          ii_html TYPE REF TO zif_abapgit_html,
+ 
+      apply_order_by
+        CHANGING ct_overview TYPE ty_overviews.
+ 
+    METHODS prepare_overviews
+      RETURNING
+        VALUE(rt_overviews) TYPE ty_overviews
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_action_toolbar
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html.
+ 
+    METHODS render_filter_bar
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html.
+ 
+    METHODS build_table_scheme
+      RETURNING
+        VALUE(rt_tab_scheme) TYPE zif_abapgit_definitions=>ty_col_spec_tt.
+ 
+    METHODS collect_all_labels
+      IMPORTING
+        it_overview    TYPE ty_overviews
+      RETURNING
+        VALUE(rt_list) TYPE string_table.
+ 
+    METHODS render_filter_help_hint
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ 
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION.
+ 
+ 
+  METHOD apply_filter.
+
+    DATA lv_pfxl TYPE i.
+    DATA lv_idx TYPE i.
+    DATA lv_filter_label TYPE string.
+    FIELD-SYMBOLS <ls_r> LIKE LINE OF ct_overview.
+
+    IF ms_list_settings-filter IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    lv_pfxl = strlen( c_label_filter_prefix ).
+
+    IF strlen( ms_list_settings-filter ) > lv_pfxl AND ms_list_settings-filter+0(lv_pfxl) = c_label_filter_prefix.
+      lv_filter_label = ms_list_settings-filter+lv_pfxl.
+      IF lv_filter_label = 'all'.
+        DELETE ct_overview WHERE labels IS INITIAL.
+      ELSEIF lv_filter_label = 'none'.
+        DELETE ct_overview WHERE labels IS NOT INITIAL.
+      ELSE.
+        LOOP AT ct_overview ASSIGNING <ls_r>.
+          lv_idx = sy-tabix.
+          READ TABLE <ls_r>-labels TRANSPORTING NO FIELDS WITH KEY table_line = lv_filter_label.
+          IF sy-subrc <> 0.
+            DELETE ct_overview INDEX lv_idx.
+          ENDIF.
+        ENDLOOP.
+      ENDIF.
+    ELSE. " Regular filter
+      DELETE ct_overview WHERE
+            key             NS ms_list_settings-filter
+        AND name            NS ms_list_settings-filter
+        AND url             NS ms_list_settings-filter
+        AND package         NS ms_list_settings-filter
+        AND branch          NS ms_list_settings-filter
+        AND created_by      NS ms_list_settings-filter
+        AND created_at      NS ms_list_settings-filter
+        AND deserialized_by NS ms_list_settings-filter
+        AND deserialized_at NS ms_list_settings-filter.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD apply_order_by.
+
+    DATA:
+      lt_sort TYPE abap_sortorder_tab,
+      ls_sort LIKE LINE OF lt_sort.
+
+    ls_sort-name = 'FAVORITE'.
+    ls_sort-descending = abap_true.
+    ls_sort-astext = abap_true.
+    INSERT ls_sort INTO TABLE lt_sort.
+
+    IF ms_list_settings-order_by IS NOT INITIAL.
+
+      CLEAR ls_sort.
+
+      IF ms_list_settings-order_by = 'CREATED_AT' OR ms_list_settings-order_by = 'DESERIALIZED_AT'.
+        ls_sort-name = ms_list_settings-order_by && c_raw_field_suffix.
+      ELSE.
+        ls_sort-name   = ms_list_settings-order_by.
+        ls_sort-astext = abap_true.
+      ENDIF.
+
+      ls_sort-descending = ms_list_settings-order_descending.
+      INSERT ls_sort INTO TABLE lt_sort.
+
+    ENDIF.
+
+    SORT ct_overview BY (lt_sort).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD build_table_scheme.
+ 
+    DATA lo_tab_scheme TYPE REF TO lcl_table_scheme.
+ 
+    CREATE OBJECT lo_tab_scheme.
+ 
+    lo_tab_scheme->add_column(
+      iv_tech_name      = 'FAVORITE'
+      iv_css_class      = 'wmin'
+      iv_allow_order_by = abap_false
+    )->add_column(
+      iv_tech_name      = 'TYPE'
+      iv_css_class      = 'wmin'
+      iv_allow_order_by = abap_false
+    )->add_column(
+      iv_tech_name      = 'NAME'
+      iv_display_name   = 'Name'
+      iv_allow_order_by = abap_true ).
+ 
+    IF mt_all_labels IS NOT INITIAL.
+      lo_tab_scheme->add_column(
+        iv_tech_name      = 'LABELS'
+        iv_display_name   = 'Labels'
+        iv_allow_order_by = abap_false ).
+    ENDIF.
+ 
+    lo_tab_scheme->add_column(
+      iv_tech_name      = 'PACKAGE'
+      iv_display_name   = 'Package'
+      iv_css_class      = 'package'
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = 'URL'
+      iv_display_name   = 'Remote'
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = 'BRANCH'
+      iv_display_name   = 'Branch/Tag'
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = 'DESERIALIZED_BY'
+      iv_display_name   = 'Deserialized by'
+      iv_css_class      = 'ro-detail'
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = 'DESERIALIZED_AT'
+      iv_display_name   = 'Deserialized at'
+      iv_css_class      = 'ro-detail'
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = 'CREATED_BY'
+      iv_display_name   = 'Created by'
+      iv_css_class      = 'ro-detail'
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = 'CREATED_AT'
+      iv_display_name   = 'Created at'
+      iv_css_class      = 'ro-detail'
+      iv_add_tz         = abap_true
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = 'KEY'
+      iv_display_name   = 'Key'
+      iv_css_class      = 'ro-detail'
+      iv_allow_order_by = abap_true
+    )->add_column(
+      iv_tech_name      = 'GO'
+      iv_css_class      = 'ro-go wmin'
+      iv_allow_order_by = abap_false ).
+ 
+    rt_tab_scheme = lo_tab_scheme->mt_col_spec.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD collect_all_labels.
+ 
+    FIELD-SYMBOLS <ls_r> LIKE LINE OF it_overview.
+ 
+    LOOP AT it_overview ASSIGNING <ls_r>.
+      APPEND LINES OF <ls_r>-labels TO rt_list.
+    ENDLOOP.
+ 
+    SORT rt_list.
+    DELETE rt_list WHERE table_line IS INITIAL.
+    DELETE ADJACENT DUPLICATES FROM rt_list.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+    ms_list_settings = zcl_abapgit_persistence_user=>get_instance( )->get_list_settings( ).
+ 
+    " Overwrite setting
+    IF iv_only_favorites = abap_true.
+      ms_list_settings-only_favorites = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_repo_over.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        iv_only_favorites = iv_only_favorites.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title         = 'Repository List'
+      ii_page_menu_provider = lo_component
+      ii_child_component    = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_repo_list_to_overview.
+ 
+    DATA ls_overview      LIKE LINE OF rt_overview.
+    FIELD-SYMBOLS <ls_repo> LIKE LINE OF it_repo_obj_list.
+ 
+    LOOP AT it_repo_obj_list ASSIGNING <ls_repo>.
+ 
+      CLEAR ls_overview.
+ 
+      ls_overview-favorite        = zcl_abapgit_persistence_user=>get_instance(
+        )->is_favorite_repo( <ls_repo>->ms_data-key ).
+      ls_overview-type            = <ls_repo>->ms_data-offline.
+      ls_overview-key             = <ls_repo>->ms_data-key.
+      ls_overview-name            = <ls_repo>->get_name( ).
+      ls_overview-labels          = zcl_abapgit_repo_labels=>split( <ls_repo>->ms_data-local_settings-labels ).
+      ls_overview-url             = <ls_repo>->ms_data-url.
+      ls_overview-package         = <ls_repo>->ms_data-package.
+      ls_overview-branch          = <ls_repo>->ms_data-branch_name.
+      ls_overview-created_by      = <ls_repo>->ms_data-created_by.
+      ls_overview-write_protected = <ls_repo>->ms_data-local_settings-write_protected.
+      ls_overview-created_at_raw  = <ls_repo>->ms_data-created_at.
+ 
+      IF <ls_repo>->ms_data-created_at IS NOT INITIAL.
+        ls_overview-created_at = zcl_abapgit_gui_chunk_lib=>render_timestamp( <ls_repo>->ms_data-created_at ).
+      ENDIF.
+ 
+      ls_overview-deserialized_by     = <ls_repo>->ms_data-deserialized_by.
+      ls_overview-deserialized_at_raw = <ls_repo>->ms_data-deserialized_at.
+ 
+      IF <ls_repo>->ms_data-deserialized_at IS NOT INITIAL.
+        ls_overview-deserialized_at = zcl_abapgit_gui_chunk_lib=>render_timestamp( <ls_repo>->ms_data-deserialized_at ).
+      ENDIF.
+ 
+      INSERT ls_overview INTO TABLE rt_overview.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD prepare_overviews.
+ 
+    DATA lt_repo_obj_list TYPE zif_abapgit_repo_srv=>ty_repo_list.
+ 
+    IF ms_list_settings-only_favorites = abap_true.
+      lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list_favorites( ).
+    ELSE.
+      lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+    ENDIF.
+ 
+    rt_overviews = map_repo_list_to_overview( lt_repo_obj_list ).
+ 
+    " Hmmm, side effect, not ideal, but we need label list before filter applied
+    mt_all_labels = collect_all_labels( rt_overviews ).
+ 
+    apply_order_by( CHANGING ct_overview = rt_overviews ).
+    apply_filter( CHANGING ct_overview = rt_overviews ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_action_toolbar.
+ 
+    CONSTANTS:
+      lc_dummy_key     TYPE string VALUE `?key=#`,
+      lc_offline_class TYPE string VALUE `action_offline_repo`,
+      lc_online_class  TYPE string VALUE `action_online_repo`,
+      lc_action_class  TYPE string VALUE `action_link`.
+ 
+    DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
+    DATA lo_toolbar_more_sub TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+    CREATE OBJECT lo_toolbar EXPORTING iv_id = 'toolbar-ovp'.
+ 
+    lo_toolbar->add(
+      iv_txt      = |Pull|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-git_pull }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Stage|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-go_stage }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Patch|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-go_patch }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Diff|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-go_repo_diff }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Check|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Import|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-zip_import }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_offline_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Export|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-zip_export }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_offline_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |Settings|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-repo_settings }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    CREATE OBJECT lo_toolbar_more_sub EXPORTING iv_id = 'toolbar-ovp-more_sub'.
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt      = |Stage by Transport|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-go_stage_transport }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_online_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt      = |Export by Transport|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-zip_export_transport }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class } { lc_offline_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt = 'Danger'
+      iv_typ = zif_abapgit_html=>c_action_type-separator ).
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt   = |Remove|
+      iv_title = |Remove abapGit's records of the repository (the system's |
+              && |development objects will remain unaffected)|
+      iv_act   = |{ zif_abapgit_definitions=>c_action-repo_remove }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar_more_sub->add(
+      iv_txt      = |Uninstall|
+      iv_title    = |Delete all development objects belonging to this package |
+                 && |(and subpackages) from the system|
+      iv_act      = |{ zif_abapgit_definitions=>c_action-repo_purge }{ lc_dummy_key }|
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    lo_toolbar->add(
+      iv_txt      = |More|
+      io_sub      = lo_toolbar_more_sub
+      iv_class    = |{ lc_action_class }|
+      iv_li_class = |{ lc_action_class }| ).
+ 
+    ri_html = lo_toolbar->render( iv_right = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_filter_bar.
+ 
+    DATA lv_icon_class TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<form class="inline" method="post" action="sapevent:{ c_action-apply_filter }">| ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_text_input(
+      iv_name      = |filter|
+      iv_label     = |Filter: { render_filter_help_hint( ) }|
+      iv_value     = ms_list_settings-filter ) ).
+    ri_html->add( |<input type="submit" class="hidden-submit">| ).
+    ri_html->add( |</form>| ).
+ 
+    IF ms_list_settings-only_favorites = abap_true.
+      lv_icon_class = `blue`.
+    ELSE.
+      lv_icon_class = `grey`.
+    ENDIF.
+ 
+    ri_html->add( '<span class="toolbar-light pad-sides">' ).
+    ri_html->add( ri_html->a(
+      iv_txt   = |<i id="icon-filter-favorite" class="icon icon-check { lv_icon_class }"></i> Only Favorites|
+      iv_class = 'command'
+      iv_act   = |{ zif_abapgit_definitions=>c_action-toggle_favorites }| ) ).
+    ri_html->add( ri_html->a(
+      iv_txt   = '<i id="icon-filter-detail" class="icon icon-check"></i> Detail'
+      iv_act   = |gHelper.toggleRepoListDetail()|
+      iv_class = 'command'
+      iv_typ   = zif_abapgit_html=>c_action_type-onclick ) ).
+    ri_html->add( '</span>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_filter_help_hint.
+ 
+    DATA lt_fragments TYPE string_table.
+ 
+    APPEND `Filter is applied to all text fields in the below table.` TO lt_fragments.
+    APPEND ` Search works for any portion of the text (so can be a mid part as well).` TO lt_fragments.
+    APPEND `<br>Starting query from <code>label:xxx</code> will filter appropriate label.` TO lt_fragments.
+    APPEND `Two "special" label queries are available:` TO lt_fragments.
+    APPEND ` <code>all</code> (to select all repos that has at least one label)` TO lt_fragments.
+    APPEND ` and <code>none</code> (to select unlabeled repos).` TO lt_fragments.
+ 
+    rv_html = zcl_abapgit_gui_chunk_lib=>render_help_hint( concat_lines_of( table = lt_fragments ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_header_bar.
+
+    ii_html->add( |<div class="repo-overview-toolbar">| ).
+    ii_html->add( render_filter_bar( ) ).
+    ii_html->add( render_action_toolbar( ) ).
+    ii_html->add( |</div>| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_header_label_list.
+
+    IF mt_all_labels IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    ii_html->add( |<div class="repo-label-catalog">| ).
+    ii_html->add( '<label>Filter by label:</label>' ).
+    ii_html->add( zcl_abapgit_gui_chunk_lib=>render_label_list(
+      it_labels           = mt_all_labels
+      io_label_colors     = mo_label_colors
+      iv_clickable_action = c_action-label_filter ) ).
+    ii_html->add( |</div>| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_list.
+
+    ii_html->add( |<table>| ).
+
+    render_table_header( ii_html ).
+    render_table_body(
+      ii_html      = ii_html
+      it_repo_list = it_overview ).
+    render_table_footer( ii_html ).
+
+    ii_html->add( |</table>| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( 'var gHelper = new RepoOverViewHelper({ focusFilterKey: "f" });' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_body.
+
+    FIELD-SYMBOLS <ls_repo> LIKE LINE OF it_repo_list.
+
+    ii_html->add( '<tbody>' ).
+
+    LOOP AT it_repo_list ASSIGNING <ls_repo>.
+      render_table_item(
+        ii_html = ii_html
+        is_repo = <ls_repo> ).
+    ENDLOOP.
+
+    ii_html->add( |</tbody>| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_footer.
+
+    IF ms_list_settings-only_favorites = abap_true.
+      ii_html->add( `<tfoot>` ).
+      ii_html->add( `<tr><td colspan="100%">` ).
+      ii_html->add( |(Only favorites are shown. {
+        ii_html->a(
+          iv_txt   = |Show All|
+          iv_act   = |{ zif_abapgit_definitions=>c_action-toggle_favorites }?force_state={ abap_false }| )
+      })| ).
+      ii_html->add( `</td></tr>` ).
+      ii_html->add( `</tfoot>` ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_header.
+
+    ii_html->add( |<thead>| ).
+    ii_html->add( |<tr>| ).
+
+    ii_html->add( zcl_abapgit_gui_chunk_lib=>render_order_by_header_cells(
+      it_col_spec         = build_table_scheme( )
+      iv_order_by         = ms_list_settings-order_by
+      iv_order_descending = ms_list_settings-order_descending ) ).
+
+    ii_html->add( '</tr>' ).
+    ii_html->add( '</thead>' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_table_item.
+
+    DATA:
+      lv_is_online_repo TYPE abap_bool,
+      lv_repo_type_icon TYPE string,
+      lv_favorite_icon  TYPE string,
+      lv_fav_tr_class   TYPE string,
+      lv_lock           TYPE string.
+
+    lv_is_online_repo = boolc( is_repo-type = abap_false ).
+
+    " Start of row
+    IF is_repo-favorite = abap_true.
+      lv_fav_tr_class = ' class="favorite"'.
+    ELSE.
+      lv_fav_tr_class = ''.
+    ENDIF.
+
+    ii_html->add( |<tr{ lv_fav_tr_class } data-key="{ is_repo-key }" data-offline="{ is_repo-type }">| ).
+
+    " Favorite
+    lv_favorite_icon = ii_html->icon(
+      iv_name  = 'star/grey' " blue is added in css, based on TR style
+      iv_class = 'pad-sides'
+      iv_hint  = 'Click to toggle favorite' ).
+
+    ii_html->td(
+      iv_class   = 'wmin'
+      iv_content = ii_html->a(
+        iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?key={ is_repo-key }|
+        iv_txt = lv_favorite_icon ) ).
+
+    " Online/Offline
+    IF lv_is_online_repo = abap_true.
+      lv_repo_type_icon = 'cloud-upload-alt/darkgrey'.
+    ELSE.
+      lv_repo_type_icon = 'plug/darkgrey'.
+    ENDIF.
+
+    ii_html->td(
+      iv_class   = 'wmin'
+      iv_content = ii_html->icon( lv_repo_type_icon ) ).
+
+    " Repo name
+    IF is_repo-write_protected = abap_true.
+      lv_lock = ii_html->icon(
+        iv_name  = 'lock/grey70'
+        iv_class = 'm-em5-sides'
+        iv_hint  = 'Locked from pulls' ).
+    ENDIF.
+
+    ii_html->td(
+      ii_html->a(
+        iv_txt = is_repo-name
+        iv_act = |{ c_action-select }?key={ is_repo-key }| ) && lv_lock ).
+
+    " Labels
+    IF mt_all_labels IS NOT INITIAL.
+      ii_html->td(
+        iv_content = zcl_abapgit_gui_chunk_lib=>render_label_list(
+          it_labels = is_repo-labels
+          io_label_colors = mo_label_colors )
+        iv_class   = 'labels' ).
+    ENDIF.
+
+    " Package
+    ii_html->td( ii_content = zcl_abapgit_gui_chunk_lib=>render_package_name(
+      iv_package        = is_repo-package
+      iv_suppress_title = boolc( NOT ms_list_settings-only_favorites = abap_true ) ) ).
+
+    " Repo URL
+    IF lv_is_online_repo = abap_true.
+      ii_html->td( ii_content = zcl_abapgit_gui_chunk_lib=>render_repo_url(
+        iv_url = is_repo-url
+        iv_render_remote_edit_for_key = is_repo-key ) ).
+    ELSE.
+      ii_html->td( ).
+    ENDIF.
+
+    " Branch
+    IF is_repo-branch IS INITIAL.
+      ii_html->td( ).
+    ELSE.
+      ii_html->td( ii_content = zcl_abapgit_gui_chunk_lib=>render_branch_name(
+        iv_branch   = is_repo-branch
+        iv_repo_key = is_repo-key ) ).
+    ENDIF.
+
+    " Details: deserialized by
+    ii_html->td(
+      iv_class   = 'ro-detail'
+      ii_content = zcl_abapgit_gui_chunk_lib=>render_user_name(
+        iv_username       = is_repo-deserialized_by
+        iv_suppress_title = boolc( NOT ms_list_settings-only_favorites = abap_true ) ) ).
+
+    " Details: deserialized at
+    ii_html->td(
+      iv_class = 'ro-detail'
+      iv_content = is_repo-deserialized_at ).
+
+    " Details: created by
+    ii_html->td(
+      iv_class   = 'ro-detail'
+      ii_content = zcl_abapgit_gui_chunk_lib=>render_user_name(
+        iv_username = is_repo-created_by
+        iv_suppress_title = boolc( NOT ms_list_settings-only_favorites = abap_true ) ) ).
+
+    " Details: created at
+    ii_html->td(
+      iv_class = 'ro-detail'
+      iv_content = is_repo-created_at ).
+
+    " Details: repo key
+    ii_html->td(
+      iv_class = 'ro-detail'
+      iv_content = |{ is_repo-key }| ).
+
+    " Go-to action
+    ii_html->td(
+      iv_class = 'ro-go wmin'
+      iv_content = ii_html->a(
+        iv_title = 'Open'
+        iv_txt   = '&rtrif;'
+        iv_act   = |{ c_action-select }?key={ is_repo-key }| ) ).
+
+    ii_html->add( `</tr>` ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+    zcl_abapgit_persistence_user=>get_instance( )->set_list_settings( ms_list_settings ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_filter.
+
+    FIELD-SYMBOLS <lv_postdata> LIKE LINE OF it_postdata.
+
+    READ TABLE it_postdata ASSIGNING <lv_postdata> INDEX 1.
+    IF sy-subrc = 0.
+      FIND FIRST OCCURRENCE OF REGEX `filter=(.*)`
+        IN <lv_postdata>
+        SUBMATCHES ms_list_settings-filter.
+    ENDIF.
+
+    ms_list_settings-filter = condense( ms_list_settings-filter ).
+    save_settings( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_order_by.
+    IF ms_list_settings-order_by <> iv_order_by.
+      set_order_direction( abap_false ). " Reset ordering
+    ENDIF.
+    ms_list_settings-order_by = iv_order_by.
+    save_settings( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_order_direction.
+    ms_list_settings-order_descending = iv_order_descending.
+    save_settings( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA lv_key TYPE zif_abapgit_persistence=>ty_value.
+ 
+    lv_key = ii_event->query( )->get( 'KEY' ).
+ 
+    CASE ii_event->mv_action.
+      WHEN c_action-select.
+ 
+        zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ).
+ 
+        TRY.
+            zcl_abapgit_repo_srv=>get_instance( )->get( lv_key )->refresh( ).
+          CATCH zcx_abapgit_exception ##NO_HANDLER.
+        ENDTRY.
+ 
+        rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN zif_abapgit_definitions=>c_action-change_order_by.
+ 
+        set_order_by( ii_event->query( )->get( 'ORDERBY' ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-toggle_favorites.
+ 
+        IF ii_event->query( )->has( 'FORCE_STATE' ) = abap_true.
+          ms_list_settings-only_favorites = ii_event->query( )->get( 'FORCE_STATE' ).
+        ELSE.
+          ms_list_settings-only_favorites = boolc( ms_list_settings-only_favorites = abap_false ).
+        ENDIF.
+        save_settings( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-direction.
+ 
+        set_order_direction( boolc( ii_event->query( )->get( 'DIRECTION' ) = 'DESCENDING' ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_action-apply_filter.
+ 
+        set_filter( ii_event->mt_postdata ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_action-label_filter.
+ 
+        IF ii_event->mv_getdata IS NOT INITIAL.
+          ms_list_settings-filter = c_label_filter_prefix && ii_event->mv_getdata.
+        ELSE.
+          CLEAR ms_list_settings-filter. " Unexpected request
+        ENDIF.
+        save_settings( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-go_patch.
+ 
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_patch
+          EXPORTING
+            iv_key = lv_key.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = 'Repo overview'.
+ 
+    ls_hotkey_action-description   = |New Online Repository|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_newonline.
+    ls_hotkey_action-hotkey = |n|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |New Offline Repository|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_newoffline.
+    ls_hotkey_action-hotkey = |o|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |abapGit Settings|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_settings.
+    ls_hotkey_action-hotkey = |x|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Stage|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_stage.
+    ls_hotkey_action-hotkey = |s|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Diff|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_repo_diff.
+    ls_hotkey_action-hotkey = |d|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Check|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_code_inspector.
+    ls_hotkey_action-hotkey = |c|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Pull|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-git_pull.
+    ls_hotkey_action-hotkey = |p|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Patch|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_patch.
+    ls_hotkey_action-hotkey = |a|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    " registered/handled in js
+    ls_hotkey_action-description = |Previous Repository|.
+    ls_hotkey_action-action = `#`.
+    ls_hotkey_action-hotkey = |4|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Next Repository|.
+    ls_hotkey_action-action = `##`.
+    ls_hotkey_action-hotkey = |6|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Open Repository|.
+    ls_hotkey_action-action = `###`.
+    ls_hotkey_action-hotkey = |Enter|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Focus Filter|.
+    ls_hotkey_action-action = `####`.
+    ls_hotkey_action-hotkey = |f|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_menu_provider~get_menu.
+ 
+    CREATE OBJECT ro_toolbar EXPORTING iv_id = 'toolbar-main'.
+ 
+    ro_toolbar->add(
+      iv_txt = zcl_abapgit_gui_buttons=>new_online( )
+      iv_act = zif_abapgit_definitions=>c_action-repo_newonline
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>new_offline( )
+      iv_act = zif_abapgit_definitions=>c_action-repo_newoffline
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>settings( )
+      iv_act = zif_abapgit_definitions=>c_action-go_settings
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>advanced( )
+      iv_title = 'Utilities'
+      io_sub = zcl_abapgit_gui_chunk_lib=>advanced_submenu( )
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>help( )
+      iv_title = 'Help'
+      io_sub = zcl_abapgit_gui_chunk_lib=>help_submenu( ) ).
+ 
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+      ro_toolbar->add(
+        iv_txt   = zcl_abapgit_gui_buttons=>experimental( )
+        iv_title = 'Experimental Features are Enabled'
+        iv_act   = zif_abapgit_definitions=>c_action-go_settings ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lt_overview TYPE ty_overviews.
+    DATA ls_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+    ls_settings = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_user_settings( ).
+    mo_label_colors = zcl_abapgit_repo_labels=>split_colors_into_map( ls_settings-label_colors ).
+ 
+    lt_overview = prepare_overviews( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    zcl_abapgit_exit=>get_instance( )->wall_message_list( ri_html ).
+ 
+    ri_html->add( |<div class="repo-overview">| ).
+    render_header_bar( ri_html ).
+    render_header_label_list( ri_html ).
+    render_repo_list(
+      ii_html     = ri_html
+      it_overview = lt_overview ).
+    ri_html->add( |</div>| ).
+ 
+    register_deferred_script( render_scripts( ) ).
+    register_deferred_script( zcl_abapgit_gui_chunk_lib=>render_repo_palette( c_action-select ) ).
+    register_handlers( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.locals_imp.abap.html b/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.locals_imp.abap.html new file mode 100644 index 00000000000..b596db47f50 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.locals_imp.abap.html @@ -0,0 +1,193 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_repo_over.clas.locals_imp.abap

+
+ +
+ 100% + Statements + 36/36 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 36/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +371x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_table_scheme DEFINITION FINAL.
+  " TODO: move to a global class, when table is separated as a component
+  PUBLIC SECTION.
+    DATA mt_col_spec TYPE zif_abapgit_definitions=>ty_col_spec_tt READ-ONLY.
+ 
+    METHODS add_column
+      IMPORTING
+        iv_tech_name      TYPE string OPTIONAL
+        iv_display_name   TYPE string OPTIONAL
+        iv_css_class      TYPE string OPTIONAL
+        iv_add_tz         TYPE abap_bool OPTIONAL
+        iv_title          TYPE string OPTIONAL
+        iv_allow_order_by TYPE any OPTIONAL
+      RETURNING
+        VALUE(ro_me) TYPE REF TO lcl_table_scheme.
+ 
+ENDCLASS.
+ 
+CLASS lcl_table_scheme IMPLEMENTATION.
+ 
+  METHOD add_column.
+ 
+    FIELD-SYMBOLS <ls_col> LIKE LINE OF mt_col_spec.
+    APPEND INITIAL LINE TO mt_col_spec ASSIGNING <ls_col>.
+    <ls_col>-display_name   = iv_display_name.
+    <ls_col>-tech_name      = iv_tech_name.
+    <ls_col>-title          = iv_title.
+    <ls_col>-css_class      = iv_css_class.
+    <ls_col>-add_tz         = iv_add_tz.
+    <ls_col>-allow_order_by = iv_allow_order_by.
+ 
+    ro_me = me.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap.html new file mode 100644 index 00000000000..704c0652b53 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap.html @@ -0,0 +1,4153 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_repo_view.clas.abap

+
+ +
+ 90.7% + Statements + 1230/1356 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 90.7% + Lines + 1230/1356 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +13571x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_repo_view DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES:
+      zif_abapgit_gui_event_handler,
+      zif_abapgit_gui_hotkeys,
+      zif_abapgit_gui_menu_provider,
+      zif_abapgit_gui_renderable.
+ 
+    CONSTANTS:
+      BEGIN OF c_actions,
+        change_dir        TYPE string VALUE 'change_dir' ##NO_TEXT,
+        toggle_hide_files TYPE string VALUE 'toggle_hide_files' ##NO_TEXT,
+        toggle_folders    TYPE string VALUE 'toggle_folders' ##NO_TEXT,
+        toggle_changes    TYPE string VALUE 'toggle_changes' ##NO_TEXT,
+        toggle_diff_first TYPE string VALUE 'toggle_diff_first ' ##NO_TEXT,
+        display_more      TYPE string VALUE 'display_more' ##NO_TEXT,
+        go_data           TYPE string VALUE 'go_data',
+        go_unit           TYPE string VALUE 'go_unit',
+      END OF c_actions .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_key        TYPE zif_abapgit_persistence=>ty_repo-key
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mo_repo_aggregated_state TYPE REF TO zcl_abapgit_item_state.
+    DATA mv_cur_dir TYPE string .
+    DATA mv_hide_files TYPE abap_bool .
+    DATA mv_max_lines TYPE i .
+    DATA mv_max_setting TYPE i .
+    DATA mv_show_folders TYPE abap_bool .
+    DATA mv_changes_only TYPE abap_bool .
+    DATA mv_order_by TYPE string .
+    DATA mv_order_descending TYPE abap_bool .
+    DATA mv_diff_first TYPE abap_bool .
+    DATA mv_key TYPE zif_abapgit_persistence=>ty_value .
+    DATA mv_are_changes_recorded_in_tr TYPE abap_bool .
+ 
+    METHODS render_head_line
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_view_dropdown
+      RETURNING
+        VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_item
+      IMPORTING
+        !is_item              TYPE zif_abapgit_definitions=>ty_repo_item
+        !iv_render_transports TYPE abap_bool
+      RETURNING
+        VALUE(ri_html)        TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_item_files
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_item_command
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_file_command
+      IMPORTING
+        !is_file       TYPE zif_abapgit_definitions=>ty_repo_file
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS get_item_class
+      IMPORTING
+        !is_item         TYPE zif_abapgit_definitions=>ty_repo_item
+        iv_is_object_row TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_html)   TYPE string .
+    METHODS render_item_transport
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_parent_dir
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_dir_jump_link
+      IMPORTING
+        !iv_path       TYPE string
+      RETURNING
+        VALUE(rv_html) TYPE string .
+    METHODS build_inactive_object_code
+      IMPORTING
+        !is_item                     TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_inactive_html_code) TYPE string .
+    METHODS build_srcsystem_code
+      IMPORTING
+        !is_item                      TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_srcsystem_html_code) TYPE string .
+    METHODS build_origlang_code
+      IMPORTING
+        !is_item                      TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(rv_html_code) TYPE string .
+    METHODS open_in_main_language
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_order_by
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS apply_order_by
+      CHANGING
+        !ct_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt .
+    METHODS build_branch_dropdown
+      RETURNING
+        VALUE(ro_branch_dropdown) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_tag_dropdown
+      RETURNING
+        VALUE(ro_tag_dropdown) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_advanced_dropdown
+      RETURNING
+        VALUE(ro_advanced_dropdown) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_main_toolbar
+      RETURNING
+        VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_repo_lang_logon_lang
+      RETURNING
+        VALUE(rv_repo_lang_is_logon_lang) TYPE abap_bool .
+ 
+    METHODS render_item_changed_by
+      IMPORTING
+        !is_item       TYPE zif_abapgit_definitions=>ty_repo_item
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS order_files
+      CHANGING
+        ct_files TYPE zif_abapgit_definitions=>ty_repo_file_tt.
+ 
+    METHODS get_crossout
+      IMPORTING
+        !iv_authorization  TYPE zif_abapgit_auth=>ty_authorization OPTIONAL
+        !iv_protected      TYPE abap_bool DEFAULT abap_false
+        !iv_strong         TYPE abap_bool DEFAULT abap_false
+          PREFERRED PARAMETER iv_authorization
+      RETURNING
+        VALUE(rv_crossout) LIKE zif_abapgit_html=>c_html_opt-crossout.
+ 
+    METHODS check_branch
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION.
+ 
+ 
+  METHOD apply_order_by.
+
+    DATA:
+      lt_sort                        TYPE abap_sortorder_tab,
+      ls_sort                        LIKE LINE OF lt_sort,
+      lt_non_code_and_metadata_items LIKE ct_repo_items,
+      lt_code_items                  LIKE ct_repo_items,
+      lt_diff_items                  LIKE ct_repo_items.
+
+    FIELD-SYMBOLS:
+      <ls_repo_item> TYPE zif_abapgit_definitions=>ty_repo_item.
+
+    IF mv_order_by IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    " we want to preserve non-code and metadata files at the top,
+    " so we isolate them and and sort only the code artifacts
+    LOOP AT ct_repo_items ASSIGNING <ls_repo_item>.
+
+      IF <ls_repo_item>-obj_type IS INITIAL AND <ls_repo_item>-is_dir = abap_false.
+        INSERT <ls_repo_item> INTO TABLE lt_non_code_and_metadata_items.
+      ELSE.
+        INSERT <ls_repo_item> INTO TABLE lt_code_items.
+      ENDIF.
+
+    ENDLOOP.
+
+    IF mv_diff_first = abap_true.
+      " fix diffs on the top, right after non-code and metadata
+      LOOP AT lt_code_items ASSIGNING <ls_repo_item>
+                            WHERE changes > 0.
+        INSERT <ls_repo_item> INTO TABLE lt_diff_items.
+      ENDLOOP.
+
+      DELETE lt_code_items WHERE changes > 0.
+    ENDIF.
+
+    CLEAR: ct_repo_items.
+
+    ls_sort-descending = mv_order_descending.
+    ls_sort-astext     = abap_true.
+    ls_sort-name       = mv_order_by.
+    INSERT ls_sort INTO TABLE lt_sort.
+
+    " Combine state fields for order of 'Status' column
+    IF mv_order_by = 'LSTATE'.
+      ls_sort-name = 'RSTATE'.
+      INSERT ls_sort INTO TABLE lt_sort.
+    ENDIF.
+
+    " Use object name as secondary sort criteria
+    IF mv_order_by <> 'OBJ_NAME'.
+      ls_sort-name = 'OBJ_NAME'.
+      INSERT ls_sort INTO TABLE lt_sort.
+    ENDIF.
+
+    SORT lt_code_items STABLE BY (lt_sort).
+    SORT lt_diff_items STABLE BY (lt_sort).
+
+    INSERT LINES OF lt_non_code_and_metadata_items INTO TABLE ct_repo_items.
+    INSERT LINES OF lt_diff_items INTO TABLE ct_repo_items.
+    INSERT LINES OF lt_code_items INTO TABLE ct_repo_items.
+
+    " Files are listed under the object names so we always sort them by name
+    LOOP AT ct_repo_items ASSIGNING <ls_repo_item>.
+      order_files( CHANGING ct_files = <ls_repo_item>-files ).
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD build_advanced_dropdown.
+ 
+    CREATE OBJECT ro_advanced_dropdown.
+ 
+    ro_advanced_dropdown->add( iv_txt = 'Activate Objects'
+                               iv_act = |{ zif_abapgit_definitions=>c_action-repo_activate_objects }?key={ mv_key }| ).
+ 
+    IF mo_repo->is_offline( ) = abap_false. " Online ?
+      ro_advanced_dropdown->add(
+        iv_txt = 'Transport to Branch'
+        iv_act = |{ zif_abapgit_definitions=>c_action-repo_transport_to_branch }?key={ mv_key }|
+        iv_opt = get_crossout( zif_abapgit_auth=>c_authorization-transport_to_branch ) ).
+    ENDIF.
+ 
+    IF mv_are_changes_recorded_in_tr = abap_true.
+      ro_advanced_dropdown->add(
+        iv_txt = 'Add All Objects to Transport'
+        iv_act = |{ zif_abapgit_definitions=>c_action-repo_add_all_obj_to_trans_req }?key={ mv_key }| ).
+    ENDIF.
+    IF mo_repo->is_offline( ) = abap_true.
+      ro_advanced_dropdown->add( iv_txt = 'Export by Transport'
+                                 iv_act = |{ zif_abapgit_definitions=>c_action-zip_export_transport }?key={ mv_key }| ).
+    ELSE.
+      ro_advanced_dropdown->add( iv_txt = 'Stage by Transport'
+                                 iv_act = |{ zif_abapgit_definitions=>c_action-go_stage_transport }?key={ mv_key }| ).
+    ENDIF.
+ 
+    ro_advanced_dropdown->add( iv_txt = 'Quality Assurance'
+                               iv_typ = zif_abapgit_html=>c_action_type-separator ).
+ 
+    ro_advanced_dropdown->add( iv_txt = 'Syntax Check'
+                               iv_act = |{ zif_abapgit_definitions=>c_action-repo_syntax_check }?key={ mv_key }| ).
+    ro_advanced_dropdown->add( iv_txt = 'Unit Test'
+                               iv_act = |{ c_actions-go_unit }| ).
+    ro_advanced_dropdown->add( iv_txt = 'Run Code Inspector'
+                               iv_act = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }?key={ mv_key }| ).
+ 
+    ro_advanced_dropdown->add( iv_txt = 'Very Advanced'
+                               iv_typ = zif_abapgit_html=>c_action_type-separator ).
+ 
+    ro_advanced_dropdown->add( iv_txt = 'Update Local Checksums'
+                               iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh_checksums }?key={ mv_key }|
+                               iv_opt = get_crossout( zif_abapgit_auth=>c_authorization-update_local_checksum ) ).
+ 
+    ro_advanced_dropdown->add( iv_txt = 'Beta - Data'
+                               iv_act = |{ c_actions-go_data }?key={ mv_key }| ).
+ 
+    IF is_repo_lang_logon_lang( ) = abap_false AND zcl_abapgit_services_abapgit=>get_abapgit_tcode( ) IS NOT INITIAL.
+      ro_advanced_dropdown->add(
+        iv_txt = 'Open in Main Language'
+        iv_act = |{ zif_abapgit_definitions=>c_action-repo_open_in_master_lang }?key={ mv_key }| ).
+    ENDIF.
+ 
+    ro_advanced_dropdown->add( iv_txt = 'Danger'
+                               iv_typ = zif_abapgit_html=>c_action_type-separator ).
+ 
+    ro_advanced_dropdown->add( iv_txt   = 'Remove'
+                               iv_title = `Remove abapGit's records of the repository (the system's `
+                                          && `development objects will remain unaffected)`
+                               iv_act   = |{ zif_abapgit_definitions=>c_action-repo_remove }?key={ mv_key }| ).
+ 
+    ro_advanced_dropdown->add( iv_txt   = 'Uninstall'
+                               iv_title = `Delete all development objects belonging to this package `
+                                          && `(and subpackages) from the system`
+                               iv_act   = |{ zif_abapgit_definitions=>c_action-repo_purge }?key={ mv_key }|
+                               iv_opt   = get_crossout(
+                                            iv_authorization = zif_abapgit_auth=>c_authorization-uninstall
+                                            iv_protected     = abap_true ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_branch_dropdown.
+ 
+    CREATE OBJECT ro_branch_dropdown.
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    ro_branch_dropdown->add( iv_txt = 'Switch'
+                             iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ mv_key }| ).
+    ro_branch_dropdown->add( iv_txt = 'Create'
+                             iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_create }?key={ mv_key }| ).
+    ro_branch_dropdown->add( iv_txt = 'Delete'
+                             iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_delete }?key={ mv_key }| ).
+    ro_branch_dropdown->add( iv_txt = 'Merge'
+                             iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_merge }?key={ mv_key }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_dir_jump_link.
+ 
+    DATA lv_path   TYPE string.
+    DATA lv_encode TYPE string.
+    DATA li_html TYPE REF TO zif_abapgit_html.
+ 
+    CREATE OBJECT li_html TYPE zcl_abapgit_html.
+ 
+    lv_path = iv_path.
+    REPLACE FIRST OCCURRENCE OF mv_cur_dir IN lv_path WITH ''.
+    lv_encode = zcl_abapgit_html_action_utils=>dir_encode( lv_path ).
+ 
+    " remove leading and trailing / for display
+    IF lv_path <> '/'.
+      IF lv_path(1) = '/'.
+        lv_path = lv_path+1.
+      ENDIF.
+      IF substring( val = reverse( lv_path )
+                    len = 1 ) = '/'.
+        lv_path = substring( val = lv_path
+                             len = strlen( lv_path ) - 1 ).
+      ENDIF.
+    ENDIF.
+ 
+    rv_html = li_html->a(
+      iv_txt = lv_path
+      iv_act = |{ c_actions-change_dir }?{ lv_encode }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_inactive_object_code.
+ 
+    IF is_item-inactive = abap_true.
+      rv_inactive_html_code = zcl_abapgit_html=>icon(
+        iv_name  = 'bolt/orange'
+        iv_hint  = 'Object or object part is inactive'
+        iv_class = 'inactive' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_main_toolbar.
+ 
+    DATA:
+      li_log TYPE REF TO zif_abapgit_log.
+ 
+    CREATE OBJECT ro_toolbar EXPORTING iv_id = 'toolbar-repo'.
+ 
+    IF mo_repo->is_offline( ) = abap_false.
+      " online repo
+ 
+      IF mo_repo_aggregated_state->is_unchanged( ) = abap_false. " Any changes
+        ro_toolbar->add( iv_txt = 'Pull'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?key={ mv_key }|
+                         iv_opt = get_crossout( iv_protected = abap_true
+                                                iv_strong    = abap_true ) ).
+        ro_toolbar->add( iv_txt = 'Stage'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+        ro_toolbar->add( iv_txt = 'Patch'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-go_patch }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+        ro_toolbar->add( iv_txt = 'Diff'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-go_repo_diff }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ENDIF.
+      li_log = mo_repo->get_log( ).
+      IF li_log IS BOUND AND li_log->count( ) > 0.
+        ro_toolbar->add( iv_txt = 'Log'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-repo_log }?key={ mv_key }| ).
+      ENDIF.
+      ro_toolbar->add( iv_txt = 'Branch'
+                       io_sub = build_branch_dropdown( ) ).
+      ro_toolbar->add( iv_txt = 'Tag'
+                       io_sub = build_tag_dropdown( ) ).
+ 
+    ELSE.
+      " offline repo
+ 
+      IF mo_repo->has_remote_source( ) = abap_true AND mo_repo_aggregated_state->is_unchanged( ) = abap_false.
+        ro_toolbar->add( iv_txt = 'Pull <sup>zip</sup>'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+        ro_toolbar->add( iv_txt = 'Diff'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-go_repo_diff }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ENDIF.
+      ro_toolbar->add( iv_txt = 'Import <sup>zip</sup>'
+                       iv_act = |{ zif_abapgit_definitions=>c_action-zip_import }?key={ mv_key }|
+                       iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      IF mo_repo->get_local_settings( )-write_protected = abap_true.
+        ro_toolbar->add( iv_txt = 'Compare <sup>rfc</sup>'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-rfc_compare }?key={ mv_key }|
+                         iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      ENDIF.
+      ro_toolbar->add( iv_txt = 'Export <sup>zip</sup>'
+                       iv_act = |{ zif_abapgit_definitions=>c_action-zip_export }?key={ mv_key }|
+                       iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+      li_log = mo_repo->get_log( ).
+      IF li_log IS BOUND AND li_log->count( ) > 0.
+        ro_toolbar->add( iv_txt = 'Log'
+                         iv_act = |{ zif_abapgit_definitions=>c_action-repo_log }?key={ mv_key }| ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+    ro_toolbar->add( iv_txt = 'Advanced'
+                     io_sub = build_advanced_dropdown( ) ).
+ 
+    ro_toolbar->add( iv_txt = 'View'
+                     io_sub = build_view_dropdown( ) ).
+ 
+    ro_toolbar->add( iv_txt = 'Refresh'
+                     iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh }?key={ mv_key }|
+                     iv_opt = zif_abapgit_html=>c_html_opt-strong ).
+ 
+    ro_toolbar->add( iv_txt   = 'Settings'
+                     iv_act   = |{ zif_abapgit_definitions=>c_action-repo_settings }?key={ mv_key }|
+                     iv_opt   = zif_abapgit_html=>c_html_opt-strong
+                     iv_title = `Repository Settings` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_origlang_code.
+ 
+    IF is_item-origlang IS NOT INITIAL AND is_item-origlang <> mo_repo->get_dot_abapgit( )->get_main_language( ).
+      rv_html_code = zcl_abapgit_html=>icon(
+        iv_name  = 'language-solid/grey'
+        iv_hint  = |Original language: { is_item-origlang }|
+        iv_class = 'cursor-pointer' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_srcsystem_code.
+ 
+    IF is_item-srcsystem IS NOT INITIAL AND is_item-srcsystem <> sy-sysid.
+      rv_srcsystem_html_code = zcl_abapgit_html=>icon(
+        iv_name  = 'server-solid/grey'
+        iv_hint  = |Original system: { is_item-srcsystem }|
+        iv_class = 'cursor-pointer' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_tag_dropdown.
+ 
+    CREATE OBJECT ro_tag_dropdown.
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    ro_tag_dropdown->add( iv_txt = 'Switch'
+                          iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_switch }?key={ mv_key }| ).
+    ro_tag_dropdown->add( iv_txt = 'Create'
+                          iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_create }?key={ mv_key }| ).
+    ro_tag_dropdown->add( iv_txt = 'Delete'
+                          iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_delete }?key={ mv_key }| ).
+ 
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD build_view_dropdown.
+ 
+    CREATE OBJECT ro_toolbar.
+ 
+    ro_toolbar->add(
+      iv_txt = 'Changes First'
+      iv_chk = mv_diff_first
+      iv_act = c_actions-toggle_diff_first ).
+ 
+    ro_toolbar->add(
+      iv_txt = 'Changes Only'
+      iv_chk = mv_changes_only
+      iv_act = c_actions-toggle_changes ).
+ 
+    ro_toolbar->add(
+      iv_txt = 'File Paths'
+      iv_chk = boolc( NOT mv_hide_files = abap_true )
+      iv_act = c_actions-toggle_hide_files ).
+ 
+    ro_toolbar->add(
+      iv_txt = 'Folders'
+      iv_chk = mv_show_folders
+      iv_act = c_actions-toggle_folders ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_branch.
+
+    DATA lo_repo TYPE REF TO zif_abapgit_repo_online.
+
+    IF mo_repo->is_offline( ) = abap_false.
+      lo_repo ?= mo_repo.
+      lo_repo->check_for_valid_branch( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lo_settings         TYPE REF TO zcl_abapgit_settings,
+          lx_error            TYPE REF TO zcx_abapgit_exception,
+          lo_persistence_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    super->constructor( ).
+ 
+    TRY.
+        lo_persistence_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+        mv_key = iv_key.
+        mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+        mv_cur_dir = '/'. " Root
+ 
+        mv_hide_files = lo_persistence_user->get_hide_files( ).
+        mv_changes_only = lo_persistence_user->get_changes_only( ).
+        mv_order_by = lo_persistence_user->get_order_by( ).
+        mv_order_descending = lo_persistence_user->get_order_descending( ).
+        mv_diff_first = lo_persistence_user->get_diff_first( ).
+        mv_show_folders = lo_persistence_user->get_show_folders( ).
+ 
+        " Read global settings to get max # of objects to be listed
+        lo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+        mv_max_lines = lo_settings->get_max_lines( ).
+        mv_max_setting = mv_max_lines.
+ 
+      CATCH zcx_abapgit_exception INTO lx_error.
+        " Reset 'last shown repo' so next start will go to repo overview
+        " and allow troubleshooting of issue
+        zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ).
+ 
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_repo_view.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        iv_key = iv_key.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title         = 'Repository'
+      ii_page_menu_provider = lo_component
+      ii_child_component    = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_crossout.
+    IF iv_strong = abap_true.
+      rv_crossout = zif_abapgit_html=>c_html_opt-strong.
+    ENDIF.
+    IF iv_protected = abap_true AND mo_repo->get_local_settings( )-write_protected = abap_true.
+      rv_crossout = zif_abapgit_html=>c_html_opt-crossout.
+    ENDIF.
+    IF iv_authorization IS NOT INITIAL AND zcl_abapgit_auth=>is_allowed( iv_authorization ) = abap_false.
+      rv_crossout = zif_abapgit_html=>c_html_opt-crossout.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_item_class.
+ 
+    DATA lt_class TYPE TABLE OF string.
+ 
+    IF iv_is_object_row = abap_true.
+      APPEND 'object_row' TO lt_class.
+    ELSE.
+      APPEND 'file_row' TO lt_class.
+    ENDIF.
+ 
+    IF is_item-is_dir = abap_true.
+      APPEND 'folder' TO lt_class.
+    ELSEIF is_item-changes > 0.
+      APPEND 'modified' TO lt_class.
+    ELSEIF is_item-obj_name IS INITIAL.
+      APPEND 'unsupported' TO lt_class.
+    ENDIF.
+ 
+    IF lines( lt_class ) > 0.
+      rv_html = | class="{ concat_lines_of( table = lt_class
+                                            sep = ` ` ) }"|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_repo_lang_logon_lang.
+    rv_repo_lang_is_logon_lang = boolc( mo_repo->get_dot_abapgit( )->get_main_language( ) = sy-langu ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_in_main_language.
+
+    DATA:
+      lv_main_language TYPE spras,
+      ls_item          TYPE zif_abapgit_definitions=>ty_item,
+      lv_tcode         TYPE tcode.
+
+    lv_main_language = mo_repo->get_dot_abapgit( )->get_main_language( ).
+    lv_tcode = zcl_abapgit_services_abapgit=>get_abapgit_tcode( ).
+    ASSERT lv_tcode IS NOT INITIAL.
+
+    IF lv_main_language = sy-langu.
+      zcx_abapgit_exception=>raise( |Repo already opened in main language| ).
+    ENDIF.
+
+    ls_item-obj_name = lv_tcode.
+    ls_item-obj_type = |TRAN|.
+
+    IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+      zcx_abapgit_exception=>raise( |Please install the abapGit repository| ).
+    ENDIF.
+
+    zcl_abapgit_objects_factory=>get_gui_jumper( )->jump_abapgit(
+      iv_language = lv_main_language
+      iv_key      = mo_repo->get_key( ) ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD order_files.
+
+    DATA:
+      lt_sort TYPE abap_sortorder_tab,
+      ls_sort LIKE LINE OF lt_sort.
+
+    IF lines( ct_files ) = 0.
+      RETURN.
+    ENDIF.
+
+    ls_sort-descending = mv_order_descending.
+    ls_sort-astext     = abap_true.
+    ls_sort-name       = 'PATH'.
+    INSERT ls_sort INTO TABLE lt_sort.
+
+    ls_sort-descending = mv_order_descending.
+    ls_sort-astext     = abap_true.
+    ls_sort-name       = 'FILENAME'.
+    INSERT ls_sort INTO TABLE lt_sort.
+
+    SORT ct_files STABLE BY (lt_sort).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD render_file_command.
+ 
+    DATA: lv_difflink TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div>' ).
+    IF is_file-is_changed = abap_true.
+      lv_difflink = zcl_abapgit_html_action_utils=>file_encode(
+        iv_key  = mo_repo->get_key( )
+        ig_file = is_file ).
+      ri_html->add_a( iv_txt = 'diff'
+                      iv_act = |{ zif_abapgit_definitions=>c_action-go_file_diff }?{ lv_difflink }| ).
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state( iv_lstate = is_file-lstate
+                                                                  iv_rstate = is_file-rstate ) ).
+    ELSE.
+      ri_html->add( '&nbsp;' ).
+    ENDIF.
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_head_line.
+ 
+    DATA:
+      lo_toolbar      TYPE REF TO zcl_abapgit_html_toolbar,
+      ls_settings     TYPE zif_abapgit_definitions=>ty_s_user_settings,
+      lo_label_colors TYPE REF TO zcl_abapgit_string_map,
+      lt_labels       TYPE string_table.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    lo_toolbar = build_main_toolbar( ).
+ 
+    ri_html->add( '<div class="paddings">' ).
+    ri_html->add( '<table class="w100"><tr>' ).
+ 
+    IF mv_show_folders = abap_true.
+      ri_html->add( '<td class="current_dir">' ).
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_path( mv_cur_dir ) ).
+      ri_html->add( '</td>' ).
+    ENDIF.
+ 
+    lt_labels = zcl_abapgit_repo_labels=>split( mo_repo->ms_data-local_settings-labels ).
+ 
+    IF lines( lt_labels ) > 0.
+      ls_settings = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_user_settings( ).
+      lo_label_colors = zcl_abapgit_repo_labels=>split_colors_into_map( ls_settings-label_colors ).
+ 
+      ri_html->td(
+        iv_content = zcl_abapgit_gui_chunk_lib=>render_label_list(
+                       it_labels = lt_labels
+                       io_label_colors = lo_label_colors )
+        iv_class   = 'labels' ).
+    ENDIF.
+ 
+    ri_html->add( '<td class="right">' ).
+    ri_html->add( lo_toolbar->render( iv_right = abap_true ) ).
+    ri_html->add( '</td>' ).
+    ri_html->add( '</tr></table>' ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item.
+ 
+    DATA: lv_link    TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( |<tr{ get_item_class( is_item = is_item
+                                        iv_is_object_row = abap_true ) }>| ).
+ 
+    IF is_item-obj_name IS INITIAL AND is_item-is_dir = abap_false.
+      ri_html->add( |<td colspan="2"></td>|
+                 && '<td class="object">'
+                 && '<i class="grey">non-code and meta files</i>'
+                 && '</td>' ).
+    ELSE.
+      ri_html->add( |<td class="icon">{ zcl_abapgit_gui_chunk_lib=>get_item_icon( is_item ) }</td>| ).
+ 
+      IF is_item-is_dir = abap_true. " Subdir
+        lv_link = build_dir_jump_link( is_item-path ).
+        ri_html->add( |<td class="dir" colspan="2">{ lv_link }</td>| ).
+      ELSE.
+        lv_link = zcl_abapgit_gui_chunk_lib=>get_item_link( is_item ).
+        ri_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
+        ri_html->add( |<td class="object">{ lv_link } { build_inactive_object_code( is_item )
+                      } { build_srcsystem_code( is_item ) } { build_origlang_code( is_item ) }</td>| ).
+      ENDIF.
+    ENDIF.
+ 
+    " Changed by
+    ri_html->add( '<td class="user">' ).
+    ri_html->add( render_item_changed_by( is_item ) ).
+    ri_html->add( '</td>' ).
+ 
+    IF iv_render_transports = abap_true.
+      ri_html->add( render_item_transport( is_item ) ).
+    ENDIF.
+ 
+    " Command
+    ri_html->add( '<td class="cmd">' ).
+    IF mo_repo->has_remote_source( ) = abap_true.
+      ri_html->add( render_item_command( is_item ) ).
+    ENDIF.
+    ri_html->add( '</td>' ).
+ 
+    ri_html->add( '</tr>' ).
+ 
+    ri_html->add( render_item_files( is_item ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_changed_by.
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF is_item-changes = 0 OR is_item-changed_by IS INITIAL.
+      ri_html->add( '&nbsp;' ).
+    ELSE.
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( is_item-changed_by ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_command.
+ 
+    DATA lv_difflink TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF is_item-is_dir = abap_true. " Directory
+      ri_html->add( '<div>' ).
+      ri_html->add( |<span class="grey">{ is_item-changes } changes</span>| ).
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state( iv_lstate = is_item-lstate
+                                                                  iv_rstate = is_item-rstate ) ).
+      ri_html->add( '</div>' ).
+ 
+    ELSEIF is_item-changes > 0.
+      IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL.
+ 
+        lv_difflink = zcl_abapgit_html_action_utils=>obj_encode(
+          iv_key    = mo_repo->get_key( )
+          ig_object = is_item ).
+ 
+        ri_html->add( '<div>' ).
+        ri_html->add_a( iv_txt = |diff ({ is_item-changes })|
+                        iv_act = |{ zif_abapgit_definitions=>c_action-go_file_diff }?{ lv_difflink }| ).
+        ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state( iv_lstate = is_item-lstate
+                                                                    iv_rstate = is_item-rstate ) ).
+        ri_html->add( '</div>' ).
+ 
+      ENDIF.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_files.
+ 
+    DATA: ls_file LIKE LINE OF is_item-files.
+    DATA li_exit TYPE REF TO zif_abapgit_exit.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    IF mv_hide_files = abap_true AND is_item-obj_type IS NOT INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    li_exit = zcl_abapgit_exit=>get_instance( ).
+ 
+    LOOP AT is_item-files INTO ls_file.
+      ri_html->add( |<tr{ get_item_class( is_item ) }>| ).
+ 
+      ri_html->add( |<td class="icon"></td>| ).
+ 
+      ri_html->add( |<td class="type"></td>| ).
+      ri_html->add( |<td class="filename darkgrey">| ).
+ 
+      IF mv_show_folders = abap_true.
+        ri_html->add( |<div>{ li_exit->adjust_display_filename( ls_file-filename ) }</div>| ).
+      ELSE.
+        ri_html->add( |<div>{ li_exit->adjust_display_filename( ls_file-path && ls_file-filename ) }</div>| ).
+      ENDIF.
+ 
+      ri_html->add( |</td>| ).
+ 
+      " Changed by (not applicable to file)
+      ri_html->add( '<td class="user">' ).
+      ri_html->add( '</td>' ).
+ 
+      " Transport (not applicable to file)
+      IF mv_are_changes_recorded_in_tr = abap_true.
+        ri_html->add( `<td></td>` ).
+      ENDIF.
+ 
+      " Command
+      ri_html->add( '<td class="cmd">' ).
+      IF mo_repo->has_remote_source( ) = abap_true.
+        ri_html->add( render_file_command( ls_file ) ).
+      ENDIF.
+      ri_html->add( '</td>' ).
+ 
+      ri_html->add( '</tr>' ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_item_transport.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<td class="transport">' ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_transport( is_item-transport ) ).
+ 
+    ri_html->add( '</td>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_order_by.
+ 
+    DATA:
+      lv_icon     TYPE string,
+      lt_col_spec TYPE zif_abapgit_definitions=>ty_col_spec_tt,
+      ls_col_spec TYPE zif_abapgit_definitions=>ty_col_spec.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    " icon
+    APPEND INITIAL LINE TO lt_col_spec.
+ 
+    ls_col_spec-tech_name = 'OBJ_TYPE'.
+    ls_col_spec-display_name = 'Type'.
+    ls_col_spec-allow_order_by = abap_true.
+    APPEND ls_col_spec TO lt_col_spec.
+ 
+    ls_col_spec-tech_name = 'OBJ_NAME'.
+    ls_col_spec-display_name = 'Name'.
+    ls_col_spec-allow_order_by = abap_true.
+    APPEND ls_col_spec TO lt_col_spec.
+ 
+    ls_col_spec-tech_name = 'CHANGED_BY'.
+    ls_col_spec-display_name = 'Changed by'.
+    ls_col_spec-allow_order_by = abap_true.
+    APPEND ls_col_spec TO lt_col_spec.
+ 
+    IF mv_are_changes_recorded_in_tr = abap_true.
+      ls_col_spec-tech_name = 'TRANSPORT'.
+      ls_col_spec-display_name = 'Transport'.
+      ls_col_spec-allow_order_by = abap_true.
+      APPEND ls_col_spec TO lt_col_spec.
+    ENDIF.
+ 
+    ls_col_spec-tech_name = 'LSTATE'.
+    ls_col_spec-display_name = 'Status'.
+    ls_col_spec-allow_order_by = abap_true.
+    ls_col_spec-css_class = 'cmd'.
+    APPEND ls_col_spec TO lt_col_spec.
+ 
+    ri_html->add( |<thead>| ).
+    ri_html->add( |<tr>| ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_order_by_header_cells(
+      it_col_spec         = lt_col_spec
+      iv_order_by         = mv_order_by
+      iv_order_descending = mv_order_descending ) ).
+ 
+    IF mv_diff_first = abap_true.
+      lv_icon = 'check/blue'.
+    ELSE.
+      lv_icon = 'check/grey'.
+    ENDIF.
+ 
+    ri_html->add( '</tr>' ).
+    ri_html->add( '</thead>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_parent_dir.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<tr class="folder">' ).
+    ri_html->add( |<td class="icon">{ ri_html->icon( 'folder' ) }</td>| ).
+    ri_html->add( |<td class="dir" colspan="4">{ build_dir_jump_link( '..' ) }</td>| ).
+    IF mo_repo->has_remote_source( ) = abap_true.
+      ri_html->add( |<td colspan="1"></td>| ). " Dummy for online
+    ENDIF.
+    ri_html->add( '</tr>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_palette(
+      iv_action = zif_abapgit_definitions=>c_action-go_repo ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA lv_path TYPE string.
+    DATA lv_key TYPE zif_abapgit_persistence=>ty_value.
+ 
+    lv_key = ii_event->query( )->get( 'KEY' ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_repo. " Switch to another repo
+        rs_handled-page  = create( |{ ii_event->query( )->get( 'KEY' ) }| ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+ 
+      WHEN c_actions-go_data.
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_data
+          EXPORTING
+            iv_key = |{ ii_event->query( )->get( 'KEY' ) }|.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_actions-go_unit.
+        rs_handled-page  = zcl_abapgit_gui_page_runit=>create( mo_repo ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_actions-toggle_hide_files. " Toggle file diplay
+        mv_hide_files    = zcl_abapgit_persistence_user=>get_instance( )->toggle_hide_files( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-change_dir.        " Change dir
+        lv_path         = ii_event->query( )->get( 'PATH' ).
+        mv_cur_dir = zcl_abapgit_path=>change_dir(
+          iv_cur_dir = mv_cur_dir
+          iv_cd      = lv_path ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-toggle_folders.    " Toggle folder view
+        mv_show_folders = zcl_abapgit_persistence_user=>get_instance( )->toggle_show_folders( ).
+        mv_cur_dir      = '/'. " Root
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-toggle_changes.    " Toggle changes only view
+        mv_changes_only = zcl_abapgit_persistence_user=>get_instance( )->toggle_changes_only( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-toggle_diff_first.
+        mv_diff_first = zcl_abapgit_persistence_user=>get_instance( )->set_diff_first(
+          boolc( mv_diff_first = abap_false ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_actions-display_more.      " Increase MAX lines limit
+        mv_max_lines    = mv_max_lines + mv_max_setting.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-change_order_by.
+        mv_order_by = zcl_abapgit_persistence_user=>get_instance( )->set_order_by(
+          ii_event->query( )->get( 'ORDERBY' ) ).
+        mv_order_descending = zcl_abapgit_persistence_user=>get_instance( )->set_order_descending( abap_false ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-direction.
+        mv_order_descending = zcl_abapgit_persistence_user=>get_instance( )->set_order_descending(
+          boolc( ii_event->query( )->get( 'DIRECTION' ) = 'DESCENDING' ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-repo_open_in_master_lang.
+        open_in_main_language( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN zif_abapgit_definitions=>c_action-go_patch.
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_patch
+          EXPORTING
+            iv_key = lv_key.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+    ls_hotkey_action-ui_component = 'Repo'.
+ 
+    ls_hotkey_action-description   = |Stage|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_stage.
+    ls_hotkey_action-hotkey = |s|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Switch Branch|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-git_branch_switch.
+    ls_hotkey_action-hotkey = |b|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Repository List|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-abapgit_home.
+    ls_hotkey_action-hotkey = |o|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Refresh Repository|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_refresh.
+    ls_hotkey_action-hotkey = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Pull|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-git_pull.
+    ls_hotkey_action-hotkey = |p|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description = |Patch|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_patch.
+    ls_hotkey_action-hotkey = |a|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Diff|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_repo_diff.
+    ls_hotkey_action-hotkey = |d|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Uninstall Repository|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_purge.
+    ls_hotkey_action-hotkey = |u|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Run Syntax Check|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_syntax_check.
+    ls_hotkey_action-hotkey = |c|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Run Code Inspector|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_code_inspector.
+    ls_hotkey_action-hotkey = |i|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description   = |Show Log|.
+    ls_hotkey_action-action = zif_abapgit_definitions=>c_action-repo_log.
+    ls_hotkey_action-hotkey = |l|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_menu_provider~get_menu.
+ 
+    CREATE OBJECT ro_toolbar EXPORTING iv_id = 'toolbar-main'.
+ 
+    ro_toolbar->add(
+      iv_txt = zcl_abapgit_gui_buttons=>repo_list( )
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>help( )
+      iv_title = 'Help'
+      io_sub = zcl_abapgit_gui_chunk_lib=>help_submenu( ) ).
+ 
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
+      ro_toolbar->add(
+        iv_txt   = zcl_abapgit_gui_buttons=>experimental( )
+        iv_title = 'Experimental Features are Enabled'
+        iv_act   = zif_abapgit_definitions=>c_action-go_settings ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA: lt_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt,
+          lo_browser    TYPE REF TO zcl_abapgit_repo_content_list,
+          lx_error      TYPE REF TO zcx_abapgit_exception,
+          lv_max        TYPE abap_bool,
+          lv_max_str    TYPE string,
+          lv_add_str    TYPE string,
+          li_log        TYPE REF TO zif_abapgit_log,
+          lv_msg        TYPE string,
+          lo_news       TYPE REF TO zcl_abapgit_news.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_repo_items.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT mo_repo_aggregated_state.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    TRY.
+        " Reinit, for the case of type change
+        mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ).
+ 
+        check_branch( ).
+ 
+        mv_are_changes_recorded_in_tr = zcl_abapgit_factory=>get_sap_package( mo_repo->get_package( )
+          )->are_changes_recorded_in_tr_req( ).
+ 
+        lo_news = zcl_abapgit_news=>create( mo_repo ).
+ 
+        ri_html->add( |<div class="repo" id="repo{ mv_key }">| ).
+        ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+          io_repo               = mo_repo
+          io_news               = lo_news
+          iv_show_edit          = abap_true
+          iv_interactive_branch = abap_true ) ).
+ 
+        ri_html->add( zcl_abapgit_gui_chunk_lib=>render_news( io_news = lo_news ) ).
+ 
+        zcl_abapgit_exit=>get_instance( )->wall_message_repo(
+          is_repo_meta = mo_repo->ms_data
+          ii_html      = ri_html ).
+ 
+        CREATE OBJECT lo_browser
+          EXPORTING
+            io_repo = mo_repo.
+ 
+        lt_repo_items = lo_browser->list( iv_path         = mv_cur_dir
+                                          iv_by_folders   = mv_show_folders
+                                          iv_changes_only = mv_changes_only
+                                          iv_transports   = mv_are_changes_recorded_in_tr ).
+ 
+        apply_order_by( CHANGING ct_repo_items = lt_repo_items ).
+ 
+        LOOP AT lt_repo_items ASSIGNING <ls_item>.
+          mo_repo_aggregated_state->sum_with_repo_item( <ls_item> ).
+        ENDLOOP.
+ 
+        ri_html->add( render_head_line( ) ).
+ 
+        li_log = lo_browser->get_log( ).
+        IF li_log->count( ) > 0.
+          ri_html->add( '<div class="log">' ).
+          ri_html->add( zcl_abapgit_log_viewer=>to_html( li_log ) ). " shows eg. list of unsupported objects
+          ri_html->add( '</div>' ).
+        ENDIF.
+ 
+        ri_html->add( '<div class="repo_container">' ).
+ 
+        CLEAR lv_msg.
+ 
+        IF lines( lt_repo_items ) = 0.
+          IF mv_changes_only = abap_true.
+            IF mo_repo->is_offline( ) = abap_true.
+              " Offline match banner
+              IF mo_repo->has_remote_source( ) = abap_true.
+                lv_msg = 'Local state completely <b>matches</b> the ZIP file'.
+              ELSE.
+                lv_msg = 'Import a ZIP file to see if there are any changes'.
+              ENDIF.
+            ELSE.
+              " Online match banner
+              lv_msg = 'Local state completely <b>matches</b> the remote repository'.
+            ENDIF.
+          ELSE.
+            lv_msg = |Package is empty. Show { build_dir_jump_link( 'parent' ) } package|.
+          ENDIF.
+        ELSE.
+          " Repo content table
+          ri_html->add( '<table class="repo_tab">' ).
+ 
+          ri_html->add( render_order_by( ) ).
+ 
+          IF zcl_abapgit_path=>is_root( mv_cur_dir ) = abap_false.
+            ri_html->add( render_parent_dir( ) ).
+          ENDIF.
+ 
+          LOOP AT lt_repo_items ASSIGNING <ls_item>.
+            IF mv_max_lines > 0 AND sy-tabix > mv_max_lines.
+              lv_max = abap_true.
+              EXIT. " current loop
+            ENDIF.
+            ri_html->add( render_item( is_item = <ls_item>
+                                       iv_render_transports = mv_are_changes_recorded_in_tr ) ).
+          ENDLOOP.
+ 
+          IF mv_changes_only = abap_true.
+            ri_html->add( `<tfoot><tr><td class="grey" colspan="5">` ).
+            ri_html->add( `(Only changes are shown. ` ).
+            ri_html->add( ri_html->a(
+              iv_txt   = |Show All|
+              iv_act   = |{ c_actions-toggle_changes }| ) ).
+            ri_html->add( `)</td></tr></tfoot>` ).
+          ENDIF.
+ 
+          ri_html->add( '</table>' ).
+        ENDIF.
+ 
+        IF NOT lv_msg IS INITIAL.
+          ri_html->add( |<div class="panel success repo_banner">{ lv_msg }</div>| ).
+        ENDIF.
+ 
+        IF lv_max = abap_true.
+          ri_html->add( '<div class = "dummydiv">' ).
+          IF mv_max_lines = 1.
+            lv_max_str = '1 object'.
+          ELSE.
+            lv_max_str = |first { mv_max_lines } objects|.
+          ENDIF.
+          lv_add_str = |+{ mv_max_setting }|.
+          ri_html->add( |Only { lv_max_str } objects shown in list. Display {
+            ri_html->a( iv_txt = lv_add_str
+                        iv_act = c_actions-display_more )
+            } more (change in Settings > {
+            ri_html->a( iv_txt = 'Personal Settings'
+                        iv_act = zif_abapgit_definitions=>c_action-go_settings_personal )
+            })| ).
+          ri_html->add( '</div>' ).
+        ENDIF.
+ 
+        ri_html->add( '</div>' ).
+        ri_html->add( '</div>' ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        " Reset 'last shown repo' so next start will go to repo overview
+        " and allow troubleshooting of issue
+        zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ).
+ 
+        ri_html->add( render_head_line( ) ).
+ 
+        ri_html->add( zcl_abapgit_gui_chunk_lib=>render_error(
+          iv_extra_style = 'repo_banner'
+          ix_error = lx_error ) ).
+    ENDTRY.
+ 
+    register_deferred_script( render_scripts( ) ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_run_bckg.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_run_bckg.clas.abap.html new file mode 100644 index 00000000000..730d3a82819 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_run_bckg.clas.abap.html @@ -0,0 +1,385 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_run_bckg.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_run_bckg.clas.abap

+
+ +
+ 78% + Statements + 78/100 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 78% + Lines + 78/100 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +1011x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_run_bckg DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA: mt_text TYPE TABLE OF string.
+ 
+    METHODS run.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_RUN_BCKG IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_run_bckg.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Background Run'
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>back_toolbar( )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+
+    DATA: lx_error TYPE REF TO zcx_abapgit_exception,
+          lv_text  TYPE string,
+          lv_line  TYPE i VALUE 1.
+
+
+    TRY.
+        zcl_abapgit_background=>run( ).
+
+        DO.
+          READ LINE lv_line LINE VALUE INTO lv_text.
+          IF sy-subrc <> 0.
+            EXIT.
+          ENDIF.
+          APPEND lv_text TO mt_text.
+          lv_line = lv_line + 1.
+        ENDDO.
+      CATCH zcx_abapgit_exception INTO lx_error.
+        APPEND lx_error->get_text( ) TO mt_text.
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+    rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA: lv_text LIKE LINE OF mt_text.
+ 
+    register_handlers( ).
+ 
+    run( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div id="toc">' ).
+    LOOP AT mt_text INTO lv_text.
+      ri_html->add( '<pre>' && lv_text && '</pre><br>' ).
+    ENDLOOP.
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_runit.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_runit.clas.abap.html new file mode 100644 index 00000000000..88191fc62b9 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_runit.clas.abap.html @@ -0,0 +1,1024 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_runit.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_runit.clas.abap

+
+ +
+ 100% + Statements + 313/313 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 313/313 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +3141x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_runit DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+    INTERFACES zif_abapgit_gui_menu_provider.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_key,
+        obj_name TYPE tadir-obj_name,
+        obj_type TYPE tadir-object,
+      END OF ty_key,
+      ty_keys_tt TYPE STANDARD TABLE OF ty_key WITH DEFAULT KEY.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo.
+    DATA mv_summary TYPE string.
+ 
+    METHODS build_tadir
+      RETURNING
+        VALUE(rt_tadir) TYPE ty_keys_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS run
+      RETURNING
+        VALUE(ro_result) TYPE REF TO object
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_RUNIT IMPLEMENTATION.
+ 
+ 
+  METHOD build_tadir.
+ 
+    DATA lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt.
+    DATA ls_tadir LIKE LINE OF lt_tadir.
+    DATA ls_row   LIKE LINE OF rt_tadir.
+ 
+    lt_tadir = zcl_abapgit_factory=>get_tadir( )->read(
+      iv_package            = mo_repo->get_package( )
+      iv_only_local_objects = abap_true ).
+ 
+    LOOP AT lt_tadir INTO ls_tadir.
+      CLEAR ls_row.
+      ls_row-obj_type = ls_tadir-object.
+      ls_row-obj_name = ls_tadir-obj_name.
+      APPEND ls_row TO rt_tadir.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    mo_repo = io_repo.
+ 
+    TRY.
+        CALL METHOD ('\PROGRAM=SAPLSAUCV_GUI_RUNNER\CLASS=PASSPORT')=>get.
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( |Not supported in your NW release| ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_runit.
+    DATA lo_page_code_inspector TYPE REF TO zcl_abapgit_gui_page_code_insp.
+ 
+    TRY.
+        CREATE OBJECT lo_component EXPORTING io_repo = io_repo.
+ 
+        ri_page = zcl_abapgit_gui_page_hoc=>create(
+          iv_page_title         = |Unit Tests|
+          ii_page_menu_provider = lo_component
+          ii_child_component    = lo_component ).
+ 
+      CATCH zcx_abapgit_exception.
+ 
+        " Fallback as either SAPLSAUCV_GUI_RUNNER is not available in old releases
+        " or passport=>get is private in newer releases NW >= 756
+        CREATE OBJECT lo_page_code_inspector
+          EXPORTING
+            io_repo          = io_repo
+            iv_check_variant = 'SWF_ABAP_UNIT'.
+ 
+        ri_page = lo_page_code_inspector.
+ 
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run.
+ 
+    DATA lo_passport TYPE REF TO object.
+    DATA lo_runner   TYPE REF TO object.
+    DATA lo_timer    TYPE REF TO zcl_abapgit_timer.
+    DATA lt_keys     TYPE ty_keys_tt.
+    DATA li_result   TYPE REF TO data.
+    FIELD-SYMBOLS <li_result> TYPE any.
+ 
+    lt_keys = build_tadir( ).
+ 
+    lo_timer = zcl_abapgit_timer=>create( iv_count = lines( lt_keys ) )->start( ).
+ 
+    TRY.
+        CALL METHOD ('\PROGRAM=SAPLSAUCV_GUI_RUNNER\CLASS=PASSPORT')=>get
+          RECEIVING
+            result = lo_passport.
+ 
+        CALL METHOD ('CL_AUCV_TEST_RUNNER_STANDARD')=>create
+          EXPORTING
+            i_passport = lo_passport
+          RECEIVING
+            result     = lo_runner.
+      CATCH cx_root.
+        zcx_abapgit_exception=>raise( |Not supported in your NW release| ).
+    ENDTRY.
+ 
+    CREATE DATA li_result TYPE REF TO ('IF_SAUNIT_INTERNAL_RESULT').
+    ASSIGN li_result->* TO <li_result>.
+ 
+    CALL METHOD lo_runner->('RUN_FOR_PROGRAM_KEYS')
+      EXPORTING
+        i_limit_on_duration_category = '36' " long
+        i_limit_on_risk_level        = '33' " critical
+        i_program_keys               = lt_keys
+      IMPORTING
+        e_aunit_result               = <li_result>.
+ 
+    mv_summary = lo_timer->end( ).
+ 
+    ro_result = <li_result>.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    IF ii_event->mv_action = zif_abapgit_definitions=>c_action-go_back.
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_menu_provider~get_menu.
+    ro_toolbar = zcl_abapgit_gui_chunk_lib=>back_toolbar( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    DATA lo_result         TYPE REF TO object.
+    DATA lv_program_ndx    TYPE i.
+    DATA lv_class_ndx      TYPE i.
+    DATA lv_method_ndx     TYPE i.
+    DATA lv_text           TYPE string.
+    DATA lv_count          TYPE i.
+    DATA lv_params         TYPE string.
+    DATA ls_item           TYPE zif_abapgit_definitions=>ty_repo_item.
+ 
+    FIELD-SYMBOLS <ls_task_data>      TYPE any.
+    FIELD-SYMBOLS <lt_programs>       TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_alert_by_index> TYPE any.
+    FIELD-SYMBOLS <lt_indices>        TYPE ANY TABLE.
+    FIELD-SYMBOLS <lt_alerts>         TYPE ANY TABLE.
+    FIELD-SYMBOLS <lt_classes>        TYPE ANY TABLE.
+    FIELD-SYMBOLS <lt_methods>        TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_alert>          TYPE any.
+    FIELD-SYMBOLS <ls_program>        TYPE any.
+    FIELD-SYMBOLS <ls_class>          TYPE any.
+    FIELD-SYMBOLS <ls_method>         TYPE any.
+    FIELD-SYMBOLS <lv_any>            TYPE any.
+    FIELD-SYMBOLS <lt_text_info>      TYPE ANY TABLE.
+    FIELD-SYMBOLS <ls_text_info>      TYPE any.
+    FIELD-SYMBOLS <lt_params>         TYPE string_table.
+ 
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="repo">' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( io_repo        = mo_repo
+                                                              iv_show_commit = abap_false ) ).
+ 
+    lo_result = run( ).
+ 
+    ASSIGN lo_result->('F_TASK_DATA') TO <ls_task_data>.
+    ASSIGN COMPONENT 'ALERTS_BY_INDICIES' OF STRUCTURE <ls_task_data> TO <lt_indices>.
+    ASSIGN COMPONENT 'PROGRAMS' OF STRUCTURE <ls_task_data> TO <lt_programs>.
+ 
+    ri_html->add( |<table class="unit_tests">| ).
+ 
+    LOOP AT <lt_indices> ASSIGNING <ls_alert_by_index>.
+      ASSIGN COMPONENT 'ALERTS' OF STRUCTURE <ls_alert_by_index> TO <lt_alerts>.
+      LOOP AT <lt_alerts> ASSIGNING <ls_alert> WHERE ('KIND = ''F'' OR KIND = ''S'' OR KIND = ''E'' OR KIND = ''W''').
+        CLEAR lv_text.
+        ASSIGN COMPONENT 'HEADER-PARAMS' OF STRUCTURE <ls_alert> TO <lt_params>.
+        LOOP AT <lt_params> INTO lv_params.
+          lv_text = lv_text && lv_params.
+        ENDLOOP.
+ 
+        ASSIGN COMPONENT 'TEXT_INFOS' OF STRUCTURE <ls_alert> TO <lt_text_info>.
+        LOOP AT <lt_text_info> ASSIGNING <ls_text_info>.
+          ASSIGN COMPONENT 'PARAMS' OF STRUCTURE <ls_text_info> TO <lt_params>.
+          LOOP AT <lt_params> INTO lv_params.
+            lv_text = lv_text && lv_params.
+          ENDLOOP.
+        ENDLOOP.
+        IF lv_text NP '*SAUNIT_NO_TEST_CLASS*'.
+          ri_html->add( |<tr><td><span class="boxed red-filled-set">{ lv_text }</span></td></tr>| ).
+          lv_count = lv_count + 1.
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    ri_html->add( '</table>' ).
+ 
+    ri_html->add( '<div class="ci-head">' ).
+    ri_html->add( |Unit tests completed with <strong>{ lv_count } errors</strong> ({ mv_summary })| ).
+    ri_html->add( `</div>` ).
+ 
+    ri_html->add( |<hr><table class="unit_tests">| ).
+ 
+    LOOP AT <lt_programs> ASSIGNING <ls_program>.
+      CLEAR ls_item.
+      lv_program_ndx = sy-tabix.
+      ASSIGN COMPONENT 'INFO-KEY-OBJ_TYPE' OF STRUCTURE <ls_program> TO <lv_any>.
+      IF sy-subrc = 0.
+        ls_item-obj_type = <lv_any>.
+        ASSIGN COMPONENT 'INFO-KEY-OBJ_NAME' OF STRUCTURE <ls_program> TO <lv_any>.
+        ls_item-obj_name = <lv_any>.
+        ri_html->add( |<tr><td>{ zcl_abapgit_gui_chunk_lib=>get_item_icon( ls_item ) } { ls_item-obj_type }|
+          && | { zcl_abapgit_gui_chunk_lib=>get_item_link( ls_item ) }</td><td></td></tr>| ).
+      ELSE.
+* KEY field does not exist in 750
+        ASSIGN COMPONENT 'INFO-NAME' OF STRUCTURE <ls_program> TO <lv_any>.
+        ri_html->add( |<tr><td>{ <lv_any> }</td><td></td></tr>| ).
+      ENDIF.
+      ASSIGN COMPONENT 'CLASSES' OF STRUCTURE <ls_program> TO <lt_classes>.
+      LOOP AT <lt_classes> ASSIGNING <ls_class>.
+        lv_class_ndx = sy-tabix.
+ 
+        ASSIGN COMPONENT 'INFO-NAME' OF STRUCTURE <ls_class> TO <lv_any>.
+        ri_html->add( |<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;{ <lv_any> }</td><td></td></tr>| ).
+        ASSIGN COMPONENT 'METHODS' OF STRUCTURE <ls_class> TO <lt_methods>.
+        LOOP AT <lt_methods> ASSIGNING <ls_method>.
+          lv_method_ndx = sy-tabix.
+ 
+          CLEAR lv_text.
+          READ TABLE <lt_indices> WITH KEY
+            ('PROGRAM_NDX') = lv_program_ndx
+            ('CLASS_NDX') = lv_class_ndx
+            ('METHOD_NDX') = lv_method_ndx
+            ASSIGNING <ls_alert_by_index>.
+          IF sy-subrc = 0.
+            ASSIGN COMPONENT 'ALERTS' OF STRUCTURE <ls_alert_by_index> TO <lt_alerts>.
+            LOOP AT <lt_alerts> ASSIGNING <ls_alert>.
+              ASSIGN COMPONENT 'HEADER-PARAMS' OF STRUCTURE <ls_alert> TO <lt_params>.
+              LOOP AT <lt_params> INTO lv_params.
+                lv_text = lv_params.
+              ENDLOOP.
+            ENDLOOP.
+          ENDIF.
+ 
+          IF lv_text IS INITIAL.
+            lv_text = |<span class="boxed green-filled-set">PASSED</span>|.
+          ELSE.
+            lv_text = |<span class="boxed red-filled-set">{ lv_text }</span>|.
+          ENDIF.
+ 
+          ASSIGN COMPONENT 'INFO-NAME' OF STRUCTURE <ls_method> TO <lv_any>.
+          ri_html->add( |<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
+            <lv_any> }</td><td>{ lv_text }</td></tr>| ).
+        ENDLOOP.
+      ENDLOOP.
+    ENDLOOP.
+ 
+    ri_html->add( '</table></div>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_bckg.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_sett_bckg.clas.abap.html new file mode 100644 index 00000000000..0d38ec21374 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_bckg.clas.abap.html @@ -0,0 +1,1126 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_sett_bckg.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_sett_bckg.clas.abap

+
+ +
+ 84.72% + Statements + 294/347 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 84.72% + Lines + 294/347 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +3481x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_sett_bckg DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        mode_selection TYPE string VALUE 'mode_selection',
+        method         TYPE string VALUE 'method',
+        authentication TYPE string VALUE 'authentication',
+        username       TYPE string VALUE 'username',
+        password       TYPE string VALUE 'password',
+        mode_settings  TYPE string VALUE 'mode_settings',
+        settings       TYPE string VALUE 'settings',
+      END OF c_id .
+    CONSTANTS:
+      BEGIN OF c_event,
+        run_now TYPE string VALUE 'run_now',
+        save    TYPE string VALUE 'save',
+      END OF c_event .
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mv_settings_count TYPE i .
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_persist
+      RETURNING
+        VALUE(rs_persist) TYPE zcl_abapgit_persist_background=>ty_background
+      RAISING
+        zcx_abapgit_exception .
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_BCKG IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_form_data.
+    mo_repo = io_repo.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_bckg.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Background Mode'
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_background )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA:
+      lt_methods TYPE zcl_abapgit_background=>ty_methods,
+      ls_method  LIKE LINE OF lt_methods,
+      lv_hint    TYPE string.
+ 
+    lt_methods = zcl_abapgit_background=>list_methods( ).
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = 'repo-background-form'
+                iv_help_page = 'https://docs.abapgit.org/settings-background-mode.html' ).
+ 
+    ro_form->start_group(
+      iv_name          = c_id-mode_selection
+      iv_label         = 'Mode'
+    )->radio(
+      iv_name          = c_id-method
+      iv_default_value = ''
+      iv_label         = 'Selection'
+      iv_hint          = 'Define the action that will be executed in background mode'
+    )->option(
+      iv_label         = 'Do Nothing'
+      iv_value         = '' ).
+ 
+    LOOP AT lt_methods INTO ls_method.
+      ro_form->option(
+        iv_label       = ls_method-description
+        iv_value       = ls_method-class ).
+    ENDLOOP.
+ 
+    ro_form->table(
+      iv_name        = c_id-settings
+      iv_hint        = 'Settings required for selected background action'
+      iv_label       = 'Additional Settings'
+    )->column(
+      iv_label       = 'Key'
+      iv_width       = '50%'
+      iv_readonly    = abap_true
+    )->column(
+      iv_label       = 'Value'
+      iv_width       = '50%' ).
+ 
+    lv_hint = 'Password will be saved in clear text!'.
+ 
+    ro_form->start_group(
+      iv_name        = c_id-authentication
+      iv_label       = 'HTTP Authentication (Optional)'
+      iv_hint        = lv_hint
+    )->text(
+      iv_name        = c_id-username
+      iv_label       = 'Username'
+      iv_hint        = lv_hint
+    )->text(
+      iv_name        = c_id-password
+      iv_label       = 'Password'
+      iv_hint        = lv_hint
+      iv_placeholder = lv_hint ).
+ 
+    ro_form->command(
+      iv_label       = 'Save Settings'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-save
+    )->command(
+      iv_label       = 'Run Background Logic'
+      iv_action      = zif_abapgit_definitions=>c_action-go_background_run
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_persist.
+ 
+    DATA lo_per TYPE REF TO zcl_abapgit_persist_background.
+ 
+    CREATE OBJECT lo_per.
+ 
+    TRY.
+        rs_persist = lo_per->get_by_key( mo_repo->get_key( ) ).
+      CATCH zcx_abapgit_not_found.
+        CLEAR rs_persist.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    DATA:
+      ls_per      TYPE zcl_abapgit_persist_background=>ty_background,
+      lv_row      TYPE i,
+      lv_val      TYPE string,
+      lt_settings LIKE ls_per-settings,
+      ls_settings LIKE LINE OF ls_per-settings.
+ 
+    ls_per = read_persist( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Mode Selection
+    ro_form_data->set(
+      iv_key = c_id-method
+      iv_val = ls_per-method ).
+ 
+    " Mode Settings
+    IF ls_per-method IS NOT INITIAL.
+ 
+      lt_settings = ls_per-settings.
+ 
+      " skip invalid values, from old background logic
+      IF ls_per-method <> 'push' AND ls_per-method <> 'pull' AND ls_per-method <> 'nothing'.
+        CALL METHOD (ls_per-method)=>zif_abapgit_background~get_settings
+          CHANGING
+            ct_settings = lt_settings.
+      ENDIF.
+ 
+      LOOP AT lt_settings INTO ls_settings.
+        lv_row = lv_row + 1.
+        DO 3 TIMES.
+          CASE sy-index.
+            WHEN 1.
+              lv_val = ls_settings-key.
+            WHEN 2.
+              lv_val = ls_settings-value.
+          ENDCASE.
+          ro_form_data->set(
+            iv_key = |{ c_id-settings }-{ lv_row }-{ sy-index }|
+            iv_val = lv_val ).
+        ENDDO.
+      ENDLOOP.
+ 
+    ENDIF.
+ 
+    mv_settings_count = lv_row.
+ 
+    ro_form_data->set(
+      iv_key = |{ c_id-settings }-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = |{ mv_settings_count }| ).
+ 
+    " Authentication
+    ro_form_data->set(
+      iv_key = c_id-username
+      iv_val = ls_per-username ).
+    ro_form_data->set(
+      iv_key = c_id-password
+      iv_val = ls_per-password ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+
+    DATA:
+      lo_persistence TYPE REF TO zcl_abapgit_persist_background,
+      ls_per         TYPE zcl_abapgit_persist_background=>ty_background,
+      lt_settings    LIKE ls_per-settings.
+
+    FIELD-SYMBOLS:
+      <ls_settings> LIKE LINE OF ls_per-settings.
+
+    ls_per-key = mo_repo->get_key( ).
+
+    " Mode Selection
+    ls_per-method = mo_form_data->get( c_id-method ).
+
+    " Mode Settings
+    IF ls_per-method IS NOT INITIAL.
+
+      lt_settings = ls_per-settings.
+
+      " skip invalid values, from old background logic
+      IF ls_per-method <> 'push' AND ls_per-method <> 'pull' AND ls_per-method <> 'nothing'.
+        CALL METHOD (ls_per-method)=>zif_abapgit_background~get_settings
+          CHANGING
+            ct_settings = lt_settings.
+      ENDIF.
+
+      LOOP AT lt_settings ASSIGNING <ls_settings>.
+        <ls_settings>-value = mo_form_data->get( |{ c_id-settings }-{ sy-tabix }-2| ).
+      ENDLOOP.
+
+      ls_per-settings = lt_settings.
+
+    ENDIF.
+
+    " Authentication
+    ls_per-username = mo_form_data->get( c_id-username ).
+    ls_per-password = mo_form_data->get( c_id-password ).
+
+    CREATE OBJECT lo_persistence.
+
+    IF ls_per-method IS INITIAL.
+      lo_persistence->delete( ls_per-key ).
+    ELSE.
+      lo_persistence->modify( ls_per ).
+    ENDIF.
+
+    COMMIT WORK AND WAIT.
+
+    MESSAGE 'Settings succesfully saved' TYPE 'S'.
+
+    mo_form_data = read_settings( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-save.
+        save_settings( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( `<div class="repo">` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_true ) ).
+ 
+    ri_html->add( mo_form->render(
+      iv_form_class = 'w800px'
+      io_values     = mo_form_data ) ).
+ 
+    ri_html->add( `</div>` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_glob.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_sett_glob.clas.abap.html new file mode 100644 index 00000000000..d500058e2d8 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_glob.clas.abap.html @@ -0,0 +1,1213 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_sett_glob.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_sett_glob.clas.abap

+
+ +
+ 84.57% + Statements + 318/376 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 84.57% + Lines + 318/376 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +3771x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_sett_glob DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        proxy_settings           TYPE string VALUE 'proxy_settings',
+        proxy_url                TYPE string VALUE 'proxy_url',
+        proxy_port               TYPE string VALUE 'proxy_port',
+        proxy_auth               TYPE string VALUE 'proxy_auth',
+        proxy_bypass             TYPE string VALUE 'proxy_bypass',
+        commit_settings          TYPE string VALUE 'commit_settings',
+        commitmsg_comment_length TYPE string VALUE 'commitmsg_comment_length',
+        commitmsg_comment_deflt  TYPE string VALUE 'commitmsg_comment_deflt',
+        commitmsg_body_size      TYPE string VALUE 'commitmsg_body_size',
+        commitmsg_hide_author    TYPE string VALUE 'commitmsg_hide_author',
+        devint_settings          TYPE string VALUE 'devint_settings',
+        run_critical_tests       TYPE string VALUE 'run_critical_tests',
+        experimental_features    TYPE string VALUE 'experimental_features',
+        activate_wo_popup        TYPE string VALUE 'activate_wo_popup',
+      END OF c_id.
+    CONSTANTS:
+      BEGIN OF c_event,
+        proxy_bypass TYPE string VALUE 'proxy_bypass',
+        save         TYPE string VALUE 'save',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+ 
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings.
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS read_proxy_bypass
+      IMPORTING
+        io_form_data TYPE REF TO zcl_abapgit_string_map
+        io_settings TYPE REF TO zcl_abapgit_settings
+      RAISING
+        zcx_abapgit_exception.
+    METHODS save_proxy_bypass
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_GLOB IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_glob.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Global Settings'
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_toolbar(
+                             zif_abapgit_definitions=>c_action-go_settings )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = 'global-setting-form'
+      iv_help_page = 'https://docs.abapgit.org/guide-settings-global.html' ).
+ 
+    ro_form->start_group(
+      iv_name        = c_id-proxy_settings
+      iv_label       = 'Proxy Settings'
+    )->text(
+      iv_name        = c_id-proxy_url
+      iv_label       = 'Proxy Host'
+      iv_hint        = 'Hostname or IP of proxy required to access the Internet (do not enter http://)'
+      iv_placeholder = 'Hostname or IP without http://'
+    )->number(
+      iv_name        = c_id-proxy_port
+      iv_label       = 'Proxy Port'
+      iv_hint        = 'Port of proxy required to access the Internet'
+      iv_min         = 0
+      iv_max         = 65535
+    )->checkbox(
+      iv_name        = c_id-proxy_auth
+      iv_label       = 'Proxy Authentication'
+      iv_hint        = 'Check, if proxy requires you to login'
+    )->textarea(
+      iv_name        = c_id-proxy_bypass
+      iv_label       = 'Proxy Bypass'
+      iv_hint        = 'List of hosts/domains for which to bypass using proxy'
+    )->start_group(
+      iv_name        = c_id-commit_settings
+      iv_label       = 'Commit Message Settings'
+    )->number(
+      iv_name        = c_id-commitmsg_comment_length
+      iv_required    = abap_true
+      iv_label       = 'Maximum Length of Comment'
+      iv_hint        = |At least { zcl_abapgit_settings=>c_commitmsg_comment_length_dft } characters|
+      iv_min         = zcl_abapgit_settings=>c_commitmsg_comment_length_dft
+    )->text(
+      iv_name        = c_id-commitmsg_comment_deflt
+      iv_label       = 'Default Text For Comment'
+      iv_hint        = 'You can use $OBJECT or $FILE to include the number of objects/files'
+    )->number(
+      iv_name        = c_id-commitmsg_body_size
+      iv_required    = abap_true
+      iv_label       = 'Maximum Line Size of Body'
+      iv_hint        = |At least { zcl_abapgit_settings=>c_commitmsg_body_size_dft } characters|
+      iv_min         = zcl_abapgit_settings=>c_commitmsg_body_size_dft
+    )->checkbox(
+      iv_name        = c_id-commitmsg_hide_author
+      iv_label       = 'Hide Author Fields' ).
+ 
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      ro_form->start_group(
+        iv_name        = c_id-devint_settings
+        iv_label       = 'Development Internal Settings'
+      )->checkbox(
+        iv_name        = c_id-run_critical_tests
+        iv_label       = 'Enable Critical Unit Tests'
+      )->checkbox(
+        iv_name        = c_id-experimental_features
+        iv_label       = 'Enable Experimental Features' ).
+    ENDIF.
+ 
+    ro_form->command(
+      iv_label       = 'Save Settings'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-save
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_proxy_bypass.
+ 
+    DATA:
+      lt_proxy_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url,
+      ls_proxy_bypass LIKE LINE OF lt_proxy_bypass,
+      lv_val          TYPE string.
+ 
+    lt_proxy_bypass = io_settings->get_proxy_bypass( ).
+    LOOP AT lt_proxy_bypass INTO ls_proxy_bypass.
+      lv_val = lv_val && ls_proxy_bypass-low && cl_abap_char_utilities=>newline.
+    ENDLOOP.
+ 
+    io_form_data->set(
+      iv_key = c_id-proxy_bypass
+      iv_val = lv_val ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    " Get settings from DB
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Proxy
+    ro_form_data->set(
+      iv_key = c_id-proxy_url
+      iv_val = mo_settings->get_proxy_url( ) ).
+    ro_form_data->set(
+      iv_key = c_id-proxy_port
+      iv_val = mo_settings->get_proxy_port( ) ).
+    ro_form_data->set(
+      iv_key = c_id-proxy_auth
+      iv_val = boolc( mo_settings->get_proxy_authentication( ) = abap_true ) ) ##TYPE.
+ 
+    read_proxy_bypass(
+      io_settings = mo_settings
+      io_form_data = ro_form_data ).
+ 
+    " Commit Message
+    ro_form_data->set(
+      iv_key = c_id-commitmsg_comment_length
+      iv_val = |{ mo_settings->get_commitmsg_comment_length( ) }| ).
+    ro_form_data->set(
+      iv_key = c_id-commitmsg_comment_deflt
+      iv_val = mo_settings->get_commitmsg_comment_default( ) ).
+    ro_form_data->set(
+      iv_key = c_id-commitmsg_body_size
+      iv_val = |{ mo_settings->get_commitmsg_body_size( ) }| ).
+    ro_form_data->set(
+      iv_key = c_id-commitmsg_hide_author
+      iv_val = boolc( mo_settings->get_commitmsg_hide_author( ) = abap_true ) ) ##TYPE.
+ 
+    " Dev Internal
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      ro_form_data->set(
+        iv_key = c_id-run_critical_tests
+        iv_val = boolc( mo_settings->get_run_critical_tests( ) = abap_true ) ) ##TYPE.
+      ro_form_data->set(
+        iv_key = c_id-experimental_features
+        iv_val = boolc( mo_settings->get_experimental_features( ) = abap_true ) ) ##TYPE.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_proxy_bypass.
+
+    DATA:
+      lt_textarea     TYPE TABLE OF string,
+      lt_proxy_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url,
+      ls_proxy_bypass LIKE LINE OF lt_proxy_bypass.
+
+    lt_textarea = zcl_abapgit_convert=>split_string( mo_form_data->get( c_id-proxy_bypass ) ).
+
+    ls_proxy_bypass-sign = 'I'.
+    LOOP AT lt_textarea INTO ls_proxy_bypass-low WHERE table_line IS NOT INITIAL.
+      IF ls_proxy_bypass-low CA '*+'.
+        ls_proxy_bypass-option = 'CP'.
+      ELSE.
+        ls_proxy_bypass-option = 'EQ'.
+      ENDIF.
+      APPEND ls_proxy_bypass TO lt_proxy_bypass.
+    ENDLOOP.
+
+    mo_settings->set_proxy_bypass( lt_proxy_bypass ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+
+    DATA:
+      li_persistence TYPE REF TO zif_abapgit_persist_settings,
+      lv_value       TYPE i.
+
+    " Proxy
+    mo_settings->set_proxy_url( mo_form_data->get( c_id-proxy_url ) ).
+    mo_settings->set_proxy_port( mo_form_data->get( c_id-proxy_port ) ).
+    mo_settings->set_proxy_authentication( boolc( mo_form_data->get( c_id-proxy_auth ) = abap_true ) ).
+
+    save_proxy_bypass( ).
+
+    " Commit Message
+    lv_value = mo_form_data->get( c_id-commitmsg_comment_length ).
+    mo_settings->set_commitmsg_comment_length( lv_value ).
+    mo_settings->set_commitmsg_comment_default( mo_form_data->get( c_id-commitmsg_comment_deflt ) ).
+    lv_value = mo_form_data->get( c_id-commitmsg_body_size ).
+    mo_settings->set_commitmsg_body_size( lv_value ).
+    mo_settings->set_commitmsg_hide_author( boolc( mo_form_data->get( c_id-commitmsg_hide_author ) = abap_true ) ).
+
+    " Dev Internal
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      mo_settings->set_run_critical_tests( boolc( mo_form_data->get( c_id-run_critical_tests ) = abap_true ) ).
+      mo_settings->set_experimental_features( boolc( mo_form_data->get( c_id-experimental_features ) = abap_true ) ).
+    ENDIF.
+
+    " Store in DB
+    li_persistence = zcl_abapgit_persist_factory=>get_settings( ).
+    li_persistence->modify( mo_settings ).
+
+    COMMIT WORK AND WAIT.
+
+    MESSAGE 'Settings succesfully saved' TYPE 'S'.
+
+    mo_form_data = read_settings( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    IF io_form_data->get( c_id-proxy_url ) IS NOT INITIAL AND io_form_data->get( c_id-proxy_port ) IS INITIAL OR
+       io_form_data->get( c_id-proxy_url ) IS INITIAL AND io_form_data->get( c_id-proxy_port ) IS NOT INITIAL.
+      ro_validation_log->set(
+        iv_key = c_id-proxy_url
+        iv_val = |If you specify a proxy, you have to specify host and port| ).
+    ENDIF.
+ 
+    IF ( io_form_data->get( c_id-proxy_url ) IS INITIAL OR io_form_data->get( c_id-proxy_port ) IS INITIAL ) AND
+       io_form_data->get( c_id-proxy_auth ) = abap_true.
+      ro_validation_log->set(
+        iv_key = c_id-proxy_auth
+        iv_val = |To turn on authentication, you have to specify host and port| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-save.
+        " Validate form entries before saving
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( '<div class="form-container">' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_info.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_sett_info.clas.abap.html new file mode 100644 index 00000000000..95003938ca7 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_info.clas.abap.html @@ -0,0 +1,1882 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_sett_info.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_sett_info.clas.abap

+
+ +
+ 57.92% + Statements + 347/599 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 57.92% + Lines + 347/599 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +6001x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_sett_info DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_stats,
+        measure TYPE string,
+        local   TYPE i,
+        remote  TYPE i,
+      END OF ty_stats .
+    TYPES:
+      BEGIN OF ty_infos,
+        size TYPE p LENGTH 16 DECIMALS 0,
+        line TYPE p LENGTH 16 DECIMALS 0,
+        sloc TYPE p LENGTH 16 DECIMALS 0,
+      END OF ty_infos .
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        info            TYPE string VALUE 'info',
+        created_by      TYPE string VALUE 'created_by',
+        created_at      TYPE string VALUE 'created_at',
+        deserialized_by TYPE string VALUE 'deserialized_by',
+        deserialized_at TYPE string VALUE 'deserialized_at',
+        stats           TYPE string VALUE 'stats',
+        stats_table     TYPE string VALUE 'stats_table',
+      END OF c_id .
+    CONSTANTS:
+      BEGIN OF c_event,
+        save TYPE string VALUE 'save',
+      END OF c_event .
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA:
+      mt_stats TYPE STANDARD TABLE OF ty_stats WITH KEY measure .
+ 
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_settings
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats_files
+      EXPORTING
+        !et_local  TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !et_remote TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats_state
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats_size_lines_sloc
+      IMPORTING
+        !it_local        TYPE zif_abapgit_definitions=>ty_files_item_tt
+        !it_remote       TYPE zif_abapgit_git_definitions=>ty_files_tt
+      EXPORTING
+        !et_local_items  TYPE zif_abapgit_definitions=>ty_items_tt
+        !et_remote_items TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_stats_file
+      IMPORTING
+        !is_file       TYPE zif_abapgit_git_definitions=>ty_file
+      RETURNING
+        VALUE(rs_info) TYPE ty_infos .
+    METHODS read_stats_objects
+      CHANGING
+        !ct_local_items  TYPE zif_abapgit_definitions=>ty_items_tt
+        !ct_remote_items TYPE zif_abapgit_definitions=>ty_items_tt
+      RAISING
+        zcx_abapgit_exception .
+    METHODS format_user
+      IMPORTING
+        !iv_username   TYPE syuname
+      RETURNING
+        VALUE(rv_user) TYPE string .
+    METHODS format_timestamp
+      IMPORTING
+        !iv_timestamp       TYPE timestampl
+      RETURNING
+        VALUE(rv_timestamp) TYPE string .
+    METHODS format_size
+      IMPORTING
+        !iv_size       TYPE i
+      RETURNING
+        VALUE(rv_size) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_sett_info IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_form_data.
+    mo_repo = io_repo.
+    mo_form = get_form_schema( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_info.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Repository Stats'
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_infos )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_size.
+ 
+    DATA:
+      lv_size TYPE p LENGTH 16 DECIMALS 2.
+ 
+    IF iv_size > 1024 * 1024 * 1024.
+      lv_size = iv_size / 1024 / 1024 / 1024.
+      rv_size = |{ lv_size } GB|.
+    ELSEIF iv_size > 1024 * 1024.
+      lv_size = iv_size / 1024 / 1024.
+      rv_size = |{ lv_size } MB|.
+    ELSEIF iv_size > 1024.
+      lv_size = iv_size / 1024.
+      rv_size = |{ lv_size } KB|.
+    ELSE.
+      rv_size = |{ iv_size } Bytes|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_timestamp.
+ 
+    DATA lv_short TYPE timestamp.
+ 
+    IF iv_timestamp IS INITIAL.
+      rv_timestamp = 'n/a'.
+      RETURN.
+    ENDIF.
+ 
+    cl_abap_tstmp=>move(
+      EXPORTING tstmp_src = iv_timestamp
+      IMPORTING tstmp_tgt = lv_short ).
+ 
+    rv_timestamp = |{ lv_short TIMESTAMP = ISO }|.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD format_user.
+ 
+    DATA lv_title TYPE string.
+ 
+    IF iv_username IS INITIAL.
+      rv_user = 'n/a'.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_username <> zcl_abapgit_objects_super=>c_user_unknown.
+      lv_title = zcl_abapgit_user_record=>get_title( iv_username ).
+    ENDIF.
+ 
+    rv_user = iv_username.
+    IF lv_title IS NOT INITIAL.
+      rv_user = |{ rv_user } ({ lv_title })|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA lv_label TYPE string.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = 'repo-infos-form'
+                iv_help_page = 'https://docs.abapgit.org/settings-stats.html' ).
+ 
+    IF mo_repo->is_offline( ) = abap_true.
+      lv_label = 'ZIP File'.
+    ELSE.
+      lv_label = 'Remote'.
+    ENDIF.
+ 
+    ro_form->start_group(
+      iv_name        = c_id-info
+      iv_label       = 'Stats'
+    )->text(
+      iv_name        = c_id-created_by
+      iv_label       = 'Created By'
+      iv_readonly    = abap_true
+    )->text(
+      iv_name        = c_id-created_at
+      iv_label       = 'Created At'
+      iv_readonly    = abap_true
+    )->text(
+      iv_name        = c_id-deserialized_by
+      iv_label       = 'Last Deserialized By'
+      iv_readonly    = abap_true
+    )->text(
+      iv_name        = c_id-deserialized_at
+      iv_label       = 'Last Deserialized At'
+      iv_readonly    = abap_true
+    )->table(
+      iv_name        = c_id-stats_table
+      iv_label       = 'Statistics'
+    )->column(
+      iv_label       = 'Measure'
+      iv_width       = '50%'
+      iv_readonly    = abap_true
+    )->column(
+      iv_label       = 'Local'
+      iv_width       = '25%'
+      iv_readonly    = abap_true
+    )->column(
+      iv_label       = lv_label
+      iv_width       = '25%'
+      iv_readonly    = abap_true
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+
+    DATA:
+      ls_repo  TYPE zif_abapgit_persistence=>ty_repo,
+      ls_stats TYPE ty_stats,
+      lv_row   TYPE i,
+      lv_int   TYPE i,
+      lv_val   TYPE string.
+
+    " Get infos from DB
+    TRY.
+        ls_repo = zcl_abapgit_persist_factory=>get_repo( )->read( mo_repo->get_key( ) ).
+      CATCH zcx_abapgit_not_found.
+        zcx_abapgit_exception=>raise( |Repo not found, key { mo_repo->get_key( ) }| ).
+    ENDTRY.
+
+    read_stats( ).
+
+    " Infos
+    mo_form_data->set(
+      iv_key = c_id-created_by
+      iv_val = format_user( ls_repo-created_by ) ).
+    mo_form_data->set(
+      iv_key = c_id-created_at
+      iv_val = format_timestamp( ls_repo-created_at ) ).
+    mo_form_data->set(
+      iv_key = c_id-deserialized_by
+      iv_val = format_user( ls_repo-deserialized_by ) ).
+    mo_form_data->set(
+      iv_key = c_id-deserialized_at
+      iv_val = format_timestamp( ls_repo-deserialized_at ) ).
+
+    LOOP AT mt_stats INTO ls_stats.
+      lv_row = sy-tabix.
+      DO 3 TIMES.
+        CASE sy-index.
+          WHEN 1.
+            lv_val = ls_stats-measure.
+          WHEN 2.
+            lv_val = ls_stats-local.
+          WHEN 3.
+            lv_val = ls_stats-remote.
+        ENDCASE.
+
+        IF ls_stats-measure CS 'Size' AND sy-index BETWEEN 2 AND 3.
+          lv_int = lv_val.
+          lv_val = format_size( lv_int ).
+        ENDIF.
+
+        mo_form_data->set(
+          iv_key = |{ c_id-stats_table }-{ lv_row }-{ sy-index }|
+          iv_val = lv_val ).
+      ENDDO.
+    ENDLOOP.
+
+    mo_form_data->set(
+      iv_key = |{ c_id-stats_table }-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = |{ lv_row }| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats.
+
+    DATA:
+      lt_local        TYPE zif_abapgit_definitions=>ty_files_item_tt,
+      lt_remote       TYPE zif_abapgit_git_definitions=>ty_files_tt,
+      lt_local_items  TYPE zif_abapgit_definitions=>ty_items_tt,
+      lt_remote_items TYPE zif_abapgit_definitions=>ty_items_tt.
+
+    CLEAR mt_stats.
+
+    read_stats_files(
+      IMPORTING
+        et_local  = lt_local
+        et_remote = lt_remote ).
+
+    read_stats_state( ).
+
+    read_stats_size_lines_sloc(
+      EXPORTING
+        it_local        = lt_local
+        it_remote       = lt_remote
+      IMPORTING
+        et_local_items  = lt_local_items
+        et_remote_items = lt_remote_items ).
+
+    read_stats_objects(
+      CHANGING
+        ct_local_items  = lt_local_items
+        ct_remote_items = lt_remote_items ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_file.
+ 
+    TYPES ty_char255 TYPE c LENGTH 255.
+ 
+    DATA:
+      lv_code TYPE string,
+      lt_code TYPE STANDARD TABLE OF ty_char255 WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS:
+      <ls_code> LIKE LINE OF lt_code.
+ 
+    rs_info-size = xstrlen( is_file-data ).
+ 
+    IF is_file-filename CP '*.abap'.
+      TRY.
+          lv_code = zcl_abapgit_convert=>xstring_to_string_utf8( is_file-data ).
+        CATCH zcx_abapgit_exception ##NO_HANDLER.
+      ENDTRY.
+ 
+      SPLIT lv_code AT cl_abap_char_utilities=>newline INTO TABLE lt_code.
+ 
+      rs_info-line = lines( lt_code ).
+ 
+      LOOP AT lt_code ASSIGNING <ls_code> WHERE table_line IS NOT INITIAL AND table_line(1) <> '*'.
+        SHIFT <ls_code> LEFT DELETING LEADING space.
+        IF <ls_code>(1) <> '"'.
+          rs_info-sloc = rs_info-sloc + 1.
+        ENDIF.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_files.
+
+    DATA ls_stats TYPE ty_stats.
+    DATA lt_remote_wo_ignored TYPE zif_abapgit_git_definitions=>ty_files_tt.
+
+    et_local = mo_repo->get_files_local( ).
+
+    ls_stats-measure = 'Number of Files'.
+    ls_stats-local   = lines( et_local ).
+
+    IF mo_repo->has_remote_source( ) = abap_true.
+      et_remote = mo_repo->get_files_remote( ).
+      ls_stats-remote = lines( et_remote ).
+      lt_remote_wo_ignored = mo_repo->get_files_remote( iv_ignore_files = abap_true ).
+    ENDIF.
+
+    APPEND ls_stats TO mt_stats.
+
+    IF et_remote IS NOT INITIAL.
+      CLEAR ls_stats.
+      ls_stats-measure = 'Number of Ignored Files'.
+      ls_stats-remote = lines( et_remote ) - lines( lt_remote_wo_ignored ).
+      APPEND ls_stats TO mt_stats.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_objects.
+
+    DATA:
+      ls_stats           TYPE ty_stats,
+      ls_item            TYPE zif_abapgit_definitions=>ty_item,
+      lt_supported_types TYPE zcl_abapgit_objects=>ty_types_tt.
+
+    ls_stats-measure = 'Number of Objects'.
+
+    DELETE ct_local_items WHERE obj_type IS INITIAL OR obj_name IS INITIAL.
+    ls_stats-local = lines( ct_local_items ).
+
+    DELETE ct_remote_items WHERE obj_type IS INITIAL OR obj_name IS INITIAL.
+    ls_stats-remote = lines( ct_remote_items ).
+
+    APPEND ls_stats TO mt_stats.
+
+    CLEAR ls_stats.
+    ls_stats-measure = 'Number of Unsupported Objects'.
+    ls_stats-local   = lines( mo_repo->get_unsupported_objects_local( ) ).
+
+    lt_supported_types = zcl_abapgit_objects=>supported_list( ).
+
+    LOOP AT ct_remote_items INTO ls_item.
+      READ TABLE lt_supported_types WITH KEY table_line = ls_item-obj_type TRANSPORTING NO FIELDS.
+      IF sy-subrc <> 0.
+        ls_stats-remote = ls_stats-remote + 1.
+      ENDIF.
+    ENDLOOP.
+
+    APPEND ls_stats TO mt_stats.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_size_lines_sloc.
+
+    DATA:
+      ls_stats       TYPE ty_stats,
+      lv_ignored     TYPE abap_bool,
+      ls_info_file   TYPE ty_infos,
+      ls_info_local  TYPE ty_infos,
+      ls_info_remote TYPE ty_infos,
+      ls_item        TYPE zif_abapgit_definitions=>ty_item.
+
+    FIELD-SYMBOLS:
+      <ls_local>  LIKE LINE OF it_local,
+      <ls_remote> LIKE LINE OF it_remote.
+
+    LOOP AT it_local ASSIGNING <ls_local>.
+      ls_info_file = read_stats_file( <ls_local>-file ).
+
+      ls_info_local-size = ls_info_local-size + ls_info_file-size.
+      ls_info_local-line = ls_info_local-line + ls_info_file-line.
+      ls_info_local-sloc = ls_info_local-sloc + ls_info_file-sloc.
+
+      COLLECT <ls_local>-item INTO et_local_items.
+    ENDLOOP.
+
+    IF mo_repo->has_remote_source( ) = abap_true.
+      LOOP AT it_remote ASSIGNING <ls_remote> WHERE filename IS NOT INITIAL.
+        lv_ignored = mo_repo->get_dot_abapgit( )->is_ignored(
+                       iv_filename = <ls_remote>-filename
+                       iv_path     = <ls_remote>-path ).
+
+        IF lv_ignored = abap_false.
+          ls_info_file = read_stats_file( <ls_remote> ).
+
+          ls_info_remote-size = ls_info_remote-size + ls_info_file-size.
+          ls_info_remote-line = ls_info_remote-line + ls_info_file-line.
+          ls_info_remote-sloc = ls_info_remote-sloc + ls_info_file-sloc.
+
+          TRY.
+              zcl_abapgit_filename_logic=>file_to_object(
+                EXPORTING
+                  iv_filename = <ls_remote>-filename
+                  iv_path     = <ls_remote>-path
+                  iv_devclass = mo_repo->get_package( )
+                  io_dot      = mo_repo->get_dot_abapgit( )
+                IMPORTING
+                  es_item     = ls_item ).
+              COLLECT ls_item INTO et_remote_items.
+            CATCH zcx_abapgit_exception ##NO_HANDLER.
+          ENDTRY.
+        ENDIF.
+
+      ENDLOOP.
+    ENDIF.
+
+    ls_stats-measure = 'Size of Files'.
+    ls_stats-local   = ls_info_local-size.
+    ls_stats-remote  = ls_info_remote-size.
+    APPEND ls_stats TO mt_stats.
+    ls_stats-measure = 'Lines in ABAP Files'.
+    ls_stats-local   = ls_info_local-line.
+    ls_stats-remote  = ls_info_remote-line.
+    APPEND ls_stats TO mt_stats.
+    ls_stats-measure = 'Lines of Code in ABAP Files'.
+    ls_stats-local   = ls_info_local-sloc.
+    ls_stats-remote  = ls_info_remote-sloc.
+    APPEND ls_stats TO mt_stats.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD read_stats_state.
+
+    DATA:
+      lt_results TYPE zif_abapgit_definitions=>ty_results_tt,
+      lv_state   TYPE c LENGTH 1,
+      ls_stats   TYPE ty_stats.
+
+    FIELD-SYMBOLS:
+      <ls_result> LIKE LINE OF lt_results.
+
+    lt_results = zcl_abapgit_file_status=>status( mo_repo ).
+
+    DO 3 TIMES.
+      CLEAR ls_stats.
+
+      CASE sy-index.
+        WHEN 1.
+          ls_stats-measure = 'Number of Modified Files'.
+          lv_state = zif_abapgit_definitions=>c_state-modified.
+        WHEN 2.
+          ls_stats-measure = 'Number of Added Files'.
+          lv_state = zif_abapgit_definitions=>c_state-added.
+        WHEN 3.
+          ls_stats-measure = 'Number of Deleted Files'.
+          lv_state = zif_abapgit_definitions=>c_state-deleted.
+      ENDCASE.
+
+      LOOP AT lt_results ASSIGNING <ls_result>.
+        IF <ls_result>-lstate = lv_state.
+          ls_stats-local = ls_stats-local + 1.
+        ENDIF.
+        IF <ls_result>-rstate = lv_state AND mo_repo->has_remote_source( ) = abap_true.
+          ls_stats-remote = ls_stats-remote + 1.
+        ENDIF.
+      ENDLOOP.
+
+      APPEND ls_stats TO mt_stats.
+    ENDDO.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    IF ii_event->mv_action = zif_abapgit_definitions=>c_action-go_back.
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    read_settings( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( `<div class="repo">` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_true ) ).
+ 
+    ri_html->add( mo_form->render( mo_form_data ) ).
+ 
+    ri_html->add( `</div>` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap.html new file mode 100644 index 00000000000..6fbdfb8a287 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap.html @@ -0,0 +1,1750 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_sett_locl.clas.abap

+
+ +
+ 80.9% + Statements + 449/555 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 80.9% + Lines + 449/555 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +5561x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_sett_locl DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mo_popup_picklist TYPE REF TO zcl_abapgit_gui_picklist.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        local                        TYPE string VALUE 'local',
+        display_name                 TYPE string VALUE 'display_name',
+        transport_request            TYPE string VALUE 'transport_request',
+        customizing_request          TYPE string VALUE 'customizing_request',
+        labels                       TYPE string VALUE 'labels',
+        ignore_subpackages           TYPE string VALUE 'ignore_subpackages',
+        write_protected              TYPE string VALUE 'write_protected',
+        only_local_objects           TYPE string VALUE 'only_local_objects',
+        main_language_only           TYPE string VALUE 'main_language_only',
+        checks                       TYPE string VALUE 'checks',
+        code_inspector_check_variant TYPE string VALUE 'code_inspector_check_variant',
+        block_commit                 TYPE string VALUE 'block_commit',
+      END OF c_id .
+    CONSTANTS:
+      BEGIN OF c_event,
+        save                       TYPE string VALUE 'save',
+        choose_transport_request   TYPE string VALUE 'choose_transport_request',
+        choose_customizing_request TYPE string VALUE 'choose_customizing_request',
+        choose_labels              TYPE string VALUE 'choose-labels',
+        choose_check_variant       TYPE string VALUE 'choose_check_variant',
+      END OF c_event .
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA ms_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings .
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception .
+    METHODS choose_labels
+      RAISING
+        zcx_abapgit_exception .
+    METHODS choose_check_variant
+      IMPORTING
+        iv_is_return TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+    METHODS choose_transport_request
+      RAISING
+        zcx_abapgit_exception .
+    METHODS choose_customizing_request
+      RAISING
+        zcx_abapgit_exception .
+    METHODS is_customizing_included
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS handle_picklist_state
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION.
+ 
+ 
+  METHOD choose_check_variant.
+
+    DATA ls_variant         TYPE zif_abapgit_code_inspector=>ty_variant.
+    DATA lv_popup_cancelled TYPE abap_bool.
+
+    IF iv_is_return = abap_false.
+
+      mo_popup_picklist = zcl_abapgit_popup_code_insp=>create(
+        )->create_picklist(
+        )->set_id( c_event-choose_check_variant
+        )->set_in_page( abap_false ).
+
+    ELSE.
+
+      lv_popup_cancelled = mo_popup_picklist->was_cancelled( ).
+      IF lv_popup_cancelled = abap_false.
+        mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_variant ).
+        IF ls_variant IS NOT INITIAL.
+          mo_form_data->set(
+            iv_key = c_id-code_inspector_check_variant
+            iv_val = ls_variant-name ).
+        ENDIF.
+      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_customizing_request.
+
+    DATA:
+      ls_transport_type      TYPE zif_abapgit_definitions=>ty_transport_type,
+      lv_customizing_request TYPE trkorr.
+
+    ls_transport_type-request = zif_abapgit_cts_api=>c_transport_type-cust_request.
+    ls_transport_type-task    = zif_abapgit_cts_api=>c_transport_type-cust_task.
+
+    lv_customizing_request = zcl_abapgit_ui_factory=>get_popups( )->popup_transport_request( ls_transport_type ).
+
+    IF lv_customizing_request IS NOT INITIAL.
+      mo_form_data->set(
+        iv_key = c_id-customizing_request
+        iv_val = lv_customizing_request ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_labels.
+
+    DATA:
+      lv_old_labels TYPE string,
+      lv_new_labels TYPE string.
+
+    lv_old_labels = mo_form_data->get( c_id-labels ).
+
+    lv_new_labels = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_labels( lv_old_labels ).
+
+    mo_form_data->set(
+      iv_key = c_id-labels
+      iv_val = lv_new_labels ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_transport_request.
+
+    DATA: lv_transport_request TYPE trkorr.
+
+    lv_transport_request = zcl_abapgit_ui_factory=>get_popups( )->popup_transport_request( ).
+
+    IF lv_transport_request IS NOT INITIAL.
+      mo_form_data->set(
+        iv_key = c_id-transport_request
+        iv_val = lv_transport_request ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_repo = io_repo.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_locl.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Local Settings & Checks'
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_local_settings )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA: li_package TYPE REF TO zif_abapgit_sap_package.
+ 
+    li_package = zcl_abapgit_factory=>get_sap_package( mo_repo->get_package( ) ).
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = 'repo-local-settings-form'
+      iv_help_page = 'https://docs.abapgit.org/settings-local.html' ).
+ 
+    ro_form->start_group(
+      iv_name        = c_id-local
+      iv_label       = 'Local Settings'
+      iv_hint        = 'Settings valid for this system only'
+    )->text(
+      iv_name        = c_id-display_name
+      iv_label       = 'Display Name'
+      iv_hint        = 'Name to show instead of original repo name (optional)' ).
+ 
+    IF li_package->are_changes_recorded_in_tr_req( ) = abap_true.
+      ro_form->text(
+        iv_name        = c_id-transport_request
+        iv_side_action = c_event-choose_transport_request
+        iv_label       = |Transport Request|
+        iv_hint        = 'Transport request; All changes are recorded therein and no transport popup appears|' ).
+    ENDIF.
+ 
+    IF is_customizing_included( ) = abap_true.
+      ro_form->text(
+        iv_name        = c_id-customizing_request
+        iv_side_action = c_event-choose_customizing_request
+        iv_label       = |Customizing Request|
+        iv_hint        = 'Customizing request; All changes are recorded therein and no customizing popup appears|' ).
+    ENDIF.
+ 
+    ro_form->text(
+      iv_name        = c_id-labels
+      iv_side_action = c_event-choose_labels
+      iv_label       = |Labels (comma-separated, allowed chars: "{ zcl_abapgit_repo_labels=>c_allowed_chars }")|
+      iv_hint        = 'Comma-separated labels for grouping and repo organization (optional)'
+    )->checkbox(
+      iv_name        = c_id-write_protected
+      iv_label       = 'Write Protected'
+      iv_hint        = 'Lock repository against changes from remote (pull)'
+    )->checkbox(
+      iv_name        = c_id-ignore_subpackages
+      iv_label       = 'Ignore Subpackages'
+      iv_hint        = 'Syncronize root package only'
+    )->checkbox(
+      iv_name        = c_id-only_local_objects
+      iv_label       = 'Only Local Objects'
+      iv_hint        = 'Ignore objects imported from other systems; serialize only objects created in this system'
+    )->checkbox(
+      iv_name        = c_id-main_language_only
+      iv_label       = 'Only Serialize Main Language'
+      iv_hint        = 'Ignore translations; serialize only main language of repository'
+    )->start_group(
+      iv_name        = c_id-checks
+      iv_label       = 'Local Checks'
+      iv_hint        = 'Code Inspector check performed to run from menu and before commit'
+    )->text(
+      iv_name        = c_id-code_inspector_check_variant
+      iv_side_action = c_event-choose_check_variant
+      iv_label       = 'Code Inspector Check Variant'
+      iv_hint        = 'Global check variant for Code Inspector or ABAP Test Cockpit'
+    )->checkbox(
+      iv_name        = c_id-block_commit
+      iv_label       = 'Block Commit If Code Inspection Has Errors'
+      iv_hint        = 'Prevent staging if errors of priority 1 or 2 were found during check'
+    )->command(
+      iv_label       = 'Save Settings'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-save
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_picklist_state.
+
+    IF mo_popup_picklist IS BOUND AND
+      ( mo_popup_picklist->is_fulfilled( ) = abap_true OR mo_popup_picklist->is_in_page( ) = abap_false ).
+      " Picklist is either fullfilled OR
+      " it was on its own page and user went back from it via F3/ESC and the picklist had no "graceful back" handler
+      CASE mo_popup_picklist->id( ).
+        WHEN c_event-choose_check_variant.
+          choose_check_variant( iv_is_return = abap_true ).
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( |Unexpected picklist id { mo_popup_picklist->id( ) }| ).
+      ENDCASE.
+
+      CLEAR mo_popup_picklist.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD is_customizing_included.
+ 
+    DATA lt_files TYPE zif_abapgit_definitions=>ty_files_item_tt.
+ 
+    lt_files = mo_repo->get_files_local( ).
+ 
+    READ TABLE lt_files TRANSPORTING NO FIELDS
+      WITH KEY item-obj_type = zif_abapgit_data_config=>c_data_type-tabu. "todo
+    IF sy-subrc = 0.
+      rv_result = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    DATA: li_package TYPE REF TO zif_abapgit_sap_package.
+ 
+    li_package = zcl_abapgit_factory=>get_sap_package( mo_repo->get_package( ) ).
+ 
+    " Get settings from DB
+    ms_settings = mo_repo->get_local_settings( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Local Settings
+    ro_form_data->set(
+      iv_key = c_id-display_name
+      iv_val = ms_settings-display_name ).
+ 
+    IF li_package->are_changes_recorded_in_tr_req( ) = abap_true.
+      ro_form_data->set(
+        iv_key = c_id-transport_request
+        iv_val = ms_settings-transport_request ).
+    ENDIF.
+ 
+    IF is_customizing_included( ) = abap_true.
+      ro_form_data->set(
+        iv_key = c_id-customizing_request
+        iv_val = ms_settings-customizing_request ).
+    ENDIF.
+ 
+    ro_form_data->set(
+      iv_key = c_id-labels
+      iv_val = ms_settings-labels ).
+    ro_form_data->set(
+      iv_key = c_id-ignore_subpackages
+      iv_val = boolc( ms_settings-ignore_subpackages = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-main_language_only
+      iv_val = boolc( ms_settings-main_language_only = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-write_protected
+      iv_val = boolc( ms_settings-write_protected = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-only_local_objects
+      iv_val = boolc( ms_settings-only_local_objects = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-code_inspector_check_variant
+      iv_val = |{ ms_settings-code_inspector_check_variant }| ).
+    ro_form_data->set(
+      iv_key = c_id-block_commit
+      iv_val = boolc( ms_settings-block_commit = abap_true ) ) ##TYPE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+
+    ms_settings-display_name                 = mo_form_data->get( c_id-display_name ).
+    ms_settings-transport_request            = mo_form_data->get( c_id-transport_request ).
+    ms_settings-customizing_request          = mo_form_data->get( c_id-customizing_request ).
+    ms_settings-labels                       = zcl_abapgit_repo_labels=>normalize( mo_form_data->get( c_id-labels ) ).
+    ms_settings-ignore_subpackages           = mo_form_data->get( c_id-ignore_subpackages ).
+    ms_settings-main_language_only           = mo_form_data->get( c_id-main_language_only ).
+    ms_settings-write_protected              = mo_form_data->get( c_id-write_protected ).
+    ms_settings-only_local_objects           = mo_form_data->get( c_id-only_local_objects ).
+    ms_settings-code_inspector_check_variant = mo_form_data->get( c_id-code_inspector_check_variant ).
+    ms_settings-block_commit                 = mo_form_data->get( c_id-block_commit ).
+
+    mo_repo->set_local_settings( ms_settings ).
+
+    COMMIT WORK AND WAIT.
+
+    MESSAGE 'Settings succesfully saved' TYPE 'S'.
+
+    mo_form_data = read_settings( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lx_error               TYPE REF TO zcx_abapgit_exception,
+      lv_transport_request   TYPE trkorr,
+      lv_customizing_request TYPE trkorr,
+      lv_check_variant       TYPE sci_chkv.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    lv_transport_request = io_form_data->get( c_id-transport_request ).
+    IF lv_transport_request IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_transport=>validate_transport_request( lv_transport_request ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = c_id-transport_request
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    lv_customizing_request = io_form_data->get( c_id-customizing_request ).
+    IF lv_customizing_request IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_transport=>validate_transport_request( lv_customizing_request ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = c_id-customizing_request
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    lv_check_variant = to_upper( io_form_data->get( c_id-code_inspector_check_variant ) ).
+    IF lv_check_variant IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( )
+            )->validate_check_variant( lv_check_variant ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = c_id-code_inspector_check_variant
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF io_form_data->get( c_id-block_commit ) = abap_true AND lv_check_variant IS INITIAL.
+      ro_validation_log->set(
+        iv_key = c_id-block_commit
+        iv_val = |If block commit is active, a check variant has to be maintained| ).
+    ENDIF.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate( io_form_data->get( c_id-labels ) ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        ro_validation_log->set(
+          iv_key = c_id-labels
+          iv_val = lx_error->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-choose_transport_request.
+ 
+        choose_transport_request( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-choose_customizing_request.
+ 
+        choose_customizing_request( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-choose_labels.
+ 
+        choose_labels( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-choose_check_variant.
+ 
+        choose_check_variant( ).
+ 
+      WHEN c_event-save.
+        " Validate form entries before saving
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+    IF mo_popup_picklist IS BOUND. " Uniform popup state handling
+      " This should happen only for a new popup because
+      " on the first re-render main component event handling is blocked
+      " and not called again until the popup distruction
+      IF mo_popup_picklist->is_in_page( ) = abap_true.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      ELSE.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+        rs_handled-page  = zcl_abapgit_gui_page_hoc=>create(
+          ii_child_component = mo_popup_picklist
+          iv_show_as_modal   = abap_true ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    handle_picklist_state( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( `<div class="repo">` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+      io_repo               = mo_repo
+      iv_show_commit        = abap_false
+      iv_interactive_branch = abap_true ) ).
+ 
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+ 
+    ri_html->add( `</div>` ).
+ 
+    IF mo_popup_picklist IS NOT BOUND OR mo_popup_picklist->is_in_page( ) = abap_false.
+      register_handlers( ).
+    ELSEIF mo_popup_picklist->is_in_page( ) = abap_true.
+      " Block usual page events if the popup is an in-page popup
+      ri_html->add( zcl_abapgit_gui_in_page_modal=>create( mo_popup_picklist ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_pers.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_sett_pers.clas.abap.html new file mode 100644 index 00000000000..4f2a8b2c1f5 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_pers.clas.abap.html @@ -0,0 +1,1312 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_sett_pers.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_sett_pers.clas.abap

+
+ +
+ 91.68% + Statements + 375/409 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 91.68% + Lines + 375/409 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +4101x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_sett_pers DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+    METHODS constructor
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        startup                TYPE string VALUE 'startup',
+        show_default_repo      TYPE string VALUE 'show_default_repo',
+        ui                     TYPE string VALUE 'ui',
+        ui_theme               TYPE string VALUE 'ui_theme',
+        icon_scaling           TYPE string VALUE 'icon_scaling',
+        max_lines              TYPE string VALUE 'max_lines',
+        interaction            TYPE string VALUE 'interaction',
+        adt_jump_enabled       TYPE string VALUE 'adt_jump_enabled',
+        link_hints_enabled     TYPE string VALUE 'link_hints_enabled',
+        link_hint_key          TYPE string VALUE 'link_hint_key',
+        hotkeys                TYPE string VALUE 'hotkeys',
+        resources              TYPE string VALUE 'resources',
+        parallel_proc_disabled TYPE string VALUE 'parallel_proc_disabled',
+        hide_sapgui_hint       TYPE string VALUE 'hide_sapgui_hint',
+        activate_wo_popup      TYPE string VALUE 'activate_wo_popup',
+        label_colors           TYPE string VALUE 'label_colors',
+      END OF c_id.
+    CONSTANTS:
+      BEGIN OF c_event,
+        save TYPE string VALUE 'save',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+ 
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings.
+    DATA ms_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form.
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception.
+    METHODS render_repo_labels_help_hint
+      RETURNING
+        VALUE(rv_html) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_PERS IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_pers.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Personal Settings'
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_toolbar(
+        zif_abapgit_definitions=>c_action-go_settings_personal )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = 'personal-setting-form'
+      iv_help_page = 'https://docs.abapgit.org/guide-settings-personal.html' ).
+ 
+    ro_form->start_group(
+      iv_name          = c_id-startup
+      iv_label         = 'Startup'
+    )->checkbox(
+      iv_name          = c_id-show_default_repo
+      iv_label         = 'Show Last Opened Repository'
+      iv_hint          = 'Recommended to check, if you are using ADT'
+    )->start_group(
+      iv_name          = c_id-ui
+      iv_label         = 'User Interface'
+    )->radio(
+      iv_name          = c_id-ui_theme
+      iv_default_value = zcl_abapgit_settings=>c_ui_theme-default
+      iv_label         = 'Theme'
+    )->option(
+      iv_label         = 'Default'
+      iv_value         = zcl_abapgit_settings=>c_ui_theme-default
+    )->option(
+      iv_label         = 'Dark'
+      iv_value         = zcl_abapgit_settings=>c_ui_theme-dark
+    )->option(
+      iv_label         = 'Belize'
+      iv_value         = zcl_abapgit_settings=>c_ui_theme-belize
+    )->option(
+      iv_label         = 'Synced with SAP GUI'
+      iv_value         = zcl_abapgit_settings=>c_ui_theme-synced_with_gui
+    )->radio(
+      iv_name          = c_id-icon_scaling
+      iv_default_value = ''
+      iv_label         = 'Icon Scaling (HDPI)'
+      iv_hint          = 'Adjust size of icons for High DPI displays'
+    )->option(
+      iv_label         = 'Automatic'
+      iv_value         = ''
+    )->option(
+      iv_label         = 'Small'
+      iv_value         = zcl_abapgit_settings=>c_icon_scaling-small
+    )->option(
+      iv_label         = 'Large'
+      iv_value         = zcl_abapgit_settings=>c_icon_scaling-large
+    )->number(
+      iv_name          = c_id-max_lines
+      iv_label         = 'List Size'
+      iv_hint          = 'Maximum number of objects listed (0 = All)'
+      iv_min           = 0
+      iv_max           = 10000
+    )->textarea(
+      iv_name          = c_id-label_colors
+      iv_rows          = 3
+      iv_label         = `Repo label colors ` && render_repo_labels_help_hint( )
+    )->start_group(
+      iv_name          = c_id-interaction
+      iv_label         = 'Interaction'
+    )->checkbox(
+      iv_name          = c_id-activate_wo_popup
+      iv_label         = 'Activate Objects Without Popup'
+      iv_hint          = 'Activates objects automatically without showing popup'
+    )->checkbox(
+      iv_name          = c_id-adt_jump_enabled
+      iv_label         = 'Enable Jump to ABAP Development Tools (If Available)'
+      iv_hint          = 'Recommended to check, if you are using ADT'
+    )->checkbox(
+      iv_name          = c_id-link_hints_enabled
+      iv_label         = 'Enable Vimium-like Link Hints'
+      iv_hint          = 'When you hit the key, abapGit will identify clickable things and put a label beside it'
+    )->text(
+      iv_name          = c_id-link_hint_key
+      iv_label         = 'Key to Activate Link Hints'
+      iv_min           = 0
+      iv_max           = 1
+    )->start_group(
+      iv_name          = c_id-resources
+      iv_label         = 'System Resources'
+    )->checkbox(
+      iv_name          = c_id-parallel_proc_disabled
+      iv_label         = 'Disable Parallel Processing'
+      iv_hint          = 'If disabled, abapGit will use only a single thread to serialize objects'
+    )->command(
+      iv_label         = 'Save Settings'
+      iv_cmd_type      = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action        = c_event-save
+    )->command(
+      iv_label         = 'Back'
+      iv_action        = zif_abapgit_definitions=>c_action-go_back ).
+ 
+    " Not available via this form:
+    " - User-specific hotkey settings have been discontinued
+    " - hide_sapgui_hint is set via ZCL_ABAPGIT_SERVICES_ABAPGIT-CHECK_SAPGUI
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    " Get settings from DB
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+    ms_settings = mo_settings->get_user_settings( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Startup
+    ro_form_data->set(
+      iv_key = c_id-show_default_repo
+      iv_val = |{ ms_settings-show_default_repo }| ).
+ 
+    " UI
+    ro_form_data->set(
+      iv_key = c_id-ui_theme
+      iv_val = ms_settings-ui_theme ).
+    ro_form_data->set(
+      iv_key = c_id-icon_scaling
+      iv_val = |{ ms_settings-icon_scaling }| ).
+    ro_form_data->set(
+      iv_key = c_id-max_lines
+      iv_val = |{ ms_settings-max_lines }| ).
+    ro_form_data->set(
+      iv_key = c_id-label_colors
+      iv_val = ms_settings-label_colors ).
+ 
+    " Interaction
+    ro_form_data->set(
+      iv_key = c_id-activate_wo_popup
+      iv_val = boolc( ms_settings-activate_wo_popup = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-adt_jump_enabled
+      iv_val = boolc( ms_settings-adt_jump_enabled = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-link_hints_enabled
+      iv_val = boolc( ms_settings-link_hints_enabled = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-link_hint_key
+      iv_val = |{ ms_settings-link_hint_key }| ).
+ 
+    " Resources
+    ro_form_data->set(
+      iv_key = c_id-parallel_proc_disabled
+      iv_val = boolc( ms_settings-parallel_proc_disabled = abap_true ) ) ##TYPE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_repo_labels_help_hint.
+ 
+    DATA lt_fragments TYPE string_table.
+    DATA lt_labels TYPE string_table.
+    DATA lv_l TYPE string.
+    DATA lo_colors TYPE REF TO zcl_abapgit_string_map.
+ 
+    APPEND `<p style="margin-bottom: 0.3em">` TO lt_fragments.
+    APPEND `Comma-separated list of <code>label:color</code> pairs.` TO lt_fragments.
+    APPEND ` <code>color</code> part can be either a css style (see below) or <code>#fg/bg</code> pair,`
+      TO lt_fragments.
+    APPEND ` where <code>fg</code> and <code>bg</code> are RGB color codes (3 or 6 long).` TO lt_fragments.
+    APPEND ` You can also specify just <code>fg</code> or <code>bg</code>` TO lt_fragments.
+    APPEND ` (defaults will be used for missing parts).` TO lt_fragments.
+    APPEND ` E.g. <code>utils:brown, work:#ff0000/880000, client X:#ddd, client Y:#/333</code>` TO lt_fragments.
+    APPEND `<br>Available CSS styles:` TO lt_fragments.
+    APPEND `</p>` TO lt_fragments.
+ 
+    APPEND `white` TO lt_labels.
+    APPEND `white-b` TO lt_labels.
+    APPEND `white-r` TO lt_labels.
+    APPEND `grey` TO lt_labels.
+    APPEND `dark-w` TO lt_labels.
+    APPEND `dark-y` TO lt_labels.
+    APPEND `dark-r` TO lt_labels.
+    APPEND `dark-b` TO lt_labels.
+    APPEND `lightblue` TO lt_labels.
+    APPEND `darkblue` TO lt_labels.
+    APPEND `lightgreen` TO lt_labels.
+    APPEND `darkgreen` TO lt_labels.
+    APPEND `lightred` TO lt_labels.
+    APPEND `darkred` TO lt_labels.
+    APPEND `yellow` TO lt_labels.
+    APPEND `darkyellow` TO lt_labels.
+    APPEND `orrange` TO lt_labels.
+    APPEND `brown` TO lt_labels.
+    APPEND `pink` TO lt_labels.
+    APPEND `teal` TO lt_labels.
+    APPEND `darkviolet` TO lt_labels.
+ 
+    lo_colors = zcl_abapgit_string_map=>create( ).
+    LOOP AT lt_labels INTO lv_l.
+      TRY.
+          lo_colors->set(
+            iv_key = lv_l
+            iv_val = lv_l ).
+        CATCH zcx_abapgit_exception.
+      ENDTRY.
+    ENDLOOP.
+ 
+    APPEND zcl_abapgit_gui_chunk_lib=>render_label_list(
+      it_labels       = lt_labels
+      io_label_colors = lo_colors ) TO lt_fragments.
+ 
+    APPEND
+      `<p style="margin-top: 0.3em">see also <code>rl-*</code> styles in common.css (styles, forgotten here)</p>`
+      TO lt_fragments.
+ 
+    rv_html = zcl_abapgit_gui_chunk_lib=>render_help_hint( concat_lines_of( table = lt_fragments ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+
+    DATA li_persistence TYPE REF TO zif_abapgit_persist_settings.
+
+    " Startup
+    ms_settings-show_default_repo = mo_form_data->get( c_id-show_default_repo ).
+
+    " UI
+    ms_settings-ui_theme = mo_form_data->get( c_id-ui_theme ).
+    ms_settings-icon_scaling = mo_form_data->get( c_id-icon_scaling ).
+    ms_settings-max_lines = mo_form_data->get( c_id-max_lines ).
+    ms_settings-label_colors = zcl_abapgit_repo_labels=>normalize_colors( mo_form_data->get(  c_id-label_colors ) ).
+
+    " Interaction
+    ms_settings-activate_wo_popup = mo_form_data->get( c_id-activate_wo_popup ).
+    ms_settings-adt_jump_enabled = mo_form_data->get( c_id-adt_jump_enabled ).
+    ms_settings-link_hints_enabled = mo_form_data->get( c_id-link_hints_enabled ).
+    ms_settings-link_hint_key = mo_form_data->get( c_id-link_hint_key ).
+
+    " Resources
+    ms_settings-parallel_proc_disabled = mo_form_data->get( c_id-parallel_proc_disabled ).
+
+    " Store in DB
+    mo_settings->set_user_settings( ms_settings ).
+
+    li_persistence = zcl_abapgit_persist_factory=>get_settings( ).
+    li_persistence->modify( mo_settings ).
+
+    COMMIT WORK AND WAIT.
+
+    MESSAGE 'Settings succesfully saved' TYPE 'S'.
+
+    mo_form_data = read_settings( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate_colors( io_form_data->get( c_id-label_colors ) ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        ro_validation_log->set(
+          iv_key = c_id-label_colors
+          iv_val = lx_error->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-save.
+        " Validate form entries before saving
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    ri_html->add( '<div class="form-container">' ).
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+    ri_html->add( '</div>' ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap.html new file mode 100644 index 00000000000..2d38607a44b --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap.html @@ -0,0 +1,3445 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_sett_remo.clas.abap

+
+ +
+ 75% + Statements + 840/1120 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/10 +
+ + +
+ 75% + Lines + 840/1120 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +11211x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_sett_remo DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+    INTERFACES zif_abapgit_gui_hotkeys.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_head_type TYPE c LENGTH 1,
+      BEGIN OF ty_remote_settings,
+        offline         TYPE zif_abapgit_persistence=>ty_repo-offline,
+        url             TYPE zif_abapgit_persistence=>ty_repo-url,
+        branch          TYPE zif_abapgit_git_definitions=>ty_git_branch-name,
+        tag             TYPE zif_abapgit_git_definitions=>ty_git_tag-name,
+        commit          TYPE zif_abapgit_git_definitions=>ty_commit-sha1,
+        pull_request    TYPE string,
+        head_type       TYPE ty_head_type,
+        switched_origin TYPE zif_abapgit_persistence=>ty_repo-switched_origin,
+      END OF ty_remote_settings.
+    CONSTANTS:
+      BEGIN OF c_head_types,
+        branch       TYPE ty_head_type VALUE 'B',
+        tag          TYPE ty_head_type VALUE 'T',
+        commit       TYPE ty_head_type VALUE 'C',
+        pull_request TYPE ty_head_type VALUE 'P',
+      END OF c_head_types.
+    CONSTANTS:
+      BEGIN OF c_id,
+        general      TYPE string VALUE 'general',
+        repo_type    TYPE string VALUE 'repo_type',
+        offline      TYPE string VALUE 'offline',
+        url          TYPE string VALUE 'url',
+        head_group   TYPE string VALUE 'head_group',
+        branch       TYPE string VALUE 'branch',
+        tag          TYPE string VALUE 'tag',
+        commit       TYPE string VALUE 'commit',
+        pull_request TYPE string VALUE 'pull_request',
+        head_type    TYPE string VALUE 'head_type',
+      END OF c_id.
+    CONSTANTS:
+      BEGIN OF c_event,
+        save                TYPE string VALUE 'save',
+        switch              TYPE string VALUE 'switch',
+        choose_url          TYPE string VALUE 'choose_url',
+        choose_branch       TYPE string VALUE 'choose_branch',
+        choose_tag          TYPE string VALUE 'choose_tag',
+        choose_commit       TYPE string VALUE 'choose_commit',
+        choose_pull_request TYPE string VALUE 'choose_pull_request',
+        change_head_type    TYPE string VALUE 'change_head_type',
+      END OF c_event .
+    CONSTANTS:
+      BEGIN OF c_popup,
+        pull_request TYPE string VALUE 'popup_pull_request',
+      END OF c_popup.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA ms_settings_snapshot TYPE ty_remote_settings.
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+    DATA mv_refresh_on_back TYPE abap_bool.
+    DATA mv_offline_switch_saved_url TYPE string.
+ 
+    DATA mo_popup_picklist TYPE REF TO zcl_abapgit_gui_picklist.
+ 
+    METHODS get_remote_settings_from_repo
+      IMPORTING
+        io_repo            TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(rs_settings) TYPE ty_remote_settings
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_remote_settings_from_form
+      IMPORTING
+        io_form_data       TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(rs_settings) TYPE ty_remote_settings
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_form_schema
+      IMPORTING
+        io_existing_form_data TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS initialize_form_data
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS check_protection
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS validate_form
+      IMPORTING
+        io_form_data             TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS choose_url
+      RETURNING
+        VALUE(rv_url) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    METHODS choose_branch
+      IMPORTING
+        iv_is_return TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+    METHODS choose_tag
+      IMPORTING
+        iv_is_return TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+    METHODS choose_pr
+      IMPORTING
+        iv_is_return TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+    METHODS choose_commit
+      RETURNING
+        VALUE(rv_commit) TYPE ty_remote_settings-commit
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS switch_online_offline
+      RAISING
+        zcx_abapgit_exception.
+    METHODS switch_to_branch_tag
+      IMPORTING
+        !iv_name TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS switch_to_commit
+      IMPORTING
+        !iv_revert TYPE abap_bool DEFAULT abap_false
+        !iv_commit TYPE ty_remote_settings-commit OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS switch_to_pull_req
+      IMPORTING
+        !iv_revert TYPE abap_bool DEFAULT abap_false
+        !iv_pull   TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS handle_picklist_state
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS render_content
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION.
+ 
+ 
+  METHOD check_protection.
+
+    IF mo_repo->is_offline( ) = abap_true.
+      zcx_abapgit_exception=>raise( 'Unexpected switch for offline repo' ).
+    ENDIF.
+    IF mo_repo->get_local_settings( )-write_protected = abap_true.
+      zcx_abapgit_exception=>raise( 'Cannot switch. Repository is write-protected in local settings' ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_branch.
+
+    DATA lv_url         TYPE zif_abapgit_persistence=>ty_repo-url.
+    DATA lv_branch_name TYPE zif_abapgit_persistence=>ty_repo-branch_name.
+    DATA ls_branch      TYPE zif_abapgit_git_definitions=>ty_git_branch.
+    DATA lv_popup_cancelled TYPE abap_bool.
+
+    IF iv_is_return = abap_false.
+
+      IF mo_form_data->get( c_id-offline ) = abap_true.
+        RETURN.
+      ENDIF.
+
+      lv_url         = mo_form_data->get( c_id-url ).
+      lv_branch_name = mo_form_data->get( c_id-branch ).
+
+      mo_popup_picklist = zcl_abapgit_popup_branch_list=>create(
+        iv_show_new_option = abap_false
+        iv_url             = lv_url
+        iv_default_branch  = lv_branch_name
+        )->create_picklist(
+        )->set_id( c_event-choose_branch
+        )->set_in_page( ).
+
+    ELSE.
+
+      lv_popup_cancelled = mo_popup_picklist->was_cancelled( ).
+      IF lv_popup_cancelled = abap_false.
+        mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_branch ).
+        IF ls_branch IS NOT INITIAL.
+          mo_form_data->set(
+            iv_key = c_id-branch
+            iv_val = ls_branch-display_name ).
+        ENDIF.
+      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_commit.
+ 
+    DATA:
+      lv_url         TYPE string,
+      lv_branch_name TYPE zif_abapgit_persistence=>ty_repo-branch_name,
+      li_popups      TYPE REF TO zif_abapgit_popups.
+ 
+    IF mo_form_data->get( c_id-offline ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    lv_url = mo_form_data->get( c_id-url ).
+    lv_branch_name = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && mo_form_data->get( c_id-branch ).
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+ 
+    rv_commit = li_popups->commit_list_popup(
+      iv_repo_url    = lv_url
+      iv_branch_name = lv_branch_name )-sha1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_pr.
+
+    DATA ls_pull         TYPE zif_abapgit_pr_enum_provider=>ty_pull_request.
+    DATA lv_pull_request TYPE ty_remote_settings-pull_request.
+    DATA lv_url TYPE ty_remote_settings-url.
+    DATA lv_popup_cancelled TYPE abap_bool.
+
+    IF iv_is_return = abap_false.
+
+      IF mo_form_data->get( c_id-offline ) = abap_true.
+        zcx_abapgit_exception=>raise( 'Not possible for offline repositories' ).
+      ENDIF.
+
+      lv_url = mo_form_data->get( c_id-url ).
+      mo_popup_picklist = zcl_abapgit_popup_pull_request=>create( lv_url
+        )->create_picklist(
+        )->set_id( c_event-choose_pull_request
+        )->set_in_page( abap_true ).
+
+    ELSE.
+
+      lv_popup_cancelled = mo_popup_picklist->was_cancelled( ).
+      IF lv_popup_cancelled = abap_false.
+        mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_pull ).
+        IF ls_pull IS NOT INITIAL.
+          mo_form_data->set(
+            iv_key = c_id-pull_request
+            iv_val = ls_pull-head_url && '@' && ls_pull-head_branch ).
+        ENDIF.
+      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_tag.
+
+    DATA ls_tag TYPE zif_abapgit_git_definitions=>ty_git_branch.
+    DATA lv_url TYPE ty_remote_settings-url.
+    DATA lv_popup_cancelled TYPE abap_bool.
+
+    IF iv_is_return = abap_false.
+
+      IF mo_form_data->get( c_id-offline ) = abap_true.
+        RETURN.
+      ELSEIF mo_repo->is_offline( ) = abap_true.
+        MESSAGE 'Please save conversion to online repository before choosing a tag' TYPE 'S'.
+        RETURN.
+      ENDIF.
+
+      lv_url = mo_form_data->get( c_id-url ).
+      mo_popup_picklist = zcl_abapgit_popup_tag_list=>create( lv_url
+        )->create_picklist(
+        )->set_id( c_event-choose_tag
+        )->set_in_page( ).
+
+    ELSE.
+
+      lv_popup_cancelled = mo_popup_picklist->was_cancelled( ).
+      IF lv_popup_cancelled = abap_false.
+        mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_tag ).
+        IF ls_tag IS NOT INITIAL.
+          mo_form_data->set(
+            iv_key = c_id-tag
+            iv_val = ls_tag-display_name ).
+        ENDIF.
+      ENDIF.
+
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD choose_url.
+ 
+    " todo, get url history from DB and show selection popup #3639
+    rv_url = ''.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    mo_repo              = io_repo.
+    ms_settings_snapshot = get_remote_settings_from_repo( mo_repo ).
+    mo_form              = get_form_schema( ).
+    mo_form_data         = initialize_form_data( ).
+    CREATE OBJECT mo_validation_log.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_remo.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Remote Settings'
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_remote_settings )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA:
+      lv_button      TYPE string,
+      lv_label       TYPE string,
+      lv_icon        TYPE string,
+      lv_hint        TYPE string,
+      lv_placeholder TYPE string,
+      lv_offline     TYPE abap_bool,
+      lv_head_type   TYPE ty_head_type.
+ 
+    IF io_existing_form_data IS BOUND AND io_existing_form_data->is_empty( ) = abap_false.
+      lv_offline = io_existing_form_data->get( c_id-offline ).
+      IF lv_offline = abap_false.
+        lv_head_type = io_existing_form_data->get( c_id-head_type ).
+      ENDIF.
+    ELSE.
+      lv_offline   = ms_settings_snapshot-offline.
+      lv_head_type = ms_settings_snapshot-head_type.
+    ENDIF.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+      iv_form_id   = 'repo-remote-settings-form'
+      iv_help_page = 'https://docs.abapgit.org/settings-remote.html' ).
+ 
+    IF lv_offline = abap_true.
+      lv_button      = 'Switch to Online'.
+      lv_icon        = 'plug/darkgrey'.
+      lv_label       = 'Repository Name'.
+    ELSE.
+      lv_button      = 'Switch to Offline'.
+      lv_icon        = 'cloud-upload-alt/darkgrey'.
+      lv_label       = 'Git Repository URL'.
+      lv_hint        = 'URL of original repository'.
+      lv_placeholder = 'https://github.com/...git'.
+    ENDIF.
+ 
+    ro_form->start_group(
+      iv_name  = c_id-general
+      iv_label = 'General'
+      iv_hint  = 'Change the general type and origin of the repository'
+    )->text(
+      iv_name        = c_id-repo_type
+      iv_label       = |Type of Repository: { zcl_abapgit_html=>icon( lv_icon ) }|
+      iv_readonly    = abap_true
+    )->hidden( c_id-offline
+    )->text(
+      iv_name        = c_id-url
+      iv_condense    = abap_true
+      iv_label       = lv_label
+      iv_hint        = lv_hint
+      iv_placeholder = lv_placeholder ).
+ 
+    IF lv_offline = abap_false.
+ 
+      ro_form->start_group(
+        iv_name  = c_id-head_group
+        iv_label = 'Head'
+      )->radio(
+        iv_label  = 'Type'
+        iv_name   = c_id-head_type
+        iv_action = c_event-change_head_type
+      )->option(
+        iv_label = 'Branch'
+        iv_value = c_head_types-branch
+      )->option(
+        iv_label = 'Tag'
+        iv_value = c_head_types-tag
+      )->option(
+        iv_label = 'Commit'
+        iv_value = c_head_types-commit
+      )->option(
+        iv_label = 'Pull Request'
+        iv_value = c_head_types-pull_request ).
+ 
+      IF lv_head_type = c_head_types-branch OR
+         lv_head_type = c_head_types-commit.
+        ro_form->text(
+          iv_name        = c_id-branch
+          iv_label       = 'Branch'
+          iv_required    = abap_true
+          iv_side_action = c_event-choose_branch ).
+      ENDIF.
+ 
+      IF lv_head_type = c_head_types-tag.
+        ro_form->text(
+          iv_name        = c_id-tag
+          iv_label       = 'Tag'
+          iv_required    = abap_true
+          iv_side_action = c_event-choose_tag ).
+      ENDIF.
+ 
+      IF lv_head_type = c_head_types-commit.
+        ro_form->text(
+          iv_name        = c_id-commit
+          iv_label       = 'Commit'
+          iv_required    = abap_true
+          iv_min         = 40
+          iv_max         = 40
+          iv_side_action = c_event-choose_commit ).
+      ENDIF.
+ 
+      IF lv_head_type = c_head_types-pull_request.
+        ro_form->text(
+          iv_name        = c_id-pull_request
+          iv_label       = 'Pull Request'
+          iv_required    = abap_true
+          iv_side_action = c_event-choose_pull_request ).
+      ENDIF.
+ 
+    ENDIF.
+ 
+    ro_form->command(
+      iv_label    = 'Save Settings'
+      iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action   = c_event-save
+    )->command(
+      iv_label  = lv_button
+      iv_action = c_event-switch
+    )->command(
+      iv_label  = 'Back'
+      iv_action = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_remote_settings_from_form.
+ 
+    rs_settings-url = io_form_data->get( c_id-url ).
+    rs_settings-offline = io_form_data->get( c_id-offline ).
+ 
+    IF rs_settings-offline = abap_false.
+      rs_settings-head_type = io_form_data->get( c_id-head_type ).
+ 
+      CASE rs_settings-head_type.
+        WHEN c_head_types-branch.
+          rs_settings-branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix &&
+            io_form_data->get( c_id-branch ).
+        WHEN c_head_types-tag.
+          rs_settings-tag = zif_abapgit_git_definitions=>c_git_branch-tags_prefix &&
+            io_form_data->get( c_id-tag ).
+        WHEN c_head_types-commit.
+          rs_settings-branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix &&
+            io_form_data->get( c_id-branch ).
+          rs_settings-commit = io_form_data->get( c_id-commit ).
+        WHEN c_head_types-pull_request.
+          rs_settings-pull_request = io_form_data->get( c_id-pull_request ).
+      ENDCASE.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_remote_settings_from_repo.
+ 
+    DATA: lo_repo_online  TYPE REF TO zcl_abapgit_repo_online,
+          lo_repo_offline TYPE REF TO zcl_abapgit_repo_offline,
+          lv_branch       TYPE ty_remote_settings-branch.
+ 
+    IF io_repo->is_offline( ) = abap_false.
+      lo_repo_online ?= io_repo.
+ 
+      rs_settings-url = lo_repo_online->get_url( ).
+      rs_settings-offline = abap_false.
+      rs_settings-switched_origin = lo_repo_online->get_switched_origin( ).
+ 
+      IF lo_repo_online->get_selected_commit( ) IS NOT INITIAL.
+        rs_settings-commit = lo_repo_online->get_selected_commit( ).
+        rs_settings-branch = lo_repo_online->get_selected_branch( ).
+        rs_settings-head_type = c_head_types-commit.
+      ELSEIF lo_repo_online->get_switched_origin( ) IS NOT INITIAL.
+        " get_switched_origin( ) returns the original repo url + HEAD concatenated with @
+        " get_branch( ) returns the branch of the PR in the source repo
+        " get_url( ) returns the source repo of the PR branch
+ 
+        rs_settings-switched_origin = lo_repo_online->get_switched_origin( ).
+        SPLIT rs_settings-switched_origin AT '@' INTO rs_settings-url rs_settings-branch.
+        IF rs_settings-branch CP zif_abapgit_git_definitions=>c_git_branch-tags.
+          rs_settings-tag = rs_settings-branch.
+          CLEAR rs_settings-branch.
+        ENDIF.
+ 
+        lv_branch = lo_repo_online->get_selected_branch( ).
+        REPLACE FIRST OCCURRENCE OF zif_abapgit_git_definitions=>c_git_branch-heads_prefix IN lv_branch WITH space.
+        CONDENSE lv_branch.
+        rs_settings-pull_request = |{ lo_repo_online->get_url( ) }@{ lv_branch }|.
+        rs_settings-head_type = c_head_types-pull_request.
+      ELSE.
+        rs_settings-branch = lo_repo_online->get_selected_branch( ).
+        rs_settings-head_type = c_head_types-branch.
+ 
+        IF rs_settings-branch CP zif_abapgit_git_definitions=>c_git_branch-tags.
+          rs_settings-head_type = c_head_types-tag.
+          rs_settings-tag = rs_settings-branch.
+          CLEAR rs_settings-branch.
+        ENDIF.
+      ENDIF.
+ 
+    ELSE.
+      lo_repo_offline ?= io_repo.
+ 
+      rs_settings-url = lo_repo_offline->get_name( ).
+      rs_settings-offline = abap_true.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD handle_picklist_state.
+
+    IF mo_popup_picklist IS BOUND AND
+      ( mo_popup_picklist->is_fulfilled( ) = abap_true OR mo_popup_picklist->is_in_page( ) = abap_false ).
+      " Picklist is either fullfilled OR
+      " it was on its own page and user went back from it via F3/ESC and the picklist had no "graceful back" handler
+      CASE mo_popup_picklist->id( ).
+        WHEN c_event-choose_pull_request.
+          choose_pr( iv_is_return = abap_true ).
+        WHEN c_event-choose_branch.
+          choose_branch( iv_is_return = abap_true ).
+        WHEN c_event-choose_tag.
+          choose_tag( iv_is_return = abap_true ).
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( |Unexpected picklist id { mo_popup_picklist->id( ) }| ).
+      ENDCASE.
+
+      CLEAR mo_popup_picklist.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD initialize_form_data.
+ 
+    DATA:
+      lv_type TYPE string,
+      lv_head TYPE string.
+ 
+    CREATE OBJECT ro_form_data.
+ 
+    IF ms_settings_snapshot-offline = abap_true.
+      lv_type = 'Offline repository'.
+    ELSE.
+      lv_type = 'Online repository'.
+    ENDIF.
+ 
+    ro_form_data->set(
+      iv_key = c_id-offline
+      iv_val = ms_settings_snapshot-offline ).
+    ro_form_data->set(
+      iv_key = c_id-repo_type
+      iv_val = lv_type ).
+    ro_form_data->set(
+      iv_key = c_id-url
+      iv_val = ms_settings_snapshot-url ).
+ 
+    IF ms_settings_snapshot-offline = abap_false.
+      ro_form_data->set(
+        iv_key = c_id-head_type
+        iv_val = ms_settings_snapshot-head_type ).
+ 
+      " When pull request is selected the previously selected branch/tag is also loaded to be able to switch back to it
+      lv_head = zcl_abapgit_git_branch_list=>get_display_name( ms_settings_snapshot-branch ).
+      ro_form_data->set(
+        iv_key = c_id-branch
+        iv_val = lv_head ).
+ 
+      lv_head = zcl_abapgit_git_branch_list=>get_display_name( ms_settings_snapshot-tag ).
+      ro_form_data->set(
+        iv_key = c_id-tag
+        iv_val = lv_head ).
+ 
+      ro_form_data->set(
+        iv_key = c_id-commit
+        iv_val = ms_settings_snapshot-commit ).
+ 
+      ro_form_data->set(
+        iv_key = c_id-pull_request
+        iv_val = ms_settings_snapshot-pull_request ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+      io_repo               = mo_repo
+      iv_show_commit        = abap_false
+      iv_interactive_branch = abap_false ) ).
+ 
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+
+    DATA:
+      lo_repo_online  TYPE REF TO zcl_abapgit_repo_online,
+      lo_repo_offline TYPE REF TO zcl_abapgit_repo_offline,
+      ls_settings_new TYPE ty_remote_settings.
+
+    ls_settings_new = get_remote_settings_from_form( mo_form_data ).
+
+    " Switch online / offline
+    IF ls_settings_new-offline <> ms_settings_snapshot-offline.
+      " Remember key, switch, retrieve new instance (todo, refactor #2244)
+      mo_repo->switch_repo_type( ls_settings_new-offline ).
+      mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ).
+    ENDIF.
+
+    IF mo_repo->is_offline( ) = abap_true.
+      " Offline: Save repo name
+      lo_repo_offline ?= mo_repo.
+      lo_repo_offline->set_name( ls_settings_new-url ).
+    ELSE.
+      " Online: Save url
+      lo_repo_online ?= mo_repo.
+      lo_repo_online->set_url( ls_settings_new-url ).
+    ENDIF.
+
+    CASE ls_settings_new-head_type.
+      WHEN c_head_types-branch.
+        switch_to_pull_req( iv_revert = abap_true ).
+        switch_to_commit( iv_revert = abap_true ).
+        switch_to_branch_tag( ls_settings_new-branch ).
+      WHEN c_head_types-tag.
+        switch_to_pull_req( iv_revert = abap_true ).
+        switch_to_commit( iv_revert = abap_true ).
+        switch_to_branch_tag( ls_settings_new-tag ).
+      WHEN c_head_types-commit.
+        switch_to_pull_req( iv_revert = abap_true ).
+        switch_to_commit( iv_commit = ls_settings_new-commit ).
+      WHEN c_head_types-pull_request.
+        switch_to_commit( iv_revert = abap_true ).
+        switch_to_pull_req( iv_pull = ls_settings_new-pull_request ).
+    ENDCASE.
+
+    IF mo_repo->is_offline( ) = abap_false AND ls_settings_new-head_type <> c_head_types-pull_request.
+      " Switching from PR to something else will reset the URL in repo->switch_origin( space )
+      " -> set URL again
+      lo_repo_online->set_url( ls_settings_new-url ).
+    ENDIF.
+
+    COMMIT WORK AND WAIT.
+
+    MESSAGE 'Settings succesfully saved' TYPE 'S'.
+
+    mv_refresh_on_back = abap_true.
+    ms_settings_snapshot = get_remote_settings_from_repo( mo_repo ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_online_offline.
+
+    DATA: lv_offline_new TYPE abap_bool,
+          lv_url         TYPE ty_remote_settings-url,
+          lv_branch      TYPE ty_remote_settings-branch.
+
+    lv_offline_new = boolc( mo_form_data->get( c_id-offline ) = abap_false ).
+    mo_form_data->set(
+      iv_key = c_id-offline
+      iv_val = lv_offline_new ).
+
+    IF lv_offline_new = abap_true.
+      lv_url = mo_form_data->get( c_id-url ).
+      mv_offline_switch_saved_url = lv_url.
+      IF lv_url CP 'http*'.
+        lv_url = zcl_abapgit_url=>name( lv_url ).
+        mo_form_data->set(
+          iv_key = c_id-url
+          iv_val = lv_url ).
+      ENDIF.
+
+    ELSE.
+      IF mv_offline_switch_saved_url IS NOT INITIAL.
+        mo_form_data->set(
+          iv_key = c_id-url
+          iv_val = mv_offline_switch_saved_url ).
+      ENDIF.
+
+      lv_url = mo_form_data->get( c_id-url ).
+      IF mo_form_data->get( c_id-head_type ) IS INITIAL.
+        TRY.
+            mo_form_data->set(
+              iv_key = c_id-head_type
+              iv_val = c_head_types-branch ).
+
+            IF lv_url CP 'http*'.
+              lv_branch = zcl_abapgit_git_transport=>branches( lv_url )->get_head_symref( ).
+              mo_form_data->set(
+                iv_key = c_id-branch
+                iv_val = lv_branch ).
+            ENDIF.
+          CATCH zcx_abapgit_exception ##NO_HANDLER.
+        ENDTRY.
+      ENDIF.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_to_branch_tag.
+
+    DATA lo_repo TYPE REF TO zcl_abapgit_repo_online.
+
+    check_protection( ).
+    lo_repo ?= mo_repo.
+    lo_repo->select_branch( iv_name ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_to_commit.
+
+    DATA lo_repo TYPE REF TO zcl_abapgit_repo_online.
+
+    check_protection( ).
+
+    lo_repo ?= mo_repo.
+
+    IF iv_revert = abap_true.
+      lo_repo->select_commit( '' ).
+    ELSE.
+      lo_repo->select_commit( iv_commit ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_to_pull_req.
+
+    DATA:
+      lo_repo   TYPE REF TO zcl_abapgit_repo_online,
+      lv_url    TYPE ty_remote_settings-url,
+      lv_branch TYPE ty_remote_settings-branch.
+
+    check_protection( ).
+
+    lo_repo ?= mo_repo.
+
+    " Switching twice does not work so reset to original repo first
+    lo_repo->switch_origin( '' ).
+
+    IF iv_revert = abap_false.
+      SPLIT iv_pull AT '@' INTO lv_url lv_branch.
+      lo_repo->switch_origin(
+        iv_url    = lv_url
+        iv_branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && lv_branch ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lx_error                 TYPE REF TO zcx_abapgit_exception,
+      lo_branch_list           TYPE REF TO zcl_abapgit_git_branch_list,
+      lo_url                   TYPE REF TO zcl_abapgit_git_url,
+      lv_offline               TYPE abap_bool,
+      lv_head_type             TYPE ty_head_type,
+      lv_branch                TYPE ty_remote_settings-branch,
+      lv_url                   TYPE ty_remote_settings-url,
+      lv_branch_check_error_id TYPE string,
+      lv_pull_request          TYPE ty_remote_settings-pull_request,
+      lv_commit                TYPE ty_remote_settings-commit.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+    lv_offline = io_form_data->get( c_id-offline ).
+    lv_url = io_form_data->get( c_id-url ).
+ 
+    IF lv_offline = abap_true AND lv_url IS INITIAL.
+      ro_validation_log->set(
+        iv_key = c_id-url
+        iv_val = 'Enter a name for the repository and save' ).
+    ENDIF.
+ 
+    IF lv_offline = abap_false AND lv_url NP 'http*'.
+      ro_validation_log->set(
+        iv_key = c_id-url
+        iv_val = 'Enter the URL of the repository and save' ).
+    ELSEIF lv_offline = abap_false.
+      TRY.
+          zcl_abapgit_url=>name(
+            iv_url      = lv_url
+            iv_validate = abap_true ).
+ 
+          " Provider-specific URL check
+          CREATE OBJECT lo_url.
+          lo_url->validate_url( lv_url ).
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = c_id-url
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+ 
+    IF lv_offline = abap_false.
+      lv_head_type = io_form_data->get( c_id-head_type ).
+ 
+      CASE lv_head_type.
+        WHEN c_head_types-branch.
+          lv_branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && io_form_data->get( c_id-branch ).
+          CONDENSE lv_branch.
+          lv_branch_check_error_id = c_id-branch.
+        WHEN c_head_types-tag.
+          lv_branch = zif_abapgit_git_definitions=>c_git_branch-tags_prefix && io_form_data->get( c_id-tag ).
+          CONDENSE lv_branch.
+          lv_branch_check_error_id = c_id-tag.
+        WHEN c_head_types-pull_request.
+          lv_pull_request = io_form_data->get( c_id-pull_request ).
+          SPLIT lv_pull_request AT '@' INTO lv_url lv_branch.
+          IF lv_branch IS NOT INITIAL.
+            lv_branch = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && lv_branch.
+          ENDIF.
+          lv_branch_check_error_id = c_id-pull_request.
+        WHEN c_head_types-commit.
+          lv_commit = io_form_data->get( c_id-commit ).
+ 
+          " Cannot check for commit existence currently (needs API that doesn't rely on finding the first commit
+          " in the branch), check format instead
+          IF lv_commit CN '0123456789abcdef'.
+            ro_validation_log->set(
+              iv_key = c_id-commit
+              iv_val = 'Commit needs to be hexadecimal and in lowercase' ).
+          ENDIF.
+        WHEN OTHERS.
+          ro_validation_log->set(
+            iv_key = c_id-head_type
+            iv_val = 'Unknown head type' ).
+      ENDCASE.
+ 
+      TRY.
+          IF lv_branch IS NOT INITIAL.
+            lo_branch_list = zcl_abapgit_git_transport=>branches( lv_url ).
+            lo_branch_list->find_by_name( lv_branch ).
+          ENDIF.
+        CATCH zcx_abapgit_exception INTO lx_error.
+          ro_validation_log->set(
+            iv_key = lv_branch_check_error_id
+            iv_val = lx_error->get_text( ) ).
+      ENDTRY.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA:
+      lv_url    TYPE ty_remote_settings-url,
+      lv_branch TYPE ty_remote_settings-branch,
+      lv_tag    TYPE ty_remote_settings-tag,
+      lv_commit TYPE ty_remote_settings-commit.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        IF mv_refresh_on_back = abap_true.
+          " Note this doesn't trigger if the tab is switched first
+          mo_repo->refresh( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data = mo_form_data
+          io_check_changes_versus = initialize_form_data( ) ).
+ 
+      WHEN c_event-choose_url.
+        lv_url = choose_url( ).
+ 
+        IF lv_url IS INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ELSE.
+          mo_form_data->set(
+            iv_key = c_id-url
+            iv_val = lv_url ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+      WHEN c_event-change_head_type.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        mo_validation_log->clear( ).
+ 
+      WHEN c_event-choose_branch.
+        choose_branch( ). " Unformly handle state below
+ 
+      WHEN c_event-choose_tag.
+        choose_tag( ). " Unformly handle state below
+ 
+      WHEN c_event-choose_pull_request.
+        choose_pr( ). " Unformly handle state below
+ 
+      WHEN c_event-choose_commit.
+        lv_commit = choose_commit( ).
+ 
+        IF lv_commit IS INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ELSE.
+          mo_form_data->set(
+            iv_key = c_id-commit
+            iv_val = lv_commit ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+      WHEN c_event-switch.
+        switch_online_offline( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN c_event-save.
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+    IF mo_popup_picklist IS BOUND. " Uniform popup state handling
+      " This should happen only for a new popup because
+      " on the first re-render main component event handling is blocked
+      " and not called again until the popup distruction
+      IF mo_popup_picklist->is_in_page( ) = abap_true.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      ELSE.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+        rs_handled-page  = zcl_abapgit_gui_page_hoc=>create(
+          ii_child_component = mo_popup_picklist
+          iv_show_as_modal   = abap_true ).
+      ENDIF.
+    ENDIF.
+ 
+    " If staying on form, initialize it with current settings
+    IF rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render AND mo_popup_picklist IS NOT BOUND.
+      " Switching tabs must change the form layout
+      mo_form = get_form_schema( io_existing_form_data = mo_form_data ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions,
+          lv_head_type     TYPE ty_head_type,
+          lv_offline       TYPE abap_bool.
+ 
+    IF mo_form_data IS BOUND AND mo_form_data->is_empty( ) = abap_false.
+      lv_offline = mo_form_data->get( c_id-offline ).
+      IF lv_offline = abap_false.
+        lv_head_type = mo_form_data->get( c_id-head_type ).
+      ENDIF.
+    ELSE.
+      lv_offline = ms_settings_snapshot-offline.
+      IF lv_offline = abap_false.
+        lv_head_type = ms_settings_snapshot-head_type.
+      ENDIF.
+    ENDIF.
+ 
+    ls_hotkey_action-ui_component = 'Remote'.
+ 
+    ls_hotkey_action-description = 'Choose URL'.
+    ls_hotkey_action-action      = c_event-choose_url.
+    ls_hotkey_action-hotkey      = 'u'.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    IF lv_head_type = c_head_types-branch OR
+       lv_head_type = c_head_types-commit.
+      ls_hotkey_action-description = 'Choose Branch'.
+      ls_hotkey_action-action      = c_event-choose_branch.
+      ls_hotkey_action-hotkey      = 'b'.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    IF lv_head_type = c_head_types-tag.
+      ls_hotkey_action-description = 'Choose Tag'.
+      ls_hotkey_action-action      = c_event-choose_tag.
+      ls_hotkey_action-hotkey      = 't'.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    IF lv_head_type = c_head_types-commit.
+      ls_hotkey_action-description = 'Choose Commit'.
+      ls_hotkey_action-action      = c_event-choose_commit.
+      ls_hotkey_action-hotkey      = 'c'.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    IF lv_head_type = c_head_types-pull_request.
+      ls_hotkey_action-description = 'Choose Pull Request'.
+      ls_hotkey_action-action      = c_event-choose_pull_request.
+      ls_hotkey_action-hotkey      = 'p'.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+    IF lv_offline = abap_true.
+      ls_hotkey_action-description = 'Switch to Online'.
+      ls_hotkey_action-action      = c_event-switch.
+      ls_hotkey_action-hotkey      = 'o'.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ELSE.
+      ls_hotkey_action-description = 'Switch to Offline'.
+      ls_hotkey_action-action      = c_event-switch.
+      ls_hotkey_action-hotkey      = 'o'.
+      INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    handle_picklist_state( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->wrap(
+      iv_tag     = 'div'
+      iv_class   = 'repo' " It's OK because it's repo settings ... for now
+      ii_content = render_content( ) ).
+ 
+    IF mo_popup_picklist IS NOT BOUND OR mo_popup_picklist->is_in_page( ) = abap_false.
+      register_handlers( ).
+    ELSEIF mo_popup_picklist->is_in_page( ) = abap_true.
+      " Block usual page events if the popup is an in-page popup
+      ri_html->add( zcl_abapgit_gui_in_page_modal=>create( mo_popup_picklist ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap.html new file mode 100644 index 00000000000..3344e538de7 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap.html @@ -0,0 +1,1471 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_sett_repo.clas.abap

+
+ +
+ 86.79% + Statements + 401/462 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 86.79% + Lines + 401/462 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +4631x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_sett_repo DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler .
+    INTERFACES zif_abapgit_gui_renderable .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !io_repo       TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        dot              TYPE string VALUE 'dot',
+        main_language    TYPE string VALUE 'main_language',
+        i18n_langs       TYPE string VALUE 'i18n_langs',
+        use_lxe          TYPE string VALUE 'use_lxe',
+        starting_folder  TYPE string VALUE 'starting_folder',
+        folder_logic     TYPE string VALUE 'folder_logic',
+        ignore           TYPE string VALUE 'ignore',
+        requirements     TYPE string VALUE 'requirements',
+        version_constant TYPE string VALUE 'version_constant',
+        version_value    TYPE string VALUE 'version_value',
+      END OF c_id.
+    CONSTANTS:
+      BEGIN OF c_event,
+        save TYPE string VALUE 'save',
+      END OF c_event .
+    CONSTANTS c_empty_rows TYPE i VALUE 2 ##NO_TEXT.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form .
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map .
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map .
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo .
+    DATA mv_requirements_count TYPE i .
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_form_schema
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception .
+    METHODS read_settings
+      RETURNING
+        VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS save_settings
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_REPO IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_validation_log.
+    CREATE OBJECT mo_form_data.
+    mo_repo = io_repo.
+    mo_form = get_form_schema( ).
+    mo_form_data = read_settings( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_repo.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        io_repo = io_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Repository Settings'
+      io_page_menu       = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
+                             iv_key = io_repo->get_key( )
+                             iv_act = zif_abapgit_definitions=>c_action-repo_settings )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = 'repo-settings-form'
+                iv_help_page = 'https://docs.abapgit.org/settings-dot-abapgit.html' ).
+ 
+    ro_form->start_group(
+      iv_name        = c_id-dot
+      iv_label       = 'Repository Settings (.abapgit.xml)'
+      iv_hint        = 'Settings stored in root folder in .abapgit.xml file'
+    )->text(
+      iv_name        = c_id-main_language
+      iv_label       = 'Main Language'
+      iv_hint        = 'Main language of repository (cannot be changed)'
+      iv_readonly    = abap_true
+    )->text(
+      iv_name        = c_id-i18n_langs
+      iv_label       = 'Serialize Translations for These Languages'
+      iv_hint        = 'Comma-separate 2-letter ISO language codes e.g. "DE,ES,..." - should not include main language'
+    )->checkbox(
+      iv_name        = c_id-use_lxe
+      iv_label       = 'Use experimental LXE approach for translations'
+      iv_hint        = 'It''s mandatory to specify the list of languages above in addition to this setting'
+    )->radio(
+      iv_name        = c_id-folder_logic
+      iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+      iv_label       = 'Folder Logic'
+      iv_hint        = 'Define how package folders are named in repository'
+    )->option(
+      iv_label       = 'Prefix'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
+    )->option(
+      iv_label       = 'Full'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-full
+    )->option(
+      iv_label       = 'Mixed'
+      iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-mixed
+    )->text(
+      iv_name        = c_id-starting_folder
+      iv_label       = 'Starting Folder'
+      iv_hint        = 'Root folder that defines where serialization starts'
+    )->textarea(
+      iv_name        = c_id-ignore
+      iv_label       = 'Ignore Files'
+      iv_hint        = 'List of files in starting folder that shall not be serialized'
+    )->table(
+      iv_name        = c_id-requirements
+      iv_label       = 'Requirements'
+      iv_hint        = 'List of software components with minimum release and patch'
+    )->column(
+      iv_label       = 'Software Component'
+      iv_width       = '40%'
+    )->column(
+      iv_label       = 'Minimum Release'
+      iv_width       = '30%'
+    )->column(
+      iv_label       = 'Minimum Patch'
+      iv_width       = '30%'
+    )->text(
+      iv_name        = c_id-version_constant
+      iv_label       = 'Version Constant'
+      iv_placeholder = 'ZVERSION_CLASS=>VERSION_CONSTANT'
+    )->text(
+      iv_name        = c_id-version_value
+      iv_label       = 'Version Value'
+      iv_readonly    = abap_true
+    )->command(
+      iv_label       = 'Save Settings'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-save
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD read_settings.
+ 
+    DATA:
+      lo_dot          TYPE REF TO zcl_abapgit_dot_abapgit,
+      ls_dot          TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit,
+      lv_main_lang    TYPE spras,
+      lv_language     TYPE t002t-sptxt,
+      lv_ignore       TYPE string,
+      ls_requirements LIKE LINE OF ls_dot-requirements,
+      lv_row          TYPE i,
+      lv_val          TYPE string.
+ 
+    " Get settings from DB
+    lo_dot = mo_repo->get_dot_abapgit( ).
+    ls_dot = lo_dot->get_data( ).
+    lv_main_lang = lo_dot->get_main_language( ).
+    CREATE OBJECT ro_form_data.
+ 
+    " Repository Settings
+    SELECT SINGLE sptxt INTO lv_language FROM t002t
+      WHERE spras = sy-langu AND sprsl = lv_main_lang.
+    IF sy-subrc <> 0.
+      lv_language = 'Unknown language; Check your .abapgit.xml file'.
+    ENDIF.
+ 
+    ro_form_data->set(
+      iv_key = c_id-main_language
+      iv_val = |{ lv_main_lang } ({ lv_language })| ).
+    ro_form_data->set(
+      iv_key = c_id-i18n_langs
+      iv_val = zcl_abapgit_lxe_texts=>convert_table_to_lang_string( lo_dot->get_i18n_languages( ) ) ).
+    ro_form_data->set(
+      iv_key = c_id-use_lxe
+      iv_val = boolc( lo_dot->use_lxe( ) = abap_true ) ) ##TYPE.
+    ro_form_data->set(
+      iv_key = c_id-folder_logic
+      iv_val = ls_dot-folder_logic ).
+    ro_form_data->set(
+      iv_key = c_id-starting_folder
+      iv_val = ls_dot-starting_folder ).
+    ro_form_data->set(
+      iv_key = c_id-version_constant
+      iv_val = ls_dot-version_constant ).
+    TRY.
+        ro_form_data->set(
+          iv_key = c_id-version_value
+          iv_val = zcl_abapgit_version=>get_version_constant_value( ls_dot-version_constant ) ).
+      CATCH zcx_abapgit_exception.
+        ro_form_data->set(
+          iv_key = c_id-version_value
+          iv_val = '' ).
+    ENDTRY.
+ 
+    lv_ignore = concat_lines_of(
+      table = ls_dot-ignore
+      sep   = cl_abap_char_utilities=>newline ).
+ 
+    ro_form_data->set(
+      iv_key = c_id-ignore
+      iv_val = lv_ignore ).
+ 
+    LOOP AT ls_dot-requirements INTO ls_requirements.
+      lv_row = lv_row + 1.
+      DO 3 TIMES.
+        CASE sy-index.
+          WHEN 1.
+            lv_val = ls_requirements-component.
+          WHEN 2.
+            lv_val = ls_requirements-min_release.
+          WHEN 3.
+            lv_val = ls_requirements-min_patch.
+        ENDCASE.
+        ro_form_data->set(
+          iv_key = |{ c_id-requirements }-{ lv_row }-{ sy-index }|
+          iv_val = lv_val ).
+      ENDDO.
+    ENDLOOP.
+ 
+    DO c_empty_rows TIMES.
+      lv_row = lv_row + 1.
+      DO 3 TIMES.
+        ro_form_data->set(
+          iv_key = |{ c_id-requirements }-{ lv_row }-{ sy-index }|
+          iv_val = '' ).
+      ENDDO.
+    ENDDO.
+ 
+    mv_requirements_count = lv_row.
+ 
+    ro_form_data->set(
+      iv_key = |{ c_id-requirements }-{ zif_abapgit_html_form=>c_rows }|
+      iv_val = |{ mv_requirements_count }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_settings.
+
+    DATA:
+      lo_dot          TYPE REF TO zcl_abapgit_dot_abapgit,
+      lv_ignore       TYPE string,
+      lt_ignore       TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
+      ls_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt.
+
+    lo_dot = mo_repo->get_dot_abapgit( ).
+
+    lo_dot->set_folder_logic( mo_form_data->get( c_id-folder_logic ) ).
+    lo_dot->set_starting_folder( mo_form_data->get( c_id-starting_folder ) ).
+    lo_dot->set_version_constant( mo_form_data->get( c_id-version_constant ) ).
+
+    lo_dot->set_i18n_languages(
+      zcl_abapgit_lxe_texts=>convert_lang_string_to_table(
+        iv_langs              = mo_form_data->get( c_id-i18n_langs )
+        iv_skip_main_language = lo_dot->get_main_language( ) ) ).
+    lo_dot->use_lxe( boolc( mo_form_data->get( c_id-use_lxe ) = abap_true ) ).
+
+    " Remove all ignores
+    lt_ignore = lo_dot->get_data( )-ignore.
+    LOOP AT lt_ignore INTO lv_ignore.
+      lo_dot->remove_ignore( iv_path = ''
+                             iv_filename = lv_ignore ).
+    ENDLOOP.
+
+    " Add newly entered ignores
+    lt_ignore = zcl_abapgit_convert=>split_string( mo_form_data->get( c_id-ignore ) ).
+    LOOP AT lt_ignore INTO lv_ignore.
+      lv_ignore = condense( lv_ignore ).
+      IF lv_ignore IS NOT INITIAL.
+        lo_dot->add_ignore( iv_path = ''
+                            iv_filename = lv_ignore ).
+      ENDIF.
+    ENDLOOP.
+
+    " Requirements
+    DO mv_requirements_count TIMES.
+      ls_requirements-component   = to_upper( mo_form_data->get( |{ c_id-requirements }-{ sy-index }-1| ) ).
+      ls_requirements-min_release = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-2| ).
+      ls_requirements-min_patch   = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-3| ).
+      APPEND ls_requirements TO lt_requirements.
+    ENDDO.
+
+    SORT lt_requirements BY component min_release min_patch.
+    DELETE lt_requirements WHERE component IS INITIAL.
+    DELETE ADJACENT DUPLICATES FROM lt_requirements COMPARING ALL FIELDS.
+
+    lo_dot->set_requirements( lt_requirements ).
+
+    mo_repo->set_dot_abapgit( lo_dot ).
+    mo_repo->refresh( ).
+
+    COMMIT WORK AND WAIT.
+
+    MESSAGE 'Settings succesfully saved' TYPE 'S'.
+
+    mo_form_data = read_settings( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lt_lang_list        TYPE zif_abapgit_definitions=>ty_languages,
+      lv_folder           TYPE string,
+      lv_len              TYPE i,
+      lv_component        TYPE zif_abapgit_dot_abapgit=>ty_requirement-component,
+      lv_min_release      TYPE zif_abapgit_dot_abapgit=>ty_requirement-min_release,
+      lv_min_patch        TYPE zif_abapgit_dot_abapgit=>ty_requirement-min_patch,
+      lv_version_constant TYPE string,
+      lx_exception        TYPE REF TO zcx_abapgit_exception.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    lv_folder = io_form_data->get( c_id-starting_folder ).
+    lv_len = strlen( lv_folder ) - 1.
+    IF lv_len > 0 AND lv_folder(1) <> '/'.
+      ro_validation_log->set(
+        iv_key = c_id-starting_folder
+        iv_val = |The folder must begin with /| ).
+    ELSEIF lv_len > 0 AND lv_folder+lv_len(1) <> '/'.
+      ro_validation_log->set(
+        iv_key = c_id-starting_folder
+        iv_val = |The folder must end with /| ).
+    ELSEIF lv_folder CA '\'.
+      ro_validation_log->set(
+        iv_key = c_id-starting_folder
+        iv_val = |Use / instead of \\| ).
+    ENDIF.
+ 
+    DO mv_requirements_count TIMES.
+      lv_component   = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-1| ).
+      lv_min_release = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-2| ).
+      lv_min_patch   = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-3| ).
+ 
+      IF lv_component IS INITIAL AND ( lv_min_release IS NOT INITIAL OR lv_min_patch IS NOT INITIAL ).
+        ro_validation_log->set(
+          iv_key = c_id-requirements
+          iv_val = |If you enter a release or patch, you must also enter a software component| ).
+      ELSEIF lv_component IS NOT INITIAL AND lv_min_release IS INITIAL.
+        ro_validation_log->set(
+          iv_key = c_id-requirements
+          iv_val = |If you enter a software component, you must also enter a minumum release| ).
+      ENDIF.
+    ENDDO.
+ 
+    TRY.
+        lv_version_constant = io_form_data->get( c_id-version_constant ).
+        IF lv_version_constant IS NOT INITIAL.
+          zcl_abapgit_version=>get_version_constant_value( lv_version_constant ).
+        ENDIF.
+      CATCH zcx_abapgit_exception INTO lx_exception.
+        ro_validation_log->set(
+          iv_key = c_id-version_constant
+          iv_val = lx_exception->get_text( ) ).
+    ENDTRY.
+ 
+    lt_lang_list = zcl_abapgit_lxe_texts=>convert_lang_string_to_table(
+      iv_langs              = io_form_data->get( c_id-i18n_langs )
+      iv_skip_main_language = mo_repo->get_dot_abapgit( )->get_main_language( ) ).
+    IF io_form_data->get( c_id-use_lxe ) = abap_true AND lt_lang_list IS INITIAL.
+      ro_validation_log->set(
+        iv_key = c_id-i18n_langs
+        iv_val = 'LXE approach requires a non-empy list of languages' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit(
+          io_form_data            = mo_form_data
+          io_check_changes_versus = read_settings( ) ).
+ 
+      WHEN c_event-save.
+        " Validate all form entries
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+          save_settings( ).
+        ENDIF.
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( `<div class="repo">` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_true ) ).
+ 
+    ri_html->add( mo_form->render(
+      io_values         = mo_form_data
+      io_validation_log = mo_validation_log ) ).
+ 
+    ri_html->add( `</div>` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap.html new file mode 100644 index 00000000000..eb883a33e89 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap.html @@ -0,0 +1,2752 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_stage.clas.abap

+
+ +
+ 94.93% + Statements + 844/889 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 94.93% + Lines + 844/889 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +8901x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_stage DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC INHERITING FROM zcl_abapgit_gui_page.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_hotkeys.
+ 
+    CONSTANTS: BEGIN OF c_action,
+                 stage_refresh TYPE string VALUE 'stage_refresh',
+                 stage_all     TYPE string VALUE 'stage_all',
+                 stage_commit  TYPE string VALUE 'stage_commit',
+                 stage_filter  TYPE string VALUE 'stage_filter',
+               END OF c_action.
+ 
+    METHODS constructor
+      IMPORTING
+        io_repo       TYPE REF TO zcl_abapgit_repo_online
+        iv_seed       TYPE string OPTIONAL
+        iv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result DEFAULT zif_abapgit_definitions=>c_sci_result-no_run
+        ii_obj_filter TYPE REF TO zif_abapgit_object_filter OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS zif_abapgit_gui_event_handler~on_event REDEFINITION.
+ 
+  PROTECTED SECTION.
+    METHODS:
+      render_content REDEFINITION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_changed_by,
+        item     TYPE zif_abapgit_definitions=>ty_item,
+        filename TYPE string,
+        name     TYPE syuname,
+      END OF ty_changed_by .
+    TYPES:
+      ty_changed_by_tt TYPE SORTED TABLE OF ty_changed_by WITH UNIQUE KEY item filename.
+ 
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online .
+    DATA ms_files TYPE zif_abapgit_definitions=>ty_stage_files .
+    DATA mv_seed TYPE string .               " Unique page id to bind JS sessionStorage
+    DATA mv_filter_value TYPE string .
+    DATA mv_sci_result TYPE zif_abapgit_definitions=>ty_sci_result.
+    DATA mi_obj_filter TYPE REF TO zif_abapgit_object_filter.
+ 
+    METHODS check_selected
+      IMPORTING
+        !io_files TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS find_changed_by
+      IMPORTING
+        !it_files            TYPE zif_abapgit_definitions=>ty_stage_files
+        !it_transports       TYPE zif_abapgit_cts_api=>ty_transport_list
+      RETURNING
+        VALUE(rt_changed_by) TYPE ty_changed_by_tt .
+    METHODS find_transports
+      IMPORTING
+        !it_files            TYPE zif_abapgit_definitions=>ty_stage_files
+      RETURNING
+        VALUE(rt_transports) TYPE zif_abapgit_cts_api=>ty_transport_list .
+    METHODS render_list
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_file
+      IMPORTING
+        !iv_context    TYPE string
+        !is_file       TYPE zif_abapgit_git_definitions=>ty_file
+        !is_item       TYPE zif_abapgit_definitions=>ty_item OPTIONAL
+        !is_status     TYPE zif_abapgit_definitions=>ty_result
+        !iv_changed_by TYPE syuname OPTIONAL
+        !iv_transport  TYPE trkorr OPTIONAL
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_actions
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS stage_selected
+      IMPORTING
+        !ii_event       TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(ro_stage) TYPE REF TO zcl_abapgit_stage
+      RAISING
+        zcx_abapgit_exception .
+    METHODS stage_all
+      RETURNING
+        VALUE(ro_stage) TYPE REF TO zcl_abapgit_stage
+      RAISING
+        zcx_abapgit_exception .
+    METHODS build_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
+    METHODS get_page_patch
+      IMPORTING
+        !io_stage      TYPE REF TO zcl_abapgit_stage
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS render_main_language_warning
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS count_default_files_to_commit
+      RETURNING
+        VALUE(rv_count) TYPE i .
+    METHODS render_deferred_hidden_events
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html .
+    METHODS render_scripts
+      RETURNING
+        VALUE(ri_html) TYPE REF TO zif_abapgit_html
+      RAISING
+        zcx_abapgit_exception .
+    METHODS init_files
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_stage IMPLEMENTATION.
+ 
+ 
+  METHOD build_menu.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-main'.
+ 
+    IF lines( ms_files-local ) > 0
+    OR lines( ms_files-remote ) > 0.
+      ro_menu->add(
+        iv_txt = 'Refresh'
+        iv_act = |{ c_action-stage_refresh }|
+        iv_opt = zif_abapgit_html=>c_html_opt-strong
+      )->add(
+        iv_txt = |Diff|
+        iv_act = |{ zif_abapgit_definitions=>c_action-go_repo_diff }?key={ mo_repo->get_key( ) }|
+      )->add(
+        iv_txt = |Patch|
+        iv_typ = zif_abapgit_html=>c_action_type-onclick
+        iv_id  = |patchBtn| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_selected.
+
+    DATA:
+      ls_file    TYPE zif_abapgit_git_definitions=>ty_file,
+      lv_pattern TYPE string,
+      lv_msg     TYPE string.
+
+    FIELD-SYMBOLS:
+      <ls_item>     LIKE LINE OF io_files->mt_entries,
+      <ls_item_chk> LIKE LINE OF io_files->mt_entries.
+
+    " Check all added files if the exist in different paths (packages) without being removed
+    LOOP AT io_files->mt_entries ASSIGNING <ls_item> WHERE v = zif_abapgit_definitions=>c_method-add.
+
+      zcl_abapgit_path=>split_file_location(
+        EXPORTING
+          iv_fullpath = to_lower( <ls_item>-k )
+        IMPORTING
+          ev_path     = ls_file-path
+          ev_filename = ls_file-filename ).
+
+      " Skip packages since they all have identical filenames
+      IF ls_file-filename <> 'package.devc.xml'.
+        lv_pattern = '*/' && to_upper( ls_file-filename ).
+        REPLACE ALL OCCURRENCES OF '#' IN lv_pattern WITH '##'. " for CP
+
+        LOOP AT io_files->mt_entries ASSIGNING <ls_item_chk>
+          WHERE k CP lv_pattern AND k <> <ls_item>-k AND v <> zif_abapgit_definitions=>c_method-rm.
+
+          lv_msg = |In order to add { to_lower( <ls_item>-k ) }, | &&
+                   |you have to remove { to_lower( <ls_item_chk>-k ) }|.
+          zcx_abapgit_exception=>raise( lv_msg ).
+
+        ENDLOOP.
+      ENDIF.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA lv_ts TYPE timestamp.
+ 
+    super->constructor( ).
+ 
+    ms_control-page_title = 'Stage'.
+    mo_repo               = io_repo.
+    mv_seed               = iv_seed.
+    mv_sci_result         = iv_sci_result.
+    mi_obj_filter         = ii_obj_filter.
+ 
+    IF mv_seed IS INITIAL. " Generate based on time unless obtained from diff page
+      GET TIME STAMP FIELD lv_ts.
+      mv_seed = |stage{ lv_ts }|.
+    ENDIF.
+ 
+    init_files( ).
+    ms_control-page_menu = build_menu( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD count_default_files_to_commit.
+ 
+    FIELD-SYMBOLS <ls_status> LIKE LINE OF ms_files-status.
+    FIELD-SYMBOLS <ls_remote> LIKE LINE OF ms_files-remote.
+ 
+    rv_count = lines( ms_files-local ).
+ 
+    LOOP AT ms_files-remote ASSIGNING <ls_remote>.
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_remote>-path
+          filename = <ls_remote>-filename.
+      ASSERT sy-subrc = 0.
+ 
+      IF <ls_status>-lstate = zif_abapgit_definitions=>c_state-deleted
+        AND <ls_status>-rstate = zif_abapgit_definitions=>c_state-unchanged.
+        rv_count = rv_count + 1.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_changed_by.
+ 
+    DATA: ls_local             LIKE LINE OF it_files-local,
+          ls_remote            LIKE LINE OF it_files-remote,
+          ls_changed_by        LIKE LINE OF rt_changed_by,
+          lt_changed_by_remote LIKE rt_changed_by,
+          ls_item              TYPE zif_abapgit_definitions=>ty_item,
+          lv_transport         LIKE LINE OF it_transports,
+          lv_user              TYPE uname.
+ 
+    FIELD-SYMBOLS <ls_changed_by> LIKE LINE OF lt_changed_by_remote.
+ 
+    LOOP AT it_files-local INTO ls_local WHERE NOT item IS INITIAL.
+      ls_changed_by-item = ls_local-item.
+      ls_changed_by-filename = ls_local-file-filename.
+      ls_changed_by-name = zcl_abapgit_objects=>changed_by(
+        is_item     = ls_local-item
+        iv_filename = ls_local-file-filename ).
+      INSERT ls_changed_by INTO TABLE rt_changed_by.
+    ENDLOOP.
+ 
+    LOOP AT it_files-remote INTO ls_remote WHERE filename IS NOT INITIAL.
+      TRY.
+          zcl_abapgit_filename_logic=>file_to_object(
+            EXPORTING
+              iv_filename = ls_remote-filename
+              iv_path     = ls_remote-path
+              io_dot      = mo_repo->get_dot_abapgit( )
+            IMPORTING
+              es_item     = ls_item ).
+          ls_changed_by-item = ls_item.
+          INSERT ls_changed_by INTO TABLE lt_changed_by_remote.
+        CATCH zcx_abapgit_exception.
+      ENDTRY.
+    ENDLOOP.
+ 
+    LOOP AT lt_changed_by_remote ASSIGNING <ls_changed_by>.
+      " deleted files might still be in a transport
+      CLEAR lv_transport.
+      READ TABLE it_transports WITH KEY
+        obj_type = <ls_changed_by>-item-obj_type
+        obj_name = <ls_changed_by>-item-obj_name
+        INTO lv_transport.
+      IF sy-subrc = 0.
+        lv_user = zcl_abapgit_factory=>get_cts_api( )->read_user( lv_transport-trkorr ).
+        IF lv_user IS NOT INITIAL.
+          <ls_changed_by>-name = lv_user.
+        ENDIF.
+      ENDIF.
+      IF <ls_changed_by>-name IS INITIAL.
+        <ls_changed_by>-name = zcl_abapgit_objects_super=>c_user_unknown.
+      ENDIF.
+    ENDLOOP.
+ 
+    INSERT LINES OF lt_changed_by_remote INTO TABLE rt_changed_by.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD find_transports.
+ 
+    DATA li_cts_api TYPE REF TO zif_abapgit_cts_api.
+    DATA lt_items TYPE zif_abapgit_definitions=>ty_items_tt.
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_item.
+    DATA lo_dot TYPE REF TO zcl_abapgit_dot_abapgit.
+    FIELD-SYMBOLS <ls_local> LIKE LINE OF it_files-local.
+    FIELD-SYMBOLS <ls_remote> LIKE LINE OF it_files-remote.
+ 
+ 
+    li_cts_api = zcl_abapgit_factory=>get_cts_api( ).
+ 
+    TRY.
+        LOOP AT it_files-local ASSIGNING <ls_local> WHERE item IS NOT INITIAL.
+          IF li_cts_api->is_chrec_possible_for_package( <ls_local>-item-devclass ) = abap_false.
+            RETURN. " Assume all other objects are also in packages without change recording
+          ENDIF.
+          APPEND <ls_local>-item TO lt_items.
+        ENDLOOP.
+ 
+        lo_dot = mo_repo->get_dot_abapgit( ).
+        LOOP AT it_files-remote ASSIGNING <ls_remote> WHERE filename IS NOT INITIAL.
+          zcl_abapgit_filename_logic=>file_to_object(
+            EXPORTING
+              iv_filename = <ls_remote>-filename
+              iv_path     = <ls_remote>-path
+              io_dot      = lo_dot
+            IMPORTING
+              es_item     = ls_item ).
+          IF ls_item IS INITIAL.
+            CONTINUE.
+          ENDIF.
+          APPEND ls_item TO lt_items.
+        ENDLOOP.
+ 
+        SORT lt_items BY obj_type obj_name.
+        DELETE ADJACENT DUPLICATES FROM lt_items COMPARING obj_type obj_name.
+ 
+        rt_transports = li_cts_api->get_transports_for_list( lt_items ).
+ 
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_page_patch.
+ 
+    DATA: lo_page  TYPE REF TO zcl_abapgit_gui_page_patch,
+          lv_key   TYPE zif_abapgit_persistence=>ty_repo-key,
+          lt_files TYPE zif_abapgit_definitions=>ty_stage_tt.
+ 
+    lv_key = mo_repo->get_key( ).
+    lt_files = io_stage->get_all( ).
+ 
+    DELETE lt_files WHERE method <> zif_abapgit_definitions=>c_method-add
+                    AND   method <> zif_abapgit_definitions=>c_method-rm.
+ 
+    CREATE OBJECT lo_page
+      EXPORTING
+        iv_key   = lv_key
+        it_files = lt_files.
+ 
+    ri_page = lo_page.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD init_files.
+    ms_files = zcl_abapgit_factory=>get_stage_logic( )->get( io_repo       = mo_repo
+                                                             ii_obj_filter = mi_obj_filter ).
+
+    IF lines( ms_files-local ) = 0 AND lines( ms_files-remote ) = 0.
+      mo_repo->refresh( ).
+      zcx_abapgit_exception=>raise( 'There are no changes that could be staged' ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD render_actions.
+ 
+    DATA: lv_local_count TYPE i,
+          lv_add_all_txt TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+    lv_local_count = count_default_files_to_commit( ).
+    IF lv_local_count > 0.
+      lv_add_all_txt = |Add All and Commit ({ lv_local_count })|.
+      " Otherwise empty, but the element (id) is preserved for JS
+    ENDIF.
+ 
+    ri_html->add( '<table class="w100 margin-v5"><tr>' ).
+ 
+    " Action buttons
+    ri_html->add( '<td class="indent5em">' ).
+    ri_html->add_a( iv_act   = 'errorStub(event)' " Will be reinit by JS
+                    iv_typ   = zif_abapgit_html=>c_action_type-onclick
+                    iv_id    = 'commitSelectedButton'
+                    iv_style = 'display: none'
+                    iv_txt   = 'Commit Selected (<span class="counter"></span>)'
+                    iv_opt   = zif_abapgit_html=>c_html_opt-strong ).
+    ri_html->add_a( iv_act   = 'errorStub(event)' " Will be reinit by JS
+                    iv_typ   = zif_abapgit_html=>c_action_type-onclick
+                    iv_id    = 'commitFilteredButton'
+                    iv_style = 'display: none'
+                    iv_txt   = 'Add <b>Filtered</b> and Commit (<span class="counter"></span>)' ).
+    ri_html->add_a( iv_act = |{ c_action-stage_all }|
+                    iv_id  = 'commitAllButton'
+                    iv_txt = lv_add_all_txt ).
+ 
+ 
+    ri_html->add( '</td>' ).
+ 
+    " Filter bar
+    ri_html->add( '<td class="right">' ).
+    ri_html->add( '<input class="stage-filter" id="objectSearch"' &&
+                  ' type="search" placeholder="Filter Objects"' &&
+                  | value="{ mv_filter_value }">| ).
+    zcl_abapgit_gui_chunk_lib=>render_sci_result(
+      ii_html       = ri_html
+      iv_sci_result = mv_sci_result ).
+    ri_html->add( '</td>' ).
+ 
+    ri_html->add( '</tr>' ).
+    ri_html->add( '</table>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="repo">' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+      io_repo = mo_repo
+      iv_interactive_branch = abap_true ) ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_js_error_banner( ) ).
+    ri_html->add( render_main_language_warning( ) ).
+ 
+    ri_html->add( '<div class="stage-container">' ).
+    ri_html->add( render_actions( ) ).
+    ri_html->add( render_list( ) ).
+    ri_html->add( '</div>' ).
+ 
+    ri_html->add( '</div>' ).
+ 
+    register_handlers( ).
+    gui_services( )->get_html_parts( )->add_part(
+      iv_collection = zcl_abapgit_gui_component=>c_html_parts-hidden_forms
+      ii_part       = render_deferred_hidden_events( ) ).
+    register_deferred_script( render_scripts( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_deferred_hidden_events.
+ 
+    DATA ls_event TYPE zcl_abapgit_gui_chunk_lib=>ty_event_signature.
+ 
+    ls_event-method = 'post'.
+    ls_event-name   = 'stage_commit'.
+    ri_html = zcl_abapgit_gui_chunk_lib=>render_event_as_form( ls_event ).
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_file.
+ 
+    DATA: lv_param    TYPE string,
+          lv_filename TYPE string.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_filename = is_file-path && is_file-filename.
+    " make sure whitespace is preserved in the DOM
+    REPLACE ALL OCCURRENCES OF ` ` IN lv_filename WITH '&nbsp;'.
+ 
+    ri_html->add( |<tr class="{ iv_context }">| ).
+    ri_html->add( '<td>' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_item_state(
+      iv_lstate = is_status-lstate
+      iv_rstate = is_status-rstate ) ).
+    ri_html->add( '</td>' ).
+ 
+    CASE iv_context.
+      WHEN 'local'.
+        lv_param = zcl_abapgit_html_action_utils=>file_encode(
+          iv_key  = mo_repo->get_key( )
+          ig_file = is_file ).
+ 
+        lv_filename = ri_html->a(
+          iv_txt = lv_filename
+          iv_act = |{ zif_abapgit_definitions=>c_action-go_file_diff }?{ lv_param }| ).
+ 
+        ri_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
+        ri_html->add( |<td class="name">{ lv_filename }</td>| ).
+      WHEN 'remote'.
+        ri_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
+        ri_html->add( |<td class="name">{ lv_filename }</td>| ).
+    ENDCASE.
+ 
+    ri_html->add( '<td class="user">' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( iv_changed_by  ) ).
+    ri_html->add( '</td>' ).
+ 
+    ri_html->add( '<td class="transport">' ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_transport( iv_transport ) ).
+    ri_html->add( '</td>' ).
+ 
+    ri_html->add( '<td class="status">?</td>' ).
+    ri_html->add( '<td class="cmd"></td>' ). " Command added in JS
+ 
+    ri_html->add( '</tr>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_list.
+ 
+    DATA: lt_changed_by  TYPE ty_changed_by_tt,
+          ls_changed_by  LIKE LINE OF lt_changed_by,
+          lt_transports  TYPE zif_abapgit_cts_api=>ty_transport_list,
+          ls_transport   LIKE LINE OF lt_transports,
+          ls_item_remote TYPE zif_abapgit_definitions=>ty_item.
+ 
+    FIELD-SYMBOLS: <ls_remote> LIKE LINE OF ms_files-remote,
+                   <ls_status> LIKE LINE OF ms_files-status,
+                   <ls_local>  LIKE LINE OF ms_files-local.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<table id="stageTab" class="stage_tab w100">' ).
+ 
+    lt_transports = find_transports( ms_files ).
+    lt_changed_by = find_changed_by(
+      it_files = ms_files
+      it_transports = lt_transports ).
+ 
+    " Local changes
+    LOOP AT ms_files-local ASSIGNING <ls_local>.
+      AT FIRST.
+        ri_html->add( '<thead><tr class="local">' ).
+        ri_html->add( '<th class="stage-status"></th>' ). " Diff state
+        ri_html->add( '<th class="stage-objtype">Type</th>' ).
+        ri_html->add( '<th title="Click filename to see diff">File</th>' ).
+        ri_html->add( '<th>Changed by</th>' ).
+        ri_html->add( '<th>Transport</th>' ).
+        ri_html->add( '<th></th>' ). " Status
+        ri_html->add( '<th class="cmd">' ).
+        ri_html->add( '<a>add</a>&#x2193; <a>reset</a>&#x2193;' ).
+        ri_html->add( '</th>' ).
+        ri_html->add( '</tr></thead>' ).
+        ri_html->add( '<tbody>' ).
+      ENDAT.
+ 
+      READ TABLE lt_changed_by INTO ls_changed_by WITH TABLE KEY
+        item     = <ls_local>-item
+        filename = <ls_local>-file-filename.
+      IF sy-subrc <> 0.
+        READ TABLE lt_changed_by INTO ls_changed_by WITH KEY item = <ls_local>-item.
+      ENDIF.
+ 
+      READ TABLE lt_transports INTO ls_transport WITH KEY
+        obj_type = <ls_local>-item-obj_type
+        obj_name = <ls_local>-item-obj_name.              "#EC CI_SUBRC
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_local>-file-path
+          filename = <ls_local>-file-filename.
+      ASSERT sy-subrc = 0.
+ 
+      ri_html->add( render_file(
+        iv_context    = 'local'
+        is_file       = <ls_local>-file
+        is_item       = <ls_local>-item
+        is_status     = <ls_status>
+        iv_changed_by = ls_changed_by-name
+        iv_transport  = ls_transport-trkorr ) ).
+ 
+      CLEAR ls_transport.
+ 
+      AT LAST.
+        ri_html->add( '</tbody>' ).
+      ENDAT.
+    ENDLOOP.
+ 
+    " Remote changes
+    LOOP AT ms_files-remote ASSIGNING <ls_remote>.
+      AT FIRST.
+        ri_html->add( '<thead><tr class="remote">' ).
+        ri_html->add( '<th></th>' ). " Diff state
+        ri_html->add( '<th></th>' ). " Type
+        ri_html->add( '<th colspan="3">Files to remove or non-code</th>' ).
+        ri_html->add( '<th></th>' ). " Transport
+        ri_html->add( '<th class="cmd">' ).
+        ri_html->add( '<a>ignore</a>&#x2193; <a>remove</a>&#x2193; <a>reset</a>&#x2193;' ).
+        ri_html->add( '</th>' ).
+        ri_html->add( '</tr></thead>' ).
+        ri_html->add( '<tbody>' ).
+      ENDAT.
+ 
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_remote>-path
+          filename = <ls_remote>-filename.
+      ASSERT sy-subrc = 0.
+ 
+      TRY.
+          zcl_abapgit_filename_logic=>file_to_object(
+            EXPORTING
+              iv_filename = <ls_remote>-filename
+              iv_path     = <ls_remote>-path
+              io_dot      = mo_repo->get_dot_abapgit( )
+            IMPORTING
+              es_item     = ls_item_remote ).
+          READ TABLE lt_transports INTO ls_transport WITH KEY
+            obj_type = ls_item_remote-obj_type
+            obj_name = ls_item_remote-obj_name.
+ 
+          READ TABLE lt_changed_by INTO ls_changed_by WITH TABLE KEY
+            item     = ls_item_remote
+            filename = <ls_remote>-filename.
+          IF sy-subrc <> 0.
+            READ TABLE lt_changed_by INTO ls_changed_by WITH KEY item = ls_item_remote.
+          ENDIF.
+        CATCH zcx_abapgit_exception.
+          CLEAR ls_transport.
+      ENDTRY.
+ 
+      ri_html->add( render_file(
+        iv_context    = 'remote'
+        is_status     = <ls_status>
+        is_file       = <ls_remote>
+        is_item       = ls_item_remote
+        iv_changed_by = ls_changed_by-name
+        iv_transport  = ls_transport-trkorr ) ).
+ 
+      AT LAST.
+        ri_html->add( '</tbody>' ).
+      ENDAT.
+    ENDLOOP.
+ 
+    ri_html->add( '</table>' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_main_language_warning.
+ 
+    DATA lv_main_language TYPE spras.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    lv_main_language = mo_repo->get_dot_abapgit( )->get_main_language( ).
+ 
+    IF lv_main_language <> sy-langu.
+      ri_html->add( zcl_abapgit_gui_chunk_lib=>render_warning_banner(
+                        |Caution: Main language of the repo is '{ lv_main_language }', |
+                     && |but you're logged on in '{ sy-langu }'| ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD render_scripts.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ).
+ 
+    ri_html->add( 'var gStageParams = {' ).
+    ri_html->add( |  seed:            "{ mv_seed }",| ). " Unique page id
+    ri_html->add( |  user:            "{ to_lower( sy-uname ) }",| ).
+    ri_html->add( '  formAction:      "stage_commit",' ).
+    ri_html->add( |  patchAction:     "{ zif_abapgit_definitions=>c_action-go_patch }",| ).
+    ri_html->add( '  focusFilterKey:  "f",' ).
+ 
+    ri_html->add( '  ids: {' ).
+    ri_html->add( '    stageTab:          "stageTab",' ).
+    ri_html->add( '    commitAllBtn:      "commitAllButton",' ).
+    ri_html->add( '    commitSelectedBtn: "commitSelectedButton",' ).
+    ri_html->add( '    commitFilteredBtn: "commitFilteredButton",' ).
+    ri_html->add( '    patchBtn:          "patchBtn",' ).
+    ri_html->add( '    objectSearch:      "objectSearch",' ).
+    ri_html->add( '  }' ).
+ 
+    ri_html->add( '}' ).
+    ri_html->add( 'var gHelper = new StageHelper(gStageParams);' ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD stage_all.
+ 
+    FIELD-SYMBOLS <ls_local> LIKE LINE OF ms_files-local.
+    FIELD-SYMBOLS <ls_remote> LIKE LINE OF ms_files-remote.
+    FIELD-SYMBOLS <ls_status> LIKE LINE OF ms_files-status.
+ 
+    CREATE OBJECT ro_stage.
+ 
+    LOOP AT ms_files-local ASSIGNING <ls_local>.
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_local>-file-path
+          filename = <ls_local>-file-filename.
+      ASSERT sy-subrc = 0.
+ 
+      ro_stage->add(
+        iv_path     = <ls_local>-file-path
+        iv_filename = <ls_local>-file-filename
+        is_status   = <ls_status>
+        iv_data     = <ls_local>-file-data ).
+    ENDLOOP.
+ 
+    LOOP AT ms_files-remote ASSIGNING <ls_remote>.
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = <ls_remote>-path
+          filename = <ls_remote>-filename.
+      ASSERT sy-subrc = 0.
+ 
+      IF <ls_status>-lstate = zif_abapgit_definitions=>c_state-deleted
+        AND <ls_status>-rstate = zif_abapgit_definitions=>c_state-unchanged.
+ 
+        ro_stage->rm(
+          iv_path     = <ls_remote>-path
+          iv_filename = <ls_remote>-filename
+          is_status   = <ls_status> ).
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD stage_selected.
+ 
+    DATA ls_file  TYPE zif_abapgit_git_definitions=>ty_file.
+    DATA lo_files TYPE REF TO zcl_abapgit_string_map.
+ 
+    FIELD-SYMBOLS:
+      <ls_file>   LIKE LINE OF ms_files-local,
+      <ls_status> LIKE LINE OF ms_files-status,
+      <ls_item>   LIKE LINE OF lo_files->mt_entries.
+ 
+    lo_files = ii_event->form_data( ).
+ 
+    IF lo_files->size( ) = 0.
+      zcx_abapgit_exception=>raise( 'process_stage_list: empty list' ).
+    ENDIF.
+ 
+    check_selected( lo_files ).
+ 
+    CREATE OBJECT ro_stage.
+ 
+    LOOP AT lo_files->mt_entries ASSIGNING <ls_item>
+      "Ignore Files that we don't want to stage, so any errors don't stop the staging process
+      WHERE v <> zif_abapgit_definitions=>c_method-skip.
+ 
+      zcl_abapgit_path=>split_file_location(
+        EXPORTING
+          iv_fullpath = to_lower( <ls_item>-k ) " filename is lower cased
+        IMPORTING
+          ev_path     = ls_file-path
+          ev_filename = ls_file-filename ).
+ 
+      READ TABLE ms_files-status ASSIGNING <ls_status>
+        WITH TABLE KEY
+          path     = ls_file-path
+          filename = ls_file-filename.
+      IF sy-subrc <> 0.
+* see https://github.com/abapGit/abapGit/issues/3073
+        zcx_abapgit_exception=>raise( iv_text =
+          |Unable to stage { ls_file-filename }. If the filename contains spaces, this is a known issue.| &&
+          | Consider ignoring or staging the file at a later time.| ).
+      ENDIF.
+ 
+      CASE <ls_item>-v.
+        WHEN zif_abapgit_definitions=>c_method-add.
+          READ TABLE ms_files-local ASSIGNING <ls_file>
+            WITH KEY file-path     = ls_file-path
+                     file-filename = ls_file-filename.
+ 
+          IF sy-subrc <> 0.
+            zcx_abapgit_exception=>raise( |process_stage_list: unknown file { ls_file-path }{ ls_file-filename }| ).
+          ENDIF.
+ 
+          ro_stage->add( iv_path     = <ls_file>-file-path
+                         iv_filename = <ls_file>-file-filename
+                         is_status   = <ls_status>
+                         iv_data     = <ls_file>-file-data ).
+        WHEN zif_abapgit_definitions=>c_method-ignore.
+          ro_stage->ignore( iv_path     = ls_file-path
+                            iv_filename = ls_file-filename ).
+        WHEN zif_abapgit_definitions=>c_method-rm.
+          ro_stage->rm( iv_path     = ls_file-path
+                        is_status   = <ls_status>
+                        iv_filename = ls_file-filename ).
+        WHEN zif_abapgit_definitions=>c_method-skip.
+          " Do nothing
+        WHEN OTHERS.
+          zcx_abapgit_exception=>raise( |process_stage_list: unknown method { <ls_item>-v }| ).
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA: lo_stage  TYPE REF TO zcl_abapgit_stage.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_action-stage_all.
+ 
+        lo_stage = stage_all( ).
+ 
+        rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+          io_repo       = mo_repo
+          io_stage      = lo_stage
+          iv_sci_result = mv_sci_result ).
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_action-stage_commit.
+ 
+        lo_stage = stage_selected( ii_event ).
+ 
+        rs_handled-page = zcl_abapgit_gui_page_commit=>create(
+          io_repo       = mo_repo
+          io_stage      = lo_stage
+          iv_sci_result = mv_sci_result ).
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_action-stage_filter.
+ 
+        mv_filter_value = ii_event->form_data( )->get( 'filterValue' ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-go_patch.                         " Go Patch page
+ 
+        lo_stage = stage_selected( ii_event ).
+        rs_handled-page  = get_page_patch( lo_stage ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+ 
+      WHEN c_action-stage_refresh.
+        mo_repo->refresh( abap_true ).
+        init_files( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_switch.
+        zcl_abapgit_services_git=>switch_branch( |{ ii_event->query( )->get( 'KEY' ) }| ).
+        mo_repo->refresh( abap_true ).
+        init_files( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN OTHERS.
+        rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions.
+ 
+    DATA ls_hotkey_action LIKE LINE OF rt_hotkey_actions.
+ 
+    ls_hotkey_action-ui_component = 'Stage'.
+    ls_hotkey_action-description  = |Patch|.
+    ls_hotkey_action-action       = 'submitPatch'. " JS function in StageHelper
+    ls_hotkey_action-hotkey       = |p|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description  = |Diff|.
+    ls_hotkey_action-action       = zif_abapgit_definitions=>c_action-go_repo_diff.
+    ls_hotkey_action-hotkey       = |d|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    ls_hotkey_action-description  = |Refresh|.
+    ls_hotkey_action-action       = c_action-stage_refresh.
+    ls_hotkey_action-hotkey       = |r|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+    " registered/handled in js
+    ls_hotkey_action-description = |Focus filter|.
+    ls_hotkey_action-action = `#`.
+    ls_hotkey_action-hotkey = |f|.
+    INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_syntax.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_syntax.clas.abap.html new file mode 100644 index 00000000000..e869c3ebfce --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_syntax.clas.abap.html @@ -0,0 +1,460 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_syntax.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_syntax.clas.abap

+
+ +
+ 88% + Statements + 110/125 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 88% + Lines + 110/125 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +1261x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_syntax DEFINITION PUBLIC FINAL CREATE PUBLIC
+    INHERITING FROM zcl_abapgit_gui_page_codi_base.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          io_repo TYPE REF TO zcl_abapgit_repo
+        RAISING
+          zcx_abapgit_exception,
+ 
+      zif_abapgit_gui_event_handler~on_event
+        REDEFINITION,
+ 
+      zif_abapgit_gui_renderable~render
+        REDEFINITION.
+ 
+  PROTECTED SECTION.
+    CONSTANTS: c_variant TYPE c LENGTH 30 VALUE 'SYNTAX_CHECK'.
+ 
+    METHODS:
+      render_content REDEFINITION.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      build_menu
+        RETURNING
+          VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar
+        RAISING
+          zcx_abapgit_exception,
+ 
+      run_syntax_check
+        RAISING
+          zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_syntax IMPLEMENTATION.
+ 
+ 
+  METHOD build_menu.
+ 
+    ro_menu = build_base_menu( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    super->constructor( ).
+    ms_control-page_title = 'Syntax Check'.
+    mo_repo = io_repo.
+    run_syntax_check( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD render_content.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( `<div class="repo">` ).
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( io_repo        = mo_repo
+                                                              iv_show_commit = abap_false ) ).
+    ri_html->add( `</div>` ).
+ 
+    ri_html->add( '<div class="toc">' ).
+ 
+    ri_html->add( render_variant(
+      iv_variant = c_variant
+      iv_summary = mv_summary ) ).
+ 
+    IF lines( mt_result ) = 0.
+      ri_html->add( '<div class="dummydiv success">' ).
+      ri_html->add( ri_html->icon( 'check' ) ).
+      ri_html->add( 'No syntax errors' ).
+      ri_html->add( '</div>' ).
+    ELSE.
+      render_result( ii_html   = ri_html
+                     it_result = mt_result ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD run_syntax_check.
+
+    DATA: li_syntax_check TYPE REF TO zif_abapgit_code_inspector.
+
+    li_syntax_check = zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( ) ).
+
+    TRY.
+        mt_result = li_syntax_check->run( c_variant ).
+      CATCH zcx_abapgit_exception.
+        " Variant SYNTAX_CHECK does not exist in 702
+        mt_result = li_syntax_check->run( 'VERI_' && c_variant ).
+    ENDTRY.
+
+    mv_summary = li_syntax_check->get_summary( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    CASE ii_event->mv_action.
+      WHEN c_actions-rerun.
+ 
+        run_syntax_check( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+ 
+      WHEN OTHERS.
+        rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    ms_control-page_menu = build_menu( ).
+    ri_html = super->zif_abapgit_gui_renderable~render( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap.html new file mode 100644 index 00000000000..830416bc649 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap.html @@ -0,0 +1,1309 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_tags.clas.abap

+
+ +
+ 95.58% + Statements + 390/408 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 95.58% + Lines + 390/408 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +4091x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_tags DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_gui_component
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !ii_repo       TYPE REF TO zif_abapgit_repo
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS constructor
+      IMPORTING
+        !ii_repo TYPE REF TO zif_abapgit_repo
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS:
+      BEGIN OF c_id,
+        tag_group    TYPE string VALUE 'tag_group',
+        tag_type     TYPE string VALUE 'tag_type',
+        tags         TYPE string VALUE 'tags',
+        type         TYPE string VALUE 'type',
+        name         TYPE string VALUE 'name',
+        sha1         TYPE string VALUE 'sha1',
+        anno_group   TYPE string VALUE 'anno_group',
+        tagger       TYPE string VALUE 'tagger',
+        tagger_name  TYPE string VALUE 'tagger_name',
+        tagger_email TYPE string VALUE 'tagger_email',
+        message      TYPE string VALUE 'message',
+        body         TYPE string VALUE 'body',
+      END OF c_id.
+ 
+    CONSTANTS:
+      BEGIN OF c_event,
+        create        TYPE string VALUE 'create',
+        choose_commit TYPE string VALUE 'choose_commit',
+        change_type   TYPE string VALUE 'change_type',
+      END OF c_event.
+ 
+    DATA mo_form TYPE REF TO zcl_abapgit_html_form.
+    DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
+    DATA mo_repo TYPE REF TO zcl_abapgit_repo_online.
+    DATA mo_settings TYPE REF TO zcl_abapgit_settings.
+    DATA ms_tag TYPE zif_abapgit_git_definitions=>ty_git_tag.
+ 
+    METHODS get_form_schema
+      IMPORTING
+        io_form_data   TYPE REF TO zcl_abapgit_string_map OPTIONAL
+      RETURNING
+        VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS initialize_form_data
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_tagger_name
+      RETURNING
+        VALUE(rv_user) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_tagger_email
+      RETURNING
+        VALUE(rv_email) TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS validate_form
+      IMPORTING
+        !io_form_data            TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS choose_commit
+      RETURNING
+        VALUE(rv_commit) TYPE zif_abapgit_git_definitions=>ty_commit-sha1
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_page_tags IMPLEMENTATION.
+ 
+ 
+  METHOD choose_commit.
+ 
+    DATA li_popups TYPE REF TO zif_abapgit_popups.
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+ 
+    rv_commit = li_popups->commit_list_popup(
+      iv_repo_url    = mo_repo->get_url( )
+      iv_branch_name = mo_repo->get_selected_branch( ) )-sha1.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( ).
+    CREATE OBJECT mo_form_data.
+    CREATE OBJECT mo_validation_log.
+    mo_repo ?= ii_repo.
+ 
+    " Get settings from DB
+    mo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ).
+ 
+    mo_form = get_form_schema( ).
+ 
+    initialize_form_data( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_tags.
+ 
+    CREATE OBJECT lo_component
+      EXPORTING
+        ii_repo = ii_repo.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Create Tag'
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_form_schema.
+ 
+    DATA lv_commitmsg_comment_length TYPE i.
+ 
+    IF io_form_data IS BOUND AND io_form_data->is_empty( ) = abap_false.
+      ms_tag-type = io_form_data->get( c_id-tag_type ).
+    ENDIF.
+ 
+    lv_commitmsg_comment_length =  mo_settings->get_commitmsg_comment_length( ).
+ 
+    ro_form = zcl_abapgit_html_form=>create(
+                iv_form_id   = 'create-tag-form'
+                iv_help_page = 'https://docs.abapgit.org/' ). " todo, add docs
+ 
+    ro_form->start_group(
+      iv_name  = c_id-tag_group
+      iv_label = 'New Tag'
+    )->radio(
+      iv_label  = 'Type'
+      iv_name   = c_id-tag_type
+      iv_action = c_event-change_type
+    )->option(
+      iv_label = 'Lightweight'
+      iv_value = zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag
+    )->option(
+      iv_label = 'Annotated'
+      iv_value = zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag
+    )->text(
+      iv_name        = c_id-name
+      iv_label       = 'Tag Name'
+      iv_required    = abap_true
+    )->text(
+      iv_name        = c_id-sha1
+      iv_label       = 'Commit'
+      iv_min         = 40
+      iv_max         = 40
+      iv_condense    = abap_true
+      iv_required    = abap_true
+      iv_side_action = c_event-choose_commit ).
+ 
+    IF ms_tag-type = zif_abapgit_git_definitions=>c_git_branch_type-annotated_tag.
+      ro_form->start_group(
+        iv_name        = c_id-anno_group
+        iv_label       = 'Annotation'
+      )->text(
+        iv_name        = c_id-message
+        iv_label       = 'Comment'
+        iv_max         = lv_commitmsg_comment_length
+        iv_placeholder = |Add a mandatory comment with max { lv_commitmsg_comment_length } characters|
+      )->textarea(
+        iv_name        = c_id-body
+        iv_label       = 'Body'
+        iv_rows        = 6
+        iv_cols        = mo_settings->get_commitmsg_body_size( )
+        iv_placeholder = 'Add an optional description...'
+      )->text(
+        iv_name        = c_id-tagger_name
+        iv_label       = 'Tagger Name'
+      )->text(
+        iv_name        = c_id-tagger_email
+        iv_label       = 'Tagger Email' ).
+    ELSE.
+      ro_form->hidden( c_id-message
+      )->hidden( c_id-body
+      )->hidden( c_id-tagger_name
+      )->hidden( c_id-tagger_email ).
+    ENDIF.
+ 
+    ro_form->command(
+      iv_label       = 'Create'
+      iv_cmd_type    = zif_abapgit_html_form=>c_cmd_type-input_main
+      iv_action      = c_event-create
+    )->command(
+      iv_label       = 'Back'
+      iv_action      = zif_abapgit_definitions=>c_action-go_back ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_tagger_email.
+ 
+    DATA li_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    rv_email = li_user->get_repo_git_user_email( mo_repo->get_url( ) ).
+    IF rv_email IS INITIAL.
+      rv_email = li_user->get_default_git_user_email( ).
+    ENDIF.
+    IF rv_email IS INITIAL.
+      " get default from user record
+      rv_email = zcl_abapgit_user_record=>get_instance( sy-uname )->get_email( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_tagger_name.
+ 
+    DATA li_user TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    rv_user  = li_user->get_repo_git_user_name( mo_repo->get_url( ) ).
+    IF rv_user IS INITIAL.
+      rv_user  = li_user->get_default_git_user_name( ).
+    ENDIF.
+    IF rv_user IS INITIAL.
+      " get default from user record
+      rv_user = zcl_abapgit_user_record=>get_instance( sy-uname )->get_name( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD initialize_form_data.
+
+    ms_tag-type = zif_abapgit_git_definitions=>c_git_branch_type-lightweight_tag.
+
+    mo_form_data->set(
+      iv_key = c_id-tag_type
+      iv_val = ms_tag-type ).
+
+    ms_tag-tagger_name  = get_tagger_name( ).
+    ms_tag-tagger_email = get_tagger_email( ).
+
+    mo_form_data->set(
+      iv_key = c_id-tagger_name
+      iv_val = ms_tag-tagger_name ).
+    mo_form_data->set(
+      iv_key = c_id-tagger_email
+      iv_val = ms_tag-tagger_email ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_form.
+ 
+    DATA:
+      lt_tags         TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+      lv_new_tag_name TYPE string.
+ 
+    ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ).
+ 
+    IF zcl_abapgit_utils=>is_valid_email( io_form_data->get( c_id-tagger_email ) ) = abap_false.
+      ro_validation_log->set(
+        iv_key = c_id-tagger_email
+        iv_val = |Invalid email address| ).
+    ENDIF.
+ 
+    lv_new_tag_name = io_form_data->get( c_id-name ).
+ 
+    IF lv_new_tag_name IS NOT INITIAL.
+      " Check if tag already exists
+      lt_tags = zcl_abapgit_git_transport=>branches( mo_repo->get_url( ) )->get_tags_only( ).
+ 
+      READ TABLE lt_tags TRANSPORTING NO FIELDS WITH TABLE KEY name_key
+        COMPONENTS name = zcl_abapgit_git_tag=>add_tag_prefix( lv_new_tag_name ).
+      IF sy-subrc = 0.
+        ro_validation_log->set(
+          iv_key = c_id-name
+          iv_val = |Tag already exists| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    DATA:
+      lx_error  TYPE REF TO zcx_abapgit_exception,
+      lv_commit TYPE zif_abapgit_git_definitions=>ty_sha1,
+      lv_text   TYPE string.
+ 
+    mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_back.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+ 
+      WHEN c_event-choose_commit.
+        lv_commit = choose_commit( ).
+ 
+        IF lv_commit IS INITIAL.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ELSE.
+          mo_form_data->set(
+            iv_key = c_id-sha1
+            iv_val = lv_commit ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+      WHEN c_event-change_type.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        mo_validation_log->clear( ).
+ 
+      WHEN c_event-create.
+        " Validate form entries before creating tag
+        mo_validation_log = validate_form( mo_form_data ).
+ 
+        IF mo_validation_log->is_empty( ) = abap_true.
+ 
+          mo_form_data->strict( abap_false ).
+          mo_form_data->to_abap( CHANGING cs_container = ms_tag ).
+ 
+          REPLACE ALL OCCURRENCES
+            OF cl_abap_char_utilities=>cr_lf
+            IN ms_tag-body
+            WITH cl_abap_char_utilities=>newline.
+ 
+          ms_tag-name = zcl_abapgit_git_tag=>add_tag_prefix( ms_tag-name ).
+          ASSERT ms_tag-name CP zif_abapgit_git_definitions=>c_git_branch-tags.
+ 
+          TRY.
+              zcl_abapgit_git_porcelain=>create_tag(
+                iv_url = mo_repo->get_url( )
+                is_tag = ms_tag ).
+            CATCH zcx_abapgit_exception INTO lx_error.
+              zcx_abapgit_exception=>raise( |Cannot create tag { ms_tag-name }: { lx_error->get_text( ) }| ).
+          ENDTRY.
+ 
+          lv_text = |Tag { zcl_abapgit_git_tag=>remove_tag_prefix( ms_tag-name ) } created|.
+          MESSAGE lv_text TYPE 'S'.
+ 
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
+        ELSE.
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+        ENDIF.
+ 
+    ENDCASE.
+ 
+    " If staying on form, initialize it with current settings
+    IF rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      mo_form = get_form_schema( mo_form_data ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    register_handlers( ).
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( `<div class="repo">` ).
+ 
+    ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
+                    io_repo               = mo_repo
+                    iv_show_commit        = abap_false
+                    iv_interactive_branch = abap_false ) ).
+ 
+    ri_html->add( mo_form->render( io_values         = mo_form_data
+                                   io_validation_log = mo_validation_log ) ).
+ 
+    ri_html->add( `</div>` ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/pages/zcl_abapgit_gui_page_tutorial.clas.abap.html b/src/ui/pages/zcl_abapgit_gui_page_tutorial.clas.abap.html new file mode 100644 index 00000000000..1fca992dbc6 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_tutorial.clas.abap.html @@ -0,0 +1,481 @@ + + + + + + Code coverage report for src/ui/pages/zcl_abapgit_gui_page_tutorial.clas.abap + + + + + + + + + +
+
+

All files / src/ui/pages zcl_abapgit_gui_page_tutorial.clas.abap

+
+ +
+ 100% + Statements + 132/132 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 132/132 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +1331x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_page_tutorial DEFINITION
+  PUBLIC
+  FINAL
+  INHERITING FROM zcl_abapgit_gui_component
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_renderable.
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS build_main_menu
+      RETURNING
+        VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_GUI_PAGE_TUTORIAL IMPLEMENTATION.
+ 
+ 
+  METHOD build_main_menu.
+ 
+    CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-main'.
+ 
+    ro_menu->add(
+      iv_txt = zcl_abapgit_gui_buttons=>repo_list( )
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>new_online( )
+      iv_act = zif_abapgit_definitions=>c_action-repo_newonline
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>new_offline( )
+      iv_act = zif_abapgit_definitions=>c_action-repo_newoffline
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>settings( )
+      iv_act = zif_abapgit_definitions=>c_action-go_settings
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>advanced( )
+      iv_title = 'Utilities'
+      io_sub = zcl_abapgit_gui_chunk_lib=>advanced_submenu( )
+    )->add(
+      iv_txt = zcl_abapgit_gui_buttons=>help( )
+      iv_title = 'Help'
+      io_sub = zcl_abapgit_gui_chunk_lib=>help_submenu( ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    DATA lo_component TYPE REF TO zcl_abapgit_gui_page_tutorial.
+ 
+    CREATE OBJECT lo_component.
+ 
+    ri_page = zcl_abapgit_gui_page_hoc=>create(
+      iv_page_title      = 'Tutorial'
+      io_page_menu       = build_main_menu( )
+      ii_child_component = lo_component ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_renderable~render.
+ 
+    CREATE OBJECT ri_html TYPE zcl_abapgit_html.
+ 
+    ri_html->add( '<div class="tutorial">' ).
+ 
+    ri_html->add( '<h1>Tutorial</h1>' ).
+    ri_html->add( '<hr>' ).
+ 
+    ri_html->add( '<h2>Online repositories</h2>' ).
+    ri_html->add( '<p><ul>' ).
+ 
+    ri_html->add( `<li>To clone a remote repository (e.g. from github) click ` ).
+    ri_html->add_a( iv_txt = zcl_abapgit_gui_buttons=>new_online( )
+                    iv_act = zif_abapgit_definitions=>c_action-repo_newonline ).
+    ri_html->add( ' from the top menu. This will link a remote repository with a package on your system.</li>' ).
+    ri_html->add( '<li>Use the pull button to retrieve and activate the remote objects.</li>' ).
+    ri_html->add( '<li>If the remote repository is updated,' ).
+    ri_html->add( ' you will see the changes and can pull to apply the updates.</li>' ).
+ 
+    ri_html->add( '</ul></p>' ).
+ 
+    ri_html->add( '<h2>Offline repositories</h2>' ).
+    ri_html->add( '<p><ul>' ).
+ 
+    ri_html->add( `<li>To add a package as an offline repository, click ` ).
+    ri_html->add_a( iv_txt = zcl_abapgit_gui_buttons=>new_offline( )
+                    iv_act = zif_abapgit_definitions=>c_action-repo_newoffline ).
+    ri_html->add( ' from the top menu.' ).
+    ri_html->add( '<li>abapGit will start tracking changes for the package ' ).
+    ri_html->add( 'without linking it to an online git repository.</li>' ).
+    ri_html->add( '<li>You can link the package later or just export the package content as a ZIP file.</li>' ).
+ 
+    ri_html->add( '</ul></p>' ).
+ 
+    ri_html->add( '</ul></p>' ).
+ 
+    ri_html->add( '<h2>Repository list and favorites</h2>' ).
+    ri_html->add( '<p><ul>' ).
+    ri_html->add( |<li>To favorite a repository, use the {
+                  ri_html->icon( 'star/darkgrey' ) } icon in the repository list.</li>| ).
+    ri_html->add( |<li>To go to a repository, click on the repository name.</li>| ).
+    ri_html->add( |<li>To go back to your favorites, use the| ).
+    ri_html->add_a(
+      iv_txt = zcl_abapgit_gui_buttons=>repo_list( )
+      iv_act = zif_abapgit_definitions=>c_action-abapgit_home ).
+    ri_html->add( |</li>| ).
+ 
+    ri_html->add( `<li>` ).
+    ri_html->add_a( iv_txt = 'Explore'
+                    iv_act = zif_abapgit_definitions=>c_action-go_explore ).
+    ri_html->add( ' to find projects using abapGit</li>' ).
+ 
+ 
+    ri_html->add( '</ul></p>' ).
+    ri_html->add( '</div>' ).
+ 
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/popups/index.html b/src/ui/popups/index.html new file mode 100644 index 00000000000..0a526611cfd --- /dev/null +++ b/src/ui/popups/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/ui/popups + + + + + + + + + +
+
+

All files src/ui/popups

+
+ +
+ 100% + Statements + 347/347 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 347/347 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_popup_branch_list.clas.abap +
+
100%119/119100%0/0100%0/0100%119/119
zcl_abapgit_popup_code_insp.clas.abap +
+
100%63/63100%0/0100%0/0100%63/63
zcl_abapgit_popup_pull_request.clas.abap +
+
100%80/80100%0/0100%0/0100%80/80
zcl_abapgit_popup_tag_list.clas.abap +
+
100%85/85100%0/0100%0/0100%85/85
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap.html b/src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap.html new file mode 100644 index 00000000000..e5b5fd2f5c1 --- /dev/null +++ b/src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap.html @@ -0,0 +1,442 @@ + + + + + + Code coverage report for src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap + + + + + + + + + +
+
+

All files / src/ui/popups zcl_abapgit_popup_branch_list.clas.abap

+
+ +
+ 100% + Statements + 119/119 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 119/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +1201x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_popup_branch_list DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_render_item.
+    INTERFACES zif_abapgit_html_popup.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_url             TYPE string
+        !iv_default_branch  TYPE string OPTIONAL
+        !iv_show_new_option TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ri_popup)     TYPE REF TO zif_abapgit_html_popup.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_url             TYPE string
+        !iv_default_branch  TYPE string OPTIONAL
+        !iv_show_new_option TYPE abap_bool DEFAULT abap_false.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mv_repo_url TYPE string.
+    DATA mv_default_branch TYPE string.
+    DATA mv_show_new_option TYPE abap_bool.
+ 
+    METHODS fetch_branch_list
+      RETURNING
+        VALUE(rt_branches) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_popup_branch_list IMPLEMENTATION.
+ 
+  METHOD create.
+    CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_branch_list
+      EXPORTING
+        iv_url             = iv_url
+        iv_default_branch  = iv_default_branch
+        iv_show_new_option = iv_show_new_option.
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    mv_repo_url        = iv_url.
+    mv_default_branch  = zif_abapgit_git_definitions=>c_git_branch-heads_prefix && iv_default_branch.
+    mv_show_new_option = iv_show_new_option.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_html_popup~create_picklist.
+ 
+    CREATE OBJECT ro_picklist
+      EXPORTING
+        iv_title         = 'Choose Branch'
+        it_list          = fetch_branch_list( )
+        ii_item_renderer = me.
+ 
+  ENDMETHOD.
+ 
+  METHOD fetch_branch_list.
+ 
+    DATA lo_branches    TYPE REF TO zcl_abapgit_git_branch_list.
+    DATA lv_head_symref TYPE string.
+ 
+    FIELD-SYMBOLS <ls_branch> LIKE LINE OF rt_branches.
+ 
+    lo_branches    = zcl_abapgit_git_transport=>branches( mv_repo_url ).
+    rt_branches    = lo_branches->get_branches_only( ).
+    lv_head_symref = lo_branches->get_head_symref( ).
+ 
+    IF rt_branches IS INITIAL.
+      zcx_abapgit_exception=>raise( 'No branches are available to select' ).
+    ENDIF.
+ 
+    " Clean up branches: HEAD duplicates, empty names
+    LOOP AT rt_branches ASSIGNING <ls_branch>.
+      IF <ls_branch>-name IS INITIAL.
+        DELETE rt_branches INDEX sy-tabix.
+      ELSEIF <ls_branch>-is_head = abap_true AND lv_head_symref IS NOT INITIAL AND <ls_branch>-name <> lv_head_symref.
+        DELETE rt_branches INDEX sy-tabix.
+      ENDIF.
+    ENDLOOP.
+ 
+    SORT rt_branches BY is_head DESCENDING display_name ASCENDING.
+ 
+    IF mv_show_new_option = abap_true.
+      APPEND INITIAL LINE TO rt_branches ASSIGNING <ls_branch>.
+      <ls_branch>-name = zif_abapgit_popups=>c_new_branch_label.
+      <ls_branch>-display_name = zif_abapgit_popups=>c_new_branch_label.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_gui_render_item~render.
+ 
+    DATA lv_head_marker TYPE string.
+    FIELD-SYMBOLS <ls_b> TYPE zif_abapgit_git_definitions=>ty_git_branch.
+ 
+    ASSIGN iv_item TO <ls_b>.
+    ASSERT sy-subrc = 0.
+ 
+    " TODO render mv_default_branch properly, needs respecting support from the picklist components
+ 
+    IF <ls_b>-is_head = abap_true.
+      lv_head_marker = | (<b>{ zif_abapgit_git_definitions=>c_head_name }</b>)|.
+    ENDIF.
+ 
+    ri_html = zcl_abapgit_html=>create( |{ <ls_b>-display_name }{ lv_head_marker }| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap.html b/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap.html new file mode 100644 index 00000000000..afd778c3d2a --- /dev/null +++ b/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap.html @@ -0,0 +1,274 @@ + + + + + + Code coverage report for src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap + + + + + + + + + +
+
+

All files / src/ui/popups zcl_abapgit_popup_code_insp.clas.abap

+
+ +
+ 100% + Statements + 63/63 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 63/63 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +641x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_popup_code_insp DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_render_item .
+    INTERFACES zif_abapgit_html_popup .
+ 
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ri_popup) TYPE REF TO zif_abapgit_html_popup .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS fetch_list
+      RETURNING
+        VALUE(rt_list) TYPE zif_abapgit_code_inspector=>ty_variants
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_POPUP_CODE_INSP IMPLEMENTATION.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_code_insp.
+  ENDMETHOD.
+ 
+ 
+  METHOD fetch_list.
+ 
+    rt_list = zcl_abapgit_factory=>get_code_inspector( '$TMP' )->list_global_variants( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_render_item~render.
+ 
+    FIELD-SYMBOLS <ls_item> TYPE LINE OF zif_abapgit_code_inspector=>ty_variants.
+ 
+    ASSIGN iv_item TO <ls_item>.
+    ASSERT sy-subrc = 0.
+ 
+    ri_html = zcl_abapgit_html=>create( |<b>{ <ls_item>-name }</b> - { <ls_item>-description }| ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_html_popup~create_picklist.
+ 
+    CREATE OBJECT ro_picklist
+      EXPORTING
+        iv_title         = 'Choose Variant'
+        it_list          = fetch_list( )
+        ii_item_renderer = me.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/popups/zcl_abapgit_popup_pull_request.clas.abap.html b/src/ui/popups/zcl_abapgit_popup_pull_request.clas.abap.html new file mode 100644 index 00000000000..7bd89fb4ab7 --- /dev/null +++ b/src/ui/popups/zcl_abapgit_popup_pull_request.clas.abap.html @@ -0,0 +1,325 @@ + + + + + + Code coverage report for src/ui/popups/zcl_abapgit_popup_pull_request.clas.abap + + + + + + + + + +
+
+

All files / src/ui/popups zcl_abapgit_popup_pull_request.clas.abap

+
+ +
+ 100% + Statements + 80/80 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 80/80 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +811x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_popup_pull_request DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_render_item.
+    INTERFACES zif_abapgit_html_popup.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        iv_url          TYPE string
+      RETURNING
+        VALUE(ri_popup) TYPE REF TO zif_abapgit_html_popup.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_url TYPE string.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mv_repo_url TYPE string.
+ 
+    METHODS fetch_pull_request_list
+      RETURNING
+        VALUE(rt_pulls) TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_popup_pull_request IMPLEMENTATION.
+ 
+  METHOD create.
+ 
+    CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_pull_request
+      EXPORTING
+        iv_url = iv_url.
+ 
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    mv_repo_url = iv_url.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_html_popup~create_picklist.
+ 
+    CREATE OBJECT ro_picklist
+      EXPORTING
+        iv_title         = 'Choose Pull Request'
+        it_list          = fetch_pull_request_list( )
+        ii_item_renderer = me.
+ 
+  ENDMETHOD.
+ 
+  METHOD fetch_pull_request_list.
+ 
+    rt_pulls = zcl_abapgit_pr_enumerator=>new( mv_repo_url )->get_pulls( ).
+ 
+    IF lines( rt_pulls ) = 0.
+      zcx_abapgit_exception=>raise( 'No pull requests found' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_render_item~render.
+ 
+    FIELD-SYMBOLS <ls_pr> TYPE zif_abapgit_pr_enum_provider=>ty_pull_request.
+ 
+    ASSIGN iv_item TO <ls_pr>.
+    ASSERT sy-subrc = 0.
+ 
+    ri_html = zcl_abapgit_html=>create( |<b>{ <ls_pr>-number }</b> - { <ls_pr>-title } @{ <ls_pr>-user }| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap.html b/src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap.html new file mode 100644 index 00000000000..c4a53e798bf --- /dev/null +++ b/src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap.html @@ -0,0 +1,340 @@ + + + + + + Code coverage report for src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap + + + + + + + + + +
+
+

All files / src/ui/popups zcl_abapgit_popup_tag_list.clas.abap

+
+ +
+ 100% + Statements + 85/85 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 85/85 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +861x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_popup_tag_list DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_render_item.
+    INTERFACES zif_abapgit_html_popup.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        iv_url          TYPE string
+      RETURNING
+        VALUE(ri_popup) TYPE REF TO zif_abapgit_html_popup.
+ 
+    METHODS constructor
+      IMPORTING
+        iv_url TYPE string.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mv_repo_url TYPE string.
+ 
+    METHODS fetch_tag_list
+      RETURNING
+        VALUE(rt_tags) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_popup_tag_list IMPLEMENTATION.
+ 
+  METHOD create.
+    CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_tag_list
+      EXPORTING
+        iv_url = iv_url.
+  ENDMETHOD.
+ 
+  METHOD constructor.
+    mv_repo_url = iv_url.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_html_popup~create_picklist.
+ 
+    CREATE OBJECT ro_picklist
+      EXPORTING
+        iv_title         = 'Choose Tag'
+        it_list          = fetch_tag_list( )
+        ii_item_renderer = me.
+ 
+  ENDMETHOD.
+ 
+  METHOD fetch_tag_list.
+ 
+    DATA lo_branches  TYPE REF TO zcl_abapgit_git_branch_list.
+ 
+    lo_branches = zcl_abapgit_git_transport=>branches( mv_repo_url ).
+    rt_tags     = lo_branches->get_tags_only( ).
+ 
+    DELETE rt_tags WHERE name CP '*' && zif_abapgit_git_definitions=>c_git_branch-peel.
+ 
+    IF lines( rt_tags ) = 0.
+      zcx_abapgit_exception=>raise( 'No tags are available to select' ).
+    ENDIF.
+ 
+    SORT rt_tags BY display_name ASCENDING.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_render_item~render.
+ 
+    FIELD-SYMBOLS <ls_tag> TYPE zif_abapgit_git_definitions=>ty_git_branch.
+ 
+    ASSIGN iv_item TO <ls_tag>.
+    ASSERT sy-subrc = 0.
+ 
+    ri_html = zcl_abapgit_html=>create( |{ <ls_tag>-display_name }| ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/routing/index.html b/src/ui/routing/index.html new file mode 100644 index 00000000000..31c7d508002 --- /dev/null +++ b/src/ui/routing/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/ui/routing + + + + + + + + + +
+
+

All files src/ui/routing

+
+ +
+ 94.71% + Statements + 2473/2611 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/27 +
+ + +
+ 94.71% + Lines + 2473/2611 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_gui_router.clas.abap +
+
99.5%811/815100%0/00%0/199.5%811/815
zcl_abapgit_services_abapgit.clas.abap +
+
100%310/310100%0/0100%0/0100%310/310
zcl_abapgit_services_basis.clas.abap +
+
100%89/89100%0/0100%0/0100%89/89
zcl_abapgit_services_basis.clas.testclasses.abap +
+
69.4%304/438100%0/00%0/2669.4%304/438
zcl_abapgit_services_git.clas.abap +
+
100%252/252100%0/0100%0/0100%252/252
zcl_abapgit_services_repo.clas.abap +
+
100%707/707100%0/0100%0/0100%707/707
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/routing/zcl_abapgit_gui_router.clas.abap.html b/src/ui/routing/zcl_abapgit_gui_router.clas.abap.html new file mode 100644 index 00000000000..528256dbe9e --- /dev/null +++ b/src/ui/routing/zcl_abapgit_gui_router.clas.abap.html @@ -0,0 +1,2530 @@ + + + + + + Code coverage report for src/ui/routing/zcl_abapgit_gui_router.clas.abap + + + + + + + + + +
+
+

All files / src/ui/routing zcl_abapgit_gui_router.clas.abap

+
+ +
+ 99.5% + Statements + 811/815 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 99.5% + Lines + 811/815 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +8161x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_gui_router DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_gui_event_handler.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS general_page_routing
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS abapgit_services_actions
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS db_actions
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS file_download
+      IMPORTING
+        !iv_package TYPE devclass
+        !iv_xstr    TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    METHODS git_services
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS sap_gui_actions
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS other_utilities
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS zip_services
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS repository_services
+      IMPORTING
+        !ii_event         TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_page_diff
+      IMPORTING
+        !ii_event      TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_page_stage
+      IMPORTING
+        !ii_event      TYPE REF TO zif_abapgit_gui_event
+        ii_obj_filter  TYPE REF TO zif_abapgit_object_filter OPTIONAL
+      RETURNING
+        VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS jump_object
+      IMPORTING
+        !iv_obj_type   TYPE string
+        !iv_obj_name   TYPE string
+        !iv_filename   TYPE string
+        !iv_sub_type   TYPE string OPTIONAL
+        !iv_sub_name   TYPE string OPTIONAL
+        !iv_line       TYPE string OPTIONAL
+        !iv_new_window TYPE string DEFAULT 'X'
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS jump_display_transport
+      IMPORTING
+        !iv_transport TYPE trkorr
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS jump_display_user
+      IMPORTING
+        !iv_username TYPE syuname
+      RAISING
+        zcx_abapgit_exception .
+    METHODS call_browser
+      IMPORTING
+        !iv_url TYPE csequence
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_state_settings
+      IMPORTING
+        !ii_event       TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rv_state) TYPE i .
+    METHODS get_state_diff
+      IMPORTING
+        !ii_event       TYPE REF TO zif_abapgit_gui_event
+      RETURNING
+        VALUE(rv_state) TYPE i .
+    METHODS main_page
+      RETURNING VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
+      RAISING   zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_gui_router IMPLEMENTATION.
+ 
+ 
+  METHOD abapgit_services_actions.
+ 
+    IF ii_event->mv_action = zif_abapgit_definitions=>c_action-abapgit_home.
+      rs_handled-page  = zcl_abapgit_gui_page_repo_over=>create( ).
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD call_browser.
+
+    zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = |{ iv_url }| ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD db_actions.
+ 
+    DATA ls_db_key TYPE zif_abapgit_persistence=>ty_content.
+    DATA lo_query TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_query = ii_event->query( ).
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-db_edit.
+        lo_query->to_abap( CHANGING cs_container = ls_db_key ).
+        rs_handled-page  = zcl_abapgit_gui_page_db_entry=>create(
+          is_key       = ls_db_key
+          iv_edit_mode = abap_true ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-db_display.
+        lo_query->to_abap( CHANGING cs_container = ls_db_key ).
+        rs_handled-page  = zcl_abapgit_gui_page_db_entry=>create( ls_db_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD file_download.
+ 
+    DATA:
+      lv_path    TYPE string,
+      lv_default TYPE string,
+      li_fe_serv TYPE REF TO zif_abapgit_frontend_services,
+      lv_package TYPE devclass.
+ 
+    lv_package = iv_package.
+    TRANSLATE lv_package USING '/#'.
+    CONCATENATE lv_package '_' sy-datlo '_' sy-timlo INTO lv_default.
+ 
+    li_fe_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lv_path = li_fe_serv->show_file_save_dialog(
+      iv_title            = 'Export ZIP'
+      iv_extension        = 'zip'
+      iv_default_filename = lv_default ).
+ 
+    li_fe_serv->file_download(
+      iv_path = lv_path
+      iv_xstr = iv_xstr ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD general_page_routing.
+ 
+    DATA: lv_key              TYPE zif_abapgit_persistence=>ty_repo-key,
+          lv_last_repo_key    TYPE zif_abapgit_persistence=>ty_repo-key,
+          lo_obj_filter_trans TYPE REF TO zcl_abapgit_object_filter_tran,
+          lo_repo             TYPE REF TO zcl_abapgit_repo,
+          lt_r_trkorr         TYPE zif_abapgit_definitions=>ty_trrngtrkor_tt.
+ 
+    lv_key = ii_event->query( )->get( 'KEY' ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-go_home.
+        lv_last_repo_key = zcl_abapgit_persistence_user=>get_instance( )->get_repo_show( ).
+ 
+        IF lv_last_repo_key IS NOT INITIAL.
+          rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lv_last_repo_key ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+        ELSE.
+          rs_handled-page = main_page( ).
+          rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+        ENDIF.
+      WHEN zif_abapgit_definitions=>c_action-go_db.                          " Go DB util page
+        rs_handled-page  = zcl_abapgit_gui_page_db=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-go_debuginfo.                   " Go debug info
+        rs_handled-page  = zcl_abapgit_gui_page_debuginfo=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-go_settings.                    " Go global settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_glob=>create( ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-go_settings_personal.           " Go personal settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_pers=>create( ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-go_background_run.              " Go background run page
+        rs_handled-page  = zcl_abapgit_gui_page_run_bckg=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-go_repo_diff                         " Go Diff page
+        OR zif_abapgit_definitions=>c_action-go_file_diff.
+        rs_handled-page  = get_page_diff( ii_event ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
+      WHEN zif_abapgit_definitions=>c_action-go_stage.                        " Go Staging page
+        rs_handled-page  = get_page_stage( ii_event ).
+        rs_handled-state = get_state_diff( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-go_stage_transport.              " Go Staging page by Transport
+ 
+        lt_r_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_select_wb_tc_tr_and_tsk( ).
+ 
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+ 
+        CREATE OBJECT lo_obj_filter_trans.
+        lo_obj_filter_trans->set_filter_values( iv_package  = lo_repo->get_package( )
+                                                it_r_trkorr = lt_r_trkorr ).
+ 
+        rs_handled-page = get_page_stage( ii_event      = ii_event
+                                          ii_obj_filter = lo_obj_filter_trans ).
+        rs_handled-state = get_state_diff( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-go_tutorial.                     " Go to tutorial
+        rs_handled-page  = zcl_abapgit_gui_page_tutorial=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-documentation.                   " abapGit docs
+        zcl_abapgit_services_abapgit=>open_abapgit_wikipage( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-go_explore.                      " dotabap
+        zcl_abapgit_services_abapgit=>open_dotabap_homepage( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-changelog.                       " abapGit full changelog
+        zcl_abapgit_services_abapgit=>open_abapgit_changelog( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-homepage.                        " abapGit homepage
+        zcl_abapgit_services_abapgit=>open_abapgit_homepage( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-sponsor.                         " abapGit sponsor us
+        zcl_abapgit_services_abapgit=>open_abapgit_homepage( 'sponsor.html' ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-show_hotkeys.                    " show hotkeys
+        zcl_abapgit_ui_factory=>get_gui_services(
+                             )->get_hotkeys_ctl(
+                             )->set_visible( abap_true ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_page_diff.
+ 
+    DATA: ls_file   TYPE zif_abapgit_git_definitions=>ty_file,
+          ls_object TYPE zif_abapgit_definitions=>ty_item,
+          lo_page   TYPE REF TO zcl_abapgit_gui_page_diff,
+          lv_key    TYPE zif_abapgit_persistence=>ty_repo-key.
+ 
+    lv_key             = ii_event->query( )->get( 'KEY' ).
+    ls_file-path       = ii_event->query( )->get( 'PATH' ).
+    ls_file-filename   = ii_event->query( )->get( 'FILENAME' ). " unescape ?
+    ls_object-obj_type = ii_event->query( )->get( 'OBJ_TYPE' ).
+    ls_object-obj_name = ii_event->query( )->get( 'OBJ_NAME' ). " unescape ?
+ 
+    CREATE OBJECT lo_page
+      EXPORTING
+        iv_key    = lv_key
+        is_file   = ls_file
+        is_object = ls_object.
+ 
+    ri_page = lo_page.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_page_stage.
+ 
+    DATA: lo_repo                TYPE REF TO zcl_abapgit_repo_online,
+          lv_key                 TYPE zif_abapgit_persistence=>ty_repo-key,
+          lv_seed                TYPE string,
+          lo_stage_page          TYPE REF TO zcl_abapgit_gui_page_stage,
+          lo_code_inspector_page TYPE REF TO zcl_abapgit_gui_page_code_insp,
+          lv_sci_result          TYPE zif_abapgit_definitions=>ty_sci_result,
+          lx_error               TYPE REF TO cx_sy_move_cast_error.
+ 
+    lv_key   = ii_event->query( )->get( 'KEY' ).
+    lv_seed  = ii_event->query( )->get( 'SEED' ).
+ 
+    lv_sci_result = zif_abapgit_definitions=>c_sci_result-no_run.
+ 
+    TRY.
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+      CATCH cx_sy_move_cast_error INTO lx_error.
+        zcx_abapgit_exception=>raise( `Staging is only possible for online repositories.` ).
+    ENDTRY.
+ 
+    IF lo_repo->get_selected_branch( ) CP zif_abapgit_git_definitions=>c_git_branch-tags.
+      zcx_abapgit_exception=>raise( |You are working on a tag, must be on branch| ).
+    ELSEIF lo_repo->get_selected_commit( ) IS NOT INITIAL.
+      zcx_abapgit_exception=>raise( |You are working on a commit, must be on branch| ).
+    ENDIF.
+ 
+    IF lo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL.
+      CREATE OBJECT lo_code_inspector_page
+        EXPORTING
+          io_repo = lo_repo.
+ 
+      IF lo_code_inspector_page->is_nothing_to_display( ) = abap_true.
+        lv_sci_result = zif_abapgit_definitions=>c_sci_result-passed.
+      ELSE.
+        ri_page = lo_code_inspector_page.
+      ENDIF.
+    ENDIF.
+ 
+    IF ri_page IS INITIAL.
+      " force refresh on stage, to make sure the latest local and remote files are used
+      lo_repo->refresh( ).
+ 
+      CREATE OBJECT lo_stage_page
+        EXPORTING
+          io_repo       = lo_repo
+          iv_seed       = lv_seed
+          iv_sci_result = lv_sci_result
+          ii_obj_filter = ii_obj_filter.
+ 
+      ri_page = lo_stage_page.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_state_diff.
+ 
+    " Bookmark current page before jumping to diff page
+    IF ii_event->mv_current_page_name CP 'ZCL_ABAPGIT_GUI_PAGE_DIFF'.
+      rv_state = zcl_abapgit_gui=>c_event_state-new_page.
+    ELSE.
+      rv_state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_state_settings.
+ 
+    " Bookmark current page before jumping to any settings page
+    IF ii_event->mv_current_page_name CP 'ZCL_ABAPGIT_GUI_PAGE_SETT_*'.
+      rv_state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+    ELSE.
+      rv_state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD git_services.
+ 
+    DATA lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
+    DATA li_repo TYPE REF TO zif_abapgit_repo.
+ 
+    lv_key = ii_event->query( )->get( 'KEY' ).
+ 
+    IF lv_key IS NOT INITIAL.
+      li_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+    ENDIF.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-git_pull.                      " GIT Pull
+        zcl_abapgit_services_git=>pull( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_create.             " GIT Create new branch
+        zcl_abapgit_services_git=>create_branch( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_delete.             " GIT Delete remote branch
+        zcl_abapgit_services_git=>delete_branch( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_switch.             " GIT Switch branch
+        zcl_abapgit_services_git=>switch_branch( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_branch_merge.              " GIT Merge branch
+        rs_handled-page  = zcl_abapgit_gui_page_merge_sel=>create( li_repo ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-git_tag_create.                " GIT Tag create
+        rs_handled-page  = zcl_abapgit_gui_page_tags=>create( li_repo ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-git_tag_delete.                " GIT Tag delete
+        zcl_abapgit_services_git=>delete_tag( lv_key ).
+        zcl_abapgit_services_repo=>refresh( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-git_tag_switch.                " GIT Switch Tag
+        zcl_abapgit_services_git=>switch_tag( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_display_transport.
+ 
+    DATA:
+      lv_adt_link         TYPE string,
+      lv_adt_jump_enabled TYPE abap_bool.
+ 
+    lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
+    IF lv_adt_jump_enabled = abap_true.
+      TRY.
+          lv_adt_link = zcl_abapgit_adt_link=>link_transport( iv_transport ).
+          zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ).
+        CATCH zcx_abapgit_exception.
+          " Fallback if ADT link execution failed or was cancelled
+          CALL FUNCTION 'TR_DISPLAY_REQUEST'
+            EXPORTING
+              i_trkorr = iv_transport.
+      ENDTRY.
+    ELSE.
+      CALL FUNCTION 'TR_DISPLAY_REQUEST'
+        EXPORTING
+          i_trkorr = iv_transport.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_display_user.
+ 
+    " todo, user display in ADT
+ 
+    CALL FUNCTION 'BAPI_USER_DISPLAY'
+      EXPORTING
+        username = iv_username.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD jump_object.
+ 
+    DATA:
+      ls_item        TYPE zif_abapgit_definitions=>ty_item,
+      ls_sub_item    TYPE zif_abapgit_definitions=>ty_item,
+      lx_error       TYPE REF TO zcx_abapgit_exception,
+      lv_line_number TYPE i,
+      lv_new_window  TYPE abap_bool,
+      li_html_viewer TYPE REF TO zif_abapgit_html_viewer.
+ 
+    ls_item-obj_type = cl_http_utility=>unescape_url( |{ iv_obj_type }| ).
+    ls_item-obj_name = cl_http_utility=>unescape_url( |{ iv_obj_name }| ).
+    ls_sub_item-obj_type = cl_http_utility=>unescape_url( |{ iv_sub_type }| ).
+    ls_sub_item-obj_name = cl_http_utility=>unescape_url( |{ iv_sub_name }| ).
+ 
+    IF iv_line CO '0123456789'.
+      lv_line_number = iv_line.
+    ENDIF.
+    lv_new_window = boolc( iv_new_window IS NOT INITIAL ).
+ 
+    TRY.
+        li_html_viewer = zcl_abapgit_ui_factory=>get_html_viewer( ).
+ 
+        " Hide HTML Viewer in dummy screen0 for direct CALL SCREEN to work
+        li_html_viewer->set_visiblity( abap_false ).
+ 
+        IF ls_item-obj_type = zif_abapgit_data_config=>c_data_type-tabu.
+          zcl_abapgit_data_utils=>jump( ls_item ).
+        ELSEIF lv_line_number IS INITIAL OR ls_sub_item IS INITIAL.
+          zcl_abapgit_objects=>jump(
+            is_item       = ls_item
+            iv_filename   = iv_filename
+            iv_new_window = lv_new_window ).
+        ELSE.
+          zcl_abapgit_objects=>jump(
+            is_item        = ls_item
+            is_sub_item    = ls_sub_item
+            iv_filename    = iv_filename
+            iv_line_number = lv_line_number
+            iv_new_window  = lv_new_window ).
+        ENDIF.
+ 
+        li_html_viewer->set_visiblity( abap_true ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        li_html_viewer->set_visiblity( abap_true ).
+        RAISE EXCEPTION lx_error.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD main_page.
+ 
+    DATA lt_repo_all_list TYPE zif_abapgit_repo_srv=>ty_repo_list.
+ 
+    " if there are no favorites, check if there are any repositories at all
+    " if not, go to tutorial where the user can create the first repository
+    lt_repo_all_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+    IF lt_repo_all_list IS NOT INITIAL.
+      ri_page = zcl_abapgit_gui_page_repo_over=>create( ).
+    ELSE.
+      ri_page = zcl_abapgit_gui_page_tutorial=>create( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD other_utilities.
+    TYPES ty_char600 TYPE c LENGTH 600.
+    DATA lv_clip_content TYPE string.
+    DATA lt_clipboard TYPE STANDARD TABLE OF ty_char600.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-ie_devtools.
+        zcl_abapgit_services_basis=>open_ie_devtools( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-clipboard.
+        lv_clip_content = ii_event->query( )->get( 'CLIPBOARD' ).
+        APPEND lv_clip_content TO lt_clipboard.
+        zcl_abapgit_ui_factory=>get_frontend_services( )->clipboard_export( lt_clipboard ).
+        MESSAGE 'Successfully exported URL to Clipboard.' TYPE 'S'.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-yank_to_clipboard.
+        lv_clip_content = ii_event->form_data( )->get( 'CLIPBOARD' ).
+        APPEND lv_clip_content TO lt_clipboard.
+        zcl_abapgit_ui_factory=>get_frontend_services( )->clipboard_export( lt_clipboard ).
+        MESSAGE 'Successfully exported to Clipboard.' TYPE 'S'.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD repository_services.
+ 
+    DATA:
+      lv_key  TYPE zif_abapgit_persistence=>ty_repo-key,
+      lo_repo TYPE REF TO zcl_abapgit_repo,
+      li_log  TYPE REF TO zif_abapgit_log.
+ 
+    lv_key = ii_event->query( )->get( 'KEY' ).
+    IF lv_key IS NOT INITIAL.
+      lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+    ENDIF.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-repo_newoffline.                 " New offline repo
+        rs_handled-page  = zcl_abapgit_gui_page_addofflin=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-repo_add_all_obj_to_trans_req.   " Add objects to transport
+        zcl_abapgit_transport=>add_all_objects_to_trans_req( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_refresh.                    " Repo refresh
+        zcl_abapgit_services_repo=>refresh( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_syntax_check.
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_syntax " Syntax check
+          EXPORTING
+            io_repo = lo_repo.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-repo_code_inspector.             " Code inspector
+        CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_code_insp
+          EXPORTING
+            io_repo = lo_repo.
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-repo_purge.                      " Repo purge all objects (uninstall)
+        zcl_abapgit_services_repo=>purge( lv_key ).
+        rs_handled-page  = zcl_abapgit_gui_page_repo_over=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+      WHEN zif_abapgit_definitions=>c_action-repo_remove.                     " Repo remove
+        zcl_abapgit_services_repo=>remove( lv_key ).
+        rs_handled-page  = zcl_abapgit_gui_page_repo_over=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
+      WHEN zif_abapgit_definitions=>c_action-repo_activate_objects.           " Repo activate objects
+        zcl_abapgit_services_repo=>activate_objects( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_newonline.                  " New offline repo
+        rs_handled-page  = zcl_abapgit_gui_page_addonline=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-repo_refresh_checksums.          " Rebuild local checksums
+        zcl_abapgit_services_repo=>refresh_local_checksums( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_toggle_fav.                 " Toggle repo as favorite
+        zcl_abapgit_services_repo=>toggle_favorite( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_transport_to_branch.        " Transport to branch
+        zcl_abapgit_services_repo=>transport_to_branch( lv_key ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+      WHEN zif_abapgit_definitions=>c_action-repo_settings.                   " Repo settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_repo=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_local_settings.             " Local repo settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_locl=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_remote_settings.            " Remote repo settings
+        rs_handled-page  = zcl_abapgit_gui_page_sett_remo=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_background.                 " Repo background mode
+        rs_handled-page  = zcl_abapgit_gui_page_sett_bckg=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_infos.                      " Repo infos
+        rs_handled-page  = zcl_abapgit_gui_page_sett_info=>create( lo_repo ).
+        rs_handled-state = get_state_settings( ii_event ).
+      WHEN zif_abapgit_definitions=>c_action-repo_log.                        " Repo log
+        li_log = lo_repo->get_log( ).
+        zcl_abapgit_log_viewer=>show_log( li_log ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sap_gui_actions.
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-jump.                          " Open object editor
+        jump_object(
+          iv_obj_type   = ii_event->query( )->get( 'TYPE' )
+          iv_obj_name   = ii_event->query( )->get( 'NAME' )
+          iv_filename   = ii_event->query( )->get( 'FILE' )
+          iv_sub_type   = ii_event->query( )->get( 'SUBTYPE' )
+          iv_sub_name   = ii_event->query( )->get( 'SUBNAME' )
+          iv_line       = ii_event->query( )->get( 'LINE' )
+          iv_new_window = ii_event->query( )->get( 'NEW_WINDOW' ) ).
+ 
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-jump_transport.
+        jump_display_transport( |{ ii_event->query( )->get( 'TRANSPORT' ) }| ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-jump_user.
+        jump_display_user( |{ ii_event->query( )->get( 'USER' ) }| ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+      WHEN zif_abapgit_definitions=>c_action-url.
+        call_browser( ii_event->query( )->get( 'URL' ) ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+ 
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_gui_event_handler~on_event.
+ 
+    rs_handled = zcl_abapgit_exit=>get_instance( )->on_event( ii_event ).
+ 
+    IF rs_handled-state IS INITIAL.
+      rs_handled = general_page_routing( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = repository_services( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = git_services( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = zip_services( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = db_actions( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = abapgit_services_actions( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = sap_gui_actions( ii_event ).
+    ENDIF.
+    IF rs_handled-state IS INITIAL.
+      rs_handled = other_utilities( ii_event ).
+    ENDIF.
+ 
+    IF rs_handled-state IS INITIAL.
+      rs_handled-state = zcl_abapgit_gui=>c_event_state-not_handled.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zip_services.
+ 
+    DATA: lv_key              TYPE zif_abapgit_persistence=>ty_repo-key,
+          lo_repo             TYPE REF TO zcl_abapgit_repo,
+          lv_path             TYPE string,
+          lv_dest             TYPE rfcdest,
+          lv_msg              TYPE c LENGTH 200,
+          lv_xstr             TYPE xstring,
+          lv_package          TYPE zif_abapgit_persistence=>ty_repo-package,
+          lv_folder_logic     TYPE string,
+          lv_main_lang_only   TYPE zif_abapgit_persistence=>ty_local_settings-main_language_only,
+          lo_obj_filter_trans TYPE REF TO zcl_abapgit_object_filter_tran,
+          lt_r_trkorr         TYPE zif_abapgit_definitions=>ty_trrngtrkor_tt.
+ 
+    CONSTANTS:
+      BEGIN OF lc_page,
+        main_view TYPE string VALUE 'ZCL_ABAPGIT_GUI_PAGE_MAIN',
+        repo_view TYPE string VALUE 'ZCL_ABAPGIT_GUI_PAGE_REPO_VIEW',
+      END OF lc_page.
+ 
+    lv_key = ii_event->query( )->get( 'KEY' ).
+ 
+    CASE ii_event->mv_action.
+      WHEN zif_abapgit_definitions=>c_action-zip_import                       " Import repo from ZIP
+        OR zif_abapgit_definitions=>c_action-rfc_compare.                     " Compare repo via RFC
+ 
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+ 
+        IF ii_event->mv_action = zif_abapgit_definitions=>c_action-zip_import.
+          lv_path = zcl_abapgit_ui_factory=>get_frontend_services( )->show_file_open_dialog(
+            iv_title            = 'Import ZIP'
+            iv_extension        = 'zip'
+            iv_default_filename = '*.zip' ).
+          lv_xstr = zcl_abapgit_ui_factory=>get_frontend_services( )->file_upload( lv_path ).
+        ELSE.
+          lv_dest = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( 'RFCDES-RFCDEST' ).
+ 
+          IF lv_dest IS INITIAL.
+            rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+            RETURN.
+          ENDIF.
+ 
+          lv_package            = lo_repo->get_package( ).
+          lv_folder_logic       = lo_repo->get_dot_abapgit( )->get_folder_logic( ).
+          lv_main_lang_only     = lo_repo->get_local_settings( )-main_language_only.
+ 
+          CALL FUNCTION 'Z_ABAPGIT_SERIALIZE_PACKAGE'
+            DESTINATION lv_dest
+            EXPORTING
+              iv_package            = lv_package
+              iv_folder_logic       = lv_folder_logic
+              iv_main_lang_only     = lv_main_lang_only
+            IMPORTING
+              ev_xstring            = lv_xstr
+            EXCEPTIONS
+              system_failure        = 1 MESSAGE lv_msg
+              communication_failure = 2 MESSAGE lv_msg
+              OTHERS                = 3.
+          IF sy-subrc <> 0.
+            zcx_abapgit_exception=>raise( |RFC import error: { lv_msg }| ).
+          ENDIF.
+        ENDIF.
+ 
+        lo_repo->set_files_remote( zcl_abapgit_zip=>load( lv_xstr ) ).
+        zcl_abapgit_services_repo=>refresh( lv_key ).
+ 
+        CASE ii_event->mv_current_page_name.
+          WHEN lc_page-repo_view.
+            rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
+          WHEN lc_page-main_view.
+            rs_handled-page  = zcl_abapgit_gui_page_repo_view=>create( lo_repo->get_key( ) ).
+            rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+          WHEN OTHERS.
+            rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+        ENDCASE.
+      WHEN zif_abapgit_definitions=>c_action-zip_export.                      " Export repo as ZIP
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+        lv_xstr = zcl_abapgit_zip=>encode_files( lo_repo->get_files_local( ) ).
+        file_download( iv_package = lo_repo->get_package( )
+                       iv_xstr    = lv_xstr ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-zip_export_transport.                      " Export repo as ZIP
+ 
+        lt_r_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_select_wb_tc_tr_and_tsk( ).
+        lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
+        lo_repo->refresh( ).
+        CREATE OBJECT lo_obj_filter_trans.
+        lo_obj_filter_trans->set_filter_values( iv_package  = lo_repo->get_package( )
+                                                it_r_trkorr = lt_r_trkorr ).
+ 
+        lv_xstr = zcl_abapgit_zip=>encode_files( lo_repo->get_files_local( ii_obj_filter = lo_obj_filter_trans ) ).
+        lo_repo->refresh( ).
+        file_download( iv_package = lo_repo->get_package( )
+                       iv_xstr    = lv_xstr ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-zip_package.                     " Export package as ZIP
+        rs_handled-page  = zcl_abapgit_gui_page_ex_pckage=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+      WHEN zif_abapgit_definitions=>c_action-zip_transport.                   " Export transports as ZIP
+        zcl_abapgit_transport_mass=>run( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
+      WHEN zif_abapgit_definitions=>c_action-zip_object.                      " Export object as ZIP
+        rs_handled-page  = zcl_abapgit_gui_page_ex_object=>create( ).
+        rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/routing/zcl_abapgit_services_abapgit.clas.abap.html b/src/ui/routing/zcl_abapgit_services_abapgit.clas.abap.html new file mode 100644 index 00000000000..1ec1882870f --- /dev/null +++ b/src/ui/routing/zcl_abapgit_services_abapgit.clas.abap.html @@ -0,0 +1,1015 @@ + + + + + + Code coverage report for src/ui/routing/zcl_abapgit_services_abapgit.clas.abap + + + + + + + + + +
+
+

All files / src/ui/routing zcl_abapgit_services_abapgit.clas.abap

+
+ +
+ 100% + Statements + 310/310 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 310/310 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +3111x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_services_abapgit DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_abapgit_repo TYPE string VALUE 'https://github.com/abapGit/abapGit' ##NO_TEXT.
+    CONSTANTS c_abapgit_homepage TYPE string VALUE 'https://www.abapgit.org' ##NO_TEXT.
+    CONSTANTS c_abapgit_wikipage TYPE string VALUE 'https://docs.abapgit.org' ##NO_TEXT.
+    CONSTANTS c_dotabap_homepage TYPE string VALUE 'https://dotabap.org' ##NO_TEXT.
+    CONSTANTS c_abapgit_class TYPE seoclsname VALUE `ZCX_ABAPGIT_EXCEPTION` ##NO_TEXT.
+    CONSTANTS c_changelog_path TYPE string VALUE '/blob/main/changelog.txt' ##NO_TEXT.
+ 
+    CLASS-METHODS open_abapgit_homepage
+      IMPORTING
+        iv_page TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_abapgit_wikipage
+      IMPORTING
+        iv_page TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_dotabap_homepage
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_abapgit_changelog
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_installed
+      RETURNING
+        VALUE(rv_devclass) TYPE tadir-devclass .
+    CLASS-METHODS prepare_gui_startup
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_abapgit_tcode
+      RETURNING
+        VALUE(rv_tcode) TYPE tcode .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS set_start_repo_from_package
+      IMPORTING
+        !iv_package TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_package_from_adt
+      RETURNING
+        VALUE(rv_package) TYPE devclass .
+    CLASS-METHODS check_sapgui
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_url_in_browser
+      IMPORTING
+        !iv_url TYPE string
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_services_abapgit IMPLEMENTATION.
+ 
+ 
+  METHOD check_sapgui.
+ 
+    CONSTANTS:
+      lc_hide_sapgui_hint TYPE string VALUE '2'.
+ 
+    DATA:
+      lv_answer           TYPE char1,
+      ls_settings         TYPE zif_abapgit_definitions=>ty_s_user_settings,
+      li_user_persistence TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user_persistence = zcl_abapgit_persistence_user=>get_instance( ).
+ 
+    ls_settings = li_user_persistence->get_settings( ).
+ 
+    IF ls_settings-hide_sapgui_hint = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    IF zcl_abapgit_ui_factory=>get_frontend_services( )->is_sapgui_for_java( ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+                    iv_titlebar              = 'Not supported SAPGUI'
+                    iv_text_question         = 'SAPGUI for Java is not supported! There might be some issues.'
+                    iv_text_button_1         = 'Got it'
+                    iv_icon_button_1         = |{ icon_okay }|
+                    iv_text_button_2         = 'Hide'
+                    iv_icon_button_2         = |{ icon_set_state }|
+                    iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer = lc_hide_sapgui_hint.
+      ls_settings-hide_sapgui_hint = abap_true.
+      li_user_persistence->set_settings( ls_settings ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_abapgit_tcode.
+    CONSTANTS: lc_report_tcode_hex TYPE x VALUE '80'.
+    DATA: lt_tcodes TYPE STANDARD TABLE OF tcode.
+ 
+    SELECT tcode
+      FROM tstc
+      INTO TABLE lt_tcodes
+      WHERE pgmna = sy-cprog
+        AND cinfo = lc_report_tcode_hex.
+ 
+    IF lines( lt_tcodes ) > 0.
+      READ TABLE lt_tcodes INDEX 1 INTO rv_tcode.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_package_from_adt.
+ 
+    DATA: ls_item    TYPE zif_abapgit_definitions=>ty_item,
+          lr_context TYPE REF TO data,
+          lt_fields  TYPE tihttpnvp.
+ 
+ 
+    FIELD-SYMBOLS: <lg_context>    TYPE any,
+                   <lv_parameters> TYPE string,
+                   <ls_field>      LIKE LINE OF lt_fields.
+ 
+    ls_item-obj_type = 'CLAS'.
+    ls_item-obj_name = 'CL_ADT_GUI_INTEGRATION_CONTEXT'.
+ 
+    IF zcl_abapgit_objects=>exists( ls_item ) = abap_false.
+      " ADT is not supported in this NW release
+      RETURN.
+    ENDIF.
+ 
+    TRY.
+        CREATE DATA lr_context TYPE ('CL_ADT_GUI_INTEGRATION_CONTEXT=>TY_CONTEXT_INFO').
+ 
+        ASSIGN lr_context->* TO <lg_context>.
+        ASSERT sy-subrc = 0.
+ 
+        CALL METHOD ('CL_ADT_GUI_INTEGRATION_CONTEXT')=>read_context
+          RECEIVING
+            result = <lg_context>.
+ 
+        ASSIGN COMPONENT 'PARAMETERS'
+               OF STRUCTURE <lg_context>
+               TO <lv_parameters>.
+        ASSERT sy-subrc = 0.
+ 
+        lt_fields = cl_http_utility=>string_to_fields( cl_http_utility=>unescape_url( <lv_parameters> ) ).
+ 
+        READ TABLE lt_fields ASSIGNING <ls_field>
+                             WITH KEY name = 'p_package_name'.
+        IF sy-subrc = 0.
+          rv_package = <ls_field>-value.
+ 
+          " We want to open the repo just once. Therefore we delete the parameters
+          " and initialize the ADT context.
+          CLEAR <lv_parameters>.
+          CALL METHOD ('CL_ADT_GUI_INTEGRATION_CONTEXT')=>initialize_instance
+            EXPORTING
+              context_info = <lg_context>.
+ 
+        ENDIF.
+ 
+      CATCH cx_root.
+        " Some problems with dynamic ADT access.
+        " Let's ignore it for now and fail silently
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_installed.
+ 
+    SELECT SINGLE devclass FROM tadir INTO rv_devclass
+      WHERE pgmid = 'R3TR'
+      AND object = 'CLAS'
+      AND obj_name = c_abapgit_class.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD open_abapgit_changelog.
+    open_url_in_browser( |{ c_abapgit_repo }{ c_changelog_path }| ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_abapgit_homepage.
+    open_url_in_browser( |{ c_abapgit_homepage }/{ iv_page }| ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_abapgit_wikipage.
+    open_url_in_browser( |{ c_abapgit_wikipage }/{ iv_page }| ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_dotabap_homepage.
+    open_url_in_browser( c_dotabap_homepage ).
+  ENDMETHOD.
+ 
+ 
+  METHOD open_url_in_browser.
+    DATA lx_error TYPE REF TO zcx_abapgit_exception.
+ 
+    TRY.
+        zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = iv_url ).
+      CATCH zcx_abapgit_exception INTO lx_error.
+        zcx_abapgit_exception=>raise( iv_text     = 'Opening page in external browser failed.'
+                                      ix_previous = lx_error ).
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD prepare_gui_startup.
+ 
+    DATA: lv_repo_key    TYPE zif_abapgit_persistence=>ty_value,
+          lv_package     TYPE devclass,
+          lv_package_adt TYPE devclass.
+ 
+    check_sapgui( ).
+ 
+    IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_show_default_repo( ) = abap_false.
+      " Don't show the last seen repo at startup
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( || ).
+    ENDIF.
+ 
+    " We have three special cases for gui startup
+    "   - open a specific repo by repo key
+    "   - open a specific repo by package name
+    "   - open a specific repo by package name provided by ADT
+    " These overrule the last shown repo
+ 
+    GET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_repo_key FIELD lv_repo_key.
+    GET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_package  FIELD lv_package.
+    lv_package_adt = get_package_from_adt( ).
+ 
+    IF lv_repo_key IS NOT INITIAL.
+ 
+      SET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_repo_key FIELD ''.
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_repo_key ).
+ 
+    ELSEIF lv_package IS NOT INITIAL.
+ 
+      SET PARAMETER ID zif_abapgit_definitions=>c_spagpa_param_package FIELD ''.
+      set_start_repo_from_package( lv_package ).
+ 
+    ELSEIF lv_package_adt IS NOT INITIAL.
+ 
+      set_start_repo_from_package( lv_package_adt ).
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_start_repo_from_package.
+ 
+    DATA: lo_repo          TYPE REF TO zcl_abapgit_repo,
+          lt_r_package     TYPE RANGE OF devclass,
+          ls_r_package     LIKE LINE OF lt_r_package,
+          lt_superpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt,
+          li_package       TYPE REF TO zif_abapgit_sap_package,
+          lt_repo_list     TYPE zif_abapgit_repo_srv=>ty_repo_list.
+ 
+    FIELD-SYMBOLS: <lo_repo>         TYPE LINE OF zif_abapgit_repo_srv=>ty_repo_list,
+                   <lv_superpackage> LIKE LINE OF lt_superpackages.
+ 
+    li_package = zcl_abapgit_factory=>get_sap_package( iv_package ).
+ 
+    IF li_package->exists( ) = abap_false.
+      RETURN.
+    ENDIF.
+ 
+    ls_r_package-sign   = 'I'.
+    ls_r_package-option = 'EQ'.
+    ls_r_package-low    = iv_package.
+    INSERT ls_r_package INTO TABLE lt_r_package.
+ 
+    " Also consider superpackages. E.g. when some open $abapgit_ui, abapGit repo
+    " should be found via package $abapgit
+    lt_superpackages = li_package->list_superpackages( ).
+    LOOP AT lt_superpackages ASSIGNING <lv_superpackage>.
+      ls_r_package-low = <lv_superpackage>.
+      INSERT ls_r_package INTO TABLE lt_r_package.
+    ENDLOOP.
+ 
+    lt_repo_list = zcl_abapgit_repo_srv=>get_instance( )->list( ).
+ 
+    LOOP AT lt_repo_list ASSIGNING <lo_repo>.
+ 
+      IF <lo_repo>->get_package( ) IN lt_r_package.
+        lo_repo ?= <lo_repo>.
+        EXIT.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF lo_repo IS BOUND.
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lo_repo->get_key( ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/routing/zcl_abapgit_services_basis.clas.abap.html b/src/ui/routing/zcl_abapgit_services_basis.clas.abap.html new file mode 100644 index 00000000000..2d7b2173449 --- /dev/null +++ b/src/ui/routing/zcl_abapgit_services_basis.clas.abap.html @@ -0,0 +1,352 @@ + + + + + + Code coverage report for src/ui/routing/zcl_abapgit_services_basis.clas.abap + + + + + + + + + +
+
+

All files / src/ui/routing zcl_abapgit_services_basis.clas.abap

+
+ +
+ 100% + Statements + 89/89 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 89/89 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +901x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_services_basis DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create_package
+      IMPORTING
+        !iv_prefill_package TYPE devclass OPTIONAL
+      RETURNING
+        VALUE(rv_package)   TYPE devclass
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS open_ie_devtools
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CLASS-METHODS raise_error_if_package_exists
+      IMPORTING
+        iv_devclass TYPE scompkdtln-devclass
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_services_basis IMPLEMENTATION.
+ 
+ 
+  METHOD create_package.
+ 
+    DATA ls_package_data TYPE scompkdtln.
+    DATA lv_create       TYPE abap_bool.
+    DATA li_popup        TYPE REF TO zif_abapgit_popups.
+ 
+    ls_package_data-devclass = to_upper( iv_prefill_package ).
+ 
+    raise_error_if_package_exists( ls_package_data-devclass ).
+ 
+    li_popup = zcl_abapgit_ui_factory=>get_popups( ).
+ 
+    li_popup->popup_to_create_package(
+      IMPORTING
+        es_package_data = ls_package_data
+        ev_create       = lv_create ).
+ 
+    IF lv_create = abap_true.
+      zcl_abapgit_factory=>get_sap_package( ls_package_data-devclass )->create( ls_package_data ).
+      rv_package = ls_package_data-devclass.
+      COMMIT WORK.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD open_ie_devtools.
+    DATA: lv_system_directory TYPE string,
+          lv_exe_full_path    TYPE string,
+          lo_frontend_serv    TYPE REF TO zif_abapgit_frontend_services.
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    IF lo_frontend_serv->is_sapgui_for_windows( ) = abap_false.
+      zcx_abapgit_exception=>raise( |IE DevTools not supported on frontend OS| ).
+    ENDIF.
+ 
+    lo_frontend_serv->get_system_directory( CHANGING cv_system_directory = lv_system_directory ).
+ 
+    cl_gui_cfw=>flush( ).
+ 
+    lv_exe_full_path = lv_system_directory && `\F12\IEChooser.exe`.
+    lo_frontend_serv->execute( iv_application = lv_exe_full_path ).
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_error_if_package_exists.
+ 
+    IF iv_devclass IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    IF zcl_abapgit_factory=>get_sap_package( iv_devclass )->exists( ) = abap_true.
+      zcx_abapgit_exception=>raise( |Package { iv_devclass } already exists| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/routing/zcl_abapgit_services_basis.clas.testclasses.abap.html b/src/ui/routing/zcl_abapgit_services_basis.clas.testclasses.abap.html new file mode 100644 index 00000000000..1c0a646ab01 --- /dev/null +++ b/src/ui/routing/zcl_abapgit_services_basis.clas.testclasses.abap.html @@ -0,0 +1,1399 @@ + + + + + + Code coverage report for src/ui/routing/zcl_abapgit_services_basis.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui/routing zcl_abapgit_services_basis.clas.testclasses.abap

+
+ +
+ 69.4% + Statements + 304/438 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/26 +
+ + +
+ 69.4% + Lines + 304/438 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +4391x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
*"* use this source file for your ABAP unit test classes
+CLASS ltcl_sap_package_mock DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    INTERFACES:
+      zif_abapgit_sap_package.
+ 
+    CONSTANTS:
+      BEGIN OF c_package,
+        existing     TYPE devclass VALUE '$EXISTING',
+        non_existing TYPE devclass VALUE '$NON_EXISTING',
+        user         TYPE devclass VALUE '$USER',
+      END OF c_package.
+ 
+    METHODS:
+      constructor
+        IMPORTING
+          iv_package TYPE devclass,
+ 
+      was_create_called
+        RETURNING
+          VALUE(rv_create_called) TYPE abap_bool.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mv_package TYPE devclass,
+      BEGIN OF ms_called,
+        create TYPE abap_bool,
+      END OF ms_called.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_popups_mock DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    TYPES:
+      ty_user_decision TYPE string.
+ 
+    CONSTANTS:
+      BEGIN OF c_user_decision,
+        cancel  TYPE ty_user_decision VALUE 'cancel',
+        confirm TYPE ty_user_decision VALUE 'confirm',
+      END OF c_user_decision.
+ 
+    INTERFACES:
+      zif_abapgit_popups.
+ 
+    METHODS:
+      was_create_package_popup_shown
+        RETURNING
+          VALUE(rv_popup_shown) TYPE abap_bool,
+ 
+      set_user_decision
+        IMPORTING
+          iv_user_decision TYPE ty_user_decision,
+ 
+      set_package
+        IMPORTING
+          iv_package TYPE devclass.
+ 
+  PRIVATE SECTION.
+    DATA:
+      BEGIN OF ms_called,
+        popup_to_create_package TYPE abap_bool,
+      END OF ms_called,
+      mv_user_decision TYPE ty_user_decision,
+      mv_package       TYPE devclass.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_create_package DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+  PUBLIC SECTION.
+  PRIVATE SECTION.
+    DATA:
+      mv_package          TYPE devclass,
+      mx_error            TYPE REF TO zcx_abapgit_exception,
+      mo_popups_mock      TYPE REF TO ltcl_popups_mock,
+      mo_sap_package_mock TYPE REF TO ltcl_sap_package_mock,
+      mv_created_package  TYPE devclass.
+ 
+    METHODS:
+      setup,
+ 
+      raise_error_if_package_exists FOR TESTING RAISING cx_static_check,
+      package_given_in_popup      FOR TESTING RAISING cx_static_check,
+      package_not_created_when_canc FOR TESTING RAISING cx_static_check,
+      package_created_when_confirm  FOR TESTING RAISING cx_static_check,
+ 
+      given_existing_package,
+      given_non_existing_package,
+      given_user_cancels_popup,
+      given_user_confirms_popup,
+      given_no_package,
+      given_package_by_user,
+ 
+      when_create_package,
+ 
+      then_error_is_raised,
+      then_popup_is_shown,
+      then_no_package_is_created,
+      then_package_is_created,
+      then_no_error_is_raised.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_create_package IMPLEMENTATION.
+ 
+  METHOD setup.
+
+    CREATE OBJECT mo_popups_mock TYPE ltcl_popups_mock.
+    zcl_abapgit_ui_injector=>set_popups( mo_popups_mock ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_error_if_package_exists.
+
+    given_existing_package( ).
+    when_create_package( ).
+    then_error_is_raised( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD package_given_in_popup.
+
+    given_no_package( ).
+    given_package_by_user( ).
+    given_user_confirms_popup( ).
+    when_create_package( ).
+    then_no_error_is_raised( ).
+    then_popup_is_shown( ).
+    then_package_is_created( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD package_not_created_when_canc.
+
+    given_non_existing_package( ).
+    given_user_cancels_popup( ).
+    when_create_package( ).
+    then_popup_is_shown( ).
+    then_no_package_is_created( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD package_created_when_confirm.
+
+    given_non_existing_package( ).
+    given_user_confirms_popup( ).
+    when_create_package( ).
+    then_popup_is_shown( ).
+    then_package_is_created( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD when_create_package.
+
+    CREATE OBJECT mo_sap_package_mock
+      EXPORTING
+        iv_package = mv_package.
+
+    zcl_abapgit_injector=>set_sap_package(
+        iv_package     = mv_package
+        ii_sap_package = mo_sap_package_mock ).
+
+    TRY.
+        mv_created_package = zcl_abapgit_services_basis=>create_package( mv_package ).
+      CATCH zcx_abapgit_exception INTO mx_error.
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD given_existing_package.
+
+    mv_package = ltcl_sap_package_mock=>c_package-existing.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD given_non_existing_package.
+
+    mv_package = ltcl_sap_package_mock=>c_package-non_existing.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD then_error_is_raised.
+
+    cl_abap_unit_assert=>assert_bound( mx_error ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD then_no_error_is_raised.
+
+    cl_abap_unit_assert=>assert_not_bound( mx_error ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD then_popup_is_shown.
+
+    cl_abap_unit_assert=>assert_true( mo_popups_mock->was_create_package_popup_shown( )  ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD given_user_cancels_popup.
+
+    mo_popups_mock->set_user_decision( ltcl_popups_mock=>c_user_decision-cancel ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD then_no_package_is_created.
+
+    cl_abap_unit_assert=>assert_false( mo_sap_package_mock->was_create_called( ) ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD given_user_confirms_popup.
+
+    mo_popups_mock->set_user_decision( ltcl_popups_mock=>c_user_decision-confirm ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD then_package_is_created.
+
+    cl_abap_unit_assert=>assert_true( mo_sap_package_mock->was_create_called( ) ).
+    cl_abap_unit_assert=>assert_equals(
+        exp = mv_package
+        act = mv_created_package ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD given_no_package.
+
+    CLEAR: mv_package.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD given_package_by_user.
+
+    mo_popups_mock->set_package( ltcl_sap_package_mock=>c_package-user ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_sap_package_mock IMPLEMENTATION.
+ 
+  METHOD constructor.
+ 
+    mv_package = iv_package.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_responsible.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~validate_name.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_description.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~are_changes_recorded_in_tr_req.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create.
+
+    ms_called-create = abap_true.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_child.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~create_local.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~exists.
+ 
+    rv_bool = boolc( c_package-existing = mv_package ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_type.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~get_transport_layer.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_subpackages.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~list_superpackages.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_sap_package~read_parent.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD was_create_called.
+ 
+    rv_create_called = ms_called-create.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_popups_mock IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_popups~branch_list_popup.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~commit_list_popup.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~create_branch_popup.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_folder_logic.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_search_help.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_confirm.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_create_package.
+
+    ms_called-popup_to_create_package = abap_true.
+
+    CASE mv_user_decision.
+      WHEN c_user_decision-cancel.
+        ev_create = abap_false.
+      WHEN c_user_decision-confirm.
+        ev_create = abap_true.
+      WHEN OTHERS.
+        cl_abap_unit_assert=>fail( ).
+    ENDCASE.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_create_transp_branch.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_from_list.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_transports.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_transport_request.
+ 
+  ENDMETHOD.
+ 
+  METHOD was_create_package_popup_shown.
+ 
+    rv_popup_shown = ms_called-popup_to_create_package.
+ 
+  ENDMETHOD.
+ 
+  METHOD set_user_decision.
+
+    mv_user_decision = iv_user_decision.
+
+  ENDMETHOD.
+ 
+  METHOD set_package.
+
+    mv_package = iv_package.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_select_tr_requests.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_select_wb_tc_tr_and_tsk.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~tag_list_popup.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_labels.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~choose_code_insp_check_variant.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/routing/zcl_abapgit_services_git.clas.abap.html b/src/ui/routing/zcl_abapgit_services_git.clas.abap.html new file mode 100644 index 00000000000..8adde5dd0dd --- /dev/null +++ b/src/ui/routing/zcl_abapgit_services_git.clas.abap.html @@ -0,0 +1,841 @@ + + + + + + Code coverage report for src/ui/routing/zcl_abapgit_services_git.clas.abap + + + + + + + + + +
+
+

All files / src/ui/routing zcl_abapgit_services_git.clas.abap

+
+ +
+ 100% + Statements + 252/252 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 252/252 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +2531x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_services_git DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS pull
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS create_branch
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS switch_branch
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS delete_branch
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS delete_tag
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS switch_tag
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS commit
+      IMPORTING
+        !io_repo   TYPE REF TO zcl_abapgit_repo_online
+        !is_commit TYPE zif_abapgit_services_git=>ty_commit_fields
+        !io_stage  TYPE REF TO zcl_abapgit_stage
+      RAISING
+        zcx_abapgit_exception.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_services_git IMPLEMENTATION.
+ 
+ 
+  METHOD commit.
+ 
+    DATA: ls_comment TYPE zif_abapgit_git_definitions=>ty_comment,
+          li_user    TYPE REF TO zif_abapgit_persist_user.
+ 
+    li_user = zcl_abapgit_persistence_user=>get_instance( ).
+    li_user->set_repo_git_user_name( iv_url      = io_repo->get_url( )
+                                     iv_username = is_commit-committer_name ).
+    li_user->set_repo_git_user_email( iv_url   = io_repo->get_url( )
+                                      iv_email = is_commit-committer_email ).
+ 
+    IF is_commit-committer_name IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Commit: Committer name empty' ).
+    ELSEIF is_commit-committer_email IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Commit: Committer email empty' ).
+    ELSEIF is_commit-author_email IS NOT INITIAL AND is_commit-author_name IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Commit: Author name empty' ). " Opposite should be OK ?
+    ELSEIF is_commit-comment IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Commit: empty comment' ).
+    ENDIF.
+ 
+    ls_comment-committer-name  = is_commit-committer_name.
+    ls_comment-committer-email = is_commit-committer_email.
+    ls_comment-author-name     = is_commit-author_name.
+    ls_comment-author-email    = is_commit-author_email.
+    ls_comment-comment         = is_commit-comment.
+ 
+    IF NOT is_commit-body IS INITIAL.
+      CONCATENATE ls_comment-comment '' is_commit-body
+        INTO ls_comment-comment SEPARATED BY cl_abap_char_utilities=>newline.
+    ENDIF.
+ 
+    zcl_abapgit_exit=>get_instance(  )->validate_before_push(
+      is_comment = ls_comment
+      io_stage   = io_stage
+      io_repo    = io_repo ).
+ 
+    io_repo->push( is_comment = ls_comment
+                   io_stage   = io_stage ).
+ 
+    COMMIT WORK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_branch.
+ 
+    DATA: lv_name               TYPE string,
+          lv_cancel             TYPE abap_bool,
+          lo_repo               TYPE REF TO zcl_abapgit_repo_online,
+          lv_msg                TYPE string,
+          li_popups             TYPE REF TO zif_abapgit_popups,
+          lv_source_branch_name TYPE string.
+ 
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    lv_source_branch_name = lo_repo->get_selected_branch( ).
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+    li_popups->create_branch_popup(
+      EXPORTING
+        iv_source_branch_name = lv_source_branch_name
+      IMPORTING
+        ev_name               = lv_name
+        ev_cancel             = lv_cancel ).
+ 
+    IF lv_cancel = abap_true.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    lo_repo->create_branch( lv_name ).
+ 
+    lv_msg = |Branch switched from { zcl_abapgit_git_branch_list=>get_display_name( lv_source_branch_name )
+      } to new branch { zcl_abapgit_git_branch_list=>get_display_name( lv_name ) }|.
+    MESSAGE lv_msg TYPE 'S'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_branch.
+ 
+    DATA: lo_repo   TYPE REF TO zcl_abapgit_repo_online,
+          ls_branch TYPE zif_abapgit_git_definitions=>ty_git_branch,
+          lv_msg    TYPE string,
+          li_popups TYPE REF TO zif_abapgit_popups.
+ 
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+    ls_branch = li_popups->branch_list_popup( iv_url         = lo_repo->get_url( )
+                                              iv_hide_branch = lo_repo->get_selected_branch( )
+                                              iv_hide_head   = abap_true ).
+    IF ls_branch IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    zcl_abapgit_git_porcelain=>delete_branch(
+      iv_url    = lo_repo->get_url( )
+      is_branch = ls_branch ).
+ 
+    lv_msg = |Branch { ls_branch-display_name } deleted|.
+    MESSAGE lv_msg TYPE 'S'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_tag.
+ 
+    DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online,
+          ls_tag  TYPE zif_abapgit_git_definitions=>ty_git_tag,
+          lv_text TYPE string.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    ls_tag = zcl_abapgit_ui_factory=>get_popups( )->tag_list_popup( lo_repo->get_url( ) ).
+    IF ls_tag IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    zcl_abapgit_git_porcelain=>delete_tag(
+      iv_url = lo_repo->get_url( )
+      is_tag = ls_tag ).
+ 
+    lv_text = |Tag { ls_tag-display_name } deleted|.
+ 
+    MESSAGE lv_text TYPE 'S'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD pull.
+ 
+    DATA: lo_repo TYPE REF TO zcl_abapgit_repo.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    lo_repo->refresh( ).
+ 
+    zcl_abapgit_services_repo=>gui_deserialize( lo_repo ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_branch.
+ 
+    DATA: lo_repo   TYPE REF TO zcl_abapgit_repo_online,
+          ls_branch TYPE zif_abapgit_git_definitions=>ty_git_branch.
+ 
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    ls_branch = zcl_abapgit_ui_factory=>get_popups( )->branch_list_popup(
+      iv_url             = lo_repo->get_url( )
+      iv_default_branch  = lo_repo->get_selected_branch( )
+      iv_show_new_option = abap_true ).
+    IF ls_branch IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    IF ls_branch-name = zif_abapgit_popups=>c_new_branch_label.
+      create_branch( iv_key ).
+      RETURN.
+    ENDIF.
+ 
+    IF lo_repo->get_selected_commit( ) IS NOT INITIAL.
+      lo_repo->select_commit( space ).
+    ENDIF.
+ 
+    lo_repo->select_branch( ls_branch-name ).
+    COMMIT WORK AND WAIT.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD switch_tag.
+ 
+    DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online,
+          ls_tag  TYPE zif_abapgit_git_definitions=>ty_git_tag,
+          lv_text TYPE string.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    ls_tag = zcl_abapgit_ui_factory=>get_popups( )->tag_list_popup( lo_repo->get_url( ) ).
+    IF ls_tag IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    lo_repo->select_branch( zcl_abapgit_git_tag=>remove_peel( ls_tag-name ) ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+    lv_text = |Tag switched to { ls_tag-display_name } |.
+ 
+    MESSAGE lv_text TYPE 'S'.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/routing/zcl_abapgit_services_repo.clas.abap.html b/src/ui/routing/zcl_abapgit_services_repo.clas.abap.html new file mode 100644 index 00000000000..a989bbbf163 --- /dev/null +++ b/src/ui/routing/zcl_abapgit_services_repo.clas.abap.html @@ -0,0 +1,2206 @@ + + + + + + Code coverage report for src/ui/routing/zcl_abapgit_services_repo.clas.abap + + + + + + + + + +
+
+

All files / src/ui/routing zcl_abapgit_services_repo.clas.abap

+
+ +
+ 100% + Statements + 707/707 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 707/707 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +7081x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_services_repo DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS new_online
+      IMPORTING
+        !is_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params
+      RETURNING
+        VALUE(ro_repo)  TYPE REF TO zcl_abapgit_repo_online
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS refresh
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS remove
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS purge
+      IMPORTING
+        !iv_key       TYPE zif_abapgit_persistence=>ty_repo-key
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS new_offline
+      IMPORTING
+        !is_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params
+      RETURNING
+        VALUE(ro_repo)  TYPE REF TO zcl_abapgit_repo_offline
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS refresh_local_checksums
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS toggle_favorite
+      IMPORTING
+        !iv_key TYPE zif_abapgit_persistence=>ty_repo-key
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS transport_to_branch
+      IMPORTING
+        !iv_repository_key TYPE zif_abapgit_persistence=>ty_value
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS gui_deserialize
+      IMPORTING
+        !io_repo TYPE REF TO zcl_abapgit_repo
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS activate_objects
+      IMPORTING
+        !iv_key       TYPE zif_abapgit_persistence=>ty_repo-key
+      RETURNING
+        VALUE(ri_log) TYPE REF TO zif_abapgit_log
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS delete_unnecessary_objects
+      IMPORTING
+        !io_repo   TYPE REF TO zcl_abapgit_repo
+        !ii_log    TYPE REF TO zif_abapgit_log
+        !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS popup_decisions
+      IMPORTING
+        !io_repo   TYPE REF TO zcl_abapgit_repo
+      CHANGING
+        !cs_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks
+      RAISING
+        zcx_abapgit_cancel
+        zcx_abapgit_exception .
+    CLASS-METHODS popup_overwrite
+      CHANGING
+        !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS popup_package_overwrite
+      CHANGING
+        !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS check_package
+      IMPORTING
+        !is_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_services_repo IMPLEMENTATION.
+ 
+ 
+  METHOD activate_objects.
+ 
+    DATA:
+      lo_repo       TYPE REF TO zcl_abapgit_repo,
+      lo_browser    TYPE REF TO zcl_abapgit_repo_content_list,
+      lt_repo_items TYPE zif_abapgit_definitions=>ty_repo_item_tt,
+      lv_count      TYPE i,
+      lv_message    TYPE string.
+ 
+    FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_repo_items.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    CREATE OBJECT lo_browser
+      EXPORTING
+        io_repo = lo_repo.
+ 
+    lt_repo_items = lo_browser->list( '/' ).
+ 
+    ri_log = lo_repo->create_new_log( 'Activation Log' ).
+ 
+    " Add all inactive objects to activation queue
+    zcl_abapgit_objects_activation=>clear( ).
+ 
+    LOOP AT lt_repo_items ASSIGNING <ls_item> WHERE inactive = abap_true.
+      zcl_abapgit_objects_activation=>add(
+        iv_type = <ls_item>-obj_type
+        iv_name = <ls_item>-obj_name ).
+      lv_count = lv_count + 1.
+    ENDLOOP.
+ 
+    IF lv_count = 0.
+      MESSAGE 'No inactive objects found' TYPE 'S'.
+      RETURN.
+    ENDIF.
+ 
+    " Activate DDIC + non-DDIC
+    zcl_abapgit_objects_activation=>activate(
+      iv_ddic = abap_true
+      ii_log  = ri_log ).
+ 
+    zcl_abapgit_objects_activation=>activate(
+      iv_ddic = abap_false
+      ii_log  = ri_log ).
+ 
+    IF ri_log->get_status( ) <> zif_abapgit_log=>c_status-error.
+      lv_message = |Successfully activated { lv_count } objects|.
+      MESSAGE lv_message TYPE 'S'.
+    ENDIF.
+ 
+    lo_repo->refresh( iv_drop_log = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD check_package.
+ 
+    DATA:
+      li_repo     TYPE REF TO zif_abapgit_repo,
+      li_repo_srv TYPE REF TO zif_abapgit_repo_srv,
+      lv_reason   TYPE string.
+ 
+    " make sure package is not already in use for a different repository
+    " 702: chaining calls with exp&imp parameters causes syntax error
+    li_repo_srv = zcl_abapgit_repo_srv=>get_instance( ).
+    li_repo_srv->get_repo_from_package(
+      EXPORTING
+        iv_package    = is_repo_params-package
+        iv_ign_subpkg = is_repo_params-ignore_subpackages
+      IMPORTING
+        ei_repo    = li_repo
+        ev_reason  = lv_reason ).
+ 
+    IF li_repo IS BOUND.
+      zcx_abapgit_exception=>raise( lv_reason ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD delete_unnecessary_objects.
+ 
+    DATA:
+      ls_checks TYPE zif_abapgit_definitions=>ty_delete_checks,
+      ls_tadir  TYPE zif_abapgit_definitions=>ty_tadir,
+      lt_tadir  TYPE zif_abapgit_definitions=>ty_tadir_tt.
+ 
+    FIELD-SYMBOLS <ls_overwrite> LIKE LINE OF is_checks-overwrite.
+ 
+    " get confirmed deletions
+    LOOP AT is_checks-overwrite ASSIGNING <ls_overwrite>
+      WHERE ( action = zif_abapgit_objects=>c_deserialize_action-delete
+      OR action = zif_abapgit_objects=>c_deserialize_action-delete_add )
+      AND decision = zif_abapgit_definitions=>c_yes.
+ 
+      ls_tadir-pgmid    = 'R3TR'.
+      ls_tadir-object   = <ls_overwrite>-obj_type.
+      ls_tadir-obj_name = <ls_overwrite>-obj_name.
+      ls_tadir-devclass = <ls_overwrite>-devclass.
+      INSERT ls_tadir INTO TABLE lt_tadir.
+ 
+    ENDLOOP.
+ 
+    " todo, check if object type supports deletion of parts to avoid deleting complete object
+ 
+    " delete objects
+    IF lines( lt_tadir ) > 0.
+      ls_checks-transport = is_checks-transport.
+ 
+      zcl_abapgit_objects=>delete( it_tadir  = lt_tadir
+                                   is_checks = ls_checks
+                                   ii_log    = ii_log ).
+ 
+      io_repo->refresh( iv_drop_log = abap_false ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD gui_deserialize.
+ 
+    DATA:
+      lv_msg    TYPE string,
+      ls_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks,
+      li_log    TYPE REF TO zif_abapgit_log.
+ 
+    " find troublesome objects
+    ls_checks = io_repo->deserialize_checks( ).
+ 
+    IF ls_checks-overwrite IS INITIAL.
+      zcx_abapgit_exception=>raise(
+        'There is nothing to pull. The local state completely matches the remote repository.' ).
+    ENDIF.
+ 
+    " let the user decide what to do
+    TRY.
+        popup_decisions(
+          EXPORTING
+            io_repo   = io_repo
+          CHANGING
+            cs_checks = ls_checks ).
+ 
+      CATCH zcx_abapgit_cancel.
+        RETURN.
+    ENDTRY.
+ 
+    li_log = io_repo->create_new_log( 'Pull Log' ).
+ 
+    " pass decisions to delete
+    delete_unnecessary_objects(
+      io_repo   = io_repo
+      is_checks = ls_checks
+      ii_log    = li_log ).
+ 
+    " pass decisions to deserialize
+    io_repo->deserialize(
+      is_checks = ls_checks
+      ii_log    = li_log ).
+ 
+    IF li_log->get_status( ) = zif_abapgit_log=>c_status-ok.
+      lv_msg = |Repository { io_repo->get_name( ) } successfully pulled for package { io_repo->get_package( ) }|.
+      MESSAGE lv_msg TYPE 'S'.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new_offline.
+ 
+    check_package( is_repo_params ).
+ 
+    " create new repo and add to favorites
+    ro_repo ?= zcl_abapgit_repo_srv=>get_instance( )->new_offline(
+      iv_url            = is_repo_params-url
+      iv_package        = is_repo_params-package
+      iv_folder_logic   = is_repo_params-folder_logic
+      iv_labels         = is_repo_params-labels
+      iv_main_lang_only = is_repo_params-main_lang_only ).
+ 
+    " Make sure there're no leftovers from previous repos
+    ro_repo->zif_abapgit_repo~checksums( )->rebuild( ).
+    ro_repo->reset_status( ). " TODO refactor later
+ 
+    toggle_favorite( ro_repo->get_key( ) ).
+ 
+    " Set default repo for user
+    zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( ro_repo->get_key( ) ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD new_online.
+ 
+    check_package( is_repo_params ).
+ 
+    ro_repo ?= zcl_abapgit_repo_srv=>get_instance( )->new_online(
+      iv_url            = is_repo_params-url
+      iv_branch_name    = is_repo_params-branch_name
+      iv_package        = is_repo_params-package
+      iv_display_name   = is_repo_params-display_name
+      iv_folder_logic   = is_repo_params-folder_logic
+      iv_labels         = is_repo_params-labels
+      iv_ign_subpkg     = is_repo_params-ignore_subpackages
+      iv_main_lang_only = is_repo_params-main_lang_only ).
+ 
+    " Make sure there're no leftovers from previous repos
+    ro_repo->zif_abapgit_repo~checksums( )->rebuild( ).
+    ro_repo->reset_status( ). " TODO refactor later
+ 
+    toggle_favorite( ro_repo->get_key( ) ).
+ 
+    " Set default repo for user
+    zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( ro_repo->get_key( ) ).
+ 
+    COMMIT WORK AND WAIT.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD popup_decisions.
+ 
+    DATA:
+      lt_decision     TYPE zif_abapgit_definitions=>ty_overwrite_tt,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      lt_dependencies TYPE zif_abapgit_apack_definitions=>ty_dependencies.
+ 
+    FIELD-SYMBOLS:
+      <ls_overwrite> LIKE LINE OF cs_checks-overwrite,
+      <ls_decision>  LIKE LINE OF lt_decision.
+ 
+    lt_decision = cs_checks-overwrite.
+ 
+    " If there's a new namespace, it has to be pulled before all other objects
+    READ TABLE lt_decision ASSIGNING <ls_decision> WITH KEY obj_type = 'NSPC'.
+    IF sy-subrc = 0 AND <ls_decision>-action = zif_abapgit_objects=>c_deserialize_action-add.
+      <ls_decision>-decision = zif_abapgit_definitions=>c_yes.
+    ELSE.
+      " Set all new objects to YES
+      LOOP AT lt_decision ASSIGNING <ls_decision> WHERE action = zif_abapgit_objects=>c_deserialize_action-add.
+        <ls_decision>-decision = zif_abapgit_definitions=>c_yes.
+      ENDLOOP.
+    ENDIF.
+ 
+    " Ask user what to do
+    popup_overwrite( CHANGING ct_overwrite = lt_decision ).
+    popup_package_overwrite( CHANGING ct_overwrite = cs_checks-warning_package ).
+ 
+    IF cs_checks-requirements-met = zif_abapgit_definitions=>c_no.
+      lt_requirements = io_repo->get_dot_abapgit( )->get_data( )-requirements.
+      zcl_abapgit_requirement_helper=>requirements_popup( lt_requirements ).
+      cs_checks-requirements-decision = zif_abapgit_definitions=>c_yes.
+    ENDIF.
+ 
+    IF cs_checks-dependencies-met = zif_abapgit_definitions=>c_no.
+      lt_dependencies = io_repo->get_dot_apack( )->get_manifest_descriptor( )-dependencies.
+      zcl_abapgit_apack_helper=>dependencies_popup( lt_dependencies ).
+    ENDIF.
+ 
+    IF  cs_checks-transport-required = abap_true
+    AND cs_checks-transport-transport IS INITIAL.
+      cs_checks-transport-transport = zcl_abapgit_ui_factory=>get_popups( )->popup_transport_request(
+        is_transport_type = cs_checks-transport-type ).
+    ENDIF.
+ 
+    " Update decisions
+    LOOP AT cs_checks-overwrite ASSIGNING <ls_overwrite>.
+      READ TABLE lt_decision ASSIGNING <ls_decision> WITH KEY object_type_and_name COMPONENTS
+        obj_type = <ls_overwrite>-obj_type
+        obj_name = <ls_overwrite>-obj_name.
+      ASSERT sy-subrc = 0.
+      <ls_overwrite>-decision = <ls_decision>-decision.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD popup_overwrite.
+ 
+    DATA: lt_columns  TYPE zif_abapgit_popups=>ty_alv_column_tt,
+          lt_selected LIKE ct_overwrite,
+          li_popups   TYPE REF TO zif_abapgit_popups.
+    DATA lt_preselected_rows TYPE zif_abapgit_popups=>ty_rows.
+ 
+    FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF ct_overwrite,
+                   <ls_column>    TYPE zif_abapgit_popups=>ty_alv_column.
+ 
+ 
+    IF lines( ct_overwrite ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'OBJ_TYPE'.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'OBJ_NAME'.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'DEVCLASS'.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'STATE'.
+    <ls_column>-text = 'State'.
+    <ls_column>-length = 3.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'ICON'.
+    <ls_column>-text = 'Action'.
+    <ls_column>-show_icon = abap_true.
+    <ls_column>-length = 5.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'TEXT'.
+    <ls_column>-text = 'Description'.
+ 
+    LOOP AT ct_overwrite ASSIGNING <ls_overwrite> WHERE decision = zif_abapgit_definitions=>c_yes.
+      INSERT sy-tabix INTO TABLE lt_preselected_rows.
+    ENDLOOP.
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+    li_popups->popup_to_select_from_list(
+      EXPORTING
+        it_list               = ct_overwrite
+        iv_header_text        = |The following objects are different between local and remote repository.|
+                             && | Select the objects which should be brought in line with the remote version.|
+        iv_select_column_text = 'Change?'
+        it_columns_to_display = lt_columns
+        it_preselected_rows   = lt_preselected_rows
+      IMPORTING
+        et_list               = lt_selected ).
+ 
+    LOOP AT ct_overwrite ASSIGNING <ls_overwrite>.
+      READ TABLE lt_selected WITH TABLE KEY object_type_and_name
+                             COMPONENTS obj_type = <ls_overwrite>-obj_type
+                                        obj_name = <ls_overwrite>-obj_name
+                             TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        <ls_overwrite>-decision = zif_abapgit_definitions=>c_yes.
+      ELSE.
+        <ls_overwrite>-decision = zif_abapgit_definitions=>c_no.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD popup_package_overwrite.
+ 
+    DATA: lt_columns  TYPE zif_abapgit_popups=>ty_alv_column_tt,
+          lt_selected LIKE ct_overwrite,
+          li_popups   TYPE REF TO zif_abapgit_popups.
+ 
+    FIELD-SYMBOLS: <ls_overwrite> LIKE LINE OF ct_overwrite,
+                   <ls_column>    TYPE zif_abapgit_popups=>ty_alv_column.
+ 
+    IF lines( ct_overwrite ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'OBJ_TYPE'.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'OBJ_NAME'.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'DEVCLASS'.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'STATE'.
+    <ls_column>-text = 'State'.
+    <ls_column>-length = 3.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'ICON'.
+    <ls_column>-text = 'Action'.
+    <ls_column>-show_icon = abap_true.
+    <ls_column>-length = 5.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'TEXT'.
+    <ls_column>-text = 'Description'.
+ 
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+    li_popups->popup_to_select_from_list(
+      EXPORTING
+        it_list               = ct_overwrite
+        iv_header_text        = |The following objects have been created in other packages.|
+                             && | Select the objects which should be overwritten.|
+        iv_select_column_text = |Overwrite?|
+        it_columns_to_display = lt_columns
+      IMPORTING
+        et_list               = lt_selected ).
+ 
+    LOOP AT ct_overwrite ASSIGNING <ls_overwrite>.
+ 
+      READ TABLE lt_selected WITH TABLE KEY object_type_and_name
+                             COMPONENTS obj_type = <ls_overwrite>-obj_type
+                                        obj_name = <ls_overwrite>-obj_name
+                             TRANSPORTING NO FIELDS.
+      IF sy-subrc = 0.
+        <ls_overwrite>-decision = zif_abapgit_definitions=>c_yes.
+      ELSE.
+        <ls_overwrite>-decision = zif_abapgit_definitions=>c_no.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD purge.
+ 
+    DATA: lt_tadir     TYPE zif_abapgit_definitions=>ty_tadir_tt,
+          lv_answer    TYPE c LENGTH 1,
+          lo_repo      TYPE REF TO zcl_abapgit_repo,
+          lv_package   TYPE devclass,
+          lv_question  TYPE c LENGTH 100,
+          ls_checks    TYPE zif_abapgit_definitions=>ty_delete_checks,
+          lv_repo_name TYPE string,
+          lv_message   TYPE string.
+ 
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    lv_repo_name = lo_repo->get_name( ).
+ 
+    lv_package = lo_repo->get_package( ).
+    lt_tadir   = zcl_abapgit_factory=>get_tadir( )->read( lv_package ).
+ 
+    IF lines( lt_tadir ) > 0.
+ 
+      lv_question = |This will DELETE all objects in package { lv_package
+        } including subpackages ({ lines( lt_tadir ) } objects) from the system|.
+ 
+      lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+        iv_titlebar              = 'Uninstall'
+        iv_text_question         = lv_question
+        iv_text_button_1         = 'Delete'
+        iv_icon_button_1         = 'ICON_DELETE'
+        iv_text_button_2         = 'Cancel'
+        iv_icon_button_2         = 'ICON_CANCEL'
+        iv_default_button        = '2'
+        iv_display_cancel_button = abap_false ).
+ 
+      IF lv_answer = '2'.
+        RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+      ENDIF.
+ 
+    ENDIF.
+ 
+    ls_checks = lo_repo->delete_checks( ).
+    IF ls_checks-transport-required = abap_true.
+      ls_checks-transport-transport = zcl_abapgit_ui_factory=>get_popups(
+                                        )->popup_transport_request( ls_checks-transport-type ).
+    ENDIF.
+ 
+    ri_log = zcl_abapgit_repo_srv=>get_instance( )->purge(
+      ii_repo   = lo_repo
+      is_checks = ls_checks ).
+ 
+    COMMIT WORK.
+ 
+    IF ri_log IS BOUND AND ri_log->get_status( ) = zif_abapgit_log=>c_status-error.
+      zcl_abapgit_log_viewer=>show_log( ri_log ).
+      RETURN.
+    ENDIF.
+ 
+    lv_message = |Repository { lv_repo_name } successfully uninstalled from Package { lv_package }. |.
+    MESSAGE lv_message TYPE 'S'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh.
+ 
+    zcl_abapgit_repo_srv=>get_instance( )->get( iv_key )->refresh( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD refresh_local_checksums.
+ 
+    DATA: lv_answer   TYPE c,
+          lv_question TYPE string,
+          lo_repo     TYPE REF TO zcl_abapgit_repo.
+ 
+ 
+    IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-update_local_checksum ) = abap_false.
+      zcx_abapgit_exception=>raise( 'Not authorized' ).
+    ENDIF.
+ 
+    lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+ 
+    lv_question = 'This will rebuild and overwrite local repo checksums.'.
+ 
+    IF lo_repo->is_offline( ) = abap_false.
+      lv_question = lv_question
+                && ' The logic: if local and remote file differs then:'
+                && ' if remote branch is ahead then assume changes are remote,'
+                && ' else (branches are equal) assume changes are local.'
+                && ' This will lead to incorrect state for files changed on both sides.'
+                && ' Please make sure you don''t have ones like that.'.
+    ENDIF.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar              = 'Warning'
+      iv_text_question         = lv_question
+      iv_text_button_1         = 'OK'
+      iv_icon_button_1         = 'ICON_DELETE'
+      iv_text_button_2         = 'Cancel'
+      iv_icon_button_2         = 'ICON_CANCEL'
+      iv_default_button        = '2'
+      iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer = '2'.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    lo_repo->zif_abapgit_repo~checksums( )->rebuild( ).
+    lo_repo->reset_status( ). " TODO refactor later
+ 
+    COMMIT WORK AND WAIT.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remove.
+ 
+    DATA: lv_answer    TYPE c LENGTH 1,
+          li_repo      TYPE REF TO zif_abapgit_repo,
+          lv_package   TYPE devclass,
+          lv_question  TYPE c LENGTH 200,
+          lv_repo_name TYPE string,
+          lv_message   TYPE string.
+ 
+ 
+    li_repo      = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
+    lv_repo_name = li_repo->get_name( ).
+    lv_package   = li_repo->get_package( ).
+    lv_question  = |This will remove the repository reference to the package { lv_package
+      }. All objects will safely remain in the system.|.
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar              = 'Remove'
+      iv_text_question         = lv_question
+      iv_text_button_1         = 'Remove'
+      iv_icon_button_1         = 'ICON_WF_UNLINK'
+      iv_text_button_2         = 'Cancel'
+      iv_icon_button_2         = 'ICON_CANCEL'
+      iv_default_button        = '2'
+      iv_display_cancel_button = abap_false ).
+ 
+    IF lv_answer = '2'.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    zcl_abapgit_repo_srv=>get_instance( )->delete( li_repo ).
+ 
+    COMMIT WORK.
+ 
+    lv_message = |Reference to repository { lv_repo_name } successfully removed from Package { lv_package }. |.
+    MESSAGE lv_message TYPE 'S'.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD toggle_favorite.
+ 
+    zcl_abapgit_persistence_user=>get_instance( )->toggle_favorite( iv_key ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD transport_to_branch.
+ 
+    DATA:
+      lo_repository          TYPE REF TO zcl_abapgit_repo_online,
+      lo_transport_to_branch TYPE REF TO zcl_abapgit_transport_2_branch,
+      lt_transport_headers   TYPE trwbo_request_headers,
+      lt_transport_objects   TYPE zif_abapgit_definitions=>ty_tadir_tt,
+      ls_transport_to_branch TYPE zif_abapgit_definitions=>ty_transport_to_branch.
+ 
+ 
+    IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>c_authorization-transport_to_branch ) = abap_false.
+      zcx_abapgit_exception=>raise( 'Not authorized' ).
+    ENDIF.
+ 
+    lo_repository ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_repository_key ).
+ 
+    lt_transport_headers = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
+    " Also include deleted objects that are included in transport
+    lt_transport_objects = zcl_abapgit_transport=>to_tadir(
+      it_transport_headers = lt_transport_headers
+      iv_deleted_objects   = abap_true ).
+    IF lt_transport_objects IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Canceled or List of objects is empty ' ).
+    ENDIF.
+ 
+    ls_transport_to_branch = zcl_abapgit_ui_factory=>get_popups( )->popup_to_create_transp_branch(
+      lt_transport_headers ).
+ 
+    CREATE OBJECT lo_transport_to_branch.
+    lo_transport_to_branch->create(
+      io_repository          = lo_repository
+      is_transport_to_branch = ls_transport_to_branch
+      it_transport_objects   = lt_transport_objects ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zabapgit_js_common.w3mi.data.js.html b/src/ui/zabapgit_js_common.w3mi.data.js.html new file mode 100644 index 00000000000..381c046b9a8 --- /dev/null +++ b/src/ui/zabapgit_js_common.w3mi.data.js.html @@ -0,0 +1,7630 @@ + + + + + + Code coverage report for src/ui/zabapgit_js_common.w3mi.data.js + + + + + + + + + +
+
+

All files / src/ui zabapgit_js_common.w3mi.data.js

+
+ +
+ 0% + Statements + 0/2516 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/2516 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039 +2040 +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056 +2057 +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072 +2073 +2074 +2075 +2076 +2077 +2078 +2079 +2080 +2081 +2082 +2083 +2084 +2085 +2086 +2087 +2088 +2089 +2090 +2091 +2092 +2093 +2094 +2095 +2096 +2097 +2098 +2099 +2100 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +2109 +2110 +2111 +2112 +2113 +2114 +2115 +2116 +2117 +2118 +2119 +2120 +2121 +2122 +2123 +2124 +2125 +2126 +2127 +2128 +2129 +2130 +2131 +2132 +2133 +2134 +2135 +2136 +2137 +2138 +2139 +2140 +2141 +2142 +2143 +2144 +2145 +2146 +2147 +2148 +2149 +2150 +2151 +2152 +2153 +2154 +2155 +2156 +2157 +2158 +2159 +2160 +2161 +2162 +2163 +2164 +2165 +2166 +2167 +2168 +2169 +2170 +2171 +2172 +2173 +2174 +2175 +2176 +2177 +2178 +2179 +2180 +2181 +2182 +2183 +2184 +2185 +2186 +2187 +2188 +2189 +2190 +2191 +2192 +2193 +2194 +2195 +2196 +2197 +2198 +2199 +2200 +2201 +2202 +2203 +2204 +2205 +2206 +2207 +2208 +2209 +2210 +2211 +2212 +2213 +2214 +2215 +2216 +2217 +2218 +2219 +2220 +2221 +2222 +2223 +2224 +2225 +2226 +2227 +2228 +2229 +2230 +2231 +2232 +2233 +2234 +2235 +2236 +2237 +2238 +2239 +2240 +2241 +2242 +2243 +2244 +2245 +2246 +2247 +2248 +2249 +2250 +2251 +2252 +2253 +2254 +2255 +2256 +2257 +2258 +2259 +2260 +2261 +2262 +2263 +2264 +2265 +2266 +2267 +2268 +2269 +2270 +2271 +2272 +2273 +2274 +2275 +2276 +2277 +2278 +2279 +2280 +2281 +2282 +2283 +2284 +2285 +2286 +2287 +2288 +2289 +2290 +2291 +2292 +2293 +2294 +2295 +2296 +2297 +2298 +2299 +2300 +2301 +2302 +2303 +2304 +2305 +2306 +2307 +2308 +2309 +2310 +2311 +2312 +2313 +2314 +2315 +2316 +2317 +2318 +2319 +2320 +2321 +2322 +2323 +2324 +2325 +2326 +2327 +2328 +2329 +2330 +2331 +2332 +2333 +2334 +2335 +2336 +2337 +2338 +2339 +2340 +2341 +2342 +2343 +2344 +2345 +2346 +2347 +2348 +2349 +2350 +2351 +2352 +2353 +2354 +2355 +2356 +2357 +2358 +2359 +2360 +2361 +2362 +2363 +2364 +2365 +2366 +2367 +2368 +2369 +2370 +2371 +2372 +2373 +2374 +2375 +2376 +2377 +2378 +2379 +2380 +2381 +2382 +2383 +2384 +2385 +2386 +2387 +2388 +2389 +2390 +2391 +2392 +2393 +2394 +2395 +2396 +2397 +2398 +2399 +2400 +2401 +2402 +2403 +2404 +2405 +2406 +2407 +2408 +2409 +2410 +2411 +2412 +2413 +2414 +2415 +2416 +2417 +2418 +2419 +2420 +2421 +2422 +2423 +2424 +2425 +2426 +2427 +2428 +2429 +2430 +2431 +2432 +2433 +2434 +2435 +2436 +2437 +2438 +2439 +2440 +2441 +2442 +2443 +2444 +2445 +2446 +2447 +2448 +2449 +2450 +2451 +2452 +2453 +2454 +2455 +2456 +2457 +2458 +2459 +2460 +2461 +2462 +2463 +2464 +2465 +2466 +2467 +2468 +2469 +2470 +2471 +2472 +2473 +2474 +2475 +2476 +2477 +2478 +2479 +2480 +2481 +2482 +2483 +2484 +2485 +2486 +2487 +2488 +2489 +2490 +2491 +2492 +2493 +2494 +2495 +2496 +2497 +2498 +2499 +2500 +2501 +2502 +2503 +2504 +2505 +2506 +2507 +2508 +2509 +2510 +2511 +2512 +2513 +2514 +2515 +2516  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**********************************************************
+ * abapGit JavaScript Function Library
+ **********************************************************/
+
+/**********************************************************
+  Global variables used from outside
+ **********************************************************/
+
+/* exported setInitialFocus */
+/* exported setInitialFocusWithQuerySelector */
+/* exported submitFormById */
+/* exported errorStub */
+/* exported confirmInitialized */
+/* exported perfOut */
+/* exported perfLog */
+/* exported perfClear */
+/* exported enableArrowListNavigation */
+/* exported activateLinkHints */
+/* exported setKeyBindings */
+/* exported preparePatch */
+/* exported registerStagePatch */
+/* exported toggleRepoListDetail */
+/* exported onTagTypeChange */
+/* exported getIndocStyleSheet */
+/* exported addMarginBottom */
+/* exported enumerateJumpAllFiles */
+/* exported createRepoCatalogEnumerator */
+/* exported enumerateUiActions */
+/* exported onDiffCollapse */
+/* exported restoreScrollPosition */
+/* exported toggleBrowserControlWarning */
+/* exported displayBrowserControlFooter */
+
+/**********************************************************
+ * Polyfills
+ **********************************************************/
+
+// Bind polyfill (for IE7), taken from https://developer.mozilla.org/
+if (!Function.prototype.bind) {
+  Function.prototype.bind = function(oThis) {
+    if (typeof this !== "function") {
+      throw new TypeError("Function.prototype.bind - subject is not callable");
+    }
+
+    var aArgs   = Array.prototype.slice.call(arguments, 1);
+    var fToBind = this;
+    var fNOP    = function() { };
+    var fBound  = function() {
+      return fToBind.apply(
+        this instanceof fNOP ? this : oThis,
+        aArgs.concat(Array.prototype.slice.call(arguments))
+      );
+    };
+
+    if (this.prototype) {
+      fNOP.prototype = this.prototype;
+    }
+    fBound.prototype = new fNOP();
+
+    return fBound;
+  };
+}
+
+// String includes polyfill, taken from https://developer.mozilla.org
+if (!String.prototype.includes) {
+  String.prototype.includes = function(search, start) {
+    "use strict";
+    if (typeof start !== "number") {
+      start = 0;
+    }
+
+    if (start + search.length > this.length) {
+      return false;
+    } else {
+      return this.indexOf(search, start) !== -1;
+    }
+  };
+}
+
+// String startsWith polyfill, taken from https://developer.mozilla.org
+if (!String.prototype.startsWith) {
+  Object.defineProperty(String.prototype, "startsWith", {
+    value: function(search, pos) {
+      pos = !pos || pos < 0 ? 0 : +pos;
+
+      return this.substring(pos, pos + search.length) === search;
+    }
+  });
+}
+
+// forEach polyfill, taken from https://developer.mozilla.org
+// used for querySelectorAll results
+if (window.NodeList && !NodeList.prototype.forEach) {
+  NodeList.prototype.forEach = Array.prototype.forEach;
+}
+
+/**********************************************************
+ * Common functions
+ **********************************************************/
+
+// Output text to the debug div
+function debugOutput(text, dstID) {
+  var stdout  = document.getElementById(dstID || "debug-output");
+  var wrapped = "<p>" + text + "</p>";
+
+  stdout.innerHTML = stdout.innerHTML + wrapped;
+}
+
+// Use a supplied form, a pre-created form or create a hidden form
+// and submit with sapevent
+function submitSapeventForm(params, action, method, form) {
+
+  function getSapeventPrefix() {
+    if (document.querySelector('a[href*="file:///SAPEVENT:"]')) {
+      return "file:///"; //Prefix for chromium based browser control
+    } else {
+      return "";
+    }
+  }
+
+  var stub_form_id = "form_" + action;
+
+  form = form
+    || document.getElementById(stub_form_id)
+    || document.createElement("form");
+
+  form.setAttribute("method", method || "post");
+  if (/sapevent/i.test(action)) {
+    form.setAttribute("action", action);
+  } else {
+    form.setAttribute("action", getSapeventPrefix() + "SAPEVENT:" + action);
+  }
+
+  for (var key in params) {
+    var hiddenField = document.createElement("input");
+    hiddenField.setAttribute("type", "hidden");
+    hiddenField.setAttribute("name", key);
+    hiddenField.setAttribute("value", params[key]);
+    form.appendChild(hiddenField);
+  }
+
+  var formExistsInDOM = form.id && Boolean(document.querySelector("#" + form.id));
+
+  if (form.id !== stub_form_id && !formExistsInDOM) {
+    document.body.appendChild(form);
+  }
+
+  form.submit();
+}
+
+// Set focus to a control
+function setInitialFocus(id) {
+  document.getElementById(id).focus();
+}
+
+// Set focus to a element with query selector
+function setInitialFocusWithQuerySelector(sSelector, bFocusParent) {
+  var oSelected = document.querySelector(sSelector);
+
+  if (oSelected) {
+    if (bFocusParent) {
+      oSelected.parentElement.focus();
+    } else {
+      oSelected.focus();
+    }
+  }
+}
+
+// Submit an existing form
+function submitFormById(id) {
+  document.getElementById(id).submit();
+}
+
+// JS error stub
+function errorStub(event) {
+  var element    = event.target || event.srcElement;
+  var targetName = element.id || element.name || "???";
+  alert("JS Error, please log an issue (@" + targetName + ")");
+}
+
+// Confirm JS initilization
+function confirmInitialized() {
+  var errorBanner = document.getElementById("js-error-banner");
+  if (errorBanner) {
+    errorBanner.style.display = "none";
+  }
+  debugOutput("js: OK"); // Final final confirmation :)
+}
+
+/**********************************************************
+ * Performance utils (for debugging)
+ **********************************************************/
+
+var gPerf = [];
+
+function perfOut(prefix) {
+  var totals = {};
+  for (var i = gPerf.length - 1; i >= 0; i--) {
+    if (!totals[gPerf[i].name]) totals[gPerf[i].name] = { count: 0, time: 0 };
+
+    totals[gPerf[i].name].time  += gPerf[i].time;
+    totals[gPerf[i].name].count += 1;
+  }
+
+  var keys = Object.keys(totals);
+  for (var j = keys.length - 1; j >= 0; j--) {
+    console.log(prefix
+      + " " + keys[j] + ": "
+      + totals[keys[j]].time.toFixed(3) + "ms"
+      + " (" + totals[keys[j]].count.toFixed() + ")");
+  }
+}
+
+function perfLog(name, startTime) {
+  gPerf.push({ name: name, time: window.performance.now() - startTime });
+}
+
+function perfClear() {
+  gPerf = [];
+}
+
+/**********************************************************
+ * Repo Overview Logic
+ **********************************************************/
+
+function findStyleSheetByName(name) {
+  for (var s = 0; s < document.styleSheets.length; s++) {
+    var styleSheet = document.styleSheets[s];
+    var classes    = styleSheet.cssRules || styleSheet.rules;
+    for (var i = 0; i < classes.length; i++) {
+      if (classes[i].selectorText === name) return classes[i];
+    }
+  }
+}
+
+function getIndocStyleSheet() {
+  for (var s = 0; s < document.styleSheets.length; s++) {
+    if (!document.styleSheets[s].href) return document.styleSheets[s]; // One with empty href
+  }
+  // None found ? create one
+  var style = document.createElement("style");
+  document.head.appendChild(style);
+  return style.sheet;
+}
+
+function RepoOverViewHelper(opts) {
+  if (opts && opts.focusFilterKey) {
+    this.focusFilterKey = opts.focusFilterKey;
+  }
+  this.setHooks();
+  this.pageId                   = "RepoOverViewHelperState"; // constant is OK for this case
+  this.isDetailsDisplayed       = false;
+  this.isOnlyFavoritesDisplayed = false;
+  this.detailCssClass           = findStyleSheetByName(".repo-overview .ro-detail");
+
+  var icon = document.getElementById("icon-filter-detail");
+  this.toggleFilterIcon(icon, this.isDetailsDisplayed);
+  this.registerRowSelection();
+  this.registerKeyboardShortcuts();
+}
+
+RepoOverViewHelper.prototype.setHooks = function() {
+  window.onload = this.onPageLoad.bind(this);
+};
+
+RepoOverViewHelper.prototype.onPageLoad = function() {
+  var data = window.localStorage && JSON.parse(window.localStorage.getItem(this.pageId));
+  if (data) {
+    if (data.isDetailsDisplayed) {
+      this.toggleItemsDetail(true);
+    }
+    if (data.selectedRepoKey) {
+      this.selectRowByRepoKey(data.selectedRepoKey);
+    } else {
+      this.selectRowByIndex(0);
+    }
+  }
+};
+
+RepoOverViewHelper.prototype.registerKeyboardShortcuts = function() {
+  var self = this;
+  document.addEventListener("keypress", function(event) {
+    if (document.activeElement.id === "filter") {
+      return;
+    }
+    if (self.focusFilterKey && event.key === self.focusFilterKey && !CommandPalette.isVisible()) {
+      var filterInput = document.getElementById("filter");
+      if (filterInput) filterInput.focus();
+      event.preventDefault();
+      return;
+    }
+
+    var keycode         = event.keyCode;
+    var rows            = Array.prototype.slice.call(self.getVisibleRows());
+    var selected        = document.querySelector(".repo-overview tr.selected");
+    var indexOfSelected = rows.indexOf(selected);
+    var lastRow         = rows.length - 1;
+
+    if (keycode == 13 && document.activeElement.tagName.toLowerCase() != "input") {
+      // "enter" to open, unless command field has focus
+      self.openSelectedRepo();
+    } else if ((keycode == 52 || keycode == 56) && indexOfSelected > 0) {
+      // "4,8" for previous, digits are the numlock keys
+      // NB: numpad must be activated, keypress does not detect arrows
+      //     if we need arrows it will be keydown. But then mind the keycodes, they may change !
+      //     e.g. 100 is 'd' with keypress (and conflicts with diff hotkey), and also it is arrow-left keydown
+      self.selectRowByIndex(indexOfSelected - 1);
+    } else if ((keycode == 54 || keycode == 50) && indexOfSelected < lastRow) {
+      // "6,2" for next
+      self.selectRowByIndex(indexOfSelected + 1);
+    }
+  });
+};
+
+RepoOverViewHelper.prototype.openSelectedRepo = function() {
+  this.selectedRepoKey = document.querySelector(".repo-overview tr.selected").dataset.key;
+  this.saveLocalStorage();
+  document.querySelector(".repo-overview tr.selected td.ro-go a").click();
+};
+
+RepoOverViewHelper.prototype.selectRowByIndex = function(index) {
+  var rows = this.getVisibleRows();
+  if (rows.length >= index) {
+    var selectedRow = rows[index];
+    if (selectedRow.classList.contains("selected")) {
+      return;
+    }
+
+    this.deselectAllRows();
+    rows[index].classList.add("selected");
+    this.selectedRepoKey = selectedRow.dataset.key;
+    this.updateActionLinks(selectedRow);
+    this.saveLocalStorage();
+  }
+};
+
+RepoOverViewHelper.prototype.selectRowByRepoKey = function(key) {
+  var attributeQuery = "[data-key='" + key + "']";
+  var row            = document.querySelector(".repo-overview tbody tr" + attributeQuery);
+  // navigation to already selected repo
+  if (row.dataset.key === key && row.classList.contains("selected")) {
+    return;
+  }
+
+  this.deselectAllRows();
+  row.classList.add("selected");
+  this.selectedRepoKey = key;
+  this.updateActionLinks(row);
+  this.saveLocalStorage();
+};
+
+RepoOverViewHelper.prototype.updateActionLinks = function(selectedRow) {
+  // now we have a repo selected, determine which action buttons are relevant
+  var selectedRepoKey       = selectedRow.dataset.key;
+  var selectedRepoIsOffline = selectedRow.dataset.offline === "X";
+
+  var actionLinks = document.querySelectorAll("a.action_link");
+  actionLinks.forEach(function(link) {
+    // adjust repo key in urls
+    link.href = link.href.replace(/\?key=(#|\d+)/, "?key=" + selectedRepoKey);
+
+    // toggle button visibility
+    if (link.classList.contains("action_offline_repo")) {
+      if (selectedRepoIsOffline) {
+        link.parentElement.classList.add("enabled");
+      } else {
+        link.parentElement.classList.remove("enabled");
+      }
+    }
+    else if (link.classList.contains("action_online_repo")) {
+      if (!selectedRepoIsOffline) {
+        link.parentElement.classList.add("enabled");
+      } else {
+        link.parentElement.classList.remove("enabled");
+      }
+    }
+    else {
+      // if the action is for both repository types, it will only have the .action_link class
+      // it still needs to be toggled as we want to hide everything if no repo is selected
+      link.parentElement.classList.add("enabled");
+    }
+  });
+};
+
+RepoOverViewHelper.prototype.deselectAllRows = function() {
+  document.querySelectorAll(".repo-overview tbody tr").forEach(function(x) {
+    x.classList.remove("selected");
+  });
+};
+
+RepoOverViewHelper.prototype.getVisibleRows = function() {
+  return document.querySelectorAll(".repo-overview tbody tr:not(.nodisplay)");
+};
+
+RepoOverViewHelper.prototype.registerRowSelection = function() {
+  var self = this;
+  document.querySelectorAll(".repo-overview tr td:not(.ro-go)").forEach(function(repoListRowCell) {
+    repoListRowCell.addEventListener("click", function() {
+      self.selectRowByRepoKey(this.parentElement.dataset.key);
+    });
+  });
+
+  document.querySelectorAll(".repo-overview tr td.ro-go").forEach(function(openRepoIcon) {
+    openRepoIcon.addEventListener("click", function() {
+      var selectedRow = this.parentElement;
+      self.selectRowByRepoKey(selectedRow.dataset.key);
+      self.openSelectedRepo();
+    });
+  });
+};
+
+RepoOverViewHelper.prototype.toggleRepoListDetail = function(forceDisplay) {
+  if (this.detailCssClass) {
+    this.toggleItemsDetail(forceDisplay);
+    this.saveLocalStorage();
+  }
+};
+
+RepoOverViewHelper.prototype.toggleItemsDetail = function(forceDisplay) {
+  if (this.detailCssClass) {
+    this.isDetailsDisplayed = forceDisplay || !this.isDetailsDisplayed;
+
+    // change layout to wide if details are displayed
+    if (this.isDetailsDisplayed) {
+      document.body.classList.remove("centered");
+      document.body.classList.add("full_width");
+    } else {
+      document.body.classList.add("centered");
+      document.body.classList.remove("full_width");
+    }
+
+    this.detailCssClass.style.display = this.isDetailsDisplayed ? "" : "none";
+
+    var icon = document.getElementById("icon-filter-detail");
+    this.toggleFilterIcon(icon, this.isDetailsDisplayed);
+  }
+};
+
+RepoOverViewHelper.prototype.toggleFilterIcon = function(icon, isEnabled) {
+  if (isEnabled) {
+    icon.classList.remove("grey");
+    icon.classList.add("blue");
+  } else {
+    icon.classList.remove("blue");
+    icon.classList.add("grey");
+  }
+};
+
+RepoOverViewHelper.prototype.saveLocalStorage = function() {
+  if (!window.localStorage) return;
+  var data = {
+    isDetailsDisplayed      : this.isDetailsDisplayed,
+    isOnlyFavoritesDisplayed: this.isOnlyFavoritesDisplayed,
+    selectedRepoKey         : this.selectedRepoKey,
+  };
+  window.localStorage.setItem(this.pageId, JSON.stringify(data));
+};
+
+/**********************************************************
+ * Staging Logic
+ **********************************************************/
+
+// Stage helper constructor
+function StageHelper(params) {
+  this.pageSeed        = params.seed;
+  this.formAction      = params.formAction;
+  this.patchAction     = params.patchAction;
+  this.user            = params.user;
+  this.ids             = params.ids;
+  this.selectedCount   = 0;
+  this.filteredCount   = 0;
+  this.lastFilterValue = "";
+  this.focusFilterKey  = params.focusFilterKey;
+
+  // DOM nodes
+  this.dom = {
+    stageTab         : document.getElementById(params.ids.stageTab),
+    commitAllBtn     : document.getElementById(params.ids.commitAllBtn),
+    commitSelectedBtn: document.getElementById(params.ids.commitSelectedBtn),
+    commitFilteredBtn: document.getElementById(params.ids.commitFilteredBtn),
+    patchBtn         : document.getElementById(params.ids.patchBtn),
+    objectSearch     : document.getElementById(params.ids.objectSearch),
+    selectedCounter  : null,
+    filteredCounter  : null,
+  };
+  this.findCounters();
+
+  // Table columns (autodetection)
+  this.colIndex      = this.detectColumns();
+  this.filterTargets = ["name", "user", "transport"];
+
+  // Constants
+  this.HIGHLIGHT_STYLE = "highlight";
+  this.STATUS          = {
+    add    : "A",
+    remove : "R",
+    ignore : "I",
+    reset  : "?",
+    isValid: function(status) { return "ARI?".indexOf(status) == -1 }
+  };
+
+  this.TEMPLATES = {
+    cmdReset : "<a>reset</a>",
+    cmdLocal : "<a>add</a>",
+    cmdRemote: "<a>ignore</a><a>remove</a>"
+  };
+
+  this.setHooks();
+  if (this.user) this.injectFilterMe();
+  Hotkeys.addHotkeyToHelpSheet("^Enter", "Commit");
+}
+
+StageHelper.prototype.findCounters = function() {
+  this.dom.selectedCounter = this.dom.commitSelectedBtn.querySelector("span.counter");
+  this.dom.filteredCounter = this.dom.commitFilteredBtn.querySelector("span.counter");
+};
+
+StageHelper.prototype.injectFilterMe = function() {
+  var tabFirstHead = this.dom.stageTab.tHead.rows[0];
+  if (!tabFirstHead || tabFirstHead.className !== "local") {
+    return; // for the case only "remove part" is displayed
+  }
+  var changedByHead = tabFirstHead.cells[this.colIndex.user];
+
+  changedByHead.innerText = changedByHead.innerText + " (";
+
+  var a = document.createElement("A");
+  a.appendChild(document.createTextNode("me"));
+  a.onclick = this.onFilterMe.bind(this);
+  a.href    = "#";
+  changedByHead.appendChild(a);
+  changedByHead.appendChild(document.createTextNode(")"));
+};
+
+StageHelper.prototype.onFilterMe = function() {
+  this.dom.objectSearch.value = this.user;
+  this.onFilter({ type: "keypress", which: 13, target: this.dom.objectSearch });
+};
+
+// Hook global click listener on table, load/unload actions
+StageHelper.prototype.setHooks = function() {
+  window.onkeypress                  = this.onCtrlEnter.bind(this);
+  this.dom.stageTab.onclick          = this.onTableClick.bind(this);
+  this.dom.commitSelectedBtn.onclick = this.submit.bind(this);
+  this.dom.commitFilteredBtn.onclick = this.submitVisible.bind(this);
+  this.dom.patchBtn.onclick          = this.submitPatch.bind(this);
+  this.dom.objectSearch.oninput      = this.onFilter.bind(this);
+  this.dom.objectSearch.onkeypress   = this.onFilter.bind(this);
+  window.onbeforeunload              = this.onPageUnload.bind(this);
+  window.onload                      = this.onPageLoad.bind(this);
+
+  var self = this;
+  document.addEventListener("keypress", function(event) {
+    if (document.activeElement.id !== self.ids.objectSearch
+      && self.focusFilterKey && event.key === self.focusFilterKey
+      && !CommandPalette.isVisible()) {
+
+      self.dom.objectSearch.focus();
+      event.preventDefault();
+    }
+  });
+};
+
+// Detect column index
+StageHelper.prototype.detectColumns = function() {
+  var dataRow  = this.dom.stageTab.tBodies[0].rows[0];
+  var colIndex = {};
+
+  for (var i = dataRow.cells.length - 1; i >= 0; i--) {
+    if (dataRow.cells[i].className) colIndex[dataRow.cells[i].className] = i;
+  }
+
+  return colIndex;
+};
+
+// Store table state on leaving the page
+StageHelper.prototype.onPageUnload = function() {
+  if (!window.sessionStorage) return;
+
+  var data = this.collectData();
+  window.sessionStorage.setItem(this.pageSeed, JSON.stringify(data));
+};
+
+// Re-store table state on entering the page
+StageHelper.prototype.onPageLoad = function() {
+  var data = window.sessionStorage && JSON.parse(window.sessionStorage.getItem(this.pageSeed));
+
+  this.iterateStageTab(true, function(row) {
+    var status = data && data[row.cells[this.colIndex["name"]].innerText];
+    this.updateRow(row, status || this.STATUS.reset);
+  });
+
+  this.updateMenu();
+  if (this.dom.objectSearch.value) {
+    this.applyFilterValue(this.dom.objectSearch.value);
+  }
+};
+
+// Table event handler, change status
+StageHelper.prototype.onTableClick = function(event) {
+  var target = event.target || event.srcElement;
+  if (!target) return;
+
+  var td;
+  if (target.tagName === "A") {
+    td = target.parentNode;
+  } else if (target.tagName === "TD") {
+    td = target;
+    if (td.children.length === 1 && td.children[0].tagName === "A") {
+      target = td.children[0];
+    } else return;
+  } else return;
+
+  if (["TD", "TH"].indexOf(td.tagName) == -1 || td.className != "cmd") return;
+
+  var status    = this.STATUS[target.innerText]; // Convert anchor text to status
+  var targetRow = td.parentNode;
+
+  if (td.tagName === "TD") {
+    this.updateRow(targetRow, status);
+  } else { // TH
+    this.iterateStageTab(true, function(row) {
+      if (row.style.display !== "none"           // Not filtered out
+        && row.className === targetRow.className // Same context as header
+      ) {
+        this.updateRow(row, status);
+      }
+    });
+  }
+
+  this.updateMenu();
+};
+
+StageHelper.prototype.onCtrlEnter = function(e) {
+  if (e.ctrlKey && (e.which === 10 || e.key === "Enter")) {
+    var clickMap = {
+      "default" : this.dom.commitAllBtn,
+      "selected": this.dom.commitSelectedBtn,
+      "filtered": this.dom.commitFilteredBtn
+    };
+    clickMap[this.calculateActiveCommitCommand()].click();
+  }
+};
+
+// Search object
+StageHelper.prototype.onFilter = function(e) {
+  if ( // Enter hit or clear, IE SUCKS !
+    e.type === "input" && !e.target.value && this.lastFilterValue
+    || e.type === "keypress" && (e.which === 13 || e.key === "Enter") && !e.ctrlKey) {
+
+    this.applyFilterValue(e.target.value);
+    submitSapeventForm({ filterValue: e.target.value }, "stage_filter", "post");
+  }
+};
+
+StageHelper.prototype.applyFilterValue = function(sFilterValue) {
+  this.lastFilterValue = sFilterValue;
+  this.filteredCount   = this.iterateStageTab(true, this.applyFilterToRow, sFilterValue);
+  this.updateMenu();
+};
+
+// Apply filter to a single stage line - hide or show
+StageHelper.prototype.applyFilterToRow = function(row, filter) {
+  // Collect data cells
+  var targets = this.filterTargets.map(function(attr) {
+    // Get the innermost tag with the text we want to filter
+    // <td>text</td>: elem = td-tag
+    // <td><span><i></i><a>text</a></span></td>: elem = a-tag
+    var elem  = row.cells[this.colIndex[attr]];
+    var elemA = elem.getElementsByTagName("A")[0];
+
+    if (elemA) elem = elemA;
+    return {
+      elem     : elem,
+      plainText: elem.innerText.replace(/ /g, "\u00a0"), // without tags, with encoded spaces
+      curHtml  : elem.innerHTML
+    };
+  }, this);
+
+  var isVisible = false;
+
+  // Apply filter to cells, mark filtered text
+  for (var i = targets.length - 1; i >= 0; i--) {
+    var target = targets[i];
+    // Ignore case of filter
+    var regFilter = new RegExp("(" + filter + ")", "gi");
+
+    target.newHtml = (filter)
+      ? target.plainText.replace(regFilter, "<mark>$1</mark>")
+      : target.plainText;
+    target.isChanged = target.newHtml !== target.curHtml;
+    isVisible        = isVisible || !filter || target.newHtml !== target.plainText;
+  }
+
+  // Update DOM
+  row.style.display = isVisible ? "" : "none";
+  for (var j = targets.length - 1; j >= 0; j--) {
+    if (targets[j].isChanged) targets[j].elem.innerHTML = targets[j].newHtml;
+  }
+  return isVisible ? 1 : 0;
+};
+
+// Get how status should affect object counter
+StageHelper.prototype.getStatusImpact = function(status) {
+  if (typeof status !== "string"
+    || status.length !== 1
+    || this.STATUS.isValid(status)) {
+    alert("Unknown status");
+  } else {
+    return (status !== this.STATUS.reset) ? 1: 0;
+  }
+};
+
+// Update table line
+StageHelper.prototype.updateRow = function(row, newStatus) {
+  var oldStatus = row.cells[this.colIndex["status"]].innerText;
+
+  if (oldStatus !== newStatus) {
+    this.updateRowStatus(row, newStatus);
+    this.updateRowCommand(row, newStatus);
+  } else if (!row.cells[this.colIndex["cmd"]].children.length) {
+    this.updateRowCommand(row, newStatus); // For initial run
+  }
+
+  this.selectedCount += this.getStatusImpact(newStatus) - this.getStatusImpact(oldStatus);
+};
+
+// Update Status cell (render set of commands)
+StageHelper.prototype.updateRowStatus = function(row, status) {
+  row.cells[this.colIndex["status"]].innerText = status;
+  if (status === this.STATUS.reset) {
+    row.cells[this.colIndex["status"]].classList.remove(this.HIGHLIGHT_STYLE);
+  } else {
+    row.cells[this.colIndex["status"]].classList.add(this.HIGHLIGHT_STYLE);
+  }
+};
+
+// Update Command cell (render set of commands)
+StageHelper.prototype.updateRowCommand = function(row, status) {
+  var cell = row.cells[this.colIndex["cmd"]];
+  if (status === this.STATUS.reset) {
+    cell.innerHTML = (row.className == "local")
+      ? this.TEMPLATES.cmdLocal
+      :     this.TEMPLATES.cmdRemote;
+  } else {
+    cell.innerHTML = this.TEMPLATES.cmdReset;
+  }
+};
+
+StageHelper.prototype.calculateActiveCommitCommand = function() {
+  var active;
+  if (this.selectedCount > 0) {
+    active = "selected";
+  } else if (this.lastFilterValue) {
+    active = "filtered";
+  } else {
+    active = "default";
+  }
+  return active;
+};
+
+// Update menu items visibility
+StageHelper.prototype.updateMenu = function() {
+  var display = this.calculateActiveCommitCommand();
+
+  if (display === "selected") this.dom.selectedCounter.innerText = this.selectedCount.toString();
+  if (display === "filtered") this.dom.filteredCounter.innerText = this.filteredCount.toString();
+
+  this.dom.commitAllBtn.style.display      = display === "default" ? "" : "none";
+  this.dom.commitSelectedBtn.style.display = display === "selected" ? "" : "none";
+  this.dom.commitFilteredBtn.style.display = display === "filtered" ? "" : "none";
+};
+
+// Submit stage state to the server
+StageHelper.prototype.submit = function() {
+  submitSapeventForm(this.collectData(), this.formAction);
+};
+
+StageHelper.prototype.submitVisible = function() {
+  this.markVisiblesAsAdded();
+  submitSapeventForm(this.collectData(), this.formAction);
+};
+
+StageHelper.prototype.submitPatch = function() {
+  submitSapeventForm(this.collectData(), this.patchAction);
+};
+
+// Extract data from the table
+StageHelper.prototype.collectData = function() {
+  var data = {};
+  this.iterateStageTab(false, function(row) {
+    data[row.cells[this.colIndex["name"]].innerText] = row.cells[this.colIndex["status"]].innerText;
+  });
+  return data;
+};
+
+StageHelper.prototype.markVisiblesAsAdded = function() {
+  this.iterateStageTab(false, function(row) {
+    // TODO refacotr, unify updateRow logic
+    if (row.style.display === "" && row.className === "local") { // visible
+      this.updateRow(row, this.STATUS.add);
+    } else {
+      this.updateRow(row, this.STATUS.reset);
+    }
+  });
+};
+
+// Table iteration helper
+StageHelper.prototype.iterateStageTab = function(changeMode, cb /*, ...*/) {
+  var restArgs = Array.prototype.slice.call(arguments, 2);
+  var table    = this.dom.stageTab;
+  var retTotal = 0;
+
+  if (changeMode) {
+    var scrollOffset = window.pageYOffset;
+
+    this.dom.stageTab.style.display = "none";
+  }
+
+  for (var b = 0, bN = table.tBodies.length; b < bN; b++) {
+    var tbody = table.tBodies[b];
+    for (var r = 0, rN = tbody.rows.length; r < rN; r++) {
+      var args   = [tbody.rows[r]].concat(restArgs);
+      var retVal = cb.apply(this, args); // callback
+
+      if (typeof retVal === "number") retTotal += retVal;
+    }
+  }
+
+  if (changeMode) {
+    this.dom.stageTab.style.display = "";
+    window.scrollTo(0, scrollOffset);
+  }
+
+  return retTotal;
+};
+
+/**********************************************************
+ * Check List Wrapper
+ **********************************************************/
+
+function CheckListWrapper(id, cbAction, cbActionOnlyMyChanges) {
+  this.id                    = document.getElementById(id);
+  this.cbAction              = cbAction;
+  this.cbActionOnlyMyChanges = cbActionOnlyMyChanges;
+  this.id.onclick            = this.onClick.bind(this);
+}
+
+CheckListWrapper.prototype.onClick = function(e) { // eslint-disable-line no-unused-vars
+  // Get nodes
+  var target = event.target || event.srcElement;
+  if (!target) return;
+  if (target.tagName !== "A") { target = target.parentNode } // icon clicked
+  if (target.tagName !== "A") return;
+  if (target.parentNode.tagName !== "LI") return;
+
+  var nodeA    = target;
+  var nodeLi   = target.parentNode;
+  var nodeIcon = target.children[0];
+  if (!nodeIcon.classList.contains("icon")) return;
+
+  // Node updates
+  var option   = nodeA.innerText;
+  var oldState = nodeLi.getAttribute("data-check");
+  if (oldState === null) return; // no data-check attribute - non-checkbox
+  var newState = oldState === "X" ? false : true;
+
+  if (newState) {
+    nodeIcon.classList.remove("grey");
+    nodeIcon.classList.add("blue");
+    nodeLi.setAttribute("data-check", "X");
+  } else {
+    nodeIcon.classList.remove("blue");
+    nodeIcon.classList.add("grey");
+    nodeLi.setAttribute("data-check", "");
+  }
+
+  // Action callback, special handling for "Only My Changes"
+  if (option === "Only my changes") {
+    this.cbActionOnlyMyChanges(nodeLi.getAttribute("data-aux"), newState);
+
+    // hide "Changed By" menu
+  } else {
+    this.cbAction(nodeLi.getAttribute("data-aux"), option, newState);
+  }
+};
+
+/**********************************************************
+ * Diff Page Logic
+ **********************************************************/
+
+// Diff helper constructor
+function DiffHelper(params) {
+  this.pageSeed    = params.seed;
+  this.counter     = 0;
+  this.stageAction = params.stageAction;
+
+  // DOM nodes
+  this.dom = {
+    diffList   : document.getElementById(params.ids.diffList),
+    stageButton: document.getElementById(params.ids.stageButton)
+  };
+
+  this.repoKey = this.dom.diffList.getAttribute("data-repo-key");
+  if (!this.repoKey) return; // Unexpected
+
+  this.dom.jump         = document.getElementById(params.ids.jump);
+  this.dom.jump.onclick = this.onJump.bind(this);
+
+  // Checklist wrapper
+  if (document.getElementById(params.ids.filterMenu)) {
+    this.checkList        = new CheckListWrapper(params.ids.filterMenu, this.onFilter.bind(this), this.onFilterOnlyMyChanges.bind(this));
+    this.dom.filterButton = document.getElementById(params.ids.filterMenu).parentNode;
+  }
+
+  // Hijack stage command
+  if (this.dom.stageButton) {
+    this.dom.stageButton.href    = "#";
+    this.dom.stageButton.onclick = this.onStage.bind(this);
+  }
+}
+
+// Action on jump click
+DiffHelper.prototype.onJump = function(e) {
+  var text = ((e.target && e.target.text) || e);
+  if (!text) return;
+
+  var elFile = document.querySelector("[data-file*='" + text + "']");
+  if (!elFile) return;
+
+  setTimeout(function() {
+    elFile.scrollIntoView();
+  }, 100);
+};
+
+// Action on filter click
+DiffHelper.prototype.onFilter = function(attr, target, state) {
+  this.applyFilter(attr, target, state);
+  this.highlightButton(state);
+};
+
+DiffHelper.prototype.onFilterOnlyMyChanges = function(username, state) {
+  this.applyOnlyMyChangesFilter(username, state);
+  this.counter = 0;
+
+  if (state) {
+    this.dom.filterButton.classList.add("bgorange");
+  } else {
+    this.dom.filterButton.classList.remove("bgorange");
+  }
+
+  // apply logic on Changed By list items
+  var changedByListItems = Array.prototype.slice.call(document.querySelectorAll("[data-aux*=changed-by]"));
+
+  changedByListItems
+    .map(function(item) {
+      var nodeIcon = item.children[0].children[0];
+
+      if (state === true) {
+        if (item.innerText === username) { // current user
+          item.style.display = "";
+          item.setAttribute("data-check", "X");
+
+          if (nodeIcon) {
+            nodeIcon.classList.remove("grey");
+            nodeIcon.classList.add("blue");
+          }
+        } else { // other users
+          item.style.display = "none";
+          item.setAttribute("data-check", "");
+        }
+      } else {
+        item.style.display = "";
+        item.setAttribute("data-check", "X");
+
+        if (nodeIcon) {
+          nodeIcon.classList.remove("grey");
+          nodeIcon.classList.add("blue");
+        }
+      }
+    });
+};
+
+DiffHelper.prototype.applyOnlyMyChangesFilter = function(username, state) {
+  var jumpListItems = Array.prototype.slice.call(document.querySelectorAll("[id*=li_jump]"));
+
+  this.iterateDiffList(function(div) {
+    if (state === true) { // switching on "Only my changes" filter
+      if (div.getAttribute("data-changed-by") === username) {
+        div.style.display = state ? "" : "none";
+      } else {
+        div.style.display = state ? "none" : "";
+      }
+    } else { // disabling
+      div.style.display = "";
+    }
+
+    // hide the file in the jump list
+    var dataFile = div.getAttribute("data-file");
+    jumpListItems
+      .filter(function(item) { return dataFile.includes(item.text) })
+      .map(function(item) { item.style.display = div.style.display });
+  });
+};
+
+// Hide/show diff based on params
+DiffHelper.prototype.applyFilter = function(attr, target, state) {
+  var jumpListItems = Array.prototype.slice.call(document.querySelectorAll("[id*=li_jump]"));
+
+  this.iterateDiffList(function(div) {
+    if (div.getAttribute("data-" + attr) === target) {
+      div.style.display = state ? "" : "none";
+
+      // hide the file in the jump list
+      var dataFile = div.getAttribute("data-file");
+      jumpListItems
+        .filter(function(item) { return dataFile.includes(item.text) })
+        .map(function(item) { item.style.display = div.style.display });
+    }
+  });
+};
+
+// Action on stage -> save visible diffs as state for stage page
+DiffHelper.prototype.onStage = function(e) { // eslint-disable-line no-unused-vars
+  if (window.sessionStorage) {
+    var data = this.buildStageCache();
+    window.sessionStorage.setItem(this.pageSeed, JSON.stringify(data));
+  }
+  var getParams = { key: this.repoKey, seed: this.pageSeed };
+  submitSapeventForm(getParams, this.stageAction, "get");
+};
+
+// Collect visible diffs
+DiffHelper.prototype.buildStageCache = function() {
+  var list = {};
+  this.iterateDiffList(function(div) {
+    var filename = div.getAttribute("data-file");
+    if (!div.style.display && filename) { // No display override - visible !!
+      list[filename] = "A"; // Add
+    }
+  });
+  return list;
+};
+
+// Table iterator
+DiffHelper.prototype.iterateDiffList = function(cb /*, ...*/) {
+  var restArgs = Array.prototype.slice.call(arguments, 1);
+  var diffList = this.dom.diffList;
+
+  for (var i = 0, iN = diffList.children.length; i < iN; i++) {
+    var div = diffList.children[i];
+    if (div.className !== "diff") continue;
+    var args = [div].concat(restArgs);
+    cb.apply(this, args);// callback
+  }
+};
+
+// Highlight filter button if filter is activate
+DiffHelper.prototype.highlightButton = function(state) {
+  this.counter += state ? -1 : 1;
+  if (this.counter > 0) {
+    this.dom.filterButton.classList.add("bgorange");
+  } else {
+    this.dom.filterButton.classList.remove("bgorange");
+  }
+};
+
+// Collapse or expand diffs
+function onDiffCollapse(event) {
+  var source          = event.target || event.srcElement;
+  var nextDiffContent = source.parentElement.nextElementSibling;
+  var hide;
+
+  if (source.classList.contains("icon-chevron-down")) {
+    source.classList.remove("icon-chevron-down");
+    source.classList.add("icon-chevron-right");
+    hide = true;
+  } else {
+    source.classList.remove("icon-chevron-right");
+    source.classList.add("icon-chevron-down");
+    hide = false;
+  }
+
+  hide ? nextDiffContent.classList.add("nodisplay"): nextDiffContent.classList.remove("nodisplay");
+}
+
+// Add bottom margin, so that we can scroll to the top of the last file
+function addMarginBottom() {
+  document.getElementsByTagName("body")[0].style.marginBottom = screen.height + "px";
+}
+
+/**********************************************************
+ * Diff Page Column Selection
+ **********************************************************/
+
+function DiffColumnSelection() {
+  this.selectedColumnIdx = -1;
+  this.lineNumColumnIdx  = -1;
+  //https://stackoverflow.com/questions/2749244/javascript-setinterval-and-this-solution
+  document.addEventListener("mousedown", this.mousedownEventListener.bind(this));
+  document.addEventListener("copy", this.copyEventListener.bind(this));
+}
+
+DiffColumnSelection.prototype.mousedownEventListener = function(e) {
+  // Select text in a column of an HTML table and copy to clipboard (in DIFF view)
+  // (https://stackoverflow.com/questions/6619805/select-text-in-a-column-of-an-html-table)
+  // Process mousedown event for all TD elements -> apply CSS class at TABLE level.
+  // (https://stackoverflow.com/questions/40956717/how-to-addeventlistener-to-multiple-elements-in-a-single-line)
+  var unifiedLineNumColumnIdx    = 0;
+  var unifiedCodeColumnIdx       = 3;
+  var splitLineNumLeftColumnIdx  = 0;
+  var splitCodeLeftColumnIdx     = 2;
+  var splitLineNumRightColumnIdx = 3;
+  var splitCodeRightColumnIdx    = 5;
+
+  if (e.button !== 0) return; // function is only valid for left button, not right button
+
+  var td = e.target;
+
+  while (td != undefined && td.tagName != "TD" && td.tagName != "TBODY") td = td.parentElement;
+  if (td == undefined) return;
+  var table = td.parentElement.parentElement;
+
+  var patchColumnCount = 0;
+  if (td.parentElement.cells[0].classList.contains("patch")) {
+    patchColumnCount = 1;
+  }
+
+  if (td.classList.contains("diff_left")) {
+    table.classList.remove("diff_select_right");
+    table.classList.add("diff_select_left");
+    if (window.getSelection() && this.selectedColumnIdx != splitCodeLeftColumnIdx + patchColumnCount) {
+      // De-select to avoid effect of dragging selection in case the right column was first selected
+      if (document.body.createTextRange) { // All IE but Edge
+        // document.getSelection().removeAllRanges() may trigger error
+        // so use this code which is equivalent but does not fail
+        // (https://stackoverflow.com/questions/22914075/javascript-error-800a025e-using-range-selector)
+        range = document.body.createTextRange();
+        range.collapse();
+        range.select();
+      } else {
+        document.getSelection().removeAllRanges();
+      }
+    }
+    this.selectedColumnIdx = splitCodeLeftColumnIdx + patchColumnCount;
+    this.lineNumColumnIdx  = splitLineNumLeftColumnIdx + patchColumnCount;
+
+  } else if (td.classList.contains("diff_right")) {
+    table.classList.remove("diff_select_left");
+    table.classList.add("diff_select_right");
+    if (window.getSelection() && this.selectedColumnIdx != splitCodeRightColumnIdx + patchColumnCount) {
+      if (document.body.createTextRange) { // All IE but Edge
+        // document.getSelection().removeAllRanges() may trigger error
+        // so use this code which is equivalent but does not fail
+        // (https://stackoverflow.com/questions/22914075/javascript-error-800a025e-using-range-selector)
+        var range = document.body.createTextRange();
+        range.collapse();
+        range.select();
+      } else {
+        document.getSelection().removeAllRanges();
+      }
+    }
+    this.selectedColumnIdx = splitCodeRightColumnIdx + patchColumnCount;
+    this.lineNumColumnIdx  = splitLineNumRightColumnIdx + patchColumnCount;
+
+  } else if (td.classList.contains("diff_unified")) {
+    this.selectedColumnIdx = unifiedCodeColumnIdx;
+    this.lineNumColumnIdx  = unifiedLineNumColumnIdx;
+
+  } else {
+    this.selectedColumnIdx = -1;
+    this.lineNumColumnIdx  = -1;
+  }
+};
+
+DiffColumnSelection.prototype.copyEventListener = function(e) {
+  // Select text in a column of an HTML table and copy to clipboard (in DIFF view)
+  // (https://stackoverflow.com/questions/6619805/select-text-in-a-column-of-an-html-table)
+  var td = e.target;
+
+  while (td != undefined && td.tagName != "TD" && td.tagName != "TBODY") td = td.parentElement;
+  if (td != undefined) {
+    // Use window.clipboardData instead of e.clipboardData
+    // (https://stackoverflow.com/questions/23470958/ie-10-copy-paste-issue)
+    var clipboardData = (e.clipboardData == undefined ? window.clipboardData : e.clipboardData);
+    var text          = this.getSelectedText();
+    clipboardData.setData("text", text);
+    e.preventDefault();
+  }
+};
+
+DiffColumnSelection.prototype.getSelectedText = function() {
+  // Select text in a column of an HTML table and copy to clipboard (in DIFF view)
+  // (https://stackoverflow.com/questions/6619805/select-text-in-a-column-of-an-html-table)
+  var sel   = window.getSelection();
+  var range = sel.getRangeAt(0);
+  var doc   = range.cloneContents();
+  var nodes = doc.querySelectorAll("tr");
+  var text  = "";
+  if (nodes.length === 0) {
+    text = doc.textContent;
+  } else {
+    var newline  = "";
+    var realThis = this;
+    var copySide = "";
+    [].forEach.call(nodes, function(tr, i) {
+      var cellIdx = (i == 0 ? 0 : realThis.selectedColumnIdx);
+      if (tr.cells.length > cellIdx) {
+        var tdSelected = tr.cells[cellIdx];
+        // decide which side to copy based on first line of selection
+        if (i == 0) {
+          copySide = (tdSelected.classList.contains("new") ? "new" : "old" );
+        }
+        // copy is interesting only for one side of code, do not copy lines which exist on other side
+        if (i == 0 || copySide == "new" && !tdSelected.classList.contains("old") || copySide == "old" && !tdSelected.classList.contains("new")) {
+          text += newline + tdSelected.textContent;
+          // special processing for TD tag which sometimes contains newline
+          // (expl: /src/ui/zabapgit_js_common.w3mi.data.js) so do not add newline again in that case.
+          var lastChar = tdSelected.textContent[tdSelected.textContent.length - 1];
+          if (lastChar == "\n") newline = "";
+          else newline = "\n";
+        }
+      }
+    });
+  }
+  return text;
+};
+
+/**********************************************************
+ * Display Helper
+ **********************************************************/
+
+// Toggle display of changelog (news) and message popups
+function toggleDisplay(divId) {
+  var div = document.getElementById(divId);
+
+  if (div) div.style.display = (div.style.display) ? "" : "none";
+}
+
+/**********************************************************
+ * Keyboard Navigation
+ **********************************************************/
+
+function KeyNavigation() { }
+
+KeyNavigation.prototype.onkeydown = function(event) {
+  if (event.defaultPrevented) return;
+
+  // navigate with arrows through list items and support pressing links with enter and space
+  var isHandled = false;
+  if (event.key === "Enter" || event.key === "") {
+    isHandled = this.onEnterOrSpace();
+  } else if (/Down$/.test(event.key)) {
+    isHandled = this.onArrowDown();
+  } else if (/Up$/.test(event.key)) {
+    isHandled = this.onArrowUp();
+  } else if (event.key === "Backspace") {
+    isHandled = this.onBackspace();
+  }
+
+  if (isHandled) event.preventDefault();
+};
+
+KeyNavigation.prototype.onEnterOrSpace = function() {
+  if (document.activeElement.nodeName !== "A") return;
+  var anchor = document.activeElement;
+
+  if (anchor.href.replace(/#$/, "") === document.location.href.replace(/#$/, "")
+    && !anchor.onclick
+    && anchor.parentElement
+    && anchor.parentElement.nodeName === "LI") {
+    anchor.parentElement.classList.toggle("force-nav-hover");
+  } else {
+    anchor.click();
+  }
+  return true;
+};
+
+KeyNavigation.prototype.focusListItem = function(li) {
+  var anchor = li.firstElementChild;
+  if (!anchor || anchor.nodeName !== "A") return false;
+  anchor.focus();
+  return true;
+};
+
+KeyNavigation.prototype.closeDropdown = function(dropdownLi) {
+  dropdownLi.classList.remove("force-nav-hover");
+  if (dropdownLi.firstElementChild.nodeName === "A") dropdownLi.firstElementChild.focus();
+  return true;
+};
+
+KeyNavigation.prototype.onBackspace = function() {
+  var activeElement = document.activeElement;
+
+  // Detect opened subsequent dropdown
+  if (activeElement.nodeName === "A"
+    && activeElement.parentElement
+    && activeElement.parentElement.nodeName === "LI"
+    && activeElement.parentElement.classList.contains("force-nav-hover")) {
+    return this.closeDropdown(activeElement.parentElement);
+  }
+
+  // Detect opened parent dropdown
+  if (activeElement.nodeName === "A"
+    && activeElement.parentElement
+    && activeElement.parentElement.nodeName === "LI"
+    && activeElement.parentElement.parentElement
+    && activeElement.parentElement.parentElement.nodeName === "UL"
+    && activeElement.parentElement.parentElement.parentElement
+    && activeElement.parentElement.parentElement.parentElement.nodeName === "LI"
+    && activeElement.parentElement.parentElement.parentElement.classList.contains("force-nav-hover")) {
+    return this.closeDropdown(activeElement.parentElement.parentElement.parentElement);
+  }
+};
+
+KeyNavigation.prototype.onArrowDown = function() {
+  var activeElement = document.activeElement;
+
+  // Start of dropdown list: LI > selected A :: UL > LI > A
+  if (activeElement.nodeName === "A"
+    && activeElement.parentElement
+    && activeElement.parentElement.nodeName === "LI"
+    && activeElement.parentElement.classList.contains("force-nav-hover") // opened dropdown
+    && activeElement.nextElementSibling
+    && activeElement.nextElementSibling.nodeName === "UL"
+    && activeElement.nextElementSibling.firstElementChild
+    && activeElement.nextElementSibling.firstElementChild.nodeName === "LI") {
+    return this.focusListItem(activeElement.nextElementSibling.firstElementChild);
+  }
+
+  // Next item of dropdown list: ( LI > selected A ) :: LI > A
+  if (activeElement.nodeName === "A"
+    && activeElement.parentElement
+    && activeElement.parentElement.nodeName === "LI"
+    && activeElement.parentElement.nextElementSibling
+    && activeElement.parentElement.nextElementSibling.nodeName === "LI") {
+    return this.focusListItem(activeElement.parentElement.nextElementSibling);
+  }
+};
+
+KeyNavigation.prototype.onArrowUp = function() {
+  var activeElement = document.activeElement;
+
+  // Prev item of dropdown list: ( LI > selected A ) <:: LI > A
+  if (activeElement.nodeName === "A"
+    && activeElement.parentElement
+    && activeElement.parentElement.nodeName === "LI"
+    && activeElement.parentElement.previousElementSibling
+    && activeElement.parentElement.previousElementSibling.nodeName === "LI") {
+    return this.focusListItem(activeElement.parentElement.previousElementSibling);
+  }
+};
+
+KeyNavigation.prototype.getHandler = function() {
+  return this.onkeydown.bind(this);
+};
+
+// this functions enables the navigation with arrows through list items (li)
+// e.g. in dropdown menus
+function enableArrowListNavigation() {
+  document.addEventListener("keydown", new KeyNavigation().getHandler());
+}
+
+/**********************************************************
+ * Link Hints (Vimium-like)
+ **********************************************************/
+
+function LinkHints(linkHintHotKey) {
+  this.linkHintHotKey    = linkHintHotKey;
+  this.areHintsDisplayed = false;
+  this.pendingPath       = ""; // already typed code prefix
+  this.hintsMap          = this.deployHintContainers();
+  this.activatedDropdown = null;
+  this.yankModeActive    = false;
+}
+
+LinkHints.prototype.getHintStartValue = function(targetsCount) {
+  // e.g. if we have 89 tooltips we start from 10
+  //      if we have 90 tooltips we start from 100
+  //      if we have 900 tooltips we start from 1000
+  var
+    baseLength          = Math.pow(10, targetsCount.toString().length - 1),
+    maxHintStringLength = (targetsCount + baseLength).toString().length;
+  return Math.pow(10, maxHintStringLength - 1);
+};
+
+LinkHints.prototype.deployHintContainers = function() {
+
+  var hintTargets = document.querySelectorAll("a, input, textarea, i");
+  var codeCounter = this.getHintStartValue(hintTargets.length);
+  var hintsMap    = { first: codeCounter };
+
+  // <span class="link-hint" data-code="123">
+  //   <span class="pending">12</span><span>3</span>
+  // </span>
+  for (var i = 0, N = hintTargets.length; i < N; i++) {
+    // skip hidden fields
+    if (hintTargets[i].type === "HIDDEN") {
+      continue;
+    }
+
+    var hint = {};
+
+    hint.container     = document.createElement("span");
+    hint.pendingSpan   = document.createElement("span");
+    hint.remainingSpan = document.createElement("span");
+    hint.parent        = hintTargets[i];
+    hint.code          = codeCounter.toString();
+
+    hint.container.appendChild(hint.pendingSpan);
+    hint.container.appendChild(hint.remainingSpan);
+
+    hint.pendingSpan.classList.add("pending");
+    hint.container.classList.add("link-hint");
+    if (hint.parent.nodeName === "INPUT" || hint.parent.nodeName === "TEXTAREA") {
+      hint.container.classList.add("link-hint-input");
+    } else if (hint.parent.nodeName === "A") {
+      hint.container.classList.add("link-hint-a");
+    } else if (hint.parent.nodeName === "I" && hint.parent.classList.contains("cursor-pointer")) {
+      hint.container.classList.add("link-hint-i");
+    } else {
+      continue;
+    }
+
+    hint.container.classList.add("nodisplay"); // hide by default
+    hint.container.dataset.code = codeCounter.toString(); // not really needed, more for debug
+
+    if (hintTargets[i].nodeName === "INPUT" || hintTargets[i].nodeName === "TEXTAREA") {
+      // does not work if inside the input node
+      if (hintTargets[i].type === "checkbox" || hintTargets[i].type === "radio") {
+        if (hintTargets[i].nextElementSibling && hintTargets[i].nextElementSibling.nodeName === "LABEL") {
+          // insert at end of label
+          hintTargets[i].nextElementSibling.appendChild(hint.container);
+        } else {
+          // inserting right after
+          hintTargets[i].insertAdjacentElement("afterend", hint.container);
+        }
+      } else {
+        // inserting right after
+        hintTargets[i].insertAdjacentElement("afterend", hint.container);
+      }
+    } else {
+      hintTargets[i].appendChild(hint.container);
+    }
+    hintsMap[codeCounter++] = hint;
+  }
+
+  hintsMap.last = codeCounter - 1;
+  return hintsMap;
+};
+
+LinkHints.prototype.getHandler = function() {
+  return this.handleKey.bind(this);
+};
+
+LinkHints.prototype.handleKey = function(event) {
+  if (event.defaultPrevented) {
+    return;
+  }
+
+  if (event.key === "y") {
+    this.yankModeActive = !this.yankModeActive;
+  }
+
+  if (event.key === this.linkHintHotKey && Hotkeys.isHotkeyCallPossible()) {
+
+    // on user hide hints, close an opened dropdown too
+    if (this.areHintsDisplayed && this.activatedDropdown) this.closeActivatedDropdown();
+    if (this.areHintsDisplayed) this.yankModeActive = false;
+
+    this.pendingPath = "";
+    this.displayHints(!this.areHintsDisplayed);
+
+  } else if (this.areHintsDisplayed) {
+
+    // the user tries to reach a hint
+    this.pendingPath += event.key;
+
+    var hint = this.hintsMap[this.pendingPath];
+
+    if (hint) { // we are there, we have a fully specified tooltip. Let us activate or yank it
+      this.displayHints(false);
+      event.preventDefault();
+      if (this.yankModeActive) {
+        submitSapeventForm({ clipboard: hint.parent.firstChild.textContent }, "yank_to_clipboard");
+        this.yankModeActive = false;
+      } else {
+        this.hintActivate(hint);
+      }
+    } else {
+      // we are not there yet, but let us filter the link so that only
+      // the partially matched are shown
+      var visibleHints = this.filterHints();
+      if (!visibleHints) {
+        this.displayHints(false);
+        if (this.activatedDropdown) this.closeActivatedDropdown();
+      }
+    }
+  }
+};
+
+LinkHints.prototype.closeActivatedDropdown = function() {
+  if (!this.activatedDropdown) return;
+  this.activatedDropdown.classList.remove("force-nav-hover");
+  this.activatedDropdown = null;
+};
+
+LinkHints.prototype.displayHints = function(isActivate) {
+  this.areHintsDisplayed = isActivate;
+  for (var i = this.hintsMap.first; i <= this.hintsMap.last; i++) {
+    var hint = this.hintsMap[i];
+    if (isActivate) {
+      hint.container.classList.remove("nodisplay");
+      hint.pendingSpan.innerText   = "";
+      hint.remainingSpan.innerText = hint.code;
+    } else {
+      hint.container.classList.add("nodisplay");
+    }
+  }
+};
+
+LinkHints.prototype.hintActivate = function(hint) {
+  if (hint.parent.nodeName === "A"
+    // hint.parent.href doesn`t have a # at the end while accessing dropdowns the first time.
+    // Seems like a idiosyncrasy of SAPGUI`s IE. So let`s ignore the last character.
+    && (hint.parent.href.substr(0, hint.parent.href.length - 1) === document.location.href)// href is #
+    && !hint.parent.onclick // no handler
+    && hint.parent.parentElement && hint.parent.parentElement.nodeName === "LI") {
+    // probably it is a dropdown ...
+    this.activatedDropdown = hint.parent.parentElement;
+    this.activatedDropdown.classList.toggle("force-nav-hover");
+    hint.parent.focus();
+  } else if (hint.parent.type === "checkbox") {
+    this.toggleCheckbox(hint);
+  } else if (hint.parent.type === "radio") {
+    this.toggleRadioButton(hint);
+  } else if (hint.parent.type === "submit") {
+    hint.parent.click();
+  } else if (hint.parent.nodeName === "INPUT" || hint.parent.nodeName === "TEXTAREA") {
+    hint.parent.focus();
+  } else {
+    hint.parent.click();
+    if (this.activatedDropdown) this.closeActivatedDropdown();
+  }
+};
+
+LinkHints.prototype.toggleCheckbox = function(hint) {
+  var checked = hint.parent.checked;
+  this.triggerClickHandler(hint.parent.parentElement);
+  if (checked === hint.parent.checked) {
+    // fallback if no handler is registered
+    hint.parent.checked = !hint.parent.checked;
+  }
+};
+
+LinkHints.prototype.toggleRadioButton = function(hint) {
+  this.triggerClickHandler(hint.parent);
+};
+
+LinkHints.prototype.triggerClickHandler = function(el) {
+  // ensures that onclick handler is executed
+  // https://stackoverflow.com/questions/41981509/trigger-an-event-when-a-checkbox-is-changed-programmatically-via-javascript
+  var event = document.createEvent("HTMLEvents");
+  event.initEvent("click", false, true);
+  el.dispatchEvent(event);
+};
+
+LinkHints.prototype.filterHints = function() {
+  var visibleHints = 0;
+  for (var i = this.hintsMap.first; i <= this.hintsMap.last; i++) {
+    var hint = this.hintsMap[i];
+    if (i.toString().startsWith(this.pendingPath)) {
+      hint.pendingSpan.innerText   = this.pendingPath;
+      hint.remainingSpan.innerText = hint.code.substring(this.pendingPath.length);
+      // hint.container.classList.remove("nodisplay"); // for backspace
+      visibleHints++;
+    } else {
+      hint.container.classList.add("nodisplay");
+    }
+  }
+  return visibleHints;
+};
+
+function activateLinkHints(linkHintHotKey) {
+  if (!linkHintHotKey) return;
+  var oLinkHint = new LinkHints(linkHintHotKey);
+  document.addEventListener("keypress", oLinkHint.getHandler());
+}
+
+/**********************************************************
+ * Hotkeys
+ **********************************************************/
+
+function Hotkeys(oKeyMap) {
+  this.oKeyMap = oKeyMap || {};
+
+  // these are the hotkeys provided by the backend
+  Object.keys(this.oKeyMap).forEach(function(sKey) {
+
+    var action = this.oKeyMap[sKey];
+
+    // add a tooltip/title with the hotkey, currently only sapevents are supported
+    this.getAllSapEventsForSapEventName(action).forEach(function(elAnchor) {
+      elAnchor.title = elAnchor.title + " [" + sKey + "]";
+    });
+
+    // We replace the actions with callback functions to unify
+    // the hotkey execution
+    this.oKeyMap[sKey] = function(oEvent) {
+
+      // gHelper is only valid for diff page
+      var diffHelper = (window.gHelper || {});
+
+      // We have either a js function on this
+      if (this[action]) {
+        this[action].call(this);
+        return;
+      }
+
+      // Or a method of the helper object for the diff page
+      if (diffHelper[action]) {
+        diffHelper[action].call(diffHelper);
+        return;
+      }
+
+      // Or a global function
+      if (window[action] && typeof (window[action]) === "function") {
+        window[action].call(this);
+        return;
+      }
+
+      // Or a SAP event link
+      var sUiSapEventHref = this.getSapEventHref(action);
+      if (sUiSapEventHref) {
+        submitSapeventForm({}, sUiSapEventHref, "post");
+        oEvent.preventDefault();
+        return;
+      }
+
+      // Or a SAP event input
+      var sUiSapEventInputAction = this.getSapEventInputAction(action);
+      if (sUiSapEventInputAction) {
+        submitSapeventForm({}, sUiSapEventInputAction, "post");
+        oEvent.preventDefault();
+        return;
+      }
+
+      // Or a SAP event main form
+      var elForm = this.getSapEventForm(action);
+      if (elForm) {
+        elForm.submit();
+        oEvent.preventDefault();
+        return;
+      }
+
+    };
+
+  }.bind(this));
+}
+
+Hotkeys.prototype.showHotkeys = function() {
+  var elHotkeys = document.querySelector("#hotkeys");
+
+  if (elHotkeys) {
+    elHotkeys.style.display = (elHotkeys.style.display) ? "" : "none";
+  }
+};
+
+Hotkeys.prototype.getAllSapEventsForSapEventName = function (sSapEvent) {
+  if (/^#+$/.test(sSapEvent)){
+    // sSapEvent contains only #. Nothing sensible can be done here
+    return [];
+  }
+
+  var includesSapEvent = function(text){
+    return (text.includes("sapevent") || text.includes("SAPEVENT"));
+  };
+
+  return [].slice
+    .call(document.querySelectorAll("a[href*="+ sSapEvent +"], input[formaction*="+ sSapEvent+"]"))
+    .filter(function (elem) {
+      return (elem.nodeName === "A" && includesSapEvent(elem.href)
+          || (elem.nodeName === "INPUT" && includesSapEvent(elem.formAction)));
+    });
+};
+
+Hotkeys.prototype.getSapEventHref = function(sSapEvent) {
+  return this.getAllSapEventsForSapEventName(sSapEvent)
+    .filter(function(el) {
+      // only anchors
+      return (!!el.href);
+    })
+    .map(function(oSapEvent) {
+      return oSapEvent.href;
+    })
+    .filter(this.eliminateSapEventFalsePositives(sSapEvent))
+    .pop();
+};
+
+Hotkeys.prototype.getSapEventInputAction = function(sSapEvent) {
+  return this.getAllSapEventsForSapEventName(sSapEvent)
+    .filter(function(el) {
+      // input forms
+      return (el.type === "submit");
+    })
+    .map(function(oSapEvent) {
+      return oSapEvent.formAction;
+    })
+    .filter(this.eliminateSapEventFalsePositives(sSapEvent))
+    .pop();
+};
+
+Hotkeys.prototype.getSapEventForm = function(sSapEvent) {
+  return this.getAllSapEventsForSapEventName(sSapEvent)
+    .filter(function(el) {
+      // forms
+      var parentForm = el.parentNode.parentNode.parentNode;
+      return (el.type === "submit" && parentForm.nodeName === "FORM");
+    })
+    .map(function(oSapEvent) {
+      return oSapEvent.parentNode.parentNode.parentNode;
+    })
+    .pop();
+};
+
+Hotkeys.prototype.eliminateSapEventFalsePositives = function(sapEvent) {
+  return function(sapEventAttr) {
+    return sapEventAttr.match(new RegExp("\\b" + sapEvent + "\\b"));
+  };
+};
+
+Hotkeys.prototype.onkeydown = function(oEvent) {
+  if (oEvent.defaultPrevented) {
+    return;
+  }
+
+  if (!Hotkeys.isHotkeyCallPossible()) {
+    return;
+  }
+
+  var
+    sKey     = oEvent.key || String.fromCharCode(oEvent.keyCode),
+    fnHotkey = this.oKeyMap[sKey];
+
+  if (fnHotkey) {
+    fnHotkey.call(this, oEvent);
+  }
+};
+
+Hotkeys.isHotkeyCallPossible = function() {
+  var activeElementType     = ((document.activeElement && document.activeElement.nodeName) || "");
+  var activeElementReadOnly = ((document.activeElement && document.activeElement.readOnly) || false);
+
+  return (activeElementReadOnly || (activeElementType !== "INPUT" && activeElementType !== "TEXTAREA"));
+};
+
+Hotkeys.addHotkeyToHelpSheet = function(key, description) {
+  var hotkeysUl = document.querySelector("#hotkeys ul.hotkeys");
+  if (!hotkeysUl) return;
+
+  var li        = document.createElement("li");
+  var spanId    = document.createElement("span");
+  var spanDescr = document.createElement("span");
+
+  spanId.className    = "key-id";
+  spanId.innerText    = key;
+  spanDescr.className = "key-descr";
+  spanDescr.innerText = description;
+  li.appendChild(spanId);
+  li.appendChild(spanDescr);
+
+  hotkeysUl.appendChild(li);
+};
+
+function setKeyBindings(oKeyMap) {
+  var oHotkeys = new Hotkeys(oKeyMap);
+
+  document.addEventListener("keypress", oHotkeys.onkeydown.bind(oHotkeys));
+  setTimeout(function() {
+    var div                     = document.getElementById("hotkeys-hint");
+    if  (div) div.style.opacity = 0.2;
+  }, 4900);
+  setTimeout(function() { toggleDisplay("hotkeys-hint") }, 5000);
+}
+
+/**********************************************************
+ * Patch Logic (git add -p)
+ **********************************************************/
+
+/*
+  We have three type of cascading checkboxes.
+  Which means that by clicking a file or section checkbox all corresponding line checkboxes are checked.
+
+  The id of the checkbox indicates its semantics and its membership.
+*/
+
+/*
+  1) file links
+
+      example id of file link
+
+      patch_file_zcl_abapgit_user_exit.clas.abap
+      \________/ \_____________________________/
+          |                   |
+          |                   |____ file name
+          |
+          |
+          |
+      constant prefix
+*/
+
+function PatchFile(sId) {
+  var oRegex = new RegExp("(" + this.ID + ")_(.*$)");
+  var oMatch = sId.match(oRegex);
+
+  this.id        = sId;
+  this.prefix    = oMatch[1];
+  this.file_name = oMatch[2];
+}
+
+PatchFile.prototype.ID = "patch_file";
+
+/*
+  2) section links within a file
+
+      example id of section link
+
+      patch_section_zcl_abapgit_user_exit.clas.abap_1
+      \___________/ \_____________________________/ ^
+            |                   |                   |
+            |               file name               |
+            |                                       |
+            |                                       ------ section
+            |
+      constant prefix
+*/
+
+function PatchSection(sId) {
+  var oRegex = new RegExp("(" + this.ID + ")_(.*)_(\\d+$)");
+  var oMatch = sId.match(oRegex);
+
+  this.id        = sId;
+  this.prefix    = oMatch[1];
+  this.file_name = oMatch[2];
+  this.section   = oMatch[3];
+}
+
+PatchSection.prototype.ID = "patch_section";
+
+/*
+  3) line links within a section
+
+      example id of line link
+
+      patch_line_zcl_abapgit_user_exit.clas.abap_1_25
+      \________/ \_____________________________/ ^  ^
+            ^                  ^                 |  |
+            |                  |                 |  ------- line number
+            |               file name            |
+            |                                 section
+            |
+            |
+      constant prefix
+*/
+
+function PatchLine() { }
+
+PatchLine.prototype.ID = "patch_line";
+
+function Patch() { }
+
+Patch.prototype.ID = {
+  STAGE: "stage"
+};
+
+Patch.prototype.ACTION = {
+  PATCH_STAGE  : "patch_stage",
+  REFRESH_LOCAL: "refresh_local",
+  REFRESH_ALL  : "refresh_all"
+};
+
+Patch.prototype.escape = function(sFileName) {
+  return sFileName
+    .replace(/\./g, "\\.")
+    .replace(/#/g, "\\#");
+};
+
+Patch.prototype.preparePatch = function() {
+  this.registerClickHandlerForFiles();
+  this.registerClickHandlerForSections();
+  this.registerClickHandlerForLines();
+};
+
+Patch.prototype.buildSelectorInputStartsWithId = function(sId) {
+  return "input[id^='" + sId + "']";
+};
+
+Patch.prototype.registerClickHandlerForFiles = function() {
+  this.registerClickHandlerForSelectorParent(this.buildSelectorInputStartsWithId(PatchFile.prototype.ID), this.onClickFileCheckbox);
+};
+
+Patch.prototype.registerClickHandlerForSections = function() {
+  this.registerClickHandlerForSelectorParent(this.buildSelectorInputStartsWithId(PatchSection.prototype.ID), this.onClickSectionCheckbox);
+};
+
+Patch.prototype.registerClickHandlerForLines = function() {
+  this.registerClickHandlerForSelectorParent(this.buildSelectorInputStartsWithId(PatchLine.prototype.ID), this.onClickLineCheckbox);
+};
+
+Patch.prototype.registerClickHandlerForSelectorParent = function(sSelector, fnCallback) {
+  var elAll = document.querySelectorAll(sSelector);
+
+  [].forEach.call(elAll, function(elem) {
+    elem.parentElement.addEventListener("click", fnCallback.bind(this));
+  }.bind(this));
+};
+
+Patch.prototype.getAllLineCheckboxesForFile = function(oFile) {
+  return this.getAllLineCheckboxesForId(oFile.id, PatchFile.prototype.ID);
+};
+
+Patch.prototype.getAllSectionCheckboxesForFile = function(oFile) {
+  return this.getAllSectionCheckboxesForId(oFile.id, PatchFile.prototype.ID);
+};
+
+Patch.prototype.getAllLineCheckboxesForSection = function(oSection) {
+  return this.getAllLineCheckboxesForId(oSection.id, PatchSection.prototype.ID);
+};
+
+Patch.prototype.getAllLineCheckboxesForId = function(sId, sIdPrefix) {
+  return this.getAllCheckboxesForId(sId, sIdPrefix, PatchLine.prototype.ID);
+};
+
+Patch.prototype.getAllSectionCheckboxesForId = function(sId, sIdPrefix) {
+  return this.getAllCheckboxesForId(sId, sIdPrefix, PatchSection.prototype.ID);
+};
+
+Patch.prototype.getAllCheckboxesForId = function(sId, sIdPrefix, sNewIdPrefix) {
+  var oRegex = new RegExp("^" + sIdPrefix);
+
+  sId = sId.replace(oRegex, sNewIdPrefix);
+  return document.querySelectorAll(this.buildSelectorInputStartsWithId(this.escape(sId)));
+};
+
+Patch.prototype.getToggledCheckbox = function(oEvent) {
+  var elCheckbox = null;
+
+  // We have either an input element or any element with input child
+  // in the latter case we have to toggle the checkbox manually
+  if (oEvent.srcElement.nodeName === "INPUT") {
+    elCheckbox = oEvent.srcElement;
+  } else {
+    elCheckbox = this.toggleCheckbox(oEvent.srcElement.querySelector("INPUT"));
+  }
+
+  return elCheckbox;
+};
+
+Patch.prototype.toggleCheckbox = function(elCheckbox) {
+  elCheckbox.checked = !elCheckbox.checked;
+  return elCheckbox;
+};
+
+Patch.prototype.onClickFileCheckbox = function(oEvent) {
+  var elCheckbox                   = this.getToggledCheckbox(oEvent);
+  var oFile                        = new PatchFile(elCheckbox.id);
+  var elAllLineCheckboxesOfFile    = this.getAllLineCheckboxesForFile(oFile);
+  var elAllSectionCheckboxesOfFile = this.getAllSectionCheckboxesForFile(oFile);
+
+  [].forEach.call(elAllLineCheckboxesOfFile, function(elem) {
+    elem.checked = elCheckbox.checked;
+  }.bind(this));
+
+  [].forEach.call(elAllSectionCheckboxesOfFile, function(elem) {
+    elem.checked = elCheckbox.checked;
+  }.bind(this));
+};
+
+Patch.prototype.onClickSectionCheckbox = function(oEvent) {
+  var elSrcElement = this.getToggledCheckbox(oEvent);
+  var oSection     = new PatchSection(elSrcElement.id);
+  this.clickAllLineCheckboxesInSection(oSection, elSrcElement.checked);
+};
+
+Patch.prototype.onClickLineCheckbox = function(oEvent) {
+  this.getToggledCheckbox(oEvent);
+};
+
+Patch.prototype.clickAllLineCheckboxesInSection = function(oSection, bChecked) {
+  var elAllLineCheckboxesOfSection = this.getAllLineCheckboxesForSection(oSection);
+
+  [].forEach.call(elAllLineCheckboxesOfSection, function(elem) {
+    elem.checked = bChecked;
+  }.bind(this));
+};
+
+Patch.prototype.registerStagePatch = function() {
+  var elStage        = document.querySelector("#" + this.ID.STAGE);
+  var REFRESH_PREFIX = "refresh";
+
+  elStage.addEventListener("click", this.submitPatch.bind(this, this.ACTION.PATCH_STAGE));
+
+  var aRefresh = document.querySelectorAll("[id*=" + REFRESH_PREFIX + "]");
+  [].forEach.call(aRefresh, function(el) {
+    el.addEventListener("click", memorizeScrollPosition(this.submitPatch.bind(this, el.id)).bind(this));
+  }.bind(this));
+
+  // for hotkeys
+  window.stagePatch = function() {
+    this.submitPatch(this.ACTION.PATCH_STAGE);
+  }.bind(this);
+
+  window.refreshLocal = memorizeScrollPosition(function() {
+    this.submitPatch(this.ACTION.REFRESH_LOCAL);
+  }.bind(this));
+
+  window.refreshAll = memorizeScrollPosition(function() {
+    this.submitPatch(this.ACTION.REFRESH_ALL);
+  }.bind(this));
+};
+
+Patch.prototype.submitPatch = function(action) {
+  // Collect add and remove info and submit to backend
+  var aAddPatch    = this.collectElementsForCheckboxId(PatchLine.prototype.ID, true);
+  var aRemovePatch = this.collectElementsForCheckboxId(PatchLine.prototype.ID, false);
+
+  submitSapeventForm({ add: aAddPatch, remove: aRemovePatch }, action, "post");
+};
+
+Patch.prototype.collectElementsForCheckboxId = function(sId, bChecked) {
+  var sSelector = this.buildSelectorInputStartsWithId(sId);
+
+  return [].slice.call(document.querySelectorAll(sSelector))
+    .filter(function(elem) {
+      return (elem.checked === bChecked);
+    }).map(function(elem) {
+      return elem.id;
+    });
+};
+
+function preparePatch() {
+  var oPatch = new Patch();
+  oPatch.preparePatch();
+}
+
+function registerStagePatch() {
+  var oPatch = new Patch();
+  oPatch.registerStagePatch();
+}
+
+/**********************************************************
+ * Command Palette (Ctrl + P)
+ **********************************************************/
+
+// fuzzy match helper
+// return non empty marked string in case it fits the filter
+// abc + b = a<mark>b</mark>c
+function fuzzyMatchAndMark(str, filter) {
+  var markedStr   = "";
+  var filterLower = filter.toLowerCase();
+  var strLower    = str.toLowerCase();
+  var cur         = 0;
+
+  for (var i = 0; i < filter.length; i++) {
+    while (filterLower[i] !== strLower[cur] && cur < str.length) {
+      markedStr += str[cur++];
+    }
+    if (cur === str.length) break;
+    markedStr += "<mark>" + str[cur++] + "</mark>";
+  }
+
+  var matched = i === filter.length;
+
+  if (matched && cur < str.length) markedStr += str.substring(cur);
+  return matched ? markedStr: null;
+}
+
+function CommandPalette(commandEnumerator, opts) {
+  if (typeof commandEnumerator !== "function") throw Error("commandEnumerator must be a function");
+  if (typeof opts !== "object") throw Error("opts must be an object");
+  if (typeof opts.toggleKey !== "string" || !opts.toggleKey) throw Error("toggleKey must be a string");
+  this.commands = commandEnumerator();
+  if (!this.commands) return;
+  // this.commands = [{
+  //   action:    "sap_event_action_code_with_params"
+  //   iconClass: "icon icon_x ..."
+  //   title:     "my command X"
+  // }, ...];
+
+  if (opts.toggleKey[0] === "^") {
+    this.toggleKeyCtrl = true;
+    this.toggleKey     = opts.toggleKey.substring(1);
+    if (!this.toggleKey) throw Error("Incorrect toggleKey");
+  } else {
+    this.toggleKeyCtrl = false;
+    this.toggleKey     = opts.toggleKey;
+  }
+
+  this.hotkeyDescription = opts.hotkeyDescription;
+  this.elements          = {
+    palette: null,
+    ul     : null,
+    input  : null
+  };
+  this.selectIndex = -1; // not selected
+  this.filter      = "";
+  this.renderAndBindElements();
+  this.hookEvents();
+  Hotkeys.addHotkeyToHelpSheet(opts.toggleKey, opts.hotkeyDescription);
+
+  if (!CommandPalette.instances) {
+    CommandPalette.instances = [];
+  }
+  CommandPalette.instances.push(this);
+}
+
+CommandPalette.prototype.hookEvents = function() {
+  document.addEventListener("keydown", this.handleToggleKey.bind(this));
+  this.elements.input.addEventListener("keyup", this.handleInputKey.bind(this));
+  this.elements.ul.addEventListener("click", this.handleUlClick.bind(this));
+};
+
+CommandPalette.prototype.renderCommandItem = function(cmd) {
+  var li = document.createElement("li");
+  if (cmd.iconClass) {
+    var icon = document.createElement("i");
+
+    icon.className = cmd.iconClass;
+    li.appendChild(icon);
+  }
+  var titleSpan = document.createElement("span");
+  li.appendChild(titleSpan);
+  cmd.element   = li;
+  cmd.titleSpan = titleSpan;
+  return li;
+};
+
+CommandPalette.prototype.renderAndBindElements = function() {
+  var div   = document.createElement("div");
+  var input = document.createElement("input");
+  var ul    = document.createElement("ul");
+
+  div.className     = "cmd-palette";
+  div.style.display = "none";
+  input.placeholder = this.hotkeyDescription;
+  for (var i = 0; i < this.commands.length; i++) ul.appendChild(this.renderCommandItem(this.commands[i]));
+  div.appendChild(input);
+  div.appendChild(ul);
+
+  this.elements.palette = div;
+  this.elements.input   = input;
+  this.elements.ul      = ul;
+  document.body.appendChild(div);
+};
+
+CommandPalette.prototype.handleToggleKey = function(event) {
+  if (event.key !== this.toggleKey) return;
+  if (this.toggleKeyCtrl && !event.ctrlKey) return;
+  this.toggleDisplay();
+  event.preventDefault();
+};
+
+CommandPalette.prototype.handleInputKey = function(event) {
+  if (event.key === "ArrowUp" || event.key === "Up") {
+    this.selectPrev();
+  } else if (event.key === "ArrowDown" || event.key === "Down") {
+    this.selectNext();
+  } else if (event.key === "Enter") {
+    this.exec(this.getSelected());
+  } else if (event.key === "Backspace" && !this.filter) {
+    this.toggleDisplay(false);
+  } else if (this.filter !== this.elements.input.value) {
+    this.filter = this.elements.input.value;
+    this.applyFilter();
+    this.selectFirst();
+  }
+  event.preventDefault();
+};
+
+CommandPalette.prototype.applyFilter = function() {
+  for (var i = 0; i < this.commands.length; i++) {
+    var cmd = this.commands[i];
+    if (!this.filter) {
+      cmd.element.style.display = "";
+      cmd.titleSpan.innerText   = cmd.title;
+    } else {
+      var matchedTitle = fuzzyMatchAndMark(cmd.title, this.filter);
+      if (matchedTitle) {
+        cmd.titleSpan.innerHTML   = matchedTitle;
+        cmd.element.style.display = "";
+      } else {
+        cmd.element.style.display = "none";
+      }
+    }
+  }
+};
+
+CommandPalette.prototype.applySelectIndex = function(newIndex) {
+  if (newIndex !== this.selectIndex) {
+    if (this.selectIndex >= 0) this.commands[this.selectIndex].element.classList.remove("selected");
+    var newCmd = this.commands[newIndex];
+    newCmd.element.classList.add("selected");
+    this.selectIndex = newIndex;
+    this.adjustScrollPosition(newCmd.element);
+  }
+};
+
+CommandPalette.prototype.selectFirst = function() {
+  for (var i = 0; i < this.commands.length; i++) {
+    if (this.commands[i].element.style.display === "none") continue; // skip hidden
+    this.applySelectIndex(i);
+    break;
+  }
+};
+
+CommandPalette.prototype.selectNext = function() {
+  for (var i = this.selectIndex + 1; i < this.commands.length; i++) {
+    if (this.commands[i].element.style.display === "none") continue; // skip hidden
+    this.applySelectIndex(i);
+    break;
+  }
+};
+
+CommandPalette.prototype.selectPrev = function() {
+  for (var i = this.selectIndex - 1; i >= 0; i--) {
+    if (this.commands[i].element.style.display === "none") continue; // skip hidden
+    this.applySelectIndex(i);
+    break;
+  }
+};
+
+CommandPalette.prototype.getSelected = function() {
+  return this.commands[this.selectIndex];
+};
+
+CommandPalette.prototype.adjustScrollPosition = function(itemElement) {
+  var bItem      = itemElement.getBoundingClientRect();
+  var bContainer = this.elements.ul.getBoundingClientRect();
+
+  bItem.top         = Math.round(bItem.top);
+  bItem.bottom      = Math.round(bItem.bottom);
+  bItem.height      = Math.round(bItem.height);
+  bItem.mid         = Math.round(bItem.top + bItem.height / 2);
+  bContainer.top    = Math.round(bContainer.top);
+  bContainer.bottom = Math.round(bContainer.bottom);
+
+  if (bItem.mid > bContainer.bottom - 2) {
+    this.elements.ul.scrollTop += bItem.bottom - bContainer.bottom;
+  } else if (bItem.mid < bContainer.top + 2) {
+    this.elements.ul.scrollTop += bItem.top - bContainer.top;
+  }
+};
+
+CommandPalette.prototype.toggleDisplay = function(forceState) {
+  var isDisplayed   = (this.elements.palette.style.display !== "none");
+  var tobeDisplayed = (forceState !== undefined) ? forceState : !isDisplayed;
+
+  if (tobeDisplayed) {
+    // auto close other command palettes
+    CommandPalette.instances.forEach(function(instance) {
+      instance.elements.palette.style.display = "none";
+    });
+  }
+
+  this.elements.palette.style.display = tobeDisplayed ? "" : "none";
+  if (tobeDisplayed) {
+    this.elements.input.value = "";
+    this.elements.input.focus();
+    this.applyFilter();
+    this.selectFirst();
+  }
+};
+
+CommandPalette.prototype.getCommandByElement = function(element) {
+  for (var i = 0; i < this.commands.length; i++) {
+    if (this.commands[i].element === element) return this.commands[i];
+  }
+};
+
+CommandPalette.prototype.handleUlClick = function(event) {
+  var element = event.target || event.srcElement;
+  if (!element) return;
+  if (element.nodeName === "SPAN") element = element.parentNode;
+
+  if (element.nodeName === "I") element = element.parentNode;
+
+  if (element.nodeName !== "LI") return;
+  this.exec(this.getCommandByElement(element));
+};
+
+CommandPalette.prototype.exec = function(cmd) {
+  if (!cmd) return;
+  this.toggleDisplay(false);
+  if (typeof cmd.action === "function") {
+    cmd.action();
+  } else {
+    submitSapeventForm(null, cmd.action);
+  }
+};
+
+// Is any command palette visible?
+CommandPalette.isVisible = function() {
+  return CommandPalette.instances.reduce(function(result, instance) { return result || instance.elements.palette.style.display !== "none" }, false);
+};
+
+/**********************************************************
+ * Command Enumerators
+ **********************************************************/
+
+function createRepoCatalogEnumerator(catalog, action) {
+  // expecting [{ key, isOffline, displayName }]
+  return function() {
+    return catalog.map(function(i) {
+      return {
+        action   : action + "?key=" + i.key,
+        iconClass: i.isOffline ? "icon icon-plug darkgrey" : "icon icon-cloud-upload-alt blue",
+        title    : i.displayName
+      };
+    });
+  };
+}
+
+function enumerateUiActions() {
+  var items = [];
+  function processUL(ulNode, prefix) {
+    for (var i = 0; i < ulNode.children.length; i++) {
+      var item = ulNode.children[i];
+      if (item.nodeName !== "LI") continue; // unexpected node
+      if (item.children.length >= 2 && item.children[1].nodeName === "UL") {
+        // submenu detected
+        var menutext = item.children[0].innerText;
+        // special treatment for menus without text
+        if (!menutext) {
+          menutext = item.children[0].getAttribute("title");
+        }
+        processUL(item.children[1], menutext);
+      } else if (item.firstElementChild && item.firstElementChild.nodeName === "A") {
+        var anchor = item.firstElementChild;
+        if (anchor.href && anchor.href !== "#") items.push([anchor, prefix]);
+      }
+    }
+  }
+
+  // toolbars
+  [].slice.call(document.querySelectorAll("[id*=toolbar]"))
+    .filter(function(toolbar) {
+      return (toolbar && toolbar.nodeName === "UL");
+    }).forEach(function(toolbar) {
+      processUL(toolbar);
+    });
+
+  items = items.map(function(item) {
+    var action = "";
+    var anchor = item[0];
+    if (anchor.href.includes("#")) {
+      action = function() {
+        anchor.click();
+      };
+    } else {
+      action = anchor.href.replace("sapevent:", "");
+    }
+    var prefix = item[1];
+    return {
+      action: action,
+      title : (prefix ? prefix + ": " : "") + anchor.innerText.trim()
+    };
+  });
+
+  // forms
+  [].slice.call(document.querySelectorAll("input[type='submit']"))
+    .forEach(function(input) {
+      items.push({
+        action: function() {
+          if (input.form.action.includes(input.formAction)) {
+            input.form.submit();
+          } else {
+            submitSapeventForm({}, input.formAction, "post", input.form);
+          }
+        },
+        title: input.value + " " + input.title.replace(/\[.*\]/, "")
+      });
+    });
+
+  // radio buttons
+  [].slice.call(document.querySelectorAll("input[type='radio']"))
+    .forEach(function(input) {
+      items.push({
+        action: function() {
+          input.click();
+        },
+        title: document.querySelector("label[for='" + input.id + "']").textContent
+      });
+    });
+
+  // others:
+  // - links inside forms
+  // - label links
+  // - command links
+  // - other header links
+  [].slice.call(document.querySelectorAll("form a, a.command, #header ul:not([id*='toolbar']) a"))
+    .filter(function(anchor) {
+      return !!anchor.title || !!anchor.text;
+    }).forEach(function(anchor) {
+      items.push({
+        action: function() {
+          anchor.click();
+        },
+        title: (function() {
+          var result = anchor.title + anchor.text;
+          if (anchor.href.includes("label")) {
+            result = "Label: " + result;
+          }
+          return result;
+        })()
+      });
+    });
+
+  return items;
+}
+
+function enumerateJumpAllFiles() {
+  var root = document.getElementById("jump");
+  if (!root || root.nodeName !== "UL") return null;
+
+  return Array
+    .prototype.slice.call(root.children)
+    .filter(function(elem) { return elem.nodeName === "LI" })
+    .map(function(listItem) {
+      var title = listItem.children[0].childNodes[0].textContent;
+      return {
+        action: root.onclick.bind(null, title),
+        title : title
+      };
+    });
+}
+
+/**********************************************************
+ * Save Scroll Position
+ **********************************************************/
+
+function saveScrollPosition() {
+  // Not supported by Java GUI
+  try { if (!window.sessionStorage) { return } }
+  catch (err) { return }
+
+  window.sessionStorage.setItem("scrollTop", document.querySelector("html").scrollTop);
+}
+
+function restoreScrollPosition() {
+  // Not supported by Java GUI
+  try { if (!window.sessionStorage) { return } }
+  catch (err) { return }
+
+  var scrollTop = window.sessionStorage.getItem("scrollTop");
+  if (scrollTop) {
+    document.querySelector("html").scrollTop = scrollTop;
+  }
+  window.sessionStorage.setItem("scrollTop", 0);
+}
+
+function memorizeScrollPosition(fn) {
+  return function() {
+    saveScrollPosition();
+    return fn.call(this, fn.args);
+  }.bind(this);
+}
+
+/**********************************************************
+ * Sticky Header
+ **********************************************************/
+
+/* https://www.w3schools.com/howto/howto_js_navbar_sticky.asp */
+/* Note: We have to use JS since IE does not support CSS position:sticky */
+
+// When the user scrolls the page, execute toggleSticky
+window.onscroll = function() { toggleSticky() };
+
+// Add the sticky class to the navbar when you reach its scroll position.
+// Remove "sticky" when you leave the scroll position
+function toggleSticky() {
+  var body   = document.getElementsByTagName("body")[0];
+  var header = document.getElementById("header");
+  var sticky = header.offsetTop;
+
+  var stickyClass = "sticky";
+  if (body.classList.contains("full_width")) {
+    stickyClass = "sticky_full_width";
+  }
+
+  if (window.pageYOffset >= sticky) {
+    header.classList.add(stickyClass);
+  } else {
+    header.classList.remove(stickyClass);
+  }
+}
+
+/**********************************************************
+ * Browser Control
+ **********************************************************/
+
+// Toggle display of warning message when using Edge (based on Chromium) browser control
+// Todo: Remove once https://github.com/abapGit/abapGit/issues/4841 is fixed
+function toggleBrowserControlWarning(){
+  if (!navigator.userAgent.includes("Edg")){
+    var elBrowserControlWarning = document.getElementById("browser-control-warning");
+    if (elBrowserControlWarning) {
+      elBrowserControlWarning.style.display = "none";
+    }
+  }
+}
+
+// Output type of HTML control in the abapGit footer
+function displayBrowserControlFooter() {
+  var out = document.getElementById("browser-control-footer");
+  out.innerHTML = " - " + ( navigator.userAgent.includes("Edg") ? "Edge" : "IE"  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zcl_abapgit_frontend_services.clas.abap.html b/src/ui/zcl_abapgit_frontend_services.clas.abap.html new file mode 100644 index 00000000000..893f4fb9168 --- /dev/null +++ b/src/ui/zcl_abapgit_frontend_services.clas.abap.html @@ -0,0 +1,1390 @@ + + + + + + Code coverage report for src/ui/zcl_abapgit_frontend_services.clas.abap + + + + + + + + + +
+
+

All files / src/ui zcl_abapgit_frontend_services.clas.abap

+
+ +
+ 50.8% + Statements + 221/435 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 50.8% + Lines + 221/435 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +4361x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_frontend_services DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_ui_factory.
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_frontend_services.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_frontend_services IMPLEMENTATION.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~clipboard_export.
+
+    DATA lv_rc TYPE i.
+
+    " Note: do not use a string table for 'it_data'!
+
+    TRY.
+        CALL METHOD cl_gui_frontend_services=>('CLIPBOARD_EXPORT')
+          EXPORTING
+            no_auth_check        = iv_no_auth_check " >= 740
+          IMPORTING
+            data                 = it_data
+          CHANGING
+            rc                   = lv_rc
+          EXCEPTIONS
+            cntl_error           = 1
+            error_no_gui         = 2
+            not_supported_by_gui = 3
+            no_authority         = 4
+            OTHERS               = 5.
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+
+      CATCH cx_sy_dyn_call_param_missing.
+
+        cl_gui_frontend_services=>clipboard_export(
+          IMPORTING
+            data                 = it_data
+          CHANGING
+            rc                   = lv_rc
+          EXCEPTIONS
+            cntl_error           = 1
+            error_no_gui         = 2
+            not_supported_by_gui = 3
+            no_authority         = 4
+          OTHERS               = 5 ).
+        IF sy-subrc <> 0.
+          zcx_abapgit_exception=>raise_t100( ).
+        ENDIF.
+
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~directory_browse.
+
+    cl_gui_frontend_services=>directory_browse(
+      EXPORTING
+        window_title         = iv_window_title
+        initial_folder       = iv_initial_folder
+      CHANGING
+        selected_folder      = cv_selected_folder
+      EXCEPTIONS
+        cntl_error           = 1
+        error_no_gui         = 2
+        not_supported_by_gui = 3
+        OTHERS               = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~directory_create.
+
+    cl_gui_frontend_services=>directory_create(
+      EXPORTING
+        directory                = iv_directory
+      CHANGING
+        rc                       = cv_rc
+      EXCEPTIONS
+        directory_create_failed  = 1
+        cntl_error               = 2
+        error_no_gui             = 3
+        directory_access_denied  = 4
+        directory_already_exists = 5
+        path_not_found           = 6
+        unknown_error            = 7
+        not_supported_by_gui     = 8
+        wrong_parameter          = 9
+        OTHERS                   = 10 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~directory_exist.
+ 
+    cl_gui_frontend_services=>directory_exist(
+      EXPORTING
+        directory            = iv_directory
+      RECEIVING
+        result               = rv_exists
+      EXCEPTIONS
+        cntl_error           = 1
+        error_no_gui         = 2
+        wrong_parameter      = 3
+        not_supported_by_gui = 4
+        OTHERS               = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~execute.
+
+    cl_gui_frontend_services=>execute(
+      EXPORTING
+        document               = iv_document
+        application            = iv_application
+        parameter              = iv_parameter
+        default_directory      = iv_default_directory
+        maximized              = iv_maximized
+        minimized              = iv_minimized
+        synchronous            = iv_synchronous
+        operation              = iv_operation
+      EXCEPTIONS
+        cntl_error             = 1
+        error_no_gui           = 2
+        bad_parameter          = 3
+        file_not_found         = 4
+        path_not_found         = 5
+        file_extension_unknown = 6
+        error_execute_failed   = 7
+        synchronous_failed     = 8
+        not_supported_by_gui   = 9
+        OTHERS                 = 10 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~file_download.
+
+    TYPES ty_hex TYPE x LENGTH 200.
+    DATA lt_rawdata TYPE STANDARD TABLE OF ty_hex WITH DEFAULT KEY.
+
+    zcl_abapgit_convert=>xstring_to_bintab(
+      EXPORTING iv_xstr   = iv_xstr
+      IMPORTING et_bintab = lt_rawdata ).
+
+    cl_gui_frontend_services=>gui_download(
+      EXPORTING
+        bin_filesize              = xstrlen( iv_xstr )
+        filename                  = iv_path
+        filetype                  = 'BIN'
+      CHANGING
+        data_tab                  = lt_rawdata
+      EXCEPTIONS
+        file_write_error          = 1
+        no_batch                  = 2
+        gui_refuse_filetransfer   = 3
+        invalid_type              = 4
+        no_authority              = 5
+        unknown_error             = 6
+        header_not_allowed        = 7
+        separator_not_allowed     = 8
+        filesize_not_allowed      = 9
+        header_too_long           = 10
+        dp_error_create           = 11
+        dp_error_send             = 12
+        dp_error_write            = 13
+        unknown_dp_error          = 14
+        access_denied             = 15
+        dp_out_of_memory          = 16
+        disk_full                 = 17
+        dp_timeout                = 18
+        file_not_found            = 19
+        dataprovider_exception    = 20
+        control_flush_error       = 21
+        not_supported_by_gui      = 22
+        error_no_gui              = 23
+        OTHERS                    = 24 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~file_upload.
+ 
+    TYPES: ty_hex TYPE x LENGTH 255.
+ 
+    DATA: lt_data   TYPE TABLE OF ty_hex WITH DEFAULT KEY,
+          lv_length TYPE i.
+ 
+    cl_gui_frontend_services=>gui_upload(
+      EXPORTING
+        filename                = iv_path
+        filetype                = 'BIN'
+      IMPORTING
+        filelength              = lv_length
+      CHANGING
+        data_tab                = lt_data
+      EXCEPTIONS
+        file_open_error         = 1
+        file_read_error         = 2
+        no_batch                = 3
+        gui_refuse_filetransfer = 4
+        invalid_type            = 5
+        no_authority            = 6
+        unknown_error           = 7
+        bad_data_format         = 8
+        header_not_allowed      = 9
+        separator_not_allowed   = 10
+        header_too_long         = 11
+        unknown_dp_error        = 12
+        access_denied           = 13
+        dp_out_of_memory        = 14
+        disk_full               = 15
+        dp_timeout              = 16
+        not_supported_by_gui    = 17
+        error_no_gui            = 18
+        OTHERS                  = 19 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    CONCATENATE LINES OF lt_data INTO rv_xstr IN BYTE MODE.
+    rv_xstr = rv_xstr(lv_length).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~get_file_separator.
+
+    cl_gui_frontend_services=>get_file_separator(
+      CHANGING
+        file_separator       = cv_file_separator
+      EXCEPTIONS
+        not_supported_by_gui = 1
+        error_no_gui         = 2
+        cntl_error           = 3
+        OTHERS               = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~get_gui_version.
+
+    DATA:
+      lt_version_table TYPE filetable,
+      lv_rc            TYPE i,
+      ls_version       LIKE LINE OF lt_version_table.
+
+    cl_gui_frontend_services=>get_gui_version(
+      CHANGING
+        version_table            = lt_version_table
+        rc                       = lv_rc
+      EXCEPTIONS
+        get_gui_version_failed   = 1
+        cant_write_version_table = 2
+        gui_no_version           = 3
+        cntl_error               = 4
+        error_no_gui             = 5
+        not_supported_by_gui     = 6
+        OTHERS                   = 7 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+    READ TABLE lt_version_table INTO ls_version INDEX 1. " gui release
+    ev_gui_release = ls_version-filename.
+    READ TABLE lt_version_table INTO ls_version INDEX 2. " gui sp
+    ev_gui_sp = ls_version-filename.
+    READ TABLE lt_version_table INTO ls_version INDEX 3. " gui patch
+    ev_gui_patch = ls_version-filename.
+
+    ev_gui_version_string = |{ ev_gui_release }.{ condense( ev_gui_sp ) }.{ condense( ev_gui_patch ) }|.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~get_system_directory.
+
+    cl_gui_frontend_services=>get_system_directory(
+      CHANGING
+        system_directory     = cv_system_directory
+      EXCEPTIONS
+        cntl_error           = 1
+        error_no_gui         = 2
+        not_supported_by_gui = 3
+        OTHERS               = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~gui_is_available.
+ 
+    CALL FUNCTION 'GUI_IS_AVAILABLE'
+      IMPORTING
+        return = rv_gui_is_available.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~is_sapgui_for_java.
+ 
+    CALL FUNCTION 'GUI_HAS_JAVABEANS'
+      IMPORTING
+        return = rv_result.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~is_sapgui_for_windows.
+ 
+    CALL FUNCTION 'GUI_HAS_ACTIVEX'
+      IMPORTING
+        return = rv_result.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~is_webgui.
+ 
+    CALL FUNCTION 'GUI_IS_ITS'
+      IMPORTING
+        return = rv_is_webgui.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~show_file_open_dialog.
+ 
+    DATA:
+      lt_file_table TYPE filetable,
+      ls_file_table LIKE LINE OF lt_file_table,
+      lv_filter     TYPE string,
+      lv_action     TYPE i,
+      lv_rc         TYPE i.
+ 
+    IF iv_extension = 'zip'.
+      lv_filter = 'ZIP Files (*.zip)|*.zip|' && cl_gui_frontend_services=>filetype_all.
+    ENDIF.
+ 
+    cl_gui_frontend_services=>file_open_dialog(
+      EXPORTING
+        window_title            = iv_title
+        default_filename        = iv_default_filename
+        file_filter             = lv_filter
+      CHANGING
+        file_table              = lt_file_table
+        rc                      = lv_rc
+        user_action             = lv_action
+      EXCEPTIONS
+        file_open_dialog_failed = 1
+        cntl_error              = 2
+        error_no_gui            = 3
+        not_supported_by_gui    = 4
+        OTHERS                  = 5 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+    IF lv_action = cl_gui_frontend_services=>action_cancel.
+      zcx_abapgit_exception=>raise( 'Cancelled' ).
+    ENDIF.
+ 
+    READ TABLE lt_file_table INDEX 1 INTO ls_file_table.
+    ASSERT sy-subrc = 0.
+    rv_path = ls_file_table-filename.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_frontend_services~show_file_save_dialog.
+ 
+    DATA:
+      lv_action   TYPE i,
+      lv_filter   TYPE string,
+      lv_filename TYPE string,
+      lv_path     TYPE string.
+ 
+    IF iv_extension = 'zip'.
+      lv_filter = 'ZIP Files (*.zip)|*.zip|' && cl_gui_frontend_services=>filetype_all.
+    ENDIF.
+ 
+    cl_gui_frontend_services=>file_save_dialog(
+      EXPORTING
+        window_title         = iv_title
+        default_extension    = iv_extension
+        default_file_name    = iv_default_filename
+        file_filter          = lv_filter
+      CHANGING
+        filename             = lv_filename
+        path                 = lv_path
+        fullpath             = rv_path
+        user_action          = lv_action
+      EXCEPTIONS
+        cntl_error           = 1
+        error_no_gui         = 2
+        not_supported_by_gui = 3
+        OTHERS               = 4 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+    IF lv_action = cl_gui_frontend_services=>action_cancel.
+      zcx_abapgit_exception=>raise( 'Cancelled' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zcl_abapgit_password_dialog.clas.abap.html b/src/ui/zcl_abapgit_password_dialog.clas.abap.html new file mode 100644 index 00000000000..163a5aab683 --- /dev/null +++ b/src/ui/zcl_abapgit_password_dialog.clas.abap.html @@ -0,0 +1,310 @@ + + + + + + Code coverage report for src/ui/zcl_abapgit_password_dialog.clas.abap + + + + + + + + + +
+
+

All files / src/ui zcl_abapgit_password_dialog.clas.abap

+
+ +
+ 100% + Statements + 75/75 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 75/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +761x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_password_dialog DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS popup
+      IMPORTING
+        !iv_repo_url TYPE string
+      CHANGING
+        !cv_user     TYPE string
+        !cv_pass     TYPE string
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_password_dialog IMPLEMENTATION.
+ 
+ 
+  METHOD popup.
+ 
+    DATA: lx_error TYPE REF TO cx_sy_dyn_call_illegal_form.
+ 
+    IF zcl_abapgit_ui_factory=>get_frontend_services( )->gui_is_available( ) = abap_true.
+ 
+      TRY.
+          PERFORM password_popup
+            IN PROGRAM (sy-cprog)
+            USING iv_repo_url
+            CHANGING cv_user cv_pass.
+        CATCH cx_sy_dyn_call_illegal_form INTO lx_error.
+          " abapGit was called via API and either wrong or no username/password
+          " was supplied. It's not possible to call abapGit password popup in
+          " this case.
+          " See https://docs.abapgit.org/development/api.html#online-repository
+          " on how to provide username/password
+          zcx_abapgit_exception=>raise_with_text( lx_error ).
+      ENDTRY.
+    ELSE.
+      "Extract user credentials from the environment...
+      "Class ZCL_ABAPGIT_DEFAULT_AUTH_INFO is part of https://github.com/abapGit/ADT_Backend.
+      "It stores the credentials of a private repository as long as the session exists.
+      "Usually this class should belong to abapGit core and a refactoring is recommended.
+      "As a temporary solution - and to avoid a DYNPRO_SEND_IN_BACKGROUND dump - a generic
+      "call of the getter methods for username and password is implemented by PR#2635.
+      TRY.
+          CALL METHOD ('ZCL_ABAPGIT_DEFAULT_AUTH_INFO')=>('GET_USER')
+            RECEIVING
+              rv_user = cv_user.
+        CATCH cx_root.
+          RETURN.
+      ENDTRY.
+      TRY.
+          CALL METHOD ('ZCL_ABAPGIT_DEFAULT_AUTH_INFO')=>('GET_PASSWORD')
+            RECEIVING
+              rv_password = cv_pass.
+        CATCH cx_root.
+          "check if old version with typo in method name exists
+          TRY.
+              CALL METHOD ('ZCL_ABAPGIT_DEFAULT_AUTH_INFO')=>('GET_PASSOWORD')
+                RECEIVING
+                  rv_password = cv_pass.
+            CATCH cx_root.
+              RETURN.
+          ENDTRY.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zcl_abapgit_popups.clas.abap.html b/src/ui/zcl_abapgit_popups.clas.abap.html new file mode 100644 index 00000000000..1dd5f298a29 --- /dev/null +++ b/src/ui/zcl_abapgit_popups.clas.abap.html @@ -0,0 +1,3025 @@ + + + + + + Code coverage report for src/ui/zcl_abapgit_popups.clas.abap + + + + + + + + + +
+
+

All files / src/ui zcl_abapgit_popups.clas.abap

+
+ +
+ 81.83% + Statements + 802/980 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 81.83% + Lines + 802/980 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +9811x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_popups DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_ui_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_popups .
+ 
+    CLASS-METHODS center
+      IMPORTING
+        !iv_width          TYPE i
+        !iv_height         TYPE i
+      RETURNING
+        VALUE(rs_position) TYPE zif_abapgit_popups=>ty_popup_position.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_lt_fields TYPE STANDARD TABLE OF sval WITH DEFAULT KEY .
+ 
+    TYPES:
+      BEGIN OF ty_commit_value_tab,
+        commit   TYPE zif_abapgit_git_definitions=>ty_sha1,
+        message  TYPE c LENGTH 100,
+        datetime TYPE c LENGTH 20,
+      END OF ty_commit_value_tab.
+    TYPES:
+      ty_commit_value_tab_tt TYPE STANDARD TABLE OF ty_commit_value_tab WITH DEFAULT KEY.
+ 
+    CONSTANTS c_answer_cancel      TYPE c LENGTH 1 VALUE 'A' ##NO_TEXT.
+ 
+    DATA ms_position TYPE zif_abapgit_popups=>ty_popup_position.
+ 
+    METHODS add_field
+      IMPORTING
+        !iv_tabname    TYPE sval-tabname
+        !iv_fieldname  TYPE sval-fieldname
+        !iv_fieldtext  TYPE sval-fieldtext
+        !iv_value      TYPE clike DEFAULT ''
+        !iv_field_attr TYPE sval-field_attr DEFAULT ''
+        !iv_obligatory TYPE spo_obl OPTIONAL
+      CHANGING
+        !ct_fields     TYPE zif_abapgit_popups=>ty_sval_tt .
+    METHODS _popup_3_get_values
+      IMPORTING
+        !iv_popup_title    TYPE string
+        !iv_no_value_check TYPE abap_bool DEFAULT abap_false
+      EXPORTING
+        !ev_value_1        TYPE spo_value
+        !ev_value_2        TYPE spo_value
+        !ev_value_3        TYPE spo_value
+      CHANGING
+        !ct_fields         TYPE ty_lt_fields
+      RAISING
+        zcx_abapgit_exception .
+    METHODS commit_list_build
+      IMPORTING
+        !iv_repo_url    TYPE string
+        !iv_branch_name TYPE string
+      EXPORTING
+        !et_value_tab   TYPE ty_commit_value_tab_tt
+        !et_commits     TYPE zif_abapgit_git_definitions=>ty_commit_tt
+      RAISING
+        zcx_abapgit_exception.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_popups IMPLEMENTATION.
+ 
+ 
+  METHOD add_field.
+
+    FIELD-SYMBOLS: <ls_field> LIKE LINE OF ct_fields.
+
+    APPEND INITIAL LINE TO ct_fields ASSIGNING <ls_field>.
+    <ls_field>-tabname    = iv_tabname.
+    <ls_field>-fieldname  = iv_fieldname.
+    <ls_field>-fieldtext  = iv_fieldtext.
+    <ls_field>-value      = iv_value.
+    <ls_field>-field_attr = iv_field_attr.
+    <ls_field>-field_obl  = iv_obligatory.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD center.
+ 
+    CONSTANTS:
+      lc_min_size TYPE i VALUE 10,
+      lc_min_pos  TYPE i VALUE 5.
+ 
+    " Magic math to approximate starting position of popup
+    IF sy-scols > lc_min_size AND iv_width > 0 AND sy-scols > iv_width.
+      rs_position-start_column = nmax(
+        val1 = ( sy-scols - iv_width ) / 2
+        val2 = lc_min_pos ).
+    ELSE.
+      rs_position-start_column = lc_min_pos.
+    ENDIF.
+ 
+    IF sy-srows > lc_min_size AND iv_height > 0 AND sy-srows > iv_height.
+      rs_position-start_row = nmax(
+        val1 = ( sy-srows - iv_height ) / 2 - 1
+        val2 = lc_min_pos ).
+    ELSE.
+      rs_position-start_row = lc_min_pos.
+    ENDIF.
+ 
+    rs_position-end_column = rs_position-start_column + iv_width.
+    rs_position-end_row = rs_position-start_row + iv_height.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD commit_list_build.
+
+    DATA:
+      lv_unix_time   TYPE zcl_abapgit_git_time=>ty_unixtime,
+      lv_date        TYPE d,
+      lv_date_string TYPE c LENGTH 12,
+      lv_time        TYPE t,
+      lv_time_string TYPE c LENGTH 10.
+
+    FIELD-SYMBOLS:
+      <ls_commit>    TYPE zif_abapgit_git_definitions=>ty_commit,
+      <ls_value_tab> TYPE ty_commit_value_tab.
+
+    CLEAR: et_commits, et_value_tab.
+
+    et_commits = zcl_abapgit_git_commit=>get_by_branch( iv_branch_name  = iv_branch_name
+                                                        iv_repo_url     = iv_repo_url
+                                                        iv_deepen_level = 99
+                                                        iv_sorted       = abap_false )-commits.
+
+    IF et_commits IS INITIAL.
+      zcx_abapgit_exception=>raise( |No commits are available in this branch.| ).
+    ENDIF.
+
+    SORT et_commits BY time DESCENDING.
+
+    LOOP AT et_commits ASSIGNING <ls_commit>.
+
+      APPEND INITIAL LINE TO et_value_tab ASSIGNING <ls_value_tab>.
+      <ls_value_tab>-commit  = <ls_commit>-sha1.
+      <ls_value_tab>-message = <ls_commit>-message.
+      lv_unix_time = <ls_commit>-time.
+      zcl_abapgit_git_time=>get_utc(
+        EXPORTING
+          iv_unix = lv_unix_time
+        IMPORTING
+          ev_time = lv_time
+          ev_date = lv_date ).
+      WRITE: lv_date TO lv_date_string,
+             lv_time TO lv_time_string.
+      <ls_value_tab>-datetime = |{ lv_date_string }, | &&
+                                |{ lv_time_string }|.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~branch_list_popup.
+ 
+    DATA: lo_branches    TYPE REF TO zcl_abapgit_git_branch_list,
+          lt_branches    TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+          lv_answer      TYPE c LENGTH 1,
+          lv_default     TYPE i,
+          lv_head_suffix TYPE string,
+          lv_head_symref TYPE string,
+          lv_text        TYPE string,
+          lt_selection   TYPE TABLE OF spopli.
+ 
+    FIELD-SYMBOLS: <ls_sel>    LIKE LINE OF lt_selection,
+                   <ls_branch> LIKE LINE OF lt_branches.
+ 
+ 
+    lo_branches    = zcl_abapgit_git_transport=>branches( iv_url ).
+    lt_branches    = lo_branches->get_branches_only( ).
+    lv_head_suffix = | ({ zif_abapgit_git_definitions=>c_head_name })|.
+    lv_head_symref = lo_branches->get_head_symref( ).
+ 
+    IF iv_hide_branch IS NOT INITIAL.
+      DELETE lt_branches WHERE name = iv_hide_branch.
+    ENDIF.
+ 
+    IF iv_hide_head IS NOT INITIAL.
+      DELETE lt_branches WHERE name    = zif_abapgit_git_definitions=>c_head_name
+                            OR is_head = abap_true.
+    ENDIF.
+ 
+    IF lt_branches IS INITIAL.
+      IF iv_hide_head IS NOT INITIAL.
+        lv_text = 'main'.
+      ENDIF.
+      IF iv_hide_branch IS NOT INITIAL AND iv_hide_branch <> zif_abapgit_git_definitions=>c_git_branch-main.
+        IF lv_text IS INITIAL.
+          lv_text = iv_hide_branch && ' is'.
+        ELSE.
+          CONCATENATE lv_text 'and' iv_hide_branch 'are' INTO lv_text SEPARATED BY space.
+        ENDIF.
+      ELSE.
+        lv_text = lv_text && ' is'.
+      ENDIF.
+      IF lv_text IS NOT INITIAL.
+        zcx_abapgit_exception=>raise( 'No branches available to select (' && lv_text && ' hidden)' ).
+      ELSE.
+        zcx_abapgit_exception=>raise( 'No branches are available to select' ).
+      ENDIF.
+    ENDIF.
+ 
+    LOOP AT lt_branches ASSIGNING <ls_branch>.
+ 
+      CHECK <ls_branch>-name IS NOT INITIAL. " To ensure some below ifs
+ 
+      IF <ls_branch>-is_head = abap_true.
+ 
+        IF <ls_branch>-name = zif_abapgit_git_definitions=>c_head_name. " HEAD
+          IF <ls_branch>-name <> lv_head_symref AND lv_head_symref IS NOT INITIAL.
+            " HEAD but other HEAD symref exists - ignore
+            CONTINUE.
+          ELSE.
+            INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING <ls_sel>.
+            <ls_sel>-varoption = <ls_branch>-name.
+          ENDIF.
+        ELSE.
+          INSERT INITIAL LINE INTO lt_selection INDEX 1 ASSIGNING <ls_sel>.
+          <ls_sel>-varoption = <ls_branch>-display_name && lv_head_suffix.
+        ENDIF.
+ 
+        IF lv_default > 0. " Shift down default if set
+          lv_default = lv_default + 1.
+        ENDIF.
+      ELSE.
+        APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+        <ls_sel>-varoption = <ls_branch>-display_name.
+      ENDIF.
+ 
+      IF <ls_branch>-name = iv_default_branch.
+        IF <ls_branch>-is_head = abap_true.
+          lv_default = 1.
+        ELSE.
+          lv_default = sy-tabix.
+        ENDIF.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF iv_show_new_option = abap_true.
+      APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+      <ls_sel>-varoption = zif_abapgit_popups=>c_new_branch_label.
+    ENDIF.
+ 
+    ms_position = center(
+      iv_width  = 30
+      iv_height = lines( lt_selection ) ).
+ 
+    CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
+      EXPORTING
+        titel      = 'Select Branch'
+        textline1  = 'Select a branch'
+        start_col  = ms_position-start_column
+        start_row  = ms_position-start_row
+        cursorline = lv_default
+      IMPORTING
+        answer     = lv_answer
+      TABLES
+        t_spopli   = lt_selection
+      EXCEPTIONS
+        OTHERS     = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error from POPUP_TO_DECIDE_LIST' ).
+    ENDIF.
+ 
+    IF lv_answer = c_answer_cancel.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
+    ASSERT sy-subrc = 0.
+ 
+    IF iv_show_new_option = abap_true AND <ls_sel>-varoption = zif_abapgit_popups=>c_new_branch_label.
+      rs_branch-name = zif_abapgit_popups=>c_new_branch_label.
+    ELSE.
+      REPLACE FIRST OCCURRENCE OF lv_head_suffix IN <ls_sel>-varoption WITH ''.
+      READ TABLE lt_branches WITH KEY display_name = <ls_sel>-varoption ASSIGNING <ls_branch>.
+      IF sy-subrc <> 0.
+* branch name longer than 65 characters
+        LOOP AT lt_branches ASSIGNING <ls_branch> WHERE display_name CS <ls_sel>-varoption.
+          EXIT. " current loop
+        ENDLOOP.
+      ENDIF.
+      ASSERT <ls_branch> IS ASSIGNED.
+      rs_branch = lo_branches->find_by_name( <ls_branch>-name ).
+      lv_text = |Branch switched from { zcl_abapgit_git_branch_list=>get_display_name( iv_default_branch ) } to {
+        zcl_abapgit_git_branch_list=>get_display_name( rs_branch-name ) } |.
+      MESSAGE lv_text TYPE 'S'.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~choose_code_insp_check_variant.
+ 
+    DATA: lt_return TYPE STANDARD TABLE OF ddshretval.
+ 
+    FIELD-SYMBOLS: <ls_return> LIKE LINE OF lt_return.
+ 
+    CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
+      EXPORTING
+        tabname           = 'SCI_DYNP'
+        fieldname         = 'CHKV'
+      TABLES
+        return_tab        = lt_return
+      EXCEPTIONS
+        field_not_found   = 1
+        no_help_for_field = 2
+        inconsistent_help = 3
+        no_values_found   = 4
+        OTHERS            = 5.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+    READ TABLE lt_return ASSIGNING <ls_return>
+                         WITH KEY retfield = 'SCI_DYNP-CHKV'.
+    IF sy-subrc = 0.
+      rv_check_variant = <ls_return>-fieldval.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~commit_list_popup.
+ 
+    DATA:
+      lt_commits         TYPE zif_abapgit_git_definitions=>ty_commit_tt,
+      lt_value_tab       TYPE ty_commit_value_tab_tt,
+      lt_selected_values TYPE ty_commit_value_tab_tt,
+      lt_columns         TYPE zif_abapgit_popups=>ty_alv_column_tt.
+ 
+    FIELD-SYMBOLS:
+      <ls_value_tab> TYPE ty_commit_value_tab,
+      <ls_column>    TYPE zif_abapgit_popups=>ty_alv_column.
+ 
+    commit_list_build(
+      EXPORTING
+        iv_branch_name = iv_branch_name
+        iv_repo_url    = iv_repo_url
+      IMPORTING
+        et_value_tab   = lt_value_tab
+        et_commits     = lt_commits ).
+ 
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name   = 'COMMIT'.
+    <ls_column>-text   = 'Hash'.
+    <ls_column>-length = 8.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'MESSAGE'.
+    <ls_column>-text = 'Message'.
+    <ls_column>-length = 60.
+    APPEND INITIAL LINE TO lt_columns ASSIGNING <ls_column>.
+    <ls_column>-name = 'DATETIME'.
+    <ls_column>-text = 'Datetime'.
+    <ls_column>-length = 17.
+ 
+    zif_abapgit_popups~popup_to_select_from_list(
+      EXPORTING
+        it_list               = lt_value_tab
+        iv_title              = |Select a commit|
+        iv_end_column         = 100
+        iv_striped_pattern    = abap_true
+        iv_optimize_col_width = abap_false
+        iv_selection_mode     = if_salv_c_selection_mode=>single
+        it_columns_to_display = lt_columns
+      IMPORTING
+        et_list               = lt_selected_values ).
+ 
+    IF lt_selected_values IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    READ TABLE lt_selected_values ASSIGNING <ls_value_tab> INDEX 1.
+    ASSERT sy-subrc = 0.
+ 
+    READ TABLE lt_commits INTO rs_commit WITH KEY sha1 = <ls_value_tab>-commit.
+    ASSERT sy-subrc = 0.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~create_branch_popup.
+
+    DATA: lt_fields TYPE TABLE OF sval.
+    DATA: lv_name   TYPE spo_value.
+
+    CLEAR: ev_name, ev_cancel.
+
+    add_field( EXPORTING iv_tabname   = 'TEXTL'
+                         iv_fieldname = 'LINE'
+                         iv_fieldtext = 'Name'
+                         iv_value     = 'new-branch-name'
+               CHANGING  ct_fields    = lt_fields ).
+
+    TRY.
+
+        _popup_3_get_values(
+          EXPORTING iv_popup_title = |Create branch from {
+            zcl_abapgit_git_branch_list=>get_display_name( iv_source_branch_name ) }|
+          IMPORTING ev_value_1     = lv_name
+          CHANGING  ct_fields      = lt_fields ).
+
+        ev_name = zcl_abapgit_git_branch_list=>complete_heads_branch_name(
+              zcl_abapgit_git_branch_list=>normalize_branch_name( lv_name ) ).
+
+      CATCH zcx_abapgit_cancel.
+        ev_cancel = abap_true.
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_folder_logic.
+ 
+    DATA:
+      lt_selection TYPE TABLE OF spopli,
+      lv_answer    TYPE c LENGTH 1.
+ 
+    FIELD-SYMBOLS: <ls_sel> LIKE LINE OF lt_selection.
+ 
+    APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+    <ls_sel>-selflag   = abap_true.
+    <ls_sel>-varoption = zif_abapgit_dot_abapgit=>c_folder_logic-prefix.
+ 
+    APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+    <ls_sel>-varoption = zif_abapgit_dot_abapgit=>c_folder_logic-full.
+ 
+    APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+    <ls_sel>-varoption = zif_abapgit_dot_abapgit=>c_folder_logic-mixed.
+ 
+    CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
+      EXPORTING
+        titel     = 'Folder logic'
+        textline1 = 'Select folder logic'
+        start_col = ms_position-start_column
+        start_row = ms_position-start_row
+      IMPORTING
+        answer    = lv_answer
+      TABLES
+        t_spopli  = lt_selection
+      EXCEPTIONS
+        OTHERS    = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error from POPUP_TO_DECIDE_LIST' ).
+    ENDIF.
+ 
+    IF lv_answer = c_answer_cancel.
+      zcx_abapgit_cancel=>raise( |Canceled| ).
+    ENDIF.
+ 
+    READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
+    ASSERT sy-subrc = 0.
+ 
+    rv_folder_logic = <ls_sel>-varoption.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_search_help.
+ 
+    DATA lt_ret TYPE TABLE OF ddshretval.
+    DATA ls_ret LIKE LINE OF lt_ret.
+    DATA lv_tabname TYPE dfies-tabname.
+    DATA lv_fieldname TYPE dfies-fieldname.
+ 
+    SPLIT iv_tab_field AT '-' INTO lv_tabname lv_fieldname.
+    lv_tabname = to_upper( lv_tabname ).
+    lv_fieldname = to_upper( lv_fieldname ).
+ 
+    CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
+      EXPORTING
+        tabname    = lv_tabname
+        fieldname  = lv_fieldname
+      TABLES
+        return_tab = lt_ret
+      EXCEPTIONS
+        OTHERS     = 5.
+ 
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |F4IF_FIELD_VALUE_REQUEST error [{ iv_tab_field }]| ).
+    ENDIF.
+ 
+    IF lines( lt_ret ) > 0.
+      READ TABLE lt_ret WITH KEY fieldname = lv_fieldname INTO ls_ret.
+      IF sy-subrc = 0.
+        rv_value = ls_ret-fieldval.
+      ELSE.
+        READ TABLE lt_ret INDEX 1 INTO ls_ret.
+        ASSERT sy-subrc = 0.
+        rv_value = ls_ret-fieldval.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_select_tr_requests.
+    DATA ls_r_trkorr TYPE LINE OF zif_abapgit_definitions=>ty_trrngtrkor_tt.
+    DATA lr_request TYPE REF TO trwbo_request_header.
+    DATA lt_request TYPE trwbo_request_headers.
+ 
+    ms_position = center(
+      iv_width  = 120
+      iv_height = 10 ).
+ 
+    CALL FUNCTION 'TRINT_SELECT_REQUESTS'
+      EXPORTING
+        iv_username_pattern    = iv_username_pattern
+        is_selection           = is_selection
+        iv_complete_projects   = abap_false
+        is_popup               = ms_position
+        iv_via_selscreen       = 'X'
+        iv_title               = iv_title
+      IMPORTING
+        et_requests            = lt_request
+      EXCEPTIONS
+        action_aborted_by_user = 1
+        OTHERS                 = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Selection canceled' ).
+    ENDIF.
+ 
+    IF lt_request IS INITIAL.
+      zcx_abapgit_exception=>raise( 'No Request Found' ).
+    ENDIF.
+ 
+    IF lines( lt_request ) > 10000.
+      zcx_abapgit_exception=>raise( 'Too many requests selected (max 10000)' ).
+    ENDIF.
+ 
+    LOOP AT lt_request REFERENCE INTO lr_request.
+      ls_r_trkorr-sign = 'I'.
+      ls_r_trkorr-option = 'EQ'.
+      ls_r_trkorr-low = lr_request->trkorr.
+      INSERT ls_r_trkorr INTO TABLE rt_r_trkorr.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_select_wb_tc_tr_and_tsk.
+    DATA ls_selection  TYPE trwbo_selection.
+    DATA lv_title TYPE trwbo_title.
+ 
+    ls_selection-trkorrpattern = space.
+    ls_selection-connect_req_task_conditions = 'X'.
+    ls_selection-reqfunctions = 'KTRXS'.
+    ls_selection-reqstatus = 'RNODL'.
+    ls_selection-taskstatus = 'RNODL'.
+    CONDENSE ls_selection-reqfunctions NO-GAPS.
+    ls_selection-taskfunctions = 'QRSX'.
+    CONCATENATE sy-sysid '*' INTO ls_selection-trkorrpattern.
+ 
+    lv_title = 'Select Transports / Tasks'.
+ 
+    rt_r_trkorr = zif_abapgit_popups~popup_select_tr_requests(
+      is_selection        = ls_selection
+      iv_title            = lv_title
+      iv_username_pattern = '*' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_confirm.
+ 
+    ms_position = center(
+      iv_width  = 65
+      iv_height = 5 ).
+ 
+    CALL FUNCTION 'POPUP_TO_CONFIRM'
+      EXPORTING
+        titlebar              = iv_titlebar
+        text_question         = iv_text_question
+        text_button_1         = iv_text_button_1
+        icon_button_1         = iv_icon_button_1
+        text_button_2         = iv_text_button_2
+        icon_button_2         = iv_icon_button_2
+        default_button        = iv_default_button
+        display_cancel_button = iv_display_cancel_button
+        start_column          = ms_position-start_column
+        start_row             = ms_position-start_row
+      IMPORTING
+        answer                = rv_answer
+      EXCEPTIONS
+        text_not_found        = 1
+        OTHERS                = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'error from POPUP_TO_CONFIRM' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_create_package.
+    CALL FUNCTION 'FUNCTION_EXISTS'
+      EXPORTING
+        funcname           = 'PB_POPUP_PACKAGE_CREATE'
+      EXCEPTIONS
+        function_not_exist = 1
+        OTHERS             = 2.
+    IF sy-subrc = 1.
+* looks like the function module used does not exist on all
+* versions since 702, so show an error
+      zcx_abapgit_exception=>raise( 'Your system does not support automatic creation of packages.' &&
+        'Please, create the package manually.' ).
+    ENDIF.
+
+    CALL FUNCTION 'PB_POPUP_PACKAGE_CREATE'
+      CHANGING
+        p_object_data    = es_package_data
+      EXCEPTIONS
+        action_cancelled = 1.
+    ev_create = boolc( sy-subrc = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_create_transp_branch.
+    DATA: lt_fields             TYPE TABLE OF sval,
+          lv_transports_as_text TYPE string,
+          lv_desc_as_text       TYPE string,
+          ls_transport_header   LIKE LINE OF it_transport_headers.
+    DATA: lv_branch_name        TYPE spo_value.
+    DATA: lv_commit_text        TYPE spo_value.
+ 
+    CLEAR: rs_transport_branch-branch_name, rs_transport_branch-commit_text.
+ 
+    " If we only have one transport selected set branch name to Transport
+    " name and commit description to transport description.
+    IF lines( it_transport_headers ) = 1.
+      READ TABLE it_transport_headers INDEX 1 INTO ls_transport_header.
+      lv_transports_as_text = ls_transport_header-trkorr.
+      lv_desc_as_text = zcl_abapgit_factory=>get_cts_api( )->read_description( ls_transport_header-trkorr ).
+    ELSE.   " Else set branch name and commit message to 'Transport(s)_TRXXXXXX_TRXXXXX'
+      lv_transports_as_text = 'Transport(s)'.
+      LOOP AT it_transport_headers INTO ls_transport_header.
+        CONCATENATE lv_transports_as_text '_' ls_transport_header-trkorr INTO lv_transports_as_text.
+      ENDLOOP.
+      lv_desc_as_text = lv_transports_as_text.
+ 
+    ENDIF.
+    add_field( EXPORTING iv_tabname   = 'TEXTL'
+                         iv_fieldname = 'LINE'
+                         iv_fieldtext = 'Branch name'
+                         iv_value     = lv_transports_as_text
+               CHANGING  ct_fields    = lt_fields ).
+ 
+    add_field( EXPORTING iv_tabname   = 'ABAPTXT255'
+                         iv_fieldname = 'LINE'
+                         iv_fieldtext = 'Commit text'
+                         iv_value     = lv_desc_as_text
+               CHANGING  ct_fields    = lt_fields ).
+ 
+    _popup_3_get_values( EXPORTING iv_popup_title = 'Transport to new Branch'
+                         IMPORTING ev_value_1     = lv_branch_name
+                                   ev_value_2     = lv_commit_text
+                         CHANGING  ct_fields      = lt_fields ).
+ 
+    rs_transport_branch-branch_name = lv_branch_name.
+    rs_transport_branch-commit_text = lv_commit_text.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_select_from_list.
+
+    DATA lo_popup TYPE REF TO lcl_object_descision_list.
+
+    CLEAR et_list.
+
+    ms_position = center(
+      iv_width  = iv_end_column - iv_start_column
+      iv_height = iv_end_line - iv_start_line ).
+
+    CREATE OBJECT lo_popup
+      EXPORTING
+        it_list               = it_list
+        iv_title              = iv_title
+        iv_header_text        = iv_header_text
+        is_position           = ms_position
+        iv_striped_pattern    = iv_striped_pattern
+        iv_optimize_col_width = iv_optimize_col_width
+        iv_selection_mode     = iv_selection_mode
+        iv_select_column_text = iv_select_column_text
+        it_columns_to_display = it_columns_to_display
+        it_preselected_rows   = it_preselected_rows.
+
+    lo_popup->display( ).
+    lo_popup->get_selected( IMPORTING et_list = et_list ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_select_labels.
+ 
+    DATA:
+      lt_all_labels         TYPE zif_abapgit_repo_srv=>ty_labels,
+      ls_label              LIKE LINE OF lt_all_labels,
+      lt_current_labels     TYPE string_table,
+      lt_selected_labels    LIKE lt_all_labels,
+      lt_columns_to_display TYPE zif_abapgit_popups=>ty_alv_column_tt,
+      lt_preselected_rows   TYPE zif_abapgit_popups=>ty_rows,
+      ls_columns_to_display LIKE LINE OF lt_columns_to_display,
+      lv_save_tabix         TYPE i,
+      li_popup              TYPE REF TO zif_abapgit_popups.
+ 
+    FIELD-SYMBOLS: <lv_label>         TYPE zif_abapgit_repo_srv=>ty_label,
+                   <lv_current_label> TYPE LINE OF string_table.
+ 
+    lt_current_labels = zcl_abapgit_repo_labels=>split( iv_labels ).
+ 
+    lt_all_labels = zcl_abapgit_repo_srv=>get_instance( )->get_label_list( ).
+ 
+    " Add labels which are not saved yet
+    LOOP AT lt_current_labels ASSIGNING <lv_current_label>.
+ 
+      READ TABLE lt_all_labels TRANSPORTING NO FIELDS
+                               WITH KEY key_label
+                               COMPONENTS label = <lv_current_label>.
+      IF sy-subrc <> 0.
+        ls_label-label = <lv_current_label>.
+        INSERT ls_label INTO TABLE lt_all_labels.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    IF lines( lt_all_labels ) = 0.
+      zcx_abapgit_exception=>raise( |No labels maintained yet| ).
+    ENDIF.
+ 
+    SORT lt_all_labels.
+    DELETE ADJACENT DUPLICATES FROM lt_all_labels.
+ 
+    " Preselect current labels
+    LOOP AT lt_all_labels ASSIGNING <lv_label>.
+ 
+      lv_save_tabix = sy-tabix.
+ 
+      READ TABLE lt_current_labels TRANSPORTING NO FIELDS
+                                   WITH KEY table_line = <lv_label>-label.
+      IF sy-subrc = 0.
+        INSERT lv_save_tabix INTO TABLE lt_preselected_rows.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+    ls_columns_to_display-name = 'LABEL'.
+    ls_columns_to_display-text = 'Label'.
+    INSERT ls_columns_to_display INTO TABLE lt_columns_to_display.
+ 
+    li_popup = zcl_abapgit_ui_factory=>get_popups( ).
+    li_popup->popup_to_select_from_list(
+      EXPORTING
+        iv_header_text        = 'Select labels'
+        iv_select_column_text = 'Add label'
+        it_list               = lt_all_labels
+        iv_selection_mode     = if_salv_c_selection_mode=>multiple
+        it_columns_to_display = lt_columns_to_display
+        it_preselected_rows   = lt_preselected_rows
+        iv_start_column       = 15
+        iv_end_column         = 55
+      IMPORTING
+        et_list               = lt_selected_labels ).
+ 
+    LOOP AT lt_selected_labels ASSIGNING <lv_label>.
+      IF rv_labels IS NOT INITIAL.
+        rv_labels = rv_labels && ','.
+      ENDIF.
+      rv_labels = rv_labels && <lv_label>-label.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_to_select_transports.
+ 
+* todo, method to be renamed, it only returns one transport
+ 
+    DATA: lv_trkorr TYPE e070-trkorr,
+          ls_trkorr LIKE LINE OF rt_trkorr.
+ 
+ 
+    CALL FUNCTION 'TR_F4_REQUESTS'
+      IMPORTING
+        ev_selected_request = lv_trkorr.
+ 
+    IF NOT lv_trkorr IS INITIAL.
+      ls_trkorr-trkorr = lv_trkorr.
+      APPEND ls_trkorr TO rt_trkorr.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~popup_transport_request.
+ 
+    DATA: lt_e071    TYPE STANDARD TABLE OF e071,
+          lt_e071k   TYPE STANDARD TABLE OF e071k,
+          lv_order   TYPE trkorr,
+          ls_e070use TYPE e070use.
+    DATA lv_category TYPE e070-korrdev.
+ 
+    " If default transport is set and its type matches, then use it as default for the popup
+    ls_e070use = zcl_abapgit_default_transport=>get_instance( )->get( ).
+ 
+    IF ( ls_e070use-trfunction = is_transport_type-request OR ls_e070use-trfunction IS INITIAL )
+      AND iv_use_default_transport = abap_true.
+      lv_order = ls_e070use-ordernum.
+    ENDIF.
+ 
+    " Differentiate between customizing and WB requests
+    IF is_transport_type-request = zif_abapgit_cts_api=>c_transport_type-cust_request.
+      lv_category = zif_abapgit_cts_api=>c_transport_category-customizing.
+    ELSE.
+      lv_category = zif_abapgit_cts_api=>c_transport_category-workbench.
+    ENDIF.
+ 
+    CALL FUNCTION 'TRINT_ORDER_CHOICE'
+      EXPORTING
+        wi_order_type          = is_transport_type-request
+        wi_task_type           = is_transport_type-task
+        wi_category            = lv_category
+        wi_order               = lv_order
+      IMPORTING
+        we_order               = rv_transport
+      TABLES
+        wt_e071                = lt_e071
+        wt_e071k               = lt_e071k
+      EXCEPTIONS
+        no_correction_selected = 1
+        display_mode           = 2
+        object_append_error    = 3
+        recursive_call         = 4
+        wrong_order_type       = 5
+        OTHERS                 = 6.
+ 
+    IF sy-subrc = 1.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ELSEIF sy-subrc > 1.
+      zcx_abapgit_exception=>raise_t100( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_popups~tag_list_popup.
+ 
+    DATA: lo_branches  TYPE REF TO zcl_abapgit_git_branch_list,
+          lt_tags      TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt,
+          ls_branch    TYPE zif_abapgit_git_definitions=>ty_git_branch,
+          lv_answer    TYPE c LENGTH 1,
+          lv_default   TYPE i,
+          lv_tag       TYPE string,
+          lt_selection TYPE TABLE OF spopli.
+ 
+    FIELD-SYMBOLS: <ls_sel> LIKE LINE OF lt_selection,
+                   <ls_tag> LIKE LINE OF lt_tags.
+ 
+ 
+    lo_branches = zcl_abapgit_git_transport=>branches( iv_url ).
+    lt_tags     = lo_branches->get_tags_only( ).
+ 
+    LOOP AT lt_tags ASSIGNING <ls_tag> WHERE name NP '*' && zif_abapgit_git_definitions=>c_git_branch-peel.
+ 
+      APPEND INITIAL LINE TO lt_selection ASSIGNING <ls_sel>.
+      <ls_sel>-varoption = zcl_abapgit_git_tag=>remove_tag_prefix( <ls_tag>-name ).
+ 
+    ENDLOOP.
+ 
+    IF lt_selection IS INITIAL.
+      zcx_abapgit_exception=>raise( 'No tags are available to select' ).
+    ENDIF.
+ 
+    ms_position = center(
+      iv_width  = 30
+      iv_height = lines( lt_selection ) ).
+ 
+    CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
+      EXPORTING
+        titel      = 'Select Tag'
+        textline1  = 'Select a tag'
+        start_col  = ms_position-start_column
+        start_row  = ms_position-start_row
+        cursorline = lv_default
+      IMPORTING
+        answer     = lv_answer
+      TABLES
+        t_spopli   = lt_selection
+      EXCEPTIONS
+        OTHERS     = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error from POPUP_TO_DECIDE_LIST' ).
+    ENDIF.
+ 
+    IF lv_answer = c_answer_cancel.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE lt_selection ASSIGNING <ls_sel> WITH KEY selflag = abap_true.
+    ASSERT sy-subrc = 0.
+ 
+    lv_tag = zcl_abapgit_git_tag=>add_tag_prefix( <ls_sel>-varoption ).
+ 
+    READ TABLE lt_tags WITH KEY name_key COMPONENTS name = lv_tag ASSIGNING <ls_tag>.
+    IF sy-subrc <> 0.
+      " tag name longer than 65 characters
+      LOOP AT lt_tags ASSIGNING <ls_tag> WHERE name CS lv_tag.
+        EXIT.
+      ENDLOOP.
+    ENDIF.
+    ASSERT <ls_tag> IS ASSIGNED.
+ 
+    ls_branch = lo_branches->find_by_name( <ls_tag>-name ).
+    MOVE-CORRESPONDING ls_branch TO rs_tag.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD _popup_3_get_values.
+
+    DATA lv_answer TYPE c LENGTH 1.
+    FIELD-SYMBOLS: <ls_field> TYPE sval.
+
+    ms_position = center(
+      iv_width  = 120
+      iv_height = lines( ct_fields ) ).
+
+    CALL FUNCTION 'POPUP_GET_VALUES'
+      EXPORTING
+        no_value_check = iv_no_value_check
+        popup_title    = iv_popup_title
+        start_column   = ms_position-start_column
+        start_row      = ms_position-start_row
+      IMPORTING
+        returncode     = lv_answer
+      TABLES
+        fields         = ct_fields
+      EXCEPTIONS
+        OTHERS         = 1.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ).
+    ENDIF.
+
+    IF lv_answer = c_answer_cancel.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+
+    IF ev_value_1 IS SUPPLIED.
+      READ TABLE ct_fields INDEX 1 ASSIGNING <ls_field>.
+      ASSERT sy-subrc = 0.
+      ev_value_1 = <ls_field>-value.
+    ENDIF.
+
+    IF ev_value_2 IS SUPPLIED.
+      READ TABLE ct_fields INDEX 2 ASSIGNING <ls_field>.
+      ASSERT sy-subrc = 0.
+      ev_value_2 = <ls_field>-value.
+    ENDIF.
+
+    IF ev_value_3 IS SUPPLIED.
+      READ TABLE ct_fields INDEX 3 ASSIGNING <ls_field>.
+      ASSERT sy-subrc = 0.
+      ev_value_3 = <ls_field>-value.
+    ENDIF.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zcl_abapgit_popups.clas.locals_imp.abap.html b/src/ui/zcl_abapgit_popups.clas.locals_imp.abap.html new file mode 100644 index 00000000000..fb3888c186a --- /dev/null +++ b/src/ui/zcl_abapgit_popups.clas.locals_imp.abap.html @@ -0,0 +1,2422 @@ + + + + + + Code coverage report for src/ui/zcl_abapgit_popups.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/ui zcl_abapgit_popups.clas.locals_imp.abap

+
+ +
+ 37.48% + Statements + 292/779 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/14 +
+ + +
+ 37.48% + Lines + 292/779 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +7801x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS lcl_object_descision_list DEFINITION FINAL.
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_default_column     TYPE abap_componentdescr-name VALUE 'DEFAULT_COLUMN'.
+    CONSTANTS c_fieldname_selected TYPE abap_componentdescr-name VALUE 'SELECTED'.
+    CONSTANTS c_answer_cancel      TYPE c LENGTH 1 VALUE 'A'.
+    CONSTANTS c_fieldname_obj_type TYPE abap_componentdescr-name VALUE 'OBJ_TYPE'.
+    CONSTANTS c_own_pfstatus       TYPE sy-pfkey VALUE 'DECIDE_DIALOG'.
+ 
+    METHODS constructor
+      IMPORTING
+        !it_list               TYPE STANDARD TABLE
+        !iv_title              TYPE lvc_title DEFAULT space
+        !iv_header_text        TYPE csequence DEFAULT space
+        !is_position           TYPE zif_abapgit_popups=>ty_popup_position
+        !iv_striped_pattern    TYPE abap_bool DEFAULT abap_false
+        !iv_optimize_col_width TYPE abap_bool DEFAULT abap_true
+        !iv_selection_mode     TYPE salv_de_constant DEFAULT if_salv_c_selection_mode=>multiple
+        !iv_select_column_text TYPE csequence DEFAULT space
+        !it_columns_to_display TYPE zif_abapgit_popups=>ty_alv_column_tt
+        !it_preselected_rows   TYPE zif_abapgit_popups=>ty_rows OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS display
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_selected
+      EXPORTING
+        VALUE(et_list) TYPE STANDARD TABLE.
+ 
+  PRIVATE SECTION.
+ 
+    DATA mr_table TYPE REF TO data.
+    DATA mo_table_descr TYPE REF TO cl_abap_tabledescr.
+    DATA mo_alv TYPE REF TO cl_salv_table.
+    DATA mv_cancel TYPE abap_bool.
+    DATA ms_position TYPE zif_abapgit_popups=>ty_popup_position.
+ 
+    " Events
+    METHODS on_select_list_link_click
+      FOR EVENT link_click OF cl_salv_events_table
+      IMPORTING
+        !row
+        !column.
+    METHODS on_select_list_function_click
+      FOR EVENT added_function OF cl_salv_events_table
+      IMPORTING
+        !e_salv_function.
+    METHODS on_double_click
+      FOR EVENT double_click OF cl_salv_events_table
+      IMPORTING
+        !row
+        !column.
+ 
+    " Methods
+    METHODS create_new_selectable_table
+      IMPORTING
+        it_list TYPE STANDARD TABLE.
+    METHODS preselect
+      IMPORTING
+        it_preselected_rows TYPE zif_abapgit_popups=>ty_rows OPTIONAL
+      RAISING
+        zcx_abapgit_exception.
+    METHODS create_alv
+      RETURNING
+        VALUE(ro_alv) TYPE REF TO cl_salv_table
+      RAISING
+        cx_salv_msg.
+    METHODS setup_columns
+      IMPORTING
+        io_columns            TYPE REF TO cl_salv_columns_table
+        iv_selection_mode     TYPE salv_de_constant
+        iv_select_column_text TYPE csequence
+        it_columns_to_display TYPE zif_abapgit_popups=>ty_alv_column_tt
+      RAISING
+        cx_salv_msg.
+    METHODS setup_toolbar
+      IMPORTING
+        !iv_selection_mode TYPE salv_de_constant
+        !iv_object_list    TYPE abap_bool.
+    METHODS ask_user_for_obj_category
+      RETURNING
+        VALUE(rv_category) TYPE string.
+    METHODS mark_category
+      IMPORTING
+        iv_category TYPE string.
+    METHODS mark_all
+      IMPORTING
+        iv_selected TYPE abap_bool.
+    METHODS mark_visible
+      IMPORTING
+        iv_selected TYPE abap_bool.
+    METHODS mark_selected.
+    METHODS mark_indexed
+      IMPORTING
+        iv_selected TYPE abap_bool DEFAULT abap_true
+        iv_invert   TYPE abap_bool DEFAULT abap_false
+        it_scope    TYPE lvc_t_fidx.
+    METHODS are_all_marked
+      IMPORTING
+        it_scope      TYPE lvc_t_fidx
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+CLASS lcl_object_descision_list IMPLEMENTATION.
+ 
+  METHOD display.
+
+    mo_alv->display( ).
+
+    IF mv_cancel = abap_true.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+  METHOD get_selected.
+
+    DATA:
+      lv_condition     TYPE string,
+      lr_exporting     TYPE REF TO data,
+      lo_data_descr    TYPE REF TO cl_abap_datadescr,
+      lo_selections    TYPE REF TO cl_salv_selections,
+      lt_selected_rows TYPE salv_t_row.
+
+    FIELD-SYMBOLS:
+      <lg_exporting>    TYPE any,
+      <lt_table>        TYPE STANDARD TABLE,
+      <ls_line>         TYPE any,
+      <lg_value>        TYPE any,
+      <lv_selected>     TYPE abap_bool,
+      <lv_selected_row> TYPE LINE OF salv_t_row.
+
+    CLEAR et_list.
+
+    " Make sure we don't accidentally return anything
+    IF mv_cancel = abap_true.
+      RETURN.
+    ENDIF.
+
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+
+    lo_selections = mo_alv->get_selections( ).
+
+    IF lo_selections->get_selection_mode( ) = if_salv_c_selection_mode=>single.
+
+      lt_selected_rows = lo_selections->get_selected_rows( ).
+
+      LOOP AT lt_selected_rows ASSIGNING <lv_selected_row>.
+
+        READ TABLE <lt_table> ASSIGNING <ls_line> INDEX <lv_selected_row>.
+        CHECK <ls_line> IS ASSIGNED.
+
+        ASSIGN COMPONENT c_fieldname_selected OF STRUCTURE <ls_line> TO <lv_selected>.
+        CHECK <lv_selected> IS ASSIGNED.
+
+        <lv_selected> = abap_true.
+
+      ENDLOOP.
+
+    ENDIF.
+
+    lv_condition = |{ c_fieldname_selected } = ABAP_TRUE|.
+
+    CREATE DATA lr_exporting LIKE LINE OF et_list.
+    ASSIGN lr_exporting->* TO <lg_exporting>.
+
+    lo_data_descr = mo_table_descr->get_table_line_type( ).
+
+    LOOP AT <lt_table> ASSIGNING <ls_line> WHERE (lv_condition).
+      CLEAR <lg_exporting>.
+
+      CASE lo_data_descr->kind.
+        WHEN cl_abap_elemdescr=>kind_elem.
+          ASSIGN COMPONENT c_default_column OF STRUCTURE <ls_line> TO <lg_value>.
+          ASSERT <lg_value> IS ASSIGNED.
+          <lg_exporting> = <lg_value>.
+
+        WHEN OTHERS.
+          MOVE-CORRESPONDING <ls_line> TO <lg_exporting>.
+
+      ENDCASE.
+      APPEND <lg_exporting> TO et_list.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+  METHOD create_alv.
+ 
+    FIELD-SYMBOLS <lt_table> TYPE STANDARD TABLE.
+ 
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+ 
+    cl_salv_table=>factory(
+      IMPORTING
+        r_salv_table = ro_alv
+      CHANGING
+        t_table      = <lt_table> ).
+ 
+  ENDMETHOD.
+ 
+  METHOD constructor.
+ 
+    DATA:
+      lv_object_list  TYPE abap_bool,
+      lo_events       TYPE REF TO cl_salv_events_table,
+      lo_columns      TYPE REF TO cl_salv_columns_table,
+      lo_table_header TYPE REF TO cl_salv_form_text.
+ 
+    create_new_selectable_table( it_list ).
+    preselect( it_preselected_rows ).
+ 
+    TRY.
+        mo_alv = create_alv( ).
+        mo_alv->set_screen_popup(
+          start_column = is_position-start_column
+          end_column   = is_position-end_column
+          start_line   = is_position-start_row
+          end_line     = is_position-end_row ).
+        ms_position = is_position.
+ 
+        lo_events = mo_alv->get_event( ).
+ 
+        SET HANDLER on_select_list_link_click FOR lo_events.
+        SET HANDLER on_select_list_function_click FOR lo_events.
+        SET HANDLER on_double_click FOR lo_events.
+ 
+        IF iv_title CN ' _0'.
+          mo_alv->get_display_settings( )->set_list_header( iv_title ).
+        ENDIF.
+ 
+        IF iv_header_text CN ' _0'.
+          CREATE OBJECT lo_table_header EXPORTING text = iv_header_text.
+          mo_alv->set_top_of_list( lo_table_header ).
+        ENDIF.
+ 
+        mo_alv->get_display_settings( )->set_striped_pattern( iv_striped_pattern ).
+        mo_alv->get_selections( )->set_selection_mode( iv_selection_mode ).
+ 
+        lo_columns = mo_alv->get_columns( ).
+        lo_columns->set_optimize( iv_optimize_col_width ).
+ 
+        TRY.
+            lo_columns->get_column( |{ c_fieldname_obj_type }| ).
+            lv_object_list = abap_true.
+          CATCH cx_salv_not_found.
+        ENDTRY.
+ 
+        setup_columns(
+          io_columns            = lo_columns
+          iv_selection_mode     = iv_selection_mode
+          iv_select_column_text = iv_select_column_text
+          it_columns_to_display = it_columns_to_display ).
+ 
+        setup_toolbar(
+          iv_object_list    = lv_object_list
+          iv_selection_mode = iv_selection_mode ).
+ 
+      CATCH cx_salv_msg.
+        zcx_abapgit_exception=>raise( 'ALV error from object decision list' ).
+    ENDTRY.
+ 
+ 
+  ENDMETHOD.
+ 
+  METHOD create_new_selectable_table.
+
+    " create and populate a table on the fly derived from
+    " it_data with a select column
+
+    DATA:
+      lr_struct        TYPE REF TO data,
+      lt_components    TYPE cl_abap_structdescr=>component_table,
+      lo_data_descr    TYPE REF TO cl_abap_datadescr,
+      lo_elem_descr    TYPE REF TO cl_abap_elemdescr,
+      lo_struct_descr  TYPE REF TO cl_abap_structdescr,
+      lo_struct_descr2 TYPE REF TO cl_abap_structdescr.
+
+    FIELD-SYMBOLS:
+      <lt_table>     TYPE STANDARD TABLE,
+      <ls_component> TYPE abap_componentdescr,
+      <ls_line>      TYPE data,
+      <lg_data>      TYPE any,
+      <lg_value>     TYPE any.
+
+    mo_table_descr ?= cl_abap_tabledescr=>describe_by_data( it_list ).
+    lo_data_descr = mo_table_descr->get_table_line_type( ).
+
+    CASE lo_data_descr->kind.
+      WHEN cl_abap_elemdescr=>kind_elem.
+        lo_elem_descr ?= mo_table_descr->get_table_line_type( ).
+        INSERT INITIAL LINE INTO lt_components ASSIGNING <ls_component> INDEX 1.
+        <ls_component>-name = c_default_column.
+        <ls_component>-type = lo_elem_descr.
+
+      WHEN cl_abap_elemdescr=>kind_struct.
+        lo_struct_descr ?= mo_table_descr->get_table_line_type( ).
+        lt_components = lo_struct_descr->get_components( ).
+
+    ENDCASE.
+
+    IF lt_components IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    INSERT INITIAL LINE INTO lt_components ASSIGNING <ls_component> INDEX 1.
+    <ls_component>-name = c_fieldname_selected.
+    <ls_component>-type ?= cl_abap_datadescr=>describe_by_name( 'FLAG' ).
+
+    lo_struct_descr2 = cl_abap_structdescr=>create( lt_components ).
+    mo_table_descr = cl_abap_tabledescr=>create( lo_struct_descr2 ).
+
+    CREATE DATA mr_table TYPE HANDLE mo_table_descr.
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+
+    CREATE DATA lr_struct TYPE HANDLE lo_struct_descr2.
+    ASSIGN lr_struct->* TO <ls_line>.
+    ASSERT sy-subrc = 0.
+
+    LOOP AT it_list ASSIGNING <lg_data>.
+      CLEAR <ls_line>.
+      CASE lo_data_descr->kind.
+        WHEN cl_abap_elemdescr=>kind_elem.
+          ASSIGN COMPONENT c_default_column OF STRUCTURE <lg_data> TO <lg_value>.
+          ASSERT <lg_value> IS ASSIGNED.
+          <ls_line> = <lg_value>.
+
+        WHEN OTHERS.
+          MOVE-CORRESPONDING <lg_data> TO <ls_line>.
+
+      ENDCASE.
+      INSERT <ls_line> INTO TABLE <lt_table>.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+  METHOD preselect.
+
+    FIELD-SYMBOLS:
+      <lt_table>    TYPE STANDARD TABLE,
+      <lv_row>      LIKE LINE OF it_preselected_rows,
+      <ls_line>     TYPE any,
+      <lv_selected> TYPE data.
+
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+
+    LOOP AT it_preselected_rows ASSIGNING <lv_row>.
+
+      READ TABLE <lt_table> INDEX <lv_row> ASSIGNING <ls_line>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Preselected row { <lv_row> } doesn't exist| ).
+      ENDIF.
+
+      ASSIGN COMPONENT c_fieldname_selected OF STRUCTURE <ls_line> TO <lv_selected>.
+      ASSERT sy-subrc = 0.
+      <lv_selected> = abap_true.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+  METHOD on_double_click.
+
+    DATA lo_selections TYPE REF TO cl_salv_selections.
+
+    lo_selections = mo_alv->get_selections( ).
+
+    IF lo_selections->get_selection_mode( ) = if_salv_c_selection_mode=>single.
+      mo_alv->close_screen( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+  METHOD on_select_list_function_click.
+
+    " Work for functions of SAPMSVIM and OWN
+    CASE e_salv_function.
+      WHEN 'O.K.' OR 'OK'.
+        mv_cancel = abap_false.
+        mo_alv->close_screen( ).
+
+      WHEN 'ABR' OR 'CANCEL'.
+        " Canceled: clear list to overwrite nothing
+        mv_cancel = abap_true.
+        mo_alv->close_screen( ).
+
+      WHEN 'SALL' OR 'SEL_ALL'.
+        mark_visible( abap_true ).
+        mo_alv->refresh( ).
+
+      WHEN 'DSEL' OR 'SEL_DEL'.
+        mark_visible( abap_false ).
+        mo_alv->refresh( ).
+
+      WHEN 'SEL_KEY'.
+        mark_selected( ).
+        mo_alv->refresh( ).
+
+      WHEN 'SEL_CAT'.
+        mark_category( ask_user_for_obj_category( ) ).
+        mo_alv->refresh( ).
+
+      WHEN OTHERS.
+        mv_cancel = abap_true.
+        mo_alv->close_screen( ).
+
+    ENDCASE.
+
+  ENDMETHOD.
+ 
+  METHOD mark_all.
+
+    FIELD-SYMBOLS:
+      <lt_table>    TYPE STANDARD TABLE,
+      <ls_line>     TYPE any,
+      <lv_selected> TYPE abap_bool.
+
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+
+    LOOP AT <lt_table> ASSIGNING <ls_line>.
+
+      ASSIGN COMPONENT c_fieldname_selected OF STRUCTURE <ls_line> TO <lv_selected>.
+      ASSERT sy-subrc = 0.
+      <lv_selected> = iv_selected.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+  METHOD are_all_marked.
+ 
+    DATA lv_index LIKE LINE OF it_scope.
+ 
+    FIELD-SYMBOLS:
+      <lt_table>    TYPE STANDARD TABLE,
+      <ls_line>     TYPE any,
+      <lv_selected> TYPE abap_bool.
+ 
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+ 
+    LOOP AT it_scope INTO lv_index.
+ 
+      READ TABLE <lt_table> ASSIGNING <ls_line> INDEX lv_index.
+      CHECK sy-subrc = 0.
+ 
+      ASSIGN COMPONENT c_fieldname_selected OF STRUCTURE <ls_line> TO <lv_selected>.
+      ASSERT sy-subrc = 0.
+ 
+      IF <lv_selected> = abap_true.
+        rv_yes = abap_true.
+      ELSE.
+        rv_yes = abap_false.
+        RETURN.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+  METHOD mark_selected.
+
+    DATA lt_clear TYPE salv_t_row.
+    DATA lt_scope TYPE lvc_t_fidx.
+
+    lt_scope = mo_alv->get_selections( )->get_selected_rows( ).
+
+    IF lines( lt_scope ) > 0.
+      mark_indexed(
+        it_scope    = lt_scope
+        iv_selected = boolc( are_all_marked( lt_scope ) = abap_false ) ).
+      mo_alv->get_selections( )->set_selected_rows( lt_clear ).
+    ELSE.
+      MESSAGE 'Select rows first to mark them' TYPE 'S'.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+  METHOD mark_visible.
+
+    DATA lt_filters TYPE lvc_t_filt.
+    DATA lt_scope   TYPE lvc_t_fidx.
+
+    FIELD-SYMBOLS <lt_table> TYPE STANDARD TABLE.
+
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+
+    " If nothing selected, select all VISIBLE
+    lt_filters = cl_salv_controller_metadata=>get_lvc_filter( mo_alv->get_filters( ) ).
+    IF lines( lt_filters ) = 0.
+      mark_all( iv_selected ). " No filters - just select all
+      RETURN.
+    ENDIF.
+
+    CALL FUNCTION 'LVC_FILTER_APPLY'
+      EXPORTING
+        it_filter              = lt_filters
+      IMPORTING
+        et_filter_index_inside = lt_scope
+      TABLES
+        it_data                = <lt_table>.
+
+    mark_indexed(
+      it_scope    = lt_scope
+      iv_selected = iv_selected ).
+
+  ENDMETHOD.
+ 
+  METHOD mark_indexed.
+
+    DATA lv_index LIKE LINE OF it_scope.
+
+    FIELD-SYMBOLS:
+      <lt_table>    TYPE STANDARD TABLE,
+      <ls_line>     TYPE any,
+      <lv_selected> TYPE abap_bool.
+
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+
+    LOOP AT it_scope INTO lv_index.
+
+      READ TABLE <lt_table> ASSIGNING <ls_line> INDEX lv_index.
+      CHECK sy-subrc = 0.
+
+      ASSIGN COMPONENT c_fieldname_selected OF STRUCTURE <ls_line> TO <lv_selected>.
+      ASSERT sy-subrc = 0.
+
+      IF iv_invert = abap_true.
+        <lv_selected> = boolc( <lv_selected> = abap_false ).
+      ELSE.
+        <lv_selected> = iv_selected.
+      ENDIF.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+  METHOD ask_user_for_obj_category.
+ 
+    DATA:
+      lv_answer    TYPE c LENGTH 1,
+      ls_position  TYPE zif_abapgit_popups=>ty_popup_position,
+      ls_selection TYPE spopli,
+      lt_selection TYPE TABLE OF spopli.
+ 
+    ls_selection-varoption = 'Packages'.
+    APPEND ls_selection TO lt_selection.
+    ls_selection-varoption = 'DDIC objects'.
+    APPEND ls_selection TO lt_selection.
+    ls_selection-varoption = 'Source code'.
+    APPEND ls_selection TO lt_selection.
+    ls_selection-varoption = 'Enhancements'.
+    APPEND ls_selection TO lt_selection.
+ 
+    ls_position-start_column = ms_position-start_column + 20.
+    ls_position-start_row    = ms_position-start_row + 5.
+ 
+    CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
+      EXPORTING
+        titel      = 'Selection'
+        textline1  = 'Which objects should be added to the selection?'
+        start_col  = ls_position-start_column
+        start_row  = ls_position-start_row
+        cursorline = 1
+      IMPORTING
+        answer     = lv_answer
+      TABLES
+        t_spopli   = lt_selection
+      EXCEPTIONS
+        OTHERS     = 1.
+    IF sy-subrc <> 0 OR lv_answer = c_answer_cancel.
+      RETURN.
+    ENDIF.
+ 
+    READ TABLE lt_selection INDEX lv_answer INTO ls_selection.
+    IF sy-subrc = 0.
+      rv_category = ls_selection-varoption.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD mark_category.
+
+    FIELD-SYMBOLS:
+      <lt_table>    TYPE STANDARD TABLE,
+      <lv_obj_type> TYPE tadir-object,
+      <ls_line>     TYPE any,
+      <lv_selected> TYPE abap_bool.
+
+    IF iv_category IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+
+    LOOP AT <lt_table> ASSIGNING <ls_line>.
+
+      ASSIGN COMPONENT c_fieldname_obj_type OF STRUCTURE <ls_line> TO <lv_obj_type>.
+      ASSERT sy-subrc = 0.
+
+      ASSIGN COMPONENT c_fieldname_selected OF STRUCTURE <ls_line> TO <lv_selected>.
+      ASSERT sy-subrc = 0.
+
+      CASE iv_category.
+        WHEN 'Packages'.
+          IF <lv_obj_type> <> 'DEVC'.
+            CONTINUE.
+          ENDIF.
+        WHEN 'DDIC objects'.
+          IF zcl_abapgit_objects_activation=>is_ddic_type( <lv_obj_type> ) = abap_false.
+            CONTINUE.
+          ENDIF.
+        WHEN 'Source code'.
+          IF 'CLAS,FUGR,INTF,PROG,TYPE' NS <lv_obj_type>.
+            CONTINUE.
+          ENDIF.
+        WHEN 'Enhancements'.
+          IF 'ENHO,ENHS,ENHC,ENSC' NS <lv_obj_type>.
+            CONTINUE.
+          ENDIF.
+        WHEN OTHERS.
+          RETURN. " Unexpected category
+      ENDCASE.
+
+      <lv_selected> = abap_true.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+  METHOD on_select_list_link_click.
+
+    FIELD-SYMBOLS:
+      <lt_table>    TYPE STANDARD TABLE,
+      <ls_line>     TYPE any,
+      <lv_selected> TYPE abap_bool.
+
+    ASSIGN mr_table->* TO <lt_table>.
+    ASSERT sy-subrc = 0.
+
+    READ TABLE <lt_table> ASSIGNING <ls_line> INDEX row.
+    IF sy-subrc = 0.
+
+      ASSIGN COMPONENT c_fieldname_selected OF STRUCTURE <ls_line> TO <lv_selected>.
+      ASSERT sy-subrc = 0.
+      <lv_selected> = boolc( <lv_selected> = abap_false ).
+
+    ENDIF.
+
+    mo_alv->refresh( ).
+
+  ENDMETHOD.
+ 
+  METHOD setup_columns.
+
+    DATA:
+      lt_columns TYPE salv_t_column_ref,
+      ls_column  TYPE salv_s_column_ref,
+      lo_column  TYPE REF TO cl_salv_column_list.
+
+    FIELD-SYMBOLS <ls_column_to_display> TYPE zif_abapgit_popups=>ty_alv_column.
+
+    lt_columns = io_columns->get( ).
+
+    LOOP AT lt_columns INTO ls_column.
+
+      lo_column ?= ls_column-r_column.
+
+      IF    iv_selection_mode    = if_salv_c_selection_mode=>multiple
+        AND ls_column-columnname = c_fieldname_selected.
+        lo_column->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).
+        lo_column->set_output_length( 20 ).
+        lo_column->set_short_text( |{ iv_select_column_text }| ).
+        lo_column->set_medium_text( |{ iv_select_column_text }| ).
+        lo_column->set_long_text( |{ iv_select_column_text }| ).
+        CONTINUE.
+      ENDIF.
+
+      READ TABLE it_columns_to_display
+        ASSIGNING <ls_column_to_display>
+        WITH KEY name = ls_column-columnname.
+
+      CASE sy-subrc.
+        WHEN 0.
+          IF <ls_column_to_display>-text CN ' _0'.
+            lo_column->set_short_text( |{ <ls_column_to_display>-text }| ).
+            lo_column->set_medium_text( |{ <ls_column_to_display>-text }| ).
+            lo_column->set_long_text( |{ <ls_column_to_display>-text }| ).
+          ENDIF.
+
+          IF <ls_column_to_display>-length > 0.
+            lo_column->set_output_length( <ls_column_to_display>-length ).
+          ENDIF.
+
+          IF <ls_column_to_display>-show_icon = abap_true.
+            lo_column->set_icon( abap_true ).
+          ENDIF.
+
+          IF <ls_column_to_display>-center = abap_true.
+            lo_column->set_alignment( if_salv_c_alignment=>centered ).
+          ENDIF.
+
+        WHEN OTHERS.
+          lo_column->set_technical( abap_true ). " Hide column
+
+      ENDCASE.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+  METHOD setup_toolbar.
+
+    DATA:
+      lv_report    TYPE sy-repid,
+      lv_pfstatus  TYPE sy-pfkey,
+      lo_functions TYPE REF TO cl_salv_functions_list,
+      lt_func_list TYPE salv_t_ui_func,
+      lv_fn        TYPE string,
+      ls_func      LIKE LINE OF lt_func_list.
+
+    CALL FUNCTION 'RS_CUA_STATUS_CHECK'
+      EXPORTING
+        program          = sy-cprog
+        objectname       = c_own_pfstatus
+      EXCEPTIONS
+        object_not_found = 1
+        OTHERS           = 2.
+
+    IF sy-subrc = 0.
+
+      mo_alv->set_screen_status(
+        report   = sy-cprog
+        pfstatus = c_own_pfstatus ).
+
+    ELSE.
+
+      lv_report  = 'SAPMSVIM'.
+
+      IF iv_selection_mode = if_salv_c_selection_mode=>single.
+        lv_pfstatus = '110'.
+      ELSE.
+        lv_pfstatus = '102'.
+      ENDIF.
+
+      mo_alv->set_screen_status(
+        report   = lv_report
+        pfstatus = lv_pfstatus ).
+
+    ENDIF.
+
+    lo_functions = mo_alv->get_functions( ).
+
+    lt_func_list = lo_functions->get_functions( ).
+    LOOP AT lt_func_list INTO ls_func.
+      lv_fn = ls_func-r_function->get_name( ).
+      IF lv_fn = 'OK' OR lv_fn = 'CANCEL'.
+        ls_func-r_function->set_visible( abap_true ).
+      ELSEIF iv_object_list = abap_true.
+        ls_func-r_function->set_visible( abap_true ).
+      ELSE.
+        ls_func-r_function->set_visible( abap_false ).
+      ENDIF.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zcl_abapgit_ui_factory.clas.abap.html b/src/ui/zcl_abapgit_ui_factory.clas.abap.html new file mode 100644 index 00000000000..8450f97c354 --- /dev/null +++ b/src/ui/zcl_abapgit_ui_factory.clas.abap.html @@ -0,0 +1,652 @@ + + + + + + Code coverage report for src/ui/zcl_abapgit_ui_factory.clas.abap + + + + + + + + + +
+
+

All files / src/ui zcl_abapgit_ui_factory.clas.abap

+
+ +
+ 98.94% + Statements + 187/189 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.94% + Lines + 187/189 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +1901x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_ui_factory DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_ui_injector .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_asset_manager
+      RETURNING
+        VALUE(ri_asset_man) TYPE REF TO zif_abapgit_gui_asset_manager
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_popups
+      RETURNING
+        VALUE(ri_popups) TYPE REF TO zif_abapgit_popups .
+    CLASS-METHODS get_gui
+      RETURNING
+        VALUE(ro_gui) TYPE REF TO zcl_abapgit_gui
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_gui_services
+      RETURNING
+        VALUE(ri_gui_services) TYPE REF TO zif_abapgit_gui_services
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_frontend_services
+      RETURNING
+        VALUE(ri_fe_serv) TYPE REF TO zif_abapgit_frontend_services .
+    CLASS-METHODS get_html_viewer
+      IMPORTING
+        !io_container           TYPE REF TO cl_gui_container DEFAULT cl_gui_container=>screen0
+        !iv_disable_query_table TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ri_viewer)        TYPE REF TO zif_abapgit_html_viewer .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gi_popups TYPE REF TO zif_abapgit_popups .
+    CLASS-DATA gi_html_viewer TYPE REF TO zif_abapgit_html_viewer .
+    CLASS-DATA go_gui TYPE REF TO zcl_abapgit_gui .
+    CLASS-DATA gi_fe_services TYPE REF TO zif_abapgit_frontend_services .
+    CLASS-DATA gi_gui_services TYPE REF TO zif_abapgit_gui_services .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ui_factory IMPLEMENTATION.
+ 
+ 
+  METHOD get_asset_manager.
+ 
+    DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
+    DATA li_asset_man TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    CREATE OBJECT lo_buf.
+ 
+    li_asset_man = zcl_abapgit_gui_asset_manager=>create( ).
+ 
+    " @@abapmerge include zabapgit_css_common.w3mi.data.css > lo_buf->add( '$$' ).
+    li_asset_man->register_asset(
+      iv_url       = 'css/common.css'
+      iv_type      = 'text/css'
+      iv_mime_name = 'ZABAPGIT_CSS_COMMON'
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_css_theme_default.w3mi.data.css > lo_buf->add( '$$' ).
+    li_asset_man->register_asset(
+      iv_url       = 'css/theme-default.css'
+      iv_type      = 'text/css'
+      iv_cachable  = abap_false
+      iv_mime_name = 'ZABAPGIT_CSS_THEME_DEFAULT'
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_css_theme_dark.w3mi.data.css > lo_buf->add( '$$' ).
+    li_asset_man->register_asset(
+      iv_url       = 'css/theme-dark.css'
+      iv_type      = 'text/css'
+      iv_cachable  = abap_false
+      iv_mime_name = 'ZABAPGIT_CSS_THEME_DARK'
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_css_theme_belize_blue.w3mi.data.css > lo_buf->add( '$$' ).
+    li_asset_man->register_asset(
+      iv_url       = 'css/theme-belize-blue.css'
+      iv_type      = 'text/css'
+      iv_cachable  = abap_false
+      iv_mime_name = 'ZABAPGIT_CSS_THEME_BELIZE_BLUE'
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_js_common.w3mi.data.js > lo_buf->add( '$$' ).
+    li_asset_man->register_asset(
+      iv_url       = 'js/common.js'
+      iv_type      = 'text/javascript'
+      iv_mime_name = 'ZABAPGIT_JS_COMMON'
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include zabapgit_icon_font_css.w3mi.data.css > lo_buf->add( '$$' ).
+    li_asset_man->register_asset(
+      iv_url       = 'css/ag-icons.css'
+      iv_type      = 'text/css'
+      iv_mime_name = 'ZABAPGIT_ICON_FONT_CSS'
+      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).
+ 
+    " @@abapmerge include-base64 zabapgit_icon_font.w3mi.data.woff > lo_buf->add( '$$' ).
+    li_asset_man->register_asset(
+      iv_url       = 'font/ag-icons.woff'
+      iv_type      = 'font/woff'
+      iv_mime_name = 'ZABAPGIT_ICON_FONT'
+      iv_base64    = lo_buf->join_and_flush( ) ).
+ 
+    ri_asset_man = li_asset_man.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_frontend_services.
+ 
+    IF gi_fe_services IS INITIAL.
+      CREATE OBJECT gi_fe_services TYPE zcl_abapgit_frontend_services.
+    ENDIF.
+ 
+    ri_fe_serv = gi_fe_services.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_gui.
+ 
+    DATA:
+      li_hotkey_ctl TYPE REF TO zif_abapgit_gui_hotkey_ctl,
+      li_router     TYPE REF TO zif_abapgit_gui_event_handler,
+      li_asset_man  TYPE REF TO zif_abapgit_gui_asset_manager.
+ 
+    DATA lo_html_preprocessor TYPE REF TO zcl_abapgit_gui_html_processor.
+ 
+    IF go_gui IS INITIAL.
+      li_asset_man = get_asset_manager( ).
+ 
+      CREATE OBJECT lo_html_preprocessor EXPORTING ii_asset_man = li_asset_man.
+      lo_html_preprocessor->preserve_css( 'css/ag-icons.css' ).
+      lo_html_preprocessor->preserve_css( 'css/common.css' ).
+ 
+      CREATE OBJECT li_router TYPE zcl_abapgit_gui_router.
+      CREATE OBJECT li_hotkey_ctl TYPE zcl_abapgit_gui_hotkey_ctl.
+ 
+      CREATE OBJECT go_gui
+        EXPORTING
+          io_component      = li_router
+          ii_hotkey_ctl     = li_hotkey_ctl
+          ii_html_processor = lo_html_preprocessor
+          ii_asset_man      = li_asset_man.
+    ENDIF.
+    ro_gui = go_gui.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_gui_services.
+    IF gi_gui_services IS NOT BOUND.
+      gi_gui_services ?= get_gui( ).
+    ENDIF.
+    ri_gui_services = gi_gui_services.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_html_viewer.
+ 
+    IF gi_html_viewer IS NOT BOUND.
+      CREATE OBJECT gi_html_viewer TYPE zcl_abapgit_html_viewer_gui
+        EXPORTING
+          io_container           = io_container
+          iv_disable_query_table = iv_disable_query_table.
+    ENDIF.
+ 
+    ri_viewer = gi_html_viewer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_popups.
+ 
+    IF gi_popups IS INITIAL.
+      CREATE OBJECT gi_popups TYPE zcl_abapgit_popups.
+    ENDIF.
+ 
+    ri_popups = gi_popups.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zcl_abapgit_ui_injector.clas.abap.html b/src/ui/zcl_abapgit_ui_injector.clas.abap.html new file mode 100644 index 00000000000..640c87c17c0 --- /dev/null +++ b/src/ui/zcl_abapgit_ui_injector.clas.abap.html @@ -0,0 +1,277 @@ + + + + + + Code coverage report for src/ui/zcl_abapgit_ui_injector.clas.abap + + + + + + + + + +
+
+

All files / src/ui zcl_abapgit_ui_injector.clas.abap

+
+ +
+ 100% + Statements + 64/64 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 64/64 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +651x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_ui_injector DEFINITION
+  PUBLIC
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS set_popups
+      IMPORTING
+        !ii_popups TYPE REF TO zif_abapgit_popups .
+    CLASS-METHODS set_frontend_services
+      IMPORTING
+        !ii_fe_serv TYPE REF TO zif_abapgit_frontend_services .
+    CLASS-METHODS set_gui_services
+      IMPORTING
+        !ii_gui_services TYPE REF TO zif_abapgit_gui_services .
+    CLASS-METHODS get_dummy_gui_services
+      RETURNING
+        VALUE(ri_gui_services) TYPE REF TO zif_abapgit_gui_services .
+    CLASS-METHODS set_html_viewer
+      IMPORTING
+        !ii_html_viewer TYPE REF TO zif_abapgit_html_viewer .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_ui_injector IMPLEMENTATION.
+ 
+ 
+  METHOD get_dummy_gui_services.
+ 
+    ri_gui_services = lcl_gui_services_dummy=>create( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_frontend_services.
+ 
+    zcl_abapgit_ui_factory=>gi_fe_services = ii_fe_serv.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_gui_services.
+ 
+    zcl_abapgit_ui_factory=>gi_gui_services = ii_gui_services.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_html_viewer.
+ 
+    zcl_abapgit_ui_factory=>gi_html_viewer = ii_html_viewer.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_popups.
+ 
+    zcl_abapgit_ui_factory=>gi_popups = ii_popups.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zcl_abapgit_ui_injector.clas.locals_imp.abap.html b/src/ui/zcl_abapgit_ui_injector.clas.locals_imp.abap.html new file mode 100644 index 00000000000..feb4003986b --- /dev/null +++ b/src/ui/zcl_abapgit_ui_injector.clas.locals_imp.abap.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/ui/zcl_abapgit_ui_injector.clas.locals_imp.abap + + + + + + + + + +
+
+

All files / src/ui zcl_abapgit_ui_injector.clas.locals_imp.abap

+
+ +
+ 92.85% + Statements + 26/28 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 92.85% + Lines + 26/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x + 
CLASS lcl_gui_services_dummy DEFINITION FINAL.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_gui_services.
+    CLASS-METHODS create
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO lcl_gui_services_dummy.
+ENDCLASS.
+ 
+CLASS lcl_gui_services_dummy IMPLEMENTATION.
+  METHOD create.
+    CREATE OBJECT ro_instance.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~cache_asset.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~register_event_handler.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~get_current_page_name.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~get_hotkeys_ctl.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~get_html_parts.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~get_log.
+  ENDMETHOD.
+  METHOD zif_abapgit_gui_services~register_page_asset.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap.html b/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap.html new file mode 100644 index 00000000000..9d18b678a64 --- /dev/null +++ b/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap.html @@ -0,0 +1,514 @@ + + + + + + Code coverage report for src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/ui zcl_abapgit_ui_injector.clas.testclasses.abap

+
+ +
+ 72.02% + Statements + 103/143 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 72.02% + Lines + 103/143 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +1441x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS ltcl_abapgit_popups_mock DEFINITION FOR TESTING.
+ 
+  PUBLIC SECTION.
+    INTERFACES: zif_abapgit_popups.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_no_dependency_injection DEFINITION FOR TESTING
+                              RISK LEVEL HARMLESS
+                              DURATION SHORT.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      no_injection FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_simple_dependency_inject DEFINITION FOR TESTING
+                                  RISK LEVEL HARMLESS
+                                  DURATION SHORT.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      setup,
+      simple_injection FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_abapgit_popups_mock IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_popups~branch_list_popup.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~commit_list_popup.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~create_branch_popup.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_folder_logic.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_confirm.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_create_package.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_create_transp_branch.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_from_list.
+
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_transports.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_transport_request.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_search_help.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_select_tr_requests.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_select_wb_tc_tr_and_tsk.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~tag_list_popup.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~popup_to_select_labels.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_popups~choose_code_insp_check_variant.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_no_dependency_injection IMPLEMENTATION.
+ 
+  METHOD no_injection.
+
+    DATA: li_popups      TYPE REF TO zif_abapgit_popups,
+          lo_class_descr TYPE REF TO cl_abap_classdescr.
+
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+
+    lo_class_descr ?= cl_abap_classdescr=>describe_by_object_ref( li_popups ).
+
+    cl_abap_unit_assert=>assert_equals(
+      exp = '\CLASS=ZCL_ABAPGIT_POPUPS'
+      act = lo_class_descr->absolute_name ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_simple_dependency_inject IMPLEMENTATION.
+ 
+  METHOD setup.
+
+    DATA: lo_popups_mock TYPE REF TO ltcl_abapgit_popups_mock.
+
+    CREATE OBJECT lo_popups_mock.
+
+    zcl_abapgit_ui_injector=>set_popups( lo_popups_mock ).
+
+  ENDMETHOD.
+ 
+  METHOD simple_injection.
+
+    DATA: li_popups      TYPE REF TO zif_abapgit_popups,
+          lo_class_descr TYPE REF TO cl_abap_classdescr.
+
+    li_popups = zcl_abapgit_ui_factory=>get_popups( ).
+
+    lo_class_descr ?= cl_abap_classdescr=>describe_by_object_ref( li_popups ).
+
+    cl_abap_unit_assert=>assert_equals(
+      exp = '\CLASS-POOL=ZCL_ABAPGIT_UI_INJECTOR\CLASS=LTCL_ABAPGIT_POPUPS_MOCK'
+      act = lo_class_descr->absolute_name ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/index.html b/src/utils/index.html new file mode 100644 index 00000000000..1a9567e5216 --- /dev/null +++ b/src/utils/index.html @@ -0,0 +1,596 @@ + + + + + + Code coverage report for src/utils + + + + + + + + + +
+
+

All files src/utils

+
+ +
+ 82.99% + Statements + 5995/7223 +
+ + +
+ 84.07% + Branches + 190/226 +
+ + +
+ 63.23% + Functions + 86/136 +
+ + +
+ 82.99% + Lines + 5995/7223 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_abap_language_vers.clas.abap +
+
100%133/133100%0/0100%0/0100%133/133
zcl_abapgit_convert.clas.abap +
+
98.86%347/35178.57%11/14100%0/098.86%347/351
zcl_abapgit_convert.clas.testclasses.abap +
+
100%269/269100%12/12100%12/12100%269/269
zcl_abapgit_diff.clas.abap +
+
52.4%283/540100%0/00%0/852.4%283/540
zcl_abapgit_diff.clas.testclasses.abap +
+
16.27%105/645100%0/00%0/2316.27%105/645
zcl_abapgit_environment.clas.abap +
+
100%216/216100%1/1100%0/0100%216/216
zcl_abapgit_environment.clas.testclasses.abap +
+
92.42%61/66100%5/583.33%5/692.42%61/66
zcl_abapgit_item_state.clas.abap +
+
100%105/105100%9/9100%2/2100%105/105
zcl_abapgit_item_state.clas.testclasses.abap +
+
100%230/230100%2/2100%2/2100%230/230
zcl_abapgit_language.clas.abap +
+
100%50/50100%0/0100%0/0100%50/50
zcl_abapgit_log.clas.abap +
+
97.21%314/32392.3%12/1385.71%6/797.21%314/323
zcl_abapgit_log.clas.testclasses.abap +
+
100%257/257100%16/16100%16/16100%257/257
zcl_abapgit_news.clas.abap +
+
100%288/288100%16/16100%0/0100%288/288
zcl_abapgit_news.clas.testclasses.abap +
+
100%224/224100%4/4100%4/4100%224/224
zcl_abapgit_path.clas.abap +
+
96.18%126/13180%12/15100%0/096.18%126/131
zcl_abapgit_path.clas.testclasses.abap +
+
100%206/206100%5/5100%5/5100%206/206
zcl_abapgit_repo_labels.clas.abap +
+
96.54%307/31873.33%22/30100%0/096.54%307/318
zcl_abapgit_repo_labels.clas.testclasses.abap +
+
100%189/189100%7/7100%7/7100%189/189
zcl_abapgit_requirement_helper.clas.abap +
+
100%252/252100%0/0100%0/0100%252/252
zcl_abapgit_requirement_helper.clas.testclasses.abap +
+
43.93%210/478100%0/00%0/1443.93%210/478
zcl_abapgit_string_buffer.clas.abap +
+
100%67/67100%0/0100%0/0100%67/67
zcl_abapgit_string_buffer.clas.testclasses.abap +
+
100%21/21100%1/1100%1/1100%21/21
zcl_abapgit_string_map.clas.abap +
+
96.69%234/24280%20/25100%5/596.69%234/242
zcl_abapgit_string_map.clas.testclasses.abap +
+
100%181/181100%4/4100%4/4100%181/181
zcl_abapgit_timer.clas.abap +
+
96.22%102/10666.66%4/6100%0/096.22%102/106
zcl_abapgit_timer.clas.testclasses.abap +
+
100%81/81100%4/4100%4/4100%81/81
zcl_abapgit_user_record.clas.abap +
+
77.77%168/216100%0/00%0/277.77%168/216
zcl_abapgit_user_record.clas.testclasses.abap +
+
66.66%20/30100%0/00%0/166.66%20/30
zcl_abapgit_utils.clas.abap +
+
97.77%88/900%0/1100%0/097.77%88/90
zcl_abapgit_utils.clas.testclasses.abap +
+
100%192/192100%10/10100%10/10100%192/192
zcl_abapgit_version.clas.abap +
+
79.34%219/27643.47%10/23100%0/079.34%219/276
zcl_abapgit_version.clas.testclasses.abap +
+
100%84/84100%3/3100%3/3100%84/84
zcl_abapgit_zip.clas.abap +
+
100%366/366100%0/0100%0/0100%366/366
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_abap_language_vers.clas.abap.html b/src/utils/zcl_abapgit_abap_language_vers.clas.abap.html new file mode 100644 index 00000000000..91a3ce936fd --- /dev/null +++ b/src/utils/zcl_abapgit_abap_language_vers.clas.abap.html @@ -0,0 +1,484 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_abap_language_vers.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_abap_language_vers.clas.abap

+
+ +
+ 100% + Statements + 133/133 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 133/133 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +1341x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_abap_language_vers DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS get_abap_language_vers_by_objt
+      IMPORTING
+        !iv_object_type                      TYPE trobjtype
+        !iv_package                          TYPE devclass
+      RETURNING
+        VALUE(rv_allowed_abap_langu_version) TYPE zif_abapgit_aff_types_v1=>ty_abap_language_version .
+    METHODS is_import_allowed
+      IMPORTING
+        !io_repo          TYPE REF TO zif_abapgit_repo
+        !iv_package       TYPE devclass
+      RETURNING
+        VALUE(rv_allowed) TYPE abap_bool .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    METHODS get_abap_language_vers_by_devc
+      IMPORTING
+        !iv_package                     TYPE devclass
+      RETURNING
+        VALUE(rv_abap_language_version) TYPE string .
+    METHODS get_abap_language_vers_by_repo
+      IMPORTING
+        !io_repo                        TYPE REF TO zif_abapgit_repo
+      RETURNING
+        VALUE(rv_abap_language_version) TYPE string .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_abap_language_vers IMPLEMENTATION.
+ 
+ 
+  METHOD get_abap_language_vers_by_devc.
+ 
+    DATA lv_class TYPE string.
+    DATA lv_abap_lang_version_devc TYPE string.
+    DATA lo_abap_language_version_cfg TYPE REF TO object.
+ 
+    lv_class = 'CL_ABAP_LANGUAGE_VERSION_CFG'.
+ 
+    TRY.
+        CREATE OBJECT lo_abap_language_version_cfg TYPE ('IF_ABAP_LANGUAGE_VERSION_CFG').
+ 
+        CALL METHOD (lv_class)=>('GET_INSTANCE')
+          RECEIVING
+            ro_instance = lo_abap_language_version_cfg.
+ 
+        CALL METHOD lo_abap_language_version_cfg->('IF_ABAP_LANGUAGE_VERSION_CFG~GET_PACKAGE_DEFAULT_VERSION')
+          EXPORTING
+            iv_package_name             = iv_package
+          RECEIVING
+            rv_default_language_version = lv_abap_lang_version_devc.
+ 
+        CASE lv_abap_lang_version_devc.
+          WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
+            rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
+          WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-key_user.
+            rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-key_user.
+          WHEN zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development.
+            rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-cloud_development.
+          WHEN OTHERS.
+            rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
+        ENDCASE.
+      CATCH cx_root.
+        rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_abap_language_vers_by_objt.
+ 
+    DATA lv_class TYPE string.
+    DATA lo_abap_language_version TYPE REF TO object.
+ 
+    lv_class = 'CL_ABAP_LANGUAGE_VERSION_CFG'.
+ 
+    TRY.
+ 
+        CREATE OBJECT lo_abap_language_version TYPE ('IF_ABAP_LANGUAGE_VERSION').
+ 
+        CALL METHOD (lv_class)=>('GET_INSTANCE')
+          RECEIVING
+            ro_instance = lo_abap_language_version.
+ 
+        CALL METHOD lo_abap_language_version->('IF_ABAP_LANGUAGE_VERSION~GET_DEFAULT_VERSION')
+          EXPORTING
+            iv_object_type     = iv_object_type
+            iv_package_name    = iv_package
+          RECEIVING
+            rv_default_version = rv_allowed_abap_langu_version.
+ 
+      CATCH cx_root.
+        rv_allowed_abap_langu_version = zif_abapgit_aff_types_v1=>co_abap_language_version-standard.
+        "to do: here we need to differentiate between source code object and non-source code objects
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_abap_language_vers_by_repo.
+    rv_abap_language_version = io_repo->get_dot_abapgit( )->get_abap_language_version( ).
+    IF rv_abap_language_version IS INITIAL.
+      rv_abap_language_version = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_import_allowed.
+ 
+    CASE get_abap_language_vers_by_repo( io_repo ).
+      WHEN zif_abapgit_dot_abapgit=>c_abap_language_version-undefined.
+        rv_allowed = abap_true.
+      WHEN OTHERS.
+        IF get_abap_language_vers_by_repo( io_repo ) = get_abap_language_vers_by_devc( iv_package ).
+          rv_allowed = abap_true.
+        ELSEIF
+        get_abap_language_vers_by_devc( iv_package ) = zif_abapgit_dot_abapgit=>c_abap_language_version-undefined AND
+        get_abap_language_vers_by_repo( io_repo )    = zif_abapgit_dot_abapgit=>c_abap_language_version-standard.
+          rv_allowed = abap_true.
+        ELSE.
+          rv_allowed = abap_false.
+        ENDIF.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_convert.clas.abap.html b/src/utils/zcl_abapgit_convert.clas.abap.html new file mode 100644 index 00000000000..dea0f51f16d --- /dev/null +++ b/src/utils/zcl_abapgit_convert.clas.abap.html @@ -0,0 +1,1138 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_convert.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_convert.clas.abap

+
+ +
+ 98.86% + Statements + 347/351 +
+ + +
+ 78.57% + Branches + 11/14 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.86% + Lines + 347/351 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +3521x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1761x +1761x +508x +508x +1x +4484x +4484x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +62x +62x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_convert DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS bitbyte_to_int
+      IMPORTING
+        !iv_bits      TYPE clike
+      RETURNING
+        VALUE(rv_int) TYPE i .
+    CLASS-METHODS x_to_bitbyte
+      IMPORTING
+        !iv_x             TYPE x
+      RETURNING
+        VALUE(rv_bitbyte) TYPE zif_abapgit_git_definitions=>ty_bitbyte .
+    CLASS-METHODS string_to_xstring_utf8
+      IMPORTING
+        !iv_string        TYPE string
+      RETURNING
+        VALUE(rv_xstring) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS xstring_to_string_utf8
+      IMPORTING
+        !iv_data         TYPE xsequence
+        !iv_length       TYPE i OPTIONAL
+      RETURNING
+        VALUE(rv_string) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS string_to_xstring_utf8_bom
+      IMPORTING
+        !iv_string        TYPE string
+      RETURNING
+        VALUE(rv_xstring) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS xstring_to_int
+      IMPORTING
+        !iv_xstring TYPE xstring
+      RETURNING
+        VALUE(rv_i) TYPE i
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS int_to_xstring4
+      IMPORTING
+        !iv_i             TYPE i
+      RETURNING
+        VALUE(rv_xstring) TYPE xstring .
+    CLASS-METHODS split_string
+      IMPORTING
+        !iv_string      TYPE string
+      RETURNING
+        VALUE(rt_lines) TYPE string_table .
+    CLASS-METHODS conversion_exit_isola_output
+      IMPORTING
+        !iv_spras       TYPE spras
+      RETURNING
+        VALUE(rv_spras) TYPE laiso .
+    CLASS-METHODS string_to_xstring
+      IMPORTING
+        !iv_str        TYPE string
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS string_to_tab
+      IMPORTING
+        !iv_str  TYPE string
+      EXPORTING
+        !ev_size TYPE i
+        !et_tab  TYPE STANDARD TABLE .
+    CLASS-METHODS base64_to_xstring
+      IMPORTING
+        !iv_base64     TYPE string
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring .
+    CLASS-METHODS xstring_to_bintab
+      IMPORTING
+        !iv_xstr   TYPE xstring
+      EXPORTING
+        !ev_size   TYPE i
+        !et_bintab TYPE STANDARD TABLE .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA go_convert_out TYPE REF TO cl_abap_conv_out_ce .
+    CLASS-DATA go_convert_in TYPE REF TO cl_abap_conv_in_ce .
+ 
+    CLASS-METHODS xstring_remove_bom
+      IMPORTING
+        iv_xstr        TYPE xsequence
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_convert IMPLEMENTATION.
+ 
+ 
+  METHOD base64_to_xstring.
+ 
+    rv_xstr = cl_http_utility=>decode_x_base64( iv_base64 ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD bitbyte_to_int.
+ 
+    DATA: lv_bitbyte TYPE string,
+          lv_len     TYPE i,
+          lv_offset  TYPE i.
+ 
+    lv_bitbyte = iv_bits.
+    SHIFT lv_bitbyte LEFT DELETING LEADING '0 '.
+    lv_len     = strlen( lv_bitbyte ).
+    lv_offset  = lv_len - 1.
+ 
+    rv_int = 0.
+    DO lv_len TIMES.
+ 
+      IF sy-index = 1.
+        "Intialize
+        IF lv_bitbyte+lv_offset(1) = '1'.
+          rv_int = 1.
+        ENDIF.
+      ELSEIF lv_bitbyte+lv_offset(1) = '1'.
+        rv_int = rv_int + ( 2 ** ( sy-index - 1 ) ).
+      ENDIF.
+ 
+      lv_offset = lv_offset - 1. "Move Cursor
+ 
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD conversion_exit_isola_output.
+ 
+    cl_gdt_conversion=>language_code_outbound(
+      EXPORTING
+        im_value = iv_spras
+      IMPORTING
+        ex_value = rv_spras ).
+ 
+    TRANSLATE rv_spras TO UPPER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD int_to_xstring4.
+* returns xstring of length 4 containing the integer value iv_i
+ 
+    DATA lv_x TYPE x LENGTH 4.
+ 
+    lv_x = iv_i.
+    rv_xstring = lv_x.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_string.
+ 
+    FIND FIRST OCCURRENCE OF cl_abap_char_utilities=>cr_lf IN iv_string.
+ 
+    " Convert string into table depending on separator type CR_LF vs. LF
+    IF sy-subrc = 0.
+      SPLIT iv_string AT cl_abap_char_utilities=>cr_lf INTO TABLE rt_lines.
+    ELSE.
+      SPLIT iv_string AT cl_abap_char_utilities=>newline INTO TABLE rt_lines.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD string_to_tab.
+ 
+    DATA lv_length TYPE i.
+    DATA lv_iterations TYPE i.
+    DATA lv_offset TYPE i.
+ 
+    FIELD-SYMBOLS <lg_line> TYPE any.
+ 
+ 
+    CLEAR et_tab.
+    ev_size = strlen( iv_str ).
+ 
+    APPEND INITIAL LINE TO et_tab ASSIGNING <lg_line>.
+    <lg_line> = iv_str.
+    DESCRIBE FIELD <lg_line> LENGTH lv_length IN CHARACTER MODE.
+    lv_iterations = ev_size DIV lv_length.
+ 
+    DO lv_iterations TIMES.
+      lv_offset = sy-index * lv_length.
+      APPEND INITIAL LINE TO et_tab ASSIGNING <lg_line>.
+      <lg_line> = iv_str+lv_offset.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD string_to_xstring.
+ 
+    rv_xstr = string_to_xstring_utf8( iv_str ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD string_to_xstring_utf8.
+ 
+    DATA lx_error TYPE REF TO cx_root.
+ 
+    TRY.
+        IF go_convert_out IS INITIAL.
+          go_convert_out = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
+        ENDIF.
+ 
+        go_convert_out->convert(
+          EXPORTING
+            data   = iv_string
+          IMPORTING
+            buffer = rv_xstring ).
+ 
+      CATCH cx_parameter_invalid_range
+            cx_sy_codepage_converter_init
+            cx_sy_conversion_codepage
+            cx_parameter_invalid_type INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD string_to_xstring_utf8_bom.
+ 
+    IF iv_string IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    rv_xstring = string_to_xstring_utf8( iv_string ).
+ 
+    " Add UTF-8 BOM
+    IF xstrlen( rv_xstring ) < 3 OR rv_xstring(3) <> cl_abap_char_utilities=>byte_order_mark_utf8.
+      rv_xstring = cl_abap_char_utilities=>byte_order_mark_utf8 && rv_xstring.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD xstring_remove_bom.
+ 
+    rv_xstr = iv_xstr.
+ 
+    " cl_abap_conv_in_ce does not handle BOM in non-Unicode systems, so we remove it
+    IF cl_abap_char_utilities=>charsize = 1 AND xstrlen( rv_xstr ) > 3
+        AND rv_xstr(3) = cl_abap_char_utilities=>byte_order_mark_utf8.
+
+      rv_xstr = rv_xstr+3.
+
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD xstring_to_bintab.
+ 
+    DATA lv_length TYPE i.
+    DATA lv_iterations TYPE i.
+    DATA lv_offset TYPE i.
+ 
+    FIELD-SYMBOLS <lg_line> TYPE any.
+ 
+ 
+    CLEAR et_bintab.
+    ev_size = xstrlen( iv_xstr ).
+ 
+    APPEND INITIAL LINE TO et_bintab ASSIGNING <lg_line>.
+    <lg_line> = iv_xstr.
+    DESCRIBE FIELD <lg_line> LENGTH lv_length IN BYTE MODE.
+    lv_iterations = ev_size DIV lv_length.
+ 
+    DO lv_iterations TIMES.
+      lv_offset = sy-index * lv_length.
+      APPEND INITIAL LINE TO et_bintab ASSIGNING <lg_line>.
+      <lg_line> = iv_xstr+lv_offset.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD xstring_to_int.
+ 
+* use the built-in type conversion
+    rv_i = iv_xstring.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD xstring_to_string_utf8.
+ 
+    DATA lx_error  TYPE REF TO cx_root.
+    DATA lv_data TYPE xstring.
+    DATA lv_length TYPE i.
+ 
+    " Remove BOM for non-Unicode systems
+    lv_data = xstring_remove_bom( iv_data ).
+ 
+    lv_length = iv_length.
+    IF lv_length <= 0.
+      lv_length = xstrlen( lv_data ).
+    ENDIF.
+ 
+    TRY.
+        IF go_convert_in IS INITIAL.
+          go_convert_in = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' ).
+        ENDIF.
+ 
+        go_convert_in->convert(
+          EXPORTING
+            input = lv_data
+            n     = lv_length
+          IMPORTING
+            data  = rv_string ).
+ 
+      CATCH cx_parameter_invalid_range
+            cx_sy_codepage_converter_init
+            cx_sy_conversion_codepage
+            cx_parameter_invalid_type INTO lx_error.
+        zcx_abapgit_exception=>raise_with_text( lx_error ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD x_to_bitbyte.
+ 
+    CLEAR rv_bitbyte.
+ 
+    GET BIT 1 OF iv_x INTO rv_bitbyte+0(1).
+    GET BIT 2 OF iv_x INTO rv_bitbyte+1(1).
+    GET BIT 3 OF iv_x INTO rv_bitbyte+2(1).
+    GET BIT 4 OF iv_x INTO rv_bitbyte+3(1).
+    GET BIT 5 OF iv_x INTO rv_bitbyte+4(1).
+    GET BIT 6 OF iv_x INTO rv_bitbyte+5(1).
+    GET BIT 7 OF iv_x INTO rv_bitbyte+6(1).
+    GET BIT 8 OF iv_x INTO rv_bitbyte+7(1).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_convert.clas.testclasses.abap.html b/src/utils/zcl_abapgit_convert.clas.testclasses.abap.html new file mode 100644 index 00000000000..c8e2f256de0 --- /dev/null +++ b/src/utils/zcl_abapgit_convert.clas.testclasses.abap.html @@ -0,0 +1,892 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_convert.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_convert.clas.testclasses.abap

+
+ +
+ 100% + Statements + 269/269 +
+ + +
+ 100% + Branches + 12/12 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 100% + Lines + 269/269 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +2701x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
*----------------------------------------------------------------------*
+*       CLASS ltcl_convert DEFINITION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS ltcl_convert DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS convert_int FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS split_string FOR TESTING.
+    METHODS convert_bitbyte FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS string_to_xstring_utf8 FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS string_to_xstring_utf8_bom FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS xstring_to_string_utf8 FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS xstring_to_string_not_utf8 FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS base64_to_xstring FOR TESTING.
+    METHODS conversion_exit_isola_output FOR TESTING.
+    METHODS string_to_tab FOR TESTING.
+    METHODS string_to_xstring FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS xstring_to_bintab FOR TESTING.
+ 
+ENDCLASS.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_convert IMPLEMENTATION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS ltcl_convert IMPLEMENTATION.
+ 
+  METHOD xstring_to_bintab.
+ 
+    TYPES ty_hex TYPE x LENGTH 2.
+    DATA lt_bintab TYPE STANDARD TABLE OF ty_hex WITH DEFAULT KEY.
+    DATA lv_size TYPE i.
+ 
+    zcl_abapgit_convert=>xstring_to_bintab(
+      EXPORTING
+        iv_xstr   = '112233'
+      IMPORTING
+        ev_size   = lv_size
+        et_bintab = lt_bintab ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_size
+      exp = 3 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_bintab )
+      exp = 2 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD string_to_xstring.
+ 
+    DATA lv_xstr TYPE xstring.
+ 
+    lv_xstr = zcl_abapgit_convert=>string_to_xstring( 'hello world' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_xstr
+      exp = '68656C6C6F20776F726C64' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD string_to_tab.
+ 
+    TYPES ty_char TYPE c LENGTH 2.
+    DATA lv_size TYPE i.
+    DATA lt_tab TYPE STANDARD TABLE OF ty_char WITH DEFAULT KEY.
+ 
+    zcl_abapgit_convert=>string_to_tab(
+      EXPORTING
+        iv_str  = 'hello world'
+      IMPORTING
+        ev_size = lv_size
+        et_tab  = lt_tab ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_size
+      exp = 11 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( lt_tab )
+      exp = 6 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD conversion_exit_isola_output.
+ 
+    DATA lv_laiso TYPE laiso.
+ 
+    lv_laiso = zcl_abapgit_convert=>conversion_exit_isola_output( 'E' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_laiso
+      exp = 'EN' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD base64_to_xstring.
+ 
+    DATA lv_result TYPE xstring.
+ 
+    lv_result = zcl_abapgit_convert=>base64_to_xstring( 'YWJhcA==' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = '61626170' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD string_to_xstring_utf8.
+ 
+    DATA lv_result TYPE xstring.
+ 
+    lv_result = zcl_abapgit_convert=>string_to_xstring_utf8( `` ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = `` ).
+ 
+    lv_result = zcl_abapgit_convert=>string_to_xstring_utf8( 'abc' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = '616263' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD string_to_xstring_utf8_bom.
+ 
+    DATA lv_result TYPE xstring.
+ 
+    lv_result = zcl_abapgit_convert=>string_to_xstring_utf8_bom( `` ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = `` ).
+ 
+    lv_result = zcl_abapgit_convert=>string_to_xstring_utf8_bom( 'a' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = 'EFBBBF61' ).
+ 
+    lv_result = zcl_abapgit_convert=>string_to_xstring_utf8_bom( 'abcd' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = 'EFBBBF61626364' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD xstring_to_string_utf8.
+ 
+    DATA lv_result TYPE string.
+ 
+    lv_result = zcl_abapgit_convert=>xstring_to_string_utf8( `` ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = `` ).
+ 
+    lv_result = zcl_abapgit_convert=>xstring_to_string_utf8( '616263' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = 'abc' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD xstring_to_string_not_utf8.
+ 
+    DATA lv_result TYPE string.
+ 
+    " 0xF8-0xFF are not valid in UTF-8
+    TRY.
+        lv_result = zcl_abapgit_convert=>xstring_to_string_utf8( 'F8FF00' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception ##NO_HANDLER.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD convert_bitbyte.
+ 
+    DATA: lv_xstring  TYPE xstring,
+          lv_byte     TYPE x,
+          lv_input    TYPE i,
+          lv_bitbyte  TYPE zif_abapgit_git_definitions=>ty_bitbyte,
+          lv_byteint  TYPE i,
+          lv_xbyteint TYPE xstring,
+          lv_xresult  TYPE xstring,
+          lv_result   TYPE i,
+          lv_offset   TYPE i.
+ 
+    DO 1000 TIMES.
+ 
+      lv_result = 0.
+      CLEAR: lv_byteint, lv_xbyteint, lv_xresult.
+ 
+      lv_input  = sy-index * 64.
+      lv_xstring = zcl_abapgit_convert=>int_to_xstring4( lv_input ).
+      DO 4 TIMES.
+        lv_offset = sy-index - 1.
+        lv_byte = lv_xstring+lv_offset(1).
+        lv_bitbyte = zcl_abapgit_convert=>x_to_bitbyte( lv_byte ).
+        lv_byteint = zcl_abapgit_convert=>bitbyte_to_int( lv_bitbyte ).
+        lv_xbyteint = lv_byteint.
+        CONCATENATE lv_xresult lv_xbyteint INTO lv_xresult
+          IN BYTE MODE.
+      ENDDO.
+      lv_result = zcl_abapgit_convert=>xstring_to_int( lv_xresult ).
+ 
+      cl_abap_unit_assert=>assert_equals(
+          exp = lv_input
+          act = lv_result ).
+ 
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+  METHOD convert_int.
+ 
+    DATA: lv_xstring TYPE xstring,
+          lv_input   TYPE i,
+          lv_result  TYPE i.
+ 
+ 
+    DO 1000 TIMES.
+      lv_input = sy-index.
+      lv_xstring = zcl_abapgit_convert=>int_to_xstring4( lv_input ).
+      lv_result = zcl_abapgit_convert=>xstring_to_int( lv_xstring ).
+ 
+      cl_abap_unit_assert=>assert_equals(
+          exp = lv_input
+          act = lv_result ).
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+  METHOD split_string.
+ 
+    DATA: lt_act TYPE string_table,
+          lt_exp TYPE string_table.
+ 
+    APPEND 'ABC' TO lt_exp.
+    APPEND '123' TO lt_exp.
+ 
+    " Case 1: String separated by CRLF
+    lt_act = zcl_abapgit_convert=>split_string( 'ABC' && cl_abap_char_utilities=>cr_lf && '123' ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = lt_exp
+                                        act = lt_act
+                                        msg = 'Error during string split: CRLF' ).
+ 
+    CLEAR: lt_act.
+ 
+    " Case 2: String separated by LF
+    lt_act = zcl_abapgit_convert=>split_string( 'ABC' && cl_abap_char_utilities=>newline && '123' ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = lt_exp
+                                        act = lt_act
+                                        msg = 'Error during string split: LF' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_diff.clas.abap.html b/src/utils/zcl_abapgit_diff.clas.abap.html new file mode 100644 index 00000000000..7ad432b9042 --- /dev/null +++ b/src/utils/zcl_abapgit_diff.clas.abap.html @@ -0,0 +1,1705 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_diff.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_diff.clas.abap

+
+ +
+ 52.4% + Statements + 283/540 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 52.4% + Lines + 283/540 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +5411x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_diff DEFINITION
+  PUBLIC
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+    CONSTANTS co_starting_beacon TYPE i VALUE 1.
+ 
+* assumes data is UTF8 based with newlines
+    METHODS constructor
+      IMPORTING
+        !iv_new                TYPE xstring
+        !iv_old                TYPE xstring
+        !iv_ignore_indentation TYPE abap_bool DEFAULT abap_false
+        !iv_ignore_comments    TYPE abap_bool DEFAULT abap_false
+        !iv_ignore_case        TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get
+      RETURNING
+        VALUE(rt_diff) TYPE zif_abapgit_definitions=>ty_diffs_tt.
+    METHODS stats
+      RETURNING
+        VALUE(rs_count) TYPE zif_abapgit_definitions=>ty_count.
+    METHODS set_patch_new
+      IMPORTING
+        !iv_line_new   TYPE i
+        !iv_patch_flag TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_patch_old
+      IMPORTING
+        !iv_line_old   TYPE i
+        !iv_patch_flag TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS get_beacons
+      RETURNING
+        VALUE(rt_beacons) TYPE zif_abapgit_definitions=>ty_string_tt.
+    METHODS is_line_patched
+      IMPORTING
+        iv_index          TYPE i
+      RETURNING
+        VALUE(rv_patched) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception.
+    METHODS set_patch_by_old_diff
+      IMPORTING
+        is_diff_old   TYPE zif_abapgit_definitions=>ty_diff
+        iv_patch_flag TYPE abap_bool.
+ 
+  PROTECTED SECTION.
+ 
+  PRIVATE SECTION.
+ 
+    TYPES:
+      ty_regexset_tt TYPE STANDARD TABLE OF REF TO cl_abap_regex WITH KEY table_line.
+ 
+    DATA mt_beacons TYPE zif_abapgit_definitions=>ty_string_tt.
+    DATA mt_diff TYPE zif_abapgit_definitions=>ty_diffs_tt.
+    DATA ms_stats TYPE zif_abapgit_definitions=>ty_count.
+    DATA mv_compare_mode TYPE c LENGTH 1.
+    DATA mv_ignore_case TYPE abap_bool.
+ 
+    METHODS unpack
+      IMPORTING
+        !iv_new TYPE xstring
+        !iv_old TYPE xstring
+      EXPORTING
+        !et_new TYPE rswsourcet
+        !et_old TYPE rswsourcet
+      RAISING
+        zcx_abapgit_exception.
+    METHODS map_beacons.
+    METHODS shortlist.
+    METHODS create_regex_set
+      RETURNING
+        VALUE(rt_regex_set) TYPE ty_regexset_tt.
+    METHODS compute_and_render
+      IMPORTING
+        !it_new        TYPE rswsourcet
+        !it_old        TYPE rswsourcet
+      RETURNING
+        VALUE(rt_diff) TYPE zif_abapgit_definitions=>ty_diffs_tt.
+    METHODS calculate_stats.
+    METHODS adjust_diff.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_diff IMPLEMENTATION.
+ 
+ 
+  METHOD adjust_diff.
+
+    " ABAP kernel diff traverses files from bottom up which leads to odd display of diffs
+    " SAP won't adjust this kernel service so we will do it here
+    " https://github.com/abapGit/abapGit/issues/4395
+
+    TYPES:
+      BEGIN OF ty_diff_block,
+        start TYPE i,
+        len   TYPE i,
+      END OF ty_diff_block.
+
+    DATA:
+      lv_block_begin TYPE i,
+      lv_block_end   TYPE i,
+      ls_diff_block  TYPE ty_diff_block,
+      lt_diff_block  TYPE STANDARD TABLE OF ty_diff_block WITH DEFAULT KEY.
+
+    FIELD-SYMBOLS:
+      <ls_diff>       LIKE LINE OF mt_diff,
+      <ls_diff_begin> LIKE LINE OF mt_diff,
+      <ls_diff_end>   LIKE LINE OF mt_diff.
+
+    " Determine start and length of diff blocks
+    LOOP AT mt_diff ASSIGNING <ls_diff>.
+      IF <ls_diff>-result = zif_abapgit_definitions=>c_diff-insert OR
+         <ls_diff>-result = zif_abapgit_definitions=>c_diff-delete.
+        IF ls_diff_block IS INITIAL.
+          ls_diff_block-start = sy-tabix.
+        ENDIF.
+        ls_diff_block-len = ls_diff_block-len + 1.
+      ELSEIF ls_diff_block-start IS NOT INITIAL.
+        APPEND ls_diff_block TO lt_diff_block.
+        CLEAR ls_diff_block.
+      ENDIF.
+    ENDLOOP.
+
+    " For each diff block, check if beginning is same as end of block
+    " If yes, move diff block down
+    LOOP AT lt_diff_block INTO ls_diff_block.
+      DO ls_diff_block-len TIMES.
+        lv_block_begin = ls_diff_block-start + sy-index - 1.
+        READ TABLE mt_diff ASSIGNING <ls_diff_begin> INDEX lv_block_begin.
+        IF sy-subrc <> 0.
+          EXIT.
+        ENDIF.
+        lv_block_end = ls_diff_block-start + ls_diff_block-len + sy-index - 1.
+        READ TABLE mt_diff ASSIGNING <ls_diff_end> INDEX lv_block_end.
+        IF sy-subrc <> 0.
+          EXIT.
+        ENDIF.
+        CASE <ls_diff_begin>-result.
+          WHEN zif_abapgit_definitions=>c_diff-insert.
+            IF <ls_diff_begin>-new = <ls_diff_end>-new.
+              <ls_diff_begin>-old_num = <ls_diff_end>-old_num.
+              <ls_diff_begin>-old     = <ls_diff_end>-old.
+              <ls_diff_end>-result    = <ls_diff_begin>-result.
+              CLEAR: <ls_diff_begin>-result, <ls_diff_end>-old_num, <ls_diff_end>-old.
+            ELSE.
+              EXIT.
+            ENDIF.
+          WHEN zif_abapgit_definitions=>c_diff-delete.
+            IF <ls_diff_begin>-old = <ls_diff_end>-old.
+              <ls_diff_begin>-new_num = <ls_diff_end>-new_num.
+              <ls_diff_begin>-new     = <ls_diff_end>-new.
+              <ls_diff_end>-result    = <ls_diff_begin>-result.
+              CLEAR: <ls_diff_begin>-result, <ls_diff_end>-new_num, <ls_diff_end>-new.
+            ELSE.
+              EXIT.
+            ENDIF.
+          WHEN OTHERS.
+            EXIT.
+        ENDCASE.
+      ENDDO.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD calculate_stats.
+
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
+
+    LOOP AT mt_diff ASSIGNING <ls_diff>.
+      CASE <ls_diff>-result.
+        WHEN zif_abapgit_definitions=>c_diff-insert.
+          ms_stats-insert = ms_stats-insert + 1.
+        WHEN zif_abapgit_definitions=>c_diff-delete.
+          ms_stats-delete = ms_stats-delete + 1.
+        WHEN zif_abapgit_definitions=>c_diff-update.
+          ms_stats-update = ms_stats-update + 1.
+      ENDCASE.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD compute_and_render.
+ 
+    DATA:
+      lv_i     TYPE i,
+      ls_diff  LIKE LINE OF rt_diff,
+      lt_delta TYPE STANDARD TABLE OF rsedcresul WITH DEFAULT KEY.
+ 
+    FIELD-SYMBOLS:
+      <ls_old>   LIKE LINE OF it_old,
+      <ls_new>   LIKE LINE OF it_new,
+      <ls_delta> LIKE LINE OF lt_delta.
+ 
+    " Note: Ignore case is for keywords, variables, types etc, but not for literals
+    CALL FUNCTION 'RS_CMP_COMPUTE_DELTA'
+      EXPORTING
+        compare_mode            = mv_compare_mode
+        ignore_case_differences = mv_ignore_case
+      TABLES
+        text_tab1               = it_new
+        text_tab2               = it_old
+        text_tab_res            = lt_delta
+      EXCEPTIONS
+        parameter_invalid       = 1
+        difference_not_found    = 2
+        OTHERS                  = 3.
+ 
+    IF sy-subrc = 0.
+      " Process delta
+      LOOP AT lt_delta ASSIGNING <ls_delta>.
+        CLEAR ls_diff.
+        IF <ls_delta>-line1 > 0.
+          lv_i = <ls_delta>-line1.
+          ls_diff-old_num = lv_i.
+          ls_diff-old     = <ls_delta>-text1.
+        ENDIF.
+        IF <ls_delta>-line2 > 0.
+          lv_i = <ls_delta>-line2.
+          ls_diff-new_num = lv_i.
+          ls_diff-new     = <ls_delta>-text2.
+        ENDIF.
+        IF <ls_delta>-flag1 = 'D'.
+          ls_diff-result = zif_abapgit_definitions=>c_diff-delete.
+        ELSEIF <ls_delta>-flag2 = 'I'.
+          ls_diff-result = zif_abapgit_definitions=>c_diff-insert.
+        ELSEIF <ls_delta>-flag1 = 'M' AND <ls_delta>-flag2 = 'M'.
+          ls_diff-result = zif_abapgit_definitions=>c_diff-update.
+        ELSEIF <ls_delta>-flag1 = '' AND <ls_delta>-flag2 = ''.
+          ls_diff-result = zif_abapgit_definitions=>c_diff-unchanged.
+        ELSEIF <ls_delta>-flag1 = '' AND <ls_delta>-flag2 = 'E'. " ignore comment
+          ls_diff-result = zif_abapgit_definitions=>c_diff-unchanged.
+        ELSEIF <ls_delta>-flag1 = 'E' AND <ls_delta>-flag2 = ''. " ignore comment
+          ls_diff-result = zif_abapgit_definitions=>c_diff-unchanged.
+        ELSE.
+          ASSERT 0 = 1. " unknown comparison result
+        ENDIF.
+        APPEND ls_diff TO rt_diff.
+      ENDLOOP.
+    ELSEIF sy-subrc = 2.
+      " Copy input... but it might not be identical
+      LOOP AT it_old ASSIGNING <ls_old>.
+        CLEAR ls_diff.
+        ls_diff-old_num = sy-tabix.
+        ls_diff-old     = <ls_old>.
+        READ TABLE it_new ASSIGNING <ls_new> INDEX sy-tabix.
+        ASSERT sy-subrc = 0.
+        ls_diff-new_num = sy-tabix.
+        ls_diff-new     = <ls_new>.
+        " SAP function ignores lines that contain only whitespace so we compare directly
+        IF ( mv_compare_mode = 1 OR mv_compare_mode = 3 ) AND <ls_old> <> <ls_new> AND
+           ( strlen( condense( <ls_old> ) ) = 0 OR strlen( condense( <ls_new> ) ) = 0 ).
+          ls_diff-result = zif_abapgit_definitions=>c_diff-update.
+        ENDIF.
+        APPEND ls_diff TO rt_diff.
+      ENDLOOP.
+    ELSE.
+      ASSERT 0 = 1. " incorrect function call
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lt_new TYPE rswsourcet,
+          lt_old TYPE rswsourcet.
+ 
+    mv_compare_mode = 1.
+    IF iv_ignore_indentation = abap_true.
+      mv_compare_mode = mv_compare_mode + 1.
+    ENDIF.
+    IF iv_ignore_comments = abap_true.
+      mv_compare_mode = mv_compare_mode + 2.
+    ENDIF.
+    mv_ignore_case = iv_ignore_case.
+ 
+    unpack( EXPORTING iv_new = iv_new
+                      iv_old = iv_old
+            IMPORTING et_new = lt_new
+                      et_old = lt_old ).
+ 
+    mt_diff = compute_and_render( it_new = lt_new
+                                  it_old = lt_old ).
+ 
+    adjust_diff( ).
+ 
+    calculate_stats( ).
+    map_beacons( ).
+    shortlist( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create_regex_set.
+ 
+    DATA: lo_regex TYPE REF TO cl_abap_regex,
+          lt_regex TYPE zif_abapgit_definitions=>ty_string_tt,
+          lv_regex LIKE LINE OF lt_regex.
+ 
+    APPEND '^\s*(CLASS|FORM|MODULE|REPORT|METHOD|INTERFACE|FUNCTION)\s[^=]' TO lt_regex.
+    APPEND '^\s*(PUBLIC|PROTECTED|PRIVATE)\sSECTION(\s|\.)' TO lt_regex.
+    APPEND '^\s*(CLASS|INTERFACE|FUNCTION|TYPE)-POOL\s' TO lt_regex.
+    APPEND '^\s*(START|END)-OF-SELECTION(\s|\.)' TO lt_regex.
+    APPEND '^\s*INITIALIZATION(\s|\.)' TO lt_regex.
+    APPEND '^\s*(TOP-OF-PAGE|END-OF-PAGE)(\s|\.)' TO lt_regex.
+    APPEND '^\s*AT\s*(SELECTION-SCREEN|LINE-SELECTION|USER-COMMAND|PF\d+)(\s|\.)' TO lt_regex.
+    APPEND '^\s*(DEFINE|ENHANCEMENT)\s' TO lt_regex.
+ 
+    LOOP AT lt_regex INTO lv_regex.
+      CREATE OBJECT lo_regex
+        EXPORTING
+          pattern     = lv_regex
+          ignore_case = abap_true.
+      APPEND lo_regex TO rt_regex_set.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get.
+    rt_diff = mt_diff.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_beacons.
+    rt_beacons = mt_beacons.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_line_patched.
+ 
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+ 
+    READ TABLE mt_diff INDEX iv_index
+                       ASSIGNING <ls_diff>.
+    IF sy-subrc = 0.
+      rv_patched = <ls_diff>-patch_flag.
+    ELSE.
+      zcx_abapgit_exception=>raise( |Diff line not found { iv_index }| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD map_beacons.
+
+    DATA: lv_beacon_idx  TYPE i VALUE co_starting_beacon,
+          lv_offs        TYPE i,
+          lv_beacon_str  TYPE string,
+          lv_beacon_2lev TYPE string,
+          lv_submatch    TYPE string,
+          lo_regex       TYPE REF TO cl_abap_regex,
+          lt_regex       TYPE ty_regexset_tt.
+
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
+
+    lt_regex = create_regex_set( ).
+    LOOP AT mt_diff ASSIGNING <ls_diff>.
+
+      CLEAR lv_offs.
+      <ls_diff>-beacon = lv_beacon_idx.
+
+      LOOP AT lt_regex INTO lo_regex.
+        FIND FIRST OCCURRENCE OF REGEX lo_regex IN <ls_diff>-new SUBMATCHES lv_submatch.
+        IF sy-subrc = 0. " Match
+          lv_beacon_str = <ls_diff>-new.
+          lv_submatch = to_upper( lv_submatch ).
+
+          " Get rid of comments and end of line
+          FIND FIRST OCCURRENCE OF '.' IN lv_beacon_str MATCH OFFSET lv_offs.
+          IF sy-subrc <> 0.
+            FIND FIRST OCCURRENCE OF '"' IN lv_beacon_str MATCH OFFSET lv_offs.
+          ENDIF.
+
+          IF lv_offs > 0.
+            lv_beacon_str = lv_beacon_str(lv_offs).
+          ENDIF.
+          lv_beacon_str = condense( val = lv_beacon_str
+                                    del = ` ` ).
+
+          IF lv_submatch = 'CLASS'.
+            lv_beacon_2lev = replace( val   = lv_beacon_str
+                                      regex = '\s+(DEFINITION|IMPLEMENTATION)'
+                                      with  = ''
+                                      occ   = 0 ).
+          ELSEIF lv_submatch = 'METHOD'.
+            lv_beacon_str = lv_beacon_2lev && ` => ` && lv_beacon_str.
+          ELSEIF lv_submatch = 'PUBLIC' OR lv_submatch = 'PROTECTED' OR lv_submatch = 'PRIVATE'.
+            lv_beacon_str = lv_beacon_2lev && ` ` && lv_beacon_str.
+          ENDIF.
+
+          APPEND lv_beacon_str TO mt_beacons.
+          lv_beacon_idx    = sy-tabix.
+          <ls_diff>-beacon = lv_beacon_idx.
+          EXIT. "Loop
+        ENDIF.
+      ENDLOOP.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_patch_by_old_diff.
+
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+
+    LOOP AT mt_diff ASSIGNING <ls_diff>
+                    USING KEY new_num
+                    WHERE old     = is_diff_old-old
+                    AND   new     = is_diff_old-new
+                    AND   new_num = is_diff_old-new_num
+                    AND   old_num = is_diff_old-old_num.
+
+      <ls_diff>-patch_flag = iv_patch_flag.
+      EXIT.
+
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_patch_new.
+
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+
+    READ TABLE mt_diff WITH TABLE KEY new_num
+                       COMPONENTS new_num = iv_line_new
+                       ASSIGNING <ls_diff>.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Invalid new line number { iv_line_new }| ).
+    ENDIF.
+
+    <ls_diff>-patch_flag = iv_patch_flag.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_patch_old.
+
+    FIELD-SYMBOLS: <ls_diff> TYPE zif_abapgit_definitions=>ty_diff.
+
+    READ TABLE mt_diff WITH TABLE KEY old_num
+                       COMPONENTS old_num = iv_line_old
+                       ASSIGNING <ls_diff>.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Invalid old line number { iv_line_old }| ).
+    ENDIF.
+
+    <ls_diff>-patch_flag = iv_patch_flag.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD shortlist.
+
+    DATA: lv_index TYPE i.
+
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF mt_diff.
+
+    IF lines( mt_diff ) < 20.
+      LOOP AT mt_diff ASSIGNING <ls_diff>.
+        <ls_diff>-short = abap_true.
+      ENDLOOP.
+    ELSE.
+      LOOP AT mt_diff TRANSPORTING NO FIELDS
+          WHERE NOT result IS INITIAL AND short = abap_false.
+        lv_index = sy-tabix.
+
+        DO 8 TIMES. " Backward
+          READ TABLE mt_diff INDEX ( lv_index - sy-index ) ASSIGNING <ls_diff>.
+          IF sy-subrc <> 0 OR <ls_diff>-short = abap_true. " tab bound or prev marker
+            EXIT.
+          ENDIF.
+          <ls_diff>-short = abap_true.
+        ENDDO.
+
+        DO 8 TIMES. " Forward
+          READ TABLE mt_diff INDEX ( lv_index + sy-index - 1 ) ASSIGNING <ls_diff>.
+          IF sy-subrc <> 0. " tab bound reached
+            EXIT.
+          ENDIF.
+          CHECK <ls_diff>-short = abap_false. " skip marked
+          <ls_diff>-short = abap_true.
+        ENDDO.
+
+      ENDLOOP.
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD stats.
+    rs_count = ms_stats.
+  ENDMETHOD.
+ 
+ 
+  METHOD unpack.
+
+    DATA: lv_new      TYPE string,
+          lv_old      TYPE string,
+          lv_new_last TYPE c LENGTH 1,
+          lv_old_last TYPE c LENGTH 1.
+
+    lv_new = zcl_abapgit_convert=>xstring_to_string_utf8( iv_new ).
+    lv_old = zcl_abapgit_convert=>xstring_to_string_utf8( iv_old ).
+
+    " Check if one value contains a final newline but the other not
+    " If yes, add a special characters that's visible in diff render
+    IF lv_new IS NOT INITIAL.
+      lv_new_last = substring(
+        val = lv_new
+        off = strlen( lv_new ) - 1 ).
+    ENDIF.
+    IF lv_old IS NOT INITIAL.
+      lv_old_last = substring(
+        val = lv_old
+        off = strlen( lv_old ) - 1 ).
+    ENDIF.
+
+    IF lv_new_last = cl_abap_char_utilities=>newline AND lv_old_last <> cl_abap_char_utilities=>newline
+      AND lv_old IS NOT INITIAL.
+      lv_old = lv_old && cl_abap_char_utilities=>form_feed.
+    ELSEIF lv_new_last <> cl_abap_char_utilities=>newline AND lv_old_last = cl_abap_char_utilities=>newline
+      AND lv_new IS NOT INITIAL.
+      lv_new = lv_new && cl_abap_char_utilities=>form_feed.
+    ENDIF.
+
+    SPLIT lv_new AT cl_abap_char_utilities=>newline INTO TABLE et_new.
+    SPLIT lv_old AT cl_abap_char_utilities=>newline INTO TABLE et_old.
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_diff.clas.testclasses.abap.html b/src/utils/zcl_abapgit_diff.clas.testclasses.abap.html new file mode 100644 index 00000000000..9e8dbdb2185 --- /dev/null +++ b/src/utils/zcl_abapgit_diff.clas.testclasses.abap.html @@ -0,0 +1,2020 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_diff.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_diff.clas.testclasses.abap

+
+ +
+ 16.27% + Statements + 105/645 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/23 +
+ + +
+ 16.27% + Lines + 105/645 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +6461x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS ltcl_diff DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA: mt_new      TYPE TABLE OF string,
+          mt_old      TYPE TABLE OF string,
+          mt_beacons  TYPE zif_abapgit_definitions=>ty_string_tt,
+          mt_expected TYPE zif_abapgit_definitions=>ty_diffs_tt.
+ 
+    METHODS:
+      add_new IMPORTING iv_new TYPE string,
+      add_old IMPORTING iv_old TYPE string,
+      add_beacon   IMPORTING iv_beacon TYPE string,
+      add_expected IMPORTING iv_new_num TYPE zif_abapgit_definitions=>ty_diff-new_num
+                             iv_new     TYPE zif_abapgit_definitions=>ty_diff-new
+                             iv_result  TYPE zif_abapgit_definitions=>ty_diff-result
+                             iv_old_num TYPE zif_abapgit_definitions=>ty_diff-old_num
+                             iv_old     TYPE zif_abapgit_definitions=>ty_diff-old
+                             iv_beacon  TYPE zif_abapgit_definitions=>ty_diff-beacon
+                               DEFAULT zcl_abapgit_diff=>co_starting_beacon.
+ 
+    METHODS: setup.
+ 
+    METHODS: test
+      IMPORTING
+        !iv_ignore_indentation TYPE abap_bool DEFAULT abap_false
+        !iv_ignore_comments    TYPE abap_bool DEFAULT abap_false
+        !iv_ignore_case        TYPE abap_bool DEFAULT abap_false
+        !iv_check_beacons      TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS:
+      diff01 FOR TESTING RAISING zcx_abapgit_exception,
+      diff02 FOR TESTING RAISING zcx_abapgit_exception,
+      diff03 FOR TESTING RAISING zcx_abapgit_exception,
+      diff04 FOR TESTING RAISING zcx_abapgit_exception,
+      diff05 FOR TESTING RAISING zcx_abapgit_exception,
+      diff06 FOR TESTING RAISING zcx_abapgit_exception,
+      diff07 FOR TESTING RAISING zcx_abapgit_exception,
+      diff08 FOR TESTING RAISING zcx_abapgit_exception,
+      diff09 FOR TESTING RAISING zcx_abapgit_exception,
+      diff10 FOR TESTING RAISING zcx_abapgit_exception,
+      diff11 FOR TESTING RAISING zcx_abapgit_exception,
+      diff12 FOR TESTING RAISING zcx_abapgit_exception,
+      diff13 FOR TESTING RAISING zcx_abapgit_exception,
+      diff14 FOR TESTING RAISING zcx_abapgit_exception,
+      diff15 FOR TESTING RAISING zcx_abapgit_exception,
+      diff16 FOR TESTING RAISING zcx_abapgit_exception,
+      map_beacons FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_diff IMPLEMENTATION.
+ 
+  METHOD add_new.
+    APPEND iv_new TO mt_new.
+  ENDMETHOD.
+ 
+  METHOD add_old.
+    APPEND iv_old TO mt_old.
+  ENDMETHOD.
+ 
+  METHOD add_beacon.
+    APPEND iv_beacon TO mt_beacons.
+  ENDMETHOD.
+ 
+  METHOD add_expected.
+    DATA ls_expected LIKE LINE OF mt_expected.
+
+    ls_expected-new_num = iv_new_num.
+    ls_expected-new     = iv_new.
+    ls_expected-result  = iv_result.
+    ls_expected-old_num = iv_old_num.
+    ls_expected-old     = iv_old.
+    ls_expected-beacon  = iv_beacon.
+    APPEND ls_expected TO mt_expected.
+  ENDMETHOD.
+ 
+  METHOD setup.
+    CLEAR mt_new.
+    CLEAR mt_old.
+    CLEAR mt_beacons.
+    CLEAR mt_expected.
+  ENDMETHOD.
+ 
+  METHOD test.
+
+    DATA: lv_new  TYPE string,
+          lv_xnew TYPE xstring,
+          lv_old  TYPE string,
+          lv_xold TYPE xstring,
+          lo_diff TYPE REF TO zcl_abapgit_diff,
+          lt_diff TYPE zif_abapgit_definitions=>ty_diffs_tt.
+
+    FIELD-SYMBOLS: <ls_diff> LIKE LINE OF lt_diff.
+
+
+    CONCATENATE LINES OF mt_new INTO lv_new SEPARATED BY cl_abap_char_utilities=>newline.
+    CONCATENATE LINES OF mt_old INTO lv_old SEPARATED BY cl_abap_char_utilities=>newline.
+
+    lv_xnew = zcl_abapgit_convert=>string_to_xstring_utf8( lv_new ).
+    lv_xold = zcl_abapgit_convert=>string_to_xstring_utf8( lv_old ).
+
+    CREATE OBJECT lo_diff
+      EXPORTING
+        iv_new                = lv_xnew
+        iv_old                = lv_xold
+        iv_ignore_indentation = iv_ignore_indentation
+        iv_ignore_comments    = iv_ignore_comments
+        iv_ignore_case        = iv_ignore_case.
+
+    IF iv_check_beacons = abap_true.
+      cl_abap_unit_assert=>assert_equals(
+        act = lo_diff->get_beacons( )
+        exp = mt_beacons ).
+      RETURN.
+    ENDIF.
+
+    lt_diff = lo_diff->get( ).
+
+    LOOP AT lt_diff ASSIGNING <ls_diff>.
+      CLEAR <ls_diff>-short.
+    ENDLOOP.
+
+    cl_abap_unit_assert=>assert_equals( act = lt_diff
+                                        exp = mt_expected ).
+
+  ENDMETHOD.
+ 
+  METHOD diff01.
+
+    "insert
+    add_new( 'A' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A'
+                  iv_result  = zif_abapgit_definitions=>c_diff-insert
+                  iv_old_num = ''
+                  iv_old     = '' ).
+    test( ).
+
+  ENDMETHOD.
+ 
+  METHOD diff02.
+
+    " identical
+    add_new( 'A' ).
+    add_old( 'A' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    test( ).
+
+  ENDMETHOD.
+ 
+  METHOD diff03.
+
+    " delete
+    add_old( 'A' ).
+
+    add_expected( iv_new_num = ''
+                  iv_new     = ''
+                  iv_result  = zif_abapgit_definitions=>c_diff-delete
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    test( ).
+
+  ENDMETHOD.
+ 
+  METHOD diff04.
+
+    " update
+    add_new( 'A+' ).
+
+    add_old( 'A' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A+'
+                  iv_result  = zif_abapgit_definitions=>c_diff-update
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    test( ).
+
+  ENDMETHOD.
+ 
+  METHOD diff05.
+
+    " identical
+    add_new( 'A' ).
+    add_new( 'B' ).
+
+    add_old( 'A' ).
+    add_old( 'B' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    add_expected( iv_new_num = '    2'
+                  iv_new     = 'B'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    2'
+                  iv_old     = 'B' ).
+    test( ).
+
+  ENDMETHOD.
+ 
+  METHOD diff06.
+
+    " mixed
+    add_new( 'A' ).
+    add_new( 'B' ).
+    add_new( 'inserted' ).
+    add_new( 'C' ).
+    add_new( 'D update' ).
+
+    add_old( 'A' ).
+    add_old( 'B' ).
+    add_old( 'C' ).
+    add_old( 'D' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    add_expected( iv_new_num = '    2'
+                  iv_new     = 'B'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    2'
+                  iv_old     = 'B' ).
+    add_expected( iv_new_num = '    3'
+                  iv_new     = 'inserted'
+                  iv_result  = zif_abapgit_definitions=>c_diff-insert
+                  iv_old_num = ''
+                  iv_old     = '' ).
+    add_expected( iv_new_num = '    4'
+                  iv_new     = 'C'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    3'
+                  iv_old     = 'C' ).
+    add_expected( iv_new_num = '    5'
+                  iv_new     = 'D update'
+                  iv_result  = zif_abapgit_definitions=>c_diff-update
+                  iv_old_num = '    4'
+                  iv_old     = 'D' ).
+
+    test( ).
+
+  ENDMETHOD.
+ 
+  METHOD diff07.
+
+    " ignore indentation
+    add_new( 'A' ).
+    add_new( ' B' ). " changed indent
+    add_new( 'C' ).
+    add_new( '    D' ). " changed indent
+
+    add_old( 'A' ).
+    add_old( 'B' ).
+    add_old( 'C' ).
+    add_old( 'D' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    add_expected( iv_new_num = '    2'
+                  iv_new     = ' B'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    2'
+                  iv_old     = 'B' ).
+    add_expected( iv_new_num = '    3'
+                  iv_new     = 'C'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    3'
+                  iv_old     = 'C' ).
+    add_expected( iv_new_num = '    4'
+                  iv_new     = '    D'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    4'
+                  iv_old     = 'D' ).
+
+    test( iv_ignore_indentation = abap_true ).
+
+  ENDMETHOD.
+ 
+  METHOD diff08.
+
+    " ignore comments
+    add_new( 'A' ).
+    add_new( '* X' ). " changed comment
+    add_new( 'C' ).
+    add_new( 'D " new' ). " changed comment
+
+    add_old( 'A' ).
+    add_old( '* B' ).
+    add_old( 'C' ).
+    add_old( 'D " old' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    add_expected( iv_new_num = '    2'
+                  iv_new     = '* X'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    2'
+                  iv_old     = '* B' ).
+    add_expected( iv_new_num = '    3'
+                  iv_new     = 'C'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    3'
+                  iv_old     = 'C' ).
+    add_expected( iv_new_num = '    4'
+                  iv_new     = 'D " new'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    4'
+                  iv_old     = 'D " old' ).
+
+    test( iv_ignore_comments = abap_true ).
+
+  ENDMETHOD.
+ 
+  METHOD diff09.
+
+    " ignore case
+    add_new( 'A' ).
+    add_new( 'b' ). " changed case
+    add_new( 'c' ).
+    add_new( 'D' ). " changed case
+
+    add_old( 'A' ).
+    add_old( 'B' ).
+    add_old( 'c' ).
+    add_old( 'd' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    add_expected( iv_new_num = '    2'
+                  iv_new     = 'b'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    2'
+                  iv_old     = 'B' ).
+    add_expected( iv_new_num = '    3'
+                  iv_new     = 'c'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    3'
+                  iv_old     = 'c' ).
+    add_expected( iv_new_num = '    4'
+                  iv_new     = 'D'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    4'
+                  iv_old     = 'd' ).
+
+    test( iv_ignore_case = abap_true ).
+
+  ENDMETHOD.
+ 
+  METHOD diff10.
+
+    " ignore case should NOT ignore changed literals
+    add_new( `WRITE 'TEST'` ).
+
+    add_old( `WRITE 'test'` ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = `WRITE 'TEST'`
+                  iv_result  = zif_abapgit_definitions=>c_diff-update
+                  iv_old_num = '    1'
+                  iv_old     = `WRITE 'test'` ).
+
+    test( iv_ignore_case = abap_true ).
+
+  ENDMETHOD.
+ 
+  METHOD diff11.
+
+    " ignore case should ignore changed keywords, variables, types
+    add_new( `write 'test'` ).
+    add_new( `DATA FOO TYPE I.` ).
+
+    add_old( `WRITE 'test'` ).
+    add_old( `DATA foo TYPE i.` ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = `write 'test'`
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = `WRITE 'test'` ).
+    add_expected( iv_new_num = '    2'
+                  iv_new     = `DATA FOO TYPE I.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    2'
+                  iv_old     = `DATA foo TYPE i.` ).
+
+    test( iv_ignore_case = abap_true ).
+
+  ENDMETHOD.
+ 
+  METHOD diff12.
+
+    " adjusted diffs for insert (workaround for kernel issue)
+    add_new( `REPORT zprog_diff.` ).
+    add_new( `*` ).
+    add_new( `FORM t_1.` ).
+    add_new( `ENDFORM.` ).
+    add_new( `FORM t_2.` ).
+    add_new( `ENDFORM.` ).
+
+    add_old( `REPORT zprog_diff.` ).
+    add_old( `FORM t_1.` ).
+    add_old( `ENDFORM.` ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = `REPORT zprog_diff.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = `REPORT zprog_diff.`
+                  iv_beacon  = 1 ).
+    add_expected( iv_new_num = '    2'
+                  iv_new     = `*`
+                  iv_result  = zif_abapgit_definitions=>c_diff-insert
+                  iv_old_num = '     '
+                  iv_old     = ``
+                  iv_beacon  = 1 ).
+    add_expected( iv_new_num = '    3'
+                  iv_new     = `FORM t_1.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    2'
+                  iv_old     = `FORM t_1.`
+                  iv_beacon  = 2 ).
+    add_expected( iv_new_num = '    4'
+                  iv_new     = `ENDFORM.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    3'
+                  iv_old     = `ENDFORM.`
+                  iv_beacon  = 2 ).
+    add_expected( iv_new_num = '    5'
+                  iv_new     = `FORM t_2.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-insert
+                  iv_old_num = '     '
+                  iv_old     = ``
+                  iv_beacon  = 3 ).
+    add_expected( iv_new_num = '    6'
+                  iv_new     = `ENDFORM.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-insert
+                  iv_old_num = '     '
+                  iv_old     = ``
+                  iv_beacon  = 3 ).
+
+    test( ).
+
+  ENDMETHOD.
+ 
+  METHOD diff13.
+
+    " adjusted diffs for delete (workaround for kernel issue)
+    add_old( `REPORT zprog_diff.` ).
+    add_old( `*` ).
+    add_old( `FORM t_1.` ).
+    add_old( `ENDFORM.` ).
+    add_old( `FORM t_2.` ).
+    add_old( `ENDFORM.` ).
+
+    add_new( `REPORT zprog_diff.` ).
+    add_new( `FORM t_1.` ).
+    add_new( `ENDFORM.` ).
+
+    add_expected( iv_old_num = '    1'
+                  iv_old     = `REPORT zprog_diff.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_new_num = '    1'
+                  iv_new     = `REPORT zprog_diff.`
+                  iv_beacon  = 1 ).
+    add_expected( iv_old_num = '    2'
+                  iv_old     = `*`
+                  iv_result  = zif_abapgit_definitions=>c_diff-delete
+                  iv_new_num = '     '
+                  iv_new     = ``
+                  iv_beacon  = 1 ).
+    add_expected( iv_old_num = '    3'
+                  iv_old     = `FORM t_1.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_new_num = '    2'
+                  iv_new     = `FORM t_1.`
+                  iv_beacon  = 2 ).
+    add_expected( iv_old_num = '    4'
+                  iv_old     = `ENDFORM.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_new_num = '    3'
+                  iv_new     = `ENDFORM.`
+                  iv_beacon  = 2 ).
+    add_expected( iv_old_num = '    5'
+                  iv_old     = `FORM t_2.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-delete
+                  iv_new_num = '     '
+                  iv_new     = ``
+                  iv_beacon  = 2 ).
+    add_expected( iv_old_num = '    6'
+                  iv_old     = `ENDFORM.`
+                  iv_result  = zif_abapgit_definitions=>c_diff-delete
+                  iv_new_num = '     '
+                  iv_new     = ``
+                  iv_beacon  = 2 ).
+
+    test( ).
+
+  ENDMETHOD.
+ 
+  METHOD diff14.
+
+    " lines with different whitespace
+    add_new( 'A' ).
+    add_new( `` ). " empty line
+    add_new( ` ` ). " one space
+    add_new( `   ` ). " some spaces
+    add_new( 'E' ).
+
+    add_old( 'A' ).
+    add_old( `     ` ). " some spaces
+    add_old( `  ` ). " two spaces
+    add_old( `` ). " empty line
+    add_old( 'E' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = 'A'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = 'A' ).
+    add_expected( iv_new_num = '    2'
+                  iv_new     = ''
+                  iv_result  = zif_abapgit_definitions=>c_diff-update
+                  iv_old_num = '    2'
+                  iv_old     = `     ` ).
+    add_expected( iv_new_num = '    3'
+                  iv_new     = ` `
+                  iv_result  = zif_abapgit_definitions=>c_diff-update
+                  iv_old_num = '    3'
+                  iv_old     = `  ` ).
+    add_expected( iv_new_num = '    4'
+                  iv_new     = `   `
+                  iv_result  = zif_abapgit_definitions=>c_diff-update
+                  iv_old_num = '    4'
+                  iv_old     = '' ).
+    add_expected( iv_new_num = '    5'
+                  iv_new     = 'E'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    5'
+                  iv_old     = 'E' ).
+
+    test( ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD diff15.
+
+    " ignore comments - edge case new comment
+    add_new( `*/` ).
+
+    add_old( '' ).
+
+    add_expected( iv_new_num = '    1'
+                  iv_new     = '*/'
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '     '
+                  iv_old     = '' ).
+
+    test( iv_ignore_comments = abap_true ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD diff16.
+
+    " ignore comments - edge case deleted comment
+    add_new( `` ).
+
+    add_old( `* " problem` ).
+
+    add_expected( iv_new_num = '     '
+                  iv_new     = ''
+                  iv_result  = zif_abapgit_definitions=>c_diff-unchanged
+                  iv_old_num = '    1'
+                  iv_old     = `* " problem` ).
+
+    test( iv_ignore_comments = abap_true ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD map_beacons.
+
+    add_new( `REPORT ztest_beacon.` ).
+    add_new( `` ).
+    add_new( `DATA report TYPE string.` ).
+    add_new( `report = 'TEST'.` ).
+    add_new( `` ).
+    add_new( `CLASS lcl_test DEFINITION.` ).
+    add_new( `  PUBLIC SECTION.` ).
+    add_new( `    CLASS-METHODS test.` ).
+    add_new( `ENDCLASS.` ).
+    add_new( `` ).
+    add_new( `CLASS lcl_test IMPLEMENTATION.` ).
+    add_new( `  METHOD test.` ).
+    add_new( `    DATA method TYPE i.` ).
+    add_new( `    method = 10.` ).
+    add_new( `  ENDMETHOD.` ).
+    add_new( `ENDCLASS.` ).
+    add_new( `` ).
+    add_new( `TYPE-POOLS abap.` ).
+    add_new( `` ).
+    add_new( `START-OF-SELECTION.` ).
+    add_new( `  CALL METHOD lcl_test=>test.` ).
+    add_new( `` ).
+    add_new( `AT SELECTION-SCREEN.` ).
+    add_new( `  BREAK-POINT.` ).
+
+    add_old( '' ).
+
+    add_beacon( `REPORT ztest_beacon` ).
+    add_beacon( `CLASS lcl_test DEFINITION` ).
+    add_beacon( `CLASS lcl_test PUBLIC SECTION` ).
+    add_beacon( `CLASS lcl_test IMPLEMENTATION` ).
+    add_beacon( `CLASS lcl_test => METHOD test` ).
+    add_beacon( `START-OF-SELECTION` ).
+    add_beacon( `AT SELECTION-SCREEN` ).
+
+    test( iv_check_beacons = abap_true ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_environment.clas.abap.html b/src/utils/zcl_abapgit_environment.clas.abap.html new file mode 100644 index 00000000000..6116592c412 --- /dev/null +++ b/src/utils/zcl_abapgit_environment.clas.abap.html @@ -0,0 +1,733 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_environment.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_environment.clas.abap

+
+ +
+ 100% + Statements + 216/216 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 216/216 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +2171x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_environment DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_factory .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_environment .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mv_cloud TYPE abap_bool VALUE abap_undefined ##NO_TEXT.
+    DATA mv_is_merged TYPE abap_bool VALUE abap_undefined ##NO_TEXT.
+    DATA mv_modifiable TYPE abap_bool VALUE abap_undefined ##NO_TEXT.
+ 
+    METHODS is_system_changes_allowed
+      RETURNING
+        VALUE(rv_result) TYPE abap_bool .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_environment IMPLEMENTATION.
+ 
+ 
+  METHOD is_system_changes_allowed.
+ 
+    DATA:
+      lv_systemedit         TYPE tadir-edtflag,
+      lv_sys_cliinddep_edit TYPE t000-ccnocliind,
+      lv_is_shadow          TYPE abap_bool,
+      ls_upginfo            TYPE uvers,
+      lv_is_upgrade         TYPE abap_bool.
+ 
+    CALL FUNCTION 'TR_SYS_PARAMS'
+      IMPORTING
+        systemedit         = lv_systemedit
+        sys_cliinddep_edit = lv_sys_cliinddep_edit
+      EXCEPTIONS
+        no_systemname      = 1
+        no_systemtype      = 2
+        OTHERS             = 3.
+    IF sy-subrc <> 0.
+      " Assume system can't be changed
+      RETURN.
+    ENDIF.
+ 
+    CALL FUNCTION 'UPG_IS_SHADOW_SYSTEM'
+      IMPORTING
+        ev_shadow = lv_is_shadow.
+ 
+    CALL FUNCTION 'UPG_GET_ACTIVE_COMP_UPGRADE'
+      EXPORTING
+        iv_component = 'SAP_BASIS'
+        iv_upgtype   = 'A'
+        iv_buffered  = abap_false
+      IMPORTING
+        ev_upginfo   = ls_upginfo
+      EXCEPTIONS
+        OTHERS       = 4.
+    IF sy-subrc = 0 AND ls_upginfo-putstatus NA 'ITU'.
+      lv_is_upgrade = abap_true.
+    ENDIF.
+ 
+    " SAP system has status 'not modifiable' (TK 102)
+    " Changes to repository objects are not permitted in this client (TK 729)
+    " Shadow system
+    " Running upgrade
+    rv_result = boolc(
+      lv_systemedit <> 'N' AND
+      lv_sys_cliinddep_edit NA '23' AND
+      lv_is_shadow <> abap_true AND
+      lv_is_upgrade <> abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~compare_with_inactive.
+    rv_result = zif_abapgit_environment~is_sap_cloud_platform( ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~get_basis_release.
+ 
+    SELECT SINGLE release extrelease FROM cvers INTO (rs_result-release, rs_result-sp)
+      WHERE component = 'SAP_BASIS' ##SUBRC_OK.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_merged.
+    DATA lr_marker TYPE REF TO data ##NEEDED.
+ 
+    IF mv_is_merged = abap_undefined.
+      TRY.
+          CREATE DATA lr_marker TYPE REF TO ('LIF_ABAPMERGE_MARKER').
+          "No exception --> marker found
+          mv_is_merged = abap_true.
+ 
+        CATCH cx_sy_create_data_error.
+          mv_is_merged = abap_false.
+      ENDTRY.
+    ENDIF.
+    rv_result = mv_is_merged.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_repo_object_changes_allowed.
+    IF mv_modifiable = abap_undefined.
+      mv_modifiable = is_system_changes_allowed( ).
+    ENDIF.
+    rv_result = mv_modifiable.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_restart_required.
+    " This method will be used in the context of SAP Cloud Platform:
+    " Pull/Push operations are executed in background jobs.
+    " In case of the respective application server needs to be restarted,
+    " it is required to terminate the background job and reschedule again.
+    rv_result = abap_false.
+    TRY.
+        CALL METHOD ('CL_APJ_SCP_TOOLS')=>('IS_RESTART_REQUIRED')
+          RECEIVING
+            restart_required = rv_result.
+      CATCH cx_sy_dyn_call_illegal_method cx_sy_dyn_call_illegal_class.
+        rv_result = abap_false.
+    ENDTRY.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_sap_cloud_platform.
+    IF mv_cloud = abap_undefined.
+      TRY.
+          CALL METHOD ('CL_COS_UTILITIES')=>('IS_SAP_CLOUD_PLATFORM')
+            RECEIVING
+              rv_is_sap_cloud_platform = mv_cloud.
+        CATCH cx_sy_dyn_call_error.
+          mv_cloud = abap_false.
+      ENDTRY.
+    ENDIF.
+    rv_result = mv_cloud.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_environment~is_sap_object_allowed.
+ 
+    rv_allowed = cl_enh_badi_def_utility=>is_sap_system( ).
+    IF rv_allowed = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    rv_allowed = zcl_abapgit_exit=>get_instance( )->allow_sap_objects( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_environment~get_system_language_filter.
+    DATA lv_translation_detective_lang TYPE spras.
+    DATA lv_pseudo_translation_language TYPE spras.
+    FIELD-SYMBOLS <ls_system_language_filter> LIKE LINE OF rt_system_language_filter.
+ 
+    " Translation Object Detective
+    " https://help.sap.com/docs/ABAP_PLATFORM_NEW/ceb25152cb0d4adba664cebea2bf4670/88a3d3cbccf64601975acabaccdfde45.html
+    CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
+      EXPORTING
+        input            = '1Q'
+      IMPORTING
+        output           = lv_translation_detective_lang
+      EXCEPTIONS
+        unknown_language = 1
+        OTHERS           = 2.
+    IF sy-subrc = 1.
+      " The language for Translation Object Detective was not setup
+    ENDIF.
+    IF NOT lv_translation_detective_lang IS INITIAL.
+      APPEND INITIAL LINE TO rt_system_language_filter ASSIGNING <ls_system_language_filter>.
+      <ls_system_language_filter>-sign = 'E'.
+      <ls_system_language_filter>-option = 'EQ'.
+      <ls_system_language_filter>-low = lv_translation_detective_lang.
+    ENDIF.
+    " 1943470 - Using technical language key 2Q to create pseudo-translations of ABAP developments
+    " https://launchpad.support.sap.com/#/notes/1943470
+    CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
+      EXPORTING
+        input            = '2Q'
+      IMPORTING
+        output           = lv_pseudo_translation_language
+      EXCEPTIONS
+        unknown_language = 1
+        OTHERS           = 2.
+    IF sy-subrc = 1.
+      " The language for Pseudo Translation was not setup
+    ENDIF.
+    IF NOT lv_pseudo_translation_language IS INITIAL.
+      APPEND INITIAL LINE TO rt_system_language_filter ASSIGNING <ls_system_language_filter>.
+      <ls_system_language_filter>-sign = 'E'.
+      <ls_system_language_filter>-option = 'EQ'.
+      <ls_system_language_filter>-low = lv_pseudo_translation_language.
+    ENDIF.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_environment~is_variant_maintenance.
+ 
+    DATA:
+      lt_variscreens TYPE STANDARD TABLE OF rsdynnr
+                          WITH NON-UNIQUE DEFAULT KEY.
+ 
+    " Memory is set in LSVARF08 / EXPORT_SCREEN_TABLES.
+    IMPORT variscreens = lt_variscreens FROM MEMORY ID '%_SCRNR_%'.
+ 
+    rv_is_variant_maintenance = boolc( lines( lt_variscreens ) > 0 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_environment.clas.testclasses.abap.html b/src/utils/zcl_abapgit_environment.clas.testclasses.abap.html new file mode 100644 index 00000000000..562ae58450e --- /dev/null +++ b/src/utils/zcl_abapgit_environment.clas.testclasses.abap.html @@ -0,0 +1,283 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_environment.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_environment.clas.testclasses.abap

+
+ +
+ 92.42% + Statements + 61/66 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 92.42% + Lines + 61/66 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +671x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test DEFINITION DEFERRED.
+CLASS zcl_abapgit_environment DEFINITION LOCAL FRIENDS ltcl_test.
+ 
+CLASS ltcl_test DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mi_cut TYPE REF TO zif_abapgit_environment.
+ 
+    METHODS:
+      setup,
+      is_sap_cloud_platform FOR TESTING,
+      is_merged FOR TESTING,
+      is_repo_object_changes_allowed FOR TESTING,
+      compare_with_inactive FOR TESTING,
+      is_restart_required FOR TESTING.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD setup.
+ 
+    CREATE OBJECT mi_cut TYPE zcl_abapgit_environment.
+ 
+  ENDMETHOD.
+ 
+  METHOD is_sap_cloud_platform.
+ 
+    mi_cut->is_sap_cloud_platform( ).
+* no assertions, just make sure the dynamic code runs
+ 
+  ENDMETHOD.
+ 
+  METHOD is_merged.
+ 
+    mi_cut->is_merged( ).
+* no assertions, just make sure the dynamic code runs
+ 
+  ENDMETHOD.
+ 
+  METHOD is_repo_object_changes_allowed.
+
+    mi_cut->is_repo_object_changes_allowed( ).
+* no assertions, just make sure the dynamic code runs
+
+  ENDMETHOD.
+ 
+  METHOD compare_with_inactive.
+ 
+    mi_cut->compare_with_inactive( ).
+* no assertions, just make sure the dynamic code runs
+ 
+  ENDMETHOD.
+ 
+  METHOD is_restart_required.
+ 
+    mi_cut->is_restart_required( ).
+* no assertions, just make sure the dynamic code runs
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_item_state.clas.abap.html b/src/utils/zcl_abapgit_item_state.clas.abap.html new file mode 100644 index 00000000000..e2db0528440 --- /dev/null +++ b/src/utils/zcl_abapgit_item_state.clas.abap.html @@ -0,0 +1,400 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_item_state.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_item_state.clas.abap

+
+ +
+ 100% + Statements + 105/105 +
+ + +
+ 100% + Branches + 9/9 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 105/105 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +1061x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +1x + 
CLASS zcl_abapgit_item_state DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    METHODS local
+      RETURNING
+        VALUE(rv_state) TYPE zif_abapgit_git_definitions=>ty_item_state.
+    METHODS remote
+      RETURNING
+        VALUE(rv_state) TYPE zif_abapgit_git_definitions=>ty_item_state.
+    METHODS is_reassigned
+      RETURNING
+        VALUE(rv_is_reassigned) TYPE abap_bool.
+    METHODS is_unchanged
+      RETURNING
+        VALUE(rv_is_unchanged) TYPE abap_bool.
+    METHODS sum_with_repo_item
+      IMPORTING
+        !is_repo_item TYPE zif_abapgit_definitions=>ty_repo_item.
+    METHODS sum_with_status_item
+      IMPORTING
+        !is_status_item TYPE zif_abapgit_definitions=>ty_result.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mv_lstate TYPE zif_abapgit_git_definitions=>ty_item_state.
+    DATA mv_rstate TYPE zif_abapgit_git_definitions=>ty_item_state.
+    DATA mv_is_reassigned TYPE abap_bool.
+ 
+    CLASS-METHODS reduce
+      IMPORTING
+        iv_prev       TYPE zif_abapgit_git_definitions=>ty_item_state
+        iv_cur        TYPE zif_abapgit_git_definitions=>ty_item_state
+      RETURNING
+        VALUE(rv_new) TYPE zif_abapgit_git_definitions=>ty_item_state.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ITEM_STATE IMPLEMENTATION.
+ 
+ 
+  METHOD is_reassigned.
+    rv_is_reassigned = mv_is_reassigned.
+  ENDMETHOD.
+ 
+ 
+  METHOD is_unchanged.
+    rv_is_unchanged = boolc( mv_is_reassigned = abap_false
+      AND mv_lstate = zif_abapgit_definitions=>c_state-unchanged
+      AND mv_rstate = zif_abapgit_definitions=>c_state-unchanged ).
+  ENDMETHOD.
+ 
+ 
+  METHOD local.
+    rv_state = mv_lstate.
+  ENDMETHOD.
+ 
+ 
+  METHOD reduce.
+ 
+    rv_new = iv_prev.
+    IF rv_new = iv_cur OR iv_cur IS INITIAL.
+      RETURN. " No change
+    ELSEIF rv_new IS INITIAL.
+      rv_new = iv_cur.
+    ELSE.
+      rv_new = zif_abapgit_definitions=>c_state-mixed.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD remote.
+    rv_state = mv_rstate.
+  ENDMETHOD.
+ 
+ 
+  METHOD sum_with_repo_item.
+ 
+    mv_lstate = reduce(
+      iv_prev = mv_lstate
+      iv_cur  = is_repo_item-lstate ).
+    mv_rstate = reduce(
+      iv_prev = mv_rstate
+      iv_cur  = is_repo_item-rstate ).
+    mv_is_reassigned = boolc( mv_is_reassigned = abap_true OR is_repo_item-packmove = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD sum_with_status_item.
+ 
+    mv_lstate = reduce(
+      iv_prev = mv_lstate
+      iv_cur  = is_status_item-lstate ).
+    mv_rstate = reduce(
+      iv_prev = mv_rstate
+      iv_cur  = is_status_item-rstate ).
+    mv_is_reassigned = boolc( mv_is_reassigned = abap_true OR is_status_item-packmove = abap_true ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_item_state.clas.testclasses.abap.html b/src/utils/zcl_abapgit_item_state.clas.testclasses.abap.html new file mode 100644 index 00000000000..ffba46b8608 --- /dev/null +++ b/src/utils/zcl_abapgit_item_state.clas.testclasses.abap.html @@ -0,0 +1,775 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_item_state.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_item_state.clas.testclasses.abap

+
+ +
+ 100% + Statements + 230/230 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 230/230 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +2311x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_state_test DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+  PRIVATE SECTION.
+    METHODS test_sum_with_status FOR TESTING.
+    METHODS test_sum_with_ritem FOR TESTING.
+ENDCLASS.
+ 
+CLASS ltcl_state_test IMPLEMENTATION.
+  METHOD test_sum_with_status.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_result.
+    DATA lo_cut TYPE REF TO zcl_abapgit_item_state.
+ 
+    CREATE OBJECT lo_cut.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-unchanged ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-unchanged ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_true ).
+ 
+    ls_item-lstate = zif_abapgit_definitions=>c_state-added.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-deleted.
+    lo_cut->sum_with_status_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-deleted ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+    " Similar state
+    ls_item-lstate = zif_abapgit_definitions=>c_state-added.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-deleted.
+    lo_cut->sum_with_status_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-deleted ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+    ls_item-lstate = zif_abapgit_definitions=>c_state-unchanged.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-added.
+    lo_cut->sum_with_status_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ). " Unchanged does not update state
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-mixed ). " Mixed
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+    ls_item-lstate = zif_abapgit_definitions=>c_state-unchanged.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-added.
+    ls_item-packmove = abap_true.
+    lo_cut->sum_with_status_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-mixed ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_true ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+    ls_item-lstate = zif_abapgit_definitions=>c_state-unchanged.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-added.
+    ls_item-packmove = abap_false.
+    lo_cut->sum_with_status_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-mixed ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_true ). " does not reset
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+  METHOD test_sum_with_ritem.
+ 
+    DATA ls_item TYPE zif_abapgit_definitions=>ty_repo_item.
+    DATA lo_cut TYPE REF TO zcl_abapgit_item_state.
+ 
+    CREATE OBJECT lo_cut.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-unchanged ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-unchanged ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_true ).
+ 
+    ls_item-lstate = zif_abapgit_definitions=>c_state-added.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-deleted.
+    lo_cut->sum_with_repo_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-deleted ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+    " Similar state
+    ls_item-lstate = zif_abapgit_definitions=>c_state-added.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-deleted.
+    lo_cut->sum_with_repo_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-deleted ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+    ls_item-lstate = zif_abapgit_definitions=>c_state-unchanged.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-added.
+    lo_cut->sum_with_repo_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ). " Unchanged does not update state
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-mixed ). " Mixed
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+    ls_item-lstate = zif_abapgit_definitions=>c_state-unchanged.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-added.
+    ls_item-packmove = abap_true.
+    lo_cut->sum_with_repo_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-mixed ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_true ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+    ls_item-lstate = zif_abapgit_definitions=>c_state-unchanged.
+    ls_item-rstate = zif_abapgit_definitions=>c_state-added.
+    ls_item-packmove = abap_false.
+    lo_cut->sum_with_repo_item( ls_item ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->local( )
+      exp = zif_abapgit_definitions=>c_state-added ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->remote( )
+      exp = zif_abapgit_definitions=>c_state-mixed ).
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_reassigned( )
+      exp = abap_true ). " does not reset
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_unchanged( )
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_language.clas.abap.html b/src/utils/zcl_abapgit_language.clas.abap.html new file mode 100644 index 00000000000..8073dc8a491 --- /dev/null +++ b/src/utils/zcl_abapgit_language.clas.abap.html @@ -0,0 +1,235 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_language.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_language.clas.abap

+
+ +
+ 100% + Statements + 50/50 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 50/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +511x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
*----------------------------------------------------------------------*
+* This helper class is used to set and restore the current language.
+* As some of the SAP functions used rely on SY-LANGU containing the
+* main language, this class is used to temporarily change and then
+* restore the value of SY-LANGU.
+*----------------------------------------------------------------------*
+CLASS zcl_abapgit_language DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS class_constructor .
+    CLASS-METHODS restore_login_language .
+    CLASS-METHODS set_current_language
+      IMPORTING
+        !iv_language TYPE sy-langu .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-DATA gv_login_language TYPE sy-langu .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_language IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+ 
+    DATA lv_dummy TYPE string.
+ 
+    GET LOCALE LANGUAGE gv_login_language COUNTRY lv_dummy MODIFIER lv_dummy.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD restore_login_language.
+ 
+    SET LOCALE LANGUAGE gv_login_language.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_current_language.
+ 
+    SET LOCALE LANGUAGE iv_language.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_log.clas.abap.html b/src/utils/zcl_abapgit_log.clas.abap.html new file mode 100644 index 00000000000..2ef965701ea --- /dev/null +++ b/src/utils/zcl_abapgit_log.clas.abap.html @@ -0,0 +1,1054 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_log.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_log.clas.abap

+
+ +
+ 97.21% + Statements + 314/323 +
+ + +
+ 92.3% + Branches + 12/13 +
+ + +
+ 85.71% + Functions + 6/7 +
+ + +
+ 97.21% + Lines + 314/323 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +3241x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +26x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +3x +3x +3x +3x +3x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x +14x +14x +14x +14x +14x +14x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +7x +7x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_log DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_log .
+ 
+    METHODS constructor
+      IMPORTING
+        iv_title TYPE string OPTIONAL.
+ 
+    CLASS-METHODS from_exception
+      IMPORTING
+        io_x TYPE REF TO cx_root
+      RETURNING
+        VALUE(ro_log) TYPE REF TO zcl_abapgit_log.
+ 
+  PROTECTED SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_log, "in order of occurrence
+        msg       TYPE zif_abapgit_log=>ty_msg,
+        item      TYPE zif_abapgit_definitions=>ty_item,
+        exception TYPE REF TO cx_root,
+      END OF ty_log .
+ 
+    DATA:
+      mt_log TYPE STANDARD TABLE OF ty_log WITH DEFAULT KEY .
+    DATA mv_title TYPE string .
+ 
+    METHODS get_messages_status
+      IMPORTING
+        !it_msg          TYPE zif_abapgit_log=>ty_msgs
+      RETURNING
+        VALUE(rv_status) TYPE sy-msgty .
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_log IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    zif_abapgit_log~set_title( iv_title ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD from_exception.
+ 
+    CREATE OBJECT ro_log.
+ 
+    IF io_x IS BOUND.
+      ro_log->zif_abapgit_log~add_exception( io_x ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_messages_status.
+ 
+    DATA lr_msg TYPE REF TO zif_abapgit_log=>ty_msg.
+    rv_status = 'S'.
+    LOOP AT it_msg REFERENCE INTO lr_msg.
+      CASE lr_msg->type.
+        WHEN 'E' OR 'A' OR 'X'.
+          rv_status = 'E'. "not okay
+          EXIT.
+        WHEN 'W'.
+          rv_status = 'W'. "maybe
+          CONTINUE.
+        WHEN 'S' OR 'I'.
+          IF rv_status <> 'W'.
+            rv_status = 'S'. "okay
+          ENDIF.
+          CONTINUE.
+        WHEN OTHERS. "unknown
+          CONTINUE.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add.
+ 
+    FIELD-SYMBOLS: <ls_log> LIKE LINE OF mt_log.
+ 
+    APPEND INITIAL LINE TO mt_log ASSIGNING <ls_log>.
+    <ls_log>-msg-text  = iv_msg.
+    <ls_log>-msg-type  = iv_type.
+    <ls_log>-item      = is_item.
+    <ls_log>-exception = ix_exc.
+ 
+    CASE iv_type.
+      WHEN 'E' OR 'A' OR 'X'.
+        <ls_log>-msg-level = zif_abapgit_log=>c_log_level-error.
+      WHEN 'W'.
+        <ls_log>-msg-level = zif_abapgit_log=>c_log_level-warning.
+      WHEN 'S' OR 'I'.
+        <ls_log>-msg-level = zif_abapgit_log=>c_log_level-info.
+      WHEN OTHERS. "unknown
+        ASSERT 0 = 1.
+    ENDCASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_error.
+ 
+    zif_abapgit_log~add(
+      iv_msg  = iv_msg
+      iv_type = 'E'
+      is_item = is_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_exception.
+ 
+    DATA lx_exc TYPE REF TO cx_root.
+    DATA lv_msg TYPE string.
+    lx_exc = ix_exc.
+    DO.
+      lv_msg = lx_exc->get_text( ).
+      zif_abapgit_log~add( iv_msg  = lv_msg
+                           iv_type = 'E'
+                           is_item = is_item
+                           ix_exc  = lx_exc ).
+      IF lx_exc->previous IS BOUND.
+        lx_exc = lx_exc->previous.
+      ELSE.
+        EXIT.
+      ENDIF.
+    ENDDO.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_info.
+
+    zif_abapgit_log~add(
+      iv_msg  = iv_msg
+      iv_type = 'I'
+      is_item = is_item ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_success.
+ 
+    zif_abapgit_log~add(
+      iv_msg  = iv_msg
+      iv_type = 'S'
+      is_item = is_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~add_warning.
+ 
+    zif_abapgit_log~add(
+      iv_msg  = iv_msg
+      iv_type = 'W'
+      is_item = is_item ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~clear.
+    CLEAR mt_log.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~clone.
+ 
+    DATA lo_log TYPE REF TO zcl_abapgit_log.
+ 
+    CREATE OBJECT lo_log EXPORTING iv_title = mv_title.
+    lo_log->mt_log = mt_log.
+    ri_log = lo_log.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~count.
+    rv_count = lines( mt_log ).
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_item_status.
+ 
+    DATA lr_log         TYPE REF TO ty_log.
+    DATA ls_msg         TYPE zif_abapgit_log=>ty_msg.
+    DATA ls_item_status TYPE zif_abapgit_log=>ty_item_status_out.
+    DATA lr_item_status TYPE REF TO zif_abapgit_log=>ty_item_status_out.
+ 
+    "collect all message for all objects
+    LOOP AT mt_log REFERENCE INTO lr_log.
+      CLEAR ls_item_status.
+      ls_item_status-item = lr_log->item.
+      READ TABLE rt_item_status REFERENCE INTO lr_item_status
+           WITH KEY item-obj_type = ls_item_status-item-obj_type
+                    item-obj_name = ls_item_status-item-obj_name.
+      IF sy-subrc <> 0.
+        INSERT ls_item_status INTO TABLE rt_item_status.
+        GET REFERENCE OF ls_item_status INTO lr_item_status.
+      ENDIF.
+      CLEAR ls_msg.
+      ls_msg-type = lr_log->msg-type.
+      ls_msg-text = lr_log->msg-text.
+      INSERT ls_msg INTO TABLE lr_item_status->messages.
+    ENDLOOP.
+ 
+    "determine object status from object messages
+    LOOP AT rt_item_status REFERENCE INTO lr_item_status.
+      lr_item_status->status = get_messages_status( lr_item_status->messages ).
+      IF lr_item_status->messages IS INITIAL.
+        CLEAR ls_msg.
+        ls_msg-type = 'I'.
+        ls_msg-text = 'No message'.
+        INSERT ls_msg INTO TABLE lr_item_status->messages.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_log_level.
+ 
+    FIELD-SYMBOLS <ls_log> LIKE LINE OF mt_log.
+ 
+    rv_level = zif_abapgit_log=>c_log_level-empty.
+ 
+    LOOP AT mt_log ASSIGNING <ls_log>.
+      IF <ls_log>-msg-level = zif_abapgit_log=>c_log_level-error.
+        rv_level = zif_abapgit_log=>c_log_level-error.
+        EXIT.
+      ELSEIF <ls_log>-msg-level > rv_level.
+        rv_level = <ls_log>-msg-level.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_messages.
+    DATA ls_msg TYPE zif_abapgit_log~ty_log_out.
+    FIELD-SYMBOLS <ls_log> TYPE ty_log.
+    LOOP AT mt_log ASSIGNING <ls_log>.
+      ls_msg-type      = <ls_log>-msg-type.
+      ls_msg-text      = <ls_log>-msg-text.
+      ls_msg-obj_type  = <ls_log>-item-obj_type.
+      ls_msg-obj_name  = <ls_log>-item-obj_name.
+      ls_msg-exception = <ls_log>-exception.
+      APPEND ls_msg TO rt_msg.
+    ENDLOOP.
+    DELETE ADJACENT DUPLICATES FROM rt_msg.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_status.
+ 
+    DATA lr_log TYPE REF TO ty_log.
+    rv_status = zif_abapgit_log=>c_status-ok.
+    LOOP AT mt_log REFERENCE INTO lr_log.
+      CASE lr_log->msg-type.
+        WHEN 'E' OR 'A' OR 'X'.
+          rv_status = zif_abapgit_log=>c_status-error.
+          EXIT.
+        WHEN 'W'.
+          rv_status = zif_abapgit_log=>c_status-warning.
+          CONTINUE.
+        WHEN 'S' OR 'I'.
+          IF rv_status <> zif_abapgit_log=>c_status-warning.
+            rv_status = zif_abapgit_log=>c_status-ok.
+          ENDIF.
+          CONTINUE.
+        WHEN OTHERS. "unknown
+          ASSERT 0 = 1.
+      ENDCASE.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~get_title.
+    rv_title = mv_title.
+    IF rv_title IS INITIAL.
+      rv_title = 'Log'.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~merge_with.
+ 
+    DATA lo_log TYPE REF TO zcl_abapgit_log.
+    DATA lt_log_temp LIKE lo_log->mt_log.
+ 
+    IF ii_log IS BOUND.
+      lo_log ?= ii_log.
+      IF iv_min_level > 0.
+        lt_log_temp = lo_log->mt_log.
+        DELETE lt_log_temp WHERE msg-level < iv_min_level.
+        APPEND LINES OF lt_log_temp TO mt_log.
+      ELSE.
+        APPEND LINES OF lo_log->mt_log TO mt_log.
+      ENDIF.
+    ENDIF.
+ 
+    ri_log = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_log~set_title.
+    mv_title = iv_title.
+    ri_log = me.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_log.clas.testclasses.abap.html b/src/utils/zcl_abapgit_log.clas.testclasses.abap.html new file mode 100644 index 00000000000..89013a1b7bd --- /dev/null +++ b/src/utils/zcl_abapgit_log.clas.testclasses.abap.html @@ -0,0 +1,856 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_log.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_log.clas.testclasses.abap

+
+ +
+ 100% + Statements + 257/257 +
+ + +
+ 100% + Branches + 16/16 +
+ + +
+ 100% + Functions + 16/16 +
+ + +
+ 100% + Lines + 257/257 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +2581x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +8x +8x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
 
+CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mi_cut TYPE REF TO zif_abapgit_log.
+ 
+    METHODS:
+      setup,
+      from_x FOR TESTING,
+      get_status FOR TESTING,
+      get_log_level FOR TESTING,
+      merge_with FOR TESTING,
+      merge_with_min_level FOR TESTING,
+      empty FOR TESTING,
+      clone FOR TESTING,
+      add FOR TESTING.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mi_cut TYPE zcl_abapgit_log.
+  ENDMETHOD.
+ 
+  METHOD empty.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->count( )
+      exp = 0 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_title( )
+      exp = 'Log' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD add.
+ 
+    DATA lv_message TYPE string.
+    DATA lt_messages TYPE zif_abapgit_log=>ty_log_outs.
+    DATA ls_message LIKE LINE OF lt_messages.
+ 
+    lv_message = 'hello'.
+ 
+    mi_cut->add( lv_message ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->count( )
+      exp = 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_status( )
+      exp = 'E' ).
+ 
+    lt_messages = mi_cut->get_messages( ).
+    READ TABLE lt_messages INDEX 1 INTO ls_message.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_message-text
+      exp = lv_message ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_status.
+ 
+    DATA lo_x TYPE REF TO zcx_abapgit_exception.
+ 
+    mi_cut->add_success( 'success' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_status( )
+      exp = zif_abapgit_log=>c_status-ok ).
+ 
+    mi_cut->add_warning( 'warn' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_status( )
+      exp = zif_abapgit_log=>c_status-warning ).
+ 
+    mi_cut->add_error( 'err' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_status( )
+      exp = zif_abapgit_log=>c_status-error ).
+ 
+    mi_cut->clear( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_status( )
+      exp = zif_abapgit_log=>c_status-ok ).
+ 
+    CREATE OBJECT lo_x EXPORTING msgv1 = 'x'.
+    mi_cut->add_exception( lo_x ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_status( )
+      exp = zif_abapgit_log=>c_status-error ).
+ 
+  ENDMETHOD.
+ 
+  METHOD merge_with.
+ 
+    DATA li_secondary_log LIKE mi_cut.
+    DATA lt_act_msgs TYPE zif_abapgit_log=>ty_log_outs.
+ 
+    CREATE OBJECT li_secondary_log TYPE zcl_abapgit_log.
+ 
+    mi_cut->add_success( 'success' ).
+    li_secondary_log->add_warning( 'warn' ).
+    mi_cut->merge_with( li_secondary_log ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->count( )
+      exp = 2 ).
+ 
+    lt_act_msgs = mi_cut->get_messages( ).
+ 
+    READ TABLE lt_act_msgs TRANSPORTING NO FIELDS WITH KEY text = 'success'.
+    cl_abap_unit_assert=>assert_subrc( ).
+    READ TABLE lt_act_msgs TRANSPORTING NO FIELDS WITH KEY text = 'warn'.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD merge_with_min_level.
+ 
+    DATA li_secondary_log LIKE mi_cut.
+    DATA lt_act_msgs TYPE zif_abapgit_log=>ty_log_outs.
+ 
+    CREATE OBJECT li_secondary_log TYPE zcl_abapgit_log.
+ 
+    mi_cut->add_success( 'success' ).
+    li_secondary_log->add_warning( 'warn' ).
+    mi_cut->merge_with(
+      ii_log = li_secondary_log
+      iv_min_level = zif_abapgit_log=>c_log_level-error ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->count( )
+      exp = 1 ).
+ 
+    lt_act_msgs = mi_cut->get_messages( ).
+ 
+    READ TABLE lt_act_msgs TRANSPORTING NO FIELDS WITH KEY text = 'success'.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+    " change level to warning
+    mi_cut->merge_with(
+      ii_log = li_secondary_log
+      iv_min_level = zif_abapgit_log=>c_log_level-warning ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->count( )
+      exp = 2 ).
+ 
+    lt_act_msgs = mi_cut->get_messages( ).
+ 
+    READ TABLE lt_act_msgs TRANSPORTING NO FIELDS WITH KEY text = 'success'.
+    cl_abap_unit_assert=>assert_subrc( ).
+    READ TABLE lt_act_msgs TRANSPORTING NO FIELDS WITH KEY text = 'warn'.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD from_x.
+ 
+    DATA lo_x TYPE REF TO zcx_abapgit_exception.
+    DATA lt_act_msgs TYPE zif_abapgit_log=>ty_log_outs.
+ 
+    " Uninitialized
+    mi_cut = zcl_abapgit_log=>from_exception( lo_x ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->count( )
+      exp = 0 ).
+ 
+    " Notmal exception
+    TRY.
+        zcx_abapgit_exception=>raise( 'Error!' ).
+      CATCH zcx_abapgit_exception INTO lo_x.
+        mi_cut = zcl_abapgit_log=>from_exception( lo_x ).
+    ENDTRY.
+ 
+    cl_abap_unit_assert=>assert_bound( mi_cut ).
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->count( )
+      exp = 1 ).
+ 
+    lt_act_msgs = mi_cut->get_messages( ).
+ 
+    READ TABLE lt_act_msgs TRANSPORTING NO FIELDS WITH KEY type = 'E'.
+    cl_abap_unit_assert=>assert_subrc( ).
+    READ TABLE lt_act_msgs TRANSPORTING NO FIELDS WITH KEY text = 'Error!'.
+    cl_abap_unit_assert=>assert_subrc( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_log_level.
+ 
+    DATA lo_x TYPE REF TO zcx_abapgit_exception.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_log_level( )
+      exp = zif_abapgit_log=>c_log_level-empty ).
+ 
+    mi_cut->add_success( 'success' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_log_level( )
+      exp = zif_abapgit_log=>c_log_level-info ).
+ 
+    mi_cut->add_warning( 'warn' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_log_level( )
+      exp = zif_abapgit_log=>c_log_level-warning ).
+ 
+    mi_cut->add_error( 'err' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_log_level( )
+      exp = zif_abapgit_log=>c_log_level-error ).
+ 
+    CREATE OBJECT lo_x EXPORTING msgv1 = 'x'.
+    mi_cut->add_exception( lo_x ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mi_cut->get_log_level( )
+      exp = zif_abapgit_log=>c_log_level-error ).
+ 
+  ENDMETHOD.
+ 
+  METHOD clone.
+ 
+    DATA li_clone TYPE REF TO zif_abapgit_log.
+ 
+    mi_cut->add( 'Hello' ).
+    mi_cut->set_title( 'My log' ).
+ 
+    li_clone = mi_cut->clone( ).
+ 
+    mi_cut->add( 'World' ).
+    mi_cut->set_title( 'My log CHANGED' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_clone->count( )
+      exp = 1 ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = li_clone->get_title( )
+      exp = 'My log' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_news.clas.abap.html b/src/utils/zcl_abapgit_news.clas.abap.html new file mode 100644 index 00000000000..55fd854d8c7 --- /dev/null +++ b/src/utils/zcl_abapgit_news.clas.abap.html @@ -0,0 +1,949 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_news.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_news.clas.abap

+
+ +
+ 100% + Statements + 288/288 +
+ + +
+ 100% + Branches + 16/16 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 288/288 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +2891x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +1x +1x +3x +16x +16x +8x +8x +8x +5x +3x +3x +2x +2x +5x +6x +6x +8x +8x +14x +14x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +20x +20x +23x +23x +23x +23x +10x +10x +10x +10x +10x +10x +13x +13x +13x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_news DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_log,
+        version      TYPE string,
+        pos_to_cur   TYPE i,
+        is_header    TYPE abap_bool,
+        is_important TYPE abap_bool,
+        text         TYPE string,
+      END OF ty_log .
+    TYPES:
+      ty_logs TYPE STANDARD TABLE OF ty_log WITH DEFAULT KEY .
+ 
+    CONSTANTS c_tail_length TYPE i VALUE 5 ##NO_TEXT.     " Number of versions to display if no updates
+ 
+    CLASS-METHODS create     " TODO REFACTOR
+      IMPORTING
+        !io_repo           TYPE REF TO zcl_abapgit_repo
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_news
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_log
+      RETURNING
+        VALUE(rt_log) TYPE ty_logs .
+    METHODS has_news
+      RETURNING
+        VALUE(rv_boolean) TYPE abap_bool .
+    METHODS has_important
+      RETURNING
+        VALUE(rv_boolean) TYPE abap_bool .
+    METHODS has_updates
+      RETURNING
+        VALUE(rv_boolean) TYPE abap_bool .
+    METHODS has_unseen
+      RETURNING
+        VALUE(rv_boolean) TYPE abap_bool .
+    METHODS constructor
+      IMPORTING
+        !iv_rawdata          TYPE xstring
+        !iv_lastseen_version TYPE string
+        !iv_current_version  TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mt_log TYPE ty_logs .
+    DATA mv_current_version TYPE string .
+    DATA mv_lastseen_version TYPE string .
+    DATA mv_latest_version TYPE string .
+ 
+    METHODS latest_version
+      RETURNING
+        VALUE(rv_version) TYPE string .
+    CLASS-METHODS parse_line
+      IMPORTING
+        !iv_line            TYPE string
+        !iv_current_version TYPE string
+      RETURNING
+        VALUE(rs_log)       TYPE ty_log .
+    CLASS-METHODS parse
+      IMPORTING
+        !it_lines           TYPE string_table
+        !iv_current_version TYPE string
+      RETURNING
+        VALUE(rt_log)       TYPE ty_logs .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_news IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA: lt_lines    TYPE string_table,
+          lv_string   TYPE string,
+          ls_log_line LIKE LINE OF mt_log.
+ 
+    " Validate params
+    mv_current_version  = zcl_abapgit_version=>normalize( iv_current_version ).
+    mv_lastseen_version = zcl_abapgit_version=>normalize( iv_lastseen_version ).
+    IF mv_current_version IS INITIAL.
+      RETURN. " Internal format of program version is not correct -> abort parsing
+    ENDIF.
+ 
+    lv_string = zcl_abapgit_convert=>xstring_to_string_utf8( iv_rawdata ).
+    lt_lines  = zcl_abapgit_convert=>split_string( lv_string ).
+    mt_log    = parse( it_lines = lt_lines
+                       iv_current_version = mv_current_version ).
+ 
+    READ TABLE mt_log INTO ls_log_line INDEX 1.
+    mv_latest_version = ls_log_line-version. " Empty if not found
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+ 
+    CONSTANTS: " TODO refactor
+      lc_log_path        TYPE string VALUE '/',
+      lc_log_filename    TYPE string VALUE 'changelog*',
+      lc_log_filename_up TYPE string VALUE 'CHANGELOG*'.
+ 
+    DATA: lo_apack            TYPE REF TO zcl_abapgit_apack_reader,
+          lt_remote           TYPE zif_abapgit_git_definitions=>ty_files_tt,
+          lv_version          TYPE string,
+          lv_last_seen        TYPE string,
+          lv_url              TYPE string,
+          lo_repo_online      TYPE REF TO zcl_abapgit_repo_online,
+          lv_version_constant TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit-version_constant.
+ 
+    FIELD-SYMBOLS <ls_file> LIKE LINE OF lt_remote.
+ 
+ 
+    IF io_repo->is_offline( ) = abap_true.
+      RETURN.
+    ENDIF.
+ 
+    lo_repo_online ?= io_repo.
+    lv_url          = lo_repo_online->get_url( ).
+ 
+    lo_apack = io_repo->get_dot_apack( ).
+    IF lo_apack IS BOUND.
+      lv_version = lo_apack->get_manifest_descriptor( )-version.
+    ENDIF.
+ 
+    IF lv_version IS INITIAL.
+      TRY.
+          lv_version_constant = io_repo->get_dot_abapgit( )->get_version_constant( ).
+          IF lv_version_constant IS NOT INITIAL.
+            lv_version = zcl_abapgit_version=>get_version_constant_value( lv_version_constant ).
+          ENDIF.
+        CATCH zcx_abapgit_exception.
+          CLEAR lv_version.
+      ENDTRY.
+    ENDIF.
+ 
+    IF lv_version IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    lv_last_seen = zcl_abapgit_persistence_user=>get_instance( )->get_repo_last_change_seen( lv_url ).
+ 
+    TRY. " Find changelog
+        lt_remote = io_repo->get_files_remote( ).
+      CATCH zcx_abapgit_exception.
+        RETURN.
+    ENDTRY.
+ 
+    LOOP AT lt_remote ASSIGNING <ls_file> WHERE path = lc_log_path
+                                            AND ( filename CP lc_log_filename OR filename CP lc_log_filename_up ).
+ 
+      CREATE OBJECT ro_instance
+        EXPORTING
+          iv_rawdata          = <ls_file>-data
+          iv_current_version  = lv_version
+          iv_lastseen_version = zcl_abapgit_version=>normalize( lv_last_seen ).
+ 
+      EXIT.
+ 
+    ENDLOOP.
+ 
+    IF ro_instance IS BOUND AND lv_last_seen <> ro_instance->latest_version( ).
+      zcl_abapgit_persistence_user=>get_instance( )->set_repo_last_change_seen(
+        iv_url     = lv_url
+        iv_version = ro_instance->latest_version( ) ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_log.
+    rt_log = mt_log.
+  ENDMETHOD.
+ 
+ 
+  METHOD has_important.
+    READ TABLE mt_log WITH KEY is_important = abap_true TRANSPORTING NO FIELDS.
+    rv_boolean = boolc( sy-subrc IS INITIAL ).
+  ENDMETHOD.
+ 
+ 
+  METHOD has_news.
+    rv_boolean = boolc( lines( mt_log ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD has_unseen.
+    rv_boolean = boolc( zcl_abapgit_version=>compare(
+      iv_a = mv_latest_version
+      iv_b = mv_lastseen_version ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD has_updates.
+    rv_boolean = boolc( zcl_abapgit_version=>compare(
+      iv_a = mv_latest_version
+      iv_b = mv_current_version ) > 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD latest_version.
+    rv_version = mv_latest_version.
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA: lv_tail                TYPE i,
+          lv_first_version_found TYPE abap_bool,
+          lv_version             TYPE string,
+          ls_log                 LIKE LINE OF rt_log.
+ 
+    FIELD-SYMBOLS: <lv_line> LIKE LINE OF it_lines.
+ 
+ 
+    LOOP AT it_lines ASSIGNING <lv_line>.
+      ls_log = parse_line( iv_line = <lv_line>
+                           iv_current_version = iv_current_version ).
+ 
+      " Skip until first version head and Skip empty lines
+      CHECK ls_log IS NOT INITIAL AND
+            ( lv_first_version_found = abap_true OR ls_log-version IS NOT INITIAL ).
+ 
+      IF lv_first_version_found = abap_false.
+        lv_first_version_found = abap_true.
+        IF zcl_abapgit_version=>compare( iv_a = ls_log-version
+                                         iv_b = iv_current_version ) <= 0.
+          lv_tail = c_tail_length. " Display some last versions if no updates
+        ENDIF.
+      ENDIF.
+ 
+      IF ls_log-is_header = abap_true.
+        "Skip everything below current version or show tail news
+        IF zcl_abapgit_version=>compare( iv_a = ls_log-version
+                                         iv_b = iv_current_version ) <= 0.
+          IF lv_tail > 0.
+            lv_tail = lv_tail - 1.
+          ELSE.
+            EXIT.
+          ENDIF.
+        ENDIF.
+        lv_version = ls_log-version. " Save to fill news lines
+      ELSE.
+        ls_log-version = lv_version.
+      ENDIF.
+ 
+      APPEND ls_log TO rt_log.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_line.
+ 
+    CONSTANTS: lc_header_pattern TYPE string
+        VALUE '^\d{4}-\d{2}-\d{2}\s+v(\d{1,3}\.\d{1,3}\.\d{1,3})\s*$'.
+ 
+    DATA: lv_version TYPE string.
+ 
+    IF iv_line IS INITIAL OR iv_line CO ' -='.
+      RETURN. " Skip empty and markup lines
+    ENDIF.
+ 
+    " Check if line is a header line
+    FIND FIRST OCCURRENCE OF REGEX lc_header_pattern IN iv_line SUBMATCHES lv_version.
+    IF sy-subrc IS INITIAL.
+      lv_version        = zcl_abapgit_version=>normalize( lv_version ).
+      rs_log-version    = lv_version.
+      rs_log-is_header  = abap_true.
+      rs_log-pos_to_cur = zcl_abapgit_version=>compare( iv_a = lv_version
+                                                        iv_b = iv_current_version ).
+    ELSE.
+      FIND FIRST OCCURRENCE OF REGEX '^\s*!' IN iv_line.
+      rs_log-is_important = boolc( sy-subrc IS INITIAL ). " Change is important
+    ENDIF.
+ 
+    rs_log-text = iv_line.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_news.clas.testclasses.abap.html b/src/utils/zcl_abapgit_news.clas.testclasses.abap.html new file mode 100644 index 00000000000..be8980f6420 --- /dev/null +++ b/src/utils/zcl_abapgit_news.clas.testclasses.abap.html @@ -0,0 +1,757 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_news.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_news.clas.testclasses.abap

+
+ +
+ 100% + Statements + 224/224 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 224/224 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +2251x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +13x +13x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +14x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
**********************************************************************
+* Helper classed
+ 
+CLASS lcl_string_buffer DEFINITION FINAL.
+  PUBLIC SECTION.
+    DATA mt_buffer TYPE string_table.
+    METHODS add
+      IMPORTING
+        iv_str TYPE string.
+ENDCLASS.
+ 
+CLASS lcl_string_buffer IMPLEMENTATION.
+  METHOD add.
+    APPEND iv_str TO mt_buffer.
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS lcl_log_entries DEFINITION FINAL.
+  PUBLIC SECTION.
+    DATA mt_log_entries TYPE zcl_abapgit_news=>ty_logs.
+    METHODS add
+      IMPORTING
+        iv_str TYPE string.
+ENDCLASS.
+ 
+CLASS lcl_log_entries IMPLEMENTATION.
+  METHOD add.
+    DATA ls_log LIKE LINE OF mt_log_entries.
+    DATA lv_pos_to_cur_str TYPE string.
+ 
+    SPLIT iv_str AT '/' INTO
+      ls_log-version
+      ls_log-is_header
+      ls_log-is_important
+      lv_pos_to_cur_str
+      ls_log-text.
+ 
+    CONDENSE ls_log-version.
+    CONDENSE ls_log-is_header.
+    CONDENSE ls_log-is_important.
+    CONDENSE ls_log-text.
+    ls_log-pos_to_cur = lv_pos_to_cur_str.
+ 
+    APPEND ls_log TO mt_log_entries.
+  ENDMETHOD.
+ENDCLASS.
+ 
+**********************************************************************
+ 
+CLASS ltcl_news DEFINITION DEFERRED.
+CLASS zcl_abapgit_news DEFINITION LOCAL FRIENDS ltcl_news.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_news DEFINITION
+*----------------------------------------------------------------------*
+* Definition of test class for news announcement
+*----------------------------------------------------------------------*
+CLASS ltcl_news DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS:
+      parse_line         FOR TESTING,
+      parse              FOR TESTING.
+ 
+ENDCLASS.
+ 
+*----------------------------------------------------------------------*
+*       CLASS ltcl_news IMPLEMENTATION
+*----------------------------------------------------------------------*
+* Implementation of test class for news announcement
+*----------------------------------------------------------------------*
+CLASS ltcl_news IMPLEMENTATION.
+ 
+  METHOD parse_line.
+ 
+    DATA: ls_log TYPE zcl_abapgit_news=>ty_log.
+ 
+    ls_log = zcl_abapgit_news=>parse_line(
+      iv_line            = '======'
+      iv_current_version = '1.26.01' ).
+    cl_abap_unit_assert=>assert_initial( ls_log ).
+ 
+    ls_log = zcl_abapgit_news=>parse_line(
+      iv_line            = ''
+      iv_current_version = '1.26.01' ).
+    cl_abap_unit_assert=>assert_initial( ls_log ).
+ 
+    ls_log = zcl_abapgit_news=>parse_line(
+      iv_line            = '------'
+      iv_current_version = '1.26.01' ).
+    cl_abap_unit_assert=>assert_initial( ls_log ).
+ 
+    CLEAR ls_log.
+    ls_log = zcl_abapgit_news=>parse_line(
+      iv_line            = '2017-02-13 v1.28.0'
+      iv_current_version = '1.26.01' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-version
+                                        exp = '1.28.0' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-is_header
+                                        exp = abap_true ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-pos_to_cur
+                                        exp = 1 ).
+ 
+    CLEAR ls_log.
+    ls_log = zcl_abapgit_news=>parse_line(
+      iv_line            = '2017-02-13 v1.26.0'
+      iv_current_version = '1.26.01' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-version
+                                        exp = '1.26.0' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-is_header
+                                        exp = abap_true ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-pos_to_cur
+                                        exp = -1 ).
+ 
+    CLEAR ls_log.
+    ls_log = zcl_abapgit_news=>parse_line(
+      iv_line            = 'news'
+      iv_current_version = '1.26.01' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-version
+                                        exp = '' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-is_header
+                                        exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-pos_to_cur
+                                        exp = 0 ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-is_important
+                                        exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-text
+                                        exp = 'news' ).
+ 
+    CLEAR ls_log.
+    ls_log = zcl_abapgit_news=>parse_line(
+      iv_line            = ' ! important news'
+      iv_current_version = '1.26.01' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-version
+                                        exp = '' ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-is_header
+                                        exp = abap_false ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-pos_to_cur
+                                        exp = 0 ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-is_important
+                                        exp = abap_true ).
+    cl_abap_unit_assert=>assert_equals( act = ls_log-text
+                                        exp = ' ! important news' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD parse.
+ 
+    DATA lt_log_act TYPE zcl_abapgit_news=>ty_logs.
+    DATA lo_src_text_buf TYPE REF TO lcl_string_buffer.
+    DATA lo_log_entries TYPE REF TO lcl_log_entries.
+ 
+    " Generate test data
+    CREATE OBJECT lo_src_text_buf.
+    lo_src_text_buf->add( '======' ).
+    lo_src_text_buf->add( '------' ).
+    lo_src_text_buf->add( `      ` ).
+    lo_src_text_buf->add( 'abapGit changelog' ).
+    lo_src_text_buf->add( '2017-02-13 v1.28.0' ).
+    lo_src_text_buf->add( '------------------' ).
+    lo_src_text_buf->add( '+ Staging page redesigned' ).
+    lo_src_text_buf->add( '! Support for core data services' ).
+    lo_src_text_buf->add( `      ` ).
+    lo_src_text_buf->add( '2017-01-25 v1.27.0' ).
+    lo_src_text_buf->add( '------------------' ).
+    lo_src_text_buf->add( '+ Two factor authentication with github.com' ).
+    lo_src_text_buf->add( '2017-01-25 v1.26.0' ).
+ 
+    " Case 1
+    " Generate expected results
+    CREATE OBJECT lo_log_entries.
+    "                   VERSION  HEAD IMP POS  TEXT
+    lo_log_entries->add( '1.28.0 /X   /   /1   /2017-02-13 v1.28.0' ).
+    lo_log_entries->add( '1.28.0 /    /   /0   /+ Staging page redesigned' ).
+    lo_log_entries->add( '1.28.0 /    /X  /0   /! Support for core data services' ).
+    lo_log_entries->add( '1.27.0 /X   /   /1   /2017-01-25 v1.27.0' ).
+    lo_log_entries->add( '1.27.0 /    /   /0   /+ Two factor authentication with github.com' ).
+ 
+    lt_log_act = zcl_abapgit_news=>parse(
+      it_lines = lo_src_text_buf->mt_buffer
+      iv_current_version = '1.26.01' ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = lo_log_entries->mt_log_entries
+      act = lt_log_act
+      msg = ' Error during parsing: Case 1.' ).
+ 
+ 
+    " Case 2 (exect version match)
+    CREATE OBJECT lo_log_entries.
+    "                   VERSION  HEAD IMP UPD TEXT
+    lo_log_entries->add( '1.28.0 /X  /   /1   /2017-02-13 v1.28.0' ).
+    lo_log_entries->add( '1.28.0 /   /   /0   /+ Staging page redesigned' ).
+    lo_log_entries->add( '1.28.0 /   /X  /0   /! Support for core data services' ).
+ 
+    lt_log_act = zcl_abapgit_news=>parse(
+      it_lines = lo_src_text_buf->mt_buffer
+      iv_current_version = '1.27.00' ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = lo_log_entries->mt_log_entries
+      act = lt_log_act
+      msg = ' Error during parsing: Case 2.' ).
+ 
+    " Case 3 (display tail)
+    CREATE OBJECT lo_log_entries.
+    "                   VERSION  HEAD IMP UPD TEXT
+    lo_log_entries->add( '1.28.0 /X  /   /0   /2017-02-13 v1.28.0' ).
+    lo_log_entries->add( '1.28.0 /   /   /0   /+ Staging page redesigned' ).
+    lo_log_entries->add( '1.28.0 /   /X  /0   /! Support for core data services' ).
+    lo_log_entries->add( '1.27.0 /X  /   /-1  /2017-01-25 v1.27.0' ).
+    lo_log_entries->add( '1.27.0 /   /   /0   /+ Two factor authentication with github.com' ).
+    lo_log_entries->add( '1.26.0 /X  /   /-1  /2017-01-25 v1.26.0' ).
+ 
+    lt_log_act = zcl_abapgit_news=>parse(
+      it_lines = lo_src_text_buf->mt_buffer
+      iv_current_version = '1.28.00' ).
+    cl_abap_unit_assert=>assert_equals(
+      exp = lo_log_entries->mt_log_entries
+      act = lt_log_act
+      msg = ' Error during parsing: Case 3.' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_path.clas.abap.html b/src/utils/zcl_abapgit_path.clas.abap.html new file mode 100644 index 00000000000..82367d9d6b5 --- /dev/null +++ b/src/utils/zcl_abapgit_path.clas.abap.html @@ -0,0 +1,478 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_path.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_path.clas.abap

+
+ +
+ 96.18% + Statements + 126/131 +
+ + +
+ 80% + Branches + 12/15 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 96.18% + Lines + 126/131 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +1321x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +1x +  +4x +2x +  +  +2x +2x +  +  +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +2x +2x +2x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_path DEFINITION
+  PUBLIC FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS split_file_location
+      IMPORTING iv_fullpath TYPE string
+      EXPORTING ev_path     TYPE string
+                ev_filename TYPE string.
+ 
+    CLASS-METHODS is_root
+      IMPORTING iv_path       TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    CLASS-METHODS is_subdir
+      IMPORTING iv_path       TYPE string
+                iv_parent     TYPE string
+      RETURNING VALUE(rv_yes) TYPE abap_bool.
+ 
+    CLASS-METHODS change_dir
+      IMPORTING iv_cur_dir     TYPE string
+                iv_cd          TYPE string
+      RETURNING VALUE(rv_path) TYPE string.
+ 
+    CLASS-METHODS get_filename_from_syspath
+      IMPORTING iv_path            TYPE string
+      RETURNING VALUE(rv_filename) TYPE string.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_PATH IMPLEMENTATION.
+ 
+ 
+  METHOD change_dir.
+ 
+    DATA: lv_last TYPE i,
+          lv_temp TYPE string.
+ 
+    lv_last = strlen( iv_cur_dir ) - 1.
+ 
+    IF iv_cd = '' OR iv_cd = '.'. " No change
+      rv_path = iv_cur_dir.
+    ELSEIF iv_cd+0(1) = '/'.      " Absolute path
+      rv_path = iv_cd.
+    ELSEIF iv_cd = '..'.          " CD back
+      IF iv_cur_dir = '/' OR iv_cur_dir = ''. " Back from root = root
+        rv_path = iv_cur_dir.
+      ELSE.
+        lv_temp = reverse( iv_cur_dir ).
+        IF lv_temp+0(1) = '/'.
+          SHIFT lv_temp BY 1 PLACES LEFT.
+        ENDIF.
+        SHIFT lv_temp UP TO '/' LEFT.
+        rv_path = reverse( lv_temp ).
+      ENDIF.
+    ELSEIF iv_cur_dir+lv_last(1) = '/'.  " Append cd to cur_dir separated by /
+      rv_path = iv_cur_dir && iv_cd.
+    ELSE.
+      rv_path = iv_cur_dir && '/' && iv_cd.
+    ENDIF.
+ 
+    " TODO: improve logic and cases
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_filename_from_syspath.
+ 
+    DATA: lv_split TYPE c LENGTH 1,
+          lv_index TYPE i,
+          lt_split TYPE TABLE OF string.
+ 
+    " filename | c:\filename | /dir/filename | \\server\filename
+    IF iv_path CA '/'.
+      lv_split = '/'.
+    ELSE.
+      lv_split = '\'.
+    ENDIF.
+ 
+    SPLIT iv_path AT lv_split INTO TABLE lt_split.
+ 
+    lv_index = lines( lt_split ).
+ 
+    READ TABLE lt_split INDEX lv_index INTO rv_filename.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_root.
+    rv_yes = boolc( iv_path = '/' ).
+  ENDMETHOD.
+ 
+ 
+  METHOD is_subdir.
+ 
+    DATA lv_len  TYPE i.
+    DATA lv_last TYPE i.
+ 
+    lv_len  = strlen( iv_parent ).
+    lv_last = lv_len - 1.
+    rv_yes  = boolc( strlen( iv_path ) > lv_len
+                 AND iv_path+0(lv_len) = iv_parent
+                 AND ( iv_parent+lv_last(1) = '/' OR iv_path+lv_len(1) = '/' ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_file_location.
+ 
+    DATA: lv_cnt TYPE i,
+          lv_len TYPE i.
+ 
+    FIND FIRST OCCURRENCE OF REGEX '^/(.*/)?' IN iv_fullpath
+      MATCH COUNT lv_cnt
+      MATCH LENGTH lv_len.
+ 
+    IF lv_cnt > 0.
+      ev_path     = iv_fullpath+0(lv_len).
+      ev_filename = iv_fullpath+lv_len.
+    ELSE.
+      CLEAR ev_path.
+      ev_filename = iv_fullpath.
+    ENDIF.
+ 
+    ev_filename = cl_http_utility=>unescape_url( escaped = ev_filename ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_path.clas.testclasses.abap.html b/src/utils/zcl_abapgit_path.clas.testclasses.abap.html new file mode 100644 index 00000000000..b5ce04546f0 --- /dev/null +++ b/src/utils/zcl_abapgit_path.clas.testclasses.abap.html @@ -0,0 +1,703 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_path.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_path.clas.testclasses.abap

+
+ +
+ 100% + Statements + 206/206 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 206/206 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +2071x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
 
+CLASS ltcl_path DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    METHODS is_root FOR TESTING.
+    METHODS split_file_location FOR TESTING.
+    METHODS is_subdir FOR TESTING.
+    METHODS change_dir FOR TESTING.
+    METHODS get_filename_from_syspath FOR TESTING.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_path IMPLEMENTATION.
+ 
+  METHOD is_root.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_true
+      act = zcl_abapgit_path=>is_root( '/' ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_false
+      act = zcl_abapgit_path=>is_root( '' ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_false
+      act = zcl_abapgit_path=>is_root( 'somedir' ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = abap_false
+      act = zcl_abapgit_path=>is_root( '/somedir' ) ).
+ 
+  ENDMETHOD.
+ 
+  METHOD split_file_location.
+ 
+    DATA: lv_path TYPE string,
+          lv_name TYPE string.
+ 
+    zcl_abapgit_path=>split_file_location(
+      EXPORTING iv_fullpath = ''
+      IMPORTING ev_path     = lv_path ev_filename = lv_name ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_name
+                                        exp = '' ).
+ 
+    zcl_abapgit_path=>split_file_location(
+      EXPORTING iv_fullpath = 'somefile'
+      IMPORTING ev_path     = lv_path ev_filename = lv_name ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_name
+                                        exp = 'somefile' ).
+ 
+    zcl_abapgit_path=>split_file_location(
+      EXPORTING iv_fullpath = '/'
+      IMPORTING ev_path     = lv_path ev_filename = lv_name ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_name
+                                        exp = '' ).
+ 
+    zcl_abapgit_path=>split_file_location(
+      EXPORTING iv_fullpath = '/somefile'
+      IMPORTING ev_path     = lv_path ev_filename = lv_name ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_name
+                                        exp = 'somefile' ).
+ 
+    zcl_abapgit_path=>split_file_location(
+      EXPORTING iv_fullpath = '/somedir/'
+      IMPORTING ev_path     = lv_path ev_filename = lv_name ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/somedir/' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_name
+                                        exp = '' ).
+ 
+    zcl_abapgit_path=>split_file_location(
+      EXPORTING iv_fullpath = '/somedir/somefile'
+      IMPORTING ev_path     = lv_path ev_filename = lv_name ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/somedir/' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_name
+                                        exp = 'somefile' ).
+ 
+ 
+  ENDMETHOD.
+ 
+  METHOD is_subdir.
+ 
+    DATA lv_yes TYPE abap_bool.
+ 
+    lv_yes = zcl_abapgit_path=>is_subdir( iv_path   = '/dir/subdir'
+                                          iv_parent = '/dir' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_yes
+                                        exp = abap_true ).
+ 
+    lv_yes = zcl_abapgit_path=>is_subdir( iv_path   = '/dir/subdir'
+                                          iv_parent = '/dir/' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_yes
+                                        exp = abap_true ).
+ 
+    lv_yes = zcl_abapgit_path=>is_subdir( iv_path   = '/another'
+                                          iv_parent = '/dir' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_yes
+                                        exp = abap_false ).
+ 
+    lv_yes = zcl_abapgit_path=>is_subdir( iv_path   = '/dir'
+                                          iv_parent = '/dir' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_yes
+                                        exp = abap_false ).
+ 
+    lv_yes = zcl_abapgit_path=>is_subdir( iv_path   = '/dir'
+                                          iv_parent = '/' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_yes
+                                        exp = abap_true ).
+ 
+    lv_yes = zcl_abapgit_path=>is_subdir( iv_path   = '/dir2'
+                                          iv_parent = '/dir' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_yes
+                                        exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+  METHOD change_dir.
+ 
+    DATA lv_path TYPE string.
+ 
+    lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = ''
+                                            iv_cd      = '' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '' ).
+ 
+    lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir'
+                                            iv_cd      = '' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/dir' ).
+ 
+    lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir'
+                                            iv_cd      = '.' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/dir' ).
+ 
+    lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir'
+                                            iv_cd      = '..' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/' ).
+ 
+    lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir/sub'
+                                            iv_cd      = '..' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/dir/' ).
+ 
+    lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir/'
+                                            iv_cd      = 'sub' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/dir/sub' ).
+ 
+    lv_path = zcl_abapgit_path=>change_dir( iv_cur_dir = '/dir'
+                                            iv_cd      = 'sub' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_path
+                                        exp = '/dir/sub' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD get_filename_from_syspath.
+ 
+    DATA lv_filename TYPE string.
+ 
+    lv_filename = zcl_abapgit_path=>get_filename_from_syspath( 'file.txt' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_filename
+                                        exp = 'file.txt' ).
+ 
+    lv_filename = zcl_abapgit_path=>get_filename_from_syspath( 'c:\dir\file.txt' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_filename
+                                        exp = 'file.txt' ).
+ 
+    lv_filename = zcl_abapgit_path=>get_filename_from_syspath( 'c:\file.txt' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_filename
+                                        exp = 'file.txt' ).
+ 
+    lv_filename = zcl_abapgit_path=>get_filename_from_syspath( '/dir/file.txt' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_filename
+                                        exp = 'file.txt' ).
+ 
+    lv_filename = zcl_abapgit_path=>get_filename_from_syspath( '/file.txt' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_filename
+                                        exp = 'file.txt' ).
+ 
+    lv_filename = zcl_abapgit_path=>get_filename_from_syspath( '\\server$\file.txt' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_filename
+                                        exp = 'file.txt' ).
+ 
+    lv_filename = zcl_abapgit_path=>get_filename_from_syspath(
+      'C:\foo\bar\moo.boo\dev\qas\_blah\goog\muuh\sap\hello\world\lorem\ipsum\s_foo.gif' ).
+    cl_abap_unit_assert=>assert_equals( act = lv_filename
+                                        exp = 's_foo.gif' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_repo_labels.clas.abap.html b/src/utils/zcl_abapgit_repo_labels.clas.abap.html new file mode 100644 index 00000000000..1223fa3a312 --- /dev/null +++ b/src/utils/zcl_abapgit_repo_labels.clas.abap.html @@ -0,0 +1,1039 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_repo_labels.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_repo_labels.clas.abap

+
+ +
+ 96.54% + Statements + 307/318 +
+ + +
+ 73.33% + Branches + 22/30 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 96.54% + Lines + 307/318 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +3191x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +12x +12x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +7x +7x +7x +10x +10x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +28x +28x +28x +28x +28x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +3x +3x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +7x +4x +4x +1x +1x +1x +1x +1x +1x +1x +2x +  +20x +20x +3x +  +17x +17x +17x +  +  +17x +17x +17x +10x +10x +2x +  +10x +15x +7x +6x +14x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +  +1x +1x +1x +1x + 
CLASS zcl_abapgit_repo_labels DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_label_color,
+        label TYPE string,
+        color TYPE string,
+      END OF ty_label_color,
+      ty_label_colors TYPE STANDARD TABLE OF ty_label_color WITH KEY label.
+ 
+    TYPES:
+      BEGIN OF ty_color,
+        cls TYPE string,
+        fg TYPE string,
+        bg TYPE string,
+      END OF ty_color.
+ 
+    CONSTANTS c_allowed_chars TYPE string VALUE `-_. a-zA-Z0-9` ##NO_TEXT.
+ 
+    " it is easier to allow chars, though potentially other chars can be added later if needed
+    CLASS-METHODS class_constructor.
+    CLASS-METHODS validate
+      IMPORTING
+        !iv_labels TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS split
+      IMPORTING
+        !iv_labels TYPE string
+      RETURNING
+        VALUE(rt_labels) TYPE string_table.
+    CLASS-METHODS normalize
+      IMPORTING
+        !iv_labels TYPE string
+      RETURNING
+        VALUE(rv_labels) TYPE string.
+ 
+    CLASS-METHODS validate_colors
+      IMPORTING
+        !iv_config TYPE string
+      RAISING
+        zcx_abapgit_exception.
+    CLASS-METHODS split_colors
+      IMPORTING
+        !iv_config TYPE string
+      RETURNING
+        VALUE(rt_label_colors) TYPE ty_label_colors.
+    CLASS-METHODS split_colors_into_map
+      IMPORTING
+        !iv_config TYPE string
+      RETURNING
+        VALUE(ro_map) TYPE REF TO zcl_abapgit_string_map.
+    CLASS-METHODS normalize_colors
+      IMPORTING
+        !iv_config TYPE string
+      RETURNING
+        VALUE(rv_config) TYPE string.
+ 
+    CLASS-METHODS parse_color
+      IMPORTING
+        iv_color TYPE string
+      RETURNING
+        VALUE(rs_parsed) TYPE ty_color.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CLASS-DATA gv_regex TYPE string.
+ 
+    CLASS-METHODS validate_one_label_color
+      IMPORTING
+        !is_lc TYPE ty_label_color
+        !iv_index TYPE i DEFAULT 0
+      RAISING
+        zcx_abapgit_exception.
+ 
+    CLASS-METHODS validate_rgb_color
+      IMPORTING
+        !iv_color TYPE string
+        !iv_index TYPE i DEFAULT 0
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REPO_LABELS IMPLEMENTATION.
+ 
+ 
+  METHOD class_constructor.
+    gv_regex = |^[{ c_allowed_chars }]*$|. " Must start with -
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize.
+ 
+    DATA lt_labels TYPE string_table.
+    DATA lt_normalized TYPE string_table.
+    FIELD-SYMBOLS <lv_lab> LIKE LINE OF lt_labels.
+ 
+    lt_labels = split( iv_labels ).
+ 
+    LOOP AT lt_labels ASSIGNING <lv_lab>.
+      FIND REGEX gv_regex IN <lv_lab>.
+      IF sy-subrc = 0.
+        APPEND <lv_lab> TO lt_normalized.
+      ENDIF.
+    ENDLOOP.
+ 
+    SORT lt_normalized.
+    DELETE ADJACENT DUPLICATES FROM lt_normalized.
+ 
+    rv_labels = concat_lines_of(
+      table = lt_normalized
+      sep = `, ` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_colors.
+ 
+    DATA lt_colors TYPE ty_label_colors.
+    DATA lt_normalized TYPE ty_label_colors.
+    DATA lt_pairs TYPE string_table.
+    DATA lv_pair TYPE string.
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF lt_colors.
+ 
+    lt_colors = split_colors( iv_config ).
+ 
+    LOOP AT lt_colors ASSIGNING <ls_c>.
+      TRY.
+          validate_one_label_color( <ls_c> ).
+          APPEND <ls_c> TO lt_normalized.
+        CATCH zcx_abapgit_exception.
+      ENDTRY.
+    ENDLOOP.
+ 
+    SORT lt_normalized BY label.
+    DELETE ADJACENT DUPLICATES FROM lt_normalized COMPARING label.
+ 
+    LOOP AT lt_normalized ASSIGNING <ls_c>.
+      lv_pair = <ls_c>-label && `:` && <ls_c>-color.
+      APPEND lv_pair TO lt_pairs.
+    ENDLOOP.
+ 
+    rv_config = concat_lines_of(
+      table = lt_pairs
+      sep = `, ` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD parse_color.
+ 
+    DATA lv_tmp TYPE string.
+ 
+    IF iv_color IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    IF iv_color+0(1) = '#'.
+      lv_tmp  = iv_color+1.
+      SPLIT lv_tmp AT '/' INTO rs_parsed-fg rs_parsed-bg.
+    ELSE.
+      rs_parsed-cls = iv_color.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split.
+ 
+    FIELD-SYMBOLS <lv_lab> LIKE LINE OF rt_labels.
+ 
+    SPLIT iv_labels AT ',' INTO TABLE rt_labels.
+    LOOP AT rt_labels ASSIGNING <lv_lab>.
+      CONDENSE <lv_lab>.
+    ENDLOOP.
+    DELETE rt_labels WHERE table_line IS INITIAL.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_colors.
+ 
+    DATA lt_pairs TYPE string_table.
+    DATA lv_clean_config LIKE iv_config.
+    DATA ls_c LIKE LINE OF rt_label_colors.
+    FIELD-SYMBOLS <lv_pair> LIKE LINE OF lt_pairs.
+ 
+    lv_clean_config = replace(
+      val = iv_config
+      sub = cl_abap_char_utilities=>newline
+      with = ` ` ). " text area ends with LF
+ 
+    SPLIT lv_clean_config AT ',' INTO TABLE lt_pairs.
+    LOOP AT lt_pairs ASSIGNING <lv_pair>.
+      CONDENSE <lv_pair>.
+      IF <lv_pair> IS NOT INITIAL.
+        SPLIT <lv_pair> AT ':' INTO ls_c-label ls_c-color.
+        CONDENSE ls_c-label.
+        CONDENSE ls_c-color.
+        APPEND ls_c TO rt_label_colors.
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_colors_into_map.
+ 
+    DATA lt_colors TYPE ty_label_colors.
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF lt_colors.
+ 
+    lt_colors = split_colors( iv_config ).
+ 
+    ro_map = zcl_abapgit_string_map=>create( ).
+    LOOP AT lt_colors ASSIGNING <ls_c>.
+      TRY.
+          ro_map->set(
+            iv_key = <ls_c>-label
+            iv_val = <ls_c>-color ).
+        CATCH zcx_abapgit_exception.
+      ENDTRY.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate.
+ 
+    DATA lt_labels TYPE string_table.
+    FIELD-SYMBOLS <lv_lab> LIKE LINE OF lt_labels.
+ 
+    lt_labels = split( iv_labels ).
+ 
+    LOOP AT lt_labels ASSIGNING <lv_lab>.
+      FIND REGEX gv_regex IN <lv_lab>.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Disallowed chars in label #{ sy-tabix }| ).
+      ENDIF.
+      " TODO: maybe also limit length ?
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_colors.
+ 
+    DATA lt_colors TYPE ty_label_colors.
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF lt_colors.
+ 
+    lt_colors = split_colors( iv_config ).
+ 
+    LOOP AT lt_colors ASSIGNING <ls_c>.
+      validate_one_label_color(
+        is_lc    = <ls_c>
+        iv_index = sy-tabix ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_one_label_color.
+ 
+    DATA ls_parsed_color TYPE ty_color.
+ 
+    IF is_lc-label IS INITIAL.
+      zcx_abapgit_exception=>raise( |Label is empty in pair #{ iv_index }| ).
+    ENDIF.
+ 
+    IF is_lc-color IS INITIAL.
+      zcx_abapgit_exception=>raise( |Color is empty in pair #{ iv_index }| ).
+    ENDIF.
+ 
+    FIND REGEX gv_regex IN is_lc-label.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Disallowed chars in label in pair #{ iv_index }| ).
+    ENDIF.
+ 
+    ls_parsed_color = parse_color( is_lc-color ).
+    IF ls_parsed_color-cls IS NOT INITIAL.
+      FIND REGEX '^[-_A-Za-z]+$' IN ls_parsed_color-cls.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Disallowed chars in color in pair #{ iv_index }| ).
+      ENDIF.
+    ENDIF.
+    IF ls_parsed_color-fg IS NOT INITIAL.
+      validate_rgb_color( ls_parsed_color-fg ).
+    ENDIF.
+    IF ls_parsed_color-bg IS NOT INITIAL.
+      validate_rgb_color( ls_parsed_color-bg ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD validate_rgb_color.
+ 
+    DATA lv_len TYPE i.
+ 
+    IF iv_color IS NOT INITIAL.
+      FIND REGEX '^[0-9A-Fa-f]+$' IN iv_color.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( |Disallowed chars in color in pair #{ iv_index }| ).
+      ENDIF.
+      lv_len = strlen( iv_color ).
+      IF NOT ( lv_len = 3 OR lv_len = 6 ).
+        zcx_abapgit_exception=>raise( |Icorrect color in pair #{ iv_index }| ).
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_repo_labels.clas.testclasses.abap.html b/src/utils/zcl_abapgit_repo_labels.clas.testclasses.abap.html new file mode 100644 index 00000000000..b3987b7cc74 --- /dev/null +++ b/src/utils/zcl_abapgit_repo_labels.clas.testclasses.abap.html @@ -0,0 +1,652 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_repo_labels.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_repo_labels.clas.testclasses.abap

+
+ +
+ 100% + Statements + 189/189 +
+ + +
+ 100% + Branches + 7/7 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 100% + Lines + 189/189 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +1901x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_tags DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+  PRIVATE SECTION.
+    METHODS split FOR TESTING.
+    METHODS validate FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS normalize FOR TESTING.
+ 
+    METHODS split_colors FOR TESTING.
+    METHODS split_colors_into_map FOR TESTING.
+    METHODS validate_colors FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS normalize_colors FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_tags IMPLEMENTATION.
+ 
+  METHOD split.
+ 
+    DATA lt_exp TYPE string_table.
+ 
+    APPEND `a` TO lt_exp.
+    APPEND `ab` TO lt_exp.
+    APPEND `a_b` TO lt_exp.
+    APPEND `a-b` TO lt_exp.
+    APPEND `a.b` TO lt_exp.
+    APPEND `Ab` TO lt_exp.
+    APPEND `a b` TO lt_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>split( `a,ab, a_b ,,a-b,a.b,Ab, a b ` )
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD validate.
+ 
+    zcl_abapgit_repo_labels=>validate( `a,ab1, a_b ,,a-b,a.b,Ab, a b ` ).
+    zcl_abapgit_repo_labels=>validate( '' ).
+    zcl_abapgit_repo_labels=>validate( ',' ).
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate( 'a,ab#' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD normalize.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>normalize( `a,ab, a_b ,,a-b,a.b,Ab, a b ` )
+      exp = 'Ab, a, a b, a-b, a.b, a_b, ab' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>normalize( 'a,ab#,a_b' )
+      exp = 'a, a_b' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>normalize( '' )
+      exp = '' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>normalize( ',, ,' )
+      exp = '' ).
+ 
+    cl_abap_unit_assert=>assert_equals( " duplicates and sorting
+      act = zcl_abapgit_repo_labels=>normalize( 'ba,ab,ab' )
+      exp = 'ab, ba' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD validate_colors.
+ 
+    zcl_abapgit_repo_labels=>validate_colors( 'a:red, b : #123456 ,,c:red-w' ).
+    zcl_abapgit_repo_labels=>validate_colors( '' ).
+    zcl_abapgit_repo_labels=>validate_colors( ',' ).
+    zcl_abapgit_repo_labels=>validate_colors( 'a:#123,b:#123/234,c:#123456,d:#123456/234567' ).
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate_colors( 'a,ab' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate_colors( 'a:' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate_colors( ':red' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate_colors( 'a:1234' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate_colors( 'a:#1234' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        zcl_abapgit_repo_labels=>validate_colors( 'a:123/234' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD split_colors.
+ 
+    DATA lt_exp TYPE zcl_abapgit_repo_labels=>ty_label_colors.
+    FIELD-SYMBOLS <ls_c> LIKE LINE OF lt_exp.
+ 
+    APPEND INITIAL LINE TO lt_exp ASSIGNING <ls_c>.
+    <ls_c>-label = 'a'.
+    <ls_c>-color = 'red'.
+    APPEND INITIAL LINE TO lt_exp ASSIGNING <ls_c>.
+    <ls_c>-label = 'b'.
+    <ls_c>-color = '#123456'.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>split_colors( 'a:red, b : #123456 ,,' )
+      exp = lt_exp ).
+ 
+    CLEAR lt_exp. " Case for textarea - it adds LF at the end
+    APPEND INITIAL LINE TO lt_exp ASSIGNING <ls_c>.
+    <ls_c>-label = 'a'.
+    <ls_c>-color = 'red'.
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>split_colors( `a:red ` && cl_abap_char_utilities=>newline )
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD split_colors_into_map.
+ 
+    DATA lt_exp TYPE zcl_abapgit_string_map=>ty_entries.
+    DATA ls_e LIKE LINE OF lt_exp.
+ 
+    ls_e-k = 'a'.
+    ls_e-v = 'red'.
+    INSERT ls_e INTO TABLE lt_exp.
+    ls_e-k = 'b'.
+    ls_e-v = '#123456'.
+    INSERT ls_e INTO TABLE lt_exp.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>split_colors_into_map( 'a:red, b : #123456 ,,' )->mt_entries
+      exp = lt_exp ).
+ 
+  ENDMETHOD.
+ 
+  METHOD normalize_colors.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>normalize_colors( 'a:red , b : #123456' )
+      exp = 'a:red, b:#123456' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>normalize_colors( 'a:red,b:,:blue' )
+      exp = 'a:red' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>normalize_colors( '' )
+      exp = '' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_repo_labels=>normalize_colors( ',, ,' )
+      exp = '' ).
+ 
+    cl_abap_unit_assert=>assert_equals( " duplicates and sorting
+      act = zcl_abapgit_repo_labels=>normalize_colors( 'b:blue,a:red,a:red,a:blue' )
+      exp = 'a:red, b:blue' ).
+ 
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_requirement_helper.clas.abap.html b/src/utils/zcl_abapgit_requirement_helper.clas.abap.html new file mode 100644 index 00000000000..105a6332d59 --- /dev/null +++ b/src/utils/zcl_abapgit_requirement_helper.clas.abap.html @@ -0,0 +1,841 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_requirement_helper.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_requirement_helper.clas.abap

+
+ +
+ 100% + Statements + 252/252 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 252/252 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +2531x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_requirement_helper DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS requirements_popup
+      IMPORTING
+        !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_requirements_met
+      IMPORTING
+        !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt
+      RETURNING
+        VALUE(rv_status) TYPE zif_abapgit_definitions=>ty_yes_no
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_requirement_status,
+        met               TYPE abap_bool,
+        component         TYPE tdevc-dlvunit,
+        description       TYPE string,
+        installed_release TYPE saprelease,
+        installed_patch   TYPE sappatchlv,
+        required_release  TYPE saprelease,
+        required_patch    TYPE sappatchlv,
+      END OF ty_requirement_status .
+    TYPES:
+      ty_requirement_status_tt TYPE STANDARD TABLE OF ty_requirement_status WITH DEFAULT KEY .
+ 
+    CLASS-METHODS show_requirement_popup
+      IMPORTING
+        !it_requirements TYPE ty_requirement_status_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_requirement_met_status
+      IMPORTING
+        !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt
+      RETURNING
+        VALUE(rt_status) TYPE ty_requirement_status_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS is_version_greater_or_equal
+      IMPORTING
+        !is_status     TYPE ty_requirement_status
+      RETURNING
+        VALUE(rv_true) TYPE abap_bool .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_REQUIREMENT_HELPER IMPLEMENTATION.
+ 
+ 
+  METHOD get_requirement_met_status.
+ 
+    DATA: lt_installed TYPE STANDARD TABLE OF cvers_sdu.
+ 
+    FIELD-SYMBOLS: <ls_requirement>    TYPE zif_abapgit_dot_abapgit=>ty_requirement,
+                   <ls_status>         TYPE ty_requirement_status,
+                   <ls_installed_comp> TYPE cvers_sdu.
+ 
+ 
+    CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS'
+      TABLES
+        tt_comptab       = lt_installed
+      EXCEPTIONS
+        no_release_found = 1
+        OTHERS           = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error from DELIVERY_GET_INSTALLED_COMPS { sy-subrc }| ).
+    ENDIF.
+ 
+    LOOP AT it_requirements ASSIGNING <ls_requirement>.
+      APPEND INITIAL LINE TO rt_status ASSIGNING <ls_status>.
+      <ls_status>-component = <ls_requirement>-component.
+      <ls_status>-required_release = <ls_requirement>-min_release.
+      <ls_status>-required_patch = <ls_requirement>-min_patch.
+ 
+      READ TABLE lt_installed WITH KEY component = <ls_requirement>-component
+                              ASSIGNING <ls_installed_comp>.
+      IF sy-subrc = 0.
+        " Component is installed, requirement is met if the installed version is greater or equal
+        " to the required one.
+        <ls_status>-installed_release = <ls_installed_comp>-release.
+        <ls_status>-installed_patch = <ls_installed_comp>-extrelease.
+        <ls_status>-description = <ls_installed_comp>-desc_text.
+        <ls_status>-met = is_version_greater_or_equal( <ls_status> ).
+      ELSE.
+        " Component is not installed at all
+        <ls_status>-met = abap_false.
+      ENDIF.
+ 
+      UNASSIGN <ls_installed_comp>.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_requirements_met.
+ 
+    DATA: lt_met_status TYPE ty_requirement_status_tt.
+ 
+    lt_met_status = get_requirement_met_status( it_requirements ).
+ 
+    READ TABLE lt_met_status TRANSPORTING NO FIELDS WITH KEY met = abap_false.
+    IF sy-subrc = 0.
+      rv_status = zif_abapgit_definitions=>c_no.
+    ELSE.
+      rv_status = zif_abapgit_definitions=>c_yes.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_version_greater_or_equal.
+ 
+    DATA:
+      lv_installed_release TYPE n LENGTH 4,
+      lv_installed_patch   TYPE n LENGTH 4,
+      lv_required_release  TYPE n LENGTH 4,
+      lv_required_patch    TYPE n LENGTH 4.
+ 
+    TRY.
+        MOVE EXACT: is_status-installed_release TO lv_installed_release,
+                    is_status-installed_patch   TO lv_installed_patch,
+                    is_status-required_release  TO lv_required_release,
+                    is_status-required_patch    TO lv_required_patch.
+      CATCH cx_sy_conversion_error.
+        " Cannot compare by number, assume requirement not fullfilled (user can force install
+        " anyways if this was an error)
+        rv_true = abap_false.
+        RETURN.
+    ENDTRY.
+ 
+    " Versions are comparable by number, compare release and if necessary patch level
+    IF lv_installed_release > lv_required_release
+        OR ( lv_installed_release = lv_required_release
+         AND ( lv_required_patch = 0
+            OR lv_installed_patch >= lv_required_patch ) ).
+ 
+      rv_true = abap_true.
+ 
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD requirements_popup.
+ 
+    DATA: lt_met_status TYPE ty_requirement_status_tt,
+          lv_answer     TYPE c LENGTH 1.
+ 
+ 
+    lt_met_status = get_requirement_met_status( it_requirements ).
+ 
+    show_requirement_popup( lt_met_status ).
+ 
+    lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
+      iv_titlebar      = 'Warning'
+      iv_text_question = 'The project has unmet requirements. Do you want to continue?' ).
+ 
+    IF lv_answer <> '1'.
+      zcx_abapgit_exception=>raise( 'Cancelling because of unmet requirements.' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD show_requirement_popup.
+ 
+    TYPES: BEGIN OF ty_color_line,
+             color TYPE lvc_t_scol.
+             INCLUDE TYPE ty_requirement_status.
+    TYPES: END OF ty_color_line.
+ 
+    TYPES: ty_color_tab TYPE STANDARD TABLE OF ty_color_line WITH DEFAULT KEY.
+ 
+    DATA: lo_alv            TYPE REF TO cl_salv_table,
+          lo_column         TYPE REF TO cl_salv_column,
+          lo_columns        TYPE REF TO cl_salv_columns_table,
+          lt_color_table    TYPE ty_color_tab,
+          lt_color_negative TYPE lvc_t_scol,
+          lt_color_positive TYPE lvc_t_scol,
+          ls_color          TYPE lvc_s_scol,
+          ls_position       TYPE zif_abapgit_popups=>ty_popup_position,
+          lx_ex             TYPE REF TO cx_root.
+ 
+    FIELD-SYMBOLS: <ls_line>        TYPE ty_color_line,
+                   <ls_requirement> LIKE LINE OF it_requirements.
+ 
+ 
+    ls_color-color-col = col_negative.
+    APPEND ls_color TO lt_color_negative.
+ 
+    ls_color-color-col = col_positive.
+    APPEND ls_color TO lt_color_positive.
+ 
+    CLEAR ls_color.
+ 
+    LOOP AT it_requirements ASSIGNING <ls_requirement>.
+      APPEND INITIAL LINE TO lt_color_table ASSIGNING <ls_line>.
+      MOVE-CORRESPONDING <ls_requirement> TO <ls_line>.
+    ENDLOOP.
+ 
+    LOOP AT lt_color_table ASSIGNING <ls_line>.
+      IF <ls_line>-met = abap_false.
+        <ls_line>-color = lt_color_negative.
+      ELSE.
+        <ls_line>-color = lt_color_positive.
+      ENDIF.
+    ENDLOOP.
+    UNASSIGN <ls_line>.
+ 
+    TRY.
+        cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
+                                CHANGING t_table       = lt_color_table ).
+ 
+        lo_columns = lo_alv->get_columns( ).
+        lo_columns->get_column( 'MET' )->set_short_text( 'Met' ).
+        lo_columns->set_color_column( 'COLOR' ).
+        lo_columns->set_optimize( ).
+ 
+        lo_column = lo_columns->get_column( 'REQUIRED_RELEASE' ).
+        lo_column->set_short_text( 'Req. Rel.' ).
+ 
+        lo_column = lo_columns->get_column( 'REQUIRED_PATCH' ).
+        lo_column->set_short_text( 'Req. SP L.' ).
+ 
+        ls_position = zcl_abapgit_popups=>center(
+          iv_width  = 70
+          iv_height = 10 ).
+ 
+        lo_alv->set_screen_popup( start_column = ls_position-start_column
+                                  end_column   = ls_position-end_column
+                                  start_line   = ls_position-start_row
+                                  end_line     = ls_position-end_row ).
+ 
+        lo_alv->get_display_settings( )->set_list_header( 'Requirements' ).
+        lo_alv->display( ).
+ 
+      CATCH cx_salv_msg cx_salv_not_found cx_salv_data_error INTO lx_ex.
+        zcx_abapgit_exception=>raise( lx_ex->get_text( ) ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_requirement_helper.clas.testclasses.abap.html b/src/utils/zcl_abapgit_requirement_helper.clas.testclasses.abap.html new file mode 100644 index 00000000000..0f65e48b15f --- /dev/null +++ b/src/utils/zcl_abapgit_requirement_helper.clas.testclasses.abap.html @@ -0,0 +1,1519 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_requirement_helper.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_requirement_helper.clas.testclasses.abap

+
+ +
+ 43.93% + Statements + 210/478 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/14 +
+ + +
+ 43.93% + Lines + 210/478 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +4791x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x + 
CLASS lcl_helper DEFINITION FINAL.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS get_sap_basis_component
+      RETURNING
+        VALUE(rs_result) TYPE cvers_sdu
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS lcl_helper IMPLEMENTATION.
+ 
+ 
+  METHOD get_sap_basis_component.
+ 
+    DATA:
+      lt_installed TYPE STANDARD TABLE OF cvers_sdu.
+ 
+    CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS'
+      TABLES
+        tt_comptab       = lt_installed
+      EXCEPTIONS
+        no_release_found = 1
+        OTHERS           = 2.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Error from DELIVERY_GET_INSTALLED_COMPS { sy-subrc }| ).
+    ENDIF.
+ 
+    READ TABLE lt_installed INTO rs_result
+      WITH KEY component = `SAP_BASIS`.
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( |Component SAP_BASIS not found| ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ltcl_lower_release DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+  PRIVATE SECTION.
+    METHODS empty_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS lower_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS same_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS higher_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_lower_release IMPLEMENTATION.
+ 
+ 
+  METHOD empty_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release - 1.
+    ls_requirement-min_patch   = 0.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD lower_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release - 1.
+    ls_requirement-min_patch   = nmax(
+                                   val1 = ls_component-extrelease - 1
+                                   val2 = 0 ).
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD same_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release - 1.
+    ls_requirement-min_patch   = ls_component-extrelease.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD higher_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release - 1.
+    ls_requirement-min_patch   = ls_component-extrelease + 1.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ltcl_same_release DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+  PRIVATE SECTION.
+    METHODS empty_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS lower_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS same_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS higher_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_same_release IMPLEMENTATION.
+ 
+ 
+  METHOD empty_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release.
+    ls_requirement-min_patch   = 0.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD lower_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release.
+    ls_requirement-min_patch   = nmax(
+                                   val1 = ls_component-extrelease - 1
+                                   val2 = 0 ).
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD same_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release.
+    ls_requirement-min_patch   = ls_component-extrelease.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD higher_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release.
+    ls_requirement-min_patch   = ls_component-extrelease + 1.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_no ).
+
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ltcl_higher_release DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+  PRIVATE SECTION.
+    METHODS empty_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS lower_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS same_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS higher_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_higher_release IMPLEMENTATION.
+ 
+ 
+  METHOD empty_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release + 1.
+    ls_requirement-min_patch   = 0.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_no ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD lower_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release + 1.
+    ls_requirement-min_patch   = ls_component-extrelease - 1.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_no ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD same_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release + 1.
+    ls_requirement-min_patch   = ls_component-extrelease.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_no ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD higher_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release + 1.
+    ls_requirement-min_patch   = ls_component-extrelease + 1.
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_no ).
+
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ltcl_formats DEFINITION FINAL
+  FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+  PRIVATE SECTION.
+    METHODS shorter_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS higher_patch FOR TESTING
+      RAISING
+        zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_formats IMPLEMENTATION.
+ 
+ 
+  METHOD shorter_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release.
+
+    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
+      EXPORTING
+        input  = ls_component-extrelease
+      IMPORTING
+        output = ls_requirement-min_patch.
+
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD higher_patch.
+
+    DATA:
+      ls_component    TYPE cvers_sdu,
+      lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt,
+      ls_requirement  LIKE LINE OF lt_requirements.
+
+    ls_component = lcl_helper=>get_sap_basis_component( ).
+
+    ls_requirement-component   = ls_component-component.
+    ls_requirement-min_release = ls_component-release.
+
+    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
+      EXPORTING
+        input  = ls_component-extrelease
+      IMPORTING
+        output = ls_requirement-min_patch.
+
+    APPEND ls_requirement TO lt_requirements.
+
+    cl_abap_unit_assert=>assert_equals(
+        act = zcl_abapgit_requirement_helper=>is_requirements_met( lt_requirements )
+        exp = zif_abapgit_definitions=>c_yes ).
+
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_string_buffer.clas.abap.html b/src/utils/zcl_abapgit_string_buffer.clas.abap.html new file mode 100644 index 00000000000..cc4822f8c37 --- /dev/null +++ b/src/utils/zcl_abapgit_string_buffer.clas.abap.html @@ -0,0 +1,286 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_string_buffer.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_string_buffer.clas.abap

+
+ +
+ 100% + Statements + 67/67 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 67/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +681x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_string_buffer DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS new
+      RETURNING
+        VALUE(ro_me) TYPE REF TO zcl_abapgit_string_buffer.
+    METHODS add
+      IMPORTING
+        !iv_str      TYPE string
+      RETURNING
+        VALUE(ro_me) TYPE REF TO zcl_abapgit_string_buffer.
+    METHODS join_and_flush
+      RETURNING
+        VALUE(rv_str) TYPE string.
+    METHODS join_w_newline_and_flush
+      RETURNING
+        VALUE(rv_str) TYPE string.
+    METHODS join_w_space_and_flush
+      RETURNING
+        VALUE(rv_str) TYPE string.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mt_buffer TYPE string_table.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_STRING_BUFFER IMPLEMENTATION.
+ 
+ 
+  METHOD add.
+    APPEND iv_str TO mt_buffer.
+    ro_me = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD join_and_flush.
+    rv_str = concat_lines_of( table = mt_buffer ).
+    CLEAR mt_buffer.
+  ENDMETHOD.
+ 
+ 
+  METHOD join_w_newline_and_flush.
+    rv_str = concat_lines_of(
+      table = mt_buffer
+      sep   = cl_abap_char_utilities=>newline ).
+    CLEAR mt_buffer.
+  ENDMETHOD.
+ 
+ 
+  METHOD join_w_space_and_flush.
+    rv_str = concat_lines_of(
+      table = mt_buffer
+      sep   = ` ` ).
+    CLEAR mt_buffer.
+  ENDMETHOD.
+ 
+ 
+  METHOD new.
+    CREATE OBJECT ro_me.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_string_buffer.clas.testclasses.abap.html b/src/utils/zcl_abapgit_string_buffer.clas.testclasses.abap.html new file mode 100644 index 00000000000..a48dda1b73c --- /dev/null +++ b/src/utils/zcl_abapgit_string_buffer.clas.testclasses.abap.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_string_buffer.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_string_buffer.clas.testclasses.abap

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 21/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_test_strbuf DEFINITION FOR TESTING
+  RISK LEVEL HARMLESS
+  DURATION SHORT.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS join_space FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_test_strbuf IMPLEMENTATION.
+ 
+  METHOD join_space.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_string_buffer=>new( )->add( 'a' )->add( 'b' )->join_w_space_and_flush( )
+      exp = 'a b' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_string_map.clas.abap.html b/src/utils/zcl_abapgit_string_map.clas.abap.html new file mode 100644 index 00000000000..e1e7b39b575 --- /dev/null +++ b/src/utils/zcl_abapgit_string_map.clas.abap.html @@ -0,0 +1,811 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_string_map.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_string_map.clas.abap

+
+ +
+ 96.69% + Statements + 234/242 +
+ + +
+ 80% + Branches + 20/25 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 96.69% + Lines + 234/242 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +2431x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +1x +  +1x +1x +1x +1x +1x +1x +1x +9x +9x +1x +1x +1x +1x +1x +1x +1x +1x +25x +25x +50x +50x +1x +1x +1x +49x +49x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +  +80x +80x +19x +19x +61x +61x +80x +80x +80x +8x +8x +72x +72x +72x +72x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +2x +2x +6x +6x +2x +1x +1x +1x +  +2x +1x +1x +1x + 
CLASS zcl_abapgit_string_map DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_entry,
+        k TYPE string,
+        v TYPE string,
+      END OF ty_entry .
+    TYPES:
+      ty_entries TYPE SORTED TABLE OF ty_entry WITH UNIQUE KEY k .
+ 
+    DATA mt_entries TYPE ty_entries READ-ONLY .
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_case_insensitive TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(ro_instance)   TYPE REF TO zcl_abapgit_string_map .
+    METHODS constructor
+      IMPORTING
+        !iv_case_insensitive TYPE abap_bool DEFAULT abap_false .
+    METHODS get
+      IMPORTING
+        !iv_key       TYPE string
+      RETURNING
+        VALUE(rv_val) TYPE string .
+    METHODS has
+      IMPORTING
+        !iv_key       TYPE string
+      RETURNING
+        VALUE(rv_has) TYPE abap_bool .
+    METHODS set
+      IMPORTING
+        !iv_key       TYPE string
+        !iv_val       TYPE csequence OPTIONAL
+      RETURNING
+        VALUE(ro_map) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+    METHODS size
+      RETURNING
+        VALUE(rv_size) TYPE i .
+    METHODS is_empty
+      RETURNING
+        VALUE(rv_yes) TYPE abap_bool .
+    METHODS delete
+      IMPORTING
+        !iv_key TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS clear
+      RAISING
+        zcx_abapgit_exception .
+    METHODS to_abap
+      CHANGING
+        !cs_container TYPE any
+      RAISING
+        zcx_abapgit_exception .
+    METHODS strict
+      IMPORTING
+        !iv_strict         TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map .
+    METHODS freeze .
+    METHODS merge
+      IMPORTING
+        !io_string_map TYPE REF TO zcl_abapgit_string_map
+      RETURNING
+        VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    DATA mv_read_only TYPE abap_bool.
+    DATA mv_is_strict TYPE abap_bool.
+    DATA mv_case_insensitive TYPE abap_bool.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
+ 
+ 
+  METHOD clear.
+    IF mv_read_only = abap_true.
+      zcx_abapgit_exception=>raise( 'Cannot clear. This string map is immutable' ).
+    ENDIF.
+    CLEAR mt_entries.
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+    mv_is_strict = abap_true.
+    mv_case_insensitive = iv_case_insensitive.
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_instance
+      EXPORTING
+        iv_case_insensitive = iv_case_insensitive.
+  ENDMETHOD.
+ 
+ 
+  METHOD delete.
+ 
+    IF mv_read_only = abap_true.
+      zcx_abapgit_exception=>raise( 'Cannot delete. This string map is immutable' ).
+    ENDIF.
+ 
+    DELETE mt_entries WHERE k = iv_key.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD freeze.
+    mv_read_only = abap_true.
+  ENDMETHOD.
+ 
+ 
+  METHOD get.
+ 
+    DATA lv_key LIKE iv_key.
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
+ 
+    IF mv_case_insensitive = abap_true.
+      lv_key = to_upper( iv_key ).
+    ELSE.
+      lv_key = iv_key.
+    ENDIF.
+ 
+    READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = lv_key.
+    IF sy-subrc IS INITIAL.
+      rv_val = <ls_entry>-v.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD has.
+ 
+    READ TABLE mt_entries TRANSPORTING NO FIELDS WITH KEY k = iv_key.
+    rv_has = boolc( sy-subrc IS INITIAL ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_empty.
+    rv_yes = boolc( lines( mt_entries ) = 0 ).
+  ENDMETHOD.
+ 
+ 
+  METHOD merge.
+ 
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
+ 
+    LOOP AT io_string_map->mt_entries ASSIGNING <ls_entry>.
+      set(
+        iv_key = <ls_entry>-k
+        iv_val = <ls_entry>-v ).
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set.
+ 
+    DATA lv_key LIKE iv_key.
+    DATA ls_entry LIKE LINE OF mt_entries.
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
+ 
+    IF mv_read_only = abap_true.
+      zcx_abapgit_exception=>raise( 'Cannot set. This string map is immutable' ).
+    ENDIF.
+ 
+    IF mv_case_insensitive = abap_true.
+      lv_key = to_upper( iv_key ).
+    ELSE.
+      lv_key = iv_key.
+    ENDIF.
+ 
+    READ TABLE mt_entries ASSIGNING <ls_entry> WITH KEY k = lv_key.
+    IF sy-subrc IS INITIAL.
+      <ls_entry>-v = iv_val.
+    ELSE.
+      ls_entry-k = lv_key.
+      ls_entry-v = iv_val.
+      INSERT ls_entry INTO TABLE mt_entries.
+    ENDIF.
+ 
+    ro_map = me.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD size.
+ 
+    rv_size = lines( mt_entries ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD strict.
+    mv_is_strict = iv_strict.
+    ro_instance = me.
+  ENDMETHOD.
+ 
+ 
+  METHOD to_abap.
+ 
+    DATA lo_type TYPE REF TO cl_abap_typedescr.
+    DATA lv_field TYPE string.
+    FIELD-SYMBOLS <ls_entry> LIKE LINE OF mt_entries.
+    FIELD-SYMBOLS <lv_val> TYPE any.
+ 
+    lo_type = cl_abap_typedescr=>describe_by_data( cs_container ).
+    IF lo_type->type_kind <> cl_abap_typedescr=>typekind_struct1
+      AND lo_type->type_kind <> cl_abap_typedescr=>typekind_struct2.
+      zcx_abapgit_exception=>raise( 'Only structures supported' ).
+    ENDIF.
+ 
+    LOOP AT mt_entries ASSIGNING <ls_entry>.
+      lv_field = to_upper( <ls_entry>-k ).
+      ASSIGN COMPONENT lv_field OF STRUCTURE cs_container TO <lv_val>.
+      IF sy-subrc = 0.
+        " TODO check target type ?
+        <lv_val> = <ls_entry>-v.
+      ELSEIF mv_is_strict = abap_false.
+        CONTINUE.
+      ELSE.
+        zcx_abapgit_exception=>raise( |Component { lv_field } not found in target| ).
+      ENDIF.
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_string_map.clas.testclasses.abap.html b/src/utils/zcl_abapgit_string_map.clas.testclasses.abap.html new file mode 100644 index 00000000000..5b354d9af26 --- /dev/null +++ b/src/utils/zcl_abapgit_string_map.clas.testclasses.abap.html @@ -0,0 +1,628 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_string_map.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_string_map.clas.testclasses.abap

+
+ +
+ 100% + Statements + 181/181 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 181/181 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +1821x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_sm_test DEFINITION
+  FINAL
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_struc,
+        a TYPE string,
+        b TYPE abap_bool,
+        c TYPE i,
+      END OF ty_struc.
+ 
+    METHODS simple FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS freeze FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS strict FOR TESTING RAISING zcx_abapgit_exception.
+    METHODS case_insensitive FOR TESTING RAISING zcx_abapgit_exception.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_sm_test IMPLEMENTATION.
+ 
+  METHOD simple.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_cut = zcl_abapgit_string_map=>create( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( )
+      exp = abap_true ).
+ 
+    lo_cut->set(
+      iv_key = 'A'
+      iv_val = '1' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( )
+      exp = abap_false ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->has( 'A' )
+      exp = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get( 'A' )
+      exp = '1' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->has( 'B' )
+      exp = abap_false ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get( 'B' )
+      exp = '' ).
+ 
+    lo_cut->delete( 'A' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->is_empty( )
+      exp = abap_true ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->has( 'A' )
+      exp = abap_false ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lo_cut->get( 'A' )
+      exp = '' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD freeze.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_cut = zcl_abapgit_string_map=>create( ).
+    lo_cut->set(
+      iv_key = 'A'
+      iv_val = '1' )->freeze( ).
+ 
+    TRY.
+        lo_cut->set(
+          iv_key = 'B'
+          iv_val = '2' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        lo_cut->delete( 'A' ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+    TRY.
+        lo_cut->clear( ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD strict.
+ 
+    DATA ls_struc_act TYPE ty_struc.
+    DATA ls_struc_exp TYPE ty_struc.
+    DATA lo_x TYPE REF TO cx_root.
+    DATA lo_cut TYPE REF TO zcl_abapgit_string_map.
+    DATA lo_map TYPE REF TO zcl_abapgit_string_map.
+ 
+    lo_cut = zcl_abapgit_string_map=>create( ).
+ 
+    lo_cut->set(
+      iv_key = 'a'
+      iv_val = 'avalue' ).
+    lo_cut->set(
+      iv_key = 'b'
+      iv_val = 'X' ).
+    lo_cut->set(
+      iv_key = 'c'
+      iv_val = '123' ).
+    lo_cut->set(
+      iv_key = 'z'
+      iv_val = 'xyz' ).
+ 
+    ls_struc_exp-a = 'avalue'.
+    ls_struc_exp-b = abap_true.
+    ls_struc_exp-c = 123.
+ 
+    TRY.
+        lo_cut->to_abap( CHANGING cs_container = ls_struc_act ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH cx_root INTO lo_x.
+        cl_abap_unit_assert=>assert_equals(
+          exp = 'Component Z not found in target'
+          act = lo_x->get_text( ) ).
+    ENDTRY.
+ 
+    lo_map = lo_cut->strict( abap_false ).
+    lo_map->to_abap( CHANGING cs_container = ls_struc_act ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = ls_struc_exp
+      act = ls_struc_act ).
+ 
+  ENDMETHOD.
+ 
+  METHOD case_insensitive.
+ 
+    DATA lo_cut TYPE REF TO zcl_abapgit_string_map.
+    lo_cut = zcl_abapgit_string_map=>create( iv_case_insensitive = abap_true ).
+ 
+    lo_cut->set(
+      iv_key = 'A'
+      iv_val = 'avalue' ).
+    lo_cut->set(
+      iv_key = 'b'
+      iv_val = 'bvalue' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'avalue'
+      act = lo_cut->get( 'A' ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'avalue'
+      act = lo_cut->get( 'a' ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'bvalue'
+      act = lo_cut->get( 'B' ) ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      exp = 'bvalue'
+      act = lo_cut->get( 'b' ) ).
+ 
+  ENDMETHOD.
+ 
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_timer.clas.abap.html b/src/utils/zcl_abapgit_timer.clas.abap.html new file mode 100644 index 00000000000..f7900baf597 --- /dev/null +++ b/src/utils/zcl_abapgit_timer.clas.abap.html @@ -0,0 +1,403 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_timer.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_timer.clas.abap

+
+ +
+ 96.22% + Statements + 102/106 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 96.22% + Lines + 102/106 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +1071x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_timer DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS create
+      IMPORTING
+        !iv_text        TYPE string OPTIONAL
+        !iv_count       TYPE i OPTIONAL
+          PREFERRED PARAMETER iv_text
+      RETURNING
+        VALUE(ro_timer) TYPE REF TO zcl_abapgit_timer.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_text  TYPE string OPTIONAL
+        !iv_count TYPE i OPTIONAL.
+ 
+    METHODS start
+      RETURNING
+        VALUE(ro_timer) TYPE REF TO zcl_abapgit_timer.
+ 
+    METHODS end
+      IMPORTING
+        !iv_output_as_status_message TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_result)             TYPE string.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mv_text TYPE string.
+    DATA mv_count TYPE i.
+    DATA mv_timer TYPE timestampl.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_timer IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mv_text  = iv_text.
+    mv_count = iv_count.
+  ENDMETHOD.
+ 
+ 
+  METHOD create.
+    CREATE OBJECT ro_timer
+      EXPORTING
+        iv_text  = iv_text
+        iv_count = iv_count.
+  ENDMETHOD.
+ 
+ 
+  METHOD end.
+ 
+    DATA:
+      lv_timestamp TYPE timestampl,
+      lv_runtime   TYPE timestampl,
+      lv_sec       TYPE p LENGTH 11 DECIMALS 2.
+ 
+    IF mv_timer IS INITIAL.
+      rv_result = 'Runtime measurement has not been started'.
+    ELSE.
+      GET TIME STAMP FIELD lv_timestamp.
+ 
+      TRY.
+          lv_runtime = cl_abap_tstmp=>subtract(
+            tstmp1 = lv_timestamp
+            tstmp2 = mv_timer ).
+ 
+          lv_sec = lv_runtime. " round to 2 decimal places
+ 
+          IF mv_count = 1.
+            rv_result = |1 object, |.
+          ELSEIF mv_count > 1.
+            rv_result = |{ mv_count } objects, |.
+          ENDIF.
+ 
+          rv_result = rv_result && |{ lv_sec } seconds|.
+ 
+        CATCH cx_parameter_invalid.
+          rv_result = 'Error getting runtime measurement'.
+      ENDTRY.
+    ENDIF.
+ 
+    IF iv_output_as_status_message = abap_true.
+      MESSAGE s000(oo) WITH mv_text rv_result.
+    ENDIF.
+ 
+    IF mv_text IS NOT INITIAL.
+      rv_result = |{ mv_text } { rv_result }|.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD start.
+    GET TIME STAMP FIELD mv_timer.
+    ro_timer = me.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_timer.clas.testclasses.abap.html b/src/utils/zcl_abapgit_timer.clas.testclasses.abap.html new file mode 100644 index 00000000000..9e270bd9772 --- /dev/null +++ b/src/utils/zcl_abapgit_timer.clas.testclasses.abap.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_timer.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_timer.clas.testclasses.abap

+
+ +
+ 100% + Statements + 81/81 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 81/81 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +821x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +4x +4x +4x +4x +4x +4x +4x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_timer DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+  PRIVATE SECTION.
+ 
+    METHODS:
+      check_result
+        IMPORTING
+          iv_result TYPE string
+          iv_regex  TYPE string,
+ 
+      run_timer FOR TESTING,
+      run_timer_with_count FOR TESTING,
+      run_timer_with_text FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_timer IMPLEMENTATION.
+ 
+  METHOD check_result.
+ 
+    FIND REGEX iv_regex IN iv_result.
+ 
+    cl_abap_unit_assert=>assert_subrc(
+      act = sy-subrc
+      msg = 'Did not return right measurement' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD run_timer.
+ 
+    DATA lo_timer TYPE REF TO zcl_abapgit_timer.
+ 
+    lo_timer = zcl_abapgit_timer=>create( )->start( ).
+ 
+    WAIT UP TO 1 SECONDS.
+ 
+    check_result(
+      iv_result = lo_timer->end( )
+      iv_regex  = '1.0[0-9] seconds' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD run_timer_with_count.
+ 
+    DATA lo_timer TYPE REF TO zcl_abapgit_timer.
+ 
+    lo_timer = zcl_abapgit_timer=>create( iv_count = 1 )->start( ).
+ 
+    WAIT UP TO 1 SECONDS.
+ 
+    check_result(
+      iv_result = lo_timer->end( )
+      iv_regex  = '1 object, 1.0[0-9] seconds' ).
+ 
+    lo_timer = zcl_abapgit_timer=>create( iv_count = 1234 )->start( ).
+ 
+    WAIT UP TO 1 SECONDS.
+ 
+    check_result(
+      iv_result = lo_timer->end( )
+      iv_regex  = '1234 objects, 1.0[0-9] seconds' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD run_timer_with_text.
+ 
+    CONSTANTS lc_total TYPE string VALUE 'Total:'.
+ 
+    DATA lo_timer TYPE REF TO zcl_abapgit_timer.
+ 
+    lo_timer = zcl_abapgit_timer=>create( lc_total )->start( ).
+ 
+    WAIT UP TO 1 SECONDS.
+ 
+    check_result(
+      iv_result = lo_timer->end( )
+      iv_regex  = |{ lc_total } 1.0[0-9] seconds| ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_user_record.clas.abap.html b/src/utils/zcl_abapgit_user_record.clas.abap.html new file mode 100644 index 00000000000..57206c29387 --- /dev/null +++ b/src/utils/zcl_abapgit_user_record.clas.abap.html @@ -0,0 +1,733 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_user_record.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_user_record.clas.abap

+
+ +
+ 77.77% + Statements + 168/216 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 77.77% + Lines + 168/216 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +2171x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_user_record DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+    CLASS-METHODS reset.
+    CLASS-METHODS get_instance
+      IMPORTING
+        !iv_user       TYPE sy-uname
+      RETURNING
+        VALUE(ro_user) TYPE REF TO zcl_abapgit_user_record.
+    METHODS constructor
+      IMPORTING
+        !iv_user TYPE sy-uname.
+    METHODS get_name
+      RETURNING
+        VALUE(rv_name) TYPE zif_abapgit_git_definitions=>ty_git_user-name.
+    METHODS get_email
+      RETURNING
+        VALUE(rv_email) TYPE zif_abapgit_git_definitions=>ty_git_user-email.
+    CLASS-METHODS get_title
+      IMPORTING
+        iv_username     TYPE sy-uname
+      RETURNING
+        VALUE(rv_title) TYPE string.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_user,
+        user   TYPE sy-uname,
+        o_user TYPE REF TO zcl_abapgit_user_record,
+      END OF ty_user.
+ 
+    TYPES:
+      ty_smtp TYPE STANDARD TABLE OF bapiadsmtp WITH DEFAULT KEY.
+ 
+    TYPES:
+      ty_dev_clients TYPE SORTED TABLE OF sy-mandt WITH UNIQUE KEY table_line.
+ 
+    CLASS-DATA:
+      gt_user TYPE HASHED TABLE OF ty_user
+                   WITH UNIQUE KEY user.
+ 
+    DATA:
+      ms_user TYPE zif_abapgit_git_definitions=>ty_git_user.
+ 
+    METHODS check_user_exists
+      IMPORTING
+        VALUE(iv_user)    TYPE sy-uname
+      EXPORTING
+        VALUE(es_address) TYPE bapiaddr3
+        VALUE(et_smtp)    TYPE ty_smtp
+      RAISING
+        zcx_abapgit_exception.
+ 
+    METHODS get_user_dtls_from_other_clnt
+      IMPORTING
+        iv_user TYPE sy-uname.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_user_record IMPLEMENTATION.
+ 
+ 
+  METHOD get_title.
+* the queried username might not exist, so this method is static
+ 
+    DATA ls_user_address TYPE addr3_val.
+ 
+    CALL FUNCTION 'SUSR_USER_ADDRESS_READ'
+      EXPORTING
+        user_name              = iv_username
+      IMPORTING
+        user_address           = ls_user_address
+      EXCEPTIONS
+        user_address_not_found = 1
+        OTHERS                 = 2.
+    IF sy-subrc = 0.
+      rv_title = ls_user_address-name_text.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+  METHOD check_user_exists.
+
+    DATA lt_return TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY.
+
+    CALL FUNCTION 'BAPI_USER_GET_DETAIL'
+      EXPORTING
+        username = iv_user
+      IMPORTING
+        address  = es_address
+      TABLES
+        return   = lt_return
+        addsmtp  = et_smtp.
+    LOOP AT lt_return TRANSPORTING NO FIELDS WHERE type CA 'EA'.
+      zcx_abapgit_exception=>raise( |User: { iv_user } not found| ).
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD constructor.
+ 
+    DATA:
+      ls_address   TYPE bapiaddr3,
+      lt_smtp      TYPE TABLE OF bapiadsmtp,
+      ls_smtp      TYPE bapiadsmtp,
+      ls_user      TYPE ty_user,
+      lo_exception TYPE REF TO zcx_abapgit_exception.
+ 
+    "Get user details
+    TRY.
+        check_user_exists(
+          EXPORTING
+            iv_user    = iv_user
+          IMPORTING
+            es_address = ls_address
+            et_smtp    = lt_smtp ).
+ 
+        " Choose the first email from SU01
+        SORT lt_smtp BY consnumber ASCENDING.
+ 
+        LOOP AT lt_smtp INTO ls_smtp.
+          ms_user-email = ls_smtp-e_mail.
+          EXIT.
+        ENDLOOP.
+ 
+        " Attempt to use the full name from SU01
+        ms_user-name = ls_address-fullname.
+      CATCH zcx_abapgit_exception INTO lo_exception.
+        "Could not find user,try to get from other clients
+        get_user_dtls_from_other_clnt( iv_user ).
+    ENDTRY.
+ 
+    " If the user has been found add it to the list
+    IF ms_user-name IS NOT INITIAL AND ms_user-email IS NOT INITIAL.
+      ls_user-user = iv_user.
+      ls_user-o_user = me.
+      INSERT ls_user INTO TABLE gt_user.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_email.
+ 
+    rv_email = ms_user-email.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_instance.
+ 
+    FIELD-SYMBOLS: <ls_user> TYPE ty_user.
+ 
+    READ TABLE gt_user ASSIGNING <ls_user> WITH TABLE KEY user = iv_user.
+    IF sy-subrc = 0.
+      ro_user = <ls_user>-o_user.
+    ELSE.
+      CREATE OBJECT ro_user
+        EXPORTING
+          iv_user = iv_user.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_name.
+ 
+    rv_name = ms_user-name.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_user_dtls_from_other_clnt.
+
+    CONSTANTS lc_cc_category TYPE string VALUE 'C'.
+
+    DATA lt_dev_clients TYPE ty_dev_clients.
+
+    FIELD-SYMBOLS: <lv_dev_client> LIKE LINE OF lt_dev_clients.
+
+    " Could not find the user Try other development clients
+    SELECT mandt FROM t000 INTO TABLE lt_dev_clients
+        WHERE cccategory = lc_cc_category AND mandt <> sy-mandt
+        ORDER BY PRIMARY KEY.
+
+    LOOP AT lt_dev_clients ASSIGNING <lv_dev_client>.
+      SELECT SINGLE p~name_text a~smtp_addr INTO (ms_user-name,ms_user-email)
+          FROM usr21 AS u
+          INNER JOIN adrp AS p ON p~persnumber = u~persnumber
+                              AND p~client     = u~mandt
+          INNER JOIN adr6 AS a ON a~persnumber = u~persnumber
+                              AND a~addrnumber = u~addrnumber
+                              AND a~client     = u~mandt
+          CLIENT SPECIFIED
+          WHERE u~mandt      = <lv_dev_client>
+            AND u~bname      = iv_user
+            AND p~date_from <= sy-datum
+            AND p~date_to   >= sy-datum
+            AND a~date_from <= sy-datum.
+      IF sy-subrc = 0.
+        EXIT.
+      ENDIF.
+    ENDLOOP.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD reset.
+    CLEAR gt_user.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_user_record.clas.testclasses.abap.html b/src/utils/zcl_abapgit_user_record.clas.testclasses.abap.html new file mode 100644 index 00000000000..d274de1b6cd --- /dev/null +++ b/src/utils/zcl_abapgit_user_record.clas.testclasses.abap.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_user_record.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_user_record.clas.testclasses.abap

+
+ +
+ 66.66% + Statements + 20/30 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 66.66% + Lines + 20/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +311x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS ltcl_user_record DEFINITION DEFERRED.
+ 
+CLASS zcl_abapgit_user_record DEFINITION LOCAL FRIENDS ltcl_user_record.
+ 
+CLASS ltcl_user_record DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    CONSTANTS c_wrong_user TYPE sy-uname VALUE 'WRONG_USER'.
+    METHODS:
+      test_invalid_user FOR TESTING RAISING cx_static_check.
+ENDCLASS.
+ 
+ 
+CLASS ltcl_user_record IMPLEMENTATION.
+ 
+  METHOD test_invalid_user.
+    DATA: lo_user_record TYPE REF TO zcl_abapgit_user_record.
+
+    zcl_abapgit_user_record=>reset( ).
+    lo_user_record = zcl_abapgit_user_record=>get_instance( c_wrong_user ).
+
+    cl_abap_unit_assert=>assert_equals(
+      exp = 0
+      act = lines( zcl_abapgit_user_record=>gt_user )
+      msg = |User { c_wrong_user } is missing in the list| ).
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_utils.clas.abap.html b/src/utils/zcl_abapgit_utils.clas.abap.html new file mode 100644 index 00000000000..96cff1e4d11 --- /dev/null +++ b/src/utils/zcl_abapgit_utils.clas.abap.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_utils.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_utils.clas.abap

+
+ +
+ 97.77% + Statements + 88/90 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 97.77% + Lines + 88/90 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +911x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_utils DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS is_binary
+      IMPORTING
+        !iv_data            TYPE xstring
+      RETURNING
+        VALUE(rv_is_binary) TYPE abap_bool.
+    CLASS-METHODS is_valid_email
+      IMPORTING
+        iv_email        TYPE string
+      RETURNING
+        VALUE(rv_valid) TYPE abap_bool.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_utils IMPLEMENTATION.
+ 
+ 
+  METHOD is_binary.
+ 
+    " Previously we did a simple char range test described here
+    " stackoverflow.com/questions/277521/how-to-identify-the-file-content-as-ascii-or-binary
+    " but this is insufficient if the data contains german umlauts and other special characters.
+    " Therefore we adopted another algorithm, which is similarily used by AL11
+    " RSWATCH0 / GUESS_FILE_TYPE
+    " We count non-printable characters if there are more than XX% it's binary.
+ 
+    CONSTANTS:
+      lc_binary_threshold TYPE i VALUE 10,
+      lc_bytes_to_check   TYPE i VALUE 1000.
+ 
+    DATA: lv_string_data           TYPE string,
+          lv_printable_chars_count TYPE i,
+          lv_percentage            TYPE i,
+          lv_data                  TYPE xstring,
+          lv_xlen                  TYPE i.
+ 
+    lv_xlen = xstrlen( iv_data ).
+    IF lv_xlen = 0.
+      RETURN.
+    ENDIF.
+ 
+    lv_xlen = nmin(
+                val1 = lv_xlen
+                val2 = lc_bytes_to_check ).
+ 
+    lv_data = iv_data(lv_xlen).
+ 
+    TRY.
+        lv_string_data = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
+      CATCH zcx_abapgit_exception.
+        " Contains data that does not convert to UTF-8 so consider it binary
+        rv_is_binary = abap_true.
+        RETURN.
+    ENDTRY.
+ 
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN lv_string_data WITH space.
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_string_data WITH space.
+ 
+    FIND ALL OCCURRENCES OF REGEX '[^[:print:]]' IN lv_string_data MATCH COUNT lv_printable_chars_count.
+    lv_percentage = lv_printable_chars_count * 100 / strlen( lv_string_data ).
+    rv_is_binary = boolc( lv_percentage > lc_binary_threshold ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD is_valid_email.
+ 
+    " Email address validation (RFC 5322)
+    " https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s01.html
+    CONSTANTS lc_email_regex TYPE string VALUE
+      '[\w!#$%&*+/=?`{|}~^-]+(?:\.[\w!#$%&*+/=?`{|}~^-]+)*@(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,6}'.
+ 
+    IF iv_email IS INITIAL.
+      rv_valid = abap_true.
+    ELSE.
+      FIND REGEX lc_email_regex IN iv_email.
+      rv_valid = boolc( sy-subrc = 0 ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_utils.clas.testclasses.abap.html b/src/utils/zcl_abapgit_utils.clas.testclasses.abap.html new file mode 100644 index 00000000000..4f4e2fd972b --- /dev/null +++ b/src/utils/zcl_abapgit_utils.clas.testclasses.abap.html @@ -0,0 +1,661 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_utils.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_utils.clas.testclasses.abap

+
+ +
+ 100% + Statements + 192/192 +
+ + +
+ 100% + Branches + 10/10 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 100% + Lines + 192/192 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +1931x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +3x +3x +3x +3x +1x +1x +1x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_is_binary DEFINITION FINAL FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      class_constructor.
+ 
+  PRIVATE SECTION.
+    DATA mv_given_file TYPE xstring.
+    DATA mv_act_is_binary TYPE abap_bool.
+    CLASS-DATA:
+      gv_nl    TYPE c LENGTH 1,
+      gv_cr_lf TYPE c LENGTH 2.
+ 
+    METHODS:
+      cds_metadata_is_text FOR TESTING RAISING cx_static_check,
+      cds_with_umlaut_is_text FOR TESTING RAISING cx_static_check,
+      image_is_binary FOR TESTING RAISING cx_static_check,
+ 
+      given_file
+        IMPORTING
+          iv_file TYPE string
+        RAISING zcx_abapgit_exception,
+      given_image,
+      given_cds_metadata
+        RAISING zcx_abapgit_exception,
+      given_cds_view_with_umlaut
+        RAISING zcx_abapgit_exception,
+ 
+      when_is_binary_determined
+        RAISING zcx_abapgit_exception,
+ 
+      then_is_not_binary,
+      then_is_binary.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_is_binary IMPLEMENTATION.
+ 
+  METHOD class_constructor.
+ 
+    gv_nl    = cl_abap_char_utilities=>newline.
+    gv_cr_lf = cl_abap_char_utilities=>cr_lf.
+ 
+  ENDMETHOD.
+ 
+  METHOD cds_metadata_is_text.
+ 
+    given_cds_metadata( ).
+    when_is_binary_determined( ).
+    then_is_not_binary( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD cds_with_umlaut_is_text.
+ 
+    given_cds_view_with_umlaut( ).
+    when_is_binary_determined( ).
+    then_is_not_binary( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD image_is_binary.
+ 
+    given_image( ).
+    when_is_binary_determined( ).
+    then_is_binary( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_file.
+ 
+    mv_given_file = zcl_abapgit_convert=>string_to_xstring_utf8( iv_file ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_image.
+ 
+    mv_given_file =
+        zcl_abapgit_convert=>base64_to_xstring(
+              `iVBORw0KGgoAAAANSUhEUgAAALEAAAA1CAYAAAAOCAoLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8Y`
+           && `QUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAecSURBVHhe7ZvLilxVFIb1BfQFdOxAcaAgJIgX8B4HOkkPHB`
+           && `kxOjFiFBRaEIzowIEYBVGQBMULeIsjFeNI0YGT6EzsB+jETuIblP0V7mbVqn/vs06dc6rqdPbgg+4+a1/`
+           && `O3t++VvVV29vbk0plzFSJK6OnSlwZPVXiyuipEldGT5W4MnoGk3jn848nl44/Pdn58D35vFLpi0Ekvvjy`
+           && `85N/b795D35XcZVKH/QusRe4ilwZml4lzgmcqCJXhqBXiXc2j0t5LVXkSt/0IvGFn37Y+7mKXFk2nSVOW`
+           && `4h/Pvto729V5Moy6SRxEjjhRb549LGZ554q8v7j15/PTs5+/80U9XwIFpbYC5ywIidKM/OqRf7j3O+Tt9`
+           && `54QfLjd1/LNBUNbXbbDVfvsXHopsnW33/J2D5ZSOKcwInzv/0yl+bSI/fIWFilyGe+ODXT8BY6RaXZbzC`
+           && `QP3j3xOTYEw9OjmwcnGmDu2+9dvo32oJZVqUHZLXpEu+/86qM75PWEjcJDDLdmm4t/Oxh2e8SI6WXtomH`
+           && `77x+8unpk3N5sWqp+GW0YSuJIwKD3FK8/oqMtaxCZGaQT069Pdl46MaVdMCq4J39+7ZB5aniSjMxz1Lc4`
+           && `4cPyJgIYYmjAk+5/+DMtVtinW8t1LZiv0pcWn0AoRLqOah8rZTAxFDaE5/YfHIvdnCJWwn8P2wfSIvMY7`
+           && `h+U8vhfpQ4t+wfuuO66eys0qgBruKA/TVlRA7FlJnyG1TiRQQGKzG/r7vIV4rEVpxE04wJPo2KaYMfGIN`
+           && `JHNnH5vASw9xeeWur9+u3dE/JafvMl6enP5dO1YkmiZlh0v0ntLk6Ijalo17pZ/JU8W3w9VIxidw+ONI+`
+           && `Xn4VE8VvO2AQibkmU2JFURJD2+s3dUj0IMlLz25MT86+cRJcFSFlTr6cxPw9d4J/bfNoUWbScm2l0ia4S`
+           && `yXOp6VsFZ8OSgip3je9p88P1B73xWOHZayH/SvpUx72mWq7hK2L3QNHyL2HJyvxhW+/klJFyUnM774sYm`
+           && `2MZefkm3PxFiSi41QjKBBS5aM6ojQoEkio8mt7+md5telzElN/ylTPLAxqmx+ouMgs3ET0rl0NohKdJWa`
+           && `pv3zfASlWhJzEama9/Oi9MzEWJb2FmUQ1AA121y3XyGdq5ivNJk34xs4NLJZkdZUHDBibB3nm6h/FDozc`
+           && `+9kyF4Vy1F4bVivxLiz9i4qck3jm+m13oJQOjpGthO9oGtMu8Wr/xbJm84BcJ5M/A4UGzQ0YhG3KK20Dg`
+           && `Popmf0embhnjjwwFwe2XrkYu0qoOiGVLa8rqq2tiMz61EPF0R48s0TPDEWJYVGRsxIHiQgMdCCdkWZeNX`
+           && `p9g6nOo9F8HHnbAQG5bQLpbV6pTsBzv2xTz1IepTg1CFUcpPqr56oduqDaUPWHiutSl0aJYRGRu0gcFTh`
+           && `KpMGiHQBq6czF5lBSRSVWceDjbKzKpyQOg440Tdi6RNtQxQ0uMbQRmbiZLcNzT8k4Rd8CQ6TBoh0A6pSd`
+           && `i81BvM/DCtE2DngvH5v2xWoFKYmjylXY9157iSEq8pyIwUNiF4HZP/HFFBqNkzmn+ESkwdpIrDqYrYeKJ`
+           && `V/iIX1LDNTNh5JTlaXiQEmc3kG9H/g8Ern9vyflD9E2VHFLkxgiIp//89xcutI1GiwqMHs+pPWNUmIIie`
+           && `l0G8MMGLmisyg5VVkqDkoSM8j9M8hdsTFzkxaU0OkgZtNE21DFLVViaBKZO+aZNMzEhWu0LgI33ZmqW4A`
+           && `hJLaxpXtT4ACq9tVKTlWWigMlsY31NzmgDomeqHTRNozmF2UhiaEkMsLyfBrbwzVajtxVjZ9dfExXidWV`
+           && `lo1VA4fn9qYjKmc0DtTAsG2h9vJcD/obGE9UumgbRvOLsrDE0DQjl2Zf6CIwKJlUB/uYLh1Ah/s4sOX6Z`
+           && `8hl84C+JUZWHwc2JrelYDUriazaZt9IDJE9sqKrwMCL+8awn1KB6lzVYHJW3+1cP6vnDjxJAiW5/zAkl0`
+           && `9UYg6I9oMAylTbKnXYVLMxkF6VD31LrAZTZEXI0VliaCtyHwJDbnnkm2KQO/DRYT4vJUuC+NyNAvhDnYp`
+           && `BPOpEObl8/ACEUr3STQfvrJ6r/KbCi+1OgrqRJ+XyBafceyuJ1Vkgt+f2cUA7Uy7QXr5dc/QiMURF7ktg`
+           && `aPslG4+dqUqylOCwZGdFUCtEG3ivrvXKXflBk8gRrMSRfvBCRtpIrWCK3iSGJpH7FDjR1Bl0ptoqgO0It`
+           && `b9u6hwEVkuwWlYtpCPvXEcibspLSdz0zjxvWpp5Tt7qxiJCUx09tq2hqY0Sqn09vUoMOZGHEBjoDEa57w`
+           && `ykTMsp+1oa0WOXOn5Wz0jrBacsyvQzsIXG97JxwLPpGFy2zETTTEze4OtF/sQ3CWwhlvKol7rdSFAvYoj`
+           && `1+acBWUJtK9Q7AO1GvD+P5OhdYkDk9EV3hB5K4GXTRo6+yEmsYvtkFe+6aJmDSDxla2v6/Qn16V0lzqok`
+           && `HhPDSVzphSpxM1XiNYa9s/ofvfTPpqtY8teRKvGaombgHCr9lUSVeE2pEsepEq8p7HsROYJKfyVRJa6Mn`
+           && `ipxZfRUiSujp0pcGT1V4sroqRJXRk+VuDJytif/Aa8ZlmVpfNVQAAAAAElFTkSuQmCC` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_cds_metadata.
+ 
+    given_file( `{`
+    && gv_nl && `"BASEINFO":`
+    && gv_nl && `{`
+    && gv_nl && `"FROM":`
+    && gv_nl && `[`
+    && gv_nl && `"T100"`
+    && gv_nl && `],`
+    && gv_nl && `"ASSOCIATED":`
+    && gv_nl && `[],`
+    && gv_nl && `"BASE":`
+    && gv_nl && `[],`
+    && gv_nl && `"ANNO_REF":`
+    && gv_nl && `[],`
+    && gv_nl && `"VERSION":0`
+    && gv_nl && `}`
+    && gv_nl && `}` ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD given_cds_view_with_umlaut.
+ 
+    CONSTANTS lc_umlaut_ue TYPE xstring VALUE `C3BC`.
+ 
+    given_file(     `@EndUserText.label: `
+                 && zcl_abapgit_convert=>xstring_to_string_utf8( lc_umlaut_ue )
+                 && `bernahmekandidat'`
+     && gv_cr_lf && `@AbapCatalog.sqlViewName: 'ZTESTDDLSBUG2'`
+     && gv_cr_lf && `@AbapCatalog.compiler.compareFilter: true`
+     && gv_cr_lf && `@AbapCatalog.preserveKey: true`
+     && gv_cr_lf && `@AccessControl.authorizationCheck: #CHECK`
+     && gv_cr_lf && `define view ztest_ddls_bug2`
+     && gv_cr_lf && `  as select from t100`
+     && gv_cr_lf && `{`
+     && gv_cr_lf && `  key sprsl as Sprsl,`
+     && gv_cr_lf && `  key arbgb as Arbgb,`
+     && gv_cr_lf && `  key msgnr as Msgnr,`
+     && gv_cr_lf && `      text  as Text`
+     && gv_cr_lf && `}` ).
+ 
+  ENDMETHOD.
+ 
+  METHOD when_is_binary_determined.
+ 
+    mv_act_is_binary = zcl_abapgit_utils=>is_binary( mv_given_file ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD then_is_not_binary.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mv_act_is_binary
+      exp = abap_false ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD then_is_binary.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = mv_act_is_binary
+      exp = abap_true ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_version.clas.abap.html b/src/utils/zcl_abapgit_version.clas.abap.html new file mode 100644 index 00000000000..2f9baca5cf6 --- /dev/null +++ b/src/utils/zcl_abapgit_version.clas.abap.html @@ -0,0 +1,913 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_version.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_version.clas.abap

+
+ +
+ 79.34% + Statements + 219/276 +
+ + +
+ 43.47% + Branches + 10/23 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 79.34% + Lines + 219/276 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +2771x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +17x +17x +4x +1x +10x +10x +3x +3x +3x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +18x +18x +18x +18x +18x +18x +18x +18x +18x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +2x +2x +12x +12x +12x +12x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_version DEFINITION
+  PUBLIC
+  FINAL
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS normalize
+      IMPORTING
+        !iv_version       TYPE string
+      RETURNING
+        VALUE(rv_version) TYPE string .
+    CLASS-METHODS conv_str_to_version
+      IMPORTING
+        !iv_version       TYPE csequence
+      RETURNING
+        VALUE(rs_version) TYPE zif_abapgit_definitions=>ty_version
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS check_dependant_version
+      IMPORTING
+        !is_current   TYPE zif_abapgit_definitions=>ty_version
+        !is_dependant TYPE zif_abapgit_definitions=>ty_version
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS compare
+      IMPORTING
+        !iv_a            TYPE string OPTIONAL
+        !iv_b            TYPE string OPTIONAL
+        !is_a            TYPE zif_abapgit_definitions=>ty_version OPTIONAL
+        !is_b            TYPE zif_abapgit_definitions=>ty_version OPTIONAL
+      RETURNING
+        VALUE(rv_result) TYPE i .
+    CLASS-METHODS get_version_constant_value
+      IMPORTING
+        iv_version_constant TYPE string
+      RETURNING
+        VALUE(rv_version)   TYPE string
+      RAISING
+        zcx_abapgit_exception.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS version_to_numeric
+      IMPORTING
+        !iv_version       TYPE string
+      RETURNING
+        VALUE(rv_version) TYPE i.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_version IMPLEMENTATION.
+ 
+ 
+  METHOD check_dependant_version.
+ 
+    CONSTANTS: lc_message TYPE string VALUE 'Current version is older than required'.
+ 
+    IF is_dependant-major > is_current-major.
+      zcx_abapgit_exception=>raise( lc_message ).
+    ELSEIF is_dependant-major < is_current-major.
+      RETURN.
+    ENDIF.
+ 
+    IF is_dependant-minor > is_current-minor.
+      zcx_abapgit_exception=>raise( lc_message ).
+    ELSEIF is_dependant-minor < is_current-minor.
+      RETURN.
+    ENDIF.
+ 
+    IF is_dependant-patch > is_current-patch.
+      zcx_abapgit_exception=>raise( lc_message ).
+    ELSEIF is_dependant-patch < is_current-patch.
+      RETURN.
+    ENDIF.
+
+    IF is_current-prerelase IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    CASE is_current-prerelase.
+      WHEN 'rc'.
+        IF is_dependant-prerelase = ''.
+          zcx_abapgit_exception=>raise( lc_message ).
+        ENDIF.
+
+      WHEN 'beta'.
+        IF is_dependant-prerelase = '' OR is_dependant-prerelase = 'rc'.
+          zcx_abapgit_exception=>raise( lc_message ).
+        ENDIF.
+
+      WHEN 'alpha'.
+        IF is_dependant-prerelase = '' OR is_dependant-prerelase = 'rc' OR is_dependant-prerelase = 'beta'.
+          zcx_abapgit_exception=>raise( lc_message ).
+        ENDIF.
+
+    ENDCASE.
+
+    IF is_dependant-prerelase = is_current-prerelase AND is_dependant-prerelase_patch > is_current-prerelase_patch.
+      zcx_abapgit_exception=>raise( lc_message ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD compare.
+ 
+    DATA: ls_version_a TYPE zif_abapgit_definitions=>ty_version,
+          ls_version_b TYPE zif_abapgit_definitions=>ty_version.
+ 
+    TRY.
+        IF is_a IS NOT INITIAL.
+          ls_version_a = is_a.
+        ELSE.
+          ls_version_a = conv_str_to_version( iv_a ).
+        ENDIF.
+ 
+        IF is_b IS NOT INITIAL.
+          ls_version_b = is_b.
+        ELSE.
+          ls_version_b = conv_str_to_version( iv_b ).
+        ENDIF.
+      CATCH zcx_abapgit_exception.
+        rv_result = 0.
+        RETURN.
+    ENDTRY.
+ 
+    IF ls_version_a = ls_version_b.
+      rv_result = 0.
+    ELSE.
+      TRY.
+          check_dependant_version( is_current   = ls_version_a
+                                   is_dependant = ls_version_b ).
+          rv_result = 1.
+        CATCH zcx_abapgit_exception.
+          rv_result = -1.
+          RETURN.
+      ENDTRY.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD conv_str_to_version.
+ 
+    DATA: lt_segments TYPE STANDARD TABLE OF string,
+          lt_parts    TYPE STANDARD TABLE OF string,
+          lv_segment  TYPE string.
+ 
+    SPLIT iv_version AT '-' INTO TABLE lt_segments.
+ 
+    READ TABLE lt_segments INTO lv_segment INDEX 1. " Version
+    IF sy-subrc <> 0.   " No version
+      RETURN.
+    ENDIF.
+ 
+    SPLIT lv_segment AT '.' INTO TABLE lt_parts.
+ 
+    LOOP AT lt_parts INTO lv_segment.
+ 
+      TRY.
+          CASE sy-tabix.
+            WHEN 1.
+              rs_version-major = lv_segment.
+            WHEN 2.
+              rs_version-minor = lv_segment.
+            WHEN 3.
+              rs_version-patch = lv_segment.
+          ENDCASE.
+        CATCH cx_sy_conversion_no_number.
+          zcx_abapgit_exception=>raise( 'Incorrect format for Semantic Version' ).
+      ENDTRY.
+ 
+    ENDLOOP.
+ 
+    READ TABLE lt_segments INTO lv_segment INDEX 2. " Pre-release Version
+    IF sy-subrc <> 0.   " No version
+      RETURN.
+    ENDIF.
+
+    SPLIT lv_segment AT '.' INTO TABLE lt_parts.
+
+    LOOP AT lt_parts INTO lv_segment.
+
+      CASE sy-tabix.
+        WHEN 1.
+          rs_version-prerelase = lv_segment.
+          TRANSLATE rs_version-prerelase TO LOWER CASE.
+        WHEN 2.
+          rs_version-prerelase_patch = lv_segment.
+      ENDCASE.
+
+    ENDLOOP.
+
+    IF rs_version-prerelase <> 'rc' AND rs_version-prerelase <> 'beta' AND rs_version-prerelase <> 'alpha'.
+      zcx_abapgit_exception=>raise( 'Incorrect format for Semantic Version' ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize.
+ 
+    " Internal program version should be in format "XXX.XXX.XXX" or "vXXX.XXX.XXX"
+    CONSTANTS:
+      lc_version_pattern    TYPE string VALUE '^v?(\d{1,3}\.\d{1,3}\.\d{1,3})\s*$',
+      lc_prerelease_pattern TYPE string VALUE '^((rc|beta|alpha)\.\d{1,3})\s*$'.
+ 
+    DATA: lv_version      TYPE string,
+          lv_prerelease   TYPE string,
+          lv_version_n    TYPE string,
+          lv_prerelease_n TYPE string.
+ 
+    SPLIT iv_version AT '-' INTO lv_version lv_prerelease.
+ 
+    FIND FIRST OCCURRENCE OF REGEX lc_version_pattern
+      IN lv_version SUBMATCHES lv_version_n.
+ 
+    IF lv_prerelease IS NOT INITIAL.
+
+      FIND FIRST OCCURRENCE OF REGEX lc_prerelease_pattern
+        IN lv_prerelease SUBMATCHES lv_prerelease_n.
+
+    ENDIF.
+ 
+    IF lv_version_n IS INITIAL.
+      RETURN.
+    ENDIF.
+ 
+    rv_version = lv_version_n.
+ 
+    IF lv_prerelease_n IS NOT INITIAL.
+      CONCATENATE rv_version '-' lv_prerelease_n INTO rv_version.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD version_to_numeric.
+ 
+    DATA: lv_major   TYPE n LENGTH 4,
+          lv_minor   TYPE n LENGTH 4,
+          lv_release TYPE n LENGTH 4.
+ 
+    SPLIT iv_version AT '.' INTO lv_major lv_minor lv_release.
+ 
+    " Calculated value of version number, empty version will become 0 which is OK
+    rv_version = lv_major * 1000000 + lv_minor * 1000 + lv_release.
+ 
+  ENDMETHOD.
+ 
+  METHOD get_version_constant_value.
+    DATA: lv_version_class     TYPE string,
+          lv_version_component TYPE string.
+    FIELD-SYMBOLS: <lv_version> TYPE string.
+ 
+    IF iv_version_constant NP '*=>*'.
+      zcx_abapgit_exception=>raise( 'Version constant needs to use the format CLASS=>CONSTANT' ).
+    ENDIF.
+ 
+    SPLIT iv_version_constant AT '=>' INTO lv_version_class lv_version_component.
+    IF sy-subrc <> 0 OR lv_version_class IS INITIAL OR lv_version_component IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Version constant cannot be parsed' ).
+    ENDIF.
+ 
+    ASSIGN (lv_version_class)=>(lv_version_component) TO <lv_version>.
+    IF sy-subrc = 0.
+      rv_version = <lv_version>.
+    ELSE.
+      zcx_abapgit_exception=>raise( |Could not access version at class { lv_version_class } component | &&
+                                    |{ lv_version_component }| ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_version.clas.testclasses.abap.html b/src/utils/zcl_abapgit_version.clas.testclasses.abap.html new file mode 100644 index 00000000000..b476cda2baa --- /dev/null +++ b/src/utils/zcl_abapgit_version.clas.testclasses.abap.html @@ -0,0 +1,337 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_version.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_version.clas.testclasses.abap

+
+ +
+ 100% + Statements + 84/84 +
+ + +
+ 100% + Branches + 3/3 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 84/84 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +851x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_version DEFINITION DEFERRED.
+CLASS zcl_abapgit_version DEFINITION LOCAL FRIENDS ltcl_version.
+ 
+CLASS ltcl_version DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS:
+      version_to_numeric FOR TESTING,
+      compare            FOR TESTING,
+      normalize          FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_version IMPLEMENTATION.
+ 
+  METHOD version_to_numeric.
+ 
+    DATA: lv_version_exp TYPE i VALUE 1023010,
+          lv_version_act TYPE i.
+ 
+    lv_version_act = zcl_abapgit_version=>version_to_numeric( '1.23.10' ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = lv_version_exp
+                                        act = lv_version_act
+                                        msg = ' Error during conversion of version to numeric value' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD compare.
+ 
+    DATA lv_result TYPE i.
+ 
+    " Case 1: version A > version B
+    lv_result = zcl_abapgit_version=>compare( iv_a = '1.28.10'
+                                              iv_b = '1.23.10' ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = 1
+                                        act = lv_result
+                                        msg = ' Error during comparison of versions. Case: A > B' ).
+ 
+    CLEAR: lv_result.
+ 
+    " Case 2: version A < version B
+    lv_result = zcl_abapgit_version=>compare( iv_a = '1.28.10'
+                                              iv_b = '2.23.10' ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = -1
+                                        act = lv_result
+                                        msg = ' Error during comparison of versions. Case: A < B' ).
+ 
+    CLEAR: lv_result.
+ 
+    " Case 3: version A = version B
+    lv_result = zcl_abapgit_version=>compare( iv_a = '1.28.10'
+                                              iv_b = '1.28.10' ).
+ 
+    cl_abap_unit_assert=>assert_equals( exp = 0
+                                        act = lv_result
+                                        msg = ' Error during comparison of versions. Case: A = B' ).
+ 
+  ENDMETHOD.
+ 
+  METHOD normalize.
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_version=>normalize( '1.28.10' )
+      exp = '1.28.10' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_version=>normalize( 'v1.28.10' )
+      exp = '1.28.10' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_version=>normalize( 'b1.28.10' )
+      exp = '' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = zcl_abapgit_version=>normalize( 'x.y.z' )
+      exp = '' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/utils/zcl_abapgit_zip.clas.abap.html b/src/utils/zcl_abapgit_zip.clas.abap.html new file mode 100644 index 00000000000..c8d40de21f9 --- /dev/null +++ b/src/utils/zcl_abapgit_zip.clas.abap.html @@ -0,0 +1,1183 @@ + + + + + + Code coverage report for src/utils/zcl_abapgit_zip.clas.abap + + + + + + + + + +
+
+

All files / src/utils zcl_abapgit_zip.clas.abap

+
+ +
+ 100% + Statements + 366/366 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 366/366 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +3671x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_zip DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS encode_files
+      IMPORTING
+        !it_files      TYPE zif_abapgit_definitions=>ty_files_item_tt
+      RETURNING
+        VALUE(rv_xstr) TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS export
+      IMPORTING
+        !is_local_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings
+        !iv_package        TYPE devclass
+        !io_dot_abapgit    TYPE REF TO zcl_abapgit_dot_abapgit
+        !iv_show_log       TYPE abap_bool DEFAULT abap_true
+        !it_filter         TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL
+      RETURNING
+        VALUE(rv_xstr)     TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS export_object
+      IMPORTING
+        !iv_object_type        TYPE trobjtype
+        !iv_object_name        TYPE sobj_name
+        !iv_main_language_only TYPE abap_bool DEFAULT abap_false
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS export_package
+      IMPORTING
+        !iv_package        TYPE devclass
+        !iv_folder_logic   TYPE string
+        !iv_main_lang_only TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS load
+      IMPORTING
+        !iv_xstr        TYPE xstring
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS save_binstring_to_localfile
+      IMPORTING
+        !iv_filename  TYPE string
+        !iv_binstring TYPE xstring
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+ 
+    CLASS-DATA gv_prev TYPE string .
+  PRIVATE SECTION.
+ 
+    CLASS-METHODS filename
+      IMPORTING
+        !iv_str      TYPE string
+      EXPORTING
+        !ev_path     TYPE string
+        !ev_filename TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS normalize_path
+      CHANGING
+        !ct_files TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS unzip_file
+      IMPORTING
+        !iv_xstr        TYPE xstring
+      RETURNING
+        VALUE(rt_files) TYPE zif_abapgit_git_definitions=>ty_files_tt
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_ZIP IMPLEMENTATION.
+ 
+ 
+  METHOD encode_files.
+ 
+    DATA: lo_zip      TYPE REF TO cl_abap_zip,
+          lv_filename TYPE string.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files.
+ 
+ 
+    CREATE OBJECT lo_zip.
+ 
+    LOOP AT it_files ASSIGNING <ls_file>.
+      CONCATENATE <ls_file>-file-path+1 <ls_file>-file-filename INTO lv_filename.
+      lo_zip->add( name    = lv_filename
+                   content = <ls_file>-file-data ).
+    ENDLOOP.
+ 
+    rv_xstr = lo_zip->save( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD export.
+ 
+    DATA li_log       TYPE REF TO zif_abapgit_log.
+    DATA lt_zip       TYPE zif_abapgit_definitions=>ty_files_item_tt.
+    DATA lo_serialize TYPE REF TO zcl_abapgit_serialize.
+ 
+    CREATE OBJECT li_log TYPE zcl_abapgit_log.
+    li_log->set_title( 'Zip Export Log' ).
+ 
+    IF zcl_abapgit_factory=>get_sap_package( iv_package )->exists( ) = abap_false.
+      zcx_abapgit_exception=>raise( |Package { iv_package } doesn't exist| ).
+    ENDIF.
+ 
+    CREATE OBJECT lo_serialize
+      EXPORTING
+        io_dot_abapgit    = io_dot_abapgit
+        is_local_settings = is_local_settings.
+ 
+    lt_zip = lo_serialize->files_local(
+      iv_package = iv_package
+      ii_log     = li_log
+      it_filter  = it_filter ).
+ 
+    FREE lo_serialize.
+ 
+    IF li_log->count( ) > 0 AND iv_show_log = abap_true.
+      zcl_abapgit_log_viewer=>show_log( li_log ).
+    ENDIF.
+ 
+    rv_xstr = encode_files( lt_zip ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD export_object.
+ 
+    DATA: ls_tadir         TYPE zif_abapgit_definitions=>ty_tadir,
+          lv_folder        TYPE string,
+          lv_fullpath      TYPE string,
+          lv_sep           TYPE c LENGTH 1,
+          ls_files_item    TYPE zcl_abapgit_objects=>ty_serialization,
+          lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF ls_files_item-files.
+ 
+    ls_tadir = zcl_abapgit_factory=>get_tadir( )->read_single(
+        iv_object   = iv_object_type
+        iv_obj_name = iv_object_name ).
+ 
+    IF ls_tadir IS INITIAL.
+      zcx_abapgit_exception=>raise( 'Object could not be found' ).
+    ENDIF.
+ 
+    ls_files_item-item-obj_type = ls_tadir-object.
+    ls_files_item-item-obj_name = ls_tadir-obj_name.
+ 
+    ls_files_item = zcl_abapgit_objects=>serialize(
+      is_item        = ls_files_item-item
+      io_i18n_params = zcl_abapgit_i18n_params=>new(
+        iv_main_language_only = iv_main_language_only
+        iv_main_language      = sy-langu ) ).
+ 
+    IF lines( ls_files_item-files ) = 0.
+      zcx_abapgit_exception=>raise( 'Empty' ).
+    ENDIF.
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+    lo_frontend_serv->directory_browse(
+      EXPORTING
+        iv_initial_folder  = gv_prev
+      CHANGING
+        cv_selected_folder = lv_folder ).
+    IF lv_folder IS INITIAL.
+      RAISE EXCEPTION TYPE zcx_abapgit_cancel.
+    ENDIF.
+ 
+    gv_prev = lv_folder.
+    lo_frontend_serv->get_file_separator( CHANGING cv_file_separator = lv_sep ).
+ 
+    LOOP AT ls_files_item-files ASSIGNING <ls_file>.
+      lv_fullpath = |{ lv_folder }{ lv_sep }{ <ls_file>-filename }|.
+      save_binstring_to_localfile( iv_filename  = lv_fullpath
+                                   iv_binstring = <ls_file>-data ).
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD export_package.
+ 
+    DATA: ls_local_settings  TYPE zif_abapgit_persistence=>ty_repo-local_settings,
+          lo_dot_abapgit     TYPE REF TO zcl_abapgit_dot_abapgit,
+          lo_frontend_serv   TYPE REF TO zif_abapgit_frontend_services,
+          lv_default         TYPE string,
+          lv_package_escaped TYPE string,
+          lv_path            TYPE string,
+          lv_zip_xstring     TYPE xstring.
+ 
+    ls_local_settings-main_language_only = iv_main_lang_only.
+ 
+    lo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ).
+    lo_dot_abapgit->set_folder_logic( iv_folder_logic ).
+ 
+    lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ).
+ 
+    lv_package_escaped = iv_package.
+    REPLACE ALL OCCURRENCES OF '/' IN lv_package_escaped WITH '#'.
+    lv_default = |{ lv_package_escaped }_{ sy-datlo }_{ sy-timlo }|.
+ 
+    lv_zip_xstring = export(
+     is_local_settings = ls_local_settings
+     iv_package        = iv_package
+     io_dot_abapgit    = lo_dot_abapgit ).
+ 
+    lv_path = lo_frontend_serv->show_file_save_dialog(
+        iv_title            = 'Package Export'
+        iv_extension        = 'zip'
+        iv_default_filename = lv_default ).
+ 
+    lo_frontend_serv->file_download(
+        iv_path = lv_path
+        iv_xstr = lv_zip_xstring ).
+  ENDMETHOD.
+ 
+ 
+  METHOD filename.
+ 
+    IF iv_str CA '/'.
+      FIND REGEX '(.*/)(.*)' IN iv_str
+        SUBMATCHES ev_path ev_filename.
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( 'Malformed path' ).
+      ENDIF.
+      IF ev_path <> '/'.
+        CONCATENATE '/' ev_path INTO ev_path.
+      ENDIF.
+    ELSE.
+      ev_path = '/'.
+      ev_filename = iv_str.
+    ENDIF.
+    TRANSLATE ev_filename TO LOWER CASE.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD load.
+ 
+    rt_files = unzip_file( iv_xstr ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD normalize_path.
+* removes first folder from path if needed
+ 
+    DATA: lt_split  TYPE TABLE OF string,
+          lv_needed TYPE abap_bool,
+          lv_length TYPE i,
+          lv_split  LIKE LINE OF lt_split.
+ 
+    FIELD-SYMBOLS: <ls_file> LIKE LINE OF ct_files.
+ 
+ 
+    READ TABLE ct_files INDEX 1 ASSIGNING <ls_file>.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+ 
+    SPLIT <ls_file>-path AT '/' INTO TABLE lt_split.
+    IF sy-subrc <> 0.
+      RETURN.
+    ENDIF.
+    READ TABLE lt_split INDEX 2 INTO lv_split.
+    IF sy-subrc <> 0 OR strlen( lv_split ) = 0.
+      RETURN.
+    ENDIF.
+ 
+    CONCATENATE '/' lv_split '/*' INTO lv_split.
+ 
+    lv_needed = abap_true.
+    LOOP AT ct_files ASSIGNING <ls_file>.
+      IF NOT <ls_file>-path CP lv_split.
+        lv_needed = abap_false.
+        EXIT. " current loop
+      ENDIF.
+    ENDLOOP.
+ 
+    IF lv_needed = abap_true.
+      lv_length = strlen( lv_split ) - 2.
+      LOOP AT ct_files ASSIGNING <ls_file>.
+        <ls_file>-path = <ls_file>-path+lv_length.
+      ENDLOOP.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD save_binstring_to_localfile.
+ 
+    zcl_abapgit_ui_factory=>get_frontend_services( )->file_download(
+      iv_path = iv_filename
+      iv_xstr = iv_binstring ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD unzip_file.
+ 
+    DATA: lo_zip  TYPE REF TO cl_abap_zip,
+          lv_data TYPE xstring.
+ 
+    FIELD-SYMBOLS: <ls_zipfile> LIKE LINE OF lo_zip->files,
+                   <ls_file>    LIKE LINE OF rt_files.
+ 
+ 
+    CREATE OBJECT lo_zip.
+    lo_zip->load( EXPORTING
+                    zip             = iv_xstr
+                  EXCEPTIONS
+                    zip_parse_error = 1
+                    OTHERS          = 2 ).
+    IF sy-subrc <> 0.
+      zcx_abapgit_exception=>raise( 'error from zip' ).
+    ENDIF.
+ 
+    LOOP AT lo_zip->files ASSIGNING <ls_zipfile>.
+ 
+      lo_zip->get(
+        EXPORTING
+          name                    = <ls_zipfile>-name
+        IMPORTING
+          content                 = lv_data
+        EXCEPTIONS
+          zip_index_error         = 1
+          zip_decompression_error = 2
+          OTHERS                  = 3 ).
+      IF sy-subrc <> 0.
+        zcx_abapgit_exception=>raise( 'error from zip get' ).
+      ENDIF.
+ 
+      APPEND INITIAL LINE TO rt_files ASSIGNING <ls_file>.
+ 
+      filename(
+        EXPORTING
+          iv_str      = <ls_zipfile>-name
+        IMPORTING
+          ev_path     = <ls_file>-path
+          ev_filename = <ls_file>-filename ).
+ 
+      <ls_file>-data = lv_data.
+ 
+      <ls_file>-sha1 = zcl_abapgit_hash=>sha1_blob( <ls_file>-data ).
+ 
+    ENDLOOP.
+ 
+    DELETE rt_files WHERE filename IS INITIAL.
+ 
+    normalize_path( CHANGING ct_files = rt_files ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/index.html b/src/xml/index.html new file mode 100644 index 00000000000..c03fb7edb36 --- /dev/null +++ b/src/xml/index.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for src/xml + + + + + + + + + +
+
+

All files src/xml

+
+ +
+ 63.83% + Statements + 646/1012 +
+ + +
+ 66.66% + Branches + 10/15 +
+ + +
+ 28.57% + Functions + 8/28 +
+ + +
+ 63.83% + Lines + 646/1012 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_xml.clas.abap +
+
80.72%134/16650%4/850%2/480.72%134/166
zcl_abapgit_xml.clas.testclasses.abap +
+
66.66%96/144100%2/240%2/566.66%96/144
zcl_abapgit_xml_input.clas.abap +
+
100%95/9566.66%2/3100%2/2100%95/95
zcl_abapgit_xml_input.clas.testclasses.abap +
+
52.3%102/195100%2/240%2/552.3%102/195
zcl_abapgit_xml_output.clas.abap +
+
66.16%88/133100%0/00%0/366.16%88/133
zcl_abapgit_xml_output.clas.testclasses.abap +
+
24.27%25/103100%0/00%0/224.27%25/103
zcl_abapgit_xml_pretty.clas.abap +
+
100%68/68100%0/0100%0/0100%68/68
zcl_abapgit_xml_pretty.clas.testclasses.abap +
+
35.18%38/108100%0/00%0/735.18%38/108
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/zcl_abapgit_xml.clas.abap.html b/src/xml/zcl_abapgit_xml.clas.abap.html new file mode 100644 index 00000000000..d08e3ce7168 --- /dev/null +++ b/src/xml/zcl_abapgit_xml.clas.abap.html @@ -0,0 +1,583 @@ + + + + + + Code coverage report for src/xml/zcl_abapgit_xml.clas.abap + + + + + + + + + +
+
+

All files / src/xml zcl_abapgit_xml.clas.abap

+
+ +
+ 80.72% + Statements + 134/166 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 80.72% + Lines + 134/166 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +1671x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +  +  +6x +6x +6x +6x +6x +6x +6x +6x +6x +1x +  +5x +5x +5x +5x +5x +5x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_xml DEFINITION
+  PUBLIC
+  ABSTRACT
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+    METHODS:
+      constructor
+        IMPORTING iv_filename TYPE string OPTIONAL.
+  PROTECTED SECTION.
+    DATA: mi_ixml     TYPE REF TO if_ixml,
+          mi_xml_doc  TYPE REF TO if_ixml_document,
+          ms_metadata TYPE zif_abapgit_definitions=>ty_metadata,
+          mv_filename TYPE string.
+ 
+    CONSTANTS: c_abapgit_tag             TYPE string VALUE 'abapGit' ##NO_TEXT,
+               c_attr_version            TYPE string VALUE 'version' ##NO_TEXT,
+               c_attr_serializer         TYPE string VALUE 'serializer' ##NO_TEXT,
+               c_attr_serializer_version TYPE string VALUE 'serializer_version' ##NO_TEXT.
+ 
+    METHODS to_xml
+      IMPORTING iv_normalize  TYPE abap_bool DEFAULT abap_true
+      RETURNING VALUE(rv_xml) TYPE string.
+ 
+    METHODS parse
+      IMPORTING iv_xml TYPE string
+      RAISING   zcx_abapgit_exception.
+  PRIVATE SECTION.
+ 
+    METHODS error
+      IMPORTING
+        !ii_parser TYPE REF TO if_ixml_parser
+      RAISING
+        zcx_abapgit_exception .
+    METHODS raise_version_mismatch
+      IMPORTING
+        !iv_vers TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS raise_exception_for
+      IMPORTING
+        !ii_error TYPE REF TO if_ixml_parse_error
+      RAISING
+        zcx_abapgit_exception .
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_xml IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+    mi_ixml     = cl_ixml=>create( ).
+    mi_xml_doc  = mi_ixml->create_document( ).
+    mv_filename = iv_filename.
+  ENDMETHOD.
+ 
+ 
+  METHOD error.
+
+    IF ii_parser->num_errors( ) <> 0.
+      raise_exception_for( ii_parser->get_error( 0 ) ).
+    ENDIF.
+
+    IF mv_filename IS INITIAL.
+      zcx_abapgit_exception=>raise( |Error while parsing XML| ).
+    ELSE.
+      zcx_abapgit_exception=>raise( |Error while parsing XML file { mv_filename }| ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD parse.
+ 
+    DATA: li_stream_factory TYPE REF TO if_ixml_stream_factory,
+          li_istream        TYPE REF TO if_ixml_istream,
+          li_element        TYPE REF TO if_ixml_element,
+          li_version        TYPE REF TO if_ixml_node,
+          li_parser         TYPE REF TO if_ixml_parser.
+ 
+ 
+    ASSERT NOT iv_xml IS INITIAL.
+ 
+    li_stream_factory = mi_ixml->create_stream_factory( ).
+    li_istream = li_stream_factory->create_istream_string( iv_xml ).
+    li_parser = mi_ixml->create_parser( stream_factory = li_stream_factory
+                                        istream        = li_istream
+                                        document       = mi_xml_doc ).
+    li_parser->add_strip_space_element( ).
+    IF li_parser->parse( ) <> 0.
+      error( li_parser ).
+    ENDIF.
+ 
+    li_istream->close( ).
+ 
+ 
+    li_element = mi_xml_doc->find_from_name_ns( depth = 0
+                                                name = c_abapgit_tag ).
+    li_version = li_element->if_ixml_node~get_attributes(
+      )->get_named_item_ns( c_attr_version ).
+    IF li_version->get_value( ) <> zif_abapgit_version=>c_xml_version.
+      raise_version_mismatch( li_version->get_value( ) ).
+    ENDIF.
+ 
+* buffer serializer metadata. Git node will be removed lateron
+    ms_metadata-class   = li_element->get_attribute_ns( c_attr_serializer ).
+    ms_metadata-version = li_element->get_attribute_ns( c_attr_serializer_version ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_exception_for.
+    DATA lv_message TYPE string.
+
+    lv_message = |XML parser error: { ii_error->get_reason( ) }, | &&
+                 |Line { ii_error->get_line( ) } | &&
+                 |Col. { ii_error->get_column( ) }|.
+
+    IF mv_filename IS NOT INITIAL.
+      lv_message = lv_message && | File { mv_filename }|.
+    ENDIF.
+
+    zcx_abapgit_exception=>raise( lv_message ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_version_mismatch.
+ 
+    DATA lv_text TYPE string.
+ 
+    lv_text = |The XML versions do not match, expected: { zif_abapgit_version=>c_xml_version }, actual: { iv_vers }|.
+ 
+    IF mv_filename IS NOT INITIAL.
+      lv_text = lv_text && |, file: { mv_filename }|.
+    ENDIF.
+ 
+    lv_text = lv_text && | (see https://docs.abapgit.org/other-xml-mismatch.html)|.
+ 
+    zcx_abapgit_exception=>raise( lv_text ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD to_xml.
+* will render to codepage UTF-16
+ 
+    DATA: li_ostream       TYPE REF TO if_ixml_ostream,
+          li_renderer      TYPE REF TO if_ixml_renderer,
+          li_streamfactory TYPE REF TO if_ixml_stream_factory.
+ 
+    li_streamfactory = mi_ixml->create_stream_factory( ).
+ 
+    li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ).
+ 
+    li_renderer = mi_ixml->create_renderer( ostream  = li_ostream
+                                            document = mi_xml_doc ).
+    li_renderer->set_normalizing( iv_normalize ).
+ 
+    li_renderer->render( ).
+ 
+    " handling of BOM moved to zcl_abapgit_convert=>string_to_xstring_utf8_bom
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/zcl_abapgit_xml.clas.testclasses.abap.html b/src/xml/zcl_abapgit_xml.clas.testclasses.abap.html new file mode 100644 index 00000000000..d9b7d3054f9 --- /dev/null +++ b/src/xml/zcl_abapgit_xml.clas.testclasses.abap.html @@ -0,0 +1,517 @@ + + + + + + Code coverage report for src/xml/zcl_abapgit_xml.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/xml zcl_abapgit_xml.clas.testclasses.abap

+
+ +
+ 66.66% + Statements + 96/144 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 40% + Functions + 2/5 +
+ + +
+ 66.66% + Lines + 96/144 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +1451x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS ltcl_xml DEFINITION DEFERRED.
+ 
+CLASS ltcl_xml_concrete DEFINITION FOR TESTING
+    FINAL
+    INHERITING FROM zcl_abapgit_xml
+    FRIENDS ltcl_xml.
+ENDCLASS.
+ 
+CLASS ltcl_xml_concrete IMPLEMENTATION.
+ENDCLASS.
+ 
+CLASS ltcl_xml DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+ 
+    METHODS setup.
+ 
+    METHODS:
+      space_leading_trailing FOR TESTING RAISING zcx_abapgit_exception,
+      bad_version_raises_exc FOR TESTING RAISING cx_static_check,
+      bad_xml_raises_exc FOR TESTING RAISING cx_static_check.
+ 
+    METHODS:
+      parse_xml
+        IMPORTING
+          iv_xml TYPE csequence
+        RAISING
+          zcx_abapgit_exception,
+      render_xml
+        IMPORTING
+          iv_name       TYPE string
+        RETURNING
+          VALUE(rv_xml) TYPE string.
+ 
+    DATA mo_xml TYPE REF TO ltcl_xml_concrete.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_xml IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_xml.
+  ENDMETHOD.
+ 
+  METHOD parse_xml.
+
+    DATA lv_xml TYPE string.
+
+    lv_xml = |<?xml version="1.0"?>|
+          && |<{ mo_xml->c_abapgit_tag } { mo_xml->c_attr_version }="{ zif_abapgit_version=>c_xml_version }">|
+          && iv_xml
+          && |</{ mo_xml->c_abapgit_tag }>|.
+
+    mo_xml->parse( iv_xml = lv_xml ).
+
+  ENDMETHOD.
+ 
+  METHOD space_leading_trailing.
+
+    DATA: lv_from_xml TYPE string,
+          lv_to_xml   TYPE string.
+
+    lv_from_xml = `<FOO> A </FOO>`.
+
+    parse_xml( lv_from_xml ).
+
+    lv_to_xml = render_xml( 'FOO' ).
+
+    cl_abap_unit_assert=>assert_char_cp(
+      act = lv_to_xml
+      exp = |*{ lv_from_xml }*| ).
+
+  ENDMETHOD.
+ 
+  METHOD render_xml.
+ 
+* this code replicates the functionality in ZCL_ABAPGIT_XML_OUTPUT,
+ 
+    DATA: li_ostream       TYPE REF TO if_ixml_ostream,
+          li_renderer      TYPE REF TO if_ixml_renderer,
+          li_streamfactory TYPE REF TO if_ixml_stream_factory.
+ 
+    li_streamfactory = mo_xml->mi_ixml->create_stream_factory( ).
+ 
+    li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ).
+ 
+    li_renderer = mo_xml->mi_ixml->create_renderer(
+      ostream  = li_ostream
+      document = mo_xml->mi_xml_doc ).
+ 
+    li_renderer->render( ).
+ 
+  ENDMETHOD.
+ 
+  METHOD bad_version_raises_exc.
+ 
+    DATA: lv_xml   TYPE string,
+          lo_error TYPE REF TO zcx_abapgit_exception,
+          lv_text  TYPE string.
+ 
+    lv_xml = |<?xml version="1.0"?>|
+          && |<{ mo_xml->c_abapgit_tag } { mo_xml->c_attr_version }="v9.8.7">|
+          && |<TEST>data</TEST>|
+          && |</{ mo_xml->c_abapgit_tag }>|.
+ 
+    TRY.
+        mo_xml->parse( iv_xml = lv_xml ).
+        cl_abap_unit_assert=>fail( msg = 'Exception not raised' ).
+ 
+      CATCH zcx_abapgit_exception INTO lo_error.
+        lv_text = lo_error->get_text( ).
+        cl_abap_unit_assert=>assert_char_cp(
+            act              = lv_text
+            exp              = '*XML version*' ).
+    ENDTRY.
+ 
+  ENDMETHOD.
+ 
+  METHOD bad_xml_raises_exc.
+
+    DATA: lv_xml   TYPE string,
+          lo_error TYPE REF TO zcx_abapgit_exception,
+          lv_text  TYPE string.
+
+    lv_xml = |<?xml version="1.0"?>|
+          && |<{ mo_xml->c_abapgit_tag } { mo_xml->c_attr_version }="{ zif_abapgit_version=>c_xml_version }">|
+          && |<open_tag>|
+          && |</{ mo_xml->c_abapgit_tag }>|.
+
+    TRY.
+        mo_xml->parse( iv_xml = lv_xml ).
+        cl_abap_unit_assert=>fail( msg = 'Exception not raised' ).
+
+      CATCH zcx_abapgit_exception INTO lo_error.
+        lv_text = lo_error->get_text( ).
+        cl_abap_unit_assert=>assert_char_cp(
+            act              = lv_text
+            exp              = '*open_tag*' ).
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/zcl_abapgit_xml_input.clas.abap.html b/src/xml/zcl_abapgit_xml_input.clas.abap.html new file mode 100644 index 00000000000..49a8884cbc2 --- /dev/null +++ b/src/xml/zcl_abapgit_xml_input.clas.abap.html @@ -0,0 +1,370 @@ + + + + + + Code coverage report for src/xml/zcl_abapgit_xml_input.clas.abap + + + + + + + + + +
+
+

All files / src/xml zcl_abapgit_xml_input.clas.abap

+
+ +
+ 100% + Statements + 95/95 +
+ + +
+ 66.66% + Branches + 2/3 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 95/95 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +961x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +11x +1x + 
CLASS zcl_abapgit_xml_input DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_xml
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_xml_input.
+ 
+    METHODS constructor
+      IMPORTING
+        !iv_xml      TYPE clike
+        !iv_filename TYPE string OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA ms_i18n_params TYPE zif_abapgit_definitions=>ty_i18n_params.
+ 
+    METHODS fix_xml.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_XML_INPUT IMPLEMENTATION.
+ 
+ 
+  METHOD constructor.
+ 
+    super->constructor( iv_filename ).
+    parse( iv_xml ).
+    fix_xml( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD fix_xml.
+ 
+    DATA: li_git  TYPE REF TO if_ixml_element,
+          li_abap TYPE REF TO if_ixml_node.
+ 
+ 
+    li_git ?= mi_xml_doc->find_from_name_ns( depth = 0
+                                             name = c_abapgit_tag ).
+    li_abap = li_git->get_first_child( ).
+ 
+    mi_xml_doc->get_root( )->remove_child( li_git ).
+    mi_xml_doc->get_root( )->append_child( li_abap ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_input~get_metadata.
+    rs_metadata = ms_metadata.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_input~get_raw.
+    ri_raw = mi_xml_doc.
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_input~read.
+ 
+    DATA: lx_error TYPE REF TO cx_transformation_error,
+          lt_rtab  TYPE abap_trans_resbind_tab.
+ 
+    FIELD-SYMBOLS: <ls_rtab> LIKE LINE OF lt_rtab.
+ 
+    ASSERT NOT iv_name IS INITIAL.
+ 
+    CLEAR cg_data. "Initialize result to avoid problems with empty values
+ 
+    APPEND INITIAL LINE TO lt_rtab ASSIGNING <ls_rtab>.
+    <ls_rtab>-name = iv_name.
+    GET REFERENCE OF cg_data INTO <ls_rtab>-value.
+ 
+    TRY.
+        CALL TRANSFORMATION id
+          OPTIONS value_handling = 'accept_data_loss'
+          SOURCE XML mi_xml_doc
+          RESULT (lt_rtab).
+      CATCH cx_transformation_error INTO lx_error.
+        IF mv_filename IS INITIAL.
+          zcx_abapgit_exception=>raise( lx_error->if_message~get_text( ) ).
+        ELSE.
+          zcx_abapgit_exception=>raise( |File { mv_filename }: { lx_error->if_message~get_text( ) }| ).
+        ENDIF.
+    ENDTRY.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/zcl_abapgit_xml_input.clas.testclasses.abap.html b/src/xml/zcl_abapgit_xml_input.clas.testclasses.abap.html new file mode 100644 index 00000000000..10f5d685c78 --- /dev/null +++ b/src/xml/zcl_abapgit_xml_input.clas.testclasses.abap.html @@ -0,0 +1,670 @@ + + + + + + Code coverage report for src/xml/zcl_abapgit_xml_input.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/xml zcl_abapgit_xml_input.clas.testclasses.abap

+
+ +
+ 52.3% + Statements + 102/195 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 40% + Functions + 2/5 +
+ + +
+ 52.3% + Lines + 102/195 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +1961x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_xml DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      up FOR TESTING RAISING zcx_abapgit_exception,
+      empty FOR TESTING RAISING zcx_abapgit_exception,
+      input FOR TESTING RAISING zcx_abapgit_exception,
+      read_intf FOR TESTING RAISING zcx_abapgit_exception,
+      down FOR TESTING RAISING zcx_abapgit_exception.
+ 
+    TYPES: BEGIN OF ty_old,
+             foo TYPE i,
+             bar TYPE c LENGTH 1,
+           END OF ty_old.
+ 
+    TYPES: BEGIN OF ty_new,
+             foo TYPE i,
+             bar TYPE c LENGTH 1,
+             moo TYPE f,
+           END OF ty_new.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_xml IMPLEMENTATION.
+ 
+  METHOD input.
+ 
+    DATA lv_xml   TYPE string.
+    DATA lo_input TYPE REF TO zcl_abapgit_xml_input.
+    DATA ls_data  TYPE ty_old.
+ 
+    lv_xml = |<?xml version="1.0" encoding="utf-16"?>\n| &&
+      |<abapGit version="v1.0.0">\n| &&
+      | <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">\n| &&
+      |  <asx:values>\n| &&
+      |   <DATA>\n| &&
+      |    <FOO>2</FOO>\n| &&
+      |   </DATA>\n| &&
+      |  </asx:values>\n| &&
+      | </asx:abap>\n| &&
+      |</abapGit>|.
+ 
+    CREATE OBJECT lo_input
+      EXPORTING
+        iv_xml = lv_xml.
+ 
+    lo_input->zif_abapgit_xml_input~read( EXPORTING iv_name = 'DATA'
+                                          CHANGING cg_data = ls_data ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_data-foo
+      exp = 2 ).
+ 
+  ENDMETHOD.
+ 
+  METHOD empty.
+
+    DATA: ls_old    TYPE ty_old,
+          ls_new    TYPE ty_new,
+          lv_xml    TYPE string,
+          lo_input  TYPE REF TO zcl_abapgit_xml_input,
+          lo_output TYPE REF TO zcl_abapgit_xml_output.
+
+
+    CLEAR ls_old.
+
+    CREATE OBJECT lo_output.
+    lo_output->zif_abapgit_xml_output~add( iv_name = 'DATA'
+                                           ig_data = ls_old ).
+    lv_xml = lo_output->zif_abapgit_xml_output~render( ).
+
+    CREATE OBJECT lo_input
+      EXPORTING
+        iv_xml = lv_xml.
+    lo_input->zif_abapgit_xml_input~read( EXPORTING iv_name = 'DATA'
+                                          CHANGING cg_data = ls_new ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_new-foo
+      exp = ls_old-foo ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_new-bar
+      exp = ls_old-bar ).
+
+  ENDMETHOD.
+ 
+  METHOD up.
+
+    DATA: ls_old    TYPE ty_old,
+          ls_new    TYPE ty_new,
+          lv_xml    TYPE string,
+          lo_input  TYPE REF TO zcl_abapgit_xml_input,
+          lo_output TYPE REF TO zcl_abapgit_xml_output.
+
+
+    ls_old-foo = 2.
+    ls_old-bar = 'A'.
+
+    CREATE OBJECT lo_output.
+    lo_output->zif_abapgit_xml_output~add( iv_name = 'DATA'
+                                           ig_data = ls_old ).
+    lv_xml = lo_output->zif_abapgit_xml_output~render( ).
+
+    CREATE OBJECT lo_input
+      EXPORTING
+        iv_xml = lv_xml.
+    lo_input->zif_abapgit_xml_input~read( EXPORTING iv_name = 'DATA'
+                                          CHANGING cg_data = ls_new ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_new-foo
+      exp = ls_old-foo ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_new-bar
+      exp = ls_old-bar ).
+
+  ENDMETHOD.
+ 
+  METHOD down.
+
+    DATA: ls_old    TYPE ty_old,
+          ls_new    TYPE ty_new,
+          lv_xml    TYPE string,
+          lo_input  TYPE REF TO zcl_abapgit_xml_input,
+          lo_output TYPE REF TO zcl_abapgit_xml_output.
+
+
+    ls_new-foo = 2.
+    ls_new-bar = 'A'.
+    ls_new-moo = 5.
+
+    CREATE OBJECT lo_output.
+    lo_output->zif_abapgit_xml_output~add( iv_name = 'DATA'
+                                           ig_data = ls_new ).
+    lv_xml = lo_output->zif_abapgit_xml_output~render( ).
+
+    CREATE OBJECT lo_input
+      EXPORTING
+        iv_xml = lv_xml.
+    lo_input->zif_abapgit_xml_input~read( EXPORTING iv_name = 'DATA'
+                                          CHANGING cg_data = ls_old ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_old-foo
+      exp = ls_new-foo ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_old-bar
+      exp = ls_new-bar ).
+
+  ENDMETHOD.
+ 
+  METHOD read_intf.
+ 
+    DATA ls_vseointerf TYPE vseointerf.
+    DATA lv_xml        TYPE string.
+    DATA lo_input      TYPE REF TO zcl_abapgit_xml_input.
+ 
+    lv_xml = |<?xml version="1.0" encoding="utf-8"?>\n| &&
+      |<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">\n| &&
+      | <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">\n| &&
+      |  <asx:values>\n| &&
+      |   <VSEOINTERF>\n| &&
+      |    <CLSNAME>ZIF_ABAPGIT_UNIT_TEST</CLSNAME>\n| &&
+      |    <LANGU>E</LANGU>\n| &&
+      |    <DESCRIPT>test</DESCRIPT>\n| &&
+      |    <EXPOSURE>2</EXPOSURE>\n| &&
+      |    <STATE>1</STATE>\n| &&
+      |    <UNICODE>X</UNICODE>\n| &&
+      |   </VSEOINTERF>\n| &&
+      |  </asx:values>\n| &&
+      | </asx:abap>\n| &&
+      |</abapGit>|.
+ 
+    CREATE OBJECT lo_input
+      EXPORTING
+        iv_xml = lv_xml.
+ 
+    lo_input->zif_abapgit_xml_input~read( EXPORTING iv_name = 'VSEOINTERF'
+                                          CHANGING cg_data = ls_vseointerf ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_vseointerf-langu
+      exp = 'E' ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_vseointerf-descript
+      exp = 'test' ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/zcl_abapgit_xml_output.clas.abap.html b/src/xml/zcl_abapgit_xml_output.clas.abap.html new file mode 100644 index 00000000000..13ebe366434 --- /dev/null +++ b/src/xml/zcl_abapgit_xml_output.clas.abap.html @@ -0,0 +1,484 @@ + + + + + + Code coverage report for src/xml/zcl_abapgit_xml_output.clas.abap + + + + + + + + + +
+
+

All files / src/xml zcl_abapgit_xml_output.clas.abap

+
+ +
+ 66.16% + Statements + 88/133 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 66.16% + Lines + 88/133 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +1341x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x + 
CLASS zcl_abapgit_xml_output DEFINITION
+  PUBLIC
+  INHERITING FROM zcl_abapgit_xml
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES zif_abapgit_xml_output.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    DATA mi_raw TYPE REF TO if_ixml_element .
+    DATA ms_i18n_params TYPE zif_abapgit_definitions=>ty_i18n_params .
+ 
+    METHODS build_asx_node
+      RETURNING
+        VALUE(ri_element) TYPE REF TO if_ixml_element .
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_XML_OUTPUT IMPLEMENTATION.
+ 
+ 
+  METHOD build_asx_node.
+ 
+    DATA: li_attr TYPE REF TO if_ixml_attribute.
+ 
+ 
+    ri_element = mi_xml_doc->create_element_ns(
+      name   = 'abap'
+      prefix = 'asx' ).
+ 
+    li_attr = mi_xml_doc->create_attribute_ns( 'version' ).
+    li_attr->if_ixml_node~set_value( '1.0' ).
+    ri_element->set_attribute_node_ns( li_attr ).
+ 
+    li_attr = mi_xml_doc->create_attribute_ns(
+      name   = 'asx'
+      prefix = 'xmlns' ).
+    li_attr->if_ixml_node~set_value( 'http://www.sap.com/abapxml' ).
+    ri_element->set_attribute_node_ns( li_attr ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_output~add.
+
+    DATA: li_node TYPE REF TO if_ixml_node,
+          li_doc  TYPE REF TO if_ixml_document,
+          lt_stab TYPE abap_trans_srcbind_tab.
+
+    FIELD-SYMBOLS: <ls_stab> LIKE LINE OF lt_stab.
+
+
+    ASSERT NOT iv_name IS INITIAL.
+
+    IF ig_data IS INITIAL.
+      RETURN.
+    ENDIF.
+
+    APPEND INITIAL LINE TO lt_stab ASSIGNING <ls_stab>.
+    <ls_stab>-name = iv_name.
+    GET REFERENCE OF ig_data INTO <ls_stab>-value.
+
+    li_doc = cl_ixml=>create( )->create_document( ).
+
+    CALL TRANSFORMATION id
+      OPTIONS initial_components = 'suppress'
+      SOURCE (lt_stab)
+      RESULT XML li_doc.
+
+    li_node = mi_xml_doc->get_root( )->get_first_child( ).
+    IF li_node IS BOUND.
+      mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child(
+        li_doc->get_root( )->get_first_child( )->get_first_child( )->get_first_child( ) ).
+    ELSE.
+      mi_xml_doc->get_root( )->append_child( li_doc->get_root( )->get_first_child( ) ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_output~add_xml.
+
+    DATA: li_element TYPE REF TO if_ixml_element.
+
+    li_element = mi_xml_doc->create_element( iv_name ).
+    li_element->append_child( ii_xml ).
+
+    mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child( li_element ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_output~render.
+ 
+    DATA: li_git  TYPE REF TO if_ixml_element,
+          li_abap TYPE REF TO if_ixml_element.
+ 
+ 
+    IF mi_raw IS INITIAL.
+      li_abap ?= mi_xml_doc->get_root( )->get_first_child( ).
+      mi_xml_doc->get_root( )->remove_child( li_abap ).
+      IF li_abap IS INITIAL.
+        li_abap = build_asx_node( ).
+      ENDIF.
+    ELSE.
+      li_abap = mi_raw.
+    ENDIF.
+ 
+    li_git = mi_xml_doc->create_element( c_abapgit_tag ).
+    li_git->set_attribute( name = c_attr_version
+                           value = zif_abapgit_version=>c_xml_version ).
+    IF NOT is_metadata IS INITIAL.
+      li_git->set_attribute( name  = c_attr_serializer
+                             value = is_metadata-class ).
+      li_git->set_attribute( name  = c_attr_serializer_version
+                             value = is_metadata-version ).
+    ENDIF.
+    li_git->append_child( li_abap ).
+    mi_xml_doc->get_root( )->append_child( li_git ).
+ 
+    rv_xml = to_xml( iv_normalize ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD zif_abapgit_xml_output~set_raw.
+    mi_raw = ii_raw.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap.html b/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap.html new file mode 100644 index 00000000000..f5d04480ed0 --- /dev/null +++ b/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for src/xml/zcl_abapgit_xml_output.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/xml zcl_abapgit_xml_output.clas.testclasses.abap

+
+ +
+ 24.27% + Statements + 25/103 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 24.27% + Lines + 25/103 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +1041x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS ltcl_xml_output DEFINITION DEFERRED.
+CLASS zcl_abapgit_xml_output DEFINITION LOCAL FRIENDS ltcl_xml_output.
+ 
+CLASS ltcl_xml_output DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      render_xml_string FOR TESTING
+        RAISING zcx_abapgit_exception,
+      add_simple_object FOR TESTING
+        RAISING zcx_abapgit_exception.
+ 
+    TYPES: BEGIN OF ty_old,
+             foo TYPE i,
+             bar TYPE c LENGTH 1,
+           END OF ty_old.
+ 
+ENDCLASS.
+CLASS ltcl_xml_output IMPLEMENTATION.
+ 
+  METHOD add_simple_object.
+
+    DATA: ls_input       TYPE ty_old,
+          ls_result      TYPE ty_old,
+          lv_value       TYPE string,
+          li_xml_element TYPE REF TO if_ixml_element,
+          lo_output      TYPE REF TO zcl_abapgit_xml_output.
+
+    ls_input-foo = '2'.
+    ls_input-bar = 'A'.
+
+    CREATE OBJECT lo_output.
+    lo_output->zif_abapgit_xml_output~add( iv_name = 'DATA'
+                    ig_data = ls_input ).
+
+    li_xml_element = lo_output->mi_xml_doc->find_from_name( 'FOO' ).
+    lv_value = li_xml_element->get_value( ).
+    ls_result-foo = lv_value.
+    li_xml_element = lo_output->mi_xml_doc->find_from_name( 'BAR' ).
+    lv_value = li_xml_element->get_value( ).
+    ls_result-bar = lv_value.
+
+    cl_abap_unit_assert=>assert_equals(
+      act = ls_input
+      exp = ls_result ).
+
+  ENDMETHOD.
+ 
+  METHOD render_xml_string.
+
+    DATA: ls_input           TYPE ty_old,
+          lv_value           TYPE string,
+          lv_xml             TYPE string,
+          lo_output          TYPE REF TO zcl_abapgit_xml_output,
+          lo_conv_in_string  TYPE REF TO cl_abap_conv_in_ce,
+          lo_conv_out_string TYPE REF TO cl_abap_conv_out_ce,
+          lv_encoding        TYPE abap_encoding,
+          lv_xstring         TYPE xstring,
+          lv_bom             TYPE xstring.
+
+    ls_input-foo = '2'.
+    ls_input-bar = 'A'.
+
+    lv_value =
+      '<?xml version="1.0" encoding="utf-16"?>#<abapGit version="v1.0.0">#' &
+      ' <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">#' &
+      '  <asx:values>#   <DATA>#    <FOO>2</FOO>#    <BAR>A' &
+      '</BAR>#   </DATA>#  </asx:values># </asx:abap>#</abapGit>#'.
+
+    REPLACE ALL OCCURRENCES OF '#' IN lv_value WITH cl_abap_char_utilities=>newline.
+
+    CREATE OBJECT lo_output.
+    lo_output->zif_abapgit_xml_output~add( iv_name = 'DATA'
+                                           ig_data = ls_input ).
+
+    lv_xml = lo_output->zif_abapgit_xml_output~render( ).
+
+    lv_encoding = cl_abap_codepage=>sap_codepage( `UTF-16LE` ). "4103
+
+    lo_conv_out_string = cl_abap_conv_out_ce=>create(
+      encoding    = lv_encoding
+      ignore_cerr = 'X' ).
+
+    lo_conv_out_string->write( data = lv_value ).
+
+    lv_xstring = lo_conv_out_string->get_buffer( ).
+
+    lv_bom = cl_abap_char_utilities=>byte_order_mark_little. "UTF-16LE, 4103
+    CONCATENATE lv_bom lv_xstring INTO lv_xstring IN BYTE MODE.
+
+    lo_conv_in_string = cl_abap_conv_in_ce=>create(
+      encoding = lv_encoding
+      input    = lv_xstring ).
+
+    lo_conv_in_string->read( IMPORTING data = lv_value ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_xml
+      exp = lv_value ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/zcl_abapgit_xml_pretty.clas.abap.html b/src/xml/zcl_abapgit_xml_pretty.clas.abap.html new file mode 100644 index 00000000000..ed5f33b2d91 --- /dev/null +++ b/src/xml/zcl_abapgit_xml_pretty.clas.abap.html @@ -0,0 +1,289 @@ + + + + + + Code coverage report for src/xml/zcl_abapgit_xml_pretty.clas.abap + + + + + + + + + +
+
+

All files / src/xml zcl_abapgit_xml_pretty.clas.abap

+
+ +
+ 100% + Statements + 68/68 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 68/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +691x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_xml_pretty DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS print
+      IMPORTING
+        !iv_xml           TYPE string
+        !iv_ignore_errors TYPE abap_bool DEFAULT abap_true
+        !iv_unpretty      TYPE abap_bool DEFAULT abap_false
+      RETURNING
+        VALUE(rv_xml)     TYPE string
+      RAISING
+        zcx_abapgit_exception .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS ZCL_ABAPGIT_XML_PRETTY IMPLEMENTATION.
+ 
+ 
+  METHOD print.
+ 
+    DATA: li_ixml           TYPE REF TO if_ixml,
+          li_xml_doc        TYPE REF TO if_ixml_document,
+          li_stream_factory TYPE REF TO if_ixml_stream_factory,
+          li_istream        TYPE REF TO if_ixml_istream,
+          li_parser         TYPE REF TO if_ixml_parser,
+          li_ostream        TYPE REF TO if_ixml_ostream,
+          li_renderer       TYPE REF TO if_ixml_renderer.
+ 
+ 
+    ASSERT NOT iv_xml IS INITIAL.
+ 
+    li_ixml    = cl_ixml=>create( ).
+    li_xml_doc = li_ixml->create_document( ).
+ 
+    li_stream_factory = li_ixml->create_stream_factory( ).
+    li_istream        = li_stream_factory->create_istream_string( iv_xml ).
+    li_parser         = li_ixml->create_parser( stream_factory = li_stream_factory
+                                                istream        = li_istream
+                                                document       = li_xml_doc ).
+    li_parser->set_normalizing( abap_true ).
+    IF li_parser->parse( ) <> 0.
+      IF iv_ignore_errors = abap_true.
+        rv_xml = iv_xml.
+        RETURN.
+      ELSE.
+        zcx_abapgit_exception=>raise( 'error parsing xml' ).
+      ENDIF.
+    ENDIF.
+    li_istream->close( ).
+ 
+ 
+    li_ostream  = li_stream_factory->create_ostream_cstring( rv_xml ).
+ 
+    li_renderer = li_ixml->create_renderer( ostream  = li_ostream
+                                            document = li_xml_doc ).
+ 
+    li_renderer->set_normalizing( boolc( iv_unpretty = abap_false ) ).
+ 
+    li_renderer->render( ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap.html b/src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap.html new file mode 100644 index 00000000000..3a818357f95 --- /dev/null +++ b/src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap.html @@ -0,0 +1,409 @@ + + + + + + Code coverage report for src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src/xml zcl_abapgit_xml_pretty.clas.testclasses.abap

+
+ +
+ 35.18% + Statements + 38/108 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 35.18% + Lines + 38/108 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +1091x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
 
+CLASS ltcl_test DEFINITION FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PRIVATE SECTION.
+    DATA:
+      mo_cut TYPE REF TO zcl_abapgit_xml_pretty.
+ 
+    METHODS:
+      setup,
+      pretty1 FOR TESTING RAISING cx_static_check,
+      pretty2 FOR TESTING RAISING cx_static_check,
+      pretty3 FOR TESTING RAISING cx_static_check,
+      malformatted FOR TESTING RAISING cx_static_check,
+      dont_ignore_error FOR TESTING RAISING cx_static_check,
+      unpretty FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD setup.
+    CREATE OBJECT mo_cut.
+  ENDMETHOD.
+ 
+  METHOD pretty1.
+
+    DATA lv_result TYPE string.
+
+    lv_result = mo_cut->print( '<foo></foo>' ).
+    lv_result = lv_result+1.
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = |<?xml version="1.0" encoding="utf-16"?>\n<foo/>\n| ).
+
+  ENDMETHOD.
+ 
+  METHOD pretty2.
+
+    DATA lv_result TYPE string.
+
+    lv_result = mo_cut->print( '<foo>2</foo>' ).
+    lv_result = lv_result+1.
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = |<?xml version="1.0" encoding="utf-16"?>\n<foo>2</foo>\n| ).
+
+  ENDMETHOD.
+ 
+  METHOD pretty3.
+
+    DATA lv_result TYPE string.
+
+    lv_result = mo_cut->print( '<foo><bar>2</bar></foo>' ).
+    lv_result = lv_result+1.
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = |<?xml version="1.0" encoding="utf-16"?>\n<foo>\n <bar>2</bar>\n</foo>\n| ).
+
+  ENDMETHOD.
+ 
+  METHOD malformatted.
+
+    DATA lv_result TYPE string.
+
+    lv_result = mo_cut->print( 'abc' ).
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = 'abc' ).
+
+  ENDMETHOD.
+ 
+  METHOD dont_ignore_error.
+
+    TRY.
+        mo_cut->print(
+          iv_xml           = 'abc'
+          iv_ignore_errors = abap_false ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception.
+        RETURN.
+    ENDTRY.
+
+  ENDMETHOD.
+ 
+  METHOD unpretty.
+
+    DATA lv_result TYPE string.
+
+    lv_result = mo_cut->print(
+      iv_xml      = |<foo>\n <bar>2</bar>\n</foo>|
+      iv_unpretty = abap_true ).
+
+    lv_result = lv_result+1.
+
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_result
+      exp = |<?xml version="1.0" encoding="utf-16"?><foo><bar>2</bar></foo>| ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/zcl_abapgit_factory.clas.abap.html b/src/zcl_abapgit_factory.clas.abap.html new file mode 100644 index 00000000000..c9865ea7364 --- /dev/null +++ b/src/zcl_abapgit_factory.clas.abap.html @@ -0,0 +1,763 @@ + + + + + + Code coverage report for src/zcl_abapgit_factory.clas.abap + + + + + + + + + +
+
+

All files / src zcl_abapgit_factory.clas.abap

+
+ +
+ 98.23% + Statements + 222/226 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 98.23% + Lines + 222/226 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +2271x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_factory DEFINITION
+  PUBLIC
+  CREATE PRIVATE
+  GLOBAL FRIENDS zcl_abapgit_injector .
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS get_tadir
+      RETURNING
+        VALUE(ri_tadir) TYPE REF TO zif_abapgit_tadir .
+    CLASS-METHODS get_sap_package
+      IMPORTING
+        !iv_package           TYPE devclass
+      RETURNING
+        VALUE(ri_sap_package) TYPE REF TO zif_abapgit_sap_package .
+    CLASS-METHODS get_code_inspector
+      IMPORTING
+        !iv_package              TYPE devclass
+      RETURNING
+        VALUE(ri_code_inspector) TYPE REF TO zif_abapgit_code_inspector
+      RAISING
+        zcx_abapgit_exception .
+    CLASS-METHODS get_stage_logic
+      RETURNING
+        VALUE(ri_logic) TYPE REF TO zif_abapgit_stage_logic .
+    CLASS-METHODS get_cts_api
+      RETURNING
+        VALUE(ri_cts_api) TYPE REF TO zif_abapgit_cts_api .
+    CLASS-METHODS get_environment
+      RETURNING
+        VALUE(ri_environment) TYPE REF TO zif_abapgit_environment .
+    CLASS-METHODS get_longtexts
+      RETURNING
+        VALUE(ri_longtexts) TYPE REF TO zif_abapgit_longtexts .
+    CLASS-METHODS get_http_agent
+      RETURNING
+        VALUE(ri_http_agent) TYPE REF TO zif_abapgit_http_agent .
+    CLASS-METHODS get_lxe_texts
+      RETURNING
+        VALUE(ri_lxe_texts) TYPE REF TO zif_abapgit_lxe_texts .
+    CLASS-METHODS get_sap_namespace
+      RETURNING
+        VALUE(ri_namespace) TYPE REF TO zif_abapgit_sap_namespace .
+    CLASS-METHODS get_sap_report
+      RETURNING
+        VALUE(ri_report) TYPE REF TO zif_abapgit_sap_report.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    TYPES:
+      BEGIN OF ty_sap_package,
+        package  TYPE devclass,
+        instance TYPE REF TO zif_abapgit_sap_package,
+      END OF ty_sap_package .
+    TYPES:
+      ty_sap_packages TYPE HASHED TABLE OF ty_sap_package
+                                    WITH UNIQUE KEY package .
+    TYPES:
+      BEGIN OF ty_code_inspector_pack,
+        package  TYPE devclass,
+        instance TYPE REF TO zif_abapgit_code_inspector,
+      END OF ty_code_inspector_pack .
+    TYPES:
+      ty_code_inspector_packs TYPE HASHED TABLE OF ty_code_inspector_pack
+                                       WITH UNIQUE KEY package .
+ 
+    CLASS-DATA gi_tadir TYPE REF TO zif_abapgit_tadir .
+    CLASS-DATA gt_sap_package TYPE ty_sap_packages .
+    CLASS-DATA gt_code_inspector TYPE ty_code_inspector_packs .
+    CLASS-DATA gi_stage_logic TYPE REF TO zif_abapgit_stage_logic .
+    CLASS-DATA gi_cts_api TYPE REF TO zif_abapgit_cts_api .
+    CLASS-DATA gi_environment TYPE REF TO zif_abapgit_environment .
+    CLASS-DATA gi_longtext TYPE REF TO zif_abapgit_longtexts .
+    CLASS-DATA gi_http_agent TYPE REF TO zif_abapgit_http_agent .
+    CLASS-DATA gi_lxe_texts TYPE REF TO zif_abapgit_lxe_texts .
+    CLASS-DATA gi_sap_namespace TYPE REF TO zif_abapgit_sap_namespace .
+    CLASS-DATA gi_sap_report TYPE REF TO zif_abapgit_sap_report.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_factory IMPLEMENTATION.
+ 
+ 
+  METHOD get_code_inspector.
+ 
+    DATA: ls_code_inspector LIKE LINE OF gt_code_inspector.
+    FIELD-SYMBOLS: <ls_code_inspector> TYPE ty_code_inspector_pack.
+ 
+    READ TABLE gt_code_inspector ASSIGNING <ls_code_inspector>
+      WITH TABLE KEY package = iv_package.
+    IF sy-subrc <> 0.
+      ls_code_inspector-package = iv_package.
+ 
+      CREATE OBJECT ls_code_inspector-instance TYPE zcl_abapgit_code_inspector
+        EXPORTING
+          iv_package = iv_package.
+ 
+      INSERT ls_code_inspector
+             INTO TABLE gt_code_inspector
+             ASSIGNING <ls_code_inspector>.
+ 
+    ENDIF.
+ 
+    ri_code_inspector = <ls_code_inspector>-instance.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_cts_api.
+    IF gi_cts_api IS NOT BOUND.
+      CREATE OBJECT gi_cts_api TYPE zcl_abapgit_cts_api.
+    ENDIF.
+ 
+    ri_cts_api = gi_cts_api.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_environment.
+    IF gi_environment IS NOT BOUND.
+      CREATE OBJECT gi_environment TYPE zcl_abapgit_environment.
+    ENDIF.
+    ri_environment = gi_environment.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_http_agent.
+ 
+    IF gi_http_agent IS BOUND.
+      ri_http_agent = gi_http_agent.
+    ELSE.
+      ri_http_agent = zcl_abapgit_http_agent=>create( ).
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_longtexts.
+ 
+    IF gi_longtext IS NOT BOUND.
+      CREATE OBJECT gi_longtext TYPE zcl_abapgit_longtexts.
+    ENDIF.
+    ri_longtexts = gi_longtext.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_lxe_texts.
+ 
+    IF gi_lxe_texts IS NOT BOUND.
+      CREATE OBJECT gi_lxe_texts TYPE zcl_abapgit_lxe_texts.
+    ENDIF.
+    ri_lxe_texts = gi_lxe_texts.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sap_namespace.
+ 
+    IF gi_sap_namespace IS NOT BOUND.
+      CREATE OBJECT gi_sap_namespace TYPE zcl_abapgit_sap_namespace.
+    ENDIF.
+ 
+    ri_namespace = gi_sap_namespace.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sap_package.
+ 
+    DATA: ls_sap_package TYPE ty_sap_package.
+    FIELD-SYMBOLS: <ls_sap_package> TYPE ty_sap_package.
+ 
+    READ TABLE gt_sap_package ASSIGNING <ls_sap_package>
+                              WITH TABLE KEY package = iv_package.
+    IF sy-subrc <> 0.
+ 
+      ls_sap_package-package = iv_package.
+      CREATE OBJECT ls_sap_package-instance TYPE zcl_abapgit_sap_package
+        EXPORTING
+          iv_package = iv_package.
+ 
+      INSERT ls_sap_package
+             INTO TABLE gt_sap_package
+             ASSIGNING <ls_sap_package>.
+ 
+    ENDIF.
+ 
+    ri_sap_package = <ls_sap_package>-instance.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_sap_report.
+ 
+    IF gi_sap_report IS NOT BOUND.
+      CREATE OBJECT gi_sap_report TYPE zcl_abapgit_sap_report.
+    ENDIF.
+ 
+    ri_report = gi_sap_report.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_stage_logic.
+ 
+    IF gi_stage_logic IS INITIAL.
+      CREATE OBJECT gi_stage_logic
+        TYPE zcl_abapgit_stage_logic.
+    ENDIF.
+ 
+    ri_logic = gi_stage_logic.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_tadir.
+ 
+    IF gi_tadir IS INITIAL.
+      CREATE OBJECT gi_tadir TYPE zcl_abapgit_tadir.
+    ENDIF.
+ 
+    ri_tadir = gi_tadir.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/zcl_abapgit_injector.clas.abap.html b/src/zcl_abapgit_injector.clas.abap.html new file mode 100644 index 00000000000..9c3acd6c594 --- /dev/null +++ b/src/zcl_abapgit_injector.clas.abap.html @@ -0,0 +1,514 @@ + + + + + + Code coverage report for src/zcl_abapgit_injector.clas.abap + + + + + + + + + +
+
+

All files / src zcl_abapgit_injector.clas.abap

+
+ +
+ 100% + Statements + 143/143 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 143/143 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +1441x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +11x +11x +11x +11x +11x +11x +11x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcl_abapgit_injector DEFINITION
+  PUBLIC
+  CREATE PRIVATE.
+ 
+  PUBLIC SECTION.
+ 
+    CLASS-METHODS set_tadir
+      IMPORTING
+        !ii_tadir TYPE REF TO zif_abapgit_tadir .
+    CLASS-METHODS set_sap_package
+      IMPORTING
+        !iv_package     TYPE devclass
+        !ii_sap_package TYPE REF TO zif_abapgit_sap_package .
+    CLASS-METHODS set_code_inspector
+      IMPORTING
+        !iv_package        TYPE devclass
+        !ii_code_inspector TYPE REF TO zif_abapgit_code_inspector .
+    CLASS-METHODS set_stage_logic
+      IMPORTING
+        !ii_logic TYPE REF TO zif_abapgit_stage_logic .
+    CLASS-METHODS set_cts_api
+      IMPORTING
+        !ii_cts_api TYPE REF TO zif_abapgit_cts_api .
+    CLASS-METHODS set_environment
+      IMPORTING
+        !ii_environment TYPE REF TO zif_abapgit_environment .
+    CLASS-METHODS set_longtexts
+      IMPORTING
+        !ii_longtexts TYPE REF TO zif_abapgit_longtexts .
+    CLASS-METHODS set_http_agent
+      IMPORTING
+        !ii_http_agent TYPE REF TO zif_abapgit_http_agent .
+    CLASS-METHODS set_lxe_texts
+      IMPORTING
+        !ii_lxe_texts TYPE REF TO zif_abapgit_lxe_texts .
+    CLASS-METHODS set_sap_namespace
+      IMPORTING
+        !ii_namespace TYPE REF TO zif_abapgit_sap_namespace .
+    CLASS-METHODS set_sap_report
+      IMPORTING
+        !ii_report TYPE REF TO zif_abapgit_sap_report.
+ 
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_injector IMPLEMENTATION.
+ 
+ 
+  METHOD set_code_inspector.
+ 
+    DATA: ls_code_inspector LIKE LINE OF zcl_abapgit_factory=>gt_code_inspector.
+    FIELD-SYMBOLS: <ls_code_inspector> LIKE LINE OF zcl_abapgit_factory=>gt_code_inspector.
+ 
+    READ TABLE zcl_abapgit_factory=>gt_code_inspector
+         ASSIGNING <ls_code_inspector>
+         WITH TABLE KEY package = iv_package.
+    IF sy-subrc <> 0.
+ 
+      ls_code_inspector-package = iv_package.
+ 
+      INSERT ls_code_inspector
+             INTO TABLE zcl_abapgit_factory=>gt_code_inspector
+             ASSIGNING <ls_code_inspector>.
+ 
+    ENDIF.
+ 
+    <ls_code_inspector>-instance = ii_code_inspector.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_cts_api.
+    zcl_abapgit_factory=>gi_cts_api = ii_cts_api.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_environment.
+    zcl_abapgit_factory=>gi_environment = ii_environment.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_http_agent.
+    zcl_abapgit_factory=>gi_http_agent = ii_http_agent.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_longtexts.
+    zcl_abapgit_factory=>gi_longtext = ii_longtexts.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_lxe_texts.
+    zcl_abapgit_factory=>gi_lxe_texts = ii_lxe_texts.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_sap_namespace.
+    zcl_abapgit_factory=>gi_sap_namespace = ii_namespace.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_sap_package.
+ 
+    DATA: ls_sap_package TYPE zcl_abapgit_factory=>ty_sap_package.
+    FIELD-SYMBOLS: <ls_sap_package> TYPE zcl_abapgit_factory=>ty_sap_package.
+ 
+    READ TABLE zcl_abapgit_factory=>gt_sap_package
+         ASSIGNING <ls_sap_package>
+         WITH TABLE KEY package = iv_package.
+ 
+    IF sy-subrc <> 0.
+ 
+      ls_sap_package-package = iv_package.
+      INSERT ls_sap_package
+             INTO TABLE zcl_abapgit_factory=>gt_sap_package
+             ASSIGNING <ls_sap_package>.
+ 
+    ENDIF.
+ 
+    <ls_sap_package>-instance = ii_sap_package.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_sap_report.
+    zcl_abapgit_factory=>gi_sap_report = ii_report.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_stage_logic.
+ 
+    zcl_abapgit_factory=>gi_stage_logic = ii_logic.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD set_tadir.
+    zcl_abapgit_factory=>gi_tadir = ii_tadir.
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/zcl_abapgit_injector.clas.testclasses.abap.html b/src/zcl_abapgit_injector.clas.testclasses.abap.html new file mode 100644 index 00000000000..b13f093e264 --- /dev/null +++ b/src/zcl_abapgit_injector.clas.testclasses.abap.html @@ -0,0 +1,358 @@ + + + + + + Code coverage report for src/zcl_abapgit_injector.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src zcl_abapgit_injector.clas.testclasses.abap

+
+ +
+ 62.63% + Statements + 57/91 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 62.63% + Lines + 57/91 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +921x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
CLASS ltcl_abapgit_tadir_mock DEFINITION FOR TESTING.
+ 
+  PUBLIC SECTION.
+    INTERFACES: zif_abapgit_tadir.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_no_dependency_injection DEFINITION FOR TESTING
+                              RISK LEVEL HARMLESS
+                              DURATION SHORT.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      no_injection FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_simple_dependency_inject DEFINITION FOR TESTING
+                                  RISK LEVEL HARMLESS
+                                  DURATION SHORT.
+ 
+  PRIVATE SECTION.
+    METHODS:
+      setup,
+      simple_injection FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_abapgit_tadir_mock IMPLEMENTATION.
+ 
+  METHOD zif_abapgit_tadir~get_object_package.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_tadir~read.
+ 
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_tadir~read_single.
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_no_dependency_injection IMPLEMENTATION.
+ 
+  METHOD no_injection.
+
+    DATA: li_tadir       TYPE REF TO zif_abapgit_tadir,
+          lo_class_descr TYPE REF TO cl_abap_classdescr.
+
+    li_tadir = zcl_abapgit_factory=>get_tadir( ).
+
+    lo_class_descr ?= cl_abap_classdescr=>describe_by_object_ref( li_tadir ).
+
+    cl_abap_unit_assert=>assert_equals(
+      exp = '\CLASS=ZCL_ABAPGIT_TADIR'
+      act = lo_class_descr->absolute_name ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_simple_dependency_inject IMPLEMENTATION.
+ 
+  METHOD setup.
+
+    DATA: lo_tadir_mock  TYPE REF TO ltcl_abapgit_tadir_mock.
+
+    CREATE OBJECT lo_tadir_mock.
+
+    zcl_abapgit_injector=>set_tadir( lo_tadir_mock ).
+
+  ENDMETHOD.
+ 
+  METHOD simple_injection.
+
+    DATA: li_tadir       TYPE REF TO zif_abapgit_tadir,
+          lo_class_descr TYPE REF TO cl_abap_classdescr.
+
+    li_tadir = zcl_abapgit_factory=>get_tadir( ).
+
+    lo_class_descr ?= cl_abap_classdescr=>describe_by_object_ref( li_tadir ).
+
+    cl_abap_unit_assert=>assert_equals(
+      exp = '\CLASS-POOL=ZCL_ABAPGIT_INJECTOR\CLASS=LTCL_ABAPGIT_TADIR_MOCK'
+      act = lo_class_descr->absolute_name ).
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/zcl_abapgit_settings.clas.abap.html b/src/zcl_abapgit_settings.clas.abap.html new file mode 100644 index 00000000000..7746c2c5a33 --- /dev/null +++ b/src/zcl_abapgit_settings.clas.abap.html @@ -0,0 +1,1555 @@ + + + + + + Code coverage report for src/zcl_abapgit_settings.clas.abap + + + + + + + + + +
+
+

All files / src zcl_abapgit_settings.clas.abap

+
+ +
+ 82.65% + Statements + 405/490 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 4.34% + Functions + 1/23 +
+ + +
+ 82.65% + Lines + 405/490 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +4911x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +1x +1x +1x +9x +9x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
CLASS zcl_abapgit_settings DEFINITION
+  PUBLIC
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    CONSTANTS c_commitmsg_comment_length_dft TYPE i VALUE 50 ##NO_TEXT.
+    CONSTANTS c_commitmsg_body_size_dft TYPE i VALUE 72 ##NO_TEXT.
+    CONSTANTS:
+      BEGIN OF c_icon_scaling,
+        large TYPE c VALUE 'L',
+        small TYPE c VALUE 'S',
+      END OF c_icon_scaling .
+    CONSTANTS:
+      BEGIN OF c_ui_theme,
+        default         TYPE string VALUE 'default',
+        dark            TYPE string VALUE 'dark',
+        belize          TYPE string VALUE 'belize',
+        synced_with_gui TYPE string VALUE 'synced_with_gui',
+      END OF c_ui_theme .
+ 
+    METHODS set_proxy_url
+      IMPORTING
+        !iv_url TYPE string .
+    METHODS set_proxy_port
+      IMPORTING
+        !iv_port TYPE string .
+    METHODS set_proxy_authentication
+      IMPORTING
+        !iv_auth TYPE abap_bool .
+    METHODS set_proxy_bypass
+      IMPORTING
+        !it_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url OPTIONAL .
+    METHODS get_proxy_url
+      RETURNING
+        VALUE(rv_proxy_url) TYPE string .
+    METHODS get_proxy_port
+      RETURNING
+        VALUE(rv_port) TYPE string .
+    METHODS get_proxy_authentication
+      RETURNING
+        VALUE(rv_auth) TYPE abap_bool .
+    METHODS get_proxy_bypass
+      RETURNING
+        VALUE(rt_bypass) TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url .
+    METHODS set_run_critical_tests
+      IMPORTING
+        !iv_run TYPE abap_bool .
+    METHODS get_run_critical_tests
+      RETURNING
+        VALUE(rv_run) TYPE abap_bool .
+    METHODS set_experimental_features
+      IMPORTING
+        !iv_run TYPE abap_bool .
+    METHODS get_experimental_features
+      RETURNING
+        VALUE(rv_run) TYPE abap_bool .
+    METHODS set_max_lines
+      IMPORTING
+        !iv_lines TYPE i .
+    METHODS get_max_lines
+      RETURNING
+        VALUE(rv_lines) TYPE i .
+    METHODS set_adt_jump_enanbled
+      IMPORTING
+        !iv_adt_jump_enabled TYPE abap_bool .
+    METHODS get_adt_jump_enabled
+      RETURNING
+        VALUE(rv_adt_jump_enabled) TYPE abap_bool .
+    METHODS set_commitmsg_comment_length
+      IMPORTING
+        !iv_length TYPE i .
+    METHODS get_commitmsg_comment_length
+      RETURNING
+        VALUE(rv_length) TYPE i .
+    METHODS set_commitmsg_comment_default
+      IMPORTING
+        !iv_default TYPE string .
+    METHODS get_commitmsg_comment_default
+      RETURNING
+        VALUE(rv_default) TYPE string .
+    METHODS set_commitmsg_body_size
+      IMPORTING
+        !iv_length TYPE i .
+    METHODS get_commitmsg_body_size
+      RETURNING
+        VALUE(rv_length) TYPE i .
+    METHODS set_commitmsg_hide_author
+      IMPORTING
+        !iv_hide_author TYPE abap_bool.
+    METHODS get_commitmsg_hide_author
+      RETURNING
+        VALUE(rv_hide_author) TYPE abap_bool.
+    METHODS get_settings_xml
+      RETURNING
+        VALUE(rv_settings_xml) TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS get_user_settings
+      RETURNING
+        VALUE(rs_settings) TYPE zif_abapgit_definitions=>ty_s_user_settings
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_xml_settings
+      IMPORTING
+        !iv_settings_xml TYPE string
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_defaults .
+    METHODS set_user_settings
+      IMPORTING
+        !is_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings .
+    METHODS get_show_default_repo
+      RETURNING
+        VALUE(rv_show_default_repo) TYPE abap_bool .
+    METHODS set_show_default_repo
+      IMPORTING
+        !iv_show_default_repo TYPE abap_bool .
+    METHODS set_link_hints_enabled
+      IMPORTING
+        !iv_link_hints_enabled TYPE abap_bool .
+    METHODS get_link_hints_enabled
+      RETURNING
+        VALUE(rv_link_hints_enabled) TYPE abap_bool
+      RAISING
+        zcx_abapgit_exception .
+    METHODS set_link_hint_key
+      IMPORTING
+        !iv_link_hint_key TYPE string .
+    METHODS get_link_hint_key
+      RETURNING
+        VALUE(rv_link_hint_key) TYPE string .
+    METHODS set_parallel_proc_disabled
+      IMPORTING
+        !iv_disable_parallel_proc TYPE abap_bool .
+    METHODS get_parallel_proc_disabled
+      RETURNING
+        VALUE(rv_disable_parallel_proc) TYPE abap_bool .
+    METHODS get_icon_scaling
+      RETURNING
+        VALUE(rv_scaling) TYPE zif_abapgit_definitions=>ty_s_user_settings-icon_scaling .
+    METHODS set_icon_scaling
+      IMPORTING
+        !iv_scaling TYPE zif_abapgit_definitions=>ty_s_user_settings-icon_scaling .
+    METHODS get_ui_theme
+      IMPORTING
+        !iv_resolve_synced TYPE abap_bool DEFAULT abap_true
+      RETURNING
+        VALUE(rv_ui_theme) TYPE zif_abapgit_definitions=>ty_s_user_settings-ui_theme .
+    METHODS set_ui_theme
+      IMPORTING
+        !iv_ui_theme TYPE zif_abapgit_definitions=>ty_s_user_settings-ui_theme .
+    METHODS get_activate_wo_popup
+      RETURNING
+        VALUE(rv_act_wo_popup) TYPE zif_abapgit_definitions=>ty_s_user_settings-activate_wo_popup .
+    METHODS set_activate_wo_popup
+      IMPORTING
+        !iv_act_wo_popup TYPE zif_abapgit_definitions=>ty_s_user_settings-activate_wo_popup .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES: BEGIN OF ty_s_settings,
+             proxy_url                TYPE string,
+             proxy_port               TYPE string,
+             proxy_auth               TYPE string,
+             proxy_bypass             TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url,
+             run_critical_tests       TYPE abap_bool,
+             experimental_features    TYPE abap_bool,
+             commitmsg_comment_length TYPE i,
+             commitmsg_comment_deflt  TYPE string,
+             commitmsg_body_size      TYPE i,
+             commitmsg_hide_author    TYPE abap_bool,
+           END OF ty_s_settings.
+ 
+    DATA: ms_settings      TYPE ty_s_settings,
+          ms_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings.
+ 
+    METHODS:
+      set_default_link_hint_key.
+ 
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcl_abapgit_settings IMPLEMENTATION.
+ 
+ 
+  METHOD get_activate_wo_popup.
+    rv_act_wo_popup = ms_user_settings-activate_wo_popup.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_adt_jump_enabled.
+    rv_adt_jump_enabled = ms_user_settings-adt_jump_enabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_commitmsg_body_size.
+    rv_length = ms_settings-commitmsg_body_size.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_commitmsg_comment_default.
+    rv_default = ms_settings-commitmsg_comment_deflt.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_commitmsg_comment_length.
+    rv_length = ms_settings-commitmsg_comment_length.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_commitmsg_hide_author.
+    rv_hide_author = ms_settings-commitmsg_hide_author.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_experimental_features.
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      rv_run = ms_settings-experimental_features.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_icon_scaling.
+    rv_scaling = ms_user_settings-icon_scaling.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_link_hints_enabled.
+    rv_link_hints_enabled = ms_user_settings-link_hints_enabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_link_hint_key.
+    rv_link_hint_key = ms_user_settings-link_hint_key.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_max_lines.
+    rv_lines = ms_user_settings-max_lines.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_parallel_proc_disabled.
+    rv_disable_parallel_proc = ms_user_settings-parallel_proc_disabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_authentication.
+    rv_auth = ms_settings-proxy_auth.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_bypass.
+    rt_bypass = ms_settings-proxy_bypass.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_port.
+    rv_port = ms_settings-proxy_port.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_proxy_url.
+    rv_proxy_url = ms_settings-proxy_url.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_run_critical_tests.
+    IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
+      rv_run = ms_settings-run_critical_tests.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_settings_xml.
+ 
+    DATA: li_output TYPE REF TO zif_abapgit_xml_output.
+ 
+ 
+    CREATE OBJECT li_output TYPE zcl_abapgit_xml_output.
+ 
+    li_output->add( iv_name = zcl_abapgit_persistence_db=>c_type_settings
+                    ig_data = ms_settings ).
+ 
+    rv_settings_xml = li_output->render( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_show_default_repo.
+    rv_show_default_repo = ms_user_settings-show_default_repo.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_ui_theme.
+    DATA lv_frontend_theme TYPE string.
+    DATA lv_cl_gui TYPE string.
+ 
+    lv_cl_gui = 'CL_GUI_RESOURCES'.
+ 
+    rv_ui_theme = ms_user_settings-ui_theme.
+ 
+    IF rv_ui_theme = c_ui_theme-synced_with_gui AND iv_resolve_synced = abap_true.
+      TRY.
+          CALL METHOD (lv_cl_gui)=>get_themename
+            IMPORTING
+              themename              = lv_frontend_theme
+            EXCEPTIONS
+              get_std_resource_error = 1
+              OTHERS                 = 2.
+          IF sy-subrc <> 0.
+            rv_ui_theme = c_ui_theme-default.
+            RETURN.
+          ENDIF.
+        CATCH cx_sy_dyn_call_error.
+          rv_ui_theme = c_ui_theme-default.
+          RETURN.
+      ENDTRY.
+ 
+      CASE lv_frontend_theme.
+        WHEN 'Belize'.
+          rv_ui_theme = c_ui_theme-belize.
+        WHEN OTHERS.
+          rv_ui_theme = c_ui_theme-default.
+      ENDCASE.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD get_user_settings.
+    rs_settings = ms_user_settings.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_activate_wo_popup.
+    ms_user_settings-activate_wo_popup = iv_act_wo_popup.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_adt_jump_enanbled.
+    ms_user_settings-adt_jump_enabled = iv_adt_jump_enabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_commitmsg_body_size.
+    ms_settings-commitmsg_body_size = iv_length.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_commitmsg_comment_default.
+    ms_settings-commitmsg_comment_deflt = iv_default.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_commitmsg_comment_length.
+    ms_settings-commitmsg_comment_length = iv_length.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_commitmsg_hide_author.
+    ms_settings-commitmsg_hide_author = iv_hide_author.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_defaults.
+
+    CLEAR ms_settings.
+
+    set_proxy_authentication( abap_false ).
+    set_run_critical_tests( abap_false ).
+    set_experimental_features( abap_false ).
+    set_max_lines( 500 ).
+    set_adt_jump_enanbled( abap_true ).
+    set_show_default_repo( abap_false ).
+    set_commitmsg_comment_length( c_commitmsg_comment_length_dft ).
+    set_commitmsg_body_size( c_commitmsg_body_size_dft ).
+    set_default_link_hint_key( ).
+    set_icon_scaling( '' ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_default_link_hint_key.
+    " Since #5859 'f' is used for "focus filter", we use 't' as the new default
+    set_link_hint_key( |t| ).
+  ENDMETHOD.
+ 
+ 
+  METHOD set_experimental_features.
+    ms_settings-experimental_features = iv_run.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_icon_scaling.
+    ms_user_settings-icon_scaling = iv_scaling.
+    IF ms_user_settings-icon_scaling NA c_icon_scaling.
+      ms_user_settings-icon_scaling = ''. " Reset to default
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_link_hints_enabled.
+    ms_user_settings-link_hints_enabled = iv_link_hints_enabled.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_link_hint_key.
+    ms_user_settings-link_hint_key = iv_link_hint_key.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_max_lines.
+    ms_user_settings-max_lines = iv_lines.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_parallel_proc_disabled.
+    ms_user_settings-parallel_proc_disabled = iv_disable_parallel_proc.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_proxy_authentication.
+    ms_settings-proxy_auth = iv_auth.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_proxy_bypass.
+    ms_settings-proxy_bypass = it_bypass.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_proxy_port.
+    ms_settings-proxy_port = iv_port.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_proxy_url.
+    ms_settings-proxy_url = iv_url.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_run_critical_tests.
+    ms_settings-run_critical_tests = iv_run.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_show_default_repo.
+    ms_user_settings-show_default_repo = iv_show_default_repo.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_ui_theme.
+    ms_user_settings-ui_theme = iv_ui_theme.
+    IF ms_user_settings-ui_theme <> c_ui_theme-default
+        AND ms_user_settings-ui_theme <> c_ui_theme-dark
+        AND ms_user_settings-ui_theme <> c_ui_theme-belize
+        AND ms_user_settings-ui_theme <> c_ui_theme-synced_with_gui.
+      ms_user_settings-ui_theme = c_ui_theme-default. " Reset to default
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD set_user_settings.
+    ms_user_settings = is_user_settings.
+
+    IF ms_user_settings-link_hint_key IS INITIAL.
+      set_default_link_hint_key( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD set_xml_settings.
+
+    DATA: lo_input TYPE REF TO zif_abapgit_xml_input.
+
+
+    CREATE OBJECT lo_input TYPE zcl_abapgit_xml_input EXPORTING iv_xml = iv_settings_xml.
+
+    CLEAR ms_settings.
+
+    lo_input->read(
+      EXPORTING
+        iv_name = zcl_abapgit_persistence_db=>c_type_settings
+      CHANGING
+        cg_data = ms_settings ).
+
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/zcx_abapgit_exception.clas.abap.html b/src/zcx_abapgit_exception.clas.abap.html new file mode 100644 index 00000000000..86c0c2cb1d2 --- /dev/null +++ b/src/zcx_abapgit_exception.clas.abap.html @@ -0,0 +1,1465 @@ + + + + + + Code coverage report for src/zcx_abapgit_exception.clas.abap + + + + + + + + + +
+
+

All files / src zcx_abapgit_exception.clas.abap

+
+ +
+ 89.34% + Statements + 411/460 +
+ + +
+ 64.7% + Branches + 11/17 +
+ + +
+ 25% + Functions + 1/4 +
+ + +
+ 89.34% + Lines + 411/460 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +4611x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +2x +2x +84x +84x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +4x +1x +1x +1x +  +  +  +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +74x +74x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +86x +  +  +86x +86x +86x +86x +86x +86x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
"! abapGit general error
+CLASS zcx_abapgit_exception DEFINITION
+  PUBLIC
+  INHERITING FROM cx_static_check
+  CREATE PUBLIC .
+ 
+  PUBLIC SECTION.
+ 
+    INTERFACES if_t100_message .
+ 
+    CONSTANTS:
+      BEGIN OF c_section_text,
+        cause           TYPE string VALUE `Cause`,
+        system_response TYPE string VALUE `System response`,
+        what_to_do      TYPE string VALUE `Procedure`,
+        sys_admin       TYPE string VALUE `System administration`,
+      END OF c_section_text .
+    CONSTANTS:
+      BEGIN OF c_section_token,
+        cause           TYPE string VALUE `&CAUSE&`,
+        system_response TYPE string VALUE `&SYSTEM_RESPONSE&`,
+        what_to_do      TYPE string VALUE `&WHAT_TO_DO&`,
+        sys_admin       TYPE string VALUE `&SYS_ADMIN&`,
+      END OF c_section_token .
+ 
+    CLASS-DATA null TYPE string.
+ 
+    DATA msgv1 TYPE symsgv READ-ONLY .
+    DATA msgv2 TYPE symsgv READ-ONLY .
+    DATA msgv3 TYPE symsgv READ-ONLY .
+    DATA msgv4 TYPE symsgv READ-ONLY .
+    DATA mv_longtext TYPE string READ-ONLY.
+    DATA mt_callstack TYPE abap_callstack READ-ONLY.
+    DATA mi_log TYPE REF TO zif_abapgit_log READ-ONLY.
+ 
+    "! Raise exception with text
+    "! @parameter iv_text | Text
+    "! @parameter ix_previous | Previous exception
+    "! @parameter ii_log | Log
+    "! @parameter iv_longtext | Longtext
+    "! @raising zcx_abapgit_exception | Exception
+    CLASS-METHODS raise
+      IMPORTING
+        !iv_text     TYPE clike
+        !ix_previous TYPE REF TO cx_root OPTIONAL
+        !ii_log      TYPE REF TO zif_abapgit_log OPTIONAL
+        !iv_longtext TYPE csequence OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    "! Raise exception with T100 message
+    "! <p>
+    "! Will default to sy-msg* variables. These need to be set right before calling this method.
+    "! </p>
+    "! @parameter iv_msgid | Message ID
+    "! @parameter iv_msgno | Message number
+    "! @parameter iv_msgv1 | Message variable 1
+    "! @parameter iv_msgv2 | Message variable 2
+    "! @parameter iv_msgv3 | Message variable 3
+    "! @parameter iv_msgv4 | Message variable 4
+    "! @parameter ii_log | Log
+    "! @parameter ix_previous | Previous exception
+    "! @parameter iv_longtext | Longtext
+    "! @raising zcx_abapgit_exception | Exception
+    CLASS-METHODS raise_t100
+      IMPORTING
+        VALUE(iv_msgid) TYPE symsgid DEFAULT sy-msgid
+        VALUE(iv_msgno) TYPE symsgno DEFAULT sy-msgno
+        VALUE(iv_msgv1) TYPE symsgv DEFAULT sy-msgv1
+        VALUE(iv_msgv2) TYPE symsgv DEFAULT sy-msgv2
+        VALUE(iv_msgv3) TYPE symsgv DEFAULT sy-msgv3
+        VALUE(iv_msgv4) TYPE symsgv DEFAULT sy-msgv4
+        !ii_log         TYPE REF TO zif_abapgit_log OPTIONAL
+        !ix_previous    TYPE REF TO cx_root OPTIONAL
+        !iv_longtext    TYPE csequence OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    "! Raise with text from previous exception
+    "! @parameter ix_previous | Previous exception
+    "! @parameter iv_longtext | Longtext
+    "! @raising zcx_abapgit_exception | Exception
+    CLASS-METHODS raise_with_text
+      IMPORTING
+        !ix_previous TYPE REF TO cx_root
+        !iv_longtext TYPE csequence OPTIONAL
+      RAISING
+        zcx_abapgit_exception .
+    METHODS constructor
+      IMPORTING
+        !textid   LIKE if_t100_message=>t100key OPTIONAL
+        !previous LIKE previous OPTIONAL
+        !log      TYPE REF TO zif_abapgit_log OPTIONAL
+        !msgv1    TYPE symsgv OPTIONAL
+        !msgv2    TYPE symsgv OPTIONAL
+        !msgv3    TYPE symsgv OPTIONAL
+        !msgv4    TYPE symsgv OPTIONAL
+        !longtext TYPE csequence OPTIONAL .
+ 
+    METHODS get_source_position
+        REDEFINITION .
+    METHODS if_message~get_longtext
+        REDEFINITION .
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ 
+    CONSTANTS c_generic_error_msg TYPE string VALUE `An error occured (ZCX_ABAPGIT_EXCEPTION)`.
+ 
+    CLASS-METHODS split_text_to_symsg
+      IMPORTING
+        !iv_text      TYPE string
+      RETURNING
+        VALUE(rs_msg) TYPE symsg .
+    METHODS save_callstack .
+    METHODS itf_to_string
+      IMPORTING
+        !it_itf          TYPE tline_tab
+      RETURNING
+        VALUE(rv_result) TYPE string .
+    METHODS get_t100_longtext_itf
+      RETURNING
+        VALUE(rt_itf) TYPE tline_tab .
+    METHODS remove_empty_section
+      IMPORTING
+        !iv_tabix_from TYPE i
+        !iv_tabix_to   TYPE i
+      CHANGING
+        !ct_itf        TYPE tline_tab .
+    METHODS replace_section_head_with_text
+      CHANGING
+        !cs_itf TYPE tline .
+    CLASS-METHODS remove_newlines_from_string
+      IMPORTING
+        iv_string        TYPE string
+      RETURNING
+        VALUE(rv_result) TYPE string.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcx_abapgit_exception IMPLEMENTATION.
+ 
+ 
+  METHOD constructor ##ADT_SUPPRESS_GENERATION.
+ 
+    super->constructor( previous = previous ).
+ 
+    me->msgv1 = msgv1.
+    me->msgv2 = msgv2.
+    me->msgv3 = msgv3.
+    me->msgv4 = msgv4.
+    mi_log = log.
+    mv_longtext = longtext.
+ 
+    CLEAR me->textid.
+ 
+    IF textid IS INITIAL.
+      if_t100_message~t100key = if_t100_message=>default_textid.
+    ELSE.
+      if_t100_message~t100key = textid.
+    ENDIF.
+ 
+    save_callstack( ).
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD get_source_position.
+
+    FIELD-SYMBOLS: <ls_callstack> LIKE LINE OF mt_callstack.
+
+    READ TABLE mt_callstack ASSIGNING <ls_callstack>
+                            INDEX 1.
+    IF sy-subrc = 0.
+      program_name = <ls_callstack>-mainprogram.
+      include_name = <ls_callstack>-include.
+      source_line  = <ls_callstack>-line.
+    ELSE.
+      super->get_source_position(
+        IMPORTING
+          program_name = program_name
+          include_name = include_name
+          source_line  = source_line ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD get_t100_longtext_itf.
+ 
+    DATA: lv_docu_key TYPE doku_obj.
+ 
+    FIELD-SYMBOLS <lv_msgv> TYPE any.
+ 
+    lv_docu_key = if_t100_message~t100key-msgid && if_t100_message~t100key-msgno.
+ 
+    CALL FUNCTION 'DOCU_GET'
+      EXPORTING
+        id     = 'NA'
+        langu  = sy-langu
+        object = lv_docu_key
+        typ    = 'E'
+      TABLES
+        line   = rt_itf
+      EXCEPTIONS
+        OTHERS = 1.
+ 
+    IF sy-subrc = 0.
+      ASSIGN me->(if_t100_message~t100key-attr1) TO <lv_msgv>.
+      IF sy-subrc = 0.
+        REPLACE ALL OCCURRENCES OF '&V1&' IN TABLE rt_itf WITH <lv_msgv>.
+      ENDIF.
+      ASSIGN me->(if_t100_message~t100key-attr2) TO <lv_msgv>.
+      IF sy-subrc = 0.
+        REPLACE ALL OCCURRENCES OF '&V2&' IN TABLE rt_itf WITH <lv_msgv>.
+      ENDIF.
+      ASSIGN me->(if_t100_message~t100key-attr3) TO <lv_msgv>.
+      IF sy-subrc = 0.
+        REPLACE ALL OCCURRENCES OF '&V3&' IN TABLE rt_itf WITH <lv_msgv>.
+      ENDIF.
+      ASSIGN me->(if_t100_message~t100key-attr4) TO <lv_msgv>.
+      IF sy-subrc = 0.
+        REPLACE ALL OCCURRENCES OF '&V4&' IN TABLE rt_itf WITH <lv_msgv>.
+      ENDIF.
+    ENDIF.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD if_message~get_longtext.
+    DATA: lv_preserve_newlines_handled TYPE abap_bool VALUE abap_false.
+ 
+    IF mv_longtext IS NOT INITIAL.
+      result = mv_longtext.
+    ELSEIF if_t100_message~t100key IS NOT INITIAL.
+      result = itf_to_string( get_t100_longtext_itf( ) ).
+    ELSE.
+      result = super->get_longtext( preserve_newlines ).
+      lv_preserve_newlines_handled = abap_true.
+    ENDIF.
+ 
+    IF lv_preserve_newlines_handled = abap_false AND preserve_newlines = abap_false.
+      result = remove_newlines_from_string( result ).
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD itf_to_string.
+ 
+    CONSTANTS: lc_format_section TYPE string VALUE 'U1'.
+ 
+    DATA:
+      lt_stream      TYPE TABLE OF tdline,
+      lt_string      TYPE TABLE OF string,
+      lv_string      LIKE LINE OF lt_string,
+      lt_itf         TYPE tline_tab,
+      lv_has_content TYPE abap_bool,
+      lv_tabix_from  TYPE syst-tabix,
+      lv_tabix_to    TYPE syst-tabix.
+ 
+    FIELD-SYMBOLS: <ls_itf_section>      TYPE tline,
+                   <ls_itf_section_item> TYPE tline.
+ 
+    lt_itf = it_itf.
+ 
+    " You should remember that we replace the U1 format because
+    " that preserves the section header of longtexts.
+    LOOP AT lt_itf ASSIGNING <ls_itf_section>
+                   WHERE tdformat = lc_format_section.
+ 
+      CLEAR:
+        lv_has_content,
+        lv_tabix_to.
+ 
+      lv_tabix_from = sy-tabix.
+ 
+      LOOP AT lt_itf ASSIGNING <ls_itf_section_item>
+                     FROM sy-tabix + 1.
+ 
+        IF <ls_itf_section_item>-tdformat = lc_format_section.
+          lv_tabix_to = sy-tabix.
+          EXIT.
+        ELSEIF <ls_itf_section_item>-tdline IS NOT INITIAL.
+          lv_has_content = abap_true.
+        ENDIF.
+ 
+      ENDLOOP.
+ 
+      IF lv_has_content = abap_false.
+        remove_empty_section(
+          EXPORTING
+            iv_tabix_from = lv_tabix_from
+            iv_tabix_to   = lv_tabix_to
+          CHANGING
+            ct_itf        = lt_itf ).
+        CONTINUE.
+      ENDIF.
+ 
+      replace_section_head_with_text( CHANGING cs_itf = <ls_itf_section> ).
+ 
+    ENDLOOP.
+ 
+    CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
+      EXPORTING
+        lf           = 'X'
+      IMPORTING
+        stream_lines = lt_string
+      TABLES
+        itf_text     = lt_itf
+        text_stream  = lt_stream.
+ 
+    LOOP AT lt_string INTO lv_string.
+      IF sy-tabix = 1.
+        rv_result = lv_string.
+      ELSE.
+        CONCATENATE rv_result lv_string
+                    INTO rv_result
+                    SEPARATED BY cl_abap_char_utilities=>newline.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD raise.
+ 
+    DATA lv_text TYPE string.
+ 
+    IF iv_text IS INITIAL.
+      lv_text = c_generic_error_msg.
+    ELSE.
+      lv_text = iv_text.
+    ENDIF.
+ 
+    split_text_to_symsg( lv_text ).
+ 
+    raise_t100(
+      ii_log      = ii_log
+      ix_previous = ix_previous
+      iv_longtext = iv_longtext ).
+
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_t100.
+    DATA: ls_t100_key TYPE scx_t100key.
+ 
+    ls_t100_key-msgid = iv_msgid.
+    ls_t100_key-msgno = iv_msgno.
+    ls_t100_key-attr1 = 'MSGV1'.
+    ls_t100_key-attr2 = 'MSGV2'.
+    ls_t100_key-attr3 = 'MSGV3'.
+    ls_t100_key-attr4 = 'MSGV4'.
+ 
+    IF iv_msgid IS INITIAL.
+      CLEAR ls_t100_key.
+    ENDIF.
+ 
+    RAISE EXCEPTION TYPE zcx_abapgit_exception
+      EXPORTING
+        textid   = ls_t100_key
+        log      = ii_log
+        msgv1    = iv_msgv1
+        msgv2    = iv_msgv2
+        msgv3    = iv_msgv3
+        msgv4    = iv_msgv4
+        previous = ix_previous
+        longtext = iv_longtext.
+  ENDMETHOD.
+ 
+ 
+  METHOD raise_with_text.
+    raise(
+      iv_text     = ix_previous->get_text( )
+      ix_previous = ix_previous
+      iv_longtext = iv_longtext ).
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_empty_section.
+    IF iv_tabix_to BETWEEN iv_tabix_from AND lines( ct_itf ).
+      DELETE ct_itf FROM iv_tabix_from TO iv_tabix_to.
+    ELSE.
+      DELETE ct_itf FROM iv_tabix_from.
+    ENDIF.
+  ENDMETHOD.
+ 
+ 
+  METHOD remove_newlines_from_string.
+    rv_result = iv_string.
+ 
+    REPLACE ALL OCCURRENCES OF ` ` && cl_abap_char_utilities=>cr_lf IN rv_result WITH ` `.
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN rv_result WITH ` `.
+    REPLACE ALL OCCURRENCES OF ` ` && cl_abap_char_utilities=>newline IN rv_result WITH ` `.
+    REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN rv_result WITH ` `.
+  ENDMETHOD.
+ 
+ 
+  METHOD replace_section_head_with_text.
+
+    CASE cs_itf-tdline.
+      WHEN c_section_token-cause.
+        cs_itf-tdline = c_section_text-cause.
+      WHEN c_section_token-system_response.
+        cs_itf-tdline = c_section_text-system_response.
+      WHEN c_section_token-what_to_do.
+        cs_itf-tdline = c_section_text-what_to_do.
+      WHEN c_section_token-sys_admin.
+        cs_itf-tdline = c_section_text-sys_admin.
+    ENDCASE.
+
+  ENDMETHOD.
+ 
+ 
+  METHOD save_callstack.
+ 
+    FIELD-SYMBOLS: <ls_callstack> LIKE LINE OF mt_callstack.
+ 
+    CALL FUNCTION 'SYSTEM_CALLSTACK'
+      IMPORTING
+        callstack = mt_callstack.
+ 
+    " You should remember that the first lines are from zcx_abapgit_exception
+    " and are removed so that highest level in the callstack is the position where
+    " the exception is raised.
+    "
+    " For the merged report it's hard to do that, because zcx_abapgit_exception
+    " isn't visible in the callstack. Therefore we have to check the Events.
+    LOOP AT mt_callstack ASSIGNING <ls_callstack>.
+ 
+      IF <ls_callstack>-mainprogram CP |ZCX_ABAPGIT_EXCEPTION*| " full
+      OR <ls_callstack>-blockname = `SAVE_CALLSTACK` " merged
+      OR <ls_callstack>-blockname = `CONSTRUCTOR` " merged
+      OR <ls_callstack>-blockname CP `RAISE*`. "merged
+        DELETE TABLE mt_callstack FROM <ls_callstack>.
+      ELSE.
+        EXIT.
+      ENDIF.
+ 
+    ENDLOOP.
+ 
+  ENDMETHOD.
+ 
+ 
+  METHOD split_text_to_symsg.
+ 
+    DATA ls_msg TYPE symsg.
+ 
+    cl_message_helper=>set_msg_vars_for_clike( iv_text ).
+    ls_msg-msgv1 = sy-msgv1.
+    ls_msg-msgv2 = sy-msgv2.
+    ls_msg-msgv3 = sy-msgv3.
+    ls_msg-msgv4 = sy-msgv4.
+ 
+    " Set syst using generic error message
+    MESSAGE e001(00) WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4 INTO null.
+ 
+    rs_msg = ls_msg.
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/zcx_abapgit_exception.clas.testclasses.abap.html b/src/zcx_abapgit_exception.clas.testclasses.abap.html new file mode 100644 index 00000000000..e619e4cd3b7 --- /dev/null +++ b/src/zcx_abapgit_exception.clas.testclasses.abap.html @@ -0,0 +1,1645 @@ + + + + + + Code coverage report for src/zcx_abapgit_exception.clas.testclasses.abap + + + + + + + + + +
+
+

All files / src zcx_abapgit_exception.clas.testclasses.abap

+
+ +
+ 94.8% + Statements + 493/520 +
+ + +
+ 100% + Branches + 32/32 +
+ + +
+ 96.96% + Functions + 32/33 +
+ + +
+ 94.8% + Lines + 493/520 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +5211x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +5x +5x +1x +1x +5x +5x +1x +1x +9x +9x +1x +1x +2x +2x +1x +1x +5x +5x +5x +5x +5x +5x +5x +5x +1x +1x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +9x +1x +1x +2x +2x +2x +2x +2x +2x +2x +1x +1x +15x +15x +15x +1x +1x +5x +5x +5x +1x +1x +2x +2x +2x +1x +1x +16x +16x +16x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS ltcl_split_text DEFINITION DEFERRED.
+CLASS ltcl_base DEFINITION DEFERRED.
+CLASS zcx_abapgit_exception DEFINITION LOCAL FRIENDS ltcl_split_text ltcl_base.
+ 
+CLASS ltcl_base DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT ABSTRACT.
+  PUBLIC SECTION.
+    CLASS-METHODS:
+      get_t100_text IMPORTING is_message     TYPE symsg
+                    RETURNING VALUE(rv_text) TYPE string.
+  PROTECTED SECTION.
+    CONSTANTS:
+      BEGIN OF gs_test_data,
+        text       TYPE string VALUE `This is a test error message.`,
+        empty_text TYPE string VALUE ``,
+      END OF gs_test_data.
+    DATA:
+      mo_cut TYPE REF TO zcx_abapgit_exception,
+      BEGIN OF ms_given,
+        text               TYPE string,
+        t100_message       TYPE symsg,
+        longtext           TYPE string,
+        previous_exception TYPE REF TO cx_root,
+      END OF ms_given.
+    METHODS:
+      given_the_text IMPORTING iv_text TYPE csequence,
+      given_the_longtext IMPORTING iv_longtext TYPE csequence,
+      given_the_t100_message IMPORTING is_message TYPE symsg,
+      given_the_previous_exception IMPORTING ix_previous_exception TYPE REF TO cx_root,
+      when_instantiated_using_raise,
+      when_instan_using_raise_t100,
+      when_inst_usng_raise_with_text,
+      then_the_text_should_equal IMPORTING iv_text TYPE csequence,
+      then_the_longtext_should_equal IMPORTING iv_longtext TYPE csequence,
+      then_the_prev_exc_should_equal IMPORTING ix_exception TYPE REF TO cx_root.
+  PRIVATE SECTION.
+    METHODS:
+      teardown.
+ENDCLASS.
+ 
+CLASS ltcl_base IMPLEMENTATION.
+  METHOD get_t100_text.
+    MESSAGE ID is_message-msgid TYPE 'S' NUMBER is_message-msgno
+            WITH is_message-msgv1 is_message-msgv2 is_message-msgv3 is_message-msgv4
+            INTO rv_text.
+  ENDMETHOD.
+ 
+  METHOD given_the_text.
+    ms_given-text = iv_text.
+  ENDMETHOD.
+ 
+  METHOD given_the_longtext.
+    ms_given-longtext = iv_longtext.
+  ENDMETHOD.
+ 
+  METHOD given_the_t100_message.
+    ms_given-t100_message = is_message.
+  ENDMETHOD.
+ 
+  METHOD given_the_previous_exception.
+    ms_given-previous_exception = ix_previous_exception.
+  ENDMETHOD.
+ 
+  METHOD when_instantiated_using_raise.
+    TRY.
+        zcx_abapgit_exception=>raise( iv_text     = ms_given-text
+                                      ix_previous = ms_given-previous_exception
+                                      iv_longtext = ms_given-longtext ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO mo_cut ##NEEDED.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD when_instan_using_raise_t100.
+    TRY.
+        zcx_abapgit_exception=>raise_t100( iv_msgid    = ms_given-t100_message-msgid
+                                           iv_msgno    = ms_given-t100_message-msgno
+                                           iv_msgv1    = ms_given-t100_message-msgv1
+                                           iv_msgv2    = ms_given-t100_message-msgv2
+                                           iv_msgv3    = ms_given-t100_message-msgv3
+                                           iv_msgv4    = ms_given-t100_message-msgv4
+                                           ix_previous = ms_given-previous_exception
+                                           iv_longtext = ms_given-longtext ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO mo_cut ##NEEDED.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD when_inst_usng_raise_with_text.
+    TRY.
+        zcx_abapgit_exception=>raise_with_text( ix_previous = ms_given-previous_exception
+                                                iv_longtext = ms_given-longtext ).
+        cl_abap_unit_assert=>fail( ).
+      CATCH zcx_abapgit_exception INTO mo_cut ##NEEDED.
+    ENDTRY.
+  ENDMETHOD.
+ 
+  METHOD then_the_text_should_equal.
+    cl_abap_unit_assert=>assert_equals( exp = iv_text
+                                        act = mo_cut->get_text( ) ).
+  ENDMETHOD.
+ 
+  METHOD then_the_longtext_should_equal.
+    cl_abap_unit_assert=>assert_equals( exp = iv_longtext
+                                        act = mo_cut->get_longtext( abap_true ) ).
+  ENDMETHOD.
+ 
+  METHOD then_the_prev_exc_should_equal.
+    cl_abap_unit_assert=>assert_equals( exp = ix_exception
+                                        act = mo_cut->previous ).
+  ENDMETHOD.
+ 
+  METHOD teardown.
+    CLEAR ms_given.
+    FREE mo_cut.
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_general DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS INHERITING FROM ltcl_base.
+  PUBLIC SECTION.
+    METHODS:
+      direct_text FOR TESTING,
+      no_text FOR TESTING,
+      text_from_exception FOR TESTING.
+ENDCLASS.
+ 
+CLASS ltcl_general IMPLEMENTATION.
+  METHOD direct_text.
+    given_the_text( gs_test_data-text ).
+    when_instantiated_using_raise( ).
+    then_the_text_should_equal( gs_test_data-text ).
+  ENDMETHOD.
+ 
+  METHOD no_text.
+    given_the_text( gs_test_data-empty_text ).
+    when_instantiated_using_raise( ).
+    then_the_text_should_equal( zcx_abapgit_exception=>c_generic_error_msg ).
+  ENDMETHOD.
+ 
+  METHOD text_from_exception.
+    DATA: lx_previous TYPE REF TO cx_sy_dyn_call_illegal_method.
+ 
+    CREATE OBJECT lx_previous TYPE cx_sy_dyn_call_illegal_method
+      EXPORTING
+        textid     = cx_sy_dyn_call_illegal_method=>private_method
+        classname  = 'CLASS'
+        methodname = 'METHOD'.
+ 
+    given_the_previous_exception( lx_previous ).
+ 
+    when_inst_usng_raise_with_text( ).
+ 
+    then_the_text_should_equal( lx_previous->get_text( ) ).
+    then_the_prev_exc_should_equal( lx_previous ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_t100 DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS INHERITING FROM ltcl_base.
+  PUBLIC SECTION.
+    METHODS:
+      text1 FOR TESTING,
+      text2 FOR TESTING,
+      text3 FOR TESTING,
+      text4 FOR TESTING,
+      text5 FOR TESTING,
+      text6 FOR TESTING,
+      text7 FOR TESTING,
+      text8 FOR TESTING.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    CLASS-DATA:
+      BEGIN OF gs_t100_test_data,
+        message1 TYPE symsg,
+        message2 TYPE symsg,
+        message3 TYPE symsg,
+        message4 TYPE symsg,
+        message5 TYPE symsg,
+        message6 TYPE symsg,
+        message7 TYPE symsg,
+        message8 TYPE symsg,
+      END OF gs_t100_test_data.
+    CLASS-METHODS:
+      class_setup.
+ENDCLASS.
+ 
+CLASS ltcl_t100 IMPLEMENTATION.
+  METHOD text1.
+    given_the_t100_message( gs_t100_test_data-message1 ).
+    when_instan_using_raise_t100( ).
+    then_the_text_should_equal( get_t100_text( gs_t100_test_data-message1 ) ).
+  ENDMETHOD.
+ 
+  METHOD text2.
+    given_the_t100_message( gs_t100_test_data-message2 ).
+    when_instan_using_raise_t100( ).
+    then_the_text_should_equal( get_t100_text( gs_t100_test_data-message2 ) ).
+  ENDMETHOD.
+ 
+  METHOD text3.
+    given_the_t100_message( gs_t100_test_data-message3 ).
+    when_instan_using_raise_t100( ).
+    then_the_text_should_equal( get_t100_text( gs_t100_test_data-message3 ) ).
+  ENDMETHOD.
+ 
+  METHOD text4.
+    given_the_t100_message( gs_t100_test_data-message4 ).
+    when_instan_using_raise_t100( ).
+    then_the_text_should_equal( get_t100_text( gs_t100_test_data-message4 ) ).
+  ENDMETHOD.
+ 
+  METHOD text5.
+    given_the_t100_message( gs_t100_test_data-message5 ).
+    when_instan_using_raise_t100( ).
+    then_the_text_should_equal( get_t100_text( gs_t100_test_data-message5 ) ).
+  ENDMETHOD.
+ 
+  METHOD text6.
+    given_the_t100_message( gs_t100_test_data-message6 ).
+    when_instan_using_raise_t100( ).
+    then_the_text_should_equal( get_t100_text( gs_t100_test_data-message6 ) ).
+  ENDMETHOD.
+ 
+  METHOD text7.
+    given_the_t100_message( gs_t100_test_data-message7 ).
+    when_instan_using_raise_t100( ).
+    then_the_text_should_equal( get_t100_text( gs_t100_test_data-message7 ) ).
+  ENDMETHOD.
+ 
+  METHOD text8.
+    given_the_t100_message( gs_t100_test_data-message8 ).
+    when_instan_using_raise_t100( ).
+    then_the_text_should_equal( get_t100_text( gs_t100_test_data-message8 ) ).
+  ENDMETHOD.
+ 
+  METHOD class_setup.
+    gs_t100_test_data-message1-msgid = '00'.
+    gs_t100_test_data-message1-msgno = '001'.
+ 
+    gs_t100_test_data-message2-msgid = '00'.
+    gs_t100_test_data-message2-msgno = '001'.
+    gs_t100_test_data-message2-msgv1 = 'Variable 1'.
+ 
+    gs_t100_test_data-message3-msgid = '00'.
+    gs_t100_test_data-message3-msgno = '001'.
+    gs_t100_test_data-message3-msgv1 = 'Variable 1'.
+    gs_t100_test_data-message3-msgv2 = 'Variable 2'.
+ 
+    gs_t100_test_data-message4-msgid = '00'.
+    gs_t100_test_data-message4-msgno = '001'.
+    gs_t100_test_data-message4-msgv1 = 'Variable 1'.
+    gs_t100_test_data-message4-msgv2 = 'Variable 2'.
+    gs_t100_test_data-message4-msgv3 = 'Variable 3'.
+ 
+    gs_t100_test_data-message5-msgid = '00'.
+    gs_t100_test_data-message5-msgno = '001'.
+    gs_t100_test_data-message5-msgv1 = 'Variable 1'.
+    gs_t100_test_data-message5-msgv2 = 'Variable 2'.
+    gs_t100_test_data-message5-msgv3 = 'Variable 3'.
+    gs_t100_test_data-message5-msgv4 = 'Variable 4'.
+ 
+    gs_t100_test_data-message6-msgid = '00'.
+    gs_t100_test_data-message6-msgno = '003'.
+    gs_t100_test_data-message6-msgv1 = 'Variable 1'.
+    gs_t100_test_data-message6-msgv2 = 'Variable 2'.
+    gs_t100_test_data-message6-msgv3 = 'Variable 3'.
+    gs_t100_test_data-message6-msgv4 = 'Variable 4'.
+ 
+    gs_t100_test_data-message7-msgid = '00'.
+    gs_t100_test_data-message7-msgno = '003'.
+ 
+    gs_t100_test_data-message8-msgid = '00'.
+    gs_t100_test_data-message8-msgno = '002'.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_get_t100_longtext DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    METHODS test01 FOR TESTING.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_get_t100_longtext IMPLEMENTATION.
+ 
+  METHOD test01.
+
+    DATA: lx_err    TYPE REF TO zcx_abapgit_exception,
+          lv_result TYPE string.
+
+    TRY.
+        MESSAGE e058(00) WITH 'Value_1' 'Value_2' 'Value_3' 'Value_4' INTO zcx_abapgit_exception=>null.
+        zcx_abapgit_exception=>raise_t100( ).
+      CATCH zcx_abapgit_exception INTO lx_err.
+        lv_result = lx_err->get_longtext( ).
+    ENDTRY.
+
+    cl_abap_unit_assert=>assert_not_initial( lv_result ).
+
+    IF lv_result NS 'Value_1'.
+      cl_abap_unit_assert=>fail( ).
+    ENDIF.
+    IF lv_result NS 'Value_2'.
+      cl_abap_unit_assert=>fail( ).
+    ENDIF.
+    IF lv_result NS 'Value_3'.
+      cl_abap_unit_assert=>fail( ).
+    ENDIF.
+    IF lv_result NS 'Value_4'.
+      cl_abap_unit_assert=>fail( ).
+    ENDIF.
+
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+CLASS ltcl_split_text DEFINITION
+  FOR TESTING
+  DURATION SHORT
+  RISK LEVEL HARMLESS.
+ 
+  PUBLIC SECTION.
+    METHODS:
+      test_set_msg_b FOR TESTING,
+      test_set_msg_c FOR TESTING,
+      test_set_msg_d FOR TESTING,
+      test_set_msg_e FOR TESTING,
+      test_set_msg_z FOR TESTING.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+    TYPES:
+      BEGIN OF ty_msg,
+        v1 TYPE sy-msgv1,
+        v2 TYPE sy-msgv2,
+        v3 TYPE sy-msgv3,
+        v4 TYPE sy-msgv4,
+      END OF ty_msg.
+    CLASS-METHODS:
+      test_set_msg_vars
+        IMPORTING
+          iv_text TYPE string
+          is_msg  TYPE ty_msg.
+ENDCLASS.
+ 
+CLASS ltcl_split_text IMPLEMENTATION.
+  METHOD test_set_msg_b.
+    CONSTANTS:
+      lc_text_b TYPE string VALUE '0123456789012345678901234567890123456789012345678 0123456789',
+      BEGIN OF lc_msg_b,
+        v1 TYPE sy-msgv1 VALUE '0123456789012345678901234567890123456789012345678',
+        v2 TYPE sy-msgv2 VALUE ' 0123456789',
+        v3 TYPE sy-msgv3 VALUE '',
+        v4 TYPE sy-msgv4 VALUE '',
+      END OF lc_msg_b.
+    test_set_msg_vars( iv_text = lc_text_b
+                       is_msg  = lc_msg_b ).
+  ENDMETHOD.
+  METHOD test_set_msg_c.
+    CONSTANTS:
+      lc_text_c TYPE string VALUE '01234567890123456789012345678901234567890123456789 123456789',
+      BEGIN OF lc_msg_c,
+        v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789',
+        v2 TYPE sy-msgv2 VALUE ' 123456789',
+        v3 TYPE sy-msgv3 VALUE '',
+        v4 TYPE sy-msgv4 VALUE '',
+      END OF lc_msg_c.
+    test_set_msg_vars( iv_text = lc_text_c
+                       is_msg  = lc_msg_c ).
+  ENDMETHOD.
+  METHOD test_set_msg_d.
+    CONSTANTS:
+      lc_text_d TYPE string VALUE '012345678901234567890123456789012345678901234567890 23456789',
+      BEGIN OF lc_msg_d,
+        v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789',
+        v2 TYPE sy-msgv2 VALUE '0 23456789',
+        v3 TYPE sy-msgv3 VALUE '',
+        v4 TYPE sy-msgv4 VALUE '',
+      END OF lc_msg_d.
+    test_set_msg_vars( iv_text = lc_text_d
+                       is_msg  = lc_msg_d ).
+  ENDMETHOD.
+  METHOD test_set_msg_e.
+    CONSTANTS:
+      lc_text_e TYPE string VALUE '012345678901234567890123456789012345678901234567890123456789',
+      BEGIN OF lc_msg_e,
+        v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789',
+        v2 TYPE sy-msgv2 VALUE '0123456789',
+        v3 TYPE sy-msgv3 VALUE '',
+        v4 TYPE sy-msgv4 VALUE '',
+      END OF lc_msg_e.
+    test_set_msg_vars( iv_text = lc_text_e
+                       is_msg  = lc_msg_e ).
+  ENDMETHOD.
+  METHOD test_set_msg_z.
+    CONSTANTS:
+      lc_text_x TYPE string VALUE `Here is a very long text more than 200 characters and we have to invent `,
+      lc_text_y TYPE string VALUE `a nice story about abapGit to fill this long message. abapGit is simply `,
+      lc_text_z TYPE string VALUE `the greatest! #abapGit #awesome #community #opensource`,
+      BEGIN OF lc_msg_z,
+        v1 TYPE sy-msgv1 VALUE `Here is a very long text more than 200 characters`,
+        v2 TYPE sy-msgv2 VALUE ` and we have to invent a nice story about abapGit`,
+        v3 TYPE sy-msgv3 VALUE ` to fill this long message. abapGit is simply the`,
+        v4 TYPE sy-msgv4 VALUE ` greatest! #abapGit #awesome #community #opensourc`,
+      END OF lc_msg_z.
+    test_set_msg_vars( iv_text = lc_text_x && lc_text_y && lc_text_z
+                       is_msg  = lc_msg_z ).
+  ENDMETHOD.
+  METHOD test_set_msg_vars.
+ 
+    zcx_abapgit_exception=>split_text_to_symsg( iv_text ).
+ 
+    cl_abap_unit_assert=>assert_equals( act = sy-msgv1
+                                        exp = is_msg-v1 ).
+    cl_abap_unit_assert=>assert_equals( act = sy-msgv2
+                                        exp = is_msg-v2 ).
+    cl_abap_unit_assert=>assert_equals( act = sy-msgv3
+                                        exp = is_msg-v3 ).
+    cl_abap_unit_assert=>assert_equals( act = sy-msgv4
+                                        exp = is_msg-v4 ).
+ 
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_longtext DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT INHERITING FROM ltcl_base.
+  PUBLIC SECTION.
+    METHODS:
+      empty_longtext FOR TESTING,
+      longtext FOR TESTING,
+      multiline_longtext FOR TESTING,
+      t100_longtext_override FOR TESTING,
+      text_from_previous_exception FOR TESTING.
+  PRIVATE SECTION.
+    CLASS-DATA:
+      BEGIN OF gs_longtext_test_data,
+        longtext_500          TYPE string,
+        longtext_500_multline TYPE string,
+        empty_longtext        TYPE string VALUE ``,
+        t100_with_longtext    TYPE symsg,
+      END OF gs_longtext_test_data.
+    CLASS-METHODS:
+      class_setup.
+ENDCLASS.
+ 
+CLASS ltcl_longtext IMPLEMENTATION.
+  METHOD empty_longtext.
+    given_the_text( gs_test_data-text ).
+    given_the_longtext( gs_longtext_test_data-empty_longtext ).
+ 
+    when_instantiated_using_raise( ).
+ 
+    then_the_text_should_equal( gs_test_data-text ).
+    then_the_longtext_should_equal( gs_longtext_test_data-empty_longtext ).
+  ENDMETHOD.
+ 
+  METHOD longtext.
+    given_the_text( gs_test_data-text ).
+    given_the_longtext( gs_longtext_test_data-longtext_500 ).
+ 
+    when_instantiated_using_raise( ).
+ 
+    then_the_text_should_equal( gs_test_data-text ).
+    then_the_longtext_should_equal( gs_longtext_test_data-longtext_500 ).
+  ENDMETHOD.
+ 
+  METHOD multiline_longtext.
+    given_the_text( gs_test_data-text ).
+    given_the_longtext( gs_longtext_test_data-longtext_500_multline ).
+ 
+    when_instantiated_using_raise( ).
+ 
+    then_the_text_should_equal( gs_test_data-text ).
+    then_the_longtext_should_equal( gs_longtext_test_data-longtext_500_multline ).
+  ENDMETHOD.
+ 
+  METHOD t100_longtext_override.
+    given_the_longtext( gs_longtext_test_data-longtext_500 ).
+    given_the_t100_message( gs_longtext_test_data-t100_with_longtext ).
+ 
+    when_instan_using_raise_t100( ).
+ 
+    then_the_longtext_should_equal( gs_longtext_test_data-longtext_500 ).
+  ENDMETHOD.
+ 
+  METHOD text_from_previous_exception.
+    DATA: lx_previous TYPE REF TO cx_sy_dyn_call_illegal_method.
+ 
+    CREATE OBJECT lx_previous.
+ 
+    given_the_previous_exception( lx_previous ).
+    given_the_longtext( gs_longtext_test_data-longtext_500 ).
+ 
+    when_inst_usng_raise_with_text( ).
+ 
+    then_the_text_should_equal( condense( lx_previous->get_text( ) ) ).
+    then_the_longtext_should_equal( gs_longtext_test_data-longtext_500 ).
+    then_the_prev_exc_should_equal( lx_previous ).
+  ENDMETHOD.
+ 
+  METHOD class_setup.
+    gs_longtext_test_data-longtext_500 =
+      `Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et` &&
+      ` dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Ste` &&
+      `t clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, ` &&
+      `consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,` &&
+      ` sed diam voluptua. At vero eos et accusam et justo duo dolores et e`.
+ 
+    gs_longtext_test_data-longtext_500_multline =
+      `Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et` &&
+      ` dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.` &&
+      cl_abap_char_utilities=>newline &&
+      `Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.` &&
+      cl_abap_char_utilities=>newline &&
+      cl_abap_char_utilities=>newline &&
+      `Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et` &&
+      ` dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores ete`.
+ 
+    gs_longtext_test_data-t100_with_longtext-msgid = '00'.
+    gs_longtext_test_data-t100_with_longtext-msgno = '002'.
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/src/zcx_abapgit_not_found.clas.abap.html b/src/zcx_abapgit_not_found.clas.abap.html new file mode 100644 index 00000000000..5854d7293b7 --- /dev/null +++ b/src/zcx_abapgit_not_found.clas.abap.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for src/zcx_abapgit_not_found.clas.abap + + + + + + + + + +
+
+

All files / src zcx_abapgit_not_found.clas.abap

+
+ +
+ 100% + Statements + 27/27 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 27/27 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +281x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS zcx_abapgit_not_found DEFINITION
+  PUBLIC
+  INHERITING FROM cx_static_check
+  FINAL
+  CREATE PUBLIC.
+ 
+  PUBLIC SECTION.
+ 
+    METHODS constructor
+      IMPORTING
+        !textid   LIKE textid OPTIONAL
+        !previous LIKE previous OPTIONAL.
+  PROTECTED SECTION.
+  PRIVATE SECTION.
+ENDCLASS.
+ 
+ 
+ 
+CLASS zcx_abapgit_not_found IMPLEMENTATION.
+ 
+ 
+  METHOD constructor ##ADT_SUPPRESS_GENERATION.
+    super->constructor(
+      textid   = textid
+      previous = previous ).
+  ENDMETHOD.
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/test/index.html b/test/index.html new file mode 100644 index 00000000000..445b065d311 --- /dev/null +++ b/test/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for test + + + + + + + + + +
+
+

All files test

+
+ +
+ 96.55% + Statements + 56/58 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 96.55% + Lines + 56/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
zcl_abapgit_integration_git.clas.abap +
+
100%5/5100%0/0100%0/0100%5/5
zcl_abapgit_integration_git.clas.testclasses.abap +
+
96.22%51/53100%1/150%1/296.22%51/53
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/test/zcl_abapgit_integration_git.clas.abap.html b/test/zcl_abapgit_integration_git.clas.abap.html new file mode 100644 index 00000000000..b2bdd7595e9 --- /dev/null +++ b/test/zcl_abapgit_integration_git.clas.abap.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for test/zcl_abapgit_integration_git.clas.abap + + + + + + + + + +
+
+

All files / test zcl_abapgit_integration_git.clas.abap

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +51x +1x +1x +1x +1x
CLASS zcl_abapgit_integration_git DEFINITION PUBLIC FINAL CREATE PUBLIC.
+ENDCLASS.
+ 
+CLASS zcl_abapgit_integration_git IMPLEMENTATION.
+ENDCLASS.
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/test/zcl_abapgit_integration_git.clas.testclasses.abap.html b/test/zcl_abapgit_integration_git.clas.testclasses.abap.html new file mode 100644 index 00000000000..25644a62a93 --- /dev/null +++ b/test/zcl_abapgit_integration_git.clas.testclasses.abap.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for test/zcl_abapgit_integration_git.clas.testclasses.abap + + + + + + + + + +
+
+

All files / test zcl_abapgit_integration_git.clas.testclasses.abap

+
+ +
+ 96.22% + Statements + 51/53 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 96.22% + Lines + 51/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +541x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
CLASS lcl_memory_settings DEFINITION.
+  PUBLIC SECTION.
+    INTERFACES zif_abapgit_persist_settings.
+ENDCLASS.
+ 
+CLASS lcl_memory_settings IMPLEMENTATION.
+  METHOD zif_abapgit_persist_settings~modify.
+    RETURN.
+  ENDMETHOD.
+ 
+  METHOD zif_abapgit_persist_settings~read.
+    CREATE OBJECT ro_settings.
+  ENDMETHOD.
+ENDCLASS.
+ 
+CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL CRITICAL FINAL.
+ 
+  PRIVATE SECTION.
+    METHODS test01 FOR TESTING RAISING cx_static_check.
+ 
+ENDCLASS.
+ 
+ 
+CLASS ltcl_test IMPLEMENTATION.
+ 
+  METHOD test01.
+ 
+    CONSTANTS lc_url TYPE string VALUE 'https://github.com/larshp/Empty.git'.
+    DATA lv_ref TYPE string.
+    DATA li_memory TYPE REF TO lcl_memory_settings.
+    DATA ls_pull TYPE zcl_abapgit_git_porcelain=>ty_pull_result.
+ 
+ 
+    CREATE OBJECT li_memory.
+    zcl_abapgit_persist_injector=>set_settings( li_memory ).
+ 
+    lv_ref = zcl_abapgit_git_transport=>branches( lc_url )->get_head_symref( ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lv_ref
+      exp = 'refs/heads/main' ).
+ 
+    ls_pull = zcl_abapgit_git_porcelain=>pull_by_branch(
+      iv_url          = lc_url
+      iv_branch_name  = lv_ref ).
+ 
+    cl_abap_unit_assert=>assert_equals(
+      act = lines( ls_pull-files )
+      exp = 3 ).
+ 
+  ENDMETHOD.
+ 
+ENDCLASS.
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/tmp/coverage-1920-1691699566455-0.json b/tmp/coverage-1920-1691699566455-0.json new file mode 100644 index 00000000000..5b94e6d4ca2 --- /dev/null +++ b/tmp/coverage-1920-1691699566455-0.json @@ -0,0 +1 @@ +{"result":[{"scriptId":"6","url":"node:internal/per_context/primordials","functions":[{"functionName":"SafeIterator","ranges":[{"startOffset":8127,"endOffset":8198,"count":6674}],"isBlockCoverage":true},{"functionName":"next","ranges":[{"startOffset":8203,"endOffset":8252,"count":10020}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8257,"endOffset":8302,"count":5747}],"isBlockCoverage":true},{"functionName":"desc.value","ranges":[{"startOffset":9865,"endOffset":9932,"count":927}],"isBlockCoverage":true},{"functionName":"SafeMap","ranges":[{"startOffset":10590,"endOffset":10618,"count":1107}],"isBlockCoverage":true},{"functionName":"SafeWeakMap","ranges":[{"startOffset":10761,"endOffset":10789,"count":6}],"isBlockCoverage":true},{"functionName":"SafeSet","ranges":[{"startOffset":10917,"endOffset":10945,"count":2023}],"isBlockCoverage":true},{"functionName":"SafeFinalizationRegistry","ranges":[{"startOffset":11367,"endOffset":11423,"count":1}],"isBlockCoverage":true},{"functionName":"SafeWeakRef","ranges":[{"startOffset":11575,"endOffset":11613,"count":171}],"isBlockCoverage":true},{"functionName":"SafePromise","ranges":[{"startOffset":11760,"endOffset":11802,"count":24756}],"isBlockCoverage":true},{"functionName":"primordials.SafePromisePrototypeFinally","ranges":[{"startOffset":12305,"endOffset":12578,"count":1834}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12450,"endOffset":12574,"count":1834}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12480,"endOffset":12529,"count":1834}],"isBlockCoverage":true},{"functionName":"arrayToSafePromiseIterable","ranges":[{"startOffset":12771,"endOffset":13006,"count":4818}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12874,"endOffset":12996,"count":2058}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12914,"endOffset":12995,"count":2058},{"startOffset":12959,"endOffset":12968,"count":2051},{"startOffset":12969,"endOffset":12988,"count":7}],"isBlockCoverage":true},{"functionName":"primordials.SafePromiseAll","ranges":[{"startOffset":13176,"endOffset":13403,"count":4818}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13314,"endOffset":13399,"count":4818}],"isBlockCoverage":true}]},{"scriptId":"9","url":"node:internal/bootstrap/loaders","functions":[{"functionName":"internalBinding","ranges":[{"startOffset":5240,"endOffset":5502,"count":2295},{"startOffset":5342,"endOffset":5482,"count":11}],"isBlockCoverage":true},{"functionName":"getOwn","ranges":[{"startOffset":5643,"endOffset":5797,"count":847},{"startOffset":5779,"endOffset":5794,"count":0}],"isBlockCoverage":true},{"functionName":"canBeRequiredByUsers","ranges":[{"startOffset":7487,"endOffset":7604,"count":882},{"startOffset":7572,"endOffset":7599,"count":265}],"isBlockCoverage":true},{"functionName":"canBeRequiredWithoutScheme","ranges":[{"startOffset":7755,"endOffset":7832,"count":335}],"isBlockCoverage":true},{"functionName":"getSchemeOnlyModuleNames","ranges":[{"startOffset":7843,"endOffset":7918,"count":1}],"isBlockCoverage":true},{"functionName":"compileForPublicLoader","ranges":[{"startOffset":7990,"endOffset":8684,"count":12},{"startOffset":8053,"endOffset":8245,"count":0},{"startOffset":8309,"endOffset":8606,"count":9},{"startOffset":8568,"endOffset":8572,"count":0}],"isBlockCoverage":true},{"functionName":"getESMFacade","ranges":[{"startOffset":8688,"endOffset":9329,"count":20},{"startOffset":8726,"endOffset":8745,"count":11},{"startOffset":8745,"endOffset":9328,"count":9}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9056,"endOffset":9169,"count":9}],"isBlockCoverage":true},{"functionName":"syncExports","ranges":[{"startOffset":9625,"endOffset":9969,"count":21},{"startOffset":9744,"endOffset":9959,"count":847},{"startOffset":9821,"endOffset":9830,"count":0}],"isBlockCoverage":true},{"functionName":"compileForInternalLoader","ranges":[{"startOffset":9973,"endOffset":10800,"count":702},{"startOffset":10022,"endOffset":10037,"count":80},{"startOffset":10039,"endOffset":10073,"count":630},{"startOffset":10073,"endOffset":10212,"count":72},{"startOffset":10212,"endOffset":10247,"count":1},{"startOffset":10248,"endOffset":10269,"count":71},{"startOffset":10525,"endOffset":10799,"count":72}],"isBlockCoverage":true},{"functionName":"nativeModuleRequire","ranges":[{"startOffset":10999,"endOffset":11371,"count":694},{"startOffset":11057,"endOffset":11088,"count":4},{"startOffset":11088,"endOffset":11273,"count":690},{"startOffset":11273,"endOffset":11328,"count":0},{"startOffset":11328,"endOffset":11370,"count":690}],"isBlockCoverage":true}]},{"scriptId":"10","url":"node:internal/bootstrap/node","functions":[{"functionName":"get","ranges":[{"startOffset":3704,"endOffset":3766,"count":126}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":3772,"endOffset":3842,"count":2},{"startOffset":3828,"endOffset":3831,"count":1},{"startOffset":3832,"endOffset":3835,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":5044,"endOffset":5311,"count":4},{"startOffset":5172,"endOffset":5310,"count":2}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":5677,"endOffset":5708,"count":2}],"isBlockCoverage":true}]},{"scriptId":"11","url":"node:internal/errors","functions":[{"functionName":"prepareStackTrace","ranges":[{"startOffset":2155,"endOffset":3643,"count":2},{"startOffset":2332,"endOffset":2448,"count":0},{"startOffset":2579,"endOffset":3075,"count":0},{"startOffset":3202,"endOffset":3224,"count":0},{"startOffset":3374,"endOffset":3448,"count":0},{"startOffset":3535,"endOffset":3564,"count":0}],"isBlockCoverage":true},{"functionName":"maybeOverridePrepareStackTrace","ranges":[{"startOffset":3685,"endOffset":4392,"count":2},{"startOffset":3954,"endOffset":4020,"count":0},{"startOffset":4301,"endOffset":4367,"count":0}],"isBlockCoverage":true},{"functionName":"isErrorStackTraceLimitWritable","ranges":[{"startOffset":5382,"endOffset":5678,"count":4704},{"startOffset":5525,"endOffset":5568,"count":0},{"startOffset":5647,"endOffset":5675,"count":0}],"isBlockCoverage":true},{"functionName":"NodeError","ranges":[{"startOffset":9878,"endOffset":10880,"count":1401}],"isBlockCoverage":true},{"functionName":"value","ranges":[{"startOffset":10625,"endOffset":10703,"count":0}],"isBlockCoverage":false},{"functionName":"hideStackFrames","ranges":[{"startOffset":11045,"endOffset":11310,"count":7}],"isBlockCoverage":true},{"functionName":"getMessage","ranges":[{"startOffset":11932,"endOffset":12803,"count":1401},{"startOffset":12344,"endOffset":12802,"count":0}],"isBlockCoverage":true},{"functionName":"lazyUv","ranges":[{"startOffset":12821,"endOffset":12901,"count":170}],"isBlockCoverage":true},{"functionName":"uvErrmapGet","ranges":[{"startOffset":12958,"endOffset":13110,"count":170}],"isBlockCoverage":true},{"functionName":"captureLargerStackTrace","ranges":[{"startOffset":13163,"endOffset":13565,"count":1568}],"isBlockCoverage":true},{"functionName":"uvException","ranges":[{"startOffset":13895,"endOffset":15136,"count":167},{"startOffset":13978,"endOffset":13996,"count":0},{"startOffset":14190,"endOffset":14259,"count":0},{"startOffset":14874,"endOffset":14996,"count":501},{"startOffset":14922,"endOffset":14940,"count":334},{"startOffset":14942,"endOffset":14965,"count":167},{"startOffset":14965,"endOffset":14996,"count":334},{"startOffset":15068,"endOffset":15094,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":32091,"endOffset":32206,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":47722,"endOffset":47875,"count":1399}],"isBlockCoverage":true}]},{"scriptId":"12","url":"node:internal/timers","functions":[{"functionName":"","ranges":[{"startOffset":4431,"endOffset":4456,"count":1}],"isBlockCoverage":true},{"functionName":"initAsyncResource","ranges":[{"startOffset":5399,"endOffset":5677,"count":5},{"startOffset":5625,"endOffset":5675,"count":0}],"isBlockCoverage":true},{"functionName":"Timeout","ranges":[{"startOffset":5762,"endOffset":6759,"count":5},{"startOffset":5911,"endOffset":6247,"count":0},{"startOffset":6584,"endOffset":6591,"count":1},{"startOffset":6592,"endOffset":6598,"count":4}],"isBlockCoverage":true},{"functionName":"TimersList","ranges":[{"startOffset":7554,"endOffset":7854,"count":5}],"isBlockCoverage":true},{"functionName":"incRefCount","ranges":[{"startOffset":9131,"endOffset":9207,"count":5}],"isBlockCoverage":true},{"functionName":"decRefCount","ranges":[{"startOffset":9209,"endOffset":9286,"count":1}],"isBlockCoverage":true},{"functionName":"insert","ranges":[{"startOffset":10369,"endOffset":11020,"count":5}],"isBlockCoverage":true},{"functionName":"getTimerDuration","ranges":[{"startOffset":11335,"endOffset":11863,"count":2},{"startOffset":11450,"endOffset":11532,"count":0},{"startOffset":11607,"endOffset":11844,"count":0}],"isBlockCoverage":true},{"functionName":"setPosition","ranges":[{"startOffset":12072,"endOffset":12143,"count":5}],"isBlockCoverage":true},{"functionName":"processTimers","ranges":[{"startOffset":14395,"endOffset":14879,"count":4},{"startOffset":14626,"endOffset":14725,"count":0},{"startOffset":14763,"endOffset":14778,"count":0}],"isBlockCoverage":true},{"functionName":"listOnTimeout","ranges":[{"startOffset":14883,"endOffset":17353,"count":4},{"startOffset":15307,"endOffset":15535,"count":0},{"startOffset":15575,"endOffset":15590,"count":0},{"startOffset":15792,"endOffset":16021,"count":0},{"startOffset":16140,"endOffset":16162,"count":0},{"startOffset":16276,"endOffset":16344,"count":0},{"startOffset":16389,"endOffset":16417,"count":0},{"startOffset":16419,"endOffset":16528,"count":0},{"startOffset":16736,"endOffset":16757,"count":0}],"isBlockCoverage":true}]},{"scriptId":"13","url":"node:internal/async_hooks","functions":[{"functionName":"newAsyncId","ranges":[{"startOffset":14454,"endOffset":14524,"count":130}],"isBlockCoverage":true},{"functionName":"getDefaultTriggerAsyncId","ranges":[{"startOffset":14899,"endOffset":15189,"count":130},{"startOffset":15113,"endOffset":15155,"count":127},{"startOffset":15155,"endOffset":15188,"count":3}],"isBlockCoverage":true},{"functionName":"defaultTriggerAsyncIdScope","ranges":[{"startOffset":15509,"endOffset":16002,"count":7},{"startOffset":15619,"endOffset":15650,"count":0}],"isBlockCoverage":true},{"functionName":"hasHooks","ranges":[{"startOffset":16004,"endOffset":16067,"count":643}],"isBlockCoverage":true},{"functionName":"enabledHooksExist","ranges":[{"startOffset":16069,"endOffset":16128,"count":128}],"isBlockCoverage":true},{"functionName":"initHooksExist","ranges":[{"startOffset":16130,"endOffset":16185,"count":130}],"isBlockCoverage":true},{"functionName":"destroyHooksExist","ranges":[{"startOffset":16246,"endOffset":16307,"count":129}],"isBlockCoverage":true},{"functionName":"emitBeforeScript","ranges":[{"startOffset":16798,"endOffset":16974,"count":128},{"startOffset":16946,"endOffset":16972,"count":0}],"isBlockCoverage":true},{"functionName":"emitAfterScript","ranges":[{"startOffset":16977,"endOffset":17097,"count":128},{"startOffset":17041,"endOffset":17066,"count":0}],"isBlockCoverage":true},{"functionName":"pushAsyncContext","ranges":[{"startOffset":17442,"endOffset":18012,"count":128},{"startOffset":17662,"endOffset":17712,"count":0}],"isBlockCoverage":true},{"functionName":"popAsyncContext","ranges":[{"startOffset":18077,"endOffset":18688,"count":128},{"startOffset":18193,"endOffset":18206,"count":0},{"startOffset":18285,"endOffset":18391,"count":0}],"isBlockCoverage":true}]},{"scriptId":"15","url":"node:internal/util","functions":[{"functionName":"toUSVString","ranges":[{"startOffset":1398,"endOffset":1710,"count":1783},{"startOffset":1667,"endOffset":1709,"count":0}],"isBlockCoverage":true},{"functionName":"deprecate","ranges":[{"startOffset":2457,"endOffset":3651,"count":16},{"startOffset":2531,"endOffset":2551,"count":0},{"startOffset":2640,"endOffset":2694,"count":0},{"startOffset":3405,"endOffset":3627,"count":15}],"isBlockCoverage":true},{"functionName":"deprecated","ranges":[{"startOffset":2781,"endOffset":3263,"count":0}],"isBlockCoverage":false},{"functionName":"assertCrypto","ranges":[{"startOffset":3994,"endOffset":4068,"count":4},{"startOffset":4040,"endOffset":4066,"count":0}],"isBlockCoverage":true},{"functionName":"normalizeEncoding","ranges":[{"startOffset":4247,"endOffset":4378,"count":1096},{"startOffset":4317,"endOffset":4335,"count":53},{"startOffset":4337,"endOffset":4351,"count":1043},{"startOffset":4351,"endOffset":4377,"count":53}],"isBlockCoverage":true},{"functionName":"slowCases","ranges":[{"startOffset":4380,"endOffset":6131,"count":53},{"startOffset":4434,"endOffset":4678,"count":0},{"startOffset":4683,"endOffset":4813,"count":44},{"startOffset":4715,"endOffset":4731,"count":0},{"startOffset":4732,"endOffset":4777,"count":0},{"startOffset":4800,"endOffset":4813,"count":0},{"startOffset":4818,"endOffset":5222,"count":0},{"startOffset":5227,"endOffset":5613,"count":9},{"startOffset":5263,"endOffset":5279,"count":0},{"startOffset":5307,"endOffset":5326,"count":3},{"startOffset":5344,"endOffset":5436,"count":0},{"startOffset":5438,"endOffset":5582,"count":0},{"startOffset":5584,"endOffset":5613,"count":0},{"startOffset":5618,"endOffset":5764,"count":0},{"startOffset":5769,"endOffset":5916,"count":0},{"startOffset":5921,"endOffset":6075,"count":0},{"startOffset":6080,"endOffset":6125,"count":0}],"isBlockCoverage":true},{"functionName":"cachedResult","ranges":[{"startOffset":6764,"endOffset":6920,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6815,"endOffset":6917,"count":0}],"isBlockCoverage":false},{"functionName":"promisify","ranges":[{"startOffset":8929,"endOffset":10788,"count":3},{"startOffset":9049,"endOffset":9105,"count":1},{"startOffset":9192,"endOffset":9468,"count":0},{"startOffset":10574,"endOffset":10736,"count":8}],"isBlockCoverage":true},{"functionName":"fn","ranges":[{"startOffset":9668,"endOffset":10187,"count":0}],"isBlockCoverage":false},{"functionName":"spliceOne","ranges":[{"startOffset":11346,"endOffset":11473,"count":11},{"startOffset":11427,"endOffset":11457,"count":0}],"isBlockCoverage":true},{"functionName":"once","ranges":[{"startOffset":12795,"endOffset":12961,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12852,"endOffset":12958,"count":2},{"startOffset":12888,"endOffset":12895,"count":0}],"isBlockCoverage":true},{"functionName":"filterOwnProperties","ranges":[{"startOffset":14736,"endOffset":15007,"count":7},{"startOffset":14860,"endOffset":14985,"count":32},{"startOffset":14939,"endOffset":14981,"count":14}],"isBlockCoverage":true},{"functionName":"setOwnProperty","ranges":[{"startOffset":15175,"endOffset":15365,"count":344}],"isBlockCoverage":true}]},{"scriptId":"16","url":"node:internal/validators","functions":[{"functionName":"isUint32","ranges":[{"startOffset":927,"endOffset":989,"count":1047}],"isBlockCoverage":true},{"functionName":"parseFileMode","ranges":[{"startOffset":1613,"endOffset":1924,"count":1964},{"startOffset":1706,"endOffset":1874,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2170,"endOffset":2551,"count":1759},{"startOffset":2290,"endOffset":2344,"count":0},{"startOffset":2384,"endOffset":2438,"count":0},{"startOffset":2481,"endOffset":2547,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2794,"endOffset":3257,"count":1764},{"startOffset":2966,"endOffset":3034,"count":0},{"startOffset":3068,"endOffset":3136,"count":0},{"startOffset":3173,"endOffset":3253,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3494,"endOffset":3926,"count":2311},{"startOffset":3564,"endOffset":3628,"count":0},{"startOffset":3660,"endOffset":3724,"count":0},{"startOffset":3748,"endOffset":3751,"count":0},{"startOffset":3848,"endOffset":3924,"count":0}],"isBlockCoverage":true},{"functionName":"validateString","ranges":[{"startOffset":4079,"endOffset":4211,"count":28092},{"startOffset":4155,"endOffset":4209,"count":0}],"isBlockCoverage":true},{"functionName":"validateNumber","ranges":[{"startOffset":4412,"endOffset":4880,"count":2594},{"startOffset":4510,"endOffset":4564,"count":0},{"startOffset":4585,"endOffset":4599,"count":0},{"startOffset":4617,"endOffset":4631,"count":0},{"startOffset":4672,"endOffset":4693,"count":0},{"startOffset":4696,"endOffset":4878,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5066,"endOffset":5399,"count":6},{"startOffset":5137,"endOffset":5397,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5210,"endOffset":5271,"count":0}],"isBlockCoverage":false},{"functionName":"validateBoolean","ranges":[{"startOffset":5555,"endOffset":5690,"count":173},{"startOffset":5633,"endOffset":5688,"count":0}],"isBlockCoverage":true},{"functionName":"getOwnPropertyValueOrDefault","ranges":[{"startOffset":5692,"endOffset":5873,"count":71265},{"startOffset":5785,"endOffset":5832,"count":17943},{"startOffset":5833,"endOffset":5851,"count":54714},{"startOffset":5852,"endOffset":5870,"count":16551}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6138,"endOffset":6693,"count":23755},{"startOffset":6443,"endOffset":6460,"count":18470},{"startOffset":6486,"endOffset":6508,"count":17774},{"startOffset":6548,"endOffset":6618,"count":0},{"startOffset":6621,"endOffset":6689,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6912,"endOffset":7190,"count":347},{"startOffset":6974,"endOffset":7037,"count":0},{"startOffset":7070,"endOffset":7188,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8614,"endOffset":8844,"count":879},{"startOffset":8679,"endOffset":8842,"count":0}],"isBlockCoverage":true},{"functionName":"validateEncoding","ranges":[{"startOffset":8908,"endOffset":9242,"count":44},{"startOffset":9097,"endOffset":9240,"count":0}],"isBlockCoverage":true},{"functionName":"validatePort","ranges":[{"startOffset":9504,"endOffset":9883,"count":5},{"startOffset":9599,"endOffset":9626,"count":0},{"startOffset":9663,"endOffset":9704,"count":0},{"startOffset":9783,"endOffset":9796,"count":3},{"startOffset":9799,"endOffset":9862,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9926,"endOffset":10027,"count":132},{"startOffset":9984,"endOffset":10025,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10614,"endOffset":10730,"count":2454},{"startOffset":10672,"endOffset":10728,"count":0}],"isBlockCoverage":true}]},{"scriptId":"17","url":"node:internal/util/types","functions":[{"functionName":"isUint8Array","ranges":[{"startOffset":236,"endOffset":342,"count":5747}],"isBlockCoverage":true},{"functionName":"isBigUint64Array","ranges":[{"startOffset":1346,"endOffset":1460,"count":1789}],"isBlockCoverage":true}]},{"scriptId":"18","url":"node:internal/linkedlist","functions":[{"functionName":"peek","ranges":[{"startOffset":133,"endOffset":225,"count":8},{"startOffset":186,"endOffset":224,"count":4}],"isBlockCoverage":true},{"functionName":"remove","ranges":[{"startOffset":260,"endOffset":487,"count":10}],"isBlockCoverage":true},{"functionName":"append","ranges":[{"startOffset":543,"endOffset":995,"count":5},{"startOffset":594,"endOffset":611,"count":0}],"isBlockCoverage":true},{"functionName":"isEmpty","ranges":[{"startOffset":997,"endOffset":1057,"count":1}],"isBlockCoverage":true}]},{"scriptId":"19","url":"node:internal/priority_queue","functions":[{"functionName":"insert","ranges":[{"startOffset":859,"endOffset":1044,"count":5},{"startOffset":995,"endOffset":1012,"count":0}],"isBlockCoverage":true},{"functionName":"peek","ranges":[{"startOffset":1048,"endOffset":1087,"count":8}],"isBlockCoverage":true},{"functionName":"percolateUp","ranges":[{"startOffset":1763,"endOffset":2254,"count":5},{"startOffset":1941,"endOffset":2163,"count":0}],"isBlockCoverage":true},{"functionName":"removeAt","ranges":[{"startOffset":2258,"endOffset":2591,"count":5},{"startOffset":2418,"endOffset":2432,"count":0},{"startOffset":2434,"endOffset":2587,"count":0}],"isBlockCoverage":true},{"functionName":"shift","ranges":[{"startOffset":2595,"endOffset":2750,"count":4},{"startOffset":2697,"endOffset":2704,"count":0}],"isBlockCoverage":true}]},{"scriptId":"20","url":"node:internal/util/inspect","functions":[{"functionName":"formatWithOptions","ranges":[{"startOffset":72458,"endOffset":72645,"count":696}],"isBlockCoverage":true},{"functionName":"formatWithOptionsInternal","ranges":[{"startOffset":73013,"endOffset":77035,"count":696},{"startOffset":73233,"endOffset":76834,"count":0},{"startOffset":76838,"endOffset":77034,"count":0}],"isBlockCoverage":true}]},{"scriptId":"21","url":"node:internal/assert","functions":[{"functionName":"assert","ranges":[{"startOffset":157,"endOffset":307,"count":2583},{"startOffset":205,"endOffset":305,"count":0}],"isBlockCoverage":true}]},{"scriptId":"22","url":"node:internal/util/debuglog","functions":[{"functionName":"initializeDebugEnv","ranges":[{"startOffset":519,"endOffset":991,"count":1},{"startOffset":610,"endOffset":947,"count":0}],"isBlockCoverage":true},{"functionName":"testEnabled","ranges":[{"startOffset":885,"endOffset":942,"count":0}],"isBlockCoverage":false},{"functionName":"testEnabled","ranges":[{"startOffset":973,"endOffset":984,"count":16}],"isBlockCoverage":true},{"functionName":"noop","ranges":[{"startOffset":1419,"endOffset":1427,"count":4401}],"isBlockCoverage":true},{"functionName":"debuglogImpl","ranges":[{"startOffset":1430,"endOffset":1995,"count":16},{"startOffset":1505,"endOffset":1967,"count":9},{"startOffset":1524,"endOffset":1920,"count":0}],"isBlockCoverage":true},{"functionName":"debug","ranges":[{"startOffset":1613,"endOffset":1913,"count":0}],"isBlockCoverage":false},{"functionName":"debuglog","ranges":[{"startOffset":2215,"endOffset":3240,"count":15}],"isBlockCoverage":true},{"functionName":"init","ranges":[{"startOffset":2246,"endOffset":2342,"count":16}],"isBlockCoverage":true},{"functionName":"debug","ranges":[{"startOffset":2357,"endOffset":2751,"count":16},{"startOffset":2604,"endOffset":2634,"count":7},{"startOffset":2641,"endOffset":2680,"count":4},{"startOffset":2687,"endOffset":2741,"count":5}],"isBlockCoverage":true},{"functionName":"test","ranges":[{"startOffset":2781,"endOffset":2850,"count":0}],"isBlockCoverage":false},{"functionName":"logger","ranges":[{"startOffset":2869,"endOffset":3064,"count":16},{"startOffset":2917,"endOffset":2947,"count":7},{"startOffset":2954,"endOffset":2993,"count":4},{"startOffset":3000,"endOffset":3054,"count":5}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":3135,"endOffset":3169,"count":0}],"isBlockCoverage":false}]},{"scriptId":"23","url":"node:events","functions":[{"functionName":"EventEmitter","ranges":[{"startOffset":6292,"endOffset":6361,"count":983}],"isBlockCoverage":true},{"functionName":"checkListener","ranges":[{"startOffset":7708,"endOffset":7786,"count":2279}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":7894,"endOffset":7942,"count":24}],"isBlockCoverage":true},{"functionName":"EventEmitter.init","ranges":[{"startOffset":9836,"endOffset":10433,"count":983},{"startOffset":9887,"endOffset":9947,"count":30},{"startOffset":9949,"endOffset":10020,"count":953},{"startOffset":10090,"endOffset":10109,"count":59},{"startOffset":10111,"endOffset":10244,"count":0}],"isBlockCoverage":true},{"functionName":"_getMaxListeners","ranges":[{"startOffset":12008,"endOffset":12157,"count":24},{"startOffset":12126,"endOffset":12156,"count":0}],"isBlockCoverage":true},{"functionName":"emit","ranges":[{"startOffset":13314,"endOffset":15616,"count":1035},{"startOffset":13459,"endOffset":13497,"count":0},{"startOffset":13505,"endOffset":13539,"count":0},{"startOffset":13563,"endOffset":13592,"count":0},{"startOffset":13598,"endOffset":13635,"count":0},{"startOffset":13707,"endOffset":14674,"count":0},{"startOffset":14742,"endOffset":14755,"count":947},{"startOffset":14755,"endOffset":14794,"count":88},{"startOffset":14794,"endOffset":15075,"count":75},{"startOffset":15002,"endOffset":15020,"count":0},{"startOffset":15022,"endOffset":15071,"count":0},{"startOffset":15075,"endOffset":15598,"count":13},{"startOffset":15192,"endOffset":15594,"count":28},{"startOffset":15515,"endOffset":15533,"count":0},{"startOffset":15535,"endOffset":15588,"count":0},{"startOffset":15598,"endOffset":15615,"count":88}],"isBlockCoverage":true},{"functionName":"_addListener","ranges":[{"startOffset":15619,"endOffset":17512,"count":831},{"startOffset":15799,"endOffset":15883,"count":2},{"startOffset":15883,"endOffset":16362,"count":829},{"startOffset":16068,"endOffset":16329,"count":47},{"startOffset":16145,"endOffset":16156,"count":36},{"startOffset":16394,"endOffset":16532,"count":807},{"startOffset":16532,"endOffset":17492,"count":24},{"startOffset":16580,"endOffset":16796,"count":15},{"startOffset":16691,"endOffset":16713,"count":2},{"startOffset":16714,"endOffset":16736,"count":13},{"startOffset":16796,"endOffset":16900,"count":9},{"startOffset":16815,"endOffset":16856,"count":0},{"startOffset":17004,"endOffset":17023,"count":0},{"startOffset":17025,"endOffset":17488,"count":0}],"isBlockCoverage":true},{"functionName":"addListener","ranges":[{"startOffset":17690,"endOffset":17782,"count":829}],"isBlockCoverage":true},{"functionName":"prependListener","ranges":[{"startOffset":18069,"endOffset":18172,"count":2}],"isBlockCoverage":true},{"functionName":"onceWrapper","ranges":[{"startOffset":18175,"endOffset":18439,"count":9},{"startOffset":18338,"endOffset":18377,"count":6},{"startOffset":18377,"endOffset":18437,"count":3}],"isBlockCoverage":true},{"functionName":"_onceWrap","ranges":[{"startOffset":18441,"endOffset":18682,"count":710}],"isBlockCoverage":true},{"functionName":"once","ranges":[{"startOffset":18873,"endOffset":18999,"count":710}],"isBlockCoverage":true},{"functionName":"removeListener","ranges":[{"startOffset":19609,"endOffset":20903,"count":738},{"startOffset":19758,"endOffset":19770,"count":0},{"startOffset":19843,"endOffset":19855,"count":4},{"startOffset":19855,"endOffset":19885,"count":734},{"startOffset":19885,"endOffset":19914,"count":717},{"startOffset":19916,"endOffset":20176,"count":714},{"startOffset":19967,"endOffset":20001,"count":0},{"startOffset":20097,"endOffset":20158,"count":1},{"startOffset":20176,"endOffset":20877,"count":20},{"startOffset":20214,"endOffset":20877,"count":17},{"startOffset":20295,"endOffset":20434,"count":27},{"startOffset":20332,"endOffset":20364,"count":10},{"startOffset":20366,"endOffset":20424,"count":17},{"startOffset":20472,"endOffset":20484,"count":0},{"startOffset":20524,"endOffset":20537,"count":6},{"startOffset":20537,"endOffset":20698,"count":11},{"startOffset":20604,"endOffset":20651,"count":1},{"startOffset":20741,"endOffset":20764,"count":10},{"startOffset":20825,"endOffset":20869,"count":0},{"startOffset":20877,"endOffset":20902,"count":734}],"isBlockCoverage":true},{"functionName":"listenerCount","ranges":[{"startOffset":24113,"endOffset":24403,"count":1418},{"startOffset":24286,"endOffset":24309,"count":716},{"startOffset":24309,"endOffset":24384,"count":702},{"startOffset":24345,"endOffset":24384,"count":0},{"startOffset":24388,"endOffset":24402,"count":702}],"isBlockCoverage":true},{"functionName":"arrayClone","ranges":[{"startOffset":24655,"endOffset":25128,"count":13},{"startOffset":24827,"endOffset":24859,"count":11},{"startOffset":24864,"endOffset":24904,"count":2},{"startOffset":24909,"endOffset":24957,"count":0},{"startOffset":24962,"endOffset":25018,"count":0},{"startOffset":25023,"endOffset":25087,"count":0},{"startOffset":25091,"endOffset":25127,"count":0}],"isBlockCoverage":true}]},{"scriptId":"24","url":"node:buffer","functions":[{"functionName":"createPool","ranges":[{"startOffset":3925,"endOffset":4084,"count":103}],"isBlockCoverage":true},{"functionName":"alignPool","ranges":[{"startOffset":4100,"endOffset":4222,"count":1283},{"startOffset":4174,"endOffset":4220,"count":1122}],"isBlockCoverage":true},{"functionName":"_copyActual","ranges":[{"startOffset":6695,"endOffset":7226,"count":8},{"startOffset":6836,"endOffset":6890,"count":0},{"startOffset":7003,"endOffset":7018,"count":0},{"startOffset":7078,"endOffset":7154,"count":0}],"isBlockCoverage":true},{"functionName":"from","ranges":[{"startOffset":8532,"endOffset":9496,"count":471},{"startOffset":8618,"endOffset":8661,"count":465},{"startOffset":8661,"endOffset":8712,"count":6},{"startOffset":8714,"endOffset":9351,"count":6},{"startOffset":8811,"endOffset":8865,"count":0},{"startOffset":8891,"endOffset":8919,"count":0},{"startOffset":8920,"endOffset":8991,"count":0},{"startOffset":8993,"endOffset":9347,"count":0},{"startOffset":9351,"endOffset":9495,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10308,"endOffset":10463,"count":1824},{"startOffset":10394,"endOffset":10461,"count":0}],"isBlockCoverage":true},{"functionName":"allocUnsafe","ranges":[{"startOffset":10990,"endOffset":11065,"count":907}],"isBlockCoverage":true},{"functionName":"allocUnsafeSlow","ranges":[{"startOffset":11306,"endOffset":11395,"count":917}],"isBlockCoverage":true},{"functionName":"allocate","ranges":[{"startOffset":11695,"endOffset":12027,"count":907},{"startOffset":11738,"endOffset":11772,"count":0},{"startOffset":11811,"endOffset":11990,"count":829},{"startOffset":11859,"endOffset":11872,"count":94},{"startOffset":11990,"endOffset":12026,"count":78}],"isBlockCoverage":true},{"functionName":"fromStringFast","ranges":[{"startOffset":12029,"endOffset":12575,"count":457},{"startOffset":12155,"endOffset":12204,"count":3},{"startOffset":12204,"endOffset":12250,"count":454},{"startOffset":12250,"endOffset":12263,"count":9},{"startOffset":12263,"endOffset":12396,"count":454},{"startOffset":12396,"endOffset":12522,"count":0},{"startOffset":12522,"endOffset":12574,"count":454}],"isBlockCoverage":true},{"functionName":"fromString","ranges":[{"startOffset":12577,"endOffset":13030,"count":465},{"startOffset":12663,"endOffset":12687,"count":461},{"startOffset":12689,"endOffset":12808,"count":4},{"startOffset":12726,"endOffset":12750,"count":0},{"startOffset":12808,"endOffset":12990,"count":461},{"startOffset":12885,"endOffset":12926,"count":0},{"startOffset":12962,"endOffset":12986,"count":8},{"startOffset":12990,"endOffset":13029,"count":457}],"isBlockCoverage":true},{"functionName":"fromArrayBuffer","ranges":[{"startOffset":13032,"endOffset":13729,"count":6},{"startOffset":13176,"endOffset":13272,"count":0},{"startOffset":13349,"endOffset":13394,"count":0},{"startOffset":13453,"endOffset":13676,"count":0}],"isBlockCoverage":true},{"functionName":"isEncoding","ranges":[{"startOffset":14894,"endOffset":15045,"count":1052}],"isBlockCoverage":true},{"functionName":"concat","ranges":[{"startOffset":15111,"endOffset":16258,"count":3},{"startOffset":15204,"endOffset":15228,"count":0},{"startOffset":15318,"endOffset":15395,"count":8},{"startOffset":15399,"endOffset":15448,"count":0},{"startOffset":15550,"endOffset":15898,"count":8},{"startOffset":15605,"endOffset":15837,"count":0},{"startOffset":15989,"endOffset":16238,"count":0}],"isBlockCoverage":true},{"functionName":"base64ByteLength","ranges":[{"startOffset":16261,"endOffset":16529,"count":5},{"startOffset":16383,"endOffset":16391,"count":4},{"startOffset":16467,"endOffset":16475,"count":1}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":16664,"endOffset":16728,"count":227}],"isBlockCoverage":true},{"functionName":"slice","ranges":[{"startOffset":16741,"endOffset":16787,"count":876}],"isBlockCoverage":true},{"functionName":"slice","ranges":[{"startOffset":17110,"endOffset":17156,"count":5098}],"isBlockCoverage":true},{"functionName":"byteLength","ranges":[{"startOffset":17369,"endOffset":17398,"count":2}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":17411,"endOffset":17475,"count":2}],"isBlockCoverage":true},{"functionName":"slice","ranges":[{"startOffset":17488,"endOffset":17534,"count":20}],"isBlockCoverage":true},{"functionName":"byteLength","ranges":[{"startOffset":17744,"endOffset":17769,"count":1}],"isBlockCoverage":true},{"functionName":"byteLength","ranges":[{"startOffset":18115,"endOffset":18140,"count":3}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":18153,"endOffset":18218,"count":3}],"isBlockCoverage":true},{"functionName":"byteLength","ranges":[{"startOffset":18601,"endOffset":18652,"count":5}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":18665,"endOffset":18731,"count":4}],"isBlockCoverage":true},{"functionName":"slice","ranges":[{"startOffset":18744,"endOffset":18792,"count":2}],"isBlockCoverage":true},{"functionName":"byteLength","ranges":[{"startOffset":19651,"endOffset":19682,"count":219}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":19695,"endOffset":19758,"count":218}],"isBlockCoverage":true},{"functionName":"slice","ranges":[{"startOffset":19771,"endOffset":19816,"count":258}],"isBlockCoverage":true},{"functionName":"getEncodingOps","ranges":[{"startOffset":20047,"endOffset":21871,"count":6716},{"startOffset":20134,"endOffset":20433,"count":6201},{"startOffset":20173,"endOffset":20197,"count":1103},{"startOffset":20197,"endOffset":20253,"count":5098},{"startOffset":20253,"endOffset":20433,"count":0},{"startOffset":20438,"endOffset":20857,"count":3},{"startOffset":20478,"endOffset":20502,"count":0},{"startOffset":20560,"endOffset":20857,"count":0},{"startOffset":20862,"endOffset":21016,"count":22},{"startOffset":20903,"endOffset":20966,"count":0},{"startOffset":21003,"endOffset":21016,"count":0},{"startOffset":21021,"endOffset":21177,"count":0},{"startOffset":21182,"endOffset":21563,"count":8},{"startOffset":21256,"endOffset":21282,"count":1},{"startOffset":21282,"endOffset":21342,"count":7},{"startOffset":21342,"endOffset":21454,"count":0},{"startOffset":21464,"endOffset":21563,"count":0},{"startOffset":21568,"endOffset":21700,"count":482},{"startOffset":21605,"endOffset":21654,"count":0},{"startOffset":21687,"endOffset":21700,"count":0},{"startOffset":21705,"endOffset":21865,"count":0}],"isBlockCoverage":true},{"functionName":"byteLength","ranges":[{"startOffset":21873,"endOffset":22530,"count":3},{"startOffset":21947,"endOffset":22159,"count":0},{"startOffset":22232,"endOffset":22256,"count":0},{"startOffset":22294,"endOffset":22303,"count":2},{"startOffset":22303,"endOffset":22326,"count":1},{"startOffset":22326,"endOffset":22375,"count":0},{"startOffset":22375,"endOffset":22446,"count":1},{"startOffset":22446,"endOffset":22495,"count":0},{"startOffset":22495,"endOffset":22529,"count":1}],"isBlockCoverage":true},{"functionName":"toString","ranges":[{"startOffset":23424,"endOffset":24003,"count":6264},{"startOffset":23496,"endOffset":23544,"count":2},{"startOffset":23544,"endOffset":23596,"count":6262},{"startOffset":23596,"endOffset":23606,"count":0},{"startOffset":23606,"endOffset":23669,"count":6262},{"startOffset":23636,"endOffset":23646,"count":0},{"startOffset":23669,"endOffset":23695,"count":6262},{"startOffset":23695,"endOffset":23707,"count":0},{"startOffset":23713,"endOffset":23723,"count":6262},{"startOffset":23723,"endOffset":23744,"count":0},{"startOffset":23744,"endOffset":23770,"count":6262},{"startOffset":23770,"endOffset":23780,"count":8},{"startOffset":23780,"endOffset":23816,"count":6254},{"startOffset":23816,"endOffset":23850,"count":0},{"startOffset":23850,"endOffset":23921,"count":6254},{"startOffset":23921,"endOffset":23962,"count":0},{"startOffset":23962,"endOffset":24002,"count":6254}],"isBlockCoverage":true},{"functionName":"adjustOffset","ranges":[{"startOffset":32607,"endOffset":33041,"count":50},{"startOffset":32847,"endOffset":32885,"count":25},{"startOffset":32885,"endOffset":32948,"count":0},{"startOffset":32948,"endOffset":32996,"count":25},{"startOffset":32996,"endOffset":33029,"count":0},{"startOffset":33030,"endOffset":33038,"count":0}],"isBlockCoverage":true},{"functionName":"subarray","ranges":[{"startOffset":33071,"endOffset":33374,"count":25},{"startOffset":33235,"endOffset":33246,"count":0},{"startOffset":33294,"endOffset":33297,"count":0}],"isBlockCoverage":true},{"functionName":"slice","ranges":[{"startOffset":33402,"endOffset":33468,"count":25}],"isBlockCoverage":true}]},{"scriptId":"25","url":"node:internal/buffer","functions":[{"functionName":"FastBuffer","ranges":[{"startOffset":26353,"endOffset":26453,"count":2689}],"isBlockCoverage":true},{"functionName":"markAsUntransferable","ranges":[{"startOffset":29752,"endOffset":30016,"count":103},{"startOffset":29820,"endOffset":29848,"count":0},{"startOffset":29871,"endOffset":29878,"count":0}],"isBlockCoverage":true},{"functionName":"createUnsafeBuffer","ranges":[{"startOffset":30294,"endOffset":30430,"count":1098}],"isBlockCoverage":true},{"functionName":"reconnectZeroFillToggle","ranges":[{"startOffset":30685,"endOffset":30757,"count":1}],"isBlockCoverage":true}]},{"scriptId":"27","url":"node:internal/encoding","functions":[{"functionName":"validateDecoder","ranges":[{"startOffset":1325,"endOffset":1450,"count":5107},{"startOffset":1406,"endOffset":1448,"count":0}],"isBlockCoverage":true},{"functionName":"getEncodingFromLabel","ranges":[{"startOffset":8696,"endOffset":8875,"count":180},{"startOffset":8807,"endOffset":8874,"count":0}],"isBlockCoverage":true},{"functionName":"TextDecoder","ranges":[{"startOffset":10382,"endOffset":11187,"count":180},{"startOffset":10692,"endOffset":10739,"count":0},{"startOffset":10823,"endOffset":10846,"count":177},{"startOffset":10847,"endOffset":10850,"count":3},{"startOffset":10887,"endOffset":10915,"count":0},{"startOffset":11017,"endOffset":11064,"count":0}],"isBlockCoverage":true},{"functionName":"decode","ranges":[{"startOffset":11194,"endOffset":12032,"count":5105},{"startOffset":11306,"endOffset":11357,"count":0},{"startOffset":11394,"endOffset":11573,"count":0},{"startOffset":11788,"endOffset":11791,"count":0},{"startOffset":11909,"endOffset":11991,"count":2},{"startOffset":11991,"endOffset":12031,"count":5103}],"isBlockCoverage":true},{"functionName":"get encoding","ranges":[{"startOffset":14873,"endOffset":14948,"count":2}],"isBlockCoverage":true}]},{"scriptId":"30","url":"node:internal/process/per_thread","functions":[{"functionName":"refreshHrtimeBuffer","ranges":[{"startOffset":1408,"endOffset":1876,"count":1}],"isBlockCoverage":true},{"functionName":"exit","ranges":[{"startOffset":4796,"endOffset":5279,"count":1}],"isBlockCoverage":true},{"functionName":"toggleTraceCategoryState","ranges":[{"startOffset":11332,"endOffset":11662,"count":1},{"startOffset":11412,"endOffset":11587,"count":0},{"startOffset":11619,"endOffset":11660,"count":0}],"isBlockCoverage":true}]},{"scriptId":"32","url":"node:internal/process/task_queues","functions":[{"functionName":"setHasTickScheduled","ranges":[{"startOffset":1076,"endOffset":1162,"count":203},{"startOffset":1152,"endOffset":1155,"count":104},{"startOffset":1156,"endOffset":1159,"count":99}],"isBlockCoverage":true},{"functionName":"processTicksAndRejections","ranges":[{"startOffset":1462,"endOffset":2441,"count":99},{"startOffset":1518,"endOffset":2321,"count":101},{"startOffset":1564,"endOffset":2296,"count":124},{"startOffset":1765,"endOffset":1798,"count":0},{"startOffset":1885,"endOffset":1918,"count":93},{"startOffset":1931,"endOffset":1973,"count":28},{"startOffset":1986,"endOffset":2037,"count":3},{"startOffset":2050,"endOffset":2110,"count":0},{"startOffset":2123,"endOffset":2150,"count":0},{"startOffset":2234,"endOffset":2255,"count":0}],"isBlockCoverage":true},{"functionName":"nextTick","ranges":[{"startOffset":2585,"endOffset":3446,"count":125},{"startOffset":2674,"endOffset":2681,"count":0},{"startOffset":2729,"endOffset":2743,"count":0},{"startOffset":2748,"endOffset":2785,"count":94},{"startOffset":2790,"endOffset":2841,"count":28},{"startOffset":2846,"endOffset":2911,"count":3},{"startOffset":2916,"endOffset":3059,"count":0},{"startOffset":3088,"endOffset":3114,"count":104},{"startOffset":3358,"endOffset":3418,"count":0}],"isBlockCoverage":true}]},{"scriptId":"33","url":"node:internal/process/promises","functions":[{"functionName":"setHasRejectionToWarn","ranges":[{"startOffset":2065,"endOffset":2155,"count":118},{"startOffset":2145,"endOffset":2148,"count":19},{"startOffset":2149,"endOffset":2152,"count":99}],"isBlockCoverage":true},{"functionName":"getUnhandledRejectionsMode","ranges":[{"startOffset":2376,"endOffset":2909,"count":1},{"startOffset":2532,"endOffset":2585,"count":0},{"startOffset":2590,"endOffset":2647,"count":0},{"startOffset":2652,"endOffset":2707,"count":0},{"startOffset":2712,"endOffset":2765,"count":0},{"startOffset":2770,"endOffset":2850,"count":0}],"isBlockCoverage":true},{"functionName":"promiseRejectHandler","ranges":[{"startOffset":2911,"endOffset":3480,"count":38},{"startOffset":3011,"endOffset":3076,"count":1},{"startOffset":3099,"endOffset":3188,"count":19},{"startOffset":3193,"endOffset":3276,"count":19},{"startOffset":3281,"endOffset":3376,"count":0},{"startOffset":3381,"endOffset":3474,"count":0}],"isBlockCoverage":true},{"functionName":"unhandledRejection","ranges":[{"startOffset":3734,"endOffset":4293,"count":19}],"isBlockCoverage":true},{"functionName":"emit","ranges":[{"startOffset":3796,"endOffset":3990,"count":0}],"isBlockCoverage":false},{"functionName":"handledRejection","ranges":[{"startOffset":4295,"endOffset":5126,"count":19},{"startOffset":4498,"endOffset":5006,"count":0},{"startOffset":5051,"endOffset":5089,"count":0},{"startOffset":5095,"endOffset":5124,"count":0}],"isBlockCoverage":true},{"functionName":"processPromiseRejections","ranges":[{"startOffset":6407,"endOffset":9566,"count":99},{"startOffset":6565,"endOffset":6744,"count":0},{"startOffset":6809,"endOffset":9470,"count":19},{"startOffset":6999,"endOffset":8252,"count":0},{"startOffset":8261,"endOffset":8368,"count":0},{"startOffset":8377,"endOffset":8542,"count":0},{"startOffset":8551,"endOffset":8986,"count":0},{"startOffset":8995,"endOffset":9257,"count":0},{"startOffset":9272,"endOffset":9470,"count":0}],"isBlockCoverage":true}]},{"scriptId":"34","url":"node:internal/fixed_queue","functions":[{"functionName":"isEmpty","ranges":[{"startOffset":3077,"endOffset":3129,"count":451}],"isBlockCoverage":true},{"functionName":"isFull","ranges":[{"startOffset":3133,"endOffset":3200,"count":125}],"isBlockCoverage":true},{"functionName":"push","ranges":[{"startOffset":3204,"endOffset":3291,"count":125}],"isBlockCoverage":true},{"functionName":"shift","ranges":[{"startOffset":3295,"endOffset":3510,"count":225},{"startOffset":3388,"endOffset":3400,"count":101},{"startOffset":3400,"endOffset":3509,"count":124}],"isBlockCoverage":true},{"functionName":"isEmpty","ranges":[{"startOffset":3630,"endOffset":3677,"count":226}],"isBlockCoverage":true},{"functionName":"push","ranges":[{"startOffset":3681,"endOffset":3945,"count":125},{"startOffset":3722,"endOffset":3915,"count":0}],"isBlockCoverage":true},{"functionName":"shift","ranges":[{"startOffset":3949,"endOffset":4204,"count":225},{"startOffset":4041,"endOffset":4062,"count":204},{"startOffset":4064,"endOffset":4183,"count":0}],"isBlockCoverage":true}]},{"scriptId":"37","url":"node:internal/console/constructor","functions":[{"functionName":"value","ranges":[{"startOffset":5714,"endOffset":6356,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":5923,"endOffset":6018,"count":2087},{"startOffset":5956,"endOffset":5979,"count":1}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":6030,"endOffset":6060,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":6189,"endOffset":6288,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":6300,"endOffset":6330,"count":0}],"isBlockCoverage":false},{"functionName":"value","ranges":[{"startOffset":6447,"endOffset":7849,"count":1}],"isBlockCoverage":true},{"functionName":"value","ranges":[{"startOffset":7940,"endOffset":9392,"count":696},{"startOffset":8166,"endOffset":8180,"count":0},{"startOffset":8254,"endOffset":8280,"count":0},{"startOffset":8319,"endOffset":8514,"count":0},{"startOffset":8572,"endOffset":8600,"count":0},{"startOffset":8957,"endOffset":8984,"count":609},{"startOffset":9038,"endOffset":9322,"count":0}],"isBlockCoverage":true},{"functionName":"value","ranges":[{"startOffset":9486,"endOffset":9976,"count":696},{"startOffset":9600,"endOffset":9706,"count":0},{"startOffset":9780,"endOffset":9901,"count":0},{"startOffset":9922,"endOffset":9944,"count":0}],"isBlockCoverage":true},{"functionName":"value","ranges":[{"startOffset":10068,"endOffset":10248,"count":696}],"isBlockCoverage":true},{"functionName":"createWriteErrorHandler","ranges":[{"startOffset":10609,"endOffset":11498,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10677,"endOffset":11495,"count":695},{"startOffset":10947,"endOffset":10965,"count":0},{"startOffset":11440,"endOffset":11485,"count":87}],"isBlockCoverage":true},{"functionName":"log","ranges":[{"startOffset":11527,"endOffset":11614,"count":696}],"isBlockCoverage":true},{"functionName":"initializeGlobalConsole","ranges":[{"startOffset":20366,"endOffset":20509,"count":1}],"isBlockCoverage":true}]},{"scriptId":"39","url":"node:internal/url","functions":[{"functionName":"URLContext","ranges":[{"startOffset":3741,"endOffset":3964,"count":23292}],"isBlockCoverage":true},{"functionName":"URLSearchParams","ranges":[{"startOffset":4366,"endOffset":7233,"count":21893},{"startOffset":4481,"endOffset":7171,"count":0}],"isBlockCoverage":true},{"functionName":"onParseComplete","ranges":[{"startOffset":14708,"endOffset":15401,"count":21893},{"startOffset":14963,"endOffset":14973,"count":0},{"startOffset":15036,"endOffset":15046,"count":0},{"startOffset":15127,"endOffset":15131,"count":0}],"isBlockCoverage":true},{"functionName":"onParseError","ranges":[{"startOffset":15403,"endOffset":15478,"count":1399}],"isBlockCoverage":true},{"functionName":"onParsePathComplete","ranges":[{"startOffset":16663,"endOffset":17157,"count":1961},{"startOffset":16929,"endOffset":16997,"count":0}],"isBlockCoverage":true},{"functionName":"URL","ranges":[{"startOffset":17515,"endOffset":17919,"count":23292},{"startOffset":17662,"endOffset":17714,"count":5044}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18008,"endOffset":18101,"count":23963}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19317,"endOffset":20576,"count":14798},{"startOffset":19656,"endOffset":20123,"count":14268},{"startOffset":19831,"endOffset":19980,"count":0},{"startOffset":20010,"endOffset":20045,"count":0},{"startOffset":20095,"endOffset":20117,"count":0},{"startOffset":20152,"endOffset":20185,"count":530},{"startOffset":20185,"endOffset":20396,"count":14268},{"startOffset":20221,"endOffset":20243,"count":0},{"startOffset":20244,"endOffset":20265,"count":0},{"startOffset":20267,"endOffset":20297,"count":0},{"startOffset":20449,"endOffset":20472,"count":2},{"startOffset":20530,"endOffset":20556,"count":2}],"isBlockCoverage":true},{"functionName":"toString","ranges":[{"startOffset":20633,"endOffset":20679,"count":3843}],"isBlockCoverage":true},{"functionName":"get href","ranges":[{"startOffset":20683,"endOffset":20729,"count":10955}],"isBlockCoverage":true},{"functionName":"get origin","ranges":[{"startOffset":20990,"endOffset":21559,"count":5429},{"startOffset":21129,"endOffset":21357,"count":0},{"startOffset":21364,"endOffset":21376,"count":0},{"startOffset":21383,"endOffset":21396,"count":0},{"startOffset":21403,"endOffset":21417,"count":0},{"startOffset":21424,"endOffset":21435,"count":0},{"startOffset":21442,"endOffset":21523,"count":0}],"isBlockCoverage":true},{"functionName":"get protocol","ranges":[{"startOffset":21563,"endOffset":21616,"count":24427}],"isBlockCoverage":true},{"functionName":"get username","ranges":[{"startOffset":21892,"endOffset":21947,"count":3}],"isBlockCoverage":true},{"functionName":"get password","ranges":[{"startOffset":22336,"endOffset":22391,"count":3}],"isBlockCoverage":true},{"functionName":"get hostname","ranges":[{"startOffset":23243,"endOffset":23300,"count":5392},{"startOffset":23290,"endOffset":23295,"count":5383}],"isBlockCoverage":true},{"functionName":"get port","ranges":[{"startOffset":23598,"endOffset":23697,"count":3},{"startOffset":23678,"endOffset":23692,"count":0}],"isBlockCoverage":true},{"functionName":"get pathname","ranges":[{"startOffset":24033,"endOffset":24238,"count":7204},{"startOffset":24115,"endOffset":24134,"count":0},{"startOffset":24172,"endOffset":24182,"count":0}],"isBlockCoverage":true},{"functionName":"set pathname","ranges":[{"startOffset":24242,"endOffset":24456,"count":1961},{"startOffset":24353,"endOffset":24360,"count":0}],"isBlockCoverage":true},{"functionName":"get search","ranges":[{"startOffset":24460,"endOffset":24596,"count":1789},{"startOffset":24535,"endOffset":24550,"count":4},{"startOffset":24558,"endOffset":24568,"count":1785},{"startOffset":24568,"endOffset":24595,"count":4}],"isBlockCoverage":true},{"functionName":"set search","ranges":[{"startOffset":24600,"endOffset":25117,"count":1783},{"startOffset":24781,"endOffset":25063,"count":0}],"isBlockCoverage":true},{"functionName":"get hash","ranges":[{"startOffset":25194,"endOffset":25340,"count":1786},{"startOffset":25273,"endOffset":25291,"count":0},{"startOffset":25309,"endOffset":25339,"count":0}],"isBlockCoverage":true},{"functionName":"set hash","ranges":[{"startOffset":25344,"endOffset":25785,"count":1783},{"startOffset":25555,"endOffset":25784,"count":0}],"isBlockCoverage":true},{"functionName":"initSearchParams","ranges":[{"startOffset":27673,"endOffset":27813,"count":23676},{"startOffset":27725,"endOffset":27770,"count":23674},{"startOffset":27770,"endOffset":27812,"count":2}],"isBlockCoverage":true},{"functionName":"parseParams","ranges":[{"startOffset":27922,"endOffset":30251,"count":2},{"startOffset":28135,"endOffset":29840,"count":46},{"startOffset":28267,"endOffset":28799,"count":0},{"startOffset":28891,"endOffset":28913,"count":16},{"startOffset":28915,"endOffset":29223,"count":2},{"startOffset":29040,"endOffset":29072,"count":0},{"startOffset":29223,"endOffset":29291,"count":44},{"startOffset":29291,"endOffset":29415,"count":0},{"startOffset":29415,"endOffset":29836,"count":44},{"startOffset":29591,"endOffset":29625,"count":0},{"startOffset":29652,"endOffset":29830,"count":0},{"startOffset":29974,"endOffset":29985,"count":0},{"startOffset":30074,"endOffset":30106,"count":0},{"startOffset":30206,"endOffset":30234,"count":0}],"isBlockCoverage":true},{"functionName":"urlToHttpOptions","ranges":[{"startOffset":36384,"endOffset":37017,"count":3},{"startOffset":36574,"endOffset":36623,"count":0},{"startOffset":36744,"endOffset":36749,"count":0},{"startOffset":36763,"endOffset":36768,"count":1},{"startOffset":36819,"endOffset":36861,"count":0},{"startOffset":36898,"endOffset":36997,"count":0}],"isBlockCoverage":true},{"functionName":"getPathFromURLPosix","ranges":[{"startOffset":38419,"endOffset":38923,"count":5383},{"startOffset":38482,"endOffset":38538,"count":0},{"startOffset":38616,"endOffset":38882,"count":375655},{"startOffset":38647,"endOffset":38878,"count":16},{"startOffset":38757,"endOffset":38872,"count":0}],"isBlockCoverage":true},{"functionName":"fileURLToPath","ranges":[{"startOffset":38925,"endOffset":39272,"count":5383},{"startOffset":38992,"endOffset":39013,"count":874},{"startOffset":39013,"endOffset":39115,"count":4509},{"startOffset":39051,"endOffset":39115,"count":0},{"startOffset":39153,"endOffset":39194,"count":0},{"startOffset":39214,"endOffset":39241,"count":0}],"isBlockCoverage":true},{"functionName":"encodePathChars","ranges":[{"startOffset":40032,"endOffset":40748,"count":1961},{"startOffset":40119,"endOffset":40184,"count":0},{"startOffset":40306,"endOffset":40373,"count":0},{"startOffset":40425,"endOffset":40490,"count":0},{"startOffset":40542,"endOffset":40614,"count":0},{"startOffset":40666,"endOffset":40727,"count":0}],"isBlockCoverage":true},{"functionName":"pathToFileURL","ranges":[{"startOffset":40750,"endOffset":42001,"count":1961},{"startOffset":40838,"endOffset":40884,"count":0},{"startOffset":40886,"endOffset":41488,"count":0},{"startOffset":41787,"endOffset":41850,"count":1960},{"startOffset":41810,"endOffset":41849,"count":0},{"startOffset":41852,"endOffset":41905,"count":1},{"startOffset":41913,"endOffset":41929,"count":1}],"isBlockCoverage":true},{"functionName":"isURLInstance","ranges":[{"startOffset":42003,"endOffset":42122,"count":10245},{"startOffset":42096,"endOffset":42119,"count":5429}],"isBlockCoverage":true},{"functionName":"toPathIfFileURL","ranges":[{"startOffset":42124,"endOffset":42269,"count":5736},{"startOffset":42207,"endOffset":42228,"count":4816},{"startOffset":42228,"endOffset":42268,"count":920}],"isBlockCoverage":true}]},{"scriptId":"41","url":"node:path","functions":[{"functionName":"isPosixPathSeparator","ranges":[{"startOffset":1825,"endOffset":1902,"count":481265}],"isBlockCoverage":true},{"functionName":"normalizeString","ranges":[{"startOffset":2137,"endOffset":4085,"count":6205},{"startOffset":2354,"endOffset":4069,"count":481264},{"startOffset":2387,"endOffset":2429,"count":475059},{"startOffset":2429,"endOffset":2520,"count":6205},{"startOffset":2472,"endOffset":2478,"count":6204},{"startOffset":2478,"endOffset":2520,"count":1},{"startOffset":2520,"endOffset":2553,"count":475060},{"startOffset":2553,"endOffset":3970,"count":61662},{"startOffset":2585,"endOffset":2598,"count":53601},{"startOffset":2600,"endOffset":2625,"count":8226},{"startOffset":2625,"endOffset":3927,"count":53436},{"startOffset":2647,"endOffset":3682,"count":28},{"startOffset":2703,"endOffset":2777,"count":0},{"startOffset":2778,"endOffset":2852,"count":0},{"startOffset":3006,"endOffset":3082,"count":0},{"startOffset":3363,"endOffset":3532,"count":0},{"startOffset":3542,"endOffset":3674,"count":0},{"startOffset":3682,"endOffset":3927,"count":53408},{"startOffset":3728,"endOffset":3797,"count":47203},{"startOffset":3797,"endOffset":3872,"count":6205},{"startOffset":3927,"endOffset":3970,"count":61634},{"startOffset":3970,"endOffset":4065,"count":413398},{"startOffset":3998,"endOffset":4012,"count":10005},{"startOffset":4014,"endOffset":4035,"count":223},{"startOffset":4035,"endOffset":4065,"count":413175}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":33660,"endOffset":33679,"count":1}],"isBlockCoverage":true},{"functionName":"resolve","ranges":[{"startOffset":33804,"endOffset":34721,"count":6204},{"startOffset":33927,"endOffset":33947,"count":14493},{"startOffset":33954,"endOffset":34275,"count":8290},{"startOffset":33982,"endOffset":33991,"count":8289},{"startOffset":33992,"endOffset":34004,"count":1},{"startOffset":34101,"endOffset":34128,"count":0},{"startOffset":34660,"endOffset":34710,"count":0},{"startOffset":34711,"endOffset":34716,"count":0}],"isBlockCoverage":true},{"functionName":"normalize","ranges":[{"startOffset":34787,"endOffset":35400,"count":1},{"startOffset":34873,"endOffset":34884,"count":0},{"startOffset":35212,"endOffset":35306,"count":0},{"startOffset":35340,"endOffset":35352,"count":0},{"startOffset":35389,"endOffset":35395,"count":0}],"isBlockCoverage":true},{"functionName":"isAbsolute","ranges":[{"startOffset":35467,"endOffset":35623,"count":1398}],"isBlockCoverage":true},{"functionName":"toNamespacedPath","ranges":[{"startOffset":38622,"endOffset":38698,"count":5528}],"isBlockCoverage":true},{"functionName":"dirname","ranges":[{"startOffset":38764,"endOffset":39440,"count":822},{"startOffset":38847,"endOffset":38858,"count":0},{"startOffset":39032,"endOffset":39285,"count":9015},{"startOffset":39103,"endOffset":39187,"count":822},{"startOffset":39187,"endOffset":39279,"count":8193},{"startOffset":39313,"endOffset":39340,"count":0},{"startOffset":39377,"endOffset":39389,"count":0}],"isBlockCoverage":true},{"functionName":"basename","ranges":[{"startOffset":39536,"endOffset":41963,"count":172},{"startOffset":39597,"endOffset":39627,"count":0},{"startOffset":39759,"endOffset":39779,"count":0},{"startOffset":39780,"endOffset":39811,"count":0},{"startOffset":39813,"endOffset":41337,"count":0},{"startOffset":41385,"endOffset":41870,"count":1944},{"startOffset":41456,"endOffset":41680,"count":172},{"startOffset":41680,"endOffset":41864,"count":1772},{"startOffset":41702,"endOffset":41864,"count":172},{"startOffset":41898,"endOffset":41908,"count":0}],"isBlockCoverage":true},{"functionName":"extname","ranges":[{"startOffset":42029,"endOffset":43719,"count":1783},{"startOffset":42362,"endOffset":43324,"count":47791},{"startOffset":42458,"endOffset":42704,"count":1783},{"startOffset":42678,"endOffset":42704,"count":0},{"startOffset":42704,"endOffset":42727,"count":46008},{"startOffset":42727,"endOffset":42884,"count":1783},{"startOffset":42884,"endOffset":42914,"count":46008},{"startOffset":42914,"endOffset":43114,"count":3758},{"startOffset":43030,"endOffset":43043,"count":1783},{"startOffset":43043,"endOffset":43106,"count":1975},{"startOffset":43114,"endOffset":43318,"count":42250},{"startOffset":43141,"endOffset":43318,"count":36904},{"startOffset":43563,"endOffset":43595,"count":0},{"startOffset":43596,"endOffset":43634,"count":0},{"startOffset":43637,"endOffset":43661,"count":0}],"isBlockCoverage":true}]},{"scriptId":"44","url":"node:internal/event_target","functions":[{"functionName":"EventEmitterMixin","ranges":[{"startOffset":27662,"endOffset":28352,"count":1},{"startOffset":28093,"endOffset":28255,"count":18}],"isBlockCoverage":true},{"functionName":"MixedEventEmitter","ranges":[{"startOffset":27731,"endOffset":27872,"count":917}],"isBlockCoverage":true}]},{"scriptId":"48","url":"node:internal/perf/utils","functions":[{"functionName":"refreshTimeOrigin","ranges":[{"startOffset":499,"endOffset":563,"count":1}],"isBlockCoverage":true}]},{"scriptId":"49","url":"node:timers","functions":[{"functionName":"","ranges":[{"startOffset":1810,"endOffset":1835,"count":1}],"isBlockCoverage":true},{"functionName":"unenroll","ranges":[{"startOffset":2332,"endOffset":3516,"count":1},{"startOffset":2385,"endOffset":2392,"count":0},{"startOffset":2452,"endOffset":2498,"count":0},{"startOffset":2589,"endOffset":2627,"count":0},{"startOffset":2633,"endOffset":2668,"count":0}],"isBlockCoverage":true},{"functionName":"setTimeout","ranges":[{"startOffset":4218,"endOffset":4863,"count":4},{"startOffset":4373,"endOffset":4380,"count":0},{"startOffset":4410,"endOffset":4451,"count":0},{"startOffset":4456,"endOffset":4503,"count":0},{"startOffset":4508,"endOffset":4729,"count":0}],"isBlockCoverage":true},{"functionName":"clearTimeout","ranges":[{"startOffset":5182,"endOffset":5548,"count":3},{"startOffset":5225,"endOffset":5244,"count":1},{"startOffset":5246,"endOffset":5313,"count":1},{"startOffset":5313,"endOffset":5374,"count":2},{"startOffset":5376,"endOffset":5546,"count":0}],"isBlockCoverage":true},{"functionName":"setInterval","ranges":[{"startOffset":5785,"endOffset":6432,"count":1},{"startOffset":5942,"endOffset":5949,"count":0},{"startOffset":5979,"endOffset":6020,"count":0},{"startOffset":6025,"endOffset":6072,"count":0},{"startOffset":6077,"endOffset":6298,"count":0}],"isBlockCoverage":true},{"functionName":"clearInterval","ranges":[{"startOffset":6529,"endOffset":6827,"count":1}],"isBlockCoverage":true}]},{"scriptId":"56","url":"node:internal/streams/destroy","functions":[{"functionName":"checkError","ranges":[{"startOffset":235,"endOffset":546,"count":6},{"startOffset":279,"endOffset":544,"count":0}],"isBlockCoverage":true},{"functionName":"destroy","ranges":[{"startOffset":656,"endOffset":1443,"count":3},{"startOffset":839,"endOffset":850,"count":0},{"startOffset":868,"endOffset":945,"count":0},{"startOffset":1130,"endOffset":1159,"count":0},{"startOffset":1278,"endOffset":1385,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1304,"endOffset":1379,"count":0}],"isBlockCoverage":false},{"functionName":"_destroy","ranges":[{"startOffset":1445,"endOffset":2392,"count":3},{"startOffset":2055,"endOffset":2348,"count":0},{"startOffset":2353,"endOffset":2390,"count":0}],"isBlockCoverage":true},{"functionName":"onDestroy","ranges":[{"startOffset":1505,"endOffset":1964,"count":3},{"startOffset":1547,"endOffset":1568,"count":0},{"startOffset":1699,"endOffset":1729,"count":0},{"startOffset":1807,"endOffset":1829,"count":0},{"startOffset":1844,"endOffset":1904,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2176,"endOffset":2247,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2259,"endOffset":2332,"count":0}],"isBlockCoverage":false},{"functionName":"emitCloseNT","ranges":[{"startOffset":2483,"endOffset":2731,"count":3},{"startOffset":2588,"endOffset":2620,"count":0},{"startOffset":2671,"endOffset":2682,"count":0}],"isBlockCoverage":true},{"functionName":"undestroy","ranges":[{"startOffset":3010,"endOffset":3625,"count":3}],"isBlockCoverage":true},{"functionName":"construct","ranges":[{"startOffset":4548,"endOffset":4954,"count":59},{"startOffset":4645,"endOffset":4953,"count":0}],"isBlockCoverage":true}]},{"scriptId":"57","url":"node:internal/streams/duplex","functions":[{"functionName":"Duplex","ranges":[{"startOffset":1996,"endOffset":2420,"count":28},{"startOffset":2060,"endOffset":2087,"count":0},{"startOffset":2242,"endOffset":2264,"count":1},{"startOffset":2308,"endOffset":2330,"count":0},{"startOffset":2373,"endOffset":2414,"count":3}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":3568,"endOffset":3780,"count":112},{"startOffset":3666,"endOffset":3697,"count":0},{"startOffset":3741,"endOffset":3773,"count":0}],"isBlockCoverage":true}]},{"scriptId":"58","url":"node:internal/streams/readable","functions":[{"functionName":"","ranges":[{"startOffset":1731,"endOffset":1756,"count":1}],"isBlockCoverage":true},{"functionName":"ReadableState","ranges":[{"startOffset":2497,"endOffset":6226,"count":31},{"startOffset":2896,"endOffset":2939,"count":0},{"startOffset":3139,"endOffset":3224,"count":28},{"startOffset":3472,"endOffset":3508,"count":0},{"startOffset":6125,"endOffset":6224,"count":0}],"isBlockCoverage":true},{"functionName":"Readable","ranges":[{"startOffset":6229,"endOffset":7126,"count":31},{"startOffset":6297,"endOffset":6326,"count":0},{"startOffset":6649,"endOffset":6675,"count":0},{"startOffset":6730,"endOffset":6762,"count":0},{"startOffset":6819,"endOffset":6855,"count":0},{"startOffset":6879,"endOffset":6891,"count":0},{"startOffset":6899,"endOffset":6946,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7013,"endOffset":7122,"count":0}],"isBlockCoverage":false},{"functionName":"Readable.push","ranges":[{"startOffset":7613,"endOffset":7699,"count":23}],"isBlockCoverage":true},{"functionName":"readableAddChunk","ranges":[{"startOffset":7883,"endOffset":10153,"count":23},{"startOffset":8097,"endOffset":8561,"count":0},{"startOffset":8596,"endOffset":8624,"count":20},{"startOffset":8624,"endOffset":8871,"count":3},{"startOffset":8663,"endOffset":8740,"count":0},{"startOffset":8765,"endOffset":8871,"count":0},{"startOffset":8888,"endOffset":8926,"count":0},{"startOffset":8952,"endOffset":9015,"count":3},{"startOffset":9015,"endOffset":9869,"count":20},{"startOffset":9096,"endOffset":9262,"count":0},{"startOffset":9285,"endOffset":9355,"count":0},{"startOffset":9399,"endOffset":9426,"count":0},{"startOffset":9487,"endOffset":9499,"count":0},{"startOffset":9501,"endOffset":9708,"count":0},{"startOffset":9780,"endOffset":9869,"count":0},{"startOffset":10085,"endOffset":10150,"count":20},{"startOffset":10128,"endOffset":10149,"count":0}],"isBlockCoverage":true},{"functionName":"addChunk","ranges":[{"startOffset":10155,"endOffset":10885,"count":20},{"startOffset":10266,"endOffset":10307,"count":18},{"startOffset":10309,"endOffset":10599,"count":18},{"startOffset":10436,"endOffset":10482,"count":0},{"startOffset":10599,"endOffset":10851,"count":2},{"startOffset":10675,"endOffset":10678,"count":0},{"startOffset":10721,"endOffset":10749,"count":0},{"startOffset":10826,"endOffset":10847,"count":0}],"isBlockCoverage":true},{"functionName":"Readable.isPaused","ranges":[{"startOffset":10917,"endOffset":11029,"count":2}],"isBlockCoverage":true},{"functionName":"howMuchToRead","ranges":[{"startOffset":12193,"endOffset":12587,"count":35},{"startOffset":12241,"endOffset":12279,"count":10},{"startOffset":12264,"endOffset":12278,"count":8},{"startOffset":12285,"endOffset":12294,"count":28},{"startOffset":12294,"endOffset":12323,"count":7},{"startOffset":12323,"endOffset":12332,"count":0},{"startOffset":12332,"endOffset":12505,"count":7},{"startOffset":12441,"endOffset":12476,"count":2},{"startOffset":12476,"endOffset":12505,"count":5},{"startOffset":12505,"endOffset":12580,"count":0},{"startOffset":12581,"endOffset":12584,"count":0}],"isBlockCoverage":true},{"functionName":"Readable.read","ranges":[{"startOffset":12684,"endOffset":17055,"count":35},{"startOffset":12868,"endOffset":12886,"count":10},{"startOffset":12886,"endOffset":12953,"count":25},{"startOffset":12917,"endOffset":12953,"count":0},{"startOffset":13118,"endOffset":13167,"count":0},{"startOffset":13188,"endOffset":13218,"count":10},{"startOffset":13404,"endOffset":13431,"count":25},{"startOffset":13432,"endOffset":13565,"count":20},{"startOffset":13515,"endOffset":13541,"count":0},{"startOffset":13567,"endOffset":13752,"count":0},{"startOffset":13861,"endOffset":13875,"count":33},{"startOffset":13877,"endOffset":13952,"count":3},{"startOffset":13952,"endOffset":15228,"count":32},{"startOffset":15228,"endOffset":15269,"count":4},{"startOffset":15271,"endOffset":15589,"count":32},{"startOffset":15590,"endOffset":15608,"count":23},{"startOffset":15609,"endOffset":15625,"count":23},{"startOffset":15626,"endOffset":15653,"count":23},{"startOffset":15655,"endOffset":15733,"count":9},{"startOffset":15733,"endOffset":16268,"count":23},{"startOffset":15931,"endOffset":15957,"count":21},{"startOffset":16232,"endOffset":16264,"count":0},{"startOffset":16268,"endOffset":16298,"count":32},{"startOffset":16298,"endOffset":16323,"count":2},{"startOffset":16323,"endOffset":16346,"count":30},{"startOffset":16346,"endOffset":16368,"count":32},{"startOffset":16368,"endOffset":16446,"count":30},{"startOffset":16446,"endOffset":16609,"count":2},{"startOffset":16508,"endOffset":16554,"count":0},{"startOffset":16609,"endOffset":16637,"count":32},{"startOffset":16637,"endOffset":16953,"count":30},{"startOffset":16909,"endOffset":16923,"count":7},{"startOffset":16931,"endOffset":16949,"count":0},{"startOffset":16953,"endOffset":16975,"count":32},{"startOffset":16975,"endOffset":17038,"count":2},{"startOffset":17038,"endOffset":17054,"count":32}],"isBlockCoverage":true},{"functionName":"onEofChunk","ranges":[{"startOffset":17058,"endOffset":17878,"count":3},{"startOffset":17137,"endOffset":17144,"count":0},{"startOffset":17166,"endOffset":17340,"count":0},{"startOffset":17382,"endOffset":17584,"count":0}],"isBlockCoverage":true},{"functionName":"emitReadable_","ranges":[{"startOffset":18408,"endOffset":19062,"count":3},{"startOffset":18981,"endOffset":19000,"count":0},{"startOffset":19001,"endOffset":19043,"count":0}],"isBlockCoverage":true},{"functionName":"maybeReadMore","ranges":[{"startOffset":19412,"endOffset":19589,"count":20},{"startOffset":19477,"endOffset":19497,"count":18},{"startOffset":19499,"endOffset":19587,"count":18}],"isBlockCoverage":true},{"functionName":"maybeReadMore_","ranges":[{"startOffset":19591,"endOffset":21383,"count":18},{"startOffset":21121,"endOffset":21171,"count":0}],"isBlockCoverage":true},{"functionName":"Readable.on","ranges":[{"startOffset":27732,"endOffset":28639,"count":810},{"startOffset":27864,"endOffset":28196,"count":6},{"startOffset":28196,"endOffset":28622,"count":804},{"startOffset":28225,"endOffset":28622,"count":0}],"isBlockCoverage":true},{"functionName":"Readable.removeListener","ranges":[{"startOffset":28734,"endOffset":29299,"count":733},{"startOffset":28896,"endOffset":29282,"count":0}],"isBlockCoverage":true},{"functionName":"Readable.resume","ranges":[{"startOffset":30753,"endOffset":31078,"count":18},{"startOffset":30825,"endOffset":31035,"count":5}],"isBlockCoverage":true},{"functionName":"resume","ranges":[{"startOffset":31081,"endOffset":31231,"count":5}],"isBlockCoverage":true},{"functionName":"resume_","ranges":[{"startOffset":31233,"endOffset":31484,"count":5},{"startOffset":31323,"endOffset":31348,"count":3},{"startOffset":31467,"endOffset":31482,"count":0}],"isBlockCoverage":true},{"functionName":"flow","ranges":[{"startOffset":31783,"endOffset":31930,"count":8},{"startOffset":31901,"endOffset":31926,"count":10},{"startOffset":31927,"endOffset":31928,"count":2}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":35427,"endOffset":35816,"count":23}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":35822,"endOffset":35952,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":36473,"endOffset":36539,"count":3}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":37993,"endOffset":38081,"count":3},{"startOffset":38067,"endOffset":38074,"count":0}],"isBlockCoverage":true},{"functionName":"fromList","ranges":[{"startOffset":38755,"endOffset":39317,"count":2},{"startOffset":38838,"endOffset":38850,"count":0},{"startOffset":38891,"endOffset":38918,"count":0},{"startOffset":39025,"endOffset":39053,"count":0},{"startOffset":39127,"endOffset":39183,"count":0},{"startOffset":39213,"endOffset":39300,"count":0}],"isBlockCoverage":true},{"functionName":"endReadable","ranges":[{"startOffset":39319,"endOffset":39540,"count":3}],"isBlockCoverage":true},{"functionName":"endReadableNT","ranges":[{"startOffset":39542,"endOffset":40467,"count":3},{"startOffset":39868,"endOffset":39901,"count":0},{"startOffset":39903,"endOffset":39957,"count":0},{"startOffset":40189,"endOffset":40394,"count":0}],"isBlockCoverage":true}]},{"scriptId":"59","url":"node:internal/streams/legacy","functions":[{"functionName":"Stream","ranges":[{"startOffset":112,"endOffset":160,"count":62}],"isBlockCoverage":true}]},{"scriptId":"61","url":"node:internal/streams/buffer_list","functions":[{"functionName":"BufferList","ranges":[{"startOffset":254,"endOffset":338,"count":31}],"isBlockCoverage":true},{"functionName":"push","ranges":[{"startOffset":342,"endOffset":529,"count":2},{"startOffset":426,"endOffset":449,"count":0}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":926,"endOffset":994,"count":2}],"isBlockCoverage":true},{"functionName":"first","ranges":[{"startOffset":2009,"endOffset":2049,"count":4}],"isBlockCoverage":true}]},{"scriptId":"62","url":"node:internal/streams/state","functions":[{"functionName":"highWaterMarkFrom","ranges":[{"startOffset":142,"endOffset":309,"count":84},{"startOffset":240,"endOffset":263,"count":3},{"startOffset":264,"endOffset":306,"count":81},{"startOffset":300,"endOffset":306,"count":0}],"isBlockCoverage":true},{"functionName":"getDefaultHighWaterMark","ranges":[{"startOffset":311,"endOffset":397,"count":82},{"startOffset":378,"endOffset":382,"count":0}],"isBlockCoverage":true},{"functionName":"getHighWaterMark","ranges":[{"startOffset":399,"endOffset":832,"count":84},{"startOffset":546,"endOffset":758,"count":3},{"startOffset":590,"endOffset":727,"count":0},{"startOffset":758,"endOffset":831,"count":81}],"isBlockCoverage":true}]},{"scriptId":"65","url":"node:internal/streams/writable","functions":[{"functionName":"nop","ranges":[{"startOffset":2397,"endOffset":2414,"count":3}],"isBlockCoverage":true},{"functionName":"WritableState","ranges":[{"startOffset":2460,"endOffset":6983,"count":28},{"startOffset":2855,"endOffset":2898,"count":0},{"startOffset":3449,"endOffset":3485,"count":0}],"isBlockCoverage":true},{"functionName":"resetBuffer","ranges":[{"startOffset":6985,"endOffset":7117,"count":31}],"isBlockCoverage":true},{"functionName":"Writable","ranges":[{"startOffset":7411,"endOffset":8948,"count":28},{"startOffset":8052,"endOffset":8106,"count":0},{"startOffset":8112,"endOffset":8141,"count":0},{"startOffset":8280,"endOffset":8308,"count":0},{"startOffset":8362,"endOffset":8392,"count":0},{"startOffset":8447,"endOffset":8479,"count":0},{"startOffset":8532,"endOffset":8560,"count":0},{"startOffset":8617,"endOffset":8653,"count":0},{"startOffset":8684,"endOffset":8731,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8798,"endOffset":8944,"count":0}],"isBlockCoverage":false},{"functionName":"_write","ranges":[{"startOffset":9406,"endOffset":10750,"count":705},{"startOffset":9531,"endOffset":9593,"count":696},{"startOffset":9593,"endOffset":9829,"count":9},{"startOffset":9626,"endOffset":9659,"count":0},{"startOffset":9734,"endOffset":9775,"count":0},{"startOffset":9816,"endOffset":9825,"count":3},{"startOffset":9853,"endOffset":9898,"count":0},{"startOffset":10007,"endOffset":10091,"count":0},{"startOffset":10097,"endOffset":10400,"count":0},{"startOffset":10437,"endOffset":10486,"count":0},{"startOffset":10513,"endOffset":10563,"count":0},{"startOffset":10576,"endOffset":10667,"count":0}],"isBlockCoverage":true},{"functionName":"Writable.write","ranges":[{"startOffset":10779,"endOffset":10865,"count":705}],"isBlockCoverage":true},{"functionName":"Writable.cork","ranges":[{"startOffset":10894,"endOffset":10940,"count":3}],"isBlockCoverage":true},{"functionName":"Writable.uncork","ranges":[{"startOffset":10971,"endOffset":11126,"count":3}],"isBlockCoverage":true},{"functionName":"writeOrBuffer","ranges":[{"startOffset":11684,"endOffset":12697,"count":705},{"startOffset":11782,"endOffset":11785,"count":0},{"startOffset":12004,"endOffset":12027,"count":0},{"startOffset":12065,"endOffset":12081,"count":696},{"startOffset":12082,"endOffset":12103,"count":696},{"startOffset":12105,"endOffset":12337,"count":9},{"startOffset":12188,"endOffset":12212,"count":3},{"startOffset":12214,"endOffset":12253,"count":3},{"startOffset":12276,"endOffset":12295,"count":6},{"startOffset":12297,"endOffset":12333,"count":3},{"startOffset":12337,"endOffset":12528,"count":696}],"isBlockCoverage":true},{"functionName":"doWrite","ranges":[{"startOffset":12699,"endOffset":13077,"count":3},{"startOffset":12885,"endOffset":12934,"count":0},{"startOffset":12995,"endOffset":13053,"count":0}],"isBlockCoverage":true},{"functionName":"onwrite","ranges":[{"startOffset":13466,"endOffset":15105,"count":699},{"startOffset":13624,"endOffset":13698,"count":0},{"startOffset":13816,"endOffset":14372,"count":0},{"startOffset":14433,"endOffset":14474,"count":0},{"startOffset":14490,"endOffset":15046,"count":696},{"startOffset":14789,"endOffset":14836,"count":608},{"startOffset":14838,"endOffset":14889,"count":608},{"startOffset":14889,"endOffset":15040,"count":88},{"startOffset":15046,"endOffset":15099,"count":3}],"isBlockCoverage":true},{"functionName":"afterWriteTick","ranges":[{"startOffset":15107,"endOffset":15246,"count":87}],"isBlockCoverage":true},{"functionName":"afterWrite","ranges":[{"startOffset":15248,"endOffset":15623,"count":90},{"startOffset":15414,"endOffset":15474,"count":0},{"startOffset":15498,"endOffset":15536,"count":698},{"startOffset":15561,"endOffset":15590,"count":0}],"isBlockCoverage":true},{"functionName":"clearBuffer","ranges":[{"startOffset":16284,"endOffset":17778,"count":3},{"startOffset":16427,"endOffset":16444,"count":0},{"startOffset":16585,"endOffset":16602,"count":0},{"startOffset":16788,"endOffset":16793,"count":0},{"startOffset":17065,"endOffset":17075,"count":0},{"startOffset":17076,"endOffset":17092,"count":0},{"startOffset":17270,"endOffset":17742,"count":0}],"isBlockCoverage":true},{"functionName":"callback","ranges":[{"startOffset":16796,"endOffset":16905,"count":3},{"startOffset":16855,"endOffset":16899,"count":9}],"isBlockCoverage":true},{"functionName":"needFinish","ranges":[{"startOffset":19380,"endOffset":19690,"count":90},{"startOffset":19432,"endOffset":19462,"count":0},{"startOffset":19463,"endOffset":19494,"count":0},{"startOffset":19495,"endOffset":19522,"count":0},{"startOffset":19523,"endOffset":19563,"count":0},{"startOffset":19564,"endOffset":19592,"count":0},{"startOffset":19593,"endOffset":19620,"count":0},{"startOffset":19621,"endOffset":19653,"count":0},{"startOffset":19654,"endOffset":19686,"count":0}],"isBlockCoverage":true},{"functionName":"finishMaybe","ranges":[{"startOffset":21364,"endOffset":21676,"count":90},{"startOffset":21433,"endOffset":21674,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":22813,"endOffset":23205,"count":14}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":24438,"endOffset":24515,"count":3}],"isBlockCoverage":true}]},{"scriptId":"68","url":"node:internal/streams/transform","functions":[{"functionName":"Transform","ranges":[{"startOffset":3919,"endOffset":5745,"count":25},{"startOffset":3989,"endOffset":4019,"count":0},{"startOffset":4294,"endOffset":4300,"count":0},{"startOffset":4337,"endOffset":4962,"count":0},{"startOffset":5289,"endOffset":5325,"count":0},{"startOffset":5378,"endOffset":5406,"count":0}],"isBlockCoverage":true}]},{"scriptId":"73","url":"node:internal/perf/observe","functions":[{"functionName":"getObserverType","ranges":[{"startOffset":2658,"endOffset":2998,"count":7},{"startOffset":2713,"endOffset":2762,"count":0},{"startOffset":2767,"endOffset":2822,"count":0},{"startOffset":2827,"endOffset":2880,"count":3},{"startOffset":2885,"endOffset":2936,"count":2},{"startOffset":2941,"endOffset":2992,"count":2}],"isBlockCoverage":true},{"functionName":"hasObserver","ranges":[{"startOffset":12337,"endOffset":12456,"count":7}],"isBlockCoverage":true}]},{"scriptId":"76","url":"node:internal/perf/performance","functions":[{"functionName":"refreshTimeOrigin","ranges":[{"startOffset":4727,"endOffset":4931,"count":1}],"isBlockCoverage":true}]},{"scriptId":"81","url":"node:internal/process/execution","functions":[{"functionName":"tryGetCwd","ranges":[{"startOffset":609,"endOffset":939,"count":1},{"startOffset":670,"endOffset":937,"count":0}],"isBlockCoverage":true}]},{"scriptId":"83","url":"node:fs","functions":[{"functionName":"isFileType","ranges":[{"startOffset":5233,"endOffset":5493,"count":16715},{"startOffset":5432,"endOffset":5452,"count":1130}],"isBlockCoverage":true},{"functionName":"tryStatSync","ranges":[{"startOffset":10374,"endOffset":10604,"count":879},{"startOffset":10517,"endOffset":10529,"count":0},{"startOffset":10531,"endOffset":10586,"count":0}],"isBlockCoverage":true},{"functionName":"tryCreateBuffer","ranges":[{"startOffset":10606,"endOffset":10917,"count":879},{"startOffset":10724,"endOffset":10776,"count":0},{"startOffset":10863,"endOffset":10875,"count":0},{"startOffset":10877,"endOffset":10894,"count":0}],"isBlockCoverage":true},{"functionName":"tryReadSync","ranges":[{"startOffset":10919,"endOffset":11174,"count":879},{"startOffset":11117,"endOffset":11129,"count":0},{"startOffset":11131,"endOffset":11148,"count":0}],"isBlockCoverage":true},{"functionName":"readFileSync","ranges":[{"startOffset":11398,"endOffset":12796,"count":1046},{"startOffset":11567,"endOffset":11573,"count":0},{"startOffset":11702,"endOffset":11712,"count":879},{"startOffset":11713,"endOffset":11716,"count":0},{"startOffset":11846,"endOffset":11869,"count":0},{"startOffset":11869,"endOffset":12121,"count":879},{"startOffset":12121,"endOffset":12490,"count":0},{"startOffset":12490,"endOffset":12550,"count":879},{"startOffset":12550,"endOffset":12646,"count":0},{"startOffset":12646,"endOffset":12708,"count":879},{"startOffset":12668,"endOffset":12708,"count":0},{"startOffset":12708,"endOffset":12734,"count":879},{"startOffset":12734,"endOffset":12777,"count":876},{"startOffset":12777,"endOffset":12795,"count":879}],"isBlockCoverage":true},{"functionName":"closeSync","ranges":[{"startOffset":13341,"endOffset":13481,"count":880}],"isBlockCoverage":true},{"functionName":"openSync","ranges":[{"startOffset":14473,"endOffset":14869,"count":1047}],"isBlockCoverage":true},{"functionName":"readSync","ranges":[{"startOffset":17538,"endOffset":18539,"count":879},{"startOffset":17680,"endOffset":17886,"count":0},{"startOffset":17910,"endOffset":17931,"count":0},{"startOffset":18022,"endOffset":18041,"count":0},{"startOffset":18074,"endOffset":18204,"count":0}],"isBlockCoverage":true},{"functionName":"writeSync","ranges":[{"startOffset":22440,"endOffset":23582,"count":1},{"startOffset":22671,"endOffset":22821,"count":0},{"startOffset":22901,"endOffset":22926,"count":0},{"startOffset":23026,"endOffset":23062,"count":0},{"startOffset":23253,"endOffset":23532,"count":0}],"isBlockCoverage":true},{"functionName":"hasNoEntryError","ranges":[{"startOffset":38577,"endOffset":38792,"count":1792},{"startOffset":38626,"endOffset":38709,"count":3},{"startOffset":38709,"endOffset":38728,"count":1789},{"startOffset":38728,"endOffset":38773,"count":0},{"startOffset":38773,"endOffset":38791,"count":1789}],"isBlockCoverage":true},{"functionName":"statSync","ranges":[{"startOffset":40094,"endOffset":40515,"count":1792},{"startOffset":40418,"endOffset":40445,"count":3},{"startOffset":40445,"endOffset":40514,"count":1789}],"isBlockCoverage":true},{"functionName":"writeFileSync","ranges":[{"startOffset":57984,"endOffset":58694,"count":1},{"startOffset":58252,"endOffset":58261,"count":0},{"startOffset":58297,"endOffset":58303,"count":0},{"startOffset":58388,"endOffset":58394,"count":0}],"isBlockCoverage":true},{"functionName":"splitRoot","ranges":[{"startOffset":64109,"endOffset":64319,"count":1092},{"startOffset":64176,"endOffset":64299,"count":2184},{"startOffset":64254,"endOffset":64293,"count":1092},{"startOffset":64299,"endOffset":64318,"count":0}],"isBlockCoverage":true},{"functionName":"encodeRealpathResult","ranges":[{"startOffset":64324,"endOffset":64611,"count":1092},{"startOffset":64409,"endOffset":64439,"count":0},{"startOffset":64459,"endOffset":64610,"count":0}],"isBlockCoverage":true},{"functionName":"nextPart","ranges":[{"startOffset":65017,"endOffset":65092,"count":8483}],"isBlockCoverage":true},{"functionName":"realpathSync","ranges":[{"startOffset":65266,"endOffset":69178,"count":1980},{"startOffset":65390,"endOffset":65408,"count":0},{"startOffset":65569,"endOffset":65604,"count":888},{"startOffset":65604,"endOffset":66166,"count":1092},{"startOffset":66166,"endOffset":66338,"count":0},{"startOffset":66338,"endOffset":66475,"count":1092},{"startOffset":66475,"endOffset":69105,"count":8483},{"startOffset":66587,"endOffset":66718,"count":1092},{"startOffset":66718,"endOffset":66876,"count":7391},{"startOffset":66993,"endOffset":67146,"count":7353},{"startOffset":67100,"endOffset":67124,"count":0},{"startOffset":67146,"endOffset":67212,"count":1130},{"startOffset":67249,"endOffset":67298,"count":0},{"startOffset":67298,"endOffset":68602,"count":1130},{"startOffset":67738,"endOffset":68522,"count":0},{"startOffset":68566,"endOffset":68596,"count":0},{"startOffset":68602,"endOffset":68917,"count":0},{"startOffset":68919,"endOffset":69101,"count":0},{"startOffset":69105,"endOffset":69119,"count":1092}],"isBlockCoverage":true},{"functionName":"lazyLoadStreams","ranges":[{"startOffset":77838,"endOffset":78029,"count":12},{"startOffset":77886,"endOffset":78027,"count":1}],"isBlockCoverage":true},{"functionName":"get ReadStream","ranges":[{"startOffset":80244,"endOffset":80312,"count":3}],"isBlockCoverage":true},{"functionName":"get WriteStream","ranges":[{"startOffset":80369,"endOffset":80439,"count":3}],"isBlockCoverage":true},{"functionName":"get FileReadStream","ranges":[{"startOffset":80631,"endOffset":80707,"count":3}],"isBlockCoverage":true},{"functionName":"get FileWriteStream","ranges":[{"startOffset":80772,"endOffset":80850,"count":3}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":81453,"endOffset":81549,"count":3}],"isBlockCoverage":true}]},{"scriptId":"84","url":"node:internal/fs/utils","functions":[{"functionName":"assertEncoding","ranges":[{"startOffset":3564,"endOffset":3764,"count":3023},{"startOffset":3615,"endOffset":3646,"count":1043},{"startOffset":3648,"endOffset":3762,"count":0}],"isBlockCoverage":true},{"functionName":"getOptions","ranges":[{"startOffset":7259,"endOffset":7884,"count":3944},{"startOffset":7343,"endOffset":7375,"count":3023},{"startOffset":7377,"endOffset":7409,"count":921},{"startOffset":7409,"endOffset":7446,"count":3023},{"startOffset":7446,"endOffset":7564,"count":1043},{"startOffset":7564,"endOffset":7686,"count":1980},{"startOffset":7603,"endOffset":7686,"count":0},{"startOffset":7686,"endOffset":7800,"count":3023},{"startOffset":7800,"endOffset":7864,"count":0},{"startOffset":7864,"endOffset":7883,"count":3023}],"isBlockCoverage":true},{"functionName":"handleErrorFromBinding","ranges":[{"startOffset":7942,"endOffset":8471,"count":5726},{"startOffset":8012,"endOffset":8147,"count":167},{"startOffset":8147,"endOffset":8179,"count":5559},{"startOffset":8179,"endOffset":8469,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8612,"endOffset":9201,"count":5736},{"startOffset":8842,"endOffset":8862,"count":0},{"startOffset":8932,"endOffset":9000,"count":0},{"startOffset":9019,"endOffset":9200,"count":0}],"isBlockCoverage":true},{"functionName":"StatsBase","ranges":[{"startOffset":9944,"endOffset":10251,"count":1792}],"isBlockCoverage":true},{"functionName":"StatsBase.isDirectory","ranges":[{"startOffset":10287,"endOffset":10344,"count":1789}],"isBlockCoverage":true},{"functionName":"StatsBase.isFile","ranges":[{"startOffset":10376,"endOffset":10433,"count":1786}],"isBlockCoverage":true},{"functionName":"msFromTimeSpec","ranges":[{"startOffset":11032,"endOffset":11114,"count":7156}],"isBlockCoverage":true},{"functionName":"dateFromMs","ranges":[{"startOffset":11548,"endOffset":11612,"count":7168}],"isBlockCoverage":true},{"functionName":"Stats","ranges":[{"startOffset":12784,"endOffset":13326,"count":1792}],"isBlockCoverage":true},{"functionName":"Stats._checkModeProperty","ranges":[{"startOffset":13667,"endOffset":13897,"count":3575},{"startOffset":13704,"endOffset":13782,"count":0},{"startOffset":13784,"endOffset":13851,"count":0}],"isBlockCoverage":true},{"functionName":"getStatsFromBinding","ranges":[{"startOffset":14016,"endOffset":15094,"count":1789},{"startOffset":14097,"endOffset":14622,"count":0}],"isBlockCoverage":true},{"functionName":"stringToFlags","ranges":[{"startOffset":15096,"endOffset":16352,"count":1964},{"startOffset":15177,"endOffset":15232,"count":0},{"startOffset":15255,"endOffset":15281,"count":0},{"startOffset":15306,"endOffset":15333,"count":1963},{"startOffset":15338,"endOffset":15349,"count":0},{"startOffset":15371,"endOffset":15408,"count":0},{"startOffset":15413,"endOffset":15439,"count":0},{"startOffset":15444,"endOffset":15456,"count":0},{"startOffset":15478,"endOffset":15514,"count":0},{"startOffset":15520,"endOffset":15567,"count":1},{"startOffset":15572,"endOffset":15583,"count":0},{"startOffset":15605,"endOffset":15662,"count":0},{"startOffset":15668,"endOffset":15714,"count":0},{"startOffset":15719,"endOffset":15730,"count":0},{"startOffset":15752,"endOffset":15807,"count":0},{"startOffset":15813,"endOffset":15861,"count":0},{"startOffset":15866,"endOffset":15877,"count":0},{"startOffset":15899,"endOffset":15957,"count":0},{"startOffset":15962,"endOffset":15973,"count":0},{"startOffset":15995,"endOffset":16053,"count":0},{"startOffset":16059,"endOffset":16106,"count":0},{"startOffset":16111,"endOffset":16122,"count":0},{"startOffset":16144,"endOffset":16200,"count":0},{"startOffset":16205,"endOffset":16216,"count":0},{"startOffset":16238,"endOffset":16294,"count":0},{"startOffset":16298,"endOffset":16351,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17329,"endOffset":17708,"count":879},{"startOffset":17385,"endOffset":17452,"count":0},{"startOffset":17473,"endOffset":17540,"count":0},{"startOffset":17581,"endOffset":17704,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17766,"endOffset":18170,"count":1},{"startOffset":17829,"endOffset":17908,"count":0},{"startOffset":17948,"endOffset":18036,"count":0},{"startOffset":18058,"endOffset":18125,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18212,"endOffset":18482,"count":5736},{"startOffset":18274,"endOffset":18296,"count":0},{"startOffset":18298,"endOffset":18384,"count":0},{"startOffset":18460,"endOffset":18480,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18527,"endOffset":18662,"count":3756}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18705,"endOffset":18826,"count":1760},{"startOffset":18756,"endOffset":18775,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":23877,"endOffset":24249,"count":1},{"startOffset":23948,"endOffset":24010,"count":0},{"startOffset":24011,"endOffset":24055,"count":0},{"startOffset":24056,"endOffset":24112,"count":0},{"startOffset":24117,"endOffset":24248,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":24549,"endOffset":25019,"count":879},{"startOffset":24649,"endOffset":25017,"count":0}],"isBlockCoverage":true}]},{"scriptId":"89","url":"node:internal/v8/startup_snapshot","functions":[{"functionName":"isBuildingSnapshot","ranges":[{"startOffset":373,"endOffset":534,"count":1}],"isBlockCoverage":true},{"functionName":"runDeserializeCallbacks","ranges":[{"startOffset":728,"endOffset":901,"count":1},{"startOffset":807,"endOffset":899,"count":0}],"isBlockCoverage":true}]},{"scriptId":"91","url":"node:internal/stream_base_commons","functions":[{"functionName":"","ranges":[{"startOffset":1007,"endOffset":1032,"count":1}],"isBlockCoverage":true},{"functionName":"handleWriteReq","ranges":[{"startOffset":1151,"endOffset":2006,"count":696},{"startOffset":1251,"endOffset":1418,"count":0},{"startOffset":1423,"endOffset":1437,"count":0},{"startOffset":1442,"endOffset":1506,"count":0},{"startOffset":1594,"endOffset":1656,"count":0},{"startOffset":1661,"endOffset":1673,"count":0},{"startOffset":1678,"endOffset":1691,"count":0},{"startOffset":1696,"endOffset":1711,"count":0},{"startOffset":1716,"endOffset":1780,"count":0},{"startOffset":1785,"endOffset":2000,"count":0}],"isBlockCoverage":true},{"functionName":"onWriteComplete","ranges":[{"startOffset":2008,"endOffset":2693,"count":3},{"startOffset":2161,"endOffset":2250,"count":0},{"startOffset":2379,"endOffset":2561,"count":0}],"isBlockCoverage":true},{"functionName":"createWriteWrap","ranges":[{"startOffset":2695,"endOffset":2933,"count":699}],"isBlockCoverage":true},{"functionName":"writevGeneric","ranges":[{"startOffset":2935,"endOffset":3574,"count":3},{"startOffset":3096,"endOffset":3193,"count":0},{"startOffset":3285,"endOffset":3398,"count":9}],"isBlockCoverage":true},{"functionName":"writeGeneric","ranges":[{"startOffset":3576,"endOffset":3781,"count":696}],"isBlockCoverage":true},{"functionName":"afterWriteDispatched","ranges":[{"startOffset":3783,"endOffset":4086,"count":699},{"startOffset":3950,"endOffset":4001,"count":0},{"startOffset":4020,"endOffset":4057,"count":696},{"startOffset":4059,"endOffset":4084,"count":696}],"isBlockCoverage":true},{"functionName":"onStreamRead","ranges":[{"startOffset":4088,"endOffset":6019,"count":12},{"startOffset":4389,"endOffset":4648,"count":0},{"startOffset":4832,"endOffset":5019,"count":0},{"startOffset":5040,"endOffset":6017,"count":0}],"isBlockCoverage":true},{"functionName":"setStreamTimeout","ranges":[{"startOffset":6021,"endOffset":6807,"count":2},{"startOffset":6092,"endOffset":6104,"count":0},{"startOffset":6444,"endOffset":6533,"count":0},{"startOffset":6537,"endOffset":6790,"count":0}],"isBlockCoverage":true}]},{"scriptId":"92","url":"node:internal/options","functions":[{"functionName":"getCLIOptionsFromBinding","ranges":[{"startOffset":464,"endOffset":598,"count":2030},{"startOffset":521,"endOffset":575,"count":1}],"isBlockCoverage":true},{"functionName":"getEmbedderOptions","ranges":[{"startOffset":733,"endOffset":877,"count":2},{"startOffset":789,"endOffset":849,"count":1}],"isBlockCoverage":true},{"functionName":"refreshOptions","ranges":[{"startOffset":879,"endOffset":960,"count":1}],"isBlockCoverage":true},{"functionName":"getOptionValue","ranges":[{"startOffset":962,"endOffset":1228,"count":2030},{"startOffset":1084,"endOffset":1185,"count":4},{"startOffset":1185,"endOffset":1225,"count":2026}],"isBlockCoverage":true},{"functionName":"getAllowUnauthorized","ranges":[{"startOffset":1230,"endOffset":1695,"count":2},{"startOffset":1367,"endOffset":1393,"count":0},{"startOffset":1395,"endOffset":1665,"count":0}],"isBlockCoverage":true}]},{"scriptId":"93","url":"node:vm","functions":[{"functionName":"compileFunction","ranges":[{"startOffset":9621,"endOffset":11910,"count":172},{"startOffset":10331,"endOffset":10380,"count":0},{"startOffset":10484,"endOffset":10745,"count":0},{"startOffset":11207,"endOffset":11280,"count":0},{"startOffset":11307,"endOffset":11364,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9845,"endOffset":9896,"count":860}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10854,"endOffset":10986,"count":0}],"isBlockCoverage":false},{"functionName":"importModuleDynamically","ranges":[{"startOffset":11835,"endOffset":11868,"count":0}],"isBlockCoverage":false}]},{"scriptId":"96","url":"node:internal/bootstrap/switches/is_main_thread","functions":[{"functionName":"createWritableStdioStream","ranges":[{"startOffset":1386,"endOffset":2985,"count":1},{"startOffset":1538,"endOffset":1672,"count":0},{"startOffset":1678,"endOffset":1872,"count":0},{"startOffset":2179,"endOffset":2207,"count":0},{"startOffset":2209,"endOffset":2429,"count":0},{"startOffset":2611,"endOffset":2864,"count":0}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":2801,"endOffset":2848,"count":0}],"isBlockCoverage":false},{"functionName":"addCleanup","ranges":[{"startOffset":3598,"endOffset":3689,"count":1},{"startOffset":3652,"endOffset":3687,"count":0}],"isBlockCoverage":true},{"functionName":"getStdout","ranges":[{"startOffset":3691,"endOffset":4383,"count":1},{"startOffset":3728,"endOffset":3742,"count":0},{"startOffset":3976,"endOffset":4034,"count":0}],"isBlockCoverage":true},{"functionName":"cleanupStdout","ranges":[{"startOffset":4049,"endOffset":4227,"count":0}],"isBlockCoverage":false}]},{"scriptId":"97","url":"node:internal/process/signal","functions":[{"functionName":"isSignal","ranges":[{"startOffset":238,"endOffset":334,"count":2}],"isBlockCoverage":true},{"functionName":"startListeningIfSignal","ranges":[{"startOffset":398,"endOffset":904,"count":2},{"startOffset":459,"endOffset":484,"count":0},{"startOffset":486,"endOffset":902,"count":0}],"isBlockCoverage":true},{"functionName":"stopListeningIfSignal","ranges":[{"startOffset":906,"endOffset":1101,"count":1},{"startOffset":1008,"endOffset":1044,"count":0},{"startOffset":1046,"endOffset":1099,"count":0}],"isBlockCoverage":true}]},{"scriptId":"98","url":"node:internal/bootstrap/switches/does_own_process_state","functions":[{"functionName":"wrappedCwd","ranges":[{"startOffset":3322,"endOffset":3425,"count":3},{"startOffset":3374,"endOffset":3403,"count":1}],"isBlockCoverage":true}]},{"scriptId":"99","url":"node:internal/main/run_main_module","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":769,"count":1}],"isBlockCoverage":true}]},{"scriptId":"100","url":"node:internal/bootstrap/pre_execution","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":19114,"count":1}],"isBlockCoverage":true},{"functionName":"prepareMainThreadExecution","ranges":[{"startOffset":611,"endOffset":2795,"count":1},{"startOffset":2561,"endOffset":2578,"count":0}],"isBlockCoverage":true},{"functionName":"refreshRuntimeOptions","ranges":[{"startOffset":2797,"endOffset":2853,"count":1}],"isBlockCoverage":true},{"functionName":"patchProcessObject","ranges":[{"startOffset":2855,"endOffset":4965,"count":1},{"startOffset":3634,"endOffset":3686,"count":0}],"isBlockCoverage":true},{"functionName":"addReadOnlyProcessAlias","ranges":[{"startOffset":4967,"endOffset":5247,"count":13},{"startOffset":5088,"endOffset":5245,"count":1}],"isBlockCoverage":true},{"functionName":"setupWarningHandler","ranges":[{"startOffset":5249,"endOffset":5474,"count":1}],"isBlockCoverage":true},{"functionName":"setupFetch","ranges":[{"startOffset":5510,"endOffset":5985,"count":1},{"startOffset":5598,"endOffset":5984,"count":0}],"isBlockCoverage":true},{"functionName":"setupWebCrypto","ranges":[{"startOffset":6091,"endOffset":7306,"count":1},{"startOffset":6252,"endOffset":7304,"count":0}],"isBlockCoverage":true},{"functionName":"get crypto","ranges":[{"startOffset":6419,"endOffset":6591,"count":0}],"isBlockCoverage":false},{"functionName":"setupCustomEvent","ranges":[{"startOffset":7414,"endOffset":7700,"count":1},{"startOffset":7579,"endOffset":7699,"count":0}],"isBlockCoverage":true},{"functionName":"setupCoverageHooks","ranges":[{"startOffset":7812,"endOffset":8489,"count":1},{"startOffset":8282,"endOffset":8459,"count":0}],"isBlockCoverage":true},{"functionName":"setupStacktracePrinterOnSigint","ranges":[{"startOffset":8491,"endOffset":8716,"count":1},{"startOffset":8593,"endOffset":8715,"count":0}],"isBlockCoverage":true},{"functionName":"initializeReport","ranges":[{"startOffset":8718,"endOffset":8962,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":8920,"endOffset":8954,"count":0}],"isBlockCoverage":false},{"functionName":"setupDebugEnv","ranges":[{"startOffset":8964,"endOffset":9197,"count":1},{"startOffset":9115,"endOffset":9195,"count":0}],"isBlockCoverage":true},{"functionName":"initializeReportSignalHandlers","ranges":[{"startOffset":9259,"endOffset":9394,"count":1}],"isBlockCoverage":true},{"functionName":"initializeHeapSnapshotSignalHandlers","ranges":[{"startOffset":9396,"endOffset":9703,"count":1},{"startOffset":9531,"endOffset":9702,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9663,"endOffset":9699,"count":0}],"isBlockCoverage":false},{"functionName":"setupTraceCategoryState","ranges":[{"startOffset":9705,"endOffset":9964,"count":1}],"isBlockCoverage":true},{"functionName":"setupPerfHooks","ranges":[{"startOffset":9966,"endOffset":10109,"count":1}],"isBlockCoverage":true},{"functionName":"setupInspectorHooks","ranges":[{"startOffset":10111,"endOffset":10692,"count":1}],"isBlockCoverage":true},{"functionName":"initializeDeprecations","ranges":[{"startOffset":10887,"endOffset":13482,"count":1},{"startOffset":11599,"endOffset":11901,"count":16},{"startOffset":11644,"endOffset":11876,"count":0},{"startOffset":12218,"endOffset":12414,"count":0},{"startOffset":12442,"endOffset":12836,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":13110,"endOffset":13146,"count":10}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":13152,"endOffset":13194,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":13345,"endOffset":13380,"count":462}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":13386,"endOffset":13427,"count":0}],"isBlockCoverage":false},{"functionName":"setupChildProcessIpcChannel","ranges":[{"startOffset":13484,"endOffset":14049,"count":1},{"startOffset":13560,"endOffset":14047,"count":0}],"isBlockCoverage":true},{"functionName":"initializeClusterIPC","ranges":[{"startOffset":14051,"endOffset":14321,"count":1},{"startOffset":14138,"endOffset":14319,"count":0}],"isBlockCoverage":true},{"functionName":"initializePolicy","ranges":[{"startOffset":14323,"endOffset":16146,"count":1},{"startOffset":14449,"endOffset":16144,"count":0}],"isBlockCoverage":true},{"functionName":"initializeWASI","ranges":[{"startOffset":16148,"endOffset":16379,"count":1}],"isBlockCoverage":true},{"functionName":"initializeCJSLoader","ranges":[{"startOffset":16381,"endOffset":16724,"count":1}],"isBlockCoverage":true},{"functionName":"initializeESMLoader","ranges":[{"startOffset":16726,"endOffset":17842,"count":1},{"startOffset":16956,"endOffset":16963,"count":0},{"startOffset":17595,"endOffset":17840,"count":0}],"isBlockCoverage":true},{"functionName":"initializeSourceMapsHandlers","ranges":[{"startOffset":17844,"endOffset":18030,"count":1}],"isBlockCoverage":true},{"functionName":"initializeFrozenIntrinsics","ranges":[{"startOffset":18032,"endOffset":18289,"count":1},{"startOffset":18117,"endOffset":18287,"count":0}],"isBlockCoverage":true},{"functionName":"loadPreloadModules","ranges":[{"startOffset":18291,"endOffset":18638,"count":1},{"startOffset":18485,"endOffset":18636,"count":0}],"isBlockCoverage":true}]},{"scriptId":"101","url":"node:internal/inspector_async_hook","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1972,"count":1}],"isBlockCoverage":false},{"functionName":"lazyHookCreation","ranges":[{"startOffset":75,"endOffset":1257,"count":0}],"isBlockCoverage":false},{"functionName":"enable","ranges":[{"startOffset":1259,"endOffset":1840,"count":0}],"isBlockCoverage":false},{"functionName":"disable","ranges":[{"startOffset":1842,"endOffset":1928,"count":0}],"isBlockCoverage":false}]},{"scriptId":"102","url":"node:internal/source_map/source_map_cache","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9046,"count":1}],"isBlockCoverage":false},{"functionName":"ObjectGetValueSafe","ranges":[{"startOffset":260,"endOffset":438,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":620,"endOffset":645,"count":1}],"isBlockCoverage":true},{"functionName":"getSourceMapsEnabled","ranges":[{"startOffset":1639,"endOffset":1813,"count":1089},{"startOffset":1712,"endOffset":1783,"count":1}],"isBlockCoverage":true},{"functionName":"setSourceMapsEnabled","ranges":[{"startOffset":1815,"endOffset":2459,"count":1},{"startOffset":2026,"endOffset":2180,"count":0},{"startOffset":2223,"endOffset":2429,"count":0}],"isBlockCoverage":true},{"functionName":"maybeCacheSourceMap","ranges":[{"startOffset":2461,"endOffset":3717,"count":1089},{"startOffset":2638,"endOffset":2658,"count":0},{"startOffset":2661,"endOffset":2668,"count":0},{"startOffset":2728,"endOffset":2852,"count":0},{"startOffset":2983,"endOffset":3715,"count":871},{"startOffset":3077,"endOffset":3083,"count":704},{"startOffset":3084,"endOffset":3115,"count":167},{"startOffset":3144,"endOffset":3297,"count":171},{"startOffset":3297,"endOffset":3711,"count":700},{"startOffset":3326,"endOffset":3458,"count":0}],"isBlockCoverage":true},{"functionName":"maybeCacheGeneratedSourceMap","ranges":[{"startOffset":3719,"endOffset":4461,"count":0}],"isBlockCoverage":false},{"functionName":"dataFromUrl","ranges":[{"startOffset":4526,"endOffset":5046,"count":871},{"startOffset":4663,"endOffset":4738,"count":0},{"startOffset":4745,"endOffset":4825,"count":0}],"isBlockCoverage":true},{"functionName":"lineLengths","ranges":[{"startOffset":5236,"endOffset":5581,"count":871}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5538,"endOffset":5577,"count":97779}],"isBlockCoverage":true},{"functionName":"sourceMapFromFile","ranges":[{"startOffset":5583,"endOffset":5833,"count":871},{"startOffset":5781,"endOffset":5831,"count":167}],"isBlockCoverage":true},{"functionName":"sourceMapFromDataUrl","ranges":[{"startOffset":5927,"endOffset":6598,"count":0}],"isBlockCoverage":false},{"functionName":"sourcesToAbsolute","ranges":[{"startOffset":6783,"endOffset":7110,"count":704}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6861,"endOffset":6967,"count":590}],"isBlockCoverage":true},{"functionName":"sourceMapCacheToObject","ranges":[{"startOffset":7548,"endOffset":7795,"count":0}],"isBlockCoverage":false},{"functionName":"appendCJSCache","ranges":[{"startOffset":7797,"endOffset":8086,"count":0}],"isBlockCoverage":false},{"functionName":"findSourceMap","ranges":[{"startOffset":8088,"endOffset":8908,"count":0}],"isBlockCoverage":false}]},{"scriptId":"103","url":"node:internal/util/iterable_weak_map","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1958,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":399,"endOffset":516,"count":1}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":521,"endOffset":1032,"count":171},{"startOffset":596,"endOffset":800,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1036,"endOffset":1092,"count":0}],"isBlockCoverage":false},{"functionName":"has","ranges":[{"startOffset":1096,"endOffset":1145,"count":0}],"isBlockCoverage":false},{"functionName":"delete","ranges":[{"startOffset":1149,"endOffset":1387,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1391,"endOffset":1816,"count":0}],"isBlockCoverage":false},{"functionName":"cleanup","ranges":[{"startOffset":1820,"endOffset":1873,"count":0}],"isBlockCoverage":false}]},{"scriptId":"104","url":"node:internal/modules/cjs/helpers","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7124,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":928,"endOffset":953,"count":1}],"isBlockCoverage":true},{"functionName":"loadBuiltinModule","ranges":[{"startOffset":1244,"endOffset":1553,"count":184},{"startOffset":1348,"endOffset":1370,"count":12},{"startOffset":1372,"endOffset":1551,"count":12}],"isBlockCoverage":true},{"functionName":"makeRequireFunction","ranges":[{"startOffset":1802,"endOffset":3939,"count":172},{"startOffset":1916,"endOffset":3235,"count":0}],"isBlockCoverage":true},{"functionName":"require","ranges":[{"startOffset":2054,"endOffset":3230,"count":0}],"isBlockCoverage":false},{"functionName":"require","ranges":[{"startOffset":3257,"endOffset":3397,"count":405}],"isBlockCoverage":true},{"functionName":"resolve","ranges":[{"startOffset":3406,"endOffset":3552,"count":0}],"isBlockCoverage":false},{"functionName":"paths","ranges":[{"startOffset":3586,"endOffset":3708,"count":0}],"isBlockCoverage":false},{"functionName":"stripBOM","ranges":[{"startOffset":4124,"endOffset":4279,"count":0}],"isBlockCoverage":false},{"functionName":"addBuiltinLibsToObject","ranges":[{"startOffset":4281,"endOffset":6133,"count":0}],"isBlockCoverage":false},{"functionName":"normalizeReferrerURL","ranges":[{"startOffset":6201,"endOffset":6389,"count":1089},{"startOffset":6308,"endOffset":6354,"count":172},{"startOffset":6354,"endOffset":6388,"count":917}],"isBlockCoverage":true},{"functionName":"hasEsmSyntax","ranges":[{"startOffset":6459,"endOffset":6961,"count":0}],"isBlockCoverage":false}]},{"scriptId":"105","url":"node:internal/process/report","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2545,"count":1}],"isBlockCoverage":false},{"functionName":"writeReport","ranges":[{"startOffset":292,"endOffset":674,"count":0}],"isBlockCoverage":false},{"functionName":"getReport","ranges":[{"startOffset":678,"endOffset":843,"count":0}],"isBlockCoverage":false},{"functionName":"get directory","ranges":[{"startOffset":847,"endOffset":898,"count":0}],"isBlockCoverage":false},{"functionName":"set directory","ranges":[{"startOffset":902,"endOffset":990,"count":0}],"isBlockCoverage":false},{"functionName":"get filename","ranges":[{"startOffset":994,"endOffset":1043,"count":0}],"isBlockCoverage":false},{"functionName":"set filename","ranges":[{"startOffset":1047,"endOffset":1135,"count":0}],"isBlockCoverage":false},{"functionName":"get compact","ranges":[{"startOffset":1139,"endOffset":1186,"count":0}],"isBlockCoverage":false},{"functionName":"set compact","ranges":[{"startOffset":1190,"endOffset":1267,"count":0}],"isBlockCoverage":false},{"functionName":"get signal","ranges":[{"startOffset":1271,"endOffset":1316,"count":0}],"isBlockCoverage":false},{"functionName":"set signal","ranges":[{"startOffset":1320,"endOffset":1457,"count":0}],"isBlockCoverage":false},{"functionName":"get reportOnFatalError","ranges":[{"startOffset":1461,"endOffset":1533,"count":0}],"isBlockCoverage":false},{"functionName":"set reportOnFatalError","ranges":[{"startOffset":1537,"endOffset":1655,"count":0}],"isBlockCoverage":false},{"functionName":"get reportOnSignal","ranges":[{"startOffset":1659,"endOffset":1723,"count":0}],"isBlockCoverage":false},{"functionName":"set reportOnSignal","ranges":[{"startOffset":1727,"endOffset":1888,"count":0}],"isBlockCoverage":false},{"functionName":"get reportOnUncaughtException","ranges":[{"startOffset":1892,"endOffset":1978,"count":0}],"isBlockCoverage":false},{"functionName":"set reportOnUncaughtException","ranges":[{"startOffset":1982,"endOffset":2114,"count":0}],"isBlockCoverage":false},{"functionName":"addSignalHandler","ranges":[{"startOffset":2119,"endOffset":2290,"count":1},{"startOffset":2185,"endOffset":2288,"count":0}],"isBlockCoverage":true},{"functionName":"removeSignalHandler","ranges":[{"startOffset":2292,"endOffset":2416,"count":0}],"isBlockCoverage":false},{"functionName":"signalHandler","ranges":[{"startOffset":2418,"endOffset":2492,"count":0}],"isBlockCoverage":false}]},{"scriptId":"106","url":"node:internal/modules/cjs/loader","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":43312,"count":1}],"isBlockCoverage":false},{"functionName":"get hasLoadedAnyUserCJSModule","ranges":[{"startOffset":2266,"endOffset":2335,"count":1}],"isBlockCoverage":true},{"functionName":"internalRequire","ranges":[{"startOffset":4830,"endOffset":5155,"count":0}],"isBlockCoverage":false},{"functionName":"stat","ranges":[{"startOffset":5157,"endOffset":5567,"count":623},{"startOffset":5255,"endOffset":5349,"count":620},{"startOffset":5331,"endOffset":5345,"count":221},{"startOffset":5349,"endOffset":5422,"count":402},{"startOffset":5422,"endOffset":5436,"count":399},{"startOffset":5438,"endOffset":5548,"count":179},{"startOffset":5548,"endOffset":5566,"count":402}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":5648,"endOffset":5671,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":5675,"endOffset":5770,"count":0}],"isBlockCoverage":false},{"functionName":"updateChildren","ranges":[{"startOffset":5799,"endOffset":5995,"count":405},{"startOffset":5871,"endOffset":5881,"count":401},{"startOffset":5898,"endOffset":5951,"count":401},{"startOffset":5908,"endOffset":5950,"count":231},{"startOffset":5957,"endOffset":5993,"count":401}],"isBlockCoverage":true},{"functionName":"reportModuleToWatchMode","ranges":[{"startOffset":5997,"endOffset":6149,"count":577},{"startOffset":6076,"endOffset":6091,"count":0},{"startOffset":6093,"endOffset":6147,"count":0}],"isBlockCoverage":true},{"functionName":"Module","ranges":[{"startOffset":6196,"endOffset":6929,"count":172},{"startOffset":6494,"endOffset":6504,"count":0},{"startOffset":6506,"endOffset":6877,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7221,"endOffset":7247,"count":65}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7301,"endOffset":7348,"count":1}],"isBlockCoverage":true},{"functionName":"wrap","ranges":[{"startOffset":7660,"endOffset":7737,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":7903,"endOffset":8025,"count":0}],"isBlockCoverage":false},{"functionName":"defineProperty","ranges":[{"startOffset":8030,"endOffset":8163,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":8229,"endOffset":8257,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":8262,"endOffset":8316,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":8385,"endOffset":8421,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":8426,"endOffset":8488,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":8521,"endOffset":8551,"count":0}],"isBlockCoverage":false},{"functionName":"getModuleParent","ranges":[{"startOffset":8711,"endOffset":8779,"count":0}],"isBlockCoverage":false},{"functionName":"setModuleParent","ranges":[{"startOffset":8781,"endOffset":8854,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":9452,"endOffset":9477,"count":1}],"isBlockCoverage":true},{"functionName":"readPackage","ranges":[{"startOffset":9825,"endOffset":10577,"count":1871},{"startOffset":10005,"endOffset":10021,"count":1855},{"startOffset":10021,"endOffset":10119,"count":16},{"startOffset":10119,"endOffset":10125,"count":0},{"startOffset":10126,"endOffset":10141,"count":16},{"startOffset":10169,"endOffset":10235,"count":12},{"startOffset":10235,"endOffset":10460,"count":4},{"startOffset":10460,"endOffset":10575,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":10679,"endOffset":10709,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":10713,"endOffset":10836,"count":0}],"isBlockCoverage":false},{"functionName":"readPackageScope","ranges":[{"startOffset":10865,"endOffset":11409,"count":474},{"startOffset":11000,"endOffset":11346,"count":1855},{"startOffset":11207,"endOffset":11220,"count":0},{"startOffset":11285,"endOffset":11342,"count":474},{"startOffset":11346,"endOffset":11408,"count":0}],"isBlockCoverage":true},{"functionName":"tryPackage","ranges":[{"startOffset":11411,"endOffset":12689,"count":14},{"startOffset":11615,"endOffset":11753,"count":0},{"startOffset":11754,"endOffset":11821,"count":0},{"startOffset":11847,"endOffset":12688,"count":0}],"isBlockCoverage":true},{"functionName":"tryFile","ranges":[{"startOffset":13034,"endOffset":13245,"count":227},{"startOffset":13123,"endOffset":13130,"count":36},{"startOffset":13130,"endOffset":13154,"count":191},{"startOffset":13154,"endOffset":13164,"count":0},{"startOffset":13166,"endOffset":13209,"count":0},{"startOffset":13209,"endOffset":13244,"count":191}],"isBlockCoverage":true},{"functionName":"toRealPath","ranges":[{"startOffset":13247,"endOffset":13378,"count":197}],"isBlockCoverage":true},{"functionName":"tryExtensions","ranges":[{"startOffset":13453,"endOffset":13659,"count":202},{"startOffset":13535,"endOffset":13641,"count":226},{"startOffset":13607,"endOffset":13637,"count":190},{"startOffset":13641,"endOffset":13658,"count":12}],"isBlockCoverage":true},{"functionName":"findLongestRegisteredExtension","ranges":[{"startOffset":13748,"endOffset":14216,"count":172},{"startOffset":14023,"endOffset":14032,"count":0},{"startOffset":14170,"endOffset":14194,"count":169},{"startOffset":14198,"endOffset":14215,"count":3}],"isBlockCoverage":true},{"functionName":"trySelfParentPath","ranges":[{"startOffset":14218,"endOffset":14507,"count":307},{"startOffset":14270,"endOffset":14283,"count":2},{"startOffset":14283,"endOffset":14341,"count":305},{"startOffset":14341,"endOffset":14505,"count":0}],"isBlockCoverage":true},{"functionName":"trySelf","ranges":[{"startOffset":14509,"endOffset":15358,"count":307},{"startOffset":14568,"endOffset":14581,"count":2},{"startOffset":14581,"endOffset":14651,"count":305},{"startOffset":14651,"endOffset":14656,"count":0},{"startOffset":14669,"endOffset":14697,"count":305},{"startOffset":14699,"endOffset":14712,"count":303},{"startOffset":14712,"endOffset":14749,"count":2},{"startOffset":14749,"endOffset":14762,"count":0},{"startOffset":14762,"endOffset":14809,"count":2},{"startOffset":14809,"endOffset":14835,"count":0},{"startOffset":14835,"endOffset":15001,"count":2},{"startOffset":14897,"endOffset":14972,"count":0},{"startOffset":15001,"endOffset":15356,"count":0}],"isBlockCoverage":true},{"functionName":"resolveExports","ranges":[{"startOffset":15519,"endOffset":16237,"count":193},{"startOffset":15726,"endOffset":15741,"count":191},{"startOffset":15760,"endOffset":15767,"count":191},{"startOffset":15767,"endOffset":15869,"count":2},{"startOffset":15879,"endOffset":16235,"count":1},{"startOffset":16082,"endOffset":16231,"count":0}],"isBlockCoverage":true},{"functionName":"Module._findPath","ranges":[{"startOffset":16303,"endOffset":18926,"count":308},{"startOffset":16413,"endOffset":16436,"count":3},{"startOffset":16436,"endOffset":16499,"count":305},{"startOffset":16476,"endOffset":16499,"count":0},{"startOffset":16636,"endOffset":16649,"count":112},{"startOffset":16649,"endOffset":16792,"count":196},{"startOffset":16816,"endOffset":16962,"count":196},{"startOffset":16962,"endOffset":18907,"count":204},{"startOffset":17060,"endOffset":17081,"count":201},{"startOffset":17083,"endOffset":17092,"count":8},{"startOffset":17092,"endOffset":17120,"count":196},{"startOffset":17120,"endOffset":17250,"count":193},{"startOffset":17221,"endOffset":17244,"count":1},{"startOffset":17250,"endOffset":17380,"count":195},{"startOffset":17380,"endOffset":18558,"count":193},{"startOffset":17402,"endOffset":18335,"count":5},{"startOffset":17435,"endOffset":17603,"count":4},{"startOffset":17469,"endOffset":17529,"count":0},{"startOffset":17603,"endOffset":18327,"count":1},{"startOffset":17635,"endOffset":18267,"count":0},{"startOffset":18358,"endOffset":18552,"count":188},{"startOffset":18558,"endOffset":18578,"count":195},{"startOffset":18578,"endOffset":18589,"count":14},{"startOffset":18591,"endOffset":18807,"count":14},{"startOffset":18701,"endOffset":18739,"count":2},{"startOffset":18807,"endOffset":18903,"count":195},{"startOffset":18907,"endOffset":18925,"count":0}],"isBlockCoverage":true},{"functionName":"Module._nodeModulePaths","ranges":[{"startOffset":19170,"endOffset":20686,"count":0}],"isBlockCoverage":false},{"functionName":"Module._nodeModulePaths","ranges":[{"startOffset":20778,"endOffset":21917,"count":174},{"startOffset":21056,"endOffset":21081,"count":0},{"startOffset":21374,"endOffset":21795,"count":14206},{"startOffset":21470,"endOffset":21665,"count":1883},{"startOffset":21507,"endOffset":21624,"count":1709},{"startOffset":21665,"endOffset":21789,"count":12323},{"startOffset":21685,"endOffset":21789,"count":3901},{"startOffset":21720,"endOffset":21746,"count":2192},{"startOffset":21746,"endOffset":21781,"count":1709}],"isBlockCoverage":true},{"functionName":"Module._resolveLookupPaths","ranges":[{"startOffset":21951,"endOffset":23337,"count":307},{"startOffset":22035,"endOffset":22110,"count":0},{"startOffset":22168,"endOffset":22224,"count":0},{"startOffset":22230,"endOffset":22296,"count":0},{"startOffset":22381,"endOffset":22580,"count":303},{"startOffset":22410,"endOffset":22460,"count":299},{"startOffset":22461,"endOffset":22511,"count":177},{"startOffset":22512,"endOffset":22579,"count":0},{"startOffset":22582,"endOffset":22809,"count":4},{"startOffset":22628,"endOffset":22643,"count":2},{"startOffset":22645,"endOffset":22709,"count":2},{"startOffset":22798,"endOffset":22804,"count":0},{"startOffset":22809,"endOffset":22877,"count":303},{"startOffset":22878,"endOffset":22897,"count":303},{"startOffset":22899,"endOffset":23148,"count":0},{"startOffset":23148,"endOffset":23336,"count":303}],"isBlockCoverage":true},{"functionName":"emitCircularRequireWarning","ranges":[{"startOffset":23340,"endOffset":23523,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":23736,"endOffset":24108,"count":0}],"isBlockCoverage":false},{"functionName":"getOwnPropertyDescriptor","ranges":[{"startOffset":24113,"endOffset":24354,"count":0}],"isBlockCoverage":false},{"functionName":"getExportsForCircularRequire","ranges":[{"startOffset":24360,"endOffset":25004,"count":29},{"startOffset":24824,"endOffset":24976,"count":0}],"isBlockCoverage":true},{"functionName":"Module._load","ranges":[{"startOffset":25417,"endOffset":28571,"count":407},{"startOffset":25500,"endOffset":26316,"count":405},{"startOffset":25959,"endOffset":26312,"count":96},{"startOffset":26149,"endOffset":26199,"count":15},{"startOffset":26199,"endOffset":26244,"count":81},{"startOffset":26244,"endOffset":26312,"count":0},{"startOffset":26316,"endOffset":26369,"count":311},{"startOffset":26369,"endOffset":26631,"count":0},{"startOffset":26631,"endOffset":26784,"count":311},{"startOffset":26784,"endOffset":27144,"count":137},{"startOffset":26864,"endOffset":27092,"count":16},{"startOffset":26960,"endOffset":26987,"count":2},{"startOffset":26997,"endOffset":27047,"count":14},{"startOffset":27047,"endOffset":27092,"count":2},{"startOffset":27092,"endOffset":27140,"count":121},{"startOffset":27144,"endOffset":27207,"count":176},{"startOffset":27207,"endOffset":27229,"count":4},{"startOffset":27230,"endOffset":27289,"count":4},{"startOffset":27291,"endOffset":27320,"count":4},{"startOffset":27320,"endOffset":27419,"count":172},{"startOffset":27419,"endOffset":27450,"count":170},{"startOffset":27467,"endOffset":27608,"count":0},{"startOffset":27608,"endOffset":27712,"count":172},{"startOffset":27712,"endOffset":27781,"count":170},{"startOffset":27781,"endOffset":28543,"count":172},{"startOffset":27886,"endOffset":28289,"count":0},{"startOffset":28471,"endOffset":28539,"count":0},{"startOffset":28543,"endOffset":28570,"count":172}],"isBlockCoverage":true},{"functionName":"Module._resolveFilename","ranges":[{"startOffset":28600,"endOffset":31816,"count":311},{"startOffset":28708,"endOffset":28785,"count":0},{"startOffset":28847,"endOffset":28905,"count":4},{"startOffset":28916,"endOffset":28941,"count":4},{"startOffset":28941,"endOffset":28991,"count":307},{"startOffset":28991,"endOffset":29010,"count":0},{"startOffset":29012,"endOffset":30089,"count":0},{"startOffset":30089,"endOffset":30184,"count":307},{"startOffset":30184,"endOffset":30232,"count":0},{"startOffset":30234,"endOffset":30750,"count":0},{"startOffset":30750,"endOffset":30911,"count":307},{"startOffset":30911,"endOffset":31107,"count":0},{"startOffset":31107,"endOffset":31270,"count":307},{"startOffset":31270,"endOffset":31815,"count":0}],"isBlockCoverage":true},{"functionName":"finalizeEsmResolution","ranges":[{"startOffset":31819,"endOffset":32541,"count":1},{"startOffset":31993,"endOffset":32112,"count":0},{"startOffset":32204,"endOffset":32214,"count":0},{"startOffset":32216,"endOffset":32373,"count":0},{"startOffset":32406,"endOffset":32540,"count":0}],"isBlockCoverage":true},{"functionName":"createEsmNotFoundErr","ranges":[{"startOffset":32543,"endOffset":32833,"count":0}],"isBlockCoverage":false},{"functionName":"Module.load","ranges":[{"startOffset":32922,"endOffset":33743,"count":172},{"startOffset":33257,"endOffset":33287,"count":0},{"startOffset":33293,"endOffset":33335,"count":0},{"startOffset":33609,"endOffset":33657,"count":0}],"isBlockCoverage":true},{"functionName":"Module.require","ranges":[{"startOffset":33942,"endOffset":34241,"count":405},{"startOffset":34002,"endOffset":34120,"count":0}],"isBlockCoverage":true},{"functionName":"wrapSafe","ranges":[{"startOffset":34420,"endOffset":35433,"count":172},{"startOffset":34493,"endOffset":34901,"count":0},{"startOffset":35313,"endOffset":35431,"count":0}],"isBlockCoverage":true},{"functionName":"importModuleDynamically","ranges":[{"startOffset":34674,"endOffset":34888,"count":0}],"isBlockCoverage":false},{"functionName":"importModuleDynamically","ranges":[{"startOffset":35071,"endOffset":35299,"count":0}],"isBlockCoverage":false},{"functionName":"Module._compile","ranges":[{"startOffset":35633,"endOffset":37497,"count":172},{"startOffset":35722,"endOffset":35732,"count":0},{"startOffset":35750,"endOffset":35903,"count":0},{"startOffset":36084,"endOffset":36108,"count":0},{"startOffset":36110,"endOffset":36846,"count":0},{"startOffset":37069,"endOffset":37095,"count":2},{"startOffset":37120,"endOffset":37259,"count":0},{"startOffset":37461,"endOffset":37478,"count":2}],"isBlockCoverage":true},{"functionName":"Module._extensions..js","ranges":[{"startOffset":37556,"endOffset":39316,"count":172},{"startOffset":37717,"endOffset":37725,"count":2},{"startOffset":37727,"endOffset":37792,"count":2},{"startOffset":37792,"endOffset":37852,"count":170},{"startOffset":37901,"endOffset":39276,"count":169},{"startOffset":38042,"endOffset":39272,"count":0}],"isBlockCoverage":true},{"functionName":"Module._extensions..json","ranges":[{"startOffset":39380,"endOffset":39762,"count":0}],"isBlockCoverage":false},{"functionName":"Module._extensions..node","ranges":[{"startOffset":39826,"endOffset":40144,"count":0}],"isBlockCoverage":false},{"functionName":"createRequireFromPath","ranges":[{"startOffset":40147,"endOffset":40608,"count":0}],"isBlockCoverage":false},{"functionName":"createRequire","ranges":[{"startOffset":40716,"endOffset":41269,"count":0}],"isBlockCoverage":false},{"functionName":"Module._initPaths","ranges":[{"startOffset":41330,"endOffset":42294,"count":1},{"startOffset":41371,"endOffset":41396,"count":0},{"startOffset":41448,"endOffset":41471,"count":0},{"startOffset":41679,"endOffset":41721,"count":0},{"startOffset":42020,"endOffset":42161,"count":0}],"isBlockCoverage":true},{"functionName":"Module._preloadModules","ranges":[{"startOffset":42322,"endOffset":42913,"count":0}],"isBlockCoverage":false},{"functionName":"syncBuiltinESMExports","ranges":[{"startOffset":42947,"endOffset":43164,"count":0}],"isBlockCoverage":false},{"functionName":"isBuiltin","ranges":[{"startOffset":43186,"endOffset":43258,"count":0}],"isBlockCoverage":false}]},{"scriptId":"107","url":"node:internal/modules/package_json_reader","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":983,"count":1}],"isBlockCoverage":false},{"functionName":"read","ranges":[{"startOffset":279,"endOffset":954,"count":24},{"startOffset":332,"endOffset":369,"count":5},{"startOffset":369,"endOffset":601,"count":19},{"startOffset":601,"endOffset":904,"count":5},{"startOffset":635,"endOffset":769,"count":1},{"startOffset":694,"endOffset":747,"count":0},{"startOffset":797,"endOffset":900,"count":0},{"startOffset":904,"endOffset":953,"count":19}],"isBlockCoverage":true}]},{"scriptId":"108","url":"node:internal/process/esm_loader","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2985,"count":1}],"isBlockCoverage":false},{"functionName":"exports.initializeImportMetaObject","ranges":[{"startOffset":450,"endOffset":746,"count":3}],"isBlockCoverage":true},{"functionName":"importModuleDynamicallyCallback","ranges":[{"startOffset":791,"endOffset":1238,"count":2036},{"startOffset":1182,"endOffset":1237,"count":0}],"isBlockCoverage":true},{"functionName":"initializeLoader","ranges":[{"startOffset":1650,"endOffset":2628,"count":1},{"startOffset":1710,"endOffset":1721,"count":0},{"startOffset":1888,"endOffset":2627,"count":0}],"isBlockCoverage":true},{"functionName":"loadESM","ranges":[{"startOffset":2648,"endOffset":2983,"count":1},{"startOffset":2756,"endOffset":2981,"count":0}],"isBlockCoverage":true}]},{"scriptId":"109","url":"node:internal/modules/esm/loader","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":25961,"count":1}],"isBlockCoverage":false},{"functionName":"nextHookFactory","ranges":[{"startOffset":3305,"endOffset":5386,"count":2971},{"startOffset":3906,"endOffset":4146,"count":0}],"isBlockCoverage":true},{"functionName":"chainAdvancedTooFar","ranges":[{"startOffset":4224,"endOffset":4391,"count":0}],"isBlockCoverage":false},{"functionName":"ObjectDefineProperty.__proto__","ranges":[{"startOffset":4433,"endOffset":5320,"count":2971},{"startOffset":5261,"endOffset":5292,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5628,"endOffset":6879,"count":1}],"isBlockCoverage":false},{"functionName":"ESMLoader","ranges":[{"startOffset":6884,"endOffset":7501,"count":1},{"startOffset":6960,"endOffset":7020,"count":0},{"startOffset":7079,"endOffset":7136,"count":0},{"startOffset":7267,"endOffset":7497,"count":0}],"isBlockCoverage":true},{"functionName":"pluckHooks","ranges":[{"startOffset":7595,"endOffset":8874,"count":0}],"isBlockCoverage":false},{"functionName":"addCustomLoaders","ranges":[{"startOffset":9138,"endOffset":9958,"count":0}],"isBlockCoverage":false},{"functionName":"eval","ranges":[{"startOffset":9962,"endOffset":10703,"count":0}],"isBlockCoverage":false},{"functionName":"getModuleJob","ranges":[{"startOffset":11438,"endOffset":12371,"count":2044},{"startOffset":11654,"endOffset":11910,"count":0},{"startOffset":12175,"endOffset":12237,"count":0},{"startOffset":12266,"endOffset":12350,"count":927}],"isBlockCoverage":true},{"functionName":"#createModuleJob","ranges":[{"startOffset":13009,"endOffset":13994,"count":927},{"startOffset":13595,"endOffset":13635,"count":1},{"startOffset":13690,"endOffset":13705,"count":0},{"startOffset":13707,"endOffset":13759,"count":0}],"isBlockCoverage":true},{"functionName":"moduleProvider","ranges":[{"startOffset":13097,"endOffset":13537,"count":927},{"startOffset":13367,"endOffset":13447,"count":0}],"isBlockCoverage":true},{"functionName":"import","ranges":[{"startOffset":14704,"endOffset":16021,"count":2037},{"startOffset":15797,"endOffset":16020,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":15622,"endOffset":15640,"count":2037}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":15656,"endOffset":15693,"count":2037}],"isBlockCoverage":true},{"functionName":"load","ranges":[{"startOffset":16511,"endOffset":19735,"count":927},{"startOffset":18115,"endOffset":18146,"count":0},{"startOffset":18176,"endOffset":18199,"count":0},{"startOffset":18201,"endOffset":18272,"count":0},{"startOffset":18408,"endOffset":18440,"count":0},{"startOffset":18576,"endOffset":18656,"count":0},{"startOffset":18710,"endOffset":18900,"count":0},{"startOffset":18926,"endOffset":19149,"count":0},{"startOffset":19187,"endOffset":19342,"count":0},{"startOffset":19374,"endOffset":19409,"count":917},{"startOffset":19410,"endOffset":19444,"count":917},{"startOffset":19445,"endOffset":19480,"count":917},{"startOffset":19487,"endOffset":19663,"count":0}],"isBlockCoverage":true},{"functionName":"validateArgs","ranges":[{"startOffset":16790,"endOffset":17543,"count":927},{"startOffset":16868,"endOffset":17122,"count":0},{"startOffset":17288,"endOffset":17460,"count":0}],"isBlockCoverage":true},{"functionName":"validateOutput","ranges":[{"startOffset":17572,"endOffset":17809,"count":1854},{"startOffset":17662,"endOffset":17803,"count":0}],"isBlockCoverage":true},{"functionName":"preload","ranges":[{"startOffset":19739,"endOffset":22392,"count":0}],"isBlockCoverage":false},{"functionName":"importMetaInitialize","ranges":[{"startOffset":22396,"endOffset":22485,"count":3}],"isBlockCoverage":true},{"functionName":"resolve","ranges":[{"startOffset":23168,"endOffset":25876,"count":2044},{"startOffset":23338,"endOffset":23376,"count":2043},{"startOffset":23377,"endOffset":23411,"count":0},{"startOffset":23418,"endOffset":23539,"count":0},{"startOffset":24774,"endOffset":24805,"count":0},{"startOffset":24835,"endOffset":24858,"count":0},{"startOffset":24860,"endOffset":24931,"count":0},{"startOffset":25070,"endOffset":25218,"count":0},{"startOffset":25253,"endOffset":25506,"count":0},{"startOffset":25610,"endOffset":25826,"count":927},{"startOffset":25654,"endOffset":25820,"count":0}],"isBlockCoverage":true},{"functionName":"validateArgs","ranges":[{"startOffset":23901,"endOffset":24170,"count":2044}],"isBlockCoverage":true},{"functionName":"validateOutput","ranges":[{"startOffset":24199,"endOffset":24436,"count":4088},{"startOffset":24289,"endOffset":24430,"count":0}],"isBlockCoverage":true}]},{"scriptId":"110","url":"node:internal/modules/esm/module_map","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1444,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":263,"endOffset":288,"count":1}],"isBlockCoverage":true},{"functionName":"ModuleMap","ranges":[{"startOffset":507,"endOffset":535,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":584,"endOffset":727,"count":2044},{"startOffset":714,"endOffset":722,"count":1117}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":730,"endOffset":1253,"count":927},{"startOffset":882,"endOffset":918,"count":0},{"startOffset":920,"endOffset":990,"count":0},{"startOffset":1074,"endOffset":1080,"count":0}],"isBlockCoverage":true},{"functionName":"has","ranges":[{"startOffset":1256,"endOffset":1413,"count":2971},{"startOffset":1386,"endOffset":1394,"count":1117}],"isBlockCoverage":true}]},{"scriptId":"111","url":"node:internal/modules/esm/module_job","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8068,"count":1}],"isBlockCoverage":false},{"functionName":"isCommonJSGlobalLikeNotDefinedError","ranges":[{"startOffset":876,"endOffset":1006,"count":0}],"isBlockCoverage":false},{"functionName":"ModuleJob","ranges":[{"startOffset":1244,"endOffset":3031,"count":927}],"isBlockCoverage":true},{"functionName":"link","ranges":[{"startOffset":1812,"endOffset":2648,"count":927}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2268,"endOffset":2519,"count":7}],"isBlockCoverage":true},{"functionName":"instantiate","ranges":[{"startOffset":3035,"endOffset":3180,"count":2037},{"startOffset":3092,"endOffset":3146,"count":921}],"isBlockCoverage":true},{"functionName":"_instantiate","ranges":[{"startOffset":3184,"endOffset":6793,"count":921},{"startOffset":3634,"endOffset":3811,"count":0},{"startOffset":3868,"endOffset":6546,"count":0},{"startOffset":6593,"endOffset":6789,"count":927}],"isBlockCoverage":true},{"functionName":"addJobsToDependencyGraph","ranges":[{"startOffset":3283,"endOffset":3533,"count":928},{"startOffset":3344,"endOffset":3369,"count":1},{"startOffset":3369,"endOffset":3532,"count":927}],"isBlockCoverage":true},{"functionName":"run","ranges":[{"startOffset":6797,"endOffset":7988,"count":2037},{"startOffset":6972,"endOffset":7948,"count":0}],"isBlockCoverage":true}]},{"scriptId":"112","url":"node:internal/modules/esm/assert","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3624,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1295,"endOffset":1333,"count":5}],"isBlockCoverage":true},{"functionName":"validateAssertions","ranges":[{"startOffset":1754,"endOffset":2908,"count":927},{"startOffset":1935,"endOffset":2080,"count":0},{"startOffset":2345,"endOffset":2405,"count":0},{"startOffset":2411,"endOffset":2519,"count":0},{"startOffset":2525,"endOffset":2902,"count":0}],"isBlockCoverage":true},{"functionName":"handleInvalidType","ranges":[{"startOffset":3140,"endOffset":3554,"count":0}],"isBlockCoverage":false}]},{"scriptId":"113","url":"node:internal/modules/esm/resolve","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":38194,"count":1}],"isBlockCoverage":false},{"functionName":"emitFolderMapDeprecation","ranges":[{"startOffset":2694,"endOffset":3307,"count":0}],"isBlockCoverage":false},{"functionName":"emitTrailingSlashPatternDeprecation","ranges":[{"startOffset":3309,"endOffset":3973,"count":0}],"isBlockCoverage":false},{"functionName":"emitLegacyIndexDeprecation","ranges":[{"startOffset":4119,"endOffset":5215,"count":0}],"isBlockCoverage":false},{"functionName":"getConditionsSet","ranges":[{"startOffset":5285,"endOffset":5637,"count":2044},{"startOffset":5394,"endOffset":5602,"count":0}],"isBlockCoverage":true},{"functionName":"tryStatSync","ranges":[{"startOffset":5770,"endOffset":5836,"count":1789},{"startOffset":5822,"endOffset":5836,"count":3}],"isBlockCoverage":true},{"functionName":"fileExists","ranges":[{"startOffset":5898,"endOffset":5996,"count":3},{"startOffset":5985,"endOffset":5993,"count":0}],"isBlockCoverage":true},{"functionName":"legacyMainResolve","ranges":[{"startOffset":6384,"endOffset":8223,"count":3},{"startOffset":6723,"endOffset":7708,"count":0},{"startOffset":7732,"endOffset":8222,"count":0}],"isBlockCoverage":true},{"functionName":"resolveExtensionsWithTryExactName","ranges":[{"startOffset":8286,"endOffset":8417,"count":0}],"isBlockCoverage":false},{"functionName":"resolveExtensions","ranges":[{"startOffset":8535,"endOffset":8792,"count":0}],"isBlockCoverage":false},{"functionName":"resolveDirectoryEntry","ranges":[{"startOffset":8855,"endOffset":9386,"count":0}],"isBlockCoverage":false},{"functionName":"finalizeResolution","ranges":[{"startOffset":9566,"endOffset":11183,"count":1783},{"startOffset":9706,"endOffset":9849,"count":0},{"startOffset":9961,"endOffset":10437,"count":0},{"startOffset":10502,"endOffset":10538,"count":0},{"startOffset":10575,"endOffset":10702,"count":0},{"startOffset":10729,"endOffset":10843,"count":0},{"startOffset":11088,"endOffset":11093,"count":0}],"isBlockCoverage":true},{"functionName":"throwImportNotDefined","ranges":[{"startOffset":11295,"endOffset":11510,"count":0}],"isBlockCoverage":false},{"functionName":"throwExportsNotFound","ranges":[{"startOffset":11620,"endOffset":11819,"count":0}],"isBlockCoverage":false},{"functionName":"throwInvalidSubpath","ranges":[{"startOffset":11967,"endOffset":12317,"count":0}],"isBlockCoverage":false},{"functionName":"throwInvalidPackageTarget","ranges":[{"startOffset":12319,"endOffset":12701,"count":0}],"isBlockCoverage":false},{"functionName":"resolvePackageTargetString","ranges":[{"startOffset":12975,"endOffset":14852,"count":1},{"startOffset":13115,"endOffset":13126,"count":0},{"startOffset":13127,"endOffset":13163,"count":0},{"startOffset":13169,"endOffset":13242,"count":0},{"startOffset":13292,"endOffset":13903,"count":0},{"startOffset":13999,"endOffset":14072,"count":0},{"startOffset":14295,"endOffset":14368,"count":0},{"startOffset":14408,"endOffset":14851,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13679,"endOffset":13692,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":14549,"endOffset":14562,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":14780,"endOffset":14793,"count":0}],"isBlockCoverage":false},{"functionName":"isArrayIndex","ranges":[{"startOffset":14907,"endOffset":15047,"count":3},{"startOffset":14999,"endOffset":15044,"count":0}],"isBlockCoverage":true},{"functionName":"resolvePackageTarget","ranges":[{"startOffset":15049,"endOffset":17251,"count":2},{"startOffset":15231,"endOffset":17136,"count":1},{"startOffset":15406,"endOffset":16233,"count":0},{"startOffset":16386,"endOffset":16614,"count":3},{"startOffset":16444,"endOffset":16608,"count":0},{"startOffset":16657,"endOffset":17061,"count":2},{"startOffset":16738,"endOffset":17055,"count":1},{"startOffset":17008,"endOffset":17017,"count":0},{"startOffset":17061,"endOffset":17136,"count":0},{"startOffset":17136,"endOffset":17250,"count":0}],"isBlockCoverage":true},{"functionName":"isConditionalExportsMainSugar","ranges":[{"startOffset":17436,"endOffset":18371,"count":1},{"startOffset":17568,"endOffset":17580,"count":0},{"startOffset":17636,"endOffset":17649,"count":0},{"startOffset":17789,"endOffset":18340,"count":4},{"startOffset":17899,"endOffset":17956,"count":1},{"startOffset":17956,"endOffset":18336,"count":3},{"startOffset":18012,"endOffset":18336,"count":0}],"isBlockCoverage":true},{"functionName":"packageExportsResolve","ranges":[{"startOffset":18581,"endOffset":21249,"count":1},{"startOffset":18793,"endOffset":18820,"count":0},{"startOffset":19198,"endOffset":19271,"count":0},{"startOffset":19314,"endOffset":21248,"count":0}],"isBlockCoverage":true},{"functionName":"patternKeyCompare","ranges":[{"startOffset":21251,"endOffset":21782,"count":0}],"isBlockCoverage":false},{"functionName":"packageImportsResolve","ranges":[{"startOffset":21911,"endOffset":24680,"count":0}],"isBlockCoverage":false},{"functionName":"getPackageType","ranges":[{"startOffset":24785,"endOffset":24898,"count":3}],"isBlockCoverage":true},{"functionName":"parsePackageName","ranges":[{"startOffset":25060,"endOffset":26112,"count":3},{"startOffset":25331,"endOffset":25370,"count":0},{"startOffset":25541,"endOffset":25593,"count":0},{"startOffset":25770,"endOffset":25795,"count":0},{"startOffset":25822,"endOffset":25941,"count":0},{"startOffset":26002,"endOffset":26055,"count":0}],"isBlockCoverage":true},{"functionName":"packageResolve","ranges":[{"startOffset":26246,"endOffset":28370,"count":264},{"startOffset":26353,"endOffset":26413,"count":261},{"startOffset":26415,"endOffset":26461,"count":261},{"startOffset":26461,"endOffset":26984,"count":3},{"startOffset":26765,"endOffset":26811,"count":0},{"startOffset":26812,"endOffset":26845,"count":0},{"startOffset":26847,"endOffset":26980,"count":0},{"startOffset":26984,"endOffset":27155,"count":3},{"startOffset":27155,"endOffset":28161,"count":6},{"startOffset":27337,"endOffset":27614,"count":3},{"startOffset":27452,"endOffset":27478,"count":0},{"startOffset":27614,"endOffset":27760,"count":3},{"startOffset":27760,"endOffset":27793,"count":0},{"startOffset":27795,"endOffset":27928,"count":0},{"startOffset":27928,"endOffset":28070,"count":3},{"startOffset":28070,"endOffset":28161,"count":0},{"startOffset":28161,"endOffset":28369,"count":0}],"isBlockCoverage":true},{"functionName":"isBareSpecifier","ranges":[{"startOffset":28431,"endOffset":28541,"count":0}],"isBlockCoverage":false},{"functionName":"isRelativeSpecifier","ranges":[{"startOffset":28543,"endOffset":28814,"count":4088},{"startOffset":28613,"endOffset":28796,"count":3558},{"startOffset":28671,"endOffset":28683,"count":3556},{"startOffset":28683,"endOffset":28792,"count":2},{"startOffset":28796,"endOffset":28813,"count":530}],"isBlockCoverage":true},{"functionName":"shouldBeTreatedAsRelativeOrAbsolutePath","ranges":[{"startOffset":28816,"endOffset":28999,"count":4088},{"startOffset":28902,"endOffset":28915,"count":0},{"startOffset":28944,"endOffset":28956,"count":0}],"isBlockCoverage":true},{"functionName":"moduleResolve","ranges":[{"startOffset":29170,"endOffset":29961,"count":2044},{"startOffset":29496,"endOffset":29542,"count":1779},{"startOffset":29542,"endOffset":29838,"count":265},{"startOffset":29587,"endOffset":29665,"count":0},{"startOffset":29726,"endOffset":29834,"count":264},{"startOffset":29880,"endOffset":29896,"count":261},{"startOffset":29896,"endOffset":29960,"count":1783}],"isBlockCoverage":true},{"functionName":"resolveAsCommonJS","ranges":[{"startOffset":30107,"endOffset":31564,"count":0}],"isBlockCoverage":false},{"functionName":"checkIfDisallowedImport","ranges":[{"startOffset":31626,"endOffset":32818,"count":2044},{"startOffset":31720,"endOffset":32816,"count":2043},{"startOffset":31827,"endOffset":32812,"count":0}],"isBlockCoverage":true},{"functionName":"throwIfUnsupportedURLProtocol","ranges":[{"startOffset":32820,"endOffset":33018,"count":2044},{"startOffset":32897,"endOffset":32924,"count":261},{"startOffset":32925,"endOffset":32958,"count":261},{"startOffset":32960,"endOffset":33016,"count":0}],"isBlockCoverage":true},{"functionName":"throwIfUnsupportedURLScheme","ranges":[{"startOffset":33020,"endOffset":33508,"count":2044},{"startOffset":33113,"endOffset":33147,"count":1780},{"startOffset":33148,"endOffset":33182,"count":0},{"startOffset":33183,"endOffset":33326,"count":0},{"startOffset":33331,"endOffset":33506,"count":0}],"isBlockCoverage":true},{"functionName":"defaultResolve","ranges":[{"startOffset":33510,"endOffset":37424,"count":2044},{"startOffset":33626,"endOffset":33645,"count":2043},{"startOffset":33635,"endOffset":33645,"count":0},{"startOffset":33647,"endOffset":34438,"count":0},{"startOffset":34480,"endOffset":34585,"count":2043},{"startOffset":34542,"endOffset":34581,"count":0},{"startOffset":34669,"endOffset":34728,"count":1779},{"startOffset":34728,"endOffset":34776,"count":265},{"startOffset":34776,"endOffset":34961,"count":1780},{"startOffset":34851,"endOffset":34953,"count":0},{"startOffset":34968,"endOffset":35010,"count":0},{"startOffset":35015,"endOffset":35050,"count":264},{"startOffset":35384,"endOffset":35403,"count":0},{"startOffset":35468,"endOffset":35498,"count":1780},{"startOffset":35500,"endOffset":35526,"count":0},{"startOffset":35652,"endOffset":36173,"count":1},{"startOffset":36130,"endOffset":36169,"count":0},{"startOffset":36328,"endOffset":36350,"count":1},{"startOffset":36351,"endOffset":36369,"count":2043},{"startOffset":36376,"endOffset":37180,"count":0}],"isBlockCoverage":true},{"functionName":"defaultResolve","ranges":[{"startOffset":37790,"endOffset":38190,"count":0}],"isBlockCoverage":false}]},{"scriptId":"114","url":"node:internal/modules/esm/package_config","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3627,"count":1}],"isBlockCoverage":false},{"functionName":"getPackageConfig","ranges":[{"startOffset":883,"endOffset":2391,"count":17},{"startOffset":1011,"endOffset":1037,"count":9},{"startOffset":1037,"endOffset":1120,"count":8},{"startOffset":1120,"endOffset":1395,"count":5},{"startOffset":1395,"endOffset":1465,"count":3},{"startOffset":1465,"endOffset":1644,"count":0},{"startOffset":1644,"endOffset":1827,"count":3},{"startOffset":1827,"endOffset":1848,"count":0},{"startOffset":1849,"endOffset":1860,"count":3},{"startOffset":1896,"endOffset":1915,"count":0},{"startOffset":1917,"endOffset":1980,"count":3},{"startOffset":1980,"endOffset":2007,"count":1},{"startOffset":2007,"endOffset":2040,"count":3},{"startOffset":2040,"endOffset":2067,"count":1},{"startOffset":2067,"endOffset":2167,"count":3},{"startOffset":2169,"endOffset":2390,"count":3}],"isBlockCoverage":true},{"functionName":"getPackageScopeConfig","ranges":[{"startOffset":2464,"endOffset":3557,"count":6},{"startOffset":2582,"endOffset":3228,"count":14},{"startOffset":2716,"endOffset":2736,"count":0},{"startOffset":2852,"endOffset":2887,"count":6},{"startOffset":2887,"endOffset":3204,"count":8},{"startOffset":3204,"endOffset":3224,"count":0},{"startOffset":3228,"endOffset":3556,"count":0}],"isBlockCoverage":true}]},{"scriptId":"115","url":"node:internal/modules/esm/get_format","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4089,"count":1}],"isBlockCoverage":false},{"functionName":"node:","ranges":[{"startOffset":1080,"endOffset":1111,"count":261}],"isBlockCoverage":true},{"functionName":"getDataProtocolModuleFormat","ranges":[{"startOffset":1117,"endOffset":1333,"count":0}],"isBlockCoverage":false},{"functionName":"getFileProtocolModuleFormat","ranges":[{"startOffset":1457,"endOffset":2798,"count":1783},{"startOffset":1617,"endOffset":1691,"count":3},{"startOffset":1663,"endOffset":1673,"count":0},{"startOffset":1691,"endOffset":1763,"count":1780},{"startOffset":1763,"endOffset":2795,"count":0}],"isBlockCoverage":true},{"functionName":"getHttpProtocolModuleFormat","ranges":[{"startOffset":2934,"endOffset":3204,"count":0}],"isBlockCoverage":false},{"functionName":"defaultGetFormatWithoutErrors","ranges":[{"startOffset":3363,"endOffset":3607,"count":2044},{"startOffset":3526,"endOffset":3538,"count":0}],"isBlockCoverage":true},{"functionName":"defaultGetFormat","ranges":[{"startOffset":3766,"endOffset":3990,"count":0}],"isBlockCoverage":false}]},{"scriptId":"116","url":"node:internal/modules/esm/fetch_module","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7752,"count":1}],"isBlockCoverage":false},{"functionName":"HTTPSGet","ranges":[{"startOffset":1395,"endOffset":1605,"count":0}],"isBlockCoverage":false},{"functionName":"HTTPGet","ranges":[{"startOffset":1622,"endOffset":1825,"count":0}],"isBlockCoverage":false},{"functionName":"dnsLookup","ranges":[{"startOffset":1827,"endOffset":1984,"count":0}],"isBlockCoverage":false},{"functionName":"createBrotliDecompress","ranges":[{"startOffset":1996,"endOffset":2204,"count":0}],"isBlockCoverage":false},{"functionName":"createUnzip","ranges":[{"startOffset":2206,"endOffset":2370,"count":0}],"isBlockCoverage":false},{"functionName":"isRedirect","ranges":[{"startOffset":2618,"endOffset":2924,"count":0}],"isBlockCoverage":false},{"functionName":"fetchWithRedirects","ranges":[{"startOffset":3004,"endOffset":5864,"count":0}],"isBlockCoverage":false},{"functionName":"isLocalAddress","ranges":[{"startOffset":6224,"endOffset":6685,"count":0}],"isBlockCoverage":false},{"functionName":"fetchModule","ranges":[{"startOffset":7143,"endOffset":7713,"count":0}],"isBlockCoverage":false}]},{"scriptId":"117","url":"node:net","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":53184,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1480,"endOffset":1505,"count":1}],"isBlockCoverage":true},{"functionName":"noop","ranges":[{"startOffset":3594,"endOffset":3602,"count":0}],"isBlockCoverage":false},{"functionName":"getFlags","ranges":[{"startOffset":3940,"endOffset":4034,"count":0}],"isBlockCoverage":false},{"functionName":"createHandle","ranges":[{"startOffset":4036,"endOffset":4417,"count":1},{"startOffset":4203,"endOffset":4225,"count":0},{"startOffset":4259,"endOffset":4416,"count":0}],"isBlockCoverage":true},{"functionName":"getNewAsyncId","ranges":[{"startOffset":4420,"endOffset":4558,"count":5},{"startOffset":4515,"endOffset":4533,"count":0}],"isBlockCoverage":true},{"functionName":"isPipeName","ranges":[{"startOffset":4561,"endOffset":4644,"count":0}],"isBlockCoverage":false},{"functionName":"createServer","ranges":[{"startOffset":4845,"endOffset":4949,"count":0}],"isBlockCoverage":false},{"functionName":"connect","ranges":[{"startOffset":5172,"endOffset":5572,"count":0}],"isBlockCoverage":false},{"functionName":"normalizeArgs","ranges":[{"startOffset":6067,"endOffset":6793,"count":4},{"startOffset":6135,"endOffset":6216,"count":0},{"startOffset":6364,"endOffset":6612,"count":0},{"startOffset":6686,"endOffset":6740,"count":2}],"isBlockCoverage":true},{"functionName":"initSocketHandle","ranges":[{"startOffset":6865,"endOffset":7468,"count":3},{"startOffset":7221,"endOffset":7462,"count":0}],"isBlockCoverage":true},{"functionName":"closeSocketHandle","ranges":[{"startOffset":7470,"endOffset":7810,"count":0}],"isBlockCoverage":false},{"functionName":"Socket","ranges":[{"startOffset":8062,"endOffset":12601,"count":3},{"startOffset":8122,"endOffset":8149,"count":0},{"startOffset":8177,"endOffset":8305,"count":0},{"startOffset":8375,"endOffset":8622,"count":0},{"startOffset":8684,"endOffset":8879,"count":0},{"startOffset":9441,"endOffset":9467,"count":0},{"startOffset":9873,"endOffset":9981,"count":2},{"startOffset":9981,"endOffset":11220,"count":1},{"startOffset":10509,"endOffset":10543,"count":0},{"startOffset":10619,"endOffset":10630,"count":0},{"startOffset":10688,"endOffset":11216,"count":0},{"startOffset":11307,"endOffset":11384,"count":0},{"startOffset":11385,"endOffset":11431,"count":0},{"startOffset":11433,"endOffset":11648,"count":0},{"startOffset":12183,"endOffset":12448,"count":2},{"startOffset":12216,"endOffset":12385,"count":0},{"startOffset":12417,"endOffset":12444,"count":0}],"isBlockCoverage":true},{"functionName":"_unrefTimer","ranges":[{"startOffset":12774,"endOffset":12904,"count":720},{"startOffset":12876,"endOffset":12898,"count":0}],"isBlockCoverage":true},{"functionName":"Socket._final","ranges":[{"startOffset":13024,"endOffset":13640,"count":0}],"isBlockCoverage":false},{"functionName":"afterShutdown","ranges":[{"startOffset":13643,"endOffset":13818,"count":0}],"isBlockCoverage":false},{"functionName":"writeAfterFIN","ranges":[{"startOffset":14025,"endOffset":14532,"count":0}],"isBlockCoverage":false},{"functionName":"Socket._onTimeout","ranges":[{"startOffset":14614,"endOffset":15118,"count":0}],"isBlockCoverage":false},{"functionName":"Socket.setNoDelay","ranges":[{"startOffset":15152,"endOffset":15529,"count":0}],"isBlockCoverage":false},{"functionName":"Socket.setKeepAlive","ranges":[{"startOffset":15565,"endOffset":16171,"count":3},{"startOffset":15706,"endOffset":15814,"count":0},{"startOffset":15850,"endOffset":15872,"count":0},{"startOffset":15911,"endOffset":16004,"count":1},{"startOffset":16009,"endOffset":16153,"count":2}],"isBlockCoverage":true},{"functionName":"Socket.address","ranges":[{"startOffset":16202,"endOffset":16246,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":16332,"endOffset":16376,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":16455,"endOffset":16511,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":16621,"endOffset":16936,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":17024,"endOffset":17104,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":17191,"endOffset":17236,"count":15}],"isBlockCoverage":true},{"functionName":"tryReadStart","ranges":[{"startOffset":17243,"endOffset":17489,"count":2},{"startOffset":17443,"endOffset":17487,"count":0}],"isBlockCoverage":true},{"functionName":"Socket._read","ranges":[{"startOffset":17581,"endOffset":17810,"count":16},{"startOffset":17636,"endOffset":17652,"count":14},{"startOffset":17654,"endOffset":17746,"count":2},{"startOffset":17746,"endOffset":17808,"count":14},{"startOffset":17779,"endOffset":17808,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17721,"endOffset":17740,"count":2}],"isBlockCoverage":true},{"functionName":"Socket.end","ranges":[{"startOffset":17837,"endOffset":18024,"count":0}],"isBlockCoverage":false},{"functionName":"Socket.resetAndDestroy","ranges":[{"startOffset":18062,"endOffset":18412,"count":0}],"isBlockCoverage":false},{"functionName":"Socket.pause","ranges":[{"startOffset":18440,"endOffset":18774,"count":0}],"isBlockCoverage":false},{"functionName":"Socket.resume","ranges":[{"startOffset":18804,"endOffset":18988,"count":15},{"startOffset":18837,"endOffset":18856,"count":0},{"startOffset":18857,"endOffset":18872,"count":0},{"startOffset":18873,"endOffset":18903,"count":0},{"startOffset":18905,"endOffset":18934,"count":0}],"isBlockCoverage":true},{"functionName":"Socket.read","ranges":[{"startOffset":19016,"endOffset":19202,"count":18},{"startOffset":19050,"endOffset":19069,"count":0},{"startOffset":19070,"endOffset":19085,"count":0},{"startOffset":19086,"endOffset":19116,"count":0},{"startOffset":19118,"endOffset":19147,"count":0}],"isBlockCoverage":true},{"functionName":"onReadableStreamEnd","ranges":[{"startOffset":19249,"endOffset":19348,"count":0}],"isBlockCoverage":false},{"functionName":"Socket.destroySoon","ranges":[{"startOffset":19382,"endOffset":19529,"count":0}],"isBlockCoverage":false},{"functionName":"Socket._destroy","ranges":[{"startOffset":19561,"endOffset":21071,"count":0}],"isBlockCoverage":false},{"functionName":"Socket._reset","ranges":[{"startOffset":21100,"endOffset":21199,"count":0}],"isBlockCoverage":false},{"functionName":"Socket._getpeername","ranges":[{"startOffset":21234,"endOffset":21512,"count":0}],"isBlockCoverage":false},{"functionName":"protoGetter","ranges":[{"startOffset":21515,"endOffset":21696,"count":9}],"isBlockCoverage":true},{"functionName":"bytesRead","ranges":[{"startOffset":21723,"endOffset":21814,"count":0}],"isBlockCoverage":false},{"functionName":"remoteAddress","ranges":[{"startOffset":21847,"endOffset":21913,"count":0}],"isBlockCoverage":false},{"functionName":"remoteFamily","ranges":[{"startOffset":21945,"endOffset":22009,"count":0}],"isBlockCoverage":false},{"functionName":"remotePort","ranges":[{"startOffset":22039,"endOffset":22099,"count":0}],"isBlockCoverage":false},{"functionName":"Socket._getsockname","ranges":[{"startOffset":22136,"endOffset":22412,"count":0}],"isBlockCoverage":false},{"functionName":"localAddress","ranges":[{"startOffset":22444,"endOffset":22509,"count":0}],"isBlockCoverage":false},{"functionName":"localPort","ranges":[{"startOffset":22539,"endOffset":22598,"count":0}],"isBlockCoverage":false},{"functionName":"localFamily","ranges":[{"startOffset":22629,"endOffset":22692,"count":0}],"isBlockCoverage":false},{"functionName":"Socket.","ranges":[{"startOffset":22733,"endOffset":22780,"count":3}],"isBlockCoverage":true},{"functionName":"Socket._writeGeneric","ranges":[{"startOffset":22816,"endOffset":23577,"count":701},{"startOffset":23038,"endOffset":23231,"count":2},{"startOffset":23231,"endOffset":23312,"count":699},{"startOffset":23312,"endOffset":23368,"count":0},{"startOffset":23368,"endOffset":23422,"count":699},{"startOffset":23422,"endOffset":23458,"count":3},{"startOffset":23458,"endOffset":23515,"count":696},{"startOffset":23515,"endOffset":23537,"count":699},{"startOffset":23537,"endOffset":23575,"count":3}],"isBlockCoverage":true},{"functionName":"connect","ranges":[{"startOffset":23133,"endOffset":23213,"count":2}],"isBlockCoverage":true},{"functionName":"Socket._writev","ranges":[{"startOffset":23608,"endOffset":23676,"count":3}],"isBlockCoverage":true},{"functionName":"Socket._write","ranges":[{"startOffset":23706,"endOffset":23787,"count":696}],"isBlockCoverage":true},{"functionName":"_bytesDispatched","ranges":[{"startOffset":23980,"endOffset":24084,"count":0}],"isBlockCoverage":false},{"functionName":"bytesWritten","ranges":[{"startOffset":24116,"endOffset":25045,"count":0}],"isBlockCoverage":false},{"functionName":"checkBindError","ranges":[{"startOffset":25050,"endOffset":25849,"count":0}],"isBlockCoverage":false},{"functionName":"internalConnect","ranges":[{"startOffset":25852,"endOffset":27739,"count":2},{"startOffset":26107,"endOffset":26733,"count":0},{"startOffset":27053,"endOffset":27117,"count":0},{"startOffset":27121,"endOffset":27280,"count":0},{"startOffset":27293,"endOffset":27541,"count":0},{"startOffset":27615,"endOffset":27737,"count":0}],"isBlockCoverage":true},{"functionName":"Socket.connect","ranges":[{"startOffset":27769,"endOffset":29219,"count":2},{"startOffset":28113,"endOffset":28145,"count":0},{"startOffset":28147,"endOffset":28178,"count":0},{"startOffset":28373,"endOffset":28396,"count":0},{"startOffset":28402,"endOffset":28458,"count":0},{"startOffset":28509,"endOffset":28545,"count":0},{"startOffset":28569,"endOffset":28653,"count":0},{"startOffset":28757,"endOffset":28891,"count":0},{"startOffset":29011,"endOffset":29154,"count":0}],"isBlockCoverage":true},{"functionName":"lookupAndConnect","ranges":[{"startOffset":29223,"endOffset":32103,"count":2},{"startOffset":29341,"endOffset":29355,"count":0},{"startOffset":29403,"endOffset":29425,"count":0},{"startOffset":29427,"endOffset":29484,"count":0},{"startOffset":29503,"endOffset":29560,"count":0},{"startOffset":29632,"endOffset":29659,"count":0},{"startOffset":29661,"endOffset":29787,"count":0},{"startOffset":29931,"endOffset":30235,"count":0},{"startOffset":30277,"endOffset":30328,"count":0},{"startOffset":30355,"endOffset":30376,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":30005,"endOffset":30217,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":30810,"endOffset":32099,"count":2}],"isBlockCoverage":true},{"functionName":"emitLookup","ranges":[{"startOffset":30849,"endOffset":32093,"count":2},{"startOffset":31137,"endOffset":31144,"count":0},{"startOffset":31161,"endOffset":31456,"count":0},{"startOffset":31477,"endOffset":31585,"count":0},{"startOffset":31613,"endOffset":31633,"count":0},{"startOffset":31635,"endOffset":31874,"count":0}],"isBlockCoverage":true},{"functionName":"connectErrorNT","ranges":[{"startOffset":32106,"endOffset":32165,"count":0}],"isBlockCoverage":false},{"functionName":"Socket.ref","ranges":[{"startOffset":32191,"endOffset":32378,"count":1},{"startOffset":32225,"endOffset":32283,"count":0}],"isBlockCoverage":true},{"functionName":"Socket.unref","ranges":[{"startOffset":32407,"endOffset":32600,"count":3},{"startOffset":32441,"endOffset":32501,"count":0}],"isBlockCoverage":true},{"functionName":"afterConnect","ranges":[{"startOffset":32604,"endOffset":34185,"count":2},{"startOffset":32774,"endOffset":32791,"count":0},{"startOffset":32957,"endOffset":33006,"count":0},{"startOffset":33043,"endOffset":33068,"count":0},{"startOffset":33120,"endOffset":33146,"count":0},{"startOffset":33148,"endOffset":33192,"count":0},{"startOffset":33222,"endOffset":33250,"count":0},{"startOffset":33252,"endOffset":33331,"count":0},{"startOffset":33601,"endOffset":33622,"count":0},{"startOffset":33624,"endOffset":33682,"count":0},{"startOffset":33686,"endOffset":34183,"count":0}],"isBlockCoverage":true},{"functionName":"addAbortSignalOption","ranges":[{"startOffset":34187,"endOffset":34627,"count":0}],"isBlockCoverage":false},{"functionName":"Server","ranges":[{"startOffset":34629,"endOffset":35890,"count":0}],"isBlockCoverage":false},{"functionName":"toNumber","ranges":[{"startOffset":36001,"endOffset":36066,"count":0}],"isBlockCoverage":false},{"functionName":"createServerHandle","ranges":[{"startOffset":36134,"endOffset":37586,"count":0}],"isBlockCoverage":false},{"functionName":"setupListenHandle","ranges":[{"startOffset":37588,"endOffset":39939,"count":0}],"isBlockCoverage":false},{"functionName":"emitErrorNT","ranges":[{"startOffset":40006,"endOffset":40068,"count":0}],"isBlockCoverage":false},{"functionName":"emitListeningNT","ranges":[{"startOffset":40071,"endOffset":40186,"count":0}],"isBlockCoverage":false},{"functionName":"listenInCluster","ranges":[{"startOffset":40189,"endOffset":41449,"count":0}],"isBlockCoverage":false},{"functionName":"Server.listen","ranges":[{"startOffset":41478,"endOffset":45304,"count":0}],"isBlockCoverage":false},{"functionName":"lookupAndListen","ranges":[{"startOffset":45307,"endOffset":45719,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":45801,"endOffset":45844,"count":0}],"isBlockCoverage":false},{"functionName":"Server.address","ranges":[{"startOffset":45919,"endOffset":46208,"count":0}],"isBlockCoverage":false},{"functionName":"onconnection","ranges":[{"startOffset":46211,"endOffset":48053,"count":0}],"isBlockCoverage":false},{"functionName":"Server.getConnections","ranges":[{"startOffset":48202,"endOffset":48955,"count":0}],"isBlockCoverage":false},{"functionName":"Server.close","ranges":[{"startOffset":48984,"endOffset":49851,"count":0}],"isBlockCoverage":false},{"functionName":"Server._emitCloseIfDrained","ranges":[{"startOffset":49893,"endOffset":50279,"count":0}],"isBlockCoverage":false},{"functionName":"emitCloseNT","ranges":[{"startOffset":50283,"endOffset":50366,"count":0}],"isBlockCoverage":false},{"functionName":"Server.","ranges":[{"startOffset":50425,"endOffset":50587,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":50809,"endOffset":50845,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":50849,"endOffset":50890,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":50969,"endOffset":51000,"count":828}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":51004,"endOffset":51040,"count":3}],"isBlockCoverage":true},{"functionName":"Server._setupWorker","ranges":[{"startOffset":51078,"endOffset":51319,"count":0}],"isBlockCoverage":false},{"functionName":"Server.ref","ranges":[{"startOffset":51345,"endOffset":51443,"count":0}],"isBlockCoverage":false},{"functionName":"Server.unref","ranges":[{"startOffset":51471,"endOffset":51570,"count":0}],"isBlockCoverage":false},{"functionName":"_setSimultaneousAccepts","ranges":[{"startOffset":51712,"endOffset":52381,"count":0}],"isBlockCoverage":false},{"functionName":"_setSimultaneousAccepts","ranges":[{"startOffset":52420,"endOffset":52661,"count":0}],"isBlockCoverage":false},{"functionName":"get BlockList","ranges":[{"startOffset":52790,"endOffset":52892,"count":1}],"isBlockCoverage":true},{"functionName":"get SocketAddress","ranges":[{"startOffset":52896,"endOffset":53018,"count":0}],"isBlockCoverage":false}]},{"scriptId":"118","url":"node:internal/net","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2167,"count":1}],"isBlockCoverage":false},{"functionName":"isIPv4","ranges":[{"startOffset":997,"endOffset":1270,"count":15}],"isBlockCoverage":true},{"functionName":"isIPv6","ranges":[{"startOffset":1272,"endOffset":1545,"count":11}],"isBlockCoverage":true},{"functionName":"isIP","ranges":[{"startOffset":1547,"endOffset":1633,"count":15},{"startOffset":1583,"endOffset":1592,"count":4},{"startOffset":1592,"endOffset":1610,"count":11},{"startOffset":1610,"endOffset":1619,"count":0},{"startOffset":1619,"endOffset":1632,"count":11}],"isBlockCoverage":true},{"functionName":"makeSyncWrite","ranges":[{"startOffset":1635,"endOffset":2049,"count":0}],"isBlockCoverage":false}]},{"scriptId":"119","url":"node:internal/dtrace","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":568,"count":1}],"isBlockCoverage":false},{"functionName":"DTRACE_HTTP_CLIENT_REQUEST","ranges":[{"startOffset":97,"endOffset":105,"count":3}],"isBlockCoverage":true},{"functionName":"DTRACE_HTTP_CLIENT_RESPONSE","ranges":[{"startOffset":139,"endOffset":147,"count":3}],"isBlockCoverage":true},{"functionName":"DTRACE_HTTP_SERVER_REQUEST","ranges":[{"startOffset":180,"endOffset":188,"count":0}],"isBlockCoverage":false},{"functionName":"DTRACE_HTTP_SERVER_RESPONSE","ranges":[{"startOffset":222,"endOffset":230,"count":0}],"isBlockCoverage":false},{"functionName":"DTRACE_NET_SERVER_CONNECTION","ranges":[{"startOffset":265,"endOffset":273,"count":0}],"isBlockCoverage":false},{"functionName":"DTRACE_NET_STREAM_END","ranges":[{"startOffset":301,"endOffset":309,"count":0}],"isBlockCoverage":false}]},{"scriptId":"120","url":"node:diagnostics_channel","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3040,"count":1}],"isBlockCoverage":false},{"functionName":"subscribe","ranges":[{"startOffset":540,"endOffset":678,"count":0}],"isBlockCoverage":false},{"functionName":"unsubscribe","ranges":[{"startOffset":682,"endOffset":1126,"count":0}],"isBlockCoverage":false},{"functionName":"get hasSubscribers","ranges":[{"startOffset":1130,"endOffset":1173,"count":0}],"isBlockCoverage":false},{"functionName":"publish","ranges":[{"startOffset":1177,"endOffset":1478,"count":0}],"isBlockCoverage":false},{"functionName":"Channel","ranges":[{"startOffset":1500,"endOffset":1580,"count":6}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1591,"endOffset":1776,"count":0}],"isBlockCoverage":false},{"functionName":"subscribe","ranges":[{"startOffset":1780,"endOffset":1928,"count":0}],"isBlockCoverage":false},{"functionName":"unsubscribe","ranges":[{"startOffset":1932,"endOffset":1969,"count":0}],"isBlockCoverage":false},{"functionName":"get hasSubscribers","ranges":[{"startOffset":1973,"endOffset":2017,"count":6}],"isBlockCoverage":true},{"functionName":"publish","ranges":[{"startOffset":2021,"endOffset":2033,"count":0}],"isBlockCoverage":false},{"functionName":"channel","ranges":[{"startOffset":2075,"endOffset":2448,"count":6},{"startOffset":2156,"endOffset":2176,"count":0},{"startOffset":2192,"endOffset":2207,"count":0},{"startOffset":2240,"endOffset":2267,"count":0},{"startOffset":2269,"endOffset":2349,"count":0}],"isBlockCoverage":true},{"functionName":"subscribe","ranges":[{"startOffset":2450,"endOffset":2581,"count":0}],"isBlockCoverage":false},{"functionName":"unsubscribe","ranges":[{"startOffset":2583,"endOffset":2763,"count":0}],"isBlockCoverage":false},{"functionName":"hasSubscribers","ranges":[{"startOffset":2765,"endOffset":2949,"count":0}],"isBlockCoverage":false}]},{"scriptId":"121","url":"node:internal/blocklist","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3877,"count":1}],"isBlockCoverage":false},{"functionName":"BlockList","ranges":[{"startOffset":764,"endOffset":879,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":883,"endOffset":1135,"count":0}],"isBlockCoverage":false},{"functionName":"addAddress","ranges":[{"startOffset":1139,"endOffset":1460,"count":1}],"isBlockCoverage":true},{"functionName":"addRange","ranges":[{"startOffset":1464,"endOffset":2142,"count":1},{"startOffset":2066,"endOffset":2138,"count":0}],"isBlockCoverage":true},{"functionName":"addSubnet","ranges":[{"startOffset":2146,"endOffset":2691,"count":0}],"isBlockCoverage":false},{"functionName":"check","ranges":[{"startOffset":2695,"endOffset":3160,"count":0}],"isBlockCoverage":false},{"functionName":"get rules","ranges":[{"startOffset":3164,"endOffset":3218,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3222,"endOffset":3379,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3383,"endOffset":3483,"count":0}],"isBlockCoverage":false},{"functionName":"InternalBlockList","ranges":[{"startOffset":3538,"endOffset":3669,"count":0}],"isBlockCoverage":false}]},{"scriptId":"122","url":"node:internal/socketaddress","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3361,"count":1}],"isBlockCoverage":false},{"functionName":"isSocketAddress","ranges":[{"startOffset":727,"endOffset":798,"count":3}],"isBlockCoverage":true},{"functionName":"SocketAddress","ranges":[{"startOffset":802,"endOffset":1761,"count":3},{"startOffset":969,"endOffset":982,"count":0},{"startOffset":983,"endOffset":989,"count":0},{"startOffset":1177,"endOffset":1228,"count":2},{"startOffset":1235,"endOffset":1287,"count":1},{"startOffset":1294,"endOffset":1377,"count":0}],"isBlockCoverage":true},{"functionName":"get address","ranges":[{"startOffset":1765,"endOffset":1818,"count":0}],"isBlockCoverage":false},{"functionName":"get port","ranges":[{"startOffset":1822,"endOffset":1869,"count":0}],"isBlockCoverage":false},{"functionName":"get family","ranges":[{"startOffset":1873,"endOffset":1954,"count":0}],"isBlockCoverage":false},{"functionName":"get flowlabel","ranges":[{"startOffset":1958,"endOffset":2066,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2070,"endOffset":2308,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2312,"endOffset":2477,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2481,"endOffset":2687,"count":0}],"isBlockCoverage":false},{"functionName":"toJSON","ranges":[{"startOffset":2691,"endOffset":2837,"count":0}],"isBlockCoverage":false},{"functionName":"InternalSocketAddress","ranges":[{"startOffset":2896,"endOffset":3116,"count":0}],"isBlockCoverage":false}]},{"scriptId":"123","url":"node:internal/modules/esm/formats","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1199,"count":1}],"isBlockCoverage":false},{"functionName":"mimeToFormat","ranges":[{"startOffset":674,"endOffset":997,"count":0}],"isBlockCoverage":false},{"functionName":"getLegacyExtensionFormat","ranges":[{"startOffset":999,"endOffset":1081,"count":0}],"isBlockCoverage":false}]},{"scriptId":"124","url":"node:internal/modules/esm/initialize_import_meta","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":980,"count":1}],"isBlockCoverage":false},{"functionName":"createImportMetaResolve","ranges":[{"startOffset":289,"endOffset":660,"count":0}],"isBlockCoverage":false},{"functionName":"initializeImportMeta","ranges":[{"startOffset":728,"endOffset":933,"count":3},{"startOffset":858,"endOffset":912,"count":0}],"isBlockCoverage":true}]},{"scriptId":"125","url":"node:internal/modules/esm/load","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2745,"count":1}],"isBlockCoverage":false},{"functionName":"getSource","ranges":[{"startOffset":976,"endOffset":2061,"count":917},{"startOffset":1169,"endOffset":1942,"count":0},{"startOffset":1955,"endOffset":1965,"count":0},{"startOffset":1967,"endOffset":2025,"count":0}],"isBlockCoverage":true},{"functionName":"defaultLoad","ranges":[{"startOffset":2173,"endOffset":2706,"count":927},{"startOffset":2351,"endOffset":2407,"count":0},{"startOffset":2495,"endOffset":2523,"count":919},{"startOffset":2528,"endOffset":2552,"count":10},{"startOffset":2552,"endOffset":2646,"count":917}],"isBlockCoverage":true}]},{"scriptId":"126","url":"node:internal/fs/promises","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":23391,"count":1}],"isBlockCoverage":false},{"functionName":"lazyLoadCpPromises","ranges":[{"startOffset":2521,"endOffset":2613,"count":0}],"isBlockCoverage":false},{"functionName":"lazyFsStreams","ranges":[{"startOffset":2675,"endOffset":2758,"count":0}],"isBlockCoverage":false},{"functionName":"FileHandle","ranges":[{"startOffset":2901,"endOffset":3078,"count":917},{"startOffset":3015,"endOffset":3019,"count":0}],"isBlockCoverage":true},{"functionName":"getAsyncId","ranges":[{"startOffset":3082,"endOffset":3139,"count":0}],"isBlockCoverage":false},{"functionName":"get fd","ranges":[{"startOffset":3143,"endOffset":3179,"count":1838}],"isBlockCoverage":true},{"functionName":"appendFile","ranges":[{"startOffset":3183,"endOffset":3265,"count":0}],"isBlockCoverage":false},{"functionName":"chmod","ranges":[{"startOffset":3269,"endOffset":3325,"count":0}],"isBlockCoverage":false},{"functionName":"chown","ranges":[{"startOffset":3329,"endOffset":3393,"count":0}],"isBlockCoverage":false},{"functionName":"datasync","ranges":[{"startOffset":3397,"endOffset":3449,"count":0}],"isBlockCoverage":false},{"functionName":"sync","ranges":[{"startOffset":3453,"endOffset":3497,"count":0}],"isBlockCoverage":false},{"functionName":"read","ranges":[{"startOffset":3501,"endOffset":3610,"count":0}],"isBlockCoverage":false},{"functionName":"readv","ranges":[{"startOffset":3614,"endOffset":3695,"count":0}],"isBlockCoverage":false},{"functionName":"readFile","ranges":[{"startOffset":3699,"endOffset":3766,"count":0}],"isBlockCoverage":false},{"functionName":"stat","ranges":[{"startOffset":3770,"endOffset":3830,"count":0}],"isBlockCoverage":false},{"functionName":"truncate","ranges":[{"startOffset":3834,"endOffset":3898,"count":0}],"isBlockCoverage":false},{"functionName":"utimes","ranges":[{"startOffset":3902,"endOffset":3976,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":3980,"endOffset":4091,"count":0}],"isBlockCoverage":false},{"functionName":"writev","ranges":[{"startOffset":4095,"endOffset":4178,"count":0}],"isBlockCoverage":false},{"functionName":"writeFile","ranges":[{"startOffset":4182,"endOffset":4263,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":4267,"endOffset":5065,"count":917}],"isBlockCoverage":false},{"functionName":"close","ranges":[{"startOffset":4275,"endOffset":5065,"count":917},{"startOffset":4309,"endOffset":4347,"count":0},{"startOffset":4378,"endOffset":4419,"count":0},{"startOffset":4644,"endOffset":5004,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4587,"endOffset":4629,"count":917}],"isBlockCoverage":true},{"functionName":".SafePromisePrototypeFinally.","ranges":[{"startOffset":4729,"endOffset":4841,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":4844,"endOffset":4989,"count":0}],"isBlockCoverage":false},{"functionName":"createReadStream","ranges":[{"startOffset":5364,"endOffset":5515,"count":0}],"isBlockCoverage":false},{"functionName":"createWriteStream","ranges":[{"startOffset":5764,"endOffset":5918,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5922,"endOffset":6321,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6325,"endOffset":6378,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6382,"endOffset":6469,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6473,"endOffset":6506,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6510,"endOffset":6726,"count":0}],"isBlockCoverage":false},{"functionName":"fsCall","ranges":[{"startOffset":6730,"endOffset":7190,"count":0}],"isBlockCoverage":false},{"functionName":"checkAborted","ranges":[{"startOffset":7192,"endOffset":7312,"count":3672},{"startOffset":7236,"endOffset":7245,"count":0},{"startOffset":7251,"endOffset":7310,"count":0}],"isBlockCoverage":true},{"functionName":"writeFileHandle","ranges":[{"startOffset":7314,"endOffset":8455,"count":0}],"isBlockCoverage":false},{"functionName":"readFileHandle","ranges":[{"startOffset":8457,"endOffset":10258,"count":917},{"startOffset":8781,"endOffset":8806,"count":0},{"startOffset":8839,"endOffset":8877,"count":0},{"startOffset":9004,"endOffset":9015,"count":0},{"startOffset":9053,"endOffset":9889,"count":921},{"startOffset":9145,"endOffset":9284,"count":0},{"startOffset":9559,"endOffset":9563,"count":0},{"startOffset":9663,"endOffset":9679,"count":0},{"startOffset":9681,"endOffset":9885,"count":0},{"startOffset":9988,"endOffset":10020,"count":0},{"startOffset":10025,"endOffset":10183,"count":0},{"startOffset":10211,"endOffset":10246,"count":0}],"isBlockCoverage":true},{"functionName":"access","ranges":[{"startOffset":10411,"endOffset":10632,"count":0}],"isBlockCoverage":false},{"functionName":"cp","ranges":[{"startOffset":10634,"endOffset":10903,"count":0}],"isBlockCoverage":false},{"functionName":"copyFile","ranges":[{"startOffset":10905,"endOffset":11263,"count":0}],"isBlockCoverage":false},{"functionName":"open","ranges":[{"startOffset":11383,"endOffset":11708,"count":917}],"isBlockCoverage":true},{"functionName":"read","ranges":[{"startOffset":11710,"endOffset":12932,"count":0}],"isBlockCoverage":false},{"functionName":"readv","ranges":[{"startOffset":12934,"endOffset":13254,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":13256,"endOffset":14463,"count":0}],"isBlockCoverage":false},{"functionName":"writev","ranges":[{"startOffset":14465,"endOffset":14873,"count":0}],"isBlockCoverage":false},{"functionName":"rename","ranges":[{"startOffset":14875,"endOffset":15181,"count":0}],"isBlockCoverage":false},{"functionName":"truncate","ranges":[{"startOffset":15183,"endOffset":15330,"count":0}],"isBlockCoverage":false},{"functionName":"ftruncate","ranges":[{"startOffset":15332,"endOffset":15491,"count":0}],"isBlockCoverage":false},{"functionName":"rm","ranges":[{"startOffset":15493,"endOffset":15697,"count":0}],"isBlockCoverage":false},{"functionName":"rmdir","ranges":[{"startOffset":15699,"endOffset":16070,"count":0}],"isBlockCoverage":false},{"functionName":"fdatasync","ranges":[{"startOffset":16072,"endOffset":16161,"count":0}],"isBlockCoverage":false},{"functionName":"fsync","ranges":[{"startOffset":16163,"endOffset":16244,"count":0}],"isBlockCoverage":false},{"functionName":"mkdir","ranges":[{"startOffset":16246,"endOffset":16722,"count":0}],"isBlockCoverage":false},{"functionName":"readdir","ranges":[{"startOffset":16724,"endOffset":17172,"count":0}],"isBlockCoverage":false},{"functionName":"readlink","ranges":[{"startOffset":17174,"endOffset":17413,"count":0}],"isBlockCoverage":false},{"functionName":"symlink","ranges":[{"startOffset":17415,"endOffset":17828,"count":0}],"isBlockCoverage":false},{"functionName":"fstat","ranges":[{"startOffset":17830,"endOffset":18008,"count":0}],"isBlockCoverage":false},{"functionName":"lstat","ranges":[{"startOffset":18010,"endOffset":18280,"count":0}],"isBlockCoverage":false},{"functionName":"stat","ranges":[{"startOffset":18282,"endOffset":18549,"count":0}],"isBlockCoverage":false},{"functionName":"link","ranges":[{"startOffset":18551,"endOffset":18874,"count":0}],"isBlockCoverage":false},{"functionName":"unlink","ranges":[{"startOffset":18876,"endOffset":19014,"count":0}],"isBlockCoverage":false},{"functionName":"fchmod","ranges":[{"startOffset":19016,"endOffset":19149,"count":0}],"isBlockCoverage":false},{"functionName":"chmod","ranges":[{"startOffset":19151,"endOffset":19337,"count":0}],"isBlockCoverage":false},{"functionName":"lchmod","ranges":[{"startOffset":19339,"endOffset":19581,"count":0}],"isBlockCoverage":false},{"functionName":"lchown","ranges":[{"startOffset":19583,"endOffset":19859,"count":0}],"isBlockCoverage":false},{"functionName":"fchown","ranges":[{"startOffset":19861,"endOffset":20058,"count":0}],"isBlockCoverage":false},{"functionName":"chown","ranges":[{"startOffset":20060,"endOffset":20333,"count":0}],"isBlockCoverage":false},{"functionName":"utimes","ranges":[{"startOffset":20335,"endOffset":20607,"count":0}],"isBlockCoverage":false},{"functionName":"futimes","ranges":[{"startOffset":20609,"endOffset":20808,"count":0}],"isBlockCoverage":false},{"functionName":"lutimes","ranges":[{"startOffset":20810,"endOffset":21087,"count":0}],"isBlockCoverage":false},{"functionName":"realpath","ranges":[{"startOffset":21089,"endOffset":21262,"count":0}],"isBlockCoverage":false},{"functionName":"mkdtemp","ranges":[{"startOffset":21264,"endOffset":21512,"count":0}],"isBlockCoverage":false},{"functionName":"writeFile","ranges":[{"startOffset":21514,"endOffset":22212,"count":0}],"isBlockCoverage":false},{"functionName":"isCustomIterable","ranges":[{"startOffset":22214,"endOffset":22328,"count":0}],"isBlockCoverage":false},{"functionName":"appendFile","ranges":[{"startOffset":22330,"endOffset":22571,"count":0}],"isBlockCoverage":false},{"functionName":"readFile","ranges":[{"startOffset":22573,"endOffset":22931,"count":917},{"startOffset":22690,"endOffset":22696,"count":0},{"startOffset":22737,"endOffset":22774,"count":0}],"isBlockCoverage":true}]},{"scriptId":"127","url":"node:internal/fs/rimraf","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7095,"count":1}],"isBlockCoverage":false},{"functionName":"rimraf","ranges":[{"startOffset":1174,"endOffset":1634,"count":0}],"isBlockCoverage":false},{"functionName":"_rimraf","ranges":[{"startOffset":1637,"endOffset":2495,"count":0}],"isBlockCoverage":false},{"functionName":"fixWinEPERM","ranges":[{"startOffset":2498,"endOffset":2933,"count":0}],"isBlockCoverage":false},{"functionName":"_rmdir","ranges":[{"startOffset":2936,"endOffset":3234,"count":0}],"isBlockCoverage":false},{"functionName":"_rmchildren","ranges":[{"startOffset":3237,"endOffset":3924,"count":0}],"isBlockCoverage":false},{"functionName":"rimrafPromises","ranges":[{"startOffset":3927,"endOffset":4125,"count":0}],"isBlockCoverage":false},{"functionName":"rimrafSync","ranges":[{"startOffset":4128,"endOffset":4811,"count":0}],"isBlockCoverage":false},{"functionName":"_unlinkSync","ranges":[{"startOffset":4814,"endOffset":5297,"count":0}],"isBlockCoverage":false},{"functionName":"_rmdirSync","ranges":[{"startOffset":5300,"endOffset":6585,"count":0}],"isBlockCoverage":false},{"functionName":"fixWinEPERMSync","ranges":[{"startOffset":6588,"endOffset":7035,"count":0}],"isBlockCoverage":false}]},{"scriptId":"128","url":"node:internal/modules/esm/translators","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10731,"count":1}],"isBlockCoverage":false},{"functionName":"lazyTypes","ranges":[{"startOffset":381,"endOffset":493,"count":1834},{"startOffset":427,"endOffset":441,"count":1833},{"startOffset":441,"endOffset":492,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1021,"endOffset":1046,"count":1}],"isBlockCoverage":true},{"functionName":"initCJSParse","ranges":[{"startOffset":1581,"endOffset":1979,"count":1},{"startOffset":1655,"endOffset":1730,"count":0},{"startOffset":1888,"endOffset":1973,"count":0}],"isBlockCoverage":true},{"functionName":"assertBufferSource","ranges":[{"startOffset":2113,"endOffset":2533,"count":1834},{"startOffset":2190,"endOffset":2217,"count":917},{"startOffset":2219,"endOffset":2236,"count":0},{"startOffset":2330,"endOffset":2355,"count":0},{"startOffset":2374,"endOffset":2453,"count":0},{"startOffset":2454,"endOffset":2458,"count":0}],"isBlockCoverage":true},{"functionName":"stringify","ranges":[{"startOffset":2535,"endOffset":2753,"count":917},{"startOffset":2594,"endOffset":2606,"count":0},{"startOffset":2690,"endOffset":2709,"count":1},{"startOffset":2710,"endOffset":2719,"count":916}],"isBlockCoverage":true},{"functionName":"errPath","ranges":[{"startOffset":2755,"endOffset":2900,"count":0}],"isBlockCoverage":false},{"functionName":"importModuleDynamically","ranges":[{"startOffset":2902,"endOffset":3040,"count":2036}],"isBlockCoverage":true},{"functionName":"moduleStrategy","ranges":[{"startOffset":3122,"endOffset":3570,"count":917}],"isBlockCoverage":true},{"functionName":"initializeImportMeta","ranges":[{"startOffset":3459,"endOffset":3515,"count":3}],"isBlockCoverage":true},{"functionName":"enrichCJSError","ranges":[{"startOffset":3737,"endOffset":4275,"count":0}],"isBlockCoverage":false},{"functionName":"commonjsStrategy","ranges":[{"startOffset":4406,"endOffset":5844,"count":2},{"startOffset":4648,"endOffset":4706,"count":0},{"startOffset":4725,"endOffset":4746,"count":1},{"startOffset":4871,"endOffset":4893,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4984,"endOffset":5840,"count":2},{"startOffset":5103,"endOffset":5217,"count":0},{"startOffset":5309,"endOffset":5399,"count":0},{"startOffset":5449,"endOffset":5796,"count":9},{"startOffset":5560,"endOffset":5569,"count":0},{"startOffset":5693,"endOffset":5749,"count":0}],"isBlockCoverage":true},{"functionName":"cjsPreparseModuleExports","ranges":[{"startOffset":5848,"endOffset":7368,"count":2},{"startOffset":5951,"endOffset":6076,"count":0},{"startOffset":6375,"endOffset":6423,"count":0},{"startOffset":6505,"endOffset":6510,"count":0},{"startOffset":6518,"endOffset":6567,"count":0},{"startOffset":6751,"endOffset":6848,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6884,"endOffset":7329,"count":0}],"isBlockCoverage":false},{"functionName":"builtinStrategy","ranges":[{"startOffset":7492,"endOffset":7875,"count":8},{"startOffset":7748,"endOffset":7800,"count":0}],"isBlockCoverage":true},{"functionName":"jsonStrategy","ranges":[{"startOffset":7939,"endOffset":9816,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":9882,"endOffset":10728,"count":0}],"isBlockCoverage":false}]},{"scriptId":"129","url":"node:internal/modules/esm/create_dynamic_module","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1756,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":190,"endOffset":215,"count":0}],"isBlockCoverage":false},{"functionName":"createImport","ranges":[{"startOffset":219,"endOffset":409,"count":0}],"isBlockCoverage":false},{"functionName":"createExport","ranges":[{"startOffset":411,"endOffset":612,"count":0}],"isBlockCoverage":false},{"functionName":"createDynamicModule","ranges":[{"startOffset":642,"endOffset":1715,"count":0}],"isBlockCoverage":false}]},{"scriptId":"130","url":"node:internal/vm/module","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12372,"count":1}],"isBlockCoverage":false},{"functionName":"Module","ranges":[{"startOffset":1729,"endOffset":3835,"count":0}],"isBlockCoverage":false},{"functionName":"get identifier","ranges":[{"startOffset":3839,"endOffset":3976,"count":0}],"isBlockCoverage":false},{"functionName":"get context","ranges":[{"startOffset":3980,"endOffset":4113,"count":0}],"isBlockCoverage":false},{"functionName":"get namespace","ranges":[{"startOffset":4117,"endOffset":4394,"count":0}],"isBlockCoverage":false},{"functionName":"get status","ranges":[{"startOffset":4398,"endOffset":4551,"count":0}],"isBlockCoverage":false},{"functionName":"get error","ranges":[{"startOffset":4555,"endOffset":4805,"count":0}],"isBlockCoverage":false},{"functionName":"link","ranges":[{"startOffset":4809,"endOffset":5214,"count":0}],"isBlockCoverage":false},{"functionName":"evaluate","ranges":[{"startOffset":5218,"endOffset":5970,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5974,"endOffset":6724,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6871,"endOffset":6907,"count":0}],"isBlockCoverage":false},{"functionName":"SourceTextModule","ranges":[{"startOffset":6912,"endOffset":9241,"count":0}],"isBlockCoverage":false},{"functionName":"get dependencySpecifiers","ranges":[{"startOffset":9245,"endOffset":9544,"count":0}],"isBlockCoverage":false},{"functionName":"get status","ranges":[{"startOffset":9548,"endOffset":9817,"count":0}],"isBlockCoverage":false},{"functionName":"get error","ranges":[{"startOffset":9821,"endOffset":10017,"count":0}],"isBlockCoverage":false},{"functionName":"createCachedData","ranges":[{"startOffset":10021,"endOffset":10283,"count":0}],"isBlockCoverage":false},{"functionName":"SyntheticModule","ranges":[{"startOffset":10328,"endOffset":11421,"count":0}],"isBlockCoverage":false},{"functionName":"setExport","ranges":[{"startOffset":11425,"endOffset":11727,"count":0}],"isBlockCoverage":false},{"functionName":"importModuleDynamicallyWrap","ranges":[{"startOffset":11731,"endOffset":12210,"count":172}],"isBlockCoverage":true},{"functionName":"importModuleDynamicallyWrapper","ranges":[{"startOffset":11836,"endOffset":12166,"count":0}],"isBlockCoverage":false},{"functionName":"getModuleFromWrap","ranges":[{"startOffset":12332,"endOffset":12367,"count":2039}],"isBlockCoverage":true}]},{"scriptId":"131","url":"node:internal/modules/run_main","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2700,"count":1}],"isBlockCoverage":false},{"functionName":"resolveMainPath","ranges":[{"startOffset":374,"endOffset":812,"count":1},{"startOffset":641,"endOffset":648,"count":0}],"isBlockCoverage":true},{"functionName":"shouldUseESMLoader","ranges":[{"startOffset":814,"endOffset":1564,"count":1},{"startOffset":1101,"endOffset":1113,"count":0},{"startOffset":1261,"endOffset":1273,"count":0},{"startOffset":1396,"endOffset":1457,"count":0},{"startOffset":1463,"endOffset":1561,"count":0}],"isBlockCoverage":true},{"functionName":"runMainESM","ranges":[{"startOffset":1566,"endOffset":1925,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1742,"endOffset":1920,"count":1},{"startOffset":1839,"endOffset":1849,"count":0}],"isBlockCoverage":true},{"functionName":"handleMainPromise","ranges":[{"startOffset":1927,"endOffset":2109,"count":1}],"isBlockCoverage":true},{"functionName":"executeUserEntryPoint","ranges":[{"startOffset":2295,"endOffset":2630,"count":1},{"startOffset":2505,"endOffset":2512,"count":0},{"startOffset":2518,"endOffset":2628,"count":0}],"isBlockCoverage":true}]},{"scriptId":"132","url":"file:///home/runner/work/abapGit/abapGit/output/index.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":305069,"count":1}],"isBlockCoverage":true},{"functionName":"run","ranges":[{"startOffset":258,"endOffset":304967,"count":1},{"startOffset":701,"endOffset":738,"count":0},{"startOffset":782,"endOffset":822,"count":0},{"startOffset":1138,"endOffset":1177,"count":0},{"startOffset":1223,"endOffset":1265,"count":0},{"startOffset":1601,"endOffset":1646,"count":0},{"startOffset":1698,"endOffset":1746,"count":0},{"startOffset":2061,"endOffset":2095,"count":0},{"startOffset":2136,"endOffset":2173,"count":0},{"startOffset":2490,"endOffset":2532,"count":0},{"startOffset":2581,"endOffset":2626,"count":0},{"startOffset":2941,"endOffset":2979,"count":0},{"startOffset":3081,"endOffset":3100,"count":0},{"startOffset":3339,"endOffset":3361,"count":0},{"startOffset":3471,"endOffset":3490,"count":0},{"startOffset":3687,"endOffset":3709,"count":0},{"startOffset":3819,"endOffset":3838,"count":0},{"startOffset":4035,"endOffset":4057,"count":0},{"startOffset":4167,"endOffset":4186,"count":0},{"startOffset":4383,"endOffset":4405,"count":0},{"startOffset":4515,"endOffset":4534,"count":0},{"startOffset":4731,"endOffset":4753,"count":0},{"startOffset":4863,"endOffset":4882,"count":0},{"startOffset":5079,"endOffset":5101,"count":0},{"startOffset":5211,"endOffset":5230,"count":0},{"startOffset":5469,"endOffset":5491,"count":0},{"startOffset":5601,"endOffset":5620,"count":0},{"startOffset":5856,"endOffset":5878,"count":0},{"startOffset":5988,"endOffset":6007,"count":0},{"startOffset":6204,"endOffset":6226,"count":0},{"startOffset":6279,"endOffset":6320,"count":0},{"startOffset":6618,"endOffset":6655,"count":0},{"startOffset":6967,"endOffset":6989,"count":0},{"startOffset":7351,"endOffset":7373,"count":0},{"startOffset":7714,"endOffset":7736,"count":0},{"startOffset":8077,"endOffset":8099,"count":0},{"startOffset":8437,"endOffset":8459,"count":0},{"startOffset":8803,"endOffset":8825,"count":0},{"startOffset":9163,"endOffset":9185,"count":0},{"startOffset":9520,"endOffset":9542,"count":0},{"startOffset":9877,"endOffset":9899,"count":0},{"startOffset":10255,"endOffset":10277,"count":0},{"startOffset":10760,"endOffset":10782,"count":0},{"startOffset":11111,"endOffset":11133,"count":0},{"startOffset":11185,"endOffset":11225,"count":0},{"startOffset":11535,"endOffset":11576,"count":0},{"startOffset":11681,"endOffset":11700,"count":0},{"startOffset":11938,"endOffset":11960,"count":0},{"startOffset":12073,"endOffset":12092,"count":0},{"startOffset":12327,"endOffset":12349,"count":0},{"startOffset":12462,"endOffset":12481,"count":0},{"startOffset":12695,"endOffset":12717,"count":0},{"startOffset":12830,"endOffset":12849,"count":0},{"startOffset":13060,"endOffset":13082,"count":0},{"startOffset":13195,"endOffset":13214,"count":0},{"startOffset":13440,"endOffset":13462,"count":0},{"startOffset":13575,"endOffset":13594,"count":0},{"startOffset":13802,"endOffset":13824,"count":0},{"startOffset":13937,"endOffset":13956,"count":0},{"startOffset":14176,"endOffset":14198,"count":0},{"startOffset":14311,"endOffset":14330,"count":0},{"startOffset":14526,"endOffset":14548,"count":0},{"startOffset":14604,"endOffset":14648,"count":0},{"startOffset":14943,"endOffset":14979,"count":0},{"startOffset":15079,"endOffset":15098,"count":0},{"startOffset":15316,"endOffset":15338,"count":0},{"startOffset":15446,"endOffset":15465,"count":0},{"startOffset":15671,"endOffset":15693,"count":0},{"startOffset":15801,"endOffset":15820,"count":0},{"startOffset":16056,"endOffset":16078,"count":0},{"startOffset":16186,"endOffset":16205,"count":0},{"startOffset":16447,"endOffset":16469,"count":0},{"startOffset":16520,"endOffset":16559,"count":0},{"startOffset":16857,"endOffset":16894,"count":0},{"startOffset":16995,"endOffset":17014,"count":0},{"startOffset":17218,"endOffset":17240,"count":0},{"startOffset":17349,"endOffset":17368,"count":0},{"startOffset":17584,"endOffset":17606,"count":0},{"startOffset":17715,"endOffset":17734,"count":0},{"startOffset":17929,"endOffset":17951,"count":0},{"startOffset":18060,"endOffset":18079,"count":0},{"startOffset":18295,"endOffset":18317,"count":0},{"startOffset":18426,"endOffset":18445,"count":0},{"startOffset":18658,"endOffset":18680,"count":0},{"startOffset":18789,"endOffset":18808,"count":0},{"startOffset":19024,"endOffset":19046,"count":0},{"startOffset":19155,"endOffset":19174,"count":0},{"startOffset":19387,"endOffset":19409,"count":0},{"startOffset":19518,"endOffset":19537,"count":0},{"startOffset":19735,"endOffset":19757,"count":0},{"startOffset":19866,"endOffset":19885,"count":0},{"startOffset":20077,"endOffset":20099,"count":0},{"startOffset":20208,"endOffset":20227,"count":0},{"startOffset":20467,"endOffset":20489,"count":0},{"startOffset":20598,"endOffset":20617,"count":0},{"startOffset":20818,"endOffset":20840,"count":0},{"startOffset":20949,"endOffset":20968,"count":0},{"startOffset":21184,"endOffset":21206,"count":0},{"startOffset":21258,"endOffset":21298,"count":0},{"startOffset":21599,"endOffset":21637,"count":0},{"startOffset":21739,"endOffset":21758,"count":0},{"startOffset":21975,"endOffset":21997,"count":0},{"startOffset":22107,"endOffset":22126,"count":0},{"startOffset":22379,"endOffset":22401,"count":0},{"startOffset":22511,"endOffset":22530,"count":0},{"startOffset":22747,"endOffset":22769,"count":0},{"startOffset":22879,"endOffset":22898,"count":0},{"startOffset":23115,"endOffset":23137,"count":0},{"startOffset":23247,"endOffset":23266,"count":0},{"startOffset":23534,"endOffset":23556,"count":0},{"startOffset":23666,"endOffset":23685,"count":0},{"startOffset":23932,"endOffset":23954,"count":0},{"startOffset":24064,"endOffset":24083,"count":0},{"startOffset":24327,"endOffset":24349,"count":0},{"startOffset":24459,"endOffset":24478,"count":0},{"startOffset":24713,"endOffset":24735,"count":0},{"startOffset":24845,"endOffset":24864,"count":0},{"startOffset":25096,"endOffset":25118,"count":0},{"startOffset":25228,"endOffset":25247,"count":0},{"startOffset":25479,"endOffset":25501,"count":0},{"startOffset":25611,"endOffset":25630,"count":0},{"startOffset":25880,"endOffset":25902,"count":0},{"startOffset":26012,"endOffset":26031,"count":0},{"startOffset":26257,"endOffset":26279,"count":0},{"startOffset":26389,"endOffset":26408,"count":0},{"startOffset":26649,"endOffset":26671,"count":0},{"startOffset":26781,"endOffset":26800,"count":0},{"startOffset":27068,"endOffset":27090,"count":0},{"startOffset":27200,"endOffset":27219,"count":0},{"startOffset":27481,"endOffset":27503,"count":0},{"startOffset":27613,"endOffset":27632,"count":0},{"startOffset":27897,"endOffset":27919,"count":0},{"startOffset":27972,"endOffset":28013,"count":0},{"startOffset":28311,"endOffset":28348,"count":0},{"startOffset":28449,"endOffset":28468,"count":0},{"startOffset":28672,"endOffset":28694,"count":0},{"startOffset":28803,"endOffset":28822,"count":0},{"startOffset":29026,"endOffset":29048,"count":0},{"startOffset":29157,"endOffset":29176,"count":0},{"startOffset":29389,"endOffset":29411,"count":0},{"startOffset":29520,"endOffset":29539,"count":0},{"startOffset":29737,"endOffset":29759,"count":0},{"startOffset":29868,"endOffset":29887,"count":0},{"startOffset":30121,"endOffset":30143,"count":0},{"startOffset":30252,"endOffset":30271,"count":0},{"startOffset":30469,"endOffset":30491,"count":0},{"startOffset":30600,"endOffset":30619,"count":0},{"startOffset":30838,"endOffset":30860,"count":0},{"startOffset":30969,"endOffset":30988,"count":0},{"startOffset":31228,"endOffset":31250,"count":0},{"startOffset":31359,"endOffset":31378,"count":0},{"startOffset":31606,"endOffset":31628,"count":0},{"startOffset":31737,"endOffset":31756,"count":0},{"startOffset":31975,"endOffset":31997,"count":0},{"startOffset":32106,"endOffset":32125,"count":0},{"startOffset":32320,"endOffset":32342,"count":0},{"startOffset":32451,"endOffset":32470,"count":0},{"startOffset":32665,"endOffset":32687,"count":0},{"startOffset":32796,"endOffset":32815,"count":0},{"startOffset":33037,"endOffset":33059,"count":0},{"startOffset":33168,"endOffset":33187,"count":0},{"startOffset":33409,"endOffset":33431,"count":0},{"startOffset":33540,"endOffset":33559,"count":0},{"startOffset":33790,"endOffset":33812,"count":0},{"startOffset":33921,"endOffset":33940,"count":0},{"startOffset":34153,"endOffset":34175,"count":0},{"startOffset":34284,"endOffset":34303,"count":0},{"startOffset":34516,"endOffset":34538,"count":0},{"startOffset":34647,"endOffset":34666,"count":0},{"startOffset":34864,"endOffset":34886,"count":0},{"startOffset":34995,"endOffset":35014,"count":0},{"startOffset":35212,"endOffset":35234,"count":0},{"startOffset":35343,"endOffset":35362,"count":0},{"startOffset":35563,"endOffset":35585,"count":0},{"startOffset":35694,"endOffset":35713,"count":0},{"startOffset":35929,"endOffset":35951,"count":0},{"startOffset":36060,"endOffset":36079,"count":0},{"startOffset":36283,"endOffset":36305,"count":0},{"startOffset":36414,"endOffset":36433,"count":0},{"startOffset":36649,"endOffset":36671,"count":0},{"startOffset":36780,"endOffset":36799,"count":0},{"startOffset":37015,"endOffset":37037,"count":0},{"startOffset":37146,"endOffset":37165,"count":0},{"startOffset":37426,"endOffset":37448,"count":0},{"startOffset":37557,"endOffset":37576,"count":0},{"startOffset":37831,"endOffset":37853,"count":0},{"startOffset":37962,"endOffset":37981,"count":0},{"startOffset":38170,"endOffset":38192,"count":0},{"startOffset":38301,"endOffset":38320,"count":0},{"startOffset":38527,"endOffset":38549,"count":0},{"startOffset":38658,"endOffset":38677,"count":0},{"startOffset":38890,"endOffset":38912,"count":0},{"startOffset":39021,"endOffset":39040,"count":0},{"startOffset":39292,"endOffset":39314,"count":0},{"startOffset":39366,"endOffset":39406,"count":0},{"startOffset":39701,"endOffset":39737,"count":0},{"startOffset":39837,"endOffset":39856,"count":0},{"startOffset":40050,"endOffset":40072,"count":0},{"startOffset":40180,"endOffset":40199,"count":0},{"startOffset":40408,"endOffset":40430,"count":0},{"startOffset":40538,"endOffset":40557,"count":0},{"startOffset":40769,"endOffset":40791,"count":0},{"startOffset":40899,"endOffset":40918,"count":0},{"startOffset":41121,"endOffset":41143,"count":0},{"startOffset":41251,"endOffset":41270,"count":0},{"startOffset":41509,"endOffset":41531,"count":0},{"startOffset":41639,"endOffset":41658,"count":0},{"startOffset":41858,"endOffset":41880,"count":0},{"startOffset":41988,"endOffset":42007,"count":0},{"startOffset":42210,"endOffset":42232,"count":0},{"startOffset":42340,"endOffset":42359,"count":0},{"startOffset":42559,"endOffset":42581,"count":0},{"startOffset":42632,"endOffset":42671,"count":0},{"startOffset":42972,"endOffset":43010,"count":0},{"startOffset":43112,"endOffset":43131,"count":0},{"startOffset":43336,"endOffset":43358,"count":0},{"startOffset":43468,"endOffset":43487,"count":0},{"startOffset":43713,"endOffset":43735,"count":0},{"startOffset":43845,"endOffset":43864,"count":0},{"startOffset":44090,"endOffset":44112,"count":0},{"startOffset":44222,"endOffset":44241,"count":0},{"startOffset":44461,"endOffset":44483,"count":0},{"startOffset":44593,"endOffset":44612,"count":0},{"startOffset":44835,"endOffset":44857,"count":0},{"startOffset":44967,"endOffset":44986,"count":0},{"startOffset":45224,"endOffset":45246,"count":0},{"startOffset":45356,"endOffset":45375,"count":0},{"startOffset":45610,"endOffset":45632,"count":0},{"startOffset":45742,"endOffset":45761,"count":0},{"startOffset":46020,"endOffset":46042,"count":0},{"startOffset":46152,"endOffset":46171,"count":0},{"startOffset":46373,"endOffset":46395,"count":0},{"startOffset":46505,"endOffset":46524,"count":0},{"startOffset":46723,"endOffset":46745,"count":0},{"startOffset":46855,"endOffset":46874,"count":0},{"startOffset":47079,"endOffset":47101,"count":0},{"startOffset":47211,"endOffset":47230,"count":0},{"startOffset":47453,"endOffset":47475,"count":0},{"startOffset":47585,"endOffset":47604,"count":0},{"startOffset":47800,"endOffset":47822,"count":0},{"startOffset":47875,"endOffset":47916,"count":0},{"startOffset":48214,"endOffset":48251,"count":0},{"startOffset":48352,"endOffset":48371,"count":0},{"startOffset":48581,"endOffset":48603,"count":0},{"startOffset":48712,"endOffset":48731,"count":0},{"startOffset":48938,"endOffset":48960,"count":0},{"startOffset":49069,"endOffset":49088,"count":0},{"startOffset":49298,"endOffset":49320,"count":0},{"startOffset":49372,"endOffset":49412,"count":0},{"startOffset":49710,"endOffset":49747,"count":0},{"startOffset":49848,"endOffset":49867,"count":0},{"startOffset":50077,"endOffset":50099,"count":0},{"startOffset":50208,"endOffset":50227,"count":0},{"startOffset":50434,"endOffset":50456,"count":0},{"startOffset":50565,"endOffset":50584,"count":0},{"startOffset":50809,"endOffset":50831,"count":0},{"startOffset":50940,"endOffset":50959,"count":0},{"startOffset":51181,"endOffset":51203,"count":0},{"startOffset":51312,"endOffset":51331,"count":0},{"startOffset":51529,"endOffset":51551,"count":0},{"startOffset":51603,"endOffset":51643,"count":0},{"startOffset":51944,"endOffset":51982,"count":0},{"startOffset":52084,"endOffset":52103,"count":0},{"startOffset":52311,"endOffset":52333,"count":0},{"startOffset":52443,"endOffset":52462,"count":0},{"startOffset":52673,"endOffset":52695,"count":0},{"startOffset":52805,"endOffset":52824,"count":0},{"startOffset":53035,"endOffset":53057,"count":0},{"startOffset":53167,"endOffset":53186,"count":0},{"startOffset":53415,"endOffset":53437,"count":0},{"startOffset":53547,"endOffset":53566,"count":0},{"startOffset":53780,"endOffset":53802,"count":0},{"startOffset":53855,"endOffset":53896,"count":0},{"startOffset":54219,"endOffset":54257,"count":0},{"startOffset":54359,"endOffset":54378,"count":0},{"startOffset":54624,"endOffset":54646,"count":0},{"startOffset":54756,"endOffset":54775,"count":0},{"startOffset":55015,"endOffset":55037,"count":0},{"startOffset":55147,"endOffset":55166,"count":0},{"startOffset":55388,"endOffset":55410,"count":0},{"startOffset":55520,"endOffset":55539,"count":0},{"startOffset":55782,"endOffset":55804,"count":0},{"startOffset":55914,"endOffset":55933,"count":0},{"startOffset":56188,"endOffset":56210,"count":0},{"startOffset":56320,"endOffset":56339,"count":0},{"startOffset":56576,"endOffset":56598,"count":0},{"startOffset":56708,"endOffset":56727,"count":0},{"startOffset":56946,"endOffset":56968,"count":0},{"startOffset":57021,"endOffset":57062,"count":0},{"startOffset":57379,"endOffset":57417,"count":0},{"startOffset":57519,"endOffset":57538,"count":0},{"startOffset":57775,"endOffset":57797,"count":0},{"startOffset":57907,"endOffset":57926,"count":0},{"startOffset":58133,"endOffset":58155,"count":0},{"startOffset":58265,"endOffset":58284,"count":0},{"startOffset":58491,"endOffset":58513,"count":0},{"startOffset":58623,"endOffset":58642,"count":0},{"startOffset":58888,"endOffset":58910,"count":0},{"startOffset":59020,"endOffset":59039,"count":0},{"startOffset":59285,"endOffset":59307,"count":0},{"startOffset":59417,"endOffset":59436,"count":0},{"startOffset":59679,"endOffset":59701,"count":0},{"startOffset":59811,"endOffset":59830,"count":0},{"startOffset":60040,"endOffset":60062,"count":0},{"startOffset":60172,"endOffset":60191,"count":0},{"startOffset":60401,"endOffset":60423,"count":0},{"startOffset":60533,"endOffset":60552,"count":0},{"startOffset":60792,"endOffset":60814,"count":0},{"startOffset":60924,"endOffset":60943,"count":0},{"startOffset":61171,"endOffset":61193,"count":0},{"startOffset":61303,"endOffset":61322,"count":0},{"startOffset":61550,"endOffset":61572,"count":0},{"startOffset":61682,"endOffset":61701,"count":0},{"startOffset":61938,"endOffset":61960,"count":0},{"startOffset":62070,"endOffset":62089,"count":0},{"startOffset":62320,"endOffset":62342,"count":0},{"startOffset":62452,"endOffset":62471,"count":0},{"startOffset":62696,"endOffset":62718,"count":0},{"startOffset":62828,"endOffset":62847,"count":0},{"startOffset":63072,"endOffset":63094,"count":0},{"startOffset":63147,"endOffset":63188,"count":0},{"startOffset":63487,"endOffset":63519,"count":0},{"startOffset":63615,"endOffset":63634,"count":0},{"startOffset":63874,"endOffset":63896,"count":0},{"startOffset":64000,"endOffset":64019,"count":0},{"startOffset":64250,"endOffset":64272,"count":0},{"startOffset":64376,"endOffset":64395,"count":0},{"startOffset":64596,"endOffset":64618,"count":0},{"startOffset":64665,"endOffset":64700,"count":0},{"startOffset":65005,"endOffset":65039,"count":0},{"startOffset":65137,"endOffset":65156,"count":0},{"startOffset":65359,"endOffset":65381,"count":0},{"startOffset":65430,"endOffset":65467,"count":0},{"startOffset":65772,"endOffset":65806,"count":0},{"startOffset":65904,"endOffset":65923,"count":0},{"startOffset":66126,"endOffset":66148,"count":0},{"startOffset":66197,"endOffset":66234,"count":0},{"startOffset":66552,"endOffset":66589,"count":0},{"startOffset":66633,"endOffset":66673,"count":0},{"startOffset":66988,"endOffset":67024,"count":0},{"startOffset":67124,"endOffset":67143,"count":0},{"startOffset":67356,"endOffset":67378,"count":0},{"startOffset":67486,"endOffset":67505,"count":0},{"startOffset":67736,"endOffset":67758,"count":0},{"startOffset":67866,"endOffset":67885,"count":0},{"startOffset":68119,"endOffset":68141,"count":0},{"startOffset":68249,"endOffset":68268,"count":0},{"startOffset":68484,"endOffset":68506,"count":0},{"startOffset":68614,"endOffset":68633,"count":0},{"startOffset":68846,"endOffset":68868,"count":0},{"startOffset":68976,"endOffset":68995,"count":0},{"startOffset":69205,"endOffset":69227,"count":0},{"startOffset":69278,"endOffset":69317,"count":0},{"startOffset":69659,"endOffset":69706,"count":0},{"startOffset":70087,"endOffset":70109,"count":0},{"startOffset":70171,"endOffset":70221,"count":0},{"startOffset":70496,"endOffset":70526,"count":0},{"startOffset":70620,"endOffset":70639,"count":0},{"startOffset":70856,"endOffset":70878,"count":0},{"startOffset":70923,"endOffset":70956,"count":0},{"startOffset":71246,"endOffset":71279,"count":0},{"startOffset":71376,"endOffset":71395,"count":0},{"startOffset":71603,"endOffset":71625,"count":0},{"startOffset":71730,"endOffset":71749,"count":0},{"startOffset":71960,"endOffset":71982,"count":0},{"startOffset":72087,"endOffset":72106,"count":0},{"startOffset":72326,"endOffset":72348,"count":0},{"startOffset":72453,"endOffset":72472,"count":0},{"startOffset":72713,"endOffset":72735,"count":0},{"startOffset":72840,"endOffset":72859,"count":0},{"startOffset":73112,"endOffset":73134,"count":0},{"startOffset":73239,"endOffset":73258,"count":0},{"startOffset":73499,"endOffset":73521,"count":0},{"startOffset":73626,"endOffset":73645,"count":0},{"startOffset":73898,"endOffset":73920,"count":0},{"startOffset":74025,"endOffset":74044,"count":0},{"startOffset":74270,"endOffset":74292,"count":0},{"startOffset":74397,"endOffset":74416,"count":0},{"startOffset":74675,"endOffset":74697,"count":0},{"startOffset":74802,"endOffset":74821,"count":0},{"startOffset":75035,"endOffset":75057,"count":0},{"startOffset":75162,"endOffset":75181,"count":0},{"startOffset":75407,"endOffset":75429,"count":0},{"startOffset":75534,"endOffset":75553,"count":0},{"startOffset":75779,"endOffset":75801,"count":0},{"startOffset":75849,"endOffset":75885,"count":0},{"startOffset":76174,"endOffset":76204,"count":0},{"startOffset":76544,"endOffset":76566,"count":0},{"startOffset":76884,"endOffset":76906,"count":0},{"startOffset":76951,"endOffset":76984,"count":0},{"startOffset":77285,"endOffset":77315,"count":0},{"startOffset":77409,"endOffset":77428,"count":0},{"startOffset":77625,"endOffset":77647,"count":0},{"startOffset":77749,"endOffset":77768,"count":0},{"startOffset":78034,"endOffset":78056,"count":0},{"startOffset":78158,"endOffset":78177,"count":0},{"startOffset":78443,"endOffset":78465,"count":0},{"startOffset":78567,"endOffset":78586,"count":0},{"startOffset":78852,"endOffset":78874,"count":0},{"startOffset":78919,"endOffset":78952,"count":0},{"startOffset":79249,"endOffset":79279,"count":0},{"startOffset":79599,"endOffset":79621,"count":0},{"startOffset":79985,"endOffset":80007,"count":0},{"startOffset":80371,"endOffset":80393,"count":0},{"startOffset":80438,"endOffset":80471,"count":0},{"startOffset":80781,"endOffset":80816,"count":0},{"startOffset":80915,"endOffset":80934,"count":0},{"startOffset":81166,"endOffset":81188,"count":0},{"startOffset":81295,"endOffset":81314,"count":0},{"startOffset":81534,"endOffset":81556,"count":0},{"startOffset":81606,"endOffset":81644,"count":0},{"startOffset":81964,"endOffset":82005,"count":0},{"startOffset":82110,"endOffset":82129,"count":0},{"startOffset":82372,"endOffset":82394,"count":0},{"startOffset":82507,"endOffset":82526,"count":0},{"startOffset":82775,"endOffset":82797,"count":0},{"startOffset":82910,"endOffset":82929,"count":0},{"startOffset":83163,"endOffset":83185,"count":0},{"startOffset":83241,"endOffset":83285,"count":0},{"startOffset":83612,"endOffset":83654,"count":0},{"startOffset":83760,"endOffset":83779,"count":0},{"startOffset":84010,"endOffset":84032,"count":0},{"startOffset":84089,"endOffset":84134,"count":0},{"startOffset":84409,"endOffset":84439,"count":0},{"startOffset":86543,"endOffset":86576,"count":0},{"startOffset":86886,"endOffset":86923,"count":0},{"startOffset":87163,"endOffset":87182,"count":0},{"startOffset":87383,"endOffset":87405,"count":0},{"startOffset":87457,"endOffset":87497,"count":0},{"startOffset":87786,"endOffset":87816,"count":0},{"startOffset":88168,"endOffset":88190,"count":0},{"startOffset":88514,"endOffset":88536,"count":0},{"startOffset":89072,"endOffset":89094,"count":0},{"startOffset":89448,"endOffset":89470,"count":0},{"startOffset":89515,"endOffset":89548,"count":0},{"startOffset":89861,"endOffset":89897,"count":0},{"startOffset":90246,"endOffset":90268,"count":0},{"startOffset":90613,"endOffset":90635,"count":0},{"startOffset":90989,"endOffset":91011,"count":0},{"startOffset":91365,"endOffset":91387,"count":0},{"startOffset":91765,"endOffset":91787,"count":0},{"startOffset":92165,"endOffset":92187,"count":0},{"startOffset":92238,"endOffset":92277,"count":0},{"startOffset":92627,"endOffset":92674,"count":0},{"startOffset":93053,"endOffset":93075,"count":0},{"startOffset":93483,"endOffset":93505,"count":0},{"startOffset":93913,"endOffset":93935,"count":0},{"startOffset":94340,"endOffset":94362,"count":0},{"startOffset":94788,"endOffset":94810,"count":0},{"startOffset":95230,"endOffset":95252,"count":0},{"startOffset":95672,"endOffset":95694,"count":0},{"startOffset":96105,"endOffset":96127,"count":0},{"startOffset":96189,"endOffset":96239,"count":0},{"startOffset":96586,"endOffset":96632,"count":0},{"startOffset":97006,"endOffset":97028,"count":0},{"startOffset":97410,"endOffset":97432,"count":0},{"startOffset":97814,"endOffset":97836,"count":0},{"startOffset":98218,"endOffset":98240,"count":0},{"startOffset":98622,"endOffset":98644,"count":0},{"startOffset":99026,"endOffset":99048,"count":0},{"startOffset":99430,"endOffset":99452,"count":0},{"startOffset":99834,"endOffset":99856,"count":0},{"startOffset":100238,"endOffset":100260,"count":0},{"startOffset":100642,"endOffset":100664,"count":0},{"startOffset":101046,"endOffset":101068,"count":0},{"startOffset":101450,"endOffset":101472,"count":0},{"startOffset":101854,"endOffset":101876,"count":0},{"startOffset":102258,"endOffset":102280,"count":0},{"startOffset":102662,"endOffset":102684,"count":0},{"startOffset":103066,"endOffset":103088,"count":0},{"startOffset":103470,"endOffset":103492,"count":0},{"startOffset":103874,"endOffset":103896,"count":0},{"startOffset":103957,"endOffset":104006,"count":0},{"startOffset":104295,"endOffset":104325,"count":0},{"startOffset":104362,"endOffset":104395,"count":0},{"startOffset":104702,"endOffset":104738,"count":0},{"startOffset":105063,"endOffset":105085,"count":0},{"startOffset":105472,"endOffset":105494,"count":0},{"startOffset":105881,"endOffset":105903,"count":0},{"startOffset":106275,"endOffset":106297,"count":0},{"startOffset":106663,"endOffset":106685,"count":0},{"startOffset":107030,"endOffset":107052,"count":0},{"startOffset":107406,"endOffset":107428,"count":0},{"startOffset":107794,"endOffset":107816,"count":0},{"startOffset":108176,"endOffset":108198,"count":0},{"startOffset":108249,"endOffset":108288,"count":0},{"startOffset":108613,"endOffset":108655,"count":0},{"startOffset":109001,"endOffset":109023,"count":0},{"startOffset":109530,"endOffset":109552,"count":0},{"startOffset":109903,"endOffset":109925,"count":0},{"startOffset":110258,"endOffset":110280,"count":0},{"startOffset":110616,"endOffset":110638,"count":0},{"startOffset":110983,"endOffset":111005,"count":0},{"startOffset":111380,"endOffset":111402,"count":0},{"startOffset":111900,"endOffset":111922,"count":0},{"startOffset":112279,"endOffset":112301,"count":0},{"startOffset":112658,"endOffset":112680,"count":0},{"startOffset":112737,"endOffset":112782,"count":0},{"startOffset":113097,"endOffset":113135,"count":0},{"startOffset":113462,"endOffset":113484,"count":0},{"startOffset":113819,"endOffset":113841,"count":0},{"startOffset":114176,"endOffset":114198,"count":0},{"startOffset":114551,"endOffset":114573,"count":0},{"startOffset":114905,"endOffset":114927,"count":0},{"startOffset":115259,"endOffset":115281,"count":0},{"startOffset":115613,"endOffset":115635,"count":0},{"startOffset":115985,"endOffset":116007,"count":0},{"startOffset":116336,"endOffset":116358,"count":0},{"startOffset":116687,"endOffset":116709,"count":0},{"startOffset":117038,"endOffset":117060,"count":0},{"startOffset":117113,"endOffset":117154,"count":0},{"startOffset":117502,"endOffset":117551,"count":0},{"startOffset":117900,"endOffset":117922,"count":0},{"startOffset":118279,"endOffset":118301,"count":0},{"startOffset":118655,"endOffset":118677,"count":0},{"startOffset":119031,"endOffset":119053,"count":0},{"startOffset":119404,"endOffset":119426,"count":0},{"startOffset":119777,"endOffset":119799,"count":0},{"startOffset":119863,"endOffset":119915,"count":0},{"startOffset":120260,"endOffset":120308,"count":0},{"startOffset":120652,"endOffset":120674,"count":0},{"startOffset":121023,"endOffset":121045,"count":0},{"startOffset":121391,"endOffset":121413,"count":0},{"startOffset":121476,"endOffset":121527,"count":0},{"startOffset":121853,"endOffset":121894,"count":0},{"startOffset":121999,"endOffset":122018,"count":0},{"startOffset":122246,"endOffset":122268,"count":0},{"startOffset":122381,"endOffset":122400,"count":0},{"startOffset":122661,"endOffset":122683,"count":0},{"startOffset":122796,"endOffset":122815,"count":0},{"startOffset":123088,"endOffset":123110,"count":0},{"startOffset":123223,"endOffset":123242,"count":0},{"startOffset":123500,"endOffset":123522,"count":0},{"startOffset":123635,"endOffset":123654,"count":0},{"startOffset":123882,"endOffset":123904,"count":0},{"startOffset":124017,"endOffset":124036,"count":0},{"startOffset":124297,"endOffset":124319,"count":0},{"startOffset":124432,"endOffset":124451,"count":0},{"startOffset":124724,"endOffset":124746,"count":0},{"startOffset":124859,"endOffset":124878,"count":0},{"startOffset":125136,"endOffset":125158,"count":0},{"startOffset":125271,"endOffset":125290,"count":0},{"startOffset":125518,"endOffset":125540,"count":0},{"startOffset":125653,"endOffset":125672,"count":0},{"startOffset":125933,"endOffset":125955,"count":0},{"startOffset":126068,"endOffset":126087,"count":0},{"startOffset":126360,"endOffset":126382,"count":0},{"startOffset":126495,"endOffset":126514,"count":0},{"startOffset":126772,"endOffset":126794,"count":0},{"startOffset":126907,"endOffset":126926,"count":0},{"startOffset":127130,"endOffset":127152,"count":0},{"startOffset":127265,"endOffset":127284,"count":0},{"startOffset":127494,"endOffset":127516,"count":0},{"startOffset":127629,"endOffset":127648,"count":0},{"startOffset":127894,"endOffset":127916,"count":0},{"startOffset":127972,"endOffset":128016,"count":0},{"startOffset":128316,"endOffset":128347,"count":0},{"startOffset":128442,"endOffset":128461,"count":0},{"startOffset":128717,"endOffset":128739,"count":0},{"startOffset":128842,"endOffset":128861,"count":0},{"startOffset":129075,"endOffset":129097,"count":0},{"startOffset":129200,"endOffset":129219,"count":0},{"startOffset":129478,"endOffset":129500,"count":0},{"startOffset":129603,"endOffset":129622,"count":0},{"startOffset":129830,"endOffset":129852,"count":0},{"startOffset":129955,"endOffset":129974,"count":0},{"startOffset":130236,"endOffset":130258,"count":0},{"startOffset":130304,"endOffset":130338,"count":0},{"startOffset":130625,"endOffset":130655,"count":0},{"startOffset":130749,"endOffset":130768,"count":0},{"startOffset":130982,"endOffset":131004,"count":0},{"startOffset":131106,"endOffset":131125,"count":0},{"startOffset":131354,"endOffset":131376,"count":0},{"startOffset":131421,"endOffset":131454,"count":0},{"startOffset":131771,"endOffset":131811,"count":0},{"startOffset":131915,"endOffset":131934,"count":0},{"startOffset":132170,"endOffset":132192,"count":0},{"startOffset":132304,"endOffset":132323,"count":0},{"startOffset":132559,"endOffset":132581,"count":0},{"startOffset":132693,"endOffset":132712,"count":0},{"startOffset":132942,"endOffset":132964,"count":0},{"startOffset":133076,"endOffset":133095,"count":0},{"startOffset":133349,"endOffset":133371,"count":0},{"startOffset":133483,"endOffset":133502,"count":0},{"startOffset":133756,"endOffset":133778,"count":0},{"startOffset":133890,"endOffset":133909,"count":0},{"startOffset":134163,"endOffset":134185,"count":0},{"startOffset":134240,"endOffset":134283,"count":0},{"startOffset":134615,"endOffset":134660,"count":0},{"startOffset":134769,"endOffset":134788,"count":0},{"startOffset":135038,"endOffset":135060,"count":0},{"startOffset":135177,"endOffset":135196,"count":0},{"startOffset":135446,"endOffset":135468,"count":0},{"startOffset":135585,"endOffset":135604,"count":0},{"startOffset":135854,"endOffset":135876,"count":0},{"startOffset":135993,"endOffset":136012,"count":0},{"startOffset":136262,"endOffset":136284,"count":0},{"startOffset":136401,"endOffset":136420,"count":0},{"startOffset":136670,"endOffset":136692,"count":0},{"startOffset":136809,"endOffset":136828,"count":0},{"startOffset":137078,"endOffset":137100,"count":0},{"startOffset":137217,"endOffset":137236,"count":0},{"startOffset":137486,"endOffset":137508,"count":0},{"startOffset":137625,"endOffset":137644,"count":0},{"startOffset":137894,"endOffset":137916,"count":0},{"startOffset":138033,"endOffset":138052,"count":0},{"startOffset":138302,"endOffset":138324,"count":0},{"startOffset":138384,"endOffset":138432,"count":0},{"startOffset":138715,"endOffset":138745,"count":0},{"startOffset":138839,"endOffset":138858,"count":0},{"startOffset":139049,"endOffset":139071,"count":0},{"startOffset":139173,"endOffset":139192,"count":0},{"startOffset":139383,"endOffset":139405,"count":0},{"startOffset":139507,"endOffset":139526,"count":0},{"startOffset":139717,"endOffset":139739,"count":0},{"startOffset":139784,"endOffset":139817,"count":0},{"startOffset":140133,"endOffset":140174,"count":0},{"startOffset":140279,"endOffset":140298,"count":0},{"startOffset":140533,"endOffset":140555,"count":0},{"startOffset":140668,"endOffset":140687,"count":0},{"startOffset":140922,"endOffset":140944,"count":0},{"startOffset":141057,"endOffset":141076,"count":0},{"startOffset":141314,"endOffset":141336,"count":0},{"startOffset":141449,"endOffset":141468,"count":0},{"startOffset":141706,"endOffset":141728,"count":0},{"startOffset":141841,"endOffset":141860,"count":0},{"startOffset":142098,"endOffset":142120,"count":0},{"startOffset":142233,"endOffset":142252,"count":0},{"startOffset":142490,"endOffset":142512,"count":0},{"startOffset":142625,"endOffset":142644,"count":0},{"startOffset":142885,"endOffset":142907,"count":0},{"startOffset":143020,"endOffset":143039,"count":0},{"startOffset":143280,"endOffset":143302,"count":0},{"startOffset":143415,"endOffset":143434,"count":0},{"startOffset":143678,"endOffset":143700,"count":0},{"startOffset":143813,"endOffset":143832,"count":0},{"startOffset":144076,"endOffset":144098,"count":0},{"startOffset":144211,"endOffset":144230,"count":0},{"startOffset":144477,"endOffset":144499,"count":0},{"startOffset":144612,"endOffset":144631,"count":0},{"startOffset":144884,"endOffset":144906,"count":0},{"startOffset":144962,"endOffset":145006,"count":0},{"startOffset":145289,"endOffset":145319,"count":0},{"startOffset":145413,"endOffset":145432,"count":0},{"startOffset":145623,"endOffset":145645,"count":0},{"startOffset":145747,"endOffset":145766,"count":0},{"startOffset":145981,"endOffset":146003,"count":0},{"startOffset":146105,"endOffset":146124,"count":0},{"startOffset":146336,"endOffset":146358,"count":0},{"startOffset":146460,"endOffset":146479,"count":0},{"startOffset":146682,"endOffset":146704,"count":0},{"startOffset":146806,"endOffset":146825,"count":0},{"startOffset":147025,"endOffset":147047,"count":0},{"startOffset":147149,"endOffset":147168,"count":0},{"startOffset":147380,"endOffset":147402,"count":0},{"startOffset":147504,"endOffset":147523,"count":0},{"startOffset":147726,"endOffset":147748,"count":0},{"startOffset":147850,"endOffset":147869,"count":0},{"startOffset":148072,"endOffset":148094,"count":0},{"startOffset":148139,"endOffset":148172,"count":0},{"startOffset":148509,"endOffset":148557,"count":0},{"startOffset":148900,"endOffset":148922,"count":0},{"startOffset":149273,"endOffset":149295,"count":0},{"startOffset":149646,"endOffset":149668,"count":0},{"startOffset":149731,"endOffset":149782,"count":0},{"startOffset":150062,"endOffset":150091,"count":0},{"startOffset":150184,"endOffset":150203,"count":0},{"startOffset":150405,"endOffset":150427,"count":0},{"startOffset":150471,"endOffset":150503,"count":0},{"startOffset":150804,"endOffset":150840,"count":0},{"startOffset":150940,"endOffset":150959,"count":0},{"startOffset":151162,"endOffset":151184,"count":0},{"startOffset":151292,"endOffset":151311,"count":0},{"startOffset":151514,"endOffset":151536,"count":0},{"startOffset":151644,"endOffset":151663,"count":0},{"startOffset":151869,"endOffset":151891,"count":0},{"startOffset":151999,"endOffset":152018,"count":0},{"startOffset":152224,"endOffset":152246,"count":0},{"startOffset":152354,"endOffset":152373,"count":0},{"startOffset":152588,"endOffset":152610,"count":0},{"startOffset":152661,"endOffset":152700,"count":0},{"startOffset":153020,"endOffset":153059,"count":0},{"startOffset":153401,"endOffset":153423,"count":0},{"startOffset":153797,"endOffset":153819,"count":0},{"startOffset":154166,"endOffset":154188,"count":0},{"startOffset":154535,"endOffset":154557,"count":0},{"startOffset":154898,"endOffset":154920,"count":0},{"startOffset":155246,"endOffset":155268,"count":0},{"startOffset":155322,"endOffset":155364,"count":0},{"startOffset":155662,"endOffset":155697,"count":0},{"startOffset":155796,"endOffset":155815,"count":0},{"startOffset":156017,"endOffset":156039,"count":0},{"startOffset":156146,"endOffset":156165,"count":0},{"startOffset":156364,"endOffset":156386,"count":0},{"startOffset":156436,"endOffset":156474,"count":0},{"startOffset":156794,"endOffset":156833,"count":0},{"startOffset":156936,"endOffset":156955,"count":0},{"startOffset":157160,"endOffset":157182,"count":0},{"startOffset":157293,"endOffset":157312,"count":0},{"startOffset":157535,"endOffset":157557,"count":0},{"startOffset":157668,"endOffset":157687,"count":0},{"startOffset":157913,"endOffset":157935,"count":0},{"startOffset":158046,"endOffset":158065,"count":0},{"startOffset":158285,"endOffset":158307,"count":0},{"startOffset":158418,"endOffset":158437,"count":0},{"startOffset":158639,"endOffset":158661,"count":0},{"startOffset":158772,"endOffset":158791,"count":0},{"startOffset":159035,"endOffset":159057,"count":0},{"startOffset":159111,"endOffset":159153,"count":0},{"startOffset":159455,"endOffset":159492,"count":0},{"startOffset":159593,"endOffset":159612,"count":0},{"startOffset":159869,"endOffset":159891,"count":0},{"startOffset":159943,"endOffset":159983,"count":0},{"startOffset":160283,"endOffset":160318,"count":0},{"startOffset":160639,"endOffset":160661,"count":0},{"startOffset":160996,"endOffset":161018,"count":0},{"startOffset":161368,"endOffset":161390,"count":0},{"startOffset":161440,"endOffset":161478,"count":0},{"startOffset":161842,"endOffset":161893,"count":0},{"startOffset":162008,"endOffset":162027,"count":0},{"startOffset":162278,"endOffset":162300,"count":0},{"startOffset":162423,"endOffset":162442,"count":0},{"startOffset":162687,"endOffset":162709,"count":0},{"startOffset":162832,"endOffset":162851,"count":0},{"startOffset":163096,"endOffset":163118,"count":0},{"startOffset":163241,"endOffset":163260,"count":0},{"startOffset":163511,"endOffset":163533,"count":0},{"startOffset":163656,"endOffset":163675,"count":0},{"startOffset":163899,"endOffset":163921,"count":0},{"startOffset":164044,"endOffset":164063,"count":0},{"startOffset":164332,"endOffset":164354,"count":0},{"startOffset":164420,"endOffset":164474,"count":0},{"startOffset":164821,"endOffset":164869,"count":0},{"startOffset":165214,"endOffset":165236,"count":0},{"startOffset":165592,"endOffset":165614,"count":0},{"startOffset":165677,"endOffset":165728,"count":0},{"startOffset":166050,"endOffset":166087,"count":0},{"startOffset":166444,"endOffset":166466,"count":0},{"startOffset":166855,"endOffset":166877,"count":0},{"startOffset":167239,"endOffset":167261,"count":0},{"startOffset":167629,"endOffset":167651,"count":0},{"startOffset":168031,"endOffset":168053,"count":0},{"startOffset":168436,"endOffset":168458,"count":0},{"startOffset":168817,"endOffset":168839,"count":0},{"startOffset":168891,"endOffset":168931,"count":0},{"startOffset":169262,"endOffset":169302,"count":0},{"startOffset":169650,"endOffset":169672,"count":0},{"startOffset":170037,"endOffset":170059,"count":0},{"startOffset":170114,"endOffset":170157,"count":0},{"startOffset":170445,"endOffset":170476,"count":0},{"startOffset":170571,"endOffset":170590,"count":0},{"startOffset":170813,"endOffset":170835,"count":0},{"startOffset":170938,"endOffset":170957,"count":0},{"startOffset":171177,"endOffset":171199,"count":0},{"startOffset":171302,"endOffset":171321,"count":0},{"startOffset":171511,"endOffset":171533,"count":0},{"startOffset":171636,"endOffset":171655,"count":0},{"startOffset":171857,"endOffset":171879,"count":0},{"startOffset":171982,"endOffset":172001,"count":0},{"startOffset":172212,"endOffset":172234,"count":0},{"startOffset":172280,"endOffset":172314,"count":0},{"startOffset":172662,"endOffset":172707,"count":0},{"startOffset":173078,"endOffset":173100,"count":0},{"startOffset":173497,"endOffset":173519,"count":0},{"startOffset":173895,"endOffset":173917,"count":0},{"startOffset":174290,"endOffset":174312,"count":0},{"startOffset":174709,"endOffset":174731,"count":0},{"startOffset":174791,"endOffset":174839,"count":0},{"startOffset":175132,"endOffset":175162,"count":0},{"startOffset":175256,"endOffset":175275,"count":0},{"startOffset":175531,"endOffset":175553,"count":0},{"startOffset":175655,"endOffset":175674,"count":0},{"startOffset":175930,"endOffset":175952,"count":0},{"startOffset":176054,"endOffset":176073,"count":0},{"startOffset":176329,"endOffset":176351,"count":0},{"startOffset":176453,"endOffset":176472,"count":0},{"startOffset":176728,"endOffset":176750,"count":0},{"startOffset":176795,"endOffset":176828,"count":0},{"startOffset":177153,"endOffset":177193,"count":0},{"startOffset":177297,"endOffset":177316,"count":0},{"startOffset":177559,"endOffset":177581,"count":0},{"startOffset":177693,"endOffset":177712,"count":0},{"startOffset":177964,"endOffset":177986,"count":0},{"startOffset":178098,"endOffset":178117,"count":0},{"startOffset":178384,"endOffset":178406,"count":0},{"startOffset":178518,"endOffset":178537,"count":0},{"startOffset":178807,"endOffset":178829,"count":0},{"startOffset":178884,"endOffset":178927,"count":0},{"startOffset":179276,"endOffset":179324,"count":0},{"startOffset":179436,"endOffset":179455,"count":0},{"startOffset":179703,"endOffset":179725,"count":0},{"startOffset":179845,"endOffset":179864,"count":0},{"startOffset":180151,"endOffset":180173,"count":0},{"startOffset":180293,"endOffset":180312,"count":0},{"startOffset":180599,"endOffset":180621,"count":0},{"startOffset":180741,"endOffset":180760,"count":0},{"startOffset":181047,"endOffset":181069,"count":0},{"startOffset":181132,"endOffset":181183,"count":0},{"startOffset":181483,"endOffset":181518,"count":0},{"startOffset":181617,"endOffset":181636,"count":0},{"startOffset":181854,"endOffset":181876,"count":0},{"startOffset":181983,"endOffset":182002,"count":0},{"startOffset":182229,"endOffset":182251,"count":0},{"startOffset":182301,"endOffset":182339,"count":0},{"startOffset":182614,"endOffset":182644,"count":0},{"startOffset":182738,"endOffset":182757,"count":0},{"startOffset":182947,"endOffset":182969,"count":0},{"startOffset":183071,"endOffset":183090,"count":0},{"startOffset":183271,"endOffset":183293,"count":0},{"startOffset":183395,"endOffset":183414,"count":0},{"startOffset":183625,"endOffset":183647,"count":0},{"startOffset":183749,"endOffset":183768,"count":0},{"startOffset":183979,"endOffset":184001,"count":0},{"startOffset":184046,"endOffset":184079,"count":0},{"startOffset":184354,"endOffset":184384,"count":0},{"startOffset":184678,"endOffset":184700,"count":0},{"startOffset":185032,"endOffset":185054,"count":0},{"startOffset":185350,"endOffset":185372,"count":0},{"startOffset":185668,"endOffset":185690,"count":0},{"startOffset":186001,"endOffset":186023,"count":0},{"startOffset":186334,"endOffset":186356,"count":0},{"startOffset":186667,"endOffset":186689,"count":0},{"startOffset":187000,"endOffset":187022,"count":0},{"startOffset":187333,"endOffset":187355,"count":0},{"startOffset":187663,"endOffset":187685,"count":0},{"startOffset":187730,"endOffset":187763,"count":0},{"startOffset":188103,"endOffset":188146,"count":0},{"startOffset":188253,"endOffset":188272,"count":0},{"startOffset":188539,"endOffset":188561,"count":0},{"startOffset":188676,"endOffset":188695,"count":0},{"startOffset":188968,"endOffset":188990,"count":0},{"startOffset":189105,"endOffset":189124,"count":0},{"startOffset":189382,"endOffset":189404,"count":0},{"startOffset":189519,"endOffset":189538,"count":0},{"startOffset":189811,"endOffset":189833,"count":0},{"startOffset":189948,"endOffset":189967,"count":0},{"startOffset":190243,"endOffset":190265,"count":0},{"startOffset":190380,"endOffset":190399,"count":0},{"startOffset":190669,"endOffset":190691,"count":0},{"startOffset":190806,"endOffset":190825,"count":0},{"startOffset":191080,"endOffset":191102,"count":0},{"startOffset":191217,"endOffset":191236,"count":0},{"startOffset":191488,"endOffset":191510,"count":0},{"startOffset":191625,"endOffset":191644,"count":0},{"startOffset":191917,"endOffset":191939,"count":0},{"startOffset":191997,"endOffset":192043,"count":0},{"startOffset":192361,"endOffset":192398,"count":0},{"startOffset":192442,"endOffset":192482,"count":0},{"startOffset":192794,"endOffset":192829,"count":0},{"startOffset":193159,"endOffset":193181,"count":0},{"startOffset":193519,"endOffset":193541,"count":0},{"startOffset":193879,"endOffset":193901,"count":0},{"startOffset":194239,"endOffset":194261,"count":0},{"startOffset":194596,"endOffset":194618,"count":0},{"startOffset":194959,"endOffset":194981,"count":0},{"startOffset":195346,"endOffset":195368,"count":0},{"startOffset":195730,"endOffset":195752,"count":0},{"startOffset":195802,"endOffset":195840,"count":0},{"startOffset":196163,"endOffset":196205,"count":0},{"startOffset":196311,"endOffset":196330,"count":0},{"startOffset":196529,"endOffset":196551,"count":0},{"startOffset":196608,"endOffset":196653,"count":0},{"startOffset":196979,"endOffset":197022,"count":0},{"startOffset":197129,"endOffset":197148,"count":0},{"startOffset":197375,"endOffset":197397,"count":0},{"startOffset":197455,"endOffset":197501,"count":0},{"startOffset":197826,"endOffset":197868,"count":0},{"startOffset":197974,"endOffset":197993,"count":0},{"startOffset":198253,"endOffset":198275,"count":0},{"startOffset":198389,"endOffset":198408,"count":0},{"startOffset":198644,"endOffset":198666,"count":0},{"startOffset":198780,"endOffset":198799,"count":0},{"startOffset":199047,"endOffset":199069,"count":0},{"startOffset":199126,"endOffset":199171,"count":0},{"startOffset":199511,"endOffset":199560,"count":0},{"startOffset":199772,"endOffset":199824,"count":0},{"startOffset":200167,"endOffset":200217,"count":0},{"startOffset":200439,"endOffset":200492,"count":0},{"startOffset":200779,"endOffset":200809,"count":0},{"startOffset":200903,"endOffset":200922,"count":0},{"startOffset":201112,"endOffset":201134,"count":0},{"startOffset":201179,"endOffset":201212,"count":0},{"startOffset":201517,"endOffset":201553,"count":0},{"startOffset":201653,"endOffset":201672,"count":0},{"startOffset":201913,"endOffset":201935,"count":0},{"startOffset":202043,"endOffset":202062,"count":0},{"startOffset":202300,"endOffset":202322,"count":0},{"startOffset":202373,"endOffset":202412,"count":0},{"startOffset":202685,"endOffset":202715,"count":0},{"startOffset":203014,"endOffset":203036,"count":0},{"startOffset":203355,"endOffset":203377,"count":0},{"startOffset":203705,"endOffset":203727,"count":0},{"startOffset":204046,"endOffset":204068,"count":0},{"startOffset":204417,"endOffset":204439,"count":0},{"startOffset":204743,"endOffset":204765,"count":0},{"startOffset":205069,"endOffset":205091,"count":0},{"startOffset":205389,"endOffset":205411,"count":0},{"startOffset":205456,"endOffset":205489,"count":0},{"startOffset":205809,"endOffset":205848,"count":0},{"startOffset":206980,"endOffset":207022,"count":0},{"startOffset":207322,"endOffset":207357,"count":0},{"startOffset":207687,"endOffset":207709,"count":0},{"startOffset":207759,"endOffset":207797,"count":0},{"startOffset":208097,"endOffset":208132,"count":0},{"startOffset":208231,"endOffset":208250,"count":0},{"startOffset":208513,"endOffset":208535,"count":0},{"startOffset":208642,"endOffset":208661,"count":0},{"startOffset":208900,"endOffset":208922,"count":0},{"startOffset":209029,"endOffset":209048,"count":0},{"startOffset":209287,"endOffset":209309,"count":0},{"startOffset":209359,"endOffset":209397,"count":0},{"startOffset":209672,"endOffset":209702,"count":0},{"startOffset":209796,"endOffset":209815,"count":0},{"startOffset":210014,"endOffset":210036,"count":0},{"startOffset":210138,"endOffset":210157,"count":0},{"startOffset":210341,"endOffset":210363,"count":0},{"startOffset":210408,"endOffset":210441,"count":0},{"startOffset":210746,"endOffset":210784,"count":0},{"startOffset":211115,"endOffset":211156,"count":0},{"startOffset":211452,"endOffset":211487,"count":0},{"startOffset":213414,"endOffset":213452,"count":0},{"startOffset":213781,"endOffset":213827,"count":0},{"startOffset":214252,"endOffset":214301,"count":0},{"startOffset":214621,"endOffset":214660,"count":0},{"startOffset":214996,"endOffset":215018,"count":0},{"startOffset":215359,"endOffset":215381,"count":0},{"startOffset":215746,"endOffset":215768,"count":0},{"startOffset":216133,"endOffset":216155,"count":0},{"startOffset":216532,"endOffset":216554,"count":0},{"startOffset":216916,"endOffset":216938,"count":0},{"startOffset":216992,"endOffset":217034,"count":0},{"startOffset":217331,"endOffset":217361,"count":0},{"startOffset":217455,"endOffset":217474,"count":0},{"startOffset":217735,"endOffset":217757,"count":0},{"startOffset":217859,"endOffset":217878,"count":0},{"startOffset":218139,"endOffset":218161,"count":0},{"startOffset":218206,"endOffset":218239,"count":0},{"startOffset":218543,"endOffset":218578,"count":0},{"startOffset":218913,"endOffset":218935,"count":0},{"startOffset":218985,"endOffset":219023,"count":0},{"startOffset":219336,"endOffset":219374,"count":0},{"startOffset":219476,"endOffset":219495,"count":0},{"startOffset":219739,"endOffset":219761,"count":0},{"startOffset":219871,"endOffset":219890,"count":0},{"startOffset":220146,"endOffset":220168,"count":0},{"startOffset":220278,"endOffset":220297,"count":0},{"startOffset":220544,"endOffset":220566,"count":0},{"startOffset":220676,"endOffset":220695,"count":0},{"startOffset":220930,"endOffset":220952,"count":0},{"startOffset":221005,"endOffset":221046,"count":0},{"startOffset":221321,"endOffset":221351,"count":0},{"startOffset":221445,"endOffset":221464,"count":0},{"startOffset":221654,"endOffset":221676,"count":0},{"startOffset":221778,"endOffset":221797,"count":0},{"startOffset":222023,"endOffset":222045,"count":0},{"startOffset":222147,"endOffset":222166,"count":0},{"startOffset":222362,"endOffset":222384,"count":0},{"startOffset":222486,"endOffset":222505,"count":0},{"startOffset":222704,"endOffset":222726,"count":0},{"startOffset":222828,"endOffset":222847,"count":0},{"startOffset":223091,"endOffset":223113,"count":0},{"startOffset":223158,"endOffset":223191,"count":0},{"startOffset":223481,"endOffset":223514,"count":0},{"startOffset":223611,"endOffset":223630,"count":0},{"startOffset":223826,"endOffset":223848,"count":0},{"startOffset":223953,"endOffset":223972,"count":0},{"startOffset":224195,"endOffset":224217,"count":0},{"startOffset":224322,"endOffset":224341,"count":0},{"startOffset":224558,"endOffset":224580,"count":0},{"startOffset":224685,"endOffset":224704,"count":0},{"startOffset":224900,"endOffset":224922,"count":0},{"startOffset":225027,"endOffset":225046,"count":0},{"startOffset":225272,"endOffset":225294,"count":0},{"startOffset":225342,"endOffset":225378,"count":0},{"startOffset":225710,"endOffset":225759,"count":0},{"startOffset":225872,"endOffset":225891,"count":0},{"startOffset":226103,"endOffset":226125,"count":0},{"startOffset":226246,"endOffset":226265,"count":0},{"startOffset":226540,"endOffset":226562,"count":0},{"startOffset":226626,"endOffset":226678,"count":0},{"startOffset":227033,"endOffset":227083,"count":0},{"startOffset":227197,"endOffset":227216,"count":0},{"startOffset":227442,"endOffset":227464,"count":0},{"startOffset":227586,"endOffset":227605,"count":0},{"startOffset":227867,"endOffset":227889,"count":0},{"startOffset":228011,"endOffset":228030,"count":0},{"startOffset":228262,"endOffset":228284,"count":0},{"startOffset":228406,"endOffset":228425,"count":0},{"startOffset":228693,"endOffset":228715,"count":0},{"startOffset":228780,"endOffset":228833,"count":0},{"startOffset":229158,"endOffset":229198,"count":0},{"startOffset":229302,"endOffset":229321,"count":0},{"startOffset":229519,"endOffset":229541,"count":0},{"startOffset":229653,"endOffset":229672,"count":0},{"startOffset":229903,"endOffset":229925,"count":0},{"startOffset":230037,"endOffset":230056,"count":0},{"startOffset":230308,"endOffset":230330,"count":0},{"startOffset":230442,"endOffset":230461,"count":0},{"startOffset":230689,"endOffset":230711,"count":0},{"startOffset":230766,"endOffset":230809,"count":0},{"startOffset":231158,"endOffset":231206,"count":0},{"startOffset":231318,"endOffset":231337,"count":0},{"startOffset":231567,"endOffset":231589,"count":0},{"startOffset":231652,"endOffset":231703,"count":0},{"startOffset":231992,"endOffset":232022,"count":0},{"startOffset":232116,"endOffset":232135,"count":0},{"startOffset":232326,"endOffset":232348,"count":0},{"startOffset":232450,"endOffset":232469,"count":0},{"startOffset":232669,"endOffset":232691,"count":0},{"startOffset":232793,"endOffset":232812,"count":0},{"startOffset":233015,"endOffset":233037,"count":0},{"startOffset":233139,"endOffset":233158,"count":0},{"startOffset":233370,"endOffset":233392,"count":0},{"startOffset":233494,"endOffset":233513,"count":0},{"startOffset":233752,"endOffset":233774,"count":0},{"startOffset":233876,"endOffset":233895,"count":0},{"startOffset":234116,"endOffset":234138,"count":0},{"startOffset":234240,"endOffset":234259,"count":0},{"startOffset":234483,"endOffset":234505,"count":0},{"startOffset":234550,"endOffset":234583,"count":0},{"startOffset":234913,"endOffset":234952,"count":0},{"startOffset":235614,"endOffset":235656,"count":0},{"startOffset":235983,"endOffset":236021,"count":0},{"startOffset":236678,"endOffset":236719,"count":0},{"startOffset":237052,"endOffset":237092,"count":0},{"startOffset":237759,"endOffset":237802,"count":0},{"startOffset":238114,"endOffset":238147,"count":0},{"startOffset":238489,"endOffset":238525,"count":0},{"startOffset":238861,"endOffset":238908,"count":0},{"startOffset":239292,"endOffset":239314,"count":0},{"startOffset":239658,"endOffset":239680,"count":0},{"startOffset":239742,"endOffset":239792,"count":0},{"startOffset":240092,"endOffset":240127,"count":0},{"startOffset":240570,"endOffset":240608,"count":0},{"startOffset":240893,"endOffset":240923,"count":0},{"startOffset":241082,"endOffset":241115,"count":0},{"startOffset":241446,"endOffset":241488,"count":0},{"startOffset":241537,"endOffset":241582,"count":0},{"startOffset":241898,"endOffset":241935,"count":0},{"startOffset":241979,"endOffset":242019,"count":0},{"startOffset":242344,"endOffset":242384,"count":0},{"startOffset":243163,"endOffset":243206,"count":0},{"startOffset":243521,"endOffset":243559,"count":0},{"startOffset":244226,"endOffset":244267,"count":0},{"startOffset":244581,"endOffset":244618,"count":0},{"startOffset":244719,"endOffset":244738,"count":0},{"startOffset":244953,"endOffset":244975,"count":0},{"startOffset":245027,"endOffset":245067,"count":0},{"startOffset":245363,"endOffset":245396,"count":0},{"startOffset":245493,"endOffset":245512,"count":0},{"startOffset":245708,"endOffset":245730,"count":0},{"startOffset":245835,"endOffset":245854,"count":0},{"startOffset":246050,"endOffset":246072,"count":0},{"startOffset":246177,"endOffset":246196,"count":0},{"startOffset":246392,"endOffset":246414,"count":0},{"startOffset":246519,"endOffset":246538,"count":0},{"startOffset":246764,"endOffset":246786,"count":0},{"startOffset":246834,"endOffset":246870,"count":0},{"startOffset":247204,"endOffset":247249,"count":0},{"startOffset":247607,"endOffset":247629,"count":0},{"startOffset":247689,"endOffset":247737,"count":0},{"startOffset":248068,"endOffset":248112,"count":0},{"startOffset":248465,"endOffset":248487,"count":0},{"startOffset":248845,"endOffset":248867,"count":0},{"startOffset":249225,"endOffset":249247,"count":0},{"startOffset":249306,"endOffset":249353,"count":0},{"startOffset":249666,"endOffset":249704,"count":0},{"startOffset":249806,"endOffset":249825,"count":0},{"startOffset":250045,"endOffset":250067,"count":0},{"startOffset":250177,"endOffset":250196,"count":0},{"startOffset":250416,"endOffset":250438,"count":0},{"startOffset":250548,"endOffset":250567,"count":0},{"startOffset":250787,"endOffset":250809,"count":0},{"startOffset":250919,"endOffset":250938,"count":0},{"startOffset":251158,"endOffset":251180,"count":0},{"startOffset":251290,"endOffset":251309,"count":0},{"startOffset":251529,"endOffset":251551,"count":0},{"startOffset":251661,"endOffset":251680,"count":0},{"startOffset":251900,"endOffset":251922,"count":0},{"startOffset":252032,"endOffset":252051,"count":0},{"startOffset":252271,"endOffset":252293,"count":0},{"startOffset":252403,"endOffset":252422,"count":0},{"startOffset":252642,"endOffset":252664,"count":0},{"startOffset":252717,"endOffset":252758,"count":0},{"startOffset":253092,"endOffset":253137,"count":0},{"startOffset":253483,"endOffset":253505,"count":0},{"startOffset":253859,"endOffset":253881,"count":0},{"startOffset":254235,"endOffset":254257,"count":0},{"startOffset":254317,"endOffset":254365,"count":0},{"startOffset":254694,"endOffset":254738,"count":0},{"startOffset":255114,"endOffset":255136,"count":0},{"startOffset":255508,"endOffset":255530,"count":0},{"startOffset":255941,"endOffset":255963,"count":0},{"startOffset":256335,"endOffset":256357,"count":0},{"startOffset":256708,"endOffset":256730,"count":0},{"startOffset":257099,"endOffset":257121,"count":0},{"startOffset":257526,"endOffset":257548,"count":0},{"startOffset":257929,"endOffset":257951,"count":0},{"startOffset":258010,"endOffset":258057,"count":0},{"startOffset":258368,"endOffset":258406,"count":0},{"startOffset":258508,"endOffset":258527,"count":0},{"startOffset":258743,"endOffset":258765,"count":0},{"startOffset":258875,"endOffset":258894,"count":0},{"startOffset":259110,"endOffset":259132,"count":0},{"startOffset":259242,"endOffset":259261,"count":0},{"startOffset":259477,"endOffset":259499,"count":0},{"startOffset":259609,"endOffset":259628,"count":0},{"startOffset":259844,"endOffset":259866,"count":0},{"startOffset":259976,"endOffset":259995,"count":0},{"startOffset":260211,"endOffset":260233,"count":0},{"startOffset":260343,"endOffset":260362,"count":0},{"startOffset":260578,"endOffset":260600,"count":0},{"startOffset":260710,"endOffset":260729,"count":0},{"startOffset":260945,"endOffset":260967,"count":0},{"startOffset":261077,"endOffset":261096,"count":0},{"startOffset":261312,"endOffset":261334,"count":0},{"startOffset":261444,"endOffset":261463,"count":0},{"startOffset":261679,"endOffset":261701,"count":0},{"startOffset":261754,"endOffset":261795,"count":0},{"startOffset":262075,"endOffset":262106,"count":0},{"startOffset":262201,"endOffset":262220,"count":0},{"startOffset":262418,"endOffset":262440,"count":0},{"startOffset":262543,"endOffset":262562,"count":0},{"startOffset":262793,"endOffset":262815,"count":0},{"startOffset":262918,"endOffset":262937,"count":0},{"startOffset":263165,"endOffset":263187,"count":0},{"startOffset":263233,"endOffset":263267,"count":0},{"startOffset":263607,"endOffset":263650,"count":0},{"startOffset":264037,"endOffset":264059,"count":0},{"startOffset":264469,"endOffset":264491,"count":0},{"startOffset":264901,"endOffset":264923,"count":0},{"startOffset":265327,"endOffset":265349,"count":0},{"startOffset":265759,"endOffset":265781,"count":0},{"startOffset":266200,"endOffset":266222,"count":0},{"startOffset":266623,"endOffset":266645,"count":0},{"startOffset":267061,"endOffset":267083,"count":0},{"startOffset":267499,"endOffset":267521,"count":0},{"startOffset":267937,"endOffset":267959,"count":0},{"startOffset":268375,"endOffset":268397,"count":0},{"startOffset":268813,"endOffset":268835,"count":0},{"startOffset":269242,"endOffset":269264,"count":0},{"startOffset":269671,"endOffset":269693,"count":0},{"startOffset":270097,"endOffset":270119,"count":0},{"startOffset":270177,"endOffset":270223,"count":0},{"startOffset":270569,"endOffset":270618,"count":0},{"startOffset":270833,"endOffset":270885,"count":0},{"startOffset":271234,"endOffset":271284,"count":0},{"startOffset":271509,"endOffset":271562,"count":0},{"startOffset":271835,"endOffset":271865,"count":0},{"startOffset":271959,"endOffset":271978,"count":0},{"startOffset":272173,"endOffset":272195,"count":0},{"startOffset":272297,"endOffset":272316,"count":0},{"startOffset":272514,"endOffset":272536,"count":0},{"startOffset":272638,"endOffset":272657,"count":0},{"startOffset":272855,"endOffset":272877,"count":0},{"startOffset":272979,"endOffset":272998,"count":0},{"startOffset":273196,"endOffset":273218,"count":0},{"startOffset":273320,"endOffset":273339,"count":0},{"startOffset":273537,"endOffset":273559,"count":0},{"startOffset":273661,"endOffset":273680,"count":0},{"startOffset":273878,"endOffset":273900,"count":0},{"startOffset":274002,"endOffset":274021,"count":0},{"startOffset":274228,"endOffset":274250,"count":0},{"startOffset":274352,"endOffset":274371,"count":0},{"startOffset":274578,"endOffset":274600,"count":0},{"startOffset":274702,"endOffset":274721,"count":0},{"startOffset":274928,"endOffset":274950,"count":0},{"startOffset":275052,"endOffset":275071,"count":0},{"startOffset":275278,"endOffset":275300,"count":0},{"startOffset":275402,"endOffset":275421,"count":0},{"startOffset":275643,"endOffset":275665,"count":0},{"startOffset":275767,"endOffset":275786,"count":0},{"startOffset":276032,"endOffset":276054,"count":0},{"startOffset":276156,"endOffset":276175,"count":0},{"startOffset":276373,"endOffset":276395,"count":0},{"startOffset":276497,"endOffset":276516,"count":0},{"startOffset":276723,"endOffset":276745,"count":0},{"startOffset":276847,"endOffset":276866,"count":0},{"startOffset":277073,"endOffset":277095,"count":0},{"startOffset":277197,"endOffset":277216,"count":0},{"startOffset":277423,"endOffset":277445,"count":0},{"startOffset":277490,"endOffset":277523,"count":0},{"startOffset":277833,"endOffset":277870,"count":0},{"startOffset":278071,"endOffset":278111,"count":0},{"startOffset":278403,"endOffset":278438,"count":0},{"startOffset":278537,"endOffset":278556,"count":0},{"startOffset":278791,"endOffset":278813,"count":0},{"startOffset":278920,"endOffset":278939,"count":0},{"startOffset":279183,"endOffset":279205,"count":0},{"startOffset":279312,"endOffset":279331,"count":0},{"startOffset":279551,"endOffset":279573,"count":0},{"startOffset":279623,"endOffset":279661,"count":0},{"startOffset":279951,"endOffset":279984,"count":0},{"startOffset":280081,"endOffset":280100,"count":0},{"startOffset":280329,"endOffset":280351,"count":0},{"startOffset":280456,"endOffset":280475,"count":0},{"startOffset":280671,"endOffset":280693,"count":0},{"startOffset":280798,"endOffset":280817,"count":0},{"startOffset":281019,"endOffset":281041,"count":0},{"startOffset":281089,"endOffset":281125,"count":0},{"startOffset":281395,"endOffset":281424,"count":0},{"startOffset":281920,"endOffset":281942,"count":0},{"startOffset":282129,"endOffset":282161,"count":0},{"startOffset":282443,"endOffset":282472,"count":0},{"startOffset":282805,"endOffset":282824,"count":0},{"startOffset":283012,"endOffset":283034,"count":0},{"startOffset":283135,"endOffset":283154,"count":0},{"startOffset":283354,"endOffset":283376,"count":0},{"startOffset":283541,"endOffset":283573,"count":0},{"startOffset":283878,"endOffset":283914,"count":0},{"startOffset":284267,"endOffset":284306,"count":0},{"startOffset":284593,"endOffset":284623,"count":0},{"startOffset":285466,"endOffset":285499,"count":0},{"startOffset":285774,"endOffset":285804,"count":0},{"startOffset":285898,"endOffset":285917,"count":0},{"startOffset":286101,"endOffset":286123,"count":0},{"startOffset":286225,"endOffset":286244,"count":0},{"startOffset":286455,"endOffset":286477,"count":0},{"startOffset":286579,"endOffset":286598,"count":0},{"startOffset":286812,"endOffset":286834,"count":0},{"startOffset":286936,"endOffset":286955,"count":0},{"startOffset":287145,"endOffset":287167,"count":0},{"startOffset":287269,"endOffset":287288,"count":0},{"startOffset":287499,"endOffset":287521,"count":0},{"startOffset":287566,"endOffset":287599,"count":0},{"startOffset":287890,"endOffset":287920,"count":0},{"startOffset":288243,"endOffset":288265,"count":0},{"startOffset":288596,"endOffset":288618,"count":0},{"startOffset":288946,"endOffset":288968,"count":0},{"startOffset":289013,"endOffset":289046,"count":0},{"startOffset":289337,"endOffset":289367,"count":0},{"startOffset":289461,"endOffset":289480,"count":0},{"startOffset":289678,"endOffset":289700,"count":0},{"startOffset":289802,"endOffset":289821,"count":0},{"startOffset":290019,"endOffset":290041,"count":0},{"startOffset":290086,"endOffset":290119,"count":0},{"startOffset":290408,"endOffset":290438,"count":0},{"startOffset":290532,"endOffset":290551,"count":0},{"startOffset":290739,"endOffset":290761,"count":0},{"startOffset":290806,"endOffset":290839,"count":0},{"startOffset":291131,"endOffset":291162,"count":0},{"startOffset":291257,"endOffset":291276,"count":0},{"startOffset":291468,"endOffset":291490,"count":0},{"startOffset":291593,"endOffset":291612,"count":0},{"startOffset":291837,"endOffset":291859,"count":0},{"startOffset":291962,"endOffset":291981,"count":0},{"startOffset":292194,"endOffset":292216,"count":0},{"startOffset":292319,"endOffset":292338,"count":0},{"startOffset":292551,"endOffset":292573,"count":0},{"startOffset":292619,"endOffset":292653,"count":0},{"startOffset":292947,"endOffset":292980,"count":0},{"startOffset":293077,"endOffset":293096,"count":0},{"startOffset":293433,"endOffset":293452,"count":0},{"startOffset":293777,"endOffset":293796,"count":0},{"startOffset":294100,"endOffset":294136,"count":0},{"startOffset":294545,"endOffset":294564,"count":0},{"startOffset":294877,"endOffset":294896,"count":0},{"startOffset":295209,"endOffset":295228,"count":0},{"startOffset":295541,"endOffset":295560,"count":0},{"startOffset":295873,"endOffset":295892,"count":0},{"startOffset":296205,"endOffset":296224,"count":0},{"startOffset":296537,"endOffset":296556,"count":0},{"startOffset":296869,"endOffset":296888,"count":0},{"startOffset":297144,"endOffset":297177,"count":0},{"startOffset":297501,"endOffset":297544,"count":0},{"startOffset":297733,"endOffset":297779,"count":0},{"startOffset":298082,"endOffset":298118,"count":0},{"startOffset":298218,"endOffset":298237,"count":0},{"startOffset":298459,"endOffset":298481,"count":0},{"startOffset":298589,"endOffset":298608,"count":0},{"startOffset":298830,"endOffset":298852,"count":0},{"startOffset":298960,"endOffset":298979,"count":0},{"startOffset":299201,"endOffset":299223,"count":0},{"startOffset":299331,"endOffset":299350,"count":0},{"startOffset":299572,"endOffset":299594,"count":0},{"startOffset":299702,"endOffset":299721,"count":0},{"startOffset":299943,"endOffset":299965,"count":0},{"startOffset":300016,"endOffset":300055,"count":0},{"startOffset":300484,"endOffset":300503,"count":0},{"startOffset":300851,"endOffset":300870,"count":0},{"startOffset":301200,"endOffset":301219,"count":0},{"startOffset":301579,"endOffset":301598,"count":0},{"startOffset":301970,"endOffset":301989,"count":0},{"startOffset":302322,"endOffset":302359,"count":0},{"startOffset":302656,"endOffset":302686,"count":0},{"startOffset":302780,"endOffset":302799,"count":0},{"startOffset":302997,"endOffset":303019,"count":0},{"startOffset":303064,"endOffset":303097,"count":0},{"startOffset":303396,"endOffset":303426,"count":0},{"startOffset":304081,"endOffset":304114,"count":0},{"startOffset":304425,"endOffset":304459,"count":0},{"startOffset":304649,"endOffset":304686,"count":0},{"startOffset":304819,"endOffset":304965,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":304980,"endOffset":305008,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":305016,"endOffset":305067,"count":0}],"isBlockCoverage":false}]},{"scriptId":"133","url":"node:internal/fs/streams","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13381,"count":1}],"isBlockCoverage":false},{"functionName":"_construct","ranges":[{"startOffset":1019,"endOffset":1922,"count":0}],"isBlockCoverage":false},{"functionName":"FileHandleOperations","ranges":[{"startOffset":2015,"endOffset":3013,"count":0}],"isBlockCoverage":false},{"functionName":"close","ranges":[{"startOffset":3016,"endOffset":3269,"count":0}],"isBlockCoverage":false},{"functionName":"importFd","ranges":[{"startOffset":3271,"endOffset":4268,"count":0}],"isBlockCoverage":false},{"functionName":"ReadStream","ranges":[{"startOffset":4270,"endOffset":6035,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":6224,"endOffset":6279,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":6283,"endOffset":6340,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6375,"endOffset":6400,"count":0}],"isBlockCoverage":false},{"functionName":"ReadStream._read","ranges":[{"startOffset":6576,"endOffset":7707,"count":0}],"isBlockCoverage":false},{"functionName":"ReadStream._destroy","ranges":[{"startOffset":7742,"endOffset":8303,"count":0}],"isBlockCoverage":false},{"functionName":"ReadStream.close","ranges":[{"startOffset":8335,"endOffset":8421,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":8501,"endOffset":8535,"count":0}],"isBlockCoverage":false},{"functionName":"WriteStream","ranges":[{"startOffset":8563,"endOffset":10378,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":10570,"endOffset":10625,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":10629,"endOffset":10686,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":10722,"endOffset":10747,"count":0}],"isBlockCoverage":false},{"functionName":"WriteStream._write","ranges":[{"startOffset":10929,"endOffset":11400,"count":0}],"isBlockCoverage":false},{"functionName":"WriteStream._writev","ranges":[{"startOffset":11435,"endOffset":12075,"count":0}],"isBlockCoverage":false},{"functionName":"WriteStream._destroy","ranges":[{"startOffset":12111,"endOffset":12672,"count":0}],"isBlockCoverage":false},{"functionName":"WriteStream.close","ranges":[{"startOffset":12705,"endOffset":13087,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":13269,"endOffset":13303,"count":0}],"isBlockCoverage":false}]},{"scriptId":"134","url":"node:internal/deps/cjs-module-lexer/dist/lexer","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":33616,"count":1}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":116,"endOffset":813,"count":2},{"startOffset":146,"endOffset":181,"count":0},{"startOffset":222,"endOffset":237,"count":0},{"startOffset":273,"endOffset":308,"count":0},{"startOffset":332,"endOffset":334,"count":0},{"startOffset":406,"endOffset":553,"count":0},{"startOffset":601,"endOffset":650,"count":0},{"startOffset":663,"endOffset":696,"count":0},{"startOffset":709,"endOffset":773,"count":16}],"isBlockCoverage":true},{"functionName":"B","ranges":[{"startOffset":813,"endOffset":1040,"count":16},{"startOffset":840,"endOffset":852,"count":12},{"startOffset":853,"endOffset":862,"count":12},{"startOffset":862,"endOffset":913,"count":4},{"startOffset":913,"endOffset":1023,"count":47},{"startOffset":958,"endOffset":1022,"count":0},{"startOffset":1023,"endOffset":1032,"count":4},{"startOffset":1032,"endOffset":1039,"count":0}],"isBlockCoverage":true},{"functionName":"E","ranges":[{"startOffset":1040,"endOffset":1141,"count":0}],"isBlockCoverage":false},{"functionName":"C","ranges":[{"startOffset":1141,"endOffset":1215,"count":2},{"startOffset":1192,"endOffset":1214,"count":8330}],"isBlockCoverage":true},{"functionName":"init","ranges":[{"startOffset":1221,"endOffset":33616,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1251,"endOffset":33611,"count":1},{"startOffset":33455,"endOffset":33524,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":33505,"endOffset":33523,"count":0}],"isBlockCoverage":false}]},{"scriptId":"136","url":"","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12,"count":1}],"isBlockCoverage":true}]},{"scriptId":"137","url":"","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16,"count":1}],"isBlockCoverage":true}]},{"scriptId":"138","url":"","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15,"count":1}],"isBlockCoverage":true}]},{"scriptId":"139","url":"file:///home/runner/work/abapGit/abapGit/output/init.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2458731,"count":1}],"isBlockCoverage":true},{"functionName":"initializeABAP","ranges":[{"startOffset":37917,"endOffset":2458731,"count":1}],"isBlockCoverage":true}]},{"scriptId":"140","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/index.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2998,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":512,"endOffset":562,"count":2}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1198,"endOffset":1252,"count":1}],"isBlockCoverage":true},{"functionName":"ABAP","ranges":[{"startOffset":1274,"endOffset":2941,"count":1},{"startOffset":2081,"endOffset":2096,"count":0},{"startOffset":2098,"endOffset":2159,"count":0},{"startOffset":2320,"endOffset":2336,"count":0},{"startOffset":2429,"endOffset":2480,"count":0},{"startOffset":2529,"endOffset":2579,"count":0}],"isBlockCoverage":true}]},{"scriptId":"141","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/context.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":554,"count":1}],"isBlockCoverage":true},{"functionName":"Context","ranges":[{"startOffset":123,"endOffset":272,"count":1}],"isBlockCoverage":true},{"functionName":"defaultDB","ranges":[{"startOffset":277,"endOffset":489,"count":142},{"startOffset":354,"endOffset":431,"count":0}],"isBlockCoverage":true}]},{"scriptId":"142","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/offset_length.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2645,"count":1}],"isBlockCoverage":true},{"functionName":"OffsetLength","ranges":[{"startOffset":169,"endOffset":943,"count":32228},{"startOffset":332,"endOffset":620,"count":28174},{"startOffset":447,"endOffset":532,"count":0},{"startOffset":561,"endOffset":610,"count":0},{"startOffset":649,"endOffset":937,"count":32222},{"startOffset":764,"endOffset":849,"count":0},{"startOffset":878,"endOffset":927,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":948,"endOffset":1048,"count":30}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":1053,"endOffset":2564,"count":32228},{"startOffset":1127,"endOffset":1163,"count":32222},{"startOffset":1163,"endOffset":1501,"count":6},{"startOffset":1208,"endOffset":1249,"count":0},{"startOffset":1301,"endOffset":1440,"count":0},{"startOffset":1558,"endOffset":1583,"count":0},{"startOffset":1653,"endOffset":1721,"count":32198},{"startOffset":1747,"endOffset":2053,"count":32222},{"startOffset":1859,"endOffset":1928,"count":0},{"startOffset":1976,"endOffset":2043,"count":0},{"startOffset":2078,"endOffset":2092,"count":32222},{"startOffset":2094,"endOffset":2197,"count":28168},{"startOffset":2197,"endOffset":2382,"count":4060},{"startOffset":2228,"endOffset":2288,"count":4054},{"startOffset":2288,"endOffset":2382,"count":6},{"startOffset":2463,"endOffset":2531,"count":32198}],"isBlockCoverage":true}]},{"scriptId":"143","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/index.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1606,"count":1},{"startOffset":407,"endOffset":488,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":88,"endOffset":405,"count":25},{"startOffset":232,"endOffset":247,"count":0},{"startOffset":264,"endOffset":284,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":327,"endOffset":354,"count":7338974}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":410,"endOffset":487,"count":0}],"isBlockCoverage":true},{"functionName":"__exportStar","ranges":[{"startOffset":541,"endOffset":692,"count":18},{"startOffset":585,"endOffset":690,"count":25}],"isBlockCoverage":true}]},{"scriptId":"144","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/abap_object.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1020,"count":1}],"isBlockCoverage":true},{"functionName":"ABAPObject","ranges":[{"startOffset":179,"endOffset":409,"count":110088},{"startOffset":264,"endOffset":272,"count":40983},{"startOffset":273,"endOffset":294,"count":69105},{"startOffset":355,"endOffset":363,"count":40983},{"startOffset":364,"endOffset":380,"count":69105}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":414,"endOffset":454,"count":218130}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":459,"endOffset":506,"count":111412}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":511,"endOffset":572,"count":9836}],"isBlockCoverage":true},{"functionName":"getRTTIName","ranges":[{"startOffset":577,"endOffset":628,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":633,"endOffset":945,"count":101686},{"startOffset":687,"endOffset":736,"count":49557},{"startOffset":736,"endOffset":918,"count":52129},{"startOffset":799,"endOffset":861,"count":0}],"isBlockCoverage":true}]},{"scriptId":"145","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/field_symbol.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3198,"count":1}],"isBlockCoverage":true},{"functionName":"FieldSymbol","ranges":[{"startOffset":327,"endOffset":442,"count":6579}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":447,"endOffset":540,"count":0}],"isBlockCoverage":false},{"functionName":"assign","ranges":[{"startOffset":545,"endOffset":600,"count":18235}],"isBlockCoverage":true},{"functionName":"setCasting","ranges":[{"startOffset":605,"endOffset":654,"count":11}],"isBlockCoverage":true},{"functionName":"unassign","ranges":[{"startOffset":659,"endOffset":711,"count":0}],"isBlockCoverage":false},{"functionName":"isAssigned","ranges":[{"startOffset":716,"endOffset":779,"count":69}],"isBlockCoverage":true},{"functionName":"getPointer","ranges":[{"startOffset":784,"endOffset":984,"count":22287},{"startOffset":825,"endOffset":949,"count":22},{"startOffset":949,"endOffset":983,"count":22265}],"isBlockCoverage":true},{"functionName":"dereference","ranges":[{"startOffset":989,"endOffset":1194,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":1219,"endOffset":1334,"count":36},{"startOffset":1306,"endOffset":1314,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1339,"endOffset":2432,"count":31639},{"startOffset":1397,"endOffset":2289,"count":22},{"startOffset":1447,"endOffset":2020,"count":2},{"startOffset":1539,"endOffset":1727,"count":0},{"startOffset":1901,"endOffset":1909,"count":0},{"startOffset":2020,"endOffset":2279,"count":20},{"startOffset":2182,"endOffset":2190,"count":0},{"startOffset":2289,"endOffset":2426,"count":31617},{"startOffset":2396,"endOffset":2404,"count":0}],"isBlockCoverage":true},{"functionName":"appendInitial","ranges":[{"startOffset":2437,"endOffset":2598,"count":39},{"startOffset":2566,"endOffset":2597,"count":0}],"isBlockCoverage":true},{"functionName":"array","ranges":[{"startOffset":2603,"endOffset":2740,"count":0}],"isBlockCoverage":false},{"functionName":"getArrayLength","ranges":[{"startOffset":2745,"endOffset":2900,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":2905,"endOffset":3040,"count":2799},{"startOffset":2988,"endOffset":2996,"count":0}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":3045,"endOffset":3120,"count":129}],"isBlockCoverage":true}]},{"scriptId":"146","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/table.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15321,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":671,"endOffset":907,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":998,"endOffset":1138,"count":1}],"isBlockCoverage":true},{"functionName":"LoopController","ranges":[{"startOffset":1228,"endOffset":1353,"count":4353}],"isBlockCoverage":true},{"functionName":"construct","ranges":[{"startOffset":1506,"endOffset":2276,"count":24438},{"startOffset":1602,"endOffset":1948,"count":353},{"startOffset":2054,"endOffset":2062,"count":738},{"startOffset":2063,"endOffset":2072,"count":23700},{"startOffset":2102,"endOffset":2182,"count":116},{"startOffset":2182,"endOffset":2270,"count":24322}],"isBlockCoverage":true},{"functionName":"HashedTable","ranges":[{"startOffset":2397,"endOffset":2923,"count":131},{"startOffset":2685,"endOffset":2693,"count":15},{"startOffset":2694,"endOffset":2714,"count":116},{"startOffset":2726,"endOffset":2797,"count":0},{"startOffset":2878,"endOffset":2886,"count":15},{"startOffset":2887,"endOffset":2916,"count":116}],"isBlockCoverage":true},{"functionName":"getArrayLength","ranges":[{"startOffset":2928,"endOffset":2999,"count":22}],"isBlockCoverage":true},{"functionName":"getKeyByName","ranges":[{"startOffset":3004,"endOffset":3243,"count":0}],"isBlockCoverage":false},{"functionName":"getSecondaryIndex","ranges":[{"startOffset":3248,"endOffset":3861,"count":0}],"isBlockCoverage":false},{"functionName":"buildHashFromData","ranges":[{"startOffset":3866,"endOffset":4704,"count":2487},{"startOffset":4012,"endOffset":4302,"count":1069},{"startOffset":4073,"endOffset":4157,"count":0},{"startOffset":4302,"endOffset":4667,"count":1418},{"startOffset":4465,"endOffset":4530,"count":0}],"isBlockCoverage":true},{"functionName":"deleteIndex","ranges":[{"startOffset":4709,"endOffset":4789,"count":0}],"isBlockCoverage":false},{"functionName":"deleteFrom","ranges":[{"startOffset":4794,"endOffset":4900,"count":0}],"isBlockCoverage":false},{"functionName":"buildHashFromSimple","ranges":[{"startOffset":4905,"endOffset":5752,"count":539},{"startOffset":5179,"endOffset":5236,"count":0},{"startOffset":5384,"endOffset":5488,"count":99},{"startOffset":5488,"endOffset":5660,"count":440}],"isBlockCoverage":true},{"functionName":"read","ranges":[{"startOffset":5757,"endOffset":5808,"count":539}],"isBlockCoverage":true},{"functionName":"insert","ranges":[{"startOffset":5813,"endOffset":6268,"count":2487},{"startOffset":5923,"endOffset":5985,"count":38},{"startOffset":5985,"endOffset":6262,"count":2449},{"startOffset":6108,"endOffset":6171,"count":0}],"isBlockCoverage":true},{"functionName":"array","ranges":[{"startOffset":6273,"endOffset":6448,"count":116},{"startOffset":6371,"endOffset":6422,"count":788}],"isBlockCoverage":true},{"functionName":"startLoop","ranges":[{"startOffset":6453,"endOffset":6587,"count":18}],"isBlockCoverage":true},{"functionName":"unregisterLoop","ranges":[{"startOffset":6592,"endOffset":6653,"count":18}],"isBlockCoverage":true},{"functionName":"insertIndex","ranges":[{"startOffset":6658,"endOffset":6744,"count":0}],"isBlockCoverage":false},{"functionName":"append","ranges":[{"startOffset":6749,"endOffset":6816,"count":0}],"isBlockCoverage":false},{"functionName":"getQualifiedName","ranges":[{"startOffset":6821,"endOffset":6882,"count":16}],"isBlockCoverage":true},{"functionName":"getOptions","ranges":[{"startOffset":6887,"endOffset":6936,"count":2092}],"isBlockCoverage":true},{"functionName":"getRowType","ranges":[{"startOffset":6941,"endOffset":6990,"count":3004}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":6995,"endOffset":7071,"count":68}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":7076,"endOffset":7402,"count":22},{"startOffset":7142,"endOffset":7171,"count":15},{"startOffset":7216,"endOffset":7263,"count":1023},{"startOffset":7298,"endOffset":7396,"count":0}],"isBlockCoverage":true},{"functionName":"getHeader","ranges":[{"startOffset":7407,"endOffset":7543,"count":0}],"isBlockCoverage":false},{"functionName":"getValue","ranges":[{"startOffset":7580,"endOffset":8616,"count":2449},{"startOffset":7683,"endOffset":7837,"count":0},{"startOffset":7881,"endOffset":8107,"count":0},{"startOffset":8152,"endOffset":8176,"count":0},{"startOffset":8177,"endOffset":8209,"count":0},{"startOffset":8210,"endOffset":8243,"count":0},{"startOffset":8244,"endOffset":8306,"count":0},{"startOffset":8308,"endOffset":8471,"count":0}],"isBlockCoverage":true},{"functionName":"Table","ranges":[{"startOffset":8672,"endOffset":9236,"count":27127},{"startOffset":8998,"endOffset":9006,"count":2805},{"startOffset":9007,"endOffset":9027,"count":24322},{"startOffset":9039,"endOffset":9110,"count":0},{"startOffset":9191,"endOffset":9199,"count":3920},{"startOffset":9200,"endOffset":9229,"count":23207}],"isBlockCoverage":true},{"functionName":"getArrayLength","ranges":[{"startOffset":9241,"endOffset":9299,"count":7373}],"isBlockCoverage":true},{"functionName":"getKeyByName","ranges":[{"startOffset":9304,"endOffset":9543,"count":223},{"startOffset":9417,"endOffset":9425,"count":0},{"startOffset":9468,"endOffset":9476,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9487,"endOffset":9535,"count":264}],"isBlockCoverage":true},{"functionName":"getSecondaryIndex","ranges":[{"startOffset":9548,"endOffset":10101,"count":151},{"startOffset":9629,"endOffset":9702,"count":79},{"startOffset":9702,"endOffset":9791,"count":72},{"startOffset":9791,"endOffset":9864,"count":0},{"startOffset":9864,"endOffset":10100,"count":72}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9964,"endOffset":10011,"count":144}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":10106,"endOffset":10167,"count":498}],"isBlockCoverage":true},{"functionName":"getOptions","ranges":[{"startOffset":10172,"endOffset":10221,"count":17037}],"isBlockCoverage":true},{"functionName":"startLoop","ranges":[{"startOffset":10226,"endOffset":10360,"count":4335}],"isBlockCoverage":true},{"functionName":"unregisterLoop","ranges":[{"startOffset":10365,"endOffset":10426,"count":4335}],"isBlockCoverage":true},{"functionName":"getRowType","ranges":[{"startOffset":10431,"endOffset":10480,"count":21531}],"isBlockCoverage":true},{"functionName":"array","ranges":[{"startOffset":10590,"endOffset":10632,"count":59006}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":10637,"endOffset":10713,"count":10952}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":10718,"endOffset":11471,"count":8236},{"startOffset":10844,"endOffset":10852,"count":0},{"startOffset":10880,"endOffset":10972,"count":0},{"startOffset":11028,"endOffset":11075,"count":44},{"startOffset":11077,"endOffset":11134,"count":0},{"startOffset":11220,"endOffset":11275,"count":44}],"isBlockCoverage":true},{"functionName":"getHeader","ranges":[{"startOffset":11476,"endOffset":11612,"count":0}],"isBlockCoverage":false},{"functionName":"insertIndex","ranges":[{"startOffset":11617,"endOffset":12565,"count":1821},{"startOffset":11753,"endOffset":11981,"count":38},{"startOffset":11829,"endOffset":11909,"count":0},{"startOffset":11981,"endOffset":12030,"count":1783},{"startOffset":12030,"endOffset":12080,"count":1782},{"startOffset":12080,"endOffset":12129,"count":1},{"startOffset":12129,"endOffset":12155,"count":1783},{"startOffset":12155,"endOffset":12203,"count":1196},{"startOffset":12203,"endOffset":12366,"count":587},{"startOffset":12250,"endOffset":12295,"count":538},{"startOffset":12295,"endOffset":12366,"count":49},{"startOffset":12366,"endOffset":12425,"count":1783},{"startOffset":12425,"endOffset":12539,"count":51},{"startOffset":12539,"endOffset":12564,"count":1783}],"isBlockCoverage":true},{"functionName":"deleteIndex","ranges":[{"startOffset":12608,"endOffset":13135,"count":2182},{"startOffset":12704,"endOffset":12735,"count":0},{"startOffset":12781,"endOffset":12855,"count":344},{"startOffset":12855,"endOffset":12995,"count":1838},{"startOffset":12886,"endOffset":12929,"count":1717},{"startOffset":12929,"endOffset":12995,"count":121},{"startOffset":13041,"endOffset":13129,"count":474},{"startOffset":13077,"endOffset":13119,"count":466}],"isBlockCoverage":true},{"functionName":"append","ranges":[{"startOffset":13140,"endOffset":13846,"count":49635},{"startOffset":13247,"endOffset":13458,"count":0},{"startOffset":13524,"endOffset":13712,"count":0}],"isBlockCoverage":true},{"functionName":"appendInitial","ranges":[{"startOffset":13851,"endOffset":14125,"count":4544}],"isBlockCoverage":true},{"functionName":"sort","ranges":[{"startOffset":14130,"endOffset":14189,"count":1832}],"isBlockCoverage":true},{"functionName":"getValue","ranges":[{"startOffset":14226,"endOffset":15262,"count":51417},{"startOffset":14329,"endOffset":14483,"count":0},{"startOffset":14527,"endOffset":14753,"count":720},{"startOffset":14753,"endOffset":15256,"count":50697},{"startOffset":14798,"endOffset":14822,"count":31127},{"startOffset":14823,"endOffset":14855,"count":31127},{"startOffset":14856,"endOffset":14889,"count":31127},{"startOffset":14890,"endOffset":14952,"count":31127},{"startOffset":14954,"endOffset":15117,"count":30393},{"startOffset":15117,"endOffset":15256,"count":20304}],"isBlockCoverage":true}]},{"scriptId":"147","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/integer.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1933,"count":1}],"isBlockCoverage":true},{"functionName":"Integer","ranges":[{"startOffset":333,"endOffset":479,"count":570296},{"startOffset":442,"endOffset":450,"count":394784},{"startOffset":451,"endOffset":472,"count":175512}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":484,"endOffset":545,"count":960}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":550,"endOffset":1779,"count":1079641},{"startOffset":602,"endOffset":657,"count":829143},{"startOffset":657,"endOffset":1752,"count":250498},{"startOffset":702,"endOffset":1112,"count":2019},{"startOffset":741,"endOffset":824,"count":0},{"startOffset":868,"endOffset":912,"count":1067},{"startOffset":912,"endOffset":1056,"count":952},{"startOffset":964,"endOffset":1056,"count":2},{"startOffset":1056,"endOffset":1112,"count":2017},{"startOffset":1112,"endOffset":1752,"count":248479},{"startOffset":1162,"endOffset":1223,"count":28623},{"startOffset":1223,"endOffset":1752,"count":219856},{"startOffset":1268,"endOffset":1305,"count":219833},{"startOffset":1307,"endOffset":1692,"count":2027},{"startOffset":1439,"endOffset":1464,"count":23},{"startOffset":1466,"endOffset":1655,"count":0},{"startOffset":1692,"endOffset":1752,"count":217829},{"startOffset":1752,"endOffset":1778,"count":1079637}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":1784,"endOffset":1823,"count":8068}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1828,"endOffset":1868,"count":849095}],"isBlockCoverage":true}]},{"scriptId":"148","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/throw_error.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":414,"count":1}],"isBlockCoverage":true},{"functionName":"throwError","ranges":[{"startOffset":106,"endOffset":341,"count":9},{"startOffset":263,"endOffset":339,"count":0}],"isBlockCoverage":true}]},{"scriptId":"149","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/float.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2132,"count":1}],"isBlockCoverage":true},{"functionName":"Float","ranges":[{"startOffset":525,"endOffset":671,"count":42091},{"startOffset":634,"endOffset":642,"count":33798},{"startOffset":643,"endOffset":664,"count":8293}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":676,"endOffset":737,"count":9}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":742,"endOffset":1421,"count":33810},{"startOffset":794,"endOffset":837,"count":33798},{"startOffset":837,"endOffset":1394,"count":12},{"startOffset":881,"endOffset":909,"count":6},{"startOffset":911,"endOffset":950,"count":0},{"startOffset":995,"endOffset":1394,"count":6},{"startOffset":1092,"endOffset":1144,"count":0},{"startOffset":1228,"endOffset":1334,"count":0}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":1426,"endOffset":1465,"count":10}],"isBlockCoverage":true},{"functionName":"getRaw","ranges":[{"startOffset":1470,"endOffset":1513,"count":33156}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1518,"endOffset":2073,"count":681},{"startOffset":1856,"endOffset":2067,"count":0}],"isBlockCoverage":true}]},{"scriptId":"150","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/hex.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2848,"count":1}],"isBlockCoverage":true},{"functionName":"Hex","ranges":[{"startOffset":240,"endOffset":437,"count":17509},{"startOffset":319,"endOffset":327,"count":15271},{"startOffset":328,"endOffset":342,"count":2238},{"startOffset":344,"endOffset":404,"count":2238},{"startOffset":381,"endOffset":389,"count":0},{"startOffset":405,"endOffset":408,"count":15271}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":442,"endOffset":1861,"count":14225},{"startOffset":494,"endOffset":537,"count":47},{"startOffset":537,"endOffset":1535,"count":14178},{"startOffset":582,"endOffset":1082,"count":2868},{"startOffset":668,"endOffset":753,"count":0},{"startOffset":792,"endOffset":910,"count":0},{"startOffset":1082,"endOffset":1535,"count":11310},{"startOffset":1179,"endOffset":1259,"count":17},{"startOffset":1259,"endOffset":1525,"count":11293},{"startOffset":1304,"endOffset":1348,"count":2841},{"startOffset":1348,"endOffset":1525,"count":8452},{"startOffset":1455,"endOffset":1511,"count":0},{"startOffset":1585,"endOffset":1660,"count":2},{"startOffset":1710,"endOffset":1787,"count":2}],"isBlockCoverage":true},{"functionName":"getLength","ranges":[{"startOffset":1866,"endOffset":1913,"count":49}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":1918,"endOffset":1983,"count":17524}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1988,"endOffset":2028,"count":47129}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":2033,"endOffset":2795,"count":0}],"isBlockCoverage":false}]},{"scriptId":"151","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/_parse.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1322,"count":1}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":185,"endOffset":1264,"count":257660},{"startOffset":240,"endOffset":267,"count":126959},{"startOffset":267,"endOffset":1262,"count":130701},{"startOffset":306,"endOffset":455,"count":24346},{"startOffset":339,"endOffset":386,"count":0},{"startOffset":455,"endOffset":1262,"count":106355},{"startOffset":499,"endOffset":535,"count":4504},{"startOffset":535,"endOffset":1262,"count":101851},{"startOffset":582,"endOffset":611,"count":101482},{"startOffset":613,"endOffset":1013,"count":386},{"startOffset":645,"endOffset":678,"count":0},{"startOffset":795,"endOffset":818,"count":17},{"startOffset":820,"endOffset":987,"count":0},{"startOffset":1013,"endOffset":1262,"count":101465},{"startOffset":1055,"endOffset":1085,"count":101464},{"startOffset":1087,"endOffset":1127,"count":2},{"startOffset":1127,"endOffset":1262,"count":101463},{"startOffset":1176,"endOffset":1212,"count":0}],"isBlockCoverage":true}]},{"scriptId":"152","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/xstring.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2476,"count":1}],"isBlockCoverage":true},{"functionName":"XString","ranges":[{"startOffset":252,"endOffset":399,"count":18487},{"startOffset":362,"endOffset":370,"count":9847},{"startOffset":371,"endOffset":392,"count":8640}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":404,"endOffset":465,"count":7}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":470,"endOffset":1564,"count":42997},{"startOffset":522,"endOffset":697,"count":27322},{"startOffset":697,"endOffset":1537,"count":15675},{"startOffset":742,"endOffset":918,"count":0},{"startOffset":1015,"endOffset":1095,"count":0},{"startOffset":1157,"endOffset":1218,"count":33},{"startOffset":1218,"endOffset":1527,"count":15642},{"startOffset":1263,"endOffset":1465,"count":4000},{"startOffset":1465,"endOffset":1527,"count":11642}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":1569,"endOffset":1609,"count":2084}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1614,"endOffset":1654,"count":32261}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":1659,"endOffset":2411,"count":9183},{"startOffset":1725,"endOffset":1733,"count":0},{"startOffset":1750,"endOffset":1823,"count":7870},{"startOffset":1871,"endOffset":1879,"count":0},{"startOffset":1896,"endOffset":1969,"count":6845},{"startOffset":2047,"endOffset":2055,"count":0},{"startOffset":2072,"endOffset":2157,"count":6860},{"startOffset":2206,"endOffset":2214,"count":0},{"startOffset":2246,"endOffset":2334,"count":6845}],"isBlockCoverage":true}]},{"scriptId":"153","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/character.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3694,"count":1}],"isBlockCoverage":true},{"functionName":"Character","ranges":[{"startOffset":384,"endOffset":788,"count":412032},{"startOffset":473,"endOffset":477,"count":93241},{"startOffset":524,"endOffset":622,"count":0},{"startOffset":658,"endOffset":732,"count":0}],"isBlockCoverage":true},{"functionName":"setConstant","ranges":[{"startOffset":793,"endOffset":865,"count":10}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":870,"endOffset":2037,"count":331144},{"startOffset":919,"endOffset":980,"count":0},{"startOffset":1019,"endOffset":1047,"count":93711},{"startOffset":1049,"endOffset":1092,"count":237433},{"startOffset":1092,"endOffset":1769,"count":93711},{"startOffset":1155,"endOffset":1354,"count":14},{"startOffset":1207,"endOffset":1277,"count":0},{"startOffset":1354,"endOffset":1769,"count":93697},{"startOffset":1412,"endOffset":1492,"count":125},{"startOffset":1492,"endOffset":1769,"count":93572},{"startOffset":1546,"endOffset":1701,"count":79},{"startOffset":1614,"endOffset":1619,"count":0},{"startOffset":1701,"endOffset":1769,"count":93493},{"startOffset":1769,"endOffset":1815,"count":331005},{"startOffset":1815,"endOffset":1886,"count":17977},{"startOffset":1886,"endOffset":2010,"count":313028},{"startOffset":1937,"endOffset":2010,"count":16692},{"startOffset":2010,"endOffset":2036,"count":331005}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":2042,"endOffset":2172,"count":928},{"startOffset":2138,"endOffset":2146,"count":169},{"startOffset":2147,"endOffset":2165,"count":759}],"isBlockCoverage":true},{"functionName":"getConversionExit","ranges":[{"startOffset":2177,"endOffset":2309,"count":808},{"startOffset":2274,"endOffset":2282,"count":109},{"startOffset":2283,"endOffset":2302,"count":699}],"isBlockCoverage":true},{"functionName":"getDDICName","ranges":[{"startOffset":2314,"endOffset":2434,"count":808},{"startOffset":2405,"endOffset":2413,"count":109},{"startOffset":2414,"endOffset":2427,"count":699}],"isBlockCoverage":true},{"functionName":"getLength","ranges":[{"startOffset":2439,"endOffset":2486,"count":113489}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":2491,"endOffset":2552,"count":431908}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":2557,"endOffset":2597,"count":209971}],"isBlockCoverage":true},{"functionName":"getTrimEnd","ranges":[{"startOffset":2602,"endOffset":2791,"count":171611},{"startOffset":2664,"endOffset":2729,"count":12932},{"startOffset":2729,"endOffset":2785,"count":158679}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":2796,"endOffset":3623,"count":615},{"startOffset":2871,"endOffset":2879,"count":0},{"startOffset":2916,"endOffset":2977,"count":514},{"startOffset":3034,"endOffset":3042,"count":0},{"startOffset":3079,"endOffset":3140,"count":341},{"startOffset":3161,"endOffset":3185,"count":513},{"startOffset":3210,"endOffset":3223,"count":513},{"startOffset":3248,"endOffset":3261,"count":341},{"startOffset":3264,"endOffset":3347,"count":0},{"startOffset":3398,"endOffset":3447,"count":513},{"startOffset":3482,"endOffset":3534,"count":341}],"isBlockCoverage":true}]},{"scriptId":"154","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/structure.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3949,"count":1}],"isBlockCoverage":true},{"functionName":"Structure","ranges":[{"startOffset":392,"endOffset":778,"count":81067},{"startOffset":567,"endOffset":575,"count":41712},{"startOffset":576,"endOffset":605,"count":39355},{"startOffset":672,"endOffset":680,"count":78269},{"startOffset":681,"endOffset":705,"count":2798}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":783,"endOffset":928,"count":5924},{"startOffset":829,"endOffset":901,"count":25497}],"isBlockCoverage":true},{"functionName":"getDDICName","ranges":[{"startOffset":933,"endOffset":984,"count":594}],"isBlockCoverage":true},{"functionName":"getRenamingSuffix","ranges":[{"startOffset":989,"endOffset":1044,"count":0}],"isBlockCoverage":false},{"functionName":"getAsInclude","ranges":[{"startOffset":1049,"endOffset":1102,"count":2813}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":1107,"endOffset":1168,"count":93837}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":1173,"endOffset":2248,"count":17698},{"startOffset":1219,"endOffset":1250,"count":0},{"startOffset":1308,"endOffset":1361,"count":989},{"startOffset":1361,"endOffset":2221,"count":16709},{"startOffset":1411,"endOffset":1482,"count":0},{"startOffset":1528,"endOffset":2158,"count":16589},{"startOffset":1801,"endOffset":1963,"count":70342},{"startOffset":2158,"endOffset":2221,"count":120}],"isBlockCoverage":true},{"functionName":"setCharacter","ranges":[{"startOffset":2253,"endOffset":2641,"count":120},{"startOffset":2456,"endOffset":2635,"count":333}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":2646,"endOffset":2686,"count":542192}],"isBlockCoverage":true},{"functionName":"getCharacter","ranges":[{"startOffset":2691,"endOffset":3001,"count":205},{"startOffset":2766,"endOffset":2975,"count":858},{"startOffset":2820,"endOffset":2888,"count":0}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":3006,"endOffset":3878,"count":0}],"isBlockCoverage":false}]},{"scriptId":"155","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/clone.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1094,"count":1}],"isBlockCoverage":true},{"functionName":"clone","ranges":[{"startOffset":137,"endOffset":1037,"count":510812},{"startOffset":206,"endOffset":233,"count":0},{"startOffset":277,"endOffset":394,"count":18935},{"startOffset":394,"endOffset":589,"count":491877},{"startOffset":446,"endOffset":589,"count":2883},{"startOffset":589,"endOffset":676,"count":488994},{"startOffset":676,"endOffset":1018,"count":1129314},{"startOffset":867,"endOffset":922,"count":743335},{"startOffset":922,"endOffset":1002,"count":385979},{"startOffset":1018,"endOffset":1036,"count":488994}],"isBlockCoverage":true}]},{"scriptId":"156","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/string.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3116,"count":1}],"isBlockCoverage":true},{"functionName":"String","ranges":[{"startOffset":471,"endOffset":618,"count":407199},{"startOffset":581,"endOffset":589,"count":187186},{"startOffset":590,"endOffset":611,"count":220013}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":623,"endOffset":684,"count":1326}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":689,"endOffset":2140,"count":308304},{"startOffset":759,"endOffset":940,"count":1458},{"startOffset":811,"endOffset":881,"count":0},{"startOffset":940,"endOffset":2113,"count":306846},{"startOffset":985,"endOffset":1028,"count":156557},{"startOffset":1028,"endOffset":2113,"count":150289},{"startOffset":1073,"endOffset":1127,"count":2},{"startOffset":1127,"endOffset":2113,"count":150287},{"startOffset":1185,"endOffset":1316,"count":15326},{"startOffset":1316,"endOffset":2113,"count":134961},{"startOffset":1374,"endOffset":1442,"count":63},{"startOffset":1442,"endOffset":2113,"count":134898},{"startOffset":1494,"endOffset":1675,"count":0},{"startOffset":1729,"endOffset":1886,"count":0},{"startOffset":1936,"endOffset":2045,"count":0},{"startOffset":2113,"endOffset":2139,"count":306846}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":2145,"endOffset":2185,"count":15406}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":2190,"endOffset":2230,"count":598293}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":2235,"endOffset":3054,"count":53349},{"startOffset":2310,"endOffset":2318,"count":0},{"startOffset":2355,"endOffset":2416,"count":44417},{"startOffset":2473,"endOffset":2481,"count":0},{"startOffset":2518,"endOffset":2579,"count":28430},{"startOffset":2600,"endOffset":2629,"count":42654},{"startOffset":2654,"endOffset":2667,"count":42654},{"startOffset":2692,"endOffset":2705,"count":28403},{"startOffset":2708,"endOffset":2791,"count":0},{"startOffset":2842,"endOffset":2891,"count":42654},{"startOffset":2926,"endOffset":2978,"count":28522}],"isBlockCoverage":true}]},{"scriptId":"157","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/packed.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1869,"count":1}],"isBlockCoverage":true},{"functionName":"Packed","ranges":[{"startOffset":259,"endOffset":713,"count":147},{"startOffset":378,"endOffset":386,"count":8},{"startOffset":387,"endOffset":401,"count":139},{"startOffset":403,"endOffset":454,"count":139},{"startOffset":529,"endOffset":537,"count":8},{"startOffset":538,"endOffset":554,"count":139},{"startOffset":556,"endOffset":611,"count":66},{"startOffset":676,"endOffset":684,"count":8},{"startOffset":685,"endOffset":706,"count":139}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":718,"endOffset":779,"count":27}],"isBlockCoverage":true},{"functionName":"round","ranges":[{"startOffset":784,"endOffset":903,"count":29}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":908,"endOffset":1610,"count":134},{"startOffset":960,"endOffset":1003,"count":52},{"startOffset":1003,"endOffset":1583,"count":82},{"startOffset":1048,"endOffset":1394,"count":29},{"startOffset":1093,"endOffset":1169,"count":0},{"startOffset":1221,"endOffset":1313,"count":0},{"startOffset":1394,"endOffset":1583,"count":53},{"startOffset":1444,"endOffset":1523,"count":0}],"isBlockCoverage":true},{"functionName":"getLength","ranges":[{"startOffset":1615,"endOffset":1662,"count":27}],"isBlockCoverage":true},{"functionName":"getDecimals","ranges":[{"startOffset":1667,"endOffset":1718,"count":51}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":1723,"endOffset":1762,"count":26}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1767,"endOffset":1807,"count":140}],"isBlockCoverage":true}]},{"scriptId":"158","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/data_reference.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2894,"count":1}],"isBlockCoverage":true},{"functionName":"DataReference","ranges":[{"startOffset":272,"endOffset":357,"count":6837}],"isBlockCoverage":true},{"functionName":"getType","ranges":[{"startOffset":362,"endOffset":405,"count":2893}],"isBlockCoverage":true},{"functionName":"assign","ranges":[{"startOffset":410,"endOffset":465,"count":7357}],"isBlockCoverage":true},{"functionName":"unassign","ranges":[{"startOffset":470,"endOffset":522,"count":4}],"isBlockCoverage":true},{"functionName":"getPointer","ranges":[{"startOffset":527,"endOffset":576,"count":8324}],"isBlockCoverage":true},{"functionName":"dereference","ranges":[{"startOffset":581,"endOffset":631,"count":834}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":656,"endOffset":740,"count":4}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":745,"endOffset":968,"count":4580},{"startOffset":804,"endOffset":858,"count":0},{"startOffset":942,"endOffset":950,"count":0}],"isBlockCoverage":true},{"functionName":"array","ranges":[{"startOffset":973,"endOffset":1110,"count":0}],"isBlockCoverage":false},{"functionName":"getArrayLength","ranges":[{"startOffset":1115,"endOffset":1270,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":1275,"endOffset":2040,"count":2857},{"startOffset":1431,"endOffset":2039,"count":0}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":2045,"endOffset":2810,"count":0}],"isBlockCoverage":false}]},{"scriptId":"159","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/insert_internal.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6658,"count":1}],"isBlockCoverage":true},{"functionName":"insertInternal","ranges":[{"startOffset":305,"endOffset":6573,"count":11695},{"startOffset":422,"endOffset":598,"count":231},{"startOffset":478,"endOffset":540,"count":0},{"startOffset":598,"endOffset":830,"count":11464},{"startOffset":657,"endOffset":830,"count":47},{"startOffset":712,"endOffset":774,"count":0},{"startOffset":959,"endOffset":967,"count":0},{"startOffset":1021,"endOffset":1029,"count":0},{"startOffset":1084,"endOffset":1259,"count":10300},{"startOffset":1143,"endOffset":1151,"count":0},{"startOffset":1205,"endOffset":1213,"count":0},{"startOffset":1315,"endOffset":1348,"count":1464},{"startOffset":1348,"endOffset":3524,"count":10231},{"startOffset":1372,"endOffset":3524,"count":1395},{"startOffset":1439,"endOffset":1459,"count":526},{"startOffset":1460,"endOffset":1490,"count":869},{"startOffset":2379,"endOffset":2387,"count":0},{"startOffset":2413,"endOffset":3518,"count":1383},{"startOffset":2548,"endOffset":2556,"count":0},{"startOffset":2624,"endOffset":2976,"count":526},{"startOffset":2797,"endOffset":2962,"count":514},{"startOffset":2976,"endOffset":3175,"count":857},{"startOffset":3387,"endOffset":3508,"count":6},{"startOffset":3524,"endOffset":3588,"count":11689},{"startOffset":3588,"endOffset":3706,"count":0},{"startOffset":3706,"endOffset":3736,"count":11689},{"startOffset":3738,"endOffset":3938,"count":934},{"startOffset":3878,"endOffset":3932,"count":0},{"startOffset":3938,"endOffset":5810,"count":10755},{"startOffset":3974,"endOffset":4075,"count":8442},{"startOffset":4028,"endOffset":4074,"count":0},{"startOffset":4077,"endOffset":4537,"count":8442},{"startOffset":4137,"endOffset":4399,"count":0},{"startOffset":4465,"endOffset":4521,"count":20316},{"startOffset":4537,"endOffset":5810,"count":2313},{"startOffset":4577,"endOffset":4982,"count":0},{"startOffset":5041,"endOffset":5048,"count":1464},{"startOffset":5050,"endOffset":5396,"count":1464},{"startOffset":5156,"endOffset":5210,"count":17},{"startOffset":5246,"endOffset":5304,"count":0},{"startOffset":5396,"endOffset":5810,"count":849},{"startOffset":5656,"endOffset":5710,"count":2},{"startOffset":5746,"endOffset":5804,"count":113},{"startOffset":5810,"endOffset":5886,"count":10225},{"startOffset":5886,"endOffset":5936,"count":1389},{"startOffset":5938,"endOffset":6571,"count":1389},{"startOffset":6053,"endOffset":6061,"count":0},{"startOffset":6115,"endOffset":6123,"count":0},{"startOffset":6166,"endOffset":6174,"count":0},{"startOffset":6296,"endOffset":6304,"count":0},{"startOffset":6324,"endOffset":6359,"count":202},{"startOffset":6361,"endOffset":6393,"count":1},{"startOffset":6427,"endOffset":6495,"count":1388},{"startOffset":6495,"endOffset":6565,"count":1}],"isBlockCoverage":true},{"functionName":"compare","ranges":[{"startOffset":1514,"endOffset":2307,"count":690},{"startOffset":1631,"endOffset":1639,"count":0},{"startOffset":1693,"endOffset":1701,"count":0},{"startOffset":1718,"endOffset":1723,"count":0},{"startOffset":1725,"endOffset":2272,"count":970},{"startOffset":1766,"endOffset":2061,"count":4},{"startOffset":1982,"endOffset":2043,"count":2},{"startOffset":2061,"endOffset":2258,"count":966},{"startOffset":2179,"endOffset":2240,"count":682},{"startOffset":2272,"endOffset":2306,"count":6}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":2844,"endOffset":2875,"count":1131}],"isBlockCoverage":true},{"functionName":"compare","ranges":[{"startOffset":3022,"endOffset":3160,"count":893}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6184,"endOffset":6251,"count":2588}],"isBlockCoverage":true}]},{"scriptId":"160","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/index.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1806,"count":1},{"startOffset":407,"endOffset":488,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":88,"endOffset":405,"count":22},{"startOffset":232,"endOffset":247,"count":0},{"startOffset":264,"endOffset":284,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":327,"endOffset":354,"count":404020}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":410,"endOffset":487,"count":0}],"isBlockCoverage":true},{"functionName":"__exportStar","ranges":[{"startOffset":541,"endOffset":692,"count":21},{"startOffset":585,"endOffset":690,"count":22}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1730,"endOffset":1768,"count":0}],"isBlockCoverage":false}]},{"scriptId":"161","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/assigned.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":225,"count":1}],"isBlockCoverage":true},{"functionName":"assigned","ranges":[{"startOffset":104,"endOffset":159,"count":68}],"isBlockCoverage":true}]},{"scriptId":"162","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/between.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":329,"count":1}],"isBlockCoverage":true},{"functionName":"between","ranges":[{"startOffset":163,"endOffset":266,"count":0}],"isBlockCoverage":false}]},{"scriptId":"163","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/ge.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":262,"count":1}],"isBlockCoverage":true},{"functionName":"ge","ranges":[{"startOffset":123,"endOffset":214,"count":10837},{"startOffset":185,"endOffset":211,"count":9509}],"isBlockCoverage":true}]},{"scriptId":"164","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/le.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":262,"count":1}],"isBlockCoverage":true},{"functionName":"le","ranges":[{"startOffset":123,"endOffset":214,"count":1385},{"startOffset":185,"endOffset":211,"count":1357}],"isBlockCoverage":true}]},{"scriptId":"165","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/ca.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1207,"count":1}],"isBlockCoverage":true},{"functionName":"ca","ranges":[{"startOffset":135,"endOffset":1159,"count":12183},{"startOffset":207,"endOffset":259,"count":0},{"startOffset":311,"endOffset":363,"count":0},{"startOffset":442,"endOffset":478,"count":0},{"startOffset":527,"endOffset":567,"count":0},{"startOffset":638,"endOffset":662,"count":591},{"startOffset":714,"endOffset":751,"count":0},{"startOffset":893,"endOffset":1077,"count":134217},{"startOffset":940,"endOffset":1054,"count":8076},{"startOffset":1054,"endOffset":1077,"count":126141},{"startOffset":1077,"endOffset":1158,"count":4107}],"isBlockCoverage":true}]},{"scriptId":"166","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/cn.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":252,"count":1}],"isBlockCoverage":true},{"functionName":"cn","ranges":[{"startOffset":128,"endOffset":204,"count":18}],"isBlockCoverage":true}]},{"scriptId":"167","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/co.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1000,"count":1}],"isBlockCoverage":true},{"functionName":"co","ranges":[{"startOffset":135,"endOffset":952,"count":733},{"startOffset":240,"endOffset":276,"count":25},{"startOffset":276,"endOffset":328,"count":708},{"startOffset":380,"endOffset":417,"count":25},{"startOffset":417,"endOffset":596,"count":708},{"startOffset":467,"endOffset":543,"count":420},{"startOffset":543,"endOffset":596,"count":288},{"startOffset":685,"endOffset":871,"count":939},{"startOffset":733,"endOffset":848,"count":361},{"startOffset":848,"endOffset":871,"count":578},{"startOffset":871,"endOffset":951,"count":372}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":512,"endOffset":526,"count":1569}],"isBlockCoverage":true}]},{"scriptId":"168","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/cp.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1467,"count":1}],"isBlockCoverage":true},{"functionName":"cp","ranges":[{"startOffset":135,"endOffset":1419,"count":1132},{"startOffset":240,"endOffset":276,"count":0},{"startOffset":325,"endOffset":365,"count":11},{"startOffset":365,"endOffset":628,"count":1121},{"startOffset":416,"endOffset":576,"count":11},{"startOffset":463,"endOffset":525,"count":0},{"startOffset":576,"endOffset":628,"count":1110},{"startOffset":628,"endOffset":680,"count":1121},{"startOffset":680,"endOffset":717,"count":0},{"startOffset":717,"endOffset":1418,"count":1121}],"isBlockCoverage":true}]},{"scriptId":"169","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/cs.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":795,"count":1}],"isBlockCoverage":true},{"functionName":"cs","ranges":[{"startOffset":98,"endOffset":747,"count":3591},{"startOffset":203,"endOffset":239,"count":0},{"startOffset":368,"endOffset":405,"count":0},{"startOffset":535,"endOffset":637,"count":2362},{"startOffset":637,"endOffset":745,"count":1229}],"isBlockCoverage":true}]},{"scriptId":"170","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/eq.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5857,"count":1}],"isBlockCoverage":true},{"functionName":"compareTables","ranges":[{"startOffset":164,"endOffset":559,"count":31},{"startOffset":324,"endOffset":353,"count":2},{"startOffset":353,"endOffset":401,"count":29},{"startOffset":401,"endOffset":540,"count":22},{"startOffset":497,"endOffset":534,"count":0},{"startOffset":540,"endOffset":558,"count":29}],"isBlockCoverage":true},{"functionName":"eq","ranges":[{"startOffset":560,"endOffset":5809,"count":249833},{"startOffset":698,"endOffset":750,"count":951},{"startOffset":750,"endOffset":853,"count":248882},{"startOffset":801,"endOffset":853,"count":1083},{"startOffset":853,"endOffset":955,"count":247799},{"startOffset":955,"endOffset":1487,"count":151470},{"startOffset":1004,"endOffset":1236,"count":23880},{"startOffset":1062,"endOffset":1128,"count":23528},{"startOffset":1128,"endOffset":1226,"count":352},{"startOffset":1236,"endOffset":1481,"count":127590},{"startOffset":1287,"endOffset":1366,"count":0},{"startOffset":1416,"endOffset":1481,"count":127566},{"startOffset":1487,"endOffset":2746,"count":96329},{"startOffset":1534,"endOffset":1762,"count":32870},{"startOffset":1583,"endOffset":1648,"count":281},{"startOffset":1648,"endOffset":1756,"count":32589},{"startOffset":1698,"endOffset":1756,"count":32587},{"startOffset":1762,"endOffset":2746,"count":63459},{"startOffset":1806,"endOffset":1837,"count":7},{"startOffset":1838,"endOffset":1879,"count":7},{"startOffset":1881,"endOffset":1931,"count":7},{"startOffset":1931,"endOffset":2746,"count":63452},{"startOffset":1979,"endOffset":2222,"count":57988},{"startOffset":2026,"endOffset":2084,"count":57960},{"startOffset":2084,"endOffset":2216,"count":28},{"startOffset":2137,"endOffset":2216,"count":0},{"startOffset":2222,"endOffset":2746,"count":5464},{"startOffset":2275,"endOffset":2315,"count":0},{"startOffset":2317,"endOffset":2381,"count":0},{"startOffset":2434,"endOffset":2473,"count":4544},{"startOffset":2475,"endOffset":2746,"count":923},{"startOffset":2531,"endOffset":2569,"count":895},{"startOffset":2571,"endOffset":2629,"count":31},{"startOffset":2629,"endOffset":2740,"count":892},{"startOffset":2746,"endOffset":2789,"count":4595},{"startOffset":2789,"endOffset":2826,"count":3594},{"startOffset":2828,"endOffset":3479,"count":1007},{"startOffset":2881,"endOffset":2943,"count":0},{"startOffset":2999,"endOffset":3061,"count":6},{"startOffset":3061,"endOffset":3256,"count":1001},{"startOffset":3256,"endOffset":3293,"count":0},{"startOffset":3293,"endOffset":3328,"count":1001},{"startOffset":3328,"endOffset":3452,"count":5445},{"startOffset":3397,"endOffset":3442,"count":33},{"startOffset":3452,"endOffset":3479,"count":968},{"startOffset":3479,"endOffset":3546,"count":3588},{"startOffset":3546,"endOffset":3584,"count":4},{"startOffset":3584,"endOffset":3888,"count":3584},{"startOffset":3628,"endOffset":3669,"count":12},{"startOffset":3669,"endOffset":3888,"count":3572},{"startOffset":3753,"endOffset":3782,"count":0},{"startOffset":3822,"endOffset":3853,"count":165},{"startOffset":3853,"endOffset":3888,"count":3407},{"startOffset":3888,"endOffset":3956,"count":3588},{"startOffset":3956,"endOffset":3995,"count":24},{"startOffset":3995,"endOffset":4191,"count":3564},{"startOffset":4040,"endOffset":4082,"count":11},{"startOffset":4082,"endOffset":4191,"count":3553},{"startOffset":4123,"endOffset":4155,"count":141},{"startOffset":4155,"endOffset":4191,"count":3412},{"startOffset":4191,"endOffset":4229,"count":3588},{"startOffset":4229,"endOffset":4253,"count":44},{"startOffset":4255,"endOffset":4301,"count":0},{"startOffset":4301,"endOffset":4414,"count":3588},{"startOffset":4343,"endOffset":4367,"count":51},{"startOffset":4369,"endOffset":4414,"count":24},{"startOffset":4414,"endOffset":4454,"count":3588},{"startOffset":4454,"endOffset":4486,"count":4},{"startOffset":4488,"endOffset":4550,"count":4},{"startOffset":4550,"endOffset":4896,"count":3584},{"startOffset":4595,"endOffset":4619,"count":0},{"startOffset":4621,"endOffset":4656,"count":0},{"startOffset":4701,"endOffset":4896,"count":3},{"startOffset":4738,"endOffset":4780,"count":1},{"startOffset":4780,"endOffset":4890,"count":2},{"startOffset":4896,"endOffset":4935,"count":3588},{"startOffset":4935,"endOffset":4969,"count":0},{"startOffset":4971,"endOffset":5041,"count":0},{"startOffset":5041,"endOffset":5191,"count":3588},{"startOffset":5088,"endOffset":5119,"count":28},{"startOffset":5121,"endOffset":5191,"count":0},{"startOffset":5191,"endOffset":5319,"count":3588},{"startOffset":5319,"endOffset":5729,"count":2},{"startOffset":5422,"endOffset":5723,"count":0},{"startOffset":5729,"endOffset":5808,"count":3588}],"isBlockCoverage":true}]},{"scriptId":"171","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/gt.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3676,"count":1}],"isBlockCoverage":true},{"functionName":"gt","ranges":[{"startOffset":182,"endOffset":2052,"count":55496},{"startOffset":254,"endOffset":414,"count":0},{"startOffset":466,"endOffset":627,"count":0},{"startOffset":780,"endOffset":838,"count":0},{"startOffset":908,"endOffset":956,"count":0},{"startOffset":1042,"endOffset":1067,"count":4398},{"startOffset":1067,"endOffset":1225,"count":51098},{"startOffset":1150,"endOffset":1184,"count":0},{"startOffset":1313,"endOffset":1339,"count":4398},{"startOffset":1339,"endOffset":1501,"count":51098},{"startOffset":1424,"endOffset":1459,"count":0},{"startOffset":1532,"endOffset":1556,"count":20938},{"startOffset":1558,"endOffset":1676,"count":0},{"startOffset":1712,"endOffset":1736,"count":34550},{"startOffset":1738,"endOffset":1856,"count":0},{"startOffset":1882,"endOffset":1944,"count":0},{"startOffset":1970,"endOffset":2032,"count":0}],"isBlockCoverage":true},{"functionName":"gt_with_hex","ranges":[{"startOffset":2070,"endOffset":2244,"count":0}],"isBlockCoverage":false},{"functionName":"get_hex_from_parameter","ranges":[{"startOffset":2245,"endOffset":3645,"count":0}],"isBlockCoverage":false}]},{"scriptId":"172","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/initial.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2055,"count":1}],"isBlockCoverage":true},{"functionName":"initial","ranges":[{"startOffset":140,"endOffset":1992,"count":77572},{"startOffset":260,"endOffset":297,"count":77486},{"startOffset":299,"endOffset":347,"count":163},{"startOffset":347,"endOffset":1279,"count":77409},{"startOffset":399,"endOffset":453,"count":678},{"startOffset":453,"endOffset":1279,"count":76731},{"startOffset":496,"endOffset":544,"count":7},{"startOffset":544,"endOffset":1279,"count":76724},{"startOffset":587,"endOffset":643,"count":41},{"startOffset":643,"endOffset":1279,"count":76683},{"startOffset":685,"endOffset":741,"count":5},{"startOffset":741,"endOffset":1279,"count":76678},{"startOffset":784,"endOffset":830,"count":3},{"startOffset":830,"endOffset":1279,"count":76675},{"startOffset":874,"endOffset":916,"count":0},{"startOffset":964,"endOffset":1020,"count":6848},{"startOffset":1020,"endOffset":1279,"count":69827},{"startOffset":1069,"endOffset":1102,"count":82},{"startOffset":1104,"endOffset":1155,"count":0},{"startOffset":1205,"endOffset":1279,"count":82},{"startOffset":1279,"endOffset":1313,"count":69745},{"startOffset":1313,"endOffset":1347,"count":0},{"startOffset":1347,"endOffset":1419,"count":69745},{"startOffset":1386,"endOffset":1419,"count":0},{"startOffset":1419,"endOffset":1484,"count":69745},{"startOffset":1484,"endOffset":1520,"count":53119},{"startOffset":1520,"endOffset":1990,"count":16626},{"startOffset":1561,"endOffset":1596,"count":775},{"startOffset":1596,"endOffset":1990,"count":15851},{"startOffset":1645,"endOffset":1688,"count":15246},{"startOffset":1688,"endOffset":1990,"count":605},{"startOffset":1775,"endOffset":1877,"count":1210},{"startOffset":1822,"endOffset":1867,"count":446},{"startOffset":1877,"endOffset":1904,"count":159},{"startOffset":1904,"endOffset":1990,"count":0}],"isBlockCoverage":true}]},{"scriptId":"173","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/instance_of.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":257,"count":1}],"isBlockCoverage":true},{"functionName":"instance_of","ranges":[{"startOffset":107,"endOffset":182,"count":0}],"isBlockCoverage":false}]},{"scriptId":"174","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/lt.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":242,"count":1}],"isBlockCoverage":true},{"functionName":"lt","ranges":[{"startOffset":128,"endOffset":194,"count":41252}],"isBlockCoverage":true}]},{"scriptId":"175","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/m.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1232,"count":1}],"isBlockCoverage":true},{"functionName":"hexToBinary","ranges":[{"startOffset":119,"endOffset":404,"count":0}],"isBlockCoverage":false},{"functionName":"m","ranges":[{"startOffset":459,"endOffset":1187,"count":0}],"isBlockCoverage":false}]},{"scriptId":"176","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/na.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":243,"count":1}],"isBlockCoverage":true},{"functionName":"na","ranges":[{"startOffset":128,"endOffset":195,"count":7383}],"isBlockCoverage":true}]},{"scriptId":"177","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/ne.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":243,"count":1}],"isBlockCoverage":true},{"functionName":"ne","ranges":[{"startOffset":128,"endOffset":195,"count":21093}],"isBlockCoverage":true}]},{"scriptId":"178","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/np.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":243,"count":1}],"isBlockCoverage":true},{"functionName":"np","ranges":[{"startOffset":128,"endOffset":195,"count":89}],"isBlockCoverage":true}]},{"scriptId":"179","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/ns.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":243,"count":1}],"isBlockCoverage":true},{"functionName":"ns","ranges":[{"startOffset":128,"endOffset":195,"count":0}],"isBlockCoverage":false}]},{"scriptId":"180","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/o.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":947,"count":1}],"isBlockCoverage":true},{"functionName":"o","ranges":[{"startOffset":144,"endOffset":902,"count":0}],"isBlockCoverage":false}]},{"scriptId":"181","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/z.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":946,"count":1}],"isBlockCoverage":true},{"functionName":"z","ranges":[{"startOffset":144,"endOffset":901,"count":0}],"isBlockCoverage":false}]},{"scriptId":"182","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/in.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1144,"count":1}],"isBlockCoverage":true},{"functionName":"compareIn","ranges":[{"startOffset":195,"endOffset":1082,"count":0}],"isBlockCoverage":false}]},{"scriptId":"183","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/read_table.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9416,"count":1}],"isBlockCoverage":true},{"functionName":"searchWithKey","ranges":[{"startOffset":292,"endOffset":993,"count":4184},{"startOffset":486,"endOffset":922,"count":7187},{"startOffset":583,"endOffset":607,"count":5579},{"startOffset":609,"endOffset":647,"count":5579},{"startOffset":647,"endOffset":768,"count":1608},{"startOffset":694,"endOffset":737,"count":1583},{"startOffset":738,"endOffset":757,"count":25},{"startOffset":804,"endOffset":916,"count":2090},{"startOffset":922,"endOffset":992,"count":2094}],"isBlockCoverage":true},{"functionName":"readTable","ranges":[{"startOffset":1012,"endOffset":9346,"count":27229},{"startOffset":1207,"endOffset":1378,"count":1887},{"startOffset":1255,"endOffset":1317,"count":0},{"startOffset":1378,"endOffset":1519,"count":25342},{"startOffset":1520,"endOffset":1528,"count":0},{"startOffset":1529,"endOffset":1551,"count":25342},{"startOffset":1575,"endOffset":1651,"count":24923},{"startOffset":1618,"endOffset":1626,"count":0},{"startOffset":1660,"endOffset":1770,"count":2919},{"startOffset":1728,"endOffset":1736,"count":0},{"startOffset":1753,"endOffset":1758,"count":0},{"startOffset":1772,"endOffset":2671,"count":1308},{"startOffset":1824,"endOffset":2194,"count":282},{"startOffset":2194,"endOffset":2665,"count":1026},{"startOffset":2433,"endOffset":2561,"count":1815},{"startOffset":2493,"endOffset":2547,"count":1007},{"startOffset":2595,"endOffset":2655,"count":1007},{"startOffset":2671,"endOffset":2718,"count":25342},{"startOffset":2719,"endOffset":2727,"count":0},{"startOffset":2728,"endOffset":2743,"count":25342},{"startOffset":2745,"endOffset":3560,"count":20611},{"startOffset":2797,"endOffset":2878,"count":0},{"startOffset":3044,"endOffset":3236,"count":0},{"startOffset":3324,"endOffset":3379,"count":0},{"startOffset":3511,"endOffset":3554,"count":19635},{"startOffset":3560,"endOffset":8288,"count":4731},{"startOffset":3611,"endOffset":3695,"count":539},{"startOffset":3654,"endOffset":3662,"count":0},{"startOffset":3696,"endOffset":3720,"count":539},{"startOffset":3722,"endOffset":3858,"count":539},{"startOffset":3858,"endOffset":8288,"count":4192},{"startOffset":3909,"endOffset":3979,"count":0},{"startOffset":3981,"endOffset":4226,"count":0},{"startOffset":4281,"endOffset":4289,"count":0},{"startOffset":4323,"endOffset":4407,"count":3649},{"startOffset":4366,"endOffset":4374,"count":0},{"startOffset":4417,"endOffset":4440,"count":1707},{"startOffset":4449,"endOffset":4659,"count":1707},{"startOffset":4493,"endOffset":4501,"count":0},{"startOffset":4535,"endOffset":4658,"count":1164},{"startOffset":4602,"endOffset":4610,"count":0},{"startOffset":4668,"endOffset":4686,"count":1593},{"startOffset":4688,"endOffset":6112,"count":1593},{"startOffset":5212,"endOffset":6106,"count":950},{"startOffset":5248,"endOffset":5328,"count":312},{"startOffset":5328,"endOffset":6096,"count":638},{"startOffset":5720,"endOffset":5744,"count":295},{"startOffset":5746,"endOffset":5803,"count":295},{"startOffset":5803,"endOffset":5957,"count":343},{"startOffset":5916,"endOffset":5938,"count":0},{"startOffset":6026,"endOffset":6082,"count":486},{"startOffset":6112,"endOffset":8288,"count":2599},{"startOffset":6165,"endOffset":6173,"count":0},{"startOffset":6193,"endOffset":6409,"count":2591},{"startOffset":6409,"endOffset":8288,"count":8},{"startOffset":6462,"endOffset":6470,"count":0},{"startOffset":6539,"endOffset":6618,"count":0},{"startOffset":6676,"endOffset":6741,"count":4},{"startOffset":6831,"endOffset":7931,"count":7},{"startOffset":7014,"endOffset":7022,"count":0},{"startOffset":7066,"endOffset":7074,"count":0},{"startOffset":7222,"endOffset":7921,"count":6},{"startOffset":7388,"endOffset":7907,"count":13},{"startOffset":7506,"endOffset":7757,"count":17},{"startOffset":7628,"endOffset":7735,"count":7},{"startOffset":7800,"endOffset":7889,"count":6},{"startOffset":7965,"endOffset":8004,"count":2},{"startOffset":8037,"endOffset":8158,"count":2},{"startOffset":8104,"endOffset":8112,"count":0},{"startOffset":8160,"endOffset":8200,"count":1},{"startOffset":8206,"endOffset":8288,"count":0},{"startOffset":8288,"endOffset":8311,"count":25342},{"startOffset":8311,"endOffset":8314,"count":21987},{"startOffset":8315,"endOffset":8318,"count":3355},{"startOffset":8341,"endOffset":8377,"count":951},{"startOffset":8377,"endOffset":8610,"count":24391},{"startOffset":8432,"endOffset":8440,"count":0},{"startOffset":8474,"endOffset":8558,"count":24359},{"startOffset":8517,"endOffset":8525,"count":0},{"startOffset":8568,"endOffset":8582,"count":215},{"startOffset":8584,"endOffset":8610,"count":85},{"startOffset":8610,"endOffset":8761,"count":25342},{"startOffset":8761,"endOffset":8769,"count":17901},{"startOffset":8771,"endOffset":9122,"count":16498},{"startOffset":8831,"endOffset":8872,"count":1683},{"startOffset":8874,"endOffset":8938,"count":1683},{"startOffset":8938,"endOffset":9116,"count":14815},{"startOffset":9003,"endOffset":9054,"count":0},{"startOffset":9122,"endOffset":9310,"count":8844},{"startOffset":9158,"endOffset":9166,"count":333},{"startOffset":9168,"endOffset":9220,"count":215},{"startOffset":9220,"endOffset":9310,"count":8629},{"startOffset":9252,"endOffset":9260,"count":5264},{"startOffset":9262,"endOffset":9310,"count":5050},{"startOffset":9310,"endOffset":9345,"count":25342}],"isBlockCoverage":true}]},{"scriptId":"184","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/binary_search.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2521,"count":1}],"isBlockCoverage":true},{"functionName":"binarySearchFromRow","ranges":[{"startOffset":351,"endOffset":1638,"count":1593},{"startOffset":457,"endOffset":482,"count":548},{"startOffset":482,"endOffset":630,"count":1045},{"startOffset":630,"endOffset":1245,"count":2017},{"startOffset":858,"endOffset":882,"count":1497},{"startOffset":884,"endOffset":922,"count":1497},{"startOffset":922,"endOffset":1043,"count":520},{"startOffset":1013,"endOffset":1032,"count":0},{"startOffset":1100,"endOffset":1139,"count":1160},{"startOffset":1139,"endOffset":1191,"count":857},{"startOffset":1245,"endOffset":1330,"count":1045},{"startOffset":1330,"endOffset":1354,"count":777},{"startOffset":1356,"endOffset":1386,"count":777},{"startOffset":1386,"endOffset":1495,"count":268},{"startOffset":1469,"endOffset":1488,"count":0},{"startOffset":1495,"endOffset":1548,"count":1045},{"startOffset":1548,"endOffset":1618,"count":288},{"startOffset":1618,"endOffset":1637,"count":757}],"isBlockCoverage":true},{"functionName":"binarySearchFrom","ranges":[{"startOffset":1690,"endOffset":2042,"count":151},{"startOffset":1787,"endOffset":2022,"count":375},{"startOffset":1925,"endOffset":1964,"count":233},{"startOffset":1964,"endOffset":2016,"count":142}],"isBlockCoverage":true},{"functionName":"binarySearchTo","ranges":[{"startOffset":2088,"endOffset":2438,"count":151},{"startOffset":2183,"endOffset":2418,"count":245},{"startOffset":2321,"endOffset":2359,"count":91},{"startOffset":2359,"endOffset":2412,"count":154}],"isBlockCoverage":true}]},{"scriptId":"185","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/sort.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2583,"count":1}],"isBlockCoverage":true},{"functionName":"compare","ranges":[{"startOffset":178,"endOffset":1189,"count":17179},{"startOffset":386,"endOffset":441,"count":4398},{"startOffset":441,"endOffset":777,"count":12781},{"startOffset":484,"endOffset":682,"count":34},{"startOffset":597,"endOffset":676,"count":68},{"startOffset":682,"endOffset":777,"count":12747},{"startOffset":828,"endOffset":916,"count":0},{"startOffset":936,"endOffset":968,"count":419},{"startOffset":970,"endOffset":996,"count":165},{"startOffset":996,"endOffset":1187,"count":17014},{"startOffset":1022,"endOffset":1054,"count":16760},{"startOffset":1056,"endOffset":1082,"count":2887},{"startOffset":1082,"endOffset":1187,"count":14127},{"startOffset":1127,"endOffset":1152,"count":3884},{"startOffset":1152,"endOffset":1187,"count":10243}],"isBlockCoverage":true},{"functionName":"sort","ranges":[{"startOffset":1190,"endOffset":2529,"count":1904},{"startOffset":1298,"endOffset":1483,"count":0},{"startOffset":1530,"endOffset":1589,"count":0},{"startOffset":1637,"endOffset":1645,"count":1},{"startOffset":1646,"endOffset":1658,"count":1903},{"startOffset":1660,"endOffset":2010,"count":1880},{"startOffset":1699,"endOffset":1748,"count":0},{"startOffset":2010,"endOffset":2527,"count":24},{"startOffset":2089,"endOffset":2097,"count":1},{"startOffset":2098,"endOffset":2118,"count":23}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1768,"endOffset":2002,"count":13450},{"startOffset":1819,"endOffset":1824,"count":0},{"startOffset":1826,"endOffset":1970,"count":17179},{"startOffset":1905,"endOffset":1956,"count":13295},{"startOffset":1970,"endOffset":2001,"count":155}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2149,"endOffset":2519,"count":46},{"startOffset":2202,"endOffset":2243,"count":3},{"startOffset":2243,"endOffset":2509,"count":43},{"startOffset":2276,"endOffset":2302,"count":1},{"startOffset":2304,"endOffset":2346,"count":0},{"startOffset":2380,"endOffset":2406,"count":42},{"startOffset":2408,"endOffset":2450,"count":23},{"startOffset":2450,"endOffset":2509,"count":20}],"isBlockCoverage":true}]},{"scriptId":"186","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/date.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2269,"count":1}],"isBlockCoverage":true},{"functionName":"Date","ranges":[{"startOffset":290,"endOffset":434,"count":226},{"startOffset":397,"endOffset":405,"count":178},{"startOffset":406,"endOffset":427,"count":48}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":439,"endOffset":500,"count":25}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":505,"endOffset":1267,"count":143},{"startOffset":557,"endOffset":780,"count":1},{"startOffset":606,"endOffset":662,"count":0},{"startOffset":780,"endOffset":1039,"count":142},{"startOffset":830,"endOffset":891,"count":1},{"startOffset":891,"endOffset":1039,"count":141},{"startOffset":936,"endOffset":979,"count":97},{"startOffset":979,"endOffset":1039,"count":44},{"startOffset":1075,"endOffset":1136,"count":0},{"startOffset":1177,"endOffset":1240,"count":1}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":1272,"endOffset":1320,"count":257}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1325,"endOffset":1365,"count":77}],"isBlockCoverage":true},{"functionName":"getNumeric","ranges":[{"startOffset":1370,"endOffset":1456,"count":1}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":1461,"endOffset":2213,"count":21},{"startOffset":1527,"endOffset":1535,"count":0},{"startOffset":1552,"endOffset":1625,"count":14},{"startOffset":1673,"endOffset":1681,"count":0},{"startOffset":1849,"endOffset":1857,"count":0},{"startOffset":1874,"endOffset":1955,"count":14},{"startOffset":2004,"endOffset":2012,"count":0}],"isBlockCoverage":true}]},{"scriptId":"187","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/_date_helper.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1857,"count":1}],"isBlockCoverage":true},{"functionName":"getDateFromNumber","ranges":[{"startOffset":141,"endOffset":926,"count":1},{"startOffset":342,"endOffset":662,"count":0}],"isBlockCoverage":true},{"functionName":"getNumberFromDate","ranges":[{"startOffset":974,"endOffset":1769,"count":1},{"startOffset":1399,"endOffset":1716,"count":0}],"isBlockCoverage":true}]},{"scriptId":"188","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/decfloat34.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1256,"count":1}],"isBlockCoverage":true},{"functionName":"DecFloat34","ranges":[{"startOffset":226,"endOffset":271,"count":27}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":276,"endOffset":958,"count":2},{"startOffset":328,"endOffset":371,"count":0},{"startOffset":415,"endOffset":443,"count":1},{"startOffset":445,"endOffset":484,"count":0},{"startOffset":529,"endOffset":931,"count":1},{"startOffset":629,"endOffset":681,"count":0},{"startOffset":765,"endOffset":871,"count":0}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":963,"endOffset":1002,"count":0}],"isBlockCoverage":false},{"functionName":"getRaw","ranges":[{"startOffset":1007,"endOffset":1050,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1055,"endOffset":1182,"count":2}],"isBlockCoverage":true}]},{"scriptId":"189","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/integer8.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1938,"count":1}],"isBlockCoverage":true},{"functionName":"Integer8","ranges":[{"startOffset":335,"endOffset":481,"count":0}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":486,"endOffset":547,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":552,"endOffset":1781,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":1786,"endOffset":1825,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":1830,"endOffset":1870,"count":0}],"isBlockCoverage":false}]},{"scriptId":"190","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/numc.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2316,"count":1}],"isBlockCoverage":true},{"functionName":"Numc","ranges":[{"startOffset":215,"endOffset":508,"count":3303},{"startOffset":294,"endOffset":302,"count":1799},{"startOffset":303,"endOffset":317,"count":1504},{"startOffset":319,"endOffset":379,"count":1434},{"startOffset":356,"endOffset":364,"count":0},{"startOffset":380,"endOffset":383,"count":1869},{"startOffset":449,"endOffset":457,"count":1799},{"startOffset":458,"endOffset":479,"count":1504}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":513,"endOffset":574,"count":18}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":579,"endOffset":1258,"count":3121},{"startOffset":644,"endOffset":698,"count":98},{"startOffset":698,"endOffset":885,"count":3023},{"startOffset":743,"endOffset":805,"count":1541},{"startOffset":805,"endOffset":885,"count":1482},{"startOffset":885,"endOffset":931,"count":1639},{"startOffset":931,"endOffset":1032,"count":0},{"startOffset":1032,"endOffset":1231,"count":1639},{"startOffset":1129,"endOffset":1145,"count":1573},{"startOffset":1147,"endOffset":1221,"count":1573},{"startOffset":1231,"endOffset":1257,"count":1639}],"isBlockCoverage":true},{"functionName":"getLength","ranges":[{"startOffset":1263,"endOffset":1310,"count":32}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":1315,"endOffset":1376,"count":3914}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1381,"endOffset":1421,"count":2237}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":1426,"endOffset":2260,"count":0}],"isBlockCoverage":false}]},{"scriptId":"191","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/time.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2247,"count":1}],"isBlockCoverage":true},{"functionName":"Time","ranges":[{"startOffset":229,"endOffset":373,"count":44},{"startOffset":336,"endOffset":344,"count":28},{"startOffset":345,"endOffset":366,"count":16}],"isBlockCoverage":true},{"functionName":"getQualifiedName","ranges":[{"startOffset":378,"endOffset":439,"count":2}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":444,"endOffset":1072,"count":53},{"startOffset":496,"endOffset":791,"count":1},{"startOffset":791,"endOffset":1045,"count":52},{"startOffset":836,"endOffset":879,"count":48},{"startOffset":879,"endOffset":1045,"count":4},{"startOffset":924,"endOffset":985,"count":0}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":1077,"endOffset":1123,"count":52}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":1128,"endOffset":1168,"count":10}],"isBlockCoverage":true},{"functionName":"getNumeric","ranges":[{"startOffset":1173,"endOffset":1434,"count":1}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":1439,"endOffset":2191,"count":15},{"startOffset":1505,"endOffset":1513,"count":0},{"startOffset":1530,"endOffset":1603,"count":10},{"startOffset":1651,"endOffset":1659,"count":0},{"startOffset":1827,"endOffset":1835,"count":0},{"startOffset":1852,"endOffset":1933,"count":10},{"startOffset":1982,"endOffset":1990,"count":0}],"isBlockCoverage":true}]},{"scriptId":"192","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/utc_long.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":653,"count":1}],"isBlockCoverage":true},{"functionName":"UTCLong","ranges":[{"startOffset":123,"endOffset":267,"count":0}],"isBlockCoverage":false},{"functionName":"getQualifiedName","ranges":[{"startOffset":272,"endOffset":333,"count":0}],"isBlockCoverage":false},{"functionName":"getOffset","ranges":[{"startOffset":338,"endOffset":436,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":441,"endOffset":497,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":502,"endOffset":542,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":547,"endOffset":587,"count":0}],"isBlockCoverage":false}]},{"scriptId":"193","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/index.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7500,"count":1}],"isBlockCoverage":true},{"functionName":"Statements","ranges":[{"startOffset":2376,"endOffset":4264,"count":1}],"isBlockCoverage":true},{"functionName":"_trace","ranges":[{"startOffset":4269,"endOffset":4993,"count":0}],"isBlockCoverage":false},{"functionName":"_traceAsync","ranges":[{"startOffset":4998,"endOffset":5739,"count":0}],"isBlockCoverage":false},{"functionName":"_setTrace","ranges":[{"startOffset":5744,"endOffset":6336,"count":0}],"isBlockCoverage":false},{"functionName":"deleteDatabase","ranges":[{"startOffset":6341,"endOffset":6483,"count":0}],"isBlockCoverage":false},{"functionName":"insertDatabase","ranges":[{"startOffset":6488,"endOffset":6630,"count":0}],"isBlockCoverage":false},{"functionName":"message","ranges":[{"startOffset":6635,"endOffset":6743,"count":129}],"isBlockCoverage":true},{"functionName":"modifyDatabase","ranges":[{"startOffset":6748,"endOffset":6890,"count":0}],"isBlockCoverage":false},{"functionName":"select","ranges":[{"startOffset":6895,"endOffset":7044,"count":13}],"isBlockCoverage":true},{"functionName":"updateDatabase","ranges":[{"startOffset":7049,"endOffset":7191,"count":0}],"isBlockCoverage":false},{"functionName":"callFunction","ranges":[{"startOffset":7196,"endOffset":7316,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":7321,"endOffset":7431,"count":0}],"isBlockCoverage":false}]},{"scriptId":"194","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/append.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2146,"count":1}],"isBlockCoverage":true},{"functionName":"append","ranges":[{"startOffset":139,"endOffset":2086,"count":20153},{"startOffset":217,"endOffset":373,"count":0},{"startOffset":427,"endOffset":484,"count":197},{"startOffset":521,"endOffset":842,"count":0},{"startOffset":877,"endOffset":917,"count":10},{"startOffset":919,"endOffset":1421,"count":10},{"startOffset":967,"endOffset":1034,"count":0},{"startOffset":1103,"endOffset":1166,"count":0},{"startOffset":1236,"endOffset":1415,"count":8},{"startOffset":1282,"endOffset":1348,"count":0},{"startOffset":1421,"endOffset":2000,"count":20143},{"startOffset":1517,"endOffset":1732,"count":181},{"startOffset":1571,"endOffset":1644,"count":0},{"startOffset":1732,"endOffset":1994,"count":19962},{"startOffset":1771,"endOffset":1994,"count":0}],"isBlockCoverage":true}]},{"scriptId":"195","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/assert.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":266,"count":1}],"isBlockCoverage":true},{"functionName":"assert","ranges":[{"startOffset":102,"endOffset":206,"count":6360},{"startOffset":152,"endOffset":204,"count":0}],"isBlockCoverage":true}]},{"scriptId":"196","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/assign.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5381,"count":1}],"isBlockCoverage":true},{"functionName":"assign","ranges":[{"startOffset":139,"endOffset":5321,"count":4558},{"startOffset":231,"endOffset":2511,"count":4},{"startOffset":297,"endOffset":376,"count":0},{"startOffset":548,"endOffset":603,"count":0},{"startOffset":777,"endOffset":919,"count":0},{"startOffset":1152,"endOffset":1291,"count":0},{"startOffset":1301,"endOffset":2233,"count":0},{"startOffset":2406,"endOffset":2505,"count":0},{"startOffset":2511,"endOffset":5319,"count":4554},{"startOffset":2542,"endOffset":4563,"count":3559},{"startOffset":2600,"endOffset":2648,"count":3228},{"startOffset":2650,"endOffset":2762,"count":331},{"startOffset":2762,"endOffset":2987,"count":3228},{"startOffset":2837,"endOffset":2880,"count":0},{"startOffset":2882,"endOffset":2987,"count":0},{"startOffset":2987,"endOffset":3176,"count":3228},{"startOffset":3176,"endOffset":3478,"count":0},{"startOffset":3478,"endOffset":3554,"count":3228},{"startOffset":3554,"endOffset":3982,"count":0},{"startOffset":3982,"endOffset":4288,"count":3228},{"startOffset":4288,"endOffset":4417,"count":3},{"startOffset":4417,"endOffset":4557,"count":3225},{"startOffset":4563,"endOffset":5319,"count":995},{"startOffset":4666,"endOffset":4946,"count":126},{"startOffset":4754,"endOffset":4824,"count":0},{"startOffset":4946,"endOffset":5313,"count":869},{"startOffset":4992,"endOffset":5077,"count":0},{"startOffset":5124,"endOffset":5182,"count":11}],"isBlockCoverage":true}]},{"scriptId":"197","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/clear.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":202,"count":1}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":101,"endOffset":145,"count":22208}],"isBlockCoverage":true}]},{"scriptId":"198","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/commit.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true},{"functionName":"commit","ranges":[{"startOffset":102,"endOffset":135,"count":1}],"isBlockCoverage":true}]},{"scriptId":"199","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/concatenate.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1735,"count":1}],"isBlockCoverage":true},{"functionName":"concatenate","ranges":[{"startOffset":144,"endOffset":1660,"count":29401},{"startOffset":225,"endOffset":584,"count":70},{"startOffset":349,"endOffset":568,"count":174},{"startOffset":404,"endOffset":473,"count":172},{"startOffset":473,"endOffset":554,"count":2},{"startOffset":584,"endOffset":1336,"count":29331},{"startOffset":639,"endOffset":1330,"count":58965},{"startOffset":716,"endOffset":801,"count":0},{"startOffset":881,"endOffset":937,"count":0},{"startOffset":996,"endOffset":1212,"count":15979},{"startOffset":1117,"endOffset":1198,"count":0},{"startOffset":1212,"endOffset":1292,"count":42986},{"startOffset":1382,"endOffset":1620,"count":137},{"startOffset":1476,"endOffset":1535,"count":0}],"isBlockCoverage":true}]},{"scriptId":"200","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/condense.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":468,"count":1}],"isBlockCoverage":true},{"functionName":"condense","ranges":[{"startOffset":104,"endOffset":402,"count":2800},{"startOffset":256,"endOffset":309,"count":0}],"isBlockCoverage":true}]},{"scriptId":"201","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/convert.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2771,"count":1}],"isBlockCoverage":true},{"functionName":"convert","ranges":[{"startOffset":161,"endOffset":2708,"count":10},{"startOffset":320,"endOffset":557,"count":6},{"startOffset":367,"endOffset":410,"count":0},{"startOffset":509,"endOffset":551,"count":0},{"startOffset":598,"endOffset":757,"count":6},{"startOffset":645,"endOffset":688,"count":0},{"startOffset":800,"endOffset":969,"count":4},{"startOffset":848,"endOffset":893,"count":0},{"startOffset":1057,"endOffset":1100,"count":0},{"startOffset":1234,"endOffset":1263,"count":1},{"startOffset":1340,"endOffset":1354,"count":6},{"startOffset":1356,"endOffset":1835,"count":6},{"startOffset":1390,"endOffset":1410,"count":1},{"startOffset":1412,"endOffset":1524,"count":1},{"startOffset":1472,"endOffset":1480,"count":0},{"startOffset":1524,"endOffset":1835,"count":5},{"startOffset":1835,"endOffset":2401,"count":4},{"startOffset":1874,"endOffset":2065,"count":1},{"startOffset":1933,"endOffset":1941,"count":0},{"startOffset":2013,"endOffset":2021,"count":0},{"startOffset":2065,"endOffset":2401,"count":3},{"startOffset":2401,"endOffset":2552,"count":8},{"startOffset":2552,"endOffset":2592,"count":5},{"startOffset":2592,"endOffset":2614,"count":8},{"startOffset":2614,"endOffset":2649,"count":3},{"startOffset":2649,"endOffset":2671,"count":8},{"startOffset":2671,"endOffset":2706,"count":3}],"isBlockCoverage":true}]},{"scriptId":"202","url":"file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/dist/index.cjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":246,"count":1}],"isBlockCoverage":true}]},{"scriptId":"203","url":"file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/dist/impl.cjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":294,"count":1}],"isBlockCoverage":true}]},{"scriptId":"204","url":"file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/dist/common-c41a489f.cjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":56955,"count":1},{"startOffset":13069,"endOffset":13126,"count":10}],"isBlockCoverage":true},{"functionName":"r","ranges":[{"startOffset":60,"endOffset":86,"count":0}],"isBlockCoverage":false},{"functionName":"i","ranges":[{"startOffset":86,"endOffset":112,"count":0}],"isBlockCoverage":false},{"functionName":"a","ranges":[{"startOffset":159,"endOffset":443,"count":7}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":185,"endOffset":390,"count":7}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":207,"endOffset":389,"count":40},{"startOffset":245,"endOffset":247,"count":8},{"startOffset":247,"endOffset":249,"count":32},{"startOffset":264,"endOffset":308,"count":0},{"startOffset":317,"endOffset":388,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":404,"endOffset":442,"count":40}],"isBlockCoverage":true},{"functionName":"c","ranges":[{"startOffset":443,"endOffset":682,"count":192},{"startOffset":477,"endOffset":486,"count":0},{"startOffset":509,"endOffset":555,"count":0},{"startOffset":613,"endOffset":620,"count":0},{"startOffset":621,"endOffset":673,"count":0}],"isBlockCoverage":true},{"functionName":"u","ranges":[{"startOffset":682,"endOffset":768,"count":0}],"isBlockCoverage":false},{"functionName":"d","ranges":[{"startOffset":768,"endOffset":887,"count":48},{"startOffset":811,"endOffset":886,"count":0}],"isBlockCoverage":true},{"functionName":"h","ranges":[{"startOffset":913,"endOffset":961,"count":16}],"isBlockCoverage":true},{"functionName":"m","ranges":[{"startOffset":1060,"endOffset":1129,"count":4}],"isBlockCoverage":true},{"functionName":"g","ranges":[{"startOffset":1129,"endOffset":1202,"count":13}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1186,"endOffset":1198,"count":85}],"isBlockCoverage":true},{"functionName":"y","ranges":[{"startOffset":1202,"endOffset":1270,"count":13},{"startOffset":1246,"endOffset":1261,"count":85}],"isBlockCoverage":true},{"functionName":"w","ranges":[{"startOffset":1270,"endOffset":1338,"count":0}],"isBlockCoverage":false},{"functionName":"p","ranges":[{"startOffset":1338,"endOffset":1408,"count":14}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1383,"endOffset":1403,"count":107}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1530,"endOffset":1538,"count":10}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1548,"endOffset":1556,"count":10}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1566,"endOffset":1574,"count":10}],"isBlockCoverage":true},{"functionName":"F","ranges":[{"startOffset":1577,"endOffset":1785,"count":0}],"isBlockCoverage":false},{"functionName":"T","ranges":[{"startOffset":1785,"endOffset":2281,"count":0}],"isBlockCoverage":false},{"functionName":"O","ranges":[{"startOffset":2281,"endOffset":2747,"count":0}],"isBlockCoverage":false},{"functionName":"N","ranges":[{"startOffset":2764,"endOffset":2824,"count":96},{"startOffset":2806,"endOffset":2808,"count":80},{"startOffset":2808,"endOffset":2823,"count":16}],"isBlockCoverage":true},{"functionName":"toJSON","ranges":[{"startOffset":2832,"endOffset":2864,"count":0}],"isBlockCoverage":false},{"functionName":"valueOf","ranges":[{"startOffset":2883,"endOffset":2948,"count":0}],"isBlockCoverage":false},{"functionName":"U","ranges":[{"startOffset":2982,"endOffset":3030,"count":56}],"isBlockCoverage":true},{"functionName":"getISOFields","ranges":[{"startOffset":3030,"endOffset":3060,"count":64}],"isBlockCoverage":true},{"functionName":"P","ranges":[{"startOffset":3061,"endOffset":3099,"count":1161},{"startOffset":3087,"endOffset":3090,"count":67},{"startOffset":3090,"endOffset":3098,"count":1094},{"startOffset":3094,"endOffset":3096,"count":473},{"startOffset":3096,"endOffset":3098,"count":621}],"isBlockCoverage":true},{"functionName":"R","ranges":[{"startOffset":3099,"endOffset":3127,"count":1033}],"isBlockCoverage":true},{"functionName":"k","ranges":[{"startOffset":3127,"endOffset":3161,"count":8}],"isBlockCoverage":true},{"functionName":"x","ranges":[{"startOffset":3161,"endOffset":3194,"count":0}],"isBlockCoverage":false},{"functionName":"j","ranges":[{"startOffset":3194,"endOffset":3244,"count":0}],"isBlockCoverage":false},{"functionName":"q","ranges":[{"startOffset":3244,"endOffset":3332,"count":0}],"isBlockCoverage":false},{"functionName":"H","ranges":[{"startOffset":3332,"endOffset":3364,"count":0}],"isBlockCoverage":false},{"functionName":"L","ranges":[{"startOffset":3364,"endOffset":3416,"count":104},{"startOffset":3410,"endOffset":3415,"count":0}],"isBlockCoverage":true},{"functionName":"B","ranges":[{"startOffset":3416,"endOffset":3452,"count":72}],"isBlockCoverage":true},{"functionName":"$","ranges":[{"startOffset":3452,"endOffset":3521,"count":176}],"isBlockCoverage":true},{"functionName":"A","ranges":[{"startOffset":3521,"endOffset":3554,"count":16},{"startOffset":3545,"endOffset":3549,"count":0}],"isBlockCoverage":true},{"functionName":"W","ranges":[{"startOffset":3585,"endOffset":3625,"count":539}],"isBlockCoverage":true},{"functionName":"sign","ranges":[{"startOffset":3625,"endOffset":3665,"count":64},{"startOffset":3651,"endOffset":3664,"count":48}],"isBlockCoverage":true},{"functionName":"neg","ranges":[{"startOffset":3665,"endOffset":3712,"count":0}],"isBlockCoverage":false},{"functionName":"abs","ranges":[{"startOffset":3712,"endOffset":3755,"count":24},{"startOffset":3738,"endOffset":3749,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":3755,"endOffset":3811,"count":129}],"isBlockCoverage":true},{"functionName":"sub","ranges":[{"startOffset":3811,"endOffset":3867,"count":49}],"isBlockCoverage":true},{"functionName":"mult","ranges":[{"startOffset":3867,"endOffset":3908,"count":141}],"isBlockCoverage":true},{"functionName":"div","ranges":[{"startOffset":3908,"endOffset":4158,"count":80},{"startOffset":3971,"endOffset":3990,"count":0},{"startOffset":4032,"endOffset":4106,"count":56},{"startOffset":4101,"endOffset":4104,"count":0},{"startOffset":4128,"endOffset":4131,"count":24}],"isBlockCoverage":true},{"functionName":"toNumber","ranges":[{"startOffset":4158,"endOffset":4197,"count":120}],"isBlockCoverage":true},{"functionName":"toBigInt","ranges":[{"startOffset":4197,"endOffset":4260,"count":8}],"isBlockCoverage":true},{"functionName":"K","ranges":[{"startOffset":4261,"endOffset":4749,"count":140},{"startOffset":4303,"endOffset":4320,"count":32},{"startOffset":4320,"endOffset":4731,"count":108},{"startOffset":4347,"endOffset":4434,"count":100},{"startOffset":4353,"endOffset":4407,"count":0},{"startOffset":4430,"endOffset":4433,"count":49},{"startOffset":4434,"endOffset":4731,"count":8},{"startOffset":4511,"endOffset":4731,"count":0}],"isBlockCoverage":true},{"functionName":"G","ranges":[{"startOffset":4749,"endOffset":4805,"count":128},{"startOffset":4788,"endOffset":4804,"count":0}],"isBlockCoverage":true},{"functionName":"J","ranges":[{"startOffset":4805,"endOffset":4865,"count":178},{"startOffset":4843,"endOffset":4849,"count":114},{"startOffset":4849,"endOffset":4864,"count":64}],"isBlockCoverage":true},{"functionName":"Q","ranges":[{"startOffset":4865,"endOffset":4979,"count":399},{"startOffset":4890,"endOffset":4893,"count":341},{"startOffset":4942,"endOffset":4952,"count":58},{"startOffset":4952,"endOffset":4967,"count":0}],"isBlockCoverage":true},{"functionName":"X","ranges":[{"startOffset":5004,"endOffset":5043,"count":0}],"isBlockCoverage":false},{"functionName":"_","ranges":[{"startOffset":5043,"endOffset":5508,"count":0}],"isBlockCoverage":false},{"functionName":"nn","ranges":[{"startOffset":5508,"endOffset":5547,"count":0}],"isBlockCoverage":false},{"functionName":"tn","ranges":[{"startOffset":5547,"endOffset":5623,"count":0}],"isBlockCoverage":false},{"functionName":"en","ranges":[{"startOffset":5623,"endOffset":5679,"count":0}],"isBlockCoverage":false},{"functionName":"sn","ranges":[{"startOffset":5851,"endOffset":6030,"count":0}],"isBlockCoverage":false},{"functionName":"an","ranges":[{"startOffset":6030,"endOffset":6081,"count":0}],"isBlockCoverage":false},{"functionName":"cn","ranges":[{"startOffset":6081,"endOffset":6267,"count":0}],"isBlockCoverage":false},{"functionName":"un","ranges":[{"startOffset":6267,"endOffset":6392,"count":8}],"isBlockCoverage":true},{"functionName":"dn","ranges":[{"startOffset":6392,"endOffset":6907,"count":0}],"isBlockCoverage":false},{"functionName":"ln","ranges":[{"startOffset":6907,"endOffset":7220,"count":40}],"isBlockCoverage":true},{"functionName":"fn","ranges":[{"startOffset":7501,"endOffset":7526,"count":1}],"isBlockCoverage":true},{"functionName":"monthCode","ranges":[{"startOffset":7526,"endOffset":7558,"count":0}],"isBlockCoverage":false},{"functionName":"convertMonthCode","ranges":[{"startOffset":7558,"endOffset":7710,"count":0}],"isBlockCoverage":false},{"functionName":"mn","ranges":[{"startOffset":7711,"endOffset":7856,"count":0}],"isBlockCoverage":false},{"functionName":"gn","ranges":[{"startOffset":7856,"endOffset":7894,"count":0}],"isBlockCoverage":false},{"functionName":"computeFields","ranges":[{"startOffset":7914,"endOffset":8024,"count":0}],"isBlockCoverage":false},{"functionName":"epochMilliseconds","ranges":[{"startOffset":8024,"endOffset":8066,"count":0}],"isBlockCoverage":false},{"functionName":"daysInMonth","ranges":[{"startOffset":8066,"endOffset":8155,"count":75},{"startOffset":8095,"endOffset":8120,"count":0},{"startOffset":8126,"endOffset":8140,"count":66},{"startOffset":8140,"endOffset":8148,"count":65},{"startOffset":8148,"endOffset":8151,"count":10},{"startOffset":8151,"endOffset":8154,"count":65}],"isBlockCoverage":true},{"functionName":"monthsInYear","ranges":[{"startOffset":8155,"endOffset":8180,"count":24}],"isBlockCoverage":true},{"functionName":"inLeapYear","ranges":[{"startOffset":8180,"endOffset":8230,"count":0}],"isBlockCoverage":false},{"functionName":"guessYearForMonthDay","ranges":[{"startOffset":8230,"endOffset":8263,"count":0}],"isBlockCoverage":false},{"functionName":"normalizeISOYearForMonthDay","ranges":[{"startOffset":8263,"endOffset":8303,"count":0}],"isBlockCoverage":false},{"functionName":"Mn","ranges":[{"startOffset":8351,"endOffset":8491,"count":48}],"isBlockCoverage":true},{"functionName":"bn","ranges":[{"startOffset":8491,"endOffset":8597,"count":48},{"startOffset":8576,"endOffset":8578,"count":32},{"startOffset":8578,"endOffset":8580,"count":16},{"startOffset":8590,"endOffset":8592,"count":32},{"startOffset":8592,"endOffset":8594,"count":16}],"isBlockCoverage":true},{"functionName":"Sn","ranges":[{"startOffset":8597,"endOffset":8903,"count":51},{"startOffset":8672,"endOffset":8679,"count":1},{"startOffset":8679,"endOffset":8681,"count":50},{"startOffset":8737,"endOffset":8739,"count":32},{"startOffset":8739,"endOffset":8741,"count":19},{"startOffset":8749,"endOffset":8751,"count":32},{"startOffset":8751,"endOffset":8753,"count":19},{"startOffset":8761,"endOffset":8763,"count":32},{"startOffset":8763,"endOffset":8765,"count":19},{"startOffset":8773,"endOffset":8775,"count":32},{"startOffset":8775,"endOffset":8777,"count":19},{"startOffset":8857,"endOffset":8863,"count":0},{"startOffset":8865,"endOffset":8900,"count":1}],"isBlockCoverage":true},{"functionName":"In","ranges":[{"startOffset":8903,"endOffset":9089,"count":16},{"startOffset":8970,"endOffset":8991,"count":0}],"isBlockCoverage":true},{"functionName":"Fn","ranges":[{"startOffset":9089,"endOffset":9325,"count":16}],"isBlockCoverage":true},{"functionName":"Tn","ranges":[{"startOffset":9325,"endOffset":9392,"count":0}],"isBlockCoverage":false},{"functionName":"On","ranges":[{"startOffset":9392,"endOffset":9440,"count":0}],"isBlockCoverage":false},{"functionName":"Dn","ranges":[{"startOffset":9440,"endOffset":9508,"count":0}],"isBlockCoverage":false},{"functionName":"Nn","ranges":[{"startOffset":9508,"endOffset":9583,"count":0}],"isBlockCoverage":false},{"functionName":"Yn","ranges":[{"startOffset":9583,"endOffset":9720,"count":16},{"startOffset":9705,"endOffset":9711,"count":0}],"isBlockCoverage":true},{"functionName":"En","ranges":[{"startOffset":9720,"endOffset":9761,"count":67}],"isBlockCoverage":true},{"functionName":"Zn","ranges":[{"startOffset":9761,"endOffset":9831,"count":0}],"isBlockCoverage":false},{"functionName":"Cn","ranges":[{"startOffset":9831,"endOffset":9879,"count":0}],"isBlockCoverage":false},{"functionName":"Un","ranges":[{"startOffset":9879,"endOffset":9913,"count":0}],"isBlockCoverage":false},{"functionName":"Pn","ranges":[{"startOffset":9913,"endOffset":9992,"count":0}],"isBlockCoverage":false},{"functionName":"Rn","ranges":[{"startOffset":9992,"endOffset":10061,"count":0}],"isBlockCoverage":false},{"functionName":"kn","ranges":[{"startOffset":10061,"endOffset":10130,"count":0}],"isBlockCoverage":false},{"functionName":"xn","ranges":[{"startOffset":10130,"endOffset":10207,"count":0}],"isBlockCoverage":false},{"functionName":"jn","ranges":[{"startOffset":10207,"endOffset":10246,"count":0}],"isBlockCoverage":false},{"functionName":"qn","ranges":[{"startOffset":10246,"endOffset":10348,"count":24}],"isBlockCoverage":true},{"functionName":"Hn","ranges":[{"startOffset":10348,"endOffset":10455,"count":24}],"isBlockCoverage":true},{"functionName":"Ln","ranges":[{"startOffset":10455,"endOffset":10502,"count":8}],"isBlockCoverage":true},{"functionName":"Bn","ranges":[{"startOffset":10502,"endOffset":10770,"count":24}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11064,"endOffset":11074,"count":10}],"isBlockCoverage":true},{"functionName":"computeFields","ranges":[{"startOffset":11097,"endOffset":11209,"count":0}],"isBlockCoverage":false},{"functionName":"Vn","ranges":[{"startOffset":11332,"endOffset":11616,"count":8},{"startOffset":11439,"endOffset":11476,"count":0},{"startOffset":11487,"endOffset":11534,"count":0}],"isBlockCoverage":true},{"functionName":"_n","ranges":[{"startOffset":11662,"endOffset":11704,"count":0}],"isBlockCoverage":false},{"functionName":"nt","ranges":[{"startOffset":11704,"endOffset":11750,"count":8}],"isBlockCoverage":true},{"functionName":"tt","ranges":[{"startOffset":11750,"endOffset":11855,"count":8},{"startOffset":11804,"endOffset":11826,"count":0}],"isBlockCoverage":true},{"functionName":"et","ranges":[{"startOffset":11855,"endOffset":12088,"count":8}],"isBlockCoverage":true},{"functionName":"ot","ranges":[{"startOffset":12088,"endOffset":12292,"count":16},{"startOffset":12264,"endOffset":12287,"count":0}],"isBlockCoverage":true},{"functionName":"rt","ranges":[{"startOffset":12292,"endOffset":12366,"count":8},{"startOffset":12348,"endOffset":12362,"count":0}],"isBlockCoverage":true},{"functionName":"it","ranges":[{"startOffset":12366,"endOffset":12502,"count":0}],"isBlockCoverage":false},{"functionName":"st","ranges":[{"startOffset":12502,"endOffset":12786,"count":24},{"startOffset":12576,"endOffset":12621,"count":0},{"startOffset":12731,"endOffset":12745,"count":0},{"startOffset":12748,"endOffset":12754,"count":0}],"isBlockCoverage":true},{"functionName":"at","ranges":[{"startOffset":12786,"endOffset":13021,"count":2}],"isBlockCoverage":true},{"functionName":"epochNanoseconds","ranges":[{"startOffset":12806,"endOffset":12852,"count":8}],"isBlockCoverage":true},{"functionName":"epochMicroseconds","ranges":[{"startOffset":12853,"endOffset":12909,"count":0}],"isBlockCoverage":false},{"functionName":"epochMilliseconds","ranges":[{"startOffset":12910,"endOffset":12966,"count":0}],"isBlockCoverage":false},{"functionName":"epochSeconds","ranges":[{"startOffset":12967,"endOffset":13018,"count":0}],"isBlockCoverage":false},{"functionName":"dt","ranges":[{"startOffset":13133,"endOffset":13233,"count":6}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13181,"endOffset":13229,"count":24}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13184,"endOffset":13229,"count":8}],"isBlockCoverage":true},{"functionName":"ft","ranges":[{"startOffset":13409,"endOffset":13533,"count":5}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13435,"endOffset":13529,"count":53}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13438,"endOffset":13529,"count":0}],"isBlockCoverage":false},{"functionName":"mt","ranges":[{"startOffset":13533,"endOffset":13601,"count":11},{"startOffset":13562,"endOffset":13565,"count":1}],"isBlockCoverage":true},{"functionName":"yt","ranges":[{"startOffset":13657,"endOffset":14060,"count":8},{"startOffset":13742,"endOffset":14025,"count":0},{"startOffset":14044,"endOffset":14057,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13833,"endOffset":13960,"count":0}],"isBlockCoverage":false},{"functionName":"wt","ranges":[{"startOffset":14060,"endOffset":14218,"count":0}],"isBlockCoverage":false},{"functionName":"pt","ranges":[{"startOffset":14218,"endOffset":14420,"count":0}],"isBlockCoverage":false},{"functionName":"vt","ranges":[{"startOffset":14420,"endOffset":14577,"count":0}],"isBlockCoverage":false},{"functionName":"Mt","ranges":[{"startOffset":14577,"endOffset":14683,"count":0}],"isBlockCoverage":false},{"functionName":"bt","ranges":[{"startOffset":14683,"endOffset":14939,"count":8},{"startOffset":14763,"endOffset":14770,"count":0},{"startOffset":14771,"endOffset":14910,"count":0}],"isBlockCoverage":true},{"functionName":"St","ranges":[{"startOffset":14939,"endOffset":15101,"count":0}],"isBlockCoverage":false},{"functionName":"It","ranges":[{"startOffset":15101,"endOffset":15285,"count":0}],"isBlockCoverage":false},{"functionName":"Pt","ranges":[{"startOffset":15775,"endOffset":15822,"count":5}],"isBlockCoverage":true},{"functionName":"Rt","ranges":[{"startOffset":15822,"endOffset":15862,"count":48}],"isBlockCoverage":true},{"functionName":"kt","ranges":[{"startOffset":15862,"endOffset":15929,"count":0}],"isBlockCoverage":false},{"functionName":"xt","ranges":[{"startOffset":15929,"endOffset":15996,"count":8},{"startOffset":15964,"endOffset":15987,"count":0}],"isBlockCoverage":true},{"functionName":"jt","ranges":[{"startOffset":15996,"endOffset":16071,"count":0}],"isBlockCoverage":false},{"functionName":"qt","ranges":[{"startOffset":16071,"endOffset":16347,"count":8},{"startOffset":16217,"endOffset":16287,"count":0},{"startOffset":16289,"endOffset":16305,"count":0},{"startOffset":16319,"endOffset":16338,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16092,"endOffset":16154,"count":8}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16219,"endOffset":16272,"count":0}],"isBlockCoverage":false},{"functionName":"Lt","ranges":[{"startOffset":16363,"endOffset":16559,"count":16},{"startOffset":16406,"endOffset":16558,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16413,"endOffset":16546,"count":0}],"isBlockCoverage":false},{"functionName":"Bt","ranges":[{"startOffset":16559,"endOffset":16662,"count":8},{"startOffset":16632,"endOffset":16638,"count":0}],"isBlockCoverage":true},{"functionName":"$t","ranges":[{"startOffset":16662,"endOffset":16791,"count":8},{"startOffset":16705,"endOffset":16785,"count":0}],"isBlockCoverage":true},{"functionName":"At","ranges":[{"startOffset":16791,"endOffset":16921,"count":8},{"startOffset":16834,"endOffset":16915,"count":0}],"isBlockCoverage":true},{"functionName":"zt","ranges":[{"startOffset":16921,"endOffset":16986,"count":0}],"isBlockCoverage":false},{"functionName":"Wt","ranges":[{"startOffset":16986,"endOffset":17093,"count":8}],"isBlockCoverage":true},{"functionName":"Kt","ranges":[{"startOffset":17093,"endOffset":17214,"count":16},{"startOffset":17207,"endOffset":17210,"count":0}],"isBlockCoverage":true},{"functionName":"Gt","ranges":[{"startOffset":17214,"endOffset":17336,"count":0}],"isBlockCoverage":false},{"functionName":"Jt","ranges":[{"startOffset":17336,"endOffset":17379,"count":16}],"isBlockCoverage":true},{"functionName":"Qt","ranges":[{"startOffset":17379,"endOffset":17418,"count":48},{"startOffset":17411,"endOffset":17416,"count":24}],"isBlockCoverage":true},{"functionName":"Vt","ranges":[{"startOffset":17418,"endOffset":17457,"count":24},{"startOffset":17450,"endOffset":17455,"count":0}],"isBlockCoverage":true},{"functionName":"Xt","ranges":[{"startOffset":17457,"endOffset":17509,"count":0}],"isBlockCoverage":false},{"functionName":"_t","ranges":[{"startOffset":17509,"endOffset":17575,"count":0}],"isBlockCoverage":false},{"functionName":"ne","ranges":[{"startOffset":17575,"endOffset":17656,"count":8},{"startOffset":17635,"endOffset":17654,"count":0}],"isBlockCoverage":true},{"functionName":"te","ranges":[{"startOffset":17656,"endOffset":17716,"count":0}],"isBlockCoverage":false},{"functionName":"ee","ranges":[{"startOffset":17725,"endOffset":17750,"count":1}],"isBlockCoverage":true},{"functionName":"oe","ranges":[{"startOffset":17771,"endOffset":17815,"count":1}],"isBlockCoverage":true},{"functionName":"getPossibleOffsets","ranges":[{"startOffset":17815,"endOffset":17860,"count":8}],"isBlockCoverage":true},{"functionName":"getOffset","ranges":[{"startOffset":17860,"endOffset":17895,"count":16}],"isBlockCoverage":true},{"functionName":"getTransition","ranges":[{"startOffset":17895,"endOffset":17912,"count":0}],"isBlockCoverage":false},{"functionName":"re","ranges":[{"startOffset":17913,"endOffset":18006,"count":0}],"isBlockCoverage":false},{"functionName":"se","ranges":[{"startOffset":18034,"endOffset":18125,"count":0}],"isBlockCoverage":false},{"functionName":"ce","ranges":[{"startOffset":18154,"endOffset":18192,"count":0}],"isBlockCoverage":false},{"functionName":"de","ranges":[{"startOffset":18322,"endOffset":18359,"count":3}],"isBlockCoverage":true},{"functionName":"fe","ranges":[{"startOffset":18435,"endOffset":18699,"count":0}],"isBlockCoverage":false},{"functionName":"getPossibleOffsets","ranges":[{"startOffset":18699,"endOffset":19007,"count":0}],"isBlockCoverage":false},{"functionName":"getOffset","ranges":[{"startOffset":19007,"endOffset":19081,"count":0}],"isBlockCoverage":false},{"functionName":"getOffsetForEpochSecs","ranges":[{"startOffset":19081,"endOffset":19319,"count":0}],"isBlockCoverage":false},{"functionName":"getTransition","ranges":[{"startOffset":19319,"endOffset":19489,"count":0}],"isBlockCoverage":false},{"functionName":"getTransitionFrom","ranges":[{"startOffset":19489,"endOffset":19641,"count":0}],"isBlockCoverage":false},{"functionName":"getYearEndOffsetSec","ranges":[{"startOffset":19641,"endOffset":19751,"count":0}],"isBlockCoverage":false},{"functionName":"getTransitionsInYear","ranges":[{"startOffset":19751,"endOffset":19860,"count":0}],"isBlockCoverage":false},{"functionName":"computeTransitionsInYear","ranges":[{"startOffset":19860,"endOffset":20154,"count":0}],"isBlockCoverage":false},{"functionName":"searchTransition","ranges":[{"startOffset":20154,"endOffset":20300,"count":0}],"isBlockCoverage":false},{"functionName":"searchIsland","ranges":[{"startOffset":20300,"endOffset":20409,"count":0}],"isBlockCoverage":false},{"functionName":"we","ranges":[{"startOffset":20477,"endOffset":20776,"count":16},{"startOffset":20498,"endOffset":20542,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":20558,"endOffset":20771,"count":16},{"startOffset":20634,"endOffset":20770,"count":0}],"isBlockCoverage":true},{"functionName":"from","ranges":[{"startOffset":20783,"endOffset":21271,"count":16},{"startOffset":20799,"endOffset":20919,"count":0},{"startOffset":20946,"endOffset":21246,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":20806,"endOffset":20915,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":20983,"endOffset":21132,"count":0}],"isBlockCoverage":false},{"functionName":"get id","ranges":[{"startOffset":21271,"endOffset":21303,"count":0}],"isBlockCoverage":false},{"functionName":"getOffsetStringFor","ranges":[{"startOffset":21303,"endOffset":21368,"count":0}],"isBlockCoverage":false},{"functionName":"getOffsetNanosecondsFor","ranges":[{"startOffset":21368,"endOffset":21444,"count":16}],"isBlockCoverage":true},{"functionName":"getPlainDateTimeFor","ranges":[{"startOffset":21444,"endOffset":21570,"count":0}],"isBlockCoverage":false},{"functionName":"getInstantFor","ranges":[{"startOffset":21570,"endOffset":21619,"count":0}],"isBlockCoverage":false},{"functionName":"getPossibleInstantsFor","ranges":[{"startOffset":21619,"endOffset":21745,"count":8}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":21723,"endOffset":21742,"count":8}],"isBlockCoverage":true},{"functionName":"getPreviousTransition","ranges":[{"startOffset":21745,"endOffset":21848,"count":0}],"isBlockCoverage":false},{"functionName":"getNextTransition","ranges":[{"startOffset":21848,"endOffset":21946,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":21946,"endOffset":21976,"count":0}],"isBlockCoverage":false},{"functionName":"pe","ranges":[{"startOffset":21977,"endOffset":22084,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":22115,"endOffset":22246,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22276,"endOffset":22360,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22370,"endOffset":22503,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22523,"endOffset":22701,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22740,"endOffset":22850,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22863,"endOffset":22972,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22998,"endOffset":23044,"count":0}],"isBlockCoverage":true},{"functionName":"Ce","ranges":[{"startOffset":23047,"endOffset":23134,"count":0}],"isBlockCoverage":false},{"functionName":"Ue","ranges":[{"startOffset":23134,"endOffset":23216,"count":0}],"isBlockCoverage":false},{"functionName":"Pe","ranges":[{"startOffset":23216,"endOffset":23277,"count":0}],"isBlockCoverage":false},{"functionName":"Re","ranges":[{"startOffset":23277,"endOffset":23394,"count":0}],"isBlockCoverage":false},{"functionName":"ke","ranges":[{"startOffset":23394,"endOffset":23506,"count":0}],"isBlockCoverage":false},{"functionName":"xe","ranges":[{"startOffset":23506,"endOffset":23638,"count":0}],"isBlockCoverage":false},{"functionName":"je","ranges":[{"startOffset":23638,"endOffset":23765,"count":0}],"isBlockCoverage":false},{"functionName":"qe","ranges":[{"startOffset":23765,"endOffset":23846,"count":0}],"isBlockCoverage":false},{"functionName":"He","ranges":[{"startOffset":23846,"endOffset":23933,"count":0}],"isBlockCoverage":false},{"functionName":"Le","ranges":[{"startOffset":23933,"endOffset":24241,"count":13}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":23956,"endOffset":24240,"count":0}],"isBlockCoverage":false},{"functionName":"Be","ranges":[{"startOffset":24241,"endOffset":24287,"count":0}],"isBlockCoverage":false},{"functionName":"Ke","ranges":[{"startOffset":24378,"endOffset":24423,"count":24}],"isBlockCoverage":true},{"functionName":"Ge","ranges":[{"startOffset":24423,"endOffset":24470,"count":40},{"startOffset":24463,"endOffset":24469,"count":0}],"isBlockCoverage":true},{"functionName":"Je","ranges":[{"startOffset":24470,"endOffset":24543,"count":0}],"isBlockCoverage":false},{"functionName":"Qe","ranges":[{"startOffset":24543,"endOffset":24599,"count":8}],"isBlockCoverage":true},{"functionName":"Ve","ranges":[{"startOffset":24599,"endOffset":24731,"count":0}],"isBlockCoverage":false},{"functionName":"Xe","ranges":[{"startOffset":24731,"endOffset":24785,"count":8}],"isBlockCoverage":true},{"functionName":"_e","ranges":[{"startOffset":24785,"endOffset":24988,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":24810,"endOffset":24987,"count":0}],"isBlockCoverage":false},{"functionName":"no","ranges":[{"startOffset":24988,"endOffset":25030,"count":0}],"isBlockCoverage":false},{"functionName":"to","ranges":[{"startOffset":25030,"endOffset":25287,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":25055,"endOffset":25286,"count":0}],"isBlockCoverage":false},{"functionName":"eo","ranges":[{"startOffset":25287,"endOffset":25388,"count":0}],"isBlockCoverage":false},{"functionName":"oo","ranges":[{"startOffset":25388,"endOffset":25520,"count":0}],"isBlockCoverage":false},{"functionName":"ro","ranges":[{"startOffset":25520,"endOffset":26190,"count":0}],"isBlockCoverage":false},{"functionName":"io","ranges":[{"startOffset":26190,"endOffset":26259,"count":0}],"isBlockCoverage":false},{"functionName":"so","ranges":[{"startOffset":26259,"endOffset":26432,"count":7}],"isBlockCoverage":true},{"functionName":"n.toLocaleString","ranges":[{"startOffset":26303,"endOffset":26414,"count":0}],"isBlockCoverage":false},{"functionName":"ao","ranges":[{"startOffset":26432,"endOffset":26474,"count":0}],"isBlockCoverage":false},{"functionName":"co","ranges":[{"startOffset":26474,"endOffset":27105,"count":0}],"isBlockCoverage":false},{"functionName":"uo","ranges":[{"startOffset":27105,"endOffset":27349,"count":0}],"isBlockCoverage":false},{"functionName":"ho","ranges":[{"startOffset":27408,"endOffset":27563,"count":16}],"isBlockCoverage":true},{"functionName":"from","ranges":[{"startOffset":27570,"endOffset":27678,"count":8},{"startOffset":27618,"endOffset":27635,"count":0},{"startOffset":27654,"endOffset":27662,"count":0}],"isBlockCoverage":true},{"functionName":"compare","ranges":[{"startOffset":27685,"endOffset":27725,"count":0}],"isBlockCoverage":false},{"functionName":"with","ranges":[{"startOffset":27725,"endOffset":27762,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":27762,"endOffset":27793,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":27793,"endOffset":27832,"count":0}],"isBlockCoverage":false},{"functionName":"until","ranges":[{"startOffset":27832,"endOffset":27869,"count":0}],"isBlockCoverage":false},{"functionName":"since","ranges":[{"startOffset":27869,"endOffset":27906,"count":0}],"isBlockCoverage":false},{"functionName":"round","ranges":[{"startOffset":27906,"endOffset":27969,"count":0}],"isBlockCoverage":false},{"functionName":"equals","ranges":[{"startOffset":27969,"endOffset":28003,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":28003,"endOffset":28068,"count":8}],"isBlockCoverage":true},{"functionName":"toZonedDateTime","ranges":[{"startOffset":28068,"endOffset":28199,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainDateTime","ranges":[{"startOffset":28199,"endOffset":28255,"count":0}],"isBlockCoverage":false},{"functionName":"fo","ranges":[{"startOffset":28256,"endOffset":28370,"count":16}],"isBlockCoverage":true},{"functionName":"mo","ranges":[{"startOffset":28370,"endOffset":28417,"count":0}],"isBlockCoverage":false},{"functionName":"go","ranges":[{"startOffset":28417,"endOffset":28530,"count":0}],"isBlockCoverage":false},{"functionName":"yo","ranges":[{"startOffset":28530,"endOffset":28731,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":28766,"endOffset":29033,"count":0}],"isBlockCoverage":true},{"functionName":"po","ranges":[{"startOffset":29072,"endOffset":29220,"count":0}],"isBlockCoverage":false},{"functionName":"from","ranges":[{"startOffset":29227,"endOffset":29469,"count":0}],"isBlockCoverage":false},{"functionName":"compare","ranges":[{"startOffset":29476,"endOffset":29516,"count":0}],"isBlockCoverage":false},{"functionName":"with","ranges":[{"startOffset":29516,"endOffset":29546,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":29546,"endOffset":29581,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":29581,"endOffset":29624,"count":0}],"isBlockCoverage":false},{"functionName":"until","ranges":[{"startOffset":29624,"endOffset":29664,"count":0}],"isBlockCoverage":false},{"functionName":"since","ranges":[{"startOffset":29664,"endOffset":29704,"count":0}],"isBlockCoverage":false},{"functionName":"equals","ranges":[{"startOffset":29704,"endOffset":29738,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":29738,"endOffset":29852,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainDate","ranges":[{"startOffset":29852,"endOffset":29948,"count":0}],"isBlockCoverage":false},{"functionName":"vo","ranges":[{"startOffset":29949,"endOffset":30020,"count":0}],"isBlockCoverage":false},{"functionName":"Mo","ranges":[{"startOffset":30020,"endOffset":30120,"count":0}],"isBlockCoverage":false},{"functionName":"bo","ranges":[{"startOffset":30120,"endOffset":30215,"count":0}],"isBlockCoverage":false},{"functionName":"Io","ranges":[{"startOffset":30408,"endOffset":30569,"count":16}],"isBlockCoverage":true},{"functionName":"from","ranges":[{"startOffset":30576,"endOffset":30759,"count":0}],"isBlockCoverage":false},{"functionName":"compare","ranges":[{"startOffset":30766,"endOffset":30806,"count":0}],"isBlockCoverage":false},{"functionName":"get timeZone","ranges":[{"startOffset":30806,"endOffset":30857,"count":0}],"isBlockCoverage":false},{"functionName":"get offsetNanoseconds","ranges":[{"startOffset":30857,"endOffset":30897,"count":0}],"isBlockCoverage":false},{"functionName":"get offset","ranges":[{"startOffset":30897,"endOffset":30944,"count":0}],"isBlockCoverage":false},{"functionName":"with","ranges":[{"startOffset":30944,"endOffset":31016,"count":0}],"isBlockCoverage":false},{"functionName":"withPlainDate","ranges":[{"startOffset":31016,"endOffset":31150,"count":0}],"isBlockCoverage":false},{"functionName":"withPlainTime","ranges":[{"startOffset":31150,"endOffset":31243,"count":0}],"isBlockCoverage":false},{"functionName":"withCalendar","ranges":[{"startOffset":31243,"endOffset":31312,"count":0}],"isBlockCoverage":false},{"functionName":"withTimeZone","ranges":[{"startOffset":31312,"endOffset":31381,"count":8}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":31381,"endOffset":31416,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":31416,"endOffset":31459,"count":0}],"isBlockCoverage":false},{"functionName":"until","ranges":[{"startOffset":31459,"endOffset":31499,"count":0}],"isBlockCoverage":false},{"functionName":"since","ranges":[{"startOffset":31499,"endOffset":31539,"count":0}],"isBlockCoverage":false},{"functionName":"round","ranges":[{"startOffset":31539,"endOffset":31573,"count":0}],"isBlockCoverage":false},{"functionName":"equals","ranges":[{"startOffset":31573,"endOffset":31670,"count":0}],"isBlockCoverage":false},{"functionName":"startOfDay","ranges":[{"startOffset":31670,"endOffset":31771,"count":0}],"isBlockCoverage":false},{"functionName":"get hoursInDay","ranges":[{"startOffset":31771,"endOffset":31821,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":31821,"endOffset":32036,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainYearMonth","ranges":[{"startOffset":32036,"endOffset":32086,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainMonthDay","ranges":[{"startOffset":32086,"endOffset":32150,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainDateTime","ranges":[{"startOffset":32150,"endOffset":32199,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainDate","ranges":[{"startOffset":32199,"endOffset":32244,"count":8}],"isBlockCoverage":true},{"functionName":"toPlainTime","ranges":[{"startOffset":32244,"endOffset":32289,"count":8}],"isBlockCoverage":true},{"functionName":"toInstant","ranges":[{"startOffset":32289,"endOffset":32338,"count":0}],"isBlockCoverage":false},{"functionName":"Fo","ranges":[{"startOffset":32339,"endOffset":32419,"count":8}],"isBlockCoverage":true},{"functionName":"To","ranges":[{"startOffset":32419,"endOffset":32508,"count":16}],"isBlockCoverage":true},{"functionName":"Oo","ranges":[{"startOffset":32508,"endOffset":32736,"count":0}],"isBlockCoverage":false},{"functionName":"Do","ranges":[{"startOffset":32736,"endOffset":33060,"count":0}],"isBlockCoverage":false},{"functionName":"No","ranges":[{"startOffset":33060,"endOffset":33231,"count":0}],"isBlockCoverage":false},{"functionName":"Yo","ranges":[{"startOffset":33231,"endOffset":33548,"count":0}],"isBlockCoverage":false},{"functionName":"Eo","ranges":[{"startOffset":33548,"endOffset":33711,"count":0}],"isBlockCoverage":false},{"functionName":"Zo","ranges":[{"startOffset":33711,"endOffset":33868,"count":0}],"isBlockCoverage":false},{"functionName":"Co","ranges":[{"startOffset":33868,"endOffset":34103,"count":0}],"isBlockCoverage":false},{"functionName":"Uo","ranges":[{"startOffset":34103,"endOffset":34439,"count":0}],"isBlockCoverage":false},{"functionName":"ko","ranges":[{"startOffset":34672,"endOffset":35097,"count":0}],"isBlockCoverage":false},{"functionName":"from","ranges":[{"startOffset":35104,"endOffset":35154,"count":0}],"isBlockCoverage":false},{"functionName":"compare","ranges":[{"startOffset":35161,"endOffset":35405,"count":0}],"isBlockCoverage":false},{"functionName":"get years","ranges":[{"startOffset":35405,"endOffset":35439,"count":0}],"isBlockCoverage":false},{"functionName":"get months","ranges":[{"startOffset":35439,"endOffset":35475,"count":0}],"isBlockCoverage":false},{"functionName":"get weeks","ranges":[{"startOffset":35475,"endOffset":35509,"count":0}],"isBlockCoverage":false},{"functionName":"get days","ranges":[{"startOffset":35509,"endOffset":35541,"count":0}],"isBlockCoverage":false},{"functionName":"get hours","ranges":[{"startOffset":35541,"endOffset":35575,"count":0}],"isBlockCoverage":false},{"functionName":"get minutes","ranges":[{"startOffset":35575,"endOffset":35613,"count":0}],"isBlockCoverage":false},{"functionName":"get seconds","ranges":[{"startOffset":35613,"endOffset":35651,"count":0}],"isBlockCoverage":false},{"functionName":"get milliseconds","ranges":[{"startOffset":35651,"endOffset":35699,"count":0}],"isBlockCoverage":false},{"functionName":"get microseconds","ranges":[{"startOffset":35699,"endOffset":35747,"count":0}],"isBlockCoverage":false},{"functionName":"get nanoseconds","ranges":[{"startOffset":35747,"endOffset":35793,"count":0}],"isBlockCoverage":false},{"functionName":"get sign","ranges":[{"startOffset":35793,"endOffset":35825,"count":0}],"isBlockCoverage":false},{"functionName":"get blank","ranges":[{"startOffset":35825,"endOffset":35854,"count":0}],"isBlockCoverage":false},{"functionName":"with","ranges":[{"startOffset":35854,"endOffset":35896,"count":0}],"isBlockCoverage":false},{"functionName":"negated","ranges":[{"startOffset":35896,"endOffset":35929,"count":0}],"isBlockCoverage":false},{"functionName":"abs","ranges":[{"startOffset":35929,"endOffset":35977,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":35977,"endOffset":36012,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":36012,"endOffset":36055,"count":0}],"isBlockCoverage":false},{"functionName":"round","ranges":[{"startOffset":36055,"endOffset":36629,"count":0}],"isBlockCoverage":false},{"functionName":"total","ranges":[{"startOffset":36629,"endOffset":37000,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":37000,"endOffset":37438,"count":0}],"isBlockCoverage":false},{"functionName":"toLocaleString","ranges":[{"startOffset":37438,"endOffset":37481,"count":0}],"isBlockCoverage":false},{"functionName":"xo","ranges":[{"startOffset":37482,"endOffset":37616,"count":0}],"isBlockCoverage":false},{"functionName":"jo","ranges":[{"startOffset":37616,"endOffset":37889,"count":0}],"isBlockCoverage":false},{"functionName":"qo","ranges":[{"startOffset":37926,"endOffset":38160,"count":8}],"isBlockCoverage":true},{"functionName":"from","ranges":[{"startOffset":38167,"endOffset":38281,"count":0}],"isBlockCoverage":false},{"functionName":"compare","ranges":[{"startOffset":38288,"endOffset":38328,"count":0}],"isBlockCoverage":false},{"functionName":"with","ranges":[{"startOffset":38328,"endOffset":38377,"count":0}],"isBlockCoverage":false},{"functionName":"withPlainDate","ranges":[{"startOffset":38377,"endOffset":38486,"count":0}],"isBlockCoverage":false},{"functionName":"withPlainTime","ranges":[{"startOffset":38486,"endOffset":38563,"count":0}],"isBlockCoverage":false},{"functionName":"withCalendar","ranges":[{"startOffset":38563,"endOffset":38632,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":38632,"endOffset":38667,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":38667,"endOffset":38710,"count":0}],"isBlockCoverage":false},{"functionName":"until","ranges":[{"startOffset":38710,"endOffset":38750,"count":0}],"isBlockCoverage":false},{"functionName":"since","ranges":[{"startOffset":38750,"endOffset":38790,"count":0}],"isBlockCoverage":false},{"functionName":"round","ranges":[{"startOffset":38790,"endOffset":38881,"count":0}],"isBlockCoverage":false},{"functionName":"equals","ranges":[{"startOffset":38881,"endOffset":38915,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":38915,"endOffset":39019,"count":0}],"isBlockCoverage":false},{"functionName":"toZonedDateTime","ranges":[{"startOffset":39019,"endOffset":39125,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainYearMonth","ranges":[{"startOffset":39125,"endOffset":39175,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainMonthDay","ranges":[{"startOffset":39175,"endOffset":39239,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainDate","ranges":[{"startOffset":39239,"endOffset":39284,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainTime","ranges":[{"startOffset":39284,"endOffset":39329,"count":0}],"isBlockCoverage":false},{"functionName":"Ho","ranges":[{"startOffset":39330,"endOffset":39485,"count":8}],"isBlockCoverage":true},{"functionName":"Lo","ranges":[{"startOffset":39485,"endOffset":39688,"count":0}],"isBlockCoverage":false},{"functionName":"Bo","ranges":[{"startOffset":39688,"endOffset":39761,"count":0}],"isBlockCoverage":false},{"functionName":"$o","ranges":[{"startOffset":39947,"endOffset":40043,"count":0}],"isBlockCoverage":false},{"functionName":"from","ranges":[{"startOffset":40050,"endOffset":40293,"count":0}],"isBlockCoverage":false},{"functionName":"with","ranges":[{"startOffset":40293,"endOffset":40323,"count":0}],"isBlockCoverage":false},{"functionName":"equals","ranges":[{"startOffset":40323,"endOffset":40357,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":40357,"endOffset":40522,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainDate","ranges":[{"startOffset":40522,"endOffset":40646,"count":0}],"isBlockCoverage":false},{"functionName":"Ao","ranges":[{"startOffset":40647,"endOffset":40718,"count":0}],"isBlockCoverage":false},{"functionName":"zo","ranges":[{"startOffset":40718,"endOffset":40824,"count":0}],"isBlockCoverage":false},{"functionName":"Wo","ranges":[{"startOffset":40824,"endOffset":41025,"count":0}],"isBlockCoverage":false},{"functionName":"Ko","ranges":[{"startOffset":41025,"endOffset":41796,"count":0}],"isBlockCoverage":false},{"functionName":"Go","ranges":[{"startOffset":41796,"endOffset":41951,"count":0}],"isBlockCoverage":false},{"functionName":"Jo","ranges":[{"startOffset":41951,"endOffset":42035,"count":0}],"isBlockCoverage":false},{"functionName":"Qo","ranges":[{"startOffset":42035,"endOffset":42123,"count":0}],"isBlockCoverage":false},{"functionName":"Xo","ranges":[{"startOffset":42353,"endOffset":42591,"count":0}],"isBlockCoverage":false},{"functionName":"epochMilliseconds","ranges":[{"startOffset":42591,"endOffset":42663,"count":0}],"isBlockCoverage":false},{"functionName":"daysInMonth","ranges":[{"startOffset":42663,"endOffset":42790,"count":0}],"isBlockCoverage":false},{"functionName":"monthsInYear","ranges":[{"startOffset":42790,"endOffset":42847,"count":0}],"isBlockCoverage":false},{"functionName":"monthCode","ranges":[{"startOffset":42847,"endOffset":42972,"count":0}],"isBlockCoverage":false},{"functionName":"convertMonthCode","ranges":[{"startOffset":42972,"endOffset":43389,"count":0}],"isBlockCoverage":false},{"functionName":"inLeapYear","ranges":[{"startOffset":43389,"endOffset":43460,"count":0}],"isBlockCoverage":false},{"functionName":"guessYearForMonthDay","ranges":[{"startOffset":43460,"endOffset":43689,"count":0}],"isBlockCoverage":false},{"functionName":"normalizeISOYearForMonthDay","ranges":[{"startOffset":43689,"endOffset":43729,"count":0}],"isBlockCoverage":false},{"functionName":"computeFields","ranges":[{"startOffset":43729,"endOffset":43844,"count":0}],"isBlockCoverage":false},{"functionName":"computeFieldsDumb","ranges":[{"startOffset":43844,"endOffset":44083,"count":0}],"isBlockCoverage":false},{"functionName":"queryLeapMonthByYear","ranges":[{"startOffset":44083,"endOffset":44322,"count":0}],"isBlockCoverage":false},{"functionName":"queryMonthCache","ranges":[{"startOffset":44322,"endOffset":44416,"count":0}],"isBlockCoverage":false},{"functionName":"buildMonthCache","ranges":[{"startOffset":44416,"endOffset":44688,"count":0}],"isBlockCoverage":false},{"functionName":"guessISOYear","ranges":[{"startOffset":44688,"endOffset":44733,"count":0}],"isBlockCoverage":false},{"functionName":"_o","ranges":[{"startOffset":44734,"endOffset":44855,"count":0}],"isBlockCoverage":false},{"functionName":"japanese","ranges":[{"startOffset":44924,"endOffset":44985,"count":0}],"isBlockCoverage":false},{"functionName":"computeFields","ranges":[{"startOffset":44985,"endOffset":45136,"count":0}],"isBlockCoverage":false},{"functionName":"guessISOYear","ranges":[{"startOffset":45163,"endOffset":45209,"count":0}],"isBlockCoverage":false},{"functionName":"or","ranges":[{"startOffset":45228,"endOffset":45329,"count":24},{"startOffset":45297,"endOffset":45328,"count":0}],"isBlockCoverage":true},{"functionName":"cr","ranges":[{"startOffset":45449,"endOffset":45501,"count":40}],"isBlockCoverage":true},{"functionName":"ur","ranges":[{"startOffset":45501,"endOffset":45838,"count":40},{"startOffset":45783,"endOffset":45837,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":45521,"endOffset":45777,"count":40},{"startOffset":45767,"endOffset":45776,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":45542,"endOffset":45764,"count":40},{"startOffset":45580,"endOffset":45755,"count":1},{"startOffset":45614,"endOffset":45747,"count":0}],"isBlockCoverage":true},{"functionName":"dr","ranges":[{"startOffset":45838,"endOffset":45899,"count":0}],"isBlockCoverage":false},{"functionName":"lr","ranges":[{"startOffset":45899,"endOffset":45973,"count":0}],"isBlockCoverage":false},{"functionName":"mr","ranges":[{"startOffset":46009,"endOffset":46083,"count":24},{"startOffset":46046,"endOffset":46067,"count":0}],"isBlockCoverage":true},{"functionName":"from","ranges":[{"startOffset":46090,"endOffset":46303,"count":0}],"isBlockCoverage":false},{"functionName":"get id","ranges":[{"startOffset":46303,"endOffset":46335,"count":0}],"isBlockCoverage":false},{"functionName":"era","ranges":[{"startOffset":46335,"endOffset":46413,"count":0}],"isBlockCoverage":false},{"functionName":"eraYear","ranges":[{"startOffset":46413,"endOffset":46499,"count":0}],"isBlockCoverage":false},{"functionName":"year","ranges":[{"startOffset":46499,"endOffset":46579,"count":0}],"isBlockCoverage":false},{"functionName":"month","ranges":[{"startOffset":46579,"endOffset":46661,"count":0}],"isBlockCoverage":false},{"functionName":"monthCode","ranges":[{"startOffset":46661,"endOffset":46735,"count":0}],"isBlockCoverage":false},{"functionName":"day","ranges":[{"startOffset":46735,"endOffset":46810,"count":0}],"isBlockCoverage":false},{"functionName":"dayOfWeek","ranges":[{"startOffset":46810,"endOffset":46881,"count":0}],"isBlockCoverage":false},{"functionName":"dayOfYear","ranges":[{"startOffset":46881,"endOffset":46957,"count":0}],"isBlockCoverage":false},{"functionName":"weekOfYear","ranges":[{"startOffset":46957,"endOffset":47169,"count":0}],"isBlockCoverage":false},{"functionName":"daysInWeek","ranges":[{"startOffset":47169,"endOffset":47201,"count":0}],"isBlockCoverage":false},{"functionName":"daysInMonth","ranges":[{"startOffset":47201,"endOffset":47282,"count":0}],"isBlockCoverage":false},{"functionName":"daysInYear","ranges":[{"startOffset":47282,"endOffset":47345,"count":0}],"isBlockCoverage":false},{"functionName":"monthsInYear","ranges":[{"startOffset":47345,"endOffset":47420,"count":0}],"isBlockCoverage":false},{"functionName":"inLeapYear","ranges":[{"startOffset":47420,"endOffset":47475,"count":0}],"isBlockCoverage":false},{"functionName":"dateFromFields","ranges":[{"startOffset":47475,"endOffset":47576,"count":0}],"isBlockCoverage":false},{"functionName":"yearMonthFromFields","ranges":[{"startOffset":47576,"endOffset":47693,"count":0}],"isBlockCoverage":false},{"functionName":"monthDayFromFields","ranges":[{"startOffset":47693,"endOffset":48194,"count":0}],"isBlockCoverage":false},{"functionName":"dateAdd","ranges":[{"startOffset":48194,"endOffset":48494,"count":0}],"isBlockCoverage":false},{"functionName":"dateUntil","ranges":[{"startOffset":48494,"endOffset":49320,"count":0}],"isBlockCoverage":false},{"functionName":"fields","ranges":[{"startOffset":49320,"endOffset":49347,"count":0}],"isBlockCoverage":false},{"functionName":"mergeFields","ranges":[{"startOffset":49347,"endOffset":49379,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":49379,"endOffset":49409,"count":48}],"isBlockCoverage":true},{"functionName":"gr","ranges":[{"startOffset":49410,"endOffset":49449,"count":24}],"isBlockCoverage":true},{"functionName":"yr","ranges":[{"startOffset":49449,"endOffset":49945,"count":0}],"isBlockCoverage":false},{"functionName":"wr","ranges":[{"startOffset":49945,"endOffset":50021,"count":0}],"isBlockCoverage":false},{"functionName":"pr","ranges":[{"startOffset":50021,"endOffset":50085,"count":0}],"isBlockCoverage":false},{"functionName":"vr","ranges":[{"startOffset":50085,"endOffset":50148,"count":0}],"isBlockCoverage":false},{"functionName":"Mr","ranges":[{"startOffset":50148,"endOffset":50334,"count":0}],"isBlockCoverage":false},{"functionName":"br","ranges":[{"startOffset":50334,"endOffset":50427,"count":0}],"isBlockCoverage":false},{"functionName":"Sr","ranges":[{"startOffset":50464,"endOffset":50664,"count":16}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":50547,"endOffset":50622,"count":16},{"startOffset":50594,"endOffset":50609,"count":0}],"isBlockCoverage":true},{"functionName":"from","ranges":[{"startOffset":50671,"endOffset":50779,"count":8},{"startOffset":50708,"endOffset":50729,"count":0},{"startOffset":50748,"endOffset":50756,"count":0}],"isBlockCoverage":true},{"functionName":"compare","ranges":[{"startOffset":50786,"endOffset":50826,"count":0}],"isBlockCoverage":false},{"functionName":"with","ranges":[{"startOffset":50826,"endOffset":50856,"count":0}],"isBlockCoverage":false},{"functionName":"withCalendar","ranges":[{"startOffset":50856,"endOffset":50947,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":50947,"endOffset":50995,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":50995,"endOffset":51064,"count":0}],"isBlockCoverage":false},{"functionName":"until","ranges":[{"startOffset":51064,"endOffset":51104,"count":0}],"isBlockCoverage":false},{"functionName":"since","ranges":[{"startOffset":51104,"endOffset":51144,"count":0}],"isBlockCoverage":false},{"functionName":"equals","ranges":[{"startOffset":51144,"endOffset":51178,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":51178,"endOffset":51267,"count":8}],"isBlockCoverage":true},{"functionName":"toZonedDateTime","ranges":[{"startOffset":51267,"endOffset":51708,"count":8},{"startOffset":51610,"endOffset":51617,"count":0},{"startOffset":51691,"endOffset":51694,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":51294,"endOffset":51565,"count":8},{"startOffset":51336,"endOffset":51340,"count":0},{"startOffset":51367,"endOffset":51424,"count":0},{"startOffset":51440,"endOffset":51444,"count":0},{"startOffset":51485,"endOffset":51533,"count":0}],"isBlockCoverage":true},{"functionName":"toPlainDateTime","ranges":[{"startOffset":51708,"endOffset":51787,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainYearMonth","ranges":[{"startOffset":51787,"endOffset":51837,"count":0}],"isBlockCoverage":false},{"functionName":"toPlainMonthDay","ranges":[{"startOffset":51837,"endOffset":51901,"count":0}],"isBlockCoverage":false},{"functionName":"Ir","ranges":[{"startOffset":51902,"endOffset":51973,"count":16}],"isBlockCoverage":true},{"functionName":"Fr","ranges":[{"startOffset":51973,"endOffset":52036,"count":0}],"isBlockCoverage":false},{"functionName":"Tr","ranges":[{"startOffset":52036,"endOffset":52104,"count":0}],"isBlockCoverage":false},{"functionName":"Or","ranges":[{"startOffset":52104,"endOffset":52196,"count":0}],"isBlockCoverage":false},{"functionName":"Dr","ranges":[{"startOffset":52196,"endOffset":52800,"count":0}],"isBlockCoverage":false},{"functionName":"Nr","ranges":[{"startOffset":52800,"endOffset":52849,"count":0}],"isBlockCoverage":false},{"functionName":"Yr","ranges":[{"startOffset":53019,"endOffset":53118,"count":24}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":53059,"endOffset":53103,"count":24},{"startOffset":53096,"endOffset":53102,"count":0}],"isBlockCoverage":true},{"functionName":"from","ranges":[{"startOffset":53125,"endOffset":53325,"count":0}],"isBlockCoverage":false},{"functionName":"fromEpochSeconds","ranges":[{"startOffset":53332,"endOffset":53382,"count":0}],"isBlockCoverage":false},{"functionName":"fromEpochMilliseconds","ranges":[{"startOffset":53389,"endOffset":53444,"count":0}],"isBlockCoverage":false},{"functionName":"fromEpochMicroseconds","ranges":[{"startOffset":53451,"endOffset":53505,"count":0}],"isBlockCoverage":false},{"functionName":"fromEpochNanoseconds","ranges":[{"startOffset":53512,"endOffset":53553,"count":0}],"isBlockCoverage":false},{"functionName":"compare","ranges":[{"startOffset":53560,"endOffset":53600,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":53600,"endOffset":53643,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":53643,"endOffset":53694,"count":0}],"isBlockCoverage":false},{"functionName":"until","ranges":[{"startOffset":53694,"endOffset":53731,"count":0}],"isBlockCoverage":false},{"functionName":"since","ranges":[{"startOffset":53731,"endOffset":53768,"count":0}],"isBlockCoverage":false},{"functionName":"round","ranges":[{"startOffset":53768,"endOffset":53827,"count":0}],"isBlockCoverage":false},{"functionName":"equals","ranges":[{"startOffset":53827,"endOffset":53861,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":53861,"endOffset":54034,"count":0}],"isBlockCoverage":false},{"functionName":"toZonedDateTimeISO","ranges":[{"startOffset":54034,"endOffset":54095,"count":0}],"isBlockCoverage":false},{"functionName":"toZonedDateTime","ranges":[{"startOffset":54095,"endOffset":54366,"count":0}],"isBlockCoverage":false},{"functionName":"Er","ranges":[{"startOffset":54367,"endOffset":54540,"count":0}],"isBlockCoverage":false},{"functionName":"Pr","ranges":[{"startOffset":54790,"endOffset":54972,"count":0}],"isBlockCoverage":false},{"functionName":"format","ranges":[{"startOffset":54972,"endOffset":55057,"count":0}],"isBlockCoverage":false},{"functionName":"formatToParts","ranges":[{"startOffset":55057,"endOffset":55121,"count":0}],"isBlockCoverage":false},{"functionName":"formatRange","ranges":[{"startOffset":55121,"endOffset":55185,"count":0}],"isBlockCoverage":false},{"functionName":"formatRangeToParts","ranges":[{"startOffset":55185,"endOffset":55263,"count":0}],"isBlockCoverage":false},{"functionName":"kr","ranges":[{"startOffset":55276,"endOffset":55387,"count":0}],"isBlockCoverage":false},{"functionName":"xr","ranges":[{"startOffset":55387,"endOffset":55599,"count":0}],"isBlockCoverage":false},{"functionName":"jr","ranges":[{"startOffset":55599,"endOffset":55859,"count":0}],"isBlockCoverage":false},{"functionName":"zonedDateTimeISO","ranges":[{"startOffset":55886,"endOffset":55925,"count":0}],"isBlockCoverage":false},{"functionName":"zonedDateTime","ranges":[{"startOffset":55940,"endOffset":55973,"count":0}],"isBlockCoverage":false},{"functionName":"plainDateTimeISO","ranges":[{"startOffset":55991,"endOffset":56030,"count":0}],"isBlockCoverage":false},{"functionName":"plainDateTime","ranges":[{"startOffset":56045,"endOffset":56078,"count":0}],"isBlockCoverage":false},{"functionName":"plainDateISO","ranges":[{"startOffset":56092,"endOffset":56131,"count":0}],"isBlockCoverage":false},{"functionName":"plainDate","ranges":[{"startOffset":56142,"endOffset":56175,"count":0}],"isBlockCoverage":false},{"functionName":"plainTimeISO","ranges":[{"startOffset":56189,"endOffset":56228,"count":0}],"isBlockCoverage":false},{"functionName":"instant","ranges":[{"startOffset":56237,"endOffset":56268,"count":0}],"isBlockCoverage":false},{"functionName":"Hr","ranges":[{"startOffset":56295,"endOffset":56360,"count":0}],"isBlockCoverage":false},{"functionName":"Lr","ranges":[{"startOffset":56360,"endOffset":56451,"count":0}],"isBlockCoverage":false},{"functionName":"Br","ranges":[{"startOffset":56451,"endOffset":56496,"count":0}],"isBlockCoverage":false},{"functionName":"exports.getGlobalThis","ranges":[{"startOffset":56756,"endOffset":56822,"count":1},{"startOffset":56814,"endOffset":56821,"count":0}],"isBlockCoverage":true},{"functionName":"exports.toTemporalInstant","ranges":[{"startOffset":56849,"endOffset":56908,"count":0}],"isBlockCoverage":false}]},{"scriptId":"205","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/create_data.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7857,"count":1}],"isBlockCoverage":true},{"functionName":"createData","ranges":[{"startOffset":229,"endOffset":7784,"count":190},{"startOffset":315,"endOffset":388,"count":0},{"startOffset":446,"endOffset":512,"count":0},{"startOffset":561,"endOffset":569,"count":1},{"startOffset":570,"endOffset":584,"count":189},{"startOffset":586,"endOffset":654,"count":70},{"startOffset":629,"endOffset":637,"count":0},{"startOffset":656,"endOffset":935,"count":0},{"startOffset":988,"endOffset":996,"count":1},{"startOffset":997,"endOffset":1011,"count":189},{"startOffset":1013,"endOffset":3603,"count":70},{"startOffset":1084,"endOffset":1208,"count":67},{"startOffset":1208,"endOffset":3437,"count":3},{"startOffset":1255,"endOffset":1846,"count":0},{"startOffset":1901,"endOffset":2290,"count":0},{"startOffset":2348,"endOffset":2559,"count":0},{"startOffset":2614,"endOffset":2674,"count":0},{"startOffset":2730,"endOffset":2791,"count":0},{"startOffset":2841,"endOffset":2902,"count":0},{"startOffset":2952,"endOffset":3010,"count":0},{"startOffset":3060,"endOffset":3118,"count":0},{"startOffset":3168,"endOffset":3227,"count":0},{"startOffset":3280,"endOffset":3342,"count":0},{"startOffset":3437,"endOffset":3479,"count":67},{"startOffset":3479,"endOffset":3597,"count":0},{"startOffset":3603,"endOffset":7782,"count":120},{"startOffset":3656,"endOffset":3664,"count":1},{"startOffset":3665,"endOffset":3683,"count":119},{"startOffset":3685,"endOffset":6989,"count":102},{"startOffset":3735,"endOffset":4024,"count":96},{"startOffset":4037,"endOffset":4333,"count":0},{"startOffset":4346,"endOffset":4641,"count":0},{"startOffset":4654,"endOffset":5135,"count":0},{"startOffset":5148,"endOffset":5232,"count":0},{"startOffset":5245,"endOffset":5328,"count":0},{"startOffset":5341,"endOffset":5424,"count":0},{"startOffset":5437,"endOffset":5523,"count":2},{"startOffset":5536,"endOffset":5626,"count":4},{"startOffset":5639,"endOffset":5729,"count":0},{"startOffset":5742,"endOffset":5834,"count":0},{"startOffset":5847,"endOffset":6973,"count":0},{"startOffset":6989,"endOffset":7782,"count":18},{"startOffset":7042,"endOffset":7050,"count":1},{"startOffset":7051,"endOffset":7065,"count":17},{"startOffset":7067,"endOffset":7131,"count":0},{"startOffset":7184,"endOffset":7192,"count":1},{"startOffset":7193,"endOffset":7213,"count":17},{"startOffset":7215,"endOffset":7439,"count":8},{"startOffset":7439,"endOffset":7782,"count":10},{"startOffset":7492,"endOffset":7500,"count":1},{"startOffset":7501,"endOffset":7515,"count":9},{"startOffset":7517,"endOffset":7704,"count":0}],"isBlockCoverage":true}]},{"scriptId":"206","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/delete_internal.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5551,"count":1}],"isBlockCoverage":true},{"functionName":"__asyncValues","ranges":[{"startOffset":66,"endOffset":722,"count":433},{"startOffset":112,"endOffset":172,"count":0},{"startOffset":238,"endOffset":425,"count":0}],"isBlockCoverage":true},{"functionName":"i.","ranges":[{"startOffset":393,"endOffset":421,"count":0}],"isBlockCoverage":false},{"functionName":"verb","ranges":[{"startOffset":431,"endOffset":591,"count":0}],"isBlockCoverage":false},{"functionName":"settle","ranges":[{"startOffset":596,"endOffset":720,"count":0}],"isBlockCoverage":false},{"functionName":"deleteInternal","ranges":[{"startOffset":932,"endOffset":5466,"count":1502},{"startOffset":1072,"endOffset":1227,"count":2},{"startOffset":1146,"endOffset":1221,"count":0},{"startOffset":1276,"endOffset":1284,"count":0},{"startOffset":1310,"endOffset":1392,"count":1011},{"startOffset":1353,"endOffset":1361,"count":0},{"startOffset":1401,"endOffset":1486,"count":1011},{"startOffset":1444,"endOffset":1452,"count":0},{"startOffset":1495,"endOffset":1581,"count":1011},{"startOffset":1538,"endOffset":1546,"count":0},{"startOffset":1590,"endOffset":1671,"count":1011},{"startOffset":1633,"endOffset":1641,"count":0},{"startOffset":1680,"endOffset":1759,"count":1011},{"startOffset":1723,"endOffset":1731,"count":0},{"startOffset":1761,"endOffset":2117,"count":1011},{"startOffset":1830,"endOffset":1935,"count":0},{"startOffset":2117,"endOffset":2164,"count":491},{"startOffset":2165,"endOffset":2173,"count":0},{"startOffset":2174,"endOffset":2186,"count":491},{"startOffset":2188,"endOffset":2536,"count":3},{"startOffset":2242,"endOffset":2250,"count":0},{"startOffset":2324,"endOffset":2332,"count":0},{"startOffset":2365,"endOffset":2416,"count":0},{"startOffset":2468,"endOffset":2514,"count":789},{"startOffset":2536,"endOffset":2584,"count":488},{"startOffset":2585,"endOffset":2593,"count":0},{"startOffset":2594,"endOffset":2612,"count":488},{"startOffset":2624,"endOffset":3576,"count":55},{"startOffset":2677,"endOffset":2750,"count":0},{"startOffset":2852,"endOffset":3554,"count":1048},{"startOffset":2988,"endOffset":2996,"count":0},{"startOffset":3018,"endOffset":3427,"count":10},{"startOffset":3117,"endOffset":3319,"count":16},{"startOffset":3247,"endOffset":3301,"count":3},{"startOffset":3347,"endOffset":3413,"count":7},{"startOffset":3427,"endOffset":3544,"count":1038},{"startOffset":3486,"endOffset":3544,"count":1},{"startOffset":3576,"endOffset":3764,"count":433},{"startOffset":3764,"endOffset":3796,"count":1964},{"startOffset":3796,"endOffset":5255,"count":1531},{"startOffset":4015,"endOffset":4023,"count":0},{"startOffset":4041,"endOffset":4448,"count":685},{"startOffset":4102,"endOffset":4111,"count":283},{"startOffset":4112,"endOffset":4131,"count":402},{"startOffset":4182,"endOffset":4434,"count":327},{"startOffset":4247,"endOffset":4316,"count":0},{"startOffset":4448,"endOffset":5245,"count":846},{"startOffset":4510,"endOffset":4518,"count":0},{"startOffset":4536,"endOffset":4568,"count":0},{"startOffset":4570,"endOffset":4669,"count":0},{"startOffset":4731,"endOffset":4739,"count":0},{"startOffset":4761,"endOffset":4803,"count":3},{"startOffset":4805,"endOffset":4863,"count":3},{"startOffset":4863,"endOffset":5245,"count":843},{"startOffset":4925,"endOffset":4933,"count":0},{"startOffset":4986,"endOffset":5044,"count":44},{"startOffset":5044,"endOffset":5245,"count":799},{"startOffset":5088,"endOffset":5118,"count":0},{"startOffset":5120,"endOffset":5245,"count":0},{"startOffset":5266,"endOffset":5307,"count":0},{"startOffset":5307,"endOffset":5464,"count":433},{"startOffset":5356,"endOffset":5362,"count":0},{"startOffset":5363,"endOffset":5382,"count":0},{"startOffset":5384,"endOffset":5402,"count":0},{"startOffset":5440,"endOffset":5456,"count":0}],"isBlockCoverage":true}]},{"scriptId":"207","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/loop.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6265,"count":1}],"isBlockCoverage":true},{"functionName":"__asyncValues","ranges":[{"startOffset":66,"endOffset":722,"count":53},{"startOffset":112,"endOffset":172,"count":0},{"startOffset":238,"endOffset":425,"count":0}],"isBlockCoverage":true},{"functionName":"i.","ranges":[{"startOffset":393,"endOffset":421,"count":0}],"isBlockCoverage":false},{"functionName":"verb","ranges":[{"startOffset":431,"endOffset":591,"count":0}],"isBlockCoverage":false},{"functionName":"settle","ranges":[{"startOffset":596,"endOffset":720,"count":0}],"isBlockCoverage":false},{"functionName":"__await","ranges":[{"startOffset":764,"endOffset":850,"count":43548},{"startOffset":810,"endOffset":830,"count":21774},{"startOffset":831,"endOffset":847,"count":21774}],"isBlockCoverage":true},{"functionName":"__asyncDelegator","ranges":[{"startOffset":909,"endOffset":1223,"count":53}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":985,"endOffset":1010,"count":0}],"isBlockCoverage":false},{"functionName":"i.","ranges":[{"startOffset":1050,"endOffset":1078,"count":53}],"isBlockCoverage":true},{"functionName":"verb","ranges":[{"startOffset":1087,"endOffset":1221,"count":159},{"startOffset":1215,"endOffset":1218,"count":0}],"isBlockCoverage":true},{"functionName":"i.","ranges":[{"startOffset":1123,"endOffset":1214,"count":330},{"startOffset":1154,"endOffset":1196,"count":165},{"startOffset":1197,"endOffset":1211,"count":165},{"startOffset":1201,"endOffset":1207,"count":0}],"isBlockCoverage":true},{"functionName":"__asyncGenerator","ranges":[{"startOffset":1283,"endOffset":2162,"count":4740},{"startOffset":1358,"endOffset":1418,"count":0},{"startOffset":1467,"endOffset":1472,"count":0}],"isBlockCoverage":true},{"functionName":"i.","ranges":[{"startOffset":1576,"endOffset":1604,"count":4740}],"isBlockCoverage":true},{"functionName":"verb","ranges":[{"startOffset":1613,"endOffset":1751,"count":14220}],"isBlockCoverage":true},{"functionName":"i.","ranges":[{"startOffset":1649,"endOffset":1748,"count":22064}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1683,"endOffset":1744,"count":22064}],"isBlockCoverage":true},{"functionName":"resume","ranges":[{"startOffset":1756,"endOffset":1838,"count":43838},{"startOffset":1803,"endOffset":1836,"count":0}],"isBlockCoverage":true},{"functionName":"step","ranges":[{"startOffset":1843,"endOffset":1963,"count":43838},{"startOffset":1889,"endOffset":1939,"count":21774},{"startOffset":1940,"endOffset":1960,"count":22064}],"isBlockCoverage":true},{"functionName":"fulfill","ranges":[{"startOffset":1968,"endOffset":2018,"count":21774}],"isBlockCoverage":true},{"functionName":"reject","ranges":[{"startOffset":2023,"endOffset":2073,"count":0}],"isBlockCoverage":false},{"functionName":"settle","ranges":[{"startOffset":2078,"endOffset":2160,"count":22064},{"startOffset":2133,"endOffset":2158,"count":0}],"isBlockCoverage":true},{"functionName":"determineFromTo","ranges":[{"startOffset":2340,"endOffset":3060,"count":151},{"startOffset":2423,"endOffset":2561,"count":0}],"isBlockCoverage":true},{"functionName":"loop","ranges":[{"startOffset":3061,"endOffset":6211,"count":4740}],"isBlockCoverage":true},{"functionName":"loop_1","ranges":[{"startOffset":3138,"endOffset":6207,"count":4740},{"startOffset":3192,"endOffset":3253,"count":0},{"startOffset":3309,"endOffset":3599,"count":53},{"startOffset":3390,"endOffset":3460,"count":0},{"startOffset":3599,"endOffset":3673,"count":4687},{"startOffset":3673,"endOffset":3800,"count":334},{"startOffset":3800,"endOffset":3863,"count":4353},{"startOffset":3864,"endOffset":3872,"count":3669},{"startOffset":3873,"endOffset":3887,"count":684},{"startOffset":3889,"endOffset":3966,"count":45},{"startOffset":3932,"endOffset":3940,"count":0},{"startOffset":3967,"endOffset":3991,"count":45},{"startOffset":3992,"endOffset":3995,"count":4308},{"startOffset":4036,"endOffset":4057,"count":4353},{"startOffset":4058,"endOffset":4066,"count":3669},{"startOffset":4067,"endOffset":4079,"count":684},{"startOffset":4081,"endOffset":4109,"count":0},{"startOffset":4110,"endOffset":4128,"count":0},{"startOffset":4129,"endOffset":4137,"count":4353},{"startOffset":4193,"endOffset":4214,"count":4353},{"startOffset":4215,"endOffset":4223,"count":3669},{"startOffset":4224,"endOffset":4242,"count":684},{"startOffset":4244,"endOffset":4277,"count":252},{"startOffset":4278,"endOffset":4315,"count":252},{"startOffset":4317,"endOffset":4601,"count":151},{"startOffset":4601,"endOffset":4661,"count":4202},{"startOffset":4661,"endOffset":4915,"count":4353},{"startOffset":4915,"endOffset":6025,"count":19855},{"startOffset":4974,"endOffset":5020,"count":0},{"startOffset":5141,"endOffset":5149,"count":15867},{"startOffset":5150,"endOffset":5165,"count":3988},{"startOffset":5167,"endOffset":5451,"count":3957},{"startOffset":5214,"endOffset":5229,"count":3955},{"startOffset":5230,"endOffset":5255,"count":2},{"startOffset":5328,"endOffset":5433,"count":2643},{"startOffset":5451,"endOffset":5634,"count":17212},{"startOffset":5634,"endOffset":5734,"count":16954},{"startOffset":5735,"endOffset":5743,"count":15641},{"startOffset":5744,"endOffset":5756,"count":1313},{"startOffset":5772,"endOffset":5857,"count":16954},{"startOffset":5815,"endOffset":5823,"count":15641},{"startOffset":5824,"endOffset":5842,"count":1313},{"startOffset":5859,"endOffset":6011,"count":16497},{"startOffset":6044,"endOffset":6201,"count":4353},{"startOffset":6182,"endOffset":6185,"count":4252},{"startOffset":6186,"endOffset":6189,"count":101}],"isBlockCoverage":true}]},{"scriptId":"208","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/describe.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3378,"count":1}],"isBlockCoverage":true},{"functionName":"describe","ranges":[{"startOffset":141,"endOffset":3312,"count":10246},{"startOffset":228,"endOffset":2263,"count":10243},{"startOffset":286,"endOffset":434,"count":1955},{"startOffset":434,"endOffset":484,"count":8288},{"startOffset":484,"endOffset":529,"count":7900},{"startOffset":531,"endOffset":575,"count":392},{"startOffset":575,"endOffset":2257,"count":7896},{"startOffset":634,"endOffset":668,"count":7062},{"startOffset":670,"endOffset":714,"count":835},{"startOffset":714,"endOffset":2257,"count":7061},{"startOffset":772,"endOffset":816,"count":4304},{"startOffset":816,"endOffset":2257,"count":2757},{"startOffset":875,"endOffset":919,"count":0},{"startOffset":974,"endOffset":1018,"count":5},{"startOffset":1018,"endOffset":2257,"count":2752},{"startOffset":1073,"endOffset":1117,"count":0},{"startOffset":1173,"endOffset":1217,"count":3},{"startOffset":1217,"endOffset":2257,"count":2749},{"startOffset":1272,"endOffset":1316,"count":0},{"startOffset":1370,"endOffset":1414,"count":2},{"startOffset":1414,"endOffset":2257,"count":2747},{"startOffset":1471,"endOffset":1515,"count":3},{"startOffset":1515,"endOffset":2257,"count":2744},{"startOffset":1572,"endOffset":1616,"count":854},{"startOffset":1616,"endOffset":2257,"count":1890},{"startOffset":1674,"endOffset":1718,"count":44},{"startOffset":1718,"endOffset":2257,"count":1846},{"startOffset":1779,"endOffset":1823,"count":0},{"startOffset":1883,"endOffset":1927,"count":1836},{"startOffset":1927,"endOffset":2257,"count":10},{"startOffset":2032,"endOffset":2257,"count":0},{"startOffset":2263,"endOffset":2316,"count":8291},{"startOffset":2316,"endOffset":2371,"count":2},{"startOffset":2371,"endOffset":2394,"count":8291},{"startOffset":2394,"endOffset":2803,"count":3},{"startOffset":2461,"endOffset":2501,"count":1},{"startOffset":2514,"endOffset":2552,"count":1},{"startOffset":2565,"endOffset":2602,"count":1},{"startOffset":2670,"endOffset":2797,"count":0},{"startOffset":2803,"endOffset":2828,"count":8291},{"startOffset":2828,"endOffset":3086,"count":0},{"startOffset":3086,"endOffset":3108,"count":8291},{"startOffset":3108,"endOffset":3310,"count":0}],"isBlockCoverage":true}]},{"scriptId":"209","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/find.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6219,"count":1}],"isBlockCoverage":true},{"functionName":"find","ranges":[{"startOffset":184,"endOffset":6165,"count":1068},{"startOffset":331,"endOffset":339,"count":1057},{"startOffset":340,"endOffset":350,"count":11},{"startOffset":374,"endOffset":393,"count":7},{"startOffset":395,"endOffset":445,"count":7},{"startOffset":484,"endOffset":1082,"count":250},{"startOffset":606,"endOffset":711,"count":0},{"startOffset":1082,"endOffset":2136,"count":818},{"startOffset":1160,"endOffset":1298,"count":0},{"startOffset":1344,"endOffset":1424,"count":0},{"startOffset":1563,"endOffset":1626,"count":770},{"startOffset":1626,"endOffset":1994,"count":48},{"startOffset":1853,"endOffset":1913,"count":0},{"startOffset":1923,"endOffset":1994,"count":0},{"startOffset":2059,"endOffset":2064,"count":125},{"startOffset":2065,"endOffset":2069,"count":693},{"startOffset":2078,"endOffset":2136,"count":0},{"startOffset":2201,"endOffset":2614,"count":0},{"startOffset":2685,"endOffset":2743,"count":7},{"startOffset":2849,"endOffset":2971,"count":799},{"startOffset":2923,"endOffset":2961,"count":283},{"startOffset":3006,"endOffset":3400,"count":391},{"startOffset":3080,"endOffset":3394,"count":767},{"startOffset":3135,"endOffset":3159,"count":275},{"startOffset":3161,"endOffset":3276,"count":271},{"startOffset":3276,"endOffset":3384,"count":496},{"startOffset":3318,"endOffset":3384,"count":4},{"startOffset":3426,"endOffset":5053,"count":287},{"startOffset":3558,"endOffset":5047,"count":353},{"startOffset":4220,"endOffset":4729,"count":445},{"startOffset":4292,"endOffset":4412,"count":191},{"startOffset":4412,"endOffset":4658,"count":254},{"startOffset":4788,"endOffset":4850,"count":206},{"startOffset":4850,"endOffset":4927,"count":147},{"startOffset":4972,"endOffset":4997,"count":349},{"startOffset":4999,"endOffset":5037,"count":147},{"startOffset":5084,"endOffset":5157,"count":450},{"startOffset":5157,"endOffset":5240,"count":618},{"startOffset":5294,"endOffset":5302,"count":450},{"startOffset":5303,"endOffset":5313,"count":618},{"startOffset":5330,"endOffset":5595,"count":618},{"startOffset":5395,"endOffset":5440,"count":3},{"startOffset":5471,"endOffset":5509,"count":7},{"startOffset":5566,"endOffset":5574,"count":539},{"startOffset":5575,"endOffset":5588,"count":79},{"startOffset":5643,"endOffset":5651,"count":0},{"startOffset":5669,"endOffset":5766,"count":244},{"startOffset":5726,"endOffset":5734,"count":0},{"startOffset":5766,"endOffset":5861,"count":824},{"startOffset":5842,"endOffset":5854,"count":0},{"startOffset":5910,"endOffset":5918,"count":0},{"startOffset":5937,"endOffset":5947,"count":172},{"startOffset":5948,"endOffset":5961,"count":172},{"startOffset":5963,"endOffset":6067,"count":30},{"startOffset":6021,"endOffset":6029,"count":0},{"startOffset":6067,"endOffset":6163,"count":1038},{"startOffset":6135,"endOffset":6143,"count":896},{"startOffset":6144,"endOffset":6156,"count":142}],"isBlockCoverage":true}]},{"scriptId":"210","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/abap_regex.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":747,"count":1}],"isBlockCoverage":true},{"functionName":"convert","ranges":[{"startOffset":197,"endOffset":570,"count":808}],"isBlockCoverage":true},{"functionName":"escapeRegExp","ranges":[{"startOffset":582,"endOffset":673,"count":1446}],"isBlockCoverage":true}]},{"scriptId":"211","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/collect.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":586,"count":1}],"isBlockCoverage":true},{"functionName":"collect","ranges":[{"startOffset":246,"endOffset":523,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":345,"endOffset":403,"count":0}],"isBlockCoverage":false}]},{"scriptId":"212","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/overlay.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":646,"count":1}],"isBlockCoverage":true},{"functionName":"overlay","ranges":[{"startOffset":193,"endOffset":583,"count":0}],"isBlockCoverage":false}]},{"scriptId":"213","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/cast.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2227,"count":1}],"isBlockCoverage":true},{"functionName":"cast","ranges":[{"startOffset":345,"endOffset":2173,"count":9759},{"startOffset":435,"endOffset":482,"count":0},{"startOffset":601,"endOffset":783,"count":0},{"startOffset":835,"endOffset":871,"count":0},{"startOffset":873,"endOffset":927,"count":0},{"startOffset":1075,"endOffset":1083,"count":184},{"startOffset":1084,"endOffset":1102,"count":9575},{"startOffset":1211,"endOffset":1341,"count":376},{"startOffset":1398,"endOffset":1406,"count":376},{"startOffset":1407,"endOffset":1434,"count":9383},{"startOffset":1448,"endOffset":1755,"count":6947},{"startOffset":1670,"endOffset":1749,"count":2},{"startOffset":1755,"endOffset":2147,"count":2812},{"startOffset":1839,"endOffset":1847,"count":376},{"startOffset":1848,"endOffset":1875,"count":2436},{"startOffset":1889,"endOffset":2147,"count":2436},{"startOffset":2062,"endOffset":2141,"count":2},{"startOffset":2147,"endOffset":2172,"count":9755}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2001,"endOffset":2022,"count":2436}],"isBlockCoverage":true}]},{"scriptId":"214","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_bit.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":570,"count":1}],"isBlockCoverage":true},{"functionName":"getBit","ranges":[{"startOffset":102,"endOffset":509,"count":40712},{"startOffset":266,"endOffset":325,"count":0}],"isBlockCoverage":true}]},{"scriptId":"215","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/read_report.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":465,"count":1}],"isBlockCoverage":true},{"functionName":"readReport","ranges":[{"startOffset":143,"endOffset":392,"count":0}],"isBlockCoverage":false}]},{"scriptId":"216","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/raise_event.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":228,"count":1}],"isBlockCoverage":true},{"functionName":"raiseEvent","ranges":[{"startOffset":106,"endOffset":155,"count":0}],"isBlockCoverage":false}]},{"scriptId":"217","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/receive.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1135,"count":1}],"isBlockCoverage":true},{"functionName":"_receiveSetResult","ranges":[{"startOffset":154,"endOffset":214,"count":0}],"isBlockCoverage":false},{"functionName":"receive","ranges":[{"startOffset":262,"endOffset":1072,"count":0}],"isBlockCoverage":false}]},{"scriptId":"218","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_locale.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":238,"count":1}],"isBlockCoverage":true},{"functionName":"getLocale","ranges":[{"startOffset":105,"endOffset":168,"count":1}],"isBlockCoverage":true}]},{"scriptId":"219","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_parameter.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":343,"count":1}],"isBlockCoverage":true},{"functionName":"getParameter","ranges":[{"startOffset":108,"endOffset":264,"count":1}],"isBlockCoverage":true}]},{"scriptId":"220","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/set_locale.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":218,"count":1}],"isBlockCoverage":true},{"functionName":"setLocale","ranges":[{"startOffset":105,"endOffset":148,"count":0}],"isBlockCoverage":false}]},{"scriptId":"221","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_run_time.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":437,"count":1}],"isBlockCoverage":true},{"functionName":"getRunTime","ranges":[{"startOffset":128,"endOffset":363,"count":0}],"isBlockCoverage":false}]},{"scriptId":"222","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_time.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1126,"count":1}],"isBlockCoverage":true},{"functionName":"getTime","ranges":[{"startOffset":103,"endOffset":1062,"count":18},{"startOffset":490,"endOffset":519,"count":0},{"startOffset":568,"endOffset":576,"count":0},{"startOffset":606,"endOffset":673,"count":17},{"startOffset":873,"endOffset":881,"count":0},{"startOffset":899,"endOffset":939,"count":0},{"startOffset":987,"endOffset":995,"count":0},{"startOffset":1013,"endOffset":1060,"count":17}],"isBlockCoverage":true}]},{"scriptId":"223","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/insert_database.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2164,"count":1}],"isBlockCoverage":true},{"functionName":"toValue","ranges":[{"startOffset":167,"endOffset":434,"count":0}],"isBlockCoverage":false},{"functionName":"InsertDatabase","ranges":[{"startOffset":489,"endOffset":549,"count":0}],"isBlockCoverage":false},{"functionName":"insertDatabase","ranges":[{"startOffset":554,"endOffset":2077,"count":0}],"isBlockCoverage":false}]},{"scriptId":"224","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/prefix.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":326,"count":1}],"isBlockCoverage":true},{"functionName":"prefixDbTable","ranges":[{"startOffset":109,"endOffset":252,"count":0}],"isBlockCoverage":false}]},{"scriptId":"225","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/delete_database.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2117,"count":1}],"isBlockCoverage":true},{"functionName":"DeleteDatabase","ranges":[{"startOffset":269,"endOffset":329,"count":0}],"isBlockCoverage":false},{"functionName":"deleteDatabase","ranges":[{"startOffset":334,"endOffset":2030,"count":0}],"isBlockCoverage":false}]},{"scriptId":"226","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/message.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3264,"count":1}],"isBlockCoverage":true},{"functionName":"replace","ranges":[{"startOffset":112,"endOffset":755,"count":129},{"startOffset":172,"endOffset":729,"count":774},{"startOffset":261,"endOffset":524,"count":516},{"startOffset":330,"endOffset":374,"count":0},{"startOffset":585,"endOffset":677,"count":516}],"isBlockCoverage":true},{"functionName":"findText","ranges":[{"startOffset":756,"endOffset":1700,"count":129},{"startOffset":1151,"endOffset":1208,"count":127},{"startOffset":1227,"endOffset":1282,"count":0},{"startOffset":1317,"endOffset":1503,"count":2},{"startOffset":1407,"endOffset":1415,"count":0},{"startOffset":1485,"endOffset":1496,"count":0},{"startOffset":1532,"endOffset":1681,"count":2},{"startOffset":1619,"endOffset":1627,"count":0}],"isBlockCoverage":true},{"functionName":"MessageStatement","ranges":[{"startOffset":1730,"endOffset":1790,"count":129}],"isBlockCoverage":true},{"functionName":"message","ranges":[{"startOffset":1795,"endOffset":3181,"count":129},{"startOffset":1914,"endOffset":1958,"count":49},{"startOffset":2010,"endOffset":2018,"count":0},{"startOffset":2138,"endOffset":2182,"count":49},{"startOffset":2234,"endOffset":2242,"count":0},{"startOffset":2334,"endOffset":2339,"count":0},{"startOffset":2440,"endOffset":2484,"count":49},{"startOffset":2553,"endOffset":2558,"count":0},{"startOffset":2689,"endOffset":2776,"count":0},{"startOffset":3007,"endOffset":3175,"count":0}],"isBlockCoverage":true}]},{"scriptId":"227","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/modify_database.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1526,"count":1}],"isBlockCoverage":true},{"functionName":"ModifyDatabase","ranges":[{"startOffset":286,"endOffset":346,"count":0}],"isBlockCoverage":false},{"functionName":"modifyDatabase","ranges":[{"startOffset":351,"endOffset":1439,"count":0}],"isBlockCoverage":false}]},{"scriptId":"228","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/update_database.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1962,"count":1}],"isBlockCoverage":true},{"functionName":"UpdateDatabase","ranges":[{"startOffset":269,"endOffset":329,"count":0}],"isBlockCoverage":false},{"functionName":"updateDatabase","ranges":[{"startOffset":334,"endOffset":1875,"count":0}],"isBlockCoverage":false}]},{"scriptId":"229","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/modify_internal.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1871,"count":1}],"isBlockCoverage":true},{"functionName":"modifyInternal","ranges":[{"startOffset":305,"endOffset":1786,"count":4},{"startOffset":393,"endOffset":620,"count":0},{"startOffset":648,"endOffset":671,"count":0},{"startOffset":672,"endOffset":687,"count":0},{"startOffset":689,"endOffset":1322,"count":0},{"startOffset":1714,"endOffset":1717,"count":0}],"isBlockCoverage":true}]},{"scriptId":"230","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/move_corresponding.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":400,"count":1}],"isBlockCoverage":true},{"functionName":"moveCorresponding","ranges":[{"startOffset":113,"endOffset":306,"count":77},{"startOffset":204,"endOffset":304,"count":684},{"startOffset":263,"endOffset":271,"count":386},{"startOffset":272,"endOffset":297,"count":298}],"isBlockCoverage":true}]},{"scriptId":"231","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/replace.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2563,"count":1}],"isBlockCoverage":true},{"functionName":"replace","ranges":[{"startOffset":235,"endOffset":2500,"count":1420},{"startOffset":308,"endOffset":470,"count":4},{"startOffset":358,"endOffset":448,"count":0},{"startOffset":470,"endOffset":557,"count":1416},{"startOffset":557,"endOffset":562,"count":408},{"startOffset":563,"endOffset":567,"count":1008},{"startOffset":615,"endOffset":620,"count":1385},{"startOffset":621,"endOffset":625,"count":31},{"startOffset":696,"endOffset":1113,"count":1378},{"startOffset":783,"endOffset":835,"count":883},{"startOffset":865,"endOffset":886,"count":2},{"startOffset":888,"endOffset":947,"count":0},{"startOffset":1113,"endOffset":1947,"count":38},{"startOffset":1247,"endOffset":1268,"count":0},{"startOffset":1270,"endOffset":1329,"count":0},{"startOffset":1444,"endOffset":1947,"count":0},{"startOffset":1947,"endOffset":2005,"count":1416},{"startOffset":2005,"endOffset":2037,"count":0},{"startOffset":2037,"endOffset":2338,"count":1416},{"startOffset":2102,"endOffset":2155,"count":1154},{"startOffset":2155,"endOffset":2215,"count":262},{"startOffset":2338,"endOffset":2400,"count":1416},{"startOffset":2400,"endOffset":2403,"count":116},{"startOffset":2404,"endOffset":2407,"count":1300}],"isBlockCoverage":true}]},{"scriptId":"232","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/rollback.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":205,"count":1}],"isBlockCoverage":true},{"functionName":"rollback","ranges":[{"startOffset":104,"endOffset":139,"count":0}],"isBlockCoverage":false}]},{"scriptId":"233","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/select.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3567,"count":1}],"isBlockCoverage":true},{"functionName":"SelectDatabase","ranges":[{"startOffset":211,"endOffset":271,"count":13}],"isBlockCoverage":true},{"functionName":"select","ranges":[{"startOffset":276,"endOffset":3489,"count":13},{"startOffset":418,"endOffset":470,"count":12},{"startOffset":470,"endOffset":667,"count":1},{"startOffset":519,"endOffset":589,"count":0},{"startOffset":667,"endOffset":733,"count":12},{"startOffset":734,"endOffset":742,"count":11},{"startOffset":743,"endOffset":769,"count":1},{"startOffset":781,"endOffset":1008,"count":11},{"startOffset":822,"endOffset":885,"count":0},{"startOffset":958,"endOffset":966,"count":0},{"startOffset":1008,"endOffset":1040,"count":12},{"startOffset":1040,"endOffset":1145,"count":11},{"startOffset":1145,"endOffset":1195,"count":1},{"startOffset":1195,"endOffset":1637,"count":0},{"startOffset":1637,"endOffset":3143,"count":1},{"startOffset":1687,"endOffset":1727,"count":0},{"startOffset":1954,"endOffset":2431,"count":3},{"startOffset":2073,"endOffset":2250,"count":0},{"startOffset":2374,"endOffset":2382,"count":0},{"startOffset":2449,"endOffset":2602,"count":0},{"startOffset":2755,"endOffset":3143,"count":0},{"startOffset":3143,"endOffset":3177,"count":1},{"startOffset":3177,"endOffset":3197,"count":0},{"startOffset":3199,"endOffset":3308,"count":0},{"startOffset":3308,"endOffset":3488,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":855,"endOffset":869,"count":0}],"isBlockCoverage":false}]},{"scriptId":"234","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/set_bit.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1355,"count":1}],"isBlockCoverage":true},{"functionName":"setBit","ranges":[{"startOffset":102,"endOffset":1294,"count":0}],"isBlockCoverage":false}]},{"scriptId":"235","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/shift.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3888,"count":1}],"isBlockCoverage":true},{"functionName":"shift","ranges":[{"startOffset":179,"endOffset":413,"count":4067},{"startOffset":261,"endOffset":269,"count":0},{"startOffset":298,"endOffset":347,"count":0}],"isBlockCoverage":true},{"functionName":"shift_character_mode","ranges":[{"startOffset":437,"endOffset":2528,"count":4067},{"startOffset":563,"endOffset":571,"count":0},{"startOffset":599,"endOffset":891,"count":4040},{"startOffset":837,"endOffset":885,"count":19305},{"startOffset":891,"endOffset":2401,"count":27},{"startOffset":944,"endOffset":952,"count":0},{"startOffset":981,"endOffset":1362,"count":25},{"startOffset":1225,"endOffset":1346,"count":3},{"startOffset":1362,"endOffset":2401,"count":2},{"startOffset":1415,"endOffset":1423,"count":0},{"startOffset":1442,"endOffset":1651,"count":0},{"startOffset":1704,"endOffset":1712,"count":0},{"startOffset":1794,"endOffset":1834,"count":0},{"startOffset":2016,"endOffset":2401,"count":0},{"startOffset":2442,"endOffset":2482,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":805,"endOffset":834,"count":27360}],"isBlockCoverage":true},{"functionName":"shift_byte_mode","ranges":[{"startOffset":2529,"endOffset":3854,"count":0}],"isBlockCoverage":false}]},{"scriptId":"236","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/wait.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":429,"count":1}],"isBlockCoverage":true},{"functionName":"wait","ranges":[{"startOffset":100,"endOffset":375,"count":0}],"isBlockCoverage":false}]},{"scriptId":"237","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/set_handler.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":253,"count":1}],"isBlockCoverage":true},{"functionName":"setHandler","ranges":[{"startOffset":106,"endOffset":180,"count":0}],"isBlockCoverage":false}]},{"scriptId":"238","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/split.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1466,"count":1}],"isBlockCoverage":true},{"functionName":"split","ranges":[{"startOffset":138,"endOffset":1409,"count":2629},{"startOffset":225,"endOffset":263,"count":0},{"startOffset":320,"endOffset":371,"count":0},{"startOffset":470,"endOffset":480,"count":0},{"startOffset":537,"endOffset":555,"count":2495},{"startOffset":556,"endOffset":560,"count":134},{"startOffset":583,"endOffset":920,"count":495},{"startOffset":618,"endOffset":654,"count":240},{"startOffset":715,"endOffset":787,"count":3163},{"startOffset":814,"endOffset":835,"count":472},{"startOffset":837,"endOffset":914,"count":86},{"startOffset":944,"endOffset":1407,"count":2134},{"startOffset":978,"endOffset":1021,"count":25},{"startOffset":1061,"endOffset":1202,"count":7382},{"startOffset":1120,"endOffset":1192,"count":6751},{"startOffset":1233,"endOffset":1401,"count":35}],"isBlockCoverage":true}]},{"scriptId":"239","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/translate.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1219,"count":1}],"isBlockCoverage":true},{"functionName":"translate","ranges":[{"startOffset":105,"endOffset":1150,"count":8955},{"startOffset":182,"endOffset":210,"count":0},{"startOffset":234,"endOffset":287,"count":139},{"startOffset":287,"endOffset":1148,"count":8816},{"startOffset":316,"endOffset":369,"count":8788},{"startOffset":369,"endOffset":1148,"count":28},{"startOffset":459,"endOffset":464,"count":0},{"startOffset":466,"endOffset":1142,"count":52},{"startOffset":999,"endOffset":1054,"count":0}],"isBlockCoverage":true}]},{"scriptId":"240","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/call_transaction.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":630,"count":1}],"isBlockCoverage":true},{"functionName":"callTransaction","ranges":[{"startOffset":111,"endOffset":542,"count":0}],"isBlockCoverage":false}]},{"scriptId":"241","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/write.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2316,"count":1}],"isBlockCoverage":true},{"functionName":"WriteStatement","ranges":[{"startOffset":174,"endOffset":234,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":239,"endOffset":2239,"count":0}],"isBlockCoverage":false}]},{"scriptId":"242","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/call_function.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2233,"count":1}],"isBlockCoverage":true},{"functionName":"CallFunction","ranges":[{"startOffset":259,"endOffset":319,"count":0}],"isBlockCoverage":false},{"functionName":"callFunction","ranges":[{"startOffset":385,"endOffset":2152,"count":0}],"isBlockCoverage":false}]},{"scriptId":"243","url":"node:util/types","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":64,"count":1}],"isBlockCoverage":false}]},{"scriptId":"244","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/template_formatting.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3449,"count":1}],"isBlockCoverage":true},{"functionName":"templateFormatting","ranges":[{"startOffset":150,"endOffset":3352,"count":1668},{"startOffset":263,"endOffset":445,"count":92},{"startOffset":312,"endOffset":374,"count":0},{"startOffset":445,"endOffset":736,"count":1576},{"startOffset":533,"endOffset":591,"count":0},{"startOffset":642,"endOffset":685,"count":192},{"startOffset":685,"endOffset":736,"count":1384},{"startOffset":736,"endOffset":784,"count":1576},{"startOffset":785,"endOffset":793,"count":1565},{"startOffset":794,"endOffset":812,"count":11},{"startOffset":829,"endOffset":901,"count":0},{"startOffset":901,"endOffset":949,"count":1576},{"startOffset":950,"endOffset":958,"count":1565},{"startOffset":959,"endOffset":973,"count":11},{"startOffset":986,"endOffset":1079,"count":0},{"startOffset":1079,"endOffset":1127,"count":1576},{"startOffset":1128,"endOffset":1136,"count":1565},{"startOffset":1137,"endOffset":1151,"count":11},{"startOffset":1164,"endOffset":1257,"count":0},{"startOffset":1257,"endOffset":1305,"count":1576},{"startOffset":1306,"endOffset":1314,"count":1565},{"startOffset":1315,"endOffset":1334,"count":11},{"startOffset":1347,"endOffset":1741,"count":11},{"startOffset":1682,"endOffset":1735,"count":0},{"startOffset":1741,"endOffset":3333,"count":1565},{"startOffset":1804,"endOffset":1819,"count":0},{"startOffset":1821,"endOffset":1835,"count":0},{"startOffset":1837,"endOffset":2062,"count":0},{"startOffset":2124,"endOffset":2139,"count":0},{"startOffset":2141,"endOffset":2206,"count":0},{"startOffset":2269,"endOffset":2287,"count":0},{"startOffset":2289,"endOffset":2325,"count":0},{"startOffset":2327,"endOffset":2389,"count":0},{"startOffset":2437,"endOffset":2683,"count":24},{"startOffset":2499,"endOffset":2517,"count":0},{"startOffset":2519,"endOffset":2589,"count":0},{"startOffset":2683,"endOffset":3333,"count":1541},{"startOffset":2746,"endOffset":2764,"count":0},{"startOffset":2766,"endOffset":2800,"count":0},{"startOffset":2802,"endOffset":2867,"count":0},{"startOffset":2919,"endOffset":3099,"count":1},{"startOffset":2993,"endOffset":3039,"count":0},{"startOffset":3099,"endOffset":3333,"count":1540},{"startOffset":3146,"endOffset":3333,"count":0},{"startOffset":3333,"endOffset":3351,"count":1576}],"isBlockCoverage":true}]},{"scriptId":"245","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/unit_test.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2256,"count":1}],"isBlockCoverage":true},{"functionName":"UnitTestMethodResult","ranges":[{"startOffset":172,"endOffset":289,"count":696}],"isBlockCoverage":true},{"functionName":"pass","ranges":[{"startOffset":294,"endOffset":338,"count":607}],"isBlockCoverage":true},{"functionName":"fail","ranges":[{"startOffset":343,"endOffset":387,"count":0}],"isBlockCoverage":false},{"functionName":"skip","ranges":[{"startOffset":392,"endOffset":436,"count":89}],"isBlockCoverage":true},{"functionName":"UnitTestClassResult","ranges":[{"startOffset":471,"endOffset":549,"count":146}],"isBlockCoverage":true},{"functionName":"addMethod","ranges":[{"startOffset":554,"endOffset":681,"count":696}],"isBlockCoverage":true},{"functionName":"UnitTestObjectResult","ranges":[{"startOffset":717,"endOffset":795,"count":146}],"isBlockCoverage":true},{"functionName":"addTestClass","ranges":[{"startOffset":800,"endOffset":929,"count":146}],"isBlockCoverage":true},{"functionName":"UnitTestResult","ranges":[{"startOffset":959,"endOffset":1007,"count":1}],"isBlockCoverage":true},{"functionName":"addObject","ranges":[{"startOffset":1012,"endOffset":1139,"count":146}],"isBlockCoverage":true},{"functionName":"xUnitXML","ranges":[{"startOffset":1144,"endOffset":2175,"count":1},{"startOffset":1471,"endOffset":2117,"count":146},{"startOffset":1752,"endOffset":2009,"count":696}],"isBlockCoverage":true}]},{"scriptId":"246","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/index.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4109,"count":1},{"startOffset":407,"endOffset":488,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":88,"endOffset":405,"count":43},{"startOffset":232,"endOffset":247,"count":0},{"startOffset":264,"endOffset":284,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":327,"endOffset":354,"count":375418}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":410,"endOffset":487,"count":0}],"isBlockCoverage":true},{"functionName":"__exportStar","ranges":[{"startOffset":541,"endOffset":692,"count":43}],"isBlockCoverage":true}]},{"scriptId":"247","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/abs.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":471,"count":1}],"isBlockCoverage":true},{"functionName":"abs","ranges":[{"startOffset":99,"endOffset":420,"count":0}],"isBlockCoverage":false}]},{"scriptId":"248","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/boolc.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":745,"count":1}],"isBlockCoverage":true},{"functionName":"boolc","ranges":[{"startOffset":138,"endOffset":688,"count":811},{"startOffset":186,"endOffset":239,"count":412},{"startOffset":239,"endOffset":686,"count":399},{"startOffset":269,"endOffset":291,"count":0},{"startOffset":346,"endOffset":686,"count":0}],"isBlockCoverage":true}]},{"scriptId":"249","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/ceil.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":635,"count":1}],"isBlockCoverage":true},{"functionName":"ceil","ranges":[{"startOffset":164,"endOffset":581,"count":0}],"isBlockCoverage":false}]},{"scriptId":"250","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/concat_lines_of.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":500,"count":1}],"isBlockCoverage":true},{"functionName":"concat_lines_of","ranges":[{"startOffset":156,"endOffset":413,"count":116},{"startOffset":238,"endOffset":261,"count":79},{"startOffset":261,"endOffset":326,"count":37}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":388,"endOffset":400,"count":759}],"isBlockCoverage":true}]},{"scriptId":"251","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/condense.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":977,"count":1}],"isBlockCoverage":true},{"functionName":"condense","ranges":[{"startOffset":141,"endOffset":911,"count":56},{"startOffset":212,"endOffset":223,"count":0},{"startOffset":294,"endOffset":391,"count":0},{"startOffset":428,"endOffset":517,"count":0}],"isBlockCoverage":true}]},{"scriptId":"252","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/contains.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":900,"count":1}],"isBlockCoverage":true},{"functionName":"contains","ranges":[{"startOffset":141,"endOffset":834,"count":0}],"isBlockCoverage":false}]},{"scriptId":"253","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/cos.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":629,"count":1}],"isBlockCoverage":true},{"functionName":"cos","ranges":[{"startOffset":163,"endOffset":578,"count":0}],"isBlockCoverage":false}]},{"scriptId":"254","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/count_any_of.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":615,"count":1}],"isBlockCoverage":true},{"functionName":"count_any_of","ranges":[{"startOffset":145,"endOffset":537,"count":0}],"isBlockCoverage":false}]},{"scriptId":"255","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/count.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":998,"count":1}],"isBlockCoverage":true},{"functionName":"count","ranges":[{"startOffset":179,"endOffset":941,"count":0}],"isBlockCoverage":false}]},{"scriptId":"256","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/escape.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1478,"count":1}],"isBlockCoverage":true},{"functionName":"escape","ranges":[{"startOffset":189,"endOffset":1418,"count":68},{"startOffset":258,"endOffset":269,"count":0},{"startOffset":341,"endOffset":355,"count":0},{"startOffset":408,"endOffset":633,"count":0},{"startOffset":828,"endOffset":1098,"count":0},{"startOffset":1107,"endOffset":1177,"count":0},{"startOffset":1186,"endOffset":1320,"count":0},{"startOffset":1329,"endOffset":1337,"count":0}],"isBlockCoverage":true}]},{"scriptId":"257","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/find.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2268,"count":1}],"isBlockCoverage":true},{"functionName":"find","ranges":[{"startOffset":186,"endOffset":2214,"count":1188},{"startOffset":281,"endOffset":292,"count":0},{"startOffset":345,"endOffset":397,"count":0},{"startOffset":419,"endOffset":1112,"count":6},{"startOffset":458,"endOffset":524,"count":0},{"startOffset":582,"endOffset":594,"count":0},{"startOffset":641,"endOffset":649,"count":0},{"startOffset":716,"endOffset":729,"count":0},{"startOffset":797,"endOffset":801,"count":0},{"startOffset":900,"endOffset":916,"count":4},{"startOffset":917,"endOffset":925,"count":2},{"startOffset":926,"endOffset":936,"count":4},{"startOffset":969,"endOffset":1031,"count":4},{"startOffset":1031,"endOffset":1106,"count":2},{"startOffset":1112,"endOffset":2212,"count":1182},{"startOffset":1174,"endOffset":1185,"count":0},{"startOffset":1231,"endOffset":1239,"count":0},{"startOffset":1300,"endOffset":1311,"count":0},{"startOffset":1358,"endOffset":1366,"count":883},{"startOffset":1367,"endOffset":1377,"count":299},{"startOffset":1379,"endOffset":1383,"count":1107},{"startOffset":1433,"endOffset":1444,"count":0},{"startOffset":1490,"endOffset":1498,"count":299},{"startOffset":1499,"endOffset":1509,"count":883},{"startOffset":1534,"endOffset":1610,"count":0},{"startOffset":1647,"endOffset":1679,"count":299},{"startOffset":1731,"endOffset":1856,"count":883},{"startOffset":1919,"endOffset":2056,"count":2065},{"startOffset":1957,"endOffset":1962,"count":0},{"startOffset":1998,"endOffset":2046,"count":1978},{"startOffset":2087,"endOffset":2100,"count":883},{"startOffset":2102,"endOffset":2157,"count":800}],"isBlockCoverage":true}]},{"scriptId":"258","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/floor.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":641,"count":1}],"isBlockCoverage":true},{"functionName":"floor","ranges":[{"startOffset":165,"endOffset":584,"count":0}],"isBlockCoverage":false}]},{"scriptId":"259","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/frac.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1135,"count":1}],"isBlockCoverage":true},{"functionName":"frac","ranges":[{"startOffset":164,"endOffset":1081,"count":0}],"isBlockCoverage":false}]},{"scriptId":"260","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/insert.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":508,"count":1}],"isBlockCoverage":true},{"functionName":"insert","ranges":[{"startOffset":139,"endOffset":448,"count":0}],"isBlockCoverage":false}]},{"scriptId":"261","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/ipow.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":744,"count":1}],"isBlockCoverage":true},{"functionName":"ipow","ranges":[{"startOffset":100,"endOffset":690,"count":0}],"isBlockCoverage":false}]},{"scriptId":"262","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/lines.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":512,"count":1}],"isBlockCoverage":true},{"functionName":"lines","ranges":[{"startOffset":138,"endOffset":455,"count":1881},{"startOffset":212,"endOffset":387,"count":22},{"startOffset":264,"endOffset":326,"count":0},{"startOffset":387,"endOffset":454,"count":1859}],"isBlockCoverage":true}]},{"scriptId":"263","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/match.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":624,"count":1}],"isBlockCoverage":true},{"functionName":"match","ranges":[{"startOffset":146,"endOffset":567,"count":0}],"isBlockCoverage":false}]},{"scriptId":"264","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/matches.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":847,"count":1}],"isBlockCoverage":true},{"functionName":"matches","ranges":[{"startOffset":140,"endOffset":784,"count":0}],"isBlockCoverage":false}]},{"scriptId":"265","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/nmax.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1044,"count":1}],"isBlockCoverage":true},{"functionName":"nmax","ranges":[{"startOffset":186,"endOffset":990,"count":0}],"isBlockCoverage":false}]},{"scriptId":"266","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/nmin.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1044,"count":1}],"isBlockCoverage":true},{"functionName":"nmin","ranges":[{"startOffset":186,"endOffset":990,"count":3},{"startOffset":352,"endOffset":413,"count":0},{"startOffset":434,"endOffset":495,"count":0},{"startOffset":516,"endOffset":577,"count":0},{"startOffset":598,"endOffset":659,"count":0},{"startOffset":680,"endOffset":741,"count":0},{"startOffset":762,"endOffset":823,"count":0},{"startOffset":844,"endOffset":905,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":922,"endOffset":939,"count":3}],"isBlockCoverage":true}]},{"scriptId":"267","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/numofchar.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":453,"count":1}],"isBlockCoverage":true},{"functionName":"numofchar","ranges":[{"startOffset":142,"endOffset":384,"count":0}],"isBlockCoverage":false}]},{"scriptId":"268","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/repeat.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":377,"count":1}],"isBlockCoverage":true},{"functionName":"repeat","ranges":[{"startOffset":147,"endOffset":317,"count":85},{"startOffset":218,"endOffset":229,"count":0}],"isBlockCoverage":true}]},{"scriptId":"269","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/replace.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2146,"count":1}],"isBlockCoverage":true},{"functionName":"replace","ranges":[{"startOffset":232,"endOffset":2083,"count":100},{"startOffset":322,"endOffset":354,"count":0},{"startOffset":467,"endOffset":499,"count":0},{"startOffset":554,"endOffset":599,"count":70},{"startOffset":599,"endOffset":663,"count":30},{"startOffset":728,"endOffset":760,"count":0},{"startOffset":983,"endOffset":1067,"count":0},{"startOffset":1094,"endOffset":1184,"count":0},{"startOffset":1203,"endOffset":1215,"count":0},{"startOffset":1216,"endOffset":1248,"count":0},{"startOffset":1250,"endOffset":1415,"count":0},{"startOffset":1439,"endOffset":1451,"count":0},{"startOffset":1452,"endOffset":1487,"count":0},{"startOffset":1489,"endOffset":1734,"count":0},{"startOffset":1772,"endOffset":1778,"count":18},{"startOffset":1779,"endOffset":1784,"count":18},{"startOffset":1786,"endOffset":1829,"count":18},{"startOffset":1829,"endOffset":2038,"count":82}],"isBlockCoverage":true}]},{"scriptId":"270","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/reverse.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":454,"count":1}],"isBlockCoverage":true},{"functionName":"reverse","ranges":[{"startOffset":140,"endOffset":391,"count":303},{"startOffset":223,"endOffset":255,"count":0}],"isBlockCoverage":true}]},{"scriptId":"271","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/round.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1153,"count":1}],"isBlockCoverage":true},{"functionName":"round","ranges":[{"startOffset":187,"endOffset":1096,"count":0}],"isBlockCoverage":false}]},{"scriptId":"272","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/segment.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":945,"count":1}],"isBlockCoverage":true},{"functionName":"segment","ranges":[{"startOffset":189,"endOffset":882,"count":0}],"isBlockCoverage":false}]},{"scriptId":"273","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/shift_right.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":825,"count":1}],"isBlockCoverage":true},{"functionName":"shift_right","ranges":[{"startOffset":152,"endOffset":750,"count":0}],"isBlockCoverage":false}]},{"scriptId":"274","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/shift_left.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1230,"count":1}],"isBlockCoverage":true},{"functionName":"shift_left","ranges":[{"startOffset":200,"endOffset":1158,"count":85},{"startOffset":273,"endOffset":284,"count":0},{"startOffset":375,"endOffset":386,"count":0},{"startOffset":442,"endOffset":495,"count":0},{"startOffset":501,"endOffset":1113,"count":0}],"isBlockCoverage":true}]},{"scriptId":"275","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/sign.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":477,"count":1}],"isBlockCoverage":true},{"functionName":"sign","ranges":[{"startOffset":100,"endOffset":423,"count":0}],"isBlockCoverage":false}]},{"scriptId":"276","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/sin.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":629,"count":1}],"isBlockCoverage":true},{"functionName":"sin","ranges":[{"startOffset":163,"endOffset":578,"count":0}],"isBlockCoverage":false}]},{"scriptId":"277","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/sqrt.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":635,"count":1}],"isBlockCoverage":true},{"functionName":"sqrt","ranges":[{"startOffset":164,"endOffset":581,"count":0}],"isBlockCoverage":false}]},{"scriptId":"278","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/strlen.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":512,"count":1}],"isBlockCoverage":true},{"functionName":"strlen","ranges":[{"startOffset":139,"endOffset":452,"count":41073},{"startOffset":221,"endOffset":253,"count":0},{"startOffset":307,"endOffset":352,"count":8},{"startOffset":352,"endOffset":400,"count":41065}],"isBlockCoverage":true}]},{"scriptId":"279","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/substring_after.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1184,"count":1}],"isBlockCoverage":true},{"functionName":"substring_after","ranges":[{"startOffset":240,"endOffset":1097,"count":34},{"startOffset":318,"endOffset":329,"count":0},{"startOffset":397,"endOffset":442,"count":0},{"startOffset":502,"endOffset":536,"count":0},{"startOffset":585,"endOffset":593,"count":0},{"startOffset":609,"endOffset":649,"count":0},{"startOffset":694,"endOffset":764,"count":0},{"startOffset":813,"endOffset":821,"count":0},{"startOffset":1012,"endOffset":1021,"count":31},{"startOffset":1023,"endOffset":1052,"count":31}],"isBlockCoverage":true}]},{"scriptId":"280","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/substring_before.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1258,"count":1}],"isBlockCoverage":true},{"functionName":"substring_before","ranges":[{"startOffset":241,"endOffset":1168,"count":37},{"startOffset":333,"endOffset":365,"count":0},{"startOffset":419,"endOffset":464,"count":3},{"startOffset":464,"endOffset":512,"count":34},{"startOffset":572,"endOffset":606,"count":0},{"startOffset":655,"endOffset":663,"count":0},{"startOffset":679,"endOffset":719,"count":3},{"startOffset":719,"endOffset":981,"count":34},{"startOffset":764,"endOffset":834,"count":0},{"startOffset":883,"endOffset":891,"count":0},{"startOffset":1083,"endOffset":1092,"count":34},{"startOffset":1094,"endOffset":1123,"count":34}],"isBlockCoverage":true}]},{"scriptId":"281","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/substring.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1046,"count":1}],"isBlockCoverage":true},{"functionName":"substring","ranges":[{"startOffset":199,"endOffset":977,"count":2457},{"startOffset":298,"endOffset":306,"count":0},{"startOffset":346,"endOffset":354,"count":1185},{"startOffset":355,"endOffset":365,"count":1272},{"startOffset":394,"endOffset":418,"count":1185},{"startOffset":436,"endOffset":511,"count":0},{"startOffset":569,"endOffset":577,"count":0},{"startOffset":617,"endOffset":625,"count":699},{"startOffset":626,"endOffset":636,"count":1758},{"startOffset":650,"endOffset":660,"count":1666},{"startOffset":662,"endOffset":737,"count":0},{"startOffset":795,"endOffset":844,"count":0}],"isBlockCoverage":true}]},{"scriptId":"282","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/sy.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1199,"count":1}],"isBlockCoverage":true}]},{"scriptId":"283","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/tan.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":629,"count":1}],"isBlockCoverage":true},{"functionName":"tan","ranges":[{"startOffset":163,"endOffset":578,"count":0}],"isBlockCoverage":false}]},{"scriptId":"284","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/to_lower.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":529,"count":1}],"isBlockCoverage":true},{"functionName":"to_lower","ranges":[{"startOffset":141,"endOffset":463,"count":716},{"startOffset":214,"endOffset":225,"count":0},{"startOffset":293,"endOffset":384,"count":70},{"startOffset":384,"endOffset":461,"count":646}],"isBlockCoverage":true}]},{"scriptId":"285","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/to_mixed.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1518,"count":1}],"isBlockCoverage":true},{"functionName":"to_mixed","ranges":[{"startOffset":240,"endOffset":1452,"count":0}],"isBlockCoverage":false}]},{"scriptId":"286","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/to_upper.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":529,"count":1}],"isBlockCoverage":true},{"functionName":"to_upper","ranges":[{"startOffset":141,"endOffset":463,"count":737},{"startOffset":214,"endOffset":225,"count":0},{"startOffset":293,"endOffset":384,"count":120},{"startOffset":384,"endOffset":461,"count":617}],"isBlockCoverage":true}]},{"scriptId":"287","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/translate.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":943,"count":1}],"isBlockCoverage":true},{"functionName":"translate","ranges":[{"startOffset":187,"endOffset":874,"count":0}],"isBlockCoverage":false}]},{"scriptId":"288","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/trunc.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":483,"count":1}],"isBlockCoverage":true},{"functionName":"trunc","ranges":[{"startOffset":101,"endOffset":426,"count":0}],"isBlockCoverage":false}]},{"scriptId":"289","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/xstrlen.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":428,"count":1}],"isBlockCoverage":true},{"functionName":"xstrlen","ranges":[{"startOffset":140,"endOffset":365,"count":661},{"startOffset":205,"endOffset":276,"count":0}],"isBlockCoverage":true}]},{"scriptId":"290","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/db/db.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":107,"count":1}],"isBlockCoverage":true}]},{"scriptId":"291","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/index.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1312,"count":1},{"startOffset":407,"endOffset":488,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":88,"endOffset":405,"count":12},{"startOffset":232,"endOffset":247,"count":0},{"startOffset":264,"endOffset":284,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":327,"endOffset":354,"count":155430}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":410,"endOffset":487,"count":0}],"isBlockCoverage":true},{"functionName":"__exportStar","ranges":[{"startOffset":541,"endOffset":692,"count":12}],"isBlockCoverage":true}]},{"scriptId":"292","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/add.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2029,"count":1}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":219,"endOffset":1978,"count":56244},{"startOffset":292,"endOffset":453,"count":2337},{"startOffset":339,"endOffset":401,"count":0},{"startOffset":453,"endOffset":500,"count":53907},{"startOffset":500,"endOffset":662,"count":0},{"startOffset":662,"endOffset":703,"count":53907},{"startOffset":703,"endOffset":738,"count":53218},{"startOffset":740,"endOffset":815,"count":24698},{"startOffset":815,"endOffset":1863,"count":29209},{"startOffset":854,"endOffset":882,"count":0},{"startOffset":891,"endOffset":916,"count":0},{"startOffset":917,"endOffset":943,"count":0},{"startOffset":945,"endOffset":1008,"count":0},{"startOffset":1047,"endOffset":1072,"count":0},{"startOffset":1073,"endOffset":1108,"count":0},{"startOffset":1110,"endOffset":1179,"count":0},{"startOffset":1219,"endOffset":1245,"count":0},{"startOffset":1246,"endOffset":1280,"count":0},{"startOffset":1282,"endOffset":1351,"count":0},{"startOffset":1436,"endOffset":1475,"count":0},{"startOffset":1476,"endOffset":1511,"count":0},{"startOffset":1513,"endOffset":1609,"count":0},{"startOffset":1696,"endOffset":1730,"count":23666},{"startOffset":1731,"endOffset":1765,"count":0},{"startOffset":1767,"endOffset":1863,"count":0},{"startOffset":1863,"endOffset":1977,"count":29209}],"isBlockCoverage":true}]},{"scriptId":"293","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/div.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":415,"count":1}],"isBlockCoverage":true},{"functionName":"div","ranges":[{"startOffset":174,"endOffset":364,"count":23}],"isBlockCoverage":true}]},{"scriptId":"294","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/divide.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":598,"count":1}],"isBlockCoverage":true},{"functionName":"divide","ranges":[{"startOffset":292,"endOffset":538,"count":99},{"startOffset":382,"endOffset":448,"count":0}],"isBlockCoverage":true}]},{"scriptId":"295","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/minus.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2022,"count":1}],"isBlockCoverage":true},{"functionName":"minus","ranges":[{"startOffset":221,"endOffset":1965,"count":51810},{"startOffset":296,"endOffset":459,"count":0},{"startOffset":506,"endOffset":670,"count":0},{"startOffset":711,"endOffset":746,"count":51795},{"startOffset":748,"endOffset":823,"count":51794},{"startOffset":823,"endOffset":1871,"count":16},{"startOffset":862,"endOffset":890,"count":13},{"startOffset":899,"endOffset":924,"count":13},{"startOffset":925,"endOffset":951,"count":13},{"startOffset":953,"endOffset":1016,"count":13},{"startOffset":1016,"endOffset":1871,"count":3},{"startOffset":1055,"endOffset":1080,"count":0},{"startOffset":1081,"endOffset":1116,"count":0},{"startOffset":1118,"endOffset":1187,"count":0},{"startOffset":1227,"endOffset":1253,"count":0},{"startOffset":1254,"endOffset":1288,"count":0},{"startOffset":1290,"endOffset":1359,"count":0},{"startOffset":1444,"endOffset":1483,"count":2},{"startOffset":1484,"endOffset":1519,"count":2},{"startOffset":1521,"endOffset":1617,"count":2},{"startOffset":1617,"endOffset":1871,"count":1},{"startOffset":1704,"endOffset":1738,"count":0},{"startOffset":1739,"endOffset":1773,"count":0},{"startOffset":1775,"endOffset":1871,"count":0},{"startOffset":1871,"endOffset":1964,"count":1}],"isBlockCoverage":true}]},{"scriptId":"296","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/mod.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":415,"count":1}],"isBlockCoverage":true},{"functionName":"mod","ranges":[{"startOffset":174,"endOffset":364,"count":39}],"isBlockCoverage":true}]},{"scriptId":"297","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/multiply.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1617,"count":1}],"isBlockCoverage":true},{"functionName":"multiply","ranges":[{"startOffset":224,"endOffset":1551,"count":31099},{"startOffset":297,"endOffset":332,"count":31095},{"startOffset":334,"endOffset":409,"count":31095},{"startOffset":409,"endOffset":1457,"count":4},{"startOffset":448,"endOffset":476,"count":0},{"startOffset":485,"endOffset":510,"count":0},{"startOffset":511,"endOffset":537,"count":0},{"startOffset":539,"endOffset":602,"count":0},{"startOffset":641,"endOffset":666,"count":0},{"startOffset":667,"endOffset":702,"count":0},{"startOffset":704,"endOffset":773,"count":0},{"startOffset":813,"endOffset":839,"count":0},{"startOffset":840,"endOffset":874,"count":0},{"startOffset":876,"endOffset":945,"count":0},{"startOffset":1030,"endOffset":1069,"count":2},{"startOffset":1070,"endOffset":1105,"count":2},{"startOffset":1107,"endOffset":1457,"count":2},{"startOffset":1290,"endOffset":1324,"count":0},{"startOffset":1325,"endOffset":1359,"count":0},{"startOffset":1361,"endOffset":1457,"count":0},{"startOffset":1457,"endOffset":1550,"count":2}],"isBlockCoverage":true}]},{"scriptId":"298","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/power.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":365,"count":1}],"isBlockCoverage":true},{"functionName":"power","ranges":[{"startOffset":176,"endOffset":308,"count":4484}],"isBlockCoverage":true}]},{"scriptId":"299","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/bit-and.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":735,"count":1}],"isBlockCoverage":true},{"functionName":"bitand","ranges":[{"startOffset":249,"endOffset":674,"count":10}],"isBlockCoverage":true}]},{"scriptId":"300","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/_bit_operations.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1485,"count":1}],"isBlockCoverage":true},{"functionName":"get_bit_operation_chunks","ranges":[{"startOffset":120,"endOffset":1380,"count":10},{"startOffset":516,"endOffset":533,"count":0},{"startOffset":1017,"endOffset":1035,"count":0}],"isBlockCoverage":true}]},{"scriptId":"301","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/bit-not.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":941,"count":1}],"isBlockCoverage":true},{"functionName":"bitnot","ranges":[{"startOffset":252,"endOffset":880,"count":0}],"isBlockCoverage":false}]},{"scriptId":"302","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/bit-or.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":726,"count":1}],"isBlockCoverage":true},{"functionName":"bitor","ranges":[{"startOffset":248,"endOffset":668,"count":0}],"isBlockCoverage":false}]},{"scriptId":"303","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/bit-xor.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":735,"count":1}],"isBlockCoverage":true},{"functionName":"bitxor","ranges":[{"startOffset":249,"endOffset":674,"count":0}],"isBlockCoverage":false}]},{"scriptId":"304","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/concat.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":989,"count":1}],"isBlockCoverage":true},{"functionName":"concat","ranges":[{"startOffset":139,"endOffset":929,"count":13959},{"startOffset":199,"endOffset":411,"count":0},{"startOffset":492,"endOffset":520,"count":0},{"startOffset":569,"endOffset":610,"count":7279},{"startOffset":610,"endOffset":654,"count":6680},{"startOffset":719,"endOffset":748,"count":0},{"startOffset":798,"endOffset":840,"count":2105},{"startOffset":840,"endOffset":885,"count":11854}],"isBlockCoverage":true}]},{"scriptId":"305","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/rfc.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":108,"count":1}],"isBlockCoverage":true}]},{"scriptId":"306","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/expand_in.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1066,"count":1}],"isBlockCoverage":true},{"functionName":"expandIN","ranges":[{"startOffset":216,"endOffset":999,"count":0}],"isBlockCoverage":false}]},{"scriptId":"307","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/expand_dynamic.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":729,"count":1}],"isBlockCoverage":true},{"functionName":"expandDynamic","ranges":[{"startOffset":145,"endOffset":647,"count":2},{"startOffset":201,"endOffset":232,"count":0},{"startOffset":365,"endOffset":376,"count":0},{"startOffset":378,"endOffset":618,"count":0}],"isBlockCoverage":true}]},{"scriptId":"308","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/classic_error.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":309,"count":1}],"isBlockCoverage":true},{"functionName":"ClassicError","ranges":[{"startOffset":147,"endOffset":228,"count":14}],"isBlockCoverage":true}]},{"scriptId":"309","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/console/standard_out_console.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":670,"count":1}],"isBlockCoverage":true},{"functionName":"StandardOutConsole","ranges":[{"startOffset":145,"endOffset":193,"count":1}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":198,"endOffset":293,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":298,"endOffset":379,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":384,"endOffset":416,"count":0}],"isBlockCoverage":false},{"functionName":"isEmpty","ranges":[{"startOffset":421,"endOffset":465,"count":0}],"isBlockCoverage":false},{"functionName":"getTrimmed","ranges":[{"startOffset":470,"endOffset":570,"count":0}],"isBlockCoverage":false}]},{"scriptId":"310","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/console/memory_console.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":563,"count":1}],"isBlockCoverage":true},{"functionName":"MemoryConsole","ranges":[{"startOffset":135,"endOffset":180,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":185,"endOffset":224,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":229,"endOffset":284,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":289,"endOffset":328,"count":0}],"isBlockCoverage":false},{"functionName":"isEmpty","ranges":[{"startOffset":333,"endOffset":383,"count":0}],"isBlockCoverage":false},{"functionName":"getTrimmed","ranges":[{"startOffset":388,"endOffset":479,"count":0}],"isBlockCoverage":false}]},{"scriptId":"311","url":"file:///home/runner/work/abapGit/abapGit/output/%23ui2%23cl_json.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":26476,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":155,"endOffset":3073,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":310,"endOffset":439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":524,"endOffset":722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":872,"endOffset":936,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":983,"endOffset":1047,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1087,"endOffset":1130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1224,"endOffset":1288,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1329,"endOffset":1395,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1442,"endOffset":1506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1554,"endOffset":1651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1703,"endOffset":1800,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1840,"endOffset":1883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1977,"endOffset":2041,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2081,"endOffset":2124,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2168,"endOffset":2265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2312,"endOffset":2376,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2424,"endOffset":2521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2570,"endOffset":2667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2761,"endOffset":2834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2874,"endOffset":2938,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2985,"endOffset":3049,"count":0}],"isBlockCoverage":false},{"functionName":"$ui2$cl_json","ranges":[{"startOffset":3077,"endOffset":3256,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3259,"endOffset":3372,"count":0}],"isBlockCoverage":false},{"functionName":"generate","ranges":[{"startOffset":3375,"endOffset":3443,"count":0}],"isBlockCoverage":false},{"functionName":"generate","ranges":[{"startOffset":3453,"endOffset":3960,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":3963,"endOffset":4033,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":4043,"endOffset":12850,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":12853,"endOffset":12927,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":12937,"endOffset":14371,"count":0}],"isBlockCoverage":false},{"functionName":"_deserialize","ranges":[{"startOffset":14374,"endOffset":14450,"count":0}],"isBlockCoverage":false},{"functionName":"_deserialize","ranges":[{"startOffset":14460,"endOffset":25791,"count":0}],"isBlockCoverage":false}]},{"scriptId":"312","url":"file:///home/runner/work/abapGit/abapGit/output/%23ui2%23cl_json.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":26732,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":1823,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":279,"endOffset":804,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":947,"endOffset":1011,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1054,"endOffset":1118,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1207,"endOffset":1271,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1366,"endOffset":1463,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1572,"endOffset":1636,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1735,"endOffset":1799,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_stack","ranges":[{"startOffset":1827,"endOffset":2442,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2445,"endOffset":2558,"count":0}],"isBlockCoverage":false},{"functionName":"push","ranges":[{"startOffset":2561,"endOffset":3417,"count":0}],"isBlockCoverage":false},{"functionName":"is_array","ranges":[{"startOffset":3420,"endOffset":4162,"count":0}],"isBlockCoverage":false},{"functionName":"get_and_increase_index","ranges":[{"startOffset":4165,"endOffset":5217,"count":0}],"isBlockCoverage":false},{"functionName":"pop","ranges":[{"startOffset":5220,"endOffset":6075,"count":0}],"isBlockCoverage":false},{"functionName":"get_full_name","ranges":[{"startOffset":6078,"endOffset":6718,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7148,"endOffset":10694,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7317,"endOffset":8001,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8145,"endOffset":8209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8366,"endOffset":8463,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8506,"endOffset":8570,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8670,"endOffset":8730,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8773,"endOffset":8837,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8936,"endOffset":8996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9039,"endOffset":9103,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9202,"endOffset":9266,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9309,"endOffset":9373,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9467,"endOffset":9531,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9574,"endOffset":9638,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9732,"endOffset":9829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9872,"endOffset":9936,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10032,"endOffset":10290,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10333,"endOffset":10397,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10499,"endOffset":10563,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10606,"endOffset":10670,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_parser","ranges":[{"startOffset":10698,"endOffset":11472,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":11475,"endOffset":11588,"count":0}],"isBlockCoverage":false},{"functionName":"adjust_names","ranges":[{"startOffset":11591,"endOffset":12741,"count":0}],"isBlockCoverage":false},{"functionName":"find_ignore_case","ranges":[{"startOffset":12744,"endOffset":13816,"count":0}],"isBlockCoverage":false},{"functionName":"exists","ranges":[{"startOffset":13819,"endOffset":14475,"count":0}],"isBlockCoverage":false},{"functionName":"get_type","ranges":[{"startOffset":14478,"endOffset":15523,"count":0}],"isBlockCoverage":false},{"functionName":"members","ranges":[{"startOffset":15526,"endOffset":16740,"count":0}],"isBlockCoverage":false},{"functionName":"value_boolean","ranges":[{"startOffset":16743,"endOffset":17171,"count":0}],"isBlockCoverage":false},{"functionName":"value_integer","ranges":[{"startOffset":17174,"endOffset":17487,"count":0}],"isBlockCoverage":false},{"functionName":"value_number","ranges":[{"startOffset":17490,"endOffset":17802,"count":0}],"isBlockCoverage":false},{"functionName":"value_string","ranges":[{"startOffset":17805,"endOffset":18955,"count":0}],"isBlockCoverage":false},{"functionName":"parse","ranges":[{"startOffset":18958,"endOffset":25400,"count":0}],"isBlockCoverage":false}]},{"scriptId":"313","url":"file:///home/runner/work/abapGit/abapGit/output/cx_root.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3413,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":53,"endOffset":1196,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":214,"endOffset":312,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":392,"endOffset":440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":589,"endOffset":637,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":681,"endOffset":779,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":889,"endOffset":953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1001,"endOffset":1065,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1112,"endOffset":1172,"count":0}],"isBlockCoverage":false},{"functionName":"cx_root","ranges":[{"startOffset":1200,"endOffset":1554,"count":243}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1557,"endOffset":1963,"count":137},{"startOffset":1650,"endOffset":1665,"count":130},{"startOffset":1667,"endOffset":1694,"count":125},{"startOffset":1812,"endOffset":1829,"count":130},{"startOffset":1831,"endOffset":1862,"count":130}],"isBlockCoverage":true},{"functionName":"get_source_position","ranges":[{"startOffset":1966,"endOffset":2680,"count":0}],"isBlockCoverage":false},{"functionName":"if_message$get_longtext","ranges":[{"startOffset":2683,"endOffset":3097,"count":0}],"isBlockCoverage":false},{"functionName":"if_message$get_text","ranges":[{"startOffset":3100,"endOffset":3316,"count":52}],"isBlockCoverage":true}]},{"scriptId":"314","url":"file:///home/runner/work/abapGit/abapGit/output/00.msag.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":160,"count":1}],"isBlockCoverage":true}]},{"scriptId":"315","url":"file:///home/runner/work/abapGit/abapGit/output/abap.type.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":23237,"count":1}],"isBlockCoverage":true}]},{"scriptId":"316","url":"file:///home/runner/work/abapGit/abapGit/output/abap_boolean.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":290,"count":1}],"isBlockCoverage":true}]},{"scriptId":"317","url":"file:///home/runner/work/abapGit/abapGit/output/abap_callstack.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":557,"count":1}],"isBlockCoverage":true}]},{"scriptId":"318","url":"file:///home/runner/work/abapGit/abapGit/output/abap_callstack_line.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":385,"count":1}],"isBlockCoverage":true}]},{"scriptId":"319","url":"file:///home/runner/work/abapGit/abapGit/output/abap_encod.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"320","url":"file:///home/runner/work/abapGit/abapGit/output/abap_sortorder.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":307,"count":1}],"isBlockCoverage":true}]},{"scriptId":"321","url":"file:///home/runner/work/abapGit/abapGit/output/abap_sortorder_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":492,"count":1}],"isBlockCoverage":true}]},{"scriptId":"322","url":"file:///home/runner/work/abapGit/abapGit/output/abaptxt255.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":236,"count":1}],"isBlockCoverage":true}]},{"scriptId":"323","url":"file:///home/runner/work/abapGit/abapGit/output/abaptxt255_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":417,"count":1}],"isBlockCoverage":true}]},{"scriptId":"324","url":"file:///home/runner/work/abapGit/abapGit/output/balmnr.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":170,"count":1}],"isBlockCoverage":true}]},{"scriptId":"325","url":"file:///home/runner/work/abapGit/abapGit/output/balognr.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":192,"count":1}],"isBlockCoverage":true}]},{"scriptId":"326","url":"file:///home/runner/work/abapGit/abapGit/output/bapi_fld.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"327","url":"file:///home/runner/work/abapGit/abapGit/output/bapi_line.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":168,"count":1}],"isBlockCoverage":true}]},{"scriptId":"328","url":"file:///home/runner/work/abapGit/abapGit/output/bapi_msg.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":196,"count":1}],"isBlockCoverage":true}]},{"scriptId":"329","url":"file:///home/runner/work/abapGit/abapGit/output/bapi_mtype.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"330","url":"file:///home/runner/work/abapGit/abapGit/output/bapi_param.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"331","url":"file:///home/runner/work/abapGit/abapGit/output/bapi_rcode.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":191,"count":1}],"isBlockCoverage":true}]},{"scriptId":"332","url":"file:///home/runner/work/abapGit/abapGit/output/bapilogsys.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"333","url":"file:///home/runner/work/abapGit/abapGit/output/bapioption.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"334","url":"file:///home/runner/work/abapGit/abapGit/output/bapiret2.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1362,"count":1}],"isBlockCoverage":true}]},{"scriptId":"335","url":"file:///home/runner/work/abapGit/abapGit/output/bapirettab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1537,"count":1}],"isBlockCoverage":true}]},{"scriptId":"336","url":"file:///home/runner/work/abapGit/abapGit/output/bapireturn.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":958,"count":1}],"isBlockCoverage":true}]},{"scriptId":"337","url":"file:///home/runner/work/abapGit/abapGit/output/bapisign.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":194,"count":1}],"isBlockCoverage":true}]},{"scriptId":"338","url":"file:///home/runner/work/abapGit/abapGit/output/boolean.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":191,"count":1}],"isBlockCoverage":true}]},{"scriptId":"339","url":"file:///home/runner/work/abapGit/abapGit/output/char1.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"340","url":"file:///home/runner/work/abapGit/abapGit/output/char10.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"341","url":"file:///home/runner/work/abapGit/abapGit/output/char120.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":186,"count":1}],"isBlockCoverage":true}]},{"scriptId":"342","url":"file:///home/runner/work/abapGit/abapGit/output/char15.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"343","url":"file:///home/runner/work/abapGit/abapGit/output/char20.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"344","url":"file:///home/runner/work/abapGit/abapGit/output/char25.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"345","url":"file:///home/runner/work/abapGit/abapGit/output/char3.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"346","url":"file:///home/runner/work/abapGit/abapGit/output/char30.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"347","url":"file:///home/runner/work/abapGit/abapGit/output/char32.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"348","url":"file:///home/runner/work/abapGit/abapGit/output/char4.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":176,"count":1}],"isBlockCoverage":true}]},{"scriptId":"349","url":"file:///home/runner/work/abapGit/abapGit/output/char6.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":176,"count":1}],"isBlockCoverage":true}]},{"scriptId":"350","url":"file:///home/runner/work/abapGit/abapGit/output/char80.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"351","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_char_utilities.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5974,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":2348,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":299,"endOffset":346,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":439,"endOffset":486,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":582,"endOffset":629,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":711,"endOffset":771,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":854,"endOffset":929,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1008,"endOffset":1083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1166,"endOffset":1241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1329,"endOffset":1404,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1485,"endOffset":1560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1646,"endOffset":1721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1802,"endOffset":1877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1958,"endOffset":2033,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2260,"endOffset":2324,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_char_utilities","ranges":[{"startOffset":2352,"endOffset":3159,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3162,"endOffset":3275,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":3278,"endOffset":3364,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":3374,"endOffset":3563,"count":1}],"isBlockCoverage":true},{"functionName":"get_simple_spaces_for_cur_cp","ranges":[{"startOffset":3566,"endOffset":3674,"count":0}],"isBlockCoverage":false},{"functionName":"get_simple_spaces_for_cur_cp","ranges":[{"startOffset":3684,"endOffset":4099,"count":0}],"isBlockCoverage":false}]},{"scriptId":"352","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_classdescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2458,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":221,"endOffset":1067,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":455,"endOffset":538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":582,"endOffset":672,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":782,"endOffset":902,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1000,"endOffset":1043,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_classdescr","ranges":[{"startOffset":1071,"endOffset":1169,"count":56}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1172,"endOffset":1382,"count":56},{"startOffset":1262,"endOffset":1279,"count":28},{"startOffset":1281,"endOffset":1309,"count":28}],"isBlockCoverage":true},{"functionName":"get_class_name","ranges":[{"startOffset":1385,"endOffset":1471,"count":0}],"isBlockCoverage":false},{"functionName":"get_class_name","ranges":[{"startOffset":1481,"endOffset":2009,"count":0}],"isBlockCoverage":false},{"functionName":"get_super_class_type","ranges":[{"startOffset":2012,"endOffset":2317,"count":0}],"isBlockCoverage":false}]},{"scriptId":"353","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_objectdescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":28276,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":217,"endOffset":9007,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":380,"endOffset":1683,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1764,"endOffset":4403,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4487,"endOffset":4941,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5029,"endOffset":5093,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5181,"endOffset":5245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5337,"endOffset":5808,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5900,"endOffset":6459,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6541,"endOffset":6619,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6702,"endOffset":6780,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6863,"endOffset":6941,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7024,"endOffset":7102,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7185,"endOffset":7263,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7344,"endOffset":7424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7507,"endOffset":7587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7667,"endOffset":7747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7898,"endOffset":7941,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8049,"endOffset":8167,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8209,"endOffset":8252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8367,"endOffset":8485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8534,"endOffset":8577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8629,"endOffset":8672,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8780,"endOffset":8898,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8940,"endOffset":8983,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_objectdescr","ranges":[{"startOffset":9011,"endOffset":15144,"count":80}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":15147,"endOffset":23128,"count":80},{"startOffset":20812,"endOffset":20817,"count":28},{"startOffset":20819,"endOffset":21858,"count":184},{"startOffset":21329,"endOffset":21334,"count":0},{"startOffset":22028,"endOffset":22033,"count":52},{"startOffset":22035,"endOffset":22162,"count":28},{"startOffset":22271,"endOffset":22276,"count":28},{"startOffset":22278,"endOffset":23007,"count":300},{"startOffset":22557,"endOffset":22562,"count":0},{"startOffset":22564,"endOffset":23001,"count":918}],"isBlockCoverage":true},{"functionName":"get_method_parameter_type","ranges":[{"startOffset":23131,"endOffset":24715,"count":0}],"isBlockCoverage":false},{"functionName":"get_interface_type","ranges":[{"startOffset":24718,"endOffset":25126,"count":0}],"isBlockCoverage":false},{"functionName":"get_attribute_type","ranges":[{"startOffset":25129,"endOffset":26329,"count":0}],"isBlockCoverage":false}]},{"scriptId":"354","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_typedescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":39532,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":10284,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":274,"endOffset":323,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":406,"endOffset":484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":562,"endOffset":609,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":687,"endOffset":784,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":864,"endOffset":924,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1006,"endOffset":1066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1153,"endOffset":1217,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1304,"endOffset":1368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1454,"endOffset":1532,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1619,"endOffset":1697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1785,"endOffset":1863,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1951,"endOffset":2029,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2121,"endOffset":2199,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2286,"endOffset":2364,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2451,"endOffset":2529,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2620,"endOffset":2698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2791,"endOffset":2869,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2962,"endOffset":3040,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3127,"endOffset":3205,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3292,"endOffset":3370,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3458,"endOffset":3536,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3622,"endOffset":3700,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3786,"endOffset":3864,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3951,"endOffset":4029,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4116,"endOffset":4194,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4281,"endOffset":4359,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4446,"endOffset":4524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4610,"endOffset":4688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4778,"endOffset":4856,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4943,"endOffset":5021,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5110,"endOffset":5188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5277,"endOffset":5355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5444,"endOffset":5522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5612,"endOffset":5690,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5780,"endOffset":5858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5946,"endOffset":6024,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6111,"endOffset":6189,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6279,"endOffset":6357,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6441,"endOffset":6519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6609,"endOffset":6687,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6770,"endOffset":6817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6902,"endOffset":6949,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7033,"endOffset":7080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7162,"endOffset":7209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7293,"endOffset":7340,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7423,"endOffset":7470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7624,"endOffset":7742,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7784,"endOffset":7826,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7925,"endOffset":8043,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8085,"endOffset":8128,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8227,"endOffset":8345,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8387,"endOffset":8429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8532,"endOffset":8650,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8696,"endOffset":8769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8881,"endOffset":8999,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9047,"endOffset":9137,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9239,"endOffset":9336,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9436,"endOffset":9500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9602,"endOffset":9699,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9803,"endOffset":9900,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10002,"endOffset":10260,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_typedescr","ranges":[{"startOffset":10288,"endOffset":13178,"count":4463}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":13181,"endOffset":13294,"count":4463},{"startOffset":13237,"endOffset":13273,"count":0}],"isBlockCoverage":true},{"functionName":"get_ddic_object","ranges":[{"startOffset":13297,"endOffset":13729,"count":0}],"isBlockCoverage":false},{"functionName":"is_instantiatable","ranges":[{"startOffset":13732,"endOffset":14005,"count":0}],"isBlockCoverage":false},{"functionName":"describe_by_dashes","ranges":[{"startOffset":14008,"endOffset":14101,"count":0}],"isBlockCoverage":false},{"functionName":"describe_by_dashes","ranges":[{"startOffset":14111,"endOffset":15557,"count":0}],"isBlockCoverage":false},{"functionName":"describe_by_name","ranges":[{"startOffset":15560,"endOffset":15649,"count":0}],"isBlockCoverage":false},{"functionName":"describe_by_name","ranges":[{"startOffset":15659,"endOffset":18844,"count":108},{"startOffset":16319,"endOffset":16388,"count":0},{"startOffset":16389,"endOffset":16458,"count":0},{"startOffset":16460,"endOffset":16553,"count":0},{"startOffset":16620,"endOffset":16635,"count":52},{"startOffset":16636,"endOffset":16641,"count":56},{"startOffset":16817,"endOffset":17446,"count":24},{"startOffset":17446,"endOffset":18783,"count":84},{"startOffset":17526,"endOffset":18369,"count":28},{"startOffset":17884,"endOffset":18017,"count":0},{"startOffset":18369,"endOffset":18783,"count":56},{"startOffset":18461,"endOffset":18707,"count":1},{"startOffset":18663,"endOffset":18699,"count":0},{"startOffset":18707,"endOffset":18783,"count":55},{"startOffset":18783,"endOffset":18843,"count":107}],"isBlockCoverage":true},{"functionName":"get_relative_name","ranges":[{"startOffset":18847,"endOffset":18994,"count":0}],"isBlockCoverage":false},{"functionName":"get_ddic_header","ranges":[{"startOffset":18997,"endOffset":19260,"count":0}],"isBlockCoverage":false},{"functionName":"is_ddic_type","ranges":[{"startOffset":19263,"endOffset":19450,"count":0}],"isBlockCoverage":false},{"functionName":"describe_by_data_ref","ranges":[{"startOffset":19453,"endOffset":19550,"count":0}],"isBlockCoverage":false},{"functionName":"describe_by_data_ref","ranges":[{"startOffset":19560,"endOffset":20108,"count":88}],"isBlockCoverage":true},{"functionName":"describe_by_object_ref","ranges":[{"startOffset":20111,"endOffset":20212,"count":0}],"isBlockCoverage":false},{"functionName":"describe_by_object_ref","ranges":[{"startOffset":20222,"endOffset":21551,"count":28},{"startOffset":20867,"endOffset":20944,"count":0}],"isBlockCoverage":true},{"functionName":"describe_by_data","ranges":[{"startOffset":21554,"endOffset":21643,"count":184}],"isBlockCoverage":true},{"functionName":"describe_by_data","ranges":[{"startOffset":21653,"endOffset":34159,"count":7272},{"startOffset":22853,"endOffset":22873,"count":861},{"startOffset":22874,"endOffset":22877,"count":6411},{"startOffset":22919,"endOffset":22941,"count":27},{"startOffset":22942,"endOffset":22945,"count":7245},{"startOffset":23059,"endOffset":23524,"count":960},{"startOffset":23524,"endOffset":31546,"count":6312},{"startOffset":23608,"endOffset":24077,"count":0},{"startOffset":24157,"endOffset":24560,"count":18},{"startOffset":24560,"endOffset":31546,"count":6294},{"startOffset":24639,"endOffset":25042,"count":8},{"startOffset":25042,"endOffset":31546,"count":6286},{"startOffset":25122,"endOffset":25588,"count":25},{"startOffset":25588,"endOffset":31546,"count":6261},{"startOffset":25670,"endOffset":25964,"count":27},{"startOffset":25964,"endOffset":31546,"count":6234},{"startOffset":26044,"endOffset":26510,"count":2},{"startOffset":26510,"endOffset":31546,"count":6232},{"startOffset":26591,"endOffset":26874,"count":9},{"startOffset":26874,"endOffset":31546,"count":6223},{"startOffset":26961,"endOffset":27175,"count":1},{"startOffset":27175,"endOffset":31546,"count":6222},{"startOffset":27260,"endOffset":27514,"count":594},{"startOffset":27514,"endOffset":31546,"count":5628},{"startOffset":27594,"endOffset":27673,"count":5130},{"startOffset":27675,"endOffset":27987,"count":514},{"startOffset":27987,"endOffset":31546,"count":5114},{"startOffset":28070,"endOffset":28423,"count":7},{"startOffset":28423,"endOffset":31546,"count":5107},{"startOffset":28505,"endOffset":28856,"count":1308},{"startOffset":28856,"endOffset":31546,"count":3799},{"startOffset":28941,"endOffset":29345,"count":808},{"startOffset":29345,"endOffset":31546,"count":2991},{"startOffset":29433,"endOffset":29562,"count":2910},{"startOffset":29562,"endOffset":31546,"count":81},{"startOffset":29649,"endOffset":30589,"count":77},{"startOffset":29938,"endOffset":30470,"count":61},{"startOffset":29981,"endOffset":29986,"count":9},{"startOffset":30084,"endOffset":30305,"count":0},{"startOffset":30356,"endOffset":30361,"count":9},{"startOffset":30470,"endOffset":30583,"count":16},{"startOffset":30589,"endOffset":31546,"count":4},{"startOffset":30672,"endOffset":30883,"count":0},{"startOffset":31339,"endOffset":31546,"count":0},{"startOffset":31546,"endOffset":31586,"count":4362},{"startOffset":31586,"endOffset":31614,"count":1402},{"startOffset":31609,"endOffset":31614,"count":1109},{"startOffset":31615,"endOffset":31619,"count":2960},{"startOffset":31667,"endOffset":31701,"count":808},{"startOffset":31696,"endOffset":31701,"count":798},{"startOffset":31702,"endOffset":31706,"count":3554},{"startOffset":31754,"endOffset":31787,"count":4349},{"startOffset":31782,"endOffset":31787,"count":526},{"startOffset":31788,"endOffset":31792,"count":13},{"startOffset":31872,"endOffset":31929,"count":2467},{"startOffset":31929,"endOffset":32062,"count":1895},{"startOffset":32006,"endOffset":32062,"count":0},{"startOffset":32062,"endOffset":32127,"count":4362},{"startOffset":32127,"endOffset":32156,"count":242},{"startOffset":32156,"endOffset":32386,"count":4362},{"startOffset":32386,"endOffset":32581,"count":145},{"startOffset":32581,"endOffset":33946,"count":4217},{"startOffset":32639,"endOffset":32919,"count":653},{"startOffset":32919,"endOffset":33946,"count":3564},{"startOffset":33011,"endOffset":33463,"count":1217},{"startOffset":33463,"endOffset":33946,"count":2347},{"startOffset":33545,"endOffset":33743,"count":68},{"startOffset":33743,"endOffset":33946,"count":2279},{"startOffset":33946,"endOffset":34022,"count":4362},{"startOffset":34022,"endOffset":34138,"count":10},{"startOffset":34138,"endOffset":34158,"count":4362}],"isBlockCoverage":true}]},{"scriptId":"355","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_codepage.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3775,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":1306,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":339,"endOffset":405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":449,"endOffset":513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":555,"endOffset":619,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":716,"endOffset":780,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":824,"endOffset":888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":930,"endOffset":996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1095,"endOffset":1174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1218,"endOffset":1282,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_codepage","ranges":[{"startOffset":1310,"endOffset":1395,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1398,"endOffset":1511,"count":0}],"isBlockCoverage":false},{"functionName":"convert_to","ranges":[{"startOffset":1514,"endOffset":1590,"count":0}],"isBlockCoverage":false},{"functionName":"convert_to","ranges":[{"startOffset":1600,"endOffset":2282,"count":2},{"startOffset":1797,"endOffset":1828,"count":0}],"isBlockCoverage":true},{"functionName":"convert_from","ranges":[{"startOffset":2285,"endOffset":2365,"count":0}],"isBlockCoverage":false},{"functionName":"convert_from","ranges":[{"startOffset":2375,"endOffset":3120,"count":89},{"startOffset":2572,"endOffset":2603,"count":0}],"isBlockCoverage":true},{"functionName":"sap_codepage","ranges":[{"startOffset":3123,"endOffset":3203,"count":0}],"isBlockCoverage":false},{"functionName":"sap_codepage","ranges":[{"startOffset":3213,"endOffset":3642,"count":0}],"isBlockCoverage":false}]},{"scriptId":"356","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_complexdescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":751,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":219,"endOffset":384,"count":1}],"isBlockCoverage":true},{"functionName":"cl_abap_complexdescr","ranges":[{"startOffset":388,"endOffset":486,"count":594}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":489,"endOffset":602,"count":594}],"isBlockCoverage":true}]},{"scriptId":"357","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_datadescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2268,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":213,"endOffset":924,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":455,"endOffset":533,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":575,"endOffset":618,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":718,"endOffset":815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":857,"endOffset":900,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_datadescr","ranges":[{"startOffset":928,"endOffset":1026,"count":4383}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1029,"endOffset":1142,"count":4383}],"isBlockCoverage":true},{"functionName":"get_data_type_kind","ranges":[{"startOffset":1145,"endOffset":1238,"count":0}],"isBlockCoverage":false},{"functionName":"get_data_type_kind","ranges":[{"startOffset":1248,"endOffset":1754,"count":0}],"isBlockCoverage":false},{"functionName":"applies_to_data","ranges":[{"startOffset":1757,"endOffset":2131,"count":0}],"isBlockCoverage":false}]},{"scriptId":"358","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_codepage.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1829,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":178,"endOffset":771,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":412,"endOffset":530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":627,"endOffset":747,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_conv_codepage","ranges":[{"startOffset":775,"endOffset":860,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":863,"endOffset":976,"count":0}],"isBlockCoverage":false},{"functionName":"create_in","ranges":[{"startOffset":979,"endOffset":1048,"count":0}],"isBlockCoverage":false},{"functionName":"create_in","ranges":[{"startOffset":1058,"endOffset":1323,"count":0}],"isBlockCoverage":false},{"functionName":"create_out","ranges":[{"startOffset":1326,"endOffset":1397,"count":0}],"isBlockCoverage":false},{"functionName":"create_out","ranges":[{"startOffset":1407,"endOffset":1676,"count":88}],"isBlockCoverage":true}]},{"scriptId":"359","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_codepage.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2278,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":312,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_in","ranges":[{"startOffset":316,"endOffset":401,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":404,"endOffset":517,"count":0}],"isBlockCoverage":false},{"functionName":"if_abap_conv_in$convert","ranges":[{"startOffset":520,"endOffset":1077,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1158,"endOffset":1355,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_out","ranges":[{"startOffset":1359,"endOffset":1444,"count":88}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1447,"endOffset":1560,"count":88},{"startOffset":1503,"endOffset":1539,"count":0}],"isBlockCoverage":true},{"functionName":"if_abap_conv_out$convert","ranges":[{"startOffset":1563,"endOffset":2125,"count":88}],"isBlockCoverage":true}]},{"scriptId":"360","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_in_ce.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8469,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":115,"endOffset":2694,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":275,"endOffset":341,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":429,"endOffset":493,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":581,"endOffset":678,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":819,"endOffset":939,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":983,"endOffset":1062,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1103,"endOffset":1169,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1216,"endOffset":1305,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1352,"endOffset":1449,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1491,"endOffset":1580,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1667,"endOffset":1731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1772,"endOffset":1832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1919,"endOffset":2012,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2052,"endOffset":2094,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2185,"endOffset":2221,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2258,"endOffset":2318,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2358,"endOffset":2422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2506,"endOffset":2566,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2606,"endOffset":2670,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_conv_in_ce","ranges":[{"startOffset":2698,"endOffset":3040,"count":100}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3043,"endOffset":3156,"count":100},{"startOffset":3099,"endOffset":3135,"count":0}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":3159,"endOffset":3229,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3239,"endOffset":5331,"count":100},{"startOffset":3479,"endOffset":3496,"count":97},{"startOffset":3498,"endOffset":3529,"count":97},{"startOffset":3558,"endOffset":3589,"count":97},{"startOffset":3591,"endOffset":3645,"count":3},{"startOffset":3728,"endOffset":3742,"count":97},{"startOffset":3744,"endOffset":3769,"count":0},{"startOffset":3881,"endOffset":3901,"count":97},{"startOffset":3903,"endOffset":3940,"count":0},{"startOffset":3969,"endOffset":4003,"count":97},{"startOffset":4178,"endOffset":4198,"count":97},{"startOffset":4200,"endOffset":4237,"count":0},{"startOffset":4266,"endOffset":4300,"count":97},{"startOffset":4449,"endOffset":4464,"count":97},{"startOffset":4466,"endOffset":4493,"count":0},{"startOffset":4918,"endOffset":5229,"count":0}],"isBlockCoverage":true},{"functionName":"uccp","ranges":[{"startOffset":5334,"endOffset":5400,"count":0}],"isBlockCoverage":false},{"functionName":"uccp","ranges":[{"startOffset":5410,"endOffset":6020,"count":0}],"isBlockCoverage":false},{"functionName":"uccpi","ranges":[{"startOffset":6023,"endOffset":6091,"count":0}],"isBlockCoverage":false},{"functionName":"uccpi","ranges":[{"startOffset":6101,"endOffset":6800,"count":0}],"isBlockCoverage":false},{"functionName":"convert","ranges":[{"startOffset":6803,"endOffset":7910,"count":177},{"startOffset":7001,"endOffset":7018,"count":78},{"startOffset":7560,"endOffset":7617,"count":2},{"startOffset":7677,"endOffset":7906,"count":2}],"isBlockCoverage":true},{"functionName":"read","ranges":[{"startOffset":7913,"endOffset":8219,"count":0}],"isBlockCoverage":false}]},{"scriptId":"361","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_out_ce.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7492,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":2392,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":284,"endOffset":348,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":431,"endOffset":497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":638,"endOffset":760,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":804,"endOffset":883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":930,"endOffset":1027,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1069,"endOffset":1133,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1180,"endOffset":1244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1331,"endOffset":1391,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1431,"endOffset":1473,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1560,"endOffset":1607,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1647,"endOffset":1689,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1779,"endOffset":1821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1858,"endOffset":1918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1960,"endOffset":2026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2114,"endOffset":2157,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2252,"endOffset":2318,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_conv_out_ce","ranges":[{"startOffset":2396,"endOffset":2630,"count":93}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2633,"endOffset":2746,"count":93},{"startOffset":2689,"endOffset":2725,"count":0}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":2749,"endOffset":2820,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2830,"endOffset":4347,"count":93},{"startOffset":3264,"endOffset":3301,"count":0},{"startOffset":3505,"endOffset":3532,"count":0},{"startOffset":3641,"endOffset":3678,"count":0},{"startOffset":3865,"endOffset":3931,"count":0},{"startOffset":4017,"endOffset":4327,"count":0}],"isBlockCoverage":true},{"functionName":"uccpi","ranges":[{"startOffset":4350,"endOffset":4419,"count":0}],"isBlockCoverage":false},{"functionName":"uccpi","ranges":[{"startOffset":4429,"endOffset":5265,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":5268,"endOffset":5593,"count":0}],"isBlockCoverage":false},{"functionName":"get_buffer","ranges":[{"startOffset":5596,"endOffset":5740,"count":0}],"isBlockCoverage":false},{"functionName":"uccp","ranges":[{"startOffset":5743,"endOffset":5810,"count":0}],"isBlockCoverage":false},{"functionName":"uccp","ranges":[{"startOffset":5820,"endOffset":6458,"count":0}],"isBlockCoverage":false},{"functionName":"reset","ranges":[{"startOffset":6461,"endOffset":6523,"count":0}],"isBlockCoverage":false},{"functionName":"convert","ranges":[{"startOffset":6526,"endOffset":7286,"count":226},{"startOffset":6726,"endOffset":6743,"count":0},{"startOffset":6983,"endOffset":7148,"count":0}],"isBlockCoverage":true}]},{"scriptId":"362","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_datfm.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6848,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":105,"endOffset":1766,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":274,"endOffset":321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":417,"endOffset":464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":625,"endOffset":667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":714,"endOffset":803,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":848,"endOffset":905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":953,"endOffset":1042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1148,"endOffset":1237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1281,"endOffset":1370,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1414,"endOffset":1511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1554,"endOffset":1651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1700,"endOffset":1742,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_datfm","ranges":[{"startOffset":1770,"endOffset":1999,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2002,"endOffset":2115,"count":0}],"isBlockCoverage":false},{"functionName":"conv_date_ext_to_int","ranges":[{"startOffset":2118,"endOffset":2211,"count":0}],"isBlockCoverage":false},{"functionName":"conv_date_ext_to_int","ranges":[{"startOffset":2221,"endOffset":5152,"count":0}],"isBlockCoverage":false},{"functionName":"get_date_format_des","ranges":[{"startOffset":5155,"endOffset":5246,"count":0}],"isBlockCoverage":false},{"functionName":"get_date_format_des","ranges":[{"startOffset":5256,"endOffset":6489,"count":0}],"isBlockCoverage":false}]},{"scriptId":"363","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_dyn_prg.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2806,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":1171,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":347,"endOffset":411,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":450,"endOffset":492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":536,"endOffset":578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":683,"endOffset":747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":786,"endOffset":828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":873,"endOffset":915,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1002,"endOffset":1066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1105,"endOffset":1147,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_dyn_prg","ranges":[{"startOffset":1175,"endOffset":1260,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1263,"endOffset":1376,"count":0}],"isBlockCoverage":false},{"functionName":"check_table_name_str","ranges":[{"startOffset":1379,"endOffset":1474,"count":0}],"isBlockCoverage":false},{"functionName":"check_table_name_str","ranges":[{"startOffset":1484,"endOffset":1831,"count":0}],"isBlockCoverage":false},{"functionName":"check_whitelist_str","ranges":[{"startOffset":1834,"endOffset":1927,"count":0}],"isBlockCoverage":false},{"functionName":"check_whitelist_str","ranges":[{"startOffset":1937,"endOffset":2287,"count":0}],"isBlockCoverage":false},{"functionName":"quote","ranges":[{"startOffset":2290,"endOffset":2355,"count":0}],"isBlockCoverage":false},{"functionName":"quote","ranges":[{"startOffset":2365,"endOffset":2677,"count":0}],"isBlockCoverage":false}]},{"scriptId":"364","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_elemdescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":19095,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":213,"endOffset":6898,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":377,"endOffset":437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":520,"endOffset":598,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":679,"endOffset":756,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":923,"endOffset":1701,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1804,"endOffset":3887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3930,"endOffset":4028,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4120,"endOffset":4238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4333,"endOffset":4451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4543,"endOffset":4661,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4753,"endOffset":4871,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4963,"endOffset":5081,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5178,"endOffset":5296,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5388,"endOffset":5506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5550,"endOffset":5610,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5702,"endOffset":5820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5864,"endOffset":5924,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5970,"endOffset":6030,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6122,"endOffset":6240,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6284,"endOffset":6344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6436,"endOffset":6554,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6598,"endOffset":6658,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6756,"endOffset":6874,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_elemdescr","ranges":[{"startOffset":6902,"endOffset":7238,"count":3173}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":7241,"endOffset":7354,"count":3173}],"isBlockCoverage":true},{"functionName":"get_p","ranges":[{"startOffset":7357,"endOffset":7424,"count":0}],"isBlockCoverage":false},{"functionName":"get_p","ranges":[{"startOffset":7434,"endOffset":7989,"count":0}],"isBlockCoverage":false},{"functionName":"get_n","ranges":[{"startOffset":7992,"endOffset":8059,"count":0}],"isBlockCoverage":false},{"functionName":"get_n","ranges":[{"startOffset":8069,"endOffset":8639,"count":0}],"isBlockCoverage":false},{"functionName":"get_x","ranges":[{"startOffset":8642,"endOffset":8709,"count":0}],"isBlockCoverage":false},{"functionName":"get_x","ranges":[{"startOffset":8719,"endOffset":9136,"count":0}],"isBlockCoverage":false},{"functionName":"get_xstring","ranges":[{"startOffset":9139,"endOffset":9208,"count":0}],"isBlockCoverage":false},{"functionName":"get_xstring","ranges":[{"startOffset":9218,"endOffset":9506,"count":0}],"isBlockCoverage":false},{"functionName":"get_ddic_field","ranges":[{"startOffset":9509,"endOffset":12332,"count":0}],"isBlockCoverage":false},{"functionName":"get_i","ranges":[{"startOffset":12335,"endOffset":12392,"count":0}],"isBlockCoverage":false},{"functionName":"get_i","ranges":[{"startOffset":12402,"endOffset":12742,"count":0}],"isBlockCoverage":false},{"functionName":"get_int8","ranges":[{"startOffset":12745,"endOffset":12808,"count":0}],"isBlockCoverage":false},{"functionName":"get_int8","ranges":[{"startOffset":12818,"endOffset":13165,"count":0}],"isBlockCoverage":false},{"functionName":"get_string","ranges":[{"startOffset":13168,"endOffset":13235,"count":0}],"isBlockCoverage":false},{"functionName":"get_string","ranges":[{"startOffset":13245,"endOffset":13594,"count":0}],"isBlockCoverage":false},{"functionName":"get_f","ranges":[{"startOffset":13597,"endOffset":13654,"count":0}],"isBlockCoverage":false},{"functionName":"get_f","ranges":[{"startOffset":13664,"endOffset":14002,"count":0}],"isBlockCoverage":false},{"functionName":"get_d","ranges":[{"startOffset":14005,"endOffset":14062,"count":0}],"isBlockCoverage":false},{"functionName":"get_d","ranges":[{"startOffset":14072,"endOffset":14409,"count":0}],"isBlockCoverage":false},{"functionName":"get_t","ranges":[{"startOffset":14412,"endOffset":14469,"count":0}],"isBlockCoverage":false},{"functionName":"get_t","ranges":[{"startOffset":14479,"endOffset":14816,"count":0}],"isBlockCoverage":false},{"functionName":"get_c","ranges":[{"startOffset":14819,"endOffset":14886,"count":0}],"isBlockCoverage":false},{"functionName":"get_c","ranges":[{"startOffset":14896,"endOffset":15466,"count":0}],"isBlockCoverage":false},{"functionName":"get_ddic_fixed_values","ranges":[{"startOffset":15469,"endOffset":17581,"count":0}],"isBlockCoverage":false}]},{"scriptId":"365","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_enumdescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2548,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":213,"endOffset":932,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":371,"endOffset":851,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_enumdescr","ranges":[{"startOffset":936,"endOffset":1519,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1522,"endOffset":1635,"count":0}],"isBlockCoverage":false}]},{"scriptId":"366","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_exceptional_values.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4457,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":798,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":369,"endOffset":442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":481,"endOffset":524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":619,"endOffset":692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":731,"endOffset":774,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_exceptional_values","ranges":[{"startOffset":802,"endOffset":887,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":890,"endOffset":1003,"count":0}],"isBlockCoverage":false},{"functionName":"get_max_value","ranges":[{"startOffset":1006,"endOffset":1098,"count":0}],"isBlockCoverage":false},{"functionName":"get_max_value","ranges":[{"startOffset":1108,"endOffset":3130,"count":0}],"isBlockCoverage":false},{"functionName":"get_min_value","ranges":[{"startOffset":3133,"endOffset":3225,"count":0}],"isBlockCoverage":false},{"functionName":"get_min_value","ranges":[{"startOffset":3235,"endOffset":4284,"count":0}],"isBlockCoverage":false}]},{"scriptId":"367","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_format.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2099,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":982,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":266,"endOffset":326,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":411,"endOffset":471,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":558,"endOffset":618,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":697,"endOffset":757,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":841,"endOffset":901,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_format","ranges":[{"startOffset":986,"endOffset":1316,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1319,"endOffset":1432,"count":0}],"isBlockCoverage":false}]},{"scriptId":"368","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_gzip.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7950,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":103,"endOffset":2701,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":335,"endOffset":401,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":444,"endOffset":510,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":557,"endOffset":617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":725,"endOffset":785,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":827,"endOffset":893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":937,"endOffset":1003,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1051,"endOffset":1111,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1212,"endOffset":1248,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1295,"endOffset":1355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1401,"endOffset":1501,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1545,"endOffset":1587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1635,"endOffset":1695,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1794,"endOffset":1836,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1883,"endOffset":1943,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1993,"endOffset":2053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2099,"endOffset":2199,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2243,"endOffset":2279,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2327,"endOffset":2387,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2502,"endOffset":2568,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2611,"endOffset":2677,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_gzip","ranges":[{"startOffset":2705,"endOffset":2790,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2793,"endOffset":2906,"count":0}],"isBlockCoverage":false},{"functionName":"decompress_binary_with_header","ranges":[{"startOffset":2909,"endOffset":3019,"count":0}],"isBlockCoverage":false},{"functionName":"decompress_binary_with_header","ranges":[{"startOffset":3029,"endOffset":3532,"count":0}],"isBlockCoverage":false},{"functionName":"decompress_text","ranges":[{"startOffset":3535,"endOffset":3617,"count":0}],"isBlockCoverage":false},{"functionName":"decompress_text","ranges":[{"startOffset":3627,"endOffset":4687,"count":0}],"isBlockCoverage":false},{"functionName":"compress_text","ranges":[{"startOffset":4690,"endOffset":4768,"count":0}],"isBlockCoverage":false},{"functionName":"compress_text","ranges":[{"startOffset":4778,"endOffset":6109,"count":0}],"isBlockCoverage":false},{"functionName":"decompress_binary","ranges":[{"startOffset":6112,"endOffset":6198,"count":0}],"isBlockCoverage":false},{"functionName":"decompress_binary","ranges":[{"startOffset":6208,"endOffset":6901,"count":10}],"isBlockCoverage":true},{"functionName":"compress_binary","ranges":[{"startOffset":6904,"endOffset":6986,"count":0}],"isBlockCoverage":false},{"functionName":"compress_binary","ranges":[{"startOffset":6996,"endOffset":7833,"count":15},{"startOffset":7137,"endOffset":7180,"count":0},{"startOffset":7548,"endOffset":7584,"count":10}],"isBlockCoverage":true}]},{"scriptId":"369","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_hmac.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5158,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":103,"endOffset":1617,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":345,"endOffset":409,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":451,"endOffset":517,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":560,"endOffset":626,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":675,"endOffset":739,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":789,"endOffset":855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":969,"endOffset":1033,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1075,"endOffset":1141,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1184,"endOffset":1248,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1297,"endOffset":1361,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1411,"endOffset":1477,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1529,"endOffset":1593,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_hmac","ranges":[{"startOffset":1621,"endOffset":1706,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1709,"endOffset":1822,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_hmac_for_raw","ranges":[{"startOffset":1825,"endOffset":1921,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_hmac_for_raw","ranges":[{"startOffset":1931,"endOffset":3767,"count":44},{"startOffset":2079,"endOffset":2118,"count":0},{"startOffset":2769,"endOffset":2809,"count":0},{"startOffset":3132,"endOffset":3204,"count":0},{"startOffset":3205,"endOffset":3280,"count":0},{"startOffset":3533,"endOffset":3724,"count":0}],"isBlockCoverage":true},{"functionName":"calculate_hmac_for_char","ranges":[{"startOffset":3770,"endOffset":3868,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_hmac_for_char","ranges":[{"startOffset":3878,"endOffset":5041,"count":0}],"isBlockCoverage":false}]},{"scriptId":"370","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_intfdescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":736,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":219,"endOffset":381,"count":1}],"isBlockCoverage":true},{"functionName":"cl_abap_intfdescr","ranges":[{"startOffset":385,"endOffset":483,"count":24}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":486,"endOffset":599,"count":24}],"isBlockCoverage":true}]},{"scriptId":"371","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_matcher.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10984,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":3885,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":268,"endOffset":1115,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1197,"endOffset":1257,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1338,"endOffset":1402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1486,"endOffset":1550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1700,"endOffset":1742,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1789,"endOffset":1886,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1926,"endOffset":1968,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2065,"endOffset":2912,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3005,"endOffset":3102,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3198,"endOffset":3262,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3303,"endOffset":3363,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3458,"endOffset":3518,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3609,"endOffset":3706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3801,"endOffset":3861,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_matcher","ranges":[{"startOffset":3889,"endOffset":5036,"count":137}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":5039,"endOffset":5813,"count":137},{"startOffset":5506,"endOffset":5625,"count":125},{"startOffset":5625,"endOffset":5730,"count":12}],"isBlockCoverage":true},{"functionName":"match","ranges":[{"startOffset":5816,"endOffset":6213,"count":5}],"isBlockCoverage":true},{"functionName":"find_all","ranges":[{"startOffset":6216,"endOffset":7152,"count":122}],"isBlockCoverage":true},{"functionName":"find_next","ranges":[{"startOffset":7155,"endOffset":7570,"count":33}],"isBlockCoverage":true},{"functionName":"get_submatch","ranges":[{"startOffset":7573,"endOffset":9065,"count":40}],"isBlockCoverage":true},{"functionName":"get_offset","ranges":[{"startOffset":9068,"endOffset":9960,"count":5}],"isBlockCoverage":true},{"functionName":"get_length","ranges":[{"startOffset":9963,"endOffset":10855,"count":5}],"isBlockCoverage":true}]},{"scriptId":"372","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_math.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3307,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":103,"endOffset":1563,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":257,"endOffset":317,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":399,"endOffset":459,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":546,"endOffset":606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":688,"endOffset":748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":835,"endOffset":895,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":984,"endOffset":1044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1133,"endOffset":1193,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1277,"endOffset":1337,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1422,"endOffset":1482,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_math","ranges":[{"startOffset":1567,"endOffset":2097,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2100,"endOffset":2213,"count":0}],"isBlockCoverage":false}]},{"scriptId":"373","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_message_digest.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4431,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":1205,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":375,"endOffset":439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":482,"endOffset":548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":598,"endOffset":664,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":778,"endOffset":842,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":885,"endOffset":949,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":999,"endOffset":1065,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1117,"endOffset":1181,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_message_digest","ranges":[{"startOffset":1209,"endOffset":1294,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1297,"endOffset":1410,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_hash_for_raw","ranges":[{"startOffset":1413,"endOffset":1519,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_hash_for_raw","ranges":[{"startOffset":1529,"endOffset":2720,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_hash_for_char","ranges":[{"startOffset":2723,"endOffset":2831,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_hash_for_char","ranges":[{"startOffset":2841,"endOffset":4274,"count":0}],"isBlockCoverage":false}]},{"scriptId":"374","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_random.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3235,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":1228,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":332,"endOffset":444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":484,"endOffset":544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":636,"endOffset":696,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":795,"endOffset":855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":894,"endOffset":954,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":994,"endOffset":1054,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1144,"endOffset":1204,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_random","ranges":[{"startOffset":1232,"endOffset":1317,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1320,"endOffset":1433,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1436,"endOffset":1502,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1512,"endOffset":1871,"count":0}],"isBlockCoverage":false},{"functionName":"int","ranges":[{"startOffset":1874,"endOffset":2041,"count":0}],"isBlockCoverage":false},{"functionName":"seed","ranges":[{"startOffset":2044,"endOffset":2096,"count":0}],"isBlockCoverage":false},{"functionName":"seed","ranges":[{"startOffset":2106,"endOffset":2265,"count":0}],"isBlockCoverage":false},{"functionName":"intinrange","ranges":[{"startOffset":2268,"endOffset":3110,"count":0}],"isBlockCoverage":false}]},{"scriptId":"375","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_random_int.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2852,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":115,"endOffset":1209,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":273,"endOffset":333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":413,"endOffset":473,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":615,"endOffset":735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":775,"endOffset":835,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":874,"endOffset":934,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":973,"endOffset":1033,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1125,"endOffset":1185,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_random_int","ranges":[{"startOffset":1213,"endOffset":1426,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1429,"endOffset":1542,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1545,"endOffset":1615,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1625,"endOffset":2478,"count":0}],"isBlockCoverage":false},{"functionName":"get_next","ranges":[{"startOffset":2481,"endOffset":2711,"count":0}],"isBlockCoverage":false}]},{"scriptId":"376","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_refdescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2134,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":211,"endOffset":1004,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":371,"endOffset":489,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":644,"endOffset":762,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":864,"endOffset":980,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_refdescr","ranges":[{"startOffset":1008,"endOffset":1232,"count":81}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1235,"endOffset":1348,"count":81}],"isBlockCoverage":true},{"functionName":"get_referenced_type","ranges":[{"startOffset":1351,"endOffset":1551,"count":1}],"isBlockCoverage":true},{"functionName":"get_ref_to_data","ranges":[{"startOffset":1554,"endOffset":1630,"count":0}],"isBlockCoverage":false},{"functionName":"get_ref_to_data","ranges":[{"startOffset":1640,"endOffset":2001,"count":0}],"isBlockCoverage":false}]},{"scriptId":"377","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_regex.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3694,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":105,"endOffset":1604,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":262,"endOffset":326,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":414,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":661,"endOffset":703,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":750,"endOffset":847,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":950,"endOffset":1064,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1104,"endOffset":1146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1241,"endOffset":1351,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1394,"endOffset":1436,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1483,"endOffset":1580,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_regex","ranges":[{"startOffset":1608,"endOffset":1874,"count":129}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1877,"endOffset":2390,"count":129},{"startOffset":2151,"endOffset":2188,"count":121},{"startOffset":2253,"endOffset":2293,"count":8}],"isBlockCoverage":true},{"functionName":"create_pcre","ranges":[{"startOffset":2393,"endOffset":2468,"count":0}],"isBlockCoverage":false},{"functionName":"create_pcre","ranges":[{"startOffset":2478,"endOffset":3146,"count":0}],"isBlockCoverage":false},{"functionName":"create_matcher","ranges":[{"startOffset":3149,"endOffset":3573,"count":137}],"isBlockCoverage":true}]},{"scriptId":"378","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_structdescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":39551,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":9312,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":389,"endOffset":947,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1032,"endOffset":1112,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1193,"endOffset":1850,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2068,"endOffset":2190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2230,"endOffset":2273,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2379,"endOffset":2988,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3099,"endOffset":5372,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5415,"endOffset":5513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5573,"endOffset":5670,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5765,"endOffset":5862,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5970,"endOffset":6088,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6130,"endOffset":6173,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6277,"endOffset":6744,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6787,"endOffset":6847,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6937,"endOffset":7059,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7107,"endOffset":7716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7804,"endOffset":7926,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7974,"endOffset":8583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8627,"endOffset":8724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8822,"endOffset":9288,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_structdescr","ranges":[{"startOffset":9316,"endOffset":10731,"count":594}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":10734,"endOffset":10847,"count":594}],"isBlockCoverage":true},{"functionName":"get_symbols","ranges":[{"startOffset":10850,"endOffset":11486,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":11489,"endOffset":11554,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":11564,"endOffset":12548,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":12551,"endOffset":12622,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":12632,"endOffset":16519,"count":0}],"isBlockCoverage":false},{"functionName":"get_included_view","ranges":[{"startOffset":16522,"endOffset":19139,"count":0}],"isBlockCoverage":false},{"functionName":"get_ddic_field_list","ranges":[{"startOffset":19142,"endOffset":29047,"count":25},{"startOffset":21576,"endOffset":21592,"count":0},{"startOffset":21594,"endOffset":21623,"count":0},{"startOffset":21652,"endOffset":21682,"count":0},{"startOffset":21857,"endOffset":21890,"count":0},{"startOffset":21892,"endOffset":21955,"count":0},{"startOffset":21984,"endOffset":22031,"count":0},{"startOffset":27896,"endOffset":28420,"count":96},{"startOffset":28484,"endOffset":28489,"count":0},{"startOffset":28492,"endOffset":29017,"count":67}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":28617,"endOffset":28675,"count":130}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":28706,"endOffset":28733,"count":0}],"isBlockCoverage":false},{"functionName":"is_ddic_type","ranges":[{"startOffset":29050,"endOffset":29216,"count":21}],"isBlockCoverage":true},{"functionName":"construct_from_data","ranges":[{"startOffset":29219,"endOffset":29316,"count":0}],"isBlockCoverage":false},{"functionName":"construct_from_data","ranges":[{"startOffset":29326,"endOffset":31554,"count":594},{"startOffset":30638,"endOffset":31489,"count":2813},{"startOffset":31105,"endOffset":31127,"count":2810},{"startOffset":31128,"endOffset":31133,"count":0},{"startOffset":31273,"endOffset":31364,"count":0}],"isBlockCoverage":true},{"functionName":"update_components","ranges":[{"startOffset":31557,"endOffset":32973,"count":594},{"startOffset":32542,"endOffset":32969,"count":2813}],"isBlockCoverage":true},{"functionName":"get_components","ranges":[{"startOffset":32976,"endOffset":35637,"count":268},{"startOffset":34945,"endOffset":35607,"count":919}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":35145,"endOffset":35210,"count":2205}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":35241,"endOffset":35263,"count":0}],"isBlockCoverage":false},{"functionName":"get_component_type","ranges":[{"startOffset":35640,"endOffset":36879,"count":191},{"startOffset":36723,"endOffset":36799,"count":6},{"startOffset":36799,"endOffset":36878,"count":185}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":36449,"endOffset":36497,"count":512}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":36526,"endOffset":36548,"count":0}],"isBlockCoverage":false}]},{"scriptId":"379","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_tabledescr.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":23795,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":215,"endOffset":8483,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":381,"endOffset":478,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":555,"endOffset":908,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":993,"endOffset":1073,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1157,"endOffset":1236,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1322,"endOffset":1440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1521,"endOffset":2549,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2636,"endOffset":2683,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2770,"endOffset":2817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2906,"endOffset":2953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3043,"endOffset":3090,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3180,"endOffset":3227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3319,"endOffset":3366,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3460,"endOffset":3507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3596,"endOffset":3643,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3733,"endOffset":3780,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3936,"endOffset":4056,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4096,"endOffset":4139,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4241,"endOffset":4359,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4444,"endOffset":4564,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4604,"endOffset":4722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4822,"endOffset":4942,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4989,"endOffset":5107,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5149,"endOffset":6177,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6265,"endOffset":6385,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6432,"endOffset":6550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6598,"endOffset":6677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6721,"endOffset":6818,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6859,"endOffset":7212,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7258,"endOffset":7338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7431,"endOffset":8459,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_tabledescr","ranges":[{"startOffset":8487,"endOffset":10966,"count":535}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":10969,"endOffset":11082,"count":535}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":11085,"endOffset":11155,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":11165,"endOffset":13134,"count":0}],"isBlockCoverage":false},{"functionName":"get_keys","ranges":[{"startOffset":13137,"endOffset":14239,"count":24}],"isBlockCoverage":true},{"functionName":"get_with_keys","ranges":[{"startOffset":14242,"endOffset":14326,"count":0}],"isBlockCoverage":false},{"functionName":"get_with_keys","ranges":[{"startOffset":14336,"endOffset":17544,"count":21},{"startOffset":16699,"endOffset":16827,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":17547,"endOffset":17611,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":17621,"endOffset":18070,"count":0}],"isBlockCoverage":false},{"functionName":"construct_from_data","ranges":[{"startOffset":18073,"endOffset":18169,"count":0}],"isBlockCoverage":false},{"functionName":"construct_from_data","ranges":[{"startOffset":18179,"endOffset":22376,"count":514},{"startOffset":20195,"endOffset":20200,"count":181},{"startOffset":20201,"endOffset":20205,"count":333},{"startOffset":20305,"endOffset":20310,"count":0},{"startOffset":20425,"endOffset":20500,"count":333},{"startOffset":20500,"endOffset":20901,"count":181},{"startOffset":20582,"endOffset":20660,"count":165},{"startOffset":20660,"endOffset":20901,"count":16},{"startOffset":20820,"endOffset":20901,"count":0},{"startOffset":21118,"endOffset":21123,"count":269},{"startOffset":21124,"endOffset":21128,"count":245},{"startOffset":21189,"endOffset":21756,"count":269},{"startOffset":21326,"endOffset":21472,"count":472},{"startOffset":21576,"endOffset":21661,"count":66},{"startOffset":21663,"endOffset":21750,"count":5},{"startOffset":21756,"endOffset":22354,"count":245},{"startOffset":21934,"endOffset":22348,"count":169},{"startOffset":22154,"endOffset":22340,"count":603}],"isBlockCoverage":true},{"functionName":"get_table_line_type","ranges":[{"startOffset":22379,"endOffset":22605,"count":74}],"isBlockCoverage":true}]},{"scriptId":"380","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_timefm.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2449,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":658,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":345,"endOffset":387,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":436,"endOffset":533,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":577,"endOffset":634,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_timefm","ranges":[{"startOffset":662,"endOffset":747,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":750,"endOffset":863,"count":0}],"isBlockCoverage":false},{"functionName":"conv_time_ext_to_int","ranges":[{"startOffset":866,"endOffset":960,"count":0}],"isBlockCoverage":false},{"functionName":"conv_time_ext_to_int","ranges":[{"startOffset":970,"endOffset":2324,"count":0}],"isBlockCoverage":false}]},{"scriptId":"381","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_tstmp.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10657,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":105,"endOffset":3874,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":328,"endOffset":388,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":430,"endOffset":493,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":535,"endOffset":598,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":684,"endOffset":776,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":817,"endOffset":880,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":920,"endOffset":983,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1078,"endOffset":1170,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1211,"endOffset":1274,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1314,"endOffset":1377,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1466,"endOffset":1523,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1563,"endOffset":1620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1660,"endOffset":1723,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1767,"endOffset":1824,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1868,"endOffset":1925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2017,"endOffset":2080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2125,"endOffset":2188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2296,"endOffset":2353,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2398,"endOffset":2455,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2500,"endOffset":2563,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2664,"endOffset":2756,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2801,"endOffset":2893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2988,"endOffset":3045,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3086,"endOffset":3143,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3184,"endOffset":3241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3282,"endOffset":3339,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3383,"endOffset":3446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3554,"endOffset":3646,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3691,"endOffset":3748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3793,"endOffset":3850,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_tstmp","ranges":[{"startOffset":3878,"endOffset":3963,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3966,"endOffset":4079,"count":0}],"isBlockCoverage":false},{"functionName":"td_add","ranges":[{"startOffset":4082,"endOffset":4147,"count":0}],"isBlockCoverage":false},{"functionName":"td_add","ranges":[{"startOffset":4157,"endOffset":4885,"count":0}],"isBlockCoverage":false},{"functionName":"systemtstmp_utc2syst","ranges":[{"startOffset":4888,"endOffset":4981,"count":0}],"isBlockCoverage":false},{"functionName":"systemtstmp_utc2syst","ranges":[{"startOffset":4991,"endOffset":5571,"count":0}],"isBlockCoverage":false},{"functionName":"move","ranges":[{"startOffset":5574,"endOffset":5635,"count":0}],"isBlockCoverage":false},{"functionName":"move","ranges":[{"startOffset":5645,"endOffset":5969,"count":4}],"isBlockCoverage":true},{"functionName":"systemtstmp_syst2utc","ranges":[{"startOffset":5972,"endOffset":6065,"count":0}],"isBlockCoverage":false},{"functionName":"systemtstmp_syst2utc","ranges":[{"startOffset":6075,"endOffset":6636,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":6639,"endOffset":6708,"count":0}],"isBlockCoverage":false},{"functionName":"subtract","ranges":[{"startOffset":6718,"endOffset":7445,"count":5}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":7448,"endOffset":7507,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":7517,"endOffset":8248,"count":1}],"isBlockCoverage":true},{"functionName":"subtractsecs","ranges":[{"startOffset":8251,"endOffset":8328,"count":0}],"isBlockCoverage":false},{"functionName":"subtractsecs","ranges":[{"startOffset":8338,"endOffset":8922,"count":1}],"isBlockCoverage":true},{"functionName":"move_to_short","ranges":[{"startOffset":8925,"endOffset":9004,"count":0}],"isBlockCoverage":false},{"functionName":"move_to_short","ranges":[{"startOffset":9014,"endOffset":9399,"count":0}],"isBlockCoverage":false},{"functionName":"td_subtract","ranges":[{"startOffset":9402,"endOffset":9477,"count":0}],"isBlockCoverage":false},{"functionName":"td_subtract","ranges":[{"startOffset":9487,"endOffset":10536,"count":0}],"isBlockCoverage":false}]},{"scriptId":"382","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_unit_assert.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":29730,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":172,"endOffset":7949,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":404,"endOffset":447,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":486,"endOffset":529,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":624,"endOffset":667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":788,"endOffset":830,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":869,"endOffset":927,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":967,"endOffset":1027,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1068,"endOffset":1128,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1215,"endOffset":1257,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1299,"endOffset":1341,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1381,"endOffset":1444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1540,"endOffset":1583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1622,"endOffset":1665,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1704,"endOffset":1746,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1786,"endOffset":1846,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1887,"endOffset":1947,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2052,"endOffset":2112,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2153,"endOffset":2213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2255,"endOffset":2315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2354,"endOffset":2396,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2436,"endOffset":2496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2537,"endOffset":2597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2697,"endOffset":2740,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2779,"endOffset":2821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2861,"endOffset":2921,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2962,"endOffset":3022,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3118,"endOffset":3161,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3200,"endOffset":3242,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3282,"endOffset":3342,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3383,"endOffset":3443,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3529,"endOffset":3571,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3613,"endOffset":3655,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3741,"endOffset":3783,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3823,"endOffset":3883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3924,"endOffset":3984,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4026,"endOffset":4068,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4162,"endOffset":4222,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4261,"endOffset":4321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4360,"endOffset":4402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4442,"endOffset":4502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4543,"endOffset":4603,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4696,"endOffset":4793,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4832,"endOffset":4874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4914,"endOffset":4974,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5015,"endOffset":5075,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5169,"endOffset":5266,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5305,"endOffset":5347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5387,"endOffset":5447,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5488,"endOffset":5548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5644,"endOffset":5686,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5725,"endOffset":5767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5806,"endOffset":5870,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5910,"endOffset":5970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6011,"endOffset":6071,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6167,"endOffset":6209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6248,"endOffset":6290,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6329,"endOffset":6371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6411,"endOffset":6471,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6512,"endOffset":6572,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6666,"endOffset":6709,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6748,"endOffset":6790,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6830,"endOffset":6890,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6931,"endOffset":6991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7089,"endOffset":7132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7171,"endOffset":7213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7253,"endOffset":7313,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7354,"endOffset":7414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7519,"endOffset":7561,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7601,"endOffset":7643,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7682,"endOffset":7724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7764,"endOffset":7824,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7865,"endOffset":7925,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_unit_assert","ranges":[{"startOffset":7953,"endOffset":8038,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8041,"endOffset":8154,"count":0}],"isBlockCoverage":false},{"functionName":"compare_tables","ranges":[{"startOffset":8157,"endOffset":8244,"count":0}],"isBlockCoverage":false},{"functionName":"compare_tables","ranges":[{"startOffset":8254,"endOffset":12097,"count":196},{"startOffset":9419,"endOffset":9834,"count":0},{"startOffset":10286,"endOffset":10381,"count":194},{"startOffset":10383,"endOffset":11399,"count":2},{"startOffset":10454,"endOffset":11393,"count":4},{"startOffset":10611,"endOffset":11013,"count":6},{"startOffset":10737,"endOffset":10819,"count":4},{"startOffset":10819,"endOffset":11003,"count":2},{"startOffset":10947,"endOffset":10991,"count":0},{"startOffset":11078,"endOffset":11385,"count":0},{"startOffset":11399,"endOffset":12093,"count":194},{"startOffset":11602,"endOffset":12034,"count":942}],"isBlockCoverage":true},{"functionName":"assert_text_matches","ranges":[{"startOffset":12100,"endOffset":12197,"count":0}],"isBlockCoverage":false},{"functionName":"assert_text_matches","ranges":[{"startOffset":12207,"endOffset":13291,"count":0}],"isBlockCoverage":false},{"functionName":"abort","ranges":[{"startOffset":13294,"endOffset":13363,"count":0}],"isBlockCoverage":false},{"functionName":"abort","ranges":[{"startOffset":13373,"endOffset":13922,"count":0}],"isBlockCoverage":false},{"functionName":"assert_bound","ranges":[{"startOffset":13925,"endOffset":14008,"count":0}],"isBlockCoverage":false},{"functionName":"assert_bound","ranges":[{"startOffset":14018,"endOffset":14784,"count":7},{"startOffset":14206,"endOffset":14224,"count":0},{"startOffset":14315,"endOffset":14338,"count":0},{"startOffset":14431,"endOffset":14456,"count":0},{"startOffset":14492,"endOffset":14780,"count":0}],"isBlockCoverage":true},{"functionName":"assert_not_bound","ranges":[{"startOffset":14787,"endOffset":14878,"count":0}],"isBlockCoverage":false},{"functionName":"assert_not_bound","ranges":[{"startOffset":14888,"endOffset":15672,"count":3},{"startOffset":15080,"endOffset":15098,"count":0},{"startOffset":15189,"endOffset":15212,"count":0},{"startOffset":15305,"endOffset":15330,"count":0},{"startOffset":15376,"endOffset":15668,"count":0}],"isBlockCoverage":true},{"functionName":"assert_char_cp","ranges":[{"startOffset":15675,"endOffset":15762,"count":0}],"isBlockCoverage":false},{"functionName":"assert_char_cp","ranges":[{"startOffset":15772,"endOffset":16627,"count":19},{"startOffset":16072,"endOffset":16093,"count":0},{"startOffset":16184,"endOffset":16207,"count":0},{"startOffset":16300,"endOffset":16325,"count":0},{"startOffset":16361,"endOffset":16623,"count":0}],"isBlockCoverage":true},{"functionName":"assert_char_np","ranges":[{"startOffset":16630,"endOffset":16717,"count":0}],"isBlockCoverage":false},{"functionName":"assert_char_np","ranges":[{"startOffset":16727,"endOffset":17596,"count":0}],"isBlockCoverage":false},{"functionName":"fail","ranges":[{"startOffset":17599,"endOffset":17666,"count":0}],"isBlockCoverage":false},{"functionName":"fail","ranges":[{"startOffset":17676,"endOffset":18342,"count":0}],"isBlockCoverage":false},{"functionName":"skip","ranges":[{"startOffset":18345,"endOffset":18412,"count":0}],"isBlockCoverage":false},{"functionName":"skip","ranges":[{"startOffset":18422,"endOffset":18647,"count":0}],"isBlockCoverage":false},{"functionName":"assert_differs","ranges":[{"startOffset":18650,"endOffset":18737,"count":0}],"isBlockCoverage":false},{"functionName":"assert_differs","ranges":[{"startOffset":18747,"endOffset":19830,"count":1},{"startOffset":19027,"endOffset":19045,"count":0},{"startOffset":19136,"endOffset":19159,"count":0},{"startOffset":19252,"endOffset":19277,"count":0},{"startOffset":19341,"endOffset":19656,"count":0},{"startOffset":19788,"endOffset":19820,"count":0}],"isBlockCoverage":true},{"functionName":"assert_true","ranges":[{"startOffset":19833,"endOffset":19914,"count":0}],"isBlockCoverage":false},{"functionName":"assert_true","ranges":[{"startOffset":19924,"endOffset":20757,"count":3},{"startOffset":20168,"endOffset":20186,"count":0},{"startOffset":20277,"endOffset":20300,"count":0},{"startOffset":20393,"endOffset":20418,"count":0},{"startOffset":20473,"endOffset":20753,"count":0}],"isBlockCoverage":true},{"functionName":"assert_false","ranges":[{"startOffset":20760,"endOffset":20843,"count":0}],"isBlockCoverage":false},{"functionName":"assert_false","ranges":[{"startOffset":20853,"endOffset":21689,"count":5},{"startOffset":21098,"endOffset":21116,"count":0},{"startOffset":21207,"endOffset":21230,"count":0},{"startOffset":21323,"endOffset":21348,"count":0},{"startOffset":21404,"endOffset":21685,"count":0}],"isBlockCoverage":true},{"functionName":"assert_equals","ranges":[{"startOffset":21692,"endOffset":21777,"count":0}],"isBlockCoverage":false},{"functionName":"assert_equals","ranges":[{"startOffset":21787,"endOffset":25112,"count":4139},{"startOffset":22066,"endOffset":22084,"count":135},{"startOffset":22171,"endOffset":22192,"count":0},{"startOffset":22283,"endOffset":22306,"count":0},{"startOffset":22399,"endOffset":22424,"count":0},{"startOffset":22978,"endOffset":23424,"count":3021},{"startOffset":23116,"endOffset":23410,"count":0},{"startOffset":23424,"endOffset":23849,"count":1118},{"startOffset":23557,"endOffset":23843,"count":0},{"startOffset":23920,"endOffset":23982,"count":196},{"startOffset":23982,"endOffset":25108,"count":3943},{"startOffset":24012,"endOffset":24337,"count":0},{"startOffset":24374,"endOffset":25108,"count":3},{"startOffset":24649,"endOffset":24683,"count":0}],"isBlockCoverage":true},{"functionName":"assert_not_initial","ranges":[{"startOffset":25115,"endOffset":25210,"count":0}],"isBlockCoverage":false},{"functionName":"assert_not_initial","ranges":[{"startOffset":25220,"endOffset":26160,"count":28},{"startOffset":25414,"endOffset":25432,"count":3},{"startOffset":25523,"endOffset":25546,"count":0},{"startOffset":25639,"endOffset":25664,"count":0},{"startOffset":25767,"endOffset":26156,"count":0}],"isBlockCoverage":true},{"functionName":"assert_initial","ranges":[{"startOffset":26163,"endOffset":26250,"count":0}],"isBlockCoverage":false},{"functionName":"assert_initial","ranges":[{"startOffset":26260,"endOffset":27202,"count":9},{"startOffset":26450,"endOffset":26468,"count":1},{"startOffset":26559,"endOffset":26582,"count":0},{"startOffset":26675,"endOffset":26700,"count":0},{"startOffset":26813,"endOffset":27198,"count":0}],"isBlockCoverage":true},{"functionName":"assert_subrc","ranges":[{"startOffset":27205,"endOffset":27288,"count":0}],"isBlockCoverage":false},{"functionName":"assert_subrc","ranges":[{"startOffset":27298,"endOffset":28453,"count":2000},{"startOffset":27400,"endOffset":27412,"count":29},{"startOffset":27414,"endOffset":27435,"count":25},{"startOffset":27464,"endOffset":27490,"count":29},{"startOffset":27492,"endOffset":27532,"count":1975},{"startOffset":27607,"endOffset":27619,"count":29},{"startOffset":27621,"endOffset":27642,"count":4},{"startOffset":27671,"endOffset":27697,"count":29},{"startOffset":27699,"endOffset":27735,"count":1996},{"startOffset":27792,"endOffset":27804,"count":29},{"startOffset":27806,"endOffset":27824,"count":29},{"startOffset":27900,"endOffset":27913,"count":29},{"startOffset":27915,"endOffset":27938,"count":0},{"startOffset":28015,"endOffset":28029,"count":29},{"startOffset":28031,"endOffset":28056,"count":0},{"startOffset":28092,"endOffset":28449,"count":0}],"isBlockCoverage":true},{"functionName":"assert_number_between","ranges":[{"startOffset":28456,"endOffset":28557,"count":0}],"isBlockCoverage":false},{"functionName":"assert_number_between","ranges":[{"startOffset":28567,"endOffset":29585,"count":0}],"isBlockCoverage":false}]},{"scriptId":"383","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_unit_assert.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3640,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":782,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":366,"endOffset":430,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":472,"endOffset":515,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":609,"endOffset":673,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":715,"endOffset":758,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_dump","ranges":[{"startOffset":786,"endOffset":871,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":874,"endOffset":987,"count":0}],"isBlockCoverage":false},{"functionName":"to_string","ranges":[{"startOffset":990,"endOffset":1056,"count":0}],"isBlockCoverage":false},{"functionName":"to_string","ranges":[{"startOffset":1066,"endOffset":1881,"count":10},{"startOffset":1477,"endOffset":1545,"count":8},{"startOffset":1547,"endOffset":1619,"count":2},{"startOffset":1619,"endOffset":1858,"count":8},{"startOffset":1696,"endOffset":1760,"count":0}],"isBlockCoverage":true},{"functionName":"dump_structure","ranges":[{"startOffset":1884,"endOffset":1960,"count":0}],"isBlockCoverage":false},{"functionName":"dump_structure","ranges":[{"startOffset":1970,"endOffset":3496,"count":2},{"startOffset":2812,"endOffset":3473,"count":4},{"startOffset":2917,"endOffset":3011,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2672,"endOffset":2737,"count":4}],"isBlockCoverage":true}]},{"scriptId":"384","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_zip.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13231,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":148,"endOffset":2765,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":298,"endOffset":737,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":822,"endOffset":1356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1495,"endOffset":1559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1602,"endOffset":1668,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1754,"endOffset":1820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1906,"endOffset":1972,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2058,"endOffset":2122,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2165,"endOffset":2231,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2320,"endOffset":2384,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2425,"endOffset":2485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2572,"endOffset":2632,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2675,"endOffset":2741,"count":0}],"isBlockCoverage":false},{"functionName":"cl_abap_zip","ranges":[{"startOffset":2769,"endOffset":3839,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3842,"endOffset":3955,"count":0}],"isBlockCoverage":false},{"functionName":"crc32","ranges":[{"startOffset":3958,"endOffset":4019,"count":0}],"isBlockCoverage":false},{"functionName":"crc32","ranges":[{"startOffset":4029,"endOffset":4603,"count":0}],"isBlockCoverage":false},{"functionName":"delete","ranges":[{"startOffset":4606,"endOffset":5087,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":5090,"endOffset":6189,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":6192,"endOffset":7103,"count":0}],"isBlockCoverage":false},{"functionName":"load","ranges":[{"startOffset":7106,"endOffset":7364,"count":0}],"isBlockCoverage":false},{"functionName":"save","ranges":[{"startOffset":7367,"endOffset":12063,"count":0}],"isBlockCoverage":false}]},{"scriptId":"385","url":"file:///home/runner/work/abapGit/abapGit/output/cl_abap_zip.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8235,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":1896,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":281,"endOffset":347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":428,"endOffset":494,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":639,"endOffset":675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":764,"endOffset":830,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":927,"endOffset":984,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1081,"endOffset":1138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1234,"endOffset":1294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1390,"endOffset":1450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1545,"endOffset":1611,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1663,"endOffset":1760,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1806,"endOffset":1872,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_stream","ranges":[{"startOffset":1900,"endOffset":2099,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2102,"endOffset":2215,"count":0}],"isBlockCoverage":false},{"functionName":"append","ranges":[{"startOffset":2218,"endOffset":2432,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":2435,"endOffset":2573,"count":0}],"isBlockCoverage":false},{"functionName":"append_date","ranges":[{"startOffset":2576,"endOffset":2848,"count":0}],"isBlockCoverage":false},{"functionName":"append_time","ranges":[{"startOffset":2851,"endOffset":3123,"count":0}],"isBlockCoverage":false},{"functionName":"append_int2","ranges":[{"startOffset":3126,"endOffset":3478,"count":0}],"isBlockCoverage":false},{"functionName":"append_int4","ranges":[{"startOffset":3481,"endOffset":3967,"count":0}],"isBlockCoverage":false},{"functionName":"append_crc","ranges":[{"startOffset":3970,"endOffset":8026,"count":0}],"isBlockCoverage":false}]},{"scriptId":"386","url":"file:///home/runner/work/abapGit/abapGit/output/cl_apc_tcp_client_manager.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4005,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":190,"endOffset":1829,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":426,"endOffset":548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":590,"endOffset":654,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":696,"endOffset":760,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":803,"endOffset":1618,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1669,"endOffset":1805,"count":0}],"isBlockCoverage":false},{"functionName":"cl_apc_tcp_client_manager","ranges":[{"startOffset":1833,"endOffset":1918,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1921,"endOffset":2034,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2037,"endOffset":2114,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2124,"endOffset":3836,"count":0}],"isBlockCoverage":false}]},{"scriptId":"387","url":"file:///home/runner/work/abapGit/abapGit/output/cl_apc_tcp_client_manager.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5875,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":126,"endOffset":476,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":329,"endOffset":395,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_message","ranges":[{"startOffset":480,"endOffset":636,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":639,"endOffset":752,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_message$get_binary","ranges":[{"startOffset":755,"endOffset":925,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_message$get_text","ranges":[{"startOffset":928,"endOffset":1180,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_message$set_binary","ranges":[{"startOffset":1183,"endOffset":1371,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1469,"endOffset":2647,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1699,"endOffset":1763,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1844,"endOffset":1904,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1988,"endOffset":2124,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2274,"endOffset":2338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2381,"endOffset":2441,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2487,"endOffset":2623,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_client","ranges":[{"startOffset":2651,"endOffset":3014,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3017,"endOffset":3844,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_client$connect","ranges":[{"startOffset":3847,"endOffset":4668,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_client$close","ranges":[{"startOffset":4671,"endOffset":4735,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_client$get_message_manager","ranges":[{"startOffset":4738,"endOffset":4988,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_message_manager$create_message","ranges":[{"startOffset":4991,"endOffset":5309,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_message_manager$send","ranges":[{"startOffset":5312,"endOffset":5700,"count":0}],"isBlockCoverage":false}]},{"scriptId":"388","url":"file:///home/runner/work/abapGit/abapGit/output/cl_apc_wsp_ext_stateless_base.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1965,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":333,"count":1}],"isBlockCoverage":true},{"functionName":"cl_apc_wsp_ext_stateless_base","ranges":[{"startOffset":337,"endOffset":422,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":425,"endOffset":538,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_extension$on_start","ranges":[{"startOffset":541,"endOffset":1059,"count":0}],"isBlockCoverage":false},{"functionName":"if_apc_wsp_extension$on_message","ranges":[{"startOffset":1062,"endOffset":1780,"count":0}],"isBlockCoverage":false}]},{"scriptId":"389","url":"file:///home/runner/work/abapGit/abapGit/output/cl_bcs.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6508,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":91,"endOffset":2545,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":316,"endOffset":412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":515,"endOffset":635,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":680,"endOffset":777,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":819,"endOffset":916,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":964,"endOffset":1061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1109,"endOffset":1206,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1303,"endOffset":1417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1535,"endOffset":1578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1679,"endOffset":1797,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1905,"endOffset":1969,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2058,"endOffset":2155,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2210,"endOffset":2307,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2424,"endOffset":2521,"count":0}],"isBlockCoverage":false},{"functionName":"cl_bcs","ranges":[{"startOffset":2549,"endOffset":2634,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2637,"endOffset":2750,"count":0}],"isBlockCoverage":false},{"functionName":"set_document","ranges":[{"startOffset":2753,"endOffset":3099,"count":0}],"isBlockCoverage":false},{"functionName":"set_status_attributes","ranges":[{"startOffset":3102,"endOffset":3411,"count":0}],"isBlockCoverage":false},{"functionName":"set_send_immediately","ranges":[{"startOffset":3414,"endOffset":3779,"count":0}],"isBlockCoverage":false},{"functionName":"set_message_subject","ranges":[{"startOffset":3782,"endOffset":4081,"count":0}],"isBlockCoverage":false},{"functionName":"set_sender","ranges":[{"startOffset":4084,"endOffset":4416,"count":0}],"isBlockCoverage":false},{"functionName":"send","ranges":[{"startOffset":4419,"endOffset":5012,"count":0}],"isBlockCoverage":false},{"functionName":"create_persistent","ranges":[{"startOffset":5015,"endOffset":5085,"count":0}],"isBlockCoverage":false},{"functionName":"create_persistent","ranges":[{"startOffset":5095,"endOffset":5363,"count":0}],"isBlockCoverage":false},{"functionName":"add_recipient","ranges":[{"startOffset":5366,"endOffset":6415,"count":0}],"isBlockCoverage":false}]},{"scriptId":"390","url":"file:///home/runner/work/abapGit/abapGit/output/cl_bcs_convert.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3154,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":1339,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":338,"endOffset":689,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":734,"endOffset":798,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":901,"endOffset":1203,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1249,"endOffset":1315,"count":0}],"isBlockCoverage":false},{"functionName":"cl_bcs_convert","ranges":[{"startOffset":1343,"endOffset":1428,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1431,"endOffset":1544,"count":0}],"isBlockCoverage":false},{"functionName":"string_to_soli","ranges":[{"startOffset":1547,"endOffset":1629,"count":0}],"isBlockCoverage":false},{"functionName":"string_to_soli","ranges":[{"startOffset":1639,"endOffset":2304,"count":0}],"isBlockCoverage":false},{"functionName":"xstring_to_solix","ranges":[{"startOffset":2307,"endOffset":2393,"count":0}],"isBlockCoverage":false},{"functionName":"xstring_to_solix","ranges":[{"startOffset":2403,"endOffset":3029,"count":0}],"isBlockCoverage":false}]},{"scriptId":"391","url":"file:///home/runner/work/abapGit/abapGit/output/cl_cam_address_bcs.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2100,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":115,"endOffset":869,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":392,"endOffset":512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":564,"endOffset":606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":656,"endOffset":698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":748,"endOffset":845,"count":0}],"isBlockCoverage":false},{"functionName":"cl_cam_address_bcs","ranges":[{"startOffset":873,"endOffset":958,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":961,"endOffset":1074,"count":0}],"isBlockCoverage":false},{"functionName":"create_internet_address","ranges":[{"startOffset":1077,"endOffset":1181,"count":0}],"isBlockCoverage":false},{"functionName":"create_internet_address","ranges":[{"startOffset":1191,"endOffset":1959,"count":0}],"isBlockCoverage":false}]},{"scriptId":"392","url":"file:///home/runner/work/abapGit/abapGit/output/cl_demo_output.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2219,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":784,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":326,"endOffset":369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":409,"endOffset":473,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":613,"endOffset":656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":696,"endOffset":760,"count":0}],"isBlockCoverage":false},{"functionName":"cl_demo_output","ranges":[{"startOffset":788,"endOffset":873,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":876,"endOffset":989,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":992,"endOffset":1056,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":1066,"endOffset":1431,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":1434,"endOffset":1488,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":1498,"endOffset":1646,"count":0}],"isBlockCoverage":false},{"functionName":"display","ranges":[{"startOffset":1649,"endOffset":1717,"count":0}],"isBlockCoverage":false},{"functionName":"display","ranges":[{"startOffset":1727,"endOffset":2094,"count":0}],"isBlockCoverage":false}]},{"scriptId":"393","url":"file:///home/runner/work/abapGit/abapGit/output/cl_document_bcs.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4510,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":1884,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":358,"endOffset":472,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":514,"endOffset":578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":623,"endOffset":665,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":707,"endOffset":750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":794,"endOffset":854,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":964,"endOffset":1028,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1084,"endOffset":1148,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1201,"endOffset":1261,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1315,"endOffset":1358,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1411,"endOffset":1454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1509,"endOffset":1860,"count":0}],"isBlockCoverage":false},{"functionName":"cl_document_bcs","ranges":[{"startOffset":1888,"endOffset":1973,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1976,"endOffset":2089,"count":0}],"isBlockCoverage":false},{"functionName":"create_document","ranges":[{"startOffset":2092,"endOffset":2177,"count":0}],"isBlockCoverage":false},{"functionName":"create_document","ranges":[{"startOffset":2187,"endOffset":2947,"count":0}],"isBlockCoverage":false},{"functionName":"add_attachment","ranges":[{"startOffset":2950,"endOffset":4381,"count":0}],"isBlockCoverage":false}]},{"scriptId":"394","url":"file:///home/runner/work/abapGit/abapGit/output/cl_function_test_environment.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7482,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":199,"endOffset":1745,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":400,"endOffset":1013,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1176,"endOffset":1320,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1372,"endOffset":1721,"count":0}],"isBlockCoverage":false},{"functionName":"cl_function_test_environment","ranges":[{"startOffset":1749,"endOffset":1895,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1898,"endOffset":2011,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2014,"endOffset":2094,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2104,"endOffset":4037,"count":0}],"isBlockCoverage":false},{"functionName":"if_function_test_environment$get_double","ranges":[{"startOffset":4040,"endOffset":5376,"count":0}],"isBlockCoverage":false},{"functionName":"if_function_test_environment$clear_doubles","ranges":[{"startOffset":5379,"endOffset":6203,"count":0}],"isBlockCoverage":false}]},{"scriptId":"395","url":"file:///home/runner/work/abapGit/abapGit/output/cl_function_test_environment.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11829,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":863,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":360,"endOffset":782,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_input_arguments","ranges":[{"startOffset":867,"endOffset":1384,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1387,"endOffset":1500,"count":0}],"isBlockCoverage":false},{"functionName":"if_ftd_input_arguments$get_importing_parameter","ranges":[{"startOffset":1503,"endOffset":2675,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3065,"endOffset":3827,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":3322,"endOffset":3746,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_invocation_result","ranges":[{"startOffset":3831,"endOffset":4350,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4353,"endOffset":4466,"count":0}],"isBlockCoverage":false},{"functionName":"if_ftd_invocation_result$get_output_configuration","ranges":[{"startOffset":4469,"endOffset":4721,"count":0}],"isBlockCoverage":false},{"functionName":"if_ftd_output_configuration$set_exporting_parameter","ranges":[{"startOffset":4724,"endOffset":5602,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5990,"endOffset":6489,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":6244,"endOffset":6287,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6329,"endOffset":6465,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_invoker","ranges":[{"startOffset":6493,"endOffset":6578,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":6581,"endOffset":6694,"count":0}],"isBlockCoverage":false},{"functionName":"invoke","ranges":[{"startOffset":6697,"endOffset":6760,"count":0}],"isBlockCoverage":false},{"functionName":"invoke","ranges":[{"startOffset":6770,"endOffset":9183,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":9284,"endOffset":9934,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":9552,"endOffset":9656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9806,"endOffset":9910,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_double","ranges":[{"startOffset":9938,"endOffset":10132,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":10135,"endOffset":10453,"count":0}],"isBlockCoverage":false},{"functionName":"if_function_testdouble$configure_call","ranges":[{"startOffset":10456,"endOffset":10754,"count":0}],"isBlockCoverage":false},{"functionName":"if_ftd_input_config_setter$ignore_all_parameters","ranges":[{"startOffset":10757,"endOffset":11071,"count":0}],"isBlockCoverage":false},{"functionName":"if_ftd_output_config_setter$then_answer","ranges":[{"startOffset":11074,"endOffset":11604,"count":0}],"isBlockCoverage":false}]},{"scriptId":"396","url":"file:///home/runner/work/abapGit/abapGit/output/cl_gdt_conversion.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9258,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":2381,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":356,"endOffset":445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":489,"endOffset":578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":686,"endOffset":728,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":772,"endOffset":861,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":963,"endOffset":1026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1078,"endOffset":1120,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1164,"endOffset":1227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1335,"endOffset":1424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1468,"endOffset":1510,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1614,"endOffset":1656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1706,"endOffset":1798,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1902,"endOffset":1944,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1988,"endOffset":2077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2182,"endOffset":2271,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2315,"endOffset":2357,"count":0}],"isBlockCoverage":false},{"functionName":"cl_gdt_conversion","ranges":[{"startOffset":2385,"endOffset":2470,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2473,"endOffset":2586,"count":0}],"isBlockCoverage":false},{"functionName":"amount_outbound","ranges":[{"startOffset":2589,"endOffset":2676,"count":0}],"isBlockCoverage":false},{"functionName":"amount_outbound","ranges":[{"startOffset":2686,"endOffset":3724,"count":0}],"isBlockCoverage":false},{"functionName":"language_code_inbound","ranges":[{"startOffset":3727,"endOffset":3826,"count":0}],"isBlockCoverage":false},{"functionName":"language_code_inbound","ranges":[{"startOffset":3836,"endOffset":4260,"count":0}],"isBlockCoverage":false},{"functionName":"unit_code_outbound","ranges":[{"startOffset":4263,"endOffset":4356,"count":0}],"isBlockCoverage":false},{"functionName":"unit_code_outbound","ranges":[{"startOffset":4366,"endOffset":4790,"count":0}],"isBlockCoverage":false},{"functionName":"country_code_outbound","ranges":[{"startOffset":4793,"endOffset":4892,"count":0}],"isBlockCoverage":false},{"functionName":"country_code_outbound","ranges":[{"startOffset":4902,"endOffset":5329,"count":0}],"isBlockCoverage":false},{"functionName":"date_time_inbound","ranges":[{"startOffset":5332,"endOffset":5423,"count":0}],"isBlockCoverage":false},{"functionName":"date_time_inbound","ranges":[{"startOffset":5433,"endOffset":6688,"count":0}],"isBlockCoverage":false},{"functionName":"unit_code_inbound","ranges":[{"startOffset":6691,"endOffset":6782,"count":0}],"isBlockCoverage":false},{"functionName":"unit_code_inbound","ranges":[{"startOffset":6792,"endOffset":7830,"count":0}],"isBlockCoverage":false},{"functionName":"language_code_outbound","ranges":[{"startOffset":7833,"endOffset":7934,"count":0}],"isBlockCoverage":false},{"functionName":"language_code_outbound","ranges":[{"startOffset":7944,"endOffset":9117,"count":1},{"startOffset":8455,"endOffset":8741,"count":0},{"startOffset":8883,"endOffset":9111,"count":0}],"isBlockCoverage":true}]},{"scriptId":"397","url":"file:///home/runner/work/abapGit/abapGit/output/cl_gui_cfw.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2059,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":99,"endOffset":794,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":333,"endOffset":393,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":435,"endOffset":477,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":516,"endOffset":576,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":728,"endOffset":770,"count":0}],"isBlockCoverage":false},{"functionName":"cl_gui_cfw","ranges":[{"startOffset":798,"endOffset":883,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":886,"endOffset":999,"count":0}],"isBlockCoverage":false},{"functionName":"compute_pixel_from_metric","ranges":[{"startOffset":1002,"endOffset":1102,"count":0}],"isBlockCoverage":false},{"functionName":"compute_pixel_from_metric","ranges":[{"startOffset":1112,"endOffset":1489,"count":0}],"isBlockCoverage":false},{"functionName":"flush","ranges":[{"startOffset":1492,"endOffset":1542,"count":0}],"isBlockCoverage":false},{"functionName":"flush","ranges":[{"startOffset":1552,"endOffset":1583,"count":0}],"isBlockCoverage":false},{"functionName":"set_new_ok_code","ranges":[{"startOffset":1586,"endOffset":1666,"count":0}],"isBlockCoverage":false},{"functionName":"set_new_ok_code","ranges":[{"startOffset":1676,"endOffset":1950,"count":0}],"isBlockCoverage":false}]},{"scriptId":"398","url":"file:///home/runner/work/abapGit/abapGit/output/cl_gui_container.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1967,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":936,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":268,"endOffset":384,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":472,"endOffset":588,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":674,"endOffset":721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":808,"endOffset":855,"count":0}],"isBlockCoverage":false},{"functionName":"cl_gui_container","ranges":[{"startOffset":940,"endOffset":1241,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1244,"endOffset":1357,"count":0}],"isBlockCoverage":false}]},{"scriptId":"399","url":"file:///home/runner/work/abapGit/abapGit/output/cl_gui_frontend_services.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":26785,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":10129,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":297,"endOffset":361,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":448,"endOffset":508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":591,"endOffset":651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":739,"endOffset":799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":886,"endOffset":946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1033,"endOffset":1093,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1185,"endOffset":1245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1337,"endOffset":1397,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1489,"endOffset":1549,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1705,"endOffset":1765,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1809,"endOffset":1873,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1917,"endOffset":1981,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2025,"endOffset":2122,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2179,"endOffset":2268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2312,"endOffset":2355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2450,"endOffset":2547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2587,"endOffset":2651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2759,"endOffset":2823,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2869,"endOffset":2912,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2953,"endOffset":3013,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3110,"endOffset":3174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3218,"endOffset":3282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3326,"endOffset":3405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3453,"endOffset":3550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3596,"endOffset":3656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3700,"endOffset":3743,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3850,"endOffset":3914,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3966,"endOffset":4030,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4083,"endOffset":4147,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4197,"endOffset":4294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4341,"endOffset":4405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4458,"endOffset":4522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4568,"endOffset":4882,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4920,"endOffset":4980,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5027,"endOffset":5087,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5186,"endOffset":5246,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5353,"endOffset":5417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5470,"endOffset":5534,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5587,"endOffset":5651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5698,"endOffset":5762,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5806,"endOffset":5870,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5910,"endOffset":5974,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6018,"endOffset":6082,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6129,"endOffset":6189,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6296,"endOffset":6360,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6410,"endOffset":6474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6525,"endOffset":6589,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6683,"endOffset":6747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6794,"endOffset":6858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6903,"endOffset":6967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7020,"endOffset":7084,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7129,"endOffset":7193,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7238,"endOffset":7302,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7349,"endOffset":7413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7458,"endOffset":7522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7633,"endOffset":7697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7797,"endOffset":7894,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7939,"endOffset":8003,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8107,"endOffset":8171,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8209,"endOffset":8269,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8377,"endOffset":8474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8514,"endOffset":8557,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8595,"endOffset":8655,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8770,"endOffset":8834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8941,"endOffset":9255,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9293,"endOffset":9353,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9452,"endOffset":9572,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9614,"endOffset":9674,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9772,"endOffset":9836,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9874,"endOffset":9934,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10041,"endOffset":10105,"count":0}],"isBlockCoverage":false},{"functionName":"cl_gui_frontend_services","ranges":[{"startOffset":10133,"endOffset":10825,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":10828,"endOffset":10941,"count":0}],"isBlockCoverage":false},{"functionName":"directory_exist","ranges":[{"startOffset":10944,"endOffset":11038,"count":0}],"isBlockCoverage":false},{"functionName":"directory_exist","ranges":[{"startOffset":11048,"endOffset":11484,"count":0}],"isBlockCoverage":false},{"functionName":"get_sapgui_workdir","ranges":[{"startOffset":11487,"endOffset":11587,"count":0}],"isBlockCoverage":false},{"functionName":"get_sapgui_workdir","ranges":[{"startOffset":11597,"endOffset":11921,"count":0}],"isBlockCoverage":false},{"functionName":"file_exist","ranges":[{"startOffset":11924,"endOffset":12008,"count":0}],"isBlockCoverage":false},{"functionName":"file_exist","ranges":[{"startOffset":12018,"endOffset":12424,"count":0}],"isBlockCoverage":false},{"functionName":"file_delete","ranges":[{"startOffset":12427,"endOffset":12513,"count":0}],"isBlockCoverage":false},{"functionName":"file_delete","ranges":[{"startOffset":12523,"endOffset":12931,"count":0}],"isBlockCoverage":false},{"functionName":"clipboard_import","ranges":[{"startOffset":12934,"endOffset":13030,"count":0}],"isBlockCoverage":false},{"functionName":"clipboard_import","ranges":[{"startOffset":13040,"endOffset":13511,"count":0}],"isBlockCoverage":false},{"functionName":"directory_list_files","ranges":[{"startOffset":13514,"endOffset":13618,"count":0}],"isBlockCoverage":false},{"functionName":"directory_list_files","ranges":[{"startOffset":13628,"endOffset":14188,"count":0}],"isBlockCoverage":false},{"functionName":"directory_create","ranges":[{"startOffset":14191,"endOffset":14287,"count":0}],"isBlockCoverage":false},{"functionName":"directory_create","ranges":[{"startOffset":14297,"endOffset":14719,"count":0}],"isBlockCoverage":false},{"functionName":"gui_download","ranges":[{"startOffset":14722,"endOffset":14810,"count":0}],"isBlockCoverage":false},{"functionName":"gui_download","ranges":[{"startOffset":14820,"endOffset":15895,"count":0}],"isBlockCoverage":false},{"functionName":"get_file_separator","ranges":[{"startOffset":15898,"endOffset":15998,"count":0}],"isBlockCoverage":false},{"functionName":"get_file_separator","ranges":[{"startOffset":16008,"endOffset":16348,"count":0}],"isBlockCoverage":false},{"functionName":"execute","ranges":[{"startOffset":16351,"endOffset":16429,"count":0}],"isBlockCoverage":false},{"functionName":"execute","ranges":[{"startOffset":16439,"endOffset":17867,"count":0}],"isBlockCoverage":false},{"functionName":"directory_browse","ranges":[{"startOffset":17870,"endOffset":17966,"count":0}],"isBlockCoverage":false},{"functionName":"directory_browse","ranges":[{"startOffset":17976,"endOffset":18624,"count":0}],"isBlockCoverage":false},{"functionName":"gui_upload","ranges":[{"startOffset":18627,"endOffset":18711,"count":0}],"isBlockCoverage":false},{"functionName":"gui_upload","ranges":[{"startOffset":18721,"endOffset":19829,"count":0}],"isBlockCoverage":false},{"functionName":"file_open_dialog","ranges":[{"startOffset":19832,"endOffset":19928,"count":0}],"isBlockCoverage":false},{"functionName":"file_open_dialog","ranges":[{"startOffset":19938,"endOffset":21743,"count":0}],"isBlockCoverage":false},{"functionName":"file_save_dialog","ranges":[{"startOffset":21746,"endOffset":21842,"count":0}],"isBlockCoverage":false},{"functionName":"file_save_dialog","ranges":[{"startOffset":21852,"endOffset":23185,"count":0}],"isBlockCoverage":false},{"functionName":"get_platform","ranges":[{"startOffset":23188,"endOffset":23266,"count":0}],"isBlockCoverage":false},{"functionName":"get_platform","ranges":[{"startOffset":23276,"endOffset":23451,"count":0}],"isBlockCoverage":false},{"functionName":"clipboard_export","ranges":[{"startOffset":23454,"endOffset":23550,"count":0}],"isBlockCoverage":false},{"functionName":"clipboard_export","ranges":[{"startOffset":23560,"endOffset":24125,"count":0}],"isBlockCoverage":false},{"functionName":"get_system_directory","ranges":[{"startOffset":24128,"endOffset":24232,"count":0}],"isBlockCoverage":false},{"functionName":"get_system_directory","ranges":[{"startOffset":24242,"endOffset":24594,"count":0}],"isBlockCoverage":false},{"functionName":"get_gui_version","ranges":[{"startOffset":24597,"endOffset":24691,"count":0}],"isBlockCoverage":false},{"functionName":"get_gui_version","ranges":[{"startOffset":24701,"endOffset":25384,"count":0}],"isBlockCoverage":false}]},{"scriptId":"400","url":"file:///home/runner/work/abapGit/abapGit/output/cl_http_client.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15613,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":2666,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":278,"endOffset":342,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":438,"endOffset":556,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":653,"endOffset":773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":886,"endOffset":946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1061,"endOffset":1121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1221,"endOffset":1281,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1380,"endOffset":1440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1588,"endOffset":1652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1694,"endOffset":1793,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1839,"endOffset":1903,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1952,"endOffset":2016,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2058,"endOffset":2174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2285,"endOffset":2327,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2369,"endOffset":2485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2578,"endOffset":2642,"count":0}],"isBlockCoverage":false},{"functionName":"cl_http_client","ranges":[{"startOffset":2670,"endOffset":3716,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3719,"endOffset":4952,"count":2},{"startOffset":4812,"endOffset":4931,"count":0}],"isBlockCoverage":true},{"functionName":"create_by_url","ranges":[{"startOffset":4955,"endOffset":5035,"count":0}],"isBlockCoverage":false},{"functionName":"create_by_url","ranges":[{"startOffset":5045,"endOffset":5980,"count":2}],"isBlockCoverage":true},{"functionName":"if_http_client$authenticate","ranges":[{"startOffset":5983,"endOffset":7010,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_client$close","ranges":[{"startOffset":7013,"endOffset":7059,"count":2}],"isBlockCoverage":true},{"functionName":"create_by_destination","ranges":[{"startOffset":7062,"endOffset":7158,"count":0}],"isBlockCoverage":false},{"functionName":"create_by_destination","ranges":[{"startOffset":7168,"endOffset":7623,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_client$send","ranges":[{"startOffset":7626,"endOffset":14353,"count":3},{"startOffset":7739,"endOffset":7755,"count":0},{"startOffset":7757,"endOffset":7786,"count":0},{"startOffset":7815,"endOffset":7845,"count":0},{"startOffset":9496,"endOffset":9564,"count":0},{"startOffset":9726,"endOffset":9927,"count":0},{"startOffset":10460,"endOffset":11068,"count":0},{"startOffset":11377,"endOffset":11486,"count":8},{"startOffset":11646,"endOffset":11708,"count":1},{"startOffset":11932,"endOffset":11995,"count":1},{"startOffset":12872,"endOffset":12878,"count":0},{"startOffset":12928,"endOffset":12992,"count":2},{"startOffset":13171,"endOffset":13447,"count":33},{"startOffset":13257,"endOffset":13266,"count":0},{"startOffset":13546,"endOffset":13551,"count":0},{"startOffset":13982,"endOffset":14267,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":11277,"endOffset":11373,"count":11}],"isBlockCoverage":true},{"functionName":"postData","ranges":[{"startOffset":12080,"endOffset":12813,"count":3}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12154,"endOffset":12799,"count":3},{"startOffset":12228,"endOffset":12234,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12309,"endOffset":12663,"count":3}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12388,"endOffset":12420,"count":8}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12498,"endOffset":12641,"count":3}],"isBlockCoverage":true},{"functionName":"if_http_client$receive","ranges":[{"startOffset":14362,"endOffset":14480,"count":3}],"isBlockCoverage":true},{"functionName":"if_http_client$get_last_error","ranges":[{"startOffset":14489,"endOffset":14974,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_client$send_sap_logon_ticket","ranges":[{"startOffset":14983,"endOffset":15174,"count":0}],"isBlockCoverage":false}]},{"scriptId":"401","url":"file:///home/runner/work/abapGit/abapGit/output/cl_http_entity.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":39797,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":3760,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":334,"endOffset":394,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":477,"endOffset":541,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":630,"endOffset":694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":777,"endOffset":841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":922,"endOffset":988,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1072,"endOffset":1454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1542,"endOffset":1924,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2034,"endOffset":2098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2209,"endOffset":2273,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2389,"endOffset":2449,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2562,"endOffset":2626,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2739,"endOffset":2803,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2914,"endOffset":2978,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3090,"endOffset":3154,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3264,"endOffset":3328,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3439,"endOffset":3503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3619,"endOffset":3679,"count":0}],"isBlockCoverage":false},{"functionName":"cl_http_entity","ranges":[{"startOffset":3764,"endOffset":6210,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":6213,"endOffset":6326,"count":4},{"startOffset":6269,"endOffset":6305,"count":0}],"isBlockCoverage":true},{"functionName":"if_http_response$server_cache_expire_rel","ranges":[{"startOffset":6329,"endOffset":7397,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_response$server_cache_expire_default","ranges":[{"startOffset":7400,"endOffset":8330,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_response$server_cache_expire_abs","ranges":[{"startOffset":8333,"endOffset":9577,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_response$server_cache_browser_dependent","ranges":[{"startOffset":9580,"endOffset":10032,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_response$get_raw_message","ranges":[{"startOffset":10035,"endOffset":10284,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_response$copy","ranges":[{"startOffset":10287,"endOffset":10587,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_request$get_user_agent","ranges":[{"startOffset":10590,"endOffset":11080,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_request$get_uri_parameter","ranges":[{"startOffset":11083,"endOffset":11456,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_request$get_raw_message","ranges":[{"startOffset":11459,"endOffset":11707,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_request$get_form_data","ranges":[{"startOffset":11710,"endOffset":12089,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_request$get_authorization","ranges":[{"startOffset":12092,"endOffset":12656,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_request$copy","ranges":[{"startOffset":12659,"endOffset":12954,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_request$set_authorization","ranges":[{"startOffset":12957,"endOffset":13639,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$add_multipart","ranges":[{"startOffset":13642,"endOffset":14302,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_cookie_field","ranges":[{"startOffset":14305,"endOffset":15150,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$set_compression","ranges":[{"startOffset":15153,"endOffset":15197,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$append_cdata","ranges":[{"startOffset":15200,"endOffset":15458,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$append_cdata2","ranges":[{"startOffset":15461,"endOffset":16119,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$add_cookie_field","ranges":[{"startOffset":16122,"endOffset":17096,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$append_data","ranges":[{"startOffset":17099,"endOffset":17627,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$to_xstring","ranges":[{"startOffset":17630,"endOffset":17872,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$delete_cookie_secure","ranges":[{"startOffset":17875,"endOffset":18383,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_cookies","ranges":[{"startOffset":18386,"endOffset":18573,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$delete_form_field","ranges":[{"startOffset":18576,"endOffset":18864,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$delete_form_field_secure","ranges":[{"startOffset":18867,"endOffset":19162,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_cookie","ranges":[{"startOffset":19165,"endOffset":20151,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_data_length","ranges":[{"startOffset":20154,"endOffset":20461,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$from_xstring","ranges":[{"startOffset":20464,"endOffset":20749,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_form_field_cs","ranges":[{"startOffset":20752,"endOffset":21603,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_last_error","ranges":[{"startOffset":21606,"endOffset":21842,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$delete_header_field","ranges":[{"startOffset":21845,"endOffset":22135,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$delete_header_field_secure","ranges":[{"startOffset":22138,"endOffset":22435,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$delete_cookie","ranges":[{"startOffset":22438,"endOffset":22840,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$set_header_fields","ranges":[{"startOffset":22843,"endOffset":23457,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$suppress_content_type","ranges":[{"startOffset":23460,"endOffset":23899,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$set_formfield_encoding","ranges":[{"startOffset":23902,"endOffset":24247,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$set_cookie","ranges":[{"startOffset":24250,"endOffset":25149,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_version","ranges":[{"startOffset":25152,"endOffset":25395,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_serialized_message_length","ranges":[{"startOffset":25398,"endOffset":25866,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_header_field","ranges":[{"startOffset":25869,"endOffset":26803,"count":16},{"startOffset":26734,"endOffset":26781,"count":9}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":26376,"endOffset":26452,"count":65}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":26481,"endOffset":26503,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_header_fields","ranges":[{"startOffset":26806,"endOffset":27331,"count":3}],"isBlockCoverage":true},{"functionName":"if_http_response$get_status","ranges":[{"startOffset":27334,"endOffset":27676,"count":5},{"startOffset":27586,"endOffset":27610,"count":0}],"isBlockCoverage":true},{"functionName":"if_http_entity$get_cdata","ranges":[{"startOffset":27679,"endOffset":27963,"count":7}],"isBlockCoverage":true},{"functionName":"if_http_response$set_status","ranges":[{"startOffset":27966,"endOffset":28314,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$set_cdata","ranges":[{"startOffset":28317,"endOffset":28888,"count":2},{"startOffset":28569,"endOffset":28596,"count":0},{"startOffset":28691,"endOffset":28718,"count":0}],"isBlockCoverage":true},{"functionName":"if_http_entity$get_content_type","ranges":[{"startOffset":28891,"endOffset":29133,"count":5}],"isBlockCoverage":true},{"functionName":"if_http_entity$set_content_type","ranges":[{"startOffset":29136,"endOffset":29463,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_data","ranges":[{"startOffset":29466,"endOffset":29615,"count":1}],"isBlockCoverage":true},{"functionName":"if_http_entity$set_data","ranges":[{"startOffset":29618,"endOffset":29808,"count":1}],"isBlockCoverage":true},{"functionName":"if_http_response$delete_cookie_at_client","ranges":[{"startOffset":29811,"endOffset":30351,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_response$redirect","ranges":[{"startOffset":30354,"endOffset":30943,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$num_multiparts","ranges":[{"startOffset":30946,"endOffset":31111,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_multipart","ranges":[{"startOffset":31114,"endOffset":31536,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_form_fields_cs","ranges":[{"startOffset":31539,"endOffset":32548,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$set_form_fields","ranges":[{"startOffset":32551,"endOffset":33222,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$get_form_fields","ranges":[{"startOffset":33225,"endOffset":34156,"count":3},{"startOffset":33985,"endOffset":34152,"count":0}],"isBlockCoverage":true},{"functionName":"if_http_entity$get_form_field","ranges":[{"startOffset":34159,"endOffset":35092,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$set_header_field","ranges":[{"startOffset":35095,"endOffset":36660,"count":45},{"startOffset":36254,"endOffset":36305,"count":15},{"startOffset":36305,"endOffset":36502,"count":30},{"startOffset":36587,"endOffset":36656,"count":3}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":35896,"endOffset":35972,"count":194}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":36001,"endOffset":36023,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_request$set_method","ranges":[{"startOffset":36663,"endOffset":36866,"count":3}],"isBlockCoverage":true},{"functionName":"if_http_request$get_method","ranges":[{"startOffset":36869,"endOffset":37021,"count":3}],"isBlockCoverage":true},{"functionName":"if_http_request$set_version","ranges":[{"startOffset":37024,"endOffset":37319,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_entity$set_form_field","ranges":[{"startOffset":37322,"endOffset":37955,"count":0}],"isBlockCoverage":false}]},{"scriptId":"402","url":"file:///home/runner/work/abapGit/abapGit/output/cl_http_server.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1741,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":726,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":340,"endOffset":382,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":422,"endOffset":486,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":534,"endOffset":598,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":638,"endOffset":702,"count":0}],"isBlockCoverage":false},{"functionName":"cl_http_server","ranges":[{"startOffset":730,"endOffset":815,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":818,"endOffset":931,"count":0}],"isBlockCoverage":false},{"functionName":"get_location","ranges":[{"startOffset":934,"endOffset":1012,"count":0}],"isBlockCoverage":false},{"functionName":"get_location","ranges":[{"startOffset":1022,"endOffset":1616,"count":2},{"startOffset":1136,"endOffset":1170,"count":0},{"startOffset":1265,"endOffset":1285,"count":0},{"startOffset":1396,"endOffset":1432,"count":0}],"isBlockCoverage":true}]},{"scriptId":"403","url":"file:///home/runner/work/abapGit/abapGit/output/cl_http_utility.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13283,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":2565,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":359,"endOffset":425,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":468,"endOffset":532,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":633,"endOffset":697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":737,"endOffset":803,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":898,"endOffset":1016,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1057,"endOffset":1121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1222,"endOffset":1340,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1379,"endOffset":1443,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1550,"endOffset":1614,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1659,"endOffset":1701,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1798,"endOffset":1862,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1907,"endOffset":1971,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2024,"endOffset":2121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2224,"endOffset":2288,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2333,"endOffset":2397,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2444,"endOffset":2541,"count":0}],"isBlockCoverage":false},{"functionName":"cl_http_utility","ranges":[{"startOffset":2569,"endOffset":3087,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3090,"endOffset":3203,"count":0}],"isBlockCoverage":false},{"functionName":"set_request_uri","ranges":[{"startOffset":3206,"endOffset":3291,"count":0}],"isBlockCoverage":false},{"functionName":"set_request_uri","ranges":[{"startOffset":3301,"endOffset":3752,"count":0}],"isBlockCoverage":false},{"functionName":"escape_html","ranges":[{"startOffset":3755,"endOffset":3832,"count":0}],"isBlockCoverage":false},{"functionName":"escape_html","ranges":[{"startOffset":3842,"endOffset":4541,"count":0}],"isBlockCoverage":false},{"functionName":"escape_javascript","ranges":[{"startOffset":4544,"endOffset":4633,"count":0}],"isBlockCoverage":false},{"functionName":"escape_javascript","ranges":[{"startOffset":4643,"endOffset":5308,"count":0}],"isBlockCoverage":false},{"functionName":"escape_xml_attr_value","ranges":[{"startOffset":5311,"endOffset":5408,"count":0}],"isBlockCoverage":false},{"functionName":"escape_xml_attr_value","ranges":[{"startOffset":5418,"endOffset":5778,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$get_last_error","ranges":[{"startOffset":5781,"endOffset":5886,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$get_last_error","ranges":[{"startOffset":5896,"endOffset":6133,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$string_to_fields","ranges":[{"startOffset":6136,"endOffset":6255,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$string_to_fields","ranges":[{"startOffset":6265,"endOffset":7751,"count":0}],"isBlockCoverage":false},{"functionName":"set_query","ranges":[{"startOffset":7754,"endOffset":7827,"count":0}],"isBlockCoverage":false},{"functionName":"set_query","ranges":[{"startOffset":7837,"endOffset":8301,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$fields_to_string","ranges":[{"startOffset":8304,"endOffset":8423,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$fields_to_string","ranges":[{"startOffset":8433,"endOffset":10248,"count":0}],"isBlockCoverage":false},{"functionName":"encode_x_base64","ranges":[{"startOffset":10251,"endOffset":10336,"count":0}],"isBlockCoverage":false},{"functionName":"encode_x_base64","ranges":[{"startOffset":10346,"endOffset":10681,"count":0}],"isBlockCoverage":false},{"functionName":"decode_x_base64","ranges":[{"startOffset":10684,"endOffset":10769,"count":0}],"isBlockCoverage":false},{"functionName":"decode_x_base64","ranges":[{"startOffset":10779,"endOffset":11143,"count":4}],"isBlockCoverage":true},{"functionName":"if_http_utility$unescape_url","ranges":[{"startOffset":11146,"endOffset":11257,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$unescape_url","ranges":[{"startOffset":11267,"endOffset":11735,"count":27},{"startOffset":11607,"endOffset":11636,"count":0}],"isBlockCoverage":true},{"functionName":"if_http_utility$escape_url","ranges":[{"startOffset":11738,"endOffset":11845,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$escape_url","ranges":[{"startOffset":11855,"endOffset":12180,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$encode_base64","ranges":[{"startOffset":12183,"endOffset":12296,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$encode_base64","ranges":[{"startOffset":12306,"endOffset":12671,"count":2}],"isBlockCoverage":true},{"functionName":"if_http_utility$decode_base64","ranges":[{"startOffset":12674,"endOffset":12787,"count":0}],"isBlockCoverage":false},{"functionName":"if_http_utility$decode_base64","ranges":[{"startOffset":12797,"endOffset":13154,"count":0}],"isBlockCoverage":false}]},{"scriptId":"404","url":"file:///home/runner/work/abapGit/abapGit/output/cl_i18n_languages.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":22587,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":1367,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":350,"endOffset":414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":462,"endOffset":560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":663,"endOffset":761,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":809,"endOffset":898,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1005,"endOffset":1094,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1144,"endOffset":1208,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1254,"endOffset":1343,"count":0}],"isBlockCoverage":false},{"functionName":"cl_i18n_languages","ranges":[{"startOffset":1371,"endOffset":1456,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1459,"endOffset":1572,"count":0}],"isBlockCoverage":false},{"functionName":"sap2_to_sap1","ranges":[{"startOffset":1575,"endOffset":1656,"count":0}],"isBlockCoverage":false},{"functionName":"sap2_to_sap1","ranges":[{"startOffset":1666,"endOffset":8314,"count":4},{"startOffset":2115,"endOffset":2184,"count":0},{"startOffset":2261,"endOffset":2330,"count":0},{"startOffset":2407,"endOffset":2476,"count":0},{"startOffset":2553,"endOffset":2622,"count":0},{"startOffset":2699,"endOffset":2768,"count":0},{"startOffset":2845,"endOffset":2914,"count":0},{"startOffset":2991,"endOffset":3060,"count":0},{"startOffset":3137,"endOffset":3206,"count":0},{"startOffset":3283,"endOffset":3352,"count":0},{"startOffset":3429,"endOffset":3498,"count":0},{"startOffset":3575,"endOffset":3644,"count":0},{"startOffset":3721,"endOffset":3790,"count":0},{"startOffset":3867,"endOffset":3936,"count":0},{"startOffset":4013,"endOffset":4082,"count":1},{"startOffset":4082,"endOffset":8245,"count":3},{"startOffset":4159,"endOffset":4228,"count":1},{"startOffset":4228,"endOffset":8245,"count":2},{"startOffset":4374,"endOffset":8245,"count":0}],"isBlockCoverage":true},{"functionName":"sap1_to_sap2","ranges":[{"startOffset":8317,"endOffset":8398,"count":0}],"isBlockCoverage":false},{"functionName":"sap1_to_sap2","ranges":[{"startOffset":8408,"endOffset":14856,"count":12},{"startOffset":8801,"endOffset":8871,"count":0},{"startOffset":8947,"endOffset":9017,"count":0},{"startOffset":9093,"endOffset":9163,"count":0},{"startOffset":9239,"endOffset":9309,"count":0},{"startOffset":9385,"endOffset":9455,"count":0},{"startOffset":9531,"endOffset":9601,"count":0},{"startOffset":9677,"endOffset":9747,"count":0},{"startOffset":9823,"endOffset":9893,"count":0},{"startOffset":9969,"endOffset":10039,"count":0},{"startOffset":10115,"endOffset":10185,"count":0},{"startOffset":10261,"endOffset":10331,"count":0},{"startOffset":10407,"endOffset":10477,"count":0},{"startOffset":10553,"endOffset":10623,"count":0},{"startOffset":10699,"endOffset":10769,"count":3},{"startOffset":10769,"endOffset":14787,"count":9},{"startOffset":10845,"endOffset":10915,"count":6},{"startOffset":10915,"endOffset":14787,"count":3},{"startOffset":10991,"endOffset":11061,"count":1},{"startOffset":11061,"endOffset":14787,"count":2},{"startOffset":11137,"endOffset":11207,"count":0},{"startOffset":11283,"endOffset":11353,"count":0},{"startOffset":11429,"endOffset":11499,"count":0},{"startOffset":11575,"endOffset":11645,"count":0},{"startOffset":11721,"endOffset":11791,"count":0},{"startOffset":11867,"endOffset":11937,"count":0},{"startOffset":12013,"endOffset":12083,"count":0},{"startOffset":12159,"endOffset":12229,"count":0},{"startOffset":12305,"endOffset":12375,"count":0},{"startOffset":12451,"endOffset":12521,"count":0},{"startOffset":12597,"endOffset":12667,"count":0},{"startOffset":12743,"endOffset":12813,"count":0},{"startOffset":12959,"endOffset":14787,"count":0}],"isBlockCoverage":true},{"functionName":"sap2_to_iso639_1","ranges":[{"startOffset":14859,"endOffset":14948,"count":0}],"isBlockCoverage":false},{"functionName":"sap2_to_iso639_1","ranges":[{"startOffset":14958,"endOffset":22450,"count":0}],"isBlockCoverage":false}]},{"scriptId":"405","url":"file:///home/runner/work/abapGit/abapGit/output/cl_ixml.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3770,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":136,"endOffset":483,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":357,"endOffset":459,"count":0}],"isBlockCoverage":false},{"functionName":"cl_ixml","ranges":[{"startOffset":487,"endOffset":572,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":575,"endOffset":688,"count":7},{"startOffset":631,"endOffset":667,"count":0}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":691,"endOffset":740,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":750,"endOffset":955,"count":7}],"isBlockCoverage":true},{"functionName":"if_ixml$create_encoding","ranges":[{"startOffset":958,"endOffset":1520,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml$create_document","ranges":[{"startOffset":1523,"endOffset":1781,"count":7}],"isBlockCoverage":true},{"functionName":"if_ixml$create_stream_factory","ranges":[{"startOffset":1784,"endOffset":2075,"count":7}],"isBlockCoverage":true},{"functionName":"if_ixml$create_renderer","ranges":[{"startOffset":2078,"endOffset":2768,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml$create_parser","ranges":[{"startOffset":2771,"endOffset":3673,"count":7}],"isBlockCoverage":true}]},{"scriptId":"406","url":"file:///home/runner/work/abapGit/abapGit/output/cl_ixml.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":83186,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":815,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":348,"endOffset":412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":456,"endOffset":520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":619,"endOffset":683,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":727,"endOffset":791,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_escape","ranges":[{"startOffset":819,"endOffset":904,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":907,"endOffset":1020,"count":0}],"isBlockCoverage":false},{"functionName":"unescape_value","ranges":[{"startOffset":1023,"endOffset":1101,"count":0}],"isBlockCoverage":false},{"functionName":"unescape_value","ranges":[{"startOffset":1111,"endOffset":2142,"count":40}],"isBlockCoverage":true},{"functionName":"escape_value","ranges":[{"startOffset":2145,"endOffset":2219,"count":0}],"isBlockCoverage":false},{"functionName":"escape_value","ranges":[{"startOffset":2229,"endOffset":3258,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3343,"endOffset":4495,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":3540,"endOffset":3600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3681,"endOffset":4001,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4151,"endOffset":4471,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_node_iterator","ranges":[{"startOffset":4499,"endOffset":4977,"count":569}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4980,"endOffset":5503,"count":569}],"isBlockCoverage":true},{"functionName":"if_ixml_node_iterator$reset","ranges":[{"startOffset":5506,"endOffset":5605,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node_iterator$get_next","ranges":[{"startOffset":5608,"endOffset":5964,"count":1133}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6392,"endOffset":6749,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":6604,"endOffset":6668,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_encoding","ranges":[{"startOffset":6753,"endOffset":6955,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":6958,"endOffset":7071,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7321,"endOffset":7892,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7517,"endOffset":7811,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_named_node_map","ranges":[{"startOffset":7896,"endOffset":8280,"count":141}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":8283,"endOffset":8396,"count":141},{"startOffset":8339,"endOffset":8375,"count":0}],"isBlockCoverage":true},{"functionName":"if_ixml_named_node_map$create_iterator","ranges":[{"startOffset":8399,"endOffset":8725,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_named_node_map$get_length","ranges":[{"startOffset":8728,"endOffset":8905,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_named_node_map$get_named_item_ns","ranges":[{"startOffset":8908,"endOffset":9573,"count":16},{"startOffset":9380,"endOffset":9553,"count":25},{"startOffset":9492,"endOffset":9547,"count":12},{"startOffset":9553,"endOffset":9572,"count":4}],"isBlockCoverage":true},{"functionName":"if_ixml_named_node_map$get_named_item","ranges":[{"startOffset":9576,"endOffset":9997,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_named_node_map$remove_named_item","ranges":[{"startOffset":10000,"endOffset":10296,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_named_node_map$set_named_item_ns","ranges":[{"startOffset":10299,"endOffset":10590,"count":24}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10687,"endOffset":11652,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":10873,"endOffset":11167,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11312,"endOffset":11424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11516,"endOffset":11628,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_node_list","ranges":[{"startOffset":11656,"endOffset":12040,"count":141}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":12043,"endOffset":12156,"count":141},{"startOffset":12099,"endOffset":12135,"count":0}],"isBlockCoverage":true},{"functionName":"append","ranges":[{"startOffset":12159,"endOffset":12500,"count":115}],"isBlockCoverage":true},{"functionName":"remove","ranges":[{"startOffset":12503,"endOffset":13156,"count":5}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":12756,"endOffset":12811,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":12840,"endOffset":12868,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node_list$get_length","ranges":[{"startOffset":13159,"endOffset":13340,"count":47}],"isBlockCoverage":true},{"functionName":"if_ixml_node_list$create_iterator","ranges":[{"startOffset":13343,"endOffset":13652,"count":569}],"isBlockCoverage":true},{"functionName":"if_ixml_node_list$get_item","ranges":[{"startOffset":13655,"endOffset":14023,"count":51}],"isBlockCoverage":true},{"functionName":"if_ixml_node_list$create_rev_iterator_filtered","ranges":[{"startOffset":14026,"endOffset":14458,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":14540,"endOffset":16332,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":14734,"endOffset":14798,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14884,"endOffset":14948,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15030,"endOffset":15094,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15179,"endOffset":15309,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15392,"endOffset":15504,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15591,"endOffset":15723,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15825,"endOffset":15885,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15984,"endOffset":16044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16196,"endOffset":16308,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_node","ranges":[{"startOffset":16336,"endOffset":17227,"count":141}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":17230,"endOffset":17845,"count":141},{"startOffset":17390,"endOffset":17408,"count":110},{"startOffset":17410,"endOffset":17443,"count":110},{"startOffset":17740,"endOffset":17824,"count":110}],"isBlockCoverage":true},{"functionName":"if_ixml_node$get_height","ranges":[{"startOffset":17848,"endOffset":18082,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_attribute_node_ns","ranges":[{"startOffset":18085,"endOffset":18630,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_next","ranges":[{"startOffset":18633,"endOffset":18917,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_namespace_prefix","ranges":[{"startOffset":18920,"endOffset":19097,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_namespace_uri","ranges":[{"startOffset":19100,"endOffset":19345,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_attributes","ranges":[{"startOffset":19348,"endOffset":19661,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_next","ranges":[{"startOffset":19664,"endOffset":19957,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_name","ranges":[{"startOffset":19960,"endOffset":20108,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$append_child","ranges":[{"startOffset":20111,"endOffset":20784,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$clone","ranges":[{"startOffset":20787,"endOffset":21069,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$create_filter_node_type","ranges":[{"startOffset":21072,"endOffset":21456,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$remove_attribute_ns","ranges":[{"startOffset":21459,"endOffset":21746,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$create_iterator","ranges":[{"startOffset":21749,"endOffset":22059,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$find_from_name_ns","ranges":[{"startOffset":22062,"endOffset":24531,"count":35},{"startOffset":22577,"endOffset":22598,"count":0},{"startOffset":23646,"endOffset":24511,"count":558},{"startOffset":23942,"endOffset":24452,"count":1084},{"startOffset":24122,"endOffset":24150,"count":540},{"startOffset":24150,"endOffset":24233,"count":544},{"startOffset":24233,"endOffset":24375,"count":18},{"startOffset":24375,"endOffset":24452,"count":526},{"startOffset":24452,"endOffset":24511,"count":540},{"startOffset":24511,"endOffset":24530,"count":17}],"isBlockCoverage":true},{"functionName":"if_ixml_element$find_from_name","ranges":[{"startOffset":24534,"endOffset":25210,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_attribute_node","ranges":[{"startOffset":25213,"endOffset":25641,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_attribute_ns","ranges":[{"startOffset":25644,"endOffset":26373,"count":10},{"startOffset":25966,"endOffset":25987,"count":0},{"startOffset":26283,"endOffset":26353,"count":6}],"isBlockCoverage":true},{"functionName":"if_ixml_element$get_attribute","ranges":[{"startOffset":26376,"endOffset":26879,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_children","ranges":[{"startOffset":26882,"endOffset":27117,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_elements_by_tag_name","ranges":[{"startOffset":27120,"endOffset":27566,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_elements_by_tag_name_ns","ranges":[{"startOffset":27569,"endOffset":28132,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$get_first_child","ranges":[{"startOffset":28135,"endOffset":28366,"count":5}],"isBlockCoverage":true},{"functionName":"if_ixml_element$get_value","ranges":[{"startOffset":28369,"endOffset":28540,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$remove_attribute","ranges":[{"startOffset":28543,"endOffset":28831,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$remove_node","ranges":[{"startOffset":28834,"endOffset":28994,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$render","ranges":[{"startOffset":28997,"endOffset":32975,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$set_attribute_node_ns","ranges":[{"startOffset":32978,"endOffset":33247,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$set_attribute","ranges":[{"startOffset":33250,"endOffset":33831,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$set_attribute_ns","ranges":[{"startOffset":33834,"endOffset":34745,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_element$set_value","ranges":[{"startOffset":34748,"endOffset":35043,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$set_namespace_prefix","ranges":[{"startOffset":35046,"endOffset":35244,"count":12}],"isBlockCoverage":true},{"functionName":"if_ixml_node$append_child","ranges":[{"startOffset":35247,"endOffset":35758,"count":115}],"isBlockCoverage":true},{"functionName":"if_ixml_node$get_attributes","ranges":[{"startOffset":35761,"endOffset":35983,"count":40}],"isBlockCoverage":true},{"functionName":"if_ixml_node$get_first_child","ranges":[{"startOffset":35986,"endOffset":36273,"count":51}],"isBlockCoverage":true},{"functionName":"if_ixml_node$get_children","ranges":[{"startOffset":36276,"endOffset":36484,"count":569}],"isBlockCoverage":true},{"functionName":"if_ixml_node$query_interface","ranges":[{"startOffset":36487,"endOffset":36903,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$remove_node","ranges":[{"startOffset":36906,"endOffset":37063,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_parent","ranges":[{"startOffset":37066,"endOffset":37260,"count":70}],"isBlockCoverage":true},{"functionName":"if_ixml_node$replace_child","ranges":[{"startOffset":37263,"endOffset":37703,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_name","ranges":[{"startOffset":37706,"endOffset":37848,"count":599}],"isBlockCoverage":true},{"functionName":"if_ixml_node$get_depth","ranges":[{"startOffset":37851,"endOffset":39179,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$is_leaf","ranges":[{"startOffset":39182,"endOffset":39475,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_namespace","ranges":[{"startOffset":39478,"endOffset":39630,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_value","ranges":[{"startOffset":39633,"endOffset":40797,"count":47},{"startOffset":40205,"endOffset":40777,"count":0}],"isBlockCoverage":true},{"functionName":"if_ixml_node$get_type","ranges":[{"startOffset":40800,"endOffset":41034,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$set_name","ranges":[{"startOffset":41037,"endOffset":41223,"count":141}],"isBlockCoverage":true},{"functionName":"if_ixml_node$remove_child","ranges":[{"startOffset":41226,"endOffset":41499,"count":5}],"isBlockCoverage":true},{"functionName":"if_ixml_node$set_value","ranges":[{"startOffset":41502,"endOffset":41695,"count":64}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":42029,"endOffset":42986,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":42228,"endOffset":42348,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":42435,"endOffset":42532,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":42634,"endOffset":42694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":42793,"endOffset":42853,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_document","ranges":[{"startOffset":42990,"endOffset":43500,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":43503,"endOffset":43747,"count":7}],"isBlockCoverage":true},{"functionName":"if_ixml_node$get_height","ranges":[{"startOffset":43750,"endOffset":43984,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_namespace_prefix","ranges":[{"startOffset":43987,"endOffset":44245,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_next","ranges":[{"startOffset":44248,"endOffset":44532,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_namespace_uri","ranges":[{"startOffset":44535,"endOffset":44780,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$append_child","ranges":[{"startOffset":44783,"endOffset":45311,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$set_namespace_prefix","ranges":[{"startOffset":45314,"endOffset":45556,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_attributes","ranges":[{"startOffset":45559,"endOffset":45819,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_first_child","ranges":[{"startOffset":45822,"endOffset":46067,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_children","ranges":[{"startOffset":46070,"endOffset":46316,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$query_interface","ranges":[{"startOffset":46319,"endOffset":46687,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$remove_node","ranges":[{"startOffset":46690,"endOffset":46785,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_parent","ranges":[{"startOffset":46788,"endOffset":47020,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$replace_child","ranges":[{"startOffset":47023,"endOffset":47447,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_name","ranges":[{"startOffset":47450,"endOffset":47630,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_depth","ranges":[{"startOffset":47633,"endOffset":47811,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$is_leaf","ranges":[{"startOffset":47814,"endOffset":48025,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_namespace","ranges":[{"startOffset":48028,"endOffset":48218,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_value","ranges":[{"startOffset":48221,"endOffset":48403,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$get_type","ranges":[{"startOffset":48406,"endOffset":48586,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$set_name","ranges":[{"startOffset":48589,"endOffset":48813,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$remove_child","ranges":[{"startOffset":48816,"endOffset":49102,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_node$set_value","ranges":[{"startOffset":49105,"endOffset":49337,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$set_encoding","ranges":[{"startOffset":49340,"endOffset":49560,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$set_standalone","ranges":[{"startOffset":49563,"endOffset":49828,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$get_standalone","ranges":[{"startOffset":49831,"endOffset":50025,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$set_namespace_prefix","ranges":[{"startOffset":50028,"endOffset":50222,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$append_child","ranges":[{"startOffset":50225,"endOffset":50525,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$get_first_child","ranges":[{"startOffset":50528,"endOffset":50780,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_attribute_ns","ranges":[{"startOffset":50783,"endOffset":51347,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_element_ns","ranges":[{"startOffset":51350,"endOffset":52009,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_element","ranges":[{"startOffset":52012,"endOffset":52468,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_iterator_filtered","ranges":[{"startOffset":52471,"endOffset":52894,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_filter_and","ranges":[{"startOffset":52897,"endOffset":53423,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_iterator","ranges":[{"startOffset":53426,"endOffset":53739,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_filter_node_type","ranges":[{"startOffset":53742,"endOffset":54176,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_simple_element_ns","ranges":[{"startOffset":54179,"endOffset":55123,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_filter_attribute","ranges":[{"startOffset":55126,"endOffset":55564,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$create_simple_element","ranges":[{"startOffset":55567,"endOffset":56389,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$find_from_name","ranges":[{"startOffset":56392,"endOffset":56991,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$find_from_name_ns","ranges":[{"startOffset":56994,"endOffset":57694,"count":23},{"startOffset":57258,"endOffset":57283,"count":11},{"startOffset":57376,"endOffset":57397,"count":0}],"isBlockCoverage":true},{"functionName":"if_ixml_document$find_from_path","ranges":[{"startOffset":57697,"endOffset":58118,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$get_elements_by_tag_name_ns","ranges":[{"startOffset":58121,"endOffset":58823,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$get_elements_by_tag_name","ranges":[{"startOffset":58826,"endOffset":59529,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_document$get_root","ranges":[{"startOffset":59532,"endOffset":59729,"count":29}],"isBlockCoverage":true},{"functionName":"if_ixml_document$get_root_element","ranges":[{"startOffset":59732,"endOffset":60015,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":60373,"endOffset":61339,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":60560,"endOffset":60678,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":60763,"endOffset":60883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":61033,"endOffset":61151,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":61195,"endOffset":61315,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_renderer","ranges":[{"startOffset":61343,"endOffset":61683,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":61686,"endOffset":62178,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_renderer$render","ranges":[{"startOffset":62181,"endOffset":63576,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_renderer$set_normalizing","ranges":[{"startOffset":63579,"endOffset":63801,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":63884,"endOffset":64390,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":64068,"endOffset":64132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":64212,"endOffset":64309,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_ostream","ranges":[{"startOffset":64394,"endOffset":64651,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":64654,"endOffset":64767,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_ostream$write_string","ranges":[{"startOffset":64770,"endOffset":65596,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_ostream$get_num_written_raw","ranges":[{"startOffset":65599,"endOffset":65845,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":65926,"endOffset":66408,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":66107,"endOffset":66171,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":66320,"endOffset":66384,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_istream","ranges":[{"startOffset":66412,"endOffset":66565,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":66568,"endOffset":66771,"count":7}],"isBlockCoverage":true},{"functionName":"if_ixml_istream$close","ranges":[{"startOffset":66774,"endOffset":66821,"count":7}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":66909,"endOffset":67109,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_stream_factory","ranges":[{"startOffset":67113,"endOffset":67198,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":67201,"endOffset":67314,"count":7},{"startOffset":67257,"endOffset":67293,"count":0}],"isBlockCoverage":true},{"functionName":"if_ixml_stream_factory$create_ostream_itable","ranges":[{"startOffset":67317,"endOffset":67810,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_stream_factory$create_ostream_cstring","ranges":[{"startOffset":67813,"endOffset":68273,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_stream_factory$create_ostream_xstring","ranges":[{"startOffset":68276,"endOffset":68956,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_stream_factory$create_istream_xstring","ranges":[{"startOffset":68959,"endOffset":69398,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_stream_factory$create_istream_string","ranges":[{"startOffset":69401,"endOffset":69818,"count":7}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69912,"endOffset":72353,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":70095,"endOffset":70213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":70298,"endOffset":70418,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":70504,"endOffset":70568,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":70655,"endOffset":70719,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":70824,"endOffset":70884,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":71039,"endOffset":71151,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":71193,"endOffset":71257,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":71301,"endOffset":71950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":72047,"endOffset":72165,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":72209,"endOffset":72329,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_parser","ranges":[{"startOffset":72357,"endOffset":72904,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":72907,"endOffset":73399,"count":7}],"isBlockCoverage":true},{"functionName":"if_ixml_parser$set_validating","ranges":[{"startOffset":73402,"endOffset":73798,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_parser$parse","ranges":[{"startOffset":73801,"endOffset":78736,"count":7},{"startOffset":75835,"endOffset":78663,"count":187},{"startOffset":76006,"endOffset":76311,"count":7},{"startOffset":76311,"endOffset":78543,"count":180},{"startOffset":76385,"endOffset":77992,"count":140},{"startOffset":77096,"endOffset":77845,"count":70},{"startOffset":77406,"endOffset":77636,"count":12},{"startOffset":77992,"endOffset":78543,"count":40}],"isBlockCoverage":true},{"functionName":"parse_attributes","ranges":[{"startOffset":78739,"endOffset":81663,"count":140},{"startOffset":80566,"endOffset":80587,"count":0},{"startOffset":80755,"endOffset":81608,"count":164},{"startOffset":81052,"endOffset":81132,"count":140},{"startOffset":81132,"endOffset":81608,"count":24},{"startOffset":81608,"endOffset":81662,"count":0}],"isBlockCoverage":true},{"functionName":"if_ixml_parser$set_normalizing","ranges":[{"startOffset":81666,"endOffset":81886,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_parser$num_errors","ranges":[{"startOffset":81889,"endOffset":82029,"count":0}],"isBlockCoverage":false},{"functionName":"if_ixml_parser$add_strip_space_element","ranges":[{"startOffset":82032,"endOffset":82096,"count":7}],"isBlockCoverage":true},{"functionName":"if_ixml_parser$get_error","ranges":[{"startOffset":82099,"endOffset":82424,"count":0}],"isBlockCoverage":false}]},{"scriptId":"407","url":"file:///home/runner/work/abapGit/abapGit/output/cl_message_helper.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8667,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":1911,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":275,"endOffset":339,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":498,"endOffset":606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":648,"endOffset":712,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":817,"endOffset":859,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":964,"endOffset":1028,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1068,"endOffset":1176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1272,"endOffset":1362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1405,"endOffset":1747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1789,"endOffset":1887,"count":0}],"isBlockCoverage":false},{"functionName":"cl_message_helper","ranges":[{"startOffset":1915,"endOffset":2054,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2057,"endOffset":2170,"count":0}],"isBlockCoverage":false},{"functionName":"get_text_for_message","ranges":[{"startOffset":2173,"endOffset":2270,"count":0}],"isBlockCoverage":false},{"functionName":"get_text_for_message","ranges":[{"startOffset":2280,"endOffset":4439,"count":52},{"startOffset":3079,"endOffset":3127,"count":11},{"startOffset":3127,"endOffset":3385,"count":41},{"startOffset":3385,"endOffset":3499,"count":39},{"startOffset":3500,"endOffset":3504,"count":2},{"startOffset":3631,"endOffset":3745,"count":39},{"startOffset":3746,"endOffset":3750,"count":2},{"startOffset":3877,"endOffset":3991,"count":39},{"startOffset":3992,"endOffset":3996,"count":2},{"startOffset":4123,"endOffset":4237,"count":39},{"startOffset":4238,"endOffset":4242,"count":2},{"startOffset":4416,"endOffset":4438,"count":41}],"isBlockCoverage":true},{"functionName":"set_msg_vars_for_if_msg","ranges":[{"startOffset":4442,"endOffset":4545,"count":0}],"isBlockCoverage":false},{"functionName":"set_msg_vars_for_if_msg","ranges":[{"startOffset":4555,"endOffset":5636,"count":0}],"isBlockCoverage":false},{"functionName":"set_msg_vars_for_clike","ranges":[{"startOffset":5639,"endOffset":5740,"count":0}],"isBlockCoverage":false},{"functionName":"set_msg_vars_for_clike","ranges":[{"startOffset":5750,"endOffset":6996,"count":80},{"startOffset":6257,"endOffset":6322,"count":64},{"startOffset":6322,"endOffset":6387,"count":16},{"startOffset":6529,"endOffset":6594,"count":77},{"startOffset":6594,"endOffset":6665,"count":3},{"startOffset":6872,"endOffset":6943,"count":0}],"isBlockCoverage":true},{"functionName":"check_msg_kind","ranges":[{"startOffset":6999,"endOffset":7084,"count":0}],"isBlockCoverage":false},{"functionName":"check_msg_kind","ranges":[{"startOffset":7094,"endOffset":8385,"count":0}],"isBlockCoverage":false}]},{"scriptId":"408","url":"file:///home/runner/work/abapGit/abapGit/output/cl_mime_repository_api.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16370,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":301,"count":1}],"isBlockCoverage":true},{"functionName":"cl_mime_repository_api","ranges":[{"startOffset":305,"endOffset":433,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":436,"endOffset":549,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$get_api","ranges":[{"startOffset":552,"endOffset":648,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$get_api","ranges":[{"startOffset":658,"endOffset":1148,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$get","ranges":[{"startOffset":1151,"endOffset":2995,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$create_folder","ranges":[{"startOffset":2998,"endOffset":6597,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$put","ranges":[{"startOffset":6600,"endOffset":9618,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$delete","ranges":[{"startOffset":9621,"endOffset":10900,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$file_list","ranges":[{"startOffset":10903,"endOffset":12111,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$properties","ranges":[{"startOffset":12114,"endOffset":15096,"count":0}],"isBlockCoverage":false},{"functionName":"if_mr_api$get_io_for_url","ranges":[{"startOffset":15099,"endOffset":16213,"count":0}],"isBlockCoverage":false}]},{"scriptId":"409","url":"file:///home/runner/work/abapGit/abapGit/output/cl_numberrange_runtime.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3536,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":770,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":362,"endOffset":462,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":504,"endOffset":603,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":645,"endOffset":746,"count":0}],"isBlockCoverage":false},{"functionName":"cl_numberrange_runtime","ranges":[{"startOffset":774,"endOffset":859,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":862,"endOffset":975,"count":0}],"isBlockCoverage":false},{"functionName":"number_get","ranges":[{"startOffset":978,"endOffset":1060,"count":0}],"isBlockCoverage":false},{"functionName":"number_get","ranges":[{"startOffset":1070,"endOffset":3004,"count":0}],"isBlockCoverage":false}]},{"scriptId":"410","url":"file:///home/runner/work/abapGit/abapGit/output/cl_oo_factory.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3031,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":105,"endOffset":941,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":278,"endOffset":342,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":495,"endOffset":605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":708,"endOffset":830,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":875,"endOffset":917,"count":0}],"isBlockCoverage":false},{"functionName":"cl_oo_factory","ranges":[{"startOffset":945,"endOffset":1099,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1102,"endOffset":1215,"count":0}],"isBlockCoverage":false},{"functionName":"create_instance","ranges":[{"startOffset":1218,"endOffset":1291,"count":0}],"isBlockCoverage":false},{"functionName":"create_instance","ranges":[{"startOffset":1301,"endOffset":1538,"count":0}],"isBlockCoverage":false},{"functionName":"create_clif_source","ranges":[{"startOffset":1541,"endOffset":1923,"count":0}],"isBlockCoverage":false},{"functionName":"if_oo_clif_source$get_source","ranges":[{"startOffset":1926,"endOffset":2910,"count":0}],"isBlockCoverage":false}]},{"scriptId":"411","url":"file:///home/runner/work/abapGit/abapGit/output/cl_osql_test_environment.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7974,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":1679,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":320,"endOffset":621,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":701,"endOffset":817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":900,"endOffset":964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1165,"endOffset":1301,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1354,"endOffset":1655,"count":0}],"isBlockCoverage":false},{"functionName":"cl_osql_test_environment","ranges":[{"startOffset":1683,"endOffset":2253,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2256,"endOffset":2369,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2372,"endOffset":2448,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2458,"endOffset":3597,"count":0}],"isBlockCoverage":false},{"functionName":"initialize","ranges":[{"startOffset":3600,"endOffset":5358,"count":0}],"isBlockCoverage":false},{"functionName":"if_osql_test_environment$clear_doubles","ranges":[{"startOffset":5361,"endOffset":5874,"count":0}],"isBlockCoverage":false},{"functionName":"if_osql_test_environment$destroy","ranges":[{"startOffset":5877,"endOffset":6124,"count":0}],"isBlockCoverage":false},{"functionName":"if_osql_test_environment$insert_test_data","ranges":[{"startOffset":6127,"endOffset":7672,"count":0}],"isBlockCoverage":false}]},{"scriptId":"412","url":"file:///home/runner/work/abapGit/abapGit/output/cl_package_factory.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4327,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":115,"endOffset":1548,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":355,"endOffset":451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":501,"endOffset":598,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":643,"endOffset":751,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":870,"endOffset":967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1020,"endOffset":1117,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1181,"endOffset":1278,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1323,"endOffset":1431,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1481,"endOffset":1524,"count":0}],"isBlockCoverage":false},{"functionName":"cl_package_factory","ranges":[{"startOffset":1552,"endOffset":1637,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1640,"endOffset":1753,"count":0}],"isBlockCoverage":false},{"functionName":"load_package","ranges":[{"startOffset":1756,"endOffset":1838,"count":0}],"isBlockCoverage":false},{"functionName":"load_package","ranges":[{"startOffset":1848,"endOffset":2546,"count":6},{"startOffset":2213,"endOffset":2256,"count":0},{"startOffset":2405,"endOffset":2435,"count":0},{"startOffset":2502,"endOffset":2545,"count":0}],"isBlockCoverage":true},{"functionName":"create_new_package","ranges":[{"startOffset":2549,"endOffset":2643,"count":0}],"isBlockCoverage":false},{"functionName":"create_new_package","ranges":[{"startOffset":2653,"endOffset":4186,"count":0}],"isBlockCoverage":false}]},{"scriptId":"413","url":"file:///home/runner/work/abapGit/abapGit/output/cl_progress_indicator.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2230,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":939,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":361,"endOffset":404,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":451,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":554,"endOffset":614,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":670,"endOffset":767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":818,"endOffset":915,"count":0}],"isBlockCoverage":false},{"functionName":"cl_progress_indicator","ranges":[{"startOffset":943,"endOffset":1028,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1031,"endOffset":1144,"count":0}],"isBlockCoverage":false},{"functionName":"progress_indicate","ranges":[{"startOffset":1147,"endOffset":1242,"count":0}],"isBlockCoverage":false},{"functionName":"progress_indicate","ranges":[{"startOffset":1252,"endOffset":2077,"count":0}],"isBlockCoverage":false}]},{"scriptId":"414","url":"file:///home/runner/work/abapGit/abapGit/output/cl_salv_aggregations.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":638,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":284,"count":1}],"isBlockCoverage":true},{"functionName":"cl_salv_aggregations","ranges":[{"startOffset":288,"endOffset":373,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":376,"endOffset":489,"count":0}],"isBlockCoverage":false}]},{"scriptId":"415","url":"file:///home/runner/work/abapGit/abapGit/output/cl_salv_column.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2504,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":942,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":335,"endOffset":432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":530,"endOffset":594,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":693,"endOffset":757,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":854,"endOffset":918,"count":0}],"isBlockCoverage":false},{"functionName":"cl_salv_column","ranges":[{"startOffset":946,"endOffset":1031,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1034,"endOffset":1147,"count":0}],"isBlockCoverage":false},{"functionName":"set_technical","ranges":[{"startOffset":1150,"endOffset":1548,"count":0}],"isBlockCoverage":false},{"functionName":"set_short_text","ranges":[{"startOffset":1551,"endOffset":1825,"count":0}],"isBlockCoverage":false},{"functionName":"set_medium_text","ranges":[{"startOffset":1828,"endOffset":2103,"count":0}],"isBlockCoverage":false},{"functionName":"set_long_text","ranges":[{"startOffset":2106,"endOffset":2379,"count":0}],"isBlockCoverage":false}]},{"scriptId":"416","url":"file:///home/runner/work/abapGit/abapGit/output/cl_salv_columns_table.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3243,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":1275,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":363,"endOffset":427,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":523,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":720,"endOffset":784,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":878,"endOffset":990,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1036,"endOffset":1100,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1187,"endOffset":1251,"count":0}],"isBlockCoverage":false},{"functionName":"cl_salv_columns_table","ranges":[{"startOffset":1279,"endOffset":1364,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1367,"endOffset":1480,"count":0}],"isBlockCoverage":false},{"functionName":"get_column","ranges":[{"startOffset":1483,"endOffset":1905,"count":0}],"isBlockCoverage":false},{"functionName":"set_cell_type_column","ranges":[{"startOffset":1908,"endOffset":2188,"count":0}],"isBlockCoverage":false},{"functionName":"set_optimize","ranges":[{"startOffset":2191,"endOffset":2588,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":2591,"endOffset":2811,"count":0}],"isBlockCoverage":false},{"functionName":"set_color_column","ranges":[{"startOffset":2814,"endOffset":3090,"count":0}],"isBlockCoverage":false}]},{"scriptId":"417","url":"file:///home/runner/work/abapGit/abapGit/output/cl_salv_events_table.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":638,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":284,"count":1}],"isBlockCoverage":true},{"functionName":"cl_salv_events_table","ranges":[{"startOffset":288,"endOffset":373,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":376,"endOffset":489,"count":0}],"isBlockCoverage":false}]},{"scriptId":"418","url":"file:///home/runner/work/abapGit/abapGit/output/cl_salv_filters.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":603,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":269,"count":1}],"isBlockCoverage":true},{"functionName":"cl_salv_filters","ranges":[{"startOffset":273,"endOffset":358,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":361,"endOffset":474,"count":0}],"isBlockCoverage":false}]},{"scriptId":"419","url":"file:///home/runner/work/abapGit/abapGit/output/cl_salv_functions_list.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1522,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":632,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":352,"endOffset":449,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":544,"endOffset":608,"count":0}],"isBlockCoverage":false},{"functionName":"cl_salv_functions_list","ranges":[{"startOffset":636,"endOffset":721,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":724,"endOffset":837,"count":0}],"isBlockCoverage":false},{"functionName":"set_all","ranges":[{"startOffset":840,"endOffset":1136,"count":0}],"isBlockCoverage":false},{"functionName":"get_functions","ranges":[{"startOffset":1139,"endOffset":1365,"count":0}],"isBlockCoverage":false}]},{"scriptId":"420","url":"file:///home/runner/work/abapGit/abapGit/output/cl_salv_table.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11632,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":105,"endOffset":4533,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":267,"endOffset":327,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":477,"endOffset":520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":568,"endOffset":611,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":654,"endOffset":697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":793,"endOffset":903,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1002,"endOffset":1045,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1145,"endOffset":1205,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1305,"endOffset":1569,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1824,"endOffset":1921,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2082,"endOffset":2125,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2174,"endOffset":2217,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2259,"endOffset":2302,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2409,"endOffset":2469,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2515,"endOffset":2575,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2621,"endOffset":2681,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2725,"endOffset":2785,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2876,"endOffset":3000,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3102,"endOffset":3212,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3313,"endOffset":3356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3453,"endOffset":3496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3593,"endOffset":3636,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3729,"endOffset":3855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3950,"endOffset":4078,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4178,"endOffset":4302,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4395,"endOffset":4509,"count":0}],"isBlockCoverage":false},{"functionName":"cl_salv_table","ranges":[{"startOffset":4537,"endOffset":4680,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4683,"endOffset":4796,"count":0}],"isBlockCoverage":false},{"functionName":"set_selected_rows","ranges":[{"startOffset":4799,"endOffset":5044,"count":0}],"isBlockCoverage":false},{"functionName":"get_filters","ranges":[{"startOffset":5047,"endOffset":5321,"count":0}],"isBlockCoverage":false},{"functionName":"get_aggregations","ranges":[{"startOffset":5324,"endOffset":5617,"count":0}],"isBlockCoverage":false},{"functionName":"get_functions","ranges":[{"startOffset":5620,"endOffset":5910,"count":0}],"isBlockCoverage":false},{"functionName":"get_selected_rows","ranges":[{"startOffset":5913,"endOffset":6345,"count":0}],"isBlockCoverage":false},{"functionName":"get_metadata","ranges":[{"startOffset":6348,"endOffset":6493,"count":0}],"isBlockCoverage":false},{"functionName":"set_selection_mode","ranges":[{"startOffset":6496,"endOffset":6762,"count":0}],"isBlockCoverage":false},{"functionName":"set_striped_pattern","ranges":[{"startOffset":6765,"endOffset":7012,"count":0}],"isBlockCoverage":false},{"functionName":"set_list_header","ranges":[{"startOffset":7015,"endOffset":7258,"count":0}],"isBlockCoverage":false},{"functionName":"factory","ranges":[{"startOffset":7261,"endOffset":7328,"count":0}],"isBlockCoverage":false},{"functionName":"factory","ranges":[{"startOffset":7338,"endOffset":7837,"count":0}],"isBlockCoverage":false},{"functionName":"is_offline","ranges":[{"startOffset":7840,"endOffset":8100,"count":0}],"isBlockCoverage":false},{"functionName":"get_selections","ranges":[{"startOffset":8103,"endOffset":8376,"count":0}],"isBlockCoverage":false},{"functionName":"close_screen","ranges":[{"startOffset":8379,"endOffset":8524,"count":0}],"isBlockCoverage":false},{"functionName":"refresh","ranges":[{"startOffset":8527,"endOffset":8667,"count":0}],"isBlockCoverage":false},{"functionName":"display","ranges":[{"startOffset":8670,"endOffset":8810,"count":0}],"isBlockCoverage":false},{"functionName":"set_screen_status","ranges":[{"startOffset":8813,"endOffset":9310,"count":0}],"isBlockCoverage":false},{"functionName":"set_screen_popup","ranges":[{"startOffset":9313,"endOffset":10019,"count":0}],"isBlockCoverage":false},{"functionName":"get_event","ranges":[{"startOffset":10022,"endOffset":10304,"count":0}],"isBlockCoverage":false},{"functionName":"get_display_settings","ranges":[{"startOffset":10307,"endOffset":10586,"count":0}],"isBlockCoverage":false},{"functionName":"set_top_of_list","ranges":[{"startOffset":10589,"endOffset":10832,"count":0}],"isBlockCoverage":false},{"functionName":"get_columns","ranges":[{"startOffset":10835,"endOffset":11121,"count":0}],"isBlockCoverage":false}]},{"scriptId":"421","url":"file:///home/runner/work/abapGit/abapGit/output/cl_shm_area.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":32349,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":210,"endOffset":12966,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":413,"endOffset":503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":587,"endOffset":769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":852,"endOffset":958,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1038,"endOffset":1127,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1218,"endOffset":1315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1407,"endOffset":1519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1598,"endOffset":1645,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1735,"endOffset":1841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1939,"endOffset":2024,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2120,"endOffset":2195,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2288,"endOffset":2362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2452,"endOffset":2526,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2619,"endOffset":2695,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2793,"endOffset":2867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3023,"endOffset":3120,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3165,"endOffset":3271,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3319,"endOffset":3394,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3434,"endOffset":3524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3628,"endOffset":3734,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3774,"endOffset":3848,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3888,"endOffset":3978,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4023,"endOffset":4083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4186,"endOffset":4292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4332,"endOffset":4406,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4446,"endOffset":4536,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4581,"endOffset":4641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4740,"endOffset":4805,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4850,"endOffset":4956,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4998,"endOffset":5097,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5148,"endOffset":5245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5294,"endOffset":5391,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5443,"endOffset":5540,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5593,"endOffset":5690,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5739,"endOffset":5815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5863,"endOffset":5938,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6041,"endOffset":6106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6151,"endOffset":6257,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6302,"endOffset":6408,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6450,"endOffset":6549,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6600,"endOffset":6697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6746,"endOffset":6843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6895,"endOffset":6992,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7045,"endOffset":7142,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7191,"endOffset":7267,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7315,"endOffset":7390,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7482,"endOffset":7572,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7667,"endOffset":7732,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7777,"endOffset":7883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7925,"endOffset":8024,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8075,"endOffset":8172,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8224,"endOffset":8321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8369,"endOffset":8444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8537,"endOffset":8602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8647,"endOffset":8753,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8795,"endOffset":8894,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8945,"endOffset":9042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9091,"endOffset":9188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9240,"endOffset":9337,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9390,"endOffset":9487,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9536,"endOffset":9612,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9660,"endOffset":9735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9840,"endOffset":10305,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10350,"endOffset":10456,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10498,"endOffset":10597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10648,"endOffset":10745,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10797,"endOffset":10894,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10942,"endOffset":11017,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11114,"endOffset":11179,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11224,"endOffset":11330,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11375,"endOffset":11481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11523,"endOffset":11622,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11673,"endOffset":11770,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11819,"endOffset":11916,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11968,"endOffset":12065,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12118,"endOffset":12215,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12264,"endOffset":12340,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12388,"endOffset":12463,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12663,"endOffset":12753,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12845,"endOffset":12942,"count":0}],"isBlockCoverage":false},{"functionName":"cl_shm_area","ranges":[{"startOffset":12970,"endOffset":14293,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":14296,"endOffset":14409,"count":0}],"isBlockCoverage":false},{"functionName":"is_valid","ranges":[{"startOffset":14412,"endOffset":14590,"count":0}],"isBlockCoverage":false},{"functionName":"_free_instance71","ranges":[{"startOffset":14593,"endOffset":14676,"count":0}],"isBlockCoverage":false},{"functionName":"_free_instance71","ranges":[{"startOffset":14686,"endOffset":16999,"count":0}],"isBlockCoverage":false},{"functionName":"detach_commit","ranges":[{"startOffset":17002,"endOffset":17041,"count":0}],"isBlockCoverage":false},{"functionName":"detach","ranges":[{"startOffset":17044,"endOffset":17076,"count":0}],"isBlockCoverage":false},{"functionName":"_attach_read71","ranges":[{"startOffset":17079,"endOffset":18742,"count":0}],"isBlockCoverage":false},{"functionName":"_get_instance_infos71","ranges":[{"startOffset":18745,"endOffset":18838,"count":0}],"isBlockCoverage":false},{"functionName":"_get_instance_infos71","ranges":[{"startOffset":18848,"endOffset":20616,"count":0}],"isBlockCoverage":false},{"functionName":"_detach_area71","ranges":[{"startOffset":20619,"endOffset":20698,"count":0}],"isBlockCoverage":false},{"functionName":"_detach_area71","ranges":[{"startOffset":20708,"endOffset":21950,"count":0}],"isBlockCoverage":false},{"functionName":"_free_area71","ranges":[{"startOffset":21953,"endOffset":22028,"count":0}],"isBlockCoverage":false},{"functionName":"_free_area71","ranges":[{"startOffset":22038,"endOffset":24167,"count":0}],"isBlockCoverage":false},{"functionName":"_set_root","ranges":[{"startOffset":24170,"endOffset":24377,"count":0}],"isBlockCoverage":false},{"functionName":"_invalidate_instance71","ranges":[{"startOffset":24380,"endOffset":24475,"count":0}],"isBlockCoverage":false},{"functionName":"_invalidate_instance71","ranges":[{"startOffset":24485,"endOffset":26804,"count":0}],"isBlockCoverage":false},{"functionName":"_invalidate_area71","ranges":[{"startOffset":26807,"endOffset":26894,"count":0}],"isBlockCoverage":false},{"functionName":"_invalidate_area71","ranges":[{"startOffset":26904,"endOffset":29039,"count":0}],"isBlockCoverage":false},{"functionName":"_attach_update70","ranges":[{"startOffset":29042,"endOffset":30441,"count":0}],"isBlockCoverage":false},{"functionName":"_attach_write70","ranges":[{"startOffset":30444,"endOffset":31070,"count":0}],"isBlockCoverage":false}]},{"scriptId":"422","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_general_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":773,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":216,"endOffset":406,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_general_error","ranges":[{"startOffset":410,"endOffset":508,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":511,"endOffset":624,"count":0}],"isBlockCoverage":false}]},{"scriptId":"423","url":"file:///home/runner/work/abapGit/abapGit/output/cx_dynamic_check.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":651,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":300,"count":1}],"isBlockCoverage":true},{"functionName":"cx_dynamic_check","ranges":[{"startOffset":304,"endOffset":402,"count":118}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":405,"endOffset":518,"count":12}],"isBlockCoverage":true}]},{"scriptId":"424","url":"file:///home/runner/work/abapGit/abapGit/output/cl_shm_service.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5369,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":2282,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":336,"endOffset":442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":484,"endOffset":585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":631,"endOffset":1102,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1227,"endOffset":1357,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1402,"endOffset":1508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1617,"endOffset":1729,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1774,"endOffset":1880,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1991,"endOffset":2088,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2136,"endOffset":2258,"count":0}],"isBlockCoverage":false},{"functionName":"cl_shm_service","ranges":[{"startOffset":2286,"endOffset":2371,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2374,"endOffset":2487,"count":0}],"isBlockCoverage":false},{"functionName":"initialize","ranges":[{"startOffset":2490,"endOffset":2564,"count":0}],"isBlockCoverage":false},{"functionName":"initialize","ranges":[{"startOffset":2574,"endOffset":3504,"count":0}],"isBlockCoverage":false},{"functionName":"get_auto_build_class_name","ranges":[{"startOffset":3507,"endOffset":3611,"count":0}],"isBlockCoverage":false},{"functionName":"get_auto_build_class_name","ranges":[{"startOffset":3621,"endOffset":4146,"count":0}],"isBlockCoverage":false},{"functionName":"trace_get_service","ranges":[{"startOffset":4149,"endOffset":4237,"count":0}],"isBlockCoverage":false},{"functionName":"trace_get_service","ranges":[{"startOffset":4247,"endOffset":4637,"count":0}],"isBlockCoverage":false},{"functionName":"trace_is_variant_active","ranges":[{"startOffset":4640,"endOffset":4740,"count":0}],"isBlockCoverage":false},{"functionName":"trace_is_variant_active","ranges":[{"startOffset":4750,"endOffset":5244,"count":0}],"isBlockCoverage":false}]},{"scriptId":"425","url":"file:///home/runner/work/abapGit/abapGit/output/cl_sql_result_set.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2397,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":1050,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":272,"endOffset":308,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":390,"endOffset":450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":530,"endOffset":603,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":752,"endOffset":825,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":916,"endOffset":976,"count":0}],"isBlockCoverage":false},{"functionName":"cl_sql_result_set","ranges":[{"startOffset":1054,"endOffset":1324,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1327,"endOffset":1440,"count":0}],"isBlockCoverage":false},{"functionName":"set_param","ranges":[{"startOffset":1443,"endOffset":1645,"count":0}],"isBlockCoverage":false},{"functionName":"next","ranges":[{"startOffset":1648,"endOffset":2226,"count":0}],"isBlockCoverage":false},{"functionName":"close","ranges":[{"startOffset":2229,"endOffset":2260,"count":0}],"isBlockCoverage":false}]},{"scriptId":"426","url":"file:///home/runner/work/abapGit/abapGit/output/cl_sql_statement.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3757,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":763,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":346,"endOffset":410,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":512,"endOffset":630,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":675,"endOffset":739,"count":0}],"isBlockCoverage":false},{"functionName":"cl_sql_statement","ranges":[{"startOffset":767,"endOffset":852,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":855,"endOffset":968,"count":0}],"isBlockCoverage":false},{"functionName":"execute_update","ranges":[{"startOffset":971,"endOffset":2147,"count":0}],"isBlockCoverage":false},{"functionName":"execute_query","ranges":[{"startOffset":2150,"endOffset":3624,"count":0}],"isBlockCoverage":false}]},{"scriptId":"427","url":"file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_reader.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1560,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":178,"endOffset":653,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":407,"endOffset":523,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":563,"endOffset":629,"count":0}],"isBlockCoverage":false},{"functionName":"cl_sxml_string_reader","ranges":[{"startOffset":657,"endOffset":742,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":745,"endOffset":858,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":861,"endOffset":934,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":944,"endOffset":1407,"count":87}],"isBlockCoverage":true}]},{"scriptId":"428","url":"file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_reader.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":39469,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":126,"endOffset":3302,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":310,"endOffset":925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1070,"endOffset":1152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1195,"endOffset":1259,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1301,"endOffset":1365,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1409,"endOffset":1473,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1567,"endOffset":1610,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1652,"endOffset":1716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1817,"endOffset":1860,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1902,"endOffset":1966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2066,"endOffset":2109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2151,"endOffset":2215,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2315,"endOffset":2358,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2400,"endOffset":2464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2556,"endOffset":3171,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3214,"endOffset":3278,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_json_parser","ranges":[{"startOffset":3306,"endOffset":4012,"count":87}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4015,"endOffset":4128,"count":87},{"startOffset":4071,"endOffset":4107,"count":0}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":4131,"endOffset":5977,"count":87},{"startOffset":5285,"endOffset":5368,"count":4},{"startOffset":5428,"endOffset":5832,"count":4},{"startOffset":5832,"endOffset":5976,"count":83}],"isBlockCoverage":true},{"functionName":"append","ranges":[{"startOffset":5980,"endOffset":7173,"count":2351},{"startOffset":6250,"endOffset":6279,"count":1766},{"startOffset":6378,"endOffset":6405,"count":883},{"startOffset":6508,"endOffset":6539,"count":585}],"isBlockCoverage":true},{"functionName":"traverse","ranges":[{"startOffset":7176,"endOffset":8494,"count":883},{"startOffset":7404,"endOffset":7431,"count":720},{"startOffset":7545,"endOffset":7554,"count":37},{"startOffset":7555,"endOffset":7577,"count":846},{"startOffset":7612,"endOffset":7632,"count":24},{"startOffset":7743,"endOffset":7820,"count":237},{"startOffset":7820,"endOffset":8490,"count":646},{"startOffset":7901,"endOffset":7977,"count":37},{"startOffset":7977,"endOffset":8490,"count":609},{"startOffset":8058,"endOffset":8132,"count":371},{"startOffset":8133,"endOffset":8206,"count":320},{"startOffset":8207,"endOffset":8278,"count":24},{"startOffset":8356,"endOffset":8490,"count":0}],"isBlockCoverage":true},{"functionName":"traverse_basic","ranges":[{"startOffset":8497,"endOffset":9916,"count":609},{"startOffset":8979,"endOffset":8999,"count":24},{"startOffset":9110,"endOffset":9176,"count":238},{"startOffset":9176,"endOffset":9474,"count":371},{"startOffset":9258,"endOffset":9324,"count":296},{"startOffset":9324,"endOffset":9474,"count":75},{"startOffset":9407,"endOffset":9474,"count":51},{"startOffset":9680,"endOffset":9797,"count":585}],"isBlockCoverage":true},{"functionName":"traverse_array","ranges":[{"startOffset":9919,"endOffset":11244,"count":37},{"startOffset":10778,"endOffset":11041,"count":80}],"isBlockCoverage":true},{"functionName":"traverse_object","ranges":[{"startOffset":11247,"endOffset":12517,"count":237},{"startOffset":12215,"endOffset":12364,"count":720}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11960,"endOffset":11982,"count":720}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13670,"endOffset":14818,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":13871,"endOffset":13935,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14032,"endOffset":14162,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14264,"endOffset":14348,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14495,"endOffset":14559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14600,"endOffset":14664,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14710,"endOffset":14794,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_attribute","ranges":[{"startOffset":14822,"endOffset":15339,"count":720}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":15342,"endOffset":15932,"count":720}],"isBlockCoverage":true},{"functionName":"if_sxml_attribute$get_value","ranges":[{"startOffset":15935,"endOffset":16090,"count":720}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16191,"endOffset":18684,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":16415,"endOffset":16748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16848,"endOffset":16978,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17069,"endOffset":17151,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17256,"endOffset":17338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17444,"endOffset":17526,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17624,"endOffset":17706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17808,"endOffset":17890,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17988,"endOffset":18070,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18217,"endOffset":18281,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18327,"endOffset":18660,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_open_node","ranges":[{"startOffset":18688,"endOffset":19954,"count":883}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":19957,"endOffset":20726,"count":883}],"isBlockCoverage":true},{"functionName":"if_sxml_open_element$get_attributes","ranges":[{"startOffset":20729,"endOffset":21163,"count":720}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22086,"endOffset":23783,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":22326,"endOffset":22456,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22547,"endOffset":22629,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22734,"endOffset":22816,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22922,"endOffset":23004,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23102,"endOffset":23184,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23286,"endOffset":23368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23466,"endOffset":23548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23695,"endOffset":23759,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_close_node","ranges":[{"startOffset":23787,"endOffset":24711,"count":883}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":24714,"endOffset":25034,"count":883}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":25969,"endOffset":27579,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":26187,"endOffset":26251,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26342,"endOffset":26424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26529,"endOffset":26611,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26717,"endOffset":26799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26897,"endOffset":26979,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27081,"endOffset":27163,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27261,"endOffset":27343,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27491,"endOffset":27555,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_value_node","ranges":[{"startOffset":27583,"endOffset":28370,"count":585}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":28373,"endOffset":28660,"count":585}],"isBlockCoverage":true},{"functionName":"if_sxml_value_node$get_value","ranges":[{"startOffset":28663,"endOffset":28813,"count":585}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":29744,"endOffset":31330,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":29938,"endOffset":30002,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30084,"endOffset":30398,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30482,"endOffset":30542,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30640,"endOffset":30722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30815,"endOffset":30879,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30973,"endOffset":31037,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31242,"endOffset":31306,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_reader","ranges":[{"startOffset":31334,"endOffset":32281,"count":87}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":32284,"endOffset":32493,"count":87}],"isBlockCoverage":true},{"functionName":"initialize","ranges":[{"startOffset":32496,"endOffset":36259,"count":2438},{"startOffset":34338,"endOffset":34359,"count":2351},{"startOffset":34359,"endOffset":34535,"count":87},{"startOffset":34535,"endOffset":34643,"count":83},{"startOffset":34643,"endOffset":36156,"count":2351},{"startOffset":34824,"endOffset":35458,"count":883},{"startOffset":34937,"endOffset":35287,"count":720},{"startOffset":35458,"endOffset":36078,"count":1468},{"startOffset":35560,"endOffset":35706,"count":883},{"startOffset":35706,"endOffset":36078,"count":585},{"startOffset":35948,"endOffset":36078,"count":0},{"startOffset":36156,"endOffset":36258,"count":83}],"isBlockCoverage":true},{"functionName":"if_sxml_reader$next_attribute","ranges":[{"startOffset":36262,"endOffset":36591,"count":0}],"isBlockCoverage":false},{"functionName":"if_sxml_reader$next_node","ranges":[{"startOffset":36594,"endOffset":38302,"count":0}],"isBlockCoverage":false},{"functionName":"if_sxml_reader$skip_node","ranges":[{"startOffset":38305,"endOffset":38526,"count":0}],"isBlockCoverage":false},{"functionName":"if_sxml_reader$read_next_node","ranges":[{"startOffset":38529,"endOffset":38914,"count":2438},{"startOffset":38710,"endOffset":38913,"count":2434}],"isBlockCoverage":true}]},{"scriptId":"429","url":"file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_writer.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15321,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":4327,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":301,"endOffset":367,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":448,"endOffset":531,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":613,"endOffset":859,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":966,"endOffset":1026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1130,"endOffset":1190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1304,"endOffset":1364,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1470,"endOffset":1530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1632,"endOffset":1692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1807,"endOffset":1867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1983,"endOffset":2043,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2162,"endOffset":2222,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2330,"endOffset":2390,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2537,"endOffset":2601,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2692,"endOffset":2756,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2846,"endOffset":2910,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3002,"endOffset":3066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3160,"endOffset":3243,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3338,"endOffset":3404,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3495,"endOffset":3621,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3661,"endOffset":3744,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3804,"endOffset":3901,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3948,"endOffset":4045,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4098,"endOffset":4195,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4239,"endOffset":4303,"count":0}],"isBlockCoverage":false},{"functionName":"cl_sxml_string_writer","ranges":[{"startOffset":4331,"endOffset":5884,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5887,"endOffset":6100,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":6103,"endOffset":6176,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":6186,"endOffset":7919,"count":0}],"isBlockCoverage":false},{"functionName":"if_sxml_writer$set_option","ranges":[{"startOffset":7922,"endOffset":8454,"count":0}],"isBlockCoverage":false},{"functionName":"get_output","ranges":[{"startOffset":8457,"endOffset":8601,"count":0}],"isBlockCoverage":false},{"functionName":"append_text","ranges":[{"startOffset":8604,"endOffset":9045,"count":0}],"isBlockCoverage":false},{"functionName":"get_text","ranges":[{"startOffset":9048,"endOffset":9289,"count":0}],"isBlockCoverage":false},{"functionName":"if_sxml_writer$open_element","ranges":[{"startOffset":9292,"endOffset":10715,"count":0}],"isBlockCoverage":false},{"functionName":"remove","ranges":[{"startOffset":10718,"endOffset":11099,"count":0}],"isBlockCoverage":false},{"functionName":"if_sxml_writer$close_element","ranges":[{"startOffset":11102,"endOffset":11601,"count":0}],"isBlockCoverage":false},{"functionName":"if_sxml_writer$write_attribute","ranges":[{"startOffset":11604,"endOffset":12333,"count":0}],"isBlockCoverage":false},{"functionName":"peek","ranges":[{"startOffset":12336,"endOffset":12643,"count":0}],"isBlockCoverage":false},{"functionName":"if_sxml_writer$write_value","ranges":[{"startOffset":12646,"endOffset":13600,"count":0}],"isBlockCoverage":false}]},{"scriptId":"430","url":"file:///home/runner/work/abapGit/abapGit/output/cl_system_uuid.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2361,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":107,"endOffset":321,"count":1}],"isBlockCoverage":true},{"functionName":"cl_system_uuid","ranges":[{"startOffset":325,"endOffset":488,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":491,"endOffset":604,"count":0}],"isBlockCoverage":false},{"functionName":"if_system_uuid_static$create_uuid_x16","ranges":[{"startOffset":607,"endOffset":725,"count":0}],"isBlockCoverage":false},{"functionName":"if_system_uuid_static$create_uuid_x16","ranges":[{"startOffset":735,"endOffset":1028,"count":0}],"isBlockCoverage":false},{"functionName":"if_system_uuid_static$create_uuid_c32","ranges":[{"startOffset":1031,"endOffset":1149,"count":0}],"isBlockCoverage":false},{"functionName":"if_system_uuid_static$create_uuid_c32","ranges":[{"startOffset":1159,"endOffset":1506,"count":0}],"isBlockCoverage":false},{"functionName":"if_system_uuid_rfc4122_static$create_uuid_c36_by_version","ranges":[{"startOffset":1509,"endOffset":1675,"count":0}],"isBlockCoverage":false},{"functionName":"if_system_uuid_rfc4122_static$create_uuid_c36_by_version","ranges":[{"startOffset":1685,"endOffset":2236,"count":0}],"isBlockCoverage":false}]},{"scriptId":"431","url":"file:///home/runner/work/abapGit/abapGit/output/cl_web_http_utility.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1603,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":651,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":353,"endOffset":417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":460,"endOffset":524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":567,"endOffset":627,"count":0}],"isBlockCoverage":false},{"functionName":"cl_web_http_utility","ranges":[{"startOffset":655,"endOffset":740,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":743,"endOffset":856,"count":0}],"isBlockCoverage":false},{"functionName":"unescape_url","ranges":[{"startOffset":859,"endOffset":942,"count":0}],"isBlockCoverage":false},{"functionName":"unescape_url","ranges":[{"startOffset":952,"endOffset":1458,"count":0}],"isBlockCoverage":false}]},{"scriptId":"432","url":"file:///home/runner/work/abapGit/abapGit/output/cx_abap_datfm.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":721,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":199,"endOffset":382,"count":1}],"isBlockCoverage":true},{"functionName":"cx_abap_datfm","ranges":[{"startOffset":386,"endOffset":484,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":487,"endOffset":600,"count":0}],"isBlockCoverage":false}]},{"scriptId":"433","url":"file:///home/runner/work/abapGit/abapGit/output/cx_static_check.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2515,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":1205,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":365,"endOffset":707,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":751,"endOffset":849,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":890,"endOffset":932,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":973,"endOffset":1015,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1056,"endOffset":1098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1139,"endOffset":1181,"count":0}],"isBlockCoverage":false},{"functionName":"cx_static_check","ranges":[{"startOffset":1209,"endOffset":1307,"count":125}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1310,"endOffset":2386,"count":125},{"startOffset":1714,"endOffset":1741,"count":0},{"startOffset":1984,"endOffset":2006,"count":0},{"startOffset":2081,"endOffset":2103,"count":0},{"startOffset":2178,"endOffset":2200,"count":0},{"startOffset":2275,"endOffset":2297,"count":0}],"isBlockCoverage":true}]},{"scriptId":"434","url":"file:///home/runner/work/abapGit/abapGit/output/cx_abap_message_digest.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":784,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":217,"endOffset":409,"count":1}],"isBlockCoverage":true},{"functionName":"cx_abap_message_digest","ranges":[{"startOffset":413,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":514,"endOffset":627,"count":0}],"isBlockCoverage":false}]},{"scriptId":"435","url":"file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_a_table.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":763,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":211,"endOffset":400,"count":1}],"isBlockCoverage":true},{"functionName":"cx_abap_not_a_table","ranges":[{"startOffset":404,"endOffset":502,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":505,"endOffset":618,"count":0}],"isBlockCoverage":false}]},{"scriptId":"436","url":"file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_in_package.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":784,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":217,"endOffset":409,"count":1}],"isBlockCoverage":true},{"functionName":"cx_abap_not_in_package","ranges":[{"startOffset":413,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":514,"endOffset":627,"count":0}],"isBlockCoverage":false}]},{"scriptId":"437","url":"file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_in_whitelist.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":798,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":221,"endOffset":415,"count":1}],"isBlockCoverage":true},{"functionName":"cx_abap_not_in_whitelist","ranges":[{"startOffset":419,"endOffset":517,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":520,"endOffset":633,"count":0}],"isBlockCoverage":false}]},{"scriptId":"438","url":"file:///home/runner/work/abapGit/abapGit/output/cx_abap_random.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":731,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":204,"endOffset":388,"count":1}],"isBlockCoverage":true},{"functionName":"cx_abap_random","ranges":[{"startOffset":392,"endOffset":490,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":493,"endOffset":606,"count":0}],"isBlockCoverage":false}]},{"scriptId":"439","url":"file:///home/runner/work/abapGit/abapGit/output/cx_abap_timefm_invalid.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":784,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":217,"endOffset":409,"count":1}],"isBlockCoverage":true},{"functionName":"cx_abap_timefm_invalid","ranges":[{"startOffset":413,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":514,"endOffset":627,"count":0}],"isBlockCoverage":false}]},{"scriptId":"440","url":"file:///home/runner/work/abapGit/abapGit/output/cx_apc_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":714,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":197,"endOffset":379,"count":1}],"isBlockCoverage":true},{"functionName":"cx_apc_error","ranges":[{"startOffset":383,"endOffset":481,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":484,"endOffset":597,"count":0}],"isBlockCoverage":false}]},{"scriptId":"441","url":"file:///home/runner/work/abapGit/abapGit/output/cx_bcs.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":672,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":185,"endOffset":361,"count":1}],"isBlockCoverage":true},{"functionName":"cx_bcs","ranges":[{"startOffset":365,"endOffset":463,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":466,"endOffset":579,"count":0}],"isBlockCoverage":false}]},{"scriptId":"442","url":"file:///home/runner/work/abapGit/abapGit/output/cx_ftd_parameter_not_found.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":800,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":213,"endOffset":409,"count":1}],"isBlockCoverage":true},{"functionName":"cx_ftd_parameter_not_found","ranges":[{"startOffset":413,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":514,"endOffset":627,"count":0}],"isBlockCoverage":false}]},{"scriptId":"443","url":"file:///home/runner/work/abapGit/abapGit/output/cx_no_check.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":963,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":477,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":355,"endOffset":453,"count":0}],"isBlockCoverage":false},{"functionName":"cx_no_check","ranges":[{"startOffset":481,"endOffset":579,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":582,"endOffset":850,"count":0}],"isBlockCoverage":false}]},{"scriptId":"444","url":"file:///home/runner/work/abapGit/abapGit/output/cx_gdt_conversion.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":752,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":210,"endOffset":397,"count":1}],"isBlockCoverage":true},{"functionName":"cx_gdt_conversion","ranges":[{"startOffset":401,"endOffset":499,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":502,"endOffset":615,"count":0}],"isBlockCoverage":false}]},{"scriptId":"445","url":"file:///home/runner/work/abapGit/abapGit/output/cx_oo_clif_not_exists.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":780,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":218,"endOffset":409,"count":1}],"isBlockCoverage":true},{"functionName":"cx_oo_clif_not_exists","ranges":[{"startOffset":413,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":514,"endOffset":627,"count":0}],"isBlockCoverage":false}]},{"scriptId":"446","url":"file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1583,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":216,"endOffset":797,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":474,"endOffset":522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":566,"endOffset":664,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":709,"endOffset":773,"count":0}],"isBlockCoverage":false},{"functionName":"cx_parameter_invalid","ranges":[{"startOffset":801,"endOffset":899,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":902,"endOffset":1434,"count":0}],"isBlockCoverage":false}]},{"scriptId":"447","url":"file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid_range.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1912,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":240,"endOffset":958,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":530,"endOffset":578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":622,"endOffset":720,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":765,"endOffset":829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":870,"endOffset":934,"count":0}],"isBlockCoverage":false},{"functionName":"cx_parameter_invalid_range","ranges":[{"startOffset":962,"endOffset":1060,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1063,"endOffset":1739,"count":0}],"isBlockCoverage":false}]},{"scriptId":"448","url":"file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid_type.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":846,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":238,"endOffset":459,"count":1}],"isBlockCoverage":true},{"functionName":"cx_parameter_invalid_type","ranges":[{"startOffset":463,"endOffset":561,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":564,"endOffset":677,"count":0}],"isBlockCoverage":false}]},{"scriptId":"449","url":"file:///home/runner/work/abapGit/abapGit/output/cx_salv_access_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":863,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":228,"endOffset":496,"count":1}],"isBlockCoverage":true},{"functionName":"cx_salv_access_error","ranges":[{"startOffset":500,"endOffset":598,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":601,"endOffset":714,"count":0}],"isBlockCoverage":false}]},{"scriptId":"450","url":"file:///home/runner/work/abapGit/abapGit/output/cx_salv_static_check.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":790,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":207,"endOffset":423,"count":1}],"isBlockCoverage":true},{"functionName":"cx_salv_static_check","ranges":[{"startOffset":427,"endOffset":525,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":528,"endOffset":641,"count":0}],"isBlockCoverage":false}]},{"scriptId":"451","url":"file:///home/runner/work/abapGit/abapGit/output/cx_salv_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":721,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":199,"endOffset":382,"count":1}],"isBlockCoverage":true},{"functionName":"cx_salv_error","ranges":[{"startOffset":386,"endOffset":484,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":487,"endOffset":600,"count":0}],"isBlockCoverage":false}]},{"scriptId":"452","url":"file:///home/runner/work/abapGit/abapGit/output/cx_salv_data_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":849,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":224,"endOffset":490,"count":1}],"isBlockCoverage":true},{"functionName":"cx_salv_data_error","ranges":[{"startOffset":494,"endOffset":592,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":595,"endOffset":708,"count":0}],"isBlockCoverage":false}]},{"scriptId":"453","url":"file:///home/runner/work/abapGit/abapGit/output/cx_salv_msg.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":727,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":189,"endOffset":396,"count":1}],"isBlockCoverage":true},{"functionName":"cx_salv_msg","ranges":[{"startOffset":400,"endOffset":498,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":501,"endOffset":614,"count":0}],"isBlockCoverage":false}]},{"scriptId":"454","url":"file:///home/runner/work/abapGit/abapGit/output/cx_salv_not_found.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":946,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":591,"count":1}],"isBlockCoverage":true},{"functionName":"cx_salv_not_found","ranges":[{"startOffset":595,"endOffset":693,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":696,"endOffset":809,"count":0}],"isBlockCoverage":false}]},{"scriptId":"455","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_already_detached.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2070,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":234,"endOffset":1059,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":521,"endOffset":569,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":613,"endOffset":711,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":756,"endOffset":820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":865,"endOffset":929,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":971,"endOffset":1035,"count":0}],"isBlockCoverage":false},{"functionName":"cx_shm_already_detached","ranges":[{"startOffset":1063,"endOffset":1161,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1164,"endOffset":1909,"count":0}],"isBlockCoverage":false}]},{"scriptId":"456","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_attach_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":780,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":202,"endOffset":417,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_attach_error","ranges":[{"startOffset":421,"endOffset":519,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":522,"endOffset":635,"count":0}],"isBlockCoverage":false}]},{"scriptId":"457","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":714,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":197,"endOffset":379,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_error","ranges":[{"startOffset":383,"endOffset":481,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":484,"endOffset":597,"count":0}],"isBlockCoverage":false}]},{"scriptId":"458","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_build_failed.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":804,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":441,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_build_failed","ranges":[{"startOffset":445,"endOffset":543,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":546,"endOffset":659,"count":0}],"isBlockCoverage":false}]},{"scriptId":"459","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_change_lock_active.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":895,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":235,"endOffset":508,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_change_lock_active","ranges":[{"startOffset":512,"endOffset":610,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":613,"endOffset":726,"count":0}],"isBlockCoverage":false}]},{"scriptId":"460","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_completion_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":829,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":231,"endOffset":450,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_completion_error","ranges":[{"startOffset":454,"endOffset":552,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":555,"endOffset":668,"count":0}],"isBlockCoverage":false}]},{"scriptId":"461","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_detach_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":766,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":214,"endOffset":403,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_detach_error","ranges":[{"startOffset":407,"endOffset":505,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":508,"endOffset":621,"count":0}],"isBlockCoverage":false}]},{"scriptId":"462","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_event_execution_failed.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":935,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":255,"endOffset":532,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_event_execution_failed","ranges":[{"startOffset":536,"endOffset":634,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":637,"endOffset":750,"count":0}],"isBlockCoverage":false}]},{"scriptId":"463","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_exclusive_lock_active.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":916,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":241,"endOffset":517,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_exclusive_lock_active","ranges":[{"startOffset":521,"endOffset":619,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":622,"endOffset":735,"count":0}],"isBlockCoverage":false}]},{"scriptId":"464","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_inconsistent.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":853,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":223,"endOffset":490,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_inconsistent","ranges":[{"startOffset":494,"endOffset":592,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":595,"endOffset":708,"count":0}],"isBlockCoverage":false}]},{"scriptId":"465","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_initial_reference.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":839,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":236,"endOffset":456,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_initial_reference","ranges":[{"startOffset":460,"endOffset":558,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":561,"endOffset":674,"count":0}],"isBlockCoverage":false}]},{"scriptId":"466","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_no_active_version.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":888,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":233,"endOffset":505,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_no_active_version","ranges":[{"startOffset":509,"endOffset":607,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":610,"endOffset":723,"count":0}],"isBlockCoverage":false}]},{"scriptId":"467","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_parameter_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":825,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":232,"endOffset":450,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_parameter_error","ranges":[{"startOffset":454,"endOffset":552,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":555,"endOffset":668,"count":0}],"isBlockCoverage":false}]},{"scriptId":"468","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_pending_lock_removed.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":909,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":239,"endOffset":514,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_pending_lock_removed","ranges":[{"startOffset":518,"endOffset":616,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":619,"endOffset":732,"count":0}],"isBlockCoverage":false}]},{"scriptId":"469","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_read_lock_active.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":881,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":231,"endOffset":502,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_read_lock_active","ranges":[{"startOffset":506,"endOffset":604,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":607,"endOffset":720,"count":0}],"isBlockCoverage":false}]},{"scriptId":"470","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_secondary_commit.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":829,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":231,"endOffset":450,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_secondary_commit","ranges":[{"startOffset":454,"endOffset":552,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":555,"endOffset":668,"count":0}],"isBlockCoverage":false}]},{"scriptId":"471","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_version_limit_exceeded.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":923,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":243,"endOffset":520,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_version_limit_exceeded","ranges":[{"startOffset":524,"endOffset":622,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":625,"endOffset":738,"count":0}],"isBlockCoverage":false}]},{"scriptId":"472","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shm_wrong_handle.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":804,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":441,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shm_wrong_handle","ranges":[{"startOffset":445,"endOffset":543,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":546,"endOffset":659,"count":0}],"isBlockCoverage":false}]},{"scriptId":"473","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shma_dynamic.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":738,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":206,"endOffset":391,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shma_dynamic","ranges":[{"startOffset":395,"endOffset":493,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":496,"endOffset":609,"count":0}],"isBlockCoverage":false}]},{"scriptId":"474","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shma_inconsistent.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":796,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":213,"endOffset":429,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shma_inconsistent","ranges":[{"startOffset":433,"endOffset":531,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":534,"endOffset":647,"count":0}],"isBlockCoverage":false}]},{"scriptId":"475","url":"file:///home/runner/work/abapGit/abapGit/output/cx_shma_not_configured.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":810,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":217,"endOffset":435,"count":1}],"isBlockCoverage":true},{"functionName":"cx_shma_not_configured","ranges":[{"startOffset":439,"endOffset":537,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":540,"endOffset":653,"count":0}],"isBlockCoverage":false}]},{"scriptId":"476","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sql_exception.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":742,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":205,"endOffset":391,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sql_exception","ranges":[{"startOffset":395,"endOffset":493,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":496,"endOffset":609,"count":0}],"isBlockCoverage":false}]},{"scriptId":"477","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":724,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":202,"endOffset":385,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sxml_error","ranges":[{"startOffset":389,"endOffset":487,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":490,"endOffset":603,"count":4}],"isBlockCoverage":true}]},{"scriptId":"478","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_illegal_argument_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":860,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":227,"endOffset":453,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sxml_illegal_argument_error","ranges":[{"startOffset":457,"endOffset":555,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":558,"endOffset":671,"count":0}],"isBlockCoverage":false}]},{"scriptId":"479","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_name_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":776,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":203,"endOffset":417,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sxml_name_error","ranges":[{"startOffset":421,"endOffset":519,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":522,"endOffset":635,"count":0}],"isBlockCoverage":false}]},{"scriptId":"480","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_parse_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1298,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":205,"endOffset":716,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":419,"endOffset":479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":632,"endOffset":692,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sxml_parse_error","ranges":[{"startOffset":720,"endOffset":886,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":889,"endOffset":1153,"count":4}],"isBlockCoverage":true}]},{"scriptId":"481","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_state_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":783,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":205,"endOffset":420,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sxml_state_error","ranges":[{"startOffset":424,"endOffset":522,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":525,"endOffset":638,"count":0}],"isBlockCoverage":false}]},{"scriptId":"482","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_arithmetic_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":787,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":220,"endOffset":412,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_arithmetic_error","ranges":[{"startOffset":416,"endOffset":514,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":517,"endOffset":630,"count":0}],"isBlockCoverage":false}]},{"scriptId":"483","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_buffer_overflow.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":780,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":218,"endOffset":409,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_buffer_overflow","ranges":[{"startOffset":413,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":514,"endOffset":627,"count":0}],"isBlockCoverage":false}]},{"scriptId":"484","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_codepage_converter_init.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":836,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":234,"endOffset":433,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_codepage_converter_init","ranges":[{"startOffset":437,"endOffset":535,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":538,"endOffset":651,"count":0}],"isBlockCoverage":false}]},{"scriptId":"485","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_compression_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":794,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":415,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_compression_error","ranges":[{"startOffset":419,"endOffset":517,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":520,"endOffset":633,"count":0}],"isBlockCoverage":false}]},{"scriptId":"486","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_codepage.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1036,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":571,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":424,"endOffset":490,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_conversion_codepage","ranges":[{"startOffset":575,"endOffset":751,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":754,"endOffset":867,"count":2}],"isBlockCoverage":true}]},{"scriptId":"487","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_data_loss.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":859,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":246,"endOffset":468,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_conversion_data_loss","ranges":[{"startOffset":472,"endOffset":570,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":573,"endOffset":686,"count":0}],"isBlockCoverage":false}]},{"scriptId":"488","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":787,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":220,"endOffset":412,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_conversion_error","ranges":[{"startOffset":416,"endOffset":514,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":517,"endOffset":630,"count":0}],"isBlockCoverage":false}]},{"scriptId":"489","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_no_number.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":859,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":246,"endOffset":468,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_conversion_no_number","ranges":[{"startOffset":472,"endOffset":570,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":573,"endOffset":686,"count":0}],"isBlockCoverage":false}]},{"scriptId":"490","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_overflow.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1642,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":244,"endOffset":852,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":533,"endOffset":581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":625,"endOffset":723,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":764,"endOffset":828,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_conversion_overflow","ranges":[{"startOffset":856,"endOffset":954,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":957,"endOffset":1473,"count":0}],"isBlockCoverage":false}]},{"scriptId":"491","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_create_data_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":794,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":415,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_create_data_error","ranges":[{"startOffset":419,"endOffset":517,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":520,"endOffset":633,"count":0}],"isBlockCoverage":false}]},{"scriptId":"492","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_create_object_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2178,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":1019,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":419,"endOffset":483,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":632,"endOffset":680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":724,"endOffset":822,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":867,"endOffset":931,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_create_object_error","ranges":[{"startOffset":1023,"endOffset":1192,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1195,"endOffset":1771,"count":0}],"isBlockCoverage":false},{"functionName":"if_message$get_text","ranges":[{"startOffset":1774,"endOffset":2009,"count":0}],"isBlockCoverage":false}]},{"scriptId":"493","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_data_access_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":794,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":415,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_data_access_error","ranges":[{"startOffset":419,"endOffset":517,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":520,"endOffset":633,"count":0}],"isBlockCoverage":false}]},{"scriptId":"494","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_duplicate_key.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":766,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":214,"endOffset":403,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_duplicate_key","ranges":[{"startOffset":407,"endOffset":505,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":508,"endOffset":621,"count":0}],"isBlockCoverage":false}]},{"scriptId":"495","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":773,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":216,"endOffset":406,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_dyn_call_error","ranges":[{"startOffset":410,"endOffset":508,"count":87}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":511,"endOffset":624,"count":2}],"isBlockCoverage":true}]},{"scriptId":"496","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_class.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":867,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":244,"endOffset":468,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_dyn_call_illegal_class","ranges":[{"startOffset":472,"endOffset":570,"count":84}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":573,"endOffset":686,"count":0}],"isBlockCoverage":false}]},{"scriptId":"497","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_form.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":860,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":242,"endOffset":465,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_dyn_call_illegal_form","ranges":[{"startOffset":469,"endOffset":567,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":570,"endOffset":683,"count":0}],"isBlockCoverage":false}]},{"scriptId":"498","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_func.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":860,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":242,"endOffset":465,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_dyn_call_illegal_func","ranges":[{"startOffset":469,"endOffset":567,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":570,"endOffset":683,"count":0}],"isBlockCoverage":false}]},{"scriptId":"499","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_method.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2258,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":246,"endOffset":1103,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":474,"endOffset":521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":670,"endOffset":718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":762,"endOffset":860,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":905,"endOffset":969,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1015,"endOffset":1079,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_dyn_call_illegal_method","ranges":[{"startOffset":1107,"endOffset":1277,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1280,"endOffset":1938,"count":2},{"startOffset":1373,"endOffset":1388,"count":1},{"startOffset":1390,"endOffset":1417,"count":1},{"startOffset":1535,"endOffset":1552,"count":1},{"startOffset":1554,"endOffset":1585,"count":0},{"startOffset":1670,"endOffset":1688,"count":1},{"startOffset":1690,"endOffset":1723,"count":1},{"startOffset":1809,"endOffset":1828,"count":1},{"startOffset":1830,"endOffset":1865,"count":1}],"isBlockCoverage":true}]},{"scriptId":"500","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_param_not_found.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":963,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":278,"endOffset":556,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_dyn_call_param_not_found","ranges":[{"startOffset":560,"endOffset":658,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":661,"endOffset":774,"count":0}],"isBlockCoverage":false}]},{"scriptId":"501","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_parameter_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1095,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":248,"endOffset":617,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":472,"endOffset":536,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_dyn_call_parameter_error","ranges":[{"startOffset":621,"endOffset":790,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":793,"endOffset":906,"count":0}],"isBlockCoverage":false}]},{"scriptId":"502","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dynamic_osql_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1156,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":236,"endOffset":664,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":576,"endOffset":640,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_dynamic_osql_error","ranges":[{"startOffset":668,"endOffset":766,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":769,"endOffset":991,"count":1}],"isBlockCoverage":true}]},{"scriptId":"503","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_open_sql_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1061,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":213,"endOffset":585,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":497,"endOffset":561,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_open_sql_error","ranges":[{"startOffset":589,"endOffset":687,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":690,"endOffset":912,"count":1}],"isBlockCoverage":true}]},{"scriptId":"504","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_sql_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1233,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":206,"endOffset":687,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":386,"endOffset":450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":599,"endOffset":663,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_sql_error","ranges":[{"startOffset":691,"endOffset":857,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":860,"endOffset":1104,"count":1}],"isBlockCoverage":true}]},{"scriptId":"505","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dynamic_osql_semantics.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1300,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":256,"endOffset":792,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":704,"endOffset":768,"count":0}],"isBlockCoverage":false},{"functionName":"cx_sy_dynamic_osql_semantics","ranges":[{"startOffset":796,"endOffset":894,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":897,"endOffset":1119,"count":1}],"isBlockCoverage":true}]},{"scriptId":"506","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_duplicate_key.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":827,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":224,"endOffset":444,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_itab_duplicate_key","ranges":[{"startOffset":448,"endOffset":546,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":549,"endOffset":662,"count":0}],"isBlockCoverage":false}]},{"scriptId":"507","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":745,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":208,"endOffset":394,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_itab_error","ranges":[{"startOffset":398,"endOffset":496,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":499,"endOffset":612,"count":0}],"isBlockCoverage":false}]},{"scriptId":"508","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_line_not_found.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":808,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":421,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_itab_line_not_found","ranges":[{"startOffset":425,"endOffset":523,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":526,"endOffset":639,"count":0}],"isBlockCoverage":false}]},{"scriptId":"509","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_message_illegal_text.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":815,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":228,"endOffset":424,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_message_illegal_text","ranges":[{"startOffset":428,"endOffset":526,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":529,"endOffset":642,"count":0}],"isBlockCoverage":false}]},{"scriptId":"510","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_move_cast_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":780,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":218,"endOffset":409,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_move_cast_error","ranges":[{"startOffset":413,"endOffset":511,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":514,"endOffset":627,"count":0}],"isBlockCoverage":false}]},{"scriptId":"511","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_range_out_of_bounds.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":855,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":247,"endOffset":468,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_range_out_of_bounds","ranges":[{"startOffset":472,"endOffset":570,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":573,"endOffset":686,"count":0}],"isBlockCoverage":false}]},{"scriptId":"512","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_ref_is_initial.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":773,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":216,"endOffset":406,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_ref_is_initial","ranges":[{"startOffset":410,"endOffset":508,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":511,"endOffset":624,"count":0}],"isBlockCoverage":false}]},{"scriptId":"513","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_strg_par_val.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":759,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":212,"endOffset":400,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_strg_par_val","ranges":[{"startOffset":404,"endOffset":502,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":505,"endOffset":618,"count":0}],"isBlockCoverage":false}]},{"scriptId":"514","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_attributes.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":887,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":237,"endOffset":508,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_struct_attributes","ranges":[{"startOffset":512,"endOffset":610,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":613,"endOffset":726,"count":0}],"isBlockCoverage":false}]},{"scriptId":"515","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_creation.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":815,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":227,"endOffset":444,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_struct_creation","ranges":[{"startOffset":448,"endOffset":546,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":549,"endOffset":662,"count":0}],"isBlockCoverage":false}]},{"scriptId":"516","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_type_creation.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":766,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":214,"endOffset":403,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_type_creation","ranges":[{"startOffset":407,"endOffset":505,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":508,"endOffset":621,"count":0}],"isBlockCoverage":false}]},{"scriptId":"517","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_comp_name.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":880,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":235,"endOffset":505,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_struct_comp_name","ranges":[{"startOffset":509,"endOffset":607,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":610,"endOffset":723,"count":0}],"isBlockCoverage":false}]},{"scriptId":"518","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_comp_type.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":880,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":235,"endOffset":505,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_struct_comp_type","ranges":[{"startOffset":509,"endOffset":607,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":610,"endOffset":723,"count":0}],"isBlockCoverage":false}]},{"scriptId":"519","url":"file:///home/runner/work/abapGit/abapGit/output/cx_sy_zerodivide.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":789,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":438,"count":1}],"isBlockCoverage":true},{"functionName":"cx_sy_zerodivide","ranges":[{"startOffset":442,"endOffset":540,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":543,"endOffset":656,"count":0}],"isBlockCoverage":false}]},{"scriptId":"520","url":"file:///home/runner/work/abapGit/abapGit/output/cx_transformation_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":794,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":415,"count":1}],"isBlockCoverage":true},{"functionName":"cx_transformation_error","ranges":[{"startOffset":419,"endOffset":517,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":520,"endOffset":633,"count":0}],"isBlockCoverage":false}]},{"scriptId":"521","url":"file:///home/runner/work/abapGit/abapGit/output/cx_uuid_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":721,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":199,"endOffset":382,"count":1}],"isBlockCoverage":true},{"functionName":"cx_uuid_error","ranges":[{"startOffset":386,"endOffset":484,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":487,"endOffset":600,"count":0}],"isBlockCoverage":false}]},{"scriptId":"522","url":"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_exception.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":799,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":231,"endOffset":444,"count":1}],"isBlockCoverage":true},{"functionName":"cx_xslt_exception","ranges":[{"startOffset":448,"endOffset":546,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":549,"endOffset":662,"count":0}],"isBlockCoverage":false}]},{"scriptId":"523","url":"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_format_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":967,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":228,"endOffset":600,"count":1}],"isBlockCoverage":true},{"functionName":"cx_xslt_format_error","ranges":[{"startOffset":604,"endOffset":702,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":705,"endOffset":818,"count":0}],"isBlockCoverage":false}]},{"scriptId":"524","url":"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_system_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":854,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":219,"endOffset":487,"count":1}],"isBlockCoverage":true},{"functionName":"cx_xslt_system_error","ranges":[{"startOffset":491,"endOffset":589,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":592,"endOffset":705,"count":0}],"isBlockCoverage":false}]},{"scriptId":"525","url":"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_runtime_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":827,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":239,"endOffset":456,"count":1}],"isBlockCoverage":true},{"functionName":"cx_xslt_runtime_error","ranges":[{"startOffset":460,"endOffset":558,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":561,"endOffset":674,"count":0}],"isBlockCoverage":false}]},{"scriptId":"526","url":"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_serialization_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1016,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":242,"endOffset":621,"count":1}],"isBlockCoverage":true},{"functionName":"cx_xslt_serialization_error","ranges":[{"startOffset":625,"endOffset":723,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":726,"endOffset":839,"count":0}],"isBlockCoverage":false}]},{"scriptId":"527","url":"file:///home/runner/work/abapGit/abapGit/output/dats.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":145,"count":1}],"isBlockCoverage":true}]},{"scriptId":"528","url":"file:///home/runner/work/abapGit/abapGit/output/dd02l.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":544,"count":1}],"isBlockCoverage":true}]},{"scriptId":"529","url":"file:///home/runner/work/abapGit/abapGit/output/dd09l.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":541,"count":1}],"isBlockCoverage":true}]},{"scriptId":"530","url":"file:///home/runner/work/abapGit/abapGit/output/ddfields.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2321,"count":1}],"isBlockCoverage":true}]},{"scriptId":"531","url":"file:///home/runner/work/abapGit/abapGit/output/ddoption.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":188,"count":1}],"isBlockCoverage":true}]},{"scriptId":"532","url":"file:///home/runner/work/abapGit/abapGit/output/ddsign.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":180,"count":1}],"isBlockCoverage":true}]},{"scriptId":"533","url":"file:///home/runner/work/abapGit/abapGit/output/devclass.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"534","url":"file:///home/runner/work/abapGit/abapGit/output/dfies.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2147,"count":1}],"isBlockCoverage":true}]},{"scriptId":"535","url":"file:///home/runner/work/abapGit/abapGit/output/dokhl.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":844,"count":1}],"isBlockCoverage":true}]},{"scriptId":"536","url":"file:///home/runner/work/abapGit/abapGit/output/dokil.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":551,"count":1}],"isBlockCoverage":true}]},{"scriptId":"537","url":"file:///home/runner/work/abapGit/abapGit/output/dokstate.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":194,"count":1}],"isBlockCoverage":true}]},{"scriptId":"538","url":"file:///home/runner/work/abapGit/abapGit/output/doku_obj.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"539","url":"file:///home/runner/work/abapGit/abapGit/output/dynprofld.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":281,"count":1}],"isBlockCoverage":true}]},{"scriptId":"540","url":"file:///home/runner/work/abapGit/abapGit/output/fieldname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"541","url":"file:///home/runner/work/abapGit/abapGit/output/file_table.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"542","url":"file:///home/runner/work/abapGit/abapGit/output/filetable.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":363,"count":1}],"isBlockCoverage":true}]},{"scriptId":"543","url":"file:///home/runner/work/abapGit/abapGit/output/flag.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":182,"count":1}],"isBlockCoverage":true}]},{"scriptId":"544","url":"file:///home/runner/work/abapGit/abapGit/output/funcname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"545","url":"file:///home/runner/work/abapGit/abapGit/output/guid.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":143,"count":1}],"isBlockCoverage":true}]},{"scriptId":"546","url":"file:///home/runner/work/abapGit/abapGit/output/icon.type.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7126,"count":1}],"isBlockCoverage":true}]},{"scriptId":"547","url":"file:///home/runner/work/abapGit/abapGit/output/icon_d.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":188,"count":1}],"isBlockCoverage":true}]},{"scriptId":"548","url":"file:///home/runner/work/abapGit/abapGit/output/if_abap_channel_types.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1545,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":145,"count":1}],"isBlockCoverage":true}]},{"scriptId":"549","url":"file:///home/runner/work/abapGit/abapGit/output/if_abap_conv_in.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":523,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":393,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":197,"endOffset":261,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":303,"endOffset":369,"count":0}],"isBlockCoverage":false}]},{"scriptId":"550","url":"file:///home/runner/work/abapGit/abapGit/output/if_abap_conv_out.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":529,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":395,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":199,"endOffset":265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":307,"endOffset":371,"count":0}],"isBlockCoverage":false}]},{"scriptId":"551","url":"file:///home/runner/work/abapGit/abapGit/output/if_abap_unit_constant.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1740,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":729,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":142,"endOffset":386,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":464,"endOffset":648,"count":0}],"isBlockCoverage":false}]},{"scriptId":"552","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_tcp_frame_types.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1381,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":621,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":162,"endOffset":222,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":320,"endOffset":380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":480,"endOffset":540,"count":0}],"isBlockCoverage":false}]},{"scriptId":"553","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_binding_manager.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":577,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":403,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":247,"endOffset":289,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":337,"endOffset":379,"count":0}],"isBlockCoverage":false}]},{"scriptId":"554","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_client.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":621,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":483,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":319,"endOffset":459,"count":0}],"isBlockCoverage":false}]},{"scriptId":"555","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_event_handler.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":693,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":527,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":273,"endOffset":397,"count":0}],"isBlockCoverage":false}]},{"scriptId":"556","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_extension.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1314,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":65,"endOffset":1164,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":211,"endOffset":349,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":402,"endOffset":542,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":640,"endOffset":764,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":817,"endOffset":957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1002,"endOffset":1140,"count":0}],"isBlockCoverage":false}]},{"scriptId":"557","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_initial_request.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1411,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":1237,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":241,"endOffset":301,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":345,"endOffset":727,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":831,"endOffset":1213,"count":0}],"isBlockCoverage":false}]},{"scriptId":"558","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_message.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":735,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":61,"endOffset":593,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":209,"endOffset":275,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":373,"endOffset":409,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":505,"endOffset":569,"count":0}],"isBlockCoverage":false}]},{"scriptId":"559","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_message_manager.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":769,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":595,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":230,"endOffset":354,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":447,"endOffset":571,"count":0}],"isBlockCoverage":false}]},{"scriptId":"560","url":"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_server_context.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":829,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75,"endOffset":659,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":240,"endOffset":380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":495,"endOffset":635,"count":0}],"isBlockCoverage":false}]},{"scriptId":"561","url":"file:///home/runner/work/abapGit/abapGit/output/if_aunit_constants.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3432,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":61,"endOffset":1581,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":130,"endOffset":193,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":275,"endOffset":338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":417,"endOffset":480,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":563,"endOffset":626,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":849,"endOffset":912,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":994,"endOffset":1238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1316,"endOffset":1500,"count":0}],"isBlockCoverage":false}]},{"scriptId":"562","url":"file:///home/runner/work/abapGit/abapGit/output/if_document_bcs.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":263,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":133,"count":1}],"isBlockCoverage":true}]},{"scriptId":"563","url":"file:///home/runner/work/abapGit/abapGit/output/if_ftd_input_arguments.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":601,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":443,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":227,"endOffset":300,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":340,"endOffset":419,"count":0}],"isBlockCoverage":false}]},{"scriptId":"564","url":"file:///home/runner/work/abapGit/abapGit/output/if_ftd_input_config_setter.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":594,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":420,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":254,"endOffset":396,"count":0}],"isBlockCoverage":false}]},{"scriptId":"565","url":"file:///home/runner/work/abapGit/abapGit/output/if_ftd_invocation_answer.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":717,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":551,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":217,"endOffset":349,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":391,"endOffset":527,"count":0}],"isBlockCoverage":false}]},{"scriptId":"566","url":"file:///home/runner/work/abapGit/abapGit/output/if_ftd_invocation_result.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":564,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":398,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":232,"endOffset":374,"count":0}],"isBlockCoverage":false}]},{"scriptId":"567","url":"file:///home/runner/work/abapGit/abapGit/output/if_ftd_output_config_setter.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":745,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":79,"endOffset":567,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":223,"endOffset":365,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":407,"endOffset":543,"count":0}],"isBlockCoverage":false}]},{"scriptId":"568","url":"file:///home/runner/work/abapGit/abapGit/output/if_ftd_output_configuration.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":782,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":79,"endOffset":604,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":235,"endOffset":377,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":417,"endOffset":496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":537,"endOffset":580,"count":0}],"isBlockCoverage":false}]},{"scriptId":"569","url":"file:///home/runner/work/abapGit/abapGit/output/if_function_test_environment.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1165,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":81,"endOffset":593,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":226,"endOffset":358,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":407,"endOffset":511,"count":0}],"isBlockCoverage":false}]},{"scriptId":"570","url":"file:///home/runner/work/abapGit/abapGit/output/if_function_testdouble.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":560,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":402,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":238,"endOffset":378,"count":0}],"isBlockCoverage":false}]},{"scriptId":"571","url":"file:///home/runner/work/abapGit/abapGit/output/if_http_client.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2541,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":53,"endOffset":2137,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":127,"endOffset":245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":327,"endOffset":447,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":545,"endOffset":605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":705,"endOffset":765,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":850,"endOffset":910,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":994,"endOffset":1054,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1218,"endOffset":1315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1359,"endOffset":1423,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1467,"endOffset":1531,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1671,"endOffset":1731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1946,"endOffset":2006,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2049,"endOffset":2113,"count":0}],"isBlockCoverage":false}]},{"scriptId":"572","url":"file:///home/runner/work/abapGit/abapGit/output/if_http_entity.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13970,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":53,"endOffset":13333,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":141,"endOffset":205,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":301,"endOffset":365,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":466,"endOffset":526,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":671,"endOffset":735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":777,"endOffset":837,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":879,"endOffset":939,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1030,"endOffset":1096,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1196,"endOffset":1260,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1300,"endOffset":1364,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1463,"endOffset":1527,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1568,"endOffset":1632,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1732,"endOffset":2114,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2272,"endOffset":2388,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2447,"endOffset":2544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2639,"endOffset":2681,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2779,"endOffset":2843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2883,"endOffset":2947,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3039,"endOffset":3103,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3201,"endOffset":3265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3384,"endOffset":3444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3493,"endOffset":3553,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3660,"endOffset":3724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3815,"endOffset":3881,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3983,"endOffset":4365,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4458,"endOffset":4524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4621,"endOffset":4664,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4770,"endOffset":4834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4881,"endOffset":4945,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4991,"endOffset":5055,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5102,"endOffset":5166,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5208,"endOffset":5268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5364,"endOffset":5428,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5472,"endOffset":5532,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5574,"endOffset":5634,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5676,"endOffset":5736,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5830,"endOffset":5896,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5938,"endOffset":5998,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6040,"endOffset":6100,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6203,"endOffset":6267,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6307,"endOffset":6371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6471,"endOffset":6535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6642,"endOffset":6706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6801,"endOffset":6867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6960,"endOffset":7024,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7064,"endOffset":7128,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7169,"endOffset":7233,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7275,"endOffset":7339,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7382,"endOffset":7446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7488,"endOffset":7548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7654,"endOffset":7718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7765,"endOffset":7829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7876,"endOffset":7940,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7986,"endOffset":8050,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8092,"endOffset":8152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8257,"endOffset":8317,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8432,"endOffset":8492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8541,"endOffset":8601,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8643,"endOffset":9025,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9126,"endOffset":9190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9230,"endOffset":9294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9348,"endOffset":9408,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9457,"endOffset":9517,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9612,"endOffset":9672,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9770,"endOffset":9886,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9927,"endOffset":9987,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10084,"endOffset":10144,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10240,"endOffset":10300,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10393,"endOffset":10457,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10497,"endOffset":10561,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10602,"endOffset":10666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10708,"endOffset":10772,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10815,"endOffset":10879,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10921,"endOffset":10981,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11100,"endOffset":11160,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11257,"endOffset":11321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11362,"endOffset":11426,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11526,"endOffset":11908,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11954,"endOffset":12017,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12119,"endOffset":12501,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12609,"endOffset":12706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12802,"endOffset":12866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12906,"endOffset":12970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13072,"endOffset":13136,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13245,"endOffset":13309,"count":0}],"isBlockCoverage":false}]},{"scriptId":"573","url":"file:///home/runner/work/abapGit/abapGit/output/if_http_extension.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1247,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":785,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":133,"endOffset":193,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":277,"endOffset":337,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":433,"endOffset":493,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":645,"endOffset":761,"count":0}],"isBlockCoverage":false}]},{"scriptId":"574","url":"file:///home/runner/work/abapGit/abapGit/output/if_http_request.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4529,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":3696,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":145,"endOffset":209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":306,"endOffset":370,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":465,"endOffset":529,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":625,"endOffset":689,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":799,"endOffset":863,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":974,"endOffset":1038,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1154,"endOffset":1214,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1362,"endOffset":1426,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1519,"endOffset":1583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1680,"endOffset":1744,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1849,"endOffset":1909,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1953,"endOffset":2017,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2061,"endOffset":2125,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2215,"endOffset":2333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2438,"endOffset":2498,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2542,"endOffset":2606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2650,"endOffset":2714,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2810,"endOffset":2874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2914,"endOffset":2957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3055,"endOffset":3121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3222,"endOffset":3286,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3326,"endOffset":3390,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3498,"endOffset":3558,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3612,"endOffset":3672,"count":0}],"isBlockCoverage":false}]},{"scriptId":"575","url":"file:///home/runner/work/abapGit/abapGit/output/if_http_response.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4429,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":4295,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":160,"endOffset":224,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":335,"endOffset":399,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":515,"endOffset":575,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":721,"endOffset":781,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":823,"endOffset":887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":980,"endOffset":1040,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1082,"endOffset":1146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1252,"endOffset":1316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1356,"endOffset":1420,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1462,"endOffset":1526,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1616,"endOffset":1680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1727,"endOffset":1787,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1841,"endOffset":1901,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1992,"endOffset":2112,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2210,"endOffset":2276,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2394,"endOffset":2487,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2605,"endOffset":2662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2714,"endOffset":2771,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2811,"endOffset":2903,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2956,"endOffset":3049,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3097,"endOffset":3190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3300,"endOffset":3392,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3445,"endOffset":3538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3586,"endOffset":3679,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3792,"endOffset":3852,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3892,"endOffset":3984,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4037,"endOffset":4130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4178,"endOffset":4271,"count":0}],"isBlockCoverage":false}]},{"scriptId":"576","url":"file:///home/runner/work/abapGit/abapGit/output/if_http_server.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11885,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":53,"endOffset":10853,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":130,"endOffset":194,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":289,"endOffset":349,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":431,"endOffset":551,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":632,"endOffset":750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":842,"endOffset":902,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1006,"endOffset":1066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1151,"endOffset":1211,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1295,"endOffset":1355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1447,"endOffset":1494,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1591,"endOffset":1638,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1799,"endOffset":1896,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1948,"endOffset":2045,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2093,"endOffset":2157,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2264,"endOffset":2324,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2364,"endOffset":2428,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2527,"endOffset":2591,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2632,"endOffset":2696,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2735,"endOffset":2799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2895,"endOffset":2959,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3003,"endOffset":3067,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3107,"endOffset":3171,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3211,"endOffset":3275,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3315,"endOffset":3379,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3426,"endOffset":3490,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3586,"endOffset":3650,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3690,"endOffset":3754,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3801,"endOffset":3865,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3964,"endOffset":4028,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4071,"endOffset":4135,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4251,"endOffset":4315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4358,"endOffset":4452,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4509,"endOffset":4606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4662,"endOffset":4726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4825,"endOffset":4889,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4934,"endOffset":4998,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5095,"endOffset":5159,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5204,"endOffset":5268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5364,"endOffset":5428,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5473,"endOffset":5537,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5649,"endOffset":5713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5753,"endOffset":6011,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6122,"endOffset":6186,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6226,"endOffset":6484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6579,"endOffset":6639,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6738,"endOffset":6802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6846,"endOffset":6888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6935,"endOffset":6977,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7023,"endOffset":7065,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7107,"endOffset":7223,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7278,"endOffset":7375,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7415,"endOffset":7479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7519,"endOffset":7583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7631,"endOffset":7695,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7740,"endOffset":7837,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7946,"endOffset":8010,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8054,"endOffset":8096,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8143,"endOffset":8185,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8231,"endOffset":8273,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8315,"endOffset":8431,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8486,"endOffset":8583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8623,"endOffset":8687,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8727,"endOffset":8791,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8839,"endOffset":8903,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8948,"endOffset":9045,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9143,"endOffset":9207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9362,"endOffset":9422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9527,"endOffset":9616,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9667,"endOffset":9756,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9812,"endOffset":9855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9919,"endOffset":9962,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10077,"endOffset":10137,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10184,"endOffset":10248,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10348,"endOffset":10412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10455,"endOffset":10519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10622,"endOffset":10686,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10732,"endOffset":10829,"count":0}],"isBlockCoverage":false}]},{"scriptId":"577","url":"file:///home/runner/work/abapGit/abapGit/output/if_http_utility.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2777,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":2647,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":206,"endOffset":588,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":630,"endOffset":694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":789,"endOffset":849,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":949,"endOffset":1013,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1056,"endOffset":1120,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1163,"endOffset":1223,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1319,"endOffset":1383,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1428,"endOffset":1492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1591,"endOffset":1655,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1700,"endOffset":1764,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1865,"endOffset":1929,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1971,"endOffset":2353,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2452,"endOffset":2516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2559,"endOffset":2623,"count":0}],"isBlockCoverage":false}]},{"scriptId":"578","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2375,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":39,"endOffset":2277,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":186,"endOffset":306,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":412,"endOffset":544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":646,"endOffset":766,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":809,"endOffset":927,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":971,"endOffset":1091,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1189,"endOffset":1305,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1355,"endOffset":1487,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1530,"endOffset":1648,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1692,"endOffset":1812,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1910,"endOffset":2030,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2076,"endOffset":2140,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2189,"endOffset":2253,"count":0}],"isBlockCoverage":false}]},{"scriptId":"579","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_attribute.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1054,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":916,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":154,"endOffset":214,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":313,"endOffset":373,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":517,"endOffset":581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":674,"endOffset":738,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":828,"endOffset":892,"count":0}],"isBlockCoverage":false}]},{"scriptId":"580","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_document.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8544,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":8410,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":152,"endOffset":212,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":311,"endOffset":371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":523,"endOffset":613,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":716,"endOffset":813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":910,"endOffset":1007,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1112,"endOffset":1176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1276,"endOffset":1388,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1487,"endOffset":1599,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1704,"endOffset":1826,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1866,"endOffset":1930,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1972,"endOffset":2036,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2139,"endOffset":2257,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2297,"endOffset":2361,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2403,"endOffset":2467,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2567,"endOffset":2685,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2725,"endOffset":2789,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2895,"endOffset":3025,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3066,"endOffset":3109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3208,"endOffset":3334,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3377,"endOffset":3420,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3463,"endOffset":3506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3604,"endOffset":3734,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3839,"endOffset":3965,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4004,"endOffset":4068,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4174,"endOffset":4292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4332,"endOffset":4396,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4438,"endOffset":4550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4592,"endOffset":4656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4761,"endOffset":4887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4927,"endOffset":4991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5094,"endOffset":5212,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5252,"endOffset":5316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5358,"endOffset":5470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5511,"endOffset":5575,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5675,"endOffset":5793,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5833,"endOffset":5897,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5942,"endOffset":6006,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6109,"endOffset":6227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6268,"endOffset":6328,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6367,"endOffset":6431,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6471,"endOffset":6535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6631,"endOffset":6749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6789,"endOffset":6853,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6962,"endOffset":7096,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7136,"endOffset":7200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7245,"endOffset":7309,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7348,"endOffset":7412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7518,"endOffset":7652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7693,"endOffset":7753,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7793,"endOffset":7857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7902,"endOffset":7966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8057,"endOffset":8169,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8268,"endOffset":8386,"count":0}],"isBlockCoverage":false}]},{"scriptId":"581","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_element.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8066,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":7936,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":150,"endOffset":210,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":309,"endOffset":369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":523,"endOffset":587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":684,"endOffset":816,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":907,"endOffset":1025,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1116,"endOffset":1180,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1273,"endOffset":1333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1378,"endOffset":1490,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1577,"endOffset":1689,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1794,"endOffset":1867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1907,"endOffset":1971,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2068,"endOffset":2198,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2297,"endOffset":2415,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2455,"endOffset":2519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2564,"endOffset":2628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2667,"endOffset":2731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2772,"endOffset":2832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2928,"endOffset":3046,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3086,"endOffset":3150,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3195,"endOffset":3259,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3300,"endOffset":3360,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3460,"endOffset":3582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3622,"endOffset":3686,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3784,"endOffset":3848,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3888,"endOffset":3952,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3991,"endOffset":4055,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4150,"endOffset":4214,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4254,"endOffset":4318,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4363,"endOffset":4427,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4521,"endOffset":4643,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4749,"endOffset":4883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4923,"endOffset":4987,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5096,"endOffset":5230,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5270,"endOffset":5334,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5373,"endOffset":5437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5540,"endOffset":5662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5702,"endOffset":5766,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5805,"endOffset":5869,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5966,"endOffset":6078,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6169,"endOffset":6233,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6332,"endOffset":6396,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6544,"endOffset":6662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6766,"endOffset":6809,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6905,"endOffset":6965,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7005,"endOffset":7069,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7114,"endOffset":7178,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7219,"endOffset":7283,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7382,"endOffset":7446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7488,"endOffset":7552,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7593,"endOffset":7657,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7747,"endOffset":7807,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7848,"endOffset":7912,"count":0}],"isBlockCoverage":false}]},{"scriptId":"582","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_encoding.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":589,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":287,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":142,"endOffset":206,"count":0}],"isBlockCoverage":false}]},{"scriptId":"583","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_istream.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":309,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":179,"count":1}],"isBlockCoverage":true}]},{"scriptId":"584","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_named_node_map.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1688,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":1530,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":221,"endOffset":351,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":443,"endOffset":503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":602,"endOffset":714,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":754,"endOffset":818,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":914,"endOffset":1026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1066,"endOffset":1130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1230,"endOffset":1342,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1442,"endOffset":1506,"count":0}],"isBlockCoverage":false}]},{"scriptId":"585","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4862,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":49,"endOffset":4470,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":131,"endOffset":191,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":277,"endOffset":337,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":490,"endOffset":602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":698,"endOffset":830,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":928,"endOffset":1040,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1134,"endOffset":1256,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1354,"endOffset":1472,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1511,"endOffset":1575,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1723,"endOffset":1835,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1936,"endOffset":2000,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2045,"endOffset":2109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2199,"endOffset":2263,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2354,"endOffset":2414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2503,"endOffset":2600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2695,"endOffset":2759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2850,"endOffset":2914,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3004,"endOffset":3068,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3159,"endOffset":3223,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3325,"endOffset":3389,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3485,"endOffset":3597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3690,"endOffset":3754,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3845,"endOffset":3957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4065,"endOffset":4129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4229,"endOffset":4293,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4386,"endOffset":4446,"count":0}],"isBlockCoverage":false}]},{"scriptId":"586","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node_collection.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":688,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":526,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":219,"endOffset":349,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":442,"endOffset":502,"count":0}],"isBlockCoverage":false}]},{"scriptId":"587","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node_filter.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":287,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":63,"endOffset":141,"count":1}],"isBlockCoverage":true}]},{"scriptId":"588","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node_iterator.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":548,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":394,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":258,"endOffset":370,"count":0}],"isBlockCoverage":false}]},{"scriptId":"589","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node_list.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1282,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":1144,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":204,"endOffset":264,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":362,"endOffset":492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":582,"endOffset":694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":735,"endOffset":795,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":905,"endOffset":1035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1077,"endOffset":1120,"count":0}],"isBlockCoverage":false}]},{"scriptId":"590","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_ostream.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":682,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":552,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":200,"endOffset":260,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":302,"endOffset":366,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":468,"endOffset":528,"count":0}],"isBlockCoverage":false}]},{"scriptId":"591","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_parse_error.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":748,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":63,"endOffset":602,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":208,"endOffset":272,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":363,"endOffset":423,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":518,"endOffset":578,"count":0}],"isBlockCoverage":false}]},{"scriptId":"592","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_parser.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1732,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":53,"endOffset":1456,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":136,"endOffset":196,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":338,"endOffset":398,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":498,"endOffset":595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":690,"endOffset":750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":911,"endOffset":1037,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1078,"endOffset":1138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1235,"endOffset":1332,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1372,"endOffset":1432,"count":0}],"isBlockCoverage":false}]},{"scriptId":"593","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_renderer.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":611,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":477,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":196,"endOffset":256,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":356,"endOffset":453,"count":0}],"isBlockCoverage":false}]},{"scriptId":"594","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_stream_factory.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2005,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":1847,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":226,"endOffset":344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":386,"endOffset":450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":557,"endOffset":675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":717,"endOffset":783,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":889,"endOffset":1007,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1046,"endOffset":1110,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1217,"endOffset":1335,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1374,"endOffset":1440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1544,"endOffset":1662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1703,"endOffset":1823,"count":0}],"isBlockCoverage":false}]},{"scriptId":"595","url":"file:///home/runner/work/abapGit/abapGit/output/if_ixml_unknown.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":574,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":444,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":203,"endOffset":321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":360,"endOffset":420,"count":0}],"isBlockCoverage":false}]},{"scriptId":"596","url":"file:///home/runner/work/abapGit/abapGit/output/if_message.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":697,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":45,"endOffset":587,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":188,"endOffset":252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":349,"endOffset":413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":466,"endOffset":563,"count":0}],"isBlockCoverage":false}]},{"scriptId":"597","url":"file:///home/runner/work/abapGit/abapGit/output/if_mr_api.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11389,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":43,"endOffset":11283,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":187,"endOffset":293,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":337,"endOffset":379,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":466,"endOffset":508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":561,"endOffset":658,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":705,"endOffset":802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":847,"endOffset":913,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":960,"endOffset":1002,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1044,"endOffset":1664,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1710,"endOffset":1799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1896,"endOffset":1938,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1984,"endOffset":2073,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2122,"endOffset":2164,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2217,"endOffset":2314,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2375,"endOffset":2472,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2521,"endOffset":2617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2662,"endOffset":2759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2808,"endOffset":2900,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2949,"endOffset":3569,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3623,"endOffset":3720,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3767,"endOffset":4387,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4474,"endOffset":4516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4561,"endOffset":4627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4673,"endOffset":4762,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4811,"endOffset":4853,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4906,"endOffset":5003,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5064,"endOffset":5161,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5210,"endOffset":5306,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5351,"endOffset":5448,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5497,"endOffset":5589,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5635,"endOffset":6255,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6309,"endOffset":6406,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6496,"endOffset":6538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6591,"endOffset":6688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6741,"endOffset":6838,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6887,"endOffset":6979,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7033,"endOffset":7130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7223,"endOffset":7265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7317,"endOffset":7414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7467,"endOffset":7564,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7607,"endOffset":7865,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7959,"endOffset":8001,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8054,"endOffset":8151,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8198,"endOffset":8295,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8342,"endOffset":8384,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8426,"endOffset":8490,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8532,"endOffset":8592,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8638,"endOffset":8735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8777,"endOffset":9397,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9439,"endOffset":10059,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10105,"endOffset":10194,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10249,"endOffset":10313,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10411,"endOffset":10453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10500,"endOffset":10597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10639,"endOffset":11259,"count":0}],"isBlockCoverage":false}]},{"scriptId":"598","url":"file:///home/runner/work/abapGit/abapGit/output/if_oo_adt_classrun.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":495,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":61,"endOffset":353,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":197,"endOffset":329,"count":0}],"isBlockCoverage":false}]},{"scriptId":"599","url":"file:///home/runner/work/abapGit/abapGit/output/if_oo_adt_classrun_out.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1049,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":891,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":209,"endOffset":341,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":381,"endOffset":424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":464,"endOffset":528,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":616,"endOffset":680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":720,"endOffset":763,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":803,"endOffset":867,"count":0}],"isBlockCoverage":false}]},{"scriptId":"600","url":"file:///home/runner/work/abapGit/abapGit/output/if_oo_clif_source.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":624,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":486,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":204,"endOffset":462,"count":0}],"isBlockCoverage":false}]},{"scriptId":"601","url":"file:///home/runner/work/abapGit/abapGit/output/if_osql_test_environment.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1078,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":478,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":334,"endOffset":454,"count":0}],"isBlockCoverage":false}]},{"scriptId":"602","url":"file:///home/runner/work/abapGit/abapGit/output/if_package.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4674,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":45,"endOffset":4564,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":125,"endOffset":172,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":264,"endOffset":328,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":423,"endOffset":487,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":576,"endOffset":640,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":724,"endOffset":788,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":943,"endOffset":1035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1191,"endOffset":1288,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1393,"endOffset":1446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1557,"endOffset":2586,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2688,"endOffset":2747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2802,"endOffset":2894,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2947,"endOffset":3044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3099,"endOffset":3191,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3302,"endOffset":3345,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3392,"endOffset":3435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3552,"endOffset":3649,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3702,"endOffset":3799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3860,"endOffset":3957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4014,"endOffset":4057,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4171,"endOffset":4247,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4368,"endOffset":4411,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4463,"endOffset":4540,"count":0}],"isBlockCoverage":false}]},{"scriptId":"603","url":"file:///home/runner/work/abapGit/abapGit/output/if_recipient_bcs.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":269,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":135,"count":1}],"isBlockCoverage":true}]},{"scriptId":"604","url":"file:///home/runner/work/abapGit/abapGit/output/if_salv_c_bool_sap.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1031,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":61,"endOffset":486,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":132,"endOffset":229,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":308,"endOffset":405,"count":0}],"isBlockCoverage":false}]},{"scriptId":"605","url":"file:///home/runner/work/abapGit/abapGit/output/if_salv_c_selection_mode.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1869,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":849,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":144,"endOffset":204,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":286,"endOffset":346,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":424,"endOffset":484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":568,"endOffset":628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":708,"endOffset":768,"count":0}],"isBlockCoverage":false}]},{"scriptId":"606","url":"file:///home/runner/work/abapGit/abapGit/output/if_sender_bcs.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":251,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":51,"endOffset":129,"count":1}],"isBlockCoverage":true}]},{"scriptId":"607","url":"file:///home/runner/work/abapGit/abapGit/output/if_serializable_object.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":305,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":147,"count":1}],"isBlockCoverage":true}]},{"scriptId":"608","url":"file:///home/runner/work/abapGit/abapGit/output/if_shm_build_instance.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":630,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":476,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":210,"endOffset":316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":367,"endOffset":452,"count":0}],"isBlockCoverage":false}]},{"scriptId":"609","url":"file:///home/runner/work/abapGit/abapGit/output/if_shm_trace.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13232,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":49,"endOffset":13114,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":123,"endOffset":1504,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1666,"endOffset":1772,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1817,"endOffset":1923,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1965,"endOffset":2064,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2104,"endOffset":2178,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2223,"endOffset":2283,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2392,"endOffset":2498,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2543,"endOffset":2649,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2691,"endOffset":2790,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2830,"endOffset":2904,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2949,"endOffset":3009,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3047,"endOffset":3145,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3255,"endOffset":3361,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3406,"endOffset":3512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3554,"endOffset":3653,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3693,"endOffset":3767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3812,"endOffset":3872,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3982,"endOffset":4088,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4133,"endOffset":4239,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4281,"endOffset":4380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4420,"endOffset":4494,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4539,"endOffset":4599,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4637,"endOffset":4735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4843,"endOffset":4949,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4994,"endOffset":5100,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5142,"endOffset":5241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5349,"endOffset":5455,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5500,"endOffset":5606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5648,"endOffset":5747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5785,"endOffset":5883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5981,"endOffset":6087,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6132,"endOffset":6238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6336,"endOffset":6442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6487,"endOffset":6593,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6631,"endOffset":6729,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6830,"endOffset":6936,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6981,"endOffset":7087,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7127,"endOffset":7217,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7318,"endOffset":7424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7469,"endOffset":7575,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7615,"endOffset":7705,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7743,"endOffset":7841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7945,"endOffset":8051,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8093,"endOffset":8192,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8230,"endOffset":8295,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8397,"endOffset":8503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8545,"endOffset":8644,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8697,"endOffset":8794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8843,"endOffset":8919,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8957,"endOffset":9022,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9128,"endOffset":9234,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9279,"endOffset":9385,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9427,"endOffset":9526,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9579,"endOffset":9676,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9725,"endOffset":9801,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9839,"endOffset":9904,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10015,"endOffset":10121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10166,"endOffset":10272,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10314,"endOffset":10413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10454,"endOffset":10919,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11027,"endOffset":11133,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11175,"endOffset":11274,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11312,"endOffset":11377,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11426,"endOffset":11502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11555,"endOffset":11652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11764,"endOffset":11870,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11915,"endOffset":12021,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12063,"endOffset":12162,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12215,"endOffset":12312,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12361,"endOffset":12437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12475,"endOffset":12540,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12641,"endOffset":12747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12848,"endOffset":12954,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12992,"endOffset":13090,"count":0}],"isBlockCoverage":false}]},{"scriptId":"610","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1512,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":39,"endOffset":783,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":117,"endOffset":200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":286,"endOffset":369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":452,"endOffset":535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":619,"endOffset":702,"count":0}],"isBlockCoverage":false}]},{"scriptId":"611","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml_attribute.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1151,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":663,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":131,"endOffset":261,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":345,"endOffset":429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":575,"endOffset":639,"count":0}],"isBlockCoverage":false}]},{"scriptId":"612","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml_close_element.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1596,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":1442,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":139,"endOffset":269,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":360,"endOffset":442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":547,"endOffset":629,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":735,"endOffset":817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":915,"endOffset":997,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1099,"endOffset":1181,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1279,"endOffset":1361,"count":0}],"isBlockCoverage":false}]},{"scriptId":"613","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml_node.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2159,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":49,"endOffset":1137,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":120,"endOffset":202,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":294,"endOffset":376,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":469,"endOffset":551,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":636,"endOffset":718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":807,"endOffset":889,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":974,"endOffset":1056,"count":0}],"isBlockCoverage":false}]},{"scriptId":"614","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml_open_element.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2016,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":65,"endOffset":1866,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":137,"endOffset":267,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":358,"endOffset":440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":545,"endOffset":627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":733,"endOffset":815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":913,"endOffset":995,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1097,"endOffset":1179,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1277,"endOffset":1359,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1509,"endOffset":1842,"count":0}],"isBlockCoverage":false}]},{"scriptId":"615","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml_reader.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1487,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":53,"endOffset":1361,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":129,"endOffset":211,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":289,"endOffset":353,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":432,"endOffset":496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":646,"endOffset":758,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":856,"endOffset":940,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1043,"endOffset":1127,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1221,"endOffset":1337,"count":0}],"isBlockCoverage":false}]},{"scriptId":"616","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml_value.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":670,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":51,"endOffset":293,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":128,"endOffset":212,"count":0}],"isBlockCoverage":false}]},{"scriptId":"617","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml_value_node.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1520,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":61,"endOffset":1378,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":145,"endOffset":227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":332,"endOffset":414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":520,"endOffset":602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":700,"endOffset":782,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":884,"endOffset":966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1064,"endOffset":1146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1290,"endOffset":1354,"count":0}],"isBlockCoverage":false}]},{"scriptId":"618","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxml_writer.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4445,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":53,"endOffset":2877,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":138,"endOffset":198,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":287,"endOffset":347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":446,"endOffset":506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":597,"endOffset":657,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":744,"endOffset":804,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":904,"endOffset":964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1065,"endOffset":1125,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1229,"endOffset":1289,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1382,"endOffset":1442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1590,"endOffset":1654,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1695,"endOffset":1759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1801,"endOffset":1865,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2021,"endOffset":2085,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2126,"endOffset":2190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2232,"endOffset":2296,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2337,"endOffset":2401,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2496,"endOffset":2560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2655,"endOffset":2715,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2756,"endOffset":2853,"count":0}],"isBlockCoverage":false}]},{"scriptId":"619","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxmlp_factory.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":788,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":654,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":201,"endOffset":315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":355,"endOffset":419,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":460,"endOffset":524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":566,"endOffset":630,"count":0}],"isBlockCoverage":false}]},{"scriptId":"620","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxmlp_list.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":452,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":51,"endOffset":330,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":192,"endOffset":306,"count":0}],"isBlockCoverage":false}]},{"scriptId":"621","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxmlp_part.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":457,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":51,"endOffset":335,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":195,"endOffset":311,"count":0}],"isBlockCoverage":false}]},{"scriptId":"622","url":"file:///home/runner/work/abapGit/abapGit/output/if_sxmlp_simple.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":263,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":133,"count":1}],"isBlockCoverage":true}]},{"scriptId":"623","url":"file:///home/runner/work/abapGit/abapGit/output/if_system_uuid_rfc4122_static.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":657,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83,"endOffset":471,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":242,"endOffset":344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":387,"endOffset":447,"count":0}],"isBlockCoverage":false}]},{"scriptId":"624","url":"file:///home/runner/work/abapGit/abapGit/output/if_system_uuid_static.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":641,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":487,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":215,"endOffset":263,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":361,"endOffset":463,"count":0}],"isBlockCoverage":false}]},{"scriptId":"625","url":"file:///home/runner/work/abapGit/abapGit/output/if_t100_dyn_msg.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1115,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":985,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":127,"endOffset":220,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":299,"endOffset":391,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":470,"endOffset":562,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":641,"endOffset":733,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":812,"endOffset":904,"count":0}],"isBlockCoverage":false}]},{"scriptId":"626","url":"file:///home/runner/work/abapGit/abapGit/output/if_t100_message.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2198,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":1130,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":129,"endOffset":471,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":559,"endOffset":1049,"count":0}],"isBlockCoverage":false}]},{"scriptId":"627","url":"file:///home/runner/work/abapGit/abapGit/output/ihttpnvp.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":258,"count":1}],"isBlockCoverage":true}]},{"scriptId":"628","url":"file:///home/runner/work/abapGit/abapGit/output/int1.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":158,"count":1}],"isBlockCoverage":true}]},{"scriptId":"629","url":"file:///home/runner/work/abapGit/abapGit/output/int2.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":158,"count":1}],"isBlockCoverage":true}]},{"scriptId":"630","url":"file:///home/runner/work/abapGit/abapGit/output/int4.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":158,"count":1}],"isBlockCoverage":true}]},{"scriptId":"631","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_authority_check.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":858,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":335,"count":1}],"isBlockCoverage":true},{"functionName":"kernel_authority_check","ranges":[{"startOffset":339,"endOffset":424,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":427,"endOffset":540,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":543,"endOffset":603,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":613,"endOffset":701,"count":0}],"isBlockCoverage":false}]},{"scriptId":"632","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_call.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1246,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":101,"endOffset":384,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":317,"endOffset":360,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_call","ranges":[{"startOffset":388,"endOffset":473,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":476,"endOffset":589,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":592,"endOffset":651,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":661,"endOffset":1133,"count":0}],"isBlockCoverage":false}]},{"scriptId":"633","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_call_transformation.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":18292,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":193,"endOffset":1500,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":359,"endOffset":479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":562,"endOffset":678,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":825,"endOffset":889,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":988,"endOffset":1061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1166,"endOffset":1230,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1272,"endOffset":1345,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1433,"endOffset":1476,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_call_transformation","ranges":[{"startOffset":1504,"endOffset":1701,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1704,"endOffset":1817,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":1820,"endOffset":1894,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":1904,"endOffset":8840,"count":12},{"startOffset":1999,"endOffset":2021,"count":0},{"startOffset":3619,"endOffset":3652,"count":11},{"startOffset":3709,"endOffset":3740,"count":1},{"startOffset":3792,"endOffset":4646,"count":1},{"startOffset":4014,"endOffset":4640,"count":0},{"startOffset":4688,"endOffset":4741,"count":0},{"startOffset":4743,"endOffset":4795,"count":0},{"startOffset":4874,"endOffset":5908,"count":0},{"startOffset":5937,"endOffset":5985,"count":0},{"startOffset":5987,"endOffset":6030,"count":0},{"startOffset":6095,"endOffset":7173,"count":0},{"startOffset":7222,"endOffset":7280,"count":11},{"startOffset":7282,"endOffset":7547,"count":0},{"startOffset":7607,"endOffset":7965,"count":11},{"startOffset":7965,"endOffset":8824,"count":1},{"startOffset":8150,"endOffset":8243,"count":0},{"startOffset":8425,"endOffset":8603,"count":0}],"isBlockCoverage":true},{"functionName":"traverse_write_type","ranges":[{"startOffset":8855,"endOffset":8983,"count":0}],"isBlockCoverage":false},{"functionName":"traverse_write_type","ranges":[{"startOffset":9005,"endOffset":10413,"count":0}],"isBlockCoverage":false},{"functionName":"traverse_write","ranges":[{"startOffset":10428,"endOffset":10546,"count":0}],"isBlockCoverage":false},{"functionName":"traverse_write","ranges":[{"startOffset":10568,"endOffset":15962,"count":0}],"isBlockCoverage":false},{"functionName":"parse_xml","ranges":[{"startOffset":15977,"endOffset":16085,"count":0}],"isBlockCoverage":false},{"functionName":"parse_xml","ranges":[{"startOffset":16107,"endOffset":17788,"count":1}],"isBlockCoverage":true}]},{"scriptId":"634","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_call_transformation.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15393,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":124,"endOffset":984,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":308,"endOffset":368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":449,"endOffset":513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":653,"endOffset":717,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":759,"endOffset":802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":896,"endOffset":960,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_heap","ranges":[{"startOffset":988,"endOffset":1210,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1213,"endOffset":1326,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":1329,"endOffset":1991,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":1994,"endOffset":7349,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7455,"endOffset":8622,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7649,"endOffset":7788,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7940,"endOffset":8079,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8169,"endOffset":8233,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8276,"endOffset":8318,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8360,"endOffset":8433,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8534,"endOffset":8598,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_data_to_xml","ranges":[{"startOffset":8628,"endOffset":8865,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8870,"endOffset":9345,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_heap","ranges":[{"startOffset":9350,"endOffset":9528,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":9533,"endOffset":15200,"count":0}],"isBlockCoverage":false}]},{"scriptId":"635","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_create_data_handle.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13418,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":1897,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":360,"endOffset":478,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":518,"endOffset":591,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":682,"endOffset":800,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":840,"endOffset":913,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1003,"endOffset":1121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1161,"endOffset":1234,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1322,"endOffset":1440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1480,"endOffset":1553,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1642,"endOffset":1760,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1800,"endOffset":1873,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_create_data_handle","ranges":[{"startOffset":1901,"endOffset":1986,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1989,"endOffset":2102,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":2105,"endOffset":2178,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":2188,"endOffset":3449,"count":157},{"startOffset":2629,"endOffset":2670,"count":0},{"startOffset":2791,"endOffset":2851,"count":102},{"startOffset":2851,"endOffset":3445,"count":55},{"startOffset":2936,"endOffset":2998,"count":31},{"startOffset":2998,"endOffset":3445,"count":24},{"startOffset":3143,"endOffset":3445,"count":0}],"isBlockCoverage":true},{"functionName":"ref","ranges":[{"startOffset":3452,"endOffset":3523,"count":0}],"isBlockCoverage":false},{"functionName":"ref","ranges":[{"startOffset":3533,"endOffset":4428,"count":0}],"isBlockCoverage":false},{"functionName":"struct","ranges":[{"startOffset":4431,"endOffset":4508,"count":0}],"isBlockCoverage":false},{"functionName":"struct","ranges":[{"startOffset":4518,"endOffset":6585,"count":31},{"startOffset":6289,"endOffset":6533,"count":103}],"isBlockCoverage":true},{"functionName":"table","ranges":[{"startOffset":6588,"endOffset":6663,"count":0}],"isBlockCoverage":false},{"functionName":"table","ranges":[{"startOffset":6673,"endOffset":10478,"count":24},{"startOffset":9702,"endOffset":10393,"count":21},{"startOffset":9892,"endOffset":10051,"count":0},{"startOffset":10264,"endOffset":10387,"count":55}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":9572,"endOffset":9648,"count":21}],"isBlockCoverage":true},{"functionName":"elem","ranges":[{"startOffset":10481,"endOffset":10554,"count":0}],"isBlockCoverage":false},{"functionName":"elem","ranges":[{"startOffset":10564,"endOffset":13249,"count":102},{"startOffset":11082,"endOffset":11147,"count":0},{"startOffset":11236,"endOffset":11306,"count":4},{"startOffset":11306,"endOffset":13245,"count":98},{"startOffset":11396,"endOffset":11467,"count":0},{"startOffset":11553,"endOffset":11618,"count":2},{"startOffset":11618,"endOffset":13245,"count":96},{"startOffset":11705,"endOffset":11770,"count":0},{"startOffset":11856,"endOffset":11951,"count":0},{"startOffset":12040,"endOffset":12169,"count":0},{"startOffset":12513,"endOffset":13245,"count":0}],"isBlockCoverage":true}]},{"scriptId":"636","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_cx_assert.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2670,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":208,"endOffset":1330,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":389,"endOffset":453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":535,"endOffset":599,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":676,"endOffset":740,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":886,"endOffset":950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":994,"endOffset":1092,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1136,"endOffset":1200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1242,"endOffset":1306,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_cx_assert","ranges":[{"startOffset":1334,"endOffset":1635,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1638,"endOffset":2537,"count":3},{"startOffset":1916,"endOffset":1947,"count":0},{"startOffset":2421,"endOffset":2516,"count":0}],"isBlockCoverage":true}]},{"scriptId":"637","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_fugr_test.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":610,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":272,"count":1}],"isBlockCoverage":true},{"functionName":"kernel_fugr_test","ranges":[{"startOffset":276,"endOffset":361,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":364,"endOffset":477,"count":0}],"isBlockCoverage":false}]},{"scriptId":"638","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_internal_name.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3491,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":834,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":358,"endOffset":422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":469,"endOffset":533,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":639,"endOffset":703,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":746,"endOffset":810,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_internal_name","ranges":[{"startOffset":838,"endOffset":923,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":926,"endOffset":1039,"count":0}],"isBlockCoverage":false},{"functionName":"internal_to_rtti","ranges":[{"startOffset":1042,"endOffset":1134,"count":0}],"isBlockCoverage":false},{"functionName":"internal_to_rtti","ranges":[{"startOffset":1144,"endOffset":2105,"count":0}],"isBlockCoverage":false},{"functionName":"rtti_to_internal","ranges":[{"startOffset":2108,"endOffset":2200,"count":0}],"isBlockCoverage":false},{"functionName":"rtti_to_internal","ranges":[{"startOffset":2210,"endOffset":3342,"count":0}],"isBlockCoverage":false}]},{"scriptId":"639","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_ixml_json_to_data.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10026,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":1364,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":368,"endOffset":432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":475,"endOffset":587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":681,"endOffset":793,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":835,"endOffset":908,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":999,"endOffset":1063,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1105,"endOffset":1178,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1220,"endOffset":1340,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_ixml_json_to_data","ranges":[{"startOffset":1368,"endOffset":1453,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1456,"endOffset":1569,"count":0}],"isBlockCoverage":false},{"functionName":"get_field_name","ranges":[{"startOffset":1572,"endOffset":1664,"count":0}],"isBlockCoverage":false},{"functionName":"get_field_name","ranges":[{"startOffset":1674,"endOffset":3096,"count":0}],"isBlockCoverage":false},{"functionName":"build","ranges":[{"startOffset":3099,"endOffset":3173,"count":0}],"isBlockCoverage":false},{"functionName":"build","ranges":[{"startOffset":3183,"endOffset":5080,"count":0}],"isBlockCoverage":false},{"functionName":"traverse","ranges":[{"startOffset":5083,"endOffset":5163,"count":0}],"isBlockCoverage":false},{"functionName":"traverse","ranges":[{"startOffset":5173,"endOffset":9861,"count":0}],"isBlockCoverage":false}]},{"scriptId":"640","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_ixml_xml_to_data.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12784,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":1559,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":289,"endOffset":407,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":554,"endOffset":666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":708,"endOffset":781,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":884,"endOffset":996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1039,"endOffset":1103,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1194,"endOffset":1258,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1300,"endOffset":1373,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1415,"endOffset":1535,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_ixml_xml_to_data","ranges":[{"startOffset":1563,"endOffset":1700,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1703,"endOffset":1816,"count":0}],"isBlockCoverage":false},{"functionName":"build","ranges":[{"startOffset":1819,"endOffset":1892,"count":0}],"isBlockCoverage":false},{"functionName":"build","ranges":[{"startOffset":1902,"endOffset":3402,"count":12},{"startOffset":3328,"endOffset":3398,"count":7}],"isBlockCoverage":true},{"functionName":"find_href_in_heap","ranges":[{"startOffset":3405,"endOffset":3502,"count":0}],"isBlockCoverage":false},{"functionName":"find_href_in_heap","ranges":[{"startOffset":3512,"endOffset":5457,"count":0}],"isBlockCoverage":false},{"functionName":"traverse","ranges":[{"startOffset":5460,"endOffset":5539,"count":0}],"isBlockCoverage":false},{"functionName":"traverse","ranges":[{"startOffset":5549,"endOffset":12479,"count":45},{"startOffset":7363,"endOffset":8332,"count":8},{"startOffset":7676,"endOffset":8273,"count":38},{"startOffset":7858,"endOffset":7886,"count":8},{"startOffset":7886,"endOffset":8265,"count":30},{"startOffset":8332,"endOffset":12473,"count":37},{"startOffset":8415,"endOffset":8711,"count":34},{"startOffset":8711,"endOffset":12473,"count":3},{"startOffset":9108,"endOffset":9616,"count":11},{"startOffset":9290,"endOffset":9318,"count":3},{"startOffset":9318,"endOffset":9616,"count":8},{"startOffset":9675,"endOffset":12473,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11668,"endOffset":11812,"count":0}],"isBlockCoverage":true}]},{"scriptId":"641","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_json_to_ixml.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5806,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":594,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":343,"endOffset":463,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":506,"endOffset":570,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_json_to_ixml","ranges":[{"startOffset":598,"endOffset":683,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":686,"endOffset":799,"count":0}],"isBlockCoverage":false},{"functionName":"build","ranges":[{"startOffset":802,"endOffset":871,"count":0}],"isBlockCoverage":false},{"functionName":"build","ranges":[{"startOffset":881,"endOffset":5661,"count":0}],"isBlockCoverage":false}]},{"scriptId":"642","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_lock.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1423,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":101,"endOffset":521,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":320,"endOffset":363,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":454,"endOffset":497,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_lock","ranges":[{"startOffset":525,"endOffset":610,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":613,"endOffset":726,"count":0}],"isBlockCoverage":false},{"functionName":"enqueue","ranges":[{"startOffset":729,"endOffset":794,"count":0}],"isBlockCoverage":false},{"functionName":"enqueue","ranges":[{"startOffset":804,"endOffset":1038,"count":0}],"isBlockCoverage":false},{"functionName":"dequeue","ranges":[{"startOffset":1041,"endOffset":1106,"count":0}],"isBlockCoverage":false},{"functionName":"dequeue","ranges":[{"startOffset":1116,"endOffset":1310,"count":0}],"isBlockCoverage":false}]},{"scriptId":"643","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_numberrange.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4711,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":115,"endOffset":1403,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":273,"endOffset":842,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":995,"endOffset":1095,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1137,"endOffset":1236,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1278,"endOffset":1379,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_numberrange","ranges":[{"startOffset":1407,"endOffset":1537,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1540,"endOffset":1653,"count":0}],"isBlockCoverage":false},{"functionName":"number_get","ranges":[{"startOffset":1656,"endOffset":1734,"count":0}],"isBlockCoverage":false},{"functionName":"number_get","ranges":[{"startOffset":1744,"endOffset":3583,"count":0}],"isBlockCoverage":false}]},{"scriptId":"644","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_push_channels.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":833,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":329,"count":1}],"isBlockCoverage":true},{"functionName":"kernel_push_channels","ranges":[{"startOffset":333,"endOffset":418,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":421,"endOffset":534,"count":0}],"isBlockCoverage":false},{"functionName":"wait","ranges":[{"startOffset":537,"endOffset":595,"count":0}],"isBlockCoverage":false},{"functionName":"wait","ranges":[{"startOffset":605,"endOffset":684,"count":0}],"isBlockCoverage":false}]},{"scriptId":"645","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_scan_abap_source.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":34718,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":7306,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":290,"endOffset":581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":667,"endOffset":1214,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1365,"endOffset":1429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1475,"endOffset":2238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2283,"endOffset":3267,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3357,"endOffset":3421,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3466,"endOffset":4229,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4278,"endOffset":5262,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5355,"endOffset":6118,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6167,"endOffset":7151,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7239,"endOffset":7282,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_scan_abap_source","ranges":[{"startOffset":7310,"endOffset":7511,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7514,"endOffset":7627,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":7630,"endOffset":7701,"count":0}],"isBlockCoverage":false},{"functionName":"call","ranges":[{"startOffset":7711,"endOffset":11669,"count":0}],"isBlockCoverage":false},{"functionName":"call_internal","ranges":[{"startOffset":11672,"endOffset":11761,"count":0}],"isBlockCoverage":false},{"functionName":"call_internal","ranges":[{"startOffset":11771,"endOffset":13984,"count":0}],"isBlockCoverage":false},{"functionName":"pass1","ranges":[{"startOffset":13987,"endOffset":14060,"count":0}],"isBlockCoverage":false},{"functionName":"pass1","ranges":[{"startOffset":14070,"endOffset":22461,"count":0}],"isBlockCoverage":false},{"functionName":"pass2","ranges":[{"startOffset":22464,"endOffset":22537,"count":0}],"isBlockCoverage":false},{"functionName":"pass2","ranges":[{"startOffset":22547,"endOffset":30952,"count":0}],"isBlockCoverage":false}]},{"scriptId":"646","url":"file:///home/runner/work/abapGit/abapGit/output/kernel_unit_runner.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":32542,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":115,"endOffset":6280,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":277,"endOffset":341,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":424,"endOffset":747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":903,"endOffset":1441,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1485,"endOffset":2133,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2226,"endOffset":2290,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2333,"endOffset":3662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3764,"endOffset":3828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3872,"endOffset":3970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4061,"endOffset":5564,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5608,"endOffset":6256,"count":0}],"isBlockCoverage":false},{"functionName":"kernel_unit_runner","ranges":[{"startOffset":6284,"endOffset":6473,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":6476,"endOffset":6589,"count":0}],"isBlockCoverage":false},{"functionName":"get_location","ranges":[{"startOffset":6592,"endOffset":6674,"count":0}],"isBlockCoverage":false},{"functionName":"get_location","ranges":[{"startOffset":6684,"endOffset":8125,"count":0}],"isBlockCoverage":false},{"functionName":"to_json","ranges":[{"startOffset":8128,"endOffset":8200,"count":0}],"isBlockCoverage":false},{"functionName":"to_json","ranges":[{"startOffset":8210,"endOffset":13661,"count":0}],"isBlockCoverage":false},{"functionName":"unique_classes","ranges":[{"startOffset":13664,"endOffset":13750,"count":0}],"isBlockCoverage":false},{"functionName":"unique_classes","ranges":[{"startOffset":13760,"endOffset":16208,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":16211,"endOffset":16275,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":16285,"endOffset":27019,"count":0}],"isBlockCoverage":false}]},{"scriptId":"647","url":"file:///home/runner/work/abapGit/abapGit/output/laiso.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"648","url":"file:///home/runner/work/abapGit/abapGit/output/land1.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"649","url":"file:///home/runner/work/abapGit/abapGit/output/langu.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"650","url":"file:///home/runner/work/abapGit/abapGit/output/lvc_nokeyc.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"651","url":"file:///home/runner/work/abapGit/abapGit/output/lxe_pcx_s1.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":699,"count":1}],"isBlockCoverage":true}]},{"scriptId":"652","url":"file:///home/runner/work/abapGit/abapGit/output/lxecustmnr.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"653","url":"file:///home/runner/work/abapGit/abapGit/output/lxeisolang.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"654","url":"file:///home/runner/work/abapGit/abapGit/output/lxeobjname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"655","url":"file:///home/runner/work/abapGit/abapGit/output/lxetextkey.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":203,"count":1}],"isBlockCoverage":true}]},{"scriptId":"656","url":"file:///home/runner/work/abapGit/abapGit/output/lxetexttype.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":207,"count":1}],"isBlockCoverage":true}]},{"scriptId":"657","url":"file:///home/runner/work/abapGit/abapGit/output/lxeunitlin.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":205,"count":1}],"isBlockCoverage":true}]},{"scriptId":"658","url":"file:///home/runner/work/abapGit/abapGit/output/lxeunitmlt.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":173,"count":1}],"isBlockCoverage":true}]},{"scriptId":"659","url":"file:///home/runner/work/abapGit/abapGit/output/lxeuppcase.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"660","url":"file:///home/runner/work/abapGit/abapGit/output/mandt.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"661","url":"file:///home/runner/work/abapGit/abapGit/output/match_result.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":720,"count":1}],"isBlockCoverage":true}]},{"scriptId":"662","url":"file:///home/runner/work/abapGit/abapGit/output/match_result_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":903,"count":1}],"isBlockCoverage":true}]},{"scriptId":"663","url":"file:///home/runner/work/abapGit/abapGit/output/menge_d.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":188,"count":1}],"isBlockCoverage":true}]},{"scriptId":"664","url":"file:///home/runner/work/abapGit/abapGit/output/msehi.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"665","url":"file:///home/runner/work/abapGit/abapGit/output/namespace.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"666","url":"file:///home/runner/work/abapGit/abapGit/output/number_get_next.fugr.number_get_next.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":774,"count":1}],"isBlockCoverage":true},{"functionName":"number_get_next","ranges":[{"startOffset":99,"endOffset":649,"count":0}],"isBlockCoverage":false}]},{"scriptId":"667","url":"file:///home/runner/work/abapGit/abapGit/output/numc4.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":168,"count":1}],"isBlockCoverage":true}]},{"scriptId":"668","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.call_v1_ping.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":236,"count":1}],"isBlockCoverage":true},{"functionName":"call_v1_ping","ranges":[{"startOffset":89,"endOffset":127,"count":0}],"isBlockCoverage":false}]},{"scriptId":"669","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.conversion_exit_alpha_input.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1924,"count":1}],"isBlockCoverage":true},{"functionName":"conversion_exit_alpha_input","ranges":[{"startOffset":104,"endOffset":1770,"count":0}],"isBlockCoverage":false}]},{"scriptId":"670","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.conversion_exit_alpha_output.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1097,"count":1}],"isBlockCoverage":true},{"functionName":"conversion_exit_alpha_output","ranges":[{"startOffset":105,"endOffset":940,"count":0}],"isBlockCoverage":false}]},{"scriptId":"671","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.conversion_exit_isola_input.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":789,"count":1}],"isBlockCoverage":true},{"functionName":"conversion_exit_isola_input","ranges":[{"startOffset":104,"endOffset":635,"count":2},{"startOffset":336,"endOffset":385,"count":0},{"startOffset":564,"endOffset":633,"count":0}],"isBlockCoverage":true}]},{"scriptId":"672","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.conversion_exit_isola_output.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":964,"count":1}],"isBlockCoverage":true},{"functionName":"conversion_exit_isola_output","ranges":[{"startOffset":105,"endOffset":805,"count":2},{"startOffset":338,"endOffset":387,"count":0},{"startOffset":533,"endOffset":801,"count":0}],"isBlockCoverage":true}]},{"scriptId":"673","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.convert_itf_to_stream_text.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1404,"count":1}],"isBlockCoverage":true},{"functionName":"convert_itf_to_stream_text","ranges":[{"startOffset":103,"endOffset":1253,"count":1},{"startOffset":352,"endOffset":622,"count":0},{"startOffset":816,"endOffset":946,"count":0},{"startOffset":1134,"endOffset":1252,"count":0}],"isBlockCoverage":true}]},{"scriptId":"674","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.docu_get.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":889,"count":1}],"isBlockCoverage":true},{"functionName":"docu_get","ranges":[{"startOffset":85,"endOffset":792,"count":1},{"startOffset":651,"endOffset":791,"count":0}],"isBlockCoverage":true}]},{"scriptId":"675","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.function_exists.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":789,"count":1}],"isBlockCoverage":true},{"functionName":"function_exists","ranges":[{"startOffset":92,"endOffset":671,"count":1},{"startOffset":531,"endOffset":536,"count":0}],"isBlockCoverage":true}]},{"scriptId":"676","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.generate_sec_random.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":720,"count":1}],"isBlockCoverage":true},{"functionName":"generate_sec_random","ranges":[{"startOffset":96,"endOffset":590,"count":0}],"isBlockCoverage":false}]},{"scriptId":"677","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.get_system_timezone.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":543,"count":1}],"isBlockCoverage":true},{"functionName":"get_system_timezone","ranges":[{"startOffset":96,"endOffset":413,"count":1},{"startOffset":252,"endOffset":355,"count":0}],"isBlockCoverage":true}]},{"scriptId":"678","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.system_callstack.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1480,"count":1}],"isBlockCoverage":true},{"functionName":"system_callstack","ranges":[{"startOffset":93,"endOffset":1359,"count":86},{"startOffset":256,"endOffset":768,"count":0}],"isBlockCoverage":true}]},{"scriptId":"679","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.system_installed_languages.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":590,"count":1}],"isBlockCoverage":true},{"functionName":"system_installed_languages","ranges":[{"startOffset":103,"endOffset":439,"count":0}],"isBlockCoverage":false}]},{"scriptId":"680","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.text_split.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":986,"count":1}],"isBlockCoverage":true},{"functionName":"text_split","ranges":[{"startOffset":87,"endOffset":883,"count":0}],"isBlockCoverage":false}]},{"scriptId":"681","url":"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.unit_conversion_simple.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2187,"count":1}],"isBlockCoverage":true},{"functionName":"unit_conversion_simple","ranges":[{"startOffset":99,"endOffset":2048,"count":0}],"isBlockCoverage":false}]},{"scriptId":"682","url":"file:///home/runner/work/abapGit/abapGit/output/parentcl.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"683","url":"file:///home/runner/work/abapGit/abapGit/output/progdir.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1365,"count":1}],"isBlockCoverage":true}]},{"scriptId":"684","url":"file:///home/runner/work/abapGit/abapGit/output/progname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"685","url":"file:///home/runner/work/abapGit/abapGit/output/reposrc.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":357,"count":1}],"isBlockCoverage":true}]},{"scriptId":"686","url":"file:///home/runner/work/abapGit/abapGit/output/rfcdest.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":192,"count":1}],"isBlockCoverage":true}]},{"scriptId":"687","url":"file:///home/runner/work/abapGit/abapGit/output/rswsourcet.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":306,"count":1}],"isBlockCoverage":true}]},{"scriptId":"688","url":"file:///home/runner/work/abapGit/abapGit/output/rzlli_apcl.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"689","url":"file:///home/runner/work/abapGit/abapGit/output/salv_s_int4_column.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":274,"count":1}],"isBlockCoverage":true}]},{"scriptId":"690","url":"file:///home/runner/work/abapGit/abapGit/output/salv_t_int4_column.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":455,"count":1}],"isBlockCoverage":true}]},{"scriptId":"691","url":"file:///home/runner/work/abapGit/abapGit/output/sappatchlv.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"692","url":"file:///home/runner/work/abapGit/abapGit/output/saprelease.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"693","url":"file:///home/runner/work/abapGit/abapGit/output/sci_chkv.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"694","url":"file:///home/runner/work/abapGit/abapGit/output/scompkdtln.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1098,"count":1}],"isBlockCoverage":true}]},{"scriptId":"695","url":"file:///home/runner/work/abapGit/abapGit/output/scrtext_l.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"696","url":"file:///home/runner/work/abapGit/abapGit/output/scrtext_m.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"697","url":"file:///home/runner/work/abapGit/abapGit/output/scrtext_s.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"698","url":"file:///home/runner/work/abapGit/abapGit/output/scx_attrname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":173,"count":1}],"isBlockCoverage":true}]},{"scriptId":"699","url":"file:///home/runner/work/abapGit/abapGit/output/scx_t100key.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":412,"count":1}],"isBlockCoverage":true}]},{"scriptId":"700","url":"file:///home/runner/work/abapGit/abapGit/output/sdok_class.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":197,"count":1}],"isBlockCoverage":true}]},{"scriptId":"701","url":"file:///home/runner/work/abapGit/abapGit/output/sdok_docid.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":197,"count":1}],"isBlockCoverage":true}]},{"scriptId":"702","url":"file:///home/runner/work/abapGit/abapGit/output/sdokobject.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":337,"count":1}],"isBlockCoverage":true}]},{"scriptId":"703","url":"file:///home/runner/work/abapGit/abapGit/output/seobusobj.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":197,"count":1}],"isBlockCoverage":true}]},{"scriptId":"704","url":"file:///home/runner/work/abapGit/abapGit/output/seoc.type.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":886,"count":1}],"isBlockCoverage":true}]},{"scriptId":"705","url":"file:///home/runner/work/abapGit/abapGit/output/seoclskey.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":241,"count":1}],"isBlockCoverage":true}]},{"scriptId":"706","url":"file:///home/runner/work/abapGit/abapGit/output/seoclsname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"707","url":"file:///home/runner/work/abapGit/abapGit/output/seocmpname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":201,"count":1}],"isBlockCoverage":true}]},{"scriptId":"708","url":"file:///home/runner/work/abapGit/abapGit/output/seocmptype.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":167,"count":1}],"isBlockCoverage":true}]},{"scriptId":"709","url":"file:///home/runner/work/abapGit/abapGit/output/seocompo.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":399,"count":1}],"isBlockCoverage":true}]},{"scriptId":"710","url":"file:///home/runner/work/abapGit/abapGit/output/seocompotx.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":546,"count":1}],"isBlockCoverage":true}]},{"scriptId":"711","url":"file:///home/runner/work/abapGit/abapGit/output/seodescr.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":195,"count":1}],"isBlockCoverage":true}]},{"scriptId":"712","url":"file:///home/runner/work/abapGit/abapGit/output/seoexpose.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":165,"count":1}],"isBlockCoverage":true}]},{"scriptId":"713","url":"file:///home/runner/work/abapGit/abapGit/output/seokeyfld.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":197,"count":1}],"isBlockCoverage":true}]},{"scriptId":"714","url":"file:///home/runner/work/abapGit/abapGit/output/seoo.type.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":450,"count":1}],"isBlockCoverage":true}]},{"scriptId":"715","url":"file:///home/runner/work/abapGit/abapGit/output/seop.type.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":547,"count":1}],"isBlockCoverage":true}]},{"scriptId":"716","url":"file:///home/runner/work/abapGit/abapGit/output/seos.type.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":280,"count":1}],"isBlockCoverage":true}]},{"scriptId":"717","url":"file:///home/runner/work/abapGit/abapGit/output/seosconame.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":193,"count":1}],"isBlockCoverage":true}]},{"scriptId":"718","url":"file:///home/runner/work/abapGit/abapGit/output/seoscotype.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":167,"count":1}],"isBlockCoverage":true}]},{"scriptId":"719","url":"file:///home/runner/work/abapGit/abapGit/output/seosubco.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":569,"count":1}],"isBlockCoverage":true}]},{"scriptId":"720","url":"file:///home/runner/work/abapGit/abapGit/output/seosubcotx.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":653,"count":1}],"isBlockCoverage":true}]},{"scriptId":"721","url":"file:///home/runner/work/abapGit/abapGit/output/seox.type.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":250,"count":1}],"isBlockCoverage":true}]},{"scriptId":"722","url":"file:///home/runner/work/abapGit/abapGit/output/shm_affect_server.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":184,"count":1}],"isBlockCoverage":true}]},{"scriptId":"723","url":"file:///home/runner/work/abapGit/abapGit/output/shm_area_name.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":210,"count":1}],"isBlockCoverage":true}]},{"scriptId":"724","url":"file:///home/runner/work/abapGit/abapGit/output/shm_attach_mode.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":180,"count":1}],"isBlockCoverage":true}]},{"scriptId":"725","url":"file:///home/runner/work/abapGit/abapGit/output/shm_auto_build_class_name.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":246,"count":1}],"isBlockCoverage":true}]},{"scriptId":"726","url":"file:///home/runner/work/abapGit/abapGit/output/shm_client.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"727","url":"file:///home/runner/work/abapGit/abapGit/output/shm_constr_invocation_mode.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":202,"count":1}],"isBlockCoverage":true}]},{"scriptId":"728","url":"file:///home/runner/work/abapGit/abapGit/output/shm_inst_info.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":341,"count":1}],"isBlockCoverage":true}]},{"scriptId":"729","url":"file:///home/runner/work/abapGit/abapGit/output/shm_inst_infos.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":519,"count":1}],"isBlockCoverage":true}]},{"scriptId":"730","url":"file:///home/runner/work/abapGit/abapGit/output/shm_inst_name.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":210,"count":1}],"isBlockCoverage":true}]},{"scriptId":"731","url":"file:///home/runner/work/abapGit/abapGit/output/shm_life_context.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":182,"count":1}],"isBlockCoverage":true}]},{"scriptId":"732","url":"file:///home/runner/work/abapGit/abapGit/output/shm_properties.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":255,"count":1}],"isBlockCoverage":true}]},{"scriptId":"733","url":"file:///home/runner/work/abapGit/abapGit/output/shm_rc.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":162,"count":1}],"isBlockCoverage":true}]},{"scriptId":"734","url":"file:///home/runner/work/abapGit/abapGit/output/shma_attributes.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":545,"count":1}],"isBlockCoverage":true}]},{"scriptId":"735","url":"file:///home/runner/work/abapGit/abapGit/output/shma_client.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":203,"count":1}],"isBlockCoverage":true}]},{"scriptId":"736","url":"file:///home/runner/work/abapGit/abapGit/output/shmm_trc_variant_name.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":234,"count":1}],"isBlockCoverage":true}]},{"scriptId":"737","url":"file:///home/runner/work/abapGit/abapGit/output/skwf_io.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":686,"count":1}],"isBlockCoverage":true}]},{"scriptId":"738","url":"file:///home/runner/work/abapGit/abapGit/output/skwf_ioty.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":447,"count":1}],"isBlockCoverage":true}]},{"scriptId":"739","url":"file:///home/runner/work/abapGit/abapGit/output/so_raw255.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":149,"count":1}],"isBlockCoverage":true}]},{"scriptId":"740","url":"file:///home/runner/work/abapGit/abapGit/output/so_text255.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"741","url":"file:///home/runner/work/abapGit/abapGit/output/sobj_name.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"742","url":"file:///home/runner/work/abapGit/abapGit/output/soli.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":224,"count":1}],"isBlockCoverage":true}]},{"scriptId":"743","url":"file:///home/runner/work/abapGit/abapGit/output/soli_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":399,"count":1}],"isBlockCoverage":true}]},{"scriptId":"744","url":"file:///home/runner/work/abapGit/abapGit/output/solix.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":175,"count":1}],"isBlockCoverage":true}]},{"scriptId":"745","url":"file:///home/runner/work/abapGit/abapGit/output/solix_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":351,"count":1}],"isBlockCoverage":true}]},{"scriptId":"746","url":"file:///home/runner/work/abapGit/abapGit/output/sotr_conc.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"747","url":"file:///home/runner/work/abapGit/abapGit/output/spras.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"748","url":"file:///home/runner/work/abapGit/abapGit/output/ssfapplssl.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"749","url":"file:///home/runner/work/abapGit/abapGit/output/sstmnt.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":833,"count":1}],"isBlockCoverage":true}]},{"scriptId":"750","url":"file:///home/runner/work/abapGit/abapGit/output/sstmnt_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1010,"count":1}],"isBlockCoverage":true}]},{"scriptId":"751","url":"file:///home/runner/work/abapGit/abapGit/output/sstruc.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":603,"count":1}],"isBlockCoverage":true}]},{"scriptId":"752","url":"file:///home/runner/work/abapGit/abapGit/output/sstruc_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":780,"count":1}],"isBlockCoverage":true}]},{"scriptId":"753","url":"file:///home/runner/work/abapGit/abapGit/output/stokes.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":339,"count":1}],"isBlockCoverage":true}]},{"scriptId":"754","url":"file:///home/runner/work/abapGit/abapGit/output/stokes_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":516,"count":1}],"isBlockCoverage":true}]},{"scriptId":"755","url":"file:///home/runner/work/abapGit/abapGit/output/stokesx.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":612,"count":1}],"isBlockCoverage":true}]},{"scriptId":"756","url":"file:///home/runner/work/abapGit/abapGit/output/string_table.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":310,"count":1}],"isBlockCoverage":true}]},{"scriptId":"757","url":"file:///home/runner/work/abapGit/abapGit/output/stringtab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":304,"count":1}],"isBlockCoverage":true}]},{"scriptId":"758","url":"file:///home/runner/work/abapGit/abapGit/output/submatch_result.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":274,"count":1}],"isBlockCoverage":true}]},{"scriptId":"759","url":"file:///home/runner/work/abapGit/abapGit/output/submatch_result_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":460,"count":1}],"isBlockCoverage":true}]},{"scriptId":"760","url":"file:///home/runner/work/abapGit/abapGit/output/sxco_fm_name.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"761","url":"file:///home/runner/work/abapGit/abapGit/output/sxco_transport.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":213,"count":1}],"isBlockCoverage":true}]},{"scriptId":"762","url":"file:///home/runner/work/abapGit/abapGit/output/sydate.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":159,"count":1}],"isBlockCoverage":true}]},{"scriptId":"763","url":"file:///home/runner/work/abapGit/abapGit/output/symsg.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":432,"count":1}],"isBlockCoverage":true}]},{"scriptId":"764","url":"file:///home/runner/work/abapGit/abapGit/output/symsgid.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":192,"count":1}],"isBlockCoverage":true}]},{"scriptId":"765","url":"file:///home/runner/work/abapGit/abapGit/output/symsgno.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":172,"count":1}],"isBlockCoverage":true}]},{"scriptId":"766","url":"file:///home/runner/work/abapGit/abapGit/output/symsgty.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":191,"count":1}],"isBlockCoverage":true}]},{"scriptId":"767","url":"file:///home/runner/work/abapGit/abapGit/output/symsgv.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":189,"count":1}],"isBlockCoverage":true}]},{"scriptId":"768","url":"file:///home/runner/work/abapGit/abapGit/output/syrepid.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":192,"count":1}],"isBlockCoverage":true}]},{"scriptId":"769","url":"file:///home/runner/work/abapGit/abapGit/output/syst_host.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":198,"count":1}],"isBlockCoverage":true}]},{"scriptId":"770","url":"file:///home/runner/work/abapGit/abapGit/output/sysubrc.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":164,"count":1}],"isBlockCoverage":true}]},{"scriptId":"771","url":"file:///home/runner/work/abapGit/abapGit/output/sysuuid_c32.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":204,"count":1}],"isBlockCoverage":true}]},{"scriptId":"772","url":"file:///home/runner/work/abapGit/abapGit/output/sysuuid_c36.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":204,"count":1}],"isBlockCoverage":true}]},{"scriptId":"773","url":"file:///home/runner/work/abapGit/abapGit/output/sysuuid_x16.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":150,"count":1}],"isBlockCoverage":true}]},{"scriptId":"774","url":"file:///home/runner/work/abapGit/abapGit/output/syuname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":192,"count":1}],"isBlockCoverage":true}]},{"scriptId":"775","url":"file:///home/runner/work/abapGit/abapGit/output/t000.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":272,"count":1}],"isBlockCoverage":true}]},{"scriptId":"776","url":"file:///home/runner/work/abapGit/abapGit/output/t100.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":321,"count":1}],"isBlockCoverage":true}]},{"scriptId":"777","url":"file:///home/runner/work/abapGit/abapGit/output/tabfdpos.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":174,"count":1}],"isBlockCoverage":true}]},{"scriptId":"778","url":"file:///home/runner/work/abapGit/abapGit/output/tabname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":192,"count":1}],"isBlockCoverage":true}]},{"scriptId":"779","url":"file:///home/runner/work/abapGit/abapGit/output/tadir.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":579,"count":1}],"isBlockCoverage":true}]},{"scriptId":"780","url":"file:///home/runner/work/abapGit/abapGit/output/tdevc.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":679,"count":1}],"isBlockCoverage":true}]},{"scriptId":"781","url":"file:///home/runner/work/abapGit/abapGit/output/tdline.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":190,"count":1}],"isBlockCoverage":true}]},{"scriptId":"782","url":"file:///home/runner/work/abapGit/abapGit/output/text20.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"783","url":"file:///home/runner/work/abapGit/abapGit/output/text200.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":193,"count":1}],"isBlockCoverage":true}]},{"scriptId":"784","url":"file:///home/runner/work/abapGit/abapGit/output/text255.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":186,"count":1}],"isBlockCoverage":true}]},{"scriptId":"785","url":"file:///home/runner/work/abapGit/abapGit/output/text30.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181,"count":1}],"isBlockCoverage":true}]},{"scriptId":"786","url":"file:///home/runner/work/abapGit/abapGit/output/text80.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":189,"count":1}],"isBlockCoverage":true}]},{"scriptId":"787","url":"file:///home/runner/work/abapGit/abapGit/output/textpool.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":320,"count":1}],"isBlockCoverage":true}]},{"scriptId":"788","url":"file:///home/runner/work/abapGit/abapGit/output/tfdir.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":188,"count":1}],"isBlockCoverage":true}]},{"scriptId":"789","url":"file:///home/runner/work/abapGit/abapGit/output/thead.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1484,"count":1}],"isBlockCoverage":true}]},{"scriptId":"790","url":"file:///home/runner/work/abapGit/abapGit/output/tihttpnvp.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":431,"count":1}],"isBlockCoverage":true}]},{"scriptId":"791","url":"file:///home/runner/work/abapGit/abapGit/output/timestamp.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":192,"count":1}],"isBlockCoverage":true}]},{"scriptId":"792","url":"file:///home/runner/work/abapGit/abapGit/output/timestampl.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":194,"count":1}],"isBlockCoverage":true}]},{"scriptId":"793","url":"file:///home/runner/work/abapGit/abapGit/output/timezone.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":194,"count":1}],"isBlockCoverage":true}]},{"scriptId":"794","url":"file:///home/runner/work/abapGit/abapGit/output/timn.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":152,"count":1}],"isBlockCoverage":true}]},{"scriptId":"795","url":"file:///home/runner/work/abapGit/abapGit/output/tline.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":222,"count":1}],"isBlockCoverage":true}]},{"scriptId":"796","url":"file:///home/runner/work/abapGit/abapGit/output/tline_tab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":398,"count":1}],"isBlockCoverage":true}]},{"scriptId":"797","url":"file:///home/runner/work/abapGit/abapGit/output/tlinetab.ttyp.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":396,"count":1}],"isBlockCoverage":true}]},{"scriptId":"798","url":"file:///home/runner/work/abapGit/abapGit/output/trfunction.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":200,"count":1}],"isBlockCoverage":true}]},{"scriptId":"799","url":"file:///home/runner/work/abapGit/abapGit/output/trkorr.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":189,"count":1}],"isBlockCoverage":true}]},{"scriptId":"800","url":"file:///home/runner/work/abapGit/abapGit/output/trnspace.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":300,"count":1}],"isBlockCoverage":true}]},{"scriptId":"801","url":"file:///home/runner/work/abapGit/abapGit/output/trobjtype.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":197,"count":1}],"isBlockCoverage":true}]},{"scriptId":"802","url":"file:///home/runner/work/abapGit/abapGit/output/tzntstmpl.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":192,"count":1}],"isBlockCoverage":true}]},{"scriptId":"803","url":"file:///home/runner/work/abapGit/abapGit/output/tzntstmps.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":187,"count":1}],"isBlockCoverage":true}]},{"scriptId":"804","url":"file:///home/runner/work/abapGit/abapGit/output/uname.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":186,"count":1}],"isBlockCoverage":true}]},{"scriptId":"805","url":"file:///home/runner/work/abapGit/abapGit/output/usnam.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":186,"count":1}],"isBlockCoverage":true}]},{"scriptId":"806","url":"file:///home/runner/work/abapGit/abapGit/output/vseointerf.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":928,"count":1}],"isBlockCoverage":true}]},{"scriptId":"807","url":"file:///home/runner/work/abapGit/abapGit/output/w3mime.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":178,"count":1}],"isBlockCoverage":true}]},{"scriptId":"808","url":"file:///home/runner/work/abapGit/abapGit/output/wwwdatatab.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":232,"count":1}],"isBlockCoverage":true}]},{"scriptId":"809","url":"file:///home/runner/work/abapGit/abapGit/output/wwwparams.tabl.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":315,"count":1}],"isBlockCoverage":true}]},{"scriptId":"810","url":"file:///home/runner/work/abapGit/abapGit/output/xfeld.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":185,"count":1}],"isBlockCoverage":true}]},{"scriptId":"811","url":"file:///home/runner/work/abapGit/abapGit/output/xsdboolean.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":282,"count":1}],"isBlockCoverage":true}]},{"scriptId":"812","url":"file:///home/runner/work/abapGit/abapGit/output/xsdtime_t.dtel.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":160,"count":1}],"isBlockCoverage":true}]},{"scriptId":"813","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_css_common.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":114,"count":1}],"isBlockCoverage":true}]},{"scriptId":"814","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_css_page_db.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":116,"count":1}],"isBlockCoverage":true}]},{"scriptId":"815","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_css_page_db_entry.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":128,"count":1}],"isBlockCoverage":true}]},{"scriptId":"816","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_css_theme_belize_blue.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":136,"count":1}],"isBlockCoverage":true}]},{"scriptId":"817","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_css_theme_dark.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":122,"count":1}],"isBlockCoverage":true}]},{"scriptId":"818","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_css_theme_default.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":128,"count":1}],"isBlockCoverage":true}]},{"scriptId":"819","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_icon_font.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":113,"count":1}],"isBlockCoverage":true}]},{"scriptId":"820","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_icon_font_css.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":120,"count":1}],"isBlockCoverage":true}]},{"scriptId":"821","url":"file:///home/runner/work/abapGit/abapGit/output/zabapgit_js_common.w3mi.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":111,"count":1}],"isBlockCoverage":true}]},{"scriptId":"822","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_abap_language_vers.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11502,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":2059,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":419,"endOffset":483,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":529,"endOffset":625,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":758,"endOffset":822,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":865,"endOffset":985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1123,"endOffset":1238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1288,"endOffset":1385,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1431,"endOffset":1527,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1633,"endOffset":1730,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1773,"endOffset":1893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1939,"endOffset":2035,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_abap_language_vers","ranges":[{"startOffset":2063,"endOffset":2148,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2151,"endOffset":2264,"count":0}],"isBlockCoverage":false},{"functionName":"get_abap_language_vers_by_devc","ranges":[{"startOffset":2267,"endOffset":6150,"count":0}],"isBlockCoverage":false},{"functionName":"get_abap_language_vers_by_objt","ranges":[{"startOffset":6153,"endOffset":9062,"count":0}],"isBlockCoverage":false},{"functionName":"get_abap_language_vers_by_repo","ranges":[{"startOffset":9065,"endOffset":9761,"count":0}],"isBlockCoverage":false},{"functionName":"is_import_allowed","ranges":[{"startOffset":9764,"endOffset":11313,"count":0}],"isBlockCoverage":false}]},{"scriptId":"823","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_adt_link.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":18025,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":2870,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":371,"endOffset":419,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":466,"endOffset":513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":566,"endOffset":656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":708,"endOffset":798,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":844,"endOffset":940,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":986,"endOffset":1082,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1204,"endOffset":1301,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1346,"endOffset":1407,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1449,"endOffset":1539,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1635,"endOffset":1699,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1746,"endOffset":1794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1841,"endOffset":1888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1939,"endOffset":1987,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2037,"endOffset":2097,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2191,"endOffset":2239,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2286,"endOffset":2333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2384,"endOffset":2432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2482,"endOffset":2542,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2642,"endOffset":2706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2754,"endOffset":2846,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_adt_link","ranges":[{"startOffset":2874,"endOffset":2959,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2962,"endOffset":3075,"count":0}],"isBlockCoverage":false},{"functionName":"link_transport","ranges":[{"startOffset":3078,"endOffset":3166,"count":0}],"isBlockCoverage":false},{"functionName":"link_transport","ranges":[{"startOffset":3176,"endOffset":3660,"count":0}],"isBlockCoverage":false},{"functionName":"generate","ranges":[{"startOffset":3663,"endOffset":3739,"count":0}],"isBlockCoverage":false},{"functionName":"generate","ranges":[{"startOffset":3749,"endOffset":7284,"count":0}],"isBlockCoverage":false},{"functionName":"get_adt_objects_and_names","ranges":[{"startOffset":7289,"endOffset":7403,"count":0}],"isBlockCoverage":false},{"functionName":"get_adt_objects_and_names","ranges":[{"startOffset":7415,"endOffset":13017,"count":0}],"isBlockCoverage":false},{"functionName":"is_adt_jump_possible","ranges":[{"startOffset":13026,"endOffset":13138,"count":0}],"isBlockCoverage":false},{"functionName":"is_adt_jump_possible","ranges":[{"startOffset":13154,"endOffset":16336,"count":0}],"isBlockCoverage":false},{"functionName":"jump","ranges":[{"startOffset":16347,"endOffset":16431,"count":0}],"isBlockCoverage":false},{"functionName":"jump","ranges":[{"startOffset":16449,"endOffset":17860,"count":0}],"isBlockCoverage":false}]},{"scriptId":"824","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_aff_registry.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6857,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":1634,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":322,"endOffset":760,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":845,"endOffset":969,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1190,"endOffset":1237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1288,"endOffset":1385,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1486,"endOffset":1610,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_aff_registry","ranges":[{"startOffset":1638,"endOffset":1917,"count":76}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1920,"endOffset":2418,"count":76},{"startOffset":2094,"endOffset":2114,"count":9},{"startOffset":2116,"endOffset":2153,"count":9},{"startOffset":2168,"endOffset":2188,"count":9},{"startOffset":2190,"endOffset":2238,"count":9},{"startOffset":2238,"endOffset":2397,"count":67}],"isBlockCoverage":true},{"functionName":"initialize_registry_table","ranges":[{"startOffset":2421,"endOffset":3311,"count":1}],"isBlockCoverage":true},{"functionName":"register","ranges":[{"startOffset":3314,"endOffset":3394,"count":10}],"isBlockCoverage":true},{"functionName":"register","ranges":[{"startOffset":3404,"endOffset":4360,"count":10},{"startOffset":3706,"endOffset":3751,"count":1},{"startOffset":3820,"endOffset":3864,"count":9}],"isBlockCoverage":true},{"functionName":"zif_abapgit_aff_registry$is_supported_object_type","ranges":[{"startOffset":4363,"endOffset":5946,"count":76},{"startOffset":4994,"endOffset":5047,"count":1},{"startOffset":5482,"endOffset":5563,"count":14},{"startOffset":5565,"endOffset":5617,"count":10},{"startOffset":5617,"endOffset":5920,"count":66},{"startOffset":5705,"endOffset":5807,"count":4},{"startOffset":5809,"endOffset":5861,"count":1},{"startOffset":5861,"endOffset":5920,"count":65}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":5182,"endOffset":5239,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":5268,"endOffset":5294,"count":0}],"isBlockCoverage":false}]},{"scriptId":"825","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":91177,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":166,"endOffset":10579,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":350,"endOffset":460,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":541,"endOffset":1045,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1136,"endOffset":1274,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1378,"endOffset":2508,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":2607,"endOffset":2671,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":2769,"endOffset":2833,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":2932,"endOffset":2996,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":3143,"endOffset":3910,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":3953,"endOffset":4017,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":4124,"endOffset":4891,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":4934,"endOffset":4998,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5102,"endOffset":5839,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5882,"endOffset":5946,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5989,"endOffset":6053,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":6098,"endOffset":6865,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7023,"endOffset":7141,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7184,"endOffset":7248,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7293,"endOffset":7390,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7443,"endOffset":7581,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7635,"endOffset":7732,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7834,"endOffset":7952,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8005,"endOffset":8143,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8197,"endOffset":8294,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8348,"endOffset":8445,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8510,"endOffset":8607,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8708,"endOffset":8826,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8876,"endOffset":8998,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":9043,"endOffset":9179,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":9224,"endOffset":9362,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":9470,"endOffset":9567,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":9621,"endOffset":9718,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":9783,"endOffset":9880,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":9973,"endOffset":10091,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":10145,"endOffset":10242,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":10296,"endOffset":10393,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":10458,"endOffset":10555,"count":24}],"isBlockCoverage":true},{"functionName":"zcl_abapgit_ajson","ranges":[{"startOffset":10583,"endOffset":14775,"count":247}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":14778,"endOffset":16103,"count":247},{"startOffset":14932,"endOffset":14959,"count":172},{"startOffset":14961,"endOffset":15012,"count":172},{"startOffset":15041,"endOffset":15082,"count":172},{"startOffset":15084,"endOffset":15131,"count":75},{"startOffset":15258,"endOffset":15285,"count":172},{"startOffset":15287,"endOffset":15338,"count":172},{"startOffset":15367,"endOffset":15408,"count":172},{"startOffset":15410,"endOffset":15456,"count":75},{"startOffset":15594,"endOffset":15632,"count":172},{"startOffset":15634,"endOffset":15707,"count":172},{"startOffset":15736,"endOffset":15788,"count":172},{"startOffset":15790,"endOffset":15848,"count":75}],"isBlockCoverage":true},{"functionName":"create_empty","ranges":[{"startOffset":16106,"endOffset":16187,"count":0}],"isBlockCoverage":false},{"functionName":"create_empty","ranges":[{"startOffset":16197,"endOffset":17956,"count":103},{"startOffset":16517,"endOffset":16543,"count":8},{"startOffset":16545,"endOffset":16594,"count":8},{"startOffset":16721,"endOffset":16748,"count":8},{"startOffset":16750,"endOffset":16801,"count":0},{"startOffset":16830,"endOffset":16871,"count":8},{"startOffset":17047,"endOffset":17074,"count":8},{"startOffset":17076,"endOffset":17127,"count":0},{"startOffset":17156,"endOffset":17197,"count":8},{"startOffset":17383,"endOffset":17421,"count":8},{"startOffset":17423,"endOffset":17496,"count":0},{"startOffset":17525,"endOffset":17577,"count":8}],"isBlockCoverage":true},{"functionName":"create_from","ranges":[{"startOffset":17959,"endOffset":18038,"count":14}],"isBlockCoverage":true},{"functionName":"create_from","ranges":[{"startOffset":18048,"endOffset":20553,"count":41},{"startOffset":18593,"endOffset":18626,"count":14},{"startOffset":18805,"endOffset":18838,"count":24},{"startOffset":19046,"endOffset":19176,"count":0},{"startOffset":19621,"endOffset":19655,"count":27},{"startOffset":19657,"endOffset":19777,"count":4},{"startOffset":19777,"endOffset":20525,"count":37},{"startOffset":19953,"endOffset":20112,"count":24},{"startOffset":20166,"endOffset":20325,"count":14},{"startOffset":20519,"endOffset":20525,"count":35},{"startOffset":20525,"endOffset":20552,"count":39}],"isBlockCoverage":true},{"functionName":"delete_subtree","ranges":[{"startOffset":20556,"endOffset":24663,"count":179},{"startOffset":22398,"endOffset":22431,"count":171},{"startOffset":23738,"endOffset":23771,"count":154},{"startOffset":23771,"endOffset":23956,"count":25},{"startOffset":23956,"endOffset":24219,"count":6},{"startOffset":24219,"endOffset":24252,"count":25},{"startOffset":24254,"endOffset":24377,"count":17},{"startOffset":24377,"endOffset":24635,"count":8},{"startOffset":24502,"endOffset":24629,"count":7},{"startOffset":24635,"endOffset":24662,"count":25}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":23363,"endOffset":23448,"count":324},{"startOffset":23411,"endOffset":23446,"count":142}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":23477,"endOffset":23499,"count":490}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":23523,"endOffset":23545,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":24154,"endOffset":24210,"count":27}],"isBlockCoverage":true},{"functionName":"get_item","ranges":[{"startOffset":24666,"endOffset":27403,"count":108},{"startOffset":27327,"endOffset":27379,"count":84}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":26856,"endOffset":26973,"count":341},{"startOffset":26920,"endOffset":26971,"count":277}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":27002,"endOffset":27024,"count":321}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":27064,"endOffset":27086,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":27406,"endOffset":27469,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":27479,"endOffset":28921,"count":28},{"startOffset":27750,"endOffset":27777,"count":3},{"startOffset":27779,"endOffset":27830,"count":3},{"startOffset":27859,"endOffset":27900,"count":3},{"startOffset":27902,"endOffset":27949,"count":25},{"startOffset":28076,"endOffset":28103,"count":3},{"startOffset":28105,"endOffset":28156,"count":0},{"startOffset":28185,"endOffset":28226,"count":3},{"startOffset":28412,"endOffset":28450,"count":3},{"startOffset":28452,"endOffset":28525,"count":0},{"startOffset":28554,"endOffset":28606,"count":3}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":28924,"endOffset":28991,"count":7}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":29001,"endOffset":30902,"count":67},{"startOffset":29415,"endOffset":29448,"count":0},{"startOffset":29744,"endOffset":29793,"count":3},{"startOffset":29949,"endOffset":30000,"count":7},{"startOffset":30072,"endOffset":30119,"count":60},{"startOffset":30604,"endOffset":30809,"count":65},{"startOffset":30809,"endOffset":30874,"count":0},{"startOffset":30874,"endOffset":30901,"count":65}],"isBlockCoverage":true},{"functionName":"prove_path_exists","ranges":[{"startOffset":30905,"endOffset":36036,"count":192},{"startOffset":34088,"endOffset":35957,"count":306},{"startOffset":34684,"endOffset":35600,"count":114},{"startOffset":34790,"endOffset":35255,"count":40},{"startOffset":35065,"endOffset":35245,"count":11},{"startOffset":35230,"endOffset":35245,"count":10},{"startOffset":35255,"endOffset":35600,"count":113},{"startOffset":35600,"endOffset":35927,"count":305},{"startOffset":35927,"endOffset":35951,"count":191},{"startOffset":35957,"endOffset":36035,"count":191}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":33933,"endOffset":33984,"count":306}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":34277,"endOffset":34370,"count":380},{"startOffset":34329,"endOffset":34368,"count":332}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":34401,"endOffset":34423,"count":678}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":34451,"endOffset":34473,"count":0}],"isBlockCoverage":false},{"functionName":"read_only_watchdog","ranges":[{"startOffset":36039,"endOffset":36296,"count":271},{"startOffset":36147,"endOffset":36292,"count":5},{"startOffset":36286,"endOffset":36292,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$array_to_string_table","ranges":[{"startOffset":36299,"endOffset":40721,"count":5},{"startOffset":38594,"endOffset":38754,"count":1},{"startOffset":38748,"endOffset":38754,"count":0},{"startOffset":38754,"endOffset":38887,"count":4},{"startOffset":38887,"endOffset":39050,"count":2},{"startOffset":39044,"endOffset":39050,"count":0},{"startOffset":39050,"endOffset":39242,"count":2},{"startOffset":39242,"endOffset":40689,"count":7},{"startOffset":39446,"endOffset":39563,"count":5},{"startOffset":39565,"endOffset":39663,"count":3},{"startOffset":39663,"endOffset":40683,"count":4},{"startOffset":39787,"endOffset":39900,"count":1},{"startOffset":39900,"endOffset":40683,"count":3},{"startOffset":40027,"endOffset":40390,"count":2},{"startOffset":40192,"endOffset":40307,"count":1},{"startOffset":40390,"endOffset":40683,"count":1},{"startOffset":40675,"endOffset":40683,"count":0},{"startOffset":40689,"endOffset":40720,"count":1}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":39132,"endOffset":39198,"count":9}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$clear","ranges":[{"startOffset":40724,"endOffset":40844,"count":5},{"startOffset":40794,"endOffset":40843,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$clone","ranges":[{"startOffset":40847,"endOffset":41100,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$delete","ranges":[{"startOffset":41103,"endOffset":42000,"count":6},{"startOffset":41435,"endOffset":41999,"count":5}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$exists","ranges":[{"startOffset":42003,"endOffset":42415,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$filter","ranges":[{"startOffset":42418,"endOffset":42909,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$format_datetime","ranges":[{"startOffset":42912,"endOffset":43469,"count":248},{"startOffset":43205,"endOffset":43224,"count":247},{"startOffset":43226,"endOffset":43261,"count":247},{"startOffset":43290,"endOffset":43323,"count":247},{"startOffset":43325,"endOffset":43363,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$freeze","ranges":[{"startOffset":43472,"endOffset":43572,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$get","ranges":[{"startOffset":43575,"endOffset":44764,"count":5}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$get_boolean","ranges":[{"startOffset":44767,"endOffset":46470,"count":4},{"startOffset":45913,"endOffset":46037,"count":3},{"startOffset":46039,"endOffset":46069,"count":1},{"startOffset":46069,"endOffset":46445,"count":3},{"startOffset":46205,"endOffset":46331,"count":1},{"startOffset":46331,"endOffset":46445,"count":2},{"startOffset":46445,"endOffset":46469,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$get_date","ranges":[{"startOffset":46473,"endOffset":48144,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$get_integer","ranges":[{"startOffset":48147,"endOffset":49467,"count":5},{"startOffset":49394,"endOffset":49442,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$get_node_type","ranges":[{"startOffset":49470,"endOffset":50711,"count":9}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$get_number","ranges":[{"startOffset":50714,"endOffset":52031,"count":3},{"startOffset":51958,"endOffset":52006,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$get_string","ranges":[{"startOffset":52034,"endOffset":53355,"count":20},{"startOffset":53156,"endOffset":53280,"count":17},{"startOffset":53282,"endOffset":53330,"count":17}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$get_timestamp","ranges":[{"startOffset":53358,"endOffset":55118,"count":1},{"startOffset":54655,"endOffset":54685,"count":0},{"startOffset":54900,"endOffset":55093,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$is_empty","ranges":[{"startOffset":55121,"endOffset":55412,"count":20}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$keep_item_order","ranges":[{"startOffset":55415,"endOffset":55702,"count":6}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$map","ranges":[{"startOffset":55705,"endOffset":56195,"count":7}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$members","ranges":[{"startOffset":56198,"endOffset":57944,"count":2},{"startOffset":57795,"endOffset":57917,"count":4}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":57685,"endOffset":57751,"count":58}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$opts","ranges":[{"startOffset":57947,"endOffset":58542,"count":124}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$push","ranges":[{"startOffset":58545,"endOffset":63395,"count":21},{"startOffset":60525,"endOffset":60629,"count":20},{"startOffset":60629,"endOffset":60795,"count":1},{"startOffset":60789,"endOffset":60795,"count":0},{"startOffset":60795,"endOffset":60930,"count":19},{"startOffset":60930,"endOffset":61094,"count":1},{"startOffset":61088,"endOffset":61094,"count":0},{"startOffset":61094,"endOffset":63394,"count":18}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$set","ranges":[{"startOffset":63398,"endOffset":70979,"count":211},{"startOffset":63942,"endOffset":63987,"count":53},{"startOffset":64056,"endOffset":64099,"count":158},{"startOffset":64241,"endOffset":64280,"count":41},{"startOffset":66246,"endOffset":66310,"count":210},{"startOffset":66310,"endOffset":66369,"count":23},{"startOffset":66370,"endOffset":66407,"count":10},{"startOffset":66409,"endOffset":66438,"count":9},{"startOffset":66438,"endOffset":66492,"count":201},{"startOffset":66492,"endOffset":66613,"count":41},{"startOffset":66614,"endOffset":66732,"count":36},{"startOffset":66733,"endOffset":66853,"count":35},{"startOffset":66854,"endOffset":66974,"count":17},{"startOffset":66976,"endOffset":67141,"count":0},{"startOffset":67141,"endOffset":67299,"count":201},{"startOffset":67299,"endOffset":67871,"count":29},{"startOffset":67357,"endOffset":67613,"count":0},{"startOffset":67871,"endOffset":67956,"count":172},{"startOffset":67956,"endOffset":69410,"count":171},{"startOffset":69410,"endOffset":69595,"count":9},{"startOffset":69586,"endOffset":69595,"count":7},{"startOffset":69595,"endOffset":69988,"count":162},{"startOffset":69798,"endOffset":69876,"count":154},{"startOffset":69878,"endOffset":69988,"count":5},{"startOffset":69988,"endOffset":70043,"count":169},{"startOffset":70043,"endOffset":70352,"count":41},{"startOffset":70352,"endOffset":70635,"count":128},{"startOffset":70635,"endOffset":70978,"count":169}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$setx","ranges":[{"startOffset":70982,"endOffset":74327,"count":27},{"startOffset":71628,"endOffset":71685,"count":0},{"startOffset":71951,"endOffset":72008,"count":0},{"startOffset":72073,"endOffset":72257,"count":1},{"startOffset":72332,"endOffset":72404,"count":1},{"startOffset":72404,"endOffset":74277,"count":26},{"startOffset":72480,"endOffset":72587,"count":1},{"startOffset":72587,"endOffset":74277,"count":25},{"startOffset":72664,"endOffset":72772,"count":1},{"startOffset":72772,"endOffset":74277,"count":24},{"startOffset":72855,"endOffset":72972,"count":8},{"startOffset":72972,"endOffset":74277,"count":16},{"startOffset":73055,"endOffset":73198,"count":5},{"startOffset":73200,"endOffset":73309,"count":1},{"startOffset":73309,"endOffset":74277,"count":15},{"startOffset":73415,"endOffset":73513,"count":11},{"startOffset":73515,"endOffset":73685,"count":7},{"startOffset":73675,"endOffset":73685,"count":5},{"startOffset":73685,"endOffset":74277,"count":8},{"startOffset":73908,"endOffset":74012,"count":3},{"startOffset":74014,"endOffset":74188,"count":3},{"startOffset":74277,"endOffset":74326,"count":25}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$set_boolean","ranges":[{"startOffset":74330,"endOffset":75077,"count":8}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$set_date","ranges":[{"startOffset":75080,"endOffset":75841,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$set_integer","ranges":[{"startOffset":75844,"endOffset":76432,"count":9}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$set_null","ranges":[{"startOffset":76435,"endOffset":76984,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$set_string","ranges":[{"startOffset":76987,"endOffset":77644,"count":26}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$set_timestamp","ranges":[{"startOffset":77647,"endOffset":78481,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$slice","ranges":[{"startOffset":78484,"endOffset":82005,"count":3},{"startOffset":81121,"endOffset":81150,"count":0},{"startOffset":81651,"endOffset":81952,"count":50}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":80644,"endOffset":80763,"count":11}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":80792,"endOffset":80814,"count":16}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":80855,"endOffset":80877,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":81584,"endOffset":81647,"count":87}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$stringify","ranges":[{"startOffset":82008,"endOffset":82593,"count":70},{"startOffset":82199,"endOffset":82217,"count":6},{"startOffset":82219,"endOffset":82252,"count":6},{"startOffset":82281,"endOffset":82313,"count":6},{"startOffset":82315,"endOffset":82361,"count":64}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$touch_array","ranges":[{"startOffset":82596,"endOffset":88551,"count":28},{"startOffset":83032,"endOffset":83063,"count":2},{"startOffset":83125,"endOffset":83162,"count":26},{"startOffset":85764,"endOffset":85922,"count":27},{"startOffset":85922,"endOffset":86277,"count":4},{"startOffset":86277,"endOffset":86337,"count":23},{"startOffset":86337,"endOffset":86472,"count":2},{"startOffset":86472,"endOffset":86547,"count":21},{"startOffset":86547,"endOffset":86587,"count":23},{"startOffset":86587,"endOffset":88186,"count":18},{"startOffset":87968,"endOffset":88018,"count":1},{"startOffset":88020,"endOffset":88095,"count":1},{"startOffset":88186,"endOffset":88501,"count":5},{"startOffset":88320,"endOffset":88501,"count":1},{"startOffset":88495,"endOffset":88501,"count":0},{"startOffset":88501,"endOffset":88550,"count":22}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$to_abap","ranges":[{"startOffset":88554,"endOffset":89680,"count":11},{"startOffset":88746,"endOffset":88793,"count":1},{"startOffset":88863,"endOffset":88908,"count":10},{"startOffset":89427,"endOffset":89516,"count":10},{"startOffset":89676,"endOffset":89679,"count":10}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson$to_abap_corresponding_only","ranges":[{"startOffset":89683,"endOffset":90255,"count":1},{"startOffset":89986,"endOffset":90004,"count":0},{"startOffset":90006,"endOffset":90039,"count":0},{"startOffset":90068,"endOffset":90100,"count":0}],"isBlockCoverage":true}]},{"scriptId":"826","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":222086,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":115,"endOffset":3841,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":185,"endOffset":267,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":345,"endOffset":427,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":505,"endOffset":587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":667,"endOffset":749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":828,"endOffset":910,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":995,"endOffset":1077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1162,"endOffset":1244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1326,"endOffset":1408,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1492,"endOffset":1574,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1652,"endOffset":1734,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1815,"endOffset":2510,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2589,"endOffset":2891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2971,"endOffset":3197,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3283,"endOffset":3760,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":8393,"endOffset":9997,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8642,"endOffset":8706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8749,"endOffset":8813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8914,"endOffset":9204,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9247,"endOffset":9311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9418,"endOffset":9478,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9521,"endOffset":9585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9629,"endOffset":9693,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9801,"endOffset":9867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9909,"endOffset":9973,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_utils","ranges":[{"startOffset":10001,"endOffset":10086,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":10089,"endOffset":10202,"count":0}],"isBlockCoverage":false},{"functionName":"string_to_xstring_utf8","ranges":[{"startOffset":10205,"endOffset":10298,"count":0}],"isBlockCoverage":false},{"functionName":"string_to_xstring_utf8","ranges":[{"startOffset":10308,"endOffset":13031,"count":88},{"startOffset":10864,"endOffset":10935,"count":0},{"startOffset":10937,"endOffset":10988,"count":0},{"startOffset":11062,"endOffset":11133,"count":0},{"startOffset":11217,"endOffset":11289,"count":0},{"startOffset":11291,"endOffset":11343,"count":0},{"startOffset":11428,"endOffset":11500,"count":0},{"startOffset":11651,"endOffset":11723,"count":0},{"startOffset":11725,"endOffset":11777,"count":0},{"startOffset":11842,"endOffset":11914,"count":0},{"startOffset":12004,"endOffset":13007,"count":0}],"isBlockCoverage":true},{"functionName":"validate_array_index","ranges":[{"startOffset":13034,"endOffset":13123,"count":0}],"isBlockCoverage":false},{"functionName":"validate_array_index","ranges":[{"startOffset":13133,"endOffset":14100,"count":23},{"startOffset":13582,"endOffset":13803,"count":3},{"startOffset":13797,"endOffset":13803,"count":0},{"startOffset":13803,"endOffset":13900,"count":20},{"startOffset":13900,"endOffset":14075,"count":2},{"startOffset":14069,"endOffset":14075,"count":0},{"startOffset":14075,"endOffset":14099,"count":18}],"isBlockCoverage":true},{"functionName":"normalize_path","ranges":[{"startOffset":14103,"endOffset":14180,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_path","ranges":[{"startOffset":14190,"endOffset":15124,"count":333},{"startOffset":14539,"endOffset":14603,"count":6},{"startOffset":14710,"endOffset":14805,"count":2},{"startOffset":15005,"endOffset":15100,"count":16}],"isBlockCoverage":true},{"functionName":"split_path","ranges":[{"startOffset":15127,"endOffset":15196,"count":0}],"isBlockCoverage":false},{"functionName":"split_path","ranges":[{"startOffset":15206,"endOffset":16937,"count":352},{"startOffset":15976,"endOffset":16041,"count":343},{"startOffset":16043,"endOffset":16077,"count":53},{"startOffset":16077,"endOffset":16248,"count":299},{"startOffset":16248,"endOffset":16313,"count":75},{"startOffset":16313,"endOffset":16526,"count":299},{"startOffset":16526,"endOffset":16560,"count":4},{"startOffset":16560,"endOffset":16936,"count":299}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17028,"endOffset":21622,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":17208,"endOffset":18182,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18269,"endOffset":18333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18425,"endOffset":18522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18667,"endOffset":18731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18828,"endOffset":19793,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19836,"endOffset":19900,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20003,"endOffset":20067,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20110,"endOffset":20174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20219,"endOffset":20279,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20375,"endOffset":21340,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21383,"endOffset":21447,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21501,"endOffset":21598,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_json_parser","ranges":[{"startOffset":21626,"endOffset":22879,"count":84}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":22882,"endOffset":22995,"count":84},{"startOffset":22938,"endOffset":22974,"count":0}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":22998,"endOffset":25863,"count":87},{"startOffset":24278,"endOffset":24329,"count":70},{"startOffset":24401,"endOffset":24448,"count":17},{"startOffset":24897,"endOffset":24907,"count":83},{"startOffset":24907,"endOffset":25834,"count":4},{"startOffset":25401,"endOffset":25828,"count":0},{"startOffset":25834,"endOffset":25862,"count":83}],"isBlockCoverage":true},{"functionName":"_get_location","ranges":[{"startOffset":25866,"endOffset":28038,"count":4},{"startOffset":26906,"endOffset":26967,"count":0},{"startOffset":27041,"endOffset":27106,"count":0},{"startOffset":27561,"endOffset":27671,"count":3},{"startOffset":27671,"endOffset":27873,"count":1}],"isBlockCoverage":true},{"functionName":"_parse","ranges":[{"startOffset":28041,"endOffset":36352,"count":87},{"startOffset":31079,"endOffset":31113,"count":0},{"startOffset":31395,"endOffset":36068,"count":2438},{"startOffset":31521,"endOffset":31566,"count":2434},{"startOffset":31566,"endOffset":31590,"count":83},{"startOffset":31590,"endOffset":31746,"count":2351},{"startOffset":31746,"endOffset":34550,"count":883},{"startOffset":32768,"endOffset":34211,"count":800},{"startOffset":33043,"endOffset":33248,"count":80},{"startOffset":33248,"endOffset":34016,"count":720},{"startOffset":33920,"endOffset":34004,"count":80},{"startOffset":34074,"endOffset":34201,"count":0},{"startOffset":34550,"endOffset":36062,"count":1468},{"startOffset":34651,"endOffset":35572,"count":883},{"startOffset":35179,"endOffset":35296,"count":0},{"startOffset":35572,"endOffset":36062,"count":585},{"startOffset":35951,"endOffset":36062,"count":0},{"startOffset":36068,"endOffset":36220,"count":83},{"startOffset":36220,"endOffset":36323,"count":0},{"startOffset":36323,"endOffset":36351,"count":83}],"isBlockCoverage":true},{"functionName":"raise","ranges":[{"startOffset":36355,"endOffset":36744,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":37841,"endOffset":43465,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":38033,"endOffset":38097,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38183,"endOffset":39313,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39405,"endOffset":39502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39585,"endOffset":39843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39931,"endOffset":39991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40073,"endOffset":40133,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40288,"endOffset":40352,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40400,"endOffset":40464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40567,"endOffset":40631,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40731,"endOffset":41468,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41574,"endOffset":41638,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41682,"endOffset":41779,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41881,"endOffset":41945,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41993,"endOffset":43123,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43168,"endOffset":43228,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43282,"endOffset":43379,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_json_serializer","ranges":[{"startOffset":43469,"endOffset":45276,"count":80}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":45279,"endOffset":45392,"count":80},{"startOffset":45335,"endOffset":45371,"count":0}],"isBlockCoverage":true},{"functionName":"class_constructor","ranges":[{"startOffset":45395,"endOffset":45478,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":45488,"endOffset":45673,"count":1}],"isBlockCoverage":true},{"functionName":"stringify","ranges":[{"startOffset":45676,"endOffset":45753,"count":0}],"isBlockCoverage":false},{"functionName":"stringify","ranges":[{"startOffset":45763,"endOffset":48131,"count":80},{"startOffset":47179,"endOffset":47212,"count":74},{"startOffset":47275,"endOffset":47321,"count":6},{"startOffset":47477,"endOffset":47528,"count":71},{"startOffset":47600,"endOffset":47647,"count":9}],"isBlockCoverage":true},{"functionName":"_stringify","ranges":[{"startOffset":48134,"endOffset":49817,"count":80},{"startOffset":49622,"endOffset":49658,"count":1},{"startOffset":49658,"endOffset":49816,"count":79}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":49079,"endOffset":49220,"count":79}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":49249,"endOffset":49271,"count":156}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":49323,"endOffset":49345,"count":0}],"isBlockCoverage":false},{"functionName":"stringify_node","ranges":[{"startOffset":49820,"endOffset":55615,"count":350},{"startOffset":50877,"endOffset":51076,"count":81},{"startOffset":51136,"endOffset":51180,"count":271},{"startOffset":51182,"endOffset":51533,"count":249},{"startOffset":51265,"endOffset":51409,"count":63},{"startOffset":51409,"endOffset":51527,"count":186},{"startOffset":51697,"endOffset":51792,"count":19},{"startOffset":51792,"endOffset":53121,"count":331},{"startOffset":51918,"endOffset":52013,"count":123},{"startOffset":52013,"endOffset":53121,"count":208},{"startOffset":52139,"endOffset":52322,"count":86},{"startOffset":52322,"endOffset":53121,"count":122},{"startOffset":52448,"endOffset":52565,"count":109},{"startOffset":52567,"endOffset":52645,"count":114},{"startOffset":52645,"endOffset":53121,"count":8},{"startOffset":52867,"endOffset":53121,"count":0},{"startOffset":53200,"endOffset":53454,"count":81},{"startOffset":53327,"endOffset":53453,"count":74},{"startOffset":53455,"endOffset":53530,"count":25},{"startOffset":53532,"endOffset":53729,"count":23},{"startOffset":53932,"endOffset":54058,"count":331},{"startOffset":54060,"endOffset":55611,"count":142},{"startOffset":54528,"endOffset":54800,"count":19},{"startOffset":54616,"endOffset":54733,"count":11},{"startOffset":54800,"endOffset":55199,"count":123},{"startOffset":55014,"endOffset":55132,"count":118},{"startOffset":55280,"endOffset":55355,"count":25},{"startOffset":55357,"endOffset":55532,"count":23}],"isBlockCoverage":true},{"functionName":"stringify_set","ranges":[{"startOffset":55618,"endOffset":58293,"count":129},{"startOffset":56976,"endOffset":57054,"count":11},{"startOffset":57054,"endOffset":57291,"count":118},{"startOffset":57130,"endOffset":57207,"count":17},{"startOffset":57207,"endOffset":57291,"count":101},{"startOffset":57502,"endOffset":58032,"count":271},{"startOffset":57602,"endOffset":57662,"count":129},{"startOffset":57662,"endOffset":57975,"count":142},{"startOffset":57743,"endOffset":57856,"count":49},{"startOffset":57856,"endOffset":57975,"count":93},{"startOffset":58111,"endOffset":58168,"count":23},{"startOffset":58170,"endOffset":58289,"count":23}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":57400,"endOffset":57462,"count":895}],"isBlockCoverage":true},{"functionName":"escape_string","ranges":[{"startOffset":58296,"endOffset":58381,"count":86}],"isBlockCoverage":true},{"functionName":"escape_string","ranges":[{"startOffset":58391,"endOffset":59731,"count":86},{"startOffset":58754,"endOffset":59704,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59932,"endOffset":69648,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":60123,"endOffset":60884,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":60966,"endOffset":62126,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":62217,"endOffset":62355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":62445,"endOffset":62542,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":62692,"endOffset":62756,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":62806,"endOffset":63380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":63431,"endOffset":63504,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":63603,"endOffset":64340,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":64388,"endOffset":64962,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":65013,"endOffset":65086,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":65190,"endOffset":65764,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":65807,"endOffset":66544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":66594,"endOffset":67168,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":67219,"endOffset":67292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":67398,"endOffset":67495,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":67548,"endOffset":67686,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":67780,"endOffset":68910,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":68957,"endOffset":69000,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":69100,"endOffset":69192,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":69236,"endOffset":69332,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":69427,"endOffset":69484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":69528,"endOffset":69624,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_json_to_abap","ranges":[{"startOffset":69652,"endOffset":71944,"count":26}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":71947,"endOffset":72653,"count":26},{"startOffset":72099,"endOffset":72124,"count":12},{"startOffset":72126,"endOffset":72173,"count":12},{"startOffset":72202,"endOffset":72241,"count":12},{"startOffset":72243,"endOffset":72288,"count":14},{"startOffset":72455,"endOffset":72481,"count":12},{"startOffset":72483,"endOffset":72532,"count":11}],"isBlockCoverage":true},{"functionName":"to_abap","ranges":[{"startOffset":72656,"endOffset":74398,"count":33},{"startOffset":74394,"endOffset":74397,"count":22}],"isBlockCoverage":true},{"functionName":"get_node_type","ranges":[{"startOffset":74401,"endOffset":81434,"count":200},{"startOffset":75786,"endOffset":75815,"count":167},{"startOffset":76440,"endOffset":76483,"count":167},{"startOffset":76609,"endOffset":76654,"count":33},{"startOffset":77232,"endOffset":77361,"count":23},{"startOffset":77361,"endOffset":77605,"count":177},{"startOffset":77435,"endOffset":77605,"count":111},{"startOffset":78018,"endOffset":81401,"count":142},{"startOffset":78145,"endOffset":78554,"count":5},{"startOffset":78433,"endOffset":78546,"count":3},{"startOffset":78554,"endOffset":78669,"count":137},{"startOffset":78826,"endOffset":78989,"count":21},{"startOffset":78989,"endOffset":80562,"count":121},{"startOffset":79197,"endOffset":80175,"count":88},{"startOffset":79409,"endOffset":79468,"count":82},{"startOffset":79468,"endOffset":79730,"count":6},{"startOffset":79672,"endOffset":79718,"count":0},{"startOffset":79824,"endOffset":80165,"count":6},{"startOffset":79907,"endOffset":80046,"count":3},{"startOffset":80032,"endOffset":80046,"count":0},{"startOffset":80046,"endOffset":80153,"count":3},{"startOffset":80175,"endOffset":80562,"count":33},{"startOffset":80417,"endOffset":80562,"count":0},{"startOffset":80562,"endOffset":80767,"count":136},{"startOffset":80767,"endOffset":81299,"count":22},{"startOffset":80950,"endOffset":81289,"count":9},{"startOffset":81099,"endOffset":81151,"count":0},{"startOffset":81299,"endOffset":81401,"count":136},{"startOffset":81401,"endOffset":81433,"count":194}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":77696,"endOffset":77760,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":77789,"endOffset":77816,"count":0}],"isBlockCoverage":false},{"functionName":"any_to_abap","ranges":[{"startOffset":81439,"endOffset":92311,"count":107},{"startOffset":82228,"endOffset":82271,"count":74},{"startOffset":84781,"endOffset":85628,"count":24},{"startOffset":84862,"endOffset":85386,"count":9},{"startOffset":85386,"endOffset":85620,"count":15},{"startOffset":85628,"endOffset":86057,"count":83},{"startOffset":85836,"endOffset":86057,"count":50},{"startOffset":86277,"endOffset":91231,"count":197},{"startOffset":86440,"endOffset":86493,"count":53},{"startOffset":86495,"endOffset":86774,"count":167},{"startOffset":86601,"endOffset":86684,"count":164},{"startOffset":86684,"endOffset":86721,"count":9},{"startOffset":86723,"endOffset":86762,"count":3},{"startOffset":86774,"endOffset":86902,"count":191},{"startOffset":86902,"endOffset":87019,"count":190},{"startOffset":87021,"endOffset":87167,"count":2},{"startOffset":87155,"endOffset":87167,"count":0},{"startOffset":87167,"endOffset":87332,"count":189},{"startOffset":87332,"endOffset":87902,"count":53},{"startOffset":87454,"endOffset":87611,"count":1},{"startOffset":87597,"endOffset":87611,"count":0},{"startOffset":87611,"endOffset":87685,"count":52},{"startOffset":87685,"endOffset":87890,"count":39},{"startOffset":87902,"endOffset":88807,"count":136},{"startOffset":88110,"endOffset":88515,"count":105},{"startOffset":88515,"endOffset":88807,"count":31},{"startOffset":88653,"endOffset":88807,"count":0},{"startOffset":88807,"endOffset":88982,"count":188},{"startOffset":88982,"endOffset":89625,"count":51},{"startOffset":89236,"endOffset":89384,"count":1},{"startOffset":89370,"endOffset":89384,"count":0},{"startOffset":89384,"endOffset":89613,"count":50},{"startOffset":89613,"endOffset":89625,"count":43},{"startOffset":89625,"endOffset":90402,"count":137},{"startOffset":89750,"endOffset":90265,"count":25},{"startOffset":89880,"endOffset":90024,"count":1},{"startOffset":90010,"endOffset":90024,"count":0},{"startOffset":90024,"endOffset":90253,"count":24},{"startOffset":90253,"endOffset":90265,"count":22},{"startOffset":90265,"endOffset":90402,"count":112},{"startOffset":90390,"endOffset":90402,"count":110},{"startOffset":90402,"endOffset":90484,"count":175},{"startOffset":90484,"endOffset":91221,"count":13},{"startOffset":90695,"endOffset":90848,"count":1},{"startOffset":90832,"endOffset":90848,"count":0},{"startOffset":90863,"endOffset":91209,"count":1},{"startOffset":90994,"endOffset":91147,"count":0},{"startOffset":91231,"endOffset":91240,"count":87},{"startOffset":91240,"endOffset":92305,"count":20},{"startOffset":91363,"endOffset":91628,"count":19},{"startOffset":91453,"endOffset":91586,"count":10},{"startOffset":91628,"endOffset":92297,"count":1},{"startOffset":91948,"endOffset":92297,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":86189,"endOffset":86244,"count":291}],"isBlockCoverage":true},{"functionName":"value_to_abap","ranges":[{"startOffset":92316,"endOffset":96174,"count":112},{"startOffset":94202,"endOffset":94402,"count":0},{"startOffset":94774,"endOffset":94783,"count":1},{"startOffset":94783,"endOffset":96168,"count":111},{"startOffset":94910,"endOffset":95045,"count":5},{"startOffset":95045,"endOffset":96168,"count":106},{"startOffset":95171,"endOffset":95228,"count":26},{"startOffset":95228,"endOffset":96168,"count":80},{"startOffset":95477,"endOffset":95531,"count":3},{"startOffset":95533,"endOffset":95628,"count":3},{"startOffset":95615,"endOffset":95628,"count":2},{"startOffset":95628,"endOffset":95972,"count":77},{"startOffset":95749,"endOffset":95803,"count":4},{"startOffset":95805,"endOffset":95905,"count":4},{"startOffset":95905,"endOffset":95972,"count":73},{"startOffset":95980,"endOffset":96168,"count":0}],"isBlockCoverage":true},{"functionName":"to_date","ranges":[{"startOffset":96179,"endOffset":97090,"count":3},{"startOffset":96836,"endOffset":96976,"count":1},{"startOffset":96968,"endOffset":96976,"count":0},{"startOffset":96976,"endOffset":97089,"count":2}],"isBlockCoverage":true},{"functionName":"to_timestamp","ranges":[{"startOffset":97095,"endOffset":101372,"count":5},{"startOffset":99105,"endOffset":99344,"count":1},{"startOffset":99344,"endOffset":99863,"count":4},{"startOffset":99706,"endOffset":99855,"count":0},{"startOffset":100389,"endOffset":100517,"count":0},{"startOffset":100593,"endOffset":100730,"count":1},{"startOffset":100739,"endOffset":101177,"count":0},{"startOffset":101234,"endOffset":101342,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":102081,"endOffset":122668,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":102287,"endOffset":102351,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":102444,"endOffset":102582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":102676,"endOffset":102773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":102867,"endOffset":102964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":103116,"endOffset":103159,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":103202,"endOffset":103320,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":103365,"endOffset":103655,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":103699,"endOffset":103759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":103808,"endOffset":103868,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":103912,"endOffset":104877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":104978,"endOffset":105100,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":105145,"endOffset":105435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":105479,"endOffset":105539,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":105588,"endOffset":105648,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":105692,"endOffset":106657,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":106758,"endOffset":106801,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":106844,"endOffset":106962,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":107007,"endOffset":107297,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":107341,"endOffset":107401,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":107450,"endOffset":107510,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":107554,"endOffset":108519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":108618,"endOffset":108661,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":108706,"endOffset":108996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":109040,"endOffset":109100,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":109149,"endOffset":109209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":109253,"endOffset":110218,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":110319,"endOffset":110362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":110405,"endOffset":110523,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":110568,"endOffset":110858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":110902,"endOffset":110962,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":111011,"endOffset":111071,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":111115,"endOffset":112080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":112123,"endOffset":112860,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":112961,"endOffset":113004,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":113047,"endOffset":113165,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":113210,"endOffset":113500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":113544,"endOffset":113604,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":113653,"endOffset":113713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":113757,"endOffset":114722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":114832,"endOffset":114875,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":114918,"endOffset":115013,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":115056,"endOffset":115174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":115219,"endOffset":115509,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":115553,"endOffset":115613,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":115662,"endOffset":115722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":115766,"endOffset":116731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":116827,"endOffset":117792,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":117835,"endOffset":117878,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":117923,"endOffset":118213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":118263,"endOffset":118323,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":118376,"endOffset":118514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":118557,"endOffset":119061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":119110,"endOffset":119170,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":119275,"endOffset":120240,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":120283,"endOffset":120326,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":120369,"endOffset":120464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":120509,"endOffset":120799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":120849,"endOffset":120909,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":120962,"endOffset":121100,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":121143,"endOffset":121647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":121696,"endOffset":121756,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":121854,"endOffset":121918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":121961,"endOffset":122018,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":122116,"endOffset":122180,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":122223,"endOffset":122280,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":122383,"endOffset":122447,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":122488,"endOffset":122580,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_abap_to_json","ranges":[{"startOffset":122674,"endOffset":123237,"count":230}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":123242,"endOffset":123361,"count":230},{"startOffset":123300,"endOffset":123336,"count":0}],"isBlockCoverage":true},{"functionName":"class_constructor","ranges":[{"startOffset":123366,"endOffset":123450,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":123462,"endOffset":123988,"count":1}],"isBlockCoverage":true},{"functionName":"convert","ranges":[{"startOffset":123993,"endOffset":124067,"count":0}],"isBlockCoverage":false},{"functionName":"convert","ranges":[{"startOffset":124079,"endOffset":127850,"count":189},{"startOffset":125518,"endOffset":125551,"count":176},{"startOffset":125666,"endOffset":125709,"count":128},{"startOffset":125779,"endOffset":125830,"count":61},{"startOffset":126029,"endOffset":126078,"count":157},{"startOffset":126623,"endOffset":126652,"count":175},{"startOffset":126765,"endOffset":126806,"count":128},{"startOffset":126875,"endOffset":126925,"count":61}],"isBlockCoverage":true},{"functionName":"convert_any","ranges":[{"startOffset":127855,"endOffset":131991,"count":323},{"startOffset":128650,"endOffset":128681,"count":206},{"startOffset":128745,"endOffset":128790,"count":117},{"startOffset":128903,"endOffset":128944,"count":306},{"startOffset":129013,"endOffset":129063,"count":17},{"startOffset":130225,"endOffset":130398,"count":244},{"startOffset":130398,"endOffset":131985,"count":79},{"startOffset":130483,"endOffset":130656,"count":43},{"startOffset":130656,"endOffset":131985,"count":36},{"startOffset":130740,"endOffset":130913,"count":20},{"startOffset":130913,"endOffset":131985,"count":16},{"startOffset":131041,"endOffset":131073,"count":13},{"startOffset":131075,"endOffset":131232,"count":4},{"startOffset":131232,"endOffset":131977,"count":12},{"startOffset":131690,"endOffset":131977,"count":0}],"isBlockCoverage":true},{"functionName":"convert_ajson","ranges":[{"startOffset":131996,"endOffset":136465,"count":12},{"startOffset":132782,"endOffset":132827,"count":0},{"startOffset":133050,"endOffset":133100,"count":0},{"startOffset":135720,"endOffset":135745,"count":0},{"startOffset":135850,"endOffset":136459,"count":33},{"startOffset":136029,"endOffset":136072,"count":12},{"startOffset":136074,"endOffset":136292,"count":12},{"startOffset":136292,"endOffset":136451,"count":21}],"isBlockCoverage":true},{"functionName":"format_date","ranges":[{"startOffset":136470,"endOffset":136552,"count":3}],"isBlockCoverage":true},{"functionName":"format_date","ranges":[{"startOffset":136564,"endOffset":137187,"count":5},{"startOffset":136838,"endOffset":137160,"count":3}],"isBlockCoverage":true},{"functionName":"format_time","ranges":[{"startOffset":137192,"endOffset":137274,"count":2}],"isBlockCoverage":true},{"functionName":"format_time","ranges":[{"startOffset":137286,"endOffset":137909,"count":2},{"startOffset":137560,"endOffset":137882,"count":1}],"isBlockCoverage":true},{"functionName":"format_timestamp","ranges":[{"startOffset":137914,"endOffset":138006,"count":1}],"isBlockCoverage":true},{"functionName":"format_timestamp","ranges":[{"startOffset":138018,"endOffset":139339,"count":4}],"isBlockCoverage":true},{"functionName":"convert_value","ranges":[{"startOffset":139344,"endOffset":146538,"count":244},{"startOffset":140236,"endOffset":140281,"count":0},{"startOffset":140504,"endOffset":140554,"count":0},{"startOffset":142577,"endOffset":142640,"count":12},{"startOffset":142766,"endOffset":142870,"count":223},{"startOffset":142871,"endOffset":142973,"count":223},{"startOffset":142974,"endOffset":143070,"count":215},{"startOffset":143071,"endOffset":143168,"count":215},{"startOffset":143170,"endOffset":143535,"count":29},{"startOffset":143346,"endOffset":143433,"count":12},{"startOffset":143433,"endOffset":143527,"count":17},{"startOffset":143535,"endOffset":146465,"count":215},{"startOffset":143645,"endOffset":144192,"count":1},{"startOffset":143942,"endOffset":144184,"count":0},{"startOffset":144192,"endOffset":146465,"count":214},{"startOffset":144307,"endOffset":144415,"count":86},{"startOffset":144416,"endOffset":144522,"count":84},{"startOffset":144524,"endOffset":144754,"count":130},{"startOffset":144754,"endOffset":146465,"count":84},{"startOffset":144869,"endOffset":145289,"count":3},{"startOffset":145161,"endOffset":145281,"count":0},{"startOffset":145289,"endOffset":146465,"count":81},{"startOffset":145404,"endOffset":145824,"count":2},{"startOffset":145696,"endOffset":145816,"count":0},{"startOffset":145824,"endOffset":146465,"count":79},{"startOffset":146172,"endOffset":146465,"count":0}],"isBlockCoverage":true},{"functionName":"convert_ref","ranges":[{"startOffset":146543,"endOffset":150442,"count":4},{"startOffset":147245,"endOffset":147290,"count":0},{"startOffset":147513,"endOffset":147563,"count":0},{"startOffset":149600,"endOffset":149777,"count":0},{"startOffset":149830,"endOffset":149893,"count":1},{"startOffset":150136,"endOffset":150369,"count":0}],"isBlockCoverage":true},{"functionName":"convert_struc","ranges":[{"startOffset":150447,"endOffset":159617,"count":43},{"startOffset":151339,"endOffset":151384,"count":0},{"startOffset":151607,"endOffset":151657,"count":0},{"startOffset":153471,"endOffset":153497,"count":0},{"startOffset":156806,"endOffset":156884,"count":0},{"startOffset":157231,"endOffset":157412,"count":10},{"startOffset":157467,"endOffset":157534,"count":23},{"startOffset":158025,"endOffset":159611,"count":117},{"startOffset":158192,"endOffset":158347,"count":0},{"startOffset":158841,"endOffset":158933,"count":14},{"startOffset":158935,"endOffset":159134,"count":11},{"startOffset":159205,"endOffset":159285,"count":9},{"startOffset":159366,"endOffset":159435,"count":36}],"isBlockCoverage":true},{"functionName":"convert_table","ranges":[{"startOffset":159622,"endOffset":166051,"count":20},{"startOffset":160514,"endOffset":160559,"count":0},{"startOffset":160782,"endOffset":160832,"count":0},{"startOffset":164611,"endOffset":164788,"count":1},{"startOffset":164841,"endOffset":164904,"count":4},{"startOffset":165460,"endOffset":166045,"count":17}],"isBlockCoverage":true},{"functionName":"insert_with_type","ranges":[{"startOffset":166056,"endOffset":166148,"count":0}],"isBlockCoverage":false},{"functionName":"insert_with_type","ranges":[{"startOffset":166160,"endOffset":170134,"count":41},{"startOffset":168034,"endOffset":168085,"count":0},{"startOffset":169130,"endOffset":169180,"count":0}],"isBlockCoverage":true},{"functionName":"insert_value_with_type","ranges":[{"startOffset":170139,"endOffset":177221,"count":41},{"startOffset":171205,"endOffset":171250,"count":0},{"startOffset":171473,"endOffset":171523,"count":0},{"startOffset":173577,"endOffset":173683,"count":0},{"startOffset":173684,"endOffset":173790,"count":0},{"startOffset":173920,"endOffset":173988,"count":5},{"startOffset":173989,"endOffset":174058,"count":2},{"startOffset":174060,"endOffset":174278,"count":0},{"startOffset":174399,"endOffset":174441,"count":1},{"startOffset":174443,"endOffset":174658,"count":0},{"startOffset":174781,"endOffset":174861,"count":18},{"startOffset":174863,"endOffset":175081,"count":0},{"startOffset":175204,"endOffset":175320,"count":24},{"startOffset":175321,"endOffset":175434,"count":19},{"startOffset":175435,"endOffset":175550,"count":18},{"startOffset":175552,"endOffset":175807,"count":0},{"startOffset":175815,"endOffset":176518,"count":0},{"startOffset":176855,"endOffset":177032,"count":0},{"startOffset":177085,"endOffset":177148,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":177436,"endOffset":179918,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":177586,"endOffset":178716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":178764,"endOffset":179894,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":180035,"endOffset":184554,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":180244,"endOffset":180380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":180470,"endOffset":181630,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":181718,"endOffset":182878,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":183023,"endOffset":183087,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":183132,"endOffset":183869,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":183964,"endOffset":184112,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":184157,"endOffset":184293,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":184394,"endOffset":184530,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_filter_runner","ranges":[{"startOffset":184560,"endOffset":187142,"count":14}],"isBlockCoverage":true},{"functionName":"new","ranges":[{"startOffset":187147,"endOffset":187214,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":187226,"endOffset":187780,"count":14}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":187785,"endOffset":188161,"count":14}],"isBlockCoverage":true},{"functionName":"lif_mutator_runner$run","ranges":[{"startOffset":188166,"endOffset":190864,"count":14}],"isBlockCoverage":true},{"functionName":"walk","ranges":[{"startOffset":190869,"endOffset":195348,"count":41},{"startOffset":191804,"endOffset":191834,"count":27},{"startOffset":192765,"endOffset":195342,"count":83},{"startOffset":192971,"endOffset":193086,"count":81},{"startOffset":193087,"endOffset":193204,"count":81},{"startOffset":193205,"endOffset":193322,"count":69},{"startOffset":193324,"endOffset":193512,"count":47},{"startOffset":193467,"endOffset":193502,"count":15},{"startOffset":193512,"endOffset":194731,"count":36},{"startOffset":193636,"endOffset":193753,"count":26},{"startOffset":193997,"endOffset":194032,"count":9},{"startOffset":194032,"endOffset":194496,"count":27},{"startOffset":194496,"endOffset":194531,"count":2},{"startOffset":194541,"endOffset":194731,"count":0},{"startOffset":194731,"endOffset":194768,"count":57},{"startOffset":194770,"endOffset":195237,"count":43},{"startOffset":195030,"endOffset":195227,"count":5},{"startOffset":195237,"endOffset":195342,"count":57}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":192677,"endOffset":192732,"count":282}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":195465,"endOffset":199479,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":195674,"endOffset":195812,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":195902,"endOffset":197062,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":197150,"endOffset":198310,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":198468,"endOffset":198532,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":198583,"endOffset":198647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":198695,"endOffset":198790,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":198885,"endOffset":199033,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":199078,"endOffset":199216,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":199317,"endOffset":199455,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_mapper_runner","ranges":[{"startOffset":199485,"endOffset":202069,"count":24}],"isBlockCoverage":true},{"functionName":"new","ranges":[{"startOffset":202074,"endOffset":202141,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":202153,"endOffset":202709,"count":24}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":202714,"endOffset":203092,"count":24}],"isBlockCoverage":true},{"functionName":"lif_mutator_runner$run","ranges":[{"startOffset":203097,"endOffset":207679,"count":24},{"startOffset":206964,"endOffset":207221,"count":23},{"startOffset":207093,"endOffset":207220,"count":22},{"startOffset":207223,"endOffset":207290,"count":2},{"startOffset":207290,"endOffset":207673,"count":22},{"startOffset":207673,"endOffset":207678,"count":20}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":206438,"endOffset":206571,"count":23}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":206602,"endOffset":206624,"count":60}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":206672,"endOffset":206694,"count":0}],"isBlockCoverage":false},{"functionName":"process_deep_node","ranges":[{"startOffset":207684,"endOffset":211562,"count":66},{"startOffset":209912,"endOffset":211556,"count":126},{"startOffset":210119,"endOffset":210507,"count":119},{"startOffset":210319,"endOffset":210497,"count":1},{"startOffset":210485,"endOffset":210497,"count":0},{"startOffset":210507,"endOffset":210761,"count":125},{"startOffset":210761,"endOffset":210937,"count":1},{"startOffset":210927,"endOffset":210937,"count":0},{"startOffset":210937,"endOffset":211074,"count":124},{"startOffset":211074,"endOffset":211201,"count":111},{"startOffset":211203,"endOffset":211548,"count":44},{"startOffset":211556,"endOffset":211561,"count":64}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":209824,"endOffset":209879,"count":771}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":211679,"endOffset":212979,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":211887,"endOffset":212220,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":212368,"endOffset":212516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":212607,"endOffset":212755,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":212801,"endOffset":212955,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_mutator_queue","ranges":[{"startOffset":212985,"endOffset":213417,"count":37}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":213422,"endOffset":213541,"count":37},{"startOffset":213480,"endOffset":213516,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":213546,"endOffset":214151,"count":38}],"isBlockCoverage":true},{"functionName":"new","ranges":[{"startOffset":214156,"endOffset":214213,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":214225,"endOffset":214538,"count":0}],"isBlockCoverage":false},{"functionName":"lif_mutator_runner$run","ranges":[{"startOffset":214543,"endOffset":221762,"count":37},{"startOffset":220881,"endOffset":220948,"count":0},{"startOffset":221022,"endOffset":221756,"count":38},{"startOffset":221150,"endOffset":221239,"count":37},{"startOffset":221239,"endOffset":221342,"count":1},{"startOffset":221411,"endOffset":221496,"count":37},{"startOffset":221496,"endOffset":221643,"count":1},{"startOffset":221748,"endOffset":221756,"count":36},{"startOffset":221756,"endOffset":221761,"count":35}],"isBlockCoverage":true}]},{"scriptId":"827","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_filter_lib.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5135,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":199,"endOffset":2076,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":451,"endOffset":587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":693,"endOffset":829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":878,"endOffset":1136,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1185,"endOffset":1249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1302,"endOffset":1399,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1504,"endOffset":1640,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1686,"endOffset":2052,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_ajson_filter_lib","ranges":[{"startOffset":2080,"endOffset":2165,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2168,"endOffset":2281,"count":0}],"isBlockCoverage":false},{"functionName":"create_and_filter","ranges":[{"startOffset":2284,"endOffset":2386,"count":0}],"isBlockCoverage":false},{"functionName":"create_and_filter","ranges":[{"startOffset":2396,"endOffset":3178,"count":1}],"isBlockCoverage":true},{"functionName":"create_empty_filter","ranges":[{"startOffset":3181,"endOffset":3277,"count":0}],"isBlockCoverage":false},{"functionName":"create_empty_filter","ranges":[{"startOffset":3287,"endOffset":3600,"count":3}],"isBlockCoverage":true},{"functionName":"create_path_filter","ranges":[{"startOffset":3603,"endOffset":3707,"count":0}],"isBlockCoverage":false},{"functionName":"create_path_filter","ranges":[{"startOffset":3717,"endOffset":4954,"count":5},{"startOffset":4199,"endOffset":4240,"count":2},{"startOffset":4353,"endOffset":4394,"count":3},{"startOffset":4548,"endOffset":4597,"count":1},{"startOffset":4668,"endOffset":4714,"count":4}],"isBlockCoverage":true}]},{"scriptId":"828","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_filter_lib.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":17219,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":134,"endOffset":810,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":379,"endOffset":729,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_empty_filter","ranges":[{"startOffset":814,"endOffset":1024,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1027,"endOffset":1140,"count":3},{"startOffset":1083,"endOffset":1119,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_filter$keep_node","ranges":[{"startOffset":1143,"endOffset":2860,"count":11},{"startOffset":2233,"endOffset":2264,"count":8},{"startOffset":2326,"endOffset":2428,"count":3},{"startOffset":2581,"endOffset":2635,"count":5},{"startOffset":2637,"endOffset":2833,"count":6}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3586,"endOffset":5409,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":3809,"endOffset":4061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4152,"endOffset":4249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4358,"endOffset":4708,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4864,"endOffset":5122,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5171,"endOffset":5235,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5288,"endOffset":5385,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_paths_filter","ranges":[{"startOffset":5413,"endOffset":5998,"count":5}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_filter$keep_node","ranges":[{"startOffset":6001,"endOffset":8353,"count":40},{"startOffset":7091,"endOffset":7122,"count":27},{"startOffset":7184,"endOffset":7286,"count":13},{"startOffset":7611,"endOffset":7909,"count":11},{"startOffset":7734,"endOffset":7903,"count":20},{"startOffset":7819,"endOffset":7895,"count":3},{"startOffset":7909,"endOffset":8329,"count":29}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":7978,"endOffset":8038,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":8069,"endOffset":8097,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8356,"endOffset":10784,"count":5},{"startOffset":9648,"endOffset":9786,"count":0},{"startOffset":9858,"endOffset":10006,"count":2},{"startOffset":10062,"endOffset":10541,"count":3},{"startOffset":10241,"endOffset":10535,"count":5},{"startOffset":10317,"endOffset":10441,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11508,"endOffset":13094,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":11726,"endOffset":12092,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12201,"endOffset":12551,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12704,"endOffset":13070,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_and_filter","ranges":[{"startOffset":13098,"endOffset":13682,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_filter$keep_node","ranges":[{"startOffset":13685,"endOffset":15504,"count":4},{"startOffset":14775,"endOffset":14806,"count":2},{"startOffset":14868,"endOffset":14970,"count":2},{"startOffset":15227,"endOffset":15480,"count":8},{"startOffset":15441,"endOffset":15474,"count":1},{"startOffset":15480,"endOffset":15503,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":15507,"endOffset":16402,"count":1},{"startOffset":16266,"endOffset":16381,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":16195,"endOffset":16262,"count":2}],"isBlockCoverage":true}]},{"scriptId":"829","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_mapping.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":18670,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":190,"endOffset":7513,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":358,"endOffset":605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":764,"endOffset":902,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":955,"endOffset":1623,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1678,"endOffset":1775,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1881,"endOffset":2019,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2072,"endOffset":2740,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2846,"endOffset":2984,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3037,"endOffset":3705,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3814,"endOffset":3952,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4005,"endOffset":4673,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4775,"endOffset":4913,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4962,"endOffset":5536,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5584,"endOffset":5644,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5755,"endOffset":5893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5939,"endOffset":6077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6123,"endOffset":6261,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6307,"endOffset":6445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6488,"endOffset":6843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6952,"endOffset":7090,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7199,"endOffset":7337,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7392,"endOffset":7489,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_ajson_mapping","ranges":[{"startOffset":7517,"endOffset":7660,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7663,"endOffset":7776,"count":0}],"isBlockCoverage":false},{"functionName":"create_camel_case","ranges":[{"startOffset":7779,"endOffset":7878,"count":0}],"isBlockCoverage":false},{"functionName":"create_camel_case","ranges":[{"startOffset":7888,"endOffset":9392,"count":6},{"startOffset":8762,"endOffset":8788,"count":4},{"startOffset":8790,"endOffset":8839,"count":0},{"startOffset":8967,"endOffset":8995,"count":4},{"startOffset":8997,"endOffset":9050,"count":4},{"startOffset":9079,"endOffset":9121,"count":4},{"startOffset":9123,"endOffset":9170,"count":2}],"isBlockCoverage":true},{"functionName":"create_compound_mapper","ranges":[{"startOffset":9395,"endOffset":9504,"count":0}],"isBlockCoverage":false},{"functionName":"create_compound_mapper","ranges":[{"startOffset":9514,"endOffset":11684,"count":1},{"startOffset":10309,"endOffset":10344,"count":0},{"startOffset":10736,"endOffset":10765,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":11466,"endOffset":11517,"count":3}],"isBlockCoverage":true},{"functionName":"create_field_mapping","ranges":[{"startOffset":11687,"endOffset":11792,"count":0}],"isBlockCoverage":false},{"functionName":"create_field_mapping","ranges":[{"startOffset":11802,"endOffset":12937,"count":16}],"isBlockCoverage":true},{"functionName":"create_lower_case","ranges":[{"startOffset":12940,"endOffset":13039,"count":0}],"isBlockCoverage":false},{"functionName":"create_lower_case","ranges":[{"startOffset":13049,"endOffset":14183,"count":3},{"startOffset":13923,"endOffset":13949,"count":0},{"startOffset":13951,"endOffset":14000,"count":0}],"isBlockCoverage":true},{"functionName":"create_rename","ranges":[{"startOffset":14186,"endOffset":14277,"count":0}],"isBlockCoverage":false},{"functionName":"create_rename","ranges":[{"startOffset":14287,"endOffset":15577,"count":4},{"startOffset":15231,"endOffset":15270,"count":3},{"startOffset":15336,"endOffset":15384,"count":1}],"isBlockCoverage":true},{"functionName":"create_to_camel_case","ranges":[{"startOffset":15580,"endOffset":15685,"count":0}],"isBlockCoverage":false},{"functionName":"create_to_camel_case","ranges":[{"startOffset":15695,"endOffset":16386,"count":5},{"startOffset":16003,"endOffset":16031,"count":1},{"startOffset":16033,"endOffset":16086,"count":1},{"startOffset":16115,"endOffset":16157,"count":1},{"startOffset":16159,"endOffset":16207,"count":4}],"isBlockCoverage":true},{"functionName":"create_to_snake_case","ranges":[{"startOffset":16389,"endOffset":16484,"count":0}],"isBlockCoverage":false},{"functionName":"create_to_snake_case","ranges":[{"startOffset":16494,"endOffset":16806,"count":3}],"isBlockCoverage":true},{"functionName":"create_upper_case","ranges":[{"startOffset":16809,"endOffset":16908,"count":0}],"isBlockCoverage":false},{"functionName":"create_upper_case","ranges":[{"startOffset":16918,"endOffset":18052,"count":4},{"startOffset":17792,"endOffset":17818,"count":0},{"startOffset":17820,"endOffset":17869,"count":0}],"isBlockCoverage":true}]},{"scriptId":"830","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_mapping.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":45177,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":182,"endOffset":1929,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":409,"endOffset":1077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1237,"endOffset":1905,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_mapping_fields","ranges":[{"startOffset":1933,"endOffset":2701,"count":16}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2704,"endOffset":4162,"count":16},{"startOffset":3902,"endOffset":4141,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":4165,"endOffset":5341,"count":5},{"startOffset":5258,"endOffset":5315,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":4981,"endOffset":5030,"count":3}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":5059,"endOffset":5081,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":5344,"endOffset":6649,"count":22},{"startOffset":6566,"endOffset":6623,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":6286,"endOffset":6336,"count":6}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":6365,"endOffset":6387,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":6652,"endOffset":7669,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7781,"endOffset":9578,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7996,"endOffset":8570,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8656,"endOffset":8716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8872,"endOffset":9446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9494,"endOffset":9554,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_rename","ranges":[{"startOffset":9582,"endOffset":10322,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":10325,"endOffset":11267,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":11270,"endOffset":11674,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":11677,"endOffset":12081,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":12084,"endOffset":15497,"count":20},{"startOffset":13735,"endOffset":14205,"count":5},{"startOffset":14205,"endOffset":15386,"count":15},{"startOffset":14312,"endOffset":14872,"count":10},{"startOffset":14872,"endOffset":15386,"count":5},{"startOffset":15228,"endOffset":15309,"count":1},{"startOffset":15323,"endOffset":15386,"count":0},{"startOffset":15451,"endOffset":15493,"count":6}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":13880,"endOffset":13929,"count":12}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":13960,"endOffset":13982,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":14532,"endOffset":14586,"count":10}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":14617,"endOffset":14639,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":15603,"endOffset":16822,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":15832,"endOffset":15970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16130,"endOffset":16798,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_mapping_to_upper","ranges":[{"startOffset":16826,"endOffset":17064,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":17067,"endOffset":18033,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":18036,"endOffset":18569,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":18572,"endOffset":19246,"count":2},{"startOffset":19131,"endOffset":19162,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":19249,"endOffset":20322,"count":11}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":20448,"endOffset":21667,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":20677,"endOffset":20815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20975,"endOffset":21643,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_mapping_to_lower","ranges":[{"startOffset":21671,"endOffset":21909,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":21912,"endOffset":22878,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":22881,"endOffset":23414,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":23417,"endOffset":24091,"count":2},{"startOffset":23976,"endOffset":24007,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":24094,"endOffset":25167,"count":6}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":25290,"endOffset":26848,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":25518,"endOffset":25615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25706,"endOffset":25844,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26004,"endOffset":26672,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26727,"endOffset":26824,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_mapping_camel","ranges":[{"startOffset":26852,"endOffset":27204,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":27207,"endOffset":28559,"count":6},{"startOffset":28292,"endOffset":28339,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":28562,"endOffset":29365,"count":2},{"startOffset":29121,"endOffset":29152,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":29368,"endOffset":31439,"count":12},{"startOffset":30365,"endOffset":30396,"count":0},{"startOffset":30743,"endOffset":30802,"count":2},{"startOffset":30802,"endOffset":30867,"count":10},{"startOffset":31055,"endOffset":31186,"count":9}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":31442,"endOffset":32459,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":32578,"endOffset":33682,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":32797,"endOffset":33152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33303,"endOffset":33658,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_compound_mapper","ranges":[{"startOffset":33686,"endOffset":34132,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":34135,"endOffset":34641,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":34644,"endOffset":36827,"count":5},{"startOffset":36640,"endOffset":36823,"count":10}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":36830,"endOffset":37234,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":37237,"endOffset":37641,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":37757,"endOffset":37972,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_to_snake","ranges":[{"startOffset":37976,"endOffset":38061,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":38064,"endOffset":38177,"count":3},{"startOffset":38120,"endOffset":38156,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":38180,"endOffset":39410,"count":32}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":39413,"endOffset":39817,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":39820,"endOffset":40224,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":40326,"endOffset":40929,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":40549,"endOffset":40646,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40808,"endOffset":40905,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_to_camel","ranges":[{"startOffset":40933,"endOffset":41132,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":41135,"endOffset":41449,"count":5}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":41452,"endOffset":44065,"count":35},{"startOffset":43144,"endOffset":43203,"count":5},{"startOffset":43203,"endOffset":43268,"count":30},{"startOffset":43701,"endOffset":43843,"count":21}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":43563,"endOffset":43614,"count":51}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":44068,"endOffset":44472,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":44475,"endOffset":44879,"count":0}],"isBlockCoverage":false}]},{"scriptId":"831","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_utilities.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":28880,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":6225,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":303,"endOffset":425,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":508,"endOffset":630,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":713,"endOffset":835,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":918,"endOffset":1040,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1123,"endOffset":1245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1399,"endOffset":1521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1564,"endOffset":1628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1671,"endOffset":1793,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1887,"endOffset":1951,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2045,"endOffset":2109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2153,"endOffset":2250,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2354,"endOffset":2476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2532,"endOffset":2629,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2722,"endOffset":2860,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2952,"endOffset":3016,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3061,"endOffset":3125,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3170,"endOffset":3292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3337,"endOffset":3459,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3515,"endOffset":3612,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3657,"endOffset":3779,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3824,"endOffset":3946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3991,"endOffset":4113,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4204,"endOffset":4326,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4371,"endOffset":4435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4480,"endOffset":4544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4589,"endOffset":4711,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4756,"endOffset":4878,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4934,"endOffset":5031,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5123,"endOffset":5187,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5230,"endOffset":5294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5337,"endOffset":5459,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5552,"endOffset":5649,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5694,"endOffset":5758,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5803,"endOffset":5867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5912,"endOffset":6034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6079,"endOffset":6201,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_ajson_utilities","ranges":[{"startOffset":6229,"endOffset":6959,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":6962,"endOffset":7075,"count":12},{"startOffset":7018,"endOffset":7054,"count":0}],"isBlockCoverage":true},{"functionName":"delete_empty_nodes","ranges":[{"startOffset":7078,"endOffset":10386,"count":37},{"startOffset":8462,"endOffset":10331,"count":38},{"startOffset":8633,"endOffset":9447,"count":35},{"startOffset":9099,"endOffset":9288,"count":1},{"startOffset":9380,"endOffset":9439,"count":1},{"startOffset":9912,"endOffset":10095,"count":1},{"startOffset":10185,"endOffset":10240,"count":1},{"startOffset":10301,"endOffset":10325,"count":37}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":8747,"endOffset":8944,"count":49},{"startOffset":8879,"endOffset":8942,"count":7}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":9558,"endOffset":9756,"count":50},{"startOffset":9691,"endOffset":9754,"count":19}],"isBlockCoverage":true},{"functionName":"diff","ranges":[{"startOffset":10389,"endOffset":13063,"count":12},{"startOffset":10847,"endOffset":10880,"count":7},{"startOffset":11043,"endOffset":11076,"count":7},{"startOffset":11236,"endOffset":11291,"count":1},{"startOffset":11365,"endOffset":11414,"count":11}],"isBlockCoverage":true},{"functionName":"diff_a_b","ranges":[{"startOffset":13066,"endOffset":19288,"count":22},{"startOffset":15107,"endOffset":19284,"count":59},{"startOffset":15914,"endOffset":18576,"count":53},{"startOffset":16142,"endOffset":17141,"count":50},{"startOffset":16322,"endOffset":16666,"count":1},{"startOffset":16666,"endOffset":17131,"count":49},{"startOffset":16792,"endOffset":16860,"count":8},{"startOffset":16860,"endOffset":17131,"count":41},{"startOffset":16949,"endOffset":17119,"count":3},{"startOffset":17141,"endOffset":18568,"count":3},{"startOffset":17327,"endOffset":17487,"count":1},{"startOffset":17487,"endOffset":17853,"count":2},{"startOffset":17613,"endOffset":17681,"count":0},{"startOffset":18032,"endOffset":18192,"count":1},{"startOffset":18192,"endOffset":18558,"count":2},{"startOffset":18318,"endOffset":18386,"count":0},{"startOffset":18576,"endOffset":19278,"count":6},{"startOffset":18758,"endOffset":18912,"count":0},{"startOffset":19038,"endOffset":19102,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":15019,"endOffset":15074,"count":293}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":15447,"endOffset":15560,"count":164},{"startOffset":15509,"endOffset":15558,"count":130}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":15591,"endOffset":15613,"count":244}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":15651,"endOffset":15673,"count":0}],"isBlockCoverage":false},{"functionName":"diff_b_a","ranges":[{"startOffset":19291,"endOffset":23083,"count":27},{"startOffset":19580,"endOffset":19611,"count":5},{"startOffset":19673,"endOffset":19710,"count":22},{"startOffset":20754,"endOffset":23079,"count":69},{"startOffset":21109,"endOffset":21287,"count":5},{"startOffset":21287,"endOffset":23073,"count":64},{"startOffset":21413,"endOffset":21471,"count":8},{"startOffset":21471,"endOffset":23073,"count":56},{"startOffset":21543,"endOffset":22332,"count":51},{"startOffset":22158,"endOffset":22322,"count":7},{"startOffset":22332,"endOffset":23065,"count":5},{"startOffset":22927,"endOffset":23055,"count":1}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":20666,"endOffset":20721,"count":319}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":21675,"endOffset":21788,"count":146},{"startOffset":21737,"endOffset":21786,"count":110}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":21823,"endOffset":21845,"count":200}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":21883,"endOffset":21905,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":22438,"endOffset":22553,"count":9}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":22588,"endOffset":22610,"count":18}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":22648,"endOffset":22671,"count":0}],"isBlockCoverage":false},{"functionName":"is_equal","ranges":[{"startOffset":23086,"endOffset":24759,"count":7},{"startOffset":23314,"endOffset":23347,"count":6},{"startOffset":23452,"endOffset":23485,"count":6},{"startOffset":23648,"endOffset":23681,"count":1},{"startOffset":23844,"endOffset":23877,"count":1},{"startOffset":24546,"endOffset":24639,"count":6},{"startOffset":24640,"endOffset":24733,"count":5}],"isBlockCoverage":true},{"functionName":"merge","ranges":[{"startOffset":24762,"endOffset":26400,"count":1},{"startOffset":25347,"endOffset":25380,"count":0},{"startOffset":25543,"endOffset":25576,"count":0},{"startOffset":25736,"endOffset":25791,"count":0}],"isBlockCoverage":true},{"functionName":"new","ranges":[{"startOffset":26403,"endOffset":26466,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":26476,"endOffset":26758,"count":7}],"isBlockCoverage":true},{"functionName":"normalize_input","ranges":[{"startOffset":26761,"endOffset":27940,"count":27},{"startOffset":27363,"endOffset":27528,"count":0},{"startOffset":27578,"endOffset":27673,"count":25},{"startOffset":27673,"endOffset":27916,"count":2},{"startOffset":27759,"endOffset":27916,"count":0}],"isBlockCoverage":true},{"functionName":"sort","ranges":[{"startOffset":27943,"endOffset":28703,"count":1},{"startOffset":28321,"endOffset":28350,"count":0}],"isBlockCoverage":true}]},{"scriptId":"832","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_apack_reader.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":49043,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":14117,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":300,"endOffset":429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":523,"endOffset":3329,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3415,"endOffset":3512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3659,"endOffset":6465,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6507,"endOffset":6571,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6742,"endOffset":6874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6925,"endOffset":7054,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7162,"endOffset":7294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7345,"endOffset":7474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7517,"endOffset":7583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7707,"endOffset":10513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10637,"endOffset":13443,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13566,"endOffset":13656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13762,"endOffset":13859,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13964,"endOffset":14093,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_apack_reader","ranges":[{"startOffset":14121,"endOffset":17279,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":17282,"endOffset":17604,"count":1}],"isBlockCoverage":true},{"functionName":"copy_manifest_descriptor","ranges":[{"startOffset":17607,"endOffset":25779,"count":0}],"isBlockCoverage":false},{"functionName":"create_instance","ranges":[{"startOffset":25786,"endOffset":25888,"count":0}],"isBlockCoverage":false},{"functionName":"create_instance","ranges":[{"startOffset":25902,"endOffset":26498,"count":1}],"isBlockCoverage":true},{"functionName":"deserialize","ranges":[{"startOffset":26505,"endOffset":26599,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":26613,"endOffset":30558,"count":0}],"isBlockCoverage":false},{"functionName":"format_version","ranges":[{"startOffset":30565,"endOffset":32479,"count":1},{"startOffset":32252,"endOffset":32471,"count":0}],"isBlockCoverage":true},{"functionName":"from_xml","ranges":[{"startOffset":32486,"endOffset":32574,"count":0}],"isBlockCoverage":false},{"functionName":"from_xml","ranges":[{"startOffset":32588,"endOffset":36018,"count":0}],"isBlockCoverage":false},{"functionName":"get_manifest_descriptor","ranges":[{"startOffset":36025,"endOffset":41940,"count":1},{"startOffset":39385,"endOffset":39440,"count":0},{"startOffset":39442,"endOffset":41830,"count":0}],"isBlockCoverage":true},{"functionName":"has_manifest","ranges":[{"startOffset":41947,"endOffset":45210,"count":0}],"isBlockCoverage":false},{"functionName":"set_manifest_descriptor","ranges":[{"startOffset":45217,"endOffset":48358,"count":1}],"isBlockCoverage":true}]},{"scriptId":"833","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_auth.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2461,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":716,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":343,"endOffset":440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":492,"endOffset":584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":628,"endOffset":692,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_auth","ranges":[{"startOffset":720,"endOffset":805,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":808,"endOffset":921,"count":0}],"isBlockCoverage":false},{"functionName":"is_allowed","ranges":[{"startOffset":924,"endOffset":1000,"count":0}],"isBlockCoverage":false},{"functionName":"is_allowed","ranges":[{"startOffset":1010,"endOffset":2328,"count":1},{"startOffset":1436,"endOffset":1467,"count":0},{"startOffset":1885,"endOffset":2081,"count":0},{"startOffset":2263,"endOffset":2295,"count":0}],"isBlockCoverage":true}]},{"scriptId":"834","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_background.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13351,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":951,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":411,"endOffset":927,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_background","ranges":[{"startOffset":955,"endOffset":1040,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1043,"endOffset":1156,"count":0}],"isBlockCoverage":false},{"functionName":"list_methods","ranges":[{"startOffset":1159,"endOffset":1235,"count":0}],"isBlockCoverage":false},{"functionName":"list_methods","ranges":[{"startOffset":1245,"endOffset":5138,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":5143,"endOffset":5205,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":5217,"endOffset":12321,"count":0}],"isBlockCoverage":false}]},{"scriptId":"835","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_background_pull.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8999,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":329,"count":1}],"isBlockCoverage":true},{"functionName":"zcl_abapgit_background_pull","ranges":[{"startOffset":333,"endOffset":418,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":421,"endOffset":534,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_description","ranges":[{"startOffset":537,"endOffset":670,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_description","ranges":[{"startOffset":680,"endOffset":910,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_settings","ranges":[{"startOffset":913,"endOffset":1050,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_settings","ranges":[{"startOffset":1060,"endOffset":1709,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$run","ranges":[{"startOffset":1712,"endOffset":8822,"count":0}],"isBlockCoverage":false}]},{"scriptId":"836","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_background_push_au.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":45944,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":9141,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":333,"endOffset":451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":606,"endOffset":670,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":714,"endOffset":4390,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4485,"endOffset":4615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4723,"endOffset":5024,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5073,"endOffset":5167,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5267,"endOffset":5397,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5441,"endOffset":9117,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_background_push_au","ranges":[{"startOffset":9145,"endOffset":9352,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":9355,"endOffset":9468,"count":0}],"isBlockCoverage":false},{"functionName":"build_comment","ranges":[{"startOffset":9471,"endOffset":15910,"count":0}],"isBlockCoverage":false},{"functionName":"determine_user_details","ranges":[{"startOffset":15913,"endOffset":17133,"count":0}],"isBlockCoverage":false},{"functionName":"push_auto","ranges":[{"startOffset":17136,"endOffset":32625,"count":0}],"isBlockCoverage":false},{"functionName":"push_deletions","ranges":[{"startOffset":32628,"endOffset":39306,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_description","ranges":[{"startOffset":39309,"endOffset":39445,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_description","ranges":[{"startOffset":39455,"endOffset":39698,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_settings","ranges":[{"startOffset":39701,"endOffset":39841,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_settings","ranges":[{"startOffset":39851,"endOffset":40500,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$run","ranges":[{"startOffset":40503,"endOffset":45755,"count":0}],"isBlockCoverage":false}]},{"scriptId":"837","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_background_push_fi.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":30670,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":5128,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":333,"endOffset":451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":535,"endOffset":724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":879,"endOffset":943,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":987,"endOffset":4663,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4759,"endOffset":4889,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4932,"endOffset":4996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5040,"endOffset":5104,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_background_push_fi","ranges":[{"startOffset":5132,"endOffset":5404,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5407,"endOffset":5520,"count":0}],"isBlockCoverage":false},{"functionName":"build_comment","ranges":[{"startOffset":5523,"endOffset":11964,"count":0}],"isBlockCoverage":false},{"functionName":"push_fixed","ranges":[{"startOffset":11967,"endOffset":20577,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_description","ranges":[{"startOffset":20580,"endOffset":20716,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_description","ranges":[{"startOffset":20726,"endOffset":20970,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_settings","ranges":[{"startOffset":20973,"endOffset":21113,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$get_settings","ranges":[{"startOffset":21123,"endOffset":23524,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_background$run","ranges":[{"startOffset":23527,"endOffset":30128,"count":0}],"isBlockCoverage":false}]},{"scriptId":"838","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_code_inspector.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":31140,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":4216,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":329,"endOffset":425,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":509,"endOffset":606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":690,"endOffset":754,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":841,"endOffset":906,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":987,"endOffset":1044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1129,"endOffset":1176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1261,"endOffset":1975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2129,"endOffset":2193,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2293,"endOffset":2354,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2403,"endOffset":2468,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2577,"endOffset":2642,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2684,"endOffset":2748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2794,"endOffset":2861,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2966,"endOffset":3070,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3173,"endOffset":3234,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3337,"endOffset":3404,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3450,"endOffset":3546,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3638,"endOffset":3702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3799,"endOffset":3896,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3938,"endOffset":3996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4096,"endOffset":4192,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_code_inspector","ranges":[{"startOffset":4220,"endOffset":4843,"count":0}],"isBlockCoverage":false},{"functionName":"cleanup","ranges":[{"startOffset":4846,"endOffset":7034,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7041,"endOffset":7792,"count":0}],"isBlockCoverage":false},{"functionName":"create_inspection","ranges":[{"startOffset":7799,"endOffset":10252,"count":0}],"isBlockCoverage":false},{"functionName":"create_objectset","ranges":[{"startOffset":10263,"endOffset":13730,"count":0}],"isBlockCoverage":false},{"functionName":"create_variant","ranges":[{"startOffset":13745,"endOffset":15689,"count":0}],"isBlockCoverage":false},{"functionName":"decide_run_mode","ranges":[{"startOffset":15706,"endOffset":16772,"count":0}],"isBlockCoverage":false},{"functionName":"filter_inspection","ranges":[{"startOffset":16789,"endOffset":17225,"count":0}],"isBlockCoverage":false},{"functionName":"run_inspection","ranges":[{"startOffset":17242,"endOffset":18990,"count":0}],"isBlockCoverage":false},{"functionName":"skip_object","ranges":[{"startOffset":19009,"endOffset":20061,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_code_inspector$get_summary","ranges":[{"startOffset":20080,"endOffset":20327,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_code_inspector$is_successful","ranges":[{"startOffset":20346,"endOffset":20628,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_code_inspector$list_global_variants","ranges":[{"startOffset":20647,"endOffset":21827,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_code_inspector$run","ranges":[{"startOffset":21846,"endOffset":28040,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_code_inspector$validate_check_variant","ranges":[{"startOffset":28059,"endOffset":29501,"count":0}],"isBlockCoverage":false}]},{"scriptId":"839","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_convert.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20763,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":5157,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":284,"endOffset":406,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":493,"endOffset":613,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":770,"endOffset":836,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":879,"endOffset":915,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1014,"endOffset":1074,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1117,"endOffset":1159,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1260,"endOffset":1364,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1404,"endOffset":1440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1551,"endOffset":1617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1662,"endOffset":1726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1836,"endOffset":1900,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1943,"endOffset":1979,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2024,"endOffset":2084,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2199,"endOffset":2265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2310,"endOffset":2374,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2471,"endOffset":2531,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2577,"endOffset":2643,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2747,"endOffset":2813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2853,"endOffset":2913,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3012,"endOffset":3270,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3315,"endOffset":3379,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3494,"endOffset":3583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3627,"endOffset":3716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3819,"endOffset":3885,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3927,"endOffset":3991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4089,"endOffset":4153,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4196,"endOffset":4256,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4298,"endOffset":4418,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4521,"endOffset":4587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4632,"endOffset":4696,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4799,"endOffset":4865,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4908,"endOffset":4968,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5013,"endOffset":5133,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_convert","ranges":[{"startOffset":5161,"endOffset":5368,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5371,"endOffset":5484,"count":0}],"isBlockCoverage":false},{"functionName":"base64_to_xstring","ranges":[{"startOffset":5487,"endOffset":5580,"count":0}],"isBlockCoverage":false},{"functionName":"base64_to_xstring","ranges":[{"startOffset":5590,"endOffset":5950,"count":4}],"isBlockCoverage":true},{"functionName":"bitbyte_to_int","ranges":[{"startOffset":5953,"endOffset":6040,"count":0}],"isBlockCoverage":false},{"functionName":"bitbyte_to_int","ranges":[{"startOffset":6050,"endOffset":7758,"count":4015},{"startOffset":6938,"endOffset":7684,"count":12824},{"startOffset":7083,"endOffset":7280,"count":1761},{"startOffset":7206,"endOffset":7272,"count":508},{"startOffset":7280,"endOffset":7592,"count":11063},{"startOffset":7399,"endOffset":7592,"count":4484}],"isBlockCoverage":true},{"functionName":"conversion_exit_isola_output","ranges":[{"startOffset":7761,"endOffset":7876,"count":0}],"isBlockCoverage":false},{"functionName":"conversion_exit_isola_output","ranges":[{"startOffset":7886,"endOffset":8367,"count":1}],"isBlockCoverage":true},{"functionName":"int_to_xstring4","ranges":[{"startOffset":8370,"endOffset":8459,"count":0}],"isBlockCoverage":false},{"functionName":"int_to_xstring4","ranges":[{"startOffset":8469,"endOffset":8807,"count":2003}],"isBlockCoverage":true},{"functionName":"split_string","ranges":[{"startOffset":8810,"endOffset":8893,"count":0}],"isBlockCoverage":false},{"functionName":"split_string","ranges":[{"startOffset":8903,"endOffset":9804,"count":2},{"startOffset":9523,"endOffset":9779,"count":1}],"isBlockCoverage":true},{"functionName":"string_to_tab","ranges":[{"startOffset":9807,"endOffset":9892,"count":0}],"isBlockCoverage":false},{"functionName":"string_to_tab","ranges":[{"startOffset":9902,"endOffset":11437,"count":1},{"startOffset":11124,"endOffset":11382,"count":5}],"isBlockCoverage":true},{"functionName":"string_to_xstring","ranges":[{"startOffset":11440,"endOffset":11533,"count":0}],"isBlockCoverage":false},{"functionName":"string_to_xstring","ranges":[{"startOffset":11543,"endOffset":11870,"count":32}],"isBlockCoverage":true},{"functionName":"string_to_xstring_utf8","ranges":[{"startOffset":11873,"endOffset":11976,"count":0}],"isBlockCoverage":false},{"functionName":"string_to_xstring_utf8","ranges":[{"startOffset":11986,"endOffset":13330,"count":134},{"startOffset":12416,"endOffset":12579,"count":1},{"startOffset":12687,"endOffset":13303,"count":0}],"isBlockCoverage":true},{"functionName":"string_to_xstring_utf8_bom","ranges":[{"startOffset":13333,"endOffset":13444,"count":0}],"isBlockCoverage":false},{"functionName":"string_to_xstring_utf8_bom","ranges":[{"startOffset":13454,"endOffset":14227,"count":3},{"startOffset":13748,"endOffset":13780,"count":1},{"startOffset":13780,"endOffset":13960,"count":2},{"startOffset":13960,"endOffset":14074,"count":1},{"startOffset":14076,"endOffset":14226,"count":2}],"isBlockCoverage":true},{"functionName":"xstring_remove_bom","ranges":[{"startOffset":14230,"endOffset":14325,"count":0}],"isBlockCoverage":false},{"functionName":"xstring_remove_bom","ranges":[{"startOffset":14335,"endOffset":14955,"count":78},{"startOffset":14670,"endOffset":14759,"count":0},{"startOffset":14760,"endOffset":14871,"count":0},{"startOffset":14873,"endOffset":14931,"count":0}],"isBlockCoverage":true},{"functionName":"xstring_to_bintab","ranges":[{"startOffset":14958,"endOffset":15051,"count":0}],"isBlockCoverage":false},{"functionName":"xstring_to_bintab","ranges":[{"startOffset":15061,"endOffset":16626,"count":1}],"isBlockCoverage":true},{"functionName":"xstring_to_int","ranges":[{"startOffset":16629,"endOffset":16716,"count":0}],"isBlockCoverage":false},{"functionName":"xstring_to_int","ranges":[{"startOffset":16726,"endOffset":17007,"count":2004}],"isBlockCoverage":true},{"functionName":"xstring_to_string_utf8","ranges":[{"startOffset":17010,"endOffset":17113,"count":0}],"isBlockCoverage":false},{"functionName":"xstring_to_string_utf8","ranges":[{"startOffset":17123,"endOffset":18936,"count":78},{"startOffset":17430,"endOffset":17463,"count":16},{"startOffset":17872,"endOffset":17938,"count":62},{"startOffset":18016,"endOffset":18177,"count":1},{"startOffset":18287,"endOffset":18294,"count":76},{"startOffset":18294,"endOffset":18910,"count":2},{"startOffset":18638,"endOffset":18742,"count":0},{"startOffset":18864,"endOffset":18904,"count":0},{"startOffset":18910,"endOffset":18935,"count":76}],"isBlockCoverage":true},{"functionName":"x_to_bitbyte","ranges":[{"startOffset":18939,"endOffset":19022,"count":0}],"isBlockCoverage":false},{"functionName":"x_to_bitbyte","ranges":[{"startOffset":19032,"endOffset":20331,"count":4024}],"isBlockCoverage":true}]},{"scriptId":"840","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_cts_api.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":39861,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":4218,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":320,"endOffset":417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":527,"endOffset":831,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":945,"endOffset":1111,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1221,"endOffset":1379,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1552,"endOffset":1644,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1693,"endOffset":1747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1797,"endOffset":1894,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1944,"endOffset":2042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2162,"endOffset":2254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2303,"endOffset":2357,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2407,"endOffset":2504,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2554,"endOffset":2652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2769,"endOffset":2866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2915,"endOffset":2969,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3019,"endOffset":3116,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3166,"endOffset":3264,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3377,"endOffset":3474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3523,"endOffset":3577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3627,"endOffset":3724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3847,"endOffset":3944,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3993,"endOffset":4047,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4097,"endOffset":4194,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_cts_api","ranges":[{"startOffset":4222,"endOffset":4805,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4808,"endOffset":4921,"count":0}],"isBlockCoverage":false},{"functionName":"get_current_transport_for_obj","ranges":[{"startOffset":4924,"endOffset":8316,"count":0}],"isBlockCoverage":false},{"functionName":"get_current_transport_from_db","ranges":[{"startOffset":8321,"endOffset":9643,"count":0}],"isBlockCoverage":false},{"functionName":"is_object_locked_in_transport","ranges":[{"startOffset":9648,"endOffset":12805,"count":0}],"isBlockCoverage":false},{"functionName":"is_object_type_lockable","ranges":[{"startOffset":12812,"endOffset":14383,"count":0}],"isBlockCoverage":false},{"functionName":"is_object_type_transportable","ranges":[{"startOffset":14390,"endOffset":15983,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$create_transport_entries","ranges":[{"startOffset":15990,"endOffset":20023,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$get_r3tr_obj_for_limu_obj","ranges":[{"startOffset":20034,"endOffset":22169,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$get_transports_for_list","ranges":[{"startOffset":22182,"endOffset":27910,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$get_transport_for_object","ranges":[{"startOffset":27923,"endOffset":29781,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$insert_transport_object","ranges":[{"startOffset":29794,"endOffset":32912,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$is_chrec_possible_for_package","ranges":[{"startOffset":32927,"endOffset":33635,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$read_description","ranges":[{"startOffset":33650,"endOffset":34304,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$read_user","ranges":[{"startOffset":34319,"endOffset":34918,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_cts_api$confirm_transport_messages","ranges":[{"startOffset":34933,"endOffset":37994,"count":0}],"isBlockCoverage":false}]},{"scriptId":"841","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_config.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20701,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":3087,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":316,"endOffset":1131,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1243,"endOffset":1307,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1421,"endOffset":1485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1591,"endOffset":1655,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1764,"endOffset":2220,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2363,"endOffset":2429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2474,"endOffset":3063,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_data_config","ranges":[{"startOffset":3091,"endOffset":4504,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4507,"endOffset":4620,"count":7},{"startOffset":4563,"endOffset":4599,"count":0}],"isBlockCoverage":true},{"functionName":"dump","ranges":[{"startOffset":4623,"endOffset":6377,"count":1},{"startOffset":6044,"endOffset":6353,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_data_config$add_config","ranges":[{"startOffset":6380,"endOffset":9431,"count":8},{"startOffset":8237,"endOffset":9427,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":8330,"endOffset":8441,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":8472,"endOffset":8494,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":8531,"endOffset":8553,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":8995,"endOffset":9051,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":9084,"endOffset":9112,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_data_config$from_json","ranges":[{"startOffset":9434,"endOffset":13166,"count":1},{"startOffset":12756,"endOffset":13079,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":11936,"endOffset":12337,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_data_config$get_configs","ranges":[{"startOffset":13169,"endOffset":14099,"count":6}],"isBlockCoverage":true},{"functionName":"zif_abapgit_data_config$remove_config","ranges":[{"startOffset":14102,"endOffset":15492,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_data_config$to_json","ranges":[{"startOffset":15495,"endOffset":18258,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_data_config$update_config","ranges":[{"startOffset":18261,"endOffset":19133,"count":0}],"isBlockCoverage":false}]},{"scriptId":"842","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_deserializer.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":44941,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":6437,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":420,"endOffset":925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":968,"endOffset":1041,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1153,"endOffset":2438,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2481,"endOffset":2529,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2573,"endOffset":2831,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2877,"endOffset":2950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2996,"endOffset":3069,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3175,"endOffset":3223,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3265,"endOffset":3338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3380,"endOffset":3453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3495,"endOffset":3568,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3673,"endOffset":3746,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3789,"endOffset":3837,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3881,"endOffset":4139,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4265,"endOffset":4357,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4400,"endOffset":4516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4569,"endOffset":4865,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4986,"endOffset":5083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5128,"endOffset":6413,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_data_deserializer","ranges":[{"startOffset":6441,"endOffset":6526,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":6529,"endOffset":6642,"count":4},{"startOffset":6585,"endOffset":6621,"count":0}],"isBlockCoverage":true},{"functionName":"convert_json_to_itab","ranges":[{"startOffset":6645,"endOffset":8477,"count":0}],"isBlockCoverage":false},{"functionName":"determine_transport_request","ranges":[{"startOffset":8480,"endOffset":9741,"count":0}],"isBlockCoverage":false},{"functionName":"is_table_allowed_to_edit","ranges":[{"startOffset":9744,"endOffset":11508,"count":0}],"isBlockCoverage":false},{"functionName":"preview_database_changes","ranges":[{"startOffset":11511,"endOffset":16278,"count":3},{"startOffset":15706,"endOffset":16252,"count":2},{"startOffset":15927,"endOffset":16246,"count":1}],"isBlockCoverage":true},{"functionName":"read_database_table","ranges":[{"startOffset":16281,"endOffset":17953,"count":0}],"isBlockCoverage":false},{"functionName":"write_database_table","ranges":[{"startOffset":17956,"endOffset":21081,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_data_deserializer$actualize","ranges":[{"startOffset":21084,"endOffset":33238,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_data_deserializer$deserialize","ranges":[{"startOffset":33241,"endOffset":42254,"count":1},{"startOffset":40736,"endOffset":42222,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":40125,"endOffset":40286,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":40317,"endOffset":40339,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":40434,"endOffset":40460,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":41423,"endOffset":41584,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":41617,"endOffset":41639,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":41734,"endOffset":41760,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_data_deserializer$deserialize_check","ranges":[{"startOffset":42257,"endOffset":44756,"count":0}],"isBlockCoverage":false}]},{"scriptId":"843","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_factory.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5107,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":1958,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":297,"endOffset":437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":524,"endOffset":666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":755,"endOffset":901,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1058,"endOffset":1198,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1304,"endOffset":1446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1556,"endOffset":1702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1800,"endOffset":1934,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_data_factory","ranges":[{"startOffset":1962,"endOffset":2244,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2247,"endOffset":2360,"count":0}],"isBlockCoverage":false},{"functionName":"get_config","ranges":[{"startOffset":2363,"endOffset":2437,"count":0}],"isBlockCoverage":false},{"functionName":"get_config","ranges":[{"startOffset":2447,"endOffset":2722,"count":0}],"isBlockCoverage":false},{"functionName":"get_deserializer","ranges":[{"startOffset":2725,"endOffset":2811,"count":0}],"isBlockCoverage":false},{"functionName":"get_deserializer","ranges":[{"startOffset":2821,"endOffset":3312,"count":0}],"isBlockCoverage":false},{"functionName":"get_serializer","ranges":[{"startOffset":3315,"endOffset":3397,"count":0}],"isBlockCoverage":false},{"functionName":"get_serializer","ranges":[{"startOffset":3407,"endOffset":3878,"count":0}],"isBlockCoverage":false},{"functionName":"get_supporter","ranges":[{"startOffset":3881,"endOffset":3961,"count":0}],"isBlockCoverage":false},{"functionName":"get_supporter","ranges":[{"startOffset":3971,"endOffset":4432,"count":2},{"startOffset":4213,"endOffset":4342,"count":1}],"isBlockCoverage":true}]},{"scriptId":"844","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_injector.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2467,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":1043,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":375,"endOffset":515,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":621,"endOffset":763,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":873,"endOffset":1019,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_data_injector","ranges":[{"startOffset":1047,"endOffset":1132,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1135,"endOffset":1248,"count":1},{"startOffset":1191,"endOffset":1227,"count":0}],"isBlockCoverage":true},{"functionName":"set_deserializer","ranges":[{"startOffset":1251,"endOffset":1613,"count":0}],"isBlockCoverage":false},{"functionName":"set_serializer","ranges":[{"startOffset":1616,"endOffset":1960,"count":0}],"isBlockCoverage":false},{"functionName":"set_supporter","ranges":[{"startOffset":1963,"endOffset":2298,"count":1}],"isBlockCoverage":true}]},{"scriptId":"845","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_serializer.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11442,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":1480,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":336,"endOffset":396,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":555,"endOffset":621,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":664,"endOffset":737,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":788,"endOffset":885,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":990,"endOffset":1063,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1106,"endOffset":1154,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1198,"endOffset":1456,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_data_serializer","ranges":[{"startOffset":1484,"endOffset":1637,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1640,"endOffset":1753,"count":3},{"startOffset":1696,"endOffset":1732,"count":0}],"isBlockCoverage":true},{"functionName":"convert_itab_to_json","ranges":[{"startOffset":1756,"endOffset":3870,"count":1},{"startOffset":3101,"endOffset":3302,"count":0},{"startOffset":3428,"endOffset":3737,"count":0}],"isBlockCoverage":true},{"functionName":"read_database_table","ranges":[{"startOffset":3873,"endOffset":6515,"count":2},{"startOffset":5430,"endOffset":5536,"count":1},{"startOffset":5536,"endOffset":5729,"count":0},{"startOffset":5736,"endOffset":6046,"count":1},{"startOffset":6000,"endOffset":6040,"count":0},{"startOffset":6046,"endOffset":6186,"count":1},{"startOffset":6186,"endOffset":6491,"count":0},{"startOffset":6491,"endOffset":6514,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5356,"endOffset":5402,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_data_serializer$serialize","ranges":[{"startOffset":6518,"endOffset":11121,"count":3},{"startOffset":10353,"endOffset":10617,"count":2},{"startOffset":10472,"endOffset":10617,"count":1},{"startOffset":10617,"endOffset":10784,"count":1},{"startOffset":10784,"endOffset":11120,"count":2}],"isBlockCoverage":true}]},{"scriptId":"846","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_supporter.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5399,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":949,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":339,"endOffset":806,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_data_supporter","ranges":[{"startOffset":953,"endOffset":1523,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1526,"endOffset":1639,"count":1},{"startOffset":1582,"endOffset":1618,"count":0}],"isBlockCoverage":true},{"functionName":"get_supported_objects","ranges":[{"startOffset":1642,"endOffset":3437,"count":1},{"startOffset":2952,"endOffset":3246,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_data_supporter$is_object_supported","ranges":[{"startOffset":3440,"endOffset":5226,"count":1},{"startOffset":4742,"endOffset":4797,"count":0},{"startOffset":4983,"endOffset":5191,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":4367,"endOffset":4452,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":4481,"endOffset":4503,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":4527,"endOffset":4549,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":4895,"endOffset":4950,"count":0}],"isBlockCoverage":false}]},{"scriptId":"847","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_utils.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":26217,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":4071,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":364,"endOffset":657,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":700,"endOffset":748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":850,"endOffset":923,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":966,"endOffset":1014,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1123,"endOffset":1187,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1232,"endOffset":1821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1932,"endOffset":1996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2041,"endOffset":2630,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2720,"endOffset":2817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2860,"endOffset":3454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3558,"endOffset":3655,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3698,"endOffset":3746,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3859,"endOffset":3956,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3999,"endOffset":4047,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_data_utils","ranges":[{"startOffset":4075,"endOffset":4160,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4163,"endOffset":4276,"count":0}],"isBlockCoverage":false},{"functionName":"build_config_filename","ranges":[{"startOffset":4279,"endOffset":4383,"count":0}],"isBlockCoverage":false},{"functionName":"build_config_filename","ranges":[{"startOffset":4393,"endOffset":5738,"count":2}],"isBlockCoverage":true},{"functionName":"build_data_filename","ranges":[{"startOffset":5741,"endOffset":5841,"count":0}],"isBlockCoverage":false},{"functionName":"build_data_filename","ranges":[{"startOffset":5851,"endOffset":7142,"count":6}],"isBlockCoverage":true},{"functionName":"build_table_itab","ranges":[{"startOffset":7145,"endOffset":7239,"count":0}],"isBlockCoverage":false},{"functionName":"build_table_itab","ranges":[{"startOffset":7249,"endOffset":12776,"count":22},{"startOffset":10438,"endOffset":10489,"count":21},{"startOffset":10489,"endOffset":10714,"count":1},{"startOffset":10668,"endOffset":10706,"count":0},{"startOffset":10804,"endOffset":10990,"count":1},{"startOffset":10982,"endOffset":10990,"count":0},{"startOffset":10990,"endOffset":11877,"count":21},{"startOffset":11672,"endOffset":11867,"count":55},{"startOffset":11877,"endOffset":11977,"count":21},{"startOffset":11977,"endOffset":12077,"count":0},{"startOffset":12077,"endOffset":12287,"count":21},{"startOffset":12287,"endOffset":12339,"count":0},{"startOffset":12339,"endOffset":12445,"count":21},{"startOffset":12445,"endOffset":12748,"count":0},{"startOffset":12748,"endOffset":12775,"count":21}],"isBlockCoverage":true},{"functionName":"does_table_exist","ranges":[{"startOffset":12781,"endOffset":12879,"count":0}],"isBlockCoverage":false},{"functionName":"does_table_exist","ranges":[{"startOffset":12891,"endOffset":13474,"count":3},{"startOffset":13214,"endOffset":13270,"count":2},{"startOffset":13270,"endOffset":13444,"count":1},{"startOffset":13400,"endOffset":13436,"count":0}],"isBlockCoverage":true},{"functionName":"is_customizing_table","ranges":[{"startOffset":13479,"endOffset":13585,"count":0}],"isBlockCoverage":false},{"functionName":"is_customizing_table","ranges":[{"startOffset":13597,"endOffset":17179,"count":0}],"isBlockCoverage":false},{"functionName":"jump","ranges":[{"startOffset":17186,"endOffset":17264,"count":0}],"isBlockCoverage":false},{"functionName":"jump","ranges":[{"startOffset":17278,"endOffset":19649,"count":0}],"isBlockCoverage":false},{"functionName":"list_key_fields","ranges":[{"startOffset":19658,"endOffset":19762,"count":0}],"isBlockCoverage":false},{"functionName":"list_key_fields","ranges":[{"startOffset":19778,"endOffset":25717,"count":21},{"startOffset":21222,"endOffset":21273,"count":0},{"startOffset":21425,"endOffset":21592,"count":0},{"startOffset":21594,"endOffset":22808,"count":0},{"startOffset":22810,"endOffset":23102,"count":0},{"startOffset":23240,"endOffset":23316,"count":0},{"startOffset":24025,"endOffset":24427,"count":0},{"startOffset":24529,"endOffset":24716,"count":0},{"startOffset":24803,"endOffset":25586,"count":80},{"startOffset":25157,"endOffset":25212,"count":25},{"startOffset":25212,"endOffset":25586,"count":55},{"startOffset":25604,"endOffset":25656,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22099,"endOffset":22247,"count":0}],"isBlockCoverage":true}]},{"scriptId":"848","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_default_transport.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10928,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":1999,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":311,"endOffset":453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":547,"endOffset":644,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":725,"endOffset":781,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1039,"endOffset":1131,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1230,"endOffset":1286,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1388,"endOffset":1530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1680,"endOffset":1772,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1919,"endOffset":1975,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_default_transport","ranges":[{"startOffset":2003,"endOffset":2330,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":2333,"endOffset":3723,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3728,"endOffset":3806,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":3811,"endOffset":5406,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":5413,"endOffset":5504,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":5518,"endOffset":6020,"count":0}],"isBlockCoverage":false},{"functionName":"reset","ranges":[{"startOffset":6027,"endOffset":6507,"count":0}],"isBlockCoverage":false},{"functionName":"restore","ranges":[{"startOffset":6514,"endOffset":8061,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":8070,"endOffset":8738,"count":0}],"isBlockCoverage":false},{"functionName":"set_internal","ranges":[{"startOffset":8747,"endOffset":10459,"count":0}],"isBlockCoverage":false},{"functionName":"store","ranges":[{"startOffset":10470,"endOffset":10547,"count":0}],"isBlockCoverage":false}]},{"scriptId":"849","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_dependencies.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":37327,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":4003,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":367,"endOffset":1176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1289,"endOffset":2068,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2116,"endOffset":2164,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2267,"endOffset":3076,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3170,"endOffset":3979,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_dependencies","ranges":[{"startOffset":4007,"endOffset":4092,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4095,"endOffset":4208,"count":0}],"isBlockCoverage":false},{"functionName":"get_ddls_dependencies","ranges":[{"startOffset":4211,"endOffset":4317,"count":0}],"isBlockCoverage":false},{"functionName":"get_ddls_dependencies","ranges":[{"startOffset":4327,"endOffset":5814,"count":0}],"isBlockCoverage":false},{"functionName":"resolve","ranges":[{"startOffset":5817,"endOffset":5895,"count":0}],"isBlockCoverage":false},{"functionName":"resolve","ranges":[{"startOffset":5905,"endOffset":14952,"count":0}],"isBlockCoverage":false},{"functionName":"resolve_ddic","ranges":[{"startOffset":14955,"endOffset":15043,"count":0}],"isBlockCoverage":false},{"functionName":"resolve_ddic","ranges":[{"startOffset":15053,"endOffset":31122,"count":0}],"isBlockCoverage":false},{"functionName":"resolve_packages","ranges":[{"startOffset":31127,"endOffset":31227,"count":0}],"isBlockCoverage":false},{"functionName":"resolve_packages","ranges":[{"startOffset":31239,"endOffset":35457,"count":1},{"startOffset":34122,"endOffset":35451,"count":3},{"startOffset":34488,"endOffset":35443,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":33966,"endOffset":34055,"count":3}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":34640,"endOffset":34773,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":34808,"endOffset":34832,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":34888,"endOffset":34914,"count":0}],"isBlockCoverage":false}]},{"scriptId":"850","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_diff.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":57324,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":11265,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":271,"endOffset":554,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":635,"endOffset":1862,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1944,"endOffset":2327,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2416,"endOffset":2463,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2551,"endOffset":2648,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2740,"endOffset":2800,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2944,"endOffset":3010,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3052,"endOffset":3118,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3160,"endOffset":3416,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3458,"endOffset":3714,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3931,"endOffset":4264,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4368,"endOffset":5595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5637,"endOffset":5893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5935,"endOffset":6191,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6403,"endOffset":6469,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6511,"endOffset":6577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6634,"endOffset":6731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6785,"endOffset":6882,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6932,"endOffset":7029,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7118,"endOffset":8345,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8437,"endOffset":8820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8923,"endOffset":8983,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9032,"endOffset":9129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9232,"endOffset":9292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9341,"endOffset":9438,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9538,"endOffset":9821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9925,"endOffset":10022,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10066,"endOffset":10126,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10237,"endOffset":11095,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11144,"endOffset":11241,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_diff","ranges":[{"startOffset":11269,"endOffset":13502,"count":0}],"isBlockCoverage":false},{"functionName":"adjust_diff","ranges":[{"startOffset":13505,"endOffset":20570,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_stats","ranges":[{"startOffset":20573,"endOffset":22416,"count":0}],"isBlockCoverage":false},{"functionName":"compute_and_render","ranges":[{"startOffset":22419,"endOffset":30994,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":30999,"endOffset":33632,"count":0}],"isBlockCoverage":false},{"functionName":"create_regex_set","ranges":[{"startOffset":33637,"endOffset":35973,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":35978,"endOffset":37285,"count":0}],"isBlockCoverage":false},{"functionName":"get_beacons","ranges":[{"startOffset":37290,"endOffset":37673,"count":0}],"isBlockCoverage":false},{"functionName":"is_line_patched","ranges":[{"startOffset":37678,"endOffset":39299,"count":0}],"isBlockCoverage":false},{"functionName":"map_beacons","ranges":[{"startOffset":39304,"endOffset":43686,"count":0}],"isBlockCoverage":false},{"functionName":"set_patch_by_old_diff","ranges":[{"startOffset":43691,"endOffset":46363,"count":0}],"isBlockCoverage":false},{"functionName":"set_patch_new","ranges":[{"startOffset":46368,"endOffset":48315,"count":0}],"isBlockCoverage":false},{"functionName":"set_patch_old","ranges":[{"startOffset":48320,"endOffset":50267,"count":0}],"isBlockCoverage":false},{"functionName":"shortlist","ranges":[{"startOffset":50272,"endOffset":53525,"count":0}],"isBlockCoverage":false},{"functionName":"stats","ranges":[{"startOffset":53530,"endOffset":53999,"count":0}],"isBlockCoverage":false},{"functionName":"unpack","ranges":[{"startOffset":54004,"endOffset":56700,"count":0}],"isBlockCoverage":false}]},{"scriptId":"851","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_dot_abapgit.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":45655,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":17648,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":289,"endOffset":2238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2382,"endOffset":2446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2489,"endOffset":4438,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4532,"endOffset":6481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6523,"endOffset":6587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6693,"endOffset":6823,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6927,"endOffset":7057,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7100,"endOffset":7166,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7263,"endOffset":9212,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9307,"endOffset":9373,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9466,"endOffset":9971,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10065,"endOffset":12014,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12110,"endOffset":12174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12221,"endOffset":12285,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12384,"endOffset":12481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12524,"endOffset":12588,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12635,"endOffset":12699,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12798,"endOffset":12862,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12909,"endOffset":12973,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13078,"endOffset":13142,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13245,"endOffset":13309,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13412,"endOffset":13476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13581,"endOffset":13645,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13752,"endOffset":13841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13950,"endOffset":14258,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14367,"endOffset":14675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14779,"endOffset":15200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15292,"endOffset":15389,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15431,"endOffset":15528,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15638,"endOffset":16213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16323,"endOffset":16898,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17016,"endOffset":17080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17198,"endOffset":17240,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17368,"endOffset":17432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17560,"endOffset":17624,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_dot_abapgit","ranges":[{"startOffset":17652,"endOffset":19691,"count":49}],"isBlockCoverage":true},{"functionName":"add_ignore","ranges":[{"startOffset":19694,"endOffset":20514,"count":1},{"startOffset":20388,"endOffset":20409,"count":0}],"isBlockCoverage":true},{"functionName":"build_default","ranges":[{"startOffset":20517,"endOffset":20596,"count":0}],"isBlockCoverage":false},{"functionName":"build_default","ranges":[{"startOffset":20606,"endOffset":23144,"count":48}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":23147,"endOffset":25241,"count":49}],"isBlockCoverage":true},{"functionName":"deserialize","ranges":[{"startOffset":25244,"endOffset":25329,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":25339,"endOffset":27963,"count":1}],"isBlockCoverage":true},{"functionName":"from_xml","ranges":[{"startOffset":27966,"endOffset":28045,"count":0}],"isBlockCoverage":false},{"functionName":"from_xml","ranges":[{"startOffset":28055,"endOffset":30789,"count":1},{"startOffset":30315,"endOffset":30375,"count":0},{"startOffset":30627,"endOffset":30765,"count":0}],"isBlockCoverage":true},{"functionName":"get_data","ranges":[{"startOffset":30792,"endOffset":32818,"count":1}],"isBlockCoverage":true},{"functionName":"get_folder_logic","ranges":[{"startOffset":32821,"endOffset":32992,"count":29}],"isBlockCoverage":true},{"functionName":"get_i18n_languages","ranges":[{"startOffset":32995,"endOffset":33426,"count":0}],"isBlockCoverage":false},{"functionName":"get_main_language","ranges":[{"startOffset":33429,"endOffset":33638,"count":0}],"isBlockCoverage":false},{"functionName":"get_requirements","ranges":[{"startOffset":33641,"endOffset":34344,"count":0}],"isBlockCoverage":false},{"functionName":"get_signature","ranges":[{"startOffset":34347,"endOffset":35176,"count":0}],"isBlockCoverage":false},{"functionName":"get_starting_folder","ranges":[{"startOffset":35179,"endOffset":35353,"count":58}],"isBlockCoverage":true},{"functionName":"get_version_constant","ranges":[{"startOffset":35356,"endOffset":35568,"count":0}],"isBlockCoverage":false},{"functionName":"is_ignored","ranges":[{"startOffset":35571,"endOffset":37625,"count":17},{"startOffset":36675,"endOffset":36707,"count":1},{"startOffset":36707,"endOffset":36947,"count":16},{"startOffset":36947,"endOffset":36979,"count":1},{"startOffset":36979,"endOffset":37063,"count":15},{"startOffset":37063,"endOffset":37234,"count":1},{"startOffset":37234,"endOffset":37333,"count":14},{"startOffset":37333,"endOffset":37374,"count":4},{"startOffset":37376,"endOffset":37429,"count":1},{"startOffset":37429,"endOffset":37544,"count":14},{"startOffset":37544,"endOffset":37598,"count":0},{"startOffset":37598,"endOffset":37624,"count":14}],"isBlockCoverage":true},{"functionName":"remove_ignore","ranges":[{"startOffset":37628,"endOffset":38155,"count":1}],"isBlockCoverage":true},{"functionName":"serialize","ranges":[{"startOffset":38158,"endOffset":38510,"count":0}],"isBlockCoverage":false},{"functionName":"set_folder_logic","ranges":[{"startOffset":38513,"endOffset":38733,"count":20}],"isBlockCoverage":true},{"functionName":"set_i18n_languages","ranges":[{"startOffset":38736,"endOffset":39224,"count":0}],"isBlockCoverage":false},{"functionName":"set_requirements","ranges":[{"startOffset":39227,"endOffset":39993,"count":0}],"isBlockCoverage":false},{"functionName":"set_starting_folder","ranges":[{"startOffset":39996,"endOffset":40217,"count":41}],"isBlockCoverage":true},{"functionName":"set_version_constant","ranges":[{"startOffset":40220,"endOffset":40478,"count":0}],"isBlockCoverage":false},{"functionName":"to_file","ranges":[{"startOffset":40481,"endOffset":41411,"count":0}],"isBlockCoverage":false},{"functionName":"to_xml","ranges":[{"startOffset":41414,"endOffset":41489,"count":0}],"isBlockCoverage":false},{"functionName":"to_xml","ranges":[{"startOffset":41499,"endOffset":44367,"count":0}],"isBlockCoverage":false},{"functionName":"use_lxe","ranges":[{"startOffset":44370,"endOffset":44933,"count":0}],"isBlockCoverage":false},{"functionName":"get_abap_language_version","ranges":[{"startOffset":44936,"endOffset":45173,"count":0}],"isBlockCoverage":false},{"functionName":"set_abap_language_version","ranges":[{"startOffset":45176,"endOffset":45494,"count":0}],"isBlockCoverage":false}]},{"scriptId":"852","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_environment.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16086,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":1066,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":315,"endOffset":412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":498,"endOffset":595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":682,"endOffset":779,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":945,"endOffset":1042,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_environment","ranges":[{"startOffset":1070,"endOffset":1566,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1569,"endOffset":1682,"count":5},{"startOffset":1625,"endOffset":1661,"count":0}],"isBlockCoverage":true},{"functionName":"is_system_changes_allowed","ranges":[{"startOffset":1685,"endOffset":5146,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_environment$compare_with_inactive","ranges":[{"startOffset":5153,"endOffset":5434,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_environment$get_basis_release","ranges":[{"startOffset":5441,"endOffset":6086,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_environment$is_merged","ranges":[{"startOffset":6093,"endOffset":6923,"count":19},{"startOffset":6404,"endOffset":6847,"count":2},{"startOffset":6781,"endOffset":6825,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_environment$is_repo_object_changes_allowed","ranges":[{"startOffset":6930,"endOffset":7344,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_environment$is_restart_required","ranges":[{"startOffset":7351,"endOffset":8801,"count":1},{"startOffset":7718,"endOffset":7769,"count":0},{"startOffset":7913,"endOffset":8077,"count":0},{"startOffset":8079,"endOffset":8404,"count":0},{"startOffset":8717,"endOffset":8757,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_environment$is_sap_cloud_platform","ranges":[{"startOffset":8808,"endOffset":10246,"count":2},{"startOffset":9208,"endOffset":9259,"count":0},{"startOffset":9405,"endOffset":9573,"count":0},{"startOffset":9575,"endOffset":9914,"count":0},{"startOffset":10108,"endOffset":10152,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_environment$is_sap_object_allowed","ranges":[{"startOffset":10253,"endOffset":10778,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_environment$get_system_language_filter","ranges":[{"startOffset":10785,"endOffset":15188,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_environment$is_variant_maintenance","ranges":[{"startOffset":15199,"endOffset":15909,"count":0}],"isBlockCoverage":false}]},{"scriptId":"853","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_exit.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":42147,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":701,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":286,"endOffset":406,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":557,"endOffset":677,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_exit","ranges":[{"startOffset":705,"endOffset":835,"count":11}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":838,"endOffset":951,"count":11},{"startOffset":894,"endOffset":930,"count":0}],"isBlockCoverage":true},{"functionName":"get_instance","ranges":[{"startOffset":954,"endOffset":1024,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":1034,"endOffset":2408,"count":11},{"startOffset":1499,"endOffset":1678,"count":0},{"startOffset":2030,"endOffset":2116,"count":0},{"startOffset":2254,"endOffset":2290,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$adjust_display_commit_url","ranges":[{"startOffset":2411,"endOffset":3783,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$adjust_display_filename","ranges":[{"startOffset":3786,"endOffset":4688,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$allow_sap_objects","ranges":[{"startOffset":4691,"endOffset":5347,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$change_local_host","ranges":[{"startOffset":5350,"endOffset":6236,"count":2},{"startOffset":5816,"endOffset":6232,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$change_proxy_authentication","ranges":[{"startOffset":6239,"endOffset":7196,"count":2},{"startOffset":6710,"endOffset":7192,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$change_proxy_port","ranges":[{"startOffset":7199,"endOffset":8043,"count":2},{"startOffset":7587,"endOffset":8039,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$change_proxy_url","ranges":[{"startOffset":8046,"endOffset":8882,"count":2},{"startOffset":8429,"endOffset":8878,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$change_supported_data_objects","ranges":[{"startOffset":8885,"endOffset":9991,"count":1},{"startOffset":9555,"endOffset":9987,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$change_supported_object_types","ranges":[{"startOffset":9994,"endOffset":10883,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$change_tadir","ranges":[{"startOffset":10886,"endOffset":12682,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$create_http_client","ranges":[{"startOffset":12685,"endOffset":13506,"count":2},{"startOffset":13050,"endOffset":13480,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$custom_serialize_abap_clif","ranges":[{"startOffset":13509,"endOffset":15117,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$deserialize_postprocess","ranges":[{"startOffset":15120,"endOffset":17659,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$determine_transport_request","ranges":[{"startOffset":17662,"endOffset":19089,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$get_ci_tests","ranges":[{"startOffset":19092,"endOffset":20327,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$get_ssl_id","ranges":[{"startOffset":20330,"endOffset":21084,"count":2},{"startOffset":20539,"endOffset":20945,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$http_client","ranges":[{"startOffset":21087,"endOffset":21945,"count":2},{"startOffset":21513,"endOffset":21941,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_exit$on_event","ranges":[{"startOffset":21948,"endOffset":23071,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$pre_calculate_repo_status","ranges":[{"startOffset":23074,"endOffset":30593,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$serialize_postprocess","ranges":[{"startOffset":30596,"endOffset":33013,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$validate_before_push","ranges":[{"startOffset":33016,"endOffset":34865,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$wall_message_list","ranges":[{"startOffset":34868,"endOffset":35588,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$wall_message_repo","ranges":[{"startOffset":35591,"endOffset":40821,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_exit$enhance_repo_toolbar","ranges":[{"startOffset":40824,"endOffset":41881,"count":0}],"isBlockCoverage":false}]},{"scriptId":"854","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_factory.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20608,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":6409,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":278,"endOffset":400,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":488,"endOffset":1034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1125,"endOffset":1693,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1781,"endOffset":1915,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1999,"endOffset":2125,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2213,"endOffset":2347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2432,"endOffset":2562,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2649,"endOffset":2781,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2867,"endOffset":2997,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3087,"endOffset":3225,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3312,"endOffset":3444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3593,"endOffset":3715,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3823,"endOffset":3957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4003,"endOffset":4099,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4213,"endOffset":4353,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4399,"endOffset":4495,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4597,"endOffset":4731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4831,"endOffset":4957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5065,"endOffset":5199,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5303,"endOffset":5433,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5539,"endOffset":5671,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5775,"endOffset":5905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6013,"endOffset":6151,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6253,"endOffset":6385,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_factory","ranges":[{"startOffset":6413,"endOffset":7156,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7159,"endOffset":7272,"count":0}],"isBlockCoverage":false},{"functionName":"get_code_inspector","ranges":[{"startOffset":7275,"endOffset":7370,"count":0}],"isBlockCoverage":false},{"functionName":"get_code_inspector","ranges":[{"startOffset":7380,"endOffset":9366,"count":0}],"isBlockCoverage":false},{"functionName":"get_cts_api","ranges":[{"startOffset":9369,"endOffset":9440,"count":0}],"isBlockCoverage":false},{"functionName":"get_cts_api","ranges":[{"startOffset":9450,"endOffset":9861,"count":0}],"isBlockCoverage":false},{"functionName":"get_environment","ranges":[{"startOffset":9864,"endOffset":9943,"count":0}],"isBlockCoverage":false},{"functionName":"get_environment","ranges":[{"startOffset":9953,"endOffset":10404,"count":18},{"startOffset":10190,"endOffset":10313,"count":1}],"isBlockCoverage":true},{"functionName":"get_http_agent","ranges":[{"startOffset":10407,"endOffset":10484,"count":0}],"isBlockCoverage":false},{"functionName":"get_http_agent","ranges":[{"startOffset":10494,"endOffset":10928,"count":0}],"isBlockCoverage":false},{"functionName":"get_longtexts","ranges":[{"startOffset":10931,"endOffset":11006,"count":0}],"isBlockCoverage":false},{"functionName":"get_longtexts","ranges":[{"startOffset":11016,"endOffset":11444,"count":3},{"startOffset":11242,"endOffset":11360,"count":1}],"isBlockCoverage":true},{"functionName":"get_lxe_texts","ranges":[{"startOffset":11447,"endOffset":11522,"count":0}],"isBlockCoverage":false},{"functionName":"get_lxe_texts","ranges":[{"startOffset":11532,"endOffset":11963,"count":0}],"isBlockCoverage":false},{"functionName":"get_sap_namespace","ranges":[{"startOffset":11966,"endOffset":12049,"count":0}],"isBlockCoverage":false},{"functionName":"get_sap_namespace","ranges":[{"startOffset":12059,"endOffset":12518,"count":9},{"startOffset":12302,"endOffset":12429,"count":0}],"isBlockCoverage":true},{"functionName":"get_sap_package","ranges":[{"startOffset":12521,"endOffset":12610,"count":0}],"isBlockCoverage":false},{"functionName":"get_sap_package","ranges":[{"startOffset":12620,"endOffset":14527,"count":66},{"startOffset":14107,"endOffset":14437,"count":6}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":13812,"endOffset":13867,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":13896,"endOffset":13921,"count":0}],"isBlockCoverage":false},{"functionName":"get_sap_report","ranges":[{"startOffset":14530,"endOffset":14607,"count":0}],"isBlockCoverage":false},{"functionName":"get_sap_report","ranges":[{"startOffset":14617,"endOffset":15046,"count":0}],"isBlockCoverage":false},{"functionName":"get_stage_logic","ranges":[{"startOffset":15049,"endOffset":15128,"count":0}],"isBlockCoverage":false},{"functionName":"get_stage_logic","ranges":[{"startOffset":15138,"endOffset":15571,"count":0}],"isBlockCoverage":false},{"functionName":"get_tadir","ranges":[{"startOffset":15574,"endOffset":15641,"count":0}],"isBlockCoverage":false},{"functionName":"get_tadir","ranges":[{"startOffset":15651,"endOffset":16042,"count":4},{"startOffset":15858,"endOffset":15969,"count":0}],"isBlockCoverage":true}]},{"scriptId":"855","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_field_rules.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12557,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":2429,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":314,"endOffset":930,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1039,"endOffset":1697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1846,"endOffset":1948,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1994,"endOffset":2090,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2134,"endOffset":2177,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2271,"endOffset":2405,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_field_rules","ranges":[{"startOffset":2433,"endOffset":3263,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3266,"endOffset":3379,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3382,"endOffset":3447,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3457,"endOffset":3728,"count":0}],"isBlockCoverage":false},{"functionName":"fill_value","ranges":[{"startOffset":3731,"endOffset":5326,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_field_rules$add","ranges":[{"startOffset":5329,"endOffset":6674,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_field_rules$apply_clear_logic","ranges":[{"startOffset":6677,"endOffset":8288,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_field_rules$apply_fill_logic","ranges":[{"startOffset":8291,"endOffset":10145,"count":0}],"isBlockCoverage":false}]},{"scriptId":"856","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_deserialize.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":44380,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":135,"endOffset":10475,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":396,"endOffset":1755,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1801,"endOffset":3160,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3202,"endOffset":3320,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3425,"endOffset":4784,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4826,"endOffset":4944,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4990,"endOffset":6349,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6456,"endOffset":7268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7314,"endOffset":8673,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8773,"endOffset":10132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10175,"endOffset":10291,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10333,"endOffset":10451,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_file_deserialize","ranges":[{"startOffset":10479,"endOffset":10564,"count":26}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":10567,"endOffset":10680,"count":26},{"startOffset":10623,"endOffset":10659,"count":0}],"isBlockCoverage":true},{"functionName":"filter_files_to_deserialize","ranges":[{"startOffset":10683,"endOffset":10805,"count":8}],"isBlockCoverage":true},{"functionName":"filter_files_to_deserialize","ranges":[{"startOffset":10815,"endOffset":22161,"count":8},{"startOffset":13813,"endOffset":13840,"count":0},{"startOffset":17038,"endOffset":17434,"count":0},{"startOffset":17693,"endOffset":19113,"count":0},{"startOffset":19313,"endOffset":19354,"count":7},{"startOffset":19356,"endOffset":20159,"count":0},{"startOffset":20664,"endOffset":20705,"count":5},{"startOffset":20707,"endOffset":21670,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":17340,"endOffset":17425,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":17495,"endOffset":17560,"count":15}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":18036,"endOffset":18163,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":18196,"endOffset":18222,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":18263,"endOffset":18289,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":19174,"endOffset":19223,"count":13}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":20101,"endOffset":20150,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":20220,"endOffset":20381,"count":11},{"startOffset":20346,"endOffset":20379,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":20445,"endOffset":20574,"count":9}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":21050,"endOffset":21177,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":21210,"endOffset":21236,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":21277,"endOffset":21303,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":21731,"endOffset":21851,"count":8}],"isBlockCoverage":true},{"functionName":"get_results","ranges":[{"startOffset":22164,"endOffset":22254,"count":0}],"isBlockCoverage":false},{"functionName":"get_results","ranges":[{"startOffset":22264,"endOffset":25672,"count":0}],"isBlockCoverage":false},{"functionName":"map_results_to_items","ranges":[{"startOffset":25675,"endOffset":25783,"count":0}],"isBlockCoverage":false},{"functionName":"map_results_to_items","ranges":[{"startOffset":25793,"endOffset":30173,"count":18},{"startOffset":29839,"endOffset":30148,"count":42}],"isBlockCoverage":true},{"functionName":"prioritize_deser","ranges":[{"startOffset":30176,"endOffset":30276,"count":18}],"isBlockCoverage":true},{"functionName":"prioritize_deser","ranges":[{"startOffset":30286,"endOffset":44199,"count":18},{"startOffset":37580,"endOffset":43123,"count":42},{"startOffset":37779,"endOffset":37977,"count":4},{"startOffset":37977,"endOffset":42923,"count":38},{"startOffset":38056,"endOffset":38398,"count":4},{"startOffset":38398,"endOffset":42923,"count":34},{"startOffset":38477,"endOffset":38675,"count":2},{"startOffset":38675,"endOffset":42923,"count":32},{"startOffset":38754,"endOffset":39024,"count":3},{"startOffset":39024,"endOffset":42923,"count":29},{"startOffset":39103,"endOffset":39301,"count":1},{"startOffset":39301,"endOffset":42923,"count":28},{"startOffset":39380,"endOffset":39578,"count":2},{"startOffset":39578,"endOffset":42923,"count":26},{"startOffset":39656,"endOffset":39726,"count":25},{"startOffset":39728,"endOffset":40070,"count":2},{"startOffset":40070,"endOffset":42923,"count":24},{"startOffset":40149,"endOffset":40347,"count":2},{"startOffset":40347,"endOffset":42923,"count":22},{"startOffset":40426,"endOffset":40624,"count":1},{"startOffset":40624,"endOffset":42923,"count":21},{"startOffset":40703,"endOffset":40901,"count":1},{"startOffset":40901,"endOffset":42923,"count":20},{"startOffset":40980,"endOffset":41178,"count":1},{"startOffset":41178,"endOffset":42923,"count":19},{"startOffset":41257,"endOffset":41743,"count":2},{"startOffset":41743,"endOffset":42923,"count":17},{"startOffset":41822,"endOffset":42020,"count":1},{"startOffset":42020,"endOffset":42923,"count":16},{"startOffset":42099,"endOffset":42297,"count":1},{"startOffset":42297,"endOffset":42923,"count":15},{"startOffset":42376,"endOffset":42646,"count":2},{"startOffset":42646,"endOffset":42923,"count":13},{"startOffset":42725,"endOffset":42923,"count":2},{"startOffset":42995,"endOffset":43117,"count":32},{"startOffset":43270,"endOffset":43298,"count":60},{"startOffset":43298,"endOffset":44121,"count":42}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":37881,"endOffset":37966,"count":8}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":38158,"endOffset":38387,"count":16},{"startOffset":38242,"endOffset":38313,"count":15},{"startOffset":38314,"endOffset":38385,"count":11}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":38579,"endOffset":38664,"count":4}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":38856,"endOffset":39013,"count":14},{"startOffset":38940,"endOffset":39011,"count":13}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":39205,"endOffset":39290,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":39482,"endOffset":39567,"count":4}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":39830,"endOffset":40059,"count":4},{"startOffset":39986,"endOffset":40057,"count":3}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":40251,"endOffset":40336,"count":8}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":40528,"endOffset":40613,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":40805,"endOffset":40890,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":41082,"endOffset":41167,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":41359,"endOffset":41732,"count":4},{"startOffset":41443,"endOffset":41514,"count":3},{"startOffset":41515,"endOffset":41586,"count":3},{"startOffset":41587,"endOffset":41658,"count":3},{"startOffset":41659,"endOffset":41730,"count":3}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":41924,"endOffset":42009,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":42201,"endOffset":42286,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":42478,"endOffset":42635,"count":4},{"startOffset":42562,"endOffset":42633,"count":3}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":42827,"endOffset":42912,"count":4}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":43528,"endOffset":43651,"count":79},{"startOffset":43595,"endOffset":43649,"count":42}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":43682,"endOffset":43708,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":43747,"endOffset":43773,"count":0}],"isBlockCoverage":false}]},{"scriptId":"857","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_status.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":105591,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":184,"endOffset":34634,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":356,"endOffset":452,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":532,"endOffset":662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":820,"endOffset":2179,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2223,"endOffset":3635,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3680,"endOffset":4565,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4613,"endOffset":5266,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5366,"endOffset":6778,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6826,"endOffset":7490,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7535,"endOffset":8420,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8464,"endOffset":9276,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9322,"endOffset":10681,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10794,"endOffset":11679,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11723,"endOffset":12535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12636,"endOffset":14048,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14105,"endOffset":14990,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15038,"endOffset":15702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15750,"endOffset":16577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16623,"endOffset":17982,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18084,"endOffset":19136,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19180,"endOffset":20369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20414,"endOffset":20919,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20963,"endOffset":21627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21730,"endOffset":22782,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22826,"endOffset":24015,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24119,"endOffset":25171,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25216,"endOffset":25721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25769,"endOffset":26596,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26644,"endOffset":27308,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27416,"endOffset":27512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27557,"endOffset":27604,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27651,"endOffset":27699,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27816,"endOffset":29005,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29050,"endOffset":29555,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29654,"endOffset":30307,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30351,"endOffset":31763,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31811,"endOffset":32464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32559,"endOffset":33918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33961,"endOffset":34077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34119,"endOffset":34237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34342,"endOffset":34438,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34480,"endOffset":34610,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_file_status","ranges":[{"startOffset":34638,"endOffset":34966,"count":12}],"isBlockCoverage":true},{"functionName":"build_existing","ranges":[{"startOffset":34969,"endOffset":35060,"count":7}],"isBlockCoverage":true},{"functionName":"build_existing","ranges":[{"startOffset":35070,"endOffset":41289,"count":7},{"startOffset":39906,"endOffset":39937,"count":2},{"startOffset":39937,"endOffset":40575,"count":5},{"startOffset":40575,"endOffset":41006,"count":4},{"startOffset":40660,"endOffset":40793,"count":3},{"startOffset":40867,"endOffset":41000,"count":3},{"startOffset":41006,"endOffset":41263,"count":1},{"startOffset":41263,"endOffset":41288,"count":5}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":40038,"endOffset":40177,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":40206,"endOffset":40228,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":40275,"endOffset":40301,"count":0}],"isBlockCoverage":false},{"functionName":"build_new_local","ranges":[{"startOffset":41292,"endOffset":41385,"count":3}],"isBlockCoverage":true},{"functionName":"build_new_local","ranges":[{"startOffset":41395,"endOffset":44494,"count":3}],"isBlockCoverage":true},{"functionName":"build_new_remote","ranges":[{"startOffset":44497,"endOffset":51635,"count":5},{"startOffset":49919,"endOffset":51483,"count":4},{"startOffset":50798,"endOffset":51477,"count":0},{"startOffset":51483,"endOffset":51609,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":49430,"endOffset":49553,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":49582,"endOffset":49608,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":49647,"endOffset":49673,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":50313,"endOffset":50432,"count":2},{"startOffset":50374,"endOffset":50430,"count":0}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":50463,"endOffset":50485,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":50522,"endOffset":50548,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_status","ranges":[{"startOffset":51638,"endOffset":60449,"count":12}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":59782,"endOffset":59827,"count":12}],"isBlockCoverage":true},{"functionName":"check_local_remote_consistency","ranges":[{"startOffset":60452,"endOffset":60575,"count":7}],"isBlockCoverage":true},{"functionName":"check_local_remote_consistency","ranges":[{"startOffset":60585,"endOffset":63360,"count":7},{"startOffset":62521,"endOffset":63356,"count":0}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":63363,"endOffset":63873,"count":12}],"isBlockCoverage":true},{"functionName":"ensure_state","ranges":[{"startOffset":63876,"endOffset":63963,"count":12}],"isBlockCoverage":true},{"functionName":"ensure_state","ranges":[{"startOffset":63973,"endOffset":68997,"count":12},{"startOffset":68663,"endOffset":68925,"count":5},{"startOffset":68733,"endOffset":68919,"count":3},{"startOffset":68925,"endOffset":68972,"count":7}],"isBlockCoverage":true},{"functionName":"get_object_package","ranges":[{"startOffset":69000,"endOffset":69099,"count":4}],"isBlockCoverage":true},{"functionName":"get_object_package","ranges":[{"startOffset":69109,"endOffset":70452,"count":4},{"startOffset":69960,"endOffset":70030,"count":2},{"startOffset":70031,"endOffset":70123,"count":1},{"startOffset":70125,"endOffset":70424,"count":1},{"startOffset":70375,"endOffset":70418,"count":0}],"isBlockCoverage":true},{"functionName":"process_items","ranges":[{"startOffset":70455,"endOffset":75908,"count":12},{"startOffset":74201,"endOffset":75904,"count":5},{"startOffset":74576,"endOffset":74630,"count":1},{"startOffset":74633,"endOffset":74660,"count":1},{"startOffset":74660,"endOffset":74867,"count":4},{"startOffset":74867,"endOffset":74931,"count":2},{"startOffset":74933,"endOffset":75831,"count":1},{"startOffset":75755,"endOffset":75823,"count":0},{"startOffset":75831,"endOffset":75904,"count":4}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":75316,"endOffset":75386,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":75419,"endOffset":75447,"count":0}],"isBlockCoverage":false},{"functionName":"process_local","ranges":[{"startOffset":75911,"endOffset":88572,"count":12},{"startOffset":84824,"endOffset":88568,"count":10},{"startOffset":85057,"endOffset":85084,"count":0},{"startOffset":85325,"endOffset":85419,"count":8},{"startOffset":86161,"endOffset":86462,"count":7},{"startOffset":86462,"endOffset":88562,"count":3},{"startOffset":87067,"endOffset":87147,"count":1},{"startOffset":87149,"endOffset":87228,"count":1},{"startOffset":87228,"endOffset":88554,"count":2},{"startOffset":87317,"endOffset":88554,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":85592,"endOffset":85739,"count":8},{"startOffset":85667,"endOffset":85737,"count":7}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":85770,"endOffset":85792,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":85843,"endOffset":85869,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":86670,"endOffset":86754,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":86787,"endOffset":86813,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":87415,"endOffset":87562,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":87597,"endOffset":87619,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":87670,"endOffset":87696,"count":0}],"isBlockCoverage":false},{"functionName":"process_remote","ranges":[{"startOffset":88575,"endOffset":99257,"count":12},{"startOffset":97129,"endOffset":99253,"count":5},{"startOffset":97842,"endOffset":97949,"count":2},{"startOffset":97951,"endOffset":98451,"count":1},{"startOffset":98451,"endOffset":99247,"count":4},{"startOffset":99033,"endOffset":99239,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":97450,"endOffset":97535,"count":3}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":97566,"endOffset":97603,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":98516,"endOffset":98643,"count":2},{"startOffset":98581,"endOffset":98641,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":98676,"endOffset":98698,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":98739,"endOffset":98765,"count":0}],"isBlockCoverage":false},{"functionName":"status","ranges":[{"startOffset":99260,"endOffset":99335,"count":0}],"isBlockCoverage":false},{"functionName":"status","ranges":[{"startOffset":99345,"endOffset":105430,"count":0}],"isBlockCoverage":false}]},{"scriptId":"858","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_status.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":51964,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":142,"endOffset":12320,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":349,"endOffset":445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":525,"endOffset":655,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":735,"endOffset":853,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1013,"endOffset":2372,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2479,"endOffset":3838,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3952,"endOffset":5311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5353,"endOffset":5449,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5558,"endOffset":6917,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6959,"endOffset":7089,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7131,"endOffset":7227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7336,"endOffset":8695,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8799,"endOffset":10158,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10209,"endOffset":10305,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10410,"endOffset":10506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10548,"endOffset":10678,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10773,"endOffset":10891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10937,"endOffset":12296,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_status_consistency_checks","ranges":[{"startOffset":12324,"endOffset":12774,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":12777,"endOffset":13287,"count":12}],"isBlockCoverage":true},{"functionName":"run_checks","ranges":[{"startOffset":13290,"endOffset":15502,"count":9}],"isBlockCoverage":true},{"functionName":"check_files_folder","ranges":[{"startOffset":15505,"endOffset":24863,"count":9},{"startOffset":22868,"endOffset":23431,"count":23},{"startOffset":22991,"endOffset":23063,"count":10},{"startOffset":23066,"endOffset":23425,"count":18},{"startOffset":23752,"endOffset":24859,"count":21},{"startOffset":24521,"endOffset":24853,"count":1}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":22694,"endOffset":22815,"count":29}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":23506,"endOffset":23699,"count":29},{"startOffset":23642,"endOffset":23697,"count":27}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":23913,"endOffset":24048,"count":25}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":24079,"endOffset":24105,"count":35}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":24150,"endOffset":24176,"count":0}],"isBlockCoverage":false},{"functionName":"check_multiple_files","ranges":[{"startOffset":24866,"endOffset":30383,"count":9},{"startOffset":29600,"endOffset":30379,"count":21},{"startOffset":29712,"endOffset":29784,"count":20},{"startOffset":29786,"endOffset":29990,"count":1},{"startOffset":30053,"endOffset":30308,"count":1}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":29400,"endOffset":29547,"count":29},{"startOffset":29490,"endOffset":29545,"count":27}],"isBlockCoverage":true},{"functionName":"check_namespace","ranges":[{"startOffset":30386,"endOffset":36468,"count":9},{"startOffset":33858,"endOffset":34935,"count":29},{"startOffset":34152,"endOffset":34411,"count":1},{"startOffset":34670,"endOffset":34929,"count":1},{"startOffset":35093,"endOffset":36045,"count":2},{"startOffset":35397,"endOffset":35680,"count":0},{"startOffset":36099,"endOffset":36162,"count":2},{"startOffset":36164,"endOffset":36464,"count":0}],"isBlockCoverage":true},{"functionName":"check_package_folder","ranges":[{"startOffset":36471,"endOffset":40925,"count":9},{"startOffset":40045,"endOffset":40921,"count":22},{"startOffset":40435,"endOffset":40662,"count":0},{"startOffset":40724,"endOffset":40915,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":39830,"endOffset":39992,"count":29},{"startOffset":39893,"endOffset":39934,"count":28},{"startOffset":39935,"endOffset":39990,"count":28}],"isBlockCoverage":true},{"functionName":"check_package_move","ranges":[{"startOffset":40928,"endOffset":47631,"count":9},{"startOffset":46359,"endOffset":47627,"count":3},{"startOffset":47015,"endOffset":47621,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":46025,"endOffset":46213,"count":29},{"startOffset":46157,"endOffset":46211,"count":3}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":46482,"endOffset":46617,"count":2},{"startOffset":46555,"endOffset":46615,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":46648,"endOffset":46674,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":46719,"endOffset":46745,"count":0}],"isBlockCoverage":false},{"functionName":"check_package_sub_package","ranges":[{"startOffset":47634,"endOffset":51749,"count":9},{"startOffset":50716,"endOffset":51745,"count":1}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":50521,"endOffset":50647,"count":16},{"startOffset":50574,"endOffset":50645,"count":1}],"isBlockCoverage":true}]},{"scriptId":"859","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_filename_logic.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":24963,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":7027,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":306,"endOffset":442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":530,"endOffset":820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":905,"endOffset":1023,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1173,"endOffset":1237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1280,"endOffset":1322,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1421,"endOffset":1485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1528,"endOffset":1570,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1682,"endOffset":1746,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1789,"endOffset":1853,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1899,"endOffset":1995,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2037,"endOffset":2167,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2210,"endOffset":2804,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2912,"endOffset":3506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3553,"endOffset":3617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3724,"endOffset":3788,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3830,"endOffset":3894,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3939,"endOffset":4036,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4082,"endOffset":4179,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4286,"endOffset":4383,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4430,"endOffset":4494,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4598,"endOffset":4662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4705,"endOffset":4769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4816,"endOffset":4912,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4954,"endOffset":5084,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5127,"endOffset":5721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5766,"endOffset":5863,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5909,"endOffset":6006,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6110,"endOffset":6174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6217,"endOffset":6811,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6853,"endOffset":6917,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6961,"endOffset":7003,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_filename_logic","ranges":[{"startOffset":7031,"endOffset":7319,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7322,"endOffset":7435,"count":0}],"isBlockCoverage":false},{"functionName":"detect_obj_definition","ranges":[{"startOffset":7438,"endOffset":7546,"count":0}],"isBlockCoverage":false},{"functionName":"detect_obj_definition","ranges":[{"startOffset":7556,"endOffset":8674,"count":35},{"startOffset":8339,"endOffset":8427,"count":22},{"startOffset":8579,"endOffset":8667,"count":3}],"isBlockCoverage":true},{"functionName":"file_to_object","ranges":[{"startOffset":8677,"endOffset":8771,"count":0}],"isBlockCoverage":false},{"functionName":"file_to_object","ranges":[{"startOffset":8781,"endOffset":12363,"count":21},{"startOffset":9227,"endOffset":9264,"count":20},{"startOffset":10087,"endOffset":10113,"count":20},{"startOffset":10251,"endOffset":10281,"count":12},{"startOffset":10421,"endOffset":10453,"count":7},{"startOffset":11611,"endOffset":11912,"count":2}],"isBlockCoverage":true},{"functionName":"is_obj_definition_file","ranges":[{"startOffset":12366,"endOffset":12476,"count":0}],"isBlockCoverage":false},{"functionName":"is_obj_definition_file","ranges":[{"startOffset":12486,"endOffset":13604,"count":14},{"startOffset":13528,"endOffset":13578,"count":13}],"isBlockCoverage":true},{"functionName":"map_filename_to_object","ranges":[{"startOffset":13607,"endOffset":13717,"count":0}],"isBlockCoverage":false},{"functionName":"map_filename_to_object","ranges":[{"startOffset":13727,"endOffset":16419,"count":21},{"startOffset":15365,"endOffset":15436,"count":17},{"startOffset":15438,"endOffset":15489,"count":0},{"startOffset":15554,"endOffset":15625,"count":17},{"startOffset":15625,"endOffset":15731,"count":4},{"startOffset":15731,"endOffset":15803,"count":0},{"startOffset":15805,"endOffset":15857,"count":0},{"startOffset":15857,"endOffset":15964,"count":4},{"startOffset":15964,"endOffset":16036,"count":0},{"startOffset":16036,"endOffset":16237,"count":4},{"startOffset":16237,"endOffset":16415,"count":17},{"startOffset":16377,"endOffset":16409,"count":0}],"isBlockCoverage":true},{"functionName":"map_object_to_filename","ranges":[{"startOffset":16422,"endOffset":16532,"count":0}],"isBlockCoverage":false},{"functionName":"map_object_to_filename","ranges":[{"startOffset":16542,"endOffset":18683,"count":46},{"startOffset":17684,"endOffset":17755,"count":43},{"startOffset":17757,"endOffset":17808,"count":0},{"startOffset":17873,"endOffset":17944,"count":43},{"startOffset":17944,"endOffset":18050,"count":3},{"startOffset":18050,"endOffset":18122,"count":0},{"startOffset":18124,"endOffset":18176,"count":0},{"startOffset":18176,"endOffset":18283,"count":3},{"startOffset":18283,"endOffset":18355,"count":0},{"startOffset":18355,"endOffset":18501,"count":3},{"startOffset":18501,"endOffset":18679,"count":43},{"startOffset":18641,"endOffset":18673,"count":0}],"isBlockCoverage":true},{"functionName":"name_escape","ranges":[{"startOffset":18686,"endOffset":18774,"count":0}],"isBlockCoverage":false},{"functionName":"name_escape","ranges":[{"startOffset":18784,"endOffset":20034,"count":46}],"isBlockCoverage":true},{"functionName":"name_unescape","ranges":[{"startOffset":20037,"endOffset":20129,"count":0}],"isBlockCoverage":false},{"functionName":"name_unescape","ranges":[{"startOffset":20139,"endOffset":20471,"count":21}],"isBlockCoverage":true},{"functionName":"object_to_file","ranges":[{"startOffset":20474,"endOffset":20568,"count":0}],"isBlockCoverage":false},{"functionName":"object_to_file","ranges":[{"startOffset":20578,"endOffset":23751,"count":46},{"startOffset":21546,"endOffset":21574,"count":7},{"startOffset":21876,"endOffset":22026,"count":45},{"startOffset":22026,"endOffset":22230,"count":1},{"startOffset":22517,"endOffset":22681,"count":0},{"startOffset":23001,"endOffset":23506,"count":2},{"startOffset":23199,"endOffset":23500,"count":1},{"startOffset":23506,"endOffset":23670,"count":44}],"isBlockCoverage":true}]},{"scriptId":"860","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_folder_logic.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20938,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":3807,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":303,"endOffset":926,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1009,"endOffset":1632,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1783,"endOffset":1879,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1921,"endOffset":2017,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2063,"endOffset":2159,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2260,"endOffset":2324,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2366,"endOffset":2462,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2504,"endOffset":2634,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2680,"endOffset":2776,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2880,"endOffset":2976,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3018,"endOffset":3114,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3156,"endOffset":3286,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3329,"endOffset":3393,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3452,"endOffset":3549,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3651,"endOffset":3783,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_folder_logic","ranges":[{"startOffset":3811,"endOffset":5165,"count":50}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":5168,"endOffset":5281,"count":50},{"startOffset":5224,"endOffset":5260,"count":0}],"isBlockCoverage":true},{"functionName":"get_instance","ranges":[{"startOffset":5284,"endOffset":5362,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":5372,"endOffset":5654,"count":50}],"isBlockCoverage":true},{"functionName":"get_parent","ranges":[{"startOffset":5657,"endOffset":7977,"count":17},{"startOffset":6570,"endOffset":6752,"count":14},{"startOffset":7115,"endOffset":7146,"count":5},{"startOffset":7146,"endOffset":7891,"count":12},{"startOffset":7891,"endOffset":7951,"count":0},{"startOffset":7951,"endOffset":7976,"count":12}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":6817,"endOffset":6873,"count":18}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":6902,"endOffset":6928,"count":27}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":7251,"endOffset":7307,"count":3}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":7336,"endOffset":7362,"count":3}],"isBlockCoverage":true},{"functionName":"package_to_path","ranges":[{"startOffset":7980,"endOffset":12566,"count":54},{"startOffset":8982,"endOffset":9052,"count":37},{"startOffset":9052,"endOffset":12542,"count":17},{"startOffset":9205,"endOffset":12536,"count":12},{"startOffset":9449,"endOffset":9690,"count":4},{"startOffset":9610,"endOffset":9680,"count":3},{"startOffset":9690,"endOffset":11219,"count":8},{"startOffset":9821,"endOffset":10367,"count":4},{"startOffset":9970,"endOffset":10357,"count":0},{"startOffset":10367,"endOffset":11219,"count":4},{"startOffset":10636,"endOffset":11022,"count":0},{"startOffset":11032,"endOffset":11219,"count":0},{"startOffset":11380,"endOffset":11616,"count":0},{"startOffset":11716,"endOffset":11782,"count":8},{"startOffset":11882,"endOffset":12118,"count":0}],"isBlockCoverage":true},{"functionName":"path_to_package","ranges":[{"startOffset":12569,"endOffset":19695,"count":21},{"startOffset":13348,"endOffset":13409,"count":4},{"startOffset":13486,"endOffset":13537,"count":17},{"startOffset":15500,"endOffset":15532,"count":0},{"startOffset":15719,"endOffset":16307,"count":17},{"startOffset":15817,"endOffset":15968,"count":11},{"startOffset":15968,"endOffset":16301,"count":6},{"startOffset":16550,"endOffset":19617,"count":17},{"startOffset":16957,"endOffset":17306,"count":4},{"startOffset":17154,"endOffset":17298,"count":3},{"startOffset":17306,"endOffset":18030,"count":13},{"startOffset":17437,"endOffset":17579,"count":9},{"startOffset":17579,"endOffset":18030,"count":4},{"startOffset":17847,"endOffset":18030,"count":0},{"startOffset":18198,"endOffset":18400,"count":0},{"startOffset":18846,"endOffset":19040,"count":0},{"startOffset":19333,"endOffset":19400,"count":5},{"startOffset":19402,"endOffset":19578,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":18535,"endOffset":18593,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":18624,"endOffset":18652,"count":0}],"isBlockCoverage":false}]},{"scriptId":"861","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_frontend_services.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":35853,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":342,"count":1}],"isBlockCoverage":true},{"functionName":"zcl_abapgit_frontend_services","ranges":[{"startOffset":346,"endOffset":431,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":434,"endOffset":547,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$clipboard_export","ranges":[{"startOffset":550,"endOffset":3613,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$directory_browse","ranges":[{"startOffset":3620,"endOffset":5129,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$directory_create","ranges":[{"startOffset":5138,"endOffset":6901,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$directory_exist","ranges":[{"startOffset":6912,"endOffset":8299,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$execute","ranges":[{"startOffset":8312,"endOffset":11580,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$file_download","ranges":[{"startOffset":11595,"endOffset":15263,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$file_upload","ranges":[{"startOffset":15280,"endOffset":18619,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$get_file_separator","ranges":[{"startOffset":18638,"endOffset":20023,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$get_gui_version","ranges":[{"startOffset":20044,"endOffset":23941,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$get_system_directory","ranges":[{"startOffset":23964,"endOffset":25409,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$gui_is_available","ranges":[{"startOffset":25434,"endOffset":26189,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$is_sapgui_for_java","ranges":[{"startOffset":26214,"endOffset":26944,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$is_sapgui_for_windows","ranges":[{"startOffset":26969,"endOffset":27696,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$is_webgui","ranges":[{"startOffset":27721,"endOffset":28430,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$show_file_open_dialog","ranges":[{"startOffset":28455,"endOffset":32396,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_frontend_services$show_file_save_dialog","ranges":[{"startOffset":32423,"endOffset":35616,"count":0}],"isBlockCoverage":false}]},{"scriptId":"862","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_add_patch.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11205,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":4153,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":295,"endOffset":1522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1604,"endOffset":1862,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2017,"endOffset":2275,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2372,"endOffset":3599,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3695,"endOffset":3953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4063,"endOffset":4129,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_add_patch","ranges":[{"startOffset":4157,"endOffset":5738,"count":15}],"isBlockCoverage":true},{"functionName":"calculate_patch","ranges":[{"startOffset":5741,"endOffset":8519,"count":15},{"startOffset":6993,"endOffset":8494,"count":60},{"startOffset":7203,"endOffset":7300,"count":32},{"startOffset":7300,"endOffset":8488,"count":28},{"startOffset":7422,"endOffset":7616,"count":8},{"startOffset":7507,"endOffset":7608,"count":7},{"startOffset":7616,"endOffset":8488,"count":20},{"startOffset":7738,"endOffset":7933,"count":10},{"startOffset":7824,"endOffset":7925,"count":3},{"startOffset":7933,"endOffset":8488,"count":10},{"startOffset":8055,"endOffset":8356,"count":9},{"startOffset":8140,"endOffset":8241,"count":7},{"startOffset":8241,"endOffset":8348,"count":2},{"startOffset":8356,"endOffset":8488,"count":1},{"startOffset":8480,"endOffset":8488,"count":0},{"startOffset":8494,"endOffset":8518,"count":14}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":8522,"endOffset":9894,"count":15}],"isBlockCoverage":true},{"functionName":"get_patch","ranges":[{"startOffset":9897,"endOffset":10347,"count":15},{"startOffset":10280,"endOffset":10346,"count":14}],"isBlockCoverage":true},{"functionName":"get_patch_binary","ranges":[{"startOffset":10350,"endOffset":11036,"count":0}],"isBlockCoverage":false}]},{"scriptId":"863","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_branch_list.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":33965,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":9814,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":305,"endOffset":1227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1315,"endOffset":1379,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1532,"endOffset":1596,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1639,"endOffset":1703,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1807,"endOffset":2424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2474,"endOffset":2538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2641,"endOffset":2705,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2748,"endOffset":3670,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3720,"endOffset":3784,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3894,"endOffset":3958,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4001,"endOffset":4065,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4162,"endOffset":4226,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4326,"endOffset":4943,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4993,"endOffset":5035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5143,"endOffset":5207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5304,"endOffset":6226,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6333,"endOffset":7255,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7354,"endOffset":8276,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8386,"endOffset":8450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8500,"endOffset":8542,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8636,"endOffset":8748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8798,"endOffset":8840,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8885,"endOffset":9143,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9199,"endOffset":9259,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9371,"endOffset":9435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9485,"endOffset":9527,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9634,"endOffset":9698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9748,"endOffset":9790,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_branch_list","ranges":[{"startOffset":9818,"endOffset":10910,"count":2}],"isBlockCoverage":true},{"functionName":"complete_heads_branch_name","ranges":[{"startOffset":10913,"endOffset":11032,"count":0}],"isBlockCoverage":false},{"functionName":"complete_heads_branch_name","ranges":[{"startOffset":11042,"endOffset":11665,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":11668,"endOffset":11964,"count":2}],"isBlockCoverage":true},{"functionName":"find_by_name","ranges":[{"startOffset":11967,"endOffset":13920,"count":1},{"startOffset":12797,"endOffset":12927,"count":0},{"startOffset":13066,"endOffset":13159,"count":0},{"startOffset":13614,"endOffset":13888,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":13308,"endOffset":13364,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":13395,"endOffset":13417,"count":0}],"isBlockCoverage":false},{"functionName":"find_tag_by_name","ranges":[{"startOffset":13923,"endOffset":15865,"count":0}],"isBlockCoverage":false},{"functionName":"get_all","ranges":[{"startOffset":15868,"endOffset":16882,"count":0}],"isBlockCoverage":false},{"functionName":"get_branches_only","ranges":[{"startOffset":16885,"endOffset":18889,"count":0}],"isBlockCoverage":false},{"functionName":"get_display_name","ranges":[{"startOffset":18892,"endOffset":18991,"count":0}],"isBlockCoverage":false},{"functionName":"get_display_name","ranges":[{"startOffset":19001,"endOffset":20018,"count":11},{"startOffset":19423,"endOffset":19652,"count":6},{"startOffset":19652,"endOffset":19986,"count":5},{"startOffset":19793,"endOffset":19986,"count":0}],"isBlockCoverage":true},{"functionName":"get_head_symref","ranges":[{"startOffset":20021,"endOffset":20197,"count":1}],"isBlockCoverage":true},{"functionName":"get_tags_only","ranges":[{"startOffset":20200,"endOffset":22457,"count":0}],"isBlockCoverage":false},{"functionName":"get_type","ranges":[{"startOffset":22460,"endOffset":22543,"count":0}],"isBlockCoverage":false},{"functionName":"get_type","ranges":[{"startOffset":22553,"endOffset":24833,"count":11},{"startOffset":23696,"endOffset":23815,"count":5},{"startOffset":23817,"endOffset":23947,"count":9},{"startOffset":23947,"endOffset":24809,"count":2},{"startOffset":24087,"endOffset":24809,"count":0}],"isBlockCoverage":true},{"functionName":"normalize_branch_name","ranges":[{"startOffset":24836,"endOffset":24945,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_branch_name","ranges":[{"startOffset":24955,"endOffset":25390,"count":0}],"isBlockCoverage":false},{"functionName":"parse_branch_list","ranges":[{"startOffset":25393,"endOffset":25494,"count":2}],"isBlockCoverage":true},{"functionName":"parse_branch_list","ranges":[{"startOffset":25504,"endOffset":31347,"count":7},{"startOffset":26625,"endOffset":26651,"count":6},{"startOffset":26766,"endOffset":26806,"count":3},{"startOffset":28483,"endOffset":31343,"count":17},{"startOffset":28663,"endOffset":28752,"count":7},{"startOffset":28753,"endOffset":28844,"count":7},{"startOffset":28845,"endOffset":28946,"count":7},{"startOffset":28948,"endOffset":29089,"count":1},{"startOffset":29081,"endOffset":29089,"count":0},{"startOffset":29089,"endOffset":30595,"count":16},{"startOffset":29177,"endOffset":29266,"count":6},{"startOffset":29268,"endOffset":29826,"count":6},{"startOffset":29690,"endOffset":29766,"count":3},{"startOffset":29768,"endOffset":29818,"count":1},{"startOffset":29826,"endOffset":30595,"count":10},{"startOffset":30005,"endOffset":30595,"count":5},{"startOffset":30209,"endOffset":30297,"count":0},{"startOffset":30298,"endOffset":30393,"count":0},{"startOffset":30395,"endOffset":30562,"count":0},{"startOffset":30595,"endOffset":31201,"count":11},{"startOffset":31201,"endOffset":31261,"count":8},{"startOffset":31263,"endOffset":31337,"count":7},{"startOffset":31343,"endOffset":31346,"count":6}],"isBlockCoverage":true},{"functionName":"parse_head_params","ranges":[{"startOffset":31350,"endOffset":31451,"count":0}],"isBlockCoverage":false},{"functionName":"parse_head_params","ranges":[{"startOffset":31461,"endOffset":33035,"count":6},{"startOffset":32882,"endOffset":33004,"count":3}],"isBlockCoverage":true},{"functionName":"skip_first_pkt","ranges":[{"startOffset":33038,"endOffset":33133,"count":0}],"isBlockCoverage":false},{"functionName":"skip_first_pkt","ranges":[{"startOffset":33143,"endOffset":33788,"count":7}],"isBlockCoverage":true}]},{"scriptId":"864","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_commit.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":92578,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":26600,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":376,"endOffset":953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1004,"endOffset":1581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1630,"endOffset":3798,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3844,"endOffset":6235,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6333,"endOffset":6430,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6476,"endOffset":8867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8910,"endOffset":9012,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9119,"endOffset":9183,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9228,"endOffset":9331,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9375,"endOffset":9477,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9520,"endOffset":9621,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9727,"endOffset":12316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12366,"endOffset":12430,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12477,"endOffset":12541,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12592,"endOffset":12652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12697,"endOffset":12794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12896,"endOffset":15287,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15337,"endOffset":15439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15486,"endOffset":15550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15601,"endOffset":15661,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15763,"endOffset":18154,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18200,"endOffset":19085,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19186,"endOffset":21577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21684,"endOffset":24075,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24185,"endOffset":26576,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_commit","ranges":[{"startOffset":26604,"endOffset":26689,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":26692,"endOffset":26805,"count":0}],"isBlockCoverage":false},{"functionName":"extract_author_data","ranges":[{"startOffset":26808,"endOffset":26908,"count":0}],"isBlockCoverage":false},{"functionName":"extract_author_data","ranges":[{"startOffset":26918,"endOffset":28029,"count":16},{"startOffset":27234,"endOffset":27264,"count":7},{"startOffset":27405,"endOffset":27433,"count":7},{"startOffset":27571,"endOffset":27597,"count":7},{"startOffset":27853,"endOffset":28025,"count":6},{"startOffset":28019,"endOffset":28025,"count":0}],"isBlockCoverage":true},{"functionName":"clear_missing_parents","ranges":[{"startOffset":28032,"endOffset":28136,"count":0}],"isBlockCoverage":false},{"functionName":"clear_missing_parents","ranges":[{"startOffset":28146,"endOffset":33391,"count":3},{"startOffset":32922,"endOffset":33387,"count":4},{"startOffset":33102,"endOffset":33171,"count":1},{"startOffset":33312,"endOffset":33381,"count":1}],"isBlockCoverage":true},{"functionName":"get_1st_child_commit","ranges":[{"startOffset":33394,"endOffset":33496,"count":0}],"isBlockCoverage":false},{"functionName":"get_1st_child_commit","ranges":[{"startOffset":33506,"endOffset":46424,"count":0}],"isBlockCoverage":false},{"functionName":"get_by_branch","ranges":[{"startOffset":46427,"endOffset":46515,"count":0}],"isBlockCoverage":false},{"functionName":"get_by_branch","ranges":[{"startOffset":46525,"endOffset":51929,"count":0}],"isBlockCoverage":false},{"functionName":"get_by_commit","ranges":[{"startOffset":51932,"endOffset":52020,"count":0}],"isBlockCoverage":false},{"functionName":"get_by_commit","ranges":[{"startOffset":52030,"endOffset":56842,"count":0}],"isBlockCoverage":false},{"functionName":"is_missing","ranges":[{"startOffset":56845,"endOffset":56927,"count":0}],"isBlockCoverage":false},{"functionName":"is_missing","ranges":[{"startOffset":56937,"endOffset":60154,"count":11},{"startOffset":59752,"endOffset":60128,"count":5}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":59807,"endOffset":59856,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":59887,"endOffset":59909,"count":0}],"isBlockCoverage":false},{"functionName":"parse_commits","ranges":[{"startOffset":60157,"endOffset":60245,"count":0}],"isBlockCoverage":false},{"functionName":"parse_commits","ranges":[{"startOffset":60255,"endOffset":69682,"count":2},{"startOffset":67835,"endOffset":69655,"count":7},{"startOffset":68850,"endOffset":69041,"count":0},{"startOffset":69270,"endOffset":69407,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":67579,"endOffset":67718,"count":7}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":68377,"endOffset":68489,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":68520,"endOffset":68548,"count":0}],"isBlockCoverage":false},{"functionName":"reverse_sort_order","ranges":[{"startOffset":69685,"endOffset":69783,"count":0}],"isBlockCoverage":false},{"functionName":"reverse_sort_order","ranges":[{"startOffset":69793,"endOffset":77204,"count":0}],"isBlockCoverage":false},{"functionName":"sort_commits","ranges":[{"startOffset":77207,"endOffset":77293,"count":0}],"isBlockCoverage":false},{"functionName":"sort_commits","ranges":[{"startOffset":77303,"endOffset":89204,"count":0}],"isBlockCoverage":false}]},{"scriptId":"865","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_pack.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":75086,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":175,"endOffset":13849,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":341,"endOffset":388,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":468,"endOffset":515,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":599,"endOffset":646,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":729,"endOffset":776,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":931,"endOffset":1816,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1909,"endOffset":2429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2475,"endOffset":3360,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3460,"endOffset":3520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3565,"endOffset":3702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3798,"endOffset":4386,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4430,"endOffset":5018,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5112,"endOffset":5213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5253,"endOffset":5289,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5387,"endOffset":5447,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5490,"endOffset":5556,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5660,"endOffset":5726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5769,"endOffset":5870,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5915,"endOffset":5975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6076,"endOffset":6142,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6193,"endOffset":6259,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6354,"endOffset":7239,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7282,"endOffset":7348,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7446,"endOffset":8034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8077,"endOffset":8143,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8244,"endOffset":9003,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9046,"endOffset":9112,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9207,"endOffset":9933,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9976,"endOffset":10042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10134,"endOffset":10200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10246,"endOffset":11131,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11228,"endOffset":11294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11338,"endOffset":11926,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12025,"endOffset":12091,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12136,"endOffset":12895,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12991,"endOffset":13057,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13099,"endOffset":13825,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_pack","ranges":[{"startOffset":13853,"endOffset":14152,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":14155,"endOffset":14268,"count":0}],"isBlockCoverage":false},{"functionName":"decode","ranges":[{"startOffset":14271,"endOffset":14343,"count":0}],"isBlockCoverage":false},{"functionName":"decode","ranges":[{"startOffset":14353,"endOffset":21325,"count":4},{"startOffset":17199,"endOffset":17329,"count":0},{"startOffset":17468,"endOffset":17597,"count":0},{"startOffset":18013,"endOffset":20720,"count":10},{"startOffset":18423,"endOffset":18545,"count":0},{"startOffset":18661,"endOffset":18721,"count":0},{"startOffset":18723,"endOffset":18857,"count":0},{"startOffset":19177,"endOffset":19313,"count":0},{"startOffset":19590,"endOffset":19693,"count":0},{"startOffset":19789,"endOffset":19957,"count":0},{"startOffset":20244,"endOffset":20367,"count":0},{"startOffset":21102,"endOffset":21242,"count":0}],"isBlockCoverage":true},{"functionName":"decode_commit","ranges":[{"startOffset":21328,"endOffset":21414,"count":0}],"isBlockCoverage":false},{"functionName":"decode_commit","ranges":[{"startOffset":21424,"endOffset":25941,"count":14},{"startOffset":23404,"endOffset":24732,"count":50},{"startOffset":23838,"endOffset":23919,"count":14},{"startOffset":23919,"endOffset":24726,"count":36},{"startOffset":23999,"endOffset":24248,"count":8},{"startOffset":24059,"endOffset":24146,"count":7},{"startOffset":24146,"endOffset":24240,"count":1},{"startOffset":24248,"endOffset":24726,"count":28},{"startOffset":24328,"endOffset":24726,"count":14},{"startOffset":24596,"endOffset":24726,"count":0},{"startOffset":24859,"endOffset":24965,"count":6},{"startOffset":24967,"endOffset":25560,"count":1},{"startOffset":25776,"endOffset":25915,"count":0}],"isBlockCoverage":true},{"functionName":"decode_deltas","ranges":[{"startOffset":25944,"endOffset":26030,"count":0}],"isBlockCoverage":false},{"functionName":"decode_deltas","ranges":[{"startOffset":26040,"endOffset":29772,"count":4},{"startOffset":28926,"endOffset":29039,"count":0},{"startOffset":29498,"endOffset":29768,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":28672,"endOffset":28810,"count":6}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":29100,"endOffset":29232,"count":10}],"isBlockCoverage":true},{"functionName":"decode_tag","ranges":[{"startOffset":29775,"endOffset":29855,"count":0}],"isBlockCoverage":false},{"functionName":"decode_tag","ranges":[{"startOffset":29865,"endOffset":33091,"count":1},{"startOffset":31601,"endOffset":33068,"count":6},{"startOffset":31858,"endOffset":31910,"count":1},{"startOffset":31910,"endOffset":33062,"count":5},{"startOffset":31988,"endOffset":32038,"count":1},{"startOffset":32038,"endOffset":33062,"count":4},{"startOffset":32115,"endOffset":32164,"count":1},{"startOffset":32164,"endOffset":33062,"count":3},{"startOffset":32244,"endOffset":32518,"count":1},{"startOffset":32518,"endOffset":33062,"count":2},{"startOffset":32592,"endOffset":33062,"count":1},{"startOffset":32745,"endOffset":33054,"count":0}],"isBlockCoverage":true},{"functionName":"decode_tree","ranges":[{"startOffset":33094,"endOffset":33176,"count":0}],"isBlockCoverage":false},{"functionName":"decode_tree","ranges":[{"startOffset":33186,"endOffset":37092,"count":4},{"startOffset":35152,"endOffset":37016,"count":11},{"startOffset":35421,"endOffset":35445,"count":4},{"startOffset":35445,"endOffset":36147,"count":7},{"startOffset":36148,"endOffset":36285,"count":0},{"startOffset":36286,"endOffset":36422,"count":0},{"startOffset":36424,"endOffset":36549,"count":0},{"startOffset":36549,"endOffset":37016,"count":7}],"isBlockCoverage":true},{"functionName":"delta","ranges":[{"startOffset":37095,"endOffset":37165,"count":0}],"isBlockCoverage":false},{"functionName":"delta","ranges":[{"startOffset":37175,"endOffset":44998,"count":0}],"isBlockCoverage":false},{"functionName":"delta_header","ranges":[{"startOffset":45001,"endOffset":45085,"count":0}],"isBlockCoverage":false},{"functionName":"delta_header","ranges":[{"startOffset":45095,"endOffset":46382,"count":0}],"isBlockCoverage":false},{"functionName":"encode","ranges":[{"startOffset":46385,"endOffset":46457,"count":0}],"isBlockCoverage":false},{"functionName":"encode","ranges":[{"startOffset":46467,"endOffset":50666,"count":3},{"startOffset":49152,"endOffset":50442,"count":5},{"startOffset":49335,"endOffset":49612,"count":0},{"startOffset":50222,"endOffset":50351,"count":0}],"isBlockCoverage":true},{"functionName":"encode_commit","ranges":[{"startOffset":50669,"endOffset":50755,"count":0}],"isBlockCoverage":false},{"functionName":"encode_commit","ranges":[{"startOffset":50765,"endOffset":54552,"count":10},{"startOffset":52485,"endOffset":52891,"count":4},{"startOffset":52957,"endOffset":53364,"count":0},{"startOffset":54019,"endOffset":54274,"count":1}],"isBlockCoverage":true},{"functionName":"encode_tag","ranges":[{"startOffset":54555,"endOffset":54635,"count":0}],"isBlockCoverage":false},{"functionName":"encode_tag","ranges":[{"startOffset":54645,"endOffset":57085,"count":0}],"isBlockCoverage":false},{"functionName":"encode_tree","ranges":[{"startOffset":57088,"endOffset":57170,"count":0}],"isBlockCoverage":false},{"functionName":"encode_tree","ranges":[{"startOffset":57180,"endOffset":60091,"count":20},{"startOffset":59325,"endOffset":60067,"count":25}],"isBlockCoverage":true},{"functionName":"get_length","ranges":[{"startOffset":60094,"endOffset":60174,"count":0}],"isBlockCoverage":false},{"functionName":"get_length","ranges":[{"startOffset":60184,"endOffset":61656,"count":15},{"startOffset":61122,"endOffset":61495,"count":9}],"isBlockCoverage":true},{"functionName":"get_type","ranges":[{"startOffset":61659,"endOffset":61735,"count":0}],"isBlockCoverage":false},{"functionName":"get_type","ranges":[{"startOffset":61745,"endOffset":63254,"count":10},{"startOffset":62217,"endOffset":62336,"count":2},{"startOffset":62336,"endOffset":63230,"count":8},{"startOffset":62407,"endOffset":62524,"count":2},{"startOffset":62524,"endOffset":63230,"count":6},{"startOffset":62712,"endOffset":63230,"count":0}],"isBlockCoverage":true},{"functionName":"sort_tree","ranges":[{"startOffset":63257,"endOffset":63335,"count":0}],"isBlockCoverage":false},{"functionName":"sort_tree","ranges":[{"startOffset":63345,"endOffset":67113,"count":22},{"startOffset":66323,"endOffset":66835,"count":29},{"startOffset":66555,"endOffset":66707,"count":11},{"startOffset":66707,"endOffset":66782,"count":18},{"startOffset":66963,"endOffset":67088,"count":29}],"isBlockCoverage":true},{"functionName":"type_and_length","ranges":[{"startOffset":67116,"endOffset":67206,"count":0}],"isBlockCoverage":false},{"functionName":"type_and_length","ranges":[{"startOffset":67216,"endOffset":70118,"count":17},{"startOffset":67946,"endOffset":68006,"count":12},{"startOffset":68006,"endOffset":68915,"count":5},{"startOffset":68134,"endOffset":68194,"count":1},{"startOffset":68194,"endOffset":68915,"count":4},{"startOffset":68382,"endOffset":68915,"count":0},{"startOffset":69016,"endOffset":69076,"count":11},{"startOffset":69479,"endOffset":69847,"count":4},{"startOffset":69968,"endOffset":70091,"count":11}],"isBlockCoverage":true},{"functionName":"zlib_decompress","ranges":[{"startOffset":70121,"endOffset":70211,"count":0}],"isBlockCoverage":false},{"functionName":"zlib_decompress","ranges":[{"startOffset":70221,"endOffset":71968,"count":0}],"isBlockCoverage":false}]},{"scriptId":"866","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_pack.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2465,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":164,"endOffset":1192,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":341,"endOffset":407,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":557,"endOffset":623,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":712,"endOffset":778,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":869,"endOffset":905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":997,"endOffset":1063,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1108,"endOffset":1168,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_stream","ranges":[{"startOffset":1196,"endOffset":1352,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1355,"endOffset":1566,"count":0}],"isBlockCoverage":false},{"functionName":"eat_byte","ranges":[{"startOffset":1569,"endOffset":1755,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":1758,"endOffset":1896,"count":0}],"isBlockCoverage":false},{"functionName":"eat_bytes","ranges":[{"startOffset":1899,"endOffset":2271,"count":0}],"isBlockCoverage":false}]},{"scriptId":"867","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_porcelain.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":132788,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":34459,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":294,"endOffset":396,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":547,"endOffset":1145,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1192,"endOffset":1909,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2010,"endOffset":2618,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2665,"endOffset":3382,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3473,"endOffset":4358,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4403,"endOffset":4505,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4551,"endOffset":5436,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5529,"endOffset":6414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6457,"endOffset":6559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6602,"endOffset":6666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6710,"endOffset":7595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7694,"endOffset":8411,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8457,"endOffset":9342,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9385,"endOffset":9487,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9530,"endOffset":9594,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9700,"endOffset":10503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10547,"endOffset":11145,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11189,"endOffset":12074,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12119,"endOffset":12221,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12267,"endOffset":12369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12411,"endOffset":12475,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12525,"endOffset":12589,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12638,"endOffset":12740,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12790,"endOffset":13675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13722,"endOffset":13824,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13929,"endOffset":14961,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15003,"endOffset":15067,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15174,"endOffset":16206,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16248,"endOffset":16312,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16417,"endOffset":16481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16523,"endOffset":17555,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17662,"endOffset":17726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17768,"endOffset":18800,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18900,"endOffset":18966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19068,"endOffset":21034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21076,"endOffset":21140,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21190,"endOffset":21254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21305,"endOffset":21365,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21467,"endOffset":23433,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23475,"endOffset":23539,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23589,"endOffset":23691,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23742,"endOffset":23802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23894,"endOffset":26524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26570,"endOffset":27373,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27417,"endOffset":27535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27585,"endOffset":28470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28515,"endOffset":28617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28659,"endOffset":28723,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28773,"endOffset":28837,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28935,"endOffset":28999,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29042,"endOffset":29106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29149,"endOffset":29251,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29346,"endOffset":29410,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29452,"endOffset":30484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30582,"endOffset":30646,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30691,"endOffset":31308,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31403,"endOffset":31467,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31509,"endOffset":32541,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32640,"endOffset":33357,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33403,"endOffset":34288,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34333,"endOffset":34435,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_porcelain","ranges":[{"startOffset":34463,"endOffset":34600,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":34603,"endOffset":34716,"count":0}],"isBlockCoverage":false},{"functionName":"build_trees","ranges":[{"startOffset":34719,"endOffset":34806,"count":0}],"isBlockCoverage":false},{"functionName":"build_trees","ranges":[{"startOffset":34816,"endOffset":42109,"count":6},{"startOffset":39906,"endOffset":42084,"count":16},{"startOffset":40183,"endOffset":40462,"count":10},{"startOffset":40768,"endOffset":41638,"count":10}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":40061,"endOffset":40133,"count":29}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":40538,"endOffset":40664,"count":60}],"isBlockCoverage":true},{"functionName":"create_annotated_tag","ranges":[{"startOffset":42112,"endOffset":42217,"count":0}],"isBlockCoverage":false},{"functionName":"create_annotated_tag","ranges":[{"startOffset":42227,"endOffset":47396,"count":0}],"isBlockCoverage":false},{"functionName":"create_branch","ranges":[{"startOffset":47399,"endOffset":47490,"count":0}],"isBlockCoverage":false},{"functionName":"create_branch","ranges":[{"startOffset":47500,"endOffset":48385,"count":0}],"isBlockCoverage":false},{"functionName":"create_lightweight_tag","ranges":[{"startOffset":48388,"endOffset":48497,"count":0}],"isBlockCoverage":false},{"functionName":"create_lightweight_tag","ranges":[{"startOffset":48507,"endOffset":49996,"count":0}],"isBlockCoverage":false},{"functionName":"create_tag","ranges":[{"startOffset":49999,"endOffset":50084,"count":0}],"isBlockCoverage":false},{"functionName":"create_tag","ranges":[{"startOffset":50094,"endOffset":52245,"count":0}],"isBlockCoverage":false},{"functionName":"delete_annotated_tag","ranges":[{"startOffset":52248,"endOffset":52353,"count":0}],"isBlockCoverage":false},{"functionName":"delete_annotated_tag","ranges":[{"startOffset":52363,"endOffset":56367,"count":0}],"isBlockCoverage":false},{"functionName":"delete_branch","ranges":[{"startOffset":56370,"endOffset":56461,"count":0}],"isBlockCoverage":false},{"functionName":"delete_branch","ranges":[{"startOffset":56471,"endOffset":57514,"count":0}],"isBlockCoverage":false},{"functionName":"delete_lightweight_tag","ranges":[{"startOffset":57517,"endOffset":57626,"count":0}],"isBlockCoverage":false},{"functionName":"delete_lightweight_tag","ranges":[{"startOffset":57636,"endOffset":59085,"count":0}],"isBlockCoverage":false},{"functionName":"delete_tag","ranges":[{"startOffset":59088,"endOffset":59173,"count":0}],"isBlockCoverage":false},{"functionName":"delete_tag","ranges":[{"startOffset":59183,"endOffset":60742,"count":0}],"isBlockCoverage":false},{"functionName":"empty_packfile","ranges":[{"startOffset":60745,"endOffset":60828,"count":0}],"isBlockCoverage":false},{"functionName":"empty_packfile","ranges":[{"startOffset":60838,"endOffset":61944,"count":0}],"isBlockCoverage":false},{"functionName":"find_folders","ranges":[{"startOffset":61947,"endOffset":62036,"count":0}],"isBlockCoverage":false},{"functionName":"find_folders","ranges":[{"startOffset":62046,"endOffset":67122,"count":6},{"startOffset":65313,"endOffset":65864,"count":10},{"startOffset":65730,"endOffset":65858,"count":9},{"startOffset":65932,"endOffset":66834,"count":16},{"startOffset":66201,"endOffset":66828,"count":36},{"startOffset":66706,"endOffset":66820,"count":7},{"startOffset":66902,"endOffset":67095,"count":16}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":65403,"endOffset":65466,"count":4}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":65497,"endOffset":65519,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":66413,"endOffset":66462,"count":102}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":66495,"endOffset":66517,"count":0}],"isBlockCoverage":false},{"functionName":"full_tree","ranges":[{"startOffset":67125,"endOffset":67208,"count":0}],"isBlockCoverage":false},{"functionName":"full_tree","ranges":[{"startOffset":67218,"endOffset":71546,"count":0}],"isBlockCoverage":false},{"functionName":"pull","ranges":[{"startOffset":71549,"endOffset":71622,"count":0}],"isBlockCoverage":false},{"functionName":"pull","ranges":[{"startOffset":71632,"endOffset":76121,"count":1},{"startOffset":75702,"endOffset":75839,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":75069,"endOffset":75240,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":75269,"endOffset":75291,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":75399,"endOffset":75421,"count":0}],"isBlockCoverage":false},{"functionName":"pull_by_branch","ranges":[{"startOffset":76124,"endOffset":76217,"count":0}],"isBlockCoverage":false},{"functionName":"pull_by_branch","ranges":[{"startOffset":76227,"endOffset":79172,"count":1},{"startOffset":78625,"endOffset":78670,"count":0}],"isBlockCoverage":true},{"functionName":"pull_by_commit","ranges":[{"startOffset":79175,"endOffset":79268,"count":0}],"isBlockCoverage":false},{"functionName":"pull_by_commit","ranges":[{"startOffset":79278,"endOffset":82254,"count":0}],"isBlockCoverage":false},{"functionName":"push","ranges":[{"startOffset":82257,"endOffset":82330,"count":0}],"isBlockCoverage":false},{"functionName":"push","ranges":[{"startOffset":82340,"endOffset":98029,"count":0}],"isBlockCoverage":false},{"functionName":"receive_pack_push","ranges":[{"startOffset":98032,"endOffset":98131,"count":0}],"isBlockCoverage":false},{"functionName":"receive_pack_push","ranges":[{"startOffset":98141,"endOffset":110247,"count":0}],"isBlockCoverage":false},{"functionName":"walk","ranges":[{"startOffset":110250,"endOffset":110323,"count":0}],"isBlockCoverage":false},{"functionName":"walk","ranges":[{"startOffset":110333,"endOffset":118383,"count":1},{"startOffset":115982,"endOffset":116115,"count":0},{"startOffset":116293,"endOffset":117753,"count":3},{"startOffset":117276,"endOffset":117417,"count":0},{"startOffset":118080,"endOffset":118379,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":115361,"endOffset":115528,"count":2},{"startOffset":115491,"endOffset":115526,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":115557,"endOffset":115579,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":115685,"endOffset":115707,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":116594,"endOffset":116776,"count":12},{"startOffset":116724,"endOffset":116774,"count":6}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":116809,"endOffset":116831,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":116937,"endOffset":116959,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":117826,"endOffset":117964,"count":3}],"isBlockCoverage":true},{"functionName":"walk_tree","ranges":[{"startOffset":118386,"endOffset":118469,"count":0}],"isBlockCoverage":false},{"functionName":"walk_tree","ranges":[{"startOffset":118479,"endOffset":125690,"count":0}],"isBlockCoverage":false}]},{"scriptId":"868","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_tag.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3808,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":1333,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":353,"endOffset":417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":460,"endOffset":502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":605,"endOffset":669,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":712,"endOffset":776,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":870,"endOffset":934,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":977,"endOffset":1041,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1138,"endOffset":1202,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1245,"endOffset":1309,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_tag","ranges":[{"startOffset":1337,"endOffset":1422,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1425,"endOffset":1538,"count":0}],"isBlockCoverage":false},{"functionName":"add_peel","ranges":[{"startOffset":1541,"endOffset":1616,"count":0}],"isBlockCoverage":false},{"functionName":"add_peel","ranges":[{"startOffset":1626,"endOffset":2016,"count":0}],"isBlockCoverage":false},{"functionName":"add_tag_prefix","ranges":[{"startOffset":2019,"endOffset":2106,"count":0}],"isBlockCoverage":false},{"functionName":"add_tag_prefix","ranges":[{"startOffset":2116,"endOffset":2494,"count":0}],"isBlockCoverage":false},{"functionName":"remove_peel","ranges":[{"startOffset":2497,"endOffset":2578,"count":0}],"isBlockCoverage":false},{"functionName":"remove_peel","ranges":[{"startOffset":2588,"endOffset":3066,"count":0}],"isBlockCoverage":false},{"functionName":"remove_tag_prefix","ranges":[{"startOffset":3069,"endOffset":3162,"count":0}],"isBlockCoverage":false},{"functionName":"remove_tag_prefix","ranges":[{"startOffset":3172,"endOffset":3663,"count":0}],"isBlockCoverage":false}]},{"scriptId":"869","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_time.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3621,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":825,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":350,"endOffset":449,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":542,"endOffset":641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":684,"endOffset":721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":764,"endOffset":801,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_time","ranges":[{"startOffset":829,"endOffset":914,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":917,"endOffset":1030,"count":0}],"isBlockCoverage":false},{"functionName":"get_unix","ranges":[{"startOffset":1033,"endOffset":1099,"count":0}],"isBlockCoverage":false},{"functionName":"get_unix","ranges":[{"startOffset":1109,"endOffset":1885,"count":1}],"isBlockCoverage":true},{"functionName":"get_utc","ranges":[{"startOffset":1888,"endOffset":1962,"count":0}],"isBlockCoverage":false},{"functionName":"get_utc","ranges":[{"startOffset":1972,"endOffset":3352,"count":1},{"startOffset":2890,"endOffset":2950,"count":0},{"startOffset":3026,"endOffset":3088,"count":0}],"isBlockCoverage":true}]},{"scriptId":"870","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_transport.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":36907,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":9239,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":297,"endOffset":490,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":650,"endOffset":714,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":810,"endOffset":874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":920,"endOffset":984,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1029,"endOffset":1159,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1209,"endOffset":1347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1443,"endOffset":1507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1553,"endOffset":1617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1667,"endOffset":1731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1776,"endOffset":1906,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1951,"endOffset":2053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2103,"endOffset":2241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2332,"endOffset":2398,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2441,"endOffset":2507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2607,"endOffset":3492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3537,"endOffset":3667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3709,"endOffset":3773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3824,"endOffset":3884,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3929,"endOffset":4252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4358,"endOffset":4422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4472,"endOffset":4536,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4587,"endOffset":4647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4694,"endOffset":5616,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5662,"endOffset":6547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6592,"endOffset":6694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6800,"endOffset":6864,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6907,"endOffset":7009,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7060,"endOffset":7120,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7166,"endOffset":8051,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8096,"endOffset":8198,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8295,"endOffset":8359,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8401,"endOffset":8503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8545,"endOffset":8647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8697,"endOffset":8761,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8804,"endOffset":8870,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8971,"endOffset":9109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9151,"endOffset":9215,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_transport","ranges":[{"startOffset":9243,"endOffset":9386,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":9389,"endOffset":9502,"count":0}],"isBlockCoverage":false},{"functionName":"branches","ranges":[{"startOffset":9505,"endOffset":9586,"count":0}],"isBlockCoverage":false},{"functionName":"branches","ranges":[{"startOffset":9596,"endOffset":10258,"count":1}],"isBlockCoverage":true},{"functionName":"branch_list","ranges":[{"startOffset":10261,"endOffset":10348,"count":0}],"isBlockCoverage":false},{"functionName":"branch_list","ranges":[{"startOffset":10358,"endOffset":12131,"count":2}],"isBlockCoverage":true},{"functionName":"check_report_status","ranges":[{"startOffset":12134,"endOffset":12237,"count":0}],"isBlockCoverage":false},{"functionName":"check_report_status","ranges":[{"startOffset":12247,"endOffset":17768,"count":5},{"startOffset":13116,"endOffset":13203,"count":0},{"startOffset":13302,"endOffset":13403,"count":0},{"startOffset":13816,"endOffset":13909,"count":0},{"startOffset":13991,"endOffset":14113,"count":1},{"startOffset":14113,"endOffset":17543,"count":4},{"startOffset":14188,"endOffset":14282,"count":0},{"startOffset":14381,"endOffset":14487,"count":0},{"startOffset":14904,"endOffset":17083,"count":1},{"startOffset":15018,"endOffset":15120,"count":0},{"startOffset":15233,"endOffset":15340,"count":0},{"startOffset":15457,"endOffset":15568,"count":0},{"startOffset":15664,"endOffset":15754,"count":0},{"startOffset":15857,"endOffset":15954,"count":0},{"startOffset":16062,"endOffset":16164,"count":0},{"startOffset":16284,"endOffset":16386,"count":0},{"startOffset":16509,"endOffset":16607,"count":0},{"startOffset":16818,"endOffset":17073,"count":0},{"startOffset":17083,"endOffset":17535,"count":3},{"startOffset":17182,"endOffset":17272,"count":0},{"startOffset":17350,"endOffset":17424,"count":2},{"startOffset":17426,"endOffset":17535,"count":1},{"startOffset":17600,"endOffset":17764,"count":3},{"startOffset":17758,"endOffset":17764,"count":0}],"isBlockCoverage":true},{"functionName":"find_branch","ranges":[{"startOffset":17771,"endOffset":17858,"count":0}],"isBlockCoverage":false},{"functionName":"find_branch","ranges":[{"startOffset":17868,"endOffset":19204,"count":1},{"startOffset":18883,"endOffset":18923,"count":0}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":19207,"endOffset":19282,"count":0}],"isBlockCoverage":false},{"functionName":"parse","ranges":[{"startOffset":19292,"endOffset":21116,"count":2},{"startOffset":20025,"endOffset":21035,"count":12},{"startOffset":20253,"endOffset":20400,"count":0},{"startOffset":20529,"endOffset":20609,"count":4},{"startOffset":20609,"endOffset":20907,"count":8},{"startOffset":20909,"endOffset":21029,"count":4}],"isBlockCoverage":true},{"functionName":"receive_pack","ranges":[{"startOffset":21119,"endOffset":21208,"count":0}],"isBlockCoverage":false},{"functionName":"receive_pack","ranges":[{"startOffset":21218,"endOffset":24064,"count":0}],"isBlockCoverage":false},{"functionName":"upload_pack","ranges":[{"startOffset":24067,"endOffset":24154,"count":0}],"isBlockCoverage":false},{"functionName":"upload_pack","ranges":[{"startOffset":24164,"endOffset":28866,"count":1},{"startOffset":25639,"endOffset":25691,"count":0},{"startOffset":27343,"endOffset":27581,"count":0},{"startOffset":28582,"endOffset":28746,"count":0}],"isBlockCoverage":true},{"functionName":"upload_pack_by_branch","ranges":[{"startOffset":28869,"endOffset":28976,"count":0}],"isBlockCoverage":false},{"functionName":"upload_pack_by_branch","ranges":[{"startOffset":28986,"endOffset":33592,"count":1},{"startOffset":29533,"endOffset":29585,"count":0},{"startOffset":30552,"endOffset":30589,"count":0},{"startOffset":33224,"endOffset":33446,"count":0}],"isBlockCoverage":true},{"functionName":"upload_pack_by_commit","ranges":[{"startOffset":33595,"endOffset":33702,"count":0}],"isBlockCoverage":false},{"functionName":"upload_pack_by_commit","ranges":[{"startOffset":33712,"endOffset":36391,"count":0}],"isBlockCoverage":false}]},{"scriptId":"871","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_url.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7217,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":1224,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":375,"endOffset":439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":486,"endOffset":550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":593,"endOffset":695,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":802,"endOffset":866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":909,"endOffset":1039,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1136,"endOffset":1200,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_url","ranges":[{"startOffset":1228,"endOffset":1313,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1316,"endOffset":1429,"count":1},{"startOffset":1372,"endOffset":1408,"count":0}],"isBlockCoverage":true},{"functionName":"get_commit_display_url","ranges":[{"startOffset":1432,"endOffset":2712,"count":0}],"isBlockCoverage":false},{"functionName":"get_default_commit_display_url","ranges":[{"startOffset":2715,"endOffset":5815,"count":4},{"startOffset":4725,"endOffset":5779,"count":2},{"startOffset":5106,"endOffset":5779,"count":1}],"isBlockCoverage":true},{"functionName":"validate_url","ranges":[{"startOffset":5818,"endOffset":7072,"count":0}],"isBlockCoverage":false}]},{"scriptId":"872","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_utils.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3905,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":1006,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":350,"endOffset":445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":540,"endOffset":604,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":649,"endOffset":713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":813,"endOffset":873,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":916,"endOffset":982,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_git_utils","ranges":[{"startOffset":1010,"endOffset":1095,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1098,"endOffset":1211,"count":3},{"startOffset":1154,"endOffset":1190,"count":0}],"isBlockCoverage":true},{"functionName":"get_null","ranges":[{"startOffset":1214,"endOffset":1281,"count":1}],"isBlockCoverage":true},{"functionName":"get_null","ranges":[{"startOffset":1291,"endOffset":1681,"count":10}],"isBlockCoverage":true},{"functionName":"length_utf8_hex","ranges":[{"startOffset":1684,"endOffset":1775,"count":5}],"isBlockCoverage":true},{"functionName":"length_utf8_hex","ranges":[{"startOffset":1785,"endOffset":2757,"count":17},{"startOffset":2280,"endOffset":2433,"count":1},{"startOffset":2427,"endOffset":2433,"count":0},{"startOffset":2433,"endOffset":2756,"count":16}],"isBlockCoverage":true},{"functionName":"pkt_string","ranges":[{"startOffset":2760,"endOffset":2841,"count":1}],"isBlockCoverage":true},{"functionName":"pkt_string","ranges":[{"startOffset":2851,"endOffset":3639,"count":3},{"startOffset":3305,"endOffset":3426,"count":0}],"isBlockCoverage":true}]},{"scriptId":"873","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":41784,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":9154,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":304,"endOffset":401,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":486,"endOffset":626,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":708,"endOffset":1211,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1302,"endOffset":1627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1710,"endOffset":1856,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1942,"endOffset":2088,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2175,"endOffset":2315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2406,"endOffset":2554,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2642,"endOffset":2776,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2863,"endOffset":2991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3078,"endOffset":3196,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3283,"endOffset":3857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4005,"endOffset":4069,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4112,"endOffset":4176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4374,"endOffset":4514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4566,"endOffset":4663,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4711,"endOffset":4808,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4909,"endOffset":4951,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4997,"endOffset":5039,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5086,"endOffset":5407,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5510,"endOffset":5636,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5734,"endOffset":5831,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5874,"endOffset":6014,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6109,"endOffset":6173,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6263,"endOffset":6360,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6410,"endOffset":6507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6554,"endOffset":6651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6753,"endOffset":6850,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6943,"endOffset":6985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7026,"endOffset":7068,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7111,"endOffset":7153,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7197,"endOffset":7518,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7565,"endOffset":8098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8200,"endOffset":8290,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8338,"endOffset":8484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8533,"endOffset":8673,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8726,"endOffset":8874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8930,"endOffset":9027,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui","ranges":[{"startOffset":9158,"endOffset":11449,"count":0}],"isBlockCoverage":false},{"functionName":"back","ranges":[{"startOffset":11452,"endOffset":14155,"count":0}],"isBlockCoverage":false},{"functionName":"back_graceful","ranges":[{"startOffset":14158,"endOffset":15663,"count":0}],"isBlockCoverage":false},{"functionName":"cache_html","ranges":[{"startOffset":15666,"endOffset":16101,"count":0}],"isBlockCoverage":false},{"functionName":"call_page","ranges":[{"startOffset":16104,"endOffset":17630,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":17633,"endOffset":19897,"count":0}],"isBlockCoverage":false},{"functionName":"free","ranges":[{"startOffset":19900,"endOffset":20208,"count":0}],"isBlockCoverage":false},{"functionName":"go_home","ranges":[{"startOffset":20211,"endOffset":21478,"count":0}],"isBlockCoverage":false},{"functionName":"handle_action","ranges":[{"startOffset":21481,"endOffset":25700,"count":0}],"isBlockCoverage":false},{"functionName":"handle_error","ranges":[{"startOffset":25703,"endOffset":27717,"count":0}],"isBlockCoverage":false},{"functionName":"is_page_modal","ranges":[{"startOffset":27720,"endOffset":28586,"count":0}],"isBlockCoverage":false},{"functionName":"on_event","ranges":[{"startOffset":28589,"endOffset":30014,"count":0}],"isBlockCoverage":false},{"functionName":"render","ranges":[{"startOffset":30017,"endOffset":31531,"count":0}],"isBlockCoverage":false},{"functionName":"set_focus","ranges":[{"startOffset":31534,"endOffset":31630,"count":0}],"isBlockCoverage":false},{"functionName":"startup","ranges":[{"startOffset":31633,"endOffset":34478,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$cache_asset","ranges":[{"startOffset":34481,"endOffset":36690,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_current_page_name","ranges":[{"startOffset":36693,"endOffset":37675,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_hotkeys_ctl","ranges":[{"startOffset":37678,"endOffset":37951,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_html_parts","ranges":[{"startOffset":37954,"endOffset":38199,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_log","ranges":[{"startOffset":38202,"endOffset":38933,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$register_event_handler","ranges":[{"startOffset":38936,"endOffset":39461,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$register_page_asset","ranges":[{"startOffset":39464,"endOffset":40259,"count":0}],"isBlockCoverage":false}]},{"scriptId":"874","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_asset_manager.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20719,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":3308,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":348,"endOffset":1263,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1417,"endOffset":1483,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1531,"endOffset":1573,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1670,"endOffset":2304,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2354,"endOffset":3037,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3138,"endOffset":3284,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_asset_manager","ranges":[{"startOffset":3312,"endOffset":4327,"count":20}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4330,"endOffset":4443,"count":20},{"startOffset":4386,"endOffset":4422,"count":0}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":4446,"endOffset":4517,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":4527,"endOffset":4837,"count":20}],"isBlockCoverage":true},{"functionName":"get_mime_asset","ranges":[{"startOffset":4840,"endOffset":8067,"count":1},{"startOffset":5950,"endOffset":6020,"count":0},{"startOffset":6022,"endOffset":6072,"count":0},{"startOffset":6137,"endOffset":6207,"count":0},{"startOffset":6459,"endOffset":6686,"count":0},{"startOffset":6758,"endOffset":6792,"count":0},{"startOffset":6900,"endOffset":6970,"count":0},{"startOffset":6972,"endOffset":7022,"count":0},{"startOffset":7089,"endOffset":7159,"count":0},{"startOffset":7321,"endOffset":7641,"count":0},{"startOffset":7715,"endOffset":7753,"count":0},{"startOffset":7825,"endOffset":7973,"count":117}],"isBlockCoverage":true},{"functionName":"load_asset","ranges":[{"startOffset":8074,"endOffset":10133,"count":26},{"startOffset":9654,"endOffset":9719,"count":2},{"startOffset":9721,"endOffset":9847,"count":1},{"startOffset":9906,"endOffset":10100,"count":1},{"startOffset":10090,"endOffset":10100,"count":0},{"startOffset":10100,"endOffset":10132,"count":25}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_asset_manager$get_all_assets","ranges":[{"startOffset":10140,"endOffset":12068,"count":2},{"startOffset":11869,"endOffset":12034,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_asset_manager$get_asset","ranges":[{"startOffset":12075,"endOffset":14257,"count":24},{"startOffset":13976,"endOffset":14149,"count":1},{"startOffset":14139,"endOffset":14149,"count":0},{"startOffset":14149,"endOffset":14221,"count":23},{"startOffset":14221,"endOffset":14256,"count":22}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":13725,"endOffset":13772,"count":31}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":13805,"endOffset":13826,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_asset_manager$get_text_asset","ranges":[{"startOffset":14264,"endOffset":16202,"count":23},{"startOffset":14659,"endOffset":14708,"count":18},{"startOffset":15442,"endOffset":15537,"count":21},{"startOffset":15537,"endOffset":15705,"count":1},{"startOffset":15695,"endOffset":15705,"count":0},{"startOffset":15705,"endOffset":15768,"count":20},{"startOffset":15768,"endOffset":15829,"count":16},{"startOffset":15831,"endOffset":16044,"count":1},{"startOffset":16034,"endOffset":16044,"count":0},{"startOffset":16044,"endOffset":16201,"count":19}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_asset_manager$register_asset","ranges":[{"startOffset":16209,"endOffset":18851,"count":34},{"startOffset":16690,"endOffset":16727,"count":0},{"startOffset":16938,"endOffset":16977,"count":1},{"startOffset":17090,"endOffset":17123,"count":2},{"startOffset":17236,"endOffset":17269,"count":31},{"startOffset":18310,"endOffset":18446,"count":2},{"startOffset":18446,"endOffset":18632,"count":32},{"startOffset":18499,"endOffset":18632,"count":30}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":18709,"endOffset":18756,"count":20}],"isBlockCoverage":true}]},{"scriptId":"875","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_buttons.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3978,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":1450,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":368,"endOffset":432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":536,"endOffset":600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":701,"endOffset":765,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":862,"endOffset":926,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1028,"endOffset":1092,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1193,"endOffset":1257,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1362,"endOffset":1426,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_buttons","ranges":[{"startOffset":1454,"endOffset":1539,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1542,"endOffset":1655,"count":0}],"isBlockCoverage":false},{"functionName":"advanced","ranges":[{"startOffset":1658,"endOffset":1727,"count":0}],"isBlockCoverage":false},{"functionName":"advanced","ranges":[{"startOffset":1737,"endOffset":1955,"count":0}],"isBlockCoverage":false},{"functionName":"experimental","ranges":[{"startOffset":1958,"endOffset":2035,"count":0}],"isBlockCoverage":false},{"functionName":"experimental","ranges":[{"startOffset":2045,"endOffset":2270,"count":0}],"isBlockCoverage":false},{"functionName":"help","ranges":[{"startOffset":2273,"endOffset":2334,"count":0}],"isBlockCoverage":false},{"functionName":"help","ranges":[{"startOffset":2344,"endOffset":2568,"count":0}],"isBlockCoverage":false},{"functionName":"new_offline","ranges":[{"startOffset":2571,"endOffset":2646,"count":0}],"isBlockCoverage":false},{"functionName":"new_offline","ranges":[{"startOffset":2656,"endOffset":2882,"count":0}],"isBlockCoverage":false},{"functionName":"new_online","ranges":[{"startOffset":2885,"endOffset":2958,"count":0}],"isBlockCoverage":false},{"functionName":"new_online","ranges":[{"startOffset":2968,"endOffset":3204,"count":0}],"isBlockCoverage":false},{"functionName":"repo_list","ranges":[{"startOffset":3207,"endOffset":3278,"count":0}],"isBlockCoverage":false},{"functionName":"repo_list","ranges":[{"startOffset":3288,"endOffset":3516,"count":0}],"isBlockCoverage":false},{"functionName":"settings","ranges":[{"startOffset":3519,"endOffset":3588,"count":0}],"isBlockCoverage":false},{"functionName":"settings","ranges":[{"startOffset":3598,"endOffset":3817,"count":0}],"isBlockCoverage":false}]},{"scriptId":"876","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_component.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5764,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":1845,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":303,"endOffset":439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":525,"endOffset":724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":894,"endOffset":1040,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1153,"endOffset":1287,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1397,"endOffset":1517,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1623,"endOffset":1759,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_component","ranges":[{"startOffset":1849,"endOffset":2147,"count":9}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2150,"endOffset":2263,"count":9},{"startOffset":2206,"endOffset":2242,"count":0}],"isBlockCoverage":true},{"functionName":"gui_services","ranges":[{"startOffset":2266,"endOffset":2674,"count":0}],"isBlockCoverage":false},{"functionName":"register_deferred_script","ranges":[{"startOffset":2677,"endOffset":3105,"count":0}],"isBlockCoverage":false},{"functionName":"register_event_handler","ranges":[{"startOffset":3108,"endOffset":4060,"count":0}],"isBlockCoverage":false},{"functionName":"register_handlers","ranges":[{"startOffset":4063,"endOffset":4170,"count":0}],"isBlockCoverage":false},{"functionName":"register_hotkeys","ranges":[{"startOffset":4173,"endOffset":5221,"count":0}],"isBlockCoverage":false}]},{"scriptId":"877","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_css_processor.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15428,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":2955,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":316,"endOffset":462,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":544,"endOffset":802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":968,"endOffset":1496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1541,"endOffset":1605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1723,"endOffset":1787,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1835,"endOffset":2363,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2469,"endOffset":2615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2708,"endOffset":2772,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2867,"endOffset":2931,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_css_processor","ranges":[{"startOffset":2959,"endOffset":3468,"count":11}],"isBlockCoverage":true},{"functionName":"add_file","ranges":[{"startOffset":3471,"endOffset":3693,"count":16}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3696,"endOffset":4041,"count":11}],"isBlockCoverage":true},{"functionName":"get_css_vars_in_string","ranges":[{"startOffset":4044,"endOffset":6901,"count":14},{"startOffset":5841,"endOffset":5883,"count":7},{"startOffset":5885,"endOffset":6872,"count":7},{"startOffset":6226,"endOffset":6254,"count":24},{"startOffset":6254,"endOffset":6813,"count":17},{"startOffset":6718,"endOffset":6805,"count":2}],"isBlockCoverage":true},{"functionName":"process","ranges":[{"startOffset":6904,"endOffset":10799,"count":11},{"startOffset":9020,"endOffset":9835,"count":16},{"startOffset":9239,"endOffset":9415,"count":14},{"startOffset":9415,"endOffset":9756,"count":15},{"startOffset":9649,"endOffset":9748,"count":2},{"startOffset":9756,"endOffset":9835,"count":14},{"startOffset":9835,"endOffset":10010,"count":9},{"startOffset":10010,"endOffset":10188,"count":4},{"startOffset":10188,"endOffset":10258,"count":9},{"startOffset":10258,"endOffset":10649,"count":14},{"startOffset":10376,"endOffset":10643,"count":18},{"startOffset":10649,"endOffset":10798,"count":9}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":9916,"endOffset":10006,"count":13}],"isBlockCoverage":true},{"functionName":"resolve_var_recursively","ranges":[{"startOffset":10802,"endOffset":14352,"count":12},{"startOffset":13063,"endOffset":14102,"count":20},{"startOffset":13350,"endOffset":14060,"count":8},{"startOffset":14060,"endOffset":14094,"count":12},{"startOffset":14161,"endOffset":14348,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":12651,"endOffset":12709,"count":12}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":12738,"endOffset":12760,"count":24}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":13601,"endOffset":13659,"count":8}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":13694,"endOffset":13716,"count":17}],"isBlockCoverage":true}]},{"scriptId":"878","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_event.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10986,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":4313,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":307,"endOffset":435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":521,"endOffset":649,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":754,"endOffset":818,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":924,"endOffset":988,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1095,"endOffset":1416,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1527,"endOffset":1663,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1779,"endOffset":1843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2001,"endOffset":2129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2174,"endOffset":2556,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2649,"endOffset":2775,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2826,"endOffset":2962,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3007,"endOffset":3049,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3095,"endOffset":3137,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3184,"endOffset":3505,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3610,"endOffset":3746,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3791,"endOffset":3833,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3879,"endOffset":3921,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3968,"endOffset":4289,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_event","ranges":[{"startOffset":4317,"endOffset":5788,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":5791,"endOffset":7186,"count":5},{"startOffset":6007,"endOffset":6052,"count":0},{"startOffset":6250,"endOffset":6282,"count":3},{"startOffset":6648,"endOffset":6685,"count":1},{"startOffset":7019,"endOffset":7165,"count":0}],"isBlockCoverage":true},{"functionName":"fields_to_map","ranges":[{"startOffset":7189,"endOffset":8425,"count":8},{"startOffset":8244,"endOffset":8395,"count":6}],"isBlockCoverage":true},{"functionName":"new","ranges":[{"startOffset":8428,"endOffset":8495,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":8505,"endOffset":9747,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event$form_data","ranges":[{"startOffset":9750,"endOffset":10306,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_event$query","ranges":[{"startOffset":10309,"endOffset":10833,"count":4}],"isBlockCoverage":true}]},{"scriptId":"879","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_hotkey_ctl.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":24467,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":255,"endOffset":4783,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":515,"endOffset":612,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":696,"endOffset":1567,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1657,"endOffset":2976,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3060,"endOffset":3157,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3251,"endOffset":3315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3468,"endOffset":3588,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3634,"endOffset":4505,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4606,"endOffset":4703,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_hotkey_ctl","ranges":[{"startOffset":4787,"endOffset":7358,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7361,"endOffset":7595,"count":0}],"isBlockCoverage":false},{"functionName":"render_scripts","ranges":[{"startOffset":7598,"endOffset":10432,"count":0}],"isBlockCoverage":false},{"functionName":"should_show_hint","ranges":[{"startOffset":10435,"endOffset":10523,"count":0}],"isBlockCoverage":false},{"functionName":"should_show_hint","ranges":[{"startOffset":10533,"endOffset":10908,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":10911,"endOffset":12850,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkey_ctl$get_registered_hotkeys","ranges":[{"startOffset":12853,"endOffset":13887,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkey_ctl$register_hotkeys","ranges":[{"startOffset":13890,"endOffset":16423,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkey_ctl$reset","ranges":[{"startOffset":16426,"endOffset":16516,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkey_ctl$set_visible","ranges":[{"startOffset":16519,"endOffset":16788,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":16791,"endOffset":23996,"count":0}],"isBlockCoverage":false}]},{"scriptId":"880","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_html_processor.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13081,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":3094,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":350,"endOffset":608,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":694,"endOffset":840,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":930,"endOffset":994,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1087,"endOffset":1151,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1240,"endOffset":1304,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1391,"endOffset":1455,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1604,"endOffset":1668,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1711,"endOffset":1775,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1822,"endOffset":2080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2177,"endOffset":2274,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2320,"endOffset":2384,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2490,"endOffset":2550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2593,"endOffset":2657,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2759,"endOffset":2905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3006,"endOffset":3070,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_html_processor","ranges":[{"startOffset":3098,"endOffset":3916,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3919,"endOffset":4240,"count":5}],"isBlockCoverage":true},{"functionName":"is_preserved","ranges":[{"startOffset":4243,"endOffset":4927,"count":6}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":4574,"endOffset":4632,"count":3}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":4661,"endOffset":4689,"count":0}],"isBlockCoverage":false},{"functionName":"patch_html","ranges":[{"startOffset":4930,"endOffset":9028,"count":4},{"startOffset":6815,"endOffset":7226,"count":3},{"startOffset":7226,"endOffset":7254,"count":9},{"startOffset":7254,"endOffset":8185,"count":6},{"startOffset":7518,"endOffset":8179,"count":5},{"startOffset":8185,"endOffset":8483,"count":3},{"startOffset":8483,"endOffset":8918,"count":2},{"startOffset":8918,"endOffset":9027,"count":3}],"isBlockCoverage":true},{"functionName":"preserve_css","ranges":[{"startOffset":9031,"endOffset":9284,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_html_processor$process","ranges":[{"startOffset":9287,"endOffset":11296,"count":4},{"startOffset":10456,"endOffset":10555,"count":3},{"startOffset":10555,"endOffset":11272,"count":2},{"startOffset":10769,"endOffset":10885,"count":5},{"startOffset":11272,"endOffset":11295,"count":3}],"isBlockCoverage":true},{"functionName":"find_head_offset","ranges":[{"startOffset":11299,"endOffset":12211,"count":5},{"startOffset":11813,"endOffset":12183,"count":1},{"startOffset":12169,"endOffset":12177,"count":0},{"startOffset":12183,"endOffset":12210,"count":4}],"isBlockCoverage":true}]},{"scriptId":"881","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_in_page_modal.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5745,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":1892,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":336,"endOffset":476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":558,"endOffset":741,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":886,"endOffset":1028,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1072,"endOffset":1212,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1256,"endOffset":1316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1361,"endOffset":1421,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1519,"endOffset":1659,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1703,"endOffset":1763,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1808,"endOffset":1868,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_in_page_modal","ranges":[{"startOffset":1896,"endOffset":2316,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2319,"endOffset":2966,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2969,"endOffset":3050,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3060,"endOffset":3880,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":3883,"endOffset":5560,"count":0}],"isBlockCoverage":false}]},{"scriptId":"882","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_jumper.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":28777,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":4368,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":379,"endOffset":476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":519,"endOffset":1113,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1206,"endOffset":1303,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1346,"endOffset":1940,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1989,"endOffset":2086,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2184,"endOffset":2281,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2324,"endOffset":2918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2969,"endOffset":3017,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3068,"endOffset":3115,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3165,"endOffset":3225,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3274,"endOffset":3371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3464,"endOffset":3561,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3604,"endOffset":4198,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4247,"endOffset":4344,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_jumper","ranges":[{"startOffset":4372,"endOffset":4457,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4460,"endOffset":4573,"count":0}],"isBlockCoverage":false},{"functionName":"jump_bw","ranges":[{"startOffset":4576,"endOffset":8945,"count":0}],"isBlockCoverage":false},{"functionName":"jump_tr","ranges":[{"startOffset":8948,"endOffset":11027,"count":0}],"isBlockCoverage":false},{"functionName":"jump_wb","ranges":[{"startOffset":11032,"endOffset":13199,"count":0}],"isBlockCoverage":false},{"functionName":"jump_wb_line","ranges":[{"startOffset":13206,"endOffset":16150,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_jumper$jump","ranges":[{"startOffset":16159,"endOffset":19581,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_jumper$jump_abapgit","ranges":[{"startOffset":19590,"endOffset":22446,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_jumper$jump_adt","ranges":[{"startOffset":22457,"endOffset":24578,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_jumper$jump_batch_input","ranges":[{"startOffset":24589,"endOffset":28596,"count":0}],"isBlockCoverage":false}]},{"scriptId":"883","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":34109,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":243,"endOffset":6083,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":523,"endOffset":1570,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1655,"endOffset":1779,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1861,"endOffset":1987,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2080,"endOffset":2157,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2244,"endOffset":2442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2602,"endOffset":2722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2774,"endOffset":2838,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2933,"endOffset":3053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3162,"endOffset":3282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3387,"endOffset":3507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3598,"endOffset":3718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3810,"endOffset":3930,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3973,"endOffset":4037,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4140,"endOffset":4260,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4376,"endOffset":4496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4605,"endOffset":4725,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4833,"endOffset":4953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5063,"endOffset":5183,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5276,"endOffset":5396,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5504,"endOffset":5568,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5686,"endOffset":5783,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5883,"endOffset":6003,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page","ranges":[{"startOffset":6087,"endOffset":7660,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7663,"endOffset":7981,"count":0}],"isBlockCoverage":false},{"functionName":"footer","ranges":[{"startOffset":7984,"endOffset":10844,"count":0}],"isBlockCoverage":false},{"functionName":"get_version_details","ranges":[{"startOffset":10847,"endOffset":12677,"count":0}],"isBlockCoverage":false},{"functionName":"header_script_links","ranges":[{"startOffset":12680,"endOffset":13299,"count":0}],"isBlockCoverage":false},{"functionName":"header_stylesheet_links","ranges":[{"startOffset":13302,"endOffset":14909,"count":0}],"isBlockCoverage":false},{"functionName":"html_head","ranges":[{"startOffset":14912,"endOffset":16462,"count":0}],"isBlockCoverage":false},{"functionName":"render_browser_control_warning","ranges":[{"startOffset":16465,"endOffset":17907,"count":0}],"isBlockCoverage":false},{"functionName":"render_command_palettes","ranges":[{"startOffset":17910,"endOffset":18638,"count":0}],"isBlockCoverage":false},{"functionName":"render_deferred_parts","ranges":[{"startOffset":18641,"endOffset":19828,"count":0}],"isBlockCoverage":false},{"functionName":"render_error_message_box","ranges":[{"startOffset":19831,"endOffset":20449,"count":0}],"isBlockCoverage":false},{"functionName":"render_hotkey_overview","ranges":[{"startOffset":20452,"endOffset":21018,"count":0}],"isBlockCoverage":false},{"functionName":"render_link_hints","ranges":[{"startOffset":21021,"endOffset":21971,"count":0}],"isBlockCoverage":false},{"functionName":"scripts","ranges":[{"startOffset":21974,"endOffset":22700,"count":0}],"isBlockCoverage":false},{"functionName":"title","ranges":[{"startOffset":22703,"endOffset":25476,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_error_handler$handle_error","ranges":[{"startOffset":25479,"endOffset":25940,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":25943,"endOffset":27784,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_modal$is_modal","ranges":[{"startOffset":27787,"endOffset":28064,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":28067,"endOffset":30829,"count":0}],"isBlockCoverage":false},{"functionName":"is_edge_control_warning_needed","ranges":[{"startOffset":30832,"endOffset":32534,"count":0}],"isBlockCoverage":false}]},{"scriptId":"884","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_addofflin.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20235,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":3361,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":920,"endOffset":1058,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1149,"endOffset":1277,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1355,"endOffset":1811,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1892,"endOffset":2298,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2460,"endOffset":2588,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2636,"endOffset":2764,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2865,"endOffset":2991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3141,"endOffset":3281,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_addofflin","ranges":[{"startOffset":3365,"endOffset":4135,"count":0}],"isBlockCoverage":false},{"functionName":"choose_labels","ranges":[{"startOffset":4138,"endOffset":4723,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4726,"endOffset":5169,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5172,"endOffset":5244,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5254,"endOffset":5875,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":5878,"endOffset":9412,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":9415,"endOffset":12503,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":12506,"endOffset":17595,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":17598,"endOffset":18298,"count":0}],"isBlockCoverage":false}]},{"scriptId":"885","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_addonline.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":24383,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":3558,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":920,"endOffset":1058,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1149,"endOffset":1277,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1355,"endOffset":1942,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2023,"endOffset":2495,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2657,"endOffset":2785,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2833,"endOffset":2961,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3062,"endOffset":3188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3338,"endOffset":3478,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_addonline","ranges":[{"startOffset":3562,"endOffset":4332,"count":0}],"isBlockCoverage":false},{"functionName":"choose_labels","ranges":[{"startOffset":4335,"endOffset":4920,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4923,"endOffset":5366,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5369,"endOffset":5441,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5451,"endOffset":6071,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":6074,"endOffset":10369,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":10372,"endOffset":14465,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":14468,"endOffset":21317,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":21320,"endOffset":22020,"count":0}],"isBlockCoverage":false}]},{"scriptId":"886","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_code_insp.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":17118,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":278,"endOffset":3044,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":709,"endOffset":827,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":917,"endOffset":1013,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1162,"endOffset":1294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1481,"endOffset":1578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1692,"endOffset":1789,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1910,"endOffset":2006,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2230,"endOffset":2346,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2390,"endOffset":2508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2560,"endOffset":2656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2762,"endOffset":2859,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_code_insp","ranges":[{"startOffset":3048,"endOffset":3380,"count":0}],"isBlockCoverage":false},{"functionName":"ask_user_for_check_variant","ranges":[{"startOffset":3383,"endOffset":3901,"count":0}],"isBlockCoverage":false},{"functionName":"build_menu","ranges":[{"startOffset":3904,"endOffset":4972,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4975,"endOffset":5909,"count":0}],"isBlockCoverage":false},{"functionName":"determine_check_variant","ranges":[{"startOffset":5912,"endOffset":6305,"count":0}],"isBlockCoverage":false},{"functionName":"has_inspection_errors","ranges":[{"startOffset":6308,"endOffset":6963,"count":0}],"isBlockCoverage":false},{"functionName":"is_nothing_to_display","ranges":[{"startOffset":6966,"endOffset":7249,"count":0}],"isBlockCoverage":false},{"functionName":"is_stage_allowed","ranges":[{"startOffset":7252,"endOffset":7688,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":7691,"endOffset":9526,"count":0}],"isBlockCoverage":false},{"functionName":"run_code_inspector","ranges":[{"startOffset":9529,"endOffset":10341,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":10344,"endOffset":14286,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":14289,"endOffset":16599,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":16602,"endOffset":16929,"count":0}],"isBlockCoverage":false}]},{"scriptId":"887","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_codi_base.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":41406,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":248,"endOffset":9638,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":535,"endOffset":651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":734,"endOffset":2073,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2157,"endOffset":2221,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2304,"endOffset":2734,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2826,"endOffset":2873,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2955,"endOffset":3019,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3172,"endOffset":3292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3338,"endOffset":3434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3480,"endOffset":3544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3643,"endOffset":3763,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3808,"endOffset":5147,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5251,"endOffset":5371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5416,"endOffset":6535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6635,"endOffset":6699,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6744,"endOffset":7863,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7953,"endOffset":8547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8594,"endOffset":9188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9238,"endOffset":9298,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9399,"endOffset":9531,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_codi_base","ranges":[{"startOffset":9642,"endOffset":11484,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":11487,"endOffset":11600,"count":0}],"isBlockCoverage":false},{"functionName":"build_base_menu","ranges":[{"startOffset":11603,"endOffset":12875,"count":0}],"isBlockCoverage":false},{"functionName":"build_nav_link","ranges":[{"startOffset":12878,"endOffset":14882,"count":0}],"isBlockCoverage":false},{"functionName":"jump","ranges":[{"startOffset":14885,"endOffset":23074,"count":0}],"isBlockCoverage":false},{"functionName":"render_result","ranges":[{"startOffset":23077,"endOffset":27035,"count":0}],"isBlockCoverage":false},{"functionName":"render_result_line","ranges":[{"startOffset":27038,"endOffset":34076,"count":0}],"isBlockCoverage":false},{"functionName":"render_variant","ranges":[{"startOffset":34081,"endOffset":35186,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":35191,"endOffset":40030,"count":0}],"isBlockCoverage":false}]},{"scriptId":"888","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_commit.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":58510,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":257,"endOffset":13772,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":485,"endOffset":611,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":697,"endOffset":825,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":911,"endOffset":1049,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1140,"endOffset":1268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1353,"endOffset":1477,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1558,"endOffset":1688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1770,"endOffset":1888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1970,"endOffset":3949,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4032,"endOffset":4908,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4995,"endOffset":5098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5176,"endOffset":5888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5969,"endOffset":6101,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6260,"endOffset":6380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6486,"endOffset":6606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6715,"endOffset":6843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6891,"endOffset":7019,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7120,"endOffset":7246,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7407,"endOffset":7471,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7577,"endOffset":7641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7746,"endOffset":7810,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7914,"endOffset":7978,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8022,"endOffset":10001,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10103,"endOffset":10167,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10211,"endOffset":12190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12310,"endOffset":12374,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12424,"endOffset":12488,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12580,"endOffset":12720,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12763,"endOffset":12893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12937,"endOffset":13055,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13104,"endOffset":13207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13304,"endOffset":13434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13478,"endOffset":13596,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13645,"endOffset":13748,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_commit","ranges":[{"startOffset":13776,"endOffset":17914,"count":0}],"isBlockCoverage":false},{"functionName":"branch_name_to_internal","ranges":[{"startOffset":17917,"endOffset":18462,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":18465,"endOffset":19798,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":19801,"endOffset":19880,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":19890,"endOffset":21310,"count":0}],"isBlockCoverage":false},{"functionName":"get_comment_default","ranges":[{"startOffset":21313,"endOffset":21928,"count":0}],"isBlockCoverage":false},{"functionName":"get_comment_file","ranges":[{"startOffset":21931,"endOffset":26468,"count":0}],"isBlockCoverage":false},{"functionName":"get_comment_object","ranges":[{"startOffset":26471,"endOffset":32854,"count":0}],"isBlockCoverage":false},{"functionName":"get_committer_email","ranges":[{"startOffset":32857,"endOffset":33709,"count":0}],"isBlockCoverage":false},{"functionName":"get_committer_name","ranges":[{"startOffset":33712,"endOffset":34553,"count":0}],"isBlockCoverage":false},{"functionName":"get_defaults","ranges":[{"startOffset":34556,"endOffset":35253,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":35256,"endOffset":38147,"count":0}],"isBlockCoverage":false},{"functionName":"render_stage_details","ranges":[{"startOffset":38150,"endOffset":42684,"count":0}],"isBlockCoverage":false},{"functionName":"render_stage_summary","ranges":[{"startOffset":42687,"endOffset":48571,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":48574,"endOffset":51950,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":51953,"endOffset":54709,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":54712,"endOffset":56690,"count":0}],"isBlockCoverage":false}]},{"scriptId":"889","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_data.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":30600,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":238,"endOffset":4340,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":522,"endOffset":656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":737,"endOffset":853,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":934,"endOffset":1254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1332,"endOffset":1588,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1753,"endOffset":1817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1861,"endOffset":1955,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2000,"endOffset":2042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2200,"endOffset":2332,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2430,"endOffset":2688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2730,"endOffset":2858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2954,"endOffset":3074,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3175,"endOffset":3295,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3391,"endOffset":3521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3620,"endOffset":3750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3849,"endOffset":3979,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4134,"endOffset":4233,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_data","ranges":[{"startOffset":4344,"endOffset":4806,"count":0}],"isBlockCoverage":false},{"functionName":"add_via_transport","ranges":[{"startOffset":4809,"endOffset":7591,"count":0}],"isBlockCoverage":false},{"functionName":"build_menu","ranges":[{"startOffset":7594,"endOffset":8199,"count":0}],"isBlockCoverage":false},{"functionName":"build_where","ranges":[{"startOffset":8202,"endOffset":9367,"count":0}],"isBlockCoverage":false},{"functionName":"concatenated_key_to_where","ranges":[{"startOffset":9370,"endOffset":9485,"count":0}],"isBlockCoverage":false},{"functionName":"concatenated_key_to_where","ranges":[{"startOffset":9495,"endOffset":15765,"count":4},{"startOffset":14857,"endOffset":15740,"count":12},{"startOffset":14982,"endOffset":15066,"count":0},{"startOffset":15068,"endOffset":15164,"count":0},{"startOffset":15234,"endOffset":15258,"count":0},{"startOffset":15311,"endOffset":15416,"count":8}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":14733,"endOffset":14806,"count":16}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":15768,"endOffset":16394,"count":0}],"isBlockCoverage":false},{"functionName":"event_add","ranges":[{"startOffset":16397,"endOffset":17976,"count":0}],"isBlockCoverage":false},{"functionName":"event_remove","ranges":[{"startOffset":17979,"endOffset":19364,"count":0}],"isBlockCoverage":false},{"functionName":"event_update","ranges":[{"startOffset":19367,"endOffset":20982,"count":0}],"isBlockCoverage":false},{"functionName":"render_add","ranges":[{"startOffset":20985,"endOffset":22585,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":22588,"endOffset":23230,"count":0}],"isBlockCoverage":false},{"functionName":"render_existing","ranges":[{"startOffset":23233,"endOffset":27225,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":27228,"endOffset":29365,"count":0}],"isBlockCoverage":false}]},{"scriptId":"890","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_db.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":45757,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":249,"endOffset":6548,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":533,"endOffset":1049,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1131,"endOffset":1384,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1467,"endOffset":1531,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1746,"endOffset":1866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1915,"endOffset":2527,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2684,"endOffset":3070,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3229,"endOffset":3293,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3336,"endOffset":3722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3828,"endOffset":4128,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4171,"endOffset":4557,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4666,"endOffset":4966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5009,"endOffset":5395,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5507,"endOffset":5807,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5850,"endOffset":6236,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6328,"endOffset":6468,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_db","ranges":[{"startOffset":6552,"endOffset":7284,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7287,"endOffset":7405,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":7408,"endOffset":7473,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":7483,"endOffset":8167,"count":0}],"isBlockCoverage":false},{"functionName":"do_backup_db","ranges":[{"startOffset":8170,"endOffset":8247,"count":0}],"isBlockCoverage":false},{"functionName":"do_backup_db","ranges":[{"startOffset":8257,"endOffset":11317,"count":0}],"isBlockCoverage":false},{"functionName":"do_delete_entry","ranges":[{"startOffset":11320,"endOffset":11413,"count":0}],"isBlockCoverage":false},{"functionName":"do_delete_entry","ranges":[{"startOffset":11423,"endOffset":13656,"count":0}],"isBlockCoverage":false},{"functionName":"do_restore_db","ranges":[{"startOffset":13659,"endOffset":13738,"count":0}],"isBlockCoverage":false},{"functionName":"do_restore_db","ranges":[{"startOffset":13748,"endOffset":21488,"count":0}],"isBlockCoverage":false},{"functionName":"explain_content","ranges":[{"startOffset":21495,"endOffset":25530,"count":0}],"isBlockCoverage":false},{"functionName":"explain_content_background","ranges":[{"startOffset":25537,"endOffset":29136,"count":0}],"isBlockCoverage":false},{"functionName":"explain_content_repo","ranges":[{"startOffset":29143,"endOffset":32701,"count":0}],"isBlockCoverage":false},{"functionName":"explain_content_repo_cs","ranges":[{"startOffset":32708,"endOffset":34760,"count":0}],"isBlockCoverage":false},{"functionName":"register_stylesheet","ranges":[{"startOffset":34767,"endOffset":35362,"count":0}],"isBlockCoverage":false},{"functionName":"render_table","ranges":[{"startOffset":35369,"endOffset":36926,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":36933,"endOffset":39062,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_menu_provider$get_menu","ranges":[{"startOffset":39069,"endOffset":39680,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":39687,"endOffset":41102,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_table$get_row_attrs","ranges":[{"startOffset":41109,"endOffset":41670,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_table$render_cell","ranges":[{"startOffset":41677,"endOffset":44630,"count":0}],"isBlockCoverage":false}]},{"scriptId":"891","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_db_entry.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":22344,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":261,"endOffset":6355,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":519,"endOffset":905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":991,"endOffset":1088,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1170,"endOffset":1367,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1455,"endOffset":1519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1602,"endOffset":1666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1888,"endOffset":1990,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2033,"endOffset":2153,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2258,"endOffset":2360,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2403,"endOffset":2523,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2622,"endOffset":2742,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2788,"endOffset":2920,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3022,"endOffset":3154,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3256,"endOffset":3320,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3362,"endOffset":3748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3853,"endOffset":4239,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4287,"endOffset":4415,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4513,"endOffset":4899,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4991,"endOffset":5131,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5173,"endOffset":5559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5607,"endOffset":5704,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5800,"endOffset":6186,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6234,"endOffset":6331,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_db_entry","ranges":[{"startOffset":6359,"endOffset":7148,"count":0}],"isBlockCoverage":false},{"functionName":"build_toolbar","ranges":[{"startOffset":7151,"endOffset":8117,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8120,"endOffset":9046,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":9049,"endOffset":9130,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":9140,"endOffset":10567,"count":0}],"isBlockCoverage":false},{"functionName":"dbcontent_decode","ranges":[{"startOffset":10570,"endOffset":10671,"count":0}],"isBlockCoverage":false},{"functionName":"dbcontent_decode","ranges":[{"startOffset":10681,"endOffset":12023,"count":0}],"isBlockCoverage":false},{"functionName":"do_update","ranges":[{"startOffset":12026,"endOffset":12113,"count":0}],"isBlockCoverage":false},{"functionName":"do_update","ranges":[{"startOffset":12123,"endOffset":12922,"count":0}],"isBlockCoverage":false},{"functionName":"register_stylesheet","ranges":[{"startOffset":12925,"endOffset":13516,"count":0}],"isBlockCoverage":false},{"functionName":"render_edit","ranges":[{"startOffset":13519,"endOffset":15138,"count":0}],"isBlockCoverage":false},{"functionName":"render_entry_tag","ranges":[{"startOffset":15141,"endOffset":15242,"count":0}],"isBlockCoverage":false},{"functionName":"render_entry_tag","ranges":[{"startOffset":15252,"endOffset":16221,"count":0}],"isBlockCoverage":false},{"functionName":"render_header","ranges":[{"startOffset":16224,"endOffset":17109,"count":0}],"isBlockCoverage":false},{"functionName":"render_view","ranges":[{"startOffset":17112,"endOffset":18213,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":18216,"endOffset":19577,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_page_title$get_page_title","ranges":[{"startOffset":19580,"endOffset":19955,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":19958,"endOffset":21471,"count":0}],"isBlockCoverage":false}]},{"scriptId":"892","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_debuginfo.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":34456,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":3601,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":558,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":649,"endOffset":743,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":829,"endOffset":877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":967,"endOffset":1015,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1097,"endOffset":1285,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1437,"endOffset":1569,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1672,"endOffset":1792,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1894,"endOffset":2014,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2124,"endOffset":2244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2289,"endOffset":2547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2662,"endOffset":2726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2826,"endOffset":2946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3047,"endOffset":3111,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3158,"endOffset":3200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3247,"endOffset":3289,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3381,"endOffset":3521,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_debuginfo","ranges":[{"startOffset":3605,"endOffset":4058,"count":0}],"isBlockCoverage":false},{"functionName":"build_toolbar","ranges":[{"startOffset":4061,"endOffset":4147,"count":0}],"isBlockCoverage":false},{"functionName":"build_toolbar","ranges":[{"startOffset":4157,"endOffset":4766,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4769,"endOffset":4849,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":4852,"endOffset":4924,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":4934,"endOffset":5587,"count":0}],"isBlockCoverage":false},{"functionName":"get_jump_object","ranges":[{"startOffset":5590,"endOffset":6938,"count":0}],"isBlockCoverage":false},{"functionName":"render_debug_info","ranges":[{"startOffset":6941,"endOffset":12262,"count":0}],"isBlockCoverage":false},{"functionName":"render_exit_info","ranges":[{"startOffset":12265,"endOffset":15389,"count":0}],"isBlockCoverage":false},{"functionName":"render_exit_info_methods","ranges":[{"startOffset":15392,"endOffset":19277,"count":0}],"isBlockCoverage":false},{"functionName":"render_scripts","ranges":[{"startOffset":19280,"endOffset":20043,"count":0}],"isBlockCoverage":false},{"functionName":"render_supported_object_types","ranges":[{"startOffset":20046,"endOffset":29339,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":29342,"endOffset":31712,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":31715,"endOffset":33405,"count":0}],"isBlockCoverage":false}]},{"scriptId":"893","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_diff.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":177664,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":238,"endOffset":46873,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":549,"endOffset":646,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":727,"endOffset":843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":930,"endOffset":2372,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2462,"endOffset":3689,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3774,"endOffset":3873,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3954,"endOffset":4018,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4099,"endOffset":4597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4679,"endOffset":4877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4960,"endOffset":5669,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5757,"endOffset":5961,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6050,"endOffset":6254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6404,"endOffset":6524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6567,"endOffset":7702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7804,"endOffset":7924,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7967,"endOffset":9102,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9205,"endOffset":9325,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9368,"endOffset":10503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10602,"endOffset":10722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10770,"endOffset":11628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11671,"endOffset":12806,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12912,"endOffset":13032,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13135,"endOffset":13255,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13303,"endOffset":14161,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14208,"endOffset":14272,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14317,"endOffset":14406,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14450,"endOffset":14510,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14615,"endOffset":14735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14783,"endOffset":15641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15740,"endOffset":16625,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16669,"endOffset":18081,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18126,"endOffset":19178,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19272,"endOffset":19369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19410,"endOffset":19476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19517,"endOffset":19583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19686,"endOffset":19818,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19923,"endOffset":20055,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20153,"endOffset":20273,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20316,"endOffset":21451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21562,"endOffset":21682,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21782,"endOffset":21902,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22018,"endOffset":22115,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22159,"endOffset":24138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24183,"endOffset":25235,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25335,"endOffset":25432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25476,"endOffset":26703,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26823,"endOffset":26887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26930,"endOffset":28065,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28171,"endOffset":28235,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28278,"endOffset":28342,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28452,"endOffset":28516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28563,"endOffset":28627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28725,"endOffset":28857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28957,"endOffset":29462,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29507,"endOffset":30101,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30145,"endOffset":32124,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32224,"endOffset":32356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32471,"endOffset":32591,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32634,"endOffset":33769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33881,"endOffset":34001,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34044,"endOffset":35179,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35293,"endOffset":35413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35456,"endOffset":36591,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36693,"endOffset":36790,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36897,"endOffset":37017,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37064,"endOffset":37128,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37176,"endOffset":38034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38078,"endOffset":38138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38183,"endOffset":38272,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38314,"endOffset":38378,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38420,"endOffset":38484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38580,"endOffset":38712,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38862,"endOffset":38904,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39127,"endOffset":39169,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39271,"endOffset":39368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39413,"endOffset":39477,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39593,"endOffset":41572,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41625,"endOffset":43067,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43170,"endOffset":43302,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43457,"endOffset":43556,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43599,"endOffset":44104,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":44149,"endOffset":44743,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":44787,"endOffset":46766,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_diff","ranges":[{"startOffset":46877,"endOffset":50857,"count":0}],"isBlockCoverage":false},{"functionName":"add_filter_sub_menu","ranges":[{"startOffset":50860,"endOffset":56693,"count":0}],"isBlockCoverage":false},{"functionName":"add_jump_sub_menu","ranges":[{"startOffset":56696,"endOffset":59029,"count":0}],"isBlockCoverage":false},{"functionName":"add_menu_begin","ranges":[{"startOffset":59032,"endOffset":60037,"count":0}],"isBlockCoverage":false},{"functionName":"add_menu_end","ranges":[{"startOffset":60040,"endOffset":60479,"count":0}],"isBlockCoverage":false},{"functionName":"add_view_sub_menu","ranges":[{"startOffset":60482,"endOffset":61958,"count":0}],"isBlockCoverage":false},{"functionName":"append_diff","ranges":[{"startOffset":61961,"endOffset":75263,"count":0}],"isBlockCoverage":false},{"functionName":"build_menu","ranges":[{"startOffset":75266,"endOffset":75801,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_diff","ranges":[{"startOffset":75804,"endOffset":86609,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":86612,"endOffset":91399,"count":0}],"isBlockCoverage":false},{"functionName":"get_normalized_fname_with_path","ranges":[{"startOffset":91402,"endOffset":92979,"count":0}],"isBlockCoverage":false},{"functionName":"has_diffs","ranges":[{"startOffset":92982,"endOffset":94653,"count":0}],"isBlockCoverage":false},{"functionName":"insert_nav","ranges":[{"startOffset":94656,"endOffset":94813,"count":0}],"isBlockCoverage":false},{"functionName":"is_binary","ranges":[{"startOffset":94816,"endOffset":95610,"count":0}],"isBlockCoverage":false},{"functionName":"is_file_requested","ranges":[{"startOffset":95613,"endOffset":99799,"count":0}],"isBlockCoverage":false},{"functionName":"is_refresh","ranges":[{"startOffset":99802,"endOffset":100401,"count":0}],"isBlockCoverage":false},{"functionName":"modify_files_before_diff_calc","ranges":[{"startOffset":100404,"endOffset":107251,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_filename","ranges":[{"startOffset":107254,"endOffset":107727,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_path","ranges":[{"startOffset":107730,"endOffset":108179,"count":0}],"isBlockCoverage":false},{"functionName":"refresh","ranges":[{"startOffset":108182,"endOffset":112338,"count":0}],"isBlockCoverage":false},{"functionName":"refresh_full","ranges":[{"startOffset":112341,"endOffset":112463,"count":0}],"isBlockCoverage":false},{"functionName":"refresh_local","ranges":[{"startOffset":112466,"endOffset":112547,"count":0}],"isBlockCoverage":false},{"functionName":"refresh_local_object","ranges":[{"startOffset":112550,"endOffset":113517,"count":0}],"isBlockCoverage":false},{"functionName":"render_beacon","ranges":[{"startOffset":113520,"endOffset":117866,"count":0}],"isBlockCoverage":false},{"functionName":"render_beacon_begin_of_row","ranges":[{"startOffset":117869,"endOffset":119418,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":119421,"endOffset":122672,"count":0}],"isBlockCoverage":false},{"functionName":"render_diff","ranges":[{"startOffset":122675,"endOffset":125995,"count":0}],"isBlockCoverage":false},{"functionName":"render_diff_head","ranges":[{"startOffset":125998,"endOffset":131829,"count":0}],"isBlockCoverage":false},{"functionName":"render_diff_head_after_state","ranges":[{"startOffset":131832,"endOffset":134635,"count":0}],"isBlockCoverage":false},{"functionName":"render_lines","ranges":[{"startOffset":134638,"endOffset":142329,"count":0}],"isBlockCoverage":false},{"functionName":"render_line_no_diffs","ranges":[{"startOffset":142332,"endOffset":144103,"count":0}],"isBlockCoverage":false},{"functionName":"render_line_split","ranges":[{"startOffset":144106,"endOffset":148828,"count":0}],"isBlockCoverage":false},{"functionName":"render_line_split_row","ranges":[{"startOffset":148831,"endOffset":151070,"count":0}],"isBlockCoverage":false},{"functionName":"render_line_unified","ranges":[{"startOffset":151073,"endOffset":157590,"count":0}],"isBlockCoverage":false},{"functionName":"render_scripts","ranges":[{"startOffset":157593,"endOffset":159865,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_head","ranges":[{"startOffset":159868,"endOffset":161986,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_head_non_unified","ranges":[{"startOffset":161989,"endOffset":164115,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_head_unified","ranges":[{"startOffset":164118,"endOffset":164815,"count":0}],"isBlockCoverage":false},{"functionName":"set_layout","ranges":[{"startOffset":164818,"endOffset":165133,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":165136,"endOffset":168543,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":168546,"endOffset":171581,"count":0}],"isBlockCoverage":false}]},{"scriptId":"894","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_ex_object.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11953,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":2616,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":925,"endOffset":1053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1139,"endOffset":1277,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1355,"endOffset":1620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1701,"endOffset":1966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2120,"endOffset":2246,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2396,"endOffset":2536,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_ex_object","ranges":[{"startOffset":2620,"endOffset":3390,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3393,"endOffset":3970,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3973,"endOffset":4045,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":4055,"endOffset":4677,"count":0}],"isBlockCoverage":false},{"functionName":"export_object","ranges":[{"startOffset":4680,"endOffset":6314,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":6317,"endOffset":7825,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":7828,"endOffset":10035,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":10038,"endOffset":10738,"count":0}],"isBlockCoverage":false}]},{"scriptId":"895","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_ex_pckage.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11854,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":2623,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":925,"endOffset":1053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1139,"endOffset":1277,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1355,"endOffset":1622,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1703,"endOffset":1972,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2126,"endOffset":2252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2403,"endOffset":2543,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_ex_pckage","ranges":[{"startOffset":2627,"endOffset":3397,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3400,"endOffset":3843,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3846,"endOffset":3918,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3928,"endOffset":4548,"count":0}],"isBlockCoverage":false},{"functionName":"export_package","ranges":[{"startOffset":4551,"endOffset":5403,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":5406,"endOffset":7587,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":7590,"endOffset":10139,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":10142,"endOffset":10617,"count":0}],"isBlockCoverage":false}]},{"scriptId":"896","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_hoc.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13426,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":236,"endOffset":4686,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":518,"endOffset":658,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":813,"endOffset":910,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1015,"endOffset":1161,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1267,"endOffset":1407,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1563,"endOffset":1703,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1757,"endOffset":1897,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1946,"endOffset":2010,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2060,"endOffset":2124,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2172,"endOffset":2304,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2361,"endOffset":2507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2565,"endOffset":2705,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2757,"endOffset":2821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2872,"endOffset":2936,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2988,"endOffset":3085,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3181,"endOffset":3321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3429,"endOffset":3569,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3615,"endOffset":4662,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_hoc","ranges":[{"startOffset":4690,"endOffset":4934,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4937,"endOffset":6984,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":6987,"endOffset":7063,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":7073,"endOffset":11220,"count":0}],"isBlockCoverage":false},{"functionName":"detect_menu_provider","ranges":[{"startOffset":11223,"endOffset":11663,"count":0}],"isBlockCoverage":false},{"functionName":"detect_modal","ranges":[{"startOffset":11666,"endOffset":12276,"count":0}],"isBlockCoverage":false},{"functionName":"detect_title_provider","ranges":[{"startOffset":12279,"endOffset":12714,"count":0}],"isBlockCoverage":false},{"functionName":"get_child","ranges":[{"startOffset":12717,"endOffset":12939,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":12942,"endOffset":13261,"count":0}],"isBlockCoverage":false}]},{"scriptId":"897","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_merge.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":26858,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":240,"endOffset":4230,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":523,"endOffset":653,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":735,"endOffset":857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":940,"endOffset":1138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1290,"endOffset":2007,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2050,"endOffset":2170,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2213,"endOffset":2705,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2750,"endOffset":3242,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3338,"endOffset":3470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3522,"endOffset":3619,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3775,"endOffset":3905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3950,"endOffset":4014,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4059,"endOffset":4123,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_merge","ranges":[{"startOffset":4234,"endOffset":4654,"count":0}],"isBlockCoverage":false},{"functionName":"build_menu","ranges":[{"startOffset":4657,"endOffset":5538,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5541,"endOffset":6828,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":6831,"endOffset":19789,"count":0}],"isBlockCoverage":false},{"functionName":"show_file","ranges":[{"startOffset":19792,"endOffset":23794,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":23797,"endOffset":26320,"count":0}],"isBlockCoverage":false}]},{"scriptId":"898","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_merge_res.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":58373,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":248,"endOffset":12977,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":536,"endOffset":658,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":745,"endOffset":881,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":962,"endOffset":1092,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1178,"endOffset":2059,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2158,"endOffset":2218,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2305,"endOffset":2369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2455,"endOffset":3604,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3687,"endOffset":4081,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4167,"endOffset":4361,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4521,"endOffset":4651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4747,"endOffset":4879,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4973,"endOffset":5070,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5111,"endOffset":5177,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5218,"endOffset":5284,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5383,"endOffset":5503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5551,"endOffset":6409,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6452,"endOffset":7333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7430,"endOffset":7550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7593,"endOffset":8474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8576,"endOffset":8696,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8739,"endOffset":9620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9718,"endOffset":9838,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9881,"endOffset":10762,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10865,"endOffset":10985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11033,"endOffset":11891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11994,"endOffset":12114,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12389,"endOffset":12519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12568,"endOffset":12704,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12748,"endOffset":12870,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_merge_res","ranges":[{"startOffset":12981,"endOffset":15829,"count":0}],"isBlockCoverage":false},{"functionName":"apply_merged_content","ranges":[{"startOffset":15832,"endOffset":18074,"count":0}],"isBlockCoverage":false},{"functionName":"build_menu","ranges":[{"startOffset":18077,"endOffset":18652,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":18655,"endOffset":19868,"count":0}],"isBlockCoverage":false},{"functionName":"is_binary","ranges":[{"startOffset":19871,"endOffset":20665,"count":0}],"isBlockCoverage":false},{"functionName":"render_beacon","ranges":[{"startOffset":20668,"endOffset":24268,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":24271,"endOffset":25158,"count":0}],"isBlockCoverage":false},{"functionName":"render_diff","ranges":[{"startOffset":25161,"endOffset":33528,"count":0}],"isBlockCoverage":false},{"functionName":"render_diff_head","ranges":[{"startOffset":33531,"endOffset":36291,"count":0}],"isBlockCoverage":false},{"functionName":"render_lines","ranges":[{"startOffset":36294,"endOffset":41454,"count":0}],"isBlockCoverage":false},{"functionName":"render_line_split","ranges":[{"startOffset":41457,"endOffset":45104,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_head","ranges":[{"startOffset":45107,"endOffset":48779,"count":0}],"isBlockCoverage":false},{"functionName":"resolve_diff","ranges":[{"startOffset":48782,"endOffset":51545,"count":0}],"isBlockCoverage":false},{"functionName":"toggle_merge_mode","ranges":[{"startOffset":51548,"endOffset":51884,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":51887,"endOffset":56085,"count":0}],"isBlockCoverage":false}]},{"scriptId":"899","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_merge_sel.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14314,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":3794,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":920,"endOffset":1058,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1139,"endOffset":1269,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1354,"endOffset":2276,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2354,"endOffset":2608,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2689,"endOffset":2820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3032,"endOffset":3158,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3250,"endOffset":3390,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3433,"endOffset":3553,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3650,"endOffset":3770,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_merge_sel","ranges":[{"startOffset":3798,"endOffset":5491,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5494,"endOffset":6109,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":6112,"endOffset":6194,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":6204,"endOffset":7026,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":7029,"endOffset":9792,"count":0}],"isBlockCoverage":false},{"functionName":"read_branches","ranges":[{"startOffset":9795,"endOffset":10389,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":10392,"endOffset":12548,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":12551,"endOffset":13428,"count":0}],"isBlockCoverage":false}]},{"scriptId":"900","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_patch.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":74198,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":255,"endOffset":16492,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":682,"endOffset":800,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":890,"endOffset":950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1033,"endOffset":1130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1218,"endOffset":1348,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1437,"endOffset":1568,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1656,"endOffset":1919,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2070,"endOffset":2190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2237,"endOffset":2301,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2349,"endOffset":3207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3251,"endOffset":3311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3414,"endOffset":3534,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3577,"endOffset":4712,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4812,"endOffset":4942,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5057,"endOffset":5187,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5302,"endOffset":6744,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6903,"endOffset":6967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7016,"endOffset":7113,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7237,"endOffset":7334,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7377,"endOffset":8604,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8709,"endOffset":8773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8822,"endOffset":8886,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8935,"endOffset":9032,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9133,"endOffset":9249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9296,"endOffset":9360,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9459,"endOffset":10317,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10360,"endOffset":10476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10525,"endOffset":10589,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10715,"endOffset":10812,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10860,"endOffset":11718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11818,"endOffset":11938,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12600,"endOffset":12699,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12742,"endOffset":13247,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13292,"endOffset":13886,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13930,"endOffset":15909,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16180,"endOffset":16244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16291,"endOffset":16355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16404,"endOffset":16468,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_patch","ranges":[{"startOffset":16496,"endOffset":17178,"count":0}],"isBlockCoverage":false},{"functionName":"add_menu_begin","ranges":[{"startOffset":17181,"endOffset":18188,"count":0}],"isBlockCoverage":false},{"functionName":"add_menu_end","ranges":[{"startOffset":18191,"endOffset":18753,"count":0}],"isBlockCoverage":false},{"functionName":"add_to_stage","ranges":[{"startOffset":18756,"endOffset":24906,"count":0}],"isBlockCoverage":false},{"functionName":"apply_patch_all","ranges":[{"startOffset":24909,"endOffset":26229,"count":0}],"isBlockCoverage":false},{"functionName":"apply_patch_for","ranges":[{"startOffset":26232,"endOffset":28684,"count":0}],"isBlockCoverage":false},{"functionName":"apply_patch_from_form_fields","ranges":[{"startOffset":28687,"endOffset":29573,"count":0}],"isBlockCoverage":false},{"functionName":"are_all_lines_patched","ranges":[{"startOffset":29576,"endOffset":32492,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":32495,"endOffset":36745,"count":0}],"isBlockCoverage":false},{"functionName":"get_diff_line","ranges":[{"startOffset":36748,"endOffset":39723,"count":0}],"isBlockCoverage":false},{"functionName":"get_diff_object","ranges":[{"startOffset":39726,"endOffset":41743,"count":0}],"isBlockCoverage":false},{"functionName":"get_patch_data","ranges":[{"startOffset":41746,"endOffset":41840,"count":0}],"isBlockCoverage":false},{"functionName":"get_patch_data","ranges":[{"startOffset":41850,"endOffset":42900,"count":4},{"startOffset":42775,"endOffset":42896,"count":2},{"startOffset":42890,"endOffset":42896,"count":0}],"isBlockCoverage":true},{"functionName":"insert_nav","ranges":[{"startOffset":42903,"endOffset":43107,"count":0}],"isBlockCoverage":false},{"functionName":"is_patch_line_possible","ranges":[{"startOffset":43110,"endOffset":43220,"count":0}],"isBlockCoverage":false},{"functionName":"is_patch_line_possible","ranges":[{"startOffset":43230,"endOffset":44840,"count":4},{"startOffset":44467,"endOffset":44597,"count":3},{"startOffset":44598,"endOffset":44728,"count":2},{"startOffset":44730,"endOffset":44798,"count":3}],"isBlockCoverage":true},{"functionName":"refresh","ranges":[{"startOffset":44843,"endOffset":46610,"count":0}],"isBlockCoverage":false},{"functionName":"render_beacon_begin_of_row","ranges":[{"startOffset":46613,"endOffset":48612,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":48615,"endOffset":49191,"count":0}],"isBlockCoverage":false},{"functionName":"render_diff_head_after_state","ranges":[{"startOffset":49194,"endOffset":51766,"count":0}],"isBlockCoverage":false},{"functionName":"render_line_split_row","ranges":[{"startOffset":51769,"endOffset":53940,"count":0}],"isBlockCoverage":false},{"functionName":"render_patch","ranges":[{"startOffset":53943,"endOffset":57050,"count":0}],"isBlockCoverage":false},{"functionName":"render_patch_head","ranges":[{"startOffset":57053,"endOffset":58884,"count":0}],"isBlockCoverage":false},{"functionName":"render_scripts","ranges":[{"startOffset":58887,"endOffset":59556,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_head_non_unified","ranges":[{"startOffset":59559,"endOffset":61151,"count":0}],"isBlockCoverage":false},{"functionName":"restore_patch_flags","ranges":[{"startOffset":61154,"endOffset":68618,"count":0}],"isBlockCoverage":false},{"functionName":"start_staging","ranges":[{"startOffset":68621,"endOffset":68951,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":68954,"endOffset":70600,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":70603,"endOffset":73229,"count":0}],"isBlockCoverage":false}]},{"scriptId":"901","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_repo_over.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":112954,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":329,"endOffset":24673,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":624,"endOffset":882,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":971,"endOffset":1099,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1189,"endOffset":1806,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1888,"endOffset":2152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2247,"endOffset":2311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2403,"endOffset":2467,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2622,"endOffset":2686,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2803,"endOffset":2900,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3000,"endOffset":3321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3423,"endOffset":5434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5549,"endOffset":7560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7612,"endOffset":7948,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8050,"endOffset":8170,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8217,"endOffset":10228,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10333,"endOffset":10453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10558,"endOffset":10678,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10781,"endOffset":10901,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10949,"endOffset":12960,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13063,"endOffset":13183,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13226,"endOffset":15011,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15114,"endOffset":15234,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15344,"endOffset":15464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15568,"endOffset":17579,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17687,"endOffset":19698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19798,"endOffset":19918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20025,"endOffset":20145,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20248,"endOffset":20368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20478,"endOffset":21412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21516,"endOffset":21774,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21821,"endOffset":23832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23941,"endOffset":24005,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24155,"endOffset":24295,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24348,"endOffset":24445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24552,"endOffset":24649,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_repo_over","ranges":[{"startOffset":24677,"endOffset":26045,"count":0}],"isBlockCoverage":false},{"functionName":"apply_filter","ranges":[{"startOffset":26048,"endOffset":32543,"count":0}],"isBlockCoverage":false},{"functionName":"apply_order_by","ranges":[{"startOffset":32546,"endOffset":36437,"count":0}],"isBlockCoverage":false},{"functionName":"build_table_scheme","ranges":[{"startOffset":36440,"endOffset":40780,"count":0}],"isBlockCoverage":false},{"functionName":"collect_all_labels","ranges":[{"startOffset":40783,"endOffset":45435,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":45438,"endOffset":46034,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":46037,"endOffset":46119,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":46129,"endOffset":47026,"count":0}],"isBlockCoverage":false},{"functionName":"map_repo_list_to_overview","ranges":[{"startOffset":47029,"endOffset":53884,"count":0}],"isBlockCoverage":false},{"functionName":"prepare_overviews","ranges":[{"startOffset":53887,"endOffset":57006,"count":0}],"isBlockCoverage":false},{"functionName":"render_action_toolbar","ranges":[{"startOffset":57009,"endOffset":65084,"count":0}],"isBlockCoverage":false},{"functionName":"render_filter_bar","ranges":[{"startOffset":65087,"endOffset":67590,"count":0}],"isBlockCoverage":false},{"functionName":"render_filter_help_hint","ranges":[{"startOffset":67593,"endOffset":69066,"count":0}],"isBlockCoverage":false},{"functionName":"render_header_bar","ranges":[{"startOffset":69069,"endOffset":69702,"count":0}],"isBlockCoverage":false},{"functionName":"render_header_label_list","ranges":[{"startOffset":69705,"endOffset":70633,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_list","ranges":[{"startOffset":70636,"endOffset":73340,"count":0}],"isBlockCoverage":false},{"functionName":"render_scripts","ranges":[{"startOffset":73343,"endOffset":73942,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_body","ranges":[{"startOffset":73945,"endOffset":78479,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_footer","ranges":[{"startOffset":78482,"endOffset":79695,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_header","ranges":[{"startOffset":79698,"endOffset":80624,"count":0}],"isBlockCoverage":false},{"functionName":"render_table_item","ranges":[{"startOffset":80627,"endOffset":88474,"count":0}],"isBlockCoverage":false},{"functionName":"save_settings","ranges":[{"startOffset":88477,"endOffset":88675,"count":0}],"isBlockCoverage":false},{"functionName":"set_filter","ranges":[{"startOffset":88678,"endOffset":89769,"count":0}],"isBlockCoverage":false},{"functionName":"set_order_by","ranges":[{"startOffset":89772,"endOffset":90210,"count":0}],"isBlockCoverage":false},{"functionName":"set_order_direction","ranges":[{"startOffset":90213,"endOffset":90569,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":90572,"endOffset":95321,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":95324,"endOffset":101316,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_menu_provider$get_menu","ranges":[{"startOffset":101319,"endOffset":103208,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":103211,"endOffset":108048,"count":0}],"isBlockCoverage":false}]},{"scriptId":"902","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_repo_over.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5957,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":2372,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":423,"endOffset":1357,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1504,"endOffset":1663,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1711,"endOffset":1775,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1826,"endOffset":1890,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1938,"endOffset":2002,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2047,"endOffset":2144,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2188,"endOffset":2252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2305,"endOffset":2348,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_table_scheme","ranges":[{"startOffset":2376,"endOffset":3404,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3407,"endOffset":3520,"count":0}],"isBlockCoverage":false},{"functionName":"add_column","ranges":[{"startOffset":3523,"endOffset":5767,"count":0}],"isBlockCoverage":false}]},{"scriptId":"903","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_repo_view.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":153086,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":32801,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":552,"endOffset":668,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":766,"endOffset":894,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":978,"endOffset":1042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1129,"endOffset":1226,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1312,"endOffset":1372,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1460,"endOffset":1520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1609,"endOffset":1706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1795,"endOffset":1892,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1977,"endOffset":2041,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2134,"endOffset":2231,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2318,"endOffset":2415,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2495,"endOffset":2594,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2697,"endOffset":2794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2877,"endOffset":3479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3634,"endOffset":3754,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3862,"endOffset":3994,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4091,"endOffset":4211,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4254,"endOffset":6326,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6382,"endOffset":6479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6582,"endOffset":6702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6745,"endOffset":8817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8922,"endOffset":9042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9085,"endOffset":11157,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11262,"endOffset":11382,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11425,"endOffset":12026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12126,"endOffset":12190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12233,"endOffset":14305,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14357,"endOffset":14454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14561,"endOffset":14681,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14724,"endOffset":16796,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16899,"endOffset":17019,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17124,"endOffset":17188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17231,"endOffset":17295,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17421,"endOffset":17485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17528,"endOffset":19600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19721,"endOffset":19785,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19828,"endOffset":21900,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22010,"endOffset":22074,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22117,"endOffset":24189,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24356,"endOffset":24476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24582,"endOffset":26876,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26994,"endOffset":27126,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27238,"endOffset":27370,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27492,"endOffset":27624,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27731,"endOffset":27863,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27963,"endOffset":28083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28211,"endOffset":28308,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28416,"endOffset":28536,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28579,"endOffset":30651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30749,"endOffset":31572,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31674,"endOffset":31721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31773,"endOffset":31865,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31913,"endOffset":32010,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32055,"endOffset":32152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32301,"endOffset":32441,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32483,"endOffset":32582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32678,"endOffset":32777,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_repo_view","ranges":[{"startOffset":32805,"endOffset":34301,"count":0}],"isBlockCoverage":false},{"functionName":"apply_order_by","ranges":[{"startOffset":34304,"endOffset":48845,"count":0}],"isBlockCoverage":false},{"functionName":"build_advanced_dropdown","ranges":[{"startOffset":48848,"endOffset":55145,"count":0}],"isBlockCoverage":false},{"functionName":"build_branch_dropdown","ranges":[{"startOffset":55148,"endOffset":56814,"count":0}],"isBlockCoverage":false},{"functionName":"build_dir_jump_link","ranges":[{"startOffset":56817,"endOffset":58491,"count":0}],"isBlockCoverage":false},{"functionName":"build_inactive_object_code","ranges":[{"startOffset":58494,"endOffset":61149,"count":0}],"isBlockCoverage":false},{"functionName":"build_main_toolbar","ranges":[{"startOffset":61152,"endOffset":68003,"count":0}],"isBlockCoverage":false},{"functionName":"build_origlang_code","ranges":[{"startOffset":68006,"endOffset":70804,"count":0}],"isBlockCoverage":false},{"functionName":"build_srcsystem_code","ranges":[{"startOffset":70807,"endOffset":73567,"count":0}],"isBlockCoverage":false},{"functionName":"build_tag_dropdown","ranges":[{"startOffset":73570,"endOffset":74903,"count":0}],"isBlockCoverage":false},{"functionName":"build_view_dropdown","ranges":[{"startOffset":74906,"endOffset":76021,"count":0}],"isBlockCoverage":false},{"functionName":"check_branch","ranges":[{"startOffset":76024,"endOffset":76437,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":76440,"endOffset":78786,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":78789,"endOffset":78871,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":78881,"endOffset":79709,"count":0}],"isBlockCoverage":false},{"functionName":"get_crossout","ranges":[{"startOffset":79712,"endOffset":81349,"count":0}],"isBlockCoverage":false},{"functionName":"get_item_class","ranges":[{"startOffset":81352,"endOffset":85291,"count":0}],"isBlockCoverage":false},{"functionName":"is_repo_lang_logon_lang","ranges":[{"startOffset":85294,"endOffset":85689,"count":0}],"isBlockCoverage":false},{"functionName":"open_in_main_language","ranges":[{"startOffset":85692,"endOffset":87562,"count":0}],"isBlockCoverage":false},{"functionName":"order_files","ranges":[{"startOffset":87565,"endOffset":89825,"count":0}],"isBlockCoverage":false},{"functionName":"render_file_command","ranges":[{"startOffset":89828,"endOffset":91900,"count":0}],"isBlockCoverage":false},{"functionName":"render_head_line","ranges":[{"startOffset":91903,"endOffset":96154,"count":0}],"isBlockCoverage":false},{"functionName":"render_item","ranges":[{"startOffset":96157,"endOffset":101960,"count":0}],"isBlockCoverage":false},{"functionName":"render_item_changed_by","ranges":[{"startOffset":101963,"endOffset":104790,"count":0}],"isBlockCoverage":false},{"functionName":"render_item_command","ranges":[{"startOffset":104793,"endOffset":109086,"count":0}],"isBlockCoverage":false},{"functionName":"render_item_files","ranges":[{"startOffset":109089,"endOffset":114756,"count":0}],"isBlockCoverage":false},{"functionName":"render_item_transport","ranges":[{"startOffset":114759,"endOffset":117546,"count":0}],"isBlockCoverage":false},{"functionName":"render_order_by","ranges":[{"startOffset":117549,"endOffset":122121,"count":0}],"isBlockCoverage":false},{"functionName":"render_parent_dir","ranges":[{"startOffset":122124,"endOffset":123285,"count":0}],"isBlockCoverage":false},{"functionName":"render_scripts","ranges":[{"startOffset":123288,"endOffset":123959,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":123962,"endOffset":130682,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":130685,"endOffset":136506,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_menu_provider$get_menu","ranges":[{"startOffset":136509,"endOffset":137790,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":137793,"endOffset":151613,"count":0}],"isBlockCoverage":false}]},{"scriptId":"904","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_run_bckg.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5430,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":261,"endOffset":1147,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":491,"endOffset":734,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":927,"endOffset":1067,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_run_bckg","ranges":[{"startOffset":1151,"endOffset":1497,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1500,"endOffset":1580,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1583,"endOffset":1654,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1664,"endOffset":2354,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":2357,"endOffset":3583,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":3586,"endOffset":4323,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":4326,"endOffset":5245,"count":0}],"isBlockCoverage":false}]},{"scriptId":"905","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_runit.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":27145,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":255,"endOffset":2148,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":514,"endOffset":630,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":714,"endOffset":778,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":929,"endOffset":1339,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1430,"endOffset":1520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1612,"endOffset":1752,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1795,"endOffset":1911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2008,"endOffset":2124,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_runit","ranges":[{"startOffset":2152,"endOffset":2443,"count":0}],"isBlockCoverage":false},{"functionName":"build_tadir","ranges":[{"startOffset":2446,"endOffset":5064,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5067,"endOffset":6525,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":6528,"endOffset":6606,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":6616,"endOffset":8043,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":8046,"endOffset":12094,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":12097,"endOffset":13005,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_menu_provider$get_menu","ranges":[{"startOffset":13008,"endOffset":13308,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":13311,"endOffset":26316,"count":0}],"isBlockCoverage":false}]},{"scriptId":"906","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_bckg.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":25774,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":4361,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":915,"endOffset":1031,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1122,"endOffset":1182,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1260,"endOffset":1781,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1862,"endOffset":2053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2207,"endOffset":2333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2437,"endOffset":2565,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2666,"endOffset":3675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3825,"endOffset":3965,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4008,"endOffset":4124,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4221,"endOffset":4337,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_sett_bckg","ranges":[{"startOffset":4365,"endOffset":5040,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5043,"endOffset":5543,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5546,"endOffset":5628,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5638,"endOffset":6708,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":6711,"endOffset":10721,"count":0}],"isBlockCoverage":false},{"functionName":"read_persist","ranges":[{"startOffset":10724,"endOffset":12373,"count":0}],"isBlockCoverage":false},{"functionName":"read_settings","ranges":[{"startOffset":12376,"endOffset":17374,"count":0}],"isBlockCoverage":false},{"functionName":"save_settings","ranges":[{"startOffset":17377,"endOffset":21704,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":21707,"endOffset":23247,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":23250,"endOffset":24184,"count":0}],"isBlockCoverage":false}]},{"scriptId":"907","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_glob.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":27731,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":4437,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":925,"endOffset":1053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1138,"endOffset":1262,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1340,"endOffset":2396,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2477,"endOffset":2673,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2835,"endOffset":2963,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3011,"endOffset":3139,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3240,"endOffset":3366,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3470,"endOffset":3598,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3764,"endOffset":3892,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3939,"endOffset":4063,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4217,"endOffset":4357,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_sett_glob","ranges":[{"startOffset":4441,"endOffset":5196,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5199,"endOffset":5587,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5590,"endOffset":5662,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5672,"endOffset":6470,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":6473,"endOffset":10851,"count":0}],"isBlockCoverage":false},{"functionName":"read_proxy_bypass","ranges":[{"startOffset":10854,"endOffset":10958,"count":0}],"isBlockCoverage":false},{"functionName":"read_proxy_bypass","ranges":[{"startOffset":10968,"endOffset":12953,"count":0}],"isBlockCoverage":false},{"functionName":"read_settings","ranges":[{"startOffset":12956,"endOffset":15549,"count":0}],"isBlockCoverage":false},{"functionName":"save_proxy_bypass","ranges":[{"startOffset":15552,"endOffset":17759,"count":0}],"isBlockCoverage":false},{"functionName":"save_settings","ranges":[{"startOffset":17762,"endOffset":20558,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":20561,"endOffset":22458,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":22461,"endOffset":24210,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":24213,"endOffset":24913,"count":0}],"isBlockCoverage":false}]},{"scriptId":"908","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_info.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":68425,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":14011,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":915,"endOffset":1031,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1113,"endOffset":1711,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1789,"endOffset":2309,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2390,"endOffset":2520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2674,"endOffset":2800,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3016,"endOffset":4428,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4473,"endOffset":5358,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5532,"endOffset":6944,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6989,"endOffset":7874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7924,"endOffset":8736,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8787,"endOffset":9599,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9700,"endOffset":10171,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10214,"endOffset":10719,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10830,"endOffset":11642,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11693,"endOffset":12505,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12602,"endOffset":12666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12713,"endOffset":12807,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12914,"endOffset":12978,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13026,"endOffset":13119,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13216,"endOffset":13280,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13323,"endOffset":13383,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13475,"endOffset":13615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13658,"endOffset":13774,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13871,"endOffset":13987,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_sett_info","ranges":[{"startOffset":14015,"endOffset":15219,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":15222,"endOffset":15665,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":15668,"endOffset":15750,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":15760,"endOffset":16826,"count":0}],"isBlockCoverage":false},{"functionName":"format_size","ranges":[{"startOffset":16829,"endOffset":18365,"count":0}],"isBlockCoverage":false},{"functionName":"format_timestamp","ranges":[{"startOffset":18368,"endOffset":19125,"count":0}],"isBlockCoverage":false},{"functionName":"format_user","ranges":[{"startOffset":19128,"endOffset":20048,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":20051,"endOffset":22457,"count":0}],"isBlockCoverage":false},{"functionName":"read_settings","ranges":[{"startOffset":22460,"endOffset":30678,"count":0}],"isBlockCoverage":false},{"functionName":"read_stats","ranges":[{"startOffset":30681,"endOffset":35070,"count":0}],"isBlockCoverage":false},{"functionName":"read_stats_file","ranges":[{"startOffset":35073,"endOffset":37882,"count":0}],"isBlockCoverage":false},{"functionName":"read_stats_files","ranges":[{"startOffset":37885,"endOffset":42781,"count":0}],"isBlockCoverage":false},{"functionName":"read_stats_objects","ranges":[{"startOffset":42784,"endOffset":47594,"count":0}],"isBlockCoverage":false},{"functionName":"read_stats_size_lines_sloc","ranges":[{"startOffset":47597,"endOffset":59230,"count":0}],"isBlockCoverage":false},{"functionName":"read_stats_state","ranges":[{"startOffset":59233,"endOffset":64197,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":64200,"endOffset":65120,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":65123,"endOffset":66031,"count":0}],"isBlockCoverage":false}]},{"scriptId":"909","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_locl.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":39162,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":6486,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":504,"endOffset":636,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":717,"endOffset":843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":929,"endOffset":1057,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1148,"endOffset":1276,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1357,"endOffset":1473,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1558,"endOffset":2713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2791,"endOffset":3685,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3766,"endOffset":4195,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4357,"endOffset":4485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4533,"endOffset":4661,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4762,"endOffset":4888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4992,"endOffset":5120,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5347,"endOffset":5444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5695,"endOffset":5792,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5950,"endOffset":6090,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6133,"endOffset":6249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6346,"endOffset":6462,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_sett_locl","ranges":[{"startOffset":6490,"endOffset":8544,"count":0}],"isBlockCoverage":false},{"functionName":"choose_check_variant","ranges":[{"startOffset":8547,"endOffset":10174,"count":0}],"isBlockCoverage":false},{"functionName":"choose_customizing_request","ranges":[{"startOffset":10177,"endOffset":11308,"count":0}],"isBlockCoverage":false},{"functionName":"choose_labels","ranges":[{"startOffset":11311,"endOffset":11896,"count":0}],"isBlockCoverage":false},{"functionName":"choose_transport_request","ranges":[{"startOffset":11899,"endOffset":12408,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":12411,"endOffset":13012,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":13015,"endOffset":13097,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":13107,"endOffset":14189,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":14192,"endOffset":19271,"count":0}],"isBlockCoverage":false},{"functionName":"handle_picklist_state","ranges":[{"startOffset":19274,"endOffset":20098,"count":0}],"isBlockCoverage":false},{"functionName":"is_customizing_included","ranges":[{"startOffset":20101,"endOffset":22422,"count":0}],"isBlockCoverage":false},{"functionName":"read_settings","ranges":[{"startOffset":22425,"endOffset":25233,"count":0}],"isBlockCoverage":false},{"functionName":"save_settings","ranges":[{"startOffset":25236,"endOffset":27226,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":27229,"endOffset":31553,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":31556,"endOffset":34790,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":34793,"endOffset":36178,"count":0}],"isBlockCoverage":false}]},{"scriptId":"910","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_pers.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":30664,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":5560,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":925,"endOffset":1053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1138,"endOffset":1262,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1347,"endOffset":2666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2744,"endOffset":3876,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3957,"endOffset":4087,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4249,"endOffset":4377,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4425,"endOffset":4553,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4654,"endOffset":4780,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4884,"endOffset":5012,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5184,"endOffset":5248,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5340,"endOffset":5480,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_sett_pers","ranges":[{"startOffset":5564,"endOffset":7647,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7650,"endOffset":8038,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":8041,"endOffset":8113,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":8123,"endOffset":8932,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":8935,"endOffset":14175,"count":0}],"isBlockCoverage":false},{"functionName":"read_settings","ranges":[{"startOffset":14178,"endOffset":16658,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_labels_help_hint","ranges":[{"startOffset":16661,"endOffset":21836,"count":0}],"isBlockCoverage":false},{"functionName":"save_settings","ranges":[{"startOffset":21839,"endOffset":24154,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":24157,"endOffset":25420,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":25423,"endOffset":27172,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":27175,"endOffset":27875,"count":0}],"isBlockCoverage":false}]},{"scriptId":"911","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_remo.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":77083,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":11580,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":520,"endOffset":636,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":730,"endOffset":1670,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1751,"endOffset":1877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1963,"endOffset":2091,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2182,"endOffset":2310,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2402,"endOffset":2499,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2600,"endOffset":2664,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2755,"endOffset":2887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2973,"endOffset":3468,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3546,"endOffset":4230,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4311,"endOffset":4906,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4987,"endOffset":5125,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5297,"endOffset":6237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6280,"endOffset":6396,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6515,"endOffset":7455,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7503,"endOffset":7631,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7732,"endOffset":7858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7915,"endOffset":8043,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8154,"endOffset":8282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8452,"endOffset":8580,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8628,"endOffset":8756,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8909,"endOffset":8973,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9077,"endOffset":9174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9275,"endOffset":9372,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9472,"endOffset":9569,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9670,"endOffset":9772,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9944,"endOffset":10008,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10112,"endOffset":10209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10254,"endOffset":10356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10462,"endOffset":10559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10602,"endOffset":10666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10832,"endOffset":10952,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11044,"endOffset":11184,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11227,"endOffset":11343,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11440,"endOffset":11556,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_sett_remo","ranges":[{"startOffset":11584,"endOffset":13762,"count":0}],"isBlockCoverage":false},{"functionName":"check_protection","ranges":[{"startOffset":13765,"endOffset":14365,"count":0}],"isBlockCoverage":false},{"functionName":"choose_branch","ranges":[{"startOffset":14368,"endOffset":16967,"count":0}],"isBlockCoverage":false},{"functionName":"choose_commit","ranges":[{"startOffset":16970,"endOffset":18207,"count":0}],"isBlockCoverage":false},{"functionName":"choose_pr","ranges":[{"startOffset":18210,"endOffset":21250,"count":0}],"isBlockCoverage":false},{"functionName":"choose_tag","ranges":[{"startOffset":21253,"endOffset":23841,"count":0}],"isBlockCoverage":false},{"functionName":"choose_url","ranges":[{"startOffset":23844,"endOffset":24007,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":24010,"endOffset":24626,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":24629,"endOffset":24711,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":24721,"endOffset":25796,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":25799,"endOffset":32413,"count":0}],"isBlockCoverage":false},{"functionName":"get_remote_settings_from_form","ranges":[{"startOffset":32416,"endOffset":35628,"count":0}],"isBlockCoverage":false},{"functionName":"get_remote_settings_from_repo","ranges":[{"startOffset":35631,"endOffset":40357,"count":0}],"isBlockCoverage":false},{"functionName":"handle_picklist_state","ranges":[{"startOffset":40360,"endOffset":41528,"count":0}],"isBlockCoverage":false},{"functionName":"initialize_form_data","ranges":[{"startOffset":41531,"endOffset":43671,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":43674,"endOffset":44333,"count":0}],"isBlockCoverage":false},{"functionName":"save_settings","ranges":[{"startOffset":44336,"endOffset":48463,"count":0}],"isBlockCoverage":false},{"functionName":"switch_online_offline","ranges":[{"startOffset":48466,"endOffset":50889,"count":0}],"isBlockCoverage":false},{"functionName":"switch_to_branch_tag","ranges":[{"startOffset":50892,"endOffset":51375,"count":0}],"isBlockCoverage":false},{"functionName":"switch_to_commit","ranges":[{"startOffset":51378,"endOffset":52388,"count":0}],"isBlockCoverage":false},{"functionName":"switch_to_pull_req","ranges":[{"startOffset":52391,"endOffset":53796,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":53799,"endOffset":60295,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":60298,"endOffset":65447,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":65450,"endOffset":71144,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":71147,"endOffset":72111,"count":0}],"isBlockCoverage":false}]},{"scriptId":"912","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_repo.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":35514,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":263,"endOffset":4170,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":494,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":925,"endOffset":1053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1134,"endOffset":1250,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1345,"endOffset":1405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1483,"endOffset":2202,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2283,"endOffset":2413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2499,"endOffset":2559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2721,"endOffset":2849,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2897,"endOffset":3025,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3126,"endOffset":3252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3356,"endOffset":3484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3634,"endOffset":3774,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3817,"endOffset":3933,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4030,"endOffset":4146,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_sett_repo","ranges":[{"startOffset":4174,"endOffset":5065,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5068,"endOffset":5669,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5672,"endOffset":5754,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":5764,"endOffset":6836,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":6839,"endOffset":11335,"count":0}],"isBlockCoverage":false},{"functionName":"read_settings","ranges":[{"startOffset":11338,"endOffset":19616,"count":0}],"isBlockCoverage":false},{"functionName":"save_settings","ranges":[{"startOffset":19619,"endOffset":24939,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":24942,"endOffset":30810,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":30813,"endOffset":32562,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":32565,"endOffset":33484,"count":0}],"isBlockCoverage":false}]},{"scriptId":"913","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_stage.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":117108,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":240,"endOffset":22027,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":549,"endOffset":679,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":761,"endOffset":4437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4518,"endOffset":4582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4671,"endOffset":4735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4822,"endOffset":4925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5012,"endOffset":5150,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5232,"endOffset":5566,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5720,"endOffset":5848,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5955,"endOffset":7080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7124,"endOffset":10800,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10849,"endOffset":11362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11469,"endOffset":11982,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12026,"endOffset":15702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15799,"endOffset":15919,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16016,"endOffset":16136,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16182,"endOffset":16246,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16289,"endOffset":16794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16837,"endOffset":17431,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17476,"endOffset":18528,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18577,"endOffset":18671,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18719,"endOffset":18811,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18911,"endOffset":19031,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19132,"endOffset":19250,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19294,"endOffset":19424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19520,"endOffset":19638,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19734,"endOffset":19866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19966,"endOffset":20106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20150,"endOffset":20268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20382,"endOffset":20502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20618,"endOffset":20678,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20793,"endOffset":20913,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21013,"endOffset":21133,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21344,"endOffset":21474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21517,"endOffset":21581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21630,"endOffset":21733,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21782,"endOffset":21920,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_stage","ranges":[{"startOffset":22031,"endOffset":26412,"count":0}],"isBlockCoverage":false},{"functionName":"build_menu","ranges":[{"startOffset":26415,"endOffset":27771,"count":0}],"isBlockCoverage":false},{"functionName":"check_selected","ranges":[{"startOffset":27774,"endOffset":30971,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":30974,"endOffset":32593,"count":0}],"isBlockCoverage":false},{"functionName":"count_default_files_to_commit","ranges":[{"startOffset":32596,"endOffset":35593,"count":0}],"isBlockCoverage":false},{"functionName":"find_changed_by","ranges":[{"startOffset":35596,"endOffset":49576,"count":0}],"isBlockCoverage":false},{"functionName":"find_transports","ranges":[{"startOffset":49579,"endOffset":59068,"count":0}],"isBlockCoverage":false},{"functionName":"get_page_patch","ranges":[{"startOffset":59071,"endOffset":62257,"count":0}],"isBlockCoverage":false},{"functionName":"init_files","ranges":[{"startOffset":62260,"endOffset":62905,"count":0}],"isBlockCoverage":false},{"functionName":"render_actions","ranges":[{"startOffset":62908,"endOffset":66016,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":66019,"endOffset":67697,"count":0}],"isBlockCoverage":false},{"functionName":"render_deferred_hidden_events","ranges":[{"startOffset":67700,"endOffset":68661,"count":0}],"isBlockCoverage":false},{"functionName":"render_file","ranges":[{"startOffset":68664,"endOffset":75077,"count":0}],"isBlockCoverage":false},{"functionName":"render_list","ranges":[{"startOffset":75080,"endOffset":91104,"count":0}],"isBlockCoverage":false},{"functionName":"render_main_language_warning","ranges":[{"startOffset":91107,"endOffset":92077,"count":0}],"isBlockCoverage":false},{"functionName":"render_scripts","ranges":[{"startOffset":92080,"endOffset":94717,"count":0}],"isBlockCoverage":false},{"functionName":"stage_all","ranges":[{"startOffset":94720,"endOffset":100098,"count":0}],"isBlockCoverage":false},{"functionName":"stage_selected","ranges":[{"startOffset":100101,"endOffset":107694,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":107697,"endOffset":111204,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":111207,"endOffset":114203,"count":0}],"isBlockCoverage":false}]},{"scriptId":"914","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_syntax.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6645,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":272,"endOffset":1522,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":675,"endOffset":723,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":872,"endOffset":1004,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1221,"endOffset":1337,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_syntax","ranges":[{"startOffset":1526,"endOffset":1684,"count":0}],"isBlockCoverage":false},{"functionName":"build_menu","ranges":[{"startOffset":1687,"endOffset":1916,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1919,"endOffset":2339,"count":0}],"isBlockCoverage":false},{"functionName":"render_content","ranges":[{"startOffset":2342,"endOffset":3977,"count":0}],"isBlockCoverage":false},{"functionName":"run_syntax_check","ranges":[{"startOffset":3980,"endOffset":4950,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":4953,"endOffset":6005,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":6008,"endOffset":6335,"count":0}],"isBlockCoverage":false}]},{"scriptId":"915","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_tags.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":27593,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":253,"endOffset":5901,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":479,"endOffset":605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":691,"endOffset":819,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":910,"endOffset":1038,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1119,"endOffset":1249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1334,"endOffset":1458,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1538,"endOffset":2570,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2648,"endOffset":3451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3532,"endOffset":3796,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3950,"endOffset":4076,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4124,"endOffset":4252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4418,"endOffset":4482,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4585,"endOffset":4649,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4758,"endOffset":4886,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4934,"endOffset":5062,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5163,"endOffset":5265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5357,"endOffset":5497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5540,"endOffset":5660,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5757,"endOffset":5877,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_tags","ranges":[{"startOffset":5905,"endOffset":7821,"count":0}],"isBlockCoverage":false},{"functionName":"choose_commit","ranges":[{"startOffset":7824,"endOffset":8452,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8455,"endOffset":9210,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":9213,"endOffset":9290,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":9300,"endOffset":10103,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":10106,"endOffset":14447,"count":0}],"isBlockCoverage":false},{"functionName":"get_tagger_email","ranges":[{"startOffset":14450,"endOffset":15299,"count":0}],"isBlockCoverage":false},{"functionName":"get_tagger_name","ranges":[{"startOffset":15302,"endOffset":16140,"count":0}],"isBlockCoverage":false},{"functionName":"initialize_form_data","ranges":[{"startOffset":16143,"endOffset":16872,"count":0}],"isBlockCoverage":false},{"functionName":"validate_form","ranges":[{"startOffset":16875,"endOffset":19876,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":19879,"endOffset":24453,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":24456,"endOffset":25376,"count":0}],"isBlockCoverage":false}]},{"scriptId":"916","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_tutorial.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8827,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":261,"endOffset":924,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":536,"endOffset":668,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":760,"endOffset":900,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_page_tutorial","ranges":[{"startOffset":928,"endOffset":1026,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1029,"endOffset":1142,"count":0}],"isBlockCoverage":false},{"functionName":"build_main_menu","ranges":[{"startOffset":1145,"endOffset":1234,"count":0}],"isBlockCoverage":false},{"functionName":"build_main_menu","ranges":[{"startOffset":1244,"endOffset":2782,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2785,"endOffset":2856,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2866,"endOffset":3515,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":3518,"endOffset":8642,"count":0}],"isBlockCoverage":false}]},{"scriptId":"917","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_picklist.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":18786,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":251,"endOffset":6389,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":505,"endOffset":631,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":717,"endOffset":845,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":931,"endOffset":1069,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1160,"endOffset":1288,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1369,"endOffset":1442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1527,"endOffset":1587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1673,"endOffset":1770,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1856,"endOffset":1953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2039,"endOffset":2118,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2208,"endOffset":2350,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2434,"endOffset":2531,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2610,"endOffset":2674,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2756,"endOffset":2820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2901,"endOffset":3091,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3177,"endOffset":3241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3395,"endOffset":3521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3620,"endOffset":3734,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3831,"endOffset":3951,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3992,"endOffset":4056,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4102,"endOffset":4199,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4243,"endOffset":4307,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4355,"endOffset":4434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4486,"endOffset":4628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4729,"endOffset":4789,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4894,"endOffset":4937,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5035,"endOffset":5132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5229,"endOffset":5326,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5412,"endOffset":5476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5571,"endOffset":5668,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5758,"endOffset":5890,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5931,"endOffset":5995,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6090,"endOffset":6222,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6268,"endOffset":6365,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_picklist","ranges":[{"startOffset":6393,"endOffset":8015,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8018,"endOffset":10559,"count":0}],"isBlockCoverage":false},{"functionName":"get_form_schema","ranges":[{"startOffset":10562,"endOffset":12702,"count":0}],"isBlockCoverage":false},{"functionName":"get_result_idx","ranges":[{"startOffset":12705,"endOffset":12855,"count":0}],"isBlockCoverage":false},{"functionName":"get_result_item","ranges":[{"startOffset":12858,"endOffset":13590,"count":0}],"isBlockCoverage":false},{"functionName":"id","ranges":[{"startOffset":13593,"endOffset":13720,"count":0}],"isBlockCoverage":false},{"functionName":"is_fulfilled","ranges":[{"startOffset":13723,"endOffset":13903,"count":0}],"isBlockCoverage":false},{"functionName":"is_in_page","ranges":[{"startOffset":13906,"endOffset":14082,"count":0}],"isBlockCoverage":false},{"functionName":"return_state","ranges":[{"startOffset":14085,"endOffset":14502,"count":0}],"isBlockCoverage":false},{"functionName":"set_id","ranges":[{"startOffset":14505,"endOffset":14855,"count":0}],"isBlockCoverage":false},{"functionName":"set_in_page","ranges":[{"startOffset":14858,"endOffset":15378,"count":0}],"isBlockCoverage":false},{"functionName":"was_cancelled","ranges":[{"startOffset":15381,"endOffset":15562,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":15565,"endOffset":17543,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_page_title$get_page_title","ranges":[{"startOffset":17546,"endOffset":17724,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":17727,"endOffset":18150,"count":0}],"isBlockCoverage":false}]},{"scriptId":"918","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_router.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":68922,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":9008,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":402,"endOffset":759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":803,"endOffset":933,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1046,"endOffset":1403,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1447,"endOffset":1577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1676,"endOffset":2033,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2077,"endOffset":2207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2309,"endOffset":2405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2448,"endOffset":2514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2615,"endOffset":2972,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3016,"endOffset":3146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3250,"endOffset":3607,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3651,"endOffset":3781,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3885,"endOffset":4242,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4286,"endOffset":4416,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4517,"endOffset":4874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4918,"endOffset":5048,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5156,"endOffset":5513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5557,"endOffset":5687,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5786,"endOffset":5926,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5970,"endOffset":6100,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6200,"endOffset":6340,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6384,"endOffset":6514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6563,"endOffset":6701,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6802,"endOffset":6866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6913,"endOffset":6977,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7024,"endOffset":7088,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7135,"endOffset":7199,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7246,"endOffset":7310,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7353,"endOffset":7417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7466,"endOffset":7530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7643,"endOffset":7735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7842,"endOffset":7936,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8033,"endOffset":8075,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8180,"endOffset":8240,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8284,"endOffset":8414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8515,"endOffset":8575,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8619,"endOffset":8749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8844,"endOffset":8984,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_router","ranges":[{"startOffset":9012,"endOffset":9097,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":9100,"endOffset":9213,"count":0}],"isBlockCoverage":false},{"functionName":"abapgit_services_actions","ranges":[{"startOffset":9216,"endOffset":10214,"count":0}],"isBlockCoverage":false},{"functionName":"call_browser","ranges":[{"startOffset":10217,"endOffset":10557,"count":0}],"isBlockCoverage":false},{"functionName":"db_actions","ranges":[{"startOffset":10560,"endOffset":12697,"count":0}],"isBlockCoverage":false},{"functionName":"file_download","ranges":[{"startOffset":12700,"endOffset":12788,"count":0}],"isBlockCoverage":false},{"functionName":"file_download","ranges":[{"startOffset":12798,"endOffset":14267,"count":0}],"isBlockCoverage":false},{"functionName":"general_page_routing","ranges":[{"startOffset":14270,"endOffset":22576,"count":0}],"isBlockCoverage":false},{"functionName":"get_page_diff","ranges":[{"startOffset":22579,"endOffset":25265,"count":0}],"isBlockCoverage":false},{"functionName":"get_page_stage","ranges":[{"startOffset":25268,"endOffset":29174,"count":0}],"isBlockCoverage":false},{"functionName":"get_state_diff","ranges":[{"startOffset":29177,"endOffset":29839,"count":0}],"isBlockCoverage":false},{"functionName":"get_state_settings","ranges":[{"startOffset":29842,"endOffset":30520,"count":0}],"isBlockCoverage":false},{"functionName":"git_services","ranges":[{"startOffset":30523,"endOffset":34473,"count":0}],"isBlockCoverage":false},{"functionName":"jump_display_transport","ranges":[{"startOffset":34476,"endOffset":34582,"count":0}],"isBlockCoverage":false},{"functionName":"jump_display_transport","ranges":[{"startOffset":34592,"endOffset":36600,"count":0}],"isBlockCoverage":false},{"functionName":"jump_display_user","ranges":[{"startOffset":36603,"endOffset":36699,"count":0}],"isBlockCoverage":false},{"functionName":"jump_display_user","ranges":[{"startOffset":36709,"endOffset":37335,"count":0}],"isBlockCoverage":false},{"functionName":"jump_object","ranges":[{"startOffset":37338,"endOffset":37422,"count":0}],"isBlockCoverage":false},{"functionName":"jump_object","ranges":[{"startOffset":37432,"endOffset":42535,"count":0}],"isBlockCoverage":false},{"functionName":"main_page","ranges":[{"startOffset":42538,"endOffset":43449,"count":0}],"isBlockCoverage":false},{"functionName":"other_utilities","ranges":[{"startOffset":43452,"endOffset":46407,"count":0}],"isBlockCoverage":false},{"functionName":"repository_services","ranges":[{"startOffset":46410,"endOffset":54157,"count":0}],"isBlockCoverage":false},{"functionName":"sap_gui_actions","ranges":[{"startOffset":54160,"endOffset":57413,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":57416,"endOffset":59455,"count":0}],"isBlockCoverage":false},{"functionName":"zip_services","ranges":[{"startOffset":59458,"endOffset":68761,"count":0}],"isBlockCoverage":false}]},{"scriptId":"919","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_utils.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3075,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":940,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":357,"endOffset":454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":496,"endOffset":586,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":687,"endOffset":784,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":826,"endOffset":916,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_utils","ranges":[{"startOffset":944,"endOffset":1029,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1032,"endOffset":1145,"count":0}],"isBlockCoverage":false},{"functionName":"is_event_handler","ranges":[{"startOffset":1148,"endOffset":1241,"count":0}],"isBlockCoverage":false},{"functionName":"is_event_handler","ranges":[{"startOffset":1251,"endOffset":2044,"count":2},{"startOffset":1763,"endOffset":2021,"count":1},{"startOffset":1983,"endOffset":2015,"count":0}],"isBlockCoverage":true},{"functionName":"is_renderable","ranges":[{"startOffset":2047,"endOffset":2134,"count":0}],"isBlockCoverage":false},{"functionName":"is_renderable","ranges":[{"startOffset":2144,"endOffset":2922,"count":2},{"startOffset":2641,"endOffset":2899,"count":1},{"startOffset":2861,"endOffset":2893,"count":0}],"isBlockCoverage":true}]},{"scriptId":"920","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_hash.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10966,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":2805,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":341,"endOffset":388,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":434,"endOffset":500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":590,"endOffset":692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":735,"endOffset":836,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":879,"endOffset":945,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1042,"endOffset":1144,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1187,"endOffset":1253,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1348,"endOffset":1450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1493,"endOffset":1559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1653,"endOffset":1755,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1798,"endOffset":1864,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1959,"endOffset":2061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2104,"endOffset":2170,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2264,"endOffset":2366,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2409,"endOffset":2475,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2572,"endOffset":2674,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2717,"endOffset":2781,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_hash","ranges":[{"startOffset":2809,"endOffset":2894,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2897,"endOffset":3010,"count":0}],"isBlockCoverage":false},{"functionName":"adler32","ranges":[{"startOffset":3013,"endOffset":3083,"count":0}],"isBlockCoverage":false},{"functionName":"adler32","ranges":[{"startOffset":3093,"endOffset":4943,"count":6},{"startOffset":4112,"endOffset":4576,"count":369},{"startOffset":4455,"endOffset":4570,"count":0}],"isBlockCoverage":true},{"functionName":"sha1","ranges":[{"startOffset":4946,"endOffset":5010,"count":0}],"isBlockCoverage":false},{"functionName":"sha1","ranges":[{"startOffset":5020,"endOffset":6421,"count":35}],"isBlockCoverage":true},{"functionName":"sha1_blob","ranges":[{"startOffset":6424,"endOffset":6498,"count":0}],"isBlockCoverage":false},{"functionName":"sha1_blob","ranges":[{"startOffset":6508,"endOffset":6950,"count":6}],"isBlockCoverage":true},{"functionName":"sha1_commit","ranges":[{"startOffset":6953,"endOffset":7031,"count":0}],"isBlockCoverage":false},{"functionName":"sha1_commit","ranges":[{"startOffset":7041,"endOffset":7487,"count":1}],"isBlockCoverage":true},{"functionName":"sha1_raw","ranges":[{"startOffset":7490,"endOffset":7562,"count":0}],"isBlockCoverage":false},{"functionName":"sha1_raw","ranges":[{"startOffset":7572,"endOffset":8629,"count":44},{"startOffset":8245,"endOffset":8530,"count":0}],"isBlockCoverage":true},{"functionName":"sha1_string","ranges":[{"startOffset":8632,"endOffset":8710,"count":0}],"isBlockCoverage":false},{"functionName":"sha1_string","ranges":[{"startOffset":8720,"endOffset":9779,"count":0}],"isBlockCoverage":false},{"functionName":"sha1_tag","ranges":[{"startOffset":9782,"endOffset":9854,"count":0}],"isBlockCoverage":false},{"functionName":"sha1_tag","ranges":[{"startOffset":9864,"endOffset":10304,"count":0}],"isBlockCoverage":false},{"functionName":"sha1_tree","ranges":[{"startOffset":10307,"endOffset":10381,"count":0}],"isBlockCoverage":false},{"functionName":"sha1_tree","ranges":[{"startOffset":10391,"endOffset":10833,"count":17}],"isBlockCoverage":true}]},{"scriptId":"921","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_form.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":160552,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":245,"endOffset":43072,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":458,"endOffset":3301,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3386,"endOffset":3948,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4032,"endOffset":4096,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4182,"endOffset":4246,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4348,"endOffset":4412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4518,"endOffset":4815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4923,"endOffset":5448,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5599,"endOffset":5719,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5764,"endOffset":5892,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5945,"endOffset":6073,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6117,"endOffset":8675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8723,"endOffset":8820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8923,"endOffset":9043,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9087,"endOffset":11645,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11688,"endOffset":12436,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12543,"endOffset":12663,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12707,"endOffset":15265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15308,"endOffset":16056,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16163,"endOffset":16283,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16327,"endOffset":18885,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18928,"endOffset":19676,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19780,"endOffset":19900,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19944,"endOffset":22502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22545,"endOffset":23293,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23397,"endOffset":23517,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23561,"endOffset":26119,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26162,"endOffset":26910,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26955,"endOffset":27083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27183,"endOffset":27303,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27345,"endOffset":27728,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27833,"endOffset":27953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27997,"endOffset":30555,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30598,"endOffset":31346,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31438,"endOffset":31564,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31610,"endOffset":31652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31700,"endOffset":31742,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31834,"endOffset":31954,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32003,"endOffset":32045,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32090,"endOffset":32218,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32271,"endOffset":32399,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32492,"endOffset":32618,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32662,"endOffset":32704,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32749,"endOffset":32791,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32838,"endOffset":32898,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":32988,"endOffset":33114,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33158,"endOffset":33200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33243,"endOffset":33285,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33328,"endOffset":33370,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33417,"endOffset":33514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33563,"endOffset":33660,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33707,"endOffset":33804,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33851,"endOffset":33948,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33995,"endOffset":34092,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34142,"endOffset":34184,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34234,"endOffset":34276,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34318,"endOffset":34378,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34420,"endOffset":34480,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34574,"endOffset":34700,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34744,"endOffset":34786,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34829,"endOffset":34871,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34914,"endOffset":34956,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35003,"endOffset":35100,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35147,"endOffset":35244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35294,"endOffset":35336,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35379,"endOffset":35439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35482,"endOffset":35542,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35591,"endOffset":35688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35780,"endOffset":35906,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35950,"endOffset":35992,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36035,"endOffset":36077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36120,"endOffset":36162,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36209,"endOffset":36306,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36353,"endOffset":36450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36492,"endOffset":36552,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36594,"endOffset":36654,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36748,"endOffset":36874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36918,"endOffset":36960,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37003,"endOffset":37045,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37088,"endOffset":37130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37221,"endOffset":37347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37391,"endOffset":37433,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37476,"endOffset":37518,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37570,"endOffset":37612,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37655,"endOffset":37697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37744,"endOffset":37841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37886,"endOffset":37928,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38020,"endOffset":38146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38190,"endOffset":38232,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38276,"endOffset":38318,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38409,"endOffset":38535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38579,"endOffset":38621,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38664,"endOffset":38706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38749,"endOffset":38791,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38883,"endOffset":39009,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39053,"endOffset":39095,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39139,"endOffset":39181,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39228,"endOffset":39325,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39422,"endOffset":39548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39592,"endOffset":39634,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39677,"endOffset":39719,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39762,"endOffset":39804,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39896,"endOffset":40022,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40065,"endOffset":40107,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40205,"endOffset":43048,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_html_form","ranges":[{"startOffset":43076,"endOffset":47085,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":47088,"endOffset":47201,"count":8}],"isBlockCoverage":true},{"functionName":"checkbox","ranges":[{"startOffset":47204,"endOffset":50595,"count":3},{"startOffset":47650,"endOffset":47676,"count":0}],"isBlockCoverage":true},{"functionName":"column","ranges":[{"startOffset":50598,"endOffset":55059,"count":4},{"startOffset":50939,"endOffset":50967,"count":0},{"startOffset":51109,"endOffset":51146,"count":0}],"isBlockCoverage":true},{"functionName":"command","ranges":[{"startOffset":55062,"endOffset":56501,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":56504,"endOffset":56577,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":56587,"endOffset":57498,"count":8},{"startOffset":56802,"endOffset":56821,"count":0},{"startOffset":56823,"endOffset":56855,"count":0},{"startOffset":56921,"endOffset":56942,"count":0},{"startOffset":56944,"endOffset":56980,"count":0}],"isBlockCoverage":true},{"functionName":"get_fields","ranges":[{"startOffset":57501,"endOffset":60431,"count":17}],"isBlockCoverage":true},{"functionName":"hidden","ranges":[{"startOffset":60434,"endOffset":63529,"count":0}],"isBlockCoverage":false},{"functionName":"number","ranges":[{"startOffset":63532,"endOffset":68113,"count":5},{"startOffset":63976,"endOffset":64002,"count":0},{"startOffset":64144,"endOffset":64181,"count":0},{"startOffset":64428,"endOffset":64465,"count":0},{"startOffset":64665,"endOffset":64692,"count":1},{"startOffset":64752,"endOffset":64801,"count":4},{"startOffset":64896,"endOffset":64923,"count":1},{"startOffset":64983,"endOffset":65032,"count":4}],"isBlockCoverage":true},{"functionName":"option","ranges":[{"startOffset":68116,"endOffset":72246,"count":0}],"isBlockCoverage":false},{"functionName":"radio","ranges":[{"startOffset":72249,"endOffset":76315,"count":0}],"isBlockCoverage":false},{"functionName":"render","ranges":[{"startOffset":76318,"endOffset":86249,"count":0}],"isBlockCoverage":false},{"functionName":"render_command","ranges":[{"startOffset":86252,"endOffset":88517,"count":0}],"isBlockCoverage":false},{"functionName":"render_field","ranges":[{"startOffset":88520,"endOffset":97767,"count":0}],"isBlockCoverage":false},{"functionName":"render_field_checkbox","ranges":[{"startOffset":97770,"endOffset":102553,"count":0}],"isBlockCoverage":false},{"functionName":"render_field_hidden","ranges":[{"startOffset":102556,"endOffset":106498,"count":0}],"isBlockCoverage":false},{"functionName":"render_field_radio","ranges":[{"startOffset":106501,"endOffset":113673,"count":0}],"isBlockCoverage":false},{"functionName":"render_field_table","ranges":[{"startOffset":113676,"endOffset":122885,"count":0}],"isBlockCoverage":false},{"functionName":"render_field_text","ranges":[{"startOffset":122888,"endOffset":129755,"count":0}],"isBlockCoverage":false},{"functionName":"render_field_textarea","ranges":[{"startOffset":129758,"endOffset":135556,"count":0}],"isBlockCoverage":false},{"functionName":"start_group","ranges":[{"startOffset":135559,"endOffset":138956,"count":0}],"isBlockCoverage":false},{"functionName":"table","ranges":[{"startOffset":138959,"endOffset":142344,"count":2},{"startOffset":139402,"endOffset":139428,"count":0}],"isBlockCoverage":true},{"functionName":"text","ranges":[{"startOffset":142347,"endOffset":148750,"count":10},{"startOffset":142789,"endOffset":142815,"count":0},{"startOffset":142957,"endOffset":142994,"count":1},{"startOffset":143059,"endOffset":143099,"count":9},{"startOffset":143245,"endOffset":143286,"count":1},{"startOffset":143353,"endOffset":143395,"count":9},{"startOffset":143537,"endOffset":143574,"count":0},{"startOffset":143821,"endOffset":143858,"count":0},{"startOffset":144105,"endOffset":144142,"count":0},{"startOffset":144235,"endOffset":144275,"count":0},{"startOffset":144368,"endOffset":144408,"count":0},{"startOffset":144503,"endOffset":144530,"count":1},{"startOffset":144590,"endOffset":144639,"count":9},{"startOffset":144734,"endOffset":144761,"count":1},{"startOffset":144821,"endOffset":144870,"count":9},{"startOffset":148077,"endOffset":148127,"count":0},{"startOffset":148129,"endOffset":148628,"count":0}],"isBlockCoverage":true},{"functionName":"textarea","ranges":[{"startOffset":148753,"endOffset":153663,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_hotkeys$get_hotkey_actions","ranges":[{"startOffset":153666,"endOffset":157622,"count":0}],"isBlockCoverage":false}]},{"scriptId":"922","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_form_utils.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":37652,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":3813,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":301,"endOffset":427,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":513,"endOffset":641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":791,"endOffset":929,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":972,"endOffset":1098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1193,"endOffset":1290,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1338,"endOffset":1466,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1517,"endOffset":1645,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1742,"endOffset":1868,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1968,"endOffset":2096,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2144,"endOffset":2272,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2376,"endOffset":2504,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2552,"endOffset":2680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2775,"endOffset":2872,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2920,"endOffset":3048,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3147,"endOffset":3275,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3366,"endOffset":3426,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3474,"endOffset":3602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3661,"endOffset":3789,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_html_form_utils","ranges":[{"startOffset":3817,"endOffset":4171,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4174,"endOffset":4445,"count":8}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":4448,"endOffset":4527,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":4537,"endOffset":5040,"count":8}],"isBlockCoverage":true},{"functionName":"exit","ranges":[{"startOffset":5043,"endOffset":6931,"count":3},{"startOffset":5538,"endOffset":5599,"count":0},{"startOffset":6080,"endOffset":6800,"count":2},{"startOffset":6588,"endOffset":6794,"count":1},{"startOffset":6800,"endOffset":6906,"count":1}],"isBlockCoverage":true},{"functionName":"is_dirty","ranges":[{"startOffset":6934,"endOffset":7017,"count":3}],"isBlockCoverage":true},{"functionName":"is_dirty","ranges":[{"startOffset":7027,"endOffset":7737,"count":3}],"isBlockCoverage":true},{"functionName":"is_empty","ranges":[{"startOffset":7740,"endOffset":16871,"count":6},{"startOffset":14037,"endOffset":16846,"count":20},{"startOffset":14374,"endOffset":14524,"count":6},{"startOffset":14447,"endOffset":14513,"count":2},{"startOffset":14524,"endOffset":16744,"count":14},{"startOffset":14662,"endOffset":16115,"count":3},{"startOffset":15079,"endOffset":16052,"count":2},{"startOffset":15416,"endOffset":15985,"count":4},{"startOffset":15866,"endOffset":15973,"count":1},{"startOffset":15985,"endOffset":16052,"count":1},{"startOffset":16052,"endOffset":16115,"count":2},{"startOffset":16115,"endOffset":16744,"count":11},{"startOffset":16256,"endOffset":16655,"count":0},{"startOffset":16744,"endOffset":16806,"count":19},{"startOffset":16806,"endOffset":16840,"count":3},{"startOffset":16846,"endOffset":16870,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":13895,"endOffset":14033,"count":20}],"isBlockCoverage":true},{"functionName":"normalize","ranges":[{"startOffset":16874,"endOffset":27904,"count":1},{"startOffset":23132,"endOffset":23166,"count":0},{"startOffset":23556,"endOffset":27875,"count":8},{"startOffset":23802,"endOffset":23912,"count":0},{"startOffset":24054,"endOffset":24230,"count":2},{"startOffset":24230,"endOffset":27869,"count":6},{"startOffset":24367,"endOffset":24499,"count":3},{"startOffset":24501,"endOffset":24574,"count":3},{"startOffset":24576,"endOffset":24706,"count":1},{"startOffset":24706,"endOffset":27869,"count":5},{"startOffset":24845,"endOffset":25014,"count":2},{"startOffset":25014,"endOffset":27869,"count":3},{"startOffset":25152,"endOffset":26900,"count":1},{"startOffset":25569,"endOffset":26534,"count":2},{"startOffset":25906,"endOffset":26467,"count":4},{"startOffset":26900,"endOffset":27869,"count":2},{"startOffset":27041,"endOffset":27763,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":23300,"endOffset":23552,"count":8}],"isBlockCoverage":true},{"functionName":"set_data","ranges":[{"startOffset":27907,"endOffset":28189,"count":3}],"isBlockCoverage":true},{"functionName":"validate","ranges":[{"startOffset":28192,"endOffset":37475,"count":10},{"startOffset":34374,"endOffset":37441,"count":13},{"startOffset":34581,"endOffset":34691,"count":0},{"startOffset":34762,"endOffset":34795,"count":3},{"startOffset":34797,"endOffset":34993,"count":2},{"startOffset":35164,"endOffset":36062,"count":9},{"startOffset":35257,"endOffset":35337,"count":3},{"startOffset":35339,"endOffset":35610,"count":1},{"startOffset":35702,"endOffset":35782,"count":3},{"startOffset":35784,"endOffset":36054,"count":1},{"startOffset":36062,"endOffset":37435,"count":4},{"startOffset":36248,"endOffset":36616,"count":1},{"startOffset":36566,"endOffset":36606,"count":0},{"startOffset":36616,"endOffset":36761,"count":3},{"startOffset":36763,"endOffset":37021,"count":1},{"startOffset":37021,"endOffset":37166,"count":3},{"startOffset":37168,"endOffset":37427,"count":1}],"isBlockCoverage":true}]},{"scriptId":"923","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_parts.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12551,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":3631,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":298,"endOffset":1060,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1219,"endOffset":1782,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1831,"endOffset":1895,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1951,"endOffset":2048,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2148,"endOffset":2212,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2255,"endOffset":2375,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2471,"endOffset":2802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2851,"endOffset":2915,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3021,"endOffset":3279,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3384,"endOffset":3444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3493,"endOffset":3557,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_html_parts","ranges":[{"startOffset":3635,"endOffset":4499,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4502,"endOffset":4615,"count":1},{"startOffset":4558,"endOffset":4594,"count":0}],"isBlockCoverage":true},{"functionName":"add_part","ranges":[{"startOffset":4618,"endOffset":5769,"count":3}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":5772,"endOffset":5844,"count":1}],"isBlockCoverage":true},{"functionName":"get_collection","ranges":[{"startOffset":5847,"endOffset":7561,"count":9},{"startOffset":6763,"endOffset":6818,"count":3},{"startOffset":6892,"endOffset":6941,"count":6},{"startOffset":7337,"endOffset":7401,"count":4},{"startOffset":7403,"endOffset":7531,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":7043,"endOffset":7098,"count":12}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":7127,"endOffset":7149,"count":0}],"isBlockCoverage":false},{"functionName":"get_collection_names","ranges":[{"startOffset":7564,"endOffset":8657,"count":2}],"isBlockCoverage":true},{"functionName":"get_collection_size","ranges":[{"startOffset":8660,"endOffset":9728,"count":3},{"startOffset":9625,"endOffset":9704,"count":2}],"isBlockCoverage":true},{"functionName":"get_parts","ranges":[{"startOffset":9731,"endOffset":11036,"count":3},{"startOffset":10958,"endOffset":11011,"count":2}],"isBlockCoverage":true}]},{"scriptId":"924","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_table.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15269,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":247,"endOffset":3569,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":414,"endOffset":546,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":630,"endOffset":1237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1318,"endOffset":1438,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1646,"endOffset":1766,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1867,"endOffset":1927,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1969,"endOffset":2012,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2108,"endOffset":2236,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2283,"endOffset":2415,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2514,"endOffset":2642,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2690,"endOffset":2754,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2805,"endOffset":2869,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2918,"endOffset":2997,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3089,"endOffset":3209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3250,"endOffset":3292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3340,"endOffset":3382,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3425,"endOffset":3545,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_html_table","ranges":[{"startOffset":3573,"endOffset":4552,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4555,"endOffset":4668,"count":1}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":4671,"endOffset":4745,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":4755,"endOffset":5369,"count":1}],"isBlockCoverage":true},{"functionName":"define_column","ranges":[{"startOffset":5372,"endOffset":6789,"count":3},{"startOffset":5799,"endOffset":5844,"count":2},{"startOffset":5972,"endOffset":6013,"count":1}],"isBlockCoverage":true},{"functionName":"render","ranges":[{"startOffset":6792,"endOffset":8253,"count":1}],"isBlockCoverage":true},{"functionName":"render_row","ranges":[{"startOffset":8256,"endOffset":11235,"count":2},{"startOffset":9597,"endOffset":11231,"count":6},{"startOffset":9705,"endOffset":9790,"count":4},{"startOffset":9792,"endOffset":10208,"count":3},{"startOffset":9995,"endOffset":10200,"count":0},{"startOffset":10208,"endOffset":10865,"count":3},{"startOffset":10302,"endOffset":10778,"count":2},{"startOffset":10604,"endOffset":10770,"count":1},{"startOffset":10778,"endOffset":10865,"count":1}],"isBlockCoverage":true},{"functionName":"render_tbody","ranges":[{"startOffset":11238,"endOffset":12994,"count":1},{"startOffset":12048,"endOffset":12882,"count":2}],"isBlockCoverage":true},{"functionName":"render_thead","ranges":[{"startOffset":12997,"endOffset":14079,"count":1},{"startOffset":13722,"endOffset":13862,"count":3}],"isBlockCoverage":true}]},{"scriptId":"925","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_toolbar.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":26613,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":6103,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":293,"endOffset":1821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1900,"endOffset":1964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2115,"endOffset":2235,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2278,"endOffset":2375,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2471,"endOffset":2603,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2644,"endOffset":2708,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2803,"endOffset":2867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2956,"endOffset":3088,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3130,"endOffset":3194,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3236,"endOffset":3368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3410,"endOffset":3452,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3494,"endOffset":3558,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3600,"endOffset":3664,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3706,"endOffset":3803,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3845,"endOffset":3887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3929,"endOffset":4026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4068,"endOffset":4132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4173,"endOffset":4237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4281,"endOffset":4345,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4389,"endOffset":4453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4500,"endOffset":4564,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4662,"endOffset":4722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4814,"endOffset":4934,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4978,"endOffset":5075,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5118,"endOffset":5215,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5319,"endOffset":5439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5483,"endOffset":5547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5591,"endOffset":5688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5731,"endOffset":5828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5873,"endOffset":5970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6015,"endOffset":6079,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_html_toolbar","ranges":[{"startOffset":6107,"endOffset":7793,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":7796,"endOffset":12483,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":12486,"endOffset":12683,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":12686,"endOffset":12762,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":12772,"endOffset":13189,"count":0}],"isBlockCoverage":false},{"functionName":"count_items","ranges":[{"startOffset":13192,"endOffset":13363,"count":0}],"isBlockCoverage":false},{"functionName":"render","ranges":[{"startOffset":13366,"endOffset":14599,"count":0}],"isBlockCoverage":false},{"functionName":"render_as_droplist","ranges":[{"startOffset":14602,"endOffset":16962,"count":0}],"isBlockCoverage":false},{"functionName":"render_items","ranges":[{"startOffset":16965,"endOffset":23562,"count":0}],"isBlockCoverage":false}]},{"scriptId":"926","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_viewer_gui.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11477,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":1624,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":333,"endOffset":400,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":511,"endOffset":571,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":717,"endOffset":784,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":825,"endOffset":892,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":935,"endOffset":1002,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1046,"endOffset":1113,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1160,"endOffset":1227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1329,"endOffset":1445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1503,"endOffset":1600,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_html_viewer_gui","ranges":[{"startOffset":1628,"endOffset":1920,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1923,"endOffset":3342,"count":0}],"isBlockCoverage":false},{"functionName":"on_event","ranges":[{"startOffset":3345,"endOffset":4064,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$back","ranges":[{"startOffset":4067,"endOffset":4156,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$close_document","ranges":[{"startOffset":4159,"endOffset":4265,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$free","ranges":[{"startOffset":4268,"endOffset":4354,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$get_url","ranges":[{"startOffset":4357,"endOffset":4678,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$load_data","ranges":[{"startOffset":4681,"endOffset":7113,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$set_focus","ranges":[{"startOffset":7118,"endOffset":8013,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$set_registered_events","ranges":[{"startOffset":8020,"endOffset":9148,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$set_visiblity","ranges":[{"startOffset":9157,"endOffset":9784,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_viewer$show_url","ranges":[{"startOffset":9793,"endOffset":11080,"count":0}],"isBlockCoverage":false}]},{"scriptId":"927","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14372,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":2378,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":269,"endOffset":401,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":570,"endOffset":667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":712,"endOffset":828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":929,"endOffset":1026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1068,"endOffset":1132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1241,"endOffset":1305,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1350,"endOffset":1466,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1511,"endOffset":1641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1683,"endOffset":1747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1843,"endOffset":1907,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2008,"endOffset":2138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2180,"endOffset":2244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2290,"endOffset":2354,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_http","ranges":[{"startOffset":2382,"endOffset":2514,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2517,"endOffset":2630,"count":0}],"isBlockCoverage":false},{"functionName":"acquire_login_details","ranges":[{"startOffset":2633,"endOffset":2731,"count":0}],"isBlockCoverage":false},{"functionName":"acquire_login_details","ranges":[{"startOffset":2741,"endOffset":5266,"count":0}],"isBlockCoverage":false},{"functionName":"check_auth_requested","ranges":[{"startOffset":5269,"endOffset":5365,"count":0}],"isBlockCoverage":false},{"functionName":"check_auth_requested","ranges":[{"startOffset":5375,"endOffset":6041,"count":2},{"startOffset":5947,"endOffset":6007,"count":0}],"isBlockCoverage":true},{"functionName":"create_by_url","ranges":[{"startOffset":6044,"endOffset":6126,"count":0}],"isBlockCoverage":false},{"functionName":"create_by_url","ranges":[{"startOffset":6136,"endOffset":11868,"count":2},{"startOffset":7915,"endOffset":8383,"count":0},{"startOffset":8475,"endOffset":8934,"count":0},{"startOffset":9080,"endOffset":9171,"count":0},{"startOffset":9384,"endOffset":9463,"count":0},{"startOffset":10688,"endOffset":10986,"count":0},{"startOffset":11285,"endOffset":11461,"count":0}],"isBlockCoverage":true},{"functionName":"get_agent","ranges":[{"startOffset":11873,"endOffset":11941,"count":0}],"isBlockCoverage":false},{"functionName":"get_agent","ranges":[{"startOffset":11953,"endOffset":12241,"count":2}],"isBlockCoverage":true},{"functionName":"is_local_system","ranges":[{"startOffset":12246,"endOffset":12336,"count":0}],"isBlockCoverage":false},{"functionName":"is_local_system","ranges":[{"startOffset":12348,"endOffset":14031,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":13673,"endOffset":13728,"count":4}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":13759,"endOffset":13787,"count":0}],"isBlockCoverage":false}]},{"scriptId":"928","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http_agent.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11066,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":181,"endOffset":1646,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":378,"endOffset":506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":612,"endOffset":975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1131,"endOffset":1249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1295,"endOffset":1338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1434,"endOffset":1566,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_http_agent","ranges":[{"startOffset":1650,"endOffset":1995,"count":0}],"isBlockCoverage":false},{"functionName":"attach_payload","ranges":[{"startOffset":1998,"endOffset":2088,"count":0}],"isBlockCoverage":false},{"functionName":"attach_payload","ranges":[{"startOffset":2098,"endOffset":3228,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3231,"endOffset":3380,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3383,"endOffset":3447,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3457,"endOffset":3731,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_agent$global_headers","ranges":[{"startOffset":3734,"endOffset":4008,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_agent$request","ranges":[{"startOffset":4011,"endOffset":10068,"count":0}],"isBlockCoverage":false}]},{"scriptId":"929","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http_agent.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5716,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":1137,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":344,"endOffset":460,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":545,"endOffset":665,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":814,"endOffset":952,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":997,"endOffset":1113,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_http_response","ranges":[{"startOffset":1141,"endOffset":1478,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1481,"endOffset":1594,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1597,"endOffset":1666,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1676,"endOffset":2521,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_response$close","ranges":[{"startOffset":2524,"endOffset":2624,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_response$is_ok","ranges":[{"startOffset":2627,"endOffset":3079,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_response$data","ranges":[{"startOffset":3082,"endOffset":3291,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_response$cdata","ranges":[{"startOffset":3294,"endOffset":3503,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_response$code","ranges":[{"startOffset":3506,"endOffset":3796,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_response$json","ranges":[{"startOffset":3799,"endOffset":4114,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_response$error","ranges":[{"startOffset":4117,"endOffset":4335,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_http_response$headers","ranges":[{"startOffset":4338,"endOffset":5539,"count":0}],"isBlockCoverage":false}]},{"scriptId":"930","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http_client.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12343,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":2318,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":291,"endOffset":407,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":490,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":772,"endOffset":888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1036,"endOffset":1166,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1270,"endOffset":1336,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1379,"endOffset":1445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1541,"endOffset":1605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1787,"endOffset":1851,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1903,"endOffset":1967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2120,"endOffset":2184,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2230,"endOffset":2294,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_http_client","ranges":[{"startOffset":2322,"endOffset":2667,"count":2}],"isBlockCoverage":true},{"functionName":"check_http_200","ranges":[{"startOffset":2670,"endOffset":5250,"count":3},{"startOffset":3055,"endOffset":5246,"count":0}],"isBlockCoverage":true},{"functionName":"check_smart_response","ranges":[{"startOffset":5253,"endOffset":6723,"count":2},{"startOffset":6056,"endOffset":6242,"count":0},{"startOffset":6568,"endOffset":6713,"count":0}],"isBlockCoverage":true},{"functionName":"close","ranges":[{"startOffset":6726,"endOffset":6800,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":6803,"endOffset":7076,"count":2}],"isBlockCoverage":true},{"functionName":"get_cdata","ranges":[{"startOffset":7079,"endOffset":7297,"count":2}],"isBlockCoverage":true},{"functionName":"send_receive","ranges":[{"startOffset":7300,"endOffset":9375,"count":3},{"startOffset":7640,"endOffset":8185,"count":0},{"startOffset":8410,"endOffset":8917,"count":0},{"startOffset":9019,"endOffset":9367,"count":0}],"isBlockCoverage":true},{"functionName":"send_receive_close","ranges":[{"startOffset":9382,"endOffset":10005,"count":1}],"isBlockCoverage":true},{"functionName":"set_digest","ranges":[{"startOffset":10012,"endOffset":10296,"count":0}],"isBlockCoverage":false},{"functionName":"set_headers","ranges":[{"startOffset":10303,"endOffset":12174,"count":1},{"startOffset":12084,"endOffset":12166,"count":0}],"isBlockCoverage":true}]},{"scriptId":"931","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http_digest.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10168,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":2950,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":287,"endOffset":335,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":415,"endOffset":479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":564,"endOffset":628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":710,"endOffset":774,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":854,"endOffset":918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1000,"endOffset":1064,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1206,"endOffset":1270,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1313,"endOffset":1377,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1471,"endOffset":1535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1577,"endOffset":1641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1685,"endOffset":1749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1791,"endOffset":1855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1900,"endOffset":1964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2009,"endOffset":2073,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2166,"endOffset":2282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2381,"endOffset":2497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2544,"endOffset":2608,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2655,"endOffset":2719,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2810,"endOffset":2926,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_http_digest","ranges":[{"startOffset":2954,"endOffset":3436,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3439,"endOffset":4258,"count":0}],"isBlockCoverage":false},{"functionName":"hash","ranges":[{"startOffset":4261,"endOffset":5655,"count":0}],"isBlockCoverage":false},{"functionName":"md5","ranges":[{"startOffset":5658,"endOffset":5727,"count":0}],"isBlockCoverage":false},{"functionName":"md5","ranges":[{"startOffset":5737,"endOffset":6864,"count":0}],"isBlockCoverage":false},{"functionName":"parse","ranges":[{"startOffset":6867,"endOffset":7702,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":7705,"endOffset":9941,"count":0}],"isBlockCoverage":false}]},{"scriptId":"932","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_i18n_params.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":24705,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":8021,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":291,"endOffset":1014,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1106,"endOffset":1670,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1844,"endOffset":2408,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2457,"endOffset":2765,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2858,"endOffset":2988,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3040,"endOffset":3129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3186,"endOffset":3283,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3339,"endOffset":3647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3693,"endOffset":3790,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3835,"endOffset":4558,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4664,"endOffset":4753,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4810,"endOffset":4907,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4963,"endOffset":5271,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5317,"endOffset":5414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5459,"endOffset":6182,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6284,"endOffset":6381,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6499,"endOffset":7063,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7171,"endOffset":7483,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7604,"endOffset":7683,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7738,"endOffset":7835,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7877,"endOffset":7997,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_i18n_params","ranges":[{"startOffset":8025,"endOffset":9420,"count":5}],"isBlockCoverage":true},{"functionName":"build_language_filter","ranges":[{"startOffset":9423,"endOffset":10599,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":10602,"endOffset":13322,"count":5},{"startOffset":10890,"endOffset":10985,"count":0},{"startOffset":11279,"endOffset":11329,"count":0},{"startOffset":11994,"endOffset":12033,"count":0},{"startOffset":12882,"endOffset":12926,"count":0}],"isBlockCoverage":true},{"functionName":"iso_langs_to_lang_filter","ranges":[{"startOffset":13325,"endOffset":13436,"count":0}],"isBlockCoverage":false},{"functionName":"iso_langs_to_lang_filter","ranges":[{"startOffset":13446,"endOffset":16003,"count":1},{"startOffset":15208,"endOffset":15964,"count":2},{"startOffset":15407,"endOffset":15711,"count":0},{"startOffset":15803,"endOffset":15834,"count":0}],"isBlockCoverage":true},{"functionName":"is_lxe_applicable","ranges":[{"startOffset":16008,"endOffset":16436,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":16441,"endOffset":16514,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":16526,"endOffset":19208,"count":5},{"startOffset":16951,"endOffset":17046,"count":0},{"startOffset":17212,"endOffset":17269,"count":0},{"startOffset":17970,"endOffset":18005,"count":0},{"startOffset":18878,"endOffset":18911,"count":0}],"isBlockCoverage":true},{"functionName":"trim_saplang_keyed_table","ranges":[{"startOffset":19213,"endOffset":22260,"count":3},{"startOffset":19607,"endOffset":19660,"count":1},{"startOffset":19735,"endOffset":19783,"count":2},{"startOffset":20420,"endOffset":20463,"count":2},{"startOffset":20465,"endOffset":20490,"count":1},{"startOffset":20490,"endOffset":20557,"count":2},{"startOffset":20557,"endOffset":22252,"count":5},{"startOffset":20935,"endOffset":21003,"count":2},{"startOffset":21005,"endOffset":21036,"count":1},{"startOffset":21036,"endOffset":21215,"count":4},{"startOffset":21215,"endOffset":21537,"count":0},{"startOffset":21537,"endOffset":21631,"count":4},{"startOffset":21631,"endOffset":21742,"count":0},{"startOffset":21742,"endOffset":22153,"count":4},{"startOffset":22153,"endOffset":22242,"count":1},{"startOffset":22252,"endOffset":22259,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":21832,"endOffset":21888,"count":6}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":21923,"endOffset":21951,"count":0}],"isBlockCoverage":false},{"functionName":"trim_saplang_list","ranges":[{"startOffset":22267,"endOffset":24532,"count":2},{"startOffset":23055,"endOffset":23159,"count":1},{"startOffset":23159,"endOffset":24522,"count":3},{"startOffset":23431,"endOffset":23771,"count":0},{"startOffset":23867,"endOffset":23990,"count":0},{"startOffset":24411,"endOffset":24510,"count":1},{"startOffset":24522,"endOffset":24531,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":24082,"endOffset":24138,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":24175,"endOffset":24203,"count":0}],"isBlockCoverage":false}]},{"scriptId":"933","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_injector.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11277,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":3168,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":352,"endOffset":474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":578,"endOffset":674,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":724,"endOffset":858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":965,"endOffset":1061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1114,"endOffset":1254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1356,"endOffset":1490,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1590,"endOffset":1716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1824,"endOffset":1958,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2062,"endOffset":2192,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2298,"endOffset":2430,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2534,"endOffset":2664,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2772,"endOffset":2910,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3012,"endOffset":3144,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_injector","ranges":[{"startOffset":3172,"endOffset":3257,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3260,"endOffset":3373,"count":0}],"isBlockCoverage":false},{"functionName":"set_code_inspector","ranges":[{"startOffset":3376,"endOffset":3472,"count":0}],"isBlockCoverage":false},{"functionName":"set_code_inspector","ranges":[{"startOffset":3482,"endOffset":5421,"count":0}],"isBlockCoverage":false},{"functionName":"set_cts_api","ranges":[{"startOffset":5424,"endOffset":5506,"count":0}],"isBlockCoverage":false},{"functionName":"set_cts_api","ranges":[{"startOffset":5516,"endOffset":5818,"count":0}],"isBlockCoverage":false},{"functionName":"set_environment","ranges":[{"startOffset":5821,"endOffset":5911,"count":0}],"isBlockCoverage":false},{"functionName":"set_environment","ranges":[{"startOffset":5921,"endOffset":6259,"count":0}],"isBlockCoverage":false},{"functionName":"set_http_agent","ranges":[{"startOffset":6262,"endOffset":6350,"count":0}],"isBlockCoverage":false},{"functionName":"set_http_agent","ranges":[{"startOffset":6360,"endOffset":6689,"count":0}],"isBlockCoverage":false},{"functionName":"set_longtexts","ranges":[{"startOffset":6692,"endOffset":6778,"count":0}],"isBlockCoverage":false},{"functionName":"set_longtexts","ranges":[{"startOffset":6788,"endOffset":7107,"count":0}],"isBlockCoverage":false},{"functionName":"set_lxe_texts","ranges":[{"startOffset":7110,"endOffset":7196,"count":0}],"isBlockCoverage":false},{"functionName":"set_lxe_texts","ranges":[{"startOffset":7206,"endOffset":7526,"count":0}],"isBlockCoverage":false},{"functionName":"set_sap_namespace","ranges":[{"startOffset":7529,"endOffset":7623,"count":0}],"isBlockCoverage":false},{"functionName":"set_sap_namespace","ranges":[{"startOffset":7633,"endOffset":7969,"count":9}],"isBlockCoverage":true},{"functionName":"set_sap_package","ranges":[{"startOffset":7972,"endOffset":8062,"count":0}],"isBlockCoverage":false},{"functionName":"set_sap_package","ranges":[{"startOffset":8072,"endOffset":9932,"count":98},{"startOffset":9658,"endOffset":9869,"count":11}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":9363,"endOffset":9418,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":9447,"endOffset":9472,"count":0}],"isBlockCoverage":false},{"functionName":"set_sap_report","ranges":[{"startOffset":9935,"endOffset":10023,"count":0}],"isBlockCoverage":false},{"functionName":"set_sap_report","ranges":[{"startOffset":10033,"endOffset":10342,"count":0}],"isBlockCoverage":false},{"functionName":"set_stage_logic","ranges":[{"startOffset":10345,"endOffset":10435,"count":0}],"isBlockCoverage":false},{"functionName":"set_stage_logic","ranges":[{"startOffset":10445,"endOffset":10753,"count":0}],"isBlockCoverage":false},{"functionName":"set_tadir","ranges":[{"startOffset":10756,"endOffset":10834,"count":0}],"isBlockCoverage":false},{"functionName":"set_tadir","ranges":[{"startOffset":10844,"endOffset":11128,"count":13}],"isBlockCoverage":true}]},{"scriptId":"934","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_integration_git.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":687,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":305,"count":1}],"isBlockCoverage":true},{"functionName":"zcl_abapgit_integration_git","ranges":[{"startOffset":309,"endOffset":394,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":397,"endOffset":510,"count":0}],"isBlockCoverage":false}]},{"scriptId":"935","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_item_graph.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":18741,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":6364,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":290,"endOffset":1066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1148,"endOffset":2670,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2754,"endOffset":2851,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3004,"endOffset":3064,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3162,"endOffset":3974,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4068,"endOffset":4662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4703,"endOffset":5297,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5395,"endOffset":5492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5586,"endOffset":6180,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6222,"endOffset":6340,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_item_graph","ranges":[{"startOffset":6368,"endOffset":8871,"count":19}],"isBlockCoverage":true},{"functionName":"add_edge","ranges":[{"startOffset":8874,"endOffset":11763,"count":33}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":11766,"endOffset":12788,"count":19}],"isBlockCoverage":true},{"functionName":"get_next","ranges":[{"startOffset":12791,"endOffset":15757,"count":44},{"startOffset":14332,"endOffset":15189,"count":70},{"startOffset":15062,"endOffset":15183,"count":44},{"startOffset":15189,"endOffset":15756,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":14499,"endOffset":14644,"count":88},{"startOffset":14577,"endOffset":14642,"count":31}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":14675,"endOffset":14710,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":14751,"endOffset":14786,"count":0}],"isBlockCoverage":false},{"functionName":"has_vertices","ranges":[{"startOffset":15760,"endOffset":16039,"count":63}],"isBlockCoverage":true},{"functionName":"remove_vertex","ranges":[{"startOffset":16042,"endOffset":17295,"count":44}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":17139,"endOffset":17288,"count":49},{"startOffset":17219,"endOffset":17286,"count":41}],"isBlockCoverage":true}]},{"scriptId":"936","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_item_state.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12414,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":5499,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":288,"endOffset":395,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":478,"endOffset":585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":675,"endOffset":772,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":916,"endOffset":1023,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1066,"endOffset":1173,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1215,"endOffset":1322,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1414,"endOffset":1521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1614,"endOffset":1721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1829,"endOffset":1926,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2032,"endOffset":2129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2238,"endOffset":4310,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4423,"endOffset":5475,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_item_state","ranges":[{"startOffset":5503,"endOffset":5927,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":5930,"endOffset":6043,"count":2},{"startOffset":5986,"endOffset":6022,"count":0}],"isBlockCoverage":true},{"functionName":"is_reassigned","ranges":[{"startOffset":6046,"endOffset":6261,"count":12}],"isBlockCoverage":true},{"functionName":"is_unchanged","ranges":[{"startOffset":6264,"endOffset":6785,"count":12},{"startOffset":6503,"endOffset":6626,"count":8},{"startOffset":6627,"endOffset":6750,"count":2}],"isBlockCoverage":true},{"functionName":"local","ranges":[{"startOffset":6788,"endOffset":6974,"count":12}],"isBlockCoverage":true},{"functionName":"reduce","ranges":[{"startOffset":6977,"endOffset":7051,"count":20}],"isBlockCoverage":true},{"functionName":"reduce","ranges":[{"startOffset":7061,"endOffset":7873,"count":20},{"startOffset":7600,"endOffset":7631,"count":16},{"startOffset":7633,"endOffset":7850,"count":10},{"startOffset":7701,"endOffset":7734,"count":4},{"startOffset":7734,"endOffset":7850,"count":6},{"startOffset":7850,"endOffset":7872,"count":10}],"isBlockCoverage":true},{"functionName":"remote","ranges":[{"startOffset":7876,"endOffset":8063,"count":12}],"isBlockCoverage":true},{"functionName":"sum_with_repo_item","ranges":[{"startOffset":8066,"endOffset":10662,"count":5},{"startOffset":10584,"endOffset":10655,"count":4}],"isBlockCoverage":true},{"functionName":"sum_with_status_item","ranges":[{"startOffset":10665,"endOffset":12257,"count":5},{"startOffset":12177,"endOffset":12250,"count":4}],"isBlockCoverage":true}]},{"scriptId":"937","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_json_handler.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":32989,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":187,"endOffset":8330,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":441,"endOffset":563,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":678,"endOffset":1650,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1694,"endOffset":1816,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1933,"endOffset":2055,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2172,"endOffset":2294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2407,"endOffset":2529,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2631,"endOffset":3168,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3212,"endOffset":3334,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3449,"endOffset":4421,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4465,"endOffset":4587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4684,"endOffset":4750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4793,"endOffset":4836,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4888,"endOffset":5860,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5909,"endOffset":6446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6546,"endOffset":6612,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6659,"endOffset":7196,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7248,"endOffset":8220,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8263,"endOffset":8306,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_json_handler","ranges":[{"startOffset":8334,"endOffset":8419,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":8422,"endOffset":8535,"count":4},{"startOffset":8478,"endOffset":8514,"count":0}],"isBlockCoverage":true},{"functionName":"deserialize","ranges":[{"startOffset":8538,"endOffset":11443,"count":2}],"isBlockCoverage":true},{"functionName":"map2abap_abap_language_version","ranges":[{"startOffset":11446,"endOffset":12830,"count":2},{"startOffset":12064,"endOffset":12671,"count":1},{"startOffset":12301,"endOffset":12448,"count":0}],"isBlockCoverage":true},{"functionName":"map2abap_custom_enum","ranges":[{"startOffset":12833,"endOffset":16066,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":15618,"endOffset":15672,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":15703,"endOffset":15725,"count":0}],"isBlockCoverage":false},{"functionName":"map2abap_original_language","ranges":[{"startOffset":16069,"endOffset":17318,"count":2},{"startOffset":16742,"endOffset":16812,"count":0},{"startOffset":16814,"endOffset":16864,"count":0},{"startOffset":16940,"endOffset":17010,"count":0}],"isBlockCoverage":true},{"functionName":"map2json_abap_language_version","ranges":[{"startOffset":17321,"endOffset":18841,"count":2},{"startOffset":18002,"endOffset":18141,"count":1},{"startOffset":18143,"endOffset":18684,"count":1},{"startOffset":18376,"endOffset":18461,"count":0}],"isBlockCoverage":true},{"functionName":"map2json_custom_enum","ranges":[{"startOffset":18844,"endOffset":22077,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":21629,"endOffset":21683,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":21714,"endOffset":21736,"count":0}],"isBlockCoverage":false},{"functionName":"map2json_original_language","ranges":[{"startOffset":22080,"endOffset":23387,"count":2},{"startOffset":22758,"endOffset":22828,"count":0},{"startOffset":22830,"endOffset":22880,"count":0},{"startOffset":22957,"endOffset":23027,"count":0}],"isBlockCoverage":true},{"functionName":"serialize","ranges":[{"startOffset":23390,"endOffset":27539,"count":2}],"isBlockCoverage":true},{"functionName":"set_defaults","ranges":[{"startOffset":27542,"endOffset":29204,"count":2},{"startOffset":28840,"endOffset":29200,"count":4},{"startOffset":29060,"endOffset":29194,"count":2}],"isBlockCoverage":true}]},{"scriptId":"938","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_json_handler.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9331,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":128,"endOffset":1978,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":345,"endOffset":842,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":951,"endOffset":1301,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1457,"endOffset":1954,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_aff_filter","ranges":[{"startOffset":1982,"endOffset":2700,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_filter$keep_node","ranges":[{"startOffset":2703,"endOffset":6362,"count":32},{"startOffset":3793,"endOffset":3824,"count":20},{"startOffset":3886,"endOffset":3988,"count":12},{"startOffset":4669,"endOffset":4787,"count":2},{"startOffset":4789,"endOffset":4862,"count":2},{"startOffset":4862,"endOffset":5480,"count":30},{"startOffset":5276,"endOffset":5394,"count":2},{"startOffset":5396,"endOffset":5474,"count":2},{"startOffset":5480,"endOffset":5566,"count":28},{"startOffset":5566,"endOffset":5647,"count":2},{"startOffset":5648,"endOffset":5766,"count":1},{"startOffset":5768,"endOffset":5841,"count":1},{"startOffset":5841,"endOffset":5969,"count":27},{"startOffset":5969,"endOffset":6023,"count":7},{"startOffset":6025,"endOffset":6221,"count":20},{"startOffset":6224,"endOffset":6297,"count":10},{"startOffset":6297,"endOffset":6361,"count":17}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":4195,"endOffset":4293,"count":63},{"startOffset":4243,"endOffset":4291,"count":4}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":4322,"endOffset":4344,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":4368,"endOffset":4391,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":4931,"endOffset":4980,"count":59}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":5011,"endOffset":5033,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":6365,"endOffset":7739,"count":2}],"isBlockCoverage":true}]},{"scriptId":"939","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_log.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":38350,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":3796,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":281,"endOffset":1547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1629,"endOffset":1693,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1791,"endOffset":2066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2167,"endOffset":2460,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2620,"endOffset":2693,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2735,"endOffset":3259,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3357,"endOffset":3421,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3520,"endOffset":3634,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3674,"endOffset":3772,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_log","ranges":[{"startOffset":3800,"endOffset":5419,"count":51}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":5422,"endOffset":5668,"count":51},{"startOffset":5533,"endOffset":5550,"count":1},{"startOffset":5552,"endOffset":5583,"count":1}],"isBlockCoverage":true},{"functionName":"from_exception","ranges":[{"startOffset":5671,"endOffset":5754,"count":0}],"isBlockCoverage":false},{"functionName":"from_exception","ranges":[{"startOffset":5764,"endOffset":6289,"count":2},{"startOffset":6187,"endOffset":6266,"count":1}],"isBlockCoverage":true},{"functionName":"get_messages_status","ranges":[{"startOffset":6292,"endOffset":8389,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_log$add","ranges":[{"startOffset":8392,"endOffset":11913,"count":26},{"startOffset":8637,"endOffset":8666,"count":23},{"startOffset":8727,"endOffset":8776,"count":3},{"startOffset":9407,"endOffset":9436,"count":23},{"startOffset":9569,"endOffset":9596,"count":3},{"startOffset":11053,"endOffset":11120,"count":18},{"startOffset":11121,"endOffset":11188,"count":18},{"startOffset":11190,"endOffset":11314,"count":8},{"startOffset":11314,"endOffset":11909,"count":18},{"startOffset":11390,"endOffset":11516,"count":14},{"startOffset":11516,"endOffset":11909,"count":4},{"startOffset":11591,"endOffset":11658,"count":0},{"startOffset":11783,"endOffset":11909,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$add_error","ranges":[{"startOffset":11916,"endOffset":12840,"count":2},{"startOffset":12688,"endOffset":12717,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$add_exception","ranges":[{"startOffset":12843,"endOffset":14461,"count":3},{"startOffset":13678,"endOffset":13707,"count":0},{"startOffset":14318,"endOffset":14370,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$add_info","ranges":[{"startOffset":14464,"endOffset":15387,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_log$add_success","ranges":[{"startOffset":15390,"endOffset":16316,"count":4},{"startOffset":16164,"endOffset":16193,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$add_warning","ranges":[{"startOffset":16319,"endOffset":17245,"count":14},{"startOffset":17093,"endOffset":17122,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$clear","ranges":[{"startOffset":17248,"endOffset":17323,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$clone","ranges":[{"startOffset":17326,"endOffset":17787,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$count","ranges":[{"startOffset":17790,"endOffset":17969,"count":17}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$get_item_status","ranges":[{"startOffset":17972,"endOffset":25579,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_log$get_log_level","ranges":[{"startOffset":25582,"endOffset":27424,"count":5},{"startOffset":26966,"endOffset":27399,"count":9},{"startOffset":27138,"endOffset":27257,"count":2},{"startOffset":27257,"endOffset":27393,"count":7}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$get_messages","ranges":[{"startOffset":27427,"endOffset":30257,"count":13},{"startOffset":29732,"endOffset":30167,"count":17}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$get_status","ranges":[{"startOffset":30260,"endOffset":32809,"count":6},{"startOffset":31648,"endOffset":32783,"count":8},{"startOffset":31808,"endOffset":31875,"count":5},{"startOffset":31876,"endOffset":31943,"count":5},{"startOffset":31945,"endOffset":32062,"count":3},{"startOffset":32062,"endOffset":32777,"count":5},{"startOffset":32138,"endOffset":32260,"count":2},{"startOffset":32260,"endOffset":32777,"count":3},{"startOffset":32335,"endOffset":32402,"count":0},{"startOffset":32647,"endOffset":32777,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$get_title","ranges":[{"startOffset":32812,"endOffset":33082,"count":2},{"startOffset":32990,"endOffset":33057,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$merge_with","ranges":[{"startOffset":33085,"endOffset":35698,"count":3},{"startOffset":33534,"endOffset":33573,"count":2},{"startOffset":33639,"endOffset":33688,"count":1},{"startOffset":35254,"endOffset":35532,"count":2},{"startOffset":35532,"endOffset":35644,"count":1}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":35367,"endOffset":35432,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_log$set_title","ranges":[{"startOffset":35701,"endOffset":36052,"count":53}],"isBlockCoverage":true}]},{"scriptId":"940","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_log_viewer.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":59294,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":13486,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":285,"endOffset":1810,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1975,"endOffset":3500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3542,"endOffset":3660,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3758,"endOffset":5066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5162,"endOffset":6470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6569,"endOffset":7877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7979,"endOffset":9287,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9382,"endOffset":9442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9484,"endOffset":9548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9641,"endOffset":10949,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10994,"endOffset":11057,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11239,"endOffset":11316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11358,"endOffset":12666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12759,"endOffset":12877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12970,"endOffset":13090,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13132,"endOffset":13250,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13344,"endOffset":13462,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_log_viewer","ranges":[{"startOffset":13490,"endOffset":13624,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":13627,"endOffset":13740,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_cell_type","ranges":[{"startOffset":13743,"endOffset":13833,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_cell_type","ranges":[{"startOffset":13843,"endOffset":16918,"count":0}],"isBlockCoverage":false},{"functionName":"dispatch","ranges":[{"startOffset":16921,"endOffset":16999,"count":0}],"isBlockCoverage":false},{"functionName":"dispatch","ranges":[{"startOffset":17009,"endOffset":19115,"count":0}],"isBlockCoverage":false},{"functionName":"get_exception_viewer","ranges":[{"startOffset":19118,"endOffset":19220,"count":0}],"isBlockCoverage":false},{"functionName":"get_exception_viewer","ranges":[{"startOffset":19230,"endOffset":21160,"count":0}],"isBlockCoverage":false},{"functionName":"goto_callstack","ranges":[{"startOffset":21163,"endOffset":21253,"count":0}],"isBlockCoverage":false},{"functionName":"goto_callstack","ranges":[{"startOffset":21263,"endOffset":22752,"count":0}],"isBlockCoverage":false},{"functionName":"goto_source","ranges":[{"startOffset":22755,"endOffset":22839,"count":0}],"isBlockCoverage":false},{"functionName":"goto_source","ranges":[{"startOffset":22849,"endOffset":24332,"count":0}],"isBlockCoverage":false},{"functionName":"goto_t100_message","ranges":[{"startOffset":24335,"endOffset":24431,"count":0}],"isBlockCoverage":false},{"functionName":"goto_t100_message","ranges":[{"startOffset":24441,"endOffset":25931,"count":0}],"isBlockCoverage":false},{"functionName":"on_link_click","ranges":[{"startOffset":25934,"endOffset":26022,"count":0}],"isBlockCoverage":false},{"functionName":"on_link_click","ranges":[{"startOffset":26032,"endOffset":28499,"count":0}],"isBlockCoverage":false},{"functionName":"prepare_log_for_display","ranges":[{"startOffset":28502,"endOffset":28610,"count":0}],"isBlockCoverage":false},{"functionName":"prepare_log_for_display","ranges":[{"startOffset":28620,"endOffset":35584,"count":0}],"isBlockCoverage":false},{"functionName":"show_log","ranges":[{"startOffset":35587,"endOffset":35665,"count":0}],"isBlockCoverage":false},{"functionName":"show_log","ranges":[{"startOffset":35675,"endOffset":44719,"count":0}],"isBlockCoverage":false},{"functionName":"show_longtext","ranges":[{"startOffset":44722,"endOffset":44810,"count":0}],"isBlockCoverage":false},{"functionName":"show_longtext","ranges":[{"startOffset":44820,"endOffset":49184,"count":0}],"isBlockCoverage":false},{"functionName":"to_html","ranges":[{"startOffset":49189,"endOffset":49269,"count":0}],"isBlockCoverage":false},{"functionName":"to_html","ranges":[{"startOffset":49281,"endOffset":52369,"count":0}],"isBlockCoverage":false},{"functionName":"write_log","ranges":[{"startOffset":52374,"endOffset":52458,"count":0}],"isBlockCoverage":false},{"functionName":"write_log","ranges":[{"startOffset":52470,"endOffset":54706,"count":0}],"isBlockCoverage":false}]},{"scriptId":"941","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_login_manager.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9374,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":2441,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":295,"endOffset":774,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":918,"endOffset":982,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1025,"endOffset":1089,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1188,"endOffset":1252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1294,"endOffset":1358,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1447,"endOffset":1511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1563,"endOffset":1627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1766,"endOffset":1830,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1872,"endOffset":1936,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1983,"endOffset":2047,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2094,"endOffset":2158,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2247,"endOffset":2311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2353,"endOffset":2417,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_login_manager","ranges":[{"startOffset":2445,"endOffset":2584,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2587,"endOffset":2700,"count":0}],"isBlockCoverage":false},{"functionName":"append","ranges":[{"startOffset":2703,"endOffset":2780,"count":0}],"isBlockCoverage":false},{"functionName":"append","ranges":[{"startOffset":2790,"endOffset":4078,"count":3}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":3561,"endOffset":3611,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":3640,"endOffset":3661,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":4081,"endOffset":4146,"count":0}],"isBlockCoverage":false},{"functionName":"clear","ranges":[{"startOffset":4156,"endOffset":4237,"count":6}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":4240,"endOffset":4311,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":4321,"endOffset":5375,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":5016,"endOffset":5066,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":5095,"endOffset":5116,"count":0}],"isBlockCoverage":false},{"functionName":"load","ranges":[{"startOffset":5378,"endOffset":5451,"count":0}],"isBlockCoverage":false},{"functionName":"load","ranges":[{"startOffset":5461,"endOffset":6543,"count":4},{"startOffset":6446,"endOffset":6510,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":6166,"endOffset":6216,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":6245,"endOffset":6266,"count":0}],"isBlockCoverage":false},{"functionName":"save","ranges":[{"startOffset":6546,"endOffset":6619,"count":0}],"isBlockCoverage":false},{"functionName":"save","ranges":[{"startOffset":6629,"endOffset":7080,"count":3},{"startOffset":6999,"endOffset":7076,"count":1}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":7083,"endOffset":7154,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":7164,"endOffset":8385,"count":2},{"startOffset":7887,"endOffset":7916,"count":0}],"isBlockCoverage":true}]},{"scriptId":"942","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_longtexts.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":42574,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":4659,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":318,"endOffset":413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":565,"endOffset":613,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":663,"endOffset":710,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":760,"endOffset":802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":897,"endOffset":3426,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3476,"endOffset":3518,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3568,"endOffset":3615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3659,"endOffset":4337,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4390,"endOffset":4487,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4538,"endOffset":4635,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_longtexts","ranges":[{"startOffset":4663,"endOffset":4822,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4825,"endOffset":4938,"count":2},{"startOffset":4881,"endOffset":4917,"count":0}],"isBlockCoverage":true},{"functionName":"escape_name","ranges":[{"startOffset":4941,"endOffset":5947,"count":7},{"startOffset":5448,"endOffset":5551,"count":5},{"startOffset":5551,"endOffset":5736,"count":2},{"startOffset":5633,"endOffset":5736,"count":0}],"isBlockCoverage":true},{"functionName":"read","ranges":[{"startOffset":5950,"endOffset":16792,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_longtexts$changed_by","ranges":[{"startOffset":16795,"endOffset":23444,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_longtexts$delete","ranges":[{"startOffset":23447,"endOffset":26549,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_longtexts$deserialize","ranges":[{"startOffset":26554,"endOffset":37404,"count":3},{"startOffset":26844,"endOffset":26910,"count":0},{"startOffset":34078,"endOffset":34897,"count":0},{"startOffset":35244,"endOffset":37396,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":35343,"endOffset":35612,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":35645,"endOffset":35677,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":35715,"endOffset":35750,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":35791,"endOffset":35827,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":35869,"endOffset":35902,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_longtexts$serialize","ranges":[{"startOffset":37411,"endOffset":42228,"count":0}],"isBlockCoverage":false}]},{"scriptId":"943","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_news.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":25225,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":6413,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":267,"endOffset":1020,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1112,"endOffset":1176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1269,"endOffset":1333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1424,"endOffset":1488,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1575,"endOffset":1635,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1791,"endOffset":1855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1950,"endOffset":2496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2539,"endOffset":2603,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2657,"endOffset":2721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2811,"endOffset":3564,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3608,"endOffset":3866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3920,"endOffset":3984,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4080,"endOffset":4196,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4239,"endOffset":4355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4447,"endOffset":5200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5297,"endOffset":5394,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5496,"endOffset":5593,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5693,"endOffset":5790,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5889,"endOffset":5986,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6086,"endOffset":6152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6207,"endOffset":6271,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6325,"endOffset":6389,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_news","ranges":[{"startOffset":6417,"endOffset":7556,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7559,"endOffset":9805,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":9808,"endOffset":9876,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":9886,"endOffset":15214,"count":0}],"isBlockCoverage":false},{"functionName":"get_log","ranges":[{"startOffset":15217,"endOffset":16042,"count":0}],"isBlockCoverage":false},{"functionName":"has_important","ranges":[{"startOffset":16045,"endOffset":16601,"count":0}],"isBlockCoverage":false},{"functionName":"has_news","ranges":[{"startOffset":16604,"endOffset":16883,"count":0}],"isBlockCoverage":false},{"functionName":"has_unseen","ranges":[{"startOffset":16886,"endOffset":17244,"count":0}],"isBlockCoverage":false},{"functionName":"has_updates","ranges":[{"startOffset":17247,"endOffset":17605,"count":0}],"isBlockCoverage":false},{"functionName":"latest_version","ranges":[{"startOffset":17608,"endOffset":17774,"count":0}],"isBlockCoverage":false},{"functionName":"parse","ranges":[{"startOffset":17777,"endOffset":17843,"count":0}],"isBlockCoverage":false},{"functionName":"parse","ranges":[{"startOffset":17853,"endOffset":21514,"count":3},{"startOffset":20098,"endOffset":21491,"count":36},{"startOffset":20295,"endOffset":20419,"count":19},{"startOffset":20363,"endOffset":20418,"count":6},{"startOffset":20422,"endOffset":20449,"count":20},{"startOffset":20449,"endOffset":20526,"count":16},{"startOffset":20526,"endOffset":20833,"count":3},{"startOffset":20759,"endOffset":20825,"count":1},{"startOffset":20833,"endOffset":20909,"count":16},{"startOffset":20909,"endOffset":21360,"count":8},{"startOffset":21082,"endOffset":21306,"count":5},{"startOffset":21157,"endOffset":21258,"count":3},{"startOffset":21258,"endOffset":21296,"count":2},{"startOffset":21306,"endOffset":21360,"count":6},{"startOffset":21360,"endOffset":21421,"count":8},{"startOffset":21421,"endOffset":21491,"count":14}],"isBlockCoverage":true},{"functionName":"parse_line","ranges":[{"startOffset":21517,"endOffset":21593,"count":0}],"isBlockCoverage":false},{"functionName":"parse_line","ranges":[{"startOffset":21603,"endOffset":23650,"count":43},{"startOffset":22763,"endOffset":22830,"count":42},{"startOffset":22832,"endOffset":22860,"count":20},{"startOffset":22860,"endOffset":23022,"count":23},{"startOffset":23022,"endOffset":23368,"count":10},{"startOffset":23368,"endOffset":23591,"count":13},{"startOffset":23591,"endOffset":23649,"count":23}],"isBlockCoverage":true}]},{"scriptId":"944","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_object_devc.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":82039,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":249,"endOffset":4600,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":443,"endOffset":539,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":640,"endOffset":774,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":877,"endOffset":1350,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1503,"endOffset":1611,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1718,"endOffset":1826,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1875,"endOffset":1934,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2031,"endOffset":2139,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2182,"endOffset":2279,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2390,"endOffset":2498,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2596,"endOffset":2693,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2744,"endOffset":2840,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2941,"endOffset":3049,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3100,"endOffset":3196,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3294,"endOffset":3391,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3442,"endOffset":3538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3653,"endOffset":3749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3846,"endOffset":4440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4487,"endOffset":4576,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_object_devc","ranges":[{"startOffset":4604,"endOffset":5131,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5134,"endOffset":6290,"count":0}],"isBlockCoverage":false},{"functionName":"get_package","ranges":[{"startOffset":6293,"endOffset":6647,"count":0}],"isBlockCoverage":false},{"functionName":"is_empty","ranges":[{"startOffset":6650,"endOffset":8193,"count":0}],"isBlockCoverage":false},{"functionName":"is_local","ranges":[{"startOffset":8196,"endOffset":9070,"count":0}],"isBlockCoverage":false},{"functionName":"load_package","ranges":[{"startOffset":9073,"endOffset":10549,"count":0}],"isBlockCoverage":false},{"functionName":"remove_obsolete_tadir","ranges":[{"startOffset":10554,"endOffset":15274,"count":0}],"isBlockCoverage":false},{"functionName":"set_lock","ranges":[{"startOffset":15281,"endOffset":23368,"count":0}],"isBlockCoverage":false},{"functionName":"unlock_and_raise_error","ranges":[{"startOffset":23383,"endOffset":24146,"count":0}],"isBlockCoverage":false},{"functionName":"update_pinf_usages","ranges":[{"startOffset":24161,"endOffset":31814,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$changed_by","ranges":[{"startOffset":31837,"endOffset":32619,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$delete","ranges":[{"startOffset":32642,"endOffset":41225,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$deserialize","ranges":[{"startOffset":41256,"endOffset":56901,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$exists","ranges":[{"startOffset":56938,"endOffset":58684,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_comparator","ranges":[{"startOffset":58723,"endOffset":59108,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_deserialize_order","ranges":[{"startOffset":59147,"endOffset":61214,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_deserialize_steps","ranges":[{"startOffset":61253,"endOffset":61949,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_metadata","ranges":[{"startOffset":61988,"endOffset":62556,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$is_active","ranges":[{"startOffset":62595,"endOffset":62951,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$is_locked","ranges":[{"startOffset":62990,"endOffset":63977,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$jump","ranges":[{"startOffset":64016,"endOffset":64493,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_filename_to_object","ranges":[{"startOffset":64532,"endOffset":64749,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_filename_to_object","ranges":[{"startOffset":64795,"endOffset":67215,"count":4},{"startOffset":66644,"endOffset":66906,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_object$map_object_to_filename","ranges":[{"startOffset":67254,"endOffset":67471,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_object_to_filename","ranges":[{"startOffset":67517,"endOffset":68676,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_object$serialize","ranges":[{"startOffset":68715,"endOffset":80755,"count":0}],"isBlockCoverage":false}]},{"scriptId":"945","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_super.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":31251,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":6586,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":295,"endOffset":889,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":977,"endOffset":1107,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1192,"endOffset":1281,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1369,"endOffset":1463,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1618,"endOffset":1915,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2015,"endOffset":2111,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2162,"endOffset":2205,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2306,"endOffset":2402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2583,"endOffset":2680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2730,"endOffset":2794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2841,"endOffset":2895,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3003,"endOffset":3099,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3211,"endOffset":3303,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3407,"endOffset":3539,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3589,"endOffset":3636,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3680,"endOffset":4358,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4410,"endOffset":4474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4580,"endOffset":4710,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4760,"endOffset":4807,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4859,"endOffset":4923,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5032,"endOffset":5079,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5176,"endOffset":5273,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5373,"endOffset":5437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5482,"endOffset":5579,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5638,"endOffset":5735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5832,"endOffset":6426,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6473,"endOffset":6562,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_objects_super","ranges":[{"startOffset":6590,"endOffset":7582,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":7585,"endOffset":8686,"count":5}],"isBlockCoverage":true},{"functionName":"corr_insert","ranges":[{"startOffset":8689,"endOffset":9899,"count":0}],"isBlockCoverage":false},{"functionName":"delete_ddic","ranges":[{"startOffset":9902,"endOffset":15971,"count":0}],"isBlockCoverage":false},{"functionName":"delete_longtexts","ranges":[{"startOffset":15980,"endOffset":16365,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_longtexts","ranges":[{"startOffset":16374,"endOffset":17381,"count":3},{"startOffset":17021,"endOffset":17087,"count":0}],"isBlockCoverage":true},{"functionName":"exists_a_lock_entry_for","ranges":[{"startOffset":17390,"endOffset":19837,"count":0}],"isBlockCoverage":false},{"functionName":"get_metadata","ranges":[{"startOffset":19848,"endOffset":20762,"count":0}],"isBlockCoverage":false},{"functionName":"is_active","ranges":[{"startOffset":20773,"endOffset":21052,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_longtexts","ranges":[{"startOffset":21063,"endOffset":22871,"count":0}],"isBlockCoverage":false},{"functionName":"set_default_package","ranges":[{"startOffset":22882,"endOffset":23174,"count":0}],"isBlockCoverage":false},{"functionName":"set_default_transport","ranges":[{"startOffset":23185,"endOffset":23483,"count":0}],"isBlockCoverage":false},{"functionName":"tadir_delete","ranges":[{"startOffset":23494,"endOffset":26973,"count":0}],"isBlockCoverage":false},{"functionName":"tadir_insert","ranges":[{"startOffset":26986,"endOffset":30854,"count":0}],"isBlockCoverage":false}]},{"scriptId":"946","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_object_intf.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":96474,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":314,"endOffset":18909,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":520,"endOffset":658,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":747,"endOffset":1004,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1091,"endOffset":1343,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1444,"endOffset":1578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1681,"endOffset":2154,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2312,"endOffset":2442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2488,"endOffset":2584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2701,"endOffset":3376,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3490,"endOffset":4262,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4356,"endOffset":7968,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8010,"endOffset":8140,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8235,"endOffset":11847,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11955,"endOffset":12047,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12148,"endOffset":12278,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12321,"endOffset":13530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13630,"endOffset":14839,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14881,"endOffset":15013,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15068,"endOffset":15375,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15421,"endOffset":15521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15629,"endOffset":16304,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16346,"endOffset":16478,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16524,"endOffset":16624,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16736,"endOffset":17508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17550,"endOffset":17682,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17728,"endOffset":17828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17926,"endOffset":18058,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18155,"endOffset":18749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18796,"endOffset":18885,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_object_intf","ranges":[{"startOffset":18913,"endOffset":19626,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":19629,"endOffset":20728,"count":1}],"isBlockCoverage":true},{"functionName":"deserialize_descriptions","ranges":[{"startOffset":20731,"endOffset":21936,"count":1}],"isBlockCoverage":true},{"functionName":"deserialize_descr_sub","ranges":[{"startOffset":21939,"endOffset":23242,"count":1}],"isBlockCoverage":true},{"functionName":"deserialize_docu","ranges":[{"startOffset":23245,"endOffset":27037,"count":1},{"startOffset":25499,"endOffset":25743,"count":0},{"startOffset":26078,"endOffset":26435,"count":0}],"isBlockCoverage":true},{"functionName":"deserialize_pre_ddic","ranges":[{"startOffset":27040,"endOffset":31670,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_proxy","ranges":[{"startOffset":31673,"endOffset":33382,"count":0}],"isBlockCoverage":false},{"functionName":"read_json","ranges":[{"startOffset":33385,"endOffset":42712,"count":0}],"isBlockCoverage":false},{"functionName":"read_xml","ranges":[{"startOffset":42715,"endOffset":47320,"count":1}],"isBlockCoverage":true},{"functionName":"serialize_descr","ranges":[{"startOffset":47323,"endOffset":50559,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_descr_sub","ranges":[{"startOffset":50562,"endOffset":54000,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_docu","ranges":[{"startOffset":54003,"endOffset":59077,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_xml","ranges":[{"startOffset":59080,"endOffset":66391,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$changed_by","ranges":[{"startOffset":66394,"endOffset":69358,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$delete","ranges":[{"startOffset":69365,"endOffset":71478,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$deserialize","ranges":[{"startOffset":71485,"endOffset":78575,"count":1},{"startOffset":76868,"endOffset":76932,"count":0},{"startOffset":77114,"endOffset":77199,"count":0},{"startOffset":78162,"endOffset":78567,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_object$exists","ranges":[{"startOffset":78582,"endOffset":80252,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_comparator","ranges":[{"startOffset":80259,"endOffset":80516,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_deserialize_order","ranges":[{"startOffset":80523,"endOffset":82398,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_deserialize_steps","ranges":[{"startOffset":82405,"endOffset":83111,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_metadata","ranges":[{"startOffset":83118,"endOffset":83558,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$is_active","ranges":[{"startOffset":83565,"endOffset":83793,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$is_locked","ranges":[{"startOffset":83800,"endOffset":84522,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$jump","ranges":[{"startOffset":84529,"endOffset":84846,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_filename_to_object","ranges":[{"startOffset":84853,"endOffset":85006,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_filename_to_object","ranges":[{"startOffset":85020,"endOffset":86439,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_object_to_filename","ranges":[{"startOffset":86446,"endOffset":86599,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_object_to_filename","ranges":[{"startOffset":86613,"endOffset":87512,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_object$serialize","ranges":[{"startOffset":87519,"endOffset":89505,"count":0}],"isBlockCoverage":false}]},{"scriptId":"947","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_program.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":124707,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":257,"endOffset":27783,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":502,"endOffset":560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":603,"endOffset":661,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":989,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1094,"endOffset":4244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4286,"endOffset":4344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4448,"endOffset":4502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4546,"endOffset":4609,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4712,"endOffset":6029,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6074,"endOffset":6437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6481,"endOffset":6535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6581,"endOffset":6677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6780,"endOffset":8097,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8142,"endOffset":8505,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8549,"endOffset":8603,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8706,"endOffset":10023,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10136,"endOffset":10256,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10361,"endOffset":11193,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11244,"endOffset":11338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11436,"endOffset":14586,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14637,"endOffset":14731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14839,"endOffset":15671,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15780,"endOffset":15874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15918,"endOffset":15981,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16028,"endOffset":16126,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16175,"endOffset":16272,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16381,"endOffset":16475,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16517,"endOffset":19667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19789,"endOffset":19886,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19932,"endOffset":20026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20134,"endOffset":20231,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20277,"endOffset":20371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20481,"endOffset":20578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20624,"endOffset":20718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20814,"endOffset":21408,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21452,"endOffset":21515,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21612,"endOffset":22206,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22250,"endOffset":22844,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22946,"endOffset":23078,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23121,"endOffset":23715,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23759,"endOffset":23893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23939,"endOffset":24033,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24077,"endOffset":24119,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24220,"endOffset":25537,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25583,"endOffset":25677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25785,"endOffset":27102,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27147,"endOffset":27510,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27554,"endOffset":27617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27663,"endOffset":27759,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_objects_program","ranges":[{"startOffset":27787,"endOffset":27885,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":27888,"endOffset":28001,"count":5}],"isBlockCoverage":true},{"functionName":"add_tpool","ranges":[{"startOffset":28004,"endOffset":28089,"count":0}],"isBlockCoverage":false},{"functionName":"add_tpool","ranges":[{"startOffset":28099,"endOffset":29917,"count":0}],"isBlockCoverage":false},{"functionName":"auto_correct_cua_adm","ranges":[{"startOffset":29920,"endOffset":30027,"count":0}],"isBlockCoverage":false},{"functionName":"auto_correct_cua_adm","ranges":[{"startOffset":30037,"endOffset":35205,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_cua","ranges":[{"startOffset":35208,"endOffset":42280,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_dynpros","ranges":[{"startOffset":42285,"endOffset":51606,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_program","ranges":[{"startOffset":51617,"endOffset":55212,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_textpool","ranges":[{"startOffset":55223,"endOffset":57868,"count":0}],"isBlockCoverage":false},{"functionName":"get_program_title","ranges":[{"startOffset":57879,"endOffset":59329,"count":0}],"isBlockCoverage":false},{"functionName":"insert_program","ranges":[{"startOffset":59342,"endOffset":63908,"count":0}],"isBlockCoverage":false},{"functionName":"is_any_dynpro_locked","ranges":[{"startOffset":63923,"endOffset":66683,"count":0}],"isBlockCoverage":false},{"functionName":"is_cua_locked","ranges":[{"startOffset":66698,"endOffset":67680,"count":0}],"isBlockCoverage":false},{"functionName":"is_text_locked","ranges":[{"startOffset":67695,"endOffset":68447,"count":0}],"isBlockCoverage":false},{"functionName":"read_progdir","ranges":[{"startOffset":68462,"endOffset":72842,"count":0}],"isBlockCoverage":false},{"functionName":"read_tpool","ranges":[{"startOffset":72857,"endOffset":72968,"count":0}],"isBlockCoverage":false},{"functionName":"read_tpool","ranges":[{"startOffset":72990,"endOffset":75835,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_cua","ranges":[{"startOffset":75850,"endOffset":80928,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_dynpros","ranges":[{"startOffset":80945,"endOffset":91684,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_program","ranges":[{"startOffset":91705,"endOffset":104576,"count":0}],"isBlockCoverage":false},{"functionName":"strip_generation_comments","ranges":[{"startOffset":104599,"endOffset":108352,"count":4},{"startOffset":105085,"endOffset":105146,"count":1},{"startOffset":105146,"endOffset":105494,"count":3},{"startOffset":105496,"endOffset":105673,"count":1},{"startOffset":105673,"endOffset":105790,"count":2},{"startOffset":105790,"endOffset":105851,"count":0},{"startOffset":105851,"endOffset":106234,"count":2},{"startOffset":106234,"endOffset":106295,"count":0},{"startOffset":106295,"endOffset":106675,"count":2},{"startOffset":106675,"endOffset":106736,"count":0},{"startOffset":106736,"endOffset":107134,"count":2},{"startOffset":107134,"endOffset":107595,"count":1},{"startOffset":107595,"endOffset":107656,"count":0},{"startOffset":107656,"endOffset":108039,"count":1},{"startOffset":108039,"endOffset":108100,"count":0},{"startOffset":108100,"endOffset":108351,"count":1}],"isBlockCoverage":true},{"functionName":"uncondense_flow","ranges":[{"startOffset":108375,"endOffset":110153,"count":0}],"isBlockCoverage":false},{"functionName":"update_progdir","ranges":[{"startOffset":110176,"endOffset":117674,"count":0}],"isBlockCoverage":false},{"functionName":"update_program","ranges":[{"startOffset":117701,"endOffset":122770,"count":0}],"isBlockCoverage":false}]},{"scriptId":"948","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_object_intf.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":193379,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":221,"endOffset":39736,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":483,"endOffset":1050,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1099,"endOffset":1720,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1819,"endOffset":3490,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3539,"endOffset":4160,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4213,"endOffset":4874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4971,"endOffset":5538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5587,"endOffset":6208,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6306,"endOffset":7408,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7457,"endOffset":8078,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8131,"endOffset":8792,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8894,"endOffset":8994,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9041,"endOffset":9130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9179,"endOffset":13183,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13288,"endOffset":13388,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13435,"endOffset":13524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13573,"endOffset":17577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17678,"endOffset":17778,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17825,"endOffset":17914,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17963,"endOffset":21967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22067,"endOffset":22167,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22214,"endOffset":22303,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22352,"endOffset":26356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26476,"endOffset":30480,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30527,"endOffset":30625,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30673,"endOffset":30773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30895,"endOffset":34899,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34946,"endOffset":35044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35092,"endOffset":35192,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35239,"endOffset":35304,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35423,"endOffset":35523,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35570,"endOffset":35659,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35708,"endOffset":39712,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_aff_helper","ranges":[{"startOffset":39740,"endOffset":39825,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":39828,"endOffset":39941,"count":0}],"isBlockCoverage":false},{"functionName":"get_descr_comp_subc_w_exposure","ranges":[{"startOffset":39944,"endOffset":40058,"count":0}],"isBlockCoverage":false},{"functionName":"get_descr_comp_subc_w_exposure","ranges":[{"startOffset":40068,"endOffset":48241,"count":0}],"isBlockCoverage":false},{"functionName":"get_descriptions_compo_subco","ranges":[{"startOffset":48244,"endOffset":48354,"count":0}],"isBlockCoverage":false},{"functionName":"get_descriptions_compo_subco","ranges":[{"startOffset":48364,"endOffset":57496,"count":2},{"startOffset":56731,"endOffset":56994,"count":0}],"isBlockCoverage":true},{"functionName":"get_attributes","ranges":[{"startOffset":57499,"endOffset":57581,"count":0}],"isBlockCoverage":false},{"functionName":"get_attributes","ranges":[{"startOffset":57591,"endOffset":60286,"count":2},{"startOffset":59991,"endOffset":60260,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":59775,"endOffset":59917,"count":0}],"isBlockCoverage":false},{"functionName":"get_methods","ranges":[{"startOffset":60289,"endOffset":60365,"count":0}],"isBlockCoverage":false},{"functionName":"get_methods","ranges":[{"startOffset":60375,"endOffset":68423,"count":2},{"startOffset":66880,"endOffset":68397,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":66716,"endOffset":66809,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":67143,"endOffset":67224,"count":0}],"isBlockCoverage":false},{"functionName":"get_types","ranges":[{"startOffset":68426,"endOffset":68498,"count":0}],"isBlockCoverage":false},{"functionName":"get_types","ranges":[{"startOffset":68508,"endOffset":71152,"count":2},{"startOffset":70884,"endOffset":71126,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":70678,"endOffset":70815,"count":0}],"isBlockCoverage":false},{"functionName":"get_events","ranges":[{"startOffset":71155,"endOffset":71229,"count":0}],"isBlockCoverage":false},{"functionName":"get_events","ranges":[{"startOffset":71239,"endOffset":77196,"count":2},{"startOffset":76259,"endOffset":77170,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":76097,"endOffset":76189,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":76508,"endOffset":76585,"count":0}],"isBlockCoverage":false},{"functionName":"set_attributes","ranges":[{"startOffset":77199,"endOffset":77281,"count":0}],"isBlockCoverage":false},{"functionName":"set_attributes","ranges":[{"startOffset":77291,"endOffset":83071,"count":0}],"isBlockCoverage":false},{"functionName":"set_methods","ranges":[{"startOffset":83074,"endOffset":83150,"count":0}],"isBlockCoverage":false},{"functionName":"set_methods","ranges":[{"startOffset":83160,"endOffset":93071,"count":0}],"isBlockCoverage":false},{"functionName":"set_events","ranges":[{"startOffset":93074,"endOffset":93148,"count":0}],"isBlockCoverage":false},{"functionName":"set_events","ranges":[{"startOffset":93158,"endOffset":100956,"count":0}],"isBlockCoverage":false},{"functionName":"set_types","ranges":[{"startOffset":100959,"endOffset":101031,"count":0}],"isBlockCoverage":false},{"functionName":"set_types","ranges":[{"startOffset":101041,"endOffset":106761,"count":0}],"isBlockCoverage":false},{"functionName":"set_descriptions_compo_subco","ranges":[{"startOffset":106764,"endOffset":106874,"count":0}],"isBlockCoverage":false},{"functionName":"set_descriptions_compo_subco","ranges":[{"startOffset":106884,"endOffset":111838,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":114168,"endOffset":121088,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":114477,"endOffset":114577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":114624,"endOffset":119511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":119562,"endOffset":120237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":120292,"endOffset":121064,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_aff_type_mapping","ranges":[{"startOffset":121092,"endOffset":121177,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":121180,"endOffset":121293,"count":2},{"startOffset":121236,"endOffset":121272,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_aff_type_mapping$to_aff","ranges":[{"startOffset":121296,"endOffset":130972,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_aff_type_mapping$to_abapgit","ranges":[{"startOffset":130975,"endOffset":141131,"count":0}],"isBlockCoverage":false},{"functionName":"set_abapgit_descriptions","ranges":[{"startOffset":141134,"endOffset":155864,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":155992,"endOffset":166813,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":156262,"endOffset":157234,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":157339,"endOffset":157876,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":157973,"endOffset":158039,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":158082,"endOffset":161694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":161793,"endOffset":166680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":166723,"endOffset":166789,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_aff_metadata_handler","ranges":[{"startOffset":166817,"endOffset":166902,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":166905,"endOffset":167018,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":167021,"endOffset":167103,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":167113,"endOffset":178619,"count":2},{"startOffset":178330,"endOffset":178593,"count":0}],"isBlockCoverage":true},{"functionName":"get_mappings","ranges":[{"startOffset":178622,"endOffset":178700,"count":0}],"isBlockCoverage":false},{"functionName":"get_mappings","ranges":[{"startOffset":178710,"endOffset":183589,"count":4}],"isBlockCoverage":true},{"functionName":"get_paths_to_skip","ranges":[{"startOffset":183592,"endOffset":183680,"count":0}],"isBlockCoverage":false},{"functionName":"get_paths_to_skip","ranges":[{"startOffset":183690,"endOffset":184853,"count":4}],"isBlockCoverage":true},{"functionName":"deserialize","ranges":[{"startOffset":184856,"endOffset":184942,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":184952,"endOffset":193141,"count":2},{"startOffset":192836,"endOffset":193115,"count":0}],"isBlockCoverage":true}]},{"scriptId":"949","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":181815,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":46338,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":291,"endOffset":1506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1602,"endOffset":2075,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2178,"endOffset":2275,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2431,"endOffset":3316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3418,"endOffset":3482,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3525,"endOffset":4119,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4227,"endOffset":4323,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4425,"endOffset":4521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4564,"endOffset":5158,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5206,"endOffset":5298,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5409,"endOffset":5533,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5578,"endOffset":6463,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6508,"endOffset":7560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7602,"endOffset":7720,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7824,"endOffset":9773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9815,"endOffset":9933,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9981,"endOffset":10073,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10117,"endOffset":10770,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10875,"endOffset":12606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12648,"endOffset":12766,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12814,"endOffset":12906,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12950,"endOffset":13603,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13713,"endOffset":13802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13846,"endOffset":14658,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14756,"endOffset":14880,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14923,"endOffset":15517,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15567,"endOffset":15697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15744,"endOffset":16041,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16091,"endOffset":16188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16293,"endOffset":17105,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17149,"endOffset":17958,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18065,"endOffset":18877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18923,"endOffset":20282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20390,"endOffset":22339,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22446,"endOffset":22542,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22589,"endOffset":22636,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22748,"endOffset":23342,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23384,"endOffset":23502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23616,"endOffset":24339,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24381,"endOffset":24511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24568,"endOffset":24665,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24775,"endOffset":24839,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24886,"endOffset":24950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25055,"endOffset":26625,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26668,"endOffset":27262,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27312,"endOffset":27442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27549,"endOffset":28202,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28245,"endOffset":28361,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":28406,"endOffset":32968,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33010,"endOffset":33128,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33234,"endOffset":37796,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37839,"endOffset":37955,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38048,"endOffset":38857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38902,"endOffset":39585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39627,"endOffset":39745,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39835,"endOffset":40429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40476,"endOffset":41070,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41117,"endOffset":41181,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41231,"endOffset":41291,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41340,"endOffset":41437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41533,"endOffset":41627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41670,"endOffset":42264,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":42311,"endOffset":42905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":42952,"endOffset":43016,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43114,"endOffset":43211,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43254,"endOffset":43848,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43898,"endOffset":43995,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":44098,"endOffset":44195,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":44242,"endOffset":44289,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":44381,"endOffset":44478,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":44521,"endOffset":45115,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":45216,"endOffset":45483,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":45580,"endOffset":45677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":45720,"endOffset":46314,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_objects","ranges":[{"startOffset":46342,"endOffset":46673,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":46676,"endOffset":46789,"count":0}],"isBlockCoverage":false},{"functionName":"changed_by","ranges":[{"startOffset":46792,"endOffset":46871,"count":0}],"isBlockCoverage":false},{"functionName":"changed_by","ranges":[{"startOffset":46881,"endOffset":49308,"count":0}],"isBlockCoverage":false},{"functionName":"change_package_assignments","ranges":[{"startOffset":49311,"endOffset":49422,"count":0}],"isBlockCoverage":false},{"functionName":"change_package_assignments","ranges":[{"startOffset":49432,"endOffset":51769,"count":0}],"isBlockCoverage":false},{"functionName":"check_duplicates","ranges":[{"startOffset":51774,"endOffset":51869,"count":0}],"isBlockCoverage":false},{"functionName":"check_duplicates","ranges":[{"startOffset":51881,"endOffset":55926,"count":0}],"isBlockCoverage":false},{"functionName":"check_main_package","ranges":[{"startOffset":55931,"endOffset":56030,"count":0}],"isBlockCoverage":false},{"functionName":"check_main_package","ranges":[{"startOffset":56042,"endOffset":57708,"count":0}],"isBlockCoverage":false},{"functionName":"check_objects_locked","ranges":[{"startOffset":57715,"endOffset":57822,"count":0}],"isBlockCoverage":false},{"functionName":"check_objects_locked","ranges":[{"startOffset":57836,"endOffset":60509,"count":0}],"isBlockCoverage":false},{"functionName":"class_name","ranges":[{"startOffset":60516,"endOffset":60603,"count":0}],"isBlockCoverage":false},{"functionName":"class_name","ranges":[{"startOffset":60617,"endOffset":61579,"count":0}],"isBlockCoverage":false},{"functionName":"compare_remote_to_local","ranges":[{"startOffset":61586,"endOffset":61699,"count":0}],"isBlockCoverage":false},{"functionName":"compare_remote_to_local","ranges":[{"startOffset":61713,"endOffset":69447,"count":0}],"isBlockCoverage":false},{"functionName":"create_object","ranges":[{"startOffset":69454,"endOffset":69547,"count":0}],"isBlockCoverage":false},{"functionName":"create_object","ranges":[{"startOffset":69561,"endOffset":76187,"count":0}],"isBlockCoverage":false},{"functionName":"delete","ranges":[{"startOffset":76194,"endOffset":76273,"count":0}],"isBlockCoverage":false},{"functionName":"delete","ranges":[{"startOffset":76287,"endOffset":86823,"count":0}],"isBlockCoverage":false},{"functionName":"delete_object","ranges":[{"startOffset":86830,"endOffset":86923,"count":0}],"isBlockCoverage":false},{"functionName":"delete_object","ranges":[{"startOffset":86937,"endOffset":88471,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":88478,"endOffset":88567,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":88581,"endOffset":114412,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_checks","ranges":[{"startOffset":114419,"endOffset":114522,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_checks","ranges":[{"startOffset":114536,"endOffset":119467,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_objects","ranges":[{"startOffset":119474,"endOffset":119579,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_objects","ranges":[{"startOffset":119593,"endOffset":127599,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_steps","ranges":[{"startOffset":127606,"endOffset":127707,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_steps","ranges":[{"startOffset":127721,"endOffset":133079,"count":0}],"isBlockCoverage":false},{"functionName":"determine_i18n_params","ranges":[{"startOffset":133086,"endOffset":133195,"count":0}],"isBlockCoverage":false},{"functionName":"determine_i18n_params","ranges":[{"startOffset":133209,"endOffset":135175,"count":0}],"isBlockCoverage":false},{"functionName":"exists","ranges":[{"startOffset":135182,"endOffset":135261,"count":0}],"isBlockCoverage":false},{"functionName":"exists","ranges":[{"startOffset":135275,"endOffset":136924,"count":0}],"isBlockCoverage":false},{"functionName":"get_deserialize_steps","ranges":[{"startOffset":136931,"endOffset":137030,"count":0}],"isBlockCoverage":false},{"functionName":"get_deserialize_steps","ranges":[{"startOffset":137044,"endOffset":142533,"count":0}],"isBlockCoverage":false},{"functionName":"get_extra_from_filename","ranges":[{"startOffset":142540,"endOffset":142653,"count":0}],"isBlockCoverage":false},{"functionName":"get_extra_from_filename","ranges":[{"startOffset":142667,"endOffset":143401,"count":0}],"isBlockCoverage":false},{"functionName":"is_active","ranges":[{"startOffset":143408,"endOffset":143493,"count":0}],"isBlockCoverage":false},{"functionName":"is_active","ranges":[{"startOffset":143507,"endOffset":145301,"count":0}],"isBlockCoverage":false},{"functionName":"is_supported","ranges":[{"startOffset":145308,"endOffset":145399,"count":0}],"isBlockCoverage":false},{"functionName":"is_supported","ranges":[{"startOffset":145413,"endOffset":146953,"count":0}],"isBlockCoverage":false},{"functionName":"is_type_supported","ranges":[{"startOffset":146960,"endOffset":147061,"count":0}],"isBlockCoverage":false},{"functionName":"is_type_supported","ranges":[{"startOffset":147075,"endOffset":149590,"count":0}],"isBlockCoverage":false},{"functionName":"jump","ranges":[{"startOffset":149597,"endOffset":149672,"count":0}],"isBlockCoverage":false},{"functionName":"jump","ranges":[{"startOffset":149686,"endOffset":153413,"count":0}],"isBlockCoverage":false},{"functionName":"map_results_to_items","ranges":[{"startOffset":153420,"endOffset":153527,"count":0}],"isBlockCoverage":false},{"functionName":"map_results_to_items","ranges":[{"startOffset":153541,"endOffset":157977,"count":0}],"isBlockCoverage":false},{"functionName":"map_tadir_to_items","ranges":[{"startOffset":157984,"endOffset":158087,"count":0}],"isBlockCoverage":false},{"functionName":"map_tadir_to_items","ranges":[{"startOffset":158101,"endOffset":161508,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":161515,"endOffset":161600,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":161614,"endOffset":167797,"count":0}],"isBlockCoverage":false},{"functionName":"supported_list","ranges":[{"startOffset":167804,"endOffset":167889,"count":0}],"isBlockCoverage":false},{"functionName":"supported_list","ranges":[{"startOffset":167903,"endOffset":172926,"count":0}],"isBlockCoverage":false},{"functionName":"update_package_tree","ranges":[{"startOffset":172935,"endOffset":173044,"count":0}],"isBlockCoverage":false},{"functionName":"update_package_tree","ranges":[{"startOffset":173060,"endOffset":174796,"count":0}],"isBlockCoverage":false}]},{"scriptId":"950","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_bridge.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":28263,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":255,"endOffset":2918,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":442,"endOffset":539,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":627,"endOffset":1111,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1194,"endOffset":1284,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1385,"endOffset":1519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1622,"endOffset":2095,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2300,"endOffset":2894,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_objects_bridge","ranges":[{"startOffset":2922,"endOffset":3559,"count":0}],"isBlockCoverage":false},{"functionName":"initialize","ranges":[{"startOffset":3562,"endOffset":3638,"count":0}],"isBlockCoverage":false},{"functionName":"initialize","ranges":[{"startOffset":3648,"endOffset":8496,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8499,"endOffset":11248,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$changed_by","ranges":[{"startOffset":11251,"endOffset":11611,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$delete","ranges":[{"startOffset":11614,"endOffset":12850,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$deserialize","ranges":[{"startOffset":12853,"endOffset":14647,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$exists","ranges":[{"startOffset":14650,"endOffset":15225,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_comparator","ranges":[{"startOffset":15228,"endOffset":15469,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_deserialize_order","ranges":[{"startOffset":15472,"endOffset":17323,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_deserialize_steps","ranges":[{"startOffset":17326,"endOffset":19354,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_metadata","ranges":[{"startOffset":19357,"endOffset":20822,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$is_active","ranges":[{"startOffset":20825,"endOffset":21035,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$is_locked","ranges":[{"startOffset":21038,"endOffset":21258,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$jump","ranges":[{"startOffset":21261,"endOffset":21995,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_filename_to_object","ranges":[{"startOffset":21998,"endOffset":22146,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_filename_to_object","ranges":[{"startOffset":22156,"endOffset":23527,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_object_to_filename","ranges":[{"startOffset":23530,"endOffset":23678,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_object_to_filename","ranges":[{"startOffset":23688,"endOffset":24563,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$serialize","ranges":[{"startOffset":24566,"endOffset":25189,"count":0}],"isBlockCoverage":false}]},{"scriptId":"951","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_files.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":41911,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":12664,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":295,"endOffset":889,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":980,"endOffset":1633,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1715,"endOffset":2600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2681,"endOffset":2745,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2897,"endOffset":3006,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3049,"endOffset":3162,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3257,"endOffset":3323,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3370,"endOffset":3434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3478,"endOffset":3575,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3672,"endOffset":4266,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4309,"endOffset":4373,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4470,"endOffset":4512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4554,"endOffset":4618,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4663,"endOffset":4727,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4826,"endOffset":4890,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4934,"endOffset":4976,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5018,"endOffset":5082,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5176,"endOffset":5218,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5260,"endOffset":5392,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5440,"endOffset":5537,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5584,"endOffset":5881,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5974,"endOffset":6104,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6148,"endOffset":6190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6285,"endOffset":6648,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6692,"endOffset":6734,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6778,"endOffset":6875,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6970,"endOffset":7012,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7055,"endOffset":7175,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7264,"endOffset":7769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7863,"endOffset":7905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7947,"endOffset":8011,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8054,"endOffset":8120,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8214,"endOffset":8280,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8324,"endOffset":8366,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8408,"endOffset":8472,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8568,"endOffset":9453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9549,"endOffset":10434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10539,"endOffset":11192,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11294,"endOffset":11391,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11435,"endOffset":11477,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11519,"endOffset":11583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11688,"endOffset":11752,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11856,"endOffset":11953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12057,"endOffset":12187,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12294,"endOffset":12640,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_objects_files","ranges":[{"startOffset":12668,"endOffset":14980,"count":9}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":14983,"endOffset":15646,"count":0}],"isBlockCoverage":false},{"functionName":"add_abap","ranges":[{"startOffset":15649,"endOffset":17243,"count":1},{"startOffset":15753,"endOffset":15781,"count":0}],"isBlockCoverage":true},{"functionName":"add_i18n_file","ranges":[{"startOffset":17246,"endOffset":18617,"count":0}],"isBlockCoverage":false},{"functionName":"add_raw","ranges":[{"startOffset":18620,"endOffset":19855,"count":1},{"startOffset":18723,"endOffset":18751,"count":0}],"isBlockCoverage":true},{"functionName":"add_string","ranges":[{"startOffset":19858,"endOffset":21185,"count":0}],"isBlockCoverage":false},{"functionName":"add_xml","ranges":[{"startOffset":21188,"endOffset":23673,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":23676,"endOffset":24576,"count":9},{"startOffset":24464,"endOffset":24493,"count":0}],"isBlockCoverage":true},{"functionName":"contains_file","ranges":[{"startOffset":24579,"endOffset":26130,"count":0}],"isBlockCoverage":false},{"functionName":"get_accessed_files","ranges":[{"startOffset":26133,"endOffset":26886,"count":1}],"isBlockCoverage":true},{"functionName":"get_files","ranges":[{"startOffset":26889,"endOffset":27856,"count":0}],"isBlockCoverage":false},{"functionName":"get_file_pattern","ranges":[{"startOffset":27859,"endOffset":28439,"count":32}],"isBlockCoverage":true},{"functionName":"is_json_metadata","ranges":[{"startOffset":28442,"endOffset":29600,"count":2},{"startOffset":29472,"endOffset":29574,"count":1}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":29406,"endOffset":29468,"count":6}],"isBlockCoverage":true},{"functionName":"mark_accessed","ranges":[{"startOffset":29603,"endOffset":31076,"count":6},{"startOffset":30897,"endOffset":31072,"count":5}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":30510,"endOffset":30599,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":30628,"endOffset":30650,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":30674,"endOffset":30700,"count":0}],"isBlockCoverage":false},{"functionName":"read_abap","ranges":[{"startOffset":31079,"endOffset":32637,"count":2},{"startOffset":31532,"endOffset":31549,"count":0},{"startOffset":31551,"endOffset":31579,"count":0},{"startOffset":31696,"endOffset":31713,"count":0},{"startOffset":31715,"endOffset":31746,"count":0},{"startOffset":31775,"endOffset":31806,"count":0},{"startOffset":32365,"endOffset":32394,"count":0}],"isBlockCoverage":true},{"functionName":"read_file","ranges":[{"startOffset":32640,"endOffset":35075,"count":4},{"startOffset":33016,"endOffset":33047,"count":2},{"startOffset":33109,"endOffset":33145,"count":2},{"startOffset":33741,"endOffset":34199,"count":0},{"startOffset":34633,"endOffset":34908,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":33861,"endOffset":33959,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":33990,"endOffset":34012,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":34041,"endOffset":34067,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":34320,"endOffset":34377,"count":6}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":34408,"endOffset":34434,"count":0}],"isBlockCoverage":false},{"functionName":"read_i18n_files","ranges":[{"startOffset":35078,"endOffset":37221,"count":1},{"startOffset":36356,"endOffset":37191,"count":5},{"startOffset":36660,"endOffset":36687,"count":2},{"startOffset":36687,"endOffset":36795,"count":3},{"startOffset":36795,"endOffset":37048,"count":2},{"startOffset":37048,"endOffset":37081,"count":1},{"startOffset":37081,"endOffset":37191,"count":2}],"isBlockCoverage":true},{"functionName":"read_raw","ranges":[{"startOffset":37224,"endOffset":37866,"count":0}],"isBlockCoverage":false},{"functionName":"read_string","ranges":[{"startOffset":37869,"endOffset":38693,"count":0}],"isBlockCoverage":false},{"functionName":"read_xml","ranges":[{"startOffset":38696,"endOffset":39673,"count":2},{"startOffset":38914,"endOffset":38931,"count":0},{"startOffset":38933,"endOffset":38961,"count":0}],"isBlockCoverage":true},{"functionName":"set_files","ranges":[{"startOffset":39676,"endOffset":41742,"count":6},{"startOffset":41398,"endOffset":41738,"count":30},{"startOffset":41575,"endOffset":41732,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":41311,"endOffset":41394,"count":30}],"isBlockCoverage":true}]},{"scriptId":"952","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_oo_base.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":40194,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":2251,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":317,"endOffset":414,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":507,"endOffset":602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":709,"endOffset":1034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1207,"endOffset":1273,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1319,"endOffset":1419,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1468,"endOffset":2227,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_oo_base","ranges":[{"startOffset":2255,"endOffset":2649,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2652,"endOffset":2765,"count":1},{"startOffset":2708,"endOffset":2744,"count":0}],"isBlockCoverage":true},{"functionName":"convert_attrib_to_vseoattrib","ranges":[{"startOffset":2768,"endOffset":2883,"count":0}],"isBlockCoverage":false},{"functionName":"convert_attrib_to_vseoattrib","ranges":[{"startOffset":2893,"endOffset":5271,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$add_to_activation_list","ranges":[{"startOffset":5274,"endOffset":6077,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$create","ranges":[{"startOffset":6080,"endOffset":7562,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$create_documentation","ranges":[{"startOffset":7565,"endOffset":9704,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$create_sotr","ranges":[{"startOffset":9709,"endOffset":10450,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$delete","ranges":[{"startOffset":10455,"endOffset":10896,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$delete_documentation","ranges":[{"startOffset":10901,"endOffset":12470,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$deserialize_source","ranges":[{"startOffset":12477,"endOffset":13449,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$exists","ranges":[{"startOffset":13456,"endOffset":14034,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$generate_locals","ranges":[{"startOffset":14041,"endOffset":15417,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_class_properties","ranges":[{"startOffset":15424,"endOffset":15989,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_includes","ranges":[{"startOffset":15996,"endOffset":16830,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_interface_properties","ranges":[{"startOffset":16837,"endOffset":18231,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_skip_test_classes","ranges":[{"startOffset":18238,"endOffset":18480,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$insert_text_pool","ranges":[{"startOffset":18487,"endOffset":19434,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_attributes","ranges":[{"startOffset":19441,"endOffset":20893,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_descriptions","ranges":[{"startOffset":20900,"endOffset":23459,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_descriptions_sub","ranges":[{"startOffset":23466,"endOffset":26243,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_documentation","ranges":[{"startOffset":26250,"endOffset":29054,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_sotr","ranges":[{"startOffset":29063,"endOffset":29886,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_superclass","ranges":[{"startOffset":29895,"endOffset":30528,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_text_pool","ranges":[{"startOffset":30537,"endOffset":31213,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$serialize_abap","ranges":[{"startOffset":31222,"endOffset":33248,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$update_descriptions","ranges":[{"startOffset":33257,"endOffset":36027,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$update_descriptions_sub","ranges":[{"startOffset":36036,"endOffset":39101,"count":0}],"isBlockCoverage":false}]},{"scriptId":"953","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_oo_factory.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2549,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":862,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":304,"endOffset":442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":603,"endOffset":741,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":791,"endOffset":838,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_oo_factory","ranges":[{"startOffset":866,"endOffset":1038,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1041,"endOffset":1154,"count":0}],"isBlockCoverage":false},{"functionName":"make","ranges":[{"startOffset":1157,"endOffset":1227,"count":0}],"isBlockCoverage":false},{"functionName":"make","ranges":[{"startOffset":1237,"endOffset":2217,"count":1},{"startOffset":1648,"endOffset":1782,"count":0},{"startOffset":1865,"endOffset":1976,"count":0}],"isBlockCoverage":true}]},{"scriptId":"954","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_oo_interface.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":29486,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":233,"endOffset":2856,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":503,"endOffset":600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":646,"endOffset":740,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":785,"endOffset":1043,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1089,"endOffset":1185,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1282,"endOffset":1382,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1427,"endOffset":1683,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1784,"endOffset":1863,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1908,"endOffset":2191,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2234,"endOffset":2334,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_oo_interface","ranges":[{"startOffset":2860,"endOffset":2958,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2961,"endOffset":3074,"count":1}],"isBlockCoverage":true},{"functionName":"init_scanner","ranges":[{"startOffset":3077,"endOffset":3165,"count":0}],"isBlockCoverage":false},{"functionName":"init_scanner","ranges":[{"startOffset":3175,"endOffset":5792,"count":0}],"isBlockCoverage":false},{"functionName":"update_meta","ranges":[{"startOffset":5797,"endOffset":5887,"count":0}],"isBlockCoverage":false},{"functionName":"update_meta","ranges":[{"startOffset":5899,"endOffset":9706,"count":0}],"isBlockCoverage":false},{"functionName":"update_report","ranges":[{"startOffset":9713,"endOffset":9811,"count":0}],"isBlockCoverage":false},{"functionName":"update_report","ranges":[{"startOffset":9825,"endOffset":10904,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$create","ranges":[{"startOffset":10911,"endOffset":17874,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$delete","ranges":[{"startOffset":17885,"endOffset":19654,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$deserialize_source","ranges":[{"startOffset":19667,"endOffset":22548,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$exists","ranges":[{"startOffset":22561,"endOffset":24548,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_includes","ranges":[{"startOffset":24563,"endOffset":25665,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_interface_properties","ranges":[{"startOffset":25680,"endOffset":29293,"count":0}],"isBlockCoverage":false}]},{"scriptId":"955","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_password_dialog.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5458,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":674,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":372,"endOffset":436,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":479,"endOffset":543,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":586,"endOffset":650,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_password_dialog","ranges":[{"startOffset":678,"endOffset":763,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":766,"endOffset":879,"count":0}],"isBlockCoverage":false},{"functionName":"popup","ranges":[{"startOffset":882,"endOffset":959,"count":0}],"isBlockCoverage":false},{"functionName":"popup","ranges":[{"startOffset":969,"endOffset":5281,"count":0}],"isBlockCoverage":false}]},{"scriptId":"956","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_path.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8460,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":2023,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":353,"endOffset":417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":460,"endOffset":524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":571,"endOffset":635,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":727,"endOffset":824,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":867,"endOffset":931,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1025,"endOffset":1122,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1165,"endOffset":1229,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1274,"endOffset":1338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1434,"endOffset":1498,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1544,"endOffset":1608,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1649,"endOffset":1713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1828,"endOffset":1892,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1935,"endOffset":1999,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_path","ranges":[{"startOffset":2027,"endOffset":2112,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2115,"endOffset":2228,"count":0}],"isBlockCoverage":false},{"functionName":"change_dir","ranges":[{"startOffset":2231,"endOffset":2307,"count":0}],"isBlockCoverage":false},{"functionName":"change_dir","ranges":[{"startOffset":2317,"endOffset":4300,"count":7},{"startOffset":2986,"endOffset":3049,"count":5},{"startOffset":3051,"endOffset":3089,"count":3},{"startOffset":3089,"endOffset":4276,"count":4},{"startOffset":3195,"endOffset":3228,"count":0},{"startOffset":3301,"endOffset":3959,"count":2},{"startOffset":3448,"endOffset":3490,"count":0},{"startOffset":3670,"endOffset":3784,"count":0},{"startOffset":3959,"endOffset":4276,"count":2},{"startOffset":4076,"endOffset":4276,"count":1}],"isBlockCoverage":true},{"functionName":"get_filename_from_syspath","ranges":[{"startOffset":4303,"endOffset":4409,"count":0}],"isBlockCoverage":false},{"functionName":"get_filename_from_syspath","ranges":[{"startOffset":4419,"endOffset":5480,"count":7},{"startOffset":5099,"endOffset":5164,"count":2},{"startOffset":5164,"endOffset":5236,"count":5}],"isBlockCoverage":true},{"functionName":"is_root","ranges":[{"startOffset":5483,"endOffset":5553,"count":0}],"isBlockCoverage":false},{"functionName":"is_root","ranges":[{"startOffset":5563,"endOffset":5938,"count":4}],"isBlockCoverage":true},{"functionName":"is_subdir","ranges":[{"startOffset":5941,"endOffset":6015,"count":0}],"isBlockCoverage":false},{"functionName":"is_subdir","ranges":[{"startOffset":6025,"endOffset":7092,"count":6},{"startOffset":6774,"endOffset":6851,"count":5},{"startOffset":6852,"endOffset":7066,"count":4},{"startOffset":6961,"endOffset":7065,"count":2}],"isBlockCoverage":true},{"functionName":"split_file_location","ranges":[{"startOffset":7095,"endOffset":7189,"count":0}],"isBlockCoverage":false},{"functionName":"split_file_location","ranges":[{"startOffset":7199,"endOffset":8327,"count":6},{"startOffset":7979,"endOffset":8121,"count":4},{"startOffset":8121,"endOffset":8208,"count":2}],"isBlockCoverage":true}]},{"scriptId":"957","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_background.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":25357,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":7102,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":308,"endOffset":444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":590,"endOffset":1500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1545,"endOffset":1609,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1703,"endOffset":1767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1816,"endOffset":2825,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2971,"endOffset":4212,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4308,"endOffset":5317,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5359,"endOffset":5458,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5550,"endOffset":6559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6650,"endOffset":6749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6840,"endOffset":6937,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6979,"endOffset":7078,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persist_background","ranges":[{"startOffset":7106,"endOffset":7330,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7333,"endOffset":7468,"count":0}],"isBlockCoverage":false},{"functionName":"delete","ranges":[{"startOffset":7471,"endOffset":8106,"count":0}],"isBlockCoverage":false},{"functionName":"exists","ranges":[{"startOffset":8109,"endOffset":8808,"count":0}],"isBlockCoverage":false},{"functionName":"from_xml","ranges":[{"startOffset":8811,"endOffset":10230,"count":0}],"isBlockCoverage":false},{"functionName":"get_by_key","ranges":[{"startOffset":10233,"endOffset":13317,"count":0}],"isBlockCoverage":false},{"functionName":"list","ranges":[{"startOffset":13320,"endOffset":18099,"count":0}],"isBlockCoverage":false},{"functionName":"modify","ranges":[{"startOffset":18102,"endOffset":19474,"count":0}],"isBlockCoverage":false},{"functionName":"to_xml","ranges":[{"startOffset":19477,"endOffset":21911,"count":0}],"isBlockCoverage":false}]},{"scriptId":"958","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_factory.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4386,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":1687,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":301,"endOffset":437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":521,"endOffset":663,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":748,"endOffset":892,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1039,"endOffset":1175,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1275,"endOffset":1417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1519,"endOffset":1663,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persist_factory","ranges":[{"startOffset":1691,"endOffset":1958,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1961,"endOffset":2074,"count":0}],"isBlockCoverage":false},{"functionName":"get_repo","ranges":[{"startOffset":2077,"endOffset":2150,"count":0}],"isBlockCoverage":false},{"functionName":"get_repo","ranges":[{"startOffset":2160,"endOffset":2593,"count":0}],"isBlockCoverage":false},{"functionName":"get_repo_cs","ranges":[{"startOffset":2596,"endOffset":2675,"count":0}],"isBlockCoverage":false},{"functionName":"get_repo_cs","ranges":[{"startOffset":2685,"endOffset":3145,"count":5},{"startOffset":2926,"endOffset":3058,"count":0}],"isBlockCoverage":true},{"functionName":"get_settings","ranges":[{"startOffset":3148,"endOffset":3229,"count":0}],"isBlockCoverage":false},{"functionName":"get_settings","ranges":[{"startOffset":3239,"endOffset":3708,"count":72},{"startOffset":3485,"endOffset":3618,"count":0}],"isBlockCoverage":true}]},{"scriptId":"959","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_injector.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2673,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":135,"endOffset":1022,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":374,"endOffset":510,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":610,"endOffset":752,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":854,"endOffset":998,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persist_injector","ranges":[{"startOffset":1026,"endOffset":1111,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1114,"endOffset":1227,"count":0}],"isBlockCoverage":false},{"functionName":"set_repo","ranges":[{"startOffset":1230,"endOffset":1314,"count":0}],"isBlockCoverage":false},{"functionName":"set_repo","ranges":[{"startOffset":1324,"endOffset":1623,"count":0}],"isBlockCoverage":false},{"functionName":"set_repo_cs","ranges":[{"startOffset":1626,"endOffset":1716,"count":0}],"isBlockCoverage":false},{"functionName":"set_repo_cs","ranges":[{"startOffset":1726,"endOffset":2052,"count":4}],"isBlockCoverage":true},{"functionName":"set_settings","ranges":[{"startOffset":2055,"endOffset":2147,"count":0}],"isBlockCoverage":false},{"functionName":"set_settings","ranges":[{"startOffset":2157,"endOffset":2492,"count":7}],"isBlockCoverage":true}]},{"scriptId":"960","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_migrate.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":30728,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":290,"endOffset":1416,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":457,"endOffset":521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":731,"endOffset":828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":983,"endOffset":1080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1247,"endOffset":1344,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persist_migrate","ranges":[{"startOffset":1420,"endOffset":1559,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1562,"endOffset":1675,"count":0}],"isBlockCoverage":false},{"functionName":"gui_status_create","ranges":[{"startOffset":1678,"endOffset":1769,"count":0}],"isBlockCoverage":false},{"functionName":"gui_status_create","ranges":[{"startOffset":1779,"endOffset":5725,"count":0}],"isBlockCoverage":false},{"functionName":"gui_status_exists","ranges":[{"startOffset":5728,"endOffset":5819,"count":0}],"isBlockCoverage":false},{"functionName":"gui_status_exists","ranges":[{"startOffset":5829,"endOffset":13922,"count":0}],"isBlockCoverage":false},{"functionName":"lock_create","ranges":[{"startOffset":13925,"endOffset":14004,"count":0}],"isBlockCoverage":false},{"functionName":"lock_create","ranges":[{"startOffset":14014,"endOffset":20512,"count":0}],"isBlockCoverage":false},{"functionName":"lock_exists","ranges":[{"startOffset":20521,"endOffset":20612,"count":0}],"isBlockCoverage":false},{"functionName":"lock_exists","ranges":[{"startOffset":20628,"endOffset":21238,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":21247,"endOffset":21322,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":21338,"endOffset":21677,"count":0}],"isBlockCoverage":false},{"functionName":"table_create","ranges":[{"startOffset":21686,"endOffset":21779,"count":0}],"isBlockCoverage":false},{"functionName":"table_create","ranges":[{"startOffset":21795,"endOffset":29524,"count":0}],"isBlockCoverage":false},{"functionName":"table_exists","ranges":[{"startOffset":29539,"endOffset":29644,"count":0}],"isBlockCoverage":false},{"functionName":"table_exists","ranges":[{"startOffset":29666,"endOffset":30352,"count":0}],"isBlockCoverage":false}]},{"scriptId":"961","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_migrate.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":23027,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":264,"endOffset":7198,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":524,"endOffset":682,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":778,"endOffset":3928,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4024,"endOffset":7174,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_cua_interface","ranges":[{"startOffset":7202,"endOffset":7300,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7303,"endOffset":7416,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":7419,"endOffset":7472,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":7482,"endOffset":8812,"count":0}],"isBlockCoverage":false},{"functionName":"get_own_cua","ranges":[{"startOffset":8815,"endOffset":12104,"count":0}],"isBlockCoverage":false},{"functionName":"put_own_cua","ranges":[{"startOffset":12107,"endOffset":15795,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":15917,"endOffset":19349,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":16175,"endOffset":19325,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_own_cua_provider","ranges":[{"startOffset":19353,"endOffset":19438,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":19441,"endOffset":19554,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":19557,"endOffset":19613,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":19623,"endOffset":22812,"count":0}],"isBlockCoverage":false}]},{"scriptId":"962","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_packages.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11898,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":135,"endOffset":3493,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":307,"endOffset":447,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":532,"endOffset":1005,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1156,"endOffset":1629,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1671,"endOffset":1735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1826,"endOffset":1890,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1937,"endOffset":2410,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2554,"endOffset":2602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2650,"endOffset":2698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2747,"endOffset":2795,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2888,"endOffset":3134,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3180,"endOffset":3228,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3329,"endOffset":3469,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persist_packages","ranges":[{"startOffset":3497,"endOffset":4127,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4130,"endOffset":4243,"count":0}],"isBlockCoverage":false},{"functionName":"from_xml","ranges":[{"startOffset":4246,"endOffset":5287,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":5290,"endOffset":5372,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":5382,"endOffset":5844,"count":0}],"isBlockCoverage":false},{"functionName":"init","ranges":[{"startOffset":5847,"endOffset":6408,"count":0}],"isBlockCoverage":false},{"functionName":"modify","ranges":[{"startOffset":6411,"endOffset":8745,"count":0}],"isBlockCoverage":false},{"functionName":"read","ranges":[{"startOffset":8748,"endOffset":9658,"count":0}],"isBlockCoverage":false},{"functionName":"to_xml","ranges":[{"startOffset":9661,"endOffset":10773,"count":0}],"isBlockCoverage":false}]},{"scriptId":"963","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_settings.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4758,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":135,"endOffset":543,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":338,"endOffset":462,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persist_settings","ranges":[{"startOffset":547,"endOffset":765,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":768,"endOffset":881,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_settings$modify","ranges":[{"startOffset":884,"endOffset":3322,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_settings$read","ranges":[{"startOffset":3325,"endOffset":4577,"count":0}],"isBlockCoverage":false}]},{"scriptId":"964","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persistence_db.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":26427,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":8440,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":296,"endOffset":432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":524,"endOffset":620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":703,"endOffset":751,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":831,"endOffset":879,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":968,"endOffset":1066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1151,"endOffset":1249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1339,"endOffset":1437,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1528,"endOffset":1626,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1715,"endOffset":1813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1898,"endOffset":1996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2158,"endOffset":2254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2366,"endOffset":2430,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2472,"endOffset":2536,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2632,"endOffset":2768,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2857,"endOffset":2955,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2999,"endOffset":3098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3141,"endOffset":3243,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3335,"endOffset":3433,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3477,"endOffset":3576,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3669,"endOffset":4281,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4382,"endOffset":4994,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5037,"endOffset":5135,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5237,"endOffset":5849,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5892,"endOffset":6210,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6253,"endOffset":6351,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6441,"endOffset":6497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6540,"endOffset":6638,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6682,"endOffset":6781,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6873,"endOffset":6971,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7015,"endOffset":7114,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7157,"endOffset":7259,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7349,"endOffset":7451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7494,"endOffset":7592,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7636,"endOffset":7735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7827,"endOffset":7925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7969,"endOffset":8068,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8111,"endOffset":8213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8318,"endOffset":8416,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persistence_db","ranges":[{"startOffset":8444,"endOffset":9220,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":9223,"endOffset":9336,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":9339,"endOffset":10638,"count":0}],"isBlockCoverage":false},{"functionName":"delete","ranges":[{"startOffset":10641,"endOffset":11222,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":11225,"endOffset":11305,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":11315,"endOffset":11735,"count":0}],"isBlockCoverage":false},{"functionName":"get_update_function","ranges":[{"startOffset":11738,"endOffset":13033,"count":0}],"isBlockCoverage":false},{"functionName":"list","ranges":[{"startOffset":13038,"endOffset":13915,"count":0}],"isBlockCoverage":false},{"functionName":"list_by_keys","ranges":[{"startOffset":13920,"endOffset":15717,"count":0}],"isBlockCoverage":false},{"functionName":"list_by_type","ranges":[{"startOffset":15722,"endOffset":16838,"count":0}],"isBlockCoverage":false},{"functionName":"lock","ranges":[{"startOffset":16843,"endOffset":19171,"count":0}],"isBlockCoverage":false},{"functionName":"modify","ranges":[{"startOffset":19178,"endOffset":20669,"count":0}],"isBlockCoverage":false},{"functionName":"read","ranges":[{"startOffset":20676,"endOffset":21831,"count":0}],"isBlockCoverage":false},{"functionName":"update","ranges":[{"startOffset":21838,"endOffset":23235,"count":0}],"isBlockCoverage":false},{"functionName":"validate_and_unprettify_xml","ranges":[{"startOffset":23242,"endOffset":23692,"count":0}],"isBlockCoverage":false},{"functionName":"validate_entry_type","ranges":[{"startOffset":23699,"endOffset":23811,"count":0}],"isBlockCoverage":false},{"functionName":"validate_entry_type","ranges":[{"startOffset":23825,"endOffset":24655,"count":0}],"isBlockCoverage":false}]},{"scriptId":"965","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persistence_repo.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":107841,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":135,"endOffset":15446,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":367,"endOffset":625,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":704,"endOffset":840,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":987,"endOffset":5295,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5349,"endOffset":5413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5516,"endOffset":5580,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5623,"endOffset":10019,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10124,"endOffset":10223,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10332,"endOffset":14728,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14774,"endOffset":15160,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15323,"endOffset":15422,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persistence_repo","ranges":[{"startOffset":15450,"endOffset":15944,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":15947,"endOffset":22961,"count":0}],"isBlockCoverage":false},{"functionName":"from_xml","ranges":[{"startOffset":22964,"endOffset":29426,"count":0}],"isBlockCoverage":false},{"functionName":"get_next_id","ranges":[{"startOffset":29429,"endOffset":31285,"count":0}],"isBlockCoverage":false},{"functionName":"get_repo_from_content","ranges":[{"startOffset":31288,"endOffset":36769,"count":0}],"isBlockCoverage":false},{"functionName":"rewrite_repo_meta","ranges":[{"startOffset":36772,"endOffset":42005,"count":0}],"isBlockCoverage":false},{"functionName":"to_xml","ranges":[{"startOffset":42008,"endOffset":51224,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo_cs$delete","ranges":[{"startOffset":51227,"endOffset":51566,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo_cs$read","ranges":[{"startOffset":51569,"endOffset":52054,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo_cs$update","ranges":[{"startOffset":52057,"endOffset":52597,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo$add","ranges":[{"startOffset":52600,"endOffset":61035,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo$delete","ranges":[{"startOffset":61038,"endOffset":61679,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo$exists","ranges":[{"startOffset":61682,"endOffset":63285,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo$list","ranges":[{"startOffset":63288,"endOffset":73768,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo$list_by_keys","ranges":[{"startOffset":73771,"endOffset":84666,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo$lock","ranges":[{"startOffset":84669,"endOffset":85136,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo$read","ranges":[{"startOffset":85139,"endOffset":95022,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo$update_metadata","ranges":[{"startOffset":95025,"endOffset":107660,"count":0}],"isBlockCoverage":false}]},{"scriptId":"966","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persistence_user.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":65524,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":135,"endOffset":16997,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":338,"endOffset":474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":555,"endOffset":629,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":710,"endOffset":5122,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5269,"endOffset":9681,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9723,"endOffset":9787,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9945,"endOffset":10672,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10714,"endOffset":10812,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10903,"endOffset":10967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11010,"endOffset":15422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15576,"endOffset":15674,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15724,"endOffset":16451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16549,"endOffset":16685,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16728,"endOffset":16802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16899,"endOffset":16973,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_persistence_user","ranges":[{"startOffset":17001,"endOffset":21655,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":21658,"endOffset":22001,"count":0}],"isBlockCoverage":false},{"functionName":"from_xml","ranges":[{"startOffset":22004,"endOffset":27350,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":27353,"endOffset":27445,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":27455,"endOffset":28369,"count":0}],"isBlockCoverage":false},{"functionName":"read","ranges":[{"startOffset":28372,"endOffset":28912,"count":0}],"isBlockCoverage":false},{"functionName":"read_repo_config","ranges":[{"startOffset":28915,"endOffset":30279,"count":0}],"isBlockCoverage":false},{"functionName":"to_xml","ranges":[{"startOffset":30282,"endOffset":35112,"count":0}],"isBlockCoverage":false},{"functionName":"update","ranges":[{"startOffset":35115,"endOffset":35492,"count":0}],"isBlockCoverage":false},{"functionName":"update_repo_config","ranges":[{"startOffset":35495,"endOffset":37969,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_changes_only","ranges":[{"startOffset":37972,"endOffset":38222,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_default_git_user_email","ranges":[{"startOffset":38225,"endOffset":38447,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_default_git_user_name","ranges":[{"startOffset":38450,"endOffset":38679,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_diff_first","ranges":[{"startOffset":38682,"endOffset":38922,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_diff_unified","ranges":[{"startOffset":38925,"endOffset":39175,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_favorites","ranges":[{"startOffset":39178,"endOffset":39634,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_hide_files","ranges":[{"startOffset":39637,"endOffset":39859,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_list_settings","ranges":[{"startOffset":39862,"endOffset":41013,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_order_by","ranges":[{"startOffset":41016,"endOffset":41213,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_order_descending","ranges":[{"startOffset":41216,"endOffset":41486,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_repo_git_user_email","ranges":[{"startOffset":41489,"endOffset":41902,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_repo_git_user_name","ranges":[{"startOffset":41905,"endOffset":42325,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_repo_last_change_seen","ranges":[{"startOffset":42328,"endOffset":42745,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_repo_login","ranges":[{"startOffset":42748,"endOffset":43137,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_repo_show","ranges":[{"startOffset":43140,"endOffset":43898,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_settings","ranges":[{"startOffset":43901,"endOffset":45368,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$get_show_folders","ranges":[{"startOffset":45371,"endOffset":45606,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$is_favorite_repo","ranges":[{"startOffset":45609,"endOffset":46372,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_default_git_user_email","ranges":[{"startOffset":46375,"endOffset":46671,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_default_git_user_name","ranges":[{"startOffset":46674,"endOffset":46983,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_diff_first","ranges":[{"startOffset":46986,"endOffset":47497,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_list_settings","ranges":[{"startOffset":47500,"endOffset":48365,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_order_by","ranges":[{"startOffset":48368,"endOffset":48791,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_order_descending","ranges":[{"startOffset":48794,"endOffset":49371,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_repo_git_user_email","ranges":[{"startOffset":49374,"endOffset":50692,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_repo_git_user_name","ranges":[{"startOffset":50695,"endOffset":52026,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_repo_last_change_seen","ranges":[{"startOffset":52029,"endOffset":53355,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_repo_login","ranges":[{"startOffset":53358,"endOffset":54652,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_repo_show","ranges":[{"startOffset":54655,"endOffset":54944,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$set_settings","ranges":[{"startOffset":54947,"endOffset":56504,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$toggle_changes_only","ranges":[{"startOffset":56507,"endOffset":56921,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$toggle_diff_unified","ranges":[{"startOffset":56924,"endOffset":57338,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$toggle_favorite","ranges":[{"startOffset":57341,"endOffset":58204,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$toggle_hide_files","ranges":[{"startOffset":58207,"endOffset":58589,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_user$toggle_show_folders","ranges":[{"startOffset":58592,"endOffset":58991,"count":0}],"isBlockCoverage":false}]},{"scriptId":"967","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_po_file.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":31330,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":4981,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":300,"endOffset":389,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":471,"endOffset":1442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1525,"endOffset":1887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2038,"endOffset":2172,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2270,"endOffset":2404,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2498,"endOffset":2562,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2668,"endOffset":2732,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2783,"endOffset":2843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2934,"endOffset":2998,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3041,"endOffset":3105,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3198,"endOffset":3262,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3305,"endOffset":3369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3466,"endOffset":3555,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3647,"endOffset":3713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3817,"endOffset":3914,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3960,"endOffset":4060,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4109,"endOffset":4957,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_po_file","ranges":[{"startOffset":4985,"endOffset":6193,"count":7}],"isBlockCoverage":true},{"functionName":"build_po_body","ranges":[{"startOffset":6196,"endOffset":8678,"count":1},{"startOffset":7651,"endOffset":8655,"count":2},{"startOffset":7779,"endOffset":7867,"count":1},{"startOffset":8038,"endOffset":8324,"count":3}],"isBlockCoverage":true},{"functionName":"build_po_head","ranges":[{"startOffset":8681,"endOffset":9607,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":9610,"endOffset":9874,"count":7}],"isBlockCoverage":true},{"functionName":"get_comment_marker","ranges":[{"startOffset":9877,"endOffset":9972,"count":3}],"isBlockCoverage":true},{"functionName":"get_comment_marker","ranges":[{"startOffset":9982,"endOffset":11054,"count":3},{"startOffset":10365,"endOffset":10430,"count":0},{"startOffset":10515,"endOffset":10581,"count":0},{"startOffset":10732,"endOffset":11028,"count":0}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":11057,"endOffset":11821,"count":2},{"startOffset":11449,"endOffset":11561,"count":0},{"startOffset":11563,"endOffset":11623,"count":0}],"isBlockCoverage":true},{"functionName":"parse_po","ranges":[{"startOffset":11824,"endOffset":16429,"count":11},{"startOffset":14143,"endOffset":16425,"count":33},{"startOffset":14240,"endOffset":14876,"count":9},{"startOffset":14341,"endOffset":14441,"count":4},{"startOffset":14443,"endOffset":14597,"count":4},{"startOffset":14597,"endOffset":14868,"count":5},{"startOffset":14720,"endOffset":14816,"count":4},{"startOffset":14876,"endOffset":14970,"count":29},{"startOffset":14970,"endOffset":15773,"count":21},{"startOffset":15015,"endOffset":15115,"count":14},{"startOffset":15116,"endOffset":15159,"count":11},{"startOffset":15161,"endOffset":15192,"count":10},{"startOffset":15192,"endOffset":15292,"count":11},{"startOffset":15292,"endOffset":15393,"count":9},{"startOffset":15395,"endOffset":15602,"count":8},{"startOffset":15602,"endOffset":15765,"count":3},{"startOffset":15755,"endOffset":15765,"count":0},{"startOffset":15773,"endOffset":16419,"count":8},{"startOffset":16040,"endOffset":16247,"count":6},{"startOffset":16186,"endOffset":16247,"count":5},{"startOffset":16247,"endOffset":16411,"count":2},{"startOffset":16401,"endOffset":16411,"count":0},{"startOffset":16425,"endOffset":16428,"count":5}],"isBlockCoverage":true},{"functionName":"push_text_pairs","ranges":[{"startOffset":16432,"endOffset":21970,"count":1},{"startOffset":20381,"endOffset":21966,"count":3},{"startOffset":20487,"endOffset":20514,"count":0},{"startOffset":20938,"endOffset":21216,"count":2},{"startOffset":21274,"endOffset":21344,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":20602,"endOffset":20668,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":20699,"endOffset":20723,"count":1}],"isBlockCoverage":true},{"functionName":"quote","ranges":[{"startOffset":21973,"endOffset":22042,"count":4}],"isBlockCoverage":true},{"functionName":"quote","ranges":[{"startOffset":22052,"endOffset":22596,"count":4}],"isBlockCoverage":true},{"functionName":"unquote","ranges":[{"startOffset":22599,"endOffset":22672,"count":18}],"isBlockCoverage":true},{"functionName":"unquote","ranges":[{"startOffset":22682,"endOffset":24937,"count":25},{"startOffset":23368,"endOffset":23514,"count":2},{"startOffset":23508,"endOffset":23514,"count":0},{"startOffset":23514,"endOffset":23704,"count":23},{"startOffset":23704,"endOffset":23814,"count":22},{"startOffset":23816,"endOffset":23962,"count":2},{"startOffset":23956,"endOffset":23962,"count":0},{"startOffset":23962,"endOffset":24118,"count":21},{"startOffset":24118,"endOffset":24229,"count":17},{"startOffset":24231,"endOffset":24377,"count":1},{"startOffset":24371,"endOffset":24377,"count":0},{"startOffset":24377,"endOffset":24936,"count":20}],"isBlockCoverage":true},{"functionName":"zif_abapgit_i18n_file$ext","ranges":[{"startOffset":24940,"endOffset":25120,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_i18n_file$lang","ranges":[{"startOffset":25123,"endOffset":25282,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_i18n_file$render","ranges":[{"startOffset":25285,"endOffset":25998,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_i18n_file$translate","ranges":[{"startOffset":26001,"endOffset":29441,"count":1},{"startOffset":28603,"endOffset":29437,"count":3},{"startOffset":28711,"endOffset":28738,"count":0},{"startOffset":29339,"endOffset":29431,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":28872,"endOffset":28939,"count":3}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":28970,"endOffset":28994,"count":3}],"isBlockCoverage":true}]},{"scriptId":"968","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popup_branch_list.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11083,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":2906,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":365,"endOffset":429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":520,"endOffset":584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":676,"endOffset":773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":933,"endOffset":1855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1948,"endOffset":2080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2122,"endOffset":2186,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2239,"endOffset":2303,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2357,"endOffset":2454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2550,"endOffset":2614,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2667,"endOffset":2731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2785,"endOffset":2882,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_popup_branch_list","ranges":[{"startOffset":2910,"endOffset":3260,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3263,"endOffset":3344,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":3354,"endOffset":4347,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4350,"endOffset":5285,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_popup$create_picklist","ranges":[{"startOffset":5288,"endOffset":5727,"count":0}],"isBlockCoverage":false},{"functionName":"fetch_branch_list","ranges":[{"startOffset":5730,"endOffset":9088,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_render_item$render","ranges":[{"startOffset":9091,"endOffset":10898,"count":0}],"isBlockCoverage":false}]},{"scriptId":"969","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popup_code_insp.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4328,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":1199,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":427,"endOffset":950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1043,"endOffset":1175,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_popup_code_insp","ranges":[{"startOffset":1203,"endOffset":1288,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1291,"endOffset":1404,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1407,"endOffset":1476,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1486,"endOffset":1756,"count":0}],"isBlockCoverage":false},{"functionName":"fetch_list","ranges":[{"startOffset":1759,"endOffset":2530,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_render_item$render","ranges":[{"startOffset":2533,"endOffset":3715,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_popup$create_picklist","ranges":[{"startOffset":3718,"endOffset":4151,"count":0}],"isBlockCoverage":false}]},{"scriptId":"970","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popup_pull_request.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7396,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":2328,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":368,"endOffset":432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":595,"endOffset":1813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1906,"endOffset":2038,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2080,"endOffset":2144,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2240,"endOffset":2304,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_popup_pull_request","ranges":[{"startOffset":2332,"endOffset":2490,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2493,"endOffset":2575,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2585,"endOffset":3005,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3008,"endOffset":3216,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_popup$create_picklist","ranges":[{"startOffset":3219,"endOffset":3670,"count":0}],"isBlockCoverage":false},{"functionName":"fetch_pull_request_list","ranges":[{"startOffset":3673,"endOffset":5312,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_render_item$render","ranges":[{"startOffset":5315,"endOffset":7207,"count":0}],"isBlockCoverage":false}]},{"scriptId":"971","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popup_tag_list.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6797,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":2010,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":356,"endOffset":420,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":573,"endOffset":1495,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1588,"endOffset":1720,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1762,"endOffset":1826,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1922,"endOffset":1986,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_popup_tag_list","ranges":[{"startOffset":2014,"endOffset":2172,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2175,"endOffset":2253,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2263,"endOffset":2679,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2682,"endOffset":2890,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html_popup$create_picklist","ranges":[{"startOffset":2893,"endOffset":3326,"count":0}],"isBlockCoverage":false},{"functionName":"fetch_tag_list","ranges":[{"startOffset":3329,"endOffset":5186,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_render_item$render","ranges":[{"startOffset":5189,"endOffset":6624,"count":0}],"isBlockCoverage":false}]},{"scriptId":"972","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popups.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":107408,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":169,"endOffset":7050,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":352,"endOffset":692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":781,"endOffset":828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":939,"endOffset":1003,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1154,"endOffset":1207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1255,"endOffset":1308,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1356,"endOffset":1409,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1453,"endOffset":1495,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1544,"endOffset":1597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1646,"endOffset":1702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1747,"endOffset":2012,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2124,"endOffset":2188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2241,"endOffset":2338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2384,"endOffset":2442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2488,"endOffset":2546,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2592,"endOffset":2650,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2695,"endOffset":2962,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3069,"endOffset":3133,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3183,"endOffset":3247,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3295,"endOffset":3944,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3990,"endOffset":6381,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6477,"endOffset":6817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6861,"endOffset":6921,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6966,"endOffset":7026,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_popups","ranges":[{"startOffset":7054,"endOffset":7674,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7677,"endOffset":7790,"count":0}],"isBlockCoverage":false},{"functionName":"add_field","ranges":[{"startOffset":7793,"endOffset":9641,"count":0}],"isBlockCoverage":false},{"functionName":"center","ranges":[{"startOffset":9644,"endOffset":9714,"count":0}],"isBlockCoverage":false},{"functionName":"center","ranges":[{"startOffset":9724,"endOffset":11740,"count":0}],"isBlockCoverage":false},{"functionName":"commit_list_build","ranges":[{"startOffset":11743,"endOffset":19727,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$branch_list_popup","ranges":[{"startOffset":19730,"endOffset":31688,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$choose_code_insp_check_variant","ranges":[{"startOffset":31693,"endOffset":34190,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$commit_list_popup","ranges":[{"startOffset":34197,"endOffset":44779,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$create_branch_popup","ranges":[{"startOffset":44786,"endOffset":46792,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_folder_logic","ranges":[{"startOffset":46799,"endOffset":49995,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_search_help","ranges":[{"startOffset":50004,"endOffset":53124,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_select_tr_requests","ranges":[{"startOffset":53135,"endOffset":57448,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_select_wb_tc_tr_and_tsk","ranges":[{"startOffset":57461,"endOffset":59389,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_confirm","ranges":[{"startOffset":59402,"endOffset":63631,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_create_package","ranges":[{"startOffset":63646,"endOffset":67516,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_create_transp_branch","ranges":[{"startOffset":67535,"endOffset":71215,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_from_list","ranges":[{"startOffset":71234,"endOffset":77403,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_labels","ranges":[{"startOffset":77422,"endOffset":85402,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_transports","ranges":[{"startOffset":85421,"endOffset":86493,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_transport_request","ranges":[{"startOffset":86512,"endOffset":91484,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$tag_list_popup","ranges":[{"startOffset":91505,"endOffset":100532,"count":0}],"isBlockCoverage":false},{"functionName":"_popup_3_get_values","ranges":[{"startOffset":100555,"endOffset":105654,"count":0}],"isBlockCoverage":false}]},{"scriptId":"973","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popups.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":56098,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":133,"endOffset":9603,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":324,"endOffset":397,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":485,"endOffset":605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":685,"endOffset":795,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":878,"endOffset":975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1060,"endOffset":1400,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1490,"endOffset":1552,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1646,"endOffset":1708,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1797,"endOffset":1844,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1938,"endOffset":2000,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2088,"endOffset":2162,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2322,"endOffset":2382,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2424,"endOffset":2488,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2611,"endOffset":2675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2772,"endOffset":2832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2874,"endOffset":2938,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3051,"endOffset":3171,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3278,"endOffset":3553,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3648,"endOffset":3758,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3860,"endOffset":3986,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4039,"endOffset":4104,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4161,"endOffset":4203,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4260,"endOffset":5000,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5109,"endOffset":5174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5224,"endOffset":5321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5436,"endOffset":5500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5603,"endOffset":5667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5765,"endOffset":5862,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5964,"endOffset":6061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6221,"endOffset":6318,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6363,"endOffset":6460,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6504,"endOffset":6563,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6662,"endOffset":6759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6803,"endOffset":6862,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6959,"endOffset":7079,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7123,"endOffset":7181,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7231,"endOffset":7273,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7320,"endOffset":7660,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7714,"endOffset":7811,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7868,"endOffset":7965,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8018,"endOffset":8083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8140,"endOffset":8182,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8239,"endOffset":8979,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9034,"endOffset":9309,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9459,"endOffset":9579,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_object_descision_list","ranges":[{"startOffset":9607,"endOffset":10840,"count":0}],"isBlockCoverage":false},{"functionName":"display","ranges":[{"startOffset":10843,"endOffset":11202,"count":0}],"isBlockCoverage":false},{"functionName":"get_selected","ranges":[{"startOffset":11205,"endOffset":14817,"count":0}],"isBlockCoverage":false},{"functionName":"create_alv","ranges":[{"startOffset":14820,"endOffset":15427,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":15430,"endOffset":22142,"count":0}],"isBlockCoverage":false},{"functionName":"create_new_selectable_table","ranges":[{"startOffset":22145,"endOffset":27679,"count":0}],"isBlockCoverage":false},{"functionName":"preselect","ranges":[{"startOffset":27682,"endOffset":29498,"count":0}],"isBlockCoverage":false},{"functionName":"on_double_click","ranges":[{"startOffset":29501,"endOffset":30112,"count":0}],"isBlockCoverage":false},{"functionName":"on_select_list_function_click","ranges":[{"startOffset":30115,"endOffset":31899,"count":0}],"isBlockCoverage":false},{"functionName":"mark_all","ranges":[{"startOffset":31902,"endOffset":33080,"count":0}],"isBlockCoverage":false},{"functionName":"are_all_marked","ranges":[{"startOffset":33083,"endOffset":34772,"count":0}],"isBlockCoverage":false},{"functionName":"mark_selected","ranges":[{"startOffset":34775,"endOffset":35580,"count":0}],"isBlockCoverage":false},{"functionName":"mark_visible","ranges":[{"startOffset":35583,"endOffset":37149,"count":0}],"isBlockCoverage":false},{"functionName":"mark_indexed","ranges":[{"startOffset":37152,"endOffset":39307,"count":0}],"isBlockCoverage":false},{"functionName":"ask_user_for_obj_category","ranges":[{"startOffset":39310,"endOffset":42519,"count":0}],"isBlockCoverage":false},{"functionName":"mark_category","ranges":[{"startOffset":42524,"endOffset":45178,"count":0}],"isBlockCoverage":false},{"functionName":"on_select_list_link_click","ranges":[{"startOffset":45183,"endOffset":46638,"count":0}],"isBlockCoverage":false},{"functionName":"setup_columns","ranges":[{"startOffset":46643,"endOffset":51706,"count":0}],"isBlockCoverage":false},{"functionName":"setup_toolbar","ranges":[{"startOffset":51711,"endOffset":55081,"count":0}],"isBlockCoverage":false}]},{"scriptId":"974","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_pr_enum_github.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20318,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":4437,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":334,"endOffset":466,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":551,"endOffset":615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":771,"endOffset":2205,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2252,"endOffset":2316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2415,"endOffset":3633,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3676,"endOffset":3798,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3892,"endOffset":3956,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3998,"endOffset":4062,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4168,"endOffset":4232,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4281,"endOffset":4413,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_pr_enum_github","ranges":[{"startOffset":4441,"endOffset":4742,"count":0}],"isBlockCoverage":false},{"functionName":"clean_url","ranges":[{"startOffset":4745,"endOffset":5134,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5137,"endOffset":6350,"count":0}],"isBlockCoverage":false},{"functionName":"convert_list","ranges":[{"startOffset":6353,"endOffset":10596,"count":0}],"isBlockCoverage":false},{"functionName":"fetch_repo_by_url","ranges":[{"startOffset":10599,"endOffset":13979,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_pr_enum_provider$list_pull_requests","ranges":[{"startOffset":13982,"endOffset":18688,"count":0}],"isBlockCoverage":false}]},{"scriptId":"975","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_pr_enumerator.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7476,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":2841,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":299,"endOffset":363,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":453,"endOffset":597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":755,"endOffset":899,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":946,"endOffset":1010,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1106,"endOffset":1170,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1266,"endOffset":2484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2577,"endOffset":2711,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2753,"endOffset":2817,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_pr_enumerator","ranges":[{"startOffset":2845,"endOffset":3161,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3164,"endOffset":3679,"count":0}],"isBlockCoverage":false},{"functionName":"create_provider","ranges":[{"startOffset":3682,"endOffset":3777,"count":0}],"isBlockCoverage":false},{"functionName":"create_provider","ranges":[{"startOffset":3787,"endOffset":5341,"count":0}],"isBlockCoverage":false},{"functionName":"get_pulls","ranges":[{"startOffset":5344,"endOffset":6800,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":6803,"endOffset":6874,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":6884,"endOffset":7307,"count":0}],"isBlockCoverage":false}]},{"scriptId":"976","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_progress.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6995,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":1729,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":306,"endOffset":434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":516,"endOffset":576,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":665,"endOffset":702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":792,"endOffset":829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":975,"endOffset":1035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1081,"endOffset":1141,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1243,"endOffset":1371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1473,"endOffset":1601,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1645,"endOffset":1705,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_progress","ranges":[{"startOffset":1733,"endOffset":2042,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2045,"endOffset":2158,"count":1},{"startOffset":2101,"endOffset":2137,"count":0}],"isBlockCoverage":true},{"functionName":"calc_pct","ranges":[{"startOffset":2161,"endOffset":2865,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":2868,"endOffset":2952,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":2962,"endOffset":3624,"count":7},{"startOffset":3320,"endOffset":3438,"count":1}],"isBlockCoverage":true},{"functionName":"set_instance","ranges":[{"startOffset":3627,"endOffset":3711,"count":0}],"isBlockCoverage":false},{"functionName":"set_instance","ranges":[{"startOffset":3721,"endOffset":4017,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_progress$off","ranges":[{"startOffset":4020,"endOffset":4460,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_progress$set_total","ranges":[{"startOffset":4463,"endOffset":4774,"count":7}],"isBlockCoverage":true},{"functionName":"zif_abapgit_progress$show","ranges":[{"startOffset":4777,"endOffset":6697,"count":0}],"isBlockCoverage":false}]},{"scriptId":"977","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_proxy_auth.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2714,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":837,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":290,"endOffset":354,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":439,"endOffset":503,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":697,"endOffset":813,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_proxy_auth","ranges":[{"startOffset":841,"endOffset":1044,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1047,"endOffset":1160,"count":0}],"isBlockCoverage":false},{"functionName":"enter","ranges":[{"startOffset":1163,"endOffset":1225,"count":0}],"isBlockCoverage":false},{"functionName":"enter","ranges":[{"startOffset":1235,"endOffset":1735,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":1738,"endOffset":1806,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":1816,"endOffset":2383,"count":0}],"isBlockCoverage":false}]},{"scriptId":"978","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_proxy_config.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5565,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":1852,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":296,"endOffset":420,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":501,"endOffset":621,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":780,"endOffset":877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":924,"endOffset":966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1126,"endOffset":1190,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1237,"endOffset":1279,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1379,"endOffset":1443,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1490,"endOffset":1532,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1642,"endOffset":1739,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1786,"endOffset":1828,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_proxy_config","ranges":[{"startOffset":1856,"endOffset":2199,"count":2}],"isBlockCoverage":true},{"functionName":"bypass_proxy","ranges":[{"startOffset":2202,"endOffset":3352,"count":6},{"startOffset":3212,"endOffset":3260,"count":0},{"startOffset":3262,"endOffset":3320,"count":0}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3355,"endOffset":3626,"count":2}],"isBlockCoverage":true},{"functionName":"get_proxy_authentication","ranges":[{"startOffset":3629,"endOffset":4242,"count":2}],"isBlockCoverage":true},{"functionName":"get_proxy_port","ranges":[{"startOffset":4245,"endOffset":4841,"count":2}],"isBlockCoverage":true},{"functionName":"get_proxy_url","ranges":[{"startOffset":4844,"endOffset":5400,"count":2}],"isBlockCoverage":true}]},{"scriptId":"979","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":148134,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":43207,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":287,"endOffset":1699,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1782,"endOffset":2667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2765,"endOffset":2862,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2961,"endOffset":3058,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3141,"endOffset":4500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4580,"endOffset":4698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4783,"endOffset":4921,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5010,"endOffset":5142,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5230,"endOffset":5364,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5462,"endOffset":9858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10200,"endOffset":14762,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14806,"endOffset":15459,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15569,"endOffset":16222,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16329,"endOffset":20891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20933,"endOffset":21051,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21095,"endOffset":21748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21868,"endOffset":23023,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23131,"endOffset":24513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24759,"endOffset":24891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25036,"endOffset":25134,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25184,"endOffset":25290,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25344,"endOffset":25446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25496,"endOffset":25602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25648,"endOffset":25745,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25795,"endOffset":27744,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27797,"endOffset":28952,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29006,"endOffset":29099,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29153,"endOffset":29247,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29301,"endOffset":29411,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29515,"endOffset":29647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":29750,"endOffset":29888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30001,"endOffset":30097,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30194,"endOffset":34590,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34689,"endOffset":34807,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34851,"endOffset":34915,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35016,"endOffset":35699,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":35807,"endOffset":35937,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36040,"endOffset":36174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36278,"endOffset":36410,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36502,"endOffset":36620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":36738,"endOffset":37550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37652,"endOffset":37749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37859,"endOffset":37906,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":37953,"endOffset":38001,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38174,"endOffset":39059,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39219,"endOffset":40104,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40212,"endOffset":41367,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41462,"endOffset":42821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":42863,"endOffset":42981,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":43086,"endOffset":43183,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo","ranges":[{"startOffset":43211,"endOffset":53022,"count":2}],"isBlockCoverage":true},{"functionName":"bind_listener","ranges":[{"startOffset":53025,"endOffset":53316,"count":0}],"isBlockCoverage":false},{"functionName":"check_and_create_package","ranges":[{"startOffset":53319,"endOffset":55252,"count":0}],"isBlockCoverage":false},{"functionName":"check_for_restart","ranges":[{"startOffset":55255,"endOffset":56340,"count":0}],"isBlockCoverage":false},{"functionName":"check_language","ranges":[{"startOffset":56343,"endOffset":58202,"count":0}],"isBlockCoverage":false},{"functionName":"check_write_protect","ranges":[{"startOffset":58205,"endOffset":58541,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":58544,"endOffset":63228,"count":2}],"isBlockCoverage":true},{"functionName":"create_new_log","ranges":[{"startOffset":63231,"endOffset":63727,"count":0}],"isBlockCoverage":false},{"functionName":"delete_checks","ranges":[{"startOffset":63730,"endOffset":64953,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_data","ranges":[{"startOffset":64956,"endOffset":73073,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_dot_abapgit","ranges":[{"startOffset":73076,"endOffset":73978,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_objects","ranges":[{"startOffset":73981,"endOffset":81006,"count":0}],"isBlockCoverage":false},{"functionName":"find_remote_dot_abapgit","ranges":[{"startOffset":81009,"endOffset":82939,"count":2},{"startOffset":82684,"endOffset":82916,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":81886,"endOffset":82112,"count":4}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":82141,"endOffset":82163,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":82254,"endOffset":82280,"count":0}],"isBlockCoverage":false},{"functionName":"find_remote_dot_apack","ranges":[{"startOffset":82942,"endOffset":84922,"count":0}],"isBlockCoverage":false},{"functionName":"get_data_config","ranges":[{"startOffset":84925,"endOffset":86627,"count":0}],"isBlockCoverage":false},{"functionName":"get_dot_apack","ranges":[{"startOffset":86630,"endOffset":87072,"count":0}],"isBlockCoverage":false},{"functionName":"get_log","ranges":[{"startOffset":87075,"endOffset":87265,"count":0}],"isBlockCoverage":false},{"functionName":"get_unsupported_objects_local","ranges":[{"startOffset":87268,"endOffset":91714,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_local_settings","ranges":[{"startOffset":91717,"endOffset":93162,"count":0}],"isBlockCoverage":false},{"functionName":"notify_listener","ranges":[{"startOffset":93165,"endOffset":99293,"count":1},{"startOffset":99047,"endOffset":99289,"count":0}],"isBlockCoverage":true},{"functionName":"refresh_local_object","ranges":[{"startOffset":99296,"endOffset":103969,"count":0}],"isBlockCoverage":false},{"functionName":"refresh_local_objects","ranges":[{"startOffset":103972,"endOffset":104121,"count":0}],"isBlockCoverage":false},{"functionName":"remove_ignored_files","ranges":[{"startOffset":104124,"endOffset":106327,"count":0}],"isBlockCoverage":false},{"functionName":"reset_remote","ranges":[{"startOffset":106330,"endOffset":106494,"count":0}],"isBlockCoverage":false},{"functionName":"reset_status","ranges":[{"startOffset":106497,"endOffset":106566,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":106569,"endOffset":115050,"count":1},{"startOffset":106720,"endOffset":106747,"count":0},{"startOffset":106904,"endOffset":106947,"count":0},{"startOffset":107108,"endOffset":107159,"count":0},{"startOffset":107316,"endOffset":107359,"count":0},{"startOffset":107499,"endOffset":107534,"count":0},{"startOffset":110789,"endOffset":110838,"count":0},{"startOffset":110990,"endOffset":111041,"count":0},{"startOffset":111194,"endOffset":111245,"count":0},{"startOffset":111414,"endOffset":111465,"count":0},{"startOffset":113066,"endOffset":113101,"count":0},{"startOffset":113102,"endOffset":113138,"count":0},{"startOffset":113139,"endOffset":113175,"count":0},{"startOffset":113176,"endOffset":113212,"count":0},{"startOffset":113246,"endOffset":113348,"count":0},{"startOffset":113388,"endOffset":113514,"count":0},{"startOffset":113558,"endOffset":113696,"count":0},{"startOffset":113736,"endOffset":113862,"count":0},{"startOffset":113898,"endOffset":114012,"count":0},{"startOffset":114221,"endOffset":114455,"count":0},{"startOffset":114536,"endOffset":114805,"count":0},{"startOffset":114849,"endOffset":114987,"count":0}],"isBlockCoverage":true},{"functionName":"set_dot_apack","ranges":[{"startOffset":115053,"endOffset":115477,"count":0}],"isBlockCoverage":false},{"functionName":"set_files_remote","ranges":[{"startOffset":115480,"endOffset":116569,"count":2}],"isBlockCoverage":true},{"functionName":"set_local_settings","ranges":[{"startOffset":116572,"endOffset":117900,"count":0}],"isBlockCoverage":false},{"functionName":"status","ranges":[{"startOffset":117903,"endOffset":119760,"count":0}],"isBlockCoverage":false},{"functionName":"switch_repo_type","ranges":[{"startOffset":119763,"endOffset":120700,"count":0}],"isBlockCoverage":false},{"functionName":"update_last_deserialize","ranges":[{"startOffset":120703,"endOffset":121174,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$checksums","ranges":[{"startOffset":121177,"endOffset":121523,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$deserialize","ranges":[{"startOffset":121526,"endOffset":128706,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$deserialize_checks","ranges":[{"startOffset":128709,"endOffset":136490,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_dot_abapgit","ranges":[{"startOffset":136493,"endOffset":136842,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_files_local","ranges":[{"startOffset":136845,"endOffset":140611,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_files_remote","ranges":[{"startOffset":140614,"endOffset":143684,"count":2},{"startOffset":141715,"endOffset":141737,"count":0},{"startOffset":141739,"endOffset":141780,"count":0},{"startOffset":141904,"endOffset":141928,"count":0},{"startOffset":141930,"endOffset":141975,"count":0},{"startOffset":142004,"endOffset":142042,"count":0},{"startOffset":143129,"endOffset":143524,"count":0},{"startOffset":143591,"endOffset":143659,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_repo$get_key","ranges":[{"startOffset":143687,"endOffset":143886,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_local_settings","ranges":[{"startOffset":143889,"endOffset":145181,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_name","ranges":[{"startOffset":145184,"endOffset":145382,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_package","ranges":[{"startOffset":145385,"endOffset":145601,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$is_offline","ranges":[{"startOffset":145604,"endOffset":145820,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$refresh","ranges":[{"startOffset":145823,"endOffset":146767,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$set_dot_abapgit","ranges":[{"startOffset":146770,"endOffset":147124,"count":1}],"isBlockCoverage":true},{"functionName":"check_abap_language_version","ranges":[{"startOffset":147127,"endOffset":148001,"count":0}],"isBlockCoverage":false}]},{"scriptId":"980","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_checksums.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":36513,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":193,"endOffset":8439,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":392,"endOffset":491,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":572,"endOffset":692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":867,"endOffset":2292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2409,"endOffset":3677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3721,"endOffset":5146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5251,"endOffset":6519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6616,"endOffset":6680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6781,"endOffset":6845,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6946,"endOffset":7045,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7147,"endOffset":8415,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo_checksums","ranges":[{"startOffset":8443,"endOffset":8761,"count":4}],"isBlockCoverage":true},{"functionName":"add_meta","ranges":[{"startOffset":8764,"endOffset":9273,"count":3}],"isBlockCoverage":true},{"functionName":"build_checksums_from_files","ranges":[{"startOffset":9276,"endOffset":16134,"count":2},{"startOffset":15530,"endOffset":16105,"count":5},{"startOffset":15635,"endOffset":15715,"count":2},{"startOffset":15717,"endOffset":15935,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":16137,"endOffset":16628,"count":4}],"isBlockCoverage":true},{"functionName":"extract_meta","ranges":[{"startOffset":16631,"endOffset":17127,"count":2},{"startOffset":16979,"endOffset":17000,"count":0}],"isBlockCoverage":true},{"functionName":"force_write","ranges":[{"startOffset":17130,"endOffset":18575,"count":0}],"isBlockCoverage":false},{"functionName":"remove_non_code_related_files","ranges":[{"startOffset":18578,"endOffset":20493,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":20203,"endOffset":20486,"count":6},{"startOffset":20247,"endOffset":20484,"count":2}],"isBlockCoverage":true},{"functionName":"save_checksums","ranges":[{"startOffset":20496,"endOffset":22316,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_repo_checksums$get","ranges":[{"startOffset":22319,"endOffset":24466,"count":2},{"startOffset":23888,"endOffset":24178,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_repo_checksums$get_checksums_per_file","ranges":[{"startOffset":24469,"endOffset":27863,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_checksums$rebuild","ranges":[{"startOffset":27866,"endOffset":30922,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_repo_checksums$update","ranges":[{"startOffset":30925,"endOffset":34874,"count":1}],"isBlockCoverage":true}]},{"scriptId":"981","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_checksums.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":52296,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":3579,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":338,"endOffset":402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":482,"endOffset":546,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":696,"endOffset":760,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":808,"endOffset":2076,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2178,"endOffset":3446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3491,"endOffset":3555,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_checksum_serializer","ranges":[{"startOffset":3583,"endOffset":3776,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3779,"endOffset":3892,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":3895,"endOffset":3980,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize","ranges":[{"startOffset":3990,"endOffset":10235,"count":6},{"startOffset":8747,"endOffset":10170,"count":27},{"startOffset":8831,"endOffset":8858,"count":0},{"startOffset":8966,"endOffset":9516,"count":16},{"startOffset":9024,"endOffset":9066,"count":0},{"startOffset":9466,"endOffset":9508,"count":0},{"startOffset":9516,"endOffset":10164,"count":11},{"startOffset":9583,"endOffset":9648,"count":1},{"startOffset":9648,"endOffset":10164,"count":10},{"startOffset":10114,"endOffset":10156,"count":0}],"isBlockCoverage":true},{"functionName":"serialize","ranges":[{"startOffset":10238,"endOffset":10319,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":10329,"endOffset":16235,"count":6},{"startOffset":15080,"endOffset":16099,"count":10},{"startOffset":15227,"endOffset":15254,"count":1},{"startOffset":15254,"endOffset":15334,"count":9},{"startOffset":15334,"endOffset":15568,"count":7},{"startOffset":15568,"endOffset":15635,"count":2},{"startOffset":15635,"endOffset":15785,"count":9},{"startOffset":15785,"endOffset":16093,"count":13},{"startOffset":16093,"endOffset":16099,"count":9}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16625,"endOffset":27392,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":16910,"endOffset":17574,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17622,"endOffset":18924,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19024,"endOffset":20436,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20487,"endOffset":21151,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21199,"endOffset":22501,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22609,"endOffset":23877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23929,"endOffset":24582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24638,"endOffset":25906,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25956,"endOffset":27368,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_update_calculator","ranges":[{"startOffset":27396,"endOffset":27481,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":27484,"endOffset":27597,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_updated","ranges":[{"startOffset":27600,"endOffset":27695,"count":0}],"isBlockCoverage":false},{"functionName":"calculate_updated","ranges":[{"startOffset":27705,"endOffset":35057,"count":2}],"isBlockCoverage":true},{"functionName":"process_updated_files","ranges":[{"startOffset":35060,"endOffset":35163,"count":0}],"isBlockCoverage":false},{"functionName":"process_updated_files","ranges":[{"startOffset":35173,"endOffset":41124,"count":2},{"startOffset":39558,"endOffset":41006,"count":4},{"startOffset":39738,"endOffset":40795,"count":6},{"startOffset":40437,"endOffset":40468,"count":2},{"startOffset":40468,"endOffset":40532,"count":4},{"startOffset":40532,"endOffset":40641,"count":0},{"startOffset":40641,"endOffset":40787,"count":4},{"startOffset":40912,"endOffset":41000,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":39932,"endOffset":40055,"count":10}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":40088,"endOffset":40110,"count":8}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":40149,"endOffset":40175,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":41072,"endOffset":41117,"count":4}],"isBlockCoverage":true},{"functionName":"add_new_files","ranges":[{"startOffset":41127,"endOffset":41214,"count":0}],"isBlockCoverage":false},{"functionName":"add_new_files","ranges":[{"startOffset":41224,"endOffset":52074,"count":2},{"startOffset":50260,"endOffset":52070,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":50394,"endOffset":50547,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":50578,"endOffset":50611,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":50654,"endOffset":50691,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":51100,"endOffset":51277,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":51308,"endOffset":51345,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":51400,"endOffset":51437,"count":0}],"isBlockCoverage":false}]},{"scriptId":"982","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_content_list.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":72726,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":16756,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":307,"endOffset":423,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":503,"endOffset":621,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":704,"endOffset":1117,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1289,"endOffset":3583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3703,"endOffset":5997,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6099,"endOffset":6163,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6212,"endOffset":8506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8618,"endOffset":10912,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11018,"endOffset":13312,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13469,"endOffset":13585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13681,"endOffset":15975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16018,"endOffset":16082,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16131,"endOffset":16228,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16279,"endOffset":16376,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16425,"endOffset":16522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16614,"endOffset":16732,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo_content_list","ranges":[{"startOffset":16760,"endOffset":17150,"count":0}],"isBlockCoverage":false},{"functionName":"build_folders","ranges":[{"startOffset":17153,"endOffset":30812,"count":0}],"isBlockCoverage":false},{"functionName":"build_repo_items_local_only","ranges":[{"startOffset":30815,"endOffset":39294,"count":0}],"isBlockCoverage":false},{"functionName":"build_repo_items_with_remote","ranges":[{"startOffset":39297,"endOffset":52002,"count":0}],"isBlockCoverage":false},{"functionName":"check_repo_size","ranges":[{"startOffset":52005,"endOffset":54259,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":54262,"endOffset":54606,"count":0}],"isBlockCoverage":false},{"functionName":"determine_transports","ranges":[{"startOffset":54609,"endOffset":60349,"count":0}],"isBlockCoverage":false},{"functionName":"filter_changes","ranges":[{"startOffset":60352,"endOffset":65473,"count":0}],"isBlockCoverage":false},{"functionName":"get_log","ranges":[{"startOffset":65476,"endOffset":67770,"count":0}],"isBlockCoverage":false},{"functionName":"list","ranges":[{"startOffset":67773,"endOffset":71726,"count":0}],"isBlockCoverage":false}]},{"scriptId":"983","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_cs_migration.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8908,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":1212,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":397,"endOffset":726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":835,"endOffset":934,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1041,"endOffset":1140,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo_cs_migration","ranges":[{"startOffset":1216,"endOffset":1301,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1304,"endOffset":1417,"count":0}],"isBlockCoverage":false},{"functionName":"clear_repo_metadata","ranges":[{"startOffset":1420,"endOffset":1527,"count":0}],"isBlockCoverage":false},{"functionName":"clear_repo_metadata","ranges":[{"startOffset":1537,"endOffset":2112,"count":0}],"isBlockCoverage":false},{"functionName":"convert_checksums","ranges":[{"startOffset":2115,"endOffset":2218,"count":0}],"isBlockCoverage":false},{"functionName":"convert_checksums","ranges":[{"startOffset":2228,"endOffset":5261,"count":0}],"isBlockCoverage":false},{"functionName":"get_unconverted_repo_ids","ranges":[{"startOffset":5264,"endOffset":5371,"count":0}],"isBlockCoverage":false},{"functionName":"get_unconverted_repo_ids","ranges":[{"startOffset":5381,"endOffset":7526,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":7529,"endOffset":7594,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":7604,"endOffset":8364,"count":0}],"isBlockCoverage":false}]},{"scriptId":"984","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_filter.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":22617,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":5122,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":374,"endOffset":1183,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1276,"endOffset":2085,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2129,"endOffset":2938,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3045,"endOffset":3854,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3896,"endOffset":4026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4073,"endOffset":4169,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4213,"endOffset":5098,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo_filter","ranges":[{"startOffset":5126,"endOffset":5211,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5214,"endOffset":5327,"count":0}],"isBlockCoverage":false},{"functionName":"apply","ranges":[{"startOffset":5330,"endOffset":9648,"count":0}],"isBlockCoverage":false},{"functionName":"apply_object_filter","ranges":[{"startOffset":9651,"endOffset":16880,"count":0}],"isBlockCoverage":false},{"functionName":"filter_generated_tadir","ranges":[{"startOffset":16883,"endOffset":22452,"count":0}],"isBlockCoverage":false}]},{"scriptId":"985","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_offline.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2935,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":224,"endOffset":753,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":533,"endOffset":597,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo_offline","ranges":[{"startOffset":757,"endOffset":855,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":858,"endOffset":971,"count":2}],"isBlockCoverage":true},{"functionName":"has_remote_source","ranges":[{"startOffset":974,"endOffset":1253,"count":0}],"isBlockCoverage":false},{"functionName":"reset_remote","ranges":[{"startOffset":1256,"endOffset":2296,"count":0}],"isBlockCoverage":false},{"functionName":"set_name","ranges":[{"startOffset":2299,"endOffset":2490,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_name","ranges":[{"startOffset":2493,"endOffset":2770,"count":0}],"isBlockCoverage":false}]},{"scriptId":"986","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_online.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":35951,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":4227,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":433,"endOffset":1318,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1409,"endOffset":1511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1670,"endOffset":1788,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1888,"endOffset":2773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2930,"endOffset":3815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3929,"endOffset":3993,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo_online","ranges":[{"startOffset":4231,"endOffset":6102,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":6105,"endOffset":6218,"count":0}],"isBlockCoverage":false},{"functionName":"fetch_remote","ranges":[{"startOffset":6221,"endOffset":9483,"count":0}],"isBlockCoverage":false},{"functionName":"get_objects","ranges":[{"startOffset":9486,"endOffset":10494,"count":0}],"isBlockCoverage":false},{"functionName":"handle_stage_ignore","ranges":[{"startOffset":10497,"endOffset":15949,"count":0}],"isBlockCoverage":false},{"functionName":"has_remote_source","ranges":[{"startOffset":15952,"endOffset":16142,"count":0}],"isBlockCoverage":false},{"functionName":"raise_error_if_branch_exists","ranges":[{"startOffset":16145,"endOffset":18183,"count":0}],"isBlockCoverage":false},{"functionName":"set_objects","ranges":[{"startOffset":18186,"endOffset":19216,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$check_for_valid_branch","ranges":[{"startOffset":19219,"endOffset":21195,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$create_branch","ranges":[{"startOffset":21198,"endOffset":22283,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$get_current_remote","ranges":[{"startOffset":22286,"endOffset":22540,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$get_selected_branch","ranges":[{"startOffset":22543,"endOffset":22779,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$get_selected_commit","ranges":[{"startOffset":22782,"endOffset":23051,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$get_switched_origin","ranges":[{"startOffset":23054,"endOffset":23331,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$get_url","ranges":[{"startOffset":23334,"endOffset":23539,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$push","ranges":[{"startOffset":23542,"endOffset":29786,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$select_branch","ranges":[{"startOffset":29789,"endOffset":30170,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$select_commit","ranges":[{"startOffset":30173,"endOffset":30534,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$set_url","ranges":[{"startOffset":30537,"endOffset":30816,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_online$switch_origin","ranges":[{"startOffset":30819,"endOffset":33404,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_files_remote","ranges":[{"startOffset":33407,"endOffset":35070,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_name","ranges":[{"startOffset":35073,"endOffset":35790,"count":0}],"isBlockCoverage":false}]},{"scriptId":"987","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_srv.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":136771,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":16988,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":329,"endOffset":457,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":538,"endOffset":635,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":726,"endOffset":823,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":904,"endOffset":1240,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1400,"endOffset":1464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1507,"endOffset":1571,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1613,"endOffset":1677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1900,"endOffset":2020,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2068,"endOffset":6464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6553,"endOffset":6673,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6776,"endOffset":6875,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6918,"endOffset":11226,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11342,"endOffset":11438,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11482,"endOffset":16093,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16142,"endOffset":16239,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16282,"endOffset":16402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16447,"endOffset":16511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16608,"endOffset":16736,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16836,"endOffset":16964,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo_srv","ranges":[{"startOffset":16992,"endOffset":17679,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":17682,"endOffset":17795,"count":0}],"isBlockCoverage":false},{"functionName":"add","ranges":[{"startOffset":17798,"endOffset":18876,"count":0}],"isBlockCoverage":false},{"functionName":"determine_branch_name","ranges":[{"startOffset":18879,"endOffset":20094,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":20097,"endOffset":20171,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":20181,"endOffset":20575,"count":4},{"startOffset":20394,"endOffset":20507,"count":0}],"isBlockCoverage":true},{"functionName":"inject_instance","ranges":[{"startOffset":20578,"endOffset":20668,"count":0}],"isBlockCoverage":false},{"functionName":"inject_instance","ranges":[{"startOffset":20678,"endOffset":20947,"count":4}],"isBlockCoverage":true},{"functionName":"instantiate_and_add","ranges":[{"startOffset":20950,"endOffset":25978,"count":0}],"isBlockCoverage":false},{"functionName":"refresh_all","ranges":[{"startOffset":25981,"endOffset":35501,"count":0}],"isBlockCoverage":false},{"functionName":"refresh_favorites","ranges":[{"startOffset":35504,"endOffset":46935,"count":0}],"isBlockCoverage":false},{"functionName":"reinstantiate_repo","ranges":[{"startOffset":46938,"endOffset":56437,"count":0}],"isBlockCoverage":false},{"functionName":"validate_sub_super_packages","ranges":[{"startOffset":56440,"endOffset":69250,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_listener$on_meta_change","ranges":[{"startOffset":69253,"endOffset":75859,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$delete","ranges":[{"startOffset":75862,"endOffset":77068,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$get","ranges":[{"startOffset":77071,"endOffset":78631,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$get_label_list","ranges":[{"startOffset":78634,"endOffset":82139,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$get_repo_from_package","ranges":[{"startOffset":82142,"endOffset":93396,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$get_repo_from_url","ranges":[{"startOffset":93399,"endOffset":104736,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$init","ranges":[{"startOffset":104739,"endOffset":104819,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$is_repo_installed","ranges":[{"startOffset":104822,"endOffset":107300,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$list","ranges":[{"startOffset":107303,"endOffset":107904,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$list_favorites","ranges":[{"startOffset":107907,"endOffset":109808,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$new_offline","ranges":[{"startOffset":109811,"endOffset":118358,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$new_online","ranges":[{"startOffset":118361,"endOffset":129444,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$purge","ranges":[{"startOffset":129447,"endOffset":133138,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$validate_package","ranges":[{"startOffset":133141,"endOffset":135409,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$validate_url","ranges":[{"startOffset":135412,"endOffset":136478,"count":0}],"isBlockCoverage":false}]},{"scriptId":"988","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_requirement_helper.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":29951,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":5819,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":402,"endOffset":1441,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1555,"endOffset":2594,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2645,"endOffset":3220,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3333,"endOffset":3430,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3475,"endOffset":4276,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4388,"endOffset":4963,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5070,"endOffset":5169,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5220,"endOffset":5795,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_requirement_helper","ranges":[{"startOffset":5823,"endOffset":5908,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5911,"endOffset":6024,"count":0}],"isBlockCoverage":false},{"functionName":"get_requirement_met_status","ranges":[{"startOffset":6027,"endOffset":6149,"count":0}],"isBlockCoverage":false},{"functionName":"get_requirement_met_status","ranges":[{"startOffset":6159,"endOffset":12069,"count":0}],"isBlockCoverage":false},{"functionName":"is_requirements_met","ranges":[{"startOffset":12074,"endOffset":12186,"count":0}],"isBlockCoverage":false},{"functionName":"is_requirements_met","ranges":[{"startOffset":12198,"endOffset":14797,"count":0}],"isBlockCoverage":false},{"functionName":"is_version_greater_or_equal","ranges":[{"startOffset":14802,"endOffset":14930,"count":0}],"isBlockCoverage":false},{"functionName":"is_version_greater_or_equal","ranges":[{"startOffset":14942,"endOffset":17111,"count":0}],"isBlockCoverage":false},{"functionName":"requirements_popup","ranges":[{"startOffset":17116,"endOffset":17226,"count":0}],"isBlockCoverage":false},{"functionName":"requirements_popup","ranges":[{"startOffset":17238,"endOffset":19779,"count":0}],"isBlockCoverage":false},{"functionName":"show_requirement_popup","ranges":[{"startOffset":19784,"endOffset":19902,"count":0}],"isBlockCoverage":false},{"functionName":"show_requirement_popup","ranges":[{"startOffset":19914,"endOffset":27829,"count":0}],"isBlockCoverage":false}]},{"scriptId":"989","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sap_namespace.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2317,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":326,"count":1}],"isBlockCoverage":true},{"functionName":"zcl_abapgit_sap_namespace","ranges":[{"startOffset":330,"endOffset":415,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":418,"endOffset":531,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_namespace$exists","ranges":[{"startOffset":534,"endOffset":1302,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_namespace$is_editable","ranges":[{"startOffset":1305,"endOffset":2148,"count":0}],"isBlockCoverage":false}]},{"scriptId":"990","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sap_package.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":31857,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":686,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":317,"endOffset":413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":566,"endOffset":662,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_sap_package","ranges":[{"startOffset":690,"endOffset":879,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":882,"endOffset":1141,"count":6}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$are_changes_recorded_in_tr_req","ranges":[{"startOffset":1144,"endOffset":2808,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create","ranges":[{"startOffset":2813,"endOffset":10982,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_child","ranges":[{"startOffset":10995,"endOffset":14089,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_local","ranges":[{"startOffset":14104,"endOffset":15675,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$exists","ranges":[{"startOffset":15690,"endOffset":16911,"count":6},{"startOffset":15973,"endOffset":16046,"count":0},{"startOffset":16265,"endOffset":16332,"count":0},{"startOffset":16355,"endOffset":16416,"count":0},{"startOffset":16439,"endOffset":16499,"count":0},{"startOffset":16522,"endOffset":16599,"count":0},{"startOffset":16647,"endOffset":16709,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$get_transport_layer","ranges":[{"startOffset":16928,"endOffset":18610,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_type","ranges":[{"startOffset":18629,"endOffset":23309,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_subpackages","ranges":[{"startOffset":23332,"endOffset":26083,"count":3},{"startOffset":24611,"endOffset":25936,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":25488,"endOffset":25519,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_superpackages","ranges":[{"startOffset":26110,"endOffset":27672,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_description","ranges":[{"startOffset":27699,"endOffset":28218,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_parent","ranges":[{"startOffset":28245,"endOffset":29072,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_responsible","ranges":[{"startOffset":29099,"endOffset":29615,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$validate_name","ranges":[{"startOffset":29642,"endOffset":31644,"count":0}],"isBlockCoverage":false}]},{"scriptId":"991","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sap_report.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16321,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":1776,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":395,"endOffset":508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":554,"endOffset":650,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":696,"endOffset":809,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":914,"endOffset":956,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":999,"endOffset":1593,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1639,"endOffset":1752,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_sap_report","ranges":[{"startOffset":1780,"endOffset":1865,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1868,"endOffset":1981,"count":0}],"isBlockCoverage":false},{"functionName":"authorization_check","ranges":[{"startOffset":1984,"endOffset":4891,"count":0}],"isBlockCoverage":false},{"functionName":"get_language_version","ranges":[{"startOffset":4896,"endOffset":5882,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_report$delete_report","ranges":[{"startOffset":5887,"endOffset":7769,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_report$insert_report","ranges":[{"startOffset":7774,"endOffset":11000,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_report$read_report","ranges":[{"startOffset":11005,"endOffset":13087,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_report$update_report","ranges":[{"startOffset":13092,"endOffset":16160,"count":0}],"isBlockCoverage":false}]},{"scriptId":"992","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_serialize.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":96378,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":26257,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":290,"endOffset":350,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":432,"endOffset":1844,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1925,"endOffset":1985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2065,"endOffset":2183,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2265,"endOffset":2365,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2453,"endOffset":2583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2674,"endOffset":3829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3917,"endOffset":4640,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4807,"endOffset":5530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5572,"endOffset":5702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5759,"endOffset":5856,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5954,"endOffset":6050,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6094,"endOffset":7506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7607,"endOffset":7741,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7785,"endOffset":9197,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9299,"endOffset":10711,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10810,"endOffset":10874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10922,"endOffset":12492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12591,"endOffset":13182,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13225,"endOffset":13323,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13424,"endOffset":14015,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14115,"endOffset":14211,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14253,"endOffset":14371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14416,"endOffset":15225,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15269,"endOffset":16681,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16791,"endOffset":16851,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16906,"endOffset":17003,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17116,"endOffset":17925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18036,"endOffset":18132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18176,"endOffset":18985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19089,"endOffset":19219,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19272,"endOffset":20427,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20526,"endOffset":20568,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20664,"endOffset":22076,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22122,"endOffset":22218,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22262,"endOffset":23071,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23113,"endOffset":23231,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23286,"endOffset":23383,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":23481,"endOffset":24893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24939,"endOffset":25035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25077,"endOffset":25195,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25240,"endOffset":26049,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":26099,"endOffset":26233,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_serialize","ranges":[{"startOffset":26261,"endOffset":30168,"count":2}],"isBlockCoverage":true},{"functionName":"add_apack","ranges":[{"startOffset":30171,"endOffset":33849,"count":0}],"isBlockCoverage":false},{"functionName":"add_data","ranges":[{"startOffset":33852,"endOffset":39547,"count":0}],"isBlockCoverage":false},{"functionName":"add_dot_abapgit","ranges":[{"startOffset":39550,"endOffset":42415,"count":0}],"isBlockCoverage":false},{"functionName":"add_objects","ranges":[{"startOffset":42418,"endOffset":48466,"count":0}],"isBlockCoverage":false},{"functionName":"add_to_return","ranges":[{"startOffset":48469,"endOffset":52407,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":52410,"endOffset":54898,"count":2},{"startOffset":52593,"endOffset":52616,"count":0},{"startOffset":52618,"endOffset":52661,"count":0},{"startOffset":53845,"endOffset":53871,"count":0},{"startOffset":53873,"endOffset":53922,"count":0},{"startOffset":54455,"endOffset":54543,"count":0}],"isBlockCoverage":true},{"functionName":"determine_i18n_params","ranges":[{"startOffset":54901,"endOffset":55004,"count":2}],"isBlockCoverage":true},{"functionName":"determine_i18n_params","ranges":[{"startOffset":55014,"endOffset":56916,"count":2},{"startOffset":56244,"endOffset":56736,"count":0}],"isBlockCoverage":true},{"functionName":"determine_max_threads","ranges":[{"startOffset":56919,"endOffset":60927,"count":2},{"startOffset":57150,"endOffset":57178,"count":1},{"startOffset":57180,"endOffset":57233,"count":1},{"startOffset":57262,"endOffset":57304,"count":1},{"startOffset":57306,"endOffset":57354,"count":1},{"startOffset":57425,"endOffset":57609,"count":1},{"startOffset":57609,"endOffset":57701,"count":0},{"startOffset":57701,"endOffset":57776,"count":1},{"startOffset":57776,"endOffset":57846,"count":0},{"startOffset":57848,"endOffset":57898,"count":0},{"startOffset":57898,"endOffset":57964,"count":1},{"startOffset":57964,"endOffset":58034,"count":0},{"startOffset":58034,"endOffset":58178,"count":1},{"startOffset":58178,"endOffset":58227,"count":0},{"startOffset":58227,"endOffset":58518,"count":1},{"startOffset":58397,"endOffset":58448,"count":0},{"startOffset":58472,"endOffset":58510,"count":0},{"startOffset":58518,"endOffset":58700,"count":1},{"startOffset":58700,"endOffset":60255,"count":0},{"startOffset":60255,"endOffset":60356,"count":1},{"startOffset":60356,"endOffset":60511,"count":0},{"startOffset":60511,"endOffset":60733,"count":1},{"startOffset":60733,"endOffset":60830,"count":0},{"startOffset":60830,"endOffset":60926,"count":1}],"isBlockCoverage":true},{"functionName":"files_local","ranges":[{"startOffset":60934,"endOffset":64244,"count":0}],"isBlockCoverage":false},{"functionName":"filter_ignored_objects","ranges":[{"startOffset":64251,"endOffset":71520,"count":0}],"isBlockCoverage":false},{"functionName":"filter_unsupported_objects","ranges":[{"startOffset":71527,"endOffset":77694,"count":0}],"isBlockCoverage":false},{"functionName":"on_end_of_task","ranges":[{"startOffset":77701,"endOffset":80801,"count":0}],"isBlockCoverage":false},{"functionName":"run_parallel","ranges":[{"startOffset":80808,"endOffset":84180,"count":0}],"isBlockCoverage":false},{"functionName":"run_sequential","ranges":[{"startOffset":84189,"endOffset":87721,"count":0}],"isBlockCoverage":false},{"functionName":"serialize","ranges":[{"startOffset":87730,"endOffset":95085,"count":0}],"isBlockCoverage":false}]},{"scriptId":"993","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_abapgit.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":23154,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":135,"endOffset":2752,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":311,"endOffset":375,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":467,"endOffset":531,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":623,"endOffset":687,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":779,"endOffset":843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":932,"endOffset":1032,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1122,"endOffset":1186,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1355,"endOffset":1451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1560,"endOffset":1656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1817,"endOffset":1881,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1988,"endOffset":2052,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2159,"endOffset":2223,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2458,"endOffset":2506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2674,"endOffset":2728,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_services_abapgit","ranges":[{"startOffset":2756,"endOffset":3297,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3300,"endOffset":3413,"count":0}],"isBlockCoverage":false},{"functionName":"check_sapgui","ranges":[{"startOffset":3416,"endOffset":3498,"count":0}],"isBlockCoverage":false},{"functionName":"check_sapgui","ranges":[{"startOffset":3508,"endOffset":6695,"count":0}],"isBlockCoverage":false},{"functionName":"get_abapgit_tcode","ranges":[{"startOffset":6698,"endOffset":6790,"count":0}],"isBlockCoverage":false},{"functionName":"get_abapgit_tcode","ranges":[{"startOffset":6800,"endOffset":7698,"count":0}],"isBlockCoverage":false},{"functionName":"get_package_from_adt","ranges":[{"startOffset":7701,"endOffset":7799,"count":0}],"isBlockCoverage":false},{"functionName":"get_package_from_adt","ranges":[{"startOffset":7809,"endOffset":13053,"count":0}],"isBlockCoverage":false},{"functionName":"is_installed","ranges":[{"startOffset":13056,"endOffset":13138,"count":0}],"isBlockCoverage":false},{"functionName":"is_installed","ranges":[{"startOffset":13148,"endOffset":13532,"count":0}],"isBlockCoverage":false},{"functionName":"open_abapgit_changelog","ranges":[{"startOffset":13535,"endOffset":13637,"count":0}],"isBlockCoverage":false},{"functionName":"open_abapgit_changelog","ranges":[{"startOffset":13647,"endOffset":13906,"count":0}],"isBlockCoverage":false},{"functionName":"open_abapgit_homepage","ranges":[{"startOffset":13909,"endOffset":14019,"count":0}],"isBlockCoverage":false},{"functionName":"open_abapgit_homepage","ranges":[{"startOffset":14029,"endOffset":14389,"count":0}],"isBlockCoverage":false},{"functionName":"open_abapgit_wikipage","ranges":[{"startOffset":14392,"endOffset":14502,"count":0}],"isBlockCoverage":false},{"functionName":"open_abapgit_wikipage","ranges":[{"startOffset":14512,"endOffset":14872,"count":0}],"isBlockCoverage":false},{"functionName":"open_dotabap_homepage","ranges":[{"startOffset":14875,"endOffset":14975,"count":0}],"isBlockCoverage":false},{"functionName":"open_dotabap_homepage","ranges":[{"startOffset":14985,"endOffset":15115,"count":0}],"isBlockCoverage":false},{"functionName":"open_url_in_browser","ranges":[{"startOffset":15118,"endOffset":15224,"count":0}],"isBlockCoverage":false},{"functionName":"open_url_in_browser","ranges":[{"startOffset":15234,"endOffset":16057,"count":0}],"isBlockCoverage":false},{"functionName":"prepare_gui_startup","ranges":[{"startOffset":16060,"endOffset":16156,"count":0}],"isBlockCoverage":false},{"functionName":"prepare_gui_startup","ranges":[{"startOffset":16166,"endOffset":17855,"count":0}],"isBlockCoverage":false},{"functionName":"set_start_repo_from_package","ranges":[{"startOffset":17858,"endOffset":17980,"count":0}],"isBlockCoverage":false},{"functionName":"set_start_repo_from_package","ranges":[{"startOffset":17990,"endOffset":21868,"count":0}],"isBlockCoverage":false}]},{"scriptId":"994","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_basis.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5698,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":875,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":393,"endOffset":441,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":544,"endOffset":640,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":694,"endOffset":790,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_services_basis","ranges":[{"startOffset":879,"endOffset":964,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":967,"endOffset":1080,"count":0}],"isBlockCoverage":false},{"functionName":"create_package","ranges":[{"startOffset":1083,"endOffset":1177,"count":0}],"isBlockCoverage":false},{"functionName":"create_package","ranges":[{"startOffset":1187,"endOffset":3555,"count":0}],"isBlockCoverage":false},{"functionName":"open_ie_devtools","ranges":[{"startOffset":3558,"endOffset":3646,"count":0}],"isBlockCoverage":false},{"functionName":"open_ie_devtools","ranges":[{"startOffset":3656,"endOffset":4790,"count":0}],"isBlockCoverage":false},{"functionName":"raise_error_if_package_exists","ranges":[{"startOffset":4793,"endOffset":4917,"count":0}],"isBlockCoverage":false},{"functionName":"raise_error_if_package_exists","ranges":[{"startOffset":4927,"endOffset":5525,"count":0}],"isBlockCoverage":false}]},{"scriptId":"995","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_git.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20534,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":2764,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":357,"endOffset":456,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":554,"endOffset":653,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":751,"endOffset":850,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":948,"endOffset":1047,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1142,"endOffset":1241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1336,"endOffset":1435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1527,"endOffset":1657,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1702,"endOffset":2578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2622,"endOffset":2740,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_services_git","ranges":[{"startOffset":2768,"endOffset":2853,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2856,"endOffset":2969,"count":0}],"isBlockCoverage":false},{"functionName":"commit","ranges":[{"startOffset":2972,"endOffset":3048,"count":0}],"isBlockCoverage":false},{"functionName":"commit","ranges":[{"startOffset":3058,"endOffset":7656,"count":0}],"isBlockCoverage":false},{"functionName":"create_branch","ranges":[{"startOffset":7659,"endOffset":7749,"count":0}],"isBlockCoverage":false},{"functionName":"create_branch","ranges":[{"startOffset":7759,"endOffset":9846,"count":0}],"isBlockCoverage":false},{"functionName":"delete_branch","ranges":[{"startOffset":9849,"endOffset":9939,"count":0}],"isBlockCoverage":false},{"functionName":"delete_branch","ranges":[{"startOffset":9949,"endOffset":12252,"count":0}],"isBlockCoverage":false},{"functionName":"delete_tag","ranges":[{"startOffset":12255,"endOffset":12339,"count":0}],"isBlockCoverage":false},{"functionName":"delete_tag","ranges":[{"startOffset":12349,"endOffset":14757,"count":0}],"isBlockCoverage":false},{"functionName":"pull","ranges":[{"startOffset":14760,"endOffset":14832,"count":0}],"isBlockCoverage":false},{"functionName":"pull","ranges":[{"startOffset":14842,"endOffset":15446,"count":0}],"isBlockCoverage":false},{"functionName":"switch_branch","ranges":[{"startOffset":15449,"endOffset":15539,"count":0}],"isBlockCoverage":false},{"functionName":"switch_branch","ranges":[{"startOffset":15549,"endOffset":17808,"count":0}],"isBlockCoverage":false},{"functionName":"switch_tag","ranges":[{"startOffset":17811,"endOffset":17895,"count":0}],"isBlockCoverage":false},{"functionName":"switch_tag","ranges":[{"startOffset":17905,"endOffset":20369,"count":0}],"isBlockCoverage":false}]},{"scriptId":"996","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_repo.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":96179,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":18547,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":383,"endOffset":499,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":541,"endOffset":659,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":704,"endOffset":5266,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5367,"endOffset":5483,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5528,"endOffset":10090,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10196,"endOffset":11594,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11708,"endOffset":13106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13212,"endOffset":14155,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14251,"endOffset":14381,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14431,"endOffset":15374,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15466,"endOffset":15565,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15656,"endOffset":15755,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15845,"endOffset":15963,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16005,"endOffset":16104,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16201,"endOffset":16333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16383,"endOffset":17326,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17434,"endOffset":17533,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17633,"endOffset":17732,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17847,"endOffset":17946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18047,"endOffset":18163,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18264,"endOffset":18382,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18424,"endOffset":18523,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_services_repo","ranges":[{"startOffset":18551,"endOffset":18636,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":18639,"endOffset":18752,"count":0}],"isBlockCoverage":false},{"functionName":"activate_objects","ranges":[{"startOffset":18755,"endOffset":18852,"count":0}],"isBlockCoverage":false},{"functionName":"activate_objects","ranges":[{"startOffset":18862,"endOffset":26008,"count":0}],"isBlockCoverage":false},{"functionName":"check_package","ranges":[{"startOffset":26011,"endOffset":26102,"count":0}],"isBlockCoverage":false},{"functionName":"check_package","ranges":[{"startOffset":26112,"endOffset":27941,"count":0}],"isBlockCoverage":false},{"functionName":"delete_unnecessary_objects","ranges":[{"startOffset":27944,"endOffset":28061,"count":0}],"isBlockCoverage":false},{"functionName":"delete_unnecessary_objects","ranges":[{"startOffset":28071,"endOffset":37659,"count":0}],"isBlockCoverage":false},{"functionName":"gui_deserialize","ranges":[{"startOffset":37662,"endOffset":37757,"count":0}],"isBlockCoverage":false},{"functionName":"gui_deserialize","ranges":[{"startOffset":37767,"endOffset":44151,"count":0}],"isBlockCoverage":false},{"functionName":"new_offline","ranges":[{"startOffset":44154,"endOffset":44241,"count":0}],"isBlockCoverage":false},{"functionName":"new_offline","ranges":[{"startOffset":44251,"endOffset":46364,"count":0}],"isBlockCoverage":false},{"functionName":"new_online","ranges":[{"startOffset":46367,"endOffset":46452,"count":0}],"isBlockCoverage":false},{"functionName":"new_online","ranges":[{"startOffset":46462,"endOffset":48729,"count":0}],"isBlockCoverage":false},{"functionName":"popup_decisions","ranges":[{"startOffset":48732,"endOffset":48827,"count":0}],"isBlockCoverage":false},{"functionName":"popup_decisions","ranges":[{"startOffset":48837,"endOffset":63020,"count":0}],"isBlockCoverage":false},{"functionName":"popup_overwrite","ranges":[{"startOffset":63023,"endOffset":63118,"count":0}],"isBlockCoverage":false},{"functionName":"popup_overwrite","ranges":[{"startOffset":63128,"endOffset":72334,"count":0}],"isBlockCoverage":false},{"functionName":"popup_package_overwrite","ranges":[{"startOffset":72337,"endOffset":72448,"count":0}],"isBlockCoverage":false},{"functionName":"popup_package_overwrite","ranges":[{"startOffset":72458,"endOffset":80847,"count":0}],"isBlockCoverage":false},{"functionName":"purge","ranges":[{"startOffset":80850,"endOffset":80925,"count":0}],"isBlockCoverage":false},{"functionName":"purge","ranges":[{"startOffset":80935,"endOffset":86095,"count":0}],"isBlockCoverage":false},{"functionName":"refresh","ranges":[{"startOffset":86098,"endOffset":86177,"count":0}],"isBlockCoverage":false},{"functionName":"refresh","ranges":[{"startOffset":86187,"endOffset":86535,"count":0}],"isBlockCoverage":false},{"functionName":"refresh_local_checksums","ranges":[{"startOffset":86538,"endOffset":86649,"count":0}],"isBlockCoverage":false},{"functionName":"refresh_local_checksums","ranges":[{"startOffset":86659,"endOffset":89506,"count":0}],"isBlockCoverage":false},{"functionName":"remove","ranges":[{"startOffset":89509,"endOffset":89586,"count":0}],"isBlockCoverage":false},{"functionName":"remove","ranges":[{"startOffset":89596,"endOffset":92082,"count":0}],"isBlockCoverage":false},{"functionName":"toggle_favorite","ranges":[{"startOffset":92085,"endOffset":92180,"count":0}],"isBlockCoverage":false},{"functionName":"toggle_favorite","ranges":[{"startOffset":92190,"endOffset":92534,"count":0}],"isBlockCoverage":false},{"functionName":"transport_to_branch","ranges":[{"startOffset":92537,"endOffset":92640,"count":0}],"isBlockCoverage":false},{"functionName":"transport_to_branch","ranges":[{"startOffset":92650,"endOffset":96010,"count":0}],"isBlockCoverage":false}]},{"scriptId":"997","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_settings.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":42820,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":16483,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":284,"endOffset":2011,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2101,"endOffset":3420,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3524,"endOffset":3584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3683,"endOffset":3743,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3831,"endOffset":3987,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4071,"endOffset":4391,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4612,"endOffset":4676,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4776,"endOffset":4840,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4950,"endOffset":5047,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5151,"endOffset":5759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5863,"endOffset":5927,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6027,"endOffset":6091,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6201,"endOffset":6298,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6402,"endOffset":7010,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7117,"endOffset":7214,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7321,"endOffset":7418,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7528,"endOffset":7625,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7735,"endOffset":7832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7932,"endOffset":7992,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8092,"endOffset":8152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8271,"endOffset":8368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8486,"endOffset":8583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8699,"endOffset":8759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8875,"endOffset":8935,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9053,"endOffset":9117,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9235,"endOffset":9299,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9410,"endOffset":9470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9581,"endOffset":9641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9759,"endOffset":9856,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9974,"endOffset":10071,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10181,"endOffset":10245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10352,"endOffset":11671,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11781,"endOffset":11845,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12014,"endOffset":13333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13453,"endOffset":13550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13670,"endOffset":13767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13889,"endOffset":13986,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14108,"endOffset":14205,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14317,"endOffset":14381,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14493,"endOffset":14557,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14686,"endOffset":14783,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14912,"endOffset":15009,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15114,"endOffset":15235,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15340,"endOffset":15461,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15563,"endOffset":15673,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15726,"endOffset":15823,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15925,"endOffset":16035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16150,"endOffset":16247,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16362,"endOffset":16459,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_settings","ranges":[{"startOffset":16487,"endOffset":19939,"count":81}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":19942,"endOffset":20055,"count":81},{"startOffset":19998,"endOffset":20034,"count":0}],"isBlockCoverage":true},{"functionName":"get_activate_wo_popup","ranges":[{"startOffset":20058,"endOffset":20302,"count":0}],"isBlockCoverage":false},{"functionName":"get_adt_jump_enabled","ranges":[{"startOffset":20305,"endOffset":20559,"count":0}],"isBlockCoverage":false},{"functionName":"get_commitmsg_body_size","ranges":[{"startOffset":20562,"endOffset":20750,"count":0}],"isBlockCoverage":false},{"functionName":"get_commitmsg_comment_default","ranges":[{"startOffset":20753,"endOffset":20958,"count":0}],"isBlockCoverage":false},{"functionName":"get_commitmsg_comment_length","ranges":[{"startOffset":20961,"endOffset":21159,"count":0}],"isBlockCoverage":false},{"functionName":"get_commitmsg_hide_author","ranges":[{"startOffset":21162,"endOffset":21406,"count":0}],"isBlockCoverage":false},{"functionName":"get_experimental_features","ranges":[{"startOffset":21409,"endOffset":21802,"count":5}],"isBlockCoverage":true},{"functionName":"get_icon_scaling","ranges":[{"startOffset":21805,"endOffset":22048,"count":0}],"isBlockCoverage":false},{"functionName":"get_link_hints_enabled","ranges":[{"startOffset":22051,"endOffset":22315,"count":0}],"isBlockCoverage":false},{"functionName":"get_link_hint_key","ranges":[{"startOffset":22318,"endOffset":22524,"count":0}],"isBlockCoverage":false},{"functionName":"get_max_lines","ranges":[{"startOffset":22527,"endOffset":22697,"count":0}],"isBlockCoverage":false},{"functionName":"get_parallel_proc_disabled","ranges":[{"startOffset":22700,"endOffset":22981,"count":2}],"isBlockCoverage":true},{"functionName":"get_proxy_authentication","ranges":[{"startOffset":22984,"endOffset":23195,"count":2}],"isBlockCoverage":true},{"functionName":"get_proxy_bypass","ranges":[{"startOffset":23198,"endOffset":23920,"count":6}],"isBlockCoverage":true},{"functionName":"get_proxy_port","ranges":[{"startOffset":23923,"endOffset":24091,"count":2}],"isBlockCoverage":true},{"functionName":"get_proxy_url","ranges":[{"startOffset":24094,"endOffset":24275,"count":2}],"isBlockCoverage":true},{"functionName":"get_run_critical_tests","ranges":[{"startOffset":24278,"endOffset":24665,"count":0}],"isBlockCoverage":false},{"functionName":"get_settings_xml","ranges":[{"startOffset":24668,"endOffset":25262,"count":0}],"isBlockCoverage":false},{"functionName":"get_show_default_repo","ranges":[{"startOffset":25265,"endOffset":25524,"count":0}],"isBlockCoverage":false},{"functionName":"get_ui_theme","ranges":[{"startOffset":25527,"endOffset":28133,"count":0}],"isBlockCoverage":false},{"functionName":"get_user_settings","ranges":[{"startOffset":28138,"endOffset":29572,"count":0}],"isBlockCoverage":false},{"functionName":"set_activate_wo_popup","ranges":[{"startOffset":29577,"endOffset":29892,"count":0}],"isBlockCoverage":false},{"functionName":"set_adt_jump_enanbled","ranges":[{"startOffset":29897,"endOffset":30231,"count":0}],"isBlockCoverage":false},{"functionName":"set_commitmsg_body_size","ranges":[{"startOffset":30236,"endOffset":30483,"count":0}],"isBlockCoverage":false},{"functionName":"set_commitmsg_comment_default","ranges":[{"startOffset":30488,"endOffset":30754,"count":0}],"isBlockCoverage":false},{"functionName":"set_commitmsg_comment_length","ranges":[{"startOffset":30759,"endOffset":31016,"count":0}],"isBlockCoverage":false},{"functionName":"set_commitmsg_hide_author","ranges":[{"startOffset":31021,"endOffset":31334,"count":0}],"isBlockCoverage":false},{"functionName":"set_defaults","ranges":[{"startOffset":31339,"endOffset":32251,"count":0}],"isBlockCoverage":false},{"functionName":"set_default_link_hint_key","ranges":[{"startOffset":32256,"endOffset":32387,"count":0}],"isBlockCoverage":false},{"functionName":"set_experimental_features","ranges":[{"startOffset":32392,"endOffset":32665,"count":9}],"isBlockCoverage":true},{"functionName":"set_icon_scaling","ranges":[{"startOffset":32670,"endOffset":33181,"count":0}],"isBlockCoverage":false},{"functionName":"set_link_hints_enabled","ranges":[{"startOffset":33186,"endOffset":33533,"count":0}],"isBlockCoverage":false},{"functionName":"set_link_hint_key","ranges":[{"startOffset":33538,"endOffset":33817,"count":0}],"isBlockCoverage":false},{"functionName":"set_max_lines","ranges":[{"startOffset":33822,"endOffset":34049,"count":0}],"isBlockCoverage":false},{"functionName":"set_parallel_proc_disabled","ranges":[{"startOffset":34054,"endOffset":34424,"count":0}],"isBlockCoverage":false},{"functionName":"set_proxy_authentication","ranges":[{"startOffset":34429,"endOffset":34695,"count":0}],"isBlockCoverage":false},{"functionName":"set_proxy_bypass","ranges":[{"startOffset":34700,"endOffset":35481,"count":0}],"isBlockCoverage":false},{"functionName":"set_proxy_port","ranges":[{"startOffset":35486,"endOffset":35709,"count":0}],"isBlockCoverage":false},{"functionName":"set_proxy_url","ranges":[{"startOffset":35714,"endOffset":35930,"count":0}],"isBlockCoverage":false},{"functionName":"set_run_critical_tests","ranges":[{"startOffset":35935,"endOffset":36202,"count":0}],"isBlockCoverage":false},{"functionName":"set_show_default_repo","ranges":[{"startOffset":36207,"endOffset":36547,"count":0}],"isBlockCoverage":false},{"functionName":"set_ui_theme","ranges":[{"startOffset":36552,"endOffset":37377,"count":0}],"isBlockCoverage":false},{"functionName":"set_user_settings","ranges":[{"startOffset":37382,"endOffset":39029,"count":0}],"isBlockCoverage":false},{"functionName":"set_xml_settings","ranges":[{"startOffset":39034,"endOffset":39687,"count":0}],"isBlockCoverage":false}]},{"scriptId":"998","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sotr_handler.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":33027,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":4952,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":372,"endOffset":651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":695,"endOffset":749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":794,"endOffset":891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":938,"endOffset":980,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1084,"endOffset":1294,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1340,"endOffset":1438,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1534,"endOffset":1588,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1633,"endOffset":1730,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1777,"endOffset":1819,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1861,"endOffset":1993,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2043,"endOffset":2173,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2216,"endOffset":2644,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2691,"endOffset":2970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3070,"endOffset":3166,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3208,"endOffset":3338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3448,"endOffset":3544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3587,"endOffset":4015,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4062,"endOffset":4341,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4439,"endOffset":4493,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4538,"endOffset":4635,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4682,"endOffset":4724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4832,"endOffset":4928,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_sotr_handler","ranges":[{"startOffset":4956,"endOffset":5041,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5044,"endOffset":5157,"count":0}],"isBlockCoverage":false},{"functionName":"create_sotr","ranges":[{"startOffset":5160,"endOffset":5246,"count":0}],"isBlockCoverage":false},{"functionName":"create_sotr","ranges":[{"startOffset":5256,"endOffset":6729,"count":0}],"isBlockCoverage":false},{"functionName":"create_sotr_from_data","ranges":[{"startOffset":6732,"endOffset":6838,"count":0}],"isBlockCoverage":false},{"functionName":"create_sotr_from_data","ranges":[{"startOffset":6848,"endOffset":13269,"count":0}],"isBlockCoverage":false},{"functionName":"delete_sotr","ranges":[{"startOffset":13276,"endOffset":13370,"count":0}],"isBlockCoverage":false},{"functionName":"delete_sotr","ranges":[{"startOffset":13384,"endOffset":16342,"count":0}],"isBlockCoverage":false},{"functionName":"delete_sotr_package","ranges":[{"startOffset":16351,"endOffset":16465,"count":0}],"isBlockCoverage":false},{"functionName":"delete_sotr_package","ranges":[{"startOffset":16481,"endOffset":21481,"count":0}],"isBlockCoverage":false},{"functionName":"get_sotr_4_concept","ranges":[{"startOffset":21494,"endOffset":21614,"count":0}],"isBlockCoverage":false},{"functionName":"get_sotr_4_concept","ranges":[{"startOffset":21634,"endOffset":25014,"count":0}],"isBlockCoverage":false},{"functionName":"get_sotr_usage","ranges":[{"startOffset":25029,"endOffset":25145,"count":0}],"isBlockCoverage":false},{"functionName":"get_sotr_usage","ranges":[{"startOffset":25167,"endOffset":27809,"count":0}],"isBlockCoverage":false},{"functionName":"read_sotr","ranges":[{"startOffset":27826,"endOffset":27936,"count":0}],"isBlockCoverage":false},{"functionName":"read_sotr","ranges":[{"startOffset":27960,"endOffset":32834,"count":0}],"isBlockCoverage":false}]},{"scriptId":"999","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sots_handler.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":25464,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":4757,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":372,"endOffset":652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":696,"endOffset":750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":795,"endOffset":892,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":939,"endOffset":981,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1085,"endOffset":1297,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1343,"endOffset":1441,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1537,"endOffset":1591,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1636,"endOffset":1733,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1780,"endOffset":1822,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1864,"endOffset":1996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2046,"endOffset":2176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2219,"endOffset":2649,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2696,"endOffset":2976,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3076,"endOffset":3172,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3214,"endOffset":3344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3454,"endOffset":3550,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3593,"endOffset":4023,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4070,"endOffset":4350,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4448,"endOffset":4502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4547,"endOffset":4644,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4691,"endOffset":4733,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_sots_handler","ranges":[{"startOffset":4761,"endOffset":4846,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4849,"endOffset":4962,"count":0}],"isBlockCoverage":false},{"functionName":"create_sots","ranges":[{"startOffset":4965,"endOffset":5051,"count":0}],"isBlockCoverage":false},{"functionName":"create_sots","ranges":[{"startOffset":5061,"endOffset":6537,"count":0}],"isBlockCoverage":false},{"functionName":"create_sots_from_data","ranges":[{"startOffset":6540,"endOffset":6646,"count":0}],"isBlockCoverage":false},{"functionName":"create_sots_from_data","ranges":[{"startOffset":6656,"endOffset":12999,"count":0}],"isBlockCoverage":false},{"functionName":"delete_sots","ranges":[{"startOffset":13004,"endOffset":13094,"count":0}],"isBlockCoverage":false},{"functionName":"delete_sots","ranges":[{"startOffset":13106,"endOffset":16176,"count":0}],"isBlockCoverage":false},{"functionName":"get_sots_4_concept","ranges":[{"startOffset":16183,"endOffset":16291,"count":0}],"isBlockCoverage":false},{"functionName":"get_sots_4_concept","ranges":[{"startOffset":16305,"endOffset":18964,"count":0}],"isBlockCoverage":false},{"functionName":"get_sots_usage","ranges":[{"startOffset":18973,"endOffset":19077,"count":0}],"isBlockCoverage":false},{"functionName":"get_sots_usage","ranges":[{"startOffset":19093,"endOffset":21559,"count":0}],"isBlockCoverage":false},{"functionName":"read_sots","ranges":[{"startOffset":21570,"endOffset":21668,"count":0}],"isBlockCoverage":false},{"functionName":"read_sots","ranges":[{"startOffset":21686,"endOffset":25283,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1000","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_stage.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":28336,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":10926,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":272,"endOffset":2251,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2340,"endOffset":2442,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2587,"endOffset":2696,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2743,"endOffset":2856,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2901,"endOffset":3000,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3045,"endOffset":4097,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4140,"endOffset":4206,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4317,"endOffset":4381,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4426,"endOffset":4525,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4630,"endOffset":4732,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4821,"endOffset":4930,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4977,"endOffset":5090,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5133,"endOffset":5199,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5244,"endOffset":6296,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6387,"endOffset":6496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6543,"endOffset":6656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6744,"endOffset":6853,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6900,"endOffset":7013,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7058,"endOffset":8110,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8202,"endOffset":8311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8358,"endOffset":8471,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8575,"endOffset":8677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8769,"endOffset":8829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8923,"endOffset":10902,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_stage","ranges":[{"startOffset":10930,"endOffset":13115,"count":15}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":13118,"endOffset":14972,"count":4},{"startOffset":14731,"endOffset":14764,"count":0}],"isBlockCoverage":true},{"functionName":"append","ranges":[{"startOffset":14975,"endOffset":21324,"count":12},{"startOffset":16768,"endOffset":16797,"count":4},{"startOffset":20870,"endOffset":20980,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":20405,"endOffset":20520,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":20549,"endOffset":20582,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":20606,"endOffset":20643,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":21327,"endOffset":21622,"count":15},{"startOffset":21483,"endOffset":21507,"count":0},{"startOffset":21509,"endOffset":21554,"count":0}],"isBlockCoverage":true},{"functionName":"count","ranges":[{"startOffset":21625,"endOffset":21790,"count":0}],"isBlockCoverage":false},{"functionName":"get_all","ranges":[{"startOffset":21793,"endOffset":23852,"count":7}],"isBlockCoverage":true},{"functionName":"get_merge_source","ranges":[{"startOffset":23855,"endOffset":24056,"count":0}],"isBlockCoverage":false},{"functionName":"ignore","ranges":[{"startOffset":24059,"endOffset":24621,"count":0}],"isBlockCoverage":false},{"functionName":"method_description","ranges":[{"startOffset":24624,"endOffset":24717,"count":0}],"isBlockCoverage":false},{"functionName":"method_description","ranges":[{"startOffset":24727,"endOffset":25808,"count":0}],"isBlockCoverage":false},{"functionName":"reset","ranges":[{"startOffset":25811,"endOffset":26494,"count":0}],"isBlockCoverage":false},{"functionName":"rm","ranges":[{"startOffset":26497,"endOffset":28199,"count":8},{"startOffset":27977,"endOffset":28010,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1001","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_stage_logic.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":27214,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":8043,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":390,"endOffset":520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":564,"endOffset":4240,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4343,"endOffset":8019,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_stage_logic","ranges":[{"startOffset":8047,"endOffset":8132,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8135,"endOffset":8248,"count":0}],"isBlockCoverage":false},{"functionName":"remove_identical","ranges":[{"startOffset":8251,"endOffset":8346,"count":0}],"isBlockCoverage":false},{"functionName":"remove_identical","ranges":[{"startOffset":8356,"endOffset":15199,"count":0}],"isBlockCoverage":false},{"functionName":"remove_ignored","ranges":[{"startOffset":15202,"endOffset":15293,"count":0}],"isBlockCoverage":false},{"functionName":"remove_ignored","ranges":[{"startOffset":15303,"endOffset":22451,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_stage_logic$get","ranges":[{"startOffset":22454,"endOffset":27053,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1002","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_string_buffer.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3860,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":1687,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":297,"endOffset":555,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":695,"endOffset":829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":916,"endOffset":1050,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1092,"endOffset":1156,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1255,"endOffset":1319,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1428,"endOffset":1492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1599,"endOffset":1663,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_string_buffer","ranges":[{"startOffset":1691,"endOffset":2041,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2044,"endOffset":2157,"count":12},{"startOffset":2100,"endOffset":2136,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":2160,"endOffset":2556,"count":50}],"isBlockCoverage":true},{"functionName":"join_and_flush","ranges":[{"startOffset":2559,"endOffset":2787,"count":0}],"isBlockCoverage":false},{"functionName":"join_w_newline_and_flush","ranges":[{"startOffset":2790,"endOffset":3081,"count":11}],"isBlockCoverage":true},{"functionName":"join_w_space_and_flush","ranges":[{"startOffset":3084,"endOffset":3359,"count":1}],"isBlockCoverage":true},{"functionName":"new","ranges":[{"startOffset":3362,"endOffset":3423,"count":0}],"isBlockCoverage":false},{"functionName":"new","ranges":[{"startOffset":3433,"endOffset":3691,"count":9}],"isBlockCoverage":true}]},{"scriptId":"1003","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_string_map.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15868,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":4438,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":289,"endOffset":765,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":851,"endOffset":948,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1034,"endOffset":1131,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1224,"endOffset":1321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1470,"endOffset":1598,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1653,"endOffset":1750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1859,"endOffset":1956,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2044,"endOffset":2108,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2150,"endOffset":2214,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2302,"endOffset":2399,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2441,"endOffset":2505,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2593,"endOffset":2721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2763,"endOffset":2827,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2869,"endOffset":2911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3001,"endOffset":3061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3154,"endOffset":3251,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3342,"endOffset":3406,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3554,"endOffset":3597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3693,"endOffset":3821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3866,"endOffset":3963,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4109,"endOffset":4237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4286,"endOffset":4414,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_string_map","ranges":[{"startOffset":4442,"endOffset":5339,"count":42}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":5342,"endOffset":5629,"count":1},{"startOffset":5575,"endOffset":5628,"count":0}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":5632,"endOffset":6118,"count":42},{"startOffset":5787,"endOffset":5815,"count":31},{"startOffset":5817,"endOffset":5870,"count":31},{"startOffset":5899,"endOffset":5941,"count":31},{"startOffset":5943,"endOffset":5991,"count":11}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":6121,"endOffset":6195,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":6205,"endOffset":6854,"count":23},{"startOffset":6490,"endOffset":6518,"count":2},{"startOffset":6520,"endOffset":6573,"count":2},{"startOffset":6602,"endOffset":6644,"count":2},{"startOffset":6646,"endOffset":6694,"count":21}],"isBlockCoverage":true},{"functionName":"delete","ranges":[{"startOffset":6857,"endOffset":7347,"count":2},{"startOffset":7073,"endOffset":7229,"count":1},{"startOffset":7223,"endOffset":7229,"count":0},{"startOffset":7229,"endOffset":7346,"count":1}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":7295,"endOffset":7340,"count":1}],"isBlockCoverage":true},{"functionName":"freeze","ranges":[{"startOffset":7350,"endOffset":7421,"count":9}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":7424,"endOffset":8575,"count":75},{"startOffset":8078,"endOffset":8141,"count":25},{"startOffset":8141,"endOffset":8180,"count":50},{"startOffset":8505,"endOffset":8552,"count":49}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":8268,"endOffset":8313,"count":91}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":8342,"endOffset":8361,"count":114}],"isBlockCoverage":true},{"functionName":"has","ranges":[{"startOffset":8578,"endOffset":9166,"count":3}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":8879,"endOffset":8924,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":8953,"endOffset":8972,"count":1}],"isBlockCoverage":true},{"functionName":"is_empty","ranges":[{"startOffset":9169,"endOffset":9440,"count":4}],"isBlockCoverage":true},{"functionName":"merge","ranges":[{"startOffset":9443,"endOffset":10363,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":10366,"endOffset":12362,"count":83},{"startOffset":11446,"endOffset":11599,"count":3},{"startOffset":11593,"endOffset":11599,"count":0},{"startOffset":11599,"endOffset":11675,"count":80},{"startOffset":11675,"endOffset":11738,"count":19},{"startOffset":11738,"endOffset":11777,"count":61},{"startOffset":11777,"endOffset":12102,"count":80},{"startOffset":12102,"endOffset":12149,"count":8},{"startOffset":12149,"endOffset":12314,"count":72},{"startOffset":12314,"endOffset":12361,"count":80}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":11865,"endOffset":11910,"count":61}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":11939,"endOffset":11958,"count":147}],"isBlockCoverage":true},{"functionName":"size","ranges":[{"startOffset":12365,"endOffset":12528,"count":17}],"isBlockCoverage":true},{"functionName":"strict","ranges":[{"startOffset":12531,"endOffset":13055,"count":1},{"startOffset":12922,"endOffset":12959,"count":0}],"isBlockCoverage":true},{"functionName":"to_abap","ranges":[{"startOffset":13058,"endOffset":14930,"count":2},{"startOffset":14075,"endOffset":14213,"count":0},{"startOffset":14287,"endOffset":14926,"count":8},{"startOffset":14583,"endOffset":14638,"count":6},{"startOffset":14638,"endOffset":14920,"count":2},{"startOffset":14709,"endOffset":14920,"count":1},{"startOffset":14912,"endOffset":14920,"count":0},{"startOffset":14926,"endOffset":14929,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1004","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_factory.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3508,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":131,"endOffset":797,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":370,"endOffset":514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":561,"endOffset":625,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":676,"endOffset":773,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_syntax_factory","ranges":[{"startOffset":801,"endOffset":886,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":889,"endOffset":1002,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1005,"endOffset":1083,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":1093,"endOffset":3335,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1005","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_highlighter.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":30769,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":7233,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":311,"endOffset":1025,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1114,"endOffset":1211,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1297,"endOffset":1344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1492,"endOffset":1556,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1600,"endOffset":1642,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1686,"endOffset":1750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1797,"endOffset":1857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1956,"endOffset":2701,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2744,"endOffset":2808,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2907,"endOffset":2971,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3017,"endOffset":3762,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3862,"endOffset":3926,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3972,"endOffset":4717,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4814,"endOffset":4878,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4921,"endOffset":4985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5031,"endOffset":5776,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5873,"endOffset":5937,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5980,"endOffset":6044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6088,"endOffset":6152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6253,"endOffset":6350,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6395,"endOffset":6459,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6562,"endOffset":6626,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6669,"endOffset":6733,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6831,"endOffset":6895,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6938,"endOffset":7002,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7112,"endOffset":7209,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_syntax_highlighter","ranges":[{"startOffset":7237,"endOffset":8221,"count":33}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":8224,"endOffset":8337,"count":33},{"startOffset":8280,"endOffset":8316,"count":0}],"isBlockCoverage":true},{"functionName":"add_rule","ranges":[{"startOffset":8340,"endOffset":9832,"count":120},{"startOffset":8845,"endOffset":8882,"count":18},{"startOffset":9472,"endOffset":9626,"count":117}],"isBlockCoverage":true},{"functionName":"apply_style","ranges":[{"startOffset":9835,"endOffset":10722,"count":68},{"startOffset":10499,"endOffset":10654,"count":48},{"startOffset":10654,"endOffset":10698,"count":20}],"isBlockCoverage":true},{"functionName":"extend_matches","ranges":[{"startOffset":10725,"endOffset":14163,"count":34},{"startOffset":13207,"endOffset":13795,"count":106},{"startOffset":13314,"endOffset":13693,"count":51},{"startOffset":13847,"endOffset":14159,"count":7}],"isBlockCoverage":true},{"functionName":"format_line","ranges":[{"startOffset":14166,"endOffset":17165,"count":17},{"startOffset":16447,"endOffset":17141,"count":67}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":16728,"endOffset":16795,"count":178}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":16826,"endOffset":16849,"count":0}],"isBlockCoverage":false},{"functionName":"is_whitespace","ranges":[{"startOffset":17168,"endOffset":17821,"count":17}],"isBlockCoverage":true},{"functionName":"order_matches","ranges":[{"startOffset":17824,"endOffset":18806,"count":0}],"isBlockCoverage":false},{"functionName":"parse_line","ranges":[{"startOffset":18809,"endOffset":24487,"count":34},{"startOffset":22973,"endOffset":24460,"count":122},{"startOffset":23264,"endOffset":24454,"count":182},{"startOffset":23448,"endOffset":23725,"count":128},{"startOffset":23725,"endOffset":24446,"count":54},{"startOffset":24062,"endOffset":24143,"count":33},{"startOffset":24145,"endOffset":24436,"count":33}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":22907,"endOffset":22969,"count":125}],"isBlockCoverage":true},{"functionName":"process_line","ranges":[{"startOffset":24490,"endOffset":26025,"count":18},{"startOffset":25506,"endOffset":25598,"count":17},{"startOffset":25600,"endOffset":25700,"count":1},{"startOffset":25700,"endOffset":26024,"count":17}],"isBlockCoverage":true},{"functionName":"set_hidden_chars","ranges":[{"startOffset":26028,"endOffset":26305,"count":0}],"isBlockCoverage":false},{"functionName":"show_hidden_chars","ranges":[{"startOffset":26308,"endOffset":28561,"count":69},{"startOffset":26686,"endOffset":28537,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1006","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_json.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8819,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":264,"endOffset":1587,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":426,"endOffset":738,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":819,"endOffset":1063,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1144,"endOffset":1396,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_syntax_json","ranges":[{"startOffset":1591,"endOffset":1841,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1844,"endOffset":2687,"count":3}],"isBlockCoverage":true},{"functionName":"order_matches","ranges":[{"startOffset":2690,"endOffset":7121,"count":3},{"startOffset":5275,"endOffset":6481,"count":10},{"startOffset":5400,"endOffset":5488,"count":4},{"startOffset":5490,"endOffset":5574,"count":0},{"startOffset":5796,"endOffset":6349,"count":8},{"startOffset":5937,"endOffset":6341,"count":4},{"startOffset":6349,"endOffset":6481,"count":6},{"startOffset":6826,"endOffset":7117,"count":4},{"startOffset":7018,"endOffset":7111,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":6542,"endOffset":6588,"count":10}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":6666,"endOffset":6757,"count":6}],"isBlockCoverage":true}]},{"scriptId":"1007","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_txt.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1242,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":262,"endOffset":538,"count":1}],"isBlockCoverage":true},{"functionName":"zcl_abapgit_syntax_txt","ranges":[{"startOffset":542,"endOffset":640,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":643,"endOffset":723,"count":0}],"isBlockCoverage":false},{"functionName":"process_line","ranges":[{"startOffset":726,"endOffset":1085,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1008","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_xml.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13227,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":262,"endOffset":1831,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":428,"endOffset":525,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":604,"endOffset":918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":999,"endOffset":1245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1326,"endOffset":1640,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_syntax_xml","ranges":[{"startOffset":1835,"endOffset":2139,"count":18}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2142,"endOffset":3096,"count":18}],"isBlockCoverage":true},{"functionName":"order_matches","ranges":[{"startOffset":3099,"endOffset":11205,"count":20},{"startOffset":5803,"endOffset":6596,"count":0},{"startOffset":6665,"endOffset":10560,"count":75},{"startOffset":7010,"endOffset":8292,"count":33},{"startOffset":7158,"endOffset":7237,"count":15},{"startOffset":7239,"endOffset":7570,"count":7},{"startOffset":7570,"endOffset":8284,"count":26},{"startOffset":7663,"endOffset":7742,"count":8},{"startOffset":7744,"endOffset":8205,"count":8},{"startOffset":7858,"endOffset":8195,"count":7},{"startOffset":8205,"endOffset":8284,"count":18},{"startOffset":8292,"endOffset":10428,"count":42},{"startOffset":8376,"endOffset":10010,"count":1},{"startOffset":8996,"endOffset":10002,"count":0},{"startOffset":10010,"endOffset":10428,"count":41},{"startOffset":10108,"endOffset":10233,"count":10},{"startOffset":10311,"endOffset":10420,"count":1},{"startOffset":10428,"endOffset":10560,"count":67},{"startOffset":10646,"endOffset":10683,"count":14},{"startOffset":10684,"endOffset":10761,"count":14},{"startOffset":10762,"endOffset":10846,"count":4},{"startOffset":10848,"endOffset":11201,"count":1},{"startOffset":11115,"endOffset":11195,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":5858,"endOffset":5945,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":5976,"endOffset":5999,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":8526,"endOffset":8595,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":8665,"endOffset":8808,"count":2}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":9141,"endOffset":9210,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":9665,"endOffset":9776,"count":0}],"isBlockCoverage":false},{"functionName":"where","ranges":[{"startOffset":9846,"endOffset":9989,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1009","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_tadir.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":48234,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":10572,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":365,"endOffset":1174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1218,"endOffset":2027,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2119,"endOffset":2928,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2974,"endOffset":3022,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3064,"endOffset":3194,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3251,"endOffset":3348,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3405,"endOffset":3502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3544,"endOffset":3662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3765,"endOffset":3813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3870,"endOffset":3967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4024,"endOffset":4121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4168,"endOffset":4485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4529,"endOffset":5338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5446,"endOffset":5763,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5807,"endOffset":6616,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6719,"endOffset":6815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6859,"endOffset":7668,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7770,"endOffset":7866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7911,"endOffset":7953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7997,"endOffset":8806,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8909,"endOffset":8957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8999,"endOffset":9129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9173,"endOffset":9982,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10087,"endOffset":10184,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10231,"endOffset":10548,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_tadir","ranges":[{"startOffset":10576,"endOffset":10661,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":10664,"endOffset":10777,"count":0}],"isBlockCoverage":false},{"functionName":"add_local_packages","ranges":[{"startOffset":10780,"endOffset":13535,"count":0}],"isBlockCoverage":false},{"functionName":"add_namespace","ranges":[{"startOffset":13538,"endOffset":17836,"count":0}],"isBlockCoverage":false},{"functionName":"add_namespaces","ranges":[{"startOffset":17841,"endOffset":20153,"count":0}],"isBlockCoverage":false},{"functionName":"build","ranges":[{"startOffset":20158,"endOffset":23016,"count":0}],"isBlockCoverage":false},{"functionName":"check_exists","ranges":[{"startOffset":23021,"endOffset":27289,"count":0}],"isBlockCoverage":false},{"functionName":"determine_path","ranges":[{"startOffset":27294,"endOffset":30272,"count":0}],"isBlockCoverage":false},{"functionName":"is_sots_excluded","ranges":[{"startOffset":30277,"endOffset":33579,"count":0}],"isBlockCoverage":false},{"functionName":"select_objects","ranges":[{"startOffset":33592,"endOffset":40723,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_tadir$get_object_package","ranges":[{"startOffset":40740,"endOffset":43484,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_tadir$read","ranges":[{"startOffset":43501,"endOffset":46413,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_tadir$read_single","ranges":[{"startOffset":46430,"endOffset":48069,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1010","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_timer.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5948,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":1941,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":271,"endOffset":335,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":417,"endOffset":477,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":559,"endOffset":652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":798,"endOffset":916,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":959,"endOffset":1023,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1067,"endOffset":1127,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1224,"endOffset":1288,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1332,"endOffset":1392,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1484,"endOffset":1602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1693,"endOffset":1757,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1820,"endOffset":1917,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_timer","ranges":[{"startOffset":1945,"endOffset":2264,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2267,"endOffset":2639,"count":4}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":2642,"endOffset":2711,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":2721,"endOffset":3270,"count":4},{"startOffset":2948,"endOffset":2964,"count":3},{"startOffset":2966,"endOffset":2995,"count":1},{"startOffset":3075,"endOffset":3092,"count":3},{"startOffset":3094,"endOffset":3125,"count":2}],"isBlockCoverage":true},{"functionName":"end","ranges":[{"startOffset":3273,"endOffset":5565,"count":4},{"startOffset":3497,"endOffset":3533,"count":0},{"startOffset":3535,"endOffset":3604,"count":0},{"startOffset":3633,"endOffset":3683,"count":0},{"startOffset":4056,"endOffset":4162,"count":0},{"startOffset":4464,"endOffset":4543,"count":1},{"startOffset":4543,"endOffset":4738,"count":3},{"startOffset":4618,"endOffset":4738,"count":1},{"startOffset":4878,"endOffset":5146,"count":0},{"startOffset":5231,"endOffset":5345,"count":0},{"startOffset":5400,"endOffset":5539,"count":1}],"isBlockCoverage":true},{"functionName":"start","ranges":[{"startOffset":5568,"endOffset":5811,"count":4}],"isBlockCoverage":true}]},{"scriptId":"1011","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":37750,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":5757,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":367,"endOffset":426,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":468,"endOffset":567,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":660,"endOffset":720,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":764,"endOffset":828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":931,"endOffset":994,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1039,"endOffset":1109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1214,"endOffset":1310,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1354,"endOffset":2163,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2257,"endOffset":3066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3113,"endOffset":3176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3230,"endOffset":3327,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3416,"endOffset":3482,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3535,"endOffset":3632,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3676,"endOffset":3740,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3785,"endOffset":3854,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3949,"endOffset":4758,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4814,"endOffset":4884,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4938,"endOffset":5035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5148,"endOffset":5247,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5340,"endOffset":5402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5447,"endOffset":5516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5641,"endOffset":5733,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_transport","ranges":[{"startOffset":5761,"endOffset":5846,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5849,"endOffset":5962,"count":0}],"isBlockCoverage":false},{"functionName":"add_all_objects_to_trans_req","ranges":[{"startOffset":5965,"endOffset":6082,"count":0}],"isBlockCoverage":false},{"functionName":"add_all_objects_to_trans_req","ranges":[{"startOffset":6092,"endOffset":9513,"count":0}],"isBlockCoverage":false},{"functionName":"collect_all_objects","ranges":[{"startOffset":9518,"endOffset":9621,"count":0}],"isBlockCoverage":false},{"functionName":"collect_all_objects","ranges":[{"startOffset":9633,"endOffset":13874,"count":0}],"isBlockCoverage":false},{"functionName":"find_top_package","ranges":[{"startOffset":13881,"endOffset":13982,"count":0}],"isBlockCoverage":false},{"functionName":"find_top_package","ranges":[{"startOffset":13996,"endOffset":17785,"count":0}],"isBlockCoverage":false},{"functionName":"read","ranges":[{"startOffset":17792,"endOffset":17869,"count":0}],"isBlockCoverage":false},{"functionName":"read","ranges":[{"startOffset":17883,"endOffset":19531,"count":0}],"isBlockCoverage":false},{"functionName":"read_requests","ranges":[{"startOffset":19540,"endOffset":19639,"count":0}],"isBlockCoverage":false},{"functionName":"read_requests","ranges":[{"startOffset":19655,"endOffset":21534,"count":0}],"isBlockCoverage":false},{"functionName":"resolve","ranges":[{"startOffset":21545,"endOffset":21636,"count":0}],"isBlockCoverage":false},{"functionName":"resolve","ranges":[{"startOffset":21654,"endOffset":26923,"count":0}],"isBlockCoverage":false},{"functionName":"show_log","ranges":[{"startOffset":26934,"endOffset":27027,"count":0}],"isBlockCoverage":false},{"functionName":"show_log","ranges":[{"startOffset":27045,"endOffset":28360,"count":0}],"isBlockCoverage":false},{"functionName":"to_tadir","ranges":[{"startOffset":28371,"endOffset":28464,"count":0}],"isBlockCoverage":false},{"functionName":"to_tadir","ranges":[{"startOffset":28482,"endOffset":30371,"count":0}],"isBlockCoverage":false},{"functionName":"validate_transport_request","ranges":[{"startOffset":30382,"endOffset":30511,"count":0}],"isBlockCoverage":false},{"functionName":"validate_transport_request","ranges":[{"startOffset":30529,"endOffset":32399,"count":0}],"isBlockCoverage":false},{"functionName":"zip","ranges":[{"startOffset":32410,"endOffset":32493,"count":0}],"isBlockCoverage":false},{"functionName":"zip","ranges":[{"startOffset":32511,"endOffset":37581,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1012","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_2_branch.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":27053,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":139,"endOffset":9364,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":398,"endOffset":1201,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1259,"endOffset":1607,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1729,"endOffset":2538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2582,"endOffset":2700,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2752,"endOffset":6428,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6482,"endOffset":7841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7939,"endOffset":8069,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8127,"endOffset":8475,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8531,"endOffset":9340,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_transport_2_branch","ranges":[{"startOffset":9368,"endOffset":9453,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":9456,"endOffset":9569,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":9572,"endOffset":18343,"count":0}],"isBlockCoverage":false},{"functionName":"generate_commit_message","ranges":[{"startOffset":18346,"endOffset":20003,"count":0}],"isBlockCoverage":false},{"functionName":"stage_transport_objects","ranges":[{"startOffset":20006,"endOffset":26864,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1013","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_mass.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3057,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":305,"endOffset":520,"count":1}],"isBlockCoverage":true},{"functionName":"zcl_abapgit_transport_mass","ranges":[{"startOffset":524,"endOffset":622,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":625,"endOffset":738,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":741,"endOffset":803,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":813,"endOffset":2884,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1014","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_mass.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13331,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":205,"endOffset":1042,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":392,"endOffset":456,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":606,"endOffset":670,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":778,"endOffset":842,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":948,"endOffset":1018,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_gui","ranges":[{"startOffset":1046,"endOffset":1181,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1184,"endOffset":1297,"count":0}],"isBlockCoverage":false},{"functionName":"f4_folder","ranges":[{"startOffset":1300,"endOffset":1355,"count":0}],"isBlockCoverage":false},{"functionName":"f4_folder","ranges":[{"startOffset":1365,"endOffset":2118,"count":0}],"isBlockCoverage":false},{"functionName":"open_folder_frontend","ranges":[{"startOffset":2121,"endOffset":2208,"count":0}],"isBlockCoverage":false},{"functionName":"open_folder_frontend","ranges":[{"startOffset":2218,"endOffset":2610,"count":0}],"isBlockCoverage":false},{"functionName":"select_tr_requests","ranges":[{"startOffset":2613,"endOffset":2686,"count":0}],"isBlockCoverage":false},{"functionName":"select_tr_requests","ranges":[{"startOffset":2696,"endOffset":4849,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5035,"endOffset":7449,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5239,"endOffset":5303,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5391,"endOffset":5438,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5528,"endOffset":5617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5702,"endOffset":5766,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5929,"endOffset":6018,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6063,"endOffset":6152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6256,"endOffset":6347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6392,"endOffset":6461,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6562,"endOffset":6651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6755,"endOffset":6825,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6869,"endOffset":6912,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7017,"endOffset":7106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7219,"endOffset":7316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7361,"endOffset":7425,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_transport_zipper","ranges":[{"startOffset":7455,"endOffset":7839,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7844,"endOffset":8958,"count":0}],"isBlockCoverage":false},{"functionName":"get_folder","ranges":[{"startOffset":8963,"endOffset":9167,"count":0}],"isBlockCoverage":false},{"functionName":"does_folder_exist","ranges":[{"startOffset":9172,"endOffset":9270,"count":0}],"isBlockCoverage":false},{"functionName":"does_folder_exist","ranges":[{"startOffset":9282,"endOffset":9789,"count":0}],"isBlockCoverage":false},{"functionName":"get_full_folder","ranges":[{"startOffset":9794,"endOffset":11024,"count":0}],"isBlockCoverage":false},{"functionName":"get_filename","ranges":[{"startOffset":11029,"endOffset":11853,"count":0}],"isBlockCoverage":false},{"functionName":"generate_files","ranges":[{"startOffset":11858,"endOffset":12769,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1015","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_objects.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":21867,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":7479,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":320,"endOffset":1129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1292,"endOffset":2101,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2196,"endOffset":2314,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2366,"endOffset":6042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6096,"endOffset":7455,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_transport_objects","ranges":[{"startOffset":7483,"endOffset":8395,"count":15}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":8398,"endOffset":9430,"count":15}],"isBlockCoverage":true},{"functionName":"to_stage","ranges":[{"startOffset":9433,"endOffset":21682,"count":15},{"startOffset":18275,"endOffset":21573,"count":16},{"startOffset":18494,"endOffset":18610,"count":13},{"startOffset":18612,"endOffset":20367,"count":7},{"startOffset":18704,"endOffset":18954,"count":2},{"startOffset":18942,"endOffset":18954,"count":0},{"startOffset":18954,"endOffset":19923,"count":5},{"startOffset":19923,"endOffset":20152,"count":1},{"startOffset":20140,"endOffset":20152,"count":0},{"startOffset":20152,"endOffset":20357,"count":4},{"startOffset":20367,"endOffset":21565,"count":9},{"startOffset":20583,"endOffset":20676,"count":6},{"startOffset":20677,"endOffset":20770,"count":5},{"startOffset":20771,"endOffset":20864,"count":4},{"startOffset":20865,"endOffset":20958,"count":3},{"startOffset":20959,"endOffset":21052,"count":2},{"startOffset":21054,"endOffset":21300,"count":1},{"startOffset":21288,"endOffset":21300,"count":0},{"startOffset":21300,"endOffset":21431,"count":8},{"startOffset":21431,"endOffset":21565,"count":0},{"startOffset":21573,"endOffset":21663,"count":11},{"startOffset":21663,"endOffset":21672,"count":1},{"startOffset":21678,"endOffset":21681,"count":11}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":17971,"endOffset":18166,"count":17},{"startOffset":18056,"endOffset":18120,"count":16},{"startOffset":18121,"endOffset":18164,"count":16}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":19063,"endOffset":19305,"count":6},{"startOffset":19153,"endOffset":19228,"count":5},{"startOffset":19229,"endOffset":19303,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":19340,"endOffset":19377,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":19428,"endOffset":19465,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":19514,"endOffset":19551,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1016","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ui_factory.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12515,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":3104,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":288,"endOffset":412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":500,"endOffset":634,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":714,"endOffset":828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":916,"endOffset":1062,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1151,"endOffset":1287,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1448,"endOffset":1594,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1692,"endOffset":1816,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1908,"endOffset":2022,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2132,"endOffset":2268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2378,"endOffset":2524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2627,"endOffset":2761,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2809,"endOffset":2925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2983,"endOffset":3080,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_ui_factory","ranges":[{"startOffset":3108,"endOffset":3494,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3497,"endOffset":3610,"count":0}],"isBlockCoverage":false},{"functionName":"get_asset_manager","ranges":[{"startOffset":3613,"endOffset":3699,"count":0}],"isBlockCoverage":false},{"functionName":"get_asset_manager","ranges":[{"startOffset":3709,"endOffset":6838,"count":0}],"isBlockCoverage":false},{"functionName":"get_frontend_services","ranges":[{"startOffset":6841,"endOffset":6935,"count":0}],"isBlockCoverage":false},{"functionName":"get_frontend_services","ranges":[{"startOffset":6945,"endOffset":7417,"count":0}],"isBlockCoverage":false},{"functionName":"get_gui","ranges":[{"startOffset":7420,"endOffset":7486,"count":0}],"isBlockCoverage":false},{"functionName":"get_gui","ranges":[{"startOffset":7496,"endOffset":9237,"count":0}],"isBlockCoverage":false},{"functionName":"get_gui_services","ranges":[{"startOffset":9240,"endOffset":9324,"count":0}],"isBlockCoverage":false},{"functionName":"get_gui_services","ranges":[{"startOffset":9334,"endOffset":9781,"count":0}],"isBlockCoverage":false},{"functionName":"get_html_viewer","ranges":[{"startOffset":9784,"endOffset":9876,"count":0}],"isBlockCoverage":false},{"functionName":"get_html_viewer","ranges":[{"startOffset":9886,"endOffset":11091,"count":0}],"isBlockCoverage":false},{"functionName":"get_popups","ranges":[{"startOffset":11094,"endOffset":11166,"count":0}],"isBlockCoverage":false},{"functionName":"get_popups","ranges":[{"startOffset":11176,"endOffset":11586,"count":2},{"startOffset":11391,"endOffset":11507,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1017","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ui_injector.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4119,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":184,"endOffset":1566,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":422,"endOffset":546,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":656,"endOffset":802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":912,"endOffset":1048,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1164,"endOffset":1300,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1408,"endOffset":1542,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_ui_injector","ranges":[{"startOffset":1570,"endOffset":1655,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1658,"endOffset":1771,"count":0}],"isBlockCoverage":false},{"functionName":"get_dummy_gui_services","ranges":[{"startOffset":1774,"endOffset":1871,"count":0}],"isBlockCoverage":false},{"functionName":"get_dummy_gui_services","ranges":[{"startOffset":1881,"endOffset":2204,"count":0}],"isBlockCoverage":false},{"functionName":"set_frontend_services","ranges":[{"startOffset":2207,"endOffset":2312,"count":0}],"isBlockCoverage":false},{"functionName":"set_frontend_services","ranges":[{"startOffset":2322,"endOffset":2661,"count":0}],"isBlockCoverage":false},{"functionName":"set_gui_services","ranges":[{"startOffset":2664,"endOffset":2759,"count":0}],"isBlockCoverage":false},{"functionName":"set_gui_services","ranges":[{"startOffset":2769,"endOffset":3119,"count":0}],"isBlockCoverage":false},{"functionName":"set_html_viewer","ranges":[{"startOffset":3122,"endOffset":3215,"count":0}],"isBlockCoverage":false},{"functionName":"set_html_viewer","ranges":[{"startOffset":3225,"endOffset":3566,"count":0}],"isBlockCoverage":false},{"functionName":"set_popups","ranges":[{"startOffset":3569,"endOffset":3652,"count":0}],"isBlockCoverage":false},{"functionName":"set_popups","ranges":[{"startOffset":3662,"endOffset":3958,"count":8}],"isBlockCoverage":true}]},{"scriptId":"1018","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ui_injector.clas.locals.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4187,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":135,"endOffset":613,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":425,"endOffset":589,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_gui_services_dummy","ranges":[{"startOffset":617,"endOffset":702,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":705,"endOffset":818,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":821,"endOffset":885,"count":0}],"isBlockCoverage":false},{"functionName":"create","ranges":[{"startOffset":895,"endOffset":1230,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$cache_asset","ranges":[{"startOffset":1233,"endOffset":1988,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$register_event_handler","ranges":[{"startOffset":1991,"endOffset":2305,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_current_page_name","ranges":[{"startOffset":2308,"endOffset":2466,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_hotkeys_ctl","ranges":[{"startOffset":2469,"endOffset":2699,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_html_parts","ranges":[{"startOffset":2702,"endOffset":2909,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_log","ranges":[{"startOffset":2912,"endOffset":3399,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$register_page_asset","ranges":[{"startOffset":3402,"endOffset":3993,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1019","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_url.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8908,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":2407,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":331,"endOffset":395,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":438,"endOffset":502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":545,"endOffset":609,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":652,"endOffset":716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":809,"endOffset":873,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":963,"endOffset":1027,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1069,"endOffset":1133,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1223,"endOffset":1287,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1329,"endOffset":1393,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1440,"endOffset":1537,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1637,"endOffset":1701,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1743,"endOffset":1807,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1911,"endOffset":2008,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2050,"endOffset":2114,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2213,"endOffset":2277,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2319,"endOffset":2383,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_url","ranges":[{"startOffset":2411,"endOffset":2496,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2499,"endOffset":2612,"count":0}],"isBlockCoverage":false},{"functionName":"host","ranges":[{"startOffset":2615,"endOffset":2678,"count":0}],"isBlockCoverage":false},{"functionName":"host","ranges":[{"startOffset":2688,"endOffset":2983,"count":15},{"startOffset":2959,"endOffset":2982,"count":14}],"isBlockCoverage":true},{"functionName":"is_abapgit_repo","ranges":[{"startOffset":2986,"endOffset":3071,"count":0}],"isBlockCoverage":false},{"functionName":"is_abapgit_repo","ranges":[{"startOffset":3081,"endOffset":3656,"count":0}],"isBlockCoverage":false},{"functionName":"name","ranges":[{"startOffset":3659,"endOffset":3722,"count":0}],"isBlockCoverage":false},{"functionName":"name","ranges":[{"startOffset":3732,"endOffset":5308,"count":8},{"startOffset":4087,"endOffset":4124,"count":3},{"startOffset":4189,"endOffset":4229,"count":5},{"startOffset":4385,"endOffset":4427,"count":7},{"startOffset":4427,"endOffset":4782,"count":3},{"startOffset":4640,"endOffset":4774,"count":0},{"startOffset":4789,"endOffset":5284,"count":1},{"startOffset":5098,"endOffset":5238,"count":0},{"startOffset":5246,"endOffset":5278,"count":0},{"startOffset":5284,"endOffset":5307,"count":7}],"isBlockCoverage":true},{"functionName":"path_name","ranges":[{"startOffset":5311,"endOffset":5384,"count":0}],"isBlockCoverage":false},{"functionName":"path_name","ranges":[{"startOffset":5394,"endOffset":5847,"count":3}],"isBlockCoverage":true},{"functionName":"regex","ranges":[{"startOffset":5850,"endOffset":5915,"count":0}],"isBlockCoverage":false},{"functionName":"regex","ranges":[{"startOffset":5925,"endOffset":7073,"count":29},{"startOffset":6172,"endOffset":6198,"count":21},{"startOffset":6299,"endOffset":6325,"count":14},{"startOffset":6426,"endOffset":6452,"count":14},{"startOffset":6693,"endOffset":7069,"count":12},{"startOffset":6933,"endOffset":7063,"count":2},{"startOffset":7055,"endOffset":7063,"count":0}],"isBlockCoverage":true},{"functionName":"url_address","ranges":[{"startOffset":7076,"endOffset":7153,"count":0}],"isBlockCoverage":false},{"functionName":"url_address","ranges":[{"startOffset":7163,"endOffset":8466,"count":6},{"startOffset":7785,"endOffset":7817,"count":0},{"startOffset":7819,"endOffset":7945,"count":0},{"startOffset":7986,"endOffset":8283,"count":1}],"isBlockCoverage":true},{"functionName":"validate","ranges":[{"startOffset":8469,"endOffset":8540,"count":0}],"isBlockCoverage":false},{"functionName":"validate","ranges":[{"startOffset":8550,"endOffset":8779,"count":3},{"startOffset":8775,"endOffset":8778,"count":2}],"isBlockCoverage":true}]},{"scriptId":"1020","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_user_record.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15524,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":3251,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":289,"endOffset":762,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":843,"endOffset":1144,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1300,"endOffset":1374,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1420,"endOffset":1478,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1521,"endOffset":1794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1909,"endOffset":1983,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2131,"endOffset":2261,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2304,"endOffset":2378,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2475,"endOffset":2549,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2643,"endOffset":2746,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2842,"endOffset":2946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3042,"endOffset":3106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3153,"endOffset":3227,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_user_record","ranges":[{"startOffset":3255,"endOffset":3698,"count":0}],"isBlockCoverage":false},{"functionName":"get_title","ranges":[{"startOffset":3701,"endOffset":3782,"count":0}],"isBlockCoverage":false},{"functionName":"get_title","ranges":[{"startOffset":3792,"endOffset":5128,"count":0}],"isBlockCoverage":false},{"functionName":"check_user_exists","ranges":[{"startOffset":5133,"endOffset":8121,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":8126,"endOffset":10179,"count":0}],"isBlockCoverage":false},{"functionName":"get_email","ranges":[{"startOffset":10184,"endOffset":10389,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":10394,"endOffset":10485,"count":0}],"isBlockCoverage":false},{"functionName":"get_instance","ranges":[{"startOffset":10497,"endOffset":11761,"count":0}],"isBlockCoverage":false},{"functionName":"get_name","ranges":[{"startOffset":11766,"endOffset":11965,"count":0}],"isBlockCoverage":false},{"functionName":"get_user_dtls_from_other_clnt","ranges":[{"startOffset":11970,"endOffset":14055,"count":0}],"isBlockCoverage":false},{"functionName":"reset","ranges":[{"startOffset":14060,"endOffset":14127,"count":0}],"isBlockCoverage":false},{"functionName":"reset","ranges":[{"startOffset":14139,"endOffset":14222,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1021","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_utils.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4414,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":113,"endOffset":883,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":347,"endOffset":444,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":487,"endOffset":553,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":654,"endOffset":751,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":795,"endOffset":859,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_utils","ranges":[{"startOffset":887,"endOffset":972,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":975,"endOffset":1088,"count":0}],"isBlockCoverage":false},{"functionName":"is_binary","ranges":[{"startOffset":1091,"endOffset":1166,"count":0}],"isBlockCoverage":false},{"functionName":"is_binary","ranges":[{"startOffset":1176,"endOffset":3410,"count":3},{"startOffset":2137,"endOffset":2171,"count":0},{"startOffset":2425,"endOffset":2435,"count":2},{"startOffset":2435,"endOffset":2678,"count":1},{"startOffset":2640,"endOffset":2672,"count":0},{"startOffset":2678,"endOffset":3409,"count":2}],"isBlockCoverage":true},{"functionName":"is_valid_email","ranges":[{"startOffset":3413,"endOffset":3498,"count":0}],"isBlockCoverage":false},{"functionName":"is_valid_email","ranges":[{"startOffset":3508,"endOffset":4277,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1022","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_version.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":22303,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":117,"endOffset":4933,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":360,"endOffset":420,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":466,"endOffset":530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":628,"endOffset":692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":738,"endOffset":802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":910,"endOffset":1512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1558,"endOffset":1600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1712,"endOffset":2314,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2362,"endOffset":2964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3059,"endOffset":3119,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3159,"endOffset":3223,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3263,"endOffset":3327,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3367,"endOffset":3969,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4009,"endOffset":4611,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4726,"endOffset":4790,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4845,"endOffset":4909,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_version","ranges":[{"startOffset":4937,"endOffset":5022,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5025,"endOffset":5138,"count":0}],"isBlockCoverage":false},{"functionName":"check_dependant_version","ranges":[{"startOffset":5141,"endOffset":5246,"count":0}],"isBlockCoverage":false},{"functionName":"check_dependant_version","ranges":[{"startOffset":5256,"endOffset":9050,"count":18},{"startOffset":6871,"endOffset":6958,"count":1},{"startOffset":6952,"endOffset":6958,"count":0},{"startOffset":6958,"endOffset":7056,"count":17},{"startOffset":7035,"endOffset":7056,"count":0},{"startOffset":7056,"endOffset":7132,"count":17},{"startOffset":7132,"endOffset":7219,"count":4},{"startOffset":7213,"endOffset":7219,"count":0},{"startOffset":7219,"endOffset":7317,"count":13},{"startOffset":7296,"endOffset":7317,"count":10},{"startOffset":7317,"endOffset":7480,"count":3},{"startOffset":7474,"endOffset":7480,"count":0},{"startOffset":7480,"endOffset":8957,"count":0},{"startOffset":8959,"endOffset":9046,"count":0}],"isBlockCoverage":true},{"functionName":"compare","ranges":[{"startOffset":9053,"endOffset":9126,"count":0}],"isBlockCoverage":false},{"functionName":"compare","ranges":[{"startOffset":9136,"endOffset":13219,"count":24},{"startOffset":10093,"endOffset":10116,"count":0},{"startOffset":10749,"endOffset":10772,"count":0},{"startOffset":12053,"endOffset":12094,"count":0},{"startOffset":12238,"endOffset":12279,"count":0},{"startOffset":12381,"endOffset":12627,"count":0},{"startOffset":12681,"endOffset":12742,"count":6},{"startOffset":12742,"endOffset":13193,"count":18},{"startOffset":12861,"endOffset":12926,"count":10},{"startOffset":12926,"endOffset":13187,"count":8},{"startOffset":13143,"endOffset":13179,"count":0},{"startOffset":13193,"endOffset":13218,"count":16}],"isBlockCoverage":true},{"functionName":"conv_str_to_version","ranges":[{"startOffset":13222,"endOffset":13319,"count":0}],"isBlockCoverage":false},{"functionName":"conv_str_to_version","ranges":[{"startOffset":13329,"endOffset":17303,"count":49},{"startOffset":14967,"endOffset":14999,"count":0},{"startOffset":15174,"endOffset":16018,"count":146},{"startOffset":15347,"endOffset":15408,"count":49},{"startOffset":15408,"endOffset":15672,"count":97},{"startOffset":15479,"endOffset":15540,"count":49},{"startOffset":15540,"endOffset":15672,"count":48},{"startOffset":15681,"endOffset":16012,"count":0},{"startOffset":16247,"endOffset":17035,"count":0},{"startOffset":17036,"endOffset":17124,"count":0},{"startOffset":17126,"endOffset":17302,"count":0}],"isBlockCoverage":true},{"functionName":"normalize","ranges":[{"startOffset":17306,"endOffset":17383,"count":0}],"isBlockCoverage":false},{"functionName":"normalize","ranges":[{"startOffset":17393,"endOffset":18981,"count":14},{"startOffset":18518,"endOffset":18644,"count":0},{"startOffset":18689,"endOffset":18721,"count":2},{"startOffset":18721,"endOffset":18813,"count":12},{"startOffset":18813,"endOffset":18954,"count":0},{"startOffset":18954,"endOffset":18980,"count":12}],"isBlockCoverage":true},{"functionName":"version_to_numeric","ranges":[{"startOffset":18984,"endOffset":19079,"count":0}],"isBlockCoverage":false},{"functionName":"version_to_numeric","ranges":[{"startOffset":19089,"endOffset":19864,"count":1}],"isBlockCoverage":true},{"functionName":"get_version_constant_value","ranges":[{"startOffset":19867,"endOffset":19978,"count":0}],"isBlockCoverage":false},{"functionName":"get_version_constant_value","ranges":[{"startOffset":19988,"endOffset":22154,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1023","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11471,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":3032,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":265,"endOffset":367,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":451,"endOffset":571,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":656,"endOffset":953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1038,"endOffset":1102,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1189,"endOffset":1253,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1341,"endOffset":1405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1496,"endOffset":1560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1659,"endOffset":1723,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1869,"endOffset":1985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2093,"endOffset":2157,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2263,"endOffset":2389,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2480,"endOffset":2544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2592,"endOffset":2689,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2779,"endOffset":2843,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2944,"endOffset":3008,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_xml","ranges":[{"startOffset":3036,"endOffset":3993,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3996,"endOffset":4372,"count":6},{"startOffset":4110,"endOffset":4130,"count":5},{"startOffset":4132,"endOffset":4169,"count":5}],"isBlockCoverage":true},{"functionName":"error","ranges":[{"startOffset":4375,"endOffset":5217,"count":0}],"isBlockCoverage":false},{"functionName":"parse","ranges":[{"startOffset":5220,"endOffset":7596,"count":6},{"startOffset":6600,"endOffset":6655,"count":0},{"startOffset":7191,"endOffset":7301,"count":1},{"startOffset":7295,"endOffset":7301,"count":0},{"startOffset":7301,"endOffset":7595,"count":5}],"isBlockCoverage":true},{"functionName":"raise_exception_for","ranges":[{"startOffset":7599,"endOffset":8628,"count":0}],"isBlockCoverage":false},{"functionName":"raise_version_mismatch","ranges":[{"startOffset":8631,"endOffset":9515,"count":1},{"startOffset":9158,"endOffset":9300,"count":0},{"startOffset":9511,"endOffset":9514,"count":0}],"isBlockCoverage":true},{"functionName":"to_xml","ranges":[{"startOffset":9518,"endOffset":10782,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1024","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_input.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6583,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":215,"endOffset":1508,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":407,"endOffset":1130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1331,"endOffset":1373,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1420,"endOffset":1484,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_xml_input","ranges":[{"startOffset":1512,"endOffset":2345,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2348,"endOffset":2767,"count":5},{"startOffset":2585,"endOffset":2622,"count":2}],"isBlockCoverage":true},{"functionName":"fix_xml","ranges":[{"startOffset":2770,"endOffset":3533,"count":5}],"isBlockCoverage":true},{"functionName":"zif_abapgit_xml_input$get_metadata","ranges":[{"startOffset":3536,"endOffset":3952,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_xml_input$get_raw","ranges":[{"startOffset":3955,"endOffset":4173,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_xml_input$read","ranges":[{"startOffset":4176,"endOffset":6430,"count":11},{"startOffset":5540,"endOffset":5600,"count":0},{"startOffset":5806,"endOffset":6426,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1025","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_output.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10224,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":217,"endOffset":1630,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":403,"endOffset":521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":609,"endOffset":1332,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1488,"endOffset":1606,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_xml_output","ranges":[{"startOffset":1634,"endOffset":2589,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":2592,"endOffset":2705,"count":0}],"isBlockCoverage":false},{"functionName":"build_asx_node","ranges":[{"startOffset":2708,"endOffset":3897,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_xml_output$add","ranges":[{"startOffset":3900,"endOffset":6519,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_xml_output$add_xml","ranges":[{"startOffset":6522,"endOffset":7375,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_xml_output$render","ranges":[{"startOffset":7378,"endOffset":9806,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_xml_output$set_raw","ranges":[{"startOffset":9809,"endOffset":10067,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1026","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_pretty.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4493,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":123,"endOffset":839,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":352,"endOffset":416,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":458,"endOffset":522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":574,"endOffset":671,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":718,"endOffset":815,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_xml_pretty","ranges":[{"startOffset":843,"endOffset":928,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":931,"endOffset":1044,"count":0}],"isBlockCoverage":false},{"functionName":"print","ranges":[{"startOffset":1047,"endOffset":1119,"count":0}],"isBlockCoverage":false},{"functionName":"print","ranges":[{"startOffset":1129,"endOffset":4336,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1027","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zip.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":40314,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":109,"endOffset":9513,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":265,"endOffset":329,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":475,"endOffset":539,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":582,"endOffset":646,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":693,"endOffset":757,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":858,"endOffset":1743,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1840,"endOffset":2725,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2768,"endOffset":2834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2932,"endOffset":2998,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3042,"endOffset":4454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4546,"endOffset":4612,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4665,"endOffset":5820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5866,"endOffset":5962,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6012,"endOffset":6142,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6189,"endOffset":6286,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6331,"endOffset":7140,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7246,"endOffset":7343,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7393,"endOffset":7491,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7548,"endOffset":7645,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7748,"endOffset":7844,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7895,"endOffset":7959,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8012,"endOffset":8109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8200,"endOffset":9085,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9128,"endOffset":9194,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9311,"endOffset":9375,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9423,"endOffset":9489,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_zip","ranges":[{"startOffset":9517,"endOffset":9646,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":9649,"endOffset":9762,"count":0}],"isBlockCoverage":false},{"functionName":"encode_files","ranges":[{"startOffset":9765,"endOffset":9844,"count":0}],"isBlockCoverage":false},{"functionName":"encode_files","ranges":[{"startOffset":9854,"endOffset":13354,"count":0}],"isBlockCoverage":false},{"functionName":"export","ranges":[{"startOffset":13357,"endOffset":13424,"count":0}],"isBlockCoverage":false},{"functionName":"export","ranges":[{"startOffset":13434,"endOffset":19222,"count":0}],"isBlockCoverage":false},{"functionName":"export_object","ranges":[{"startOffset":19225,"endOffset":19306,"count":0}],"isBlockCoverage":false},{"functionName":"export_object","ranges":[{"startOffset":19316,"endOffset":25248,"count":0}],"isBlockCoverage":false},{"functionName":"export_package","ranges":[{"startOffset":25251,"endOffset":25334,"count":0}],"isBlockCoverage":false},{"functionName":"export_package","ranges":[{"startOffset":25344,"endOffset":28939,"count":0}],"isBlockCoverage":false},{"functionName":"filename","ranges":[{"startOffset":28942,"endOffset":29013,"count":0}],"isBlockCoverage":false},{"functionName":"filename","ranges":[{"startOffset":29023,"endOffset":30223,"count":0}],"isBlockCoverage":false},{"functionName":"load","ranges":[{"startOffset":30226,"endOffset":30289,"count":0}],"isBlockCoverage":false},{"functionName":"load","ranges":[{"startOffset":30299,"endOffset":31428,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_path","ranges":[{"startOffset":31431,"endOffset":31514,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_path","ranges":[{"startOffset":31524,"endOffset":35117,"count":0}],"isBlockCoverage":false},{"functionName":"save_binstring_to_localfile","ranges":[{"startOffset":35120,"endOffset":35229,"count":0}],"isBlockCoverage":false},{"functionName":"save_binstring_to_localfile","ranges":[{"startOffset":35239,"endOffset":35762,"count":0}],"isBlockCoverage":false},{"functionName":"unzip_file","ranges":[{"startOffset":35765,"endOffset":35840,"count":0}],"isBlockCoverage":false},{"functionName":"unzip_file","ranges":[{"startOffset":35850,"endOffset":40097,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1028","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":39752,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":3579,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":267,"endOffset":333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":417,"endOffset":549,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":634,"endOffset":766,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":849,"endOffset":979,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1064,"endOffset":1124,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1271,"endOffset":1331,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1377,"endOffset":1509,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1607,"endOffset":1667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1710,"endOffset":1770,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1872,"endOffset":1932,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1975,"endOffset":2035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2347,"endOffset":2615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2660,"endOffset":2720,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2814,"endOffset":3082,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3178,"endOffset":3470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3519,"endOffset":3555,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_zlib","ranges":[{"startOffset":3583,"endOffset":3917,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3920,"endOffset":4033,"count":0}],"isBlockCoverage":false},{"functionName":"copy_out","ranges":[{"startOffset":4036,"endOffset":4108,"count":0}],"isBlockCoverage":false},{"functionName":"copy_out","ranges":[{"startOffset":4118,"endOffset":5384,"count":212},{"startOffset":4940,"endOffset":5329,"count":1149}],"isBlockCoverage":true},{"functionName":"decode","ranges":[{"startOffset":5387,"endOffset":5455,"count":0}],"isBlockCoverage":false},{"functionName":"decode","ranges":[{"startOffset":5465,"endOffset":7532,"count":1399},{"startOffset":6407,"endOffset":7455,"count":6829},{"startOffset":6961,"endOffset":7244,"count":1399},{"startOffset":7244,"endOffset":7455,"count":5430},{"startOffset":7455,"endOffset":7531,"count":0}],"isBlockCoverage":true},{"functionName":"decode_loop","ranges":[{"startOffset":7535,"endOffset":7603,"count":0}],"isBlockCoverage":false},{"functionName":"decode_loop","ranges":[{"startOffset":7613,"endOffset":8533,"count":4},{"startOffset":7838,"endOffset":8478,"count":1012},{"startOffset":8050,"endOffset":8272,"count":796},{"startOffset":8272,"endOffset":8472,"count":216},{"startOffset":8345,"endOffset":8369,"count":4},{"startOffset":8369,"endOffset":8472,"count":212}],"isBlockCoverage":true},{"functionName":"decompress","ranges":[{"startOffset":8536,"endOffset":8612,"count":0}],"isBlockCoverage":false},{"functionName":"decompress","ranges":[{"startOffset":8622,"endOffset":10794,"count":5},{"startOffset":9217,"endOffset":9246,"count":0},{"startOffset":9929,"endOffset":9975,"count":1},{"startOffset":9975,"endOffset":10403,"count":4},{"startOffset":10052,"endOffset":10123,"count":1},{"startOffset":10123,"endOffset":10403,"count":3},{"startOffset":10273,"endOffset":10403,"count":0}],"isBlockCoverage":true},{"functionName":"dynamic","ranges":[{"startOffset":10797,"endOffset":10857,"count":0}],"isBlockCoverage":false},{"functionName":"dynamic","ranges":[{"startOffset":10867,"endOffset":18265,"count":3},{"startOffset":14574,"endOffset":14728,"count":57},{"startOffset":14942,"endOffset":15626,"count":48},{"startOffset":16037,"endOffset":17729,"count":175},{"startOffset":16248,"endOffset":16330,"count":156},{"startOffset":16330,"endOffset":17723,"count":19},{"startOffset":16468,"endOffset":16891,"count":1},{"startOffset":16891,"endOffset":17340,"count":18},{"startOffset":16963,"endOffset":17148,"count":8},{"startOffset":17148,"endOffset":17340,"count":10},{"startOffset":17516,"endOffset":17660,"count":669}],"isBlockCoverage":true},{"functionName":"fixed","ranges":[{"startOffset":18268,"endOffset":18324,"count":0}],"isBlockCoverage":false},{"functionName":"fixed","ranges":[{"startOffset":18334,"endOffset":20899,"count":1},{"startOffset":18822,"endOffset":18976,"count":144},{"startOffset":19215,"endOffset":19369,"count":112},{"startOffset":19607,"endOffset":19761,"count":24},{"startOffset":19998,"endOffset":20152,"count":8},{"startOffset":20557,"endOffset":20711,"count":30}],"isBlockCoverage":true},{"functionName":"map_distance","ranges":[{"startOffset":20902,"endOffset":20982,"count":0}],"isBlockCoverage":false},{"functionName":"map_distance","ranges":[{"startOffset":20992,"endOffset":28975,"count":212},{"startOffset":21312,"endOffset":21491,"count":0},{"startOffset":21562,"endOffset":21741,"count":0},{"startOffset":21812,"endOffset":21991,"count":0},{"startOffset":22062,"endOffset":22241,"count":0},{"startOffset":22312,"endOffset":22491,"count":2},{"startOffset":22491,"endOffset":28947,"count":210},{"startOffset":22562,"endOffset":22741,"count":0},{"startOffset":22812,"endOffset":22991,"count":2},{"startOffset":22991,"endOffset":28947,"count":208},{"startOffset":23062,"endOffset":23242,"count":2},{"startOffset":23242,"endOffset":28947,"count":206},{"startOffset":23313,"endOffset":23493,"count":4},{"startOffset":23493,"endOffset":28947,"count":202},{"startOffset":23564,"endOffset":23744,"count":14},{"startOffset":23744,"endOffset":28947,"count":188},{"startOffset":23816,"endOffset":23996,"count":13},{"startOffset":23996,"endOffset":28947,"count":175},{"startOffset":24068,"endOffset":24248,"count":13},{"startOffset":24248,"endOffset":28947,"count":162},{"startOffset":24320,"endOffset":24500,"count":16},{"startOffset":24500,"endOffset":28947,"count":146},{"startOffset":24572,"endOffset":24752,"count":13},{"startOffset":24752,"endOffset":28947,"count":133},{"startOffset":24824,"endOffset":25005,"count":18},{"startOffset":25005,"endOffset":28947,"count":115},{"startOffset":25077,"endOffset":25258,"count":20},{"startOffset":25258,"endOffset":28947,"count":95},{"startOffset":25330,"endOffset":25511,"count":22},{"startOffset":25511,"endOffset":28947,"count":73},{"startOffset":25583,"endOffset":25764,"count":22},{"startOffset":25764,"endOffset":28947,"count":51},{"startOffset":25836,"endOffset":26017,"count":16},{"startOffset":26017,"endOffset":28947,"count":35},{"startOffset":26089,"endOffset":26270,"count":11},{"startOffset":26270,"endOffset":28947,"count":24},{"startOffset":26342,"endOffset":26524,"count":22},{"startOffset":26524,"endOffset":28947,"count":2},{"startOffset":26778,"endOffset":28947,"count":0}],"isBlockCoverage":true},{"functionName":"map_length","ranges":[{"startOffset":28978,"endOffset":29054,"count":0}],"isBlockCoverage":false},{"functionName":"map_length","ranges":[{"startOffset":29064,"endOffset":36739,"count":212},{"startOffset":29382,"endOffset":29559,"count":92},{"startOffset":29559,"endOffset":36713,"count":120},{"startOffset":29632,"endOffset":29809,"count":40},{"startOffset":29809,"endOffset":36713,"count":80},{"startOffset":29882,"endOffset":30059,"count":22},{"startOffset":30059,"endOffset":36713,"count":58},{"startOffset":30132,"endOffset":30309,"count":12},{"startOffset":30309,"endOffset":36713,"count":46},{"startOffset":30382,"endOffset":30559,"count":8},{"startOffset":30559,"endOffset":36713,"count":38},{"startOffset":30632,"endOffset":30809,"count":4},{"startOffset":30809,"endOffset":36713,"count":34},{"startOffset":30882,"endOffset":31059,"count":7},{"startOffset":31059,"endOffset":36713,"count":27},{"startOffset":31132,"endOffset":31310,"count":4},{"startOffset":31310,"endOffset":36713,"count":23},{"startOffset":31383,"endOffset":31561,"count":10},{"startOffset":31561,"endOffset":36713,"count":13},{"startOffset":31634,"endOffset":31812,"count":5},{"startOffset":31812,"endOffset":36713,"count":8},{"startOffset":31885,"endOffset":32063,"count":2},{"startOffset":32063,"endOffset":36713,"count":6},{"startOffset":32136,"endOffset":32314,"count":1},{"startOffset":32314,"endOffset":36713,"count":5},{"startOffset":32387,"endOffset":32565,"count":3},{"startOffset":32565,"endOffset":36713,"count":2},{"startOffset":32816,"endOffset":36713,"count":0}],"isBlockCoverage":true},{"functionName":"not_compressed","ranges":[{"startOffset":36742,"endOffset":36816,"count":0}],"isBlockCoverage":false},{"functionName":"not_compressed","ranges":[{"startOffset":36826,"endOffset":37543,"count":1}],"isBlockCoverage":true},{"functionName":"read_pair","ranges":[{"startOffset":37546,"endOffset":37620,"count":0}],"isBlockCoverage":false},{"functionName":"read_pair","ranges":[{"startOffset":37630,"endOffset":38392,"count":212}],"isBlockCoverage":true}]},{"scriptId":"1029","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_convert.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4099,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":1035,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":365,"endOffset":429,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":471,"endOffset":507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":603,"endOffset":663,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":706,"endOffset":748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":843,"endOffset":909,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":951,"endOffset":1011,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_zlib_convert","ranges":[{"startOffset":1039,"endOffset":1124,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1127,"endOffset":1240,"count":3},{"startOffset":1183,"endOffset":1219,"count":0}],"isBlockCoverage":true},{"functionName":"bits_to_int","ranges":[{"startOffset":1243,"endOffset":1329,"count":1}],"isBlockCoverage":true},{"functionName":"bits_to_int","ranges":[{"startOffset":1339,"endOffset":2154,"count":7333},{"startOffset":1811,"endOffset":2080,"count":23666}],"isBlockCoverage":true},{"functionName":"hex_to_bits","ranges":[{"startOffset":2157,"endOffset":2243,"count":1}],"isBlockCoverage":true},{"functionName":"hex_to_bits","ranges":[{"startOffset":2253,"endOffset":3517,"count":1064},{"startOffset":2818,"endOffset":3442,"count":1065},{"startOffset":3087,"endOffset":3334,"count":8520}],"isBlockCoverage":true},{"functionName":"int_to_hex","ranges":[{"startOffset":3520,"endOffset":3604,"count":1}],"isBlockCoverage":true},{"functionName":"int_to_hex","ranges":[{"startOffset":3614,"endOffset":3934,"count":797}],"isBlockCoverage":true}]},{"scriptId":"1030","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_huffman.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8477,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":127,"endOffset":1979,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":293,"endOffset":535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":618,"endOffset":860,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":943,"endOffset":1003,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1156,"endOffset":1434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1530,"endOffset":1590,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1634,"endOffset":1694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1791,"endOffset":1851,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1895,"endOffset":1955,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_zlib_huffman","ranges":[{"startOffset":1983,"endOffset":2622,"count":13}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2625,"endOffset":7215,"count":13},{"startOffset":3991,"endOffset":4148,"count":195},{"startOffset":4268,"endOffset":4690,"count":1498},{"startOffset":4371,"endOffset":4398,"count":719},{"startOffset":4398,"endOffset":4690,"count":779},{"startOffset":5035,"endOffset":5439,"count":182},{"startOffset":5682,"endOffset":5840,"count":1498},{"startOffset":6083,"endOffset":7143,"count":1498},{"startOffset":6456,"endOffset":6483,"count":719},{"startOffset":6483,"endOffset":7143,"count":779}],"isBlockCoverage":true},{"functionName":"get_count","ranges":[{"startOffset":7218,"endOffset":7548,"count":6829}],"isBlockCoverage":true},{"functionName":"get_symbol","ranges":[{"startOffset":7551,"endOffset":7883,"count":1399}],"isBlockCoverage":true}]},{"scriptId":"1031","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_stream.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5065,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":1748,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":289,"endOffset":353,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":440,"endOffset":506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":656,"endOffset":722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":817,"endOffset":881,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":926,"endOffset":986,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1079,"endOffset":1139,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1184,"endOffset":1244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1341,"endOffset":1401,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1498,"endOffset":1564,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1609,"endOffset":1669,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_zlib_stream","ranges":[{"startOffset":1752,"endOffset":1983,"count":6}],"isBlockCoverage":true},{"functionName":"clear_bits","ranges":[{"startOffset":1986,"endOffset":2051,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2054,"endOffset":2271,"count":6}],"isBlockCoverage":true},{"functionName":"remaining","ranges":[{"startOffset":2274,"endOffset":2505,"count":6}],"isBlockCoverage":true},{"functionName":"take_bits","ranges":[{"startOffset":2508,"endOffset":4115,"count":7343},{"startOffset":3060,"endOffset":4040,"count":7311},{"startOffset":3160,"endOffset":3409,"count":1063},{"startOffset":3576,"endOffset":3719,"count":1058},{"startOffset":3719,"endOffset":4034,"count":6253}],"isBlockCoverage":true},{"functionName":"take_bytes","ranges":[{"startOffset":4118,"endOffset":4521,"count":2}],"isBlockCoverage":true},{"functionName":"take_int","ranges":[{"startOffset":4524,"endOffset":4904,"count":503}],"isBlockCoverage":true}]},{"scriptId":"1032","url":"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_ajson_error.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14102,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":219,"endOffset":5219,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":421,"endOffset":516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":597,"endOffset":661,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":743,"endOffset":807,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":883,"endOffset":975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1051,"endOffset":1143,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1219,"endOffset":1311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1387,"endOffset":1479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1568,"endOffset":2058,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2155,"endOffset":2497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2601,"endOffset":3091,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3240,"endOffset":3582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3626,"endOffset":3724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3762,"endOffset":3857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3900,"endOffset":3964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4008,"endOffset":4072,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4110,"endOffset":4202,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4240,"endOffset":4332,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4370,"endOffset":4462,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4500,"endOffset":4592,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4682,"endOffset":4746,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4793,"endOffset":4857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4900,"endOffset":4943,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5045,"endOffset":5109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5152,"endOffset":5195,"count":0}],"isBlockCoverage":false},{"functionName":"zcx_abapgit_ajson_error","ranges":[{"startOffset":5223,"endOffset":6508,"count":39}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":6511,"endOffset":8609,"count":39},{"startOffset":6915,"endOffset":6942,"count":0},{"startOffset":7079,"endOffset":7110,"count":0},{"startOffset":7232,"endOffset":7251,"count":0},{"startOffset":7484,"endOffset":7515,"count":0},{"startOffset":7634,"endOffset":7653,"count":0},{"startOffset":7772,"endOffset":7791,"count":0},{"startOffset":7910,"endOffset":7929,"count":0},{"startOffset":8048,"endOffset":8067,"count":0},{"startOffset":8527,"endOffset":8588,"count":0}],"isBlockCoverage":true},{"functionName":"raise","ranges":[{"startOffset":8612,"endOffset":8685,"count":0}],"isBlockCoverage":false},{"functionName":"raise","ranges":[{"startOffset":8695,"endOffset":9424,"count":39},{"startOffset":8950,"endOffset":8987,"count":7},{"startOffset":9067,"endOffset":9093,"count":3}],"isBlockCoverage":true},{"functionName":"set_location","ranges":[{"startOffset":9427,"endOffset":11466,"count":51},{"startOffset":9680,"endOffset":9706,"count":39},{"startOffset":10538,"endOffset":10581,"count":17},{"startOffset":10581,"endOffset":11032,"count":34},{"startOffset":10632,"endOffset":11032,"count":3},{"startOffset":11086,"endOffset":11221,"count":20},{"startOffset":11221,"endOffset":11266,"count":31}],"isBlockCoverage":true}]},{"scriptId":"1033","url":"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_cancel.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3951,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":227,"endOffset":1810,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":527,"endOffset":869,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":913,"endOffset":1011,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1050,"endOffset":1168,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1209,"endOffset":1301,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1342,"endOffset":1434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1475,"endOffset":1567,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1608,"endOffset":1700,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1744,"endOffset":1786,"count":0}],"isBlockCoverage":false},{"functionName":"zcx_abapgit_cancel","ranges":[{"startOffset":1814,"endOffset":1912,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1915,"endOffset":3810,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1034","url":"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_exception.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":41800,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":215,"endOffset":10632,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":417,"endOffset":481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":560,"endOffset":652,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":731,"endOffset":823,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":902,"endOffset":994,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1073,"endOffset":1165,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1250,"endOffset":1314,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1400,"endOffset":1903,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1983,"endOffset":2101,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2189,"endOffset":2516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2605,"endOffset":2932,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3025,"endOffset":3089,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3186,"endOffset":3528,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3632,"endOffset":4122,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4279,"endOffset":4647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4690,"endOffset":4754,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4914,"endOffset":4978,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5020,"endOffset":5369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5475,"endOffset":5824,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5936,"endOffset":5996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6043,"endOffset":6103,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6145,"endOffset":6494,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6609,"endOffset":6767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6882,"endOffset":6946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6991,"endOffset":7055,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7146,"endOffset":7188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7235,"endOffset":7333,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7375,"endOffset":7493,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7540,"endOffset":7582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7679,"endOffset":7773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7817,"endOffset":7891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7935,"endOffset":8027,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8071,"endOffset":8163,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8207,"endOffset":8299,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8343,"endOffset":8435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8477,"endOffset":8595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8642,"endOffset":8740,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8787,"endOffset":8829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8934,"endOffset":9032,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9079,"endOffset":9121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9217,"endOffset":9559,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9603,"endOffset":9701,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9740,"endOffset":9858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9899,"endOffset":9991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10032,"endOffset":10124,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10165,"endOffset":10257,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10298,"endOffset":10390,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10434,"endOffset":10476,"count":0}],"isBlockCoverage":false},{"functionName":"zcx_abapgit_exception","ranges":[{"startOffset":10636,"endOffset":12587,"count":86}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":12590,"endOffset":14638,"count":86},{"startOffset":12994,"endOffset":13021,"count":84},{"startOffset":13158,"endOffset":13189,"count":84},{"startOffset":13336,"endOffset":13357,"count":84},{"startOffset":13632,"endOffset":13657,"count":84},{"startOffset":13782,"endOffset":13807,"count":84},{"startOffset":13932,"endOffset":13957,"count":84},{"startOffset":14038,"endOffset":14066,"count":84},{"startOffset":14412,"endOffset":14523,"count":2},{"startOffset":14523,"endOffset":14584,"count":84}],"isBlockCoverage":true},{"functionName":"get_source_position","ranges":[{"startOffset":14641,"endOffset":15985,"count":0}],"isBlockCoverage":false},{"functionName":"get_t100_longtext_itf","ranges":[{"startOffset":15988,"endOffset":19826,"count":1},{"startOffset":16749,"endOffset":16819,"count":0},{"startOffset":16821,"endOffset":16871,"count":0},{"startOffset":16930,"endOffset":17000,"count":0},{"startOffset":17277,"endOffset":17488,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17724,"endOffset":17862,"count":1},{"startOffset":17776,"endOffset":17842,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18252,"endOffset":18396,"count":1},{"startOffset":18306,"endOffset":18374,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18794,"endOffset":18944,"count":1},{"startOffset":18850,"endOffset":18920,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19350,"endOffset":19506,"count":1},{"startOffset":19408,"endOffset":19480,"count":0}],"isBlockCoverage":true},{"functionName":"if_message$get_longtext","ranges":[{"startOffset":19839,"endOffset":21216,"count":5},{"startOffset":20451,"endOffset":20514,"count":4},{"startOffset":20514,"endOffset":20911,"count":1},{"startOffset":20707,"endOffset":20911,"count":0},{"startOffset":21065,"endOffset":21173,"count":0}],"isBlockCoverage":true},{"functionName":"itf_to_string","ranges":[{"startOffset":21229,"endOffset":26139,"count":1},{"startOffset":23822,"endOffset":25027,"count":0},{"startOffset":25111,"endOffset":25181,"count":0},{"startOffset":25183,"endOffset":25233,"count":0},{"startOffset":25318,"endOffset":25388,"count":0},{"startOffset":25685,"endOffset":26093,"count":0}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":23706,"endOffset":23775,"count":0}],"isBlockCoverage":false},{"functionName":"raise","ranges":[{"startOffset":26152,"endOffset":26243,"count":0}],"isBlockCoverage":false},{"functionName":"raise","ranges":[{"startOffset":26263,"endOffset":27414,"count":75},{"startOffset":26571,"endOffset":26608,"count":10},{"startOffset":26781,"endOffset":26808,"count":0},{"startOffset":26915,"endOffset":26949,"count":9},{"startOffset":27077,"endOffset":27166,"count":1},{"startOffset":27166,"endOffset":27227,"count":74},{"startOffset":27400,"endOffset":27413,"count":0}],"isBlockCoverage":true},{"functionName":"raise_t100","ranges":[{"startOffset":27427,"endOffset":27528,"count":0}],"isBlockCoverage":false},{"functionName":"raise_t100","ranges":[{"startOffset":27548,"endOffset":31219,"count":84},{"startOffset":27726,"endOffset":27757,"count":9},{"startOffset":27829,"endOffset":27873,"count":75},{"startOffset":28006,"endOffset":28037,"count":9},{"startOffset":28109,"endOffset":28153,"count":75},{"startOffset":28304,"endOffset":28335,"count":9},{"startOffset":28407,"endOffset":28451,"count":75},{"startOffset":28602,"endOffset":28633,"count":9},{"startOffset":28705,"endOffset":28749,"count":75},{"startOffset":28900,"endOffset":28931,"count":9},{"startOffset":29003,"endOffset":29047,"count":75},{"startOffset":29198,"endOffset":29229,"count":9},{"startOffset":29301,"endOffset":29345,"count":75},{"startOffset":29518,"endOffset":29545,"count":75},{"startOffset":30743,"endOffset":30812,"count":0}],"isBlockCoverage":true},{"functionName":"raise_with_text","ranges":[{"startOffset":31232,"endOffset":31343,"count":0}],"isBlockCoverage":false},{"functionName":"raise_with_text","ranges":[{"startOffset":31363,"endOffset":31892,"count":4},{"startOffset":31700,"endOffset":31734,"count":2},{"startOffset":31878,"endOffset":31891,"count":0}],"isBlockCoverage":true},{"functionName":"remove_empty_section","ranges":[{"startOffset":31905,"endOffset":33042,"count":0}],"isBlockCoverage":false},{"functionName":"remove_newlines_from_string","ranges":[{"startOffset":33055,"endOffset":33190,"count":0}],"isBlockCoverage":false},{"functionName":"remove_newlines_from_string","ranges":[{"startOffset":33210,"endOffset":34336,"count":0}],"isBlockCoverage":false},{"functionName":"replace_section_head_with_text","ranges":[{"startOffset":34349,"endOffset":35531,"count":0}],"isBlockCoverage":false},{"functionName":"save_callstack","ranges":[{"startOffset":35544,"endOffset":37135,"count":86},{"startOffset":36000,"endOffset":36070,"count":0},{"startOffset":36072,"endOffset":36122,"count":0},{"startOffset":36197,"endOffset":36267,"count":0},{"startOffset":36931,"endOffset":37055,"count":0}],"isBlockCoverage":true},{"functionName":"split_text_to_symsg","ranges":[{"startOffset":37148,"endOffset":37267,"count":0}],"isBlockCoverage":false},{"functionName":"split_text_to_symsg","ranges":[{"startOffset":37287,"endOffset":38875,"count":80}],"isBlockCoverage":true}]},{"scriptId":"1035","url":"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_not_found.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1340,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":215,"endOffset":688,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":474,"endOffset":522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":566,"endOffset":664,"count":0}],"isBlockCoverage":false},{"functionName":"zcx_abapgit_not_found","ranges":[{"startOffset":692,"endOffset":790,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":793,"endOffset":1187,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1036","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_intf_v1.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7847,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":1080,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":149,"endOffset":999,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1037","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_oo_types_v1.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10560,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":79,"endOffset":157,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1038","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_registry.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":616,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":450,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":235,"endOffset":332,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":379,"endOffset":426,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1039","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_type_mapping.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":931,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":81,"endOffset":749,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":227,"endOffset":270,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":320,"endOffset":418,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":461,"endOffset":504,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":596,"endOffset":639,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":682,"endOffset":725,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1040","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_types_v1.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12201,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":3133,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":168,"endOffset":600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":698,"endOffset":1118,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1222,"endOffset":1541,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1624,"endOffset":2709,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2790,"endOffset":3052,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1041","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ajson.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14768,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":13627,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":138,"endOffset":1268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1349,"endOffset":1413,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1493,"endOffset":1557,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1638,"endOffset":1702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1846,"endOffset":1968,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2060,"endOffset":2182,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2227,"endOffset":2363,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2452,"endOffset":2574,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2619,"endOffset":2757,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2909,"endOffset":3031,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3132,"endOffset":3254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3300,"endOffset":3397,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3509,"endOffset":3631,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3676,"endOffset":3773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3863,"endOffset":4367,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4460,"endOffset":4557,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4651,"endOffset":4748,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4791,"endOffset":4855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4951,"endOffset":5209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5252,"endOffset":5316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5406,"endOffset":5470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5513,"endOffset":5577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5681,"endOffset":5776,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5819,"endOffset":5883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5981,"endOffset":6078,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6121,"endOffset":6185,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6283,"endOffset":6343,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6386,"endOffset":6450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6547,"endOffset":6605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6648,"endOffset":6712,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6807,"endOffset":6864,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6907,"endOffset":6971,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7071,"endOffset":7163,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7206,"endOffset":7270,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7367,"endOffset":7431,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7474,"endOffset":7538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7629,"endOffset":7751,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7794,"endOffset":7858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7960,"endOffset":8057,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8105,"endOffset":8148,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8263,"endOffset":8521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8564,"endOffset":8628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8767,"endOffset":8889,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8932,"endOffset":8996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9038,"endOffset":9081,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9132,"endOffset":9229,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9277,"endOffset":9372,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9462,"endOffset":9584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9628,"endOffset":9692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9789,"endOffset":9911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9954,"endOffset":10018,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10060,"endOffset":10103,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10199,"endOffset":10321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10364,"endOffset":10428,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10470,"endOffset":10512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10609,"endOffset":10731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10774,"endOffset":10838,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10880,"endOffset":10940,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11034,"endOffset":11156,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11199,"endOffset":11263,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11305,"endOffset":11362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11461,"endOffset":11583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11626,"endOffset":11690,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11732,"endOffset":11824,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11918,"endOffset":12040,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12083,"endOffset":12147,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12239,"endOffset":12361,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12404,"endOffset":12468,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12565,"endOffset":12687,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12730,"endOffset":12794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12838,"endOffset":12935,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13025,"endOffset":13147,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13190,"endOffset":13254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13296,"endOffset":13339,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13434,"endOffset":13498,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13543,"endOffset":13603,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1042","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ajson_filter.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3016,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":1691,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":150,"endOffset":500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":648,"endOffset":745,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":788,"endOffset":1525,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1569,"endOffset":1667,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1043","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ajson_mapping.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4366,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75,"endOffset":1867,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":220,"endOffset":284,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":327,"endOffset":391,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":434,"endOffset":498,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":593,"endOffset":657,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":700,"endOffset":764,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":807,"endOffset":871,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":968,"endOffset":1705,"count":24}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1748,"endOffset":1843,"count":24}],"isBlockCoverage":true}]},{"scriptId":"1044","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ajson_types.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5506,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":844,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":147,"endOffset":763,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1045","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_apack_definitions.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12414,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83,"endOffset":912,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":170,"endOffset":234,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":333,"endOffset":440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":535,"endOffset":635,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":731,"endOffset":831,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1046","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_auth.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2512,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":1213,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":139,"endOffset":688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":840,"endOffset":937,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":989,"endOffset":1081,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1125,"endOffset":1189,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1047","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_background.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2845,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":1851,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":227,"endOffset":291,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":393,"endOffset":897,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":986,"endOffset":1116,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1158,"endOffset":1276,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1323,"endOffset":1827,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1048","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_code_inspector.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6631,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":3071,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":216,"endOffset":1555,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1601,"endOffset":1697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1740,"endOffset":1837,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1939,"endOffset":2036,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2136,"endOffset":2200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2322,"endOffset":2418,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2524,"endOffset":3047,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1049","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_comparator.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1127,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":761,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":214,"endOffset":402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":447,"endOffset":577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":619,"endOffset":737,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1050","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_cts_api.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9309,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":63,"endOffset":6800,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":146,"endOffset":450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":544,"endOffset":710,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":800,"endOffset":958,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1126,"endOffset":1218,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1261,"endOffset":1855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1974,"endOffset":2071,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2117,"endOffset":2213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2328,"endOffset":2841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2885,"endOffset":3697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3810,"endOffset":3857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3904,"endOffset":3963,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4008,"endOffset":4055,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4102,"endOffset":4161,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4270,"endOffset":4334,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4379,"endOffset":4471,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4567,"endOffset":4657,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4702,"endOffset":4794,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4909,"endOffset":5001,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5049,"endOffset":5169,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5217,"endOffset":5337,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5385,"endOffset":5505,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5551,"endOffset":5645,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5755,"endOffset":5802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5847,"endOffset":5894,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5941,"endOffset":5983,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6029,"endOffset":6125,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6172,"endOffset":6270,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6313,"endOffset":6355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6400,"endOffset":6447,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6494,"endOffset":6553,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6679,"endOffset":6776,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1051","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_data_config.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9223,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":6076,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":152,"endOffset":216,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":306,"endOffset":370,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":452,"endOffset":516,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":601,"endOffset":1057,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1208,"endOffset":1797,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1893,"endOffset":2778,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2878,"endOffset":3693,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3794,"endOffset":4383,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4477,"endOffset":5362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5463,"endOffset":6052,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1052","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_data_deserializer.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13876,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83,"endOffset":10831,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":238,"endOffset":816,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":859,"endOffset":975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1020,"endOffset":1154,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1253,"endOffset":2771,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2816,"endOffset":2950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2994,"endOffset":3879,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3984,"endOffset":4637,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4682,"endOffset":9244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9289,"endOffset":10807,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1053","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_data_serializer.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1491,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":79,"endOffset":1313,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":225,"endOffset":1110,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1155,"endOffset":1289,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1054","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_data_supporter.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1525,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":594,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":237,"endOffset":334,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":377,"endOffset":479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":522,"endOffset":570,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1055","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_definitions.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":78828,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":9160,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":150,"endOffset":619,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":699,"endOffset":946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1027,"endOffset":1618,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1701,"endOffset":1790,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1874,"endOffset":1938,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2025,"endOffset":2089,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2177,"endOffset":2241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2323,"endOffset":7409,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7506,"endOffset":7554,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7650,"endOffset":7698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7777,"endOffset":7876,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7954,"endOffset":8053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8136,"endOffset":8243,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8325,"endOffset":8768,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8865,"endOffset":9079,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1056","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_dot_abapgit.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5421,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":909,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":152,"endOffset":401,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":498,"endOffset":828,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1057","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ecatt.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1481,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":137,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1058","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ecatt_download.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":497,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":323,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":233,"endOffset":299,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1059","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ecatt_upload.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":485,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":319,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":229,"endOffset":295,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1060","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_environment.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3810,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":2710,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":230,"endOffset":327,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":424,"endOffset":521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":639,"endOffset":736,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":845,"endOffset":942,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1049,"endOffset":1146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1256,"endOffset":1353,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1458,"endOffset":1769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1899,"endOffset":2463,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2589,"endOffset":2686,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1061","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_exit.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":27154,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":25761,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":222,"endOffset":264,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":312,"endOffset":354,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":401,"endOffset":443,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":493,"endOffset":595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":645,"endOffset":687,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":800,"endOffset":864,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":911,"endOffset":975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1081,"endOffset":1178,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1282,"endOffset":1565,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1682,"endOffset":1724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1783,"endOffset":1880,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1987,"endOffset":2029,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2078,"endOffset":2142,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2248,"endOffset":2290,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2338,"endOffset":2402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2520,"endOffset":2987,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3103,"endOffset":3365,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3466,"endOffset":3562,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3604,"endOffset":3722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3766,"endOffset":4575,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4681,"endOffset":4797,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4839,"endOffset":4903,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5017,"endOffset":5300,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5348,"endOffset":5520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5565,"endOffset":5848,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5957,"endOffset":7688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7730,"endOffset":7848,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7961,"endOffset":8077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8130,"endOffset":8426,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8482,"endOffset":8574,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8674,"endOffset":8721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8768,"endOffset":9249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9347,"endOffset":9446,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9542,"endOffset":9606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9651,"endOffset":9767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9864,"endOffset":10221,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10265,"endOffset":10395,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10511,"endOffset":14907,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14951,"endOffset":16363,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16408,"endOffset":17293,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17403,"endOffset":17499,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17541,"endOffset":17659,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17703,"endOffset":19115,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19224,"endOffset":20027,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20071,"endOffset":20189,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20232,"endOffset":20362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20465,"endOffset":20585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20693,"endOffset":25089,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25132,"endOffset":25252,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25358,"endOffset":25490,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25532,"endOffset":25631,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25673,"endOffset":25737,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1062","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_field_rules.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3897,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":2400,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":149,"endOffset":807,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":949,"endOffset":1083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1127,"endOffset":1221,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1265,"endOffset":1363,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1411,"endOffset":1513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1617,"endOffset":1711,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1754,"endOffset":1874,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1977,"endOffset":2071,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2117,"endOffset":2213,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2256,"endOffset":2376,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1063","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_frontend_services.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6645,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83,"endOffset":5908,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":230,"endOffset":296,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":339,"endOffset":403,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":502,"endOffset":566,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":609,"endOffset":675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":782,"endOffset":846,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":890,"endOffset":954,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1002,"endOffset":1066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1121,"endOffset":1185,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1292,"endOffset":1356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1400,"endOffset":1464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1512,"endOffset":1576,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1631,"endOffset":1695,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1806,"endOffset":1903,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1946,"endOffset":2066,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2163,"endOffset":2227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2277,"endOffset":2341,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2389,"endOffset":2453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2509,"endOffset":2573,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2621,"endOffset":2685,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2733,"endOffset":2797,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2847,"endOffset":2911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2959,"endOffset":3023,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3141,"endOffset":3205,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3315,"endOffset":3379,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3432,"endOffset":3496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3550,"endOffset":3614,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3728,"endOffset":3832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3940,"endOffset":4052,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4097,"endOffset":4204,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4252,"endOffset":4362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4419,"endOffset":4483,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4586,"endOffset":4683,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4731,"endOffset":4795,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4902,"endOffset":4966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5007,"endOffset":5067,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5181,"endOffset":5278,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5384,"endOffset":5481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5590,"endOffset":5687,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5787,"endOffset":5884,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1064","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_git_definitions.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":21762,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":79,"endOffset":2670,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":153,"endOffset":619,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":699,"endOffset":1248,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1339,"endOffset":1858,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1943,"endOffset":2007,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2093,"endOffset":2589,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1065","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_asset_manager.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4813,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83,"endOffset":3071,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":235,"endOffset":1095,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1191,"endOffset":1825,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1867,"endOffset":1931,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2032,"endOffset":2096,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2138,"endOffset":2202,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2255,"endOffset":2319,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2418,"endOffset":2482,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2525,"endOffset":2589,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2636,"endOffset":2733,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2781,"endOffset":2829,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2874,"endOffset":2938,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2983,"endOffset":3047,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1066","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_error_handler.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":711,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83,"endOffset":525,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":234,"endOffset":331,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":375,"endOffset":501,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1067","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_event.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1829,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":1675,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":143,"endOffset":207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":291,"endOffset":355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":440,"endOffset":761,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":850,"endOffset":986,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1080,"endOffset":1144,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1294,"endOffset":1422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1523,"endOffset":1651,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1068","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_event_handler.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1364,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83,"endOffset":785,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":230,"endOffset":587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":631,"endOffset":761,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1069","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_hotkey_ctl.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2541,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":2367,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":232,"endOffset":1103,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1275,"endOffset":2146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2246,"endOffset":2343,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1070","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_hotkeys.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2785,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":1130,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":235,"endOffset":1106,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1071","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_html_processor.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":800,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":85,"endOffset":610,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":228,"endOffset":292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":335,"endOffset":399,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":450,"endOffset":586,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1072","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_jumper.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4035,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":3877,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":209,"endOffset":306,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":349,"endOffset":943,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":990,"endOffset":1584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1634,"endOffset":1694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1743,"endOffset":1840,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1934,"endOffset":2031,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2074,"endOffset":2668,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2719,"endOffset":2767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2817,"endOffset":2877,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2980,"endOffset":3054,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3100,"endOffset":3375,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3424,"endOffset":3521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3623,"endOffset":3712,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3754,"endOffset":3853,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1073","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_menu_provider.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":572,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83,"endOffset":386,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":230,"endOffset":362,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1074","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_modal.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":485,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":331,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":210,"endOffset":307,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1075","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_page_title.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":490,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":316,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":228,"endOffset":292,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1076","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_render_item.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":733,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":79,"endOffset":555,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":221,"endOffset":341,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":384,"endOffset":427,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":471,"endOffset":531,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1077","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_renderable.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":537,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":363,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":219,"endOffset":339,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1078","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_services.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2720,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":2554,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":219,"endOffset":283,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":326,"endOffset":390,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":434,"endOffset":500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":542,"endOffset":606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":649,"endOffset":691,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":737,"endOffset":779,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":883,"endOffset":947,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":990,"endOffset":1054,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1102,"endOffset":1150,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1195,"endOffset":1259,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1376,"endOffset":1522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1634,"endOffset":1698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1805,"endOffset":1945,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2046,"endOffset":2174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2266,"endOffset":2384,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2433,"endOffset":2530,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1079","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10538,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":8932,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":138,"endOffset":202,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":289,"endOffset":578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":662,"endOffset":865,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1013,"endOffset":1133,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1177,"endOffset":1241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1330,"endOffset":1450,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1494,"endOffset":1537,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1629,"endOffset":1693,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1747,"endOffset":1844,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1937,"endOffset":2034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2125,"endOffset":2245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2287,"endOffset":2351,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2393,"endOffset":2457,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2501,"endOffset":2565,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2607,"endOffset":2649,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2691,"endOffset":2733,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2777,"endOffset":2841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2882,"endOffset":2946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2990,"endOffset":3054,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3098,"endOffset":3162,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3260,"endOffset":3380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3421,"endOffset":3485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3531,"endOffset":3628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3714,"endOffset":3778,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3820,"endOffset":3884,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3926,"endOffset":3990,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4034,"endOffset":4098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4140,"endOffset":4182,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4224,"endOffset":4266,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4310,"endOffset":4374,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4415,"endOffset":4479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4523,"endOffset":4587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4631,"endOffset":4695,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4784,"endOffset":4848,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4891,"endOffset":4955,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4998,"endOffset":5062,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5106,"endOffset":5170,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5216,"endOffset":5280,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5374,"endOffset":5494,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5537,"endOffset":5601,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5644,"endOffset":5708,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5752,"endOffset":5816,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5862,"endOffset":5926,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6016,"endOffset":6136,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6178,"endOffset":6242,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6288,"endOffset":6352,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6398,"endOffset":6518,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6559,"endOffset":6623,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6667,"endOffset":6731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6774,"endOffset":6838,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6895,"endOffset":6992,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7080,"endOffset":7200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7246,"endOffset":7310,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7356,"endOffset":7476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7517,"endOffset":7581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7625,"endOffset":7689,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7732,"endOffset":7796,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7853,"endOffset":7950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8038,"endOffset":8158,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8204,"endOffset":8268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8314,"endOffset":8434,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8475,"endOffset":8539,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8583,"endOffset":8647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8690,"endOffset":8754,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8811,"endOffset":8908,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1080","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html_form.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10299,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":1277,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":140,"endOffset":204,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":288,"endOffset":585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":671,"endOffset":1196,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1081","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html_popup.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":538,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":380,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":224,"endOffset":356,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1082","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html_table.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2388,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":1554,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":219,"endOffset":423,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":471,"endOffset":531,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":573,"endOffset":616,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":715,"endOffset":1138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1186,"endOffset":1246,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1288,"endOffset":1331,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1379,"endOffset":1443,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1487,"endOffset":1530,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1083","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html_viewer.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3616,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":1905,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":151,"endOffset":211,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":358,"endOffset":422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":465,"endOffset":507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":553,"endOffset":595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":638,"endOffset":698,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":749,"endOffset":813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":862,"endOffset":982,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1091,"endOffset":1158,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1251,"endOffset":1315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1515,"endOffset":1579,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1730,"endOffset":1827,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1084","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_http_agent.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2675,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":1708,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":145,"endOffset":508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":671,"endOffset":799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":896,"endOffset":1034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1076,"endOffset":1140,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1185,"endOffset":1249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1293,"endOffset":1421,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1467,"endOffset":1595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1641,"endOffset":1684,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1085","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_http_response.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1611,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75,"endOffset":1441,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":215,"endOffset":281,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":372,"endOffset":436,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":526,"endOffset":648,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":738,"endOffset":835,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":925,"endOffset":985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1079,"endOffset":1143,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1239,"endOffset":1367,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1086","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_i18n_file.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2075,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":1554,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":209,"endOffset":275,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":376,"endOffset":1224,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1312,"endOffset":1376,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1466,"endOffset":1530,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1087","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_lang_definitions.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3901,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":81,"endOffset":159,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1088","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_log.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15879,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":55,"endOffset":9859,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":130,"endOffset":405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":490,"endOffset":783,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":924,"endOffset":966,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1009,"endOffset":1082,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1125,"endOffset":1719,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1761,"endOffset":1859,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1953,"endOffset":1995,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2038,"endOffset":2632,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2725,"endOffset":2767,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2810,"endOffset":3404,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3500,"endOffset":3542,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3585,"endOffset":4179,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4275,"endOffset":4317,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4360,"endOffset":4954,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5052,"endOffset":5150,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5193,"endOffset":5787,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5929,"endOffset":5989,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6086,"endOffset":6727,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6835,"endOffset":8357,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8455,"endOffset":8528,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8628,"endOffset":8688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8784,"endOffset":8848,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8942,"endOffset":9060,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9104,"endOffset":9146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9241,"endOffset":9359,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9401,"endOffset":9519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9567,"endOffset":9627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9717,"endOffset":9835,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1089","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_longtexts.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11222,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":6183,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":213,"endOffset":307,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":357,"endOffset":405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":455,"endOffset":502,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":546,"endOffset":1224,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1324,"endOffset":3853,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3905,"endOffset":3969,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4019,"endOffset":4061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4111,"endOffset":4158,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4202,"endOffset":4880,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4922,"endOffset":5054,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5104,"endOffset":5234,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5340,"endOffset":5404,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5454,"endOffset":5496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5546,"endOffset":5593,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5635,"endOffset":5765,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5817,"endOffset":5915,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6014,"endOffset":6062,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6112,"endOffset":6159,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1090","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_lxe_texts.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2724,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":1699,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":219,"endOffset":266,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":316,"endOffset":364,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":414,"endOffset":544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":586,"endOffset":718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":762,"endOffset":896,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1000,"endOffset":1047,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1097,"endOffset":1145,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1195,"endOffset":1325,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1367,"endOffset":1497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1541,"endOffset":1675,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1091","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_merge.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15175,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":7922,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":213,"endOffset":1362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1459,"endOffset":6432,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6544,"endOffset":6608,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6719,"endOffset":6816,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6922,"endOffset":7850,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1092","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_object.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9319,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":61,"endOffset":8373,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":136,"endOffset":270,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":354,"endOffset":827,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":974,"endOffset":1106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1206,"endOffset":1302,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1344,"endOffset":1474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1517,"endOffset":1623,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1665,"endOffset":1783,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1831,"endOffset":1923,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2018,"endOffset":2114,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2162,"endOffset":2254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2346,"endOffset":2443,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2543,"endOffset":2640,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2737,"endOffset":2834,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2930,"endOffset":3024,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3068,"endOffset":3132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3222,"endOffset":3319,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3363,"endOffset":3427,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3529,"endOffset":3826,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3932,"endOffset":4064,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4172,"endOffset":4511,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4628,"endOffset":5440,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5490,"endOffset":6302,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6414,"endOffset":6478,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6521,"endOffset":6585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6627,"endOffset":6757,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6803,"endOffset":6899,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6942,"endOffset":7536,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7644,"endOffset":8238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8285,"endOffset":8349,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1093","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_object_enho.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1008,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":846,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":217,"endOffset":347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":393,"endOffset":489,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":583,"endOffset":715,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":762,"endOffset":822,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1094","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_object_enhs.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1135,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":973,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":217,"endOffset":347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":393,"endOffset":489,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":541,"endOffset":606,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":700,"endOffset":832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":884,"endOffset":949,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1095","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_object_filter.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1226,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75,"endOffset":1056,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":223,"endOffset":1032,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1096","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_objects.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9798,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":63,"endOffset":759,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":150,"endOffset":678,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1097","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_oo_object_fnc.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20993,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75,"endOffset":17895,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":149,"endOffset":474,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":620,"endOffset":717,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":763,"endOffset":859,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":908,"endOffset":1667,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1716,"endOffset":1759,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1859,"endOffset":2032,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2088,"endOffset":2155,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2215,"endOffset":2282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2333,"endOffset":2400,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2457,"endOffset":2524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2570,"endOffset":2666,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2769,"endOffset":2942,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2987,"endOffset":3270,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3316,"endOffset":3412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3520,"endOffset":3620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3668,"endOffset":3731,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3778,"endOffset":3867,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3911,"endOffset":3953,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4057,"endOffset":4230,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4281,"endOffset":4956,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5064,"endOffset":5237,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5288,"endOffset":6060,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6168,"endOffset":6762,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6866,"endOffset":6964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7010,"endOffset":7106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7148,"endOffset":7278,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7385,"endOffset":7733,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7774,"endOffset":7821,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7871,"endOffset":7919,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7966,"endOffset":8055,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8107,"endOffset":8204,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8308,"endOffset":8355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8405,"endOffset":8453,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8500,"endOffset":8589,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8691,"endOffset":9109,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9159,"endOffset":9257,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9351,"endOffset":9448,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9498,"endOffset":9671,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9773,"endOffset":10056,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10104,"endOffset":10277,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10320,"endOffset":10389,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10496,"endOffset":10593,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10711,"endOffset":10769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10817,"endOffset":10990,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11116,"endOffset":11975,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12027,"endOffset":12200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12305,"endOffset":12368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12417,"endOffset":12517,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12564,"endOffset":12653,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12758,"endOffset":13106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13147,"endOffset":13194,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13244,"endOffset":13292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13339,"endOffset":13428,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13530,"endOffset":13628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13670,"endOffset":13802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13852,"endOffset":13982,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14093,"endOffset":14768,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14818,"endOffset":14918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14965,"endOffset":15054,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15169,"endOffset":15941,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15991,"endOffset":16091,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16138,"endOffset":16227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16327,"endOffset":16500,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16607,"endOffset":16707,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16755,"endOffset":16855,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16962,"endOffset":17721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17771,"endOffset":17871,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1098","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persist_repo.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":24454,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":24288,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":211,"endOffset":310,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":352,"endOffset":416,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":466,"endOffset":530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":575,"endOffset":677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":728,"endOffset":792,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":838,"endOffset":934,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":980,"endOffset":1077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1127,"endOffset":3076,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3167,"endOffset":3266,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3357,"endOffset":3454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3496,"endOffset":3595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3686,"endOffset":8297,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8396,"endOffset":13007,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13050,"endOffset":13368,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13458,"endOffset":13514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13556,"endOffset":13655,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13745,"endOffset":18141,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18183,"endOffset":18282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18382,"endOffset":18481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18524,"endOffset":22832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22882,"endOffset":24264,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1099","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persist_repo_cs.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1195,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":79,"endOffset":1017,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":220,"endOffset":319,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":365,"endOffset":467,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":558,"endOffset":657,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":750,"endOffset":852,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":894,"endOffset":993,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1100","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persist_settings.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":775,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":81,"endOffset":593,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":227,"endOffset":351,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":445,"endOffset":569,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1101","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persist_user.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12763,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":12254,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":233,"endOffset":330,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":443,"endOffset":507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":622,"endOffset":686,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":796,"endOffset":893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":997,"endOffset":1315,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1415,"endOffset":1512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1617,"endOffset":1714,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1824,"endOffset":1888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1930,"endOffset":2028,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2140,"endOffset":2204,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2246,"endOffset":2344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2458,"endOffset":2522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2564,"endOffset":2662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2763,"endOffset":2827,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2869,"endOffset":2967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3065,"endOffset":3164,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3265,"endOffset":3362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3409,"endOffset":3508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3621,"endOffset":3685,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3800,"endOffset":3864,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3972,"endOffset":4070,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4114,"endOffset":4178,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4285,"endOffset":4383,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4430,"endOffset":4494,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4604,"endOffset":4702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4748,"endOffset":4812,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4911,"endOffset":5009,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5053,"endOffset":5117,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5215,"endOffset":5314,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5427,"endOffset":5524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5626,"endOffset":5690,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5792,"endOffset":5856,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5903,"endOffset":5967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6085,"endOffset":6182,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6300,"endOffset":6397,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6452,"endOffset":6549,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6655,"endOffset":6752,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6858,"endOffset":6955,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7004,"endOffset":7101,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7214,"endOffset":7311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7416,"endOffset":7515,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7618,"endOffset":7715,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7823,"endOffset":7920,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8027,"endOffset":9346,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9453,"endOffset":10772,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10884,"endOffset":11501,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11613,"endOffset":12230,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1102","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persistence.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":21628,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":149,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1103","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_popups.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16295,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":61,"endOffset":15090,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":146,"endOffset":210,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":367,"endOffset":426,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":474,"endOffset":538,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":650,"endOffset":714,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":833,"endOffset":897,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":940,"endOffset":1004,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1049,"endOffset":1146,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1251,"endOffset":1868,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1910,"endOffset":1974,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2027,"endOffset":2091,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2145,"endOffset":2242,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2292,"endOffset":2398,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2446,"endOffset":2543,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2642,"endOffset":3674,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3716,"endOffset":3780,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3885,"endOffset":6053,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6100,"endOffset":6164,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6214,"endOffset":6278,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6382,"endOffset":6475,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6522,"endOffset":6564,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6616,"endOffset":6658,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6710,"endOffset":6752,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6804,"endOffset":6897,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6949,"endOffset":6991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7043,"endOffset":7136,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7189,"endOffset":7282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7342,"endOffset":7435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7552,"endOffset":8581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8626,"endOffset":8723,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8850,"endOffset":9198,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9254,"endOffset":9324,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9438,"endOffset":9508,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9619,"endOffset":9739,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9783,"endOffset":9841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9891,"endOffset":9933,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9984,"endOffset":10044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10093,"endOffset":10153,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10202,"endOffset":10262,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10309,"endOffset":10369,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10423,"endOffset":10520,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10577,"endOffset":10674,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10727,"endOffset":10792,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10849,"endOffset":10891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10948,"endOffset":11688,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11743,"endOffset":12018,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12061,"endOffset":12181,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12295,"endOffset":12387,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12440,"endOffset":12736,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12796,"endOffset":12893,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13007,"endOffset":13568,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13616,"endOffset":13680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13724,"endOffset":13784,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13839,"endOffset":13882,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14001,"endOffset":14562,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14672,"endOffset":14736,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14781,"endOffset":14845,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14970,"endOffset":15066,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1104","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_pr_enum_provider.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3918,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":81,"endOffset":1478,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":236,"endOffset":1454,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1105","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_progress.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":731,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":65,"endOffset":581,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":208,"endOffset":268,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":311,"endOffset":353,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":449,"endOffset":509,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1106","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20471,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":57,"endOffset":20337,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":131,"endOffset":4527,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4672,"endOffset":4771,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4865,"endOffset":4929,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5028,"endOffset":5125,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5225,"endOffset":5321,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5429,"endOffset":6584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6686,"endOffset":8098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8140,"endOffset":8258,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8307,"endOffset":8445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8548,"endOffset":9433,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9482,"endOffset":9620,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9671,"endOffset":9768,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9867,"endOffset":9964,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10011,"endOffset":10108,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10216,"endOffset":10346,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10454,"endOffset":10584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10683,"endOffset":15245,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15287,"endOffset":15405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15511,"endOffset":20073,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20173,"endOffset":20313,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1107","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo_checksums.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3259,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":77,"endOffset":3085,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":221,"endOffset":1489,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1602,"endOffset":2255,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2408,"endOffset":3061,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1108","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo_listener.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6300,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75,"endOffset":6130,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":224,"endOffset":323,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":366,"endOffset":4674,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4724,"endOffset":6106,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1109","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo_online.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3897,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":3735,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":213,"endOffset":311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":416,"endOffset":522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":614,"endOffset":712,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":818,"endOffset":924,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1040,"endOffset":1142,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1246,"endOffset":1348,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1458,"endOffset":1560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1658,"endOffset":1756,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1801,"endOffset":1907,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1955,"endOffset":2052,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2168,"endOffset":2278,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2371,"endOffset":3174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3218,"endOffset":3336,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3435,"endOffset":3499,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3542,"endOffset":3644,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1110","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo_srv.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9005,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":65,"endOffset":7805,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":256,"endOffset":376,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":465,"endOffset":585,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":627,"endOffset":726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":834,"endOffset":931,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":973,"endOffset":1037,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1090,"endOffset":1186,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1276,"endOffset":1612,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1712,"endOffset":2048,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2145,"endOffset":2265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2307,"endOffset":2371,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2417,"endOffset":2513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2564,"endOffset":2628,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2673,"endOffset":2737,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2786,"endOffset":2883,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2936,"endOffset":3033,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3129,"endOffset":3249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3291,"endOffset":3355,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3405,"endOffset":3469,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3520,"endOffset":3584,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3630,"endOffset":3726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3777,"endOffset":3841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3886,"endOffset":3950,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3999,"endOffset":4096,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4149,"endOffset":4246,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4336,"endOffset":4454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4497,"endOffset":4617,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4662,"endOffset":5345,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5450,"endOffset":5546,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5595,"endOffset":5692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5741,"endOffset":5838,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5935,"endOffset":5999,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6048,"endOffset":6145,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6255,"endOffset":6351,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6400,"endOffset":6497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6540,"endOffset":6660,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6705,"endOffset":6769,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6871,"endOffset":6935,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6978,"endOffset":7098,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7143,"endOffset":7207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7309,"endOffset":7781,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1111","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_sap_namespace.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":892,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75,"endOffset":722,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":216,"endOffset":313,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":361,"endOffset":409,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":505,"endOffset":602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":650,"endOffset":698,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1112","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_sap_package.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4451,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":3946,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":274,"endOffset":1303,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1462,"endOffset":1779,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1883,"endOffset":2200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2301,"endOffset":2349,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2458,"endOffset":2522,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2631,"endOffset":2721,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2820,"endOffset":2916,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3008,"endOffset":3105,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3242,"endOffset":3339,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3453,"endOffset":3749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3865,"endOffset":3922,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1113","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_sap_report.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6232,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":5926,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":218,"endOffset":581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":624,"endOffset":718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":762,"endOffset":818,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":861,"endOffset":1455,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1554,"endOffset":1648,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1693,"endOffset":1813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1857,"endOffset":1913,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1964,"endOffset":2006,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2059,"endOffset":2101,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2147,"endOffset":2243,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2289,"endOffset":2402,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2445,"endOffset":3039,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3141,"endOffset":3238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3281,"endOffset":3375,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3420,"endOffset":3540,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3584,"endOffset":3640,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3691,"endOffset":3733,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3786,"endOffset":3828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3874,"endOffset":3970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4016,"endOffset":4129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4172,"endOffset":4766,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4865,"endOffset":4959,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5009,"endOffset":5106,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5152,"endOffset":5265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5308,"endOffset":5902,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1114","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_services_git.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1222,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73,"endOffset":151,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1115","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_services_repo.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1294,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75,"endOffset":153,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1116","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_stage_logic.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4433,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":71,"endOffset":4271,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":211,"endOffset":3887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3930,"endOffset":4060,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4109,"endOffset":4247,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1117","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_tadir.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3306,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":59,"endOffset":3168,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":217,"endOffset":265,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":309,"endOffset":356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":401,"endOffset":448,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":495,"endOffset":543,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":634,"endOffset":1443,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1489,"endOffset":1537,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1594,"endOffset":1691,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1748,"endOffset":1845,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1887,"endOffset":2017,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2059,"endOffset":2177,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2275,"endOffset":2866,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2910,"endOffset":2957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3002,"endOffset":3049,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3096,"endOffset":3144,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1118","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_version.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":939,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":63,"endOffset":440,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":143,"endOffset":207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":295,"endOffset":359,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1119","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_xml_input.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1124,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":67,"endOffset":970,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":207,"endOffset":249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":292,"endOffset":335,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":427,"endOffset":547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":649,"endOffset":946,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1120","url":"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_xml_output.intf.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1667,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":69,"endOffset":1509,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":208,"endOffset":250,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":293,"endOffset":336,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":428,"endOffset":546,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":639,"endOffset":681,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":723,"endOffset":841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":932,"endOffset":996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1044,"endOffset":1141,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1188,"endOffset":1485,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1121","url":"file:///home/runner/work/abapGit/abapGit/output/zw3mi.fugr.wwwdata_export.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":709,"count":1}],"isBlockCoverage":true},{"functionName":"wwwdata_export","ranges":[{"startOffset":88,"endOffset":597,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1122","url":"file:///home/runner/work/abapGit/abapGit/output/zw3mi.fugr.wwwdata_import.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1975,"count":1}],"isBlockCoverage":true},{"functionName":"wwwdata_import","ranges":[{"startOffset":88,"endOffset":1863,"count":1},{"startOffset":285,"endOffset":478,"count":0},{"startOffset":1360,"endOffset":1744,"count":117},{"startOffset":1526,"endOffset":1583,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1123","url":"file:///home/runner/work/abapGit/abapGit/output/zw3mi.fugr.wwwparams_insert.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":445,"count":1}],"isBlockCoverage":true},{"functionName":"wwwparams_insert","ranges":[{"startOffset":90,"endOffset":327,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1124","url":"file:///home/runner/work/abapGit/abapGit/output/zw3mi.fugr.wwwparams_read.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1466,"count":1}],"isBlockCoverage":true},{"functionName":"wwwparams_read","ranges":[{"startOffset":88,"endOffset":1354,"count":1},{"startOffset":446,"endOffset":498,"count":0},{"startOffset":1154,"endOffset":1284,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1125","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_lxe_texts.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":76559,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":121,"endOffset":15493,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":327,"endOffset":635,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":731,"endOffset":957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1045,"endOffset":1175,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1259,"endOffset":1391,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1474,"endOffset":1604,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1686,"endOffset":1820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1903,"endOffset":2002,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2163,"endOffset":2227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2277,"endOffset":2324,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2374,"endOffset":2422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2530,"endOffset":2577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2627,"endOffset":2675,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2785,"endOffset":2849,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2899,"endOffset":2946,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2996,"endOffset":3044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3156,"endOffset":3203,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3253,"endOffset":3301,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3400,"endOffset":3499,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3541,"endOffset":3630,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3739,"endOffset":3800,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3850,"endOffset":3947,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3997,"endOffset":4095,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4216,"endOffset":5064,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5109,"endOffset":5208,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5253,"endOffset":5352,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5398,"endOffset":5497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5543,"endOffset":5640,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5686,"endOffset":5786,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5834,"endOffset":5931,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6045,"endOffset":6144,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6189,"endOffset":6288,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6334,"endOffset":6433,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6479,"endOffset":6576,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6622,"endOffset":6722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6767,"endOffset":7615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7722,"endOffset":9387,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9437,"endOffset":9484,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9534,"endOffset":9582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9688,"endOffset":9777,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9821,"endOffset":9919,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10018,"endOffset":10107,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10154,"endOffset":10253,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10372,"endOffset":10680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10728,"endOffset":11036,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11087,"endOffset":11395,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11442,"endOffset":11750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11928,"endOffset":12236,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12288,"endOffset":12377,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12430,"endOffset":12738,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12852,"endOffset":13160,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13279,"endOffset":13587,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13631,"endOffset":13695,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13752,"endOffset":13841,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13956,"endOffset":14020,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14068,"endOffset":14376,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14507,"endOffset":14815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14863,"endOffset":15171,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15275,"endOffset":15372,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15422,"endOffset":15469,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_lxe_texts","ranges":[{"startOffset":15497,"endOffset":16367,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":16370,"endOffset":16483,"count":0}],"isBlockCoverage":false},{"functionName":"check_langs_versus_installed","ranges":[{"startOffset":16486,"endOffset":16603,"count":0}],"isBlockCoverage":false},{"functionName":"check_langs_versus_installed","ranges":[{"startOffset":16613,"endOffset":19449,"count":1},{"startOffset":18846,"endOffset":19445,"count":5},{"startOffset":19259,"endOffset":19348,"count":3},{"startOffset":19348,"endOffset":19439,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":18945,"endOffset":19004,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":19035,"endOffset":19063,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":19452,"endOffset":19537,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":19547,"endOffset":21041,"count":1}],"isBlockCoverage":true},{"functionName":"convert_lang_string_to_table","ranges":[{"startOffset":21044,"endOffset":21161,"count":0}],"isBlockCoverage":false},{"functionName":"convert_lang_string_to_table","ranges":[{"startOffset":21171,"endOffset":23466,"count":7},{"startOffset":21819,"endOffset":21876,"count":3},{"startOffset":22517,"endOffset":22623,"count":1},{"startOffset":22623,"endOffset":22804,"count":6},{"startOffset":22804,"endOffset":23011,"count":22},{"startOffset":23011,"endOffset":23075,"count":6},{"startOffset":23075,"endOffset":23321,"count":2},{"startOffset":23321,"endOffset":23465,"count":6}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":23243,"endOffset":23312,"count":6}],"isBlockCoverage":true},{"functionName":"convert_table_to_lang_string","ranges":[{"startOffset":23469,"endOffset":23586,"count":0}],"isBlockCoverage":false},{"functionName":"convert_table_to_lang_string","ranges":[{"startOffset":23596,"endOffset":25214,"count":2},{"startOffset":24664,"endOffset":25048,"count":3},{"startOffset":24781,"endOffset":24952,"count":1},{"startOffset":24952,"endOffset":25048,"count":2}],"isBlockCoverage":true},{"functionName":"deserialize_from_po","ranges":[{"startOffset":25217,"endOffset":29199,"count":0}],"isBlockCoverage":false},{"functionName":"deserialize_xml","ranges":[{"startOffset":29202,"endOffset":34629,"count":0}],"isBlockCoverage":false},{"functionName":"detect_unsupported_languages","ranges":[{"startOffset":34632,"endOffset":34749,"count":0}],"isBlockCoverage":false},{"functionName":"detect_unsupported_languages","ranges":[{"startOffset":34759,"endOffset":35734,"count":0}],"isBlockCoverage":false},{"functionName":"get_installed_languages","ranges":[{"startOffset":35737,"endOffset":35834,"count":0}],"isBlockCoverage":false},{"functionName":"get_installed_languages","ranges":[{"startOffset":35844,"endOffset":39404,"count":0}],"isBlockCoverage":false},{"functionName":"get_lang_iso4","ranges":[{"startOffset":39409,"endOffset":40815,"count":0}],"isBlockCoverage":false},{"functionName":"get_lxe_object_list","ranges":[{"startOffset":40822,"endOffset":42673,"count":0}],"isBlockCoverage":false},{"functionName":"get_translation_languages","ranges":[{"startOffset":42682,"endOffset":42805,"count":0}],"isBlockCoverage":false},{"functionName":"get_translation_languages","ranges":[{"startOffset":42821,"endOffset":45042,"count":0}],"isBlockCoverage":false},{"functionName":"iso4_to_iso2","ranges":[{"startOffset":45051,"endOffset":45148,"count":0}],"isBlockCoverage":false},{"functionName":"iso4_to_iso2","ranges":[{"startOffset":45164,"endOffset":45592,"count":0}],"isBlockCoverage":false},{"functionName":"is_object_supported","ranges":[{"startOffset":45601,"endOffset":45712,"count":0}],"isBlockCoverage":false},{"functionName":"is_object_supported","ranges":[{"startOffset":45728,"endOffset":46514,"count":0}],"isBlockCoverage":false},{"functionName":"langu_to_laiso_safe","ranges":[{"startOffset":46523,"endOffset":46634,"count":0}],"isBlockCoverage":false},{"functionName":"langu_to_laiso_safe","ranges":[{"startOffset":46650,"endOffset":47816,"count":2},{"startOffset":47147,"endOffset":47487,"count":0},{"startOffset":47583,"endOffset":47775,"count":0}],"isBlockCoverage":true},{"functionName":"read_lxe_object_text_pair","ranges":[{"startOffset":47827,"endOffset":51790,"count":0}],"isBlockCoverage":false},{"functionName":"read_text_items","ranges":[{"startOffset":51801,"endOffset":57690,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_as_po","ranges":[{"startOffset":57701,"endOffset":62544,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_xml","ranges":[{"startOffset":62555,"endOffset":65289,"count":0}],"isBlockCoverage":false},{"functionName":"write_lxe_object_text_pair","ranges":[{"startOffset":65300,"endOffset":68921,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_lxe_texts$deserialize","ranges":[{"startOffset":68932,"endOffset":70629,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_lxe_texts$serialize","ranges":[{"startOffset":70640,"endOffset":72332,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1126","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_abap.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":29877,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":264,"endOffset":2296,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":432,"endOffset":684,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":763,"endOffset":1015,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1096,"endOffset":1297,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1378,"endOffset":1630,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1836,"endOffset":1933,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1977,"endOffset":2041,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_syntax_abap","ranges":[{"startOffset":2300,"endOffset":2610,"count":12}],"isBlockCoverage":true},{"functionName":"class_constructor","ranges":[{"startOffset":2613,"endOffset":2700,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":2710,"endOffset":2773,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2776,"endOffset":3435,"count":12}],"isBlockCoverage":true},{"functionName":"init_keywords","ranges":[{"startOffset":3438,"endOffset":3517,"count":0}],"isBlockCoverage":false},{"functionName":"init_keywords","ranges":[{"startOffset":3527,"endOffset":19099,"count":1}],"isBlockCoverage":true},{"functionName":"is_keyword","ranges":[{"startOffset":19102,"endOffset":19185,"count":48}],"isBlockCoverage":true},{"functionName":"is_keyword","ranges":[{"startOffset":19195,"endOffset":19995,"count":48}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":19654,"endOffset":19708,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":19737,"endOffset":19765,"count":0}],"isBlockCoverage":false},{"functionName":"order_matches","ranges":[{"startOffset":19998,"endOffset":25825,"count":11},{"startOffset":22474,"endOffset":25821,"count":49},{"startOffset":22648,"endOffset":22736,"count":13},{"startOffset":22738,"endOffset":22841,"count":1},{"startOffset":22841,"endOffset":22975,"count":48},{"startOffset":22975,"endOffset":23405,"count":20},{"startOffset":23065,"endOffset":23286,"count":14},{"startOffset":23288,"endOffset":23397,"count":2},{"startOffset":23405,"endOffset":25689,"count":28},{"startOffset":23490,"endOffset":23744,"count":4},{"startOffset":23744,"endOffset":25689,"count":24},{"startOffset":24061,"endOffset":25681,"count":12},{"startOffset":24151,"endOffset":24376,"count":5},{"startOffset":24376,"endOffset":25573,"count":7},{"startOffset":24468,"endOffset":24553,"count":4},{"startOffset":24555,"endOffset":24908,"count":1},{"startOffset":24908,"endOffset":25573,"count":6},{"startOffset":25002,"endOffset":25573,"count":3},{"startOffset":25689,"endOffset":25821,"count":30}],"isBlockCoverage":true},{"functionName":"parse_line","ranges":[{"startOffset":25828,"endOffset":28064,"count":11},{"startOffset":27664,"endOffset":28037,"count":48},{"startOffset":27946,"endOffset":28031,"count":19}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":27498,"endOffset":27592,"count":76}],"isBlockCoverage":true}]},{"scriptId":"1127","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_css.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":44091,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":262,"endOffset":4080,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":429,"endOffset":902,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":986,"endOffset":1083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1162,"endOffset":1967,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2048,"endOffset":2649,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2730,"endOffset":3104,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3320,"endOffset":3384,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3428,"endOffset":3525,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3620,"endOffset":3717,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3761,"endOffset":3825,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_syntax_css","ranges":[{"startOffset":4084,"endOffset":4447,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":4450,"endOffset":4536,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":4546,"endOffset":4609,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4612,"endOffset":7006,"count":0}],"isBlockCoverage":false},{"functionName":"init_keywords","ranges":[{"startOffset":7009,"endOffset":7087,"count":0}],"isBlockCoverage":false},{"functionName":"init_keywords","ranges":[{"startOffset":7097,"endOffset":26959,"count":1}],"isBlockCoverage":true},{"functionName":"insert_keywords","ranges":[{"startOffset":26962,"endOffset":27054,"count":0}],"isBlockCoverage":false},{"functionName":"insert_keywords","ranges":[{"startOffset":27064,"endOffset":28506,"count":8},{"startOffset":28217,"endOffset":28502,"count":882}],"isBlockCoverage":true},{"functionName":"is_keyword","ranges":[{"startOffset":28509,"endOffset":28591,"count":0}],"isBlockCoverage":false},{"functionName":"is_keyword","ranges":[{"startOffset":28601,"endOffset":29418,"count":0}],"isBlockCoverage":false},{"functionName":"order_matches","ranges":[{"startOffset":29421,"endOffset":36862,"count":0}],"isBlockCoverage":false},{"functionName":"parse_line","ranges":[{"startOffset":36865,"endOffset":39190,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1128","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_js.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":25074,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":260,"endOffset":3107,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":426,"endOffset":896,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":980,"endOffset":1077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1156,"endOffset":1471,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1552,"endOffset":1799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1880,"endOffset":2132,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2348,"endOffset":2412,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2456,"endOffset":2552,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2647,"endOffset":2744,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2788,"endOffset":2852,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_syntax_js","ranges":[{"startOffset":3111,"endOffset":3469,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":3472,"endOffset":3557,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":3567,"endOffset":3630,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3633,"endOffset":4521,"count":0}],"isBlockCoverage":false},{"functionName":"init_keywords","ranges":[{"startOffset":4524,"endOffset":4601,"count":0}],"isBlockCoverage":false},{"functionName":"init_keywords","ranges":[{"startOffset":4611,"endOffset":9772,"count":1}],"isBlockCoverage":true},{"functionName":"insert_keywords","ranges":[{"startOffset":9775,"endOffset":9866,"count":0}],"isBlockCoverage":false},{"functionName":"insert_keywords","ranges":[{"startOffset":9876,"endOffset":11313,"count":2},{"startOffset":11025,"endOffset":11309,"count":369}],"isBlockCoverage":true},{"functionName":"is_keyword","ranges":[{"startOffset":11316,"endOffset":11397,"count":0}],"isBlockCoverage":false},{"functionName":"is_keyword","ranges":[{"startOffset":11407,"endOffset":12223,"count":0}],"isBlockCoverage":false},{"functionName":"order_matches","ranges":[{"startOffset":12226,"endOffset":19978,"count":0}],"isBlockCoverage":false},{"functionName":"parse_line","ranges":[{"startOffset":19981,"endOffset":22304,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1129","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":49864,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":111,"endOffset":6570,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":296,"endOffset":406,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":489,"endOffset":553,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":640,"endOffset":737,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":820,"endOffset":1078,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1165,"endOffset":1225,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1330,"endOffset":1394,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1498,"endOffset":1787,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1888,"endOffset":2091,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":2244,"endOffset":2944,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":2987,"endOffset":3051,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":3149,"endOffset":4329,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":4372,"endOffset":4436,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":4482,"endOffset":5182,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5340,"endOffset":5460,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5512,"endOffset":5555,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5644,"endOffset":5708,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5751,"endOffset":5815,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5858,"endOffset":5922,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5966,"endOffset":6030,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":6076,"endOffset":6140,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":6234,"endOffset":6298,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":6339,"endOffset":6403,"count":2}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":6449,"endOffset":6546,"count":2}],"isBlockCoverage":true},{"functionName":"zcl_abapgit_html","ranges":[{"startOffset":6574,"endOffset":7509,"count":21}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":7512,"endOffset":7625,"count":21},{"startOffset":7568,"endOffset":7604,"count":0}],"isBlockCoverage":true},{"functionName":"checkbox","ranges":[{"startOffset":7628,"endOffset":7700,"count":0}],"isBlockCoverage":false},{"functionName":"checkbox","ranges":[{"startOffset":7710,"endOffset":8695,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":8698,"endOffset":8778,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":8788,"endOffset":9524,"count":1}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":9527,"endOffset":9595,"count":1}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":9605,"endOffset":10156,"count":6},{"startOffset":9825,"endOffset":9850,"count":4},{"startOffset":9852,"endOffset":9896,"count":4},{"startOffset":10039,"endOffset":10128,"count":4}],"isBlockCoverage":true},{"functionName":"icon","ranges":[{"startOffset":10159,"endOffset":10223,"count":0}],"isBlockCoverage":false},{"functionName":"icon","ranges":[{"startOffset":10233,"endOffset":12784,"count":0}],"isBlockCoverage":false},{"functionName":"indent_line","ranges":[{"startOffset":12787,"endOffset":17748,"count":85},{"startOffset":15133,"endOffset":15222,"count":0},{"startOffset":15304,"endOffset":15394,"count":0},{"startOffset":15479,"endOffset":15500,"count":0},{"startOffset":15650,"endOffset":15720,"count":84},{"startOffset":15721,"endOffset":15789,"count":83},{"startOffset":15791,"endOffset":15867,"count":25},{"startOffset":15869,"endOffset":16141,"count":25},{"startOffset":16141,"endOffset":16233,"count":60},{"startOffset":16342,"endOffset":16477,"count":0},{"startOffset":16542,"endOffset":16677,"count":1},{"startOffset":16677,"endOffset":17050,"count":84},{"startOffset":16802,"endOffset":17050,"count":1},{"startOffset":17126,"endOffset":17744,"count":50},{"startOffset":17205,"endOffset":17538,"count":25}],"isBlockCoverage":true},{"functionName":"study_line","ranges":[{"startOffset":17751,"endOffset":24198,"count":85},{"startOffset":20333,"endOffset":21560,"count":5},{"startOffset":20413,"endOffset":20472,"count":0},{"startOffset":20473,"endOffset":20568,"count":0},{"startOffset":20570,"endOffset":20645,"count":0},{"startOffset":20786,"endOffset":20880,"count":4},{"startOffset":20882,"endOffset":20956,"count":1},{"startOffset":21204,"endOffset":21282,"count":1},{"startOffset":21560,"endOffset":23332,"count":80},{"startOffset":21635,"endOffset":21729,"count":45},{"startOffset":21731,"endOffset":22015,"count":0},{"startOffset":22083,"endOffset":22176,"count":45},{"startOffset":22178,"endOffset":22460,"count":1},{"startOffset":22619,"endOffset":22691,"count":23},{"startOffset":23032,"endOffset":23171,"count":48},{"startOffset":23415,"endOffset":23475,"count":0},{"startOffset":23476,"endOffset":23575,"count":0},{"startOffset":23577,"endOffset":23650,"count":0},{"startOffset":23795,"endOffset":23891,"count":38},{"startOffset":23893,"endOffset":24172,"count":1},{"startOffset":24090,"endOffset":24166,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_html$a","ranges":[{"startOffset":24201,"endOffset":29760,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html$add","ranges":[{"startOffset":29763,"endOffset":32982,"count":89},{"startOffset":30995,"endOffset":31062,"count":36},{"startOffset":31064,"endOffset":31145,"count":85},{"startOffset":31145,"endOffset":32932,"count":4},{"startOffset":31221,"endOffset":31387,"count":0},{"startOffset":31603,"endOffset":32698,"count":2},{"startOffset":31924,"endOffset":32644,"count":1},{"startOffset":32063,"endOffset":32199,"count":0},{"startOffset":32588,"endOffset":32632,"count":0},{"startOffset":32654,"endOffset":32690,"count":0},{"startOffset":32806,"endOffset":32932,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_html$add_a","ranges":[{"startOffset":32985,"endOffset":34700,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html$add_checkbox","ranges":[{"startOffset":34703,"endOffset":35330,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html$add_icon","ranges":[{"startOffset":35333,"endOffset":36233,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html$icon","ranges":[{"startOffset":36236,"endOffset":37015,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html$is_empty","ranges":[{"startOffset":37018,"endOffset":37305,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html$render","ranges":[{"startOffset":37308,"endOffset":39316,"count":13},{"startOffset":37541,"endOffset":37568,"count":0},{"startOffset":37570,"endOffset":37621,"count":0},{"startOffset":38927,"endOffset":39147,"count":85}],"isBlockCoverage":true},{"functionName":"zif_abapgit_html$set_title","ranges":[{"startOffset":39319,"endOffset":39724,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_html$td","ranges":[{"startOffset":39727,"endOffset":41237,"count":8},{"startOffset":40190,"endOffset":40225,"count":6},{"startOffset":40322,"endOffset":40347,"count":0},{"startOffset":40450,"endOffset":40481,"count":6},{"startOffset":40582,"endOffset":40611,"count":0},{"startOffset":40773,"endOffset":40830,"count":1},{"startOffset":40905,"endOffset":40954,"count":7}],"isBlockCoverage":true},{"functionName":"zif_abapgit_html$th","ranges":[{"startOffset":41240,"endOffset":42750,"count":5},{"startOffset":41703,"endOffset":41738,"count":0},{"startOffset":41835,"endOffset":41860,"count":0},{"startOffset":41963,"endOffset":41994,"count":0},{"startOffset":42095,"endOffset":42124,"count":0},{"startOffset":42286,"endOffset":42343,"count":1},{"startOffset":42418,"endOffset":42467,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_html$wrap","ranges":[{"startOffset":42753,"endOffset":46177,"count":18},{"startOffset":43146,"endOffset":43181,"count":16},{"startOffset":43344,"endOffset":43379,"count":14},{"startOffset":43476,"endOffset":43501,"count":14},{"startOffset":43604,"endOffset":43635,"count":14},{"startOffset":43736,"endOffset":43765,"count":14},{"startOffset":43927,"endOffset":43984,"count":14},{"startOffset":44059,"endOffset":44109,"count":4},{"startOffset":44506,"endOffset":44602,"count":1},{"startOffset":44653,"endOffset":44758,"count":7},{"startOffset":44808,"endOffset":44912,"count":1},{"startOffset":45241,"endOffset":45276,"count":16},{"startOffset":45278,"endOffset":45400,"count":2},{"startOffset":45472,"endOffset":45517,"count":12},{"startOffset":45519,"endOffset":45660,"count":10},{"startOffset":45660,"endOffset":46127,"count":8},{"startOffset":45786,"endOffset":45860,"count":2},{"startOffset":45860,"endOffset":45988,"count":6},{"startOffset":45914,"endOffset":45988,"count":4},{"startOffset":46045,"endOffset":46121,"count":6}],"isBlockCoverage":true}]},{"scriptId":"1130","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_chunk_lib.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":135944,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":129,"endOffset":21991,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":300,"endOffset":395,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":547,"endOffset":611,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":655,"endOffset":703,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":747,"endOffset":795,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":922,"endOffset":986,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1037,"endOffset":1111,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1224,"endOffset":1344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1394,"endOffset":1524,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1684,"endOffset":1804,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1848,"endOffset":1974,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2018,"endOffset":2082,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2132,"endOffset":2196,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2297,"endOffset":2417,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2460,"endOffset":2576,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2627,"endOffset":2724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2774,"endOffset":2871,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2921,"endOffset":3018,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3066,"endOffset":3163,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3220,"endOffset":3317,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3360,"endOffset":3476,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3579,"endOffset":3643,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3688,"endOffset":3777,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3822,"endOffset":3911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4019,"endOffset":4139,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4236,"endOffset":4356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4399,"endOffset":4515,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4620,"endOffset":4740,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4786,"endOffset":4828,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4869,"endOffset":4911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5021,"endOffset":5141,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5185,"endOffset":5311,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5425,"endOffset":5545,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5592,"endOffset":6526,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6573,"endOffset":6637,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6692,"endOffset":6789,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6896,"endOffset":7016,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7059,"endOffset":7123,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7225,"endOffset":7345,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7390,"endOffset":7454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7498,"endOffset":7562,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7605,"endOffset":7702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7745,"endOffset":7809,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7858,"endOffset":7955,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8001,"endOffset":8121,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8227,"endOffset":8347,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8391,"endOffset":8709,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8814,"endOffset":8934,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8979,"endOffset":9043,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9145,"endOffset":9277,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9375,"endOffset":9507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9605,"endOffset":9737,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9839,"endOffset":9971,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10013,"endOffset":10077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10184,"endOffset":10316,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10358,"endOffset":10457,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10499,"endOffset":10563,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10667,"endOffset":10787,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10832,"endOffset":10896,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10943,"endOffset":11042,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11085,"endOffset":11215,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11265,"endOffset":11362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11463,"endOffset":11583,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11625,"endOffset":11723,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11788,"endOffset":11887,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11992,"endOffset":12112,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12158,"endOffset":12254,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12304,"endOffset":12401,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12454,"endOffset":12551,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12653,"endOffset":12773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12820,"endOffset":12914,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12964,"endOffset":13061,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13109,"endOffset":13206,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13259,"endOffset":13356,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13458,"endOffset":13578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13626,"endOffset":13718,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13768,"endOffset":13865,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13913,"endOffset":14010,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14113,"endOffset":14233,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14282,"endOffset":14385,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14482,"endOffset":14602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14645,"endOffset":14709,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14759,"endOffset":14856,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14962,"endOffset":15026,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15074,"endOffset":15167,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15270,"endOffset":15390,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15433,"endOffset":15497,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15541,"endOffset":15605,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15649,"endOffset":15713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15762,"endOffset":15826,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15874,"endOffset":15971,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16078,"endOffset":16142,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16189,"endOffset":16253,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16302,"endOffset":16362,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16465,"endOffset":16529,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16574,"endOffset":16832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16883,"endOffset":17011,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17066,"endOffset":17130,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17232,"endOffset":17296,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17347,"endOffset":17411,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17510,"endOffset":17574,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":17617,"endOffset":19689,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19788,"endOffset":19852,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19895,"endOffset":21967,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_gui_chunk_lib","ranges":[{"startOffset":21995,"endOffset":22144,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":22147,"endOffset":22260,"count":2},{"startOffset":22203,"endOffset":22239,"count":0}],"isBlockCoverage":true},{"functionName":"advanced_submenu","ranges":[{"startOffset":22263,"endOffset":22350,"count":0}],"isBlockCoverage":false},{"functionName":"advanced_submenu","ranges":[{"startOffset":22360,"endOffset":24109,"count":0}],"isBlockCoverage":false},{"functionName":"back_toolbar","ranges":[{"startOffset":24112,"endOffset":24191,"count":0}],"isBlockCoverage":false},{"functionName":"back_toolbar","ranges":[{"startOffset":24201,"endOffset":24704,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":24707,"endOffset":24796,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":24806,"endOffset":26860,"count":1},{"startOffset":25046,"endOffset":25117,"count":0},{"startOffset":25119,"endOffset":25170,"count":0},{"startOffset":25236,"endOffset":25307,"count":0},{"startOffset":25466,"endOffset":25518,"count":0},{"startOffset":25676,"endOffset":25802,"count":0},{"startOffset":26023,"endOffset":26093,"count":0},{"startOffset":26095,"endOffset":26145,"count":0},{"startOffset":26219,"endOffset":26289,"count":0},{"startOffset":26472,"endOffset":26800,"count":0},{"startOffset":26810,"endOffset":26846,"count":0}],"isBlockCoverage":true},{"functionName":"get_item_icon","ranges":[{"startOffset":26865,"endOffset":26960,"count":0}],"isBlockCoverage":false},{"functionName":"get_item_icon","ranges":[{"startOffset":26972,"endOffset":31073,"count":0}],"isBlockCoverage":false},{"functionName":"get_item_link","ranges":[{"startOffset":31078,"endOffset":31173,"count":0}],"isBlockCoverage":false},{"functionName":"get_item_link","ranges":[{"startOffset":31185,"endOffset":34241,"count":0}],"isBlockCoverage":false},{"functionName":"get_t100_text","ranges":[{"startOffset":34246,"endOffset":34341,"count":0}],"isBlockCoverage":false},{"functionName":"get_t100_text","ranges":[{"startOffset":34353,"endOffset":35150,"count":0}],"isBlockCoverage":false},{"functionName":"help_submenu","ranges":[{"startOffset":35155,"endOffset":35238,"count":0}],"isBlockCoverage":false},{"functionName":"help_submenu","ranges":[{"startOffset":35250,"endOffset":36411,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_program_name","ranges":[{"startOffset":36416,"endOffset":36529,"count":3}],"isBlockCoverage":true},{"functionName":"normalize_program_name","ranges":[{"startOffset":36541,"endOffset":37031,"count":3}],"isBlockCoverage":true},{"functionName":"render_branch_name","ranges":[{"startOffset":37036,"endOffset":37141,"count":0}],"isBlockCoverage":false},{"functionName":"render_branch_name","ranges":[{"startOffset":37153,"endOffset":42317,"count":0}],"isBlockCoverage":false},{"functionName":"render_commit_popup","ranges":[{"startOffset":42322,"endOffset":42429,"count":0}],"isBlockCoverage":false},{"functionName":"render_commit_popup","ranges":[{"startOffset":42441,"endOffset":43701,"count":0}],"isBlockCoverage":false},{"functionName":"render_error","ranges":[{"startOffset":43706,"endOffset":43799,"count":0}],"isBlockCoverage":false},{"functionName":"render_error","ranges":[{"startOffset":43811,"endOffset":45647,"count":0}],"isBlockCoverage":false},{"functionName":"render_error_message_box","ranges":[{"startOffset":45652,"endOffset":45769,"count":0}],"isBlockCoverage":false},{"functionName":"render_error_message_box","ranges":[{"startOffset":45781,"endOffset":53090,"count":0}],"isBlockCoverage":false},{"functionName":"render_event_as_form","ranges":[{"startOffset":53095,"endOffset":53204,"count":0}],"isBlockCoverage":false},{"functionName":"render_event_as_form","ranges":[{"startOffset":53216,"endOffset":54168,"count":0}],"isBlockCoverage":false},{"functionName":"render_help_hint","ranges":[{"startOffset":54173,"endOffset":54274,"count":0}],"isBlockCoverage":false},{"functionName":"render_help_hint","ranges":[{"startOffset":54286,"endOffset":55896,"count":0}],"isBlockCoverage":false},{"functionName":"render_infopanel","ranges":[{"startOffset":55901,"endOffset":56002,"count":0}],"isBlockCoverage":false},{"functionName":"render_infopanel","ranges":[{"startOffset":56014,"endOffset":59771,"count":0}],"isBlockCoverage":false},{"functionName":"render_item_state","ranges":[{"startOffset":59776,"endOffset":59879,"count":0}],"isBlockCoverage":false},{"functionName":"render_item_state","ranges":[{"startOffset":59891,"endOffset":63598,"count":0}],"isBlockCoverage":false},{"functionName":"render_js_error_banner","ranges":[{"startOffset":63603,"endOffset":63706,"count":0}],"isBlockCoverage":false},{"functionName":"render_js_error_banner","ranges":[{"startOffset":63718,"endOffset":64677,"count":0}],"isBlockCoverage":false},{"functionName":"render_label_list","ranges":[{"startOffset":64682,"endOffset":64785,"count":0}],"isBlockCoverage":false},{"functionName":"render_label_list","ranges":[{"startOffset":64797,"endOffset":69198,"count":0}],"isBlockCoverage":false},{"functionName":"render_news","ranges":[{"startOffset":69203,"endOffset":69294,"count":0}],"isBlockCoverage":false},{"functionName":"render_news","ranges":[{"startOffset":69306,"endOffset":73815,"count":0}],"isBlockCoverage":false},{"functionName":"render_order_by_header_cells","ranges":[{"startOffset":73820,"endOffset":73945,"count":0}],"isBlockCoverage":false},{"functionName":"render_order_by_header_cells","ranges":[{"startOffset":73957,"endOffset":79424,"count":0}],"isBlockCoverage":false},{"functionName":"render_package_name","ranges":[{"startOffset":79429,"endOffset":79536,"count":0}],"isBlockCoverage":false},{"functionName":"render_package_name","ranges":[{"startOffset":79548,"endOffset":82256,"count":0}],"isBlockCoverage":false},{"functionName":"render_path","ranges":[{"startOffset":82261,"endOffset":82352,"count":0}],"isBlockCoverage":false},{"functionName":"render_path","ranges":[{"startOffset":82364,"endOffset":85142,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_palette","ranges":[{"startOffset":85147,"endOffset":85254,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_palette","ranges":[{"startOffset":85266,"endOffset":101940,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_top","ranges":[{"startOffset":101945,"endOffset":102044,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_top","ranges":[{"startOffset":102056,"endOffset":112408,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_top_commit_hash","ranges":[{"startOffset":112413,"endOffset":112536,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_top_commit_hash","ranges":[{"startOffset":112548,"endOffset":115049,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_url","ranges":[{"startOffset":115054,"endOffset":115153,"count":0}],"isBlockCoverage":false},{"functionName":"render_repo_url","ranges":[{"startOffset":115165,"endOffset":116798,"count":0}],"isBlockCoverage":false},{"functionName":"render_sci_result","ranges":[{"startOffset":116803,"endOffset":116906,"count":0}],"isBlockCoverage":false},{"functionName":"render_sci_result","ranges":[{"startOffset":116918,"endOffset":118623,"count":0}],"isBlockCoverage":false},{"functionName":"render_text_input","ranges":[{"startOffset":118628,"endOffset":118731,"count":0}],"isBlockCoverage":false},{"functionName":"render_text_input","ranges":[{"startOffset":118743,"endOffset":120906,"count":0}],"isBlockCoverage":false},{"functionName":"render_timestamp","ranges":[{"startOffset":120911,"endOffset":121012,"count":0}],"isBlockCoverage":false},{"functionName":"render_timestamp","ranges":[{"startOffset":121024,"endOffset":121759,"count":0}],"isBlockCoverage":false},{"functionName":"render_transport","ranges":[{"startOffset":121764,"endOffset":121865,"count":0}],"isBlockCoverage":false},{"functionName":"render_transport","ranges":[{"startOffset":121877,"endOffset":124665,"count":0}],"isBlockCoverage":false},{"functionName":"render_user_name","ranges":[{"startOffset":124670,"endOffset":124771,"count":0}],"isBlockCoverage":false},{"functionName":"render_user_name","ranges":[{"startOffset":124783,"endOffset":128014,"count":0}],"isBlockCoverage":false},{"functionName":"render_warning_banner","ranges":[{"startOffset":128019,"endOffset":128130,"count":0}],"isBlockCoverage":false},{"functionName":"render_warning_banner","ranges":[{"startOffset":128142,"endOffset":129055,"count":0}],"isBlockCoverage":false},{"functionName":"settings_repo_toolbar","ranges":[{"startOffset":129060,"endOffset":129171,"count":0}],"isBlockCoverage":false},{"functionName":"settings_repo_toolbar","ranges":[{"startOffset":129183,"endOffset":132136,"count":0}],"isBlockCoverage":false},{"functionName":"settings_toolbar","ranges":[{"startOffset":132141,"endOffset":132242,"count":0}],"isBlockCoverage":false},{"functionName":"settings_toolbar","ranges":[{"startOffset":132254,"endOffset":133397,"count":0}],"isBlockCoverage":false},{"functionName":"shorten_repo_url","ranges":[{"startOffset":133402,"endOffset":133503,"count":0}],"isBlockCoverage":false},{"functionName":"shorten_repo_url","ranges":[{"startOffset":133515,"endOffset":135223,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1131","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_action_utils.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":26515,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":137,"endOffset":6904,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":321,"endOffset":385,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":554,"endOffset":936,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":981,"endOffset":1023,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1129,"endOffset":1193,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1240,"endOffset":1561,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1668,"endOffset":2050,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2145,"endOffset":2209,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2253,"endOffset":2296,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2340,"endOffset":2722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2818,"endOffset":2882,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2927,"endOffset":2991,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3099,"endOffset":3481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3529,"endOffset":3850,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3900,"endOffset":3997,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4097,"endOffset":4479,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4524,"endOffset":4566,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4616,"endOffset":4713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4812,"endOffset":4876,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4923,"endOffset":4970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5017,"endOffset":5065,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5112,"endOffset":5176,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5274,"endOffset":5338,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5381,"endOffset":5445,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5544,"endOffset":5608,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5650,"endOffset":5749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5792,"endOffset":5835,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5933,"endOffset":5997,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6039,"endOffset":6138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6183,"endOffset":6226,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6388,"endOffset":6452,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6494,"endOffset":6880,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_html_action_utils","ranges":[{"startOffset":6908,"endOffset":7079,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7082,"endOffset":7195,"count":0}],"isBlockCoverage":false},{"functionName":"add_field","ranges":[{"startOffset":7198,"endOffset":7285,"count":0}],"isBlockCoverage":false},{"functionName":"add_field","ranges":[{"startOffset":7295,"endOffset":9051,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":9054,"endOffset":9147,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":9157,"endOffset":9730,"count":1},{"startOffset":9447,"endOffset":9726,"count":0}],"isBlockCoverage":true},{"functionName":"dbkey_encode","ranges":[{"startOffset":9733,"endOffset":9826,"count":0}],"isBlockCoverage":false},{"functionName":"dbkey_encode","ranges":[{"startOffset":9836,"endOffset":11167,"count":0}],"isBlockCoverage":false},{"functionName":"dir_encode","ranges":[{"startOffset":11170,"endOffset":11259,"count":0}],"isBlockCoverage":false},{"functionName":"dir_encode","ranges":[{"startOffset":11269,"endOffset":12140,"count":0}],"isBlockCoverage":false},{"functionName":"field_keys_to_upper","ranges":[{"startOffset":12143,"endOffset":12250,"count":0}],"isBlockCoverage":false},{"functionName":"field_keys_to_upper","ranges":[{"startOffset":12260,"endOffset":13182,"count":7},{"startOffset":13043,"endOffset":13178,"count":17}],"isBlockCoverage":true},{"functionName":"file_encode","ranges":[{"startOffset":13185,"endOffset":13276,"count":0}],"isBlockCoverage":false},{"functionName":"file_encode","ranges":[{"startOffset":13286,"endOffset":14533,"count":0}],"isBlockCoverage":false},{"functionName":"jump_encode","ranges":[{"startOffset":14536,"endOffset":14627,"count":0}],"isBlockCoverage":false},{"functionName":"jump_encode","ranges":[{"startOffset":14637,"endOffset":16095,"count":0}],"isBlockCoverage":false},{"functionName":"obj_encode","ranges":[{"startOffset":16098,"endOffset":16187,"count":0}],"isBlockCoverage":false},{"functionName":"obj_encode","ranges":[{"startOffset":16197,"endOffset":17459,"count":0}],"isBlockCoverage":false},{"functionName":"parse_fields","ranges":[{"startOffset":17462,"endOffset":17555,"count":0}],"isBlockCoverage":false},{"functionName":"parse_fields","ranges":[{"startOffset":17565,"endOffset":19868,"count":19},{"startOffset":18241,"endOffset":18284,"count":7},{"startOffset":18352,"endOffset":18395,"count":12},{"startOffset":19148,"endOffset":19707,"count":34},{"startOffset":19605,"endOffset":19632,"count":3},{"startOffset":19632,"endOffset":19707,"count":31},{"startOffset":19773,"endOffset":19842,"count":7}],"isBlockCoverage":true},{"functionName":"parse_fields_upper_case_name","ranges":[{"startOffset":19871,"endOffset":19996,"count":0}],"isBlockCoverage":false},{"functionName":"parse_fields_upper_case_name","ranges":[{"startOffset":20006,"endOffset":20686,"count":7}],"isBlockCoverage":true},{"functionName":"parse_post_form_data","ranges":[{"startOffset":20689,"endOffset":20798,"count":0}],"isBlockCoverage":false},{"functionName":"parse_post_form_data","ranges":[{"startOffset":20808,"endOffset":22419,"count":6},{"startOffset":21786,"endOffset":21829,"count":1},{"startOffset":21897,"endOffset":21940,"count":5},{"startOffset":22185,"endOffset":22294,"count":1},{"startOffset":22294,"endOffset":22393,"count":5}],"isBlockCoverage":true},{"functionName":"translate_postdata","ranges":[{"startOffset":22422,"endOffset":22527,"count":0}],"isBlockCoverage":false},{"functionName":"translate_postdata","ranges":[{"startOffset":22537,"endOffset":24596,"count":6},{"startOffset":23603,"endOffset":24595,"count":3}],"isBlockCoverage":true},{"functionName":"unescape","ranges":[{"startOffset":24599,"endOffset":24684,"count":0}],"isBlockCoverage":false},{"functionName":"unescape","ranges":[{"startOffset":24694,"endOffset":26153,"count":68}],"isBlockCoverage":true}]},{"scriptId":"1132","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_language.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2272,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":119,"endOffset":802,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":290,"endOffset":388,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":680,"endOffset":778,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_language","ranges":[{"startOffset":806,"endOffset":960,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":963,"endOffset":1076,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":1079,"endOffset":1163,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":1173,"endOffset":1344,"count":1}],"isBlockCoverage":true},{"functionName":"restore_login_language","ranges":[{"startOffset":1347,"endOffset":1441,"count":0}],"isBlockCoverage":false},{"functionName":"restore_login_language","ranges":[{"startOffset":1451,"endOffset":1558,"count":0}],"isBlockCoverage":false},{"functionName":"set_current_language","ranges":[{"startOffset":1561,"endOffset":1661,"count":0}],"isBlockCoverage":false},{"functionName":"set_current_language","ranges":[{"startOffset":1671,"endOffset":1934,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1133","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_labels.clas.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":24790,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":125,"endOffset":4414,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":290,"endOffset":354,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":443,"endOffset":507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":668,"endOffset":968,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1012,"endOffset":1072,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1177,"endOffset":1241,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1285,"endOffset":1345,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1503,"endOffset":1567,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1660,"endOffset":1918,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1963,"endOffset":2027,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2124,"endOffset":2188,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2233,"endOffset":2297,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2400,"endOffset":2464,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2570,"endOffset":3096,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3141,"endOffset":3205,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3311,"endOffset":3439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3484,"endOffset":3548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3652,"endOffset":3716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3761,"endOffset":3825,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3924,"endOffset":4282,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4326,"endOffset":4390,"count":0}],"isBlockCoverage":false},{"functionName":"zcl_abapgit_repo_labels","ranges":[{"startOffset":4418,"endOffset":4625,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4628,"endOffset":4741,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":4744,"endOffset":4831,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":4841,"endOffset":5019,"count":1}],"isBlockCoverage":true},{"functionName":"normalize","ranges":[{"startOffset":5022,"endOffset":5103,"count":0}],"isBlockCoverage":false},{"functionName":"normalize","ranges":[{"startOffset":5113,"endOffset":6666,"count":5},{"startOffset":6107,"endOffset":6409,"count":13},{"startOffset":6317,"endOffset":6403,"count":12}],"isBlockCoverage":true},{"functionName":"normalize_colors","ranges":[{"startOffset":6669,"endOffset":6764,"count":0}],"isBlockCoverage":false},{"functionName":"normalize_colors","ranges":[{"startOffset":6774,"endOffset":9878,"count":5},{"startOffset":8883,"endOffset":9258,"count":9},{"startOffset":8994,"endOffset":9078,"count":7},{"startOffset":9078,"endOffset":9252,"count":2},{"startOffset":9208,"endOffset":9244,"count":0}],"isBlockCoverage":true},{"functionName":"parse_color","ranges":[{"startOffset":9881,"endOffset":9966,"count":0}],"isBlockCoverage":false},{"functionName":"parse_color","ranges":[{"startOffset":9976,"endOffset":11024,"count":17},{"startOffset":10608,"endOffset":10639,"count":0},{"startOffset":10747,"endOffset":10944,"count":7},{"startOffset":10944,"endOffset":10998,"count":10}],"isBlockCoverage":true},{"functionName":"split","ranges":[{"startOffset":11027,"endOffset":11100,"count":0}],"isBlockCoverage":false},{"functionName":"split","ranges":[{"startOffset":11110,"endOffset":12051,"count":10},{"startOffset":11807,"endOffset":11911,"count":36}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":11971,"endOffset":12022,"count":36}],"isBlockCoverage":true},{"functionName":"split_colors","ranges":[{"startOffset":12054,"endOffset":12141,"count":0}],"isBlockCoverage":false},{"functionName":"split_colors","ranges":[{"startOffset":12151,"endOffset":14488,"count":18},{"startOffset":13932,"endOffset":14456,"count":35},{"startOffset":14088,"endOffset":14450,"count":28}],"isBlockCoverage":true},{"functionName":"split_colors_into_map","ranges":[{"startOffset":14491,"endOffset":14596,"count":0}],"isBlockCoverage":false},{"functionName":"split_colors_into_map","ranges":[{"startOffset":14606,"endOffset":16340,"count":1},{"startOffset":15987,"endOffset":16317,"count":2},{"startOffset":16137,"endOffset":16311,"count":0}],"isBlockCoverage":true},{"functionName":"validate","ranges":[{"startOffset":16343,"endOffset":16422,"count":0}],"isBlockCoverage":false},{"functionName":"validate","ranges":[{"startOffset":16432,"endOffset":17501,"count":4},{"startOffset":17087,"endOffset":17497,"count":9},{"startOffset":17297,"endOffset":17491,"count":1},{"startOffset":17483,"endOffset":17491,"count":0},{"startOffset":17497,"endOffset":17500,"count":3}],"isBlockCoverage":true},{"functionName":"validate_colors","ranges":[{"startOffset":17504,"endOffset":17597,"count":0}],"isBlockCoverage":false},{"functionName":"validate_colors","ranges":[{"startOffset":17607,"endOffset":18924,"count":10},{"startOffset":18778,"endOffset":18920,"count":13},{"startOffset":18914,"endOffset":18920,"count":7},{"startOffset":18920,"endOffset":18923,"count":4}],"isBlockCoverage":true},{"functionName":"validate_one_label_color","ranges":[{"startOffset":18927,"endOffset":19038,"count":0}],"isBlockCoverage":false},{"functionName":"validate_one_label_color","ranges":[{"startOffset":19048,"endOffset":21690,"count":22},{"startOffset":19544,"endOffset":19575,"count":13},{"startOffset":19637,"endOffset":19682,"count":9},{"startOffset":20102,"endOffset":20270,"count":2},{"startOffset":20264,"endOffset":20270,"count":0},{"startOffset":20270,"endOffset":20320,"count":20},{"startOffset":20320,"endOffset":20488,"count":3},{"startOffset":20482,"endOffset":20488,"count":0},{"startOffset":20488,"endOffset":20664,"count":17},{"startOffset":20664,"endOffset":20843,"count":0},{"startOffset":20843,"endOffset":20993,"count":17},{"startOffset":20993,"endOffset":21388,"count":10},{"startOffset":21199,"endOffset":21382,"count":2},{"startOffset":21374,"endOffset":21382,"count":0},{"startOffset":21388,"endOffset":21455,"count":15},{"startOffset":21455,"endOffset":21537,"count":7},{"startOffset":21531,"endOffset":21537,"count":6},{"startOffset":21537,"endOffset":21604,"count":14},{"startOffset":21604,"endOffset":21686,"count":2}],"isBlockCoverage":true},{"functionName":"validate_rgb_color","ranges":[{"startOffset":21693,"endOffset":21792,"count":0}],"isBlockCoverage":false},{"functionName":"validate_rgb_color","ranges":[{"startOffset":21802,"endOffset":23063,"count":9},{"startOffset":22068,"endOffset":22099,"count":0},{"startOffset":22510,"endOffset":22693,"count":0},{"startOffset":22819,"endOffset":22878,"count":6},{"startOffset":22881,"endOffset":23053,"count":1},{"startOffset":23045,"endOffset":23053,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1134","url":"file:///home/runner/work/abapGit/abapGit/test/setup.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":404,"count":1}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":72,"endOffset":404,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1135","url":"","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1136","url":"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/database-sqlite/build/index.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5332,"count":1}],"isBlockCoverage":true},{"functionName":"SQLiteDatabaseClient","ranges":[{"startOffset":213,"endOffset":393,"count":1},{"startOffset":363,"endOffset":376,"count":0}],"isBlockCoverage":true},{"functionName":"connect","ranges":[{"startOffset":398,"endOffset":908,"count":1},{"startOffset":619,"endOffset":627,"count":0},{"startOffset":670,"endOffset":678,"count":0},{"startOffset":863,"endOffset":871,"count":0}],"isBlockCoverage":true},{"functionName":"disconnect","ranges":[{"startOffset":913,"endOffset":1001,"count":0}],"isBlockCoverage":false},{"functionName":"execute","ranges":[{"startOffset":1006,"endOffset":1296,"count":578},{"startOffset":1064,"endOffset":1177,"count":576},{"startOffset":1094,"endOffset":1133,"count":0},{"startOffset":1177,"endOffset":1290,"count":2},{"startOffset":1226,"endOffset":1280,"count":576}],"isBlockCoverage":true},{"functionName":"export","ranges":[{"startOffset":1301,"endOffset":1417,"count":0}],"isBlockCoverage":false},{"functionName":"beginTransaction","ranges":[{"startOffset":1422,"endOffset":1478,"count":0}],"isBlockCoverage":false},{"functionName":"commit","ranges":[{"startOffset":1483,"endOffset":1529,"count":0}],"isBlockCoverage":false},{"functionName":"rollback","ranges":[{"startOffset":1534,"endOffset":1582,"count":0}],"isBlockCoverage":false},{"functionName":"delete","ranges":[{"startOffset":1587,"endOffset":2210,"count":0}],"isBlockCoverage":false},{"functionName":"update","ranges":[{"startOffset":2215,"endOffset":2863,"count":0}],"isBlockCoverage":false},{"functionName":"insert","ranges":[{"startOffset":2868,"endOffset":3400,"count":0}],"isBlockCoverage":false},{"functionName":"select","ranges":[{"startOffset":3455,"endOffset":4810,"count":142},{"startOffset":3786,"endOffset":3922,"count":6},{"startOffset":3922,"endOffset":4030,"count":136},{"startOffset":4272,"endOffset":4324,"count":0},{"startOffset":4409,"endOffset":4733,"count":1},{"startOffset":4675,"endOffset":4680,"count":0},{"startOffset":4698,"endOffset":4733,"count":0},{"startOffset":4733,"endOffset":4809,"count":141}],"isBlockCoverage":true},{"functionName":"convert","ranges":[{"startOffset":4815,"endOffset":5243,"count":141},{"startOffset":4881,"endOffset":4915,"count":13},{"startOffset":4915,"endOffset":5216,"count":128},{"startOffset":5094,"endOffset":5178,"count":511},{"startOffset":5216,"endOffset":5242,"count":128}],"isBlockCoverage":true}]},{"scriptId":"1137","url":"file:///home/runner/work/abapGit/abapGit/node_modules/sql.js/dist/sql-wasm-debug.js","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":258994,"count":1},{"startOffset":258807,"endOffset":258993,"count":0}],"isBlockCoverage":true},{"functionName":"initSqlJs","ranges":[{"startOffset":946,"endOffset":258386,"count":1},{"startOffset":998,"endOffset":1036,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1134,"endOffset":258313,"count":1},{"startOffset":1828,"endOffset":1842,"count":0},{"startOffset":4869,"endOffset":4873,"count":0},{"startOffset":53485,"endOffset":53510,"count":0},{"startOffset":53540,"endOffset":53726,"count":0},{"startOffset":54902,"endOffset":55104,"count":0},{"startOffset":55134,"endOffset":55209,"count":0},{"startOffset":56326,"endOffset":56363,"count":0},{"startOffset":56637,"endOffset":60789,"count":0},{"startOffset":61472,"endOffset":61505,"count":0},{"startOffset":61578,"endOffset":61614,"count":0},{"startOffset":61683,"endOffset":61706,"count":0},{"startOffset":67408,"endOffset":67442,"count":0},{"startOffset":67629,"endOffset":67676,"count":0},{"startOffset":68638,"endOffset":68649,"count":0},{"startOffset":77208,"endOffset":77310,"count":0},{"startOffset":206052,"endOffset":206104,"count":0},{"startOffset":223294,"endOffset":223305,"count":0},{"startOffset":258040,"endOffset":258206,"count":0}],"isBlockCoverage":true},{"functionName":"Module.onAbort","ranges":[{"startOffset":2110,"endOffset":2323,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2410,"endOffset":2558,"count":1}],"isBlockCoverage":true},{"functionName":"onRuntimeInitialized","ranges":[{"startOffset":6427,"endOffset":52420,"count":1}],"isBlockCoverage":true},{"functionName":"Statement","ranges":[{"startOffset":12909,"endOffset":13203,"count":141}],"isBlockCoverage":true},{"functionName":"bind","ranges":[{"startOffset":14926,"endOffset":15263,"count":0}],"isBlockCoverage":false},{"functionName":"step","ranges":[{"startOffset":15522,"endOffset":15904,"count":269},{"startOffset":15564,"endOffset":15613,"count":0},{"startOffset":15714,"endOffset":15759,"count":128},{"startOffset":15772,"endOffset":15819,"count":141},{"startOffset":15832,"endOffset":15888,"count":0}],"isBlockCoverage":true},{"functionName":"getNumber","ranges":[{"startOffset":16055,"endOffset":16232,"count":0}],"isBlockCoverage":false},{"functionName":"getBigInt","ranges":[{"startOffset":16271,"endOffset":16617,"count":0}],"isBlockCoverage":false},{"functionName":"getString","ranges":[{"startOffset":16656,"endOffset":16831,"count":511},{"startOffset":16707,"endOffset":16773,"count":0}],"isBlockCoverage":true},{"functionName":"getBlob","ranges":[{"startOffset":16868,"endOffset":17261,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":17956,"endOffset":19037,"count":128},{"startOffset":18045,"endOffset":18068,"count":0},{"startOffset":18070,"endOffset":18109,"count":0},{"startOffset":18239,"endOffset":19006,"count":511},{"startOffset":18318,"endOffset":18560,"count":0},{"startOffset":18577,"endOffset":18680,"count":0},{"startOffset":18816,"endOffset":18916,"count":0},{"startOffset":18933,"endOffset":18982,"count":0}],"isBlockCoverage":true},{"functionName":"getColumnNames","ranges":[{"startOffset":19453,"endOffset":19704,"count":128},{"startOffset":19600,"endOffset":19673,"count":511}],"isBlockCoverage":true},{"functionName":"getAsObject","ranges":[{"startOffset":20383,"endOffset":20713,"count":0}],"isBlockCoverage":false},{"functionName":"getSQL","ranges":[{"startOffset":20858,"endOffset":20922,"count":0}],"isBlockCoverage":false},{"functionName":"getNormalizedSQL","ranges":[{"startOffset":21434,"endOffset":21519,"count":0}],"isBlockCoverage":false},{"functionName":"run","ranges":[{"startOffset":21771,"endOffset":21929,"count":0}],"isBlockCoverage":false},{"functionName":"bindString","ranges":[{"startOffset":21969,"endOffset":22425,"count":0}],"isBlockCoverage":false},{"functionName":"bindBlob","ranges":[{"startOffset":22463,"endOffset":22867,"count":0}],"isBlockCoverage":false},{"functionName":"bindNumber","ranges":[{"startOffset":22907,"endOffset":23256,"count":0}],"isBlockCoverage":false},{"functionName":"bindNull","ranges":[{"startOffset":23294,"endOffset":23489,"count":0}],"isBlockCoverage":false},{"functionName":"bindValue","ranges":[{"startOffset":23528,"endOffset":24525,"count":0}],"isBlockCoverage":false},{"functionName":"bindFromObject","ranges":[{"startOffset":24746,"endOffset":25073,"count":0}],"isBlockCoverage":false},{"functionName":"bindFromArray","ranges":[{"startOffset":25231,"endOffset":25409,"count":0}],"isBlockCoverage":false},{"functionName":"reset","ranges":[{"startOffset":25624,"endOffset":25817,"count":0}],"isBlockCoverage":false},{"functionName":"freemem","ranges":[{"startOffset":25919,"endOffset":26060,"count":141},{"startOffset":26019,"endOffset":26054,"count":0}],"isBlockCoverage":true},{"functionName":"free","ranges":[{"startOffset":26197,"endOffset":26413,"count":141}],"isBlockCoverage":true},{"functionName":"StatementIterator","ranges":[{"startOffset":27855,"endOffset":28276,"count":0}],"isBlockCoverage":false},{"functionName":"next","ranges":[{"startOffset":28862,"endOffset":30197,"count":0}],"isBlockCoverage":false},{"functionName":"finalize","ranges":[{"startOffset":30243,"endOffset":30326,"count":0}],"isBlockCoverage":false},{"functionName":"getRemainder","ranges":[{"startOffset":30486,"endOffset":30740,"count":0}],"isBlockCoverage":false},{"functionName":"iterator","ranges":[{"startOffset":30917,"endOffset":30973,"count":0}],"isBlockCoverage":false},{"functionName":"Database","ranges":[{"startOffset":31332,"endOffset":31915,"count":1},{"startOffset":31456,"endOffset":31536,"count":0}],"isBlockCoverage":true},{"functionName":"run","ranges":[{"startOffset":32623,"endOffset":33043,"count":576},{"startOffset":32673,"endOffset":32721,"count":0},{"startOffset":32742,"endOffset":32926,"count":0}],"isBlockCoverage":true},{"functionName":"exec","ranges":[{"startOffset":35465,"endOffset":37292,"count":142},{"startOffset":35524,"endOffset":35572,"count":0},{"startOffset":36368,"endOffset":37084,"count":141},{"startOffset":36507,"endOffset":36573,"count":0},{"startOffset":36617,"endOffset":37030,"count":128},{"startOffset":37098,"endOffset":37137,"count":141},{"startOffset":37137,"endOffset":37233,"count":1},{"startOffset":37179,"endOffset":37194,"count":0},{"startOffset":37233,"endOffset":37234,"count":0}],"isBlockCoverage":true},{"functionName":"each","ranges":[{"startOffset":38291,"endOffset":38861,"count":0}],"isBlockCoverage":false},{"functionName":"prepare","ranges":[{"startOffset":39202,"endOffset":39702,"count":0}],"isBlockCoverage":false},{"functionName":"iterateStatements","ranges":[{"startOffset":40617,"endOffset":40705,"count":0}],"isBlockCoverage":false},{"functionName":"exportDatabase","ranges":[{"startOffset":40886,"endOffset":41381,"count":0}],"isBlockCoverage":false},{"functionName":"close","ranges":[{"startOffset":41824,"endOffset":42282,"count":0}],"isBlockCoverage":false},{"functionName":"handleError","ranges":[{"startOffset":42468,"endOffset":42678,"count":719},{"startOffset":42561,"endOffset":42597,"count":718},{"startOffset":42597,"endOffset":42677,"count":1}],"isBlockCoverage":true},{"functionName":"getRowsModified","ranges":[{"startOffset":43040,"endOffset":43115,"count":0}],"isBlockCoverage":false},{"functionName":"extract_blob","ranges":[{"startOffset":43141,"endOffset":43439,"count":0}],"isBlockCoverage":false},{"functionName":"parseFunctionArguments","ranges":[{"startOffset":43475,"endOffset":44212,"count":0}],"isBlockCoverage":false},{"functionName":"setFunctionResult","ranges":[{"startOffset":44242,"endOffset":45319,"count":0}],"isBlockCoverage":false},{"functionName":"create_function","ranges":[{"startOffset":45826,"endOffset":46925,"count":0}],"isBlockCoverage":false},{"functionName":"create_aggregate","ranges":[{"startOffset":48406,"endOffset":52351,"count":0}],"isBlockCoverage":false},{"functionName":"quit_","ranges":[{"startOffset":52829,"endOffset":52870,"count":0}],"isBlockCoverage":false},{"functionName":"locateFile","ranges":[{"startOffset":53824,"endOffset":53976,"count":1},{"startOffset":53880,"endOffset":53941,"count":0}],"isBlockCoverage":true},{"functionName":"logExceptionOnExit","ranges":[{"startOffset":54528,"endOffset":54739,"count":0}],"isBlockCoverage":false},{"functionName":"requireNodeFS","ranges":[{"startOffset":55310,"endOffset":55546,"count":1}],"isBlockCoverage":true},{"functionName":"shell_read","ranges":[{"startOffset":55557,"endOffset":55728,"count":1},{"startOffset":55716,"endOffset":55724,"count":0}],"isBlockCoverage":true},{"functionName":"readBinary","ranges":[{"startOffset":55744,"endOffset":55888,"count":1},{"startOffset":55814,"endOffset":55850,"count":0}],"isBlockCoverage":true},{"functionName":"readAsync","ranges":[{"startOffset":55903,"endOffset":56111,"count":0}],"isBlockCoverage":false},{"functionName":"quit_","ranges":[{"startOffset":56375,"endOffset":56556,"count":0}],"isBlockCoverage":false},{"functionName":"Module.inspect","ranges":[{"startOffset":56581,"endOffset":56633,"count":0}],"isBlockCoverage":false},{"functionName":"shell_read","ranges":[{"startOffset":57060,"endOffset":57112,"count":0}],"isBlockCoverage":false},{"functionName":"readBinary","ranges":[{"startOffset":57134,"endOffset":57353,"count":0}],"isBlockCoverage":false},{"functionName":"readAsync","ranges":[{"startOffset":57370,"endOffset":57462,"count":0}],"isBlockCoverage":false},{"functionName":"quit_","ranges":[{"startOffset":57664,"endOffset":57747,"count":0}],"isBlockCoverage":false},{"functionName":"read_","ranges":[{"startOffset":59800,"endOffset":59940,"count":0}],"isBlockCoverage":false},{"functionName":"readBinary","ranges":[{"startOffset":59990,"endOffset":60222,"count":0}],"isBlockCoverage":false},{"functionName":"readAsync","ranges":[{"startOffset":60243,"endOffset":60624,"count":0}],"isBlockCoverage":false},{"functionName":"setWindowTitle","ranges":[{"startOffset":60694,"endOffset":60727,"count":0}],"isBlockCoverage":false},{"functionName":"getNativeTypeSize","ranges":[{"startOffset":63780,"endOffset":64373,"count":0}],"isBlockCoverage":false},{"functionName":"legacyModuleProp","ranges":[{"startOffset":64406,"endOffset":64828,"count":10}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":64584,"endOffset":64814,"count":0}],"isBlockCoverage":false},{"functionName":"ignoredModuleProp","ranges":[{"startOffset":64830,"endOffset":65032,"count":1},{"startOffset":64918,"endOffset":65030,"count":0}],"isBlockCoverage":true},{"functionName":"isExportedByForceFilesystem","ranges":[{"startOffset":65092,"endOffset":65521,"count":0}],"isBlockCoverage":false},{"functionName":"missingLibrarySymbol","ranges":[{"startOffset":65523,"endOffset":66302,"count":109}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":65738,"endOffset":66288,"count":0}],"isBlockCoverage":false},{"functionName":"unexportedRuntimeSymbol","ranges":[{"startOffset":66304,"endOffset":66800,"count":235}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":66477,"endOffset":66786,"count":0}],"isBlockCoverage":false},{"functionName":"assert","ranges":[{"startOffset":68179,"endOffset":68298,"count":45383},{"startOffset":68232,"endOffset":68296,"count":0}],"isBlockCoverage":true},{"functionName":"UTF8ArrayToString","ranges":[{"startOffset":68991,"endOffset":70824,"count":5358},{"startOffset":69479,"endOffset":69501,"count":100883},{"startOffset":69503,"endOffset":69512,"count":100883},{"startOffset":69538,"endOffset":69559,"count":4011},{"startOffset":69560,"endOffset":69574,"count":4011},{"startOffset":69576,"endOffset":69647,"count":4011},{"startOffset":69647,"endOffset":69812,"count":1347},{"startOffset":69812,"endOffset":70808,"count":3539},{"startOffset":70092,"endOffset":70804,"count":0},{"startOffset":70808,"endOffset":70823,"count":1347}],"isBlockCoverage":true},{"functionName":"UTF8ToString","ranges":[{"startOffset":71793,"endOffset":71907,"count":5358},{"startOffset":71900,"endOffset":71904,"count":0}],"isBlockCoverage":true},{"functionName":"stringToUTF8Array","ranges":[{"startOffset":72921,"endOffset":74856,"count":720},{"startOffset":73144,"endOffset":73153,"count":0},{"startOffset":73298,"endOffset":74759,"count":2418528},{"startOffset":73756,"endOffset":73770,"count":0},{"startOffset":73772,"endOffset":73871,"count":0},{"startOffset":73921,"endOffset":73927,"count":0},{"startOffset":73959,"endOffset":74755,"count":0}],"isBlockCoverage":true},{"functionName":"stringToUTF8","ranges":[{"startOffset":75275,"endOffset":75566,"count":578}],"isBlockCoverage":true},{"functionName":"lengthBytesUTF8","ranges":[{"startOffset":75702,"endOffset":76261,"count":143},{"startOffset":75788,"endOffset":76245,"count":12946},{"startOffset":76101,"endOffset":76241,"count":0}],"isBlockCoverage":true},{"functionName":"updateGlobalBufferAndViews","ranges":[{"startOffset":76673,"endOffset":77152,"count":1}],"isBlockCoverage":true},{"functionName":"writeStackCookie","ranges":[{"startOffset":78602,"endOffset":79037,"count":1}],"isBlockCoverage":true},{"functionName":"checkStackCookie","ranges":[{"startOffset":79039,"endOffset":79671,"count":3},{"startOffset":79082,"endOffset":79089,"count":0},{"startOffset":79264,"endOffset":79480,"count":0},{"startOffset":79578,"endOffset":79669,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":79769,"endOffset":80018,"count":1},{"startOffset":79910,"endOffset":80016,"count":0}],"isBlockCoverage":true},{"functionName":"keepRuntimeAlive","ranges":[{"startOffset":80364,"endOffset":80419,"count":0}],"isBlockCoverage":false},{"functionName":"preRun","ranges":[{"startOffset":80421,"endOffset":80687,"count":1},{"startOffset":80466,"endOffset":80646,"count":0}],"isBlockCoverage":true},{"functionName":"initRuntime","ranges":[{"startOffset":80689,"endOffset":80943,"count":1}],"isBlockCoverage":true},{"functionName":"postRun","ranges":[{"startOffset":80945,"endOffset":81242,"count":1},{"startOffset":81064,"endOffset":81104,"count":0}],"isBlockCoverage":true},{"functionName":"addOnPreRun","ranges":[{"startOffset":81244,"endOffset":81300,"count":0}],"isBlockCoverage":false},{"functionName":"addOnInit","ranges":[{"startOffset":81302,"endOffset":81354,"count":1}],"isBlockCoverage":true},{"functionName":"addOnExit","ranges":[{"startOffset":81356,"endOffset":81382,"count":0}],"isBlockCoverage":false},{"functionName":"addOnPostRun","ranges":[{"startOffset":81384,"endOffset":81442,"count":1}],"isBlockCoverage":true},{"functionName":"getUniqueRunDependency","ranges":[{"startOffset":83074,"endOffset":83226,"count":0}],"isBlockCoverage":false},{"functionName":"addRunDependency","ranges":[{"startOffset":83228,"endOffset":84191,"count":1},{"startOffset":83322,"endOffset":83382,"count":0},{"startOffset":84125,"endOffset":84189,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":83648,"endOffset":84106,"count":0}],"isBlockCoverage":false},{"functionName":"removeRunDependency","ranges":[{"startOffset":84193,"endOffset":84849,"count":1},{"startOffset":84290,"endOffset":84350,"count":0},{"startOffset":84444,"endOffset":84510,"count":0}],"isBlockCoverage":true},{"functionName":"abort","ranges":[{"startOffset":84887,"endOffset":86287,"count":0}],"isBlockCoverage":false},{"functionName":"isDataURI","ranges":[{"startOffset":86586,"endOffset":86732,"count":1}],"isBlockCoverage":true},{"functionName":"isFileURI","ranges":[{"startOffset":86822,"endOffset":86895,"count":0}],"isBlockCoverage":false},{"functionName":"createExportWrapper","ranges":[{"startOffset":86959,"endOffset":87408,"count":58}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":87015,"endOffset":87405,"count":5220},{"startOffset":87264,"endOffset":87356,"count":0}],"isBlockCoverage":true},{"functionName":"getBinary","ranges":[{"startOffset":87562,"endOffset":87853,"count":1},{"startOffset":87643,"endOffset":87691,"count":0},{"startOffset":87750,"endOffset":87851,"count":0}],"isBlockCoverage":true},{"functionName":"getBinaryPromise","ranges":[{"startOffset":87855,"endOffset":89270,"count":1},{"startOffset":88354,"endOffset":89119,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":88507,"endOffset":88697,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":88705,"endOffset":88770,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":88932,"endOffset":89099,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":89218,"endOffset":89266,"count":1}],"isBlockCoverage":true},{"functionName":"createWasm","ranges":[{"startOffset":89352,"endOffset":94674,"count":1},{"startOffset":94372,"endOffset":94592,"count":0}],"isBlockCoverage":true},{"functionName":"receiveInstance","ranges":[{"startOffset":89728,"endOffset":90435,"count":1}],"isBlockCoverage":true},{"functionName":"receiveInstantiationResult","ranges":[{"startOffset":90862,"endOffset":91543,"count":1}],"isBlockCoverage":true},{"functionName":"instantiateArrayBuffer","ranges":[{"startOffset":91547,"endOffset":92240,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":91626,"endOffset":91702,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":91709,"endOffset":91759,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":91776,"endOffset":92234,"count":0}],"isBlockCoverage":false},{"functionName":"instantiateAsync","ranges":[{"startOffset":92244,"endOffset":93972,"count":1},{"startOffset":92359,"endOffset":92396,"count":0},{"startOffset":92397,"endOffset":92535,"count":0},{"startOffset":92536,"endOffset":92856,"count":0},{"startOffset":92857,"endOffset":92894,"count":0},{"startOffset":92896,"endOffset":93890,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":92970,"endOffset":93882,"count":0}],"isBlockCoverage":false},{"functionName":"ExitStatus","ranges":[{"startOffset":94835,"endOffset":94999,"count":0}],"isBlockCoverage":false},{"functionName":"callRuntimeCallbacks","ranges":[{"startOffset":95003,"endOffset":95181,"count":3},{"startOffset":95081,"endOffset":95175,"count":2}],"isBlockCoverage":true},{"functionName":"withStackSave","ranges":[{"startOffset":95185,"endOffset":95315,"count":0}],"isBlockCoverage":false},{"functionName":"demangle","ranges":[{"startOffset":95318,"endOffset":95458,"count":0}],"isBlockCoverage":false},{"functionName":"demangleAll","ranges":[{"startOffset":95462,"endOffset":95690,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":95575,"endOffset":95682,"count":0}],"isBlockCoverage":false},{"functionName":"getValue","ranges":[{"startOffset":95768,"endOffset":96342,"count":566},{"startOffset":95836,"endOffset":95847,"count":0},{"startOffset":95878,"endOffset":95914,"count":0},{"startOffset":95923,"endOffset":95959,"count":283},{"startOffset":95968,"endOffset":96006,"count":0},{"startOffset":96015,"endOffset":96053,"count":283},{"startOffset":96062,"endOffset":96100,"count":0},{"startOffset":96109,"endOffset":96150,"count":0},{"startOffset":96159,"endOffset":96201,"count":0},{"startOffset":96210,"endOffset":96247,"count":0},{"startOffset":96256,"endOffset":96309,"count":0},{"startOffset":96317,"endOffset":96341,"count":0}],"isBlockCoverage":true},{"functionName":"handleException","ranges":[{"startOffset":96346,"endOffset":96793,"count":0}],"isBlockCoverage":false},{"functionName":"jsStackTrace","ranges":[{"startOffset":96797,"endOffset":97268,"count":0}],"isBlockCoverage":false},{"functionName":"setValue","ranges":[{"startOffset":97375,"endOffset":98306,"count":284},{"startOffset":97450,"endOffset":97461,"count":0},{"startOffset":97492,"endOffset":97536,"count":0},{"startOffset":97545,"endOffset":97589,"count":0},{"startOffset":97598,"endOffset":97644,"count":0},{"startOffset":97708,"endOffset":98059,"count":0},{"startOffset":98068,"endOffset":98117,"count":0},{"startOffset":98126,"endOffset":98176,"count":0},{"startOffset":98185,"endOffset":98230,"count":0},{"startOffset":98239,"endOffset":98292,"count":0}],"isBlockCoverage":true},{"functionName":"stackTrace","ranges":[{"startOffset":98310,"endOffset":98479,"count":0}],"isBlockCoverage":false},{"functionName":"warnOnce","ranges":[{"startOffset":98483,"endOffset":98718,"count":0}],"isBlockCoverage":false},{"functionName":"writeArrayToMemory","ranges":[{"startOffset":98722,"endOffset":98919,"count":0}],"isBlockCoverage":false},{"functionName":"___assert_fail","ranges":[{"startOffset":98923,"endOffset":99172,"count":0}],"isBlockCoverage":false},{"functionName":"isAbs","ranges":[{"startOffset":99194,"endOffset":99226,"count":12819}],"isBlockCoverage":true},{"functionName":"splitPath","ranges":[{"startOffset":99237,"endOffset":99403,"count":3}],"isBlockCoverage":true},{"functionName":"normalizeArray","ranges":[{"startOffset":99419,"endOffset":100089,"count":17325},{"startOffset":99588,"endOffset":99869,"count":15690},{"startOffset":99649,"endOffset":99694,"count":0},{"startOffset":99719,"endOffset":99782,"count":0},{"startOffset":99796,"endOffset":99859,"count":0},{"startOffset":99974,"endOffset":100059,"count":0}],"isBlockCoverage":true},{"functionName":"normalize","ranges":[{"startOffset":100100,"endOffset":100525,"count":4832},{"startOffset":100351,"endOffset":100365,"count":578},{"startOffset":100367,"endOffset":100400,"count":0},{"startOffset":100418,"endOffset":100434,"count":4254},{"startOffset":100436,"endOffset":100470,"count":0},{"startOffset":100504,"endOffset":100508,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":100296,"endOffset":100306,"count":12181}],"isBlockCoverage":true},{"functionName":"dirname","ranges":[{"startOffset":100534,"endOffset":100906,"count":3},{"startOffset":100666,"endOffset":100673,"count":0},{"startOffset":100675,"endOffset":100743,"count":0}],"isBlockCoverage":true},{"functionName":"basename","ranges":[{"startOffset":100916,"endOffset":101244,"count":1174},{"startOffset":101017,"endOffset":101028,"count":0},{"startOffset":101183,"endOffset":101195,"count":0}],"isBlockCoverage":true},{"functionName":"join","ranges":[{"startOffset":101250,"endOffset":101377,"count":0}],"isBlockCoverage":false},{"functionName":"join2","ranges":[{"startOffset":101384,"endOffset":101447,"count":2497}],"isBlockCoverage":true},{"functionName":"getRandomDevice","ranges":[{"startOffset":101455,"endOffset":102562,"count":1},{"startOffset":101520,"endOffset":101569,"count":0},{"startOffset":101571,"endOffset":101749,"count":0},{"startOffset":102021,"endOffset":102090,"count":0},{"startOffset":102098,"endOffset":102561,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":101669,"endOffset":101740,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":101969,"endOffset":102009,"count":256}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":102254,"endOffset":102555,"count":0}],"isBlockCoverage":false},{"functionName":"resolve","ranges":[{"startOffset":102591,"endOffset":103555,"count":6251},{"startOffset":102722,"endOffset":102742,"count":12502},{"startOffset":102796,"endOffset":102806,"count":0},{"startOffset":102891,"endOffset":102982,"count":0},{"startOffset":102999,"endOffset":103085,"count":0},{"startOffset":103518,"endOffset":103522,"count":0},{"startOffset":103540,"endOffset":103546,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":103435,"endOffset":103445,"count":18789}],"isBlockCoverage":true},{"functionName":"relative","ranges":[{"startOffset":103565,"endOffset":104668,"count":0}],"isBlockCoverage":false},{"functionName":"intArrayFromString","ranges":[{"startOffset":104729,"endOffset":105047,"count":0}],"isBlockCoverage":false},{"functionName":"init","ranges":[{"startOffset":105074,"endOffset":105603,"count":1}],"isBlockCoverage":true},{"functionName":"shutdown","ranges":[{"startOffset":105613,"endOffset":106444,"count":0}],"isBlockCoverage":false},{"functionName":"register","ranges":[{"startOffset":106454,"endOffset":106591,"count":2}],"isBlockCoverage":true},{"functionName":"open","ranges":[{"startOffset":106609,"endOffset":106823,"count":3},{"startOffset":106696,"endOffset":106750,"count":0}],"isBlockCoverage":true},{"functionName":"close","ranges":[{"startOffset":106830,"endOffset":106943,"count":0}],"isBlockCoverage":false},{"functionName":"fsync","ranges":[{"startOffset":106950,"endOffset":107022,"count":0}],"isBlockCoverage":false},{"functionName":"read","ranges":[{"startOffset":107028,"endOffset":107838,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":107845,"endOffset":108339,"count":0}],"isBlockCoverage":false},{"functionName":"get_char","ranges":[{"startOffset":108367,"endOffset":110000,"count":0}],"isBlockCoverage":false},{"functionName":"put_char","ranges":[{"startOffset":110010,"endOffset":110296,"count":0}],"isBlockCoverage":false},{"functionName":"fsync","ranges":[{"startOffset":110303,"endOffset":110473,"count":0}],"isBlockCoverage":false},{"functionName":"put_char","ranges":[{"startOffset":110502,"endOffset":110735,"count":0}],"isBlockCoverage":false},{"functionName":"fsync","ranges":[{"startOffset":110742,"endOffset":110912,"count":0}],"isBlockCoverage":false},{"functionName":"zeroMemory","ranges":[{"startOffset":110921,"endOffset":111032,"count":0}],"isBlockCoverage":false},{"functionName":"alignMemory","ranges":[{"startOffset":111038,"endOffset":111196,"count":0}],"isBlockCoverage":false},{"functionName":"mmapAlloc","ranges":[{"startOffset":111199,"endOffset":111391,"count":0}],"isBlockCoverage":false},{"functionName":"mount","ranges":[{"startOffset":111428,"endOffset":111524,"count":1}],"isBlockCoverage":true},{"functionName":"createNode","ranges":[{"startOffset":111536,"endOffset":114871,"count":597},{"startOffset":111622,"endOffset":111698,"count":0},{"startOffset":111729,"endOffset":113328,"count":1},{"startOffset":113421,"endOffset":113570,"count":10},{"startOffset":113570,"endOffset":114646,"count":587},{"startOffset":113602,"endOffset":114334,"count":579},{"startOffset":114334,"endOffset":114646,"count":8},{"startOffset":114366,"endOffset":114487,"count":3},{"startOffset":114487,"endOffset":114646,"count":5},{"startOffset":114746,"endOffset":114842,"count":596}],"isBlockCoverage":true},{"functionName":"getFileDataAsTypedArray","ranges":[{"startOffset":114896,"endOffset":115154,"count":0}],"isBlockCoverage":false},{"functionName":"expandFileStorage","ranges":[{"startOffset":115173,"endOffset":116304,"count":6423},{"startOffset":115267,"endOffset":115270,"count":0},{"startOffset":115313,"endOffset":115320,"count":4041},{"startOffset":115320,"endOffset":115886,"count":2382},{"startOffset":115886,"endOffset":115891,"count":2373},{"startOffset":115892,"endOffset":115899,"count":9},{"startOffset":115941,"endOffset":116254,"count":2382}],"isBlockCoverage":true},{"functionName":"resizeFileStorage","ranges":[{"startOffset":116323,"endOffset":116901,"count":0}],"isBlockCoverage":false},{"functionName":"getattr","ranges":[{"startOffset":116920,"endOffset":117954,"count":2457},{"startOffset":117055,"endOffset":117064,"count":0},{"startOffset":117275,"endOffset":117318,"count":0},{"startOffset":117403,"endOffset":117536,"count":0}],"isBlockCoverage":true},{"functionName":"setattr","ranges":[{"startOffset":117963,"endOffset":118293,"count":578},{"startOffset":118025,"endOffset":118073,"count":0},{"startOffset":118216,"endOffset":118283,"count":0}],"isBlockCoverage":true},{"functionName":"lookup","ranges":[{"startOffset":118301,"endOffset":118373,"count":2618}],"isBlockCoverage":true},{"functionName":"mknod","ranges":[{"startOffset":118380,"endOffset":118485,"count":593}],"isBlockCoverage":true},{"functionName":"rename","ranges":[{"startOffset":118493,"endOffset":119295,"count":0}],"isBlockCoverage":false},{"functionName":"unlink","ranges":[{"startOffset":119303,"endOffset":119418,"count":578}],"isBlockCoverage":true},{"functionName":"rmdir","ranges":[{"startOffset":119425,"endOffset":119684,"count":0}],"isBlockCoverage":false},{"functionName":"readdir","ranges":[{"startOffset":119693,"endOffset":119960,"count":0}],"isBlockCoverage":false},{"functionName":"symlink","ranges":[{"startOffset":119969,"endOffset":120152,"count":3}],"isBlockCoverage":true},{"functionName":"readlink","ranges":[{"startOffset":120162,"endOffset":120308,"count":3},{"startOffset":120216,"endOffset":120270,"count":0}],"isBlockCoverage":true},{"functionName":"read","ranges":[{"startOffset":120327,"endOffset":120896,"count":1308},{"startOffset":120476,"endOffset":120485,"count":580},{"startOffset":120485,"endOffset":120631,"count":728},{"startOffset":120633,"endOffset":120756,"count":728},{"startOffset":120756,"endOffset":120863,"count":0},{"startOffset":120863,"endOffset":120895,"count":728}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":120903,"endOffset":123174,"count":9497},{"startOffset":121438,"endOffset":121447,"count":0},{"startOffset":121573,"endOffset":121598,"count":8918},{"startOffset":121681,"endOffset":121929,"count":0},{"startOffset":121960,"endOffset":121977,"count":579},{"startOffset":121979,"endOffset":122242,"count":579},{"startOffset":122242,"endOffset":122484,"count":8918},{"startOffset":122289,"endOffset":122484,"count":2495},{"startOffset":122496,"endOffset":122729,"count":6423},{"startOffset":122731,"endOffset":122884,"count":6423},{"startOffset":122884,"endOffset":123067,"count":0},{"startOffset":123067,"endOffset":123173,"count":6423}],"isBlockCoverage":true},{"functionName":"llseek","ranges":[{"startOffset":123182,"endOffset":123599,"count":10805},{"startOffset":123278,"endOffset":123332,"count":0},{"startOffset":123356,"endOffset":123479,"count":0},{"startOffset":123508,"endOffset":123562,"count":0}],"isBlockCoverage":true},{"functionName":"allocate","ranges":[{"startOffset":123609,"endOffset":123802,"count":0}],"isBlockCoverage":false},{"functionName":"mmap","ranges":[{"startOffset":123808,"endOffset":125043,"count":0}],"isBlockCoverage":false},{"functionName":"msync","ranges":[{"startOffset":125050,"endOffset":125542,"count":0}],"isBlockCoverage":false},{"functionName":"asyncLoad","ranges":[{"startOffset":125587,"endOffset":126132,"count":0}],"isBlockCoverage":false},{"functionName":"lookupPath","ranges":[{"startOffset":129672,"endOffset":131635,"count":6242},{"startOffset":129765,"endOffset":129797,"count":0},{"startOffset":129978,"endOffset":130058,"count":0},{"startOffset":130317,"endOffset":131570,"count":5691},{"startOffset":130387,"endOffset":130401,"count":5664},{"startOffset":130403,"endOffset":130465,"count":1174},{"startOffset":130465,"endOffset":130694,"count":4517},{"startOffset":130694,"endOffset":130827,"count":0},{"startOffset":130827,"endOffset":131019,"count":2495},{"startOffset":131019,"endOffset":131033,"count":2468},{"startOffset":131035,"endOffset":131560,"count":2488},{"startOffset":131108,"endOffset":131548,"count":3},{"startOffset":131416,"endOffset":131534,"count":0},{"startOffset":131570,"endOffset":131634,"count":4220}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":130151,"endOffset":130161,"count":12511}],"isBlockCoverage":true},{"functionName":"getPath","ranges":[{"startOffset":131644,"endOffset":132019,"count":1164},{"startOffset":131695,"endOffset":132011,"count":1754},{"startOffset":131728,"endOffset":131911,"count":1164},{"startOffset":131800,"endOffset":131813,"count":578},{"startOffset":131813,"endOffset":131863,"count":586},{"startOffset":131863,"endOffset":131883,"count":0},{"startOffset":131884,"endOffset":131898,"count":586},{"startOffset":131911,"endOffset":131934,"count":590},{"startOffset":131934,"endOffset":131958,"count":4},{"startOffset":131959,"endOffset":131970,"count":586}],"isBlockCoverage":true},{"functionName":"hashName","ranges":[{"startOffset":132029,"endOffset":132269,"count":7445},{"startOffset":132122,"endOffset":132197,"count":166620}],"isBlockCoverage":true},{"functionName":"hashAddNode","ranges":[{"startOffset":132282,"endOffset":132440,"count":598}],"isBlockCoverage":true},{"functionName":"hashRemoveNode","ranges":[{"startOffset":132456,"endOffset":132907,"count":578},{"startOffset":132626,"endOffset":132899,"count":0}],"isBlockCoverage":true},{"functionName":"lookupNode","ranges":[{"startOffset":132919,"endOffset":133456,"count":6269},{"startOffset":133004,"endOffset":133067,"count":0},{"startOffset":133190,"endOffset":133341,"count":3651},{"startOffset":133341,"endOffset":133455,"count":2618}],"isBlockCoverage":true},{"functionName":"createNode","ranges":[{"startOffset":133468,"endOffset":133666,"count":598}],"isBlockCoverage":true},{"functionName":"destroyNode","ranges":[{"startOffset":133679,"endOffset":133731,"count":578}],"isBlockCoverage":true},{"functionName":"isRoot","ranges":[{"startOffset":133739,"endOffset":133795,"count":1754}],"isBlockCoverage":true},{"functionName":"isMountpoint","ranges":[{"startOffset":133809,"endOffset":133859,"count":3074}],"isBlockCoverage":true},{"functionName":"isFile","ranges":[{"startOffset":133867,"endOffset":133927,"count":3044}],"isBlockCoverage":true},{"functionName":"isDir","ranges":[{"startOffset":133934,"endOffset":133994,"count":15021}],"isBlockCoverage":true},{"functionName":"isLink","ranges":[{"startOffset":134002,"endOffset":134062,"count":3084}],"isBlockCoverage":true},{"functionName":"isChrdev","ranges":[{"startOffset":134072,"endOffset":134131,"count":3623}],"isBlockCoverage":true},{"functionName":"isBlkdev","ranges":[{"startOffset":134141,"endOffset":134201,"count":597}],"isBlockCoverage":true},{"functionName":"isFIFO","ranges":[{"startOffset":134209,"endOffset":134268,"count":597}],"isBlockCoverage":true},{"functionName":"isSocket","ranges":[{"startOffset":134278,"endOffset":134338,"count":0}],"isBlockCoverage":false},{"functionName":"modeStringToFlags","ranges":[{"startOffset":134418,"endOffset":134611,"count":0}],"isBlockCoverage":false},{"functionName":"flagsToPermissionString","ranges":[{"startOffset":134636,"endOffset":134787,"count":1160},{"startOffset":134722,"endOffset":134757,"count":0}],"isBlockCoverage":true},{"functionName":"nodePermissions","ranges":[{"startOffset":134804,"endOffset":135230,"count":8025},{"startOffset":134857,"endOffset":134888,"count":73},{"startOffset":134888,"endOffset":134983,"count":7952},{"startOffset":134983,"endOffset":135004,"count":579},{"startOffset":135006,"endOffset":135037,"count":0},{"startOffset":135037,"endOffset":135204,"count":7952},{"startOffset":135067,"endOffset":135088,"count":1157},{"startOffset":135090,"endOffset":135121,"count":0},{"startOffset":135151,"endOffset":135171,"count":7373},{"startOffset":135173,"endOffset":135204,"count":0},{"startOffset":135204,"endOffset":135229,"count":7952}],"isBlockCoverage":true},{"functionName":"mayLookup","ranges":[{"startOffset":135241,"endOffset":135410,"count":6269},{"startOffset":135325,"endOffset":135340,"count":0},{"startOffset":135375,"endOffset":135384,"count":0}],"isBlockCoverage":true},{"functionName":"mayCreate","ranges":[{"startOffset":135421,"endOffset":135605,"count":596}],"isBlockCoverage":true},{"functionName":"mayDelete","ranges":[{"startOffset":135616,"endOffset":136204,"count":578},{"startOffset":135725,"endOffset":135772,"count":0},{"startOffset":135847,"endOffset":135884,"count":0},{"startOffset":135904,"endOffset":136089,"count":0},{"startOffset":136132,"endOffset":136168,"count":0}],"isBlockCoverage":true},{"functionName":"mayOpen","ranges":[{"startOffset":136213,"endOffset":136676,"count":582},{"startOffset":136251,"endOffset":136283,"count":0},{"startOffset":136318,"endOffset":136350,"count":0},{"startOffset":136381,"endOffset":136592,"count":578},{"startOffset":136492,"endOffset":136582,"count":0}],"isBlockCoverage":true},{"functionName":"nextfd","ranges":[{"startOffset":136702,"endOffset":136924,"count":1161},{"startOffset":136800,"endOffset":136879,"count":6374},{"startOffset":136833,"endOffset":136869,"count":1161},{"startOffset":136879,"endOffset":136923,"count":0}],"isBlockCoverage":true},{"functionName":"getStream","ranges":[{"startOffset":136935,"endOffset":136957,"count":32733}],"isBlockCoverage":true},{"functionName":"createStream","ranges":[{"startOffset":136971,"endOffset":138668,"count":1161},{"startOffset":137029,"endOffset":138413,"count":1}],"isBlockCoverage":true},{"functionName":"FS.FSStream","ranges":[{"startOffset":137075,"endOffset":137130,"count":1161}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":137311,"endOffset":137343,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":137405,"endOffset":137439,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":137537,"endOffset":137588,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":137687,"endOffset":137738,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":137838,"endOffset":137880,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":137977,"endOffset":138017,"count":20303}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":138079,"endOffset":138121,"count":1161}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":138223,"endOffset":138266,"count":54027}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":138328,"endOffset":138373,"count":22772}],"isBlockCoverage":true},{"functionName":"closeStream","ranges":[{"startOffset":138681,"endOffset":138729,"count":1157}],"isBlockCoverage":true},{"functionName":"open","ranges":[{"startOffset":138754,"endOffset":139070,"count":4}],"isBlockCoverage":true},{"functionName":"llseek","ranges":[{"startOffset":139078,"endOffset":139134,"count":0}],"isBlockCoverage":false},{"functionName":"major","ranges":[{"startOffset":139142,"endOffset":139163,"count":0}],"isBlockCoverage":false},{"functionName":"minor","ranges":[{"startOffset":139170,"endOffset":139193,"count":0}],"isBlockCoverage":false},{"functionName":"makedev","ranges":[{"startOffset":139202,"endOffset":139232,"count":8}],"isBlockCoverage":true},{"functionName":"registerDevice","ranges":[{"startOffset":139248,"endOffset":139318,"count":5}],"isBlockCoverage":true},{"functionName":"getDevice","ranges":[{"startOffset":139329,"endOffset":139353,"count":4}],"isBlockCoverage":true},{"functionName":"getMounts","ranges":[{"startOffset":139364,"endOffset":139616,"count":0}],"isBlockCoverage":false},{"functionName":"syncfs","ranges":[{"startOffset":139624,"endOffset":140742,"count":0}],"isBlockCoverage":false},{"functionName":"mount","ranges":[{"startOffset":140749,"endOffset":142170,"count":2},{"startOffset":140816,"endOffset":140969,"count":0},{"startOffset":141081,"endOffset":141091,"count":1},{"startOffset":141093,"endOffset":141143,"count":0},{"startOffset":141159,"endOffset":141169,"count":1},{"startOffset":141171,"endOffset":141541,"count":1},{"startOffset":141383,"endOffset":141437,"count":0},{"startOffset":141477,"endOffset":141531,"count":0},{"startOffset":141850,"endOffset":142133,"count":1}],"isBlockCoverage":true},{"functionName":"unmount","ranges":[{"startOffset":142179,"endOffset":143132,"count":0}],"isBlockCoverage":false},{"functionName":"lookup","ranges":[{"startOffset":143140,"endOffset":143220,"count":2618}],"isBlockCoverage":true},{"functionName":"mknod","ranges":[{"startOffset":143227,"endOffset":143771,"count":593},{"startOffset":143436,"endOffset":143486,"count":0},{"startOffset":143558,"endOffset":143613,"count":0},{"startOffset":143650,"endOffset":143700,"count":0}],"isBlockCoverage":true},{"functionName":"create","ranges":[{"startOffset":143779,"endOffset":143948,"count":0}],"isBlockCoverage":false},{"functionName":"mkdir","ranges":[{"startOffset":143955,"endOffset":144129,"count":9},{"startOffset":144007,"endOffset":144013,"count":0}],"isBlockCoverage":true},{"functionName":"mkdirTree","ranges":[{"startOffset":144140,"endOffset":144465,"count":0}],"isBlockCoverage":false},{"functionName":"mkdev","ranges":[{"startOffset":144472,"endOffset":144672,"count":5},{"startOffset":144534,"endOffset":144600,"count":3}],"isBlockCoverage":true},{"functionName":"symlink","ranges":[{"startOffset":144681,"endOffset":145302,"count":3},{"startOffset":144744,"endOffset":144794,"count":0},{"startOffset":144913,"endOffset":144963,"count":0},{"startOffset":145084,"endOffset":145139,"count":0},{"startOffset":145178,"endOffset":145228,"count":0}],"isBlockCoverage":true},{"functionName":"rename","ranges":[{"startOffset":145310,"endOffset":148329,"count":0}],"isBlockCoverage":false},{"functionName":"rmdir","ranges":[{"startOffset":148336,"endOffset":148918,"count":0}],"isBlockCoverage":false},{"functionName":"readdir","ranges":[{"startOffset":148927,"endOffset":149169,"count":0}],"isBlockCoverage":false},{"functionName":"unlink","ranges":[{"startOffset":149177,"endOffset":150004,"count":578},{"startOffset":149304,"endOffset":149354,"count":0},{"startOffset":149521,"endOffset":149746,"count":0},{"startOffset":149784,"endOffset":149834,"count":0},{"startOffset":149870,"endOffset":149920,"count":0}],"isBlockCoverage":true},{"functionName":"readlink","ranges":[{"startOffset":150014,"endOffset":150352,"count":3},{"startOffset":150119,"endOffset":150169,"count":0},{"startOffset":150207,"endOffset":150257,"count":0}],"isBlockCoverage":true},{"functionName":"stat","ranges":[{"startOffset":150358,"endOffset":150689,"count":3900},{"startOffset":150500,"endOffset":150550,"count":0},{"startOffset":150550,"endOffset":150587,"count":2457},{"startOffset":150587,"endOffset":150637,"count":0},{"startOffset":150637,"endOffset":150688,"count":2457}],"isBlockCoverage":true},{"functionName":"lstat","ranges":[{"startOffset":150696,"endOffset":150751,"count":1}],"isBlockCoverage":true},{"functionName":"chmod","ranges":[{"startOffset":150758,"endOffset":151223,"count":0}],"isBlockCoverage":false},{"functionName":"lchmod","ranges":[{"startOffset":151231,"endOffset":151292,"count":0}],"isBlockCoverage":false},{"functionName":"fchmod","ranges":[{"startOffset":151300,"endOffset":151470,"count":0}],"isBlockCoverage":false},{"functionName":"chown","ranges":[{"startOffset":151477,"endOffset":151938,"count":578},{"startOffset":151566,"endOffset":151676,"count":0},{"startOffset":151753,"endOffset":151803,"count":0}],"isBlockCoverage":true},{"functionName":"lchown","ranges":[{"startOffset":151946,"endOffset":152015,"count":0}],"isBlockCoverage":false},{"functionName":"fchown","ranges":[{"startOffset":152023,"endOffset":152201,"count":578},{"startOffset":152103,"endOffset":152152,"count":0}],"isBlockCoverage":true},{"functionName":"truncate","ranges":[{"startOffset":152211,"endOffset":152996,"count":0}],"isBlockCoverage":false},{"functionName":"ftruncate","ranges":[{"startOffset":153007,"endOffset":153273,"count":0}],"isBlockCoverage":false},{"functionName":"utime","ranges":[{"startOffset":153280,"endOffset":153499,"count":0}],"isBlockCoverage":false},{"functionName":"open","ranges":[{"startOffset":153505,"endOffset":156438,"count":1161},{"startOffset":153555,"endOffset":153605,"count":0},{"startOffset":153647,"endOffset":153676,"count":0},{"startOffset":153728,"endOffset":153733,"count":3},{"startOffset":153745,"endOffset":153751,"count":1158},{"startOffset":153779,"endOffset":153830,"count":579},{"startOffset":153830,"endOffset":153867,"count":582},{"startOffset":153923,"endOffset":153957,"count":0},{"startOffset":154167,"endOffset":154212,"count":579},{"startOffset":154324,"endOffset":154685,"count":579},{"startOffset":154346,"endOffset":154532,"count":0},{"startOffset":154705,"endOffset":154755,"count":0},{"startOffset":154827,"endOffset":154863,"count":4},{"startOffset":154956,"endOffset":154979,"count":0},{"startOffset":154981,"endOffset":155031,"count":0},{"startOffset":155247,"endOffset":155390,"count":582},{"startOffset":155321,"endOffset":155380,"count":0},{"startOffset":155455,"endOffset":155466,"count":0},{"startOffset":155468,"endOffset":155511,"count":0},{"startOffset":156153,"endOffset":156206,"count":4},{"startOffset":156242,"endOffset":156257,"count":0},{"startOffset":156259,"endOffset":156407,"count":0}],"isBlockCoverage":true},{"functionName":"close","ranges":[{"startOffset":156445,"endOffset":156870,"count":1157},{"startOffset":156492,"endOffset":156541,"count":0},{"startOffset":156571,"endOffset":156594,"count":0},{"startOffset":156670,"endOffset":156728,"count":1},{"startOffset":156739,"endOffset":156779,"count":0}],"isBlockCoverage":true},{"functionName":"isClosed","ranges":[{"startOffset":156880,"endOffset":156936,"count":22768}],"isBlockCoverage":true},{"functionName":"llseek","ranges":[{"startOffset":156944,"endOffset":157418,"count":10805},{"startOffset":157007,"endOffset":157056,"count":0},{"startOffset":157116,"endOffset":157166,"count":0},{"startOffset":157191,"endOffset":157205,"count":0},{"startOffset":157206,"endOffset":157220,"count":0},{"startOffset":157222,"endOffset":157272,"count":0}],"isBlockCoverage":true},{"functionName":"read","ranges":[{"startOffset":157424,"endOffset":158298,"count":1309},{"startOffset":157512,"endOffset":157562,"count":0},{"startOffset":157596,"endOffset":157645,"count":0},{"startOffset":157690,"endOffset":157739,"count":0},{"startOffset":157780,"endOffset":157830,"count":0},{"startOffset":157868,"endOffset":157918,"count":0},{"startOffset":158044,"endOffset":158122,"count":0}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":158305,"endOffset":159364,"count":9497},{"startOffset":158401,"endOffset":158451,"count":0},{"startOffset":158485,"endOffset":158534,"count":0},{"startOffset":158579,"endOffset":158628,"count":0},{"startOffset":158669,"endOffset":158719,"count":0},{"startOffset":158758,"endOffset":158808,"count":0},{"startOffset":158861,"endOffset":158966,"count":0},{"startOffset":159092,"endOffset":159170,"count":0}],"isBlockCoverage":true},{"functionName":"allocate","ranges":[{"startOffset":159374,"endOffset":159955,"count":0}],"isBlockCoverage":false},{"functionName":"mmap","ranges":[{"startOffset":159961,"endOffset":160823,"count":0}],"isBlockCoverage":false},{"functionName":"msync","ranges":[{"startOffset":160830,"endOffset":161050,"count":0}],"isBlockCoverage":false},{"functionName":"munmap","ranges":[{"startOffset":161058,"endOffset":161071,"count":0}],"isBlockCoverage":false},{"functionName":"ioctl","ranges":[{"startOffset":161078,"endOffset":161256,"count":0}],"isBlockCoverage":false},{"functionName":"readFile","ranges":[{"startOffset":161266,"endOffset":161967,"count":0}],"isBlockCoverage":false},{"functionName":"writeFile","ranges":[{"startOffset":161978,"endOffset":162595,"count":0}],"isBlockCoverage":false},{"functionName":"cwd","ranges":[{"startOffset":162600,"endOffset":162620,"count":6243}],"isBlockCoverage":true},{"functionName":"chdir","ranges":[{"startOffset":162627,"endOffset":163058,"count":0}],"isBlockCoverage":false},{"functionName":"createDefaultDirectories","ranges":[{"startOffset":163084,"endOffset":163188,"count":1}],"isBlockCoverage":true},{"functionName":"createDefaultDevices","ranges":[{"startOffset":163210,"endOffset":164265,"count":1}],"isBlockCoverage":true},{"functionName":"read","ranges":[{"startOffset":163356,"endOffset":163363,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":163382,"endOffset":163429,"count":0}],"isBlockCoverage":false},{"functionName":"createSpecialDirectories","ranges":[{"startOffset":164291,"endOffset":165291,"count":1}],"isBlockCoverage":true},{"functionName":"mount","ranges":[{"startOffset":164593,"endOffset":165250,"count":1}],"isBlockCoverage":true},{"functionName":"lookup","ranges":[{"startOffset":164736,"endOffset":165198,"count":0}],"isBlockCoverage":false},{"functionName":"createStandardStreams","ranges":[{"startOffset":165314,"endOffset":166717,"count":1},{"startOffset":165756,"endOffset":165828,"count":0},{"startOffset":165924,"endOffset":166004,"count":0},{"startOffset":166101,"endOffset":166181,"count":0}],"isBlockCoverage":true},{"functionName":"ensureErrnoError","ranges":[{"startOffset":166735,"endOffset":168090,"count":2},{"startOffset":166770,"endOffset":168089,"count":1}],"isBlockCoverage":true},{"functionName":"ErrnoError","ranges":[{"startOffset":166823,"endOffset":167685,"count":1}],"isBlockCoverage":true},{"functionName":"ErrnoError.setErrno","ranges":[{"startOffset":166933,"endOffset":167171,"count":1},{"startOffset":167024,"endOffset":167159,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":167929,"endOffset":168080,"count":1}],"isBlockCoverage":true},{"functionName":"staticInit","ranges":[{"startOffset":168102,"endOffset":168411,"count":1}],"isBlockCoverage":true},{"functionName":"init","ranges":[{"startOffset":168417,"endOffset":169032,"count":1}],"isBlockCoverage":true},{"functionName":"quit","ranges":[{"startOffset":169038,"endOffset":169410,"count":0}],"isBlockCoverage":false},{"functionName":"getMode","ranges":[{"startOffset":169419,"endOffset":169568,"count":2},{"startOffset":169527,"endOffset":169539,"count":0}],"isBlockCoverage":true},{"functionName":"findObject","ranges":[{"startOffset":169580,"endOffset":169768,"count":0}],"isBlockCoverage":false},{"functionName":"analyzePath","ranges":[{"startOffset":169781,"endOffset":170804,"count":0}],"isBlockCoverage":false},{"functionName":"createPath","ranges":[{"startOffset":170816,"endOffset":171303,"count":0}],"isBlockCoverage":false},{"functionName":"createFile","ranges":[{"startOffset":171315,"endOffset":171555,"count":0}],"isBlockCoverage":false},{"functionName":"createDataFile","ranges":[{"startOffset":171571,"endOffset":172429,"count":0}],"isBlockCoverage":false},{"functionName":"createDevice","ranges":[{"startOffset":172443,"endOffset":174330,"count":2},{"startOffset":172543,"endOffset":172563,"count":0},{"startOffset":172658,"endOffset":172685,"count":1}],"isBlockCoverage":true},{"functionName":"open","ranges":[{"startOffset":172890,"endOffset":172952,"count":1}],"isBlockCoverage":true},{"functionName":"close","ranges":[{"startOffset":172971,"endOffset":173146,"count":1},{"startOffset":173051,"endOffset":173067,"count":0},{"startOffset":173068,"endOffset":173091,"count":0},{"startOffset":173093,"endOffset":173134,"count":0}],"isBlockCoverage":true},{"functionName":"read","ranges":[{"startOffset":173164,"endOffset":173871,"count":1},{"startOffset":173297,"endOffset":173736,"count":256},{"startOffset":173395,"endOffset":173467,"count":0},{"startOffset":173507,"endOffset":173525,"count":0},{"startOffset":173527,"endOffset":173588,"count":0},{"startOffset":173648,"endOffset":173654,"count":0}],"isBlockCoverage":true},{"functionName":"write","ranges":[{"startOffset":173890,"endOffset":174268,"count":0}],"isBlockCoverage":false},{"functionName":"forceLoadFile","ranges":[{"startOffset":174345,"endOffset":175228,"count":0}],"isBlockCoverage":false},{"functionName":"createLazyFile","ranges":[{"startOffset":175244,"endOffset":182829,"count":0}],"isBlockCoverage":false},{"functionName":"createPreloadedFile","ranges":[{"startOffset":182850,"endOffset":184085,"count":0}],"isBlockCoverage":false},{"functionName":"indexedDB","ranges":[{"startOffset":184096,"endOffset":184215,"count":0}],"isBlockCoverage":false},{"functionName":"DB_NAME","ranges":[{"startOffset":184224,"endOffset":184291,"count":0}],"isBlockCoverage":false},{"functionName":"saveFilesToDB","ranges":[{"startOffset":184346,"endOffset":185592,"count":0}],"isBlockCoverage":false},{"functionName":"loadFilesFromDB","ranges":[{"startOffset":185609,"endOffset":187062,"count":0}],"isBlockCoverage":false},{"functionName":"absolutePath","ranges":[{"startOffset":187076,"endOffset":187171,"count":0}],"isBlockCoverage":false},{"functionName":"createFolder","ranges":[{"startOffset":187185,"endOffset":187273,"count":0}],"isBlockCoverage":false},{"functionName":"createLink","ranges":[{"startOffset":187285,"endOffset":187373,"count":0}],"isBlockCoverage":false},{"functionName":"joinPath","ranges":[{"startOffset":187383,"endOffset":187468,"count":0}],"isBlockCoverage":false},{"functionName":"mmapAlloc","ranges":[{"startOffset":187479,"endOffset":187579,"count":0}],"isBlockCoverage":false},{"functionName":"standardizePath","ranges":[{"startOffset":187596,"endOffset":187693,"count":0}],"isBlockCoverage":false},{"functionName":"calculateAt","ranges":[{"startOffset":187745,"endOffset":188254,"count":1736},{"startOffset":187845,"endOffset":188253,"count":0}],"isBlockCoverage":true},{"functionName":"doStat","ranges":[{"startOffset":188262,"endOffset":191133,"count":3900},{"startOffset":188347,"endOffset":188612,"count":1443},{"startOffset":188385,"endOffset":188447,"count":0},{"startOffset":188449,"endOffset":188583,"count":0},{"startOffset":188612,"endOffset":189021,"count":2457},{"startOffset":189021,"endOffset":189202,"count":1873},{"startOffset":189120,"endOffset":189201,"count":0},{"startOffset":189203,"endOffset":189206,"count":584},{"startOffset":189529,"endOffset":189710,"count":2457},{"startOffset":189628,"endOffset":189709,"count":0},{"startOffset":189711,"endOffset":189714,"count":0},{"startOffset":189986,"endOffset":190167,"count":2457},{"startOffset":190085,"endOffset":190166,"count":0},{"startOffset":190168,"endOffset":190171,"count":0},{"startOffset":190443,"endOffset":190624,"count":2457},{"startOffset":190542,"endOffset":190623,"count":0},{"startOffset":190625,"endOffset":190628,"count":0},{"startOffset":190838,"endOffset":191019,"count":2457},{"startOffset":190937,"endOffset":191018,"count":0},{"startOffset":191020,"endOffset":191023,"count":0}],"isBlockCoverage":true},{"functionName":"doMsync","ranges":[{"startOffset":191142,"endOffset":191301,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":191324,"endOffset":191499,"count":1158}],"isBlockCoverage":true},{"functionName":"getStr","ranges":[{"startOffset":191507,"endOffset":191587,"count":4335}],"isBlockCoverage":true},{"functionName":"getStreamFromFD","ranges":[{"startOffset":191604,"endOffset":191737,"count":32155},{"startOffset":191679,"endOffset":191706,"count":0}],"isBlockCoverage":true},{"functionName":"___syscall_chmod","ranges":[{"startOffset":191742,"endOffset":191995,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_faccessat","ranges":[{"startOffset":191999,"endOffset":192784,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_fchmod","ranges":[{"startOffset":192788,"endOffset":193003,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_fchown32","ranges":[{"startOffset":193007,"endOffset":193240,"count":578},{"startOffset":193124,"endOffset":193236,"count":0}],"isBlockCoverage":true},{"functionName":"setErrNo","ranges":[{"startOffset":193244,"endOffset":193346,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_fcntl64","ranges":[{"startOffset":193349,"endOffset":195332,"count":5774},{"startOffset":193516,"endOffset":193740,"count":0},{"startOffset":193749,"endOffset":193756,"count":0},{"startOffset":193765,"endOffset":193792,"count":0},{"startOffset":193853,"endOffset":193891,"count":0},{"startOffset":193900,"endOffset":194006,"count":0},{"startOffset":194015,"endOffset":194360,"count":0},{"startOffset":194792,"endOffset":194800,"count":0},{"startOffset":194809,"endOffset":194838,"count":0},{"startOffset":194915,"endOffset":195150,"count":0},{"startOffset":195159,"endOffset":195201,"count":0},{"startOffset":195216,"endOffset":195328,"count":0}],"isBlockCoverage":true},{"functionName":"___syscall_fstat64","ranges":[{"startOffset":195336,"endOffset":195614,"count":1301},{"startOffset":195498,"endOffset":195610,"count":0}],"isBlockCoverage":true},{"functionName":"convertI32PairToI53Checked","ranges":[{"startOffset":195618,"endOffset":195918,"count":10805},{"startOffset":195694,"endOffset":195709,"count":0},{"startOffset":195906,"endOffset":195911,"count":0}],"isBlockCoverage":true},{"functionName":"___syscall_ftruncate64","ranges":[{"startOffset":195921,"endOffset":196268,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_getcwd","ranges":[{"startOffset":196272,"endOffset":196674,"count":1},{"startOffset":196345,"endOffset":196356,"count":0},{"startOffset":196473,"endOffset":196484,"count":0},{"startOffset":196558,"endOffset":196670,"count":0}],"isBlockCoverage":true},{"functionName":"___syscall_lstat64","ranges":[{"startOffset":196678,"endOffset":196939,"count":1},{"startOffset":196902,"endOffset":196910,"count":0}],"isBlockCoverage":true},{"functionName":"___syscall_mkdirat","ranges":[{"startOffset":196943,"endOffset":197502,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_newfstatat","ranges":[{"startOffset":197506,"endOffset":197996,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_openat","ranges":[{"startOffset":198000,"endOffset":198396,"count":1158},{"startOffset":198225,"endOffset":198228,"count":0},{"startOffset":198280,"endOffset":198392,"count":0}],"isBlockCoverage":true},{"functionName":"___syscall_readlinkat","ranges":[{"startOffset":198400,"endOffset":199176,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_rmdir","ranges":[{"startOffset":199180,"endOffset":199421,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_stat64","ranges":[{"startOffset":199425,"endOffset":199684,"count":2598},{"startOffset":199568,"endOffset":199680,"count":1442},{"startOffset":199647,"endOffset":199655,"count":0}],"isBlockCoverage":true},{"functionName":"___syscall_unlinkat","ranges":[{"startOffset":199688,"endOffset":200154,"count":578},{"startOffset":199891,"endOffset":200015,"count":0},{"startOffset":200038,"endOffset":200150,"count":0}],"isBlockCoverage":true},{"functionName":"readI53FromI64","ranges":[{"startOffset":200158,"endOffset":200256,"count":0}],"isBlockCoverage":false},{"functionName":"___syscall_utimensat","ranges":[{"startOffset":200259,"endOffset":201053,"count":0}],"isBlockCoverage":false},{"functionName":"__emscripten_date_now","ranges":[{"startOffset":201057,"endOffset":201122,"count":0}],"isBlockCoverage":false},{"functionName":"__emscripten_get_now_is_monotonic","ranges":[{"startOffset":201156,"endOffset":201237,"count":0}],"isBlockCoverage":false},{"functionName":"__localtime_js","ranges":[{"startOffset":201241,"endOffset":202344,"count":0}],"isBlockCoverage":false},{"functionName":"__mmap_js","ranges":[{"startOffset":202348,"endOffset":202736,"count":0}],"isBlockCoverage":false},{"functionName":"__munmap_js","ranges":[{"startOffset":202740,"endOffset":203096,"count":0}],"isBlockCoverage":false},{"functionName":"allocateUTF8","ranges":[{"startOffset":203100,"endOffset":203283,"count":0}],"isBlockCoverage":false},{"functionName":"_tzset_impl","ranges":[{"startOffset":203286,"endOffset":205190,"count":0}],"isBlockCoverage":false},{"functionName":"__tzset_js","ranges":[{"startOffset":205193,"endOffset":205445,"count":0}],"isBlockCoverage":false},{"functionName":"getHeapMax","ranges":[{"startOffset":205449,"endOffset":205807,"count":0}],"isBlockCoverage":false},{"functionName":"_emscripten_get_heap_max","ranges":[{"startOffset":205810,"endOffset":205880,"count":0}],"isBlockCoverage":false},{"functionName":"_emscripten_get_now","ranges":[{"startOffset":205961,"endOffset":206047,"count":0}],"isBlockCoverage":false},{"functionName":"_emscripten_get_now","ranges":[{"startOffset":206080,"endOffset":206103,"count":0}],"isBlockCoverage":false},{"functionName":"_emscripten_memcpy_big","ranges":[{"startOffset":206112,"endOffset":206214,"count":2564}],"isBlockCoverage":true},{"functionName":"emscripten_realloc_buffer","ranges":[{"startOffset":206218,"endOffset":206837,"count":0}],"isBlockCoverage":false},{"functionName":"_emscripten_resize_heap","ranges":[{"startOffset":206840,"endOffset":209658,"count":0}],"isBlockCoverage":false},{"functionName":"getExecutableName","ranges":[{"startOffset":209681,"endOffset":209763,"count":1},{"startOffset":209737,"endOffset":209756,"count":0}],"isBlockCoverage":true},{"functionName":"getEnvStrings","ranges":[{"startOffset":209766,"endOffset":210853,"count":2},{"startOffset":209827,"endOffset":210811,"count":1},{"startOffset":209950,"endOffset":209972,"count":0},{"startOffset":209973,"endOffset":209998,"count":0},{"startOffset":210350,"endOffset":210655,"count":0},{"startOffset":210709,"endOffset":210762,"count":7}],"isBlockCoverage":true},{"functionName":"writeAsciiToMemory","ranges":[{"startOffset":210898,"endOffset":211229,"count":7},{"startOffset":210997,"endOffset":211124,"count":123}],"isBlockCoverage":true},{"functionName":"_environ_get","ranges":[{"startOffset":211232,"endOffset":211555,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":211333,"endOffset":211531,"count":7}],"isBlockCoverage":true},{"functionName":"_environ_sizes_get","ranges":[{"startOffset":211559,"endOffset":211900,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":211761,"endOffset":211825,"count":7}],"isBlockCoverage":true},{"functionName":"_fd_close","ranges":[{"startOffset":211904,"endOffset":212150,"count":1157},{"startOffset":212035,"endOffset":212146,"count":0}],"isBlockCoverage":true},{"functionName":"_fd_fdstat_get","ranges":[{"startOffset":212154,"endOffset":213469,"count":0}],"isBlockCoverage":false},{"functionName":"doReadv","ranges":[{"startOffset":213506,"endOffset":213916,"count":1309},{"startOffset":213798,"endOffset":213808,"count":0},{"startOffset":213854,"endOffset":213860,"count":580}],"isBlockCoverage":true},{"functionName":"_fd_read","ranges":[{"startOffset":213919,"endOffset":214239,"count":1309},{"startOffset":214124,"endOffset":214235,"count":0}],"isBlockCoverage":true},{"functionName":"_fd_seek","ranges":[{"startOffset":214243,"endOffset":215128,"count":10805},{"startOffset":214413,"endOffset":214423,"count":0},{"startOffset":214613,"endOffset":214794,"count":9070},{"startOffset":214712,"endOffset":214793,"count":0},{"startOffset":214795,"endOffset":214798,"count":1735},{"startOffset":214911,"endOffset":214926,"count":0},{"startOffset":214927,"endOffset":214942,"count":0},{"startOffset":214944,"endOffset":214967,"count":0},{"startOffset":215013,"endOffset":215124,"count":0}],"isBlockCoverage":true},{"functionName":"_fd_sync","ranges":[{"startOffset":215132,"endOffset":215544,"count":2312},{"startOffset":215272,"endOffset":215329,"count":0},{"startOffset":215429,"endOffset":215540,"count":0}],"isBlockCoverage":true},{"functionName":"doWritev","ranges":[{"startOffset":215581,"endOffset":215938,"count":9497},{"startOffset":215875,"endOffset":215885,"count":0}],"isBlockCoverage":true},{"functionName":"_fd_write","ranges":[{"startOffset":215941,"endOffset":216263,"count":9497},{"startOffset":216148,"endOffset":216259,"count":0}],"isBlockCoverage":true},{"functionName":"uleb128Encode","ranges":[{"startOffset":216267,"endOffset":216447,"count":0}],"isBlockCoverage":false},{"functionName":"sigToWasmTypes","ranges":[{"startOffset":216453,"endOffset":216927,"count":0}],"isBlockCoverage":false},{"functionName":"convertJsFunctionToWasm","ranges":[{"startOffset":216930,"endOffset":219450,"count":0}],"isBlockCoverage":false},{"functionName":"getWasmTableEntry","ranges":[{"startOffset":219484,"endOffset":219875,"count":0}],"isBlockCoverage":false},{"functionName":"updateTableMap","ranges":[{"startOffset":219878,"endOffset":220187,"count":0}],"isBlockCoverage":false},{"functionName":"getEmptyTableSlot","ranges":[{"startOffset":220264,"endOffset":220716,"count":0}],"isBlockCoverage":false},{"functionName":"setWasmTableEntry","ranges":[{"startOffset":220722,"endOffset":221092,"count":0}],"isBlockCoverage":false},{"functionName":"addFunction","ranges":[{"startOffset":221125,"endOffset":222216,"count":0}],"isBlockCoverage":false},{"functionName":"removeFunction","ranges":[{"startOffset":222220,"endOffset":222354,"count":0}],"isBlockCoverage":false},{"functionName":"allocate","ranges":[{"startOffset":222408,"endOffset":222912,"count":0}],"isBlockCoverage":false},{"functionName":"AsciiToString","ranges":[{"startOffset":222918,"endOffset":223107,"count":0}],"isBlockCoverage":false},{"functionName":"stringToAscii","ranges":[{"startOffset":223111,"endOffset":223207,"count":0}],"isBlockCoverage":false},{"functionName":"UTF16ToString","ranges":[{"startOffset":223310,"endOffset":224724,"count":0}],"isBlockCoverage":false},{"functionName":"stringToUTF16","ranges":[{"startOffset":224728,"endOffset":225880,"count":0}],"isBlockCoverage":false},{"functionName":"lengthBytesUTF16","ranges":[{"startOffset":225884,"endOffset":225949,"count":0}],"isBlockCoverage":false},{"functionName":"UTF32ToString","ranges":[{"startOffset":225953,"endOffset":226902,"count":0}],"isBlockCoverage":false},{"functionName":"stringToUTF32","ranges":[{"startOffset":226906,"endOffset":228340,"count":0}],"isBlockCoverage":false},{"functionName":"lengthBytesUTF32","ranges":[{"startOffset":228344,"endOffset":228896,"count":0}],"isBlockCoverage":false},{"functionName":"allocateUTF8OnStack","ranges":[{"startOffset":228901,"endOffset":229085,"count":142}],"isBlockCoverage":true},{"functionName":"writeStringToMemory","ranges":[{"startOffset":229140,"endOffset":229861,"count":0}],"isBlockCoverage":false},{"functionName":"intArrayToString","ranges":[{"startOffset":229868,"endOffset":230286,"count":0}],"isBlockCoverage":false},{"functionName":"getCFunc","ranges":[{"startOffset":230291,"endOffset":230501,"count":2920}],"isBlockCoverage":true},{"functionName":"ccall","ranges":[{"startOffset":230662,"endOffset":232224,"count":2920},{"startOffset":231762,"endOffset":232000,"count":7326},{"startOffset":231833,"endOffset":231939,"count":577},{"startOffset":231939,"endOffset":231990,"count":6749}],"isBlockCoverage":true},{"functionName":"string","ranges":[{"startOffset":230805,"endOffset":231160,"count":577}],"isBlockCoverage":true},{"functionName":"array","ranges":[{"startOffset":231179,"endOffset":231305,"count":0}],"isBlockCoverage":false},{"functionName":"convertReturnValue","ranges":[{"startOffset":231324,"endOffset":231541,"count":2920},{"startOffset":231396,"endOffset":231454,"count":1023},{"startOffset":231454,"endOffset":231493,"count":1897},{"startOffset":231493,"endOffset":231513,"count":0},{"startOffset":231513,"endOffset":231540,"count":1897}],"isBlockCoverage":true},{"functionName":"onDone","ranges":[{"startOffset":232056,"endOffset":232172,"count":2920},{"startOffset":232104,"endOffset":232124,"count":577}],"isBlockCoverage":true},{"functionName":"cwrap","ranges":[{"startOffset":232343,"endOffset":232502,"count":40}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":232408,"endOffset":232496,"count":2920}],"isBlockCoverage":true},{"functionName":"FSNode","ranges":[{"startOffset":232541,"endOffset":232891,"count":598},{"startOffset":232595,"endOffset":232659,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":233049,"endOffset":233116,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":233147,"endOffset":233227,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":233275,"endOffset":233344,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":233375,"endOffset":233457,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":233508,"endOffset":233559,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":233610,"endOffset":233664,"count":0}],"isBlockCoverage":false},{"functionName":"checkIncomingModuleAPI","ranges":[{"startOffset":236387,"endOffset":236462,"count":1}],"isBlockCoverage":true},{"functionName":"Module._emscripten_stack_init","ranges":[{"startOffset":244437,"endOffset":244585,"count":1}],"isBlockCoverage":true},{"functionName":"Module._emscripten_stack_get_free","ranges":[{"startOffset":244692,"endOffset":244852,"count":0}],"isBlockCoverage":false},{"functionName":"Module._emscripten_stack_get_base","ranges":[{"startOffset":244959,"endOffset":245119,"count":0}],"isBlockCoverage":false},{"functionName":"Module._emscripten_stack_get_end","ranges":[{"startOffset":245224,"endOffset":245381,"count":1}],"isBlockCoverage":true},{"functionName":"runCaller","ranges":[{"startOffset":254861,"endOffset":255134,"count":1},{"startOffset":255044,"endOffset":255078,"count":0}],"isBlockCoverage":true},{"functionName":"stackCheckInit","ranges":[{"startOffset":255137,"endOffset":255458,"count":1}],"isBlockCoverage":true},{"functionName":"run","ranges":[{"startOffset":255492,"endOffset":256522,"count":2},{"startOffset":255570,"endOffset":255711,"count":1},{"startOffset":255711,"endOffset":255728,"count":0},{"startOffset":255728,"endOffset":256298,"count":1},{"startOffset":256298,"endOffset":256472,"count":0},{"startOffset":256472,"endOffset":256521,"count":1}],"isBlockCoverage":true},{"functionName":"doRun","ranges":[{"startOffset":255732,"endOffset":256269,"count":1},{"startOffset":255930,"endOffset":255937,"count":0},{"startOffset":256008,"endOffset":256015,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":256354,"endOffset":256463,"count":0}],"isBlockCoverage":false},{"functionName":"checkUnflushedContent","ranges":[{"startOffset":256524,"endOffset":258015,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":258881,"endOffset":258913,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1138","url":"node:crypto","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7818,"count":1}],"isBlockCoverage":false},{"functionName":"createHash","ranges":[{"startOffset":3343,"endOffset":3425,"count":44}],"isBlockCoverage":true},{"functionName":"createCipher","ranges":[{"startOffset":3427,"endOffset":3527,"count":0}],"isBlockCoverage":false},{"functionName":"createCipheriv","ranges":[{"startOffset":3529,"endOffset":3631,"count":0}],"isBlockCoverage":false},{"functionName":"createDecipher","ranges":[{"startOffset":3633,"endOffset":3737,"count":0}],"isBlockCoverage":false},{"functionName":"createDecipheriv","ranges":[{"startOffset":3739,"endOffset":3845,"count":0}],"isBlockCoverage":false},{"functionName":"createDiffieHellman","ranges":[{"startOffset":3847,"endOffset":4003,"count":0}],"isBlockCoverage":false},{"functionName":"createDiffieHellmanGroup","ranges":[{"startOffset":4005,"endOffset":4087,"count":0}],"isBlockCoverage":false},{"functionName":"createECDH","ranges":[{"startOffset":4089,"endOffset":4145,"count":0}],"isBlockCoverage":false},{"functionName":"createHmac","ranges":[{"startOffset":4147,"endOffset":4229,"count":0}],"isBlockCoverage":false},{"functionName":"createSign","ranges":[{"startOffset":4231,"endOffset":4313,"count":0}],"isBlockCoverage":false},{"functionName":"createVerify","ranges":[{"startOffset":4315,"endOffset":4401,"count":0}],"isBlockCoverage":false},{"functionName":"setFipsForced","ranges":[{"startOffset":5532,"endOffset":5620,"count":0}],"isBlockCoverage":false},{"functionName":"getFipsForced","ranges":[{"startOffset":5622,"endOffset":5662,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":6914,"endOffset":6979,"count":3}],"isBlockCoverage":true}]},{"scriptId":"1139","url":"node:internal/crypto/random","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15171,"count":1}],"isBlockCoverage":false},{"functionName":"assertOffset","ranges":[{"startOffset":1145,"endOffset":1511,"count":256},{"startOffset":1380,"endOffset":1462,"count":0}],"isBlockCoverage":true},{"functionName":"assertSize","ranges":[{"startOffset":1513,"endOffset":1974,"count":512},{"startOffset":1692,"endOffset":1810,"count":0},{"startOffset":1842,"endOffset":1927,"count":0}],"isBlockCoverage":true},{"functionName":"randomBytes","ranges":[{"startOffset":1976,"endOffset":2507,"count":256},{"startOffset":2088,"endOffset":2125,"count":0},{"startOffset":2256,"endOffset":2506,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2360,"endOffset":2503,"count":0}],"isBlockCoverage":false},{"functionName":"randomFillSync","ranges":[{"startOffset":2509,"endOffset":3177,"count":256},{"startOffset":2587,"endOffset":2613,"count":0},{"startOffset":2615,"endOffset":2723,"count":0},{"startOffset":2865,"endOffset":2906,"count":0},{"startOffset":3007,"endOffset":3018,"count":0},{"startOffset":3150,"endOffset":3160,"count":0}],"isBlockCoverage":true},{"functionName":"randomFill","ranges":[{"startOffset":3179,"endOffset":4213,"count":0}],"isBlockCoverage":false},{"functionName":"randomInt","ranges":[{"startOffset":4763,"endOffset":6990,"count":0}],"isBlockCoverage":false},{"functionName":"asyncRefillRandomIntCache","ranges":[{"startOffset":6992,"endOffset":7868,"count":0}],"isBlockCoverage":false},{"functionName":"onJobDone","ranges":[{"startOffset":7871,"endOffset":8033,"count":0}],"isBlockCoverage":false},{"functionName":"getRandomValues","ranges":[{"startOffset":8265,"endOffset":8881,"count":0}],"isBlockCoverage":false},{"functionName":"getHexBytes","ranges":[{"startOffset":9246,"endOffset":9545,"count":0}],"isBlockCoverage":false},{"functionName":"serializeUUID","ranges":[{"startOffset":9547,"endOffset":10273,"count":0}],"isBlockCoverage":false},{"functionName":"getBufferedUUID","ranges":[{"startOffset":10275,"endOffset":10578,"count":0}],"isBlockCoverage":false},{"functionName":"getUnbufferedUUID","ranges":[{"startOffset":10580,"endOffset":10818,"count":0}],"isBlockCoverage":false},{"functionName":"randomUUID","ranges":[{"startOffset":10820,"endOffset":11140,"count":0}],"isBlockCoverage":false},{"functionName":"createRandomPrimeJob","ranges":[{"startOffset":11142,"endOffset":12375,"count":0}],"isBlockCoverage":false},{"functionName":"generatePrime","ranges":[{"startOffset":12377,"endOffset":12821,"count":0}],"isBlockCoverage":false},{"functionName":"generatePrimeSync","ranges":[{"startOffset":12823,"endOffset":13081,"count":0}],"isBlockCoverage":false},{"functionName":"arrayBufferToUnsignedBigInt","ranges":[{"startOffset":13083,"endOffset":13202,"count":0}],"isBlockCoverage":false},{"functionName":"unsignedBigIntToBuffer","ranges":[{"startOffset":13204,"endOffset":13469,"count":0}],"isBlockCoverage":false},{"functionName":"checkPrime","ranges":[{"startOffset":13471,"endOffset":14268,"count":0}],"isBlockCoverage":false},{"functionName":"checkPrimeSync","ranges":[{"startOffset":14270,"endOffset":14984,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1140","url":"node:internal/crypto/pbkdf2","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3636,"count":1}],"isBlockCoverage":false},{"functionName":"pbkdf2","ranges":[{"startOffset":595,"endOffset":1393,"count":0}],"isBlockCoverage":false},{"functionName":"pbkdf2Sync","ranges":[{"startOffset":1395,"endOffset":1909,"count":0}],"isBlockCoverage":false},{"functionName":"check","ranges":[{"startOffset":1911,"endOffset":2382,"count":0}],"isBlockCoverage":false},{"functionName":"pbkdf2DeriveBits","ranges":[{"startOffset":2384,"endOffset":3568,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1141","url":"node:internal/crypto/util","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10500,"count":1}],"isBlockCoverage":false},{"functionName":"lazyRequire","ranges":[{"startOffset":1190,"endOffset":1345,"count":3},{"startOffset":1284,"endOffset":1329,"count":1}],"isBlockCoverage":true},{"functionName":"setDefaultEncoding","ranges":[{"startOffset":1380,"endOffset":1441,"count":0}],"isBlockCoverage":false},{"functionName":"getDefaultEncoding","ranges":[{"startOffset":1443,"endOffset":1502,"count":0}],"isBlockCoverage":false},{"functionName":"toBuf","ranges":[{"startOffset":1677,"endOffset":1856,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1890,"endOffset":1933,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1967,"endOffset":2009,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2043,"endOffset":2085,"count":0}],"isBlockCoverage":false},{"functionName":"setEngine","ranges":[{"startOffset":2089,"endOffset":2400,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2447,"endOffset":2910,"count":0}],"isBlockCoverage":false},{"functionName":"validateMaxBufferLength","ranges":[{"startOffset":4180,"endOffset":4393,"count":0}],"isBlockCoverage":false},{"functionName":"normalizeAlgorithm","ranges":[{"startOffset":4395,"endOffset":5383,"count":0}],"isBlockCoverage":false},{"functionName":"hasAnyNotIn","ranges":[{"startOffset":5385,"endOffset":5524,"count":0}],"isBlockCoverage":false},{"functionName":"validateBitLength","ranges":[{"startOffset":5526,"endOffset":5868,"count":0}],"isBlockCoverage":false},{"functionName":"validateByteLength","ranges":[{"startOffset":5870,"endOffset":6066,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6111,"endOffset":6380,"count":0}],"isBlockCoverage":false},{"functionName":"onDone","ranges":[{"startOffset":6384,"endOffset":6648,"count":0}],"isBlockCoverage":false},{"functionName":"jobPromise","ranges":[{"startOffset":6650,"endOffset":6813,"count":0}],"isBlockCoverage":false},{"functionName":"bigIntArrayToUnsignedInt","ranges":[{"startOffset":7349,"endOffset":7629,"count":0}],"isBlockCoverage":false},{"functionName":"bigIntArrayToUnsignedBigInt","ranges":[{"startOffset":7631,"endOffset":7867,"count":0}],"isBlockCoverage":false},{"functionName":"getStringOption","ranges":[{"startOffset":7869,"endOffset":8034,"count":0}],"isBlockCoverage":false},{"functionName":"getUsagesUnion","ranges":[{"startOffset":8036,"endOffset":8248,"count":0}],"isBlockCoverage":false},{"functionName":"getHashLength","ranges":[{"startOffset":8250,"endOffset":8430,"count":0}],"isBlockCoverage":false},{"functionName":"validateKeyOps","ranges":[{"startOffset":8569,"endOffset":9535,"count":0}],"isBlockCoverage":false},{"functionName":"secureHeapUsed","ranges":[{"startOffset":9537,"endOffset":9920,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1142","url":"node:internal/crypto/hashnames","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2519,"count":1}],"isBlockCoverage":false},{"functionName":"normalizeHashName","ranges":[{"startOffset":1889,"endOffset":2132,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1143","url":"node:internal/crypto/scrypt","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3595,"count":1}],"isBlockCoverage":false},{"functionName":"scrypt","ranges":[{"startOffset":647,"endOffset":1447,"count":0}],"isBlockCoverage":false},{"functionName":"scryptSync","ranges":[{"startOffset":1449,"endOffset":1964,"count":0}],"isBlockCoverage":false},{"functionName":"check","ranges":[{"startOffset":1966,"endOffset":3547,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1144","url":"node:internal/crypto/hkdf","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3646,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":880,"endOffset":1334,"count":0}],"isBlockCoverage":false},{"functionName":"prepareKey","ranges":[{"startOffset":1338,"endOffset":1766,"count":0}],"isBlockCoverage":false},{"functionName":"hkdf","ranges":[{"startOffset":1768,"endOffset":2222,"count":0}],"isBlockCoverage":false},{"functionName":"hkdfSync","ranges":[{"startOffset":2224,"endOffset":2562,"count":0}],"isBlockCoverage":false},{"functionName":"hkdfDeriveBits","ranges":[{"startOffset":2564,"endOffset":3584,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1145","url":"node:internal/crypto/keys","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20512,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2236,"endOffset":6188,"count":1}],"isBlockCoverage":true},{"functionName":"KeyObject","ranges":[{"startOffset":2346,"endOffset":2887,"count":0}],"isBlockCoverage":false},{"functionName":"get type","ranges":[{"startOffset":2893,"endOffset":2940,"count":0}],"isBlockCoverage":false},{"functionName":"from","ranges":[{"startOffset":2953,"endOffset":3094,"count":0}],"isBlockCoverage":false},{"functionName":"equals","ranges":[{"startOffset":3100,"endOffset":3384,"count":0}],"isBlockCoverage":false},{"functionName":"SecretKeyObject","ranges":[{"startOffset":3438,"endOffset":3496,"count":0}],"isBlockCoverage":false},{"functionName":"get symmetricKeySize","ranges":[{"startOffset":3502,"endOffset":3582,"count":0}],"isBlockCoverage":false},{"functionName":"export","ranges":[{"startOffset":3588,"endOffset":3936,"count":0}],"isBlockCoverage":false},{"functionName":"normalizeKeyDetails","ranges":[{"startOffset":4069,"endOffset":4337,"count":0}],"isBlockCoverage":false},{"functionName":"AsymmetricKeyObject","ranges":[{"startOffset":4446,"endOffset":4506,"count":0}],"isBlockCoverage":false},{"functionName":"get asymmetricKeyType","ranges":[{"startOffset":4512,"endOffset":4664,"count":0}],"isBlockCoverage":false},{"functionName":"get asymmetricKeyDetails","ranges":[{"startOffset":4670,"endOffset":5046,"count":0}],"isBlockCoverage":false},{"functionName":"PublicKeyObject","ranges":[{"startOffset":5110,"endOffset":5168,"count":0}],"isBlockCoverage":false},{"functionName":"export","ranges":[{"startOffset":5174,"endOffset":5464,"count":0}],"isBlockCoverage":false},{"functionName":"PrivateKeyObject","ranges":[{"startOffset":5529,"endOffset":5588,"count":0}],"isBlockCoverage":false},{"functionName":"export","ranges":[{"startOffset":5594,"endOffset":6107,"count":0}],"isBlockCoverage":false},{"functionName":"parseKeyFormat","ranges":[{"startOffset":6192,"endOffset":6577,"count":0}],"isBlockCoverage":false},{"functionName":"parseKeyType","ranges":[{"startOffset":6579,"endOffset":7431,"count":0}],"isBlockCoverage":false},{"functionName":"option","ranges":[{"startOffset":7433,"endOffset":7554,"count":0}],"isBlockCoverage":false},{"functionName":"parseKeyFormatAndType","ranges":[{"startOffset":7556,"endOffset":8256,"count":0}],"isBlockCoverage":false},{"functionName":"isStringOrBuffer","ranges":[{"startOffset":8258,"endOffset":8395,"count":0}],"isBlockCoverage":false},{"functionName":"parseKeyEncoding","ranges":[{"startOffset":8397,"endOffset":9754,"count":0}],"isBlockCoverage":false},{"functionName":"parsePublicKeyEncoding","ranges":[{"startOffset":9953,"endOffset":10089,"count":0}],"isBlockCoverage":false},{"functionName":"parsePrivateKeyEncoding","ranges":[{"startOffset":10289,"endOffset":10405,"count":0}],"isBlockCoverage":false},{"functionName":"getKeyObjectHandle","ranges":[{"startOffset":10407,"endOffset":10984,"count":0}],"isBlockCoverage":false},{"functionName":"getKeyTypes","ranges":[{"startOffset":10986,"endOffset":11491,"count":0}],"isBlockCoverage":false},{"functionName":"getKeyObjectHandleFromJwk","ranges":[{"startOffset":11493,"endOffset":14040,"count":0}],"isBlockCoverage":false},{"functionName":"prepareAsymmetricKey","ranges":[{"startOffset":14042,"endOffset":15584,"count":0}],"isBlockCoverage":false},{"functionName":"preparePrivateKey","ranges":[{"startOffset":15586,"endOffset":15674,"count":0}],"isBlockCoverage":false},{"functionName":"preparePublicOrPrivateKey","ranges":[{"startOffset":15676,"endOffset":15771,"count":0}],"isBlockCoverage":false},{"functionName":"prepareSecretKey","ranges":[{"startOffset":15773,"endOffset":16471,"count":0}],"isBlockCoverage":false},{"functionName":"createSecretKey","ranges":[{"startOffset":16473,"endOffset":16677,"count":0}],"isBlockCoverage":false},{"functionName":"createPublicKey","ranges":[{"startOffset":16679,"endOffset":17016,"count":0}],"isBlockCoverage":false},{"functionName":"createPrivateKey","ranges":[{"startOffset":17018,"endOffset":17359,"count":0}],"isBlockCoverage":false},{"functionName":"isKeyObject","ranges":[{"startOffset":17361,"endOffset":17443,"count":0}],"isBlockCoverage":false},{"functionName":"CryptoKey","ranges":[{"startOffset":18002,"endOffset":18062,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":18066,"endOffset":18413,"count":0}],"isBlockCoverage":false},{"functionName":"get type","ranges":[{"startOffset":18417,"endOffset":18467,"count":0}],"isBlockCoverage":false},{"functionName":"get extractable","ranges":[{"startOffset":18471,"endOffset":18525,"count":0}],"isBlockCoverage":false},{"functionName":"get algorithm","ranges":[{"startOffset":18529,"endOffset":18579,"count":0}],"isBlockCoverage":false},{"functionName":"get usages","ranges":[{"startOffset":18583,"endOffset":18641,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":18645,"endOffset":18996,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":19000,"endOffset":19204,"count":0}],"isBlockCoverage":false},{"functionName":"InternalCryptoKey","ranges":[{"startOffset":19445,"endOffset":19847,"count":0}],"isBlockCoverage":false},{"functionName":"isCryptoKey","ranges":[{"startOffset":19977,"endOffset":20061,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1146","url":"node:internal/crypto/keygen","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11592,"count":1}],"isBlockCoverage":false},{"functionName":"isJwk","ranges":[{"startOffset":1277,"endOffset":1347,"count":0}],"isBlockCoverage":false},{"functionName":"wrapKey","ranges":[{"startOffset":1349,"endOffset":1503,"count":0}],"isBlockCoverage":false},{"functionName":"generateKeyPair","ranges":[{"startOffset":1505,"endOffset":2129,"count":0}],"isBlockCoverage":false},{"functionName":"generateKeyPairSync","ranges":[{"startOffset":2274,"endOffset":2391,"count":0}],"isBlockCoverage":false},{"functionName":"handleError","ranges":[{"startOffset":2393,"endOffset":2770,"count":0}],"isBlockCoverage":false},{"functionName":"parseKeyEncoding","ranges":[{"startOffset":2772,"endOffset":4020,"count":0}],"isBlockCoverage":false},{"functionName":"createJob","ranges":[{"startOffset":4022,"endOffset":10124,"count":0}],"isBlockCoverage":false},{"functionName":"generateKeyJob","ranges":[{"startOffset":10155,"endOffset":10692,"count":0}],"isBlockCoverage":false},{"functionName":"handleGenerateKeyError","ranges":[{"startOffset":10694,"endOffset":10896,"count":0}],"isBlockCoverage":false},{"functionName":"generateKey","ranges":[{"startOffset":10898,"endOffset":11356,"count":0}],"isBlockCoverage":false},{"functionName":"generateKeySync","ranges":[{"startOffset":11358,"endOffset":11492,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1147","url":"node:internal/crypto/diffiehellman","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11555,"count":1}],"isBlockCoverage":false},{"functionName":"DiffieHellman","ranges":[{"startOffset":1327,"endOffset":3252,"count":0}],"isBlockCoverage":false},{"functionName":"DiffieHellmanGroup","ranges":[{"startOffset":3255,"endOffset":3580,"count":0}],"isBlockCoverage":false},{"functionName":"dhGenerateKeys","ranges":[{"startOffset":3691,"endOffset":3853,"count":0}],"isBlockCoverage":false},{"functionName":"dhComputeSecret","ranges":[{"startOffset":3967,"endOffset":4326,"count":0}],"isBlockCoverage":false},{"functionName":"dhGetPrime","ranges":[{"startOffset":4425,"endOffset":4581,"count":0}],"isBlockCoverage":false},{"functionName":"dhGetGenerator","ranges":[{"startOffset":4692,"endOffset":4864,"count":0}],"isBlockCoverage":false},{"functionName":"dhGetPublicKey","ranges":[{"startOffset":4975,"endOffset":5135,"count":0}],"isBlockCoverage":false},{"functionName":"dhGetPrivateKey","ranges":[{"startOffset":5249,"endOffset":5411,"count":0}],"isBlockCoverage":false},{"functionName":"setPublicKey","ranges":[{"startOffset":5453,"endOffset":5642,"count":0}],"isBlockCoverage":false},{"functionName":"setPrivateKey","ranges":[{"startOffset":5686,"endOffset":5877,"count":0}],"isBlockCoverage":false},{"functionName":"ECDH","ranges":[{"startOffset":5881,"endOffset":6035,"count":0}],"isBlockCoverage":false},{"functionName":"generateKeys","ranges":[{"startOffset":6346,"endOffset":6468,"count":0}],"isBlockCoverage":false},{"functionName":"getPublicKey","ranges":[{"startOffset":6501,"endOffset":6699,"count":0}],"isBlockCoverage":false},{"functionName":"convertKey","ranges":[{"startOffset":6720,"endOffset":7070,"count":0}],"isBlockCoverage":false},{"functionName":"encode","ranges":[{"startOffset":7073,"endOffset":7208,"count":0}],"isBlockCoverage":false},{"functionName":"getFormat","ranges":[{"startOffset":7210,"endOffset":7533,"count":0}],"isBlockCoverage":false},{"functionName":"diffieHellman","ranges":[{"startOffset":7607,"endOffset":8675,"count":0}],"isBlockCoverage":false},{"functionName":"deriveBitsECDH","ranges":[{"startOffset":8794,"endOffset":9258,"count":0}],"isBlockCoverage":false},{"functionName":"asyncDeriveBitsECDH","ranges":[{"startOffset":9260,"endOffset":11426,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1148","url":"node:internal/crypto/cipher","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10241,"count":1}],"isBlockCoverage":false},{"functionName":"rsaFunctionFor","ranges":[{"startOffset":1227,"endOffset":1975,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1295,"endOffset":1972,"count":0}],"isBlockCoverage":false},{"functionName":"getDecoder","ranges":[{"startOffset":2476,"endOffset":2697,"count":0}],"isBlockCoverage":false},{"functionName":"getUIntOption","ranges":[{"startOffset":2699,"endOffset":2933,"count":0}],"isBlockCoverage":false},{"functionName":"createCipherBase","ranges":[{"startOffset":2935,"endOffset":3354,"count":0}],"isBlockCoverage":false},{"functionName":"createCipher","ranges":[{"startOffset":3356,"endOffset":3591,"count":0}],"isBlockCoverage":false},{"functionName":"createCipherWithIV","ranges":[{"startOffset":3593,"endOffset":3932,"count":0}],"isBlockCoverage":false},{"functionName":"Cipher","ranges":[{"startOffset":4175,"endOffset":4376,"count":0}],"isBlockCoverage":false},{"functionName":"_transform","ranges":[{"startOffset":4519,"endOffset":4635,"count":0}],"isBlockCoverage":false},{"functionName":"_flush","ranges":[{"startOffset":4664,"endOffset":4802,"count":0}],"isBlockCoverage":false},{"functionName":"update","ranges":[{"startOffset":4831,"endOffset":5481,"count":0}],"isBlockCoverage":false},{"functionName":"final","ranges":[{"startOffset":5510,"endOffset":5813,"count":0}],"isBlockCoverage":false},{"functionName":"setAutoPadding","ranges":[{"startOffset":5851,"endOffset":5998,"count":0}],"isBlockCoverage":false},{"functionName":"getAuthTag","ranges":[{"startOffset":6031,"endOffset":6191,"count":0}],"isBlockCoverage":false},{"functionName":"setAuthTag","ranges":[{"startOffset":6195,"endOffset":6407,"count":0}],"isBlockCoverage":false},{"functionName":"setAAD","ranges":[{"startOffset":6435,"endOffset":6777,"count":0}],"isBlockCoverage":false},{"functionName":"Cipheriv","ranges":[{"startOffset":7025,"endOffset":7235,"count":0}],"isBlockCoverage":false},{"functionName":"addCipherPrototypeFunctions","ranges":[{"startOffset":7237,"endOffset":7828,"count":3},{"startOffset":7633,"endOffset":7706,"count":1},{"startOffset":7706,"endOffset":7768,"count":2}],"isBlockCoverage":true},{"functionName":"Decipher","ranges":[{"startOffset":8229,"endOffset":8437,"count":0}],"isBlockCoverage":false},{"functionName":"Decipheriv","ranges":[{"startOffset":8842,"endOffset":9059,"count":0}],"isBlockCoverage":false},{"functionName":"getCipherInfo","ranges":[{"startOffset":9221,"endOffset":10082,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1149","url":"node:internal/streams/lazy_transform","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1583,"count":1}],"isBlockCoverage":false},{"functionName":"LazyTransform","ranges":[{"startOffset":468,"endOffset":530,"count":44}],"isBlockCoverage":true},{"functionName":"makeGetter","ranges":[{"startOffset":662,"endOffset":970,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":699,"endOffset":967,"count":0}],"isBlockCoverage":false},{"functionName":"makeSetter","ranges":[{"startOffset":972,"endOffset":1190,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1009,"endOffset":1187,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1150","url":"node:internal/crypto/sig","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7083,"count":1}],"isBlockCoverage":false},{"functionName":"Sign","ranges":[{"startOffset":891,"endOffset":1150,"count":0}],"isBlockCoverage":false},{"functionName":"_write","ranges":[{"startOffset":1273,"endOffset":1365,"count":0}],"isBlockCoverage":false},{"functionName":"update","ranges":[{"startOffset":1392,"endOffset":1753,"count":0}],"isBlockCoverage":false},{"functionName":"getPadding","ranges":[{"startOffset":1756,"endOffset":1831,"count":0}],"isBlockCoverage":false},{"functionName":"getSaltLength","ranges":[{"startOffset":1833,"endOffset":1914,"count":0}],"isBlockCoverage":false},{"functionName":"getDSASignatureEncoding","ranges":[{"startOffset":1916,"endOffset":2268,"count":0}],"isBlockCoverage":false},{"functionName":"getIntOption","ranges":[{"startOffset":2270,"endOffset":2515,"count":0}],"isBlockCoverage":false},{"functionName":"sign","ranges":[{"startOffset":2539,"endOffset":3202,"count":0}],"isBlockCoverage":false},{"functionName":"signOneShot","ranges":[{"startOffset":3205,"endOffset":4410,"count":0}],"isBlockCoverage":false},{"functionName":"Verify","ranges":[{"startOffset":4412,"endOffset":4679,"count":0}],"isBlockCoverage":false},{"functionName":"verify","ranges":[{"startOffset":4907,"endOffset":5543,"count":0}],"isBlockCoverage":false},{"functionName":"verifyOneShot","ranges":[{"startOffset":5546,"endOffset":7009,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1151","url":"node:internal/crypto/hash","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4875,"count":1}],"isBlockCoverage":false},{"functionName":"Hash","ranges":[{"startOffset":1021,"endOffset":1540,"count":44},{"startOffset":1092,"endOffset":1128,"count":0},{"startOffset":1255,"endOffset":1274,"count":0},{"startOffset":1275,"endOffset":1301,"count":0},{"startOffset":1347,"endOffset":1394,"count":0}],"isBlockCoverage":true},{"functionName":"copy","ranges":[{"startOffset":1671,"endOffset":1839,"count":0}],"isBlockCoverage":false},{"functionName":"_transform","ranges":[{"startOffset":1870,"endOffset":1975,"count":0}],"isBlockCoverage":false},{"functionName":"_flush","ranges":[{"startOffset":2002,"endOffset":2082,"count":0}],"isBlockCoverage":false},{"functionName":"update","ranges":[{"startOffset":2109,"endOffset":2621,"count":44},{"startOffset":2165,"endOffset":2188,"count":0},{"startOffset":2250,"endOffset":2288,"count":0},{"startOffset":2365,"endOffset":2511,"count":0},{"startOffset":2562,"endOffset":2604,"count":0}],"isBlockCoverage":true},{"functionName":"digest","ranges":[{"startOffset":2649,"endOffset":2994,"count":44},{"startOffset":2742,"endOffset":2780,"count":0},{"startOffset":2815,"endOffset":2838,"count":0}],"isBlockCoverage":true},{"functionName":"Hmac","ranges":[{"startOffset":2997,"endOffset":3396,"count":0}],"isBlockCoverage":false},{"functionName":"digest","ranges":[{"startOffset":3577,"endOffset":3996,"count":0}],"isBlockCoverage":false},{"functionName":"asyncDigest","ranges":[{"startOffset":4151,"endOffset":4820,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1152","url":"node:internal/crypto/x509","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9667,"count":1}],"isBlockCoverage":false},{"functionName":"isX509Certificate","ranges":[{"startOffset":1119,"endOffset":1202,"count":0}],"isBlockCoverage":false},{"functionName":"getFlags","ranges":[{"startOffset":1204,"endOffset":2503,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2562,"endOffset":2594,"count":0}],"isBlockCoverage":false},{"functionName":"InternalX509Certificate","ranges":[{"startOffset":2599,"endOffset":2665,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2718,"endOffset":2750,"count":0}],"isBlockCoverage":false},{"functionName":"X509Certificate","ranges":[{"startOffset":2755,"endOffset":3077,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3081,"endOffset":3704,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3708,"endOffset":3872,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3876,"endOffset":3936,"count":0}],"isBlockCoverage":false},{"functionName":"get subject","ranges":[{"startOffset":3940,"endOffset":4156,"count":0}],"isBlockCoverage":false},{"functionName":"get subjectAltName","ranges":[{"startOffset":4160,"endOffset":4404,"count":0}],"isBlockCoverage":false},{"functionName":"get issuer","ranges":[{"startOffset":4408,"endOffset":4620,"count":0}],"isBlockCoverage":false},{"functionName":"get issuerCertificate","ranges":[{"startOffset":4624,"endOffset":4973,"count":0}],"isBlockCoverage":false},{"functionName":"get infoAccess","ranges":[{"startOffset":4977,"endOffset":5205,"count":0}],"isBlockCoverage":false},{"functionName":"get validFrom","ranges":[{"startOffset":5209,"endOffset":5433,"count":0}],"isBlockCoverage":false},{"functionName":"get validTo","ranges":[{"startOffset":5437,"endOffset":5653,"count":0}],"isBlockCoverage":false},{"functionName":"get fingerprint","ranges":[{"startOffset":5657,"endOffset":5889,"count":0}],"isBlockCoverage":false},{"functionName":"get fingerprint256","ranges":[{"startOffset":5893,"endOffset":6137,"count":0}],"isBlockCoverage":false},{"functionName":"get fingerprint512","ranges":[{"startOffset":6141,"endOffset":6385,"count":0}],"isBlockCoverage":false},{"functionName":"get keyUsage","ranges":[{"startOffset":6389,"endOffset":6609,"count":0}],"isBlockCoverage":false},{"functionName":"get serialNumber","ranges":[{"startOffset":6613,"endOffset":6849,"count":0}],"isBlockCoverage":false},{"functionName":"get raw","ranges":[{"startOffset":6853,"endOffset":7053,"count":0}],"isBlockCoverage":false},{"functionName":"get publicKey","ranges":[{"startOffset":7057,"endOffset":7302,"count":0}],"isBlockCoverage":false},{"functionName":"toString","ranges":[{"startOffset":7306,"endOffset":7507,"count":0}],"isBlockCoverage":false},{"functionName":"toJSON","ranges":[{"startOffset":7632,"endOffset":7668,"count":0}],"isBlockCoverage":false},{"functionName":"get ca","ranges":[{"startOffset":7672,"endOffset":7873,"count":0}],"isBlockCoverage":false},{"functionName":"checkHost","ranges":[{"startOffset":7877,"endOffset":8002,"count":0}],"isBlockCoverage":false},{"functionName":"checkEmail","ranges":[{"startOffset":8006,"endOffset":8137,"count":0}],"isBlockCoverage":false},{"functionName":"checkIP","ranges":[{"startOffset":8141,"endOffset":8631,"count":0}],"isBlockCoverage":false},{"functionName":"checkIssued","ranges":[{"startOffset":8635,"endOffset":8841,"count":0}],"isBlockCoverage":false},{"functionName":"checkPrivateKey","ranges":[{"startOffset":8845,"endOffset":9108,"count":0}],"isBlockCoverage":false},{"functionName":"verify","ranges":[{"startOffset":9112,"endOffset":9356,"count":0}],"isBlockCoverage":false},{"functionName":"toLegacyObject","ranges":[{"startOffset":9360,"endOffset":9419,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1153","url":"node:internal/crypto/certificate","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1546,"count":1}],"isBlockCoverage":false},{"functionName":"verifySpkac","ranges":[{"startOffset":385,"endOffset":505,"count":0}],"isBlockCoverage":false},{"functionName":"exportPublicKey","ranges":[{"startOffset":507,"endOffset":635,"count":0}],"isBlockCoverage":false},{"functionName":"exportChallenge","ranges":[{"startOffset":637,"endOffset":765,"count":0}],"isBlockCoverage":false},{"functionName":"Certificate","ranges":[{"startOffset":1122,"endOffset":1216,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1154","url":"node:internal/crypto/webcrypto","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":24469,"count":1}],"isBlockCoverage":false},{"functionName":"digest","ranges":[{"startOffset":1308,"endOffset":1470,"count":0}],"isBlockCoverage":false},{"functionName":"randomUUID","ranges":[{"startOffset":1472,"endOffset":1582,"count":0}],"isBlockCoverage":false},{"functionName":"generateKey","ranges":[{"startOffset":1584,"endOffset":3631,"count":0}],"isBlockCoverage":false},{"functionName":"deriveBits","ranges":[{"startOffset":3633,"endOffset":4734,"count":0}],"isBlockCoverage":false},{"functionName":"getKeyLength","ranges":[{"startOffset":4736,"endOffset":5553,"count":0}],"isBlockCoverage":false},{"functionName":"deriveKey","ranges":[{"startOffset":5555,"endOffset":7223,"count":0}],"isBlockCoverage":false},{"functionName":"exportKeySpki","ranges":[{"startOffset":7225,"endOffset":8215,"count":0}],"isBlockCoverage":false},{"functionName":"exportKeyPkcs8","ranges":[{"startOffset":8217,"endOffset":9216,"count":0}],"isBlockCoverage":false},{"functionName":"exportKeyRaw","ranges":[{"startOffset":9218,"endOffset":10159,"count":0}],"isBlockCoverage":false},{"functionName":"exportKeyJWK","ranges":[{"startOffset":10161,"endOffset":11720,"count":0}],"isBlockCoverage":false},{"functionName":"exportKey","ranges":[{"startOffset":11722,"endOffset":12391,"count":0}],"isBlockCoverage":false},{"functionName":"importGenericSecretKey","ranges":[{"startOffset":12393,"endOffset":13743,"count":0}],"isBlockCoverage":false},{"functionName":"importKey","ranges":[{"startOffset":13745,"endOffset":15583,"count":0}],"isBlockCoverage":false},{"functionName":"wrapKey","ranges":[{"startOffset":15676,"endOffset":16346,"count":0}],"isBlockCoverage":false},{"functionName":"unwrapKey","ranges":[{"startOffset":16441,"endOffset":17399,"count":0}],"isBlockCoverage":false},{"functionName":"signVerify","ranges":[{"startOffset":17401,"endOffset":18698,"count":0}],"isBlockCoverage":false},{"functionName":"sign","ranges":[{"startOffset":18700,"endOffset":18855,"count":0}],"isBlockCoverage":false},{"functionName":"verify","ranges":[{"startOffset":18857,"endOffset":19036,"count":0}],"isBlockCoverage":false},{"functionName":"cipherOrWrap","ranges":[{"startOffset":19038,"endOffset":20727,"count":0}],"isBlockCoverage":false},{"functionName":"encrypt","ranges":[{"startOffset":20729,"endOffset":20925,"count":0}],"isBlockCoverage":false},{"functionName":"decrypt","ranges":[{"startOffset":20927,"endOffset":21123,"count":0}],"isBlockCoverage":false},{"functionName":"SubtleCrypto","ranges":[{"startOffset":21279,"endOffset":21339,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":21374,"endOffset":21387,"count":1}],"isBlockCoverage":true},{"functionName":"Crypto","ranges":[{"startOffset":21426,"endOffset":21486,"count":0}],"isBlockCoverage":true},{"functionName":"get subtle","ranges":[{"startOffset":21490,"endOffset":21590,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":21625,"endOffset":21638,"count":1}],"isBlockCoverage":true},{"functionName":"getRandomValues","ranges":[{"startOffset":21654,"endOffset":21808,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1156","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_dependencies.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15956,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":219,"endOffset":1614,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":434,"endOffset":530,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":619,"endOffset":925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1078,"endOffset":1174,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1284,"endOffset":1590,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_sap_package","ranges":[{"startOffset":1618,"endOffset":2126,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2129,"endOffset":2388,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$validate_name","ranges":[{"startOffset":2391,"endOffset":2454,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_description","ranges":[{"startOffset":2457,"endOffset":2640,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_responsible","ranges":[{"startOffset":2643,"endOffset":2852,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_subpackages","ranges":[{"startOffset":2855,"endOffset":3384,"count":1}],"isBlockCoverage":true},{"functionName":"set_sub_packages","ranges":[{"startOffset":3387,"endOffset":3873,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$are_changes_recorded_in_tr_req","ranges":[{"startOffset":3876,"endOffset":4107,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create","ranges":[{"startOffset":4110,"endOffset":5266,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_child","ranges":[{"startOffset":5269,"endOffset":5490,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_local","ranges":[{"startOffset":5493,"endOffset":5543,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$exists","ranges":[{"startOffset":5546,"endOffset":5711,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_type","ranges":[{"startOffset":5714,"endOffset":6110,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_layer","ranges":[{"startOffset":6113,"endOffset":6273,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_superpackages","ranges":[{"startOffset":6276,"endOffset":6673,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_parent","ranges":[{"startOffset":6676,"endOffset":6805,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7246,"endOffset":9595,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7439,"endOffset":8248,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8337,"endOffset":8643,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8854,"endOffset":8901,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8948,"endOffset":8996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9042,"endOffset":9090,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9142,"endOffset":9238,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9417,"endOffset":9477,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9523,"endOffset":9571,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_resolve_packages","ranges":[{"startOffset":9599,"endOffset":10818,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":10821,"endOffset":10934,"count":1},{"startOffset":10877,"endOffset":10913,"count":0}],"isBlockCoverage":true},{"functionName":"resolve_single","ranges":[{"startOffset":10937,"endOffset":12168,"count":1}],"isBlockCoverage":true},{"functionName":"given_tadir","ranges":[{"startOffset":12171,"endOffset":13871,"count":3},{"startOffset":13738,"endOffset":13867,"count":2}],"isBlockCoverage":true},{"functionName":"when_packages_are_resolved","ranges":[{"startOffset":13874,"endOffset":14609,"count":1}],"isBlockCoverage":true},{"functionName":"then_korrnum_should_be","ranges":[{"startOffset":14612,"endOffset":15740,"count":3}],"isBlockCoverage":true}]},{"scriptId":"1157","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_status.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":105338,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":310,"endOffset":816,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":564,"endOffset":682,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":728,"endOffset":792,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_util","ranges":[{"startOffset":820,"endOffset":905,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":908,"endOffset":1021,"count":0}],"isBlockCoverage":false},{"functionName":"check_contains","ranges":[{"startOffset":1024,"endOffset":1101,"count":0}],"isBlockCoverage":false},{"functionName":"check_contains","ranges":[{"startOffset":1111,"endOffset":3088,"count":8}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3185,"endOffset":7409,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":3426,"endOffset":4785,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4870,"endOffset":5048,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5128,"endOffset":5258,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5338,"endOffset":5456,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5612,"endOffset":5709,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5756,"endOffset":5854,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5898,"endOffset":5995,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6040,"endOffset":6129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6174,"endOffset":6263,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6309,"endOffset":6405,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6448,"endOffset":6512,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6559,"endOffset":6623,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6670,"endOffset":6767,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_run_checks","ranges":[{"startOffset":7413,"endOffset":9308,"count":9}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":9311,"endOffset":9424,"count":9},{"startOffset":9367,"endOffset":9403,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$validate_name","ranges":[{"startOffset":9427,"endOffset":9490,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_responsible","ranges":[{"startOffset":9493,"endOffset":9702,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_description","ranges":[{"startOffset":9705,"endOffset":9888,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_subpackages","ranges":[{"startOffset":9891,"endOffset":10306,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_superpackages","ranges":[{"startOffset":10309,"endOffset":10726,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_parent","ranges":[{"startOffset":10729,"endOffset":10921,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_child","ranges":[{"startOffset":10924,"endOffset":11157,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$exists","ranges":[{"startOffset":11160,"endOffset":11366,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$are_changes_recorded_in_tr_req","ranges":[{"startOffset":11369,"endOffset":11641,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_type","ranges":[{"startOffset":11644,"endOffset":12070,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_layer","ranges":[{"startOffset":12073,"endOffset":12264,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create","ranges":[{"startOffset":12267,"endOffset":13435,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_local","ranges":[{"startOffset":13438,"endOffset":13500,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_namespace$exists","ranges":[{"startOffset":13503,"endOffset":13919,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_namespace$is_editable","ranges":[{"startOffset":13922,"endOffset":14231,"count":2}],"isBlockCoverage":true},{"functionName":"append_result","ranges":[{"startOffset":14234,"endOffset":17337,"count":29},{"startOffset":15706,"endOffset":15743,"count":6}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":17340,"endOffset":18220,"count":9}],"isBlockCoverage":true},{"functionName":"positive","ranges":[{"startOffset":18223,"endOffset":20314,"count":1}],"isBlockCoverage":true},{"functionName":"neg_diff_path_for_same_obj","ranges":[{"startOffset":20317,"endOffset":22596,"count":1}],"isBlockCoverage":true},{"functionName":"neg_incorrect_path_vs_pack","ranges":[{"startOffset":22599,"endOffset":24917,"count":1}],"isBlockCoverage":true},{"functionName":"neg_similar_filenames","ranges":[{"startOffset":24920,"endOffset":27225,"count":1}],"isBlockCoverage":true},{"functionName":"neg_empty_filenames","ranges":[{"startOffset":27228,"endOffset":29050,"count":1}],"isBlockCoverage":true},{"functionName":"package_move","ranges":[{"startOffset":29053,"endOffset":32570,"count":1}],"isBlockCoverage":true},{"functionName":"check_namespace","ranges":[{"startOffset":32573,"endOffset":33717,"count":1}],"isBlockCoverage":true},{"functionName":"check_namespace_aff","ranges":[{"startOffset":33720,"endOffset":34869,"count":1}],"isBlockCoverage":true},{"functionName":"check_sub_package","ranges":[{"startOffset":34872,"endOffset":36490,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":36601,"endOffset":41178,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":36791,"endOffset":38150,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":38303,"endOffset":39662,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":39756,"endOffset":40808,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":40851,"endOffset":40911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41010,"endOffset":41070,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":41112,"endOffset":41154,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_status_result","ranges":[{"startOffset":41182,"endOffset":42634,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":42637,"endOffset":44254,"count":12}],"isBlockCoverage":true},{"functionName":"get_line","ranges":[{"startOffset":44257,"endOffset":45634,"count":16}],"isBlockCoverage":true},{"functionName":"assert_lines","ranges":[{"startOffset":45637,"endOffset":46039,"count":12},{"startOffset":45871,"endOffset":45895,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":46157,"endOffset":52553,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":46365,"endOffset":46777,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":46859,"endOffset":48271,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":48354,"endOffset":49239,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":49321,"endOffset":49974,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":50182,"endOffset":50229,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":50276,"endOffset":50324,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":50371,"endOffset":50419,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":50515,"endOffset":50579,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":50626,"endOffset":50690,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":50733,"endOffset":50835,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":50930,"endOffset":50994,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":51041,"endOffset":51105,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":51148,"endOffset":51250,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":51297,"endOffset":51344,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":51391,"endOffset":51439,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":51486,"endOffset":51582,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":51629,"endOffset":51726,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":51821,"endOffset":51885,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":51932,"endOffset":51996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":52039,"endOffset":52141,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":52232,"endOffset":52386,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":52433,"endOffset":52529,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_status_helper","ranges":[{"startOffset":52557,"endOffset":56029,"count":13}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":56032,"endOffset":56159,"count":13}],"isBlockCoverage":true},{"functionName":"add_tadir","ranges":[{"startOffset":56162,"endOffset":57052,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_tadir$get_object_package","ranges":[{"startOffset":57055,"endOffset":58544,"count":4},{"startOffset":57248,"endOffset":57279,"count":0},{"startOffset":57981,"endOffset":58516,"count":2}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":58063,"endOffset":58162,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":58193,"endOffset":58219,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":58245,"endOffset":58271,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_tadir$read","ranges":[{"startOffset":58547,"endOffset":60663,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_tadir$read_single","ranges":[{"startOffset":60666,"endOffset":61868,"count":0}],"isBlockCoverage":false},{"functionName":"add_remote","ranges":[{"startOffset":61871,"endOffset":63192,"count":12},{"startOffset":61997,"endOffset":62026,"count":5},{"startOffset":62087,"endOffset":62136,"count":7}],"isBlockCoverage":true},{"functionName":"add_local","ranges":[{"startOffset":63195,"endOffset":66311,"count":10},{"startOffset":63320,"endOffset":63349,"count":4},{"startOffset":63410,"endOffset":63459,"count":6},{"startOffset":63865,"endOffset":63902,"count":9},{"startOffset":63995,"endOffset":64032,"count":9},{"startOffset":64173,"endOffset":64210,"count":1},{"startOffset":64275,"endOffset":64330,"count":9},{"startOffset":64472,"endOffset":64509,"count":1},{"startOffset":64574,"endOffset":64614,"count":9}],"isBlockCoverage":true},{"functionName":"add_state","ranges":[{"startOffset":66314,"endOffset":67544,"count":7},{"startOffset":66439,"endOffset":66468,"count":3},{"startOffset":66529,"endOffset":66578,"count":4}],"isBlockCoverage":true},{"functionName":"run","ranges":[{"startOffset":67547,"endOffset":70280,"count":12},{"startOffset":67844,"endOffset":67864,"count":3},{"startOffset":67866,"endOffset":67903,"count":3},{"startOffset":67932,"endOffset":67966,"count":3},{"startOffset":67968,"endOffset":68023,"count":9}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":70649,"endOffset":72203,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":70842,"endOffset":70998,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":71081,"endOffset":71235,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_calculate_status","ranges":[{"startOffset":72207,"endOffset":72616,"count":10}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":72619,"endOffset":72732,"count":10},{"startOffset":72675,"endOffset":72711,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":72735,"endOffset":72872,"count":10}],"isBlockCoverage":true},{"functionName":"only_remote","ranges":[{"startOffset":72875,"endOffset":73467,"count":1}],"isBlockCoverage":true},{"functionName":"deleted_remote","ranges":[{"startOffset":73470,"endOffset":74557,"count":0}],"isBlockCoverage":false},{"functionName":"only_local","ranges":[{"startOffset":74560,"endOffset":75262,"count":1}],"isBlockCoverage":true},{"functionName":"match_file","ranges":[{"startOffset":75265,"endOffset":76066,"count":1}],"isBlockCoverage":true},{"functionName":"diff","ranges":[{"startOffset":76069,"endOffset":80251,"count":1}],"isBlockCoverage":true},{"functionName":"moved","ranges":[{"startOffset":80254,"endOffset":81398,"count":1}],"isBlockCoverage":true},{"functionName":"inactive","ranges":[{"startOffset":81401,"endOffset":82407,"count":1}],"isBlockCoverage":true},{"functionName":"local_outside_main","ranges":[{"startOffset":82410,"endOffset":83227,"count":1}],"isBlockCoverage":true},{"functionName":"complete_local","ranges":[{"startOffset":83230,"endOffset":87059,"count":0}],"isBlockCoverage":false},{"functionName":"complete_remote","ranges":[{"startOffset":87062,"endOffset":91102,"count":0}],"isBlockCoverage":false},{"functionName":"complete_state","ranges":[{"startOffset":91105,"endOffset":95371,"count":0}],"isBlockCoverage":false},{"functionName":"complete","ranges":[{"startOffset":95374,"endOffset":100811,"count":0}],"isBlockCoverage":false},{"functionName":"only_local2","ranges":[{"startOffset":100814,"endOffset":101701,"count":1}],"isBlockCoverage":true},{"functionName":"only_remote2","ranges":[{"startOffset":101704,"endOffset":103148,"count":1}],"isBlockCoverage":true},{"functionName":"only_remote3","ranges":[{"startOffset":103151,"endOffset":105075,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1158","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_folder_logic.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":37725,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":227,"endOffset":1075,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":492,"endOffset":556,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":598,"endOffset":694,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":738,"endOffset":802,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":848,"endOffset":944,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":987,"endOffset":1051,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_folder_logic_helper","ranges":[{"startOffset":1079,"endOffset":1164,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1167,"endOffset":1280,"count":0}],"isBlockCoverage":false},{"functionName":"test","ranges":[{"startOffset":1283,"endOffset":1355,"count":0}],"isBlockCoverage":false},{"functionName":"test","ranges":[{"startOffset":1365,"endOffset":3348,"count":17},{"startOffset":3019,"endOffset":3156,"count":2},{"startOffset":3150,"endOffset":3156,"count":0},{"startOffset":3156,"endOffset":3347,"count":15}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3486,"endOffset":3711,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_folder_logic_package","ranges":[{"startOffset":3715,"endOffset":3800,"count":11}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3803,"endOffset":3916,"count":11},{"startOffset":3859,"endOffset":3895,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$list_subpackages","ranges":[{"startOffset":3919,"endOffset":4701,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$validate_name","ranges":[{"startOffset":4704,"endOffset":4767,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_responsible","ranges":[{"startOffset":4770,"endOffset":4979,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_description","ranges":[{"startOffset":4982,"endOffset":5165,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_superpackages","ranges":[{"startOffset":5168,"endOffset":5585,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_parent","ranges":[{"startOffset":5588,"endOffset":5783,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$create_child","ranges":[{"startOffset":5786,"endOffset":6019,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$exists","ranges":[{"startOffset":6022,"endOffset":6228,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$are_changes_recorded_in_tr_req","ranges":[{"startOffset":6231,"endOffset":6503,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_type","ranges":[{"startOffset":6506,"endOffset":6932,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_layer","ranges":[{"startOffset":6935,"endOffset":7126,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create","ranges":[{"startOffset":7129,"endOffset":8297,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_local","ranges":[{"startOffset":8300,"endOffset":8362,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":8494,"endOffset":9645,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8705,"endOffset":8801,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8880,"endOffset":8944,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_folder_logic","ranges":[{"startOffset":9649,"endOffset":9818,"count":11}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":9821,"endOffset":9934,"count":11},{"startOffset":9877,"endOffset":9913,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$list_subpackages","ranges":[{"startOffset":9937,"endOffset":10858,"count":8}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$validate_name","ranges":[{"startOffset":10861,"endOffset":10924,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_description","ranges":[{"startOffset":10927,"endOffset":11110,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_superpackages","ranges":[{"startOffset":11113,"endOffset":11530,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_responsible","ranges":[{"startOffset":11533,"endOffset":11742,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_parent","ranges":[{"startOffset":11745,"endOffset":11920,"count":6}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$create_child","ranges":[{"startOffset":11923,"endOffset":12156,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$exists","ranges":[{"startOffset":12159,"endOffset":12365,"count":6}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$are_changes_recorded_in_tr_req","ranges":[{"startOffset":12368,"endOffset":12640,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_type","ranges":[{"startOffset":12643,"endOffset":13069,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_layer","ranges":[{"startOffset":13072,"endOffset":13263,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create","ranges":[{"startOffset":13266,"endOffset":14434,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_local","ranges":[{"startOffset":14437,"endOffset":14499,"count":11}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":14502,"endOffset":15551,"count":11}],"isBlockCoverage":true},{"functionName":"prefix1","ranges":[{"startOffset":15554,"endOffset":15909,"count":1}],"isBlockCoverage":true},{"functionName":"prefix2","ranges":[{"startOffset":15912,"endOffset":16308,"count":1}],"isBlockCoverage":true},{"functionName":"prefix3","ranges":[{"startOffset":16311,"endOffset":16717,"count":1}],"isBlockCoverage":true},{"functionName":"prefix_error1","ranges":[{"startOffset":16720,"endOffset":17413,"count":1},{"startOffset":17125,"endOffset":17245,"count":0},{"startOffset":17371,"endOffset":17403,"count":0}],"isBlockCoverage":true},{"functionName":"mixed1","ranges":[{"startOffset":17416,"endOffset":17769,"count":1}],"isBlockCoverage":true},{"functionName":"mixed2","ranges":[{"startOffset":17772,"endOffset":18166,"count":1}],"isBlockCoverage":true},{"functionName":"mixed3","ranges":[{"startOffset":18169,"endOffset":18568,"count":1}],"isBlockCoverage":true},{"functionName":"mixed_error1","ranges":[{"startOffset":18571,"endOffset":19262,"count":1},{"startOffset":18974,"endOffset":19094,"count":0},{"startOffset":19220,"endOffset":19252,"count":0}],"isBlockCoverage":true},{"functionName":"full1","ranges":[{"startOffset":19265,"endOffset":19616,"count":1}],"isBlockCoverage":true},{"functionName":"full2","ranges":[{"startOffset":19619,"endOffset":20016,"count":1}],"isBlockCoverage":true},{"functionName":"full3","ranges":[{"startOffset":20019,"endOffset":20424,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":20810,"endOffset":21704,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":21032,"endOffset":21128,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21207,"endOffset":21271,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_folder_logic_namespaces","ranges":[{"startOffset":21708,"endOffset":21899,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":21902,"endOffset":22015,"count":6},{"startOffset":21958,"endOffset":21994,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$list_subpackages","ranges":[{"startOffset":22018,"endOffset":22802,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$validate_name","ranges":[{"startOffset":22805,"endOffset":22868,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_responsible","ranges":[{"startOffset":22871,"endOffset":23080,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_description","ranges":[{"startOffset":23083,"endOffset":23266,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_superpackages","ranges":[{"startOffset":23269,"endOffset":23686,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$are_changes_recorded_in_tr_req","ranges":[{"startOffset":23689,"endOffset":23961,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_parent","ranges":[{"startOffset":23964,"endOffset":24150,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$create_child","ranges":[{"startOffset":24153,"endOffset":24386,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$exists","ranges":[{"startOffset":24389,"endOffset":24595,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$get_transport_type","ranges":[{"startOffset":24598,"endOffset":25024,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_layer","ranges":[{"startOffset":25027,"endOffset":25218,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create","ranges":[{"startOffset":25221,"endOffset":26389,"count":6}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$create_local","ranges":[{"startOffset":26392,"endOffset":26454,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":26457,"endOffset":26918,"count":6}],"isBlockCoverage":true},{"functionName":"prefix1","ranges":[{"startOffset":26921,"endOffset":27320,"count":1}],"isBlockCoverage":true},{"functionName":"prefix2","ranges":[{"startOffset":27323,"endOffset":27747,"count":1}],"isBlockCoverage":true},{"functionName":"mixed1","ranges":[{"startOffset":27750,"endOffset":28147,"count":1}],"isBlockCoverage":true},{"functionName":"mixed2","ranges":[{"startOffset":28150,"endOffset":28572,"count":1}],"isBlockCoverage":true},{"functionName":"full1","ranges":[{"startOffset":28575,"endOffset":28970,"count":1}],"isBlockCoverage":true},{"functionName":"full2","ranges":[{"startOffset":28973,"endOffset":29393,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":29851,"endOffset":30960,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":30073,"endOffset":30203,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30282,"endOffset":30378,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30457,"endOffset":30521,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30722,"endOffset":30786,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_folder_logic_no_parent","ranges":[{"startOffset":30964,"endOffset":31287,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":31290,"endOffset":31403,"count":3},{"startOffset":31346,"endOffset":31382,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$validate_name","ranges":[{"startOffset":31406,"endOffset":31469,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_responsible","ranges":[{"startOffset":31472,"endOffset":31681,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_description","ranges":[{"startOffset":31684,"endOffset":31867,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_subpackages","ranges":[{"startOffset":31870,"endOffset":32285,"count":3},{"startOffset":32261,"endOffset":32284,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_sap_package$list_superpackages","ranges":[{"startOffset":32288,"endOffset":32705,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_parent","ranges":[{"startOffset":32708,"endOffset":32895,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_child","ranges":[{"startOffset":32898,"endOffset":33131,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$exists","ranges":[{"startOffset":33134,"endOffset":33340,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$are_changes_recorded_in_tr_req","ranges":[{"startOffset":33343,"endOffset":33615,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_type","ranges":[{"startOffset":33618,"endOffset":34044,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_layer","ranges":[{"startOffset":34047,"endOffset":34238,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create","ranges":[{"startOffset":34241,"endOffset":35409,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_local","ranges":[{"startOffset":35412,"endOffset":35474,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":35477,"endOffset":35781,"count":3}],"isBlockCoverage":true},{"functionName":"test","ranges":[{"startOffset":35784,"endOffset":36646,"count":3}],"isBlockCoverage":true},{"functionName":"prefix","ranges":[{"startOffset":36649,"endOffset":36802,"count":1}],"isBlockCoverage":true},{"functionName":"mixed","ranges":[{"startOffset":36805,"endOffset":36956,"count":1}],"isBlockCoverage":true},{"functionName":"full","ranges":[{"startOffset":36959,"endOffset":37108,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1159","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_html_processor.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16721,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":234,"endOffset":1371,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":466,"endOffset":832,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":981,"endOffset":1347,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_gui_mock","ranges":[{"startOffset":1375,"endOffset":1847,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1850,"endOffset":1963,"count":5},{"startOffset":1906,"endOffset":1942,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_services$cache_asset","ranges":[{"startOffset":1966,"endOffset":2987,"count":2},{"startOffset":2319,"endOffset":2350,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_services$register_event_handler","ranges":[{"startOffset":2990,"endOffset":3304,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_current_page_name","ranges":[{"startOffset":3307,"endOffset":3465,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_hotkeys_ctl","ranges":[{"startOffset":3468,"endOffset":3698,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_html_parts","ranges":[{"startOffset":3701,"endOffset":3908,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$get_log","ranges":[{"startOffset":3911,"endOffset":4398,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_gui_services$register_page_asset","ranges":[{"startOffset":4401,"endOffset":4992,"count":0}],"isBlockCoverage":false},{"functionName":"get_asset","ranges":[{"startOffset":4995,"endOffset":5458,"count":3}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5968,"endOffset":7400,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":6171,"endOffset":6235,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6315,"endOffset":6459,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6544,"endOffset":6697,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6847,"endOffset":6911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6953,"endOffset":7017,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_html_processor_test","ranges":[{"startOffset":7404,"endOffset":7870,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":7873,"endOffset":7986,"count":5},{"startOffset":7929,"endOffset":7965,"count":0}],"isBlockCoverage":true},{"functionName":"render_html","ranges":[{"startOffset":7989,"endOffset":8415,"count":8}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":8418,"endOffset":10614,"count":5}],"isBlockCoverage":true},{"functionName":"process_typical","ranges":[{"startOffset":10617,"endOffset":12691,"count":1}],"isBlockCoverage":true},{"functionName":"process_with_preserve","ranges":[{"startOffset":12694,"endOffset":14291,"count":1}],"isBlockCoverage":true},{"functionName":"process_no_css","ranges":[{"startOffset":14294,"endOffset":14726,"count":1}],"isBlockCoverage":true},{"functionName":"process_fails","ranges":[{"startOffset":14729,"endOffset":15173,"count":1},{"startOffset":14942,"endOffset":15005,"count":0},{"startOffset":15131,"endOffset":15163,"count":0}],"isBlockCoverage":true},{"functionName":"find_head_closing_tag","ranges":[{"startOffset":15176,"endOffset":16487,"count":1},{"startOffset":15989,"endOffset":16289,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1160","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":39969,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":205,"endOffset":501,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_object_types","ranges":[{"startOffset":505,"endOffset":590,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":593,"endOffset":706,"count":0}],"isBlockCoverage":false},{"functionName":"type_supported","ranges":[{"startOffset":709,"endOffset":1383,"count":0}],"isBlockCoverage":false},{"functionName":"not_exist","ranges":[{"startOffset":1386,"endOffset":3208,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3316,"endOffset":4948,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":3563,"endOffset":4157,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_serialize","ranges":[{"startOffset":4952,"endOffset":5037,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":5040,"endOffset":5153,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_shlp","ranges":[{"startOffset":5156,"endOffset":5977,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_view","ranges":[{"startOffset":5980,"endOffset":6804,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_tabl","ranges":[{"startOffset":6807,"endOffset":7622,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_auth","ranges":[{"startOffset":7625,"endOffset":8439,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_clas","ranges":[{"startOffset":8442,"endOffset":9277,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_intf","ranges":[{"startOffset":9280,"endOffset":10112,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_doma","ranges":[{"startOffset":10115,"endOffset":10930,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_dtel","ranges":[{"startOffset":10933,"endOffset":11748,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_fugr","ranges":[{"startOffset":11751,"endOffset":12565,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_msag","ranges":[{"startOffset":12568,"endOffset":13380,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_prog","ranges":[{"startOffset":13383,"endOffset":14204,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_tran","ranges":[{"startOffset":14207,"endOffset":15021,"count":0}],"isBlockCoverage":false},{"functionName":"serialize_ttyp","ranges":[{"startOffset":15024,"endOffset":15842,"count":0}],"isBlockCoverage":false},{"functionName":"check","ranges":[{"startOffset":15845,"endOffset":18579,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":18688,"endOffset":21204,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":18895,"endOffset":19489,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19590,"endOffset":19724,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19827,"endOffset":20300,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20450,"endOffset":21044,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21091,"endOffset":21180,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_object_ddls_mock","ranges":[{"startOffset":21208,"endOffset":22210,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":22213,"endOffset":23226,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$is_locked","ranges":[{"startOffset":23229,"endOffset":23736,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_deserialize_steps","ranges":[{"startOffset":23739,"endOffset":24158,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_deserialize_order","ranges":[{"startOffset":24161,"endOffset":25982,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$changed_by","ranges":[{"startOffset":25985,"endOffset":26285,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_comparator","ranges":[{"startOffset":26288,"endOffset":26503,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$delete","ranges":[{"startOffset":26506,"endOffset":26902,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$deserialize","ranges":[{"startOffset":26905,"endOffset":27850,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$exists","ranges":[{"startOffset":27853,"endOffset":28013,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$get_metadata","ranges":[{"startOffset":28016,"endOffset":28390,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$jump","ranges":[{"startOffset":28393,"endOffset":28690,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$serialize","ranges":[{"startOffset":28693,"endOffset":28934,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$is_active","ranges":[{"startOffset":28937,"endOffset":29104,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_filename_to_object","ranges":[{"startOffset":29107,"endOffset":29250,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_filename_to_object","ranges":[{"startOffset":29260,"endOffset":30619,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_object_to_filename","ranges":[{"startOffset":30622,"endOffset":30765,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_object$map_object_to_filename","ranges":[{"startOffset":30775,"endOffset":31638,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":32585,"endOffset":34491,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":32783,"endOffset":33595,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":33686,"endOffset":33750,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":34403,"endOffset":34467,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_check_objects_locked","ranges":[{"startOffset":34495,"endOffset":35483,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":35486,"endOffset":35599,"count":0}],"isBlockCoverage":false},{"functionName":"throw_excp_if_object_is_locked","ranges":[{"startOffset":35602,"endOffset":35775,"count":0}],"isBlockCoverage":false},{"functionName":"no_excp_if_obj_is_not_locked","ranges":[{"startOffset":35778,"endOffset":35952,"count":0}],"isBlockCoverage":false},{"functionName":"given_locked_object","ranges":[{"startOffset":35955,"endOffset":36084,"count":0}],"isBlockCoverage":false},{"functionName":"when_check_objects_locked","ranges":[{"startOffset":36087,"endOffset":36699,"count":0}],"isBlockCoverage":false},{"functionName":"then_exception_shd_be_raised","ranges":[{"startOffset":36702,"endOffset":36929,"count":0}],"isBlockCoverage":false},{"functionName":"given_not_locked_object","ranges":[{"startOffset":36932,"endOffset":37066,"count":0}],"isBlockCoverage":false},{"functionName":"then_no_exception_shd_occur","ranges":[{"startOffset":37069,"endOffset":37203,"count":0}],"isBlockCoverage":false},{"functionName":"given_object","ranges":[{"startOffset":37206,"endOffset":39711,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1161","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_aff_registry.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4676,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":220,"endOffset":1334,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":485,"endOffset":532,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":583,"endOffset":680,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":731,"endOffset":828,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_aff_registry","ranges":[{"startOffset":1338,"endOffset":1423,"count":9}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1426,"endOffset":1539,"count":9},{"startOffset":1482,"endOffset":1518,"count":0}],"isBlockCoverage":true},{"functionName":"assert_that","ranges":[{"startOffset":1542,"endOffset":3092,"count":9},{"startOffset":2042,"endOffset":2087,"count":1},{"startOffset":2156,"endOffset":2200,"count":8}],"isBlockCoverage":true},{"functionName":"clas_not_supported","ranges":[{"startOffset":3095,"endOffset":3253,"count":1}],"isBlockCoverage":true},{"functionName":"chkc","ranges":[{"startOffset":3256,"endOffset":3399,"count":1}],"isBlockCoverage":true},{"functionName":"chko","ranges":[{"startOffset":3402,"endOffset":3545,"count":1}],"isBlockCoverage":true},{"functionName":"chkv","ranges":[{"startOffset":3548,"endOffset":3691,"count":1}],"isBlockCoverage":true},{"functionName":"evtb","ranges":[{"startOffset":3694,"endOffset":3837,"count":1}],"isBlockCoverage":true},{"functionName":"gsmp","ranges":[{"startOffset":3840,"endOffset":3983,"count":1}],"isBlockCoverage":true},{"functionName":"intf_not_supported","ranges":[{"startOffset":3986,"endOffset":4144,"count":1}],"isBlockCoverage":true},{"functionName":"intf_experimental","ranges":[{"startOffset":4147,"endOffset":4344,"count":1}],"isBlockCoverage":true},{"functionName":"smbc","ranges":[{"startOffset":4347,"endOffset":4490,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1162","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":342867,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":395,"endOffset":3043,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":576,"endOffset":1541,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1682,"endOffset":1746,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1889,"endOffset":3019,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_nodes_helper","ranges":[{"startOffset":3047,"endOffset":4103,"count":115}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4106,"endOffset":4219,"count":115},{"startOffset":4162,"endOffset":4198,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":4222,"endOffset":5972,"count":543}],"isBlockCoverage":true},{"functionName":"sorted","ranges":[{"startOffset":5975,"endOffset":7184,"count":79}],"isBlockCoverage":true},{"functionName":"clear","ranges":[{"startOffset":7187,"endOffset":7248,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7354,"endOffset":9042,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7533,"endOffset":7677,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7759,"endOffset":7905,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8842,"endOffset":8906,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8954,"endOffset":9018,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_parser_test","ranges":[{"startOffset":9046,"endOffset":9431,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":9434,"endOffset":9547,"count":12},{"startOffset":9490,"endOffset":9526,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":9550,"endOffset":9784,"count":12}],"isBlockCoverage":true},{"functionName":"parse_bare_values","ranges":[{"startOffset":9787,"endOffset":12508,"count":1}],"isBlockCoverage":true},{"functionName":"parse_error","ranges":[{"startOffset":12511,"endOffset":15606,"count":0}],"isBlockCoverage":false},{"functionName":"parse_string","ranges":[{"startOffset":15609,"endOffset":17125,"count":1}],"isBlockCoverage":true},{"functionName":"parse_number","ranges":[{"startOffset":17128,"endOffset":18642,"count":1}],"isBlockCoverage":true},{"functionName":"parse_float","ranges":[{"startOffset":18645,"endOffset":20266,"count":1}],"isBlockCoverage":true},{"functionName":"parse_boolean","ranges":[{"startOffset":20269,"endOffset":21786,"count":1}],"isBlockCoverage":true},{"functionName":"parse_false","ranges":[{"startOffset":21789,"endOffset":23303,"count":1}],"isBlockCoverage":true},{"functionName":"parse_null","ranges":[{"startOffset":23306,"endOffset":24817,"count":1}],"isBlockCoverage":true},{"functionName":"parse_date","ranges":[{"startOffset":24820,"endOffset":26339,"count":1}],"isBlockCoverage":true},{"functionName":"sample_json","ranges":[{"startOffset":26342,"endOffset":26420,"count":6}],"isBlockCoverage":true},{"functionName":"sample_json","ranges":[{"startOffset":26430,"endOffset":29745,"count":19},{"startOffset":26612,"endOffset":26633,"count":4},{"startOffset":26635,"endOffset":26674,"count":4}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":29748,"endOffset":36192,"count":1}],"isBlockCoverage":true},{"functionName":"parse_keeping_order","ranges":[{"startOffset":36195,"endOffset":42872,"count":1}],"isBlockCoverage":true},{"functionName":"duplicate_key","ranges":[{"startOffset":42875,"endOffset":43723,"count":1},{"startOffset":43388,"endOffset":43451,"count":0},{"startOffset":43681,"endOffset":43713,"count":0}],"isBlockCoverage":true},{"functionName":"non_json","ranges":[{"startOffset":43726,"endOffset":44614,"count":1},{"startOffset":44279,"endOffset":44342,"count":0},{"startOffset":44572,"endOffset":44604,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":44724,"endOffset":46758,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":45441,"endOffset":45505,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":45604,"endOffset":46734,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_serializer_test","ranges":[{"startOffset":46762,"endOffset":46847,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":46850,"endOffset":46963,"count":8},{"startOffset":46906,"endOffset":46942,"count":0}],"isBlockCoverage":true},{"functionName":"sample_json","ranges":[{"startOffset":46966,"endOffset":47038,"count":2}],"isBlockCoverage":true},{"functionName":"sample_json","ranges":[{"startOffset":47048,"endOffset":50275,"count":2}],"isBlockCoverage":true},{"functionName":"sample_nodes","ranges":[{"startOffset":50278,"endOffset":50352,"count":2}],"isBlockCoverage":true},{"functionName":"sample_nodes","ranges":[{"startOffset":50362,"endOffset":55997,"count":2}],"isBlockCoverage":true},{"functionName":"stringify_condensed","ranges":[{"startOffset":56000,"endOffset":57731,"count":1}],"isBlockCoverage":true},{"functionName":"stringify_indented","ranges":[{"startOffset":57734,"endOffset":58216,"count":1}],"isBlockCoverage":true},{"functionName":"array_index","ranges":[{"startOffset":58219,"endOffset":59485,"count":1}],"isBlockCoverage":true},{"functionName":"item_order","ranges":[{"startOffset":59488,"endOffset":61139,"count":1}],"isBlockCoverage":true},{"functionName":"simple_indented","ranges":[{"startOffset":61142,"endOffset":63382,"count":1}],"isBlockCoverage":true},{"functionName":"empty_set","ranges":[{"startOffset":63385,"endOffset":64596,"count":1}],"isBlockCoverage":true},{"functionName":"escape_string","ranges":[{"startOffset":64599,"endOffset":65832,"count":1}],"isBlockCoverage":true},{"functionName":"empty","ranges":[{"startOffset":65835,"endOffset":66528,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":66642,"endOffset":67067,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_utils_test","ranges":[{"startOffset":67071,"endOffset":67156,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":67159,"endOffset":67272,"count":4},{"startOffset":67215,"endOffset":67251,"count":0}],"isBlockCoverage":true},{"functionName":"string_to_xstring_utf8","ranges":[{"startOffset":67275,"endOffset":67558,"count":1}],"isBlockCoverage":true},{"functionName":"validate_array_index","ranges":[{"startOffset":67561,"endOffset":68723,"count":1},{"startOffset":68067,"endOffset":68130,"count":0},{"startOffset":68260,"endOffset":68292,"count":0},{"startOffset":68488,"endOffset":68551,"count":0},{"startOffset":68681,"endOffset":68713,"count":0}],"isBlockCoverage":true},{"functionName":"normalize_path","ranges":[{"startOffset":68726,"endOffset":70179,"count":1}],"isBlockCoverage":true},{"functionName":"split_path","ranges":[{"startOffset":70182,"endOffset":73449,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":73554,"endOffset":74406,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_reader_test","ranges":[{"startOffset":74410,"endOffset":74495,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":74498,"endOffset":74611,"count":12},{"startOffset":74554,"endOffset":74590,"count":0}],"isBlockCoverage":true},{"functionName":"slice","ranges":[{"startOffset":74614,"endOffset":83946,"count":1}],"isBlockCoverage":true},{"functionName":"get_value","ranges":[{"startOffset":83949,"endOffset":85138,"count":1}],"isBlockCoverage":true},{"functionName":"get_node_type","ranges":[{"startOffset":85141,"endOffset":87866,"count":1}],"isBlockCoverage":true},{"functionName":"get_date","ranges":[{"startOffset":87869,"endOffset":90253,"count":1}],"isBlockCoverage":true},{"functionName":"get_timestamp","ranges":[{"startOffset":90256,"endOffset":91394,"count":1}],"isBlockCoverage":true},{"functionName":"exists","ranges":[{"startOffset":91397,"endOffset":92529,"count":1}],"isBlockCoverage":true},{"functionName":"value_integer","ranges":[{"startOffset":92532,"endOffset":93505,"count":1}],"isBlockCoverage":true},{"functionName":"value_number","ranges":[{"startOffset":93508,"endOffset":94492,"count":1}],"isBlockCoverage":true},{"functionName":"value_boolean","ranges":[{"startOffset":94495,"endOffset":95641,"count":1}],"isBlockCoverage":true},{"functionName":"value_string","ranges":[{"startOffset":95644,"endOffset":96846,"count":1}],"isBlockCoverage":true},{"functionName":"members","ranges":[{"startOffset":96849,"endOffset":98255,"count":1}],"isBlockCoverage":true},{"functionName":"array_to_string_table","ranges":[{"startOffset":98258,"endOffset":104145,"count":1},{"startOffset":101697,"endOffset":101760,"count":0},{"startOffset":102060,"endOffset":102092,"count":0},{"startOffset":102223,"endOffset":102286,"count":0},{"startOffset":102588,"endOffset":102620,"count":0},{"startOffset":102752,"endOffset":102815,"count":0},{"startOffset":103118,"endOffset":103150,"count":0},{"startOffset":103717,"endOffset":103780,"count":0},{"startOffset":104103,"endOffset":104135,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":104253,"endOffset":105496,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_json_to_abap","ranges":[{"startOffset":105500,"endOffset":105585,"count":16}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":105588,"endOffset":105701,"count":16},{"startOffset":105644,"endOffset":105680,"count":0}],"isBlockCoverage":true},{"functionName":"to_abap_struc","ranges":[{"startOffset":105704,"endOffset":113753,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_timestamp_initial","ranges":[{"startOffset":113756,"endOffset":114739,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_value","ranges":[{"startOffset":114742,"endOffset":115700,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_array","ranges":[{"startOffset":115703,"endOffset":117529,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_array_of_arrays_simple","ranges":[{"startOffset":117532,"endOffset":120410,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_array_of_arrays","ranges":[{"startOffset":120413,"endOffset":123735,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_w_tab_of_struc","ranges":[{"startOffset":123738,"endOffset":130583,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_w_plain_tab","ranges":[{"startOffset":130586,"endOffset":136875,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_hashed_plain_tab","ranges":[{"startOffset":136878,"endOffset":138729,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_hashed_tab","ranges":[{"startOffset":138732,"endOffset":142014,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_sorted_tab","ranges":[{"startOffset":142017,"endOffset":145299,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_negative","ranges":[{"startOffset":145302,"endOffset":156452,"count":1},{"startOffset":148671,"endOffset":148734,"count":0},{"startOffset":149034,"endOffset":149066,"count":0},{"startOffset":149493,"endOffset":149556,"count":0},{"startOffset":149852,"endOffset":149884,"count":0},{"startOffset":150321,"endOffset":150384,"count":0},{"startOffset":150688,"endOffset":150720,"count":0},{"startOffset":151161,"endOffset":151224,"count":0},{"startOffset":151528,"endOffset":151560,"count":0},{"startOffset":152003,"endOffset":152066,"count":0},{"startOffset":152362,"endOffset":152394,"count":0},{"startOffset":153097,"endOffset":153160,"count":0},{"startOffset":153469,"endOffset":153501,"count":0},{"startOffset":153930,"endOffset":153993,"count":0},{"startOffset":154295,"endOffset":154327,"count":0},{"startOffset":154741,"endOffset":154804,"count":0},{"startOffset":155106,"endOffset":155138,"count":0},{"startOffset":156046,"endOffset":156109,"count":0},{"startOffset":156410,"endOffset":156442,"count":0}],"isBlockCoverage":true},{"functionName":"to_abap_corresponding","ranges":[{"startOffset":156455,"endOffset":158196,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_corresponding_negative","ranges":[{"startOffset":158199,"endOffset":160422,"count":1},{"startOffset":160021,"endOffset":160084,"count":0},{"startOffset":160380,"endOffset":160412,"count":0}],"isBlockCoverage":true},{"functionName":"to_abap_corresponding_public","ranges":[{"startOffset":160425,"endOffset":162588,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap_corresponding_pub_neg","ranges":[{"startOffset":162591,"endOffset":164751,"count":1},{"startOffset":164350,"endOffset":164413,"count":0},{"startOffset":164709,"endOffset":164741,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":168975,"endOffset":171395,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":170977,"endOffset":171095,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":171142,"endOffset":171264,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":171307,"endOffset":171371,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_writer_test","ranges":[{"startOffset":171399,"endOffset":171484,"count":30}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":171487,"endOffset":171600,"count":30},{"startOffset":171543,"endOffset":171579,"count":0}],"isBlockCoverage":true},{"functionName":"prove_path_exists","ranges":[{"startOffset":171603,"endOffset":173816,"count":1}],"isBlockCoverage":true},{"functionName":"delete_subtree","ranges":[{"startOffset":173819,"endOffset":175585,"count":1}],"isBlockCoverage":true},{"functionName":"delete","ranges":[{"startOffset":175588,"endOffset":178663,"count":1}],"isBlockCoverage":true},{"functionName":"set_ajson","ranges":[{"startOffset":178666,"endOffset":182781,"count":1}],"isBlockCoverage":true},{"functionName":"set_value","ranges":[{"startOffset":182784,"endOffset":184437,"count":1}],"isBlockCoverage":true},{"functionName":"ignore_empty","ranges":[{"startOffset":184440,"endOffset":186329,"count":1}],"isBlockCoverage":true},{"functionName":"set_obj","ranges":[{"startOffset":186332,"endOffset":188138,"count":1}],"isBlockCoverage":true},{"functionName":"set_obj_w_date_time","ranges":[{"startOffset":188141,"endOffset":190496,"count":1}],"isBlockCoverage":true},{"functionName":"set_tab","ranges":[{"startOffset":190499,"endOffset":192288,"count":1}],"isBlockCoverage":true},{"functionName":"set_tab_hashed","ranges":[{"startOffset":192291,"endOffset":194083,"count":1}],"isBlockCoverage":true},{"functionName":"set_tab_nested_struct","ranges":[{"startOffset":194086,"endOffset":197103,"count":1}],"isBlockCoverage":true},{"functionName":"arrays","ranges":[{"startOffset":197106,"endOffset":202136,"count":1}],"isBlockCoverage":true},{"functionName":"arrays_negative","ranges":[{"startOffset":202139,"endOffset":206319,"count":1},{"startOffset":203014,"endOffset":203077,"count":0},{"startOffset":203400,"endOffset":203432,"count":0},{"startOffset":203595,"endOffset":203658,"count":0},{"startOffset":203964,"endOffset":203996,"count":0},{"startOffset":204157,"endOffset":204220,"count":0},{"startOffset":204526,"endOffset":204558,"count":0},{"startOffset":204724,"endOffset":204787,"count":0},{"startOffset":205116,"endOffset":205148,"count":0},{"startOffset":205312,"endOffset":205375,"count":0},{"startOffset":205704,"endOffset":205736,"count":0},{"startOffset":205898,"endOffset":205961,"count":0},{"startOffset":206277,"endOffset":206309,"count":0}],"isBlockCoverage":true},{"functionName":"root_assignment","ranges":[{"startOffset":206322,"endOffset":209665,"count":1}],"isBlockCoverage":true},{"functionName":"set_bool_abap_bool","ranges":[{"startOffset":209668,"endOffset":211092,"count":1}],"isBlockCoverage":true},{"functionName":"set_bool_int","ranges":[{"startOffset":211095,"endOffset":212530,"count":1}],"isBlockCoverage":true},{"functionName":"set_bool_tab","ranges":[{"startOffset":212533,"endOffset":214310,"count":1}],"isBlockCoverage":true},{"functionName":"set_str","ranges":[{"startOffset":214313,"endOffset":216112,"count":1}],"isBlockCoverage":true},{"functionName":"set_int","ranges":[{"startOffset":216115,"endOffset":217290,"count":1}],"isBlockCoverage":true},{"functionName":"set_date","ranges":[{"startOffset":217293,"endOffset":218844,"count":1}],"isBlockCoverage":true},{"functionName":"set_timestamp","ranges":[{"startOffset":218847,"endOffset":220208,"count":1}],"isBlockCoverage":true},{"functionName":"read_only","ranges":[{"startOffset":220211,"endOffset":222809,"count":1},{"startOffset":221192,"endOffset":221255,"count":0},{"startOffset":221385,"endOffset":221417,"count":0},{"startOffset":221542,"endOffset":221605,"count":0},{"startOffset":221735,"endOffset":221767,"count":0},{"startOffset":221933,"endOffset":221996,"count":0},{"startOffset":222126,"endOffset":222158,"count":0},{"startOffset":222278,"endOffset":222341,"count":0},{"startOffset":222471,"endOffset":222503,"count":0},{"startOffset":222574,"endOffset":222637,"count":0},{"startOffset":222767,"endOffset":222799,"count":0}],"isBlockCoverage":true},{"functionName":"set_array_obj","ranges":[{"startOffset":222812,"endOffset":225815,"count":1}],"isBlockCoverage":true},{"functionName":"set_with_type","ranges":[{"startOffset":225818,"endOffset":226775,"count":1}],"isBlockCoverage":true},{"functionName":"set_with_type_slice","ranges":[{"startOffset":226778,"endOffset":229339,"count":8},{"startOffset":228380,"endOffset":229335,"count":28},{"startOffset":228727,"endOffset":228929,"count":1},{"startOffset":228929,"endOffset":229329,"count":27},{"startOffset":229055,"endOffset":229174,"count":6},{"startOffset":229174,"endOffset":229329,"count":21}],"isBlockCoverage":true},{"functionName":"where","ranges":[{"startOffset":228292,"endOffset":228347,"count":232}],"isBlockCoverage":true},{"functionName":"overwrite_w_keep_order_set","ranges":[{"startOffset":229342,"endOffset":230839,"count":1}],"isBlockCoverage":true},{"functionName":"overwrite_w_keep_order_touch","ranges":[{"startOffset":230842,"endOffset":232543,"count":1}],"isBlockCoverage":true},{"functionName":"setx","ranges":[{"startOffset":232546,"endOffset":236207,"count":1}],"isBlockCoverage":true},{"functionName":"setx_float","ranges":[{"startOffset":236210,"endOffset":237787,"count":1}],"isBlockCoverage":true},{"functionName":"setx_complex","ranges":[{"startOffset":237790,"endOffset":239826,"count":1},{"startOffset":239203,"endOffset":239266,"count":0},{"startOffset":239396,"endOffset":239428,"count":0},{"startOffset":239591,"endOffset":239654,"count":0},{"startOffset":239784,"endOffset":239816,"count":0}],"isBlockCoverage":true},{"functionName":"setx_complex_w_keep_order","ranges":[{"startOffset":239829,"endOffset":241454,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":241559,"endOffset":242182,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_integrated","ranges":[{"startOffset":242186,"endOffset":242271,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":242274,"endOffset":242387,"count":8},{"startOffset":242330,"endOffset":242366,"count":0}],"isBlockCoverage":true},{"functionName":"array_simple","ranges":[{"startOffset":242390,"endOffset":244382,"count":1},{"startOffset":243309,"endOffset":243862,"count":10},{"startOffset":243454,"endOffset":243548,"count":9}],"isBlockCoverage":true},{"functionName":"array_index","ranges":[{"startOffset":244385,"endOffset":246854,"count":1},{"startOffset":245819,"endOffset":246334,"count":10},{"startOffset":245964,"endOffset":246058,"count":9}],"isBlockCoverage":true},{"functionName":"reader","ranges":[{"startOffset":246857,"endOffset":253552,"count":1}],"isBlockCoverage":true},{"functionName":"stringify","ranges":[{"startOffset":253555,"endOffset":257909,"count":1}],"isBlockCoverage":true},{"functionName":"item_order_integrated","ranges":[{"startOffset":257912,"endOffset":259586,"count":1}],"isBlockCoverage":true},{"functionName":"chaining","ranges":[{"startOffset":259589,"endOffset":260686,"count":1}],"isBlockCoverage":true},{"functionName":"push_json","ranges":[{"startOffset":260689,"endOffset":262477,"count":1}],"isBlockCoverage":true},{"functionName":"is_empty","ranges":[{"startOffset":262480,"endOffset":263142,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":267168,"endOffset":268115,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_abap_to_json","ranges":[{"startOffset":268119,"endOffset":268204,"count":13}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":268207,"endOffset":268320,"count":13},{"startOffset":268263,"endOffset":268299,"count":0}],"isBlockCoverage":true},{"functionName":"set_ajson","ranges":[{"startOffset":268323,"endOffset":270502,"count":1}],"isBlockCoverage":true},{"functionName":"set_value_number","ranges":[{"startOffset":270505,"endOffset":272126,"count":1}],"isBlockCoverage":true},{"functionName":"set_value_string","ranges":[{"startOffset":272129,"endOffset":273759,"count":1}],"isBlockCoverage":true},{"functionName":"set_value_true","ranges":[{"startOffset":273762,"endOffset":275376,"count":1}],"isBlockCoverage":true},{"functionName":"set_value_false","ranges":[{"startOffset":275379,"endOffset":276995,"count":1}],"isBlockCoverage":true},{"functionName":"set_value_xsdboolean","ranges":[{"startOffset":276998,"endOffset":278779,"count":1}],"isBlockCoverage":true},{"functionName":"set_null","ranges":[{"startOffset":278782,"endOffset":280455,"count":1}],"isBlockCoverage":true},{"functionName":"set_value_timestamp","ranges":[{"startOffset":280458,"endOffset":282568,"count":1}],"isBlockCoverage":true},{"functionName":"set_value_timestamp_initial","ranges":[{"startOffset":282571,"endOffset":284445,"count":1}],"isBlockCoverage":true},{"functionName":"prefix","ranges":[{"startOffset":284448,"endOffset":286517,"count":1}],"isBlockCoverage":true},{"functionName":"set_obj","ranges":[{"startOffset":286520,"endOffset":289235,"count":1}],"isBlockCoverage":true},{"functionName":"set_complex_obj","ranges":[{"startOffset":289238,"endOffset":296763,"count":1}],"isBlockCoverage":true},{"functionName":"set_array","ranges":[{"startOffset":296766,"endOffset":302021,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":305071,"endOffset":306450,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":305286,"endOffset":305747,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":305856,"endOffset":306206,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_filter_test","ranges":[{"startOffset":306454,"endOffset":307139,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":307142,"endOffset":307255,"count":3},{"startOffset":307198,"endOffset":307234,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_filter$keep_node","ranges":[{"startOffset":307258,"endOffset":309431,"count":22},{"startOffset":308348,"endOffset":308379,"count":10},{"startOffset":308441,"endOffset":308543,"count":12},{"startOffset":308907,"endOffset":309213,"count":10},{"startOffset":309325,"endOffset":309404,"count":20}],"isBlockCoverage":true},{"functionName":"simple_test","ranges":[{"startOffset":309434,"endOffset":311607,"count":1}],"isBlockCoverage":true},{"functionName":"array_test","ranges":[{"startOffset":311610,"endOffset":313393,"count":1}],"isBlockCoverage":true},{"functionName":"visit_types","ranges":[{"startOffset":313396,"endOffset":316483,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":317502,"endOffset":317993,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_mapper_test","ranges":[{"startOffset":317997,"endOffset":318082,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":318085,"endOffset":318198,"count":5},{"startOffset":318141,"endOffset":318177,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":318201,"endOffset":319756,"count":15},{"startOffset":319321,"endOffset":319386,"count":7},{"startOffset":319473,"endOffset":319518,"count":1},{"startOffset":319598,"endOffset":319752,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":319759,"endOffset":320163,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":320166,"endOffset":320570,"count":0}],"isBlockCoverage":false},{"functionName":"simple_test","ranges":[{"startOffset":320573,"endOffset":323350,"count":1}],"isBlockCoverage":true},{"functionName":"array_test","ranges":[{"startOffset":323353,"endOffset":325727,"count":1}],"isBlockCoverage":true},{"functionName":"duplication_test","ranges":[{"startOffset":325730,"endOffset":326931,"count":1},{"startOffset":326480,"endOffset":326543,"count":0},{"startOffset":326889,"endOffset":326921,"count":0}],"isBlockCoverage":true},{"functionName":"trivial","ranges":[{"startOffset":326934,"endOffset":328342,"count":1}],"isBlockCoverage":true},{"functionName":"empty_name_test","ranges":[{"startOffset":328345,"endOffset":329436,"count":1},{"startOffset":328968,"endOffset":329031,"count":0},{"startOffset":329394,"endOffset":329426,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":329543,"endOffset":330519,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":329806,"endOffset":330156,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_cloning_test","ranges":[{"startOffset":330523,"endOffset":330733,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":330736,"endOffset":330849,"count":5},{"startOffset":330792,"endOffset":330828,"count":0}],"isBlockCoverage":true},{"functionName":"clone_test","ranges":[{"startOffset":330852,"endOffset":333039,"count":1}],"isBlockCoverage":true},{"functionName":"filter_test","ranges":[{"startOffset":333042,"endOffset":334418,"count":1}],"isBlockCoverage":true},{"functionName":"mapper_test","ranges":[{"startOffset":334421,"endOffset":335908,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$rename_node","ranges":[{"startOffset":335911,"endOffset":337100,"count":5},{"startOffset":337031,"endOffset":337096,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_ajson_mapping$to_abap","ranges":[{"startOffset":337103,"endOffset":337507,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_mapping$to_json","ranges":[{"startOffset":337510,"endOffset":337914,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_ajson_filter$keep_node","ranges":[{"startOffset":337917,"endOffset":339416,"count":9},{"startOffset":339007,"endOffset":339038,"count":4},{"startOffset":339100,"endOffset":339202,"count":5},{"startOffset":339279,"endOffset":339389,"count":5}],"isBlockCoverage":true},{"functionName":"mapper_and_filter","ranges":[{"startOffset":339419,"endOffset":341097,"count":1}],"isBlockCoverage":true},{"functionName":"opts_copying","ranges":[{"startOffset":341100,"endOffset":341880,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1167","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_filter_lib.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12198,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":355,"endOffset":975,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_filters_test","ranges":[{"startOffset":979,"endOffset":1064,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1067,"endOffset":1180,"count":7},{"startOffset":1123,"endOffset":1159,"count":0}],"isBlockCoverage":true},{"functionName":"empty_filter_simple","ranges":[{"startOffset":1183,"endOffset":2503,"count":1}],"isBlockCoverage":true},{"functionName":"empty_filter_deep","ranges":[{"startOffset":2506,"endOffset":3816,"count":1}],"isBlockCoverage":true},{"functionName":"path_filter","ranges":[{"startOffset":3819,"endOffset":5395,"count":1}],"isBlockCoverage":true},{"functionName":"path_filter_string","ranges":[{"startOffset":5398,"endOffset":6650,"count":1}],"isBlockCoverage":true},{"functionName":"path_filter_w_patterns","ranges":[{"startOffset":6653,"endOffset":8263,"count":1}],"isBlockCoverage":true},{"functionName":"path_filter_deep","ranges":[{"startOffset":8266,"endOffset":9983,"count":1}],"isBlockCoverage":true},{"functionName":"and_filter","ranges":[{"startOffset":9986,"endOffset":12004,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1168","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_mapping.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":29471,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":491,"endOffset":1565,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test_mappers","ranges":[{"startOffset":1569,"endOffset":1654,"count":15}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1657,"endOffset":1770,"count":15},{"startOffset":1713,"endOffset":1749,"count":0}],"isBlockCoverage":true},{"functionName":"from_json_to_json","ranges":[{"startOffset":1773,"endOffset":2538,"count":1}],"isBlockCoverage":true},{"functionName":"to_abap","ranges":[{"startOffset":2541,"endOffset":3466,"count":1}],"isBlockCoverage":true},{"functionName":"to_json","ranges":[{"startOffset":3469,"endOffset":4537,"count":1}],"isBlockCoverage":true},{"functionName":"to_json_nested_struc","ranges":[{"startOffset":4540,"endOffset":5897,"count":1}],"isBlockCoverage":true},{"functionName":"to_json_nested_table","ranges":[{"startOffset":5900,"endOffset":7593,"count":1}],"isBlockCoverage":true},{"functionName":"to_json_first_lower","ranges":[{"startOffset":7596,"endOffset":8630,"count":1}],"isBlockCoverage":true},{"functionName":"test_to_upper","ranges":[{"startOffset":8633,"endOffset":9517,"count":1}],"isBlockCoverage":true},{"functionName":"test_to_lower","ranges":[{"startOffset":9520,"endOffset":10404,"count":1}],"isBlockCoverage":true},{"functionName":"rename_by_attr","ranges":[{"startOffset":10407,"endOffset":12318,"count":1}],"isBlockCoverage":true},{"functionName":"rename_by_path","ranges":[{"startOffset":12321,"endOffset":13982,"count":1}],"isBlockCoverage":true},{"functionName":"rename_by_pattern","ranges":[{"startOffset":13985,"endOffset":15675,"count":1}],"isBlockCoverage":true},{"functionName":"compound_mapper","ranges":[{"startOffset":15678,"endOffset":17511,"count":1}],"isBlockCoverage":true},{"functionName":"to_snake","ranges":[{"startOffset":17514,"endOffset":18025,"count":1}],"isBlockCoverage":true},{"functionName":"to_camel","ranges":[{"startOffset":18028,"endOffset":18968,"count":1}],"isBlockCoverage":true},{"functionName":"to_camel_1st_upper","ranges":[{"startOffset":18971,"endOffset":19545,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19656,"endOffset":20284,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":20089,"endOffset":20153,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":20196,"endOffset":20260,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_fields","ranges":[{"startOffset":20288,"endOffset":20373,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":20376,"endOffset":20489,"count":3},{"startOffset":20432,"endOffset":20468,"count":0}],"isBlockCoverage":true},{"functionName":"to_abap","ranges":[{"startOffset":20492,"endOffset":22978,"count":1}],"isBlockCoverage":true},{"functionName":"to_json_without_path","ranges":[{"startOffset":22981,"endOffset":23237,"count":1}],"isBlockCoverage":true},{"functionName":"to_json_with_path","ranges":[{"startOffset":23240,"endOffset":23523,"count":1}],"isBlockCoverage":true},{"functionName":"to_json","ranges":[{"startOffset":23526,"endOffset":26106,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":26207,"endOffset":26444,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_to_lower","ranges":[{"startOffset":26448,"endOffset":26533,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":26536,"endOffset":26649,"count":1},{"startOffset":26592,"endOffset":26628,"count":0}],"isBlockCoverage":true},{"functionName":"to_json","ranges":[{"startOffset":26652,"endOffset":27675,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":27780,"endOffset":28017,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_to_upper","ranges":[{"startOffset":28021,"endOffset":28106,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":28109,"endOffset":28222,"count":1},{"startOffset":28165,"endOffset":28201,"count":0}],"isBlockCoverage":true},{"functionName":"to_json","ranges":[{"startOffset":28225,"endOffset":29248,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1169","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_utilities.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":35514,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":228,"endOffset":2836,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":419,"endOffset":1384,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1525,"endOffset":1589,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1682,"endOffset":2812,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_nodes_helper","ranges":[{"startOffset":2840,"endOffset":3896,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3899,"endOffset":4012,"count":7},{"startOffset":3955,"endOffset":3991,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":4015,"endOffset":5650,"count":36}],"isBlockCoverage":true},{"functionName":"sorted","ranges":[{"startOffset":5653,"endOffset":6862,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6978,"endOffset":7441,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7241,"endOffset":7305,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7353,"endOffset":7417,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_parser_test","ranges":[{"startOffset":7445,"endOffset":7530,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7533,"endOffset":7646,"count":0}],"isBlockCoverage":false},{"functionName":"sample_json","ranges":[{"startOffset":7649,"endOffset":7727,"count":0}],"isBlockCoverage":false},{"functionName":"sample_json","ranges":[{"startOffset":7737,"endOffset":11052,"count":1},{"startOffset":7919,"endOffset":7940,"count":0},{"startOffset":7942,"endOffset":7981,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11167,"endOffset":11693,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_json_utils","ranges":[{"startOffset":11697,"endOffset":11782,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":11785,"endOffset":11898,"count":6},{"startOffset":11841,"endOffset":11877,"count":0}],"isBlockCoverage":true},{"functionName":"json_diff","ranges":[{"startOffset":11901,"endOffset":19796,"count":1}],"isBlockCoverage":true},{"functionName":"json_diff_types","ranges":[{"startOffset":19799,"endOffset":24456,"count":1}],"isBlockCoverage":true},{"functionName":"json_diff_arrays","ranges":[{"startOffset":24459,"endOffset":27966,"count":1}],"isBlockCoverage":true},{"functionName":"json_merge","ranges":[{"startOffset":27969,"endOffset":31273,"count":1}],"isBlockCoverage":true},{"functionName":"json_sort","ranges":[{"startOffset":31276,"endOffset":33762,"count":1}],"isBlockCoverage":true},{"functionName":"is_equal","ranges":[{"startOffset":33765,"endOffset":35292,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1170","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_apack_reader.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11947,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":229,"endOffset":3688,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":437,"endOffset":569,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":858,"endOffset":3664,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_apack_manifest_reader","ranges":[{"startOffset":3692,"endOffset":3925,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3928,"endOffset":4041,"count":1},{"startOffset":3984,"endOffset":4020,"count":0}],"isBlockCoverage":true},{"functionName":"manifest_descriptor","ranges":[{"startOffset":4044,"endOffset":4206,"count":1}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":4209,"endOffset":7769,"count":1}],"isBlockCoverage":true},{"functionName":"verify_own_descriptor","ranges":[{"startOffset":7772,"endOffset":11734,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1171","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_auth.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1164,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":188,"endOffset":421,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":425,"endOffset":510,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":513,"endOffset":626,"count":1},{"startOffset":569,"endOffset":605,"count":0}],"isBlockCoverage":true},{"functionName":"default_is_allow","ranges":[{"startOffset":629,"endOffset":1018,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1172","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_convert.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11745,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":200,"endOffset":1144,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_convert","ranges":[{"startOffset":1148,"endOffset":1233,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1236,"endOffset":1349,"count":12},{"startOffset":1292,"endOffset":1328,"count":0}],"isBlockCoverage":true},{"functionName":"xstring_to_bintab","ranges":[{"startOffset":1352,"endOffset":2105,"count":1}],"isBlockCoverage":true},{"functionName":"string_to_xstring","ranges":[{"startOffset":2108,"endOffset":2490,"count":1}],"isBlockCoverage":true},{"functionName":"string_to_tab","ranges":[{"startOffset":2493,"endOffset":3257,"count":1}],"isBlockCoverage":true},{"functionName":"conversion_exit_isola_output","ranges":[{"startOffset":3260,"endOffset":3660,"count":1}],"isBlockCoverage":true},{"functionName":"base64_to_xstring","ranges":[{"startOffset":3663,"endOffset":4035,"count":1}],"isBlockCoverage":true},{"functionName":"string_to_xstring_utf8","ranges":[{"startOffset":4038,"endOffset":4663,"count":1}],"isBlockCoverage":true},{"functionName":"string_to_xstring_utf8_bom","ranges":[{"startOffset":4666,"endOffset":5584,"count":1}],"isBlockCoverage":true},{"functionName":"xstring_to_string_utf8","ranges":[{"startOffset":5587,"endOffset":6206,"count":1}],"isBlockCoverage":true},{"functionName":"xstring_to_string_not_utf8","ranges":[{"startOffset":6209,"endOffset":6699,"count":1},{"startOffset":6465,"endOffset":6531,"count":0},{"startOffset":6657,"endOffset":6689,"count":0}],"isBlockCoverage":true},{"functionName":"convert_bitbyte","ranges":[{"startOffset":6702,"endOffset":9084,"count":1},{"startOffset":7551,"endOffset":9029,"count":1000},{"startOffset":8184,"endOffset":8767,"count":4000}],"isBlockCoverage":true},{"functionName":"convert_int","ranges":[{"startOffset":9087,"endOffset":9970,"count":1},{"startOffset":9501,"endOffset":9915,"count":1000}],"isBlockCoverage":true},{"functionName":"split_string","ranges":[{"startOffset":9973,"endOffset":11584,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1173","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_config.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9988,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":209,"endOffset":2346,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":388,"endOffset":452,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":535,"endOffset":1124,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1437,"endOffset":2322,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test","ranges":[{"startOffset":2350,"endOffset":3100,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3103,"endOffset":3216,"count":2},{"startOffset":3159,"endOffset":3195,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":3219,"endOffset":4097,"count":2}],"isBlockCoverage":true},{"functionName":"double_add_config","ranges":[{"startOffset":4100,"endOffset":5783,"count":1}],"isBlockCoverage":true},{"functionName":"to_json","ranges":[{"startOffset":5786,"endOffset":8332,"count":1}],"isBlockCoverage":true},{"functionName":"from_json","ranges":[{"startOffset":8335,"endOffset":9828,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1174","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_deserializer.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":21058,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":229,"endOffset":683,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":687,"endOffset":772,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":775,"endOffset":888,"count":4},{"startOffset":831,"endOffset":867,"count":0}],"isBlockCoverage":true},{"functionName":"test1","ranges":[{"startOffset":891,"endOffset":3250,"count":1}],"isBlockCoverage":true},{"functionName":"preview_database_changes_ins","ranges":[{"startOffset":3253,"endOffset":9015,"count":1}],"isBlockCoverage":true},{"functionName":"preview_database_changes_upd","ranges":[{"startOffset":9018,"endOffset":15114,"count":1}],"isBlockCoverage":true},{"functionName":"preview_database_changes_del","ranges":[{"startOffset":15117,"endOffset":20886,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1175","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_serializer.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7159,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":223,"endOffset":1077,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":405,"endOffset":547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":630,"endOffset":764,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test","ranges":[{"startOffset":1081,"endOffset":1453,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1456,"endOffset":1569,"count":3},{"startOffset":1512,"endOffset":1548,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1572,"endOffset":1780,"count":3}],"isBlockCoverage":true},{"functionName":"serialize","ranges":[{"startOffset":1783,"endOffset":4043,"count":1}],"isBlockCoverage":true},{"functionName":"serialize_error_table","ranges":[{"startOffset":4046,"endOffset":5522,"count":1},{"startOffset":5296,"endOffset":5518,"count":0}],"isBlockCoverage":true},{"functionName":"serialize_error_field","ranges":[{"startOffset":5525,"endOffset":6991,"count":1},{"startOffset":6760,"endOffset":6823,"count":0},{"startOffset":6949,"endOffset":6981,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1176","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_supporter.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3843,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":227,"endOffset":450,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_supporter_mock","ranges":[{"startOffset":454,"endOffset":539,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":542,"endOffset":655,"count":1},{"startOffset":598,"endOffset":634,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_data_supporter$is_object_supported","ranges":[{"startOffset":658,"endOffset":1383,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1501,"endOffset":1806,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_supporter","ranges":[{"startOffset":1810,"endOffset":1895,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1898,"endOffset":2011,"count":2},{"startOffset":1954,"endOffset":1990,"count":0}],"isBlockCoverage":true},{"functionName":"is_not_supported","ranges":[{"startOffset":2014,"endOffset":2542,"count":1}],"isBlockCoverage":true},{"functionName":"is_supported","ranges":[{"startOffset":2545,"endOffset":3642,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1177","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_utils.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4803,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":217,"endOffset":597,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_data_utils_test","ranges":[{"startOffset":601,"endOffset":686,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":689,"endOffset":802,"count":3},{"startOffset":745,"endOffset":781,"count":0}],"isBlockCoverage":true},{"functionName":"build_data_filename","ranges":[{"startOffset":805,"endOffset":2164,"count":1}],"isBlockCoverage":true},{"functionName":"build_config_filename","ranges":[{"startOffset":2167,"endOffset":3532,"count":1}],"isBlockCoverage":true},{"functionName":"build_table_itab","ranges":[{"startOffset":3535,"endOffset":4612,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1178","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_diff.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":41648,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":188,"endOffset":5646,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":359,"endOffset":602,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":682,"endOffset":925,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1009,"endOffset":1292,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1377,"endOffset":2604,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2749,"endOffset":2813,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2905,"endOffset":2969,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3067,"endOffset":3131,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3232,"endOffset":3337,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3379,"endOffset":3473,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3518,"endOffset":3622,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3668,"endOffset":3773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3815,"endOffset":3909,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3954,"endOffset":4052,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4206,"endOffset":4303,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4357,"endOffset":4454,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4504,"endOffset":4601,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4653,"endOffset":4750,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_diff","ranges":[{"startOffset":5650,"endOffset":7756,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":7759,"endOffset":7872,"count":0}],"isBlockCoverage":false},{"functionName":"add_new","ranges":[{"startOffset":7875,"endOffset":8094,"count":0}],"isBlockCoverage":false},{"functionName":"add_old","ranges":[{"startOffset":8097,"endOffset":8316,"count":0}],"isBlockCoverage":false},{"functionName":"add_beacon","ranges":[{"startOffset":8319,"endOffset":8560,"count":0}],"isBlockCoverage":false},{"functionName":"add_expected","ranges":[{"startOffset":8563,"endOffset":10956,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":10959,"endOffset":11147,"count":0}],"isBlockCoverage":false},{"functionName":"test","ranges":[{"startOffset":11150,"endOffset":16246,"count":0}],"isBlockCoverage":false},{"functionName":"diff01","ranges":[{"startOffset":16249,"endOffset":16685,"count":0}],"isBlockCoverage":false},{"functionName":"diff02","ranges":[{"startOffset":16688,"endOffset":17205,"count":0}],"isBlockCoverage":false},{"functionName":"diff03","ranges":[{"startOffset":17208,"endOffset":17644,"count":0}],"isBlockCoverage":false},{"functionName":"diff04","ranges":[{"startOffset":17647,"endOffset":18163,"count":0}],"isBlockCoverage":false},{"functionName":"diff05","ranges":[{"startOffset":18166,"endOffset":19157,"count":0}],"isBlockCoverage":false},{"functionName":"diff06","ranges":[{"startOffset":19160,"endOffset":21517,"count":0}],"isBlockCoverage":false},{"functionName":"diff07","ranges":[{"startOffset":21520,"endOffset":23516,"count":0}],"isBlockCoverage":false},{"functionName":"diff08","ranges":[{"startOffset":23519,"endOffset":25534,"count":0}],"isBlockCoverage":false},{"functionName":"diff09","ranges":[{"startOffset":25537,"endOffset":27516,"count":0}],"isBlockCoverage":false},{"functionName":"diff10","ranges":[{"startOffset":27519,"endOffset":28101,"count":0}],"isBlockCoverage":false},{"functionName":"diff11","ranges":[{"startOffset":28104,"endOffset":29207,"count":0}],"isBlockCoverage":false},{"functionName":"diff12","ranges":[{"startOffset":29210,"endOffset":32207,"count":0}],"isBlockCoverage":false},{"functionName":"diff13","ranges":[{"startOffset":32210,"endOffset":35207,"count":0}],"isBlockCoverage":false},{"functionName":"diff14","ranges":[{"startOffset":35210,"endOffset":37584,"count":0}],"isBlockCoverage":false},{"functionName":"diff15","ranges":[{"startOffset":37587,"endOffset":38144,"count":0}],"isBlockCoverage":false},{"functionName":"diff16","ranges":[{"startOffset":38147,"endOffset":38714,"count":0}],"isBlockCoverage":false},{"functionName":"map_beacons","ranges":[{"startOffset":38717,"endOffset":41502,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1179","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_dot_abapgit.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7826,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":218,"endOffset":508,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_dot_abapgit","ranges":[{"startOffset":512,"endOffset":597,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":600,"endOffset":713,"count":1},{"startOffset":656,"endOffset":692,"count":0}],"isBlockCoverage":true},{"functionName":"identity","ranges":[{"startOffset":716,"endOffset":5158,"count":0}],"isBlockCoverage":false},{"functionName":"ignore","ranges":[{"startOffset":5161,"endOffset":7645,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1180","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_environment.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2156,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":211,"endOffset":975,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":389,"endOffset":523,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test","ranges":[{"startOffset":979,"endOffset":1202,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1205,"endOffset":1318,"count":4},{"startOffset":1261,"endOffset":1297,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1321,"endOffset":1431,"count":4}],"isBlockCoverage":true},{"functionName":"is_sap_cloud_platform","ranges":[{"startOffset":1434,"endOffset":1546,"count":1}],"isBlockCoverage":true},{"functionName":"is_merged","ranges":[{"startOffset":1549,"endOffset":1637,"count":1}],"isBlockCoverage":true},{"functionName":"is_repo_object_changes_allowed","ranges":[{"startOffset":1640,"endOffset":1770,"count":0}],"isBlockCoverage":false},{"functionName":"compare_with_inactive","ranges":[{"startOffset":1773,"endOffset":1885,"count":1}],"isBlockCoverage":true},{"functionName":"is_restart_required","ranges":[{"startOffset":1888,"endOffset":1996,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1181","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_filename_logic.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":17891,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":230,"endOffset":456,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_memory_settings","ranges":[{"startOffset":460,"endOffset":545,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":548,"endOffset":661,"count":6},{"startOffset":604,"endOffset":640,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_persist_settings$modify","ranges":[{"startOffset":664,"endOffset":936,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_settings$read","ranges":[{"startOffset":939,"endOffset":1230,"count":70}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1350,"endOffset":2162,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1537,"endOffset":1667,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_run_checks","ranges":[{"startOffset":2166,"endOffset":2385,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2388,"endOffset":2501,"count":6},{"startOffset":2444,"endOffset":2480,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":2504,"endOffset":2988,"count":6}],"isBlockCoverage":true},{"functionName":"dot_abapgit","ranges":[{"startOffset":2991,"endOffset":3481,"count":1}],"isBlockCoverage":true},{"functionName":"is_obj_def_file","ranges":[{"startOffset":3484,"endOffset":4500,"count":1}],"isBlockCoverage":true},{"functionName":"file_to_object","ranges":[{"startOffset":4503,"endOffset":10710,"count":1}],"isBlockCoverage":true},{"functionName":"object_to_file","ranges":[{"startOffset":10713,"endOffset":14756,"count":1}],"isBlockCoverage":true},{"functionName":"file_to_object_package","ranges":[{"startOffset":14759,"endOffset":16531,"count":1}],"isBlockCoverage":true},{"functionName":"object_to_file_package","ranges":[{"startOffset":16534,"endOffset":17686,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1182","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_deserialize.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":38444,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":245,"endOffset":2953,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":449,"endOffset":589,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":672,"endOffset":2031,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2798,"endOffset":2862,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_filter_files_to_deser","ranges":[{"startOffset":2957,"endOffset":4556,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4559,"endOffset":4672,"count":8},{"startOffset":4615,"endOffset":4651,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":4675,"endOffset":4794,"count":8}],"isBlockCoverage":true},{"functionName":"filter_duplicates","ranges":[{"startOffset":4797,"endOffset":5283,"count":1}],"isBlockCoverage":true},{"functionName":"filter_duplicates_rstate","ranges":[{"startOffset":5286,"endOffset":8195,"count":1}],"isBlockCoverage":true},{"functionName":"filter_duplicates_lstate","ranges":[{"startOffset":8198,"endOffset":8693,"count":1}],"isBlockCoverage":true},{"functionName":"filter_duplicates_match","ranges":[{"startOffset":8696,"endOffset":9190,"count":1}],"isBlockCoverage":true},{"functionName":"filter_duplicates_init_objtype","ranges":[{"startOffset":9193,"endOffset":9684,"count":1}],"isBlockCoverage":true},{"functionName":"filter_duplicates_changes_01","ranges":[{"startOffset":9687,"endOffset":12615,"count":1}],"isBlockCoverage":true},{"functionName":"filter_duplicates_changes_02","ranges":[{"startOffset":12618,"endOffset":15546,"count":1}],"isBlockCoverage":true},{"functionName":"filter_duplicates_deleted","ranges":[{"startOffset":15549,"endOffset":15911,"count":1}],"isBlockCoverage":true},{"functionName":"given_result","ranges":[{"startOffset":15914,"endOffset":17559,"count":15}],"isBlockCoverage":true},{"functionName":"when_filter_is_applied","ranges":[{"startOffset":17562,"endOffset":17711,"count":8}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17857,"endOffset":23001,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":18060,"endOffset":18200,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18282,"endOffset":19641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19724,"endOffset":21083,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21167,"endOffset":21227,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":21320,"endOffset":21380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22679,"endOffset":22743,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":22913,"endOffset":22977,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_prio_deserialization","ranges":[{"startOffset":23005,"endOffset":26114,"count":18}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":26117,"endOffset":26230,"count":18},{"startOffset":26173,"endOffset":26209,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":26233,"endOffset":26419,"count":18}],"isBlockCoverage":true},{"functionName":"enhs_before_ensc","ranges":[{"startOffset":26422,"endOffset":26826,"count":1}],"isBlockCoverage":true},{"functionName":"ensc_before_enho","ranges":[{"startOffset":26829,"endOffset":27233,"count":1}],"isBlockCoverage":true},{"functionName":"enho_before_enhc","ranges":[{"startOffset":27236,"endOffset":27640,"count":1}],"isBlockCoverage":true},{"functionName":"sprx_before_clas","ranges":[{"startOffset":27643,"endOffset":28047,"count":1}],"isBlockCoverage":true},{"functionName":"sprx_before_intf","ranges":[{"startOffset":28050,"endOffset":28454,"count":1}],"isBlockCoverage":true},{"functionName":"sprx_before_tabl","ranges":[{"startOffset":28457,"endOffset":28861,"count":1}],"isBlockCoverage":true},{"functionName":"otgr_before_char","ranges":[{"startOffset":28864,"endOffset":29268,"count":1}],"isBlockCoverage":true},{"functionName":"pinf_before_devc","ranges":[{"startOffset":29271,"endOffset":29675,"count":1}],"isBlockCoverage":true},{"functionName":"tobj_before_scp1","ranges":[{"startOffset":29678,"endOffset":30082,"count":1}],"isBlockCoverage":true},{"functionName":"iobj_before_odso","ranges":[{"startOffset":30085,"endOffset":30489,"count":1}],"isBlockCoverage":true},{"functionName":"iasp_before_iarp","ranges":[{"startOffset":30492,"endOffset":30896,"count":1}],"isBlockCoverage":true},{"functionName":"iarp_before_iatu","ranges":[{"startOffset":30899,"endOffset":31303,"count":1}],"isBlockCoverage":true},{"functionName":"prog_before_iaxu","ranges":[{"startOffset":31306,"endOffset":31710,"count":1}],"isBlockCoverage":true},{"functionName":"webi_before_sprx","ranges":[{"startOffset":31713,"endOffset":32117,"count":1}],"isBlockCoverage":true},{"functionName":"clas_before_pinf","ranges":[{"startOffset":32120,"endOffset":32524,"count":1}],"isBlockCoverage":true},{"functionName":"xslt_before_clas","ranges":[{"startOffset":32527,"endOffset":33595,"count":1}],"isBlockCoverage":true},{"functionName":"xslt_before_prog","ranges":[{"startOffset":33598,"endOffset":34002,"count":1}],"isBlockCoverage":true},{"functionName":"ddls_before_dcls","ranges":[{"startOffset":34005,"endOffset":34741,"count":1}],"isBlockCoverage":true},{"functionName":"given","ranges":[{"startOffset":34744,"endOffset":36252,"count":42}],"isBlockCoverage":true},{"functionName":"when_deser_is_priorized","ranges":[{"startOffset":36255,"endOffset":36604,"count":18}],"isBlockCoverage":true},{"functionName":"check","ranges":[{"startOffset":36607,"endOffset":38198,"count":42}],"isBlockCoverage":true}]},{"scriptId":"1183","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_add_patch.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":36946,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":4759,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":418,"endOffset":1645,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1727,"endOffset":1985,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2067,"endOffset":2193,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3318,"endOffset":3415,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3461,"endOffset":3566,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3608,"endOffset":3702,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3747,"endOffset":3851,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3897,"endOffset":4002,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4044,"endOffset":4138,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4182,"endOffset":4279,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4324,"endOffset":4422,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4602,"endOffset":4666,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_calculate_patch","ranges":[{"startOffset":4763,"endOffset":6476,"count":15}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":6479,"endOffset":6592,"count":15},{"startOffset":6535,"endOffset":6571,"count":0}],"isBlockCoverage":true},{"functionName":"single_insert","ranges":[{"startOffset":6595,"endOffset":7890,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_adjacent_insert","ranges":[{"startOffset":7893,"endOffset":9631,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_non_adjacent_insert","ranges":[{"startOffset":9634,"endOffset":11764,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_partial_insert","ranges":[{"startOffset":11767,"endOffset":13812,"count":1}],"isBlockCoverage":true},{"functionName":"single_delete","ranges":[{"startOffset":13815,"endOffset":14982,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_adjacend_delete","ranges":[{"startOffset":14985,"endOffset":16515,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_non_adjacent_delete","ranges":[{"startOffset":16518,"endOffset":18535,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_partial_delete","ranges":[{"startOffset":18538,"endOffset":20981,"count":1}],"isBlockCoverage":true},{"functionName":"single_update","ranges":[{"startOffset":20984,"endOffset":22307,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_adjacend_update","ranges":[{"startOffset":22310,"endOffset":24083,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_non_adjacent_update","ranges":[{"startOffset":24086,"endOffset":26251,"count":1}],"isBlockCoverage":true},{"functionName":"multiple_partial_update","ranges":[{"startOffset":26254,"endOffset":28421,"count":1}],"isBlockCoverage":true},{"functionName":"mixed","ranges":[{"startOffset":28424,"endOffset":30997,"count":1}],"isBlockCoverage":true},{"functionName":"no_diff","ranges":[{"startOffset":31000,"endOffset":31494,"count":1}],"isBlockCoverage":true},{"functionName":"unknown_result_type","ranges":[{"startOffset":31497,"endOffset":31947,"count":1}],"isBlockCoverage":true},{"functionName":"given_diff","ranges":[{"startOffset":31950,"endOffset":34844,"count":60},{"startOffset":33154,"endOffset":33185,"count":0},{"startOffset":33436,"endOffset":33469,"count":0}],"isBlockCoverage":true},{"functionName":"when_patch_is_calculated","ranges":[{"startOffset":34847,"endOffset":35433,"count":15},{"startOffset":35225,"endOffset":35235,"count":14},{"startOffset":35235,"endOffset":35429,"count":1},{"startOffset":35391,"endOffset":35423,"count":0}],"isBlockCoverage":true},{"functionName":"then_patch_should_be","ranges":[{"startOffset":35436,"endOffset":36537,"count":14},{"startOffset":36215,"endOffset":36533,"count":50}],"isBlockCoverage":true},{"functionName":"then_exception_is_raised","ranges":[{"startOffset":36540,"endOffset":36749,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1184","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_branch_list.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9445,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":224,"endOffset":1215,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":408,"endOffset":654,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":808,"endOffset":868,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_parse","ranges":[{"startOffset":1219,"endOffset":1555,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1558,"endOffset":1671,"count":5},{"startOffset":1614,"endOffset":1650,"count":0}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":1674,"endOffset":4071,"count":4},{"startOffset":1783,"endOffset":1809,"count":1},{"startOffset":1811,"endOffset":1860,"count":1},{"startOffset":1889,"endOffset":1929,"count":1},{"startOffset":1931,"endOffset":1985,"count":3},{"startOffset":3240,"endOffset":4070,"count":3}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":3552,"endOffset":3689,"count":5}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":3718,"endOffset":3740,"count":0}],"isBlockCoverage":false},{"functionName":"parse_ok_without_first_lf","ranges":[{"startOffset":4074,"endOffset":4581,"count":1}],"isBlockCoverage":true},{"functionName":"parse_works","ranges":[{"startOffset":4584,"endOffset":5074,"count":1}],"isBlockCoverage":true},{"functionName":"captcha_response_is_caught","ranges":[{"startOffset":5077,"endOffset":5983,"count":1},{"startOffset":5557,"endOffset":5620,"count":0},{"startOffset":5941,"endOffset":5973,"count":0}],"isBlockCoverage":true},{"functionName":"use_refs_if_head_is_missing","ranges":[{"startOffset":5986,"endOffset":6493,"count":1}],"isBlockCoverage":true},{"functionName":"parse_raw","ranges":[{"startOffset":6496,"endOffset":9274,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1185","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_commit.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":43907,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":208,"endOffset":507,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":511,"endOffset":596,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":599,"endOffset":712,"count":2},{"startOffset":655,"endOffset":691,"count":0}],"isBlockCoverage":true},{"functionName":"parse_commits","ranges":[{"startOffset":715,"endOffset":8565,"count":1}],"isBlockCoverage":true},{"functionName":"check_author_regex","ranges":[{"startOffset":8568,"endOffset":15666,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":15768,"endOffset":19944,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":15959,"endOffset":18350,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18894,"endOffset":18996,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19106,"endOffset":19208,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19322,"endOffset":19424,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19522,"endOffset":19624,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19670,"endOffset":19772,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19818,"endOffset":19920,"count":0}],"isBlockCoverage":false},{"functionName":"ltc_parent_handling","ranges":[{"startOffset":19948,"endOffset":22432,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":22435,"endOffset":22548,"count":6},{"startOffset":22491,"endOffset":22527,"count":0}],"isBlockCoverage":true},{"functionName":"blank_not_missing","ranges":[{"startOffset":22551,"endOffset":22760,"count":1}],"isBlockCoverage":true},{"functionName":"parent_is_missing","ranges":[{"startOffset":22763,"endOffset":22971,"count":1}],"isBlockCoverage":true},{"functionName":"parent_is_found","ranges":[{"startOffset":22974,"endOffset":23184,"count":1}],"isBlockCoverage":true},{"functionName":"missing_parent1_cleared","ranges":[{"startOffset":23187,"endOffset":25880,"count":1}],"isBlockCoverage":true},{"functionName":"missing_parent2_cleared","ranges":[{"startOffset":25883,"endOffset":28576,"count":1}],"isBlockCoverage":true},{"functionName":"matched_parent1_remains","ranges":[{"startOffset":28579,"endOffset":31355,"count":1}],"isBlockCoverage":true},{"functionName":"given_commit_sha1","ranges":[{"startOffset":31358,"endOffset":33849,"count":3}],"isBlockCoverage":true},{"functionName":"parent_should_be_missing","ranges":[{"startOffset":33852,"endOffset":34237,"count":1}],"isBlockCoverage":true},{"functionName":"parent_should_not_be_missing","ranges":[{"startOffset":34240,"endOffset":34630,"count":2}],"isBlockCoverage":true},{"functionName":"given_commit","ranges":[{"startOffset":34633,"endOffset":37598,"count":4},{"startOffset":34973,"endOffset":35008,"count":2},{"startOffset":35153,"endOffset":35188,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":37725,"endOffset":38503,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_extract_author_data","ranges":[{"startOffset":38507,"endOffset":38592,"count":9}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":38595,"endOffset":38708,"count":9},{"startOffset":38651,"endOffset":38687,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data1","ranges":[{"startOffset":38711,"endOffset":39262,"count":1},{"startOffset":38935,"endOffset":39258,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data2","ranges":[{"startOffset":39265,"endOffset":39821,"count":1},{"startOffset":39511,"endOffset":39817,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data3","ranges":[{"startOffset":39824,"endOffset":40375,"count":1},{"startOffset":40060,"endOffset":40207,"count":0},{"startOffset":40333,"endOffset":40365,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data4","ranges":[{"startOffset":40378,"endOffset":40930,"count":1},{"startOffset":40614,"endOffset":40762,"count":0},{"startOffset":40888,"endOffset":40920,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data5","ranges":[{"startOffset":40933,"endOffset":41486,"count":1},{"startOffset":41158,"endOffset":41318,"count":0},{"startOffset":41444,"endOffset":41476,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data6","ranges":[{"startOffset":41489,"endOffset":42000,"count":1},{"startOffset":41678,"endOffset":41832,"count":0},{"startOffset":41958,"endOffset":41990,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data7","ranges":[{"startOffset":42003,"endOffset":42548,"count":1},{"startOffset":42227,"endOffset":42380,"count":0},{"startOffset":42506,"endOffset":42538,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data8","ranges":[{"startOffset":42551,"endOffset":43102,"count":1},{"startOffset":42780,"endOffset":42934,"count":0},{"startOffset":43060,"endOffset":43092,"count":0}],"isBlockCoverage":true},{"functionName":"extract_author_data9","ranges":[{"startOffset":43105,"endOffset":43672,"count":1},{"startOffset":43351,"endOffset":43668,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1186","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_pack.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":54402,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":333,"endOffset":662,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_tree","ranges":[{"startOffset":666,"endOffset":751,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":754,"endOffset":867,"count":3},{"startOffset":810,"endOffset":846,"count":0}],"isBlockCoverage":true},{"functionName":"test01","ranges":[{"startOffset":870,"endOffset":3216,"count":1}],"isBlockCoverage":true},{"functionName":"test02","ranges":[{"startOffset":3219,"endOffset":5971,"count":1}],"isBlockCoverage":true},{"functionName":"test03","ranges":[{"startOffset":5974,"endOffset":8320,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8421,"endOffset":9785,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":8676,"endOffset":8736,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8779,"endOffset":8880,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8927,"endOffset":8993,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_type_and_length","ranges":[{"startOffset":9789,"endOffset":9874,"count":12}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":9877,"endOffset":9990,"count":12},{"startOffset":9933,"endOffset":9969,"count":0}],"isBlockCoverage":true},{"functionName":"test","ranges":[{"startOffset":9993,"endOffset":10922,"count":12},{"startOffset":10284,"endOffset":10313,"count":1},{"startOffset":10374,"endOffset":10478,"count":11}],"isBlockCoverage":true},{"functionName":"type_and_length_100","ranges":[{"startOffset":10925,"endOffset":11081,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_2047","ranges":[{"startOffset":11084,"endOffset":11242,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_2048","ranges":[{"startOffset":11245,"endOffset":11405,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_90000","ranges":[{"startOffset":11408,"endOffset":11670,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_10","ranges":[{"startOffset":11673,"endOffset":11825,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_1000000","ranges":[{"startOffset":11828,"endOffset":11996,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_0","ranges":[{"startOffset":11999,"endOffset":12149,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_128","ranges":[{"startOffset":12152,"endOffset":12308,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_1","ranges":[{"startOffset":12311,"endOffset":12461,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_15","ranges":[{"startOffset":12464,"endOffset":12616,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_16","ranges":[{"startOffset":12619,"endOffset":12773,"count":1}],"isBlockCoverage":true},{"functionName":"type_and_length_17","ranges":[{"startOffset":12776,"endOffset":12930,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13042,"endOffset":14568,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":13216,"endOffset":13318,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":13915,"endOffset":14435,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14478,"endOffset":14544,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_pack","ranges":[{"startOffset":14572,"endOffset":14691,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":14694,"endOffset":14807,"count":8},{"startOffset":14750,"endOffset":14786,"count":0}],"isBlockCoverage":true},{"functionName":"sort_tree1","ranges":[{"startOffset":14810,"endOffset":16883,"count":1}],"isBlockCoverage":true},{"functionName":"sort_tree2","ranges":[{"startOffset":16886,"endOffset":18960,"count":1}],"isBlockCoverage":true},{"functionName":"pack_multiple","ranges":[{"startOffset":18963,"endOffset":26174,"count":1}],"isBlockCoverage":true},{"functionName":"object_blob","ranges":[{"startOffset":26177,"endOffset":27319,"count":2}],"isBlockCoverage":true},{"functionName":"pack_short","ranges":[{"startOffset":27322,"endOffset":30293,"count":1}],"isBlockCoverage":true},{"functionName":"pack_long","ranges":[{"startOffset":30296,"endOffset":33720,"count":1},{"startOffset":33066,"endOffset":33211,"count":20}],"isBlockCoverage":true},{"functionName":"commit","ranges":[{"startOffset":33723,"endOffset":36049,"count":1}],"isBlockCoverage":true},{"functionName":"commit_newline","ranges":[{"startOffset":36052,"endOffset":38526,"count":1}],"isBlockCoverage":true},{"functionName":"signed_commit","ranges":[{"startOffset":38529,"endOffset":41163,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":41440,"endOffset":43025,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":41633,"endOffset":42392,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":42472,"endOffset":42536,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":42781,"endOffset":42845,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_git_pack_decode_commit","ranges":[{"startOffset":43029,"endOffset":43945,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":43948,"endOffset":44061,"count":3},{"startOffset":44004,"endOffset":44040,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":44064,"endOffset":44163,"count":3}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":44166,"endOffset":44464,"count":18}],"isBlockCoverage":true},{"functionName":"decode","ranges":[{"startOffset":44467,"endOffset":44769,"count":3}],"isBlockCoverage":true},{"functionName":"decode1","ranges":[{"startOffset":44772,"endOffset":46246,"count":1}],"isBlockCoverage":true},{"functionName":"decode2","ranges":[{"startOffset":46249,"endOffset":47402,"count":1}],"isBlockCoverage":true},{"functionName":"decode3","ranges":[{"startOffset":47405,"endOffset":48650,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":48773,"endOffset":49003,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_tag","ranges":[{"startOffset":49007,"endOffset":49092,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":49095,"endOffset":49208,"count":1},{"startOffset":49151,"endOffset":49187,"count":0}],"isBlockCoverage":true},{"functionName":"decode_tag","ranges":[{"startOffset":49211,"endOffset":51744,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":51838,"endOffset":52554,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":52086,"endOffset":52152,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":52199,"endOffset":52259,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_get_length","ranges":[{"startOffset":52558,"endOffset":52643,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":52646,"endOffset":52759,"count":5},{"startOffset":52702,"endOffset":52738,"count":0}],"isBlockCoverage":true},{"functionName":"test","ranges":[{"startOffset":52762,"endOffset":53419,"count":5}],"isBlockCoverage":true},{"functionName":"length_0","ranges":[{"startOffset":53422,"endOffset":53561,"count":1}],"isBlockCoverage":true},{"functionName":"length_1","ranges":[{"startOffset":53564,"endOffset":53703,"count":1}],"isBlockCoverage":true},{"functionName":"length_15","ranges":[{"startOffset":53706,"endOffset":53847,"count":1}],"isBlockCoverage":true},{"functionName":"length_31","ranges":[{"startOffset":53850,"endOffset":53993,"count":1}],"isBlockCoverage":true},{"functionName":"length_22783","ranges":[{"startOffset":53996,"endOffset":54147,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1187","url":"node:zlib","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":29517,"count":1}],"isBlockCoverage":false},{"functionName":"zlibBuffer","ranges":[{"startOffset":3527,"endOffset":4154,"count":0}],"isBlockCoverage":false},{"functionName":"zlibBufferOnData","ranges":[{"startOffset":4156,"endOffset":4487,"count":0}],"isBlockCoverage":false},{"functionName":"zlibBufferOnError","ranges":[{"startOffset":4489,"endOffset":4574,"count":0}],"isBlockCoverage":false},{"functionName":"zlibBufferOnEnd","ranges":[{"startOffset":4576,"endOffset":4906,"count":0}],"isBlockCoverage":false},{"functionName":"zlibBufferSync","ranges":[{"startOffset":4908,"endOffset":5448,"count":25},{"startOffset":4984,"endOffset":5023,"count":0},{"startOffset":5061,"endOffset":5308,"count":0},{"startOffset":5403,"endOffset":5429,"count":0}],"isBlockCoverage":true},{"functionName":"zlibOnError","ranges":[{"startOffset":5450,"endOffset":5764,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5989,"endOffset":6325,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6629,"endOffset":6920,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase","ranges":[{"startOffset":7156,"endOffset":9208,"count":25},{"startOffset":7617,"endOffset":7672,"count":0},{"startOffset":7686,"endOffset":8655,"count":0},{"startOffset":9150,"endOffset":9162,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":9433,"endOffset":9470,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":9912,"endOffset":9958,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":10105,"endOffset":10157,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase.reset","ranges":[{"startOffset":10297,"endOffset":10405,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase._flush","ranges":[{"startOffset":10551,"endOffset":10623,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase._final","ranges":[{"startOffset":10690,"endOffset":10726,"count":0}],"isBlockCoverage":false},{"functionName":"maxFlush","ranges":[{"startOffset":11324,"endOffset":11399,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase.flush","ranges":[{"startOffset":11840,"endOffset":12242,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase.close","ranges":[{"startOffset":12272,"endOffset":12354,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase._destroy","ranges":[{"startOffset":12387,"endOffset":12447,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase._transform","ranges":[{"startOffset":12482,"endOffset":13016,"count":0}],"isBlockCoverage":false},{"functionName":"ZlibBase._processChunk","ranges":[{"startOffset":13054,"endOffset":13283,"count":0}],"isBlockCoverage":false},{"functionName":"processChunkSync","ranges":[{"startOffset":13286,"endOffset":15571,"count":25},{"startOffset":14113,"endOffset":14125,"count":0},{"startOffset":14159,"endOffset":14178,"count":0},{"startOffset":14509,"endOffset":14562,"count":0},{"startOffset":14636,"endOffset":14730,"count":0},{"startOffset":14737,"endOffset":14803,"count":0},{"startOffset":14933,"endOffset":15038,"count":0},{"startOffset":15069,"endOffset":15362,"count":0},{"startOffset":15467,"endOffset":15490,"count":0},{"startOffset":15536,"endOffset":15567,"count":0}],"isBlockCoverage":true},{"functionName":"onError","ranges":[{"startOffset":13754,"endOffset":13796,"count":0}],"isBlockCoverage":false},{"functionName":"processChunk","ranges":[{"startOffset":15573,"endOffset":16163,"count":0}],"isBlockCoverage":false},{"functionName":"processCallback","ranges":[{"startOffset":16165,"endOffset":18467,"count":0}],"isBlockCoverage":false},{"functionName":"_close","ranges":[{"startOffset":18469,"endOffset":18659,"count":25},{"startOffset":18598,"endOffset":18605,"count":0}],"isBlockCoverage":true},{"functionName":"Zlib","ranges":[{"startOffset":18855,"endOffset":21172,"count":25},{"startOffset":19066,"endOffset":20557,"count":0}],"isBlockCoverage":true},{"functionName":"paramsAfterFlushCallback","ranges":[{"startOffset":21522,"endOffset":21788,"count":0}],"isBlockCoverage":false},{"functionName":"params","ranges":[{"startOffset":21814,"endOffset":22281,"count":0}],"isBlockCoverage":false},{"functionName":"Deflate","ranges":[{"startOffset":22325,"endOffset":22460,"count":0}],"isBlockCoverage":false},{"functionName":"Inflate","ranges":[{"startOffset":22556,"endOffset":22691,"count":0}],"isBlockCoverage":false},{"functionName":"Gzip","ranges":[{"startOffset":22787,"endOffset":22910,"count":0}],"isBlockCoverage":false},{"functionName":"Gunzip","ranges":[{"startOffset":23000,"endOffset":23131,"count":0}],"isBlockCoverage":false},{"functionName":"DeflateRaw","ranges":[{"startOffset":23225,"endOffset":23430,"count":15},{"startOffset":23264,"endOffset":23288,"count":0},{"startOffset":23290,"endOffset":23310,"count":0},{"startOffset":23352,"endOffset":23380,"count":0}],"isBlockCoverage":true},{"functionName":"InflateRaw","ranges":[{"startOffset":23532,"endOffset":23679,"count":10},{"startOffset":23601,"endOffset":23629,"count":0}],"isBlockCoverage":true},{"functionName":"Unzip","ranges":[{"startOffset":23781,"endOffset":23908,"count":0}],"isBlockCoverage":false},{"functionName":"createConvenienceMethod","ranges":[{"startOffset":24000,"endOffset":24389,"count":18},{"startOffset":24059,"endOffset":24388,"count":9}],"isBlockCoverage":true},{"functionName":"syncBufferWrapper","ranges":[{"startOffset":24072,"endOffset":24173,"count":25}],"isBlockCoverage":true},{"functionName":"asyncBufferWrapper","ranges":[{"startOffset":24188,"endOffset":24386,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":24474,"endOffset":24561,"count":107},{"startOffset":24532,"endOffset":24552,"count":9},{"startOffset":24553,"endOffset":24560,"count":98}],"isBlockCoverage":true},{"functionName":"Brotli","ranges":[{"startOffset":24778,"endOffset":26115,"count":0}],"isBlockCoverage":false},{"functionName":"BrotliCompress","ranges":[{"startOffset":26209,"endOffset":26373,"count":0}],"isBlockCoverage":false},{"functionName":"BrotliDecompress","ranges":[{"startOffset":26487,"endOffset":26657,"count":0}],"isBlockCoverage":false},{"functionName":"createProperty","ranges":[{"startOffset":26776,"endOffset":26961,"count":9}],"isBlockCoverage":true},{"functionName":"value","ranges":[{"startOffset":26897,"endOffset":26954,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":27190,"endOffset":27226,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":27230,"endOffset":27271,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1188","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_porcelain.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9905,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":2538,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":420,"endOffset":1137,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1219,"endOffset":1817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2012,"endOffset":2076,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2119,"endOffset":2183,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_git_porcelain","ranges":[{"startOffset":2542,"endOffset":3957,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3960,"endOffset":4073,"count":6},{"startOffset":4016,"endOffset":4052,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":4076,"endOffset":4182,"count":6}],"isBlockCoverage":true},{"functionName":"append","ranges":[{"startOffset":4185,"endOffset":5357,"count":10}],"isBlockCoverage":true},{"functionName":"single_file","ranges":[{"startOffset":5360,"endOffset":5781,"count":1}],"isBlockCoverage":true},{"functionName":"two_files_same_path","ranges":[{"startOffset":5784,"endOffset":6334,"count":1}],"isBlockCoverage":true},{"functionName":"sub","ranges":[{"startOffset":6337,"endOffset":6875,"count":1}],"isBlockCoverage":true},{"functionName":"more_sub","ranges":[{"startOffset":6878,"endOffset":8080,"count":1},{"startOffset":7933,"endOffset":8076,"count":5}],"isBlockCoverage":true},{"functionName":"namespaces","ranges":[{"startOffset":8083,"endOffset":9291,"count":1},{"startOffset":9144,"endOffset":9287,"count":5}],"isBlockCoverage":true},{"functionName":"root_empty","ranges":[{"startOffset":9294,"endOffset":9714,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1189","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_time.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1570,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":205,"endOffset":491,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_time_test","ranges":[{"startOffset":495,"endOffset":580,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":583,"endOffset":696,"count":2},{"startOffset":639,"endOffset":675,"count":0}],"isBlockCoverage":true},{"functionName":"get_unix","ranges":[{"startOffset":699,"endOffset":980,"count":1}],"isBlockCoverage":true},{"functionName":"get_utc","ranges":[{"startOffset":983,"endOffset":1401,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1190","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_transport.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10152,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":226,"endOffset":752,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_git_transport","ranges":[{"startOffset":756,"endOffset":841,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":844,"endOffset":957,"count":6},{"startOffset":900,"endOffset":936,"count":0}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":960,"endOffset":4899,"count":1}],"isBlockCoverage":true},{"functionName":"all_ok","ranges":[{"startOffset":4902,"endOffset":5675,"count":1},{"startOffset":5449,"endOffset":5671,"count":0}],"isBlockCoverage":true},{"functionName":"unpack_error","ranges":[{"startOffset":5678,"endOffset":6671,"count":1},{"startOffset":6212,"endOffset":6275,"count":0},{"startOffset":6629,"endOffset":6661,"count":0}],"isBlockCoverage":true},{"functionName":"command_error","ranges":[{"startOffset":6674,"endOffset":8003,"count":1},{"startOffset":7543,"endOffset":7606,"count":0},{"startOffset":7961,"endOffset":7993,"count":0}],"isBlockCoverage":true},{"functionName":"flush_error","ranges":[{"startOffset":8006,"endOffset":9174,"count":1},{"startOffset":8701,"endOffset":8764,"count":0},{"startOffset":9132,"endOffset":9164,"count":0}],"isBlockCoverage":true},{"functionName":"gitlab_flush_all_ok","ranges":[{"startOffset":9177,"endOffset":9961,"count":1},{"startOffset":9735,"endOffset":9957,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1191","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_url.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4126,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":206,"endOffset":459,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_repo_online","ranges":[{"startOffset":463,"endOffset":548,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":551,"endOffset":664,"count":1},{"startOffset":607,"endOffset":643,"count":0}],"isBlockCoverage":true},{"functionName":"test_repo_commit_show_urls","ranges":[{"startOffset":667,"endOffset":3953,"count":1},{"startOffset":3621,"endOffset":3949,"count":4}],"isBlockCoverage":true}]},{"scriptId":"1192","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_utils.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3388,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":208,"endOffset":810,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":389,"endOffset":515,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_git_utils","ranges":[{"startOffset":814,"endOffset":1029,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1032,"endOffset":1145,"count":3},{"startOffset":1088,"endOffset":1124,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1148,"endOffset":1256,"count":3}],"isBlockCoverage":true},{"functionName":"get_null","ranges":[{"startOffset":1259,"endOffset":1695,"count":1}],"isBlockCoverage":true},{"functionName":"pkt_string","ranges":[{"startOffset":1698,"endOffset":1932,"count":1}],"isBlockCoverage":true},{"functionName":"length_utf8_hex","ranges":[{"startOffset":1935,"endOffset":3217,"count":1},{"startOffset":2983,"endOffset":3049,"count":0},{"startOffset":3175,"endOffset":3207,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1193","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_asset_manager.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8887,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":248,"endOffset":813,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_abapgit_gui_asset_manager","ranges":[{"startOffset":817,"endOffset":902,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":905,"endOffset":1018,"count":6},{"startOffset":961,"endOffset":997,"count":0}],"isBlockCoverage":true},{"functionName":"get_inline_asset","ranges":[{"startOffset":1021,"endOffset":2805,"count":1}],"isBlockCoverage":true},{"functionName":"get_text_asset","ranges":[{"startOffset":2808,"endOffset":4923,"count":1},{"startOffset":4072,"endOffset":4135,"count":0},{"startOffset":4261,"endOffset":4293,"count":0},{"startOffset":4692,"endOffset":4755,"count":0},{"startOffset":4881,"endOffset":4913,"count":0}],"isBlockCoverage":true},{"functionName":"get_mime_asset","ranges":[{"startOffset":4926,"endOffset":5720,"count":1}],"isBlockCoverage":true},{"functionName":"get_base64_asset","ranges":[{"startOffset":5723,"endOffset":6480,"count":1}],"isBlockCoverage":true},{"functionName":"get_all","ranges":[{"startOffset":6483,"endOffset":7436,"count":1}],"isBlockCoverage":true},{"functionName":"register_and_overwrite","ranges":[{"startOffset":7439,"endOffset":8652,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1194","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_chunk_lib.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2331,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":234,"endOffset":802,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":438,"endOffset":572,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_normalize_program_name","ranges":[{"startOffset":806,"endOffset":1035,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1038,"endOffset":1151,"count":2},{"startOffset":1094,"endOffset":1130,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1154,"endOffset":1272,"count":2}],"isBlockCoverage":true},{"functionName":"class_","ranges":[{"startOffset":1275,"endOffset":1575,"count":1}],"isBlockCoverage":true},{"functionName":"program","ranges":[{"startOffset":1578,"endOffset":2113,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1195","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_css_processor.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":17309,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":232,"endOffset":1193,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":431,"endOffset":577,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":657,"endOffset":799,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":995,"endOffset":1059,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1105,"endOffset":1169,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test_base","ranges":[{"startOffset":1197,"endOffset":1588,"count":9}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1591,"endOffset":1704,"count":9},{"startOffset":1647,"endOffset":1683,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1707,"endOffset":1959,"count":9}],"isBlockCoverage":true},{"functionName":"add_file","ranges":[{"startOffset":1962,"endOffset":2436,"count":10},{"startOffset":2218,"endOffset":2253,"count":9}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2573,"endOffset":3209,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_single_file","ranges":[{"startOffset":3213,"endOffset":3311,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3314,"endOffset":3427,"count":7}],"isBlockCoverage":true},{"functionName":"test_file_exists","ranges":[{"startOffset":3430,"endOffset":3983,"count":1},{"startOffset":3757,"endOffset":3979,"count":0}],"isBlockCoverage":true},{"functionName":"test_file_does_not_exist","ranges":[{"startOffset":3986,"endOffset":4404,"count":1},{"startOffset":4173,"endOffset":4236,"count":0},{"startOffset":4362,"endOffset":4394,"count":0}],"isBlockCoverage":true},{"functionName":"test_empty_file","ranges":[{"startOffset":4407,"endOffset":4901,"count":1},{"startOffset":4670,"endOffset":4733,"count":0},{"startOffset":4859,"endOffset":4891,"count":0}],"isBlockCoverage":true},{"functionName":"test_no_variables","ranges":[{"startOffset":4904,"endOffset":5695,"count":1}],"isBlockCoverage":true},{"functionName":"test_simple_variables","ranges":[{"startOffset":5698,"endOffset":7356,"count":1}],"isBlockCoverage":true},{"functionName":"test_complex_variables","ranges":[{"startOffset":7359,"endOffset":9634,"count":1}],"isBlockCoverage":true},{"functionName":"test_overwrite","ranges":[{"startOffset":9637,"endOffset":11359,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11503,"endOffset":11813,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_multiple_files","ranges":[{"startOffset":11817,"endOffset":11915,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":11918,"endOffset":12031,"count":2}],"isBlockCoverage":true},{"functionName":"test_simple","ranges":[{"startOffset":12034,"endOffset":14174,"count":1}],"isBlockCoverage":true},{"functionName":"test_overwrite","ranges":[{"startOffset":14177,"endOffset":17073,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1196","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_event.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7783,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":204,"endOffset":664,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_event","ranges":[{"startOffset":668,"endOffset":753,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":756,"endOffset":869,"count":5},{"startOffset":812,"endOffset":848,"count":0}],"isBlockCoverage":true},{"functionName":"query_wrong_data","ranges":[{"startOffset":872,"endOffset":1565,"count":1}],"isBlockCoverage":true},{"functionName":"form_wrong_data","ranges":[{"startOffset":1568,"endOffset":2203,"count":1}],"isBlockCoverage":true},{"functionName":"query","ranges":[{"startOffset":2206,"endOffset":3806,"count":1}],"isBlockCoverage":true},{"functionName":"form_data","ranges":[{"startOffset":3809,"endOffset":5950,"count":1}],"isBlockCoverage":true},{"functionName":"immutability","ranges":[{"startOffset":5953,"endOffset":7624,"count":1},{"startOffset":6608,"endOffset":6671,"count":0},{"startOffset":6987,"endOffset":7019,"count":0},{"startOffset":7203,"endOffset":7266,"count":0},{"startOffset":7582,"endOffset":7614,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1197","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_data.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3112,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":297,"endOffset":762,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":766,"endOffset":851,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":854,"endOffset":967,"count":4},{"startOffset":910,"endOffset":946,"count":0}],"isBlockCoverage":true},{"functionName":"concatenated_key_to_where1","ranges":[{"startOffset":970,"endOffset":1480,"count":1}],"isBlockCoverage":true},{"functionName":"concatenated_key_to_where2","ranges":[{"startOffset":1483,"endOffset":1956,"count":1}],"isBlockCoverage":true},{"functionName":"concatenated_key_to_where3","ranges":[{"startOffset":1959,"endOffset":2454,"count":1}],"isBlockCoverage":true},{"functionName":"concatenated_key_to_where4","ranges":[{"startOffset":2457,"endOffset":2948,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1198","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_patch.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":13934,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":319,"endOffset":783,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_get_patch_data","ranges":[{"startOffset":787,"endOffset":872,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":875,"endOffset":988,"count":4},{"startOffset":931,"endOffset":967,"count":0}],"isBlockCoverage":true},{"functionName":"get_patch_data_add","ranges":[{"startOffset":991,"endOffset":1656,"count":1}],"isBlockCoverage":true},{"functionName":"get_patch_data_remove","ranges":[{"startOffset":1659,"endOffset":2313,"count":1}],"isBlockCoverage":true},{"functionName":"invalid_patch_missing_file","ranges":[{"startOffset":2316,"endOffset":3246,"count":1},{"startOffset":2821,"endOffset":2884,"count":0},{"startOffset":3204,"endOffset":3236,"count":0}],"isBlockCoverage":true},{"functionName":"invalid_patch_missing_index","ranges":[{"startOffset":3249,"endOffset":4199,"count":1},{"startOffset":3774,"endOffset":3837,"count":0},{"startOffset":4157,"endOffset":4189,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4331,"endOffset":7136,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":4549,"endOffset":4646,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4732,"endOffset":5590,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6036,"endOffset":6894,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_is_patch_line_possible","ranges":[{"startOffset":7140,"endOffset":8213,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":8216,"endOffset":8329,"count":4},{"startOffset":8272,"endOffset":8308,"count":0}],"isBlockCoverage":true},{"functionName":"initial_diff_line","ranges":[{"startOffset":8332,"endOffset":8492,"count":1}],"isBlockCoverage":true},{"functionName":"for_update_patch_shd_be_possbl","ranges":[{"startOffset":8495,"endOffset":9679,"count":1}],"isBlockCoverage":true},{"functionName":"for_insert_patch_shd_be_possbl","ranges":[{"startOffset":9682,"endOffset":10866,"count":1}],"isBlockCoverage":true},{"functionName":"for_delete_patch_shd_be_possbl","ranges":[{"startOffset":10869,"endOffset":12053,"count":1}],"isBlockCoverage":true},{"functionName":"when_is_patch_line_possible","ranges":[{"startOffset":12056,"endOffset":12247,"count":4}],"isBlockCoverage":true},{"functionName":"then_patch_shd_be_possible","ranges":[{"startOffset":12250,"endOffset":12457,"count":3}],"isBlockCoverage":true},{"functionName":"then_patch_shd_not_be_possible","ranges":[{"startOffset":12460,"endOffset":12671,"count":1}],"isBlockCoverage":true},{"functionName":"given_diff_line","ranges":[{"startOffset":12674,"endOffset":13693,"count":4},{"startOffset":13586,"endOffset":13607,"count":3},{"startOffset":13609,"endOffset":13648,"count":3}],"isBlockCoverage":true}]},{"scriptId":"1199","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_utils.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4627,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":208,"endOffset":422,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_renderable","ranges":[{"startOffset":426,"endOffset":511,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":514,"endOffset":627,"count":2},{"startOffset":570,"endOffset":606,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":630,"endOffset":821,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":922,"endOffset":1136,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_handler","ranges":[{"startOffset":1140,"endOffset":1225,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1228,"endOffset":1341,"count":2},{"startOffset":1284,"endOffset":1320,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_event_handler$on_event","ranges":[{"startOffset":1344,"endOffset":1988,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2086,"endOffset":2387,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_gui_utils","ranges":[{"startOffset":2391,"endOffset":2476,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2479,"endOffset":2592,"count":2},{"startOffset":2535,"endOffset":2571,"count":0}],"isBlockCoverage":true},{"functionName":"is_renderable","ranges":[{"startOffset":2595,"endOffset":3505,"count":1}],"isBlockCoverage":true},{"functionName":"is_event_handler","ranges":[{"startOffset":3508,"endOffset":4427,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1200","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_hash.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2831,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":188,"endOffset":579,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":583,"endOffset":668,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":671,"endOffset":784,"count":4},{"startOffset":727,"endOffset":763,"count":0}],"isBlockCoverage":true},{"functionName":"adler32","ranges":[{"startOffset":787,"endOffset":1124,"count":1}],"isBlockCoverage":true},{"functionName":"sha1","ranges":[{"startOffset":1127,"endOffset":1638,"count":1}],"isBlockCoverage":true},{"functionName":"sha1_raw_valid","ranges":[{"startOffset":1641,"endOffset":2173,"count":1}],"isBlockCoverage":true},{"functionName":"sha1_raw_empty","ranges":[{"startOffset":2176,"endOffset":2685,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1201","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14166,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":198,"endOffset":412,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_good_renderable","ranges":[{"startOffset":416,"endOffset":501,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":504,"endOffset":617,"count":1},{"startOffset":560,"endOffset":596,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":620,"endOffset":939,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1052,"endOffset":1265,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_bad_renderable","ranges":[{"startOffset":1269,"endOffset":1354,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1357,"endOffset":1470,"count":1},{"startOffset":1413,"endOffset":1449,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_gui_renderable$render","ranges":[{"startOffset":1473,"endOffset":1772,"count":1},{"startOffset":1748,"endOffset":1771,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1874,"endOffset":2806,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":2046,"endOffset":2166,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_html","ranges":[{"startOffset":2810,"endOffset":3020,"count":10}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3023,"endOffset":3136,"count":10},{"startOffset":3079,"endOffset":3115,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":3139,"endOffset":3243,"count":10}],"isBlockCoverage":true},{"functionName":"indent1","ranges":[{"startOffset":3246,"endOffset":4124,"count":1}],"isBlockCoverage":true},{"functionName":"indent2","ranges":[{"startOffset":4127,"endOffset":5051,"count":1}],"isBlockCoverage":true},{"functionName":"indent3","ranges":[{"startOffset":5054,"endOffset":6016,"count":1}],"isBlockCoverage":true},{"functionName":"indent4","ranges":[{"startOffset":6019,"endOffset":6895,"count":1}],"isBlockCoverage":true},{"functionName":"style1","ranges":[{"startOffset":6898,"endOffset":8581,"count":1}],"isBlockCoverage":true},{"functionName":"td","ranges":[{"startOffset":8584,"endOffset":9442,"count":1}],"isBlockCoverage":true},{"functionName":"th","ranges":[{"startOffset":9445,"endOffset":10303,"count":1}],"isBlockCoverage":true},{"functionName":"wrap_ii","ranges":[{"startOffset":10306,"endOffset":11018,"count":1}],"isBlockCoverage":true},{"functionName":"wrap","ranges":[{"startOffset":11021,"endOffset":12959,"count":1}],"isBlockCoverage":true},{"functionName":"add_renderable","ranges":[{"startOffset":12962,"endOffset":13979,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1202","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_action_utils.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":20714,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":241,"endOffset":3626,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":456,"endOffset":729,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":824,"endOffset":888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":978,"endOffset":1360,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1456,"endOffset":1735,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1892,"endOffset":1956,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2207,"endOffset":2267,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2310,"endOffset":2374,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2418,"endOffset":2482,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2596,"endOffset":2656,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2751,"endOffset":2815,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2855,"endOffset":2921,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_html_action_utils","ranges":[{"startOffset":3630,"endOffset":4360,"count":9}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":4363,"endOffset":4476,"count":9},{"startOffset":4419,"endOffset":4455,"count":0}],"isBlockCoverage":true},{"functionName":"class_constructor","ranges":[{"startOffset":4479,"endOffset":4565,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":4575,"endOffset":5143,"count":1}],"isBlockCoverage":true},{"functionName":"parse_fields_simple_case","ranges":[{"startOffset":5146,"endOffset":5531,"count":1}],"isBlockCoverage":true},{"functionName":"parse_fields_advanced_case","ranges":[{"startOffset":5534,"endOffset":7403,"count":1}],"isBlockCoverage":true},{"functionName":"parse_fields_unescape","ranges":[{"startOffset":7406,"endOffset":7889,"count":1}],"isBlockCoverage":true},{"functionName":"parse_fields_unescape_nbsp","ranges":[{"startOffset":7892,"endOffset":8944,"count":1}],"isBlockCoverage":true},{"functionName":"parse_fields_german_umlauts","ranges":[{"startOffset":8947,"endOffset":11632,"count":1}],"isBlockCoverage":true},{"functionName":"_given_string_is","ranges":[{"startOffset":11635,"endOffset":11855,"count":9}],"isBlockCoverage":true},{"functionName":"_when_fields_are_parsed_upper","ranges":[{"startOffset":11858,"endOffset":12057,"count":6}],"isBlockCoverage":true},{"functionName":"_when_fields_are_parsed","ranges":[{"startOffset":12060,"endOffset":12237,"count":3}],"isBlockCoverage":true},{"functionName":"_then_fields_should_be","ranges":[{"startOffset":12240,"endOffset":13725,"count":25}],"isBlockCoverage":true},{"functionName":"_then_field_count_should_be","ranges":[{"startOffset":13728,"endOffset":14210,"count":8}],"isBlockCoverage":true},{"functionName":"_hex_to_char","ranges":[{"startOffset":14213,"endOffset":14299,"count":0}],"isBlockCoverage":false},{"functionName":"_hex_to_char","ranges":[{"startOffset":14309,"endOffset":14796,"count":3}],"isBlockCoverage":true},{"functionName":"parse_fields_wrong_format","ranges":[{"startOffset":14799,"endOffset":15535,"count":1}],"isBlockCoverage":true},{"functionName":"parse_post_form_data","ranges":[{"startOffset":15538,"endOffset":17993,"count":1}],"isBlockCoverage":true},{"functionName":"parse_fields_webgui","ranges":[{"startOffset":17996,"endOffset":18911,"count":1}],"isBlockCoverage":true},{"functionName":"parse_fields_special_chars","ranges":[{"startOffset":18914,"endOffset":19594,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1203","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_form_utils.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":48255,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":228,"endOffset":1804,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":440,"endOffset":615,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":705,"endOffset":797,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":886,"endOffset":1135,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1246,"endOffset":1310,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1479,"endOffset":1576,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1688,"endOffset":1780,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_popups_mock","ranges":[{"startOffset":1808,"endOffset":2365,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2368,"endOffset":2481,"count":8},{"startOffset":2424,"endOffset":2460,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_popups$branch_list_popup","ranges":[{"startOffset":2484,"endOffset":4070,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$commit_list_popup","ranges":[{"startOffset":4073,"endOffset":6628,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$create_branch_popup","ranges":[{"startOffset":6631,"endOffset":7169,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_folder_logic","ranges":[{"startOffset":7172,"endOffset":7327,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_search_help","ranges":[{"startOffset":7330,"endOffset":7620,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_confirm","ranges":[{"startOffset":7623,"endOffset":10382,"count":2},{"startOffset":8131,"endOffset":8175,"count":0},{"startOffset":8453,"endOffset":8500,"count":0},{"startOffset":8707,"endOffset":8751,"count":0},{"startOffset":9028,"endOffset":9075,"count":0},{"startOffset":9455,"endOffset":9514,"count":0},{"startOffset":9819,"endOffset":9871,"count":0},{"startOffset":10069,"endOffset":10356,"count":1},{"startOffset":10287,"endOffset":10356,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_popups$popup_to_create_package","ranges":[{"startOffset":10385,"endOffset":11738,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_create_transp_branch","ranges":[{"startOffset":11741,"endOffset":12392,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_from_list","ranges":[{"startOffset":12395,"endOffset":16898,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_transports","ranges":[{"startOffset":16901,"endOffset":17058,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_transport_request","ranges":[{"startOffset":17061,"endOffset":18012,"count":0}],"isBlockCoverage":false},{"functionName":"was_confirm_popup_shown","ranges":[{"startOffset":18015,"endOffset":18250,"count":3}],"isBlockCoverage":true},{"functionName":"set_user_decision","ranges":[{"startOffset":18253,"endOffset":18532,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_popups$popup_select_tr_requests","ranges":[{"startOffset":18535,"endOffset":19749,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_select_wb_tc_tr_and_tsk","ranges":[{"startOffset":19752,"endOffset":20407,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$tag_list_popup","ranges":[{"startOffset":20410,"endOffset":21642,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_labels","ranges":[{"startOffset":21645,"endOffset":21935,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$choose_code_insp_check_variant","ranges":[{"startOffset":21938,"endOffset":22139,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":22948,"endOffset":23875,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":23143,"endOffset":23299,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test_form","ranges":[{"startOffset":23879,"endOffset":24132,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":24135,"endOffset":24248,"count":8},{"startOffset":24191,"endOffset":24227,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":24251,"endOffset":24491,"count":8}],"isBlockCoverage":true},{"functionName":"validate1","ranges":[{"startOffset":24494,"endOffset":26935,"count":1}],"isBlockCoverage":true},{"functionName":"validate2","ranges":[{"startOffset":26938,"endOffset":29451,"count":1}],"isBlockCoverage":true},{"functionName":"validate3","ranges":[{"startOffset":29454,"endOffset":32515,"count":1}],"isBlockCoverage":true},{"functionName":"normalize","ranges":[{"startOffset":32518,"endOffset":38479,"count":1}],"isBlockCoverage":true},{"functionName":"is_empty","ranges":[{"startOffset":38482,"endOffset":42617,"count":1}],"isBlockCoverage":true},{"functionName":"exit_clean","ranges":[{"startOffset":42620,"endOffset":44350,"count":1}],"isBlockCoverage":true},{"functionName":"exit_dirty_confirm","ranges":[{"startOffset":44353,"endOffset":46207,"count":1}],"isBlockCoverage":true},{"functionName":"exit_dirty_cancel","ranges":[{"startOffset":46210,"endOffset":48054,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1204","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_parts.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5205,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":218,"endOffset":457,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_part_collections","ranges":[{"startOffset":461,"endOffset":546,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":549,"endOffset":662,"count":1},{"startOffset":605,"endOffset":641,"count":0}],"isBlockCoverage":true},{"functionName":"test","ranges":[{"startOffset":665,"endOffset":5011,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1205","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_table.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8988,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":309,"endOffset":582,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test_simple_table","ranges":[{"startOffset":586,"endOffset":671,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":674,"endOffset":787,"count":1},{"startOffset":730,"endOffset":766,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_html_table$get_row_attrs","ranges":[{"startOffset":790,"endOffset":1431,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_html_table$render_cell","ranges":[{"startOffset":1434,"endOffset":3075,"count":6},{"startOffset":2577,"endOffset":2932,"count":2},{"startOffset":2653,"endOffset":2926,"count":1},{"startOffset":2932,"endOffset":3049,"count":4}],"isBlockCoverage":true},{"functionName":"simple_render","ranges":[{"startOffset":3078,"endOffset":8308,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1206","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_i18n_params.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10728,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":608,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_i18n_params_test","ranges":[{"startOffset":612,"endOffset":697,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":700,"endOffset":813,"count":3},{"startOffset":756,"endOffset":792,"count":0}],"isBlockCoverage":true},{"functionName":"iso_langs_to_lang_filter","ranges":[{"startOffset":816,"endOffset":3438,"count":1}],"isBlockCoverage":true},{"functionName":"filter_sap_langs","ranges":[{"startOffset":3441,"endOffset":6296,"count":1}],"isBlockCoverage":true},{"functionName":"filter_sap_langs_tab","ranges":[{"startOffset":6299,"endOffset":10532,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1207","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_injector.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7780,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":214,"endOffset":427,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_abapgit_tadir_mock","ranges":[{"startOffset":431,"endOffset":516,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":519,"endOffset":632,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_tadir$get_object_package","ranges":[{"startOffset":635,"endOffset":1253,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_tadir$read","ranges":[{"startOffset":1256,"endOffset":3318,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_tadir$read_single","ranges":[{"startOffset":3321,"endOffset":4469,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":4604,"endOffset":4856,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_no_dependency_injection","ranges":[{"startOffset":4860,"endOffset":4945,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":4948,"endOffset":5061,"count":0}],"isBlockCoverage":false},{"functionName":"no_injection","ranges":[{"startOffset":5064,"endOffset":5736,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5882,"endOffset":6189,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_simple_dependency_inject","ranges":[{"startOffset":6193,"endOffset":6278,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":6281,"endOffset":6394,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":6397,"endOffset":6793,"count":0}],"isBlockCoverage":false},{"functionName":"simple_injection","ranges":[{"startOffset":6796,"endOffset":7511,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1208","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_item_graph.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5161,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":206,"endOffset":434,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":438,"endOffset":523,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":526,"endOffset":639,"count":1},{"startOffset":582,"endOffset":618,"count":0}],"isBlockCoverage":true},{"functionName":"basic","ranges":[{"startOffset":642,"endOffset":5003,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1209","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_item_state.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15595,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":212,"endOffset":525,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_state_test","ranges":[{"startOffset":529,"endOffset":614,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":617,"endOffset":730,"count":2},{"startOffset":673,"endOffset":709,"count":0}],"isBlockCoverage":true},{"functionName":"test_sum_with_status","ranges":[{"startOffset":733,"endOffset":7575,"count":1}],"isBlockCoverage":true},{"functionName":"test_sum_with_ritem","ranges":[{"startOffset":7578,"endOffset":15419,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1210","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_log.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16327,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":185,"endOffset":1032,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":355,"endOffset":473,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test","ranges":[{"startOffset":1036,"endOffset":1243,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1246,"endOffset":1359,"count":8},{"startOffset":1302,"endOffset":1338,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1362,"endOffset":1464,"count":8}],"isBlockCoverage":true},{"functionName":"empty","ranges":[{"startOffset":1467,"endOffset":1811,"count":1}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":1814,"endOffset":3804,"count":1}],"isBlockCoverage":true},{"functionName":"get_status","ranges":[{"startOffset":3807,"endOffset":5528,"count":1}],"isBlockCoverage":true},{"functionName":"merge_with","ranges":[{"startOffset":5531,"endOffset":7776,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":7016,"endOffset":7100,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":7129,"endOffset":7151,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":7425,"endOffset":7506,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":7535,"endOffset":7557,"count":0}],"isBlockCoverage":false},{"functionName":"merge_with_min_level","ranges":[{"startOffset":7779,"endOffset":10939,"count":1}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":9361,"endOffset":9445,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":9474,"endOffset":9496,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":10179,"endOffset":10263,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":10292,"endOffset":10314,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":10588,"endOffset":10669,"count":2}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":10698,"endOffset":10720,"count":0}],"isBlockCoverage":false},{"functionName":"from_x","ranges":[{"startOffset":10942,"endOffset":13507,"count":1},{"startOffset":12103,"endOffset":12110,"count":0},{"startOffset":12352,"endOffset":12384,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":12759,"endOffset":12837,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":12866,"endOffset":12888,"count":0}],"isBlockCoverage":false},{"functionName":"withKey","ranges":[{"startOffset":13150,"endOffset":13233,"count":1}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":13262,"endOffset":13284,"count":0}],"isBlockCoverage":false},{"functionName":"get_log_level","ranges":[{"startOffset":13510,"endOffset":15216,"count":1}],"isBlockCoverage":true},{"functionName":"clone","ranges":[{"startOffset":15219,"endOffset":16183,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1211","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_login_manager.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3756,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":224,"endOffset":967,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":417,"endOffset":481,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":565,"endOffset":629,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_login_manager","ranges":[{"startOffset":971,"endOffset":1162,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1165,"endOffset":1278,"count":3},{"startOffset":1221,"endOffset":1257,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1281,"endOffset":1361,"count":3}],"isBlockCoverage":true},{"functionName":"teardown","ranges":[{"startOffset":1364,"endOffset":1447,"count":3}],"isBlockCoverage":true},{"functionName":"save","ranges":[{"startOffset":1450,"endOffset":1935,"count":1}],"isBlockCoverage":true},{"functionName":"encoding","ranges":[{"startOffset":1938,"endOffset":2424,"count":1}],"isBlockCoverage":true},{"functionName":"same_server","ranges":[{"startOffset":2427,"endOffset":3306,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1212","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_longtexts.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2652,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":209,"endOffset":699,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":390,"endOffset":516,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_longtexts","ranges":[{"startOffset":703,"endOffset":918,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":921,"endOffset":1034,"count":1},{"startOffset":977,"endOffset":1013,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1037,"endOffset":1145,"count":1}],"isBlockCoverage":true},{"functionName":"escape_name","ranges":[{"startOffset":1148,"endOffset":2481,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1213","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_lxe_texts.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8449,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":209,"endOffset":594,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_lxe_texts","ranges":[{"startOffset":598,"endOffset":683,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":686,"endOffset":799,"count":3},{"startOffset":742,"endOffset":778,"count":0}],"isBlockCoverage":true},{"functionName":"check_langs_versus_installed","ranges":[{"startOffset":802,"endOffset":3842,"count":1}],"isBlockCoverage":true},{"functionName":"lang_string_to_table","ranges":[{"startOffset":3845,"endOffset":6449,"count":1},{"startOffset":5011,"endOffset":5233,"count":0},{"startOffset":5557,"endOffset":5779,"count":0},{"startOffset":6223,"endOffset":6445,"count":0}],"isBlockCoverage":true},{"functionName":"table_to_lang_string","ranges":[{"startOffset":6452,"endOffset":8278,"count":1},{"startOffset":7411,"endOffset":7633,"count":0},{"startOffset":8052,"endOffset":8274,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1214","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_news.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16127,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":196,"endOffset":865,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":378,"endOffset":636,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":777,"endOffset":841,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_string_buffer","ranges":[{"startOffset":869,"endOffset":1219,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1222,"endOffset":1335,"count":1},{"startOffset":1278,"endOffset":1314,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":1338,"endOffset":1556,"count":13}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1662,"endOffset":2829,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1847,"endOffset":2600,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2741,"endOffset":2805,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_log_entries","ranges":[{"startOffset":2833,"endOffset":3683,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":3686,"endOffset":3799,"count":3},{"startOffset":3742,"endOffset":3778,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":3802,"endOffset":5189,"count":14}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5287,"endOffset":5564,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_news","ranges":[{"startOffset":5568,"endOffset":5653,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":5656,"endOffset":5769,"count":2},{"startOffset":5712,"endOffset":5748,"count":0}],"isBlockCoverage":true},{"functionName":"parse_line","ranges":[{"startOffset":5772,"endOffset":10135,"count":1}],"isBlockCoverage":true},{"functionName":"parse","ranges":[{"startOffset":10138,"endOffset":15945,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1215","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_files.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14965,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":224,"endOffset":1930,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":413,"endOffset":547,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":754,"endOffset":820,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":869,"endOffset":911,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1011,"endOffset":1077,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1189,"endOffset":1552,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_objects_files","ranges":[{"startOffset":1934,"endOffset":2157,"count":6}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2160,"endOffset":2273,"count":6},{"startOffset":2216,"endOffset":2252,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":2276,"endOffset":5548,"count":6}],"isBlockCoverage":true},{"functionName":"get_program_data","ranges":[{"startOffset":5551,"endOffset":6193,"count":6}],"isBlockCoverage":true},{"functionName":"get_xml_data","ranges":[{"startOffset":6196,"endOffset":7676,"count":6}],"isBlockCoverage":true},{"functionName":"get_expected_abap_source","ranges":[{"startOffset":7679,"endOffset":8331,"count":1}],"isBlockCoverage":true},{"functionName":"read_abap","ranges":[{"startOffset":8334,"endOffset":8510,"count":1}],"isBlockCoverage":true},{"functionName":"read_xml","ranges":[{"startOffset":8513,"endOffset":10570,"count":1}],"isBlockCoverage":true},{"functionName":"get_file_pattern","ranges":[{"startOffset":10573,"endOffset":11805,"count":1}],"isBlockCoverage":true},{"functionName":"is_json_metadata","ranges":[{"startOffset":11808,"endOffset":13027,"count":1}],"isBlockCoverage":true},{"functionName":"is_not_json_metadata","ranges":[{"startOffset":13030,"endOffset":13208,"count":1}],"isBlockCoverage":true},{"functionName":"read_i18n_files","ranges":[{"startOffset":13211,"endOffset":14774,"count":1},{"startOffset":14011,"endOffset":14587,"count":2},{"startOffset":14162,"endOffset":14581,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1216","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_program.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10231,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":312,"endOffset":639,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":643,"endOffset":728,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":731,"endOffset":844,"count":2},{"startOffset":787,"endOffset":823,"count":0}],"isBlockCoverage":true},{"functionName":"strip_generation_comments_1","ranges":[{"startOffset":847,"endOffset":6524,"count":1}],"isBlockCoverage":true},{"functionName":"strip_generation_comments_2","ranges":[{"startOffset":6527,"endOffset":10063,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1217","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_object_intf.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":93162,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":443,"endOffset":5471,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":667,"endOffset":763,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":857,"endOffset":1716,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1808,"endOffset":1981,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2076,"endOffset":2359,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2452,"endOffset":2625,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2714,"endOffset":3389,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3481,"endOffset":4075,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4162,"endOffset":4510,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4594,"endOffset":4641,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4734,"endOffset":4782,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":4869,"endOffset":4958,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":5065,"endOffset":5390,"count":0}],"isBlockCoverage":false},{"functionName":"lth_oo_object_fnc","ranges":[{"startOffset":5475,"endOffset":9228,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":9231,"endOffset":9344,"count":1},{"startOffset":9287,"endOffset":9323,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_oo_object_fnc$add_to_activation_list","ranges":[{"startOffset":9347,"endOffset":10116,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_oo_object_fnc$create","ranges":[{"startOffset":10119,"endOffset":11584,"count":1},{"startOffset":11315,"endOffset":11356,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_oo_object_fnc$create_documentation","ranges":[{"startOffset":11587,"endOffset":12848,"count":1},{"startOffset":12636,"endOffset":12683,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_oo_object_fnc$create_sotr","ranges":[{"startOffset":12851,"endOffset":13465,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$delete","ranges":[{"startOffset":13468,"endOffset":13790,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$delete_documentation","ranges":[{"startOffset":13793,"endOffset":14276,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$deserialize_source","ranges":[{"startOffset":14279,"endOffset":15196,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_oo_object_fnc$exists","ranges":[{"startOffset":15199,"endOffset":15642,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$generate_locals","ranges":[{"startOffset":15645,"endOffset":16854,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_class_properties","ranges":[{"startOffset":16857,"endOffset":17287,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_includes","ranges":[{"startOffset":17290,"endOffset":17989,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_interface_properties","ranges":[{"startOffset":17992,"endOffset":19251,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$get_skip_test_classes","ranges":[{"startOffset":19254,"endOffset":19436,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$insert_text_pool","ranges":[{"startOffset":19439,"endOffset":20231,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_attributes","ranges":[{"startOffset":20234,"endOffset":21283,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_descriptions","ranges":[{"startOffset":21286,"endOffset":22428,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_descriptions_sub","ranges":[{"startOffset":22431,"endOffset":23674,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_documentation","ranges":[{"startOffset":23677,"endOffset":24532,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_sotr","ranges":[{"startOffset":24535,"endOffset":25199,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_superclass","ranges":[{"startOffset":25202,"endOffset":25584,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$read_text_pool","ranges":[{"startOffset":25587,"endOffset":26104,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$serialize_abap","ranges":[{"startOffset":26107,"endOffset":26871,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_oo_object_fnc$update_descriptions","ranges":[{"startOffset":26874,"endOffset":28035,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_oo_object_fnc$update_descriptions_sub","ranges":[{"startOffset":28038,"endOffset":29211,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":30034,"endOffset":32145,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":30217,"endOffset":30341,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30421,"endOffset":30535,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30622,"endOffset":30776,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":30857,"endOffset":31451,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31646,"endOffset":31710,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":31808,"endOffset":32064,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_unit_test","ranges":[{"startOffset":32149,"endOffset":33244,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":33247,"endOffset":33360,"count":1},{"startOffset":33303,"endOffset":33339,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":33363,"endOffset":34299,"count":1}],"isBlockCoverage":true},{"functionName":"deserializes","ranges":[{"startOffset":34302,"endOffset":41094,"count":1}],"isBlockCoverage":true},{"functionName":"get_xml","ranges":[{"startOffset":41097,"endOffset":44068,"count":1}],"isBlockCoverage":true},{"functionName":"get_source","ranges":[{"startOffset":44071,"endOffset":45163,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":45272,"endOffset":45721,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_aff_metadata","ranges":[{"startOffset":45725,"endOffset":45810,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":45813,"endOffset":45926,"count":4},{"startOffset":45869,"endOffset":45905,"count":0}],"isBlockCoverage":true},{"functionName":"serialize_default","ranges":[{"startOffset":45929,"endOffset":51912,"count":1}],"isBlockCoverage":true},{"functionName":"serialize_non_default","ranges":[{"startOffset":51915,"endOffset":58373,"count":1}],"isBlockCoverage":true},{"functionName":"deserialize_non_defaults","ranges":[{"startOffset":58376,"endOffset":81042,"count":1}],"isBlockCoverage":true},{"functionName":"deserialize_defaults","ranges":[{"startOffset":81045,"endOffset":92943,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1218","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_path.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10587,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":188,"endOffset":655,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_path","ranges":[{"startOffset":659,"endOffset":744,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":747,"endOffset":860,"count":5},{"startOffset":803,"endOffset":839,"count":0}],"isBlockCoverage":true},{"functionName":"is_root","ranges":[{"startOffset":863,"endOffset":1683,"count":1}],"isBlockCoverage":true},{"functionName":"split_file_location","ranges":[{"startOffset":1686,"endOffset":4308,"count":1}],"isBlockCoverage":true},{"functionName":"is_subdir","ranges":[{"startOffset":4311,"endOffset":6118,"count":1}],"isBlockCoverage":true},{"functionName":"change_dir","ranges":[{"startOffset":6121,"endOffset":8271,"count":1}],"isBlockCoverage":true},{"functionName":"get_filename_from_syspath","ranges":[{"startOffset":8274,"endOffset":10441,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1219","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_po_file.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":19097,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":201,"endOffset":665,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_po_file","ranges":[{"startOffset":669,"endOffset":754,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":757,"endOffset":870,"count":5},{"startOffset":813,"endOffset":849,"count":0}],"isBlockCoverage":true},{"functionName":"po_body","ranges":[{"startOffset":873,"endOffset":5123,"count":1}],"isBlockCoverage":true},{"functionName":"parse_happy_path","ranges":[{"startOffset":5126,"endOffset":10526,"count":1},{"startOffset":8951,"endOffset":9044,"count":3}],"isBlockCoverage":true},{"functionName":"parse_negative","ranges":[{"startOffset":10529,"endOffset":13693,"count":1},{"startOffset":11100,"endOffset":11107,"count":0},{"startOffset":11233,"endOffset":11265,"count":0},{"startOffset":11572,"endOffset":11579,"count":0},{"startOffset":11705,"endOffset":11737,"count":0},{"startOffset":12028,"endOffset":12035,"count":0},{"startOffset":12161,"endOffset":12193,"count":0},{"startOffset":12576,"endOffset":12583,"count":0},{"startOffset":12709,"endOffset":12741,"count":0},{"startOffset":13047,"endOffset":13054,"count":0},{"startOffset":13180,"endOffset":13212,"count":0},{"startOffset":13518,"endOffset":13525,"count":0},{"startOffset":13651,"endOffset":13683,"count":0}],"isBlockCoverage":true},{"functionName":"unquote","ranges":[{"startOffset":13696,"endOffset":15824,"count":1},{"startOffset":14559,"endOffset":14622,"count":0},{"startOffset":14748,"endOffset":14780,"count":0},{"startOffset":14908,"endOffset":14971,"count":0},{"startOffset":15097,"endOffset":15129,"count":0},{"startOffset":15254,"endOffset":15317,"count":0},{"startOffset":15443,"endOffset":15475,"count":0},{"startOffset":15593,"endOffset":15656,"count":0},{"startOffset":15782,"endOffset":15814,"count":0}],"isBlockCoverage":true},{"functionName":"multiline_parsing","ranges":[{"startOffset":15827,"endOffset":18936,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1220","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14571,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":207,"endOffset":1995,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":398,"endOffset":514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":596,"endOffset":722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":810,"endOffset":940,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1030,"endOffset":1129,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1911,"endOffset":1971,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_find_remote_dot_abapgit","ranges":[{"startOffset":1999,"endOffset":2554,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2557,"endOffset":2670,"count":2},{"startOffset":2613,"endOffset":2649,"count":0}],"isBlockCoverage":true},{"functionName":"positive","ranges":[{"startOffset":2673,"endOffset":2906,"count":1}],"isBlockCoverage":true},{"functionName":"new_repo_needs_no_dot_abapgit","ranges":[{"startOffset":2909,"endOffset":3262,"count":1}],"isBlockCoverage":true},{"functionName":"given_any_repo","ranges":[{"startOffset":3265,"endOffset":7878,"count":2}],"isBlockCoverage":true},{"functionName":"given_dot_abapgit_file","ranges":[{"startOffset":7881,"endOffset":11122,"count":1}],"isBlockCoverage":true},{"functionName":"given_no_dot_abapgit_file","ranges":[{"startOffset":11125,"endOffset":11164,"count":1}],"isBlockCoverage":true},{"functionName":"when_find_remote_dot_abapgit","ranges":[{"startOffset":11167,"endOffset":11505,"count":2},{"startOffset":11307,"endOffset":11501,"count":0}],"isBlockCoverage":true},{"functionName":"then_dot_abapgit_is_bound","ranges":[{"startOffset":11508,"endOffset":11635,"count":1}],"isBlockCoverage":true},{"functionName":"then_no_exception_is_raised","ranges":[{"startOffset":11638,"endOffset":11765,"count":2}],"isBlockCoverage":true},{"functionName":"then_dot_abapgit_is_not_bound","ranges":[{"startOffset":11768,"endOffset":11903,"count":1}],"isBlockCoverage":true},{"functionName":"given_repo_has_files","ranges":[{"startOffset":11906,"endOffset":14171,"count":1},{"startOffset":13787,"endOffset":14047,"count":3}],"isBlockCoverage":true}]},{"scriptId":"1221","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_checksums.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":95865,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":356,"endOffset":2548,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":877,"endOffset":2145,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2187,"endOffset":2251,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2354,"endOffset":2418,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2460,"endOffset":2524,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test_checksum_serializer","ranges":[{"startOffset":2552,"endOffset":2637,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2640,"endOffset":2753,"count":4},{"startOffset":2696,"endOffset":2732,"count":0}],"isBlockCoverage":true},{"functionName":"get_mock","ranges":[{"startOffset":2756,"endOffset":2841,"count":2}],"isBlockCoverage":true},{"functionName":"get_mock","ranges":[{"startOffset":2851,"endOffset":7852,"count":5},{"startOffset":4189,"endOffset":4225,"count":3},{"startOffset":4324,"endOffset":4348,"count":4}],"isBlockCoverage":true},{"functionName":"space_to_separator","ranges":[{"startOffset":7855,"endOffset":7960,"count":2}],"isBlockCoverage":true},{"functionName":"space_to_separator","ranges":[{"startOffset":7970,"endOffset":8389,"count":12}],"isBlockCoverage":true},{"functionName":"serialize","ranges":[{"startOffset":8392,"endOffset":10123,"count":1}],"isBlockCoverage":true},{"functionName":"deserialize","ranges":[{"startOffset":10126,"endOffset":13104,"count":1}],"isBlockCoverage":true},{"functionName":"serialize_w_zero_item","ranges":[{"startOffset":13107,"endOffset":17362,"count":1}],"isBlockCoverage":true},{"functionName":"deserialize_w_root_file","ranges":[{"startOffset":17365,"endOffset":22240,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22378,"endOffset":29573,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":22612,"endOffset":24024,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":24113,"endOffset":24998,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":25096,"endOffset":29492,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_repo_mock","ranges":[{"startOffset":29577,"endOffset":36451,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":36454,"endOffset":36567,"count":4},{"startOffset":36510,"endOffset":36546,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_repo_srv$get","ranges":[{"startOffset":36570,"endOffset":37025,"count":4}],"isBlockCoverage":true},{"functionName":"zif_abapgit_repo$get_files_local","ranges":[{"startOffset":37028,"endOffset":38964,"count":3},{"startOffset":38628,"endOffset":38643,"count":0},{"startOffset":38645,"endOffset":38672,"count":0},{"startOffset":38835,"endOffset":38857,"count":0},{"startOffset":38859,"endOffset":38900,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_repo$get_files_remote","ranges":[{"startOffset":38967,"endOffset":40506,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_key","ranges":[{"startOffset":40509,"endOffset":40722,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_name","ranges":[{"startOffset":40725,"endOffset":40910,"count":3}],"isBlockCoverage":true},{"functionName":"zif_abapgit_repo$checksums","ranges":[{"startOffset":40913,"endOffset":41127,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$init","ranges":[{"startOffset":41130,"endOffset":41169,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$delete","ranges":[{"startOffset":41172,"endOffset":41404,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_local_settings","ranges":[{"startOffset":41407,"endOffset":42643,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_package","ranges":[{"startOffset":42646,"endOffset":42814,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$get_repo_from_package","ranges":[{"startOffset":42817,"endOffset":43666,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$get_repo_from_url","ranges":[{"startOffset":43669,"endOffset":44170,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$is_offline","ranges":[{"startOffset":44173,"endOffset":44341,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$deserialize","ranges":[{"startOffset":44344,"endOffset":49207,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$deserialize_checks","ranges":[{"startOffset":49210,"endOffset":53849,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$set_dot_abapgit","ranges":[{"startOffset":53852,"endOffset":54127,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$get_dot_abapgit","ranges":[{"startOffset":54130,"endOffset":54344,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$is_repo_installed","ranges":[{"startOffset":54347,"endOffset":54863,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$list","ranges":[{"startOffset":54866,"endOffset":55265,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$list_favorites","ranges":[{"startOffset":55268,"endOffset":55677,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$new_offline","ranges":[{"startOffset":55680,"endOffset":57270,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$new_online","ranges":[{"startOffset":57273,"endOffset":59184,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$purge","ranges":[{"startOffset":59187,"endOffset":60315,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo$refresh","ranges":[{"startOffset":60318,"endOffset":60940,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$validate_package","ranges":[{"startOffset":60943,"endOffset":61764,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$validate_url","ranges":[{"startOffset":61767,"endOffset":62240,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_repo_srv$get_label_list","ranges":[{"startOffset":62243,"endOffset":62792,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":62907,"endOffset":64742,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":63101,"endOffset":64513,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":64654,"endOffset":64718,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_local_file_builder","ranges":[{"startOffset":64746,"endOffset":66247,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":66250,"endOffset":66363,"count":3},{"startOffset":66306,"endOffset":66342,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":66366,"endOffset":68496,"count":9},{"startOffset":68225,"endOffset":68424,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":68630,"endOffset":69939,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":68825,"endOffset":69710,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":69851,"endOffset":69915,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_remote_file_builder","ranges":[{"startOffset":69943,"endOffset":70917,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":70920,"endOffset":71033,"count":2},{"startOffset":70976,"endOffset":71012,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":71036,"endOffset":72049,"count":6}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":72182,"endOffset":73256,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":72374,"endOffset":73027,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":73168,"endOffset":73232,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_file_sig_builder","ranges":[{"startOffset":73260,"endOffset":74002,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":74005,"endOffset":74118,"count":2},{"startOffset":74061,"endOffset":74097,"count":0}],"isBlockCoverage":true},{"functionName":"add","ranges":[{"startOffset":74121,"endOffset":75050,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":75176,"endOffset":76013,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":75408,"endOffset":75507,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":75603,"endOffset":75705,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test_checksums","ranges":[{"startOffset":76017,"endOffset":76339,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":76342,"endOffset":76455,"count":4},{"startOffset":76398,"endOffset":76434,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":76458,"endOffset":78753,"count":1}],"isBlockCoverage":true},{"functionName":"rebuild_simple","ranges":[{"startOffset":78756,"endOffset":81868,"count":1}],"isBlockCoverage":true},{"functionName":"update_simple","ranges":[{"startOffset":81871,"endOffset":84116,"count":1}],"isBlockCoverage":true},{"functionName":"zif_abapgit_persist_repo_cs$delete","ranges":[{"startOffset":84119,"endOffset":84333,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_repo_cs$read","ranges":[{"startOffset":84336,"endOffset":84991,"count":2}],"isBlockCoverage":true},{"functionName":"zif_abapgit_persist_repo_cs$update","ranges":[{"startOffset":84994,"endOffset":85478,"count":3}],"isBlockCoverage":true},{"functionName":"rebuild_w_dot_abapgit","ranges":[{"startOffset":85481,"endOffset":88341,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":88473,"endOffset":88729,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_update_calculator_test","ranges":[{"startOffset":88733,"endOffset":88818,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":88821,"endOffset":88934,"count":1},{"startOffset":88877,"endOffset":88913,"count":0}],"isBlockCoverage":true},{"functionName":"simple_test","ranges":[{"startOffset":88937,"endOffset":95507,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1222","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_labels.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11584,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":209,"endOffset":789,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_tags","ranges":[{"startOffset":793,"endOffset":878,"count":7}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":881,"endOffset":994,"count":7},{"startOffset":937,"endOffset":973,"count":0}],"isBlockCoverage":true},{"functionName":"split","ranges":[{"startOffset":997,"endOffset":2113,"count":1}],"isBlockCoverage":true},{"functionName":"validate","ranges":[{"startOffset":2116,"endOffset":2848,"count":1},{"startOffset":2617,"endOffset":2680,"count":0},{"startOffset":2806,"endOffset":2838,"count":0}],"isBlockCoverage":true},{"functionName":"normalize","ranges":[{"startOffset":2851,"endOffset":4056,"count":1}],"isBlockCoverage":true},{"functionName":"validate_colors","ranges":[{"startOffset":4059,"endOffset":6799,"count":1},{"startOffset":4760,"endOffset":4823,"count":0},{"startOffset":4949,"endOffset":4981,"count":0},{"startOffset":5118,"endOffset":5181,"count":0},{"startOffset":5307,"endOffset":5339,"count":0},{"startOffset":5478,"endOffset":5541,"count":0},{"startOffset":5667,"endOffset":5699,"count":0},{"startOffset":5840,"endOffset":5903,"count":0},{"startOffset":6029,"endOffset":6061,"count":0},{"startOffset":6203,"endOffset":6266,"count":0},{"startOffset":6392,"endOffset":6424,"count":0},{"startOffset":6568,"endOffset":6631,"count":0},{"startOffset":6757,"endOffset":6789,"count":0}],"isBlockCoverage":true},{"functionName":"split_colors","ranges":[{"startOffset":6802,"endOffset":8758,"count":1}],"isBlockCoverage":true},{"functionName":"split_colors_into_map","ranges":[{"startOffset":8761,"endOffset":10160,"count":1}],"isBlockCoverage":true},{"functionName":"normalize_colors","ranges":[{"startOffset":10163,"endOffset":11424,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1223","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_requirement_helper.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":32268,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":231,"endOffset":587,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":505,"endOffset":563,"count":0}],"isBlockCoverage":false},{"functionName":"lcl_helper","ranges":[{"startOffset":591,"endOffset":676,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":679,"endOffset":792,"count":0}],"isBlockCoverage":false},{"functionName":"get_sap_basis_component","ranges":[{"startOffset":795,"endOffset":881,"count":0}],"isBlockCoverage":false},{"functionName":"get_sap_basis_component","ranges":[{"startOffset":891,"endOffset":2983,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3100,"endOffset":3533,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_lower_release","ranges":[{"startOffset":3539,"endOffset":3630,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3635,"endOffset":3754,"count":0}],"isBlockCoverage":false},{"functionName":"empty_patch","ranges":[{"startOffset":3759,"endOffset":5542,"count":0}],"isBlockCoverage":false},{"functionName":"lower_patch","ranges":[{"startOffset":5547,"endOffset":7448,"count":0}],"isBlockCoverage":false},{"functionName":"same_patch","ranges":[{"startOffset":7453,"endOffset":9233,"count":0}],"isBlockCoverage":false},{"functionName":"higher_patch","ranges":[{"startOffset":9238,"endOffset":11072,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":11204,"endOffset":11636,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_same_release","ranges":[{"startOffset":11642,"endOffset":11733,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":11738,"endOffset":11857,"count":0}],"isBlockCoverage":false},{"functionName":"empty_patch","ranges":[{"startOffset":11862,"endOffset":13591,"count":0}],"isBlockCoverage":false},{"functionName":"lower_patch","ranges":[{"startOffset":13596,"endOffset":15443,"count":0}],"isBlockCoverage":false},{"functionName":"same_patch","ranges":[{"startOffset":15448,"endOffset":17174,"count":0}],"isBlockCoverage":false},{"functionName":"higher_patch","ranges":[{"startOffset":17179,"endOffset":18958,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":19090,"endOffset":19524,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_higher_release","ranges":[{"startOffset":19530,"endOffset":19621,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":19626,"endOffset":19745,"count":0}],"isBlockCoverage":false},{"functionName":"empty_patch","ranges":[{"startOffset":19750,"endOffset":21530,"count":0}],"isBlockCoverage":false},{"functionName":"lower_patch","ranges":[{"startOffset":21535,"endOffset":23367,"count":0}],"isBlockCoverage":false},{"functionName":"same_patch","ranges":[{"startOffset":23372,"endOffset":25149,"count":0}],"isBlockCoverage":false},{"functionName":"higher_patch","ranges":[{"startOffset":25154,"endOffset":26985,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":27114,"endOffset":27428,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_formats","ranges":[{"startOffset":27434,"endOffset":27525,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":27530,"endOffset":27649,"count":0}],"isBlockCoverage":false},{"functionName":"shorter_patch","ranges":[{"startOffset":27654,"endOffset":29831,"count":0}],"isBlockCoverage":false},{"functionName":"higher_patch","ranges":[{"startOffset":29836,"endOffset":32009,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1224","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_serialize.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":29688,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":784,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":415,"endOffset":541,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_determine_max_threads","ranges":[{"startOffset":788,"endOffset":1003,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1006,"endOffset":1119,"count":2},{"startOffset":1062,"endOffset":1098,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1122,"endOffset":1539,"count":2},{"startOffset":1245,"endOffset":1535,"count":0}],"isBlockCoverage":true},{"functionName":"determine_max_threads","ranges":[{"startOffset":1542,"endOffset":1834,"count":1}],"isBlockCoverage":true},{"functionName":"force","ranges":[{"startOffset":1837,"endOffset":2157,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2285,"endOffset":3086,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":2466,"endOffset":2596,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2676,"endOffset":2802,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_serialize","ranges":[{"startOffset":3090,"endOffset":3439,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3442,"endOffset":3555,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":3558,"endOffset":4090,"count":0}],"isBlockCoverage":false},{"functionName":"test","ranges":[{"startOffset":4093,"endOffset":9189,"count":0}],"isBlockCoverage":false},{"functionName":"unsupported","ranges":[{"startOffset":9192,"endOffset":13383,"count":0}],"isBlockCoverage":false},{"functionName":"ignored","ranges":[{"startOffset":13386,"endOffset":18238,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":18337,"endOffset":19394,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":18521,"endOffset":18651,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18731,"endOffset":18857,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":18940,"endOffset":19038,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":19120,"endOffset":19218,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_i18n","ranges":[{"startOffset":19398,"endOffset":19837,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":19840,"endOffset":19953,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":19956,"endOffset":22542,"count":0}],"isBlockCoverage":false},{"functionName":"test","ranges":[{"startOffset":22545,"endOffset":29218,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1225","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_basis.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":38080,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":228,"endOffset":2635,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":423,"endOffset":519,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":601,"endOffset":727,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":815,"endOffset":970,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1063,"endOffset":1228,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1320,"endOffset":1416,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_create_package","ranges":[{"startOffset":2639,"endOffset":3421,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":3424,"endOffset":3537,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":3540,"endOffset":3779,"count":0}],"isBlockCoverage":false},{"functionName":"raise_error_if_package_exists","ranges":[{"startOffset":3782,"endOffset":3943,"count":0}],"isBlockCoverage":false},{"functionName":"package_given_in_popup","ranges":[{"startOffset":3946,"endOffset":4261,"count":0}],"isBlockCoverage":false},{"functionName":"package_not_created_when_canc","ranges":[{"startOffset":4264,"endOffset":4516,"count":0}],"isBlockCoverage":false},{"functionName":"package_created_when_confirm","ranges":[{"startOffset":4519,"endOffset":4768,"count":0}],"isBlockCoverage":false},{"functionName":"when_create_package","ranges":[{"startOffset":4771,"endOffset":5456,"count":0}],"isBlockCoverage":false},{"functionName":"given_existing_package","ranges":[{"startOffset":5459,"endOffset":5616,"count":0}],"isBlockCoverage":false},{"functionName":"given_non_existing_package","ranges":[{"startOffset":5619,"endOffset":5784,"count":0}],"isBlockCoverage":false},{"functionName":"then_error_is_raised","ranges":[{"startOffset":5787,"endOffset":5903,"count":0}],"isBlockCoverage":false},{"functionName":"then_no_error_is_raised","ranges":[{"startOffset":5906,"endOffset":6029,"count":0}],"isBlockCoverage":false},{"functionName":"then_popup_is_shown","ranges":[{"startOffset":6032,"endOffset":6199,"count":0}],"isBlockCoverage":false},{"functionName":"given_user_cancels_popup","ranges":[{"startOffset":6202,"endOffset":6410,"count":0}],"isBlockCoverage":false},{"functionName":"then_no_package_is_created","ranges":[{"startOffset":6413,"endOffset":6580,"count":0}],"isBlockCoverage":false},{"functionName":"given_user_confirms_popup","ranges":[{"startOffset":6583,"endOffset":6793,"count":0}],"isBlockCoverage":false},{"functionName":"then_package_is_created","ranges":[{"startOffset":6796,"endOffset":7074,"count":0}],"isBlockCoverage":false},{"functionName":"given_no_package","ranges":[{"startOffset":7077,"endOffset":7151,"count":0}],"isBlockCoverage":false},{"functionName":"given_package_by_user","ranges":[{"startOffset":7154,"endOffset":7344,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7470,"endOffset":8955,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7692,"endOffset":7788,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7871,"endOffset":8036,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8119,"endOffset":8473,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8626,"endOffset":8722,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8834,"endOffset":8931,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_sap_package_mock","ranges":[{"startOffset":8959,"endOffset":9374,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":9377,"endOffset":9636,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_responsible","ranges":[{"startOffset":9639,"endOffset":9848,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$validate_name","ranges":[{"startOffset":9851,"endOffset":9914,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_description","ranges":[{"startOffset":9917,"endOffset":10073,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$are_changes_recorded_in_tr_req","ranges":[{"startOffset":10076,"endOffset":10307,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create","ranges":[{"startOffset":10310,"endOffset":11527,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_child","ranges":[{"startOffset":11530,"endOffset":11751,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$create_local","ranges":[{"startOffset":11754,"endOffset":11804,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$exists","ranges":[{"startOffset":11807,"endOffset":12091,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_type","ranges":[{"startOffset":12094,"endOffset":12490,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$get_transport_layer","ranges":[{"startOffset":12493,"endOffset":12653,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_subpackages","ranges":[{"startOffset":12656,"endOffset":13051,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$list_superpackages","ranges":[{"startOffset":13054,"endOffset":13451,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_sap_package$read_parent","ranges":[{"startOffset":13454,"endOffset":13583,"count":0}],"isBlockCoverage":false},{"functionName":"was_create_called","ranges":[{"startOffset":13586,"endOffset":13811,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":14505,"endOffset":16470,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":14716,"endOffset":14898,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":14988,"endOffset":15080,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15164,"endOffset":15260,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15349,"endOffset":15598,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15709,"endOffset":15773,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":15949,"endOffset":16046,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16158,"endOffset":16250,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":16350,"endOffset":16446,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_popups_mock","ranges":[{"startOffset":16474,"endOffset":17142,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":17145,"endOffset":17258,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$branch_list_popup","ranges":[{"startOffset":17261,"endOffset":18847,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$commit_list_popup","ranges":[{"startOffset":18850,"endOffset":21405,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$create_branch_popup","ranges":[{"startOffset":21408,"endOffset":21946,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_folder_logic","ranges":[{"startOffset":21949,"endOffset":22104,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_search_help","ranges":[{"startOffset":22107,"endOffset":22397,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_confirm","ranges":[{"startOffset":22400,"endOffset":24674,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_create_package","ranges":[{"startOffset":24677,"endOffset":26495,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_create_transp_branch","ranges":[{"startOffset":26498,"endOffset":27149,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_from_list","ranges":[{"startOffset":27152,"endOffset":31655,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_transports","ranges":[{"startOffset":31658,"endOffset":31815,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_transport_request","ranges":[{"startOffset":31818,"endOffset":32769,"count":0}],"isBlockCoverage":false},{"functionName":"was_create_package_popup_shown","ranges":[{"startOffset":32772,"endOffset":33021,"count":0}],"isBlockCoverage":false},{"functionName":"set_user_decision","ranges":[{"startOffset":33024,"endOffset":33303,"count":0}],"isBlockCoverage":false},{"functionName":"set_package","ranges":[{"startOffset":33306,"endOffset":33547,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_select_tr_requests","ranges":[{"startOffset":33550,"endOffset":34764,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_select_wb_tc_tr_and_tsk","ranges":[{"startOffset":34767,"endOffset":35422,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$tag_list_popup","ranges":[{"startOffset":35425,"endOffset":36657,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_labels","ranges":[{"startOffset":36660,"endOffset":36950,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$choose_code_insp_check_variant","ranges":[{"startOffset":36953,"endOffset":37154,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1226","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sotr_handler.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8657,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":220,"endOffset":1027,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":514,"endOffset":611,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":664,"endOffset":762,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_sotr_handler","ranges":[{"startOffset":1031,"endOffset":1116,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1119,"endOffset":1232,"count":0}],"isBlockCoverage":false},{"functionName":"is_wd_component_existing","ranges":[{"startOffset":1235,"endOffset":2666,"count":0}],"isBlockCoverage":false},{"functionName":"sotr_wda_0001","ranges":[{"startOffset":2669,"endOffset":4145,"count":0}],"isBlockCoverage":false},{"functionName":"sotr_wda_0003_not_exist","ranges":[{"startOffset":4148,"endOffset":5658,"count":0}],"isBlockCoverage":false},{"functionName":"sotr_wda_0004","ranges":[{"startOffset":5661,"endOffset":7290,"count":0}],"isBlockCoverage":false},{"functionName":"sotr_cx_0002","ranges":[{"startOffset":7293,"endOffset":8471,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1227","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_string_buffer.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1223,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":222,"endOffset":465,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test_strbuf","ranges":[{"startOffset":469,"endOffset":554,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":557,"endOffset":670,"count":1},{"startOffset":613,"endOffset":649,"count":0}],"isBlockCoverage":true},{"functionName":"join_space","ranges":[{"startOffset":673,"endOffset":1038,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1228","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_string_map.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8349,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":209,"endOffset":604,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_sm_test","ranges":[{"startOffset":608,"endOffset":693,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":696,"endOffset":809,"count":4},{"startOffset":752,"endOffset":788,"count":0}],"isBlockCoverage":true},{"functionName":"simple","ranges":[{"startOffset":812,"endOffset":2696,"count":1}],"isBlockCoverage":true},{"functionName":"freeze","ranges":[{"startOffset":2699,"endOffset":4018,"count":1},{"startOffset":3198,"endOffset":3261,"count":0},{"startOffset":3387,"endOffset":3419,"count":0},{"startOffset":3516,"endOffset":3579,"count":0},{"startOffset":3705,"endOffset":3737,"count":0},{"startOffset":3787,"endOffset":3850,"count":0},{"startOffset":3976,"endOffset":4008,"count":0}],"isBlockCoverage":true},{"functionName":"strict","ranges":[{"startOffset":4021,"endOffset":6554,"count":1},{"startOffset":5896,"endOffset":5959,"count":0},{"startOffset":6266,"endOffset":6298,"count":0}],"isBlockCoverage":true},{"functionName":"case_insensitive","ranges":[{"startOffset":6557,"endOffset":7850,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1229","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_abap.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":48258,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":324,"endOffset":832,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":517,"endOffset":647,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_abapgit_syntax_abap","ranges":[{"startOffset":836,"endOffset":1055,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1058,"endOffset":1171,"count":1},{"startOffset":1114,"endOffset":1150,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1174,"endOffset":1284,"count":1}],"isBlockCoverage":true},{"functionName":"report_header","ranges":[{"startOffset":1287,"endOffset":1648,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1785,"endOffset":2418,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":1992,"endOffset":2122,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_syntax_basic_logic","ranges":[{"startOffset":2422,"endOffset":2656,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2659,"endOffset":2772,"count":3},{"startOffset":2715,"endOffset":2751,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":2775,"endOffset":2900,"count":3}],"isBlockCoverage":true},{"functionName":"format_line","ranges":[{"startOffset":2903,"endOffset":3908,"count":1}],"isBlockCoverage":true},{"functionName":"apply_style","ranges":[{"startOffset":3911,"endOffset":4458,"count":1}],"isBlockCoverage":true},{"functionName":"process_line","ranges":[{"startOffset":4461,"endOffset":5262,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5391,"endOffset":9969,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":5585,"endOffset":6330,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6418,"endOffset":7163,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":7252,"endOffset":7997,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8143,"endOffset":8207,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8308,"endOffset":8350,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8395,"endOffset":8455,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8500,"endOffset":8560,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8661,"endOffset":8703,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8748,"endOffset":8808,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8853,"endOffset":8913,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8960,"endOffset":9024,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9126,"endOffset":9168,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9213,"endOffset":9273,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9318,"endOffset":9378,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9425,"endOffset":9489,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_syntax_cases","ranges":[{"startOffset":9973,"endOffset":12330,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":12333,"endOffset":12446,"count":8},{"startOffset":12389,"endOffset":12425,"count":0}],"isBlockCoverage":true},{"functionName":"do_test","ranges":[{"startOffset":12449,"endOffset":15660,"count":8},{"startOffset":15244,"endOffset":15656,"count":56},{"startOffset":15336,"endOffset":15580,"count":0}],"isBlockCoverage":true},{"functionName":"generate_parse","ranges":[{"startOffset":15663,"endOffset":16799,"count":48}],"isBlockCoverage":true},{"functionName":"generate_order","ranges":[{"startOffset":16802,"endOffset":18130,"count":28}],"isBlockCoverage":true},{"functionName":"generate_extend","ranges":[{"startOffset":18133,"endOffset":19463,"count":56}],"isBlockCoverage":true},{"functionName":"test_abap_01","ranges":[{"startOffset":19466,"endOffset":21328,"count":1}],"isBlockCoverage":true},{"functionName":"test_abap_02","ranges":[{"startOffset":21331,"endOffset":24047,"count":1}],"isBlockCoverage":true},{"functionName":"test_abap_03","ranges":[{"startOffset":24050,"endOffset":27557,"count":1}],"isBlockCoverage":true},{"functionName":"test_abap_04","ranges":[{"startOffset":27560,"endOffset":32322,"count":1}],"isBlockCoverage":true},{"functionName":"test_abap_05","ranges":[{"startOffset":32325,"endOffset":37422,"count":1}],"isBlockCoverage":true},{"functionName":"test_abap_06","ranges":[{"startOffset":37425,"endOffset":45369,"count":1}],"isBlockCoverage":true},{"functionName":"test_abap_07","ranges":[{"startOffset":45372,"endOffset":47239,"count":1}],"isBlockCoverage":true},{"functionName":"test_abap_08","ranges":[{"startOffset":47242,"endOffset":48023,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1230","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_json.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2570,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":324,"endOffset":936,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":517,"endOffset":647,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_abapgit_syntax_json","ranges":[{"startOffset":940,"endOffset":1159,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1162,"endOffset":1275,"count":3},{"startOffset":1218,"endOffset":1254,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1278,"endOffset":1388,"count":3}],"isBlockCoverage":true},{"functionName":"key_value","ranges":[{"startOffset":1391,"endOffset":1688,"count":1}],"isBlockCoverage":true},{"functionName":"comment_1","ranges":[{"startOffset":1691,"endOffset":2094,"count":1}],"isBlockCoverage":true},{"functionName":"comment_2","ranges":[{"startOffset":2097,"endOffset":2365,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1231","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_xml.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":45341,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":320,"endOffset":1277,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":511,"endOffset":639,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_abapgit_syntax_xml","ranges":[{"startOffset":1281,"endOffset":1498,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1501,"endOffset":1614,"count":8},{"startOffset":1557,"endOffset":1593,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1617,"endOffset":1726,"count":8}],"isBlockCoverage":true},{"functionName":"sole_closing_xml_tag","ranges":[{"startOffset":1729,"endOffset":1987,"count":1}],"isBlockCoverage":true},{"functionName":"complete_xml_tag","ranges":[{"startOffset":1990,"endOffset":2255,"count":1}],"isBlockCoverage":true},{"functionName":"complete_xml_tag_with_closing","ranges":[{"startOffset":2258,"endOffset":2538,"count":1}],"isBlockCoverage":true},{"functionName":"empty_attributes","ranges":[{"startOffset":2541,"endOffset":3562,"count":1}],"isBlockCoverage":true},{"functionName":"attributes_only","ranges":[{"startOffset":3565,"endOffset":4640,"count":1}],"isBlockCoverage":true},{"functionName":"open_tags","ranges":[{"startOffset":4643,"endOffset":5514,"count":1}],"isBlockCoverage":true},{"functionName":"attribute_value_equal_signs","ranges":[{"startOffset":5517,"endOffset":6341,"count":1}],"isBlockCoverage":true},{"functionName":"multi_line_comments","ranges":[{"startOffset":6344,"endOffset":6948,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7076,"endOffset":11701,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":7269,"endOffset":8014,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8102,"endOffset":8847,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8936,"endOffset":9681,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9827,"endOffset":9891,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9992,"endOffset":10034,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10079,"endOffset":10139,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10184,"endOffset":10244,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10345,"endOffset":10387,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10432,"endOffset":10492,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10537,"endOffset":10597,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10644,"endOffset":10708,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10810,"endOffset":10852,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10897,"endOffset":10957,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11002,"endOffset":11062,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11109,"endOffset":11173,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_syntax_cases","ranges":[{"startOffset":11705,"endOffset":14062,"count":9}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":14065,"endOffset":14178,"count":9},{"startOffset":14121,"endOffset":14157,"count":0}],"isBlockCoverage":true},{"functionName":"do_test","ranges":[{"startOffset":14181,"endOffset":17392,"count":9},{"startOffset":16976,"endOffset":17388,"count":41},{"startOffset":17068,"endOffset":17312,"count":0}],"isBlockCoverage":true},{"functionName":"generate_parse","ranges":[{"startOffset":17395,"endOffset":18531,"count":36}],"isBlockCoverage":true},{"functionName":"generate_order","ranges":[{"startOffset":18534,"endOffset":19862,"count":31}],"isBlockCoverage":true},{"functionName":"generate_extend","ranges":[{"startOffset":19865,"endOffset":21195,"count":41}],"isBlockCoverage":true},{"functionName":"test_xml_01","ranges":[{"startOffset":21198,"endOffset":23184,"count":1}],"isBlockCoverage":true},{"functionName":"test_xml_02","ranges":[{"startOffset":23187,"endOffset":24163,"count":1}],"isBlockCoverage":true},{"functionName":"test_xml_03","ranges":[{"startOffset":24166,"endOffset":27048,"count":1}],"isBlockCoverage":true},{"functionName":"test_xml_04","ranges":[{"startOffset":27051,"endOffset":29927,"count":1}],"isBlockCoverage":true},{"functionName":"test_xml_05","ranges":[{"startOffset":29930,"endOffset":35449,"count":1}],"isBlockCoverage":true},{"functionName":"test_xml_06","ranges":[{"startOffset":35452,"endOffset":37712,"count":1}],"isBlockCoverage":true},{"functionName":"test_xml_07","ranges":[{"startOffset":37715,"endOffset":40598,"count":1}],"isBlockCoverage":true},{"functionName":"test_xml_08","ranges":[{"startOffset":40601,"endOffset":42249,"count":1}],"isBlockCoverage":true},{"functionName":"test_xml_09","ranges":[{"startOffset":42252,"endOffset":45134,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1232","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_timer.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3707,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":192,"endOffset":821,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":442,"endOffset":506,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":550,"endOffset":614,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_timer","ranges":[{"startOffset":825,"endOffset":910,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":913,"endOffset":1026,"count":3},{"startOffset":969,"endOffset":1005,"count":0}],"isBlockCoverage":true},{"functionName":"check_result","ranges":[{"startOffset":1029,"endOffset":1559,"count":4}],"isBlockCoverage":true},{"functionName":"run_timer","ranges":[{"startOffset":1562,"endOffset":2025,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1819,"endOffset":1883,"count":1}],"isBlockCoverage":true},{"functionName":"run_timer_with_count","ranges":[{"startOffset":2028,"endOffset":2932,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2339,"endOffset":2403,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2712,"endOffset":2776,"count":1}],"isBlockCoverage":true},{"functionName":"run_timer_with_text","ranges":[{"startOffset":2935,"endOffset":3556,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3318,"endOffset":3382,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1233","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_objects.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":52513,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":240,"endOffset":12955,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":451,"endOffset":593,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":687,"endOffset":1496,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1588,"endOffset":2947,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3037,"endOffset":6713,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":6795,"endOffset":6913,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8211,"endOffset":8275,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8322,"endOffset":8386,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8432,"endOffset":8529,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8642,"endOffset":8706,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8753,"endOffset":8817,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8864,"endOffset":8928,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":8971,"endOffset":9035,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9080,"endOffset":9169,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":9281,"endOffset":10470,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10517,"endOffset":10581,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10628,"endOffset":10692,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10739,"endOffset":10803,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10846,"endOffset":10910,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":10953,"endOffset":11017,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":11191,"endOffset":12380,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12501,"endOffset":12565,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12685,"endOffset":12749,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":12792,"endOffset":12856,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_transport_objects","ranges":[{"startOffset":12959,"endOffset":19220,"count":15}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":19223,"endOffset":19336,"count":15},{"startOffset":19279,"endOffset":19315,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":19339,"endOffset":19445,"count":15}],"isBlockCoverage":true},{"functionName":"add_new_to_local_files","ranges":[{"startOffset":19448,"endOffset":21586,"count":1}],"isBlockCoverage":true},{"functionName":"modified_to_new_local_files","ranges":[{"startOffset":21589,"endOffset":23735,"count":1}],"isBlockCoverage":true},{"functionName":"should_add_all_local_files","ranges":[{"startOffset":23738,"endOffset":27827,"count":1}],"isBlockCoverage":true},{"functionName":"transport_not_in_repository","ranges":[{"startOffset":27830,"endOffset":28340,"count":1}],"isBlockCoverage":true},{"functionName":"object_not_in_local_files","ranges":[{"startOffset":28343,"endOffset":29267,"count":1}],"isBlockCoverage":true},{"functionName":"cant_be_added_with_del_flag","ranges":[{"startOffset":29270,"endOffset":29925,"count":1}],"isBlockCoverage":true},{"functionName":"cant_be_modified_with_del_flag","ranges":[{"startOffset":29928,"endOffset":30589,"count":1}],"isBlockCoverage":true},{"functionName":"deleted_to_removed_files","ranges":[{"startOffset":30592,"endOffset":31381,"count":1}],"isBlockCoverage":true},{"functionName":"should_delete_all_related","ranges":[{"startOffset":31384,"endOffset":32701,"count":1}],"isBlockCoverage":true},{"functionName":"should_remove_no_delflag_iwmo","ranges":[{"startOffset":32704,"endOffset":33351,"count":1}],"isBlockCoverage":true},{"functionName":"should_remove_no_delflag_iwom","ranges":[{"startOffset":33354,"endOffset":34001,"count":1}],"isBlockCoverage":true},{"functionName":"should_remove_no_delflag_iwsg","ranges":[{"startOffset":34004,"endOffset":34651,"count":1}],"isBlockCoverage":true},{"functionName":"should_remove_no_delflag_iwsv","ranges":[{"startOffset":34654,"endOffset":35301,"count":1}],"isBlockCoverage":true},{"functionName":"should_remove_no_delflag_susc","ranges":[{"startOffset":35304,"endOffset":35951,"count":1}],"isBlockCoverage":true},{"functionName":"shouldnt_remove_no_delflag","ranges":[{"startOffset":35954,"endOffset":36722,"count":1}],"isBlockCoverage":true},{"functionName":"given_the_transport_object","ranges":[{"startOffset":36725,"endOffset":38105,"count":15},{"startOffset":37198,"endOffset":37233,"count":10}],"isBlockCoverage":true},{"functionName":"given_the_object_status","ranges":[{"startOffset":38108,"endOffset":40293,"count":17},{"startOffset":38547,"endOffset":38584,"count":13},{"startOffset":38685,"endOffset":38714,"count":9}],"isBlockCoverage":true},{"functionName":"given_the_local_file","ranges":[{"startOffset":40296,"endOffset":42648,"count":5}],"isBlockCoverage":true},{"functionName":"when_staging","ranges":[{"startOffset":42651,"endOffset":43002,"count":15},{"startOffset":42998,"endOffset":43001,"count":11}],"isBlockCoverage":true},{"functionName":"then_file_should_be_added","ranges":[{"startOffset":43005,"endOffset":47817,"count":4},{"startOffset":47619,"endOffset":47813,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":46442,"endOffset":46801,"count":5},{"startOffset":46537,"endOffset":46611,"count":4},{"startOffset":46612,"endOffset":46686,"count":4},{"startOffset":46687,"endOffset":46799,"count":4}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":46830,"endOffset":46867,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":46923,"endOffset":46956,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":47008,"endOffset":47041,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":47093,"endOffset":47117,"count":0}],"isBlockCoverage":false},{"functionName":"then_it_should_raise_exception","ranges":[{"startOffset":47820,"endOffset":48665,"count":4},{"startOffset":48193,"endOffset":48327,"count":0},{"startOffset":48623,"endOffset":48655,"count":0}],"isBlockCoverage":true},{"functionName":"then_it_should_remove_at_stage","ranges":[{"startOffset":48668,"endOffset":51744,"count":3},{"startOffset":51572,"endOffset":51740,"count":0}],"isBlockCoverage":true},{"functionName":"withKey","ranges":[{"startOffset":51107,"endOffset":51222,"count":4},{"startOffset":51174,"endOffset":51220,"count":3}],"isBlockCoverage":true},{"functionName":"key","ranges":[{"startOffset":51251,"endOffset":51288,"count":0}],"isBlockCoverage":false},{"functionName":"key","ranges":[{"startOffset":51316,"endOffset":51349,"count":0}],"isBlockCoverage":false},{"functionName":"then_it_should_not_raise_excpt","ranges":[{"startOffset":51747,"endOffset":52302,"count":6},{"startOffset":51972,"endOffset":52298,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1234","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ui_injector.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":23261,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":316,"endOffset":705,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":560,"endOffset":624,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_abapgit_popups_mock","ranges":[{"startOffset":709,"endOffset":917,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":920,"endOffset":1033,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$branch_list_popup","ranges":[{"startOffset":1036,"endOffset":2622,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$commit_list_popup","ranges":[{"startOffset":2625,"endOffset":5180,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$create_branch_popup","ranges":[{"startOffset":5183,"endOffset":5721,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_folder_logic","ranges":[{"startOffset":5724,"endOffset":5879,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_confirm","ranges":[{"startOffset":5882,"endOffset":8156,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_create_package","ranges":[{"startOffset":8159,"endOffset":9512,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_create_transp_branch","ranges":[{"startOffset":9515,"endOffset":10166,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_from_list","ranges":[{"startOffset":10169,"endOffset":14672,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_transports","ranges":[{"startOffset":14675,"endOffset":14832,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_transport_request","ranges":[{"startOffset":14835,"endOffset":15786,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_search_help","ranges":[{"startOffset":15789,"endOffset":16079,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_select_tr_requests","ranges":[{"startOffset":16082,"endOffset":17296,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_select_wb_tc_tr_and_tsk","ranges":[{"startOffset":17299,"endOffset":17954,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$tag_list_popup","ranges":[{"startOffset":17957,"endOffset":19189,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$popup_to_select_labels","ranges":[{"startOffset":19192,"endOffset":19482,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_popups$choose_code_insp_check_variant","ranges":[{"startOffset":19485,"endOffset":19686,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":20029,"endOffset":20284,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_no_dependency_injection","ranges":[{"startOffset":20288,"endOffset":20373,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":20376,"endOffset":20489,"count":0}],"isBlockCoverage":false},{"functionName":"no_injection","ranges":[{"startOffset":20492,"endOffset":21174,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":21323,"endOffset":21633,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_simple_dependency_inject","ranges":[{"startOffset":21637,"endOffset":21722,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":21725,"endOffset":21838,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":21841,"endOffset":22254,"count":0}],"isBlockCoverage":false},{"functionName":"simple_injection","ranges":[{"startOffset":22257,"endOffset":22985,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1235","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_url.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8090,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":185,"endOffset":1280,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":1284,"endOffset":1369,"count":16}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1372,"endOffset":1485,"count":16},{"startOffset":1428,"endOffset":1464,"count":0}],"isBlockCoverage":true},{"functionName":"repo_error","ranges":[{"startOffset":1488,"endOffset":1861,"count":1},{"startOffset":1630,"endOffset":1693,"count":0},{"startOffset":1819,"endOffset":1851,"count":0}],"isBlockCoverage":true},{"functionName":"repo_host","ranges":[{"startOffset":1864,"endOffset":2240,"count":1}],"isBlockCoverage":true},{"functionName":"repo_name1","ranges":[{"startOffset":2243,"endOffset":2607,"count":1}],"isBlockCoverage":true},{"functionName":"repo_name2","ranges":[{"startOffset":2610,"endOffset":2985,"count":1}],"isBlockCoverage":true},{"functionName":"repo_name3","ranges":[{"startOffset":2988,"endOffset":3349,"count":1}],"isBlockCoverage":true},{"functionName":"repo_name4","ranges":[{"startOffset":3352,"endOffset":3715,"count":1}],"isBlockCoverage":true},{"functionName":"repo_name5","ranges":[{"startOffset":3718,"endOffset":4081,"count":1}],"isBlockCoverage":true},{"functionName":"repo_address1","ranges":[{"startOffset":4084,"endOffset":4510,"count":1}],"isBlockCoverage":true},{"functionName":"repo_address2","ranges":[{"startOffset":4513,"endOffset":4971,"count":1}],"isBlockCoverage":true},{"functionName":"repo_address3","ranges":[{"startOffset":4974,"endOffset":5397,"count":1}],"isBlockCoverage":true},{"functionName":"repo_address4","ranges":[{"startOffset":5400,"endOffset":5822,"count":1}],"isBlockCoverage":true},{"functionName":"repo_address5_dots","ranges":[{"startOffset":5825,"endOffset":6270,"count":1}],"isBlockCoverage":true},{"functionName":"repo_address6_dots_and_git","ranges":[{"startOffset":6273,"endOffset":6730,"count":1}],"isBlockCoverage":true},{"functionName":"url_validate1","ranges":[{"startOffset":6733,"endOffset":7136,"count":1},{"startOffset":6910,"endOffset":7132,"count":0}],"isBlockCoverage":true},{"functionName":"url_validate2","ranges":[{"startOffset":7139,"endOffset":7543,"count":1},{"startOffset":7317,"endOffset":7539,"count":0}],"isBlockCoverage":true},{"functionName":"url_validate3","ranges":[{"startOffset":7546,"endOffset":7946,"count":1},{"startOffset":7715,"endOffset":7778,"count":0},{"startOffset":7904,"endOffset":7936,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1236","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_user_record.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1871,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":218,"endOffset":622,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":409,"endOffset":483,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_user_record","ranges":[{"startOffset":626,"endOffset":766,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":769,"endOffset":882,"count":0}],"isBlockCoverage":false},{"functionName":"test_invalid_user","ranges":[{"startOffset":885,"endOffset":1549,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1237","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_utils.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12370,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":196,"endOffset":1762,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":372,"endOffset":419,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":501,"endOffset":548,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":635,"endOffset":701,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":791,"endOffset":888,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1230,"endOffset":1294,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_is_binary","ranges":[{"startOffset":1766,"endOffset":2123,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2126,"endOffset":2239,"count":3},{"startOffset":2182,"endOffset":2218,"count":0}],"isBlockCoverage":true},{"functionName":"class_constructor","ranges":[{"startOffset":2242,"endOffset":2320,"count":0}],"isBlockCoverage":false},{"functionName":"class_constructor","ranges":[{"startOffset":2330,"endOffset":2518,"count":1}],"isBlockCoverage":true},{"functionName":"cds_metadata_is_text","ranges":[{"startOffset":2521,"endOffset":2673,"count":1}],"isBlockCoverage":true},{"functionName":"cds_with_umlaut_is_text","ranges":[{"startOffset":2676,"endOffset":2839,"count":1}],"isBlockCoverage":true},{"functionName":"image_is_binary","ranges":[{"startOffset":2842,"endOffset":2978,"count":1}],"isBlockCoverage":true},{"functionName":"given_file","ranges":[{"startOffset":2981,"endOffset":3258,"count":2}],"isBlockCoverage":true},{"functionName":"given_image","ranges":[{"startOffset":3261,"endOffset":7978,"count":1}],"isBlockCoverage":true},{"functionName":"given_cds_metadata","ranges":[{"startOffset":7981,"endOffset":9651,"count":1}],"isBlockCoverage":true},{"functionName":"given_cds_view_with_umlaut","ranges":[{"startOffset":9654,"endOffset":11586,"count":1}],"isBlockCoverage":true},{"functionName":"when_is_binary_determined","ranges":[{"startOffset":11589,"endOffset":11743,"count":3}],"isBlockCoverage":true},{"functionName":"then_is_not_binary","ranges":[{"startOffset":11746,"endOffset":11899,"count":2}],"isBlockCoverage":true},{"functionName":"then_is_binary","ranges":[{"startOffset":11902,"endOffset":12050,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1238","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_version.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3719,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":202,"endOffset":549,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_version","ranges":[{"startOffset":553,"endOffset":638,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":641,"endOffset":754,"count":3},{"startOffset":697,"endOffset":733,"count":0}],"isBlockCoverage":true},{"functionName":"version_to_numeric","ranges":[{"startOffset":757,"endOffset":1310,"count":1}],"isBlockCoverage":true},{"functionName":"compare","ranges":[{"startOffset":1313,"endOffset":2626,"count":1}],"isBlockCoverage":true},{"functionName":"normalize","ranges":[{"startOffset":2629,"endOffset":3558,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1239","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7511,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":218,"endOffset":401,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_xml_concrete","ranges":[{"startOffset":405,"endOffset":503,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":506,"endOffset":619,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":717,"endOffset":1758,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":886,"endOffset":1032,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1426,"endOffset":1468,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1563,"endOffset":1627,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1670,"endOffset":1734,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_xml","ranges":[{"startOffset":1762,"endOffset":1997,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":2000,"endOffset":2113,"count":1},{"startOffset":2056,"endOffset":2092,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":2116,"endOffset":2241,"count":1}],"isBlockCoverage":true},{"functionName":"parse_xml","ranges":[{"startOffset":2244,"endOffset":2987,"count":0}],"isBlockCoverage":false},{"functionName":"space_leading_trailing","ranges":[{"startOffset":2990,"endOffset":3539,"count":0}],"isBlockCoverage":false},{"functionName":"render_xml","ranges":[{"startOffset":3542,"endOffset":4604,"count":0}],"isBlockCoverage":false},{"functionName":"bad_version_raises_exc","ranges":[{"startOffset":4607,"endOffset":5939,"count":1},{"startOffset":5415,"endOffset":5541,"count":0},{"startOffset":5897,"endOffset":5929,"count":0}],"isBlockCoverage":true},{"functionName":"bad_xml_raises_exc","ranges":[{"startOffset":5942,"endOffset":7351,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1240","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_input.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11258,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":272,"endOffset":698,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_xml","ranges":[{"startOffset":702,"endOffset":787,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":790,"endOffset":903,"count":2},{"startOffset":846,"endOffset":882,"count":0}],"isBlockCoverage":true},{"functionName":"input","ranges":[{"startOffset":906,"endOffset":2485,"count":1}],"isBlockCoverage":true},{"functionName":"empty","ranges":[{"startOffset":2488,"endOffset":4138,"count":0}],"isBlockCoverage":false},{"functionName":"up","ranges":[{"startOffset":4141,"endOffset":5876,"count":0}],"isBlockCoverage":false},{"functionName":"down","ranges":[{"startOffset":5879,"endOffset":7675,"count":0}],"isBlockCoverage":false},{"functionName":"read_intf","ranges":[{"startOffset":7678,"endOffset":10565,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1241","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_output.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5994,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":284,"endOffset":592,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_xml_output","ranges":[{"startOffset":596,"endOffset":681,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":684,"endOffset":797,"count":0}],"isBlockCoverage":false},{"functionName":"add_simple_object","ranges":[{"startOffset":800,"endOffset":2639,"count":0}],"isBlockCoverage":false},{"functionName":"render_xml_string","ranges":[{"startOffset":2642,"endOffset":5555,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1242","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_pretty.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4115,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":206,"endOffset":966,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":383,"endOffset":511,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test","ranges":[{"startOffset":970,"endOffset":1187,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1190,"endOffset":1303,"count":0}],"isBlockCoverage":false},{"functionName":"setup","ranges":[{"startOffset":1306,"endOffset":1415,"count":0}],"isBlockCoverage":false},{"functionName":"pretty1","ranges":[{"startOffset":1418,"endOffset":1839,"count":0}],"isBlockCoverage":false},{"functionName":"pretty2","ranges":[{"startOffset":1842,"endOffset":2270,"count":0}],"isBlockCoverage":false},{"functionName":"pretty3","ranges":[{"startOffset":2273,"endOffset":2728,"count":0}],"isBlockCoverage":false},{"functionName":"malformatted","ranges":[{"startOffset":2731,"endOffset":3053,"count":0}],"isBlockCoverage":false},{"functionName":"dont_ignore_error","ranges":[{"startOffset":3056,"endOffset":3470,"count":0}],"isBlockCoverage":false},{"functionName":"unpretty","ranges":[{"startOffset":3473,"endOffset":3957,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1243","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16757,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":188,"endOffset":640,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_zlib","ranges":[{"startOffset":644,"endOffset":729,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":732,"endOffset":845,"count":5},{"startOffset":788,"endOffset":824,"count":0}],"isBlockCoverage":true},{"functionName":"fixed","ranges":[{"startOffset":848,"endOffset":1717,"count":1}],"isBlockCoverage":true},{"functionName":"not_compressed","ranges":[{"startOffset":1720,"endOffset":2588,"count":1}],"isBlockCoverage":true},{"functionName":"dynamic_simple","ranges":[{"startOffset":2591,"endOffset":3617,"count":1}],"isBlockCoverage":true},{"functionName":"dynamic_another","ranges":[{"startOffset":3620,"endOffset":5109,"count":1}],"isBlockCoverage":true},{"functionName":"dynamic","ranges":[{"startOffset":5112,"endOffset":16611,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1244","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_convert.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2407,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":212,"endOffset":817,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":391,"endOffset":523,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_test","ranges":[{"startOffset":821,"endOffset":1042,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1045,"endOffset":1158,"count":3},{"startOffset":1101,"endOffset":1137,"count":0}],"isBlockCoverage":true},{"functionName":"setup","ranges":[{"startOffset":1161,"endOffset":1272,"count":3}],"isBlockCoverage":true},{"functionName":"bits_to_int","ranges":[{"startOffset":1275,"endOffset":1592,"count":1}],"isBlockCoverage":true},{"functionName":"hex_to_bits","ranges":[{"startOffset":1595,"endOffset":1931,"count":1}],"isBlockCoverage":true},{"functionName":"int_to_hex","ranges":[{"startOffset":1934,"endOffset":2245,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1245","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_huffman.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":3950,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":212,"endOffset":496,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":500,"endOffset":585,"count":2}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":588,"endOffset":701,"count":2},{"startOffset":644,"endOffset":680,"count":0}],"isBlockCoverage":true},{"functionName":"create1","ranges":[{"startOffset":704,"endOffset":1656,"count":1},{"startOffset":1332,"endOffset":1486,"count":10}],"isBlockCoverage":true},{"functionName":"create2","ranges":[{"startOffset":1659,"endOffset":3788,"count":1},{"startOffset":2288,"endOffset":2442,"count":144},{"startOffset":2681,"endOffset":2835,"count":112},{"startOffset":3073,"endOffset":3227,"count":24},{"startOffset":3464,"endOffset":3618,"count":8}],"isBlockCoverage":true}]},{"scriptId":"1246","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_stream.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2217,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":209,"endOffset":437,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":441,"endOffset":526,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":529,"endOffset":642,"count":1},{"startOffset":585,"endOffset":621,"count":0}],"isBlockCoverage":true},{"functionName":"test","ranges":[{"startOffset":645,"endOffset":2057,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1247","url":"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_ajson_error.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6334,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":280,"endOffset":685,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_error","ranges":[{"startOffset":689,"endOffset":774,"count":4}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":777,"endOffset":890,"count":4},{"startOffset":833,"endOffset":869,"count":0}],"isBlockCoverage":true},{"functionName":"raise","ranges":[{"startOffset":893,"endOffset":1880,"count":1},{"startOffset":1501,"endOffset":1564,"count":0},{"startOffset":1838,"endOffset":1870,"count":0}],"isBlockCoverage":true},{"functionName":"raise_w_location","ranges":[{"startOffset":1883,"endOffset":2618,"count":1},{"startOffset":2206,"endOffset":2269,"count":0},{"startOffset":2576,"endOffset":2608,"count":0}],"isBlockCoverage":true},{"functionName":"raise_w_node","ranges":[{"startOffset":2621,"endOffset":4197,"count":1},{"startOffset":3782,"endOffset":3845,"count":0},{"startOffset":4155,"endOffset":4187,"count":0}],"isBlockCoverage":true},{"functionName":"set_location","ranges":[{"startOffset":4200,"endOffset":6171,"count":1},{"startOffset":4519,"endOffset":4582,"count":0},{"startOffset":5247,"endOffset":5279,"count":0},{"startOffset":5402,"endOffset":5465,"count":0},{"startOffset":6129,"endOffset":6161,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1248","url":"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_exception.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":43170,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":276,"endOffset":4069,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":452,"endOffset":578,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":660,"endOffset":1328,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1414,"endOffset":1608,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1814,"endOffset":1856,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":1964,"endOffset":2006,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2117,"endOffset":2485,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":2613,"endOffset":2711,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3045,"endOffset":3087,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3207,"endOffset":3249,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3370,"endOffset":3468,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3567,"endOffset":3631,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":3677,"endOffset":4045,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_base","ranges":[{"startOffset":4073,"endOffset":5010,"count":16}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":5013,"endOffset":5126,"count":16},{"startOffset":5069,"endOffset":5105,"count":0}],"isBlockCoverage":true},{"functionName":"get_t100_text","ranges":[{"startOffset":5129,"endOffset":5204,"count":8}],"isBlockCoverage":true},{"functionName":"get_t100_text","ranges":[{"startOffset":5214,"endOffset":6037,"count":8}],"isBlockCoverage":true},{"functionName":"given_the_text","ranges":[{"startOffset":6040,"endOffset":6221,"count":5}],"isBlockCoverage":true},{"functionName":"given_the_longtext","ranges":[{"startOffset":6224,"endOffset":6433,"count":5}],"isBlockCoverage":true},{"functionName":"given_the_t100_message","ranges":[{"startOffset":6436,"endOffset":6977,"count":9}],"isBlockCoverage":true},{"functionName":"given_the_previous_exception","ranges":[{"startOffset":6980,"endOffset":7318,"count":2}],"isBlockCoverage":true},{"functionName":"when_instantiated_using_raise","ranges":[{"startOffset":7321,"endOffset":7819,"count":5},{"startOffset":7560,"endOffset":7623,"count":0},{"startOffset":7777,"endOffset":7809,"count":0}],"isBlockCoverage":true},{"functionName":"when_instan_using_raise_t100","ranges":[{"startOffset":7822,"endOffset":8625,"count":9},{"startOffset":8366,"endOffset":8429,"count":0},{"startOffset":8583,"endOffset":8615,"count":0}],"isBlockCoverage":true},{"functionName":"when_inst_usng_raise_with_text","ranges":[{"startOffset":8628,"endOffset":9102,"count":2},{"startOffset":8843,"endOffset":8906,"count":0},{"startOffset":9060,"endOffset":9092,"count":0}],"isBlockCoverage":true},{"functionName":"then_the_text_should_equal","ranges":[{"startOffset":9105,"endOffset":9386,"count":15}],"isBlockCoverage":true},{"functionName":"then_the_longtext_should_equal","ranges":[{"startOffset":9389,"endOffset":9741,"count":5}],"isBlockCoverage":true},{"functionName":"then_the_prev_exc_should_equal","ranges":[{"startOffset":9744,"endOffset":10092,"count":2}],"isBlockCoverage":true},{"functionName":"teardown","ranges":[{"startOffset":10095,"endOffset":10199,"count":16}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10635,"endOffset":10987,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_general","ranges":[{"startOffset":10991,"endOffset":11089,"count":3}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":11092,"endOffset":11205,"count":3}],"isBlockCoverage":true},{"functionName":"direct_text","ranges":[{"startOffset":11208,"endOffset":11453,"count":1}],"isBlockCoverage":true},{"functionName":"no_text","ranges":[{"startOffset":11456,"endOffset":11724,"count":1}],"isBlockCoverage":true},{"functionName":"text_from_exception","ranges":[{"startOffset":11727,"endOffset":12496,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12609,"endOffset":16329,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":12796,"endOffset":15796,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_t100","ranges":[{"startOffset":16333,"endOffset":16489,"count":8}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":16492,"endOffset":16605,"count":8}],"isBlockCoverage":true},{"functionName":"text1","ranges":[{"startOffset":16608,"endOffset":16911,"count":1}],"isBlockCoverage":true},{"functionName":"text2","ranges":[{"startOffset":16914,"endOffset":17217,"count":1}],"isBlockCoverage":true},{"functionName":"text3","ranges":[{"startOffset":17220,"endOffset":17523,"count":1}],"isBlockCoverage":true},{"functionName":"text4","ranges":[{"startOffset":17526,"endOffset":17829,"count":1}],"isBlockCoverage":true},{"functionName":"text5","ranges":[{"startOffset":17832,"endOffset":18135,"count":1}],"isBlockCoverage":true},{"functionName":"text6","ranges":[{"startOffset":18138,"endOffset":18441,"count":1}],"isBlockCoverage":true},{"functionName":"text7","ranges":[{"startOffset":18444,"endOffset":18747,"count":1}],"isBlockCoverage":true},{"functionName":"text8","ranges":[{"startOffset":18750,"endOffset":19053,"count":1}],"isBlockCoverage":true},{"functionName":"class_setup","ranges":[{"startOffset":19056,"endOffset":19117,"count":0}],"isBlockCoverage":false},{"functionName":"class_setup","ranges":[{"startOffset":19127,"endOffset":22376,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":25494,"endOffset":25735,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_get_t100_longtext","ranges":[{"startOffset":25739,"endOffset":25824,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":25827,"endOffset":25940,"count":0}],"isBlockCoverage":false},{"functionName":"test01","ranges":[{"startOffset":25943,"endOffset":27467,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":27588,"endOffset":28627,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":27850,"endOffset":27914,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":27956,"endOffset":28308,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_split_text","ranges":[{"startOffset":28631,"endOffset":28716,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":28719,"endOffset":28832,"count":5},{"startOffset":28775,"endOffset":28811,"count":0}],"isBlockCoverage":true},{"functionName":"test_set_msg_b","ranges":[{"startOffset":28835,"endOffset":29749,"count":1}],"isBlockCoverage":true},{"functionName":"test_set_msg_c","ranges":[{"startOffset":29752,"endOffset":30666,"count":1}],"isBlockCoverage":true},{"functionName":"test_set_msg_d","ranges":[{"startOffset":30669,"endOffset":31583,"count":1}],"isBlockCoverage":true},{"functionName":"test_set_msg_e","ranges":[{"startOffset":31586,"endOffset":32500,"count":1}],"isBlockCoverage":true},{"functionName":"test_set_msg_z","ranges":[{"startOffset":32503,"endOffset":33926,"count":1}],"isBlockCoverage":true},{"functionName":"test_set_msg_vars","ranges":[{"startOffset":33929,"endOffset":34018,"count":5}],"isBlockCoverage":true},{"functionName":"test_set_msg_vars","ranges":[{"startOffset":34028,"endOffset":35173,"count":5}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":35659,"endOffset":36959,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":35854,"endOffset":36511,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_longtext","ranges":[{"startOffset":36963,"endOffset":37131,"count":5}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":37134,"endOffset":37247,"count":5}],"isBlockCoverage":true},{"functionName":"empty_longtext","ranges":[{"startOffset":37250,"endOffset":37728,"count":1}],"isBlockCoverage":true},{"functionName":"longtext","ranges":[{"startOffset":37731,"endOffset":38199,"count":1}],"isBlockCoverage":true},{"functionName":"multiline_longtext","ranges":[{"startOffset":38202,"endOffset":38698,"count":1}],"isBlockCoverage":true},{"functionName":"t100_longtext_override","ranges":[{"startOffset":38701,"endOffset":39123,"count":1}],"isBlockCoverage":true},{"functionName":"text_from_previous_exception","ranges":[{"startOffset":39126,"endOffset":39982,"count":1}],"isBlockCoverage":true},{"functionName":"class_setup","ranges":[{"startOffset":39985,"endOffset":40050,"count":0}],"isBlockCoverage":false},{"functionName":"class_setup","ranges":[{"startOffset":40060,"endOffset":42178,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1249","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_integration_git.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5077,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":231,"endOffset":458,"count":1}],"isBlockCoverage":true},{"functionName":"lcl_memory_settings","ranges":[{"startOffset":462,"endOffset":547,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":550,"endOffset":663,"count":1},{"startOffset":606,"endOffset":642,"count":0}],"isBlockCoverage":true},{"functionName":"zif_abapgit_persist_settings$modify","ranges":[{"startOffset":666,"endOffset":938,"count":0}],"isBlockCoverage":false},{"functionName":"zif_abapgit_persist_settings$read","ranges":[{"startOffset":941,"endOffset":1232,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1347,"endOffset":1581,"count":1}],"isBlockCoverage":true},{"functionName":"ltcl_test","ranges":[{"startOffset":1585,"endOffset":1670,"count":1}],"isBlockCoverage":true},{"functionName":"constructor_","ranges":[{"startOffset":1673,"endOffset":1786,"count":1},{"startOffset":1729,"endOffset":1765,"count":0}],"isBlockCoverage":true},{"functionName":"test01","ranges":[{"startOffset":1789,"endOffset":4888,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1250","url":"node:https","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":10108,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1781,"endOffset":1806,"count":1}],"isBlockCoverage":true},{"functionName":"Server","ranges":[{"startOffset":1889,"endOffset":2925,"count":0}],"isBlockCoverage":false},{"functionName":"createServer","ranges":[{"startOffset":3375,"endOffset":3467,"count":0}],"isBlockCoverage":false},{"functionName":"createConnection","ranges":[{"startOffset":3488,"endOffset":4585,"count":2},{"startOffset":3611,"endOffset":3819,"count":0},{"startOffset":3853,"endOffset":3883,"count":0},{"startOffset":3917,"endOffset":3947,"count":0},{"startOffset":4089,"endOffset":4215,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4348,"endOffset":4422,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4481,"endOffset":4559,"count":0}],"isBlockCoverage":false},{"functionName":"Agent","ranges":[{"startOffset":4936,"endOffset":5326,"count":3},{"startOffset":4998,"endOffset":5024,"count":0}],"isBlockCoverage":true},{"functionName":"getName","ranges":[{"startOffset":5697,"endOffset":7421,"count":11},{"startOffset":5858,"endOffset":5877,"count":0},{"startOffset":5918,"endOffset":5939,"count":0},{"startOffset":5992,"endOffset":6025,"count":0},{"startOffset":6069,"endOffset":6093,"count":0},{"startOffset":6133,"endOffset":6153,"count":0},{"startOffset":6193,"endOffset":6213,"count":0},{"startOffset":6282,"endOffset":6317,"count":0},{"startOffset":6403,"endOffset":6430,"count":0},{"startOffset":6477,"endOffset":6504,"count":0},{"startOffset":6551,"endOffset":6578,"count":0},{"startOffset":6629,"endOffset":6660,"count":0},{"startOffset":6700,"endOffset":6720,"count":0},{"startOffset":6787,"endOffset":6820,"count":0},{"startOffset":6866,"endOffset":6892,"count":0},{"startOffset":6936,"endOffset":6960,"count":0},{"startOffset":7024,"endOffset":7054,"count":0},{"startOffset":7107,"endOffset":7140,"count":0},{"startOffset":7184,"endOffset":7223,"count":0},{"startOffset":7280,"endOffset":7317,"count":0},{"startOffset":7370,"endOffset":7403,"count":0}],"isBlockCoverage":true},{"functionName":"_getSession","ranges":[{"startOffset":7454,"endOffset":7521,"count":2}],"isBlockCoverage":true},{"functionName":"_cacheSession","ranges":[{"startOffset":7556,"endOffset":8129,"count":4},{"startOffset":7658,"endOffset":7665,"count":0},{"startOffset":7741,"endOffset":7886,"count":2},{"startOffset":7886,"endOffset":8033,"count":0},{"startOffset":8033,"endOffset":8128,"count":2}],"isBlockCoverage":true},{"functionName":"_evictSession","ranges":[{"startOffset":8164,"endOffset":8394,"count":0}],"isBlockCoverage":false},{"functionName":"request","ranges":[{"startOffset":8534,"endOffset":9175,"count":3},{"startOffset":8718,"endOffset":8920,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":9911,"endOffset":10017,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1251","url":"node:tls","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":12642,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3611,"endOffset":3675,"count":0}],"isBlockCoverage":false},{"functionName":"cacheRootCertificates","ranges":[{"startOffset":3703,"endOffset":3797,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":3920,"endOffset":4071,"count":0}],"isBlockCoverage":false},{"functionName":"convertProtocols","ranges":[{"startOffset":4181,"endOffset":4793,"count":0}],"isBlockCoverage":false},{"functionName":"convertALPNProtocols","ranges":[{"startOffset":4826,"endOffset":5349,"count":0}],"isBlockCoverage":false},{"functionName":"unfqdn","ranges":[{"startOffset":5352,"endOffset":5434,"count":6}],"isBlockCoverage":true},{"functionName":"toLowerCase","ranges":[{"startOffset":5542,"endOffset":5636,"count":0}],"isBlockCoverage":false},{"functionName":"splitHost","ranges":[{"startOffset":5638,"endOffset":5781,"count":4}],"isBlockCoverage":true},{"functionName":"check","ranges":[{"startOffset":5783,"endOffset":7778,"count":2},{"startOffset":5906,"endOffset":5919,"count":0},{"startOffset":6017,"endOffset":6030,"count":0},{"startOffset":6144,"endOffset":6157,"count":0},{"startOffset":6552,"endOffset":6565,"count":0},{"startOffset":6717,"endOffset":6730,"count":0},{"startOffset":7136,"endOffset":7194,"count":0},{"startOffset":7242,"endOffset":7777,"count":0}],"isBlockCoverage":true},{"functionName":"isBad","ranges":[{"startOffset":6440,"endOffset":6499,"count":4}],"isBlockCoverage":true},{"functionName":"splitEscapedAltNames","ranges":[{"startOffset":8143,"endOffset":9379,"count":0}],"isBlockCoverage":false},{"functionName":"checkServerIdentity","ranges":[{"startOffset":9411,"endOffset":12024,"count":2},{"startOffset":9707,"endOffset":9745,"count":0},{"startOffset":10505,"endOffset":10522,"count":0},{"startOffset":10523,"endOffset":10545,"count":0},{"startOffset":10650,"endOffset":10914,"count":0},{"startOffset":10955,"endOffset":10982,"count":0},{"startOffset":11021,"endOffset":11035,"count":0},{"startOffset":11190,"endOffset":11204,"count":0},{"startOffset":11367,"endOffset":11424,"count":0},{"startOffset":11452,"endOffset":11535,"count":0},{"startOffset":11541,"endOffset":11868,"count":0},{"startOffset":11872,"endOffset":11932,"count":0},{"startOffset":11948,"endOffset":12022,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9833,"endOffset":10396,"count":4},{"startOffset":9974,"endOffset":10390,"count":0}],"isBlockCoverage":true},{"functionName":"wildcard","ranges":[{"startOffset":11104,"endOffset":11148,"count":2}],"isBlockCoverage":true},{"functionName":"noWildcard","ranges":[{"startOffset":11267,"endOffset":11312,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1252","url":"node:_tls_common","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":5527,"count":1}],"isBlockCoverage":false},{"functionName":"toV","ranges":[{"startOffset":1866,"endOffset":2159,"count":4},{"startOffset":1943,"endOffset":1963,"count":0},{"startOffset":1987,"endOffset":2009,"count":0},{"startOffset":2033,"endOffset":2101,"count":2},{"startOffset":2101,"endOffset":2158,"count":0}],"isBlockCoverage":true},{"functionName":"SecureContext","ranges":[{"startOffset":2239,"endOffset":3076,"count":2},{"startOffset":2359,"endOffset":2478,"count":0},{"startOffset":2502,"endOffset":2721,"count":0},{"startOffset":2972,"endOffset":3074,"count":0}],"isBlockCoverage":true},{"functionName":"createSecureContext","ranges":[{"startOffset":3078,"endOffset":3548,"count":2},{"startOffset":3134,"endOffset":3157,"count":0},{"startOffset":3323,"endOffset":3372,"count":0}],"isBlockCoverage":true},{"functionName":"translatePeerCertificate","ranges":[{"startOffset":3787,"endOffset":5435,"count":6},{"startOffset":3840,"endOffset":3852,"count":0},{"startOffset":3968,"endOffset":4005,"count":0},{"startOffset":4070,"endOffset":4148,"count":4},{"startOffset":4264,"endOffset":4303,"count":0},{"startOffset":4332,"endOffset":5421,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4541,"endOffset":5415,"count":8},{"startOffset":4629,"endOffset":5135,"count":0},{"startOffset":5233,"endOffset":5276,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1253","url":"node:internal/tls/secure-context","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":9175,"count":1}],"isBlockCoverage":false},{"functionName":"getDefaultEcdhCurve","ranges":[{"startOffset":709,"endOffset":959,"count":2},{"startOffset":947,"endOffset":956,"count":0}],"isBlockCoverage":true},{"functionName":"getDefaultCiphers","ranges":[{"startOffset":961,"endOffset":1193,"count":0}],"isBlockCoverage":false},{"functionName":"addCACerts","ranges":[{"startOffset":1195,"endOffset":1359,"count":0}],"isBlockCoverage":false},{"functionName":"setCerts","ranges":[{"startOffset":1361,"endOffset":1521,"count":0}],"isBlockCoverage":false},{"functionName":"validateKeyOrCertOption","ranges":[{"startOffset":1523,"endOffset":1802,"count":0}],"isBlockCoverage":false},{"functionName":"setKey","ranges":[{"startOffset":1804,"endOffset":2046,"count":0}],"isBlockCoverage":false},{"functionName":"processCiphers","ranges":[{"startOffset":2048,"endOffset":2879,"count":2},{"startOffset":2130,"endOffset":2152,"count":0},{"startOffset":2764,"endOffset":2784,"count":0},{"startOffset":2790,"endOffset":2837,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2259,"endOffset":2376,"count":48}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2486,"endOffset":2602,"count":48}],"isBlockCoverage":true},{"functionName":"configSecureContext","ranges":[{"startOffset":2881,"endOffset":9128,"count":2},{"startOffset":3520,"endOffset":3594,"count":0},{"startOffset":3647,"endOffset":3727,"count":0},{"startOffset":3962,"endOffset":4352,"count":0},{"startOffset":4382,"endOffset":4401,"count":0},{"startOffset":4403,"endOffset":4582,"count":0},{"startOffset":4625,"endOffset":4657,"count":0},{"startOffset":4659,"endOffset":5891,"count":0},{"startOffset":6505,"endOffset":6552,"count":0},{"startOffset":6553,"endOffset":6600,"count":0},{"startOffset":6602,"endOffset":6648,"count":0},{"startOffset":6764,"endOffset":6783,"count":0},{"startOffset":6785,"endOffset":6968,"count":0},{"startOffset":6994,"endOffset":7009,"count":0},{"startOffset":7011,"endOffset":7263,"count":0},{"startOffset":7302,"endOffset":7330,"count":0},{"startOffset":7332,"endOffset":7454,"count":0},{"startOffset":7480,"endOffset":7495,"count":0},{"startOffset":7497,"endOffset":7990,"count":0},{"startOffset":8036,"endOffset":8220,"count":0},{"startOffset":8261,"endOffset":8289,"count":0},{"startOffset":8291,"endOffset":8481,"count":0},{"startOffset":8514,"endOffset":8536,"count":0},{"startOffset":8538,"endOffset":8948,"count":0},{"startOffset":8985,"endOffset":9011,"count":0},{"startOffset":9013,"endOffset":9126,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7561,"endOffset":7841,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1254","url":"node:internal/tls/parse-cert-string","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":889,"count":1}],"isBlockCoverage":false},{"functionName":"parseCertString","ranges":[{"startOffset":285,"endOffset":844,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1255","url":"node:_tls_wrap","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":49943,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1994,"endOffset":2019,"count":1}],"isBlockCoverage":true},{"functionName":"onhandshakestart","ranges":[{"startOffset":4112,"endOffset":4895,"count":0}],"isBlockCoverage":false},{"functionName":"onhandshakedone","ranges":[{"startOffset":4897,"endOffset":5190,"count":0}],"isBlockCoverage":false},{"functionName":"loadSession","ranges":[{"startOffset":5193,"endOffset":6397,"count":0}],"isBlockCoverage":false},{"functionName":"loadSNI","ranges":[{"startOffset":6400,"endOffset":7053,"count":0}],"isBlockCoverage":false},{"functionName":"requestOCSP","ranges":[{"startOffset":7056,"endOffset":8378,"count":0}],"isBlockCoverage":false},{"functionName":"requestOCSPDone","ranges":[{"startOffset":8380,"endOffset":8575,"count":0}],"isBlockCoverage":false},{"functionName":"onnewsessionclient","ranges":[{"startOffset":8577,"endOffset":8813,"count":4},{"startOffset":8762,"endOffset":8811,"count":0}],"isBlockCoverage":true},{"functionName":"onnewsession","ranges":[{"startOffset":8815,"endOffset":9651,"count":0}],"isBlockCoverage":false},{"functionName":"onPskServerCallback","ranges":[{"startOffset":9653,"endOffset":10301,"count":0}],"isBlockCoverage":false},{"functionName":"onPskClientCallback","ranges":[{"startOffset":10303,"endOffset":11008,"count":0}],"isBlockCoverage":false},{"functionName":"onkeylog","ranges":[{"startOffset":11010,"endOffset":11101,"count":0}],"isBlockCoverage":false},{"functionName":"onocspresponse","ranges":[{"startOffset":11103,"endOffset":11219,"count":0}],"isBlockCoverage":false},{"functionName":"onerror","ranges":[{"startOffset":11221,"endOffset":12349,"count":0}],"isBlockCoverage":false},{"functionName":"initRead","ranges":[{"startOffset":12493,"endOffset":13039,"count":2},{"startOffset":12594,"endOffset":12604,"count":0},{"startOffset":12687,"endOffset":12711,"count":0},{"startOffset":12802,"endOffset":12809,"count":0},{"startOffset":12890,"endOffset":12914,"count":0},{"startOffset":12916,"endOffset":13015,"count":0}],"isBlockCoverage":true},{"functionName":"TLSSocket","ranges":[{"startOffset":13117,"endOffset":15422,"count":2},{"startOffset":13309,"endOffset":13329,"count":0},{"startOffset":13331,"endOffset":13499,"count":0},{"startOffset":13503,"endOffset":13571,"count":0},{"startOffset":13609,"endOffset":13672,"count":0},{"startOffset":14147,"endOffset":14164,"count":0},{"startOffset":14296,"endOffset":14617,"count":0},{"startOffset":14838,"endOffset":14860,"count":0},{"startOffset":15043,"endOffset":15049,"count":0},{"startOffset":15258,"endOffset":15273,"count":0},{"startOffset":15279,"endOffset":15306,"count":0}],"isBlockCoverage":true},{"functionName":"makeMethodProxy","ranges":[{"startOffset":15865,"endOffset":16040,"count":15}],"isBlockCoverage":true},{"functionName":"methodProxy","ranges":[{"startOffset":15907,"endOffset":16037,"count":8}],"isBlockCoverage":true},{"functionName":"close","ranges":[{"startOffset":16207,"endOffset":16900,"count":0}],"isBlockCoverage":false},{"functionName":"disableRenegotiation","ranges":[{"startOffset":16946,"endOffset":17019,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket._wrapHandle","ranges":[{"startOffset":17056,"endOffset":18059,"count":2},{"startOffset":17104,"endOffset":17126,"count":0},{"startOffset":17207,"endOffset":17245,"count":0},{"startOffset":17388,"endOffset":17428,"count":0},{"startOffset":17429,"endOffset":17482,"count":0},{"startOffset":17603,"endOffset":17658,"count":0}],"isBlockCoverage":true},{"functionName":"defineHandleReading","ranges":[{"startOffset":18198,"endOffset":18440,"count":2}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":18319,"endOffset":18367,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":18378,"endOffset":18432,"count":0}],"isBlockCoverage":false},{"functionName":"onSocketCloseDestroySSL","ranges":[{"startOffset":18442,"endOffset":18589,"count":0}],"isBlockCoverage":false},{"functionName":"destroySSL","ranges":[{"startOffset":18591,"endOffset":18642,"count":0}],"isBlockCoverage":false},{"functionName":"_destroySSL","ranges":[{"startOffset":18678,"endOffset":18970,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket._init","ranges":[{"startOffset":19109,"endOffset":23837,"count":2},{"startOffset":19276,"endOffset":19286,"count":0},{"startOffset":19489,"endOffset":19509,"count":0},{"startOffset":19673,"endOffset":19694,"count":0},{"startOffset":20237,"endOffset":20829,"count":0},{"startOffset":21049,"endOffset":21081,"count":0},{"startOffset":21595,"endOffset":22138,"count":0},{"startOffset":22321,"endOffset":22349,"count":0},{"startOffset":22350,"endOffset":22458,"count":0},{"startOffset":22460,"endOffset":22589,"count":0},{"startOffset":22620,"endOffset":22796,"count":0},{"startOffset":22824,"endOffset":22848,"count":0},{"startOffset":22850,"endOffset":23255,"count":0},{"startOffset":23298,"endOffset":23361,"count":0},{"startOffset":23399,"endOffset":23672,"count":0},{"startOffset":23714,"endOffset":23775,"count":0}],"isBlockCoverage":true},{"functionName":"keylogNewListener","ranges":[{"startOffset":19884,"endOffset":20211,"count":45},{"startOffset":19961,"endOffset":20210,"count":0}],"isBlockCoverage":true},{"functionName":"ssl.onhandshakedone","ranges":[{"startOffset":20896,"endOffset":20974,"count":2}],"isBlockCoverage":true},{"functionName":"newListener","ranges":[{"startOffset":21236,"endOffset":21572,"count":8},{"startOffset":21305,"endOffset":21312,"count":6},{"startOffset":21312,"endOffset":21399,"count":2},{"startOffset":21399,"endOffset":21406,"count":0},{"startOffset":21406,"endOffset":21571,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":21828,"endOffset":22132,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":23594,"endOffset":23666,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":23737,"endOffset":23769,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket.renegotiate","ranges":[{"startOffset":23874,"endOffset":25108,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket.exportKeyingMaterial","ranges":[{"startOffset":25154,"endOffset":25476,"count":0}],"isBlockCoverage":false},{"functionName":"setMaxSendFragment","ranges":[{"startOffset":25520,"endOffset":25642,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket._handleTimeout","ranges":[{"startOffset":25682,"endOffset":25751,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket._emitTLSError","ranges":[{"startOffset":25790,"endOffset":25876,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket._tlsError","ranges":[{"startOffset":25911,"endOffset":26019,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket._releaseControl","ranges":[{"startOffset":26060,"endOffset":26216,"count":2},{"startOffset":26106,"endOffset":26119,"count":0}],"isBlockCoverage":true},{"functionName":"TLSSocket._finishInit","ranges":[{"startOffset":26253,"endOffset":27312,"count":2},{"startOffset":26733,"endOffset":26740,"count":0},{"startOffset":27030,"endOffset":27040,"count":0},{"startOffset":27247,"endOffset":27287,"count":0}],"isBlockCoverage":true},{"functionName":"TLSSocket._start","ranges":[{"startOffset":27344,"endOffset":27843,"count":2},{"startOffset":27412,"endOffset":27422,"count":0},{"startOffset":27594,"endOffset":27650,"count":0},{"startOffset":27741,"endOffset":27748,"count":0},{"startOffset":27790,"endOffset":27817,"count":0}],"isBlockCoverage":true},{"functionName":"TLSSocket.setServername","ranges":[{"startOffset":27882,"endOffset":28050,"count":2},{"startOffset":27965,"endOffset":28011,"count":0}],"isBlockCoverage":true},{"functionName":"TLSSocket.setSession","ranges":[{"startOffset":28086,"endOffset":28224,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket.getPeerCertificate","ranges":[{"startOffset":28268,"endOffset":28432,"count":2},{"startOffset":28404,"endOffset":28409,"count":0},{"startOffset":28414,"endOffset":28431,"count":0}],"isBlockCoverage":true},{"functionName":"TLSSocket.getCertificate","ranges":[{"startOffset":28472,"endOffset":28678,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket.getPeerX509Certificate","ranges":[{"startOffset":28726,"endOffset":28866,"count":0}],"isBlockCoverage":false},{"functionName":"TLSSocket.getX509Certificate","ranges":[{"startOffset":28910,"endOffset":29038,"count":0}],"isBlockCoverage":false},{"functionName":"makeSocketMethodProxy","ranges":[{"startOffset":29075,"endOffset":29273,"count":10}],"isBlockCoverage":true},{"functionName":"socketMethodProxy","ranges":[{"startOffset":29123,"endOffset":29270,"count":4},{"startOffset":29249,"endOffset":29269,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":29491,"endOffset":29569,"count":10}],"isBlockCoverage":true},{"functionName":"onServerSocketSecure","ranges":[{"startOffset":29611,"endOffset":30106,"count":0}],"isBlockCoverage":false},{"functionName":"onSocketTLSError","ranges":[{"startOffset":30108,"endOffset":30344,"count":0}],"isBlockCoverage":false},{"functionName":"onSocketKeylog","ranges":[{"startOffset":30346,"endOffset":30433,"count":0}],"isBlockCoverage":false},{"functionName":"onSocketClose","ranges":[{"startOffset":30435,"endOffset":30788,"count":0}],"isBlockCoverage":false},{"functionName":"tlsConnectionListener","ranges":[{"startOffset":30790,"endOffset":31639,"count":0}],"isBlockCoverage":false},{"functionName":"Server","ranges":[{"startOffset":34405,"endOffset":36249,"count":0}],"isBlockCoverage":false},{"functionName":"createServer","ranges":[{"startOffset":36403,"endOffset":36487,"count":0}],"isBlockCoverage":false},{"functionName":"Server.setSecureContext","ranges":[{"startOffset":36527,"endOffset":39430,"count":0}],"isBlockCoverage":false},{"functionName":"Server._getServerData","ranges":[{"startOffset":39468,"endOffset":39551,"count":0}],"isBlockCoverage":false},{"functionName":"Server._setServerData","ranges":[{"startOffset":39589,"endOffset":39666,"count":0}],"isBlockCoverage":false},{"functionName":"getTicketKeys","ranges":[{"startOffset":39703,"endOffset":39783,"count":0}],"isBlockCoverage":false},{"functionName":"setTicketKeys","ranges":[{"startOffset":39820,"endOffset":40016,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":40060,"endOffset":42126,"count":0}],"isBlockCoverage":false},{"functionName":"Server.addContext","ranges":[{"startOffset":42249,"endOffset":42624,"count":0}],"isBlockCoverage":false},{"functionName":"Server.","ranges":[{"startOffset":42673,"endOffset":42928,"count":0}],"isBlockCoverage":false},{"functionName":"SNICallback","ranges":[{"startOffset":42931,"endOffset":43247,"count":0}],"isBlockCoverage":false},{"functionName":"normalizeConnectArgs","ranges":[{"startOffset":43480,"endOffset":44208,"count":2},{"startOffset":44007,"endOffset":44052,"count":0},{"startOffset":44119,"endOffset":44164,"count":0},{"startOffset":44178,"endOffset":44193,"count":0}],"isBlockCoverage":true},{"functionName":"onConnectSecure","ranges":[{"startOffset":44210,"endOffset":46513,"count":2},{"startOffset":44447,"endOffset":44483,"count":0},{"startOffset":44485,"endOffset":44641,"count":0},{"startOffset":44901,"endOffset":44935,"count":0},{"startOffset":44936,"endOffset":44998,"count":0},{"startOffset":44999,"endOffset":45032,"count":0},{"startOffset":45169,"endOffset":46138,"count":0},{"startOffset":46436,"endOffset":46466,"count":0}],"isBlockCoverage":true},{"functionName":"onConnectEnd","ranges":[{"startOffset":46515,"endOffset":47064,"count":0}],"isBlockCoverage":false},{"functionName":"connect","ranges":[{"startOffset":47130,"endOffset":49941,"count":2},{"startOffset":47509,"endOffset":47534,"count":0},{"startOffset":48955,"endOffset":48989,"count":0},{"startOffset":49183,"endOffset":49233,"count":0},{"startOffset":49343,"endOffset":49379,"count":0},{"startOffset":49470,"endOffset":49734,"count":0},{"startOffset":49813,"endOffset":49830,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1256","url":"node:internal/js_stream_socket","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7488,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":335,"endOffset":364,"count":0}],"isBlockCoverage":false},{"functionName":"isClosing","ranges":[{"startOffset":693,"endOffset":756,"count":0}],"isBlockCoverage":false},{"functionName":"onreadstart","ranges":[{"startOffset":758,"endOffset":823,"count":0}],"isBlockCoverage":false},{"functionName":"onreadstop","ranges":[{"startOffset":825,"endOffset":888,"count":0}],"isBlockCoverage":false},{"functionName":"onshutdown","ranges":[{"startOffset":890,"endOffset":961,"count":0}],"isBlockCoverage":false},{"functionName":"onwrite","ranges":[{"startOffset":963,"endOffset":1040,"count":0}],"isBlockCoverage":false},{"functionName":"JSStreamSocket","ranges":[{"startOffset":1800,"endOffset":3495,"count":0}],"isBlockCoverage":false},{"functionName":"get StreamWrap","ranges":[{"startOffset":3635,"endOffset":3684,"count":0}],"isBlockCoverage":false},{"functionName":"isClosing","ranges":[{"startOffset":3688,"endOffset":3750,"count":0}],"isBlockCoverage":false},{"functionName":"readStart","ranges":[{"startOffset":3754,"endOffset":3811,"count":0}],"isBlockCoverage":false},{"functionName":"readStop","ranges":[{"startOffset":3815,"endOffset":3870,"count":0}],"isBlockCoverage":false},{"functionName":"doShutdown","ranges":[{"startOffset":3874,"endOffset":4870,"count":0}],"isBlockCoverage":false},{"functionName":"finishShutdown","ranges":[{"startOffset":4938,"endOffset":5230,"count":0}],"isBlockCoverage":false},{"functionName":"doWrite","ranges":[{"startOffset":5234,"endOffset":6195,"count":0}],"isBlockCoverage":false},{"functionName":"finishWrite","ranges":[{"startOffset":6263,"endOffset":6706,"count":0}],"isBlockCoverage":false},{"functionName":"doClose","ranges":[{"startOffset":6710,"endOffset":7451,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1257","url":"node:internal/tls/secure-pair","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1990,"count":1}],"isBlockCoverage":false},{"functionName":"DuplexSocket","ranges":[{"startOffset":398,"endOffset":487,"count":0}],"isBlockCoverage":false},{"functionName":"_read","ranges":[{"startOffset":491,"endOffset":616,"count":0}],"isBlockCoverage":false},{"functionName":"_write","ranges":[{"startOffset":620,"endOffset":824,"count":0}],"isBlockCoverage":false},{"functionName":"_final","ranges":[{"startOffset":828,"endOffset":925,"count":0}],"isBlockCoverage":false},{"functionName":"DuplexPair","ranges":[{"startOffset":950,"endOffset":1137,"count":0}],"isBlockCoverage":false},{"functionName":"SecurePair","ranges":[{"startOffset":1183,"endOffset":1795,"count":0}],"isBlockCoverage":false},{"functionName":"destroy","ranges":[{"startOffset":1799,"endOffset":1874,"count":0}],"isBlockCoverage":false},{"functionName":"createSecurePair","ranges":[{"startOffset":1905,"endOffset":1988,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1258","url":"node:_http_agent","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":16690,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1693,"endOffset":1718,"count":1}],"isBlockCoverage":true},{"functionName":"ReusedHandle","ranges":[{"startOffset":2749,"endOffset":2828,"count":1}],"isBlockCoverage":true},{"functionName":"freeSocketErrorListener","ranges":[{"startOffset":2832,"endOffset":3011,"count":0}],"isBlockCoverage":false},{"functionName":"Agent","ranges":[{"startOffset":3013,"endOffset":6348,"count":4},{"startOffset":3075,"endOffset":3101,"count":0},{"startOffset":3573,"endOffset":3581,"count":2},{"startOffset":3627,"endOffset":3653,"count":2},{"startOffset":3964,"endOffset":4217,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4285,"endOffset":6231,"count":3},{"startOffset":4648,"endOffset":4693,"count":0},{"startOffset":4754,"endOffset":4772,"count":0},{"startOffset":4774,"endOffset":5310,"count":0},{"startOffset":5527,"endOffset":5572,"count":0},{"startOffset":5936,"endOffset":5981,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4998,"endOffset":5098,"count":0}],"isBlockCoverage":false},{"functionName":"maybeEnableKeylog","ranges":[{"startOffset":6456,"endOffset":6981,"count":0}],"isBlockCoverage":false},{"functionName":"getName","ranges":[{"startOffset":7154,"endOffset":7652,"count":11},{"startOffset":7223,"endOffset":7237,"count":0},{"startOffset":7349,"endOffset":7378,"count":0},{"startOffset":7540,"endOffset":7569,"count":0},{"startOffset":7601,"endOffset":7634,"count":0}],"isBlockCoverage":true},{"functionName":"addRequest","ranges":[{"startOffset":7684,"endOffset":9846,"count":3},{"startOffset":7907,"endOffset":8010,"count":0},{"startOffset":8104,"endOffset":8138,"count":0},{"startOffset":8437,"endOffset":8736,"count":1},{"startOffset":8498,"endOffset":8545,"count":0},{"startOffset":8586,"endOffset":8626,"count":0},{"startOffset":8768,"endOffset":8788,"count":1},{"startOffset":8789,"endOffset":8792,"count":2},{"startOffset":8864,"endOffset":9027,"count":1},{"startOffset":9027,"endOffset":9844,"count":2},{"startOffset":9397,"endOffset":9844,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9261,"endOffset":9391,"count":2},{"startOffset":9303,"endOffset":9329,"count":0}],"isBlockCoverage":true},{"functionName":"createSocket","ranges":[{"startOffset":9880,"endOffset":10974,"count":2},{"startOffset":10014,"endOffset":10048,"count":0},{"startOffset":10076,"endOffset":10104,"count":0},{"startOffset":10110,"endOffset":10165,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10330,"endOffset":10661,"count":2},{"startOffset":10363,"endOffset":10378,"count":0},{"startOffset":10408,"endOffset":10446,"count":0}],"isBlockCoverage":true},{"functionName":"calculateServerName","ranges":[{"startOffset":10977,"endOffset":11797,"count":3},{"startOffset":11312,"endOffset":11592,"count":0},{"startOffset":11758,"endOffset":11774,"count":0}],"isBlockCoverage":true},{"functionName":"installListeners","ranges":[{"startOffset":11799,"endOffset":13286,"count":2},{"startOffset":13241,"endOffset":13284,"count":0}],"isBlockCoverage":true},{"functionName":"onFree","ranges":[{"startOffset":11848,"endOffset":11942,"count":3}],"isBlockCoverage":true},{"functionName":"onClose","ranges":[{"startOffset":11970,"endOffset":12293,"count":0}],"isBlockCoverage":false},{"functionName":"onTimeout","ranges":[{"startOffset":12323,"endOffset":12667,"count":0}],"isBlockCoverage":false},{"functionName":"onRemove","ranges":[{"startOffset":12701,"endOffset":13182,"count":0}],"isBlockCoverage":false},{"functionName":"removeSocket","ranges":[{"startOffset":13319,"endOffset":15120,"count":3},{"startOffset":13575,"endOffset":13618,"count":0},{"startOffset":14013,"endOffset":14042,"count":0},{"startOffset":14044,"endOffset":14141,"count":0},{"startOffset":14466,"endOffset":14818,"count":0},{"startOffset":14834,"endOffset":14844,"count":0},{"startOffset":14846,"endOffset":15117,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":14997,"endOffset":15111,"count":0}],"isBlockCoverage":false},{"functionName":"keepSocketAlive","ranges":[{"startOffset":15157,"endOffset":15410,"count":3},{"startOffset":15350,"endOffset":15392,"count":2}],"isBlockCoverage":true},{"functionName":"reuseSocket","ranges":[{"startOffset":15443,"endOffset":15611,"count":1}],"isBlockCoverage":true},{"functionName":"destroy","ranges":[{"startOffset":15640,"endOffset":15989,"count":0}],"isBlockCoverage":false},{"functionName":"setRequestSocket","ranges":[{"startOffset":15992,"endOffset":16233,"count":3},{"startOffset":16147,"endOffset":16178,"count":0},{"startOffset":16197,"endOffset":16232,"count":0}],"isBlockCoverage":true},{"functionName":"asyncResetHandle","ranges":[{"startOffset":16235,"endOffset":16630,"count":1}],"isBlockCoverage":true}]},{"scriptId":"1259","url":"node:_http_server","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":34043,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2622,"endOffset":2647,"count":0}],"isBlockCoverage":false},{"functionName":"HTTPServerAsyncResource","ranges":[{"startOffset":6867,"endOffset":6946,"count":0}],"isBlockCoverage":false},{"functionName":"ServerResponse","ranges":[{"startOffset":6950,"endOffset":7851,"count":0}],"isBlockCoverage":false},{"functionName":"_finish","ranges":[{"startOffset":8018,"endOffset":8707,"count":0}],"isBlockCoverage":false},{"functionName":"onServerResponseClose","ranges":[{"startOffset":8807,"endOffset":9872,"count":0}],"isBlockCoverage":false},{"functionName":"assignSocket","ranges":[{"startOffset":9914,"endOffset":10126,"count":0}],"isBlockCoverage":false},{"functionName":"detachSocket","ranges":[{"startOffset":10169,"endOffset":10351,"count":0}],"isBlockCoverage":false},{"functionName":"writeContinue","ranges":[{"startOffset":10395,"endOffset":10513,"count":0}],"isBlockCoverage":false},{"functionName":"writeProcessing","ranges":[{"startOffset":10559,"endOffset":10657,"count":0}],"isBlockCoverage":false},{"functionName":"_implicitHeader","ranges":[{"startOffset":10703,"endOffset":10768,"count":0}],"isBlockCoverage":false},{"functionName":"writeHead","ranges":[{"startOffset":10819,"endOffset":13414,"count":0}],"isBlockCoverage":false},{"functionName":"storeHTTPOptions","ranges":[{"startOffset":13525,"endOffset":14096,"count":0}],"isBlockCoverage":false},{"functionName":"Server","ranges":[{"startOffset":14098,"endOffset":15346,"count":0}],"isBlockCoverage":false},{"functionName":"setTimeout","ranges":[{"startOffset":15483,"endOffset":15612,"count":0}],"isBlockCoverage":false},{"functionName":"Server.","ranges":[{"startOffset":15661,"endOffset":16229,"count":0}],"isBlockCoverage":false},{"functionName":"connectionListener","ranges":[{"startOffset":16232,"endOffset":16376,"count":0}],"isBlockCoverage":false},{"functionName":"connectionListenerInternal","ranges":[{"startOffset":16378,"endOffset":20266,"count":0}],"isBlockCoverage":false},{"functionName":"socketSetEncoding","ranges":[{"startOffset":20268,"endOffset":20340,"count":0}],"isBlockCoverage":false},{"functionName":"updateOutgoingData","ranges":[{"startOffset":20342,"endOffset":20458,"count":0}],"isBlockCoverage":false},{"functionName":"socketOnDrain","ranges":[{"startOffset":20460,"endOffset":20914,"count":0}],"isBlockCoverage":false},{"functionName":"socketOnTimeout","ranges":[{"startOffset":20916,"endOffset":21289,"count":0}],"isBlockCoverage":false},{"functionName":"socketOnClose","ranges":[{"startOffset":21291,"endOffset":21440,"count":0}],"isBlockCoverage":false},{"functionName":"abortIncoming","ranges":[{"startOffset":21442,"endOffset":21625,"count":0}],"isBlockCoverage":false},{"functionName":"socketOnEnd","ranges":[{"startOffset":21627,"endOffset":22149,"count":0}],"isBlockCoverage":false},{"functionName":"socketOnData","ranges":[{"startOffset":22151,"endOffset":22380,"count":0}],"isBlockCoverage":false},{"functionName":"onRequestTimeout","ranges":[{"startOffset":22382,"endOffset":22595,"count":0}],"isBlockCoverage":false},{"functionName":"onParserExecute","ranges":[{"startOffset":22597,"endOffset":23096,"count":0}],"isBlockCoverage":false},{"functionName":"onParserTimeout","ranges":[{"startOffset":23098,"endOffset":23243,"count":0}],"isBlockCoverage":false},{"functionName":"noop","ranges":[{"startOffset":23258,"endOffset":23266,"count":0}],"isBlockCoverage":false},{"functionName":"socketOnError","ranges":[{"startOffset":23667,"endOffset":24302,"count":0}],"isBlockCoverage":false},{"functionName":"onParserExecuteCommon","ranges":[{"startOffset":24304,"endOffset":26250,"count":0}],"isBlockCoverage":false},{"functionName":"clearIncoming","ranges":[{"startOffset":26252,"endOffset":26590,"count":0}],"isBlockCoverage":false},{"functionName":"setRequestTimeout","ranges":[{"startOffset":26592,"endOffset":26924,"count":0}],"isBlockCoverage":false},{"functionName":"clearRequestTimeout","ranges":[{"startOffset":26926,"endOffset":27161,"count":0}],"isBlockCoverage":false},{"functionName":"resOnFinish","ranges":[{"startOffset":27163,"endOffset":28825,"count":0}],"isBlockCoverage":false},{"functionName":"emitCloseNT","ranges":[{"startOffset":28827,"endOffset":28927,"count":0}],"isBlockCoverage":false},{"functionName":"parserOnIncoming","ranges":[{"startOffset":29093,"endOffset":32235,"count":0}],"isBlockCoverage":false},{"functionName":"resetSocketTimeout","ranges":[{"startOffset":32237,"endOffset":32417,"count":0}],"isBlockCoverage":false},{"functionName":"onSocketResume","ranges":[{"startOffset":32419,"endOffset":32941,"count":0}],"isBlockCoverage":false},{"functionName":"onSocketPause","ranges":[{"startOffset":32943,"endOffset":33084,"count":0}],"isBlockCoverage":false},{"functionName":"unconsume","ranges":[{"startOffset":33086,"endOffset":33338,"count":0}],"isBlockCoverage":false},{"functionName":"generateSocketListenerWrapper","ranges":[{"startOffset":33340,"endOffset":33894,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1260","url":"node:_http_common","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":8410,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1673,"endOffset":1698,"count":1}],"isBlockCoverage":true},{"functionName":"parserOnHeaders","ranges":[{"startOffset":2439,"endOffset":2686,"count":0}],"isBlockCoverage":false},{"functionName":"parserOnHeadersComplete","ranges":[{"startOffset":2899,"endOffset":4481,"count":3},{"startOffset":3185,"endOffset":3247,"count":0},{"startOffset":3423,"endOffset":3490,"count":0},{"startOffset":4248,"endOffset":4311,"count":0}],"isBlockCoverage":true},{"functionName":"parserOnBody","ranges":[{"startOffset":4483,"endOffset":4800,"count":8},{"startOffset":4629,"endOffset":4636,"count":0},{"startOffset":4772,"endOffset":4794,"count":0}],"isBlockCoverage":true},{"functionName":"parserOnMessageComplete","ranges":[{"startOffset":4802,"endOffset":5289,"count":3},{"startOffset":5045,"endOffset":5159,"count":0}],"isBlockCoverage":true},{"functionName":"parsersCb","ranges":[{"startOffset":5338,"endOffset":5626,"count":1}],"isBlockCoverage":true},{"functionName":"closeParserInstance","ranges":[{"startOffset":5630,"endOffset":5686,"count":0}],"isBlockCoverage":false},{"functionName":"freeParser","ranges":[{"startOffset":6009,"endOffset":6613,"count":3},{"startOffset":6100,"endOffset":6119,"count":0},{"startOffset":6185,"endOffset":6363,"count":0}],"isBlockCoverage":true},{"functionName":"checkIsHttpToken","ranges":[{"startOffset":6825,"endOffset":6916,"count":18}],"isBlockCoverage":true},{"functionName":"checkInvalidHeaderChar","ranges":[{"startOffset":7178,"endOffset":7279,"count":15}],"isBlockCoverage":true},{"functionName":"cleanParser","ranges":[{"startOffset":7281,"endOffset":7625,"count":4}],"isBlockCoverage":true},{"functionName":"prepareError","ranges":[{"startOffset":7627,"endOffset":7820,"count":0}],"isBlockCoverage":false},{"functionName":"isLenient","ranges":[{"startOffset":7850,"endOffset":8035,"count":3},{"startOffset":7898,"endOffset":7915,"count":0},{"startOffset":7917,"endOffset":8004,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1261","url":"node:internal/freelist","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":476,"count":1}],"isBlockCoverage":false},{"functionName":"FreeList","ranges":[{"startOffset":76,"endOffset":194,"count":1}],"isBlockCoverage":true},{"functionName":"alloc","ranges":[{"startOffset":198,"endOffset":317,"count":3},{"startOffset":240,"endOffset":263,"count":2},{"startOffset":264,"endOffset":312,"count":1}],"isBlockCoverage":true},{"functionName":"free","ranges":[{"startOffset":321,"endOffset":445,"count":3},{"startOffset":423,"endOffset":444,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1262","url":"node:_http_incoming","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14393,"count":1}],"isBlockCoverage":false},{"functionName":"readStart","ranges":[{"startOffset":1647,"endOffset":1750,"count":12}],"isBlockCoverage":true},{"functionName":"readStop","ranges":[{"startOffset":1752,"endOffset":1815,"count":0}],"isBlockCoverage":false},{"functionName":"IncomingMessage","ranges":[{"startOffset":1881,"endOffset":2827,"count":3}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":3037,"endOffset":3077,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":3086,"endOffset":3128,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":3221,"endOffset":3518,"count":3},{"startOffset":3414,"endOffset":3481,"count":33}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":3527,"endOffset":3572,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":3673,"endOffset":4010,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":4019,"endOffset":4072,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":4166,"endOffset":4469,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":4478,"endOffset":4524,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":4626,"endOffset":4969,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":4978,"endOffset":5032,"count":0}],"isBlockCoverage":false},{"functionName":"setTimeout","ranges":[{"startOffset":5077,"endOffset":5215,"count":0}],"isBlockCoverage":false},{"functionName":"_read","ranges":[{"startOffset":5694,"endOffset":6071,"count":9},{"startOffset":5738,"endOffset":5816,"count":3}],"isBlockCoverage":true},{"functionName":"_destroy","ranges":[{"startOffset":6314,"endOffset":6994,"count":3},{"startOffset":6388,"endOffset":6444,"count":0},{"startOffset":6764,"endOffset":6789,"count":0},{"startOffset":6790,"endOffset":6805,"count":0},{"startOffset":6807,"endOffset":6953,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6881,"endOffset":6947,"count":0}],"isBlockCoverage":false},{"functionName":"_addHeaderLines","ranges":[{"startOffset":7058,"endOffset":7517,"count":3},{"startOffset":7169,"endOffset":7272,"count":0},{"startOffset":7394,"endOffset":7511,"count":0}],"isBlockCoverage":true},{"functionName":"matchKnownFields","ranges":[{"startOffset":8239,"endOffset":12133,"count":45},{"startOffset":8316,"endOffset":8396,"count":0},{"startOffset":8401,"endOffset":8748,"count":6},{"startOffset":8457,"endOffset":8471,"count":0},{"startOffset":8520,"endOffset":8534,"count":0},{"startOffset":8583,"endOffset":8597,"count":0},{"startOffset":8625,"endOffset":8644,"count":3},{"startOffset":8646,"endOffset":8694,"count":3},{"startOffset":8694,"endOffset":8713,"count":0},{"startOffset":8715,"endOffset":8735,"count":3},{"startOffset":8735,"endOffset":8748,"count":0},{"startOffset":8753,"endOffset":9142,"count":9},{"startOffset":8790,"endOffset":8811,"count":6},{"startOffset":8813,"endOffset":8829,"count":3},{"startOffset":8829,"endOffset":8880,"count":6},{"startOffset":8882,"endOffset":8904,"count":0},{"startOffset":8904,"endOffset":8955,"count":6},{"startOffset":8957,"endOffset":8979,"count":0},{"startOffset":8979,"endOffset":9030,"count":6},{"startOffset":9032,"endOffset":9054,"count":0},{"startOffset":9054,"endOffset":9105,"count":6},{"startOffset":9107,"endOffset":9129,"count":0},{"startOffset":9129,"endOffset":9142,"count":6},{"startOffset":9147,"endOffset":9389,"count":3},{"startOffset":9209,"endOffset":9226,"count":0},{"startOffset":9298,"endOffset":9351,"count":0},{"startOffset":9353,"endOffset":9389,"count":0},{"startOffset":9394,"endOffset":9586,"count":0},{"startOffset":9591,"endOffset":9881,"count":0},{"startOffset":9886,"endOffset":9999,"count":0},{"startOffset":10004,"endOffset":10215,"count":3},{"startOffset":10048,"endOffset":10075,"count":0},{"startOffset":10107,"endOffset":10170,"count":0},{"startOffset":10180,"endOffset":10215,"count":0},{"startOffset":10220,"endOffset":10645,"count":3},{"startOffset":10303,"endOffset":10326,"count":0},{"startOffset":10401,"endOffset":10424,"count":0},{"startOffset":10461,"endOffset":10489,"count":0},{"startOffset":10528,"endOffset":10593,"count":0},{"startOffset":10603,"endOffset":10645,"count":0},{"startOffset":10650,"endOffset":10772,"count":0},{"startOffset":10777,"endOffset":11128,"count":6},{"startOffset":10864,"endOffset":10895,"count":0},{"startOffset":10974,"endOffset":11005,"count":0},{"startOffset":11084,"endOffset":11115,"count":0},{"startOffset":11133,"endOffset":11380,"count":0},{"startOffset":11385,"endOffset":11748,"count":3},{"startOffset":11476,"endOffset":11503,"count":0},{"startOffset":11544,"endOffset":11576,"count":0},{"startOffset":11619,"endOffset":11692,"count":0},{"startOffset":11702,"endOffset":11748,"count":0},{"startOffset":11753,"endOffset":12006,"count":6},{"startOffset":11848,"endOffset":11877,"count":0},{"startOffset":11964,"endOffset":11993,"count":0},{"startOffset":12010,"endOffset":12029,"count":24},{"startOffset":12029,"endOffset":12132,"count":12}],"isBlockCoverage":true},{"functionName":"_addHeaderLine","ranges":[{"startOffset":12744,"endOffset":13442,"count":33},{"startOffset":12894,"endOffset":12907,"count":9},{"startOffset":12909,"endOffset":13133,"count":24},{"startOffset":13025,"endOffset":13089,"count":0},{"startOffset":13133,"endOffset":13440,"count":9},{"startOffset":13155,"endOffset":13350,"count":0}],"isBlockCoverage":true},{"functionName":"_addHeaderLineDistinct","ranges":[{"startOffset":13519,"endOffset":13712,"count":0}],"isBlockCoverage":false},{"functionName":"_dump","ranges":[{"startOffset":13835,"endOffset":14076,"count":0}],"isBlockCoverage":false},{"functionName":"onError","ranges":[{"startOffset":14079,"endOffset":14326,"count":3},{"startOffset":14283,"endOffset":14298,"count":0}],"isBlockCoverage":true}]},{"scriptId":"1263","url":"node:_http_outgoing","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":32927,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2740,"endOffset":2765,"count":1}],"isBlockCoverage":true},{"functionName":"nop","ranges":[{"startOffset":3005,"endOffset":3013,"count":15}],"isBlockCoverage":true},{"functionName":"isCookieField","ranges":[{"startOffset":3256,"endOffset":3356,"count":0}],"isBlockCoverage":false},{"functionName":"OutgoingMessage","ranges":[{"startOffset":3358,"endOffset":4713,"count":3}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":4920,"endOffset":5062,"count":3}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":5161,"endOffset":5190,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":5285,"endOffset":5373,"count":3},{"startOffset":5335,"endOffset":5363,"count":0}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":5475,"endOffset":5564,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":5659,"endOffset":5770,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5887,"endOffset":5933,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6029,"endOffset":6514,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":6674,"endOffset":6714,"count":0}],"isBlockCoverage":false},{"functionName":"set","ranges":[{"startOffset":6723,"endOffset":6765,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6886,"endOffset":7342,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":7442,"endOffset":7892,"count":0}],"isBlockCoverage":false},{"functionName":"_renderHeaders","ranges":[{"startOffset":8010,"endOffset":8514,"count":0}],"isBlockCoverage":false},{"functionName":"OutgoingMessage.cork","ranges":[{"startOffset":8550,"endOffset":8645,"count":0}],"isBlockCoverage":false},{"functionName":"OutgoingMessage.uncork","ranges":[{"startOffset":8683,"endOffset":8799,"count":0}],"isBlockCoverage":false},{"functionName":"setTimeout","ranges":[{"startOffset":8841,"endOffset":9135,"count":0}],"isBlockCoverage":false},{"functionName":"destroy","ranges":[{"startOffset":9378,"endOffset":9663,"count":0}],"isBlockCoverage":false},{"functionName":"_send","ranges":[{"startOffset":9773,"endOffset":10699,"count":6},{"startOffset":10040,"endOffset":10064,"count":3},{"startOffset":10066,"endOffset":10646,"count":3},{"startOffset":10327,"endOffset":10368,"count":0}],"isBlockCoverage":true},{"functionName":"_getMessageBodySize","ranges":[{"startOffset":10702,"endOffset":11080,"count":0}],"isBlockCoverage":false},{"functionName":"_writeRaw","ranges":[{"startOffset":11131,"endOffset":12840,"count":6},{"startOffset":11217,"endOffset":11234,"count":0},{"startOffset":11236,"endOffset":11383,"count":0},{"startOffset":11423,"endOffset":11474,"count":0},{"startOffset":11595,"endOffset":11602,"count":0},{"startOffset":11603,"endOffset":11619,"count":0},{"startOffset":11620,"endOffset":11644,"count":0},{"startOffset":11645,"endOffset":11661,"count":0},{"startOffset":11663,"endOffset":12344,"count":0},{"startOffset":12357,"endOffset":12386,"count":0},{"startOffset":12387,"endOffset":12403,"count":0},{"startOffset":12405,"endOffset":12625,"count":0}],"isBlockCoverage":true},{"functionName":"_storeHeader","ranges":[{"startOffset":12898,"endOffset":17509,"count":3},{"startOffset":13324,"endOffset":13432,"count":15},{"startOffset":13438,"endOffset":14160,"count":0},{"startOffset":14230,"endOffset":14244,"count":0},{"startOffset":14246,"endOffset":14296,"count":0},{"startOffset":14890,"endOffset":14976,"count":0},{"startOffset":14978,"endOffset":15161,"count":0},{"startOffset":15216,"endOffset":15278,"count":0},{"startOffset":15388,"endOffset":15423,"count":2},{"startOffset":15424,"endOffset":15437,"count":2},{"startOffset":15508,"endOffset":15556,"count":0},{"startOffset":15668,"endOffset":15693,"count":0},{"startOffset":15695,"endOffset":15981,"count":0},{"startOffset":15987,"endOffset":16066,"count":0},{"startOffset":16093,"endOffset":16105,"count":2},{"startOffset":16107,"endOffset":16923,"count":2},{"startOffset":16133,"endOffset":16249,"count":0},{"startOffset":16326,"endOffset":16919,"count":0},{"startOffset":17244,"endOffset":17291,"count":0},{"startOffset":17492,"endOffset":17507,"count":0}],"isBlockCoverage":true},{"functionName":"processHeader","ranges":[{"startOffset":17511,"endOffset":18139,"count":15},{"startOffset":17591,"endOffset":17615,"count":0},{"startOffset":17643,"endOffset":18087,"count":0}],"isBlockCoverage":true},{"functionName":"storeHeader","ranges":[{"startOffset":18141,"endOffset":18340,"count":15},{"startOffset":18219,"endOffset":18251,"count":0}],"isBlockCoverage":true},{"functionName":"matchHeader","ranges":[{"startOffset":18342,"endOffset":19266,"count":15},{"startOffset":18441,"endOffset":18448,"count":0},{"startOffset":18517,"endOffset":18755,"count":0},{"startOffset":18760,"endOffset":18951,"count":0},{"startOffset":18956,"endOffset":19090,"count":1},{"startOffset":19095,"endOffset":19107,"count":0},{"startOffset":19112,"endOffset":19126,"count":0},{"startOffset":19131,"endOffset":19186,"count":0},{"startOffset":19191,"endOffset":19260,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19311,"endOffset":19457,"count":15},{"startOffset":19391,"endOffset":19455,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19505,"endOffset":19775,"count":15},{"startOffset":19551,"endOffset":19614,"count":0},{"startOffset":19652,"endOffset":19773,"count":0}],"isBlockCoverage":true},{"functionName":"parseUniqueHeadersOption","ranges":[{"startOffset":19779,"endOffset":20049,"count":3},{"startOffset":19876,"endOffset":20048,"count":0}],"isBlockCoverage":true},{"functionName":"setHeader","ranges":[{"startOffset":20089,"endOffset":20449,"count":15},{"startOffset":20143,"endOffset":20192,"count":0},{"startOffset":20321,"endOffset":20370,"count":3}],"isBlockCoverage":true},{"functionName":"appendHeader","ranges":[{"startOffset":20493,"endOffset":21229,"count":0}],"isBlockCoverage":false},{"functionName":"getHeader","ranges":[{"startOffset":21271,"endOffset":21493,"count":9},{"startOffset":21396,"endOffset":21403,"count":0},{"startOffset":21479,"endOffset":21490,"count":3}],"isBlockCoverage":true},{"functionName":"getHeaderNames","ranges":[{"startOffset":21606,"endOffset":21709,"count":0}],"isBlockCoverage":false},{"functionName":"getRawHeaderNames","ranges":[{"startOffset":21829,"endOffset":22230,"count":0}],"isBlockCoverage":false},{"functionName":"getHeaders","ranges":[{"startOffset":22332,"endOffset":22741,"count":0}],"isBlockCoverage":false},{"functionName":"hasHeader","ranges":[{"startOffset":22783,"endOffset":22941,"count":0}],"isBlockCoverage":false},{"functionName":"removeHeader","ranges":[{"startOffset":22986,"endOffset":23551,"count":0}],"isBlockCoverage":false},{"functionName":"_implicitHeader","ranges":[{"startOffset":23599,"endOffset":23690,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":23826,"endOffset":23863,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":23962,"endOffset":23998,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":24101,"endOffset":24183,"count":0}],"isBlockCoverage":false},{"functionName":"write","ranges":[{"startOffset":24261,"endOffset":24514,"count":3},{"startOffset":24343,"endOffset":24394,"count":0},{"startOffset":24474,"endOffset":24498,"count":0}],"isBlockCoverage":true},{"functionName":"onError","ranges":[{"startOffset":24517,"endOffset":24878,"count":0}],"isBlockCoverage":false},{"functionName":"emitErrorNt","ranges":[{"startOffset":24880,"endOffset":25029,"count":0}],"isBlockCoverage":false},{"functionName":"write_","ranges":[{"startOffset":25031,"endOffset":26581,"count":3},{"startOffset":25182,"endOffset":25227,"count":0},{"startOffset":25315,"endOffset":25481,"count":0},{"startOffset":25514,"endOffset":25563,"count":0},{"startOffset":25588,"endOffset":25638,"count":0},{"startOffset":25651,"endOffset":25793,"count":0},{"startOffset":25834,"endOffset":25873,"count":0},{"startOffset":25927,"endOffset":26078,"count":0},{"startOffset":26109,"endOffset":26138,"count":0},{"startOffset":26140,"endOffset":26220,"count":0},{"startOffset":26259,"endOffset":26280,"count":0},{"startOffset":26282,"endOffset":26474,"count":0}],"isBlockCoverage":true},{"functionName":"connectionCorkNT","ranges":[{"startOffset":26584,"endOffset":26636,"count":0}],"isBlockCoverage":false},{"functionName":"addTrailers","ranges":[{"startOffset":26678,"endOffset":28210,"count":0}],"isBlockCoverage":false},{"functionName":"onFinish","ranges":[{"startOffset":28213,"endOffset":28333,"count":3},{"startOffset":28299,"endOffset":28306,"count":0}],"isBlockCoverage":true},{"functionName":"end","ranges":[{"startOffset":28367,"endOffset":30180,"count":3},{"startOffset":28444,"endOffset":28510,"count":0},{"startOffset":28552,"endOffset":28603,"count":0},{"startOffset":28646,"endOffset":28937,"count":0},{"startOffset":28962,"endOffset":29186,"count":0},{"startOffset":29211,"endOffset":29329,"count":0},{"startOffset":29373,"endOffset":29403,"count":0},{"startOffset":29500,"endOffset":29573,"count":0},{"startOffset":29624,"endOffset":29632,"count":0},{"startOffset":29677,"endOffset":29718,"count":0},{"startOffset":29739,"endOffset":29854,"count":0},{"startOffset":30072,"endOffset":30092,"count":0},{"startOffset":30093,"endOffset":30135,"count":0},{"startOffset":30137,"endOffset":30162,"count":0}],"isBlockCoverage":true},{"functionName":"_finish","ranges":[{"startOffset":30354,"endOffset":30425,"count":3}],"isBlockCoverage":true},{"functionName":"_flush","ranges":[{"startOffset":31219,"endOffset":31649,"count":3},{"startOffset":31543,"endOffset":31643,"count":0}],"isBlockCoverage":true},{"functionName":"_flushOutput","ranges":[{"startOffset":31693,"endOffset":32336,"count":3},{"startOffset":31749,"endOffset":31794,"count":0},{"startOffset":31872,"endOffset":31889,"count":0},{"startOffset":32100,"endOffset":32211,"count":9}],"isBlockCoverage":true},{"functionName":"flushHeaders","ranges":[{"startOffset":32381,"endOffset":32512,"count":0}],"isBlockCoverage":false},{"functionName":"pipe","ranges":[{"startOffset":32548,"endOffset":32690,"count":0}],"isBlockCoverage":false},{"functionName":"OutgoingMessage.","ranges":[{"startOffset":32748,"endOffset":32793,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1264","url":"node:internal/http","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":1195,"count":1}],"isBlockCoverage":false},{"functionName":"utcDate","ranges":[{"startOffset":349,"endOffset":416,"count":0}],"isBlockCoverage":false},{"functionName":"cache","ranges":[{"startOffset":418,"endOffset":575,"count":0}],"isBlockCoverage":false},{"functionName":"resetCache","ranges":[{"startOffset":577,"endOffset":626,"count":0}],"isBlockCoverage":false},{"functionName":"getNextTraceEventId","ranges":[{"startOffset":651,"endOffset":710,"count":0}],"isBlockCoverage":false},{"functionName":"isTraceHTTPEnabled","ranges":[{"startOffset":712,"endOffset":791,"count":6}],"isBlockCoverage":true},{"functionName":"traceBegin","ranges":[{"startOffset":839,"endOffset":927,"count":0}],"isBlockCoverage":false},{"functionName":"traceEnd","ranges":[{"startOffset":929,"endOffset":1015,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1265","url":"node:_http_client","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":28212,"count":1}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3162,"endOffset":3187,"count":1}],"isBlockCoverage":true},{"functionName":"validateHost","ranges":[{"startOffset":3432,"endOffset":3725,"count":3},{"startOffset":3539,"endOffset":3708,"count":0}],"isBlockCoverage":true},{"functionName":"HTTPClientAsyncResource","ranges":[{"startOffset":3761,"endOffset":3831,"count":3}],"isBlockCoverage":true},{"functionName":"ClientRequest","ranges":[{"startOffset":3835,"endOffset":11151,"count":3},{"startOffset":3962,"endOffset":4040,"count":0},{"startOffset":4085,"endOffset":4146,"count":0},{"startOffset":4148,"endOffset":4214,"count":0},{"startOffset":4321,"endOffset":4381,"count":0},{"startOffset":4518,"endOffset":4538,"count":0},{"startOffset":4563,"endOffset":4612,"count":0},{"startOffset":4661,"endOffset":4872,"count":0},{"startOffset":4922,"endOffset":5102,"count":0},{"startOffset":5162,"endOffset":5186,"count":0},{"startOffset":5453,"endOffset":5504,"count":0},{"startOffset":5547,"endOffset":5616,"count":0},{"startOffset":5782,"endOffset":5787,"count":0},{"startOffset":5862,"endOffset":5927,"count":0},{"startOffset":5928,"endOffset":5942,"count":0},{"startOffset":5994,"endOffset":6021,"count":0},{"startOffset":6107,"endOffset":6167,"count":0},{"startOffset":6216,"endOffset":6255,"count":0},{"startOffset":6408,"endOffset":6485,"count":0},{"startOffset":6556,"endOffset":6621,"count":0},{"startOffset":6688,"endOffset":6733,"count":0},{"startOffset":6821,"endOffset":6872,"count":0},{"startOffset":7008,"endOffset":7056,"count":0},{"startOffset":7058,"endOffset":7167,"count":0},{"startOffset":7244,"endOffset":7250,"count":0},{"startOffset":7323,"endOffset":7349,"count":1},{"startOffset":7350,"endOffset":7378,"count":1},{"startOffset":7379,"endOffset":7408,"count":1},{"startOffset":7409,"endOffset":7436,"count":1},{"startOffset":7437,"endOffset":7466,"count":1},{"startOffset":7468,"endOffset":7519,"count":2},{"startOffset":7519,"endOffset":7575,"count":1},{"startOffset":8162,"endOffset":8203,"count":0},{"startOffset":8205,"endOffset":8273,"count":0},{"startOffset":8659,"endOffset":8748,"count":12},{"startOffset":9117,"endOffset":9184,"count":0},{"startOffset":9185,"endOffset":9245,"count":0},{"startOffset":9256,"endOffset":9305,"count":0},{"startOffset":9348,"endOffset":9391,"count":0},{"startOffset":9462,"endOffset":9497,"count":0},{"startOffset":9499,"endOffset":9623,"count":0},{"startOffset":9659,"endOffset":9869,"count":0},{"startOffset":9873,"endOffset":9995,"count":0},{"startOffset":10139,"endOffset":10232,"count":0},{"startOffset":10334,"endOffset":11149,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10541,"endOffset":10705,"count":0}],"isBlockCoverage":false},{"functionName":"_finish","ranges":[{"startOffset":11315,"endOffset":12088,"count":3},{"startOffset":11478,"endOffset":11811,"count":0},{"startOffset":11862,"endOffset":11938,"count":0},{"startOffset":11967,"endOffset":12086,"count":0}],"isBlockCoverage":true},{"functionName":"_implicitHeader","ranges":[{"startOffset":12133,"endOffset":12345,"count":3},{"startOffset":12182,"endOffset":12234,"count":0}],"isBlockCoverage":true},{"functionName":"abort","ranges":[{"startOffset":12380,"endOffset":12518,"count":0}],"isBlockCoverage":false},{"functionName":"destroy","ranges":[{"startOffset":12555,"endOffset":12831,"count":0}],"isBlockCoverage":false},{"functionName":"emitAbortNT","ranges":[{"startOffset":12834,"endOffset":12884,"count":0}],"isBlockCoverage":false},{"functionName":"ondrain","ranges":[{"startOffset":12886,"endOffset":13046,"count":0}],"isBlockCoverage":false},{"functionName":"socketCloseListener","ranges":[{"startOffset":13048,"endOffset":14215,"count":0}],"isBlockCoverage":false},{"functionName":"socketErrorListener","ranges":[{"startOffset":14217,"endOffset":14858,"count":0}],"isBlockCoverage":false},{"functionName":"socketOnEnd","ranges":[{"startOffset":14860,"endOffset":15346,"count":0}],"isBlockCoverage":false},{"functionName":"socketOnData","ranges":[{"startOffset":15348,"endOffset":17731,"count":12},{"startOffset":15570,"endOffset":15856,"count":0},{"startOffset":15910,"endOffset":17097,"count":0},{"startOffset":17151,"endOffset":17544,"count":3},{"startOffset":17546,"endOffset":17729,"count":3}],"isBlockCoverage":true},{"functionName":"statusIsInformational","ranges":[{"startOffset":17733,"endOffset":17968,"count":6},{"startOffset":17930,"endOffset":17946,"count":0},{"startOffset":17947,"endOffset":17964,"count":0}],"isBlockCoverage":true},{"functionName":"parserOnIncomingClient","ranges":[{"startOffset":17980,"endOffset":21036,"count":3},{"startOffset":18155,"endOffset":18317,"count":0},{"startOffset":18396,"endOffset":18405,"count":0},{"startOffset":18521,"endOffset":18600,"count":0},{"startOffset":18647,"endOffset":19350,"count":0},{"startOffset":19398,"endOffset":19422,"count":0},{"startOffset":19424,"endOffset":19642,"count":0},{"startOffset":19724,"endOffset":19746,"count":0},{"startOffset":19748,"endOffset":19972,"count":0},{"startOffset":20025,"endOffset":20123,"count":0},{"startOffset":20151,"endOffset":20191,"count":0},{"startOffset":20193,"endOffset":20326,"count":0},{"startOffset":20790,"endOffset":20802,"count":0},{"startOffset":20833,"endOffset":20842,"count":0},{"startOffset":20916,"endOffset":20995,"count":0}],"isBlockCoverage":true},{"functionName":"responseKeepAlive","ranges":[{"startOffset":21048,"endOffset":22117,"count":3},{"startOffset":21169,"endOffset":21241,"count":0},{"startOffset":21747,"endOffset":21758,"count":0}],"isBlockCoverage":true},{"functionName":"responseOnEnd","ranges":[{"startOffset":22119,"endOffset":23276,"count":3},{"startOffset":22239,"endOffset":22292,"count":0},{"startOffset":22405,"endOffset":22631,"count":0}],"isBlockCoverage":true},{"functionName":"responseOnTimeout","ranges":[{"startOffset":23278,"endOffset":23429,"count":0}],"isBlockCoverage":false},{"functionName":"requestOnFinish","ranges":[{"startOffset":23565,"endOffset":23685,"count":0}],"isBlockCoverage":false},{"functionName":"emitFreeNT","ranges":[{"startOffset":23687,"endOffset":23811,"count":3}],"isBlockCoverage":true},{"functionName":"tickOnSocket","ranges":[{"startOffset":23813,"endOffset":24957,"count":3},{"startOffset":23980,"endOffset":24004,"count":0},{"startOffset":24196,"endOffset":24209,"count":0},{"startOffset":24487,"endOffset":24546,"count":0},{"startOffset":24890,"endOffset":24925,"count":0}],"isBlockCoverage":true},{"functionName":"emitRequestTimeout","ranges":[{"startOffset":24959,"endOffset":25067,"count":0}],"isBlockCoverage":false},{"functionName":"listenSocketTimeout","ranges":[{"startOffset":25069,"endOffset":25460,"count":0}],"isBlockCoverage":false},{"functionName":"onSocket","ranges":[{"startOffset":25497,"endOffset":25668,"count":3}],"isBlockCoverage":true},{"functionName":"onSocketNT","ranges":[{"startOffset":25671,"endOffset":26371,"count":3},{"startOffset":25739,"endOffset":26309,"count":0}],"isBlockCoverage":true},{"functionName":"_destroy","ranges":[{"startOffset":25772,"endOffset":26009,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":26178,"endOffset":26233,"count":0}],"isBlockCoverage":false},{"functionName":"_deferToConnect","ranges":[{"startOffset":26432,"endOffset":27184,"count":0}],"isBlockCoverage":false},{"functionName":"setTimeout","ranges":[{"startOffset":27223,"endOffset":27588,"count":0}],"isBlockCoverage":false},{"functionName":"setSocketTimeout","ranges":[{"startOffset":27591,"endOffset":27777,"count":0}],"isBlockCoverage":false},{"functionName":"setNoDelay","ranges":[{"startOffset":27816,"endOffset":27897,"count":0}],"isBlockCoverage":false},{"functionName":"setSocketKeepAlive","ranges":[{"startOffset":27949,"endOffset":28074,"count":0}],"isBlockCoverage":false},{"functionName":"clearTimeout","ranges":[{"startOffset":28116,"endOffset":28171,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1266","url":"node:http","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4384,"count":1}],"isBlockCoverage":false},{"functionName":"createServer","ranges":[{"startOffset":2013,"endOffset":2105,"count":0}],"isBlockCoverage":false},{"functionName":"request","ranges":[{"startOffset":3070,"endOffset":3154,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":3319,"endOffset":3421,"count":0}],"isBlockCoverage":false},{"functionName":"setMaxIdleHTTPParsers","ranges":[{"startOffset":3732,"endOffset":3823,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":3947,"endOffset":4156,"count":2},{"startOffset":3992,"endOffset":4125,"count":1}],"isBlockCoverage":true},{"functionName":"get","ranges":[{"startOffset":4279,"endOffset":4324,"count":2}],"isBlockCoverage":true},{"functionName":"set","ranges":[{"startOffset":4328,"endOffset":4379,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1267","url":"node:dns","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":11016,"count":1}],"isBlockCoverage":false},{"functionName":"onlookup","ranges":[{"startOffset":2793,"endOffset":3137,"count":2},{"startOffset":2840,"endOffset":2920,"count":0},{"startOffset":3032,"endOffset":3053,"count":0},{"startOffset":3055,"endOffset":3135,"count":0}],"isBlockCoverage":true},{"functionName":"onlookupall","ranges":[{"startOffset":3140,"endOffset":3647,"count":0}],"isBlockCoverage":false},{"functionName":"lookup","ranges":[{"startOffset":3718,"endOffset":5563,"count":2},{"startOffset":3983,"endOffset":4028,"count":0},{"startOffset":4283,"endOffset":4338,"count":0},{"startOffset":4373,"endOffset":4416,"count":0},{"startOffset":4486,"endOffset":4694,"count":0},{"startOffset":4757,"endOffset":4973,"count":0},{"startOffset":5115,"endOffset":5128,"count":0},{"startOffset":5243,"endOffset":5339,"count":0},{"startOffset":5366,"endOffset":5547,"count":0}],"isBlockCoverage":true},{"functionName":"onlookupservice","ranges":[{"startOffset":5709,"endOffset":6055,"count":0}],"isBlockCoverage":false},{"functionName":"lookupService","ranges":[{"startOffset":6058,"endOffset":6841,"count":0}],"isBlockCoverage":false},{"functionName":"onresolve","ranges":[{"startOffset":6996,"endOffset":7450,"count":0}],"isBlockCoverage":false},{"functionName":"resolver","ranges":[{"startOffset":7452,"endOffset":8378,"count":13}],"isBlockCoverage":true},{"functionName":"query","ranges":[{"startOffset":7487,"endOffset":8280,"count":0}],"isBlockCoverage":false},{"functionName":"resolve","ranges":[{"startOffset":9367,"endOffset":9839,"count":0}],"isBlockCoverage":false},{"functionName":"defaultResolverSetServers","ranges":[{"startOffset":9841,"endOffset":10137,"count":0}],"isBlockCoverage":false},{"functionName":"get","ranges":[{"startOffset":10879,"endOffset":11007,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1268","url":"node:internal/dns/utils","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6007,"count":1}],"isBlockCoverage":false},{"functionName":"validateTimeout","ranges":[{"startOffset":804,"endOffset":951,"count":1}],"isBlockCoverage":true},{"functionName":"validateTries","ranges":[{"startOffset":953,"endOffset":1088,"count":1}],"isBlockCoverage":true},{"functionName":"Resolver","ranges":[{"startOffset":1166,"endOffset":1344,"count":1}],"isBlockCoverage":true},{"functionName":"cancel","ranges":[{"startOffset":1348,"endOffset":1389,"count":0}],"isBlockCoverage":false},{"functionName":"getServers","ranges":[{"startOffset":1393,"endOffset":1661,"count":0}],"isBlockCoverage":false},{"functionName":"setServers","ranges":[{"startOffset":1665,"endOffset":3405,"count":0}],"isBlockCoverage":false},{"functionName":"setLocalAddress","ranges":[{"startOffset":3409,"endOffset":3596,"count":0}],"isBlockCoverage":false},{"functionName":"getDefaultResolver","ranges":[{"startOffset":3897,"endOffset":3956,"count":1}],"isBlockCoverage":true},{"functionName":"setDefaultResolver","ranges":[{"startOffset":3958,"endOffset":4029,"count":0}],"isBlockCoverage":false},{"functionName":"bindDefaultResolver","ranges":[{"startOffset":4031,"endOffset":4205,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4116,"endOffset":4201,"count":15}],"isBlockCoverage":true},{"functionName":"validateHints","ranges":[{"startOffset":4207,"endOffset":4362,"count":2},{"startOffset":4302,"endOffset":4360,"count":0}],"isBlockCoverage":true},{"functionName":"emitInvalidHostnameWarning","ranges":[{"startOffset":4407,"endOffset":4760,"count":0}],"isBlockCoverage":false},{"functionName":"getDefaultVerbatim","ranges":[{"startOffset":4831,"endOffset":4985,"count":2},{"startOffset":4889,"endOffset":4924,"count":0}],"isBlockCoverage":true},{"functionName":"setDefaultResultOrder","ranges":[{"startOffset":4987,"endOffset":5111,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1269","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persistence_user.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":7704,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":224,"endOffset":1376,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":408,"endOffset":544,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":629,"endOffset":703,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":787,"endOffset":851,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":935,"endOffset":999,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_user","ranges":[{"startOffset":1380,"endOffset":1740,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1743,"endOffset":1856,"count":0}],"isBlockCoverage":false},{"functionName":"set_get_git_user","ranges":[{"startOffset":1859,"endOffset":2564,"count":0}],"isBlockCoverage":false},{"functionName":"set_get_repo_show","ranges":[{"startOffset":2567,"endOffset":3796,"count":0}],"isBlockCoverage":false},{"functionName":"set_get_repo_login","ranges":[{"startOffset":3799,"endOffset":4544,"count":0}],"isBlockCoverage":false},{"functionName":"set_get_settings","ranges":[{"startOffset":4547,"endOffset":6584,"count":0}],"isBlockCoverage":false},{"functionName":"teardown","ranges":[{"startOffset":6587,"endOffset":7153,"count":0}],"isBlockCoverage":false}]},{"scriptId":"1270","url":"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_packages.clas.testclasses.mjs","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":4188,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":228,"endOffset":968,"count":1}],"isBlockCoverage":true},{"functionName":"type","ranges":[{"startOffset":418,"endOffset":514,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":599,"endOffset":647,"count":0}],"isBlockCoverage":false},{"functionName":"type","ranges":[{"startOffset":733,"endOffset":781,"count":0}],"isBlockCoverage":false},{"functionName":"ltcl_packages","ranges":[{"startOffset":972,"endOffset":1205,"count":0}],"isBlockCoverage":false},{"functionName":"constructor_","ranges":[{"startOffset":1208,"endOffset":1321,"count":0}],"isBlockCoverage":false},{"functionName":"test_package","ranges":[{"startOffset":1324,"endOffset":3118,"count":0}],"isBlockCoverage":false},{"functionName":"teardown","ranges":[{"startOffset":3121,"endOffset":3639,"count":0}],"isBlockCoverage":false}]}],"timestamp":255.242755,"source-map-cache":{"file:///home/runner/work/abapGit/abapGit/output/%23ui2%23cl_json.clas.mjs":{"lineLengths":[51,53,25,20,32,40,37,232,283,372,752,783,382,17,42,22,44,48,3,29,64,16,3,25,40,3,32,76,64,52,71,73,118,19,3,26,41,3,33,66,43,49,101,64,71,73,105,76,106,79,121,127,618,417,72,64,74,151,92,39,82,46,88,124,62,64,18,65,11,48,60,16,288,9,97,227,94,84,97,266,43,58,18,119,11,16,86,9,95,101,95,101,14,25,7,90,55,62,68,34,50,166,73,89,9,7,85,91,53,66,55,74,36,100,110,97,19,9,86,198,91,168,16,138,9,166,87,7,75,191,7,85,88,39,60,22,7,78,134,12,138,5,18,3,28,43,3,35,64,52,67,55,71,73,105,76,109,88,43,49,106,48,130,12,64,5,54,113,3,29,44,3,36,66,58,71,73,43,49,121,127,124,618,417,264,72,67,67,68,69,74,92,89,39,82,329,165,211,91,148,148,148,148,27,109,91,148,60,38,16,29,9,109,91,148,60,38,16,29,9,14,87,7,90,146,71,33,61,79,184,69,7,91,53,66,74,36,100,110,36,84,107,16,77,9,182,7,88,39,148,166,17,9,146,44,88,9,173,47,75,37,48,81,69,100,92,82,11,107,123,96,179,149,123,95,16,34,83,95,93,65,20,128,13,91,125,203,90,125,143,11,9,7,78,89,12,138,5,3,1,44,139,210,56,60,94,22,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/%23ui2%23cl_json.clas.mjs.map#ui2#cl_json.clas.abap"],"names":[],"mappings":";;;AA8CA;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;;;;;QACO,gHAA2C;QAC3C,sHAA6C;QAC7C,imBAAuD;QACvD,wZAAwC;QACxC,+DAA8B;QAC9B,uDAAoB;IAEzB,IAAc,OAAc;IAC5B,IAAc,OAAoB;IAElC,aAAU,yEAA2C;IACrD,IACE,OAsCA,AAeA,AA4BA,KAlFG,OAAO,OAAE,IAAd;;MAGI,IACE,OAYA,AAEA,AAEA,AAYA,AAEA,KA/BG,OAAO,OAAE,SAAd;;QAEI,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,gEAAgC;UAC1D,iBAAQ,GAAL,MAAO,uBAAS;YACjB,WAAS,uCAAM;UACjB;YACE,WAAS,wCAAO;UAClB;QACF,gCAAO,KAAe;UACpB,WAAS,qCAAI;QACf;UACE,iCAAS,2DAAO,qBAAQ,sEAAiB,QAAS,+BAAgB,gBAAoB,sCAAG;QAC3F;;QAEA,iCAAS,2DAAO,qBAAQ,KAAM,MAAK,QAAS,+BAAgB,gBAAmB,sCAAG;;QAElF,0EAAmB;;QAEnB,iBAAiB,GAAd,eAAgB,uBACf,IAAI,cAAyB,GAAvB,OAAO,OAAE,eAAgB,gDAC/B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,iDAAmB,CAAC;UAClD,yBAAG,KAAe;YAChB,4CAAa;UACf;YACE,yGAA8C;UAChD;QACF;UACE,0EAAmB;QACrB;;QAEA,2FAAgC;;QAEhC,2FAAgC;;QAEhC,WAAS,IAAI;;;MAGjB,WAAS,oCAAG;MACZ,qDAAoB;;;QAElB,aAAW,eAAE,MAAC,MAAK;QACnB,iCAAS,QAAU,mHAIc;QACjC,iBAAiB,GAAd,yBAAO,QAAU,SAAQ;UAC1B,iCAAS,OAAU,qCAAG;QACxB;MACF;MACA,iCAAS,OAAU,qCAAG;;iCAEtB,WAAa,OAAO;MACpB,mBAAgB,uCAA4B;MAC5C,WAAS,oCAAG;;;QAEV,yFAA6D;QAC7D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACnB,iBAAY,GAAT,UAAW,uBAAU,yBAAI,QAAgB;UAC1C;QACF;QACA,iBAAe,GAAZ,aAAc,wBAAW,MAAC,YAAU;UACrC,iCAAS,yJAA4D;QACvE,wBAAmB,GAAZ,aAAc,wBAAW,MAAC,UAAQ;UACvC,iCAAS,2HAAgD;QAC3D;UACE,iCAAS,6FAAoC;QAC/C;QACA,iCAAS,QAAU,mHAIc;QACjC,iCAAS,OAAU,qCAAG;MACxB;MACA,iBAAU,GAAP,QAAU,sCAAI;QACf,WAAS,wBAAW,KAAM,QAAO,KAAM,iCAAE,KAAuB,qBAAjB,0BAAQ,SAAW,kCAAG;MACvE;MACA,iCAAS,OAAU,qCAAG;;MAEtB,yBAAG,KAAe;QAChB,WAAS,uCAAM;QACf;MACF;MACA,qEAAuB;MACvB,YAAS,kHAIwB;;MAEjC,oCAAS,GAAF,iCAAI,0DAAuB;;IAExC;;EAEA;;;;;;;;;;;;;;;;;IAGE,yBAAG,gBAAoB;iIACsC;IAC7D;+DAC0B;IAC1B;qDAG0B;gHAOF;EAC1B;EAEA;;;;;;;;;;QACO,gHAA2C;QAC3C,sHAA6C;QAC7C,mHAA4C;QAC5C,imBAAuD;QACvD,wZAAwC;QACxC,+PAA+B;QAC/B,+DAA8B;QAC9B,0DAAyB;QACzB,0DAAyB;QACzB,2DAAyB;QACzB,4DAAqC;IAE1C,IAAc,OAAc;IAE5B,aAAU,yEAA2C;IACrD,YAAS,uEAAqC;IAG9C,IACE,OAiCA,AAeA,AAoBA,KArEG,OAAO,OAAE,IAAd;;MAGI,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,qEACxB,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,wDAC5B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,gDAAY;QAC1C,SAAO,gCAAyC,IAAlC,qEAAoC,wCAA3C,CAAmD;MAC5D,wBAA8B,GAAvB,OAAO,OAAE,eAAgB,gDAC5B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,iDAAkB;QAChD,cAAW,mEAAiC;QAC5C,yIAAkD;QAClD,yIAAkD;QAClD,yIAAkD;QAClD,yIAAkD;QAClD,SAAO,QAAQ;MACjB,wBAA0B,GAAnB,OAAO,OAAE,WAAY,kCAAmB,cAAa;QAC1D,cAAW,mEAAiC;QAC5C,yIAAkD;QAClD,iBAAY,GAAT,UAAY,mBAAK;UAClB,sBAAM,IAAI;QACZ;UACE,SAAO,QAAQ;QACjB;MACF,wBAA0B,GAAnB,OAAO,OAAE,WAAY,kCAAmB,cAAa;QAC1D,cAAW,mEAAiC;QAC5C,yIAAkD;QAClD,iBAAY,GAAT,UAAY,mBAAK;UAClB,sBAAM,IAAI;QACZ;UACE,SAAO,QAAQ;QACjB;MACF;QACE,UAAO,mEAAiC;MAC1C;;MAEA,gBAAa,0HAAmC;;;;QAI9C,oEAAsB;uLAMG;QAEzB,0DAA4B;MAC9B;;iCAEA,WAAa,OAAO;MACpB,mBAAgB,uCAA4B;;;QAE1C,yFAA6D;QAC7D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACnB,IACE,YADG,WAAL;;UAEI,YAAU,4BAAU,4BAAU,YAAY,MAAC,SAAQ;;UAEnD,YAAU,4BAAU,YAAY,MAAC,OAAM;;qLAQlB;MAC3B;;MAEA,yBAAG,KAAe;QAChB,gBAAa,0HAAmC;QAGhD,iBAAuB,GAApB,yBAAO,cAAe,gCAAE,iBAAW,GAAP,QAAS,oCAAE;UACxC;QACF;QAEA,aAAU,2HAAoC;QAC9C,yBAAG,QAAkB;UACnB,aAAU,+DAA6B;QACzC;QAGA,iBAAuB,GAApB,yBAAO,cAAe,gCAAE,iBAAY,GAAR,SAAU,0CAAQ;UAC/C,sBAAM,aAAa;;;YAGjB,sBAAM,YAAY;YAClB,YAAY,MAAC,UAAO,4BAAU,WAAW;YACzC;YACA,YAAY,MAAC,WAAO,yDAAoC;YACxD,4CAAO,YAAY,MAAC,gBAAmB;YACvC,gCAAO,sBAAgB,aAAa;UACtC;UACA,eAAY,gFAA4C;UACxD;;QACF,wBAA2B,GAApB,yBAAO,cAAe,gCAAE,iBAAY,GAAR,SAAU,yCAAO;UAClD,cAAW,2HAAkE;UAC7E;;QACF;UACE,IACE,OAOA,AAEA,KAVG,OAAL;;YAEI,cAAW,mEAAiC;YAC5C,iBAAY,GAAT,UAAY,gDAAa;;YAE5B;cACE,oCAAS,GAAF,iCAAI,wCAAM;YACnB;;YAEA;;;YAEA;;;QAIN;MACF;MACA,qEAAuB;wFAME;;MAEzB,oCAAS,GAAF,iCAAI,0DAAuB;;EAExC;AAEF","file":"#ui2#cl_json.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/%23ui2%23cl_json.clas.locals.mjs":{"lineLengths":[53,36,17,32,55,37,627,278,152,191,172,163,17,42,22,529,3,29,64,16,3,21,67,61,67,61,346,36,119,68,3,20,101,64,346,58,60,22,41,20,3,34,68,64,378,58,60,31,88,123,50,59,5,20,3,15,67,64,346,58,69,62,24,38,75,5,19,3,25,67,346,71,29,69,5,19,3,1,56,348,18,32,56,37,786,172,56,303,266,265,269,264,297,460,273,17,42,22,688,3,29,64,16,3,24,515,71,36,163,161,166,5,3,33,67,67,61,483,71,29,122,45,23,7,5,25,19,3,23,102,67,61,108,73,27,46,117,21,3,25,67,67,61,483,58,70,73,27,46,36,19,3,24,264,67,61,483,169,29,79,5,22,3,30,101,67,61,142,20,3,30,64,67,61,64,20,3,29,64,67,61,64,20,3,29,68,67,61,483,58,70,73,27,46,88,40,5,20,3,22,67,61,115,115,121,134,131,342,130,128,67,67,131,483,64,298,91,152,59,22,18,51,75,42,14,7,66,5,50,67,29,48,54,101,53,87,88,31,92,80,96,71,9,54,41,75,42,102,86,85,62,28,201,58,91,11,74,118,9,240,41,75,71,102,86,74,147,9,109,54,50,77,37,9,7,5,3,1,58,486,693,31,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/%23ui2%23cl_json.clas.locals.mjs.map#ui2#cl_json.clas.locals_imp.abap"],"names":[],"mappings":";;AA+BA;;;;;;;;;;;;;;;;;;;EACE;;;;;QACO,iVAA4B;IACjC,OAAO,MAAC,UAAO,OAAO;IACtB,OAAO,MAAC,cAAW,gCAAe,GAAR,SAAU,yCAAjB,CAA0B;IAC7C,gCAAO,iBAAW,YAAO;EAC3B;EAEA;;QACO,uDAAe;QACf,iVAA4B;IACjC,aAAW,yBAAO,cAAS;IAC3B;oBAA8C;IAC9C,aAAW,OAAO,MAAC,SAAQ;IAC7B;;EAEA;;QACO,uDAAe;IACpB,IAAc,WAA8B;IAE5C,aAAW,yBAAO,cAAS;IAC3B;6BAAqD;IACrD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,WAAS,MAAC,iBAAoC,mBAAtB,WAAS,MAAC,aAAc,gCAAC;MACjD,aAAW,WAAS,MAAC,YAAW;MAChC,aAAW,4BAAU,UAAU;IACjC;IACF;;EAEA;;QACO,uDAAe;QACf,iVAA4B;IACjC,aAAW,yBAAO,cAAS;IAC3B,iBAAY,GAAT,UAAW,gCAAC;MACb;sBAA8C;MAC9C,YAAU,OAAO,MAAC,KAAI;;IAExB;IACF;;EAEA;;QACO,iVAA4B;;;MAE/B,kCAAU,QAAW,OAAO,MAAC,MAAI;IACnC;IACF;;AACF;;;AA2DA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;IACE,IAAc,WAA8B;;;MAE1C,0JAA2D;MAC3D,wJAAyD;MACzD,6JAA8D;IAChE;EACF;EAEA;;;;QACO,0dAA4B;;;MAE/B,iBAAiC,GAA9B,4BAAU,OAAO,MAAC,cAAc,4BAAU,UAAS;QACpD,YAAU,OAAO,MAAC,UAAS;QAC3B;MACF;IACF;IACA,YAAU,OAAO;IACnB;;EAEA;;;;IACE;;;4CAAsE;IACtE,cAAY,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IACnC;;EAEA;;;;QACO,0dAA4B;IACjC;;;;4CAA4D;IAC5D,YAAU,OAAO,MAAC,KAAI;IACxB;;EAEA;;;;QACO,0dAA4B;;;MAE/B,gCAAO,OAAO,MAAC,eAAQ,UAAU;IACnC;IACF;;EAEA;;;;IACE,aAAW,gCAA+B,IAAxB,8CAA0B,wCAAjC,CAAyC;IACtD;;EAEA;;;;IACE,cAAW,4CAAuB;IACpC;;EAEA;;;;IACE,cAAW,4CAAuB;IACpC;;EAEA;;;;QACO,0dAA4B;IAEjC;;;;4CAA4D;IAC5D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,aAAW,OAAO,MAAC,MAAK;IAC1B;IACF;;EAEA;;;QAEO,0GAAsC;QACtC,0GAAsC;QACtC,gHAAwC;QACxC,6HAA+C;QAC/C,0HAA8C;QAC9C,6UAAgD;QAChD,yHAA2C;QAC3C,uHAA4C;QAC5C,0DAAyB;QACzB,0DAAyB;QACzB,0HAAmC;QACnC,0dAAkC;QAClC,uDAAoB;QACpB,iSAAyE;;IAM9E,eAAY,mIAAwE;;;;;MAIlF,aAAU,sDAA4B;MACtC,yBAAG,QAAkB;QACnB;MACF;MACA,gCAAO,iBAAW,QAAQ;IAC5B;;;;MAKE,aAAW,eAAE,MAAC,MAAK;MAEnB,IACE,OA+CA,KAhDG,OAAO,OAAE,iBAAd;;mCAEI,SAAW,OAAO;QAGlB,mBAAgB,0DAA0B;QAE1C;6BAAkD;QAClD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,aAAU,uDAA0B;QACtC,wBAA6B,IAAtB,kCAAwB,uBAAS;UACtC,aAAU,8CAAmC;QAC/C;QAEA,yBAAG,kBAAsB;UACvB,sBAAM,OAAO;UACb,OAAO,MAAC,aAAS,qCAA0B;UAC3C,OAAO,MAAC,UAAO,OAAO;UACtB,OAAO,MAAC,qCAAY,OAAO,MAAC,QAAU,OAAO,MAAC,MAAI;UAClD,OAAO,MAAC,UAAO,OAAO,OAAE,0BAAK,MAAC,KAAI;UAElC,aAAoB,mBAAT,SAAW,gCAAC;UACvB;0BAA+C;UAC/C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAkB,GAAd,OAAO,OAAE,mBAAO,6BAAc,yBAAW;uCAC3D,UAAY,OAAO;YACnB,OAAO,MAAC,YAAQ,oDAAsB;UACxC;UAEA,gCAAO,iBAAW,YAAO;qHAIQ;QACnC;QAEA,iBAAuB,GAApB,OAAO,OAAE,0BAAK,MAAC,OAAO,0CAAS,iBAAuB,GAApB,OAAO,OAAE,0BAAK,MAAC,OAAO,yCAAO;UAChE,sBAAM,OAAO;UACb,OAAO,MAAC,aAAS,qCAA0B;UAC3C,OAAO,MAAC,UAAO,oCAAG;UAClB,OAAO,MAAC,qCAAY,OAAO,MAAC,QAAU,OAAO,MAAC,MAAI;UAClD,OAAO,MAAC,UAAO,OAAO,OAAE,0BAAK,MAAC,KAAI;UAClC,gCAAO,iBAAW,YAAO;kJAIQ;QACnC;;mCAGA,UAAY,OAAO;QACnB,aAAU,2BAAgB;QAC1B,iBAAW,GAAR,SAAU,qCAAG;oCACE;QAClB;;IAYN;EAWF;AACF","file":"#ui2#cl_json.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_root.clas.mjs":{"lineLengths":[20,29,32,35,49,200,128,303,393,17,12,42,22,103,51,53,45,3,29,50,58,102,64,41,37,16,3,36,72,73,72,73,67,70,40,40,39,54,65,3,40,66,110,91,82,18,3,31,66,96,18,3,1,34,17,41],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_root.clas.abap"],"names":[],"mappings":";AAsBA;;;;;;;;;;;;;;;;;EAEE;;;;;IACE,OAAE,OAAE,aAAW,QAAQ;IACvB,OAAE,OAAE,WAAS,MAAM;IACrB;;EAEA;;;;;;;IACE,sBAAM,YAAY;IAClB,sBAAM,YAAY;IAClB,sBAAM,WAAW;IAEjB;IACA;EACF;EAEA;;;;IACE,WAAS,iEAA+B;IAC1C;;EAEA;;IACE,YAAS,8EAA6C;IACxD;;AAEF","file":"cx_root.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/00.msag.mjs":{"lineLengths":[19,20,39,39,2,36],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"00.msag.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/abap.type.mjs":{"lineLengths":[16,77,38,78,36,78,36,75,33,77,35,221,88,429,429,95,88,90,88,87,88,88,84,88,91,87,88,87,88,91,87,91,89,81,81,63,63,424,623,365,572,163,838,1047,281,486,300,503,635,842,487,367,582,299,507,261,468,2446,2653,1110,1317,261,468,219,422,160,366,30,38],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"abap.type.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_char_utilities.clas.mjs":{"lineLengths":[53,35,30,32,50,37,161,139,142,141,157,153,157,162,155,160,155,156,79,176,17,42,22,76,74,80,52,54,46,54,64,50,60,50,50,3,29,64,16,3,29,54,3,36,78,78,3,40,65,3,47,65,288,17,3,1,64,78,58,77,55,80,58,79,39,95,43,91,41,95,43,100,48,93,41,98,50,93,40,93,40,65,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_char_utilities.clas.abap"],"names":[],"mappings":";;AAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;IAKE;IACA;EAGF;EAEA;;;;;IACE,sCAAY,kCAAI,uCAAe,qCAAa,gCAAQ,qDAAS,2CAAe,KAAK;IACnF;;AAEF","file":"cl_abap_char_utilities.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_classdescr.clas.mjs":{"lineLengths":[77,53,31,54,32,46,37,25,333,229,141,17,12,42,22,3,29,47,61,51,16,3,31,52,3,38,85,94,64,67,58,102,18,3,32,127,118,23,3,1,56,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_classdescr.clas.abap"],"names":[],"mappings":";;;AAmBA;;;;;;;;;;;;;EACE;;;kDACgC;IAChC;;EAEA;;;;;;;QACO,0DAAmB;IACxB;IACA,YAAS,oFAAiD;IAC5D;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AACF","file":"cl_abap_classdescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_objectdescr.clas.mjs":{"lineLengths":[73,53,32,53,32,47,37,1407,2719,537,151,151,562,650,159,160,160,160,160,160,162,160,158,310,419,311,17,12,42,22,1310,2643,461,75,75,486,574,49,51,51,51,51,47,51,45,3,29,47,61,82,51,66,1132,283,2470,662,322,410,48,23,55,64,39,40,122,57,47,60,44,56,46,47,104,73,67,71,5,116,60,23,55,39,5,70,45,23,54,41,53,48,61,66,74,58,25,46,47,60,44,7,5,67,31,16,3,42,125,52,76,55,85,379,68,123,136,27,79,88,122,12,68,5,23,3,35,125,45,55,118,23,3,35,125,45,55,82,292,54,69,65,68,27,41,88,68,5,40,23,3,1,58,94,38,95,39,95,39,95,39,95,39,95,37,97,39,94,36,315,403,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_objectdescr.clas.abap"],"names":[],"mappings":";;;AAgEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;QACO,yEAA2B;QAC3B,0CAAwB;QACxB,yDAAoB;IAEzB,IAAc,QAA+B;IAC7C,IAAc,QAA+B;IAC7C,IAAc,UAA+B;IAC7C,IAAc,aAA+B;IAC7C,IAAc,SAA2C;IACzD,IAAc,SAA2C;IAGzD;MACA;;;MAGA,QAAM,MAAC,UAAO,OAAO;MACrB,SAAO,MAAC,UAAO,OAAO;MACtB,QAAM,MAAC,kBAAe,gCAAe,GAAR,SAAW,qCAAlB,CAAuB;MAC7C;MACA,QAAM,MAAC,iBAAc,QAAQ;MAC7B;MACA,QAAM,MAAC,cAAW,QAAQ;MAC1B;MACA,QAAM,MAAC,gBAAa,QAAQ;MAC5B;iCACA,SAAO,MAAC,QAAQ,8CAA0B;MAC1C,QAAM,MAAC,eAAY,SAAO,MAAC,KAAI,OAAE,SAAS;MAC1C,QAAM,MAAC,YAAS,SAAO,MAAC,KAAI,OAAE,MAAM;MACpC,QAAM,MAAC,cAAW,SAAO,MAAC,KAAI,OAAE,QAAQ;IACxC;IACA;IAGA;MACA;;MAEA,QAAM,MAAC,UAAO,OAAO;IACrB;IACA;IAGA;MACA;;MAEA,UAAQ,MAAC,UAAO,OAAO;MACvB;MACA,UAAQ,MAAC,gBAAa,QAAQ;MAE9B;;;QAGA,SAAO,MAAC,YAAS,UAAQ,MAAC,KAAI;QAC9B;QACA,aAAW,MAAC,UAAO,OAAO;QAC1B,SAAO,MAAC,eAAY,OAAO;QAC3B;QAE6B,SAAO,MAAC,aAApB,MAAwB;MAKzC;IACA;IACA;8BAEqB;IACvB;;EAEA;;;;;;QACO,kXAAsC;IAE3C;;;;6EAAsG;IACtG,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;iCACb,cAAe,yEAAkC;IACnD;MACE;IACF;IACF;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;QACO,yEAA0B;QAC1B,2RAAuC;IAE5C,YAAU,4BAAU,QAAQ;IAC5B;;;;uCAAkE;IAClE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IACA,gBAAc,OAAO,MAAC,KAAI;IAC5B;;AACF","file":"cl_abap_objectdescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_typedescr.clas.mjs":{"lineLengths":[53,30,25,32,45,37,153,160,124,174,139,141,150,150,163,164,165,165,169,164,164,168,170,170,164,164,165,163,163,164,164,164,164,163,167,164,166,166,166,167,167,165,164,167,161,167,129,131,130,128,130,130,320,301,300,339,367,198,163,198,200,360,17,42,22,51,84,48,98,63,65,74,74,55,57,59,59,67,57,57,65,69,69,57,57,59,55,55,57,57,57,57,55,63,57,61,61,61,63,63,59,57,63,51,63,49,53,51,47,51,49,3,29,64,16,3,27,262,118,20,3,29,101,118,20,3,35,55,3,42,118,44,55,250,67,124,127,103,68,30,45,73,89,58,86,7,5,25,16,3,33,53,3,40,118,44,55,72,129,67,66,212,66,18,5,89,64,29,79,97,64,55,73,140,52,81,52,86,80,65,56,73,79,123,14,142,7,52,81,52,12,11,63,19,112,67,16,18,9,7,69,5,39,16,3,29,64,33,16,3,27,101,110,20,3,24,104,31,23,3,37,57,3,44,118,79,70,74,82,63,16,3,39,59,3,46,125,98,76,67,125,66,45,69,5,44,101,68,59,67,47,114,31,39,23,3,33,53,3,40,118,45,55,121,118,66,71,71,67,65,67,69,72,72,41,61,67,29,82,79,63,55,61,48,72,73,90,79,64,55,61,48,72,76,86,79,63,55,96,48,49,85,79,63,55,39,48,106,86,79,64,55,62,48,71,73,88,79,66,55,39,43,86,79,64,55,62,48,71,73,87,79,65,55,73,93,79,70,55,91,120,67,57,167,119,65,56,61,89,79,67,55,61,79,88,79,66,55,61,78,91,79,64,55,96,48,49,94,36,65,18,93,78,64,54,47,41,48,96,115,93,16,50,88,9,14,97,7,89,79,67,55,96,78,64,54,47,27,83,12,53,139,5,74,86,85,78,49,83,48,5,93,65,65,98,81,105,64,121,150,98,154,61,227,88,61,128,12,61,127,5,76,108,5,16,3,1,54,65,96,40,97,41,98,42,98,42,102,46,97,41,97,41,101,45,103,47,103,47,97,41,97,41,98,42,96,40,96,40,97,41,97,41,97,41,97,41,96,40,100,44,97,41,99,43,99,43,99,43,100,44,100,44,98,42,97,41,100,44,94,38,100,44,62,37,64,39,63,38,61,36,63,38,62,37,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_typedescr.clas.abap"],"names":[],"mappings":";;AAiHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;QACO,iPAAyD;QACzD,0DAAgC;QAChC,mHAAwC;QACxC,sHAA0C;IAE/C;;;MAGE,yBAAG,WAAqB;QACtB,gBAAa,+CAA2B;MAC1C,wBAAwB,GAAjB,UAAU,OAAE,MAAO,8BAAW;mCACnC,WAAa,UAAU;QACvB,gBAAa,4DAAwC;MACvD;IACF;IAEA,SAAO,UAAU;IACnB;;EAEA;;;;;;;QACO,+DAA4B;QAC5B,wHAA2C;QAC3C,0DAAuB;QACvB,yDAAuB;IAG5B,iBAAU,GAAP,QAAU,qCAAI,iBAAW,GAAP,QAAU,0CAAS,iBAAW,GAAP,QAAU,0CAAQ;MAC5D,UAAO,gDAA4B;MACnC;IACF;IAEA;IACA;IAEA,IACE,OAWA,MAZG,OAAL;;;MAKI,IAAI,OAAE,cAAY,+BAAa;MAC/B,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,kBAAgB,4BAAU,QAAQ;MACxC,IAAI,OAAE,wCAAgB,4CAAa,4BAAU,SAAQ;iCACrD,aAAe,IAAI;MACnB,WAAW,OAAE,mBAAiB,4BAAU,QAAQ;MAChD,WAAW,OAAE,mBAAiB,OAAO;;;MAGrC,IAAI,OAAE,cAAY,gCAAc;MAChC,IAAI,OAAE,SAAO,4BAAU;MACvB,IAAI,OAAE,kBAAgB,4BAAU,QAAQ;MACxC,iBAAU,GAAP,QAAU,0CAAQ;QACnB,IAAI,OAAE,mBAAgB,mFAAgD;MACxE;QACE,IAAI,OAAE,wCAAgB,4CAAa,4BAAU,SAAQ;MACvD;iCACA,aAAe,IAAI;MACnB,WAAW,OAAE,mBAAiB,4BAAU,QAAQ;MAChD,WAAW,OAAE,mBAAiB,OAAO;;MAErC;;;;;;;;MAIA;MACA,UAAO,mDAA2B;;IAExC;;;EAEA;;IACE,SAAO,kBAAa;IACtB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,gCAAC;IACd;;EAEA;;IACE,gBAAc,SAAI;IACpB;;EAEA;;;;;;;IACE,IAAc,OAAc;IAC5B,2EAA6B;IAC7B,UAAO,+CAAyB;IAClC;;EAEA;;;;;;;QACO,0DAAqB;QACrB,oHAAwC;QACxC,yDAAqB;IAE1B,yBAAG,aAAuB;MACxB;IACF;IAEA;;IAKA,SAAS,OAAE,cAAY,gCAAc;IACrC,SAAS,OAAE,SAAO,4BAAU;IAE5B;IAEA,SAAS,OAAE,kBAAgB,OAAO;IAClC,SAAS,OAAE,wCAAgB,4CAAa,QAAO;IAE/C,gBAAc,SAAS;IACzB;;;EAEA;;;;;;;QAEO,gHAA0C;QAC1C,6GAAyC;QACzC,yDAAwB;QACxB,8DAAwB;QACxB,8DAAwB;QACxB,0DAAmB;QACnB,wDAAmB;QACnB,0DAAwB;QACxB,4DAAwB;QACxB,+DAAwB;QACxB,+DAAwB;IAE7B;IACA;IACA;IAGA,IACE,OAQA,AAQA,AAOA,AAOA,AAQA,AAMA,AAQA,AAKA,AAIA,AAIA,AAKA,AAMA,AAMA,AAOA,AAIA,AAoBA,AAIA,MAtHG,OAAL;;;MAGI,IAAI,OAAE,cAAY,8BAAY;MAC9B,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAS,+BAAC;iCAChB,SAAW,IAAI;MACf,OAAO,OAAE,kBAAgB,gCAAE;MAC3B,IAAI,OAAE,kBAAgB,oCAAG;;;MAGzB,IAAI,OAAE,cAAY,+BAAa;MAC/B,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAS,+BAAC;iCAChB,SAAW,IAAI;MACf,OAAO,OAAE,kBAAgB,gCAAE;MAC3B,IAAI,OAAE,kBAAgB,uCAAM;;;MAG5B,IAAI,OAAE,cAAY,8BAAY;MAC9B,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAmB,wBAAV,UAAY,gCAAC;iCAC5B,SAAW,IAAI;MACf,OAAO,OAAE,kBAAgB,SAAS;;;MAGlC,IAAI,OAAE,cAAY,8BAAY;MAC9B,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAS,SAAS;iCACxB,SAAW,IAAI;MACf,OAAO,OAAE,kBAA0B,wBAAV,UAAY,gCAAC;;;MAGtC,IAAI,OAAE,cAAY,+BAAa;MAC/B,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAS,gCAAE;iCACjB,SAAW,IAAI;MACf,OAAO,OAAE,kBAAgB,+BAAC;MAC1B,IAAI,OAAE,kBAAgB,oCAAG;;;MAGzB,IAAI,OAAE,cAAY,iCAAe;MACjC,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAS,SAAS;MACxB,IAAI,OAAE,aAAW,WAAW;;;MAG5B,IAAI,OAAE,cAAY,+BAAa;MAC/B,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAS,gCAAE;iCACjB,SAAW,IAAI;MACf,OAAO,OAAE,kBAAgB,+BAAC;MAC1B,IAAI,OAAE,kBAAgB,oCAAG;;;MAGzB,IAAI,OAAE,cAAY,gCAAc;MAChC,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,kBAAgB,oCAAG;;;MAGzB,IAAI,OAAE,cAAY,qCAAmB;MACrC,IAAI,OAAE,SAAO,2BAAS;;iCAEtB,OAAQ,8EAAkD;MAC1D,IAAI,OAAE,cAAY,kCAAgB;MAClC,IAAI,OAAE,SAAO,6BAAW;;iCAExB,OAAQ,6EAAiD;MACzD,IAAI,OAAE,cAAY,gCAAc;MAChC,IAAI,OAAE,SAAO,4BAAU;MACvB,IAAI,OAAE,WAAS,+BAAC;;;MAGhB,IAAI,OAAE,cAAY,kCAAgB;MAClC,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAS,+BAAC;MAChB,IAAI,OAAE,kBAAgB,0CAAS;;;MAG/B,IAAI,OAAE,cAAY,iCAAe;MACjC,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAS,+BAAC;MAChB,IAAI,OAAE,kBAAgB,yCAAQ;;;MAG9B,IAAI,OAAE,cAAY,+BAAa;MAC/B,IAAI,OAAE,SAAO,2BAAS;MACtB,IAAI,OAAE,WAAmB,wBAAV,UAAY,gCAAC;iCAC5B,SAAW,IAAI;MACf,OAAO,OAAE,kBAAgB,SAAS;;MAElC;MACA,UAAO,+CAA2B;MAClC;;;MAGA,IAAI,OAAE,cAAY,+BAAa;MAC/B,IAAI,OAAE,SAAO,0BAAQ;iCAErB,QAAU,IAAI;MACd,yBAAG,OAAiB;QAElB;QACA,iBAAgB,GAAb,cAAgB,mDAAe;UAEhC,kBAAe,qFAAsD;UACrE,MAAM,OAAE,gBAAa,oDAAgC;QACvD;UACE;UACA,MAAM,OAAE,gBAAa,+CAA2B;QAClD;MACF;QACE,MAAM,OAAE,gBAAa,0DAAgC;MACvD;;;MAGA,IAAI,OAAE,cAAY,kCAAgB;MAClC,IAAI,OAAE,SAAO,2BAAS;;;MAGtB,IAAI,OAAE,cAAY,+BAAa;MAC/B,IAAI,OAAE,SAAO,0BAAQ;iCAErB,QAAU,IAAI;MACd;MACA,MAAM,OAAE,gBAAa,8CAA0B;;MAE/C,sBAAQ,OAAO;MACf,oCAAS,GAAF,iCAAI,2DAAwB;;IAKvC;IACA;IACA;IAEA,iBAAgB,GAAb,cAAgB,qCAAG;MACpB,IAAI,OAAE,kBAAgB,YAAY;IACpC,wBAAmB,GAAZ,aAAe,oCAAE;MACtB,IAAI,OAAE,kBAAgB,WAAW;IACnC;IAIA;IAEA;IACA;IAEA,iBAAuB,GAApB,IAAI,OAAE,eAAgB,6CAAW;MAClC,IAAI,OAAE,kBAAgB,4CAAW;MACjC,IAAI,OAAE,kBAAgB,oEAAgC;IACxD,gCAAO,IAAI,OAAE,cAAwB;MACnC,iCAAwB,mBAAX,6BAAa,gCAAC;MAC3B,IAAI,OAAE,wCAAgB,8DAA8B,6BAAU;IAChE,wBAA2B,GAApB,IAAI,OAAE,eAAiB,sCAAI;MAChC;MACA,IAAI,OAAE,kBAAgB,IAAI,OAAE,aAAa;MACzC,IAAI,OAAE,wCAAgB,kEAAa,gCAAa,2CAAY,IAAI,OAAE,gBAAa;IACjF,wBAAuB,GAAhB,IAAI,OAAE,WAAY,gCAAa;MACpC,IAAI,OAAE,kBAAgB,IAAI,OAAE,aAAa;MACzC,IAAI,OAAE,wCAAgB,4CAAa,IAAI,OAAE,cAAa;IACxD;MACE,IAAI,OAAE,kBAAgB,IAAI,OAAE,aAAa;MACzC,IAAI,OAAE,wCAAgB,2CAAY,IAAI,OAAE,cAAa;IACvD;IAEA,iBAAe,GAAZ,aAAe,oCAAE;MAClB,OAAO,OAAE,oCAAY,sCAAQ,YAAW;IAC1C;IAEF;;AAEF","file":"cl_abap_typedescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_codepage.clas.mjs":{"lineLengths":[53,29,24,32,44,37,25,392,376,286,17,42,22,3,29,64,16,3,27,46,3,34,68,68,64,66,58,122,119,61,18,3,29,48,3,36,66,68,64,68,58,120,64,118,60,18,3,29,48,3,36,83,68,64,99,58,20,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_codepage.clas.abap"],"names":[],"mappings":";;AAuBA;;;;;;;;;;;;;;;;EACE;;;;;;;;;QACO,iHAAoC;IACzC,UAAO,uGAAiD;4DAEd;IAC5C;;EAEA;;;;;;;;;QACO,+GAAmC;QACnC,uDAAgB;IACrB,UAAO,sGAAgD;2DAG5B;IAC7B;;EAEA;;;;;;;IACE,oCAAgB,GAAT,UAAW,4CAAU;IAC5B,aAAW,uCAAM;IACnB;;AACF","file":"cl_abap_codepage.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_complexdescr.clas.mjs":{"lineLengths":[73,53,33,54,32,48,37,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_complexdescr.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cl_abap_complexdescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_datadescr.clas.mjs":{"lineLengths":[73,53,30,51,32,45,37,25,288,282,17,12,42,22,3,29,64,16,3,35,55,3,42,85,45,55,119,92,43,23,3,32,99,45,55,118,18,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_datadescr.clas.abap"],"names":[],"mappings":";;;AAeA;;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,8GAAmC;IACxC,WAAQ,2EAA6C;IACrD,gBAAc,KAAK,OAAE,SAAS;IAChC;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AAEF","file":"cl_abap_datadescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_codepage.clas.mjs":{"lineLengths":[56,53,34,29,32,49,37,25,231,217,17,42,22,3,29,64,16,3,21,45,3,28,122,97,20,3,22,46,3,29,124,98,20,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_codepage.clas.abap"],"names":[],"mappings":";;;AAkBA;;;;;;;;;;;;;;;EAEE;;;;;;IAEA;;EAEA;;;;;;IAEA;;AAEF","file":"cl_abap_conv_codepage.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_codepage.clas.locals.mjs":{"lineLengths":[53,45,14,32,61,54,25,22,17,42,22,3,29,64,16,3,40,66,68,58,120,118,60,18,3,1,59,15,32,62,55,25,22,17,42,22,3,29,64,16,3,41,68,66,58,122,119,61,18,3,1,61,25,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_codepage.clas.locals_imp.abap"],"names":[],"mappings":";;AAKA;;;;;;;;;;;;;;EACE;;;;QACO,+GAAmC;IACxC,UAAO,sGAAgD;2DAKnC;IACtB;;AACF;;AASA;;;;;;;;;;;;;;EACE;;;;QACO,iHAAoC;IACzC,UAAO,uGAAiD;4DAKnC;IACvB;;AACF","file":"cl_abap_conv_codepage.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_in_ce.clas.mjs":{"lineLengths":[53,31,26,32,46,37,168,151,185,866,251,261,327,248,17,42,22,71,75,108,3,29,64,16,3,23,44,3,30,119,83,64,115,67,55,96,73,117,104,73,104,91,58,95,57,77,29,79,76,85,80,12,130,5,34,46,15,3,21,42,3,28,93,42,49,59,46,18,17,9,49,17,114,14,16,7,5,16,3,22,43,3,29,63,61,55,49,121,22,133,88,58,15,3,24,37,52,57,43,64,49,101,80,46,37,107,9,33,13,43,5,60,95,102,22,5,3,21,57,43,64,49,65,3,1,56,108,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_in_ce.clas.abap"],"names":[],"mappings":";;AA6CA;;;;;;;;;;;;;;;;;;;;;;;EACE;;;;;;;;;;;;;;;;;;IACE,oCAAmB,GAAZ,aAAc,qCAAG;IACxB,4CAAO,OAAiB;;IAIxB,IACE,OAEA,KAHG,QAAL;;MAEI,GAAG,OAAE,mBAAiB,uCAAM;;MAE5B,GAAG,OAAE,mBAAiB,2CAAU;;MAEhC,oCAAS,GAAF,iCAAI,kDAAe;;IAG9B,GAAG,OAAE,aAAW,KAAK;IACrB,GAAG,OAAE,mBAAiB,WAAW;IACnC;;EAEA;;;;;;;QACO,kDAAU;QACV,qCAAmB;IACxB,QAAM,IAAI;IACV,QAAM,GAAG;IACT;MACI,UAAO,+BAAY;;;;;;IAGvB;IACF;;EAEA;;;;;;;QACO,wCAAsB;QACtB,gHAAqC;IAE1C,WAAS,KAAK;IAEd,sCAAY,0CAAY,wCAAe,MAAmB;IAE1D,WAAQ,uEAA2B;yDAMlB;IACnB;;EAEA;;;;;;;QACO,4FAAuB;IAE5B,4CAAO,8BAA6B;IACpC;IAEA;IACA;IACA;MACA;IACA;MACA,aAAW,sBAAS;IACpB;IAEA,iBAAY,GAAT,UAAW,uBAAS;MACrB;;;IACF;EAIF;EAEA;;;;;gEAMoB;EACpB;AAEF","file":"cl_abap_conv_in_ce.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_out_ce.clas.mjs":{"lineLengths":[53,32,27,32,47,37,172,149,711,228,215,336,130,160,50,17,42,22,75,72,3,29,64,16,3,23,45,3,30,121,83,64,104,73,104,66,58,71,73,78,29,146,76,85,79,12,130,5,15,3,22,44,3,29,59,42,49,124,68,89,61,114,43,137,15,3,22,43,49,65,50,89,3,22,68,31,18,3,21,43,3,28,47,42,49,50,124,45,89,62,81,16,3,17,42,3,24,42,49,57,43,68,55,66,20,27,23,48,84,12,82,5,37,3,1,58,60,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_conv_out_ce.clas.abap"],"names":[],"mappings":";;AAoDA;;;;;;;;;;;;;;;;;;;;;;;EACE;;;;;;;;;;;;;;;IAEE,IACE,OAEA,KAHG,QAAL;;MAEI,GAAG,OAAE,mBAAiB,uCAAM;;MAE5B,GAAG,OAAE,mBAAiB,0CAAS;;MAE/B,oCAAS,GAAF,iCAAI,kDAAe;;IAEhC;;EAEA;;;;;;;QACO,mHAAsC;QACtC,2DAAmB;IAExB,YAAS,uEAA2B;4DAKf;IACrB,oCAAyB,GAAlB,2BAAS,UAAW,gCAAC;IAC5B,QAAM,6BAAS;IACf,QAAU,mBAAJ,IAAkB,wBAAZ,yCAAc,mCAAG;IAC/B;;EAEA;;;QACO,wDAAgB;iDAEY;IACjC,sCAAY,gBAAU,cAAS,cAAsB;EACvD;EAEA;;IACE,WAAS,cAAS;IACpB;;EAEA;;;;;;;QACO,yCAAuB;QACvB,mHAAuC;IAE5C,YAAU,2BAAO;IACjB,YAAS,uEAA2B;6DAGM;IAE1C;IACF;;EAEA;IACE,sBAAM,cAAS;EACjB;EAEA;;;;;;;QACO,yDAAkB;IAEvB;IAEA,oBAAgB;MACd,WAAS,IAAI;MACb,WAAS,6BAAS;MAClB;IACF;MACE;IACF;IACA;EACF;AACF","file":"cl_abap_conv_out_ce.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_datfm.clas.mjs":{"lineLengths":[53,26,21,32,41,37,163,143,542,700,17,42,22,71,71,3,29,64,16,3,37,53,3,44,47,64,96,73,62,64,97,73,88,110,88,110,81,83,147,83,96,22,5,89,88,188,61,13,5,89,88,188,61,13,5,82,88,31,61,13,5,81,94,20,3,36,52,3,43,93,64,93,64,102,101,64,98,100,61,96,51,76,118,3,1,46,71,46,71,46,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_datfm.clas.abap"],"names":[],"mappings":";;AA4BA;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;QACO,+EAAgH,CAAA;;QAChH,+EAAgH,CAAA;;QAChH,wEAA0F,CAAA;;IAE/F,iBAAe,GAAZ,aAAe,qCACd,iBAAgB,GAAZ,aAAe,qCAAsB;MAC3C;;;IACF;;IAGA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,oCAAY,kEAAkB,4CAAkB,kCAAY;MAC5D,iBAAe,oCAAsB;MACrC;IACF;;IAGA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,oCAAY,uDAAgB,4CAAkB,6CAAc;MAC5D,iBAAe,oCAAsB;MACrC;IACF;;IAGA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,cAAY,SAAS;MACrB,iBAAe,oCAAsB;MACrC;IACF;IAEA;;;EACF;EAEA;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;AAEF","file":"cl_abap_datfm.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_dyn_prg.clas.mjs":{"lineLengths":[53,28,23,32,43,37,25,354,336,232,17,42,22,3,29,64,16,3,37,55,3,44,67,41,46,46,61,21,19,3,36,54,3,43,67,41,46,47,64,21,19,3,22,40,3,29,63,41,46,118,15,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_dyn_prg.clas.abap"],"names":[],"mappings":";;AA4BA;;;;;;;;;;;;;;;;EAEE;;;;;;;;;IAEE,YAAU,GAAG;IACf;;EAEA;;;;;;;;;IAEE,YAAU,GAAG;IACf;;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AAEF","file":"cl_abap_dyn_prg.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_elemdescr.clas.mjs":{"lineLengths":[73,53,30,51,32,45,37,167,160,158,909,2326,209,212,209,209,209,214,313,419,313,313,216,17,12,42,22,70,84,81,3,29,64,16,3,22,42,3,29,122,64,64,66,70,118,20,3,22,42,3,29,122,64,64,72,73,124,20,3,22,42,3,29,122,64,64,118,20,3,23,43,3,30,122,118,20,3,31,2089,101,61,100,53,49,60,67,43,49,84,22,3,17,37,3,24,122,59,116,20,3,20,40,3,27,122,63,116,20,3,22,42,3,29,122,63,116,20,3,17,37,3,24,122,57,116,20,3,17,37,3,24,122,56,116,20,3,17,37,3,24,122,56,116,20,3,22,42,3,29,122,64,64,72,73,124,20,3,33,788,68,67,570,127,66,36,42,44,48,56,48,71,5,26,3,1,54,582,793,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_elemdescr.clas.abap"],"names":[],"mappings":";;;AA8DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;QACO,+DAAoB;;+BAEzB,WAAY,gFAA8C;IAC5D;;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IACE,UAAU,MAAC,aAAW,kBAAa;IACnC,UAAU,MAAC,aAAW,cAAS;IAC/B,UAAU,MAAC,WAAW,eAAE,MAAC,MAAK;IAC9B,UAAU,MAAC,cAAW,+BAAC;IACvB,UAAU,MAAC,UAAW,WAAM;IAC5B,UAAU,MAAC,cAAW,aAAQ;IAE9B;IAGF;;EAEA;;;;;QACO,kDAAU;+BACf,WAAY,wEAA0C;IACxD;;EAEA;;;;;QACO,sDAAa;+BAClB,WAAY,wEAA0C;IACxD;;EAEA;;;;;QACO,sDAAe;+BACpB,WAAY,wEAA0C;IACxD;;EAEA;;;;;QACO,gDAAU;+BACf,WAAY,wEAA0C;IACxD;;EAEA;;;;;QACO,+CAAU;+BACf,WAAY,wEAA0C;IACxD;;EAEA;;;;;QACO,+CAAU;+BACf,WAAY,wEAA0C;IACxD;;EAEA;;;;;;;QACO,+DAAoB;;+BAEzB,WAAY,gFAA8C;IAC5D;;EAEA;;QAEO,2DAAoB;QACpB,0DAAoB;QACpB,ijBAAoC;IAEzC;IAEA;MACA,sBAAM,MAAM;MACZ;MACA;MACA;MACA;MACA;MACA,gCAAO,gBAAU,cAAc;IAC/B;IAEF;;AAEF","file":"cl_abap_elemdescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_enumdescr.clas.mjs":{"lineLengths":[73,53,30,51,32,45,37,582,22,17,12,42,22,484,3,29,64,16,3,1,54,276,498,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_enumdescr.clas.abap"],"names":[],"mappings":";;;AAUA;;;;;;;;;;;;;;;;AAEA","file":"cl_abap_enumdescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_exceptional_values.clas.mjs":{"lineLengths":[53,39,34,32,54,37,25,267,250,17,42,22,3,29,64,16,3,30,59,3,37,72,42,46,50,65,67,74,58,28,85,56,95,101,100,77,137,63,144,65,144,72,14,122,7,12,25,120,5,15,3,30,59,3,37,72,42,46,50,74,58,28,85,56,95,54,77,85,12,25,120,5,15,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_exceptional_values.clas.abap"],"names":[],"mappings":";;AAeA;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,yCAA2B;QAC3B,wDAAkB;QAClB,0DAAkB;IACvB,IAAc,OAAc;IAE5B,mDAA+B;IAE/B,IACE,OAEA,KAHG,OAAL;;MAEiD,WAA5B,6BAAc,QAAiB;;MAEhD,4FAAqE;;MAGrE,oEAAsB;MAEtB,iBAAa,GAAV,WAAY,gCAAE,iBAAgB,GAAZ,aAAc,gCAAC;QAClC,YAAQ,yCAAQ;MAClB,wBAAiB,GAAV,WAAY,gCAAE,iBAAgB,GAAZ,aAAc,gCAAC;QACtC,YAAQ,2CAAU;MACpB,wBAAiB,GAAV,WAAY,gCAAE,iBAAgB,GAAZ,aAAc,gCAAC;QACtC,YAAQ,kDAAgB;MAC1B;QACE,oCAAS,GAAF,iCAAI,wCAAM;MACnB;;MAEA;MACA,oCAAS,GAAF,iCAAI,wCAAM;;IAEvB;;EAEA;;;;;;;QACO,yCAAuB;IAC5B,IAAc,OAAc;IAE5B,mDAA+B;IAE/B,IACE,OAEA,KAHG,OAAL;;MAEiD,WAA5B,6BAAc,QAAiB;;MAEhD,SAAM,qCAAoB;MAC1B,oEAAsB;MACtB,YAAc,wBAAN,QAAQ,iCAAE;;MAElB;MACA,oCAAS,GAAF,iCAAI,wCAAM;;IAEvB;;AAEF","file":"cl_abap_exceptional_values.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_format.clas.mjs":{"lineLengths":[53,27,22,32,42,37,165,144,146,138,144,22,17,42,22,50,50,54,38,48,3,29,64,16,3,1,48,74,34,74,34,76,37,68,29,73,33,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_format.clas.abap"],"names":[],"mappings":";;AASA;;;;;;;;;;;;;;;;;;;;;;;AAEA","file":"cl_abap_format.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_gzip.clas.mjs":{"lineLengths":[53,25,20,32,40,37,25,402,493,583,691,290,17,42,22,3,29,64,16,3,46,61,3,53,69,61,69,58,38,50,74,28,3,32,47,3,39,39,58,67,73,113,106,70,121,46,61,68,73,118,3,30,45,3,37,45,58,67,73,113,70,82,118,106,70,121,40,61,68,73,118,3,34,49,3,41,69,61,69,58,67,70,38,50,78,28,58,3,32,47,3,39,70,82,68,58,70,61,68,73,38,49,71,22,60,3,1,44,22,46],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_gzip.clas.abap"],"names":[],"mappings":";;AAyDA;;;;;;;;;;;;;;;;;;EACE;;;;;;;;IACE;IACA;IACA;IAEA;EACF;EAEA;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;IACE;IACA;IACA;IAEA;IACA,gBAAc,2BAAS,SAAS;EAClC;EAEA;;;;;;;;;;;;IAEE;IACA;IACA;IAEA;IACA,iBAAe,2BAAS,UAAU;EACpC;AACF","file":"cl_abap_gzip.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_hmac.clas.mjs":{"lineLengths":[53,25,20,32,40,37,25,640,738,17,42,22,3,29,64,16,3,39,54,3,46,72,76,122,68,58,69,61,73,76,76,79,72,41,42,65,248,42,39,57,42,60,12,146,30,5,38,3,40,55,3,47,72,76,122,68,58,67,61,73,76,76,79,76,85,118,3,1,44,22,46],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_hmac.clas.abap"],"names":[],"mappings":";;AA0BA;;;;;;;;;;;;;;;EACE;;;;;;;;;;;;;;;QAEO,+DAAwB;IAE7B,sBAAM,aAAa;IACnB,sBAAM,cAAc;IAEpB,iBAAe,4BAAU,cAAc;IACvC,oCAAoB,GAAb,cAAe,wCAAO,iBAAgB,GAAb,cAAe,uCAAM,iBAAgB,GAAb,cAAe,0CAAQ;IAG/E;IACA,yBAAG,OAAiB;MAClB;MACA;MACA;IACF;MACE;MACA;IACF;IAEA,mBAAiB,aAAa;EAEhC;EAEA;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;AACF","file":"cl_abap_hmac.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_intfdescr.clas.mjs":{"lineLengths":[77,53,30,53,32,45,37,25,22,17,12,42,22,3,29,64,16,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_intfdescr.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cl_abap_intfdescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_matcher.clas.mjs":{"lineLengths":[53,28,23,32,43,37,951,141,144,148,382,943,189,260,154,187,155,17,42,22,854,65,68,71,3,29,45,58,104,73,42,49,63,111,12,91,5,33,27,16,3,17,100,140,115,19,3,20,853,36,22,3,21,98,89,70,113,17,3,29,65,61,55,653,207,68,23,70,26,88,110,5,17,3,22,62,653,68,23,38,18,3,22,62,653,68,23,38,18,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_matcher.clas.abap"],"names":[],"mappings":";;AA2CA;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;IACE,iBAAe,GAAZ,aAAc,uBAAS;;IAE1B;;IAEA;IACA,oBAAa,OAAO;IACpB,iBAAU,IAAI;IAChB;;EAEA;;;IAEE,YAAU,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IACjC;;EAEA;;IACE,eAAa,eAAU;IACzB;;EAEA;;IACE,kBAAoB,mBAAT,cAAW,gCAAC;IACvB,gEAA2D;IAC3D,UAAQ,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAC/B;;EAEA;;;;QACO,ooBAAgC;QAChC,sMAA4C;IACjD;qBAAkD;IAClD;wBAA2D;IAC3D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,UAAQ,4FAA8C;IACxD;IACF;;EAEA;;QACO,ooBAAgC;IACrC;qBAAkD;IAClD,WAAS,QAAQ,MAAC,OAAM;IAC1B;;EAEA;;QACO,ooBAAgC;IACrC;qBAAkD;IAClD,WAAS,QAAQ,MAAC,OAAM;IAC1B;;AAEF","file":"cl_abap_matcher.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_math.clas.mjs":{"lineLengths":[53,25,20,32,40,37,162,141,146,141,146,148,148,143,145,22,17,42,22,42,42,52,42,52,56,56,46,48,3,29,64,16,3,1,44,69,39,69,38,74,34,69,29,74,34,76,36,76,36,71,31,72,32,22,46],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_math.clas.abap"],"names":[],"mappings":";;AAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA","file":"cl_abap_math.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_message_digest.clas.mjs":{"lineLengths":[53,35,30,32,50,37,25,419,517,17,42,22,3,29,64,16,3,39,64,3,46,72,76,122,69,61,76,79,72,65,248,42,55,40,59,3,40,65,3,47,72,76,122,67,61,76,79,76,85,72,65,248,42,55,33,59,86,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_message_digest.clas.abap"],"names":[],"mappings":";;AAsBA;;;;;;;;;;;;;;;EACE;;;;;;;;;;;QAEO,+DAAwB;IAE7B,iBAAe,4BAAU,cAAc;IACvC,oCAAoB,GAAb,cAAe,wCAAO,iBAAgB,GAAb,cAAe,uCAAM,iBAAgB,GAAb,cAAe,0CAAQ;IAG/E;IACA;IACA;IACA;EAEF;EAEA;;;;;;;;;;;;;QAEO,+DAAwB;IAE7B,iBAAe,4BAAU,cAAc;IACvC,oCAAoB,GAAb,cAAe,wCAAO,iBAAgB,GAAb,cAAe,uCAAM,iBAAgB,GAAb,cAAe,0CAAQ;IAG/E;IACA;IACA;IACA;IACA;EAEF;AACF","file":"cl_abap_message_digest.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_random.clas.mjs":{"lineLengths":[53,27,22,32,42,37,25,323,151,357,150,17,42,22,3,29,64,16,3,23,40,3,30,117,60,52,79,21,3,15,66,59,22,3,16,33,3,23,63,56,19,3,27,66,59,49,60,52,67,55,82,104,66,63,55,22,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_random.clas.abap"],"names":[],"mappings":";;AAyBA;;;;;;;;;;;;;;;;;EACE;;;;;;;;IAEA;;EAEA;;IAEE;IACF;;EAEA;;;;;IACE;IACF;;EAEA;;;;;;QAEO,0DAAkB;IAEvB,oCAAY,GAAL,MAAO,IAAG;IACjB,oCAAW,GAAJ,KAAO,gCAAC;IACf,gBAAyB,mBAAN,qBAAL,KAAO,KAAM,gCAAC;IAC5B,gBAAa,wBAAK,oBAAQ;IAC1B,eAAwB,mBAAX,WAAe,YAAW;IACvC,eAAwB,mBAAX,WAAa,IAAG;IAC/B;;AACF","file":"cl_abap_random.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_random_int.clas.mjs":{"lineLengths":[53,31,26,32,46,37,160,140,524,152,17,42,22,63,63,3,29,64,16,3,23,44,3,30,120,60,52,59,49,106,59,49,105,78,31,31,16,3,20,61,127,17,3,1,56,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_random_int.clas.abap"],"names":[],"mappings":";;AAsBA;;;;;;;;;;;;;;;;;;EACE;;;;;;;;;;;;;;IAEE,IAAI,OAAE,WAAS,GAAG;IAClB,IAAI,OAAE,WAAS,GAAG;IACpB;;EAEA;;IACE,WAAQ,8GAES;IACnB;;AACF","file":"cl_abap_random_int.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_refdescr.clas.mjs":{"lineLengths":[73,53,29,50,32,44,37,223,237,218,17,12,42,22,125,3,29,64,16,3,31,118,30,16,3,27,46,3,34,120,72,116,20,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_refdescr.clas.abap"],"names":[],"mappings":";;;AAaA;;;;;;;;;;;;;;;;;EACE;;IACE,SAAO,eAAU;IACnB;;EAEA;;;;;QACO,+DAAoB;+BACzB,WAAY,wEAA0C;IACxD;;AACF","file":"cl_abap_refdescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_regex.clas.mjs":{"lineLengths":[53,26,21,32,41,37,168,185,300,298,434,17,42,22,71,108,3,29,45,58,104,73,104,33,41,16,3,28,44,3,35,111,45,58,104,73,104,118,17,3,31,120,42,49,153,22,3,1,46,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_regex.clas.abap"],"names":[],"mappings":";;AA2BA;;;;;;;;;;;;;;;EAEE;;;;;;IACE,oBAAa,OAAO;IACpB,wBAAiB,WAAW;IAC9B;;EAEA;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IAMA;;AAEF","file":"cl_abap_regex.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_structdescr.clas.mjs":{"lineLengths":[79,53,32,56,32,47,37,662,164,738,79,307,714,2681,191,310,673,868,1007,564,17,12,42,22,565,88,661,3,29,64,16,3,23,470,118,20,3,20,42,3,27,126,617,76,118,20,3,23,45,3,30,121,617,76,101,64,417,477,100,94,103,23,5,72,35,58,95,106,25,65,95,106,25,122,95,106,25,7,5,78,72,35,36,53,52,74,5,40,66,56,15,3,34,471,63,61,363,262,477,75,35,37,54,59,83,86,29,59,90,49,7,77,17,7,71,5,20,3,36,2282,101,61,100,117,112,130,618,417,2088,67,71,126,2120,53,108,59,73,35,39,43,61,109,74,67,7,73,5,72,32,72,76,79,29,52,108,62,5,25,3,24,97,24,16,3,36,58,3,43,123,43,49,67,477,69,106,126,73,80,55,40,81,125,37,41,43,37,90,7,49,39,34,81,7,41,76,5,42,17,3,29,363,477,43,72,29,42,53,73,67,71,78,5,3,26,618,363,408,477,75,35,33,50,59,83,86,29,59,90,45,7,67,5,25,3,35,125,45,55,475,55,64,67,27,40,88,68,12,38,5,23,3,1,58,426,632,488,486,490,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_structdescr.clas.abap"],"names":[],"mappings":";;;AAiFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;QACO,wZAAsC;QACtC,odAAiC;IAEtC,iBAAyB,GAAtB,yBAAO,gBAAiB,gCAAC;MAC1B;;;IACF;;;MAGE,yBAAG,YAAY,MAAC,MAAe;QAC7B;;;MACF,gCAAO,YAAY,MAAC,MAAe;QACjC;;;MACF,wBAAmC,GAA5B,0BAAQ,YAAY,MAAC,SAAS,iCAAE;QACrC;;;MACF;IACF;;;;MAIE,sBAAM,MAAM;MACZ,MAAM,MAAC,UAAO,YAAY,MAAC,KAAI;MAC/B,MAAM,MAAC,SAAO,YAAY,MAAC,KAAI;MAC/B,gCAAO,gBAAU,GAAG,OAAE,OAAO;IAC/B;uCACyB;IAEzB,GAAG,OAAE,cAAY,oCAAgB;IACjC,GAAG,OAAE,SAAO,+BAAW;IACzB;;EAEA;;;;QACO,kWAAoC;QACpC,6PAAkC;QAClC,odAAiC;;;MAGpC,sBAAM,OAAO;MAEb,OAAO,MAAC,UAAO,YAAY,MAAC,KAAI;MAChC;;;;yDAAgE;MAChE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,OAAO,MAAC,UAAO,MAAM,MAAC,IAAG;MAC3B;MACA,iBAAqB,GAAlB,MAAM,MAAC,aAAa,uBAAS;QAC9B;MACF;MAEA,8DAAkC;IACpC;IACF;;EAEA;;;;;;;;QAEO,imBAAkC;QAClC,wZAAwC;QACxC,+hEAAwC;QACxC,0DAAyB;QACzB,8DAAyB;QACzB,qHAA2C;IAChD,IAAc,aAAsC;IAEpD,mBAAgB,4BAAiB;IAEjC,oCAAqB,GAAd,oBAAiB,2CAAS;IACjC,YAAU,yCAAe;;;MAGvB,sBAAM,SAAS;MACf,SAAS,MAAC,aAAU,OAAO;MAC3B,SAAS,MAAC,eAAY,YAAY,MAAC,KAAI;MACvC,iBAA2B,GAAxB,YAAY,MAAC,KAAI,OAAE,MAAO,kCAAmB,UAAS;mCACvD,cAAgB,YAAY,MAAC,KAAI;QACjC,SAAS,MAAC,UAAO,YAAY,OAAE,aAAa;MAC9C;MAEA,gCAAO,mBAAa,aAAa;IACnC;IAGA;MACA;MAEA;;;;kDAA+E;MAC/E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,aAAW,MAAC,aAAU,sBAAS;IAC/B;IAEF;;EAEA;;IACE,SAAO,SAAI;IACb;;EAEA;;;;;;;QAEO,0DAAyB;QACzB,odAAkC;QAClC,4DAAyB;QACzB,iGAA4B;QAC5B,qHAA2C;IAEhD,IAAc,MAAa;;IAK3B;MACA;MACA,wEAAkD;iCAClD,eAAgB,2EAA2C;MAC3D,MAAM,MAAC,UAAO,OAAO;MACrB,MAAM,MAAC,SAAO,YAAY;MAE1B,sBAAM,aAAa;MACnB;QACA;MACA;MACA,MAAM,MAAC,gBAAa,aAAa;MAEjC,sBAAM,SAAS;MACf;QACA;MACA;MACA,MAAM,MAAC,YAAS,SAAS;MAEzB,gCAAO,gBAAU,KAAK,OAAE,OAAO;IAC/B;yCAE2B;IAC7B;;EAEA;QACO,kWAAoC;QACpC,odAAiC;IAEtC,sBAAM,eAAU;;;MAEd,sBAAM,YAAY;MAClB,YAAY,MAAC,UAAO,MAAM,MAAC,KAAI;MAC/B,YAAY,MAAC,eAAY,MAAM,MAAC,IAAG,OAAE,SAAS;MAC9C,YAAY,MAAC,YAAS,MAAM,MAAC,IAAG,OAAE,MAAM;MACxC,YAAY,MAAC,cAAW,MAAM,MAAC,IAAG,OAAE,QAAQ;MAC5C,gCAAO,sBAAgB,eAAU;IACnC;EACF;EAEA;;QACO,kWAAoC;QACpC,+YAAuC;QACvC,odAAiC;;;MAGpC,sBAAM,GAAG;MACT,GAAG,MAAC,UAAO,YAAY,MAAC,KAAI;MAC5B;;;;yDAAgE;MAChE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,GAAG,MAAC,UAAO,MAAM,MAAC,IAAG;MACvB;MAGA,gCAAO,aAAO,aAAa;IAC7B;IACF;;EAEA;;;;QACO,kdAAyB;IAC9B;;;;sCAAmD;IACnD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;MACE,gBAAc,IAAI,MAAC,IAAG;IACxB;IACF;;AAEF","file":"cl_abap_structdescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_tabledescr.clas.mjs":{"lineLengths":[73,53,31,52,32,46,37,205,429,164,162,203,1108,133,133,135,136,136,138,140,135,137,323,219,362,1454,1160,1121,17,12,42,22,108,353,88,86,127,1032,58,58,62,64,64,68,72,62,64,3,29,64,16,3,23,44,3,30,119,125,73,87,76,101,101,64,98,354,55,86,70,102,77,43,44,29,42,43,63,54,15,3,20,1030,29,18,3,30,51,3,37,124,125,73,1030,58,825,94,120,5,77,21,106,82,62,49,58,60,39,68,59,20,3,20,41,3,27,119,118,52,118,15,3,36,57,3,43,121,43,49,64,100,66,67,127,618,417,153,79,77,44,59,29,83,67,88,70,88,70,12,67,5,33,113,80,59,70,65,22,38,74,7,191,77,7,12,73,97,72,68,77,39,57,76,9,7,5,17,3,31,118,56,16,3,1,56,67,42,67,42,69,44,70,45,70,45,72,47,74,49,69,44,70,45,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_tabledescr.clas.abap"],"names":[],"mappings":";;;AAyDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;;;;;;;;IAGE,GAAG,OAAE,mBAAiB,QAAQ;IAC9B,GAAG,OAAE,iBAAiB,WAAW;IACjC,GAAG,OAAE,QAAiB,KAAK;IAC3B,GAAG,OAAE,gBAAiB,UAAU;IAChC,GAAG,OAAE,eAAiB,YAAY;IAGlC,GAAG,OAAE,cAAiB,iCAAc;IACpC,GAAG,OAAE,SAAiB,6BAAU;IAElC;;EAEA;;IACE,WAAS,YAAO;IAClB;;EAEA;;;;;;;;;QAEO,gzBAA0B;IAE/B,iBAAmB,GAAhB,yBAAO,UAAY,gCAAC;MACrB,oCAAS,GAAF,iCAAI,wCAAM;IACnB;IACA;mBAAqC;IACrC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;IAGnB,QAAQ,OAAE,mBAAiB,MAAM,MAAC,UAAS;IAC3C,QAAQ,OAAE,iBAAiB,WAAW;IACtC,QAAQ,OAAE,gBAAiB,MAAM,MAAC,SAAQ;IAC1C,QAAQ,OAAE,eAAiB,MAAM,MAAC,YAAW;IAC7C,QAAQ,OAAE,YAAiB,MAAM;IAGjC,QAAQ,OAAE,cAAiB,iCAAc;IACzC,QAAQ,OAAE,SAAiB,6BAAU;IAEvC;;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;QAEO,uDAAoB;QACpB,2FAA4B;QAC5B,yDAAyB;QACzB,0DAAyB;QACzB,sHAA6C;QAC7C,imBAAuD;QACvD,wZAAwC;QACxC,gJAA4C;;IAIjD;IACA,KAAK,OAAE,mBAAiB,OAAO;IAE/B;IACA,IACE,OAEA,AAEA,MALG,OAAL;;MAEI,KAAK,OAAE,eAAa,gCAAa;;MAEjC,KAAK,OAAE,eAAa,mCAAgB;;MAEpC,KAAK,OAAE,eAAa,mCAAgB;;MAEpC,KAAK,OAAE,eAAa,gCAAa;;IAGrC;IACA,KAAK,OAAE,kBAAe,6EAA+C;IAErE;IACA,iBAAW,GAAR,SAAU,uBAAS;MACpB,KAAK,OAAE,gBAAc,kCAAe;MAEpC;QACA;QACA,MAAM,MAAC,UAAO,MAAM;QACpB,gCAAO,gBAAU,KAAK,OAAE,GAAG;MAC3B;MAEA,iBAAuB,GAApB,yBAAO,KAAK,OAAE,OAAQ,gCAAE,iBAAgB,GAAZ,MAAM,MAAC,OAAO,+CAAY;QACvD,KAAK,OAAE,gBAAc,uCAAoB;MAC3C;IACF;MAEE,KAAK,OAAE,gBAAc,qCAAkB;MACvC,iBAA6B,GAA1B,KAAK,OAAE,YAAY,OAAE,MAAO,+BAAW;mCACxC,WAAa,KAAK,OAAE,YAAY;QAChC,mBAAgB,uCAA4B;;;UAE1C,MAAM,MAAC,UAAO,YAAY,MAAC,KAAI;UAC/B,gCAAO,gBAAU,KAAK,OAAE,GAAG;QAC7B;MACF;IACF;IAEF;;EAEA;;+BACE,MAAQ,iBAAY;IACtB;;AACF","file":"cl_abap_tabledescr.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_timefm.clas.mjs":{"lineLengths":[53,27,22,32,42,37,25,414,17,42,22,3,29,64,16,3,37,54,3,44,46,61,106,79,108,61,61,67,83,126,88,92,97,22,5,26,143,26,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_timefm.clas.abap"],"names":[],"mappings":";;AAYA;;;;;;;;;;;;;;EACE;;;;;;;;;;;QACO,0DAAmB;IAGxB,oCAAqB,GAAd,eAAgB,uBAAS;;IAGhC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;;;IACF;IAEA,YAAU,QAAQ;IAClB,wIAAiD;IACjD,aAAW,OAAO;EACpB;AACF","file":"cl_abap_timefm.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_tstmp.clas.mjs":{"lineLengths":[53,26,21,32,41,37,25,380,384,393,547,262,374,329,552,404,17,42,22,3,29,64,16,3,23,39,3,30,57,52,57,52,63,49,61,61,61,61,118,3,37,53,3,44,97,67,62,64,62,64,118,3,21,37,3,28,68,67,68,64,29,3,37,53,3,44,62,67,62,67,68,64,125,3,25,41,3,32,62,65,58,65,58,63,99,35,99,35,31,18,3,20,36,3,27,92,64,55,63,49,63,98,51,50,97,16,3,29,45,3,36,92,64,55,63,49,63,80,62,16,3,30,46,3,37,97,97,67,66,21,3,28,44,3,35,58,55,58,55,58,55,58,55,67,61,97,97,75,75,80,3,1,46,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_tstmp.clas.abap"],"names":[],"mappings":";;AA4EA;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;IAGE,cAAY,SAAS;EACvB;EAEA;;;;;;;;;;IAEE,uHAAwC;EAC1C;EAEA;;;;;;;;;QACO,sDAAe;IACpB,6FAAkC;IAClC;IACA,6FAAkC;IAClC;IACA;IACF;;EAEA;;;;;;;;;QACO,sDAAe;IACpB,4FAAiC;IACjC;IACA;IACA;IACF;;EAEA;;;;;;;;;QACO,sDAAc;IACnB,YAAe,wBAAL,KAAO,iCAAE;IACnB,UAAO,8CAEY;IACrB;;EAEA;;;;;;;iEAK6B;IAC7B;;EAEA;;;;;;;;;;;;;;QACO,wFAAwB;QACxB,wFAAwB;;;IAK7B,cAAW,4DAEW;EACxB;AACF","file":"cl_abap_tstmp.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_unit_assert.clas.mjs":{"lineLengths":[54,53,32,27,32,47,37,25,238,598,315,502,649,424,420,211,412,534,471,472,522,500,418,422,511,17,42,22,3,29,64,16,3,31,53,3,38,42,46,42,46,61,121,121,101,152,75,152,75,90,278,104,23,5,60,60,113,113,199,70,36,46,72,38,15,69,49,18,23,102,20,22,13,11,9,65,158,108,27,9,7,12,61,62,71,56,47,57,32,34,57,32,34,65,7,52,5,3,36,58,3,43,45,58,42,49,41,46,60,52,61,55,101,96,61,130,104,23,5,3,22,44,3,29,41,46,44,55,63,52,98,118,3,29,51,3,36,42,46,41,46,60,52,61,55,36,151,104,23,5,3,33,55,3,40,42,46,41,46,60,52,61,55,46,155,104,23,5,3,31,53,3,38,41,46,41,46,63,49,60,52,61,55,36,125,104,23,5,3,31,53,3,38,41,46,41,46,41,46,60,52,61,55,36,164,104,23,5,3,21,43,3,28,41,46,60,52,61,55,44,55,95,102,21,3,21,43,3,28,41,46,44,55,11,3,31,53,3,38,42,46,42,46,41,46,60,52,61,55,9,53,178,104,23,17,96,15,14,16,7,5,3,28,50,3,35,96,49,41,46,60,52,61,55,55,143,104,23,5,3,29,51,3,36,96,49,41,46,60,52,61,55,56,144,104,23,5,3,30,52,3,37,42,46,42,46,41,46,57,49,60,52,61,55,48,48,58,66,66,66,56,56,82,50,86,145,108,27,9,7,96,42,143,106,25,7,5,71,54,36,46,39,89,106,25,7,43,101,101,70,24,14,139,7,134,104,23,5,3,35,57,3,42,42,46,41,46,60,52,61,55,66,36,22,41,78,7,100,104,23,5,3,31,53,3,38,42,46,41,46,60,52,61,55,66,46,22,41,74,7,100,104,23,5,3,29,51,3,36,59,49,96,59,49,92,41,46,60,52,61,55,36,220,104,23,5,3,38,60,3,45,61,55,61,55,62,58,41,46,60,52,61,55,75,87,104,23,5,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_unit_assert.clas.abap"],"names":[],"mappings":";;;AAkJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;QAEO,oDAAe;QACf,gHAAuC;QACvC,gHAAuC;QACvC,4FAAuB;IAE5B,IAAc,QAAuB;IACrC,IAAc,QAAe;IAC7B,IAAc,QAAuB;IACrC,IAAc,QAAe;IAE7B,iBAAgB,GAAb,yBAAO,OAAS,yBAAO,MAAK;MAC7B;;;IAGF;IAEA,qDAAoB;IACpB,qDAAoB;+BAEpB,QAAS,wEAA0C;+BACnD,QAAS,wEAA0C;IAEnD,iBAAqB,GAAlB,KAAK,OAAE,YAAa,mCAAoB,iBACvC,iBAAqB,GAAlB,KAAK,OAAE,YAAa,mCAAoB,iBAAgB;;;QAE3D,aAAW,uBAAU;;;UAEnB;oEAGoB;YAChB,aAAW,sBAAS;YACpB;;;;;;UAEJ;QACF;QACA,iBAAY,GAAT,UAAW,wBAAU;UACtB;;;QAGF;MACF;IACF;;;;;QAEI,UAAQ,eAAE,MAAC,MAAK;QAChB;8BAA8C;iCAC/B;QACf;8BAA8C;iCAC/B;gEAGC;MAClB;;IACF;EAEF;EAEA;;;;;;;;;;;;;;QACO,4FAAuB;IAC5B,aAAW,yBAAO,uBAChB,KAAQ,MACR,OAAQ,WAAW;IACrB,iBAAY,GAAT,UAAW,wBAAU;MACtB;;;IAKF;EACF;EAEA;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;IACE,yBAAG,IAAgB;MACjB;;;IAGF;EACF;EAEA;;;;;;;;;;;;IACE,yBAAG,cAAY;MACb;;;IAGF;EACF;EAEA;;;;;;;;;;;;;;IACE,iBAAO,GAAJ,KAAO,IAAG;MACX;;;IAKF;EACF;EAEA;;;;;;;;;;;;;;IACE,iBAAO,GAAJ,KAAO,IAAG;MACX;;;IAGF;EACF;EAEA;;;;;;;;;;;;IACE;;;EAGF;EAEA;;;;;;;;IACE;EACF;EAEA;;;;;;;;;;;;;;IACE;oDAGiB;MACb;;;;;;;;;IAOJ;EACF;EAEA;;;;;;;;;;;;IACE,iBAAO,GAAJ,KAAO,uBAAS;MACjB;;;IAGF;EACF;EAEA;;;;;;;;;;;;IACE,iBAAO,GAAJ,KAAO,wBAAU;MAClB;;;IAGF;EACF;EAEA;;;;;;;;;;;;;;;;QACO,uCAAsB;QACtB,uCAAsB;QACtB,iDAAa;QACb,yDAAkB;QAClB,yDAAkB;QAClB,yDAAkB;IAEvB,iDAA6B;IAC7B,iDAA6B;IAG7B,iBAAS,GAAN,OAAS,gDAAa;MACvB,yBAAG,gBAAoB;QACrB,iBAAS,GAAN,OAAS,gDAAa;UACvB;;;QAGF;MACF;IACF,gCAAO,gBAAqB,yBAAI,gBAAoB;MAElD,iBAAS,GAAN,OAAS,MAAK;QACf;;;MAGF;IACF;IAEA,iBAAS,GAAN,OAAQ,qCAAG;qDAGC;IACf,6BAAsB;MACpB,SAAW,qBAAJ,IAAM,IAAG;MAGhB,iBAAQ,GAAL,MAAQ,IAAG;QACZ;;;MACF;IACF,wBAAW,GAAJ,KAAO,IAAG;MACf,YAAS,iFAA0B;MACnC,YAAS,iFAA0B;MACnC,iBAAO,GAAJ,KAAO,oCAAE;QACV,WAAS,GAAG;MACd;QACE,iIAAkD;MACpD;MACA;;;IAKF;EACF;EAEA;;;;;;;;;;;;QACO,yDAAkB;IACvB,yBAAG,IAAc;MACf,WAAS,GAAG;MACZ,yBAAG,OAAiB;QAClB,oEAAqC;MACvC;MACA;;;IAGF;EACF;EAEA;;;;;;;;;;;;QACO,yDAAkB;IACvB,yBAAG,cAAkB;MACnB,WAAS,GAAG;MACZ,yBAAG,OAAiB;QAClB,gEAAiC;MACnC;MACA;;;IAGF;EACF;EAEA;;;;;;;;;;;;;;;;IACE,iBAAO,GAAJ,KAAO,IAAG;MACX;;;IAGF;EACF;EAEA;;;;;;;;;;;;;;;;IACE,iBAAU,GAAP,QAAS,MAAM,iBAAU,GAAP,QAAS,MAAK;MACjC;;;IACF;EACF;AAEF","file":"cl_abap_unit_assert.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_unit_assert.clas.locals.mjs":{"lineLengths":[53,43,16,32,61,37,25,265,243,17,42,22,3,29,64,16,3,26,37,3,33,66,45,55,50,61,29,145,64,83,56,12,84,5,18,3,31,42,3,38,66,45,55,255,67,66,73,105,73,30,73,84,7,83,108,59,202,5,18,3,1,61,18,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_unit_assert.clas.locals_imp.abap"],"names":[],"mappings":";;AAaA;;;;;;;;;;;;;;;EACE;;;;;;;QACO,yCAAuB;IAE5B,sDAAkC;IAClC,IAEE,OAEA,MAJG,OAAL;;MAGI,YAAS,4CAAwB;;MAEjC,gDAAiB;;MAEjB,4EAAqB;;IAE3B;;EAEA;;;;;;;QACO,sPAA4D;QAC5D,0DAAwC;QACxC,yDAAyB;IAC9B,IAAc,MAAa;IAG3B;;;MAEE,iBAAU,GAAP,QAAU,oCAAE;QACb,iCAAS,yCAAc;MACzB;MACA,0EAAoD;MACpD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,YAAS,uCAAiB;MAC1B,iCAAS,6BAAU,oIAA+B;IACpD;IACF;;AACF","file":"cl_abap_unit_assert.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_zip.clas.mjs":{"lineLengths":[46,53,24,19,32,39,37,538,619,276,151,151,258,253,256,17,42,22,441,542,3,29,64,16,3,22,36,3,29,59,69,61,133,92,114,15,3,23,64,52,61,55,100,118,3,20,64,52,69,58,65,359,66,62,65,27,38,140,3,20,64,52,69,61,359,37,43,114,81,3,21,65,49,118,3,16,65,132,131,134,359,71,68,64,125,93,91,70,75,33,85,92,89,85,85,85,85,85,120,107,104,88,85,55,74,92,88,46,90,84,84,84,84,112,58,74,5,78,75,88,80,80,92,92,110,57,80,42,15,3,1,42,243,446,363,21,45],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_zip.clas.abap"],"names":[],"mappings":";;;AAmDA;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,4HAAgC;;IAErC,SAAM,mGAEwB;IAChC;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;QACO,wDAAkB;QAClB,8VAAoC;IAEzC;;;;oCAA4D;2IAM/B;EAC/B;EAEA;;;;;QACO,8VAAoC;IAEzC,WAAW,MAAC,UAAO,IAAI;IACvB,WAAW,MAAC,aAAU,OAAO;iHAKU;IACvC,0EAAyC;EAC3C;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;QAIO,2HAAkC;QAClC,0HAAkC;QAClC,6HAAkC;QAClC,8VAAoC;QACpC,8DAAwB;QACxB,2DAAwB;QACxB,uDAAkB;QAClB,oHAA2C;;;IAIhD,aAAU,mDAA8B;;;oFAIU;;wFAMnB;oFAEJ;oFAEA;oFAEA;oFAEA;oFAEA;uHAIiB;0GAEe;uGAEH;uFAEV;oFAEnB;sDAEG;yEAIa;2FAKT;uFAEJ;MAY5B,YAAS,0BAAe;yFACU;mFAGN;mFAEA;mFAEA;mFAEA;+GAE0B;yDAEvB;yEAEI;IACrC;IAEA,cAAW,4BAAS,8BAAkB;0EACA;uFAKR;+EAEJ;+EAEA;2FAEmB;2FAEA;6GAES;wDAErB;+EAEP;IAI1B,SAAM,2BAAgB;IACxB;;AAEF","file":"cl_abap_zip.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_abap_zip.clas.locals.mjs":{"lineLengths":[53,35,18,32,55,37,169,147,145,154,153,153,155,155,422,17,42,22,42,70,3,29,64,16,3,23,39,58,89,3,15,69,30,19,3,28,60,61,118,3,28,60,61,118,3,28,62,58,49,23,83,41,3,28,62,58,49,23,217,41,3,27,68,109,88,72,70,51,29,52,30,52,30,52,30,52,30,50,26,49,50,59,62,46,23,45,46,110,61,64,67,55,102,63,64,69,57,67,61,81,62,56,63,11,9,54,108,7,52,5,53,59,32,65,53,100,119,79,76,71,73,52,45,5,50,50,68,204,5,20,41,18,3,1,57,74,20,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_abap_zip.clas.locals_imp.abap"],"names":[],"mappings":";;AAmBA;;;;;;;;;;;;;;;;;;;;;;;EACE;;;IACE,sCAAY,cAAQ,kBAAa,YAAoB;EACvD;EAEA;;IACE,YAAU,YAAO;IACnB;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;QACO,wCAAsB;IAC3B,WAAS,MAAM;IAEf;wCACgB;EAClB;EAEA;;;QACO,wCAAsB;IAC3B,WAAS,MAAM;IAEf,sCAAY,0CAAY,0CAAY,0CAAY,wCAAe,MAAmB;wCAClE;EAClB;EAEA;;;;;;QAGa,0CAA0C,CAAA;;QAC1C,2CAA0C,CAAA;;QAC1C,2CAA0C,CAAA;;QAC1C,2CAA0C,CAAA;;QAC1C,2CAA0C,CAAA;;QAC1C,yCAAwC,CAAA;;QAE7C,wCAAuB;QACvB,yCAAuB;QACvB,kDAAc;QACd,qDAAc;QACd,qCAAuC,CAAA;;QACvC,oCAAuB;QACvB,qCAAuB;IAE7B,iBAAwB,GAArB,2BAAS,wBAAc,gCAAC;;;;;QAEvB,WAAkB,qBAAT,eAAE,MAAC,OAAQ,gCAAC;;;;;UAEnB,YAAU,2CAAU;UACpB,YAAiB,sBAAP,OAAe,QAAO;UAChC,WAAgB,mBAAP,OAAW,gCAAC;UACrB,WAAgB,sBAAP,OAAe,UAAS;UACjC,yBAAG,kBAAsB;YACvB,WAAgB,sBAAP,OAAe,SAAQ;UAClC;QACF;;QACA,sCAAY,sBAAU,iBAAY,oBAAsB;MAC1D;;IACF;IAEA,QAAM,2BAAS,YAAY;;;;;MAEzB,WAAkB,qBAAT,eAAE,MAAC,OAAQ,gCAAC;MACrB,sCAAY,SAAQ,4DAA0B,GAAgB;MAC9D,QAA0B,sBAAd,sBAAJ,IAAY,KAAc,UAAS;MAC3C,QAAU,wBAAJ,IAAM,gCAAC;MACb,OAAM,wDAAgB;MACtB,QAAU,mBAAJ,IAAQ,kCAAG;MACjB,QAAU,sBAAJ,IAAY,UAAS;MAC3B,QAAS,sBAAH,GAAW,IAAG;IACtB;;IACA,QAAU,sBAAJ,IAAY,UAAS;IAE3B,iBAAoB,GAAjB,kBAAmB,uBAAS;MAE7B,sCAAY,uCAAS,uCAAS,uCAAS,qCAAY,GAAgB;IACrE;IAEA,WAAS,GAAG;wCAEI;IAElB;;AAEF","file":"cl_abap_zip.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_apc_tcp_client_manager.clas.mjs":{"lineLengths":[60,53,38,33,32,53,37,25,1491,17,42,22,3,29,64,16,3,23,51,3,30,127,66,58,66,58,818,61,147,85,169,21,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_apc_tcp_client_manager.clas.abap"],"names":[],"mappings":";;;AAcA;;;;;;;;;;;;;;EACE;;;;;;;;;;;;;;IAMA;;AACF","file":"cl_apc_tcp_client_manager.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_apc_tcp_client_manager.clas.locals.mjs":{"lineLengths":[53,49,19,32,70,57,168,22,17,42,22,70,3,29,64,16,3,41,71,32,21,3,39,69,118,21,3,46,41,64,32,3,1,73,18,32,69,85,165,140,220,464,17,42,22,68,64,143,3,29,67,61,63,61,142,70,68,68,71,30,30,36,16,3,37,36,161,44,61,97,90,7,102,103,71,3,35,26,3,49,146,28,22,3,53,130,108,22,3,48,130,70,71,63,3,1,71,33,66],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_apc_tcp_client_manager.clas.locals_imp.abap"],"names":[],"mappings":";;AASA;;;;;;;;;;;;;;;EACE;;IACE,cAAY,YAAO;IACrB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,iBAAU,SAAS;EACrB;AACF;;AAmBA;;;;;;;;;;;;;;;EACE;;;;;;;IACE,4CAAO,kBAAsB;IAC7B,4CAAO,kBAAsB;IAC7B,4CAAO,qBAAyB;IAChC,iBAAU,OAAO;IACjB,iBAAU,OAAO;IACjB,oBAAa,UAAU;IACzB;;EAEA;IACE;IACA;IACA;MACA;MACA;MAEA;IACA;IACA;IACA;IACA;EACF;EAEA;IACE;EACF;EAEA;;IACE,eAAa,OAAE;IACjB;;EAEA;;;IAEA;;EAEA;;;IACE;IACA;EACF;AACF","file":"cl_apc_tcp_client_manager.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_apc_wsp_ext_stateless_base.clas.mjs":{"lineLengths":[53,42,37,32,57,59,25,22,17,42,22,3,29,64,16,3,46,143,67,153,91,11,3,48,129,67,153,91,143,67,11,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_apc_wsp_ext_stateless_base.clas.abap"],"names":[],"mappings":";;AAKA;;;;;;;;;;;;;;EACE;;;;;IACE;EACF;EAEA;;;;;;;IACE;EACF;AACF","file":"cl_apc_wsp_ext_stateless_base.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_bcs.clas.mjs":{"lineLengths":[53,19,14,32,34,37,25,215,793,210,160,218,171,337,214,17,42,22,3,29,64,16,3,29,124,70,118,3,38,57,91,118,3,37,111,94,118,3,36,70,70,118,3,27,118,64,118,3,21,99,112,97,120,118,18,3,29,38,3,36,98,118,18,3,30,127,73,102,67,99,58,105,76,105,76,118,3,1,32,16,40],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_bcs.clas.abap"],"names":[],"mappings":";;AAuDA;;;;;;;;;;;;;;;;;;;;;EAEE;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;AAEF","file":"cl_bcs.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_bcs_convert.clas.mjs":{"lineLengths":[53,27,22,32,42,37,25,577,517,17,42,22,3,29,64,16,3,31,48,3,38,354,69,67,118,19,3,33,50,3,40,306,72,70,118,20,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_bcs_convert.clas.abap"],"names":[],"mappings":";;AAiBA;;;;;;;;;;;;;;;EAEE;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AAEF","file":"cl_bcs_convert.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_cam_address_bcs.clas.mjs":{"lineLengths":[53,31,26,32,46,71,25,579,17,42,22,3,29,64,16,3,40,61,3,47,122,54,85,52,79,107,82,118,18,3,1,56,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_cam_address_bcs.clas.abap"],"names":[],"mappings":";;AAiBA;;;;;;;;;;;;;;EAEE;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AAEF","file":"cl_cam_address_bcs.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_demo_output.clas.mjs":{"lineLengths":[53,27,22,32,42,37,25,252,49,237,17,42,22,3,29,64,16,3,22,39,3,29,43,49,64,52,128,3,17,34,3,24,128,3,24,41,3,31,43,49,64,52,128,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_demo_output.clas.abap"],"names":[],"mappings":";;AAaA;;;;;;;;;;;;;;;;EACE;;;;;;;;IACE,oCAAS,GAAF,iCAAI,kDAAe;EAC5B;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,kDAAe;EAC5B;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,kDAAe;EAC5B;AACF","file":"cl_demo_output.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_document_bcs.clas.mjs":{"lineLengths":[53,28,23,32,43,54,25,613,1006,17,42,22,3,29,64,16,3,32,50,3,39,116,66,58,47,64,45,55,64,64,118,18,3,31,77,91,80,100,73,91,57,91,56,88,366,97,118,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_document_bcs.clas.abap"],"names":[],"mappings":";;AA4BA;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;AAEF","file":"cl_document_bcs.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_function_test_environment.clas.mjs":{"lineLengths":[63,53,41,36,32,56,67,717,673,17,42,22,60,3,29,64,16,3,23,54,3,30,165,361,88,109,433,122,76,32,39,141,76,100,5,109,37,3,56,134,113,79,465,92,71,74,27,47,106,40,18,3,54,465,98,36,92,5,66,3,1,76,639,457,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_function_test_environment.clas.abap"],"names":[],"mappings":";;;AAoBA;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,oGAAuC;QACvC,waAAgC;IAErC,oCAAiC,GAA1B,yBAAO,oBAAqB,gCAAC;;;MAGlC,MAAM,MAAC,UAAO,SAAS;;MAIvB;MACA,2FAA4B;IAC9B;;IAGF;;EAEA;;;;IACE,IAAc,UAA+B;IAE7C;;;;6CAAqE;IACrE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB,WAAS,UAAQ,MAAC,OAAM;IAC1B;;EAEA;IACE,IAAc,UAA+B;;;MAG3C;IACF;IACA,sBAAM,sCAAS;EACjB;AAEF","file":"cl_function_test_environment.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_function_test_environment.clas.locals.mjs":{"lineLengths":[53,52,27,32,81,61,529,22,17,42,22,431,3,29,64,16,3,63,75,79,52,242,62,62,65,27,38,88,97,123,23,5,35,18,3,1,92,261,29,32,83,93,531,22,17,42,22,433,3,29,64,16,3,61,144,24,18,3,68,142,79,52,44,52,244,32,37,77,22,16,3,1,96,265,19,32,73,37,25,331,17,42,22,3,29,64,16,3,23,37,3,30,46,58,138,58,172,141,171,140,250,248,120,29,121,35,48,61,72,99,5,101,88,35,123,5,3,1,76,18,32,72,120,206,219,17,42,22,108,3,29,107,61,68,30,16,3,49,162,44,38,3,60,165,45,39,3,56,142,138,58,113,16,3,1,74,77,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_function_test_environment.clas.locals_imp.abap"],"names":[],"mappings":";;AAYA;;;;;;;;;;;;;;;EACE;;;;QACO,yOAAgC;IACrC;;;;oCAAwD;IACxD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;;;IACF;IACA,WAAS,MAAM,MAAC,MAAK;IACvB;;AACF;;;AAiBA;;;;;;;;;;;;;;;EACE;;IACE,WAAS,OAAE;IACb;;EAEA;;;;;;QACO,2OAAgC;IAErC,MAAM,MAAC,UAAO,IAAI;IAGU,MAAM,MAAC,cAAlB,KAAuB;IACxC,sEAAqC;IAErC,SAAO,OAAE;IACX;;AACF;;;AAYA;;;;;;;;;;;;;;EACE;;;;;;;;QACO,mKAA8C;QAC9C,oIAAiD;QACjD,kKAA4C;QAC5C,mIAA+C;QAC/C,iPAAiD;QACjD,+OAAoD;;IAGzD,cAAY,SAAS;;IAGrB,iBAAe,YAAY;IAG3B;MAEA;MAEA;MACA,0FAAyD;IACzD;oGAM2B;;;MAGzB;IACF;EAEF;AACF;;AAeA;;;;;;;;;;;EACE;;;IACE,4CAAO,kBAAsB;IAC7B,iBAAU,OAAO;IACnB;;EAEA;;IACE,+BAA6B,OAAE;IACjC;;EAEA;;IACE,gCAA8B,OAAE;IAClC;;EAEA;;;;IACE;IACF;;AACF","file":"cl_function_test_environment.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_gdt_conversion.clas.mjs":{"lineLengths":[53,30,25,32,45,37,25,348,282,365,282,287,278,280,17,42,22,3,29,64,16,3,32,52,3,39,67,64,54,85,67,61,37,217,29,84,88,12,120,5,3,38,58,3,45,46,61,93,61,118,3,35,55,3,42,93,64,46,61,118,3,38,58,3,45,93,64,46,61,118,3,34,54,3,41,46,61,102,79,66,75,147,5,25,142,142,142,142,31,3,34,54,3,41,46,61,93,61,29,77,57,84,58,84,58,84,57,12,120,5,3,39,59,3,46,93,64,93,61,9,99,41,17,22,44,74,61,13,16,20,9,7,51,90,89,103,24,7,5,3,56,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_gdt_conversion.clas.abap"],"names":[],"mappings":";;AA4DA;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;IACE,IACE,OAEA,KAHG,gBAAL;;MAEI,aAAW,QAAQ;;MAEnB,aAAoB,wBAAT,SAAW,kCAAG;;MAEzB,oCAAS,GAAF,iCAAI,wCAAM;;EAEvB;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;QACO,yDAAkB;IAEvB,iBAAY,GAAT,UAAY,sCAAI;MACjB,oCAAS,GAAF,iCAAI,mEAAgC;IAC7C;IAEA,WAAS,QAAQ;IACjB,uIAAgD;IAChD,uIAAgD;IAChD,uIAAgD;IAChD,uIAAgD;IAChD,mBAAiB,MAAM;EACzB;EAEA;;;;;;;;IAIE,IACE,OAEA,AAEA,AAEA,KAPG,QAAL;;MAEI,aAAW,oCAAG;;MAEd,aAAW,qCAAI;;MAEf,aAAW,qCAAI;;MAEf,aAAW,oCAAG;;MAEd,oCAAS,GAAF,iCAAI,wCAAM;;EAGvB;EAEA;;;;;;;;;iGASyB;;;;;;;;;;;;MACvB;MACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd;;;MACF;IAEF;EAEF","file":"cl_gdt_conversion.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_gui_cfw.clas.mjs":{"lineLengths":[53,23,18,32,38,37,25,367,49,144,17,42,22,3,29,64,16,3,42,55,3,49,59,44,55,59,49,45,15,3,17,30,3,24,11,3,32,45,3,39,46,61,130,3,1,40,20,44],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_gui_cfw.clas.abap"],"names":[],"mappings":";;AAmBA;;;;;;;;;;;;;;;;EACE;;;;;;;;;IACE,QAAM,+BAAC;IACT;;EAEA;;;;IACE;EACF;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,oDAAiB;EAC9B;AACF","file":"cl_gui_cfw.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_gui_container.clas.mjs":{"lineLengths":[53,29,24,32,44,37,217,203,132,134,22,17,42,22,44,58,54,56,3,29,64,16,3,1,52,128,135,64,39,65,40,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_gui_container.clas.abap"],"names":[],"mappings":";;AAQA;;;;;;;;;;;;;;;;;;;;;AACA","file":"cl_gui_container.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_gui_frontend_services.clas.mjs":{"lineLengths":[53,37,32,32,52,37,170,146,142,147,146,146,151,151,152,770,295,361,729,1343,158,942,399,932,174,305,265,385,178,518,320,259,171,17,42,22,62,64,56,66,64,64,74,74,74,3,29,64,16,3,32,59,3,39,99,69,67,144,18,3,35,62,3,42,70,67,147,3,27,54,3,34,99,64,52,139,18,3,28,55,3,35,68,64,58,43,140,3,33,60,3,40,120,49,62,55,145,3,37,64,3,44,69,67,49,67,61,52,149,3,33,60,3,40,69,67,58,43,145,3,29,56,3,36,68,76,68,64,68,64,101,64,106,103,47,61,141,3,35,62,3,42,74,79,147,3,24,51,3,31,68,64,71,73,69,67,77,91,69,67,69,67,71,73,69,67,116,136,3,33,60,3,40,72,76,74,82,75,82,145,3,27,54,3,34,68,64,68,64,83,64,93,105,76,66,67,47,61,139,3,33,60,3,40,72,76,76,88,77,91,107,82,71,73,77,91,320,67,58,43,67,70,145,3,33,60,3,40,72,76,77,91,77,91,71,73,68,61,64,49,68,61,67,70,145,3,24,51,3,31,64,62,20,3,33,60,3,40,106,79,43,49,58,43,145,3,37,64,3,44,76,85,149,3,32,59,3,39,323,76,58,43,144,3,1,68,89,49,86,46,82,42,87,47,86,46,86,46,91,51,91,51,91,51,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_gui_frontend_services.clas.abap"],"names":[],"mappings":";;AA8JA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACE;;;;;;;IACE,oCAAS,GAAF,iCAAI,kEAA+B;IAC5C;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,qEAAkC;EAC/C;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,6DAA0B;IACvC;;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,8DAA2B;EACxC;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,mEAAgC;EAC7C;EAEA;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,uEAAoC;EACjD;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,mEAAgC;EAC7C;EAEA;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,+DAA4B;EACzC;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,qEAAkC;EAC/C;EAEA;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,0DAAuB;EACpC;EAEA;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,mEAAgC;EAC7C;EAEA;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,6DAA0B;EACvC;EAEA;;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,mEAAgC;EAC7C;EAEA;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,mEAAgC;EAC7C;EAEA;;;;;IACE,aAAW,2CAAkB;IAC/B;;EAEA;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,mEAAgC;EAC7C;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,uEAAoC;EACjD;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,kEAA+B;EAC5C;AACF","file":"cl_gui_frontend_services.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_http_client.clas.mjs":{"lineLengths":[53,27,22,32,42,53,165,213,216,172,174,159,159,698,310,157,17,42,22,68,96,94,184,188,160,164,3,29,63,49,66,68,98,125,26,119,97,149,107,88,111,5,16,3,30,47,3,37,63,49,101,58,70,70,73,79,118,55,86,69,3,44,113,100,68,64,68,64,69,208,218,3,32,11,3,38,55,3,45,49,70,118,55,118,3,36,63,61,104,69,66,67,67,68,75,69,392,394,195,90,42,60,5,162,193,5,148,119,59,101,102,32,79,209,87,181,7,5,105,21,181,30,70,5,101,58,54,5,40,86,96,55,5,40,38,50,49,66,50,24,34,67,42,39,113,23,21,40,49,26,17,11,73,104,133,45,29,63,48,119,11,105,80,102,161,83,176,94,11,75,9,40,75,9,52,66,55,73,64,93,74,9,54,134,9,7,54,95,55,94,54,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_http_client.clas.abap"],"names":[],"mappings":";;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;QAGO,yDAAkB;QAClB,2DAAoB;;;IAKzB,iBAAU,GAAG;IAGb,gHAAqD;;oJAKnC;;IAGlB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;8GAGS;IACxB;IAEF;;EAEA;;;;;;;;;;;;;;;IAIE,eAAE,MAAC,WAAQ,+BAAC;EACd;EAEA;;;;;;;QACO,4DAAqB;IAC1B,eAAY,2LAA6D;yNAGxC;EACnC;EAEA;IAEE;EACF;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;QACO,4DAA4B;QAC5B,yDAA4B;QAC5B,0DAA4B;QAC5B,0DAA4B;QAC5B,2DAA4B;QAC5B,kEAA4B;QAC5B,4DAA6B;QAC7B,+XAA+B;QAC/B,iYAA+B;QAC/B,0LAA8C;IAEnD,eAAY,qEAAqC;IACjD,yBAAG,UAAoB;MACrB,cAAY,sCAAK;IACnB;IAGA,0BAAG,iIAAmE;gMAGxC;IAC9B;IAGA,YAAS,kIAA0D;IACnE,gHAAqD;IACrD,iCAAS,aAAW,OAAM;oGACiD;IAC3E,iBAA2B,GAAxB,yBAAO,kBAAmB,gCAAC;MAC5B,IACE,OAEA,KAHG,SAAL;;QAEI,iCAAS,6BAAU,sCAAO,mGAAmD;;oLAEW;;IAE9F;wGAI+E;IAC/E;;;MAEE;IACF;IAEA,qBAAkB,0EAA2C;IAC7D,yBAAG,0BAA8B;MAC/B;IACF;IACA;IAIA,aAAU,mEAAoC;IAE9C,iBAAqB,GAAlB,0BAAQ,WAAY,gCAAC;MACtB;IACF;IAEA;IACA;IACA;MACA;QACA;QACA;QACA;UACA;UACA;UACA;UACA;YAGA;YAIA;YACA;YACA;YACA;YACA;YACA;UACA;UAEA;UACA;UACA;UAKA;YACA;YACA;YACA;sHAGoB;UACpB;UAGA;UACA;UACA;UAGA,cAAW,uIAA+D;UAC1E,iBAAY,GAAT,UAAW,wCAAM;+KAKK;6FACqB;UAC9C;UAGA,eAAE,MAAC,WAAQ,+BAAC;QAEd;QAEA;UAIE,eAAE,MAAC,WAAQ,+BAAC;QAEd;QAEA;;;;;4FAC8D;UAC5D,YAAU,kDAAgB;QAC5B;QAEA;UACE,oCAAS,GAAF,iCAAI,kDAAe;QAC5B;MAEF","file":"cl_http_client.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_http_entity.clas.mjs":{"lineLengths":[53,27,22,32,42,107,163,146,152,146,146,465,469,173,174,175,176,176,174,175,173,174,176,22,17,42,22,66,70,76,70,70,389,393,116,118,128,123,123,119,121,116,118,128,3,29,64,16,3,57,67,73,92,52,106,91,116,101,76,106,118,3,61,92,52,106,91,116,101,76,106,118,3,57,69,88,69,88,92,52,106,91,116,101,76,106,118,3,64,98,67,99,118,3,44,66,118,16,3,33,124,118,20,3,47,71,82,74,91,118,3,50,65,64,52,118,17,3,43,66,118,16,3,46,64,52,43,49,118,3,50,65,64,68,61,68,61,118,3,32,121,118,19,3,50,65,67,108,68,64,68,64,118,3,45,118,116,109,128,118,18,3,48,71,71,73,71,73,70,70,62,58,102,39,23,3,42,3,44,42,49,118,3,45,64,52,64,64,62,58,62,58,118,3,48,71,73,71,73,70,70,71,73,62,58,102,118,3,43,66,52,62,58,62,58,118,3,37,66,118,16,3,52,64,52,64,52,98,118,3,43,46,58,35,3,49,64,52,118,3,56,64,52,118,3,42,64,52,64,52,98,65,52,66,55,67,58,62,55,118,3,47,67,70,118,3,44,66,52,118,3,49,65,64,52,74,94,69,79,158,118,17,3,41,58,118,14,3,51,64,52,118,3,58,64,52,118,3,45,64,52,64,52,118,3,49,384,58,118,3,53,101,64,97,118,3,54,74,94,118,3,42,64,52,64,52,65,55,66,58,67,61,62,58,118,3,38,63,118,19,3,61,67,70,69,76,118,3,48,65,64,52,196,63,92,95,27,68,88,39,5,17,3,49,384,55,32,3,44,60,49,66,55,29,31,3,36,64,163,16,3,44,60,52,66,58,29,31,3,41,64,52,62,58,62,58,165,3,43,63,116,15,3,48,72,76,126,3,35,66,27,16,3,40,66,52,27,3,57,64,52,64,52,66,58,118,3,42,63,49,67,73,74,94,118,3,41,59,45,15,3,45,118,61,55,118,18,3,50,74,94,69,79,158,384,55,36,3,47,384,58,69,70,36,3,47,384,55,195,78,30,62,65,5,3,46,65,64,52,195,66,92,95,27,68,88,38,5,17,3,48,64,52,65,55,196,228,72,92,95,27,68,88,43,12,67,39,75,5,85,61,5,3,43,66,58,31,3,38,64,29,16,3,44,67,61,118,3,46,64,52,65,55,195,34,36,76,3,1,48,106,68,106,68,104,64,105,66,103,63,104,65,105,65,103,63,104,65,105,65,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_http_entity.clas.abap"],"names":[],"mappings":";;AAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;IAEE,sBAAM,WAAW;IACnB;;EAEA;EAEA;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IAEE,sBAAM,OAAO;EACf;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;QACO,2LAAiC;IACtC;;;;kEAAqE;IACrE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,UAAQ,SAAS,MAAC,MAAK;IACzB;IACF;;EAEA;;;IACE,WAAS,eAAU;EACrB;EAEA;;;;;IACE,SAAO,cAAS;IAChB,WAAS,cAAS;EACpB;EAEA;;kKAG2B;IAC3B;;EAEA;;;;;IACE,mBAAY,IAAI;IAChB,mBAAY,MAAM;EACpB;EAEA;;;;;;;oKAGgC;EAChC;EAEA;;IACE,SAAM,qGAAiD;IACzD;;EAEA;;;6HAG0B;EAC1B;EAEA;;IACE,SAAO,YAAO;IAChB;;EAEA;;;IACE,iBAAU,IAAI;EAChB;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IAEE,QAAM,+BAAC;IACT;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;IACE,WAAS,mBAAc;EACzB;EAEA;;;;;IACE,wBAAiB,MAAM;EACzB;EAEA;;;QACO,0LAAoC;;;MAEvC;MACA,gCAAO,kBAAY,MAAM;IAC3B;EACF;EAEA;;;;QACO,0LAAoC;IACzC;;;;kEAAwE;IACxE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,UAAQ,QAAQ,MAAC,MAAK;IACxB;IACF;;EAEA;;;;;QACO,2LAAiC;IACtC,IAAc,aAAmC;IACjD;;;;kEAA4E;IAC5E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,aAAW,MAAC,WAAQ,KAAK;IAC3B;MACE,SAAS,MAAC,UAAO,4BAAU,MAAM;MACjC,SAAS,MAAC,WAAQ,KAAK;MACvB,gCAAO,mBAAa,eAAU;IAChC;IACA,iBAAQ,GAAL,MAAO,oDAAiB;4DACU;IACrC;EACF;EAEA;;;IACE,mBAAY,MAAM;EACpB;EAEA;;IACE,SAAO,cAAS;IAClB;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;QACO,0LAAoC;IACzC,QAAQ,MAAC,UAAO,IAAI;IACpB,QAAQ,MAAC,WAAQ,KAAK;IACtB,gCAAO,kBAAY,mBAAc;EACnC;AAEF","file":"cl_http_entity.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_http_server.clas.mjs":{"lineLengths":[53,27,22,32,42,37,25,482,17,42,22,3,29,64,16,3,29,46,3,36,49,70,64,49,72,73,64,49,64,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_http_server.clas.abap"],"names":[],"mappings":";;AAWA;;;;;;;;;;;;;;EACE;;;;;;;;;;;;IACE,SAAO,iDAAe;EACxB;AACF","file":"cl_http_server.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_http_utility.clas.mjs":{"lineLengths":[53,28,23,32,43,54,25,291,270,317,321,257,419,420,17,42,22,60,60,54,66,62,66,58,3,29,64,16,3,32,50,3,39,121,61,63,49,118,3,28,46,3,35,67,69,67,110,91,120,118,19,3,34,52,3,41,67,69,67,104,73,104,118,19,3,38,56,3,45,67,47,64,118,19,3,42,60,3,49,58,118,14,3,49,67,3,56,384,66,58,245,63,195,98,62,25,138,65,5,18,3,26,44,3,33,121,61,65,55,129,3,49,67,3,56,66,384,58,245,63,195,65,30,161,161,139,57,5,102,18,3,32,50,3,39,67,66,52,48,43,19,3,32,50,3,39,69,67,61,54,54,19,3,45,63,3,52,69,67,61,63,61,28,43,21,3,43,61,3,50,67,69,67,53,19,3,46,64,3,53,67,69,67,46,43,19,3,46,64,3,53,67,67,61,54,35,19,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_http_utility.clas.abap"],"names":[],"mappings":";;AAwDA;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;QACO,4OAAkD;QAClD,sDAAoB;QACpB,0LAA4B;IAEjC;;;MAEE;MACA,gCAAO,kBAAY,MAAM;IAC3B;IACF;;EAEA;;;;;;;;gIACuD;EACvD;EAEA;;;;;;;QACO,4OAAkD;QAClD,sDAAe;QACf,0LAA4B;;;MAG/B,wJAA2D;MAC3D,wJAA2D;MAC3D,8BAAM,QAAQ,MAAC,4BAAQ,qCAAO,QAAQ,MAAC,QAAK;MAC5C,gCAAO,aAAO,GAAG;IACnB;IACA,WAAS,8BAAiB,OAAQ,KAAI,KAAM,sCAAK;IACnD;;EAEA;;;;;;;IACE;IACA;IACF;;EAEA;;;;;;;IACE;IACA;IACF;;EAEA;;;;;;;;;IACE;IACA;IACF;;EAEA;;;;;;;IACE;IACF;;EAEA;;;;;;;IACE;IACA;IACF;;EAEA;;;;;;;IACE;IACA;IACF;;AACF","file":"cl_http_utility.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_i18n_languages.clas.mjs":{"lineLengths":[53,30,25,32,45,37,25,330,337,445,17,42,22,3,29,64,16,3,29,49,3,36,106,97,76,63,76,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,61,83,60,12,62,5,39,24,3,29,49,3,36,72,106,76,33,75,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,82,62,12,62,5,39,24,3,33,53,3,40,97,76,74,79,95,67,33,76,64,83,64,60,83,64,83,64,60,83,64,60,83,64,83,64,83,64,60,83,64,83,64,83,64,60,83,64,83,64,83,64,60,83,64,60,83,64,60,83,64,83,64,83,64,60,83,64,83,64,83,64,83,64,60,83,64,60,83,64,83,64,60,83,64,83,64,60,83,64,60,83,64,83,64,83,64,83,64,83,64,83,64,83,64,83,64,83,64,83,64,83,64,12,62,5,39,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_i18n_languages.clas.abap"],"names":[],"mappings":";;AA4BA;;;;;;;;;;;;;;;;EACE;;;;;;;IACE,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KAnFG,4BAAU,cAAf;;MAEI,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,oCAAG;;MAElB,iBAAe,mCAAE;;MAEjB;;IAEN;;;EAEA;;;;;;;IAGE,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KAjFG,YAAL;;MAEI,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB,iBAAe,qCAAI;;MAEnB;;IAEN;;;EAEA;;;;;;;;;;IACE,IACE,OAEA,AAGA,AAEA,AAGA,AAGA,AAEA,AAEA,AAGA,AAEA,AAEA,AAGA,AAEA,AAEA,AAGA,AAGA,AAGA,AAEA,AAEA,AAGA,AAEA,AAEA,AAEA,AAGA,AAGA,AAEA,AAGA,AAEA,AAGA,AAGA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KA7FG,YAAL;;MAEI,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;MACrB,eAAa,qCAAI;;MAEjB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB,mBAAiB,qCAAI;;MAErB;;IAEN;;AACF","file":"cl_i18n_languages.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_ixml.clas.mjs":{"lineLengths":[42,53,20,15,32,35,46,25,208,17,42,22,3,29,64,16,3,18,28,3,25,101,66,15,3,40,120,70,70,73,79,85,16,3,35,119,84,15,3,41,134,93,18,3,40,124,121,61,124,64,127,20,3,38,118,142,82,121,61,124,64,123,18,3,1,34,17,41],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_ixml.clas.abap"],"names":[],"mappings":";;;AASA;;;;;;;;;;;;;;EACE;;;;;;IAEA;;EAEA;;;;;;;IAEA;;EAEA;;;IAEA;;EAEA;;;IAEA;;EAEA;;;;;;;IAKA;;EAEA;;;;;;;;;IAKA;;AAEF","file":"cl_ixml.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_ixml.clas.locals.mjs":{"lineLengths":[53,31,18,32,51,37,25,290,271,17,42,22,3,29,64,16,3,31,44,3,38,68,68,64,27,149,148,148,150,146,20,3,29,42,3,36,68,68,64,27,149,148,148,150,146,20,3,1,53,25,32,58,60,164,401,435,17,42,22,67,324,3,29,323,61,30,57,16,3,39,57,3,42,112,67,19,93,16,3,1,67,333,20,32,53,55,194,22,17,42,22,116,3,29,64,16,3,1,57,100,58,26,32,59,61,396,22,17,42,22,298,3,29,64,16,3,50,134,117,20,3,45,59,53,15,3,57,111,64,52,115,71,29,81,25,19,7,5,15,3,54,111,64,52,118,15,3,57,64,52,118,3,57,112,52,65,3,1,69,21,32,54,56,396,221,204,17,42,22,298,3,29,64,16,3,23,115,61,68,68,3,23,115,61,109,74,26,47,88,94,5,3,40,62,56,18,3,45,130,113,16,3,43,111,61,55,57,18,15,3,63,129,45,55,118,15,3,1,59,16,32,49,69,165,149,145,214,194,218,161,159,229,17,42,22,68,73,69,138,118,142,98,92,3,29,117,67,98,105,34,57,76,5,16,3,35,60,118,16,3,54,121,64,52,63,49,118,15,3,33,112,118,16,3,45,69,37,21,3,42,64,118,16,3,42,132,118,16,3,36,118,118,16,3,36,64,27,16,3,45,58,117,67,123,51,84,41,62,14,3,33,111,118,15,3,56,72,64,52,118,15,3,52,63,49,118,3,43,129,118,15,3,50,117,64,52,69,67,63,49,61,55,137,115,129,298,114,64,67,28,72,85,61,24,20,53,80,44,16,9,83,51,56,21,9,68,7,52,5,15,3,47,117,64,52,69,67,61,55,118,15,3,51,121,64,52,118,15,3,49,63,64,52,63,49,115,129,50,62,5,15,3,46,63,64,52,69,67,118,15,3,40,121,54,15,3,57,133,64,52,118,15,3,60,133,64,52,63,49,118,15,3,43,111,57,15,3,37,63,51,15,3,49,64,52,118,3,39,118,3,39,121,61,137,115,124,73,65,95,59,22,18,51,78,42,14,7,75,50,85,7,384,5,50,33,60,95,5,82,205,197,105,7,5,112,59,22,18,51,105,45,14,7,72,5,50,195,154,84,231,7,12,104,5,3,54,43,49,118,3,46,60,64,52,69,67,65,55,76,16,3,49,64,52,66,58,65,55,115,84,60,63,73,93,3,42,58,65,55,54,14,3,50,63,49,31,3,42,117,67,123,51,41,62,3,39,131,32,15,3,40,112,114,16,3,37,121,30,15,3,45,118,63,49,118,16,3,36,118,3,35,111,28,15,3,43,69,67,69,67,118,3,33,63,26,15,3,34,59,137,115,62,122,47,12,90,61,24,20,53,80,44,16,9,86,69,9,7,52,74,5,15,3,32,96,145,15,3,38,63,31,15,3,34,63,137,115,62,122,29,12,90,61,24,20,53,80,44,16,9,91,7,52,5,15,3,33,63,118,15,3,38,64,52,27,3,42,113,55,58,3,39,65,55,29,3,1,49,85,45,82,42,20,32,53,70,221,183,161,159,74,17,42,22,124,107,98,92,3,29,89,105,16,3,35,60,118,16,3,45,69,118,21,3,33,112,118,16,3,42,64,118,16,3,42,117,67,123,51,41,79,3,50,63,49,75,3,39,131,70,15,3,40,112,72,16,3,37,121,68,15,3,45,118,63,49,70,16,3,36,56,3,35,111,66,15,3,43,69,67,69,67,102,3,33,63,64,15,3,34,59,65,15,3,32,96,63,15,3,38,63,69,15,3,34,63,65,15,3,33,63,64,15,3,38,64,52,65,3,42,113,55,71,3,39,65,55,68,3,46,94,64,11,3,48,103,70,39,3,43,97,33,16,3,54,66,58,11,3,46,117,67,65,3,44,113,73,17,3,53,125,64,52,66,58,118,19,3,51,121,64,52,66,58,84,60,73,19,3,48,121,64,52,84,60,19,3,58,129,44,52,118,15,3,51,125,46,58,46,58,118,15,3,44,130,118,16,3,57,125,63,49,118,15,3,58,117,64,52,114,58,66,58,115,95,45,73,15,3,57,125,64,52,118,15,3,55,117,64,52,114,58,65,55,99,56,59,15,3,48,121,64,52,69,67,150,19,3,51,121,61,55,63,49,64,52,154,19,3,48,117,64,52,118,15,3,61,133,64,52,69,67,63,49,118,15,3,58,133,61,55,64,52,69,67,118,15,3,37,112,27,16,3,45,118,99,16,3,1,57,89,49,86,46,20,32,53,55,222,205,397,17,42,22,125,128,3,29,121,61,124,64,33,35,16,3,35,60,121,73,131,116,74,5,59,74,185,12,186,5,84,40,18,5,75,16,3,49,99,58,11,3,1,57,19,32,52,54,167,177,22,17,42,22,70,100,3,29,64,16,3,45,60,66,58,124,69,63,151,72,12,71,5,16,3,47,60,118,16,3,1,55,19,32,52,54,165,178,17,42,22,67,3,29,66,58,28,16,3,33,11,3,1,55,26,32,59,61,25,22,17,42,22,3,29,64,16,3,61,118,121,52,118,16,3,62,120,66,58,86,42,18,3,62,120,68,58,131,89,26,55,42,18,3,62,120,65,49,118,18,3,61,120,63,49,99,18,3,1,69,18,32,51,53,222,204,149,150,165,1030,379,17,42,22,125,128,106,48,50,3,29,121,61,124,64,33,35,16,3,46,97,60,52,118,16,3,32,61,66,65,68,67,72,66,653,207,125,123,102,45,135,59,22,52,51,37,80,116,92,85,82,103,104,70,100,30,110,108,78,99,16,112,79,128,87,11,69,80,35,11,9,92,45,14,115,60,110,100,146,7,56,56,5,50,17,3,33,115,61,66,58,653,64,207,67,68,66,115,65,65,113,13,5,66,59,22,18,51,153,90,54,15,7,86,65,68,128,61,56,5,50,3,47,99,58,11,3,37,62,18,18,3,50,11,3,41,127,61,55,17,17,3,1,53,75,98,76,77,90,50,184,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_ixml.clas.locals_imp.abap"],"names":[],"mappings":";;AAeA;;;;;;;;;;;;;;;EACE;;;;;;;IACE,aAAW,QAAQ;IACnB,8IAAuD;IACvD,6IAAsD;IACtD,6IAAsD;IACtD,+IAAwD;IACxD,2IAAwD;IAC1D;;EAEA;;;;;;;IACE,aAAW,QAAQ;IACnB,8IAAuD;IACvD,6IAAsD;IACtD,6IAAsD;IACtD,+IAAwD;IACxD,2IAAwD;IAC1D;;AACF;;AAYA;;;;;;;;;;;;;EACE;;;IACE,iBAAU,OAAO;IACjB,oBAAa,+BAAC;IAChB;;EAEA;IACE,oBAAa,+BAAC;EAChB;EAEA;;IACE;iBAA6C;IAE7C,oBAAwB,mBAAX,gBAAa,gCAAC;IAC7B;;AACF;;;AAUA;;;;;;;;;;;;;;;AACA;;;;AAWA;;;;;;;;;;;;;;;EACE;;;IAGA;;EAEA;;IACE,QAAM,yBAAO,cAAS;IACxB;;EAEA;;;;QACO,0GAA4B;;;MAG/B,iBAAwB,IAArB,8CAAuB,KAAI;QAC5B,QAAM,OAAO;QACb;MACF;IACF;IACF;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,gCAAO,cAAQ,YAAO;EACxB;AACF;;AAaA;;;;;;;;;;;;;;;;EACE;;;IACE,4CAAO,kBAAsB;IAC7B,gCAAO,iBAAW,YAAO;EAC3B;EAEA;;;IACE;;;6CAAuE;IACvE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;IAEf;EACF;EAEA;;IACE,WAAS,yBAAO,cAAS;IAC3B;;EAEA;;;IAGA;;EAEA;;;;IACE;gBAAuC;IACzC;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AACF;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;EACE;;;;;IAGE,mBAAY,SAAS;IAErB,yBAAG,yBAAwB;2EACI;IAC/B;IACF;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,cAAY,iBAAY;IAC1B;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,SAAO,YAAO;IAChB;;EAEA;;;;QACO,kHAA4B;+BACjC,SAAW,SAAS;mFAEuB;IAC3C,OAAO,OAAE,cAAY,OAAE;6DAES;IAClC;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;QAGO,gIAA6C;QAC7C,0GAAoC;QACpC,wHAAyC;QACzC,iSAAuE;QACvE,yGAAiC;IAEtC,gCAAO,iBAAM,QAAQ;;;MAGnB,iBAAc,+CAAuB;MACrC,iBAAc,4DAA+B;;;;;QAE3C,aAAU,yDAAwB;QAElC,yBAAG,QAAkB;UACnB;QACF;QAGA,iBAAwB,IAArB,8CAAuB,KAAI;qCAC5B,KAAO,OAAO;UACd;;QACF;QACA,gCAAO,iBAAW,QAAQ;MAC5B;;IACF;IAEF;;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;QACO,0GAAgC;IACrC,aAAU,8GAAyD;IACnE,yBAAG,kBAAsB;MACvB,SAAM,6CAAqB;IAC7B;IACF;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,SAAM,uCAA4B;IACpC;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,SAAM,0CAA+B;IACvC;;EAEA;;IACE,SAAM,oCAAyB;IACjC;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;QACO,gIAA+C;QAC/C,0GAAsC;QACtC,mHAAyC;QACzC,gEAAyB;QACzB,wDAAyB;IAE9B,iBAAc,wEAAiC;;;;;MAE7C,aAAU,yDAAwB;MAClC,yBAAG,QAAkB;QACnB;MACF;MACA,WAAQ,wDAAgC;MACxC,yBAAG,gBAAoB;QACrB,gCAAQ,MAAS,qCAAG;MACtB;MACA,wCAAgB,2FAAwB,6BAAS,mEAAwB,6DAAQ,8CAAyB,0CAAG;IAC/G;;IAGA,sBAAM,KAAK;IACX,yBAAG,4BAA2B;MAC5B,gCAAQ,kBAAgB,qCAAG;IAC7B;IAEA,iBAAW,GAAR,cAAW,yCAAO;4MAC8C;MACjE,iBAA+C,IAA5C,sFAA8C,gCAAE,yBAAG,wBAAuB;wGAC/C;MAC9B;IACF;IAEA,iBAAc,yFAAgD;;;;;iCAE5D,aAAc,yDAAwB;MACtC,yBAAG,WAAqB;QACtB;MACF;uEAC6B;IAC/B;;IAEA,iBAA+C,IAA5C,sFAA8C,gCAAE,yBAAG,wBAAuB;yJACd;MAC7D,iBAAW,GAAR,cAAW,yCAAO;sOACqC;MAC1D;IACF;uGAC+B;IAC/B;EACF;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;2EAGmB;IACnB;;EAEA;;;;;;;QACO,0GAAgC;;2DAEZ;8DACE;wEACY;4FACI;EAC7C;EAEA;;;;qDACiC;IACjC;;EAEA;;;IACE,sBAAe,GAAG;EACpB;EAEA;;;QACO,kHAA4B;+BACjC,SAAW,SAAS;IACpB,OAAO,OAAE,cAAY,OAAE;6DAES;EAClC;EAEA;;IACE,QAAM,kBAAa;IACrB;;EAEA;;IACE,UAAO,kGAA4C;IACrD;;EAEA;;IACE,QAAM,gBAAW;IACnB;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,QAAM,cAAS;IACjB;;EAEA;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,QAAM,YAAO;IACf;;EAEA;;QACO,gIAA6C;QAC7C,0GAAgC;QAChC,qDAAa;IAElB,iBAAgD,IAA7C,8DAA+C,gCAAC;MACjD,QAAM,+BAAC;IACT;MACE,iBAAc,iEAAiD;;;;;QAE7D,aAAU,yDAAwB;QAClC,yBAAG,QAAkB;UACnB;QACF;QACA,iBAAyB,IAAtB,+CAAwB,OAAM;UAC/B,YAAS,6CAAqB;QAChC;MACF;;MAEA,QAAa,mBAAP,OAAS,gCAAC;IAClB;IACF;;EAEA;;IACE,QAAM,gCAAoD,IAA7C,8DAA+C,gCAAtD,CAAyD;IACjE;;EAEA;;IACE,QAAM,iBAAY;IACpB;;EAEA;;QACO,gIAA6C;QAC7C,0GAAgC;QAChC,qDAAa;IAElB,iBAAgD,IAA7C,8DAA+C,gCAAC;MACjD,QAAM,aAAQ;IAChB;MACE,iBAAc,iEAAiD;;;;;QAE7D,aAAU,yDAAwB;QAClC,yBAAG,QAAkB;UACnB;QACF;QAEA,8BAAM,KAAO,8CAAqB;MACpC;;IACF;IAEF;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,iBAAU,IAAI;EAChB;EAEA;;;yDAC8B;EAC9B;EAEA;;;IACE,kBAAW,KAAK;EAClB;AACF;;;;;;AAcA;;;;;;;;;;;;;;;;;EAEE;;wGAE+C;IAC/C;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;QACO,kHAA4B;+BACjC,SAAW,SAAS;IACpB,OAAO,OAAE,cAAY,OAAE;8EAEwB;EACjD;EAEA;;;0EACmD;EACnD;EAEA;;IACE,SAAM,uDAAuC;IAC/C;;EAEA;;IACE,UAAO,wDAAwC;IACjD;;EAEA;;IACE,SAAM,qDAAqC;IAC7C;;EAEA;;;;qEAC8C;IAC9C;;EAEA;uDACsC;EACtC;EAEA;;IACE,SAAM,mDAAmC;IAC3C;;EAEA;;;;;qGAG2B;EAC3B;EAEA;;IACE,SAAM,iDAAiC;IACzC;;EAEA;;IACE,SAAM,kDAAkC;IAC1C;;EAEA;;IACE,SAAM,gDAAgC;IACxC;;EAEA;;IACE,SAAM,sDAAsC;IAC9C;;EAEA;;IACE,SAAM,kDAAkC;IAC1C;;EAEA;;IACE,SAAM,iDAAiC;IACzC;;EAEA;;;gEACwC;EACxC;EAEA;;;sEAC6C;EAC7C;EAEA;;;mEAC0C;EAC1C;EAEA;;;IAEE;EACF;EAEA;;;IACE,uBAAgB,UAAU;EAC5B;EAEA;;IACE,SAAO,kBAAa;IACtB;;EAEA;;;IAEE;EACF;EAEA;;;gEACwC;EACxC;EAEA;;IACE,WAAQ,wDAAwC;IAClD;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;2DAEwC;wEACc;IACtD;;EAEA;;;;;2DAEwC;IACxC;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;QACO,0GAAgC;IACrC,SAAM,gFAEa;+BACnB,SAAW,GAAG;wEACyB;IACzC;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;uDAIoC;0DACE;IACtC;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wEAAqC;IAClD;;EAEA;;;;;;;;IACE,aAAU,uIAGQ;IACpB;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,SAAO,YAAO;IAChB;;EAEA;;+BACE,OAAQ,2DAA2C;IACrD;;AAEF;;;;;;AAyBA;;;;;;;;;;;;;EACE;;;;;IACE,oBAAa,OAAO;IACpB,qBAAc,QAAQ;IACxB;;EAEA;;QACO,gHAAyC;QACzC,gEAAyB;QACzB,0HAAqC;IAE1C,iBAAkC,IAA/B,iEAAiC,uBAAS;MAC3C,kEAAmC;IACrC;+BAEA,WAAa,eAAU;IACvB,iBAAqB,GAAlB,SAAS,OAAE,QAAS,uBAAS;wLACuD;IACvF;yLACwF;IACxF;IAEA,aAAU,iEAAgC;IAC1C,yBAAG,QAAkB;MACnB;IACF;0EAE6B;IAC/B;;EAEA;;;IACE;EACF;AACF;;AAIA;;;;;;;;;;;;;;;;;EACE;;;;QACO,mHAAuC;QACvC,4DAAoB;IAEzB,iBAAU,GAAP,aAAS,uBAAS;sJAMG;MACtB,yCAAY,eAAa,QAAO;IAClC;MACE,yCAAY,eAAa,OAAM;IACjC;IACF;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AACF;;AAYA;;;;;;;;;;;EACE;;;IACE,gBAAS,MAAM;IACjB;;EAEA;IACE;EACF;AACF;;AASA;;;;;;;;;;;;;;EACE;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IAGE;IACF;;EAEA;;;;QACO,0HAAiC;;IAEtC,WAAS,SAAS;IAClB,SAAS,OAAE,WAAS,sBAAS;IAE7B;IACF;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;IAIA;;AACF;;AAyBA;;;;;;;;;;;;;;;;;;;;EACE;;;;;IACE,oBAAa,OAAO;IACpB,qBAAc,QAAQ;IACxB;;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;QAEO,yDAAwB;QACxB,wDAAmB;QACnB,2DAAwB;QACxB,0DAAwB;QACxB,+DAAwB;QACxB,yDAAwB;QACxB,ooBAA8B;QAC9B,sMAA6C;QAE7C,oHAA8B;QAC9B,kHAA8B;+BAGnC,YAAa,yDAAwB;IAGrC;IAEA,gIAAiD;IAEjD,4BAAM;;;;MACJ,sBAAM,OAAO;MAEb,iBAAU,GAAP,QAAU,2CAAS;;QAGpB,oCAAiB,GAAV,WAAY,gCAAC;QACpB,cAAsB,mBAAV,UAAY,gCAAC;MAC3B,wBAAc,GAAP,QAAU,sCAAI;;QAGnB,oCAAuB,GAAhB,QAAQ,MAAC,SAAS,gCAAC;QAC1B,WAAS,iDAAuB;QAEhC;4BAAuD;QACvD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACnB,YAAU,sFAA6C;QAEvD,iBAAU,GAAP,QAAU,uCAAK;qCAEhB,YAAa,gDAAqC;QACpD;;UAEE,iBAAW,GAAR,SAAW,qCAAG;YACf;sFAC0D;UAC5D;oEACyC;UAEzC,iBAAU,GAAP,QAAU,uCAAK;YAChB,cAAY,OAAO;UACrB;QACF;2FAKuB;QAEvB,cAAY,QAAQ,MAAC,OAAM;MAK7B;;QAGE,aAAW,qCAAiB;;mGAEa;iJACgC;MAC3E;MAEA,WAAS,qCAAgB;MACzB,yBAAS,MAAM;IACjB;;IAEF;;EAEA;;;;;;;QAEO,sMAA4C;QAC5C,0DAAuB;QACvB,2DAAuB;QACvB,yDAAuB;QACvB,0GAAoC;QACpC,wDAAkB;QAClB,wDAAkB;IAEvB,iBAAgC,GAA7B,yBAAO,QAAQ,MAAC,eAAe,gCAAC;MACjC;IACF;IAEA,WAAS,iDAAuB;;;;;;MAO9B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd;;MACF;;gEAG4B;mEACE;+HAC0B;MAExD,cAAsB,mBAAV,UAAY,UAAS;MACjC,WAAS,qCAAgB;IAC3B;;EAEF;EAEA;;;IACE;EACF;EAEA;;IACE;IACF;;EAEA;IACE;EACF;EAEA;;;;IACE;IACF;;AACF","file":"cl_ixml.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_message_helper.clas.mjs":{"lineLengths":[53,30,25,32,45,37,170,337,146,316,711,17,42,22,53,3,29,64,16,3,37,57,3,44,66,108,52,78,79,78,78,78,78,108,65,65,245,245,245,245,171,18,3,40,60,3,47,108,52,66,55,37,96,100,22,5,64,65,57,13,5,57,39,120,5,54,3,39,59,3,46,42,49,55,25,75,76,48,93,57,12,51,5,48,93,57,12,57,5,48,93,57,12,57,5,48,3,31,51,3,38,89,49,345,58,100,55,129,9,55,65,17,106,122,14,16,7,5,3,1,54,81,62,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_message_helper.clas.abap"],"names":[],"mappings":";;AA4BA;;;;;;;;;;;;;;;;;;EAEE;;;;;;;QAEO,qEAAsB;QACtB,sEAAsB;QACtB,qEAAsB;QACtB,qEAAsB;QACtB,qEAAsB;QACtB,qEAAsB;IAG3B;IAEA;IACA;IACA;IACA;IACA;IACA;IAEA,oKAAiG;IAEnG;;EAEA;;;;;;;;IACE,yBAAG,KAAe;MAChB;;;IACF;IAGA,YAAS,8CAA4B;IACrC,iBAAU,GAAP,QAAU,8BAAW;MACtB,sBAAM,eAAE,MAAC,MAAK;MACd;IACF;IAEA,YAAS,uCAAiB;IAC1B,yBAAG,OAAiB;MAClB,oCAAS,GAAF,iCAAI,wCAAM;IACnB;qDAEgC;EAClC;EAEA;;;;;;QAEO,8CAA4B;IAGjC,eAAa,IAAI;IAEjB,eAAE,MAAC,WAAQ,qCAAI;IACf,eAAE,MAAC,WAAQ,sCAAK;IAEhB,eAAE,MAAC,WAAQ,UAAU;IACrB,iBAAoB,GAAjB,+CAAmB,mBAAK;MACzB,eAAa,kCAAa;IAC5B;MACE,eAAa,4BAAO;IACtB;IAEA,eAAE,MAAC,WAAQ,UAAU;IACrB,iBAAoB,GAAjB,+CAAmB,mBAAK;MACzB,eAAa,kCAAa;IAC5B;MACE,eAAa,kCAAa;IAC5B;IAEA,eAAE,MAAC,WAAQ,UAAU;IACrB,iBAAoB,GAAjB,+CAAmB,mBAAK;MACzB,eAAa,kCAAa;IAC5B;MACE,eAAa,kCAAa;IAC5B;IAEA,eAAE,MAAC,WAAQ,UAAU;EAEvB;EAEA;;;;;;;;;;QAEO,wHAA2C;IAEhD;iCACI,iBAAmB,GAAG;MACtB,YAAU,eAAe,OAAE,uBAAO;;;;;;;IAGtC;EAEF;AAEF","file":"cl_message_helper.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_mime_repository_api.clas.mjs":{"lineLengths":[53,35,30,32,50,48,25,22,17,42,22,42,3,29,64,16,3,34,59,3,41,110,46,61,93,118,20,3,30,43,52,110,91,115,104,70,71,64,49,70,622,55,95,67,118,3,40,43,52,95,70,106,51,76,110,91,115,118,115,127,105,79,102,67,100,101,79,629,79,111,94,627,70,118,3,30,43,52,71,67,95,70,106,51,76,110,91,115,118,115,127,105,79,102,67,100,101,79,626,70,111,94,118,3,33,43,52,110,91,116,110,91,115,101,79,111,94,118,3,36,43,52,109,88,114,110,91,115,261,58,118,3,37,43,52,110,91,115,104,70,49,70,66,55,62,55,103,67,622,55,622,55,95,67,79,94,118,3,41,43,52,104,70,622,55,118,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_mime_repository_api.clas.abap"],"names":[],"mappings":";;AAOA;;;;;;;;;;;;;;;EACE;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;AACF","file":"cl_mime_repository_api.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_numberrange_runtime.clas.mjs":{"lineLengths":[53,35,30,32,50,37,25,502,17,42,22,3,29,64,16,3,27,52,3,34,107,73,101,58,103,55,9,186,135,138,41,17,22,44,79,84,77,74,78,78,76,61,13,16,20,9,7,90,15,7,5,3,66,124,121,123,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_numberrange_runtime.clas.abap"],"names":[],"mappings":";;AAiBA;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiBE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd;MACF;IAEF;EAEF","file":"cl_numberrange_runtime.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_oo_factory.clas.mjs":{"lineLengths":[53,26,21,32,41,56,166,227,312,17,42,22,68,3,29,64,16,3,27,43,3,34,112,75,18,3,35,124,47,64,24,62,18,3,45,260,55,284,223,110,3,1,46,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_oo_factory.clas.abap"],"names":[],"mappings":";;AAoBA;;;;;;;;;;;;;;;;EACE;;;;;;IAEA;;EAEA;;;;IAEE,WAAS,OAAE;IACX,iBAAU,4BAAU,WAAW;IACjC;;EAEA;;;QACO,mRAAoB;IACzB;IACA;EACF;AACF","file":"cl_oo_factory.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_osql_test_environment.clas.mjs":{"lineLengths":[53,37,32,32,52,63,404,195,147,72,583,17,42,22,307,119,56,3,29,64,16,3,23,50,3,30,140,314,91,134,116,86,50,91,36,25,20,3,22,83,66,123,75,68,74,182,74,31,59,209,28,58,35,36,214,108,66,5,53,66,3,50,83,74,31,59,203,5,3,44,168,31,3,58,122,55,130,133,68,125,100,68,69,112,75,26,48,106,70,106,55,3,1,68,86,49,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_osql_test_environment.clas.abap"],"names":[],"mappings":";;AAmBA;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,6HAA2C;IAEhD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,0CAAQ;;IAG1B,MAAM,OAAE,cAAY,iBAAiB;;mCAEhB;IAErB,aAAW,MAAM;IAEnB;;EAEA;QAEO,0EAAgC;QAChC,yDAAqB;QACrB,kHAAuC;QACvC,kEAA0B;QAC1B,2DAAqB;IAE1B;qLAGwE;;;MAGtE,aAAW,4BAAU,UAAU;MAE/B,eAAY,0LAAyG;MACxF,cAAZ,MAAkB;yDACL;kCACZ;mCACC;MAEnB,6MAAkF;MAClF,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;iEAIa;IAClC;IAEA,+CAAgB;IAChB;EAEF;EAEA;QACO,0EAA+B;;;MAGlC,aAAW,4BAAU,UAAU;0MACoC;IACrE;EACF;EAEA;uKAG4D;IAE1D;EAEF;EAEA;;;QACO,yHAA8C;QAC9C,4HAA+C;QAC/C,2DAA2B;+BAEhC,iBAAkB,2EAA6C;+BAC/D,kBAAmB,iDAAsC;IACzD,cAAW,gDAAqC;IAGhD,4CAAO,mBAAuB;IAC9B;;;8CAA0E;IAC1E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;IAGnB,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB;EAEF;AAEF","file":"cl_osql_test_environment.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_package_factory.clas.mjs":{"lineLengths":[53,31,26,32,46,37,25,518,773,17,42,22,3,29,64,16,3,29,50,3,36,106,82,107,82,113,64,66,39,3,35,56,3,42,115,106,142,110,91,116,121,124,138,113,64,53,79,110,3,1,56,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/deps/cl_package_factory.clas.abap"],"names":[],"mappings":";;AA0BA;;;;;;;;;;;;;;;EACE;;;;;;;;;;IACE;IACF;;EAEA;;;;;;;;;;;;;;;;;IAEE,oCAAS,GAAF,iCAAI,gCAAC;EACd;AACF","file":"cl_package_factory.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_progress_indicator.clas.mjs":{"lineLengths":[53,34,29,32,49,37,25,674,17,42,22,3,29,64,16,3,34,58,3,41,45,55,67,73,63,61,113,100,108,82,11,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_progress_indicator.clas.abap"],"names":[],"mappings":";;AAYA;;;;;;;;;;;;;;EACE;;;;;;;;;;;;;;IAEE;EACF;AACF","file":"cl_progress_indicator.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_salv_aggregations.clas.mjs":{"lineLengths":[53,33,28,32,48,37,25,22,17,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_salv_aggregations.clas.abap"],"names":[],"mappings":";;AAKA;;;;;;;;;;;;;;AAEA","file":"cl_salv_aggregations.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_salv_column.clas.mjs":{"lineLengths":[53,27,22,32,42,37,25,211,161,162,161,17,42,22,3,29,64,16,3,30,98,55,91,118,3,31,65,55,118,3,32,65,55,118,3,30,65,55,118,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_salv_column.clas.abap"],"names":[],"mappings":";;AAQA;;;;;;;;;;;;;;;;;EACE;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;AACF","file":"cl_salv_column.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_salv_columns_table.clas.mjs":{"lineLengths":[53,34,29,32,49,37,25,185,192,163,315,151,17,42,22,3,29,64,16,3,27,113,70,70,118,17,3,37,65,55,118,3,29,98,55,91,118,3,15,65,118,17,3,33,65,55,118,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_salv_columns_table.clas.abap"],"names":[],"mappings":";;AAeA;;;;;;;;;;;;;;;;;;EACE;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;AACF","file":"cl_salv_columns_table.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_salv_events_table.clas.mjs":{"lineLengths":[53,33,28,32,48,37,25,22,17,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_salv_events_table.clas.abap"],"names":[],"mappings":";;AAkBA;;;;;;;;;;;;;;AAEA","file":"cl_salv_events_table.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_salv_filters.clas.mjs":{"lineLengths":[53,28,23,32,43,37,25,22,17,42,22,3,29,64,16,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_salv_filters.clas.abap"],"names":[],"mappings":";;AAIA;;;;;;;;;;;;;;AACA","file":"cl_salv_filters.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_salv_functions_list.clas.mjs":{"lineLengths":[53,35,30,32,50,37,25,204,159,17,42,22,3,29,64,16,3,24,97,52,118,3,25,63,118,15,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_salv_functions_list.clas.abap"],"names":[],"mappings":";;AAMA;;;;;;;;;;;;;;;EACE;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AACF","file":"cl_salv_functions_list.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_salv_table.clas.mjs":{"lineLengths":[53,26,21,32,41,37,170,334,205,141,159,363,56,51,51,190,56,323,482,214,211,143,139,139,218,222,223,207,17,42,22,57,3,29,64,16,3,34,42,46,118,3,23,113,118,15,3,28,125,118,17,3,25,127,118,15,3,29,264,118,16,3,24,118,3,35,59,49,118,3,36,42,46,118,3,32,42,46,118,3,24,40,3,31,50,70,51,73,46,58,118,3,22,98,118,17,3,26,109,118,15,3,24,118,3,19,118,3,19,118,3,34,47,61,52,76,45,55,118,3,33,68,76,66,70,66,70,64,64,118,3,21,123,118,15,3,32,109,118,15,3,32,42,46,118,3,23,125,118,15,3,1,46,77,37,273,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_salv_table.clas.abap"],"names":[],"mappings":";;AAiDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AAEF","file":"cl_salv_table.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_shm_area.clas.mjs":{"lineLengths":[79,53,24,48,32,39,88,191,265,188,168,187,203,125,195,182,170,166,163,168,172,621,558,557,1296,1451,181,871,1290,1281,1445,57,50,180,189,17,12,42,22,39,189,112,92,111,36,127,49,57,73,69,63,57,63,73,3,29,64,16,3,20,98,38,17,3,33,47,3,40,63,111,67,111,67,101,58,108,85,112,106,79,108,109,88,114,110,91,85,79,83,76,110,118,14,3,25,11,3,18,11,3,31,103,70,102,111,67,83,76,90,49,93,67,108,29,155,81,91,92,59,44,5,34,3,38,52,3,45,466,111,67,101,58,108,85,112,109,88,114,83,76,118,17,3,31,45,3,38,63,111,67,101,58,108,85,109,88,114,83,76,118,14,3,29,43,3,36,63,111,67,101,58,108,85,112,106,79,108,109,88,114,110,91,85,79,83,76,110,118,14,3,26,90,52,34,3,39,53,3,46,63,111,67,111,67,101,58,108,85,112,106,79,108,109,88,114,110,91,85,79,83,76,110,118,14,3,35,49,3,42,63,111,67,101,58,108,85,112,106,79,108,109,88,114,110,91,85,79,83,76,110,118,14,3,33,111,67,74,52,90,49,65,64,93,67,52,155,81,91,92,59,44,5,34,3,32,111,67,74,52,90,49,65,64,11,3,1,42,97,122,55,109,52,97,50,93,48,90,45,95,47,98,53,21,45],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_shm_area.clas.abap"],"names":[],"mappings":";;;AAqLA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;IACE,UAAQ,sBAAS;IACnB;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;IACE;EACF;EAEA;IACE;EACF;EAEA;;;;;;;;;;QACO,oFAA0B;QAC1B,0DAAmB;IAExB,iBAAc,GAAX,YAAa,wBAAW,yBAAI,oBAAkB;MAC/C,YAAU,SAAS;MAEnB,kJAA2D;;;;;2CAGvC;IACtB;IAEA,SAAO,mBAAO;EAChB;EAEA;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;IACE,wBAAU,IAAI;EAChB;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;;;QACO,oFAA0B;QAC1B,0DAAmB;IAExB,yBAAG,oBAAkB;MAGnB,kJAA2D;;;;;2CAGvC;IACtB;IAEA,SAAO,mBAAO;EAChB;EAEA;;;;;;;;;IAEE;EACF;AAEF","file":"cl_shm_area.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_general_error.clas.mjs":{"lineLengths":[71,53,33,53,32,48,62,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_general_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_general_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_dynamic_check.clas.mjs":{"lineLengths":[53,29,40,32,44,49,25,22,17,12,42,22,3,29,64,16,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_dynamic_check.clas.abap"],"names":[],"mappings":";;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_dynamic_check.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_shm_service.clas.mjs":{"lineLengths":[53,27,22,32,42,37,25,881,405,371,378,17,42,22,3,29,64,16,3,27,44,3,34,111,67,103,58,477,67,11,3,42,59,3,49,147,111,67,118,33,3,34,51,3,41,121,111,67,25,25,3,40,57,3,47,102,130,76,118,21,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_shm_service.clas.abap"],"names":[],"mappings":";;AAgCA;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;IACE;EACF;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;EAEA;;;;;;;IAEE;IACF;;EAEA;;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;IACnB;;AAEF","file":"cl_shm_service.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_sql_result_set.clas.mjs":{"lineLengths":[53,30,25,32,45,37,138,141,153,186,150,50,17,42,22,41,65,76,3,29,64,16,3,26,77,64,30,3,16,64,64,68,39,55,44,44,89,63,20,3,17,11,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_sql_result_set.clas.abap"],"names":[],"mappings":";;AAqBA;;;;;;;;;;;;;;;;;;;;;EAEE;;;IACE,gBAAS,QAAQ;EACnB;EAEA;;QAGO,uDAAe;QACf,2DAAoB;IAEzB;IAEA;IACA;IAEA,WAAM,mBAAM,QAAQ;IAEpB,kBAAoB,mBAAT,cAAW,gCAAC;IACvB,aAAoB,qBAAT,SAAW,cAAQ;IAChC;;EAEA;IAEE;EACF;AAEF","file":"cl_sql_result_set.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_sql_statement.clas.mjs":{"lineLengths":[53,29,24,32,44,37,25,183,329,17,42,22,3,29,64,16,3,31,69,67,74,70,68,82,5,57,86,99,22,5,9,83,16,35,5,57,86,99,22,5,3,30,124,69,67,74,70,68,82,5,57,86,99,22,5,83,9,104,45,16,35,5,57,86,99,22,5,22,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_sql_statement.clas.abap"],"names":[],"mappings":";;AAiBA;;;;;;;;;;;;;;;EAEE;;;QAEO,iEAA0B;IAE/B,4CAAO,oBAAwB;IAE/B;MACA,mBAAiB,uDAAqB;IACtC;IACA,yBAAG,yBAA6B;MAC9B;;;IACF;IAEA;MACA;IACA;MACA;IACA;IACA,yBAAG,yBAA6B;MAC9B;;;IACF;EAEF;EAEA;;;;QACO,iEAA0B;IAE/B,4CAAO,oBAAwB;IAE/B;MACA,mBAAiB,uDAAqB;IACtC;IACA,yBAAG,yBAA6B;MAC9B;;;IACF;;IAIA;MACA;MAEA;IACA;MACA;IACA;IACA,yBAAG,yBAA6B;MAC9B;;;IACF;IAEF;;AAEF","file":"cl_sql_statement.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_reader.clas.mjs":{"lineLengths":[56,53,34,29,32,49,37,25,331,17,42,22,3,29,64,16,3,23,47,3,30,118,66,52,179,18,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_reader.clas.abap"],"names":[],"mappings":";;;AAOA;;;;;;;;;;;;;;EACE;;;;;;;;IAIA;;AACF","file":"cl_sxml_string_reader.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_reader.clas.locals.mjs":{"lineLengths":[53,45,23,32,70,37,718,512,242,249,248,248,814,17,42,22,620,3,29,64,16,3,22,619,67,61,101,76,69,63,9,53,16,40,25,5,60,137,117,116,23,5,41,44,32,20,3,23,85,61,67,61,66,58,68,64,411,36,36,34,38,69,3,25,46,58,66,58,67,79,52,29,81,69,87,68,309,68,12,120,5,3,31,46,58,66,58,67,31,62,31,45,29,81,58,88,58,89,59,5,129,76,109,5,114,3,31,46,58,66,58,68,65,64,31,33,162,59,39,69,54,102,49,47,5,50,147,3,32,46,58,66,58,249,66,68,31,56,163,67,29,47,63,5,148,3,1,77,419,627,21,32,68,56,166,226,186,411,17,42,22,69,198,162,3,29,64,52,65,55,90,70,54,54,29,16,3,39,65,29,17,3,1,73,21,32,68,74,440,229,172,186,187,179,183,180,555,17,42,22,343,204,104,106,90,98,90,138,3,29,64,52,339,70,93,57,39,16,3,47,333,33,16,3,1,73,115,53,116,54,108,46,112,51,108,48,22,32,69,75,251,172,186,187,179,183,180,176,17,42,22,206,104,106,90,98,90,138,3,29,64,52,94,58,16,3,1,75,116,54,117,55,109,47,113,52,109,49,22,32,69,72,166,172,186,187,179,183,180,177,17,42,22,69,104,106,90,98,90,138,3,29,65,55,86,29,16,3,40,63,27,15,3,1,75,116,54,117,55,109,47,113,52,109,49,18,32,65,53,165,395,143,179,156,158,72,161,17,42,22,68,319,67,152,124,126,3,29,67,61,30,16,3,22,151,620,413,115,342,130,45,13,5,105,72,35,69,32,44,102,45,66,257,80,9,162,110,136,102,138,14,114,7,71,5,40,57,3,46,90,70,118,3,41,90,70,133,112,128,131,125,28,68,19,93,68,52,51,100,45,85,108,46,87,5,3,41,118,58,3,41,112,28,68,19,93,16,3,1,67,321,99,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_reader.clas.locals_imp.abap"],"names":[],"mappings":";;AA+CA;;;;;;;;;;;;;;;;;;;;EAEE;;;;QAEO,4FAA+B;QAC/B,mEAA4B;QAC5B,4DAAuB;QACvB,sDAAuB;IAI5B;MACA;IACA;MACA;MACA;IACA;IACA,iBAAY,GAAT,UAAW,uBAAS;;MAGrB;;;IAGF;IAEA,sBAAM,aAAQ;2CACK;IACnB,aAAW,aAAQ;IACrB;;EAEA;;;;;;;;;QACO,kZAA6B;IAClC,OAAO,MAAC,UAAO,OAAO;IACtB,OAAO,MAAC,UAAO,OAAO;IACtB,OAAO,MAAC,SAAM,MAAM;IACpB,OAAO,MAAC,WAAQ,QAAQ;IACxB,gCAAO,iBAAW,aAAQ;EAC5B;EAEA;;;;;QAEO,0DAAmB;IAExB;IACA;IAEA,IACE,OAEA,AAEA,MALG,OAAL;;oEAEwD;;mEAED;;mEAEA;;MAEnD,oCAAS,GAAF,iCAAI,wCAAM;;EAGvB;EAEA;;;;;QAEO,0DAAmB;IAExB;IACA;IACA;IACA;IAEA,IACE,OAEA,AAEA,MALG,OAAL;;MAEI,YAAU,sCAAK;;MAEf,YAAU,sCAAK;;MAEf,YAAU,uCAAM;;gIAKM;IAC1B,iBAAW,GAAR,SAAW,wCAAM;4GAEU;IAC9B;iHAE2B;EAE7B;EAEA;;;;;QAEO,2DAAqB;QACrB,wDAAgB;QAChB,uDAAgB;IAErB;IACA;iKAI0B;;;;;MAGxB,aAAoB,qBAAT,eAAE,MAAC,OAAQ,gCAAC;MACvB;8CACoB;IACtB;;kJAG2B;EAE7B;EAEA;;;;;QAEO,gPAAwD;QACxD,yDAA6B;QAC7B,2DAAoB;IAEzB;IACA;kKAI0B;;;MAGxB;8DAE4B;IAC9B;mJAG4B;EAE9B;AAEF;;;;AAgBA;;;;;;;;;;;;;;;EACE;;;;;;;IACE,4BAAuB,MAAC,UAAO,IAAI;IACnC,sCAA+B,UAAU;IACzC,kBAAW,KAAK;IAClB;;EAEA;;IACE,UAAQ,aAAQ;IAClB;;AACF;;AAaA;;;;;;;;;;;;;;;;;;;;;;;;;EACE;;;;;IACE,2BAAoB,6BAAc,+BAAkB;IACpD,+BAA0B,MAAC,UAAO,IAAI;IACtC,uBAAgB,UAAU;IAC5B;;EAEA;;IACE,SAAO,kBAAa;IACtB;;AACF;;;;;;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;EACE;;;IACE,2BAAoB,6BAAc,gCAAmB;IACrD,gCAA2B,MAAC,UAAO,IAAI;IACzC;;AACF;;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;EACE;;;IACE,2BAAoB,6BAAc,wBAAW;IAC7C,kBAAW,KAAK;IAClB;;EAEA;;IACE,QAAM,aAAQ;IAChB;;AACF;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;;;;;;;;;EACE;;;IACE,iBAAU,OAAO;IACnB;;EAEA;QAEO,8IAAyC;QACzC,mmBAA4C;QAC5C,oZAAoC;QACpC,0GAAsC;QACtC,6UAAgD;QAChD,yHAA2C;IAEhD,yBAAG,aAAkB;MACnB;IACF;;IAIA,eAAY,mDAAyB;IACrC,sBAAM,OAAO;;;MAGX,IACE,OAeA,AAIA,MApBG,SAAS,MAAC,KAAf;;QAEI,sBAAM,aAAa;QACnB,yBAAG,SAAS,MAAC,eAAkB;;UAM7B,gCAAO,sBAAgB,aAAa;QACtC;;;;;;;QAeA,oCAAS,GAAF,iCAAI,gCAAC;;MAEhB,gCAAO,iBAAW,aAAQ;IAC5B;IAEA,sBAAM,YAAO;IACb,oBAAa,+BAAC;EAChB;EAEA;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;;;QACO,uGAA2B;QAC3B,uHAAsC;QACtC,0HAAuC;QACvC,oHAAoC;2BAE5B;IACb;iBAA8C;IAC9C,oBAAwB,mBAAX,gBAAa,gCAAC;IAC3B,kCAA2B,IAAI,OAAE,iBAAI;IAErC,sBAAM,wBAAmB;IACzB,IACE,OAGA,MAJG,6BAAL;;iCAEI,MAAQ,IAAI;MACZ,6BAAsB,IAAI,OAAE,0BAAK,MAAC,KAAI;;iCAEtC,OAAS,IAAI;MACb,6BAAsB,KAAK,OAAE,2BAAK,MAAC,KAAI;;EAE7C;EAEA;;;EAEA;EAEA;;2BACe;IACb;iBAA8C;IAC9C,oBAAwB,mBAAX,gBAAa,gCAAC;IAC7B;;AACF","file":"cl_sxml_string_reader.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_writer.clas.mjs":{"lineLengths":[53,34,29,32,49,53,169,163,327,166,163,173,165,161,174,175,178,168,175,154,153,155,176,160,899,17,42,22,72,87,251,110,104,124,108,100,126,128,134,112,3,29,83,52,27,16,3,23,47,3,30,128,83,52,110,117,112,130,104,73,104,110,91,116,68,64,115,95,18,3,42,62,58,98,55,91,118,3,22,68,31,18,3,28,64,52,68,130,92,3,20,64,136,16,3,44,64,52,65,55,66,58,66,36,159,75,5,160,75,5,66,26,81,75,87,75,5,3,18,67,61,56,58,22,71,19,3,40,64,36,26,81,75,87,75,5,3,47,64,52,65,55,66,58,65,55,73,42,74,3,16,67,61,56,58,22,19,3,43,65,55,64,34,26,78,75,74,75,85,74,12,24,148,5,3,1,62,103,63,100,60,110,70,102,62,98,58,111,71,112,72,115,75,104,64,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_sxml_string_writer.clas.abap"],"names":[],"mappings":";;AAuCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;IACE,iBAAU,IAAI;IAChB;;EAEA;;;;;;;;;;;;;;;;;;;;;IAIA;;EAEA;;;;;;IACE,oCAAS,GAAF,iCAAI,wCAAM;EACnB;EAEA;;IACE,WAAS,cAAS;IACpB;;EAEA;;;QACO,2DAAmB;IACxB,YAAS,gHAAqD;IAC9D,sCAAY,gBAAU,iBAAY,cAAsB;EAC1D;EAEA;;IACE,UAAO,wHAAyD;IAClE;;EAEA;;;;;;;QACO,yDAAkB;IACvB,YAAS,kBAAO;IAEhB,iBAAU,GAAP,QAAS,yCAAQ,iBAAgB,IAAZ,wBAAe,sCAAI;0EACvB;IACpB;IACA,iBAAU,GAAP,QAAS,0CAAS,iBAAgB,IAAZ,wBAAe,sCAAI;0EACxB;IACpB;IAEA,gCAAO,cAAQ,aAAQ;IACvB,IACE,OAEA,MAHG,IAAL;;0EAEsB;;0EAEA;;EAExB;EAEA;;QACO,oDAAY;IACjB,UAAQ,yBAAO,eAAU;IACzB;oBAA4C;;IAE9C;;EAEA;QACO,uDAAgB;IACrB,UAAO,oBAAS;IAChB,IACE,OAEA,MAHG,IAAL;;0EAEsB;;0EAEA;;EAExB;EAEA;;;;;;;;;wEACoB;yCACE;yEACD;EACrB;EAEA;;QACO,oDAAY;IACjB,UAAQ,yBAAO,eAAU;IACzB;oBAA4C;IAC9C;;EAEA;;;QACO,uDAAgB;IACrB,UAAO,kBAAO;IACd,IACE,OAIA,MALG,IAAL;;0EAEsB;yEACc;0EACd;;yEAEc;;MAEhC;MACA,oCAAS,GAAF,iCAAI,oEAAiC;;EAElD;AAEF","file":"cl_sxml_string_writer.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_system_uuid.clas.mjs":{"lineLengths":[53,27,22,32,42,92,25,22,17,42,22,77,3,29,64,16,3,49,66,3,56,48,92,82,16,3,49,66,3,56,102,92,82,16,3,73,90,3,80,102,63,61,86,92,49,16,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_system_uuid.clas.abap"],"names":[],"mappings":";;AAQA;;;;;;;;;;;;;;;EAEE;;;;;IACE;IACA;IACF;;EAEA;;;;;IACE;IACA;IACF;;EAEA;;;;;;;IACE,oCAAe,GAAR,SAAU,gCAAC;IAClB;IACA;IACF;;AAEF","file":"cl_system_uuid.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cl_web_http_utility.clas.mjs":{"lineLengths":[53,32,27,32,47,37,25,392,17,42,22,3,29,64,16,3,29,51,3,36,69,67,61,63,61,126,21,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cl_web_http_utility.clas.abap"],"names":[],"mappings":";;AAUA;;;;;;;;;;;;;;EACE;;;;;;;;;IACE,eAAY,yGAES;IACvB;;AACF","file":"cl_web_http_utility.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_abap_datfm.clas.mjs":{"lineLengths":[69,53,26,45,32,41,62,25,22,17,12,42,22,3,29,64,16,3,1,46,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_abap_datfm.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_abap_datfm.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_static_check.clas.mjs":{"lineLengths":[53,28,39,32,43,49,25,930,17,12,42,22,3,29,344,58,102,64,43,52,43,52,43,52,43,52,67,16,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_static_check.clas.abap"],"names":[],"mappings":";;AAaA;;;;;;;;;;;EAEE;;;;;;;;;;;;;kEAGyB;IACzB;;AAEF","file":"cx_static_check.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_abap_message_digest.clas.mjs":{"lineLengths":[69,53,35,54,32,50,62,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_abap_message_digest.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_abap_message_digest.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_a_table.clas.mjs":{"lineLengths":[69,53,32,51,32,47,62,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_a_table.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_abap_not_a_table.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_in_package.clas.mjs":{"lineLengths":[69,53,35,54,32,50,62,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_in_package.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_abap_not_in_package.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_in_whitelist.clas.mjs":{"lineLengths":[69,53,37,56,32,52,62,25,22,17,12,42,22,3,29,64,16,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_abap_not_in_whitelist.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_abap_not_in_whitelist.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_abap_random.clas.mjs":{"lineLengths":[71,53,27,47,32,42,62,25,22,17,12,42,22,3,29,64,16,3,1,48,24,48],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_abap_random.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_abap_random.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_abap_timefm_invalid.clas.mjs":{"lineLengths":[69,53,35,54,32,50,62,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_abap_timefm_invalid.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_abap_timefm_invalid.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_apc_error.clas.mjs":{"lineLengths":[69,53,25,44,32,40,62,25,22,17,12,42,22,3,29,64,16,3,1,44,22,46],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_apc_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_apc_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_bcs.clas.mjs":{"lineLengths":[69,53,19,38,32,34,62,25,22,17,12,42,22,3,29,64,16,3,1,32,16,40],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_bcs.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_bcs.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_ftd_parameter_not_found.clas.mjs":{"lineLengths":[61,53,39,54,32,54,62,25,22,17,12,42,22,3,29,64,16,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_ftd_parameter_not_found.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_ftd_parameter_not_found.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_no_check.clas.mjs":{"lineLengths":[53,24,35,32,39,49,25,214,17,12,42,22,3,29,102,64,51,16,3,1,42,21,45],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_no_check.clas.abap"],"names":[],"mappings":";;AASA;;;;;;;;;;;EAEE;;;kDAC2C;IAC3C;;AAEF","file":"cx_no_check.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_gdt_conversion.clas.mjs":{"lineLengths":[71,53,30,50,32,45,62,25,22,17,12,42,22,3,29,64,16,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_gdt_conversion.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_gdt_conversion.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_oo_clif_not_exists.clas.mjs":{"lineLengths":[71,53,34,54,32,49,62,25,22,17,12,42,22,3,29,64,16,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_oo_clif_not_exists.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_oo_clif_not_exists.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid.clas.mjs":{"lineLengths":[71,53,33,53,32,48,62,25,413,17,12,42,22,3,29,50,58,102,64,69,67,67,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid.clas.abap"],"names":[],"mappings":";;;AASA;;;;;;;;;;;EACE;;;;;;;kEAGyB;IACzB;;AACF","file":"cx_parameter_invalid.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid_range.clas.mjs":{"lineLengths":[79,53,39,63,32,54,88,25,518,17,12,42,22,3,29,50,58,102,64,69,67,65,55,89,16,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid_range.clas.abap"],"names":[],"mappings":";;;AAUA;;;;;;;;;;;EACE;;;;;;;;;wFAI2B;IAC3B;;AACF","file":"cx_parameter_invalid_range.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid_type.clas.mjs":{"lineLengths":[79,53,38,62,32,53,88,25,22,17,12,42,22,3,29,64,16,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_parameter_invalid_type.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_parameter_invalid_type.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_salv_access_error.clas.mjs":{"lineLengths":[79,53,33,57,32,48,140,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_salv_access_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_salv_access_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_salv_static_check.clas.mjs":{"lineLengths":[65,53,33,50,32,48,88,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_salv_static_check.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_salv_static_check.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_salv_error.clas.mjs":{"lineLengths":[69,53,26,45,32,41,62,25,22,17,12,42,22,3,29,64,16,3,1,46,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_salv_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_salv_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_salv_data_error.clas.mjs":{"lineLengths":[79,53,31,55,32,46,140,25,22,17,12,42,22,3,29,64,16,3,1,56,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_salv_data_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_salv_data_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_salv_msg.clas.mjs":{"lineLengths":[65,53,24,41,32,39,88,25,22,17,12,42,22,3,29,64,16,3,1,42,21,45],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_salv_msg.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_salv_msg.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_salv_not_found.clas.mjs":{"lineLengths":[79,53,30,54,32,45,244,25,22,17,12,42,22,3,29,64,16,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_salv_not_found.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_salv_not_found.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_already_detached.clas.mjs":{"lineLengths":[79,53,36,60,32,51,88,25,628,17,12,42,22,3,29,50,58,102,64,69,67,69,67,66,58,16,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_already_detached.clas.abap"],"names":[],"mappings":";;;AAWA;;;;;;;;;;;EAEE;;;;;;;;;;;IACE;IACF;;AAEF","file":"cx_shm_already_detached.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_attach_error.clas.mjs":{"lineLengths":[63,53,32,48,32,47,88,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_attach_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_attach_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_error.clas.mjs":{"lineLengths":[69,53,25,44,32,40,62,25,22,17,12,42,22,3,29,64,16,3,1,44,22,46],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_build_failed.clas.mjs":{"lineLengths":[79,53,32,56,32,47,88,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_build_failed.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_build_failed.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_change_lock_active.clas.mjs":{"lineLengths":[77,53,38,61,32,53,140,25,22,17,12,42,22,3,29,64,16,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_change_lock_active.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_change_lock_active.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_completion_error.clas.mjs":{"lineLengths":[77,53,36,59,32,51,88,25,22,17,12,42,22,3,29,64,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_completion_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_completion_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_detach_error.clas.mjs":{"lineLengths":[71,53,32,52,32,47,62,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_detach_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_detach_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_event_execution_failed.clas.mjs":{"lineLengths":[85,53,42,69,32,57,140,25,22,17,12,42,22,3,29,64,16,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_event_execution_failed.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_event_execution_failed.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_exclusive_lock_active.clas.mjs":{"lineLengths":[77,53,41,64,32,56,140,25,22,17,12,42,22,3,29,64,16,3,1,76,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_exclusive_lock_active.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_exclusive_lock_active.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_inconsistent.clas.mjs":{"lineLengths":[77,53,32,55,32,47,140,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_inconsistent.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_inconsistent.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_initial_reference.clas.mjs":{"lineLengths":[79,53,37,61,32,52,88,25,22,17,12,42,22,3,29,64,16,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_initial_reference.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_initial_reference.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_no_active_version.clas.mjs":{"lineLengths":[77,53,37,60,32,52,140,25,22,17,12,42,22,3,29,64,16,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_no_active_version.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_no_active_version.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_parameter_error.clas.mjs":{"lineLengths":[79,53,35,59,32,50,88,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_parameter_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_parameter_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_pending_lock_removed.clas.mjs":{"lineLengths":[77,53,40,63,32,55,140,25,22,17,12,42,22,3,29,64,16,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_pending_lock_removed.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_pending_lock_removed.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_read_lock_active.clas.mjs":{"lineLengths":[77,53,36,59,32,51,140,25,22,17,12,42,22,3,29,64,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_read_lock_active.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_read_lock_active.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_secondary_commit.clas.mjs":{"lineLengths":[77,53,36,59,32,51,88,25,22,17,12,42,22,3,29,64,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_secondary_commit.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_secondary_commit.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_version_limit_exceeded.clas.mjs":{"lineLengths":[77,53,42,65,32,57,140,25,22,17,12,42,22,3,29,64,16,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_version_limit_exceeded.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_version_limit_exceeded.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shm_wrong_handle.clas.mjs":{"lineLengths":[79,53,32,56,32,47,88,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shm_wrong_handle.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shm_wrong_handle.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shma_dynamic.clas.mjs":{"lineLengths":[71,53,28,48,32,43,62,25,22,17,12,42,22,3,29,64,16,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shma_dynamic.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shma_dynamic.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shma_inconsistent.clas.mjs":{"lineLengths":[69,53,33,52,32,48,88,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shma_inconsistent.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shma_inconsistent.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_shma_not_configured.clas.mjs":{"lineLengths":[69,53,35,54,32,50,88,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_shma_not_configured.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_shma_not_configured.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sql_exception.clas.mjs":{"lineLengths":[69,53,29,48,32,44,62,25,22,17,12,42,22,3,29,64,16,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sql_exception.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sql_exception.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_error.clas.mjs":{"lineLengths":[71,53,26,46,32,41,62,25,22,17,12,42,22,3,29,64,16,3,1,46,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sxml_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sxml_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_illegal_argument_error.clas.mjs":{"lineLengths":[65,53,43,60,32,58,88,25,22,17,12,42,22,3,29,64,16,3,1,80,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sxml_illegal_argument_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sxml_illegal_argument_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_name_error.clas.mjs":{"lineLengths":[65,53,31,48,32,46,88,25,22,17,12,42,22,3,29,64,16,3,1,56,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sxml_name_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sxml_name_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_parse_error.clas.mjs":{"lineLengths":[65,53,32,49,32,47,88,165,178,17,12,42,22,67,3,29,66,70,31,45,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sxml_parse_error.clas.abap"],"names":[],"mappings":";;;AAMA;;;;;;;;;;;;EACE;;;8BACuB;IACrB,OAAE,OAAE,eAAa,UAAU;IAC7B;;AACF","file":"cx_sxml_parse_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sxml_state_error.clas.mjs":{"lineLengths":[65,53,32,49,32,47,88,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sxml_state_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sxml_state_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_arithmetic_error.clas.mjs":{"lineLengths":[71,53,35,55,32,50,62,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_arithmetic_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_arithmetic_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_buffer_overflow.clas.mjs":{"lineLengths":[71,53,34,54,32,49,62,25,22,17,12,42,22,3,29,64,16,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_buffer_overflow.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_buffer_overflow.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_codepage_converter_init.clas.mjs":{"lineLengths":[71,53,42,62,32,57,62,25,22,17,12,42,22,3,29,64,16,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_codepage_converter_init.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_codepage_converter_init.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_compression_error.clas.mjs":{"lineLengths":[71,53,36,56,32,51,62,25,22,17,12,42,22,3,29,64,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_compression_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_compression_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_codepage.clas.mjs":{"lineLengths":[71,53,38,58,32,53,62,175,22,17,12,42,22,77,3,29,64,16,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_codepage.clas.abap"],"names":[],"mappings":";;;AAKA;;;;;;;;;;;;;;;;AAEA","file":"cx_sy_conversion_codepage.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_data_loss.clas.mjs":{"lineLengths":[83,53,39,65,32,54,88,25,22,17,12,42,22,3,29,64,16,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_data_loss.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_conversion_data_loss.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_error.clas.mjs":{"lineLengths":[71,53,35,55,32,50,62,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_conversion_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_no_number.clas.mjs":{"lineLengths":[83,53,39,65,32,54,88,25,22,17,12,42,22,3,29,64,16,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_no_number.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_conversion_no_number.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_overflow.clas.mjs":{"lineLengths":[83,53,38,64,32,53,88,25,409,17,12,42,22,3,29,50,58,102,64,65,55,67,16,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_conversion_overflow.clas.abap"],"names":[],"mappings":";;;AASA;;;;;;;;;;;EACE;;;;;;;kEAGyB;IACzB;;AACF","file":"cx_sy_conversion_overflow.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_create_data_error.clas.mjs":{"lineLengths":[71,53,36,56,32,51,62,25,22,17,12,42,22,3,29,64,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_create_data_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_create_data_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_create_object_error.clas.mjs":{"lineLengths":[71,53,38,58,32,53,62,168,412,64,17,12,42,22,70,3,29,50,58,102,64,69,67,67,43,16,3,31,66,115,18,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_create_object_error.clas.abap"],"names":[],"mappings":";;;AAaA;;;;;;;;;;;;;EAEE;;;;;;;kEAGyB;IACvB,OAAE,OAAE,cAAY,SAAS;IAC3B;;EAEA;;IACE,WAAS,kGAAgE;IAC3E;;AAEF","file":"cx_sy_create_object_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_data_access_error.clas.mjs":{"lineLengths":[71,53,36,56,32,51,62,25,22,17,12,42,22,3,29,64,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_data_access_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_data_access_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_duplicate_key.clas.mjs":{"lineLengths":[71,53,32,52,32,47,62,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_duplicate_key.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_duplicate_key.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_error.clas.mjs":{"lineLengths":[71,53,33,53,32,48,62,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_dyn_call_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_class.clas.mjs":{"lineLengths":[79,53,41,65,32,56,88,25,22,17,12,42,22,3,29,64,16,3,1,76,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_class.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_dyn_call_illegal_class.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_form.clas.mjs":{"lineLengths":[79,53,40,64,32,55,88,25,22,17,12,42,22,3,29,64,16,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_form.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_dyn_call_illegal_form.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_func.clas.mjs":{"lineLengths":[79,53,40,64,32,55,88,25,22,17,12,42,22,3,29,64,16,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_func.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_dyn_call_illegal_func.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_method.clas.mjs":{"lineLengths":[79,53,42,66,32,57,88,156,523,17,12,42,22,71,3,29,50,58,102,64,69,67,70,70,51,16,3,1,78,79,54,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_illegal_method.clas.abap"],"names":[],"mappings":";;;AAcA;;;;;;;;;;;;EAEE;;;;;;;;;kDAC2C;IAC3C;;AAEF","file":"cx_sy_dyn_call_illegal_method.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_param_not_found.clas.mjs":{"lineLengths":[99,53,43,77,32,58,140,25,22,17,12,42,22,3,29,64,16,3,1,80,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_param_not_found.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_dyn_call_param_not_found.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_parameter_error.clas.mjs":{"lineLengths":[79,53,43,67,32,58,88,168,22,17,12,42,22,70,3,29,64,16,3,1,80,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dyn_call_parameter_error.clas.abap"],"names":[],"mappings":";;;AAKA;;;;;;;;;;;;;;;;AAEA","file":"cx_sy_dyn_call_parameter_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dynamic_osql_error.clas.mjs":{"lineLengths":[79,53,37,61,32,52,140,25,178,17,12,42,22,3,29,66,58,47,16,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dynamic_osql_error.clas.abap"],"names":[],"mappings":";;;AAOA;;;;;;;;;;;EACE;;;8CACuC;IACvC;;AACF","file":"cx_sy_dynamic_osql_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_open_sql_error.clas.mjs":{"lineLengths":[69,53,33,52,32,48,88,25,178,17,12,42,22,3,29,66,58,47,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_open_sql_error.clas.abap"],"names":[],"mappings":";;;AAOA;;;;;;;;;;;EACE;;;8CACuC;IACvC;;AACF","file":"cx_sy_open_sql_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_sql_error.clas.mjs":{"lineLengths":[71,53,28,48,32,43,62,165,178,17,12,42,22,67,3,29,66,58,31,37,16,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_sql_error.clas.abap"],"names":[],"mappings":";;;AASA;;;;;;;;;;;;EACE;;;8BACuB;IACrB,OAAE,OAAE,WAAS,MAAM;IACrB;;AACF","file":"cx_sy_sql_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_dynamic_osql_semantics.clas.mjs":{"lineLengths":[87,53,41,69,32,56,244,25,178,17,12,42,22,3,29,66,58,47,16,3,1,76,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_dynamic_osql_semantics.clas.abap"],"names":[],"mappings":";;;AAOA;;;;;;;;;;;EACE;;;8CACuC;IACvC;;AACF","file":"cx_sy_dynamic_osql_semantics.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_duplicate_key.clas.mjs":{"lineLengths":[71,53,37,57,32,52,88,25,22,17,12,42,22,3,29,64,16,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_duplicate_key.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_itab_duplicate_key.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_error.clas.mjs":{"lineLengths":[71,53,29,49,32,44,62,25,22,17,12,42,22,3,29,64,16,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_itab_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_line_not_found.clas.mjs":{"lineLengths":[71,53,38,58,32,53,62,25,22,17,12,42,22,3,29,64,16,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_itab_line_not_found.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_itab_line_not_found.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_message_illegal_text.clas.mjs":{"lineLengths":[71,53,39,59,32,54,62,25,22,17,12,42,22,3,29,64,16,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_message_illegal_text.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_message_illegal_text.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_move_cast_error.clas.mjs":{"lineLengths":[71,53,34,54,32,49,62,25,22,17,12,42,22,3,29,64,16,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_move_cast_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_move_cast_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_range_out_of_bounds.clas.mjs":{"lineLengths":[85,53,38,65,32,53,88,25,22,17,12,42,22,3,29,64,16,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_range_out_of_bounds.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_range_out_of_bounds.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_ref_is_initial.clas.mjs":{"lineLengths":[71,53,33,53,32,48,62,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_ref_is_initial.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_ref_is_initial.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_strg_par_val.clas.mjs":{"lineLengths":[71,53,31,51,32,46,62,25,22,17,12,42,22,3,29,64,16,3,1,56,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_strg_par_val.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AACA","file":"cx_sy_strg_par_val.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_attributes.clas.mjs":{"lineLengths":[81,53,36,61,32,51,140,25,22,17,12,42,22,3,29,64,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_attributes.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_struct_attributes.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_creation.clas.mjs":{"lineLengths":[77,53,34,57,32,49,88,25,22,17,12,42,22,3,29,64,16,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_creation.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_struct_creation.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_type_creation.clas.mjs":{"lineLengths":[71,53,32,52,32,47,62,25,22,17,12,42,22,3,29,64,16,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_type_creation.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_type_creation.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_comp_name.clas.mjs":{"lineLengths":[81,53,35,60,32,50,140,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_comp_name.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_struct_comp_name.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_comp_type.clas.mjs":{"lineLengths":[81,53,35,60,32,50,140,25,22,17,12,42,22,3,29,64,16,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_struct_comp_type.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_struct_comp_type.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_sy_zerodivide.clas.mjs":{"lineLengths":[83,53,29,55,32,44,88,25,22,17,12,42,22,3,29,64,16,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_sy_zerodivide.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_sy_zerodivide.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_transformation_error.clas.mjs":{"lineLengths":[71,53,36,56,32,51,62,25,22,17,12,42,22,3,29,64,16,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_transformation_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_transformation_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_uuid_error.clas.mjs":{"lineLengths":[69,53,26,45,32,41,62,25,22,17,12,42,22,3,29,64,16,3,1,46,23,47],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_uuid_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_uuid_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_exception.clas.mjs":{"lineLengths":[85,53,30,57,32,45,88,25,22,17,12,42,22,3,29,64,16,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_xslt_exception.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_xslt_exception.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_format_error.clas.mjs":{"lineLengths":[79,53,33,57,32,48,244,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_xslt_format_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_xslt_format_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_system_error.clas.mjs":{"lineLengths":[73,53,33,54,32,48,140,25,22,17,12,42,22,3,29,64,16,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_xslt_system_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_xslt_system_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_runtime_error.clas.mjs":{"lineLengths":[85,53,34,61,32,49,88,25,22,17,12,42,22,3,29,64,16,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_xslt_runtime_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_xslt_runtime_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/cx_xslt_serialization_error.clas.mjs":{"lineLengths":[79,53,40,64,32,55,244,25,22,17,12,42,22,3,29,64,16,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/cx_xslt_serialization_error.clas.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;;AAEA","file":"cx_xslt_serialization_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/icon.type.mjs":{"lineLengths":[16,52,30,55,33,53,31,68,46,58,36,65,43,54,32,59,37,55,33,56,34,55,33,59,37,54,32,62,40,54,32,64,42,58,36,63,41,64,42,60,38,54,32,55,33,56,34,55,33,62,40,59,37,56,34,59,37,52,30,52,30,63,41,58,36,57,35,60,38,55,33,58,36,52,30,64,42,67,45,64,42,57,35,59,37,52,30,63,41,64,42,64,42,53,31,57,35,56,34,61,39,56,34,57,35,55,33,56,34,55,33,57,35,56,34,53,31,53,31,62,40,57,35,62,40,59,37,66,44,67,45,52,30,58,36,57,35,57,35,58,36,56,34,69,47,60,38,30,38],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"icon.type.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_abap_channel_types.intf.mjs":{"lineLengths":[34,29,32,25,22,1,903,404,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_abap_channel_types.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_abap_conv_in.intf.mjs":{"lineLengths":[28,23,32,25,282,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_abap_conv_in.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_abap_conv_out.intf.mjs":{"lineLengths":[29,24,32,25,282,1,52,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_abap_conv_out.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_abap_unit_constant.intf.mjs":{"lineLengths":[34,29,32,346,262,22,1,62,284,70,73,71,220,67,65,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_abap_unit_constant.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_tcp_frame_types.intf.mjs":{"lineLengths":[35,30,32,180,157,160,22,1,64,120,80,118,78,120,80,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_tcp_frame_types.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_binding_manager.intf.mjs":{"lineLengths":[39,34,32,25,270,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_wsp_binding_manager.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_client.intf.mjs":{"lineLengths":[30,25,32,25,69,49,248,1,54,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_wsp_client.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_event_handler.intf.mjs":{"lineLengths":[37,32,32,25,69,221,52,53,1,68,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_wsp_event_handler.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_extension.intf.mjs":{"lineLengths":[33,28,32,25,444,598,1,60,30,54],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_wsp_extension.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_initial_request.intf.mjs":{"lineLengths":[39,34,32,25,617,486,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_wsp_initial_request.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_message.intf.mjs":{"lineLengths":[31,26,32,25,181,133,160,1,56,28,52],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_wsp_message.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_message_manager.intf.mjs":{"lineLengths":[39,34,32,25,244,217,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_wsp_message_manager.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_apc_wsp_server_context.intf.mjs":{"lineLengths":[38,33,32,25,272,255,1,70,35,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_apc_wsp_server_context.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_aunit_constants.intf.mjs":{"lineLengths":[31,26,32,159,144,141,145,142,142,325,262,22,1,56,91,48,97,54,94,51,98,55,95,52,95,52,278,64,67,65,214,59,61,28,52],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_aunit_constants.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_document_bcs.intf.mjs":{"lineLengths":[28,23,32,25,22,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_document_bcs.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ftd_input_arguments.intf.mjs":{"lineLengths":[35,30,32,25,318,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ftd_input_arguments.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ftd_input_config_setter.intf.mjs":{"lineLengths":[39,34,32,25,287,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ftd_input_config_setter.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ftd_invocation_answer.intf.mjs":{"lineLengths":[37,32,32,25,422,1,68,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ftd_invocation_answer.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ftd_invocation_result.intf.mjs":{"lineLengths":[37,32,32,25,269,1,68,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ftd_invocation_result.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ftd_output_config_setter.intf.mjs":{"lineLengths":[40,35,32,25,432,1,74,37,61],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ftd_output_config_setter.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ftd_output_configuration.intf.mjs":{"lineLengths":[40,35,32,25,469,1,74,37,61],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ftd_output_configuration.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_function_test_environment.intf.mjs":{"lineLengths":[41,36,32,25,397,58,1,466,38,62],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_function_test_environment.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_function_testdouble.intf.mjs":{"lineLengths":[35,30,32,25,277,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_function_testdouble.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_http_client.intf.mjs":{"lineLengths":[27,22,32,219,201,157,159,144,144,441,49,149,51,65,264,1,48,89,49,88,48,24,48],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_http_client.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_http_entity.intf.mjs":{"lineLengths":[27,22,32,179,159,161,377,156,267,267,481,59,369,136,265,155,161,287,170,156,483,158,139,603,467,363,270,163,170,160,680,603,164,707,491,154,314,156,155,680,178,265,590,483,204,263,165,173,1,48,103,63,104,65,105,65,24,48],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_http_entity.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_http_extension.intf.mjs":{"lineLengths":[30,25,32,161,143,156,233,1,54,94,54,106,66,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_http_extension.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_http_request.intf.mjs":{"lineLengths":[28,23,32,181,160,158,159,173,174,176,176,156,160,380,207,380,242,163,268,282,1,50,107,69,107,69,105,65,106,67,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_http_request.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_http_response.intf.mjs":{"lineLengths":[29,24,32,194,174,176,276,258,379,374,210,163,210,702,488,592,1,52,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_http_response.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_http_server.intf.mjs":{"lineLengths":[27,22,32,168,154,201,198,151,163,144,143,138,144,483,270,370,690,374,269,590,271,269,268,473,472,154,1197,1207,161,53,160,539,285,270,310,1,48,96,56,108,68,89,49,88,48,83,58,88,63,24,48],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_http_server.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_http_utility.intf.mjs":{"lineLengths":[28,23,32,25,606,154,373,268,271,588,270,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_http_utility.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml.intf.mjs":{"lineLengths":[20,15,32,25,234,237,546,720,441,1,34,17,41],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_attribute.intf.mjs":{"lineLengths":[30,25,32,182,159,172,156,154,1,54,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_attribute.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_document.intf.mjs":{"lineLengths":[29,24,32,182,159,206,199,193,168,211,210,436,430,321,319,396,227,333,587,334,583,430,528,317,558,553,202,217,1,52,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_document.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_element.intf.mjs":{"lineLengths":[28,23,32,182,159,182,228,208,154,309,198,281,226,633,527,325,368,371,215,343,449,431,208,154,162,55,209,146,473,373,255,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_element.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_encoding.intf.mjs":{"lineLengths":[29,24,32,177,22,1,52,104,62,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_encoding.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_istream.intf.mjs":{"lineLengths":[28,23,32,25,68,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_istream.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_named_node_map.intf.mjs":{"lineLengths":[35,30,32,25,249,151,314,311,211,164,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_named_node_map.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node.intf.mjs":{"lineLengths":[25,20,32,169,146,229,227,209,215,318,55,203,273,153,150,185,158,154,153,154,165,207,156,202,171,163,153,1,44,89,49,86,46,22,46],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_node.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node_collection.intf.mjs":{"lineLengths":[36,31,32,25,245,153,1,66,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_node_collection.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node_filter.intf.mjs":{"lineLengths":[32,27,32,25,22,1,58,29,53],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_node_filter.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node_iterator.intf.mjs":{"lineLengths":[34,29,32,25,67,203,1,62,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_node_iterator.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_node_list.intf.mjs":{"lineLengths":[30,25,32,25,172,227,302,325,1,54,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_node_list.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_ostream.intf.mjs":{"lineLengths":[28,23,32,25,278,162,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_ostream.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_parse_error.intf.mjs":{"lineLengths":[32,27,32,25,176,150,155,1,58,29,53],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_parse_error.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_parser.intf.mjs":{"lineLengths":[27,22,32,171,166,196,154,67,319,294,1,48,94,54,24,48],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_parser.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_renderer.intf.mjs":{"lineLengths":[29,24,32,25,166,197,1,52,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_renderer.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_stream_factory.intf.mjs":{"lineLengths":[35,30,32,25,348,332,326,329,383,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_stream_factory.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_ixml_unknown.intf.mjs":{"lineLengths":[28,23,32,25,333,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_ixml_unknown.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_message.intf.mjs":{"lineLengths":[23,18,32,25,174,311,1,40,20,44],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_message.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_mr_api.intf.mjs":{"lineLengths":[22,17,32,25,303,1419,2587,2018,723,734,2447,946,1,38,19,43],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_mr_api.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_oo_adt_classrun.intf.mjs":{"lineLengths":[31,26,32,25,236,1,56,28,52],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_oo_adt_classrun.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_oo_adt_classrun_out.intf.mjs":{"lineLengths":[35,30,32,25,426,339,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_oo_adt_classrun_out.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_oo_clif_source.intf.mjs":{"lineLengths":[30,25,32,25,371,1,54,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_oo_clif_source.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_osql_test_environment.intf.mjs":{"lineLengths":[37,32,32,25,75,51,221,1,173,328,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_osql_test_environment.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_package.intf.mjs":{"lineLengths":[23,18,32,154,155,158,152,148,211,50,201,157,1139,604,243,621,189,293,1,40,20,44],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_package.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_recipient_bcs.intf.mjs":{"lineLengths":[29,24,32,25,22,1,52,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_recipient_bcs.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_salv_c_bool_sap.intf.mjs":{"lineLengths":[31,26,32,195,176,22,1,56,127,71,128,73,28,52],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_salv_c_bool_sap.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_salv_c_selection_mode.intf.mjs":{"lineLengths":[37,32,32,158,141,137,143,140,22,1,68,102,62,106,66,102,62,108,68,104,64,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_salv_c_selection_mode.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sender_bcs.intf.mjs":{"lineLengths":[26,21,32,25,22,1,46,23,47],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sender_bcs.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_serializable_object.intf.mjs":{"lineLengths":[35,30,32,25,22,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_serializable_object.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_shm_build_instance.intf.mjs":{"lineLengths":[34,29,32,25,353,1,62,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_shm_build_instance.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_shm_trace.intf.mjs":{"lineLengths":[25,20,32,1483,743,861,726,862,505,641,354,490,487,623,453,726,881,1014,732,887,206,343,1,44,22,46],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_shm_trace.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml.intf.mjs":{"lineLengths":[20,15,32,188,168,165,167,22,1,34,98,35,99,36,96,33,97,34,94,17,41],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml_attribute.intf.mjs":{"lineLengths":[30,25,32,229,168,175,1,54,349,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml_attribute.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml_close_element.intf.mjs":{"lineLengths":[34,29,32,229,172,186,187,179,183,180,22,1,62,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml_close_element.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml_node.intf.mjs":{"lineLengths":[25,20,32,180,173,174,166,170,167,22,1,44,114,52,115,53,107,45,111,50,107,47,92,22,46],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml_node.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml_open_element.intf.mjs":{"lineLengths":[33,28,32,229,172,186,187,179,183,180,448,1,60,30,54],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml_open_element.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml_reader.intf.mjs":{"lineLengths":[27,22,32,185,141,143,226,181,186,210,1,48,24,48],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml_reader.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml_value.intf.mjs":{"lineLengths":[26,21,32,189,22,1,46,110,46,96,23,47],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml_value.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml_value_node.intf.mjs":{"lineLengths":[31,26,32,193,186,187,179,183,180,173,1,56,28,52],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml_value_node.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxml_writer.intf.mjs":{"lineLengths":[27,22,32,172,148,158,150,146,159,160,163,153,387,57,477,158,293,1,48,96,56,93,53,103,63,95,55,91,51,104,64,105,65,108,68,97,57,24,48],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxml_writer.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxmlp_factory.intf.mjs":{"lineLengths":[29,24,32,25,541,1,52,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxmlp_factory.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxmlp_list.intf.mjs":{"lineLengths":[26,21,32,25,223,1,46,23,47],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxmlp_list.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxmlp_part.intf.mjs":{"lineLengths":[26,21,32,25,228,1,46,23,47],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxmlp_part.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_sxmlp_simple.intf.mjs":{"lineLengths":[28,23,32,25,22,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_sxmlp_simple.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_system_uuid_rfc4122_static.intf.mjs":{"lineLengths":[42,37,32,25,332,1,78,39,63],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_system_uuid_rfc4122_static.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_system_uuid_static.intf.mjs":{"lineLengths":[34,29,32,25,163,200,1,62,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_system_uuid_static.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_t100_dyn_msg.intf.mjs":{"lineLengths":[28,23,32,192,170,170,170,171,22,1,50,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_t100_dyn_msg.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/if_t100_message.intf.mjs":{"lineLengths":[28,23,32,443,578,22,1,50,524,69,70,67,67,67,67,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"if_t100_message.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_authority_check.clas.mjs":{"lineLengths":[53,35,30,32,50,37,25,67,17,42,22,3,29,64,16,3,16,41,3,23,69,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_authority_check.clas.abap"],"names":[],"mappings":";;AAMA;;;;;;;;;;;;;;EAEE;;;;IAEE,eAAE,MAAC,WAAQ,+BAAC;EACd;AAEF","file":"kernel_authority_check.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_call.clas.mjs":{"lineLengths":[53,24,19,32,39,37,25,149,17,42,22,3,29,64,16,3,21,35,3,28,44,52,48,64,25,80,95,27,5,3,1,42,21,45],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_call.clas.abap"],"names":[],"mappings":";;AASA;;;;;;;;;;;;;;EAEE;;;;;;QAEO,uCAAqB;QACrB,uDAAgB;IAErB;IAEA,iBAAQ,GAAL,MAAO,+CAAY;MACpB,UAAO,6EAAwD;MAC/D;IACF;EAEF;AAEF","file":"kernel_call.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_call_transformation.clas.mjs":{"lineLengths":[61,53,39,34,32,54,37,220,199,175,171,283,131,17,42,22,52,58,3,29,64,16,3,21,50,3,28,44,52,67,69,69,75,414,131,210,67,163,61,64,42,92,93,87,52,100,60,50,198,61,119,14,92,111,24,7,5,97,44,5,79,134,40,28,70,61,20,50,15,137,187,56,92,11,90,17,9,79,31,9,65,177,123,44,32,74,65,24,54,19,163,15,191,47,21,13,109,99,118,30,13,60,37,76,39,171,15,20,48,50,78,69,28,58,23,92,154,28,153,21,19,17,15,48,77,15,55,79,87,70,133,122,56,587,70,24,70,17,31,15,43,72,15,50,87,70,133,138,625,425,87,86,165,88,122,51,96,146,64,72,92,81,44,113,58,157,207,64,100,19,98,101,127,102,145,94,82,46,56,194,159,21,64,194,102,21,19,98,24,148,17,15,38,67,15,45,78,70,150,136,133,117,76,70,103,86,117,171,79,77,63,99,15,13,84,153,152,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_call_transformation.clas.abap"],"names":[],"mappings":";;;AAuBA;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;QAIO,0DAAqB;QACrB,4DAAqB;QACrB,4DAAqB;QACrB,kEAA0B;QAC1B,qZAAqC;QACrC,0HAA2C;QAC3C,yMAA8B;QAC9B,0DAAqB;QACrB,0JAA0C;IAE/C,sBAAM,iCAAM;IACZ,sBAAM,oCAAS;IAKf;IACA,oCAAe,GAAR,SAAU,sCAAI;IAGrB;IACA;IACA,yBAAG,oBAAwB;MACzB,iBAAgB,GAAb,kCAAe,qCAAG;QACnB,YAAU,sCAAK;iDACO;MACxB,wBAAoB,GAAb,kCAAe,qCAAI,iBAAgB,GAAb,kCAAe,qCAAG;QAC7C,YAAU,uCAAM;QAChB,uCAAS,sEAAuC;MAClD;QACE;;;MACF;IACF;IAGA;MACA;IACA;IAEA,yBAAG,+CAAwB;qIAGiB;MAC1C;QACA;QACA;UACA;UACA;YACA;YACA;wIACuC;0LACgC;uDAC/C;2FACG;UAC3B;yFAC2B;UAC3B;QACF;QAEA;UACA;QACA;QACA,iBAAa,GAAV,WAAY,uBAAS;UACtB,cAAY,uJAAoH;;UAEhI;YACA;YACA;cACA;cACA;gBACA;gBACA;gBACA,oCAAY,WAAa,kGAEL;cACpB;cAEA,oCAAY,2IACqD;cACjE;cACA;YACF;YAEA,yBAAG,UAAqB,yBAAI,kCAAiB;cAC3C;;;YACF;YAEA;cAEA;;;0KAKsB;cACtB;YACA;cAEA;gBACA;gBACA;kBACA;kBACA;oBACA;oBACA;oBACA,iBAAW,GAAR,SAAU,wCAAM;yJAIG;oBACtB;wJAIsB;oBACtB;kBACA;gBACA;cAIF;cAEA;;;;;;;oBACO,gHAAqC;gBAC1C,aAAU,2FAAgD;gBAC1D,IACE,YADG,OAAO,OAAE,SAAd;;kBAQI,YAAU,sCAAK;;kBAEf,YAAU,sCAAK;;gBAErB;;cAEA;;;;;;oBAGO,gHAAqC;oBACrC,qHAAwC;oBACxC,4lBAAkD;oBAClD,oZAA8B;oBAC9B,kEAAuB;gBAC5B,IAAc,OAAc;gBAC5B,IAAc,SAAsB;gBACpC,IAAc,SAAgB;gBAG9B,aAAU,2FAAgD;gBAE1D,IACE,OAgBA,AAEA,KAnBG,OAAO,OAAE,IAAd;;iJAE8C;6CAE1C,UAAY,OAAO;kBACnB,cAAW,sCAA2B;kBACtC,uEAAyB;;;oBAEvB,0FAA4D;oBAC9B,cAAb,sBAAmB;4JAC2B;8MACc;+DACrD;mGACG;kBAC7B;iGAE2B;;8HAEQ;;gJAEM;kBAEzC,yEAA2B;;;oBAEG,cAAX,oBAAiB;oBAClC,iBAA0D,KAAvD,mGAAkD,MAAO,kCAAmB,UAAS;8JACvB;oBACjE;+DACwB;oBACxB,iBAA0D,KAAvD,mGAAkD,MAAO,kCAAmB,UAAS;qGAC3D;oBAC7B;kBACF;iGAE2B;;kBAE3B,oCAAS,GAAF,iCAAI,wDAAqB;;cAGtC;cAEA;;;;;;oBAEO,iIAA6C;oBAC7C,mHAAsC;oBACtC,gHAAqC;oBACrC,gGAA8B;oBAC9B,uDAAiB;gBAEtB,aAAU,uCAAkB;gBAC5B,uCAAU,8CAA2B;gBAErC,gBAAa,oDAAiC;gBAC9C,gBAAa,mFAA2C;gBACxD,eAAY,0IAEiD;8EACxB;gBACrC,cAAW,6CAAmB;8DACV;gBAEpB,oCAAgB,GAAT,UAAW,gCAAC;cAErB;YAEF","file":"kernel_call_transformation.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_call_transformation.clas.locals.mjs":{"lineLengths":[53,50,16,32,68,37,164,145,253,158,17,42,22,67,68,3,29,64,16,3,21,66,76,20,5,298,59,89,18,3,20,65,45,55,67,108,124,259,1108,163,75,71,67,66,104,93,36,131,46,84,34,113,52,7,5,60,67,137,389,220,36,134,51,56,25,112,167,46,139,9,225,14,239,7,68,87,19,5,3,70,25,34,77,39,243,255,353,165,19,44,24,145,5,31,144,63,42,112,14,34,7,18,5,28,68,57,20,5,22,68,47,60,77,60,123,128,615,415,77,76,155,78,112,41,86,54,62,82,119,71,34,103,48,147,9,120,91,154,122,16,260,9,92,84,119,72,36,46,133,9,120,90,48,90,61,94,26,11,194,16,61,94,26,11,141,9,14,139,7,20,5,3,84,35,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_call_transformation.clas.locals_imp.abap"],"names":[],"mappings":";;AAmCA;;;;;;;;;;;;;;;;;;EACE;;IAEE,iBAAc,GAAX,iBAAa,gCAAC;MACf;IACF;IAEA,iCAAS,mQAAwO;IACjP,iCAAS,OAAU,aAAO;IAC1B,iCAAS,kDAAuB;IAClC;;EAEA;;;;QACO,0DAA2B;QAC3B,mGAA8B;QAC9B,mHAA8C;QAC9C,0PAAmC;QACnC,2kCAAmC;QACnC,0JAA2C;QAC3C,kEAAgC;QAChC,8DAA2B;QAC3B,0DAA2B;QAC3B,yDAA+B;IAEpC,IAAc,OAAqB;IAEnC,oBAAwB,mBAAX,gBAAa,gCAAC;IAC3B,eAAa,eAAU;+BAEvB,WAAY,uFAAmD;IAC/D,YAAU,QAAQ,OAAE,aAAa;;;MAG/B,iBAAqB,GAAlB,YAAY,MAAC,OAAO,2DAAwB;QAC7C,oBAAkB,sBAAS;MAC7B;IACF;IAEA;IAEA,iBAAmB,GAAhB,iBAAkB,uBAAS;;MAI5B,kCAAU,2VAEa;;;QAErB;;;sBAA2C;UAC3C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACnB,0JAA6D;UACjC,cAAX,oBAAiB;UAClC,kCAAU,SAAW,oFAED;QACtB;QACA,kCAAU,qLAEY;MACxB;QACE,kCAAU,mMACgG;MAC5G;MAEA,uCAAU,aAAW,QAAO;MAC5B,+EAAwB;MAC1B;;EACF;;EAEA;;;;;;;;;;;;;IAEE;;;MACE,yBAAG,QAAkB;;MAErB;QACE,iBAAU,OAAO;MACnB;MACF;;IAEA;;MACE,YAAS,qCAAqB;MAChC;;IAEA;;;;;;UACO,gHAAsC;UACtC,qHAAwC;UACxC,4lBAAkD;UAClD,oZAA8B;UAC9B,kEAAyB;MAE9B,IAAc,OAAgB;MAC9B,IAAc,SAAsB;MACpC,IAAc,SAAgB;MAE9B,aAAU,2FAAgD;MAE1D,IACE,OAaA,AASA,AAUA,KAjCG,OAAO,OAAE,IAAd;;mCAEI,UAAY,OAAO;QACnB,cAAW,sCAA2B;QACtC,uEAAyB;QACzB,iCAAS,4EAAyB;;;UAEhC,0FAA4D;UAC9B,cAAb,sBAAmB;UACpC,iCAAS,QAAU,8FAEC;QACtB;QACA,iCAAS,6EAA0B;;QAEnC,iBAAsB,GAAnB,OAAO,OAAE,WAAY,kCAAmB,gBAAgB,0BAAI,sBAAoB;UACjF,iCAAS,6EAA0B;QACrC;UACE,iCAAS,yHAEP,8FACgB;QACpB;;QAEA,yEAA2B;QAC3B,iCAAS,4EAAyB;;;UAEJ,cAAX,oBAAiB;UAClC,iCAAS,QAAU,gFAEA;QACrB;QACA,iCAAS,6EAA0B;;QAEnC,IACE,YADG,OAAO,OAAE,SAAd;;UAEI,0BAAG,sBAAoB;YACrB,gFAAyB;YACzB;UACF;UACA,sLAAgE;;UAEhE,0BAAG,sBAAoB;YACrB,gFAAyB;YACzB;UACF;UACA,oCAAS,GAAF,iCAAI,yDAAsB;;;QAGrC,oCAAS,GAAF,iCAAI,yDAAsB;;MAEvC;;EAEF","file":"kernel_call_transformation.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_create_data_handle.clas.mjs":{"lineLengths":[53,38,33,32,53,37,25,337,321,320,318,320,17,42,22,3,29,64,16,3,21,49,3,28,120,58,73,49,67,50,33,5,38,82,52,91,54,90,53,88,51,12,26,120,5,3,20,48,3,27,120,58,73,49,118,121,74,47,84,52,66,3,23,51,3,30,120,58,73,49,127,618,417,74,50,64,17,72,34,124,76,5,47,3,22,50,3,29,120,58,73,49,124,1031,825,72,74,49,89,81,97,51,202,28,107,43,114,43,7,76,43,7,84,36,76,7,5,80,3,21,49,3,28,120,58,73,49,63,43,87,57,95,62,96,63,92,57,93,57,92,87,95,121,93,94,75,78,92,94,75,93,57,93,60,12,26,120,5,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_create_data_handle.clas.abap"],"names":[],"mappings":";;AA8BA;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;IACE,4CAAO,iBAAe;IAEtB;MACA;IACA;IAEA,IACE,OAGA,AAGA,AAGA,KAVG,MAAM,OAAE,IAAb;;mDAGgC;;qDAGE;;oDAGD;;kDAGF;;MAE3B;MACA,oCAAS,GAAF,iCAAI,wCAAM;;EAEvB;EAEA;;;;;;;;QACO,6GAAoC;QACpC,gHAAqC;QACrC,iEAAwB;+BAE7B,QAAU,MAAM;+BAChB,UAAW,yCAA8B;mDAKrB;IAEpB;EACF;EAEA;;;;;;;;QACO,sHAA6C;QAC7C,imBAAuD;QACvD,wZAAwC;QACxC,iEAA8B;+BAEnC,WAAa,MAAM;IACnB,mBAAgB,uCAA4B;IAC5C;;;2HAOsB;MACpB;IACF;IACA;EACF;EAEA;;;;;;;;QACO,mHAA2C;QAC3C,8/BAAyC;QACzC,gzBAAiC;QACjC,+DAAwB;QACxB,iEAA6B;+BAElC,UAAY,MAAM;wFAME;IAEpB;IACA;IAGA,aAAU,gCAAqB;;;MAE7B,iBAAsB,GAAnB,MAAM,MAAC,cAAc,mCAAoB,iBAAgB;QAC1D;MACF,wBAA0B,GAAnB,MAAM,MAAC,cAAc,mCAAoB,iBAAgB;QAC9D;MACF;MACA,iBAAoB,GAAjB,MAAM,MAAC,YAAY,uBAAS;QAC7B;MACF;;;QAEE;MACF;IACF;IAEA;EACF;EAEA;;;;;;;;QACO,sDAAc;IACnB,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAKA,AAGA,AAEA,KAzBG,MAAM,OAAE,SAAb;;;;;;;;;;;;;;;;MAgBI,YAAyB,sBAAf,MAAM,OAAE,OAAS,gCAAC;;MAG5B;;MAEA,YAAyB,sBAAf,MAAM,OAAE,OAAS,gCAAC;;;;;;;MAO5B;MACA,oCAAS,GAAF,iCAAI,wCAAM;;EAEvB;AAEF","file":"kernel_create_data_handle.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_cx_assert.clas.mjs":{"lineLengths":[71,53,29,49,32,44,62,164,145,141,531,17,12,42,22,67,69,64,3,29,63,49,102,64,68,64,66,58,51,41,37,31,50,87,5,16,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_cx_assert.clas.abap"],"names":[],"mappings":";;;AAcA;;;;;;;;;;;;;;;;EAEE;;;;;;;;;kDAC2C;IACzC,OAAE,OAAE,aAAW,QAAQ;IACvB,OAAE,OAAE,WAAS,MAAM;IACnB,OAAE,OAAE,QAAM,GAAG;IACb,yBAAG,OAAE,OAAE,IAAc;MACnB,OAAE,OAAE,iEAAkC;IACxC;IACF;;AAEF","file":"kernel_cx_assert.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_fugr_test.clas.mjs":{"lineLengths":[53,29,24,32,44,37,25,22,17,42,22,3,29,64,16,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_fugr_test.clas.abap"],"names":[],"mappings":";;AAIA;;;;;;;;;;;;;;AAEA","file":"kernel_fugr_test.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_internal_name.clas.mjs":{"lineLengths":[53,33,28,32,48,37,25,294,277,17,42,22,3,29,64,16,3,33,56,3,40,67,71,73,29,79,164,154,147,12,94,5,19,3,33,56,3,40,71,67,61,29,85,157,98,168,158,163,5,23,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_internal_name.clas.abap"],"names":[],"mappings":";;AAeA;;;;;;;;;;;;;;;EAEE;;;;;;;IACE,YAAU,WAAW;IACrB,iBAAW,GAAR,SAAW,2CAAS;MACrB,2JAAkE;MAClE,iJAAyD;MACzD,0IAAmD;IACrD;MACE,kCAAU,4CAAa,QAAO;IAChC;IACF;;EAEA;;;;;;;IACE,gBAAc,OAAO;IACrB,iBAAe,GAAZ,aAAe,6CAAU;MAC1B,oJAA4D;IAC9D,wBAAmB,GAAZ,aAAe,mDAAe;MACnC,+JAAsE;MACtE,qJAA6D;MAC7D,0JAAiE;IACnE;IACF;;AAEF","file":"kernel_internal_name.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_ixml_json_to_data.clas.mjs":{"lineLengths":[53,37,32,32,52,37,25,336,320,432,17,42,22,3,29,64,16,3,31,58,3,38,67,115,61,138,116,132,66,47,84,61,24,20,53,82,45,16,9,69,54,23,7,52,5,19,3,22,49,3,29,67,61,75,58,122,58,116,115,67,137,112,135,122,59,22,18,51,78,42,14,7,67,46,64,54,15,7,5,50,3,25,52,3,32,115,61,75,58,121,116,67,137,75,74,76,151,110,39,84,136,80,123,61,24,20,53,81,45,16,9,70,89,92,48,67,9,7,52,89,73,136,80,67,291,150,7,90,135,80,123,61,24,20,53,81,45,16,9,67,82,65,72,7,52,12,44,120,5,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_ixml_json_to_data.clas.abap"],"names":[],"mappings":";;AAiBA;;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,iIAA8C;QAC9C,2GAAiC;QACjC,2HAAuC;IAE5C,UAAO,kDAA0B;IACjC,yBAAG,eAAmB;MACpB,kBAAe,0DAAwB;;;;;QAErC,cAAW,0DAAyB;QACpC,yBAAG,SAAmB;UACpB;QACF;QAEA,aAAU,8CAAsB;QAChC;;MACF;;IACF;IACF;;EAEA;;;;;;;;;;QAEO,2GAAoC;QACpC,0GAAoC;QACpC,0DAAuB;QACvB,gIAA6C;IAElD,cAAW,4FAAuC;IAClD,oCAA6B,IAAtB,+CAAwB,0CAAQ;IAEvC,iBAAc,mGAA6C;;;;;MAEzD,aAAU,yDAAwB;MAClC,yBAAG,QAAkB;QACnB;MACF;MAEA,aAAU,8CAAyB;MACnC,iBAAW,GAAR,SAAU,QAAO;+DAIG;QACrB;;MACF;IACF;;EACF;EAEA;;;;;;;;QAEO,gHAAyC;QACzC,2GAAoC;QACpC,0DAAuB;QACvB,gIAA6C;QAC7C,kEAA4B;IAEjC,IAAc,OAAgB;IAC9B,IAAc,SAAgB;IAC9B,IAAc,OAAsB;IAEpC,aAAU,2FAAgD;IAC1D,IACE,OAiBA,AAWA,KA7BG,OAAO,OAAE,IAAd;;MAEI,oCAA4B,IAArB,8CAAuB,0CAAQ;MACtC,uEAAyB;MACzB,iBAAc,kGAA4C;;;;;QAExD,cAAW,yDAAwB;QACnC,yBAAG,SAAmB;UACpB;QACF;QACA,aAAU,+CAA0B;QACpC,8EAAsD;QACtD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACiB,cAAb,sBAAmB;kEAER;QAC9B;MACF;;;MAEA,cAAW,mDAA2B;MACtC,oCAA6B,IAAtB,+CAAwB,yCAAO;MACtC,uEAAyB;MACzB,aAAQ,8CAAsB;MAE9B,iBAAsB,GAAnB,OAAO,OAAE,WAAY,kCAAmB,cACvC,iBAAsB,GAAnB,OAAO,OAAE,WAAY,kCAAmB,eAC3C,iBAAsB,GAAnB,OAAO,OAAE,WAAY,kCAAmB,gBAAe;QAC5D,2IAAiD;MACnD;;MAEA,oCAA4B,IAArB,8CAAuB,yCAAO;MACrC,uEAAyB;MACzB,iBAAc,kGAA4C;;;;;QAExD,cAAW,yDAAwB;QACnC,yBAAG,SAAmB;UACpB;QACF;;QAEA,uEAAyB;gEAEC;QAC1B,6DAA6B;MAC/B;;;MAEA;MACA,oCAAS,GAAF,iCAAI,wCAAM;;EAGvB;AAEF","file":"kernel_ixml_json_to_data.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_ixml_xml_to_data.clas.mjs":{"lineLengths":[53,36,31,32,51,37,220,338,321,432,17,42,22,51,3,29,64,16,3,22,48,3,29,67,61,75,58,122,58,122,115,67,137,146,136,179,50,62,5,3,34,60,3,41,115,67,61,137,116,65,144,92,68,148,59,22,18,51,79,43,14,7,211,44,30,54,23,7,5,50,132,19,3,25,51,3,32,115,61,75,58,121,116,115,116,67,137,75,68,115,74,76,151,110,39,84,80,123,61,24,20,53,81,45,16,9,68,89,92,48,67,9,7,52,89,73,53,82,69,7,90,80,123,61,24,20,53,81,45,16,9,67,82,65,72,7,52,88,80,42,177,44,17,9,69,73,73,187,45,17,9,70,73,67,170,63,26,22,55,83,47,18,11,70,151,121,54,59,27,96,52,71,13,11,56,16,129,9,14,46,122,7,5,3,68,139,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_ixml_xml_to_data.clas.abap"],"names":[],"mappings":";;AAsBA;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;QAEO,iHAAuC;QACvC,0GAAoC;QACpC,0DAAuB;QACvB,gIAA6C;IAElD,qCAAU,uGAAmC;+BAG7C,WAAY,4FAAuC;IAEnD,aAAU,gKAGQ;IAClB,yBAAG,kBAAsB;6DAEK;IAC9B;EACF;EAEA;;;;;;;QAEO,gIAA6C;QAC7C,2GAAoC;QACpC,wDAAuB;IAE5B,yIAAkD;IAClD,4CAAO,0CAAsB;IAC7B,4CAAO,kBAAsB;IAE7B,iBAAc,6HAA4C;;;;;MAGxD,cAAW,yDAAwB;MACnC,yBAAG,SAAmB;QACpB;MACF;MACA,WAAQ,gMAAoE;MAC5E,iBAAS,GAAN,OAAQ,QAAO;QAChB,YAAU,QAAQ;QAClB;;MACF;IACF;;IAEA,oCAAS,GAAF,iCAAI,sDAAmB;IAEhC;;EAEA;;;;;;;;QAEO,gHAAyC;QACzC,2GAAoC;QACpC,0GAAoC;QACpC,2GAAoC;QACpC,0DAAuB;QACvB,gIAA6C;QAC7C,kEAA4B;QAC5B,2DAAuB;QACvB,0GAAoC;IAEzC,IAAc,OAAgB;IAC9B,IAAc,SAAgB;IAC9B,IAAc,OAAsB;IAEpC,aAAU,2FAAgD;IAC1D,IACE,OAgBA,AAMA,AAcA,KArCG,OAAO,OAAE,IAAd;;MAEI,uEAAyB;MACzB,iBAAc,kGAA4C;;;;;QAExD,cAAW,yDAAwB;QACnC,yBAAG,SAAmB;UACpB;QACF;QACA,aAAU,6CAAqB;QAC/B,8EAAsD;QACtD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACiB,cAAb,sBAAmB;kEAER;QAC9B;MACF;;;MAEA,cAAW,mDAA2B;MACtC,yBAAG,mBAAuB;QACxB,uEAAyB;QACzB,aAAQ,8CAAsB;MAChC;;MAEA,uEAAyB;MACzB,iBAAc,kGAA4C;;;;;QAExD,cAAW,yDAAwB;QACnC,yBAAG,SAAmB;UACpB;QACF;;QAEA,uEAAyB;gEAEG;QAC5B,6DAA6B;MAC/B;;;MAEA,uEAAyB;MACzB,yBAAG,QAAgB;QAKjB,aAAU,0JAAuD;QACjE,yBAAG,QAAkB;UACnB;QACF;QACA,cAAW,6CAAqB;QAChC,4CAAO,mBAAuB;QAC9B,aAAU,kDAA6B;QACvC,cAAW,mKAA+D;QAC1E,yBAAG,SAAmB;UAEpB;QACF;QACA,cAAW,8CAAsB;QACjC,4CAAO,mBAAuB;QAE9B;QAKA,iBAAc,+IAAgE;;;;;UAE5E,cAAW,yDAAwB;UACnC,yBAAG,SAAmB;YACpB;UACF;UACA,aAAU,6CAAqB;UAC/B,0IAAmD;UAEnD;;;wBAAkC;YAClC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACiB,cAAb,sBAAmB;sEAER;YAC9B;UAEF;;QAWF;UACE,oCAAS,GAAF,iCAAI,6CAAW;QACxB;;QAEA;QACA,oCAAS,GAAF,iCAAI,wCAAM;;IAGvB;EAEF","file":"kernel_ixml_xml_to_data.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_json_to_ixml.clas.mjs":{"lineLengths":[53,32,27,32,47,37,25,335,17,42,22,3,29,64,16,3,22,44,3,29,122,67,61,121,115,134,131,128,342,130,118,67,134,114,124,152,97,69,59,22,18,51,75,42,14,7,54,101,53,39,87,76,38,80,9,141,55,78,31,54,131,57,70,77,86,9,109,54,75,101,54,130,121,55,78,7,5,50,18,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_json_to_ixml.clas.abap"],"names":[],"mappings":";;AAOA;;;;;;;;;;;;;;EAEE;;;;;;;QAGO,gHAAoC;QACpC,0GAAgC;QAChC,6HAA0C;QAC1C,0HAAwC;QACxC,uHAAuC;QACvC,6UAAgD;QAChD,yHAA0C;QAC1C,6GAAmC;QACnC,0DAAmB;QACnB,6HAAyC;QACzC,yGAA+B;QAC/B,mHAAsC;IAE3C,eAAY,mIAAwE;IAEpF,YAAS,+EAAsC;IAC/C,gBAAa,+CAAmB;;;;;MAG9B,aAAU,sDAA4B;MACtC,yBAAG,QAAkB;QACnB;MACF;MAEA,IACE,OA0BA,AAMA,KAjCG,OAAO,OAAE,iBAAd;;mCAEI,SAAW,OAAO;QAGlB,sBAAM,OAAO;QACb,mBAAgB,0DAA0B;;;UAGxC,aAAU,uDAA0B;QACtC;QAEA,gBAAa,mHAAgD;mCAC7D,QAAU,UAAU;6EACc;QAClC,eAAa,MAAM;QAGnB,yBAAG,kBAAsB;UACvB,gBAAa,uGAAmC;qCAChD,QAAU,UAAU;qEACQ;UAE5B,YAAS,qDAA6B;qFACH;QACrC;;mCAGA,UAAY,OAAO;QAGnB,gBAAa,iDAAyB;;mCAGtC,UAAY,OAAO;QAInB,gBAAa,wGAAoC;wHACF;mCAC/C,QAAU,UAAU;6EACc;;IAGxC;;IAEF;;AAEF","file":"kernel_json_to_ixml.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_lock.clas.mjs":{"lineLengths":[53,24,19,32,39,37,25,151,134,17,42,22,3,29,64,16,3,24,38,3,31,44,52,69,39,3,24,38,3,31,44,52,69,3,1,42,21,45],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_lock.clas.abap"],"names":[],"mappings":";;AAcA;;;;;;;;;;;;;;;EAEE;;;;;;IAEE,eAAE,MAAC,WAAQ,+BAAC;IACd;;EAEA;;;;;;IAEE,eAAE,MAAC,WAAQ,+BAAC;EACd;AAEF","file":"kernel_lock.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_numberrange.clas.mjs":{"lineLengths":[53,31,26,32,46,37,670,502,17,42,22,44,3,29,64,16,3,27,48,3,34,107,73,101,58,103,55,418,76,113,126,27,69,88,105,12,64,49,39,64,5,37,3,1,56,582,403,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_numberrange.clas.abap"],"names":[],"mappings":";;AAmBA;;;;;;;;;;;;;;;EAEE;;;;;;;;;;IAEE,IAAc,OAAyB;IACvC;;;;mEAAoF;IACpF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,OAAK,MAAC,YAAsB,mBAAb,OAAK,MAAC,QAAS,gCAAC;IACjC;;MAEE,OAAK,MAAC,iBAAc,WAAW;MAC/B,OAAK,MAAC,YAAS,MAAM;MACrB,OAAK,MAAC,YAAS,+BAAC;IAClB;IACA,WAAS,OAAK,MAAC,OAAM;EACvB;AAEF","file":"kernel_numberrange.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_push_channels.clas.mjs":{"lineLengths":[53,33,28,32,48,37,25,67,17,42,22,3,29,64,16,3,16,39,3,23,60,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_push_channels.clas.abap"],"names":[],"mappings":";;AAOA;;;;;;;;;;;;;;EAEE;;;;IAEE;EAEF;AAEF","file":"kernel_push_channels.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_scan_abap_source.clas.mjs":{"lineLengths":[53,36,31,32,51,37,393,633,2017,1994,1888,131,17,42,22,53,61,3,29,64,16,3,21,47,3,28,44,52,989,471,279,769,552,69,141,96,70,33,39,63,69,5,73,61,41,3,30,56,3,37,66,58,769,67,989,64,88,72,3,22,48,3,29,66,58,768,64,993,76,187,61,62,52,59,15,62,61,61,17,60,771,578,800,34,59,23,52,52,51,48,186,51,36,39,83,196,28,130,44,100,157,7,186,55,49,39,68,89,79,89,9,7,74,38,28,73,52,14,46,211,43,84,11,60,84,135,88,177,11,9,79,7,5,50,3,22,48,3,29,768,64,993,76,808,776,550,109,108,64,74,768,247,64,73,42,58,52,51,137,33,99,55,16,54,9,7,130,54,41,41,139,35,101,138,119,87,11,9,73,35,76,9,73,35,113,9,44,65,146,88,98,110,77,92,14,93,7,5,3,1,66,311,56,59,53,56,55,571,60,69,67,58,63,69,66,63,59,61,785,1005,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_scan_abap_source.clas.abap"],"names":[],"mappings":";;AAiDA;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;QAIO,o9BAAyB;QACzB,8cAA0B;QAC1B,8QAAiC;QACjC,wvBAA0B;QAC1B,+hBAAkC;QAClC,4DAAsB;IAE3B;+FAO4B;;;MAG1B,sBAAM,SAAS;MACf,kCAAmB,YAAc,SAAS;MAC1C,gCAAO,mBAAa,SAAS;IAC/B;IAEA;IACA;IAEA;EAEF;EAEA;;;;;;;;;;uFASiC;uEAMA;EAEjC;EAEA;;;;;;;;;;;;;QAMO,2CAA4B;QAC5B,kDAA2B,CAAA;;QAC3B,qDAAmB;QACnB,oDAAmB;QACnB,oDAA2B,CAAA;;QAC3B,mDAAmB;QACnB,0vBAA4B;IAEjC,IAAc,QAA6B;IAC3C,IAAc,QAAiC;IAE/C,SAAO,MAAM,MAAC,OAAM;IACpB,4BAAM;;;;MACJ,cAAY,6BAAS;MACrB,WAAS,6BAAQ;MAEjB,0BAAG,mBAAuB,iBAAc,GAAV,WAAa,oCAAG,iBAAc,GAAV,6CAAiB;;QAEjE,QAAM,MAAC,SAAM,GAAG;QAChB,QAAM,MAAC,SAAM,MAAM;QACnB,QAAM,MAAC,UAAO,gCAAQ,MAAC,WAAU;MACnC,wBAAY,GAAL,MAAO,MAAM,MAAC,QAAO,IAAI,cAAY,GAAV,WAAY,oCAAG,iBAAa,GAAV,6CAAkB,CAAC;QACtD;MAOjB,wBAAY,GAAL,MAAO,MAAM,MAAC,QAAO,iBAAc,GAAV,WAAY,qCAAG;QAC7C,sBAAM,YAAY;QAClB,gCAAgB,6CAAwB,YAAY;;MAGtD;MAEA,IAAG,cAAO,GAAL,MAAO,MAAM,MAAC,QAAO,iBAAc,GAAV,6CAAkB,CAC5C,iBAAU,GAAP,QAAS,oCAAE;;QAEhB,QAAM,MAAC,gBAAa,SAAS;QAC7B,QAAM,MAAC,UAAO,KAAK;QACnB,QAAM,MAAC,QAAK,yBAAO,WAAW;QAC9B,UAAkB,mBAAV,QAAM,MAAC,IAAK,gCAAC;QAErB,iBAAa,GAAV,WAAY,qCAAG;UAEhB,gCAAgB,mCAAgB,SAAS;QAG3C;MACF;MAEA,iBAAa,GAAV,6CAAgB;QACjB,SAAO,MAAM,MAAC,OAAM;QACL;QACf,QAAU,mBAAJ,IAAM,gCAAC;QACb,WAAS,+BAAC;MACZ;QACE,0BAAG,SAAkB;UACnB,IAAG,cAAY,GAAV,WAAY,qCAAI,iBAAW,GAAP,QAAS,gCAAE,CAAE,iBAAa,GAAV,WAAY,qCAAG;YACtD,SAAO,MAAM,MAAC,QAAO;YACrB,QAAM,MAAC,UAAO,gCAAQ,MAAC,QAAO;UAChC;UACA,iBAAQ,GAAL,MAAO,MAAM,MAAC,SAAO;YACtB,QAAM,MAAC,UAAO,gCAAQ,MAAC,QAAO;YAC9B,sCAAY,QAAM,MAAC,MAAI,oBAAe,QAAM,MAAC,IAAqB;UACpE,wBAAiB,GAAV,WAAa,qCAAG;YACrB,QAAM,MAAC,+BAAM,QAAM,MAAC,KAAO,mGAA2B;UACxD;QACF;QACA,WAAgB,mBAAP,OAAS,gCAAC;MACrB;IAEF;;EAEF;EAEA;;;;;;;;IACE,IAAc,gBAAyC;QAClD,+vBAA6C;QAC7C,6hBAAyC;QACzC,oGAAiC;QACjC,mGAAiC;QACjC,uDAAyB;QACzB,iEAAyB;QACzB,uvBAAiC;QACjC,8OAA4D;QAC5D,uDAAyC;;;MAG5C,uBAAqB,eAAE,MAAC,MAAK;MAG7B,qBAAmB,uBAAU;MAC7B,oBAAkB,uBAAU;;;QAE1B,iBAAiB,GAAd,QAAQ,MAAC,OAAO,gCAAQ,MAAC,SAAO;UACjC,qBAAmB,sBAAS;QAC9B;UACE,oBAAkB,sBAAS;QAC7B;MAEF;MAEA,iBAAoB,GAAjB,kBAAmB,uBAAU,iBAAoB,GAAhB,iBAAkB,uBAAS;QAI7D,aAAW,+BAAC;QACZ,sBAAM,SAAS;QACf,sBAAM,SAAS;;;UAGb,iBAAiB,GAAd,QAAQ,MAAC,OAAO,gCAAQ,MAAC,SAAO;YACjC,2HAAsC;YACtC,wGAAsC;YACtC,aAAoB,mBAAT,SAAW,gCAAC;UACzB;QACF;;;;QAGA;;;UAEE,oGAAwD;QAC1D;QAEA,sBAAM,YAAY;QAClB,YAAY,MAAC,UAAO,gBAAc,MAAC,KAAI;QACvC,YAAY,MAAC,QAAoC,qBAAX,mBAApB,gBAAc,MAAC,MAAO,UAAW,gCAAC;QACpD,YAAY,MAAC,UAAO,oCAAY,MAAC,QAAO;QAExC,gBAAc,MAAC,UAA2B,mBAApB,gBAAc,MAAC,MAAO,SAAQ;QAEpD,mGAA+D;MACjE,wBAAwB,GAAjB,kBAAmB,uBAAS;QACjC,gBAAc,MAAC,UAAO,oCAAY,MAAC,QAAO;MAC5C;QACE,gBAAc,MAAC,UAAO,oCAAY,MAAC,SAAQ;MAC7C;IACF;EACF;AAEF","file":"kernel_scan_abap_source.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/kernel_unit_runner.clas.mjs":{"lineLengths":[53,31,26,32,46,37,168,406,1350,1528,307,2286,17,42,22,52,50,3,29,64,16,3,29,50,3,36,71,102,64,68,250,101,45,102,68,31,97,45,17,69,147,64,14,7,5,23,3,24,45,3,31,67,1332,61,1116,252,69,70,67,30,44,142,144,154,156,152,154,153,155,707,70,5,137,145,19,3,31,52,3,38,544,652,64,442,330,68,31,60,74,5,40,70,22,3,20,41,3,27,1508,652,64,442,63,92,67,544,330,101,121,1150,70,70,31,167,88,91,92,58,11,177,124,41,19,124,16,18,9,7,328,33,67,67,13,173,120,37,21,126,18,20,11,9,44,61,13,225,172,89,85,73,21,100,29,86,67,71,65,98,75,89,27,86,98,96,75,18,20,11,9,44,49,13,176,123,40,21,126,18,20,11,9,7,11,180,127,44,19,124,16,18,9,7,5,84,21,3,1,56,81,339,58,56,58,458,663,103,1134,1519,346,555,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/output/kernel_unit_runner.clas.abap"],"names":[],"mappings":";;AA6DA;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,2DAAoB;QACpB,iPAAuD;QACvD,4FAAuB;IAC5B;IACA;;;MAGE,iBAAY,GAAT,UAAY,0DAAuB;QACpC,aAAW,sBAAS;QACpB;MACF,wBAAgB,GAAT,UAAW,uBAAS;QACzB,wIAAqD;QACrD,gBAAc,4BAAU,UAAU;QAClC;MACF;IACF;IACF;;EAEA;;;;;;;QAIO,mlCAA+B;QAC/B,mPAAyD;QACzD,4DAAkC;QAClC,6DAAsB;;;MAIzB,eAAa,OAAO,MAAC,QAAO;MAC5B,qIAAsD;MACtD,uIAAwD;MAExD,iJAA4D;MAC5D,mJAA8D;MAE9D,+IAA0D;MAC1D,iJAA4D;MAE5D,gJAA2D;MAC3D,kJAA6D;MAE7D,2rBASgD;MAChD,gCAAO,mBAAa,UAAU;IAChC;IACA,sCAAqB,qBAAgB,OAAwB;IAC7D,kCAAU,2DAAO,QAAW,sCAAG;IACjC;;EAEA;;;;;;;QACO,ibAA8B;QAC9B,iUAAgC;;;MAEnC,kCAAmB,UAAY,QAAQ;MACvC,iEAAqC;IACvC;IACA;;IAEF;;EAEA;;;;;;;QAEO,ibAAgC;QAChC,sDAAiB;QACjB,mFAA6B;QAC7B,0DAAsB;QACtB,uhBAA0B;QAC1B,iUAAkC;QAClC,4FAA8B;QAC9B,gHAAuC;IAC5C,IAAc,aAAuC;IAIrD,gBAAa,gDAA0B;;;MAIrC,+JAAoE;;;;;MAGpE;;;;;;;;;MAGA;;;;QAIE,kCAAmB,UAAY,aAAW;QAE1C;;;;;;;;;QAGA;QAEA,2BAAmB,OAAO;QAC1B,sBAAM,6BAAU;QAChB;;;;UAEI,aAAW,MAAC,YAAU,4BAAS,MAAC,QAAO;UACvC,aAAW,MAAC,aAAU,6BAAU;;;;;;;;;;;;;;;;;;;QAapC;QACA,2BAAmB,OAAO;QAC1B,aAAW,MAAC,aAAU,OAAO;QAE7B;;;;;;;;;QAGA;MACF;MAEA;;;;;;;;;MAGA;IAEF;IAEA,SAAS,MAAC,WAAO,oDAAyB;IAE5C;;AAEF","file":"kernel_unit_runner.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/number_get_next.fugr.number_get_next.mjs":{"lineLengths":[53,44,39,42,49,37,39,36,39,29,43,3,114,67,1,58,65],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"number_get_next.fugr.number_get_next.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.call_v1_ping.mjs":{"lineLengths":[53,34,36,1,52,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.call_v1_ping.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.conversion_exit_alpha_input.mjs":{"lineLengths":[53,49,51,32,37,32,39,29,42,3,60,48,64,20,52,58,137,61,139,24,13,5,81,10,80,3,37,34,11,3,57,102,63,51,79,3,48,21,1,82,70],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.conversion_exit_alpha_input.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.conversion_exit_alpha_output.mjs":{"lineLengths":[53,50,52,32,37,32,39,29,42,3,20,107,57,123,63,51,79,3,48,1,84,71],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.conversion_exit_alpha_output.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.conversion_exit_isola_input.mjs":{"lineLengths":[53,49,51,36,37,36,39,29,43,3,92,86,63,3,1,82,70],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.conversion_exit_isola_input.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.conversion_exit_isola_output.mjs":{"lineLengths":[53,50,52,36,37,36,39,29,43,3,7,92,39,15,20,42,72,59,11,14,18,7,5,3,86,71],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.conversion_exit_isola_output.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.convert_itf_to_stream_text.mjs":{"lineLengths":[53,48,50,33,31,45,51,35,264,3,32,40,38,46,34,124,3,38,37,94,11,3,116,1,80,69],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.convert_itf_to_stream_text.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.docu_get.mjs":{"lineLengths":[53,30,32,33,31,36,37,37,39,34,33,28,32,30,136,11,3,21,116,1,44,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.docu_get.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.function_exists.mjs":{"lineLengths":[53,37,39,36,43,65,100,24,53,79,60,65,3,1,58,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.function_exists.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.generate_sec_random.mjs":{"lineLengths":[53,41,43,29,39,34,39,29,66,3,83,40,77,1,66,62],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.generate_sec_random.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.get_system_timezone.mjs":{"lineLengths":[53,41,43,37,43,31,97,3,55,1,66,62],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.get_system_timezone.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.system_callstack.mjs":{"lineLengths":[53,38,40,44,45,32,506,3,335,43,73,69,64,1,60,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.system_callstack.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.system_installed_languages.mjs":{"lineLengths":[53,48,50,39,45,32,46,3,45,67,1,80,69],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.system_installed_languages.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.text_split.mjs":{"lineLengths":[53,32,34,37,39,35,35,34,35,27,41,3,34,35,27,41,3,92,19,50,10,43,43,52,3,1,48,53],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.text_split.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/openabap.fugr.unit_conversion_simple.mjs":{"lineLengths":[53,44,46,36,37,33,41,30,90,3,34,43,31,91,3,36,39,29,43,3,60,43,22,146,80,148,82,147,65,56,149,69,56,10,110,3,1,72,65],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"openabap.fugr.unit_conversion_simple.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/seoc.type.mjs":{"lineLengths":[16,54,39,52,37,53,38,56,41,54,39,55,40,67,40,73,46,30,38],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"seoc.type.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/seoo.type.mjs":{"lineLengths":[16,55,40,52,37,51,36,50,35,30,38],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"seoo.type.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/seop.type.mjs":{"lineLengths":[16,68,47,68,47,64,43,69,47,30,38],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"seop.type.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/seos.type.mjs":{"lineLengths":[16,55,40,55,40,30,38],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"seos.type.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/seox.type.mjs":{"lineLengths":[16,52,27,53,28,30,38],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"seox.type.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_abap_language_vers.clas.mjs":{"lineLengths":[53,43,38,32,58,37,25,356,359,541,508,17,42,22,3,29,64,16,3,47,84,102,70,68,85,114,83,9,116,106,91,79,187,135,202,149,100,242,189,166,48,146,141,153,141,162,150,14,142,7,17,78,142,14,16,7,5,36,3,47,140,107,82,102,70,68,110,83,9,112,102,91,75,187,135,202,149,96,226,173,185,17,78,149,14,16,7,5,41,3,47,84,123,61,133,57,140,5,36,3,34,103,123,61,102,70,84,142,45,12,164,47,399,47,14,48,7,5,22,3,1,80,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_abap_language_vers.clas.abap"],"names":[],"mappings":";;AAoCA;;;;;;;;;;;;;;;;;EAGE;;;;QAEO,2DAAoB;QACpB,4EAAqC;QACrC,yGAA+C;IAEpD,aAAW,gEAA8B;IAEzC;;;;;;;;;;;;;MAaI,IACE,OAEA,AAEA,KALG,yBAAL;;QAEI,6BAA2B,wCAAyB,+CAAuB,MAAC,SAAQ;;QAEpF,6BAA2B,wCAAyB,+CAAuB,MAAC,SAAQ;;QAEpF,6BAA2B,wCAAyB,+CAAuB,MAAC,kBAAiB;;QAE7F,6BAA2B,wCAAyB,+CAAuB,MAAC,UAAS;;;;;;;;IAI7F;IACF;;EAGA;;;;;;QAEO,2DAAoB;QACpB,qGAA2C;IAEhD,aAAW,gEAA8B;IAEzC;;;;;;;;;;;;;;;;;;;IAkBA;IAEF;;EAGA;;;;IACE,8BAA2B,iGAAyD;IACpF,yBAAG,yBAAmC;MACpC,6BAA2B,wCAAyB,+CAAuB,MAAC,UAAS;IACvF;IACF;;EAGA;;;;;;IAEE,IACE,aADG,8DAAL;;MAEI,eAAa,sBAAS;;MAEtB,iBAA6C,IAA1C,iEAA4C,qEAA4C;QACzF,eAAa,sBAAS;MACxB,wBAC6C,IAA7C,sEAA+C,wCAAyB,+CAAuB,MAAC,WAAU,iBAC7D,IAA7C,gEAA+C,wCAAyB,+CAAuB,MAAC,UAAQ;QACtG,eAAa,sBAAS;MACxB;QACE,eAAa,uBAAU;MACzB;;IAGN;;AACF","file":"zcl_abapgit_abap_language_vers.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_adt_link.clas.mjs":{"lineLengths":[53,33,28,32,48,37,25,843,456,557,444,304,17,42,22,3,29,64,16,3,31,54,3,38,67,100,76,184,19,3,25,48,3,32,69,55,73,54,73,59,85,70,82,71,103,99,103,102,102,98,214,9,60,189,42,9,216,163,279,64,47,9,7,117,58,63,25,110,153,35,19,80,123,16,18,9,7,23,5,44,67,5,51,57,75,56,75,105,90,104,87,104,69,104,69,106,68,68,94,100,35,35,11,13,136,45,21,26,48,65,17,20,24,13,11,94,125,11,204,152,219,166,95,132,125,11,208,155,95,220,167,128,124,65,70,29,114,220,167,141,23,84,127,20,22,13,11,9,43,66,9,50,122,72,73,98,64,77,113,116,15,116,47,23,28,50,84,76,67,19,22,26,15,13,96,127,13,17,216,163,107,226,173,140,123,25,86,129,22,24,15,13,43,11,29,52,11,36,63,81,62,81,67,93,78,90,79,17,173,163,25,86,129,22,24,15,13,11,9,68,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/jump/zcl_abapgit_adt_link.clas.abap"],"names":[],"mappings":";;AA8DA;;;;;;;;;;;;;;;;;;EAEE;;;;;;;IAEE,kLAAgF;IAClF;;EAEA;;;;;;;;;;;;;QAEQ,8DAA6B;QAC7B,8FAAoC;QACpC,0FAAoC;QACpC,8FAAoC;QACpC,6FAA+B;QAC/B,6FAA+B;IAErC,IAAe,UAAoB;qNAUC;IAEpC;MACI,yBAAG,0BAA8B;QAE/B,IAAG,cAAa,GAAX,YAAc,YAAY,yBAAI,WAAsB,CAAE,IACxD,cAAa,GAAX,YAAa,WAAW,yBAAI,0BAA+B,CAAC;UAC/D,eAAa,eAAe;QAC9B;;;;QAYA,yBAAG,4BAAgC;UACjC,kBAAgB,iBAAiB;QACnC;MAEF;MAEA;;;sBAAkD;QAClD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEnB,sCAAY,2CAAS,eAAE,MAAC,QAAM,qBAAc,WAAW;QAEvD,cAAY,WAAW;;;;;;;MAI3B;MAEF;;IAGA;;;;;;;;;;;;;;;;UAEO,+FAAgC;UAChC,yDAAiC;UACjC,yDAA0C;UAC1C,mFAAoC;MAEzC,IAAc,UAAoB;MAElC,gBAAc,WAAW;MACzB,gBAAc,WAAW;MAEzB;;sIAQyB;;;;;;;;;;;UACrB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4HACkC;UAClD;;;;;;UAMA,iBAC8C,IAD3C,0EAC6C,wBAAU;4HACR;UAClD;;;;;;;UAYA;;;0BAAqD;YACrD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;;;;;;;;UAWvB;QAEF;QAGA;;;;;;;;;cAEQ,8DAA+C;cAC/C,kGAAwC;cACxC,qGAAoC;;kHAUf;;;;;;;;;;;;;YAE3B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;8HACkC;YAClD;YAEA;;;;;;;cAWI,4BAA0B,iCAA6B,GAAlB,mBAAoB,uBAA/B,CAA0C;;;;;;;YAIxE;YAEF;;UAGA;;;;;;;;;;;;gBAEO,8DAAuB;YAE5B;cACI,iBAAc,4IAIsB;kKAEkD;;;;;;;YAI1F;UAEF;QACF","file":"zcl_abapgit_adt_link.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_aff_registry.clas.mjs":{"lineLengths":[53,37,32,32,52,63,543,209,87,292,225,17,42,22,60,132,3,29,131,73,37,40,12,145,5,16,3,37,80,80,80,80,80,80,121,80,80,80,3,25,52,3,32,54,73,108,85,112,265,54,62,107,3,66,102,54,73,265,69,45,5,87,30,73,76,27,49,170,44,198,44,12,45,5,21,3,1,68,462,282,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/aff/zcl_abapgit_aff_registry.clas.abap"],"names":[],"mappings":";;AAsCA;;;;;;;;;;;;;;;EAGE;;;IACE,8BAA0B;MACxB,qBAAc,WAAW;IAC3B;MACE,sBAAc,mHAAqD;IACrE;IACF;;EAGA;+EACkC;+EACA;+EACA;+EACA;+EACA;+EACA;wHAEO;+EACP;+EACA;+EACA;EAClC;EAGA;;;;;;;;;QACO,gQAAwC;IAE7C,iBAAiB,MAAC,cAAW,WAAW;IACxC,iBAAiB,MAAC,kBAAe,eAAe;IAChD,oGAA+C;EACjD;EAGA;;;;QAEO,gQAAwC;IAE7C,yBAAG,qCAAsB;4CACK;IAC9B;IAEA;;;;;+CAAmF;IACnF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAmC,GAA/B,iBAAiB,MAAC,eAAe,wBAAU;MAC7D,cAAY,sBAAS;IACvB,wBAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAA8C,IAA1C,2DAA4C,uBAAS;MAC3E,cAAY,sBAAS;IACvB;MACE,cAAY,uBAAU;IACxB;IACF;;AACF","file":"zcl_abapgit_aff_registry.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson.clas.mjs":{"lineLengths":[52,53,30,25,32,45,56,218,584,228,1233,162,161,163,985,980,1866,62,803,874,754,517,675,17,42,22,59,508,152,97,95,97,1212,52,48,50,42,58,58,56,52,62,56,46,50,78,46,42,44,58,56,58,52,62,52,48,58,44,54,46,48,42,60,66,66,88,48,3,29,111,94,118,111,94,117,122,127,140,63,85,83,16,3,29,49,3,36,125,151,91,111,94,118,111,94,117,122,127,140,226,63,23,3,28,48,3,35,125,132,82,141,67,143,67,160,47,122,5,403,77,112,12,114,54,149,7,54,149,7,193,5,23,3,31,744,67,61,67,61,772,67,74,772,67,101,114,27,57,88,25,5,97,87,126,128,5,35,115,12,63,54,117,7,5,23,3,25,770,67,61,769,298,110,69,133,146,27,89,88,44,5,19,3,20,40,3,27,125,111,94,118,111,94,117,122,127,140,226,23,3,22,42,3,29,125,67,61,102,67,100,151,91,111,94,118,149,84,103,148,63,76,61,57,5,23,3,34,774,67,61,261,777,71,71,744,103,111,59,22,18,51,38,78,111,124,29,67,90,43,61,127,146,166,11,9,48,48,123,114,7,130,76,28,90,14,7,5,50,23,3,30,80,137,5,3,56,269,67,61,78,770,769,120,59,40,152,5,133,155,5,192,33,42,245,88,132,103,135,70,93,45,16,40,9,74,14,277,7,5,27,3,35,36,45,3,35,125,69,19,3,41,125,67,61,36,299,111,102,25,19,3,41,102,67,61,113,21,3,41,125,141,67,91,19,3,50,125,103,70,101,55,25,19,3,36,61,3,38,68,67,61,770,59,50,40,5,20,3,46,101,67,61,770,59,165,22,142,118,69,43,5,20,3,43,61,67,61,770,47,47,47,59,177,170,82,5,20,3,46,64,67,61,770,59,177,40,5,20,3,48,103,67,61,770,59,50,43,5,24,3,45,62,67,61,770,59,177,40,5,20,3,45,68,67,61,770,59,175,40,5,20,3,48,96,67,61,152,770,59,40,22,5,105,9,91,17,110,24,14,16,7,5,20,3,38,99,131,18,3,45,125,67,25,19,3,38,125,143,67,91,19,3,42,264,67,61,78,769,120,192,33,80,5,22,3,34,507,30,19,3,39,125,67,61,45,55,772,774,36,61,42,158,5,135,156,5,973,297,68,99,124,104,160,83,35,106,46,47,96,25,19,3,38,125,67,61,45,55,108,85,111,103,76,299,772,748,106,36,25,137,21,5,538,157,5,111,46,57,246,14,214,7,21,5,87,70,147,51,973,70,135,177,289,102,5,55,301,12,269,5,100,113,98,5,19,3,39,125,68,64,67,66,62,45,63,41,27,21,5,115,55,54,39,27,21,5,65,176,5,75,64,82,99,83,100,89,25,83,234,25,75,212,162,12,108,213,164,7,82,5,25,19,3,46,125,67,61,45,55,25,100,76,116,19,3,43,125,67,61,59,58,25,66,111,115,19,3,46,125,67,61,62,58,25,115,19,3,43,125,67,61,25,80,120,19,3,45,125,67,61,44,55,25,66,23,115,19,3,48,125,67,61,94,58,25,76,124,125,19,3,40,125,67,61,124,740,78,299,67,75,83,120,68,122,63,135,148,27,91,88,21,5,46,46,47,108,100,149,29,152,110,5,28,19,3,44,67,65,67,108,207,19,3,46,125,67,61,101,64,98,770,748,744,299,36,111,46,59,59,120,84,21,5,60,127,12,61,5,40,774,89,72,113,59,59,120,139,65,7,84,140,173,5,25,19,3,42,109,88,114,51,73,152,40,335,111,3,61,125,102,67,99,65,25,19,3,1,54,130,95,58,94,82,95,55,85,82,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson.clas.abap"],"names":[],"mappings":";;;AAiIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;IACE,YAAO,MAAC,qBAAkB,kBAAkB;IAC5C,YAAO,MAAC,gCAA6B,6BAA6B;kFAC7B;IACvC;;EAGA;;;;;;;;;;;;;;;;;IAME,WAAW,OAAE,sBAAoB,iBAAiB;IACpD;;EAGA;;;;;;;;;;;QAEO,uJAA8C;IAEnD,yBAAG,eAA2B;yHACwB;IACtD;;IAQA,yBAAG,UAAuB,yBAAI,UAAsB;MAClD,WAAW,OAAE,mCAAe,cAAc,OAAE,8BAAY;IAC1D;;MAEE,yBAAG,oBAAkB;oJAEyC;MAC9D;MACA,yBAAG,oBAAkB;oJACyC;MAC9D;gMAK8C;IAChD;IAEF;;EAGA;;;;;;;;QAEO,iEAA0B;QAC1B,2vBAAwB;IAE7B;;;;uDAGkB;IAClB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;;IAIA,iBAAwB,GAArB,WAAW,MAAC,WAAW,gCAAC;MACzB,yCAAiB,8BAAW,QAAW,uCAAI;;IAE7C;IAGA,4BAAwB;MACtB,SAAS,OAAE,aAA+B,qBAApB,SAAS,OAAE,SAAW,gCAAC;IAC/C;MACE,eAAY,wCAAmB;MAC/B,yBAAG,oBAAwB;QACzB,SAAS,OAAE,aAA+B,qBAApB,SAAS,OAAE,SAAW,gCAAC;MAC/C;IACF;IAEF;;EAGA;;;;IAEE,IAAc,QAAgC;QACzC,iSAAuD;IAC5D,kBAAe,sFAAgC;IAE/C;;;;uFAI4B;IAC5B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACgB,eAAZ,qBAAmB;IACtC;IAEF;;EAGA;;;;;;;;;;;;;;;IAMA;;EAGA;;;;;;;;;;;;;;;QAEO,4IAAqC;;;IAI1C,WAAW,OAAE,oCAAe,wFAEe;IAC3C,WAAW,OAAE,sBAAoB,iBAAiB;IAClD,WAAW,OAAE,OAAO,MAAC,qBAAkB,kBAAkB;IAEzD,iBAAa,GAAV,WAAY,uBAAS;wDACA;IACxB;IAEF;;EAGA;;;;QAEO,4PAAyB;QACzB,gwBAA+B;QAC/B,8DAAuB;QACvB,8DAAuB;QACvB,+tBAAqC;IAE1C;;;;;;MAIE,mBAAiB,WAAW;MAC5B;;;;iEAGsB;MACtB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,sBAAM,WAAW;QACjB,yBAAG,yBAA6B;UAC9B,cAAc,OAAE,aAAoC,mBAAzB,cAAc,OAAE,SAAW,gCAAC;UACvD,iBAAwB,GAArB,cAAc,OAAE,MAAO,wCAAyB,iCAAS,MAAC,OAAK;YAChE,WAAW,MAAC,YAAQ,2HAEM;UAC5B;QACF;QACA,WAAW,MAAC,UAAO,WAAW;QAC9B,WAAW,MAAC,UAAO,WAAW;QAC9B,WAAW,MAAC,UAAO,wCAAyB,iCAAS,MAAC,OAAM;QAC5D,uGAAqE;MACvE;MACA,sCAAc,kCAAe,YAAe,sCAAG;MAC/C;0BAAkD;MAClD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd;MACF;IACF;;IAEF;;EAGA;IACE,iBAAqB,GAAlB,YAAO,MAAC,YAAY,uBAAS;wIACqC;IACrE;EACF;EAGA;;;;QAEO,qEAA8B;QAC9B,yvBAAoD;IACzD,IAAc,QAAgC;IAE9C,wBAAqB,0FAAoC;IACzD,aAAU,wCAAmB;IAE7B,yBAAG,QAAkB;uJAC4C;IACjE;IACA,iBAAiB,GAAd,OAAO,OAAE,MAAQ,wCAAyB,iCAAS,MAAC,OAAK;0JACQ;IACpE;;;MAGE,IACE,OAEA,AAEA,KALG,QAAM,MAAC,KAAZ;;QAEI,gCAAO,QAAM,MAAC,gBAAS,eAAe;;QAEtC,gCAAO,6CAAM,eAAe;;YAEvB,yDAAkB;QACvB,iBAAgB,GAAb,QAAM,MAAC,QAAQ,wCAAM;UACtB,WAAS,sBAAS;QACpB;UACE,sBAAM,MAAM;QACd;QACA,gCAAO,gBAAU,eAAe;;oRAGqB;;IAE3D;IAEF;;EAGA;mCAEuB;IACrB,sBAAM,iBAAY;EAEpB;EAGA;;IACE,aAAU,kDAAiB;IAC7B;;EAGA;;;;mCAEuB;QAEhB,kSAAwD;IAC7D,mBAAgB,sFAAgC;qGAIhB;IAEhC,YAAU,OAAE;IAEd;;EAGA;;;;IACE,cAAY,yCAAO,mDAAP,CAA2C;IACzD;;EAGA;;;;IACE,aAAU,wEAEoB;IAChC;;EAGA;;;;;IACE,YAAO,MAAC,qBAAkB,UAAU;IACpC,YAAU,OAAE;IACd;;EAGA;IACE,YAAO,MAAC,eAAY,sBAAS;EAC/B;EAGA;;;;QAEO,yvBAAoD;IACzD,aAAU,wCAAmB;IAC7B,yBAAG,kBAAsB;MACvB,aAAW,OAAO,OAAE,KAAK;IAC3B;IAEF;;EAGA;;;;QAEO,yvBAAoD;IACzD,aAAU,wCAAmB;IAC7B,yBAAG,QAAmB,iBAAiB,GAAd,OAAO,OAAE,MAAO,wCAAyB,iCAAS,MAAC,MAAI;MAC9E;IACF,wBAAqB,GAAd,OAAO,OAAE,MAAO,wCAAyB,iCAAS,MAAC,SAAO;MAC/D,aAAW,gCAAsB,GAAf,OAAO,OAAE,OAAQ,wCAAxB,CAAgC;IAC7C,gCAAO,OAAO,OAAE,gBAAoB;MAClC,aAAW,sBAAS;IACtB;IAEF;;EAGA;;;;QAEO,yvBAAoD;QACpD,sCAAoB;QACpB,sCAAoB;QACpB,sCAAoB;IAEzB,aAAU,wCAAmB;IAE7B,yBAAG,kBAAuB,iBAAkB,GAAd,OAAO,OAAE,MAAO,wCAAyB,iCAAS,MAAC,QAAM;;MAIrF,sCAAY,MAAK,MAAK,eAAU,QAAQ;IAC1C;IAEF;;EAGA;;;;QAEO,yvBAAoD;IACzD,aAAU,wCAAmB;IAC7B,yBAAG,kBAAuB,iBAAkB,GAAd,OAAO,OAAE,MAAO,wCAAyB,iCAAS,MAAC,QAAM;MACrF,aAAW,OAAO,OAAE,KAAK;IAC3B;IAEF;;EAGA;;;;QAEO,yvBAAoD;IACzD,aAAU,wCAAmB;IAC7B,yBAAG,kBAAsB;MACvB,iBAAe,OAAO,OAAE,IAAI;IAC9B;IAEF;;EAGA;;;;QAEO,yvBAAoD;IACzD,aAAU,wCAAmB;IAC7B,yBAAG,kBAAuB,iBAAkB,GAAd,OAAO,OAAE,MAAO,wCAAyB,iCAAS,MAAC,QAAM;MACrF,aAAW,OAAO,OAAE,KAAK;IAC3B;IAEF;;EAGA;;;;QAEO,yvBAAoD;IACzD,aAAU,wCAAmB;IAC7B,yBAAG,kBAAuB,iBAAkB,GAAd,OAAO,OAAE,MAAQ,wCAAyB,iCAAS,MAAC,MAAI;MACpF,aAAW,OAAO,OAAE,KAAK;IAC3B;IAEF;;EAGA;;;;QAEO,+IAAuC;QACvC,yvBAAoD;IAEzD,aAAU,wCAAmB;IAE7B,yBAAG,QAAkB;MACnB;IACF;;IAIA;MACI,cAAW,qEAA0C;;;;;;;IAGzD;IAEF;;EAGA;;IACE,WAAS,gCAA6B,GAAtB,yBAAO,qBAAiB,gCAA/B,CAAkC;IAC7C;;EAGA;;IACE,YAAO,MAAC,qBAAkB,sBAAS;IACnC,YAAU,OAAE;IACd;;EAGA;;;;IACE,aAAU,wEAEoB;IAChC;;EAGA;;;;QAEO,qEAA8B;IACnC,IAAc,QAAgC;IAE9C,wBAAqB,0FAAoC;;;MAGvD,gCAAO,QAAM,MAAC,eAAQ,UAAU;IAClC;IAEF;;EAGA;;IACE,YAAU,YAAO;IACnB;;EAGA;;;;;;QAEO,2vBAAsD;QACtD,6vBAAwD;mCAExC;IAErB,eAAY,wCAAmB;IAE/B,yBAAG,UAAoB;6JACgD;IACvE;IAEA,iBAAmB,GAAhB,SAAS,OAAE,MAAQ,wCAAyB,iCAAS,MAAC,OAAK;2JACO;IACrE;QAEK,o8BAAsD;QACtD,gSAAsD;QACtD,2DAAmB;IAExB,iBAAuC,mBAApB,SAAS,OAAE,SAAW,gCAAC;IAC1C,WAAW,MAAC,WAAO,0FAAoC;IACvD,WAAW,MAAC,iFAAyB;IAErC,kBAAe,wIAGY;IAC3B;iCAA0D;IAC1D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IACnB,WAAW,OAAE,UAAQ,YAAY;IAGjC,SAAS,OAAE,aAAW,YAAY;IAClC,yFAAoD;IAEpD,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;;;QAEO,kSAAwD;QACxD,2vBAAsD;QACtD,muBAAqD;QACrD,iGAAyD;mCAEzC;IAErB,YAAU,OAAE;IAEZ,yBAAG,OAAkB,iBAAoB,GAAhB,iBAAkB,uBAAU,yBAAI,aAAuB;MAC9E;IACF;IAEA,yBAAG,uBACD,iBAAiB,GAAb,cAAgB,wCAAyB,iCAAS,MAAC,SAAQ,iBAAiB,GAAb,cAAgB,wCAAyB,iCAAS,MAAC,MACtH,iBAAiB,GAAb,cAAgB,wCAAyB,iCAAS,MAAC,QAAO,iBAAiB,GAAb,cAAgB,wCAAyB,iCAAS,MAAC,QAAM;4JACvD;IACtE;IAEA,mBAAgB,sFAAgC;IAChD,yBAAG,cAAwB;MACzB,yBAAG,uBAA2B;QAC5B,uBAAe,qNAK2B;MAC5C;QACE,uBAAe,qLAI2B;MAC5C;MACA;IACF;IAGA,eAAY,kEAAuC;IACnD,4CAAO,oBAAwB;IAG/B,qBAAkB,wHAGgB;IAClC,kBAAgB,eAAe,MAAC,MAAK;QAGhC,o8BAAsD;QACtD,6DAAqB;IAE1B,iBAAmB,GAAhB,SAAS,OAAE,MAAO,wCAAyB,iCAAS,MAAC,OAAK;MAC3D,oBAAiB,qJAEgB;IACnC,wBAAuB,GAAhB,SAAS,OAAE,MAAO,wCAAyB,iCAAS,MAAC,QAC1D,iBAAkB,GAAd,eAAgB,gCAAE,iBAA4B,GAAxB,YAAO,MAAC,kBAAkB,uBAAS;MAC7D,kBAAoC,mBAApB,SAAS,OAAE,SAAW,gCAAC;IACzC;IAEA,yBAAG,uBAA2B;MAC5B,kBAAe,mRAO2B;IAC5C;MACE,kBAAe,mPAM2B;IAC5C;IAGA,iBAAyB,GAAtB,yBAAO,gBAAiB,gCAAC;MAC1B,SAAS,OAAE,aAA+B,mBAApB,SAAS,OAAE,SAAW,gCAAC;MAC7C,yFAAoD;IACtD;IAEF;;EAGA;;;;QAEO,0DAAmB;QACnB,yDAAkB;QAClB,qDAAa;QACb,oCAAsB;QACtB,sDAAc;IAEnB,yBAAG,SAAmB;MACpB,YAAU,OAAE;MACZ;IACF;IAEA;IACA,yBAAS,OAAO;IAChB,yBAAS,MAAM;IAEf,yBAAG,OAAiB;MAClB,YAAU,OAAE;MACZ;IACF;IAEA,yBAAG,iCAA2B;;IAG9B;IAEA,iBAAU,GAAP,QAAS,wCAAM;+DACqB;IACvC,wBAAc,GAAP,QAAS,wCAAM;kGAGG;IACzB,wBAAc,GAAP,QAAS,yCAAO;mGAGG;IAC1B,wBAAc,GAAP,QAAU,+CAAY;MAC3B,WAAS,MAAM;kFAGK;IACtB,wBAAc,GAAP,QAAU,gDAAc,iBAA8D,IAA1D,oGAA4D,uBAAS;MACtG,WAAS,MAAM;0EAGK;IACtB,wBAAmB,GAAZ,0CAAc,qCAAI,iBAAe,GAAZ,0CAAc,qCAAG;iKAMS;IACtD;MACE,YAA2B,qBAAjB,0BAAQ,SAAW,gCAAC;MAC9B,iBAAe,GAAZ,0CAAc,qCAAI,iBAAsB,GAAlB,gDAAoB,qCAAG;QAC9C,WAAS,wBACP,KAAM,QACN,KAAM,iCACN,KAAc,qBAAR,QAAU,kCAAG;MACvB;iFAGoB;IACtB;IAEA,YAAU,OAAE;IAEd;;EAGA;;;;;;IAEE,YAAU,OAAE;QAEP,2FAAsB;IAC3B,YAAU,wCAAO,iBAAP,CAA8B;mHAInB;IAEvB;;EAGA;;;;;;IAEE,YAAU,OAAE;QAEP,yDAAkB;IACvB,YAAS,6FAAuC;kHAK5B;IAEtB;;EAGA;;;;;;IAEE,YAAU,OAAE;kHAKQ;IAEtB;;EAGA;;;;IAEE,YAAU,OAAE;QAEP,uEAA4B;uHAIR;IAE3B;;EAGA;;;;;;IAEE,YAAU,OAAE;QAEP,yDAAkB;IACvB,WAAS,MAAM;kHAIK;IAEtB;;EAGA;;;;;;IAEE,YAAU,OAAE;QAEP,mEAA4B;IACjC,sBAAmB,gGAA4C;4HAKjC;IAEhC;;EAGA;;;;QAEO,mHAAgD;QAChD,2tBAA4C;QAC5C,qEAA8B;QAC9B,kSAA6D;QAC7D,0DAAyB;QACzB,kEAA8B;;IAGnC,wBAAqB,0FAAoC;IACzD,gBAAqB,0BAAQ,oBAAoB;IACjD,mBAAqB,iGAA2C;IAEhE;;;;yFAC8D;IAC9D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IAEA,sBAAO,OAAO,MAAC,KAAI;IAAnB,sBAAqB,OAAO,MAAC,KAAI;IAAjC,sBAAmC,OAAO,MAAC,MAAK;IAChD,qGAAkD;IAElD,0CAAkB,mBAAsB,iCAAG;;;MAIzC,OAAO,MAAC,UAAO,wBAAW,KAAM,OAAO,MAAC,OACd,KAAkB,qBAAZ,YAAc,kCAAG;MACjD,qGAAkD;IAEpD;IAEA,YAAU,UAAU;IAEtB;;EAGA;;;;;IAEE,aAAU,4LAGwB;IAEpC;;EAGA;;;;;;;QAEO,yvBAAoD;QACpD,muBAAqD;QACrD,+tBAAqC;QACrC,kSAAwD;mCAExC;IAErB,mBAAgB,sFAAgC;IAChD,yBAAG,cAAwB;MACzB,WAAW,MAAC,UAAO,aAAa,MAAC,KAAI;MACrC,WAAW,MAAC,UAAO,aAAa,MAAC,KAAI;MACrC,WAAW,MAAC,UAAO,wCAAyB,iCAAS,MAAC,MAAK;MAC3D,2EAA0C;MAC1C;IACF;IAEA,iBAAY,GAAT,UAAW,uBAAS;MACrB,qBAAkB,kGAEc;IAClC;MACE,aAAU,wCAAmB;IAC/B;IAEA,yBAAG,QAAkB;UAEd,2vBAAsD;MAC3D,eAAY,kEAAuC;MACnD,4CAAO,oBAAwB;MAE/B,SAAS,OAAE,aAA+B,mBAApB,SAAS,OAAE,SAAW,gCAAC;MAE7C,WAAW,MAAC,UAAO,aAAa,MAAC,KAAI;MACrC,WAAW,MAAC,UAAO,aAAa,MAAC,KAAI;MACrC,WAAW,MAAC,UAAO,wCAAyB,iCAAS,MAAC,MAAK;MAE3D,iBAA2B,GAAxB,YAAO,MAAC,kBAAkB,uBAAU,yBAAI,0BAA8B;QACvE,WAAW,MAAC,WAAQ,eAAe,MAAC,MAAK;MAC3C;MAEA,2EAA0C;IAE5C,wBAAqB,GAAd,OAAO,OAAE,MAAQ,wCAAyB,iCAAS,MAAC,OAAK;4KACsB;IACtF;IAEA,YAAU,OAAE;IAEd;;EAGA;;;;;;QAEO,+IAAuC;IAE5C,sBAAM,YAAY;;8GAUc;EAElC;EAGA;;;;;IACE,YAAO,MAAC,gCAA6B,SAAS;IAC9C,YAAU,OAAE;IACd;;AACF","file":"zcl_abapgit_ajson.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson.clas.locals.mjs":{"lineLengths":[53,41,16,32,179,159,159,161,160,166,166,163,165,159,775,380,305,563,22,1,59,91,74,92,76,92,76,94,80,93,78,99,86,99,86,96,80,98,82,92,32,708,46,46,46,46,47,48,52,52,313,44,44,46,238,44,48,495,52,58,58,55,57,86,17,32,60,37,25,288,497,381,280,17,42,22,3,29,64,16,3,39,51,3,46,69,66,58,93,69,75,9,196,144,209,156,86,189,136,82,17,120,190,138,128,174,121,68,14,16,7,5,19,3,37,49,3,44,64,67,61,68,64,85,213,5,27,69,167,5,20,3,31,43,3,38,67,67,61,25,96,56,5,107,87,5,200,87,5,19,3,27,39,3,34,298,67,61,63,62,69,52,133,26,5,171,57,5,143,69,26,5,54,126,165,24,3,1,61,23,32,66,37,1076,150,189,173,1168,378,1319,17,42,22,979,74,112,3,29,64,16,3,22,973,67,61,111,94,118,131,119,71,52,9,64,17,102,29,115,233,103,23,258,14,16,7,5,24,3,30,71,67,61,65,67,67,65,246,67,63,62,29,70,53,5,74,57,5,56,162,113,52,68,51,50,12,56,24,106,5,136,23,3,23,973,67,61,121,775,115,769,41,46,40,26,5,180,59,22,18,51,75,42,14,7,54,101,346,129,135,53,54,85,88,31,92,54,123,95,124,66,18,91,80,37,246,93,15,13,83,68,13,11,58,113,11,9,51,123,154,109,138,54,88,31,101,110,105,9,267,101,132,54,88,14,95,7,5,50,101,95,5,24,3,22,68,64,230,3,1,73,989,27,32,70,37,174,1215,188,340,147,142,295,166,836,310,1599,62,17,42,22,65,1139,112,264,71,65,3,29,64,16,3,29,51,3,36,153,3,26,48,3,33,74,1138,76,65,67,108,111,94,118,150,100,44,43,56,54,26,3,22,74,766,66,157,170,27,113,88,28,5,48,78,26,3,31,740,61,67,76,80,154,36,5,106,82,134,14,102,7,5,39,124,87,132,87,132,175,251,70,130,90,12,240,5,411,91,97,5,70,260,78,69,149,41,126,87,105,9,58,134,87,106,9,58,7,158,69,95,7,72,5,3,30,74,82,101,64,70,106,766,60,70,82,69,12,70,5,211,30,68,50,89,103,14,103,7,50,5,138,111,5,3,30,52,3,37,70,72,76,33,80,191,186,186,186,189,5,22,3,1,81,88,24,32,67,37,873,1241,228,187,926,1581,2205,393,1313,331,292,17,42,22,776,1165,152,110,3,29,109,88,114,151,91,50,48,16,3,24,1134,64,50,70,75,39,51,31,35,56,100,3,30,582,740,61,584,82,84,85,77,127,125,123,122,121,80,162,5,74,80,83,27,56,88,58,67,213,73,101,9,14,99,7,53,103,71,81,216,71,13,126,45,21,26,48,84,17,20,24,13,11,94,82,123,20,50,34,13,11,85,155,16,127,9,80,124,71,110,73,125,125,11,9,93,7,26,5,30,69,63,586,84,86,87,584,136,103,86,768,163,163,85,81,53,103,80,103,112,65,116,112,16,103,112,9,216,100,110,7,11,208,34,182,107,119,23,13,11,247,132,11,57,107,121,141,13,74,72,116,13,220,84,131,114,59,87,49,18,134,11,43,131,253,132,13,228,137,129,128,13,228,18,117,11,82,17,93,98,135,15,25,120,135,22,24,15,13,11,9,19,112,26,62,119,11,31,125,203,87,25,188,16,18,9,7,5,32,742,63,584,78,86,87,82,129,190,7,95,108,41,125,135,125,134,47,134,178,83,187,88,16,49,9,14,172,7,5,26,64,102,66,49,49,49,159,90,130,7,83,23,5,31,99,102,66,51,24,83,114,77,91,513,62,62,73,103,358,90,229,14,262,92,137,9,7,138,142,97,11,54,79,116,86,125,9,19,223,148,16,18,9,7,57,98,7,23,5,3,77,594,26,34,69,39,187,230,190,191,1877,1779,1861,1698,2641,1861,2008,2438,2585,261,261,299,64,19,44,24,86,154,114,114,5,31,66,18,5,31,50,5,38,124,121,122,122,5,26,45,5,33,971,48,60,297,69,72,84,120,153,93,509,63,71,81,118,123,156,97,109,66,79,79,179,22,5,30,48,60,123,63,297,69,66,66,108,71,81,118,971,63,41,84,163,93,163,92,163,14,155,145,309,147,16,269,9,7,5,32,127,63,297,69,66,66,108,71,81,118,971,63,770,770,42,15,7,105,34,88,99,55,55,44,49,16,141,9,7,5,30,49,5,37,68,62,63,52,312,7,20,5,30,49,5,37,68,62,63,52,312,7,20,5,35,54,5,42,68,95,57,51,24,62,62,90,745,20,5,32,48,60,123,63,297,69,66,66,108,71,81,118,971,63,742,51,51,40,45,53,53,7,530,120,54,75,16,76,9,118,79,121,83,16,121,102,9,340,119,100,123,119,79,80,16,102,9,123,119,79,80,16,102,9,126,119,100,14,277,7,66,5,30,48,60,297,69,66,66,108,71,81,118,971,63,742,51,51,40,45,67,167,7,53,53,7,42,117,73,14,217,7,66,5,32,48,60,123,63,297,69,66,66,108,71,81,118,971,63,742,60,128,615,302,120,71,742,771,440,76,35,68,14,53,53,119,42,69,169,9,55,55,9,47,89,7,52,60,161,69,32,54,78,143,16,115,88,98,112,164,185,11,71,66,11,81,55,11,157,9,7,5,32,48,60,123,63,297,69,66,66,108,71,81,118,971,63,126,124,302,66,742,771,153,76,51,51,116,40,45,67,167,7,53,53,7,87,52,65,161,65,52,68,34,137,204,113,83,7,5,35,54,5,42,971,48,60,100,63,297,69,72,84,120,153,93,509,63,71,81,118,123,156,97,109,66,79,79,208,22,5,41,48,60,100,63,123,63,297,69,66,66,108,71,81,118,971,63,71,742,86,331,267,206,175,203,215,206,481,243,9,126,127,210,9,14,211,7,51,51,40,39,38,45,67,167,7,53,53,7,66,5,3,77,98,28,34,27,2424,3,106,34,70,59,241,1249,1248,955,423,237,19,44,24,144,1173,1171,5,22,42,5,29,157,143,69,131,25,5,31,143,69,72,36,18,5,41,1142,84,1140,75,42,49,45,70,5,23,69,63,744,66,742,188,31,43,482,142,21,11,253,241,21,11,56,164,242,21,11,16,172,9,39,117,141,120,62,11,9,96,7,5,3,79,27,34,70,59,243,1249,1248,444,425,239,19,44,24,146,1173,1171,5,22,42,5,29,157,145,69,131,25,5,31,145,69,72,36,18,5,41,1142,84,1140,75,771,68,151,164,29,107,348,41,15,7,42,49,45,76,166,5,36,69,63,77,87,105,78,771,750,188,35,38,131,133,65,164,11,9,56,104,92,164,9,266,333,9,7,5,3,79,27,34,70,59,438,260,439,19,44,24,340,5,31,66,18,5,22,153,162,72,55,76,7,27,21,5,17,37,5,24,157,109,25,5,41,1142,84,1140,75,162,66,1164,1162,1164,61,71,41,15,7,74,34,92,77,16,85,9,69,73,16,45,83,9,104,7,5,3,79,180,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson.clas.locals_imp.abap"],"names":[],"mappings":";;+EA8uDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAzpDA;;;;;;;;;;;;;;;;;EAEE;;;;;;;QAEO,oFAA0B;QAC1B,4DAAqB;IAE1B,cAAY,uDAAqB;IAEjC;;;;;;;;;;;;;;;;;;;;IAoBA;IAEF;;EAEA;;;;;;;;;IAEE,kBAAgB,GAAT,UAAY,+CAAY;oNACuE;IACtG;IACA,aAAW,QAAQ;IACnB,iBAAY,GAAT,UAAW,gCAAC;sKACiE;IAChF;IAEF;;EAEA;;;;;;;IAEE,YAAU,OAAO;IACjB,iBAAqB,GAAlB,0BAAQ,WAAY,gCAAC;MACtB,YAAU,oCAAG;IACf;IACA,iBAAgB,GAAb,2CAAgB,qCAAG;MACpB,kCAAU,qCAAO,QAAO;IAC1B;IACA,iBAC4C,GADzC,wBAAW,KAAM,SACN,KAAwB,qBAAlB,0BAAQ,UAAY,oCAAO,qCAAG;MAChD,kCAAU,QAAW,qCAAG;IAC1B;IAEF;;EAEA;;;;;;;QAEO,sDAAc;QACd,qDAAa;QACb,4DAAoB;IAEzB,WAAS,0BAAQ,SAAS;IAC1B,iBAAU,GAAP,QAAS,gCAAE,iBAAW,GAAR,SAAU,qCAAG;MAC5B;IACF;IAEA,iBACiC,GAD9B,wBAAW,KAAM,SACN,KAAa,qBAAP,OAAS,oCAAM,qCAAG;MACpC,kBAAgB,+BAAC;IACnB;IAEA,YAAU,mBAAM,KAAM,2BAAS,WACf,KAAM,sCACN,KAAM,eAAe;IACrC,iBAAW,GAAR,SAAU,iCAAE;MACb,YAAW,MAAM;IACnB;IACA,YAAiB,qBAAP,OAAS,QAAO;IAE1B,YAAY,MAAC,WAAO,2FAC4C;IAChE,YAAY,MAAC,UAAO,wBAAW,KAAM,SACN,KAAM,SACN,KAAuB,qBAAV,qBAAP,OAAS,SAAU,gBAAe;IAEzE;;AAEF;;AAmDA;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,0HAA6C;QAC7C,8GAAoC;QACpC,8DAAuB;IAE5B,4BAAqB,kBAAkB;IAEvC;MAII,kBAAe,sCAAiB;;;;;;;;;;;;IAYpC;IAEF;;EAEA;;;;;;QAEO,0DAAmB;QACnB,wDAAgB;QAChB,6OAA4B;QAC5B,0DAAmB;QACnB,sDAAc;QACd,qDAAa;IAElB,cAAY,SAAS;IACrB,iBAAa,GAAV,WAAY,gCAAC;MACd,cAAY,+BAAC;IACf;IACA,iBAAa,GAAV,WAAY,0BAAQ,UAAS;MAC9B,cAAY,0BAAQ,SAAS;IAC/B;IAEA,YAAU,sCAAkB;IAE5B,2JACiD;IAEjD;IAEA,YAAU,yBAAO,SAAS;IAC1B,iBAAW,GAAR,SAAU,gCAAC;MACZ,YAAU,+BAAC;MACX,WAAS,+BAAC;IACZ;MACE;sBAA6C;MAC7C,WAA2B,mBAAlB,0BAAQ,UAAY,gCAAC;IAChC;IAEA,kIAAmD;IAErD;;EAEA;;;;QAEO,gHAAoC;QACpC,8vBAAkC;QAClC,0GAAgC;IACrC,IAAc,QAAgC;IAE9C,sBAAM,aAAQ;IACd,sBAAM,kBAAa;IACnB,yBAAG,QAAkB;MACnB;IACF;IACA,eAAY,+JAA6E;;;;;MAKvF,aAAU,sDAA4B;MACtC,yBAAG,QAAoB;QACrB;MACF;MAGA,IACE,OAwCA,AAaA,KAtDG,OAAO,OAAE,iBAAd;;YAES,6UAAgD;YAChD,oHAAkC;YAClC,0HAAwC;mCAC7C,SAAW,OAAO;;QAIlB,QAAM,MAAC,UAAO,OAAO,OAAE,0BAAK,MAAC,KAAI;QAEjC;6BAA6C;QAC7C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UAEb,QAAM,MAAC,UAAO,kBAAa;UAC3B,YAAY,OAAE,aAAkC,mBAAvB,YAAY,OAAE,SAAW,gCAAC;UAEnD,iBAAsB,GAAnB,YAAY,OAAE,MAAO,qCAAO;YAC7B,QAAM,MAAC,gGAAmC;YAC1C,QAAM,MAAC,WAAQ,YAAY,OAAE,QAAQ;UACvC;YACE,mBAAgB,0DAA0B;;;cAExC,iBAAuB,GAApB,OAAO,OAAE,uBAAK,MAAC,OAAO,wCAAO,iBAAwB,GAApB,OAAO,OAAE,8BAAa,8BAAe,yBAAU;gBACjF,QAAM,MAAC,WAAO,kDAAqB;cACrC;YACF;YACA,iBAAsB,GAAnB,yBAAqB,uBAAS;cAC/B,QAAM,MAAC,WAAQ,YAAY,OAAE,QAAQ;YACvC;UACF;UACA,yBAAG,QAAM,MAAC,MAAe;gHACsB;UAC/C;QACF;QAE6B,oBAAZ,qBAAwB;QACzC,gHAAyC;QAEzC,6CAAgB,yCAAiB,QAAM,MAAC,MAAQ,sCAAG;;YAG9C,6HAA0C;mCAC/C,UAAY,OAAO;QAEnB;6BAA6C;;QAE7C,iBAAwB,GAArB,QAAQ,OAAE,2BAAK,MAAC,OAAQ,YAAY,OAAE,KAAI;wGACJ;QACzC;QAGA,uBAAgB,wBAAW,KAAM,oBACN,KAAqD,mBAA/C,mBAAM,KAAM,oBAAc,KAAM,sCAAI,KAAM,mCAAO,kCAAG;;YAEhF,uHAAuC;mCAC5C,UAAY,OAAO;QAEnB,QAAM,MAAC,YAAQ,oDAAsB;;8FAGN;;IAErC;;IAEA,iBAAqB,GAAlB,yBAAO,iBAAa,gCAAC;8FACW;IACnC;IAEF;;EAEA;;;qOAImE;EAEnE;AAEF;;;AA0DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;IACE,+DAAmB,qCAAO,uCAAwB,QAAO;EAC3D;EAEA;;;;;;;;;;;;;QAEO,6IAAkC;;IAEvC,EAAE,OAAE,iBAAe,YAAY;IAC/B,EAAE,OAAE,mBAAiB,SAAS;IAC9B,EAAE,OAAE,uBAAqB,kBAAkB;IAC3C,oBAAiB,4BAAiB;IAEpC;;EAEA;;IAEE,IAAc,KAA6B;IAC3C;;;;+GAGa;IACb,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;+CAEqB;IAErB,mBAAiB,8BAAiB,OAAQ,gBAAW;IAEvD;;EAEA;;;QAEO,0DAAmB;QACnB,mEAA4B;IAEjC,iBAAkB,GAAf,qBAAiB,gCAAC;MACnB,qBAAmB,qBAAQ,KAAM,kCACN,KAAqB,wBAAf,oBAAiB,gBAAU;MAC5D,YAAU,gBAAgB;IAC5B;IAEA,yBAAG,OAAO,MAAC,gBAAoB,yBAAI,OAAO,MAAC,OAAgB;MACzD,iBAAkB,GAAf,qBAAiB,gCAAC;QACnB,kCAAU,0FAAiC;MAC7C;QACE,4FAA+B;MACjC;IACF;IAEA,IACE,OAEA,AAEA,AAEA,AAEA,KATG,OAAO,MAAC,KAAb;;MAEI,kCAAU,QAAW,qCAAG;;MAExB,kCAAU,QAAW,qCAAG;;MAExB,kCAAU,qIAAiD;;MAE3D,kCAAU,QAAW,OAAO,MAAC,OAAK;;MAElC,kCAAU,QAAW,wCAAM;;+OAImB;;IAGlD,iBAAkB,GAAf,qBAAiB,gCAClB,IAAI,cAAe,GAAb,OAAO,MAAC,OAAO,wCAAyB,iCAAS,MAAC,OAAM,iBAAgB,GAAb,OAAO,MAAC,OAAO,wCAAyB,iCAAS,MAAC,QAAO,CAC1H,iBAAqB,GAAjB,OAAO,MAAC,WAAW,gCAAC;MACxB,kBAAoB,mBAAT,cAAW,gCAAC;MACvB,kCAAU,QAAW,uCAAwB,QAAO;IACtD;IAEA,gCAAO,iBAAW,cAAS;IAI3B,iBAAgB,GAAb,OAAO,MAAC,OAAO,wCAAyB,iCAAS,MAAC,OAAM,iBAAgB,GAAb,OAAO,MAAC,OAAO,wCAAyB,iCAAS,MAAC,QAAM;UAC/G,mEAA4B;UAC5B,0DAAmB;MAExB,2CAAmB,OAAO,MAAC,4BAAQ,OAAO,MAAC,MAAQ,sCAAG;MAEtD,IACE,OAOA,KARG,OAAO,MAAC,KAAb;;QAEI,iBAAoB,GAAjB,OAAO,MAAC,WAAW,gCAAC;wGAGS;QAChC;QACA,YAAU,oCAAG;;QAEb,iBAAoB,GAAjB,OAAO,MAAC,WAAW,gCAAC;yGAGU;QACjC;QACA,YAAU,oCAAG;;MAGjB,iBAAkB,GAAf,qBAAiB,gCAAE,iBAAqB,GAAjB,OAAO,MAAC,WAAW,gCAAC;QAC5C,kCAAU,iBAAoB,QAAO;QACrC,kBAAoB,qBAAT,cAAW,gCAAC;MACzB;MACA,gCAAO,iBAAW,cAAS;IAC7B;EAEF;EAEA;;;;;QAEO,6DAAsB;QACtB,iGAA4B;IACjC,IAAc,KAA6B;IAE3C,iBAAY,GAAT,UAAW,uBAAS;MACrB,eAAa,+CAAa;IAC5B,wBAA0B,GAAnB,yBAAqB,uBAAS;MACnC,eAAa,8CAAY;IAC3B;MACE,eAAa,+CAAa;IAC5B;;;MAGE,iBAAiB,GAAd,eAAgB,wBAAU;QAC3B,kBAAgB,sBAAS;MAC3B,wBAAsB,GAAf,qBAAiB,gCAAC;QACvB,gCAAO,8CAAoB,cAAS;MACtC;QACE,gCAAO,8CAAO,cAAS;MACzB;iDACqB;IACvB;IAEA,iBAAkB,GAAf,qBAAiB,gCAAE,iBAAkB,GAAd,eAAgB,uBAAS;MACjD,gCAAO,uCAAwB,iBAAW,cAAS;IACrD;EAEF;EAEA;;;;;;;IAEE,eAAa,YAAY;IACzB,iBAAc,GAAX,qDAAyB;MAG1B,eAAa,sBACX,KAAM,YACN,KAAM,uCACN,MAAO,yCACP,KAAM,iCAAG;MACX,eAAa,sBACX,KAAM,YACN,wCACA,MAAO,wCACP,KAAM,iCAAG;MACX,eAAa,sBACX,KAAM,YACN,wCACA,MAAO,wCACP,KAAM,iCAAG;MACX,eAAa,sBACX,KAAM,YACN,wCACA,MAAO,wCACP,KAAM,iCAAG;MACX,eAAa,sBACX,KAAM,YACN,KAAM,sCACN,MAAO,wCACP,KAAM,iCAAG;IAEb;IAEF;;AAEF;;;AAoFA;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;IACE,2BAAoB,iBAAiB;IACrC,0BAAoB,gBAAgB;IACtC;;EAEA;;;;;QAEO,kEAAuB;IAE5B,sBAAM,WAAW;IACjB,sBAAM,uBAAkB;IAEU,cAAjB,WAAuB;IACT,qBAAd,QAAsB;uDAEE;mGAIb;EAE9B;EAEA;;;;;;;;QAEO,oEAA6B;QAC7B,sHAAyC;QACzC,oHAAwC;QACxC,kHAAuC;IAG5C,iBAA4B,GAAzB,cAAc,MAAC,YAAY,gDAAU,eAAK;MAC3C,4CAAoB,cAAc,MAAC,WAAa,sCAAI;IACtD,gCAAO,cAAc,MAAC,qBAAwB;MAC5C,4CAAoB,cAAc,MAAC,iCAAa,qCAAO,OAAO,MAAC,OAAI;IACrE;IAGA;;;;sDAAsF;IACtF,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MAEd,YAAY,MAAC,eAAoB,iBAAiB;MAElD,yBAAG,iCAA0B;QAC3B,YAAY,MAAC,wBAAoB,6BAAU,oIAEf;QAC5B,yBAAG,YAAY,MAAC,mBAA4B;UAC1C,YAAY,MAAC,uBAAoB,4BAAU,OAAO,MAAC,OAAM;QAC3D;MACF;QACE,YAAY,MAAC,uBAAoB,4BAAU,OAAO,MAAC,OAAM;MAC3D;MAEA,IACE,OAIA,AAkBA,KAvBG,cAAc,MAAC,UAApB;;mCAEI,WAAa,cAAc,MAAC,GAAE;QAC9B,YAAY,MAAC,SAAK,4CAAiC;;mCAGnD,WAAa,cAAc,MAAC,GAAE;;4HAOD;;;;;;;;;;;UAC7B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;YACd,iBAAoB,GAAjB,uBAAmB,wBAAU;0HACoB;YACpD;cACE,sBAAM,YAAY;cAClB;YACF;UACF;;qCAGA,YAAY,MAAC,MAAM,4FAA0D;;8HAGnB;;QAG9D,YAAY,MAAC,eAAoB,YAAY,MAAC,GAAE,OAAE,SAAS;QAC3D,iBAA0B,GAAvB,YAAY,MAAC,YAAY,gDAAU,eAAK;qCACzC,WAAa,YAAY,MAAC,GAAE;UAC5B,iBAAyB,GAAtB,SAAS,OAAE,YAAc,mCAAoB,cAAa;YAC3D,eAAY,4CAAiC;YAC7C;;UACF;QACF;QAEA,kFAAiD;MACnD;MAEF;;IAEA;;;;;;;UAEO,6jBAA4C;UAC5C,6HAA4C;UAC5C,4FAA2B;UAC3B,2EAAgC;MAErC,IAAc,KAAyC;MACvD,IAAc,iBAAmC;MACjD,IAAc,iBAA8B;MAC5C,IAAc,gBAAuB;MACrC,IAAc,YAAmB;MAGjC,IACE,OAcA,KAfG,cAAc,MAAC,UAApB;;QAEI,yBAAG,cAAc,MAAC,wBAAqB;UACrC,0FAA4C;UAC5C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;UAEnB,oBAAkB,cAAc,MAAC,aAAY;UAC7C,uGAAmD;UACnD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAErB;UACE,0FAA4C;UAC5C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACrB;;QAGA,yFAA2C;QAC3C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;MAGvB;;;UAMM,iBAA4B,GAAzB,cAAc,MAAC,YAAa,gDAAU,eAAM,yBAAG,YAAY,MAAC,WAAoB;YAGjF,kBAAe,2EAEkB;YAEjC,iBAAoB,GAAjB,uBAAmB,uBAAU,yBAAI,aAAuB;cACzD;YACF;UAEF;UAGA,iBAA0B,GAAvB,YAAY,MAAC,YAAY,gDAAU,kBAAS,iBACvB,GAAvB,YAAY,MAAC,YAAY,gDAAU,oBAAU;mIAEY;UAC1D;UAGA,IACE,OAWA,AAMA,KAlBG,cAAc,MAAC,UAApB;;YAEI,kBAAsC,GAA/B,YAAY,MAAC,oBAAqB,+CAAY;4IAEY;YACjE;YAEA,yBAAG,cAAc,MAAC,cAAyB;;cAEzC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACrB;;YAGA,IAAc,SAAgB;YAC9B,oHAAsF;YACtF,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACW,uBAAb,sBAA4B;;YAG7C,oBAAkB,eAAe;;qIAGyB;;UAI9D,IACE,OAUA,KAXG,KAAG,MAAC,KAAT;;YAEI,iBAA0B,GAAvB,YAAY,MAAC,YAAa,gDAAU,qBAAY,iBAC3B,GAAvB,YAAY,MAAC,YAAa,gDAAU,qBAAW;mIACQ;YACxD;mOAImC;;YAGnC,kBAA8B,GAAvB,YAAY,MAAC,YAAY,gDAAU,eAAK;+HACK;YACpD;mOAImC;;oHAMA;;UAGvC,yBAAG,cAAc,MAAC,wBAAqB;YACrC;cACI,4EAA4C;cAC5C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sIACyC;cACzD;;;;;;;YAGJ;UACF;QAEF;;;;;;;;;;;;;;;;MAeJ;IAEF;IAEA;;;;;;;MAEE,IAAc,aAAoB;MAElC,iBAA0B,GAAvB,YAAY,MAAC,YAAa,gDAAU,sBAAY;6LAC4C;MAC/F;MAEA,sFAAwC;MACxC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,IACE,OAEA,AAGA,AAIA,KAVG,OAAO,MAAC,KAAb;;;QAKI,kBAAc,gCAAqB,GAAd,OAAO,MAAC,QAAQ,wCAAvB,CAA+B;;QAG7C,kBAAc,OAAO,MAAC,MAAK;;QAI3B,iBAA0B,GAAvB,YAAY,MAAC,YAAY,gDAAU,cAAK,yBAAI,OAAO,MAAC,iBAAoB;UACzE,mBAAc,oDAAwB;QACxC,wBAA8B,GAAvB,YAAY,MAAC,YAAY,gDAAU,gBAAO,yBAAI,OAAO,MAAC,iBAAoB;UAC/E,mBAAc,yDAA6B;QAC7C;UACE,kBAAc,OAAO,MAAC,MAAK;QAC7B;;2KAE2E;;IAGjF;IAEA;;;;UAEO,sCAAoB;UACpB,sCAAoB;UACpB,sCAAoB;;MAKzB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;iIAC4C;MAC5D;MACA,sCAAY,MAAK,MAAK,eAAU,SAAS;MAE3C;;IAEA;;;;UAEY,wCAAkC,CAAA;;UAClC,wEACqE,CAAA;;UACrE,kEACuD,CAAA;;UAGtD,sfAAY;UAalB,mDAAc;UACd,mDAAc;UACd,8DAAsB;UACtB,4FAA4B;;MAQjC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEb,oBAAqD,mBAAT,wBAAxB,YAAY,MAAC,YAAa,oCAAqC,wBAA1B,YAAY,MAAC,cAAe,kCAAI;MAE3F;;QAOE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wIACiD;QACjE;MAEF;MAEA,sCAAY,YAAY,MAAC,OAAK,YAAY,MAAC,QAAM,YAAY,MAAC,eAAS,OAAO;MAC9E,sCAAY,YAAY,MAAC,OAAK,YAAY,MAAC,SAAO,YAAY,MAAC,kBAAY,OAAO;;MAIlF;QAEI,IACE,OAIA,KALG,YAAY,MAAC,WAAlB;;UAEI,kBAAe,sFAEU;;UAEzB,kBAAe,+FAEU;;;;;;;;MAKjC;MAEA,yBAAG,uBAA2B;iGAKD;MAC7B;MAEF;;EAEF;;;EAmJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAEE;;;;UAEO,iHAAsC;UACtC,8GAAoC;iCACzC,UAAW,6EAA+C;MAC1D,mDAA8B,kDAAiC,aAAa;IAE9E;IAEA;;;;;;;;;;;;;;;;;;;UAEO,gHAAqC;UACrC,iJAAyC;MAE9C,aAAU,4EAA8C;;MAGxD,YAAY,OAAE,sBAAqB,iBAAiB;MACpD,YAAY,OAAE,uBAAqB,OAAO,MAAC,gBAAe;MAC1D,YAAY,OAAE,uBAAqB,OAAO,MAAC,gBAAe;kLAUjC;MAE3B;;IAEA;;;;;;;;;;;;;;;MAEE,IACE,OAWA,AAWA,KAvBG,OAAO,OAAE,IAAd;;kKAU6B;;kKAWA;;kKAWA;;QAIzB,iBAAsB,GAAnB,OAAO,OAAE,WAAY,gDAAU,kBAAS,yBAAG,QAAkB;gJAUrC;QAE3B,wBAA0B,GAAnB,OAAO,OAAE,WAAY,gDAAU,oBACpC,iBAAwE,KAApE,gGAAsD,eAAgB,6CAA2B;kJAQ5E;QAC3B;4QAE+C;QAC/C;;IAIN;IAEA;;;;;;;;;;;;;MAEE,IAAc,OAA2B;MACzC,IAAc,OAA2B;MAEzC,yBAAG,QAAoB;QACrB;MACF;;;QAGE,gCAAO,oBAA4B,iBAAnB,QAAwB;QAExC,yBAAG,OAAK,MAAC,MAAgB,yBAAI,OAAK,MAAC,MAAe;UAChD,OAAK,MAAC,UAAQ,SAAS,MAAC,KAAI;UAC5B,OAAK,MAAC,UAAQ,SAAS,MAAC,KAAI;UAC5B,OAAK,MAAC,WAAQ,QAAQ;UACtB,OAAK,MAAC,WAAQ,aAAa;QAC7B;UACE,OAAK,MAAC,gCAAO,SAAS,MAAC,4BAAQ,SAAS,MAAC,MAAQ,OAAK,MAAC,OAAI;QAC7D;MACF;IAEF;IAEA;;;;;;;MACE,yBAAG,kBAAsB;QACvB,iCAAS,gEAAgB,2DAAO,gEAAgB,qCAAO,6CAAY;MACrE;MACF;;IAEA;;;;;;;MACE,yBAAG,kBAAsB;QACvB,iCAAS,gEAAgB,2DAAO,gEAAgB,qCAAO,6CAAY;MACrE;MACF;;IAEA;;;;;;;UAEY,wCAAkC,CAAA;;UAEvC,mDAAc;UACd,mDAAc;;MAKnB,iCACE,gEAAgB,2DAAO,gEAAgB,2DAAO,gEAC9C,2DACA,gEAAgB,2DAAO,gEAAgB,2DAAO,0CAC9C,+CAAG;MAEP;;IAEA;;;;;;;;;;;;;;;UAEO,2tBAA6B;MAElC,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAC9B,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAC9B,OAAO,MAAC,WAAQ,QAAQ;MACxB,OAAO,MAAC,WAAQ,aAAa;MAE7B,yBAAG,OAAO,MAAC,MAAe;QACxB,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAChC;MAEA,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,qEACxB,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,wDAC5B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,sDAC5B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,gDAC5B,iBAA0B,GAAvB,OAAO,OAAE,eAAgB,iDAAa;QAC3C,OAAO,MAAC,UAAO,wCAAyB,iCAAS,MAAC,QAAO;QACzD,yBAAG,kBAAsB;UACvB,OAAO,MAAC,WAAQ,uCAAM;QACxB;UACE,OAAO,MAAC,WAAQ,wCAAO;QACzB;MACF,wBAA8B,GAAvB,OAAO,OAAE,eAAgB,qDAAiB;QAC/C,iBAAsB,GAAnB,yBAAqB,uBAAS;UAC/B,OAAO,MAAC,UAAQ,wCAAyB,iCAAS,MAAC,OAAM;UACzD,OAAO,MAAC,YAAQ,8CAA2B;QAC7C;UACE,OAAO,MAAC,UAAQ,wCAAyB,iCAAS,MAAC,OAAM;UACzD,OAAO,MAAC,6EAAqB;QAC/B;MACF,wBAA0B,GAAnB,OAAO,OAAE,WAAa,gDAAU,eAAM,iBACnB,GAAnB,OAAO,OAAE,WAAa,gDAAU,gBAAO,iBACpB,GAAnB,OAAO,OAAE,WAAa,gDAAU,cAAI;QACzC,OAAO,MAAC,UAAO,wCAAyB,iCAAS,MAAC,OAAM;QACxD,OAAO,MAAC,6EAAqB;MAC/B,wBAA0B,GAAnB,OAAO,OAAE,WAAY,gDAAU,cAAI;QACxC,OAAO,MAAC,UAAO,wCAAyB,iCAAS,MAAC,OAAM;QACxD,iBAAsB,GAAnB,yBAAqB,uBAAS;UAC/B,OAAO,MAAC,YAAQ,2CAAsB;QACxC;UACE,OAAO,MAAC,6EAAqB;QAC/B;MACF,wBAA0B,GAAnB,OAAO,OAAE,WAAY,gDAAU,cAAI;QACxC,OAAO,MAAC,UAAO,wCAAyB,iCAAS,MAAC,OAAM;QACxD,iBAAsB,GAAnB,yBAAqB,uBAAS;UAC/B,OAAO,MAAC,YAAQ,2CAAsB;QACxC;UACE,OAAO,MAAC,6EAAqB;QAC/B;MACF,wBAA0B,GAAnB,OAAO,OAAE,WAAa,gDAAU,iBAAO;QAC5C,OAAO,MAAC,UAAO,wCAAyB,iCAAS,MAAC,OAAM;QACxD,OAAO,MAAC,6EAAqB;MAC/B;oRAEkE;MAClE;MAEA,gCAAO,iBAAW,QAAQ;IAE5B;IAEA;;;;;;;;;;;;;UAEO,2tBAA6B;MAElC,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAC9B,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAC9B,OAAO,MAAC,WAAQ,QAAQ;MACxB,OAAO,MAAC,WAAQ,aAAa;MAE7B,yBAAG,iCAA0B;QAC3B,OAAO,MAAC,WAAO,qIAEa;MAC9B;MAEA,yBAAG,OAAO,MAAC,MAAe;QACxB,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAChC;MAEA,yBAAG,QAAkB;QACnB,OAAO,MAAC,UAAQ,wCAAyB,iCAAS,MAAC,KAAI;QACvD,OAAO,MAAC,WAAQ,uCAAM;MACxB;wNAEgG;MAChG;MAEA,gCAAO,iBAAW,QAAQ;IAE5B;IAEA;;;;;;;;;;;;;;;;;UAEO,qHAAwC;UACxC,4lBAAkD;UAClD,mSAA6B;UAC7B,6GAA0C;UAC1C,4DAAoB;UACpB,2tBAA6B;MAElC,IAAc,QAAmB;MACjC,IAAc,KAAyB;MACvC,IAAc,OAAc;MAI5B,0BAAsB;QACpB,yDAAwB;MAC1B;QACE,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;QAC9B,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;QAC9B,OAAO,MAAC,UAAQ,wCAAyB,iCAAS,MAAC,OAAM;QACzD,OAAO,MAAC,WAAQ,QAAQ;QAExB,yBAAG,iCAA0B;UAC3B,OAAO,MAAC,WAAO,qIAEa;QAC9B;QAEA,yBAAG,OAAO,MAAC,MAAe;UACxB,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;QAChC;QAEA,OAAO,MAAC,WAAQ,aAAa;QAE7B,gCAAO,oBAA8B,kBAAnB,QAAyB;MAE7C;iCAIA,UAAY,OAAO;MACnB,cAAW,sCAA2B;MAMtC,cAAc,MAAC,gCAAO,SAAS,MAAC,4BAAQ,QAAM,MAAC,MAAQ,sCAAG;;;QAGxD,sBAAM,sBAAsB;QAE5B,iBAAkB,GAAf,KAAG,MAAC,aAAa,uBAAS;8IASF;QAE3B;UAEE,QAAM,MAAC,cAA2B,mBAAhB,QAAM,MAAC,UAAW,gCAAC;UACrC,cAAc,MAAC,UAAO,4BAAU,KAAG,MAAC,OAAM;UAC1C,qFAAuD;UACvD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;UAEnB,yBAAG,iCAA2B,iBAAmB,GAAf,KAAG,MAAC,KAAI,OAAE,MAAO,kCAAmB,UAAS;YAC7E,4BAAyB,+IAC2D;UACtF;UAEA,yBAAG,iCAAqC;YACtC,cAAc,MAAC,UAAO,sBAAsB;UAC9C;UAEA,iBAAsB,GAAnB,yBAAqB,uBAAS;YAC/B,kBAAgB,QAAM,MAAC,SAAQ;UACjC;4JASyB;QAE3B;MAEF;IAEF;IAEA;;;;;;;;;;;;;;;UAEO,mHAAuC;UACvC,iHAAsC;UACtC,mSAA6B;UAC7B,uDAAsB;UACtB,2tBAA6B;MAElC,IAAc,QAAmB;MACjC,IAAc,OAAoB;MAClC,IAAc,OAAc;MAI5B,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAC9B,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAC9B,OAAO,MAAC,UAAQ,wCAAyB,iCAAS,MAAC,MAAK;MACxD,OAAO,MAAC,WAAQ,QAAQ;MACxB,OAAO,MAAC,WAAQ,aAAa;MAE7B,yBAAG,iCAA0B;QAC3B,OAAO,MAAC,WAAO,qIAEa;MAC9B;MAEA,yBAAG,OAAO,MAAC,MAAe;QACxB,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAChC;MAEA,gCAAO,oBAA8B,kBAAnB,QAAyB;iCAI3C,UAAY,OAAO;MACnB,cAAY,2CAAgC;MAE5C,cAAc,MAAC,gCAAO,SAAS,MAAC,4BAAQ,QAAM,MAAC,MAAQ,sCAAG;MAC1D,wDAAuB;MAEvB,aAAW,+BAAC;;;QAEV,cAAc,MAAC,UAAO,iGAA0B;2MASvB;QAEzB,QAAM,MAAC,cAA2B,mBAAhB,QAAM,MAAC,UAAW,gCAAC;QACrC,aAAoB,mBAAT,SAAW,gCAAC;MACzB;IAEF;IAEA;;;;;;;;;;;;;;;;;;;;;UAEO,gHAAqC;UACrC,iJAAyC;MAE9C,aAAU,4EAA8C;;MAGxD,YAAY,OAAE,sBAAqB,iBAAiB;MACpD,YAAY,OAAE,uBAAqB,OAAO,MAAC,gBAAe;MAC1D,YAAY,OAAE,uBAAqB,OAAO,MAAC,gBAAe;+MAWjC;MAE3B;;IAEA;;;;;;;;;;;;;;;;;UAEO,4DAAqB;UACrB,2tBAA6B;MAElC,oCAAY,SAAS,MAAC,MAAQ,SAAS,MAAC,MAAI;MAC5C,iBAAsB,GAAnB,OAAO,OAAE,WAAa,gDAAU,eAAM,iBACnB,GAAnB,OAAO,OAAE,WAAa,gDAAU,cAAK,iBAClB,GAAnB,OAAO,OAAE,WAAa,gDAAU,cAAI;QACrC,iBAAW,GAAR,SAAU,wCAAyB,iCAAS,MAAC,SAAQ,iBAAY,GAAR,SAAW,wCAAO,iBAAY,GAAR,SAAW,yCAAO;6MACT;QAC3F,wBAAe,GAAR,SAAU,wCAAyB,iCAAS,MAAC,MAAK,yBAAI,kBAAsB;0MACK;QACxF,wBAAe,GAAR,SAAU,wCAAyB,iCAAS,MAAC,QAAO,iBAAY,GAAR,SAAW,oDAAiB;6MACA;QAC3F,wBAAe,GAAR,SAAW,wCAAyB,iCAAS,MAAC,QAAO,iBAAY,GAAR,SAAW,wCAAyB,iCAAS,MAAC,SAC5G,iBAAY,GAAR,SAAW,wCAAyB,iCAAS,MAAC,MAAK,iBAAY,GAAR,SAAW,wCAAyB,iCAAS,MAAC,QAAM;kPACT;QACxG;MACF,wBAA0B,GAAnB,OAAO,OAAE,WAAa,gDAAU,iBAAO;QAC5C,iBAAW,GAAR,SAAW,wCAAyB,iCAAS,MAAC,QAAM;iNACwC;QAC/F;MACF;kNAC6F;MAC7F;MAEA,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAC9B,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAC9B,OAAO,MAAC,WAAQ,QAAQ;MACxB,OAAO,MAAC,WAAQ,OAAO;MACvB,OAAO,MAAC,UAAQ,OAAO;MACvB,OAAO,MAAC,WAAQ,aAAa;MAE7B,yBAAG,iCAA0B;QAC3B,OAAO,MAAC,WAAO,qIAEa;MAC9B;MAEA,yBAAG,OAAO,MAAC,MAAe;QACxB,OAAO,MAAC,UAAQ,SAAS,MAAC,KAAI;MAChC;MAEA,gCAAO,iBAAW,QAAQ;IAE5B;EAEF;;;;;;;;;;;;;;;;;;;;;;;;;IAiDE;;;;;;;;MAEA;;IAEA;;;MACE,4CAAO,oBAAkB;MACzB,mBAAY,SAAS;MACvB;;IAEA;;;;;MAEE,sBAAM,YAAY;MACmB,2BAApB,cAAkC;MAChB,yBAAlB,YAA8B;qEAE3B;IAEtB;IAEA;;;;;UAEO,2tBAA6C;;;QAGhD,IACE,OAOA,KARG,OAAO,MAAC,KAAb;;UAII,iBAAmC,IAAhC,oFAAkC,wBAAU;YAC7C;UACF;;UAIA,iBAE2D,IAFxD,uLAE0D,wBAAU;YACrE;UACF;UAGA,sBAAM,OAAO,MAAC,SAAQ;mKAMM;UAE5B,iBAE4D,IAFzD,wLAE2D,wBAAU;YACtE;UACF;;2KAGyE;;QAG7E,4BAAwB;UACtB,SAAS,MAAC,cAA8B,mBAAnB,SAAS,MAAC,UAAW,gCAAC;UAC3C,iBAAkB,GAAf,SAAS,MAAC,OAAO,wCAAyB,iCAAS,MAAC,OAAK;YAC1D,OAAO,MAAC,6FAAgC;YACxC,OAAO,MAAC,WAAQ,SAAS,MAAC,SAAQ;UACpC;QACF;QACA,qFAAyC;MAE3C;IAEF;EAEF;;EAiCA;;;;;;;;;;;;;;;;;IAEE;;;;;;;;MAEA;;IAEA;;;MACE,4CAAO,oBAAkB;MACzB,mBAAY,SAAS;MACvB;;IAEA;;;;;MAEE,IAAc,QAAkC;MAEhD;;;;yGAAuE;MACvE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCACb,IAAG,CAAI,cAAc,GAAZ,QAAM,MAAC,OAAO,wCAAyB,iCAAS,MAAC,OAAM,iBAAe,GAAZ,QAAM,MAAC,OAAO,wCAAyB,iCAAS,MAAC,QAAO,CAAC;QAE5H,iBAAe,cAAc;QAC7B;MACF;MAEA,sBAAM,YAAY;MACmB,2BAApB,cAAkC;MAChB,yBAAlB,YAA8B;MAC/C,mEAAqC;qKAKJ;IAEnC;IAEA;;;;;;;MAGE,IAAc,QAAqC;UAC9C,muBAA2B;;;QAG9B,oBAAkB,QAAM;QACxB,iBAAgB,GAAb,cAAgB,wCAAyB,iCAAS,MAAC,OAAK;oIAMrB;UACpC,yBAAG,eAAe,MAAC,MAAe;mKAGZ;UACtB;QACF;QACA,eAAe,MAAC,UAAO,eAAe;QAEtC,6FAAiD;QACjD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;mKAGe;QAC/B;QAIA,iBAAe,GAAZ,QAAM,MAAC,OAAO,wCAAyB,iCAAS,MAAC,OAAM,iBAAe,GAAZ,QAAM,MAAC,OAAO,wCAAyB,iCAAS,MAAC,QAAM;4UAIjF;QACnC;MAEF;IAEF;EAEF;;EAuBA;;;;;;;;;;;;;;;;IAEE;;;;MACE,yBAAG,qBAAmB;QACpB,gCAAO,oBAAc,aAAQ;MAC/B;MACA,YAAU,OAAE;MACd;;IAEA;;;;;;MAEA;;IAEA;;;;;UAEO,uJAAyC;UACzC,uDAAe;MACpB,IAAc,QAA0B;MACxC,IAAc,MAAwB;UACjC,ioCAAuD;MAE5D,aAAW,yBAAO,eAAU;MAE5B,iBAAY,GAAT,UAAW,gCAAC;QACb,iBAAe,cAAc;QAC7B;MACF;;;QAGE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,gEAA+B;QACjC;UACE,wEAA0B;QAC5B;QAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,SAAQ;UACpB,4DAA2B;QAC7B;;UAEE,sEAAwB;QAC1B;uGAMyB;MAC3B;IAEF;EAEF","file":"zcl_abapgit_ajson.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_filter_lib.clas.mjs":{"lineLengths":[63,53,41,36,32,56,37,25,260,811,653,17,42,22,3,29,64,16,3,34,65,3,41,141,372,70,137,21,3,31,62,3,38,141,115,21,3,35,66,3,42,141,267,79,73,79,110,91,116,213,21,3,1,76,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson_filter_lib.clas.abap"],"names":[],"mappings":";;;AAmCA;;;;;;;;;;;;;;;;EAGE;;;;;;;;IAIA;;EAGA;;;;;;IAEA;;EAGA;;;;;;;;;;;;;IAMA;;AACF","file":"zcl_abapgit_ajson_filter_lib.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_filter_lib.clas.locals.mjs":{"lineLengths":[53,52,24,32,78,63,480,22,17,42,22,124,3,29,64,16,3,51,100,740,61,102,64,163,407,19,3,1,86,390,72,71,72,24,32,78,63,359,187,459,642,17,42,22,262,111,124,3,51,100,740,61,102,64,163,72,93,83,74,42,79,32,51,47,16,9,7,12,122,81,28,54,117,5,19,3,29,267,79,73,79,110,91,64,260,93,140,130,5,72,26,51,61,5,56,110,67,32,42,92,19,9,85,7,5,67,66,35,50,16,3,1,86,390,72,71,72,22,32,76,63,470,459,484,17,42,22,373,124,3,51,100,740,61,102,64,163,141,40,74,31,118,62,23,7,5,19,3,29,372,70,141,146,31,75,5,16,3,1,82,388,70,69,70,60,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson_filter_lib.clas.locals_imp.abap"],"names":[],"mappings":";;AASA;;;;;;;;;;;;;;;EACE;;;;;;;IAEE,YAAU,mBACR,cAAW,GAAT,UAAW,yCAA0B,mCAAU,MAAC,OAAM,yBAAI,OAAO,MAAC,iBAAqB,CAAE,IAC3F,cAAW,GAAT,UAAY,yCAA0B,mCAAU,MAAC,OAAM,iBAAqB,GAAjB,OAAO,MAAC,WAAW,gCAAE,CAF1E,CAE6E;IAGzF;;AACF;;;;;;AAqBA;;;;;;;;;;;;;;;EAEE;;;;;;;QAEO,+DAAwB;IAC7B,IAAc,KAA8B;IAE5C,uCAAe,OAAO,MAAC,MAAQ,OAAO,MAAC,MAAI;IAE3C,iBAAqB,GAAlB,wBAAoB,uBAAS;MAC9B,YAAU,sBAAS;;;QAEjB,iBAAgB,GAAb,cAAgB,MAAG;UACpB,YAAU,uBAAU;UACpB;QACF;MACF;IACF;MACE;;;oDAAkF;MAClF,YAAU,gCAAgB,GAAT,eAAE,MAAC,QAAS,gCAAnB,CAAsB;IAClC;IAEF;;EAEA;;;;;;;QAEO,uDAAgB;QAChB,2PAAwB;IAC7B,IAAc,KAAe;IAE7B,iBAAqC,GAAlC,wCAAO,cAAP,GAAoC,wCAAO,cAAP,EAAiC;iIACV;IAC9D;;;MAGE,SAAO,4BAAU,MAAM;MACvB,gCAAO,cAAQ,MAAM;IACvB;IAEA,yBAAG,wBAA4B;MAC7B;;;QAEE,yBAAG,MAAc;;UAEf;QACF;QACA,UAAM,4BAAU,4BAAU,SAAO;MACnC;IACF;IAEA;;IAGA,uBAAgB,MAAM;IACtB,2BAAoB,iBAAiB;IAEvC;;AAEF;;;;;;AAkBA;;;;;;;;;;;;;EAEE;;;;;;;QAEO,oIAAiC;IAEtC,YAAU,sBAAS;;;MAEjB,aAAU,iGAEa;MACvB,iBAAW,GAAR,SAAU,wBAAU;QACrB;MACF;IACF;IAEF;;EAEA;;;QAEO,oIAAiC;;;MAGpC,gCAAO,mBAAa,eAAU;IAChC;IAEF;;AAEF","file":"zcl_abapgit_ajson_filter_lib.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_mapping.clas.mjs":{"lineLengths":[60,53,38,33,32,53,37,351,1134,964,964,967,970,1198,246,399,17,42,22,57,3,29,64,16,3,34,62,3,41,144,681,91,112,97,119,194,22,3,39,67,3,46,144,144,70,144,70,144,70,358,61,359,67,67,67,77,112,136,22,3,37,65,3,44,144,681,91,153,22,3,34,62,3,41,144,681,91,155,22,3,30,58,3,37,144,583,79,68,76,113,165,22,3,37,65,3,44,144,112,97,120,151,22,3,32,60,3,39,144,109,22,3,34,62,3,41,144,681,91,155,22,3,1,70,270,59,59,57,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson_mapping.clas.abap"],"names":[],"mappings":";;;AA0EA;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;IAOA;;EAGA;;;;;;;;;;;;;QAEO,8VAAoD;IAEzD,gCAAO,oBAAc,QAAQ;IAC7B,gCAAO,oBAAc,QAAQ;IAC7B,gCAAO,oBAAc,QAAQ;IAC7B,gCAAgB,8BAAW,QAAQ;;;IAOrC;;EAGA;;;;;;;;IAMA;;EAGA;;;;;;;;IAMA;;EAGA;;;;;;;;;;;IAOA;;EAGA;;;;;;;;;IAMA;;EAGA;;;;;;IAIA;;EAGA;;;;;;;;IAMA;;AACF","file":"zcl_abapgit_ajson_mapping.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_mapping.clas.locals.mjs":{"lineLengths":[53,98,26,32,77,64,780,793,17,42,22,682,3,29,681,91,320,76,38,97,94,5,16,3,50,69,67,61,67,61,320,70,29,65,68,27,41,88,49,5,21,3,50,69,67,61,67,61,68,320,56,70,29,66,69,27,42,88,49,5,21,3,54,740,61,98,58,3,1,87,18,32,69,64,681,146,803,17,42,22,584,69,3,29,583,79,68,76,42,40,16,3,50,69,67,61,67,61,21,3,50,69,67,61,67,61,21,3,54,740,61,98,58,72,106,312,38,106,71,27,25,67,70,29,43,123,113,74,71,27,25,72,75,29,48,123,111,74,79,32,62,52,16,9,7,12,49,5,65,34,5,3,1,71,28,32,79,64,250,793,17,42,22,152,3,29,681,91,143,16,3,50,69,67,61,67,61,128,21,3,50,69,67,61,67,61,128,52,23,5,57,21,3,54,740,61,98,58,55,3,1,91,28,32,79,64,250,793,17,42,22,152,3,29,681,91,143,16,3,50,69,67,61,67,61,128,21,3,50,69,67,61,67,61,128,52,23,5,57,21,3,54,740,61,98,58,55,3,1,91,25,32,76,64,210,229,945,17,42,22,113,152,3,29,681,91,112,97,119,143,54,16,3,50,69,67,61,67,61,128,52,23,5,27,158,21,3,50,69,67,61,67,61,4,259,63,108,128,52,23,5,27,139,50,51,76,51,12,51,5,103,84,34,88,5,87,138,21,3,54,740,61,98,58,3,1,85,27,32,78,64,458,471,17,42,22,360,3,29,359,64,32,16,3,54,740,61,98,58,740,143,25,72,31,104,38,5,3,50,69,67,61,67,61,21,3,50,69,67,61,67,61,21,3,1,89,20,32,71,64,25,22,17,42,22,3,29,64,16,3,54,740,61,98,58,156,55,3,50,69,67,61,67,61,21,3,50,69,67,61,67,61,21,3,1,75,20,32,71,64,211,224,17,42,22,113,3,29,112,97,54,16,3,54,740,61,98,58,4,70,91,260,63,109,76,51,12,51,5,132,101,113,84,34,99,5,85,131,3,50,69,67,61,67,61,21,3,50,69,67,61,67,61,21,3,1,75,152,66],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson_mapping.clas.locals_imp.abap"],"names":[],"mappings":";;AAAA;;;;;;;;;;;EAGE;;;QAEO,uTAA+C;;;MAGlD,gBAAgB,MAAC,UAAO,4BAAU,gBAAgB,MAAC,OAAM;MACzD,qFAAoD;IACtD;IAEF;;EAGA;;;;;;QAEO,uTAA+C;IAEpD;;;;;uCACyC;IACzC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,cAAY,gBAAgB,MAAC,KAAI;IACnC;IAEF;;EAGA;;;;;;QAEO,2DAAoB;QACpB,uTAA+C;IAEpD,aAAW,4BAAU,SAAS;IAE9B;;;;;wCAC0C;IAC1C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,cAAY,gBAAgB,MAAC,KAAI;IACnC;IAEF;;EAEA;;;;;EAEA;AAEF;;AAEA;;;;;;;;;;;;;EAEE;;;;;IACE,uBAAgB,aAAa;IAC7B,sBAAe,YAAY;IAC7B;;EAEA;;;;;;IACA;;EAEA;;;;;;IACA;;EAEA;;;;;QAEO,+DAAwB;QACxB,iGAA4B;IACjC,IAAc,KAA8B;IAE5C,IACE,OAGA,AAIA,KARG,iBAAL;;MAEI;;;;;;yCAAuF;MACvF,kBAAgB,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;;MAErC,uCAAe,OAAO,MAAC,MAAQ,QAAO;MACtC;;;;;;8CAA4F;MAC5F,kBAAgB,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;;MAErC,uCAAe,OAAO,MAAC,MAAQ,QAAO;;;QAEpC,iBAAgB,GAAb,cAAgB,KAAG,MAAC,MAAI;UACzB,kBAAgB,sBAAS;UACzB;QACF;MACF;;MAEA,kBAAgB,uBAAU;;IAG9B,iBAAiB,GAAd,eAAgB,uBAAS;MAC1B,YAAU,KAAG,MAAC,GAAE;IAClB;EAEF;AAEF;;AAEA;;;;;;;;;;;EAGE;;;IAEE,4BAAoB,6GAAoE;IAE1F;;EAGA;;;;;;IAEE,eAAY,2GAC+C;IAE7D;;EAGA;;;;;;IAEE,eAAY,2GAC+C;IAE3D,yBAAG,oBAAwB;MACzB;IACF;IAEA,cAAY,4BAAU,SAAS;IAEjC;;EAEA;;;;;IAEE,YAAU,4BAAU,SAAS;EAE/B;AAEF;;AAGA;;;;;;;;;;;EAGE;;;IAEE,4BAAoB,6GAAoE;IAE1F;;EAGA;;;;;;IAEE,eAAY,2GAC+C;IAE7D;;EAGA;;;;;;IAEE,eAAY,2GAC+C;IAE3D,yBAAG,oBAAwB;MACzB;IACF;IAEA,cAAY,4BAAU,SAAS;IAEjC;;EAEA;;;;;IAEE,YAAU,4BAAU,SAAS;EAE/B;AAEF;;AAGA;;;;;;;;;;;;;EAGE;;;;;;IAEE,4BAAsB,6GAAoE;IAC1F,6BAAsB,mBAAmB;IAE3C;;EAGA;;;;;;IAEE,eAAY,2GAC+C;IAE3D,yBAAG,oBAAwB;MACzB;IACF;IAEA,cAAY,OAAO;IAEnB,uJAA2E;IAE7E;;EAGA;;;;;;;QAGO,0PAAyC;QACzC,sDAAc;IACnB,IAAc,SAA8B;IAE5C,eAAY,2GAC+C;IAE3D,yBAAG,oBAAwB;MACzB;IACF;IAEA,cAAY,OAAO;IAEnB,oIAAqD;IAErD;IACA;IAEA,iBAAuB,GAApB,0BAAsB,uBAAS;MAChC,YAAU,+BAAC;IACb;MACE,YAAU,+BAAC;IACb;IAEA;;;MAEE;IACF;IAEA,sCAAqB,oBAAe,SAAS;IAC7C,mIAAoD;IAEtD;;EAEA;;;;;EAEA;AAEF;;AAEA;;;;;;;;;;;EAEE;;;IACE,kBAAW,QAAQ;IACrB;;EAEA;;;;;QAEO,2tBAAoB;QACpB,sIAA+B;IAEpC,YAAU,OAAO;;;uGAOQ;MACvB,OAAO,MAAC,UAAO,OAAO;IACxB;EAEF;EAEA;;;;;;IAEA;;EAEA;;;;;;IAEA;;AAEF;;AAEA;;;;;;;;;;;;;;EAEE;;;;;IAEE,qJAAyE;IACzE,YAAU,4BAAU,SAAS;EAE/B;EAEA;;;;;;IAEA;;EAEA;;;;;;IAEA;;AAEF;;AAEA;;;;;;;;;;;EAEE;;;IACE,6BAAsB,mBAAmB;IAC3C;;EAEA;;;;;;QAGY,6DAAwF,CAAA;;QAE7F,2PAA0C;QAC1C,sDAAc;IACnB,IAAc,SAA8B;IAE5C,iBAAuB,GAApB,0BAAsB,uBAAS;MAChC,YAAU,+BAAC;IACb;MACE,YAAU,+BAAC;IACb;IACA,6HAA2E;IAE3E;;;;MAGE;IACF;IAEA,sCAAqB,oBAAe,OAAO;IAC3C,4HAA0E;EAE5E;EAEA;;;;;;IAEA;;EAEA;;;;;;IAEA;;AAEF","file":"zcl_abapgit_ajson_mapping.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_utilities.clas.mjs":{"lineLengths":[53,40,35,32,55,37,225,204,204,204,205,512,157,298,378,230,1252,917,427,742,17,42,22,128,128,128,128,128,3,29,64,16,3,35,125,61,113,100,745,100,59,22,18,51,42,75,465,38,138,9,92,47,9,7,465,36,136,7,90,45,7,61,14,7,5,50,3,21,69,67,69,67,127,67,127,67,113,100,122,127,64,127,64,127,64,95,95,81,81,81,73,73,58,58,58,100,100,100,3,25,67,61,69,69,771,771,204,35,148,104,30,131,144,29,87,90,150,76,48,130,91,91,91,54,138,54,18,82,154,13,11,16,48,130,91,54,138,54,18,152,11,48,130,91,54,138,54,18,152,11,9,14,46,128,89,52,136,52,16,150,9,7,5,3,25,67,61,101,64,98,67,771,204,35,146,44,126,85,82,134,48,14,65,108,135,148,33,91,94,150,11,16,214,150,33,93,94,114,11,9,7,5,3,25,99,69,67,69,67,127,67,127,67,124,124,124,167,315,18,3,22,125,69,67,69,67,127,67,127,67,113,100,122,95,95,39,73,56,98,19,3,15,45,3,22,145,94,23,3,32,125,67,61,125,61,128,157,5,50,87,57,27,12,143,5,19,3,21,69,67,61,125,61,125,84,115,21,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson_utilities.clas.abap"],"names":[],"mappings":";;AA2FA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;QAEO,guBAA+C;QAC/C,2FAAsB;;;;;MAGzB,YAAU,sBAAS;MAEnB,iBAAwB,GAArB,sBAAuB,wBAAU;;;yIAIyB;QAE3D;QACA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,YAAU,uBAAU;QACtB;MACF;;;uIAK2D;MAE3D;MACA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,YAAU,uBAAU;MACtB;MAEA,iBAAW,GAAR,SAAU,uBAAS;QACpB;MACF;IACF;;EAEF;EAGA;;;;;;;;;;;;;;;;;;IAEE,oBAAY,qEAEW;IAEvB,oBAAY,qEAEW;IAEvB,oBAAY,uDAAkC;IAC9C,oBAAY,uDAAkC;IAC9C,oBAAY,uDAAkC;wEAE/B;wEACA;+BAEf,WAAa,cAAS;+BACtB,WAAa,cAAS;+BACtB,WAAa,cAAS;mGAIyB;mGAGA;mGAGA;EAEjD;EAGA;;;QAGI,4DAAqB;QACrB,4DAAqB;IAEvB,IACE,UAA6C;IAD/C,IAEE,UAA6C;;;MAG7C,oCAAY,UAAQ,MAAC,4BAAQ,UAAQ,MAAC,MAAQ,sCAAG;MAEjD;;;;;qFAC0D;MAC1D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,oCAAY,UAAQ,MAAC,4BAAQ,UAAQ,MAAC,MAAQ,sCAAG;QAEjD,iBAAiB,GAAd,UAAQ,MAAC,OAAO,UAAQ,MAAC,MAAI;UAC9B,IACE,OAKA,KANG,UAAQ,MAAC,KAAd;;0FAEuC;0FACA;0FACA;qDACd;;qDAEA;;YAErB,iBAAkB,GAAf,UAAQ,MAAC,QAAS,UAAQ,MAAC,OAAK;yJAKD;YAClC;;QAEN;UAEE,IACE,OAGA,KAJG,UAAQ,MAAC,KAAd;;0FAEuC;qDACd;;qDAEA;;uJAKW;;UAEpC,IACE,OAGA,KAJG,UAAQ,MAAC,KAAd;;0FAEuC;qDACd;;qDAEA;;uJAKW;;QAEtC;MACF;QAEE,IACE,OAGA,KAJG,UAAQ,MAAC,KAAd;;wFAEuC;mDACd;;mDAEA;;qJAKW;;MAEtC;IACF;EAEF;EAGA;;;;;;QAEO,0DAAmB;IAExB,IAAc,UAA6C;;;MAGzD,kCAAU,UAAQ,MAAC,4BAAQ,UAAQ,MAAC,MAAQ,sCAAG;MAE/C,IACE,OAKA,KANG,UAAQ,MAAC,KAAd;;oFAEqC;iFAGT;;+CAEL;;QAEnB,iBAAY,GAAT,UAAW,wBAAU;UACtB;;;;yFAC0D;UAC1D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;qJAKkB;UAClC;QACF;UACE;;;2FACsD;UACtD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;iHAIc;UAC9B;QACF;;IAEN;EAEF;EAGA;;;;;;;;;;QAEO,mHAAoC;QACpC,mHAAoC;QACpC,mHAAoC;sKAWjB;IAExB,WAAS,gCACa,IAApB,kDAAsB,uBAAU,iBACZ,IAApB,kDAAsB,uBAAU,iBACZ,IAApB,kDAAsB,uBAHf,CAG0B;IAErC;;EAGA;;;;;;;;;;;;;IAEE,oBAAY,qEAEW;IAEvB,oBAAY,qEAEW;IAGvB,mBAAY,cAAS;wEAGN;+BAEf,SAAW,cAAS;iGAI2B;IAEjD;;EAGA;;;;;;IAEA;;EAGA;;;;;;IAEE,iBAA+B,GAA5B,wCAAO,QAAP,GAA8B,wCAAO,QAAP,EAA2B;4JAC6B;IACzF;IAEA,yBAAG,kBAAsB;MACvB,aAAU,kEAAmC;IAC/C,gCAAO,kBAAsB;MAC3B,YAAU,OAAO;IACnB;8IAC2E;IAC3E;IAEF;;EAGA;;;;;;QAEO,oHAAqC;IAE1C,aAAU,iEAEW;IAGrB,eAAY,8FAAuB;IAErC;;AACF","file":"zcl_abapgit_ajson_utilities.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_apack_reader.clas.mjs":{"lineLengths":[53,37,32,32,52,37,238,2899,183,3023,58,423,528,2929,2929,212,202,234,17,42,22,141,2823,106,3,29,140,85,46,16,3,41,106,100,1360,1262,2815,78,77,84,163,84,198,196,149,61,66,21,63,152,65,70,25,9,55,152,59,84,48,85,112,13,89,85,11,9,84,7,36,63,7,43,150,144,89,136,34,7,32,59,7,39,150,144,89,73,65,70,2813,107,61,97,97,98,34,7,30,1295,84,176,105,44,162,9,7,29,56,7,36,2813,70,62,70,27,130,196,23,7,39,2828,110,333,110,612,65,613,11,75,17,132,126,97,77,25,122,62,22,24,15,13,71,96,13,11,56,9,62,38,7,28,112,2826,73,53,67,54,9,31,7,44,2828,110,54,62,36,7,5,72,161,349,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/apack/zcl_abapgit_apack_reader.clas.abap"],"names":[],"mappings":";;AAwEA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;IACE,yBAAkB,eAAe;IACnC;;EAGA;;;QAEQ,u0CAAwF;QACxF,quCAAwE;QACxE,svFAAwE;QACxE,qEAAkC;QAClC,oEAAkC;IAExC,IAAe,iBAA0B;IAAzC,IACe,mBAAgC;IAD/C,IAEe,iBAA0B;IAEzC,6CAAqB,8CAA+B,qDAA0B,gDAAa;IAC3F,4CAAqB,8CAA+B,oDAAyB,gDAAa;IAE1F;;;kBAAoE;MACpE,0BAAG,4BAA+B;QAChC;;;sBAAmE;QACrE;QACA,0BAAG,kBAA2B;UAG5B,2IAAiF;UACjF,0BAAG,oBAA6B;;;cAE5B,kCAAmB,mBAAmB,gBAAgB;cACtD,+FAA6D;YAC/D;YACA,kCAAmB,mBAAmB,sBAAsB;YAC5D,kCAAmB,wBAA0B,aAAa;UAC5D;QACF;mFAEwC;MAE1C;MAGA;;;;;;;;QAIA;;MAGA;;;;;;;;;YAEQ,yDAAmB;YACnB,gvFAAyD;QAE/D,YAAS,qFAAsD;QAE/D,aAAU,sCAAkB;QAE5B,wBAAqB,+DAAkC;QAEvD,wBAAqB,+DAAkC;iGACD;QAExD;;MAGA;QAEE,IAAe,iBAAiE;QAEhF;QACA,yBAAoB,MAAC,kBAAc,qHAAwE;;;UAGzG,iBAAe,MAAC,kBAAc,6GAAmE;QACnG;MAEF;MAGA;;;;;;;YAEQ,yDAAkB;QAExB,WAAS,MAAM;QAEf;;QAKF;;MAGA;;YAEQ,iGAA6C;YAC7C,gUAAyD;QAE/D,yBAAG,kBAAwB,yBAAI,+BAA8B;UAC3D;UAQA,yBAAG,2BAAqC;YACtC;UAQF;UACA,yBAAG,qCAAyC;YAC1C;;;;;;;;;;;YAIA;YACA,yBAAG,+BAA6B;+FACkB;YAClD;UACF;UAEA,sBAAe,sBAAS;QAE1B;QAEA,2BAAyB,yBAAoB;QAC/C;;MAGA;;YAEQ,6vFAAsE;QAE5E,0BAAuB,qCAA0B;QAEjD,oBAAkB,uBAAU;QAC5B,yBAAG,+BAAmC;UACpC,oBAAkB,sBAAS;QAC7B;QAEF;;MAGA;;;QACE,sBAAe,sBAAS;QACxB,8BAAuB,sBAAsB;mCAC5B;MACnB;IACF","file":"zcl_abapgit_apack_reader.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_auth.clas.mjs":{"lineLengths":[53,29,24,32,44,37,25,466,17,42,22,3,29,64,16,3,27,46,3,34,103,104,88,68,64,123,9,94,97,90,57,130,17,114,47,14,16,7,5,22,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/exits/zcl_abapgit_auth.clas.abap"],"names":[],"mappings":";;AAmBA;;;;;;;;;;;;;;EAGE;;;;;;;;;QAEQ,kHAAoC;IAE1C;;;;;MAEI,gBAAa,0GACkD;;;;;;;IAGnE;IAEF;;AACF","file":"zcl_abapgit_auth.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_background.clas.mjs":{"lineLengths":[53,35,30,32,50,37,25,65,617,17,42,22,3,29,64,16,3,24,49,3,31,522,303,175,82,82,335,96,73,99,73,99,73,89,9,199,148,135,41,17,22,44,73,61,13,16,20,9,7,74,37,66,77,7,69,38,207,155,149,7,24,5,17,42,5,24,57,36,148,135,1246,143,122,132,74,1046,11,190,139,189,43,19,24,46,75,77,63,15,18,22,11,9,92,135,17,9,96,49,99,68,38,83,15,181,80,76,48,213,112,108,95,68,142,68,23,112,30,83,20,22,13,11,83,9,99,104,9,190,139,90,7,5,68,322,541,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/background/zcl_abapgit_background.clas.abap"],"names":[],"mappings":";;AAwBA;;;;;;;;;;;;;;;EAGE;;;;;QAEQ,sSAAuC;QACvC,sKAA8B;QAC9B,yEAA2C;QAC3C,yEAA4C;IAElD,IAAe,aAAmC;IAIlD,SAAS,MAAC,YAAS,+DAA6B;IAChD,kEAAsC;IACtC,SAAS,MAAC,YAAS,kEAAgC;IACnD,kEAAsC;IACtC,SAAS,MAAC,YAAS,kEAAgC;IACnD,kEAAsC;IAEtC,MAAM,MAAC,aAAU,0DAAwB;;;;;;;;;;;;;;;;;;QAWvC,SAAS,MAAC,YAAS,eAAe,MAAC,QAAO;QAC1C,kEAAsC;MACxC;;;;;;MAMA;MAEF;;IAGA;;;;UAEa,8CAA+C,CAAA;;UAEpD,yIAAwD;UACxD,4HAAiD;UACjD,mtCAAqE;UACrE,oIAAgD;UAChD,+GAAyC;UACzC,yHAA+C;UAC/C,+DAAyB;MAE/B,IAAe,WAA8B;;;;;;;;;;;;;;;;;QAY7C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,sBAAS,qFAAmD;UAC5D;QACF;;QAGA,aAAU,0BAAe;QAEzB,sBAAS,mDAAiB;;;;UAKxB;uCACI,UAAW,kIAA2D;YACtE,kBAAe,gDAAoB;YACnC,sBAAS,WAAS,MAAC,OAAM;YAAzB,sBAA2B,YAAY;oNAKH;;;;;6IAOA;mEAGD;;;;;;;;UAIvC;kFAE2C;QAC7C;QAEA,iBAAoB,GAAjB,yBAAO,WAAY,gCAAC;UACrB,sBAAS,sDAAoB;QAC/B;;;;MAMF;IACF","file":"zcl_abapgit_background.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_background_pull.clas.mjs":{"lineLengths":[53,40,35,32,55,61,25,22,17,42,22,3,29,64,16,3,50,80,3,57,74,75,26,3,52,82,3,59,511,70,11,3,43,133,61,120,58,511,73,4567,1117,79,82,39,113,5,93,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/background/zcl_abapgit_background_pull.clas.abap"],"names":[],"mappings":";;AAaA;;;;;;;;;;;;;;EAGE;;;;;IAEE,mBAAiB,kDAAgB;IAEnC;;EAGA;;;;;;IACE;EACF;EAGA;;;;;;;QAEQ,88IAA6D;IAEnE,IAAe,gBAA+C;IAG9D,eAAY,0DAA8B;;;MAGxC,gBAAc,MAAC,cAAW,wCAAyB,6BAAK;IAC1D;4FAG0C;EAE5C;AACF","file":"zcl_abapgit_background_pull.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_background_push_au.clas.mjs":{"lineLengths":[53,43,38,32,58,61,219,3903,224,551,3950,17,42,22,121,3,29,64,16,3,30,70,3680,64,252,66,1225,77,35,183,67,5,40,70,98,92,12,79,70,29,136,7,5,22,3,39,304,103,79,140,111,68,70,52,114,5,51,44,5,19,3,26,133,61,809,3680,499,280,3685,103,122,349,542,1225,142,78,36,169,72,56,57,80,72,5,38,68,66,34,40,106,83,43,80,38,251,238,31,151,92,304,180,92,414,43,217,116,18,11,9,7,90,101,5,109,72,5,3,31,133,61,3680,64,122,809,542,127,81,83,79,37,216,110,184,5,91,103,99,3,50,83,3,57,74,88,26,3,52,85,3,59,511,70,11,3,43,133,61,120,58,511,73,3680,28,142,210,114,13,5,45,3,1,80,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/background/zcl_abapgit_background_push_au.clas.abap"],"names":[],"mappings":";;AAsCA;;;;;;;;;;;;;;;;;;EAGE;;;;QAEQ,mPAAyD;QACzD,yDAAsB;IAE5B,IAAe,YAAsC;;;MAInD,+KAAoE;MACpE,gCAAO,gBAAU,UAAU;IAC7B;IAEA;;IAGA,iBAAuB,GAApB,yBAAO,cAAe,gCAAC;MACxB,oFAA6B;IAC/B;MACE,eAAa,wDAAsB;;;QAEjC,sCAAY,YAAW,uCAAwB,SAAQ,iBAAY,UAAU;MAC/E;IACF;IAEF;;EAGA;;;;QAEQ,mIAAkD;IAGxD,oBAAiB,qFAAsD;IACvE,OAAO,MAAC,WAAO,sCAA2B;IAC1C,OAAO,MAAC,YAAQ,uCAA4B;IAG5C,yBAAG,OAAO,MAAC,OAAgB;MACzB,OAAO,MAAC,6FAAqC;IAC/C;IAGA,yBAAG,OAAO,MAAC,MAAe;MACxB,OAAO,MAAC,UAAQ,aAAa;IAC/B;IAEF;;EAGA;;;QAQQ,gyBAA0D;QAC1D,ulHAA0D;QAC1D,0eAAgE;QAChE,+QAA6D;QAC7D,4lHAA2B;QAC3B,8FAAmC;QACnC,iHAA2C;IAEjD,IAAe,cAAoC;IAAnD,IACe,aAAyC;IADxD,IAEe,YAAwC;IAGvD,cAAW,0HAAuD;;;MAGhE,mBAAgB,8IAE0B;MAC1C,gCAAO,uBAAiB,QAAQ;;MAEhC,cAAY,MAAC,gBAAa,aAAa;MACvC,cAAY,MAAC,cAAa,YAAU,MAAC,KAAI,MAAC,SAAQ;MAClD,cAAY,MAAC,UAAa,YAAU,MAAC,KAAI,MAAC,KAAI;IAChD;IAEA;;;;MAIE,sBAAO,UAAU;MAGjB,UAAU,MAAC,gBAAY,kEAAuC;;MAI9D,sBAAM,aAAa;;;QAGjB;;;qJAIwB;QACxB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;+SAIkB;mLAIoB;UAEnD,gCAAO,sBAAc,aAAa,MAAC,MAAK;;;wNAOiC;mHAKjC;YACtC;UACF;QACF;MACF;MAEA,UAAU,MAAC,cAAU,oDAA8B;oGAGb;IACxC;IAEA,iBAA4B,GAAzB,yBAAO,QAAQ,MAAC,WAAW,gCAAC;uEAEQ;IACvC;EAEF;EAGA;;;;;QAEQ,iHAAwC;QACxC,gyBAAuD;IAE7D,IAAe,aAAwC;IAEvD,oCAAgC,GAAzB,yBAAO,QAAQ,MAAC,WAAW,gCAAC;;IAInC,UAAU,MAAC,aAAU,gDAAc;;;uNAI2C;6GAG1B;MAElD,sCAAY,UAAU,MAAC,UAAQ,uCAAwB,SAAQ,aAAW,MAAC,oBACpE,UAAU,MAAC,QAAO;IAE3B;IAEA,UAAU,MAAC,UAAS,MAAC,UAAQ,2CAAU;IACvC,UAAU,MAAC,UAAS,MAAC,WAAQ,sDAAoB;kGAGX;EAExC;EAGA;;;;;IAEE,mBAAiB,+DAA6B;IAEhD;;EAGA;;;;;;IAEE;EAEF;EAGA;;;;;;;QAEQ,ulHAAqD;IAE3D,gBAAS,MAAM;IACf,cAAW,0HAAuD;IAElE,iBAA2B,GAAxB,yBAAO,QAAQ,MAAC,UAAU,gCAAE,iBAA6B,GAAzB,yBAAO,QAAQ,MAAC,WAAW,gCAAC;iHACvB;MACtC;IACF;4CAEoB;EAEtB;AACF","file":"zcl_abapgit_background_push_au.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_background_push_fi.clas.mjs":{"lineLengths":[53,43,38,32,58,61,218,273,3903,441,17,42,22,121,64,3,29,64,16,3,30,70,3680,64,252,66,1225,78,36,183,67,5,40,70,98,92,12,79,70,29,136,7,5,22,3,27,133,61,67,61,68,64,809,3680,122,1225,542,142,228,81,78,36,234,176,5,79,37,216,110,5,55,57,83,99,3,50,83,3,57,74,89,26,3,52,85,3,59,511,70,290,60,109,112,27,85,88,85,76,72,5,60,110,113,27,86,88,86,87,72,5,3,43,133,61,120,58,511,73,3680,290,67,68,28,142,210,114,13,5,60,109,112,27,85,40,60,110,113,27,86,41,84,3,1,80,218,65,67,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/background/zcl_abapgit_background_push_fi.clas.abap"],"names":[],"mappings":";;AAkCA;;;;;;;;;;;;;;;;;;EAGE;;;;QAEQ,mPAAyD;QACzD,yDAAsB;IAE5B,IAAe,YAAsC;;;MAInD,+KAAoE;MACpE,gCAAO,gBAAU,UAAU;IAC7B;IAEA;;IAGA,iBAAuB,GAApB,yBAAO,cAAe,gCAAC;MACxB,oFAA6B;IAC/B;MACE,eAAa,wDAAsB;;;QAEjC,sCAAY,YAAW,uCAAwB,SAAQ,iBAAY,UAAU;MAC/E;IACF;IAEF;;EAGA;;;;;;;QAEQ,gyBAAuD;QACvD,ulHAAuD;QACvD,iHAAwC;IAE9C,IAAe,YAAuC;IAAtD,IACe,aAAwC;IAGvD,cAAW,0HAAuD;IAClE,oCAA+B,GAAxB,yBAAO,QAAQ,MAAC,UAAU,gCAC7B,iBAA4B,GAAzB,yBAAO,QAAQ,MAAC,WAAW,gCAAC;;;;yOAKiD;+KAG/B;IACrD;;;uNAI8E;6GAG1B;IAEpD;IAEA,UAAU,MAAC,UAAS,MAAC,UAAQ,OAAO;IACpC,UAAU,MAAC,UAAS,MAAC,WAAQ,QAAQ;IACrC,UAAU,MAAC,cAAkB,+CAAyB;kGAGhB;EAExC;EAGA;;;;;IAEE,mBAAiB,gEAA8B;IAEjD;;EAGA;;;;;;QAEQ,yRAAmC;IAGzC;;;;mFAAqE;IACrE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,UAAU,MAAC,SAAM,yCAAU,MAAC,KAAI;MAChC,UAAU,MAAC,WAAQ,yCAAQ;MAC3B,gCAAO,oBAAc,WAAW;IAClC;IAEA;;;;oFAAsE;IACtE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,UAAU,MAAC,SAAM,yCAAU,MAAC,MAAK;MACjC,UAAU,MAAC,WAAQ,oDAAkB;MACrC,gCAAO,oBAAc,WAAW;IAClC;EAEF;EAGA;;;;;;;QAEQ,ulHAAuD;QACvD,yRAAmC;QACnC,0DAAsB;QACtB,2DAAsB;IAE5B,gBAAS,MAAM;IACf,cAAW,0HAAuD;IAElE,iBAA2B,GAAxB,yBAAO,QAAQ,MAAC,UAAU,gCAAE,iBAA6B,GAAzB,yBAAO,QAAQ,MAAC,WAAW,gCAAC;iHACvB;MACtC;IACF;IAEA;;;;mFAAqE;IACrE,YAAU,UAAU,MAAC,MAAK;IAE1B;;;;oFAAsE;IACtE,aAAW,UAAU,MAAC,MAAK;mFAKJ;EAEzB;AACF","file":"zcl_abapgit_background_push_fi.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_code_inspector.clas.mjs":{"lineLengths":[53,39,34,32,54,65,200,180,147,151,137,131,799,182,274,392,208,163,311,155,293,196,17,42,22,103,104,71,75,61,55,62,3,24,66,58,61,11,48,43,19,24,46,69,79,77,82,63,15,18,22,11,9,92,195,9,7,11,36,43,19,24,46,77,69,79,77,77,63,15,18,22,11,9,92,194,9,7,33,106,74,47,125,9,40,225,61,20,7,38,78,70,62,77,74,13,136,45,21,26,48,71,81,79,65,17,20,24,13,11,94,198,11,78,15,45,47,23,28,50,86,79,79,67,19,22,26,15,13,96,198,13,33,11,36,74,69,68,75,605,332,177,88,51,47,20,47,82,324,19,69,136,131,21,78,17,78,40,108,29,19,67,67,137,29,19,87,17,133,30,15,43,85,114,82,55,138,17,21,150,53,29,34,56,88,90,73,25,28,32,21,19,62,84,180,91,188,19,36,17,41,125,145,152,93,94,128,99,26,94,19,37,17,48,78,72,233,17,45,78,88,93,23,82,55,31,36,58,96,75,27,30,34,23,21,104,206,21,76,69,231,83,35,19,44,116,76,74,80,57,94,228,126,28,59,21,35,19,66,86,52,38,19,68,119,52,38,19,75,542,523,35,19,63,1358,118,86,116,77,112,82,89,80,80,80,1140,138,146,25,66,98,87,39,23,129,92,119,100,59,84,47,78,90,23,77,147,117,47,90,143,23,33,122,40,61,109,30,32,23,21,70,35,19,82,129,119,25,149,57,33,38,60,92,94,77,29,32,36,25,23,106,190,23,21,19,90,758,87,88,84,85,89,83,148,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/inspect/zcl_abapgit_code_inspector.clas.abap"],"names":[],"mappings":";;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;IAEE,yBAAG,6BAAsB;;+CAQM;;;;;;;;;;;;;;;QAE7B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kMACoE;QACpF;MAEF;;mCAS0B;;;;;;;;;;;;;;;;QAE1B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;iMACmE;QACnF;MAEF;MAGA;;;QAEE,yBAAG,WAAqB;4HACiC;QACzD;QAEA,oBAAa,UAAU;QAKvB,uNAAkD;QAClD,sBAAc,6BAAkB;QAElC;;MAGA;;;;;;;sIAY4B;;;;;;;;;;;;;;UAE1B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;qMACqE;UACrF;6EAImB;;4CAOU;;;;;;;;;;;;;;YAE7B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;qMACmE;YACnF;YAEF;;UAGA;;gBAEQ,oDAA4B;gBAC5B,mDAA4B;gBAC5B,0DAA4B;gBAC5B,4kBAAmD;gBACnD,2TAA0D;YAEhE,iBAAc,kJAAuE;YACrF,yEAAwC;YAExC;;;;;;;;;;;;;;;kBAUE,iBAAyB,IAAtB,2CAAwB,uBAAS;oBAClC;kBACF;kBAEA,OAAO,MAAC,cAAW,MAAM,MAAC,QAAO;kBACjC,OAAO,MAAC,cAAW,MAAM,MAAC,QAAO;kBAEjC,iBAA0C,IAAvC,uEAAyC,wBAAU;oBACpD;kBACF;kBAEA,kEAAsC;gBAExC;gBAEA,YAAS,uGAEoB;gBAE/B;;cAGA;;;;gBAEE,yBAAG,WAAqB;yIACsC;gBAC9D;;oJAWkC;;;;;;;;;;;;;kBAElC,IACE,OAEA,KAHG,eAAE,MAAC,MAAR;;mLAEgF;;2LAEQ;;kBAG1F;;gBAGA;;sBAEO,0HAA4C;kBACjD,iBAAc,mHAAqD;kBAEnE,iBAAY,GAAT,eAAE,MAAC,QAAQ,uBAAS;oBAErB,gBAAc,sCAAW,MAAC,YAAW;kBACvC,wBAAkD,IAA3C,uDAA6C,wBAAU;oBAC5D,gBAAc,sCAAW,MAAC,iBAAgB;kBAC5C;oBACE,gBAAc,sCAAW,MAAC,YAAW;kBACvC;kBAEF;;gBAGA;;;;gBAKA;gBAGA;;;;;iFAOiC;;;;;;;;;;;;oBAE/B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6MACmE;oBACnF;2EAEuD;oEAER;oBAE/C;;oBAIF;;kBAGA;;;;wBAEO,uDAAyB;oBAE9B,IACE,YADG,MAAM,MAAC,QAAZ;;sBAGI;sBAKA,YAAU,gCAAuB,GAAhB,iBAAkB,qCAAzB,CAA8B;;sBAGxC,YAAU,uBAAU;;oBAI1B;;kBAGA;;oBACE,eAAa,eAAU;oBACzB;;kBAGA;;oBAEE,eAAa,eAAU;oBAEzB;;kBAGA;;oBAEE;oBAUF;;kBAGA;;;;;;;wBAEQ,yDAAsC;wBACtC,gEAAyC;wBACzC,uDAAiB;wBACjB,uDAA4B;wBAC5B,uDAA+B;wBAC/B,2lCAA+B;wBAC/B,iHAAwC;wBACxC,yHAA4C;oBAElD;sBACI,YAAS,8BAAmB;sBAE5B,aAAW,yBAAO,MAAM,OAAE,OAAO,MAAC,UAAS;sBAC3C,iBAAY,GAAT,UAAW,gCAAC;wBAEb;sBACF;sBAEA,cAAW,2FAA0D;sBAErE,gBAAa,oDAA4B;sBAEzC,wBAAgB,uEAEW;sBAE3B,aAAU,+DAA+B;0DAExB;;;wBAGf,kCAAmB,SAAW,SAAS;wBACvC,+DAAmC;sBACrC;sBAEA,iBAAW,GAAR,SAAU,uBAAS;wBACpB;;;wFAA6D;wBAC7D,oBAAa,gCAAgB,GAAT,eAAE,MAAC,QAAS,gCAAnB,CAAsB;sBACrC;;;;;;;;;oBAQJ;oBAEA,qBAAa,2BAAgB;oBAE/B;;kBAGA;;;;oJASoC;;;;;;;;;;;;;sBAElC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6LACqE;sBACrF;oBAEF;kBACF","file":"zcl_abapgit_code_inspector.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_convert.clas.mjs":{"lineLengths":[53,32,27,32,47,37,230,207,266,243,280,285,357,289,268,269,465,336,274,426,277,437,17,42,22,61,59,3,29,64,16,3,34,56,3,41,69,69,67,95,19,3,31,53,3,38,62,45,58,70,62,65,28,114,55,80,48,59,35,65,53,90,122,54,9,127,183,7,85,5,50,18,3,45,67,3,52,93,93,64,109,49,20,3,32,54,3,39,72,60,52,47,19,25,22,3,29,51,3,36,262,69,67,103,88,116,12,118,5,20,3,30,52,3,37,66,58,63,58,122,55,65,69,65,78,34,52,47,28,89,61,59,42,65,53,84,49,61,5,50,3,34,56,3,41,69,66,58,74,19,3,39,61,3,46,72,69,67,102,9,69,153,7,100,17,439,24,93,14,16,7,5,22,3,43,65,3,50,72,69,67,42,24,5,80,215,116,5,22,3,35,57,3,42,69,39,58,25,310,50,5,19,3,34,56,3,41,69,61,63,58,125,64,65,69,65,78,37,54,50,29,84,61,59,42,65,53,84,52,62,5,50,3,31,53,3,38,60,72,70,25,16,3,39,61,3,46,69,39,58,65,67,102,69,65,69,29,70,58,5,9,68,151,7,109,17,439,24,93,14,16,7,5,21,3,29,51,3,36,110,36,49,38,125,125,125,125,125,125,125,125,22,3,1,58,144,141,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_convert.clas.abap"],"names":[],"mappings":";;AAmGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;IAEE,aAAU,4EAA6C;IAEzD;;EAGA;;;;;;;QAEQ,6DAAsB;QACtB,qDAAiB;QACjB,wDAAiB;IAEvB,eAAa,OAAO;IACpB;IACA,WAAa,0BAAQ,YAAY;IACjC,cAAoB,qBAAP,OAAS,gCAAC;IAEvB,WAAS,+BAAC;;;;;MAGR,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEb,iBAA2B,GAAxB,sDAA0B,qCAAG;UAC9B,WAAS,+BAAC;QACZ;MACF,wBAA+B,GAAxB,sDAA0B,qCAAG;QAClC,WAAgB,mBAAP,OAAa,qBAAF,gCAAgB,qBAAT,eAAE,MAAC,OAAQ,kCAAK;MAC7C;MAEA,cAAsB,qBAAV,UAAY,gCAAC;IAE3B;;IAEF;;EAGA;;;;;;;4GAM2B;IAEzB;IAEF;;EAGA;;;;;;;QAGO,sCAAoB;IAEzB,SAAO,IAAI;IACX,eAAa,IAAI;IAEnB;;EAGA;;;;;;;;IAKE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb;IACF;MACE;IACF;IAEF;;EAGA;;;;;;;;;;QAEO,wDAAgB;QAChB,4DAAoB;QACpB,wDAAgB;IAErB,IAAc,WAAkB;IAGhC,sBAAM,MAAM;IACZ,YAAU,0BAAQ,QAAQ;;IAG1B,gBAAY,MAAM;IAClB,kFAA2D;IAC3D,kBAAwB,mBAAR,QAAY,UAAS;;;;;MAGnC,cAAqB,wBAAT,eAAE,MAAC,OAAQ,UAAS;;MAEhC,gBAAY,qCAAgB;IAC9B;;EAEF;EAGA;;;;;;;IAEE,aAAU,uDAAgC;IAE5C;;EAGA;;;;;;;QAEO,6FAA4B;IAEjC;MACI,yBAAG,mCAAyB;QAC1B,wCAAiB,uGAAiD;MACpE;mGAMyB;;;;;;;;IAO7B;IAEF;;EAGA;;;;;;;IAEE,yBAAG,UAAoB;MACrB;IACF;IAEA,gBAAa,0DAAmC;IAGhD,iBAAyB,GAAtB,2BAAS,cAAe,gCAAE,iBAAiB,GAAd,mCAAiB,uCAAwB,qBAAoB;MAC3F,qCAAa,uCAAwB,qBAAwB,WAAU;IACzE;IAEF;;EAGA;;;;;;;IAEE,YAAU,OAAO;IAGjB,iBAAoC,GAAjC,uCAAwB,UAAW,gCAAE,iBAAuB,GAAnB,2BAAS,WAAY,gCAC7D,iBAAe,GAAX,gCAAa,uCAAwB,qBAAoB;MAE/D,YAAU,8BAAS;IAErB;IAEF;;EAGA;;;;;;;;;;QAEO,wDAAgB;QAChB,4DAAoB;QACpB,wDAAgB;IAErB,IAAc,WAAkB;IAGhC,sBAAM,SAAS;IACf,YAAU,2BAAS,SAAS;;IAG5B,gBAAY,OAAO;IACnB,6EAAsD;IACtD,kBAAwB,mBAAR,QAAY,UAAS;;;;;MAGnC,cAAqB,wBAAT,eAAE,MAAC,OAAQ,UAAS;;MAEhC,gBAAY,sCAAiB;IAC/B;;EAEF;EAGA;;;;;;;IAGE,SAAO,UAAU;IAEnB;;EAGA;;;;;;;;;QAEO,6FAA6B;QAC7B,4DAAoB;QACpB,wDAAgB;IAGrB,aAAU,kDAA6B;IAEvC,cAAY,SAAS;IACrB,iBAAa,GAAV,WAAa,gCAAC;MACf,cAAY,2BAAS,SAAS;IAChC;IAEA;MACI,yBAAG,kCAAwB;QACzB,uCAAgB,sGAAgD;MAClE;4GAOuB;;;;;;;;IAO3B;IAEF;;EAGA;;;;;;;IAEE,sBAAM,UAAU;IAEhB,uBAAQ,iCAAK,4BAAU,mCAAe;IACtC,uBAAQ,iCAAK,4BAAU,mCAAe;IACtC,uBAAQ,iCAAK,4BAAU,mCAAe;IACtC,uBAAQ,iCAAK,4BAAU,mCAAe;IACtC,uBAAQ,iCAAK,4BAAU,mCAAe;IACtC,uBAAQ,iCAAK,4BAAU,mCAAe;IACtC,uBAAQ,iCAAK,4BAAU,mCAAe;IACtC,uBAAQ,iCAAK,4BAAU,mCAAe;IAExC;;AACF","file":"zcl_abapgit_convert.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_cts_api.clas.mjs":{"lineLengths":[53,32,27,32,47,58,220,413,279,268,627,609,611,459,470,17,42,22,123,121,129,121,3,29,64,16,3,46,100,63,79,124,107,82,108,82,111,102,108,95,72,42,9,191,140,290,41,17,22,44,70,74,74,81,61,13,16,20,9,7,90,65,7,64,250,7,73,211,7,45,26,5,48,102,65,81,126,109,84,110,84,475,26,5,48,104,65,81,126,109,84,110,84,64,65,67,57,51,53,55,184,133,161,88,211,7,11,190,139,137,43,19,24,46,72,63,15,18,22,11,9,92,67,9,93,25,7,44,108,67,83,128,111,86,66,67,53,55,79,186,135,137,121,27,7,49,113,67,83,128,111,86,66,67,53,55,79,186,135,137,128,32,7,65,104,80,132,77,132,77,132,77,104,74,71,246,111,233,13,191,140,90,45,21,26,48,88,86,65,17,20,24,13,11,94,69,11,51,55,11,15,207,156,202,47,23,28,50,67,19,22,26,15,13,96,71,13,11,70,60,75,74,81,60,72,74,78,45,47,17,208,157,214,49,25,30,52,79,69,21,24,28,17,15,135,212,15,13,70,532,826,74,108,261,72,73,75,295,639,100,147,98,37,15,76,45,50,87,75,77,194,143,171,98,307,50,62,26,19,158,167,17,65,78,78,60,93,17,15,35,13,71,110,607,71,133,311,161,154,161,17,15,34,13,70,61,74,124,62,77,59,80,112,80,115,83,118,55,68,119,62,74,76,80,19,195,144,267,51,27,32,54,80,89,90,71,23,26,30,19,17,100,75,17,15,78,116,114,82,65,192,17,35,15,65,86,109,79,270,38,15,58,106,109,79,208,32,15,70,126,668,181,98,47,17,79,81,146,63,68,35,102,49,19,81,82,103,81,82,103,81,82,103,81,82,103,68,47,17,15,72,362,97,96,94,99,96,228,103,105,216,93,93,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/cts/zcl_abapgit_cts_api.clas.abap"],"names":[],"mappings":";;AAoFA;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;QACQ,sGAAmC;QACnC,6FAAmC;QACnC,mGAAgC;QAChC,sFAAgC;QAChC,+DAAoC;IAE1C,sBAAoB,cAAc;;;;;;;;;;;;;;;;;;;MAkBlC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gEACsB;MACtC;MAEA,iBAAa,GAAV,WAAY,wBAAU;yPACuF;MAChH;MAEA,iBAAsB,GAAnB,oBAAqB,wBAAU;kNAC+D;MACjG;MAEA,iBAAe,oBAAoB;MAErC;;IAGA;;;;;;;;;MAIE;MAMF;;IAGA;;;;;;;;;UACQ,qDAA8B;UAC9B,sDAAoC;UACpC,wDAAmC;UACnC,8CAAoC;MAE1C,aAAa,MAAC,WAAQ,aAAa;MACnC,aAAa,MAAC,YAAS,cAAc;MACrC,aAAa,MAAC,cAAW,cAAc;;;;MASvC,iBAAwB,GAArB,sBAAwB,qCAAG;kNACmE;MACjG;;;;;;;;;;;;;;;;QAUA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;QAEA,cAAY,gCAAoB,GAAb,cAAgB,mBAAvB,CAA8B;QAC5C;;MAGA;;;;;;;YACQ,qDAA8B;YAC9B,sDAAoC;QAE1C,aAAa,MAAC,WAAQ,aAAa;QACnC,aAAa,MAAC,YAAS,cAAc;QACrC,aAAa,MAAC,cAAW,oCAAG;;;;QAQ5B,gBAAc,gCAA4B,GAArB,sBAAuB,qCAA9B,CAAmC;QACnD;;MAGA;;;;;;;YACQ,qDAA8B;YAC9B,sDAAoC;QAE1C,aAAa,MAAC,WAAQ,aAAa;QACnC,aAAa,MAAC,YAAS,cAAc;QACrC,aAAa,MAAC,cAAW,oCAAG;;;;QAQ5B,qBAAmB,gCAA4B,GAArB,sBAAwB,uCAA/B,CAAsC;QAC3D;;MAGA;;;;;;;;;;;YAEO,0DAAiC;YACjC,yOAA2C;YAC3C,kGAA6B;wOAUA;;;;;;;;;;;;;;;;;UAWlC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oEACsB;UACtC;UAEA,yBAAG,aAAuB;YACxB,mBAAiB,sBAAS;UAC5B;;;;;;;;;;;;;;;YAWA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sEACsB;YACtC;UAEF;UAGA;;;;;;;;;YAEE,sBAAM,SAAS;YACf,sBAAM,WAAW;;;;;;;;;;;;;;;;cAYjB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,yBAAG,YAAsB;mNACgD;cAC1F;YACF;YAGA;;;;kBAEO,yFAAsB;kBACtB,kPAAoE;kBACpE,qDAAuB;kBACvB,sDAAoC;kBACpC,wDAA0B;kBAC1B,oRAAuC;cAE5C,IAAc,WAA+B;cAC7C,IAAc,YAAgC;cAO9C;cACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gBACd;cACF;;;gBAGE,sBAAM,UAAU;gBAEhB,aAAa,MAAC,WAAQ,uCAAM;gBAC5B,aAAa,MAAC,YAAS,WAAS,MAAC,SAAQ;gBACzC,aAAa,MAAC,cAAW,WAAS,MAAC,SAAQ;;;;gBAS3C,iBAAwB,GAArB,sBAAuB,qCAAG;;;oBAKzB,eAAa,YAAU,MAAC,OAAM;oBAC9B;kBACF;gBACF,wBAA0D,IAAnD,wFAAqD,uBAAS;kBACnE,gBAAa,mIAE0B;gBACzC;gBAEA,yBAAG,qBAAyB;kBAC1B,YAAY,MAAC,cAAW,WAAS,MAAC,SAAQ;kBAC1C,YAAY,MAAC,cAAW,WAAS,MAAC,SAAQ;kBAC1C,YAAY,MAAC,YAAS,UAAU;kBAChC,wEAA4C;gBAC9C;cAEF;cAEF;;YAGA;;;;cAEE,yBAAG,OAAO,MAAC,oBAAwB,yBAAI,OAAO,MAAC,oBAAuB;gBAEpE,iBAA+C,IAA5C,+EAA8C,uBAAU,iBAGlB,IAFtC,6HAEwC,uBAAS;kBAElD,kBAAe,2HAEsB;gBAEvC,wBAAwD,IAAjD,oFAAmD,uBAAS;kBAEjE,kBAAe,2HAEsB;gBAEvC;cAEF;cAEF;;YAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAgBE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0EACsB;gBACtC;cAEF;cAGA;;;;gBACE,yBAAG,qBAAyB;kBAC1B,iBAAc,2JAAqF;gBACrG;gBACF;;cAGA;;;;gBAEE;gBAKF;;cAGA;;;;gBAEE;gBAGF;;cAGA;;oBAYO,uoBAA4B;gBAEjC,IAAe,yBAA2C;gBAE1D,iBAAiC,GAA9B,oCAAgC,uBAAS;kBAC1C;gBACF;gBAGA,uCAAgC,sBAAS;;gBAMzC;;;gCAAqE;kBAErE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oBACd;kBACF;kBAGA,UAAU,MAAC,QAAK,qCAAI;kBACpB,UAAU,MAAC,QAAK,sCAAK;kBACrB,kFAAoD;kBAGpD,UAAU,MAAC,QAAK,qCAAI;kBACpB,UAAU,MAAC,QAAK,sCAAK;kBACrB,kFAAoD;kBAGpD,UAAU,MAAC,QAAK,qCAAI;kBACpB,UAAU,MAAC,QAAK,sCAAK;kBACrB,kFAAoD;kBAGpD,UAAU,MAAC,QAAK,qCAAI;kBACpB,UAAU,MAAC,QAAK,sCAAK;kBACrB,kFAAoD;kBAEpD,0BAAwB,sBAAS;kBAEnC;;cACF","file":"zcl_abapgit_cts_api.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_config.clas.mjs":{"lineLengths":[53,36,31,32,51,62,918,175,177,169,565,808,17,42,22,821,129,133,117,123,3,29,64,16,3,21,69,594,67,122,134,9,77,117,197,17,110,24,115,14,16,7,5,19,3,51,594,67,68,626,81,81,118,77,88,73,129,142,29,85,108,81,31,127,79,30,52,92,93,9,7,5,3,50,889,64,508,594,122,134,42,599,28,11,180,82,19,112,26,117,16,18,9,7,76,5,3,47,821,35,22,3,54,594,67,81,81,118,178,88,113,5,3,43,889,594,508,107,72,30,72,112,105,125,66,5,20,3,54,594,67,77,74,3,1,66,114,77,116,77,108,69,503,83,83,83,83,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_config.clas.abap"],"names":[],"mappings":";;AAwBA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;QAEO,iHAAsC;QACtC,6HAA4C;IAEjD;MACI,cAAW,uDAAkC;oHAGtB;MACvB,aAAU,gLAAuE;;;;;;;;IAGrF;IAEF;;EAGA;;;QAEO,2DAAoB;IAEzB,IAAc,aAAkC;IAEhD,4CAAO,SAAS,MAAC,gBAAmB;IACpC,4CAAO,SAAS,MAAC,gBAAmB;IACpC,oCAAsB,GAAf,SAAS,MAAC,OAAO,4BAAU,SAAS,MAAC,QAAM;IAElD,sEAAqC;IACrC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MAEd;;;;mFAA+F;MAC/F,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;QAEjB;;;kDAAkF;QAClF,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,gFAA4C;QAC9C;MACF;IACF;EAEF;EAGA;;;QAEO,mfAA6B;QAC7B,ykBAAiD;QACjD,iHAAsC;QACtC,6HAA4C;IAEjD,sBAAM,cAAS;;;MAKb;QACI,cAAW,4JAAuF;iFACzB;;;;;;;;MAG7E;2EAE+C;IACjD;EAEF;EAGA;;IACE,eAAa,cAAS;IACxB;;EAGA;;;IAEE,4CAAO,SAAS,MAAC,gBAAmB;IACpC,4CAAO,SAAS,MAAC,gBAAmB;IACpC,oCAAsB,GAAf,SAAS,MAAC,OAAO,4BAAU,SAAS,MAAC,QAAM;;IAGlD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gHAC6B;IAC7C;EAEF;EAGA;;QAEO,ykBAAgC;QAChC,mfAA6B;IAElC,OAAO,MAAC,UAAO,wCAAyB,sCAAc;;;MAGpD,OAAO,MAAC,WAAO,wCAAiB;MAChC,OAAO,MAAC,WAAO,gFAA2C;MAC1D,SAAS,MAAC,UAAO,wCAAyB,gCAAQ;MAClD,OAAO,MAAC,eAAW,yFAAwD;MAC3E,gCAAO,iBAAW,QAAQ;IAC5B;IAEF;;EAGA;;;4EAEoD;yEACH;EAEjD;AACF","file":"zcl_abapgit_data_config.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_deserializer.clas.mjs":{"lineLengths":[53,42,37,32,57,68,25,744,2027,498,570,725,1548,17,42,22,3,29,64,16,3,37,508,61,76,61,122,134,154,82,9,178,81,17,110,24,115,14,16,7,5,3,44,108,119,61,309,91,123,73,118,171,32,3,41,111,1290,67,218,30,3,41,1290,51,61,262,64,79,70,79,70,154,154,77,77,77,154,154,154,85,85,117,38,117,117,117,98,98,98,31,31,68,34,61,32,90,54,80,9,81,81,7,5,21,3,36,76,51,61,262,64,68,154,101,82,66,29,297,5,96,181,5,19,3,37,51,61,75,58,75,58,75,58,154,154,154,136,176,5,81,81,81,98,75,90,237,7,5,98,75,90,238,7,5,98,56,90,237,7,5,3,56,666,4567,67,1523,67,1290,132,424,154,154,154,67,30,156,83,91,239,262,29,175,90,17,7,116,188,7,170,100,100,100,154,47,84,9,308,7,93,95,5,29,3,58,1523,139,67,889,64,821,594,79,79,508,1290,82,68,30,156,83,119,114,63,22,179,192,29,135,90,81,123,175,73,118,65,24,181,194,31,137,110,75,76,7,5,21,3,64,583,119,61,139,67,821,82,53,59,138,132,139,5,21,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_deserializer.clas.abap"],"names":[],"mappings":";;AA6DA;;;;;;;;;;;;;;;;;;;EAGE;;;;;QAEO,iHAAsC;QACtC,6HAA4C;IAEjD,IAAc,UAAuB;IAErC,2EAA6B;IAE7B;MACI,cAAW,4JAAuF;gFAC1B;;;;;;;;IAG5E;EAEF;EAGA;;;;;;QAEO,kHAAoC;IAEzC,aAAU,sDAAiC;IAI3C,2BAAuB,kEAA+B,mBAAmB;0KAOxB;IAEnD;;EAGA;;;;IAGE,wBAAqB,4LAEO;IAE9B;;EAGA;;;;;;;;;;IAIE,IAAc,UAAuB;IACrC,IAAc,UAAuB;IACrC,IAAc,UAAiB;IAC/B,IAAc,UAAiB;IAC/B,IAAc,UAAiB;IAC/B,IAAc,UAAuB;IACrC,IAAc,UAAuB;IACrC,IAAc,UAAuB;IAErC,8EAAgC;IAChC,8EAAgC;IAEhC,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;IAC1D,SAAS,MAAC,UAAO,OAAO;IACxB,SAAS,MAAC,cAAU,kFAAmD;IACvE,SAAS,MAAC,cAAU,kFAAmD;IACvE,SAAS,MAAC,cAAU,kFAAmD;IACvE,2FAAuC;IACvC,2FAAuC;IACvC,2FAAuC;IAEvC,eAAW,UAAQ;IACnB,eAAW,UAAQ;;;MAIjB;8BAAoD;MACpD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,iBAAY,GAAT,YAAY,WAAQ;UAErB,mEAAmC;QACrC;;;MAGF;IACF;IAEF;;EAGA;;;;;;QAEO,2DAA8B;IAEnC,IAAc,UAAuB;IAErC,aAAU,kFAAmD;IAC7D,2EAA6B;;;MAG3B;IACF;IACA,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;MACtB;IACF;IAEF;;EAGA;;;;;;;;;IAEE,IAAc,UAAuB;IACrC,IAAc,UAAuB;IACrC,IAAc,UAAuB;IAErC,iBAAuD,IAApD,oFAAsD,wBAAU;+KACqB;IACxF;IAEA,0EAA4B;IAC5B,0EAA4B;IAC5B,0EAA4B;IAE5B,iBAAqB,GAAlB,yBAAO,cAAa,gCAAC;;MAEtB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4OACuF;MACvG;IACF;IAEA,iBAAqB,GAAlB,yBAAO,cAAa,gCAAC;;MAEtB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6OACwF;MACxG;IACF;IAEA,iBAAqB,GAAlB,yBAAO,cAAa,gCAAC;;MAEtB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4OACuF;MACvG;IACF;EAEF;EAGA;;;;;;QAIO,iwCAAiC;QACjC,2HAA0C;QAC1C,+ZAAyC;IAE9C,IACE,UAAuB;IADzB,IAEE,UAAuB;IAFzB,IAGE,UAAuB;;;MAGvB,oCAAsB,GAAf,SAAS,MAAC,OAAO,wCAAyB,mCAAW,MAAC,MAAI;MACjE,4CAAO,SAAS,MAAC,gBAAmB;MAGpC;;;;6KAK6C;MAC7C,iBAAY,GAAT,eAAE,MAAC,QAAU,gCAAC;QACf;MACF;MAEA,iBAAyC,IAAtC,8DAAwC,wBAAU;2LACuC;MAC5F;yKAM+B;MAE/B,2FAAuC;MACvC,2FAAuC;MACvC,2FAAuC;MAEvC,iBAAkE,IAA/D,qGAAiE,uBAAS;QAC3E,yBAAG,WAAqB;UACtB,gBAAa,wDAAmC;QAClD;mTAOuC;MACzC;MAEA,oFAAkD;MAClD,sFAAoD;IACtD;IAEF;;EAGA;;;;;;QAIO,4yBAAqD;QACrD,ykBAAkC;QAClC,sEAA2B;QAC3B,sEAA2B;QAC3B,mfAAgC;QAChC,iwCAAiC;IAEtC,gBAAa,4DAAyB;;;MAGpC,oCAAsB,GAAf,SAAS,MAAC,OAAO,wCAAyB,mCAAW,MAAC,MAAI;MACjE,4CAAO,SAAS,MAAC,gBAAmB;MAEpC,gBAAa,+FAA0D;MAEvE;;;;;;qIAGgF;MAChF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;gFAGQ;QAErB,gBAAa,iGAEiB;QAE9B,eAAY,sJAIe;QAE3B,kCAAmB,SAAW,SAAS,MAAC,KAAI;QAE5C;;;;;;uIAGkF;QAClF,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEnB,kCAAmB,SAAW,SAAS,MAAC,OAAM;QAE9C,iEAAqC;MACvC;IAEF;IAEF;;EAGA;;;;;;QAEO,4yBAAqD;IAE1D,gBAAa,4DAAyB;IAEtC,yBAAG,qBAAyB;MAC1B,SAAS,MAAC,cAAe,sBAAS;MAClC,SAAS,MAAC,KAAI,MAAC,aAAU,oCAAqB,oCAAgB,MAAC,aAAY;MAC3E,SAAS,MAAC,KAAI,MAAC,UAAU,oCAAqB,oCAAgB,MAAC,UAAS;MACxE,SAAS,MAAC,gBAAe,oGAEsC;IACjE;IAEF;;AACF","file":"zcl_abapgit_data_deserializer.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_factory.clas.mjs":{"lineLengths":[53,37,32,32,52,37,246,228,235,261,247,255,232,17,42,22,62,64,68,3,29,64,16,3,22,49,3,29,139,88,21,3,28,55,3,35,157,73,127,5,66,27,3,26,53,3,33,151,71,123,5,62,25,3,25,52,3,32,148,70,121,5,60,24,3,1,68,165,168,174,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_factory.clas.abap"],"names":[],"mappings":";;AA6BA;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;IAEA;;EAGA;;;;;IAEE,yBAAG,yCAA0B;;IAE7B;IAEA,oBAAkB,wCAAe;IAEnC;;EAGA;;;;;IAEE,yBAAG,uCAAwB;;IAE3B;IAEA,kBAAgB,sCAAa;IAE/B;;EAGA;;;;;IAEE,yBAAG,sCAAuB;;IAE1B;IAEA,iBAAe,qCAAY;IAE7B;;AACF","file":"zcl_abapgit_data_factory.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_injector.clas.mjs":{"lineLengths":[53,38,33,32,53,37,25,261,247,256,17,42,22,3,29,64,16,3,33,157,85,82,3,31,151,79,78,3,30,148,76,76,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_injector.clas.abap"],"names":[],"mappings":";;AAqBA;;;;;;;;;;;;;;;;EAGE;;;IACE,wCAAwB,CAAE,oBAAkB,eAAe;EAC7D;EAGA;;;IACE,wCAAwB,CAAE,kBAAgB,aAAa;EACzD;EAGA;;;IACE,wCAAwB,CAAE,iBAAe,YAAY;EACvD;AACF","file":"zcl_abapgit_data_injector.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_serializer.clas.mjs":{"lineLengths":[53,40,35,32,55,66,168,453,571,17,42,22,67,3,29,64,16,3,37,69,76,61,108,85,122,69,134,154,82,9,77,63,118,69,191,7,118,17,110,24,115,14,16,7,5,108,19,3,36,76,51,61,262,64,66,68,116,154,101,82,9,68,31,299,7,98,183,7,17,94,22,134,14,16,7,5,58,81,297,5,19,3,54,889,139,67,821,594,508,76,107,82,68,30,156,83,150,120,133,14,151,7,125,112,66,5,20,3,1,74,89,53,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_serializer.clas.abap"],"names":[],"mappings":";;AAmCA;;;;;;;;;;;;;;;;EAGE;;;;;;QAEO,iHAAuC;QACvC,4DAAqB;QACrB,6HAA6C;IAElD,IAAc,UAAuB;IAErC,2EAA6B;IAE7B;MACI,cAAW,uDAAkC;8DACjB;qHAGP;MAErB,iBAAmB,GAAhB,iBAAkB,uBAAS;QAC5B,cAAW,uKAEyD;MACtE;MAEA,eAAY,+FAAwB;;;;;;;;IAGxC;IAEA,aAAU,yFAAwD;IAEpE;;EAGA;;;;;;QAEO,yDAAiB;QACjB,2DAA8B;QAC9B,2GAAkC;IAEvC,IAAc,UAAuB;IAErC,aAAU,kFAAmD;IAC7D,2EAA6B;IAE7B;;;QAEM;MACF;MACA,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;QACtB;MACF;;;;;;;;IAKJ;IAEA,eAAa,yBAAO,YAAU;IAC9B,iBAAc,GAAX,YAAa,0CAAa;wSAE4B;IACzD;IAEF;;EAGA;;;;QAEO,4yBAAqD;QACrD,ykBAAkC;QAClC,mfAAgC;QAChC,mEAA2B;IAEhC,OAAO,MAAC,UAAO,wCAAyB,sCAAc;IACtD,gBAAa,4DAAyB;;;MAGpC,oCAAsB,GAAf,SAAS,MAAC,OAAO,wCAAyB,mCAAW,MAAC,MAAI;MACjE,4CAAO,SAAS,MAAC,gBAAmB;MAEpC,iBAA8D,IAA3D,iGAA6D,uBAAS;QACvE,aAAU,iGAEoB;QAE9B,OAAO,MAAC,WAAO,mGAE6B;MAC9C;QACE,OAAO,MAAC,WAAO,qHAAmD;MACpE;MAEA,OAAO,MAAC,eAAW,yFAAwD;MAC3E,OAAO,MAAC,WAAO,gFAA2C;MAC1D,gCAAO,iBAAW,QAAQ;IAC5B;IAEF;;AACF","file":"zcl_abapgit_data_serializer.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_supporter.clas.mjs":{"lineLengths":[53,39,34,32,54,65,582,84,17,42,22,484,3,29,64,16,3,33,278,100,245,123,461,67,31,119,43,90,5,73,112,3,63,105,105,61,51,61,277,58,41,5,76,101,114,27,57,88,47,12,179,39,65,51,30,9,7,5,24,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_supporter.clas.abap"],"names":[],"mappings":";;AAoBA;;;;;;;;;;;;;;;EAGE;QAGI,6QAAyC;QACzC,2FAAuB;QACvB,4OAA4C;QAC5C,kHAAuC;IAGzC;;;MAaE,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;MAC1D,SAAS,MAAC,UAAO,UAAU;MAC3B,iFAAgD;IAClD;IAIA,aAAU,sDAAiC;+GAC0C;EAEvF;EAGA;;;;;;IAEE,IAAc,aAA6C;IAE3D,yBAAG,0BAA+B;wCACR;IAC1B;IAEA;;;;uDAC8C;IAC9C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,iBAAe,sBAAS;IAC1B;;;QAGI,iBAAW,GAAR,SAAW,aAAW,MAAC,MAAI;UAC5B,iBAAe,sBAAS;UACxB;QACF;MACF;IACF;IAEF;;AACF","file":"zcl_abapgit_data_supporter.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_utils.clas.mjs":{"lineLengths":[53,35,30,32,50,37,25,503,265,806,808,823,291,301,17,42,22,3,29,64,16,3,38,63,3,45,71,594,67,396,148,23,3,36,61,3,43,71,594,67,344,148,23,3,33,58,3,40,76,51,61,121,125,124,1031,297,114,857,184,9,97,41,17,22,44,75,13,16,20,9,7,90,176,7,11,53,92,73,53,96,92,66,65,72,41,81,57,11,9,100,88,16,122,9,121,96,19,80,156,16,18,9,7,21,5,35,60,5,42,104,53,63,11,56,46,19,108,16,18,9,7,23,5,39,64,5,46,109,53,63,56,96,98,105,79,11,199,147,216,163,136,197,144,77,207,154,94,126,62,67,25,38,21,124,208,18,20,11,9,81,53,65,54,16,58,9,30,7,25,50,7,32,104,601,65,13,195,144,112,45,21,26,48,83,81,78,78,82,77,65,17,20,24,13,11,94,182,11,25,9,38,63,9,45,303,57,67,98,60,86,63,133,83,84,165,34,15,203,151,220,167,117,173,55,60,29,98,107,115,31,15,37,199,146,77,25,205,79,86,103,118,136,21,83,53,29,34,56,82,85,25,28,32,21,19,102,165,19,87,48,142,161,31,21,144,122,85,19,24,26,17,15,30,13,11,74,322,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_utils.clas.abap"],"names":[],"mappings":";;AAsDA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;IAEE,gBAAc,sXACyC;IAEvD,6IAAsD;IAExD;;EAGA;;;;;;;IAEE,gBAAc,kUACyC;IAEvD,6IAAsD;IAExD;;EAGA;;;;;;;QAEO,gHAAuC;QACvC,oHAAyC;QACzC,mHAAwC;QACxC,8/BAAsC;QACtC,gSAAuB;IAE5B,IAAc,WAAoC;IAClD,IAAc,UAAmC;IACjD,IAAc,gBAA+C;;+FAQrC;;;;;;;;;;;MACxB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+KACsE;MACtF;MAEA;mCACI,SAAW,OAAO;QAGlB,iBAA4B,IAAzB,qCAA2B,uBAAS;UACrC,cAAW,+CAA0B;;UAGrC,UAAQ,MAAC,iBAAc,mCAAoB,gBAAgB;UAC3D,UAAQ,MAAC,cAAc,mCAAoB,eAAe;UAC1D,UAAQ,MAAC,gBAAc,sBAAS;UAChC,UAAQ,MAAC,eAAc,sBAAS;;;;YAI9B,gBAAc,MAAC,UAAO,WAAS;UACjC;QACF;QAEA,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;UACtB,cAAW,8DAAkC;QAC/C;UACE,cAAW,gGAEc;QAC3B;QAEA;;;;;;;;MAIJ;MAEF;;IAGA;;;;;;;MAIE;uDAC+B;QAC3B,cAAY,sBAAS;;;;;;MAEzB;MAEF;;IAGA;;;;;;;UAEO,6CAAiC;UACjC,qFAAoC;UACpC,uFAAoC;UACpC,8FAAoC;MACzC,IAAc,UAAiB;MAE/B;;;;;;;;;;;;QAYI;;;sBAA+C;UAC/C,gBAAc,UAAQ;;;;;;;QAG1B;QAEA,iBAAe,GAAZ,aAAc,qCAAG;UAClB,mBAAiB,sBAAS;QAC5B,gCAAO,sBAA0B;UAC/B,mBAAiB,uBAAU;QAC7B;UACE,mBAAiB,2BAAc;QACjC;QAEF;;MAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;UAcE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;qLACkE;UAClF;UAEF;;QAGA;;;;;;;cACO,mFAAgC;cAChC,6CAA8B;cAC9B,uEAA8B;cAC9B,gDAA8B;cAC9B,sHAA6C;UAClD,IAAc,UAAiB;UAC/B,IAAc,YAAsB;UACpC,IAAc,eAA4B;UAG1C,eAAa,OAAO;UAEpB;;;;;;YAMI;;;0BAA0F;cAC1F,iBAAa,GAAV,eAAE,MAAC,QAAU,gCAAC;gBAEf;;;cACF;cACA,WAAS,UAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA4BrB;cAEF;;UACF","file":"zcl_abapgit_data_utils.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_default_transport.clas.mjs":{"lineLengths":[53,42,37,32,57,37,247,190,137,67,51,194,154,243,55,185,49,153,17,42,22,65,114,60,3,22,67,85,9,184,133,228,41,17,22,44,77,74,73,61,13,16,20,9,7,90,65,7,5,31,25,18,5,17,69,243,11,184,133,86,43,19,24,46,79,79,77,63,15,18,22,11,9,92,67,9,85,34,31,7,28,60,7,35,153,78,132,9,67,27,7,21,71,82,17,9,57,48,62,63,9,29,7,23,49,17,9,13,186,135,143,45,21,26,48,81,81,79,82,78,77,65,17,20,24,13,11,94,69,11,9,26,106,82,83,19,11,51,139,11,64,64,9,35,106,82,15,188,137,140,47,23,28,50,83,83,81,84,80,79,67,19,22,26,15,13,96,71,13,11,25,49,11,9,86,179,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/cts/zcl_abapgit_default_transport.clas.abap"],"names":[],"mappings":";;AA4DA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;;;;;;;;;;MAaE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gEACsB;MACtC;IAEF;IAGA;wBAEU;MAEV;;IAGA;;UAEQ,wOAAyC;;;;;;;;;;;;;;;;;;QAU/C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;QAEA;gCAC6B;QAE/B;;MAGA;;;;;QAEE,yBAAG,0CAAwB;;QAE3B;QAEA,gBAAc,yCAAW;QAE3B;;MAGA;YAEQ,0DAA4B;QAElC,iBAAwB,GAArB,2BAAuB,wBAAU;UAGlC;QACF;QAEA,sBAAM,yBAAoB;QAE1B,qBAAkB,iBAAM;QAExB,yBAAG,0BAA8B;8DAEP;QAE1B;4BAEU;MAEZ;MAGA;QAEE,yBAAG,aAAkB;UAGnB;QACF;;;;;;;;;;;;;;;;;;;;;UAcA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oEACsB;UACtC;QAEF;QAGA;;;UAME,iBAAwB,GAArB,2BAAuB,uBAAS;YAGjC;UACF;UAEA,yBAAG,aAAuB;0IAC2C;UACrE;+DAE4B;UAE5B,8BAAuB,sBAAS;QAElC;QAGA;;;;;;;;;;;;;;;;;;;;;;;YAeE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sEACsB;YACtC;UAEF;UAGA;YAEE,kBAAU,iBAAM;UAElB;QACF","file":"zcl_abapgit_default_transport.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_dependencies.clas.mjs":{"lineLengths":[53,37,32,32,52,37,25,925,987,911,903,17,42,22,3,29,64,16,3,38,65,3,45,788,56,76,244,65,46,78,60,25,3,24,51,3,31,813,61,54,627,67,37,48,80,82,87,82,87,82,87,82,87,82,87,82,87,82,229,310,167,84,16,84,9,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,272,92,84,16,84,9,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,87,82,14,82,7,5,50,54,66,3,29,56,3,36,813,61,466,807,244,63,19,65,64,65,242,239,788,632,597,637,627,659,94,318,369,37,51,66,64,5,96,96,96,96,67,36,44,91,54,11,187,136,193,43,19,24,46,75,72,77,87,68,77,73,79,63,15,18,22,11,9,92,19,9,72,41,55,50,77,56,151,93,89,93,89,93,18,143,11,9,7,40,231,44,45,53,73,71,112,346,46,65,46,238,261,33,174,97,21,11,55,50,83,91,9,7,61,24,20,53,59,71,40,52,209,188,33,131,94,309,45,101,84,13,218,77,18,11,9,78,16,9,81,7,52,5,35,62,5,42,815,63,329,629,139,640,231,39,247,77,46,81,155,168,33,111,94,236,11,9,7,5,3,70,584,809,305,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_dependencies.clas.abap"],"names":[],"mappings":";;AAmDA;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,2OAAmC;QACnC,wDAA0B;IAEhC,YAAY,MAAC,UAAO,YAAY;IAChC,uEAA2C;;IAK7C;;EAGA;;;;;;QAEQ,6CAA+B;IAErC,IAAe,YAAgC;;;MAM7C,IACE,OAGA,AAEA,AAEA,AAEA,AAGA,AAEA,AAGA,AAYA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,AAEA,AAEA,AAEA,AAGA,AAEA,AAWA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAGA,KAnGG,YAAU,MAAC,OAAhB;;QAGI,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B;QAKA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAgB,GAAZ,aAAc,0CAAQ;UAExC,YAAU,MAAC,aAAU,yCAAQ;QAC/B;UACE,YAAU,MAAC,aAAU,yCAAQ;QAC/B;;QAGA,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B;QAIA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,YAAU,MAAC,aAAU,yCAAQ;QAC/B;UACE,YAAU,MAAC,aAAU,yCAAQ;QAC/B;;QAEA,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAG7B,YAAU,MAAC,aAAU,yCAAQ;;QAE7B,YAAU,MAAC,aAAU,yCAAQ;;IAEnC;iDAE4C;qDACI;IAEhD;EAEF;EAGA;;;;;;QASQ,ycAAqC;QACrC,8xBAAqC;QACrC,2OAAoC;QACpC,sDAA8B,CAAA;;QAC9B,wDAA6B;QAC7B,uDAAsB;QACtB,wDAAsB;QACtB,yOAAuC;QACvC,sOAA8C;QAC9C,2wBAAoC;IAE1C,IAAe,iBAA2D;IAA1E,IACe,iBAAuC;IADtD,IAEe,sBAA2D;IAF1E,IAGe,YAA0C;IAHzD,IAIe,WAA0C;IAJzD,IAKe,YAA2C;IAL1D,IAMe,WAA0C;;;;MAQvD,WAAS,MAAC,cAAW,YAAU,MAAC,SAAQ;MACxC,WAAS,MAAC,cAAW,YAAU,MAAC,OAAM;IACxC;IAEA,gCAAO,iDAAU,QAAQ;IACzB,gCAAO,iDAAU,QAAQ;IACzB,gCAAO,iDAAU,QAAQ;IACzB,gCAAO,iDAAU,QAAQ;;;MAKvB,sBAAM,cAAc;MACpB,gCAAO,WAAS,MAAC,mBAAY,cAAc;MAC3C,oBAAkB,WAAS,MAAC,SAAQ;;;;;;;;;;;;;;;;;;;;;;;QAmBpC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;QACF;;;;UAIE,WAAS,MAAC,UAAO,WAAS;UAE1B,WAAS,MAAC,GAAE,MAAC,cAAa,YAAU,MAAC,OAAM;UAC3C,IACE,OAGA,AAEA,KANG,YAAU,MAAC,WAAhB;;YAGI,WAAS,MAAC,GAAE,MAAC,cAAW,uCAAM;;YAE9B,WAAS,MAAC,GAAE,MAAC,cAAW,uCAAM;;YAE9B,WAAS,MAAC,GAAE,MAAC,cAAW,uCAAM;;8IAEoC;;QAExE;MAEF;MAGA;;;QAIE,sBAAO,aAAa;;QAGpB,WAAS,MAAC,cAAW,iBAAe,MAAC,SAAQ;QAC7C,WAAS,MAAC,cAAW,iBAAe,MAAC,OAAM;QAE3C,mBAAgB,mFAAiD;;;UAM/D;;;;;4KAIiC;UACjC,mBAAe,GAAT,eAAE,MAAC,QAAQ;qBAAC;;;UAGlB,WAAS,MAAC,UAAO,WAAS;UAC1B,WAAS,MAAC,GAAE,MAAC,cAAW,iBAAe,MAAC,QAAO;UAC/C,WAAS,MAAC,GAAE,MAAC,cAAW,uCAAM;QAEhC;MAEF;;;;;QAGE,cAAY,yBAAO,UAAU;;;UAE3B,aAAW,eAAE,MAAC,MAAK;UACnB;;;iIAGwB;UACxB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;;cAIZ,YAAU,MAAC,aAA6B,mBAAnB,YAAU,MAAC,SAAU,QAAO;cACjD,yBAAS,YAAU,MAAC,QAAO;YAC7B;;;YAKA;UACF;QACF;QACA,iBAAa,GAAV,WAAY,yBAAO,WAAU;UAC9B;QACF;QACA,YAAkB,mBAAR,QAAU,gCAAC;MACvB;;IAEF;IAGA;;;;;;UAEQ,8TAA2D;MAEjE,IAAe,YAA2C;MAA1D,IACe,iBAAiD;MADhE,IAEe,uBAA2C;;;QAOxD,oBAAiB,yNAAsF;;;UAIrG;;;;6GAEuD;UACvD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb,uBAAqB,MAAC,aAAU,oLAAmD;UACrF;QAEF;MAEF;IAEF;EACF","file":"zcl_abapgit_dependencies.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_diff.clas.mjs":{"lineLengths":[53,29,24,32,44,37,387,1307,464,135,184,152,878,55,53,439,1926,59,55,721,1315,474,308,308,382,304,1115,17,42,22,290,1231,388,59,108,66,3,23,70,68,229,411,893,899,897,71,36,269,50,69,9,113,77,79,45,7,5,72,35,61,54,67,55,156,70,41,92,16,9,198,68,39,92,16,9,55,126,88,79,71,77,66,65,61,18,18,11,133,88,79,71,77,66,65,61,18,18,11,16,16,9,7,52,5,3,27,893,71,36,47,124,119,131,119,131,119,7,5,3,35,1230,258,58,258,58,60,861,245,98,98,95,9,191,140,226,41,17,22,44,78,81,61,13,16,20,9,7,90,71,41,41,91,47,44,60,11,91,47,44,60,11,96,122,103,122,186,122,184,125,185,125,185,125,18,118,11,69,9,97,69,39,41,65,44,79,36,112,65,44,452,122,11,69,9,14,114,7,21,5,31,70,60,70,60,116,105,126,113,96,120,109,84,112,260,260,64,75,107,7,72,107,7,46,90,90,31,35,31,29,18,5,30,343,116,289,70,159,145,139,133,123,134,168,123,69,32,137,73,7,26,5,17,1232,32,21,5,25,291,38,24,5,34,105,66,66,895,62,33,90,53,14,158,7,24,5,25,71,61,65,75,76,73,116,339,895,52,73,38,39,52,71,34,113,94,53,71,124,96,126,13,76,76,13,114,89,234,97,144,251,141,13,85,59,56,18,11,9,7,5,40,867,75,108,81,895,479,38,56,14,7,5,32,69,75,108,81,895,65,27,31,74,77,29,50,90,165,7,54,5,32,69,75,108,81,895,65,27,31,74,77,29,50,90,165,7,54,5,23,66,895,103,75,40,62,9,14,247,10,52,65,66,71,59,118,39,164,20,13,64,11,56,65,66,71,59,170,39,96,20,13,87,23,13,64,11,56,9,7,5,19,389,34,22,5,25,70,60,70,60,260,57,260,57,68,68,56,56,104,104,51,158,7,51,158,7,211,99,218,99,7,113,113,5,3,54,85,45,354,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_diff.clas.abap"],"names":[],"mappings":";;AAyFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;QAaI,6DAAqB;QACrB,2DAAqB;QACrB,4NAAiC;QACjC,kZAAoE;IAEtE,IACE,WAAoC;IADtC,IAEE,iBAAoC;IAFtC,IAGE,eAAoC;;;MAIpC,iBAAoB,GAAjB,WAAS,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAO,iBACzC,GAAjB,WAAS,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;QAC1D,yBAAG,cAAwB;UACzB,aAAa,MAAC,WAAQ,eAAE,MAAC,MAAK;QAChC;QACA,aAAa,MAAC,SAAwB,mBAAlB,aAAa,MAAC,KAAM,gCAAC;MAC3C,gCAAO,aAAa,MAAC,iBAAoB;QACvC,gCAAO,uBAAiB,aAAa;QACrC,sBAAM,aAAa;MACrB;IACF;;;;;;;QAMI,mBAAgD,qBAAX,mBAApB,aAAa,MAAC,OAAQ,eAAE,MAAC,QAAQ,gCAAC;QACnD;uCAAiE;QACjE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;QACF;QACA,iBAAkE,qBAAX,mBAApB,mBAApB,aAAa,MAAC,OAAQ,aAAa,MAAC,MAAM,eAAE,MAAC,QAAQ,gCAAC;QACrE;qCAA6D;QAC7D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;QACF;QACA,IACE,OASA,KAVG,iBAAe,MAAC,OAArB;;UAEI,iBAAuB,GAApB,iBAAe,MAAC,MAAM,eAAa,MAAC,KAAG;YACxC,iBAAe,MAAC,aAAU,eAAa,MAAC,QAAO;YAC/C,iBAAe,MAAC,SAAU,eAAa,MAAC,IAAG;YAC3C,eAAa,MAAC,YAAY,iBAAe,MAAC,OAAM;YAChD,sBAAO,iBAAe,MAAC,OAAM;YAA7B,sBAA+B,eAAa,MAAC,QAAO;YAApD,sBAAsD,eAAa,MAAC,IAAG;UACzE;YACE;UACF;;UAEA,iBAAuB,GAApB,iBAAe,MAAC,MAAM,eAAa,MAAC,KAAG;YACxC,iBAAe,MAAC,aAAU,eAAa,MAAC,QAAO;YAC/C,iBAAe,MAAC,SAAU,eAAa,MAAC,IAAG;YAC3C,eAAa,MAAC,YAAY,iBAAe,MAAC,OAAM;YAChD,sBAAO,iBAAe,MAAC,OAAM;YAA7B,sBAA+B,eAAa,MAAC,QAAO;YAApD,sBAAsD,eAAa,MAAC,IAAG;UACzE;YACE;UACF;;UAEA;;MAEN;;IACF;EAEF;EAGA;IAEE,IAAe,WAA8B;;;MAG3C,IACE,OAEA,AAEA,KALG,WAAS,MAAC,OAAf;;QAEI,aAAQ,MAAC,YAAyB,mBAAhB,aAAQ,MAAC,QAAS,gCAAC;;QAErC,aAAQ,MAAC,YAAyB,mBAAhB,aAAQ,MAAC,QAAS,gCAAC;;QAErC,aAAQ,MAAC,YAAyB,mBAAhB,aAAQ,MAAC,QAAS,gCAAC;;IAE3C;EAEF;EAGA;;;;;;QAGI,mDAAe;QACf,o1BAA6B;QAC7B,4OAA2D;IAE7D,IACE,UAA8B;IADhC,IAEE,UAA8B;IAFhC,IAGE,YAAgC;;;;;;;;;;;;;;;;;MAgBlC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;UAGX,sBAAM,OAAO;UACb,iBAAoB,GAAjB,YAAU,MAAC,QAAQ,gCAAC;YACrB,SAAO,YAAU,MAAC,MAAK;YACvB,OAAO,MAAC,aAAU,IAAI;YACtB,OAAO,MAAC,SAAU,YAAU,MAAC,MAAK;UACpC;UACA,iBAAoB,GAAjB,YAAU,MAAC,QAAQ,gCAAC;YACrB,SAAO,YAAU,MAAC,MAAK;YACvB,OAAO,MAAC,aAAU,IAAI;YACtB,OAAO,MAAC,SAAU,YAAU,MAAC,MAAK;UACpC;UACA,iBAAoB,GAAjB,YAAU,MAAC,QAAQ,qCAAG;YACvB,OAAO,MAAC,YAAS,wCAAyB,8BAAM,MAAC,OAAM;UACzD,wBAAwB,GAAjB,YAAU,MAAC,QAAQ,qCAAG;YAC3B,OAAO,MAAC,YAAS,wCAAyB,8BAAM,MAAC,OAAM;UACzD,wBAAwB,GAAjB,YAAU,MAAC,QAAQ,qCAAI,iBAAqB,GAAjB,YAAU,MAAC,QAAQ,qCAAG;YACtD,OAAO,MAAC,YAAS,wCAAyB,8BAAM,MAAC,OAAM;UACzD,wBAAwB,GAAjB,YAAU,MAAC,QAAQ,oCAAG,iBAAqB,GAAjB,YAAU,MAAC,QAAQ,oCAAE;YACpD,OAAO,MAAC,YAAS,wCAAyB,8BAAM,MAAC,UAAS;UAC5D,wBAAwB,GAAjB,YAAU,MAAC,QAAQ,oCAAG,iBAAqB,GAAjB,YAAU,MAAC,QAAQ,qCAAG;YACrD,OAAO,MAAC,YAAS,wCAAyB,8BAAM,MAAC,UAAS;UAC5D,wBAAwB,GAAjB,YAAU,MAAC,QAAQ,qCAAI,iBAAqB,GAAjB,YAAU,MAAC,QAAQ,oCAAE;YACrD,OAAO,MAAC,YAAS,wCAAyB,8BAAM,MAAC,UAAS;UAC5D;YACE,oCAAS,GAAF,iCAAI,gCAAC;UACd;UACA,gCAAO,iBAAW,OAAO;QAC3B;MACF,wBAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;UAGf,sBAAM,OAAO;UACb,OAAO,MAAC,aAAU,eAAE,MAAC,MAAK;UAC1B,OAAO,MAAC,SAAU,UAAQ;UAC1B;kCAAmD;UACnD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACnB,OAAO,MAAC,aAAU,eAAE,MAAC,MAAK;UAC1B,OAAO,MAAC,SAAU,UAAQ;UAE1B,IAAG,cAAkB,GAAhB,sBAAkB,gCAAE,iBAAmB,GAAhB,sBAAkB,gCAAE,CAAE,iBAAa,GAAT,YAAY,WAAS,IACxE,cAAiC,GAA/B,0BAAQ,4BAAU,gBAAe,gCAAE,iBAAkC,GAA/B,0BAAQ,4BAAU,gBAAe,gCAAE,CAAC;YAC7E,OAAO,MAAC,YAAS,wCAAyB,8BAAM,MAAC,OAAM;UACzD;UACA,gCAAO,iBAAW,OAAO;QAC3B;MACF;QACE,oCAAS,GAAF,iCAAI,gCAAC;MACd;MAEF;;IAGA;;;;;;;;;;;;;;UAEQ,yPAAsB;UACtB,yPAAsB;MAE5B,yBAAkB,+BAAC;MACnB,iBAAyB,GAAtB,uBAAwB,uBAAS;QAClC,yBAAkC,mBAAhB,qBAAkB,gCAAC;MACvC;MACA,iBAAsB,GAAnB,oBAAqB,uBAAS;QAC/B,yBAAkC,mBAAhB,qBAAkB,gCAAC;MACvC;MACA,wBAAiB,cAAc;yFAKI;MAEnC,kBAAU,gEACqC;8BAEjC;kCAEI;8BACJ;4BACF;MAEd;;IAGA;;UAEQ,yGAAkC;UAClC,sRAAmD;UACnD,2DAA8B;MAEpC,gCAAO,8GAAoE,QAAQ;MACnF,gCAAO,gGAAoD,QAAQ;MACnE,gCAAO,0FAAgD,QAAQ;MAC/D,gCAAO,oFAAyC,QAAQ;MACxD,gCAAO,0EAA+B,QAAQ;MAC9C,gCAAO,qFAA0C,QAAQ;MACzD,gCAAO,uHAA0E,QAAQ;MACzF,gCAAO,0EAAgC,QAAQ;;;;QAO7C,gCAAO,kBAAY,YAAY;MACjC;MAEF;;IAGA;;MACE,YAAU,YAAO;MACnB;;IAGA;;MACE,eAAa,eAAU;MACzB;;IAGA;;;;MAEE,IAAe,WAA+C;MAE9D;+BACsC;MACtC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,eAAa,WAAS,MAAC,WAAU;MACnC;6JACoE;MACpE;MAEF;;IAGA;UAEQ,4DAA8C,CAAA;;UAC9C,sDAAqB;UACrB,gEAA0B;UAC1B,iEAA0B;UAC1B,8DAA0B;UAC1B,yGAAwC;UACxC,wUAAkC;MAExC,IAAe,WAA8B;MAE7C,cAAW,8BAAmB;;;QAG5B,sBAAM,OAAO;QACb,WAAS,MAAC,YAAS,aAAa;;;;UAI9B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb,kBAAgB,WAAS,MAAC,IAAG;YAC7B,gBAAc,4BAAU,aAAa;;YAIrC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;YAEhB;YAEA,iBAAW,GAAR,SAAU,gCAAC;cACZ,kBAAgB,0CAAsB;YACxC;YACA,kBAAgB,uBAAU,KAAM,eACN,KAAM,kCAAK;YAErC,iBAAe,GAAZ,aAAc,yCAAO;cACtB,mBAAiB,sBAAS,KAAQ,eACR,OAAQ,qEACR,MAAQ,qCACR,KAAQ,iCAAG;YACvC,wBAAmB,GAAZ,aAAc,0CAAQ;cAC3B,wCAAgB,qCAAkB,oCAAU,eAAa;YAC3D,wBAAmB,GAAZ,aAAc,0CAAS,iBAAe,GAAZ,aAAc,6CAAY,iBAAe,GAAZ,aAAc,2CAAS;cACnF,wCAAgB,qCAAkB,iCAAO,eAAa;YACxD;YAEA,gCAAO,uBAAiB,eAAU;YAClC,kBAAmB,eAAE,MAAC,MAAK;YAC3B,WAAS,MAAC,YAAS,aAAa;YAChC;UACF;QACF;MACF;IAEF;IAGA;;;;;MAEE,IAAe,WAA+C;;;QAS5D,WAAS,MAAC,gBAAa,aAAa;QACpC;MAEF;IAEF;IAGA;;;;;MAEE,IAAe,WAA+C;MAE9D;;;;;;gDAEsC;MACtC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oKAC2D;MAC3E;MAEA,WAAS,MAAC,gBAAa,aAAa;IAEtC;IAGA;;;;;MAEE,IAAe,WAA+C;MAE9D;;;;;;gDAEsC;MACtC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oKAC2D;MAC3E;MAEA,WAAS,MAAC,gBAAa,aAAa;IAEtC;IAGA;UAEQ,uDAAe;MAErB,IAAe,WAA8B;MAE7C,iBAAoB,GAAjB,yBAAO,gBAAY,iCAAE;;;UAEpB,WAAS,MAAC,WAAQ,sBAAS;QAC7B;MACF;;;UAGI,aAAW,eAAE,MAAC,MAAK;;;;;YAGjB;qCAAoE;YACpE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAmB,GAAhB,WAAS,MAAC,QAAQ,uBAAS;cAC7C;YACF;YACA,WAAS,MAAC,WAAQ,sBAAS;UAC7B;;;;;;YAGE;qCAAwE;YACxE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;cACd;YACF;YACA,mBAAsB,GAAhB,WAAS,MAAC,QAAQ;uBAAU;;YAClC,WAAS,MAAC,WAAQ,sBAAS;UAC7B;;QAEF;MACF;IAEF;IAGA;;MACE,aAAW,aAAQ;MACrB;;IAGA;;;;;;;;;UAEQ,yDAAuB;UACvB,yDAAuB;UACvB,6CAA2B;UAC3B,6CAA2B;MAEjC,YAAS,oFAAqD;MAC9D,YAAS,oFAAqD;MAI9D,yBAAG,iBAAqB;QACtB,gBAAc,wBACZ,KAAM,QACN,KAAuB,qBAAjB,0BAAQ,SAAW,kCAAG;MAChC;MACA,yBAAG,iBAAqB;QACtB,gBAAc,wBACZ,KAAM,QACN,KAAuB,qBAAjB,0BAAQ,SAAW,kCAAG;MAChC;MAEA,iBAAe,GAAZ,aAAc,uCAAwB,QAAQ,iBAAgB,GAAZ,aAAe,uCAAwB,QAC1F,yBAAI,iBAAqB;QACzB,iCAAS,OAAU,uCAAwB,UAAS;MACtD,wBAAmB,GAAZ,aAAe,uCAAwB,QAAQ,iBAAgB,GAAZ,aAAc,uCAAwB,QAC9F,yBAAI,iBAAqB;QACzB,iCAAS,OAAU,uCAAwB,UAAS;MACtD;MAEA;MACA;IAEF;EACF","file":"zcl_abapgit_diff.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_dot_abapgit.clas.mjs":{"lineLengths":[53,36,31,32,51,37,2051,2164,2148,235,342,2045,160,597,2042,270,413,273,168,166,166,168,195,416,416,524,327,684,684,181,159,191,192,17,42,22,1953,3,27,67,61,71,73,67,101,60,73,88,13,5,68,31,3,25,51,3,32,140,1952,67,80,128,111,26,3,29,1952,61,30,16,3,28,54,3,35,140,69,61,66,1952,103,57,111,26,3,25,51,3,32,1952,66,58,66,23,126,192,59,130,5,19,3,20,1952,30,19,3,28,68,50,20,3,30,316,56,24,3,29,96,56,23,3,28,586,57,27,3,25,429,108,115,121,24,3,31,67,52,19,3,32,79,65,31,3,27,103,67,61,71,73,67,71,66,69,60,139,177,43,24,5,196,43,24,5,84,31,48,47,26,7,5,142,45,5,115,46,5,22,3,30,67,61,71,73,67,60,89,3,21,69,66,61,109,19,3,33,68,64,50,3,35,316,76,56,3,33,586,85,57,3,36,67,61,52,3,37,57,94,65,3,19,508,103,110,53,110,19,3,23,49,3,30,66,1952,61,126,187,87,231,106,18,3,24,99,99,58,98,63,45,5,43,18,3,37,84,75,36,3,42,84,112,75,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_dot_abapgit.clas.abap"],"names":[],"mappings":";;AAwHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;QAEQ,0DAAmB;IAEzB,IAAe,aAAuC;IAGtD,kCAAU,QAAW,YAAW;IAEhC,mEAA6D;IAC7D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb;IACF;;IAGA,kBAAc,OAAO;EAEvB;EAGA;;;;;QAEQ,u5DAAoD;IAG1D,OAAO,MAAC,qBAAkB,eAAE,MAAC,MAAK;IAClC,OAAO,MAAC,qBAAkB,wCAAO;IACjC,OAAO,MAAC,kBAAkB,wCAAyB,sCAAc,MAAC,OAAM;;IAM1E;;EAGA;;;IACE,iBAAU,OAAO;IACnB;;EAGA;;;;;;;QAEQ,yDAAmB;QACnB,u5DAAoD;IAG1D,YAAS,qFAAsD;IAE/D,aAAU,sCAAkB;;IAM9B;;EAGA;;;;;;;QAEQ,yDAAkB;IAExB,WAAS,MAAM;IAEf;;IAMA,yBAAG,OAAO,MAAC,cAAuB;MAChC,OAAO,MAAC,kBAAe,wCAAyB,sCAAc,MAAC,OAAM;IACvE;IAEF;;EAGA;;IACE,YAAU,YAAO;IACnB;;EAGA;;IACE,aAAW,YAAO,MAAC,aAAY;IACjC;;EAGA;;IACE,iBAAe,YAAO,MAAC,eAAc;IACvC;;EAGA;;IACE,gBAAc,YAAO,MAAC,gBAAe;IACvC;;EAGA;;IACE,oBAAkB,YAAO,MAAC,aAAY;IACxC;;EAGA;;IAEE,YAAY,MAAC,UAAW,wCAAyB,kCAAU;IAC3D,YAAY,MAAC,cAAW,wCAAyB,qCAAa;IAC9D,YAAY,MAAC,WAAW,sFAA2C;IAErE;;EAGA;;IACE,YAAU,YAAO,MAAC,gBAAe;IACnC;;EAGA;;IACE,wBAAsB,YAAO,MAAC,iBAAgB;IAChD;;EAGA;;;;;;QAEQ,0DAAuB;QACvB,8DAAuB;QACvB,yDAAuB;QACvB,4DAAuB;IAG7B,kCAAU,QAAW,YAAW;IAEhC,sCAAY,YAAO,MAAC,kBAAgB,+CAAS,WAAW;IAGxD,sCAAY,sCAAI,wCAAyB,gDAAmB,MAAM;IAClE,iBAAW,GAAR,SAAU,OAAM;MACjB;IACF;IACA,sCAAY,sCAAI,8CAA+B,6DAA0B,MAAM;IAC/E,iBAAW,GAAR,SAAU,OAAM;MACjB;IACF;;;MAIE,iBAAW,GAAR,SAAW,UAAS;QACrB,eAAa,sBAAS;QACtB;MACF;IACF;IAGA,iBAA2B,GAAxB,YAAO,MAAC,kBAAmB,qCAAI,kBAAgB,GAAR,SAAW,YAAW;MAC9D,eAAa,sBAAS;IACxB;IAEA,iBAAW,GAAR,SAAU,wCAAyB,uCAAc;MAClD,eAAa,uBAAU;IACzB;IAEF;;EAGA;;;;;QAEQ,0DAAmB;IAGzB,kCAAU,QAAW,YAAW;;EAIlC;EAGA;;QAEO,yDAAkB;IAEvB,YAAS,2CAAiB;IAE1B,aAAU,0FAAyD;IAErE;;EAGA;;;IACE,YAAO,MAAC,kBAAe,QAAQ;EACjC;EAGA;;;IACE,YAAO,MAAC,oBAAiB,YAAY;EACvC;EAGA;;;IACE,YAAO,MAAC,kBAAe,eAAe;EACxC;EAGA;;;IACE,YAAO,MAAC,qBAAkB,OAAO;EACnC;EAGA;;;IACE,YAAO,MAAC,sBAAmB,mBAAmB;EAChD;EAGA;;IACE,OAAO,MAAC,UAAW,wCAAyB,kCAAU;IACtD,OAAO,MAAC,cAAW,wCAAyB,qCAAa;IACzD,OAAO,MAAC,WAAW,uBAAY;IAC/B,OAAO,MAAC,WAAW,gFAA2C;IAChE;;EAGA;;;;;;;IAEE;;IAKA,YAAS,qEAAuC;IAEhD,gOAG+C;IAC/C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAErB;;EAGA;;;;;IAEE,iBAAU,GAAP,QAAU,4BAAc;MACzB,YAAO,MAAC,aAAU,MAAM;IAC1B;IAEA,WAAS,YAAO,MAAC,QAAO;IAE1B;;EAGA;;IACE,6BAA2B,YAAO,MAAC,sBAAqB;IAC1D;;EAGA;;;IACE,YAAO,MAAC,2BAAwB,wBAAwB;EAC1D;AACF","file":"zcl_abapgit_dot_abapgit.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_environment.clas.mjs":{"lineLengths":[53,36,31,32,51,62,199,182,184,228,17,42,22,102,27,106,31,107,32,3,29,64,16,3,37,102,56,64,105,60,106,9,184,133,135,41,17,22,44,74,74,61,13,16,20,9,7,90,25,7,191,140,97,11,200,149,266,43,19,24,46,63,15,18,22,11,9,179,52,9,308,25,7,61,106,84,25,7,57,320,238,25,7,49,106,82,78,15,83,58,23,116,61,20,22,13,11,9,41,25,7,70,106,79,75,9,42,25,7,59,106,47,13,195,143,217,164,96,21,237,51,18,20,11,9,25,7,61,106,74,15,197,145,221,168,104,23,110,57,20,22,13,11,9,37,25,7,61,107,88,66,28,9,131,26,7,66,589,118,119,392,13,202,151,181,45,21,26,48,81,65,17,20,24,13,11,94,11,78,92,95,98,87,11,15,204,153,184,47,23,28,50,83,67,19,22,26,15,13,96,13,81,94,97,100,90,13,45,11,66,126,256,55,155,45,11,9,74,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_environment.clas.abap"],"names":[],"mappings":";;AAuBA;;;;;;;;;;;;;;;;;;;;;;EAGE;;QAGI,+CAAwC;QACxC,uDAA0C;QAC1C,gGAAoC;QACpC,mDAAgC;QAChC,iGAAoC;;;;;;;;;;;;;;;;;MAUtC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QAEd;MACF;;;;;;;;;;;;;;;;;;QAeA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAyB,GAArB,UAAU,MAAC,YAAa,uCAAK;UAC/C,kBAAgB,sBAAS;QAC3B;QAMA,cAAY,gCACI,GAAd,eAAiB,qCAAI,iBACC,GAAtB,uBAAyB,sCAAK,iBACjB,GAAb,cAAgB,uBAAU,iBACZ,GAAd,eAAiB,uBAJP,CAIkB;QAEhC;;MAGA;;QACE,eAAY,2DAAgD;QAC9D;;MAGA;;QAEE;QAGF;;MAGA;;YACO,qEAAmC;QAExC,iBAAgB,GAAb,mBAAe,4BAAc;UAC9B;;YAGI,sBAAe,sBAAS;;;;;;;UAI5B;QACF;QACA,cAAY,iBAAY;QAC1B;;MAGA;;QACE,iBAAiB,GAAd,oBAAgB,4BAAc;UAC/B,wBAAgB,uCAA4B;QAC9C;QACA,cAAY,kBAAa;QAC3B;;MAGA;;QAKE,cAAY,uBAAU;QACtB;;;;;;;;;;;;QAMA;QACF;;MAGA;;QACE,iBAAY,GAAT,eAAW,4BAAc;UAC1B;;;;;;;;;;;;UAMA;QACF;QACA,cAAY,aAAQ;QACtB;;MAGA;;QAEE,gBAAa,8DAAyC;QACtD,iBAAc,GAAX,YAAa,uBAAS;UACvB;QACF;QAEA,gBAAa,yGAAuD;QAEtE;;MAEA;;YACO,yGAAwC;YACxC,0GAAyC;QAC9C,IAAc,6BAAkE;;;;;;;;;;;;;;;;UAYhF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UAEf;UACA,yBAAO,wCAAwC;;YAE7C,6BAA2B,MAAC,UAAO,oCAAG;YACtC,6BAA2B,MAAC,YAAS,qCAAI;YACzC,6BAA2B,MAAC,SAAM,6BAA6B;UACjE;;;;;;;;;;;;;;;;YAWA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YAEf;YACA,yBAAO,yCAAyC;;cAE9C,6BAA2B,MAAC,UAAO,oCAAG;cACtC,6BAA2B,MAAC,YAAS,qCAAI;cACzC,6BAA2B,MAAC,SAAM,8BAA8B;YAClE;YACF;;UAEA;;gBAGI,+OAC+C;;YAKjD,8BAA4B,gCAA+B,GAAxB,yBAAO,kBAAmB,gCAAjC,CAAoC;YAElE;;QAEF","file":"zcl_abapgit_environment.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_exit.clas.mjs":{"lineLengths":[53,29,24,32,44,55,222,236,17,42,22,44,3,29,64,16,3,24,43,3,31,123,73,81,163,171,5,57,11,92,95,92,76,19,116,16,18,9,7,5,79,19,3,59,49,70,50,73,49,70,112,82,52,79,67,11,234,19,219,16,18,9,7,5,3,57,71,71,73,67,11,133,19,219,16,18,9,7,5,44,35,5,23,3,46,103,67,11,100,19,219,16,18,9,7,5,22,3,51,287,61,67,11,102,19,219,16,18,9,7,5,3,61,49,70,116,106,67,11,168,19,219,16,18,9,7,5,3,51,49,70,73,76,67,11,138,19,219,16,18,9,7,5,3,50,49,70,72,73,67,11,135,19,219,16,18,9,7,5,3,63,473,67,67,11,118,19,219,16,18,9,7,5,3,63,266,61,67,11,114,19,219,16,18,9,7,5,3,46,102,70,120,58,813,61,67,11,137,19,219,16,18,9,7,5,3,52,121,66,58,67,11,116,19,219,16,18,9,7,5,21,3,60,288,180,76,288,67,67,11,158,19,219,16,18,9,7,5,42,31,5,21,3,57,1734,61,120,58,67,11,122,19,219,16,18,9,7,5,3,61,119,61,309,91,108,97,67,11,192,19,219,16,18,9,7,5,3,46,52,67,488,70,67,11,125,19,219,16,18,9,7,5,3,39,104,67,11,92,19,219,16,18,9,7,5,42,63,5,21,3,45,66,58,121,67,67,11,114,19,219,16,18,9,7,5,3,42,363,134,64,67,11,111,19,219,16,18,9,7,5,22,3,59,4404,76,1416,61,890,64,67,11,160,19,219,16,18,9,7,5,3,55,102,70,120,58,1416,61,67,11,146,19,219,16,18,9,7,5,3,54,809,70,122,64,133,61,67,11,147,19,219,16,18,9,7,5,3,51,123,61,67,11,100,19,219,16,18,9,7,5,3,51,4404,76,123,61,67,11,128,19,219,16,18,9,7,5,3,54,135,61,101,58,66,58,67,11,135,19,219,16,18,9,7,5,3,1,52,132,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/exits/zcl_abapgit_exit.clas.abap"],"names":[],"mappings":";;AAmBA;;;;;;;;;;;;;;;EAGE;;;;;QAEO,gEAAyB;IAE9B,kBAAgB,yDAAuB;IAEvC,iBAAyD,IAAtD,gHAAwD,uBAAS;MAElE,mKAAiE;IACnE;IAEA,yBAAG,yBAAkB;MACnB;;;;;;;;;;MAGA;IACF;;IAIF;;EAGA;;;;;;;;;;;IAEE,yBAAG,mCAAsB;MACvB;yOAQyC;;;;;;MAEzC;IACF;EAEF;EAGA;;;;IAEE,yBAAG,mCAAsB;MACvB;QACI,iBAAc,0GAA+C;;;;;;MAEjE;IACF;IAEA,yBAAG,YAAsB;MACvB,gBAAc,WAAW;IAC3B;IAEF;;EAGA;;IAEE,yBAAG,mCAAsB;MACvB;QACI,gBAAa,0EAA6B;;;;;;MAE9C;IACF;IAEF;;EAGA;;;IAEE,yBAAG,mCAAsB;MACvB;qGAC8D;;;;;;MAE9D;IACF;EAEF;EAGA;;;;;IAEE,yBAAG,mCAAsB;MACvB;uKAK2D;;;;;;MAE3D;IACF;EAEF;EAGA;;;;;IAEE,yBAAG,mCAAsB;MACvB;yIAKuC;;;;;;MAEvC;IACF;EAEF;EAGA;;;;;IAEE,yBAAG,mCAAsB;MACvB;sIAKqC;;;;;;MAErC;IACF;EAEF;EAGA;;;IAEE,yBAAG,mCAAsB;MACvB;qHAC8E;;;;;;MAE9E;IACF;EAEF;EAGA;;;IAEE,yBAAG,mCAAsB;MACvB;iHAC0E;;;;;;MAE1E;IACF;EAEF;EAGA;;;;;;;IAEE,yBAAG,mCAAsB;MACvB;wIAM+B;;;;;;MAE/B;IACF;EAEF;EAGA;;;;IAEE,yBAAG,mCAAsB;MACvB;QACI,eAAY,2FAAqC;;;;;;MAErD;IACF;IAEF;;EAGA;;;;;;IAQE,yBAAG,mCAAsB;MACvB;QACI,eAAY,qIAEgB;;;;;;MAEhC;IACF;IAEA,yBAAG,UAAoB;MACrB,cAAY,SAAS;IACvB;IAEF;;EAGA;;;;;IAEE,yBAAG,mCAAsB;MACvB;yHAEwD;;;;;;MAExD;IACF;EAEF;EAGA;;;;;;;IAEE,yBAAG,mCAAsB;MACvB;+LAMqD;;;;;;MAErD;IACF;EAEF;EAGA;;;;;IAEE,yBAAG,mCAAsB;MACvB;4HAKmC;;;;;;MAEnC;IACF;EAEF;EAGA;;IAEE,yBAAG,mCAAsB;MACvB;QACI,eAAY,mEAAsB;;;;;;MAEtC;IACF;IAEA,yBAAG,UAAoB;MACrB,cAAY,yCAAQ;IACtB;IAEF;;EAGA;;;;;IAEE,yBAAG,mCAAsB;MACvB;iHAG6B;;;;;;MAE7B;IACF;EAEF;EAGA;;;;IAEE,yBAAG,mCAAsB;MACvB;QACI,gBAAa,qFAA6B;;;;;;MAE9C;IACF;IAEF;;EAGA;;;;;;;IAEE,yBAAG,mCAAsB;MACvB;+JAMkC;;;;;;MAElC;IACF;EAEF;EAGA;;;;;;;IAEE,yBAAG,mCAAsB;MACvB;iJAM+B;;;;;;MAE/B;IACF;EAEF;EAGA;;;;;;;IAEE,yBAAG,mCAAsB;MACvB;kJAI4B;;;;;;MAE5B;IACF;EAEF;EAGA;;;IAEE,yBAAG,mCAAsB;MACvB;mGACyC;;;;;;MAEzC;IACF;EAEF;EAGA;;;;;IAEE,yBAAG,mCAAsB;MACvB;+HAG8B;;;;;;MAE9B;IACF;EAEF;EACA;;;;;;;IACE,yBAAG,mCAAsB;MACvB;sIAIwB;;;;;;MAExB;IACF;EACF;AACF","file":"zcl_abapgit_exit.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_factory.clas.mjs":{"lineLengths":[53,32,27,32,47,37,224,633,658,221,209,221,214,218,215,227,219,235,383,395,235,225,241,233,237,233,245,234,17,42,22,49,61,67,61,53,61,55,59,57,65,59,3,29,64,16,3,35,57,3,42,153,102,70,352,384,88,39,71,74,27,47,88,54,140,144,5,64,29,3,23,45,3,30,132,63,107,5,51,22,3,27,49,3,34,144,67,115,5,59,26,3,26,48,3,33,141,76,59,12,81,5,25,3,25,47,3,32,138,64,110,5,54,24,3,25,47,3,32,138,65,111,5,55,24,3,29,51,3,36,146,69,119,5,59,24,3,32,54,3,39,144,102,70,335,367,85,36,71,74,27,47,88,51,134,135,5,58,26,3,26,48,3,33,137,66,113,5,53,21,3,27,49,3,34,138,67,115,5,53,20,3,21,43,3,28,126,61,103,5,47,20,3,1,58,138,568,593,156,144,156,149,153,150,162,153,347,569,369,599,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/zcl_abapgit_factory.clas.abap"],"names":[],"mappings":";;AAiFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,uVAAgD;IACtD,IAAe,qBAA+C;IAE9D;;;;;6CACqC;IACrC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,iBAAiB,MAAC,aAAU,UAAU;;MAMtC,uIAEoC;IAEtC;IAEA,sBAAoB,qBAAmB,MAAC,SAAQ;IAElD;;EAGA;;;;;IACE,yBAAG,+BAAuB;;IAE1B;IAEA,eAAa,8BAAU;IACzB;;EAGA;;;;;IACE,yBAAG,mCAA2B;;IAE9B;IACA,mBAAiB,kCAAc;IACjC;;EAGA;;;;;IAEE,yBAAG,4CAAsB;MACvB,kBAAgB,iCAAa;IAC/B;MACE,mBAAgB,sDAAiC;IACnD;IAEF;;EAGA;;;;;IAEE,yBAAG,gCAAwB;;IAE3B;IACA,iBAAe,+BAAW;IAE5B;;EAGA;;;;;IAEE,yBAAG,iCAAyB;;IAE5B;IACA,iBAAe,gCAAY;IAE7B;;EAGA;;;;;IAEE,yBAAG,qCAA6B;;IAEhC;IAEA,iBAAe,oCAAgB;IAEjC;;EAGA;;;;;;;QAEQ,sUAAkC;IACxC,IAAe,kBAAoC;IAEnD;;;;;6CAC6D;IAC7D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MAEd,cAAc,MAAC,aAAU,UAAU;;MAKnC,8HAEiC;IAEnC;IAEA,mBAAiB,kBAAgB,MAAC,SAAQ;IAE5C;;EAGA;;;;;IAEE,yBAAG,kCAA0B;;IAE7B;IAEA,cAAY,iCAAa;IAE3B;;EAGA;;;;;IAEE,yBAAG,mCAAyB;;IAG5B;IAEA,aAAW,kCAAc;IAE3B;;EAGA;;;;;IAEE,yBAAG,6BAAmB;;IAEtB;IAEA,aAAW,4BAAQ;IAErB;;AACF","file":"zcl_abapgit_factory.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_field_rules.clas.mjs":{"lineLengths":[53,36,31,32,51,62,717,767,444,228,17,42,22,620,123,3,29,64,16,3,18,44,3,25,139,88,21,3,27,105,61,102,70,47,61,28,125,48,132,48,137,49,132,48,134,48,135,31,5,3,44,137,98,64,102,64,110,76,389,40,42,46,73,25,19,3,58,98,64,123,58,389,78,79,45,13,5,66,36,175,31,112,92,46,9,7,5,3,57,98,64,102,70,123,58,389,78,79,45,13,5,66,36,175,31,112,92,116,9,7,5,3,1,66,705,81,81,86,81,83,84,405,636,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/rules/zcl_abapgit_field_rules.clas.abap"],"names":[],"mappings":";;AAiCA;;;;;;;;;;;;;;;;;;EAGE;;;;;;IAEA;;EAGA;;;;;;;IACE,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,KAXG,OAAL;;MAEI,aAAW,eAAE,MAAC,MAAK;;MAEnB,aAAW,eAAE,MAAC,MAAK;;MAEnB,yCAA6B;;MAE7B,aAAW,eAAE,MAAC,MAAK;;MAEnB,aAAW,eAAE,MAAC,MAAK;;MAEnB,aAAW,UAAU;;EAE3B;EAGA;;;;;;;;QACO,4XAAoB;IAEzB,OAAO,MAAC,aAAY,QAAQ;IAC5B,OAAO,MAAC,eAAY,QAAQ;IAC5B,OAAO,MAAC,eAAY,YAAY;IAChC,kEAAiC;IAEjC,YAAU,OAAE;IACd;;EAGA;;;;;QACO,4XAAoB;IAEzB,IAAc,WAAkB;IAChC,IAAc,YAAmB;IAEjC,yBAAG,aAAkB;MACnB;IACF;;;;;QAII,qGAAuE;QACvE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,sBAAM,YAAU;QAClB;MACF;IACF;EACF;EAGA;;;;;;;QACO,4XAAoB;IAEzB,IAAc,WAAkB;IAChC,IAAc,YAAmB;IAEjC,yBAAG,aAAkB;MACnB;IACF;;;;;QAII,qGAAuE;QACvE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;mHAMgB;QAC/B;MACF;IACF;EACF;AACF","file":"zcl_abapgit_field_rules.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_deserialize.clas.mjs":{"lineLengths":[53,41,36,32,56,37,25,3057,3028,2323,1778,17,42,22,3,29,64,16,3,44,75,3,51,1365,1365,70,120,58,1365,1087,597,64,31,49,33,95,107,150,5,128,130,95,71,36,50,65,147,160,31,103,92,62,63,63,265,77,9,7,5,112,130,71,36,124,19,9,60,61,61,223,7,114,5,224,192,130,95,71,36,50,65,147,160,31,103,92,77,9,7,5,183,173,105,22,3,28,59,3,35,1365,119,61,120,58,1365,167,92,22,3,37,68,3,44,816,1365,70,597,1089,69,38,62,63,63,71,5,20,3,33,64,3,40,1365,120,58,1365,70,816,597,819,600,1057,132,78,106,67,29,41,45,80,34,153,87,34,297,87,34,153,87,34,225,87,34,153,87,34,153,158,34,297,87,34,153,87,34,153,87,34,153,87,34,153,87,34,441,87,34,153,87,34,153,87,34,225,87,34,153,7,72,34,77,7,5,59,22,92,51,69,63,24,141,154,29,97,108,70,5,50,22,3,1,76,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_file_deserialize.clas.abap"],"names":[],"mappings":";;AAuCA;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;QAEO,40CAA0B;QAC1B,sjCAAyD;QACzD,4kBAAgD;QAChD,uDAAwB;IAE7B,eAAa,UAAU;IAGvB,yBAAG,iBAAe;MAChB,eAAa,UAAU;MACvB;;;IAKF;;IAKA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,yBAAI,iBAAe;MACjC;;;QAEE,aAAW,eAAE,MAAC,MAAK;QACnB;;;;qGAE0D;QAC1D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UAEd,OAAO,MAAC,cAAW,SAAS,OAAE,OAAO;UACrC,OAAO,MAAC,cAAW,SAAS,OAAE,QAAQ;UACtC,OAAO,MAAC,cAAW,SAAS,OAAE,QAAQ;wQAGjB;;QAGvB;MACF;IACF;;IAKA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,yBAAI,iBAAe;;;QAI/B,2BAAM,SAAS,OAAE,SAAoB,yBAAI,SAAS,OAAE;mBAAuB;;QAC3E,OAAO,MAAC,cAAW,SAAS,OAAE,OAAO;QACrC,OAAO,MAAC,cAAW,SAAS,OAAE,QAAQ;QACtC,OAAO,MAAC,cAAW,SAAS,OAAE,QAAQ;8NAGjB;MACvB;;IAEF;;;IAOA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,yBAAI,iBAAe;MACjC;;;QAEE,aAAW,eAAE,MAAC,MAAK;QACnB;;;;qGAE0D;QAC1D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;QAIhB;MACF;IACF;;IAKA;;IAOF;;EAGA;;;;;;;;;QAEO,40CAAsD;IAE3D,gBAAa,iJAEU;IAEvB,gBAAa,sEAEc;IAE7B;;EAGA;;;;;;;QAEO,4kBAA6B;IAClC,IAAe,aAAmD;;;MAGhE,OAAO,MAAC,cAAW,aAAW,MAAC,QAAO;MACtC,OAAO,MAAC,cAAW,aAAW,MAAC,SAAQ;MACvC,OAAO,MAAC,cAAW,aAAW,MAAC,SAAQ;MACvC,8DAAkC;IACpC;IAEF;;EAGA;;;;;;;;;QAEO,uyBAAqD;QACrD,4kBAAiC;QACjC,0yBAAqD;QACrD,+kBAAoC;QACpC,whCAAmC;QACnC,2HAA8C;IAEnD,cAAW,0DAAkC;;;;MAK3C,sBAAM,WAAW;MASjB,IACE,OAGA,AAKA,AAGA,AAIA,AAGA,AAGA,AAKA,AAGA,AAGA,AAGA,AAGA,AAOA,AAGA,AAGA,AAGA,KAvDG,OAAO,MAAC,SAAb;;QAEI,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAKtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAItB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAKtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAOtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;QAGtB,gBAAc,QAAQ;;;;;4EAQH;MACvB;IACF;IAEA,oBAAgC,IAA1B,sCAA4B;;;;MAChC,aAAU,gDAA4B;MACtC;;;;;+FAE6B;MAC7B,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,gCAAO,mBAAa,UAAU;IAChC;;IAEF;;AACF","file":"zcl_abapgit_file_deserialize.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_status.clas.mjs":{"lineLengths":[58,53,36,31,32,51,37,205,210,4568,5414,1853,5446,3644,2387,3292,390,1855,2908,1772,373,17,42,22,108,133,3,31,57,3,38,1057,1193,64,510,67,668,64,428,69,69,68,71,69,69,61,69,121,73,23,5,59,24,155,168,27,111,88,84,123,7,74,123,7,12,121,121,5,21,3,32,58,3,39,1057,1193,64,69,69,68,71,69,69,61,69,55,116,21,3,33,1057,510,67,835,76,672,76,597,428,51,59,55,116,214,58,139,152,27,95,88,59,59,58,65,64,64,137,150,29,93,90,76,60,56,16,125,9,124,61,124,9,7,12,112,5,21,3,33,1365,1416,64,890,67,661,76,890,816,838,676,102,29,149,107,85,54,103,34,173,137,22,3,47,73,3,54,1193,64,510,67,53,123,345,14,334,7,5,3,29,107,85,132,58,46,28,16,3,29,55,3,36,657,1416,64,661,76,457,1225,100,69,39,54,81,7,12,33,5,20,3,35,61,3,42,103,52,67,55,73,99,140,178,208,31,105,111,33,7,5,23,3,30,902,103,816,61,597,102,103,107,295,542,80,38,270,121,17,7,140,132,71,184,53,9,131,93,30,66,176,56,9,7,66,5,3,30,1416,64,672,76,890,64,816,61,1365,67,542,1089,457,1225,67,37,194,17,7,241,84,7,55,64,33,165,178,29,121,90,102,131,56,14,82,61,35,104,107,31,80,173,67,99,74,169,182,33,125,94,95,134,20,133,13,130,11,9,7,5,3,31,1416,64,902,103,672,76,835,76,1365,67,542,1089,1225,80,38,55,139,66,103,106,29,79,198,63,126,128,92,67,9,14,185,160,31,103,92,65,128,9,7,5,3,23,49,3,30,1365,119,61,120,58,1416,890,123,137,195,91,96,52,5,118,73,165,227,239,49,274,136,5,22,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_file_status.clas.abap"],"names":[],"mappings":";;;AA4GA;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;QAEO,maAAiC;IAGtC,SAAS,MAAC,cAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAC5C,SAAS,MAAC,cAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAC5C,SAAS,MAAC,aAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAC5C,SAAS,MAAC,eAAY,QAAQ,MAAC,KAAI,MAAC,UAAS;IAC7C,SAAS,MAAC,cAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAC5C,SAAS,MAAC,cAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAG5C,SAAS,MAAC,UAAW,QAAQ,MAAC,KAAI,MAAC,KAAI;IACvC,SAAS,MAAC,cAAW,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAE3C,SAAS,MAAC,WAAW,gCAA0B,GAAnB,QAAQ,MAAC,KAAI,MAAC,OAAO,SAAS,MAAC,MAAtC,CAA4C;IACjE,iBAAmB,GAAhB,SAAS,MAAC,QAAQ,uBAAS;MAC5B;IACF;IAGA;;;;;6GAIe;IAEf,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,iBAAoB,GAAjB,WAAW,MAAC,OAAQ,QAAQ,MAAC,KAAI,MAAC,MAAI;QACvC,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,SAAQ;MAC9D;MACA,iBAAoB,GAAjB,WAAW,MAAC,OAAQ,SAAS,MAAC,MAAI;QACnC,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,SAAQ;MAC9D;IACF;MAKE,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,SAAQ;MAC5D,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,SAAQ;IAC9D;IAEF;;EAGA;;;;;;;IAGE,SAAS,MAAC,cAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAC5C,SAAS,MAAC,cAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAC5C,SAAS,MAAC,aAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAC5C,SAAS,MAAC,eAAY,QAAQ,MAAC,KAAI,MAAC,UAAS;IAC7C,SAAS,MAAC,cAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAC5C,SAAS,MAAC,cAAY,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAG5C,SAAS,MAAC,UAAW,QAAQ,MAAC,KAAI,MAAC,KAAI;IACvC,SAAS,MAAC,cAAW,QAAQ,MAAC,KAAI,MAAC,SAAQ;IAG3C,SAAS,MAAC,WAAW,uBAAU;IAC/B,SAAS,MAAC,YAAW,wCAAyB,+BAAO,MAAC,MAAK;IAE7D;;EAGA;;;;;;;;QAEO,4kBAAqC;QACrC,maAAqC;IAG1C,SAAS,MAAC,UAAW,SAAS,MAAC,KAAI;IACnC,SAAS,MAAC,cAAW,SAAS,MAAC,SAAQ;IACvC,SAAS,MAAC,WAAW,uBAAU;IAC/B,SAAS,MAAC,YAAW,wCAAyB,+BAAO,MAAC,MAAK;qNAShC;IAG3B;;;;6FAG+B;IAE/B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAGb,SAAS,MAAC,cAAY,OAAO,MAAC,SAAQ;MACtC,SAAS,MAAC,cAAY,OAAO,MAAC,SAAQ;MACtC,SAAS,MAAC,aAAY,OAAO,MAAC,SAAQ;MACtC,SAAS,MAAC,eAAY,eAAE,MAAC,MAAK;MAC9B,SAAS,MAAC,cAAY,eAAE,MAAC,MAAK;MAE9B;;;;2FAGiC;MAIjC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,iBAAoB,GAAjB,WAAW,MAAC,OAAO,SAAS,MAAC,MAAI;UAClC,SAAS,MAAC,WAAQ,sBAAS;UAC3B,sBAAM,SAAS,MAAC,OAAM;QACxB;UACE,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,SAAQ;QAC9D;QAIA,yBAAG,OAAO,MAAC,UAAoB,iBAAoB,GAAjB,OAAO,MAAC,WAAW,qBAAe;UAClE,SAAS,MAAC,WAAS,uBAAU;UAC7B,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;QAC7D;MACF;IAEF;MACE,oCAAS,GAAF,iCAAI,gCAAC;IACd;IAEF;;EAGA;;;;;;;;QAGI,i3BAA+B;QAC/B,uyBAA0D;QAC1D,6zBAA0D;QAC1D,2pBAAwE;IAE1E,sBAAmB,0EAEQ;IAC3B,cAAmB,SAAS;oJAUG;;oFAUO;IAGtC;;IAEA,oBAAkB,QAAQ;4KAUc;IAExC;IAMF;;EAGA;;;;;;;;IACE,yBAAG,SAAS,MAAC,MAAe;MAC1B,iBAA0B,GAAvB,QAAQ,MAAC,KAAI,MAAC,WAAW,2CAA4B,eAAc;wVAGvB;MAC/C;6UAGwC;MACxC;IACF;EACF;EAGA;;;;;IACE,yBAAkB,eAAe;IACjC,gBAAkB,MAAM;IAC1B;;EAGA;;;;;;;;;IAEE,IAAc,YAAgC;IAC9C,IAAc,YAAgC;IAE9C,iBAAyB,GAAtB,yBAAO,gBAAiB,gCAAC;;;;QAKxB,kCAAmB,YAAU,MAAC,OAAQ,YAAU;MAClD;IACF;MACE,aAAW,YAAY;IACzB;IAEF;;EAGA;;;;;;;;;QACQ,0FAAwB;QACxB,mIAA8C;IAEpD,iBAAc,2JAEe;IAC7B,yBAAG,YAAuB,iBAAc,GAAV,WAAY,wCAAO,iBAAmB,GAAf,oCAAiB,qCAAG;MAEvE,YAAU,WAAW;MACrB,gBAAa,iFAA+C;MAC5D,iBAAyB,IAAtB,0DAAwB,uBAAS;QAClC,gBAAc,OAAO;MACvB;IACF;IACF;;EAGA;;;;;QAGI,4kBAAqC;QACrC,6FAA8B;QAC9B,8FAA8B;QAC9B,kGAA8B;QAC9B,8RAAwE;IAE1E,IAAc,aAA8C;;;6QAa5B;MAE9B,mBAAgB,GAAV,WAAY,uBAAU,iBAAc,GAAX,YAAa;iBAAS;;MAErD,OAAO,MAAC,eAAW,wGAEe;MAElC,yBAAG,OAAO,MAAC,oBAAwB,iBAAoB,GAAhB,sBAAmB,OAAO,MAAC,UAAQ;QACxE,iBAAkB,GAAf,gBAAiB,wBAAU;UAC5B,qBAAkB,uJAA4E;UAC9F,mBAAkB,sBAAS;QAC7B;QAGA;;;gEACwC;QACxC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAqB,GAAjB,OAAO,MAAC,WAAW,wCAAM;UAC5C,sBAAM,OAAO,MAAC,SAAQ;QACxB;MACF;MAEA,gCAAO,iBAAW,QAAQ;IAC5B;EAEF;EAGA;;;;;;;;;;;IAEE,IACE,aAAkC;IADpC,IAEE,aAAmC;IAFrC,IAGE,YAAqC;IAHvC,IAIE,YAAiC;;;MAIjC,mBAE2C,IAFrC,yIAEuC;iBAAU;;MAEvD,yBAAG,YAAU,MAAC,gBACZ,iBAAmF,IAA/E,iIAAiF,uBAAS;QAE9F,gCAAO,YAAU,MAAC,eAAQ,QAAQ;MACpC;;MAKA;;;;;uHAIuC;MACvC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;qGAGc;QAC3B,mBAAc,sGAGc;QAC5B,sBAAM,aAAW,MAAC,KAAI;MACxB;QACE,mBAAc,qDAA6B;QAE3C;;;;;8EAEgD;QAChD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAyB,GAArB,YAAU,MAAC,KAAI,MAAC,OAAO,aAAW,MAAC,MAAI;UAEzD,aAAW,MAAC,cAAW,sBAAS;QAClC,wBAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;UAEjB;;;;2HAGuC;UACvC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb,iBAAwB,GAArB,YAAU,MAAC,KAAI,MAAC,OAAO,YAAU,MAAC,MAAI;cACvC,aAAW,MAAC,YAAS,wCAAyB,+BAAO,MAAC,UAAS;YACjE;cACE,aAAW,MAAC,YAAS,wCAAyB,+BAAO,MAAC,SAAQ;YAChE;YACA,aAAW,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;UAC/D;QACF;MACF;IACF;EAEF;EAGA;;;;;;;;;;;IAEE,IACE,aAA8C;IADhD,IAEE,aAAmC;IAFrC,IAGE,YAAiC;;;;MAMjC,mBAAc,gHAGiB;MAG/B;;;;6EAC+C;MAC/C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAyB,GAArB,aAAW,MAAC,WAAY,2CAA4B,eAAc;QACpF,aAAW,MAAC,WAAQ,uBAAU;QAC9B,aAAW,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;QAC7D,aAAW,MAAC,YAAS,wCAAyB,+BAAO,MAAC,UAAS;QAC/D,iBAAwB,GAArB,YAAU,MAAC,KAAI,MAAC,OAAO,aAAW,MAAC,MAAI;UACxC,aAAW,MAAC,cAAW,sBAAS;QAClC;MACF;QAEE;;;qGAGmC;QACnC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,aAAW,MAAC,WAAS,uBAAU;UAC/B,aAAW,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;QAC/D;MACF;IACF;EAEF;EAGA;;;;;;;;;QAEO,+3CAAuD;QACvD,i3BAAuD;QACvD,kHAAoC;QACpC,gIAA+C;QAC/C,0LAA+D;IAEpE,cAAW,uEAA2C;IAEtD,iBAAqB,GAAlB,yBAAO,YAAc,gCAAC;mDAKY;IACrC;IAEA,eAAY,iGAAwD;IAEpE,aAAU,sDAAiC;oKAMhB;;IAO3B,gBAAa,yNAGuE;IAEpF,yBAAG,iBAAe;;uIAMqD;IACvE;IAEF;;AACF","file":"zcl_abapgit_file_status.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_status.clas.locals.mjs":{"lineLengths":[53,47,37,32,86,37,205,209,198,1483,1465,1610,1777,1467,1609,372,1618,17,42,22,108,133,121,3,29,107,85,132,58,46,28,16,3,27,120,1365,70,82,60,60,97,113,62,96,28,18,3,35,1365,70,597,1366,1366,1089,1093,32,94,249,38,158,62,75,75,67,66,7,5,321,38,64,37,153,166,29,109,165,322,7,5,3,37,1365,70,1366,424,1089,32,70,276,38,146,194,7,63,245,7,64,5,3,32,1365,70,107,85,146,106,285,111,1089,69,38,163,90,189,59,7,168,90,189,59,7,5,86,71,34,59,55,7,144,273,156,201,7,5,119,292,5,3,37,1365,70,132,58,98,58,67,69,143,1089,89,290,38,140,166,42,217,70,181,7,5,3,35,1365,70,1366,1089,1094,409,38,64,153,166,29,109,90,309,63,76,76,68,7,5,3,42,1365,70,98,58,66,1089,290,38,263,631,78,7,5,3,1,107,39,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_file_status.clas.locals_imp.abap"],"names":[],"mappings":";;AA2DA;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;IACE,yBAAkB,eAAe;IACjC,gBAAkB,MAAM;IAC1B;;EAEA;;;;;2DAKkC;2DAGA;gGAKA;gHAMA;6DAGE;+FAKG;IAErC,WAAS,WAAM;IAEjB;;EAEA;;;QAGI,4kBAAiD;QACjD,60CAA2B;QAC3B,60CAA2B;IAE7B,IACE,aAAuC;IADzC,IAEE,iBAAuC;IAOzC,gBAAc,UAAU;IACxB;;;MAIE,IAAG,CAAI,cAAuB,GAArB,aAAW,MAAC,WAAW,OAAO,MAAC,UACpC,iBAAyB,GAArB,aAAW,MAAC,WAAW,OAAO,MAAC,UAAS,CAAC;;QAE/C,iBAAe,MAAC,cAAW,aAAW,MAAC,SAAQ;QAC/C,iBAAe,MAAC,cAAW,aAAW,MAAC,SAAQ;QAC/C,iBAAe,MAAC,UAAW,aAAW,MAAC,KAAI;QAC3C,kCAAmB,eAAe,OAAO;MAC3C;IAEF;;;MAKE;;;;;2GAEe;MAEf,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAoB,GAAjB,aAAW,MAAC,OAAQ,iBAAe,MAAC,MAAI;iUAEhB;MAC5C;IAEF;EAEF;EAEA;;;QAGI,60CAA2B;QAC3B,+ZAA+D;IAEjE,IAAc,aAAmC;IAEjD,gBAAc,UAAU;IACxB;;;MAGE,yBAAG,aAAW,MAAC,oBAAwB,iBAAyB,GAArB,aAAW,MAAC,WAAW,OAAO,MAAC,UAAQ;iMACI;MACtF;MAEA,yBAAG,aAAW,MAAC,UAAmB;oPACuE;MACzG;MAEA,kCAAmB,eAAe,OAAO;IAC3C;EAEF;EAGA;;;;;QAGI,yIAAwD;QACxD,iGAAiC;QACjC,oRAA0C;QAC1C,sGAAiC;IAEnC,IAAc,aAAmC;;;;MAK/C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,uCAAe,2DAAO,4BAAU,eAAkB,sCAAG;gCAC7C,aAAkB;MAC5B;;MAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,uCAAe,2DAAO,4BAAU,eAAkB,sCAAG;gCAC7C,aAAkB;MAC5B;IACF;IAEA,kBAAe,8DAAyC;;;MAGtD,iBAAmB,GAAhB,iBAAmB,aAAY;QAChC,uBAAqB,sBAAS;MAChC;MAEA,iBAAwC,IAArC,0FAAuC,wBAAU;gRAEQ;MAC5D,wBAAiD,IAA1C,+FAA4C,wBAAU;wMACwC;MACrG;IACF;IAEA,yBAAG,uBAA4B,iBAAuB,GAAnB,oBAAqB,wBAAU;mSAEP;IAC3D;EAEF;EAGA;;;;;;;QAGI,0DAA2B;QAC3B,4DAA2B;QAC3B,sIAAoD;IAEtD,IAAc,aAAmC;IAEjD,qBAAkB,8DAAyC;;;MAKzD,aAAU,uHAG0B;MAEpC,8JAA+D;MAE/D,yBAAG,QAAkB;wNACwE;MAC7F,wBAAe,GAAR,SAAW,aAAW,MAAC,MAAI;oLAC+C;MACjF;IAEF;EAEF;EAGA;;;QAEO,60CAA2B;IAEhC,IACE,aAAwC;IAD1C,IAEE,kBAAwC;;;MAOxC;;;;2GAIe;MACf,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oTAE6C;;QAE3D,kBAAgB,MAAC,cAAW,aAAW,MAAC,SAAQ;QAChD,kBAAgB,MAAC,cAAW,aAAW,MAAC,SAAQ;QAChD,kBAAgB,MAAC,UAAW,aAAW,MAAC,KAAI;MAC9C;IAEF;EAEF;EAGA;;;;;QAEO,yDAAkB;IAEvB,IAAc,aAAmC;;;MAK/C,iBAAiF,IAA9E,kNAAgF,uBAAS;QAO1F,6mBAG+B;6EACF;MAC/B;IAEF;EAEF;AAEF","file":"zcl_abapgit_file_status.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_filename_logic.clas.mjs":{"lineLengths":[53,39,34,32,54,37,245,377,203,263,247,1233,812,561,314,1511,997,17,42,22,70,68,62,3,29,64,16,3,38,67,3,45,67,61,66,58,102,64,103,67,241,239,3,31,60,3,38,71,73,67,61,103,73,132,58,597,58,102,64,103,67,67,67,66,156,144,144,143,122,241,146,146,5,64,35,40,40,143,119,3,39,68,3,46,99,71,73,99,100,67,67,66,156,113,136,18,3,39,68,3,46,71,73,67,61,102,70,132,58,597,58,104,9,122,187,135,231,178,193,17,120,14,16,7,5,3,39,68,3,46,597,61,71,70,104,9,122,187,135,231,178,138,17,120,14,16,7,5,3,28,57,3,35,67,45,58,25,142,142,142,142,142,142,142,19,3,30,59,3,37,67,45,58,106,19,3,31,60,3,38,71,597,61,66,58,46,61,71,74,113,41,142,12,190,5,49,126,5,9,86,17,106,14,16,7,5,122,197,119,77,145,145,7,12,150,5,52,23,3,1,72,166,319,72,62,69,62,69,144,67,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_filename_logic.clas.abap"],"names":[],"mappings":";;AAiGA;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;;IAEE,cAAa,gCAAc,GAAP,QAAS,4BAAU,yCAAc,MAAC,aAAY,iBAAsB,GAAlB,0BAAQ,WAAY,gCAA7E,CAAgF;IAC7F,eAAa,gCAAc,GAAP,QAAS,4BAAU,sCAAW,MAAC,aAAY,iBAAsB,GAAlB,0BAAQ,WAAY,gCAA1E,CAA6E;EAE5F;EAGA;;;;;;;;;;;;;;;;;;QAGI,0DAAmB;QACnB,0DAAmB;QACnB,yDAAmB;IAGrB;IAGA,yIAAkD;IAClD,yIAAkD;IAClD,wIAAiD;;IAKjD,iBAA8D,IAA3D,8LAA6D,uBAAS;MACvE,yIAAkD;MAClD,yIAAkD;IACpD;IAGA,aAAU,6CAAwB;IAElC,sBAAM,OAAO;IACb,OAAO,MAAC,cAAW,OAAO;IAC1B,OAAO,MAAC,cAAW,OAAO;8IAUC;sHAQE;EAE/B;EAGA;;;;;;;QAGI,0FAAsB;QACtB,2FAAsB;QACtB,0DAAmB;QACnB,0DAAmB;QACnB,yDAAmB;IAErB;gHAQ0B;IAE1B,WAAS,gCAAe,GAAR,SAAU,uBAAU,iBAAU,GAAP,QAAS,uBAAvC,CAAkD;IAE7D;;EAGA;;;;;;;;;;;;;;QAEO,+FAAwB;IAO7B;MACI,mCAAW,wDAAyB,OAAO,MAAC,UAAQ;;;;;;;;;;;IAWxD;EAEF;EAGA;;;;;;;;QAEO,+FAAwB;IAO7B;MACI,mCAAW,wDAAyB,OAAO,MAAC,UAAQ;;;;;;;;;;;IAQxD;EAEF;EAGA;;;;;;;IAKE,YAAU,OAAO;IACjB,uIAAoD;IACpD,uIAAoD;IACpD,uIAAoD;IACpD,uIAAoD;IACpD,uIAAoD;IACpD,uIAAoD;IACpD,uIAAoD;IACtD;;EAGA;;;;;;;IAEE,aAAU,uFAAwC;IACpD;;EAGA;;;;;;;;;;;QAEO,8DAAuB;QACvB,iEAA0B;IAG/B,iBAAc,6BAAU,6DAAiC;IAEzD,yBAAG,SAAmB;MACpB,sCAAY,aAAY,sCAAI,OAAO,MAAC,oBAAc,WAAW;IAC/D;MACE,sCAAY,aAAY,sCAAI,OAAO,MAAC,WAAS,sCAAI,mBAAc,WAAW;IAC5E;IAEA,yBAAG,iBAAqB;MACtB,sCAAY,aAAY,sCAAI,iBAAY,WAAW;IACrD;IAGA;qFAKmC;;;;;;IAEnC;;IAKA,iBAAiE,IAA9D,kJAAgE,uBAAS;;MAE1E,iBAAkB,GAAf,gBAAiB,gCAAC;QACnB,sIAAuD;QACvD,sIAAmC;MACrC;IACF;MACE,6IAAsD;IACxD;IAEA;IAEF;;AACF","file":"zcl_abapgit_filename_logic.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_folder_logic.clas.mjs":{"lineLengths":[53,37,32,32,52,37,735,706,491,616,772,234,17,42,22,638,629,3,29,64,16,3,24,51,3,31,139,91,23,3,27,101,98,58,102,70,397,56,174,5,121,75,27,48,88,23,5,65,22,72,75,27,48,88,159,47,46,79,12,46,5,21,3,32,67,98,58,132,58,102,70,62,67,70,55,75,46,62,12,89,56,69,40,132,54,105,56,11,141,62,85,287,85,11,140,57,80,286,85,11,16,169,9,60,100,224,9,100,54,9,100,224,9,49,52,112,109,83,7,5,19,3,32,102,98,58,132,58,67,61,116,109,127,65,101,1035,66,67,76,75,303,92,74,24,5,56,26,27,75,97,141,14,46,43,66,159,7,5,83,59,22,76,51,116,67,38,130,37,58,99,132,9,139,132,138,128,14,167,7,59,108,192,7,39,76,76,79,28,52,90,184,14,91,7,255,166,7,32,5,50,22,3,1,68,421,655,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_folder_logic.clas.abap"],"names":[],"mappings":";;AAsDA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;IAEA;;EAGA;;;;;;QACQ,oYAAgC;IAGtC,yBAAG,wBAA6B;MAC9B,6BAAqB,yIAAmE;IAC1F;IAEA;;;8CAAmF;IACnF,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IAGA;;;;;8CACsC;IACtC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,eAAY,wIAAkE;MAC9E,SAAS,MAAC,cAAW,UAAU;MAC/B,SAAS,MAAC,cAAW,SAAS;MAC9B,sEAAqC;IACvC;MACE,cAAY,SAAS,MAAC,SAAQ;IAChC;IACF;;EAGA;;;;;;;;QAEQ,qDAAsB;QACtB,0DAA2B;QAC3B,6DAA2B;QAC3B,8CAAmC;QACnC,kEAA2B;IAEjC,iBAAU,GAAP,QAAS,WAAU;MACpB,aAAU,yCAA8B;IAC1C;MACE,iBAAc,gEAEa;MAI3B,yBAAG,sBAA0B;QAC3B,qBAAkB,sCAA2B;QAC7C,IACE,OAKA,AAWA,KAjBG,eAAL;;UAEI,WAAS,+BAAC;UACV,iBAAiB,GAAd,mCAAgB,qCAAG;YACpB,WAAS,+BAAC;UACZ;;UAEA,WAAS,0BAAQ,aAAa;UAE9B,iBAAsB,GAAnB,wCAAsB,YAAW;YAIlC,qCAAa,8FAAyC,iCAAc,qCACpD,wEAAmC;oFACT;UAC5C;;UAEA,WAAS,0BAAQ,QAAQ;UAEzB,iBAAsB,GAAnB,wCAAsB,OAAM;YAC7B,qCAAa,6FAAwC,iCAAc,qCACnD,wEAAmC;oFACT;UAC5C;;wKAE2E;;QAG/E,YAAU,sCAAiB;QAC3B,iBAAqB,GAAlB,0BAAQ,WAAY,gCAAC;+NAEmB;QAC3C;QAEA,iBAAc,GAAX,gCAAa,qCAAG;UACjB,YAAU,8BAAS;QACrB;QACA,iBAAqB,GAAlB,0BAAQ,WAAY,gCAAC;+NAEmB;QAC3C;QAEA;QACA;QACA,sCAAY,SAAQ,+CAAS,OAAO;QAEpC,aAAU,sFAE2C;QAErD,sCAAY,SAAQ,kBAAa,OAAO;MAC1C;IACF;IAEF;;EAGA;;;;;;;;;;;QAEQ,wDAA8B;QAC9B,4FAAqC;QACrC,kgCAAuC;QACvC,yDAAmC;QACnC,0DAAmC;QACnC,mEAAmC;QACnC,kEAAmC;QACnC,sSAAgF;IAEtF,eAAa,2BAAQ,4CAAgC;IACrD,iBAAa,GAAV,WAAY,0BAAQ,UAAS;MAE9B;IACF;IACA,YAAa,sCAAiB;IAC9B,cAAa,MAAM;IACnB,eAAa,MAAM;IAInB,iBAA2B,GAAxB,yBAA0B,uBAAS;MACpC,iBAAa,GAAV,+BAAY,qCAAG;4IAC+C;MACjE;QACE,UAAU,MAAC,cAAW,MAAM;QAC5B,UAAU,MAAC,WAAQ,MAAM;QACzB,UAAU,MAAC,aAAU,eAAE,MAAC,MAAK;8JACuC;MACtE;IACF;IAEA,4EAAgD;IAEhD,oBAAc,GAAR,SAAW;;;;MACf;MAEA,qBAAkB,sCAA2B;MAC7C,IACE,OAMA,AAEA,KATG,eAAL;;QAEI,qBAAmB,MAAM;QACzB;QACA,iBAAa,GAAV,+BAAY,qCAAG;UAChB,sCAAY,sCAAI,2BAAsB,gBAAgB;QACxD;;QAEA,sCAAY,YAAW,sCAAI,iBAAY,gBAAgB;;QAEvD,sCAAY,QAAO,sCAAI,iBAAY,gBAAgB;;sKAEwB;;MAG/E;MAEA,iBAA8B,GAA3B,0BAAQ,oBAAqB,iCAAE;+LACoE;MACtG;MAEA,eAAa,gBAAgB;MAC7B;;;;kDACwC;MACxC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;uLAC+E;MAC9F;QACE,gFAAoD;MACtD;MAEA,iBAAiE,IAA9D,qIAAgE,wBAAW,iBAClD,GAAxB,yBAA0B,uBAAS;qKAEwC;MAC/E;MAEA,cAAY,UAAU;IACxB;;IAEF;;AACF","file":"zcl_abapgit_folder_logic.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_frontend_services.clas.mjs":{"lineLengths":[53,42,37,32,57,68,25,22,17,42,22,3,29,64,16,3,63,109,88,114,123,58,61,9,208,155,11,130,43,19,24,46,73,75,83,75,63,15,18,22,11,10,92,67,9,19,122,15,104,47,23,28,50,77,79,87,79,67,19,22,26,15,13,96,71,13,18,20,11,9,7,67,79,89,81,95,82,95,13,179,45,21,26,48,75,77,85,65,17,20,24,13,11,94,69,11,9,69,78,82,67,58,15,114,47,23,28,50,90,77,79,90,91,81,80,87,82,68,19,22,26,15,13,96,71,13,11,70,110,80,84,17,119,49,25,30,52,79,81,84,89,69,21,24,28,17,15,98,73,15,31,13,64,81,83,84,92,82,86,90,110,82,86,82,86,84,92,82,86,132,19,295,51,27,32,54,81,83,84,85,85,93,91,89,91,72,23,26,30,19,17,100,75,17,15,72,79,73,81,73,16,249,119,21,223,53,29,34,56,89,81,96,85,85,86,91,94,93,89,89,87,88,90,87,90,83,84,88,96,93,94,86,74,25,28,32,21,19,102,77,19,17,72,83,81,75,18,248,79,23,191,55,31,36,58,90,90,83,98,87,87,88,90,93,97,91,92,89,92,85,86,96,88,76,27,30,34,23,21,104,79,21,99,72,35,19,81,133,104,25,125,57,33,38,60,97,89,87,77,29,32,36,25,23,106,81,23,21,80,140,97,130,82,136,91,99,118,344,79,150,27,133,59,35,40,62,101,103,93,89,91,99,79,31,34,38,27,25,108,83,25,107,45,70,107,45,65,107,45,68,264,23,87,99,114,29,135,61,37,42,64,91,93,101,81,33,36,40,29,27,110,85,27,25,80,134,207,156,118,53,25,82,124,208,157,109,43,25,85,124,206,155,107,43,25,73,127,201,150,105,46,25,90,89,90,86,94,98,101,119,345,157,91,87,83,102,181,27,31,243,63,39,44,66,106,93,95,103,83,35,38,42,31,29,112,87,29,117,137,29,108,52,130,70,43,27,92,91,92,88,96,100,103,121,89,93,95,91,104,183,29,33,298,65,41,46,68,95,97,105,85,37,40,44,33,31,114,89,31,119,139,31,45,29,27,104,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/zcl_abapgit_frontend_services.clas.abap"],"names":[],"mappings":";;AAcA;;;;;;;;;;;;;;EAGE;;;;;;QAEO,oDAAY;IAIjB;;;;;;;;;;;;;;;;;;;QAcI,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;;;;;;;;;;;;;;;;;;;;;;;;;QAmBJ;MAEF;MAGA;;;;;;;;kLAYgC;;;;;;;;;;;;;;UAC9B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oEACsB;UACtC;QAEF;QAGA;;;;;;iHAiBqC;;;;;;;;;;;;;;;;;;;;YACnC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sEACsB;YACtC;UAEF;UAGA;;;;;qHAYgC;;;;;;;;;;;;;;;cAC9B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wEACsB;cACtC;cAEF;;YAGA;;;;;;;;;;;;;;;;;;;sSAsBmC;;;;;;;;;;;;;;;;;;;;gBACjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0EACsB;gBACtC;cAEF;cAGA;;;;;;oBAGO,oOAAyD;sHAI1B;;8NAiCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBACpC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4EACsB;kBACtC;gBAEF;gBAGA;;;;;sBAIQ,iOAA+C;sBAC/C,wDAAgB;;8LA6BY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAClC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;8EACsB;oBACtC;oBAEA,sCAAqB,kBAAa,OAAoB;oBACtD,YAAU,sCAAkB;oBAE9B;;kBAGA;;;;4HASgC;;;;;;;;;;;;;;sBAC9B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gFACsB;sBACtC;oBAEF;oBAGA;;;;;;;;;0BAGI,6TAA+B;0BAC/B,oDAAuB;0BACvB,2HAA8C;;oIAad;;;;;;;;;;;;;;;;;wBAClC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kFACsB;wBACtC;wBAEA;2CAAmD;wBACnD,mBAAiB,UAAU,MAAC,SAAQ;wBACpC;2CAAmD;wBACnD,cAAY,UAAU,MAAC,SAAQ;wBAC/B;2CAAmD;wBACnD,iBAAe,UAAU,MAAC,SAAQ;wBAElC,8OAAmG;sBAErG;sBAGA;;;;sIASgC;;;;;;;;;;;;;;0BAC9B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oFACsB;0BACtC;wBAEF;wBAGA;;;;;0BAMA;;wBAGA;;;;;0BAMA;;wBAGA;;;;;0BAMA;;wBAGA;;;;;0BAMA;;wBAGA;;;;;;;;8BAGI,0TAA4B;8BAC5B,8HAAwC;8BACxC,4DAAyB;8BACzB,wDAAoB;8BACpB,oDAAoB;0BAEtB,iBAAgB,GAAb,cAAe,uCAAK;4BACrB,oCAAY,6DAA8B,yCAA0B,aAAY;0BAClF;;kPAgBiC;;;;;;;;;;;;;;;4BACjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sFACsB;4BACtC;4BACA,iBAAa,GAAV,WAAY,yCAA0B,cAAa;wIACT;4BAC7C;4BAEA;kDAAmD;4BACnD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;4BACnB,YAAU,aAAa,MAAC,SAAQ;4BAElC;;0BAGA;;;;;;;;gCAGI,wDAAkB;gCAClB,4DAAuB;gCACvB,8DAAuB;gCACvB,0DAAuB;4BAEzB,iBAAgB,GAAb,cAAe,uCAAK;8BACrB,oCAAY,6DAA8B,yCAA0B,aAAY;4BAClF;;ySAiB8B;;;;;;;;;;;;;;8BAC9B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wFACsB;8BACtC;8BACA,iBAAa,GAAV,WAAY,yCAA0B,cAAa;0IACT;8BAC7C;8BAEF;;0BACF","file":"zcl_abapgit_frontend_services.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_add_patch.clas.mjs":{"lineLengths":[53,38,33,32,53,37,1328,340,377,1323,353,176,17,42,22,1231,263,3,27,262,893,70,35,46,126,87,130,84,89,9,130,85,89,9,130,84,89,16,89,9,14,116,7,5,20,3,29,1230,61,30,16,3,21,262,46,56,5,32,20,3,28,77,69,46,56,5,152,99,116,27,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_add_patch.clas.abap"],"names":[],"mappings":";;AAuCA;;;;;;;;;;;;;;;;EAGE;;IAEE,IAAe,WAA8B;;;MAI3C,IACE,OAIA,AAMA,AAMA,IAjBG,WAAS,MAAC,OAAf;;QAGI,4EAAwC;;QAIxC,iBAAwB,GAArB,WAAS,MAAC,aAAa,uBAAS;UACjC,4EAAwC;QAC1C;;QAIA,iBAAwB,GAArB,WAAS,MAAC,aAAa,wBAAU;UAClC,4EAAwC;QAC1C;;QAIA,iBAAwB,GAArB,WAAS,MAAC,aAAa,uBAAS;UACjC,4EAAwC;QAC1C;UACE,4EAAwC;QAC1C;;mHAIgD;;IAItD;IAEF;;EAGA;;;IAEE,iBAAU,OAAO;IAEnB;;EAGA;;IAEE,yBAAG,cAAmB;MACpB,mBAAW,6BAAkB;IAC/B;IAEA,aAAW,aAAQ;IAErB;;EAGA;;QAEQ,4DAAqB;IAE3B,yBAAG,cAAmB;MACpB,mBAAW,6BAAkB;IAC/B;IAEA,sCAAqB,wBAAc,SAAsD;IACzF,oCAAY,UAAa,uCAAwB,QAAO;IAExD,qBAAkB,yFAAwD;IAE5E;;AACF","file":"zcl_abapgit_git_add_patch.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_branch_list.clas.mjs":{"lineLengths":[53,40,35,32,55,37,1027,152,288,834,1245,280,160,808,171,1018,1028,1020,265,716,267,263,17,42,22,930,75,3,43,73,3,50,67,52,79,140,34,12,161,5,19,3,29,67,61,117,16,3,29,622,52,79,47,122,5,139,85,12,70,27,24,74,77,29,50,90,264,7,5,21,3,33,622,74,82,101,68,25,22,66,69,27,42,88,70,27,24,74,77,29,50,90,123,7,5,21,3,19,929,38,23,3,29,929,654,74,37,158,77,7,5,23,3,33,63,3,40,75,52,79,40,141,221,147,185,5,27,3,27,74,44,26,3,25,925,654,512,37,71,5,19,3,25,55,3,32,115,52,79,263,67,76,100,101,119,260,122,146,123,35,265,131,14,133,7,5,19,3,38,68,3,45,67,52,79,32,140,19,3,34,64,3,41,67,61,925,58,74,79,248,105,67,74,50,67,76,654,35,42,65,115,67,28,60,374,52,78,187,52,53,78,97,86,128,38,9,187,52,53,282,157,14,17,7,70,52,44,44,101,151,200,64,7,5,3,34,64,3,41,74,67,61,653,207,137,96,26,60,114,5,26,3,31,61,3,38,67,67,61,38,65,115,88,26,56,19,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_branch_list.clas.abap"],"names":[],"mappings":";;AA8FA;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;IACE,iBAAkB,GAAf,gBAAkB,4CAA6B,wCAAY,MAAC,OAAK;MAClE,YAAU,cAAc;IAC1B;MACE,kCAAU,4CAA6B,wCAAY,MAAC,cAAgB,eAAc;IACpF;IACF;;EAGA;;;oHAOuC;IAEvC;;EAGA;;;;IAEE,yBAAG,eAAyB;yHACyB;IACrD;IAEA,iBAAkB,GAAf,gBAAkB,4CAA6B,wCAAY,MAAC,MAAI;MACjE,eAAY,8DAAkC;IAChD;MAEE;;;;;;gDAEkC;MAClC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;uQAEwD;MACxE;IAEF;IAEF;;EAGA;;;;IAEE;;;;;;;wCAEqE;IACrE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MAEd;;;;;;gDAEkC;MAClC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0HACoC;MACpD;IAEF;IAEF;;EAGA;;IAEE,gBAAc,gBAAW;IAE3B;;EAGA;;IACE,IAAc,aAAoC;;;MAGhD,iBAAoB,GAAjB,aAAW,MAAC,OAAO,4CAA6B,6CAAiB,MAAC,QAAM;QACzE,gCAAO,uBAAe,WAAW;MACnC;IACF;IACF;;EAGA;;;;;;;IACE,oBAAkB,cAAc;IAEhC,iBAAmB,GAAhB,iBAAmB,4CAA6B,wCAAY,MAAC,OAAK;MACnE,oNAA6G;IAC/G,wBAAuB,GAAhB,iBAAmB,4CAA6B,wCAAY,MAAC,MAAI;MACtE,qBAAkB,4JAA6F;IACjH;IAEF;;EAGA;;IACE,mBAAiB,mBAAc;IACjC;;EAGA;;IACE,IAAc,aAAoC;;;MAKhD,gCAAO,uBAAe,OAAO;IAC/B;IAEF;;EAGA;;;;;;;;;;;IAEE,IAAe,aAAqC;IAEpD,YAAU,4CAA6B,6CAAiB,MAAC,MAAK;IAE9D,iBAAkB,GAAf,gBAAkB,4CAA6B,wCAAY,MAAC,OAAM,iBACnD,GAAf,gBAAiB,4CAA6B,wCAAW;MAC1D,YAAU,4CAA6B,6CAAiB,MAAC,OAAM;IAEjE,wBAAsB,GAAf,gBAAkB,4CAA6B,wCAAY,MAAC,MAAI;MAErE;iCACmD;MACnD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAgB,GAAZ,qCAAe,sCAAO,gFAA+C;QACvF,YAAU,4CAA6B,6CAAiB,MAAC,cAAa;MACxE;QACE,YAAU,4CAA6B,6CAAiB,MAAC,gBAAe;MAC1E;IAEF;IAEF;;EAGA;;;;;;;IAEE,YAAU,cAAc;IACxB,qIAAkD;IAEpD;;EAGA;;;;;;;;;;QAEQ,+OAAyC;QACzC,gGAA8D;QAC9D,0DAAgC;QAChC,iEAAgC;QAChC,yCAA2B;QAC3B,0DAA2C;QAC3C,mEAAoC;IAE1C,IAAe,aAAgC;IAE/C,sBAAO,OAAO;IAAd,sBAAgB,cAAc;IAE9B,aAAU,8CAAyB;IACnC;;;MAGE,yBAAuB,eAAE,MAAC,MAAK;MAE/B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAsB,GAAlB,0BAAQ,WAAY,iCAAG,iBAAe,GAAX,gCAAa,wCAAO,iBAAiB,GAAb,2CAAe,uCAAK;QACzF,YAAU,8BAAS;6EACoB;MACzC,wBAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAsB,GAAlB,0BAAQ,WAAY,iCAAE;QAC5C,YAAU,8BAAS;QACnB,YAAU,+BAAU;QACpB,aAAU,uDAAkC;QAE5C;QACA,oBAAiB,wDAAmC;QACpD,yBAAG,eAA0B,iBAAY,GAAR,SAAW,gDAAa;UACvD,mBAAiB,OAAO;QAC1B;MACF,wBAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAsB,GAAlB,0BAAQ,WAAY,iCAAE;QAC5C,YAAU,8BAAS;QACnB,YAAU,+BAAU;MACtB,wBAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAsB,GAAlB,0BAAQ,WAAY,gCAAE,iBAAe,GAAX,gCAAa,4CAAU;4JACa;MACtF;QACE;MACF;MAEA,4CAAO,kBAAsB;;MAG7B,aAAW,MAAC,UAAe,OAAO;MAClC,aAAW,MAAC,UAAe,OAAO;MAClC,aAAW,MAAC,mBAAe,uDAA2B;MACtD,aAAW,MAAC,WAAe,iHAEuD;MAClF,iBAAoB,GAAjB,aAAW,MAAC,OAAO,4CAA6B,wCAAY,iBAAoB,GAAjB,aAAW,MAAC,OAAO,eAAc;QACjG,aAAW,MAAC,aAAU,sBAAS;MACjC;IACF;EAEF;EAGA;;;;;;;QAEQ,ooBAA6B;QAC7B,sMAA4C;;IAGlD;wBAAuD;IACvD,yBAAG,eAAE,MAAC,OAAgB;MACpB,mBAAiB,uFAA8C;IACjE;IAEF;;EAGA;;;;;;;QAEQ,6BAAyB;QACzB,wDAAgB;IAGtB,oCAAkB,GAAX,gCAAa,sCAAI;IAExB,WAAS,4BAAU,2CAAc;IACjC,cAAY,MAAM;IAElB,YAAU,sCAAiB;IAE7B;;AACF","file":"zcl_abapgit_git_branch_list.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_commit.clas.mjs":{"lineLengths":[53,35,30,32,50,37,25,5990,2776,608,3172,2866,3423,2491,2497,2501,17,42,22,3,29,64,16,3,36,61,3,43,69,67,108,64,106,61,104,58,167,88,164,5,3,38,63,3,45,2397,67,2205,68,37,141,59,7,141,59,7,5,3,37,62,3,44,588,85,588,82,2177,76,2397,67,2406,366,588,2211,41,41,191,43,94,5,74,90,28,129,107,45,12,43,5,67,70,54,78,3,30,55,3,37,2599,74,82,71,73,71,85,102,67,99,135,891,124,198,227,196,91,61,74,5,26,3,30,55,3,37,2397,112,82,71,73,71,85,135,891,124,198,180,196,73,54,22,3,27,52,3,34,102,2397,70,105,61,50,103,70,29,43,119,5,21,3,30,55,3,37,2397,891,70,2173,249,761,557,99,347,37,114,39,57,55,56,125,163,133,28,106,90,88,92,7,80,40,107,37,89,7,170,70,5,22,3,35,60,3,42,2397,67,2397,2205,68,37,119,5,31,38,3,29,54,3,36,2397,67,2404,2178,583,366,2213,75,79,82,27,55,88,166,5,67,70,62,73,92,137,59,21,18,50,153,49,14,7,87,5,50,38,3,1,64,2614,601,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_commit.clas.abap"],"names":[],"mappings":";;AA+EA;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;;IASE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;mKAC4D;IAC5E;EAEF;EAEA;;;;;;IAIE,IAAe,aAAuD;;;MAIpE,iBACgD,IAD7C,wFAC+C,uBAAS;QACzD,sBAAM,aAAW,MAAC,QAAO;MAC3B;MAEA,iBACgD,IAD7C,wFAC+C,uBAAS;QACzD,sBAAM,aAAW,MAAC,QAAO;MAC3B;IAEF;EAEF;EAGA;;;;;;;;;;;;QAEQ,61EAAkE;QAClE,qWAAgD;QAChD,mkBAAwC;IAE9C,IAAe,mBAA6D;IAE5E,sBAAO,aAAa;IAGpB,oBAAkB,eAAe;;;MAG/B,qFAAuD;IACzD;IAGA;IACA;0BAAyD;;IAMzD,iBAAgC,GAA7B,yBAAO,uBAAwB,gCAAC;MACjC,sBAAM,eAAe;IACvB;MACE,oBAAkB,eAAe;IACnC;IAEA,SAAS,MAAC,UAAS,oCAAG;IACtB,SAAS,MAAC,YAAS,qCAAI;IACvB,SAAS,MAAC,SAAS,aAAa,MAAC,KAAI;IACrC,uEAA2C;EAE7C;EAGA;;;;;;;;;;;;;;QAEQ,8HAA4C;QAC5C,k3BAAuD;IAE7D,iBAAc,qGAAuC;qMAIH;kOAShB;;IAIlC,cAAc,MAAC,cAAU,mDAA2B;IAEpD,iBAAa,GAAV,WAAY,uBAAS;yEACsC;IAC9D;IAEF;;EAGA;;;;;;;;;;;QAEQ,8HAA4C;QAC5C,k3BAAuD;IAE7D,iBAAc,qGAAuC;qMAIH;mLAQhB;;IAIlC,gBAAa,mDAA2B;qDACQ;IAElD;;EAGA;;;;;;;;;IAEE,yBAAG,kBAAsB;MAEvB;;;yCAEyB;MACzB,cAAY,gCAAgB,GAAT,eAAE,MAAC,QAAS,gCAAnB,CAAsB;IAEpC;IAEF;;EAGA;;;;;;;QAEQ,onEAAqD;QACrD,gPAAwD;QACxD,gvBAA8C;IAEpD,IAAe,aAAmC;IAAlD,IACe,WAAuB;;;MAKpC,YAAS,8FAAuD;MAEhE,sBAAM,SAAS;MACf,SAAS,MAAC,UAAO,aAAW,MAAC,KAAI;MACjC,SAAS,MAAC,aAAU,MAAM,MAAC,OAAM;MACjC,SAAS,MAAC,aAAU,MAAM,MAAC,QAAO;MAElC;MAEA;;;wGAA8F;MAC9F,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;MAGf;MAEA;sCAAiD;;;QAI/C,8EAA0C;MAC5C;yKAQgC;MAEhC,gCAAO,mBAAa,UAAU;IAEhC;IAEF;;EAGA;;;;;;QAEQ,o1EAAmE;IACzE,IAAe,aAAuD;;;MAGpE,8GAA0C;IAC5C;IACA,eAAa,UAAU;IACvB,sBAAK,UAAU;EAEjB;EAGA;;;;;;QAEQ,21EAAgE;QAChE,ynEAA6D;QAC7D,8jBAAoC;QACpC,qWAAyC;IAE/C,IAAe,qBAA+D;IAG9E;;;;qDAA4E;IAC5E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;qKACsF;IACtG;IAEA,SAAS,MAAC,UAAS,oCAAG;IACtB,SAAS,MAAC,YAAS,qCAAI;IACvB,SAAS,MAAC,SAAS,qBAAmB,MAAC,KAAI;IAC3C,kEAAsC;IAGtC,qFAAuD;;;;;;wJASS;MAC9D,yBAAG,eAAyB;QAC1B;MACF;MACA,8EAAkD;IACpD;;IAEA,eAAa,iBAAiB;EAEhC;AACF","file":"zcl_abapgit_git_commit.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_pack.clas.mjs":{"lineLengths":[55,53,33,28,32,48,37,153,126,130,130,1004,1543,341,1315,270,266,418,283,1088,794,968,929,1088,794,968,930,17,42,22,58,46,54,52,3,29,64,16,3,23,46,3,30,891,69,61,36,69,50,50,66,62,105,110,73,75,77,73,72,67,525,65,25,184,122,5,48,90,121,5,48,51,105,48,59,38,61,52,49,47,55,72,129,58,53,7,50,127,124,7,50,66,139,62,124,9,144,132,91,16,70,9,77,89,7,39,66,50,129,47,65,14,126,7,40,48,43,70,5,50,108,56,90,74,132,5,55,22,3,30,53,3,37,764,69,61,69,67,65,65,72,68,248,101,106,117,67,37,115,62,106,29,79,71,88,59,75,16,76,9,88,73,91,77,14,14,114,7,5,57,177,157,85,122,61,93,62,5,63,152,131,5,21,3,30,53,3,37,891,67,525,135,890,345,30,74,5,195,65,129,67,30,159,71,5,3,27,50,3,34,728,69,61,69,67,68,248,101,106,117,67,37,106,29,81,42,86,40,85,39,88,170,93,82,17,14,57,50,16,66,123,11,88,9,7,5,18,3,28,51,3,35,592,69,61,69,26,39,22,72,106,67,69,62,65,65,64,376,59,21,18,50,126,90,14,7,59,77,111,102,37,40,547,115,7,82,38,92,61,66,116,5,50,20,3,22,45,3,29,525,67,891,67,36,19,36,19,36,19,36,19,37,20,37,20,37,20,38,21,69,71,65,142,105,525,62,68,38,557,132,57,31,78,81,27,54,88,164,151,120,5,42,52,52,59,21,124,50,53,74,55,72,60,9,72,149,9,72,151,9,72,154,9,52,74,57,9,74,143,9,74,145,9,71,58,9,134,14,27,75,86,7,5,50,120,37,38,55,40,57,68,3,29,52,3,36,65,142,67,110,67,36,53,59,21,18,50,51,93,107,101,14,7,5,50,98,21,3,23,46,3,30,69,891,70,51,53,75,72,135,72,557,51,102,127,82,64,109,68,37,144,267,7,154,84,118,116,72,52,14,113,7,84,5,119,79,19,3,30,53,3,37,69,764,67,69,66,73,75,44,54,55,149,130,65,50,58,155,132,5,66,51,58,155,132,5,160,130,166,130,65,162,84,5,144,108,19,3,27,50,3,34,69,728,58,69,102,73,1176,108,19,3,28,51,3,35,69,592,64,39,22,69,592,52,72,408,63,66,35,86,85,85,147,113,73,103,5,19,3,27,50,3,34,65,64,69,58,36,74,110,45,91,48,58,59,21,102,50,47,93,50,121,5,50,105,3,25,48,3,32,104,36,49,39,21,40,54,28,70,111,77,109,77,109,77,108,78,110,12,127,5,19,3,26,49,3,33,592,592,64,688,538,408,66,35,50,144,142,14,59,7,46,5,62,65,35,81,5,20,3,32,55,3,39,72,104,61,65,67,63,65,38,27,129,52,134,52,134,52,133,52,135,53,12,142,5,29,71,52,5,134,27,82,59,21,75,50,136,86,85,5,50,70,28,86,5,22,3,32,55,3,39,69,58,77,82,295,73,53,95,56,43,50,124,5,64,100,70,50,5,70,50,5,70,120,5,3,1,60,68,50,62,40,66,44,65,47,389,608,777,741,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_pack.clas.abap"],"names":[],"mappings":";;;AA0JA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,2BAAwB;QACxB,4DAA8B;QAC9B,yCAAiC;QACjC,yCAAiC;QACjC,yDAAwB;QACxB,qDAAwB;QACxB,gGAA2D;QAC3D,qGAA2D;QAC3D,gEAAwB;QACxB,kEAA8B;QAC9B,oEAA8B;QAC9B,gEAAwB;QACxB,+DAA8B;QAC9B,0DAAwB;QACxB,ogBAAyC;QACzC,wDAA+B;IAGrC,YAAU,OAAO;IAGjB,kBAA0B,GAAnB,2BAAS,WAAY,gCAAE,iBAAc,GAAX,gCAAc,kCAAY;yHACD;IAC1D;IACA,YAAU,8BAAS;IAGnB,iBAAc,GAAX,gCAAc,+BAAS;wHAC+B;IACzD;IACA,YAAU,8BAAS;IAGnB,eAAa,8BAAU;IACvB,gBAAa,mFAAiD;IAC9D,YAAU,8BAAS;;;;;MAKjB,cAAY,eAAE,MAAC,MAAK;MAEpB,SAAO,8BAAU;MACjB,aAAU,kCAAgB;uEAGc;MAExC,iBAAW,GAAR,SAAU,4CAA6B,kCAAM,MAAC,OAAK;QACpD,iBAAe,+BAAW;QAC1B,YAAU,+BAAU;MACtB;MAGA,YAAU,8BAAU;MACpB,iBAAW,GAAR,SAAW,4BAAO,iBAAY,GAAR,SAAW,gCAAU;2HACY;MAC1D;MACA,YAAU,8BAAS;MAInB,iBAAW,GAAR,SAAU,4BAAM;0IAMoB;QAErC,iBAAe,GAAZ,aAAe,kBAAiB;2HACqB;QACxD;+IAOwC;QAExC,iBAAoC,GAAjC,sDAAoC,+CAA0B;0FAIF;QAC/D;UACE,YAAU,8CAAyB;QACrC;MAEF,wBAAe,GAAR,SAAU,gCAAU;wFAMoC;MAC/D;MAEA,sBAAM,SAAS;MACf,SAAS,MAAC,aAAU,8BAAU;MAC9B,YAAU,8BAAS;MAEnB,iBAAW,GAAR,SAAU,4CAA6B,kCAAM,MAAC,OAAK;QACpD,SAAS,MAAC,UAAO,YAAY;QAC7B;MACF;QACE,SAAS,MAAC,WAAO,0FAEY;MAC/B;MACA,SAAS,MAAC,UAAO,OAAO;MACxB,SAAS,MAAC,UAAO,eAAe;MAChC,SAAS,MAAC,WAAQ,SAAS;MAC3B,gCAAO,mBAAa,UAAU;IAChC;;IAGA,WAA4B,qBAAnB,2BAAS,UAAY,iCAAE;IAChC,eAAa,mCAAe;IAC5B,aAAU,uEAAwC;IAClD,iBAAuB,GAApB,4BAAU,WAAa,QAAO;mIACmC;IACpE;sDAEiD;IAEnD;;EAGA;;;;;;;QAEQ,4DAA4B;QAC5B,0DAA4B;QAC5B,wDAAuB;QACvB,wDAAuB;QACvB,+DAAuB;QACvB,2DAAqC;QACrC,+OAAqC;IAE3C,IAAe,aAAkC;IAGjD,eAAY,qFAAsD;IAElE;;;MAGE,cAAkC,mBAAtB,0BAAQ,gBAAgB,gCAAC;MACrC,cAAY,wCAAmB;MAE/B;MACA,IACE,OAEA,AAMA,AAEA,IAXG,OAAL;;QAEI,SAAS,MAAC,UAAO,oCAAa;;QAE9B,yBAAG,SAAS,MAAC,QAAiB;UAC5B,SAAS,MAAC,YAAS,oCAAa;QAClC;UACE,SAAS,MAAC,aAAU,oCAAa;QACnC;;QAEA,SAAS,MAAC,YAAS,oCAAa;;QAEhC,SAAS,MAAC,eAAY,qCAAc;QACpC;;QAEA,oCAAS,GAAF,iCAAI,gCAAC;;IAGlB;IAEA,cAAY,0BAAQ,WAAW;IAC/B,iBAAa,GAAV,WAAa,gCAAE,iBAAmB,GAAf,6CAAiB,0CAAQ;;MAK7C,cAAsB,qBAAV,UAAY,gCAAC;MACzB,qBAAyC,qBAAZ,mBAAV,UAAY,WAAY,gCAAC;MAC5C,cAAsB,mBAAV,UAAY,UAAS;MACjC,SAAS,MAAC,YAAS,0DAA6B;MAChD,cAAY,wCAAmB;IACjC;IAEA,SAAS,MAAC,UAAO,gCAAW;IAE5B,yBAAG,SAAS,MAAC,QACT,yBAAG,SAAS,MAAC,WACb,yBAAG,SAAS,MAAC,MAAe;kIACmC;IACnE;IAEF;;EAGA;;;;;;QAEQ,ogBAAmC;QACnC,8HAA4C;QAC5C,i3BAA2B;;;MAM/B,iEAAqC;IACvC;;IAOA;IAEA,iBAAc,0GAAwD;;;8JAInB;sEAGR;IAC3C;EAEF;EAGA;;;;;;;QAEQ,4DAAqB;QACrB,0DAAqB;QACrB,2DAA8B;QAC9B,+OAA8B;IAEpC,IAAe,aAAkC;IAGjD,eAAY,qFAAsD;IAElE;;;MAIE;MAEA,IACE,OAEA,AAEA,AAEA,AASA,IAhBG,OAAL;;QAEI,MAAM,MAAC,YAAS,QAAQ;;QAExB,MAAM,MAAC,UAAO,QAAQ;;QAEtB,MAAM,MAAC,SAAM,QAAQ;;;QAQrB,MAAM,MAAC,iBAAc,4BAAU,MAAM,MAAC,cAAa;;QAInD;;QAMA,yBAAG,MAAM,MAAC,SAAkB;UAC1B,MAAM,MAAC,aAAU,aAAW;QAC9B;UAEE,yBAAG,MAAM,MAAC,gBAAmB;YAC3B,MAAM,MAAC,gCAAO,MAAM,MAAC,MAAQ,uCAAwB,QAAO;UAC9D;UAEA,MAAM,MAAC,gCAAO,MAAM,MAAC,MAAQ,cAAW;QAE1C;;IAIN;IAEF;;EAGA;;;;;;;QAEa,4DAA6B,CAAA;;QAC7B,8BAA+B,CAAA;;QAEpC,+DAAuB;QACvB,iGAAqD;QACrD,0DAAsB;QACtB,4DAAsB;QACtB,qDAAiB;QACjB,wDAAiB;QACjB,wDAAiB;QACjB,uDAAiB;QACjB,+WAAuB;;;;;;MAM3B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd;MACF;MAEA,WAAkB,qBAAT,SAAW,UAAS;MAC7B,eAAa,sDAAyB;MAEtC,eAAY,wFAAyD;MACrE;MAEA,sBAAM,OAAO;MACb,OAAO,MAAC,WAAQ,QAAQ;MACxB,iBAAiB,GAAd,OAAO,MAAC,QAAS,4CAA6B,mCAAO,MAAC,KACrD,iBAAkB,GAAd,OAAO,MAAC,QAAS,4CAA6B,mCAAO,MAAC,MAC1D,iBAAkB,GAAd,OAAO,MAAC,QAAS,4CAA6B,mCAAO,MAAC,YAC1D,iBAAkB,GAAd,OAAO,MAAC,QAAS,4CAA6B,mCAAO,MAAC,WAAS;kHACtB;MACjD;MAEA,cAAqB,mBAAT,SAAW,gCAAC;MACxB,OAAO,MAAC,UAAO,OAAO;MACtB,OAAO,MAAC,UAAO,6DAAgC;MAC/C;MACA,gCAAO,iBAAW,QAAQ;MAE1B,cAAyB,mBAAJ,mBAAT,SAAW,iCAAI,cAAa;IAC1C;;IAEF;;EAGA;;;;;;;;QAEa,2BAAwB,CAAA;;QACxB,2BAAwB,CAAA;;QACxB,2BAAwB,CAAA;;QACxB,2BAAwB,CAAA;;QACxB,4BAAwB,CAAA;;QACxB,4BAAwB,CAAA;;QACxB,4BAAwB,CAAA;;QACxB,6BAAwB,CAAA;;QAE7B,4DAAsB;QACtB,8DAAsB;QACtB,wDAAgB;QAChB,qIAAgC;QAChC,gGAAmD;QACnD,ogBAAiC;QACjC,qDAAgB;QAChB,2DAAsB;QACtB,6BAAgB;IAEtB,IAAe,aAAmC;;IAQlD;;;;;oDAC+C;IAC/C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;mKACsD;IACtE,wBAAwB,GAAjB,aAAW,MAAC,OAAO,4CAA6B,kCAAM,MAAC,OAAK;uHAEX;IACxD;IAEA,YAAU,aAAW,MAAC,KAAI;mDAGD;mDACA;IAEzB,oBAAmC,IAA7B,4BAAS,iCAAsB;;;;MAEnC,YAAS,iCAAsB;MAE/B,iBAAyB,GAAf,sBAAP,OAAe,SAAS,OAAM;QAE/B,cAAY,+BAAC;QACb,iBAAuB,GAAb,sBAAP,OAAe,OAAO,KAAI;UAC3B,eAAY,iCAAsB;QACpC;QACA,iBAAuB,GAAb,sBAAP,OAAe,OAAO,KAAI;UAC3B,cAAsB,mBAAV,UAAmC,yBAAvB,kCAAyB,mCAAG;QACtD;QACA,iBAAuB,GAAb,sBAAP,OAAe,OAAO,KAAI;UAC3B,cAAsB,mBAAV,UAAmC,yBAAvB,kCAAyB,qCAAK;QACxD;QACA,iBAAuB,GAAb,sBAAP,OAAe,OAAO,KAAI;UAC3B,cAAsB,mBAAV,UAAmC,yBAAvB,kCAAyB,wCAAQ;QAC3D;QAEA,WAAS,+BAAC;QACV,iBAAwB,GAAd,sBAAP,OAAe,QAAQ,MAAK;UAC7B,YAAS,iCAAsB;QACjC;QACA,iBAAwB,GAAd,sBAAP,OAAe,QAAQ,MAAK;UAC7B,WAAgB,mBAAP,OAAgC,yBAAvB,kCAAyB,mCAAG;QAChD;QACA,iBAAwB,GAAd,sBAAP,OAAe,QAAQ,MAAK;UAC7B,WAAgB,mBAAP,OAAgC,yBAAvB,kCAAyB,qCAAK;QAClD;QAEA,iBAAU,GAAP,QAAS,gCAAC;UACX,WAAS,mCAAK;QAChB;QAEA,sCAAY,WAAU,iEACf,SAAsB;MAC/B;QAEE,WAAS,MAAM;QACf,YAAS,qDAA8B;QACvC,sCAAY,WAAU,iBAAY,SAAsB;MAC1D;IAEF;;IAEA,aAAU,qGAC6C;IAEvD,sBAAM,SAAS;IACf,SAAS,MAAC,UAAO,OAAO;IACxB,SAAS,MAAC,UAAO,aAAW,MAAC,KAAI;IACjC,SAAS,MAAC,UAAO,SAAS;IAC1B,SAAS,MAAC,WAAQ,aAAW,MAAC,MAAK;IACnC,gCAAO,mBAAa,UAAU;EAEhC;EAGA;;;;;;;QAEQ,qGAAuD;QACvD,0DAAsB;QACtB,2BAAiB;IAGvB,YAAU,mCAAE;;;;;MAEV,UAAO,iCAAsB;MAC7B,gBAAa,qEAAyC;MACtD,sCAAY,mCAAa,kBAAa,OAAO;MAC7C,iBAAiB,GAAd,mCAAgB,qCAAG;QACpB;MACF;IACF;;IACA,eAAY,6EAA8C;IAE5D;;EAGA;;;;;;;QAEQ,0CAAiC;QACjC,4CAA6D;QAC7D,kEAA6B;QAC7B,+DAA6B;QAC7B,8HAAiD;QACjD,+DAAuB;IAE7B,IAAe,aAAoC;IAGnD,YAAU,iCAAY;IAEtB,sCAAY,SAAQ,yCAAe,OAAoB;IAEvD,gBAAa,yGAA2D;IACxE,sCAAY,SAAQ,qBAAgB,OAAoB;IAExD,qBAAmB,yBAAO,YAAY;IAEtC,iBAAc,sFAAsD;;;MAGlE,iBAAoB,GAAR,mBAAT,eAAE,MAAC,OAAU,oCAAM,gCAAC;0QAGuD;MAC9E;MAEA,gBAAa,kIAE8B;MAC3C,sCAAY,SAAQ,qBAAgB,OAAoB;qHAM1B;MAE9B,sCAAY,SAAQ,6BAAO,wBAAmB,OAAoB;MAElE,yBAAO,aAAW,MAAC,mBAAkB;QACnC,eAAa,aAAW,MAAC,QAAO;MAClC;QACE,gBAAa,uFAA6C;MAC5D;MACA,sCAAY,SAAQ,qBAAgB,OAAoB;IAE1D;IAEA,aAAU,6BAAU,uEAAuC;IAC3D,sCAAY,SAAQ,kBAAa,OAAoB;IAEvD;;EAGA;;;;;;;QAEQ,4DAA2B;QAC3B,yDAA2B;QAC3B,gEAA2B;QAC3B,kEAA2B;IAGjC,kBAAgB,SAAS,MAAC,KAAI;IAC9B;IAEA,cAAY,mCAAE;IAEd,sCAAY,yCAAO,wBAAmB,MAAyB;IAC/D,sCAAY,WAAU,QAAO,uCAAwB,kBAAa,SAAS;IAE3E,yBAAO,SAAS,MAAC,kBAAiB;MAChC,oBAAkB,SAAS,MAAC,OAAM;MAClC;MAEA,sCAAY,2CAAS,0BACd,MAAyB;MAChC,sCAAY,WAAU,QAAO,uCAAwB,kBAAa,SAAS;IAC7E;IAEA,yBAAO,SAAS,MAAC,mBAAkB;MACjC,oBAAkB,SAAS,MAAC,QAAO;MACnC;MAEA,sCAAY,2CAAS,0BACd,MAAyB;MAChC,sCAAY,WAAU,QAAO,uCAAwB,kBAAa,SAAS;IAC7E;IAEA,sCAAY,2CAAS,SAAS,MAAC,kBACxB,MAAyB;IAChC,sCAAY,WAAU,QAAO,uCAAwB,kBAAa,SAAS;IAE3E,sCAAY,8CAAY,SAAS,MAAC,qBAC3B,MAAyB;IAChC,sCAAY,WAAU,QAAO,uCAAwB,kBAAa,SAAS;IAE3E,yBAAO,SAAS,MAAC,kBAAiB;MAChC,sCAAY,2CAAS,SAAS,MAAC,kBACxB,MAAyB;MAChC,sCAAY,WAAU,iBAAY,SAAS;IAC7C;IAEA,sCAAY,WAAU,uCAAwB,SAAQ,SAAS,MAAC,gBAAU,SAAS;IAEnF,aAAU,yFAAwD;IAEpE;;EAGA;;;;;;;QAEQ,4DAAqB;QACrB,6FAAgD;IAEtD,aAAU,sDAAiC;IAE3C,kpCAMgC;IAEhC,aAAU,yFAAwD;IAEpE;;EAGA;;;;;;;QAEa,8BAAyB,CAAA;;QAE9B,4DAAsB;QACtB,ukBAAwB;QACxB,2CAA2B;QAC3B,+DAAuB;IAE7B,IAAe,WAA+B;IAG9C,cAAW,2CAAqB;;;MAG9B,4CAAW,WAAS,MAAC,iBAAgB;MACrC,4CAAW,WAAS,MAAC,gBAAe;MACpC,4CAAW,WAAS,MAAC,gBAAe;MAEpC,sCAAY,WAAS,MAAC,QAAM,WAAS,MAAC,gBAAU,SAA4B;MAC5E,gBAAa,yFAAwD;MAErE,aAAW,4BAAU,WAAS,MAAC,OAAM;MACrC,sCAAY,SAAQ,YAAW,SAAQ,mBAAc,OAAoB;IAC3E;IAEF;;EAGA;;;;;;;;QASQ,2BAAqB;QACrB,iEAA0B;QAC1B,qGAA2D;IAGjE,SAAO,8BAAU;IACjB,gBAAa,qEAAyC;IAEtD,YAAU,8BAAS;IACnB,mBAAiB,iCAAY;IAE7B,oBAAoB,GAAd,mCAAiB;;;;MACrB,SAAO,8BAAU;MACjB,gBAAa,qEAAyC;MACtD,YAAU,8BAAS;MACnB,sCAAY,mCAAa,yBAAoB,cAAc;IAC7D;;IAEA,eAAY,oFAAqD;EAEnE;EAGA;;;;;;;QAEa,8BAAwB,CAAA;;QAC7B,+BAAe;IAErB,aAAgB,sBAAL,KAAa,QAAO;IAE/B,IACE,OAEA,AAEA,AAEA,AAEA,IATG,QAAL;;MAEI,YAAU,4CAA6B,kCAAM,MAAC,OAAM;;MAEpD,YAAU,4CAA6B,kCAAM,MAAC,KAAI;;MAElD,YAAU,4CAA6B,kCAAM,MAAC,KAAI;;MAElD,YAAU,4CAA6B,kCAAM,MAAC,IAAG;;MAEjD,YAAU,4CAA6B,kCAAM,MAAC,MAAK;;8HAEU;;IAGnE;;EAGA;;;;;;;QAOQ,uqBAAuD;IAE7D,IAAe,WAA8B;IAA7C,IACe,WAA+B;;;;MAK5C,iBAAmB,GAAhB,WAAS,MAAC,QAAQ,4CAA6B,mCAAO,MAAC,KAAG;QAC3D,sCAAY,WAAS,MAAC,OAAK,+CAAS,WAAS,MAAC,KAAI;MACpD;QACE,WAAS,MAAC,UAAO,WAAS,MAAC,KAAI;MACjC;MACA,WAAS,MAAC,UAAO,WAAS;IAC5B;IAGA;;;MAGE,gCAAO,WAAS,MAAC,eAAQ,QAAQ;IACnC;IAEF;;EAGA;;;;;;;;;QAIQ,sDAAgB;QAChB,wDAAgB;QAChB,6BAAyB;IAG/B,IACE,OAEA,AAEA,AAEA,AAEA,IATG,OAAL;;MAEI,YAAU,gCAAE;;MAEZ,YAAU,gCAAE;;MAEZ,YAAU,gCAAE;;MAEZ,YAAU,gCAAE;;MAEZ,YAAU,iCAAG;;6IAE+D;;IAGhF,cAAY,SAAS;IAGrB,iBAAa,GAAV,WAAY,iCAAE;MACf,WAAS,iCAAG;IACd;IACA,WAA0B,mBAAV,mBAAP,OAAS,SAAoB,mBAAV,UAAc,kCAAE;IAC5C,eAAa,MAAM;IACnB,cAAsB,mBAAV,UAAc,iCAAE;IAG5B,oBAAgB,GAAV,WAAa;;;;MACjB,WAAa,mBAAJ,kCAAgB,mBAAV,UAAc,mCAAG;MAChC,sCAAY,YAAW,iBAAY,UAAuB;MAC1D,cAAsB,mBAAV,UAAc,kCAAG;IAC/B;;IAGA,iBAAa,GAAV,WAAY,gCAAC;MACd,WAAS,SAAS;MAClB,sCAAY,YAAW,iBAAY,UAAuB;IAC5D;IAEF;;EAGA;;;;;;;;QAEQ,8RAAsD;QACtD,gEAAwB;QACxB,4CAA8D;IAGpE,aAAU,4EAAuC;IACjD,sBAAoB,OAAO,MAAC,eAAc;IAC1C,oBAAkB,OAAO,MAAC,IAAG;IAE7B,yBAAG,kBAA4B;2HAC6B;IAC5D;IAEA,YAAU,8CAAyB;IAEnC,gBAAa,8EAA4C;IACzD,iBAAc,GAAX,gCAAc,WAAU;MACzB,YAAU,8BAAS;IACrB;IACA,iBAAc,GAAX,gCAAc,WAAU;MACzB,YAAU,8BAAS;IACrB;IACA,iBAAc,GAAX,gCAAc,WAAU;uHAC6B;IACxD;EACF;AACF","file":"zcl_abapgit_git_pack.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_pack.clas.locals.mjs":{"lineLengths":[53,88,18,32,64,37,168,180,154,126,263,17,42,22,70,3,29,69,61,30,16,3,20,36,50,58,16,3,15,69,30,19,3,26,66,65,67,58,66,16,3,1,66,41,20,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_pack.clas.locals_imp.abap"],"names":[],"mappings":";;AAIA;;;;;;;;;;;;;;EAEE;;;IACE,iBAAU,OAAO;IACnB;;EAEA;;IACE,SAAO,mCAAU;IACjB,iBAAU,mCAAS;IACrB;;EAEA;;IACE,YAAU,YAAO;IACnB;;EAEA;;;;IACE,SAAO,2CAAkB;IACzB,iBAAU,2CAAiB;IAC7B;;AAEF","file":"zcl_abapgit_git_pack.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_porcelain.clas.mjs":{"lineLengths":[53,38,33,32,53,37,203,1477,1472,2053,2158,1998,4229,1242,1244,1242,1244,165,2398,2436,5034,413,1232,823,1232,1894,17,42,22,51,3,29,64,16,3,28,56,3,35,602,724,73,592,381,62,614,423,408,420,526,74,84,68,37,38,199,36,53,60,58,58,7,306,36,73,185,55,129,88,127,89,60,9,7,37,55,109,112,66,55,5,20,3,37,65,3,44,1034,58,66,58,68,891,69,525,728,113,47,119,44,59,61,350,90,94,46,119,37,63,68,95,203,3,30,58,3,37,66,58,67,61,105,61,69,144,5,207,3,39,67,3,46,1034,58,66,58,227,3,27,55,3,34,66,58,1034,58,79,141,5,37,147,72,156,74,12,163,5,3,37,65,3,44,66,58,1034,58,145,66,619,925,98,59,102,59,19,64,67,27,40,88,158,5,187,3,30,58,3,37,66,58,622,67,193,3,39,67,3,46,66,58,1034,58,187,3,27,55,3,34,66,58,1034,58,142,72,12,74,5,3,26,54,3,33,69,891,95,19,3,29,57,3,36,614,724,73,247,68,67,423,420,526,69,34,117,84,29,57,90,57,60,7,5,68,37,123,37,68,31,122,105,72,31,45,92,56,45,9,7,5,68,37,147,5,22,3,26,54,3,33,724,891,70,107,67,525,764,58,22,187,200,27,143,88,121,5,111,148,23,3,21,49,3,28,889,107,67,891,70,525,764,58,22,187,200,27,143,88,129,5,111,144,20,3,31,59,3,38,1971,66,58,74,82,71,85,120,230,123,21,3,31,59,3,38,1971,66,58,112,82,71,85,120,223,123,21,3,21,49,3,28,2635,809,70,122,64,895,82,107,67,66,58,74,82,724,889,105,109,602,1983,1776,459,526,96,51,66,36,75,81,47,122,84,69,163,176,31,119,92,57,76,72,129,9,119,62,45,9,47,128,211,110,57,14,139,7,5,71,334,103,169,21,3,34,62,3,41,809,70,602,64,889,64,107,67,108,70,66,58,74,82,111,76,895,79,109,70,102,71,69,525,764,65,413,540,73,63,94,97,27,70,106,237,77,230,12,60,5,53,42,44,55,102,105,122,40,72,67,36,39,55,64,198,211,29,154,90,17,7,122,55,83,43,74,5,67,36,39,118,64,198,211,29,154,90,17,7,122,55,83,43,74,5,99,98,175,42,3,21,49,3,28,891,70,105,61,67,61,889,61,67,508,592,555,555,408,58,29,183,196,27,139,88,125,5,110,67,36,145,62,33,202,215,31,158,92,129,9,39,40,59,55,55,68,7,5,327,36,134,119,5,3,26,54,3,33,724,891,70,105,61,67,61,525,724,592,526,408,58,22,183,196,27,139,88,119,5,108,67,36,46,386,55,43,58,58,60,137,231,88,14,131,7,5,23,3,1,70,122,81,1994,2658,399,623,409,635,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_porcelain.clas.abap"],"names":[],"mappings":";;AAiMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,ukBAAiD;QACjD,oXAAgC;QAChC,qDAAiB;QACjB,6lBAA6B;IAEnC,IAAe,aAAmC;IAAlD,IACe,WAAiC;IADhD,IAEe,UAAmC;IAFlD,IAGe,UAAoC;IAGnD,gBAAa,oDAA2B;IAGxC;;;MAGE,sBAAM,QAAQ;;;;QAKZ,WAAS,MAAC,WAAQ,UAAQ,MAAC,MAAK;QAChC,WAAS,MAAC,UAAQ,UAAQ,MAAC,KAAI;QAC/B,WAAS,MAAC,UAAQ,UAAQ,MAAC,KAAI;MACjC;;;QAIE,WAAS,0BAAQ,aAAW,MAAC,OAAM;QACnC,iBAA2B,GAAxB,0BAAQ,UAAQ,MAAC,SAAS,OAAO,iBAA0B,GAAtB,UAAQ,MAAC,mCAAe,aAAW,MAAC,MAAI;;UAE9E,WAAS,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,IAAG;UAG1D,WAAS,MAAC,UAAO,UAAQ,MAAC,iCAAW;UACrC,WAAkC,qBAAzB,0BAAQ,WAAS,MAAC,QAAS,gCAAC;UACrC,WAAS,MAAC,UAAO,WAAS,MAAC,iCAAY;UAEvC,WAAS,MAAC,UAAO,UAAQ,MAAC,KAAI;QAChC;MACF;MAEA,sBAAM,OAAO;MACb,OAAO,MAAC,UAAO,aAAW,MAAC,KAAI;MAC/B,OAAO,MAAC,WAAO,6EAA6C;MAC5D,OAAO,MAAC,WAAO,gFAA2C;MAC1D,gCAAO,iBAAW,QAAQ;MAE1B,aAAW,MAAC,UAAO,OAAO,MAAC,KAAI;IACjC;IAEF;;EAGA;;;;;;;;QAEQ,2DAA4B;QAC5B,k3BAA2D;QAC3D,4DAA4B;QAC5B,ogBAAuC;QACvC,+sBAAiD;QACjD,wGAAyD;IAG/D,MAAM,MAAC,YAAe,MAAM,MAAC,KAAI;IACjC,MAAM,MAAC,UAAe,4CAA6B,kCAAM,MAAC,OAAM;IAChE,MAAM,MAAC,SAAe,MAAM,MAAC,KAAI;IACjC,MAAM,MAAC,iBAAe,MAAM,MAAC,YAAW;IACxC,MAAM,MAAC,kBAAe,MAAM,MAAC,aAAY;IACzC,MAAM,MAAC,mCAAe,MAAM,MAAC,yQAGR,MAAM,MAAC,QAAI;IAEhC,YAAS,wEAA0C;IAEnD,qBAAkB,mEAAoC;IAEtD,SAAS,MAAC,UAAQ,eAAe;IACjC,SAAS,MAAC,UAAQ,4CAA6B,kCAAM,MAAC,IAAG;IACzD,SAAS,MAAC,UAAQ,MAAM;IACxB,SAAS,MAAC,WAAQ,+BAAC;IACnB,gCAAO,mBAAa,UAAU;IAE9B,aAAU,4EAA0C;0MAOxB;EAE9B;EAGA;;;;;;;;;;IAEE,iBAAW,GAAR,SAAW,iCAAG;+IAC0D;IAC3E;8MAOsC;EAExC;EAGA;;;;;;;;kOAOwC;EAExC;EAGA;;;;;;;;IAEE,iBAAe,GAAZ,MAAM,MAAC,OAAQ,iCAAG;4IACmD;IACxE;IAEA,IACE,OAMA,IAPG,MAAM,MAAC,KAAZ;;uEAKuB;;yEAMA;;kKAIgD;;EAIzE;EAGA;;;;;;;;QAGI,wIAAmD;QACnD,yDAAuB;QACvB,kmBAA2D;QAC3D,o5BAAmE;IAGrE,iBAAc,2EAA6C;IAC3D,aAAc,wCAA6B;IAC3C,YAAc,oFAA+C;IAE7D;;;;;sCAAyE;IACzE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6JACsD;IACtE;0LAMgC;EAElC;EAGA;;;;;;;;gMAMqC;EAErC;EAGA;;;;;;;;0LAMkC;EAElC;EAGA;;;;;;;;IAEE,iBAAe,GAAZ,MAAM,MAAC,OAAQ,4CAA6B,wCAAY,MAAC,MAAI;uEAI3C;IAErB;yEAIqB;IAErB;EAEF;EAGA;;;;;QAKO,k3BAAsD;IAE3D,aAAU,4EAA0C;IAEtD;;EAGA;;;;;;;QAEQ,8OAA6B;QAC7B,2DAAoB;QACpB,0DAAoB;IAE1B,IAAe,aAAmC;IAAlD,IACe,UAAmC;IADlD,IAEe,UAAoC;;;MAIjD;;;uDAA0E;MAC1E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;QAEd,aAAW,MAAC,UAAO,UAAQ,MAAC,KAAI;MAClC;IACF;;;MAIE;MAEA,sBAAM,OAAO;;;QAEX,sCAAY,SAAQ,UAAS,+CAAS,OAAO;QAC7C;;;2CAAoE;QACpE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;UAEd,UAAQ,MAAC,UAAO,OAAO;QACzB;MACF;IACF;;;;IAIA;IAEF;;EAGA;;;;;;;;;QAEQ,ogBAAiC;QACjC,mvBAA8C;IAEpD;;;;;6IAGoB;IACpB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wHACoC;IACpD;IACA,eAAY,0FAAqD;IAEjE,iBAAc,6HAE6B;IAE7C;;EAGA;;;;;;;;;QAEQ,ogBAAiD;QACjD,mvBAA8C;IAEpD;;;;;6IAGoB;IAEpB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gIAC4C;IAC5D;IAEA,eAAY,0FAAqD;+IAK1B;IAEzC;;EAGA;;;;;;;;;;;;qOAS0C;IAExC,SAAS,MAAC,YAAQ,0FACsC;IAE1D;;EAGA;;;;;;;;;;;;8NAS0C;IAExC,SAAS,MAAC,YAAQ,0FACsC;IAE1D;;EAGA;;;;;;;;;;;;;;;;;QAEQ,2sBAA4D;QAC5D,g3BAAyD;QACzD,gGAAqD;QACrD,oGAAqD;QACrD,ilBAA4B;QAC5B,s7DAAqD;IAE3D,IAAe,YAAkC;IAAjD,IACe,cAAiD;IADhE,IAEe,UAAqC;IAEpD,iBAAc,yEACmC;IAEjD,cAAW,+BAAoB;;;;MAK7B,kCAAmB,YAAU,MAAC,OAAQ,cAAY;MAElD,IACE,OAqBA,IAtBG,YAAU,MAAC,OAAhB;;QAGI,gCAAO,YAAU,MAAC,eAAQ,QAAQ;QAElC;;;;qHAE6B;QAC7B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;UAEd,UAAQ,MAAC,UAAQ,YAAU,MAAC,KAAI,MAAC,SAAQ;UACzC,UAAQ,MAAC,UAAQ,YAAU,MAAC,KAAI,MAAC,KAAI;UACrC,UAAQ,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;QAC5D;QAEA,aAAU,gGAAmD;QAC7D,iBAAiB,GAAd,UAAQ,MAAC,OAAQ,QAAO;UACzB,UAAQ,MAAC,UAAO,OAAO;QACzB;QAEA,cAAY,MAAC,UAAO,OAAO;;;QAM3B,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEnB,sBAAM,cAAY,MAAC,KAAI;;0IAG2C;;IAExE;IAEA,cAAW,mDAA0B;6UAcH;IAElC,gCAAgB,qCAAkB,SAAS,MAAC,YAAW;wKAKL;IAEpD;;EAGA;;;;;;;;;;;;;;;;;;;;;;;;QAEQ,6FAAgD;QAChD,8DAAsB;QACtB,4DAAsB;QACtB,ogBAAqC;QACrC,mvBAA8C;QAC9C,wDAAuB;IAE7B,IAAe,WAA+B;IAA9C,IACe,WAA+B;IAG9C,aAAU,sDAAiC;IAE3C;;;;oEAA2D;IAC3D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAGnB,SAAS,MAAC,wNACuC;IACjD,yBAAG,UAAU,MAAC,OAAM,MAAC,gBAAmB;MACtC,SAAS,MAAC,+MACoC;IAChD;MACE,SAAS,MAAC,YAAS,SAAS,MAAC,UAAS;IACxC;IAEA,SAAS,MAAC,UAAY,WAAS,MAAC,KAAI;IACpC,SAAS,MAAC,YAAY,SAAS;IAC/B,SAAS,MAAC,aAAY,UAAU;IAChC,SAAS,MAAC,UAAY,UAAU,MAAC,QAAO;IACxC,eAAY,iFAAgD;IAE5D,SAAS,MAAC,WAAO,yEAA0C;IAC3D,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,OAAM;IAC3D,SAAS,MAAC,UAAO,SAAS;IAC1B,gCAAO,mBAAa,cAAc;;;MAGhC,sBAAM,SAAS;MACf,SAAS,MAAC,UAAO,WAAS,MAAC,KAAI;MAE/B;;;;wJAIwB;MACxB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEb;MACF;MAEA,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,KAAI;MACzD,SAAS,MAAC,UAAO,WAAS,MAAC,KAAI;MAC/B,cAAsB,mBAAV,UAAY,gCAAC;MACzB,SAAS,MAAC,WAAQ,SAAS;MAC3B,gCAAO,mBAAa,cAAc;IACpC;;;MAGE,sBAAM,SAAS;MACf,SAAS,MAAC,WAAO,oFAA6C;MAE9D;;;;wJAIwB;MACxB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEb;MACF;MAEA,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,KAAI;MAEzD,SAAS,MAAC,UAAO,WAAS,MAAC,KAAI;MAC/B,cAAsB,mBAAV,UAAY,gCAAC;MACzB,SAAS,MAAC,WAAQ,SAAS;MAC3B,gCAAO,mBAAa,cAAc;IACpC;IAEA,aAAU,gFAA8C;IAExD,mBAAgB,yEAA0C;8KAO9B;IAE5B,gBAAc,SAAS,MAAC,KAAI;EAE9B;EAGA;;;;;;;;;;;;QAEQ,0DAAoB;QACpB,mfAA8B;QAC9B,ukBAA+C;IAErD,IAAe,WAAiC;IAAhD,IACe,WAAiC;IADhD,IAEe,WAA+B;IAG9C;;;;;yIAGkB;IAClB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4HACwC;IACxD;IAEA,cAAW,0FAAmD;;;MAG5D,iBAAmB,GAAhB,WAAS,MAAC,QAAQ,4CAA6B,mCAAO,MAAC,MAAI;QAC5D;;;;;4JAGyB;QACzB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gIACwC;QACxD;QAEA,sBAAM,OAAO;QACb,OAAO,MAAC,UAAW,OAAO;QAC1B,OAAO,MAAC,cAAW,WAAS,MAAC,KAAI;QACjC,OAAO,MAAC,UAAW,WAAS,MAAC,KAAI;QACjC,OAAO,MAAC,UAAW,WAAS,MAAC,KAAI;QACjC,gCAAO,iBAAW,QAAQ;MAC5B;IACF;;;MAGE,sCAAY,SAAQ,WAAS,MAAC,OAAK,+CAAS,OAAO;sHAKZ;IACzC;EAEF;EAGA;;;;;;;;;;;QAEQ,ogBAAmC;QACnC,2sBAA4B;QAC5B,ukBAAkD;IAExD,IAAe,UAAkC;IAAjD,IACe,WAA+B;IAG9C;;;;;yIAGkB;IAClB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sHACkC;IAClD;IACA,cAAW,wFAAmD;;;MAG5D,IACE,OAQA,KATG,WAAS,MAAC,MAAf;;;QAKI,UAAQ,MAAC,UAAQ,OAAO;QACxB,UAAQ,MAAC,UAAQ,WAAS,MAAC,KAAI;QAC/B,UAAQ,MAAC,UAAQ,WAAS,MAAC,KAAI;QAC/B,UAAQ,MAAC,WAAQ,WAAS,MAAC,MAAK;;QAEhC,iBAAc,4MAGmC;QACjD,gCAAgB,kCAAe,WAAW;;kIAEgB;;IAEhE;IAEF;;AACF","file":"zcl_abapgit_git_porcelain.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_tag.clas.mjs":{"lineLengths":[53,32,27,32,47,37,25,266,273,264,268,17,42,22,3,29,64,16,3,25,47,3,32,67,67,61,144,19,3,31,53,3,38,67,45,58,151,19,3,28,50,3,35,67,67,61,25,203,19,3,34,56,3,41,67,67,61,25,210,19,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_tag.clas.abap"],"names":[],"mappings":";;AAoCA;;;;;;;;;;;;;;;;;EAGE;;;;;;;IAEE,kCAAU,QAAW,4CAA6B,wCAAY,MAAC,MAAI;IAErE;;EAGA;;;;;;;IAEE,kCAAU,4CAA6B,wCAAY,MAAC,aAAe,QAAO;IAE5E;;EAGA;;;;;;;IAEE,YAAU,OAAO;IAEjB,oMAAyE;IAE3E;;EAGA;;;;;;;IAEE,YAAU,OAAO;IAEjB,2MAEe;IAEjB;;AACF","file":"zcl_abapgit_git_tag.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_time.clas.mjs":{"lineLengths":[53,33,28,32,48,37,25,210,352,17,42,22,3,29,64,16,3,20,43,3,27,102,96,35,95,66,46,104,28,55,97,19,3,24,47,3,31,102,61,40,58,40,58,61,29,60,63,53,46,52,52,31,75,52,82,54,5,78,49,78,51,3,1,60,119,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_time.clas.abap"],"names":[],"mappings":";;AA2BA;;;;;;;;;;;;;;;EAGE;;;;;QAGY,uFAA8C,CAAA;;QACnD,sFAAsB;QACtB,yDAAiB;IAEtB,wCAA4B;IAE5B,gBAAa,kFAEQ;IAErB,YAAU,UAAU;IACpB,yBAAS,OAAO;0BAChB,2BAAa,0CAAS;IAExB;;EAGA;;;;;;;;;;QAEY,oDAAgC,CAAA;;QAEpC,mDAAiB;QACjB,sDAAiB;QACjB,4CAA0B;IAGhC,SAAO,+BAAW;IAClB,eAAa,+BAAU;IACvB,eAAa,+BAAU;IAGvB,IACE,OAEA,KAHG,UAAL;;MAEI,SAAY,mBAAL,KAAO,WAAU;;MAExB,SAAY,qBAAL,KAAO,WAAU;;IAG5B,YAAe,mBAAL,KAAS,oCAAK;IACxB,SAAY,qBAAL,KAAO,QAAO;IACrB,SAAY,sBAAL,KAAO,oCAAK;IACnB,YAAe,mBAAL,KAAO,SAAQ;EAE3B;AACF","file":"zcl_abapgit_git_time.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_transport.clas.mjs":{"lineLengths":[53,38,33,32,53,37,297,188,632,893,265,1744,2441,1503,671,345,17,42,22,57,3,29,64,16,3,25,53,3,32,148,66,58,135,161,34,26,3,28,56,3,35,66,58,70,70,135,64,148,79,76,42,75,74,67,84,116,50,144,137,53,115,3,36,64,3,43,69,67,69,68,76,74,74,76,74,74,29,74,79,105,93,12,54,140,122,87,83,90,112,83,84,107,96,14,56,142,124,85,113,88,125,93,129,97,108,76,115,83,120,88,132,88,135,84,123,86,112,80,18,41,11,109,78,164,97,9,7,5,51,156,5,3,28,56,3,35,66,58,70,70,74,82,135,64,107,64,148,79,123,35,110,5,3,22,50,3,29,69,58,69,58,40,23,62,73,69,59,22,100,51,100,74,137,7,59,69,52,17,14,57,7,58,168,110,7,5,50,25,3,29,57,3,36,66,58,104,58,104,58,74,82,69,61,135,70,67,68,72,69,71,69,162,119,71,445,99,93,107,81,86,109,59,3,28,56,3,35,891,135,67,66,58,71,85,120,328,67,67,67,69,72,69,137,118,108,36,90,93,309,14,222,7,133,5,76,277,5,229,166,62,40,156,5,92,22,3,38,66,3,45,66,58,74,82,71,85,120,929,73,891,67,107,64,135,328,654,38,37,183,44,69,12,72,40,86,7,5,141,3,38,66,3,45,66,58,105,61,71,85,120,891,67,107,64,135,328,38,37,65,27,154,141,3,1,70,216,65,63,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_transport.clas.abap"],"names":[],"mappings":";;AAqGA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,8HAA6C;gKASd;iCAElB;IAErB;;EAGA;;;;;;;;;;;;QAEY,mEAAkD,CAAA;;QAClD,kEAAmF,CAAA;;QAEvF,0DAAmB;QACnB,2EAAoC;IAE1C,eAAY,+FAEe;IAE3B,6BAA2B,eAAe;IAC1C,yIAA+D;wIAId;IAEjD,aAAU,kCAAuB;;EAMnC;EAGA;;;;;;QAGI,4DAA4B;QAC5B,2DAA4B;QAC5B,mEAA4B;QAC5B,iEAA4B;QAC5B,iEAA4B;QAC5B,mEAA4B;QAC5B,iEAA4B;QAC5B,iEAA4B;IAG9B,cAAY,SAAS;IAErB,iBAAa,GAAV,WAAY,oCAAE;MACf,aAAW,0DAAwB;IACrC,wBAA2B,GAApB,0BAAQ,aAAc,gCAAC;MAC5B,aAAW,wEAAsC;IACnD;MACE,cAAY,gCAAW;MACvB;MACA;MAEA,iBAAkB,GAAf,gBAAkB,0CAAQ;QAC3B,aAAW,4DAA0B;MACvC,wBAAsB,GAAf,gBAAkB,sCAAI;QAC3B,sGAA+C;MACjD,wBAAiB,GAAV,WAAY,oCAAE;QACnB,aAAW,6DAA2B;MACxC,wBAA2B,GAApB,0BAAQ,aAAc,gCAAC;QAC5B,aAAW,yEAAuC;MACpD;QACE,cAAY,gCAAW;QACvB;QACA;QAEA,iBAAkB,GAAf,gBAAkB,sCAAI;UAEvB,iBAAkB,GAAf,gBAAkB,gEAA6B;YAChD,aAAW,6DAA2B;UACxC,wBAAsB,GAAf,gBAAkB,qEAAkC;YACzD,aAAW,kEAAgC;UAC7C,wBAAsB,GAAf,gBAAkB,yEAAsC;YAC7D,aAAW,sEAAoC;UACjD,wBAAsB,GAAf,gBAAkB,oDAAiB;YACxC,aAAW,iDAAe;UAC5B,wBAAsB,GAAf,gBAAkB,2DAAwB;YAC/C,aAAW,wDAAsB;UACnC,wBAAsB,GAAf,gBAAkB,gEAA6B;YACpD,aAAW,6DAA2B;UACxC,wBAAsB,GAAf,gBAAkB,4EAAyC;YAChE,aAAW,6DAA2B;UACxC,wBAAsB,GAAf,gBAAkB,+EAA4C;YACnE,aAAW,yDAAuB;UACpC,wBAAsB,GAAf,gBAAkB,mEAAgC;YACvD,aAAW,2DAAyB;UACtC,wBAAsB,GAAf,gBAAkB,wDAAqB;YAC5C,aAAW,qDAAmB;UAChC;YAEE,aAAW,cAAc;UAC3B;QACF,wBAA2B,GAApB,0BAAQ,aAAc,gCAAC;UAC5B,aAAW,qDAAmB;QAChC,wBAAiB,GAAV,WAAa,wCAAO,iBAAc,GAAV,WAAa,4CAAU;UAEpD,aAAW,wEAAsC;QACnD;MACF;IACF;IAEA,yBAAG,mBAAuB;2JAC0C;IACpE;EAEF;EAGA;;;;;;;;;;;;;;;;0HAQwC;IAEtC,4BAAwB;MACtB,gBAAY,kFAA+C,IAAI;IACjE;EAEF;EAGA;;;;;;;;QAEa,+BAA0B,CAAA;;QAE/B,qDAAkB;QAClB,gEAAwB;QACxB,4DAAwB;IAG9B,oBAAyB,GAAnB,2BAAS,WAAa;;;;MAC1B,YAAS,gFAAiD;MAE1D,iBAAU,GAAP,QAAS,2BAAS,UAAS;wIACoC;MAClE;MAEA,gBAAc,mCAAe;MAC7B,iBAAU,GAAP,QAAS,gCAAC;QACX,YAAU,8BAAS;QACnB;MACF;QACE,YAAU,mCAAc;MAC1B;MAEA,gBAAc,kCAAa;MAE3B,iBAA0B,GAAvB,2BAAS,eAAgB,gCAAE,iBAAmB,GAAf,oCAAiB,SAAQ;QACzD,sCAAY,SAAQ,6CAAmB,OAAoB;MAC7D;IAEF;;IAEA,YAAU,OAAO;EAEnB;EAGA;;;;;;;;;;;;;;QAEQ,8HAA+C;QAC/C,6DAAuB;QACvB,0DAAuB;QACvB,2DAAwB;QACxB,+DAAwB;QACxB,4DAAuB;QACvB,8DAAuB;QACvB,4DAAuB;iKASG;sHAIE;IAElC,gBAAc,iDAAe;IAE7B,kCAAU,6BACA,uDACA,6BACA,uDACA,sCACA,8EACA,uDACA,YACA,uCAAwB,eAAO;IACzC,gBAAa,6EAA4C;IAEzD,oCAAY,WAAc,wCAAM;IAChC,YAAS,yFAAwD;IAEjE,sCAAY,QAAO,kBAAa,UAAuB;IAEvD,gBAAa,gEAA2C;IAExD,eAAY,wFAAyD;0DAErC;EAElC;EAGA;;;;;;;;;;;;;;QAEQ,0DAAsB;QACtB,0DAAsB;QACtB,4DAAsB;QACtB,+DAAuB;QACvB,4DAAuB;IAE7B,IAAe,WAAgC;qHAIQ;;;MAGrD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,YAAU,uEAAqC;QAC/C,kCAAU,8DAAU,uDAAO,kCACtB,uDAAO,QAAW,uCAAwB,YAAO;MACxD;QACE,kCAAU,8DAAU,uDAAO,YACtB,uCAAwB,UAAO;MACtC;MACA,oCAAY,WAAa,8EAA4C;IACvE;IAEA,iBAAmB,GAAhB,iBAAkB,gCAAC;MACpB,oCAAY,WAAa,8NACU;IACrC;IAEA,oCAAY,gCACA,8DACA,4CAAc,uCAAwB,UAAO;IAEzD,gBAAa,gJAAyF;6DAG/D;IAEvC,yBAAG,QAAkB;2JACkE;IACvF;IAEA,gBAAa,sEAAuC;IAEtD;;EAGA;;;;;;;;;;;;;;;;;QAEQ,8HAA6C;QAC7C,+TAAsD;IAE5D,IAAe,aAAoC;IAGnD,sBAAO,UAAU;IAAjB,sBACO,SAAS;sLASgB;IAEhC,yBAAG,YAAsB;MACvB,gCAAO,mBAAa,SAAS;IAC/B;;;QAEI,gCAAO,aAAW,MAAC,eAAQ,SAAS;MACtC;IACF;IAEA,gBAAa,uHAG0C;EAEzD;EAGA;;;;;;;;;;;;;;;QAEQ,8HAA6C;QAC7C,+TAAsD;IAG5D,sBAAO,UAAU;IAAjB,sBACO,SAAS;IAEhB,gCAAO,iBAAW,SAAS;IAC3B,cAAY,OAAO;IAEnB,eAAY,qIAEqB;IAEjC,gBAAa,uHAG0C;EAEzD;AACF","file":"zcl_abapgit_git_transport.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_url.clas.mjs":{"lineLengths":[53,32,27,32,47,37,25,459,343,161,17,42,22,3,29,64,16,3,39,66,133,61,123,209,73,375,39,126,5,18,3,47,73,71,73,105,61,654,245,35,182,88,99,43,136,87,146,135,97,146,136,94,146,137,7,5,25,3,29,66,58,71,114,87,108,90,145,7,97,108,90,155,7,5,3,1,58,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git_platform/zcl_abapgit_git_url.clas.abap"],"names":[],"mappings":";;AAoCA;;;;;;;;;;;;;;;;EAGE;;;;QAEO,kHAAoC;IAEzC,YAAS,+LAEuC;IAEhD,aAAU,sDAAiC;sXAQd;IAE7B,yBAAG,OAAiB;6HAC0C;IAC9D;IAEF;;EAGA;;;;;;QAEO,qoBAA2B;IAChC,IAAc,qBAAwC;IAEtD,kBAAgB,WAAW;;IAK3B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb;yCAAqE;MACrE,IACE,OAGA,AAGA,KAPG,iHAAL;;QAEI,uIAAkD;QAClD,wCAAgB,4EAA+B,SAAO;;QAEtD,uIAAkD;QAClD,wCAAgB,6EAAgC,SAAO;;QAEvD,uIAAkD;QAClD,wCAAgB,8EAAiC,SAAO;;IAE9D;IAEF;;EAGA;;;QAEO,8DAAuB;IAE5B,iBAAc,2FAA2C;IAGzD,iBAAe,GAAZ,aAAe,+CAAY;;MAE5B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gJAC0D;MAC1E;IACF,wBAAmB,GAAZ,aAAe,kDAAe;;MAEnC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;0JACqE;MACpF;IACF;EAEF;AACF","file":"zcl_abapgit_git_url.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_utils.clas.mjs":{"lineLengths":[53,34,29,32,49,37,25,203,267,269,17,42,22,3,29,64,16,3,20,44,3,27,95,47,25,79,76,23,16,3,32,56,3,39,62,69,61,72,51,47,97,145,5,51,152,49,23,21,18,3,27,51,3,34,66,69,67,36,62,54,69,113,5,73,115,18,3,1,62,112,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_utils.clas.abap"],"names":[],"mappings":";;AAgCA;;;;;;;;;;;;;;;;EAGE;;;;;QAGQ,sCAAqC,CAAA;;IAC3C,IAAc,QAAa;IAE3B,qEAA6B;IAC7B,SAAO,QAAM;IAEf;;EAGA;;;;;;;QAEQ,+DAAuB;QACvB,0CAA0B;QAC1B,sCAA0B;IAEhC,iBAAsB,GAAnB,2BAAS,WAAY,gCAAC;gJACmD;IAC5E;IAEA,eAAa,8BAAU;IAEvB,cAAW,oIAEM;IAEjB;IACA,SAAO,QAAQ;IACf,WAAS,IAAI;IAEf;;EAGA;;;;;;;QAEQ,2BAAa;QACb,qDAAa;IAGnB,WAAS,0BAAQ,WAAW;IAE5B,iBAAU,GAAP,QAAU,kCAAG;gHAC6B;IAC7C;IAEA,SAAc,mBAAP,OAAS,gCAAC;IAEjB,iCAAS,4DAAQ,KAAQ,WAAS;IAEpC;;AACF","file":"zcl_abapgit_git_utils.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui.clas.mjs":{"lineLengths":[53,28,23,32,43,63,211,224,584,415,228,231,226,238,221,214,204,661,283,51,50,528,598,228,377,158,477,198,1247,928,48,54,17,42,22,114,148,508,339,152,155,150,162,145,138,128,55,3,21,100,107,82,110,104,73,104,64,328,137,69,21,5,59,69,42,21,5,136,21,5,59,37,65,53,63,25,108,76,108,83,137,14,7,5,50,46,24,19,3,25,103,152,363,93,25,88,276,99,28,47,108,47,7,5,22,3,27,66,67,61,189,18,3,26,143,61,109,88,114,105,76,106,328,117,48,52,72,5,34,24,3,29,98,76,154,76,149,79,161,91,113,100,121,55,137,67,14,143,160,9,65,7,5,96,56,40,42,50,25,16,3,16,95,77,67,47,3,24,69,67,328,97,57,43,52,87,106,12,103,88,27,50,7,26,5,3,30,47,64,48,67,328,73,134,152,134,363,183,9,83,34,110,161,16,9,7,382,84,7,45,86,28,92,63,103,105,102,101,91,26,103,66,95,14,155,7,17,100,113,28,62,14,16,7,5,3,29,134,76,162,106,77,33,5,9,73,213,28,77,58,171,94,9,14,160,7,17,203,28,160,14,16,7,5,3,30,99,143,61,134,9,52,54,76,7,17,106,14,16,7,5,18,3,25,44,55,43,52,45,58,325,61,540,70,94,3,18,66,67,123,49,131,5,50,43,158,87,5,61,72,5,84,109,65,141,5,60,87,3,21,72,3,19,72,71,865,670,94,60,100,210,39,202,7,5,96,58,66,106,86,3,53,66,67,61,70,64,66,58,45,58,48,67,4,4,235,63,259,78,33,116,199,12,126,200,5,106,18,3,58,72,139,59,158,104,66,84,183,9,7,5,24,3,52,149,42,25,3,51,132,37,20,3,49,120,106,79,108,109,91,5,35,18,3,64,158,88,77,132,3,61,66,58,67,61,56,76,69,67,203,3,1,50,591,55,53,52,51,55,63,63,62,341,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui.clas.abap"],"names":[],"mappings":";;AAqHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;QAEO,uDAAe;QACf,+TAA8B;IAGnC,iBAA8B,IAA3B,oEAA8B,yCAAO;oEACf;MACvB;IACF;IAEA,aAAW,yBAAO,eAAU;IAE5B,iBAAY,GAAT,UAAW,gCAAC;MACb,YAAU,sBAAS;MACnB;IACF;IAEA,iBAAe,GAAZ,aAAc,uBAAU,iBAAqB,IAAjB,6BAAmB,uBAAS;MACzD;IACF;;;;;MAGE;uBAAgD;MAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;MAGnB,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,aAAoB,qBAAT,SAAW,gCAAC;MAEvB,iBAAkB,GAAf,gBAAiB,wBAAW,iBAAqB,GAAlB,QAAQ,MAAC,WAAW,uBAAS;QAC7D;MACF;IACF;;IAEA,qBAAc,QAAQ,MAAC,KAAI;uBAClB;IAEX;;EAGA;;QAEO,+IAAoD;QACpD,kWAAiE;IAMtE;uBAAoD;IACpD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,gBAAa,4PAEa;MAC1B,iBAAoB,GAAjB,UAAU,MAAC,QAAQ,6BAAa,MAAC,WAAS;2BAClC;QACT,eAAa,sBAAS;MACxB,wBAAwB,GAAjB,UAAU,MAAC,QAAQ,6BAAa,MAAC,aAAW;QACjD,eAAa,sBAAS;MACxB;IACF;IAEF;;EAGA;;;;IAEE,YAAS,2KAGc;IAEzB;;EAGA;;;;;;;;;QAEQ,+TAA2B;IAEjC,iBAAgB,GAAb,cAAe,wBAAW,yBAAQ,2BAAsB;MACzD,QAAQ,MAAC,UAAW,gBAAW;MAC/B,QAAQ,MAAC,cAAW,gBAAgB;MACpC,gCAAO,kBAAY,aAAQ;IAC7B;IAEA,qBAAc,OAAO;uBACZ;EAEX;EAGA;;;;;;;;;;;;IAEE,yBAAG,uBAAqB;MACtB,iBAAwD,IAArD,oFAAuD,uBAAS;mCACjE,kBAAe,YAAY;MAC7B;QACE,iBAA2D,IAAxD,uFAA0D,wBAAU;+JACgB;QACvF;mCACA,gBAAa,YAAY;MAC3B;IACF;;IAIA,8BAAuB,oBAAoB;IAC3C,sBAAoB,YAAY;IAChC,uBAAoB,aAAa;IACjC,2BAAoB,iBAAiB;wBAC3B;IAEZ;;EAGA;IAEE;4EACiC;kEACV;IACvB,sBAAK,mBAAc;EAErB;EAGA;;;QAEQ,+TAA8B;QAC9B,wFAAqB;IAE3B,yBAAG,yBAAkB;MACnB,sBAAO,aAAQ;MAAf,sBAAiB,sBAAiB;MAClC,gCAAO,wBAAa,sBAAiB;yGAED;IACtC;MACE,iBAAqB,GAAlB,yBAAO,iBAAa,gCAAC;QACtB;yBAAyC;QACzC,qBAAc,QAAQ,MAAC,KAAI;MAC7B;yBACS;IACX;EAEF;EAGA;;;;;;;QAGI,6HAA8C;QAC9C,+IAAsD;QACtD,6HAA8C;QAC9C,kWAAmE;;IASrE;;;QAEM,gBAAa,oFAAgC;QAC7C,yBAAG,UAAU,MAAC,iBAAqB,iBAAqB,GAAjB,UAAU,MAAC,QAAS,6BAAa,MAAC,aAAW;UAClF;QACF;MACF;MAEA,iBAAgC,IAA7B,wDAA+B,uBAAU,IAAI,CAAI,cACjC,GAAjB,UAAU,MAAC,QAAQ,6BAAa,MAAC,WAAU,iBAC1B,GAAjB,UAAU,MAAC,QAAQ,6BAAa,MAAC,SAAQ,iBACxB,GAAjB,UAAU,MAAC,QAAQ,6BAAa,MAAC,aAAY,CAAC;QAE9C,UAAU,MAAC,WAAQ,6BAAa,MAAC,YAAW;MAC9C;MAEA,IACE,OAEA,AAEA,AAIA,AAIA,AAEA,AAEA,KAjBG,UAAU,MAAC,MAAhB;;2BAEa;;8DAEmB;;wGAII;;oGAIJ;;yBAErB;;iEAE2B;;;0JAI6B;;;;;;;;;;IAOvE;EAEF;EAGA;;;QAEQ,yJAA8D;QAC9D,iGAAwC;IAE9C,iBAAwB,GAArB,2BAAuB,uBAAS;MACjC;IACF;IAEA;iCACI,sBAAwB,gBAAW;MAEnC,yBAAG,+BAA8B,iBAAuD,IAAnD,wGAAqD,uBAAS;2BAExF;MACX,gCAAO,YAAY,OAAE,iBAAe;QAClC,uBAAgB,YAAY,OAAE,MAAM;QACpC,iBAAmC,IAAhC,iEAAmC,gCAAiB,2BAAW,MAAC,SAAO;6FACvB;QACnD;MACF;QACE,qJAA8C;MAChD;;;;;;;;IAKJ;EAEF;EAGA;;;;QAEO,6HAA0C;IAE/C;MACI,yBAAG,kBAAgB;mCACjB,UAAY,OAAO;QACnB,YAAS,sDAAqB;MAChC;;;;;;IAEJ;IAEF;;EAGA;;;;;;;;;;;6FAK4B;EAE5B;EAGA;QAEQ,yDAAmB;QACnB,0DAAmB;QACnB,kHAAoC;IAE1C,yBAAG,iBAAwB;kIACmC;IAC9D;IAEA,sBAAM,sBAAiB;0CACA;IAEvB,yBAAG,yBAAmB,iBAAiC,IAA7B,wDAA+B,wBAAU;MAEjE,gCAAO,wBAAa,sBAAiB;IACvC;IAEA,yBAAG,6BAAsB;uEACA;IACzB;IAEA,aAAU,iEAAsB;IAChC,aAAU,0FAAiD;IAE3D,yBAAG,iCAA0B;MAC3B,aAAU,wHAEc;IAC1B;IAEA,YAAS,0CAAqB;sFACI;EAEpC;EAGA;uEAC8B;EAC9B;EAGA;QAEQ,+DAAiC;QACjC,8DAAgC;QAChC,w1BAA2D;IAEjE,IAAc,YAAiC;IAG/C,yBAAiB,+DAA0C;IAE3D,yBAAG,4BAAqB;MACtB,eAAY,6EAA+B;;;yMAMN;MACrC;IACF;IAEA,QAAQ,MAAC,aAAa,mBAAc,OAAE,qCAAa;IACnD,QAAQ,MAAC,gBAAa,sBAAS;IAC/B,gCAAO,kBAAY,SAAS;yGAEsB;IAClD;EAEF;EAGA;;;;;;;;;;;;;;QAKQ,kOAAuD;QACvD,sDAAe;QACf,0PAAwD;IAE9D,6CAA2B,2BAAuB;IAElD,0BAAsB;mHAMI;sMAWO;IACjC;6HAM4B;uMAWM;IAClC;IAEA,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAErB;;EAGA;;QAEO,kIAAgD;IAErD,yBAAG,2BAAoB;MACrB,kBAAe,oIAA+E;MAG9F,iBAAgB,GAAb,cAAe,6DAA0B;mCAC1C,aAAe,gBAAW;QAC1B,0BAAG,+CAAkC;UACnC,kBAAe,yJACmD;QACpE;MACF;IACF;IAEF;;EAGA;;IACE,kBAAgB,kBAAa;IAC/B;;EAGA;;IACE,aAAW,kBAAa;IAC1B;;EAGA;;;;;IAEE,iBAAiB,GAAd,eAAgB,uBAAU,yBAAG,mBAA0B;;IAE1D;IAEA,WAAS,kBAAa;IAExB;;EAGA;;;IACE,4CAAO,2BAAyB;IAChC,6HAAsD;EACxD;EAGA;;;;;;;;;0MAU8B;EAE9B;AACF","file":"zcl_abapgit_gui.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_asset_manager.clas.mjs":{"lineLengths":[53,42,37,32,57,68,1027,274,1463,247,17,42,22,929,3,29,64,16,3,18,50,3,25,158,101,28,3,31,70,50,73,165,54,63,297,118,66,41,9,185,134,202,41,17,22,44,77,13,16,20,9,7,72,24,7,29,11,187,136,108,43,19,24,46,80,75,15,18,22,11,9,74,26,9,72,35,100,9,60,24,7,31,642,697,86,68,125,114,9,59,182,9,24,7,60,869,719,85,37,115,9,25,7,60,642,70,62,719,78,67,70,31,43,56,161,9,74,24,7,65,72,70,62,81,95,642,93,92,156,9,126,201,9,124,24,7,65,70,62,71,65,108,77,107,60,80,73,71,73,71,691,146,39,51,53,56,124,63,121,9,126,83,7,5,82,719,954,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_asset_manager.clas.abap"],"names":[],"mappings":";;AA2CA;;;;;;;;;;;;;;;;;EAGE;;;;;;IAEA;;EAGA;;;;QAEQ,4JAAyB;QACzB,6CAA8B;QAC9B,sDAAgB;QAChB,gSAAuC;QACvC,6GAAgC;IAEtC,MAAM,MAAC,WAAQ,qCAAI;IACnB,MAAM,MAAC,WAAQ,YAAY;;;;;;;;;;;;;;;MAa3B,yBAAG,eAAE,MAAC,iBAAoB;QACxB;MACF;MAEA,YAAU,SAAS;;;;;;;;;;;;;;;;QAYnB,yBAAG,eAAE,MAAC,iBAAoB;UACxB;QACF;;;UAGE,sCAAY,UAAS,SAAS,MAAC,gBAAU,QAAqB;QAChE;QACA,aAAW,qCAAiB;QAE9B;;MAGA;;;;QAEE,kCAAmB,gBAAkB,QAAQ;QAC7C,yBAAG,QAAQ,MAAC,SAAmB,yBAAI,cAAc,MAAC,qBAAwB;UAExE,QAAQ,MAAC,cAAU,0EAA0C;QAC/D;QACA,yBAAG,QAAQ,MAAC,SAAkB;qLACsD;QACpF;QAEF;;MAGA;;QAEE,IAAc,QAAqC;;;UAGjD,iCAAO,4DAAwB,SAAS;QAC1C;QAEF;;MAGA;;;;QAEE,IAAc,QAAqC;QAEnD;;;;yCAAmE;QACnE,0BAAG,mBAAsB;gKAC4C;QACrE;QACA,cAAW,kDAAoB;QAEjC;;MAGA;;;;;;YAEO,qnBAAwD;QAC7D,cAAW,qEAAiD;QAE5D,iBAAiB,GAAd,QAAQ,MAAC,OAAQ,wCAAM;2JACsC;QAChE;QAEA,yBAAG,4BAAiC,iBAAqB,GAAjB,QAAQ,MAAC,UAAW,kBAAiB;wMACQ;QACrF;QAEA,cAAW,oGAA+D;QAE5E;;MAGA;;;;;;;;;;;;;;YAEO,sqBAAuC;QAE5C;QACA,QAAQ,MAAC,SAAe,MAAM;QAC9B,QAAQ,MAAC,eAAe,YAAY;QACpC,QAAQ,MAAC,kBAAe,WAAW;QACnC,yBAAG,oBAAwB;UACzB,QAAQ,MAAC,cAAU,oFAAmD;QACxE,gCAAO,oBAAwB;UAC7B,QAAQ,MAAC,cAAU,iFAAmD;QACxE;;QAIA,gCAAO,kBAAY,sBAAiB;MAEtC;IACF","file":"zcl_abapgit_gui_asset_manager.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_buttons.clas.mjs":{"lineLengths":[53,36,31,32,51,37,25,184,167,164,160,165,164,169,17,42,22,3,29,64,16,3,20,46,3,27,74,93,26,3,24,50,3,31,74,96,26,3,16,42,3,23,74,103,26,3,23,49,3,30,74,98,26,3,22,48,3,29,74,109,26,3,21,47,3,28,74,102,26,3,20,46,3,27,74,94,26,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_gui_buttons.clas.abap"],"names":[],"mappings":";;AAiCA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;IACE,mBAAiB,oEAAuC;IAC1D;;EAGA;;;;;IACE,mBAAiB,uEAA0C;IAC7D;;EAGA;;;;;IACE,mBAAiB,8EAAiD;IACpE;;EAGA;;;;;IACE,mBAAiB,yEAA4C;IAC/D;;EAGA;;;;;IACE,mBAAiB,oFAAuD;IAC1E;;EAGA;;;;;IACE,mBAAiB,6EAAgD;IACnE;;EAGA;;;;;IACE,mBAAiB,qEAAwC;IAC3D;;AACF","file":"zcl_abapgit_gui_buttons.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_component.clas.mjs":{"lineLengths":[53,38,33,32,53,37,245,285,280,246,229,241,62,17,42,22,148,63,3,29,64,16,3,24,147,53,98,5,46,27,3,41,123,61,198,3,39,158,88,158,59,45,12,11,62,19,80,17,16,18,9,7,5,130,3,29,40,34,3,33,148,94,148,61,49,12,11,64,19,80,17,16,18,9,7,5,238,3,1,70,225,68,78,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_gui_component.clas.abap"],"names":[],"mappings":";;AA+CA;;;;;;;;;;;;;;;;;;;;;EAGE;;IACE,yBAAG,qBAA4B;MAC7B,0BAAkB,gEAA2C;IAC/D;IACA,oBAAkB,oBAAe;IACnC;;EAGA;;;qMAG6B;EAC7B;EAGA;;;QAEO,qJAA0D;IAE/D,yBAAG,2BAAyB;MAC1B,qBAAmB,gBAAgB;IACrC;MACE;mCACI,kBAAoB,OAAE;;;;;;;MAG1B;IACF;iIAE2D;EAE7D;EAGA;uCAC2B;iCACN;EACrB;EAGA;;;QAEO,2IAAsD;IAE3D,yBAAG,6BAA2B;MAC5B,uBAAqB,kBAAkB;IACzC;MACE;mCACI,oBAAsB,OAAE;;;;;;;MAG5B;IACF;6OAEkG;EAEpG;AACF","file":"zcl_abapgit_gui_component.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_css_processor.clas.mjs":{"lineLengths":[53,42,37,32,57,37,256,340,767,757,251,156,159,17,42,22,159,263,3,25,66,58,68,3,29,158,88,48,16,3,39,536,69,67,75,52,79,73,67,120,114,311,98,131,109,77,61,24,93,53,116,117,81,92,75,9,7,52,5,24,3,19,69,250,70,540,543,98,347,102,72,35,184,92,80,46,93,92,87,9,7,72,5,175,44,125,5,70,39,77,46,210,7,5,123,21,3,40,76,88,536,73,85,62,76,343,349,63,33,74,77,27,50,88,61,24,20,53,139,92,111,69,45,80,83,33,56,214,16,16,9,7,52,12,173,5,3,1,78,332,557,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_css_processor.clas.abap"],"names":[],"mappings":";;AA+CA;;;;;;;;;;;;;;;;;EAGE;;;IACE,gCAAO,gBAAU,aAAQ;EAC3B;EAGA;;;IACE,0BAAmB,gBAAgB;IACrC;;EAGA;;;;QACa,kEAA4D,CAAA;;QAC5D,sEAAyE,CAAA;;QAC9E,0DAAuB;QACvB,+GAAuC;QACvC,yGAAqC;QACrC,8SAAqC;;IAK3C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,yBAAI,kBAAsB;;MAIxC,gBAAa,qDAA0C;MACvD,oBAA+B,IAAzB,qCAA2B;;;;QAC/B,WAAW,MAAC,WAAO,8EAA6B;QAChD,WAAW,MAAC,YAAQ,8EAA6B;QACjD,sEAA0C;QAC1C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,+DAA0C;QAC5C;MACF;;IACF;IACF;;EAGA;;QAEQ,iPAAiD;QACjD,6DAA+B;QAC/B,mhBAAoC;QACpC,shBAAoC;IAC1C,IAAe,UAA6B;IAA5C,IACe,mBAAkD;IADjE,IAEe,cAA0C;;;MAIvD,gBAAa,gKAEgB;MAE7B,yBAAsB,2DAAoC;;;QAGxD,kFAAoD;QACpD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,2EAAoD;QACtD;MACF;MAEA,gCAAO,oBAAc,WAAW;IAClC;;;4HAK0E;IAC1E;;;;;QAKI,uMAEoC;MACtC;IACF;IAEA,cAAY,8BAAiB,OAAQ,aACR,KAAM,uCAAwB,SAAS;IACtE;;EAGA;;;;;QACa,4EAAiE,CAAA;;QACtE,mEAA6B;IACnC,IAAe,eAA6C;IAA5D,IACe,qBAA6C;IAE5D;;;;;gDAAsF;IACtF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;;;;QAKX,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;8GAEuD;UACpE;;;;;sDAA4F;UAC5F,yMAEsC;QACxC;UACE;QACF;MACF;;IACF;4KACqF;IACrF;EACF;AACF","file":"zcl_abapgit_gui_css_processor.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_event.clas.mjs":{"lineLengths":[53,34,29,32,49,60,230,213,168,169,427,246,180,677,948,784,17,42,22,133,137,148,150,409,232,170,3,29,147,85,47,64,48,67,328,73,68,86,58,60,58,138,5,16,3,30,137,387,67,227,136,68,37,105,5,25,3,20,44,3,27,133,147,85,47,64,48,67,328,73,194,23,3,43,137,50,201,45,5,41,25,3,39,137,46,185,41,5,37,25,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_event.clas.abap"],"names":[],"mappings":";;AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;IAGE,+CAAwC,eAAe;IACvD,yCAAwC,4BAAU,WAAW;IAC7D,0CAAwC,UAAU;IAClD,2CAAwC,WAAW;IAEnD,yBAAG,0BAAwB;MACzB,qDAA6C,6EAAyC;IACxF;IAEF;;EAGA;;;;IACE,IAAc,YAAiC;;;;wGAMhB;IAC/B;IACF;;EAGA;;;;;;;;;;;;;;IAOA;;EAGA;;IAEE,yBAAG,kBAAyB;MAC1B,uBAAe,0KAC6E;4CACrE;IACzB;IACA,kBAAgB,iBAAY;IAE9B;;EAGA;;IAEE,yBAAG,cAAqB;MACtB,mBAAW,8JACwE;wCAChE;IACrB;IACA,kBAAgB,aAAQ;IAE1B;;AACF","file":"zcl_abapgit_gui_event.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_hotkey_ctl.clas.mjs":{"lineLengths":[89,53,39,68,32,54,120,208,954,1408,180,158,1154,197,56,17,12,42,22,74,878,1332,104,80,3,29,31,153,16,3,31,123,877,70,67,593,50,69,38,90,85,7,200,5,81,79,188,142,19,3,28,57,3,35,99,97,41,79,5,18,3,54,884,561,81,80,91,69,80,29,3,61,888,47,33,3,60,877,70,593,69,38,129,91,29,64,90,99,7,190,17,7,79,5,3,44,43,3,55,103,70,36,3,45,123,67,888,69,1331,593,35,79,96,111,117,115,80,38,438,5,148,93,399,404,5,99,37,78,107,110,27,83,88,48,5,89,52,148,5,362,128,344,5,49,19,3,1,72,129,99,67,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_hotkey_ctl.clas.abap"],"names":[],"mappings":";;;AAsCA;;;;;;;;;;;;;;;;;;;;;;EAGE;8BAEuB;IAErB,2BAAmB,wHAA8D;IAEnF;;EAGA;;;;QAEO,0DAAmB;IAExB,IAAe,aAAmC;IAElD,YAAU,gCAAG;;;MAIX,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,kCAAU,yCAAc;MAC1B;MAEA,kCAAU,8JAAmE;IAE/E;IAEA,kCAAU,QAAW,iCAAG;;2LAGmE;6IAC7C;IAEhD;;EAGA;;;;;IACE,iBAAqB,GAAlB,8CAAoB,wBAAU;MAC/B,WAAS,sBAAS;MAClB,iDAAoB,sBAAS;IAC/B;IACF;;EAGA;;QAEO,wiBAAwC;IAE7C,SAAS,MAAC,kBAAe,0CAAS;IAClC,SAAS,MAAC,YAAe,+CAAoB;IAC7C,SAAS,MAAC,iBAAe,qDAAmB;IAC5C,SAAS,MAAC,YAAe,oCAAG;IAC5B,yEAA6C;IAE/C;;EAGA;;IACE,0BAAwB,eAAU;IACpC;;EAGA;;;IAEE,IAAc,aAAmC;;;MAI/C;;;8DAAiF;MACjF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;MAEf;MAEA,iBAAwC,GAApC,qBAAgB,MAAC,qBAAqB,uBAC1C,iBAAwC,GAApC,qBAAgB,MAAC,gBAAqB,aAAW,MAAC,QAAM;QAE1D;MACF;MAEA,gCAAO,uBAAe,eAAU;IAClC;EAEF;EAGA;IACE,sBAAM,eAAU;EAClB;EAGA;;;IAEE,oBAAa,UAAU;EAEzB;EAGA;;QAGI,0DAAiC;QACjC,+2BAAyE;QACzE,4DAAiC;QACjC,0yCAAsE;IAExE,IAAc,aAA8C;kCAExC;;IAIpB,2BAAwB,+DAAoD;IAC5E;oHAEmE;kHAG7B;;;qbAKtB;IAChB;IAGA,sBAAmB,wHAA8D;IACjF,iBAAuC,GAApC,gBAAgB,MAAC,qBAAqB,uBAAS;8YAIjC;mZAIA;IACjB;kGAEuB;IAEvB,sBAAM,SAAS;IAEf;;;;iFACwC;IACxC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,cAAY,aAAW,MAAC,OAAM;IAChC;IAEA,mFAAoD;IACpD,yBAAG,oBAAwB;MACzB,kCAAU,0GAA+C;IAC3D;IAEA,aAAU,uVAMiB;IAE3B,yBAAG,oBAAyB,iBAAwB,IAApB,gCAAsB,uBAAS;uVAG9C;IACjB;IAIA,oBAAa,uBAAU;IAEzB;;AACF","file":"zcl_abapgit_gui_hotkey_ctl.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_html_processor.clas.mjs":{"lineLengths":[53,43,38,32,58,69,367,231,153,156,152,151,589,303,272,247,165,17,42,22,270,155,76,82,74,70,3,29,154,76,40,16,3,29,99,70,70,120,77,26,50,114,18,3,27,67,61,67,58,265,70,69,84,67,115,120,71,69,62,62,62,72,83,172,35,39,71,135,125,59,22,91,51,103,107,58,58,146,255,54,75,7,5,50,147,99,330,96,5,105,3,29,70,70,79,3,55,67,67,61,147,85,154,265,72,98,90,99,140,72,37,68,7,65,314,5,19,3,33,67,67,61,212,72,135,74,143,7,5,23,3,1,80,99,70,102,93,98,59,96,56,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_html_processor.clas.abap"],"names":[],"mappings":";;AAsDA;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;IACE,sBAAe,YAAY;IAC7B;;EAGA;;;;IACE;;;gDAAkF;IAClF,WAAS,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAChC;;EAGA;;;;;;;QAEY,4DAAwF,CAAA;;QAE7F,0DAAkB;QAClB,0GAAqC;QACrC,+GAAuC;QACvC,8DAAuB;QACvB,4DAAuB;QAEvB,qDAAa;QACb,qDAAa;QACb,qDAAa;QAEb,+DAA2F,CAAA;;IAChG,qKAA+E;IAE/E,sBAAO,OAAO;IAAd,sBAAgB,WAAW;IAE3B,iBAAc,gDAA2B;;IAOzC,gBAAa,uGAAgF;IAC7F,oBAA+B,IAAzB,qCAA2B;;;;MAC/B,iBAAc,8EAA6B;MAC3C,iBAAc,GAAX,0BAAa,oDAA2B;QACzC,YAAS,oCAAyB;QAClC,YAAS,oCAAyB;QAClC,kCAAU,QAAW,wBAAW,KAAM,SACN,KAAM,QACN,KAAa,qBAAP,OAAS,UAAQ;QACvD,kCAAU,8BAAW,qEAAmB,wBAAW,KAAM,SACN,KAAM,QACN,KAAM,SAAY,+CAAa;QAClF,WAAiB,mBAAP,OAAS,OAAM;QACzB,gCAAO,qBAAe,WAAW;MACnC;IACF;;IAEA,kCAAU,QAAW,wBAAW,KAAM,SACN,KAAM,QACN,KAAkB,qBAAZ,YAAc,UAAQ;IAC5D,iBAAwB,GAArB,yBAAO,eAAgB,gCAAC;MACzB,oCAAY,uCAAwB,8BAC/B,0DACA,yEACA,uCAAwB,QACxB,uCAAM;MACX,kCAAU,8BAAW,UAAa,cAAY;IAChD;IACA,kCAAU,QAAW,wBAAW,KAAM,SACN,KAAM,cAAa;EAErD;EAGA;;;IACE,gCAAO,oBAAc,oBAAe;EACtC;EAGA;;;;;;QAEO,iJAA0D;QAC1D,gQAA6B;QAC7B,+DAAwB;IAE7B,IAAc,UAAiC;yFAOhB;IAE/B,iBAAwB,GAArB,yBAAO,eAAgB,gCAAC;;;;mEAMe;MACxC;MAEA,kBAAe,uCAA4B;yTAMd;IAC/B;IAEF;;EAEA;;;;IAEE,gBAAc,mBAAM,KAAM,SACN,8HACA,MAAO,yBAAY;IACvC,iBAAe,GAAZ,aAAe,gCAAC;MACjB,gBAAc,mBAAM,KAAM,SACN,+CACA,MAAO,yBAAY;MACvC,iBAAe,GAAZ,aAAe,gCAAC;8IACqD;MACxE;IACF;IAEF;;AAEF","file":"zcl_abapgit_gui_html_processor.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_in_page_modal.clas.mjs":{"lineLengths":[53,42,37,32,57,65,242,265,644,447,17,42,22,145,188,3,29,144,64,64,64,65,67,44,46,32,16,3,23,55,3,30,145,144,64,64,64,65,67,154,19,3,45,123,138,79,89,68,136,5,69,138,5,193,114,122,96,96,123,19,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_gui_in_page_modal.clas.abap"],"names":[],"mappings":";;AAsCA;;;;;;;;;;;;;;EAGE;;;;;;;IAEE,aAAQ,MAAC,WAAS,QAAQ;IAC1B,aAAQ,MAAC,YAAS,SAAS;IAC3B,kBAAkB,QAAQ;IAE5B;;EAGA;;;;;;;;;;;;IAMA;;EAGA;;QAEO,iIAA8C;;;IAKnD,yBAAG,aAAQ,MAAC,iBAAoB;uIACgB;IAChD;IACA,yBAAG,aAAQ,MAAC,kBAAqB;yIACiB;IAClD;gMAEqF;iHAC3C;yHACP;+FACX;+FACA;0HAC2B;IAErD;;AACF","file":"zcl_abapgit_gui_in_page_modal.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_jumper.clas.mjs":{"lineLengths":[53,35,30,32,50,61,25,844,972,1284,973,17,42,22,3,29,64,16,3,24,100,597,61,106,79,100,51,52,41,41,9,188,136,214,161,180,62,23,7,17,78,23,14,16,7,5,9,188,136,216,163,175,17,78,190,138,218,165,151,14,16,7,5,25,19,3,24,100,597,61,63,65,47,49,9,193,142,235,41,17,22,44,78,61,13,16,20,9,7,117,21,5,26,102,599,63,108,81,11,187,136,258,43,19,24,46,75,82,63,15,18,22,11,9,119,23,7,33,104,601,65,63,89,62,89,74,86,110,83,163,15,191,140,307,47,23,28,50,79,86,67,19,22,26,15,13,123,11,25,9,50,106,603,67,607,79,76,88,112,85,113,184,133,11,165,65,27,11,221,65,27,11,94,65,27,11,64,65,27,11,94,25,9,58,102,79,107,64,249,70,116,70,64,97,60,49,125,45,78,15,161,47,23,28,50,90,80,88,81,67,19,22,26,15,13,54,56,77,187,13,170,11,56,108,605,69,67,93,78,90,120,191,79,19,206,52,27,116,24,26,17,15,13,27,11,64,86,72,289,78,114,87,115,58,73,19,203,152,182,51,27,32,54,85,92,87,71,23,26,30,19,17,22,21,205,154,184,53,29,34,56,73,25,28,32,21,19,17,60,145,218,152,182,17,15,13,76,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/jump/zcl_abapgit_gui_jumper.clas.abap"],"names":[],"mappings":";;AA8CA;;;;;;;;;;;;;;;;;EAGE;;;;;;QAGI,2FAAuB;QACvB,0CAAwB;QACxB,2CAAyB;IAE3B,aAAW,OAAO,MAAC,SAAQ;IAC3B,aAAW,OAAO,MAAC,SAAQ;IAE3B;;;;;;MAQI,iBAAW,GAAR,SAAU,wBAAU;QACrB;MACF;;;;;;;IAIJ;IAEA;;;;;;;;;;;;;;;;IAiBA;IAEA,YAAU,OAAO;IAEnB;;EAGA;;;;QAGI,sDAAiC;QACjC,wDAAmC;IAErC,mBAAmB,OAAO,MAAC,SAAQ;IACnC,qBAAmB,OAAO,MAAC,SAAQ;;;;;;;;;;;;;;;;MAYnC,YAAU,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;MAEjC;;IAGA;;;;;;;;;;;;;;;;;;;;;;QAcE,YAAU,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;QAEjC;;MAGA;;;;;;;;;;;;QAEE,yBAAG,yBAA8B,yBAAI,0BAA+B,yBAAI,0BAA8B;;;;;;;;;;;;;;;;;YAkBpG,YAAU,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;UAEjC;UAEF;;QAGA;;;;;;;;;;;UAGE,iBAAkE,IAA/D,+HAAiE,uBAAS;oIACd;UAC/D;UAKA,aAAU,4IAG0B;UAEpC,iBAAW,GAAR,SAAU,uBAAS;YACpB;UACF;UAGA,aAAU,oMAKyB;UAEnC,iBAAW,GAAR,SAAU,uBAAS;YACpB;UACF;UAGA,aAAU,qEAEuB;UAEjC,iBAAW,GAAR,SAAU,uBAAS;YACpB;UACF;UAGA,aAAU,uCAAkB;UAE5B,iBAAW,GAAR,SAAU,uBAAS;YACpB;UACF;UAGA,aAAU,qEAEuB;UAEnC;;QAGA;;;;;cAEO,0OAAkD;cAClD,uDAAuC;cACvC,qGAA8B;cAC9B,uDAAgC;cAChC,iDAA2B;UAIhC,cAAW,uEAAkD;UAE7D,qBAAmB,eAAE,MAAC,MAAK;;UAG3B,SAAS,MAAC,WAAS,wCAAyB,+CAAuB;UACnE,SAAS,MAAC,YAAS,MAAM;UACzB,iEAAqC;;;;;;;;;;;;;;;;;YAgBrC,aAAW,eAAE,MAAC,MAAK;;YAInB,iBAAY,GAAT,UAAY,gCAAC;0LAC2E;YAC3F;YAEA,2JAAoD;UAEtD;UAGA;;;;;;;;gBAIO,uGAAkC;YAEvC,yBAAsB,wJAA8E;YAEpG,iBAAuB,GAApB,qBAAsB,uBAAS;cAChC;6MAKwC;gBAEpC,YAAU,sBAAS;;;;;;cAGvB;YACF;YAEF;;UAGA;;;;;;;;gBAEO,yCAAuB;YAE5B,iBAAiB,GAAd,eAAgB,uBAAS;;;;;;;;;;;;;;;;;;cAa5B;;;;;;;;;;;;;;;gBASA;gBAEA,IACE,OAEA,KAHG,eAAE,MAAC,MAAR;;yNAEgG;;qLAEZ;;cAGtF;YACF","file":"zcl_abapgit_gui_jumper.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page.clas.mjs":{"lineLengths":[89,53,33,62,32,48,153,1151,208,207,169,285,360,214,228,224,210,318,222,235,228,227,229,212,171,214,219,56,17,12,42,22,1054,132,131,93,60,3,29,31,143,93,16,3,23,123,67,61,79,112,119,119,322,201,99,114,113,254,272,100,199,99,134,108,100,19,3,31,70,158,91,163,109,12,108,5,97,43,111,94,130,94,127,95,12,98,5,132,22,3,36,123,61,131,77,178,5,3,40,123,61,156,158,163,66,97,162,106,169,5,78,202,5,3,21,123,79,100,162,155,117,59,55,70,88,137,95,146,5,101,19,3,47,123,61,137,93,313,161,397,100,3,40,123,61,157,113,129,97,3,38,123,61,76,88,335,123,161,67,29,68,5,3,36,123,79,46,21,5,119,118,41,19,3,34,123,156,139,88,19,3,34,123,61,59,77,159,158,143,120,5,3,19,123,79,124,53,59,120,120,19,3,17,123,140,73,54,121,120,5,56,84,125,5,79,112,113,258,258,100,197,55,122,130,102,5,97,68,5,100,19,3,59,103,130,64,32,43,22,3,55,363,134,64,67,129,69,59,7,98,139,69,62,7,98,137,69,60,7,98,5,22,3,42,99,113,18,3,45,123,125,122,35,91,79,110,111,83,166,79,119,88,96,98,129,119,100,42,149,104,70,118,105,5,101,101,19,3,42,102,122,112,118,162,42,9,103,169,17,106,25,14,16,7,5,438,45,5,21,3,1,60,220,66,70,1066,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_gui_page.clas.abap"],"names":[],"mappings":";;;AAkHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;8BAEuB;IACrB,sBAAc,mHAAqD;IACnE,eAAU,MAAC,iBAAc,kCAAa,MAAC,SAAQ;IAEjD;;EAGA;;;;;+GAIqC;sHACO;sHAEA;iUAGwB;wMAE3B;kGAChB;iHAEc;gHACD;6PAEiB;+QAGQ;mGACrC;sMACmE;kGACpE;qIAEkC;2GAE1B;mGACP;IAE1B;;EAGA;;QAEO,qJAA0D;IAE/D,eAAa,oCAAqB,kCAAc;IAEhD,iBAAyD,IAAtD,gHAAwD,uBAAS;MAClE,qCAAa,WAAc,qDAAuB;IACpD;MACE,qCAAa,WAAc,oDAAsB;IACnD;IAEA,sBAAmB,qEAAgD;IAEnE,IACE,OAEA,AAEA,KALG,sBAAL;;MAEI,qCAAa,WAAc,sCAAQ;;MAEnC,qCAAa,WAAc,sCAAQ;;MAEnC,qCAAa,WAAc,uCAAS;;MAGpC,qCAAa,WAAc,0CAAY;;IAI3C,qCAAa,WAAc,8EAA2C;IAExE;;EAGA;;;kIAEwD;IAEtD,yBAAG,eAAU,MAAC,wBAA2B;iLAC8B;IACvE;EAEF;EAGA;;;2JAEiF;6JACE;kKAGK;IACtF,IACE,OAEA,MAHG,4CAAL;;iKAEuF;;wKAEO;;IAI9F,yBAAG,eAAU,MAAC,yBAA4B;yMACqD;IAC/F;EAEF;EAGA;;;mGAI0B;iKAE6D;0JACP;oHAEtC;0DAEN;sDACJ;IAE9B,IACE,OAEA,MAHG,gDAAL;;wIAE8D;;iJAES;;oGAG9C;IAE3B;;EAGA;;;QAEO,gIAAkD;;wTAOyB;gKAEI;4YAIhC;mGAC5B;EAE1B;EAGA;;;4JAEkF;gHAC5C;gIACgB;gGAC/B;EAEvB;EAGA;;;;;QAEO,sUAA2C;QAC3C,kHAA6B;IAElC,cAAW,6IAAiE;;;mEAEnD;IACzB;EAEF;EAGA;;;IASE,yBAAG,cAAqB;MACtB;IACF;IAEA,aAAU,oGAA+D;;IAUzE,sBACE,aAAQ;IAEZ;;EAGA;;QAEO,mJAA2D;+BAEhE,uBAAwB,mFAAmC;IAC3D,aAAU,qEAA+B;IAE3C;;EAGA;;;QAEQ,kDAAgC;IAEtC,sBAAmB,iDAAiC;IAEpD,iBAA0C,IAAvC,wDAAyC,uBAAU,yBAAI,2BAA+B;6JAE3B;8IACS;uHACvB;IAEhD;EAEF;EAGA;;;2HAM6C;oDAEf;0DACM;uHACc;uHACA;IAElD;;EAGA;;QAEO,mIAAsC;QACtC,gEAAyB;IAE9B,iBAAe,eAAU,MAAC,UAAS;IACnC,yBAAG,aAA0B,yBAAI,eAAU,MAAC,8BAA2B;MACrE,kBAAe,8FAA0C;IAC3D;IAEA,kBAAgB,eAAU,MAAC,WAAU;IACrC,yBAAG,eAAU,MAAC,+BAA4B;MACxC,mBAAgB,kGAAiD;IACnE;;+GAImC;gHAEC;iQAGG;iQAGA;mGACf;oMAE6E;IAErG,yBAAG,uBAAqB;yHACqB;iIACiB;qGACpC;IAC1B;IAEA,iBAAqC,IAAlC,8CAAoC,uBAAS;mEACL;IAC3C;mGAEwB;IAE1B;;EAGA;;;;IAEE,kBAAW,QAAQ;IACnB,eAAa,sBAAS;IAExB;;EAGA;;;;IAEE,IACE,OAOA,AAOA,KAfG,QAAQ,OAAE,+BAAf;;MAGI,yBAAG,mCAA4B;0DACM;MACrC;MACA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;MAI7D,yBAAG,mCAA4B;6DACS;MACxC;MACA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;MAI7D,yBAAG,mCAA4B;2DACO;MACtC;MACA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;IAInE;;EAGA;;IACE,WAAS,gCAAgC,GAAzB,eAAU,MAAC,gBAAgB,uBAAlC,CAA6C;IACxD;;EAGA;;QAGI,oHAAsC;QACtC,iHAAuC;kCAErB;IAEpB,cAAW,uEAAsC;;6GAKhB;8GACC;kFACN;qKAC+B;8EAEnC;sHAEkB;uFAET;+FAEQ;iGACE;gIAIK;sHAEN;mGAElB;IAExB,eAAY,qBAAU;IAEtB,yBAAG,oBAAmB,iBAA2B,IAAvB,oDAAyB,wBAAU;uGACjC;qEACD;qHACc;wGACZ;IAC7B;oGAEyB;oGACA;IAE3B;;EAGA;;QAGI,iHAAuE;QACvE,uGAAkE;QAClE,6GAAqE;QACrE,yJAA8D;IAMhE,cAAY,sBAAS;IAErB;MACI,0BAAuB,qEAAgD;wKAK7B;;;;;;;IAI9C;IAEA,iBAAkB,GAAf,gBAAkB,wCAAO,iBAAc,GAAV,WAAa,qCAAI,iBAAiB,GAAb,cAAgB,sCACrE,iBAAkB,GAAf,gBAAkB,wCAAO,iBAAc,GAAV,WAAa,qCAAI,iBAAiB,GAAb,cAAgB,qCAAG;MACtE,cAAY,uBAAU;IACxB;IAEF;;AACF","file":"zcl_abapgit_gui_page.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_addofflin.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,223,218,533,487,430,226,57,231,56,17,12,42,22,130,137,147,142,52,58,3,25,73,73,119,167,121,3,29,31,100,95,53,111,16,3,18,51,3,25,143,152,98,184,19,3,27,129,246,3107,19,3,30,141,136,76,128,98,134,11,462,19,108,24,157,16,18,9,7,5,634,292,5,9,166,17,106,22,154,14,16,7,5,29,3,55,363,134,64,953,147,143,67,91,94,105,355,141,98,98,14,100,7,105,289,141,98,98,14,100,7,104,33,96,107,96,101,78,129,169,107,14,98,7,5,22,3,45,123,35,79,123,167,100,19,3,1,80,479,57,65,75,63,87,79,432,68,82,80,82,86,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_addofflin.clas.abap"],"names":[],"mappings":";;;AAoEA;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;QAGI,gEAAyB;QACzB,gEAAyB;IAE3B,mBAAgB,8FAAgC;IAEhD,mBAAgB,8IAA8E;wHAIpE;EAE5B;EAGA;8BACuB;;;IAGrB,kBAAU,6BAAkB;IAC5B,uBAAe,kFAA8C;IAC/D;;EAGA;;;;;QAEO,+IAAuD;;IAI5D,aAAU,qKAE2B;IAEvC;;EAGA;;IAEE,aAAU,mOAEwE;kiGAmD9C;IAEtC;;EAGA;;;;QAEO,uHAAwC;IAE7C,uBAAoB,qEAAsC;IAE1D,0BAAG,qGAAgD;MACjD;6cAG0E;;;;;;;;MAK1E;IACF;IAEA,iBAA0C,IAAvC,iGAA0C,wCAAyB,sCAAc,MAAC,QACjF,iBAA2C,IAAvC,iGAA0C,wCAAyB,sCAAc,MAAC,MACtF,iBAA2C,IAAvC,iGAA0C,wCAAyB,sCAAc,MAAC,OAAK;mSAGf;IAChF;IAEA;qKACyE;;;;;;;;IAKzE;IAEF;;EAGA;;;;QAEQ,g7BAAkE;QAClE,0IAAwD;IAE9D,uBAAe,kHAAiD;IAEhE,IACE,OAGA,AAaA,AAYA,AAKA,KAlCG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;kWAOW;MACpE,0BAAG,0GAAgD;QACjD,4BAAoB,4DAA6B;QACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;;gSAMyF;MACzF,0BAAG,0GAAgD;QACjD,4BAAoB,4DAA6B;QACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;;gCAIgB;MAChB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAI3D,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;6EACoB;QAC/D,yBAAsB,8FAAwD;QAC9E,UAAU,MAAC,WAAQ,oIAAyE;QAC5F,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,mBAAkB;MACtE;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;;IAIN;;EAGA;;kCAEsB;;0HAI0B;sKAGH;mGACnB;IAE1B;;AACF","file":"zcl_abapgit_gui_page_addofflin.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_addonline.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,223,218,664,553,430,226,57,231,56,17,12,42,22,130,137,147,142,52,58,3,25,73,73,119,167,121,3,29,31,100,95,53,111,16,3,18,51,3,25,143,152,98,183,19,3,27,129,244,3870,19,3,30,141,136,76,66,124,128,98,104,49,11,132,85,58,19,108,24,153,16,18,9,7,5,134,11,462,19,108,24,157,16,18,9,7,5,634,292,5,9,166,17,106,22,154,14,16,7,5,29,3,55,363,134,64,953,144,143,67,91,94,105,355,141,98,98,14,100,7,105,289,141,98,98,14,100,7,104,96,151,174,98,26,7,342,135,100,14,401,98,7,104,33,96,106,96,101,78,127,168,107,14,98,7,5,22,3,45,123,35,79,123,167,100,19,3,1,80,610,57,65,73,75,63,75,87,79,498,68,82,82,80,80,84,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_addonline.clas.abap"],"names":[],"mappings":";;;AAuEA;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;QAGI,gEAAyB;QACzB,gEAAyB;IAE3B,mBAAgB,8FAAgC;IAEhD,mBAAgB,8IAA8E;wHAIpE;EAE5B;EAGA;8BACuB;;;IAGrB,kBAAU,6BAAkB;IAC5B,uBAAe,kFAA8C;IAC/D;;EAGA;;;;;QAEO,+IAAuD;;IAI5D,aAAU,oKAE2B;IAEvC;;EAGA;;IAEE,aAAU,iOAEuE;6xHA+D7C;IAEtC;;EAGA;;;;QAGI,yDAAkB;QAClB,mHAAsC;QACtC,uHAAwC;IAE1C,uBAAoB,qEAAsC;IAE1D,YAAS,sFAA6B;IACtC,yBAAG,iBAAqB;MACtB;mIACiE;;yDAI/B;;;;;;;;MAKlC;IACF;IAEA,0BAAG,qGAAgD;MACjD;6cAG0E;;;;;;;;MAK1E;IACF;IAEA,iBAA0C,IAAvC,iGAA0C,wCAAyB,sCAAc,MAAC,QACjF,iBAA2C,IAAvC,iGAA0C,wCAAyB,sCAAc,MAAC,MACtF,iBAA2C,IAAvC,iGAA0C,wCAAyB,sCAAc,MAAC,OAAK;mSAGf;IAChF;IAEA;qKACyE;;;;;;;;IAKzE;IAEF;;EAGA;;;;QAEQ,g7BAAiE;QACjE,uIAAsD;IAE5D,uBAAe,kHAAiD;IAEhE,IACE,OAGA,AAaA,AAYA,AA0BA,AAKA,KA5DG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;kWAOW;MACpE,0BAAG,0GAAgD;QACjD,4BAAoB,4DAA6B;QACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;;gSAMyF;MACzF,0BAAG,0GAAgD;QACjD,4BAAoB,4DAA6B;QACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;;MAIA,4BAAoB,4DAA6B;MACjD,iBAAsC,IAAnC,kGAAqC,uBAAS;6KAGhB;QAC/B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;QAC3D;MACF;qVAG2G;MAE3G,0BAAG,oGAAgD;QACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;gZAMmB;QACjB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;;gCAIgB;MAChB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAI3D,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;6EACoB;QAC/D,wBAAqB,6FAAuD;QAC5E,UAAU,MAAC,WAAQ,mIAAwE;QAC3F,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,mBAAkB;MACtE;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;;IAIN;;EAGA;;kCAEsB;;0HAI0B;sKAGH;mGACnB;IAC1B;;AACF","file":"zcl_abapgit_gui_page_addonline.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_code_insp.clas.mjs":{"lineLengths":[99,53,43,77,32,58,296,220,186,245,62,220,210,216,67,58,522,202,82,78,17,12,42,22,123,109,3,38,108,152,49,130,5,28,3,22,135,49,48,84,94,5,108,21,5,56,195,12,193,5,19,3,29,119,61,122,64,108,88,31,30,32,48,93,41,36,16,3,35,64,13,5,133,54,75,5,3,33,117,134,97,27,70,132,36,3,33,99,128,18,3,28,112,260,31,3,26,123,79,108,190,96,54,199,21,5,35,152,102,127,157,123,102,12,78,5,19,3,30,153,163,216,98,145,3,55,363,134,64,140,112,67,91,63,85,62,138,101,31,74,92,119,16,140,103,33,76,94,122,18,121,11,9,162,97,14,100,7,99,63,85,146,97,14,100,7,98,38,96,12,97,5,22,3,54,884,568,96,81,92,72,87,82,92,72,87,29,3,45,123,67,67,19,3,1,80,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_code_insp.clas.abap"],"names":[],"mappings":";;;AAmEA;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;IAEE,sBAAmB,4HAAwE;IAE3F,yBAAG,iBAA2B;iIACoC;IAClE;IAEF;;EAGA;;QAEQ,wCAAsB;IAE5B,aAAU,6BAAkB;IAE5B,iBAAuB,IAApB,gCAAsB,wBAAU;MACjC,WAAS,iCAAkB,2BAAU,MAAC,SAAQ;IAChD;IAEA,iBAA0B,IAAvB,yDAAyB,uBAAS;MACnC;IACF;IAEA,yBAAG,wBAAiB;kMAQa;IAEjC;gMAKiC;IAEjC;IAEF;;EAGA;;;;;;;8BACuB;IACrB,iBAAU,OAAO;IACjB,kBAAW,QAAQ;IACnB,0BAAmB,gBAAgB;IACnC,eAAU,MAAC,gBAAa,kDAAgB;wCACd;mCACL;IACvB;;EAGA;IAEE,yBAAG,gCAA+B;MAChC;IACF;IAEA,4BAAmB,uEAA+B,4BAA4B;IAE9E,yBAAG,sBAA2B;MAC5B,2BAAmB,wCAA6B;IAClD;EAEF;EAGA;;IAEE;;;oEACwC;IACxC,6BAA2B,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAElD;;EAGA;;IACE,WAAS,gCAA0B,GAAnB,yBAAO,kBAAc,gCAA5B,CAA+B;IAC1C;;EAGA;;IAEE,wBAAsB,mBAAO,CAAI,cAA8C,KAA5C,uEAA+B,cAAe,uBAC1C,iBAA6B,IAAzB,qCAA2B,uBAAU,CAD1D,CAC6D;IAErF;;EAGA;;;2GAIsC;6LAEqD;+FACjE;IAExB,yBAAG,sBAA2B;sMACsE;MAClG;IACF;kCAEoB;uJAIS;IAE7B,iBAAsB,GAAnB,yBAAO,kBAAc,gCAAC;8HACyB;4JACR;0HACI;qGACpB;IAC1B;6EAG2B;IAC3B;IAEF;;EAGA;QAEQ,gJAAwD;IAE9D,uBAAoB,sIAAkE;IAEtF,oBAAY,8LAEc;IAE1B,qBAAa,uEAAiC;;EAIhD;EAGA;;;;QAEO,mIAAkD;QAClD,uGAAyD;IAE9D,IACE,OAiCA,AAkBA,KApDG,QAAQ,OAAE,+BAAf;;iCAGI,gBAAkB,YAAO;MAEzB,iBAAuB,IAApB,gCAAsB,uBAAS;6DAEN;QAE1B;;;wEAA+D;QAC/D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,kBAAgB,wCAAyB,oCAAY,MAAC,OAAM;QAC9D;UACE;;;0EAA+D;UAC/D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb,kBAAgB,wCAAyB,oCAAY,MAAC,QAAO;UAC/D;YACE,kBAAgB,wCAAyB,oCAAY,MAAC,OAAM;UAC9D;QACF;;QAOA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;MAE5D;QAEE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAE/D;;iCAIA,gBAAkB,YAAO;MAEzB,iBAAuB,IAApB,gCAAsB,uBAAS;QAEhC,UAAU,MAAC,WAAO,6GAEK;QAEvB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;MAE5D;QAEE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAE/D;;qCAIqB;MACrB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,gBAAa,yEAAyD;;IAG5E;;EAGA;;QAEQ,+iBAA+C;IAErD,gBAAgB,MAAC,kBAAe,kDAAgB;IAEhD,gBAAgB,MAAC,qDAAqB;IACtC,gBAAgB,MAAC,YAAS,wCAAS,MAAC,MAAK;IACzC,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,sDAAsB;IACvC,gBAAgB,MAAC,YAAS,wCAAS,MAAC,MAAK;IACzC,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEtD;;EAGA;;IAEE,eAAU,MAAC,gBAAY,wBAAa;IACpC,aAAU,gDAA2C;IAEvD;;AACF","file":"zcl_abapgit_gui_page_code_insp.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_codi_base.clas.mjs":{"lineLengths":[79,53,43,67,32,58,153,217,1421,147,512,138,146,489,1602,1387,1327,1434,232,83,17,12,42,22,120,1345,71,62,80,60,3,29,64,16,3,27,135,140,92,485,87,101,176,19,3,31,67,1124,67,689,19,3,21,597,61,601,73,70,82,67,61,71,112,70,597,601,1156,54,73,300,343,29,196,12,73,182,205,29,118,5,65,60,60,65,65,183,9,73,53,133,15,7,17,106,14,16,7,5,9,186,134,201,148,112,17,78,149,14,16,7,5,83,62,44,48,3,30,123,61,1344,67,64,22,1156,118,83,38,82,5,100,74,127,173,163,102,5,3,35,123,61,1124,67,68,70,66,63,63,41,75,64,82,67,12,63,5,117,199,157,270,11,73,83,134,90,138,90,123,89,129,87,131,87,134,87,132,16,15,132,47,23,28,50,85,86,67,19,22,26,15,13,96,171,20,166,13,11,21,82,64,18,20,11,9,7,45,270,7,40,133,141,220,139,101,5,33,125,104,72,72,72,81,118,297,98,21,5,57,365,136,66,599,603,69,76,75,78,72,242,85,162,104,104,60,109,109,9,45,102,100,7,69,94,226,98,101,226,98,101,226,98,7,24,5,3,82,460,68,70,70,70,68,70,86,61,93,56,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_codi_base.clas.abap"],"names":[],"mappings":";;;AAyDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;QAGI,mIAAiD;;oeAYtB;;oGAKQ;+KAIF;IAErC;;EAGA;;;;IAEE,2qBAG4C;IAE9C;;EAGA;;;;;;;QAEQ,0DAA+C;QAC/C,oDAAkC;QAClC,8DAAiD;QACjD,uGAAkC;QAClC,6DAA0B;QAC1B,4kBAAyD;QACzD,glBAAyD;IAE/D,IAAe,aAAkC;IAGjD,yBAAG,sBAA0B;MAC3B;;;;kMAK0C;IAC5C;MACE;;;;oHAG0C;IAC5C;IACA,6CAAO,cAAuB;IAC9B,OAAO,MAAC,cAAW,aAAW,MAAC,QAAO;IACtC,OAAO,MAAC,cAAW,aAAW,MAAC,QAAO;IAEtC,WAAW,MAAC,cAAW,aAAW,MAAC,SAAQ;IAC3C,WAAW,MAAC,cAAW,aAAW,MAAC,SAAQ;IAI3C,yBAAsB,wJAA8E;IAEpG;MACI,iBAAuB,GAApB,qBAAsB,uBAAS;QAEhC,mBAAiB,aAAW,MAAC,KAAI;oIAKE;QACnC;MAEF;;;;;;IAEJ;IAEA;;;;;;;;;;;;IAQA;IAEA,eAAY,8DAA4C;IAExD,kCAAmB,eAAe,OAAO;2CAEX;+CACG;EAEnC;EAGA;;;;;QAEa,uDAAyB,CAAA;;IACpC,IAAe,aAAkC;qHAER;;;iFAKZ;IAC7B;mGAEwB;IAExB,iBAAsB,GAAnB,yBAAO,aAAc,SAAQ;8HACkB;4KACO;kKACU;qGACzC;IAC1B;EAEF;EAGA;;;;;QAEQ,2DAAsB;QACtB,6DAAsB;QACtB,yDAAsB;QACtB,sDAAiB;QACjB,sDAAyB;IAE/B,IACE,OAEA,KAHG,SAAS,MAAC,KAAf;;MAEI,aAAW,2CAAU;;MAErB,aAAW,8CAAY;;MAEvB,aAAW,0CAAS;;IAGxB,WAAS,qBAAQ,KAAM,SAAS,MAAC,OAChB,QAAS,+BAAgB,aAAa;IAEvD,yBAAG,SAAS,MAAC,UAAoB,IAC9B,cAAqB,GAAnB,SAAS,MAAC,WAAW,SAAS,MAAC,SAAQ,iBACpB,GAAnB,SAAS,MAAC,WAAW,SAAS,MAAC,SAAQ,CAAC;MAC3C,qJAA0D;IAC5D,wBAAyB,GAAlB,SAAS,MAAC,UAAU,wCAAO,IAC7B,cAAoB,GAAlB,SAAS,MAAC,UAAU,wCAAO,yBAAQ,SAAS,MAAC,4CAA0B,CAAC;MAC7E;QACI,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KAbG,SAAS,MAAC,iCAAf;;UAEI,0HAA6D;;UAE7D,8HAAiE;;UAEjE,+GAAkD;;UAElD,qHAAwD;;UAExD,uHAA0D;;UAE1D,0HAA6D;;UAE7D,wHAA2D;;;kIAU9B;;;;;;;;;;;;;YAC7B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACb,2JAAgE;YAClE;cACE,sJAA2D;YAC7D;;;;;;;;QAKR;MACF;MACA,yBAAG,WAAqB;QACtB,oQAA6G;MAC/G;MACA,YAAU,SAAS,MAAC,KAAI;MACxB,6HAA8C;4IAEH;2NAIU;0IACZ;oGAClB;IAEzB;IAGA;;;;;;;qHAIyC;wSAEM;iGACrB;MAE1B;;IAGA;;;;UACQ,4kBAAsD;UACtD,glBAAsD;UACtD,0DAA4B;UAC5B,iEAA4B;UAC5B,gEAA4B;UAC5B,mEAA4B;UAC5B,6DAAuB;MAE7B,YAAU,sBAAS,KAAQ,QAAQ,OAAE,iCAClB,4GACA,MAAQ,iCAAI;MAE/B,iBAAW,GAAR,SAAW,QAAQ,OAAE,gCAAS;QAE/B;QACA,OAAO,MAAC,cAAW,4BAAU,uCAAmB;QAChD,OAAO,MAAC,cAAW,4BAAU,uCAAqB;QAElD,yBAAG,wBAA4B;UAC7B,WAAW,MAAC,cAAW,4BAAU,sCAAkB;UACnD,WAAW,MAAC,cAAW,4BAAU,sCAAoB;QACvD;QAEA,mBAAiB,gBAAgB;qGAIM;QAEvC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAE/D;MAEA,IAEE,OAGA,AAGA,KARG,QAAQ,OAAE,+BAAf;;QAGI;QACA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;QAE3D;QACA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;QAE3D;QACA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAIjE;;EACF","file":"zcl_abapgit_gui_page_codi_base.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_commit.clas.mjs":{"lineLengths":[89,53,40,69,32,55,97,227,213,223,218,208,210,199,2060,958,189,789,213,243,225,412,226,56,167,169,168,2190,2188,297,718,541,17,12,42,22,130,137,147,142,132,134,123,1984,882,113,49,55,3,40,78,74,82,234,30,3,29,133,61,122,64,112,79,31,30,32,61,42,143,100,95,53,111,16,3,23,53,3,30,143,133,61,122,64,112,79,174,146,163,167,19,3,31,67,80,40,21,5,169,173,19,3,33,67,1983,64,64,1776,54,69,81,34,108,58,12,93,5,19,3,35,67,1983,64,64,597,816,1776,67,37,37,75,75,48,5,54,69,81,24,108,144,12,95,5,19,3,31,68,139,85,161,41,96,5,41,147,5,20,3,30,67,139,85,159,40,94,5,40,145,5,19,3,24,79,81,73,148,150,134,3,27,129,83,233,99,1057,91,410,5,301,424,19,3,32,123,1776,79,120,101,98,167,99,102,101,72,37,100,100,232,101,116,161,101,100,157,101,101,5,102,102,19,3,32,123,189,371,1776,79,72,37,57,62,45,5,110,57,19,142,145,27,118,88,194,5,57,19,141,144,27,117,88,197,5,57,19,145,148,27,121,88,197,5,101,100,12,101,5,143,19,3,30,141,136,76,929,78,98,219,168,5,216,165,5,125,61,188,99,65,27,69,72,29,45,90,170,7,5,29,3,55,363,134,64,78,143,67,125,94,94,96,101,83,78,184,134,65,109,104,9,139,154,108,14,98,7,5,22,3,45,123,35,127,32,5,79,113,126,149,100,150,94,100,225,141,94,100,100,19,3,1,74,732,66,76,78,62,62,56,60,70,72,78,155,63,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap"],"names":[],"mappings":";;;AAoHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;IACE,wBAAqB,4MACmD;IAC1E;;EAGA;;;;;;;8BAEuB;IAErB,iBAAgB,OAAO;IACvB,kBAAgB,QAAQ;IACxB,mBAAgB,oCAAoB;IACpC,uBAAgB,aAAa;IAG7B,sBAAc,mHAAqD;;;IAInE,kBAAU,6BAAkB;IAC5B,uBAAe,kFAA8C;IAE/D;;EAGA;;;;;;;;;;;;QAEO,yIAAoD;;IAQzD,aAAU,oJAE2B;IAEvC;;EAGA;;IAEE,aAAU,6DAA6C;IAEvD,yBAAG,QAAkB;MACnB;IACF;IAEA,kKAA8D;IAC9D,sKAAgE;IAElE;;EAGA;;;;QAEO,uDAAe;IAEpB,IAAc,YAAgC;IAE9C,aAAW,yBAAO,UAAU;IAE5B,iBAAY,GAAT,UAAW,gCAAC;MAEb;gCAAgD;MAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,YAAU,YAAU,MAAC,KAAI,MAAC,SAAQ;IACpC;MAEE,qFAA8B;IAChC;IAEF;;EAGA;;;;QAGI,uDAAe;QACf,4kBAA8C;QAC9C,uyBAAkD;IAEpD,IAAc,YAAgC;;;MAI5C,sBAAM,OAAO;MACb,OAAO,MAAC,cAAW,YAAU,MAAC,OAAM,MAAC,SAAQ;MAC7C,OAAO,MAAC,cAAW,YAAU,MAAC,OAAM,MAAC,SAAQ;8BACrC,QAAa;IACvB;IAEA,aAAW,yBAAO,UAAU;IAE5B,iBAAY,GAAT,UAAW,gCAAC;MAEb;sBAAwC;MACxC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,sCAAY,OAAO,MAAC,WAAS,OAAO,MAAC,oBAAc,OAA0B;IAC/E;MAEE,uFAAgC;IAClC;IAEF;;EAGA;;QAEO,kIAA4C;IAEjD,aAAU,kEAA6C;IAEvD,cAAW,6IAAuD;IAClE,yBAAG,SAAmB;MACpB,cAAW,0EAAsC;IACnD;IACA,yBAAG,SAAmB;MAEpB,cAAW,6HAA+D;IAC5E;IAEF;;EAGA;;QAEO,kIAA4C;IAEjD,aAAU,kEAA6C;IAEvD,aAAW,4IAAsD;IACjE,yBAAG,QAAkB;MACnB,aAAW,yEAAqC;IAClD;IACA,yBAAG,QAAkB;MAEnB,aAAU,4HAA8D;IAC1E;IAEF;;EAGA;IAEE,cAAS,MAAC,qBAAkB,gCAAqB;IACjD,cAAS,MAAC,sBAAkB,iCAAsB;IAClD,cAAS,MAAC,cAAkB,iCAAsB;mJAKb;qJAGC;qIAKR;EAEhC;EAGA;;QAEQ,0EAAkC;IAExC,aAAU,sNAE2D;IAErE,iCAA+B,4DAA4C;giCAqB7C;IAE9B,0BAAG,0DAAoD;yZAOlB;IACrC;4SAM8B;uaASgC;IAEhE;;EAGA;;IAEE,IAAc,YAAgC;;uHAIH;oGAClB;iGACH;sKACoE;kGACnE;qGACG;oGAED;;;mGAED;mGACA;uOAGoB;oGACnB;mHACc;gKACqC;oGACnD;mGACD;4JAC0C;oGACzC;oGACA;IACzB;qGAC0B;qGAEA;IAE5B;;EAGA;;QAGa,oLAAM;QAIf,0WAAqD;IAEvD,IAAc,YAAgC;;;;MAK5C,MAAM,MAAC,YAAS,YAAU,MAAC,OAAM;MACjC,MAAM,MAAC,WAAS,+BAAC;8BACT,OAAY;IACtB;6GAEiC;IAEjC;;;;;oHAA2F;IAC3F,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;iMAC6E;IAC5F;IACA;;;;;mHAA0F;IAC1F,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;oMACgF;IAC/F;IACA;;;;;uHAA8F;IAC9F,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;oMACgF;IAC/F;IAEA,iBAAqB,GAAlB,yBAAO,iBAAa,gCAAC;mGACA;IACxB;oGACyB;IACzB;8IAEkE;IAEpE;;EAGA;;;;QAEQ,w5BAA0E;QAC1E,qEAA8B;IAEpC,uBAAoB,qEAAsC;IAE1D,iBAAkF,IAA/E,uKAAiF,wBAAU;uKAGxD;IACtC;IAEA,iBAA+E,IAA5E,oKAA8E,wBAAU;oKAGrD;IACtC;IAEA,wBAAqB,+FAAyC;IAC9D,yBAAG,6BAAiC;MAElC,iBAAc,mKAAgF;MAC9F;;;;;;2CACiE;MACjE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;yKAGuB;MACtC;IACF;IAEF;;EAGA;;;;QACO,qEAAgC;IAErC,uBAAe,kHAAiD;IAEhE,IACE,OAGA,KAJG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;MAIzD,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;kFAGT;6EAEwB;QAE1D,6KAGsC;QAEtC,wBAAqB,oGAAyC;QAE9D,yBAAG,6BAAiC;UAClC,wBAAqB,yEAA6C;uGAEtB;QAC9C;0IAKwB;QAGxB,+IAAwC;QAExC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,oBAAmB;MACvE;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;;IAGN;;EAGA;;kCAEsB;IAEpB,iBAA0C,IAAvC,4EAAyC,uBAAS;+BACpC;IACjB;;gHAIoC;6HACa;oJACoB;mGAC7C;qJAEiD;6FAClC;mGACf;gOAKmB;4IAEqB;6FACzB;mGACf;mGACA;IAE1B;;AACF","file":"zcl_abapgit_gui_page_commit.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_data.clas.mjs":{"lineLengths":[79,53,38,62,32,53,153,237,196,400,334,418,61,227,525,215,220,225,228,228,58,194,83,17,12,42,22,140,120,53,47,3,29,75,75,68,64,68,594,141,97,13,5,80,24,106,95,109,126,5,242,28,83,82,39,119,83,125,80,92,5,3,22,135,87,160,175,19,3,28,262,130,58,68,172,112,67,30,99,92,7,5,20,3,42,70,3,49,68,98,64,47,64,132,2278,2087,51,26,127,70,198,30,179,68,17,7,70,14,7,53,95,7,250,66,5,20,3,29,101,58,31,82,67,163,69,16,3,26,134,64,130,594,73,117,141,124,74,90,3,29,134,64,130,594,73,117,141,93,3,29,134,64,130,594,73,117,141,154,74,93,3,22,123,129,136,79,90,72,173,162,225,242,114,19,3,26,123,79,113,89,84,100,19,3,27,123,129,136,821,594,79,90,87,69,31,74,92,178,175,134,164,199,227,250,148,116,5,19,3,55,363,134,64,67,82,49,58,96,92,52,58,96,92,52,58,96,103,37,58,96,132,94,5,22,3,1,70,341,55,61,61,83,274,56,56,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_data.clas.abap"],"names":[],"mappings":";;;AAuFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;QAEO,kEAAqC;QACrC,kEAAiC;QACjC,2DAA6B;QAC7B,uDAAuC;QACvC,2DAAsB;QACtB,ykBAAkD;IAGvD,eAAY,wHAAoE;IAChF,iBAAsB,GAAnB,yBAAO,aAAe,gCAAC;MACxB;IACF;IAEA;sBAA2C;IAC3C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB,gBAAa,yEAAwC;IAErD,iBAA4B,GAAzB,yBAAO,UAAU,MAAC,SAAS,gCAAC;6HAC+B;IAC9D;;;MAGE,4CAAO,MAAM,MAAC,mBAAsB;MACpC,4CAAO,MAAM,MAAC,kBAAqB;MAEnC,sBAAM,SAAS;MACf,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;MAC1D,SAAS,MAAC,UAAO,4BAAU,MAAM,MAAC,UAAS;MAC3C,cAAW,uGAEkB;MAC7B,gCAAO,kBAAY,SAAS,MAAC,MAAK;2FACA;IACpC;EAEF;EAGA;;;+JAKoD;8KAEgB;IAEpE;;EAGA;;;;QAEO,2DAA8B;IAEnC;;;;MAKE,iBAAsB,GAAnB,0BAAQ,YAAc,gCAAC;;MAE1B;IACF;IAEF;;EAGA;;;;;;;;;QAEO,2HAA8C;QAC9C,6tEAA4B;QAC5B,8hEAAqC;QACrC,0CAAgC;IAErC,WAAS,SAAS;+BAClB,iBAAkB,6EAA+C;IAEjE,eAAY,iDAAsC;;;MAGhD,iBAAqB,GAAlB,QAAQ,MAAC,WAAW,wCAAO,iBAAsB,GAAlB,QAAQ,MAAC,WAAW,wCAAM;QAC1D,WAAS,+CAAoB;QAC7B;MACF;MACA,iBAAU,GAAP,yCAAY;QACb;MACF;MACA,yBAAO,mBAAmB;QACxB,qFAA8B;MAChC;MACA,kPAAyF;MACzF,WAAS,+CAAoB;IAC/B;IAEF;;EAGA;;;8BAEuB;IAErB,eAAU,MAAC,gBAAa,uCAAM;IAC9B,eAAU,MAAC,gBAAY,wBAAa;+BAEpC,eAAW,mHAAoD;IAC/D,oBAAY,2CAA2B;IAEzC;;EAGA;;;QAEO,yHAAyC;QACzC,ykBAAiD;IAEtD,YAAS,uDAAsB;IAE/B,SAAS,MAAC,UAAe,wCAAyB,mCAAW,MAAC,KAAI;IAClE,SAAS,MAAC,WAAe,6BAAU,gFAA2B;IAC9D,SAAS,MAAC,mBAAe,oFAAgC;IACzD,SAAS,MAAC,YAAe,yCAAqB;yFAEZ;EAEpC;EAGA;;;QAEO,yHAAyC;QACzC,ykBAAiD;IAEtD,YAAS,uDAAsB;IAE/B,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;IAC1D,SAAS,MAAC,WAAO,6BAAU,gFAA2B;4FAEjB;EAEvC;EAGA;;;QAEO,yHAAyC;QACzC,ykBAAiD;IAEtD,YAAS,uDAAsB;IAE/B,SAAS,MAAC,UAAe,wCAAyB,mCAAW,MAAC,KAAI;IAClE,SAAS,MAAC,WAAe,6BAAU,gFAA2B;IAC9D,SAAS,MAAC,mBAAe,kHAA4C;IACrE,SAAS,MAAC,YAAe,yCAAqB;4FAET;EAEvC;EAGA;;QAEO,wHAAyC;QACzC,+HAA+C;;;IAKpD,aAAU,qDAAgC;4KAIf;iKAIK;gOAKD;iPAKC;iHACe;IAEjD;;EAGA;;;gHAGsC;wFACF;mFACL;mGACL;IAE1B;;EAGA;;QAEO,wHAAyC;QACzC,+HAA+C;QAC/C,4yBAAqD;QACrD,ykBAAiC;;;IAKtC,gBAAa,iEAAyB;;;MAGpC,aAAU,qDAAiC;;iLAKV;8KAIN;qIAIQ;mKAGH;sMAIkC;kOAInC;yPAKI;mJAGA;mHACY;IACjD;IAEF;;EAGA;;;;IAEE,IACE,OAIA,AAIA,AAIA,AAIA,KAjBG,QAAQ,OAAE,+BAAf;;gDAEyB;yDACF;MACnB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;mDAEnC;yDACL;MACnB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;mDAEnC;yDACL;MACnB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;oCAEvC;yDACD;MACnB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAE3D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;IAG/D;;AACF","file":"zcl_abapgit_gui_page_data.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_db.clas.mjs":{"lineLengths":[89,53,36,65,32,51,154,620,334,147,81,878,56,485,57,593,834,837,840,231,56,17,12,42,22,523,53,55,3,29,31,37,16,3,18,44,3,25,143,138,91,268,19,3,24,50,3,31,615,108,68,67,71,152,421,104,73,66,36,195,168,5,44,214,91,246,108,162,3,32,58,3,39,388,58,52,78,727,75,88,107,22,5,149,101,193,106,5,29,3,25,51,3,32,52,108,68,67,71,69,389,615,619,152,275,91,299,103,73,9,45,41,17,22,44,76,61,13,16,20,9,7,90,129,7,79,41,39,51,155,146,13,110,21,110,158,18,20,11,9,13,86,45,21,26,48,80,88,65,17,20,24,13,11,94,187,11,125,74,9,694,79,92,111,26,9,112,74,33,157,9,33,70,33,187,9,33,169,7,36,71,393,65,72,314,43,97,74,84,110,80,90,104,78,160,108,76,108,82,109,75,87,16,119,92,18,67,11,149,139,9,73,94,9,73,131,9,214,102,118,9,23,7,47,307,393,65,658,208,72,307,264,174,101,27,92,121,9,52,93,9,70,26,72,75,31,48,92,63,16,44,9,23,7,41,307,393,65,658,208,66,158,71,77,16,78,9,186,101,27,92,132,9,56,170,103,29,94,134,75,115,13,11,9,23,7,44,307,393,65,266,115,135,136,85,40,94,175,137,11,9,23,7,35,140,91,324,7,33,127,625,83,659,23,7,59,367,138,68,391,136,75,71,88,62,54,100,95,36,100,96,37,100,9,26,7,54,142,94,143,145,26,7,49,127,625,39,114,83,120,120,104,23,7,57,212,72,80,49,59,24,7,55,432,72,80,49,59,76,80,51,65,73,142,37,154,107,89,87,81,88,110,837,70,9,25,7,5,70,277,64,64,66,89,61,330,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_db.clas.abap"],"names":[],"mappings":";;;AAmGA;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;8BACuB;oCACC;IACxB;;EAGA;;;;;QAEO,iIAAgD;;IAIrD,aAAU,yPAI8B;IAE1C;;EAGA;;;;QAGI,8lBAAqD;QACrD,mGAAmC;QACnC,2DAAwB;QACxB,0DAAuB;QACvB,8DAAuB;QACvB,+IAAqD;IAEvD,IACE,WAA8B;IAEhC,aAAU,qFAAoD;;;;MAK5D,sCAAY,WAAS,MAAC,OAAK,sCAAI,WAAS,MAAC,QAAM,kDAAY,WAAW;uKAGS;IACjF;IAEA,YAAS,0BAAe;IAExB,sCAAY,qDAAkB,eAAE,MAAC,QAAM,sCAAI,eAAE,MAAC,iBAAW,WAAW;IAEpE,gBAAa,qEAAgD;IAE7D,aAAU,mOAG2B;2GAIjB;IAEpB,2JAAoD;EAEtD;EAGA;;;;;;QAEO,2CAAyB;IAE9B,4CAAO,MAAM,MAAC,gBAAmB;IAEjC,eAAY,ksBAQ6B;IAEzC,iBAAa,GAAV,WAAY,qCAAG;MAChB;;;IACF;oJAI2B;IAI3B,iBAAe,GAAZ,MAAM,MAAC,OAAO,2CAA4B,YAAW;gMAG3B;yGAGmB;IAIhD;IAEA;EAEF;EAGA;;;;QAGI,2CAA2B;QAC3B,mGAAmC;QACnC,2DAAwB;QACxB,0DAAuB;QACvB,8DAAuB;QACvB,4DAAwB;QACxB,4XAAoD;QACpD,8lBAAqD;QACrD,kmBAAqD;QACrD,+IAAqD;IAEvD,IACE,cAAuC;IAEzC,gBAAa,qEAAgD;IAE7D,aAAU,wRAGsC;IAEhD,YAAS,qFAAkC;;;4CASlB;;;;;;;;;;;;MACzB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gIAC0C;MAC1D;;;QAGE,sBAAM,OAAO;QACb,gBAAc,cAAY,MAAC,KAAI;QAC/B,gJAAqC;QACrC;QAGA;6GACmE;;;;;;;QAGnE;;qFAUiC;;;;;;;;;;;;;UACjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0LACqE;UACrF;UAEA,OAAO,MAAC,eAAW,qFAAsD;UACzE,6DAAiC;QACnC;QAEA,eAAY,6pBAQ6B;QAEzC,iBAAa,GAAV,WAAa,qCAAG;UACjB;;;QACF;QAEA,iBAAc,qFAAoD;;;4JAIpC;QAC9B;QAEA;;;0LAMiC;QACjC;QAEA;QAEA,8JAAuD;MAEzD;MAGA;;;;YAEO,2DAAoB;YACpB,6SAAkC;QAEvC,IACE,OAIA,AAIA,AAIA,AAGA,AAGA,KAnBG,OAAO,MAAC,KAAb;;UAEI,aAAiB,iDAAe;UAChC,oBAAiB,oDAA+B;;UAGhD,aAAiB,uDAAqB;UACtC,oBAAiB,0DAAqC;;UAGtD,aAAiB,qDAAmB;UACpC,cAAc,MAAC,YAAQ,oHAAmE;;UAG1F,aAAiB,mDAAiB;;UAGlC,aAAiB,yDAAuB;;UAGxC,aAAiB,kDAAgB;UACjC,oBAAiB,uDAAkC;;UAGnD,iBAA8B,GAA3B,0BAAQ,OAAO,MAAC,aAAc,kCAAG;YAClC,cAAc,MAAC,WAAQ,OAAO,MAAC,kCAAa;UAC9C;YACE,cAAc,MAAC,WAAQ,OAAO,MAAC,SAAQ;UACzC;UAEA,cAAc,MAAC,WAAQ,qBACrB,KAAS,cAAc,MAAC,QACxB,QAAS,+BAAgB,aAAa;UACxC,cAAc,MAAC,2GAA6C;;QAIhE,yBAAG,cAAc,MAAC,iBAAoB;UACpC,kFAA2B;QAC7B;QAEA,yBAAG,cAAc,MAAC,iBAAoB;UACpC,cAAc,MAAC,mGAAqC;QACtD;QAEA,4MAAyF;QAEzF,iBAAqB,GAAlB,0BAAQ,WAAa,kCAAG;UACzB,kCAAU,iCAAgB,uCAAK;QACjC;QAEF;;MAGA;;;;YAGI,qoBAA2B;YAC3B,mMAA8B;YAC9B,2DAAqB;YACrB,sSAAiC;QAEnC,OAAO,MAAC,iPAAsF;;QAI9F;yBAAqD;QACrD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,aAAW,OAAO,MAAC,mFAAyC;QAC9D;QAEA,yBAAG,gBAAqB;UACtB,qBAAa,4DAAuC;QACtD;QAEA;;;;;8CAAqE;QACrE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,OAAO,MAAC,WAAQ,SAAS,MAAC,YAAW;QACvC;UACE,OAAO,MAAC,WAAQ,QAAQ;QAC1B;QAEF;;MAGA;;;;YAGI,qoBAA2B;YAC3B,mMAA8B;YAC9B,qDAAgB;;QAIlB,iBAAU,GAAP,QAAS,gCAAC;UACX,OAAO,MAAC,WAAQ,yCAAQ;QAC1B;UACE,OAAO,MAAC,WAAQ,0CAAS;QAC3B;;QAIA;yBAAqD;QACrD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,OAAO,MAAC,WAAQ,OAAO,MAAC,mFAAyC;QACnE;QAEA,yBAAG,OAAO,MAAC,OAAgB;;UAGzB;2BAAqD;UACrD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb,OAAO,MAAC,WAAQ,OAAO,MAAC,mFAAyC;YACjE,iBAAU,GAAP,QAAS,gCAAC;cACX,OAAO,MAAC,YAAQ,0EAAsC;YACxD;UACF;QACF;QAEF;;MAGA;;;;YAEO,6PAA0B;QAE/B,iBAA8B,GAA3B,0BAAQ,OAAO,MAAC,aAAa,gCAAC;UAC/B;UACA,OAAO,MAAC,+GAAqC;UAE7C;sCAA8C;UAC9C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb,gKAA8C;YAC9C,OAAO,MAAC,WAAQ,qBACd,KAAS,OAAO,MAAC,QACjB,QAAS,+BAAgB,aAAa;UAC1C;QACF;QAEF;;MAGA;YAEO,+HAA4C;;mUASK;MAExD;MAGA;;;;QAEE,aAAU,4nBAWkB;QAE9B;;MAGA;;;;YAEO,0XAA8C;YAC9C,2HAA2C;QAEhD,cAAW,mDAAkB;QAC7B,IACE,OAIA,AAGA,KARG,QAAQ,OAAE,+BAAf;;6DAEsD;qDAC1B;UACxB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;mCAE5C;UACf,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;oCAE3C;UAChB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;QAGjE;;MAGA;;;8IAM8B;gJAGC;QAE/B;;MAGA;;YAEO,omBAAuD;sCAExC;QAEpB,mBAAgB,qFAAoD;;uHAI7B;uHACM;uGACrB;QAE1B;;MAGA;;;;;;QACA;;MAGA;;;;;;;;;;YAEO,4DAAsB;YACtB,iIAA+C;QAEpD,IACE,OAEA,AAGA,KANG,YAAL;;UAEI,SAAS,MAAC,gFAAwB;;UAElC,SAAS,MAAC,cAAY,8CAAyB;UAC/C,SAAS,MAAC,eAAY,uCAAM;;UAE5B,eAAa,mFAAqD;UAClE,gBAAa,yyBASqC;UAClD,SAAS,MAAC,WAAO,gCAAqB;;QAI5C;;IACF","file":"zcl_abapgit_gui_page_db.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_db_entry.clas.mjs":{"lineLengths":[89,53,42,71,32,57,126,486,182,278,151,147,81,369,369,396,233,593,666,483,804,627,17,12,42,22,389,106,59,71,61,3,25,138,90,69,386,12,209,5,22,3,29,388,58,105,76,106,31,37,40,28,16,3,23,55,3,30,143,388,58,105,76,106,150,141,206,19,3,33,65,3,40,392,136,76,113,115,120,232,86,5,22,3,26,58,3,33,392,70,82,193,29,3,31,136,87,332,3,28,113,85,123,61,72,184,286,182,184,187,101,3,33,65,3,40,67,388,58,397,19,3,30,123,61,138,70,116,126,111,100,3,28,113,85,123,61,154,72,139,156,159,3,55,363,134,64,67,95,109,96,97,146,94,5,22,3,53,68,69,68,12,71,5,20,3,45,123,113,35,9,182,17,106,14,16,7,5,79,117,91,69,159,83,12,83,5,100,19,3,1,78,223,66,76,96,60,91,69,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_db_entry.clas.abap"],"names":[],"mappings":";;;AA6FA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;IAIE,iBAAgB,GAAb,mBAAe,uBAAS;iYAKuB;IAClD;gNAGqB;IACrB;IAEF;;EAGA;;;;;;8BAEuB;oCACC;IACtB,sBAAe,YAAY;IAC3B,gBAAe,MAAM;IAEvB;;EAGA;;;;;;;;;;QAEO,6IAAsD;;IAO3D,aAAU,2LAG+B;IAE3C;;EAGA;;;;;;;IAEE,UAAU,MAAC,WAAW,gFAA2B;IACjD,UAAU,MAAC,YAAW,iFAA4B;IAClD,UAAU,MAAC,eAAW,mFAA8B;IAEpD,iBAA0B,GAAvB,UAAU,MAAC,kCAAe,qCAAI,iBAA6B,GAAzB,UAAU,MAAC,6CAAgB,qCAAG;MACjE,UAAU,MAAC,cAAW,UAAU,MAAC,gCAAU;IAC7C;IAEF;;EAGA;;;;;;IAEE,4CAAO,UAAU,MAAC,gBAAmB;gMAKH;IAElC;EAEF;EAGA;QAEO,+HAA4C;;2UASK;EAExD;EAGA;;;;;QAEO,+DAAwB;IAE7B,kBAAe,qBACb,MAAS,gFACT,QAAS,+BAAgB,cAAa;6RAG4D;qLACzB;uLACE;0LACc;oGAClE;EAE3B;EAGA;;;;;;;IAEE,uYAIS;IAEX;;EAGA;;;;;mHAEyC;6HACmB;8GAChB;mGAClB;EAE1B;EAGA;;;;;QAEO,iJAAyD;QACzD,+DAA0B;IAG/B,oBAAiB,iHAA6C;IAC9D,kBAAiB,oIAAgF;8JAElC;EAEjE;EAGA;;;;IAEE,IACE,OAGA,KAJG,QAAQ,OAAE,+BAAf;;MAEI,sBAAe,gCAAoB,GAAb,mBAAe,wBAAtB,CAAkC;MACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;iJAEJ;MACvD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;IAG/D;;EAGA;;IAEE,iBAAgB,GAAb,mBAAe,uBAAS;MACzB,aAAW,+CAAa;IAC1B;MACE,aAAW,kDAAgB;IAC7B;IAEF;;EAGA;;QAEO,wGAAiE;kCAElD;IAEpB;MACI,qBAAkB,yJAES;;;;;;IAE/B;;oHAIwC;0FAIP;IAEjC,iBAAgB,GAAb,mBAAe,uBAAS;8JAGE;kFAGE;IAC/B;kFAG+B;IAC/B;mGAEwB;IAE1B;;AACF","file":"zcl_abapgit_gui_page_db_entry.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_debuginfo.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,165,184,133,137,270,248,222,221,532,178,219,342,231,56,17,12,42,22,68,78,68,76,60,3,25,58,3,32,135,145,139,139,19,3,29,31,16,3,18,51,3,25,143,152,98,216,19,3,32,67,49,70,120,49,70,69,123,79,257,330,19,3,29,123,317,74,103,158,97,9,122,17,106,14,16,7,5,79,163,134,164,424,12,91,133,174,5,103,319,100,140,115,97,231,230,175,230,216,300,236,98,94,19,3,28,123,263,181,86,79,114,163,192,90,322,124,14,231,7,12,11,84,89,95,261,124,19,80,226,16,18,9,7,5,19,3,41,123,263,67,81,100,81,80,72,69,67,79,126,144,115,9,171,36,76,182,33,82,97,102,91,132,123,163,192,102,16,121,9,104,7,17,78,22,194,14,16,7,5,111,19,3,26,123,79,188,321,19,3,41,67,67,123,271,50,238,104,129,597,304,109,343,88,184,133,86,79,79,75,359,151,111,145,94,100,67,29,107,86,126,62,138,151,29,94,90,142,14,123,7,11,44,76,102,92,93,122,174,19,116,15,117,23,120,189,23,20,22,13,11,186,16,18,9,7,81,144,87,37,69,31,32,119,101,125,111,125,94,125,101,16,116,9,44,31,16,119,9,7,126,87,5,96,84,19,3,55,363,134,64,67,71,152,67,89,262,93,255,197,168,96,96,94,5,22,3,45,123,35,79,140,91,100,139,90,100,147,103,100,130,149,82,19,3,1,80,130,75,79,73,83,72,215,63,63,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_debuginfo.clas.abap"],"names":[],"mappings":";;;AAsEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;0IAM4B;0IAGA;IAE5B;;EAGA;8BACuB;IACvB;;EAGA;;;;;QAEO,+IAAuD;;IAI5D,aAAU,qMAG2B;IAEvC;;EAGA;;;;;;;QAEO,4DAAqB;QACrB,kHAAoC;;IAIzC,eAAY,4OAC6E;IAEzF,aAAU,uTAE6D;IAEzE;;EAGA;;QAEQ,oTAA4D;QAC5D,iEAA4B;QAC5B,8FAA8B;QAC9B,qJAA0D;IAEhE,sBAAmB,qEAAgD;IACnE;yHACyF;;;;;;IAGzF;;IAIA,iBAAyD,IAAtD,gHAAwD,uBAAS;qIACX;mKAC8B;uaAIxB;IAC/D;MACE,iBAAc,kEAA6C;oIACL;6KACsB;IAC9E;sGAE2B;8TAIqB;mGACxB;IAExB,gBAAa,sHAA6D;kHAEpC;gGAEb;sOAC2E;qOACD;8KACpB;qOAEI;uNACe;2SACC;2OACK;iGAC9E;6FACJ;IAExB;;EAGA;;QAEO,8PAA2B;QAC3B,4KAA2B;QAC3B,6EAAsD;;iHAItB;IAErC,iBAAyD,IAAtD,gHAAwD,uBAAS;MAElE,eAAY,yKAAwE;MACpF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;iUAG4C;2HACJ;MACvD;sOACsG;MACtG;IACF;MAEE;QACI,YAAY,MAAC,aAAU,2CAAY;;QAEnC,eAAY,sEAA4D;oQAEgC;2HACnD;;;;;;;MAGzD;IACF;IAEF;;EAGA;;;;QAGI,wEAAiD;QACjD,2FAA8B;QAC9B,wEAAuE;QACvE,uEAAkC;QAClC,+DAAkC;QAClC,4DAAsB;QACtB,0DAAsB;;6HAIyB;+IACkB;kHAC7B;IAEtC;MACI,gBAAa,mJAEY;mCACN;MAEnB,gBAAa,oDAAyC;;;QAGpD,eAAY,yDAA+C;;;QAG3D,sCAAqB,oBAAe,SAAS;QAC7C,cAAY,4BAAU,uBACpB,KAAM,WACN,KAAM,oCAAO;QACf;kKACgE;QAChE,yBAAG,UAAqB,iBAAa,GAAV,WAAY,2CAAU,iBAAa,GAAV,WAAY,yCAAO;qGACjD;QACtB;wHACwC;QACxC;uGAC4B;MAC9B;;;;;;;;IAIJ;8GAEkC;IAEpC;;EAGA;;;2LAI6F;gUAEU;IAEvG;;EAGA;;QAEQ,0DAAuB;QACvB,kHAAwC;QACxC,sQAAiD;QACjD,yCAAiC;QACjC,qOAAyD;QACzD,+FAA2B;QAC3B,wHAA0C;QAC1C,4kBAAiD;QACjD,uSAAqD;QACrD,oGAAiE;QACjE,8UAAoE;IAE1E,IAAe,UAAmB;;;;IAMlC,cAAW,2DAAsC;;IAIjD,YAAU,yDAAuB;IAEjC,kCAAU,SAAW,sTAG2B;IAEhD,kCAAU,+GAAoF;IAE9F,kCAAU,uEAA4C;IACtD,kCAAU,yGAA8E;IACxF,kCAAU,sDAA2B;IACrC,kCAAU,4DAAiC;;;MAGzC,mCAAW,wDAAyB,QAAO;MAE3C,kCAAU,4CAAiB;MAE3B,kCAAU,oFAAiC;MAE3C;;;;4FAA6E;MAC7E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,kCAAU,kGAAuC;MACnD;QACE,kCAAU,+EAAoD;MAChE;MAGA;QACI,OAAO,MAAC,cAAW,OAAO;QAC1B,OAAO,MAAC,cAAW,uCAAM;;;;;QAOzB,kCAAU,kIAAqD;;;;;;;;;;;;;;;;;MAanE;MAEA,iBAAc,wDAA0B;MAExC,kCAAU,sGAA6C;MAEvD,cAAW,iEAAmC;MAE9C,sBAAM,OAAO;;;QAEX,IACE,OAEA,AAEA,AAEA,KAPG,OAAL;;UAEI,yFAAkC;;UAElC,mGAA4C;;UAE5C,kFAA2B;;UAE3B,yFAAkC;;UAElC,oCAAS,GAAF,iCAAI,gCAAC;;QAEhB,yBAAG,QAAkB;UACnB,YAAU,OAAO;QACnB;UACE,kCAAU,8BAAW,kCAAQ,SAAO;QACtC;MACF;MAEA,kCAAU,oFAAiC;MAE3C,kCAAU,6CAAkB;IAE9B;IAEA,kCAAU,wDAA6B;IACvC,kCAAU,4CAAiB;IAE7B;;EAGA;;;;QAGI,0DAAuB;QACvB,8DAAuB;QACvB,+IAAqD;IAEvD,IACE,OAkBA,KAnBG,QAAQ,OAAE,+BAAf;;MAGI,sCAAY,yDAAsB,eAAE,MAAC,QAAM,sCAAI,eAAE,MAAC,QAAM,mDAAa,WAAW;MAEhF,gBAAa,qEAAgD;MAE7D,aAAU,0OAG2B;oMAI+B;MAEpE,+JAAwD;MAExD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAE3D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;IAG/D;;EAGA;;kCAEsB;;2IAI2C;0FAC3B;mGACZ;0IAEsC;yFAC3B;mGACX;kJAE8C;sGACtB;mGACxB;IAExB,iBAAU,2GAAyE;IACnF,+IAAsD;iFAET;IAE/C;;AACF","file":"zcl_abapgit_gui_page_debuginfo.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_diff.clas.mjs":{"lineLengths":[79,53,38,62,32,53,179,201,196,1528,1316,183,144,578,279,791,291,293,1412,1399,1400,2302,225,1477,1130,3536,404,234,236,1395,230,219,3332,1467,1361,276,284,229,3266,231,1412,1409,1411,198,1693,227,54,136,56,57,149,307,3589,234,58,3404,83,17,12,42,22,104,29,120,1452,1240,107,68,502,55,57,67,69,3,36,135,61,141,67,252,251,247,1170,96,77,36,48,91,94,71,5,283,151,98,317,7,103,183,76,37,233,9,7,102,186,75,37,236,9,7,98,185,71,37,235,9,7,106,5,3,34,135,61,139,74,1170,139,77,36,99,250,5,100,3,31,135,61,390,382,3,29,135,61,155,53,3,34,135,61,139,144,214,211,213,214,100,3,28,890,67,1416,64,1057,67,63,511,1195,542,1225,1170,62,31,135,148,27,91,88,74,5,64,157,170,27,113,88,73,5,84,173,5,59,53,61,61,61,57,57,127,82,74,83,12,84,5,81,170,5,61,97,5,81,102,12,92,5,125,129,174,75,5,237,76,5,93,103,339,14,339,7,5,3,22,135,144,50,53,55,48,19,3,31,508,61,599,67,1983,64,890,1416,1364,123,1089,46,82,80,44,55,73,170,50,68,133,146,29,89,90,213,7,99,59,353,40,101,7,12,90,132,40,134,103,9,7,5,3,29,101,58,508,61,599,67,1983,64,93,31,82,151,28,33,163,44,91,93,92,106,196,5,67,16,3,47,71,1138,61,230,23,3,26,105,1231,64,140,6,47,12,5,24,3,22,106,25,3,26,99,67,55,67,55,101,48,67,12,67,5,92,18,3,34,113,1983,64,1057,67,96,55,34,5,191,170,27,113,128,32,3,27,106,69,67,176,121,25,3,46,1983,1455,91,1743,1179,76,45,37,82,71,5,20,3,35,73,71,73,189,25,3,31,73,67,61,185,25,3,24,47,64,1455,1983,46,30,92,32,101,33,12,62,5,101,52,3,24,95,3,25,53,3,37,47,64,68,54,55,150,107,88,106,12,160,5,3,30,123,866,76,1138,61,69,289,79,86,71,77,26,12,60,5,119,98,80,67,118,119,199,12,211,5,99,102,19,3,43,123,61,1138,61,116,3,26,123,1143,135,79,138,108,149,96,171,133,77,34,210,110,5,88,105,5,100,82,55,35,19,3,28,123,1138,61,79,418,108,89,123,182,111,106,104,12,144,128,120,5,100,100,19,3,33,123,1138,61,387,67,67,79,118,306,89,63,97,141,53,53,7,185,185,185,5,395,316,387,5,50,158,12,219,5,194,82,142,166,101,100,19,3,45,123,61,1138,61,155,272,5,123,121,577,103,5,3,29,123,1138,61,154,1231,106,64,893,898,171,79,59,97,96,21,5,49,67,36,48,78,50,17,7,67,112,40,92,82,74,9,141,51,7,59,111,111,14,137,137,7,75,75,69,124,14,253,7,5,67,95,5,19,3,32,123,866,79,67,85,123,12,85,262,5,19,3,34,123,866,76,71,73,94,67,64,64,66,66,67,65,79,50,68,217,64,54,147,64,54,7,5,445,33,50,68,217,64,54,147,64,54,7,5,446,117,185,99,19,3,38,123,61,71,73,866,76,64,64,94,67,66,58,66,58,86,67,67,12,67,67,5,3,36,123,866,76,898,79,138,82,43,121,544,103,7,82,43,121,544,103,7,51,5,117,46,122,84,129,534,129,534,12,580,5,99,19,3,26,123,79,188,119,125,148,102,119,124,126,97,97,113,159,113,134,97,143,19,3,34,123,1138,61,79,117,98,67,63,12,85,5,99,102,19,3,46,123,61,1138,61,116,117,109,116,117,110,3,42,123,61,119,119,117,108,3,22,67,100,12,102,5,3,55,363,134,64,501,30,67,95,156,30,96,107,137,108,139,110,143,106,135,12,138,88,98,14,99,7,5,49,95,69,96,5,22,3,54,884,568,85,89,95,72,87,87,93,72,87,96,96,72,87,100,101,72,87,29,3,1,70,220,56,57,55,732,79,89,91,95,87,72,73,77,91,232,78,82,233,126,117,1161,1469,519,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_diff.clas.abap"],"names":[],"mappings":";;;AAgRA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;QAGI,oIAAkD;QAClD,0DAAyB;QACzB,mPAAiE;QACjE,kPAAiE;QACjE,8OAAiE;IAEnE,IAAe,WAAoC;IAAnD,IACe,QAAqB;;;MAIlC,YAAU,WAAS,MAAC,WAAU;MAC9B,kFAA8C;MAC9C,qFAAiD;MACjD,8DAAkC;IACpC;IAEA,iBAA0B,GAAvB,yBAAO,iBAAkB,gCAAE,iBAAyB,GAAtB,yBAAO,gBAAiB,gCAAE,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;;MAGjF,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;4TAImB;MAC3C;MAGA,iBAA0B,GAAvB,yBAAO,iBAAkB,gCAAC;sLAE6C;;;wOAKrC;QACnC;MACF;MAGA,iBAAyB,GAAtB,yBAAO,gBAAiB,gCAAC;yLAE8C;;;2OAKrC;QACnC;MACF;MAGA,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;wLAEkD;;;0OAKrC;QACnC;MACF;yGAGsC;IACxC;EAEF;EAGA;;;QAEQ,kIAAmD;QACnD,iEAA0B;IAChC,IAAe,WAAoC;;;;MAMjD,yCAAiB,WAAS,MAAC,MAAQ,WAAS,MAAC,UAAQ;yPAKC;IAExD;mGAGoC;EAEtC;EAGA;;;qYAOgD;6XAOF;EAE9C;EAGA;;;0JAGmD;oDAErB;EAE9B;EAGA;;;QAEO,kIAAgD;;qNAMJ;kNAIC;oNAIE;qNAIJ;mGAGZ;EAEtC;EAGA;;;;;;;QAGI,sDAAiB;QACjB,sfAA0C;QAC1C,kqCAA0C;IAE5C,IAAe,aAAkC;IAAjD,IACe,YAAiC;IADhD,IAEe,WAAsC;IAGrD;;;;;yFAG2C;IAC3C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,iEAAgC;IAClC;IAEA;;;;+GAEyC;IACzC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,gEAA+B;IACjC;IAEA,yBAAG,aAAsB,yBAAI,cAAsB;4KAC4B;IAC/E;;IAGA,WAAS,MAAC,UAAW,SAAS,MAAC,KAAI;IACnC,WAAS,MAAC,cAAW,SAAS,MAAC,SAAQ;IACvC,WAAS,MAAC,cAAW,SAAS,MAAC,SAAQ;IACvC,WAAS,MAAC,cAAW,SAAS,MAAC,SAAQ;IACvC,WAAS,MAAC,YAAW,SAAS,MAAC,OAAM;IACrC,WAAS,MAAC,YAAW,SAAS,MAAC,OAAM;IAErC,yBAAG,WAAS,MAAC,kBAAsB,yBAAI,WAAS,MAAC,kBAAqB;MACpE,WAAS,MAAC,YAAS,kCAAQ,MAAC,KAAI;IAClC,gCAAO,WAAS,MAAC,kBAAqB;MACpC,WAAS,MAAC,YAAS,kCAAQ,MAAC,MAAK;IACnC;MACE,WAAS,MAAC,YAAS,kCAAQ,MAAC,OAAM;IACpC;IAGA,yBAAG,YAAU,MAAC,KAAI,MAAC,oBAAuB;MACxC,WAAS,MAAC,iBAAa,gIAEa;IACtC;IACA,yBAAG,WAAS,MAAC,YAAqB;MAChC,WAAS,MAAC,gBAAa,0CAA2B,cAAc;IAClE;IAGA,yBAAG,YAAU,MAAC,KAAI,MAAC,oBAAuB;MACxC,WAAS,MAAC,UAAO,2BAAS,YAAU,MAAC,KAAI,MAAC,WAAU;IACtD;MACE,WAAS,MAAC,UAAO,2BAAS,aAAW,MAAC,WAAU;IAClD;;IAGA,WAAS,MAAC,UAAO,2BAAS,wBAAW,KAAM,WAAS,MAAC,OAChB,KAAM,WAAW;IACtD,iBAAkB,GAAf,WAAS,MAAC,OAAQ,uCAAM,iBAAmB,GAAf,WAAS,MAAC,OAAQ,wCAAM;MACrD,WAAS,MAAC,UAAO,wCAAO;IAC1B;IAEA,iBAAkB,GAAf,WAAS,MAAC,OAAO,yCACjB,iBAC8C,IAD1C,qGAC4C,uBAAS;MAC1D,WAAS,MAAC,UAAO,yCAAQ;IAC3B;IAGA,iBAAkB,GAAf,WAAS,MAAC,OAAQ,0CAAQ;MAC3B,iBAAoB,GAAjB,WAAS,MAAC,SAAS,kCAAQ,MAAC,QAAM;;MAQrC;;MAQA;IACF;EAEF;EAGA;;;iDAI2B;oDACG;sDACE;+CACP;IAEzB;;EAGA;;;;;;;QAEQ,i3BAAuD;QACvD,+3CAAwD;QACxD,20CAAqD;QAEtD,kHAAoC;IAEzC,IAAe,aAAkC;IAEjD,sBAAO,kBAAa;IAEpB,eAAY,6DAA4B;IACxC,cAAY,4DAA2B;2CACf;IACxB,eAAY,kCAAkB;IAE9B,aAAU,sDAAiC;yKAMhB;IAE3B,yBAAG,kBAAsB;MAEvB;;;;uFAC0D;MAC1D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oNACuE;MACvF;kGAIsC;IAExC,gCAAO,oBAAwB;;;oGASW;MACxC;IAEF;MAEE;;;QAKE,iBACgD,IAD7C,+EAC+C,uBAAS;sGAInB;QAExC;MAEF;IAEF;EAEF;EAGA;;;;;;;;;QAEQ,oFAAoB;8BAEL;IACrB,eAAU,MAAC,gBAAa,uCAAM;IAC9B,qBAAwB,4HAAkE;2BAC7E;IACb,qBAAwB,MAAM;+BAC9B,eAAwB,mHAAoD;IAE5E,sCAA0B;IAC1B,qFAAyB;IAEzB,4CAAO,QAAmB,yBAAG,UAAoB;2FAKvB;IAE1B,iBAA0B,GAAvB,yBAAO,sBAAkB,gCAAC;mMAEsE;IACnG;IAEA,eAAU,MAAC,gBAAY,wBAAa;IAEtC;;EAGA;;;;IAEE,uCAAc,gFACA,kCACA,uEAAsC;IAEtD;;EAGA;;;;;;MAGI,iBAAe,sBAAS;MACxB;IACF;IAEF;;EAGA;;IAEA;;EAGA;;;;;;IAEE,IAAc,WAAoB;IAElC,yBAAG,gBAAoB;MACrB,0DAAyB;IAC3B;MACE,0DAAyB;IAC3B;IAEA,YAAS,0EAAyC;IAEpD;;EAGA;;;;;;IAEE,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;MACtB,yBAAuB,sBAAS;MAChC;IACF;IAEA;;;+GAE0C;IAC1C,yBAAuB,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAE9C;;EAGA;;;;;IAGE,kBAAgB,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAEvC;;EAGA;;;;QAEO,ssDAA6B;IAElC,IAAc,oBAAoC;;;MAOhD,sBAAM,OAAO;MACb,kCAAmB,sBAAsB,OAAO,MAAC,KAAI;MACrD,8DAAkC;IACpC;IAEF;;EAGA;;;;IAEE,kBAAgB,sBAAS,KAAO,aACP,KAAO,sCACP,KAAO,iCACP,MAAO,sCAAK;IAEvC;;EAGA;;;;IAEE,kBAAgB,sBAAS,KAAO,SACP,KAAO,sCACP,KAAO,iCACP,MAAO,sCAAK;IAEvC;;EAGA;;;QAGI,s6CAAoC;QACpC,s7DAA2D;IAG7D,sBAAoB,kBAAa;IAEjC,IACE,OAEA,KAHG,SAAL;;+BAEmB;;gCAEC;;6DAEiB;;IAGrC,cAAW,iFAAkD;mDAExB;EAEvC;EAGA;8FAC+B;EAC/B;EAGA;oDACmC;EACnC;EAGA;;;QAGI,2DAAuB;QACvB,6CAA6B;QAC7B,8CAA+B;IAEjC,mCAAW,mCAAS,MAAC,sBAAwB,8CAAe;;IAM5D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;yGAGkB;IACjC;+JACwE;IACxE;EAEF;EAGA;;;;;;QAEQ,4DAAsB;QACtB,wRAAqD;;IAI3D,iBAAuB,GAApB,YAAY,MAAC,SAAS,gCAAC;MACxB,gBAAa,+CAA8B;MAC3C;wBAA8D;IAChE;MACE,cAAY,sCAAK;IACnB;sHAE0C;iGACpB;+EAID;IAErB,iBAAc,GAAX,iBAAa,uBAAS;qHACgB;sHACC;sMAC+B;IACzE;kNACqF;IACrF;kGAEuB;qGACG;IAE5B;;EAGA;;;;;mHAEyC;EAEzC;EAGA;;QAEQ,8mCAAuC;QACvC,8HAA6C;;IAInD,iBAAc,mHAA4D;2GAEtC;oJACiC;+FAC7C;0KAE8C;oIACF;;;iNAIR;6GAEf;IAC7C;IACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wGACiB;IACjC;mGACwB;iFAEqB;sDAE1B;kCAEC;IAEtB;;EAGA;;;;;iaAO2D;2GACd;IAG3C,iBAAgB,GAAb,OAAO,MAAC,OAAQ,0CAAQ;0HACmB;qLACkC;8GAClC;yGACL;uGACb;IAC5B;+IACmE;+HAChB;uHACR;IAC3C;mGACwB;mGAEA;IAE1B;;EAGA;;;;QAEQ,0XAA+C;QAC/C,0DAAoB;QACpB,0DAAoB;;qHAIe;iTAMD;IAExC,iBAAgB,GAAb,OAAO,MAAC,OAAQ,0CAAQ;MACzB,cAAW,yCAAwB;MACnC,iBAAkB,GAAf,OAAO,MAAC,SAAS,kCAAQ,MAAC,MAAI;QAC/B,QAAQ,MAAC,YAA2C,mBAAlB,mBAAhB,QAAQ,MAAC,QAAS,QAAQ,MAAC,SAAS,QAAQ,MAAC,QAAM;QACrE,sBAAO,QAAQ,MAAC,OAAM;QAAtB,sBAAwB,QAAQ,MAAC,OAAM;MACzC;wLAEiF;wLACA;wLACA;IACnF;IAGA,IAAG,CAAI,cAAiB,GAAf,OAAO,MAAC,SAAS,wCAAyB,+BAAO,MAAC,WAAU,iBAC7C,GAAf,OAAO,MAAC,SAAS,wCAAyB,+BAAO,MAAC,OAAM,CAAE,kBAC3C,GAAf,OAAO,MAAC,SAAS,wCAAyB,+BAAO,MAAC,SAAO;MAEhE,aAAU,uSAGwB;MAElC,aAAU,8WAE2D;IACvE;IAEA,yBAAG,kBAAsB;6JACqC;IAC9D;0NACuF;IACvF;iMAIgC;iFAIX;6IAE4C;qKACgB;oGACxD;mGAED;IAE1B;;EAGA;;;;;IAEE,iBAAkB,GAAf,OAAO,MAAC,SAAS,kCAAQ,MAAC,MAAK,iBAAe,GAAX,iBAAa,uBAAS;+QAEkB;IAC9E;IAEA,yBAAG,OAAO,MAAC,oBAAwB,yBAAI,OAAO,MAAC,oBAAuB;wHAC1B;gkBAKR;sGACT;IAC3B;EAEF;EAGA;;;;QAEQ,iJAAyD;QACzD,ssCAAwD;QACxD,iGAA6B;QAC7B,uDAA8B;IAEpC,IAAc,WAA+B;IAC7C,IAAc,gBAAoC;IAElD,oBAAiB,iJAC4E;;IAG7F,cAAW,uCAAsB;IAEjC,iBAAyB,IAAtB,6CAAwB,wBAAU;+FACI;MACvC;IACF;IAEA,mBAAgB,wBAAa;;;MAI3B,aAAW,eAAE,MAAC,MAAK;MAEnB,iBAAmB,GAAhB,WAAS,MAAC,QAAQ,wBAAU;QAC7B,kBAAgB,sBAAS;QACzB;MACF;MAEA,iBAAiB,GAAd,eAAgB,uBAAS;QAE1B;sCAA+D;QAC/D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UAGd,qEAAkC;UAClC,6CAAO,iBAA0B;QACnC;4IAEuD;QACvD,kBAAgB,uBAAU;MAC5B;MAEA,yBAAG,yBAAuB;QACxB,WAAS,MAAC,UAAM,0EAA6C;QAC7D,WAAS,MAAC,UAAM,0EAA6C;MAC/D;QACE,WAAS,MAAC,SAAM,qBAAQ,KAAS,WAAS,MAAC,MACnB,QAAS,+BAAgB,aAAa;QAC9D,WAAS,MAAC,SAAM,qBAAQ,KAAS,WAAS,MAAC,MACnB,QAAS,+BAAgB,aAAa;MAChE;MAEA,yBAAS,WAAS,MAAC,QAAO;MAC1B,yBAAS,WAAS,MAAC,QAAO;MAE1B,iBAAc,GAAX,iBAAa,uBAAS;2HACwC;MACjE;4PAI8D;MAC9D;IAEF;IAEA,iBAAc,GAAX,iBAAa,uBAAS;8FACe;IACxC;IAEF;;EAGA;;QAEO,y1BAAkD;;IAIvD,iBAAc,GAAX,iBAAa,uBAAS;MACvB,YAAY,MAAC,SAAM,kDAAgB;0HAC+B;IACpE;MACE,YAAY,MAAC,SAAM,kDAAgB;qQAIkB;IACvD;IAEF;;EAGA;;;;;;;;;;QAEQ,yDAAmB;QACnB,yDAAmB;QACnB,0DAAmB;QACnB,wDAAmB;;IAOzB,YAAU,gCAAG;IACb,yBAAG,YAAY,MAAC,kBAAqB;MACnC,iBAAa,GAAV,WAAY,kCAAQ,MAAC,MAAK,iBAAuB,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;QAC1F,UAAQ,4CAAW;QACnB,YAAU,gCAAG;MACf,wBAA2B,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;QACjE,UAAQ,4CAAW;QACnB,YAAU,gCAAG;MACf;IACF;IACA,ubAE4E;IAG5E,sBAAM,KAAK;IACX,YAAU,gCAAG;IACb,yBAAG,YAAY,MAAC,kBAAqB;MACnC,iBAAa,GAAV,WAAY,kCAAQ,MAAC,MAAK,iBAAuB,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;QAC1F,UAAQ,4CAAW;QACnB,YAAU,gCAAG;MACf,wBAA2B,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;QACjE,UAAQ,4CAAW;QACnB,YAAU,gCAAG;MACf;IACF;IACA,wbAE6E;oHAGrC;wLASH;kGAEd;IAEzB;;EAGA;;;;;;;;;;;;;;;IAEE,iBAAa,GAAV,WAAY,kCAAQ,MAAC,QAAM;kEACN;kEACA;IACxB;kEACwB;kEACA;IACxB;EAEF;EAGA;;;;IAEE,IAAc,gBAA4C;;IAO1D,iBAAuB,GAApB,YAAY,MAAC,SAAU,wCAAyB,8BAAM,MAAC,QAAM;;;wHAEpB;+hBAIgD;sGACjE;MACzB;;;wHAE0C;+hBAIgD;sGACjE;MACzB;MACA,sBAAM,qBAAgB;IACxB;oHAEwC;IACxC,IACE,OAEA,AAKA,KARG,YAAY,MAAC,OAAlB;;MAEI,gCAAO,sBAAgB,qBAAgB;;qhBAK+C;;qhBAKA;;mkBAKb;;kGAEtD;IAEzB;;EAGA;;;2LAI6F;sHAEjD;4HACM;mJACD;qGACrB;sHACgB;2HACK;6HACE;gGAC5B;gGACA;gHAEe;8JAE8C;gHAC9C;qIACqB;gGACpC;8IAG6C;IAEpE;;EAGA;;;;;oHAG0C;iGAClB;IAEtB,iBAAc,GAAX,iBAAa,uBAAS;8DAEa;IAEtC;oFAIyB;IAEzB;kGAEuB;qGACG;IAE5B;;EAGA;;;;;mHAEyC;oHACC;4GACR;mHACO;oHACC;6GACP;EAEnC;EAGA;;;sHAE4C;sHACA;oHACF;2GACT;EAEjC;EAGA;IAEE,iBAAc,GAAX,iBAAa,uBAAS;MACvB,eAAU,MAAC,iBAAc,uCAAa,MAAC,SAAQ;IACjD;MACE,eAAU,MAAC,iBAAc,uCAAa,MAAC,WAAU;IACnD;EAEF;EAGA;;;;QAEO,4eAAoB;IAEzB,YAAU,YAAO;IAEjB,IACE,OAMA,AAIA,AAIA,AAIA,KAnBG,QAAQ,OAAE,+BAAf;;MAGI,qBAAa,+HAAqE;6BACrE;MACb,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAI3D,YAAO,MAAC,kBAAe,gCAA4B,GAArB,YAAO,MAAC,eAAe,wBAA9B,CAA0C;;MAIjE,YAAO,MAAC,mBAAgB,gCAA6B,GAAtB,YAAO,MAAC,gBAAgB,wBAA/B,CAA2C;;MAInE,YAAO,MAAC,qBAAkB,gCAA+B,GAAxB,YAAO,MAAC,kBAAkB,wBAAjC,CAA6C;;MAIvE,YAAO,MAAC,iBAAc,gCAA2B,GAApB,YAAO,MAAC,cAAc,wBAA7B,CAAyC;;MAI/D,iBAAqC,IAAlC,qFAAoC,uBAAS;uFAEhB;QAC9B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAE7D;QAEE,gBAAa,yEAAyD;MAExE;;IAKJ,iBAAW,GAAR,cAAW,QAAO;8FACe;MAClC,eAAU,MAAC,gBAAY,wBAAa;MACpC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;IAC7D;IAEF;;EAGA;;QAEQ,+iBAA+C;IAErD,gBAAgB,MAAC,kBAAe,uCAAM;IAEtC,gBAAgB,MAAC,6DAA6B;IAC9C,gBAAgB,MAAC,YAAc,mCAAS,MAAC,cAAa;IACtD,gBAAgB,MAAC,4CAAiB;IAClC,gFAAoD;IAEpD,gBAAgB,MAAC,2DAA2B;IAC5C,gBAAgB,MAAC,YAAc,mCAAS,MAAC,YAAW;IACpD,gBAAgB,MAAC,4CAAiB;IAClC,gFAAoD;IAEpD,gBAAgB,MAAC,oEAAoC;IACrD,gBAAgB,MAAC,YAAc,mCAAS,MAAC,eAAc;IACvD,gBAAgB,MAAC,4CAAiB;IAClC,gFAAoD;IAEpD,gBAAgB,MAAC,wEAAwC;IACzD,gBAAgB,MAAC,YAAc,mCAAS,MAAC,oBAAmB;IAC5D,gBAAgB,MAAC,4CAAiB;IAClC,gFAAoD;IAEtD;;AACF","file":"zcl_abapgit_gui_page_diff.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_ex_object.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,218,223,342,346,244,57,231,56,17,12,42,22,130,137,142,147,52,58,3,29,31,100,95,133,53,111,16,3,18,51,3,25,143,152,98,185,19,3,25,107,284,101,67,105,125,118,121,140,101,67,29,42,17,7,154,5,3,27,129,144,311,313,163,393,19,3,55,363,134,64,143,67,91,94,97,33,159,94,109,291,145,98,14,100,7,5,22,3,45,123,35,79,123,167,100,19,3,1,80,288,73,73,69,291,68,66,90,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_ex_object.clas.abap"],"names":[],"mappings":";;;AAoDA;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;8BACuB;;;oIAMC;IAEtB,kBAAU,6BAAkB;IAC5B,uBAAe,kFAA8C;IAC/D;;EAGA;;;;;QACO,+IAAuD;;IAG5D,aAAU,sKAE2B;IACvC;;EAGA;QACO,kGAA6B;QAC7B,mRAA0D;QAC1D,4FAA6B;QAC7B,0DAAmB;QACnB,gGAA2B;IAEhC,oBAAiB,mGAAqC;IACtD,aAAU,mGAAqC;IAC/C,kBAAe,iGAAmC;IAElD,qIAAkD;IAClD;;;MAGE,yBAAG,QAAkB;QACnB;MACF;yJAImC;IACrC;EACF;EAGA;;IACE,aAAU,6HAAsE;sTAOjC;wTAOjB;kKAID;wYAQO;IACtC;;EAGA;;;;IACE,uBAAe,kHAAiD;IAEhE,IACE,OAIA,AAMA,KAXG,QAAQ,OAAE,+BAAf;;MAGI,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;gCAIzC;MAChB,sJAA+C;MAC/C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;kSAM8B;MAEvF,0BAAG,8GAAoD;QACrD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;;IAEN;;EAGA;;kCACsB;;0HAI0B;sKAGH;mGACnB;IAC1B;;AACF","file":"zcl_abapgit_gui_page_ex_object.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_ex_pckage.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,218,223,344,350,244,58,231,56,17,12,42,22,130,137,142,147,52,58,3,29,31,100,95,53,111,16,3,18,51,3,25,143,152,98,183,19,3,26,102,75,110,117,127,131,155,3,27,129,145,1855,19,3,55,363,134,64,143,67,91,94,105,110,102,98,14,36,162,96,7,105,289,141,98,14,100,7,5,22,3,45,123,35,79,167,19,3,1,80,290,65,75,79,295,68,82,86,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_ex_pckage.clas.abap"],"names":[],"mappings":";;;AAoDA;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;8BACuB;;;IAGrB,kBAAU,6BAAkB;IAC5B,uBAAe,kFAA8C;IAC/D;;EAGA;;;;;QACO,+IAAuD;;IAG5D,aAAU,oKAE2B;IACvC;;EAGA;QACO,6FAAwB;QACxB,kEAA2B;QAC3B,qGAAgC;IAErC,gBAAoB,+FAAiC;IACrD,qBAAoB,oGAAsC;IAC1D,uBAAoB,sGAAwC;0JAKjB;EAC7C;EAGA;;IACE,aAAU,8HAAuE;8zDAgC3C;IACxC;;EAGA;;;;IACE,uBAAe,kHAAiD;IAEhE,IACE,OAIA,AAWA,KAhBG,QAAQ,OAAE,+BAAf;;MAGI,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;MAIzD,4BAAoB,0EAAsC;MAC1D,iBAAkC,IAA/B,gDAAiC,wBAAU;QAC5C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;mCACmB;QACjB,uJAAgD;QAChD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;MAC3D;;gSAMyF;MAEzF,0BAAG,0GAAgD;QACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;;IAEN;;EAGA;;kCACsB;;sKAMuB;IAC7C;;AACF","file":"zcl_abapgit_gui_page_ex_pckage.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_hoc.clas.mjs":{"lineLengths":[79,53,37,61,32,52,153,243,216,250,245,58,1618,235,1341,17,12,42,22,145,3,29,154,94,1053,70,31,42,36,88,75,5,73,88,5,74,90,5,16,3,23,50,3,30,148,154,94,73,79,74,82,152,140,76,163,103,158,106,76,88,75,85,109,88,114,135,1053,51,53,49,67,69,57,55,57,151,30,24,3,32,148,9,56,17,106,14,16,7,5,18,3,24,104,134,9,58,79,17,106,14,16,7,5,23,3,33,142,9,56,17,106,14,16,7,5,18,3,21,144,32,20,3,26,123,56,83,5,19,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_gui_page_hoc.clas.abap"],"names":[],"mappings":";;;AAwDA;;;;;;;;;;;;;;;;;;EAGE;;;;;8BAEuB;IAErB,kBAAW,kBAAkB;IAC7B,oBAAa,UAAU;IAEvB,iBAA4B,GAAzB,eAAU,MAAC,gBAAgB,wBAAU;MACtC,eAAU,MAAC,oBAAgB,0BAAe;IAC5C;IAEA,yBAAG,eAAU,MAAC,oBAA+B;MAC3C,eAAU,MAAC,yBAAqB,kCAAuB;IACzD;IAEA,yBAAG,eAAU,MAAC,qBAAgC;MAC5C,eAAU,MAAC,0BAAsB,mCAAwB;IAC3D;IAEF;;EAGA;;;;;;;;;;;;;;;;;;;;;;;;;QAEO,8HAA4C;QAC5C,ohCAAgD;IAErD,UAAU,MAAC,gBAAsB,aAAa;IAC9C,UAAU,MAAC,iBAAsB,cAAc;IAC/C,UAAU,MAAC,eAAsB,YAAY;IAC7C,UAAU,MAAC,wBAAsB,qBAAqB;IACtD,UAAU,MAAC,yBAAsB,sBAAsB;IACvD,UAAU,MAAC,mBAAsB,gBAAgB;IACjD,UAAU,MAAC,kBAAsB,eAAe;IAChD,UAAU,MAAC,mBAAsB,gBAAgB;;IAOjD,iBAAe,OAAO;IAExB;;EAGA;;IACE;iCACI,QAAU,aAAQ;;;;;;IAEtB;IACF;;EAGA;;QAEO,6HAA0C;IAE/C;iCACI,UAAY,aAAQ;MACpB,iBAAc,sDAAqB;;;;;;IAEvC;IAEF;;EAGA;;IACE;iCACI,QAAU,aAAQ;;;;;;IAEtB;IACF;;EAGA;;IACE,aAAW,aAAQ;IACrB;;EAGA;;IAEE,yBAAG,wBAAiB;MAClB,aAAU,8DAAmB;IAC/B;IAEF;;AACF","file":"zcl_abapgit_gui_page_hoc.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_merge.clas.mjs":{"lineLengths":[79,53,39,63,32,54,153,231,203,281,2068,376,58,444,83,17,12,42,22,134,127,58,3,27,135,109,88,87,171,68,161,5,19,3,29,133,61,69,67,69,67,31,30,281,133,54,83,148,16,3,26,123,4977,721,497,527,77,148,79,109,232,101,98,110,98,91,105,98,110,98,91,105,98,112,98,93,105,102,98,90,90,90,101,95,101,98,117,103,117,103,119,103,117,103,99,67,36,39,71,133,146,29,89,100,126,126,126,127,101,5,102,98,97,82,98,100,19,3,26,724,73,123,61,495,61,497,67,527,66,123,136,27,79,88,74,292,14,285,7,12,115,5,3,55,363,134,64,67,87,115,123,7,155,123,7,146,218,14,203,7,95,102,181,95,12,97,5,22,3,1,72,222,62,78,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_merge.clas.abap"],"names":[],"mappings":";;;AA8CA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;0KAMqC;IAEnC,iBAAoB,GAAjB,kBAAmB,uBAAS;gKAEmB;IAClD;IAEF;;EAGA;;;;;;;8BAEuB;IAErB,iBAAU,OAAO;wRAEkF;;qDAMnF;IAEhB,eAAU,MAAC,gBAAa,wCAAO;IAC/B,eAAU,MAAC,gBAAa,yGAAwC;IAElE;;EAGA;;QAEQ,w2JAA0C;QAC1C,wsBAA6B;QAC7B,weAAsC;IAE5C,IAAe,WAA+B;IAE9C,cAAW,yDAAuB;IAGlC,eAAU,MAAC,gBAAY,yGAAwC;;4GAI/B;uOAIE;oGAET;iGACH;6GACW;iGACX;0FACc;wGACR;iGACN;6GACW;iGACX;0FACc;wGACR;iGACN;+GACa;iGACb;4FACgB;wGACV;qGACF;iGAEJ;IAEtB,gCAAgB,QAAQ,MAAC,6BAAS,QAAQ;IAC1C,gCAAgB,QAAQ,MAAC,6BAAS,QAAQ;IAC1C,gCAAgB,QAAQ,MAAC,6BAAS,QAAQ;IAC1C;;oGAGyB;iGACH;oHACkB;sGACb;oHACa;sGACb;sHACe;sGACf;oHACa;sGACb;kGACJ;;;MAErB,sBAAM,SAAS;MACf;;;;uFACsD;mGAEhC;6HAIc;6HAIA;6HAIA;8HAIA;oGACb;IACzB;qGAC0B;iGACJ;gGACD;iFACY;iGACX;mGACE;IAE1B;;EAGA;;;;;;;;;IAEE,IAAe,WAAkC;IAGjD;;;;6EAGuB;IACvB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,iBAAkB,GAAf,WAAS,MAAC,OAAO,SAAS,MAAC,MAAI;mSACoE;MACtG;4RAC+F;MAC/F;IACF;kHACsC;IACtC;EAEF;EAGA;;;;IAEE,IACE,OA0BA,KA3BG,QAAQ,OAAE,+BAAf;;MAEI,iBAA8B,IAA3B,8DAA6B,uBAAS;0HACW;MACpD;MAEA,iBAA2C,IAAxC,6FAA0C,gCAAC;0HACM;MACpD;MAEA,2BAAG,uEAA+B,uCAA2C;;MAO7E;QAEE,UAAU,MAAC,WAAO,sKAE0B;MAE9C;MAEA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;;MAS1D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAG1D,gBAAa,yEAAyD;;IAG5E;;AACF","file":"zcl_abapgit_gui_page_merge.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_merge_res.clas.mjs":{"lineLengths":[79,53,43,67,32,58,153,224,222,210,966,158,150,1234,476,280,254,227,404,2048,1140,1145,1141,1128,222,56,61,58,577,83,17,12,42,22,127,146,134,890,82,74,1158,62,68,3,37,134,64,76,81,967,162,171,127,87,35,126,63,97,3,22,135,87,161,144,19,3,29,133,61,145,79,126,64,31,30,96,67,42,32,88,72,84,16,3,26,99,67,55,67,55,101,48,67,12,67,5,92,18,3,30,123,866,76,884,61,69,289,79,86,71,77,26,12,60,5,119,98,116,209,99,102,19,3,26,123,30,50,122,5,79,208,113,100,19,3,28,123,884,61,77,967,79,343,108,89,109,125,133,95,108,106,104,14,125,119,121,102,112,111,350,104,103,106,102,133,95,108,106,91,39,92,146,131,9,103,102,127,164,138,157,255,142,105,104,103,106,104,7,12,144,128,120,102,5,100,19,3,33,123,884,61,387,79,118,145,63,185,185,185,5,171,100,19,3,29,123,884,61,154,1231,106,893,121,79,59,67,36,78,50,17,7,67,136,51,7,59,111,111,14,137,137,7,75,75,120,5,19,3,34,123,866,76,66,66,67,65,79,50,138,62,52,145,62,52,5,330,33,50,138,62,52,145,62,52,5,330,98,65,65,99,19,3,29,123,79,117,98,116,107,165,268,349,102,103,118,165,262,349,102,103,12,271,118,264,5,99,102,19,3,24,63,967,45,87,35,88,13,5,65,73,98,131,141,186,81,5,251,82,5,99,190,5,3,29,107,86,12,90,5,3,55,363,134,64,967,67,364,69,99,62,107,91,39,81,81,101,107,91,39,81,81,101,7,125,106,62,7,75,98,14,54,96,7,104,37,96,5,22,3,1,80,422,78,78,80,80,68,225,77,69,912,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_merge_res.clas.abap"],"names":[],"mappings":";;;AA6GA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;QAGI,mEAA+B;QAC/B,wEAAgC;IAElC,IACE,eAAuD;IAEzD,sBAAmB,sIAA8C;IAEjE,oKAC2F;IAE3F,yBAAsB,gGAA+D;IAErF;iCAA+E;IAC/E,eAAa,MAAC,kBAAc,iFAAkD;IAC9E,eAAa,MAAC,iBAAc,mBAAmB;gGACJ;EAE7C;EAGA;;;gKAIgD;+IAEL;IAE3C;;EAGA;;;;;;;8BAEuB;IAErB,iBAAU,OAAO;IACjB,eAAU,MAAC,gBAAa,qDAAmB;IAC3C,eAAU,MAAC,gBAAa,wBAAa;IAErC,uBAAgB,aAAa;IAC7B,kBAAW,QAAQ;IACnB,uBAAgB,2CAAY,MAAC,UAAS;IACtC,mCAA4B,+BAAC;IAC7B,uBAAe,uDAA0B;IAE3C;;EAGA;;;;;;IAEE,IAAc,WAAoB;IAGlC,yBAAG,gBAAoB;MACrB,0DAAyB;IAC3B;MACE,0DAAyB;IAC3B;IAEA,YAAS,0EAAyC;IAEpD;;EAGA;;;;;;QAEQ,4DAAsB;QACtB,wRAAqD;;IAI3D,iBAAuB,GAApB,YAAY,MAAC,SAAS,gCAAC;MACxB,gBAAa,+CAA8B;MAC3C;wBAA8D;IAChE;MACE,cAAY,sCAAK;IACnB;sHAG0C;iGACpB;mHAEiB;gNAC4C;kGAE5D;qGACG;IAE5B;;EAGA;;6BAEiB;IACf,yBAAG,kBAAuB;yHAC2B;IACrD;;+MAG8E;gHACnC;mGACnB;IAE1B;;EAGA;;;;QAEQ,oEAA6B;IACnC,IAAe,eAAuD;;sVAMb;2GACd;IAG3C,iBAAgB,GAAb,OAAO,MAAC,OAAQ,0CAAQ;MAEzB,iBAAiB,GAAd,oBAAgB,2CAAY,MAAC,WAAS;4HACK;oIACQ;8FAChB;2GACG;yGACb;uGACF;MAC1B;4HAG8C;sHACN;wHACE;qGAClB;+GACS;8GACD;6VAIgC;uGACtC;sGACD;yGACG;qGACJ;oIAG8B;8FAChB;2GACG;yGACb;QAE1B;qCAA+E;QAC/E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,uBAAoB,+GAAwE;UAC5F,sBAAoB,qBAAQ,KAAM,mBACN,QAAS,+BAAgB,aAAa;QACpE;sGAEuB;qGACD;8HACwB;mKAC0C;yIAC1B;4JACmB;8PACY;6IAChC;wGACpC;uGACD;sGACD;yGACG;uGACF;MAC1B;IACF;+IACmE;+HAChB;uHACR;qGACjB;IAC1B;mGAEwB;IAE1B;;EAGA;;;;QAEQ,0XAA+C;;qHAIZ;IAEzC,iBAAgB,GAAb,OAAO,MAAC,OAAQ,0CAAS,yBAAI,OAAO,MAAC,kBAAqB;MAC3D,cAAW,yCAAwB;wLAC8C;wLACA;wLACA;IACnF;0KAEqE;mGAC7C;IAE1B;;EAGA;;;;QAEQ,iJAAyD;QACzD,ssCAAwD;QACxD,iGAA6B;IAEnC,IAAc,WAAgC;IAE9C,oBAAiB,+FAAsD;;IAGvE,cAAW,uCAAsB;;;MAG/B,iBAAmB,GAAhB,WAAS,MAAC,QAAQ,wBAAU;QAC7B,kBAAgB,sBAAS;QACzB;MACF;MAEA,iBAAiB,GAAd,eAAgB,uBAAS;uIAEwB;QAClD,kBAAgB,uBAAU;MAC5B;MAEA,yBAAG,yBAAuB;QACxB,WAAS,MAAC,UAAM,0EAA6C;QAC7D,WAAS,MAAC,UAAM,0EAA6C;MAC/D;QACE,WAAS,MAAC,SAAM,qBAAQ,KAAM,WAAS,MAAC,MAChB,QAAS,+BAAgB,aAAa;QAC9D,WAAS,MAAC,SAAM,qBAAQ,KAAM,WAAS,MAAC,MAChB,QAAS,+BAAgB,aAAa;MAChE;MAEA,yBAAS,WAAS,MAAC,QAAO;MAC1B,yBAAS,WAAS,MAAC,QAAO;uHAEoB;IAEhD;IAEF;;EAGA;;;;QAEQ,yDAAmB;QACnB,yDAAmB;QACnB,0DAAmB;QACnB,wDAAmB;;IAKzB,YAAU,gCAAG;IACb,iBAAuB,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;MAC7D,UAAQ,4CAAW;MACnB,YAAU,gCAAG;IACf,wBAA2B,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;MACjE,UAAQ,4CAAW;MACnB,YAAU,gCAAG;IACf;IACA,oUACyE;IAGzE,sBAAM,KAAK;IACX,YAAU,gCAAG;IACb,iBAAuB,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;MAC7D,UAAQ,4CAAW;MACnB,YAAU,gCAAG;IACf,wBAA2B,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;MACjE,UAAQ,4CAAW;MACnB,YAAU,gCAAG;IACf;IACA,oUACyE;iGAGnD;gEACA;gEACA;kGACC;IAEzB;;EAGA;;;oHAI0C;iGAClB;mHACiB;IAEvC,iBAAiB,GAAd,oBAAgB,2CAAY,MAAC,WAAS;oKAC+C;2QACX;4VAIb;qGACtC;sGACC;qHACc;oKAC+C;qQACX;4VAIb;qGACtC;sGACC;IAC3B;8QACgF;qHACvC;uQACsC;IAC/E;kGAEuB;qGACG;IAE5B;;EAGA;QAEQ,sDAAc;IACpB,IAAe,eAAuD;IAEtE,sBAAM,iBAAY;IAElB;iCAA+E;IAC/E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IAEA,iBAAY,MAAC,UAAW,eAAa,MAAC,KAAI;IAC1C,iBAAY,MAAC,cAAW,eAAa,MAAC,SAAQ;IAC9C,iBAAY,MAAC,UAAO,2BAAS,eAAa,MAAC,WAAU;;IAGrD,iBAAY,MAAC,UAAO,2BAAS,wBAAW,KAAM,iBAAY,MAAC,OACnB,KAAM,WAAW;IACzD,iBAAqB,GAAlB,iBAAY,MAAC,OAAQ,uCAAM,iBAAsB,GAAlB,iBAAY,MAAC,OAAQ,wCAAM;MAC3D,iBAAY,MAAC,UAAO,wCAAO;IAC7B;IAEA,iBAAqB,GAAlB,iBAAY,MAAC,OAAO,yCACvB,iBACmD,IAD/C,6GACiD,uBAAS;MAC5D,iBAAY,MAAC,UAAO,yCAAQ;IAC9B;IAEA,iBAAqB,GAAlB,iBAAY,MAAC,OAAQ,0CAAQ;;IAKhC;EAEF;EAGA;IAEE,iBAAiB,GAAd,oBAAgB,2CAAY,MAAC,WAAS;MACvC,uBAAgB,2CAAY,MAAC,MAAK;IACpC;MACE,uBAAgB,2CAAY,MAAC,UAAS;IACxC;EAEF;EAGA;;;;IAEE,IAAe,eAAuD;IAEtE,IACE,OAmCA,KApCG,QAAQ,OAAE,+BAAf;;MAMI,IACE,OAGA,AAMA,KAVG,QAAQ,OAAE,+BAAf;;6DAEoC;;QAGhC;qCAA+E;QAC/E,eAAa,MAAC,iBAAc,eAAa,MAAC,YAAW;QACrD,eAAa,MAAC,iBAAc,eAAa,MAAC,YAAW;oGACV;;QAG3C;qCAA+E;QAC/E,eAAa,MAAC,iBAAc,eAAa,MAAC,YAAW;QACrD,eAAa,MAAC,iBAAc,eAAa,MAAC,YAAW;oGACV;;MAI/C,mCAAsD,mBAA1B,+BAA4B,gCAAC;MACzD,iBAA6B,GAA1B,gCAA4B,yBAAO,oBAAc;QAClD,sBAAM,8BAAyB;MACjC;MAEA,yBAAG,yCAAwC;QACzC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,UAAO,kBAAa;QAC/B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;MAC3D;;oCAGoB;MACpB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAIjE;;AACF","file":"zcl_abapgit_gui_page_merge_res.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_merge_sel.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,223,210,1006,331,212,75,226,394,217,17,12,42,22,130,137,147,134,930,52,58,3,29,123,61,31,95,54,31,53,111,16,3,23,56,3,30,143,123,61,152,116,176,19,3,27,129,654,218,594,75,38,123,5,189,75,38,123,5,434,19,3,25,145,152,72,194,3,55,363,134,64,140,143,67,125,94,96,222,132,7,331,42,95,5,22,3,45,123,35,79,108,238,124,96,19,3,1,80,277,67,63,63,157,64,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_merge_sel.clas.abap"],"names":[],"mappings":";;;AA2DA;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;8BAEuB;;+BAErB,cAAW,OAAO;8BAEF;IAEhB,kBAAU,6BAAkB;IAC5B,uBAAe,kFAA8C;IAE/D;;EAGA;;;;;;;QAEO,+IAAuD;;IAM5D,aAAU,6JAE2B;IAEvC;;EAGA;;IAEE,IAAc,aAAoC;IAElD,aAAU,uMAE8C;ilBAYxB;;;0HAKS;IACzC;4LAK2B;;;0HAKc;IACzC;ibAQ2D;IAE7D;;EAGA;QAEO,wIAAmD;IAExD,iBAAc,iIAA0D;IACxE,sBAAc,4CAAiC;;EAIjD;EAGA;;;;QAEO,mIAA+C;IAEpD,uBAAe,kHAAiD;IAEhE,IACE,OAGA,KAJG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;MAGzD,iBAAoC,IAAjC,iGAAmC,+FAAgC;mIACT;MAC7D;;MAQA,UAAU,MAAC,UAAO,QAAQ;MAC1B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;IAIhE;;EAGA;;kCAEsB;;2GAIgB;6OAKkB;2HAEK;+FAEnC;IAE1B;;AACF","file":"zcl_abapgit_gui_page_merge_sel.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_patch.clas.mjs":{"lineLengths":[89,53,39,68,32,54,296,220,149,179,217,219,351,1356,1400,229,244,1556,56,311,1490,427,327,1228,1128,219,58,58,56,73,70,72,54,65,51,3404,82,86,389,17,12,42,22,123,73,103,141,70,68,3,31,135,61,391,383,3,29,135,61,278,53,3,24,1230,113,1057,70,146,1175,77,41,64,17,7,69,121,91,29,64,93,17,7,55,159,70,196,122,145,14,198,122,16,125,9,165,7,5,73,113,5,3,32,68,64,106,79,71,262,73,100,105,67,37,114,121,5,3,32,71,73,73,79,106,79,119,866,63,74,99,46,237,46,94,129,46,94,5,3,45,134,64,66,69,154,160,90,94,3,38,117,1230,61,70,893,202,36,93,5,122,36,3,29,101,58,508,61,599,67,1983,64,107,108,150,5,66,43,28,86,83,67,16,3,30,861,119,61,73,79,1230,69,37,45,60,22,88,160,5,19,3,32,119,71,73,1175,77,41,115,51,14,7,5,40,156,5,19,3,31,60,3,38,68,64,71,70,73,76,70,39,41,226,88,113,5,3,22,106,46,25,3,39,68,3,46,118,866,76,400,60,5,37,3,24,47,64,1455,46,48,75,3,43,123,61,1138,61,105,108,251,99,3,26,123,49,66,32,34,44,5,35,48,82,19,3,45,123,61,1138,61,69,244,123,121,466,103,5,3,38,123,61,71,73,866,76,64,64,94,67,66,58,66,58,122,186,3,29,123,61,71,73,866,76,64,64,139,71,65,103,113,129,96,72,175,157,166,97,12,157,97,5,3,34,123,61,1138,61,108,198,99,3,26,123,79,188,110,116,19,3,46,123,61,1138,61,71,84,3,36,1455,91,1234,1175,1179,897,77,41,72,40,151,164,29,107,90,17,7,68,17,7,77,208,42,143,7,5,3,30,134,64,66,30,3,55,363,134,64,67,93,53,149,95,12,138,70,88,98,14,99,7,5,22,3,54,884,568,86,89,81,72,87,89,83,72,87,87,81,72,87,29,3,1,72,161,74,292,63,69,131,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_patch.clas.abap"],"names":[],"mappings":";;;AAwIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;sYAOgD;8XAOF;EAE9C;EAGA;;;qRAKgE;oDAElC;EAE9B;EAGA;QAEQ,qsCAA8D;QAC9D,wGAAmC;QACnC,whCAA4D;QAC5D,6DAAiC;QACjC,yIAA0D;IAEhE,IAAe,gBAAgC;;;MAI7C,yBAAG,gBAAc,MAAC,QAAmB;QAGnC;MACF;MAEA,aAAU,gDAA6B;MAEvC;;;8DACkD;MAClD,mBAAe,GAAT,eAAE,MAAC,QAAQ;iBAAC;;MAElB,yBAAuB,sBAAS;;MAMhC,cAAW,gDAAqC;MAEhD,iBAAyB,GAAtB,gBAAc,MAAC,SAAS,qCAAI,iBAAqC,IAAjC,uDAAmC,uBAAS;QAE7E,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;gJAIlB;MAE3C;QAEE,iBAAyB,GAAtB,gBAAc,MAAC,SAAS,qCAAI,iBAAqC,IAAjC,uDAAmC,uBAAS;UAC7E,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;QAC3D;UACE,SAAS,MAAC,YAAS,wCAAyB,+BAAO,MAAC,SAAQ;QAC9D;oKAM0B;MAE5B;IAEF;IAEA,iBAAwB,GAArB,sBAAuB,wBAAU;gHACa;IACjD;EAEF;EAGA;;;;;QAEQ,8DAAyB;QACzB,6PAA+B;QAC/B,gEAAyB;IAE/B,IAAe,YAAwC;IAEvD;;;iHASqC;wHAIa;IAElD;EAEF;EAGA;;;;;;;QAEQ,8GAAyC;QACzC,y1BAAkD;QAClD,sDAAmB;IAEzB,aAAU,uDAA8B;IAExC,kBAAe,2EAC8C;IAE7D,IACE,OAQA,KATG,YAAY,MAAC,OAAlB;;MAII,YAAU,YAAY,MAAC,QAAO;6FAGyB;;MAIvD,YAAU,YAAY,MAAC,QAAO;6FAGyB;;EAI7D;EAGA;;;QAGI,yDAAqB;QACrB,4DAAqB;IAEvB,YAAY,wIAAiD;IAC7D,eAAY,2IAAoD;yFAGpB;6FAGC;EAE/C;EAGA;;;;QAEQ,6DAAqB;IAE3B,IAAe,WAA+C;;;MAI5D,mBAAgC,mBAAf,eAAiB,gCAAC;IACrC;IAEA,6BAA2B,gCAAsB,GAAf,gBAAiB,yBAAO,UAA/B,CAA0C;IAEvE;;EAGA;;;;;;;;;0GAM0B;IAExB,iBAA0B,IAAvB,yDAAyB,uBAAS;qJACiD;IACtF;+BAEA,qBAAkB,YAAO;IAGzB,sBAAO,eAAU;2BACJ;;IAGb,eAAU,MAAC,gBAAa,wCAAO;IAC/B,eAAU,MAAC,gBAAY,wBAAa;IAEtC;;EAGA;;;;;;QAEQ,qsCAAuD;QACvD,4DAA2B;IAGjC,kBAAgB,aAAa;IAC7B,aAAU,0BAAe;IAEzB;oBACsC;IACtC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+JACwD;IACxE;IAEF;;EAGA;;;;IAEE,IAAe,gBAAyC;;;MAGtD,iBAAoD,IAAjD,yEAAmD,YAAW;QAC/D,YAAU,gBAAc,MAAC,OAAM;QAC/B;MACF;IACF;IAEA,yBAAG,QAAoB;2JAC6C;IACpE;IAEF;;EAGA;;;;;;;;;;QAEQ,6DAAsB;IAE5B,sBAAO,WAAW;IAAlB,sBAAoB,aAAa;;IAKjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gHACiC;IACjD;EAEF;EAGA;;IAGE,kBAAgB,sBAAS;IAE3B;;EAGA;;;;;;;IAEE,iBAAuB,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QACzD,iBAAuB,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QACzD,iBAAuB,GAApB,YAAY,MAAC,SAAS,wCAAyB,8BAAM,MAAC,QAAM;MAC7D,8BAA4B,sBAAS;IACvC;IAEF;;EAGA;;;QAEQ,s6CAAoC;IAE1C,sBAAoB,kBAAa;+CAEN;0EAEa;EAE1C;EAGA;;;;;IAEE,0BAAoC,mBAAjB,sBAAmB,gCAAC;2GAEH;0PAC+E;kGAC5F;EAEzB;EAGA;;IAEE,sBAAO,qBAAgB;IAEvB,iBAAa,GAAV,gBAAY,uBAAS;+BACP;iCACE;MACjB,sBAAO,cAAS;IAClB;kCAEoB;IAEpB,aAAU,6BAAwB;iFAEW;IAE/C;;EAGA;;;;;QAEQ,4DAAqB;IAE3B,8OAA0F;IAE1F,yBAAG,OAAO,MAAC,oBAAwB,yBAAI,OAAO,MAAC,oBAAuB;wHAE1B;idAOR;sGACT;IAC3B;EAEF;EAGA;;;;;;;;;;;;;;;yHAKyC;yLASZ;EAE7B;EAGA;;;;;;;;;;;QAQI,wDAAgC;QAChC,8FAAmC;QACnC,wGAAmC;IAErC,gBAAa,2GAA2D;IAExE,0BAAuB,gEAAsC;IAE7D,iBAAwB,GAArB,sBAAuB,uBAAS;MAEjC,uKAA2D;4JAEN;qKAGxB;gGACN;IAEzB;4JAEuD;gGAC9B;IAEzB;EAEF;EAGA;;;;;2GAEsC;qMAC+C;kGAC5D;EAEzB;EAGA;;;2LAI6F;6GAC1D;mHACM;IAEzC;;EAGA;;;;;sEAGwC;mFAIf;EAEzB;EAGA;;;QAGI,ysCAAqD;IAEvD,IACE,gBAAoC;IADtC,IAEE,oBAAoC;IAFtC,IAGE,eAAwD;;;MAIxD;;;;;yGAG0E;MAC1E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd;MACF;MAEA,yBAAG,oBAAkB,MAAC,QAAmB;QACvC;MACF;MAEA,iBAAc,oDAAiC;;;8IAOd;MAEjC;IAEF;EAEF;EAGA;;;iEAE0C;6BACzB;EAEjB;EAGA;;;;IAEE,IACE,YADG,QAAQ,OAAE,+BAAf;;oDAG6B;MAEzB,UAAU,MAAC,WAAO,kHAEK;MAEvB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAI1D,iBAAqC,IAAlC,qFAAoC,uBAAS;qEAEN;uFACV;QAC9B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAE7D;QAEE,gBAAa,yEAAyD;MAExE;;IAIN;;EAGA;;QAEQ,+iBAA+C;IAErD,gBAAgB,MAAC,kBAAe,wCAAO;IAEvC,gBAAgB,MAAC,6DAA6B;IAC9C,gBAAgB,MAAC,qDAA0B;IAC3C,gBAAgB,MAAC,4CAAiB;IAClC,gFAAoD;IAEpD,gBAAgB,MAAC,6DAA6B;IAC9C,gBAAgB,MAAC,uDAA4B;IAC7C,gBAAgB,MAAC,4CAAiB;IAClC,gFAAoD;IAEpD,gBAAgB,MAAC,2DAA2B;IAC5C,gBAAgB,MAAC,qDAA0B;IAC3C,gBAAgB,MAAC,4CAAiB;IAClC,gFAAoD;IAEtD;;AACF","file":"zcl_abapgit_gui_page_patch.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_repo_over.clas.mjs":{"lineLengths":[89,65,53,43,72,32,58,155,365,216,706,345,158,156,183,213,420,2112,2513,2279,224,224,2281,2050,222,229,2114,2118,219,226,222,1043,2419,172,57,381,204,17,12,42,22,268,140,630,60,86,80,3,29,2018,70,63,62,75,1817,67,13,5,98,248,91,85,115,93,125,14,74,37,50,132,88,32,61,94,78,11,9,7,12,683,5,3,31,2018,70,437,237,72,57,53,68,79,37,224,142,14,69,57,7,81,70,5,41,3,30,943,168,121,565,61,206,5,2149,55,25,3,35,261,2018,73,1817,70,33,92,5,37,111,67,19,3,29,110,91,31,158,69,77,5,16,3,23,56,3,30,143,110,91,152,136,214,19,3,42,2018,348,88,1792,155,75,36,41,231,91,86,88,181,86,94,97,100,131,104,104,186,7,110,114,109,196,7,78,5,23,3,29,2019,348,94,140,12,130,5,99,89,59,57,24,3,33,123,72,31,76,48,75,46,75,39,138,147,146,493,494,494,497,461,498,498,458,164,526,530,182,661,653,282,85,19,3,29,123,73,79,230,339,133,97,94,61,12,61,5,133,474,421,101,19,3,35,67,266,148,165,169,134,159,143,156,19,3,34,123,61,125,91,95,96,3,41,123,61,51,13,5,122,126,279,96,3,33,123,61,2018,73,97,55,80,55,98,3,26,123,79,188,157,19,3,34,123,61,2019,76,1820,101,71,36,77,5,98,3,36,123,61,94,99,115,467,102,100,5,3,36,123,61,97,94,305,99,102,3,34,123,61,1788,61,110,77,76,75,67,108,74,81,12,63,5,256,254,392,69,91,12,79,5,184,81,246,5,332,61,256,5,291,69,206,12,48,5,53,48,12,197,5,353,145,348,140,192,434,95,3,25,170,3,27,328,73,141,82,35,88,160,5,109,31,3,29,71,73,77,85,5,58,31,3,36,112,97,74,31,3,55,363,134,64,101,137,67,91,143,11,164,19,108,16,18,9,7,113,95,140,171,96,141,183,186,14,161,7,33,96,134,273,96,104,93,96,104,92,172,14,66,7,33,96,133,121,95,5,22,3,54,884,568,95,97,133,72,87,98,134,72,87,92,130,72,87,81,127,72,87,80,131,72,87,81,138,72,87,80,127,72,87,81,127,72,87,95,72,72,87,91,73,72,87,91,74,76,87,88,75,72,87,29,3,50,138,147,1020,210,288,5,22,3,45,123,2018,1326,172,145,54,79,127,117,53,60,78,96,82,189,35,19,3,1,80,291,67,79,79,104,67,101,62,1815,2042,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.abap"],"names":[],"mappings":";;;;AA+KA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;QAEO,sDAAc;QACd,qDAAa;QACb,kEAA2B;IAChC,IAAc,QAA+B;IAE7C,yBAAG,qBAAgB,MAAC,QAAiB;MACnC;IACF;IAEA,YAAU,0BAAQ,sDAAuB;IAEzC,iBAAqC,GAAlC,0BAAQ,qBAAgB,MAAC,WAAW,QAAQ,iBAAuC,GAAnC,qBAAgB,MAAC,iDAAoB,qDAAqB;MAC3G,oBAAkB,qBAAgB,MAAC,oCAAc;MACjD,iBAAmB,GAAhB,iBAAkB,uCAAK;;MAE1B,wBAAuB,GAAhB,iBAAkB,wCAAM;;MAE/B;;;UAEI,WAAS,eAAE,MAAC,MAAK;UACjB;;;2DAAqF;UACrF,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;UAEhB;QACF;MACF;IACF;;IAWA;EAEF;EAGA;;;QAGI,4aAA+B;QAC/B,oOAA4B;IAE9B,OAAO,MAAC,UAAO,2CAAU;IACzB,OAAO,MAAC,gBAAa,sBAAS;IAC9B,OAAO,MAAC,YAAS,sBAAS;IAC1B,6DAAiC;IAEjC,yBAAG,qBAAgB,MAAC,oBAAuB;MAEzC,sBAAM,OAAO;MAEb,iBAA6B,GAA1B,qBAAgB,MAAC,WAAW,+CAAa,iBAA6B,GAA1B,qBAAgB,MAAC,WAAW,oDAAiB;QAC1F,OAAO,MAAC,gCAAO,qBAAgB,MAAC,UAAY,kDAAkB;MAChE;QACE,OAAO,MAAC,UAAS,qBAAgB,MAAC,SAAQ;QAC1C,OAAO,MAAC,YAAS,sBAAS;MAC5B;MAEA,OAAO,MAAC,gBAAa,qBAAgB,MAAC,iBAAgB;MACtD,6DAAiC;IAEnC;IAEA;EAEF;EAGA;;QAEO,+JAA0C;;ojBAed;IAEjC,yBAAG,6BAA4B;6MAIK;IACpC;omEA4CkC;IAElC,kBAAgB,aAAa,OAAE,WAAW;IAE5C;;EAGA;;;;IAEE,IAAc,QAA+B;;;MAG3C,gCAAgB,QAAM,MAAC,8BAAU,OAAO;IAC1C;IAEA;;;IAIF;;EAGA;;;8BAEuB;IAErB,2BAAmB,6HAAmE;IAGtF,iBAAqB,GAAlB,mBAAoB,uBAAS;MAC9B,qBAAgB,MAAC,oBAAiB,sBAAS;IAC7C;IAEF;;EAGA;;;;;;;QAEO,+IAAuD;;IAM5D,aAAU,mMAG8B;IAE1C;;EAGA;;;;QAEO,uvDAAyC;IAC9C,IAAc,WAAuC;;;MAInD,sBAAM,WAAW;MAEjB,WAAW,MAAC,eAAkB,+LACiB;MAC/C,WAAW,MAAC,UAAkB,WAAS,OAAE,wBAAO,MAAC,QAAO;MACxD,WAAW,MAAC,SAAkB,WAAS,OAAE,wBAAO,MAAC,IAAG;MACpD,WAAW,MAAC,WAAkB,oDAAsB;MACpD,WAAW,MAAC,aAAkB,+IAA0E;MACxG,WAAW,MAAC,SAAkB,WAAS,OAAE,wBAAO,MAAC,IAAG;MACpD,WAAW,MAAC,aAAkB,WAAS,OAAE,wBAAO,MAAC,QAAO;MACxD,WAAW,MAAC,YAAkB,WAAS,OAAE,wBAAO,MAAC,YAAW;MAC5D,WAAW,MAAC,gBAAkB,WAAS,OAAE,wBAAO,MAAC,WAAU;MAC3D,WAAW,MAAC,qBAAkB,WAAS,OAAE,wBAAO,MAAC,eAAc,MAAC,gBAAe;MAC/E,WAAW,MAAC,oBAAkB,WAAS,OAAE,wBAAO,MAAC,WAAU;MAE3D,yBAAG,WAAS,OAAE,wBAAO,MAAC,sBAAyB;QAC7C,WAAW,MAAC,iBAAa,8IAA4E;MACvG;MAEA,WAAW,MAAC,qBAAsB,WAAS,OAAE,wBAAO,MAAC,gBAAe;MACpE,WAAW,MAAC,yBAAsB,WAAS,OAAE,wBAAO,MAAC,gBAAe;MAEpE,yBAAG,WAAS,OAAE,wBAAO,MAAC,2BAA8B;QAClD,WAAW,MAAC,sBAAkB,mJAAiF;MACjH;MAEA,qEAAyC;IAE3C;IAEF;;EAGA;;QAEO,mVAAwD;IAE7D,iBAAmC,GAAhC,qBAAgB,MAAC,iBAAiB,uBAAS;MAC5C,sBAAmB,8GAAwD;IAC7E;MACE,sBAAmB,oGAA8C;IACnE;IAEA,kBAAe,2EAA6C;IAG5D,wBAAgB,2DAAkC;0DAEG;wDACF;IAErD;;EAGA;;QAGI,+DAA2C,CAAA;;QAC3C,mEAAwD,CAAA;;QACxD,kEAAuD,CAAA;;QACvD,kEAAgD,CAAA;;QAE7C,iIAA+C;QAC/C,0IAAwD;;4eAQtB;6eAMA;6eAMA;gfAMA;4cAMA;ifAMA;ifAMA;ycAMA;;6gBAQA;ihBAMA;qLAIe;opBAQf;4oBAQA;yRAMA;IAEvC,aAAU,kEAA0C;IAEtD;;EAGA;;QAEO,gEAAyB;;qOAImE;kVAIrD;oIACiB;gGACpC;IAEzB,iBAAmC,GAAhC,qBAAgB,MAAC,iBAAiB,uBAAS;MAC5C,kBAAgB,mCAAM;IACxB;MACE,kBAAgB,mCAAM;IACxB;oIAEwD;ydAIiB;oaAKjB;oGAC/B;IAE3B;;EAGA;;QAEO,iQAA8B;IAEnC,gCAAO,iGAA8D,YAAY;IACjF,gCAAO,kHAA+E,YAAY;IAClG,gCAAO,sHAAmF,YAAY;IACtG,gCAAO,mFAAgD,YAAY;IACnE,gCAAO,4GAAyE,YAAY;IAC5F,gCAAO,4FAAyD,YAAY;IAE5E,aAAU,yIAAsF;IAElG;;EAGA;;;4HAEuD;0FACjB;8FACI;+FAChB;EAE1B;EAGA;;;IAEE,yBAAG,mBAAwB;MACzB;IACF;yHAEkD;6HACD;sRAIA;+FACzB;EAE1B;EAGA;;;;;gGAE2B;sDAEK;+EAGA;sDACA;iGAEJ;EAE5B;EAGA;;;2LAI6F;4JACX;IAElF;;EAGA;;;;;IAEE,IAAc,WAAmC;oGAExB;;;4EAKA;IACzB;iGAE0B;EAE5B;EAGA;;;IAEE,iBAAmC,GAAhC,qBAAgB,MAAC,iBAAiB,uBAAS;kGACnB;kHACgB;kdAKpC;qGACuB;mGACF;IAC5B;EAEF;EAGA;;;gGAE2B;6FACH;gTAKuC;kGAEtC;qGACG;EAE5B;EAGA;;;;;QAGI,qGAAgC;QAChC,oEAA6B;QAC7B,mEAA6B;QAC7B,kEAA6B;QAC7B,0DAA6B;IAE/B,sBAAoB,gCAAoB,GAAb,OAAO,MAAC,OAAO,wBAAtB,CAAkC;IAGtD,iBAAoB,GAAjB,OAAO,MAAC,WAAW,uBAAS;MAC7B,oBAAkB,qDAAmB;IACvC;MACE,oBAAkB,mCAAE;IACtB;+PAEoG;IAGpG,sBAAmB,kOAGsB;uYAMR;IAGjC,iBAAqB,GAAlB,mBAAoB,uBAAS;MAC9B,sBAAoB,6DAA2B;IACjD;MACE,sBAAoB,iDAAe;IACrC;uLAImD;IAGnD,iBAA2B,GAAxB,OAAO,MAAC,kBAAkB,uBAAS;MACpC,aAAU,iOAGwB;IACpC;2UAKqE;IAGrE,yBAAG,6BAA4B;+PAKJ;IAC3B;kSAKkF;IAGlF,iBAAqB,GAAlB,mBAAoB,uBAAS;6MAGmB;IACnD;+CACgB;IAChB;IAGA,yBAAG,OAAO,MAAC,QAAiB;+CACZ;IAChB;oMAGiC;IACjC;gWAOoF;gJAK5C;2VAO4C;2IAKjD;+LAKD;ibAQ0B;8FAErC;EAEzB;EAGA;yKACsF;EACtF;EAGA;;;IAEE,IAAc,eAAsC;IAEpD;iCAAsD;IACtD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;IAIf;IAEA,qBAAgB,MAAC,YAAS,4BAAU,qBAAgB,MAAC,SAAQ;8BAC7C;EAElB;EAGA;;;IACE,iBAA6B,GAA1B,qBAAgB,MAAC,WAAY,YAAW;oFACR;IACnC;IACA,qBAAgB,MAAC,cAAW,WAAW;8BACvB;EAClB;EAGA;;;IACE,qBAAgB,MAAC,sBAAmB,mBAAmB;8BACvC;EAClB;EAGA;;;;QAEO,4FAA6C;IAElD,YAAS,uHAAgC;IAEzC,IACE,OAYA,AAKA,AAUA,AAKA,AAKA,AAUA,KAhDG,QAAQ,OAAE,+BAAf;;8IAG0E;MAEtE;mKACoE;;;;;;MAEpE;MAEA,UAAU,MAAC,WAAQ,8EAAgD;MACnE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;0KAIN;MACpD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAI3D,iBAA4C,IAAzC,kIAA2C,uBAAS;QACrD,qBAAgB,MAAC,qBAAiB,gIAAwC;MAC5E;QACE,qBAAgB,MAAC,oBAAiB,gCAAuC,GAAhC,qBAAgB,MAAC,iBAAiB,wBAAzC,CAAqD;MACzF;gCACgB;MAChB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;gRAI0B;MACrF,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;4FAIxB;MACnC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAI3D,yBAAG,QAAQ,OAAE,2CAAyB;QACpC,qBAAgB,MAAC,kCAAS,qDAAyB,QAAQ,OAAE,iCAAU;MACzE;QACE,sBAAM,qBAAgB,MAAC,OAAM;MAC/B;gCACgB;MAChB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;;MAO3D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;IAIhE;;EAGA;;QAEQ,+iBAA+C;IAErD,gBAAgB,MAAC,kBAAe,iDAAe;IAE/C,gBAAgB,MAAC,qEAAuC;IACxD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,eAAc;IAC1E,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,sEAAwC;IACzD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,gBAAe;IAC3E,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,gEAAkC;IACnD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,YAAW;IACvE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,qDAAqB;IACtC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,SAAQ;IACpE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,oDAAsB;IACvC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,aAAY;IACxE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,qDAAqB;IACtC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,oBAAmB;IAC/E,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,oDAAsB;IACvC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,SAAQ;IACpE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,qDAAqB;IACtC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,SAAQ;IACpE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAGpD,gBAAgB,MAAC,mEAAmC;IACpD,gBAAgB,MAAC,YAAS,gCAAG;IAC7B,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,+DAA+B;IAChD,gBAAgB,MAAC,YAAS,iCAAI;IAC9B,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,+DAA+B;IAChD,gBAAgB,MAAC,YAAS,kCAAK;IAC/B,gBAAgB,MAAC,gDAAgB;IACjC,gFAAoD;IAEpD,gBAAgB,MAAC,4DAA4B;IAC7C,gBAAgB,MAAC,YAAS,mCAAM;IAChC,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEtD;;EAGA;;;2/BAoByD;IAEvD,iBAAuF,IAApF,+JAAsF,uBAAS;+RAIpC;IAC9D;IAEF;;EAGA;;QAEO,y9DAA6B;QAC7B,qyCAA4D;IAEjE,iBAAc,qJAA2E;IACzF,0BAAkB,iHAA0E;IAE5F,iBAAc,+BAAoB;;8HAI6B;oHAElB;oDACjB;2DACO;6EAGN;+FACL;iFAEqB;4LACgD;kCACzE;IAEtB;;AACF","file":"zcl_abapgit_gui_page_repo_over.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_repo_over.clas.locals.mjs":{"lineLengths":[89,53,54,24,32,80,37,1040,956,17,42,22,942,3,29,64,16,3,27,160,72,76,75,85,72,76,102,67,68,64,56,88,739,56,55,49,41,49,43,59,23,17,3,1,88,26,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_repo_over.clas.locals_imp.abap"],"names":[],"mappings":";;;AAkBA;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;;;IAEE,IAAc,UAAiC;;IAE/C,UAAQ,MAAC,kBAAiB,eAAe;IACzC,UAAQ,MAAC,eAAiB,YAAY;IACtC,UAAQ,MAAC,WAAiB,QAAQ;IAClC,UAAQ,MAAC,eAAiB,YAAY;IACtC,UAAQ,MAAC,YAAiB,SAAS;IACnC,UAAQ,MAAC,oBAAiB,iBAAiB;IAE3C,UAAQ,OAAE;IAEZ;;AAEF","file":"zcl_abapgit_gui_page_repo_over.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_repo_view.clas.mjs":{"lineLengths":[89,53,43,72,32,58,155,217,225,147,183,145,147,185,185,148,189,183,178,199,685,239,239,2484,2337,2339,868,2427,2341,222,275,2304,2299,2288,65,220,2399,249,243,253,238,219,224,2342,920,579,56,372,195,17,12,42,22,120,149,71,107,69,71,109,109,72,113,107,102,123,62,3,31,2303,76,437,237,2320,2303,2303,2112,49,13,5,72,41,141,104,14,87,7,5,70,166,43,87,7,144,5,41,59,53,45,68,87,72,70,5,89,74,70,5,43,43,110,93,93,72,41,71,5,3,35,148,100,318,109,474,5,86,340,5,108,322,12,319,5,195,310,220,318,191,475,267,199,328,5,183,495,663,32,3,33,146,98,108,32,5,301,301,301,299,30,3,36,67,67,61,67,69,123,79,25,123,104,73,98,52,7,173,156,7,5,241,19,3,43,81,2075,61,74,274,5,33,3,30,138,120,147,109,113,396,370,370,373,7,55,149,285,7,132,126,12,204,385,373,7,387,142,391,7,387,55,149,285,7,5,134,126,372,436,22,3,36,72,2075,61,205,311,5,24,3,37,82,2075,61,139,318,5,34,3,30,143,95,108,29,5,295,295,295,27,3,31,138,90,194,192,253,186,22,3,24,137,109,56,75,5,3,29,101,58,131,130,151,31,9,99,30,165,64,106,110,102,118,106,110,140,71,49,17,106,24,170,29,14,16,7,5,16,3,23,56,3,30,143,101,58,152,114,209,19,3,29,54,104,88,105,76,106,102,67,100,61,97,5,197,99,5,194,99,5,23,3,31,67,2075,61,109,88,114,247,68,105,12,102,5,72,100,89,102,62,106,5,96,174,5,19,3,35,119,198,38,3,33,101,597,58,122,91,69,73,136,5,41,68,123,137,5,194,3,28,827,61,437,237,96,13,5,59,53,68,68,59,53,72,68,38,3,36,123,604,61,71,79,99,76,172,300,196,12,102,5,100,19,3,28,123,138,1326,139,263,79,54,117,119,72,121,150,101,5,165,97,174,142,240,5,113,126,99,108,100,19,3,28,123,2075,61,113,100,67,79,211,121,359,12,225,74,85,162,14,105,166,404,7,5,112,114,99,72,115,5,111,98,113,5,99,99,109,19,3,39,123,2075,61,79,132,102,12,168,5,19,3,36,123,2075,61,71,79,72,101,175,196,102,89,130,175,103,350,198,104,7,5,19,3,34,123,2075,61,604,123,79,128,21,5,73,78,29,171,114,114,122,74,234,14,276,7,97,114,101,88,103,7,113,100,115,7,101,101,5,19,3,38,123,2075,61,79,117,166,99,19,3,27,123,67,941,712,79,32,81,80,65,71,81,80,65,71,84,87,65,71,86,84,87,67,73,5,79,82,65,76,71,97,94,243,70,66,12,66,5,99,102,19,3,29,123,79,114,237,233,98,113,5,99,19,3,26,123,79,188,229,19,3,55,363,134,64,67,101,137,67,125,244,105,100,293,95,100,116,95,110,157,96,103,141,126,96,107,161,64,96,107,161,96,110,251,96,105,87,96,140,289,212,96,134,400,96,149,41,96,133,121,106,5,22,3,54,884,568,85,81,127,72,87,89,136,72,87,91,131,72,87,94,131,72,87,80,127,72,87,81,127,72,87,80,131,72,87,96,129,72,87,92,136,72,87,94,138,72,87,84,127,72,87,29,3,50,138,147,412,210,288,5,22,3,45,123,2303,148,130,99,70,70,120,66,119,2107,35,107,79,9,212,32,250,92,159,254,142,188,120,210,64,74,38,98,7,92,53,107,116,135,104,7,125,36,103,76,114,106,113,20,112,13,18,120,11,16,199,9,14,123,93,133,97,9,76,40,151,47,18,11,171,9,76,136,121,286,115,9,106,7,51,173,7,60,123,82,70,16,117,9,104,599,104,7,102,102,17,106,24,170,94,212,14,16,7,5,82,19,3,1,80,630,76,90,84,84,91,80,70,70,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_repo_view.clas.abap"],"names":[],"mappings":";;;AAmMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;QAGI,4aAAsD;QACtD,oOAAmD;QACnD,uwEAAiD;QACjD,svEAAiD;QACjD,svEAAiD;IAEnD,IACE,gBAAyD;IAE3D,yBAAG,iBAAsB;MACvB;IACF;;;MAME,yBAAG,gBAAc,MAAC,UAAoB,iBAA0B,GAAtB,gBAAc,MAAC,SAAS,wBAAU;QAC1E,6FAA+D;MACjE;QACE,4EAA8C;MAChD;IAEF;IAEA,iBAAiB,GAAd,oBAAgB,uBAAS;;;QAIxB,4EAA8C;MAChD;;IAGF;IAEA,sBAAO,aAAa;IAEpB,OAAO,MAAC,gBAAa,wBAAmB;IACxC,OAAO,MAAC,YAAa,sBAAS;IAC9B,OAAO,MAAC,UAAa,gBAAW;IAChC,6DAAiC;IAGjC,iBAAe,GAAZ,kBAAc,0CAAQ;MACvB,OAAO,MAAC,UAAO,yCAAQ;MACvB,6DAAiC;IACnC;IAGA,iBAAe,GAAZ,kBAAe,4CAAU;MAC1B,OAAO,MAAC,UAAO,2CAAU;MACzB,6DAAiC;IACnC;IAEA;IACA;IAEA,uGAAuE;IACvE,sFAAsD;IACtD,sFAAsD;;;sEAIG;IACzD;EAEF;EAGA;;;6TAKoH;IAElH,iBAA0B,IAAvB,yDAAyB,wBAAU;ydAI8C;IACpF;IAEA,iBAAiC,GAA9B,oCAAgC,uBAAS;mVAGuD;IACnG;IACA,iBAA0B,IAAvB,yDAAyB,uBAAS;iUAE8E;IACnH;8TAEiH;IACjH;kMAG+E;qTAG+B;2NAEjD;6TAEmD;8LAGjC;0dAI8B;0QAGjC;IAE5E,iBAA8B,IAA3B,uCAA6B,wBAAW,0BAAI,kFAAiE;uUAGlB;IAC9F;sLAG+E;8eAK2B;spBAQlC;IAE1E;;EAGA;;;IAIE,iBAA0B,IAAvB,yDAAyB,uBAAS;MACnC;IACF;4SAG4G;4SAEA;4SAEA;0SAED;IAE7G;;EAGA;;;;QAEO,0DAAqB;QACrB,4DAAqB;QACrB,kHAAoC;;IAIzC,YAAU,OAAO;IACjB,oHAAyD;IACzD,eAAY,mFAAoD;IAGhE,iBAAW,GAAR,SAAW,qCAAG;MACf,iBAAc,GAAX,gCAAa,qCAAG;QACjB,YAAU,8BAAS;MACrB;MACA,iBACwB,GADrB,wBAAW,KAAM,2BAAS,WACf,KAAM,mCAAM,qCAAG;QAC3B,YAAU,wBAAW,KAAM,SACN,KAAwB,qBAAlB,0BAAQ,UAAY,kCAAG;MACpD;IACF;IAEA,aAAU,8NAE2C;IAEvD;;EAGA;;;;IAEE,iBAAoB,GAAjB,OAAO,MAAC,WAAW,uBAAS;MAC7B,2BAAwB,+OAGC;IAC3B;IAEF;;EAGA;;QAGI,+GAAkC;;IAIpC,iBAA0B,IAAvB,yDAAyB,wBAAU;MAGpC,iBAA6C,IAA1C,2DAA4C,wBAAU;2YAIa;iXAGL;iXAGA;oXAGA;MACjE;MACA,YAAS,mCAAmB;MAC5B,yBAAG,iBAAgB,iBAAqB,IAAjB,6CAAmB,gCAAC;4RAEkD;MAC7F;mIAEoD;6HAEH;IAEnD;MAGE,iBAAiC,IAA9B,+CAAgC,uBAAU,iBAA8C,IAA1C,2DAA4C,wBAAU;gYAGtC;oXAGA;MACjE;kYAG+D;MAC/D,iBAAkD,KAA/C,uEAA+B,iBAAkB,uBAAS;sYAGI;MACjE;kYAG+D;MAC/D,YAAS,mCAAmB;MAC5B,yBAAG,iBAAgB,iBAAqB,IAAjB,6CAAmB,gCAAC;4RAEkD;MAC7F;IAEF;qIAGsD;6HAGJ;mXAIa;mbAKZ;IAErD;;EAGA;;;;IAEE,yBAAG,OAAO,MAAC,oBAAwB,iBAAqB,GAAjB,OAAO,MAAC,YAAY,+FAAiD;MAC1G,kBAAe,6RAGgB;IACjC;IAEF;;EAGA;;;;IAEE,yBAAG,OAAO,MAAC,qBAAyB,iBAAsB,GAAlB,OAAO,MAAC,YAAa,eAAE,MAAC,OAAK;MACnE,4BAAyB,0RAGM;IACjC;IAEF;;EAGA;;;IAIE,iBAA0B,IAAvB,yDAAyB,uBAAS;MACnC;IACF;sSAGsG;sSAEA;sSAEA;IAGxG;;EAGA;;;iMAO0C;+LAKH;4PAKG;yLAKH;IAEvC;;EAGA;QAEO,gIAA2C;IAEhD,iBAA0B,IAAvB,yDAAyB,wBAAU;iCACpC,SAAW,YAAO;0EACgB;IACpC;EAEF;EAGA;;;QAEQ,0HAAoD;QACpD,yHAAqD;QACrD,8IAAwD;8BAEzC;IAErB;MACI,yBAAsB,kEAA6C;MAEnE,gBAAS,MAAM;iCACf,eAAW,mHAAoD;MAC/D,oBAAa,oCAAG;MAEhB,wBAAgB,0EAAsC;MACtD,0BAAkB,4EAAwC;MAC1D,sBAAc,wEAAoC;MAClD,8BAAsB,gFAA4C;MAClE,wBAAgB,0EAAsC;MACtD,0BAAkB,4EAAwC;MAG1D,iBAAc,mHAAqD;MACnE,uBAAe,wCAA6B;MAC5C,wBAAiB,iBAAY;;;;;;;;;IAQjC;IAEF;;EAGA;;;;;;;QAEO,+IAAuD;;IAM5D,aAAU,8LAG8B;IAE1C;;EAGA;;;;;;;;;;IACE,iBAAa,GAAV,WAAY,uBAAS;MACtB,gBAAc,iCAAkB,2BAAU,MAAC,OAAM;IACnD;IACA,iBAAgB,GAAb,cAAe,uBAAU,iBAAmD,KAA/C,uEAA+B,iBAAkB,uBAAS;MACxF,gBAAc,iCAAkB,2BAAU,MAAC,SAAQ;IACrD;IACA,yBAAG,2BAAgC,iBAAqD,IAAjD,0FAAmD,wBAAU;MAClG,gBAAc,iCAAkB,2BAAU,MAAC,SAAQ;IACrD;IACF;;EAGA;;;;;;;QAEO,8OAA6B;IAElC,iBAAoB,GAAjB,kBAAmB,uBAAS;MAC7B,gCAAO,wDAAgB,QAAQ;IACjC;MACE,gCAAO,qDAAc,QAAQ;IAC/B;IAEA,iBAAkB,GAAf,OAAO,MAAC,SAAS,uBAAS;MAC3B,gCAAO,mDAAY,QAAQ;IAC7B,wBAAuB,GAAhB,OAAO,MAAC,UAAU,gCAAC;MACxB,gCAAO,qDAAc,QAAQ;IAC/B,gCAAO,OAAO,MAAC,UAAmB;MAChC,gCAAO,yDAAiB,QAAQ;IAClC;IAEA,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;MACtB,sKACqD;IACvD;IAEF;;EAGA;;IACE,+BAA6B,gCAAyD,IAAlD,gGAAoD,eAAE,MAAC,OAA9D,CAAqE;IACpG;;EAGA;QAGI,4FAA2B;QAC3B,4kBAAsD;QACtD,iDAA2B;IAE7B,sBAAmB,8FAAiD;IACpE,cAAW,uEAAkD;IAC7D,4CAAO,mBAAuB;IAE9B,iBAAoB,GAAjB,kBAAmB,eAAE,MAAC,OAAK;uIAC0C;IACxE;IAEA,OAAO,MAAC,cAAW,QAAQ;IAC3B,OAAO,MAAC,iDAAiB;IAEzB,iBAA0C,IAAvC,uEAAyC,wBAAU;wIACmB;IACzE;iMAIqC;EAEvC;EAGA;;;QAGI,4aAA+B;QAC/B,oOAA4B;IAE9B,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;MACtB;IACF;IAEA,OAAO,MAAC,gBAAa,wBAAmB;IACxC,OAAO,MAAC,YAAa,sBAAS;IAC9B,OAAO,MAAC,UAAa,uCAAM;IAC3B,6DAAiC;IAEjC,OAAO,MAAC,gBAAa,wBAAmB;IACxC,OAAO,MAAC,YAAa,sBAAS;IAC9B,OAAO,MAAC,UAAa,2CAAU;IAC/B,6DAAiC;IAEjC;EAEF;EAGA;;;;QAEQ,8DAAuB;;kGAIN;IACvB,iBAAsB,GAAnB,OAAO,MAAC,aAAa,uBAAS;MAC/B,iBAAc,mJAEO;2SAE0E;mMAEL;IAC5F;qGAC0B;IAC1B;mGACwB;IAE1B;;EAGA;;QAGI,iIAAoD;QACpD,qyCAAgE;QAChE,kIAAkD;QAClD,8PAAiC;;IAGnC,gBAAa,gCAAqB;oHAEM;sHACE;IAE1C,iBAAmB,GAAhB,sBAAkB,uBAAS;wHACc;qJAC0B;oGAC7C;IACzB;IAEA,eAAY,gJAAwE;IAEpF,iBAAsB,GAAnB,yBAAO,aAAc,gCAAC;MACvB,iBAAc,qJAA2E;MACzF,qBAAkB,iHAA0E;+OAMnE;IAC3B;gHAEoC;6HACsB;kGACnC;2GACQ;mGACP;IAE1B;;EAGA;;;;;;QAEQ,0DAAsB;;kNAK4C;IAExE,yBAAG,OAAO,MAAC,UAAoB,iBAAmB,GAAf,OAAO,MAAC,SAAS,wBAAU;sWAIrC;IACzB;gOACiG;MAE/F,iBAAkB,GAAf,OAAO,MAAC,SAAS,uBAAS;QAC3B,aAAU,8DAAmC;iKACiB;MAChE;QACE,aAAU,kFAAmD;qKACD;mZAEkC;MAChG;IACF;+GAGmC;iHACc;kGAC1B;IAEvB,iBAAwB,GAArB,sBAAuB,uBAAS;kHACe;IAClD;8GAGkC;IAClC,iBAAiC,IAA9B,+CAAgC,uBAAS;gHACI;IAChD;kGACuB;kGAEA;4GAEqB;IAE9C;;EAGA;;;;;IAGE,iBAAmB,GAAhB,OAAO,MAAC,UAAU,gCAAE,yBAAG,OAAO,MAAC,YAAqB;qGAC7B;IAC1B;uKACmF;IACnF;IAEF;;EAGA;;;;QAEO,8DAAuB;;IAI5B,iBAAkB,GAAf,OAAO,MAAC,SAAS,uBAAS;oGACJ;8KACgD;mMAEmB;qGAClE;IAE1B,wBAAuB,GAAhB,OAAO,MAAC,UAAU,gCAAC;MACxB,iBAAiB,GAAd,oBAAgB,uBAAU,yBAAI,OAAO,MAAC,oBAAuB;QAE9D,iBAAc,oJAES;sGAEA;6VAEwE;qMAEL;uGAClE;MAE1B;IAEF;IAEF;;EAGA;;;;QAEQ,mlBAAkC;QACnC,kHAAoC;;IAIzC,iBAAiB,GAAd,oBAAgB,uBAAU,yBAAI,OAAO,MAAC,oBAAuB;MAC9D;IACF;IAEA,aAAU,sDAAiC;;;0KAGU;iHAEX;iHAEA;yHACQ;MAEhD,iBAAmB,GAAhB,sBAAkB,uBAAS;yOACyD;MACvF;mRACuG;MACvG;gGAEuB;iHAGY;oGACZ;MAGvB,iBAAiC,GAA9B,oCAAgC,uBAAS;sGACf;MAC7B;gHAGkC;MAClC,iBAAiC,IAA9B,+CAAgC,uBAAS;kHACI;MAChD;oGACuB;oGAEA;IAEzB;IAEF;;EAGA;;;;;oHAI0C;qKAEwC;kGAEzD;IAEzB;;EAGA;;QAGI,0DAAuB;QACvB,o6BAAwD;QACxD,+rBAAqD;;;IAOvD,WAAW,MAAC,eAAY,2CAAU;IAClC,WAAW,MAAC,kBAAe,uCAAM;IACjC,WAAW,MAAC,oBAAiB,sBAAS;IACtC,gCAAO,qBAAe,WAAW;IAEjC,WAAW,MAAC,eAAY,2CAAU;IAClC,WAAW,MAAC,kBAAe,uCAAM;IACjC,WAAW,MAAC,oBAAiB,sBAAS;IACtC,gCAAO,qBAAe,WAAW;IAEjC,WAAW,MAAC,eAAY,8CAAY;IACpC,WAAW,MAAC,kBAAe,8CAAY;IACvC,WAAW,MAAC,oBAAiB,sBAAS;IACtC,gCAAO,qBAAe,WAAW;IAEjC,iBAAiC,GAA9B,oCAAgC,uBAAS;MAC1C,WAAW,MAAC,eAAY,4CAAW;MACnC,WAAW,MAAC,kBAAe,4CAAW;MACtC,WAAW,MAAC,oBAAiB,sBAAS;MACtC,gCAAO,qBAAe,WAAW;IACnC;IAEA,WAAW,MAAC,eAAY,yCAAQ;IAChC,WAAW,MAAC,kBAAe,yCAAQ;IACnC,WAAW,MAAC,oBAAiB,sBAAS;IACtC,WAAW,MAAC,eAAY,sCAAK;IAC7B,gCAAO,qBAAe,WAAW;gGAER;6FACH;kPAKyB;IAE/C,iBAAiB,GAAd,oBAAgB,uBAAS;MAC1B,YAAU,8CAAY;IACxB;MACE,YAAU,8CAAY;IACxB;kGAEuB;qGACG;IAE5B;;EAGA;;;iHAIuC;4OACgC;wOACa;IAClF,iBAAiC,IAA9B,+CAAgC,uBAAS;gHACH;IACzC;kGACuB;IAEzB;;EAGA;;;2LAI6F;oOAEhC;IAE7D;;EAGA;;;;QAEO,0DAAmB;QACnB,4FAA6C;IAElD,YAAS,uHAAgC;IAEzC,IACE,OAIA,AAMA,AAIA,AAIA,AAOA,AAKA,AAIA,AAKA,AAIA,AAMA,AAKA,AAIA,KA3DG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,WAAQ,iNAAgD;MACnE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,mBAAkB;;;MAMpE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAG1D,UAAU,MAAC,WAAQ,iFAA6C;MAChE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAG1D,wBAAmB,6HAAmE;MACtF,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,aAAkB,wHAAiC;MACnD,qBAAa,iGAEW;MACxB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,0BAAkB,+HAAqE;MACvF,oBAAkB,oCAAG;MACrB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,0BAAkB,+HAAqE;MACvF,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,wBAAgB,2NACuB;MACvC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,sBAA+B,mBAAb,kBAAe,oBAAc;MAC/C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,sBAAc,mQAC0B;MACxC,8BAAsB,8KAAiF;MACvG,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,8BAAsB,0WAC4C;MAClE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;wCAGnC;MACxB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;;MAM3D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,oBAAmB;;IAI3E;;EAGA;;QAEQ,+iBAA+C;IACrD,gBAAgB,MAAC,kBAAe,uCAAM;IAEtC,gBAAgB,MAAC,qDAAuB;IACxC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,SAAQ;IACpE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,6DAA+B;IAChD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,kBAAiB;IAC7E,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,+DAAiC;IAClD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,aAAY;IACxE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,kEAAoC;IACrD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,aAAY;IACxE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,oDAAsB;IACvC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,SAAQ;IACpE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,qDAAqB;IACtC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,SAAQ;IACpE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,oDAAsB;IACvC,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,aAAY;IACxE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,oEAAsC;IACvD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,WAAU;IACtE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,gEAAkC;IACnD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,kBAAiB;IAC7E,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,kEAAoC;IACrD,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,oBAAmB;IAC/E,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEpD,gBAAgB,MAAC,wDAA0B;IAC3C,gBAAgB,MAAC,YAAS,wCAAyB,gCAAQ,MAAC,SAAQ;IACpE,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEtD;;EAGA;;;2ZAUyD;IAEvD,iBAAuF,IAApF,+JAAsF,uBAAS;+RAIpC;IAC9D;IAEF;;EAGA;;QAEQ,svEAA2D;QAC3D,2IAAuD;QACvD,yHAA+C;QAC/C,0FAA4B;QAC5B,6DAAyB;QACzB,6DAAyB;QACzB,+GAAyC;QACzC,yDAAyB;QACzB,8GAA0C;IAEhD,IAAc,WAAoC;kCAE9B;;;IAMpB;iCAEI,eAAW,kKAAiE;+BAE7D;MAEf,wCAAgC,0MACM;MAEtC,aAAU,uEAAmC;8JAEW;6PAKjB;6IAEoC;2LAIjD;;MAM1B,mBAAgB,uLAGmE;+DAE3B;;;iGAGG;MAC3D;2FAEmC;MAEnC,YAAS,iCAAsB;MAC/B,iBAAoB,IAAjB,6CAAmB,gCAAC;mHACc;sIACsB;uGACjC;MAC1B;4HAE8C;MAE9C,sBAAM,MAAM;MAEZ,iBAA0B,GAAvB,yBAAO,iBAAkB,gCAAC;QAC3B,iBAAmB,GAAhB,sBAAkB,uBAAS;UAC5B,iBAA0B,IAAvB,yDAAyB,uBAAS;YAEnC,iBAAiC,IAA9B,+CAAgC,uBAAS;cAC1C,WAAS,sFAAoD;YAC/D;cACE,WAAS,qFAAmD;YAC9D;UACF;YAEE,WAAS,+FAA6D;UACxE;QACF;UACE,2LAA6E;QAC/E;MACF;0HAE4C;4FAER;QAElC,iBAA2C,IAAxC,6EAA0C,wBAAU;gGACjB;QACtC;;;UAGE,iBAAgB,GAAb,mBAAe,gCAAE,iBAAa,GAAT,eAAE,MAAC,QAAQ,kBAAY;YAC7C,WAAS,sBAAS;YAClB;UACF;0KAEmF;QACrF;QAEA,iBAAmB,GAAhB,sBAAkB,uBAAS;uIAC8B;wHACf;6RAGI;kHACV;QACvC;yGAE0B;MAC5B;MAEA,yBAAO,iBAAiB;4KACmD;MAC3E;MAEA,iBAAU,GAAP,QAAS,uBAAS;0HACuB;QAC1C,iBAAgB,GAAb,mBAAe,gCAAC;UACjB,eAAa,2CAAU;QACzB;UACE,yGAA6C;QAC/C;QACA,8FAAkC;slBAO3B;uGACiB;MAC1B;qGAEwB;qGACA;;;;;;;;;;IAW5B;iFAE6C;IAE/C;;AACF","file":"zcl_abapgit_gui_page_repo_view.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_run_bckg.clas.mjs":{"lineLengths":[89,53,42,71,32,57,97,345,65,231,56,17,12,42,22,247,3,29,31,16,3,18,50,3,25,143,150,97,256,19,3,15,130,67,63,19,9,57,61,24,20,53,53,92,16,9,72,81,7,52,17,106,24,109,14,16,7,5,3,55,363,134,64,92,22,3,45,123,67,35,21,79,109,71,29,202,5,100,19,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_run_bckg.clas.abap"],"names":[],"mappings":";;;AA4BA;;;;;;;;;;;;;;EAGE;8BAEuB;IAEvB;;EAGA;;;;;QAEO,6IAAsD;;IAI3D,aAAU,6OAG2B;IAEvC;;EAGA;QAEQ,yHAA0C;QAC1C,0DAAoB;QACpB,sDAAuB,CAAA;;IAG7B;wDACkC;;;;;;QAI5B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;QACF;QACA,gCAAO,iBAAW,YAAO;QACzB,YAAkB,mBAAR,QAAU,gCAAC;MACvB;;;;;;;;;IAGJ;EAEF;EAGA;;;;IACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;IAC3D;;EAGA;;QAEQ,0DAA4B;kCAEd;oBAEd;;4GAI0B;;;yMAEoB;IACpD;mGACwB;IAE1B;;AACF","file":"zcl_abapgit_gui_page_run_bckg.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_runit.clas.mjs":{"lineLengths":[89,53,39,68,32,54,129,217,148,525,180,390,213,17,12,42,22,120,71,3,23,414,813,595,192,231,67,30,36,55,57,65,5,20,3,29,119,61,31,30,9,219,167,225,172,89,17,78,134,14,16,7,5,16,3,23,52,3,30,143,119,61,144,162,9,114,206,17,106,199,44,14,16,7,5,19,3,15,95,97,95,122,413,78,80,44,137,9,219,167,225,172,106,203,151,212,159,116,17,78,134,14,16,7,5,80,87,185,132,233,54,33,21,3,55,363,134,64,162,94,5,22,3,50,138,85,22,3,45,123,95,70,68,69,67,64,69,2075,83,159,88,158,157,158,158,79,81,79,80,77,160,83,295,35,79,113,190,38,126,50,55,21,148,138,118,75,48,141,76,41,41,142,78,37,66,11,142,81,47,140,80,39,68,13,11,101,193,87,11,9,7,104,118,224,98,122,76,41,39,56,143,92,49,145,49,452,16,136,161,9,136,77,41,56,134,185,136,79,44,59,43,87,181,204,35,117,96,147,82,47,148,84,43,41,17,15,13,48,109,20,136,13,137,246,11,9,7,111,21,5,3,74,213,437,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_runit.clas.abap"],"names":[],"mappings":";;;AAuDA;;;;;;;;;;;;;;;;;EAGE;;QAEO,oyBAAkD;QAClD,0kBAA8B;QAC9B,uLAA8B;IAEnC,cAAW,mNAE0B;;;MAGnC,sBAAM,MAAM;MACZ,MAAM,MAAC,cAAW,QAAQ,MAAC,OAAM;MACjC,MAAM,MAAC,cAAW,QAAQ,MAAC,SAAQ;MACnC,gCAAO,gBAAU,QAAQ;IAC3B;IAEF;;EAGA;;;8BAEuB;IACrB,iBAAU,OAAO;IAEjB;;;;;;;;;;;;IAIA;IAEF;;EAGA;;;;;;;QAEO,uIAAmD;QACnD,yJAAiE;IAEtE;;MAGI,aAAU,yLAG8B;;;;;;;;IAa5C;IAEF;;EAGA;;QAEO,wFAA8B;QAC9B,sFAA8B;QAC9B,iHAAyC;QACzC,oZAA2B;QAC3B,qEAA4B;IACjC,IAAc,aAAoB;IAElC,aAAU,yBAAc;IAExB,cAAW,qHAAkE;IAE7E;;;;;;;;;;;;;;;;;IAYA;;IAGA,gFAAkC;;;;IAUlC,qBAAa,2BAAgB;IAE7B,cAAY,aAAW;IAEzB;;EAGA;;;;IAEE,iBAAuB,GAApB,QAAQ,OAAE,iCAAY,wCAAyB,gCAAQ,MAAC,SAAO;MAChE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;IAC3D;IAEF;;EAGA;;IACE,gBAAa,+DAA0C;IACzD;;EAGA;;QAEO,sFAAoC;QACpC,6DAAwB;QACxB,2DAAwB;QACxB,4DAAwB;QACxB,0DAA6B;QAC7B,uDAAwB;QACxB,4DAA6B;QAC7B,khEAA4D;IAEjE,IAAc,gBAA4B;IAC1C,IAAc,eAAkC;IAChD,IAAc,qBAA4B;IAC1C,IAAc,cAAkC;IAChD,IAAc,aAAkC;IAChD,IAAc,cAAkC;IAChD,IAAc,cAAkC;IAChD,IAAc,YAA4B;IAC1C,IAAc,cAA4B;IAC1C,IAAc,YAA4B;IAC1C,IAAc,aAA4B;IAC1C,IAAc,UAA4B;IAC1C,IAAc,gBAAkC;IAChD,IAAc,gBAA4B;IAC1C,IAAc,aAAqC;kCAG/B;;gHAIgB;6LAEqD;IAEzF,eAAY,iBAAM;IAElB;;;kBAAmD;MACnD,2IAAiF;MACjF,iIAAwE;qHAE5B;;;QAG1C,kIAAyE;;;UAEvE,sBAAM,OAAO;UACb,iIAAuE;;;YAErE,kCAAU,QAAW,UAAS;UAChC;UAEA,iIAAuE;;;YAErE,6HAAoE;;;cAElE,kCAAU,QAAW,UAAS;YAChC;UACF;UACA,iBAAW,GAAR,SAAW,2DAAwB;gMACqD;YACzF,aAAoB,mBAAT,SAAW,gCAAC;UACzB;QACF;MACF;uGAE0B;qHAEa;+NAC0D;iGACzE;yHAEwB;;;QAG9C,sBAAM,OAAO;QACb,mBAAiB,eAAE,MAAC,MAAK;QACzB,oIAA0E;QAC1E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,OAAO,MAAC,cAAW,UAAQ;UAC3B,oIAA0E;UAC1E,OAAO,MAAC,cAAW,UAAQ;mcAEyD;QACtF;UAEE,2HAAkE;gKACT;QAC3D;QACA,6HAAoE;;;UAElE,iBAAe,eAAE,MAAC,MAAK;UAEvB,yHAAgE;wLACiB;UACjF,2HAAkE;;;YAEhE,kBAAgB,eAAE,MAAC,MAAK;YAExB,sBAAM,OAAO;YACb;;;;mHAI+B;YAC/B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACb,kIAAyE;;;gBAEvE,iIAAuE;;;kBAErE,YAAU,SAAS;gBACrB;cACF;YACF;YAEA,yBAAG,QAAkB;cACnB,6FAA8D;YAChE;cACE,wHAAiE;YACnE;YAEA,0HAAiE;qPAEpB;UAC/C;QACF;MACF;8GAEgC;MAElC;;EACF","file":"zcl_abapgit_gui_page_runit.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_bckg.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,196,150,598,272,244,231,1109,57,390,213,17,12,42,22,130,137,120,74,52,58,3,29,119,61,31,95,30,53,56,16,3,23,56,3,30,143,119,61,152,116,428,19,3,27,129,522,303,67,82,248,581,69,31,108,5,540,91,536,634,19,3,24,1015,146,92,9,119,17,106,42,14,16,7,5,22,3,25,136,1011,62,66,511,291,44,90,122,62,45,255,200,148,128,7,72,35,79,63,64,69,57,54,76,46,83,48,11,267,9,54,7,5,39,340,126,126,24,3,25,154,1011,511,323,80,125,62,45,255,200,148,128,7,72,42,256,7,45,5,129,129,100,52,68,12,59,5,29,155,56,3,55,363,134,64,240,67,125,227,95,33,96,5,22,3,45,123,35,79,108,237,182,96,19,3,1,80,544,79,63,79,67,67,77,67,217,68,62,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_sett_bckg.clas.abap"],"names":[],"mappings":";;;AAoEA;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;8BAEuB;;IAErB,iBAAU,OAAO;IACjB,kBAAU,6BAAkB;IAC5B,uBAAe,2BAAgB;IAEjC;;EAGA;;;;;;;QAEO,+IAAuD;;IAM5D,aAAU,yZAK2B;IAEvC;;EAGA;;QAGI,igBAAkD;QAClD,sSAAkC;QAClC,0DAAsB;IAExB,gBAAa,4DAAuC;IAEpD,aAAU,qOAE2E;okBAY5D;;;2GAKc;IACvC;2hBAY0B;IAE1B,YAAU,yEAAuC;uhBAcrB;ynBAWkC;IAEhE;;EAGA;;QAEO,yIAAiD;;IAItD;MACI,gBAAa,+FAAyC;;;;;;;IAG1D;IAEF;;EAGA;;QAGI,0+BAA8D;QAC9D,qDAAkB;QAClB,yDAAuB;QACvB,sfAAgC;QAChC,0RAAwC;IAE1C,YAAS,0BAAe;;yHAME;IAG1B,yBAAG,MAAM,MAAC,kBAAqB;MAE7B,gBAAc,MAAM,MAAC,SAAQ;MAG7B,iBAAiB,GAAd,MAAM,MAAC,SAAU,wCAAO,iBAAkB,GAAd,MAAM,MAAC,SAAU,wCAAO,iBAAkB,GAAd,MAAM,MAAC,SAAU,2CAAS;;;;MAIrF;;;QAGE,WAAgB,mBAAP,OAAS,gCAAC;;;;;UAEjB,IACE,OAEA,KAHG,eAAE,MAAC,MAAR;;YAEI,WAAS,WAAW,MAAC,IAAG;;YAExB,WAAS,WAAW,MAAC,MAAK;;0QAIX;QACrB;;MACF;IAEF;IAEA,2BAAoB,MAAM;mVAIU;6HAKR;6HAGA;IAE9B;;EAGA;QAGI,iJAAyD;QACzD,0+BAAiE;QACjE,sfAAmC;IAErC,IACE,eAA0C;IAE5C,MAAM,MAAC,UAAM,oDAAmB;IAGhC,MAAM,MAAC,aAAS,8FAAgC;IAGhD,yBAAG,MAAM,MAAC,kBAAqB;MAE7B,gBAAc,MAAM,MAAC,SAAQ;MAG7B,iBAAiB,GAAd,MAAM,MAAC,SAAU,wCAAO,iBAAkB,GAAd,MAAM,MAAC,SAAU,wCAAO,iBAAkB,GAAd,MAAM,MAAC,SAAU,2CAAS;;;;MAIrF;;;QAGE,eAAa,MAAC,YAAQ,qNAAuD;MAC/E;MAEA,MAAM,MAAC,cAAW,WAAW;IAE/B;IAGA,MAAM,MAAC,eAAW,gGAAkC;IACpD,MAAM,MAAC,eAAW,gGAAkC;;IAIpD,yBAAG,MAAM,MAAC,QAAiB;mEACW;IACtC;0DACkC;IAClC;IAEA;IAEA,oJAA6C;IAE7C,uBAAe,2BAAgB;EAEjC;EAGA;;;;+OAE4G;IAE1G,IACE,OAKA,KANG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,YAAQ,+LAE2B;;gCAG9B;MAChB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAIjE;;EAGA;;kCAEsB;;2GAIgB;4OAKiB;qLAInB;+FAEV;IAE1B;;AACF","file":"zcl_abapgit_gui_page_sett_bckg.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_glob.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,218,208,1133,277,430,226,231,57,406,61,231,56,17,12,42,22,130,137,142,132,52,58,3,29,31,100,95,53,56,16,3,18,51,3,25,143,152,98,361,19,3,27,129,244,2817,164,530,5,433,19,3,34,67,3,41,136,76,131,73,619,390,66,70,74,37,144,5,115,3,25,136,143,90,152,154,225,94,241,182,231,237,164,233,239,5,24,3,29,250,619,390,194,73,147,47,94,80,14,80,7,81,5,80,3,25,154,64,157,160,231,35,132,85,191,127,80,250,164,238,244,5,91,100,29,155,56,3,30,141,136,76,164,505,201,5,387,205,5,29,3,55,363,134,64,240,67,125,227,95,96,101,35,7,96,5,22,3,45,123,35,79,123,167,100,19,3,1,80,1079,79,69,71,71,75,81,99,97,89,93,81,87,93,85,222,78,62,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_sett_glob.clas.abap"],"names":[],"mappings":";;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;8BAEuB;;;IAGrB,kBAAU,6BAAkB;IAC5B,uBAAe,2BAAgB;IAEjC;;EAGA;;;;;QAEO,+IAAuD;;IAI5D,aAAU,sVAI2B;IAEvC;;EAGA;;IAEE,aAAU,iOAE8D;gwFA6C/B;IAEzC,iBAAyD,IAAtD,gHAAwD,wBAAU;ihBAShB;IACrD;gbAQ8D;IAEhE;;EAGA;;;;;;;;QAGI,kmBAAuE;QACvE,6XAA4C;QAC5C,yDAA2B;IAE7B,qBAAkB,2CAAgC;;;MAEhD,iCAAS,6BAAU,eAAe,MAAC,KAAO,uCAAwB,SAAO;IAC3E;kHAImB;EAErB;EAGA;;IAGE,sBAAc,mHAAqD;;uJAMzB;yJAGC;gOAGsC;6FAIlD;gPAKgC;qLAGL;sOAGA;4OAGwB;IAGlF,iBAAyD,IAAtD,gHAAwD,wBAAU;wOAGY;8OAGG;IACpF;IAEF;;EAGA;QAGI,iPAAoC;QACpC,kmBAAuE;QACvE,6XAA4C;IAE9C,iBAAc,2KAA2E;IAEzF,eAAe,MAAC,UAAO,oCAAG;;;MAExB,iBAAuB,GAApB,eAAe,MAAC,MAAO,sCAAI;QAC5B,eAAe,MAAC,YAAS,qCAAI;MAC/B;QACE,eAAe,MAAC,YAAS,qCAAI;MAC/B;MACA,gCAAO,yBAAmB,eAAe;IAC3C;+EAEgD;EAElD;EAGA;QAGI,iJAAuD;QACvD,uDAAqB;4JAG0C;+JACE;sOAC+B;kCAE9E;IAGpB,cAAW,gHAAkD;oFACR;8LAC0C;IAC/F,cAAW,2GAA6C;+EACR;yPAC8D;IAG9G,iBAAyD,IAAtD,gHAAwD,wBAAU;6OACqC;mPACM;IAChH;IAGA,oBAAiB,iEAA4C;mGACxB;IAErC;IAEA,oJAA6C;IAE7C,uBAAe,2BAAgB;EAEjC;EAGA;;;;IAEE,uBAAoB,uIAAwE;IAE5F,0BAAG,uGAAmD,0BAAI,8FAAgD,0BACvG,6FAA+C,0BAAI,wGAAmD;wMAG/B;IAC1E;IAEA,IAAG,uBAAE,6FAA+C,0BAAG,8FAAgD,CAAE,iBACjE,IAArC,+FAAuC,uBAAS;4MAG0B;IAC7E;IAEF;;EAGA;;;;+OAE4G;IAE1G,IACE,OAKA,KANG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,YAAQ,+LAE2B;;MAI9C,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;kCAC3B;MAClB;MAEA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAIjE;;EAGA;;kCAEsB;;0HAG0B;sKAGH;mGACnB;IAE1B;;AACF","file":"zcl_abapgit_gui_page_sett_glob.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_info.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,196,679,597,211,244,57,54,2444,60,4179,1119,1785,301,311,263,390,213,17,12,42,22,130,137,120,603,52,58,3,29,119,61,31,95,30,53,16,3,23,56,3,30,143,119,61,152,116,424,19,3,28,67,63,61,67,191,201,89,138,143,89,78,85,89,12,92,5,19,3,33,72,101,76,96,45,63,26,5,93,110,24,3,28,67,101,73,68,44,58,21,5,97,106,5,29,51,125,5,19,3,27,129,68,233,108,64,12,62,5,1667,19,3,25,4399,414,62,62,66,9,191,17,106,203,14,16,7,5,28,177,183,187,193,72,30,46,61,62,67,55,52,74,45,81,43,81,44,9,214,29,66,9,273,7,52,5,332,3,22,1416,890,822,823,41,76,34,152,102,3,32,474,508,61,4,67,262,112,76,93,11,119,19,108,16,18,9,7,115,65,216,38,100,104,105,9,7,5,19,3,33,1416,61,890,64,414,901,80,84,66,98,84,70,136,5,70,52,38,94,140,72,5,3,35,822,79,823,82,414,597,281,86,152,72,153,74,70,36,98,118,89,74,29,132,91,28,64,90,109,7,5,70,3,43,1416,64,890,67,822,79,823,82,414,103,479,480,481,597,1225,542,67,37,89,105,105,105,70,5,98,145,40,191,67,83,111,111,111,15,317,61,23,112,20,22,13,11,9,7,5,82,55,57,70,88,55,57,70,96,55,57,70,3,28,1365,51,414,1089,100,59,60,65,53,38,50,72,97,109,79,94,106,79,96,108,7,71,40,68,109,9,159,111,9,7,72,5,50,3,55,363,134,64,162,106,5,22,3,45,123,35,31,79,108,237,124,96,19,3,1,80,543,59,71,71,81,81,61,73,156,62,437,498,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_sett_info.clas.abap"],"names":[],"mappings":";;;AAuHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;8BAEuB;;IAErB,iBAAU,OAAO;IACjB,kBAAU,6BAAkB;IAE9B;;EAGA;;;;;;;QAEO,+IAAuD;;IAM5D,aAAU,qZAK2B;IAEvC;;EAGA;;;;QAGI,0DAAmC;IAErC,iBAAW,GAAR,SAAsB,wBAAP,wBAAL,mCAAO,oCAAO,oCAAI;MAC7B,YAAgC,sBAAP,sBAAP,sBAAR,QAAU,oCAAO,oCAAO,mCAAI;MACtC,iFAA0B;IAC5B,wBAAe,GAAR,SAAe,wBAAL,mCAAO,oCAAI;MAC1B,YAAyB,sBAAP,sBAAR,QAAU,oCAAO,mCAAI;MAC/B,iFAA0B;IAC5B,wBAAe,GAAR,SAAU,mCAAI;MACnB,YAAkB,sBAAR,QAAU,mCAAI;MACxB,iFAA0B;IAC5B;MACE,oFAA6B;IAC/B;IAEF;;EAGA;;;;QAEO,uFAAuB;IAE5B,yBAAG,aAAuB;MACxB,iBAAe,sCAAK;MACpB;IACF;4FAIkC;IAElC,wGAA6C;IAE/C;;EAGA;;;;QAEO,2DAAoB;IAEzB,yBAAG,YAAsB;MACvB,YAAU,sCAAK;MACf;IACF;IAEA,iBAAe,GAAZ,aAAe,0CAA2B,eAAc;MACzD,cAAW,oFAAiD;IAC9D;IAEA,YAAU,WAAW;IACrB,yBAAG,mBAAuB;MACxB,qHAAsC;IACxC;IAEF;;EAGA;;QAEO,2DAAoB;IAEzB,aAAU,sNAEiE;IAE3E,iBAA0B,IAAvB,yDAAyB,uBAAS;MACnC,aAAW,2CAAU;IACvB;MACE,aAAW,yCAAQ;IACrB;koDAsC8D;IAEhE;;EAGA;QAGI,syIAA8C;QAC9C,qZAAsB;QACtB,qDAAe;QACf,qDAAe;QACf,yDAAoB;IAGtB;MACI,aAAU,0KAAqE;;;;;;;IAGnF;2BAEa;gLAKiC;sLAGK;0LAGA;gMAGK;;;MAGtD,WAAS,eAAE,MAAC,MAAK;;;;;QAEf,IACE,OAEA,AAEA,KALG,eAAE,MAAC,MAAR;;UAEI,WAAS,QAAQ,MAAC,QAAO;;UAEzB,WAAS,QAAQ,MAAC,MAAK;;UAEvB,WAAS,QAAQ,MAAC,OAAM;;QAG5B,iBAAoB,GAAjB,QAAQ,MAAC,UAAW,wCAAO,yBAAI,eAAE,MAAC,QAAc,iCAAM,gCAAC;UACxD,WAAS,MAAM;UACf,YAAS,0CAAqB;QAChC;gRAImB;MACrB;;IACF;2UAIyB;EAE3B;EAGA;QAGI,+3CAA8D;QAC9D,i3BAA6D;QAC7D,6yBAAyD;QACzD,8yBAAyD;IAE3D,sBAAM,aAAQ;2EAKa;iCAER;uJAQoB;qGAKA;EAEzC;EAGA;;;;;QAKI,0DAAmB;QACnB,6PAA0D;IAE5D,IACE,WAA8B;IAEhC,OAAO,MAAC,UAAO,2BAAS,OAAO,MAAC,OAAM;IAEtC,iBAAoB,GAAjB,OAAO,MAAC,WAAY,0CAAQ;MAC7B;QACI,aAAU,gGAA2D;;;;;;MAEzE;MAEA;MAEA,OAAO,MAAC,UAAO,yBAAO,SAAS;;;QAG7B;QACA,iBAAgB,GAAb,oCAAgB,qCAAG;UACpB,OAAO,MAAC,UAAoB,mBAAb,OAAO,MAAC,MAAO,gCAAC;QACjC;MACF;IACF;IAEF;;EAGA;;;;;QAEO,qZAAsB;QACtB,43BAAkE;IAEvE,cAAW,4DAA2B;IAEtC,QAAQ,MAAC,aAAU,mDAAiB;IACpC,QAAQ,MAAC,WAAU,yBAAO,UAAU;IAEpC,iBAAiC,IAA9B,+CAAgC,uBAAS;MAC1C,eAAY,6DAA4B;MACxC,QAAQ,MAAC,YAAS,yBAAO,WAAW;MACpC,0BAAuB,sGAAwD;IACjF;IAEA,gCAAO,kBAAY,aAAQ;IAE3B,yBAAG,oBAAwB;MACzB,sBAAM,QAAQ;MACd,QAAQ,MAAC,aAAU,2DAAyB;MAC5C,QAAQ,MAAC,YAA4B,qBAAnB,yBAAO,YAAc,yBAAO,uBAAsB;MACpE,gCAAO,kBAAY,aAAQ;IAC7B;EAEF;EAGA;;;;;QAGI,qZAAgC;QAChC,4kBAAwD;QACxD,gRAAwD;IAE1D,QAAQ,MAAC,aAAU,qDAAmB;;IAGtC,QAAQ,MAAC,WAAQ,yBAAO,gBAAgB;;IAGxC,QAAQ,MAAC,YAAS,yBAAO,iBAAiB;IAE1C,gCAAO,kBAAY,aAAQ;IAE3B,sBAAM,QAAQ;IACd,QAAQ,MAAC,aAAU,iEAA+B;IAClD,QAAQ,MAAC,YAAU,0BAAO,4DAA2C;IAErE,wBAAqB,2DAAsC;;;MAGzD;;;8DAA2F;MAC3F,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,QAAQ,MAAC,YAAyB,mBAAhB,QAAQ,MAAC,QAAS,gCAAC;MACvC;IACF;IAEA,gCAAO,kBAAY,aAAQ;EAE7B;EAGA;;;;;;;;;QAGI,qZAA4B;QAC5B,8FAA6B;QAC7B,sdAA4B;QAC5B,udAA4B;QAC5B,wdAA4B;QAC5B,4kBAAoD;IAEtD,IACE,YAAiC;IADnC,IAEE,aAAkC;;;MAGlC,kBAAe,+DAAkC;MAEjD,aAAa,MAAC,UAA0B,mBAAnB,aAAa,MAAC,MAAO,YAAY,MAAC,MAAI;MAC3D,aAAa,MAAC,UAA0B,mBAAnB,aAAa,MAAC,MAAO,YAAY,MAAC,MAAI;MAC3D,aAAa,MAAC,UAA0B,mBAAnB,aAAa,MAAC,MAAO,YAAY,MAAC,MAAI;8BAEnD,YAAU,MAAC,MAAU;IAC/B;IAEA,iBAAiC,IAA9B,+CAAgC,uBAAS;;;QAExC,gBAAa,qKAEkC;QAE/C,iBAAc,GAAX,YAAa,wBAAU;UACxB,kBAAe,qDAA8B;UAE7C,cAAc,MAAC,UAA2B,mBAApB,cAAc,MAAC,MAAO,YAAY,MAAC,MAAI;UAC7D,cAAc,MAAC,UAA2B,mBAApB,cAAc,MAAC,MAAO,YAAY,MAAC,MAAI;UAC7D,cAAc,MAAC,UAA2B,mBAApB,cAAc,MAAC,MAAO,YAAY,MAAC,MAAI;UAE7D;4TAQ+B;oCACnB,QAAa;;;;;;UAEzB;QACF;MAEF;IACF;IAEA,QAAQ,MAAC,aAAU,iDAAe;IAClC,QAAQ,MAAC,WAAU,aAAa,MAAC,KAAI;IACrC,QAAQ,MAAC,YAAU,cAAc,MAAC,KAAI;IACtC,gCAAO,kBAAY,aAAQ;IAC3B,QAAQ,MAAC,aAAU,uDAAqB;IACxC,QAAQ,MAAC,WAAU,aAAa,MAAC,KAAI;IACrC,QAAQ,MAAC,YAAU,cAAc,MAAC,KAAI;IACtC,gCAAO,kBAAY,aAAQ;IAC3B,QAAQ,MAAC,aAAU,+DAA6B;IAChD,QAAQ,MAAC,WAAU,aAAa,MAAC,KAAI;IACrC,QAAQ,MAAC,YAAU,cAAc,MAAC,KAAI;IACtC,gCAAO,kBAAY,aAAQ;EAE7B;EAGA;QAGI,40CAAsD;QACtD,0CAA0B;QAC1B,qZAAwB;IAE1B,IACE,aAAmC;IAErC,gBAAa,8EAA0C;;;;;MAGrD,sBAAM,QAAQ;MAEd,IACE,OAGA,AAGA,KAPG,eAAE,MAAC,MAAR;;QAEI,QAAQ,MAAC,aAAU,4DAA0B;QAC7C,aAAW,wCAAyB,+BAAO,MAAC,SAAQ;;QAEpD,QAAQ,MAAC,aAAU,yDAAuB;QAC1C,aAAW,wCAAyB,+BAAO,MAAC,MAAK;;QAEjD,QAAQ,MAAC,aAAU,2DAAyB;QAC5C,aAAW,wCAAyB,+BAAO,MAAC,QAAO;;;;QAIrD,iBAAsB,GAAnB,aAAW,MAAC,SAAS,SAAQ;UAC9B,QAAQ,MAAC,WAAuB,mBAAf,QAAQ,MAAC,OAAQ,gCAAC;QACrC;QACA,iBAAsB,GAAnB,aAAW,MAAC,SAAS,SAAS,iBAAkC,IAA9B,+CAAgC,uBAAS;UAC5E,QAAQ,MAAC,YAAyB,mBAAhB,QAAQ,MAAC,QAAS,gCAAC;QACvC;MACF;MAEA,gCAAO,kBAAY,aAAQ;IAC7B;;EAEF;EAGA;;;;IAEE,iBAAuB,GAApB,QAAQ,OAAE,iCAAY,wCAAyB,gCAAQ,MAAC,SAAO;MAChE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,oBAAmB;IACvE;IAEF;;EAGA;;kCAEsB;8BAEJ;;2GAIoB;4OAKiB;2HAEN;+FAEvB;IAE1B;;AACF","file":"zcl_abapgit_gui_page_sett_info.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_locl.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,243,206,213,218,196,1239,971,510,430,226,231,57,57,207,68,70,207,65,390,213,17,12,42,22,146,130,137,142,120,1163,52,58,3,37,105,76,106,308,111,65,312,12,83,73,86,57,157,9,7,5,3,38,309,110,133,127,189,65,145,5,3,25,73,73,119,167,121,3,36,108,149,63,141,5,3,29,119,61,31,100,95,30,53,56,16,3,23,56,3,30,143,119,61,152,116,440,19,3,27,129,140,153,242,486,133,380,5,90,390,5,2865,19,3,33,258,64,106,80,14,194,7,52,5,3,35,102,1416,80,193,162,27,135,88,44,5,21,3,25,136,140,153,91,90,144,133,156,5,90,160,5,132,217,217,211,217,235,205,24,3,25,147,157,161,207,159,159,153,159,179,147,81,29,155,56,3,30,141,136,76,130,108,110,108,164,132,63,11,125,19,108,26,169,16,18,9,7,5,136,65,11,127,19,108,26,171,16,18,9,7,5,171,59,11,249,19,108,26,180,16,18,9,7,5,190,210,5,9,166,17,106,24,156,14,16,7,5,29,3,55,363,134,64,240,67,125,227,115,44,96,117,46,96,104,33,96,111,40,95,96,101,35,7,96,5,65,103,98,14,97,179,7,5,22,3,45,123,39,79,108,237,167,96,150,37,108,157,5,19,3,1,80,917,61,75,85,89,63,87,81,87,87,63,107,75,455,62,102,106,80,94,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap"],"names":[],"mappings":";;;AAwGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;QAEO,2SAA8D;QAC9D,sGAAiC;IAEtC,iBAAgB,GAAb,cAAe,wBAAU;MAE1B,4BAAoB,oRAGU;IAEhC;MAEE,wBAAqB,mDAAmC;MACxD,iBAAsB,GAAnB,oBAAqB,wBAAU;qFACuC;QACvE,yBAAG,qBAAyB;4JAGE;QAC9B;MACF;IAEF;EAEF;EAGA;QAGI,4SAAsE;QACtE,qGAAkC;IAEpC,iBAAiB,MAAC,aAAU,oCAAqB,oCAAgB,MAAC,aAAY;IAC9E,iBAAiB,MAAC,UAAU,oCAAqB,oCAAgB,MAAC,UAAS;IAE3E,4BAAyB,2JAAmF;IAE5G,yBAAG,iCAAqC;gJAGH;IACrC;EAEF;EAGA;QAGI,gEAAyB;QACzB,gEAAyB;IAE3B,mBAAgB,8FAAgC;IAEhD,mBAAgB,8IAA8E;wHAIpE;EAE5B;EAGA;QAEQ,mGAAgC;IAEtC,0BAAuB,qHAAiE;IAExF,yBAAG,+BAAmC;4IAGH;IACnC;EAEF;EAGA;;;8BAEuB;;;IAGrB,iBAAU,OAAO;IACjB,kBAAU,6BAAkB;IAC5B,uBAAe,2BAAgB;IAEjC;;EAGA;;;;;;;QAEO,+IAAuD;;IAM5D,aAAU,qaAK2B;IAEvC;;EAGA;;QAEQ,mIAA8C;IAEpD,gBAAa,mIAA+D;IAE5E,aAAU,+NAEuD;qeASW;IAE5E,iBAAiD,IAA9C,kFAAgD,uBAAS;2XAKgD;IAC5G;IAEA,iBAA8B,IAA3B,uCAA6B,uBAAS;qYAKuE;IAChH;gzFA0C8D;IAEhE;;EAGA;IAEE,yBAAG,iCAA2B,IAC5B,cAAqC,IAAnC,oDAAqC,uBAAU,iBAAoC,IAAjC,kDAAmC,wBAAW,CAAC;MAGnG,IACE,aADG,wCAAL;;+EAEoD;;iMAEqC;;MAGzF,sBAAM,sBAAiB;IACzB;EAEF;EAGA;;QAEO,+3CAAuD;IAE5D,cAAW,4DAA2B;IAEtC;;;qIACoE;IACpE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,cAAY,sBAAS;IACvB;IAEF;;EAGA;;QAEQ,mIAA8C;IAEpD,gBAAa,mIAA+D;IAG5E,sBAAc,+DAA8B;;+IAMP;IAErC,iBAAiD,IAA9C,kFAAgD,uBAAS;2JAGhB;IAC5C;IAEA,iBAA8B,IAA3B,uCAA6B,uBAAS;+JAGK;IAC9C;mIAI+B;wNAGwC;wNAGA;kNAGH;wNAGG;0OAGZ;4MAGM;IAEnE;;EAGA;IAEE,gBAAW,MAAC,mBAA+B,oGAAsC;IACjF,gBAAW,MAAC,wBAA+B,yGAA2C;IACtF,gBAAW,MAAC,0BAA+B,2GAA6C;IACxF,gBAAW,MAAC,aAA+B,sKAAsE;IACjH,gBAAW,MAAC,yBAA+B,0GAA4C;IACvF,gBAAW,MAAC,yBAA+B,0GAA4C;IACvF,gBAAW,MAAC,sBAA+B,uGAAyC;IACpF,gBAAW,MAAC,yBAA+B,0GAA4C;IACvF,gBAAW,MAAC,mCAA+B,oHAAsD;IACjG,gBAAW,MAAC,mBAA+B,oGAAsC;gFAEvC;IAE1C;IAEA,oJAA6C;IAE7C,uBAAe,2BAAgB;EAEjC;EAGA;;;;QAGI,yHAAwD;QACxD,mGAAkC;QAClC,qGAAkC;QAClC,mGAAoC;IAEtC,uBAAoB,uIAAwE;IAE5F,0BAAuB,oGAA2C;IAClE,yBAAG,+BAAmC;MACpC;4HAC6E;;;;;;;;MAK7E;IACF;IAEA,4BAAyB,sGAA6C;IACtE,yBAAG,iCAAqC;MACtC;8HAC+E;;;;;;;;MAK/E;IACF;IAEA,sBAAmB,6BAAU,kHAAwD;IACrF,yBAAG,2BAA+B;MAChC;wPAEmD;;;;;;;;MAKnD;IACF;IAEA,iBAA0C,IAAvC,iGAAyC,uBAAU,yBAAI,iBAA2B;iNAGL;IAChF;IAEA;qKACyE;;;;;;;;IAKzE;IAEF;;EAGA;;;;+OAE4G;IAE1G,IACE,OAKA,AAKA,AAKA,AAKA,AAIA,KAzBG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,YAAQ,+LAE2B;;2CAInB;MAC3B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;6CAI9B;MAC7B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;gCAI3C;MAChB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;uCAIpC;;MAIvB,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;kCAC3B;MAClB;MAEA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAI/D,yBAAG,iCAA0B;MAI3B,iBAAoC,IAAjC,kDAAmC,uBAAS;QAC7C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;QAC1D,UAAU,MAAC,WAAQ,8IAEe;MACpC;IACF;IAEF;;EAGA;;sCAE0B;;2GAIY;4OAKG;sKAII;+FAEnB;IAExB,yBAAG,uBAA+B,iBAAoC,IAAjC,kDAAmC,wBAAU;oCAC5D;IACtB,wBAAwC,IAAjC,kDAAmC,uBAAS;4JAEyB;IAC5E;IAEF;;AACF","file":"zcl_abapgit_gui_page_sett_locl.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_pers.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,218,208,1403,1209,211,430,226,231,57,177,231,56,17,12,42,22,130,137,142,132,1327,52,58,3,29,31,100,95,53,56,16,3,18,51,3,25,143,152,98,372,19,3,27,129,248,4811,19,3,25,136,143,77,90,213,136,203,197,144,215,213,217,205,225,24,3,40,67,266,263,64,133,124,147,183,169,153,135,174,117,96,94,96,96,93,95,95,95,95,98,97,99,98,97,96,95,99,96,94,93,93,99,75,68,26,11,64,19,108,16,18,9,7,5,180,197,156,19,3,25,154,157,139,147,141,226,157,155,159,149,167,89,91,100,29,155,56,3,30,141,136,76,130,164,9,179,17,106,24,162,14,16,7,5,29,3,55,363,134,64,240,67,125,227,95,96,101,35,7,96,5,22,3,45,123,35,79,123,167,100,19,3,1,80,1155,65,85,55,67,75,69,73,83,87,77,65,69,95,83,85,75,156,62,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_sett_pers.clas.abap"],"names":[],"mappings":";;;AA+EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;8BAEuB;;;IAGrB,kBAAU,6BAAkB;IAC5B,uBAAe,2BAAgB;IAEjC;;EAGA;;;;;QAEO,+IAAuD;;IAI5D,aAAU,iWAI2B;IAEvC;;EAGA;;IAEE,aAAU,qOAEgE;0sJAqFV;IAMlE;;EAGA;;IAGE,sBAAc,mHAAqD;IACnE,sBAAc,iDAAiC;;oNAMC;uIAKf;0MAGU;oMAGH;+IAGH;sNAKiC;oNAGD;wNAGE;4MAG3B;gOAK+B;IAE7E;;EAGA;;QAEO,iQAA8B;QAC9B,8PAA2B;QAC3B,uDAAgB;QAChB,4HAA4C;IAEjD,gCAAO,yEAAsC,YAAY;IACzD,gCAAO,gGAA6D,YAAY;IAChF,gCAAO,oIACF,YAAY;IACjB,gCAAO,sHAAmF,YAAY;IACtG,gCAAO,sGAAmE,YAAY;IACtF,gCAAO,oFAAiD,YAAY;IACpE,gCAAO,2HAAwF,YAAY;IAC3G,gCAAO,kEAA+B,YAAY;IAClD,gCAAO,6CAAU,YAAY;IAE7B,gCAAO,8CAAW,SAAS;IAC3B,gCAAO,gDAAa,SAAS;IAC7B,gCAAO,gDAAa,SAAS;IAC7B,gCAAO,6CAAU,SAAS;IAC1B,gCAAO,+CAAY,SAAS;IAC5B,gCAAO,+CAAY,SAAS;IAC5B,gCAAO,+CAAY,SAAS;IAC5B,gCAAO,+CAAY,SAAS;IAC5B,gCAAO,kDAAe,SAAS;IAC/B,gCAAO,iDAAc,SAAS;IAC9B,gCAAO,mDAAgB,SAAS;IAChC,gCAAO,kDAAe,SAAS;IAC/B,gCAAO,iDAAc,SAAS;IAC9B,gCAAO,gDAAa,SAAS;IAC7B,gCAAO,+CAAY,SAAS;IAC5B,gCAAO,mDAAgB,SAAS;IAChC,gCAAO,gDAAa,SAAS;IAC7B,gCAAO,8CAAW,SAAS;IAC3B,gCAAO,6CAAU,SAAS;IAC1B,gCAAO,6CAAU,SAAS;IAC1B,gCAAO,mDAAgB,SAAS;IAEhC,eAAY,sDAAiC;;;MAE3C;+DAGqB;;;;;;MAErB;IACF;IAEA,iCAAO,gIAE4B,YAAY;IAE/C,gCACE,kJACG,YAAY;IAEjB,aAAU,yIAAsF;IAElG;;EAGA;QAEO,iJAAuD;IAG5D,gBAAW,MAAC,wBAAoB,yGAA2C;IAG3E,gBAAW,MAAC,eAAW,gGAAkC;IACzD,gBAAW,MAAC,mBAAe,oGAAsC;IACjE,gBAAW,MAAC,gBAAY,iGAAmC;IAC3D,gBAAW,MAAC,mBAAe,mLAAoF;IAG/G,gBAAW,MAAC,wBAAoB,yGAA2C;IAC3E,gBAAW,MAAC,uBAAmB,wGAA0C;IACzE,gBAAW,MAAC,yBAAqB,0GAA4C;IAC7E,gBAAW,MAAC,oBAAgB,qGAAuC;IAGnE,gBAAW,MAAC,6BAAyB,8GAAgD;wFAGxC;IAE7C,oBAAiB,iEAA4C;mGACxB;IAErC;IAEA,oJAA6C;IAE7C,uBAAe,2BAAgB;EAEjC;EAGA;;;;QAEO,yHAA0C;IAE/C,uBAAoB,uIAAwE;IAE5F;kLACsF;;;;;;;;IAKtF;IAEF;;EAGA;;;;+OAE4G;IAE1G,IACE,OAKA,KANG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,YAAQ,+LAE2B;;MAI9C,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;kCAC3B;MAClB;MAEA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAIjE;;EAGA;;kCAEsB;;0HAG0B;sKAGH;mGACnB;IAE1B;;AACF","file":"zcl_abapgit_gui_page_sett_pers.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_remo.clas.mjs":{"lineLengths":[89,53,43,72,32,58,123,217,1033,206,213,218,188,164,222,580,761,675,219,1235,1234,411,238,60,412,57,158,200,197,196,202,65,169,347,309,65,219,390,213,17,12,42,22,120,957,130,137,142,112,88,146,68,52,58,58,3,28,108,139,5,140,167,5,3,30,105,76,106,100,116,622,111,65,150,15,7,111,122,366,12,83,73,85,56,142,9,7,5,3,25,107,66,116,129,148,23,5,109,247,79,148,21,3,26,105,76,106,977,132,100,111,65,150,144,7,111,329,12,83,73,83,54,251,9,7,5,3,27,105,76,106,619,100,111,65,150,15,117,198,15,7,111,280,12,83,73,82,53,136,9,7,5,3,22,66,52,18,3,29,119,61,31,30,103,53,63,100,16,3,23,56,3,30,143,119,61,152,116,433,19,3,32,129,145,103,69,68,67,67,74,103,117,156,123,65,129,7,12,62,66,5,244,62,74,69,72,12,75,81,75,82,88,5,794,63,946,191,260,7,97,251,7,100,344,7,106,279,7,5,542,19,3,46,947,136,76,119,127,78,133,50,97,256,101,249,104,256,129,110,141,7,5,23,3,46,947,119,61,140,143,110,104,58,96,61,120,119,113,113,98,126,122,176,153,62,58,9,98,200,61,204,104,14,113,98,153,97,62,58,9,7,12,59,91,60,5,23,3,33,258,64,105,69,106,73,103,70,14,194,7,52,5,3,32,136,67,67,90,91,74,12,73,5,143,113,135,92,149,146,112,143,109,143,155,5,24,3,26,123,79,238,167,19,3,25,140,143,951,103,98,93,212,5,108,64,80,12,63,102,5,52,95,73,71,79,99,73,71,76,102,73,77,108,71,83,5,225,102,5,29,155,56,103,3,33,107,100,110,183,123,66,111,51,78,83,115,7,12,77,141,7,111,133,13,173,82,136,125,11,21,110,18,20,11,9,7,5,3,37,67,61,133,34,54,89,3,33,102,67,100,107,67,133,34,54,61,123,12,97,5,3,35,102,67,100,67,61,133,100,110,34,54,109,62,118,231,5,3,30,141,136,76,130,148,124,103,117,110,100,84,132,107,164,112,104,94,183,5,132,183,70,11,106,85,58,19,108,26,155,16,18,9,7,5,63,118,35,97,241,61,87,101,237,61,84,110,126,128,56,162,9,93,104,114,95,197,9,14,168,7,11,56,107,79,9,19,108,26,134,16,18,9,7,5,29,3,55,363,134,64,100,110,104,107,240,67,125,77,60,7,234,101,44,41,100,14,115,98,7,107,96,49,104,33,101,30,110,29,104,50,44,100,14,121,98,7,97,41,96,95,96,101,35,7,96,5,65,103,98,14,97,179,7,5,161,97,5,22,3,54,884,568,117,103,148,119,65,125,7,12,62,65,68,7,5,87,91,95,76,87,189,96,100,78,89,5,95,93,97,78,89,5,98,96,100,78,89,5,104,102,106,78,89,5,62,99,93,78,89,12,100,93,78,89,5,29,3,45,123,39,79,190,150,37,108,157,5,19,3,1,80,526,66,63,66,72,707,65,69,65,57,71,63,57,63,75,69,621,62,66,74,80,74,80,92,86,164,84,140,977,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap"],"names":[],"mappings":";;;AAgMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;IAEE,iBAA0B,IAAvB,yDAAyB,uBAAS;0IACiC;IACtE;IACA,iBAAkD,KAA/C,uEAA+B,iBAAkB,uBAAS;sKACqC;IAClG;EAEF;EAGA;;;;QAEO,2FAAwD;QACxD,2GAAgE;QAChE,qmBAA8D;QAC9D,sGAAiC;IAEtC,iBAAgB,GAAb,cAAe,wBAAU;MAE1B,iBAAqC,IAAlC,iGAAoC,uBAAS;QAC9C;MACF;MAEA,YAAiB,2FAA6B;MAC9C,oBAAiB,8FAAgC;MAEjD,4BAAoB,0UAMD;IAErB;MAEE,wBAAqB,mDAAmC;MACxD,iBAAsB,GAAnB,oBAAqB,wBAAU;oFACsC;QACtE,yBAAG,oBAAwB;6IAGU;QACrC;MACF;IAEF;EAEF;EAGA;;QAGI,yDAA0B;QAC1B,2GAAgE;QAChE,wHAA6C;IAE/C,iBAAqC,IAAlC,iGAAoC,uBAAS;MAC9C;IACF;IAEA,YAAS,2FAA6B;IACtC,yCAAiB,4CAA6B,wCAAY,MAAC,eAAgB,+FAAgC;IAE3G,eAAY,0DAAqC;IAEjD,gBAAY,0HAEwB,IAAI;IAE1C;;EAGA;;;;QAEO,w8BAAkE;QAClE,2HAAoD;QACpD,2FAAkC;QAClC,sGAAiC;IAEtC,iBAAgB,GAAb,cAAe,wBAAU;MAE1B,iBAAqC,IAAlC,iGAAoC,uBAAS;+IACyB;MACzE;MAEA,YAAS,2FAA6B;MACtC,4BAAoB,qSAGS;IAE/B;MAEE,wBAAqB,mDAAmC;MACxD,iBAAsB,GAAnB,oBAAqB,wBAAU;kFACoC;QACpE,yBAAG,kBAAsB;0PAGoC;QAC7D;MACF;IAEF;EAEF;EAGA;;;;QAEO,kmBAAsD;QACtD,2FAAkC;QAClC,sGAAiC;IAEtC,iBAAgB,GAAb,cAAe,wBAAU;MAE1B,iBAAqC,IAAlC,iGAAoC,uBAAS;QAC9C;MACF,wBAA8B,IAAvB,yDAAyB,uBAAS;QACvC,2LAAoF;QACpF;MACF;MAEA,YAAS,2FAA6B;MACtC,4BAAoB,oPAGD;IAErB;MAEE,wBAAqB,mDAAmC;MACxD,iBAAsB,GAAnB,oBAAqB,wBAAU;iFACmC;QACnE,yBAAG,iBAAqB;uIAGU;QAClC;MACF;IAEF;EAEF;EAGA;;IAGE,WAAS,mCAAE;IAEb;;EAGA;;;8BAEuB;IACrB,iBAAuB,OAAO;IAC9B,+BAAuB,kEAAwC;IAC/D,kBAAuB,6BAAkB;IACzC,uBAAuB,kCAAuB;;IAGhD;;EAGA;;;;;;;QAEO,+IAAuD;;IAM5D,aAAU,8ZAK2B;IAEvC;;EAGA;;;;QAGI,4DAA0B;QAC1B,2DAA0B;QAC1B,0DAA0B;QAC1B,0DAA0B;QAC1B,iEAA0B;QAC1B,8FAA6B;QAC7B,4GAAgC;IAElC,yBAAG,gCAA+B,iBAAuC,IAAnC,+CAAqC,wBAAU;MACnF,gBAAa,mGAA0C;MACvD,iBAAc,GAAX,YAAa,wBAAU;QACxB,kBAAe,qGAA4C;MAC7D;IACF;MACE,eAAe,yBAAoB,MAAC,QAAO;MAC3C,iBAAe,yBAAoB,MAAC,UAAS;IAC/C;IAEA,aAAU,iOAEwD;IAElE,iBAAc,GAAX,YAAa,uBAAS;MACvB,cAAiB,oDAAkB;MACnC,YAAiB,iDAAe;MAChC,aAAiB,mDAAiB;IACpC;MACE,cAAiB,qDAAmB;MACpC,YAAiB,6DAA2B;MAC5C,aAAiB,sDAAoB;MACrC,YAAiB,8DAA4B;MAC7C,mBAAiB,6DAA2B;IAC9C;yxBAgBmC;IAEnC,iBAAc,GAAX,YAAa,wBAAU;i7BAoBgB;MAExC,iBAAgB,GAAb,cAAe,2CAAY,MAAC,QAAO,iBACtB,GAAb,cAAe,2CAAY,MAAC,QAAM;mQAKO;MAC5C;MAEA,iBAAgB,GAAb,cAAe,2CAAY,MAAC,KAAG;0PAKO;MACzC;MAEA,iBAAgB,GAAb,cAAe,2CAAY,MAAC,QAAM;uVAOO;MAC5C;MAEA,iBAAgB,GAAb,cAAe,2CAAY,MAAC,cAAY;sRAKO;MAClD;IAEF;6hBAWyD;IAE3D;;EAGA;;;;IAEE,WAAW,MAAC,UAAM,sFAA6B;IAC/C,WAAW,MAAC,cAAU,0FAAiC;IAEvD,iBAAuB,GAApB,WAAW,MAAC,UAAU,wBAAU;MACjC,WAAW,MAAC,gBAAY,4FAAmC;MAE3D,IACE,OAGA,AAGA,AAIA,KAXG,WAAW,MAAC,UAAjB;;QAEI,WAAW,MAAC,kCAAS,4CAA6B,wCAAY,MAAC,eAC7D,0FAAgC;;QAElC,WAAW,MAAC,+BAAM,4CAA6B,wCAAY,MAAC,cAC1D,uFAA6B;;QAE/B,WAAW,MAAC,kCAAS,4CAA6B,wCAAY,MAAC,eAC7D,0FAAgC;QAClC,WAAW,MAAC,aAAS,yFAAgC;;QAErD,WAAW,MAAC,mBAAe,+FAAsC;;IAEvE;IAEF;;EAGA;;;;QAEQ,mIAAmD;QACnD,sIAAoD;QACpD,qGAA8C;IAEpD,iBAA0B,IAAvB,oDAAyB,wBAAU;iCACpC,gBAAkB,OAAO;MAEzB,WAAW,MAAC,UAAM,6DAA0B;MAC5C,WAAW,MAAC,aAAU,uBAAU;MAChC,WAAW,MAAC,sBAAkB,yEAAsC;MAEpE,0BAAG,oFAAqD;QACtD,WAAW,MAAC,aAAS,yEAAsC;QAC3D,WAAW,MAAC,aAAS,yEAAsC;QAC3D,WAAW,MAAC,eAAY,2CAAY,MAAC,OAAM;MAC7C,iCAAO,oFAAqD;QAK1D,WAAW,MAAC,sBAAkB,yEAAsC;QACpE;QACA,iBAAsB,GAAnB,WAAW,MAAC,SAAU,4CAA6B,wCAAY,MAAC,MAAI;UACrE,WAAW,MAAC,SAAM,WAAW,MAAC,OAAM;UACpC,sBAAM,WAAW,MAAC,OAAM;QAC1B;QAEA,eAAY,yEAAsC;QAClD,6LAA0G;QAC1G,yBAAS,SAAS;QAClB,WAAW,MAAC,iLAA6D;QACzE,WAAW,MAAC,eAAY,2CAAY,MAAC,aAAY;MACnD;QACE,WAAW,MAAC,aAAS,yEAAsC;QAC3D,WAAW,MAAC,eAAY,2CAAY,MAAC,OAAM;QAE3C,iBAAsB,GAAnB,WAAW,MAAC,SAAU,4CAA6B,wCAAY,MAAC,MAAI;UACrE,WAAW,MAAC,eAAY,2CAAY,MAAC,IAAG;UACxC,WAAW,MAAC,SAAM,WAAW,MAAC,OAAM;UACpC,sBAAM,WAAW,MAAC,OAAM;QAC1B;MACF;IAEF;iCACE,iBAAmB,OAAO;MAE1B,WAAW,MAAC,UAAM,wDAA4B;MAC9C,WAAW,MAAC,aAAU,sBAAS;IACjC;IAEF;;EAGA;IAEE,yBAAG,iCAA2B,IAC5B,cAAqC,IAAnC,oDAAqC,uBAAU,iBAAoC,IAAjC,kDAAmC,wBAAW,CAAC;MAGnG,IACE,OAEA,AAEA,MALG,wCAAL;;oEAEyC;;wEAEI;;qEAEH;;iMAE+C;;MAGzF,sBAAM,sBAAiB;IACzB;EAEF;EAGA;;QAGI,0DAAmB;QACnB,0DAAmB;;IAIrB,iBAAgC,GAA7B,yBAAoB,MAAC,UAAU,uBAAS;MACzC,YAAU,sDAAoB;IAChC;MACE,YAAU,qDAAmB;IAC/B;8IAIyC;gHAGrB;sIAGiB;IAErC,iBAAgC,GAA7B,yBAAoB,MAAC,UAAU,wBAAU;oJAGC;MAG3C,aAAU,6HAA4E;+GAGlE;MAEpB,aAAU,0HAAyE;4GAG/D;8IAIoB;0JAIM;IAChD;IAEF;;EAGA;;;6OAO0C;sKAIG;IAE7C;;EAGA;QAGI,mIAAmD;QACnD,sIAAoD;QACpD,86BAAuC;IAEzC,qBAAkB,4EAA6C;IAG/D,iBAA2B,GAAxB,eAAe,MAAC,UAAW,yBAAoB,MAAC,SAAO;4FAEJ;iCACpD,eAAW,kKAAiE;IAC9E;IAEA,iBAA0B,IAAvB,yDAAyB,uBAAS;iCAEnC,iBAAmB,YAAO;+EACsB;IAClD;iCAEE,gBAAkB,YAAO;qGACqB;IAChD;IAEA,IACE,OAIA,AAIA,AAGA,KAZG,eAAe,MAAC,UAArB;;wEAE+C;sEACF;8EACK;;wEAEH;sEACF;2EACE;;wEAEA;4EACW;;sEAEb;kFACmB;;IAGhE,iBAA0B,IAAvB,yDAAyB,wBAAW,iBAA8B,GAA1B,eAAe,MAAC,YAAa,2CAAY,MAAC,cAAY;qGAGjD;IAChD;IAEA;IAEA,oJAA6C;IAE7C,4BAAqB,sBAAS;IAC9B,+BAAuB,kEAAwC;EAEjE;EAGA;QAEQ,kGAA6B;QAC7B,2FAA0C;QAC1C,qGAA6C;IAEnD,mBAAiB,gCAAyC,IAAlC,iGAAoC,wBAA3C,CAAuD;0HAG7C;IAE3B,iBAAkB,GAAf,gBAAiB,uBAAS;MAC3B,YAAS,2FAA6B;MACtC,qCAA8B,MAAM;MACpC,iBAAU,GAAP,QAAU,yCAAO;QAClB,YAAS,6DAA+B;kHAGrB;MACrB;IAEF;MACE,yBAAG,2CAA0C;4IAGH;MAC1C;MAEA,YAAS,2FAA6B;MACtC,0BAAG,kGAA8C;QAC/C;4KAGoC;UAEhC,iBAAU,GAAP,QAAU,yCAAO;YAClB,eAAY,2GAAiE;4HAGvD;UACxB;;;;;;QAEJ;MACF;IACF;EAEF;EAGA;;;QAEO,4HAA2C;iCAE7B;+BACnB,SAAW,YAAO;wFACe;EAEnC;EAGA;;;;;;QAEO,4HAA2C;iCAE7B;+BAEnB,SAAW,YAAO;IAElB,iBAAa,GAAV,WAAY,uBAAS;0HACM;IAC9B;gGACqC;IACrC;EAEF;EAGA;;;;;;QAGI,4HAA6C;QAC7C,2FAAqC;QACrC,qGAAwC;iCAEvB;+BAEnB,SAAW,YAAO;4GAGU;IAE5B,iBAAa,GAAV,WAAY,wBAAU;MACvB;sOAGmF;IACrF;EAEF;EAGA;;;;QAGI,yHAA0D;QAC1D,2IAAgE;QAChE,mHAAwD;QACxD,8FAAuC;QACvC,4GAA0C;QAC1C,qGAAuD;QACvD,2FAAoD;QACpD,2EAAoC;QACpC,2HAA6D;QAC7D,kGAAuD;IAEzD,uBAAoB,uIAAwE;IAC5F,gBAAa,0FAAiC;IAC9C,YAAS,sFAA6B;IAEtC,iBAAc,GAAX,YAAa,uBAAU,yBAAI,OAAiB;sLAGU;IACzD;IAEA,iBAAc,GAAX,YAAa,wBAAW,iBAAW,GAAP,QAAU,yCAAO;sLAGS;IACzD,wBAAkB,GAAX,YAAa,wBAAU;MAC5B;yGAG+B;;yDAIG;;;;;;;;MAKlC;IACF;IAEA,iBAAc,GAAX,YAAa,wBAAU;MACxB,kBAAe,4FAAmC;MAElD,IACE,OAIA,AAIA,AAOA,KAhBG,YAAL;;QAEI,oCAAY,4CAA6B,wCAAY,MAAC,eAAgB,0FAAgC;QACtG,yBAAS,SAAS;QAClB,6BAA2B,mCAAI,MAAC,OAAM;;QAEtC,oCAAY,4CAA6B,wCAAY,MAAC,cAAe,uFAA6B;QAClG,yBAAS,SAAS;QAClB,6BAA2B,mCAAI,MAAC,IAAG;;QAEnC,qBAAkB,+FAAsC;QACxD;QACA,yBAAG,oBAAwB;UACzB,oCAAY,4CAA6B,wCAAY,MAAC,cAAgB,UAAS;QACjF;QACA,6BAA2B,mCAAI,MAAC,aAAY;;QAE5C,eAAY,yFAAgC;QAI5C,iBAAa,GAAV,WAAa,qDAAkB;oMAG8B;QAChE;;uKAIgC;;MAGpC;QACI,yBAAG,oBAAwB;UACzB,oBAAiB,2EAA6C;8EACrB;QAC3C;;;;;;;;MAKJ;IACF;IACF;;EAGA;;;;QAGI,2FAAqC;QACrC,qGAAwC;QACxC,+FAAqC;QACrC,kGAAwC;+OAEgE;IAE1G,IACE,OAUA,AAYA,AAIA,AAGA,AAGA,AAGA,AAYA,AAIA,KApDG,QAAQ,OAAE,+BAAf;;MAEI,iBAAsB,GAAnB,yBAAqB,uBAAS;2DAEZ;MACrB;MAEA,UAAU,MAAC,YAAQ,sMAEkC;;MAGrD,YAAS,wBAAa;MAEtB,yBAAG,OAAiB;QAClB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;kHAGqB;QACnB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;;MAGA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;gDAChC;;gCAGX;;6BAGH;;4BAGD;;MAGZ,eAAY,2BAAgB;MAE5B,yBAAG,UAAoB;QACrB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;wHAGwB;QACtB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;;wCAGwB;MACxB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;kCAC3B;MAClB;MAEA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAI/D,yBAAG,iCAA0B;MAI3B,iBAAoC,IAAjC,kDAAmC,uBAAS;QAC7C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;QAC1D,UAAU,MAAC,WAAQ,8IAEe;MACpC;IACF;IAGA,iBAAoB,GAAjB,UAAU,MAAC,QAAQ,gCAAiB,aAAa,MAAC,WAAU,yBAAI,uBAA8B;MAE/F,kBAAU,uEAAuD;IACnE;IAEF;;EAGA;;QAEQ,+iBAA+C;QAC/C,4GAAkC;QAClC,8FAA+B;IAErC,yBAAG,4BAAsB,iBAA8B,IAA1B,2CAA4B,wBAAU;MACjE,gBAAa,+FAAiC;MAC9C,iBAAc,GAAX,YAAa,wBAAU;QACxB,kBAAe,iGAAmC;MACpD;IACF;MACE,eAAa,yBAAoB,MAAC,QAAO;MACzC,iBAAc,GAAX,YAAa,wBAAU;QACxB,iBAAe,yBAAoB,MAAC,UAAS;MAC/C;IACF;IAEA,gBAAgB,MAAC,kBAAe,yCAAQ;IAExC,gBAAgB,MAAC,iBAAc,8CAAY;IAC3C,gBAAgB,MAAC,YAAc,sCAAO,MAAC,WAAU;IACjD,gBAAgB,MAAC,YAAc,oCAAG;IAClC,gFAAoD;IAEpD,iBAAgB,GAAb,cAAe,2CAAY,MAAC,QAAO,iBACtB,GAAb,cAAe,2CAAY,MAAC,QAAM;MACnC,gBAAgB,MAAC,iBAAc,iDAAe;MAC9C,gBAAgB,MAAC,YAAc,sCAAO,MAAC,cAAa;MACpD,gBAAgB,MAAC,YAAc,oCAAG;MAClC,gFAAoD;IACtD;IAEA,iBAAgB,GAAb,cAAe,2CAAY,MAAC,KAAG;MAChC,gBAAgB,MAAC,iBAAc,8CAAY;MAC3C,gBAAgB,MAAC,YAAc,sCAAO,MAAC,WAAU;MACjD,gBAAgB,MAAC,YAAc,oCAAG;MAClC,gFAAoD;IACtD;IAEA,iBAAgB,GAAb,cAAe,2CAAY,MAAC,QAAM;MACnC,gBAAgB,MAAC,iBAAc,iDAAe;MAC9C,gBAAgB,MAAC,YAAc,sCAAO,MAAC,cAAa;MACpD,gBAAgB,MAAC,YAAc,oCAAG;MAClC,gFAAoD;IACtD;IAEA,iBAAgB,GAAb,cAAe,2CAAY,MAAC,cAAY;MACzC,gBAAgB,MAAC,iBAAc,uDAAqB;MACpD,gBAAgB,MAAC,YAAc,sCAAO,MAAC,oBAAmB;MAC1D,gBAAgB,MAAC,YAAc,oCAAG;MAClC,gFAAoD;IACtD;IAEA,iBAAc,GAAX,YAAa,uBAAS;MACvB,gBAAgB,MAAC,iBAAc,oDAAkB;MACjD,gBAAgB,MAAC,YAAc,sCAAO,MAAC,OAAM;MAC7C,gBAAgB,MAAC,YAAc,oCAAG;MAClC,gFAAoD;IACtD;MACE,gBAAgB,MAAC,iBAAc,qDAAmB;MAClD,gBAAgB,MAAC,YAAc,sCAAO,MAAC,OAAM;MAC7C,gBAAgB,MAAC,YAAc,oCAAG;MAClC,gFAAoD;IACtD;IAEF;;EAGA;;sCAE0B;;6LAOU;IAElC,yBAAG,uBAA+B,iBAAoC,IAAjC,kDAAmC,wBAAU;oCAC5D;IACtB,wBAAwC,IAAjC,kDAAmC,uBAAS;4JAEyB;IAC5E;IAEF;;AACF","file":"zcl_abapgit_gui_page_sett_remo.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_sett_repo.clas.mjs":{"lineLengths":[89,53,43,72,32,58,97,227,213,218,196,154,796,210,146,430,226,231,57,390,213,17,12,42,22,130,137,142,120,78,52,58,68,3,29,119,61,31,100,95,30,53,56,16,3,23,56,3,30,143,119,61,152,116,430,19,3,27,129,242,4073,19,3,25,136,132,1951,97,61,69,362,62,66,78,48,63,90,256,88,106,5,223,240,195,134,140,142,9,236,17,106,149,14,16,7,5,131,112,84,37,77,61,62,67,55,52,74,54,81,56,81,54,9,269,7,52,5,59,72,65,53,77,61,62,67,55,298,7,52,5,50,43,348,24,3,25,132,69,251,362,586,78,155,160,174,312,200,66,68,31,111,5,186,68,31,61,54,110,7,5,59,55,65,53,294,264,262,81,5,50,127,118,75,76,88,56,29,155,56,3,30,141,136,76,316,69,62,56,110,108,79,134,164,119,108,158,178,181,176,83,169,5,59,55,65,53,243,245,243,147,222,104,221,7,5,50,9,132,64,121,7,17,106,28,170,14,16,7,5,325,181,200,5,29,3,55,363,134,64,240,67,125,227,95,96,101,35,7,96,5,22,3,45,123,35,79,108,237,167,96,19,3,1,80,742,57,77,71,65,81,75,63,75,83,77,156,62,91,51,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_sett_repo.clas.abap"],"names":[],"mappings":";;;AA6EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;8BAEuB;;;IAGrB,iBAAU,OAAO;IACjB,kBAAU,6BAAkB;IAC5B,uBAAe,2BAAgB;IAEjC;;EAGA;;;;;;;QAEO,+IAAuD;;IAM5D,aAAU,2ZAK2B;IAEvC;;EAGA;;IAEE,aAAU,+NAEuE;w+HAoEnB;IAEhE;;EAGA;;QAGI,2HAAmD;QACnD,s5DAA4D;QAC5D,wFAA0B;QAC1B,oDAAgC;QAChC,4DAA2B;QAC3B,iWAAgD;QAChD,qDAAsB;QACtB,yDAA2B;IAG7B,YAAS,4DAA2B;IACpC,YAAS,8BAAmB;IAC5B,kBAAe,uCAA4B;;IAI3C;IAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,gBAAc,kFAAgD;IAChE;8NAIiD;+OAGgD;kMAGtC;qIAG3B;2IAGG;6IAGC;IACpC;2OAG2F;;;;;;;IAK3F;IAEA,cAAY,8BACV,OAAQ,MAAM,MAAC,SACf,KAAQ,uCAAwB,SAAS;+GAIrB;;;MAGpB,WAAgB,mBAAP,OAAS,gCAAC;;;;;QAEjB,IACE,OAEA,AAEA,KALG,eAAE,MAAC,MAAR;;UAEI,WAAS,eAAe,MAAC,UAAS;;UAElC,WAAS,eAAe,MAAC,YAAW;;UAEpC,WAAS,eAAe,MAAC,UAAS;;4QAInB;MACrB;;IACF;;;;;MAGE,WAAgB,mBAAP,OAAS,gCAAC;;;;;ySAIF;MACjB;;IACF;;IAEA,+BAAwB,MAAM;2VAIU;IAE1C;;EAGA;QAGI,2HAAmD;QACnD,4DAA2B;QAC3B,kPAA8D;QAC9D,iWAA4D;QAC5D,ikBAA+D;IAEjE,YAAS,4DAA2B;0JAE8B;+JACM;6KACE;uTAKd;uMACa;IAGzE,gBAAY,sCAAoB,MAAM;;;8GAGY;IAClD;IAGA,eAAY,qKAAqE;;;MAE/E,cAAY,4BAAU,WAAW;MACjC,yBAAG,oBAAwB;6GAEoB;MAC/C;IACF;;;;;MAIE,eAAe,MAAC,gBAAc,6BAAU,4NAA6D;MACrG,eAAe,MAAC,kBAAc,yNAA2D;MACzF,eAAe,MAAC,gBAAc,yNAA2D;MACzF,gCAAO,yBAAmB,eAAe;IAC3C;;IAEA;;;2EAI2C;uFAET;uDACf;IAEnB;IAEA,oJAA6C;IAE7C,uBAAe,2BAAgB;EAEjC;EAGA;;;;QAGI,mTAA8D;QAC9D,4DAA+B;QAC/B,qDAA0B;QAC1B,+CAA0E;QAC1E,qGAA4E;QAC5E,mGAA0E;QAC1E,sEAA+B;QAC/B,6HAAqD;IAEvD,uBAAoB,uIAAwE;IAE5F,eAAY,kGAAyC;IACrD,WAA6B,qBAApB,0BAAQ,YAAc,gCAAC;IAChC,iBAAU,GAAP,QAAS,gCAAE,iBAAiB,GAAb,kCAAgB,qCAAG;iLAGQ;IAC7C,wBAAc,GAAP,QAAS,gCAAE,iBAAwB,GAApB,kDAAuB,qCAAG;+KAGL;IAC3C,wBAAiB,GAAV,WAAa,sCAAG;wKAGa;IACpC;;;;;MAGE,kBAAiB,yNAA2D;MAC5E,oBAAiB,yNAA2D;MAC5E,kBAAiB,yNAA2D;MAE5E,yBAAG,aAAwB,IAAI,sBAAE,yBAA8B,yBAAG,uBAA4B,CAAC;6NAGL;MAC1F,gCAAO,uBAA4B,yBAAI,eAAyB;4NAGyB;MACzF;IACF;;IAEA;MACI,yBAAsB,mGAA0C;MAChE,yBAAG,8BAAkC;wHACmC;MACxE;;;;;;;;IAKJ;IAEA,kBAAe,6SAE8D;IAC7E,iBAAqC,IAAlC,4FAAoC,uBAAU,yBAAI,aAAuB;uMAGT;IACnE;IAEF;;EAGA;;;;+OAE4G;IAE1G,IACE,OAKA,KANG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,YAAQ,+LAE2B;;MAI9C,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;kCAC3B;MAClB;MAEA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAIjE;;EAGA;;kCAEsB;;2GAIgB;4OAKiB;sKAIV;+FAEnB;IAE1B;;AACF","file":"zcl_abapgit_gui_page_sett_repo.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_stage.clas.mjs":{"lineLengths":[79,53,39,63,32,54,179,231,3757,144,152,189,224,416,246,5513,4339,216,2891,219,392,213,227,401,233,175,234,219,54,58,672,83,17,12,42,22,134,3681,68,76,113,148,56,3,22,135,144,220,803,5,19,3,31,132,64,508,70,66,298,302,322,36,197,106,138,152,305,44,304,79,9,7,5,3,29,133,61,67,61,112,79,174,147,79,93,31,83,30,30,42,42,45,46,94,5,28,67,16,3,41,64,1089,542,71,85,38,79,33,145,158,29,101,108,279,83,7,5,20,3,32,1134,3680,64,522,79,1193,510,897,1141,597,285,93,929,150,30,56,75,172,82,5,155,31,11,233,46,91,19,108,16,18,9,7,5,79,42,42,66,183,196,29,139,90,163,54,52,9,7,63,99,7,5,100,25,3,32,522,3680,64,132,816,597,132,1225,542,78,9,152,39,185,31,9,84,7,80,157,40,186,44,19,9,68,7,93,105,116,17,106,14,16,7,5,25,3,31,143,122,64,139,101,1983,70,51,299,125,25,19,3,22,187,220,58,146,5,3,26,123,70,74,79,69,75,121,5,129,117,500,432,253,99,113,356,125,99,99,102,19,3,26,123,79,113,196,133,102,124,88,85,100,100,35,256,82,19,3,41,123,322,71,78,110,188,19,3,28,123,70,70,508,61,597,61,1057,67,103,79,100,76,68,71,79,86,149,141,98,198,99,31,79,169,284,164,153,87,164,153,5,112,155,99,117,155,99,120,116,99,19,3,23,123,1134,897,522,285,604,542,1089,1225,79,139,79,109,26,84,37,32,124,129,134,147,118,117,107,115,138,103,112,105,25,7,66,28,154,167,29,110,90,69,85,88,31,61,7,66,173,186,29,129,79,33,165,178,29,121,108,317,42,5,50,104,5,26,85,38,32,125,107,107,147,107,115,163,103,112,105,25,7,79,33,145,158,29,101,108,11,248,68,157,170,31,113,68,30,137,150,31,93,92,71,78,81,33,54,9,19,108,46,16,18,9,7,299,5,50,104,5,102,19,3,40,123,101,79,122,73,398,5,19,3,26,123,79,188,115,152,197,129,227,118,102,129,136,141,141,129,133,97,95,139,19,3,21,122,1225,542,1089,81,84,37,79,33,165,178,29,121,108,202,5,85,38,79,33,145,158,29,101,108,279,138,7,5,20,3,31,122,134,64,508,132,1224,1089,298,75,90,135,5,52,81,222,36,197,79,33,133,146,29,89,90,335,7,42,123,84,157,170,31,113,92,233,9,201,133,104,129,126,131,14,184,7,5,20,3,55,363,134,64,122,67,90,45,172,95,100,70,172,95,100,166,98,133,70,83,95,101,97,30,96,142,258,97,30,96,12,97,5,22,3,54,884,568,86,81,87,72,87,80,131,72,87,83,95,72,87,88,72,72,87,29,3,1,72,357,77,69,75,75,916,1156,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_stage.clas.abap"],"names":[],"mappings":";;;AA+HA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;IAIE,iBAA2B,GAAxB,yBAAO,aAAQ,MAAC,UAAU,gCAC7B,iBAA4B,GAAzB,yBAAO,aAAQ,MAAC,WAAW,gCAAC;kyBAWN;IACzB;IAEF;;EAGA;;;QAGI,mfAAoD;QACpD,6DAAsB;QACtB,yDAAsB;IAExB,IACE,WAA+C;IADjD,IAEE,eAA+C;;;oMAUX;MAGpC,iBAAoB,GAAjB,OAAO,MAAC,WAAY,qDAAkB;QACvC,qCAAa,sCAAQ,4BAAU,OAAO,MAAC,YAAU;QACjD,6IAAsD;;;UAKpD,oSAC6D;8EACvB;QAExC;MACF;IACF;EAEF;EAGA;;;;;;;;;;QAEO,oFAAoB;8BAEJ;IAErB,eAAU,MAAC,gBAAa,wCAAO;IAC/B,iBAAwB,OAAO;IAC/B,iBAAwB,OAAO;IAC/B,uBAAwB,aAAa;IACrC,uBAAwB,aAAa;IAErC,yBAAG,aAAkB;MACnB,sCAA0B;MAC1B,sFAA0B;IAC5B;2BAEa;IACb,eAAU,MAAC,gBAAY,wBAAa;IAEtC;;EAGA;;IAEE,IAAc,aAAwC;IACtD,IAAc,aAAwC;IAEtD,aAAW,yBAAO,aAAQ,MAAC,QAAO;;;MAGhC;;;;;mGAGmC;MACnC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,iBAAsB,GAAnB,aAAW,MAAC,SAAS,wCAAyB,+BAAO,MAAC,SACvD,iBAAuB,GAAnB,aAAW,MAAC,SAAS,wCAAyB,+BAAO,MAAC,WAAS;QACnE,aAAoB,mBAAT,SAAW,gCAAC;MACzB;IACF;IAEF;;EAGA;;;;;;QAEQ,gqCAAgD;QAChD,qfAAiD;QACjD,w3BAA+C;QAC/C,4mCAAuC;QACvC,4kBAA0D;QAC1D,oRAA+C;QAC/C,oFAA+B;IAErC,IAAc,iBAAiD;;;MAG7D,aAAa,MAAC,UAAO,QAAQ,MAAC,KAAI;MAClC,aAAa,MAAC,cAAW,QAAQ,MAAC,KAAI,MAAC,SAAQ;MAC/C,aAAa,MAAC,WAAO,sIAEmB;MACxC,yEAA6C;IAC/C;;;MAGE;wOAO+B;QAC3B,aAAa,MAAC,UAAO,OAAO;QAC5B,gFAAoD;;;;;;MAExD;IACF;;;MAIE,sBAAM,YAAY;MAClB;;;;yIAGmB;MACnB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,aAAU,4IAAqE;QAC/E,yBAAG,kBAAsB;UACvB,iBAAe,MAAC,UAAO,OAAO;QAChC;MACF;MACA,yBAAG,iBAAe,MAAC,MAAe;QAChC,iBAAe,MAAC,UAAO,0CAA2B,cAAc;MAClE;IACF;IAEA,6FAA6D;IAE/D;;EAGA;;;;QAEO,2HAA0C;QAC1C,uyBAAkD;QAClD,4kBAA6C;QAC7C,2HAA0C;IAC/C,IAAc,YAAsC;IACpD,IAAc,aAAwC;IAGtD,gBAAa,wDAAmC;IAEhD;;;QAEM,iBAAyE,IAAtE,iIAAwE,wBAAU;UACnF;QACF;QACA,gCAAO,YAAU,MAAC,eAAQ,QAAQ;MACpC;MAEA,YAAS,4DAA2B;;;yLAQP;QAC3B,yBAAG,QAAkB;UACnB;QACF;QACA,gCAAO,iBAAW,QAAQ;MAC5B;MAEA;;MAGA,mBAAgB,yFAA+C;;;;;;IAGnE;IAEF;;EAGA;;;;QAEQ,kIAA+C;QAC/C,4FAAkD;QAClD,s7DAAkD;IAExD,YAAS,oDAAmB;IAC5B,cAAW,+BAAoB;;;IAU/B,YAAU,OAAO;IAEnB;;EAGA;IACE,mBAAW,kKAC6E;IAExF,iBAA2B,GAAxB,yBAAO,aAAQ,MAAC,UAAU,gCAAE,iBAA6B,GAAzB,yBAAO,aAAQ,MAAC,WAAW,gCAAC;yDAC1C;iJACwD;IAC7E;EACF;EAGA;;QAEQ,6DAAqB;QACrB,iEAA0B;;IAGhC,oBAAiB,2CAAgC;IACjD,iBAAkB,GAAf,gBAAiB,gCAAC;MACnB,iHAA0D;IAE5D;gIAEoD;oHAGZ;mfAMwB;+aAK6B;4PAGpD;kGAGlB;gHAGa;mWAGW;4HAGd;kGACV;kGAEA;qGACG;IAE5B;;EAGA;;;gHAIsC;mMAGG;oIAC6B;qGACrB;2HAEA;uFACd;oFACH;mGACN;mGAEA;kCAEJ;+PAGgC;iFACP;IAE/C;;EAGA;;QAEO,yTAA2D;IAEhE,QAAQ,MAAC,YAAS,uCAAM;IACxB,QAAQ,MAAC,UAAS,gDAAc;IAChC,aAAU,2FAA2D;2LACsB;IAE7F;;EAGA;;;;;;;;;;;;;;QAEQ,2DAAuB;QACvB,8DAAuB;;IAI7B,sCAAc,OAAO,MAAC,MAAQ,OAAO,MAAC,UAAQ;IAE9C,8IAA2D;4IAEd;iGACvB;qMAGY;kGACX;IAEvB,IACE,OAWA,KAZG,UAAL;;MAEI,cAAW,mJAEU;MAErB,iBAAc,mQAEgE;mKAElB;wJACL;;mKAEK;wJACL;;+GAGxB;0JAC0C;kGACtD;oHAEiB;0JACmC;kGACpD;uHAEoB;mHACJ;kGAEhB;IAEzB;;EAGA;;QAEQ,qmCAAoC;QACpC,w3BAAyC;QACzC,igBAA0D;QAC1D,oRAAyC;QACzC,mlBAAoD;IAE1D,IAAe,aAAwC;IAAvD,IACe,aAAwC;IADvD,IAEe,YAAuC;;0IAIQ;IAE9D,mBAAgB,sDAA2B;IAC3C,mBAAgB,oFAEiB;;;;;2HAKc;gIACK;qIACK;kJACa;qHAC7B;oHACD;0GACT;kHACO;yIACuB;sGAClC;+GACQ;wGACN;;;MAG3B;;;;;4GAEqC;MACrC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd;;;;2DAA2E;MAC7E;MAEA;;;;+HAEqC;MACrC;;;;;uHAGuC;MACvC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;4TAQsB;MAEzC,sBAAM,YAAY;IAKpB;;uGAF8B;;;;;;4HAOkB;0GACjB;0GACA;kJACuC;0GACvC;kHACO;kKACgD;sGAC3D;+GACQ;wGACN;;;MAG3B;;;;;mGAGmC;MACnC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB;uPAOsC;QAClC;;;;+GAEoC;QAEpC;;;;;2FAEiC;QACjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;;;;oDAA0E;QAC5E;;;;;;;MAGJ;0SAQyC;IAK3C;;uGAF8B;;qGAIJ;IAE5B;;EAGA;;QAEO,4FAA2B;;IAIhC,sBAAmB,8FAAiD;IAEpE,iBAAoB,GAAjB,kBAAoB,eAAE,MAAC,OAAK;6YAGiC;IAChE;IAEF;;EAGA;;;2LAI6F;kHAErD;uJACa;oMACa;gIACZ;kOACkC;qHAC7C;qGAEf;gIAC0B;uIACO;4IACK;4IACA;gIACZ;oIACI;gGACnC;8FAEF;0IAC2C;IAEhE;;EAGA;;IAEE,IAAc,YAAsC;IACpD,IAAc,aAAwC;IACtD,IAAc,aAAwC;;;;MAKpD;;;;;uHAGuC;MACvC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;yMAMmB;IACxC;;;MAGE;;;;;mGAGmC;MACnC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,iBAAsB,GAAnB,aAAW,MAAC,SAAS,wCAAyB,+BAAO,MAAC,SACvD,iBAAuB,GAAnB,aAAW,MAAC,SAAS,wCAAyB,+BAAO,MAAC,WAAS;yIAKtC;MAC/B;IAEF;IAEF;;EAGA;;;;QAEO,mfAAkD;QAClD,2HAA2C;IAEhD,IACE,WAAuC;IADzC,IAEE,aAAwC;IAF1C,IAGE,WAA6C;IAE/C,cAAW,uDAAsB;IAEjC,iBAAqB,IAAlB,8BAAoB,gCAAC;sIAC0C;IAClE;mDAE0B;;;;oMAaY;MAEpC;;;;;uFAG+B;MAC/B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;8UAI+C;MAC/D;MAEA,IACE,OAaA,AAGA,AAIA,KArBG,WAAS,MAAC,EAAf;;QAEI;;;;+GAE2C;QAE3C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wOACyF;QACzG;wMAKkD;;uGAGA;;6HAIJ;;;uLAIsC;;IAE1F;IAEF;;EAGA;;;;QAEQ,iHAAuC;IAE7C,IACE,OAWA,AAWA,AAKA,AAMA,AAIA,KAtCG,QAAQ,OAAE,+BAAf;;MAGI,cAAW,uBAAY;MAEvB,UAAU,MAAC,WAAO,yIAGe;MAEjC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAI1D,cAAW,gDAA0B;MAErC,UAAU,MAAC,WAAO,yIAGe;MAEjC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAI1D,0BAAkB,oIAA4C;MAC9D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;MAI7D,cAAW,gDAA0B;MACrC,UAAU,MAAC,WAAQ,gDAA0B;MAC7C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;gGAG7B;6BAChB;MACb,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;iQAEsB;gGACpD;6BAChB;MACb,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAE3D,gBAAa,yEAAyD;;IAG5E;;EAGA;;QAEO,+iBAA+C;IAEpD,gBAAgB,MAAC,kBAAe,wCAAO;IACvC,gBAAgB,MAAC,qDAAsB;IACvC,gBAAgB,MAAC,YAAe,+CAAa;IAC7C,gBAAgB,MAAC,4CAAkB;IACnC,gFAAoD;IAEpD,gBAAgB,MAAC,oDAAqB;IACtC,gBAAgB,MAAC,YAAe,wCAAyB,gCAAQ,MAAC,aAAY;IAC9E,gBAAgB,MAAC,4CAAkB;IACnC,gFAAoD;IAEpD,gBAAgB,MAAC,uDAAwB;IACzC,gBAAgB,MAAC,YAAe,mCAAQ,MAAC,cAAa;IACtD,gBAAgB,MAAC,4CAAkB;IACnC,gFAAoD;IAGpD,gBAAgB,MAAC,4DAA4B;IAC7C,gBAAgB,MAAC,YAAS,gCAAG;IAC7B,gBAAgB,MAAC,4CAAY;IAC7B,gFAAoD;IAEtD;;AACF","file":"zcl_abapgit_gui_page_stage.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_syntax.clas.mjs":{"lineLengths":[99,53,40,74,32,55,270,152,245,60,58,212,82,78,17,12,42,22,59,3,22,135,48,19,3,29,119,61,31,91,30,34,16,3,26,123,79,108,190,96,112,168,102,127,157,113,102,12,78,5,19,3,28,151,161,9,140,17,106,206,14,16,7,5,96,3,55,363,134,64,67,88,36,96,12,97,5,22,3,45,123,67,67,19,3,1,74,73,58,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_syntax.clas.abap"],"names":[],"mappings":";;;AAuCA;;;;;;;;;;;;;;;;;EAGE;;IAEE,aAAU,6BAAkB;IAE9B;;EAGA;;;8BACuB;IACrB,eAAU,MAAC,gBAAa,gDAAc;IACtC,iBAAU,OAAO;iCACE;IACrB;;EAGA;;;2GAIsC;6LAEqD;+FACjE;+GAEW;uKAIN;IAE7B,iBAAsB,GAAnB,yBAAO,kBAAc,gCAAC;8HACyB;4JACR;gHACN;qGACV;IAC1B;6EAEwC;IACxC;IAEF;;EAGA;QAEQ,8IAAsD;IAE5D,qBAAkB,sIAAkE;IAEpF;MACI,oBAAY,gHAAiC;;;;;;;IAIjD;IAEA,qBAAa,qEAA+B;EAE9C;EAGA;;;;IAEE,IACE,YADG,QAAQ,OAAE,+BAAf;;mCAGuB;MACnB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAG3D,gBAAa,yEAAyD;;IAG5E;;EAGA;;IAEE,eAAU,MAAC,gBAAY,wBAAa;IACpC,aAAU,gDAA2C;IAEvD;;AACF","file":"zcl_abapgit_gui_page_syntax.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_tags.clas.mjs":{"lineLengths":[89,53,38,67,32,53,97,227,213,218,210,208,1111,880,345,420,64,164,166,412,202,394,217,17,12,42,22,130,137,142,134,132,1035,47,53,3,25,107,129,79,260,21,3,29,123,61,31,95,100,54,143,53,38,16,3,23,51,3,30,143,123,61,142,111,172,19,3,32,129,136,76,83,138,122,5,99,214,1267,161,1072,12,330,5,422,19,3,28,68,139,85,161,41,96,5,41,147,5,20,3,27,67,139,85,159,40,94,5,40,145,5,19,3,32,144,127,70,72,137,139,3,30,141,136,76,925,75,164,214,163,5,109,58,180,111,61,27,69,72,29,45,90,154,7,5,29,3,55,363,134,64,130,107,67,240,67,125,94,99,50,44,100,14,114,98,7,97,96,49,92,96,101,83,75,181,130,169,13,162,21,110,28,248,18,20,11,9,189,104,96,14,98,7,5,113,88,5,22,3,45,123,35,79,108,238,167,96,19,3,1,70,821,64,62,54,54,54,54,66,58,68,70,60,54,285,61,75,71,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap"],"names":[],"mappings":";;;AAoGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;QAEO,wHAAwC;IAE7C,eAAY,0DAAqC;IAEjD,gBAAY,0OAEyC,IAAI;IAE3D;;EAGA;;;8BAEuB;;;+BAGrB,cAAW,OAAO;IAGlB,sBAAc,mHAAqD;IAEnE,kBAAU,6BAAkB;qCAEL;IAEzB;;EAGA;;;;;;;QAEO,qIAAkD;;IAMvD,aAAU,yJAE2B;IAEvC;;EAGA;;;;QAEO,0EAAkC;IAEvC,yBAAG,uBAAsB,iBAA8B,IAA1B,sCAA4B,wBAAU;MACjE,WAAM,MAAC,WAAO,sFAAkC;IAClD;IAEA,iCAA+B,4DAA4C;IAE3E,aAAU,mMAE8C;kvCA0Bd;IAE1C,iBAAe,GAAZ,WAAM,MAAC,OAAO,4CAA6B,6CAAiB,MAAC,eAAa;+iCAoBxC;IACrC;yUAIgC;IAChC;qaAQ8D;IAEhE;;EAGA;;QAEO,kIAA4C;IAEjD,aAAU,kEAA6C;IAEvD,cAAW,6IAAuD;IAClE,yBAAG,SAAmB;MACpB,cAAW,0EAAsC;IACnD;IACA,yBAAG,SAAmB;MAEpB,cAAW,6HAA+D;IAC5E;IAEF;;EAGA;;QAEO,kIAA4C;IAEjD,aAAU,kEAA6C;IAEvD,aAAW,4IAAsD;IACjE,yBAAG,QAAkB;MACnB,aAAW,yEAAqC;IAClD;IACA,yBAAG,QAAkB;MAEnB,aAAU,4HAA8D;IAC1E;IAEF;;EAGA;IAEE,WAAM,MAAC,UAAO,4CAA6B,6CAAiB,MAAC,gBAAe;8HAIpD;IAExB,WAAM,MAAC,kBAAe,6BAAkB;IACxC,WAAM,MAAC,mBAAe,8BAAmB;wIAIV;0IAGC;EAElC;EAGA;;;;QAGI,o5BAAuE;QACvE,kEAA2B;IAE7B,uBAAoB,uIAAwE;IAE5F,iBAA+E,IAA5E,kKAA8E,wBAAU;kKAGrD;IACtC;IAEA,qBAAkB,kFAA8B;IAEhD,yBAAG,0BAA8B;MAE/B,aAAU,+JAA4E;MAEtF;;;;;;2CAC0E;MAC1E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;yJAGoB;MACnC;IACF;IAEF;;EAGA;;;;QAGI,yHAA2C;QAC3C,kGAAmD;QACnD,0DAAqB;+OAEmF;IAE1G,IACE,OAGA,AAYA,AAIA,KApBG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;;MAGzD,eAAY,2BAAgB;MAE5B,yBAAG,UAAoB;QACrB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;MAC/D;iHAGwB;QACtB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;;MAGA,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;gDAChC;;MAI3B,4BAAoB,4DAA6B;MAEjD,iBAAkC,IAA/B,gDAAiC,uBAAS;kFAET;0EACqB;QAEvD,0KAGsC;QAEtC,WAAM,MAAC,WAAO,4FAAkD;QAChE,oCAAmB,GAAZ,WAAM,MAAC,OAAQ,4CAA6B,wCAAY,MAAC,MAAI;QAEpE;iKAGuB;;;;;;;;QAGvB;QAEA,mLAAiF;QACjF,6FAAwB;QAExB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,QAAO;MAC3D;QACE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;;IAKJ,iBAAoB,GAAjB,UAAU,MAAC,QAAQ,gCAAiB,aAAa,MAAC,WAAS;MAC5D,kBAAU,8DAA+B;IAC3C;IAEF;;EAGA;;kCAEsB;;2GAIgB;6OAKkB;sKAGkB;+FAEhD;IAE1B;;AACF","file":"zcl_abapgit_gui_page_tags.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_tutorial.clas.mjs":{"lineLengths":[89,53,42,71,32,57,65,25,250,232,17,12,42,22,3,29,64,16,3,27,59,3,34,135,144,1207,19,3,18,50,3,25,143,150,97,215,19,3,45,123,79,117,112,98,123,101,148,222,185,168,135,160,103,124,101,143,224,114,151,147,184,103,103,133,101,295,151,131,219,95,94,200,131,103,100,19,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_tutorial.clas.abap"],"names":[],"mappings":";;;AA2BA;;;;;;;;;;;;;;;;EAGE;;;;;;srCAuByD;IAEzD;;EAGA;;;;;QAEO,6IAAsD;;IAI3D,aAAU,oMAG2B;IAEvC;;EAGA;;;oHAI0C;+GAEL;iGACb;0HAEwB;oGACrB;mJAEmD;6NAED;wLACiC;uKACjB;sIACjC;+JACyB;sGAExD;2HAEoB;oGACtB;8IAE8C;+NAEK;iHACvC;sJACqC;kJACJ;uLACqC;sGAEhF;sGAEA;oIAE6B;oGAC/B;sSAE4D;sJACN;kIACpB;0NAGA;8FACpC;6FAED;uMAEiD;kIACjB;sGAG3B;mGACH;IAG1B;;AACF","file":"zcl_abapgit_gui_page_tutorial.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_picklist.clas.mjs":{"lineLengths":[89,53,37,66,32,52,126,227,213,223,218,153,144,182,182,164,231,180,142,145,270,150,244,212,893,160,147,194,193,149,191,326,370,17,12,42,22,130,137,147,142,77,68,106,106,88,155,104,66,69,52,62,3,29,123,58,65,55,103,70,102,68,64,127,87,76,154,88,154,31,63,87,79,70,48,36,26,32,97,135,5,95,100,53,111,16,3,27,129,155,77,77,64,68,72,105,88,70,35,48,62,103,110,33,73,176,7,134,5,378,19,3,26,64,35,20,3,32,50,70,154,39,77,89,68,28,108,5,3,14,65,26,17,3,24,99,34,18,3,22,99,32,18,3,24,118,67,82,12,80,5,20,3,23,133,65,55,26,23,17,3,28,133,103,70,101,36,23,17,3,25,99,34,18,3,55,363,134,64,143,47,67,200,52,52,62,91,113,79,169,98,14,54,64,7,5,22,3,53,68,32,20,3,45,123,195,35,19,3,1,68,210,56,60,89,51,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_gui_picklist.clas.abap"],"names":[],"mappings":";;;AAyFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;;;;;IAEE,IAAc,UAA4B;8BAErB;;IAIrB,gFAA6B;IAC7B,gCAAgB,8BAAW,UAAQ;IAEnC,sBAAe,4BAAU,cAAc;IACvC,0BAAmB,gBAAgB;IACnC,oBAAa,UAAU;IACvB,eAAa,KAAK;IAClB,kBAAa,QAAQ;IAErB,yBAAG,sBAA8B,yBAAI,kBAAuB;sIACM;IAClE;;;IAIA,kBAAU,6BAAkB;IAC5B,uBAAe,kFAA8C;IAE/D;;EAGA;;IAEE,IAAc,WAAwB;IACtC,IAAc,UAAiB;IAC/B,IAAc,UAAiB;QAC1B,uDAAe;QACf,2DAAoB;IAEzB,aAAU,qDAAgC;wGAIhB;IAE1B,iFAA8B;;;MAE5B,aAAW,eAAE,MAAC,MAAK;MAEnB,yBAAG,4BAA2B;QAC5B,4FAA+D;QAC/D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACnB,aAAW,UAAQ;MACrB,gCAAO,gCAAyB;QAC9B,cAAW,wJAEuB;MACpC;qIAI6B;IAE/B;yXAQ8B;IAEhC;;EAGA;;IACE,aAAW,gBAAW;IACxB;;EAGA;;;IAEE,IAAc,UAA4B;IAE1C,sBAAM,WAAW;IAEjB,iBAAe,GAAZ,kBAAc,gCAAC;MAChB,gFAA6B;MAC7B;0BAAsD;MACtD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IACrB;EAEF;EAGA;;IACE,UAAQ,UAAK;IACf;;EAGA;;IACE,WAAS,iBAAY;IACvB;;EAGA;;IACE,WAAS,eAAU;IACrB;;EAGA;;IACE,iBAAc,GAAX,iBAAa,uBAAS;MACvB,aAAW,gCAAiB,aAAa,MAAC,UAAS;IACrD;MACE,aAAW,gCAAiB,aAAa,MAAC,QAAO;IACnD;IACF;;EAGA;;;;IACE,eAAQ,KAAK;IACb,UAAQ,OAAE;IACZ;;EAGA;;;;;IACE,oBAAa,UAAU;IACvB,UAAQ,OAAE;IACZ;;EAGA;;IACE,WAAS,iBAAY;IACvB;;EAGA;;;;IAEE,uBAAe,kHAAiD;8CACrC;IAE3B,IACE,OAKA,KANG,QAAQ,OAAE,+BAAf;;MAGI,sBAAe,sBAAS;MACxB,sBAAe,sBAAS;MACxB,UAAU,MAAC,YAAQ,0BAAe;;MAElC,sBAAc,mFAAiC;MAC/C,iBAAe,GAAZ,kBAAc,gCAAC;wKAG0B;QAC1C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;MAC7D;QACE,sBAAe,sBAAS;QACxB,UAAU,MAAC,YAAQ,0BAAe;MACpC;;IAGN;;EAGA;;IACE,aAAW,aAAQ;IACrB;;EAGA;;IAEE,aAAU,gLAEiC;kCACvB;IAEtB;;AACF","file":"zcl_abapgit_gui_picklist.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_router.clas.mjs":{"lineLengths":[53,35,30,32,50,68,25,657,643,629,306,631,634,634,631,638,412,600,828,204,200,138,338,334,235,17,42,22,3,29,64,16,3,41,363,134,64,167,97,95,5,22,3,29,44,55,207,3,27,363,134,64,391,132,71,67,125,62,153,95,135,62,115,95,5,22,3,30,55,3,37,102,70,69,61,67,70,152,102,31,48,210,91,241,109,3,37,363,134,64,101,111,94,119,568,137,67,125,151,61,125,97,14,60,97,7,130,90,95,137,97,95,136,97,88,145,97,88,142,96,95,260,82,106,133,83,84,143,148,160,90,150,119,84,136,96,95,138,81,98,135,81,98,134,82,98,133,81,98,132,140,98,137,218,96,5,22,3,30,143,134,64,508,599,137,101,137,150,158,160,160,144,25,19,3,31,143,134,64,147,79,133,101,67,145,162,112,130,137,139,113,9,160,17,106,24,151,14,16,7,5,192,143,117,146,5,139,128,114,117,14,44,7,5,40,53,193,33,5,19,3,31,64,134,64,148,81,12,92,5,20,3,35,64,134,64,150,91,12,92,5,20,3,29,363,134,64,101,123,137,49,136,5,67,126,76,96,142,85,96,142,85,96,142,85,96,141,115,95,139,110,95,139,82,80,96,139,82,96,5,22,3,39,64,3,46,100,76,71,112,183,71,11,115,157,19,108,193,142,98,16,18,9,7,12,189,138,94,5,3,34,59,3,41,101,73,186,135,90,3,28,53,3,35,71,73,71,73,71,73,71,73,71,73,67,61,73,79,121,597,601,130,70,106,144,184,184,188,188,83,34,5,89,9,91,110,140,78,93,131,14,189,7,109,17,106,24,111,29,14,16,7,5,3,21,143,348,128,59,83,12,82,5,19,3,32,363,134,64,4,75,264,67,129,74,98,134,154,78,161,170,98,142,158,78,161,166,98,5,22,3,36,363,134,64,101,119,120,137,49,160,5,67,133,97,95,154,97,96,137,80,96,142,124,95,144,127,95,135,78,97,105,136,79,97,105,146,89,96,139,97,95,147,96,96,140,88,96,149,103,96,138,115,88,144,115,88,145,115,88,140,115,88,135,115,88,133,50,78,98,5,22,3,32,363,134,64,67,122,994,98,139,243,98,134,232,98,128,162,98,5,22,3,55,363,134,64,138,55,78,5,55,77,5,55,70,5,55,70,5,55,68,5,55,82,5,55,73,5,55,73,5,55,98,5,22,3,29,363,134,64,101,119,67,97,51,69,102,75,110,94,568,201,95,100,137,67,250,160,167,335,168,14,200,44,102,28,9,77,119,118,13,251,45,21,26,48,79,86,65,17,20,24,13,11,94,158,11,9,123,82,82,66,100,73,159,99,16,102,9,137,162,144,119,100,147,150,162,55,92,152,180,55,119,100,138,99,97,140,63,100,137,99,97,7,24,5,3,66,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/routing/zcl_abapgit_gui_router.clas.abap"],"names":[],"mappings":";;AAoIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;IAEE,iBAAuB,GAApB,QAAQ,OAAE,iCAAY,wCAAyB,gCAAQ,MAAC,cAAY;MACrE,UAAU,MAAC,WAAQ,8DAAyC;MAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;IAC5D;IAEF;;EAGA;;;8MAEyF;EAEzF;EAGA;;;;QAEO,8XAAkD;QAClD,2HAA2C;IAEhD,cAAW,mDAAkB;IAC7B,IACE,OAMA,KAPG,QAAQ,OAAE,+BAAf;;6DAE0D;MACtD,UAAU,MAAC,WAAQ,sHAES;MAC5B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;6DAEJ;MACtD,UAAU,MAAC,WAAQ,gFAAkD;MACrE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;IAGhE;;EAGA;;;;;;;;QAGI,0DAAsB;QACtB,6DAAsB;QACtB,+IAAoD;QACpD,6FAAwB;IAE1B,eAAa,UAAU;IACvB;IACA,sCAAY,YAAW,sCAAI,eAAE,MAAC,QAAM,sCAAI,eAAE,MAAC,iBAAW,UAAU;IAEhE,gBAAa,qEAAgD;IAE7D,aAAU,8NAG0B;4GAIf;EAEvB;EAGA;;;;QAEQ,4FAA6D;QAC7D,sGAA6D;QAC7D,qFAA8D;QAC9D,8GAAgD;QAChD,+iBAAkE;IAExE,YAAS,uHAAgC;IAEzC,IACE,OAUA,AAGA,AAGA,AAGA,AAGA,AAGA,AAIA,AAGA,AAaA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,KAhEG,QAAQ,OAAE,+BAAf;;MAEI,sBAAmB,yHAA+D;MAElF,yBAAG,2BAA+B;QAChC,UAAU,MAAC,WAAQ,wFAA0D;QAC7E,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;MAC5D;QACE,UAAU,MAAC,WAAO,uBAAY;QAC9B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;MAC5D;;MAEA,UAAU,MAAC,WAAQ,uDAAkC;MACrD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAE1D,UAAU,MAAC,WAAQ,8DAAyC;MAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAE1D,UAAU,MAAC,WAAQ,8DAAyC;MAC5D,UAAU,MAAC,YAAQ,oDAA8B;;MAEjD,UAAU,MAAC,WAAQ,8DAAyC;MAC5D,UAAU,MAAC,YAAQ,oDAA8B;;MAEjD,UAAU,MAAC,WAAQ,6DAAwC;MAC3D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAG1D,UAAU,MAAC,WAAQ,+CAAyB;MAC5C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,oBAAmB;;MAErE,UAAU,MAAC,WAAQ,gDAA0B;MAC7C,UAAU,MAAC,YAAQ,gDAA0B;;MAG7C,iBAAc,2HAAuE;iCAErF,UAAW,mHAAoD;;qJAII;MAEnE,UAAU,MAAC,WAAO,oFACqD;MACvE,UAAU,MAAC,YAAQ,gDAA0B;;MAE7C,UAAU,MAAC,WAAQ,6DAAwC;MAC3D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;gFAEJ;MACtD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;gFAEP;MACtD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;iFAEN;MACvD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;gFAEP;MACtD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;2IAEQ;MACrE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;yNAIb;MAChD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAGjE;;EAGA;;;;QAEQ,mfAAmD;QACnD,8kBAA+C;QAC/C,gIAA+C;QAC/C,4FAAmD;IAEzD,YAAqB,uHAAgC;IACrD,OAAO,MAAC,WAAa,wHAAiC;IACtD,OAAO,MAAC,eAAa,4HAAqC;IAC1D,SAAS,MAAC,eAAW,4HAAqC;IAC1D,SAAS,MAAC,eAAW,4HAAqC;;IAQ1D,YAAU,OAAO;IAEnB;;EAGA;;;;;;QAEQ,4HAA0D;QAC1D,4FAAgE;QAChE,0DAAkC;QAClC,wIAA6D;QAC7D,yJAAiE;QACjE,uGAAkE;QAClE,yHAAwD;IAE9D,YAAW,uHAAgC;IAC3C,aAAW,wHAAiC;IAE5C,kBAAgB,wCAAyB,oCAAY,MAAC,OAAM;IAE5D;iCACI,UAAW,mHAAoD;;;;;;;;IAGnE;IAEA,iBAAmC,IAAhC,oEAAmC,4CAA6B,wCAAY,MAAC,MAAI;8IACL;IAC/E,iCAAO,6EAA8C;iJAC6B;IAClF;IAEA,2BAAG,kEAA+B,uCAA2C;;MAK3E,iBAAoD,IAAjD,6DAAmD,uBAAS;QAC7D,kBAAgB,wCAAyB,oCAAY,MAAC,OAAM;MAC9D;QACE,YAAU,sBAAsB;MAClC;IACF;IAEA,yBAAG,QAAkB;oDAEA;;MASnB,YAAU,aAAa;IACzB;IAEF;;EAGA;;;;IAGE,iBAAkC,GAA/B,QAAQ,OAAE,4CAAwB,8DAA2B;MAC9D,aAAW,gCAAiB,aAAa,MAAC,SAAQ;IACpD;MACE,aAAW,gCAAiB,aAAa,MAAC,oBAAmB;IAC/D;IAEF;;EAGA;;;;IAGE,iBAAkC,GAA/B,QAAQ,OAAE,4CAAwB,gEAA6B;MAChE,aAAW,gCAAiB,aAAa,MAAC,mBAAkB;IAC9D;MACE,aAAW,gCAAiB,aAAa,MAAC,oBAAmB;IAC/D;IAEF;;EAGA;;;;QAEO,4FAAgD;QAChD,kHAAoC;IAEzC,YAAS,uHAAgC;IAEzC,yBAAG,iBAAqB;MACtB,aAAU,mHAAoD;IAChE;IAEA,IACE,OAGA,AAGA,AAGA,AAGA,AAGA,AAGA,AAIA,KAvBG,QAAQ,OAAE,+BAAf;;2EAE4C;MACxC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;oFAEV;MACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;oFAEV;MACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;oFAEV;MACjD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAE3D,UAAU,MAAC,WAAQ,gFAAiD;MACpE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAE1D,UAAU,MAAC,WAAQ,2EAA4C;MAC/D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;iFAEZ;+EACF;MAC5C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;iFAEb;MAC9C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;IAGjE;;EAGA;;;;;;QAGI,8DAA+B;QAC/B,uGAAkC;IAEpC,yBAAsB,wJAA8E;IACpG,iBAAuB,GAApB,qBAAsB,uBAAS;MAChC;QACI,iBAAc,wFAAoD;4JACoB;;;;;;;;;MAM1F;IACF;;;;IAIA;EAEF;EAGA;;;;;;;;;EAQA;EAGA;;;;;;;;;;;;;;;;;;;QAGI,4kBAAoD;QACpD,glBAAoD;QACpD,yHAAgD;QAChD,6DAAqB;QACrB,iGAA6B;QAC7B,uIAAkD;IAEpD,OAAO,MAAC,eAAW,sJAAkD;IACrE,OAAO,MAAC,eAAW,sJAAkD;IACrE,WAAW,MAAC,eAAW,sJAAkD;IACzE,WAAW,MAAC,eAAW,sJAAkD;IAEzE,iBAAW,GAAR,SAAW,+CAAY;MACxB,mBAAiB,OAAO;IAC1B;IACA,kBAAgB,wCAAO,wBAAP,CAAqC;IAErD;MACI,oBAAiB,+DAA0C;6GAGhB;MAE3C,iBAAoB,GAAjB,OAAO,MAAC,WAAW,wCAAyB,mCAAW,MAAC,MAAI;6EACtB;MACzC,gCAAO,eAA0B,yBAAG,YAAsB;kIAIvB;MACnC;4LAMoC;MACpC;4GAE0C;;;;;;;;;IAI9C;EAEF;EAGA;;QAEO,mVAAwD;IAI7D,sBAAmB,oGAA8C;IACjE,yBAAG,2BAA+B;MAChC,aAAU,8DAAyC;IACrD;MACE,aAAU,6DAAwC;IACpD;IAEF;;EAGA;;;;;QAEO,kEAA2B;QAC3B,+PAA8C;IAEnD,IACE,OAGA,AAMA,KAVG,QAAQ,OAAE,+BAAf;;yEAEmD;MAC/C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;MAE7D,qBAAkB,6HAAsC;MACxD,gCAAO,yBAAmB,YAAY;gKAC4C;MAClF,iKAA0D;MAC1D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;MAE7D,qBAAkB,iIAA0C;MAC5D,gCAAO,yBAAmB,YAAY;gKAC4C;MAClF,6JAAsD;MACtD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;IAGnE;;EAGA;;;;QAGI,4FAAiD;QACjD,8GAAoC;QACpC,+GAAmC;IAErC,YAAS,uHAAgC;IACzC,yBAAG,iBAAqB;iCACtB,UAAW,mHAAoD;IACjE;IAEA,IACE,OAGA,AAGA,AAGA,AAKA,AAKA,AAIA,AAIA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,AAGA,KA1DG,QAAQ,OAAE,+BAAf;;MAEI,UAAU,MAAC,WAAQ,8DAAyC;MAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;gGAEG;MAC7D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;+EAEf;MAC5C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;;MAK3D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;;MAK1D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;6EAEhB;MAC1C,UAAU,MAAC,WAAQ,8DAAyC;MAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,mBAAkB;;8EAEzB;MAC3C,UAAU,MAAC,WAAQ,8DAAyC;MAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,mBAAkB;;wFAEf;MACrD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAE3D,UAAU,MAAC,WAAQ,8DAAyC;MAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;+FAEE;MAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;uFAEP;MACpD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;sGAEH;MACxD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;MAE3D,UAAU,MAAC,WAAQ,gFAAiD;MACpE,UAAU,MAAC,YAAQ,oDAA8B;;MAEjD,UAAU,MAAC,WAAQ,gFAAiD;MACpE,UAAU,MAAC,YAAQ,oDAA8B;;MAEjD,UAAU,MAAC,WAAQ,gFAAiD;MACpE,UAAU,MAAC,YAAQ,oDAA8B;;MAEjD,UAAU,MAAC,WAAQ,gFAAiD;MACpE,UAAU,MAAC,YAAQ,oDAA8B;;MAEjD,UAAU,MAAC,WAAQ,gFAAiD;MACpE,UAAU,MAAC,YAAQ,oDAA8B;;MAEjD,YAAS,8BAAmB;6EACc;MAC1C,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;IAGnE;;EAGA;;;;IAEE,IACE,OAYA,AAIA,AAIA,KArBG,QAAQ,OAAE,+BAAf;;i+BAS+D;MAE3D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;kPAGS;MACtE,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;uOAGD;MAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;iKAGb;MAChD,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;IAInE;;EAGA;;;;IAEE,gBAAa,oHAAuD;IAEpE,yBAAG,UAAU,MAAC,OAAgB;MAC5B,gBAAa,sDAAgC;IAC/C;IACA,yBAAG,UAAU,MAAC,OAAgB;MAC5B,gBAAa,qDAA+B;IAC9C;IACA,yBAAG,UAAU,MAAC,OAAgB;MAC5B,gBAAa,8CAAwB;IACvC;IACA,yBAAG,UAAU,MAAC,OAAgB;MAC5B,gBAAa,8CAAwB;IACvC;IACA,yBAAG,UAAU,MAAC,OAAgB;MAC5B,gBAAa,4CAAsB;IACrC;IACA,yBAAG,UAAU,MAAC,OAAgB;MAC5B,gBAAa,0DAAoC;IACnD;IACA,yBAAG,UAAU,MAAC,OAAgB;MAC5B,gBAAa,iDAA2B;IAC1C;IACA,yBAAG,UAAU,MAAC,OAAgB;MAC5B,gBAAa,iDAA2B;IAC1C;IAEA,yBAAG,UAAU,MAAC,OAAgB;MAC5B,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;IAC/D;IAEF;;EAGA;;;;QAEQ,4FAA6D;QAC7D,8GAAgD;QAChD,0DAA+B;QAC/B,wFAAgC;QAChC,0CAAqC;QACrC,4DAAgC;QAChC,6FAAiE;QACjE,kEAA+B;QAC/B,qGAAsF;QACtF,qFAA8D;QAC9D,+iBAAkE;;;;IAQxE,YAAS,uHAAgC;IAEzC,IACE,OAoDA,AAMA,AAcA,AAGA,AAGA,KA/EG,QAAQ,OAAE,+BAAf;;iCAII,UAAW,mHAAoD;MAE/D,iBAAuB,GAApB,QAAQ,OAAE,iCAAY,wCAAyB,gCAAQ,MAAC,YAAU;QACnE,aAAU,wTAGuB;QACjC,aAAU,iJAAwE;MACpF;QACE,aAAU,iLAA4E;QAEtF,yBAAG,QAAkB;UACnB,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;UAC7D;QACF;QAEA,gBAAwB,mDAAuB;QAC/C,qBAAwB,wFAAgD;QACxE,wBAAwB,kEAA+B,kBAAkB;;;;;;;;;;;;;;;UAczE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6JACgD;UAChE;QACF;0HAE6D;iFACjB;QAE5C,IACE,OAEA,KAHG,QAAQ,OAAE,0CAAf;;UAEI,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,UAAS;;UAE3D,UAAU,MAAC,WAAQ,wHAA6D;UAChF,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;UAE1D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;;mCAGjE,UAAW,mHAAoD;QAC/D,aAAU,yHAA4D;sHAEjC;QACrC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;QAG7D,iBAAc,2HAAuE;mCACrF,UAAW,mHAAoD;sDAC5C;;uJAGgD;QAEnE,aAAU,6JAAgG;sDACvF;sHAEkB;QACrC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;QAE7D,UAAU,MAAC,WAAQ,8DAAyC;QAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;8DAExB;QAClC,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,YAAW;;QAE7D,UAAU,MAAC,WAAQ,8DAAyC;QAC5D,UAAU,MAAC,WAAQ,gCAAiB,aAAa,MAAC,SAAQ;;MAGhE;;EACF","file":"zcl_abapgit_gui_router.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_utils.clas.mjs":{"lineLengths":[53,34,29,32,49,37,25,344,330,17,42,22,3,29,64,16,3,33,57,3,40,99,92,58,158,9,59,41,17,106,44,14,16,7,5,18,3,30,54,3,37,99,92,58,149,9,56,41,17,106,44,14,16,7,5,18,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_utils.clas.abap"],"names":[],"mappings":";;AAwBA;;;;;;;;;;;;;;;EAGE;;;;;;;QACO,qJAA0D;IAC/D;iCACI,kBAAoB,MAAM;MAC1B,WAAS,sBAAS;;;;;;;IAGtB;IACF;;EAGA;;;;;;;QACO,4IAAoD;IACzD;iCACI,eAAiB,MAAM;MACvB,WAAS,sBAAS;;;;;;;IAGtB;IACF;;AACF","file":"zcl_abapgit_gui_utils.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_hash.clas.mjs":{"lineLengths":[53,29,24,32,44,37,25,273,444,307,305,304,305,304,306,17,42,22,3,29,64,16,3,24,43,3,31,54,72,70,64,24,64,29,64,60,16,60,16,47,48,48,51,59,68,65,53,102,93,46,44,52,52,7,5,50,48,48,19,20,19,20,76,30,23,3,21,40,3,28,105,104,61,69,61,62,53,69,72,53,26,57,116,111,30,113,30,85,62,19,3,26,45,3,33,105,69,61,155,19,3,28,47,3,35,105,69,61,157,19,3,25,44,3,32,105,69,61,67,68,132,9,124,17,108,24,93,14,16,7,5,25,48,19,3,28,47,3,35,105,67,61,67,68,132,9,125,17,108,24,93,14,16,7,5,25,48,19,3,25,44,3,32,105,69,61,154,19,3,26,45,3,33,105,69,61,155,19,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_hash.clas.abap"],"names":[],"mappings":";;AAmEA;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEa,uDAA2B,CAAA;;QAC3B,uDAAgC,CAAA;;QAErC,uDAAe;QACf,mDAAuB,CAAA;;QACvB,mDAAuB,CAAA;;QACvB,sCAAwB;QACxB,uCAAwB;QACxB,uCAAwB;QACxB,0CAAwB;;;;;MAI5B,aAAoB,qBAAT,eAAE,MAAC,OAAQ,gCAAC;MAEvB,SAAY,mBAAL,KAAO,oDAAsB;MACpC,SAAY,mBAAL,KAAO,KAAI;MAMlB,iBAAQ,GAAL,MAAO,SAAQ;QAChB,SAAY,mBAAL,KAAS,SAAQ;QACxB,SAAY,mBAAL,KAAS,SAAQ;MAC1B;IACF;;IAEA,SAAY,mBAAL,KAAS,SAAQ;IACxB,SAAY,mBAAL,KAAS,SAAQ;IAExB,SAAO,IAAI;IACX,UAAQ,IAAI;IAEZ,SAAO,IAAI;IACX,UAAQ,IAAI;IAEZ,sCAAY,OAAM,gBAAW,QAAQ;IAErC,gBAAc,QAAQ;IAExB;;EAGA;;;;;;;;;QAEQ,qDAAiB;QACjB,4CAA2B;QAC3B,4DAAsB;QACtB,+DAAuB;IAG7B,WAAS,2BAAS,SAAS;IAC3B,cAAY,MAAM;IAClB,yBAAS,SAAS;IAClB,sCAAY,SAAQ,oBAAe,SAA4B;IAC/D,gBAAa,yFAAwD;IAErE,cAAY,UAAU;IACtB,sCAAY,WAAU,gDAAU,SAAS;IACzC,eAAa,SAAS;IAEtB,sCAAY,YAAW,kBAAa,UAAuB;IAE3D,aAAU,2CAAsB;IAElC;;EAGA;;;;;;;IACE,aAAU,wIACyB;IACrC;;EAGA;;;;;;;IACE,aAAU,0IACyB;IACrC;;EAGA;;;;;;;QAEQ,0DAAoB;QACpB,2DAAqB;QACrB,2HAA2C;IACjD;2HAM6B;;;;;;;;IAG7B;IAEA,YAAU,OAAO;IACjB;IAEF;;EAGA;;;;;;;QAEQ,0DAAoB;QACpB,2DAAqB;QACrB,2HAA2C;IACjD;4HAM6B;;;;;;;;IAG7B;IAEA,YAAU,OAAO;IACjB;IAEF;;EAGA;;;;;;;IACE,aAAU,uIACyB;IACrC;;EAGA;;;;;;;IACE,aAAU,wIACyB;IACrC;;AACF","file":"zcl_abapgit_hash.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_form.clas.mjs":{"lineLengths":[89,53,34,63,32,49,86,2946,646,147,149,165,402,633,3336,3615,3619,3619,3616,3789,644,3617,395,656,498,1581,1207,965,475,797,389,472,533,478,302,2941,17,12,42,22,2849,570,71,73,107,115,119,3,29,64,16,3,25,129,46,61,45,58,45,58,2562,117,37,39,37,71,25,19,3,23,129,46,61,46,61,104,73,104,2593,382,63,59,86,61,31,106,154,40,40,46,84,25,19,3,24,129,46,61,47,64,67,73,163,385,128,37,39,43,71,25,19,3,23,47,3,30,129,48,67,50,73,94,84,45,49,57,46,106,5,19,3,22,2848,34,21,3,23,129,45,58,2562,115,37,71,25,19,3,23,129,46,61,45,58,45,58,104,73,104,104,73,104,62,58,108,62,58,108,2562,115,37,39,45,35,35,37,45,71,25,19,3,23,129,46,61,46,61,2593,382,63,59,86,61,31,106,154,40,40,84,25,19,3,22,129,46,61,45,58,54,85,45,58,104,73,104,47,64,2562,114,37,39,55,37,40,45,71,25,19,3,23,123,51,76,132,133,67,141,91,2594,417,67,70,74,72,66,105,58,103,5,337,35,128,12,5,79,152,190,337,35,307,12,5,45,26,73,37,32,147,100,9,25,7,145,117,101,107,9,70,115,16,59,9,50,163,198,98,17,7,162,48,5,50,97,57,105,7,5,94,118,60,110,415,5,75,35,72,5,95,95,97,96,35,19,3,31,123,61,385,58,42,120,171,129,318,128,238,133,181,12,112,5,3,29,123,61,133,67,141,91,2562,64,105,76,751,73,88,136,131,5,60,98,64,133,127,7,5,75,82,5,62,130,117,5,69,144,137,5,75,79,5,64,82,5,49,62,134,5,243,102,5,134,105,5,56,107,5,135,40,239,93,133,97,133,97,130,94,130,116,131,95,12,112,5,99,3,38,123,61,2562,64,751,61,70,62,80,5,150,66,5,415,253,3,36,123,61,2562,64,751,61,275,3,35,123,61,2562,64,751,61,70,69,72,70,411,199,62,80,5,119,82,35,127,40,173,68,7,40,65,341,7,155,77,103,7,497,201,77,104,7,5,100,3,35,123,61,2562,64,751,61,133,67,68,71,63,70,415,253,62,80,5,230,68,231,99,96,84,41,40,73,131,101,9,193,7,97,100,99,61,38,67,55,49,98,86,43,197,156,45,87,70,11,298,9,99,7,52,100,100,12,250,5,192,317,3,34,123,61,2562,64,751,61,67,72,72,303,62,80,5,69,126,5,134,61,82,63,12,59,5,79,113,5,157,113,5,699,69,102,128,319,102,5,3,38,123,61,2562,64,751,61,67,67,67,303,62,80,5,80,106,69,258,5,80,106,5,446,148,91,66,3,28,129,46,61,45,58,45,58,2562,120,39,37,37,71,25,19,3,22,129,46,61,45,58,45,58,2562,114,37,39,37,71,25,19,3,21,129,46,61,45,58,45,58,104,73,104,106,79,108,104,73,104,104,73,104,104,73,52,79,52,79,62,58,108,62,58,108,2562,113,37,39,49,45,35,35,45,45,37,45,51,108,86,53,350,5,71,25,19,3,25,129,46,61,45,58,45,58,104,73,104,104,73,104,52,79,63,61,63,61,106,79,108,2562,117,37,39,45,37,45,51,37,37,49,71,25,19,3,54,884,568,421,125,74,149,152,27,125,88,73,69,78,89,5,74,146,149,27,122,88,73,69,75,89,5,29,3,1,62,102,63,339,74,79,73,75,569,75,76,79,82,77,79,76,77,765,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_html_form.clas.abap"],"names":[],"mappings":";;;AA+LA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;QAEO,y/EAA+B;IAEpC,QAAQ,MAAC,UAAQ,sCAAuB,kCAAY,MAAC,SAAQ;IAC7D,QAAQ,MAAC,UAAQ,OAAO;IACxB,QAAQ,MAAC,WAAQ,QAAQ;IACzB,QAAQ,MAAC,UAAQ,OAAO;IAExB,gCAAO,kBAAY,cAAS;IAE5B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;IAEE,IAAc,WAAgC;QACzC,qXAAyC;QACzC,sDAAc;IAEnB,YAAU,yBAAO,gBAAW;IAC5B,oCAAe,GAAR,SAAU,gCAAC;IAElB;6BAAsD;IACtD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IACnB,oCAAsB,GAAf,WAAS,MAAC,OAAO,sCAAuB,kCAAY,MAAC,OAAK;IAEjE,SAAS,MAAC,WAAW,QAAQ;IAC7B,SAAS,MAAC,WAAW,QAAQ;IAC7B,SAAS,MAAC,cAAW,WAAW;IAEhC,gCAAO,mBAAa,WAAS,MAAC,SAAQ;IAEtC,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;QAEO,wXAA+B;IAEpC,4CAAO,aAAoB,iCAAM,gCAAC;IAElC,MAAM,MAAC,WAAW,QAAQ;IAC1B,MAAM,MAAC,YAAW,SAAS;IAC3B,MAAM,MAAC,cAAW,WAAW;IAE7B,gCAAO,gBAAU,gBAAW;IAE5B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;QAEO,qFAAqB;;IAG1B,OAAO,OAAE,eAAa,UAAU;IAChC,OAAO,OAAE,iBAAe,YAAY;IAEpC,yBAAG,OAAO,OAAE,WAAqB;MAC/B,sCAA0B;MAC1B,OAAO,OAAE,oFAA6B;IACxC;IAEF;;EAGA;;IACE,cAAY,cAAS;IACvB;;EAGA;;;;QAEO,y/EAA+B;IAEpC,QAAQ,MAAC,UAAQ,sCAAuB,kCAAY,MAAC,OAAM;IAC3D,QAAQ,MAAC,UAAQ,OAAO;IACxB,gCAAO,kBAAY,cAAS;IAE5B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;;;;;;;;;;;;QAEO,y/EAA+B;IAEpC,QAAQ,MAAC,UAAW,sCAAuB,kCAAY,MAAC,OAAM;IAC9D,QAAQ,MAAC,UAAW,OAAO;IAC3B,QAAQ,MAAC,WAAW,QAAQ;IAC5B,QAAQ,MAAC,cAAW,WAAW;IAC/B,QAAQ,MAAC,SAAW,MAAM;IAC1B,QAAQ,MAAC,SAAW,MAAM;IAC1B,QAAQ,MAAC,UAAW,OAAO;IAC3B,QAAQ,MAAC,cAAW,WAAW;IAE/B,gCAAO,kBAAY,cAAS;IAE5B,YAAU,OAAE;IAEd;;EAGA;;;;;;IAEE,IAAc,WAAgC;QACzC,qXAAyC;QACzC,sDAAc;IAEnB,YAAU,yBAAO,gBAAW;IAC5B,oCAAe,GAAR,SAAU,gCAAC;IAElB;6BAAsD;IACtD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IACnB,oCAAsB,GAAf,WAAS,MAAC,OAAO,sCAAuB,kCAAY,MAAC,OAAK;IAEjE,SAAS,MAAC,WAAQ,QAAQ;IAC1B,SAAS,MAAC,WAAQ,QAAQ;IAE1B,gCAAO,mBAAa,WAAS,MAAC,SAAQ;IAEtC,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;;;;;;;QAEO,y/EAA+B;IAEpC,QAAQ,MAAC,UAAQ,sCAAuB,kCAAY,MAAC,MAAK;IAC1D,QAAQ,MAAC,UAAQ,OAAO;IACxB,QAAQ,MAAC,WAAQ,QAAQ;IACzB,QAAQ,MAAC,mBAAgB,gBAAgB;IACzC,QAAQ,MAAC,UAAQ,OAAO;IACxB,QAAQ,MAAC,WAAQ,SAAS;IAG1B,QAAQ,MAAC,cAAW,WAAW;IAE/B,gCAAO,kBAAY,cAAS;IAE5B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;IAEE,IAAc,YAAiC;IAC/C,IAAc,UAAiC;QAC1C,0DAAmB;QACnB,6DAAsB;QACtB,iEAA0B;QAC1B,+DAAwB;QACxB,yDAAkB;QAClB,gGAA2B;IAEhC,yBAAG,0BAAyB;MAC1B,+FAAmC;IACrC;;;MAEE,wHAAyD;MACzD;IACF;;uJAIwD;6LACc;;;kTAKP;MAC7D;IACF;IAEA,iBAAe,sBAAS;;;;;QAGpB,iBAAmB,GAAhB,YAAU,MAAC,OAAQ,sCAAuB,kCAAY,MAAC,aAAW;mGAC7C;QACxB;;;MAGF,iBAAmB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,aAAW;QAClE,yBAAG,uBAA4B,iBAAiB,GAAb,cAAgB,YAAU,MAAC,MAAI;oGACzC;0GACM;QAC/B;QACA,yBAAG,YAAU,MAAC,gBAAmB;UAC/B,uGAAwC;QAC1C;UACE,YAAU,mCAAE;QACd;QACA,iBAAe,YAAU,MAAC,KAAI;kKACyB;qMACW;iGAC5C;QACtB;MACF;iKAOoC;MAEpC,iBAAe,uBAAU;IAQ3B;;gGAL2B;MACvB,yBAAG,uBAA2B;wGACC;MAC/B;;6FAIkB;qHACwB;IAE9C,yBAAG,4BAA2B;MAC5B,WAAS,qBAAQ,KAAS,mBACT,QAAS,+BAAgB,OAAO;8ZAK5B;IACvB;;;uEAKwB;IACxB;8FAEuB;8FACA;gGACE;+FACD;kCAEJ;IAEtB;;EAGA;;;;;IAEE,IACE,OAOA,AAKA,AAIA,KAjBG,MAAM,MAAC,SAAZ;;0KAMoC;;6TAKoC;;6OAIoC;;oLAI3B;;MAG7E,oCAAS,GAAF,iCAAI,gCAAC;;EAIlB;EAGA;;;;;;;;;;;QAGI,suBAA0B;QAC1B,gEAAyB;IAG3B,OAAO,MAAC,YAAQ,yDAA+B;IAE/C,iBAAiB,GAAd,QAAQ,MAAC,OAAQ,sCAAuB,kCAAY,MAAC,UAAQ;MAC9D,OAAO,MAAC,WAAQ,qBAAQ,KAAS,OAAO,MAAC,QACjB,QAAS,+BAAgB,aAAa;IAChE;IAEA,yBAAG,4BAA0B;MAC3B,OAAO,MAAC,YAAQ,iEAAuC;MACvD,yBAAG,OAAO,MAAC,iBAAoB;QAC7B,OAAO,MAAC,WAAQ,qBAAQ,KAAS,OAAO,MAAC,QACjB,QAAS,+BAAgB,aAAa;QAC9D,OAAO,MAAC,wGAA0C;MACpD;IACF;IAGA,iBAAqB,GAAlB,QAAQ,MAAC,WAAW,uBAAS;MAC9B,OAAO,MAAC,cAAW,+CAAa;IAClC;IAEA,yBAAG,QAAQ,MAAC,gBAAmB;MAC7B,OAAO,MAAC,UAAO,qBAAQ,KAAS,QAAQ,MAAC,OAClB,QAAS,+BAAgB,aAAa;MAC7D,OAAO,MAAC,gGAAkC;IAC5C;IAEA,yBAAG,QAAQ,MAAC,uBAA0B;MACpC,OAAO,MAAC,iBAAc,qBAAQ,KAAS,QAAQ,MAAC,cAClB,QAAS,+BAAgB,aAAa;MACpE,OAAO,MAAC,oHAAsD;IAChE;IAEA,iBAAqB,GAAlB,QAAQ,MAAC,WAAW,uBAAS;MAC9B,OAAO,MAAC,cAAW,4CAAW;IAChC;IAEA,iBAAgB,GAAb,cAAe,uBAAS;MACzB,OAAO,MAAC,eAAY,8CAAY;IAClC;IAGA,kBAAgB,QAAQ,MAAC,WAAU;IACnC,yBAAG,OAAO,MAAC,iBAAoB;MAC7B,kBAAgB,kDAAU,cAAiB,4CAAU;IACvD;IACA,iBAAiB,GAAd,QAAQ,MAAC,OAAO,sCAAuB,kCAAY,MAAC,MAAK,yBAAI,QAAQ,MAAC,MAAY,iCAAM,iCAAE;MAE3F,wCAAgB,cAAiB,wCAAM;IACzC;IACA,iBAAiB,GAAd,QAAQ,MAAC,OAAO,sCAAuB,kCAAY,MAAC,QAAM;MAC3D,wCAAgB,cAAiB,2CAAS;IAC5C;IACA,yBAAG,wBAA4B;MAC7B,mGAA4C;IAC9C;sIAGuC;IAEvC,IACE,OAOA,AAOA,AAOA,AAOA,AAQA,KArCG,QAAQ,MAAC,KAAd;;4FAM0B;;gGAOA;;gGAOA;;6FAOA;;mHAQG;;8FAOH;;MAGtB,oCAAS,GAAF,iCAAI,gCAAC;;kGAGO;EAEzB;EAGA;;;;;;;QAEO,6DAAsB;IAE3B,yBAAG,OAAO,MAAC,iBAAoB;+EACA;IAC/B;IAEA,iBAAiB,GAAd,OAAO,MAAC,QAAQ,uBAAU,iBAAiB,GAAd,OAAO,MAAC,QAAQ,sCAAI;MAElD,eAAa,2CAAU;IACzB;8ZAG0E;4PACiB;EAE7F;EAGA;;;;;;;kRAEmH;EAEnH;EAGA;;;;;;;QAGI,6DAAwB;QACxB,4DAAwB;QACxB,+DAAwB;QACxB,6DAAwB;IAE1B,IAAc,UAAuC;sMAEc;IAEnE,yBAAG,OAAO,MAAC,iBAAoB;+EACA;IAC/B;sHAE+C;;;MAG7C,iBAAe,qBAAQ,KAAS,UAAQ,MAAC,QAClB,QAAS,+BAAgB,aAAa;MAE7D,sBAAM,UAAU;MAChB,iBAAiB,GAAd,OAAO,MAAC,QAAQ,aAAa,IAAG,sBAAE,OAAO,MAAC,OAAiB,iBAAiB,GAAb,cAAe,QAAQ,MAAC,eAAc,CAAC;QACvG,eAAa,2CAAU;MACzB;MAEA,sBAAM,UAAU;MAChB,yBAAG,QAAQ,MAAC,iBAAoB;QAC9B,2UACuF;MACzF;MAEA,mJAA2C;MAC3C,iBAAqB,GAAlB,QAAQ,MAAC,WAAW,uBAAS;sGACP;MACzB;gfAGkC;wMACqC;MACvE,iBAAqB,GAAlB,QAAQ,MAAC,WAAW,uBAAS;uGACN;MAC1B;IACF;mGAEwB;EAE1B;EAGA;;;;;;;;;QAGI,2DAAuB;QACvB,8DAAuB;QACvB,sDAAkB;QAClB,6DAAuB;IAEzB,IAAc,cAA2C;4PAEkC;IAE3F,yBAAG,OAAO,MAAC,iBAAoB;+EACA;IAC/B;IAEA,aAAU,mNAAuE;IAGjF,iBAAW,GAAR,SAAU,gCAAC;sOAEqF;kGAExE;+FACH;;;QAEpB,sBAAM,QAAQ;QACd,yBAAG,cAAY,MAAC,iBAAoB;UAClC,aAAW,qBAAQ,KAAS,cAAY,MAAC,QACtB,QAAS,+BAAgB,aAAa;UACzD,yFAAkC;QACpC;gMAC6D;MAC/D;gGACuB;mGACG;kGAED;;;;;QAEvB,YAAU,eAAE,MAAC,MAAK;iGACI;;;UAEpB,yLAAyD;UACzD,cAAW,qBAAQ,MAAS,kDACT,QAAS,+BAAgB,cAAa;UACzD,sBAAM,WAAW;UACjB,iBAAyB,GAAtB,cAAY,MAAC,WAAW,uBAAS;YAClC,wDAAyB;UAC3B;ySAEwE;QAC1E;kGACuB;MACzB;;mGAC0B;mGAEA;IAE5B;yPAEmE;IACnE;IAGA,0LAAgE;4TAEJ;EAE9D;EAGA;;;;;;;QAGI,0DAAwB;QACxB,+DAAwB;QACxB,+DAAwB;8SAEqF;IAE/G,yBAAG,OAAO,MAAC,iBAAoB;+EACA;IAC/B;IAEA,yBAAG,QAAQ,MAAC,uBAA0B;6HACW;IACjD;IAEA,iBAAiB,GAAd,QAAQ,MAAC,OAAO,sCAAuB,kCAAY,MAAC,QAAM;MAC3D,YAAU,yCAAQ;IACpB,wBAAyB,GAAlB,QAAQ,MAAC,WAAW,uBAAS;MAClC,YAAU,2CAAU;IACtB;MACE,YAAU,uCAAM;IAClB;IAEA,iBAAgB,GAAb,QAAQ,MAAC,MAAM,gCAAC;MACjB,yGAA4C;IAC9C;IACA,iBAAgB,GAAb,QAAQ,MAAC,MAAM,gCAAE,iBAAiB,GAAb,QAAQ,MAAC,MAAM,6BAAc,SAAQ;MAC3D,yGAA4C;IAC9C;0rBAI4F;IAE5F,yBAAG,QAAQ,MAAC,uBAA0B;qGACZ;+HACyB;8TAEH;qGACtB;IAC1B;EAEF;EAGA;;;;;;;QAEO,0DAAmB;QACnB,0DAAmB;QACnB,0DAAmB;8SAEuF;IAE/G,yBAAG,OAAO,MAAC,iBAAoB;+EACA;IAC/B;IAEA,iBAAiB,GAAd,QAAQ,MAAC,OAAO,gCAAC;MAClB,kGAAqC;IACvC,gCAAO,OAAO,MAAC,iBAAoB;MACjC,0PAAuF;IACzF;IAEA,iBAAiB,GAAd,QAAQ,MAAC,OAAO,gCAAC;MAClB,kGAAqC;IACvC;IAGA,wbAC6E;IAC7E,kCAAU,QAAW,qBAAQ,KAAS,OAAO,MAAC,QACjB,QAAS,+BAAgB,cAAa;IACnE,kCAAU,mDAAwB;iEAEX;EAEzB;EAGA;;;;;;;;QAEO,y/EAA+B;IAEpC,QAAQ,MAAC,UAAQ,sCAAuB,kCAAY,MAAC,YAAW;IAChE,QAAQ,MAAC,WAAQ,QAAQ;IACzB,QAAQ,MAAC,UAAQ,OAAO;IACxB,QAAQ,MAAC,UAAQ,OAAO;IAExB,gCAAO,kBAAY,cAAS;IAE5B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;QAEO,y/EAA+B;IAEpC,QAAQ,MAAC,UAAQ,sCAAuB,kCAAY,MAAC,MAAK;IAC1D,QAAQ,MAAC,UAAQ,OAAO;IACxB,QAAQ,MAAC,WAAQ,QAAQ;IACzB,QAAQ,MAAC,UAAQ,OAAO;IAExB,gCAAO,kBAAY,cAAS;IAE5B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAEO,y/EAA+B;IAEpC,QAAQ,MAAC,UAAa,sCAAuB,kCAAY,MAAC,KAAI;IAC9D,QAAQ,MAAC,UAAa,OAAO;IAC7B,QAAQ,MAAC,WAAa,QAAQ;IAC9B,QAAQ,MAAC,gBAAa,aAAa;IACnC,QAAQ,MAAC,cAAa,WAAW;IACjC,QAAQ,MAAC,SAAa,MAAM;IAC5B,QAAQ,MAAC,SAAa,MAAM;IAC5B,QAAQ,MAAC,cAAa,WAAW;IACjC,QAAQ,MAAC,cAAa,WAAW;IACjC,QAAQ,MAAC,UAAa,OAAO;IAC7B,QAAQ,MAAC,cAAa,WAAW;IACjC,QAAQ,MAAC,iBAAc,cAAc;IAErC,yBAAG,yBAA8B,yBAAI,0BAAyB;MAC5D,QAAQ,MAAC,gBAAa,gDAAc;MACpC,QAAQ,MAAC,iBAAc,cAAc;MACrC,QAAQ,MAAC,wUACqF;IAChG;IAEA,gCAAO,kBAAY,cAAS;IAE5B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;;;;;;;;;;;;;;;QAEO,y/EAA+B;IAEpC,QAAQ,MAAC,UAAc,sCAAuB,kCAAY,MAAC,SAAQ;IACnE,QAAQ,MAAC,UAAc,OAAO;IAC9B,QAAQ,MAAC,WAAc,QAAQ;IAC/B,QAAQ,MAAC,cAAc,WAAW;IAClC,QAAQ,MAAC,UAAc,OAAO;IAC9B,QAAQ,MAAC,cAAc,WAAW;IAClC,QAAQ,MAAC,iBAAc,cAAc;IACrC,QAAQ,MAAC,UAAc,OAAO;IAC9B,QAAQ,MAAC,UAAc,OAAO;IAC9B,QAAQ,MAAC,gBAAc,aAAa;IAEpC,gCAAO,kBAAY,cAAS;IAE5B,YAAU,OAAE;IAEd;;EAGA;;QAEQ,+iBAA+C;IACrD,IAAe,cAAmD;IAElE,gBAAgB,MAAC,iGAAoC;IAErD;;;;2HAC6C;IAC7C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,gBAAgB,MAAC,iBAAc,cAAY,MAAC,MAAK;MACjD,gBAAgB,MAAC,YAAc,cAAY,MAAC,OAAM;MAClD,gBAAgB,MAAC,gDAAqB;MACtC,gFAAoD;IACtD;IAEA;;;;wHAC6C;IAC7C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,gBAAgB,MAAC,iBAAc,cAAY,MAAC,MAAK;MACjD,gBAAgB,MAAC,YAAc,cAAY,MAAC,OAAM;MAClD,gBAAgB,MAAC,6CAAkB;MACnC,gFAAoD;IACtD;IAEF;;AACF","file":"zcl_abapgit_html_form.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_form_utils.clas.mjs":{"lineLengths":[53,40,35,32,55,37,227,214,421,546,222,403,407,367,226,514,17,42,22,130,137,3,29,129,61,30,16,3,23,53,3,30,146,129,61,113,24,3,21,64,136,76,147,109,52,139,49,48,45,5,137,429,77,94,14,86,7,12,92,5,20,3,25,55,3,32,101,136,76,139,85,119,20,3,25,101,136,76,2848,68,63,62,2594,41,59,216,37,157,140,140,146,241,63,40,69,57,50,65,89,71,59,242,77,68,60,30,13,11,56,9,54,149,156,158,73,14,73,7,62,24,7,5,20,3,26,136,136,76,2848,68,63,62,62,2594,90,89,26,5,59,330,37,38,86,81,100,7,142,166,354,120,147,159,146,241,63,40,69,57,50,65,89,71,59,242,244,11,56,9,54,302,149,167,111,187,81,61,9,90,14,90,7,5,24,3,25,136,76,40,3,25,141,136,76,2848,68,65,2594,95,59,68,37,86,81,100,7,106,186,7,46,124,174,259,9,174,258,9,133,13,34,21,82,189,21,18,20,11,9,147,246,9,147,247,9,7,5,29,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_html_form_utils.clas.abap"],"names":[],"mappings":";;AAiEA;;;;;;;;;;;;;;;;;;;;EAGE;;;IACE,iBAAU,OAAO;IACnB;;EAGA;;;;;;;;IAIA;;EAGA;;;;;;QAEO,2CAAyB;QACzB,kIAA4C;IAEjD,oBAAkB,uBAAuB;IACzC,yBAAG,gBAA4B;MAE7B,oBAAkB,iBAAY;IAChC;IAEA,iBAEsC,IAFnC,sFAEqC,uBAAS;MAC/C,eAAY,sZAIe;MAE3B,iBAAa,GAAV,WAAY,qCAAG;QAChB,aAAW,gCAAiB,aAAa,MAAC,oBAAmB;MAC/D;QACE,aAAW,gCAAiB,aAAa,MAAC,YAAW;MACvD;IACF;MACE,aAAW,gCAAiB,aAAa,MAAC,oBAAmB;IAC/D;IAEF;;EAGA;;;;;;;;;IACE,aAAW,gCAAgC,GAAzB,YAAY,OAAE,YAAc,eAAe,OAAE,WAApD,CAAgE;IAC7E;;EAGA;;;;QAGI,uxFAA+C;QAC/C,2DAAqB;QACrB,sDAAgB;QAChB,qDAAgB;IAElB,IAAc,YAAiC;IAE/C,aAAW,sBAAS;IACpB,eAAY,sCAAsB;;;MAEhC,cAAW,uBACT,MAAM,kEACN,KAAM,mCAAK;MAEb,iBAAmB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,QAAM;QAC7D,aAAW,wCAAO,SAAoB,iBAAY,GAAT,UAAW,qCAAzC,CAA8C;MAC3D,wBAAuB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,OAAK;QAChE,aAAU,0NAA4E;;;;;UAEpF,WAAS,eAAE,MAAC,MAAK;;;;;YAEf,cAAW,sNAAkE;YAC7E,aAAW,wCAAO,SAAP,CAA4B;YACvC,iBAAY,GAAT,UAAY,uBAAS;cACtB;;YACF;UACF;;QACF;;MACF,wBAAuB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,UAAQ;QACnE,iJAA4E;QAC5E,mJAA8E;QAC9E,aAAW,wCAAO,SAAP,CAA4B;MACzC;QACE,aAAW,wCAAO,SAAP,CAA4B;MACzC;MAEA,iBAAY,GAAT,UAAY,uBAAS;QACtB;MACF;IACF;IAEF;;EAGA;;;;QAGI,uxFAA+C;QAC/C,2DAAqB;QACrB,sDAAgB;QAChB,qDAAgB;QAChB,qDAAgB;IAElB,IAAc,YAAiC;;IAI/C,iBAA6B,IAA1B,sCAA4B,uBAAS;MACtC;IACF;IAEA,eAAY,sCAAsB;;;MAIhC,sBAAM,QAAQ;MACd,cAAW,gEAAoC;MAC/C,iBAAuB,GAApB,YAAU,MAAC,WAAW,uBAAS;QAChC,aAAW,uBAAU,KAAM,UACN,KAAM,kCAAK;MAClC;MAEA,iBAAmB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,UAAQ;qKAGnB;MAC9C,WAAO,cAAkB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,MAC3D,iBAAmB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,UAAS,CAClE,iBAA0B,GAAtB,YAAU,MAAC,aAAa,uBAAS;uHAGN;MACnC,wBAAuB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,QAAM;8JAIhB;MACnD,wBAAuB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,OAAK;QAChE,aAAU,0NAA4E;;;;;UAEpF,WAAS,eAAE,MAAC,MAAK;;;;;YAEf,cAAW,sNAAkE;mPAGxD;UACvB;;QACF;;6SAG0B;MAC5B,wBAAuB,GAAhB,YAAU,MAAC,OAAO,sCAAuB,kCAAY,MAAC,UAAQ;QACnE,4JACsC;QAGtC,WAA4B,qBAAnB,0BAAQ,WAAa,gCAAC;QAC/B,iBAAU,GAAP,QAAU,gCAAE,iBAAuB,GAAnB,iDAAqB,uCAAwB,QAAO;UACrE,WAAgB,mBAAP,OAAS,gCAAC;UACnB,aAAW,oCAAgB;QAC7B;yFAIqB;MACvB;yFAGuB;MACvB;IAEF;IAEF;;EAGA;;;IACE,sBAAe,YAAY;EAC7B;EAGA;;;;QAGI,uxFAA+C;QAC/C,2DAAqB;QACrB,wDAAgB;IAElB,IAAc,YAAiC;;IAI/C,eAAY,sCAAsB;;;MAEhC,cAAW,gEAAoC;MAC/C,iBAAuB,GAApB,YAAU,MAAC,WAAW,uBAAS;QAChC,aAAW,uBAAU,KAAM,UACN,KAAM,kCAAK;MAClC;MACA,yBAAG,YAAU,MAAC,oBAAwB,yBAAI,SAAmB;yLAGR;MACrD;MACA,IACE,OAWA,KAZG,YAAU,MAAC,KAAhB;;QAEI,iBAAkB,GAAf,YAAU,MAAC,MAAO,6BAAc,SAAS,iBAAuB,GAAnB,0BAAQ,YAAa,YAAU,MAAC,KAAG;kQAGS;QAC5F;QACA,iBAAkB,GAAf,YAAU,MAAC,MAAO,6BAAc,SAAS,iBAAuB,GAAnB,0BAAQ,YAAa,YAAU,MAAC,KAAG;iQAGQ;QAC3F;;QAEA;UACI,cAAY,QAAQ;;;;;;;;QAMxB;QACA,iBAAkB,GAAf,YAAU,MAAC,MAAO,6BAAc,SAAS,iBAAc,GAAV,WAAY,YAAU,MAAC,KAAG;qPAGK;QAC/E;QACA,iBAAkB,GAAf,YAAU,MAAC,MAAO,6BAAc,SAAS,iBAAc,GAAV,WAAY,YAAU,MAAC,KAAG;sPAGM;QAChF;;IAEN;IAEF;;AACF","file":"zcl_abapgit_html_form_utils.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_parts.clas.mjs":{"lineLengths":[53,35,30,32,50,37,876,952,326,539,363,277,50,17,42,22,778,3,29,64,16,3,25,73,79,123,61,572,129,80,3,17,52,3,31,572,73,79,113,100,122,85,71,74,27,47,153,69,50,5,25,3,32,261,568,83,36,80,5,19,3,36,63,73,79,572,83,56,71,5,19,3,26,335,73,79,572,83,56,45,5,20,3,1,64,563,793,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_html_parts.clas.abap"],"names":[],"mappings":";;AAgDA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;QAEO,mjBAA6C;IAClD,mBAAgB,wGAEoB;IACpC,gCAAO,iBAAW,aAAa,OAAE,IAAI;EAEvC;EAGA;IACE,sBAAM,wBAAmB;EAC3B;EAGA;;;;;;;IAEE;;;;6CAAyF;IACzF,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAyB,GAArB,sBAAuB,uBAAS;;MAEnD,aAAa,OAAE,SAAO,aAAa;IACrC;IAEF;;EAGA;;IAEE,IAAc,WAA0C;;;MAEtD,gCAAO,WAAS,MAAC,eAAQ,OAAO;IAClC;IAEF;;EAGA;;;;QAEO,mjBAA6C;IAClD,mBAAgB,0DAA+B;IAC/C,yBAAG,wBAAsB;MACvB,YAAU,yBAAO,aAAa,OAAE,MAAM;IACxC;IAEF;;EAGA;;;;QAEO,mjBAA6C;IAClD,mBAAgB,0DAA+B;IAC/C,yBAAG,wBAAsB;MACvB,aAAW,aAAa,OAAE,IAAI;IAChC;IAEF;;AACF","file":"zcl_abapgit_html_parts.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_table.clas.mjs":{"lineLengths":[89,53,35,64,32,50,37,237,690,201,74,217,245,402,581,548,17,12,42,22,140,614,124,3,29,64,16,3,23,48,3,30,135,139,73,72,89,51,23,3,30,131,72,76,75,85,88,79,415,73,25,53,47,53,79,19,3,23,123,43,52,50,73,123,58,68,48,123,5,55,133,5,84,30,138,30,48,107,19,3,27,68,76,45,55,428,68,417,77,74,35,158,109,92,193,9,102,98,109,92,80,73,9,14,71,7,197,161,5,3,29,123,58,212,72,64,75,106,66,33,48,136,42,73,159,7,141,72,106,5,107,3,24,417,106,103,74,35,96,5,104,107,3,1,64,403,628,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_html_table.clas.abap"],"names":[],"mappings":";;;AAuEA;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;IACE,4CAAO,sBAAoB;;IAE3B,WAAW,OAAE,gBAAc,WAAW;IACxC;;EAGA;;;;;;;;IAEE,IAAc,QAA8B;IAE5C,4CAAO,uBAA2B;IAClC,YAAU,OAAE;;IAGZ,QAAM,MAAC,eAAe,YAAY;IAClC,QAAM,MAAC,kBAAe,eAAe;IACrC,QAAM,MAAC,gBAAe,4BAAU,eAAe;IAEjD;;EAGA;;;;;;;;QAEO,2DAAoB;IAEzB,yBAAG,gBAAoB;MACrB,mCAAW,gFAA6B;IAC1C;IAEA,yBAAG,uBAA2B;MAC5B,mCAAW,0FAAuC;IACpD;;IAGA,YAAU,YAAO;yIAEoB;6BACtB;+CACQ;0GACG;IAE5B;;EAGA;;;;;QAEO,maAAqD;QACrD,2DAAoB;IACzB,IAAc,UAAgC;IAC9C,IAAc,UAAiB;;;MAG7B,yBAAG,UAAQ,MAAC,sBAA0B,iBAAwB,GAApB,UAAQ,MAAC,aAAc,qCAAG;QAClE,kGAAoE;QACpE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gMAC6E;QAC7F;MACF,wBAA2B,GAApB,UAAQ,MAAC,aAAc,qCAAG;QAC/B,UAAQ,MAAC,gBAAa,4BAAU,UAAQ,MAAC,YAAW;QACpD,kGAAoE;QACpE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,UAAQ,MAAC,gBAAa,oCAAG;UACzB,4DAA2B;QAC7B;MACF;QACE,4DAA2B;MAC7B;MACA,eAAY,8KAIe;gKAIS;IACtC;EAEF;EAGA;;;QAEO,2MAAsD;QACtD,+DAAwB;QACxB,uDAAe;IAEpB,IAAc,QAAe;yGAEJ;;;MAGvB,aAAW,eAAE,MAAC,MAAK;MACnB,kBAAe,8GAEU;MACzB,sBAAM,YAAY;MAClB,yBAAG,YAAY,MAAC,qBAAwB;QACtC,uCAAe,8GAAqD;MACtE;4IACsC;uEAGb;yGACF;IACzB;0GAE0B;EAE5B;EAGA;IAEE,IAAc,UAAgC;yGAErB;sGACH;;;+FAG6B;IACnD;uGAEuB;0GACG;EAE5B;AACF","file":"zcl_abapgit_html_table.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_toolbar.clas.mjs":{"lineLengths":[53,37,32,32,52,37,1630,143,375,332,158,1696,157,492,864,17,42,22,1533,66,3,20,135,66,58,134,58,44,55,149,66,58,66,58,99,58,44,55,99,58,98,66,58,65,55,68,64,68,64,71,73,1318,491,126,34,34,34,34,34,34,34,34,34,32,38,39,44,69,25,19,3,29,65,55,26,16,3,23,50,3,30,139,65,55,105,23,3,23,64,59,20,3,23,123,101,64,100,61,68,79,68,60,101,5,140,104,100,19,3,35,123,68,64,101,64,100,61,102,67,69,67,68,79,68,60,101,5,61,95,5,140,102,174,123,104,105,100,19,3,29,123,100,61,68,74,67,65,68,66,105,1350,79,59,69,5,197,36,47,76,12,5,53,93,5,163,72,36,38,44,37,132,170,17,7,66,77,126,76,85,126,75,16,101,9,7,75,63,84,16,134,9,14,55,7,59,105,7,66,113,7,202,56,308,14,376,131,7,101,5,99,19,3,1,68,1335,1549,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_html_toolbar.clas.abap"],"names":[],"mappings":";;AAmFA;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QACO,6xCAAoB;IAEzB,oCAAc,GAAP,QAAS,iCAAkB,8BAAa,MAAC,WAC9C,iBAAU,GAAP,QAAS,iCAAkB,8BAAa,MAAC,SAC5C,iBAAU,GAAP,QAAS,iCAAkB,8BAAa,MAAC,OAC5C,yBAAG,OAAkB,yBAAI,iBACzB,yBAAG,iBAAsB,yBAAI,OAAiB;IAEhD,uBAAO,CAAI,cAAS,GAAP,QAAU,4BAAe,yBAAI,iBAAsB,CAAC;IAEjE,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,SAAQ,MAAM;IACtB,OAAO,MAAC,QAAQ,KAAK;IACrB,OAAO,MAAC,WAAQ,QAAQ;IACxB,OAAO,MAAC,YAAS,QAAQ;IACzB,OAAO,MAAC,cAAW,WAAW;IAE9B,gCAAO,iBAAW,aAAQ;IAE1B,YAAU,OAAE;IAEd;;EAGA;;;IACE,eAAQ,KAAK;IACf;;EAEA;;;;;;;;IAIA;;EAGA;;IACE,aAAW,yBAAO,eAAU;IAC9B;;EAGA;;;;;;QAEQ,2DAAoB;;IAI1B,aAAW,iDAAe;IAC1B,iBAAY,GAAT,UAAW,uBAAS;MACrB,mCAAW,SAAY,iDAAc;IACvC;2IAE4C;uGACK;mGACzB;IAE1B;;EAGA;;;;;;;;;;;;QAEQ,2DAAoB;;IAI1B,aAAW,iDAAe;IAC1B,iBAAY,GAAT,UAAW,uBAAS;MACrB,mCAAW,SAAY,iDAAc;IACvC;IACA,iBAAa,GAAV,WAAY,uBAAS;MACtB,mCAAW,SAAY,2CAAS;IAClC;2IAE4C;qGAClB;6KAGU;0HACU;uGACG;wGACrB;mGACJ;IAE1B;;EAGA;;;;QAEQ,2DAA0B;QAC1B,iEAA0B;QAC1B,0DAA0B;QAC1B,wDAA0B;QAC1B,2DAA0B;QAC1B,yDAA0B;QAC1B,gGAA6B;IAEnC,IAAc,WAA+B;;IAK7C,iBAAW,GAAR,SAAU,uBAAS;MACpB;IACF;;;MAIE,iBAAe,sBAAS;MACxB,aAAe,uDAAqB;MACpC;IACF;IAEA,yBAAG,qBAAoB;MACrB,qFAAyB;IAC3B;kKAE2C;;;MAIzC,sBAAO,QAAQ;MAAf,sBAAiB,cAAc;MAA/B,sBAAiC,OAAO;MAExC,iBAAiB,GAAd,WAAS,MAAC,MAAM,iCAAkB,8BAAa,MAAC,WAAS;yKACI;QAC9D;MACF;MAEA,iBAAgB,GAAb,cAAe,uBAAS;QACzB,iBAAiB,GAAd,WAAS,MAAC,MAAM,uBAAS;UAC1B,aAAW,qGAA6B;UACxC,aAAW,mDAAiB;QAC9B,wBAAqB,GAAd,WAAS,MAAC,MAAM,wBAAU;UAC/B,aAAU,qGAA6B;UACvC,aAAW,kDAAgB;QAC7B;UACE,aAAU,4EAA8B;QAC1C;MACF;MAGA,iBAAiB,GAAd,WAAS,MAAC,MAAM,uBAAS;QAC1B,yBAAG,WAAS,MAAC,UAAmB;UAC9B,mBAAkB,qDAAmB;QACvC;UACE,0HAA4D;QAC9D;MACF;QACE,mBAAkB,WAAS,MAAC,SAAQ;MACtC;MACA,yBAAG,yBAA6B;QAC9B,+FAA0C;MAC5C;MACA,yBAAG,WAAS,MAAC,eAAkB;QAC7B,uGAAwC;MAC1C;yMAEwD;MAExD,yBAAG,WAAS,MAAC,KAAc;mTAOoB;MAC/C;uXAO+C;kIACS;MACxD;oGACuB;IAEzB;kGAEuB;IAEzB;;AACF","file":"zcl_abapgit_html_toolbar.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_viewer_gui.clas.mjs":{"lineLengths":[53,40,35,32,55,62,175,171,620,373,17,42,22,78,127,3,29,124,76,123,115,106,125,72,71,156,110,58,66,69,86,16,3,25,69,55,68,52,70,58,71,61,74,70,33,3,40,46,3,50,53,3,40,43,3,43,66,51,67,45,23,18,3,50,66,58,45,58,112,48,67,118,63,61,104,75,82,129,76,51,56,115,23,9,168,41,17,22,44,81,77,71,61,13,16,20,9,7,90,141,7,39,5,47,11,87,43,19,24,46,73,80,63,15,18,22,11,9,92,205,9,7,66,76,71,13,85,45,21,26,48,75,82,90,65,17,20,24,13,11,94,151,11,9,60,109,76,59,68,74,18,75,11,66,9,55,72,64,57,29,15,68,47,23,28,50,77,89,87,83,67,19,22,26,15,13,96,145,13,11,9,82,121,81,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_html_viewer_gui.clas.abap"],"names":[],"mappings":";;AA+BA;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,+DAAiC;QACjC,8DAAgC;;IAOtC,QAAQ,MAAC,aAAa,wCAAyB,qCAAa;IAC5D,QAAQ,MAAC,gBAAa,sBAAS;IAC/B,gCAAO,kBAAY,SAAS;oEAEsB;IAClD;IAEF;;EAGA;;;;;;;;;;;IAEE;EAQF;EAGA;6CAE4B;EAE5B;EAGA;oDAEmC;EAEnC;EAGA;0CAEyB;EAEzB;EAGA;;QAEO,0CAAwB;kEAC4B;4CACrC;IACpB,WAAS,MAAM;IAEjB;;EAGA;;;;;;;;;;;;;;;;QAEO,0CAAwB;QACxB,+CAA6B;IAElC,oCAAwB,GAAjB,0BAAQ,UAAY,kCAAG;IAC9B,WAAS,MAAM;;uKAgBiB;;;;;;;;;;;;;;MAChC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4IACsD;MACtE;MACA,oBAAkB,WAAW;IAE/B;IAGA;;sFAO6B;;;;;;;;;;;;;QAC3B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4MAC8E;QAC9F;MACF;MAGA;;;;oFASqC;;;;;;;;;;;;;;UACnC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sJAC4D;UAC5E;QAEF;QAGA;;;cACQ,4CAA0B;UAEhC,iBAAc,GAAX,YAAa,uBAAS;YACvB,eAAa,iCAAkB,YAAY;UAC7C;YACE,eAAa,iCAAkB,aAAa;UAC9C;iEAEyC;QAC3C;QAGA;;;cAEO,0CAAwB;UAC7B,WAAS,MAAM;;mEASiB;;;;;;;;;;;;;;;YAChC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gJACoD;YACpE;UAEF;QACF","file":"zcl_abapgit_html_viewer_gui.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http.clas.mjs":{"lineLengths":[53,29,24,32,44,37,235,391,303,614,159,447,17,42,22,46,3,29,64,16,3,38,57,3,45,69,121,67,135,67,66,58,75,67,67,135,165,33,119,40,148,5,52,163,5,167,114,30,77,156,56,63,12,96,5,21,3,37,56,3,44,110,121,67,63,101,70,52,5,29,3,30,49,3,37,135,66,58,70,70,66,69,76,121,150,67,102,143,42,11,436,43,19,24,46,81,80,77,63,15,18,22,11,9,92,54,76,114,18,88,11,80,9,7,138,81,7,112,100,69,7,127,197,178,267,162,125,101,61,175,112,7,143,43,111,120,45,7,45,79,242,7,23,5,23,42,5,30,70,168,22,5,34,53,5,41,102,68,60,69,288,125,73,65,102,75,82,123,106,76,28,49,117,21,5,3,54,147,55,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_http.clas.abap"],"names":[],"mappings":";;AAkDA;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;QAEQ,kEAA2B;QAC3B,0DAA2B;QAC3B,0DAA2B;QAC3B,8HAAmD;IAGzD,qBAAkB,0IAAuE;IACzF,YAAkB,eAAe;sHAOF;IAE/B,yBAAG,QAAkB;mJAC0D;IAC/E;IAEA,iBAAW,GAAR,SAAW,gBAAe;kKAGL;IACxB;IAEA,eAAY,kJAA2D;;IAGvE,IACE,YADG,SAAL;;;uDAS+B;8DACO;;+FAKZ;;IAG5B;;EAGA;;;;;;;QAEQ,sDAAc;oGAEuC;IAC3D,iBAAW,GAAR,SAAU,kCAAG;MACd,sBAAoB,sBAAS;IAC/B;IAEF;;EAGA;;;;;;;;;QAEQ,yDAAkC;QAClC,4DAAkC;QAClC,mEAAkC;QAClC,gHAAiD;QACjD,6IAA2D;QAC3D,0DAAkC;;IAKxC,eAAY,0HAA+D;IAE3E,yBAAG,UAAsB;;mbAcK;;;;;;;;;;;;;;QAC5B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,IACE,YADG,eAAE,MAAC,MAAR;;YAII,YAAU,wFAAsD;;YAEhE,YAAU,8DAA4B;;+EAGH;QACzC;MAEF;MAEA,iBAA8D,IAA3D,qFAA6D,uBAAS;gFAC/B;MAC1C;;MAMA,iBAA6B,IAA1B,+CAA4B,uBAAS;oEACH;MACrC;8HAEmC;oMAGhB;iLAGO;MAC1B,kCAAS,yFACA,kFACA,WACA,2CAAO;iKAGI;MAGpB,SAAS,OAAE,4CAA2B,+BAAgB,0BAAW;MAEjE,sBAAmB,uEAAyC;MAC5D,yBAAG,2BAA+B;8KAGJ;QAC5B,SAAS,OAAE,4CAA2B,SAAS,OAAE,0BAAW;MAC9D;8IAIyB;0CAEC;MAC1B,iBAAqC,IAAlC,0DAAoC,uBAAS;QAC9C,eAAY,+FAE2C;4CAC7B;MAC5B;4CAC4B;MAE5B,iBAAa,GAAV,WAAa,yBAAQ,MAAC,QAAM;iPAGiD;MAChF;MAEF;;IAGA;;;;;MAIE,gKAAsE;MAExE;;IAGA;;;;;;;UAEQ,0DAAmB;UACnB,qRAAkD;UAClD,kHAAoC;wEAGc;MACxD,gCAAO,iBAAW,OAAO;MAEzB,gCAAO,sDAAe,OAAO;MAE7B,aAAU,sDAAiC;iFACc;;MAIzD;;;+CAAuE;MACvE,YAAU,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;MAEjC;;EACF","file":"zcl_abapgit_http.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http_agent.clas.mjs":{"lineLengths":[57,53,35,30,32,50,61,239,469,327,227,56,17,42,22,142,116,3,31,56,3,38,124,70,49,67,121,98,103,73,109,74,12,179,5,3,29,100,16,3,18,43,3,25,139,89,23,3,49,141,50,29,3,47,145,66,58,69,67,158,132,64,134,70,49,67,121,150,63,70,299,102,376,167,103,51,86,39,148,7,5,98,37,178,5,53,88,39,180,7,5,349,110,5,9,50,41,17,22,44,87,79,83,81,61,13,16,20,9,7,90,13,57,45,21,26,48,91,83,87,65,17,20,24,13,11,9,92,100,192,9,126,27,7,5,68,410,81,83,81,87,85,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_http_agent.clas.abap"],"names":[],"mappings":";;;AA8BA;;;;;;;;;;;;;;;EAGE;;;;;;;;QAEO,gHAAqC;IAC1C,aAAU,+EAAiD;IAE3D,iBAAsB,GAAnB,OAAO,OAAE,WAAY,kCAAmB,iBAAgB;wEACvB;IAEpC,wBAA0B,GAAnB,OAAO,OAAE,WAAY,kCAAmB,gBAAe;yEACzB;IAErC;kLACsF;IACtF;EAEF;EAGA;;IAIA;;EAGA;;;;;;IAIA;;EAGA;;IAEE,sBAAoB,sBAAiB;IAEvC;;EAGA;;;;;;;;;;;;;QAEO,gHAAoC;QACpC,6IAA2D;QAC3D,sDAAc;QACd,6DAAsB;IAC3B,IAAc,YAA4C;;uXAWlC;sKAEmD;sGAChC;IAE3C,yBAAG,mBAAiB;;;mJAIQ;MAC1B;IACF;;;iLAK0B;IAC1B;IAEA,yBAAG,qBAAmB;;;mLAIM;MAC1B;IACF;IAEA,iBAAa,GAAV,WAAY,uCAAwB,gCAAS,MAAC,MAC/C,iBAAa,GAAV,WAAY,uCAAwB,gCAAS,MAAC,KACjD,iBAAa,GAAV,WAAY,uCAAwB,gCAAS,MAAC,OAAK;6GAG3B;IAC7B;;iDAQoC;;;;;;;;;;;;;;;MACpC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;wDAMuB;;;;;;;;;;;;;;QACtC;QAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;mGAIY;+LACgD;QAC5E;QAEA,iBAAc,mGAAsC;QAEtD;;IACF","file":"zcl_abapgit_http_agent.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http_agent.clas.locals.mjs":{"lineLengths":[53,46,25,32,73,64,219,205,413,17,42,22,122,128,3,29,64,16,3,23,43,3,30,145,121,67,160,112,47,79,57,23,3,43,54,3,43,99,63,63,159,18,3,42,69,74,19,3,43,67,75,19,3,42,63,66,94,19,3,42,125,124,19,3,43,70,78,22,3,45,134,388,223,88,88,69,33,94,5,22,3,1,82,27,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_http_agent.clas.locals_imp.abap"],"names":[],"mappings":";;AAgBA;;;;;;;;;;;;;;;;;EAEE;;;;;;;QACO,uJAAyC;;IAE9C,WAAW,OAAE,cAAc,SAAS;IACpC,WAAW,OAAE,gBAAc,SAAS,OAAE,uBAAQ;+BAC9C,aAAe,WAAW;IAC5B;;EAEA;qDACqB;EACrB;EAEA;;QACO,sDAAc;IACnB,aAAU,4CAAiC;IAC3C,WAAS,gCAAe,GAAR,SAAW,kCAAI,iBAAY,GAAR,SAAU,kCAApC,CAAyC;IACpD;;EAEA;;IACE,aAAU,uDAAwB;IACpC;;EAEA;;IACE,aAAU,wDAAyB;IACrC;;EAEA;;QACO,yDAA2B;6FAIV;IACxB;;EAEA;;IAEE,aAAU,yGAA8D;IAE1E;;EAEA;;IACE,gBAAa,wDAAyB;IACxC;;EAEA;;QAEO,2XAAyB;IAC9B,IAAc,QAA8B;;uFAIkB;;;6FAInC;IAC3B;IAEF;;AAEF","file":"zcl_abapgit_http_agent.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http_client.clas.mjs":{"lineLengths":[53,36,31,32,51,37,219,213,232,49,227,278,159,58,302,56,270,17,42,22,122,136,3,26,63,67,106,28,72,13,79,169,79,171,79,144,79,149,79,169,79,131,79,138,79,174,12,105,178,5,3,37,84,112,76,88,75,67,67,120,71,176,7,5,59,105,63,90,135,7,5,3,17,54,3,29,121,67,34,16,3,21,68,104,20,3,24,67,63,70,9,55,41,17,22,44,87,79,83,81,61,13,16,20,9,7,90,13,62,45,21,26,48,91,83,87,65,17,20,24,13,11,9,92,105,149,80,9,7,39,73,73,65,105,34,36,106,58,23,7,31,139,71,38,7,32,70,62,74,74,72,205,252,171,184,171,183,164,61,70,9,7,5,70,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_http_client.clas.abap"],"names":[],"mappings":";;AAqCA;;;;;;;;;;;;;;;;;;;;;EAGE;QAEQ,sDAAc;QACd,0DAAmB;yGAEkC;IAC3D,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KAjBG,OAAL;;MAEI;;wKAEkG;;0KAEE;;+IAE3B;;oJAEK;;wKAEoB;;kIAEtC;;yIAEO;;6KAEoC;;MAEvG,aAAU,oFAAiC;iLACqB;;EAGtE;EAGA;;;;;QAEQ,kEAA2B;QAC3B,0DAA2B;IAEjC,yBAAG,mCAAuC;MACxC,qBAAkB,2FAAwC;MAC1D,iBAAmB,GAAhB,iBAAmB,yBAAwB;+KAC2D;MACzG;IACF;IAEA,yBAAG,2BAA+B;MAChC,aAAU,oFAAiC;;MAE3C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sIACgD;MAChE;IACF;EAEF;EAGA;qDACqB;EACrB;EAGA;;;IACE,mBAAY,SAAS;IACvB;;EAGA;;IACE,cAAW,oFAAiC;IAC9C;;EAGA;QAEQ,0DAAsB;QACtB,sDAAiB;QACjB,6DAAsB;;sDAQQ;;;;;;;;;;;;;;;MAEpC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;6DAMuB;;;;;;;;;;;;;;QACtC;QAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wGAUY;UAE1B,yIAA0D;+EAEnB;QACzC;MAEF;MAGA;;;;wGAGyC;iCACxB;mCACE;QACjB,aAAU,mFAAgC;yDACvB;QAErB;;MAGA;;;QACE,mBAAY,SAAS;MACvB;MAGA;;;;;YAEQ,2DAAoB;4MAKN;QAEpB,oCAAW,yFACT,+DACA,WACA,2CAAO;0KAGa;QAEtB,mCAAW,6EACM,WAAc,mDAAe;0KAGxB;QAEtB,mCAAW,6EACM,WAAc,kDAAc;mKAGvB;QAEtB,yBAAG,yBAAkB;qEACQ;QAC7B;MAEF;IACF","file":"zcl_abapgit_http_client.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_http_digest.clas.mjs":{"lineLengths":[53,36,31,32,51,37,147,143,148,145,143,146,277,695,208,436,207,17,42,22,47,67,72,69,67,69,3,29,121,67,71,73,71,73,45,203,38,16,3,21,71,66,58,68,64,66,58,69,67,69,67,66,149,70,324,23,3,20,46,3,27,67,67,61,69,69,70,106,9,181,17,108,128,14,16,7,5,25,48,19,3,22,121,67,68,166,128,121,133,3,20,121,67,71,69,69,66,67,74,165,159,194,143,162,147,462,162,3,1,66,65,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_http_digest.clas.abap"],"names":[],"mappings":";;AAwDA;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;4CAEoB;IAElB,iBAAS,oLAAqD;IAE9D,qBAAc,WAAW;IAE3B;;EAGA;;;;;;;;;;;;QAEQ,yDAAkB;IAGxB,YAAS,mIAAiC;IAE1C,4CAAW,oBAAoB;IAE/B,iBAAc,6SAA8E;IAE9F;;EAGA;;;;;;;QAEO,4DAAoB;QACpB,4DAAoB;QACpB,6DAAqB;IAE1B,aAAU,uFAAsD;IAEhE;oLAOkC;;;;;;;IAGlC;IAEA,YAAU,OAAO;IACjB;IAEF;;EAGA;;;QAEQ,2DAAoB;IAG1B,cAAW,kJAA2D;;;;EAMxE;EAGA;;;QAEQ,8DAAuB;QACvB,4DAAuB;QACvB,4DAAuB;QACvB,yDAAuB;QACvB,0DAAuB;IAG7B,4CAAW,wBAAmB;IAE9B,eAAY,gJAAyD;IACrE,YAAS,6IAAsD;;;;IAQ/D,iBAAc,4HAKW;IAGzB,wcAOiC;iKAId;EAErB;AACF","file":"zcl_abapgit_http_digest.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_i18n_params.clas.mjs":{"lineLengths":[53,36,31,32,51,37,826,656,1059,1792,1623,198,681,419,514,17,42,22,729,579,3,33,578,56,87,136,14,166,7,5,52,30,3,29,101,88,164,114,103,124,324,100,103,70,102,728,67,52,36,12,63,73,75,51,5,95,16,3,41,67,3,48,578,317,79,93,102,339,66,69,72,30,11,101,43,19,24,46,76,63,15,18,22,11,9,92,19,9,41,79,7,32,5,31,101,271,20,5,22,48,5,29,139,103,90,166,116,105,126,326,102,105,72,104,730,69,264,25,5,43,95,96,114,99,122,124,57,95,66,77,136,121,15,7,67,35,50,104,110,144,19,9,13,107,45,21,26,48,78,65,17,20,24,13,11,94,75,21,11,146,81,32,54,94,75,11,9,7,38,324,77,106,97,68,79,17,9,75,34,52,15,105,47,23,28,50,80,67,19,22,26,15,13,96,83,23,13,148,83,34,56,96,83,13,11,9,7,72,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_i18n_params.clas.abap"],"names":[],"mappings":";;AA4DA;;;;;;;;;;;;;;;;;;;EAGE;;IACE,yBAAG,wBAA6B;MAE9B,yBAAG,cAAS,MAAC,iCAAoC;QAC/C,6BAAqB,iGAA2D;MAClF;QACE,6BAAqB,+HAAsE;MAC7F;IACF;IACA,uBAAqB,uBAAkB;IACzC;;EAGA;;;;;;;;;;;;;;IACE,yBAAG,oBAAwB;MACzB,mBAAY,SAAS;IACvB;MACE,cAAS,MAAC,mBAAwB,gBAAgB;MAClD,cAAS,MAAC,wBAAwB,qBAAqB;MACvD,cAAS,MAAC,2BAAwB,oBAAoB;MACtD,cAAS,MAAC,aAAwB,UAAU;IAC9C;IACA,4CAAO,cAAS,MAAC,yBAA4B;IAC/C;;EAGA;;;;;;;QAEO,oFAAmC;QACnC,6FAAsB;QACtB,0UAAwC;IAE7C,QAAQ,MAAC,UAAO,oCAAG;IACnB,QAAQ,MAAC,YAAS,qCAAI;;;;mGAWG;;;;;;;;;;;;QACvB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;QACF;QAEA,QAAQ,MAAC,SAAM,QAAQ;QACvB,gCAAO,kBAAY,kBAAkB;MAEvC;MAEF;;IAGA;;MAEE,WAAS,gCAAoC,GAA7B,cAAS,MAAC,qBAAqB,wBAAW,iBACrC,GAAlB,cAAS,MAAC,UAAU,uBAAU,yBAC9B,cAAS,MAAC,iCAFJ,CAE0C;MAErD;;IAGA;;;;;;;;;;;;;;;;;;;MAQA;;IAGA;;;;;;;;UAEO,oFAAmB;UACnB,uDAAe;MAEpB,IAAc,QAAe;MAC7B,IAAc,YAAwB;MAEtC,yBAAG,cAAS,MAAC,uBAAiC,yBAAG,mBAA6B;QAC5E;MACF;;;QAGE,aAAW,eAAE,MAAC,MAAK;QACnB,6FAAqE;QACrE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEnB,iBAAuB,GAApB,qBAAsB,uBAAU,iBAAe,GAAX,cAAa,cAAS,MAAC,eAAa;UACzE;QACF;;yGASuB;;;;;;;;;;;;UACvB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;YAEd;UACF;UAGA;;;oDAAgG;UAChG,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;UAEhB;QACF;MAEF;MAGA;;;YAEO,6FAAsB;YACtB,oFAAmB;YACnB,uDAAe;QAEpB,yBAAG,cAAS,MAAC,uBAAgC;UAC3C;QACF;;;UAGE,aAAW,eAAE,MAAC,MAAK;;uGASI;;;;;;;;;;;;YACvB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;cAEd;YACF;YAGA;;;sDAAgG;YAChG,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;YAEhB;UACF;QAEF;MACF","file":"zcl_abapgit_i18n_params.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_injector.clas.mjs":{"lineLengths":[53,33,28,32,48,37,25,235,383,395,235,225,241,233,237,233,245,234,17,42,22,3,29,64,16,3,35,58,3,42,102,70,153,91,352,384,104,39,71,74,27,47,88,54,160,5,64,3,28,51,3,35,132,70,67,3,32,55,3,39,144,82,75,3,31,54,3,38,141,79,73,3,30,53,3,37,138,76,70,3,30,53,3,37,138,76,71,3,34,57,3,41,146,76,75,3,32,55,3,39,102,70,144,82,335,367,101,36,71,74,27,47,88,51,151,5,58,3,31,54,3,38,137,67,69,3,32,55,3,39,138,64,69,3,26,49,3,33,126,64,63,3,1,60,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/zcl_abapgit_injector.clas.abap"],"names":[],"mappings":";;AAgDA;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;QAEQ,uVAAqE;IAC3E,IAAe,qBAAuE;IAEtF;;;;;6CAEwC;IACxC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MAEd,iBAAiB,MAAC,aAAU,UAAU;MAEtC,uJAEoC;IAEtC;IAEA,qBAAmB,MAAC,cAAW,iBAAiB;EAElD;EAGA;;;;;;IACE,mCAAmB,CAAE,eAAa,UAAU;EAC9C;EAGA;;;;;;IACE,mCAAmB,CAAE,mBAAiB,cAAc;EACtD;EAGA;;;;;;IACE,mCAAmB,CAAE,kBAAgB,aAAa;EACpD;EAGA;;;;;;IACE,mCAAmB,CAAE,gBAAc,YAAY;EACjD;EAGA;;;;;;IACE,mCAAmB,CAAE,iBAAe,YAAY;EAClD;EAGA;;;;;;IACE,mCAAmB,CAAE,qBAAmB,YAAY;EACtD;EAGA;;;;;;;;QAEQ,sUAAuD;IAC7D,IAAe,kBAAyD;IAExE;;;;;6CAEwC;IAExC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MAEd,cAAc,MAAC,aAAU,UAAU;MACnC,8IAEiC;IAEnC;IAEA,kBAAgB,MAAC,cAAW,cAAc;EAE5C;EAGA;;;;;;IACE,mCAAmB,CAAE,kBAAgB,SAAS;EAChD;EAGA;;;;;;IAEE,mCAAmB,CAAE,mBAAiB,QAAQ;EAEhD;EAGA;;;;;;IACE,mCAAmB,CAAE,aAAW,QAAQ;EAC1C;AACF","file":"zcl_abapgit_injector.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_integration_git.clas.mjs":{"lineLengths":[53,40,35,32,55,37,25,22,17,42,22,3,29,64,16,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/test/zcl_abapgit_integration_git.clas.abap"],"names":[],"mappings":";;AAGA;;;;;;;;;;;;;;AACA","file":"zcl_abapgit_integration_git.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_item_graph.clas.mjs":{"lineLengths":[53,35,30,32,50,37,881,1603,181,177,909,1322,194,848,17,42,22,784,1527,104,3,25,597,61,595,55,1273,68,66,36,32,69,3,29,816,64,91,16,3,25,597,120,58,599,64,75,31,48,66,163,176,29,119,90,55,31,23,7,5,68,124,50,5,87,22,106,74,19,3,24,100,131,19,3,30,64,64,599,64,24,106,77,215,3,1,64,1288,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_item_graph.clas.abap"],"names":[],"mappings":";;AAuCA;;;;;;;;;;;;;;;;;;;EAGE;;;;;QACO,gvCAA6B;IAClC,4CAAO,kBAAsB;IAC7B,4CAAO,gBAAoB;IAC3B,OAAO,MAAC,UAAO,OAAO;IACtB,OAAO,MAAC,QAAO,KAAK;IACpB,gCAAO,iBAAW,aAAQ;EAC5B;EAGA;;;IACE,oFAA+C;IACjD;;EAGA;;;;QAGO,8kBAAkC;QAClC,uDAAgB;;;MAGnB,aAAW,eAAE,MAAC,MAAK;MACnB;;;;qHAGwB;MACxB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sDACW;QACzB,YAAU,SAAS;QACnB;MACF;IACF;IAEA,iBAAc,GAAX,iBAAa,wBAAU;2HAE6B;MACrD,oBAAa,sBAAS;IACxB;IAEA;oBAA2C;IAC3C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;yEACD;IAEpB;;EAGA;;IACE,YAAU,gCAA4B,GAArB,yBAAO,oBAAgB,gCAA9B,CAAiC;IAC7C;;EAGA;;;QACO,8kBAAkC;IAEvC;sBAAoD;IACpD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;EAMrB;AACF","file":"zcl_abapgit_item_graph.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_item_state.clas.mjs":{"lineLengths":[53,35,30,32,50,37,210,189,187,514,198,199,204,202,2180,1165,17,42,22,113,113,110,3,29,64,16,3,25,109,48,28,3,24,108,357,27,3,17,111,33,20,3,23,48,3,30,109,110,61,109,58,24,74,20,46,25,12,102,5,18,3,18,111,33,20,3,35,2080,76,106,106,186,3,37,1062,82,108,108,188,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_item_state.clas.abap"],"names":[],"mappings":";;AAyCA;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;IACE,qBAAmB,qBAAgB;IACrC;;EAGA;;IACE,oBAAkB,gCAAwB,GAAjB,uBAAmB,wBAC1C,iBAAc,GAAV,gBAAY,wCAAyB,+BAAO,MAAC,WACjD,iBAAc,GAAV,gBAAY,wCAAyB,+BAAO,MAAC,WAFjC,CAE4C;IAChE;;EAGA;;IACE,aAAW,cAAS;IACtB;;EAGA;;;;;;;;;IAEE,WAAS,OAAO;IAChB,iBAAU,GAAP,QAAS,OAAO,yBAAG,OAAiB;MACrC;IACF,gCAAO,OAAiB;MACtB,WAAS,MAAM;IACjB;MACE,WAAS,wCAAyB,+BAAO,MAAC,MAAK;IACjD;IAEF;;EAGA;;IACE,aAAW,cAAS;IACtB;;EAGA;;;IAEE,oBAAY,gFAEqB;IACjC,oBAAY,gFAEqB;IACjC,0BAAmB,gCAAwB,GAAjB,uBAAmB,uBAAU,iBAAyB,GAAtB,YAAY,MAAC,WAAW,uBAA/D,CAA0E;EAE/F;EAGA;;;IAEE,oBAAY,kFAEuB;IACnC,oBAAY,kFAEuB;IACnC,0BAAmB,gCAAwB,GAAjB,uBAAmB,uBAAU,iBAA2B,GAAxB,cAAc,MAAC,WAAW,uBAAjE,CAA4E;EAEjG;AACF","file":"zcl_abapgit_item_state.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_json_handler.clas.mjs":{"lineLengths":[59,53,37,32,32,52,37,25,252,1252,238,238,234,804,1252,1858,1860,17,42,22,3,29,64,16,3,28,72,70,544,73,984,88,46,58,67,126,35,107,209,64,76,68,94,76,3,47,126,61,72,72,152,85,134,101,139,91,130,5,154,3,37,984,88,126,61,72,759,323,75,37,115,81,72,75,29,48,90,128,7,5,3,43,126,61,100,114,151,196,145,144,158,3,47,126,61,72,72,150,291,68,163,77,154,67,5,152,3,37,984,88,126,61,72,759,323,75,37,115,81,72,75,29,48,90,128,7,5,3,43,126,61,100,114,155,197,146,145,56,152,3,26,71,46,58,984,88,546,79,419,67,126,154,244,55,46,335,64,68,94,139,287,108,21,3,29,544,73,126,61,72,319,70,32,110,75,124,7,5,3,1,68,350,580,776,1001,344,563,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/aff/zcl_abapgit_json_handler.clas.abap"],"names":[],"mappings":";;;AAiGA;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;QACO,0DAAsB;QACtB,qHAAwC;IAE7C,sBAAM,OAAO;IAEb,aAAU,wFAAyD;IAEnE,cAAW,6LACmD;+DAEJ;2EAEV;mEACc;6FAEA;2EAET;EAEvD;EAGA;;;QAEI,+DAAwB;QACxB,+DAAwB;IAG1B,kBAAe,gIAAuD;IACtE,iBAAgB,GAAb,cAAe,4CAAU;MAC1B,iBAAe,yCAA0B,qDAA4B,MAAC,SAAQ;IAChF,wBAAoB,GAAb,cAAe,qDAAkB;MACtC,iBAAe,yCAA0B,iDAAwB,MAAC,kBAAiB;IACrF,wBAAoB,GAAb,cAAe,2CAAS;MAC7B,iBAAe,yCAA0B,iDAAwB,MAAC,SAAQ;IAC5E;yJAG8C;EAChD;EAGA;;;;;QAEI,+DAA2B;QAC3B,8uBAAoC;QACpC,0TAAyC;;;MAIzC,kBAAe,yFAA4C;MAC3D;;;;8CAAgF;MAChF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;+HAEoC;MACnD;IACF;EACF;EAGA;;;QAEI,2FAA+B;QAC/B,yGAAkC;IAGpC,qBAAkB,4HAAmD;;;;6JASf;EACxD;EAGA;;;QAEI,+DAAwB;QACxB,+DAAwB;IAG1B,kBAAe,8HAAqD;IACpE,iBAAgB,GAAb,cAAe,yCAA0B,qDAA4B,MAAC,UACvE,iBAAgB,GAAb,cAAe,yCAA0B,iDAAwB,MAAC,UAAQ;MAC7E,iBAAe,2CAAU;IAC3B,wBAAoB,GAAb,cAAe,yCAA0B,iDAAwB,MAAC,mBAAiB;MACxF,iBAAe,oDAAkB;IACnC,wBAAoB,GAAb,cAAe,yCAA0B,iDAAwB,MAAC,UAAQ;MAC/E,iBAAe,0CAAS;IAC1B;uJAG8C;EAChD;EAGA;;;;;QAEI,+DAA2B;QAC3B,8uBAAoC;QACpC,0TAAyC;;;MAIzC,kBAAe,yFAA4C;MAC3D;;;;8CAAgF;MAChF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;+HAEoC;MACnD;IACF;EACF;EAGA;;;QAEI,2FAA+B;QAC/B,yGAAkC;IAGpC,0BAAuB,2HAAkD;;;;IAQzE;uJAEiD;EACnD;EAGA;;;;;;;;QACQ,0ZAAwC;QACxC,0DAAwB;QACxB,qHAA0C;QAC1C,iJAAuC;IAE7C,IAAe,aAAqC;;IAGtB,aAAW,MAAC,cAAzB,OAA8B;IAE/C,cAAW,2TAGmD;+DAEJ;mEACI;6FAED;;IAK7D,mCAAU,uMAA2D,uCAAwB,QAAO;IAEpG,eAAY,uFAAsD;IACpE;;EAGA;;;;;QAEI,+DAAwB;QACxB,sTAAoC;;;MAIpC,kBAAe,oFAAuC;MACtD,iBAAgB,GAAb,cAAe,gCAAE;2HAEgC;MACpD;IACF;EACF;AACF","file":"zcl_abapgit_json_handler.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_json_handler.clas.locals.mjs":{"lineLengths":[53,48,22,32,72,63,604,459,618,17,42,22,507,124,3,51,100,740,61,102,64,163,67,78,158,127,27,70,268,43,21,12,111,70,29,43,270,44,23,7,5,288,43,21,5,383,43,21,5,40,19,3,29,506,79,300,101,87,88,56,95,5,16,3,1,78,388,70,69,70,304,513,24,65],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/aff/zcl_abapgit_json_handler.clas.locals_imp.abap"],"names":[],"mappings":";;AAiBA;;;;;;;;;;;;;EAEE;;;;;;;QAEO,0DAAmB;IAExB,kCAAU,OAAO,MAAC,MAAQ,OAAO,MAAC,MAAI;IAEtC;;;oEAA6F;IAC7F,iBAAmB,GAAhB,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,GAAwB,uBACzB,iBAAa,GAAT,UAAW,yCAA0B,mCAAU,MAAC,OAAK;MACzD,YAAU,uBAAU;MACpB;IACF;MACE;;;yCAAuE;MACvE,iBAAmB,GAAhB,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,GAAwB,uBACzB,iBAAa,GAAT,UAAW,yCAA0B,mCAAU,MAAC,OAAK;QACzD,YAAU,sBAAS;QACnB;MACF;IACF;IAEA,iBAAgB,GAAb,OAAO,MAAC,OAAO,wCAAO,iBAAkB,GAAd,OAAO,MAAC,QAAQ,yCAAQ,iBAAa,GAAT,UAAW,yCAA0B,mCAAU,MAAC,OAAK;MAC5G,YAAU,uBAAU;MACpB;IACF;IAIA,IAAG,CAAI,CAAE,cAAW,GAAT,UAAW,yCAA0B,mCAAU,MAAC,OAAM,yBAAI,OAAO,MAAC,iBAAqB,CAAE,IAC/F,cAAW,GAAT,UAAY,yCAA0B,mCAAU,MAAC,OAAM,iBAAqB,GAAjB,OAAO,MAAC,WAAW,gCAAE,CAAE,CAAC;MACxF,YAAU,uBAAU;MACpB;IACF;IAEA,YAAU,sBAAS;IAErB;;EAEA;;;QAEO,mSAA6C;IAClD,qBAAqB,MAAC,UAAO,0DAA6B;IAC1D,qBAAqB,MAAC,WAAQ,2CAAU;IAExC,gCAAO,+BAAyB,kBAAa;IAE7C,yBAAG,wBAA4B;MAC7B,gCAAgB,oCAAiB,kBAAa;IAChD;IACF;;AAEF","file":"zcl_abapgit_json_handler.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_log.clas.mjs":{"lineLengths":[53,28,23,32,43,54,1366,145,372,394,763,161,351,17,42,22,1269,69,93,99,3,29,68,64,63,16,3,31,49,3,38,116,98,52,77,47,71,5,18,3,36,78,526,58,350,56,65,31,40,213,60,14,84,60,17,152,79,62,9,17,14,17,7,5,21,3,36,44,55,76,61,109,597,61,100,58,1118,51,48,49,39,43,28,211,116,82,118,150,115,12,112,5,3,42,44,55,597,61,118,3,46,100,58,597,61,100,66,23,59,22,18,51,61,136,66,42,14,14,7,5,50,3,41,44,55,597,61,118,3,44,44,55,597,61,118,3,44,44,55,597,61,118,3,33,39,3,33,120,116,102,41,23,18,3,33,64,57,20,3,43,1532,1116,320,1289,1319,70,31,44,55,78,199,212,29,155,90,86,46,7,36,57,57,91,5,73,39,113,64,38,68,78,93,7,5,26,3,41,64,1118,90,70,35,135,94,14,79,55,7,5,20,3,40,643,433,1118,70,35,61,61,70,70,61,63,5,66,18,3,38,78,1116,85,70,31,50,213,92,14,84,94,17,152,113,91,9,17,14,114,7,5,21,3,37,68,32,41,59,5,20,3,43,120,120,58,68,76,114,116,1273,49,49,75,45,133,88,14,96,7,5,24,18,3,42,120,46,61,32,24,18,3,1,50,303,59,62,64,324,63,62,65,63,1094,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_log.clas.abap"],"names":[],"mappings":";;AAyCA;;;;;;;;;;;;;;;;;;;EAGE;;;8DAEuC;IAEvC;;EAGA;;;;;;;;IAIE,yBAAG,eAAa;sEAC+B;IAC/C;IAEF;;EAGA;;;;QAEO,qVAA0C;IAC/C,cAAY,oCAAG;;;MAEb,IACE,OAGA,AAGA,KAPG,MAAM,OAAE,IAAb;;QAEI,cAAY,oCAAG;QACf;;QAEA,cAAY,oCAAG;QACf;;QAEA,iBAAa,GAAV,WAAa,qCAAG;UACjB,cAAY,oCAAG;QACjB;QACA;;QAEA;;IAEN;IAEF;;EAGA;;;;;;;;;;IAEE,IAAe,UAA4B;;IAG3C,UAAQ,MAAC,IAAG,MAAC,UAAQ,MAAM;IAC3B,UAAQ,MAAC,IAAG,MAAC,UAAQ,OAAO;IAC5B,UAAQ,MAAC,UAAY,OAAO;IAC5B,UAAQ,MAAC,eAAY,MAAM;IAE3B,IACE,OAEA,AAEA,KALG,OAAL;;MAEI,UAAQ,MAAC,IAAG,MAAC,WAAQ,gCAAiB,2BAAW,MAAC,MAAK;;MAEvD,UAAQ,MAAC,IAAG,MAAC,WAAQ,gCAAiB,2BAAW,MAAC,QAAO;;MAEzD,UAAQ,MAAC,IAAG,MAAC,WAAQ,gCAAiB,2BAAW,MAAC,KAAI;;MAEtD,oCAAS,GAAF,iCAAI,gCAAC;;EAGlB;EAGA;;;;;qHAKuB;EAEvB;EAGA;;;;;QAEO,2FAA0B;QAC1B,yDAAkB;IACvB,WAAS,MAAM;;;;;MAEb,YAAS,yCAAmB;uIAIW;MACvC,yBAAG,MAAM,OAAE,mBAAiB;QAC1B,WAAS,MAAM,OAAE,QAAQ;MAC3B;QACE;MACF;IACF;;EAEF;EAGA;;;;;qHAKuB;EAEvB;EAGA;;;;;qHAKuB;EAEvB;EAGA;;;;;qHAKuB;EAEvB;EAGA;IACE,sBAAM,WAAM;EACd;EAGA;;QAEO,2GAAkC;;IAGvC,MAAM,OAAE,WAAS,WAAM;IACvB,WAAS,MAAM;IAEjB;;EAGA;;IACE,aAAW,yBAAO,aAAQ;IAC5B;;EAGA;;QAEO,mlCAAiC;QACjC,uTAA2C;QAC3C,gwCAAuD;QACvD,8xCAA8D;;;MAIjE,sBAAM,cAAc;MACpB,cAAc,MAAC,UAAO,MAAM,OAAE,IAAI;MAClC;;;;yJAE0D;MAC1D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,2EAA+C;QACV,sBAApB,cAAkC;MACrD;MACA,sBAAM,MAAM;MACZ,MAAM,MAAC,UAAO,MAAM,OAAE,GAAG,MAAC,KAAI;MAC9B,MAAM,MAAC,UAAO,MAAM,OAAE,GAAG,MAAC,KAAI;MAC9B,kFAAiD;IACnD;;;MAIE,cAAc,OAAE,YAAS,wEAA+C;MACxE,yBAAG,cAAc,OAAE,SAAmB;QACpC,sBAAM,MAAM;QACZ,MAAM,MAAC,UAAO,oCAAG;QACjB,MAAM,MAAC,UAAO,8CAAY;QAC1B,kFAAiD;MACnD;IACF;IAEF;;EAGA;;IAEE,IAAc,UAA4B;IAE1C,aAAW,gCAAiB,2BAAW,MAAC,MAAK;;;MAG3C,iBAAsB,GAAnB,UAAQ,MAAC,IAAG,MAAC,QAAQ,gCAAiB,2BAAW,MAAC,OAAK;QACxD,aAAW,gCAAiB,2BAAW,MAAC,MAAK;QAC7C;MACF,wBAA0B,GAAnB,UAAQ,MAAC,IAAG,MAAC,QAAQ,SAAQ;QAClC,aAAW,UAAQ,MAAC,IAAG,MAAC,MAAK;MAC/B;IACF;IAEF;;EAGA;;QACO,waAAsC;IAC3C,IAAc,UAAoB;;;MAEhC,MAAM,MAAC,UAAY,UAAQ,MAAC,IAAG,MAAC,KAAI;MACpC,MAAM,MAAC,UAAY,UAAQ,MAAC,IAAG,MAAC,KAAI;MACpC,MAAM,MAAC,cAAY,UAAQ,MAAC,KAAI,MAAC,SAAQ;MACzC,MAAM,MAAC,cAAY,UAAQ,MAAC,KAAI,MAAC,SAAQ;MACzC,MAAM,MAAC,eAAY,UAAQ,MAAC,UAAS;MACrC,gCAAO,gBAAU,MAAM;IACzB;;IAEF;;EAGA;;QAEO,mlCAAyB;IAC9B,cAAY,gCAAiB,wBAAQ,MAAC,GAAE;;;MAEtC,IACE,OAGA,AAGA,KAPG,MAAM,OAAE,GAAG,MAAC,KAAjB;;QAEI,cAAY,gCAAiB,wBAAQ,MAAC,MAAK;QAC3C;;QAEA,cAAY,gCAAiB,wBAAQ,MAAC,QAAO;QAC7C;;QAEA,iBAAa,GAAV,WAAa,gCAAiB,wBAAQ,MAAC,SAAO;UAC/C,cAAY,gCAAiB,wBAAQ,MAAC,GAAE;QAC1C;QACA;;QAEA,oCAAS,GAAF,iCAAI,gCAAC;;IAElB;IAEF;;EAGA;;IACE,aAAW,aAAQ;IACnB,yBAAG,SAAmB;MACpB,aAAW,sCAAK;IAClB;IACF;;EAGA;;;;;;;QAEO,2GAAkC;QAClC,gvCAA+B;IAEpC,yBAAG,iBAAe;iCAChB,QAAU,MAAM;MAChB,iBAAgB,GAAb,cAAe,gCAAC;QACjB,gBAAc,MAAM,OAAE,MAAM;;QAE5B,gCAAgB,kCAAe,WAAM;MACvC;QACE,gCAAgB,MAAM,OAAE,6BAAU,WAAM;MAC1C;IACF;IAEA,WAAS,OAAE;IAEb;;EAGA;;;;IACE,kBAAW,QAAQ;IACnB,WAAS,OAAE;IACb;;AACF","file":"zcl_abapgit_log.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_log_viewer.clas.mjs":{"lineLengths":[53,35,30,32,50,37,1626,1814,1405,1403,1406,1409,260,1508,63,1544,210,372,212,17,42,22,48,3,29,64,16,3,31,56,3,38,1342,205,88,35,70,83,82,96,7,66,79,82,96,7,68,81,82,96,7,71,84,82,96,7,5,3,25,50,3,32,1310,58,68,67,30,78,49,81,53,83,47,86,50,5,3,37,62,3,44,92,1310,58,132,83,67,110,31,3,31,56,3,38,1310,58,85,3,28,53,3,35,1310,58,82,3,34,59,3,41,1310,58,83,3,30,55,3,37,59,46,66,55,130,1342,68,13,5,72,30,106,9,67,17,106,24,156,14,16,7,5,3,40,65,3,47,1531,120,58,647,467,1310,129,132,72,69,35,36,50,61,44,213,67,84,70,152,69,14,72,7,71,13,82,94,83,11,21,110,18,20,11,9,13,77,78,79,74,70,11,21,110,18,20,11,9,7,59,59,72,5,22,3,25,50,3,32,120,58,1340,112,114,83,132,117,136,347,107,128,94,88,31,123,51,7,5,9,114,61,41,136,57,44,101,39,108,90,107,93,112,94,108,98,110,97,113,100,68,114,99,114,99,14,114,77,114,77,7,161,8,14,7,90,110,77,7,163,8,14,7,90,112,77,7,165,8,14,7,90,114,77,7,166,8,14,7,90,115,77,7,165,210,141,64,53,82,35,17,90,24,156,14,16,7,5,3,30,55,3,37,1310,58,132,58,238,237,66,55,13,5,9,69,17,106,15,14,16,7,5,77,113,70,62,91,91,53,78,73,54,57,57,57,57,9,181,130,146,41,17,22,44,61,13,16,20,9,7,72,65,7,5,26,51,5,33,125,122,60,649,469,70,69,81,107,23,7,74,71,37,46,79,68,67,86,64,65,16,64,65,9,145,74,84,105,7,21,5,28,53,5,35,122,60,649,469,69,74,71,37,133,265,16,155,9,55,7,5,3,66,1544,1331,1549,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_log_viewer.clas.abap"],"names":[],"mappings":";;AA6FA;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;IAEE,IAAe,UAA4B;QACrC,oMAA4C;;;MAIhD,yBAAG,UAAQ,MAAC,oBAAuB;QACjC,YAAY,MAAC,gBAAa,uCAAU;QACpC,YAAY,MAAC,WAAa,oCAAqB,OAAO;QACtD,qFAAiD;MACnD;MAEA,yBAAG,UAAQ,MAAC,gBAAmB;QAC7B,YAAY,MAAC,gBAAa,mCAAM;QAChC,YAAY,MAAC,WAAa,oCAAqB,OAAO;QACtD,qFAAiD;MACnD;MAEA,yBAAG,UAAQ,MAAC,kBAAqB;QAC/B,YAAY,MAAC,gBAAa,qCAAQ;QAClC,YAAY,MAAC,WAAa,oCAAqB,OAAO;QACtD,qFAAiD;MACnD;MAEA,yBAAG,UAAQ,MAAC,qBAAwB;QAClC,YAAY,MAAC,gBAAa,wCAAW;QACrC,YAAY,MAAC,WAAa,oCAAqB,OAAO;QACtD,qFAAiD;MACnD;IAEF;EAEF;EAGA;;;;;;;;IAEE,IACE,OAIA,AAIA,AAIA,KAbG,SAAL;;gDAG2B;;oDAII;;8CAIN;;iDAIG;;EAI9B;EAGA;;;;;;;QAGI,2HAA4C;IAE9C,4CAAO,MAAM,MAAC,qBAAkB;+BAChC,YAAc,MAAM,MAAC,UAAS;;IAMhC;;EAGA;;;;;;oFAEmD;EAEnD;EAGA;;;;;;iFAEgD;EAEhD;EAGA;;;;;;kFAEiD;EAEjD;EAGA;;;;;;;;QAEQ,yHAA0C;IAChD,IAAe,UAAwB;IAEvC,yBAAG,IACH,yBAAG,OAAiB;MAClB;IACF;IAEA;4BAC2B;IAC3B,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB;kEAG4B;;;;;;;;IAI5B;EAEF;EAGA;;;;;;;QAEQ,8nBAAiD;QACjD,0cAAuD;QACvD,qxCAA+B;QAC/B,wHAA2C;QAC3C,2HAAiD;IAEvD,gBAAa,kDAAuB;;;MAIlC,sBAAO,MAAM;MAEb,MAAM,MAAC,SAAM,UAAU,OAAE,IAAI;MAC7B,MAAM,MAAC,eAAY,UAAU,OAAE,SAAS;MAExC,IACE,OAEA,AAEA,KALG,UAAU,OAAE,IAAjB;;QAEI,MAAM,MAAC,UAAO,mCAAY;;QAE1B,MAAM,MAAC,UAAO,sCAAe;;QAE7B,MAAM,MAAC,UAAO,qCAAc;;QAE5B,MAAM,MAAC,UAAO,wCAAiB;;MAGnC,yBAAG,UAAU,OAAE,oBAAkB;QAE/B;qCACI,iBAAmB,UAAU,OAAE,SAAS;UAExC,yBAAG,eAAe,OAAE,kCAAsB;YACxC,MAAM,MAAC,UAAO,+CAAwB;UACxC;;;;;;QAGJ;QAEA;qCACI,YAAc,UAAU,OAAE,SAAS;UAEnC,yBAAG,UAAU,OAAE,uBAA2B;YACxC,MAAM,MAAC,cAAY,uCAAgB;YACnC,MAAM,MAAC,eAAY,iCAAU;YAC7B,MAAM,MAAC,YAAY,gCAAS;UAC9B;;;;;;QAGJ;MAEF;MAEA,MAAM,MAAC,cAAW,UAAU,OAAE,QAAQ;MACtC,MAAM,MAAC,cAAW,UAAU,OAAE,QAAQ;MAEtC,+DAAmC;IAErC;IAEF;;EAGA;;;;;;QAEQ,mzCAAqC;QACrC,uGAAwC;QACxC,yGAAwC;QACxC,0EAAmD;QACnD,2HAAgD;QAChD,4GAAyC;QACzC,+HAAiD;QACjD,kVAAyD;QACzD,kGAA6B;QAC7B,uHAA+C;IAErD,mCAAS,qDAAiC;;;MAIxC,yBAAG,MAAM,OAAE,mBAAwB,yBAAG,MAAM,OAAE,mBAAuB;QACnE,mBAAiB,sBAAS;MAC5B;IACF;IAEA;iHAK+B;MAE3B,kBAAe,mCAAwB;wCACf;uIAEgD;MAExE,gBAAa,iCAAsB;2CAER;oGACoB;sCAEzB;MAEtB,eAAY,qFAAgC;yFACR;MAEpC,eAAY,oFAA+B;4FACJ;MAEvC,eAAY,yFAAoC;6FACR;MAExC,eAAY,qFAAgC;iGACA;MAE5C,eAAY,uFAAkC;gGACH;MAE3C,eAAY,0FAAqC;mGACH;MAE9C,iBAAkB,GAAf,gBAAiB,uBAAS;QAC3B,eAAY,yFAAoC;kGACL;QAE3C,eAAY,yFAAoC;kGACL;MAC7C;QAEE,eAAY,yFAAoC;4EACX;QAErC,eAAY,yFAAoC;4EACX;MACvC;;;QAIE;MACF;MACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,eAAY,qFAAgC;4EACP;MACvC;;;QAGE;MACF;MACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,eAAY,uFAAkC;4EACT;MACvC;;;QAGE;MACF;MACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,eAAY,yFAAoC;4EACX;MACvC;;;QAGE;MACF;MACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,eAAY,0FAAqC;4EACZ;MACvC;MAEA,iBAAc,4IAEI;iNAK4C;;+DAMrB;MAEzC,cAAW,+BAAoB;MAE/B;kCAEkB;;;;;;;;IAItB;EAEF;EAGA;;;;;;QAEQ,2HAA4C;QAE5C,iDAAgC;QAChC,qOAAkC;QAClC,oOAAiC;QACjC,yDAA6B;IAEnC,yBAAG,MAAM,MAAC,WAAsB;MAC9B;IACF;IAEA;iCACI,YAAc,MAAM,MAAC,UAAS;;;;;;;IAGlC;IAEA,mBAAmB,UAAU,OAAE,uBAAuB,MAAC,MAAK;0BAC5D,iCAAmB,UAAU,OAAE,uBAAuB,MAAC,MAAK;IAE5D,YAAY,MAAC,UAAa,oCAAG;IAC7B,YAAY,MAAC,WAAa,eAAE,MAAC,MAAK;IAClC,YAAY,MAAC,eAAa,UAAU,OAAE,uBAAuB,MAAC,MAAK;IACnE,YAAY,MAAC,eAAa,UAAU,OAAE,uBAAuB,MAAC,MAAK;IACnE,YAAY,MAAC,aAAa,MAAM,MAAC,IAAG;IACpC,YAAY,MAAC,WAAa,2CAAU;IACpC,YAAY,MAAC,YAAa,qCAAI;IAC9B,YAAY,MAAC,gBAAa,cAAc;IACxC,YAAY,MAAC,WAAa,UAAU,OAAE,KAAK;IAC3C,YAAY,MAAC,WAAa,UAAU,OAAE,KAAK;IAC3C,YAAY,MAAC,WAAa,UAAU,OAAE,KAAK;IAC3C,YAAY,MAAC,WAAa,UAAU,OAAE,KAAK;;;;;;;;;;;;;;;MAW3C,yBAAG,eAAE,MAAC,iBAAoB;gEACY;MACtC;IAEF;IAGA;;;;;;;UAEQ,8nBAA4C;UAC5C,0cAAkD;UAClD,2DAAsB;UACtB,0DAAsB;;MAI5B,iBAAoB,IAAjB,6CAAmB,gCAAC;QACrB;MACF;MAEA,gBAAa,kDAAuB;;;QAGlC,IACE,OAGA,KAJG,UAAU,OAAE,IAAjB;;UAEI,YAAW,4CAAW;UACtB,aAAW,0CAAS;;UAEpB,YAAW,wCAAO;UAClB,aAAW,wCAAO;;UAElB,YAAW,wCAAO;UAClB,aAAW,wCAAO;;gJAGuB;yEACjB;mFACI;wGACP;MAC3B;MAEF;;IAGA;;;;;;UAEQ,8nBAA4C;UAC5C,0cAAkD;UAClD,0DAAsB;MAE5B,gBAAa,kDAAuB;;;QAGlC,yBAAG,UAAU,OAAE,mBAAwB,yBAAI,UAAU,OAAE,mBAAuB;UAC5E,6PAA0G;QAC5G;UACE,+IAAsD;QACxD;QACA,sBAAS,OAAO;MAClB;IAEF;EACF","file":"zcl_abapgit_log_viewer.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_login_manager.clas.mjs":{"lineLengths":[53,38,33,32,53,37,581,279,268,268,49,480,259,17,42,22,53,3,29,64,16,3,23,51,3,30,66,58,67,61,332,85,125,69,27,42,88,76,96,51,5,3,17,45,3,24,61,3,20,48,3,27,67,66,58,300,85,79,66,69,27,42,88,47,5,19,3,21,49,3,28,76,66,58,300,85,79,66,69,27,42,88,56,5,28,3,21,49,3,28,66,58,76,88,59,69,5,3,20,48,3,27,67,66,58,71,73,71,73,69,67,81,21,5,127,111,145,58,19,3,1,70,500,318,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_login_manager.clas.abap"],"names":[],"mappings":";;AA2DA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;IAEE,IAAe,WAA8B;IAE7C;;;;wCACwB;IACxB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;MAEd,WAAS,MAAC,UAAgB,6DAA+B;MACzD,WAAS,MAAC,mBAAgB,OAAO;IACnC;EAEF;EAGA;;;;IAEE,sBAAM,iCAAO;EAEf;EAGA;;;;;;;QAEO,mSAA4B;IAEjC;;;;;wCAA8E;IAC9E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,YAAU,OAAO,MAAC,cAAa;IACjC;IAEF;;EAGA;;;;;;;QAEO,mSAA4B;IAEjC;;;;;wCAA8E;IAC9E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,qBAAmB,OAAO,MAAC,cAAa;IAC1C;IAEF;;EAGA;;;;;;;;IAEE,yBAAO,2BAA2B;oEAEI;IACtC;EAEF;EAGA;;;;;;;;;;;QAEQ,4DAAqB;IAE3B,4CAAW,iBAAiB;IAE5B,yBAAG,YAAuB,yBAAG,YAAsB;MACjD;IACF;IAEA,sCAAY,aAAY,sCAAI,sBAAiB,SAAS;IAEtD,aAAU,4FAA2C;IAErD,sCAAY,0CAAQ,kBAAa,OACb;yDAGO;IAE7B;;AACF","file":"zcl_abapgit_login_manager.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_longtexts.clas.mjs":{"lineLengths":[53,34,29,32,49,60,209,353,3833,17,42,22,73,3,29,64,16,3,28,53,57,82,52,79,34,118,95,88,95,5,184,21,3,21,2537,52,79,57,82,682,64,110,91,116,108,85,111,2319,53,682,496,110,96,29,71,135,7,64,71,356,14,300,7,12,135,5,160,37,41,48,180,129,306,69,68,69,68,68,68,69,68,68,7,79,5,24,3,49,97,58,82,57,82,682,64,2537,2351,168,83,35,88,60,42,62,7,5,19,3,45,58,82,57,82,682,53,496,110,275,67,37,11,181,130,186,43,19,24,46,71,63,15,18,22,11,9,92,67,9,7,5,52,78,90,137,54,81,59,84,134,60,112,90,2539,55,684,60,2353,498,112,104,73,42,124,184,133,322,7,277,69,39,327,322,31,205,92,15,185,134,190,47,23,28,50,75,67,19,22,26,15,13,96,71,13,11,9,7,52,2541,80,92,139,56,83,61,86,686,68,138,62,144,86,206,42,30,9,106,28,7,5,66,128,55,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_longtexts.clas.abap"],"names":[],"mappings":";;AAoCA;;;;;;;;;;;;;;;;EAGE;;;;;;IAEE,cAAY,cAAc;IAE1B,iBAA4C,GAAzC,4EAA4C,eAAc;4BAE3D,6BAAe,oCAAG;IACpB,wBAAY,GAAL,uCAAQ,eAAc;4BAC3B,6BAAe,oCAAG;IACpB;IAEA,cAAY,sBACV,KAAO,WACP,KAAO,sCACP,MAAO,uCACP,KAAO,iCAAG;IACd;;EAGA;;;;;;;;;;;;;;QAEQ,swEAAmD;QACnD,4CAA6B;QAC7B,iqBAAqD;IAE3D,IAAe,YAAgC;IAE/C,eAAY,yFAEuB;IAEnC,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;MAEtB,aAAW,QAAQ;MAEnB,iBAAqB,GAAlB,mBAAoB,uBAAS;;MAEhC;IAEF,gCAAO,yBAA6B;MAClC,iBAAqB,GAAlB,mBAAoB,uBAAS;QAC9B;MAMF;QACE;MAKF;IACF;sIAEuE;IAEvE;;;MAKE,sBAAO,WAAW;MAElB,WAAW,MAAC,WAAQ,YAAU;;;;MAc9B,iBAAmB,GAAhB,iBAAkB,uBAAS;QAC5B,sBAAO,WAAW,MAAC,KAAI,MAAC,QAAO;QAA/B,sBACO,WAAW,MAAC,KAAI,MAAC,SAAQ;QADhC,sBAEO,WAAW,MAAC,KAAI,MAAC,QAAO;QAF/B,sBAGO,WAAW,MAAC,KAAI,MAAC,QAAO;QAH/B,sBAIO,WAAW,MAAC,KAAI,MAAC,QAAO;QAJ/B,sBAKO,WAAW,MAAC,KAAI,MAAC,SAAQ;QALhC,sBAMO,WAAW,MAAC,KAAI,MAAC,QAAO;QAN/B,sBAOO,WAAW,MAAC,KAAI,MAAC,QAAO;MACjC;MAEA,sEAA0C;IAE5C;IAEF;;EAGA;;;;;;;;QAEQ,g+EAAqD;IAC3D,IAAe,eAAqD;IAEpE,kBAAe,gJAGoC;IAEnD;iCAAuD;IACvD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,YAAU,eAAa,MAAC,KAAI,MAAC,QAAO;MACpC,yBAAG,QAAkB;QACnB,YAAU,eAAa,MAAC,KAAI,MAAC,QAAO;MACtC;IACF;IAEF;;EAGA;;;;;QAEQ,iqBAAmD;QACnD,4CAA2B;IAEjC,IAAe,YAAqB;IAEpC,eAAY,yFAEuB;IAEnC;;;;;;;;;;;;;;;;;;QAiBE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;MAEF;IAEF;IAGA;;;;;;;;;;;;UAEQ,g+EAAwD;UACxD,4CAAiC;UACjC,iqBAAyD;UACzD,iDAAqC;MAE3C,IAAe,eAAqD;MAApE,IACe,YAAwB;MAEvC,eAAY,yFAEuB;uGAMP;;;QAI1B,oBAAkB,gCAAwB,GAAjB,kBAAoB,eAAa,MAAC,MAAK,MAAC,OAA/C,CAAsD;;;;MAY1E;MAIA;;;QAOE;;;2MAI+B;QAC/B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;;;;;;;;;;;;;;;YAWd,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sEACsB;YACtC;UACF;QAEF;MAEF;MAGA;;;;;;;;;;;;;;;QAEE,kBAAe,kLAGwE;QAEvF,+BAA2B;UACzB;QACF;yGAGqC;QAEvC;;IACF","file":"zcl_abapgit_longtexts.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_news.clas.mjs":{"lineLengths":[53,29,24,32,44,37,853,155,156,154,147,184,865,1262,370,844,193,198,196,195,403,17,42,22,756,79,80,78,56,3,29,72,70,79,97,78,94,262,69,553,121,123,56,18,5,109,99,107,82,26,58,16,3,23,42,3,30,123,119,61,71,25,75,38,78,41,136,890,70,72,66,140,129,540,103,25,5,56,79,56,51,87,5,43,11,127,66,141,9,19,108,44,16,18,9,7,5,43,25,5,173,9,79,17,106,27,14,16,7,5,271,36,257,12,5,131,211,5,23,3,19,755,28,18,3,25,103,125,91,27,64,90,22,3,20,103,129,22,3,22,103,206,22,3,23,103,205,22,3,26,70,43,22,3,22,41,3,29,755,262,64,78,94,63,115,70,548,99,67,36,106,179,17,7,77,59,172,54,9,7,76,172,74,87,18,18,11,9,45,14,45,7,63,5,18,3,27,46,3,34,548,67,61,78,94,77,93,70,108,20,5,101,60,102,43,57,133,12,101,107,5,35,18,3,1,52,78,38,557,765,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_news.clas.abap"],"names":[],"mappings":";;AA4EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,6PAA6B;QAC7B,4DAAuB;QACvB,giBAA+B;IAGrC,6BAAsB,sFAAoD;IAC1E,8BAAsB,uFAAqD;IAC3E,yBAAG,wBAA6B;MAC9B;IACF;IAEA,eAAY,wFAAyD;IACrE,cAAY,+EAA8C;IAC1D,iBAAY,oFACgD;IAE5D;wBAA0C;IAC1C,2BAAoB,WAAW,MAAC,QAAO;IAEzC;;EAGA;;;;;;;QAGI,8DAAwC,CAAA;;QACxC,kEAAiD,CAAA;;QACjD,qEAAiD,CAAA;;QAE7C,+HAAwD;QACxD,i3BAAiE;QACjE,6DAA+B;QAC/B,+DAA+B;QAC/B,yDAA+B;QAC/B,mIAAuD;QACvD,wHAAiF;IAEvF,IAAc,WAAgC;IAG9C,iBAA0B,IAAvB,oDAAyB,uBAAS;MACnC;IACF;+BAEA,gBAAkB,OAAO;IACzB,YAAkB,6DAA0B;IAE5C,cAAW,oCAAyB;IACpC,yBAAG,mBAAiB;MAClB,iBAAa,uDAAqC,OAAO;IAC3D;IAEA,yBAAG,WAAqB;MACtB;QACI,yBAAsB,4FAAoD;QAC1E,yBAAG,8BAAkC;UACnC,gBAAa,iHAAsE;QACrF;;;;;;;MAGJ;IACF;IAEA,yBAAG,WAAqB;MACtB;IACF;IAEA,kBAAe,qJAAkF;IAEjG;MACI,eAAY,wDAA4B;;;;;;;IAG5C;;;;MAWE;IAEF;IAEA,yBAAG,sBAAqB,iBAAiB,GAAb,eAAgB,0CAA8B;kNAGzB;IACjD;IAEF;;EAGA;;IACE,WAAS,WAAM;IACjB;;EAGA;;IACE;;;8DAA0E;IAC1E,eAAa,wCAAO,eAAE,MAAC,OAAV,CAA4B;IAC3C;;EAGA;;IACE,eAAa,gCAAuB,GAAhB,yBAAO,eAAW,gCAAzB,CAA4B;IAC3C;;EAGA;;IACE,eAAa,gCAEkB,IAFX,oHAEa,gCAFpB,CAEuB;IACtC;;EAGA;;IACE,eAAa,gCAEiB,IAFV,mHAEY,gCAFnB,CAEsB;IACrC;;EAGA;;IACE,eAAa,sBAAiB;IAChC;;EAGA;;;;;;;;;QAEQ,sDAA6B;QAC7B,0GAAqC;QACrC,6DAAkC;QAClC,2hBAA0C;IAEhD,IAAe,WAA+B;;;MAI5C,YAAS,sFACqD;MAG9D,2BAAM,iBAAsB,IACtB,cAAyB,GAAvB,wBAAyB,uBAAU,yBAAG,MAAM,MAAC,mBAAuB;iBAAC;;MAE7E,iBAA0B,GAAvB,wBAAyB,wBAAU;QACpC,2BAAyB,sBAAS;QAClC,iBAC6D,IAD1D,4GAC6D,gCAAC;UAC/D,YAAU,8BAAa;QACzB;MACF;MAEA,iBAAoB,GAAjB,MAAM,MAAC,YAAY,uBAAS;QAE7B,iBAC6D,IAD1D,4GAC6D,gCAAC;UAC/D,iBAAW,GAAR,SAAU,gCAAC;YACZ,YAAkB,qBAAR,QAAU,gCAAC;UACvB;YACE;UACF;QACF;QACA,eAAa,MAAM,MAAC,QAAO;MAC7B;QACE,MAAM,MAAC,aAAU,UAAU;MAC7B;MAEA,gCAAO,gBAAU,MAAM;IACzB;IAEF;;EAGA;;;;;;;;;QAEa,oEACsD,CAAA;;QAE3D,6DAAsB;IAE5B,yBAAG,QAAmB,iBAAW,GAAR,SAAW,uCAAK;MACvC;IACF;;IAIA,yBAAG,eAAE,MAAC,OAAgB;MACpB,gBAAoB,8EAA4C;MAChE,MAAM,MAAC,aAAa,UAAU;MAC9B,MAAM,MAAC,eAAa,sBAAS;MAC7B,MAAM,MAAC,iBAAa,gGACyD;IAC/E;;MAEE,MAAM,MAAC,kBAAe,wCAAO,eAAE,MAAC,OAAV,CAA4B;IACpD;IAEA,MAAM,MAAC,UAAO,OAAO;IAEvB;;AACF","file":"zcl_abapgit_news.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_object_devc.clas.mjs":{"lineLengths":[89,53,36,65,32,51,57,207,234,576,225,322,344,218,341,355,341,210,827,17,12,42,22,110,106,210,3,29,597,61,96,73,75,65,57,12,57,5,16,3,23,114,92,91,5,22,3,25,104,107,85,58,327,172,102,47,25,5,329,119,23,3,25,104,107,85,54,253,161,46,5,23,3,29,114,107,85,9,158,41,17,22,44,80,77,71,70,87,61,13,16,20,9,7,90,26,97,65,7,24,5,40,109,87,101,280,597,815,599,112,15,7,220,68,31,69,7,188,69,32,58,60,127,15,195,144,304,47,23,28,50,67,19,22,26,15,13,11,9,7,29,118,74,104,65,110,88,54,15,188,135,17,118,49,25,30,52,96,87,94,92,88,83,84,88,83,86,70,21,24,28,17,16,25,132,21,92,53,29,34,56,100,91,98,96,92,87,88,92,87,90,74,25,28,32,21,19,24,26,17,15,98,73,15,13,17,202,149,19,132,51,27,32,54,96,94,98,86,90,85,89,85,87,72,23,26,30,19,18,27,134,23,106,55,31,36,58,100,98,102,90,94,89,93,89,91,76,27,30,34,23,21,26,28,19,17,290,107,75,17,15,51,126,82,72,75,96,253,15,47,126,82,80,91,106,93,79,89,266,112,21,116,53,29,34,56,87,89,73,25,28,32,21,19,102,77,19,75,86,56,85,142,145,43,118,148,109,27,131,59,35,40,62,100,93,89,79,31,34,38,27,25,108,83,25,30,101,29,131,61,37,42,64,102,100,104,95,97,81,33,36,40,29,27,110,85,27,25,56,23,99,48,81,111,114,46,87,108,35,25,29,56,61,37,42,64,102,95,91,81,33,36,40,29,27,110,85,27,25,23,66,117,88,84,134,67,73,78,25,39,23,62,122,90,120,96,134,122,68,117,88,124,99,65,35,27,121,141,27,105,31,196,143,33,104,65,41,46,68,101,106,99,95,85,37,40,44,33,32,41,148,37,77,69,45,50,72,105,110,103,99,89,41,44,48,37,35,40,42,33,31,114,92,31,35,198,145,37,106,69,45,50,72,103,110,106,107,105,99,89,41,44,48,37,36,45,152,41,79,73,49,54,76,107,114,110,111,109,103,93,45,48,52,41,39,44,46,37,35,118,96,35,33,31,75,130,98,160,86,137,89,148,86,128,104,142,1068,95,96,95,128,71,156,139,126,213,133,218,35,33,75,91,81,115,33,147,263,33,86,85,87,89,90,89,89,88,90,88,89,89,92,90,96,88,90,33,90,109,33,95,81,113,39,151,71,47,52,74,112,105,105,109,110,104,117,104,107,114,109,109,105,108,102,92,43,46,50,39,37,120,98,37,42,41,156,73,49,54,76,116,112,107,110,107,112,113,111,119,107,113,116,111,107,110,104,103,94,45,48,52,41,39,122,97,39,37,41,167,49,138,46,48,39,37,104,74,101,37,122,88,90,89,90,41,192,73,49,54,76,110,111,114,107,93,45,48,52,41,39,122,100,39,118,37,71,134,89,77,46,45,175,77,53,58,80,107,97,49,52,56,45,43,126,101,43,41,55,39,81,177,61,61,39,93,861,858,118,65,65,39,88,379,168,56,39,79,340,85,59,39,76,138,80,57,39,76,141,99,144,154,125,179,60,39,76,136,104,100,55,39,94,120,39,101,107,109,103,97,168,94,138,106,633,94,134,218,41,268,39,94,120,39,101,633,97,107,106,115,39,81,170,94,1076,293,150,122,104,104,117,115,83,79,172,41,45,130,77,53,58,80,111,112,107,97,49,52,56,45,43,126,101,43,162,198,113,115,43,96,96,98,98,98,98,95,97,97,98,97,97,185,126,80,43,191,126,80,43,97,95,95,97,180,126,80,43,186,126,80,43,96,166,47,134,79,55,60,82,113,115,99,51,54,58,47,45,128,103,45,113,70,51,124,83,59,64,86,117,113,103,55,58,62,51,49,132,107,49,101,102,119,47,98,177,47,45,43,108,556,121,119,119,119,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_object_devc.clas.abap"],"names":[],"mappings":";;;AAgEA;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;0EAEiD;IAC/C,yBAAG,OAAO,MAAC,oBAAuB;MAChC,2BAAoB,OAAO,MAAC,SAAQ;IACtC;MACE,2BAAoB,OAAO,MAAC,SAAQ;IACtC;IACF;;EAGA;;IACE,iBAAgC,IAA7B,yCAA+B,uBAAS;MACzC,gBAAa,mEAAiC;IAChD;IACF;;EAGA;;;;QAEQ,iDAAkC;QAClC,8TAA2D;IAEjE,oBAAiB,kJAA4E;IAE7F,iBAA2B,GAAxB,yBAAO,kBAAmB,gCAAC;MAC5B,gBAAc,uBAAU;MACxB;IACF;IAGA;IAMA,gBAAc,gCAAgB,GAAT,eAAE,MAAC,QAAS,gCAAnB,CAAsB;IAEtC;;EAGA;;;;QAEO,6CAA6B;IAElC;IAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAe,GAAX,YAAa,yCAAO;MACtC,gBAAc,sBAAS;IACzB;IAEF;;EAGA;;;;;6JAcsC;;;;;;;;;;;;;;;;MACpC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb;MACF,wBAAgB,GAAT,eAAE,MAAC,QAAS,gCAAC;gEACkB;MACtC;MAEF;;IAGA;;;UAGI,0FAAsB;UACtB,6QAAwC;UACxC,0kBAA+C;UAC/C,oyBAAkD;UAClD,4kBAA8C;MAGhD,iBAA+B,IAA5B,0DAA8B,wBAAU;QACzC;MACF;MAGA;;;oEAGkC;MAClC;MAGA;;;QAIE,OAAO,MAAC,cAAW,QAAQ,MAAC,OAAM;QAClC,OAAO,MAAC,cAAW,QAAQ,MAAC,SAAQ;QAEpC,iBAA0C,IAAvC,uEAAyC,wBAAU;;;;;;;;;;;;;;;UAUtD;QACF;MAEF;MAGA;;;;;YAEQ,iGAA4B;uFAEkC;QACpE,iBAAiB,GAAd,eAAiB,QAAO;UACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAiCA;cACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wEACsB;cACtC;YACF;YAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA+BA;gBACA,IAAG,cAAW,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAY,GAAR,SAAU,uBAAU,CAAE,IAAG,cAAW,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAY,GAAR,SAAU,wBAAW,CAAC;gBAExF,wBAAgB,GAAT,eAAE,MAAC,QAAS,gCAAC;0EACkB;gBACtC;cAEF;cAGA;;;oBAEO,mDAAqB;gBAG1B,kCAAmB,iBAAM,MAAM;+FAGI;4PAQR;cAE7B;cAGA;;;;;oBACQ,qFAAuD;oBACvD,wEAA+D;oBAC/D,0DAAsC;oBACtC,oEAAsC;oBACtC,qPAAwE;gBAC9E,IAAe,iBAA0C;;mHAS/B;;;;;;;;;;;;;kBAC1B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4EACsB;kBACtC;kBAEA,YAAY,MAAC,eAAY,sBAAS;;;oBAIhC;;;;oHAEkB;oBAElB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,yBAAI,mBAAiB;sBACnC,oFAAqC;;kIAWN;;;;;;;;;;;;;;wBAC/B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kFACsB;wBACtC;sBAEF;wBAEE,kCAAmB,mBAAmB,sBAAsB;;kIAU3B;;;;;;;;;;;;;;;;0BACjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oFACsB;0BACtC;wBAEF;wBAEA,sBAAK,QAAQ;sBACf;;;wBAIE;;;;qFAAiF;wBACjF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;0BACb;wBACF;;uDAQ+B;;;;;;;;;;;;;;0BAC/B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oFACsB;0BACtC;wBACF;sBACF;sBAGA;;;;4BACO,yGAAiC;wBAEtC,gBAAa,yBAAc;wBAC3B,yBAAG,qBAAmB;0BACpB,YAAU,UAAU,OAAE,qBAAU;wBAClC;wBACF;;sBAGA;;;;;4BAEQ,yGAAiC;4BACjC,6FAAwB;wBAY9B,eAAa,YAAO,MAAC,SAAQ;oHAG8B;uFAExB;wBAEnC,iBAA0B,IAAvB,qDAAyB,uBAAS;0BAEnC,gBAAa,uDAA0B;0BAEvC,yBAAG,WAAuB;4BACxB;0BACF;0BAEA,iBAAiB,GAAd,mCAAgB,qCAAG;4IAC+C;0BACrE;wGAGkC;0BAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAqBA;8BAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;2FACsB;8BACtC;8BAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAyBA;kCAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+FACsB;kCACtC;gCAEF;8BAEF;8BAGA;;;;;;;;;;;oCACQ,yGAAsC;oCACtC,ugCAA+B;oCAC/B,0DAA+B;oCAC/B,2DAA+B;oCAC/B,0DAA+B;gCAErC,IAAe,iBAA+B;gCAG9C,2BAAoB,UAAU;2JAMC;gCAE/B,iBAAwB,GAArB,+CAAuB,qCAAG;kCAC3B,iBAA4B,GAAzB,eAAe,MAAC,WAAW,qCAAG;oNAC8D;kCAC/F,wBAAgC,GAAzB,eAAe,MAAC,WAAW,qCAAG;yNAC+D;kCACpG;gCACF;gCAEA,gBAAa,yBAAc;gCAG3B,eAAe,MAAC,cAAW,sBAAiB;gCAC5C,yBAAG,qBAAmB;kCACpB,eAAe,MAAC,eAAY,UAAU,OAAE,0BAAe;gCACzD;gCAGA,iBAA+B,GAA5B,eAAe,MAAC,kCAAc,qCAAG;sQAIY;gCAChD;gCAIA,sBAAM,eAAe,MAAC,SAAQ;gCAQ9B,YAAY,MAAC,WAAmB,sBAAS;gCACzC,YAAY,MAAC,aAAmB,sBAAS;gCACzC,YAAY,MAAC,eAAmB,sBAAS;gCACzC,YAAY,MAAC,gBAAmB,sBAAS;gCACzC,YAAY,MAAC,eAAmB,sBAAS;gCACzC,YAAY,MAAC,eAAmB,sBAAS;gCACzC,YAAY,MAAC,cAAmB,sBAAS;gCACzC,YAAY,MAAC,gBAAmB,sBAAS;gCACzC,YAAY,MAAC,cAAmB,sBAAS;gCACzC,YAAY,MAAC,eAAmB,sBAAS;gCACzC,YAAY,MAAC,eAAmB,sBAAS;gCACzC,YAAY,MAAC,kBAAmB,sBAAS;gCACzC,YAAY,MAAC,gBAAmB,sBAAS;gCACzC,YAAY,MAAC,sBAAmB,sBAAS;gCAEzC,yBAAG,eAAe,MAAC,OAAgB;kCACjC,eAAe,MAAC,WAAQ,sBAAiB;gCAC3C;gCACA,yBAAG,eAAe,MAAC,SAAkB;kCACnC,eAAe,MAAC,aAAU,uCAAM;gCAClC;gCAEA,eAAe,MAAC,aAAU,eAAE,MAAC,MAAK;gCAElC,yBAAG,qBAAmB;gHAGc;;sJAwBG;;;;;;;;;;;;;;;;;;;;;;;;;;oCACrC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;iGACsB;oCACtC;kCAEF;;2JA8BuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCACrC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gGACsB;sCACtC;oCACF;oCAGA;sKAKiC;;;;;;oCAGjC;;;sCAGE,iBAAe,MAAC,gBAAa,sBAAiB;oCAChD;yHAGmD;oCAEnD,YAAY,MAAC,UAAO,sBAAS;oCAC7B,YAAY,MAAC,YAAS,sBAAS;oCAC/B,YAAY,MAAC,WAAQ,sBAAS;oCAC9B,YAAY,MAAC,YAAS,sBAAS;;+LAWA;;;;;;;;;;;;;;;sCAC/B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;mGACsB;sCACtC;qHAGmC;oCAErC;oCAGA;;sCAEE,yBAAG,uBAA4B;wCAC7B,YAAU,uBAAU;sCACtB;;8KAQmC;;;;;;;;;;;;0CACjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oGACsB;0CACtC;wCACF;wCACF;;sCAGA;;wCACE;wCACF;;sCAGA;;;;wCACE;wCACF;;sCAGA;;wCACE,gCAAO,mCAAoB,6BAAU,MAAC,eAAQ,QAAQ;wCACxD;;sCAGA;;wCACE,iBAAc,0BAAe;wCAC/B;;sCAGA;;wCACE,eAAY,uBAAY;wCAC1B;;sCAGA;;4CAEQ,sDAAwB;wCAE9B,sGAAoC;wCACpC,wBAAQ,UAAe,8EAA4C;wCACnE,oCAAY,UAAa,qCAAG;wCAE5B,kBAAe,uHACqD;wCAEtE;;sCAGA;;;;wCAEA;;sCAGA;;;;;;;;;;;;;;wCAEE,iBAAe,GAAZ,aAAe,2CAA4B,eAAc;yNAC4B;wCACxF;wCAGA,OAAO,MAAC,eAAW,sMAIkB;sCAEvC;sCAGA;;;;;;;;wCAIE,gBAAc,2CAA4B,cAAc;sCAE1D;sCAGA;;;4CACQ,ugCAA+B;4CAC/B,wPAA6D;4CAC7D,yGAAsC;4CACtC,6EAAgD;4CAChD,2DAA+B;4CAC/B,2DAA+B;4CAC/B,wEAAwD;wCAE9D,IAAe,YAAmB;wCAGlC,gBAAa,yBAAc;wCAC3B,yBAAG,WAAuB;2KAC8C;wCACxE;;iIASyB;;;;;;;;;;;;;;0CACzB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oGACsB;0CACtC;0CAGA,iBAAwC,IAArC,yEAAuC,uBAAS;4CACjD,qBAAkB,mIAA+E;4CACjG,eAAe,MAAC,eAAa,eAAe,MAAC,UAAS;4CACtD,eAAe,MAAC,gBAAa,eAAe,MAAC,WAAU;0CACzD;0CAEA,sBAAO,eAAe,MAAC,SAAQ;0CAA/B,sBACO,eAAe,MAAC,SAAQ;0CAG/B,sBAAO,eAAe,MAAC,WAAU;0CAAjC,sBACO,eAAe,MAAC,WAAU;0CADjC,sBAEO,eAAe,MAAC,WAAU;0CAFjC,sBAGO,eAAe,MAAC,WAAU;0CAHjC,sBAIO,eAAe,MAAC,QAAO;0CAG9B,sBAAO,eAAe,MAAC,UAAS;0CAAhC,sBACO,eAAe,MAAC,UAAS;0CADhC,sBAEO,eAAe,MAAC,WAAU;0CAGjC,sBAAO,eAAe,MAAC,UAAS;0CAAhC,sBACO,eAAe,MAAC,UAAS;0CAEhC,4IAEoB;0CACpB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;4CACb,sBAAO,YAAU;0CACnB;0CAEA,kJAEoB;0CACpB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;4CACb,sBAAO,YAAU;0CACnB;0CAGA,sBAAO,eAAe,MAAC,UAAS;0CAAhC,sBACO,eAAe,MAAC,QAAO;0CAD9B,sBAEO,eAAe,MAAC,QAAO;0CAF9B,sBAGO,eAAe,MAAC,UAAS;0CAGhC,uIAEoB;0CACpB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;4CACb,sBAAO,YAAU;0CACnB;0CAEA,6IAEoB;0CACpB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;4CACb,sBAAO,YAAU;0CACnB;0CAEA,sBAAO,eAAe,MAAC,SAAQ;qKAGS;;qIASd;;;;;;;;;;;;;4CAC1B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sGACsB;4CACtC;;;;2HAS6B;;;;;;;;;;;;;gDAC3B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0GACsB;gDACtC;gDAEA,sBAAO,aAAa,MAAC,UAAS;gDAA9B,sBAAgC,aAAa,MAAC,WAAU;gDAExD,gCAAO,uBAAiB,aAAa;8CACvC;8CAEA,yBAAG,wBAA4B;gLAES;8CACxC;4CACF;0CACF","file":"zcl_abapgit_object_devc.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_super.clas.mjs":{"lineLengths":[53,38,33,32,53,37,695,217,173,182,416,289,196,56,435,203,203,1170,448,155,193,461,827,17,42,22,598,141,97,67,3,29,597,61,96,73,30,73,38,77,16,3,28,102,70,54,82,64,58,58,43,86,125,14,51,7,12,55,49,5,227,3,28,70,70,102,67,102,116,109,131,61,61,48,31,9,11,189,138,178,43,19,24,46,75,79,83,81,76,63,15,18,22,11,9,19,126,15,17,195,144,182,49,25,30,52,81,85,89,87,82,69,21,24,28,17,15,25,132,21,199,148,141,53,29,34,56,85,89,93,91,86,73,25,28,32,21,19,24,26,17,15,20,22,13,11,94,270,101,232,11,9,39,63,88,190,9,44,138,64,63,88,82,94,141,283,9,46,121,80,88,67,79,250,15,189,138,167,47,23,28,50,88,81,67,19,22,26,15,13,96,71,13,121,83,35,56,96,65,13,42,11,32,312,76,151,167,51,85,31,11,29,110,106,29,11,44,142,66,65,90,690,72,84,96,143,304,11,44,110,78,55,11,46,108,84,55,11,32,17,197,146,316,49,25,30,52,93,89,82,82,93,97,89,88,90,98,96,91,100,83,98,94,98,92,90,93,88,93,97,95,70,21,24,28,17,15,98,73,15,13,39,112,80,19,199,148,424,51,27,32,54,95,91,84,84,95,99,91,90,92,100,98,93,102,85,100,96,100,94,92,95,90,95,99,97,72,23,26,30,19,17,100,75,17,15,13,82,134,68,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_objects_super.clas.abap"],"names":[],"mappings":";;AAyFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;IACE,iBAAU,OAAO;IACjB,4CAAW,uBAAkB;IAC7B,qBAAc,WAAW;IACzB,4CAAW,2BAAsB;IACnC;;EAGA;;;;;QAEQ,uDAA+B;QAC/B,iDAAiC;IAEvC,yBAAG,0BAA8B;MAC/B,oBAAkB,eAAe;MACjC,iBAAmB,GAAhB,iBAAkB,wCAAM;QACzB,sCAAY,YAAO,MAAC,WAAS,YAAO,MAAC,oBAAc,SAAS;MAC9D;QACE,cAAY,YAAO,MAAC,SAAQ;MAC9B;IACF;MACE,oBAAkB,YAAO,MAAC,SAAQ;MAClC,cAAkB,YAAO,MAAC,SAAQ;IACpC;kOAM6B;EAE/B;EAGA;;;;;;;;;QAEQ,oDAAgC;QAChC,oDAAgC;IAEtC,eAAa,YAAO,MAAC,SAAQ;IAC7B,eAAa,UAAU;IAEvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA6CA;UAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;6QAEmE;UAClF,wBAAgB,GAAT,eAAE,MAAC,QAAS,gCAAC;uOACwE;UAC5F;QAEF;QAGA;;;6LAI0C;QAE1C;QAGA;;;;;;;;0RAOoC;QAEpC;QAGA;;;;;;cAEQ,2OAA4C;;;;;;;;;;;;;;;;;YAalD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sEACsB;YACtC;YAEA;;;sDACyD;YACzD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACb,2BAAyB,sBAAS;YACpC;YAEF;;UAGA;;gBAEQ,2DAAoB;YAE1B,cAAW,2HAAsE;YAEjF,wJAAgE;YAEhE,WAAW,MAAC,YAAS,QAAQ;YAC7B,WAAW,MAAC,aAAU,yCAAQ;YAEhC;;UAGA;;YAEE,eAAY,6EAAoD;YAElE;;UAGA;;;;;;;;;;+SAQkC;UAElC;UAGA;;;;UAcA;UAGA;;;;UASA;UAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmCE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wEACsB;cACtC;YAEF;YAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAsCE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0EACsB;gBACtC;cAEF;YACF","file":"zcl_abapgit_objects_super.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_object_intf.clas.mjs":{"lineLengths":[93,58,53,36,67,32,51,57,261,345,338,234,576,394,791,885,3877,3706,199,1482,1990,1102,1203,229,827,17,12,42,22,164,106,210,67,63,3,29,597,61,96,73,75,143,16,3,41,685,82,178,61,151,3,38,782,82,178,61,155,3,33,132,58,1212,61,53,546,47,107,222,13,5,251,83,35,313,5,203,197,195,3,37,132,58,102,70,3615,210,44,12,146,5,186,3,34,100,76,100,70,62,73,45,35,9,311,115,44,17,92,30,62,15,50,23,98,20,22,13,11,9,99,14,16,7,5,3,21,3615,74,4894,153,129,136,118,157,19,3,25,3615,132,58,144,147,155,144,155,19,3,32,685,134,58,106,70,686,96,578,112,40,5,174,86,151,103,28,5,40,26,3,36,782,134,58,106,70,783,96,578,112,40,5,178,86,151,103,28,5,40,26,3,31,1212,134,58,322,97,106,70,352,53,102,778,546,30,234,38,112,21,5,78,30,228,98,45,51,48,84,7,5,48,19,3,30,134,58,3615,178,80,322,61,165,388,153,119,127,210,138,139,12,146,149,157,146,157,203,197,195,5,3,46,97,68,64,365,186,354,156,117,43,39,12,42,74,286,11,64,104,99,13,73,9,92,62,16,128,87,31,112,45,9,23,7,46,106,74,104,80,182,872,65,158,84,17,9,97,17,9,57,118,7,51,106,74,136,62,113,65,124,62,104,80,265,182,3619,116,216,50,18,65,11,97,71,18,193,69,86,171,93,94,87,133,11,124,99,86,18,61,11,9,7,41,104,185,70,68,135,63,269,180,49,18,266,96,51,13,11,9,23,7,49,145,29,29,7,61,829,826,86,33,33,7,56,347,137,136,24,7,47,308,53,27,7,44,106,48,25,7,44,109,67,110,111,93,151,28,7,44,104,72,68,23,7,62,88,7,69,75,77,71,65,136,62,106,74,601,62,15,7,62,88,7,69,601,65,75,74,15,7,49,138,62,76,189,72,97,17,9,191,140,156,191,140,158,147,84,51,7,5,70,288,81,78,77,281,68,69,66,65,518,83,81,81,81,1232,3635,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_object_intf.clas.abap"],"names":[],"mappings":";;;;AA2GA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;0EAG+B;IAC7B,wCAAgC,iGAAgD;IAClF;;EAGA;;;QACS,yKAAwB;IAC/B,SAAS,MAAC,aAAU,YAAO,MAAC,SAAQ;sJAIA;EACtC;EAGA;;;QACS,yKAAwB;IAC/B,SAAS,MAAC,aAAU,YAAO,MAAC,SAAQ;0JAIA;EACtC;EAGA;;;;;QACQ,4CAA+B;QAC/B,yhBAA6D;IAEnE,cAAY,YAAO,MAAC,SAAQ;IAE5B,iBAA0B,GAAvB,yBAAO,OAAO,MAAC,UAAU,gCAAC;6NAIK;MAChC;IACF;0PAMgC;;;wTAQE;IAClC;0MAK+C;oMAKH;kMAKD;EAE7C;EAGA;;;;;QAEO,shHAAoB;IAEzB,iBAAuF,IAApF,+JAAsF,uBAAS;MAChG,aAAU,uBAAY;IACxB;iJAEwD;IACxD;yLAOwC;EAE1C;EAGA;;;QAEQ,2FAA2B;QAC3B,6DAAsC;QACtC,qDAA+B;QAC/B,gEAA0C;IAEhD,YAAU,YAAO,MAAC,SAAQ;IAE1B,iBAAe,YAAY;IAE3B;MACI,qBAAkB,0RAMwB;kHAML;2CAEV;;;;;;;;;;;;;;;;;;IAU/B;EAEF;EAGA;;QACO,iEAAyB;QACzB,qxJAAiD;QACjD,gJAAsD;IAE3D,kBAAe,yGAAwD;IACvE,iBAAc,iHAAqD;;4JAKX;IAC1D;;EAGA;;;;+IAEwD;kJAEC;0JAEI;+IAEL;0JAEK;IAC7D;;EAGA;;;;;;QAEQ,qqBAAmE;QACnE,uFAA6B;QAC7B,yjBAA0E;IAEhF,iBAAgD,GAA7C,mBAAc,OAAE,SAAS,MAAC,qBAAqB,uBAAS;MACzD,gBAAc,gBAAW;IAC3B;IAEA,qBAAkB,mJAEc;IAGhC,wBAAqB,wDAAwC;;IAG7D,iBAA4B,GAAzB,yBAAO,mBAAoB,gCAAC;MAC7B;IACF;IAEA,mBAAiB,eAAe;IAElC;;EAGA;;;;;;QAEQ,swBAAmE;QACnE,uFAA6B;QAC7B,yjBAA0E;IAEhF,iBAAgD,GAA7C,mBAAc,OAAE,SAAS,MAAC,qBAAqB,uBAAS;MACzD,gBAAc,gBAAW;IAC3B;IAEA,qBAAkB,uJAEc;IAGhC,wBAAqB,wDAAwC;;IAG7D,iBAA4B,GAAzB,yBAAO,mBAAoB,gCAAC;MAC7B;IACF;IAEA,mBAAiB,eAAe;IAElC;;EAGA;;;;;;;;QAEQ,uVAA2B;QAC3B,4CAA+B;QAC/B,6FAA2B;QAC3B,iwBAA8D;QAC9D,yhBAA6D;IAEnE,cAAY,UAAU;IAEtB,cAAW,sNAGqB;IAEhC,OAAO,MAAC,WAAQ,QAAQ;IAExB,iBAAgD,GAA7C,mBAAc,OAAE,SAAS,MAAC,qBAAqB,uBAAS;MACzD;IACF;;;MAIE,cAAW,8MAGkB;MAE7B,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;QACtB,sBAAM,aAAa;QACnB,aAAa,MAAC,cAAW,QAAQ;QACjC,aAAa,MAAC,WAAW,QAAQ;QACjC,yEAA6C;MAC/C;IAEF;IAEA,OAAO,MAAC,gBAAa,aAAa;IAEpC;;EAGA;;;QAGI,shHAAgC;QAChC,yKAAkC;QAClC,uEAAgC;QAChC,yTAAgE;IAElE,SAAS,MAAC,aAAU,YAAO,MAAC,SAAQ;IAEpC,OAAO,MAAC,iBAAa,iIAAoE;IAIzF;IAOA,OAAO,MAAC,WAAO,2HAG8B;IAE7C,OAAO,MAAC,kBAAc,kFACiD;IACvE,OAAO,MAAC,sBAAkB,sFACqD;IAG/E,iBAAuF,IAApF,+JAAsF,uBAAS;MAChG,wBAAqB,0GAA8C;0IAEC;IAEtE;iJAE6C;oJAEC;4JAEI;iJAEL;4JAEK;0MAKD;oMAKH;kMAKD;IAE7C;EAEF;EAGA;;;;QAWQ,oWAA6C;QAC7C,iLAAmC;QACnC,yVAA8C;IAEpD,iBAAc,qIAA+D;IAC7E,oCAA4B,GAArB,yBAAO,eAAgB,gCAAC;IAE/B;;;;;;;;;;;;;QAKA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,YAAU,sCAAc;QAC1B;UACE;UACA;6BAA6C;UAC7C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACnB,YAAU,UAAU,MAAC,KAAI;QAC3B;QACF;;MAGA;;;;;YACQ,yKAA4B;YAC5B,21BAA6B;QAEnC,SAAS,MAAC,aAAU,YAAO,MAAC,SAAQ;QACpC,mBAAgB,iIAAoE;QAEpF,iBAA0B,GAAvB,aAAa,MAAC,WAAW,uBAAS;UAEnC;QACF;QAEA,iBAAgC,IAA7B,yCAA+B,wBAAU;UAC1C;QACF;wDAEyB;qHAEyB;MACpD;MAGA;;;;;;;;;;;YACQ,4PAAyB;YACzB,yKAAwB;YACxB,shHAAsB;QAE5B,iBAAW,GAAR,SAAU,mCAAoB,6BAAU,MAAC,MAAI;UAE9C,iBAAuF,IAApF,+JAAsF,uBAAS;YAChG,aAAU,uBAAY;UACxB;YACE,aAAU,sCAAkB;UAC9B;UAEA,iBAA+B,GAA5B,OAAO,MAAC,WAAU,MAAC,WAAW,uBAAS;sEAEP;UAEnC;gMAM0C;YAExC,SAAS,MAAC,aAAU,YAAO,MAAC,SAAQ;YACpC,eAAY,yDAAyC;0KAI3B;4FAEsC;6FAEC;sFAI7C;oIAE4C;UAClE;QAEF,wBAAe,GAAR,SAAU,mCAAoB,6BAAU,MAAC,OAAK;UAInD,iBAAgC,IAA7B,yCAA+B,wBAAU;qFAGf;UAC7B;4DAC2B;UAC3B;QAEF;MAEF;MAGA;;YAEQ,4KAA2B;YAC3B,yDAAqC;QAE3C,YAAY,MAAC,aAAU,YAAO,MAAC,SAAQ;QAEvC,aAAU,gHAAqD;QAE/D,iBAAW,GAAR,SAAU,uBAAS;UACpB;UAIA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAgB,GAAZ,aAAc,qDAA6B;YAC7D,YAAU,uBAAU;UACtB;YACE;YAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cAEb,YAAU,uBAAU;YACtB;UACF;QACF;QAEF;;MAGA;;QACE;QACF;;MAGA;;;;QACE;QACF;;MAGA;;QACE,gCAAO,mCAAoB,6BAAU,MAAC,gBAAS,QAAQ;QACvD,gCAAO,mCAAoB,6BAAU,MAAC,eAAQ,QAAQ;QACxD;;MAGA;;QACE,iBAAc,0BAAe;QAC/B;;MAGA;;QACE,eAAY,uBAAY;QAC1B;;MAGA;;YAEQ,sDAAwB;QAE9B,oGAAkC;QAClC,wBAAQ,UAAe,mEAAiC;QACxD,oCAAY,UAAa,qCAAG;QAE5B,kBAAe,2HACqD;QAEtE;;MAGA;;;;QAEA;;MAGA;;;;;;;;;;;;;;QACE;MACF;MAGA;;;;;;;;QACE;MACF;MAGA;;;YAEQ,+DAAwC;YACxC,gLAA+B;QAErC,gBAAgB,MAAC,aAAU,YAAO,MAAC,SAAQ;QAE3C,iBAAgC,IAA7B,yCAA+B,wBAAU;UAC1C;QACF;;;;;;;QAWA,eAAY,0HAAiE;mFAE3B;kDAE3B;MACzB;IACF","file":"zcl_abapgit_object_intf.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_program.clas.mjs":{"lineLengths":[89,53,40,69,32,55,37,25,605,3354,264,2067,1925,1419,232,1081,3392,939,600,3394,358,344,346,796,1328,1274,1557,2082,17,12,42,22,3,29,64,16,3,26,56,3,33,598,67,64,102,416,67,40,56,75,93,71,94,7,5,20,3,37,67,3,44,3152,58,60,55,74,38,71,34,92,92,92,220,13,5,75,35,169,56,7,5,75,35,169,56,7,5,75,35,169,56,7,5,3,32,105,85,3152,58,59,60,1074,13,5,310,88,123,5,62,62,74,50,33,70,77,9,192,141,467,41,17,22,44,70,61,13,16,20,9,7,90,65,7,141,5,38,840,72,63,34,63,249,60,616,97,11,187,136,190,43,19,24,46,72,63,15,18,22,11,9,92,67,9,77,73,35,75,99,102,33,75,94,106,11,145,87,43,151,71,69,15,71,69,15,13,275,83,13,70,68,13,11,15,194,143,290,47,23,28,50,76,81,85,79,89,86,84,80,89,68,19,22,26,15,13,177,71,13,168,76,139,11,83,36,17,193,142,178,49,25,30,52,85,91,81,79,89,83,21,24,28,17,15,98,73,15,13,11,44,1331,78,376,75,75,72,110,78,63,66,271,79,269,96,108,20,132,13,64,153,11,45,108,78,75,72,113,81,114,87,116,113,59,110,52,48,20,43,13,65,65,20,65,13,49,143,67,54,22,67,15,20,65,98,141,15,13,82,166,13,11,42,66,75,72,75,85,63,100,103,35,76,96,112,61,66,33,100,52,17,51,15,30,13,41,1333,80,378,77,68,74,112,80,19,199,148,341,51,27,32,54,85,80,87,87,71,23,26,30,19,17,100,296,296,107,75,17,15,49,128,112,82,850,71,658,94,81,50,200,186,72,26,19,17,47,15,42,121,112,82,75,103,130,101,165,40,15,43,122,112,82,75,102,166,41,15,41,1335,112,82,1302,193,142,180,73,61,61,61,61,61,61,61,62,62,62,62,62,62,62,34,15,39,69,15,46,610,610,76,427,428,79,52,68,87,105,180,19,17,32,15,42,3164,117,97,21,204,153,483,53,29,34,56,82,88,73,25,28,32,21,19,102,77,19,32,17,48,851,119,99,78,82,92,81,251,259,104,115,113,109,660,108,56,39,56,39,56,39,56,39,23,199,148,180,55,31,36,58,84,75,27,30,34,23,21,104,79,21,79,349,53,27,204,153,287,59,35,40,62,88,88,95,79,31,34,38,27,25,108,83,25,64,211,160,190,102,57,161,188,70,27,54,98,103,106,49,79,72,267,102,36,83,29,27,272,75,27,25,92,61,108,85,27,108,85,27,25,72,66,74,80,74,23,39,21,52,152,76,615,79,156,82,118,88,64,79,1341,123,856,3170,369,85,85,152,61,68,30,56,23,119,27,205,154,262,59,35,40,62,88,88,95,79,31,34,38,27,25,108,94,33,115,94,83,25,92,97,69,45,32,106,25,146,187,109,148,101,71,142,27,25,75,112,115,47,88,259,110,25,178,59,93,25,85,96,23,62,145,84,98,116,33,25,100,51,197,115,33,25,117,33,25,100,51,126,103,33,25,100,51,126,100,33,25,100,51,126,118,33,25,100,51,126,120,33,25,100,51,126,103,33,25,113,113,23,52,81,81,81,308,87,85,113,115,86,56,72,79,98,46,110,116,27,25,39,23,51,1343,90,1315,29,203,152,206,61,37,42,64,91,81,33,36,40,29,27,110,158,27,85,79,81,81,81,81,79,81,79,85,79,79,31,207,156,191,63,39,44,66,95,83,35,38,42,31,29,112,161,29,322,183,256,29,27,55,1347,94,392,91,82,88,125,33,213,162,246,65,41,46,68,94,101,94,85,37,40,44,33,31,114,100,210,166,217,223,40,91,33,31,98,29,27,100,1369,337,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_objects_program.clas.abap"],"names":[],"mappings":";;;AA0MA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;IAEE,IAAe,eAAoC;IAAnD,IACe,gBAAoC;;;;MAKjD,kCAAmB,iBAAiB,gBAAc;MAClD,iBAAqB,GAAlB,gBAAc,MAAC,KAAK,qCAAG;QACxB,gBAAc,MAAC,WAAQ,gBAAc,MAAC,MAAK;QAC3C,gBAAc,MAAC,WAAQ,gBAAc,MAAC,6BAAO;MAC/C;IACF;IAEF;;EAGA;;;;;;;;QAII,iEAA8C,CAAA;;QAC9C,8DAA6C,CAAA;;IAE/C,IACE,UAAuB;IADzB,IAEE,UAAuB;IAFzB,IAGE,UAAuB;IAEzB,yBAAG,iBACC,iBAAmB,GAAf,MAAM,MAAC,UAAW,eACtB,iBAAmB,GAAf,MAAM,MAAC,UAAW,eACtB,iBAAmB,GAAf,MAAM,MAAC,UAAW,eAAc;MACtC;IACF;;;MAGE,yBAAG,UAAQ,MAAC,yCAAsB,iBAAqB,GAAjB,UAAQ,MAAC,8BAAW,YAAW;QACnE,MAAM,MAAC,aAAU,UAAQ,MAAC,KAAI;MAChC;IACF;;;MAGE,yBAAG,UAAQ,MAAC,yCAAsB,iBAAqB,GAAjB,UAAQ,MAAC,8BAAW,YAAW;QACnE,MAAM,MAAC,aAAU,UAAQ,MAAC,KAAI;MAChC;IACF;;;MAGE,yBAAG,UAAQ,MAAC,yCAAsB,iBAAqB,GAAjB,UAAQ,MAAC,8BAAW,YAAW;QACnE,MAAM,MAAC,aAAU,UAAQ,MAAC,KAAI;MAChC;IACF;EAEF;EAGA;;;;;QAEQ,kDAAoB;QACpB,mDAAwB;IAG9B,iBAAuB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCACrB,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAC1B,iBAAwB,GAApB,yBAAO,MAAM,MAAC,QAAQ,gCAAC;MAC7B;IACF;IAEA;IAKA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0HACsC;IACtD;IAEA,SAAS,MAAC,cAAW,YAAO,MAAC,SAAQ;IACrC,SAAS,MAAC,cAAW,YAAO,MAAC,SAAQ;IACrC,SAAS,MAAC,cAAW,uCAAM;IAC3B,SAAS,MAAC,cAAW,eAAe;IAEpC,WAAS,MAAM,MAAC,IAAG;qEACuD;IAE1E,eAAE,MAAC,WAAQ,uCAAiB;;;;;;;;;;;;;;;;MAuB5B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gEAEsB;MACtC;4IAI6B;IAE/B;IAGA;;;UAEY,oDAA4C,CAAA;;UAEhD,oDAA0C;UAC1C,8OAAsC;UACtC,iDAAkD;UAClD,6lBAA0C;MAEhD,IAAe,YAA0B;;;;;;;;;;;;;;;;QAYzC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;kEACuB;QACtC;QAEA;;;UAME;;;;yEAEe;UACf,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;UAEf;UAGA,SAAS,MAAC,iBAAa,qGAES;;;YAM9B,yBAAG,YAAU,MAAC,oBACV,iBAAyB,GAArB,YAAU,MAAC,YAAY,uBAAS;cACtC,yBAAG,YAAU,MAAC,WAAoB;gBAChC,YAAU,MAAC,eAAY,kBAAkB;cAC3C;cACA,yBAAG,YAAU,MAAC,WAAoB;gBAChC,YAAU,MAAC,eAAY,kBAAkB;cAC3C;YACF;YAKA,iBAAmB,GAAhB,YAAU,MAAC,OAAO,yCACjB,iBAAyB,GAArB,YAAU,MAAC,YAAY,uBAC3B,yBAAI,YAAU,MAAC,MACf,yBAAI,YAAU,MAAC,SAAkB;cACnC,YAAU,MAAC,aAAU,oCAAG;YAC1B;YAGA,yBAAG,YAAU,MAAC,YAAqB;cACjC,YAAU,MAAC,gBAAa,kBAAkB;YAC5C;UAEF;;;;;;;;;;;;;;;;;;;;;;;;YAqBA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAa,GAAT,eAAE,MAAC,QAAS,gCAAC;sEACI;YACtC;YAGA,sCAAY,SAAS,MAAC,OAAM,MAAC,UAAQ,SAAS,MAAC,OAAM,MAAC,kBAC/C,OAAyB;YAChC,4CAAW,kBAAkB;0IAIR;UAEvB;;;;;;;;;;;;;;;;;;;;;;cAiBE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wEACsB;cACtC;YAEF;UAEF;UAGA;;;;;;;;;gBAGI,8CAAiC;gBACjC,iDAA4B;8QAMD;YAE7B,cAAW,mDAA6B;YAGxC;YAIA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;2GAIY;YAC3B;mIAK6B;YAC7B;+DAE4B;wJAIC;UAE/B;UAGA;;;;;;;;;;gBAEO,gGAAyB;gBACzB,0CAAkB;gBAClB,6FAA0B;YAE/B,yBAAG,YAAsB;cACvB,gBAAc,gBAAW;YAC3B;cACE,gBAAc,WAAW;YAC3B;YAEA,iBAAe,GAAZ,aAAc,iBAAW;cAC1B,aAAW,oCAAG;YAChB;cACE,aAAW,oCAAG;YAChB;YAEA,yBAAG,SAAmB;cACpB,iBAAiB,GAAd,eAAgB,wBAAW,iBAAY,GAAT,UAAW,qCAAG;;gBAK7C,cAAY,sBAAS;cACvB;;cAKA;YACF;;cAKE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4IAC8C;cAC9D;YACF;YAEA,iBAAY,GAAT,UAAW,qCAAG;qKAIU;YAC3B;UACF;UAGA;;;;gBAEO,0DAA8B;YAEnC,IAAc,UAAiB;YAE/B;;;;0EAAmD;YACnD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cAGb;;;8BAAqC;gBACrC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;kBACb,sBAAM,UAAQ;gBAChB;gBAEA,aAAW,QAAQ,MAAC,MAAK;cAC3B;cAEF;;YAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAkBE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;uSAUwB;uSAOA;gBAEvC,wBAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;0EACmB;gBACtC;cAEF;cAGA;;;;oBAEQ,6zBAA4B;oBAC5B,kDAA0B;gBAEhC,IAAe,aAA0B;gBAEzC,gBAAa,4DAA+B;;;kBAI1C,oLAAyE;kBAEzE,iBACyD,IADtD,yHACwD,uBAAS;oBAClE,4BAA0B,sBAAS;oBACnC;kBACF;gBAEF;gBAEF;;cAGA;;;;oBAEQ,sDAAwB;gBAE9B,qFAA8B;gBAC9B,wBAAQ,UAAe,8EAA4C;gBACnE,oCAAY,UAAa,qCAAG;gBAE5B,sBAAmB,6HACqD;gBAE1E;;cAGA;;;;oBAEQ,sDAAwB;gBAE9B,oFAA6B;gBAE7B,uBAAoB,6HACqD;gBAE3E;;cAGA;;;;oBAEQ,iwCAAsB;;;;gBAS5B,kCAAmB,WAAa,UAAU;gBAE1C,sBAAO,UAAU,MAAC,KAAI;gBAAtB,sBACO,UAAU,MAAC,KAAI;gBADtB,sBAEO,UAAU,MAAC,KAAI;gBAFtB,sBAGO,UAAU,MAAC,KAAI;gBAHtB,sBAIO,UAAU,MAAC,KAAI;gBAJtB,sBAKO,UAAU,MAAC,KAAI;gBALtB,sBAMO,UAAU,MAAC,KAAI;gBANtB,sBAOO,UAAU,MAAC,MAAK;gBAPvB,sBAQO,UAAU,MAAC,MAAK;gBARvB,sBASO,UAAU,MAAC,MAAK;gBATvB,sBAUO,UAAU,MAAC,MAAK;gBAVvB,sBAWO,UAAU,MAAC,MAAK;gBAXvB,sBAYO,UAAU,MAAC,MAAK;gBAZvB,sBAaO,UAAU,MAAC,MAAK;gBAEzB;;cAGA;;;;;;;gBAEE,IAAe,eAAoC;gBAAnD,IACe,gBAAoC;;;;kBAKjD,kCAAmB,iBAAiB,gBAAc;kBAClD,iBAAqB,GAAlB,gBAAc,MAAC,KAAK,qCAAG;oBACxB,sCAAY,eAAa,MAAC,QAAM,eAAa,MAAC,iBACvC,gBAAc,MAAC,MACH;kBACrB;gBACF;gBAEF;;cAGA;;;;;;;;;;;;;;;;;;;;kBAyBE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;4EACuB;kBACtC;kBAEF;;gBAGA;;;;sBACQ,uDAAuC;sBACvC,2DAAuC;sBACvC,qEAAuC;sBACvC,0DAAsC;sBACtC,oOAA2C;sBAC3C,4OAA2C;kBAEjD,IAAe,YAAsC;kBAArD,IACe,kBAAgC;kBAD/C,IAEe,gBAA2C;kBAF1D,IAGe,YAAqD;kBAHpE,IAIe,aAAuC;kBAJtD,IAKe,gBAA8C;sBAGlD,iCAA4B,CAAA;;sBAC5B,iCAA4B,CAAA;;sBAC5B,iCAA4B,CAAA;;sBAC5B,iCAA4B,CAAA;;;;;;;;;;;;;;;;;oBAYvC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;8EACuB;oBACtC;oBAEA;;;;;;;;;;;;;;;;;;;;wBAsBE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kFACsB;wBACtC;wBAGA,sBAAK,gBAAgB;;;;;;0BAanB,oIAA0E;0BAC1E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAqB,GAAjB,oBAAmB,sCAAI;4BACzC,sBAAM,kBAAgB;0BACxB;0BAIuB;0BACvB;;;;6EAAoF;0BACpF,0BAAG,iBAA0B;4BAC3B,iBAAuB,EAApB,gBAAc,MAAC,OAAO,WAAW,iBACZ,EAApB,gBAAc,MAAC,OAAO,WAAW,iBACb,EAApB,gBAAc,MAAC,OAAO,WAAW,iBACb,EAApB,gBAAc,MAAC,OAAO,WAAU;8BAClC,YAAU,MAAC,gBAAa,oCAAG;4BAC7B;8BACE,sBAAM,YAAU,MAAC,WAAU;4BAC7B;0BACF;0BAEA,iBAAwB,GAArB,YAAU,MAAC,YAAY,uBAAU,iBACZ,GAArB,YAAU,MAAC,UAAa,qCAAI,iBACP,GAArB,YAAU,MAAC,UAAa,qCAAG;4BAC5B,sBAAM,YAAU,MAAC,KAAI;0BACvB;wBACF;;;0BAGE,iBAA6B,GAA1B,gBAAc,MAAC,aAAa,wBAAU;4BACvC,sBAAM,gBAAc,MAAC,WAAU;0BACjC;0BACA,iBAA6B,GAA1B,gBAAc,MAAC,aAAa,wBAAU;4BACvC,sBAAM,gBAAc,MAAC,WAAU;0BACjC;wBACF;;wBAGA,aAAW,MAAC,YAAa,SAAS;wBAClC,aAAW,MAAC,gBAAa,aAAa;wBACtC,aAAW,MAAC,YAAa,uBAAuB;wBAEhD,aAAW,MAAC,gBAAa,aAAa;sBAExC;sBAEF;;oBAGA;;;;;;;;;;;0BAEQ,kyCAA+B;0BAC/B,gGAA4B;0BAC5B,6zBAAiC;0BACjC,ukGAA2B;0BAC3B,sVAAwC;0BACxC,0DAAmC;0BACnC,0DAAqC;0BACrC,6HAAkD;sBAExD,yBAAG,WAAqB;wBACtB,oBAAkB,OAAO,MAAC,SAAQ;sBACpC;wBACE,oBAAkB,UAAU;sBAC9B;sHAEyD;;;;;;;;;;;;;;;;;;wBAgBzD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;6FACkC;0BAC/C;wBACF,wBAAgB,GAAT,eAAE,MAAC,QAAS,gCAAC;6FAC6B;kFACX;wBACtC;2FAE+C;wBAE/C,gBAAa,uDAA+B;wBAE5C,yBAAG,iBAAe;0BAChB,WAAS,MAAM;wBACjB;;wBAEA;iJAGmC;wBACnC,iBAAmB,GAAhB,UAAU,MAAC,OAAO,qCAAI,iBAAmB,GAAhB,UAAU,MAAC,OAAO,qCAAG;0BAC/C,gBAAa,iEAAoC;mJAEd;0BAEnC,YAAS,6DAAgC;0BACzC,yBAAO,iBAAiB;6IAES;0BACjC;wBACF;wBAEA;;;;sFAAmD;wBACnD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAiB,GAAb,QAAQ,MAAC,MAAM,oCAAG,iBAAoB,GAAhB,QAAQ,MAAC,SAAS,gCAAC;;wBAE7D;iLAG8C;wBAE9C,yBAAO,OAAe;4FAEkB;wBACxC;oFAE2D;+FAGjB;sBAE5C;sBAGA;;;wBAEE,IAAc,WAAkB;wBAEhC,iBAAoB,GAAjB,YAAO,MAAC,WAAY,wCAAM;0BAC3B;wBACF;wBAGA;iDAAgD;wBAChD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAc,GAAV,aAAa,wDAAqB;;0BAEpD;wBACF;wBAGA,iBAAsB,GAAnB,yBAAO,aAAc,gCAAC;0BACvB;wBACF;wBAEA;iDAAgD;wBAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;wBACnB,kBAAiB,GAAV,aAAa,0CAAQ;0BAC1B;wBACF;wBAEA;iDAAgD;wBAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;wBACnB,kBAAiB,GAAV,aAAa,uCAAK;0BACvB;wBACF;wBAEA;iDAAgD;wBAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;wBACnB,kBAAiB,GAAV,aAAa,yDAAsB;0BACxC;wBACF;wBAEA;iDAAgD;wBAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;wBACnB,kBAAiB,GAAV,aAAa,2DAAwB;0BAC1C;wBACF;wBAEA;iDAAgD;wBAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;wBACnB,kBAAiB,GAAV,aAAa,0CAAQ;0BAC1B;wBACF;;;sBAKF;sBAGA;;;;;;4BAEQ,wDAAgC;wBAEtC,IAAe,WAAgC;wBAA/C,IACe,aAAgC;;;;0BAK7C,aAAW,MAAC,UAAO,WAAS,MAAC,KAAI;0BAEjC;4CAAkD;0BAClD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;4BACb;0BACF;wBACF;wBAEF;;sBAGA;;;4BAEO,swCAA2B;;;;;;;;;;;;;;;;0BAWhC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6JACmD;0BACnE;0BAEA,cAAc,MAAC,aAAU,UAAU,MAAC,QAAO;0BAC3C,cAAc,MAAC,UAAU,UAAU,MAAC,KAAI;0BACxC,cAAc,MAAC,WAAU,UAAU,MAAC,MAAK;0BACzC,cAAc,MAAC,WAAU,UAAU,MAAC,MAAK;0BACzC,cAAc,MAAC,WAAU,UAAU,MAAC,MAAK;0BACzC,cAAc,MAAC,WAAU,UAAU,MAAC,MAAK;0BACzC,cAAc,MAAC,UAAU,UAAU,MAAC,KAAI;0BACxC,cAAc,MAAC,WAAU,UAAU,MAAC,MAAK;0BACzC,cAAc,MAAC,UAAU,UAAU,MAAC,KAAI;0BACxC,cAAc,MAAC,aAAU,UAAU,MAAC,QAAO;0BAC3C,cAAc,MAAC,UAAU,UAAU,MAAC,KAAI;0BACxC,cAAc,MAAC,UAAU,UAAU,MAAC,KAAI;;;;;;;;;;;;;;;;4BAUxC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gKACoD;4BACpE;4BAGA;4BAGA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAqB,GAAjB,UAAU,MAAC,QAAS,cAAc,MAAC,OAAK;;4BAI5D;0BAEF;0BAGA;;;;;;;4HAE2D;;;;;;;;;;;;;;;;;;8BAezD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;mGACiC;gCAE/C,iBAAY,GAAT,eAAE,MAAC,QAAQ,sCAAK,iBAAa,GAAT,eAAE,MAAC,QAAQ,uCAAK;qKAC8B;gCACrE,wBAAgB,GAAT,eAAE,MAAC,QAAQ,sCAAK,iBAAa,GAAT,eAAE,MAAC,QAAQ,uCAAK;8NAI0D;gCACrG;0FACsC;gCACtC;8BACF;iGAE+C;4BAEjD;0BACF","file":"zcl_abapgit_objects_program.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_object_intf.clas.locals.mjs":{"lineLengths":[93,53,47,22,32,71,37,25,1356,3153,1333,2583,4390,4393,4389,4388,4416,4530,4408,17,42,22,3,29,64,16,3,47,64,3,54,4013,105,73,108,76,72,73,124,630,674,758,924,100,132,130,90,25,3,45,62,3,52,4013,105,73,108,76,521,674,634,424,373,527,712,72,41,46,76,89,5,104,136,134,94,25,3,31,48,3,38,572,630,79,339,452,294,41,66,74,77,5,21,3,28,45,3,35,1676,630,79,674,91,1455,339,339,492,452,242,41,63,71,224,47,59,88,74,82,98,95,74,82,98,9,7,196,76,7,5,21,3,26,43,3,33,572,630,79,334,448,284,37,57,65,72,5,21,3,27,44,3,34,1107,630,79,674,91,339,886,448,492,240,37,58,66,216,47,72,80,95,7,132,75,7,5,21,3,31,48,3,38,108,76,96,73,4013,79,458,371,89,41,51,66,48,74,83,5,3,28,45,3,35,108,76,96,73,4013,79,455,562,562,1487,371,371,86,38,48,60,45,68,80,91,43,60,72,75,57,83,92,7,91,43,60,72,75,57,83,92,7,5,3,27,44,3,34,108,76,96,73,4013,79,561,454,918,371,85,37,47,58,44,66,79,90,43,59,70,74,56,82,91,7,5,3,26,43,3,33,108,76,96,73,4013,79,453,366,84,36,46,56,43,64,78,5,3,45,62,3,52,108,76,96,73,4013,79,116,113,112,111,3,1,77,427,467,638,682,28,32,77,67,25,6718,17,42,22,3,29,64,16,3,52,46,58,46,58,3623,4894,33,79,100,109,103,84,81,264,29,3,56,46,58,108,82,46,58,3623,4894,108,29,37,206,71,100,84,109,103,81,101,100,33,3,41,106,70,4894,73,686,82,787,94,460,563,373,1497,928,101,43,51,70,87,78,80,5,106,43,51,70,87,78,80,5,103,48,51,75,87,83,80,101,45,77,77,73,78,86,92,7,101,45,77,77,73,78,86,92,7,5,102,47,51,74,87,82,80,100,45,77,77,73,78,86,92,7,5,3,1,89,32,32,81,37,25,1089,641,3817,5095,17,42,22,3,29,64,16,3,26,53,3,33,71,3615,61,4894,106,142,153,984,549,118,108,54,59,94,9,153,17,78,28,97,14,16,7,5,21,3,24,51,3,31,977,763,333,563,131,85,90,136,89,90,150,102,90,142,94,90,142,94,90,142,95,90,85,66,77,21,3,29,56,3,36,542,325,82,82,74,21,3,28,55,3,35,4892,69,61,136,122,984,338,554,64,116,95,99,54,88,9,154,17,94,28,97,14,16,7,5,21,3,1,97,72,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap"],"names":[],"mappings":";;;AAmEA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;QAEI,6mBAAqC;QACrC,ypBAAyC;IAG3C;IAYA;IAgBA,aAAa,MAAC,iBAAa,0DAA+B;IAC1D,aAAa,MAAC,cAAU,6FACoD;IAC5E,aAAa,MAAC,aAAS,4FACmD;IAC1E,aAAa,MAAC,YAAQ,qDAA0B;IAClD;;EAGA;;;;;;;;;QAQI,ggBAAuD;QACvD,ypBAAyC;QACzC,inBAAqC;QACrC,+ZAAgD;IAClD,IACE,gBAAyC;IAG3C;IAQA;;;MAWE,sBAAM,gBAAgB;MACtB,kCAAmB,kBAAkB,gBAAgB;MACrD,gFAAoD;IACtD;IAEA,aAAa,MAAC,iBAAa,8DAAmC;IAC9D,aAAa,MAAC,cAAU,iGACoD;IAC5E,aAAa,MAAC,aAAS,gGACmD;IAC1E,aAAa,MAAC,YAAQ,yDAA8B;IAEtD;;EAGA;;;;;;;QAEI,0UAAuE;IACzE,IAAc,gBAAgC;;;MAG5C,YAAY,MAAC,UAAO,gBAAc,MAAC,QAAO;MAC1C,YAAY,MAAC,iBAAc,gBAAc,MAAC,SAAQ;MAClD,oEAAwC;IAC1C;IACF;;EAEA;;;;;;;;;QAEI,s6CAAwD;QACxD,0UAAuE;QACvE,0UAAuE;IAEzE,IAAc,oBAAwC;IACtD,IAAc,gBAAgC;;;MAG5C,SAAS,MAAC,UAAO,gBAAc,MAAC,QAAO;MACvC,SAAS,MAAC,iBAAc,gBAAc,MAAC,SAAQ;;;QAG7C,IACE,OAIA,KALG,oBAAkB,MAAC,QAAxB;;UAEI,YAAY,MAAC,UAAO,oBAAkB,MAAC,QAAO;UAC9C,YAAY,MAAC,iBAAc,oBAAkB,MAAC,SAAQ;UACtD,qFAAmD;;UAEnD,YAAY,MAAC,UAAO,oBAAkB,MAAC,QAAO;UAC9C,YAAY,MAAC,iBAAc,oBAAkB,MAAC,SAAQ;UACtD,qFAAmD;;MAEzD;MAEA,yBAAG,SAAS,MAAC,uBACT,yBAAG,SAAS,MAAC,sBACb,yBAAG,SAAS,MAAC,sBAAyB;QACxC,iEAAqC;MACvC;IACF;IACF;;EAEA;;;;;;;QAEM,qUAAkE;IACtE,IAAe,YAA4B;;;MAIzC,OAAO,MAAC,UAAO,YAAU,MAAC,QAAO;MACjC,OAAO,MAAC,iBAAc,YAAU,MAAC,SAAQ;MACzC,+DAAmC;IACrC;IACF;;EAEA;;;;;;;;;QAEI,0UAAuE;QACvE,62BAAuD;IACzD,IAAc,YAA4B;IAC1C,IAAc,oBAAwC;;;MAGpD,QAAQ,MAAC,UAAO,YAAU,MAAC,QAAO;MAClC,QAAQ,MAAC,iBAAc,YAAU,MAAC,SAAQ;;;QAGxC,YAAY,MAAC,UAAO,oBAAkB,MAAC,QAAO;QAC9C,YAAY,MAAC,iBAAc,oBAAkB,MAAC,SAAQ;QACtD,oFAAkD;MACpD;MAEA,yBAAG,QAAQ,MAAC,uBAA2B,yBAAG,QAAQ,MAAC,sBAAyB;QAC1E,gEAAoC;MACtC;IACF;IACF;;EAGA;;;;;;;;;;QAEI,icAA4B;IAC9B,IAAe,gBAAyE;;;MAGtF,YAAY,MAAC,aAAW,YAAY;MACpC,YAAY,MAAC,aAAW,gBAAc,MAAC,KAAI;MAC3C,YAAY,MAAC,WAAW,WAAW;MACnC,YAAY,MAAC,cAAW,gBAAc,MAAC,YAAW;;IAEpD;EACF;EAGA;;;;;;;;;;QAEI,8bAAmC;QACnC,yiBAAmC;QACnC,yiBAAmC;IACrC,IAAe,aAA0D;IAAzE,IACe,gBAAyE;IADxF,IAEe,gBAAyE;;;MAGtF,SAAS,MAAC,aAAW,YAAY;MACjC,SAAS,MAAC,aAAW,aAAW,MAAC,KAAI;MACrC,SAAS,MAAC,WAAW,WAAW;MAChC,SAAS,MAAC,cAAW,aAAW,MAAC,YAAW;;;;QAI1C,mBAAmB,MAAC,aAAW,YAAY;QAC3C,mBAAmB,MAAC,aAAW,aAAW,MAAC,KAAI;QAC/C,mBAAmB,MAAC,aAAW,gBAAc,MAAC,KAAI;QAClD,mBAAmB,MAAC,WAAW,WAAW;QAC1C,mBAAmB,MAAC,cAAW,gBAAc,MAAC,YAAW;;MAE3D;;;QAGE,mBAAmB,MAAC,aAAW,YAAY;QAC3C,mBAAmB,MAAC,aAAW,aAAW,MAAC,KAAI;QAC/C,mBAAmB,MAAC,aAAW,gBAAc,MAAC,KAAI;QAClD,mBAAmB,MAAC,WAAW,WAAW;QAC1C,mBAAmB,MAAC,cAAW,gBAAc,MAAC,YAAW;;MAE3D;IACF;EACF;EAGA;;;;;;;;;;QAEI,wiBAAkC;QAClC,6bAAkC;IACpC,IAAe,YAAyD;IAAxE,IACe,gBAAyE;;;MAGtF,QAAQ,MAAC,aAAW,YAAY;MAChC,QAAQ,MAAC,aAAW,YAAU,MAAC,KAAI;MACnC,QAAQ,MAAC,WAAW,WAAW;MAC/B,QAAQ,MAAC,cAAW,YAAU,MAAC,YAAW;;;;QAIxC,kBAAkB,MAAC,aAAW,YAAY;QAC1C,kBAAkB,MAAC,aAAW,YAAU,MAAC,KAAI;QAC7C,kBAAkB,MAAC,aAAW,gBAAc,MAAC,KAAI;QACjD,kBAAkB,MAAC,WAAW,WAAW;QACzC,kBAAkB,MAAC,cAAW,gBAAc,MAAC,YAAW;;MAE1D;IACF;EACF;EAGA;;;;;;;;;;QAEI,4bAAuB;IACzB,IAAe,WAAoE;;;MAGjF,OAAO,MAAC,aAAW,YAAY;MAC/B,OAAO,MAAC,aAAW,WAAS,MAAC,KAAI;MACjC,OAAO,MAAC,WAAW,WAAW;MAC9B,OAAO,MAAC,cAAW,WAAS,MAAC,YAAW;;IAE1C;EACF;EAGA;;;;;;;;;;mHAG6C;gHAGH;+GAGD;8GAGD;EACxC;AAEF;;;;;;AAaA;;;;;;;;;;;;;;EAEE;;;;;QAEI,8hHAAqD;QACrD,qxJAAqD;IAEvD,oBAAkB,OAAO;IAEzB,WAAW,MAAC,oBAAiB,oCAAG;IAGhC,WAAW,MAAC,OAAM,MAAC,iBAAc,eAAe,MAAC,WAAU,MAAC,SAAQ;IACpE,WAAW,MAAC,OAAM,MAAC,2BAAwB,eAAe,MAAC,WAAU,MAAC,QAAO;IAC7E,WAAW,MAAC,OAAM,MAAC,uBAAoB,eAAe,MAAC,WAAU,MAAC,MAAK;IAGvE,WAAW,MAAC,cAAW,eAAe,MAAC,WAAU,MAAC,SAAQ;IAC1D,WAAW,MAAC,WAAQ,eAAe,MAAC,WAAU,MAAC,SAAQ;IAGvD,WAAW,MAAC,mBAAe,8NAEkD;IAE7E,YAAU,WAAW;EACvB;EAEA;;;;;;;QAEI,8hHAAqD;QACrD,qxJAAqD;QACrD,mGAA+B;IAGjC,gBAAc,OAAO;IAErB,iBAAe,cAAc;6MAK8D;IAE3F,eAAe,MAAC,WAAU,MAAC,aAAU,cAAc;IACnD,eAAe,MAAC,WAAU,MAAC,cAAW,WAAW,MAAC,OAAM,MAAC,YAAW;IACpE,eAAe,MAAC,WAAU,MAAC,cAAW,WAAW,MAAC,SAAQ;IAC1D,eAAe,MAAC,WAAU,MAAC,aAAW,WAAW,MAAC,OAAM,MAAC,sBAAqB;IAC9E,eAAe,MAAC,WAAU,MAAC,WAAW,WAAW,MAAC,OAAM,MAAC,kBAAiB;IAC1E,eAAe,MAAC,WAAU,MAAC,cAAW,WAAW,MAAC,MAAK;IACvD,eAAe,MAAC,WAAU,MAAC,cAAW,2CAAoB;IAC1D,eAAe,MAAC,WAAU,MAAC,WAAW,6CAAsB;IAE5D,YAAU,eAAe;EAE3B;EAEA;;;;;;;;;QAEO,mcAAoC;QACpC,0iBAAoC;IACzC,IAAc,kBAAgF;IAC9F,IAAc,uBAAiE;IAC/E,IAAc,sBAAgE;;;MAI5E,cAAc,MAAC,aAAW,UAAU;MACpC,cAAc,MAAC,aAAW,kBAAgB,MAAC,KAAI;MAC/C,cAAc,MAAC,WAAW,WAAW,MAAC,OAAM,MAAC,kBAAiB;MAC9D,cAAc,MAAC,cAAW,kBAAgB,MAAC,YAAW;MACtD,gCAAO,wBAAkB,eAAe;IAC1C;;;MAGE,cAAc,MAAC,aAAW,UAAU;MACpC,cAAc,MAAC,aAAW,kBAAgB,MAAC,KAAI;MAC/C,cAAc,MAAC,WAAW,WAAW,MAAC,OAAM,MAAC,kBAAiB;MAC9D,cAAc,MAAC,cAAW,kBAAgB,MAAC,YAAW;MACtD,gCAAO,wBAAkB,eAAe;IAC1C;;;MAGE,cAAc,MAAC,aAAW,UAAU;MACpC,cAAc,MAAC,aAAW,uBAAqB,MAAC,KAAI;MACpD,cAAc,MAAC,WAAW,WAAW,MAAC,OAAM,MAAC,kBAAiB;MAC9D,cAAc,MAAC,cAAW,uBAAqB,MAAC,YAAW;MAC3D,gCAAO,wBAAkB,eAAe;;;QAGtC,oBAAoB,MAAC,aAAW,cAAc,MAAC,QAAO;QACtD,oBAAoB,MAAC,aAAW,cAAc,MAAC,QAAO;QACtD,oBAAoB,MAAC,WAAW,cAAc,MAAC,MAAK;QACpD,oBAAoB,MAAC,aAAW,kBAAgB,MAAC,KAAI;QACrD,oBAAoB,MAAC,cAAW,kBAAgB,MAAC,YAAW;QAC5D,gCAAO,8BAAwB,mBAAmB;MACpD;;;QAGE,oBAAoB,MAAC,aAAW,cAAc,MAAC,QAAO;QACtD,oBAAoB,MAAC,aAAW,cAAc,MAAC,QAAO;QACtD,oBAAoB,MAAC,WAAW,cAAc,MAAC,MAAK;QACpD,oBAAoB,MAAC,aAAW,kBAAgB,MAAC,KAAI;QACrD,oBAAoB,MAAC,cAAW,kBAAgB,MAAC,YAAW;QAC5D,gCAAO,8BAAwB,mBAAmB;MACpD;IACF;;;MAGE,cAAc,MAAC,aAAW,UAAU;MACpC,cAAc,MAAC,aAAW,sBAAoB,MAAC,KAAI;MACnD,cAAc,MAAC,WAAW,WAAW,MAAC,OAAM,MAAC,kBAAiB;MAC9D,cAAc,MAAC,cAAW,sBAAoB,MAAC,YAAW;MAC1D,gCAAO,wBAAkB,eAAe;;;QAGtC,oBAAoB,MAAC,aAAW,cAAc,MAAC,QAAO;QACtD,oBAAoB,MAAC,aAAW,cAAc,MAAC,QAAO;QACtD,oBAAoB,MAAC,WAAW,cAAc,MAAC,MAAK;QACpD,oBAAoB,MAAC,aAAW,kBAAgB,MAAC,KAAI;QACrD,oBAAoB,MAAC,cAAW,kBAAgB,MAAC,YAAW;QAC5D,gCAAO,8BAAwB,mBAAmB;MACpD;IACF;EAEF;AAEF;;AA0BA;;;;;;;;;;;;;;;;;EAEE;;;;;;;QAEI,qxJAAsD;QACtD,iGAAoC;QACpC,qIAAqD;QACrD,gJAAyD;QACzD,+8BAAgE;QAChE,4hBAA6D;;2GAKP;IAExD,sBAAmB,0BAAe;IAClC,sBAAmB,+BAAoB;;IAGvC;MACI,eAAY,kIAEgE;;;;;;;;IAGhF;IAEF;;EAEA;;;;;QAEI,kvBAAoE;QACpE,oUAAyE;QACzE,0iBAA0E;IAE5E,oBAAoB,MAAC,UAAO,wCAAyB,mCAAW,MAAC,QAAO;IACxE,oBAAoB,MAAC,UAAO,2CAAU;IACtC,gCAAO,8BAAwB,qBAAqB;IACpD,oBAAoB,MAAC,UAAO,wCAAyB,mCAAW,MAAC,aAAY;IAC7E,oBAAoB,MAAC,UAAO,+CAAa;IACzC,gCAAO,8BAAwB,qBAAqB;IACpD,oBAAoB,MAAC,UAAO,wCAAyB,mCAAW,MAAC,2BAA0B;IAC3F,oBAAoB,MAAC,UAAO,4DAA0B;IACtD,gCAAO,8BAAwB,qBAAqB;IACpD,oBAAoB,MAAC,UAAO,wCAAyB,mCAAW,MAAC,mBAAkB;IACnF,oBAAoB,MAAC,UAAO,oDAAkB;IAC9C,gCAAO,8BAAwB,qBAAqB;IACpD,oBAAoB,MAAC,UAAO,wCAAyB,mCAAW,MAAC,mBAAkB;IACnF,oBAAoB,MAAC,UAAO,oDAAkB;IAC9C,gCAAO,8BAAwB,qBAAqB;IACpD,oBAAoB,MAAC,UAAO,wCAAyB,mCAAW,MAAC,mBAAkB;IACnF,oBAAoB,MAAC,UAAO,qDAAmB;IAC/C,gCAAO,8BAAwB,qBAAqB;IAEpD,mBAAmB,MAAC,UAAO,4CAAW;IACtC,mBAAmB,MAAC,cAAW,qBAAqB;IAEpD,gCAAO,6BAAuB,SAAS;IACzC;;EAEA;;;;;QAEI,4TAAkE;IAEpE,gBAAgB,MAAC,UAAQ,4CAAW;IACpC,gBAAgB,MAAC,WAAQ,2CAAU;IAEnC,gCAAO,0BAAoB,SAAS;IACtC;;EAEA;;;;;;;QAEI,+HAAkE;QAClE,iHAAyD;QACzD,+8BAA6E;QAC7E,yUAA+E;QAC/E,iiBAA0E;IAE5E,2BAAwB,+BAAoB;IAE5C,6BAA6B,MAAC,UAAQ,iEAA+B;IACrE,6BAA6B,MAAC,WAAQ,2CAAU;IAChD,gCAAO,uCAAiC,qBAAqB;IAE7D,sBAAmB,0BAAe;;IAIlC;yJAOiC;;;;;;;;IAGjC;IAEF;;AAEF","file":"zcl_abapgit_object_intf.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects.clas.mjs":{"lineLengths":[53,32,27,32,47,37,1330,568,200,1005,802,203,974,2421,3049,2832,1054,1529,1769,2323,2056,296,865,1162,284,2491,5685,4826,1789,1691,1578,978,293,825,367,831,17,42,22,75,77,91,3,29,64,16,3,27,49,3,34,97,597,61,601,73,71,73,126,122,21,5,9,65,148,17,106,14,16,7,5,40,76,5,19,3,43,65,3,50,597,61,120,58,9,189,138,294,41,17,22,44,61,13,16,20,9,7,90,244,14,196,7,5,35,57,5,42,891,66,891,69,73,257,75,79,542,29,89,69,38,123,125,81,9,44,52,7,58,151,159,7,5,37,59,5,44,104,72,56,75,11,230,43,19,24,46,80,85,81,63,15,18,22,11,9,52,74,17,81,218,16,67,9,7,41,63,7,48,100,77,820,68,130,633,71,40,132,21,11,73,109,309,11,9,7,31,53,7,38,77,601,65,152,29,7,44,66,7,51,133,71,894,71,1061,71,124,62,519,147,68,197,73,145,601,132,159,110,19,11,63,33,92,95,33,68,94,19,11,89,52,19,11,258,132,59,19,11,63,63,107,191,603,83,318,13,18,333,11,9,7,34,56,7,41,130,601,65,144,86,308,77,111,86,114,74,77,1012,145,144,61,45,16,84,9,105,69,72,31,45,92,79,65,56,64,122,54,16,73,9,168,167,175,9,13,98,99,95,144,21,118,154,75,19,118,27,124,91,24,26,17,15,20,87,13,18,20,11,9,53,58,63,9,22,7,27,49,7,34,817,68,692,71,124,62,601,139,817,819,820,134,68,631,45,17,9,31,53,102,120,18,183,11,9,96,154,9,13,87,134,78,152,21,110,28,101,33,18,20,11,9,54,63,26,22,55,44,73,43,190,43,66,68,17,157,86,61,89,39,59,237,15,25,114,32,61,105,200,17,22,24,15,13,11,193,18,11,9,54,97,144,147,9,59,7,34,56,7,41,106,74,601,65,104,80,130,126,17,9,67,107,7,32,54,7,39,670,123,65,4571,71,124,62,601,130,894,106,142,308,136,1369,139,71,820,350,1957,132,147,144,126,165,1093,148,1770,1065,59,77,96,154,9,69,122,125,47,35,9,136,134,82,201,127,167,308,100,123,16,186,9,111,93,73,42,279,41,67,67,15,99,241,107,13,99,52,13,51,186,88,88,23,13,133,66,102,60,89,20,44,49,13,129,132,67,93,78,47,73,85,88,37,61,116,266,182,15,77,51,49,49,57,13,108,270,13,43,46,23,112,28,99,194,23,20,22,13,11,9,59,161,107,97,88,33,7,39,61,7,46,4571,123,65,101,25,7,40,62,7,47,1738,65,124,62,104,80,661,65,139,127,132,1063,69,203,145,84,39,433,15,222,167,214,23,112,28,113,222,20,22,13,11,9,237,46,118,123,125,124,125,123,124,9,59,77,105,7,38,60,7,45,1957,68,124,62,104,80,661,65,1770,71,40,129,9,91,72,7,42,64,7,49,737,136,62,118,107,53,91,75,77,254,9,71,78,9,30,7,27,49,7,34,104,601,65,130,44,25,9,126,46,25,9,13,69,72,21,110,48,18,20,11,9,23,7,37,59,7,44,1957,1770,53,116,93,68,69,53,115,98,68,69,53,115,102,68,69,53,115,94,67,69,68,24,7,44,66,7,51,72,75,77,58,142,94,116,11,9,24,7,30,52,7,37,106,601,65,130,126,48,27,9,13,69,77,21,318,50,18,20,11,9,25,7,33,55,7,40,104,601,65,111,86,114,13,87,46,21,110,49,18,20,11,9,23,7,38,60,7,45,104,58,77,601,266,298,48,25,9,115,77,80,31,53,92,50,64,99,123,61,25,9,63,23,7,25,47,7,32,601,65,605,77,75,77,74,86,110,83,111,130,104,126,198,9,67,105,226,9,144,64,219,9,64,226,9,7,41,63,7,48,820,1369,74,601,1093,73,42,66,67,67,75,9,24,7,39,61,7,46,820,817,68,601,631,71,41,66,64,66,75,9,24,7,30,52,7,37,1587,601,65,144,86,130,134,138,142,544,126,241,9,99,111,63,88,50,13,76,21,110,28,175,33,18,20,11,9,104,264,9,98,126,9,78,79,171,92,40,124,9,33,7,30,52,7,37,275,243,601,266,270,54,127,95,298,105,241,56,110,11,26,9,74,13,190,139,96,45,21,26,48,65,17,20,24,13,11,235,44,96,11,79,99,73,35,48,62,101,125,97,108,13,11,88,26,9,42,64,9,49,108,76,330,108,65,170,76,76,38,98,194,143,185,11,9,7,64,1250,509,140,292,1600,277,508,1027,1250,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_objects.clas.abap"],"names":[],"mappings":";;AAqNA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;QAEQ,qHAAqC;IAG3C,iBAAyC,IAAtC,sEAAwC,wBAAU;MACnD;IACF;IAEA;MACI,YAAS,6CAAwB;MACjC,aAAU,+HAA4D;;;;;;IAG1E;IAEA,yBAAG,QAAkB;MAEnB,YAAU,0CAA2B,cAAc;IACrD;IAEF;;EAGA;;;;;;;;;;;;;;;;;;;;;;MAWE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;mPAE2B;MAC1C;mMAEwC;MACxC;IAEF;IAGA;;;;;;UAEQ,g3BAA+D;UAC/D,0DAA6B;UAC7B,8DAA6B;UAC7B,sPAAgE;UAChE,gEAA4C;UAC5C,oEAA6B;MAEnC,IAAe,WAA+B;MAE9C,aAAW,QAAQ;MACnB;;;QAGE,iBAAW,GAAR,SAAU,WAAS,MAAC,MAAK,iBAAgB,GAAZ,aAAc,WAAS,MAAC,UAAQ;UAC9D,sCAAY,WAAS,MAAC,OAAK,WAAS,MAAC,oBAAc,aAAa;UAChE,gCAAO,uBAAiB,aAAa;QACvC;QACA,YAAU,WAAS,MAAC,KAAI;QACxB,gBAAc,WAAS,MAAC,SAAQ;MAClC;MAEA,yBAAG,wBAA4B;QAC7B,sCAAqB,wBAAmB,iBAAmC;8JACR;MACrE;IAEF;IAGA;;;;;;;;;qOAckC;;;;;;;;;;;;;;QAChC,IACE,OAEA,KAHG,eAAE,MAAC,MAAR;;UAEI;;yNAEoG;;kEAE/D;;MAG3C;MAGA;;;;;;;;YAEQ,qHAAqC;QAE3C,IAAe,WAA+B;;;UAM5C,iBAA2C,IAAxC,0EAA0C,wBAAU;YACrD;UACF;UAEA,YAAS,iDAA0B;UAEnC,iBAAwB,IAArB,oDAAuB,uBAAS;oTAEgC;UACnE;QAEF;MAEF;MAGA;;;;;;;QAEE,sCAAY,yDAAsB,OAAO,MAAC,oBAAc,aAAa;QAEvE;;MAGA;;;;;;;;;;;;YAKQ,0fAA2D;YAC3D,sIAAmD;YACnD,uDAAwB;YACxB,wLAAwD;YACxD,4DAA6B;YAC7B,oIAAoD;YACpD,4kBAAuD;;QAI7D,iBAAsB,GAAnB,SAAS,MAAC,WAAY,wCAAO,iBAAa,GAAT,UAAW,gCAAC;UAC9C,iBAAwB,IAArB,oDAAuB,wBAAU;YAClC;UACF;UAEA;;;;;kEAC8D;UAC9D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;YACd;UACF;UAEA,mBAAgB,0DAA4B;UAC5C,yBAAO,cAAsB;YAC3B;UACF;;UAQA,eAAY,yGACyC;UACrD,yBAAG,SAAS,MAAC,MAAe;YAC1B;UACF;UAGA,OAAO,MAAC,cAAW,SAAS,MAAC,SAAQ;UACrC,OAAO,MAAC,cAAW,SAAS,MAAC,SAAQ;0GAEG;UAGxC,iBAAyE,IAAtE,sIAAwE,uBAAS;YAClF,eAAY,8jBAQ6B;YAEzC,iBAAa,GAAV,WAAY,qCAAG;6TAE+D;YACjF;UACF;4UAEkG;UAClG;QACF;MAEF;MAGA;;;;;;;;;;;;;;YAEQ,6DAAiC;YACjC,gEAAiC;YACjC,u+BAAwD;YACzD,oIAAiD;YACjD,mIAAkD;QAEvD,yBAAG,yBAAuB;UACxB,mBAAiB,cAAc;QACjC;UACE,oBAAiB,oDAA+B;QAClD;QAEA;;;;2CACoD;QACpD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,kBAAgB,qBAAqB,MAAC,SAAQ,MAAC,OAAM;QACvD,gCAAO,sBAA0B;UAK/B,qBAAqB,MAAC,UAAY,OAAO;UACzC,qBAAqB,MAAC,cAAY,WAAW;UAC7C,6GAA6D;UAC7D,kBAAgB,WAAW,MAAC,OAAM;QACpC;UACE,mBAAgB,0CAAqB;QACvC;QAEA,6JAAqE;QAErE,iBAAyD,IAAtD,gHAAwD,uBAAS;UAElE,mKAAiE;QACnE;QAEA;;;;;;;;;;;;;;;;;;;;;;;;QAkBA;QAEA,yBAAG,iBAAe;qCAChB,aAAe,MAAM;UACrB,WAAW,OAAE,mBAAiB,cAAc;QAC9C;QAEF;;MAGA;;;;;;;;;;YAEQ,4kBAAiD;YACjD,8HAA4C;YAC5C,oyBAAyB;YACzB,syBAAyB;YACzB,uyBAAqD;YACrD,yHAA6C;YAC7C,uDAAkB;QAExB,IAAe,YAAgC;QAE/C,yBAAG,SAAmB;UACpB;QACF;QAEA,aAAW,QAAQ;QAEnB,yBAAG,iBAAe;UAChB,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;uHACqB;UAC7C;sLACkE;UAClE;QACF;QAEA,iBAAgC,GAA7B,SAAS,MAAC,UAAS,MAAC,WAAW,uBAAS;yJAC2C;QACtF;QAEA;sFACqE;UAEjE,iBAAc,yGAAuD;UAErE,cAAW,oDAA8B;uJAGK;;;;;;;;;QAKlD;QAEA,aAAW,+BAAC;;;;;UAEV,sBAAM,UAAU;;;6LAGoD;YAElE,sBAAM,OAAO;YACb,OAAO,MAAC,cAAW,YAAU,MAAC,OAAM;YACpC,OAAO,MAAC,cAAW,YAAU,MAAC,SAAQ;YAEtC;4JAIoD;cAEhD,qEAAuC;;cAEvC,aAAoB,mBAAT,SAAW,gCAAC;cAGvB;cAEA,yBAAG,iBAAe;4OAEqB;cACvC;;;;;;;;;;;YASJ;UAEF;UAGA,iBAAqB,GAAlB,yBAAO,YAAa,gCAAE,iBAAuB,GAApB,yBAAO,cAAe,gCAAC;YACjD;UACF;QACF;;gGAEwD;QAExD,yBAAG,mBAAkB,iBAAsB,GAAlB,yBAAO,YAAa,gCAAC;kJAC4B;QAC1E;0DAEmB;MAErB;MAGA;;;;;;;;;;YAEQ,qHAAqC;QAG3C,iBAAyC,IAAtC,sEAAwC,wBAAU;UACnD;QACF;QAEA,YAAS,6CAAwB;0GAEY;MAE/C;MAGA;;;;;;;;;;;YAEQ,4kBAAiD;YACjD,qHAA0C;YAC1C,i3BAAyD;YACzD,6FAAyB;YACzB,iIAAiD;YACjD,uSAAqD;YACrD,2HAA6C;YAC7C,40CAAuD;YACvD,8HAA4C;YAC5C,0DAAuB;YACvB,uyBAAqD;YACrD,iVAAoE;YACpE,w5DAAqD;YACrD,uHAA6C;YAC9C,sIAAoD;YACpD,mIAAkD;YAClD,iHAAsC;YACtC,wJAAgE;QAErE,IAAe,aAAoD;QAAnE,IACe,cAA6E;QAD5F,IAEe,WAA8D;QAF7E,IAGe,YAAoE;QAEnF,cAAW,mCAAwB;QAEnC,gBAAa,mDAAuB;QAEpC,iBAAgC,GAA7B,SAAS,MAAC,UAAS,MAAC,WAAW,uBAAS;yJAC2C;QACtF;oEAEwC;QAExC,eAAY,iGAAwD;QAEpE,gBAAa,mGAEM;QAEnB,yBAAG,WAAqB;UACtB;QACF;uIAO6B;QAE7B,iBAAc,2GAAyD;QAEvE,cAAW,0DAAkC;QAE7C,cAAW,iLAE+B;8HAEwB;sKAGpB;QAE9C,oBAAiB,sRAE8D;QAE/E,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;0HAC0B;QAClD;yLACuE;QACvE;;QAIA,qBAAkB,8DAAyC;;;sRAGiD;UAE1G,sBAAM,OAAO;UACb,OAAO,MAAC,cAAW,aAAW,MAAC,SAAQ;UACvC,OAAO,MAAC,cAAW,aAAW,MAAC,SAAQ;UAGvC;YACI,iBAAoB,GAAjB,OAAO,MAAC,WAAY,wCAAM;cAE3B,gBAAa,iNAGiB;0GAII;YACpC;YAEA,iBAAoB,GAAjB,OAAO,MAAC,WAAW,wCAAM;cAG1B,YAAU,aAAW,MAAC,KAAI;YAC5B;YAEA,OAAO,MAAC,cAAW,UAAU;YAC7B,OAAO,MAAC,4BAAwB,mIAEmD;YAEnF,iBAAwB,GAArB,aAAW,MAAC,WAAW,uBAAS;uFAGa;cAE9C;YACF;;iEAQgC;YAEhC,iBAAiC,IAA9B,0CAAgC,wBAAU;cAE3C,YAAS,gCAAqB;cAC9B,iBAAc,wDAAuB;YACvC;cAEE,sBAAO,MAAM;cAAb,sBAAe,WAAW;YAC5B;YAEA,YAAS,uGAG0B;mIAMb;YAEtB,MAAM,OAAE,gCAAW,QAAQ;YAG3B,iBAAc,8DAAgC;;;cAG5C;;;;2DAAuE;cACvE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACnB,iBAAgB,GAAb,gBAAe,mCAAoB,6BAAU,MAAC,MAAK,iBACc,IAAjE,4FAAmE,wBAAU;qLAEE;cAClF;;cAEA,YAAU,MAAC,UAAU,OAAO;cAC5B,YAAU,MAAC,SAAU,MAAM;cAC3B,YAAU,MAAC,SAAU,MAAM;cAC3B,YAAU,MAAC,aAAU,UAAU;YACjC;YAGA,iBAAwC,IAArC,iDAAuC,uBAAS;6QAMpB;YAC/B;YAEA,sBAAO,OAAO;YAAd,sBAAgB,UAAU;;;;;;;;;;UAS9B;QAEF;0DAEmB;gKASmB;0GAIQ;gGAEU;uFAE9B;QAE5B;;MAGA;;;;;;;QAEE,eAAY,4EAAwD;QAEtE;;MAGA;;;;;;;;;;;;YAEQ,8HAA4C;YAC5C,kHAAwC;YACxC,uHAA6C;QAEnD,IAAe,UAAqC;oEAGZ;0MAE8B;QAEtE,iBAAc,sHAA8D;;;gbAMD;UAEzE;6NAK4D;YACxD,iCAAgB,+GAAiD,QAAQ;qNAG3B;;;;;;;;;UAOlD;QAEF;4OAG+E;QAE/E,IACE,OAIA,AAIA,KATG,OAAO,MAAC,QAAb;;0HAIwB;;2HAIA;;0HAKA;2HAGA;;0DAGL;QAGnB,aAAU,sDAAiC;wGAGS;MAEtD;MAGA;;;;;;;;;;;;QAEE,IAAc,WAA+B;;;gIASd;QAC/B;QAEA;;MAGF;MAGA;;;;;;;;;QAIE,yBAAG,iBAAe;UAChB,cAAc,MAAC,oBAAwB,uCAA4B;UACnE,cAAc,MAAC,cAAwB,6BAAkB;UACzD,cAAc,MAAC,wBAAwB,qBAAqB;UAC5D,cAAc,MAAC,4BAAwB,kMAEc;QACvD;QAEA,yBAAG,cAAc,MAAC,eAAwB;UACxC,cAAc,MAAC,mBAAgB,eAAE,MAAC,MAAK;QACzC;QAEF;;MAGA;;;;;;;YAEQ,qHAAqC;QAG3C,yBAAG,QAAkB;UACnB;QACF;QAGA,iBAAyC,IAAtC,sEAAwC,wBAAU;UACnD,YAAU,sBAAS;UACnB;QACF;QAEA;UACI,YAAS,6CAAwB;UACjC,aAAU,+CAAiB;;;;;;;QAI/B;QAEF;;MAGA;;;;;QACE,IAAe,WAA2D;;QAG1E,WAAS,MAAC,aAAe,mCAAoB,6BAAU,MAAC,MAAK;QAC7D,WAAS,MAAC,WAAe,uDAAqB;QAC9C,WAAS,MAAC,kBAAe,uBAAU;QACnC,WAAS,MAAC,WAAe,+BAAC;;QAG1B,WAAS,MAAC,aAAe,mCAAoB,6BAAU,MAAC,KAAI;QAC5D,WAAS,MAAC,WAAe,4DAA0B;QACnD,WAAS,MAAC,kBAAe,uBAAU;QACnC,WAAS,MAAC,WAAe,+BAAC;;QAG1B,WAAS,MAAC,aAAe,mCAAoB,6BAAU,MAAC,KAAI;QAC5D,WAAS,MAAC,WAAe,gEAA8B;QACvD,WAAS,MAAC,kBAAe,uBAAU;QACnC,WAAS,MAAC,WAAe,+BAAC;;QAG1B,WAAS,MAAC,aAAe,mCAAoB,6BAAU,MAAC,KAAI;QAC5D,WAAS,MAAC,WAAe,wDAAsB;QAC/C,WAAS,MAAC,kBAAe,sBAAS;QAClC,WAAS,MAAC,WAAe,+BAAC;QAE1B;QACF;;MAGA;;;;;;;QAEE,yBAAG,sBAA0B;;UAE3B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb,cAAW,wFAAyC;UACtD;QACF;QAEF;;MAGA;;;;;;;YAEQ,qHAAqC;QAG3C,iBAAyC,IAAtC,sEAAwC,wBAAU;UACnD,cAAY,sBAAS;UACrB;QACF;QAEA;UACI,YAAS,6CAAwB;UACjC,eAAY,kDAAoB;;;;;;;QAMpC;QAEF;;MAGA;;;;;;;;;;QAEE;sFAGuC;UACnC,YAAU,sBAAS;;;;;;;QAGvB;QAEF;;MAGA;;;;;;;YAEQ,4kBAA2D;YAC3D,6PAA6C;QAEnD,IAAc,yBAA+C;QAE7D,yBAAG,YAAsB;UAEvB;QACF;QAEA;;;;mDAEiC;QAEjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UAEd,OAAO,MAAC,cAAW,WAAW;UAE9B,qBAAqB,MAAC,cAAY,WAAW;UAC7C,qBAAqB,MAAC,gBAAY,4CAAuB;UAEzD,8GAA8D;UAE9D,YAAU,qBAAqB,MAAC,UAAS;UACzC;QAEF;QAEA,YAAU,yBAAuB,MAAC,UAAS;QAE7C;;MAGA;;;;;;;;;;;;;;;YAEQ,qHAAsC;YACtC,2FAAsB;QAG5B,iBAAyC,IAAtC,sEAAwC,wBAAU;qMAC+C;QACpG;QAGA,YAAS,6CAAwB;QAEjC,iBAAqB,IAAlB,iDAAoB,wBAAU;iOACiE;QAClG;QAGA,aAAU,yHAAsD;QAEhE,iBAAW,GAAR,SAAU,wBAAU;UAErB,aAAU,kMAIwB;QACpC;QAEA,iBAAW,GAAR,SAAU,wBAAU;iOAC2E;QAClG;MAEF;MAGA;;;;;;;YAEQ,4kBAA6B;QACnC,IAAe,aAAmD;;;UAIhE,OAAO,MAAC,cAAW,aAAW,MAAC,QAAO;UACtC,OAAO,MAAC,cAAW,aAAW,MAAC,SAAQ;UACvC,OAAO,MAAC,cAAW,aAAW,MAAC,SAAQ;UACvC,8DAAkC;QAEpC;QAEF;;MAGA;;;;;;;YAEQ,4kBAA6B;QACnC,IAAe,YAAiD;;;UAI9D,OAAO,MAAC,cAAW,YAAU,MAAC,SAAQ;UACtC,OAAO,MAAC,cAAW,YAAU,MAAC,OAAM;UACpC,OAAO,MAAC,cAAW,YAAU,MAAC,SAAQ;UACtC,8DAAkC;QAEpC;QAEF;;MAGA;;;;;;;;;YAEQ,qHAAuC;YACvC,yHAA0C;YAC1C,6HAA2C;YAC3C,iIAA8C;QAEpD,IAAc,WAA8C;QAE5D,iBAAyC,IAAtC,sEAAwC,wBAAU;gPAG5B;QACzB;QAEA,YAAS,6EAE0B;;QAGnC,MAAM,OAAE,gCAAW,QAAQ;;QAI3B,iBAAiB,MAAC,UAAO,OAAO;QAEhC;2EAC+B;;;;;;;;;QAI/B;QAEA,iBAAwC,IAArC,iDAAuC,uBAAS;uQAMtB;QAC7B;QAEA,iBAAiC,IAA9B,0CAAgC,wBAAU;6HAGF;QAC3C;QAEA,iBAAiB,MAAC,YAAQ,iCAAsB;8EAEL;QAE3C,iBAAiB,MAAC,KAAI,MAAC,cAAW,gCAA4B,IAArB,oDAAuB,wBAA9B,CAA0C;;;UAG1E,WAAS,MAAC,WAAO,oFAA6C;QAChE;QAEF;;MAGA;;;;;YAEO,sOAAkD;YAClD,4kBAA2D;YAC3D,6PAA6C;YAC7C,iQAA4D;YAC5D,yCAA2C;YAC3C,kHAAkD;QAEvD,IAAc,aAAmC;QACjD,IAAc,yBAA+C;QAE7D,iBAAiC,GAA9B,mDAAgC,uBAAS;;;YAExC,+FAA2D;UAC7D;UACA;QACF;QAGA,sBAAM,0CAAsB;;;;;;;;;;;;;;;;;YAS1B,iFAA6C;UAC/C;UAEA,aAAU,sDAAiC;kGAC2B;;;YAGpE,OAAO,MAAC,cAAW,OAAO;YAE1B,qBAAqB,MAAC,cAAY,OAAO;YACzC,qBAAqB,MAAC,gBAAY,4CAAuB;YAEzD,8GAA8D;YAE9D,iBAAmC,GAAhC,qBAAqB,MAAC,YAAY,uBAAS;cAC5C,2FAAyD;YAC3D;UACF;UAEA,sDAAgC,sBAAS;UAE3C;;QAGA;;;;;;cAEQ,2TAAwD;cACxD,6FAAoC;cACpC,kDAA8B;UAGpC,iBAAc,6IAAuE;UACrF,gCAAO,oBAAc,WAAW;;;YAI9B,kCAAU,uCAAS,WAAU;;;;UAM/B;QAEF;MACF","file":"zcl_abapgit_objects.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_bridge.clas.mjs":{"lineLengths":[89,53,39,68,32,54,57,198,571,172,234,576,72,691,17,12,42,22,54,68,96,106,210,3,22,51,3,29,293,111,95,243,265,86,13,5,67,235,69,201,37,11,105,99,93,62,19,116,19,16,18,9,7,190,137,87,61,79,52,113,92,244,9,7,5,292,37,103,97,91,60,190,137,78,61,79,52,113,7,5,3,29,597,61,265,137,28,92,27,83,86,27,59,88,121,115,91,65,180,127,117,12,162,110,22,5,16,3,46,97,68,64,59,19,3,42,102,70,100,76,119,9,198,145,62,17,94,25,116,14,16,7,5,3,47,102,70,132,58,109,61,120,58,100,76,119,9,188,135,91,17,94,25,116,14,16,7,5,3,37,100,196,143,73,19,3,45,141,25,25,3,57,825,822,82,29,29,3,52,343,596,202,149,79,76,134,77,134,12,134,5,20,3,43,304,596,202,149,79,60,23,3,40,102,42,21,3,40,105,46,24,3,40,100,68,64,194,141,58,40,19,3,58,87,3,65,71,73,67,61,132,58,102,70,597,58,11,3,58,87,3,65,597,61,71,70,11,3,45,134,58,184,131,64,3,1,72,119,513,517,82,80,80,80,619,286,515,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_objects_bridge.clas.abap"],"names":[],"mappings":";;;AAuCA;;;;;;;;;;;;;;;;;;;;;EAGE;;;;QAEO,4RAAqE;QACrE,sGAA+C;QAC/C,sFAAqC;QACrC,0OAAuE;QACvE,gQAA8C;IAEnD,iBAAW,GAAR,oCAAU,uBAAS;MACpB;IACF;IACA,uCAAU,sBAAS;IAEnB;IAOA,sBAAM,yCAAc;;;MAIlB;;;;;;;;;;;MAIA;;;;MAMA,cAAc,MAAC,kBAAe,eAAe;;;QAE3C,sGAA+C;QAC/C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UAGd,oCAA2B,GAApB,iMAEoB;QAC7B;MACF;IACF;;;;;;;;;;MAYE,cAAc,MAAC,kBAAe,eAAe;;;QAE3C,sGAA+C;MACjD;IACF;EAEF;EAGA;;;QAEO,gQAA0C;wIAGuB;2BAEzD;IAGb;;;;;yDAC2C;IAC3C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;;;;;;IAOf;MACE;;;IAGF;IACF;;EAGA;;;;IACE,YAAU,yCAAc;IAC1B;;EAGA;;;;;QACO,8GAAqC;IAE1C;;;;;;;;;;;IAIA;EAEF;EAGA;;;;;;;;;;;QAEQ,8GAA4C;IAElD;;;;;;;;;;;IAOA;EACF;EAGA;;;;;IAMA;;EAGA;;IACE;IACF;;EAGA;;;;IACE;IACF;;EAGA;;QAEO,2kBAAwB;;;;IAM7B,iBAAsB,GAAnB,OAAO,MAAC,aAAa,uBAAS;MAC/B,gCAAO,mCAAoB,6BAAU,MAAC,eAAQ,QAAQ;IACxD,wBAAoB,GAAb,OAAO,MAAC,OAAO,uBAAS;MAC7B,gCAAO,mCAAoB,6BAAU,MAAC,eAAQ,QAAQ;IACxD;MACE,gCAAO,mCAAoB,6BAAU,MAAC,eAAQ,QAAQ;IACxD;IAEF;;EAGA;;QAEO,2kBAAwB;;;;IAM7B,kCAAmB,SAAW,WAAW;IAE3C;;EAGA;;IACE,cAAY,sBAAS;IACvB;;EAGA;;IAEE,iBAAe,uBAAU;IAE3B;;EAGA;;;;;;;IAGE,YAAU,sBAAS;IAErB;;EAGA;;;;;;;;;;;;;;IACE;EACF;EAGA;;;;;;;;IACE;EACF;EAGA;;;;;;EAMA;AACF","file":"zcl_abapgit_objects_bridge.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_files.clas.mjs":{"lineLengths":[53,38,33,32,53,37,695,743,966,145,381,412,797,353,354,798,308,684,299,593,350,351,980,980,757,390,168,200,233,453,17,42,22,598,667,890,68,3,20,508,61,69,3,25,46,61,123,58,69,508,146,99,65,192,119,69,3,30,138,76,508,86,51,13,5,65,318,69,3,24,46,61,66,58,69,61,508,65,36,159,69,3,27,46,61,66,58,69,67,508,65,159,119,69,3,24,46,61,134,58,105,76,105,304,73,66,508,123,65,191,231,106,120,69,3,29,597,61,67,61,30,30,16,3,30,103,46,61,66,58,71,148,55,68,116,129,29,72,12,63,75,78,29,51,5,88,45,5,22,3,30,657,41,20,3,21,889,32,20,3,28,70,157,148,148,22,3,28,102,70,540,144,144,36,44,12,5,21,3,30,112,61,116,61,460,153,118,27,61,88,69,46,50,5,3,26,366,46,61,101,64,97,71,69,67,181,88,40,21,5,104,113,19,3,26,69,71,73,101,64,97,540,55,68,31,116,129,29,72,12,63,31,75,78,29,51,5,88,62,157,14,23,7,5,101,40,19,3,27,355,92,66,123,540,72,36,172,93,17,7,29,78,102,68,71,14,17,7,103,5,25,3,25,69,46,61,66,58,71,148,68,19,3,28,69,46,61,66,58,71,69,148,68,106,21,3,25,132,46,61,71,69,66,180,68,103,125,18,3,26,889,64,540,41,160,36,47,82,73,82,7,5,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_objects_files.clas.abap"],"names":[],"mappings":";;AAgIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;IACE,gCAAO,iBAAW,aAAQ;EAC5B;EAGA;;;;;QAEQ,4DAAqB;QACrB,mfAAmD;IAGzD,sCAAqB,kBAAa,SAAsD;IAExF,oCAAY,UAAa,uCAAwB,QAAO;IAExD,OAAO,MAAC,UAAO,oCAAG;IAClB,OAAO,MAAC,eAAW,8JAGE;IACrB,OAAO,MAAC,WAAO,yFAAwD;IAEvE,gCAAO,iBAAW,aAAQ;EAE5B;EAGA;;;QAEO,mfAAiD;IAEtD,OAAO,MAAC,WAAO,wDAAuB;IACtC,yBAAG,OAAO,MAAC,MAAe;MACxB;IACF;IAEA,OAAO,MAAC,UAAW,oCAAG;IACtB,OAAO,MAAC,eAAW,4RAGgB;IAEnC,gCAAO,iBAAW,aAAQ;EAE5B;EAGA;;;;;;;QAEQ,mfAAiD;IAEvD,OAAO,MAAC,UAAW,oCAAG;IACtB,OAAO,MAAC,UAAW,OAAO;IAC1B,OAAO,MAAC,eAAW,6HAGE;IAErB,gCAAO,iBAAW,aAAQ;EAE5B;EAGA;;;;;;;QAEQ,mfAAiD;IAGvD,OAAO,MAAC,UAAO,oCAAG;IAClB,OAAO,MAAC,eAAW,6HAGE;IACrB,OAAO,MAAC,WAAO,yFAAwD;IAEvE,gCAAO,iBAAW,aAAQ;EAE5B;EAGA;;;;;;;;;;QAEQ,yDAAmB;QACnB,mfAAiD;IAEvD,YAAS,yGAC2C;IACpD,OAAO,MAAC,UAAO,oCAAG;IAElB,OAAO,MAAC,eAAW,6JAGC;IAEpB,gOAG+C;IAC/C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB,OAAO,MAAC,WAAO,0FAAyD;IAExE,gCAAO,iBAAW,aAAQ;EAC5B;EAGA;;;;;IACE,iBAAU,OAAO;IACjB,iBAAU,OAAO;IACnB;;EAGA;;;;;;QACQ,8DAAuB;IAE7B,iBAAc,6HAGO;IAErB,yBAAG,uBAAsB;MACvB;;;;sEAGqC;IACvC;MACE;;;;iDAEqC;IACvC;IAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,eAAa,sBAAS;IACxB;IACF;;EAGA;;IACE,aAAW,sBAAiB;IAC9B;;EAGA;;IACE,aAAW,aAAQ;IACrB;;EAGA;;IACE,gBAAa,uIAEK;IAElB,6IAAsD;IACtD,6IAAsD;IACxD;;EAGA;;QAEO,6DAAsB;IAE3B,IAAc,WAA+B;IAE7C,0IAAsD;;;MAGpD,cAAY,sBAAS;MACrB;IACF;IAEF;;EAGA;;;;;IAEE,IAAc,eAA4C;IAE1D;;;2DAC4C;IAC5C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;MAEb,eAAa,MAAC,UAAW,OAAO;MAChC,eAAa,MAAC,cAAW,OAAO;IAClC;EAEF;EAGA;;;;;;;QAEQ,8DAAuB;QACvB,4DAAwB;QACxB,0DAAuB;IAG7B,iBAAc,8JAGO;IAErB,aAAU,qEACmC;IAE7C,yBAAG,QAAkB;MACnB;IACF;IAEA,aAAU,qFAAsD;IAEhE;IAEF;;EAGA;;;;;;;IAEE,IAAc,WAAmC;IAEjD,yBAAG,uBAAsB;MACvB;;;;;sEAGqC;IACvC;MACE;;;;;iDAEqC;IACvC;IAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,iBAAY,GAAT,UAAW,uBAAS;4JAC4C;MACnE;QACE;MACF;IACF;oGAKgC;IAEhC,YAAU,WAAS,MAAC,KAAI;IAE1B;;EAGA;;QAEO,mFAAkB;QAClB,yDAAkB;QAClB,kHAAqC;IAC1C,IAAc,WAA+B;;;;MAM3C,mBAAe,GAAT,eAAE,MAAC,QAAQ;iBAAC;;MAElB,IACE,YADG,MAAL;;;mEAGkC;QAC9B,gCAAO,eAAS,aAAa;;QAE7B;;sGAK4B;IAElC;IAEF;;EAGA;;;;;;QAEQ,8DAAuB;IAE7B,iBAAc,6HAGO;IAErB,aAAU,iDAAwB;IAEpC;;EAGA;;;;;;QAEQ,8DAAuB;QACvB,4DAAwB;IAE9B,iBAAc,6HAGO;IAErB,aAAU,iDAAwB;IAElC,eAAY,qFAAsD;IAEpE;;EAGA;;;;QAEQ,8DAAuB;QACvB,4DAAwB;QACxB,yDAAuB;IAE7B,iBAAc,6JAGM;IAEpB,aAAU,iDAAwB;IAElC,YAAS,qFAAsD;;IAQjE;;EAGA;;;IAEE,IAAe,WAA+B;IAE9C,sBAAM,aAAQ;;;MAKZ,yBAAG,aAAkB;QACnB,uEAAoC;MACtC,wBAAe,GAAR,cAAU,WAAS,MAAC,MAAI;QAC7B,uEAAoC;MACtC;IACF;EAEF;AACF","file":"zcl_abapgit_objects_files.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_oo_base.clas.mjs":{"lineLengths":[53,32,27,32,47,64,211,187,432,1158,17,42,22,114,121,71,3,29,64,16,3,45,67,3,52,75,106,70,768,79,498,107,72,41,106,77,54,87,76,35,5,32,25,3,65,597,61,75,3,49,101,64,102,70,768,79,52,76,110,3,63,352,64,48,55,58,82,96,73,109,88,9,179,128,222,41,17,22,44,69,61,13,16,20,9,7,90,65,7,5,56,110,84,104,72,134,60,112,5,51,186,87,112,5,65,50,57,60,84,98,75,11,181,130,160,43,19,24,46,71,63,15,18,22,11,9,92,128,9,7,65,179,62,292,71,106,74,114,7,53,106,187,86,114,25,7,62,179,62,87,104,91,116,82,89,88,107,106,74,114,7,67,77,185,80,114,35,7,59,429,112,86,114,27,7,71,882,189,92,114,39,7,63,104,47,23,7,63,113,83,75,80,100,77,50,65,115,114,7,62,772,114,86,382,29,7,64,690,114,86,100,77,496,48,285,16,325,9,78,47,66,9,31,7,68,787,114,86,100,77,593,48,295,16,335,9,78,47,66,9,31,7,65,356,52,59,62,86,100,77,103,356,13,183,132,222,45,21,26,48,82,81,77,73,65,17,20,24,13,11,164,35,18,44,11,26,9,58,114,88,140,64,146,88,116,9,64,115,114,82,220,31,9,63,77,115,85,102,79,116,30,9,63,294,187,82,78,67,92,91,34,93,93,100,93,96,89,101,94,101,18,99,11,27,9,68,181,64,692,91,692,498,47,80,49,71,11,122,89,9,72,181,64,789,91,789,595,47,80,49,71,11,122,89,9,7,64,128,55,372,95,95,87,97,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/oo/zcl_abapgit_oo_base.clas.abap"],"names":[],"mappings":";;AAuBA;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;IACE,IAAe,gBAA0C;IAAzD,IACe,iBAA0C;;;MAGvD,iGAAsE;MACtE,kCAAmB,kBAAkB,iBAAe;MACpD,iBAAe,MAAC,aAAU,UAAU;MACpC,iBAAe,MAAC,WAAQ,6CAAsB;MAC9C,iBAAe,MAAC,cAAW,gBAAc,MAAC,SAAQ;MAC1B;IAC1B;IACuB;IACzB;;EAGA;;;0EACqD;EACrD;EAGA;;;;;;;;;IACE,oCAAS,GAAF,iCAAI,gCAAC;EACd;EAGA;;;;;;;;;;;;;;;;;;;;;;;;;;MAaE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gEACsB;MACtC;IACF;IAGA;;;;;;;MACE,oCAAS,GAAF,iCAAI,gCAAC;IACd;IAGA;;;MACE,oCAAS,GAAF,iCAAI,gCAAC;IACd;IAGA;;;;;;;;;;;;;;;;;;;;;;QAUE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+HACuC;QACvD;MACF;MAGA;;;;;;;QACE,oCAAS,GAAF,iCAAI,gCAAC;MACd;MAGA;;;;QACE,oCAAS,GAAF,iCAAI,gCAAC;QACd;;MAGA;;;;;;;;;;;;;QACE,oCAAS,GAAF,iCAAI,gCAAC;MACd;MAGA;;;;QACE,oCAAS,GAAF,iCAAI,gCAAC;QACd;;MAGA;;;;QACE,oCAAS,GAAF,iCAAI,gCAAC;QACd;;MAGA;;;;QACE,oCAAS,GAAF,iCAAI,gCAAC;QACd;;MAGA;;QACE,YAAU,yBAAoB;QAChC;;MAGA;;;;;;;;;;QACE,oCAAS,GAAF,iCAAI,gCAAC;MACd;MAGA;;;;QACE;QAOF;;MAGA;;;;;;QACE,IAAc,kBAA6C;QAE3D,yBAAG,YAAsB;UAEvB;QAIF;UAEE;QAKF;;;UAGE,sBAAM,kBAAgB,MAAC,QAAO;QAChC;QACF;;MAGA;;;;;;QACE,IAAc,kBAA6C;QAE3D,yBAAG,YAAsB;UAEvB;QAIF;UAEE;QAKF;;;UAGE,sBAAM,kBAAgB,MAAC,QAAO;QAChC;QACF;;MAGA;;;;;;;;YACQ,0FAAuB;YACvB,uVAAuB;;;;;;;;;;;;;;;;;;;UAkB7B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAa,GAAT,UAAW,wCAAmB;YAChD,aAAW,QAAQ;UACrB;YACE,sBAAM,QAAQ;UAChB;UACF;;QAGA;;;;;;;UACE,oCAAS,GAAF,iCAAI,gCAAC;QACd;QAGA;;;;UACE;UAEF;;QAGA;;;;;;UACE,oCAAS,GAAF,iCAAI,gCAAC;UACd;;QAGA;;;;;;cACO,6EAAsD;;UAE3D,IACE,OAEA,AAEA,AAEA,KAPG,OAAL;;YAEI,eAAY,gEAAsD;;YAElE,eAAY,gEAAsD;;YAElE,eAAY,4DAAkD;;YAE9D,eAAY,iEAAuD;YACnE,+BAAuB,wDAA6C;;YAEpE,eAAY,sEAA4D;;UAE9E;;QAGA;;;;;cACO,qqBAAoC;UACzC,IAAc,kBAA6C;UAE3D,oBAAkB,eAAe;;;YAE/B,kBAAgB,MAAC,aAAU,MAAM,MAAC,QAAO;UAC3C;;;QAGF;QAGA;;;;;cACO,swBAAoC;UACzC,IAAc,kBAA6C;UAE3D,oBAAkB,eAAe;;;YAE/B,kBAAgB,MAAC,aAAU,MAAM,MAAC,QAAO;UAC3C;;;QAGF;MACF","file":"zcl_abapgit_oo_base.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_oo_factory.clas.mjs":{"lineLengths":[53,35,30,32,50,37,258,361,17,42,22,86,3,29,64,16,3,21,46,3,28,159,57,82,91,86,39,5,83,103,90,107,5,37,3,1,64,174,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/oo/zcl_abapgit_oo_factory.clas.abap"],"names":[],"mappings":";;AAgBA;;;;;;;;;;;;;;;EAGE;;;;;;;IACE,yBAAG,2DAAkC;MACnC,8BAA4B,gDAAyB;MACrD;IACF;IACA,iBAAkB,GAAf,gBAAiB,wCAAM;;IAE1B,wBAAsB,GAAf,gBAAiB,wCAAM;;IAE9B;IACF;;AACF","file":"zcl_abapgit_oo_factory.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_oo_interface.clas.mjs":{"lineLengths":[77,53,37,60,32,52,64,25,801,497,650,76,76,82,94,88,77,17,12,42,22,3,29,64,16,3,29,56,3,36,85,288,67,103,61,100,70,91,95,9,143,36,17,100,138,85,22,104,118,133,53,58,27,114,176,18,71,11,83,16,18,9,7,24,5,30,57,5,37,105,63,263,69,86,80,180,108,43,11,191,140,144,114,110,93,145,19,126,165,16,18,9,7,90,65,7,66,11,71,43,19,24,46,85,63,15,18,22,11,9,150,202,9,13,53,21,118,28,97,18,20,11,9,7,34,61,7,41,107,104,74,267,71,106,74,205,26,7,53,105,68,106,74,772,83,56,80,79,189,872,142,135,110,64,61,131,62,19,11,9,129,41,85,13,15,206,155,303,47,23,28,50,75,75,75,82,76,72,67,19,22,26,15,13,23,130,19,210,159,266,51,27,32,54,79,79,79,86,80,76,71,23,26,30,19,17,22,24,15,13,96,71,13,11,57,192,93,17,208,157,114,49,25,30,52,81,77,77,78,74,69,21,24,28,17,15,98,73,15,13,71,185,68,298,77,112,80,113,72,95,82,194,143,62,197,146,149,111,85,62,119,131,74,96,17,15,13,59,112,193,92,19,210,159,115,51,27,32,54,84,83,79,78,83,71,23,26,30,19,17,210,33,15,67,437,120,94,125,54,161,35,15,79,890,197,100,21,195,144,204,53,29,34,56,85,80,83,73,25,28,32,21,19,102,51,109,77,19,76,78,81,81,81,81,81,81,79,49,17,15,82,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/oo/zcl_abapgit_oo_interface.clas.abap"],"names":[],"mappings":";;;AAiDA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;QAEQ,2FAAgC;QAChC,6DAAwB;QACxB,kFAAkC;IAExC,IAAe,WAAgB;IAE/B;MACI,gBAAa,uHAEY;mCACN;;;;;;;;;;;;;;;;;;;;;MAavB;MAEF;;IAGA;;;;;;;;UAEQ,2EAAwD;UACxD,qEAAmD;UACnD,yKAA4B;UAC5B,iGAA4B;MAGlC,SAAS,MAAC,aAAU,OAAO;MAE3B;;;;;;;;;;;;;;MAyBA;MACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gEACsB;MACtC;iEAEqC;;qEAOL;;;;;;;;;;;;QAChC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAiB,GAAd,eAAgB,uBAAS;yMAC8C;QAC3F;QAGA;oDACoC;;;;;;;;QAGpC;MAEF;MAGA;;;;;;;;;;;QACE,gBAAa,mLAGa;QAC5B;;MAGA;;;;;;;;;YAGI,kEAAuC;YACvC,gLAA+B;YAC/B,21BAAgC;QAElC,IAAe,cAA4B;QAE3C,4HAAqE;QACrE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAInB,iBAAY,GAAT,UAAW,uBAAS;UACrB,gBAAgB,MAAC,aAAU,cAAY;UACvC,mBAAgB,oGAAsE;UAEtF,iBAAiB,GAAd,eAAgB,cAAa;YAC9B;UACF;QACF;QAEA,mBAAgB,oGAEiC;QAGjD,kBAAgB,aAAa;QAC7B,aAAa,MAAC,WAAQ,6CAAsB;QAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAmCA;YACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sEACsB;YACtC;UAEF;UAGA;;;;;;;;;;;;;;;;;;;;;;cAWE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wEACsB;cACtC;YACF;YAGA;;;;;;;kBAEQ,8FAAyB;kBACzB,qDAAuB;kBACvB,4EAAqD;kBACrD,+DAAkC;;;;;;;cAUxC,gBAAa,+EAEiB;cAE9B,eAAY,sDAA2C;cACvD,yBAAG,oBAAwB;gBACzB,gBAAa,qFAA2D;gBACxE,gBAAa,iGAEuC;gBACpD,iBAAc,GAAX,YAAa,uBAAS;+FAEa;gBACtC;cACF;YAEF;YAGA;;;;;;;;;;;;;;;;;;;;;;;gBAWE,cAAY,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAlC,CAAqC;gBACnD;;cAGA;;;;oBACO,wGAAiC;gBACtC,sBAAoB,cAAc;gBAClC,iCAAO,kGAAwE,WAAW;gBAC5F;;cAGA;;;;;;;;;;;;;;;;;;;;;kBAYE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;oBACb;kBACF,wBAAgB,GAAT,eAAE,MAAC,QAAS,gCAAC;4EACkB;kBACtC;kBAEA,sBAEE,uBAAuB,MAAC,KAAI;kBAF9B,sBAGE,uBAAuB,MAAC,OAAM;kBAHhC,sBAIE,uBAAuB,MAAC,UAAS;kBAJnC,sBAKE,uBAAuB,MAAC,UAAS;kBALnC,sBAME,uBAAuB,MAAC,UAAS;kBANnC,sBAOE,uBAAuB,MAAC,UAAS;kBAPnC,sBAQE,uBAAuB,MAAC,UAAS;kBARnC,sBASE,uBAAuB,MAAC,UAAS;kBATnC,sBAUE,uBAAuB,MAAC,QAAO;kBACnC;;cACF","file":"zcl_abapgit_oo_interface.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_password_dialog.clas.mjs":{"lineLengths":[53,40,35,32,55,37,25,391,17,42,22,3,29,64,16,3,22,52,3,29,71,73,67,58,67,58,142,185,11,73,19,120,26,95,16,18,9,7,12,11,206,154,217,164,94,19,80,17,16,18,9,7,11,206,154,221,168,98,19,80,15,210,158,226,173,103,23,84,21,20,22,13,11,16,18,9,7,5,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/zcl_abapgit_password_dialog.clas.abap"],"names":[],"mappings":";;AAqBA;;;;;;;;;;;;;;EAGE;;;;;;;;;;QAEQ,qIAAgD;IAEtD,iBAAyE,IAAtE,sIAAwE,uBAAS;MAElF;;;;;;;;;MAYA;IACF;MAOE;;;;;;;;;;;;MAMA;MACA;;;;;;;;;;;;;;;;;;;;;;;;MAaA;IACF;EAEF;AACF","file":"zcl_abapgit_password_dialog.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_path.clas.mjs":{"lineLengths":[53,29,24,32,44,37,25,408,295,406,374,286,17,42,22,3,29,64,16,3,27,46,3,34,67,70,70,65,55,63,67,110,134,30,112,25,79,146,32,14,61,111,102,9,101,58,7,123,59,12,119,5,19,3,42,61,3,49,71,67,61,51,64,247,73,57,12,58,5,76,54,56,26,23,3,24,43,3,31,99,67,61,99,18,3,26,45,3,33,99,67,61,69,67,62,63,54,78,390,18,3,36,55,3,43,71,73,67,58,71,70,62,62,136,67,70,63,12,37,35,5,114,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_path.clas.abap"],"names":[],"mappings":";;AAiCA;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;QAEQ,sDAAc;QACd,0DAAmB;IAEzB,YAA+B,qBAArB,0BAAQ,aAAe,gCAAC;IAElC,iBAAS,GAAN,OAAQ,oCAAG,iBAAS,GAAN,OAAQ,qCAAG;MAC1B,YAAU,UAAU;IACtB,wBAAkB,GAAX,yCAAa,qCAAG;MACrB,YAAU,KAAK;IACjB,wBAAa,GAAN,OAAQ,sCAAI;MACjB,iBAAc,GAAX,YAAa,qCAAI,iBAAc,GAAX,YAAa,oCAAE;QACpC,YAAU,UAAU;MACtB;QACE,YAAU,2BAAS,YAAY;QAC/B,iBAAgB,GAAb,2CAAe,qCAAG;UACnB;QACF;QACA;QACA,YAAU,2BAAS,SAAS;MAC9B;IACF,wBAA6B,GAAtB,oDAAwB,qCAAG;MAChC,kCAAU,WAAc,MAAK;IAC/B;MACE,kCAAU,iCAAc,qCAAO,OAAK;IACtC;IAIF;;EAGA;;;;;;;QAEQ,0CAAwB;QACxB,uDAAe;QACf,8OAA6B;IAGnC,iBAAW,GAAR,SAAW,qCAAG;MACf,aAAW,oCAAG;IAChB;MACE,aAAW,qCAAG;IAChB;IAEA;IAEA,aAAW,yBAAO,UAAU;IAE5B;wBAAmD;IAErD;;EAGA;;;;;;;IACE,WAAS,gCAAe,GAAR,SAAU,qCAAjB,CAAsB;IACjC;;EAGA;;;;;;;;;QAEO,qDAAc;QACd,sDAAc;IAEnB,WAAU,0BAAQ,WAAW;IAC7B,YAAiB,qBAAP,OAAS,gCAAC;IACpB,WAAU,gCAAyB,GAAlB,0BAAQ,WAAY,OACxB,iBAAsB,GAAlB,gDAAoB,UACxB,IAAI,cAAuB,GAArB,mDAAuB,qCAAI,iBAAqB,GAAlB,gDAAoB,qCAAI,CAF/D,CAEkE;IAE9E;;EAGA;;;;;;;;;;QAEQ,qDAAa;QACb,qDAAa;;IAMnB,iBAAU,GAAP,QAAS,gCAAC;MACX,YAAc,kDAAqB;MACnC,gBAAc,uCAAkB;IAClC;MACE,sBAAM,OAAO;MACb,gBAAc,WAAW;IAC3B;IAEA,iBAAc,2FAAsD;EAEtE;AACF","file":"zcl_abapgit_path.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_background.clas.mjs":{"lineLengths":[53,43,38,32,58,37,236,1129,1215,55,1330,1245,1100,189,329,17,42,22,138,3,29,86,16,3,23,101,58,9,125,17,106,15,14,16,7,5,125,3,23,99,101,58,9,125,41,17,106,44,14,16,7,5,18,3,25,912,69,67,126,194,18,3,27,1012,101,58,1244,37,53,63,66,27,39,88,91,114,22,5,19,3,16,1244,615,912,421,1046,128,66,36,81,52,63,59,5,19,3,23,1012,61,78,192,3,23,69,1018,79,912,61,126,115,21,3,1,80,935,1041,1278,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persist_background.clas.abap"],"names":[],"mappings":";;AAyEA;;;;;;;;;;;;;;;;;;EAGE;IACE,gBAAQ,gEAA2C;IACrD;;EAGA;;;IAEE;4HAEoC;;;;;;;IAGpC;4HAGkC;EAEpC;EAGA;;;;IAEE;4HAEoC;MAChC,WAAS,sBAAS;;;;;;;IAGtB;IAEF;;EAGA;;;;IACE;;IAIF;;EAGA;;;;QAEQ,mtCAA+B;IAErC,aAAU,kBAAO;IAEjB;;;;qCAAqD;IACrD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;;;IACF;IAEF;;EAGA;;QAEQ,8lBAAiD;QACjD,u4BAAmB;IAEzB,IAAe,WAAgC;IAA/C,IACe,aAAgC;IAG/C,aAAU,6GAAoE;;;MAG5E,YAAS,6DAA8B;;MAGvC,kCAAmB,QAAU,aAAW;MACxC,aAAW,MAAC,SAAM,WAAS,MAAC,MAAK;IACnC;IAEF;;EAGA;;;IAEE,4CAAW,OAAO,MAAC,eAAc;+LAKD;EAElC;EAGA;;;;QACQ,u4BAAkB;IAExB,kCAAmB,eAAiB,MAAM;IAE1C;;IAGF;;AACF","file":"zcl_abapgit_persist_background.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_factory.clas.mjs":{"lineLengths":[53,40,35,32,55,37,237,225,229,247,241,246,17,42,22,55,61,63,3,29,64,16,3,20,50,3,27,139,68,121,5,53,19,3,23,53,3,30,148,71,124,5,59,22,3,24,54,3,31,151,72,125,5,61,23,3,1,74,159,168,171,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persist_factory.clas.abap"],"names":[],"mappings":";;AA0BA;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;IAEE,yBAAG,oCAAkB;;IAErB;IAEA,YAAU,mCAAO;IAEnB;;EAEA;;;;;IAEE,yBAAG,uCAAqB;;IAExB;IAEA,eAAa,sCAAU;IAEzB;;EAEA;;;;;IAEE,yBAAG,wCAAsB;;IAEzB;IAEA,gBAAc,uCAAW;IAE3B;;AACF","file":"zcl_abapgit_persist_factory.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_injector.clas.mjs":{"lineLengths":[53,41,36,32,56,37,25,247,241,246,17,42,22,3,29,64,16,3,25,56,3,32,139,61,69,3,28,59,3,35,148,70,75,3,29,60,3,36,151,73,77,3,1,76,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persist_injector.clas.abap"],"names":[],"mappings":";;AA2BA;;;;;;;;;;;;;;;;EAGE;;;;;;IAEE,2CAA2B,CAAE,YAAU,OAAO;EAEhD;EAEA;;;;;;IAEE,2CAA2B,CAAE,eAAa,UAAU;EAEtD;EAEA;;;;;;IAEE,2CAA2B,CAAE,gBAAc,WAAW;EAExD;AACF","file":"zcl_abapgit_persist_injector.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_migrate.clas.mjs":{"lineLengths":[62,53,93,40,35,32,55,37,165,74,196,55,195,61,201,48,17,42,22,53,3,29,64,16,3,29,59,3,36,3152,164,13,5,84,13,5,100,39,13,5,9,129,17,106,14,16,7,5,3,29,59,3,36,102,3156,3156,70,70,106,106,9,131,17,106,14,16,7,5,43,45,23,5,104,43,44,23,5,47,47,9,91,91,17,106,46,25,14,16,7,5,75,21,3,23,53,3,30,55,58,240,240,90,90,83,69,85,109,66,50,87,89,75,92,73,50,87,75,78,89,78,59,50,87,75,79,89,79,59,9,184,133,194,41,17,22,44,75,78,78,72,72,61,13,16,20,9,7,90,65,7,73,11,191,140,359,43,19,24,46,63,15,18,22,11,9,92,67,9,13,193,142,131,45,21,26,48,74,76,65,17,20,24,13,11,94,149,11,9,29,59,9,36,108,67,249,123,27,9,21,51,9,28,86,38,11,85,37,11,41,9,30,60,9,37,67,61,64,457,246,96,91,115,81,72,76,75,91,76,74,78,76,56,95,84,83,79,83,81,56,95,85,83,79,83,81,56,95,88,83,83,15,190,139,202,47,23,28,50,81,84,84,78,78,67,19,22,26,15,13,96,71,13,82,17,197,146,365,49,25,30,52,69,21,24,28,17,15,98,73,15,19,199,148,199,51,27,32,54,80,82,71,23,26,30,19,17,159,155,17,15,36,66,15,43,114,66,301,129,33,15,13,86,98,75,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persist_migrate.clas.abap"],"names":[],"mappings":";;;;AAgCA;;;;;;;;;;;;;;;;;;;;;EAGE;;;;QAEO,ukGAA+C;IAEpD,iBAAyD,IAAtD,gHAAwD,wBAAU;MACnE;IACF;IAEA,iBAAwB,IAArB,iCAAuB,uBAAS;MACjC;IACF;IAEA,YAAS,kFAA4B;IAErC,yBAAG,OAAiB;MAClB;IACF;IAEA;gIACoD;;;;;;IAEpD;EAEF;EAGA;;;;;QAEO,2kGAAmD;QACnD,2kGAAmD;QACnD,6DAAqB;QACrB,6DAAqB;QACrB,iGAAkD;QAClD,iGAAkD;IAEvD;MACI,gBAAa,2GAAyC;;;;;;IAE1D;IAEA,yBAAG,WAAqB;MACtB,cAAY,uBAAU;MACtB;IACF;IAEA,gBAAa,kFAA4B;IACzC,yBAAG,WAAqB;MACtB,cAAY,sBAAS;MACrB;IACF;;;IAKA;MACI,cAAW,qEAAsC;MACjD,cAAW,qEAAsC;;;;;;;;IAIrD;IAGA,cAAY,gCAAgB,GAAT,UAAW,SAAlB,CAA4B;IAE1C;;EAGA;;;;QAEQ,8CAA+B;QAC/B,iDAAsB;QACtB,uOAAyD;QACzD,uOAAyD;IAE/D,IAAe,YAAgC;IAA/C,IACe,YAAgC;IAG/C,QAAQ,MAAC,cAAa,2CAA4B,MAAM;IACxD,QAAQ,MAAC,aAAa,oCAAG;IACzB,QAAQ,MAAC,aAAa,2CAA4B,SAAS;IAC3D,QAAQ,MAAC,gBAAa,wCAAyB,iCAAS;IACxD,QAAQ,MAAC,YAAa,kCAAM;;IAG5B,YAAU,MAAC,cAAa,2CAA4B,MAAM;IAC1D,YAAU,MAAC,aAAa,2CAA4B,SAAS;IAC7D,YAAU,MAAC,YAAa,uCAAM;IAC9B,YAAU,MAAC,gBAAa,2CAA4B,SAAS;IAC7D,YAAU,MAAC,aAAa,oCAAG;;IAG3B,YAAU,MAAC,cAAY,2CAA4B,MAAM;IACzD,YAAU,MAAC,YAAY,uCAAM;IAC7B,YAAU,MAAC,eAAY,uCAAM;IAC7B,YAAU,MAAC,aAAY,2CAA4B,SAAS;IAC5D,YAAU,MAAC,eAAY,uCAAM;IAC7B,YAAU,MAAC,aAAY,sBAAS;;IAGhC,YAAU,MAAC,cAAY,2CAA4B,MAAM;IACzD,YAAU,MAAC,YAAY,uCAAM;IAC7B,YAAU,MAAC,eAAY,wCAAO;IAC9B,YAAU,MAAC,aAAY,2CAA4B,SAAS;IAC5D,YAAU,MAAC,eAAY,wCAAO;IAC9B,YAAU,MAAC,aAAY,sBAAS;;;;;;;;;;;;;;;;;;;;MAgBhC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gEACsB;MACtC;MAEA,gBAAc,2CAA4B,MAAM;;;;;;;;;;;;;;;QAWhD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;;;;;;;;;;;;;;;;;UASA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oJAC0D;UAC1E;QAEF;QAGA;;;;;cAEQ,oDAA+B;UAErC;UAEA,cAAY,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;UAEnC;;QAGA;;;;UAEE,iBAAmB,IAAhB,4BAAkB,wBAAU;qCACd;UACjB;UAEA,iBAAkB,IAAf,2BAAiB,wBAAU;oCACd;UAChB;wCAEoB;QAEtB;QAGA;;;;cAEQ,oDAAyB;cACzB,8CAA+B;cAC/B,iDAAsB;cACtB,0bAAsB;cACtB,uOAAyD;UAE/D,IAAe,YAAgC;UAE/C,QAAQ,MAAC,aAAa,2CAA4B,SAAS;UAC3D,QAAQ,MAAC,gBAAa,wCAAyB,iCAAS;UACxD,QAAQ,MAAC,cAAa,yCAAQ;UAC9B,QAAQ,MAAC,YAAa,kCAAM;UAC5B,QAAQ,MAAC,cAAa,oCAAG;UACzB,QAAQ,MAAC,aAAa,oCAAG;UAEzB,QAAQ,MAAC,aAAW,2CAA4B,SAAS;UACzD,QAAQ,MAAC,cAAW,oCAAG;UACvB,QAAQ,MAAC,YAAW,oCAAG;UACvB,QAAQ,MAAC,YAAW,wCAAO;UAC3B,QAAQ,MAAC,cAAW,oCAAG;;UAGvB,YAAU,MAAC,aAAY,2CAA4B,SAAS;UAC5D,YAAU,MAAC,eAAY,uCAAM;UAC7B,YAAU,MAAC,cAAY,uCAAM;UAC7B,YAAU,MAAC,aAAY,oCAAG;UAC1B,YAAU,MAAC,cAAY,uCAAM;UAC7B,YAAU,MAAC,UAAY,yCAAQ;;UAG/B,YAAU,MAAC,aAAY,2CAA4B,SAAS;UAC5D,YAAU,MAAC,eAAY,wCAAO;UAC9B,YAAU,MAAC,cAAY,uCAAM;UAC7B,YAAU,MAAC,aAAY,oCAAG;UAC1B,YAAU,MAAC,cAAY,uCAAM;UAC7B,YAAU,MAAC,UAAY,yCAAQ;;UAG/B,YAAU,MAAC,aAAY,2CAA4B,SAAS;UAC5D,YAAU,MAAC,eAAY,2CAAU;UACjC,YAAU,MAAC,cAAY,uCAAM;UAC7B,YAAU,MAAC,cAAY,uCAAM;;;;;;;;;;;;;;;;;;;;YAgB7B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sEACsB;YACtC;YAEA,gBAAc,2CAA4B,SAAS;;;;;;;;;;;;;;;cAWnD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wEACsB;cACtC;;;;;;;;;;;;;;;;;gBAYA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAS,GAAN,OAAS,gCAAC;0JAC4C;gBAC1E;cAEF;cAGA;;;;;oBAEQ,6CAA6B;gBAEnC;gBAEA,cAAY,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;gBAEnC;;YACF","file":"zcl_abapgit_persist_migrate.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_migrate.clas.locals.mjs":{"lineLengths":[53,93,51,61,32,78,37,25,268,3245,3246,17,12,42,22,3,29,64,16,3,15,35,3,22,165,597,337,186,23,3,23,3152,91,18,3,28,3152,58,120,95,77,84,65,3,1,87,28,32,81,37,25,3256,17,42,22,3,29,64,16,3,15,38,3,22,3152,18,3,1,93,49,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persist_migrate.clas.locals_imp.abap"],"names":[],"mappings":";;;AAiBA;;;;;;;;;;;;;;;;;EAEE;;;;;QAEO,4kBAA6C;IAElD;;IAWF;;EAEA;;IAEE,YAAS,yEAA2C;IAEtD;;EAEA;;;QAEO,+GAAkC;8FAID;;mFAGqB;gEACnB;EAE1C;AAEF;;AASA;;;;;;;;;;;;;;EACE;;;;;IAEA;;AACF","file":"zcl_abapgit_persist_migrate.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_packages.clas.mjs":{"lineLengths":[53,41,36,32,56,37,244,558,694,674,48,335,432,241,17,42,22,62,481,3,29,64,16,3,25,480,66,58,134,101,145,23,3,24,55,3,31,146,72,125,5,60,22,3,16,9,264,17,203,14,16,7,5,3,23,54,70,56,76,57,79,252,284,22,84,127,12,69,34,74,77,29,50,90,57,59,14,50,53,55,84,7,5,270,29,3,21,252,54,70,22,67,23,72,75,27,48,88,48,5,22,3,23,66,480,73,137,87,146,72,18,3,1,76,167,273,501,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persist_packages.clas.abap"],"names":[],"mappings":";;AAwDA;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;QAEO,6HAA0C;;gJAQpB;IAE7B;;EAGA;;;;;IAEE,yBAAG,wCAAuB;;IAE1B;IACA,eAAa,uCAAU;IAEzB;;EAGA;IAEE;MAEI,sBAAc,0OAEK;;;;;;IAEvB;EAEF;EAGA;;;;;;;QAEO,mPAAmC;IAExC,IAAc,cAAqC;qBAE5C;IAEP,yBAAG,aAAwB,yBAAI,cAAwB;;IAEvD;MACE;;;;;gDAAkF;MAClF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,cAAY,MAAC,eAAa,YAAY;QACtC,cAAY,MAAC,gBAAa,aAAa;MACzC;QACE,UAAU,MAAC,cAAa,UAAU;QAClC,UAAU,MAAC,eAAa,YAAY;QACpC,UAAU,MAAC,gBAAa,aAAa;QACrC,yEAAwC;MAC1C;IACF;6QAKyC;IAEzC;EAEF;EAGA;;;;qBAES;IAEP;;;;;8CAA2E;IAC3E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd,UAAU,MAAC,cAAW,UAAU;IAClC;IAEF;;EAGA;;;;QAEO,gIAA4C;;iJAMxB;IAEzB,YAAS,sDAAoB;IAE/B;;AACF","file":"zcl_abapgit_persist_packages.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_settings.clas.mjs":{"lineLengths":[53,41,36,32,56,67,230,22,17,42,22,132,3,29,64,16,3,52,131,73,71,1331,66,229,72,160,59,84,91,5,3,45,131,59,40,25,5,87,9,270,191,17,203,47,14,16,7,5,38,23,3,1,76,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persist_settings.clas.abap"],"names":[],"mappings":";;AAgBA;;;;;;;;;;;;;;;EAGE;;;QAEQ,8DAA4B;QAC5B,0yCAAiE;IAGvE,iBAAc,2CAAgC;oOAKf;IAE/B,sBAAmB,4CAAiC;+JAE2B;IAG/E,yBAAG,2BAAoB;mFACuB;0FACM;IACpD;EAEF;EAGA;;IAEE,yBAAG,2BAAoB;MAErB,gBAAc,gBAAW;MACzB;IACF;;IAKA;6QAKyB;8LAE2E;;;;;;;IAMpG;IAEA,qBAAc,WAAW;IAE3B;;AACF","file":"zcl_abapgit_persist_settings.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persistence_db.clas.mjs":{"lineLengths":[53,39,34,32,54,37,235,187,130,127,186,182,187,188,186,183,222,281,231,474,332,704,853,1215,429,477,475,477,203,17,42,22,50,111,58,52,70,62,72,74,70,62,3,29,64,16,3,20,101,61,103,64,105,61,390,55,37,39,41,101,106,3,23,101,61,103,64,60,161,3,24,53,3,31,137,65,116,5,48,17,3,31,103,56,84,11,188,137,104,43,19,24,46,63,15,18,22,11,9,92,104,9,7,47,25,5,18,620,210,24,5,31,621,323,63,103,63,135,68,37,308,7,25,5,31,620,103,63,268,24,5,23,61,63,111,103,63,105,66,118,11,190,139,127,43,19,24,46,75,77,63,15,18,22,11,9,92,67,9,73,211,160,79,7,27,105,65,107,68,109,65,396,64,43,45,47,107,92,125,9,7,25,109,105,65,107,68,303,92,95,114,26,9,23,7,27,105,65,107,68,109,65,109,81,83,16,31,9,64,213,92,125,9,7,48,70,70,62,171,22,7,40,69,7,47,105,65,441,163,9,7,5,76,160,76,57,73,55,132,63,128,55,133,63,134,67,132,63,128,55,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persistence_db.clas.abap"],"names":[],"mappings":";;AAmGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEO,6XAAiD;sDAExB;IAC9B,QAAQ,MAAC,UAAQ,OAAO;IACxB,QAAQ,MAAC,WAAQ,QAAQ;IACzB,QAAQ,MAAC,cAAW,OAAO;;IAG3B,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;EAErB;EAGA;;;;;2DAG6B;;EAO7B;EAGA;;;;;IAEE,yBAAG,iCAAkB;;IAErB;IACA,UAAQ,gCAAK;IAEf;;EAGA;;IACE,yBAAG,wBAA6B;MAC9B,4BAAqB,gDAAc;;;;;;;;;;;;;;;QAOnC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,4BAAqB,gEAA8B;QACrD;MACF;MACA,gBAAc,uBAAkB;MAElC;;IAGA;;MACE;MAEF;;IAGA;;;;;;MACE,IAAe,UAA6B;;;QAE1C;MAIF;MACF;;IAGA;;;;MACE;MAIF;;IAGA;;;;;;;;UACQ,2GAAsC;;;;;;;;;;;;;;;;;QAW5C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;QAEA,8BAA2B,iCAAsB;;;;MAMnD;MAGA;;;;;;;YAEQ,+XAAmD;+DAG9B;QAE3B,UAAU,MAAC,UAAQ,OAAO;QAC1B,UAAU,MAAC,WAAQ,QAAQ;QAC3B,UAAU,MAAC,cAAW,OAAO;;QAG7B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4HACoC;QACpD;MAEF;MAGA;;;;;;QAEE;QAGA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;;;QACF;QAEF;;MAGA;;;;;;;YAEO,gGAAoB;QAEzB,iBAAW,GAAR,SAAW,yCAAO;UACnB,aAAU,0DAAsC;QAClD;UACE,YAAU,OAAO;QACnB;+DAG2B;;QAK3B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4HACoC;QACpD;MAEF;MAGA;;;;QAEE,YAAS,qJAGwB;QAEnC;;MAGA;;;;;;QAEE,IAAG,CAAI,cACG,GAAR,SAAU,uCAAY,iBACd,GAAR,SAAU,4CAAiB,iBACnB,GAAR,SAAU,uCAAY,iBACd,GAAR,SAAU,2CAAgB,iBAClB,GAAR,SAAU,6CAAkB,iBACpB,GAAR,SAAU,2CAAgB,CAAC;kKAC0C;QACvE;MAEF;IACF","file":"zcl_abapgit_persistence_db.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persistence_repo.clas.mjs":{"lineLengths":[53,41,36,32,56,93,366,215,4537,4605,203,4936,55,206,17,42,22,269,138,3,29,1396,4317,135,130,390,142,132,93,36,92,5,86,16,3,25,4311,78,94,66,35,171,173,126,192,138,88,85,5,141,88,88,5,150,88,88,5,40,131,5,19,3,23,110,618,424,57,125,69,39,73,108,7,5,102,53,27,3,38,4401,392,70,121,283,87,5,52,21,3,34,106,73,71,71,4404,141,110,66,146,3,23,78,4399,61,4310,55,126,124,30,3,51,101,58,124,3,49,108,101,58,140,22,3,51,101,58,108,70,145,3,45,101,66,58,74,82,107,67,75,85,102,70,103,70,102,1959,82,4399,74,34,50,42,42,62,63,50,73,64,43,141,18,3,48,101,58,153,99,55,119,3,48,99,101,58,321,618,62,143,124,18,3,41,4615,618,392,4399,125,69,32,80,71,5,20,3,54,4615,321,61,618,392,4399,143,69,32,80,71,5,20,3,46,59,61,101,58,135,3,46,4399,101,58,4614,62,53,63,66,27,39,88,91,112,22,5,19,3,57,101,58,4311,61,1392,82,105,4410,115,77,77,135,67,47,13,5,119,122,5,161,78,37,104,108,71,17,7,104,108,93,108,33,5,68,137,3,1,76,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persistence_repo.clas.abap"],"names":[],"mappings":";;AAoDA;;;;;;;;;;;;;;;;;;EAGE;QAEO,22CAAkE;QAClE,otIAA4D;QAC5D,8HAAkD;QAClD,yHAAkD;IACvD,IAAc,WAAoD;+BAGlE,oBAAqB,yFAA2D;+BAChF,eAAqB,oFAAsD;;;MAEzE,gCAAO,WAAS,MAAC,eAAQ,mBAAc;IACzC;IAEA,gBAAQ,gEAA2C;IAErD;;EAGA;;;;QAEQ,yDAAkB;IAExB,WAAS,kBAAkB;IAG3B,oKAA4E;IAC5E,sKAA8E;IAE9E;;;IAQA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,OAAO,MAAC,eAAc,MAAC,qBAAkB,sBAAS;IACpD;;IAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,OAAO,MAAC,eAAc,MAAC,wBAAqB,sBAAS;IACvD;;IAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,OAAO,MAAC,eAAc,MAAC,wBAAqB,sBAAS;IACvD;IAEA,yBAAG,QAAkB;kIACyC;IAC9D;IAEF;;EAGA;;QAKQ,imBAAoD;IAE1D,IAAe,cAAoC;IAGnD,oBAAkB,+BAAC;IAEnB,gBAAa,uGAA8D;;;MAEzE,iBAAsB,GAAnB,cAAY,MAAC,QAAS,gBAAe;QACtC,oBAAqC,mBAAnB,cAAY,MAAC,OAAQ,gCAAC;MAC1C;IACF;IAEA;IACA;IAEF;;EAGA;;;;IACE,mCAAmB,uEAAmC,SAAS;IAC/D,iBAA4C,GAAzC,SAAS,MAAC,eAAc,MAAC,kBAAkB,wBAAW,iBACqB,IAA3E,qIAA6E,wBAAU;MACxF,SAAS,MAAC,eAAc,MAAC,qBAAkB,sBAAS;IACtD;IACA,SAAS,MAAC,SAAM,UAAU,MAAC,MAAK;IAClC;;EAGA;;;QAEO,8DAAuB;QACvB,8DAAuB;QACvB,2yIAAkD;IAEvD,iBAAc,sHAEY;IAE1B,mCAAmB,yDAA2B,YAAY;IAC1D,iBAAc,2CAAsB;iJAKV;EAE5B;EAGA;;;;QAEQ,6sIAAgD;IAGtD,kCAAmB,SAAW,MAAM;IAEpC;;IAGF;;EAGA;;;2HAIuB;EAEvB;EAGA;;;;IAEE,gBAAa,sHAEQ;IAEvB;;EAGA;;;;;gJAK2B;EAE3B;EAGA;;;;;;;;;;;;;;;;;QAEQ,syIAAoD;QACpD,iEAA0B;IAGhC,OAAO,MAAC,SAAe,MAAM;IAC7B,OAAO,MAAC,iBAAe,cAAc;IACrC,OAAO,MAAC,aAAe,UAAU;IACjC,OAAO,MAAC,aAAe,UAAU;IACjC,OAAO,MAAC,gBAAe,eAAE,MAAC,MAAK;IAC/B,yDAAuC;IACvC,OAAO,MAAC,iBAAe,cAAc;IAErC,OAAO,MAAC,eAAc,MAAC,kBAAe,eAAe;IAErD,oBAAiB,sCAAiB;IAElC,YAAS,yBAAc;4IAIgB;IAEzC;;EAGA;;;QAEQ,gJAAwD;;sDAG/B;sHAGG;EAEpC;EAGA;;;;QAEO,wTAAkD;QAClD,imBAAoD;IAEzD,gCAAO,gBAAU,OAAO;IAExB,gBAAa,yHAEwC;IAErD,WAAS,gCAA2B,GAApB,yBAAO,cAAe,gCAA7B,CAAgC;IAE3C;;EAGA;;QAEQ,imBAAoD;QACpD,+XAAkC;QAClC,syIAAgC;IAEtC,gBAAa,uGAA8D;;;MAGzE,aAAU,2DAAmC;MAC7C,8DAAkC;IACpC;IAEF;;EAGA;;;;QACQ,imBAAoD;QACpD,+XAAkC;QAClC,syIAAgC;IAEtC,gBAAa,yHAEwC;;;MAGnD,aAAU,2DAAmC;MAC7C,8DAAkC;IACpC;IACF;;EAGA;;;;;sIAIkC;EAElC;EAGA;;;;QAEO,6/IAA8C;IAEnD,aAAU,2CAAgC;IAE1C;;;;qCAAqD;IACrD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;;;IACF;IAEF;;EAGA;;;;;;;QAGI,gGAAoE;QACpE,izIAAwD;IAE1D,IAAc,YAAwC;IACtD,IAAc,UAAqB;IACnC,IAAc,UAAqB;IACnC,IAAc,cAA2B;IAEzC,4CAAW,iBAAiB;IAE5B,yBAAG,eAAyB;MAC1B;IACF;IAGA,iBAAsB,GAAnB,cAAc,MAAC,MAAM,uBAAU,yBAAI,OAAO,MAAC,KAAc;yHACP;IACrD;IAEA,yBAAqB,2HAAsD,OAAO;;;MAIhF,+FAAuE;MACvE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,mBAAmB,GAAb,gBAAe;iBAAS;;MAC9B,+FAAuE;MACvE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,oFAA4D;MAC5D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,eAAW,UAAQ;IACrB;IAEA,aAAU,iDAA4B;wIAIH;EAErC;AACF","file":"zcl_abapgit_persistence_repo.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persistence_user.clas.mjs":{"lineLengths":[53,41,36,32,56,63,245,154,4493,4629,48,975,4609,50,977,350,171,17,42,22,72,78,4416,3,29,77,61,100,30,22,16,3,25,4415,66,58,66,23,171,173,126,192,19,3,29,60,3,36,139,77,61,100,64,79,132,7,64,12,111,5,19,3,16,66,9,194,17,106,15,14,16,7,5,62,3,33,737,100,58,66,53,83,63,66,27,39,26,3,23,66,4415,61,126,113,18,3,18,66,61,197,29,3,35,100,58,737,82,66,769,53,92,63,66,27,39,70,80,5,43,45,24,3,53,108,57,27,3,63,68,66,20,3,62,71,68,23,3,51,106,53,25,3,53,108,57,27,3,50,326,51,24,3,51,100,47,19,3,54,629,59,49,156,74,7,79,5,28,3,49,71,49,23,3,57,112,65,31,3,65,68,100,58,95,20,3,64,71,100,58,97,23,3,67,70,100,58,93,22,3,56,68,100,58,80,20,3,50,101,45,39,20,5,9,174,17,106,38,76,14,16,7,5,18,3,49,1331,54,28,3,53,103,52,22,3,58,99,106,73,129,78,26,51,114,18,3,68,68,64,66,24,3,67,71,73,68,24,3,56,106,106,79,53,24,53,25,3,59,629,88,59,24,3,54,71,71,73,49,24,49,23,3,62,112,112,97,65,24,65,31,3,65,100,58,68,64,737,72,60,84,3,64,100,58,71,73,737,72,62,84,3,67,100,58,70,70,737,72,58,84,3,56,100,58,68,64,737,72,45,84,3,55,101,58,45,24,3,54,1331,88,54,24,3,56,108,135,24,57,27,3,56,108,135,24,57,27,3,57,106,73,129,78,26,51,88,110,12,90,5,24,3,54,100,131,24,47,19,3,56,103,135,24,52,22,3,1,76,168,758,986,4436,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persistence_user.clas.abap"],"names":[],"mappings":";;AAwFA;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;IACE,iBAAU,OAAO;qBACV;IACT;;EAGA;;;;QAEQ,yDAAkB;IAExB,WAAS,MAAM;IAGf,oKAA4E;IAC5E,sKAA8E;IAE9E;;IAIF;;EAGA;;;;;;;;IAEE,iBAAW,GAAR,SAAU,eAAE,MAAC,OAAe;MAC7B,yBAAG,6CAA4B;;MAE/B;MACA,YAAU,4CAAe;IAC3B;;IAIA;IAEF;;EAGA;QAEQ,yDAAkB;IAExB;MACI,YAAS,8KAEa;;;;;;;IAG1B;IAEA,kBAAU,sCAAkB;EAE9B;EAGA;;;;QACO,yDAAkB;IACvB,WAAS,4BAAU,QAAQ;IAC3B;;;;qCAAwE;IAC1E;;EAGA;;;;IACE;;IAGF;;EAGA;QAEQ,yDAAkB;IAExB,YAAS,2CAAiB;oMAKL;IAErB;EAEF;EAGA;;;;;QAEQ,yDAAmB;IAEzB,IAAc,kBAAoC;IAElD,WAAU,4BAAU,QAAQ;IAE5B;;;;qCAA+E;IAC/E,yBAAG,eAAE,MAAC,iBAAoB;;IAE1B;IACA,uBAAuB,cAAc;IACrC,kBAAgB,MAAC,SAAM,MAAM;uBAEpB;EAEX;EAGA;;IAEE,oBAAkB,YAAO,MAAC,aAAY;IAExC;;EAGA;;IAEE,aAAW,YAAO,MAAC,iBAAgB,MAAC,MAAK;IAE3C;;EAGA;;IAEE,gBAAc,YAAO,MAAC,iBAAgB,MAAC,KAAI;IAE7C;;EAGA;;IACE,kBAAgB,YAAO,MAAC,WAAU;IACpC;;EAGA;;IAEE,oBAAkB,YAAO,MAAC,aAAY;IAExC;;EAGA;;IAEE,iBAAe,YAAO,MAAC,UAAS;IAElC;;EAGA;;IAEE,YAAU,YAAO,MAAC,WAAU;IAE9B;;EAGA;;IAEE,qBAAmB,YAAO,MAAC,cAAa;IAExC,yBAAG,iBAA2B;MAE5B,0BAAG,yHAAuE;QACxE,gBAAgB,MAAC,oBAAiB,sBAAS;MAC7C;MAEA,gBAAgB,MAAC,iDAAiB;IACpC;IAEF;;EAGA;;IACE,gBAAc,YAAO,MAAC,SAAQ;IAChC;;EAGA;;IACE,wBAAsB,YAAO,MAAC,iBAAgB;IAChD;;EAGA;;;;IAEE,eAAW,sDAA2B,QAAQ,OAAC,KAAK;IAEtD;;EAGA;;;;IAEE,kBAAc,sDAA2B,QAAQ,OAAC,IAAI;IAExD;;EAGA;;;;IAEE,iBAAa,sDAA2B,gBAAgB;IAE1D;;EAGA;;;;IAEE,eAAW,sDAA2B,KAAK;IAE7C;;EAGA;;IAEE,WAAS,YAAO,MAAC,UAAS;IAE1B,yBAAG,OAAiB;MAClB;IACF;IAGA;6KAGyB;;;;;;;;IAKzB;IAEF;;EAGA;;IAEE,qBAAmB,YAAO,MAAC,SAAQ;IAErC;;EAGA;;IAEE,eAAa,YAAO,MAAC,aAAY;IAEnC;;EAGA;;;;IAEE;;;iDACmC;IAEnC,WAAS,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAEhC;;EAGA;;;IAEE,YAAO,MAAC,iBAAgB,MAAC,WAAQ,QAAQ;uBAChC;EAEX;EAGA;;;IAEE,YAAO,MAAC,iBAAgB,MAAC,UAAO,WAAW;uBAClC;EAEX;EAGA;;;;IACE,YAAO,MAAC,gBAAa,aAAa;uBACzB;IACT,kBAAgB,YAAO,MAAC,WAAU;IACpC;;EAGA;;;IACE,YAAO,MAAC,mBAAgB,gBAAgB;uBAC/B;EACX;EAGA;;;;IACE,YAAO,MAAC,cAAW,WAAW;uBACrB;IACT,gBAAc,YAAO,MAAC,SAAQ;IAChC;;EAGA;;;;IACE,YAAO,MAAC,sBAAmB,mBAAmB;uBACrC;IACT,wBAAsB,YAAO,MAAC,iBAAgB;IAChD;;EAGA;;;;;QAEQ,wtBAAkC;IAExC,oBAAgC,8CAA0B;IAC1D,cAAc,MAAC,SAAQ,MAAC,WAAQ,QAAQ;mFAEa;EAEvD;EAGA;;;;;QAEQ,wtBAAkC;IAExC,oBAA+B,8CAA0B;IACzD,cAAc,MAAC,SAAQ,MAAC,UAAO,WAAW;mFAEW;EAEvD;EAGA;;;;;QAEQ,wtBAAkC;IAExC,oBAAkC,8CAA0B;IAC5D,cAAc,MAAC,sBAAmB,UAAU;mFAES;EAEvD;EAGA;;;;;QAEQ,wtBAAkC;IAExC,oBAAuB,8CAA0B;IACjD,cAAc,MAAC,WAAQ,QAAQ;mFAEsB;EAEvD;EAGA;;;IAEE,YAAO,MAAC,eAAY,MAAM;uBACjB;EAEX;EAGA;;;IAEE,YAAO,MAAC,cAAW,gBAAgB;uBAC1B;EAEX;EAGA;;IAEE,YAAO,MAAC,kBAAe,gCAA4B,GAArB,YAAO,MAAC,eAAe,wBAA9B,CAA0C;uBACxD;IAET,oBAAkB,YAAO,MAAC,aAAY;IAExC;;EAGA;;IAEE,YAAO,MAAC,kBAAe,gCAA4B,GAArB,YAAO,MAAC,eAAe,wBAA9B,CAA0C;uBACxD;IAET,oBAAkB,YAAO,MAAC,aAAY;IAExC;;EAGA;;;IAEE;;;iDACmC;IAEnC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;IAEf;MACE,gCAAO,qBAAe,YAAO,MAAC,UAAS;IACzC;uBAES;EAEX;EAGA;;IAEE,YAAO,MAAC,gBAAa,gCAA0B,GAAnB,YAAO,MAAC,aAAa,wBAA5B,CAAwC;uBACpD;IAET,YAAU,YAAO,MAAC,WAAU;IAE9B;;EAGA;;IACE,YAAO,MAAC,kBAAe,gCAA4B,GAArB,YAAO,MAAC,eAAe,wBAA9B,CAA0C;uBACxD;IAET,eAAa,YAAO,MAAC,aAAY;IACnC;;AACF","file":"zcl_abapgit_persistence_user.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_po_file.clas.mjs":{"lineLengths":[53,32,27,32,47,60,190,1052,445,249,231,157,280,261,263,185,157,1244,17,42,22,93,976,51,3,25,136,822,311,87,72,36,90,78,7,83,87,41,234,7,161,162,5,18,3,25,136,87,82,82,83,97,119,111,74,18,3,29,92,61,60,16,3,35,57,3,42,69,71,85,36,85,57,91,58,91,58,86,58,90,58,5,21,3,22,70,64,70,67,211,52,12,29,5,105,44,3,25,67,61,248,63,64,64,64,40,262,790,56,96,133,114,92,67,33,62,202,122,19,16,46,69,82,11,41,9,7,31,62,190,19,9,203,147,47,16,145,9,70,204,147,47,16,146,9,7,5,3,32,103,70,106,70,857,79,789,663,821,279,72,34,70,17,7,69,84,87,29,60,90,56,100,110,7,58,60,7,79,339,86,108,5,3,22,44,3,29,67,67,61,301,19,3,24,46,3,31,67,67,61,62,68,25,94,92,52,67,138,5,83,218,138,5,89,179,138,5,161,181,191,19,3,37,66,54,18,3,38,67,30,19,3,40,69,66,86,49,258,111,5,19,3,48,857,76,664,820,62,72,35,71,17,7,46,68,85,88,29,61,148,60,14,76,7,5,3,1,58,379,54,53,53,48,52,291,806,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_po_file.clas.abap"],"names":[],"mappings":";;AAwFA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;IAEE,IAAc,WAA+B;IAC7C,IAAc,cAA4C;;;;MAKxD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6EACG;MACnB;MAIA;;;yOAEqF;MACrF;gKAEoD;iKACC;IACvD;IAEF;;EAGA;;;iFAQ2B;iFACA;kFACC;gGACY;sHACsB;8GACR;yEACnC;IAEnB;;EAGA;;;IACE,iBAAU,4BAAU,SAAS;IAC/B;;EAGA;;;;;;;IACE,IACE,OAEA,AAEA,AAEA,AAEA,KATG,eAAL;;MAEI,cAAY,mCAAE;;MAEd,cAAY,oCAAG;;MAEf,cAAY,oCAAG;;MAEf,cAAY,oCAAG;;MAEf,cAAY,oCAAG;;IAErB;;EAGA;;;QAEO,6DAAqB;QACrB,0DAAmB;IAExB,iBAAuB,GAApB,2BAAS,YAAa,gCAAE,iBAAgB,GAAZ,iCAAc,uCAAwB,qBAAoB;MACvF,aAAW,+BAAU;IACvB;MACE,aAAW,QAAQ;IACrB;IAEA,aAAU,sFAAuD;2CAE9C;EAErB;EAGA;;;;;;;QAUO,uDAAqC,CAAA;;QACrC,6PAA0B;QAC1B,6wBAA6B;QAC7B,+CAA6B;IAClC,IAAc,QAAkB;IAEhC,wCAAgB,iCAAO,uCAAwB,eAAc;IAE7D;IACA,gCAAO,6CAAM,QAAQ;;;MAGnB,iBAAY,GAAT,UAAW,OAAO,MAAC,UAAQ;QAC5B,iBAAoB,GAAjB,0BAAQ,YAAY,gCAAE,iBAAgB,GAAZ,4CAAc,qCAAG;UAC5C,OAAO,MAAC,kCAAS,OAAO,MAAC,SAAU,yCAAiB;UACpD;QACF;UACE,aAAW,OAAO,MAAC,QAAO;UAC1B,yBAAG,OAAO,MAAC,kBAAqB;YAC9B,mEAAkC;UACpC;UACA,sBAAM,OAAO;QACf;MACF;MAEA,IACE,OAeA,KAhBG,QAAL;;QAEI,yBAAG,SACD,iBAAe,GAAZ,4CAAc,qCACjB,iBAAU,GAAP,UAAU,cAAa;UAC1B;QACF;QACA,iBAAoB,GAAjB,0BAAQ,YAAY,gCAAE,iBAAgB,GAAZ,4CAAc,sCAAQ;UACjD,OAAO,MAAC,aAAS,6GAEJ;UACb,aAAW,OAAO,MAAC,SAAQ;QAC7B;gJACwE;QACxE;;QAGA,iBAAoB,GAAjB,0BAAQ,YAAY,gCAAE,iBAAgB,GAAZ,4CAAc,uCAAS;UAClD,OAAO,MAAC,aAAS,6GAEJ;UACb,aAAW,OAAO,MAAC,SAAQ;QAC7B;iJACyE;QACzE;;IAGN;EAEF;EAGA;;;;;;;QAEO,4wBAA4B;IACjC,IAAc,SAAkC;IAChD,IAAc,UAA8B;QACvC,8QAAyC;;;MAG5C,2BAAM,SAAO,MAAC;iBAAqB;;MAEnC;;;;0DAAuE;MACvE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,MAAM,MAAC,YAAS,SAAO,MAAC,OAAM;QAC9B,yFAAqD;QACrD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACrB;MAEA,yBAAG,UAAQ,MAAC,QAAiB;QAC3B,UAAQ,MAAC,YAAS,SAAO,MAAC,OAAM;MAClC;MAEA,UAAU,MAAC,UAAO,6BAAS,MAAC,UAAS;MACrC,UAAU,MAAC,gCAAO,2RACiB;MACnC,gCAAO,oBAAc,UAAQ,MAAC,SAAQ;MACtC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IACrB;EAEF;EAGA;;;;;;;IACE,kCAAU,2DAAO,sBACf,KAAO,SACP,KAAO,sCACP,MAAO,wCACP,KAAO,kCAAO,sCAAG;IACrB;;EAGA;;;;;;;QAEO,qDAAa;QACb,2DAAmB;IAExB,YAAU,OAAO;IACjB;IACA;IACA,WAAS,0BAAQ,SAAS;IAE1B,iBAAU,GAAP,QAAS,gCAAC;yIACwD;IACrE;IAEA,iBAAsB,qBAAP,OAAS,gCAAC;IACzB,iBAAgB,GAAb,2CAAgB,qCAAI,iBAA2B,GAAxB,sDAA2B,qCAAG;yIACa;IACrE;IAEA,iBAA4B,qBAAb,aAAe,gCAAC;IAC/B,iBAAU,GAAP,QAAU,gCAAE,iBAA4B,GAAxB,sDAA0B,sCAAG;yIACqB;IACrE;IAEA,YAAU,wBACR,KAAM,SACN,KAAM,iCACN,KAAa,qBAAP,OAAS,kCAAG;IAEpB,YAAU,sBACR,KAAO,SACP,KAAO,wCACP,MAAO,sCACP,KAAO,iCAAG;IAEZ,YAAU,sBACR,KAAO,SACP,KAAO,wCACP,MAAO,uCAAwB,SAC/B,KAAO,iCAAG;IAId;;EAGA;;IACE,WAAS,qCAAI;IACf;;EAGA;;IACE,YAAU,YAAO;IACnB;;EAGA;;QAEO,yDAAkB;IAEvB,YAAS,oEAA6C;IAEtD,yBAAG,iBAAqB;MACtB,kCAAS,2FACJ,uCAAwB,8BACxB,OACA,uCAAwB,UAAO;MACpC,aAAU,0FAAyD;IACrE;IAEF;;EAGA;;;IAEE,IAAc,UAAmC;IACjD,IAAc,SAA6B;QACtC,qDAAa;;;MAGhB,2BAAM,UAAQ,MAAC;iBAAqB;;MACpC,WAAS,eAAE,MAAC,MAAK;MAEjB;;;;2DAAuE;MACvE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,yBAAI,SAAO,MAAC,kBAAqB;QAC/C,UAAQ,MAAC,YAAS,SAAO,MAAC,OAAM;MAClC;;MAEA;IACF;EAEF;AACF","file":"zcl_abapgit_po_file.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popup_branch_list.clas.mjs":{"lineLengths":[53,42,37,32,57,91,169,154,189,1046,598,428,17,42,22,72,78,112,3,23,55,3,30,136,66,58,77,91,111,94,118,187,20,3,29,66,58,77,91,111,94,118,33,177,52,16,3,50,139,222,23,3,29,929,145,74,654,108,67,68,44,140,5,70,38,59,95,199,95,7,5,115,75,56,109,117,5,23,3,51,123,46,58,64,64,74,649,64,106,74,179,5,215,19,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/popups/zcl_abapgit_popup_branch_list.clas.abap"],"names":[],"mappings":";;AAwCA;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;;IAMA;;EAEA;;;;;;;;IACE,qBAAqB,MAAM;IAC3B,iDAAqB,4CAA6B,wCAAY,MAAC,cAAgB,kBAAiB;IAChG,4BAAqB,kBAAkB;IACzC;;EAEA;;;IAQA;;EAEA;;QAEO,wIAAsD;QACtD,iEAA0B;IAE/B,IAAc,aAAoC;IAElD,iBAAiB,qFAAkD;IACnE,iBAAiB,4CAAiC;IAClD,oBAAiB,0CAA+B;IAEhD,yBAAG,YAAsB;2IAC8C;IACvE;;;MAIE,yBAAG,aAAW,MAAC,MAAe;;MAE9B,wBAA2B,GAApB,aAAW,MAAC,UAAU,uBAAU,yBAAI,yBAA8B,iBAAqB,GAAjB,aAAW,MAAC,OAAQ,eAAc;;MAE/G;IACF;IAEA;IAEA,iBAAsB,GAAnB,yBAAqB,uBAAS;;MAE/B,aAAW,MAAC,UAAO,mCAAoB,qCAAkB;MACzD,aAAW,MAAC,kBAAe,mCAAoB,qCAAkB;IACnE;IAEF;;EAEA;;;;;;QAEO,iEAA0B;IAC/B,IAAc,QAAsD;IAEpE,yDAAwB;IACxB,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAInB,iBAAkB,GAAf,QAAM,MAAC,UAAU,uBAAS;MAC3B,2KAAyE;IAC3E;IAEA,aAAU,oMAAuE;IAEnF;;AAEF","file":"zcl_abapgit_popup_branch_list.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popup_code_insp.clas.mjs":{"lineLengths":[53,40,35,32,55,91,25,636,225,17,42,22,3,29,64,16,3,18,48,3,25,136,91,20,3,22,526,199,19,3,51,123,46,58,64,64,337,67,106,235,19,3,50,139,216,23,3,1,74,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap"],"names":[],"mappings":";;AA0BA;;;;;;;;;;;;;;;EAGE;;;;;;IAEA;;EAGA;;IAEE,aAAU,oLAA0E;IAEtF;;EAGA;;;;;;IAEE,IAAc,WAA8D;IAE5E,4DAA2B;IAC3B,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB,aAAU,wNAAmF;IAE/F;;EAGA;;;IAQA;;AACF","file":"zcl_abapgit_popup_code_insp.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popup_pull_request.clas.mjs":{"lineLengths":[53,43,38,32,58,91,170,1345,330,160,17,42,22,72,3,23,56,3,30,136,66,58,110,20,3,29,66,58,33,16,3,50,139,234,23,3,35,1222,126,96,127,5,20,3,51,123,46,58,64,64,1007,65,106,277,19,3,1,80,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/popups/zcl_abapgit_popup_pull_request.clas.abap"],"names":[],"mappings":";;AAiCA;;;;;;;;;;;;;EAEE;;;;;;;;IAMA;;EAEA;;;IACE,qBAAc,MAAM;IACtB;;EAEA;;;IAQA;;EAEA;;IAEE,cAAW,0GAA2D;IAEtE,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;8HACkC;IAC1D;IAEF;;EAGA;;;;;;IAEE,IAAc,SAA0D;IAExE,0DAAyB;IACzB,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB,aAAU,kQAA6F;IAEzG;;AAEF","file":"zcl_abapgit_popup_pull_request.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popup_tag_list.clas.mjs":{"lineLengths":[53,39,34,32,54,91,170,1039,330,160,17,42,22,72,3,23,52,3,30,136,66,58,106,20,3,29,66,58,33,16,3,50,139,216,23,3,26,925,145,108,59,257,95,136,5,70,19,3,51,123,46,58,64,64,651,66,106,175,19,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/popups/zcl_abapgit_popup_tag_list.clas.abap"],"names":[],"mappings":";;AAiCA;;;;;;;;;;;;;EAEE;;;;;;;;IAIA;;EAEA;;;IACE,qBAAc,MAAM;IACtB;;EAEA;;;IAQA;;EAEA;;QAEO,wIAAoD;IAEzD,iBAAc,qFAAkD;IAChE,aAAc,wCAA6B;;IAI3C,iBAAoB,GAAjB,yBAAO,WAAY,gCAAC;uIAC4C;IACnE;IAEA;IAEF;;EAGA;;;;;;IAEE,IAAc,UAAwD;IAEtE,2DAA0B;IAC1B,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB,aAAU,4JAAuD;IAEnE;;AAEF","file":"zcl_abapgit_popup_tag_list.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popups.clas.mjs":{"lineLengths":[53,53,31,26,32,46,57,445,135,175,973,949,3418,645,17,42,22,348,122,62,3,29,64,16,3,26,59,70,61,76,61,76,46,61,110,62,79,120,65,79,270,64,89,51,47,51,51,43,53,52,3,23,44,3,30,347,64,64,65,67,67,24,66,22,188,201,12,53,5,190,253,12,50,5,98,93,23,3,34,71,73,74,82,657,73,2397,67,107,60,58,60,58,2205,465,38,40,244,43,140,5,83,69,38,60,66,70,49,118,62,62,216,5,3,53,622,66,58,77,91,111,94,116,82,105,76,145,929,52,66,74,74,67,242,89,654,98,67,170,68,57,122,5,55,245,5,44,57,61,7,191,44,100,16,205,9,14,91,7,52,238,14,142,7,5,70,38,72,17,7,81,141,124,21,18,144,69,11,16,142,113,9,75,89,9,14,56,73,7,73,83,58,16,54,9,7,5,70,54,111,5,144,9,191,140,377,41,17,22,44,61,13,16,20,9,7,90,138,7,75,25,7,68,85,88,29,61,108,193,107,14,145,72,96,99,31,72,92,168,44,18,11,9,69,106,348,104,7,23,5,63,110,245,98,11,197,146,217,43,19,24,46,78,80,80,78,63,15,18,22,11,9,92,67,9,70,115,118,31,91,92,61,9,32,7,57,2177,75,77,78,86,2401,661,667,750,469,563,149,57,80,78,72,57,81,81,73,57,82,82,73,446,55,92,106,26,9,93,40,110,62,91,94,31,67,110,25,7,59,85,107,71,62,106,68,241,65,39,41,280,13,291,222,21,104,50,18,20,11,9,7,53,79,246,56,93,56,61,132,56,130,56,131,13,195,144,360,45,21,26,48,65,17,20,24,13,11,94,142,11,79,111,11,72,89,92,33,65,112,58,33,9,59,69,78,82,246,67,60,62,134,67,71,15,201,150,158,47,23,28,50,67,19,22,26,15,13,96,181,13,102,61,85,88,37,61,98,52,22,89,33,118,52,15,13,28,11,68,576,80,84,72,72,66,102,132,356,83,84,146,17,200,149,340,49,25,30,52,91,69,21,24,28,17,15,98,133,15,53,131,15,112,153,15,79,45,81,84,67,88,15,33,13,70,578,82,74,71,103,92,89,90,88,92,163,90,197,33,13,62,108,59,80,64,95,64,95,139,115,98,119,64,95,138,115,98,119,116,101,139,123,122,139,146,19,197,146,478,51,27,32,54,85,71,23,26,30,19,17,100,144,17,33,15,71,1052,94,114,76,21,198,147,150,53,29,34,56,91,73,25,28,32,21,19,102,275,19,23,208,157,120,55,31,36,58,91,27,30,34,23,21,133,19,81,379,102,116,253,97,91,101,84,84,81,81,124,109,52,82,199,28,98,97,59,190,23,65,21,270,270,208,78,78,47,19,77,139,74,78,80,109,68,95,121,87,101,137,85,95,134,85,95,133,83,89,129,127,110,134,130,119,139,94,107,183,75,116,135,773,119,306,113,139,74,185,51,187,488,51,74,19,74,85,85,83,497,204,287,502,773,306,555,85,144,236,124,121,151,92,61,84,97,100,45,73,106,71,95,23,21,117,140,21,59,89,88,53,69,149,109,44,82,106,106,23,21,99,99,112,94,560,93,53,70,109,23,95,21,37,19,73,91,74,91,199,148,112,68,60,85,21,37,19,75,116,325,107,133,128,146,251,253,112,78,76,125,228,62,21,168,134,28,132,21,25,205,154,309,57,33,38,60,99,89,96,91,93,77,29,32,36,25,23,106,106,120,40,113,81,23,42,21,68,1052,84,76,163,943,640,70,84,84,260,107,669,116,77,297,53,72,152,23,63,154,23,162,27,209,158,389,59,35,40,62,79,31,34,38,27,25,108,156,25,93,40,25,86,103,106,47,79,126,134,79,48,84,87,47,60,108,152,57,34,27,25,82,119,77,38,23,56,94,102,130,111,136,84,87,84,87,84,87,292,84,72,109,162,29,207,156,313,61,37,42,64,81,33,36,40,29,27,110,154,27,95,110,124,44,27,58,104,56,130,69,27,58,104,56,130,69,27,58,104,56,130,69,27,25,23,78,91,66,130,103,473,700,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/zcl_abapgit_popups.clas.abap"],"names":[],"mappings":";;;AAuEA;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;;;;;;;IAEE,IAAe,YAAiC;;IAGhD,YAAU,MAAC,aAAa,UAAU;IAClC,YAAU,MAAC,eAAa,YAAY;IACpC,YAAU,MAAC,eAAa,YAAY;IACpC,YAAU,MAAC,WAAa,QAAQ;IAChC,YAAU,MAAC,gBAAa,aAAa;IACrC,YAAU,MAAC,eAAa,aAAa;EAEvC;EAGA;;;;;;;;;QAGI,0DAA2B,CAAA;;QAC3B,yDAA0B,CAAA;;IAG5B,iBAAY,GAAT,eAAE,MAAC,QAAQ,YAAY,iBAAa,GAAT,UAAW,gCAAE,iBAAa,GAAT,eAAE,MAAC,QAAQ,SAAQ;MAChE,WAAW,MAAC,kBAAe,mBACzB,MAA+B,sBAAb,qBAAT,eAAE,MAAC,OAAQ,UAAa,kCACjC,MAAO,YAAY;IACvB;MACE,WAAW,MAAC,kBAAe,UAAU;IACvC;IAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,YAAY,iBAAc,GAAV,WAAY,gCAAE,iBAAa,GAAT,eAAE,MAAC,QAAQ,UAAS;MAClE,WAAW,MAAC,eAAY,mBACtB,MAAoC,qBAAJ,sBAAd,qBAAT,eAAE,MAAC,OAAQ,WAAc,iCAAI,kCACtC,MAAO,YAAY;IACvB;MACE,WAAW,MAAC,eAAY,UAAU;IACpC;IAEA,WAAW,MAAC,gBAAsC,mBAAzB,WAAW,MAAC,cAAe,SAAQ;IAC5D,WAAW,MAAC,aAAgC,mBAAtB,WAAW,MAAC,WAAY,UAAS;IAEzD;;EAGA;;;;;;;;;QAGI,kGAAqD;QACrD,mDAAqB;QACrB,iDAA+B;QAC/B,mDAAqB;QACrB,iDAA+B;IAEjC,IACE,aAA0D;IAD5D,IAEE,gBAAuC;IAEzC,sBAAO,UAAU;IAAjB,sBAAmB,YAAY;IAE/B,iBAAa,sNAGsE,OAAO;IAE1F,yBAAG,WAAqB;2IACoD;IAC5E;IAEA;;;;MAKE,gBAAc,MAAC,YAAU,aAAW,MAAC,KAAI;MACzC,gBAAc,MAAC,aAAU,aAAW,MAAC,QAAO;MAC5C,iBAAe,aAAW,MAAC,KAAI;qHAMR;MACvB,sBAAO,OAAyB;MAAhC,sBACO,OAAyB;MAChC,gBAAc,MAAC,0LAC+B;IAEhD;EAEF;EAGA;;;;;;;;;;;;QAEQ,wIAAsD;QACtD,w5BAAsE;QACtE,2CAA8B;QAC9B,yDAAqB;QACrB,iEAA0B;QAC1B,iEAA0B;QAC1B,0DAA0B;QAC1B,yOAAmC;IAEzC,IAAe,UAAqC;IAApD,IACe,aAAoC;IAGnD,iBAAiB,2EAA6C;IAC9D,iBAAiB,4CAAiC;IAClD,oKAAkE;IAClE,oBAAiB,0CAA+B;IAEhD,yBAAG,yBAA6B;;IAEhC;IAEA,yBAAG,uBAA2B;;IAG9B;IAEA,yBAAG,YAAsB;MACvB,yBAAG,uBAA2B;QAC5B,YAAU,uCAAM;MAClB;MACA,yBAAG,yBAA8B,iBAAmB,GAAf,gBAAkB,4CAA6B,wCAAY,MAAC,MAAI;QACnG,yBAAG,QAAkB;UACnB,kCAAU,eAAkB,uCAAK;QACnC;UACE,sCAAY,SAAQ,wCAAM,gBAAe,iDAAW,OAA0B;QAChF;MACF;QACE,kCAAU,QAAW,uCAAK;MAC5B;MACA,yBAAG,kBAAsB;6OACqE;MAC9F;6IACuE;MACvE;IACF;;;MAIE,2BAAM,aAAW,MAAC;iBAAmB;;MAErC,iBAAuB,GAApB,aAAW,MAAC,UAAU,uBAAS;QAEhC,iBAAoB,GAAjB,aAAW,MAAC,OAAO,4CAA6B,wCAAW;UAC5D,iBAAoB,GAAjB,aAAW,MAAC,OAAQ,eAAe,yBAAI,yBAA6B;YAErE;UACF;YACE,iIAAgE;YAChE,UAAQ,MAAC,eAAY,aAAW,MAAC,KAAI;UACvC;QACF;UACE,iIAAgE;UAChE,UAAQ,MAAC,qCAAY,aAAW,MAAC,cAAgB,eAAc;QACjE;QAEA,iBAAc,GAAX,YAAa,gCAAC;UACf,eAAwB,mBAAX,WAAa,gCAAC;QAC7B;MACF;;QAEE,UAAQ,MAAC,eAAY,aAAW,MAAC,aAAY;MAC/C;MAEA,iBAAoB,GAAjB,aAAW,MAAC,OAAO,kBAAiB;QACrC,iBAAuB,GAApB,aAAW,MAAC,UAAU,uBAAS;UAChC,eAAa,+BAAC;QAChB;UACE,eAAa,eAAE,MAAC,MAAK;QACvB;MACF;IAEF;IAEA,iBAAsB,GAAnB,oBAAqB,uBAAS;;MAE/B,UAAQ,MAAC,eAAY,mCAAoB,qCAAkB;IAC7D;IAEA,sBAAc,oHAEuB;;;;;;;;;;;;;;;MAerC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;yIACmD;MACnE;MAEA,iBAAa,GAAV,WAAY,mCAAe;QAC5B;MACF;MAEA;;;;2DAAuE;MACvE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,iBAAsB,GAAnB,oBAAqB,uBAAU,iBAAuB,GAAnB,UAAQ,MAAC,YAAY,mCAAoB,sCAAkB;QAC/F,SAAS,MAAC,UAAO,mCAAoB,qCAAkB;MACzD;QACE,sIAAwE;QACxE;;;;sEAAuF;QACvF,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;;YAGZ;UACF;QACF;QACA,6CAAO,cAAuB;QAC9B,eAAY,iFAA6C;QACzD,kVACqE;QACrE,6FAAwB;MAC1B;MAEF;;IAGA;;UAEQ,0OAA2C;MAEjD,IAAe,aAAkC;;;;;;;;;;;;;;;;;;;QAejD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;QAEA;;;;yFACwD;QACxD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,qBAAmB,aAAW,MAAC,SAAQ;QACzC;QAEF;;MAGA;;;;;;YAGI,o1EAAiE;YACjE,woBAA8C;YAC9C,8oBAA8C;YAC9C,iuBAA4D;QAE9D,IACE,gBAAuC;QADzC,IAEE,aAAqD;oJAQtB;;QAGjC,aAAW,MAAC,UAAS,yCAAQ;QAC7B,aAAW,MAAC,UAAS,uCAAM;QAC3B,aAAW,MAAC,YAAS,+BAAC;;QAEtB,aAAW,MAAC,UAAO,0CAAS;QAC5B,aAAW,MAAC,UAAO,0CAAS;QAC5B,aAAW,MAAC,YAAS,gCAAE;;QAEvB,aAAW,MAAC,UAAO,2CAAU;QAC7B,aAAW,MAAC,UAAO,2CAAU;QAC7B,aAAW,MAAC,YAAS,gCAAE;6bAYyB;QAEhD,yBAAG,mBAA6B;UAC9B;;;QACF;QAEA;sCAA8D;QAC9D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEnB;;;;iEAA0E;QAC1E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAErB;;MAGA;;;;;;;YAEQ,oOAA4B;YAC5B,oDAAwB;QAE9B,sBAAO,OAAO;QAAd,sBAAgB,SAAS;uRAMsB;QAE/C;kSAM4C;UAExC,aAAU,qMAC2D;;;;;;;QAIzE;MAEF;MAGA;;YAGI,yOAAiC;YACjC,2CAA4B;QAE9B,IAAe,UAAkC;;QAGjD,UAAQ,MAAC,aAAY,sBAAS;QAC9B,UAAQ,MAAC,eAAY,wCAAyB,sCAAc,MAAC,OAAM;;QAGnE,UAAQ,MAAC,eAAY,wCAAyB,sCAAc,MAAC,KAAI;;QAGjE,UAAQ,MAAC,eAAY,wCAAyB,sCAAc,MAAC,MAAK;;;;;;;;;;;;;;;UAclE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6IACmD;UACnE;UAEA,iBAAa,GAAV,WAAY,mCAAe;8GACW;UACzC;UAEA;;;;+DAAuE;UACvE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;UAEnB,oBAAkB,UAAQ,MAAC,UAAS;UAEtC;;QAGA;;;;cAEO,uOAA+B;cAC/B,oDAA0B;cAC1B,6CAA6B;cAC7B,+CAAiC;UAEtC;UACA,eAAa,4BAAU,YAAY;UACnC,iBAAe,4BAAU,cAAc;;;;;;;;;;;;;;;YAWvC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oLACqE;YACrF;YAEA,iBAAmB,GAAhB,yBAAO,UAAW,gCAAC;cACpB;;;;2DAA+D;cAC/D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;gBACb,aAAW,MAAM,MAAC,SAAQ;cAC5B;gBACE;+BAAqC;gBACrC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;gBACnB,aAAW,MAAM,MAAC,SAAQ;cAC5B;YACF;YAEF;;UAGA;;;;;;;;;gBACO,mVAAkE;gBAClE,kEAA2C;gBAC3C,mEAAqC;YAE1C,sBAAc,8GAEI;;;;;;;;;;;;;;;;cAelB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oIACsC;cACtD;cAEA,yBAAG,WAAqB;kIAC4B;cACpD;cAEA,iBAAuB,GAApB,yBAAO,cAAe,oCAAK;wJAC4C;cAC1E;;;gBAGE,WAAW,MAAC,UAAO,oCAAG;gBACtB,WAAW,MAAC,YAAS,qCAAI;gBACzB,WAAW,MAAC,SAAM,UAAU,OAAE,MAAM;gBACpC,qEAAyC;cAC3C;cAEF;;YAGA;;kBACO,+DAAkC;kBAClC,uDAAyB;cAE9B,YAAY,MAAC,mBAAgB,kBAAK;cAClC,YAAY,MAAC,iCAA8B,oCAAG;cAC9C,YAAY,MAAC,kBAAe,wCAAO;cACnC,YAAY,MAAC,eAAY,wCAAO;cAChC,YAAY,MAAC,gBAAa,wCAAO;cACjC,yBAAS,YAAY,MAAC,aAAoB;cAC1C,YAAY,MAAC,mBAAgB,uCAAM;cACnC,sCAAY,eAAE,MAAC,QAAM,+CAAS,YAAY,MAAC,cAAa;cAExD,aAAW,6DAA2B;cAEtC,iBAAc,oKAGe;cAC/B;;YAGA;;;;;;;;;;;;;;;;;;;;;;;;cAEE,sBAAc,4GAEG;;;;;;;;;;;;;;;;gBAmBjB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+IAC+C;gBAC/D;gBAEF;;cAGA;;;;;;;;;;;;;;;;;;;;kBAOE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;kRAI6B;kBAC5C;;;;;;;;;;;;;;;oBAOA,cAAY,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;kBACnC;kBAGA;;;;wBACQ,oOAAwC;wBACxC,wEAAiC;wBACjC,kEAAiC;wBACjC,4EAAuD;wBACvD,2DAAoC;wBACpC,2DAAoC;oBAE1C,sBAAO,mBAAmB,MAAC,YAAW;oBAAtC,sBAAwC,mBAAmB,MAAC,YAAW;oBAIvE,iBAAiC,GAA9B,yBAAO,wBAAyB,gCAAC;sBAClC;kDAAgE;sBAChE,0BAAwB,mBAAmB,MAAC,OAAM;sBAClD,qBAAkB,0JAAmF;oBACvG;sBACE,0BAAwB,gDAAc;;;wBAEpC,sCAAY,uBAAsB,sCAAI,mBAAmB,MAAC,kBAAY,qBAAqB;sBAC7F;sBACA,oBAAkB,qBAAqB;oBAEzC;6QAK+C;6QAMA;+MAKY;oBAE3D,mBAAmB,MAAC,iBAAc,cAAc;oBAChD,mBAAmB,MAAC,iBAAc,cAAc;oBAElD;;kBAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAEO,gKAA8C;oBAEnD,sBAAM,OAAO;oBAEb,sBAAc,+IAE6B;;kDAevB;yEACiC;kBAEvD;kBAGA;;;;wBAGI,wdAA0D;wBAC1D,mLAAgD;wBAChD,sQAAuC;wBACvC,6dAAwC;wBACxC,4uBAA+D;wBAC/D,yRAAsD;wBACtD,khBAAwD;wBACxD,4DAA4B;wBAC5B,uHAAoD;oBAEtD,IAAe,YAAsD;oBAArE,IACe,oBAA4C;oBAE3D,uBAAoB,4EAA2C;oBAE/D,mBAAgB,8GAAwD;;;sBAKtE;;;;uEAE8D;sBAC9D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wBACd,QAAQ,MAAC,WAAQ,oBAAkB;wBACnC,oEAAwC;sBAC1C;oBAEF;oBAEA,iBAA0B,GAAvB,yBAAO,iBAAkB,gCAAC;2IAC+B;oBAC5D;oBAEA;;;;sBAME,kBAAgB,eAAE,MAAC,MAAK;sBAExB;;;gFACmE;sBACnE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;wBACb,+EAAmD;sBACrD;oBAEF;oBAEA,qBAAqB,MAAC,UAAO,wCAAO;oBACpC,qBAAqB,MAAC,UAAO,wCAAO;oBACpC,yFAA6D;oBAE7D,cAAW,0DAAqC;+iBAYA;;;sBAG9C,yBAAG,oBAAwB;wBACzB,oCAAY,UAAa,qCAAG;sBAC9B;sBACA,oCAAY,UAAa,YAAU,MAAC,OAAK;oBAC3C;oBAEF;;kBAGA;;wBAIQ,iDAA0B;wBAC1B,kEAAgC;;;;oBAOtC,yBAAO,oBAAoB;sBACzB,SAAS,MAAC,YAAS,SAAS;sBAC5B,gCAAO,mBAAa,SAAS;oBAC/B;oBAEF;;kBAGA;;;;;;;wBAEQ,kOAAsC;wBACtC,oOAAuC;wBACvC,uFAAsB;wBACtB,qDAAuB;wBACxB,mDAA6B;oBAGlC,gBAAa,uFAAsD;oBAEnE,IAAG,cAAwB,GAAtB,UAAU,MAAC,aAAa,iBAAiB,MAAC,SAAQ,yBAAG,UAAU,MAAC,YAAsB,CACzF,iBAA6B,GAAzB,0BAA2B,uBAAS;sBACxC,aAAW,UAAU,MAAC,SAAQ;oBAChC;oBAGA,iBAA6B,GAA1B,iBAAiB,MAAC,UAAU,oCAAqB,oCAAgB,MAAC,cAAY;sBAC/E,gBAAc,oCAAqB,wCAAoB,MAAC,YAAW;oBACrE;sBACE,gBAAc,oCAAqB,wCAAoB,MAAC,UAAS;oBACnE;;;;;;;;;;;;;;;;;;;;sBAqBA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;wBACb;;;sBACF,wBAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;gFACmB;sBACtC;sBAEF;;oBAGA;;;;0BAEQ,wIAAoD;0BACpD,o5BAAoE;0BACpE,qmBAA4D;0BAC5D,2CAA4B;0BAC5B,yDAAmB;0BACnB,yDAAwB;0BACxB,yOAAiC;sBAEvC,IAAe,UAAkC;sBAAjD,IACe,UAA6B;sBAG5C,iBAAc,2EAA6C;sBAC3D,aAAc,wCAA6B;;;;wBAKzC,UAAQ,MAAC,gBAAY,8FAAuD;sBAE9E;sBAEA,yBAAG,aAAuB;yJACyC;sBACnE;sBAEA,sBAAc,oHAEuB;;;;;;;;;;;;;;;wBAerC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;2JACmD;wBACnE;wBAEA,iBAAa,GAAV,WAAY,mCAAe;0BAC5B;wBACF;wBAEA;;;;6EAAuE;wBACvE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;wBAEnB,YAAS,gGAAyD;wBAElE;;;;;0DAAgF;wBAChF,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;;4BAGZ;0BACF;wBACF;wBACA,6CAAO,WAAoB;wBAE3B,eAAY,8EAA0C;wBACtD,kCAAmB,WAAa,MAAM;wBAExC;;sBAGA;;;;;;;;;;;;;;4BAEO,2CAAyB;wBAC9B,IAAe,YAAoB;wBAEnC,sBAAc,kHAEoB;;;;;;;;;;;;;;;0BAclC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;yJAC+C;0BAC/D;0BAEA,iBAAa,GAAV,WAAY,mCAAe;4BAC5B;;;0BACF;0BAEA,6BAAyB;4BACvB;sDAAiD;4BACjD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;4BACnB,eAAa,YAAU,MAAC,MAAK;0BAC/B;0BAEA,6BAAyB;4BACvB;sDAAiD;4BACjD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;4BACnB,eAAa,YAAU,MAAC,MAAK;0BAC/B;0BAEA,6BAAyB;4BACvB;sDAAiD;4BACjD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;4BACnB,eAAa,YAAU,MAAC,MAAK;0BAC/B;wBAEF;sBACF","file":"zcl_abapgit_popups.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_popups.clas.locals.mjs":{"lineLengths":[53,42,33,32,77,37,175,207,189,179,424,151,155,135,155,162,290,186,262,232,381,204,1241,320,178,166,194,198,57,443,298,2446,51,218,17,42,22,78,131,113,103,348,71,79,69,79,67,3,19,38,66,88,113,22,5,3,29,123,58,72,81,127,76,71,83,156,78,79,136,102,35,66,13,5,90,106,66,150,76,77,46,75,35,52,19,9,138,56,19,9,52,7,5,140,69,93,79,71,36,46,47,84,131,68,43,14,73,7,74,5,3,22,112,156,90,106,95,18,3,29,123,58,62,64,93,52,79,105,347,73,111,94,118,114,103,123,78,91,167,59,100,119,757,103,290,97,107,129,132,77,63,69,9,49,215,40,59,95,99,85,78,102,7,84,110,72,7,114,106,62,74,11,163,51,19,100,16,18,9,7,187,103,17,86,142,14,16,7,5,16,3,44,123,58,78,618,127,127,133,134,156,449,78,78,79,132,79,45,82,105,145,82,53,91,107,72,5,46,13,5,143,84,171,108,112,117,109,90,106,117,102,85,106,66,36,41,47,84,131,68,38,14,68,7,79,5,3,26,290,97,156,94,78,82,90,106,78,35,64,33,90,170,7,136,108,50,5,3,32,59,46,66,55,76,66,150,45,5,3,46,75,82,36,147,50,45,157,49,45,159,69,40,159,70,40,88,33,40,88,88,40,12,49,45,5,3,25,104,73,156,78,136,90,106,71,36,136,108,39,5,3,31,99,63,64,63,156,78,136,90,106,67,30,62,33,93,17,7,136,108,69,43,14,44,22,7,5,18,3,25,63,63,95,96,178,96,12,161,5,3,29,104,73,65,63,156,90,106,128,98,54,13,5,185,134,169,76,3,29,104,73,103,102,67,100,63,64,63,156,78,136,90,106,67,30,62,33,93,17,7,136,108,63,107,14,41,7,5,3,37,71,52,347,63,242,82,73,87,73,86,73,87,73,129,122,9,191,140,415,41,17,22,44,61,13,16,20,9,7,163,27,7,63,29,90,54,7,25,5,32,73,75,158,88,80,138,46,15,7,92,108,73,38,138,110,138,110,36,86,90,21,11,98,143,21,11,97,111,21,11,98,106,21,11,16,17,9,52,7,5,44,61,48,68,57,158,80,138,92,108,57,33,90,138,110,107,7,40,5,32,134,72,80,93,61,102,759,105,74,73,75,572,53,71,33,72,220,100,84,129,130,128,19,9,93,88,91,31,64,52,74,109,145,146,144,11,104,91,11,98,67,11,95,94,11,16,70,9,7,5,32,80,93,109,84,81,83,138,73,67,68,11,192,141,165,43,19,24,46,79,63,15,18,22,11,9,92,143,16,69,125,68,18,68,11,96,9,68,69,75,33,71,147,85,79,85,18,86,11,9,7,5,98,96,69,100,67,80,55,100,67,106,66,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/zcl_abapgit_popups.clas.locals_imp.abap"],"names":[],"mappings":";;AA2GA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;qCAEoB;IAElB,iBAAa,GAAV,gBAAY,uBAAS;MACtB;;;IACF;EAEF;EAEA;;;QAGI,+DAA4B;QAC5B,wEAAiC;QACjC,sHAA8C;QAC9C,mEAA+C;QAC/C,8DAAgC;IAElC,IACE,gBAA0B;IAD5B,IAEE,YAAqC;IAFvC,IAGE,WAA0B;IAH5B,IAIE,YAA0B;IAJ5B,IAKE,eAAgC;IALlC,IAME,mBAAyC;IAE3C,sBAAM,OAAO;IAGb,iBAAa,GAAV,gBAAY,uBAAS;MACtB;IACF;IAEA,mFAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB,mBAAgB,yCAAyB;IAEzC,iBAAwC,IAArC,iDAAuC,yCAA0B,gCAAM;MAExE,sBAAmB,8CAAmC;;;QAIpD;iCAAiE;QACjE,4BAAM;mBAAqB;;QAE3B,+HAA6E;QAC7E,4BAAM;mBAAyB;;QAE/B,oBAAgB,sBAAS;MAE3B;IAEF;IAEA,sIAAqD;;IAGrD,sFAAwC;IAExC,mBAAgB,sDAAsC;;;MAGpD,sBAAM,gBAAc;MAEpB,IACE,YADG,aAAa,OAAE,IAApB;;QAEI,wHAAsE;QACtE,6CAAO,aAAsB;QAC7B,qBAAiB,YAAU;;QAG3B,kCAAmB,aAAa,gBAAc;;MAGlD,gCAAO,0BAAkB,OAAO;IAClC;EAEF;EAEA;;IAEE,IAAc,YAA8B;IAE5C,mFAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;8FAMY;IAEjC;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;QAGI,kGAA8B;QAC9B,wHAAgD;QAChD,2HAAiD;QACjD,oEAA6C;8DAET;oEACN;IAEhC;MACI,iBAAS,wBAAa;sNAKgB;MACtC,qBAAc,WAAW;MAEzB,eAAY,oCAAoB;MAEhC;MACA;MACA;MAEA,iBAAY,GAAT,UAAY,uCAAK;qGAC0C;MAC9D;MAEA,iBAAkB,GAAf,gBAAkB,uCAAK;;uEAEkB;MAC5C;iHAE0E;yGACR;MAElE,gBAAa,sCAAsB;yEACc;MAEjD;kKACwD;QACpD,mBAAiB,sBAAS;;;;;;MAE9B;0LAMiD;sGAIR;;;;;;;IAI7C;IAGF;;EAEA;;;QAMI,qEAAiC;QACjC,imBAA0D;QAC1D,sHAA8C;QAC9C,sHAA8C;QAC9C,4HAAgD;QAChD,6HAAgD;IAElD,IACE,YAAkC;IADpC,IAEE,gBAAuC;IAFzC,IAGE,WAAwB;IAH1B,IAIE,WAAuB;IAJzB,IAKE,YAAuB;+BAEzB,sBAAkB,6EAA+C;IACjE,mBAAgB,sDAAsC;IAEtD,IACE,OAMA,KAPG,aAAa,OAAE,IAApB;;iCAEI,gBAAiB,sDAAsC;MACvD,wIAAuE;MACvE,gBAAc,MAAC,UAAO,0CAAgB;MACtC,gBAAc,MAAC,UAAO,aAAa;;iCAGnC,kBAAmB,sDAAsC;MACzD,mBAAgB,6CAAkC;;IAItD,yBAAG,cAAwB;MACzB;IACF;IAEA,wIAAuE;IACvE,gBAAc,MAAC,UAAO,8CAAoB;+BAC1C,gBAAc,MAAC,QAAQ,4GAA6C;IAEpE,sBAAmB,gFAA4C;IAC/D,yBAAiB,iFAA8C;IAE/D;;IACA,mFAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB;;IACA,8EAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;MAGjB,sBAAM,WAAS;MACf,IACE,YADG,aAAa,OAAE,IAApB;;QAEI,wHAAsE;QACtE,6CAAO,aAAsB;QAC7B,gBAAY,YAAU;;QAGtB,kCAAmB,aAAa,WAAS;;MAG7C,sEAAsC;IACxC;EAEF;EAEA;;;IAEE,IACE,YAAiC;IADnC,IAEE,UAA8C;IAFhD,IAGE,WAAsB;IAHxB,IAIE,eAAuB;IAEzB,mFAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;MAIjB;+BAAwD;MACxD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;yKAC8D;MAC9E;MAEA,+HAA6E;MAC7E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,oBAAgB,sBAAS;IAE3B;EAEF;EAEA;;;;;QAEO,mEAA4C;IAEjD,mBAAgB,yCAAyB;IAEzC,iBAAwC,IAArC,iDAAuC,yCAA0B,gCAAM;4CACjD;IACzB;EAEF;EAEA;;;IAGE,IACE,OAIA,AAKA,AAIA,AAIA,AAIA,KAtBG,eAAL;;MAEI,mBAAY,uBAAU;4CACC;;MAIvB,mBAAY,sBAAS;4CACE;;oEAGE;uCACP;;qEAGQ;uCACR;;gCAGF;uCACE;;uFAG2B;uCAC3B;;MAGlB,mBAAY,sBAAS;4CACE;;EAI7B;EAEA;;;IAEE,IACE,YAAiC;IADnC,IAEE,WAAsB;IAFxB,IAGE,eAA4B;IAE9B,mFAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;MAIjB,+HAA6E;MAC7E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,oBAAgB,WAAW;IAE7B;EAEF;EAEA;;;;QAEO,sDAA8B;IAEnC,IACE,YAAiC;IADnC,IAEE,WAAsB;IAFxB,IAGE,eAA4B;IAE9B,mFAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;MAIjB;+BAAwD;MACxD,mBAAe,GAAT,eAAE,MAAC,QAAQ;iBAAC;;MAElB,+HAA6E;MAC7E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,iBAAiB,GAAd,iBAAgB,uBAAS;QAC1B,WAAS,sBAAS;MACpB;QACE,WAAS,uBAAU;QACnB;MACF;IAEF;IAEF;;EAEA;QAEO,sDAAwB;QACxB,sDAAwB;IAE7B,cAAW,2EAA+C;IAE1D,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;iLAG4C;+FACV;IAC1D;MACE,wJAAiD;IACnD;EAEF;EAEA;;;QAEO,wDAA0B;QAC1B,sDAA0B;IAE/B,IAAc,YAA8B;IAE5C,mFAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAGnB,gBAAa,0GAAqE;IAClF,iBAAuB,GAApB,yBAAO,cAAe,gCAAC;qDACD;MACvB;IACF;;;;2EAY6B;EAE/B;EAEA;;;;;;;;;QAEO,sDAA8B;IAEnC,IACE,YAAiC;IADnC,IAEE,WAAsB;IAFxB,IAGE,eAA4B;IAE9B,mFAAgC;IAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;MAIjB;+BAAwD;MACxD,mBAAe,GAAT,eAAE,MAAC,QAAQ;iBAAC;;MAElB,+HAA6E;MAC7E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,iBAAa,GAAV,WAAY,uBAAS;QACtB,oBAAgB,gCAAqB,GAAd,iBAAgB,wBAAvB,CAAmC;MACrD;QACE,oBAAgB,WAAW;MAC7B;IAEF;EAEF;EAEA;;QAGI,2CAA4B;QAC5B,kVAAuD;QACvD,sDAAwB;QACxB,yOAAiC;IAEnC,YAAY,MAAC,eAAY,2CAAU;IACnC,gCAAO,sBAAgB,YAAY;IACnC,YAAY,MAAC,eAAY,gDAAc;IACvC,gCAAO,sBAAgB,YAAY;IACnC,YAAY,MAAC,eAAY,+CAAa;IACtC,gCAAO,sBAAgB,YAAY;IACnC,YAAY,MAAC,eAAY,gDAAc;IACvC,gCAAO,sBAAgB,YAAY;IAEnC,WAAW,MAAC,kBAAwC,mBAAzB,gBAAW,MAAC,cAAe,iCAAE;IACxD,WAAW,MAAC,eAAqC,mBAAtB,gBAAW,MAAC,WAAY,gCAAC;;;;;;;;;;;;;;;MAepD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAa,GAAV,WAAY,0CAAe;QAC7C;MACF;MAEA;2BAAyD;MACzD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,gBAAc,YAAY,MAAC,UAAS;MACtC;MAEF;;IAEA;;;MAEE,IACE,YAAiC;MADnC,IAEE,eAA+B;MAFjC,IAGE,WAAsB;MAHxB,IAIE,eAA4B;MAE9B,yBAAG,YAAsB;QACvB;MACF;MAEA,mFAAgC;MAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;QAIjB,+HAA6E;QAC7E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEnB,+HAA6E;QAC7E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEnB,IACE,OAIA,AAIA,AAIA,KAbG,WAAL;;UAEI,iBAAiB,GAAd,iBAAiB,wCAAM;YACxB;UACF;;UAEA,iBAAiE,IAA9D,qFAAgE,wBAAU;YAC3E;UACF;;UAEA,iBAA8B,GAA3B,8DAA8B,gBAAa;YAC5C;UACF;;UAEA,iBAAyB,GAAtB,yDAAyB,gBAAa;YACvC;UACF;;UAEA;;QAGJ,oBAAgB,sBAAS;MAE3B;IAEF;IAEA;;;;;MAEE,IACE,YAAiC;MADnC,IAEE,WAAsB;MAFxB,IAGE,eAA4B;MAE9B,mFAAgC;MAChC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB;+BAAmD;MACnD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEb,+HAA6E;QAC7E,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACnB,oBAAgB,gCAAqB,GAAd,iBAAgB,wBAAvB,CAAmC;MAErD;uCAEkB;IAEpB;IAEA;;;;;;;;;UAGI,+DAAiC;UACjC,8DAAiC;UACjC,gEAA0C;MAE5C,IAAc,wBAA6D;MAE3E,gBAAa,6BAAkB;;;mCAI7B,WAAa,SAAS,MAAC,SAAQ;QAE/B,iBAA2B,GAArB,mBAAuB,yCAA0B,kCACrD,iBAAyB,GAArB,SAAS,MAAC,aAAa,+CAAoB;mGACkB;mFAC/B;gIACsB;iIACC;+HACF;UACvD;QACF;QAEA;;;;8DAEsC;QAEtC,IACE,YADG,eAAE,MAAC,MAAR;;UAEI,iBAA+B,GAA5B,wBAAsB,MAAC,OAAQ,uCAAK;gJACyB;iJACC;+IACF;UAC/D;UAEA,iBAAiC,GAA9B,wBAAsB,MAAC,SAAS,gCAAC;0FAC2B;UAC/D;UAEA,iBAAoC,GAAjC,wBAAsB,MAAC,YAAY,uBAAS;kEACb;UAClC;UAEA,iBAAiC,GAA9B,wBAAsB,MAAC,SAAS,uBAAS;6FACe;UAC3D;;qEAGqC;;MAI3C;IAEF;IAEA;;;;;UAGI,sEAA0B;UAC1B,wEAA0B;UAC1B,+HAA+C;UAC/C,8DAAgC;UAChC,wDAAwB;UACxB,yDAAsC;;;;;;;;;;;;;;;;QAUxC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;8IAIgB;QAE/B;UAEE,cAAa,2CAAU;UAEvB,iBAAqB,GAAlB,mBAAoB,yCAA0B,gCAAM;YACrD,gBAAc,sCAAK;UACrB;YACE,gBAAc,sCAAK;UACrB;+FAI0B;QAE5B;QAEA,kBAAe,wCAAwB;QAEvC,kBAAe,yCAA8B;;;UAE3C,WAAQ,gDAA+B;UACvC,iBAAS,GAAN,OAAQ,sCAAK,iBAAS,GAAN,OAAQ,0CAAQ;oFACW;UAC9C,wBAAsB,GAAf,gBAAiB,uBAAS;oFACa;UAC9C;qFAC+C;UAC/C;QACF;MAEF;IAEF","file":"zcl_abapgit_popups.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_pr_enum_github.clas.mjs":{"lineLengths":[53,39,34,32,54,67,239,149,1665,1481,263,351,17,42,22,142,72,3,26,66,66,58,148,18,3,29,76,88,141,79,131,42,222,124,247,5,16,3,29,1222,125,61,262,64,1006,115,67,26,48,176,161,159,163,176,168,169,5,20,3,34,1437,71,73,131,71,145,134,108,9,94,66,176,228,23,7,159,17,110,24,93,14,16,7,5,81,19,3,59,1222,75,1442,1006,86,94,177,152,87,85,35,67,69,7,5,20,3,1,72,1456,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git_platform/zcl_abapgit_pr_enum_github.clas.abap"],"names":[],"mappings":";;AAkDA;;;;;;;;;;;;;;;;EAGE;;;;IACE,WAAS,sBACP,KAAM,QACN,OAAQ,8CACR,MAAO,qCAAI;IACf;;EAGA;;;;;IAEE,6HAAmE;IACnE,uBAAgB,aAAa;6NAGgB;IAE7C,0BAAG,2FAA4D;sPAGH;IAC5D;IAEF;;EAGA;;;;QAEO,6PAA0B;QAC1B,uDAAgB;IACrB,IAAc,QAA4B;IAE1C,cAAW,+FAAuB;;;;MAIhC,QAAM,MAAC,eAAkB,2IAA+C;MACxE,QAAM,MAAC,aAAkB,8HAAkC;MAC3D,QAAM,MAAC,YAAkB,6HAAiC;MAC1D,QAAM,MAAC,WAAkB,kIAAsC;MAC/D,QAAM,MAAC,eAAkB,2IAA+C;MACxE,QAAM,MAAC,kBAAkB,gIAAoC;MAC7D,QAAM,MAAC,iBAAkB,kIAAsC;IACjE;IAEF;;EAGA;;;;QAEO,0HAA2C;QAC3C,8DAAuB;QACvB,wIAAiD;QACjD,6HAA4C;IAEjD,iBAAc,qFAAqC;IAEnD;MACI,OAAO,MAAC,gBAAY,yDAAoB;iEACjB;MACvB,iBAAc,uJAAmD;MACjE,yBAAG,YAAuB,iBAAwC,IAArC,oHAAuC,6CAAW;QAC7E;MACF;MACA,mBAAgB,oIAA8C;;;;;;;;IAGlE;IAEA,OAAO,MAAC,YAAQ,kDAA6B;IAE/C;;EAGA;;QAEO,kEAA2B;QAC3B,y5CAAyB;IAC9B,IAAc,QAAsC;IAEpD,kBAAe,8DAAgC;IAC/C,gCAAgB,YAAY,MAAC,6BAAS,QAAQ;IAE9C,iBAAkD,IAA/C,8HAAiD,uBAAS;MAC3D,qBAAkB,2HAA4C;MAC9D,kBAAe,6DAAoC;;;QAEjD,QAAM,MAAC,qBAAkB,sBAAS;QAClC,gCAAO,kBAAU,QAAQ;MAC3B;IACF;IAEF;;AACF","file":"zcl_abapgit_pr_enum_github.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_pr_enumerator.clas.mjs":{"lineLengths":[53,38,33,32,53,37,169,234,377,159,1313,333,17,42,22,72,157,3,29,66,58,63,9,95,17,106,14,16,7,5,16,3,32,60,3,39,151,71,73,136,67,67,79,166,88,150,242,12,175,5,23,3,21,1222,54,22,5,104,20,3,20,48,3,27,141,66,58,108,23,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git_platform/zcl_abapgit_pr_enumerator.clas.abap"],"names":[],"mappings":";;AA4CA;;;;;;;;;;;;;;;;EAGE;;;IAEE,qBAAc,4BAAU,QAAQ;IAChC;MACI,2BAAmB,4DAA8B;;;;;;IAErD;IAEF;;EAGA;;;;;;;QAEO,+HAA2C;QAC3C,0DAAmB;QACnB,0DAAmB;IAExB,cAAW,2DAAsC;;IAKjD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,YAAU,sBACR,KAAM,SACN,OAAQ,4CACR,MAAO,qCAAI;;IAKf;8KACuF;IACvF;IAIF;;EAGA;;IAEE,yBAAG,sBAA6B;MAC9B;IACF;IAEA,cAAW,oFAAuC;IAEpD;;EAGA;;;;;;;;IAEA;;AACF","file":"zcl_abapgit_pr_enumerator.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_progress.clas.mjs":{"lineLengths":[53,33,28,32,48,59,233,141,125,127,276,229,334,17,42,22,56,65,49,50,3,29,64,16,3,25,62,66,70,58,121,21,69,51,74,50,5,18,3,29,52,3,36,135,64,64,65,110,5,102,54,23,3,29,52,3,36,135,73,54,3,36,194,143,62,3,47,64,64,32,48,49,3,42,66,70,45,58,62,60,68,24,30,45,100,40,61,5,199,66,196,145,112,73,5,78,61,5,57,113,5,3,1,60,148,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/progress/zcl_abapgit_progress.clas.abap"],"names":[],"mappings":";;AAmCA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;QAEQ,iDAAW;IAEjB,SAAiC,wBAAb,sBAAX,WAAa,eAAa,kCAAG;IACtC,WAAS,IAAI;IAEb,iBAAU,GAAP,QAAS,kCAAG;MACb,WAAS,gCAAE;IACb,wBAAc,GAAP,QAAS,gCAAC;MACf,WAAS,+BAAC;IACZ;IAEF;;EAGA;;;;;;;IAIE,yBAAG,iCAAsB;;IAEzB;qGAEkC;IAElC,gBAAc,gCAAW;IAE3B;;EAGA;;;;;;IAEE,qCAAc,WAAW;EAE3B;EAGA;;;;EAKA;EAGA;;;IAEE,kBAAW,QAAQ;IAEnB,sBAAM,oBAAe;IACrB,sBAAM,qBAAgB;EAExB;EAGA;;;;;QAEQ,qDAAc;QACd,mDAAc;QAET,2DAA2B,CAAA;;IAEtC,wBAAQ;IACR,YAAU,eAAE,MAAC,MAAK;IAClB,yBAAG,qBAA2B,yBAAI,sBAA2B;MAC3D,yBAAmB,OAAO;MAC1B,0BAAmB,eAAE,MAAC,MAAK;IAC7B;IAGA,iBAAW,GAAR,SAAW,qBACV,iBAAa,GAAT,eAAE,MAAC,QAAQ,sBACf,iBAAY,GAAT,eAAE,MAAC,QAAQ,sBAAgB;MAEhC,YAAS,8CAAsB;;;;MAM/B,yBAA0B,mBAAR,QAAU,aAAY;IAE1C;IACA,iBAAY,GAAT,eAAE,MAAC,QAAQ,sBAAgB;MAC5B,0BAAmB,eAAE,MAAC,MAAK;IAC7B;IACA,iBAAmB,GAAhB,sBAAkB,QAAO;MAC1B,0BAA4B,mBAAT,eAAE,MAAC,OAAQ,gCAAC;IACjC;EAEF;AACF","file":"zcl_abapgit_progress.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_proxy_auth.clas.mjs":{"lineLengths":[53,35,30,32,50,37,169,149,67,207,17,42,22,58,58,3,29,64,16,3,17,42,3,24,223,127,122,5,3,20,45,3,27,121,67,127,25,5,194,3,1,64,86,86,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_proxy_auth.clas.abap"],"names":[],"mappings":";;AAqBA;;;;;;;;;;;;;;;;;;EAGE;;;;8NAOiC;IAE/B,yBAAG,mCAAuB,yBAAG,mCAAsB;yHACE;IACrD;EAEF;EAGA;;;;;;IAEE,yBAAG,mCAAuB,yBAAG,mCAAsB;wBACzC;IACV;iMAKsC;EAExC;AACF","file":"zcl_abapgit_proxy_auth.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_proxy_config.clas.mjs":{"lineLengths":[53,37,32,32,52,37,229,201,309,55,256,252,296,17,42,22,132,124,3,29,108,49,70,619,75,107,50,5,27,3,29,143,78,16,3,41,100,49,70,106,77,5,136,19,3,31,67,49,70,106,67,5,116,55,19,3,30,72,49,70,106,71,5,119,24,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_proxy_config.clas.abap"],"names":[],"mappings":";;AAwCA;;;;;;;;;;;;;;;;;EAGE;;;;QAEO,kmBAAuE;IAE5E,qBAAkB,gDAAgC;IAElD,yBAAG,0BACH,oBAAI,aAAe,gBAAe;MAChC,oBAAkB,sBAAS;IAC7B;IAEF;;EAGA;IAEE,sBAAc,mHAAqD;IAEnE,kBAAU,sDAAiC;IAE7C;;EAGA;;;;IAEE,iBAA+B,IAA5B,sDAA8B,wBAAU;MACzC,aAAU,wDAAwC;IACpD;uIAMuC;IAEzC;;EAGA;;;;IAEE,iBAA+B,IAA5B,sDAA8B,wBAAU;MACzC,aAAU,8CAA8B;IAC1C;mHAM6B;IAE7B,yBAAS,OAAO;IAElB;;EAGA;;;;IAEE,iBAA+B,IAA5B,sDAA8B,wBAAU;MACzC,kBAAe,6CAA6B;IAC9C;sHAMiC;IAEnC;;AACF","file":"zcl_abapgit_proxy_config.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo.clas.mjs":{"lineLengths":[53,29,24,32,44,55,1514,967,194,195,1441,197,222,220,221,4494,79,58,63,5362,762,5525,1274,1489,67,71,237,56,4462,235,240,208,4492,324,783,237,236,235,209,929,198,251,65,991,56,987,1262,1613,202,17,42,22,1417,891,118,119,1365,121,146,144,145,4466,49,57,71,65,65,67,49,71,51,57,55,49,65,3,30,145,73,38,3,41,102,70,597,102,72,43,123,64,121,124,29,97,90,124,57,35,9,7,5,3,29,107,36,457,209,176,7,49,5,3,26,101,76,77,108,73,554,107,143,289,14,146,7,117,5,3,31,126,169,5,3,29,4399,61,78,30,63,16,3,31,120,68,64,82,76,28,18,3,25,688,140,37,32,139,132,21,3,33,4567,67,657,61,665,1523,248,194,91,3,40,657,61,139,3,36,4567,67,120,58,657,61,665,130,9,142,17,106,24,97,84,29,14,16,7,5,91,3,35,132,542,51,67,31,242,255,27,198,88,115,76,31,5,18,3,33,134,542,51,67,31,261,274,27,217,88,161,55,5,18,3,27,139,542,62,41,23,5,88,39,67,31,136,139,27,112,88,90,5,21,3,25,140,53,144,5,43,24,3,19,120,28,18,3,41,818,813,281,627,631,376,89,67,37,135,94,28,67,90,57,71,68,7,5,22,3,41,1168,88,143,3,32,1392,82,4316,59,68,165,5,3,37,54,73,55,73,595,813,1426,134,210,189,55,115,128,27,71,155,13,5,36,70,89,127,98,3,33,62,50,3,37,889,61,132,64,541,64,67,37,48,163,73,7,5,3,24,42,63,30,3,24,42,3,20,100,58,116,82,116,94,116,82,103,70,1959,82,1168,91,107,94,108,94,124,94,1385,362,32,41,52,5,40,57,60,5,44,65,64,5,40,57,60,5,36,49,56,5,40,57,60,5,43,63,63,98,5,81,65,65,64,64,5,44,65,64,5,58,3,30,140,76,31,141,3,33,889,64,33,64,3,35,1162,73,53,3,23,1365,120,58,102,117,5,35,22,3,33,103,70,66,199,5,62,310,12,60,5,3,35,107,108,57,56,101,3,38,148,131,24,3,45,4567,67,120,58,665,41,39,37,32,205,139,5,136,131,5,159,133,5,69,103,84,41,130,41,30,29,35,3,47,4567,586,1489,41,39,37,32,45,102,119,159,115,135,230,21,3,44,140,134,26,3,49,1416,120,58,147,79,134,814,176,34,22,5,225,56,88,5,202,32,63,20,3,50,889,147,79,108,85,112,814,135,33,56,88,90,207,5,67,60,5,20,3,36,101,39,18,3,47,1162,55,23,3,37,67,70,19,3,40,102,47,22,3,39,103,47,22,3,41,106,79,108,104,73,103,62,30,63,41,5,65,43,5,3,49,140,82,78,3,39,169,67,115,174,220,76,5,3,1,52,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo.clas.abap"],"names":[],"mappings":";;AAyMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;IACE,qBAAc,WAAW;EAC3B;EAGA;;;QAEO,4kBAA6C;QAC7C,6FAAwB;IAE7B,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,UAAU;IAE7B,iBAA0C,IAAvC,uEAAyC,wBAAU;MAEpD;;;;+FAEkE;MAClE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QAEd,gBAAa,kGAAwD;QACrE,yBAAG,qBAAyB;UAC1B;QACF;MACF;IACF;EAEF;EAGA;QAGI,kGAA8C,CAAA;;IAIhD,iBAAyE,IAAtE,sIAAwE,uBAAU,iBAClC,IAAhD,0FAAkD,uBAAU,iBACnD,GAAT,eAAE,MAAC,QAAQ,wBAAW,iBACb,GAAT,eAAE,MAAC,QAAQ,gBAAe;MAE3B,iBAAmF,IAAhF,2JAAkF,wBAAU;QAC7F,qKAA8D;MAChE;;IAIF;EAEF;EAGA;QAGI,4FAA4B;QAC5B,mEAA6B;QAC7B,oEAA6B;IAG/B,sBAAmB,gFAAwC;IAE3D,iBAAoB,GAAjB,kBAAoB,eAAE,MAAC,OAAK;MAE7B,kiBAGiG;MAGjG,0BAAG,wEAA6D;QAC9D,2CAAmB,0FAA+D;QAClF,uRAC+D;MACjE;QACE,2CAAmB,6FAAkE;MACvF;oHAG+D;IAEjE;EAEF;EAGA;IAEE,iBAAyC,KAAtC,yDAAsB,iBAAkB,uBAAS;wKACgD;IACpG;EAEF;EAGA;;;IAEE,4CAAW,OAAO,MAAC,eAAc;IAEjC,iBAAU,OAAO;IACjB,mCAA4B,sBAAS;IAEvC;;EAGA;;;;;2EAG+B;IAE7B,WAAS,WAAM;IAEjB;;EAGA;;QAEQ,mIAA8C;oCAE9B;+BACL;IAEjB,gBAAa,qHAAsD;IACnE,SAAS,MAAC,UAAS,MAAC,eAAW,gFAA6C;IAE9E;;EAGA;;;;;QAGI,gpBAAwE;QACxE,0+CAA+D;IAGjE,eAAY,mOAEwB;IAGpC,sBAAmB,sKAEM;IAEzB,oFAAoD;EAEtD;EAGA;;;IACE,oIAA+D;EACjE;EAGA;;;;;;;QAGI,gpBAAwE;QACxE,yHAAkD;IAEpD;MACI,sBAAmB,gHAGG;;;;;;;;;;IAM1B;IAEA,oFAAoD;EAEtD;EAGA;;IAEE,IAAe,aAAkC;kDAE9B;IAEnB;;;;;oMAG8D;IAC9D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,YAAS,+FAAwD;2EACxC;MACzB;IACF;IAEF;;EAGA;;IAEE,IAAe,aAAkC;kDAE9B;IAEnB;;;;;uNAG2E;IAC3E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,YAAS,6IAC2E;sDAC7D;IACzB;IAEF;;EAGA;;IAEE,IAAe,aAAkC;IAEjD,yBAAG,8BAAuB;MACxB,cAAY,mBAAc;MAC1B;IACF;;IAGA,wBAAiB,SAAS;IAG1B;;;;;8GAE2D;IAC3D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;yFACoB;IACnC;IAEF;;EAGA;;IACE,yBAAG,qBAA4B;MAC7B,0BAAkB,8GAA4D;IAChF;IAEA,iBAAe,oBAAe;IAEhC;;EAGA;;IACE,WAAS,WAAM;IACjB;;EAGA;;QAEQ,oyBAA4D;QAC5D,gRAAwD;IAE9D,IAAe,YAAiC;IAAhD,IACe,aAAmC;IAElD,cAAW,oWAImD;IAE9D,wBAAqB,2DAAsC;;;MAEzD;;;iEAA4F;MAC5F,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;QAEd,kCAAmB,cAAc,aAAW;QAC5C,aAAW,MAAC,cAAW,YAAU,MAAC,OAAM;MAC1C;IACF;IAEF;;EAGA;;;IAEE,iBAAiB,MAAC,aAAS,qGAA8D;EAI3F;EAGA;;;QAEO,mtIAAsD;IAE3D,yBAAG,2BAAoB;MACrB,kCAAmB,cAAW,YAAY;oKAIP;IACrC;EAEF;EAGA;;;;;QAGI,0kBAAyD;QACzD,oyBAA4D;QAC5D,y4CAAiE;QACjE,6HAAoD;IAEtD,cAAW,8LAEqC;;IAKhD;;;;qEAEmD;IACnD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAoB,GAAjB,QAAQ,MAAC,UAAU,uBAAS;MAE9C;IACF;IAEA,sBAAM,QAAQ;IACd,+DAAmC;;IAGnC,wBAAqB,iGAEI;IAEzB,2FAAsD;EAExD;EAGA;IAEE,kCAA2B,sBAAS;iDAClB;EAEpB;EAGA;;;QAEO,2HAA0C;QAC1C,uDAAsB;IAE3B,IAAc,YAAgC;IAE9C,YAAS,8CAAkB;;;MAIzB,aAAW,eAAE,MAAC,MAAK;MACnB,iBAC2D,IADxD,8GAC0D,uBAAS;;MAEtE;IACF;EAEF;EAGA;IACE,sBAAM,cAAS;IACf,mCAA4B,sBAAS;6BACtB;EACjB;EAGA;IACE,sBAAM,cAAS;EACjB;EAGA;;;;;;;;;;;;;;;;;;;;;QAIQ,g2CAAuD;IAG7D,4CACE,iCACA,qCACA,iCACA,6BACA,iCACA,oCACA,qCACA,qCACA,qCAAiC;IAGnC,yBAAqB;MACnB,YAAO,MAAC,SAAM,MAAM;MACpB,OAAO,MAAC,SAAM,sBAAS;IACzB;IAEA,iCAA6B;MAC3B,YAAO,MAAC,iBAAc,cAAc;MACpC,OAAO,MAAC,iBAAc,sBAAS;IACjC;IAEA,qCAAiC;MAC/B,YAAO,MAAC,qBAAkB,kBAAkB;MAC5C,OAAO,MAAC,qBAAkB,sBAAS;IACrC;IAEA,iCAA6B;MAC3B,YAAO,MAAC,iBAAc,cAAc;MACpC,OAAO,MAAC,iBAAc,sBAAS;IACjC;IAEA,6BAAyB;MACvB,YAAO,MAAC,aAAU,UAAU;MAC5B,OAAO,MAAC,aAAU,sBAAS;IAC7B;IAEA,iCAA6B;MAC3B,YAAO,MAAC,iBAAc,cAAc;MACpC,OAAO,MAAC,iBAAc,sBAAS;IACjC;IAEA,oCAAgC;MAC9B,YAAO,MAAC,oBAAiB,iBAAiB;MAC1C,OAAO,MAAC,oBAAiB,sBAAS;iGAC6C;IACjF;IAEA,qCAAkC,qCAAiC;MACjE,YAAO,MAAC,qBAAkB,kBAAkB;MAC5C,YAAO,MAAC,qBAAkB,kBAAkB;MAC5C,OAAO,MAAC,qBAAkB,sBAAS;MACnC,OAAO,MAAC,qBAAkB,sBAAS;IACrC;IAEA,qCAAiC;MAC/B,YAAO,MAAC,qBAAkB,kBAAkB;MAC5C,OAAO,MAAC,qBAAkB,sBAAS;IACrC;yDAE0B;EAE5B;EAGA;;;8BACkB;4IACoE;EACtF;EAGA;;;IAEE,mBAAY,QAAQ;IACpB,mCAA4B,uBAAU;EAExC;EAGA;;;oDAEwC;EAExC;EAGA;;;;IAEE,iBAAsB,GAAnB,yBAAO,kBAAc,gCAAC;MACvB,oBAAY,yFACmD;IAEjE;IAEA,eAAa,cAAS;IAExB;;EAGA;;;IAEE,iBAAc,GAAX,YAAa,YAAO,MAAC,SAAO;sMACqE;IACpG;IAEA,iBAAc,GAAX,YAAa,uBAAS;qTAKc;IACvC;2DACgC;IAChC;EAEF;EAGA;QAEQ,kGAAwE;QACxE,mGAAwE;IAE9E,mDAAuC;IACvC,uBAAqB,eAAE,MAAC,MAAK;oGAGiB;EAEhD;EAGA;;;IAMA;;EAGA;;;;;QAEO,gpBAAwE;wCAEnD;sCACF;oCAEF;+BACL;IAEjB,iBAA8B,GAA3B,SAAS,MAAC,aAAY,MAAC,MAAM,wCAAyB,6BAAK,yBAAI,SAAS,MAAC,aAAY,MAAC,UAAmB;0IACtC;IACtE;IAEA,iBAA8B,GAA3B,SAAS,MAAC,aAAY,MAAC,MAAM,wCAAyB,6BAAI;kIACC;IAC9D;IAEA,iBAAgC,GAA7B,SAAS,MAAC,UAAS,MAAC,WAAW,uBAAU,yBAAI,SAAS,MAAC,UAAS,MAAC,WAAoB;oIACnB;IACrE;oEAE+D;sGAO7B;mFAMA;IAElC,sBAAM,aAAQ;iIAE2C;wCAE/B;6BACX;IAEf;kCAEoB;EAEtB;EAGA;;QAEQ,ikBAA+D;QAC/D,w8CAAmE;wCAE/C;sCACF;oCAEF;+BACL;4CACa;IAE9B,eAAY,iFAA6C;IAEzD,sBAAkB,+EAAgC,YAAY;IAC9D,SAAS,MAAC,aAAY,MAAC,UAAM,6GAAsE;IAEnG,sBAAkB,2EAA6C,YAAY;IAC3E,SAAS,MAAC,aAAY,MAAC,UAAM,qFAAiE;IAE9F,SAAS,MAAC,kBAAc,+LAEU;IAEpC;;EAGA;;;IAIA;;EAGA;;;;;;QAEO,6HAA8C;QAC9C,qyBAAmD;IAExD,iBAAqB,GAAlB,yBAAO,iBAAa,gCAAE,iBAA6B,GAAzB,+BAA2B,wBAAU;MAChE,aAAW,aAAQ;MACnB;IACF;;IAOA,yBAAG,wBAA4B;MAC7B,eAAY,iEAA4B;IAC1C;IAEA,cAAW,sLAImB;IAE9B,kBAA2B,QAAQ;IACnC,kCAA2B,uBAAU;IAEvC;;EAGA;;;;;;;QACO,qyBAAmD;QACnD,8HAA6C;IAElD,aAAW,cAAS;IACpB,yBAAG,wBAA4B;MAC7B,eAAY,iEAA4B;;8MASZ;IAE9B;IAEA,iBAAmB,GAAhB,iBAAkB,uBAAS;2DACwB;IACtD;IAEF;;EAGA;;IACE,WAAS,YAAO,MAAC,IAAG;IACtB;;EAGA;;IAEE,gBAAc,YAAO,MAAC,eAAc;IAEtC;;EAGA;;IAEE,YAAU,YAAO,MAAC,eAAc,MAAC,aAAY;IAE/C;;EAGA;;IACE,eAAa,YAAO,MAAC,QAAO;IAC9B;;EAGA;;IACE,eAAa,YAAO,MAAC,QAAO;IAC9B;;EAGA;;;;;;;IAEE,kCAA2B,sBAAS;6BACrB;IAEf,iBAAe,GAAZ,aAAc,uBAAS;MACxB,sBAAM,WAAM;IACd;IAEA,iBAAiB,GAAd,eAAgB,uBAAS;MAC1B,sBAAM,aAAQ;IAChB;EAEF;EAGA;;;6EACqD;EACrD;EAGA;QAEO,gKAAwE;QACxE,0DAAmB;;IAGxB,iBACoF,IADjF,0HACmF,wBAAU;MAC9F,oNAC+F;2EAC9C;IACnD;EACF;AACF","file":"zcl_abapgit_repo.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_checksums.clas.mjs":{"lineLengths":[61,53,39,34,32,54,65,204,201,1564,2853,1372,160,164,199,1370,17,42,22,107,124,3,25,70,67,71,146,123,3,43,1276,1429,64,602,1080,1225,463,67,37,148,61,95,50,7,77,85,5,24,3,29,106,73,72,38,149,16,3,29,70,67,71,110,13,5,122,3,28,1276,76,60,3,46,1435,79,350,3,31,1276,76,70,140,50,169,3,42,1276,70,9,163,17,203,28,14,16,7,5,53,56,141,5,24,3,61,661,1276,1078,68,71,38,101,5,24,3,46,1429,1276,80,73,84,60,3,50,665,88,1276,1422,68,86,224,60,3,1,72,1465,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_checksums.clas.abap"],"names":[],"mappings":";;;AA4DA;;;;;;;;;;;;;;;;;;;EAGE;;;QAEO,8DAAuB;IAE5B,4IAAmD;IAEnD,qCAAa,oEAAuB,YAAU;EAEhD;EAGA;;;;QAEO,ilBAAkD;IAEvD,IACE,eAA0C;IAD5C,IAEE,YAAsC;IAFxC,IAGE,kBAAiD;;;MASjD,iBAAgB,GAAb,cAAgB,YAAU,MAAC,MAAK,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;QAEhD,kCAAmB,YAAU,MAAC,OAAQ,eAAa,MAAC,KAAI;QACxD,iBAAqB,YAAU,MAAC,KAAI;MACtC;;MAGA,kCAAmB,YAAU,MAAC,OAAQ,kBAAgB;IAExD;IAEF;;EAGA;;;IACE,4CAAO,sBAA0B;IACjC,qBAAc,WAAW;IACzB,kBAAU,6HAAyD;IAErE;;EAGA;;;QAEO,8DAAuB;IAE5B,iBAAmB,GAAhB,8CAAmB,qCAAG;MACvB;IACF;IAEA;EAIF;EAGA;;;2DAIgC;EAEhC;EAGA;;;;EAOA;EAGA;;;QAEO,6DAAsB;IAE3B,gBAAa,sHAAkD;iDACnB;wKAGjB;EAE7B;EAGA;;QAEO,6DAAsB;IAE3B;MACI,gBAAa,2IAAyE;;;;;;;IAI1F;IAEA,yBAAG,qBAAyB;uDACsB;MAChD,kBAAe,mHAAkD;IACnE;IAEF;;EAGA;;QAEO,mvCAAiE;IACtE,IAAc,aAAqC;IAEnD,kBAAe,4CAAiC;;;MAG9C,gCAAgB,aAAW,MAAC,6BAAS,YAAY;IACnD;IAEF;;EAGA;QAEO,44CAA2C;QAC3C,mvCAA+D;IAEpE,cAAY,4DAA2B;wEAC4B;IAEnE,kBAAe,4DAAsC;2DACvB;EAEhC;EAGA;;;QAEO,mvCAAiE;QACjE,q4CAA6D;IAElE,kBAAiB,4CAAiC;IAClD,oBAAiB,4DAA2B;IAE5C,kBAAe,wMAG4B;2DAEb;EAEhC;AACF","file":"zcl_abapgit_repo_checksums.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_checksums.clas.locals.mjs":{"lineLengths":[53,50,31,32,83,37,168,144,1494,1479,17,42,22,57,49,3,29,64,16,3,28,54,3,35,1276,69,67,264,66,1276,1074,456,105,69,28,54,17,7,108,57,30,9,66,173,159,30,9,75,55,14,55,208,194,30,9,7,5,35,24,3,26,52,3,33,69,1276,76,264,66,1317,1074,456,42,78,34,111,17,7,80,224,14,51,7,67,82,38,189,69,7,5,109,21,3,1,98,86,44,82,40,29,32,81,37,25,2146,3576,4867,17,42,22,3,29,64,16,3,34,58,3,41,1276,665,88,1284,100,1422,82,675,1317,50,42,108,126,42,24,3,38,62,3,45,675,82,1310,73,65,67,1080,456,461,71,40,49,88,38,53,79,143,156,31,99,92,19,9,64,97,16,66,61,9,7,117,78,7,5,113,3,30,54,3,37,1416,64,675,85,1310,73,1452,1048,1080,460,1225,34,74,40,73,171,184,29,127,90,17,7,73,195,208,29,151,90,91,109,7,93,5,3,1,94,56,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_checksums.clas.locals_imp.abap"],"names":[],"mappings":";;AA2BA;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEO,+PAA4B;QAC5B,yDAAkB;QAClB,mvCAA8B;IAEnC,IAAc,SAAiC;IAC/C,IAAc,WAAoC;IAElD;;;MAGE,2BAAM;iBAAqB;;MAE3B,iBAAe,GAAZ,0CAAc,qCAAG;QAClB,0BAAG,oBAAuB;UAExB;QACF;;QAGA;QAEA,yBAAG,WAAS,MAAC,MAAgB,yBAAG,WAAS,MAAC,UAAoB,yBAAG,WAAS,MAAC,MAAe;UAExF;QACF;MACF,wBAAc,GAAP,QAAS,+BAAM;;MAEtB;;QAEE;QAEA,yBAAG,SAAO,MAAC,KAAI,MAAC,UAAoB,yBAAG,SAAO,MAAC,KAAI,MAAC,UAAoB,yBAAG,SAAO,MAAC,KAAI,MAAC,UAAmB;UAEzG;QACF;MAEF;IACF;IAEA,iBAAe,YAAY;IAE7B;;EAGA;;;;;;;QAEO,+PAA4B;QAC5B,yDAAkB;QAClB,4xCAA8E;IAEnF,IAAc,SAAiC;IAC/C,IAAc,WAAoC;IAElD,wBAAsB,YAAY;;;MAIhC,iBAA0B,GAAvB,yBAAO,SAAO,MAAC,UAAU,gCAAC;QAC3B;MACF;MAEA,yBAAG,SAAO,MAAC,KAAI,MAAC,oBAAuB;QACrC,sCAAY,SAAO,MAAC,KAAI,MAAC,WAAS,SAAO,MAAC,KAAI,MAAC,WAAS,SAAO,MAAC,KAAI,MAAC,oBAC9D,MACkB;MAC3B;QACE,WAAS,8BAAM;MACjB;MACA,gCAAO,gBAAU,UAAU;;;QAIzB,sCAAY,WAAS,MAAC,OAAK,WAAS,MAAC,WAAS,WAAS,MAAC,gBACjD,MACkB;QACzB,gCAAO,gBAAU,UAAU;MAE7B;IAEF;IAEA,cAAY,8BACV,OAAQ,YACR,wCAAc;IAElB;;AACF;;;;;;AAmCA;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;QAEO,0pBAAuE;QACvE,4xCAA8E;IAEnF,wBAAsB,oBAAoB;IAC1C,oBAAsB,gBAAgB;2GAKK;6HAOA;IAE3C,iBAAe,mBAAmB;IAEpC;;EAEA;;;;;;;;QAEO,wDAAiB;QACjB,0DAAmB;IAExB,IAAc,eAAwC;IACtD,IAAc,WAA+C;IAC7D,IAAc,gBAA2C;;;MAKvD,cAAY,eAAE,MAAC,MAAK;;;QAGlB,gBAAc,eAAE,MAAC,MAAK;QAEtB;;;;iGAGiC;QACjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;QACF;QAEA,yBAAG,gBAAc,MAAC,MAAe;;QAEjC;UACE,WAAS,MAAC,UAAO,gBAAc,MAAC,KAAI;UACpC,sBAAM,gBAAc,MAAC,KAAI;QAC3B;MACF;MAEA,iBAAgC,GAA7B,yBAAO,eAAa,MAAC,UAAU,gCAAC;;MAEnC;IACF;;EAIF;EAEA;;;;;;;;;;QAEO,m6CAAsE;QACtE,+gCAAqC;IAC1C,IAAc,eAAuC;IACrD,IAAc,eAA0C;IACxD,IAAc,YAA0C;IAExD,oBAAkB,QAAQ;;;MAKxB;;;;6HAG0C;MAC1C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QAId;MACF;MAEA;;;;qJAG4C;MAC5C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,kCAAmB,YAAU,MAAC,OAAQ,WAAW,MAAC,KAAI;QACtD,kGAAkE;MACpE;MAEA,gCAAO,yBAAiB,eAAa,MAAC,MAAK;IAC7C;EAEF;AAEF","file":"zcl_abapgit_repo_checksums.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_content_list.clas.mjs":{"lineLengths":[53,42,37,32,57,37,217,197,496,2430,2413,2508,2405,2399,59,212,2936,210,17,42,22,120,121,61,3,30,70,70,2303,76,64,2301,2078,2077,132,2107,72,36,48,67,17,7,162,64,58,62,62,74,7,76,5,66,30,30,70,36,86,109,41,57,87,59,90,7,105,75,32,90,30,14,7,109,67,68,75,7,28,5,3,39,2303,813,597,2112,627,487,67,37,61,69,71,63,73,67,179,85,99,14,98,7,76,69,126,124,9,39,7,5,25,3,40,2303,132,604,1364,597,601,73,1089,2112,76,30,30,68,38,86,117,63,74,74,74,98,76,66,76,90,7,73,66,126,88,190,101,9,80,100,129,85,9,7,160,69,52,63,133,124,35,63,9,39,7,32,88,30,14,7,117,68,99,9,74,75,84,7,28,5,25,3,27,72,29,890,82,82,64,244,257,29,200,90,160,7,5,3,29,119,61,30,82,16,3,37,2303,76,597,2107,72,36,61,61,11,178,19,108,16,18,9,7,5,3,31,2303,76,2107,198,206,36,149,5,3,19,120,125,648,468,28,58,54,80,167,38,47,79,89,86,91,16,19,9,7,5,18,3,21,2303,67,61,106,79,108,85,106,79,52,98,69,35,12,68,5,65,84,5,67,64,5,65,70,5,115,25,3,1,78,440,64,64,57,60,61,62,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_content_list.clas.abap"],"names":[],"mappings":";;AA2DA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;QAEQ,uDAAkB;QAClB,ovEAA8B;QAC9B,qhEAAsC;QACtC,ohEAAsC;QAEvC,2HAA2C;IAEhD,IAAc,WAAoC;;;MAIhD,aAAW,eAAE,MAAC,MAAK;MACnB,mBAAqB,GAAf,WAAS,MAAC,OAAQ;iBAAU;;MAElC,iBACyD,IADtD,6GACwD,uBAAS;QAClE,UAAU,MAAC,aAAU,WAAS,MAAC,QAAO;QACtC,UAAU,MAAC,UAAU,WAAS,MAAC,KAAI;QACnC,UAAU,MAAC,YAAU,WAAS,MAAC,OAAM;QACrC,UAAU,MAAC,YAAU,WAAS,MAAC,OAAM;QACrC,gCAAO,oBAAc,WAAW;MAClC;;IAGF;IAEA;;;;;;;QAII,sBAAM,SAAS;QACf,SAAS,MAAC,UAAU,WAAS,MAAC,KAAI;QAClC,SAAS,MAAC,aAAU,uCAAS,MAAC,IAAG;QACjC,SAAS,MAAC,YAAU,sBAAS;;;MAI/B,SAAS,MAAC,aAA4B,mBAAlB,SAAS,MAAC,SAAU,WAAS,MAAC,SAAO;0EAChB;;;;;;;QAGvC,SAAS,MAAC,aAAS,6BAAkB;QACrC,SAAS,MAAC,aAAS,8BAAmB;QACtC,gCAAO,mBAAa,aAAa;;;IAErC;EAEF;EAGA;;QAEQ,oyBAAkD;QAClD,4kBAA8C;IAEpD,IAAe,gBAAyC;IAAxD,IACe,YAAoC;IAGnD,cAAW,mdAI4C;;;;MAIrD,gBAAc,MAAC,cAAY,YAAU,MAAC,OAAM;MAC5C,gBAAc,MAAC,cAAY,YAAU,MAAC,SAAQ;MAC9C,gBAAc,MAAC,UAAY,YAAU,MAAC,KAAI;MAC1C,gBAAc,MAAC,eAAY,YAAU,MAAC,UAAS;MAC/C,kCAAmB,kBAAkB,OAAO;MAC5C,gBAAc,MAAC,cAAW,gCAAiD,IAA1C,0EAA4C,wBAAnD,CAA+D;MACzF,iBAA2B,GAAxB,gBAAc,MAAC,WAAW,uBAAS;QACpC,gBAAc,MAAC,aAAU,uCAAS,MAAC,SAAQ;MAC7C;QACE,gBAAc,MAAC,aAAU,uCAAS,MAAC,QAAO;MAC5C;MAEA,yBAAG,gBAAc,MAAC,oBAAuB;QACvC,kCAAmB,kBAAkB,OAAO;QAC5C,iBAA0C,IAAvC,uEAAyC,uBAAS;UACnD,gBAAc,MAAC,iBAAa,yEAA0C;QACxE;QACA,sBAAM,OAAO;MACf;IACF;IAEF;;EAGA;;QAGI,2HAAgD;QAChD,mlBAAwD;QACxD,20CAAyD;QACzD,4kBAAmD;QACnD,glBAA0B;QAC1B,gEAAyB;IAE3B,IAAe,aAAqC;IAApD,IACe,gBAAyC;IAGxD,eAAY,uDAAyB;;;;;;;;QAKjC,gBAAc,MAAC,cAAY,aAAW,MAAC,SAAQ;QAC/C,gBAAc,MAAC,cAAY,aAAW,MAAC,SAAQ;QAC/C,gBAAc,MAAC,cAAY,aAAW,MAAC,SAAQ;QAC/C,gBAAc,MAAC,aAAY,uCAAS,MAAC,QAAO;QAC5C,gBAAc,MAAC,aAAY,+BAAC;QAC5B,gBAAc,MAAC,UAAY,aAAW,MAAC,KAAI;QAC3C,gBAAc,MAAC,eAAY,aAAW,MAAC,UAAS;;;MAIlD,yBAAG,aAAW,MAAC,oBAAuB;QACpC,kCAAmB,eAAe,OAAO;QACzC,OAAO,MAAC,gBAAa,gCAAyB,GAAlB,aAAW,MAAC,QAAQ,wBAA3B,CAAuC;QAC5D,gCAAO,iBAAW,gBAAc,MAAC,MAAK;QAEtC,iBAAwB,GAArB,aAAW,MAAC,WAAW,uBAAU,iBAA2B,GAAvB,gBAAc,MAAC,UAAU,uCAAS,MAAC,SAAO;UAChF,gBAAc,MAAC,aAAU,uCAAS,MAAC,SAAQ;QAC7C;QAEA,iBAAsB,GAAnB,OAAO,MAAC,aAAa,uBAAS;UAC/B,gBAAc,MAAC,aAAU,uCAAS,MAAC,QAAO;UAC1C,gBAAc,MAAC,aAAiC,mBAAvB,gBAAc,MAAC,SAAU,gCAAC;oFACN;QAC/C;MACF;MAEA,iBAA0B,GAAvB,gBAAc,MAAC,UAAU,gCAAE,yBAAI,gBAAc,MAAC,oBAAuB;QACtE,kCAAmB,kBAAkB,OAAO;QAC5C,iBAAe,GAAZ,aAAc,QAAO;UACtB,gBAAc,MAAC,gBAAa,aAAa;QAC3C,wBAA8C,IAAvC,uEAAyC,uBAAS;UACvD,gBAAc,MAAC,iBAAa,yEAA0C;UACtE,gBAAc,OAAO;UACrB,kBAAgB,gBAAc,MAAC,WAAU;QAC3C;QACA,sBAAM,OAAO;MACf;;;;;;;QAGE,yBAAG,gBAAc,MAAC,UAAmB;UACnC,gBAAc,MAAC,aAAU,uCAAS,MAAC,OAAM;QAC3C;QACA,gBAAc,MAAC,aAAS,6BAAkB;QAC1C,gBAAc,MAAC,aAAS,8BAAmB;QAC3C,gBAAc,MAAC,eAAW,qCAA0B;;;IAExD;IAEF;;EAGA;QAEY,+DAAgC,CAAA;;QAErC,i3BAAuD;IAE5D,eAAY,6DAA4B;IAExC,iBAAsB,GAAnB,yBAAO,aAAc,iBAAgB;MAEtC;;;;sMAG8D;MAC9D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+JACoE;MACpF;IACF;EAEF;EAGA;;;IACE,iBAAU,OAAO;;IAEnB;;EAGA;;;QAEO,4kBAA6C;IAElD,IAAc,WAAoC;;;MAGhD,OAAO,MAAC,cAAW,WAAS,MAAC,SAAQ;MACrC,OAAO,MAAC,cAAW,WAAS,MAAC,SAAQ;MACrC;QACI,WAAS,MAAC,gBAAY,uIAAwE;;;;;;MAGlG;IACF;EAEF;EAGA;;;IAEE,IAAe,WAAoD;;;;;IAKnE;EACF;EAGA;;QACO,oHAAuC;QACvC,+nBAA6C;QAC7C,2cAAmD;IAExD,WAAS,WAAM;IAGf,iBAAc,mCAAmB;IACjC,yBAAG,sBAAoB;MACrB,iBAAc,uDAA4B;;;QAExC,IACE,OAEA,KAHG,WAAW,OAAE,IAAlB;;wFAE0C;;0FAEE;;UAExC;;MAEN;IACF;IACF;;EAGA;;;;;;;;;;mDAEkB;IAEhB,iBAAiC,IAA9B,+CAAgC,uBAAS;MAC1C,mBAAgB,0CAA+B;kCAC7B;IACpB;MACE,mBAAgB,yCAA8B;IAChD;IAEA,iBAAiB,GAAd,eAAgB,uBAAS;mFAGiB;IAC7C;IAEA,iBAAmB,GAAhB,iBAAkB,uBAAS;+DAE4B;IAC1D;IAEA,iBAAiB,GAAd,eAAgB,uBAAS;qEACoC;IAChE;IAEA;IAKF;;AACF","file":"zcl_abapgit_repo_content_list.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_cs_migration.clas.mjs":{"lineLengths":[53,42,37,32,57,37,25,460,207,205,48,17,42,22,3,29,64,16,3,36,68,3,43,106,73,155,116,82,3,34,66,3,41,106,73,137,104,1356,191,171,173,126,200,125,13,5,113,89,3,36,68,3,43,336,334,105,64,313,316,70,32,48,111,79,28,52,90,76,7,5,23,3,15,47,3,22,336,105,61,70,32,62,64,5,3,1,78,358,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_cs_migration.clas.abap"],"names":[],"mappings":";;AAmCA;;;;;;;;;;;;;;;;;EAGE;;;;;;QAEO,kJAA4D;+BAEjE,sBAAuB,6DAAwC;iFACV;EAEvD;EAGA;;;;;;QAEO,gIAA4C;QAC5C,+FAAwD;QAElD,m0CAAe;IAI1B,YAAS,6KAEiB;IAE1B,oKAA4E;IAC5E,sKAA8E;IAE9E;;IAKA,iBAA4C,GAAzC,yBAAO,eAAe,MAAC,oBAAoB,gCAAC;MAC7C;IACF;;wFAGqD;EAEvD;EAGA;;;;;QAEO,qUAA0B;QAC1B,gGAAmC;QACnC,uDAAe;IAEpB;IAGA;;;MAKE,aAAW,eAAE,MAAC,MAAK;MACnB;;;kDAA4E;MAC5E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;MAEf;IACF;IAEF;;EAGA;;;;QAEO,uUAA4B;QAC5B,gGAAmC;IAExC,iBAAc,sCAA2B;;;6DAGR;+DACE;IACnC;EAEF;AACF","file":"zcl_abapgit_repo_cs_migration.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_filter.clas.mjs":{"lineLengths":[53,36,31,32,51,37,25,935,1754,2160,17,42,22,3,29,64,16,3,22,814,67,813,61,792,64,627,60,97,13,5,29,67,37,48,62,147,160,29,103,90,73,7,5,3,36,814,67,132,58,103,73,889,61,538,597,595,813,792,29,67,32,131,17,7,198,38,38,56,58,58,72,62,43,55,17,7,62,139,152,29,95,90,55,7,5,3,39,813,61,595,599,67,242,63,237,58,347,30,42,41,42,38,38,48,11,184,133,143,43,19,24,46,75,79,63,15,18,22,11,9,92,19,9,74,37,590,9,71,34,274,9,7,5,3,68,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_filter.clas.abap"],"names":[],"mappings":";;AAgCA;;;;;;;;;;;;;;;;EAGE;;;;;QAEQ,+wBAC+C;QAC/C,uDAAgB;IAEtB,IAAe,YAAgC;2DAEO;IAEtD,iBAAsB,GAAnB,yBAAO,aAAc,gCAAC;MACvB;IACF;IAEA,cAAY,SAAS;;;MAInB,aAAW,eAAE,MAAC,MAAK;MACnB;;;;qGAEyD;MACzD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;MAEhB;IACF;EAEF;EAGA;;;;;;;;;QACO,ihBAAwD;QACxD,4kBAA6C;QAC7C,0kBAA+C;QAC/C,oyBAAkD;QAClD,+wBACgD;IAErD,cAAY,SAAS;;;MAGnB,iBAAqB,GAAlB,OAAO,OAAE,UAAW,wCAAyB,sCAAa;QAC3D;MACF;qMAS2B;MAE3B,sBAAM,QAAQ;MACd,sBAAM,QAAQ;MAEd,QAAQ,MAAC,YAAS,OAAO,MAAC,SAAQ;MAClC,QAAQ,MAAC,cAAW,OAAO,MAAC,SAAQ;MACpC,QAAQ,MAAC,cAAW,OAAO,MAAC,SAAQ;MAEpC,+DAAmC;6DAEmB;MAEtD,yBAAG,SAAmB;;QAEpB;MACF;MAEA;;;;6FAGa;MAEb,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;MAEhB;IAEF;EAEF;EAGA;;;QAEQ,0kBAAmD;QACnD,8kBAAmD;QACnD,0DAA4B;QAC5B,yOAA2C;QAC3C,sDAAyB;QACzB,oOAAyC;QACzC,iDAAuB;;;MAG3B,sBAAO,YAAY;MAAnB,sBAAqB,WAAW;MAAhC,sBAAkC,YAAY;MAA9C,sBAAgD,QAAQ;MAAxD,sBAA0D,QAAQ;MAElE,iBAAe,QAAQ,MAAC,SAAQ;;;;;;;;;;;;;;;;;QAYhC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd;QACF;;;;QAUA;;;;QAIA;MAEF;IAEF;EACF","file":"zcl_abapgit_repo_filter.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_offline.clas.mjs":{"lineLengths":[71,53,37,57,32,52,55,25,74,156,69,62,17,12,42,22,3,29,64,16,3,29,99,128,18,3,24,890,34,31,55,3,25,66,58,37,3,37,67,59,40,42,5,19,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_offline.clas.abap"],"names":[],"mappings":";;;AA2BA;;;;;;;;;;;;;;;;;;EAGE;;IACE,WAAS,gCAA0B,GAAnB,yBAAO,kBAAc,gCAA5B,CAA+B;IAC1C;;EAGA;QAEO,i3BAAwB;IAS7B,cAAY,cAAS;8BACC;sDACO;EAE/B;EAGA;;;oCACwB;EACxB;EAGA;;IACE,aAAU,wCAAkB;IAE5B,yBAAG,QAAkB;MACnB,YAAU,YAAO,MAAC,IAAG;IACvB;IACF;;AACF","file":"zcl_abapgit_repo_offline.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_online.clas.mjs":{"lineLengths":[71,53,36,56,32,51,81,989,193,241,984,56,984,177,77,69,62,17,12,42,22,892,116,68,78,80,80,56,50,68,68,56,68,80,3,29,64,16,3,24,135,1969,83,13,5,124,166,91,218,12,218,5,65,64,53,3,23,891,30,36,22,3,36,122,64,99,140,1983,1776,72,51,321,37,144,133,41,5,58,261,84,5,3,29,99,39,18,3,45,67,61,929,75,172,63,25,65,68,27,41,88,123,167,5,3,28,891,70,36,3,58,148,69,67,66,78,52,143,11,77,19,108,70,204,66,18,63,11,375,105,86,16,18,9,7,5,3,54,67,61,105,61,105,151,40,77,12,27,5,64,160,80,3,54,105,30,40,19,3,55,109,48,19,3,55,116,63,30,3,55,124,63,30,3,43,100,39,18,3,45,809,70,122,64,2633,67,107,155,210,76,5,77,98,118,76,5,328,140,5,57,91,79,12,80,5,316,68,69,53,141,30,3,54,116,82,30,93,3,54,116,94,30,61,3,48,100,58,30,37,3,54,100,58,111,67,105,76,106,63,64,51,13,5,39,69,15,14,154,73,144,9,168,142,208,82,7,74,181,67,84,12,131,5,3,50,889,147,79,108,85,112,30,132,20,3,37,67,59,40,11,100,110,19,108,75,16,18,9,7,5,19,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_online.clas.abap"],"names":[],"mappings":";;;AA2EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;QAEQ,8HAA4C;QAC5C,w6DAA0D;IAEhE,iBAA6B,GAA1B,gCAA4B,wBAAU;MACvC;IACF;IAEA,iBAAc,qGAAuC;qKAGC;IAEtD,0BAAG,0DAAiC;MAClC,aAAU,qMACoF;IAChG;MACE,aAAU,qMACoF;IAChG;gEAEiC;+DACH;IAC9B,2BAAoB,OAAO,MAAC,OAAM;EAEpC;EAGA;;6BACiB;IACf,eAAa,eAAU;IACzB;;EAGA;;;QAEQ,0FAA6B;QAC7B,mIAAkD;QAClD,s7DAAwD;IAE9D,IAAe,YAAgC;IAG/C,oBAAiB,8CAAkB;IACnC,cAAW,+BAAoB;;;+IAKa;oIAIe;MAEzD,WAAS,sBAAS;IAEpB;IAEA,iBAAU,GAAP,QAAS,uBAAS;oQAI2B;mFAEb;IACnC;EAEF;EAGA;;IACE,WAAS,sBAAS;IACpB;;EAGA;;;QAGI,w5BAAuE;QACvE,kEAA2B;IAE7B,iBAAc,qJAAuE;IAErF;;;;;uCAE6C;IAC7C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,qBAAkB,8FAAwD;sKACG;IAC/E;EAEF;EAGA;;;IACE,oBAAa,UAAU;EACzB;EAGA;QAGI,2IAAsD;QACtD,4DAA0B;QAC1B,0DAA0B;QAC1B,yDAA0B;IAE5B,eAAY,yDAAsB;IAElC,yBAAG,oBAAwB;MACzB,oBAAiB,mHAAiD;MAElE;4EAC6C;;;;;;;;;;;;;;;MAa7C;IACF;EAEF;EAGA;;;;;QAEQ,gGAAiD;IAEvD,oCAAe,GAAR,SAAW,4CAA6B,wCAAY,MAAC,OAAK;IAEjE,yBAAG,QAAkB;MACnB,aAAU,wDAAqB;IACjC;MACE,YAAU,OAAO;IACnB;+DAEuC;+JAKlB;+EAGG;EAE1B;EAGA;;6BACiB;IACf,YAAU,sBAAiB;IAC7B;;EAGA;;IACE,YAAU,YAAO,MAAC,YAAW;IAC/B;;EAGA;;IACE,uBAAqB,YAAO,MAAC,gBAAe;IAC9C;;EAGA;;IACE,uBAAqB,YAAO,MAAC,gBAAe;IAC9C;;EAGA;;IACE,WAAS,YAAO,MAAC,IAAG;IACtB;;EAGA;;;;;QAIQ,gkFAAwD;QACxD,0DAAqB;QACrB,kGAAmD;IAGzD,iBAAuB,GAApB,YAAO,MAAC,cAAe,4CAA6B,wCAAY,MAAC,MAAI;MACtE,0MACwE;2EACjC;IACzC;IAEA,yBAAG,YAAO,MAAC,2BAA8B;MACvC,YAAU,8EAA4C;MACtD,8GAAuD;2EAChB;IACzC;IAEA,iBAAuC,GAApC,YAAO,MAAC,eAAc,MAAC,eAAe,uBACrC,iBACsB,IADlB,mLACoB,wBAAU;2IACsC;IAC5E;wDAE+B;IAE/B,0BAAG,0DAAiC;MAClC,eAAY,wDAAqB;IACnC;MACE,eAAY,yDAAsB;IACpC;IAEA,aAAU,ySAMyB;mEAED;oEACG;IAErC,2BAAoB,OAAO,MAAC,OAAM;4IAE4B;6BAE/C;EAEjB;EAGA;;;6BAEiB;4FAEkB;EAEnC;EAGA;;;6BAEiB;4DAC+B;EAEhD;EAGA;;;6BAEiB;oCACO;EAExB;EAGA;;;;;;;;QAEO,sDAAc;IAGnB,iBAAgB,GAAb,cAAe,uBAAS;kDACS;MAClC;IACF;IAEA,yBAAG,OAAiB;MAClB,yBAAG,YAAO,MAAC,iBAA0B;QACnC;MACF;QACE,YAAU,mBACR,KAAM,2BAAS,YAAO,MAAC,oBACvB,KAAM,sCAAK;QACb,iBAAW,GAAR,SAAU,iCAAE;+IACwD;QACvE;QACA,YAAsD,qBAAV,qBAAlC,0BAAQ,YAAO,MAAC,mBAAoB,SAAU,gCAAC;6IAGtC;+MAGI;iFACO;MAChC;IACF,gCAAO,YAAO,MAAC,iBAA0B;oLAC8B;kEACpD;mFACS;IAC5B;kIAC8D;IAC9D;EAEF;EAGA;;;;;;;6BACiB;IACf,cAAW,gHAE0B;IACvC;;EAGA;;IACE,aAAU,wCAAkB;IAC5B,yBAAG,QAAkB;MACnB;QACI,aAAU,6EAAoC;QAC9C,aAAU,uFAAwC;;;;;;;MAGtD;IACF;IACF;;AACF","file":"zcl_abapgit_repo_online.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_srv.clas.mjs":{"lineLengths":[53,33,28,32,48,87,228,177,187,417,401,55,61,4668,208,4552,5284,224,228,17,42,22,46,101,111,340,3,29,64,16,3,20,123,61,123,119,71,29,128,48,17,9,121,7,5,49,62,68,3,38,67,67,61,66,58,148,25,40,69,103,66,212,154,5,19,3,24,47,3,31,130,60,105,5,44,18,3,32,55,3,39,130,58,44,3,36,123,4404,76,79,111,12,112,5,39,19,3,23,4614,4431,40,126,66,36,66,5,45,56,3,29,4614,331,123,69,142,4438,83,150,110,65,71,29,53,77,105,75,29,48,90,91,17,178,82,7,5,66,43,73,5,45,55,3,35,101,58,4311,61,123,4404,73,76,78,61,39,65,3,44,102,70,4615,64,106,79,108,123,58,69,64,4399,140,324,123,67,29,86,119,112,17,7,41,141,144,115,81,30,54,92,31,202,17,9,7,68,146,115,81,30,54,92,31,216,17,9,7,5,3,57,101,58,4311,61,1392,82,146,87,140,80,72,5,3,44,123,61,171,177,240,192,5,76,106,3,41,123,101,58,155,65,31,5,59,60,65,53,90,33,7,73,38,92,35,56,25,9,7,5,50,177,19,3,47,477,339,1168,263,188,155,100,58,66,36,93,120,70,39,47,75,7,5,39,69,21,3,59,102,70,106,79,108,123,58,69,64,4615,116,117,4431,127,63,71,74,27,47,88,119,69,49,196,12,161,5,3,55,66,58,123,58,69,64,4615,83,81,72,116,117,4431,35,37,103,127,199,36,118,76,121,94,71,51,203,15,7,5,3,37,40,3,55,105,66,58,109,91,339,123,66,102,140,66,58,66,29,109,17,7,58,81,82,107,17,7,112,203,77,7,47,12,5,24,3,37,339,132,31,5,30,19,3,47,339,331,123,150,78,133,37,5,71,29,73,118,78,28,51,90,67,7,5,19,3,49,123,66,58,102,70,75,85,178,69,67,106,79,108,110,91,116,4399,101,135,140,209,119,5,109,39,134,5,88,77,310,9,144,17,106,128,14,16,7,5,99,96,79,5,81,61,88,75,25,19,3,48,123,66,58,74,82,75,85,102,70,75,85,180,69,67,106,79,108,110,91,116,4399,133,74,101,1959,66,113,53,209,119,5,109,67,102,113,59,299,9,144,17,106,127,14,16,7,5,99,96,79,5,81,61,88,51,50,75,25,19,3,43,120,123,61,688,67,813,130,119,49,116,135,163,214,119,5,179,9,115,17,106,24,93,29,14,16,7,5,63,18,3,54,102,70,106,79,108,106,79,107,54,123,69,142,163,328,184,5,65,156,52,80,7,5,3,50,66,58,106,79,107,123,69,69,65,114,52,80,7,5,3,1,60,143,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_srv.clas.abap"],"names":[],"mappings":";;AAuEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;QAEO,kHAA4B;QAC5B,8GAAoC;;;MAGvC,iBAAwB,GAArB,OAAO,OAAE,wBAAO,MAAC,MAAM,OAAO,OAAE,wBAAO,MAAC,KAAG;QAC5C,iBAAW,GAAR,SAAU,QAAO;UAClB;QACF;wHACgD;MAClD;IACF;+BAEA,SAAW,OAAO;6DACU;IAC5B,gCAAO,iBAAW,YAAO;EAE3B;EAGA;;;;;;QAEO,2IAAsD;IAE3D,YAAU,OAAO;IACjB,yBAAG,QAAkB;MACnB,4CAAW,iBAAiB;MAC5B,oBAAiB,2EAA6C;MAC9D,aAAU,6CAAkC;IAC9C,wBAAU,GAAH,kCAAK,mBACR,KAAM,SACN,KAAM,4CAA6B,wCAAY,MAAC,gBAAc;MAEhE,kCAAU,4CAA6B,wCAAY,MAAC,cAAgB,QAAO;IAC7E;IAEF;;EAGA;;;;;IACE,yBAAG,4BAAiB;;IAEpB;IACA,WAAS,2BAAM;IACjB;;EAGA;;;;;;IACE,gCAAS,MAAM;EACjB;EAGA;;;;IAEE,iBAAwB,GAArB,YAAY,MAAC,UAAU,wBAAU;;IAIpC;;IAIA;sCACc;IAEhB;;EAGA;QAEQ,6/IAA8C;IAEpD,IAAe,WAA8B;IAE7C,sBAAM,YAAO;IAEb,aAAU,2GAAiD;;;iEAEzB;IAClC;IAEA,iBAAU,sBAAS;IACnB,2BAAoB,uBAAU;EAEhC;EAGA;QAEQ,6/IAAwD;QACxD,kUAA6D;QAE9D,kHAAoC;QACpC,4DAAoB;QACpB,qIAA+C;IAEpD,IAAe,kBAAqC;IAEpD,gBAAoB,6DAAwC;IAC5D,uBAAoB,yHAA+D;IACnF,aAAoB,2FAA6C;IAEjE;;;MAGE,kBAAgB,eAAE,MAAC,MAAK;MAExB;;;;8CAAoF;MACpF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;QAEb;MACF,wBAAiD,IAA1C,qHAA4C,wBAAU;;MAG7D;IAEF;;;wEAIyC;IACzC;IAEA,iBAAU,sBAAS;IACnB,2BAAoB,sBAAS;EAE/B;EAGA;;;;;QAEO,kHAAyC;QACzC,2yIAAkD;IAEvD,aAAU,sDAAkC;;IAE5C,4CAAO,eAAE,MAAC,OAAgB;IAE1B,kCAAmB,SAAW,YAAY;IAC1C,YAAY,MAAC,SAAM,MAAM;gEAEU;EAErC;EAGA;;;;;;;;;;;;QAGI,syIAAiC;QACjC,mIAA+C;QAC/C,2TAAwD;QACxD,kHAAwC;;;MAGxC,aAAU,iEAAuC;MAEjD,gBAAa,+FAAuD;MACpE,iBAAyB,IAAtB,0DAAwB,wBAAU;QAEnC;MACF;MAEA,sBAAM,WAAW;MACjB,iBAAqD,KAAlD,kEAA+B,oBAAqB,wBAAU;QAC/D,iCAAgB,yFAAmC,WAAW;QAC9D;;;oDACkC;QAClC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,YAAU,OAAO;UACjB,8LAAkF;UAClF;QACF;MACF;MAEA,iBAAiB,GAAd,eAAgB,wBAAU;QAC3B,iCAAgB,2FAAqC,WAAW;QAChE;;;oDACkC;QAClC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,YAAU,OAAO;UACjB,4MAAgG;UAChG;QACF;MACF;IAEF;EAEF;EAGA;;;;;;;QAEO,yIAAmD;IAExD,oBAAiB,6DAAwC;2IAItB;IAOnC,iBAA0B,GAAvB,cAAc,MAAC,UAAU,uBAAS;uEAGd;IAEvB;EAEF;EAGA;;;0KAEyE;gLACG;IAG1E,iBAA0F,IAAvF,6LAAyF,uBAAS;+LACd;IACvF;;IAGA,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;EAErB;EAGA;;;;IAEE,IAAe,WAA8B;IAE7C,iBAAW,GAAR,cAAU,wBAAU;8BACP;IAChB;;;;;MAIE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;gCACC;MAChB;;;QAEE,iBAA0B,GAAvB,WAAS,OAAE,wBAAO,MAAC,MAAM,OAAM;UAChC,YAAU,WAAS;UACnB;;QACF;MACF;IACF;;gLAEyF;IAE3F;;EAGA;;QAGI,0UAAyD;QACzD,uoCAAsE;QACtE,8PAAmC;QACnC,mLAAwC;IAE1C,IACE,WAAuC;IADzC,IAEE,YAAoC;IAEtC,aAAU,uCAA4B;;;MAIpC,uBAAoB,8DAAgC;MACpD,eAAY,iGAA0D;;;QAGpE,QAAQ,MAAC,WAAQ,YAAU;QAC3B,gEAAoC;MACtC;IAEF;IAEA;;IAGF;;EAGA;;;;;;;;;;QAGI,8/IAA+C;QAC/C,2GAAqE;QACrE,4GAAqE;IAEvE,IACE,WAA+B;IAGjC,cAAW,2GAAiD;IAC5D;;;;6CAAqE;IACrE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,aAAU,kGAAqC;MAC/C,aAAU,gDAAoB;MAC9B,aAAW,WAAS,MAAC,WAAU;MAC/B,4LAAqF;IACvF;gKASiC;IACjC;EAEF;EAGA;;;;;;;QAGI,8/IAA8D;QAC9D,0EAAmC;QACnC,wEAAmC;QACnC,+DAAmC;QACnC,2GAAoF;QACpF,4GAAoF;IAEtF,IACE,WAA+B;IAEjC,sBACE,OAAO;IADT,sBACW,SAAS;IAEpB,6BAA0B,oEAAsC;IAGhE,cAAW,2GAAiD;;;MAG1D,2BAAwB,mFAA6C;MAErE,iBAA2B,GAAxB,yBAA0B,sBAAqB;QAChD,aAAe,kGAAqC;QACpD,kBAAe,kEAAoC;QACnD,aAAe,gDAAoB;QACnC,aAAe,WAAS,MAAC,WAAU;QACnC,iMAA6F;QAC7F;MACF;IAEF;EAEF;EAGA;IACE,sBAAM,YAAO;EACf;EAGA;;;;;;QAEQ,0UAAsD;QACtD,kHAA2C;QAC3C,yDAA0B;QAC1B,6FAA4B;QAC5B,mIAAkD;QAClD,yDAA0B;IAEhC,aAAU,uCAA4B;;;MAGpC,mBAA6B,IAAvB,oDAAyB;iBAAU;;iCACzC,gBAAkB,OAAO;MAEzB,YAAa,6DAA0B;MACvC,gBAAa,0DAA8B;MAC3C,mBAAyB,GAAnB,4BAAU,UAAW,4BAAU;iBAAQ;;MAI7C,yBAAG,4BAAiC,iBAAsB,GAAlB,mBAAqB,WAAU;QACrE,iMACkC;4EACI;MACxC;MAEA,iBAAe,sBAAS;MACxB;IACF;IAEF;;EAGA;;IAEE,iBAAW,GAAR,cAAU,wBAAW,iBAAqB,GAAlB,wBAAoB,uBAAS;8BACxC;IAChB;IAEA,YAAU,YAAO;IAEnB;;EAGA;;QAEO,kUAA6D;QAC7D,kHAAoC;IAEzC,uBAAoB,yHAA+D;IACnF;IAEA,iBAAW,GAAR,cAAU,wBAAW,iBAAqB,GAAlB,wBAAoB,wBAAU;oCACnC;IACtB;;;MAGE;;;;iDAE2C;MAC3C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,gCAAO,iBAAW,OAAO;MAC3B;IACF;IAEF;;EAGA;;;;;;;;;;;;;;;;;QAEQ,syIAAoD;QACpD,4FAAwD;QACxD,8HAAmD;QACnD,mIAAkD;IAGxD,iBAAiF,IAA9E,6JAAgF,wBAAU;sHAC3C;IAClD;4GAIiC;IAEjC,yBAAG,OAAiB;qIAC6C;IACjE;IAEA,oBAAiB,8DAAyC;4EACP;IAEnD,YAAS,oSAKwC;IAEjD;MACI,aAAU,2HAAwD;;;;;;;IAGtE;+BAEA,UAAW,wDAA8B;IAEzC,iBAA6C,GAA1C,OAAO,MAAC,eAAc,MAAC,qBAAsB,cAAa;MAC3D,OAAO,MAAC,eAAc,MAAC,wBAAqB,aAAa;IAC3D;IACA,OAAO,MAAC,eAAc,MAAC,wBAAqB,iBAAiB;IAC7D,OAAO,MAAC,eAAc,MAAC,YAAS,SAAS;uFAEY;0EACN;IAE/C,YAAU,OAAO;IAEnB;;EAGA;;;;;;;;;;;;;;;;;;;;;QAEQ,syIAAoD;QACpD,4HAAkD;QAClD,iEAAkC;QAClC,4FAAwD;QACxD,85DAA2D;QAC3D,yDAA0B;IAGhC,4CAAW,iBACT,yBAAQ,qBAAqB;IAE/B,WAAS,4BAAU,QAAQ;IAE3B,iBAAiF,IAA9E,6JAAgF,wBAAU;sHAC3C;IAClD;4GAIiC;kEAEU;IAE3C,oBAAiB,4EAEG;IAEpB,oBAAiB,uFAAsD;IACvE,cAAc,MAAC,kBAAe,eAAe;IAE7C,YAAS,yRAM2B;IAEpC;MACI,aAAU,2HAAwD;;;;;;;IAGtE;+BAEA,UAAW,wDAA8B;IAEzC,iBAA6C,GAA1C,OAAO,MAAC,eAAc,MAAC,qBAAsB,cAAa;MAC3D,OAAO,MAAC,eAAc,MAAC,wBAAqB,aAAa;IAC3D;IACA,OAAO,MAAC,eAAc,MAAC,wBAAqB,iBAAiB;IAC7D,OAAO,MAAC,eAAc,MAAC,YAAS,SAAS;uFAEY;kDAClC;iDACgB;0EACY;IAE/C,YAAU,OAAO;IAEnB;;EAGA;;;;;;QAMQ,oyBAAkD;QAClD,yHAA0C;QAC3C,8GAAoC;+BAEzC,SAAW,OAAO;IAClB,YAAS,kGAA0C;IAEnD,iBAAkD,KAA/C,kEAA+B,iBAAkB,uBAAS;kKACiC;IAC9F,wBAAmF,IAA5E,2JAA8E,wBAAU;sHAC7C;IAClD;IAEA,cAAW,+JAAkE;IAE7E;kHAGqD;;;;;;;;;IAKrD;8DAEsC;IAExC;;EAGA;;;;;;;;;QAEQ,6CAA6B;QAC7B,kHAAuC;QACvC,4DAAsB;6IAEwC;IAGpE,gBAAa,6IAAuE;IAEpF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAe,GAAX,YAAa,uCAAM,iBAC6B,IAAlE,4HAAoE,wBAAU;uLACgB;IAChG;IAGA,iBAAiB,GAAd,eAAgB,uBAAS;2JAOK;MAE/B,yBAAG,kBAAgB;+EACwB;MAC3C;IACF;EAEF;EAGA;;;;;;QAGI,kHAAsC;QACtC,4DAAqB;oEAEY;IAEnC,iBAAiB,GAAd,eAAgB,uBAAS;iHAMC;MAC3B,yBAAG,kBAAgB;+EACwB;MAC3C;IACF;EAEF;AACF","file":"zcl_abapgit_repo_srv.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_requirement_helper.clas.mjs":{"lineLengths":[53,43,38,32,58,37,25,1172,1778,1055,686,832,17,42,22,3,29,64,16,3,43,76,3,50,1044,586,85,245,393,838,103,9,199,148,103,41,17,22,44,77,61,13,16,20,9,7,90,197,7,76,45,56,78,87,83,81,101,104,31,77,92,89,90,85,108,16,63,9,41,7,23,5,38,71,5,45,106,588,87,1050,101,121,85,29,58,90,92,14,93,7,23,5,46,79,5,53,102,808,69,66,64,65,63,11,68,64,66,62,19,110,47,25,16,18,9,7,266,44,7,21,5,37,70,5,44,588,87,1050,54,101,74,306,77,148,7,5,41,74,5,48,1052,87,6,114,119,134,1021,74,74,65,349,101,852,845,68,76,68,76,38,76,45,59,75,7,75,38,78,57,16,57,9,7,29,11,101,59,174,99,46,127,100,125,102,166,212,137,37,19,268,23,114,16,18,9,7,5,3,82,843,1084,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_requirement_helper.clas.abap"],"names":[],"mappings":";;AAwDA;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,4OAA6C;IAEnD,IAAe,kBAAgE;IAA/E,IACe,aAA8C;IAD7D,IAEe,qBAAkC;;;;;;;;;;;;;;;;MASjD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oMACwE;MACxF;;;;QAIE,aAAW,MAAC,eAAY,kBAAgB,MAAC,UAAS;QAClD,aAAW,MAAC,sBAAmB,kBAAgB,MAAC,YAAW;QAC3D,aAAW,MAAC,oBAAiB,kBAAgB,MAAC,UAAS;QAEvD;;;;2EACqD;QACrD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UAGb,aAAW,MAAC,uBAAoB,qBAAmB,MAAC,QAAO;UAC3D,aAAW,MAAC,qBAAkB,qBAAmB,MAAC,WAAU;UAC5D,aAAW,MAAC,iBAAc,qBAAmB,MAAC,UAAS;UACvD,aAAW,MAAC,UAAM,mEAA0C;QAC9D;UAEE,aAAW,MAAC,SAAM,uBAAU;QAC9B;QAE4B;MAC9B;MAEF;;IAGA;;;;;;;UAEQ,+gCAA2C;MAEjD,mBAAgB,0EAA6C;MAE7D;;;wDAAyE;MACzE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,cAAY,wCAAyB,4BAAI;MAC3C;QACE,cAAY,wCAAyB,6BAAK;MAC5C;MAEF;;IAGA;;;;;;;UAGI,uDAAoC;UACpC,qDAAoC;UACpC,sDAAoC;UACpC,oDAAoC;MAEtC;QAC+C,yBAA/B,SAAS,MAAC,kBAAyC;QACpB,uBAA/B,SAAS,MAAC,gBAAuC;QAClB,wBAA/B,SAAS,MAAC,iBAAwC;QACnB,sBAA/B,SAAS,MAAC,eAAsC;;;;;;;;MAMhE;MAGA,iBAAwB,GAArB,sBAAuB,oBACtB,IAAG,cAAuB,GAArB,sBAAuB,oBAC3B,IAAI,cAAoB,GAAlB,mBAAoB,gCACvB,iBAAsB,GAAnB,oBAAsB,kBAAkB,CAAE,CAAC;QAEpD,YAAU,sBAAS;MAErB;MAEF;;IAGA;;;;;;UAEQ,+gCAA2C;UAC3C,2CAA6B;MAGnC,mBAAgB,0EAA6C;yEAEtB;MAEvC,eAAY,2RAEyE;MAErF,iBAAa,GAAV,WAAa,qCAAG;mJAC0D;MAC7E;IAEF;IAGA;;;;;;;UASQ,uGAA2C;UAC3C,4GAA4C;UAC5C,2HAAmD;UACnD,k/BAAmC;UACnC,+DAAiC;UACjC,+DAAiC;UACjC,sDAAiC;UACjC,kVAA4D;UAC5D,0FAAqC;MAE3C,IAAe,WAAmC;MAAlD,IACe,kBAA6C;MAG5D,QAAQ,MAAC,MAAK,MAAC,SAAM,yBAAY;MACjC,gCAAO,kBAAY,iBAAiB;MAEpC,QAAQ,MAAC,MAAK,MAAC,SAAM,yBAAY;MACjC,gCAAO,kBAAY,iBAAiB;MAEpC,sBAAM,QAAQ;;;;QAIZ,kCAAmB,oBAAoB,WAAS;MAClD;;;QAGE,iBAAiB,GAAd,WAAS,MAAC,MAAM,wBAAU;UAC3B,WAAS,MAAC,WAAQ,iBAAiB;QACrC;UACE,WAAS,MAAC,WAAQ,iBAAiB;QACrC;MACF;MACkB;MAElB;oGAEqE;QAEjE,gBAAa,iCAAsB;6KACqB;kGACjB;6CACZ;QAE3B,eAAY,sGAA4C;mGAChB;QAExC,eAAY,oGAA0C;qGACb;QAEzC,iBAAc,2IAEI;mNAK4C;wIAEI;oCAChD;;;;;;;;MAItB;IAEF;EACF","file":"zcl_abapgit_requirement_helper.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sap_namespace.clas.mjs":{"lineLengths":[53,38,33,32,53,64,25,22,17,42,22,3,29,64,16,3,49,99,56,76,110,237,114,18,3,54,99,56,76,110,237,184,18,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/sap/zcl_abapgit_sap_namespace.clas.abap"],"names":[],"mappings":";;AAaA;;;;;;;;;;;;;;EAGE;;;;QACO,qGAAkC;IACvC;IACA,WAAS,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAChC;;EAGA;;;;QACO,qGAAkC;IACvC;IACA,WAAS,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAgB,GAAZ,aAAc,qCAAtC,CAA2C;IACtD;;AACF","file":"zcl_abapgit_sap_namespace.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sap_package.clas.mjs":{"lineLengths":[53,36,31,32,51,62,201,214,17,42,22,103,3,29,102,70,36,16,3,66,121,114,9,118,41,17,22,44,80,77,71,70,87,61,13,16,20,9,7,50,72,84,79,156,14,65,7,42,5,49,1037,72,68,116,1037,88,11,107,43,19,24,46,82,79,73,72,89,15,18,22,11,9,92,17,9,35,61,80,9,170,101,9,13,171,45,21,26,48,88,84,79,82,79,84,85,83,91,79,85,88,83,79,82,76,75,66,17,20,24,13,11,94,69,11,15,53,47,23,28,50,81,88,84,85,83,77,67,19,22,26,15,13,96,286,19,59,51,27,32,54,87,92,85,81,71,23,26,30,19,17,85,15,104,13,63,110,74,123,1043,19,127,51,27,32,54,90,87,81,80,97,23,26,30,19,17,100,75,17,54,90,95,51,61,89,72,82,15,60,1047,63,60,87,87,74,84,15,54,112,21,107,53,29,34,56,92,89,83,82,99,25,28,32,21,19,129,33,17,69,85,23,208,157,215,55,31,36,58,85,88,101,75,27,30,34,23,21,104,64,21,46,19,70,325,76,71,75,53,53,25,206,155,323,57,33,38,60,94,91,89,77,29,32,36,25,23,66,151,49,95,98,29,216,165,256,61,37,42,64,103,95,107,81,33,36,40,29,27,176,99,34,99,27,32,83,25,49,23,72,340,340,259,45,79,42,118,71,61,61,34,61,92,282,33,83,123,118,35,92,31,102,29,74,43,27,78,344,344,77,95,94,157,187,102,29,43,27,76,98,290,50,27,71,79,259,112,222,29,47,27,76,124,261,50,27,73,72,159,29,108,192,29,33,124,65,41,46,68,99,102,104,105,37,40,44,33,31,114,195,31,29,27,92,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/sap/zcl_abapgit_sap_package.clas.abap"],"names":[],"mappings":";;AAoBA;;;;;;;;;;;EAGE;;;IACE,oBAAa,UAAU;IACzB;;EAGA;;QAEQ,yGAAiC;;qHAaH;;;;;;;;;;;;;;;;MAEpC,IACE,OAEA,KAHG,eAAE,MAAC,MAAR;;QAEI,iCAA+B,UAAU,OAAE,wBAAa;;QAGxD,iCAA+B,gCAAqB,GAAd,wCAAiB,qCAAxB,CAA6B;;gEAExB;;MAG1C;;IAGA;;;UAEQ,yDAAsB;UACtB,yGAAiC;UACjC,kgCAA0B;MAGhC,4CAAW,UAAU,MAAC,oBAAmB;;0GAUL;;;;;;;;;;;;;;;QACpC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UAGb;QACF;QAEA,eAAa,UAAU;QAIvB,yBAAG,UAAU,MAAC,SAAkB;UAC9B,UAAU,MAAC,aAAU,uCAAM;QAC7B;QAGA,iBAA0B,GAAvB,UAAU,MAAC,kCAAe,qCAAI,yBAAI,UAAU,MAAC,WAAoB;UAClE,UAAU,MAAC,gBAAY,yDAA8C;QACvE;;0KAgCqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;UACrC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oEACsB;UACtC;;oDAY+B;;;;;;;;;;;;;;;;;YAC/B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;cAEd,6QACsD;;0DAWvB;;;;;;;;;;;;;;;oFAEO;cAExC;uGAEwC;YAE1C;YAGA;;;kBAEQ,wGAAgC;kBAChC,ggCAAyB;;8HAaK;;;;;;;;;;;;;;;gBACpC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0EACsB;gBACtC;gBAEA,QAAQ,MAAC,cAAY,QAAQ;gBAC7B,QAAQ,MAAC,aAAY,SAAS,OAAE,6BAAkB;gBAClD,QAAQ,MAAC,eAAY,SAAS,OAAE,gCAAqB;gBACrD,QAAQ,MAAC,WAAY,QAAQ;gBAC7B,QAAQ,MAAC,cAAY,eAAU;gBAC/B,QAAQ,MAAC,eAAY,SAAS,OAAE,0BAAe;gBAC/C,QAAQ,MAAC,aAAY,eAAE,MAAC,MAAK;iFAEa;cAE5C;cAGA;oBAEQ,kgCAA0B;gBAGhC,UAAU,MAAC,cAAY,eAAU;gBACjC,UAAU,MAAC,WAAY,eAAU;gBACjC,UAAU,MAAC,cAAY,uCAAM;gBAC7B,UAAU,MAAC,aAAY,wCAAO;gBAC9B,UAAU,MAAC,aAAY,eAAE,MAAC,MAAK;mFAEa;cAE9C;cAGA;;;0GAUsC;;;;;;;;;;;;;;;kBACpC,YAAU,gCAAgB,GAAT,eAAE,MAAC,QAAS,gCAAnB,CAAsB;kBAElC;;gBAGA;;;;;;;;;;;;;;;;;;;oBAcE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sBAEd,sBAAM,kBAAkB;oBAC1B;oBAEF;;kBAGA;;wBAGI,mDAA8B;wBAC9B,8CAA+B;wBAC/B,kDAAwB;oBAE1B,gBAAc,eAAU;oBACxB,gBAAc,eAAU;;;;;;;;;;;;;;;;;;sBAgBxB,IACE,OAEA,KAHG,eAAE,MAAC,MAAR;;wBAEI;;wBAGA,iBAAiB,MAAC,aAAU,oCAAG;;;;;;;;;;;;;;;;;;0BAc/B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAY,GAAR,SAAU,qCAAG;4BAE/B,iBAAiB,MAAC,UAAO,oCAAG;0BAC9B;4BAEE,iBAAiB,MAAC,UAAO,oCAAG;0BAC9B;;kFAEoC;;wBAG1C;;sBAGA;;4BAEQ,uTAAwB;wBAE9B;wBAKA,YAAU,OAAO;wBACjB,oBAAuB,GAAjB,yBAAO,WAAY;;;;0BAEvB;;;;;;;;;;;;;8BAKA,gCAAgB,8BAAW,OAAO;4BAEpC;;4BAEF;;0BAGA;;gCAEQ,uTAAsB;gCACtB,4CAA6B;4BAGnC,gCAAO,yBAAc,OAAO;4BAE5B,eAAY,iDAAsC;4BAElD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,yBAAQ,oBAAoB;8BAC1C,aAAU,8IAAwE;8BAClF,gCAAgB,8BAAW,OAAO;4BACpC;4BAEF;;0BAGA;;4BAEE;4BAGF;;0BAGA;;4BAEE;4BAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6NACyF;4BACzG;4BAEF;;0BAGA;;4BACE;4BAGF;;0BAGA;4BAEE,yBAAG,gBAAqB;8JAC0C;4BAClE;4BAEA,iBAAc,GAAX,iBAAa,wCAAM;+LAC6E;4BACnG;;2HAU8B;;;;;;;;;;;;;;8BAC9B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kMAC4D;8BAC5E;4BAEF;0BACF","file":"zcl_abapgit_sap_package.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sap_report.clas.mjs":{"lineLengths":[53,35,30,32,50,61,25,540,943,17,42,22,3,29,64,16,3,36,45,58,597,61,119,70,50,11,193,142,301,43,19,24,46,79,79,85,87,79,83,81,81,86,64,15,18,22,11,9,92,67,9,7,5,39,121,104,72,121,72,99,177,61,14,61,7,24,5,55,99,63,109,84,112,121,72,599,63,109,65,149,159,7,5,55,99,63,127,66,62,66,55,84,57,90,104,72,121,72,599,63,121,62,96,109,106,133,43,57,100,57,59,57,14,57,7,90,160,7,5,53,370,99,63,62,66,599,63,96,107,43,63,14,79,7,90,158,7,23,5,55,105,99,63,127,66,62,66,55,84,57,90,104,72,121,72,599,63,262,262,28,86,44,256,47,14,48,7,24,5,3,66,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/sap/zcl_abapgit_sap_report.clas.abap"],"names":[],"mappings":";;AA+BA;;;;;;;;;;;;;;;EAGE;;;;;;;IAEE,yBAAG,kBAAsB;;;;;;;;;;;;;;;;;;;;;;;;QAqBvB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;MACF;IAEF;IAGA;;;;;;MAEE,oCAAkB,GAAX,YAAc,wCAAM;MAM3B,iBAAqE,IAAlE,4HAAoE,uBAAS;QAC9E,eAAa,oCAAG;MAClB;QACE,eAAa,oCAAG;MAClB;MAEF;;IAGA;;;;;;;;;;4GAIuB;;MAIrB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAmB,GAAf,gBAAiB,uBAAS;8JACsB;MACrE;IAEF;IAGA;;;;;;;;;;;;;;;;;UAEO,8GAAyE;UACzE,mDAA8B;MAEnC,oCAAgB,GAAT,UAAY,uCAAK;MACxB,oCAAuB,GAAhB,iBAAmB,6CAAW;MAErC,gBAAa,kFAEc;oIAKA;MAG3B,yBAAG,SAAmB;;MAGtB,gCAAO,gBAA2B,yBAAI,kBAA4B;;MAIlE,gCAAO,kBAA4B;;MAKnC;;MAMA;MAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+JACsD;MACtE;IAEF;IAGA;;;;;;;;MAEE,oCAAgB,GAAT,UAAY,uCAAK;0GAIH;MAErB,yBAAG,SAAmB;mCACR;MACd;mCACc;MACd;MAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;6JACoD;MACpE;MAEF;;IAGA;;;;;;;;;;;;;;;;;;UAEO,2PAAwB;UACxB,2PAAwB;MAE7B,WAAS,SAAS;MAClB,YAAS,kEAA6C;MAEtD,iBAAU,GAAP,QAAU,OAAM;+PASe;QAEhC,eAAa,sBAAS;MACxB;QACE,eAAa,uBAAU;MACzB;MAEF;;EACF","file":"zcl_abapgit_sap_report.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_serialize.clas.mjs":{"lineLengths":[53,34,29,32,49,37,168,1493,140,197,181,217,1245,811,1180,1649,1690,1513,1780,830,691,2665,321,921,1059,1441,140,2814,2850,17,42,22,63,1417,64,121,105,141,1169,734,3,26,102,70,1416,61,514,1224,92,56,51,48,5,3,25,144,82,1416,61,889,508,1226,47,13,5,81,67,29,53,44,236,138,5,165,67,29,53,44,236,5,3,32,1416,61,1224,49,76,3,28,102,70,120,58,814,67,1416,61,135,101,1416,813,326,88,76,125,134,78,3,30,67,61,1578,76,540,1226,83,36,58,48,55,60,5,3,29,140,82,1168,91,131,138,262,80,5,79,44,50,157,16,3,38,62,3,45,733,132,58,114,103,49,87,71,73,250,5,67,74,5,26,3,38,66,112,97,120,71,54,24,5,97,59,24,5,9,186,135,143,41,17,22,44,79,61,13,16,20,9,7,90,82,14,13,190,139,163,45,21,26,48,83,79,92,93,87,95,65,17,20,24,13,11,94,86,11,9,101,143,9,119,102,85,9,61,26,7,32,1420,106,74,124,62,818,71,148,86,57,75,82,115,24,7,43,106,74,817,65,318,550,147,601,71,75,631,350,129,17,9,93,71,41,50,64,66,76,163,18,81,11,159,149,21,11,73,44,93,96,33,69,94,75,78,77,127,18,71,135,11,59,9,53,17,9,112,79,49,99,249,18,264,11,9,7,47,817,65,322,285,554,631,354,93,71,41,54,139,98,32,71,94,21,11,77,48,93,96,33,69,94,79,82,81,139,18,75,143,11,59,9,57,17,9,112,58,85,55,105,277,20,282,13,11,9,7,35,48,59,75,71,56,1582,123,92,60,58,83,20,327,13,11,16,53,112,83,9,91,7,33,599,68,105,65,55,55,67,95,63,26,22,55,146,15,513,47,23,28,50,81,88,83,67,19,22,26,15,13,96,40,146,23,103,184,13,18,11,56,95,9,37,601,70,136,1584,76,78,78,80,15,223,97,23,112,30,64,124,15,20,22,13,11,9,32,1422,108,76,819,70,126,64,118,103,126,68,70,141,129,128,819,633,47,101,35,34,33,70,90,60,107,174,73,43,256,75,66,20,161,172,13,11,61,143,38,47,79,131,90,26,9,7,68,90,338,573,123,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_serialize.clas.abap"],"names":[],"mappings":";;AAmIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;QAEO,yfAAuD;IAE5D,IAAc,WAA+B;IAG7C,mBAAgB,mEAA+C;IAC/D,yBAAG,wBAA4B;;MAE7B,WAAS,MAAC,UAAO,aAAa;IAChC;EAEF;EAGA;;;;;QAEO,g3BAAsD;QACtD,mfAA6B;IAElC,IAAc,aAAiC;IAE/C,yBAAG,eAAyB;MAC1B;IACF;IAEA,cAAW,6DAA0B;;;;MAGnC,aAAW,MAAC,UAAO,OAAO;2OASU;MAEpC,aAAW,MAAC,KAAI,MAAC,cAAW,wCAAyB,mCAAW,MAAC,KAAI;IACvE;IAEA,cAAW,iJAAwE;;;;MAGjF,aAAW,MAAC,UAAO,OAAO;2OASU;IACtC;EAEF;EAGA;;;IAEE,IAAe,WAA+B;;IAG9C,WAAS,MAAC,WAAO,0CAA0B;EAE7C;EAGA;;;;;;;;;QAEQ,8HAA6C;QAC7C,4FAAwB;QACxB,+3CAAuB;QACvB,oyBAAmD;IAEzD,cAAW,kTAKuB;;2EAKgB;IAKlD,aAAW,gCAAyB,GAAlB,yBAAO,YAAa,iCAA3B,CAA+B;IAE1C,cAAW,kHAIuB;IAClC,gCAAgB,+BAAY,QAAQ;EAEtC;EAGA;;;;;IAEE,IAAe,WAA2C;IAA1D,IACe,aAAiC;;;;MAK9C,aAAW,MAAC,UAAO,WAAS;MAC5B,aAAW,MAAC,KAAI,MAAC,UAAO,OAAO;MAC/B,aAAW,MAAC,UAAO,YAAY,MAAC,KAAI;IACtC;EAEF;EAGA;;;;;QAEO,0HAA4C;IAEjD,iBAAc,mHAAqD;IAEnE,iBAAyD,IAAtD,gHAAwD,uBACvD,iBAA8C,IAA3C,uDAA6C,uBAAS;MAC3D,yCAAiB,+BAAC;IACpB;IAEA,kBAAW,uDAAqB;IAEhC,wBAAiB,cAAc;IAC/B,2BAAoB,iBAAiB;IAErC,yBAAiB,8HAE+C;IAElE;;EAGA;;;;;;;;;IAIE,yBAAG,iBAAe;MAChB,cAAc,MAAC,oBAAwB,uCAA4B;MACnE,cAAc,MAAC,cAAwB,6BAAkB;MACzD,cAAc,MAAC,wBAAwB,qBAAqB;MAC5D,cAAc,MAAC,4BAAwB,kMAEc;IACvD;IAEA,yBAAG,cAAc,MAAC,eAAwB;MACxC,cAAc,MAAC,mBAAgB,eAAE,MAAC,MAAK;IACzC;IAEF;;EAGA;;;;;IAEE,iBAAuB,GAApB,qBAAsB,uBAAS;MAChC,eAAa,+BAAC;MACd;IACF;IAEA,iBAAkB,GAAf,sCAAkB,gCAAC;MAGpB,eAAa,oCAAc;MAC3B;IACF;;;;;;;;;;;;;;;;MAQA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,yCAAiB,+BAAC;MACpB;;;;;;;;;;;;;;;;;;;;;UAeE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;YAGd,yCAAiB,+BAAC;UACpB;QACF;QAEA,iBAAkB,GAAf,sCAAiB,gCAAC;UACnB,yCAAgC,qBAAf,qCAAiB,gCAAC;QACrC;QAEA,oCAAsB,GAAf,sCAAkB,gCAAC;QAE1B,iBAAkB,GAAf,sCAAiB,iCAAE;UAEpB,yCAAiB,gCAAE;QACrB;QAEA,eAAa,oCAAc;QAE7B;;MAGA;;;;;;;;;;wDAIiD;0EAMpB;iFAMI;kHAQJ;QAE7B;;MAGA;;;;;YAGI,iTAA0C;YAC1C,yhBAA6C;YAC7C,sIAAqD;YACrD,4kBAAsD;YACtD,0DAA4B;YAC5B,8DAA4B;QAE9B,IACE,YAAwC;QAD1C,IAEE,oBAA4C;QAG9C,yBAAG,oBAA0B,yBAAG,WAAsB,yBAAG,YAAiB;UACxE;QACF;QAEA,qBAAkB,8DAAyC;;;UAGzD,sBAAO,gBAAgB;UAEvB,OAAO,MAAC,cAAW,YAAU,MAAC,OAAM;UACpC,OAAO,MAAC,cAAW,YAAU,MAAC,SAAQ;UAEtC,yBAAG,YAAU,MAAC,oBAAuB;YACnC,aAAU,wIAG0B;UACtC;YACE,aAAU,sDAAsC;UAClD;UAEA,iBAAc,kIAEI;UAElB,iBAE8B,IAF3B,2FAE6B,wBAAU;YACxC;UACF;UAEA;;;;;mEAAoG;UACpG,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;YACd,gBAAgB,MAAC,cAAW,YAAU,MAAC,OAAM;YAC7C,gBAAgB,MAAC,WAAW,+BAAC;YAC7B,gBAAgB,MAAC,cAAW,YAAU,MAAC,SAAQ;YAC/C,gHAAgF;UAClF;YACE,sBAAO,oBAAkB,MAAC,SAAQ;YAClC,oBAAkB,MAAC,WAAiC,mBAAzB,oBAAkB,MAAC,OAAQ,gCAAC;UACzD;UAEA,sBAAM,YAAU,MAAC,OAAM;QACzB;QACA,yBAAG,iBAA2B;UAC5B;QACF;;;;UAME,iBAA4B,GAAzB,oBAAkB,MAAC,QAAQ,gCAAC;wPAE0C;UACzE;uQAE8E;UAC9E;QACF;MAEF;MAGA;;;YAEQ,qTAA8C;YAC9C,gRAA0D;YAC1D,6hBAAiD;QAEvD,IAAe,YAA4C;QAA3D,IACe,wBAAgD;QAE/D,wBAAqB,2DAAsC;;;UAEzD,sBAAO,oBAAoB;UAC3B;;;qEAA4F;UAC5F,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb;UACF;UAEA;;;;;mEAC2E;UAC3E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;YACd,oBAAoB,MAAC,cAAW,YAAU,MAAC,OAAM;YACjD,oBAAoB,MAAC,WAAW,+BAAC;YACjC,oBAAoB,MAAC,cAAW,YAAU,MAAC,SAAQ;YACnD,4HAA4F;UAC9F;YACE,sBAAO,wBAAsB,MAAC,SAAQ;YACtC,wBAAsB,MAAC,WAAqC,mBAA7B,wBAAsB,MAAC,OAAQ,gCAAC;UACjE;UACA,sBAAO,YAAU,MAAC,OAAM;QAC1B;QACA,yBAAG,qBAA+B;UAChC;QACF;;QAGA,yBAAG,sBAAe;;;YAEd,iBAAgC,GAA7B,wBAAsB,MAAC,QAAQ,gCAAC;oRAEwC;YAC3E;yRAEgF;YAChF;UACF;QACF;MAEF;MAGA;;;YAIQ,8DAAyB;YACzB,0DAAwB;YACxB,2CAA8B;YAC9B,iiDAAuD;;QAY7D,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;UACd,yBAAO,sBAAiB;YACtB,yBAAO,kBAAkB;kFACK;YAC9B;sUACyE;YACzE;UACF;QACF;;UAEE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;kFAEoB;QACzC;QAEA,iBAAkB,mBAAR,aAAU,gCAAC;MAEvB;MAGA;;;;;YAEQ,0CAAyB;YACzB,0CAAwB;YACxB,sDAAoB;QAG1B,oCAAe,GAAR,cAAU,gCAAC;;;;;UAGhB,sIAAoC;;;;;;;;;;;;;;;;YAmBpC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACb,YAAU,YAAO;cACjB;cACA;YACF,wBAAgB,GAAT,eAAE,MAAC,QAAS,gCAAC;cAClB,oCAAc,GAAP,QAAS,oCAAG,iBAAM,GAAF,iCAAI,gCAAC;YAC9B;YACA;UACF;;UAEA,iBAAkB,qBAAR,aAAU,gCAAC;QAEvB;QAGA;;;cAEQ,yHAA8C;cAC9C,iiDAAuD;UAG7D,YAAY,MAAC,KAAI,MAAC,cAAY,QAAQ,MAAC,OAAM;UAC7C,YAAY,MAAC,KAAI,MAAC,cAAY,QAAQ,MAAC,SAAQ;UAC/C,YAAY,MAAC,KAAI,MAAC,cAAY,QAAQ,MAAC,SAAQ;UAC/C,YAAY,MAAC,KAAI,MAAC,eAAY,QAAQ,MAAC,UAAS;UAEhD;YACI,kBAAe,+LAEgE;gGAGlC;;;;;;;;;;UAOjD;QAEF;QAGA;;;;;;;;;;;cAIQ,qDAAkB;cAClB,uDAAkB;cAClB,8HAA4C;cAC5C,kHAAwC;cACxC,iHAAyC;cACzC,oyBAAqD;UAE3D,IAAe,YAAgC;UAG/C,sBAAM,aAAQ;UAEd,YAAS,6EAA4C;UACrD,iBAAU,MAAM;UAChB,gBAAS,MAAM;UAEf,aAAW,QAAQ;qEACuC;yFAM/B;UAE3B,aAAW,yBAAO,UAAU;UAE5B,iBAAc,8EAA8C;UAE5D,cAAW,oJAEsB;;;+PAMyC;YAExE,iBAAU,GAAP,QAAS,gCAAC;iEACiB;YAC9B;gKAG+B;cAC7B;YACF;UACF;4DAEmB;UAEnB;UACA,aAAW,aAAQ;UACnB,sBAAK,aAAQ;UAGb,aAAU,sDAAiC;kIAOhB;yFAED;UAE5B;;MACF","file":"zcl_abapgit_serialize.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_abapgit.clas.mjs":{"lineLengths":[53,41,36,32,56,37,172,155,155,155,188,154,229,204,56,167,170,170,65,66,149,63,158,17,42,22,70,78,78,78,72,74,3,29,64,16,3,24,55,3,31,79,33,94,1326,151,97,95,86,13,5,188,13,5,717,58,69,109,5,3,29,60,3,36,58,51,34,238,247,97,82,25,5,20,3,32,63,3,39,102,597,79,387,81,105,227,72,99,123,24,5,9,105,91,108,205,153,220,167,104,141,108,204,67,110,113,29,86,90,49,49,207,155,229,176,123,7,17,78,14,16,7,5,22,3,24,55,3,31,55,277,23,3,34,65,3,41,222,3,38,69,3,45,67,61,189,3,38,69,3,45,67,61,189,3,33,64,3,40,94,3,36,67,3,43,66,58,130,9,150,17,106,24,170,14,16,7,5,3,31,62,3,38,106,102,106,30,207,168,5,134,132,60,54,55,148,60,55,71,64,75,5,3,44,75,3,51,102,70,119,536,357,329,140,344,155,139,106,110,13,5,70,73,43,78,96,75,44,54,80,5,124,71,36,100,57,14,7,5,50,185,5,3,1,76,95,86,99,79,99,80,99,75,132,74,97,78,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/routing/zcl_abapgit_services_abapgit.clas.abap"],"names":[],"mappings":";;AA8DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;QAGI,sEAAyC,CAAA;;QAGzC,qFAA8B;QAC9B,qyCAAoE;QACpE,8IAAwD;IAE1D,yBAAsB,kEAA6C;IAEnE,iBAAc,wEAAoC;IAElD,iBAAgC,GAA7B,WAAW,MAAC,mBAAmB,uBAAS;MACzC;IACF;IAEA,iBAA2E,IAAxE,wIAA0E,wBAAU;MACrF;IACF;IAEA,eAAY,wrBAO2C;IAEvD,iBAAa,GAAV,WAAY,oBAAmB;MAChC,WAAW,MAAC,sBAAmB,sBAAS;4GACQ;IAClD;EAEF;EAGA;;;;;QACa,0CAAqC,CAAA;;QAC1C,qOAAsC;IAE5C;IAMA,iBAAsB,GAAnB,yBAAO,aAAc,gCAAC;MACvB;uBAA0C;IAC5C;IACF;;EAGA;;;;;QAEQ,4kBAAgD;QAChD,sEAA2B;QAC3B,0XAAyB;IAG/B,IAAe,cAAwB;IAAvC,IACe,iBAA2B;IAD1C,IAEe,YAAsC;IAErD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,kEAAgC;IAEnD,iBAA0C,IAAvC,uEAAyC,wBAAU;MAEpD;IACF;IAEA;;MAGI,kFAAoC;MACpC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;;;;MAMnB,oIAEyB;MACzB,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MAEnB,eAAY,qLAAqF;MAEjG;;;;oFACqD;MACrD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,eAAa,YAAU,MAAC,MAAK;QAI7B,sBAAM,iBAAe;;;;;;MAKvB;;;;;;IAKJ;IAEF;;EAGA;;;;;IAEE;IAKF;;EAGA;;;;6NACiE;EACjE;EAGA;;;;;;4LAC6D;EAC7D;EAGA;;;;;;4LAC6D;EAC7D;EAGA;;;;6FAC2C;EAC3C;EAGA;;;;;;QACO,yHAA0C;IAE/C;qJACqF;;;;;;;;IAIrF;EACF;EAGA;;;;QAEQ,iGAAqD;QACrD,6FAA4B;QAC5B,iGAA4B;6BAEnB;IAEf,iBAAmF,IAAhF,2JAAkF,wBAAU;uKAE3B;IACpE;iCAQiB,wCAAyB,gDAA8B;iCACvD,wCAAyB,+CAA8B;IACxE,oBAAiB,kCAAuB;IAExC,yBAAG,sBAA0B;;mJAGgD;IAE7E,gCAAO,qBAAyB;;sEAGW;IAE3C,gCAAO,yBAA6B;0EAEW;IAE/C;EAEF;EAGA;;;;;;QAEQ,8GAA6C;QAC7C,+gBAAuC;QACvC,4VAA0C;QAC1C,gUAA6D;QAC7D,mIAAoD;QACpD,+UAAwD;IAE9D,IAAe,WAAiE;IAAhF,IACe,mBAA+C;IAE9D,gBAAa,oFAAkD;IAE/D,iBAAyB,IAAtB,0DAAwB,wBAAU;MACnC;IACF;IAEA,YAAY,MAAC,UAAS,oCAAG;IACzB,YAAY,MAAC,YAAS,qCAAI;IAC1B,YAAY,MAAC,SAAS,UAAU;IAChC,uEAA2C;IAI3C,sBAAmB,oEAAiC;;;MAElD,YAAY,MAAC,SAAM,mBAAiB;MACpC,uEAA2C;IAC7C;IAEA,kBAAe,oGAA8C;;;MAI3D,qBAAG,yDAA6B,aAAY;mCAC1C,SAAW,WAAS;QACpB;MACF;IAEF;IAEA,yBAAG,kBAAgB;wLACkE;IACrF;EAEF;AACF","file":"zcl_abapgit_services_abapgit.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_basis.clas.mjs":{"lineLengths":[53,39,34,32,54,37,25,184,348,61,17,42,22,3,29,64,16,3,31,60,3,38,102,110,94,1040,102,128,89,92,78,126,61,186,53,31,5,22,3,28,57,3,35,79,76,158,97,137,140,5,128,45,121,107,3,46,75,3,53,55,73,44,13,5,185,162,5,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/routing/zcl_abapgit_services_basis.clas.abap"],"names":[],"mappings":";;AA4BA;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEO,ugCAA+B;QAC/B,6FAA8B;QAC9B,uHAA8C;IAEnD,eAAe,MAAC,cAAW,4BAAU,oBAAoB;2FAEA;IAEzD,cAAW,0DAAqC;6HAKf;IAEjC,iBAAa,GAAV,WAAY,uBAAS;yLACqE;MAC3F,eAAa,eAAe,MAAC,SAAQ;MACrC;IACF;IAEF;;EAGA;;;;QACQ,sEAA+B;QAC/B,mEAA+B;QAC/B,qJAA6D;IAEnE,sBAAmB,qEAAgD;IAEnE,iBAA8C,IAA3C,qFAA6C,wBAAU;2IACkB;IAC5E;+HAE4F;4CAExE;IAEpB,2CAAmB,oBAAuB,oDAAoB;0GACA;EAChE;EAGA;;;;;;IAEE,yBAAG,YAAsB;MACvB;IACF;IAEA,iBAAkE,IAA/D,sIAAiE,uBAAS;iKACH;IAC1E;EAEF;AACF","file":"zcl_abapgit_services_basis.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_git.clas.mjs":{"lineLengths":[53,37,32,32,52,37,25,205,196,196,196,193,193,1305,17,42,22,3,29,64,16,3,23,50,3,30,133,61,881,67,122,64,809,139,85,184,183,63,133,71,134,131,130,63,126,5,78,80,72,74,58,63,226,5,174,99,29,3,30,57,3,37,101,58,67,102,133,66,129,81,158,99,79,153,61,88,108,22,5,82,344,99,3,30,57,3,37,101,58,133,622,66,129,158,79,270,42,88,108,22,5,155,119,99,3,27,54,3,34,101,58,133,1034,67,158,191,39,88,108,22,5,146,114,100,3,21,48,3,28,101,58,119,158,51,88,3,30,57,3,37,101,58,133,622,158,329,42,88,108,22,5,122,49,13,5,110,106,5,102,29,3,27,54,3,34,101,58,133,1034,67,158,191,39,88,108,22,5,167,29,119,100,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/routing/zcl_abapgit_services_git.clas.abap"],"names":[],"mappings":";;AAmDA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;QAEQ,gyBAAuD;QACvD,kIAA+C;IAErD,aAAU,kEAA6C;uLAEkB;sLAED;IAExE,yBAAG,SAAS,MAAC,gBAAyB;oIAC0B;IAChE,gCAAO,SAAS,MAAC,iBAA0B;qIACsB;IACjE,gCAAO,SAAS,MAAC,wBAA4B,yBAAI,SAAS,MAAC,aAAsB;iIACpB;IAC7D,gCAAO,SAAS,MAAC,SAAkB;6HACsB;IACzD;IAEA,UAAU,MAAC,UAAS,MAAC,UAAQ,SAAS,MAAC,eAAc;IACrD,UAAU,MAAC,UAAS,MAAC,WAAQ,SAAS,MAAC,gBAAe;IACtD,UAAU,MAAC,OAAM,MAAC,UAAW,SAAS,MAAC,YAAW;IAClD,UAAU,MAAC,OAAM,MAAC,WAAW,SAAS,MAAC,aAAY;IACnD,UAAU,MAAC,aAAkB,SAAS,MAAC,QAAO;IAE9C,yBAAO,SAAS,MAAC,gBAAe;MAC9B,sCAAY,UAAU,MAAC,UAAQ,qCAAG,SAAS,MAAC,gBACrC,UAAU,MAAC,QAAoD;IACxE;6KAKwB;kGAGc;IAEtC;EAEF;EAGA;;;;;;QAEQ,0DAAiC;QACjC,6FAAoC;QACpC,4HAAyD;QACzD,yDAAiC;QACjC,wHAAoD;QACpD,wEAAiC;+BAGvC,UAAW,mHAAoD;IAC/D,2BAAwB,kEAA+B;IAEvD,eAAY,0DAAqC;wJAMV;IAEvC,iBAAa,GAAV,WAAY,uBAAS;MACtB;;;IACF;iFAEiC;IAEjC,kVAC+E;IAC/E,4FAAuB;EAEzB;EAGA;;;;;;QAEQ,4HAA6C;QAC7C,qmBAAyD;QACzD,yDAAqB;QACrB,wHAAwC;+BAG9C,UAAW,mHAAoD;IAE/D,eAAY,0DAAqC;IACjD,eAAY,yPAE0D;IACtE,yBAAG,UAAoB;MACrB;;;IACF;0JAIyB;IAEzB,iHAAoD;IACpD,4FAAuB;EAEzB;EAGA;;;;;;QAEQ,4HAA2C;QAC3C,igCAAoD;QACpD,0DAAmB;+BAEzB,UAAW,mHAAoD;IAE/D,YAAS,6KAA4E;IACrF,yBAAG,OAAiB;MAClB;;;IACF;iJAImB;IAEnB,4GAA+C;IAE/C,6FAAwB;EAE1B;EAGA;;;;;;QAEQ,8GAAoC;+BAE1C,UAAW,mHAAoD;kDAE5C;uFAEkC;EAEvD;EAGA;;;;;;QAEQ,4HAA6C;QAC7C,qmBAAyD;+BAG/D,UAAW,mHAAoD;IAE/D,eAAY,oTAGsB;IAClC,yBAAG,UAAoB;MACrB;;;IACF;IAEA,iBAAkB,GAAf,SAAS,MAAC,OAAO,mCAAoB,sCAAkB;gDACjC;MACvB;IACF;IAEA,0BAAG,6EAA8C;yGAChB;IACjC;qGAEwC;IACxC;EAEF;EAGA;;;;;;QAEQ,4HAA2C;QAC3C,igCAAoD;QACpD,0DAAmB;+BAEzB,UAAW,mHAAoD;IAE/D,YAAS,6KAA4E;IACrF,yBAAG,OAAiB;MAClB;;;IACF;sKAEyE;IAEzE;IAEA,iHAAoD;IAEpD,6FAAwB;EAE1B;AACF","file":"zcl_abapgit_services_git.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_repo.clas.mjs":{"lineLengths":[53,38,33,32,53,37,25,5012,4823,1503,1511,1048,1218,190,189,348,1221,206,198,213,216,360,17,42,22,3,29,64,16,3,33,61,3,40,120,101,58,119,148,2303,64,70,2107,158,113,102,117,65,204,36,139,81,5,69,156,20,5,117,118,147,121,105,5,89,18,3,30,58,3,37,953,82,123,135,69,81,211,50,78,5,3,43,71,3,50,119,61,120,58,4567,67,688,595,813,1117,556,41,72,65,67,67,72,5,96,63,115,91,5,3,32,60,3,39,119,61,66,4567,120,79,58,188,5,9,75,17,100,15,14,16,7,5,110,100,93,144,251,101,5,3,28,56,3,35,135,953,82,63,374,104,39,91,183,29,19,3,27,55,3,34,133,953,82,63,531,104,39,91,183,29,19,3,32,60,3,39,119,61,4567,64,1405,586,1489,1117,1116,47,70,101,104,27,77,225,112,12,328,42,114,7,5,60,88,136,130,114,125,5,136,126,89,5,159,229,5,84,41,77,35,159,172,29,115,108,74,5,3,32,60,3,39,1406,73,746,1405,129,290,1117,559,100,13,5,53,78,53,78,53,78,53,75,75,68,53,74,76,62,68,53,74,82,297,41,102,5,79,514,71,41,77,27,159,172,29,115,90,115,14,114,7,5,3,40,68,3,47,1406,73,746,1405,129,1117,559,100,13,5,53,78,53,78,53,78,53,75,75,68,53,74,76,62,68,53,74,82,79,429,71,41,77,27,159,172,29,115,90,115,14,114,7,5,3,22,50,3,29,120,101,58,813,52,119,102,56,688,72,70,158,72,73,137,96,245,587,77,90,111,24,7,5,57,92,229,5,159,29,189,78,20,5,182,103,18,3,24,52,3,31,101,58,160,3,40,68,3,47,101,58,52,71,119,219,119,5,158,111,104,611,5,579,75,88,109,22,5,104,39,29,3,23,51,3,30,101,58,52,123,102,56,72,70,134,72,73,195,585,75,88,109,22,5,124,29,191,103,3,32,60,3,39,101,58,148,3,36,64,3,43,112,91,139,162,86,825,366,217,119,5,175,152,175,53,142,5,201,108,170,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/routing/zcl_abapgit_services_repo.clas.abap"],"names":[],"mappings":";;AAsGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAGI,8GAA0C;QAC1C,2IAAuD;QACvD,svEAA2D;QAC3D,uDAAoB;QACpB,6DAAyB;IAE3B,IAAc,WAAoC;+BAElD,UAAW,mHAAoD;;IAM/D,mBAAgB,6EAAuB;IAEvC,YAAS,mGAA2C;gEAGZ;;;0IAKN;MAChC,aAAoB,mBAAT,SAAW,gCAAC;IACzB;IAEA,iBAAY,GAAT,UAAW,gCAAC;MACb,mJAA4C;MAC5C;IACF;oHAKoB;qHAIA;IAEpB,iBAAyB,IAAtB,kDAAyB,gCAAiB,wBAAQ,MAAC,OAAK;MACzD,iHAA0D;MAC1D,gGAA2B;IAC7B;wFAE4C;IAE9C;;EAGA;;;;;;QAGI,kHAAwC;QACxC,8HAA4C;QAC5C,4DAAuB;IAIzB,iBAAc,0DAAqC;kNAOvB;IAE5B,yBAAG,kBAAgB;6EACwB;IAC3C;EAEF;EAGA;;;;;;;;;;QAGI,uqBAAwD;QACxD,0kBAAgD;QAChD,oyBAAmD;IAErD,IAAc,gBAA+C;;;MAQ3D,QAAQ,MAAC,WAAW,uCAAM;MAC1B,QAAQ,MAAC,YAAW,gBAAc,MAAC,SAAQ;MAC3C,QAAQ,MAAC,cAAW,gBAAc,MAAC,SAAQ;MAC3C,QAAQ,MAAC,cAAW,gBAAc,MAAC,SAAQ;MAC3C,+DAAmC;IAErC;IAKA,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;MACtB,SAAS,MAAC,eAAY,SAAS,MAAC,UAAS;kHAIQ;0FAEL;IAC9C;EAEF;EAGA;;;;;;QAGI,yDAAqB;QACrB,88IAA6D;QAC7D,+GAAqC;IAGvC,eAAY,0DAA8B;IAE1C,yBAAG,SAAS,MAAC,WAAoB;2LAE0D;IAC3F;IAGA;0EAK+B;;;;;;;IAI/B;IAEA,YAAS,4FAAqC;mGAMxB;4FAKA;IAEtB,iBAAyB,IAAtB,kDAAwB,gCAAiB,wBAAQ,MAAC,IAAE;MACrD,mPAA0G;MAC1G,4FAAuB;IACzB;EAEF;EAGA;;;;;;;8DAEiC;+BAG/B,UAAW,2UAK0C;uGAGH;sCAC1B;0FAEc;sLAG6C;IAEnF;IAGF;;EAGA;;;;;;;8DAEiC;+BAE/B,UAAW,weAQ0C;uGAGH;sCAC1B;0FAEc;sLAG6C;IAEnF;IAEF;;EAGA;;;;;;;;QAGI,o3CAA6D;QAC7D,ikBAA+D;QAC/D,w8CAAmE;IAErE,IACE,gBAA+C;IADjD,IAEE,eAAuC;IAEzC,gBAAc,SAAS,MAAC,UAAS;IAGjC;;;;2EAAyE;IACzE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAyB,GAArB,eAAa,MAAC,SAAS,oCAAqB,wCAAoB,MAAC,KAAG;MACtF,eAAa,MAAC,cAAW,wCAAyB,6BAAK;IACzD;;;QAGI,eAAa,MAAC,cAAW,wCAAyB,6BAAK;MACzD;IACF;2DAGsD;uFACsB;IAE5E,iBAA8B,GAA3B,SAAS,MAAC,aAAY,MAAC,MAAM,wCAAyB,6BAAI;MAC3D,sBAAkB,wFAAyC,YAAY;iHACF;MACrE,SAAS,MAAC,aAAY,MAAC,cAAW,wCAAyB,6BAAK;IAClE;IAEA,iBAA8B,GAA3B,SAAS,MAAC,aAAY,MAAC,MAAM,wCAAyB,6BAAI;MAC3D,sBAAkB,oFAAsD,YAAY;wFACrB;IACjE;IAEA,iBAAiC,GAA7B,SAAS,MAAC,UAAS,MAAC,WAAW,uBACnC,yBAAI,SAAS,MAAC,UAAS,MAAC,WAAoB;MAC1C,SAAS,MAAC,UAAS,MAAC,gBAAY,8KACgB;IAClD;;;MAIE;;;;;iHAEoC;MACpC,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,gBAAc,MAAC,cAAW,eAAa,MAAC,SAAQ;IAClD;EAEF;EAGA;;;;;;QAEQ,iuBAAqD;QACrD,o3CAA6B;QAC7B,wHAA0C;QAC3C,yRAAoD;IAEzD,IAAe,gBAAwC;IAAvD,IACe,aAAqD;IAGpE,iBAAyB,GAAtB,yBAAO,gBAAiB,gCAAC;MAC1B;IACF;;IAGA,aAAW,MAAC,UAAO,2CAAU;;IAE7B,aAAW,MAAC,UAAO,2CAAU;;IAE7B,aAAW,MAAC,UAAO,2CAAU;;IAE7B,aAAW,MAAC,UAAO,wCAAO;IAC1B,aAAW,MAAC,UAAO,wCAAO;IAC1B,aAAW,MAAC,YAAS,+BAAC;;IAEtB,aAAW,MAAC,UAAO,uCAAM;IACzB,aAAW,MAAC,UAAO,yCAAQ;IAC3B,aAAW,MAAC,eAAY,sBAAS;IACjC,aAAW,MAAC,YAAS,+BAAC;;IAEtB,aAAW,MAAC,UAAO,uCAAM;IACzB,aAAW,MAAC,UAAO,+CAAa;;;MAG9B,6FAA8C;IAChD;IAEA,eAAY,0DAAqC;igBAUR;;;MAGvC;;;;;iHAG6C;MAC7C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,gBAAc,MAAC,cAAW,wCAAyB,6BAAK;MAC1D;QACE,gBAAc,MAAC,cAAW,wCAAyB,4BAAI;MACzD;IACF;EAEF;EAGA;;;;;;QAEQ,iuBAAqD;QACrD,o3CAA6B;QAC7B,wHAA0C;IAEhD,IAAe,gBAAwC;IAAvD,IACe,aAAqD;IAEpE,iBAAyB,GAAtB,yBAAO,gBAAiB,gCAAC;MAC1B;IACF;;IAGA,aAAW,MAAC,UAAO,2CAAU;;IAE7B,aAAW,MAAC,UAAO,2CAAU;;IAE7B,aAAW,MAAC,UAAO,2CAAU;;IAE7B,aAAW,MAAC,UAAO,wCAAO;IAC1B,aAAW,MAAC,UAAO,wCAAO;IAC1B,aAAW,MAAC,YAAS,+BAAC;;IAEtB,aAAW,MAAC,UAAO,uCAAM;IACzB,aAAW,MAAC,UAAO,yCAAQ;IAC3B,aAAW,MAAC,eAAY,sBAAS;IACjC,aAAW,MAAC,YAAS,+BAAC;;IAEtB,aAAW,MAAC,UAAO,uCAAM;IACzB,aAAW,MAAC,UAAO,+CAAa;IAEhC,eAAY,0DAAqC;4aASR;;;MAIvC;;;;;iHAG6C;MAC7C,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,gBAAc,MAAC,cAAW,wCAAyB,6BAAK;MAC1D;QACE,gBAAc,MAAC,cAAW,wCAAyB,4BAAI;MACzD;IAEF;EAEF;EAGA;;;;;;;QAEQ,oyBAAsD;QACtD,2CAA4B;QAC5B,8GAAyC;QACzC,6FAA0B;QAC1B,+CAA8B;QAC9B,uqBAA2D;QAC3D,+DAAwB;QACxB,6DAAwB;+BAG9B,UAAW,mHAAoD;IAC/D,kBAAe,gDAAoB;IAEnC,gBAAa,mDAAuB;IACpC,cAAa,qHAAqD;IAElE,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;MAEtB,6OAC0E;MAE1E,eAAY,ojBAQ6B;MAEzC,iBAAa,GAAV,WAAY,qCAAG;QAChB;;;MACF;IAEF;IAEA,eAAY,oCAAyB;IACrC,iBAAgC,GAA7B,SAAS,MAAC,UAAS,MAAC,WAAW,uBAAS;MACzC,SAAS,MAAC,UAAS,MAAC,gBAAY,8KACwD;IAC1F;IAEA,YAAS,6IAEgB;IAEzB;IAEA,yBAAG,iBAAgB,iBAA0B,IAAtB,kDAAwB,gCAAiB,wBAAQ,MAAC,OAAK;6EAClC;MAC1C;IACF;IAEA,gLAAiG;IACjG,gGAA2B;IAE7B;;EAGA;;;;;;+JAEkE;EAElE;EAGA;;;;;;QAEQ,2CAAkB;QAClB,8DAAuB;QACvB,8GAAwC;IAG9C,iBAA2F,IAAxF,uKAA0F,wBAAU;sHACrD;IAClD;+BAEA,UAAW,mHAAoD;IAE/D,gBAAc,yFAAuD;IAErE,iBAA0B,IAAvB,oDAAyB,wBAAU;MACpC,sCAAc,kCACD,6GACA,qHACA,+GACA,wGACA,0FAAmD;IAClE;IAEA,eAAY,8iBAQ6B;IAEzC,iBAAa,GAAV,WAAY,qCAAG;MAChB;;;IACF;uGAEkD;sCAC1B;IAExB;EAEF;EAGA;;;;;;QAEQ,2CAA4B;QAC5B,kHAAyC;QACzC,6FAA0B;QAC1B,+CAA8B;QAC9B,+DAAwB;QACxB,6DAAwB;IAG9B,aAAe,mHAAoD;IACnE,kBAAe,gDAAoB;IACnC,gBAAe,mDAAuB;IACtC,6LACmD;IAEnD,eAAY,ojBAQ6B;IAEzC,iBAAa,GAAV,WAAY,qCAAG;MAChB;;;IACF;2HAEwD;IAExD;IAEA,yLAA0G;IAC1G,gGAA2B;EAE7B;EAGA;;;;;;mJAE0E;EAE1E;EAGA;;;;;;QAGI,kIAA0D;QAC1D,yJAAiE;QACjE,6EAAiD;QACjD,gzBAAgE;QAChE,qWAA2E;IAG7E,iBAAyF,IAAtF,qKAAwF,wBAAU;sHACnD;IAClD;+BAEA,gBAAiB,8HAA+D;IAEhF,0BAAuB,wHAAoE;IAE3F,0BAAuB,+IAEa;IACpC,yBAAG,qBAA+B;6IACuC;IACzE;IAEA,4BAAyB,uKACD;;yKAMyB;EAEnD;AACF","file":"zcl_abapgit_services_repo.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_settings.clas.mjs":{"lineLengths":[53,33,28,32,48,37,1832,1408,163,158,243,404,87,161,163,206,711,167,163,206,711,203,203,206,206,159,159,215,214,175,175,181,181,170,170,214,214,173,1425,173,56,1430,216,216,218,218,175,175,225,225,225,225,361,211,211,212,17,42,22,1735,1332,94,84,62,54,3,29,64,16,3,33,108,71,27,3,32,112,74,31,3,35,65,62,21,3,41,70,67,22,3,40,65,67,21,3,37,107,69,26,3,37,99,164,63,5,18,3,28,127,61,22,3,34,114,78,33,3,29,76,68,28,3,25,64,56,20,3,38,117,85,36,3,36,100,51,19,3,28,613,55,21,3,26,67,51,19,3,25,72,55,24,3,34,99,164,60,5,18,3,28,75,137,87,151,81,27,3,33,113,76,32,3,29,117,110,91,115,77,69,72,58,156,11,190,138,13,101,45,21,26,48,87,65,17,20,24,13,12,94,75,31,11,21,108,75,31,18,20,11,9,42,84,72,16,73,9,7,25,5,31,1328,45,25,5,40,110,87,73,5,40,114,99,76,5,42,67,69,64,5,48,72,72,69,5,47,67,69,69,5,44,109,84,71,5,26,46,78,75,78,78,86,88,112,102,45,85,5,39,89,5,44,101,60,63,5,35,129,72,63,107,90,7,5,41,116,105,80,5,36,78,90,70,5,32,66,66,58,5,45,119,114,87,5,43,102,63,53,5,35,615,69,57,5,33,69,63,53,5,32,68,60,51,5,41,101,60,60,5,40,115,102,78,5,31,119,75,60,429,96,7,5,36,1333,90,50,76,47,7,5,35,77,87,136,112,46,152,5,3,62,101,62,96,57,181,59,59,341,63,57,61,79,1751,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/zcl_abapgit_settings.clas.abap"],"names":[],"mappings":";;AAuLA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;IACE,oBAAkB,qBAAgB,MAAC,kBAAiB;IACtD;;EAGA;;IACE,wBAAsB,qBAAgB,MAAC,iBAAgB;IACzD;;EAGA;;IACE,cAAY,gBAAW,MAAC,oBAAmB;IAC7C;;EAGA;;IACE,eAAa,gBAAW,MAAC,wBAAuB;IAClD;;EAGA;;IACE,cAAY,gBAAW,MAAC,yBAAwB;IAClD;;EAGA;;IACE,mBAAiB,gBAAW,MAAC,sBAAqB;IACpD;;EAGA;;IACE,iBAAyD,IAAtD,gHAAwD,wBAAU;MACnE,WAAS,gBAAW,MAAC,sBAAqB;IAC5C;IACF;;EAGA;;IACE,eAAa,qBAAgB,MAAC,aAAY;IAC5C;;EAGA;;IACE,0BAAwB,qBAAgB,MAAC,mBAAkB;IAC7D;;EAGA;;IACE,qBAAmB,qBAAgB,MAAC,cAAa;IACnD;;EAGA;;IACE,aAAW,qBAAgB,MAAC,UAAS;IACvC;;EAGA;;IACE,6BAA2B,qBAAgB,MAAC,uBAAsB;IACpE;;EAGA;;IACE,YAAU,gBAAW,MAAC,WAAU;IAClC;;EAGA;;IACE,cAAY,gBAAW,MAAC,aAAY;IACtC;;EAGA;;IACE,YAAU,gBAAW,MAAC,WAAU;IAClC;;EAGA;;IACE,iBAAe,gBAAW,MAAC,UAAS;IACtC;;EAGA;;IACE,iBAAyD,IAAtD,gHAAwD,wBAAU;MACnE,WAAS,gBAAW,MAAC,mBAAkB;IACzC;IACF;;EAGA;;QAEQ,gIAA4C;;sJAMX;IAEvC,qBAAkB,sDAAoB;IAExC;;EAGA;;IACE,yBAAuB,qBAAgB,MAAC,kBAAiB;IAC3D;;EAGA;;;;;QACO,oEAA6B;QAC7B,4DAAqB;IAE1B,cAAY,oDAAkB;IAE9B,gBAAc,qBAAgB,MAAC,SAAQ;IAEvC,iBAAe,GAAZ,aAAc,+BAAU,MAAC,iBAAgB,iBAAsB,GAAlB,mBAAoB,uBAAS;MAC3E;;;;;;;;;;;;;;;;UAOI,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;YACd,gBAAc,+BAAU,MAAC,QAAO;YAChC;UACF;;;;;;;;QAIJ;QAEA,IACE,YADG,iBAAL;;UAEI,gBAAc,+BAAU,MAAC,OAAM;;UAE/B,gBAAc,+BAAU,MAAC,QAAO;;MAEtC;MACF;;IAGA;;MACE,gBAAc,qBAAgB;MAChC;;IAGA;;;MACE,qBAAgB,MAAC,uBAAoB,eAAe;IACtD;IAGA;;;MACE,qBAAgB,MAAC,sBAAmB,mBAAmB;IACzD;IAGA;;;MACE,gBAAW,MAAC,yBAAsB,SAAS;IAC7C;IAGA;;;MACE,gBAAW,MAAC,6BAA0B,UAAU;IAClD;IAGA;;;MACE,gBAAW,MAAC,8BAA2B,SAAS;IAClD;IAGA;;;MACE,gBAAW,MAAC,2BAAwB,cAAc;IACpD;IAGA;MAEE,sBAAM,gBAAW;6EAEqB;0EACF;6EACG;6EACnB;qFACc;uFACC;+GAC2B;qGACV;4CACxB;oFACN;IAExB;IAGA;wFAE0B;IAC1B;IAGA;;;MACE,gBAAW,MAAC,2BAAwB,MAAM;IAC5C;IAGA;;;MACE,qBAAgB,MAAC,kBAAe,UAAU;MAC1C,iBAAiC,GAA9B,qBAAgB,MAAC,eAAgB,oCAAc;QAChD,qBAAgB,MAAC,kBAAe,mCAAE;MACpC;IACF;IAGA;;;MACE,qBAAgB,MAAC,wBAAqB,qBAAqB;IAC7D;IAGA;;;MACE,qBAAgB,MAAC,mBAAgB,gBAAgB;IACnD;IAGA;;;MACE,qBAAgB,MAAC,eAAY,QAAQ;IACvC;IAGA;;;MACE,qBAAgB,MAAC,4BAAyB,wBAAwB;IACpE;IAGA;;;MACE,gBAAW,MAAC,gBAAa,OAAO;IAClC;IAGA;;;MACE,gBAAW,MAAC,kBAAe,SAAS;IACtC;IAGA;;;MACE,gBAAW,MAAC,gBAAa,OAAO;IAClC;IAGA;;;MACE,gBAAW,MAAC,eAAY,MAAM;IAChC;IAGA;;;MACE,gBAAW,MAAC,wBAAqB,MAAM;IACzC;IAGA;;;MACE,qBAAgB,MAAC,uBAAoB,oBAAoB;IAC3D;IAGA;;;MACE,qBAAgB,MAAC,cAAW,WAAW;MACvC,iBAA6B,GAA1B,qBAAgB,MAAC,WAAY,+BAAU,MAAC,SACvC,iBAA8B,GAA1B,qBAAgB,MAAC,WAAY,+BAAU,MAAC,MAC5C,iBAA8B,GAA1B,qBAAgB,MAAC,WAAY,+BAAU,MAAC,QAC5C,iBAA8B,GAA1B,qBAAgB,MAAC,WAAY,+BAAU,MAAC,iBAAe;QAC7D,qBAAgB,MAAC,cAAW,+BAAU,MAAC,QAAO;MAChD;IACF;IAGA;;;MACE,0BAAmB,gBAAgB;MAEnC,yBAAG,qBAAgB,MAAC,eAAwB;8CACd;MAC9B;IAEF;IAGA;;;UAEQ,6HAA0C;;MAKhD,sBAAM,gBAAW;uJAMU;IAE7B;EACF","file":"zcl_abapgit_settings.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sotr_handler.clas.mjs":{"lineLengths":[53,37,32,32,52,37,25,729,457,1531,367,1002,382,204,17,42,22,3,29,64,16,3,28,55,3,35,102,70,132,58,431,286,120,128,107,3,38,65,3,45,102,70,431,61,286,73,67,62,62,66,245,66,36,11,196,145,168,43,19,24,46,79,63,15,18,22,11,9,92,67,9,85,28,110,45,64,78,116,9,13,194,143,277,45,21,26,48,80,81,79,85,84,86,78,94,78,81,81,85,83,93,80,85,80,80,66,17,20,24,13,11,175,69,11,9,190,139,96,7,32,59,7,39,62,68,118,106,71,53,74,290,100,123,81,148,44,15,196,145,117,47,23,28,50,81,81,82,86,80,80,82,67,19,22,26,15,13,96,71,13,11,9,42,69,9,49,108,76,254,61,104,192,151,47,17,198,147,120,49,25,30,52,83,83,84,88,82,82,84,69,21,24,28,17,15,98,73,15,13,194,96,253,98,21,201,150,316,53,29,34,56,73,25,28,32,21,19,222,334,19,17,15,13,45,72,13,52,223,114,80,73,72,77,107,19,197,146,162,51,27,32,54,85,71,23,26,30,19,17,100,33,17,112,76,203,17,61,65,66,65,66,65,81,49,68,70,71,70,71,17,52,54,31,15,43,70,15,50,298,70,76,114,79,61,82,78,45,233,109,17,21,198,147,176,53,29,34,56,87,87,73,25,28,32,21,19,102,57,19,37,17,40,67,17,47,72,78,128,116,81,63,84,148,72,154,96,445,72,300,84,110,227,592,133,158,54,110,165,185,85,33,23,21,97,207,83,31,21,84,19,63,136,144,19,17,15,82,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_sotr_handler.clas.abap"],"names":[],"mappings":";;AAyEA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;QAGI,saAA2B;QAC3B,qRAA+B;uHAGS;+HAEI;0GAKjB;EAE/B;EAGA;;;;;;;;;;QAGI,0DAA4B;QAC5B,qDAAyB;QACzB,qDAAoC;QACpC,yDAAkC;IAEpC,IAAe,WAA8B;;;;;;;;;;;;;;;;;;QAW3C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;QAEA;0BAA4C;QAC5C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEnB,QAAQ,MAAC,WAAQ,UAAU;QAG3B,aAAW,WAAS,MAAC,OAAM,MAAC,WAAU;QACtC,iBAAY,GAAT,UAAY,qCAAG;UAChB,mCAAW,WAAc,0DAAoB;QAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8BA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAa,GAAT,eAAE,MAAC,QAAS,gCAAC;oEACI;UACtC;QACF;;;;MAMF;MAGA;;;;;;;;;;;YAEO,qRAA+B;QAEpC,IAAc,eAAsC;QAEpD,iBAAc,gGAE2C;;;;;;;;;;;;;;;;;;;;;;;;;YAmBvD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;sEACuB;YACtC;UAEF;QAEF;QAGA;;;;;;cAEO,+OAA8D;cAC9D,8CAA+B;UAEpC,IAAc,gBAAwC;UAEtD;;;;;;;;;;;;;;;;;;;;;;;;cAgBE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;wEACuB;cACtC;YAEF;YAGA;YACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;cACd;cAEA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;;;;;;;;;;;;;kBAWb,iBAAyF,IAAtF,6JAAwF,uBAAS;6UAMpC;kBAEhE;gBACF;cACF;YAEF;YAGA;;;;;;;kBAEQ,sDAA8B;kBAC9B,qDAAoC;kBACpC,0DAA+B;cAErC,IAAe,YAAkC;;;;;;;;;;;;;;;;gBAYjD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kBACd;gBACF;gBAGA,mCAAW,SAAS,MAAC,OAAS,qCAAG;gBACjC,iBAAwB,GAArB,SAAS,MAAC,aAAc,SAAQ;kBACjC,SAAS,MAAC,gBAAa,sBACrB,KAAO,SAAS,MAAC,aACjB,KAAO,UACP,MAAO,sCACP,KAAO,iCAAG;gBACd;gBAEA,sBAAO,SAAS,MAAC,MAAK;gBAAtB,sBACO,SAAS,MAAC,UAAS;gBAD1B,sBAEO,SAAS,MAAC,WAAU;gBAF3B,sBAGO,SAAS,MAAC,UAAS;gBAH1B,sBAIO,SAAS,MAAC,WAAU;gBAJ3B,sBAKO,SAAS,MAAC,UAAS;;;kBAGxB,sBAAO,YAAU,MAAC,QAAO;kBAAzB,sBACO,YAAU,MAAC,UAAS;kBAD3B,sBAEO,YAAU,MAAC,WAAU;kBAF5B,sBAGO,YAAU,MAAC,UAAS;kBAH3B,sBAIO,YAAU,MAAC,WAAU;gBAC9B;gBAEA,OAAO,MAAC,YAAU,SAAS;gBAC3B,OAAO,MAAC,aAAU,UAAU;gBAE9B;;cAGA;;;;;;;;;;;oBAEQ,yDAA2B;gBAEjC,gBAAc,WAAW;gBAGzB,iBAAY,GAAT,UAAW,wCAAO,IAAI,cAAY,GAAV,WAAa,wCAAO,iBAAa,GAAV,WAAY,wCAAO,CAAC;wCACpE,+BAAiB,oCAAG;gBACtB;;;;;;;;;;;;;;;;;kBAaA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;oBACb;kBACF;kBAEF;;gBAGA;;;;;;;;;;;;;;;;;;;kBAEE,IAAc,eAAsC;sBAE9C,4MAA+B;sBAC/B,yjBAA0E;kBAMhF,iBAAc,gGAE2C;;;oBAGvD,aAAU,2EAA2C;oBAErD,yBAAG,iBAAgB,iBAAiD,GAA7C,cAAc,OAAE,SAAS,MAAC,qBAAqB,uBAAS;;sBAE7E,2BAAM,OAAO,MAAC;iCAAsB;;oBACtC;oBACA,wBAAqB,mDAAwC;;oBAG7D,2BAAM,OAAO,MAAC;+BAAsB;;oBAEpC,6DAAiC;kBACnC;kBAEA,yBAAG,iBAAe;uIAEgB;+IAEI;kBACtC;gBAEF;cACF","file":"zcl_abapgit_sotr_handler.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sots_handler.clas.mjs":{"lineLengths":[53,37,32,32,52,37,25,730,459,1534,367,1005,383,17,42,22,3,29,64,16,3,28,55,3,35,102,70,132,58,433,287,120,128,107,3,38,65,3,45,102,70,433,61,287,73,67,66,64,63,68,71,66,104,112,247,66,36,11,196,145,168,43,19,24,46,79,63,15,18,22,11,9,92,67,9,85,28,110,88,34,76,77,81,9,79,46,63,73,33,74,135,81,135,81,135,81,81,135,81,135,81,135,81,135,9,135,67,9,7,195,144,101,5,30,57,5,37,60,66,116,104,69,51,72,217,289,99,121,80,146,42,13,198,147,156,45,21,26,48,79,80,84,78,78,80,65,17,20,24,13,11,94,69,11,9,7,39,66,7,46,219,108,74,68,72,102,13,198,147,153,45,21,26,48,79,65,17,20,24,13,11,94,27,11,55,59,60,59,60,59,75,43,62,64,65,64,65,11,46,48,25,9,37,64,9,44,293,64,70,108,73,55,76,72,39,227,103,11,15,199,148,177,47,23,28,50,81,81,67,19,22,26,15,13,96,51,13,31,11,34,61,11,41,66,72,122,110,75,57,78,142,66,148,90,441,66,295,78,105,223,127,152,48,104,117,179,79,27,17,15,78,13,57,130,138,13,11,9,76,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_sots_handler.clas.abap"],"names":[],"mappings":";;AA2EA;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;QAGI,waAA2B;QAC3B,sRAA+B;uHAGU;+HAEI;0GAKlB;EAE/B;EAGA;;;;;;;;;;QAGI,0DAAoC;QACpC,yDAA0C;QAC1C,uDAAgC;QAChC,sDAAiC;QACjC,2DAAoC;QACpC,8DAAqC;QACrC,yDAA6C;QAC7C,+FAAiC;QACjC,uGAAiC;IAEnC,IAAc,WAA8B;;;;;;;;;;;;;;;;;;QAY1C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kEACsB;QACtC;QAEA;0BAA4C;QAC5C,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;;;UAMjB,QAAQ,MAAC,WAAU,WAAS,MAAC,OAAM,MAAC,SAAQ;UAC5C,QAAQ,MAAC,aAAU,WAAS,MAAC,OAAM,MAAC,QAAO;UAC3C,oEAAwC;QAC1C;QAEA,kCAAmB,WAAS,MAAC,SAAU,SAAS;QAChD,SAAS,MAAC,WAAQ,UAAU;QAE5B,eAAa,WAAS,MAAC,OAAM,MAAC,QAAO;;QAcrC,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KAfG,QAAL;;UAEI,0HAAwD;;UAExD,0HAAwD;;UAExD,0HAAwD;;;UAIxD,0HAAwD;;UAExD,0HAAwD;;UAExD,0HAAwD;;UAExD,0HAAwD;;QAG5D,iBAAY,GAAT,UAAY,gCAAE,iBAAa,GAAT,UAAY,gCAAC;kEACI;QACtC;MAEF;;;;IAMF;IAGA;;;;;;;;;;;UAGI,8MAAwB;UACxB,sRAA+B;MAEjC,IAAc,eAAsC;MAEpD,iBAAc,gGAE2C;;;;;;;;;;;;;;;;;;;;;;;;UAmBvD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;oEACuB;UACtC;QAEF;MAEF;MAGA;;;;;;;YAEQ,uDAA8B;YAC9B,2DAA+B;QAErC,IAAc,YAAkC;;;;;;;;;;;;;;;;UAWhD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;YACd;UACF;UAEA,sBAAO,SAAS,MAAC,MAAK;UAAtB,sBACO,SAAS,MAAC,UAAS;UAD1B,sBAEO,SAAS,MAAC,WAAU;UAF3B,sBAGO,SAAS,MAAC,UAAS;UAH1B,sBAIO,SAAS,MAAC,WAAU;UAJ3B,sBAKO,SAAS,MAAC,UAAS;;;YAGxB,sBAAO,YAAU,MAAC,QAAO;YAAzB,sBACO,YAAU,MAAC,UAAS;YAD3B,sBAEO,YAAU,MAAC,WAAU;YAF5B,sBAGO,YAAU,MAAC,UAAS;YAH3B,sBAIO,YAAU,MAAC,WAAU;UAC9B;UAEA,OAAO,MAAC,YAAU,SAAS;UAC3B,OAAO,MAAC,aAAU,UAAU;UAE9B;;QAGA;;;;;;;;;;;cAEQ,yDAA2B;UAEjC,gBAAc,WAAW;UAGzB,iBAAY,GAAT,UAAW,wCAAO,IAAI,cAAY,GAAV,WAAa,wCAAO,iBAAa,GAAV,WAAY,wCAAO,CAAC;kCACpE,+BAAiB,oCAAG;UACtB;;;;;;;;;;;;;;;;;YAaA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACb;YACF;YAEF;;UAGA;;;;;;;;;;;;;;;;;;;YAEE,IAAc,eAAsC;gBAE/C,8MAAoB;YAMzB,iBAAc,gGAE2C;;;cAGvD,aAAU,2EAA2C;cAErD,iBAAgD,GAA7C,cAAc,OAAE,SAAS,MAAC,qBAAqB,uBAAS;;gBAEzD,2BAAM,OAAO,MAAC;2BAAsB;;cACtC;cAEA,6DAAiC;YACnC;YAEA,yBAAG,iBAAe;iIAEgB;yIAEI;YACtC;UAEF;QACF","file":"zcl_abapgit_sots_handler.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_stage.clas.mjs":{"lineLengths":[53,30,25,32,45,37,2081,191,1728,318,206,1563,359,1453,360,205,151,2073,17,42,22,1984,114,3,20,112,61,120,73,69,61,1057,67,203,3,23,112,61,120,73,104,67,1057,67,69,61,1744,1776,69,131,144,27,87,88,54,47,12,50,58,50,43,43,77,5,3,29,113,85,46,16,3,17,64,59,20,3,19,1983,32,20,3,28,107,40,21,3,23,112,61,120,73,166,3,35,55,3,42,74,104,67,30,121,65,127,68,131,68,12,132,5,26,3,22,112,61,120,73,181,106,3,19,112,61,120,73,1057,67,184,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/stage/zcl_abapgit_stage.clas.abap"],"names":[],"mappings":";;AAuEA;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;0MAMiC;EAEjC;EAGA;;;;;;;;;;;QAEQ,usDAA8B;IAEpC,IAAe,YAAgC;IAG/C;;;;qFAGsB;IACtB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,YAAU,MAAC,KAAI,MAAC,UAAO,OAAO;MAC9B,YAAU,MAAC,YAAY,SAAS;IAClC;MACE,QAAQ,MAAC,KAAI,MAAC,UAAW,OAAO;MAChC,QAAQ,MAAC,KAAI,MAAC,cAAW,WAAW;MACpC,QAAQ,MAAC,KAAI,MAAC,UAAW,OAAO;MAChC,QAAQ,MAAC,YAAgB,SAAS;MAClC,QAAQ,MAAC,YAAgB,SAAS;MAClC,oEAAmC;IACrC;EAEF;EAGA;;;IACE,yBAAkB,eAAe;IACnC;;EAGA;;IACE,aAAW,yBAAO,eAAU;IAC9B;;EAGA;;IACE,aAAW,aAAQ;IACrB;;EAGA;;IACE,cAAY,oBAAe;IAC7B;;EAGA;;;;;qKAGkE;EAClE;EAGA;;;;;;;IAEE,IACE,OAEA,AAEA,KALG,SAAL;;MAEI,mBAAiB,sCAAK;;MAEtB,mBAAiB,yCAAQ;;MAEzB,mBAAiB,yCAAQ;;mIAEoC;;IAGnE;;EAGA;;;;;;IAEE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;EACrB;EAGA;;;;;;;uLAI8D;EAC9D;AACF","file":"zcl_abapgit_stage.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_stage_logic.clas.mjs":{"lineLengths":[53,36,31,32,51,62,25,3967,3779,17,42,22,3,29,64,16,3,33,59,3,40,3680,61,64,510,1225,100,79,37,48,74,24,165,178,29,121,90,105,88,87,9,7,5,3,31,57,3,38,133,61,3680,61,64,542,1225,80,38,48,215,86,265,86,7,5,79,37,48,235,85,7,5,3,44,3680,133,61,147,79,117,119,62,54,70,20,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/stage/zcl_abapgit_stage_logic.clas.abap"],"names":[],"mappings":";;AAqBA;;;;;;;;;;;;;;;EAGE;;;;;;QAEQ,uDAAgB;QAChB,qfAAsC;IAE5C,IAAe,YAAsC;IAErD;;;MAGE,aAAW,eAAE,MAAC,MAAK;MAEnB;;;;;uHAEe;MACf,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;;QAEb,iBAAkB,GAAf,SAAS,MAAC,OAAO,YAAU,MAAC,KAAI,MAAC,MAAI;;QAExC;MACF;IACF;EAEF;EAGA;;;;;;;;QAEQ,uDAAe;IAErB,IAAe,aAAwC;IAAvD,IACe,YAAuC;;;MAIpD,aAAW,eAAE,MAAC,MAAK;MAEnB,iBAEyC,IAFtC,kKAEwC,uBAAS;;MAEpD,wBAAwB,GAAjB,aAAW,MAAC,OAAO,wCAAyB,mCAC/C,iBAAyB,GAArB,aAAW,MAAC,WAAW,wCAAyB,sCAAa;;MAGrE;IAEF;;;MAGE,aAAW,eAAE,MAAC,MAAK;MAEnB,iBAE6C,IAF1C,sLAE4C,uBAAS;;MAExD;IAEF;EAEF;EAGA;;;;;;IAEE,QAAQ,MAAC,YAAS,qFAAyD;IAC3E,QAAQ,MAAC,aAAS,sFAA0C;IAC5D,QAAQ,MAAC,aAAS,6BAAkB;qDACY;qEAED;IAEjD;;AACF","file":"zcl_abapgit_stage_logic.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_string_buffer.clas.mjs":{"lineLengths":[53,38,33,32,53,37,362,238,326,162,172,171,17,42,22,264,3,29,64,16,3,20,135,66,58,69,23,17,3,26,66,70,42,18,3,36,66,123,42,18,3,34,66,109,42,18,3,15,43,3,22,135,86,17,3,1,70,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_string_buffer.clas.abap"],"names":[],"mappings":";;AAgCA;;;;;;;;;;;;;;;;;;;EAGE;;;;IACE,gCAAO,gBAAU,cAAS;IAC1B,UAAQ,OAAE;IACZ;;EAGA;;IACE,WAAS,8BAAiB,OAAQ,gBAAW;IAC7C,sBAAM,cAAS;IACjB;;EAGA;;IACE,WAAS,8BACP,OAAQ,gBACR,KAAQ,uCAAwB,SAAS;IAC3C,sBAAM,cAAS;IACjB;;EAGA;;IACE,WAAS,8BACP,OAAQ,gBACR,KAAQ,kCAAK;IACf,sBAAM,cAAS;IACjB;;EAGA;;;;;;IAEA;;AACF","file":"zcl_abapgit_string_buffer.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_string_map.clas.mjs":{"lineLengths":[53,35,30,32,50,37,580,182,182,190,393,205,257,290,405,149,189,154,49,140,365,50,400,17,42,22,483,106,106,113,3,17,69,147,5,43,3,29,112,97,120,50,54,16,3,23,48,3,30,135,112,97,120,131,23,3,23,66,58,69,148,5,113,3,18,50,3,20,66,66,58,66,299,76,55,12,25,5,71,61,64,27,37,60,39,5,18,3,20,99,66,58,102,64,27,37,86,18,3,20,99,129,18,3,22,135,137,79,299,89,37,83,5,23,3,20,130,66,58,44,55,66,267,299,69,145,5,76,55,12,25,5,71,61,64,27,37,60,39,12,35,35,79,5,24,18,3,16,63,60,19,3,23,135,102,67,99,37,29,23,3,24,51,73,121,68,299,77,100,199,130,5,74,37,71,94,90,45,79,17,14,168,7,5,3,1,64,282,497,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_string_map.clas.abap"],"names":[],"mappings":";;AAsFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;IACE,iBAAgB,GAAb,mBAAe,uBAAS;kJACmD;IAC9E;IACA,sBAAM,eAAU;EAClB;EAGA;;;;IACE,sBAAe,sBAAS;IACxB,6BAAsB,mBAAmB;IAC3C;;EAGA;;;;;;;;;IAIA;;EAGA;;;IAEE,iBAAgB,GAAb,mBAAe,uBAAS;mJACoD;IAC/E;;EAIF;EAGA;IACE,sBAAe,sBAAS;EAC1B;EAGA;;;;QAEO,yDAAkB;IACvB,IAAc,YAAkC;IAEhD,iBAAuB,GAApB,0BAAsB,uBAAS;MAChC,WAAS,4BAAU,QAAQ;IAC7B;MACE,WAAS,MAAM;IACjB;IAEA;;;;mCAA8D;IAC9D,yBAAG,eAAE,MAAC,OAAgB;MACpB,WAAS,YAAU,MAAC,EAAC;IACvB;IAEF;;EAGA;;;;IAEE;;;mCAAgE;IAChE,WAAS,wCAAO,eAAE,MAAC,OAAV,CAA4B;IAEvC;;EAGA;;IACE,WAAS,gCAA2B,GAApB,yBAAO,mBAAe,gCAA7B,CAAgC;IAC3C;;EAGA;;;;IAEE,IAAc,YAAkC;;;kFAKrB;IAC3B;IAEF;;EAGA;;;;;;QAEO,yDAAkB;QAClB,kQAAgC;IACrC,IAAc,YAAkC;IAEhD,iBAAgB,GAAb,mBAAe,uBAAS;gJACiD;IAC5E;IAEA,iBAAuB,GAApB,0BAAsB,uBAAS;MAChC,WAAS,4BAAU,QAAQ;IAC7B;MACE,WAAS,MAAM;IACjB;IAEA;;;;mCAA8D;IAC9D,yBAAG,eAAE,MAAC,OAAgB;MACpB,YAAU,MAAC,OAAI,MAAM;IACvB;MACE,QAAQ,MAAC,OAAI,MAAM;MACnB,QAAQ,MAAC,OAAI,MAAM;MACnB,sEAAqC;IACvC;IAEA,WAAS,OAAE;IAEb;;EAGA;;IAEE,YAAU,yBAAO,iBAAY;IAE/B;;EAGA;;;;;IACE,sBAAe,SAAS;IACxB,gBAAc,OAAE;IAClB;;EAGA;;;QAEO,gHAAqC;QACrC,2DAAoB;IACzB,IAAc,YAAkC;IAChD,IAAc,UAAiB;IAE/B,aAAU,iFAAmD;IAC7D,iBAAsB,GAAnB,OAAO,OAAE,WAAa,kCAAmB,iBAC1C,iBAAuB,GAAnB,OAAO,OAAE,WAAa,kCAAmB,iBAAgB;iIACF;IAC7D;;;MAGE,aAAW,4BAAU,YAAU,MAAC,IAAG;MACnC,qFAA+D;MAC/D,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QAEb,eAAW,YAAU,MAAC,EAAC;MACzB,wBAAoB,GAAb,mBAAe,wBAAU;QAC9B;MACF;uKAC8E;MAC9E;IACF;EAEF;AACF","file":"zcl_abapgit_string_map.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_factory.clas.mjs":{"lineLengths":[53,39,34,32,54,37,25,517,17,42,22,3,29,64,16,3,23,52,3,30,151,71,73,108,85,112,82,92,163,91,88,91,87,90,165,92,237,91,12,41,5,54,83,5,23,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_factory.clas.abap"],"names":[],"mappings":";;AAmBA;;;;;;;;;;;;;;EAGE;;;;;;;;;;IAGE,iBAAe,GAAZ,aAAe,0CAAQ;;IAE1B,wBAAmB,GAAZ,aAAe,yCAAQ,iBAAe,GAAZ,aAAe,0CAAQ;;IAExD,wBAAmB,GAAZ,aAAe,yCAAO;;IAE7B,wBAAmB,GAAZ,aAAe,wCAAM;;IAE5B,wBAAmB,GAAZ,aAAe,0CAAS,iBAAe,GAAZ,aAAe,2CAAS;;IAE1D,wBAAmB,GAAZ,aAAe,yCAAQ,iBAAe,GAAZ,aAAe,yCAAS,iBAAe,GAAZ,aAAe,0CAAQ;;IAEnF;MACE,sBAAM,WAAW;IACnB;IAEA,yBAAG,sBAAoB;kFAC2B;IAClD;IACF;;AACF","file":"zcl_abapgit_syntax_factory.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_highlighter.clas.mjs":{"lineLengths":[53,43,38,32,58,37,816,185,133,477,950,953,954,1058,375,306,273,268,207,17,42,22,719,109,68,3,29,64,16,3,25,68,64,46,61,68,64,67,73,538,51,146,5,38,38,53,69,3,28,67,67,61,68,64,70,108,74,51,147,12,30,5,19,3,31,67,61,751,67,67,67,23,65,524,556,57,67,69,37,68,83,78,47,45,112,7,95,5,52,67,76,45,43,69,5,3,28,67,67,61,751,70,68,538,556,69,37,123,37,61,85,88,29,61,97,59,5,19,3,30,102,69,67,73,201,81,21,3,30,67,61,751,67,3,27,751,67,61,114,120,852,524,571,686,239,144,37,45,77,57,70,40,40,101,61,64,64,73,16,112,41,258,63,68,68,75,11,9,7,5,22,3,29,67,67,61,751,133,70,21,5,64,73,74,86,19,3,33,108,85,46,3,34,67,67,61,49,25,72,181,182,149,190,136,13,103,21,110,18,20,11,9,121,91,9,124,93,9,122,93,9,7,5,19,3,1,80,78,53,547,775,561,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_highlighter.clas.abap"],"names":[],"mappings":";;AAuFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;QAEO,ihBAA6B;IAElC,yBAAO,mBAAmB;;IAK1B;IAEA,OAAO,MAAC,WAAgB,QAAQ;IAChC,OAAO,MAAC,WAAgB,QAAQ;IAChC,OAAO,MAAC,uBAAoB,WAAW;IACvC,gCAAO,iBAAW,aAAQ;EAE5B;EAGA;;;;;;QAEO,6DAAsB;IAE3B,eAAa,qBAAQ,KAAS,SACT,QAAS,+BAAgB,aAAa;IAE3D,gBAAa,oDAA+B;IAE5C,yBAAG,mBAAuB;MACxB,2IAA4D;IAC9D;MACE,YAAU,UAAU;IACtB;IAEF;;EAGA;;;;;QAEQ,0DAAkB;QAClB,0DAA0B,CAAA;;QAC1B,wDAAkB;QAClB,mgBAAyB;IAE/B,IAAc,YAAwB;IAEtC,gBAAc,0BAAQ,SAAS;IAE/B;;;MAIE,iBAAqB,GAAlB,YAAU,MAAC,SAAS,YAAW;QAChC,cAA8B,qBAAlB,YAAU,MAAC,QAAS,YAAW;QAC3C,QAAQ,MAAC,WAAS,2CAAY;QAC9B,QAAQ,MAAC,YAAS,WAAW;QAC7B,QAAQ,MAAC,YAAS,SAAS;QAC3B,qGAA8C;MAChD;MACA,gBAAgC,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,QAAM;IACrD;IAGA,iBAAe,GAAZ,aAAc,YAAW;MAC1B,cAAwB,qBAAZ,YAAc,YAAW;MACrC,QAAQ,MAAC,WAAS,2CAAY;MAC9B,QAAQ,MAAC,YAAS,WAAW;MAC7B,QAAQ,MAAC,YAAS,SAAS;MAC3B,gCAAO,kBAAY,UAAU;IAC/B;EAEF;EAGA;;;;;;QAGI,2DAAoB;QACpB,ihBAA8B;IAEhC,IAAc,YAAwB;;;MAGpC,aAAW,wBAAW,KAAM,SACN,KAAM,YAAU,MAAC,SACjB,KAAM,YAAU,MAAC,SAAQ;MAE/C,sBAAM,OAAO;MACb;;;;2DAAkE;MAElE,cAAW,2EACuC;MAElD,kCAAU,QAAW,SAAQ;IAC/B;IAEF;;EAGA;;;;QAEQ,gEAAyB;IAG/B,wCAAgB,uDAAO,uCAAwB,eAAkB,uCAAwB,OAAK;IAE9F,cAAY,gCAAiB,GAAV,WAAa,cAApB,CAAmC;IAEjD;;EAGA;;;;;EACA;EAGA;;;;QAGI,yGAAoC;QACpC,+GAAsC;QACtC,20BAAgC;QAChC,mgBAAwB;IAE1B,IACE,YAAmC;IADrC,IAEE,aAA+B;IAFjC,IAGE,eAAiD;;;MAKjD,aAAa,YAAU,MAAC,MAAK;MAC7B,gBAAa,qDAA0C;MACvD,eAAa,kCAAuB;;;QAIlC,sBAAO,QAAQ;QACf,iBAAgC,GAA7B,YAAU,MAAC,oBAAoB,gCAAC;UACjC,QAAQ,MAAC,WAAS,YAAU,MAAC,MAAK;UAClC,QAAQ,MAAC,YAAS,aAAW,MAAC,OAAM;UACpC,QAAQ,MAAC,YAAS,aAAW,MAAC,OAAM;UACpC,gCAAO,kBAAY,UAAU;QAC/B;UACE;uCAA4F;UAE5F,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,iBAAyB,GAArB,eAAa,MAAC,SAAU,gCAAE,iBAAyB,GAArB,eAAa,MAAC,SAAS,gCAAC;YACxE,QAAQ,MAAC,WAAS,YAAU,MAAC,MAAK;YAClC,QAAQ,MAAC,YAAS,eAAa,MAAC,OAAM;YACtC,QAAQ,MAAC,YAAS,eAAa,MAAC,OAAM;YACtC,gCAAO,kBAAY,UAAU;UAC/B;QACF;MACF;IACF;IAEF;;EAGA;;;;QAEQ,suBAA2B;IAEjC,yBAAG,QAAmB,iBAA4B,IAAzB,iDAA2B,uBAAS;MAC3D,aAAU,iDAA4B;MACtC;IACF;IAEA,gBAAa,0CAAqB;wEAGgB;yEAGC;IAEnD,aAAU,mEACsC;IAElD;;EAGA;;;IACE,yBAAkB,eAAe;EACnC;EAGA;;;;QAEO,wCAAsB;IAE3B,YAAU,OAAO;IAEjB,iBAAmB,GAAhB,sBAAkB,uBAAS;MAC5B,4KAAsG;MACtG,6KAA0F;MAC1F,4IAA4F;MAC5F,qLACyC;MAEzC,yBAAG,0BAAQ,WAAkB,iCAAM,gCAAC;QAClC;UACI,YAAS,+EAAiD;;;;;;QAE9D;QACA,iBAAa,GAAV,+BAAY,uCAAwB,oBAAmB;UACxD,YAAU,mEAAiC;QAC7C;QACA,iBAAa,GAAV,+BAAY,uCAAwB,uBAAsB;UAC3D,YAAU,qEAAmC;QAC/C;QACA,iBAAa,GAAV,+BAAY,uCAAwB,qBAAoB;UACzD,YAAU,qEAAmC;QAC/C;MACF;IACF;IAEF;;AACF","file":"zcl_abapgit_syntax_highlighter.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_json.clas.mjs":{"lineLengths":[99,53,36,70,32,51,37,411,324,333,75,56,17,12,42,22,47,51,51,3,29,31,195,186,183,195,16,3,30,67,61,751,67,68,64,67,56,555,556,107,57,69,37,176,56,17,7,123,98,50,89,89,161,49,11,58,19,9,7,50,74,5,109,235,37,81,71,83,7,5,3,1,66,329,61,53,61,59,263,55,52,54,55,271,89,69,52,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_json.clas.abap"],"names":[],"mappings":";;;AA2CA;;;;;;;;;;;;;;;;;EAGE;8BAEuB;kMAMe;yLAKH;sLAKE;kMAKC;IAEtC;;EAGA;;;;;QAGI,2DAAyB;QACzB,uDAAoB;QACpB,0DAAoB;QACpB,+CAAoB;IAEtB,IACE,WAAwB;IAD1B,IAEE,YAAwB;IAG1B;IAEA,gBAAc,0BAAQ,SAAS;;;MAI7B,iBAAiB,GAAd,eAAgB,+BAAO,MAAC,MAAK,iBAAqB,GAAjB,YAAU,MAAC,QAAS,+BAAO,MAAC,MAAI;QAClE,sBAAM,YAAU,MAAC,MAAK;QACtB;MACF;MAEA,aAAW,wBAAW,KAAM,SACN,KAAM,YAAU,MAAC,SACjB,KAAM,YAAU,MAAC,SAAQ;MAE/C,iBAAoB,GAAjB,YAAU,MAAC,QAAQ,+BAAO,MAAC,MAAI;QAChC,YAAU,MAAC,cAAW,QAAQ;QAC9B,iBAAiB,GAAd,eAAgB,+BAAO,MAAC,MAAI;UAC7B,iBAAuB,GAApB,YAAU,MAAC,WAAW,WAAS,MAAC,UAAQ;YACzC,WAAS,MAAC,YAA+C,qBAApB,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,SAAS,WAAS,MAAC,QAAM;YAC3E,sBAAM,aAAa;UACrB;UACA,sBAAM,YAAU,MAAC,MAAK;UACtB;QACF;MACF;MAEA,kBAAgB,YAAU,MAAC,MAAK;MAChC,iEAA8B;IAChC;;;;MAME,aAAoB,mBAAT,SAAW,gCAAC;MACvB,iBAAY,GAAT,UAAY,gCAAC;QACd,YAAU,MAAC,WAAQ,+BAAO,MAAC,OAAM;MACnC;IACF;EAEF;AACF","file":"zcl_abapgit_syntax_json.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_txt.clas.mjs":{"lineLengths":[99,53,35,69,32,50,37,25,73,57,17,12,42,22,3,29,31,16,3,29,67,67,61,109,19,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_txt.clas.abap"],"names":[],"mappings":";;;AAiBA;;;;;;;;;;;;EAGE;8BAEuB;IAIvB;;EAGA;;;;IAEE,aAAU,0FAEO;IAEnB;;AACF","file":"zcl_abapgit_syntax_txt.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_xml.clas.mjs":{"lineLengths":[99,53,35,69,32,50,37,201,392,326,395,75,56,17,12,42,22,56,46,50,50,3,29,31,61,238,183,195,192,16,3,30,67,61,751,67,68,67,67,64,56,51,22,555,556,67,57,85,141,108,29,81,90,42,56,83,71,51,15,7,5,69,37,48,123,47,85,50,177,61,159,77,19,184,61,51,209,113,11,16,61,9,92,81,138,212,101,72,87,138,119,73,73,16,99,180,212,9,14,91,113,9,78,77,19,9,7,50,74,5,288,175,90,70,7,5,3,1,64,118,330,58,52,60,58,264,54,51,55,54,332,98,92,86,87,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_xml.clas.abap"],"names":[],"mappings":";;;AA2CA;;;;;;;;;;;;;;;;;;;EAGE;8BAEuB;IAGrB,sBAAM,iCAAU;6OAMW;sLAIM;kMAII;+LAID;IAEtC;;EAGA;;;;;QAGI,2DAAyB;QACzB,0DAAoB;QACpB,0DAAoB;QACpB,uDAA2B;QAC3B,+CAAoB;QACpB,0CAA8B,CAAA;;IAEhC,IACE,WAAwB;IAD1B,IAEE,YAAwB;IAE1B;IAEA,gBAAc,0BAAQ,SAAS;IAG/B,iBAAc,GAAX,mCAAa,uBAAS;MACvB;;;+EAA6E;MAC7E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,sBAAM,UAAU;;QAEhB,YAAU,MAAC,WAAQ,8BAAO,MAAC,QAAO;QAClC,YAAU,MAAC,YAAS,+BAAC;QACrB,YAAU,MAAC,YAAS,WAAW;QAC/B;MACF;IACF;;;MAGE,aAAW,eAAE,MAAC,MAAK;MAEnB,aAAW,wBAAW,KAAM,SACN,KAAM,YAAU,MAAC,SACjB,KAAM,YAAU,MAAC,SAAQ;MAE/C,IACE,OAqBA,KAtBG,YAAU,MAAC,MAAhB;;QAEI,YAAU,MAAC,cAAW,QAAQ;QAG9B,iBAAuB,GAApB,YAAU,MAAC,WAAW,qCAAI,iBAAkB,GAAd,eAAgB,8BAAO,MAAC,SAAO;UAC9D,aAAW,oCAAG;UACd,WAAS,MAAC,YAA8C,mBAAnB,qBAAlB,YAAU,MAAC,QAAS,WAAS,MAAC,SAAS,YAAU,MAAC,QAAM;;UAE3E;QAGF,wBAA2B,GAApB,YAAU,MAAC,WAAW,qCAAI,iBAAkB,GAAd,eAAiB,8BAAO,MAAC,SAAO;UACnE,aAAW,oCAAG;UACd,0BAAG,YAAqB;YACtB,YAAU,MAAC,YAAiE,mBAAnB,qBAAnB,qBAAlB,YAAU,MAAC,QAAS,WAAS,MAAC,SAAS,WAAS,MAAC,SAAS,YAAU,MAAC,QAAM;YAC/F,YAAU,MAAC,YAA0B,mBAAjB,WAAS,MAAC,QAAS,WAAS,MAAC,QAAM;UACzD;QACF;UACE,aAAW,oCAAG;QAChB;;QAGA,iBAAY,GAAT,UAAW,wCAAM;;;UAGlB,YAAU,MAAC,YAAqB,qBAAZ,YAAc,YAAU,MAAC,QAAM;UACnD,sCAAa,sBAAS;QACxB,wBAAgB,GAAT,UAAW,uCAAK;;UAErB,YAAU,MAAC,YAA2B,mBAAlB,YAAU,MAAC,QAAS,gCAAC;UACzC,YAAU,MAAC,YAAS,+BAAC;UACrB,sCAAa,uBAAU;QACzB;UACE,gBAAgC,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,QAAM;;;QAGrD;;QAGA,iBAAiB,GAAd,eAAgB,8BAAO,MAAC,SAAO;UAChC,WAAS,MAAC,YAA2B,qBAAlB,YAAU,MAAC,QAAS,WAAS,MAAC,QAAM;QACzD;QAEA,iBAAY,GAAT,UAAW,qCAAG;;UAEf;QACF;;MAIJ,kBAAgB,YAAU,MAAC,MAAK;MAChC,iEAA8B;IAChC;IAGA,iBAAiB,GAAd,eAAgB,8BAAO,MAAC,SACvB,0BAAI,YACJ,iBAAsB,GAAlB,WAAS,MAAC,SAAU,gCACxB,iBAAuB,GAAnB,WAAS,MAAC,WAAW,qCAAG;;MAG9B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,WAAS,MAAC,YAAS,+BAAC;MACtB;IAEF;EAEF;AACF","file":"zcl_abapgit_syntax_xml.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_tadir.clas.mjs":{"lineLengths":[53,30,25,32,45,56,25,1778,1634,1675,1277,1051,1137,1175,566,17,42,22,3,29,64,16,3,35,324,73,813,61,134,627,70,39,83,54,78,79,56,56,70,71,7,5,3,30,102,70,47,64,813,61,99,106,627,27,9,194,143,143,41,17,22,44,76,61,13,16,20,9,7,138,251,240,31,153,92,56,80,81,56,54,72,73,9,7,5,33,104,72,815,63,629,229,39,119,7,79,102,7,5,24,815,56,72,134,60,116,105,126,116,105,126,122,60,326,196,84,78,94,22,5,31,815,815,66,137,599,629,130,69,39,146,274,9,62,64,64,126,75,9,7,57,22,5,33,56,72,134,60,815,63,69,145,109,81,629,91,69,39,76,59,55,150,11,9,45,76,7,5,35,105,326,75,247,66,74,46,45,41,14,45,76,220,13,67,138,133,15,76,11,105,51,47,20,48,82,320,19,70,138,133,21,79,17,81,36,17,15,53,32,13,41,64,80,124,113,134,124,113,334,80,823,71,547,367,448,269,84,176,15,125,78,81,80,80,80,80,80,80,80,80,119,82,82,15,83,82,85,72,85,15,64,55,51,24,52,86,415,23,74,142,137,25,83,21,19,148,17,67,69,65,78,128,66,81,69,87,609,611,145,88,39,19,68,70,70,137,39,19,59,37,17,53,827,68,84,128,117,138,128,117,138,146,72,134,72,137,201,87,130,80,34,17,60,609,65,78,128,66,81,69,87,285,64,34,17,15,68,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_tadir.clas.abap"],"names":[],"mappings":";;AA+EA;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;IAEE,IACE,cAAqC;IADvC,IAEE,YAAkC;;;MAKlC,iBAAgB,GAAb,gBAAgB,sCAAI;;QAErB,YAAU,MAAC,WAAa,uCAAM;QAC9B,YAAU,MAAC,YAAa,uCAAM;QAC9B,YAAU,MAAC,cAAa,cAAY;QACpC,YAAU,MAAC,cAAa,cAAY;QACpC,YAAU,MAAC,eAAa,eAAE,MAAC,MAAK;QAChC,YAAU,MAAC,gBAAa,eAAE,MAAC,MAAK;MAClC;IAEF;EAEF;EAGA;;;;;;;QAGI,0FAA0B;QAC1B,iGAA2B;IAE7B,IAAc,YAAgC;IAE9C,YAAU,SAAS;;;;;;;;;;;;;;;;MAWnB,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAE,yBAAI,uBAA2B;QAE7C;;;uJACiE;QACjE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;UAEd,YAAU,MAAC,WAAa,uCAAM;UAC9B,YAAU,MAAC,YAAa,uCAAM;UAC9B,YAAU,MAAC,cAAa,YAAY;UACpC,YAAU,MAAC,cAAa,UAAU;UAClC,YAAU,MAAC,eAAa,eAAE,MAAC,MAAK;UAChC,YAAU,MAAC,gBAAa,eAAE,MAAC,MAAK;QAClC;MAEF;IAEF;IAGA;;;;;MAEE,IAAc,YAAgC;;;sHASjB;MAC7B;MAGA,iBAAc,GAAX,YAAc,sCAAI;qGAMQ;MAC7B;IAEF;IAGA;;;;;;;;;;;;;;UAEO,2TAAwD;mMASpB;mFAMb;6EAMD;6FAOA;MAE7B;;IAGA;;;;UAEQ,8HAA4C;UAC5C,4kBAAiD;MAEvD,IAAe,YAAgC;MAG/C,iBAAc,yGAAuD;;;QAKnE,iBAAoB,GAAR,mBAAT,eAAE,MAAC,OAAU,oCAAM,gCAAC;iRAG+D;QACtF;QAEA,OAAO,MAAC,cAAW,YAAU,MAAC,OAAM;QACpC,OAAO,MAAC,cAAW,YAAU,MAAC,SAAQ;QACtC,OAAO,MAAC,cAAW,YAAU,MAAC,SAAQ;QAEtC,iBAA0C,IAAvC,uEAAyC,uBAAS;UACnD,gCAAO,sBAAc,QAAQ;QAC/B;MACF;wDAEmB;MAErB;;IAGA;;;;;;;UAGI,0DAA2B;UAC3B,sIAAoD;UACpD,kGAA0E,CAAA;;MAE5E,IAAc,YAAgC;MAE9C,qBAAkB,8DAAyC;;;QAIzD,iBAAmB,GAAhB,iBAAmB,YAAU,MAAC,UAAQ;UAEvC,oBAAkB,YAAU,MAAC,SAAQ;UAErC,yBAAO,iBAAiB;YACtB,aAAU,2HAG0B;UACtC;QACF;QAEA,YAAU,MAAC,UAAO,OAAO;QACzB,YAAU,MAAC,aAAU,mCAAE;MACzB;IAEF;IAGA;;;;UAOI,4OAAqD;UACrD,uDAAkB;MAEpB,4CAAO,sBAA0B;MAEjC,eAAa,uBAAU;MAGvB;;;;;;;;;;;;;UAEA,iBAAwB,GAArB,yBAAO,eAAgB,gCAAC;YAGzB;;;;;;;;;;;;;gBAIA,iBAAY,GAAT,UAAW,gCAAC;kBACb;gBACF;cACF;cAGA,eAAa,sBAAS;cAExB;;YAGA;;;;;;;;;;;;kBAGI,ghBAAoC;kBACpC,4VAAqC;kBACrC,6aAA0C;kBAC1C,0PAAsC;cAGxC,iBAAyB,GAAtB,uBAAwB,wBAAU;gBACnC,iBAAc,6IAAuE;cACvF;cACA,4GAA0C;cAG1C,UAAU,MAAC,UAAS,oCAAG;cACvB,UAAU,MAAC,YAAS,qCAAI;cACxB,UAAU,MAAC,SAAS,uCAAM;cAC1B,gCAAO,oBAAc,WAAW;cAChC,UAAU,MAAC,SAAS,uCAAM;cAC1B,gCAAO,oBAAc,WAAW;cAChC,UAAU,MAAC,SAAS,uCAAM;cAC1B,gCAAO,oBAAc,WAAW;cAChC,UAAU,MAAC,SAAS,uCAAM;cAC1B,gCAAO,oBAAc,WAAW;cAEhC,iBAAmC,IAAhC,0DAAkC,uBAAS;gBAC5C,UAAU,MAAC,SAAM,uCAAM;gBACvB,gCAAO,oBAAc,WAAW;cAClC;cAGA,iBAAyB,GAAtB,uBAAwB,uBAAS;gBAClC,YAAY,MAAC,UAAS,oCAAG;gBACzB,YAAY,MAAC,YAAS,qCAAI;gBAC1B,YAAY,MAAC,SAAS,eAAE,MAAC,MAAK;gBAC9B,gCAAO,sBAAgB,YAAY;cACrC;cAEA,yBAAG,sBAA0B;gBAC3B;;;;;;;;;;;;;kBAQF;kBAEA;gBAEF;gBAGA;;;;;;;;;sBAEQ,0kBAA+C;sBAC/C,4kBAA8C;kBAEpD,cAAW,+GAGkB;kBAE7B,iBAAoB,GAAjB,QAAQ,MAAC,UAAU,uBAAS;oBAC7B;kBACF;kBAEA,OAAO,MAAC,cAAW,QAAQ,MAAC,OAAM;kBAClC,OAAO,MAAC,cAAW,QAAQ,MAAC,SAAQ;kBACpC,OAAO,MAAC,cAAW,QAAQ,MAAC,SAAQ;kBAEpC,iBAA0C,IAAvC,uEAAyC,wBAAU;oBACpD;kBACF;kBAEA,gBAAc,QAAQ,MAAC,SAAQ;kBAEjC;;gBAGA;;;;;;;;;;;;;;sBAEQ,kHAAoC;kBAI1C,cAAW,uKAKuB;kBAElC,aAAU,sDAAiC;iIAMhB;kBAE3B,cAAW,8CAAwB;kBAErC;;gBAGA;;;;;;;;;kBAEE;kBAIA,sBAAM,QAAQ,MAAC,QAAO;kBAExB;;cACF","file":"zcl_abapgit_tadir.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_timer.clas.mjs":{"lineLengths":[53,30,25,32,45,37,165,141,175,439,264,209,315,17,42,22,68,65,98,3,29,67,61,64,64,30,32,16,3,23,43,3,30,122,67,61,64,64,119,20,3,20,69,120,121,136,101,99,66,46,98,12,53,11,118,31,78,67,85,108,9,130,19,106,95,16,18,9,7,5,79,106,5,55,131,5,21,3,17,122,52,26,20,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_timer.clas.abap"],"names":[],"mappings":";;AAyCA;;;;;;;;;;;;;;;;;;EAGE;;;;;IACE,iBAAW,OAAO;IAClB,kBAAW,QAAQ;IACrB;;EAGA;;;;;;;;;;IAKA;;EAGA;;;;;QAGI,4FAA4B;QAC5B,0FAA4B;QAC5B,yDAAwC;IAE1C,yBAAG,cAAmB;MACpB,cAAY,4EAA0C;IACxD;MACE,6CAAiC;MAEjC;QACI,gBAAa,4FAEQ;QAErB,WAAS,UAAU;QAEnB,iBAAY,GAAT,eAAW,gCAAC;UACb,uDAAwB;QAC1B,wBAAgB,GAAT,eAAW,gCAAC;UACjB,gGAAoC;QACtC;QAEA,oCAAY,oFAAiC;;;;;;;MAIjD;IACF;IAEA,iBAA+B,GAA5B,6BAA8B,uBAAS;MACxC,iGAAuC;IACzC;IAEA,yBAAG,uBAAsB;MACvB,2HAAuC;IACzC;IAEF;;EAGA;;IACE,8CAA6B;IAC7B,aAAW,OAAE;IACf;;AACF","file":"zcl_abapgit_timer.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport.clas.mjs":{"lineLengths":[53,34,29,32,49,37,25,325,260,280,1053,1163,526,1180,211,268,217,17,42,22,3,29,64,16,3,45,69,3,52,101,58,75,62,67,52,69,62,344,29,74,50,81,51,12,13,5,68,9,191,140,291,41,17,22,44,76,81,75,80,74,78,75,61,13,16,20,9,7,90,134,104,15,7,96,98,14,65,7,5,38,62,5,45,67,103,60,67,71,64,121,104,326,136,554,160,75,166,77,71,40,42,13,195,144,191,45,21,26,48,82,78,65,17,20,24,13,11,94,69,11,97,9,106,120,9,76,41,41,68,77,9,26,7,37,61,7,44,106,817,68,323,325,104,68,631,83,36,110,184,70,40,184,72,35,54,63,96,79,13,11,9,87,29,26,7,25,49,7,32,72,78,71,68,13,193,142,389,45,21,26,48,78,65,17,20,24,13,11,94,69,11,28,9,36,60,9,43,76,81,73,76,113,73,43,17,205,154,164,49,25,30,52,82,69,21,24,28,17,15,98,73,15,94,13,31,11,32,56,11,39,821,78,81,119,102,126,60,63,603,68,531,109,108,77,46,96,47,194,196,145,160,128,143,19,59,63,24,60,64,17,180,130,79,17,15,13,97,109,120,28,11,33,57,11,40,70,66,76,72,128,78,98,105,72,42,251,111,13,84,11,33,57,11,40,821,94,108,119,102,126,78,116,30,13,91,115,28,11,51,75,11,58,116,108,403,83,93,88,81,101,82,76,61,70,193,162,71,13,11,28,52,11,35,77,118,99,123,76,72,82,75,78,821,110,148,1176,83,43,77,20,151,13,105,29,13,80,75,104,128,13,80,51,140,13,96,86,80,20,185,13,221,27,11,9,70,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/cts/zcl_abapgit_transport.clas.abap"],"names":[],"mappings":";;AAqFA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;QAGI,kEAAyC;QACzC,qDAA+B;QAC/B,0DAA2B;QAC3B,2CAA+B;QAC/B,4DAA8B;QAC9B,qDAAgC;IAElC,eAAY,mUAG0C;IAEtD,IACE,OAEA,IAHG,SAAL;;MAEI,oBAAkB,sBAAS;;MAE3B,oBAAkB,uBAAU;;MAE5B;;IAGJ,aAAU,iDAA6B;;;;;;;;;;;;;;;;;;;;;;MAyBvC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,4HAA+D;QAC/D,6FAAwB;QACxB;MACF;MAEA,iBAAmB,GAAhB,yBAAO,UAAW,gCAAC;iGAGQ;MAC9B;gEACsC;MACtC;IAEF;IAGA;;;;;;;UAGI,wDAA8B;UAC9B,4DAA8B;UAC9B,qDAAsC;UACtC,8GAA2C;UAC3C,6FAA4D;UAC5D,2TAA2D;MAE7D,IACE,cAA0B;MAD5B,IAEE,aAAuB;iCAEzB,UAAc,mHAAoD;MAClE,gBAAc,mDAAuB;MACrC,iBAAc,6IAAuE;MACrF,oEAAwC;;;QAItC,sBAAO,UAAU;;;;;;;;;;;;;;;;;UAajB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oEACsB;UACtC;UAEA,oFAAoD;QAEtD;QAEA,iBAA2B,GAAxB,yBAAO,kBAAmB,gCAAC;uHACsB;QACpD;;;UAIE,sBAAO,OAAO;UAEd,kCAAmB,eAAe,OAAO;UACzC,gEAAoC;QAEtC;QAEF;;MAGA;;;;;;;YAGQ,sTAAqD;YACrD,wTAAqD;YACrD,2FAA8B;YAC9B,uDAAe;QAErB,IAAe,YAAgC;QAG/C;kCAAgD;QAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACnB,cAAW,gKAAkF;;;UAG3F,YAAS,gKAAkF;;;YAIzF,aAAW,eAAE,MAAC,MAAK;YACnB,iDAAsD;YACtD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;YAEhB;UACF;QACF;QAEA;2BAA2D;QAC7D;;MAGA;;;;;;;QAEE,UAAU,MAAC,EAAC,MAAC,YAAS,SAAS,MAAC,OAAM;;;;;;;;;;;;;;;;UAgBtC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oEACsB;UACtC;UAEF;;QAGA;;;;;;;cACO,6DAA4B;UACjC,IAAc,aAAkC;;;;;;;;;;;;;;;;;;cAW9C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wEACsB;cACtC;cAEA,gCAAgB,kCAAe,WAAW;YAC5C;YACF;;UAGA;;;;;;;;;;gBACQ,2CAA8B;gBAC9B,8CAAgC;gBAChC,0kBAAmD;gBACnD,mDAAkC;gBAClC,kgBAAuB;YAE7B,IAAe,cAAqC;YAApD,IACe,aAA8C;;;;;gBAMzD,iBAAqB,GAAlB,aAAW,MAAC,QAAQ,wCAAO,iBAAuB,GAAnB,aAAW,MAAC,SAAU,wCAAM;;;;kBAO5D,iBAAa,GAAV,WAAa,sCAAK,yBAAG,aAAuB;8IACa;kBAC5D;kBACA,cAAc,YAAY,MAAC,OAAM;kBACjC,gBAAc,YAAY,MAAC,SAAQ;gBACrC;kBACE,cAAc,aAAW,MAAC,OAAM;kBAChC,gBAAc,aAAW,MAAC,SAAQ;gBACpC;gBAEA,cAAW,oJAEkB;gBAE7B,yBAAG,QAAQ,MAAC,SAAmB,iBAAsB,GAAnB,oBAAqB,uBAAS;kBAC9D,gCAAO,kBAAY,QAAQ;gBAC7B;cACF;YACF;YAEA;;;YAGF;;UAGA;;;;;;;;gBAEQ,+GAAsC;gBACtC,6DAAsB;YAC5B,IAAe,UAAqB;;;;cAQlC,0OAEgB;8GAIiB;YAEnC;mFAE0C;UAE5C;UAGA;;;;;;;;;;gBACQ,6DAA+B;YAGrC,iBAAiC,GAA9B,yBAAO,wBAAyB,gCAAC;cAClC;YACF;YAEA,iBAAc,4DAAqC;YACnD,cAAW,uFAEgC;YAE7C;;UAGA;;;;;;;;;;;;gBAYI,iEAAoC;gBACpC,2DAA6B;YAE/B,SAAS,MAAC,YAAS,oBAAoB;YAEvC,gBAAa,wCAAiB;YAE9B,iBAA0B,GAAtB,UAAU,MAAC,EAAC,MAAC,WAAY,WAAW,MAAC,YACzC,iBAA0B,GAAtB,UAAU,MAAC,EAAC,MAAC,WAAY,WAAW,MAAC,sBAAoB;cAE3D,iJAA2E;sEACvC;YACtC;UAEF;UAGA;;;;;;;;;;;;gBAEQ,6DAAqC;gBACrC,oyBAA2D;gBAC3D,6FAA+B;gBAC/B,mIAAqD;gBACrD,uoCAAsE;gBACtE,kEAA4C;YAGlD,4BAAwB;cACtB,gCAAO,mBAAa,SAAS;YAC/B;cACE,eAAY,wHAAoE;YAClF;YAEA,iBAAsB,GAAnB,yBAAO,aAAc,gCAAC;cACvB;YACF;YAEA,iBAAc,iDAA0B;YACxC,cAAW,+CAAsB;YACjC,iBAAqB,GAAlB,yBAAO,YAAa,gCAAC;+HAC2B;YACnD;YAEA,gBAAa,kDAA4B;YACzC,yBAAG,WAAqB;2IACuC;YAC/D;YAEA,oBAAiB,8DAAyC;YAC1D,2BAAwB,yBAAI,mBAAuB;+EACL;YAC9C;wLACkG;YAClG;YAEA,aAAU,kMAK+B;YAE3C;;QACF","file":"zcl_abapgit_transport.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_2_branch.clas.mjs":{"lineLengths":[53,43,38,32,58,37,25,1338,6233,1499,17,42,22,3,29,64,16,3,23,139,79,366,106,825,100,74,809,122,3688,1373,256,95,81,156,65,181,107,105,3,40,809,366,106,75,155,75,22,3,40,825,100,122,64,3688,88,1373,94,158,149,144,3,1,80,40,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/cts/zcl_abapgit_transport_2_branch.clas.abap"],"names":[],"mappings":";;AAkCA;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEI,iEAA8B;QAC9B,gyBAA+D;QAC/D,iHAAgD;QAChD,+lHAA+D;QAC/D,o1CAA8D;IAEhE,oBAAiB,sOAC6E;8FAEhD;;IAI9C,sBAAmB,gIAA6D;IAEhF,wBAAqB,mCAAwB;oLAMC;IAE9C,gBAAa,qFAAiD;wGAGlB;EAC9C;EAGA;;;;IACE,UAAU,MAAC,UAAS,MAAC,UAAQ,eAAE,MAAC,MAAK;IACrC,UAAU,MAAC,UAAS,MAAC,qHAAiD;IACtE,UAAU,MAAC,aAAkB,sBAAsB,MAAC,YAAW;IACjE;;EAGA;;;;;;;;;QACO,qJAA8D;;+IAQxB;EAC7C;AACF","file":"zcl_abapgit_transport_2_branch.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_mass.clas.mjs":{"lineLengths":[81,61,53,39,64,32,54,37,25,66,17,12,42,22,3,29,64,16,3,15,44,3,22,75,178,103,69,67,9,106,54,99,46,133,9,153,204,152,14,137,7,17,106,25,67,155,14,16,7,5,3,1,72,36,60],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/cts/zcl_abapgit_transport_mass.clas.abap"],"names":[],"mappings":";;;;AAgBA;;;;;;;;;;;;;;;EAGE;;;;QAGI,kEAA8C;QAC9C,yKAAoD;QACpD,8FAAuC;QACvC,4DAA+B;QAC/B,0DAA+B;IAEjC;MAEI,eAAY,mFAA8B;MAE1C,yBAAG,oBAA0B;QAE3B,eAAY,0EAAqB;QAEjC,yBAAG,UAAoB;oIAEqC;QAC5D;;2MAU4E;uJAGT;MAErE;wIAEkE;MAClE;;;;;;;;;IAOJ;EAEF;AACF","file":"zcl_abapgit_transport_mass.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_mass.clas.locals.mjs":{"lineLengths":[81,53,50,15,32,67,37,173,178,171,176,17,42,22,49,3,29,64,16,3,21,31,3,28,69,68,152,91,102,177,42,21,3,37,47,3,44,69,67,42,13,5,151,3,30,40,3,37,75,64,72,69,66,61,54,58,78,79,9,192,141,396,41,17,22,44,83,61,13,16,20,9,7,90,41,14,70,95,7,23,5,3,68,76,30,34,82,39,172,134,178,149,350,308,189,260,193,319,19,44,24,75,58,102,54,5,31,96,69,154,93,172,84,11,120,19,108,71,16,18,9,7,18,5,24,101,46,28,5,36,59,5,43,110,71,69,185,29,5,34,101,96,69,51,63,154,93,107,174,114,124,7,28,5,31,100,76,69,261,67,186,25,5,33,77,69,49,63,77,79,69,32,172,171,7,5,3,94,84,45,109,113,39,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/cts/zcl_abapgit_transport_mass.clas.locals_imp.abap"],"names":[],"mappings":";;;AAqBA;;;;;;;;;;;;;;;;;EAEE;;;;;QAEQ,2DAAsB;QACtB,+IAAoD;IAE1D,gBAAa,qEAAgD;IAC7D,aAAW,mFAAiD;gLAOxB;IAGpC,2BAAiB,SAAS;IAE5B;;EAEA;;;;;;IACE,yBAAG,UAAoB;MACrB;IACF;sJAEoF;EACtF;EAEA;;;;;QAEQ,uDAA6B;QAC7B,+DAAiC;IAEvC,QAAQ,MAAC,kBAAe,+BAAC;IACzB,QAAQ,MAAC,eAAe,+BAAC;IAGzB,YAAY,MAAC,mBAAgB,kBAAK;IAClC,YAAY,MAAC,YAAgB,kBAAK;IAClC,YAAY,MAAC,gBAAgB,kBAAK;IAClC,YAAY,MAAC,kBAAgB,oCAAG;IAChC,YAAY,MAAC,eAAgB,wCAAO;;;;;;;;;;;;;;;;MAgBpC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,sBAAM,SAAS;MACjB;QACE;;MAEF;MAEF;;EAEF;;;EAuDA;;;;;;;;;;;;;;;;;;;;;;IAEE;;;UACO,+IAAoD;MAEzD,gBAAa,qEAAgD;MAE7D,oKAA0C;MAC1C,yBAAiB,mDAA4B;MAE7C;uHAC+E;;;;;;;MAI/E;MACF;;IAEA;;MACE,mBAAiB,mBAAc;MACjC;;IAEA;;;;;;;MACE,qBAAkB,4JAA6F;MACjH;;IAEA;;;;UAEQ,wCAAiB;UACjB,oDAAiB;UACjB,+IAAoD;MAE1D,gBAAa,qEAAgD;0GAEQ;MACrE,sKAA0D;MAE1D,iBAAuC,IAApC,4DAAsC,wBAAU;2HAKvB;MAC5B;MACF;;IAEA;;;;MAGE,6PAAwF;MAGxF;MAEA,kLAAiE;MAEnE;;IAEA;;;;;UAEQ,kEAAsC;UACtC,oEAA4B;;;QAIhC,qBAAkB,6IAEiE;0KAGK;MAE1F;IAEF;EAEF","file":"zcl_abapgit_transport_mass.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_objects.clas.mjs":{"lineLengths":[53,42,37,32,57,37,924,936,5354,17,42,22,826,3,29,825,100,56,16,3,25,122,64,3688,88,1373,94,606,1198,1064,83,40,388,39,53,242,91,236,11,86,264,287,33,200,94,215,18,185,11,134,562,232,11,120,16,116,9,7,90,7,5,3,1,78,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/cts/zcl_abapgit_transport_objects.clas.abap"],"names":[],"mappings":";;AAyBA;;;;;;;;;;;;EAGE;;;IACE,8BAAuB,oBAAoB;IAC7C;;EAGA;;;;;;;QACQ,qlBAAqD;QACrD,qqCAA8D;QAC9D,+hCAA2D;;;;;QAQ7D,IACE,OAoBA,IArBG,gBAAgB,MAAC,OAAtB;;UAEI,iBAA+B,GAA5B,mBAAmB,MAAC,UAAU,uBAAS;2OAE2B;UACrE;UAEA;;;;sMAIoD;UACpD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;sNAEgC;UAChD;wLAI2C;UAC3C;;UAGA,iBAA+B,GAA5B,mBAAmB,MAAC,UAAU,wBAC7B,iBAA+B,GAA3B,mBAAmB,MAAC,SAAU,wCAClC,iBAA+B,GAA3B,mBAAmB,MAAC,SAAU,wCAClC,iBAA+B,GAA3B,mBAAmB,MAAC,SAAU,wCAClC,iBAA+B,GAA3B,mBAAmB,MAAC,SAAU,wCAClC,iBAA+B,GAA3B,mBAAmB,MAAC,SAAU,wCAAM;uOAEqB;UACjE;uHAG2C;;UAE3C,oCAAS,GAAF,iCAAI,gCAAC;;MAElB;MACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MAIhB;IACF;EACF;AACF","file":"zcl_abapgit_transport_objects.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ui_factory.clas.mjs":{"lineLengths":[53,35,30,32,50,37,227,221,193,233,225,271,221,205,245,255,556,17,42,22,54,64,48,64,66,3,29,64,16,3,29,54,3,36,154,136,154,87,85,321,373,367,381,326,326,315,35,24,3,33,58,3,40,152,70,124,5,58,22,3,19,44,3,26,116,149,151,154,160,62,57,136,120,118,89,97,226,5,46,18,3,28,53,3,35,147,71,97,5,64,27,3,32,57,3,39,139,124,76,123,115,106,125,70,198,5,57,21,3,22,47,3,29,129,65,108,5,52,21,3,1,64,144,159,131,171,162,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/zcl_abapgit_ui_factory.clas.abap"],"names":[],"mappings":";;AA8CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;QAEO,+HAA4C;QAC5C,iJAAsD;;IAI3D,kBAAe,6DAAwC;gUAOD;oXAQA;8WAQA;4XAQA;qUAOA;qUAOA;0TAOV;IAE5C,iBAAe,YAAY;IAE7B;;EAGA;;;;;IAEE,yBAAG,sCAAyB;;IAE5B;IAEA,eAAa,qCAAc;IAE7B;;EAGA;;;;;QAGI,4IAAoD;QACpD,8IAAuD;QACvD,iJAAuD;QAEpD,uJAA+D;IAEpE,yBAAG,8BAAiB;MAClB,kBAAe,+BAAoB;;uHAGqB;qHACF;;;;IAWxD;IACA,WAAS,6BAAM;IAEjB;;EAGA;;;;;IACE,yBAAG,uCAA4B;iCAC7B,yCAAmB,qBAAU;IAC/B;IACA,oBAAkB,sCAAe;IACnC;;EAGA;;;;;;;;;;;IAEE,yBAAG,sCAA2B;;IAK9B;IAEA,cAAY,qCAAc;IAE5B;;EAGA;;;;;IAEE,yBAAG,iCAAoB;;IAEvB;IAEA,cAAY,gCAAS;IAEvB;;AACF","file":"zcl_abapgit_ui_factory.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ui_injector.clas.mjs":{"lineLengths":[58,53,36,31,32,51,37,25,239,255,245,251,242,17,42,22,3,29,64,16,3,34,60,3,41,147,110,27,3,38,64,3,45,152,70,74,3,33,59,3,40,147,85,80,3,32,58,3,39,144,82,78,3,27,53,3,34,129,67,68,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/zcl_abapgit_ui_injector.clas.abap"],"names":[],"mappings":";;;AA2BA;;;;;;;;;;;;;;;;;;EAGE;;;;;IAEE,qBAAkB,mFAAiC;IAErD;;EAGA;;;;;;IAEE,sCAAsB,CAAE,mBAAiB,UAAU;EAErD;EAGA;;;;;;IAEE,sCAAsB,CAAE,oBAAkB,eAAe;EAE3D;EAGA;;;;;;IAEE,sCAAsB,CAAE,mBAAiB,cAAc;EAEzD;EAGA;;;;;;IAEE,sCAAsB,CAAE,cAAY,SAAS;EAE/C;AACF","file":"zcl_abapgit_ui_injector.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ui_injector.clas.locals.mjs":{"lineLengths":[53,47,30,32,79,63,25,278,17,42,22,3,29,64,16,3,18,43,3,25,171,118,23,3,53,66,67,61,70,64,66,58,45,58,48,67,18,3,64,158,88,3,58,72,24,3,52,149,25,3,51,132,20,3,49,120,106,79,108,18,3,61,66,58,67,61,56,76,69,67,3,1,93,32,64],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/zcl_abapgit_ui_injector.clas.locals_imp.abap"],"names":[],"mappings":";;AAQA;;;;;;;;;;;;;;EACE;;;;;;IAEA;;EACA;;;;;;;;;;;;IACA;;EACA;;;EACA;EACA;;IACA;;EACA;;IACA;;EACA;;IACA;;EACA;;;;;IACA;;EACA;;;;;;;;;EACA;AAEF","file":"zcl_abapgit_ui_injector.clas.locals.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_url.clas.mjs":{"lineLengths":[53,28,23,32,43,37,25,492,156,259,403,269,306,269,17,42,22,3,29,64,16,3,21,39,3,28,67,66,58,57,19,3,32,50,3,39,103,66,58,235,45,5,22,3,21,39,3,28,67,66,58,104,73,104,67,9,77,42,119,92,122,9,7,17,106,67,122,16,112,9,14,16,7,5,19,3,26,44,3,33,72,66,58,67,132,24,3,22,40,3,29,66,58,67,58,67,58,67,58,152,88,148,90,120,7,5,3,28,46,3,35,69,66,58,67,67,67,62,93,73,118,47,108,114,57,7,5,156,21,3,25,43,3,32,66,58,75,3,1,50,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_url.clas.abap"],"names":[],"mappings":";;AA8DA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;wDAGsC;IAEtC;;EAGA;;;;;;;IAEE,iBAAU,GAAP,QAAU,+CAAa,IAAI,cAAS,GAAP,QAAU,6CAAY,iBAAU,GAAP,QAAU,kDAAgB,CAAC;MAClF,eAAa,sBAAS;IACxB;IAEF;;EAGA;;;;;;;;;;QAEQ,0DAAmB;IAEzB;4EAGwC;MAEpC,yBAAG,QAAkB;;QAEnB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;yHACiC;QACjD;MACF;;;;;;;;;;;IAQJ;IAEF;;EAGA;;;;;;;QAEQ,0DAA4B;;IAKpC;;EAGA;;;;;;;;;;;;;IAIE,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;;MAGd,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;uHACiC;MACjD;IACF;EAEF;EAGA;;;;;;;QAGI,0DAAmB;QACnB,0DAAmB;QACnB,0DAAmB;QACnB,qDAAc;4FAKoB;IAEpC,yBAAG,QAAmB,yBAAI,QAAkB;qHACK;IACjD,gCAAO,QAAkB;MACvB,WAA2B,qBAAlB,0BAAQ,UAAY,gCAAC;MAC9B,iBAAqB,GAAlB,gDAAoB,qCAAG;QACxB,YAAU,mCAAe;MAC3B;IACF;IAEA,sJAA+C;IAEjD;;EAGA;;;;;;0EAGiC;EAEjC;AACF","file":"zcl_abapgit_url.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_user_record.clas.mjs":{"lineLengths":[53,36,31,32,51,37,574,382,614,188,49,344,170,196,199,281,17,42,22,51,305,3,26,52,3,33,68,81,73,69,9,193,142,142,41,17,22,44,83,61,13,16,20,9,7,90,54,7,22,5,36,79,63,66,69,278,60,1484,191,140,173,165,8,153,7,5,31,79,63,66,243,64,296,136,11,99,72,70,33,61,16,9,63,19,108,30,71,16,18,9,7,128,40,42,96,7,18,5,23,110,45,22,5,31,57,5,38,135,79,63,328,84,31,67,70,29,43,90,46,14,108,7,21,5,22,108,43,21,5,48,79,63,76,30,312,116,299,75,44,803,92,16,9,7,5,19,45,5,26,61,5,3,68,494,312,328,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_user_record.clas.abap"],"names":[],"mappings":";;AA+DA;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAGO,4DAA8B;;;;;;;;;;;;;;;;MAUnC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,aAAW,eAAe,MAAC,UAAS;MACtC;MAEF;;IAEA;;;;;;;UAEO,i8CAA0D;;;;;;wJAWA;MAC/D;IAEF;IAGA;;;UAGI,uDAA2B;UAC3B,wOAAqC;UACrC,qDAA4B;UAC5B,6RAAyB;UACzB,6HAA8C;MAGhD;kGAM8B;QAG1B;;;UAGE,YAAO,MAAC,WAAQ,OAAO,MAAC,OAAM;UAC9B;QACF;QAGA,YAAO,MAAC,UAAO,UAAU,MAAC,SAAQ;;;;;;;;MAItC;MAGA,yBAAG,YAAO,MAAC,gBAAoB,yBAAI,YAAO,MAAC,iBAAoB;QAC7D,OAAO,MAAC,UAAO,OAAO;QACtB,OAAO,MAAC,YAAS,OAAE;QACnB,qFAAiC;MACnC;MAEF;;IAGA;;MAEE,aAAW,YAAO,MAAC,MAAK;MAE1B;;IAGA;;;;;;;MAEE,IAAe,WAAsB;MAErC;;;;;yCAAoE;MACpE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,YAAU,WAAS,MAAC,OAAM;MAC5B;;MAIA;MAEF;;IAGA;;MAEE,YAAU,YAAO,MAAC,KAAI;MAExB;;IAGA;;;UAEY,iEAAoC,CAAA;;UAEzC,6SAAkC;MAEvC,IAAe,iBAA2C;MAG1D;;;QAKE;QAaA,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb;QACF;MACF;IAEF;IAGA;;;;MACE,sBAAM,+BAAO;IACf;EACF","file":"zcl_abapgit_user_record.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_utils.clas.mjs":{"lineLengths":[53,30,25,32,45,37,25,323,306,17,42,22,3,29,64,16,3,26,46,3,33,105,69,61,75,32,73,32,74,80,69,69,63,54,68,26,5,77,54,9,113,17,106,49,28,14,16,7,5,143,141,147,173,94,24,3,31,51,3,38,101,68,64,74,116,41,43,12,62,118,5,20,3,1,54,27,51],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_utils.clas.abap"],"names":[],"mappings":";;AAuBA;;;;;;;;;;;;;;;EAGE;;;;;;;QAUI,kEAAmC,CAAA;;QACnC,gEAAqC,CAAA;;QAEjC,iEAAoC;QACpC,uEAA+B;QAC/B,4DAA+B;QAC/B,4DAAqC;QACrC,sDAA+B;IAErC,YAAU,2BAAS,SAAS;IAC5B,iBAAW,GAAR,SAAU,gCAAC;MACZ;IACF;IAEA,YAAU,mBACE,MAAO,SACP,MAAO,mBAAmB;IAEtC,YAAU,oCAAgB;IAE1B;MACI,oBAAiB,qFAAsD;;;;;;;;IAK3E;IAEA,wIAAuF;IACvF,sIAAqF;;IAGrF,kBAA+C,sBAAN,wBAAzB,yBAA2B,mCAAM,0BAAQ,iBAAgB;IACzE,iBAAe,gCAAqB,GAAd,eAAgB,oBAAvB,CAA4C;IAE7D;;EAGA;;;;;;;QAIY,iEAC+E,CAAA;;IAEzF,yBAAG,SAAmB;MACpB,aAAW,sBAAS;IACtB;;MAEE,aAAW,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAClC;IAEF;;AACF","file":"zcl_abapgit_utils.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_version.clas.mjs":{"lineLengths":[53,32,27,32,47,37,25,294,271,797,1363,1646,298,17,42,22,3,29,64,16,3,40,62,3,47,608,70,610,76,70,61,76,79,83,13,5,76,79,83,13,5,76,79,83,13,5,59,13,5,47,76,95,81,7,85,183,81,7,86,273,81,7,5,173,79,5,3,24,46,3,31,65,64,52,64,52,602,52,602,52,610,610,9,49,31,14,79,7,49,31,14,79,7,17,106,55,25,14,16,7,5,54,53,12,11,99,55,19,108,58,27,16,18,9,7,5,21,3,36,58,3,43,608,48,67,250,247,70,110,82,25,88,24,5,107,67,32,11,52,74,49,81,49,81,49,9,19,118,146,16,18,9,7,5,82,25,88,24,5,107,67,32,50,72,51,71,79,57,7,5,270,142,5,22,3,26,48,3,33,70,70,70,78,71,81,68,70,73,72,75,127,107,56,118,5,45,24,5,33,58,133,5,22,3,35,57,3,42,66,70,70,52,52,54,131,212,22,3,43,65,3,50,70,79,97,76,80,102,88,161,5,150,176,138,5,148,113,53,63,23,90,39,14,294,7,24,5,3,60,29,53],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_version.clas.abap"],"names":[],"mappings":";;AAoDA;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;QAEa,6DAAqE,CAAA;;IAEhF,iBAAsB,GAAnB,YAAY,MAAC,QAAQ,UAAU,MAAC,OAAK;8EACI;IAC5C,wBAA0B,GAAnB,YAAY,MAAC,QAAQ,UAAU,MAAC,OAAK;MAC1C;IACF;IAEA,iBAAsB,GAAnB,YAAY,MAAC,QAAQ,UAAU,MAAC,OAAK;8EACI;IAC5C,wBAA0B,GAAnB,YAAY,MAAC,QAAQ,UAAU,MAAC,OAAK;MAC1C;IACF;IAEA,iBAAsB,GAAnB,YAAY,MAAC,QAAQ,UAAU,MAAC,OAAK;8EACI;IAC5C,wBAA0B,GAAnB,YAAY,MAAC,QAAQ,UAAU,MAAC,OAAK;MAC1C;IACF;IAEA,yBAAG,UAAU,MAAC,WAAoB;MAChC;IACF;IAEA,IACE,OAKA,AAKA,KAXG,UAAU,MAAC,UAAhB;;MAEI,iBAA0B,GAAvB,YAAY,MAAC,YAAY,oCAAE;gFACc;MAC5C;;MAGA,iBAA0B,GAAvB,YAAY,MAAC,YAAY,oCAAG,iBAA0B,GAAvB,YAAY,MAAC,YAAY,sCAAI;gFACnB;MAC5C;;MAGA,iBAA0B,GAAvB,YAAY,MAAC,YAAY,oCAAG,iBAA0B,GAAvB,YAAY,MAAC,YAAY,sCAAK,iBAA0B,GAAvB,YAAY,MAAC,YAAY,wCAAM;gFACtD;MAC5C;;IAIJ,iBAA0B,GAAvB,YAAY,MAAC,YAAY,UAAU,MAAC,WAAU,iBAAiC,GAA7B,YAAY,MAAC,kBAAkB,UAAU,MAAC,iBAAe;8EAClE;IAC5C;EAEF;EAGA;;;;;;;;;;;;;QAEQ,ylBAAqD;QACrD,ylBAAqD;IAE3D;MACI,yBAAG,eAAmB;QACpB,iBAAe,IAAI;MACrB;QACE,kBAAe,mDAA2B;MAC5C;MAEA,yBAAG,eAAmB;QACpB,iBAAe,IAAI;MACrB;QACE,kBAAe,mDAA2B;MAC5C;;;;;;;;IAIJ;IAEA,iBAAgB,GAAb,cAAe,aAAY;MAC5B,cAAY,+BAAC;IACf;MACE;kGAE0D;QACtD,cAAY,+BAAC;;;;;;;;MAIjB;IACF;IAEF;;EAGA;;;;;;;QAEQ,iPAAyC;QACzC,8OAAyC;QACzC,6DAAuB;IAE7B;IAEA;uBAA8C;IAC9C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IAEA;;;MAIE;QACI,IACE,OAEA,AAEA,KALG,eAAE,MAAC,MAAR;;UAEI,UAAU,MAAC,WAAQ,UAAU;;UAE7B,UAAU,MAAC,WAAQ,UAAU;;UAE7B,UAAU,MAAC,WAAQ,UAAU;;;;;;;;MAIrC;IAEF;IAEA;uBAA8C;IAC9C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IAEA;;;MAIE,IACE,OAGA,KAJG,eAAE,MAAC,MAAR;;QAEI,UAAU,MAAC,eAAY,UAAU;QACjC;;QAEA,UAAU,MAAC,qBAAkB,UAAU;;IAG7C;IAEA,iBAAwB,GAArB,UAAU,MAAC,YAAa,sCAAK,iBAAyB,GAArB,UAAU,MAAC,YAAa,wCAAO,iBAAyB,GAArB,UAAU,MAAC,YAAa,yCAAO;6IAC7B;IACzE;IAEF;;EAGA;;;;;;;QAII,qEAA4E,CAAA;;QAC5E,wEAAyE,CAAA;;QAErE,6DAA2B;QAC3B,gEAA2B;QAC3B,+DAA2B;QAC3B,kEAA2B;IAEjC;;IAKA,yBAAG,wBAA4B;;IAK/B;IAEA,yBAAG,aAAuB;MACxB;IACF;IAEA,eAAa,YAAY;IAEzB,yBAAG,0BAA8B;MAC/B,sCAAY,YAAW,sCAAI,0BAAqB,UAAU;IAC5D;IAEF;;EAGA;;;;;;;QAEQ,2CAA0B;QAC1B,2CAA0B;QAC1B,6CAA0B;IAEhC;IAGA,eAAkD,mBAAlB,mBAAV,wBAAT,SAAW,uCAAmB,wBAAT,SAAW,qCAAO,WAAU;IAEhE;;EAEA;;;;;;;QACQ,mEAAgC;QAChC,uEAAgC;IACtC,IAAe,cAAwB;IAEvC,iBAAuB,GAApB,qBAAuB,wCAAM;gKAC4D;IAC5F;IAEA;IACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,yBAAG,iBAA4B,yBAAG,qBAA+B;yIACb;IACrE;IAEA;;;;oBAAiE;MACjE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,eAAa,cAAY;MAC3B;qSAE4D;MAC5D;MACF;;EAEF","file":"zcl_abapgit_version.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml.clas.mjs":{"lineLengths":[53,28,23,32,43,37,203,203,381,148,150,151,154,163,226,171,231,299,153,165,17,42,22,106,127,305,72,55,57,63,79,3,29,71,73,63,78,38,16,3,22,121,67,112,141,5,49,123,12,173,5,3,22,66,58,145,124,124,118,121,67,86,112,153,67,107,47,5,51,164,170,148,102,5,140,149,3,36,130,64,70,440,59,138,5,77,3,39,67,61,67,232,59,134,5,135,74,3,23,66,105,76,105,124,127,144,85,115,122,85,54,18,3,1,50,81,45,82,46,85,52,93,68,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/xml/zcl_abapgit_xml.clas.abap"],"names":[],"mappings":";;AAgDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;IACE,kBAAc,uCAAkB;IAChC,qBAAc,mDAA2B;IACzC,qBAAc,WAAW;IAC3B;;EAGA;;;IAEE,iBAA4B,IAAzB,oDAA4B,gCAAC;4IACkB;IAClD;IAEA,yBAAG,iBAAsB;0HACkC;IAC3D;4KACgF;IAChF;EAEF;EAGA;;;QAEQ,wIAAoD;QACpD,mHAA6C;QAC7C,mHAA6C;QAC7C,6GAA0C;QAC1C,gHAA4C;IAGlD,4CAAW,iBAAiB;IAE5B,uBAAoB,yDAAiC;IACrD,gBAAa,0FAAkD;IAC/D,eAAY,oIAEqD;kEAC5B;IACrC,iBAAuB,IAApB,+CAAuB,gCAAC;8CACP;IACpB;kDAEoB;IAGpB,gBAAa,8IACqD;IAClE,gBAAa,oJAC2B;IACxC,iBAA4B,IAAzB,kDAA4B,oCAAqB,kCAAa;qGACb;IACpD;IAGA,gBAAW,MAAC,aAAW,mGAAiD;IACxE,gBAAW,MAAC,cAAU,2GAAyD;EAEjF;EAGA;;;QACO,6DAAsB;IAE3B,kbAE+C;IAE/C,yBAAG,2BAA0B;MAC3B,qCAAa,6FAAqC;IACpD;4EAE0C;EAE5C;EAGA;;;QAEO,0DAAmB;IAExB,kOAAgH;IAEhH,yBAAG,2BAA0B;MAC3B,kCAAU,4FAAoC;IAChD;IAEA,kCAAU,+FAAoE;yEAEvC;EAEzC;EAGA;;;;;QAGQ,mHAA4C;QAC5C,sHAA6C;QAC7C,uIAAmD;IAEzD,sBAAmB,yDAAiC;IAEpD,gBAAa,6FAAkD;IAE/D,iBAAc,mGACiD;oFACnB;qDAEtB;IAIxB;;AACF","file":"zcl_abapgit_xml.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_input.clas.mjs":{"lineLengths":[69,53,34,53,32,49,60,832,69,249,17,12,42,22,734,3,29,44,55,71,73,57,39,25,16,3,19,120,115,190,72,117,122,3,46,304,38,23,3,41,122,32,18,3,43,45,58,46,58,134,414,242,68,35,48,40,44,9,128,198,17,110,24,53,117,16,227,9,14,16,7,5,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/xml/zcl_abapgit_xml_input.clas.abap"],"names":[],"mappings":";;;AA2BA;;;;;;;;;;;;;EAGE;;;;;wDAEmC;sCAClB;wBACL;IAEZ;;EAGA;QAEQ,+GAAmC;QACnC,0GAAgC;+BAGtC,SAAU,oJACqD;IAC/D,aAAU,qDAA0B;oHAEW;yHACC;EAElD;EAGA;;IACE,gBAAc,gBAAW;IAC3B;;EAGA;;IACE,WAAS,eAAU;IACrB;;EAGA;;;;;QAEQ,6HAA4C;QAC5C,qZAAoC;IAE1C,IAAe,WAA8B;IAE7C,4CAAW,kBAAkB;IAE7B,sBAAM,OAAO;;IAGb,WAAS,MAAC,UAAO,OAAO;IACM,WAAS,MAAC,cAAvB,OAA4B;IAE7C;MACI;;;;;;;;;;;;;IAUJ;EAEF;AACF","file":"zcl_abapgit_xml_input.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_output.clas.mjs":{"lineLengths":[69,53,35,54,32,50,61,218,811,239,17,12,42,22,121,734,3,29,64,16,3,26,124,125,182,136,96,82,182,120,82,22,3,43,45,58,46,58,115,122,414,242,68,40,13,5,48,40,44,97,126,182,120,50,390,12,210,5,3,47,45,58,120,58,124,99,77,215,3,46,66,105,76,105,304,73,120,121,44,146,120,42,51,7,12,31,5,124,178,54,138,147,5,74,121,66,18,3,47,120,58,28,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/xml/zcl_abapgit_xml_output.clas.abap"],"names":[],"mappings":";;;AAsBA;;;;;;;;;;;;;;;;;;EAGE;;QAEQ,oHAAqC;IAG3C,gBAAa,gKAEK;IAElB,aAAU,qHAA4C;+FACd;iFACI;IAE5C,aAAU,mKAEU;uHAC2C;iFACnB;IAE9C;;EAGA;;;;;QAEQ,0GAAgC;QAChC,iHAAoC;QACpC,qZAAmC;IAEzC,IAAe,WAA8B;IAG7C,4CAAW,kBAAkB;IAE7B,yBAAG,QAAkB;MACnB;IACF;;IAGA,WAAS,MAAC,UAAO,OAAO;IACM,WAAS,MAAC,cAAvB,OAA4B;IAE7C,YAAS,+EAAsC;IAE/C;;IAKA,aAAU,qGAA2C;IACrD,yBAAG,kBAAgB;qYAEkE;IACrF;iNACkF;IAClF;EAEF;EAGA;;;;;QAEQ,mHAAsC;IAE5C,gBAAa,6EAAqC;4EAChB;sNAEyD;EAE7F;EAGA;;;;;;;QAEQ,+GAAmC;QACnC,gHAAmC;IAGzC,yBAAG,YAAiB;iCAClB,UAAW,qGAA2C;uHACN;MAChD,yBAAG,QAAkB;QACnB,aAAU,4BAAiB;MAC7B;IACF;MACE,YAAU,WAAM;IAClB;IAEA,YAAS,0GAA2C;iLAEe;IACnE,yBAAO,sBAAsB;yIAEwB;kJAEC;IACtD;yEAC+B;wHACgB;IAE/C,YAAS,gDAAsB;IAEjC;;EAGA;;;IACE,gBAAS,MAAM;EACjB;AACF","file":"zcl_abapgit_xml_output.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_pretty.clas.mjs":{"lineLengths":[53,35,30,32,50,37,25,571,17,42,22,3,29,64,16,3,22,47,3,29,66,66,58,109,88,113,104,73,104,105,126,145,124,121,124,127,67,58,68,81,112,143,91,107,70,27,22,14,124,7,5,51,116,112,146,54,18,3,1,64,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/xml/zcl_abapgit_xml_pretty.clas.abap"],"names":[],"mappings":";;AAqBA;;;;;;;;;;;;;;EAGE;;;;;;;;;;;;;QAEQ,gGAAqC;QACrC,qHAA8C;QAC9C,wIAAoD;QACpD,mHAA6C;QAC7C,gHAA4C;QAC5C,mHAA6C;QAC7C,sHAA8C;IAGpD,4CAAW,iBAAiB;IAE5B,aAAa,uCAAkB;IAC/B,gBAAa,8CAA2B;IAExC,uBAAoB,oDAAiC;IACrD,gBAAoB,0FAAkD;IACtE,eAAoB,0HAEqD;0FAClC;IACvC,iBAAuB,IAApB,+CAAuB,gCAAC;MACzB,iBAAoB,GAAjB,kBAAmB,uBAAS;QAC7B,WAAS,MAAM;QACf;MACF;2HACqD;MACrD;IACF;kDACoB;IAGpB,gBAAc,8FAAmD;IAEjE,iBAAc,yFACiD;iJAEE;qDAE3C;IAExB;;AACF","file":"zcl_abapgit_xml_pretty.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zip.clas.mjs":{"lineLengths":[53,28,23,32,43,37,166,392,985,1090,1619,2685,504,463,1084,295,17,42,22,43,3,29,64,16,3,29,47,3,36,69,1416,64,108,71,1224,73,67,36,164,94,5,45,19,3,23,41,3,30,69,1168,91,102,70,140,82,104,73,103,814,67,120,1414,134,77,113,185,160,5,159,119,40,161,78,5,63,19,3,30,48,3,37,107,82,108,82,114,103,124,595,69,71,49,1579,158,540,176,41,130,5,71,73,278,113,109,5,97,157,42,88,99,22,5,43,111,84,36,180,111,5,3,31,49,3,38,102,70,75,85,110,91,1168,140,158,70,78,67,76,70,88,77,97,39,155,210,140,251,122,3,25,43,3,32,66,58,67,58,71,70,72,125,90,121,7,75,112,7,12,56,30,5,52,3,21,39,3,28,889,69,61,62,20,3,31,49,3,38,889,61,247,102,65,68,540,79,31,88,13,5,119,88,13,5,79,23,178,13,5,149,42,67,36,63,47,14,7,5,61,112,69,38,90,7,5,3,44,62,3,51,71,73,74,76,178,3,27,45,3,34,889,69,61,108,69,275,540,73,9,46,41,17,22,44,76,61,13,16,20,9,7,90,121,7,79,41,13,86,45,21,26,48,80,88,65,17,20,24,13,11,94,129,11,55,141,46,124,9,114,56,24,7,5,54,79,25,49],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_zip.clas.abap"],"names":[],"mappings":";;AAgFA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,mGAAmC;QACnC,8DAAuB;IAE7B,IAAe,WAA+B;;;;MAM5C,sCAAY,WAAS,MAAC,KAAI,MAAC,8BAAO,WAAS,MAAC,KAAI,MAAC,oBAAc,WAAW;6FAE9B;IAC9C;IAEA,aAAU,0BAAe;IAE3B;;EAGA;;;;;;;;;;;;;;;;QAEO,+GAAwC;QACxC,63CAA2D;QAC3D,6HAA8C;;gHAGd;IAErC,iBAAiE,IAA9D,qIAAgE,wBAAU;+JACL;IACxE;;IAOA,YAAS,qGAGiB;IAE1B,sBAAK,YAAY;IAEjB,iBAAoB,IAAjB,6CAAmB,gCAAE,iBAAgB,GAAZ,aAAc,uBAAS;6EACP;IAC5C;IAEA,aAAU,4CAAsB;IAElC;;EAGA;;;;;;;;;;;QAEQ,0kBAAuD;QACvD,4DAA4B;QAC5B,8DAA4B;QAC5B,wCAAgC;QAChC,kiDAA2D;QAC3D,qJAA0D;IAEhE,IAAe,WAA0C;IAEzD,cAAW,4JAEuB;IAElC,yBAAG,SAAmB;iIACuC;IAC7D;IAEA,aAAa,MAAC,KAAI,MAAC,cAAW,QAAQ,MAAC,OAAM;IAC7C,aAAa,MAAC,KAAI,MAAC,cAAW,QAAQ,MAAC,SAAQ;IAE/C,mBAAgB,6PAIwB;IAExC,iBAAgC,GAA7B,yBAAO,aAAa,MAAC,UAAU,gCAAC;4GACM;IACzC;IAEA,sBAAmB,qEAAgD;4JAK/B;IACpC,yBAAG,UAAoB;MACrB;;;IACF;IAEA,4BAAU,SAAS;8GACwD;;;MAGzE,4KAA6D;8GAED;IAE9D;EAEF;EAGA;;;;;;;;;;QAEQ,uoCAAuE;QACvE,mIAAsD;QACtD,qJAA4D;QAC5D,6DAA8B;QAC9B,qEAA8B;QAC9B,0DAA8B;QAC9B,mEAA+B;IAErC,iBAAiB,MAAC,wBAAqB,iBAAiB;IAExD,oBAAiB,8DAAyC;4EACP;IAEnD,sBAAmB,qEAAgD;IAEnE,uBAAqB,UAAU;IAC/B,oJAA6D;IAC7D,4MAA+D;IAE/D,oBAAiB,kHAGoB;IAErC,aAAU,wOAG4B;yHAIR;EAChC;EAGA;;;;;;;;;;IAEE,iBAAU,GAAP,QAAU,qCAAG;;MAGd,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wHACkC;MAClD;MACA,iBAAW,GAAR,SAAW,qCAAG;QACf,sCAAY,sCAAI,kBAAa,OAAO;MACtC;IACF;MACE,YAAU,oCAAG;MACb,gBAAc,MAAM;IACtB;IACA;EAEF;EAGA;;;;;;;IAEE,cAAW,0CAAqB;IAElC;;EAGA;;;;;;QAGQ,8OAA8B;QAC9B,6FAAwB;QACxB,wDAAgB;QAChB,2DAA+B;IAErC,IAAe,WAA+B;IAG9C;6BAA+C;IAC/C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IAEA;IACA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IACA;qBAAyC;IACzC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAE,iBAAsB,GAAnB,0BAAQ,YAAa,gCAAC;MACxC;IACF;IAEA,sCAAY,sCAAI,UAAS,gDAAU,QAAQ;IAE3C,cAAY,sBAAS;;;MAEnB,kBAAsB,GAAf,WAAS,MAAC,OAAQ,SAAQ;QAC/B,cAAY,uBAAU;QACtB;MACF;IACF;IAEA,iBAAa,GAAV,WAAY,uBAAS;MACtB,cAA+B,qBAAnB,0BAAQ,WAAa,gCAAC;;;QAEhC,WAAS,MAAC,UAAO,WAAS,MAAC,oCAAc;MAC3C;IACF;EAEF;EAGA;;;;;;;;iLAI4B;EAE5B;EAGA;;;;;;;QAEQ,mGAA+B;QAC/B,4DAAoB;IAE1B,IAAe,cAAuC;IAAtD,IACe,WAAkC;;;6CAQZ;;;;;;;;;;;;MACrC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;wHACkC;MAClD;;;;qFAYmC;;;;;;;;;;;;;UACjC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;gIACsC;UACtD;;4IASsC;UAEtC,WAAS,MAAC,UAAO,OAAO;UAExB,WAAS,MAAC,WAAO,oFAA6C;QAEhE;;uDAI8C;QAEhD;;IACF","file":"zcl_abapgit_zip.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib.clas.mjs":{"lineLengths":[53,29,24,32,44,37,166,215,216,212,145,349,260,264,51,49,58,55,467,361,473,17,42,22,42,50,52,48,52,3,29,64,16,3,25,44,3,32,271,61,67,64,36,119,59,49,65,53,134,81,110,5,50,3,23,42,3,30,65,138,70,49,62,64,63,64,64,67,59,79,65,53,46,115,80,100,75,78,192,54,25,7,58,58,86,5,50,21,3,23,42,3,30,36,65,59,22,18,51,84,74,99,112,81,14,14,87,7,5,50,3,27,46,3,34,295,45,76,52,51,46,21,5,51,129,59,22,18,51,118,117,31,78,36,85,27,33,85,29,33,14,114,7,77,14,7,5,50,51,156,19,3,19,38,3,26,63,64,64,64,65,65,243,284,282,97,89,89,89,88,88,88,88,88,89,88,89,88,89,88,89,88,89,88,89,167,166,166,59,61,65,53,92,5,50,59,37,65,53,77,25,108,81,60,35,108,121,5,50,131,38,59,22,106,51,84,73,72,14,55,75,93,30,112,173,82,173,16,174,9,63,42,69,57,74,9,54,7,5,50,29,121,65,131,130,3,17,36,3,24,284,59,62,65,53,92,5,50,59,62,65,53,92,5,50,59,61,65,53,92,5,50,59,60,65,53,92,5,50,131,38,59,57,65,53,92,5,50,132,3,29,48,3,36,67,63,61,28,70,171,77,171,77,171,77,171,77,171,77,171,77,171,77,172,77,172,77,172,78,172,78,172,78,172,78,172,78,173,78,173,78,173,78,173,78,173,78,173,78,174,78,174,78,175,78,175,78,175,78,175,78,175,78,176,78,176,78,176,12,112,5,23,3,27,46,3,34,65,63,61,28,72,169,79,169,79,169,79,169,79,169,79,169,79,169,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,170,79,171,79,171,79,171,79,171,79,171,79,171,12,112,5,21,3,26,45,3,33,62,63,70,56,113,114,91,112,3,26,45,3,33,271,65,67,65,76,83,80,19,3,1,52,77,147,148,144,76,37,310,280,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zlib/zcl_abapgit_zlib.clas.abap"],"names":[],"mappings":";;AAwDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;QAMQ,0DAAkB;QAClB,uDAAkB;QAClB,2BAA2B;IAGjC,gBAAgC,qBAAlB,2BAAS,0BAAW,OAAO,MAAC,UAAQ;;;;;MAEhD,aAAwB,mBAAJ,qBAAT,eAAE,MAAC,OAAQ,iCAAI,YAAW;MACrC,SAAO,gEAAkB;MACzB,sCAAY,yBAAO,eAAU,uBAAmB;IAClD;;EAEF;EAGA;;;;;;;QAEQ,wCAAwB;QACxB,qDAAe;QACf,uDAAe;QACf,sDAAe;QACf,uDAAe;QACf,uDAAe;QACf,0DAAoB;;;;;MAIxB,WAAS,eAAE,MAAC,MAAK;MAEjB,YAAS,+FAAyB;MAClC,sCAAY,SAAQ,iBAAY,OAAO;MACvC,aAAU,+EAAgD;MAC1D,cAAW,qDAA+B;MAE1C,iBAAsB,GAAX,qBAAR,QAAU,WAAW,SAAQ;QAC9B,eAAY,uKAA2D;QACvE;;MACF;MACA,aAAoB,mBAAT,SAAW,SAAQ;MAC9B,aAAoB,mBAAT,SAAW,SAAQ;MAC9B,aAAoB,wBAAT,SAAW,gCAAC;IACzB;;IAEF;;EAGA;;;;QAEO,2BAAW;QACX,wDAAgB;;;;;MAGnB,eAAY,6DAAoB;MAEhC,iBAAa,GAAV,WAAY,kCAAG;QAChB,UAAO,+EAAiD;QACxD,sCAAY,yBAAO,eAAU,uBAAmB;MAClD,wBAAiB,GAAV,WAAY,kCAAG;QACpB;MACF;sFACoC;MACpC;IAEF;;EAEF;EAGA;;;;;;;QAEQ,2CAAyB;QACzB,0CAAyB;IAG/B,yBAAG,cAAwB;MACzB;IACF;IAEA,sBAAM,uBAAM;;;;;;MAMV,eAAY,+FAAyB;MAErC,cAAW,+FAAyB;MACpC,IACE,OAEA,AAGA,KANG,QAAL;;mCAEqB;;0BAET;gCACM;;4BAEJ;gCACI;;QAEd,oCAAS,GAAF,iCAAI,gCAAC;;MAGhB,iBAAa,GAAV,WAAY,qCAAG;QAChB;MACF;IAEF;;IAEA,OAAO,MAAC,SAAM,uBAAM;IACpB,OAAO,MAAC,qBAA0C,qBAAzB,2BAAS,gBAAkB,oDAAuB;IAE7E;;EAGA;;;;QAEQ,sDAAiB;QACjB,uDAAiB;QACjB,uDAAiB;QACjB,uDAAiB;QACjB,wDAAiB;QACjB,wDAAiB;QACjB,0OAA0B;QAC1B,mRAAoD;QACpD,iRAAoD;IAE1D,IAAe,aAAmC;IAGlD,gCAAO,0CAAM,QAAQ;IACrB,gCAAO,0CAAM,QAAQ;IACrB,gCAAO,0CAAM,QAAQ;IACrB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,0CAAM,QAAQ;IACrB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,0CAAM,QAAQ;IACrB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,0CAAM,QAAQ;IACrB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,0CAAM,QAAQ;IACrB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,0CAAM,QAAQ;IACrB,gCAAO,yCAAK,QAAQ;IACpB,gCAAO,0CAAM,QAAQ;IAErB,YAAmC,oBAAzB,+FAA2B,kCAAG;IACxC,aAAoC,oBAAzB,+FAA2B,gCAAC;IACvC,aAAoC,oBAAzB,+FAA2B,gCAAC;;;;;MAGrC,gCAAO,yCAAK,UAAU;IACxB;;;;;;MAGE;uBAAgD;MAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,aAAoB,mBAAT,SAAW,gCAAC;MACvB;iCAA0D;MAC1D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,mBAAc,8FAAwB;IACxC;;;IAMA,sBAAM,UAAU;IAChB,oBAA0B,GAApB,yBAAO,cAAuB,mBAAR,QAAU;;;;MACpC,eAAY,6DAAoB;MAEhC,iBAAa,GAAV,WAAY,iCAAE;QACf,gCAAO,mBAAa,UAAU;MAChC;QACE,cAAY,+BAAC;QACb,iBAAa,GAAV,WAAY,iCAAE;UACf;4BAA8D;UAC9D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACnB,cAAqC,oBAAzB,+FAA2B,gCAAC;QAC1C,wBAAiB,GAAV,WAAY,iCAAE;UACnB,cAAqC,oBAAzB,+FAA2B,gCAAC;QAC1C;UACE,cAAqC,oBAAzB,+FAA2B,iCAAE;QAC3C;;;;;UAEE,gCAAO,mBAAa,UAAU;QAChC;;MACF;IACF;;IAEA,aAAW,UAAU;;;;;EAYvB;EAGA;;;;QAEQ,mRAAoD;;;;;MAIxD,gCAAO,yCAAK,UAAU;IACxB;;;;;;MAEE,gCAAO,yCAAK,UAAU;IACxB;;;;;;MAEE,gCAAO,yCAAK,UAAU;IACxB;;;;;;MAEE,gCAAO,yCAAK,UAAU;IACxB;;;IAMA,sBAAM,UAAU;;;;;MAEd,gCAAO,yCAAK,UAAU;IACxB;;;EAMF;EAGA;;;;;;;IAEE,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KA3DG,OAAL;;MAEI,gBAAuC,oBAAzB,+FAA2B,gCAAC;;MAE1C,gBAAuC,oBAAzB,+FAA2B,gCAAC;;MAE1C,gBAAuC,oBAAzB,+FAA2B,gCAAC;;MAE1C,gBAAuC,oBAAzB,+FAA2B,gCAAC;;MAE1C,gBAAuC,oBAAzB,+FAA2B,gCAAC;;MAE1C,gBAAuC,oBAAzB,+FAA2B,gCAAC;;MAE1C,gBAAuC,oBAAzB,+FAA2B,gCAAC;;MAE1C,gBAAuC,oBAAzB,+FAA2B,iCAAE;;MAE3C,gBAAuC,oBAAzB,+FAA2B,iCAAE;;MAE3C,gBAAuC,oBAAzB,+FAA2B,iCAAE;;MAE3C,gBAAuC,oBAAzB,+FAA2B,iCAAE;;MAE3C,gBAAuC,oBAAzB,+FAA2B,iCAAE;;MAE3C,gBAAuC,oBAAzB,+FAA2B,iCAAE;;MAE3C,gBAAuC,oBAAzB,+FAA2B,iCAAE;;MAE3C,gBAAuC,oBAAzB,+FAA2B,kCAAG;;MAE5C,gBAAuC,oBAAzB,+FAA2B,kCAAG;;MAE5C,gBAAuC,oBAAzB,+FAA2B,kCAAG;;MAE5C,gBAAuC,oBAAzB,+FAA2B,kCAAG;;MAE5C,gBAAuC,oBAAzB,+FAA2B,kCAAG;;MAE5C,gBAAuC,oBAAzB,+FAA2B,kCAAG;;MAE5C,gBAAuC,oBAAzB,+FAA2B,mCAAI;;MAE7C,gBAAuC,oBAAzB,+FAA2B,mCAAI;;MAE7C,gBAAwC,oBAA1B,gGAA4B,mCAAI;;MAE9C,gBAAwC,oBAA1B,gGAA4B,mCAAI;;MAE9C,gBAAwC,oBAA1B,gGAA4B,mCAAI;;MAE9C,gBAAwC,oBAA1B,gGAA4B,mCAAI;;MAE9C,gBAAwC,oBAA1B,gGAA4B,mCAAI;;MAE9C,gBAAwC,oBAA1B,gGAA4B,oCAAK;;MAE/C,gBAAwC,oBAA1B,gGAA4B,oCAAK;;MAE/C,gBAAwC,oBAA1B,gGAA4B,oCAAK;;MAE/C,oCAAS,GAAF,iCAAI,gCAAC;;IAGlB;;EAGA;;;;;;;IAEE,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KAzDG,OAAL;;MAEI,cAAqC,oBAAzB,+FAA2B,gCAAC;;MAExC,cAAqC,oBAAzB,+FAA2B,gCAAC;;MAExC,cAAqC,oBAAzB,+FAA2B,gCAAC;;MAExC,cAAqC,oBAAzB,+FAA2B,gCAAC;;MAExC,cAAqC,oBAAzB,+FAA2B,gCAAC;;MAExC,cAAqC,oBAAzB,+FAA2B,gCAAC;;MAExC,cAAqC,oBAAzB,+FAA2B,gCAAC;;MAExC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,iCAAE;;MAEzC,cAAqC,oBAAzB,+FAA2B,kCAAG;;MAE1C,cAAqC,oBAAzB,+FAA2B,kCAAG;;MAE1C,cAAqC,oBAAzB,+FAA2B,kCAAG;;MAE1C,cAAqC,oBAAzB,+FAA2B,kCAAG;;MAE1C,cAAqC,oBAAzB,+FAA2B,kCAAG;;MAE1C,cAAqC,oBAAzB,+FAA2B,kCAAG;;MAE1C,oCAAS,GAAF,iCAAI,gCAAC;;IAGlB;;EAGA;;;;QAEQ,qDAAc;QACd,sDAAuB;QACxB,6DAAqB;uDAGF;IAExB,YAAS,+FAAyB;IAClC,aAAU,+FAAyB;IAEnC,cAAW,uEAA+B;IAC1C,sCAAY,yBAAO,mBAAc,uBAAmB;EAEtD;EAGA;;;;;;;QAEQ,wDAAgB;IAGtB,OAAO,MAAC,aAAS,4CAAuB;IAExC,eAAY,8DAAqB;IACjC,OAAO,MAAC,eAAW,8CAAyB;IAE9C;;AACF","file":"zcl_abapgit_zlib.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_convert.clas.mjs":{"lineLengths":[53,37,32,32,52,37,25,256,240,263,17,42,22,3,29,64,16,3,28,55,3,35,62,45,58,47,67,25,59,22,53,51,24,82,50,50,5,50,18,3,28,55,3,35,67,38,55,36,47,62,68,23,59,22,52,51,23,61,62,67,55,48,51,80,7,52,48,5,50,19,3,27,54,3,34,68,62,58,36,21,21,18,3,1,68,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zlib/zcl_abapgit_zlib_convert.clas.abap"],"names":[],"mappings":";;AA4BA;;;;;;;;;;;;;;;;EAGE;;;;;;;QAEQ,sCAAuB;QACvB,0DAAmB;IAEzB,YAAU,OAAO;IAEjB,4BAAU;;;;MACR,SAAO,OAAO;MACd,WAAgB,wBAAP,OAAS,gCAAC;MACnB,WAAgB,mBAAP,OAAS,KAAI;MACtB,YAAU,8BAAS;IACrB;;IAEF;;EAGA;;;;;;;QAEQ,2BAAsB;QACtB,sCAAsB;QACtB,qDAAa;QACb,2DAAmB;IAGzB,WAAS,MAAM;IACf,4BAAU;;;;MACR,SAAO,MAAM;;;;;QAEX,WAAS,eAAE,MAAC,MAAK;QACjB,uBAAQ,QAAU,MAAU,IAAI;QAChC,sCAAY,SAAQ,eAAU,OAAO;MACvC;;MACA,WAAS,6BAAQ;IACnB;;IAEF;;EAGA;;;;;;;QAEQ,2BAAW;IAGjB,SAAO,MAAM;IACb,WAAS,IAAI;IAEf;;AACF","file":"zcl_abapgit_zlib_convert.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_huffman.clas.mjs":{"lineLengths":[53,37,32,32,52,37,344,324,143,395,259,261,17,42,22,247,248,56,3,29,284,70,64,244,65,63,64,97,97,92,59,63,65,53,95,5,50,69,30,71,17,7,63,30,108,81,5,89,59,129,65,53,82,25,108,56,67,5,50,59,66,65,53,96,5,50,59,66,65,53,48,60,26,108,72,17,7,60,35,108,121,35,108,88,91,5,50,16,3,26,64,64,64,61,23,20,3,27,64,64,64,62,23,20,3,1,68,82,43,301,34,58],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zlib/zcl_abapgit_zlib_huffman.clas.abap"],"names":[],"mappings":";;AAkCA;;;;;;;;;;;;;;;;;EAGE;;;QAEQ,uDAAgB;QAChB,2OAAyB;QACzB,wDAAiC;QACjC,sDAAgB;QAChB,uDAA+B;IAErC,IAAe,aAAkC;IAAjD,IACe,aAAkC;IADjD,IAEe,QAAmC;;;;;MAIhD,gCAAO,yCAAK,aAAQ;IACtB;;;;MAEE,iBAAY,GAAT,UAAW,gCAAC;QACb;MACF;MACA;4BAAmD;MACnD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,aAAgB,mBAAP,SAAS,gCAAC;IACrB;IAIA,gCAAO,yCAAK,SAAS;;;;;MAEnB;uBAAgD;MAChD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,YAAkB,mBAAR,QAAU,SAAQ;MAC5B,gCAAO,iBAAW,SAAS;IAC7B;;;;;;MAGE,gCAAO,yCAAK,cAAS;IACvB;;;;;;MAEE,aAAW,eAAE,MAAC,MAAK;MACnB;wBAAmD;MACnD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,iBAAa,GAAV,WAAY,gCAAC;QACd;MACF;MACA;iCAA0D;MAC1D,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB;iCAAgE;MAChE,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACnB,kBAAuB,qBAAT,SAAW,gCAAC;MAC1B,kBAA0B,mBAAZ,cAAc,gCAAC;IAC/B;;IAEF;;EAGA;;;;IACE;qBAAgD;IAClD;;EAGA;;;;IACE;qBAAiD;IACnD;;AACF","file":"zcl_abapgit_zlib_huffman.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_stream.clas.mjs":{"lineLengths":[53,36,31,32,51,37,165,153,180,263,257,156,267,55,17,42,22,68,76,3,22,40,3,29,69,61,36,16,3,21,65,119,21,3,26,67,65,67,63,64,36,59,22,77,51,47,60,103,74,7,87,79,88,44,14,93,135,69,7,5,50,19,3,27,70,65,67,68,78,20,3,25,62,65,67,136,18,3,1,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zlib/zcl_abapgit_zlib_stream.clas.abap"],"names":[],"mappings":";;AA0CA;;;;;;;;;;;;;;;;;;EAGE;IACE,sBAAM,YAAO;EACf;EAGA;;;IAEE,uBAAgB,OAAO;IAEzB;;EAGA;;IAEE,cAAqC,mBAAzB,2BAAS,qBAAkB,gCAAC;IAE1C;;EAGA;;;;QAEQ,sDAAe;QACf,uDAAe;QACf,2BAAwB;IAG9B,oBAAwB,GAAlB,0BAAQ,WAAY;;;;MACxB,yBAAG,aAAkB;QACnB,SAAO,yCAAgB;QACvB,kBAAU,2EAA6C;QACvD,uBAAgB,yCAAe;MACjC;MACA,YAAoB,qBAAV,UAAY,0BAAQ,UAAS;MACvC,iBAAW,GAAR,SAAW,0BAAQ,eAAS;QAC7B,sCAAY,cAAQ,kBAAa,OAAO;QACxC,sBAAM,YAAO;MACf;QACE,aAA6B,qBAAlB,0BAAQ,eAAY,QAAO;QACtC,sCAAY,6DAA0B,kBAAa,OAAO;QAC1D,iBAAU,0CAAiB;MAC7B;IAEF;;IAEF;;EAGA;;;;IAEE,aAAW,iDAAwB;IACnC,uBAAgB,iDAAuB;IAEzC;;EAGA;;;;IAEE,YAAS,sHAA+D;IAE1E;;AACF","file":"zcl_abapgit_zlib_stream.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_ajson_error.clas.mjs":{"lineLengths":[69,53,36,55,32,51,80,191,144,145,167,167,167,167,578,438,594,1465,350,252,17,12,42,22,94,68,69,91,91,91,91,105,410,67,3,29,344,58,102,64,93,46,67,61,68,64,90,46,90,46,90,46,90,46,51,29,39,41,29,29,29,29,48,39,80,12,47,5,16,3,22,48,3,29,66,58,71,73,46,58,128,98,78,19,3,29,71,73,46,58,444,71,66,96,96,54,35,57,118,118,79,66,7,5,54,127,12,31,5,23,35,33,33,33,33,3,1,66,517,62,63,62,62,62,62,532,77,78,75,75,75,75,112,470,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcx_abapgit_ajson_error.clas.abap"],"names":[],"mappings":";;;AAkEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGA;;;;;;;;;;;;;;;;;;;;IAKA,OAAE,OAAE,OAAK,EAAG;IACZ,OAAE,OAAE,YAAU,OAAQ;IACtB,OAAE,OAAE,aAAW,QAAS;IACxB,OAAE,OAAE,OAAK,EAAG;IACZ,OAAE,OAAE,OAAK,EAAG;IACZ,OAAE,OAAE,OAAK,EAAG;IACZ,OAAE,OAAE,OAAK,EAAG;IACZ,sBAAM,OAAE,OAAE,MAAM;IAChB,yBAAG,OAAiB;MAClB,iCAA0B,uCAAgB;IAC5C;MACE,iCAA0B,MAAM;IAClC;IACA;;EAGA;;;;;;;;;;QAEO,uHAAsC;;6EAKlB;IACzB;EAEF;EAGA;;;;;QAEO,mbAA4B;QAC5B,8DAAuB;QACvB,yDAAkB;IACvB,IAAc,QAAkB;IAChC,IAAc,QAAkB;IAEhC,yBAAG,sBAA0B;MAC3B,gBAAc,WAAW;IAC3B,gCAAO,kBAAsB;MAC3B,6GAAsD;MACtD,6GAAsD;MACtD,0BAAG,SAAmB,0BAAI,SAAkB;QAC1C,sCAAc,SAAU,SAAM;MAChC;IACF;IAEA,yBAAG,sBAA0B;MAC3B,iCAAS,sFAA8B;IACzC;MACE,WAAS,YAAO;IAClB;IAEA,WAAS,MAAM;IAEf,kBAAW,WAAW;IACtB,YAAW,MAAM,MAAC,GAAE;IACpB,YAAW,MAAM,MAAC,GAAE;IACpB,YAAW,MAAM,MAAC,GAAE;IACpB,YAAW,MAAM,MAAC,GAAE;EAEtB;AACA","file":"zcx_abapgit_ajson_error.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_cancel.clas.mjs":{"lineLengths":[81,53,31,56,32,46,106,25,1373,17,12,42,22,3,29,344,58,102,64,117,49,93,55,93,55,93,55,93,55,46,61,137,48,39,103,12,47,5,16,3,1,56,28,52],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcx_abapgit_cancel.clas.abap"],"names":[],"mappings":";;;AAwBA;;;;;;;;;;;EAGE;;;;;;;;;;;;;;;;;wIAQyB;IAEvB,sBAAM,OAAE,OAAE,MAAM;IAEhB,yBAAG,OAAiB;MAClB,iCAA0B,gCAAiB,8BAAc;IAC3D;MACE,iCAA0B,MAAM;IAClC;IACF;;AACF","file":"zcx_abapgit_cancel.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_exception.clas.mjs":{"lineLengths":[69,53,34,53,32,49,80,162,170,170,170,170,148,588,197,414,415,156,438,594,596,58,555,454,669,272,287,526,1246,291,1354,63,68,17,12,42,22,43,94,94,94,94,72,512,121,105,410,63,65,73,3,29,344,58,102,64,117,49,93,55,93,55,93,55,93,55,46,61,51,35,35,35,35,25,35,48,39,103,12,47,5,32,16,3,36,72,73,72,73,67,70,347,88,36,88,59,55,51,12,122,5,3,33,351,103,78,126,9,179,128,227,41,17,22,44,61,13,16,20,9,7,90,151,52,57,25,94,129,11,153,54,59,27,96,131,13,155,56,61,29,98,133,15,157,58,63,31,100,135,17,15,28,13,50,76,120,101,131,72,69,45,88,103,22,106,73,15,154,90,15,28,13,40,79,361,68,87,42,287,258,79,361,117,79,77,210,215,33,197,53,54,51,63,165,60,99,65,26,100,63,19,17,79,124,27,17,88,15,205,154,218,78,41,100,43,24,160,17,15,31,13,32,56,13,39,55,68,115,83,130,68,59,80,77,50,71,22,37,15,65,106,13,37,61,13,44,108,74,115,88,74,115,106,74,115,106,74,115,106,74,115,106,74,115,130,68,115,83,59,80,359,52,52,84,84,84,84,51,51,15,247,113,30,13,42,66,13,49,115,83,59,80,143,13,47,79,89,77,83,361,65,104,99,22,83,15,13,54,78,13,61,79,79,77,39,216,160,218,162,31,13,57,170,65,50,98,90,115,100,110,95,109,94,15,13,36,357,195,144,106,86,51,418,104,24,24,17,15,13,46,70,13,53,380,77,71,380,94,66,66,66,66,201,33,28,13,11,72,88,361,72,92,81,92,362,75,95,85,83,103,100,540,85,86,83,83,83,83,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/zcx_abapgit_exception.clas.abap"],"names":[],"mappings":";;;AA0IA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;;;;;;;kDAE2C;IAEzC,OAAE,OAAE,UAAQ,KAAK;IACjB,OAAE,OAAE,UAAQ,KAAK;IACjB,OAAE,OAAE,UAAQ,KAAK;IACjB,OAAE,OAAE,UAAQ,KAAK;IACjB,gBAAS,GAAG;IACZ,qBAAc,QAAQ;IAEtB,sBAAM,OAAE,OAAE,MAAM;IAEhB,yBAAG,OAAiB;MAClB,iCAA0B,gCAAiB,8BAAc;IAC3D;MACE,iCAA0B,MAAM;IAClC;+BAEiB;IAEnB;;EAGA;;;;;;;IAEE,IAAe,gBAAwC;IAEvD;kCAC+B;IAC/B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;MACb,iBAAe,gBAAc,MAAC,YAAW;MACzC,iBAAe,gBAAc,MAAC,QAAO;MACrC,gBAAe,gBAAc,MAAC,KAAI;IACpC;yHAKkC;IAClC;EAEF;EAGA;;QAEQ,8FAAyB;IAE/B,IAAc,WAAkB;IAEhC,sCAAc,4BAAuB,MAAC,OAAS,4BAAuB,MAAC,OAAK;;;;;;;;;;;;;;;MAa5E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb;;;sBAAuD;UACvD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;YACb,kHAAgE;UAClE;UACA;;;wBAAuD;YACvD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACb,kHAAgE;YAClE;YACA;;;0BAAuD;cACvD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;gBACb,kHAAgE;cAClE;cACA;;;4BAAuD;gBACvD,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;kBACb,kHAAgE;gBAClE;cACF;cAEF;;YAGA;;;;kBACQ,gHAA4D,CAAA;;cAElE,yBAAG,2BAA0B;gBAC3B,WAAS,gBAAW;cACtB,gCAAO,uCAAsC;gBAC3C,YAAS,yEAAyC;cACpD;gBACE,YAAS,4EAAwC;gBACjD,iCAA+B,sBAAS;cAC1C;cAEA,iBAAgC,GAA7B,8BAA+B,wBAAW,iBAAsB,GAAlB,mBAAoB,wBAAU;gBAC7E,YAAS,4DAAqC;cAChD;cACF;;YAGA;;;;kBAEa,oEAAwC,CAAA;;kBAGjD,4QAAmC;kBACnC,+OAAmC;kBACnC,4DAAqC;kBACrC,sVAA6B;kBAC7B,kGAA6B;kBAC7B,4DAA8B;kBAC9B,0DAA8B;cAEhC,IAAe,kBAAgC;cAA/C,IACe,uBAAgC;cAE/C,WAAS,MAAM;;;gBAOb,sBACE,cAAc;gBADhB,sBAEE,WAAW;gBAEb,kBAAgB,eAAE,MAAC,MAAK;;;kBAKtB,iBAAkC,GAA/B,uBAAqB,MAAC,WAAW,kBAAiB;oBACnD,gBAAc,eAAE,MAAC,MAAK;oBACtB;kBACF,gCAAO,uBAAqB,MAAC,kBAAqB;oBAChD,mBAAiB,sBAAS;kBAC5B;gBAEF;gBAEA,iBAAkB,GAAf,gBAAiB,wBAAU;2HAMA;kBAC5B;gBACF;uFAEoE;cAEtE;;;;;;gBAYE,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;kBACb,cAAY,SAAS;gBACvB;kBACE,sCAAY,WAAU,oBACL,SACuC;gBAC1D;cAEF;cAEF;;YAGA;;;;;;;;;;;;kBAEO,0DAAmB;cAExB,yBAAG,QAAkB;gBACnB,YAAU,yCAAmB;cAC/B;gBACE,YAAU,OAAO;cACnB;gEAE8B;yGAKD;YAE/B;YAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBACQ,oVAA4B;cAElC,WAAW,MAAC,WAAQ,QAAQ;cAC5B,WAAW,MAAC,WAAQ,QAAQ;cAC5B,WAAW,MAAC,WAAQ,wCAAO;cAC3B,WAAW,MAAC,WAAQ,wCAAO;cAC3B,WAAW,MAAC,WAAQ,wCAAO;cAC3B,WAAW,MAAC,WAAQ,wCAAO;cAE3B,yBAAG,SAAmB;gBACpB,sBAAM,WAAW;cACnB;cAEA;;;YAUF;YAGA;;;;;;;;8IAI+B;YAC/B;YAGA;;;;;;;cACE,yBAAG,aAAoB,eAAkB,yBAAO,SAAQ;;cAExD;;cAEA;YACF;YAGA;;;;;;;cACE,cAAY,SAAS;cAErB,uMAAqF;cACrF,+IAA8E;cAC9E,yMAAuF;cACvF,iJAAgF;cAClF;;YAGA;;;cAEE,IACE,OAEA,AAEA,AAEA,KAPG,MAAM,MAAC,OAAZ;;gBAEI,MAAM,MAAC,YAAS,oCAAc,MAAC,MAAK;;gBAEpC,MAAM,MAAC,YAAS,oCAAc,MAAC,gBAAe;;gBAE9C,MAAM,MAAC,YAAS,oCAAc,MAAC,WAAU;;gBAEzC,MAAM,MAAC,YAAS,oCAAc,MAAC,UAAS;;YAG9C;YAGA;cAEE,IAAe,gBAAwC;;;;;;gBAcrD,iBAA8B,GAA3B,gBAAc,MAAC,oEAClB,iBAA4B,GAAzB,gBAAc,MAAC,YAAY,8CAC9B,iBAA4B,GAAzB,gBAAc,MAAC,YAAY,2CAC9B,iBAA4B,GAAzB,gBAAc,MAAC,YAAa,sCAAQ;;gBAEvC;kBACE;gBACF;cAEF;YAEF;YAGA;;;;;;;kBAEO,yWAAiB;6FAE8B;cACpD,MAAM,MAAC,WAAQ,eAAE,MAAC,MAAK;cACvB,MAAM,MAAC,WAAQ,eAAE,MAAC,MAAK;cACvB,MAAM,MAAC,WAAQ,eAAE,MAAC,MAAK;cACvB,MAAM,MAAC,WAAQ,eAAE,MAAC,MAAK;cAGvB,wLAAmF;cAEnF,WAAS,MAAM;cAEjB;;UACF","file":"zcx_abapgit_exception.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_not_found.clas.mjs":{"lineLengths":[69,53,34,53,32,49,62,25,304,17,12,42,22,3,29,50,58,102,64,67,16,3,1,62,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/zcx_abapgit_not_found.clas.abap"],"names":[],"mappings":";;;AAkBA;;;;;;;;;;;EAGE;;;;;kEAGyB;IACzB;;AACF","file":"zcx_abapgit_not_found.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_intf_v1.intf.mjs":{"lineLengths":[36,31,32,956,22,1,66,897,84,89,103,105,95,95,95,126,4906,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_aff_intf_v1.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_oo_types_v1.intf.mjs":{"lineLengths":[40,35,32,25,22,1,445,608,1475,1697,906,1127,4035,37,61],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_aff_oo_types_v1.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_registry.intf.mjs":{"lineLengths":[37,32,32,25,321,1,68,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_aff_registry.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_type_mapping.intf.mjs":{"lineLengths":[41,36,32,25,390,221,1,76,38,62],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_aff_type_mapping.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_aff_types_v1.intf.mjs":{"lineLengths":[37,32,32,554,517,422,1167,343,22,1,68,498,103,103,112,482,99,99,108,387,105,114,1132,83,84,89,93,86,88,97,90,86,87,307,81,81,131,152,164,160,139,142,139,169,519,525,507,403,511,266,122,118,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_aff_types_v1.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ajson.intf.mjs":{"lineLengths":[30,25,32,1236,144,143,145,230,394,393,50,222,365,375,593,189,297,460,260,305,301,264,261,258,298,267,319,289,479,49,693,319,410,408,427,421,461,322,320,466,403,264,1,54,95,58,94,82,95,55,517,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_ajson.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ajson_filter.intf.mjs":{"lineLengths":[37,32,32,455,1132,1,68,398,80,79,80,392,124,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_ajson_filter.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ajson_mapping.intf.mjs":{"lineLengths":[38,33,32,25,390,372,972,1,408,699,306,602,380,35,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_ajson_mapping.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ajson_types.intf.mjs":{"lineLengths":[36,31,32,720,22,1,66,661,84,82,82,81,83,85,119,756,988,1153,314,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_ajson_types.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_apack_definitions.intf.mjs":{"lineLengths":[42,37,32,178,205,194,196,22,1,78,132,108,180,101,169,107,170,109,1281,1511,143,1389,2837,3065,39,63],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_apack_definitions.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_auth.intf.mjs":{"lineLengths":[29,24,32,659,466,1,52,586,79,83,87,103,107,113,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_auth.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_background.intf.mjs":{"lineLengths":[35,30,32,25,189,605,930,1,370,529,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_background.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_code_inspector.intf.mjs":{"lineLengths":[39,34,32,25,1727,198,163,217,629,1,1215,1364,327,549,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_code_inspector.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_comparator.intf.mjs":{"lineLengths":[35,30,32,25,636,1,272,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_comparator.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_cts_api.intf.mjs":{"lineLengths":[32,27,32,414,259,248,861,357,1483,463,309,322,850,907,223,1,58,348,83,82,80,85,82,214,89,91,202,79,79,297,538,29,53],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_cts_api.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_data_config.intf.mjs":{"lineLengths":[36,31,32,172,153,145,541,704,980,914,689,978,690,1,66,114,77,116,77,108,69,503,83,83,83,83,126,610,839,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_data_config.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_data_deserializer.intf.mjs":{"lineLengths":[42,37,32,25,1038,2724,6928,1,1390,1546,39,63],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_data_deserializer.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_data_serializer.intf.mjs":{"lineLengths":[40,35,32,25,1178,1,74,37,61],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_data_serializer.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_data_supporter.intf.mjs":{"lineLengths":[39,34,32,25,461,1,336,492,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_data_supporter.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_definitions.intf.mjs":{"lineLengths":[36,31,32,575,326,671,171,147,150,151,5167,144,143,177,176,189,524,311,22,1,66,517,82,83,84,83,289,80,77,77,77,634,80,77,80,79,77,134,67,110,68,113,82,114,105,5130,96,94,98,110,112,102,92,92,109,100,102,130,116,102,120,106,110,120,88,96,92,92,112,94,98,92,94,104,94,88,106,106,106,104,100,100,100,92,92,86,90,86,86,92,86,82,98,106,96,96,88,108,90,96,94,112,94,88,80,100,90,78,94,100,102,104,96,90,98,90,88,86,90,106,96,107,88,106,86,140,63,139,62,152,67,487,76,75,79,77,273,95,95,104,307,321,613,835,850,1213,1440,1477,120,136,1101,1425,321,224,325,602,4595,711,320,625,850,541,910,611,832,1073,1384,1318,3702,396,617,486,790,382,877,1250,403,504,2096,2321,1349,645,701,728,960,142,645,624,141,377,128,120,1760,2002,340,332,749,589,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_definitions.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_dot_abapgit.intf.mjs":{"lineLengths":[36,31,32,357,427,22,1,66,299,90,86,88,389,103,102,120,105,377,604,1975,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_dot_abapgit.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ecatt.intf.mjs":{"lineLengths":[30,25,32,25,22,1,184,107,115,114,120,112,502,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_ecatt.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ecatt_download.intf.mjs":{"lineLengths":[39,34,32,25,190,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_ecatt_download.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_ecatt_upload.intf.mjs":{"lineLengths":[37,32,32,25,190,1,68,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_ecatt_upload.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_environment.intf.mjs":{"lineLengths":[36,31,32,25,223,193,214,205,203,206,415,693,223,1,402,601,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_environment.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_exit.intf.mjs":{"lineLengths":[29,24,32,25,597,287,202,386,314,261,259,584,377,1209,327,944,1999,725,674,196,320,627,6897,1821,1246,222,4666,485,1,340,497,282,189,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_exit.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_field_rules.intf.mjs":{"lineLengths":[36,31,32,764,670,360,502,1,66,705,81,81,86,81,83,84,126,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_field_rules.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_frontend_services.intf.mjs":{"lineLengths":[42,37,32,25,287,271,509,509,370,956,181,408,217,650,311,271,210,202,205,197,1,208,144,134,140,39,63],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_frontend_services.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_git_definitions.intf.mjs":{"lineLengths":[40,35,32,567,628,609,148,582,22,1,74,517,89,95,88,94,599,90,86,88,84,86,580,97,106,104,96,119,80,552,103,95,107,101,105,99,91,124,130,125,349,73,136,454,690,701,528,912,146,646,959,1058,328,829,126,519,747,322,2193,2419,37,61],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_git_definitions.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_asset_manager.intf.mjs":{"lineLengths":[42,37,32,25,979,835,387,728,1,742,891,39,63],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_asset_manager.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_error_handler.intf.mjs":{"lineLengths":[42,37,32,25,386,1,78,39,63],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_error_handler.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_event.intf.mjs":{"lineLengths":[34,29,32,167,147,405,224,158,242,229,1,62,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_event.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_event_handler.intf.mjs":{"lineLengths":[42,37,32,25,646,1,471,39,63],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_event_handler.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_hotkey_ctl.intf.mjs":{"lineLengths":[39,34,32,25,993,49,992,197,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_hotkey_ctl.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_hotkeys.intf.mjs":{"lineLengths":[36,31,32,25,1003,1,654,904,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_hotkeys.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_html_processor.intf.mjs":{"lineLengths":[43,38,32,25,469,1,80,40,64],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_html_processor.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_jumper.intf.mjs":{"lineLengths":[35,30,32,25,1738,1036,643,332,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_jumper.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_menu_provider.intf.mjs":{"lineLengths":[42,37,32,25,247,1,78,39,63],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_menu_provider.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_modal.intf.mjs":{"lineLengths":[34,29,32,25,208,1,62,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_modal.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_page_title.intf.mjs":{"lineLengths":[39,34,32,25,183,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_page_title.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_render_item.intf.mjs":{"lineLengths":[40,35,32,25,420,1,74,37,61],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_render_item.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_renderable.intf.mjs":{"lineLengths":[39,34,32,25,230,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_renderable.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_gui_services.intf.mjs":{"lineLengths":[37,32,32,25,673,479,262,175,246,228,356,1,68,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_gui_services.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html.intf.mjs":{"lineLengths":[29,24,32,172,375,287,340,295,306,189,1127,465,1066,584,645,1065,957,958,1,52,324,72,67,71,73,69,235,67,67,69,347,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_html.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html_form.intf.mjs":{"lineLengths":[34,29,32,164,380,611,22,1,62,102,63,339,74,79,73,75,569,75,76,79,82,77,79,76,77,397,614,2576,2862,403,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_html_form.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html_popup.intf.mjs":{"lineLengths":[35,30,32,25,255,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_html_popup.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html_table.intf.mjs":{"lineLengths":[35,30,32,25,514,914,1,291,448,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_html_table.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_html_viewer.intf.mjs":{"lineLengths":[36,31,32,168,735,175,156,48,58,155,48,198,54,1,66,109,69,124,345,337,559,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_html_viewer.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_http_agent.intf.mjs":{"lineLengths":[35,30,32,467,255,885,1,64,406,77,79,77,83,81,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_http_agent.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_http_response.intf.mjs":{"lineLengths":[38,33,32,25,173,154,211,186,149,157,223,50,1,70,35,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_http_response.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_i18n_file.intf.mjs":{"lineLengths":[34,29,32,25,175,948,151,154,1,429,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_i18n_file.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_lang_definitions.intf.mjs":{"lineLengths":[41,36,32,25,22,1,893,1041,566,799,333,38,62],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_lang_definitions.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_log.intf.mjs":{"lineLengths":[28,23,32,377,378,1040,772,771,774,774,832,49,151,737,1629,170,159,159,297,480,208,1,50,303,59,62,64,324,63,62,65,63,445,656,328,535,1301,1545,25,49],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_log.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_longtexts.intf.mjs":{"lineLengths":[34,29,32,25,1124,4009,680,244,1,2395,2551,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_longtexts.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_lxe_texts.intf.mjs":{"lineLengths":[34,29,32,25,796,779,1,933,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_lxe_texts.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_merge.intf.mjs":{"lineLengths":[30,25,32,25,1270,5069,175,207,1033,48,1,5041,951,1175,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_merge.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_object.intf.mjs":{"lineLengths":[31,26,32,236,557,243,816,330,188,196,193,297,294,398,237,446,1790,1233,813,1,56,509,74,72,72,72,28,52],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_object.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_object_enho.intf.mjs":{"lineLengths":[36,31,32,25,385,333,1,66,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_object_enho.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_object_enhs.intf.mjs":{"lineLengths":[36,31,32,25,502,343,1,66,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_object_enhs.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_object_filter.intf.mjs":{"lineLengths":[38,33,32,25,925,1,70,35,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_object_filter.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_objects.intf.mjs":{"lineLengths":[32,27,32,643,22,1,58,576,86,79,78,81,84,81,85,83,1594,1051,1278,1751,1972,29,53],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_objects.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_oo_object_fnc.intf.mjs":{"lineLengths":[38,33,32,427,1249,906,745,540,1002,1103,701,515,925,384,667,413,717,203,396,1209,452,774,553,1071,1172,272,354,1016,1,70,372,95,95,87,97,220,446,705,802,35,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_oo_object_fnc.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persist_repo.intf.mjs":{"lineLengths":[37,32,32,25,2970,189,328,4701,5070,286,4626,5982,1,68,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_persist_repo.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persist_repo_cs.intf.mjs":{"lineLengths":[40,35,32,25,355,189,336,1,74,37,61],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_persist_repo_cs.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persist_settings.intf.mjs":{"lineLengths":[41,36,32,25,237,218,1,76,38,62],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_persist_settings.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persist_user.intf.mjs":{"lineLengths":[37,32,32,25,224,176,178,206,421,196,201,313,315,317,304,196,343,176,178,313,315,317,304,196,209,165,276,214,366,202,348,209,203,199,204,1425,1425,728,729,1,411,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_persist_user.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_persistence.intf.mjs":{"lineLengths":[36,31,32,25,22,1,183,119,408,635,1070,1184,1300,1342,4331,1411,4415,4631,342,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_persistence.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_popups.intf.mjs":{"lineLengths":[31,26,32,177,292,175,431,1396,1236,2497,1156,1287,600,183,2672,711,988,679,282,221,1,56,108,81,289,364,108,107,28,52],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_popups.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_pr_enum_provider.intf.mjs":{"lineLengths":[41,36,32,25,1341,1,1082,1251,38,62],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_pr_enum_provider.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_progress.intf.mjs":{"lineLengths":[33,28,32,25,255,155,48,1,60,30,54],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_progress.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo.intf.mjs":{"lineLengths":[29,24,32,4498,208,157,195,195,1262,1860,1322,339,237,237,4820,4667,240,1,52,26,50],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_repo.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo_checksums.intf.mjs":{"lineLengths":[39,34,32,25,1379,765,51,754,1,72,36,60],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_repo_checksums.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo_listener.intf.mjs":{"lineLengths":[38,33,32,25,5999,1,70,35,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_repo_listener.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo_online.intf.mjs":{"lineLengths":[36,31,32,25,207,210,189,211,217,205,211,491,225,1057,307,67,1,66,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_repo_online.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_repo_srv.intf.mjs":{"lineLengths":[33,28,32,25,66,211,349,459,425,435,984,1212,1098,492,306,623,437,574,1,417,201,490,30,54],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_repo_srv.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_sap_namespace.intf.mjs":{"lineLengths":[38,33,32,25,301,289,1,70,35,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_sap_namespace.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_sap_package.intf.mjs":{"lineLengths":[36,31,32,25,75,1123,56,418,420,148,172,198,194,188,233,409,173,1,409,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_sap_package.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_sap_report.intf.mjs":{"lineLengths":[35,30,32,25,1353,1583,1726,1136,1,212,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_sap_report.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_services_git.intf.mjs":{"lineLengths":[37,32,32,25,22,1,973,34,58],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_services_git.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_services_repo.intf.mjs":{"lineLengths":[38,33,32,25,22,1,1041,35,59],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_services_repo.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_stage_logic.intf.mjs":{"lineLengths":[36,31,32,25,4144,1,66,33,57],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_stage_logic.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_tadir.intf.mjs":{"lineLengths":[30,25,32,25,451,1633,967,1,54,27,51],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_tadir.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_version.intf.mjs":{"lineLengths":[32,27,32,171,152,22,1,58,105,68,106,70,29,53],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_version.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_xml_input.intf.mjs":{"lineLengths":[34,29,32,25,235,211,399,1,62,31,55],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_xml_input.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zif_abapgit_xml_output.intf.mjs":{"lineLengths":[35,30,32,25,234,209,294,644,1,64,32,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zif_abapgit_xml_output.intf.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zw3mi.fugr.wwwdata_export.mjs":{"lineLengths":[53,33,38,35,33,28,32,27,187,3,116,1,56,54],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zw3mi.fugr.wwwdata_export.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zw3mi.fugr.wwwdata_import.mjs":{"lineLengths":[53,33,38,35,33,28,32,27,187,3,66,64,110,57,30,68,32,36,34,56,45,97,57,21,95,50,47,66,49,5,54,56,44,3,48,67,1,56,54],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zw3mi.fugr.wwwdata_import.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zw3mi.fugr.wwwparams_insert.mjs":{"lineLengths":[53,35,40,37,39,116,1,60,56],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zw3mi.fugr.wwwparams_insert.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zw3mi.fugr.wwwparams_read.mjs":{"lineLengths":[53,33,38,42,37,42,37,27,35,27,37,28,46,3,66,62,58,32,36,34,56,45,69,75,29,24,53,10,118,3,67,1,56,54],"data":{"version":3,"sources":[],"names":[],"mappings":"","file":"zw3mi.fugr.wwwparams_read.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_lxe_texts.clas.mjs":{"lineLengths":[53,34,29,32,49,60,430,321,217,215,212,215,182,384,252,368,256,328,464,1835,1683,1966,336,333,1496,61,925,421,680,534,794,298,17,42,22,91,79,141,139,136,139,53,3,29,64,16,3,45,69,3,52,316,76,316,76,319,82,315,70,290,124,43,39,40,71,36,120,80,28,53,90,79,14,75,7,5,3,29,53,3,36,132,132,132,132,132,132,132,132,132,132,132,3,45,69,3,52,316,68,64,106,103,266,93,106,98,74,71,26,5,109,71,35,91,71,5,64,101,136,5,42,72,24,3,45,69,3,52,68,316,76,266,124,98,71,36,79,44,101,14,7,54,34,5,140,20,3,36,57,82,58,82,92,353,131,861,68,107,109,102,120,44,13,5,67,162,122,29,72,72,29,119,16,16,39,9,7,53,17,7,72,44,298,94,265,7,5,3,32,76,88,135,57,82,58,82,1673,1448,861,110,71,33,310,288,5,3,45,69,3,52,328,316,76,167,36,3,35,59,3,42,316,64,102,93,82,578,83,11,199,148,115,43,19,24,46,78,63,15,18,22,11,9,92,154,9,161,63,83,69,57,106,88,63,21,11,79,113,9,54,7,75,26,5,32,104,93,60,101,97,11,145,43,19,24,46,76,63,15,18,22,11,9,92,173,9,93,23,7,40,72,111,86,112,86,73,43,13,203,152,215,45,21,26,48,79,80,65,17,20,24,13,11,94,31,11,29,9,48,72,9,55,322,107,94,327,97,109,66,151,111,34,84,96,71,20,174,13,11,97,137,30,9,35,59,9,42,99,112,79,70,26,9,42,66,9,49,105,63,88,154,87,32,60,120,24,9,42,66,9,49,99,108,70,15,105,47,23,28,50,80,67,19,22,26,15,13,96,176,13,28,11,50,869,112,75,112,75,113,78,111,78,114,78,113,84,113,70,17,201,150,280,61,87,15,25,132,203,152,250,22,24,15,13,37,11,40,1682,65,90,66,90,76,115,1461,136,110,128,52,35,13,170,78,50,54,82,82,82,132,50,69,110,110,27,17,322,88,92,17,15,13,33,11,40,65,90,66,90,1681,136,100,1491,125,130,37,65,113,81,53,127,203,17,15,82,13,11,38,84,96,143,65,90,66,90,1681,125,108,121,13,11,51,112,75,112,75,113,78,111,78,114,78,861,75,70,17,202,151,248,61,87,15,25,132,204,153,218,22,24,15,13,11,58,65,90,66,90,148,90,140,66,146,72,127,21,13,52,39,40,100,111,20,107,13,11,56,65,90,66,90,148,90,142,66,146,72,127,21,13,52,40,40,100,107,20,105,13,11,9,70,354,266,126,54,72,1477,1702,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_lxe_texts.clas.abap"],"names":[],"mappings":";;AAiLA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;;;QAEO,yRAAuE;IAC5E,IAAc,WAAmC;IAEjD,sBAAO,eAAe;IAAtB,sBAAwB,WAAW;IACnC,sBAAoB,YAAY;;;MAG9B;;;mDAAmF;MACnF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,gCAAO,qBAAa,eAAe;MACrC;QACE,gCAAO,qBAAa,WAAW;MACjC;IACF;EAEF;EAGA;;;;IAEE,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;IACvC,gCAAO,iDAAU,4CAAsB;EAEzC;EAGA;;;;;;;;;QAGI,iQAAuC;QACvC,oFAAgC;QAChC,iGAAgC;IAElC,IACE,UAAmC;IAGrC,iBAAY,GAAT,UAAW,qCAAG;MACf,gCAAO,kBAAY,YAAY;MAC/B;IACF;IAGA;;;MAGE,aAAW,4BAAU,4BAAU,cAAY;MAC3C,gCAAO,kBAAY,YAAY;IACjC;IAEA,yBAAG,gCAAoC;MACrC,2BAAwB,kEAA4C;;IAEtE;IAEA;;IAGF;;EAGA;;;;;;;QAGI,iQAA8B;IAEhC,IACE,WAAmC;IADrC,IAEE,UAAqB;;;MAKrB,iBAAa,GAAV,aAAY,qCAAG;QAChB,sBAAM,YAAY;QAClB,gCAAO,8CAAO,YAAY;QAC1B;MACF;;MAGA,eAAW,WAAS;IACtB;IAEA,sCAAqB,uBAAkB,QAAyB;IAElE;;EAGA;;;;;QAEO,mFAAoE;QACpE,wVAAmD;QACnD,0HAA8B;QAC9B,o1BAAoD;QACpD,2DAA6B;QAC7B,kGAA4B;QAC5B,oGAA8B;IAEnC,IAAc,iBAAwC;IAEtD,iBAAc,iGAEqB;IAEnC,yBAAG,YAAsB;MACvB;IACF;IAEA,iBAAe,4CAA4B;IAC3C,kBAAe,0IAA+E;;;MAG5F,oBAAiB,4CAAwB;;;QAGvC,iBAAkB,IAAf,iDAAiB,4BAAU,UAAS;UACrC;QACF;UACE,sBAAM,KAAK;QACb;MACF;MAEA,2BAAM;iBAAc;;;;QAIlB,uBAAoB,yQAMS;6FAEiC;wQAS5B;MAEpC;IAEF;EAEF;EAGA;;;;;;;;QAGI,goDAA0C;QAC1C,+5CAA2C;QAC3C,o1BAA6C;6GAIX;;;MAKlC,uBAAoB,uRAMS;+RASU;IAEzC;EAEF;EAGA;;;;;;;sKAO8C;IAE9C;;EAGA;;;;;QAGI,uDAA6B;QAC7B,6FAAoC;QACpC,oFAAiC;QACjC,yEAAkC;QAClC,yjBAA8E;IAEhF,yBAAG,mDAAuC;;;;;;;;;;;;;;;;QAOxC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;yJACiE;QACjF;QAEA,wBAAqB,+HAAsE;;;;;UAGzF,aAAoB,qBAAT,eAAE,MAAC,OAAQ,gCAAC;UACvB,aAAW,+DAAkC;UAE7C,qBAAG,UAAgB,mBAAkB;YACnC;UACF;UAEA,cAAW,qDAA+B;UAC1C,gCAAO,kBAAY,kDAA4B;QACjD;;MACF;MAEA,iBAAe,kDAA4B;MAE7C;;IAGA;;;;UAEO,0FAAyB;UACzB,sFAAyB;;gJAUN;;;;;;;;;;;;QACxB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4KACiE;QACjF;QAEA,sCAAY,gBAAe,qBAAgB,OAAO;QAEpD;;MAGA;;;;;;YAEO,4DAA8B;QAEnC,mBAAiB,cAAc;;;;;;;;;;;;;;;;;UAa/B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;YACd;UACF;UAEF;;QAGA;;;;;;;;;cAOO,8FAA6B;UAElC,yBAAG,4BAAgC;YACjC;;;kFAA6E;YAC7E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;cACb,kBAAe,qCAA0B;YAC3C;6KAMsC;YACtC;UACF;UAGA,wBAAqB,6DAAuC;;UAG9D;;QAGA;;;;;;;UACE,aAAW,6CAAgB;UAC7B;;QAGA;;;;;;;UACE;;;0DAA6F;UAC7F,WAAS,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;UAChC;;QAGA;;;;;;;;uGASyB;;;;;;;;;;;;YACvB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+KACgE;YAChF;YAEF;;UAGA;;;;;;;;;;;;;;;gBAGI,qDAAuB;YAEzB;;;;cAaI,yBAAG,mBAAuB;sFACgB;cAC1C;;;;;;;;;YAeJ;YAEF;;UAGA;;;;;;gBAGI,2DAAkC;gBAClC,kGAAgC;gBAChC,o6CAA2C;YAE7C,IACE,eAA4E;YAD9E,IAEE,iBAAwC;YAE1C,iBAAc,iGAEqB;YAEnC,yBAAG,YAAsB;cACvB;YACF;YAGA,kBAAe,0IAA+E;;;cAG5F,sBAAM,gBAAgB;cACtB,gBAAgB,MAAC,aAAU,iBAAe,MAAC,QAAO;cAClD,gBAAgB,MAAC,aAAU,iBAAe,MAAC,QAAO;cAClD,gBAAgB,MAAC,aAAU,iBAAe,MAAC,QAAO;;;gBAGhD,gBAAgB,MAAC,iBAAc,YAAY;gBAC3C,gBAAgB,MAAC,kBAAc,oDAA8B;gBAC7D,iBAAgC,GAA7B,gBAAgB,MAAC,cAAc,gBAAgB,MAAC,aAAW;kBAC5D;gBACF;gBAEA,gBAAgB,MAAC,iBAAa,yQAKa;gBAE3C,yBAAG,gBAAgB,MAAC,sBAAyB;kBAC3C,gCAAO,0BAAoB,aAAa;gBAC1C;cACF;YACF;YAEF;;UAGA;;;;;gBAEO,goDAAqC;gBACrC,uHAA0C;gBAC1C,mFAAoE;YACzE,IAAc,kBAA0C;YAExD,kBAAe,6FAEsB;;;cAGnC,YAAU,4BAAU,SAAS;;;;gBAK3B,iBAAgD,IAA7C,+EAA+C,QAAO;0MAIR;gBACjD;cACF;iFACqC;YACvC;UAEF;UAGA;;;;;;;;gBAEO,goDAAqC;YAE1C,kBAAe,6FAEsB;YAErC,iBAAyB,GAAtB,yBAAO,gBAAiB,gCAAC;wHAGA;YAC5B;UAEF;UAGA;;;;;;;;;;;;;gBAGI,qDAAuB;YAEzB;;;;cAYI,yBAAG,mBAAuB;sFACgB;cAC1C;;;;;;;;;YAcJ;UAEF;UAGA;;;;;;;;;;;YAEE,iBAAyC,IAAtC,mEAAwC,wBAAU;cACnD;YACF;YAEA,wBAAiB,cAAc;YAC/B,mBAAiB,MAAM;YACvB,kBAAiB,QAAQ;YAIzB,iBAAK,GAAF,iCAAI,gCAAC;8GAG6B;YACrC;0GAGqC;YACrC;UAEF;UAGA;;;;;;;;;;;YAEE,iBAAyC,IAAtC,mEAAwC,wBAAU;cACnD;YACF;YAEA,wBAAiB,cAAc;YAC/B,oBAAiB,MAAM;YACvB,kBAAiB,QAAQ;YAczB,iBAAK,GAAF,iCAAI,gCAAC;0GAG6B;YACrC;wGAGqC;YACrC;UAEF;QACF","file":"zcl_abapgit_lxe_texts.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_abap.clas.mjs":{"lineLengths":[99,53,36,70,32,51,37,357,330,281,333,75,299,57,54,61,56,17,12,42,22,59,47,51,51,3,29,55,3,36,31,3,29,31,195,195,186,16,3,25,51,3,32,71,250,14906,111,72,71,57,3,27,53,3,34,99,68,64,66,55,131,73,26,46,114,18,3,30,67,61,751,67,64,67,56,555,556,67,57,69,37,48,176,75,17,7,47,86,312,77,19,9,93,99,126,17,90,144,89,89,161,49,191,169,119,49,106,115,49,105,115,119,49,11,77,19,9,7,50,74,5,3,27,751,67,61,64,556,65,241,37,48,194,75,7,5,22,3,1,66,275,269,59,53,59,220,55,52,55,271,63,67,74,66,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_abap.clas.abap"],"names":[],"mappings":";;;AA6CA;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;8BAEkB;EAElB;EAGA;8BAEuB;kMAKe;kMAIA;yLAIH;IAEnC;;EAGA;;;;QAEQ,8DAAuB;QACvB,iPAAyC;IAE/C,sCACC,uHACC,uIACA,uIACA,yIACA,2IACA,sIACA,6HACA,sIACA,oIACA,qIACA,sIACA,iIACA,uIACA,mIACA,uIACA,uIACA,kIACA,2IACA,wIACA,6IACA,oIACA,0IACA,yIACA,qIACA,6IACA,iIACA,0IACA,mIACA,wHACA,+HACA,mIACA,sIACA,kIACA,4IACA,0IACA,wIACA,2IACA,uIACA,2IACA,oIACA,0IACA,yIACA,uIACA,0IACA,2IACA,mIACA,sIACA,mHACA,mIACA,kIACA,oIACA,mIACA,yIACA,oIACA,sIACA,2IACA,uIACA,2HACA,qIACA,oIACA,sIACA,qIACA,qIACA,wIACA,wIACA,sHACA,yIACA,wIACA,sIACA,0IACA,qIACA,mIACA,0IACA,+IACA,kIACA,yIACA,uIACA,gJACA,qIACA,4IACA,4IACA,4IACA,0IACA,6IACA,6IACA,2HACA,gJACA,iJACA,4IACA,yIACA,4IACA,4IACA,iJACA,iJACA,2IACA,wHACA,wIACA,+IACA,qHACA,0IACA,qIACA,iJACA,wHACA,gHACA,2HACA,+IACA,8IACA,2IACA,iIACA,6NAA8E;IAGhF;IAEA;;IAEA,wCAAc,WAAW;EAE3B;EAGA;;;;;;;QAEO,yDAAkB;IAEvB,WAAS,4BAAU,UAAU;IAC7B;;;4CAA0E;IAC1E,WAAS,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAEhC;;EAGA;;;;;QAGI,uDAA2B;QAC3B,0DAAoB;QACpB,+CAAoB;IAEtB,IACE,WAAwB;IAD1B,IAEE,YAAwB;IAE1B;IAEA,gBAAc,0BAAQ,SAAS;;;MAG7B,aAAW,eAAE,MAAC,MAAK;MAGnB,iBAAiB,GAAd,eAAgB,+BAAO,MAAC,MAAK,iBAAqB,GAAjB,YAAU,MAAC,QAAS,+BAAO,MAAC,MAAI;;QAElE;MACF;MAEA,IACE,OAUA,AAKA,KAhBG,YAAU,MAAC,MAAhB;;QAEI,iBAAqB,GAAlB,YAAU,MAAC,SAAS,gCACnB,iBAEyB,GAFrB,wBAAW,KAAM,SACN,KAA0B,qBAAlB,YAAU,MAAC,QAAS,kCAC5B,KAAM,mCAAO,sCAAI;;UAGlC;QACF;;QAGA,YAAU,MAAC,YAAqB,qBAAZ,YAAc,YAAU,MAAC,QAAM;;QAEnD;;QAGA,YAAU,MAAC,cAAW,wBAAW,KAAM,SACT,KAAM,YAAU,MAAC,SACjB,KAAM,YAAU,MAAC,SAAQ;QACvD,iBAAiB,GAAd,eAAgB,+BAAO,MAAC,MAAI;UAC7B,iBAAuB,GAApB,YAAU,MAAC,WAAW,WAAS,MAAC,UAAQ;YACzC,WAAS,MAAC,YAA+C,qBAApB,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,SAAS,WAAS,MAAC,QAAM;YAC3E,sBAAM,aAAa;UACrB,wBAA0B,GAAnB,WAAS,MAAC,WAAW,qCAAI,iBAAwB,GAApB,YAAU,MAAC,WAAW,qCAAG;YAC3D,WAAS,MAAC,YAA8C,qBAAnB,qBAAlB,YAAU,MAAC,QAAS,WAAS,MAAC,SAAS,gCAAC;YAC3D,WAAS,MAAC,YAA0B,mBAAjB,WAAS,MAAC,QAAS,gCAAC;YACvC,sBAAM,aAAa;UACrB,wBAA2B,GAApB,YAAU,MAAC,WAAW,qCAAG;YAC9B,WAAS,MAAC,YAA2B,qBAAlB,YAAU,MAAC,QAAS,WAAS,MAAC,QAAM;YACvD,sBAAM,aAAa;UACrB,wBAA0B,GAAnB,WAAS,MAAC,WAAW,qCAAG;YAC7B,WAAS,MAAC,YAA2B,qBAAlB,YAAU,MAAC,QAAS,WAAS,MAAC,QAAM;YACvD,WAAS,MAAC,YAA0B,mBAAjB,WAAS,MAAC,QAAS,gCAAC;YACvC,sBAAM,aAAa;UACrB;;UAEA;QACF;;MAIJ,kBAAgB,YAAU,MAAC,MAAK;MAChC,iEAA8B;IAChC;EAEF;EAGA;;;;QAEO,uDAAe;IAEpB,IAAc,YAAkC;IAEhD,gBAAa,2CAA4B;;;MAIvC,aAAW,eAAE,MAAC,MAAK;MACnB,iBAAc,GAAX,0BAAa,2IAEkD;;MAElE;IACF;IAEF;;AACF","file":"zcl_abapgit_syntax_abap.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_css.clas.mjs":{"lineLengths":[99,53,35,69,32,50,37,578,180,883,681,455,75,309,299,57,54,61,56,17,12,42,22,58,56,46,50,50,3,29,54,3,36,31,3,29,31,61,192,192,183,198,186,177,189,181,187,181,189,185,16,3,25,50,3,32,71,62,4558,118,455,114,458,117,281,117,2376,114,7729,118,108,116,2793,112,3,32,57,3,39,71,73,101,64,250,294,81,111,70,39,40,51,43,100,5,3,27,52,3,34,99,68,64,66,55,85,67,70,27,43,114,18,3,30,67,61,751,67,68,67,67,67,56,555,556,326,107,57,85,141,108,29,81,90,42,56,83,71,51,15,7,5,69,37,174,56,17,7,123,47,85,70,58,19,9,61,89,36,73,76,31,49,92,67,9,92,79,138,101,72,86,138,119,73,73,16,99,180,9,89,50,88,89,161,49,11,58,19,9,7,50,95,74,5,109,3,27,751,67,61,64,556,65,239,37,48,194,56,7,5,109,22,3,1,64,495,118,821,58,52,58,62,54,64,56,62,56,64,60,52,619,54,51,54,56,52,57,53,56,53,57,55,51,392,81,82,70,66,126,65,116,309,32,56],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_css.clas.abap"],"names":[],"mappings":";;;AA+FA;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;8BAEkB;EAElB;EAGA;8BAEuB;IAGrB,sBAAM,iCAAU;+LAKoB;+LAIA;sLAIH;qMAIK;yLAIJ;gLAKD;4LAIM;oLAIJ;0LAIG;oLAIH;4LAII;wLAIF;IAEvC;;EAGA;;;;QAEQ,8DAAuB;IAE7B,sBAAM,kCAAW;IAGjB,sCACA,kKACA,wKACA,wKACA,2JACA,uKACA,kKACA,sKACA,kKACA,mKACA,mKACA,0JACA,0JACA,8JACA,0JACA,4JACA,0JACA,4JACA,2IACA,6JACA,6JACA,wJACA,0JACA,sJACA,0JACA,iJACA,mKACA,sJACA,uIACA,wIAA0E;qHAE1B;IAGhD,sCACA,mKACA,4IACA,4GAAwE;iHAE5B;IAG5C,sCACA,iKACA,wIACA,qHAAiF;oHAElC;IAG/C,sCACA,+HACA,8GAA2E;oHAE5B;IAG/C,sCACA,mKACA,kKACA,iKACA,8JACA,gKACA,gKACA,6JACA,0JACA,0JACA,kKACA,8JACA,4JACA,iKACA,sIACA,oIAAoF;iHAExC;IAG5C,sCACA,mJACA,oJACA,4IACA,0IACA,2IACA,qJACA,iJACA,kJACA,+HACA,oIACA,8IACA,sIACA,2IACA,0IACA,+IACA,2IACA,uIACA,8IACA,6IACA,4IACA,4IACA,kIACA,yIACA,sIACA,gIACA,6HACA,qIACA,yIACA,gJACA,6IACA,mIACA,2IACA,sIACA,oJACA,mJACA,6IACA,iIACA,iIACA,4IACA,mJACA,4HACA,qJACA,iJACA,yIACA,kIACA,uIACA,0IACA,wIACA,2HACA,sIACA,yIACA,iJACA,8HACA,iIACA,mHACA,gJAAuD;qHAEP;IAGhD,gBACA,sFAAoD;mHAEN;IAG9C,sCACA,wJACA,2JACA,yJACA,sJACA,0JACA,wJACA,qJACA,wJACA,kJACA,mJACA,yJACA,mJACA,wJACA,oJACA,wJACA,+IACA,kJACA,+HACA,uEAAmB;+GAEuB;EAE5C;EAGA;;;;;;;;QAEQ,iPAAyC;QACzC,6RAA2B;IAEjC,IAAe,cAAqB;IAEpC;;;MAGE,sBAAM,UAAU;MAChB,UAAU,MAAC,aAAU,cAAY;MACjC,UAAU,MAAC,WAAQ,QAAQ;MAC3B,2FAAwC;IAC1C;EAEF;EAGA;;;;;;;QAEO,yDAAkB;IAEvB,WAAS,4BAAU,UAAU;IAC7B;;;;yCAA6E;IAC7E,WAAS,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAEhC;;EAGA;;;;;QAGI,2DAAyB;QACzB,0DAAoB;QACpB,0DAAoB;QACpB,0DAAoB;QACpB,+CAAoB;IAEtB,IACE,WAA0B;IAD5B,IAEE,YAA0B;IAF5B,IAGE,cAA4B;IAG9B;IAEA,gBAAc,0BAAQ,SAAS;IAG/B,iBAAc,GAAX,mCAAa,uBAAS;MACvB;;;+EAA6E;MAC7E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,sBAAM,UAAU;;QAEhB,YAAU,MAAC,WAAQ,8BAAO,MAAC,QAAO;QAClC,YAAU,MAAC,YAAS,+BAAC;QACrB,YAAU,MAAC,YAAS,WAAW;QAC/B;MACF;IACF;;;MAIE,iBAAiB,GAAd,eAAgB,8BAAO,MAAC,MAAK,iBAAqB,GAAjB,YAAU,MAAC,QAAS,8BAAO,MAAC,MAAI;QAClE,sBAAM,YAAU,MAAC,MAAK;QACtB;MACF;MAEA,aAAW,wBAAW,KAAM,SACN,KAAM,YAAU,MAAC,SACjB,KAAM,YAAU,MAAC,SAAQ;MAE/C,IACE,OAcA,AAeA,KA9BG,YAAU,MAAC,MAAhB;;QAGI,iBAAqB,GAAlB,YAAU,MAAC,SAAS,YAAW;UAChC,sBAAM,YAAU,MAAC,MAAK;UACtB;QACF;QAGA,aAAW,4BAAU,UAAU;QAC/B;;;;;+CAA+E;QAC/E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,YAAU,MAAC,WAAQ,cAAY,MAAC,MAAK;QACvC;;QAGA,iBAAY,GAAT,UAAW,sCAAI;;UAEhB,YAAU,MAAC,YAAqB,qBAAZ,YAAc,YAAU,MAAC,QAAM;UACnD,sCAAa,sBAAS;QACxB,wBAAgB,GAAT,UAAW,sCAAI;;UAEpB,YAAU,MAAC,YAA2B,mBAAlB,YAAU,MAAC,QAAS,gCAAC;UACzC,YAAU,MAAC,YAAS,+BAAC;UACrB,sCAAa,uBAAU;QACzB;UACE,gBAAgC,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,QAAM;;QAErD;;QAGA,YAAU,MAAC,cAAW,QAAQ;QAC9B,iBAAiB,GAAd,eAAgB,8BAAO,MAAC,MAAI;UAC7B,iBAAuB,GAApB,YAAU,MAAC,WAAW,WAAS,MAAC,UAAQ;YACzC,WAAS,MAAC,YAA+C,qBAApB,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,SAAS,WAAS,MAAC,QAAM;YAC3E,sBAAM,aAAa;UACrB;UACA,sBAAM,YAAU,MAAC,MAAK;UACtB;QACF;;MAIJ,kBAAgB,YAAU,MAAC,MAAK;MAChC,gBAAkC,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,QAAM;MACrD,iEAA8B;IAChC;;EAIF;EAGA;;;;QAEO,uDAAe;IAEpB,IAAc,YAAkC;IAEhD,gBAAa,2CAA4B;;;MAIvC,aAAW,eAAE,MAAC,MAAK;MACnB,iBAAc,GAAX,0BAAa,2IAEkD;QAChE,sBAAM,YAAU,MAAC,MAAK;MACxB;IACF;;IAIF;;AACF","file":"zcl_abapgit_syntax_css.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_js.clas.mjs":{"lineLengths":[99,53,34,68,32,49,37,575,180,393,327,333,75,308,299,57,54,61,56,17,12,42,22,57,55,45,49,49,3,29,53,3,36,31,3,29,31,60,189,189,180,185,16,3,25,49,3,32,71,61,4629,114,137,116,3,32,56,3,39,71,73,100,64,250,291,81,111,70,39,40,51,43,99,5,3,27,51,3,34,99,68,64,66,55,84,67,70,27,43,114,18,3,30,67,61,751,67,68,67,67,67,56,555,556,323,107,57,84,140,107,29,80,90,42,56,82,71,51,15,7,5,69,37,172,56,17,7,123,47,84,70,58,19,9,61,88,36,73,76,31,49,92,67,9,91,79,138,101,71,86,138,101,86,138,119,73,72,16,99,180,9,88,50,87,89,161,49,11,58,19,9,7,50,95,74,5,109,3,27,751,67,61,64,556,65,237,37,48,194,56,7,5,109,22,3,1,62,491,117,330,57,51,57,61,264,53,50,53,55,269,87,55,65,64,114,305,31,55],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_js.clas.abap"],"names":[],"mappings":";;;AAiEA;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;8BAEkB;EAElB;EAGA;8BAEuB;IAGrB,sBAAM,gCAAU;4LAKoB;4LAIA;mLAIH;wLAKK;IAExC;;EAGA;;;;QAEQ,8DAAuB;IAE7B,sBAAM,iCAAW;IAGjB,sCACA,yKACA,yKACA,yKACA,0KACA,0KACA,yKACA,qKACA,oKACA,uKACA,2KACA,wKACA,qKACA,oKACA,wKACA,qKACA,0KACA,0KACA,oKACA,sKACA,wKACA,yKACA,uKACA,2KACA,sKACA,uKACA,0KACA,oJACA,4EAAe;iHAE8B;IAG7C,gBACA,mHAAiF;mHAElC;EAEjD;EAGA;;;;;;;;QAEQ,iPAAyC;QACzC,0RAA2B;IAEjC,IAAe,cAAqB;IAEpC;;;MAGE,sBAAM,UAAU;MAChB,UAAU,MAAC,aAAU,cAAY;MACjC,UAAU,MAAC,WAAQ,QAAQ;MAC3B,0FAAwC;IAC1C;EAEF;EAGA;;;;;;;QAEO,yDAAkB;IAEvB,WAAS,4BAAU,UAAU;IAC7B;;;;yCAA6E;IAC7E,WAAS,gCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAlB,CAAqB;IAEhC;;EAGA;;;;;QAGI,2DAAyB;QACzB,0DAAoB;QACpB,0DAAoB;QACpB,0DAAoB;QACpB,+CAAoB;IAEtB,IACE,WAA0B;IAD5B,IAEE,YAA0B;IAF5B,IAGE,cAA4B;IAG9B;IAEA,gBAAc,0BAAQ,SAAS;IAG/B,iBAAc,GAAX,kCAAa,uBAAS;MACvB;;;8EAA6E;MAC7E,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,sBAAM,UAAU;;QAEhB,YAAU,MAAC,WAAQ,6BAAO,MAAC,QAAO;QAClC,YAAU,MAAC,YAAS,+BAAC;QACrB,YAAU,MAAC,YAAS,WAAW;QAC/B;MACF;IACF;;;MAIE,iBAAiB,GAAd,eAAgB,6BAAO,MAAC,MAAK,iBAAqB,GAAjB,YAAU,MAAC,QAAS,6BAAO,MAAC,MAAI;QAClE,sBAAM,YAAU,MAAC,MAAK;QACtB;MACF;MAEA,aAAW,wBAAW,KAAM,SACN,KAAM,YAAU,MAAC,SACjB,KAAM,YAAU,MAAC,SAAQ;MAE/C,IACE,OAcA,AAkBA,KAjCG,YAAU,MAAC,MAAhB;;QAGI,iBAAqB,GAAlB,YAAU,MAAC,SAAS,YAAW;UAChC,sBAAM,YAAU,MAAC,MAAK;UACtB;QACF;QAGA,aAAW,4BAAU,UAAU;QAC/B;;;;;+CAA+E;QAC/E,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,YAAU,MAAC,WAAQ,cAAY,MAAC,MAAK;QACvC;;QAGA,iBAAY,GAAT,UAAW,sCAAI;;UAEhB,YAAU,MAAC,YAAqB,qBAAZ,YAAc,YAAU,MAAC,QAAM;UACnD,qCAAa,sBAAS;QACxB,wBAAgB,GAAT,UAAW,sCAAI;;UAEpB,YAAU,MAAC,YAAqB,qBAAZ,YAAc,YAAU,MAAC,QAAM;QACrD,wBAAgB,GAAT,UAAW,sCAAI;;UAEpB,YAAU,MAAC,YAA2B,mBAAlB,YAAU,MAAC,QAAS,gCAAC;UACzC,YAAU,MAAC,YAAS,+BAAC;UACrB,qCAAa,uBAAU;QACzB;UACE,gBAAgC,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,QAAM;;QAErD;;QAGA,YAAU,MAAC,cAAW,QAAQ;QAC9B,iBAAiB,GAAd,eAAgB,6BAAO,MAAC,MAAI;UAC7B,iBAAuB,GAApB,YAAU,MAAC,WAAW,WAAS,MAAC,UAAQ;YACzC,WAAS,MAAC,YAA+C,qBAApB,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,SAAS,WAAS,MAAC,QAAM;YAC3E,sBAAM,aAAa;UACrB;UACA,sBAAM,YAAU,MAAC,MAAK;UACtB;QACF;;MAIJ,kBAAgB,YAAU,MAAC,MAAK;MAChC,gBAAkC,mBAAlB,YAAU,MAAC,QAAS,YAAU,MAAC,QAAM;MACrD,iEAA8B;IAChC;;EAIF;EAGA;;;;QAEO,uDAAe;IAEpB,IAAc,YAAkC;IAEhD,gBAAa,2CAA4B;;;MAIvC,aAAW,eAAE,MAAC,MAAK;MACnB,iBAAc,GAAX,0BAAa,2IAEkD;QAChE,sBAAM,YAAU,MAAC,MAAK;MACxB;IACF;;IAIF;;AACF","file":"zcl_abapgit_syntax_js.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html.clas.mjs":{"lineLengths":[53,29,24,32,44,55,221,146,183,340,146,168,392,304,924,2130,61,310,584,406,17,42,22,64,48,56,264,106,100,148,56,3,29,64,16,3,25,44,3,32,67,65,55,103,70,70,62,61,5,111,48,120,5,82,19,3,29,48,3,36,97,259,137,81,126,3,23,42,3,30,127,55,85,83,59,81,5,23,3,21,40,3,28,66,67,61,67,61,68,64,70,70,67,67,68,68,73,65,70,116,50,95,5,53,103,5,51,89,5,51,89,5,166,70,67,5,180,197,18,3,28,706,67,67,58,1184,65,86,80,67,13,88,68,13,91,13,5,369,155,108,12,78,5,43,65,61,65,71,62,64,131,62,65,111,5,76,78,113,93,115,7,101,97,5,3,27,1185,67,61,706,70,67,62,126,52,152,236,65,245,64,7,87,160,66,9,131,131,7,12,164,104,92,66,9,7,163,103,92,65,9,7,159,62,7,129,130,80,129,7,154,5,245,65,249,105,90,66,7,5,21,3,35,66,66,58,66,58,68,64,44,55,149,44,55,68,64,65,55,68,64,68,64,68,67,68,65,66,68,68,27,109,97,5,109,99,5,111,103,5,51,95,97,5,62,23,259,29,114,55,117,9,95,126,55,117,9,104,125,66,99,123,66,7,5,48,88,5,51,97,5,51,97,5,82,176,5,356,18,3,37,123,47,61,50,149,130,119,292,114,28,143,73,82,69,88,82,71,11,54,19,108,15,64,113,23,112,120,119,30,237,20,22,13,11,16,18,9,7,101,12,112,5,25,19,3,39,123,66,58,66,58,68,64,44,55,149,44,55,68,64,65,55,68,64,68,64,241,25,19,3,46,123,65,55,103,70,111,25,19,3,42,123,67,61,67,61,68,64,70,70,149,25,19,3,38,66,67,61,67,61,68,64,70,70,116,18,3,37,99,128,18,3,40,67,111,94,706,261,99,101,61,73,36,95,79,5,144,19,3,43,123,68,64,55,25,19,3,36,123,70,70,126,70,65,55,68,64,67,61,114,103,123,232,25,19,3,36,123,70,70,126,70,65,55,68,64,67,61,114,103,123,232,25,19,3,38,123,66,58,70,70,126,70,65,55,68,64,67,61,114,103,124,71,72,68,65,68,48,88,5,51,97,5,50,96,5,194,91,79,71,42,5,119,133,12,63,55,64,62,64,7,57,66,7,5,25,19,3,1,52,132,78,115,78,38,324,72,67,71,73,69,235,67,67,69,59,722,1200,26,50],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_html.clas.abap"],"names":[],"mappings":";;AA6EA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;QAEQ,6DAAsB;IAE5B,iBAAc,GAAX,YAAa,uBAAS;MACvB,qDAAsB;IACxB;IAEA,yGAAkD;IAClD,yBAAG,gBAAoB;MACrB,kCAAU,8EAA2B;IACvC;IAEA,kCAAU,QAAW,kCAAI;IAE3B;;EAGA;;;;QAEO,wFAAoB;;IAOzB,+BAAY,qBACV,KAAM,kCACN,KAAM,mCAAK;iCAEI,uCAAY;IAC7B,mCAAgB,gCAAe,GAAR,SAAU,wCAAjB,CAAyB;EAE3C;EAGA;;;;;;;;IAEE,yBAAG,2BAA+B;gFACI;IACtC;IACF;;EAGA;;;;;;;;;;;;;QAEQ,0DAAyB;QACzB,0DAAyB;QACzB,2DAAyB;QACzB,2DAAyB;QACzB,gEAAyB;QACzB,wDAAoB;QACpB,6DAAyB;IAE/B;IAEA,yBAAG,kBAAsB;MACvB,uFAAiC;IACnC;IACA,yBAAG,qBAAyB;MAC1B,+FAAwC;IAC1C;IACA,yBAAG,mBAAuB;MACxB,iFAA0B;IAC5B;IACA,yBAAG,mBAAuB;MACxB,iFAA0B;IAC5B;IAEA,eAAY,iJACgD;IAC5D,iBAAa,GAAV,WAAa,gCAAC;MACf,kBAAgB,yCAAQ;IAC1B;IAEA,8KAAuE;IACvE,+LAAgE;IAElE;;EAGA;;;;;QAEQ,upCAA8B;QAC9B,wDAAgB;IAEtB,cAAW,kEAEa;IAGxB,iBAA0B,GAAvB,QAAQ,MAAC,gBAAgB,uBAAS;MACnC,UAAU,MAAC,qBAAkB,sBAAS;MACtC;IACF,wBAA+B,GAAxB,QAAQ,MAAC,iBAAiB,uBAAS;MACxC,UAAU,MAAC,qBAAkB,uBAAU;MACvC;IACF,wBAAkC,GAA3B,UAAU,MAAC,kBAAkB,uBAAS;MAC3C;IACF;IAGA,IAAG,cAAwB,GAAtB,QAAQ,MAAC,eAAe,uBACzB,iBAAwB,GAArB,QAAQ,MAAC,cAAc,uBAC1B,iBAAwB,GAArB,QAAQ,MAAC,cAAc,uBAC1B,iBAAsB,GAAnB,QAAQ,MAAC,YAAY,uBAAU,CAClC,iBAAsB,GAAlB,UAAU,MAAC,SAAS,gCAAC;MAC3B,cAAsC,wBAAN,qBAAlB,UAAU,MAAC,QAAS,iCAAM,+BAAa;MACrD,kCAAW,0DAAwB,QAAO;IAC5C;MACE,kCAAU,UAAU,MAAC,YAAc,QAAO;IAC5C;IAGA,IACE,OAGA,AAGA,KAPG,sBAAL;;MAEI,UAAU,MAAC,eAAe,sBAAS;MACnC,UAAU,MAAC,kBAAe,uBAAU;;MAEpC,UAAU,MAAC,eAAe,uBAAU;MACpC,UAAU,MAAC,kBAAe,sBAAS;;MAEnC,UAAU,MAAC,eAAe,uBAAU;MACpC,UAAU,MAAC,kBAAe,uBAAU;MACpC,QAAQ,MAAC,cAAmC,mBAAlB,QAAQ,MAAC,UAAW,gCAAC;;IAInD,iBAAqB,GAAlB,QAAQ,MAAC,WAAY,QAAQ,MAAC,UAAQ;MACvC,iBAAqB,GAAlB,QAAQ,MAAC,WAAW,QAAQ,MAAC,UAAQ;QACtC,UAAU,MAAC,YAA2B,mBAAlB,UAAU,MAAC,QAAS,gCAAC;MAC3C,wBAAyB,GAAlB,UAAU,MAAC,SAAS,gCAAC;QAC1B,UAAU,MAAC,YAA2B,qBAAlB,UAAU,MAAC,QAAS,gCAAC;MAC3C;MACA,cAA8B,wBAAlB,UAAU,MAAC,QAAS,+BAAa;MAC7C,UAAU,MAAC,gBAAa,yDAAoB;IAC9C;EAEF;EAGA;;;;;;QAEQ,0DAAmB;QACnB,qDAAc;IAEpB,YAAU,4BAAU,yBAAY,KAAM,SACN,KAAM,oCAAO;IAC7C,WAAU,0BAAQ,SAAS;IAS3B,iBAAwB,GAArB,UAAU,MAAC,YAAY,uBAAU,iBAA2B,GAAxB,UAAU,MAAC,eAAe,uBAAS;MAExE,iBAAwB,GAArB,UAAU,MAAC,YAAY,uBAAU,iBAAW,GAAP,QAAU,gCAAE,iBAAe,GAAX,gCAAa,4CAAU;QAC7E,SAAS,MAAC,kBAAe,sBAAS;MACpC,wBAA+B,GAAxB,UAAU,MAAC,eAAe,uBAAU,iBAAW,GAAP,QAAU,gCAAE,iBAAe,GAAX,gCAAa,2CAAS;QACnF,SAAS,MAAC,iBAAc,sBAAS;MACnC;MAEA,iBAA8B,GAA3B,UAAU,MAAC,kBAAkB,wBAAU;QACxC,iBAAU,GAAP,QAAU,gCAAE,iBAAe,GAAX,gCAAa,qCAAG;UACjC,SAAS,MAAC,iBAAc,sBAAS;QACnC;;;MAIF;IAEF;MACE,iBAAU,GAAP,QAAU,gCAAE,iBAAe,GAAX,gCAAa,2CAAS;;QAEvC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,SAAS,MAAC,iBAAc,sBAAS;QACnC;MACF;MACA,iBAAU,GAAP,QAAU,gCAAE,iBAAe,GAAX,gCAAa,0CAAQ;;QAEtC,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;UACb,SAAS,MAAC,gBAAa,sBAAS;QAClC;MACF;MACA,iBAAU,GAAP,QAAU,gCAAE,iBAAe,GAAX,gCAAa,sCAAI;QAClC,SAAS,MAAC,eAAY,sBAAS;MACjC;;;MAIA,iBAAsB,GAAnB,SAAS,MAAC,WAAY,SAAS,MAAC,UAAQ;;MAG3C;MACA,SAAS,MAAC,cAAmD,qBAArB,qBAAnB,SAAS,MAAC,UAAW,SAAS,MAAC,WAAW,SAAS,MAAC,SAAO;IAElF;IAGA,iBAA8B,GAA3B,UAAU,MAAC,kBAAkB,uBAAU,iBAAW,GAAP,QAAU,iCAAG,iBAAgB,GAAZ,iCAAc,+CAAY;MACvF,SAAS,MAAC,oBAAiB,sBAAS;IACtC,wBAAkC,GAA3B,UAAU,MAAC,kBAAkB,wBAAW,iBAAW,GAAP,QAAU,gCAAE,iBAAe,GAAX,gCAAa,6CAAW;;MAEzF,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,SAAS,MAAC,mBAAgB,sBAAS;MACrC;IACF;IAEF;;EAGA;;;;;;;;;;;;;;;;;;;;;QAEQ,2DAAoB;QACpB,0DAAoB;QACpB,2DAAoB;QACpB,wDAAoB;QACpB,yDAAoB;QACpB,2DAAoB;QACpB,2DAAoB;IAE1B,aAAW,QAAQ;IAEnB,iBAAU,GAAP,QAAU,iCAAkB,2BAAU,MAAC,QAAM;MAC9C,mCAAW,SAAY,6CAAW;IACpC;IACA,iBAAU,GAAP,QAAU,iCAAkB,2BAAU,MAAC,QAAM;MAC9C,mCAAW,SAAY,+CAAY;IACrC;IACA,iBAAU,GAAP,QAAU,iCAAkB,2BAAU,MAAC,UAAQ;MAChD,mCAAW,SAAY,mDAAgB;IACzC;IACA,yBAAG,mBAAuB;MACxB;MACA,yFAAkC;IACpC;IAEA,YAAU,4CAAW;IACrB,WAAU,MAAM;IAChB,IAAG,sBAAE,iBAAsB,iBAAU,GAAP,QAAS,iCAAkB,8BAAa,MAAC,OAAM,CACzE,iBAAW,GAAP,QAAU,iCAAkB,2BAAU,MAAC,UAAQ;MACrD,IACE,OAKA,AAKA,AAGA,KAdG,MAAL;;QAEI,yBAAG,mBAAuB;UACxB,iCAAS,6BAAU,iCAAO,UAAQ;QACpC;QACA,qFAA+B;;QAE/B,yBAAG,mBAAuB;UACxB,iCAAS,6BAAU,iCAAO,UAAQ;QACpC;QACA,8FAAwC;;QAExC,YAAW,4CAAW;QACtB,yFAAkC;;QAElC,YAAW,4CAAW;;IAE5B;IAEA,yBAAG,gBAAoB;MACrB,gFAAyB;IAC3B;IAEA,yBAAG,mBAAuB;MACxB,yFAAkC;IACpC;IAEA,yBAAG,mBAAuB;MACxB,yFAAkC;IACpC;IAGA,iBAAiB,GAAd,gCAAgB,uBAAS;MAC1B,wKAE4C;IAC9C;IAEA,8VACyB;IAE3B;;EAGA;;;;QAEQ,yCAAc;QACd,4IAAoD;QACpD,yHAA0C;QAC1C,8GAAoC;IAE1C,IAAe,UAA0B;IAEzC,cAAU,qFAAiD,SAAS;IAEpE,IACE,OAEA,AAGA,KANG,OAAL;;MAEI,gCAAO,kBAAY,cAAS;;MAE5B,4DAA2B;MAC3B,gCAAgB,iCAAY,cAAS;;MAErC,4CAAO,mBAAiB;MACxB;mCACI,SAAW,QAAQ;;;;;;;;;;;;;;;;;;;MAUvB;MACA,gCAAgB,OAAO,OAAE,gCAAa,cAAS;;MAE/C,oCAAS,GAAF,iCAAI,gCAAC;;IAGhB,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;;;;;;;;;;;;;gPAW2B;IAEzB,YAAU,OAAE;IAEd;;EAGA;;;;;;8GAI+B;IAE7B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;;oJAM+B;IAE7B,YAAU,OAAE;IAEd;;EAGA;;;;;;;;;;IAEE,YAAS,kGAIkB;IAE7B;;EAGA;;IACE,WAAS,gCAA0B,GAAnB,yBAAO,kBAAc,gCAA5B,CAA+B;IAC1C;;EAGA;;;;QAEQ,yrBAAiC;QACjC,4PAA4B;IAElC,IAAe,WAAgC;IAA/C,IACe,aAAgC;IAE/C,UAAU,MAAC,qBAAkB,kBAAkB;;;MAG7C,gCAAO,wBAA+B,uBAAlB,OAA6B;8EACoB;IACvE;IAEA,sCAAqB,kBAAa,OAAoD;IAExF;;EAGA;;;;IACE,yCAAkC,QAAQ;IAC1C,YAAU,OAAE;IACd;;EAGA;;;;;;;;;;;;;;;uOAQwB;IACtB,YAAU,OAAE;IACd;;EAGA;;;;;;;;;;;;;;;uOAQwB;IACtB,YAAU,OAAE;IACd;;EAGA;;;;;;;;;;;;;;;;;QAEO,8DAAuB;QACvB,+DAAwB;QAEvB,2DAAoB;QACpB,wDAAoB;QACpB,2DAAoB;IAE1B,yBAAG,gBAAoB;MACrB,gFAAyB;IAC3B;IAEA,yBAAG,mBAAuB;MACxB,yFAAkC;IACpC;IAEA,yBAAG,kBAAsB;MACvB,wFAAiC;IACnC;IAEA,4LAA6D;IAC7D,qFAA8B;IAE9B,yBAAG,WAAwB,yBAAI,WAAqB;MAClD,sCAAc,YAAe,aAAY;MACzC,sBAAM,YAAY;IACpB;IAEA,iBAAyB,GAAtB,uBAAwB,uBAAU,yBAAI,qBAAyB;oIACC;IACnE;8DACqC;MACnC,yBAAG,qBAAmB;+DACc;MACpC,gCAAO,qBAAyB;+DACI;MACpC;MACA,yBAAG,uBAA2B;iEACQ;MACtC;IACF;IAEA,YAAU,OAAE;IAEd;;AACF","file":"zcl_abapgit_html.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_chunk_lib.clas.mjs":{"lineLengths":[53,38,33,32,53,37,202,364,315,412,61,609,1279,434,227,375,395,399,1477,333,997,587,333,233,229,229,339,485,798,524,663,804,653,374,470,310,803,390,767,280,2277,2278,17,42,22,63,3,29,64,16,3,28,56,3,35,135,116,172,87,907,75,194,5,19,3,24,52,3,31,135,144,175,19,3,29,57,3,36,65,71,9,188,136,210,157,118,17,122,13,194,143,125,45,21,26,48,84,65,17,20,24,13,11,16,18,9,7,5,32,60,5,39,69,2077,63,45,364,184,229,187,87,181,83,40,14,133,7,74,183,7,21,5,32,60,5,39,69,2077,63,71,125,81,163,343,21,5,32,60,5,39,69,54,66,54,66,290,87,39,7,21,5,26,54,5,33,137,89,882,21,5,41,69,5,48,88,87,87,140,40,5,37,65,5,44,125,71,69,108,75,135,63,109,84,111,68,71,80,81,69,69,69,70,56,32,59,69,14,153,7,54,33,119,59,100,65,88,107,16,93,121,9,14,151,7,112,143,79,76,72,300,64,74,69,14,79,76,72,7,81,143,90,68,274,14,70,7,103,21,5,38,66,5,45,125,50,69,45,54,81,117,262,101,284,21,5,31,59,5,38,125,132,66,70,66,76,84,70,70,41,59,125,7,81,53,67,14,31,7,142,271,102,21,5,43,71,5,50,125,132,66,75,73,278,87,70,69,115,81,70,115,56,138,325,335,330,329,170,136,43,85,54,79,64,21,11,232,9,7,132,276,123,304,98,146,95,175,55,222,335,9,7,80,92,364,343,98,128,131,98,98,21,5,39,67,5,46,125,324,66,81,288,21,5,35,63,5,42,69,77,87,268,125,69,131,227,136,78,100,100,71,21,5,35,63,5,42,125,71,69,70,66,102,63,97,69,63,108,81,109,128,72,72,70,81,61,73,7,67,68,108,7,232,666,52,410,7,115,71,102,102,21,5,36,64,5,43,69,96,69,96,69,71,127,82,61,62,67,55,52,74,76,67,81,76,68,9,37,130,243,172,18,177,11,136,171,133,170,133,184,135,170,9,7,52,93,21,5,36,64,5,43,125,81,146,440,102,21,5,36,64,5,43,69,265,69,141,87,81,99,268,66,70,70,371,125,44,23,7,69,118,147,28,40,40,152,72,121,138,64,73,150,11,73,161,157,11,89,9,66,235,9,163,69,7,99,71,21,5,30,58,5,37,125,121,63,69,69,100,757,583,81,120,23,7,50,67,38,83,95,157,102,151,18,48,11,63,103,11,140,100,44,16,141,155,9,7,59,99,7,91,93,7,331,21,5,47,75,5,54,125,943,75,73,75,114,99,68,74,741,81,72,37,59,73,147,9,87,76,58,81,167,11,73,79,318,20,333,13,96,379,18,67,11,9,118,77,95,18,95,11,9,91,69,7,21,5,38,66,5,45,125,104,72,109,84,111,112,93,118,57,69,70,81,45,23,7,72,165,7,34,167,118,169,68,340,14,73,7,103,21,5,30,58,5,37,125,69,63,109,84,111,69,69,71,254,81,42,23,7,158,115,68,110,73,35,48,62,107,126,124,18,154,11,101,9,14,70,7,103,21,5,38,66,5,45,125,71,69,350,4621,74,65,4406,4433,161,130,77,42,73,124,77,7,59,92,81,116,73,38,285,68,101,9,75,7,98,217,115,140,99,21,5,34,62,5,41,125,121,63,110,87,113,109,84,111,109,84,111,107,78,108,116,105,126,121,63,142,150,132,69,69,81,96,105,71,76,14,79,76,7,121,119,90,195,106,60,472,7,66,631,7,106,60,648,7,165,13,101,21,110,28,70,92,161,13,18,20,11,9,7,129,91,83,16,75,9,441,7,101,125,242,66,14,66,7,486,143,151,7,137,178,7,106,60,70,162,9,7,69,163,7,101,110,21,5,46,74,5,53,125,63,142,84,114,120,110,126,76,100,70,238,83,11,99,481,19,108,211,16,18,9,7,5,34,62,5,41,125,102,60,126,129,378,74,565,7,21,5,36,64,5,43,125,63,114,81,69,188,36,130,179,137,177,138,178,14,15,7,5,36,64,5,43,125,69,63,70,66,70,66,75,81,107,78,108,70,81,53,99,7,58,140,7,66,96,7,185,231,21,5,35,63,5,42,73,103,78,62,62,129,158,25,5,35,63,5,42,125,102,78,109,84,111,107,78,108,70,69,81,47,23,7,156,223,66,287,14,122,176,70,173,16,77,9,105,7,21,5,35,63,5,42,125,103,75,109,84,111,107,78,108,112,93,118,70,69,81,46,23,7,162,108,7,212,66,213,14,117,175,160,172,16,76,9,105,7,21,5,40,68,5,47,125,69,63,81,127,275,102,21,5,40,68,5,47,137,103,60,68,60,155,2134,164,21,5,35,63,5,42,137,68,60,150,664,21,5,35,63,5,42,74,73,75,71,81,119,71,82,36,158,157,84,122,74,7,85,106,143,7,26,5,3,72,123,70,352,35,59],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap"],"names":[],"mappings":";;AAkQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;QAEO,2GAAsC;IAE3C,6BAA0B,yIAA0E;;04BAkBzC;IAE3D,iBAA2B,GAAxB,yBAA0B,uBAAS;iMAGsB;IAC5D;IAEF;;EAGA;;;;;;8KAMwD;IAExD;;EAGA;;;;QAEO,wDAAiB;IACtB,UAAQ,uDAAqB;IAE7B;;;;;;;;;;;;;;;;;;;;;;;;;;MAWA;IAEF;IAGA;;;;;;;MAEE,IACE,OAGA,AAGA,AAGA,KAVG,OAAO,MAAC,SAAb;;QAEI,aAAU,iKAC0C;;QAEpD,aAAU,oKAC4C;;QAEtD,aAAU,8JAC6C;;QAEvD,YAAU,kBAAK;;QAEf,aAAU,8GAA6C;;MAG3D,iBAAkB,GAAf,OAAO,MAAC,SAAS,uBAAS;QAC3B,aAAU,gKAC4C;MACxD;MAEF;;IAGA;;;;;;;UAEO,4DAAqB;UACrB,kHAAoC;;MAIzC,eAAY,4IAEsB;MAElC,aAAU,kUAE6D;MAEzE;;IAGA;;;;;;;;;MAEE,yRAAkF;MAGlF,iBAAW,GAAR,SAAW,iDAAc;QAC1B,sBAAM,OAAO;MACf;MAEF;;IAGA;;;;;;i3BAkB6D;MAE7D;;IAGA;;;;;;;MAEE,+BAA6B,+BAC3B,KAAQ,iBACR,OAAQ,yCAAY;MAExB;;IAGA;;;;;;;;;;;;;;UAGI,yDAA+B;UAC/B,4DAA+B;UAC/B,qEAA+B;UAC/B,sEAA+B;UAC/B,0DAA+B;UAC/B,0DAA+B;UAC/B,0DAA+B;UAC/B,2DAA+B;MAEjC,yBAAG,sBAA0B;QAC3B,WAAS,WAAW;MACtB,gCAAO,kBAAgB;QACrB,YAAS,+CAAmB;MAC9B;wJACkF;MAClF;MAEA,yBAAG,oBAAwB;QACzB,cAAY,SAAS;QACrB,aAAU,gGAA0D;MACtE,gCAAO,kBAAgB;QACrB,wBAAqB,kEAA+B;QACpD,yBAAG,6BAAiC;UAElC,wBAAsB,oDAAuB;UAC7C,+FAAwC;QAC1C;UACE,eAAY,kEAA+B;UAC3C,aAAU,gGAA0D;QACtE;MACF;sJACgF;MAChF;MAEA,IACE,OAIA,MALG,wFAAL;;QAEI,aAAW,wDAAsB;QACjC,YAAW,sDAAoB;QAC/B,YAAW,kDAAgB;;QAG3B,aAAW,yCAAQ;QACnB,YAAW,oDAAkB;QAC7B,YAAW,+CAAa;;QAExB,aAAW,wDAAsB;QACjC,YAAW,sDAAoB;QAC/B,YAAW,kDAAgB;;;8IAIc;yFAEP;MACtC,iBAAkB,GAAf,gBAAiB,uBAAS;iRAEO;MACpC;qEACyB;MACzB;sGACyB;MAE3B;;IAGA;;;;;;;;;;oHAIwC;qQAC4B;oGAC3C;MAEvB,aAAU,uQAKiB;MAE7B;;IAGA;;;;;;;;;;;UAEO,2DAAoB;UACpB,2DAA+C,CAAA;;MAEpD,yBAAG,yBAA6B;QAC9B,mCAAW,+BAAY,iCAAO,gBAAc;MAC9C;;MAIA,yBAAG,mBAAiB;QAClB,cAAW,2CAAqB;MAClC;QACE,aAAW,QAAQ;MACrB;6IAE4C;8QACgC;qGACpD;MAE1B;;IAGA;;;;;;;UAGI,gEAAkC;UAClC,8DAAkC;UAClC,2QAAwC;UACxC,4EAAoC;UACpC,2DAAkC;UAClC,0DAAkC;MACpC,IACE,yBAAmC;;MAKrC,mBAAgB,2CAAqB;MACrC,iBAAc,0FAA8C;MAE5D,yBAAG,sBAA0B;QAC3B,gIAAyE;QAEzE,0TAEmC;QAEnC,oUAEmC;QAEnC,+TAEmC;QAEnC,8TAEmC;QAEnC,+JAEsC;QAEtC;QACA,sBAAM,WAAW;;;UAGf,yBAAS,yBAAuB;UAEhC,yBAAG,0BAAkC;YACnC;UACF;UAEA,4NAAoG;QACtG;MACF;mIAE0D;mRACuB;0HAChC;+SAMK;iGAE9B;iJAEgD;MAExE,yBAAG,QAAQ,OAAE,uBAAuB,MAAC,iBAAoB;QAEvD,cAAW,uJAE2C;QAEtD,yBAAG,mBAAuB;UACxB,kNAA6G;8UAO9E;QACjC;MACF;+EAEyE;MAEzE,cAAW,sEAAyC;2WAOtB;sVAMJ;iGAEF;+HAC8B;kIACrB;iGACT;iGACA;MAE1B;;IAGA;;;;;;;;+RAKkH;MAElH;;IAGA;;;;;;;UAIO,iQAA8B;UAC9B,kHAAoC;MACzC,aAAU,gDAA2B;MAErC,gCAAO,8EAA2C,YAAY;MAC9D,iCAAO,6KAEkB,YAAY;MACrC,gCAAO,mFAAgD,YAAY;MACnE,gCAAO,yBAAmB,YAAY;MACtC,gCAAO,+CAAY,YAAY;MAC/B,gCAAO,+CAAY,YAAY;MAE/B,YAAU,8BAAiB,OAAQ,cAAc;MAEnD;;IAGA;;;;;;;;;;;;;;;;;;;UAEO,6DAAsB;UACtB,2DAAoB;;MAIzB,iBAAW,GAAR,SAAU,uBAAS;QACpB,eAAa,gDAAc;MAC7B;MAEA,aAAW,8CAAY;MACvB,iBAAiB,GAAd,eAAgB,wBAAU;QAC3B,mCAAW,SAAY,sDAAmB;MAC5C;uOAEsF;ypBASxD;MAE9B,yBAAG,kBAAsB;yZAKR;MACjB;kHAEyC;sEACf;qGACF;qGACA;MAE1B;;IAGA;;;;;;;;;UAEQ,4DAAqB;MAE3B,IAAc,YAAqB;MAGnC,YAAU,8DAA4B;;;;;QAGpC,IACE,OAGA,KAJG,eAAE,MAAC,MAAR;;UAEI,+DAA8B;UAC9B,cAAY,yCAAQ;;UAEpB,+DAA8B;UAC9B,cAAY,0CAAS;;QAGzB,IACE,OAMA,AAEA,AAEA,AAEA,KAbG,YAAL;;UAEI,iBAAa,GAAV,WAAY,wCAAyB,+BAAO,MAAC,OAAM,iBAAa,GAAV,WAAY,wCAAyB,+BAAO,MAAC,OAAK;YACzG,kCAAU,4HAAyE;UACrF;YACE,kCAAU,iIAA8E;UAC1F;;UAEA,kCAAU,6HAA0E;;UAEpF,kCAAU,4HAAyE;;UAEnF,kCAAU,0IAAuF;;UAEjG,kCAAU,4HAAyE;;MAEzF;;MAEA,kCAAU,QAAW,2CAAS;MAEhC;;IAGA;;;;;;iJAEqE;ubAGE;qGAC7C;MAC1B;;IAGA;;;;;;;;;;;UAEO,iQAA8B;UAC9B,uDAAgB;UAChB,2DAAoB;UACpB,2DAAoB;UACpB,wWAAsD;UACtD,kHAAoC;MAEzC,yBAAG,UAAoB;QACrB;MACF;MAEA,aAAU,gDAA2B;MAErC,gCAAO,iEAA8B,YAAY;;;QAG/C,sBAAM,QAAQ;QACd,sBAAM,QAAQ;QACd,qBAAkB,yHAAoE;QACtF,yBAAG,eAAe,MAAC,eAAkB;UACnC,6GAAgD;QAClD,gCAAO,eAAe,MAAC,cAAkB,yBAAG,eAAe,MAAC,cAAiB;UAC3E,aAAW,uCAAU;UACrB,yBAAG,eAAe,MAAC,cAAiB;YAClC,mCAAW,qGAA4C;UACzD;UACA,yBAAG,eAAe,MAAC,cAAiB;YAClC,mCAAW,gHAAuD;YAClE,mCAAW,4GAAmD;UAChE;UACA,mCAAW,SAAY,iCAAG;QAC5B;QAEA,yBAAG,8BAAkC;UACnC,UAAO,qNAIY;QACrB;QACA,yJAAkD;QAClD,gCAAO,cAAQ,YAAY;MAC7B;MAEA,gCAAO,8CAAW,YAAY;MAE9B,YAAU,8BAAiB,OAAQ,cAAc;MAEnD;;IAGA;;;;;;;UAEQ,0DAAmB;UACnB,0DAAmB;UACnB,yFAAsB;UACtB,0uBAAsC;MAE5C,IAAe,WAA6B;;MAI5C,yBAAG,QAAqB,iBAAwB,IAArB,iCAAuB,wBAAU;QAC1D;MACF;MAEA,YAAS,8BAAmB;;;QAI1B,iBAAuB,GAApB,WAAS,MAAC,YAAY,uBAAS;UAChC,iBAAwB,GAArB,WAAS,MAAC,aAAa,gCAAC;YACzB,kCAAU,WAAS,MAAC,MAAQ,sFAAmD;UACjF,wBAA4B,GAArB,WAAS,MAAC,aAAa,gCAAC;YAC7B,kCAAU,WAAS,MAAC,MAAQ,gFAA6C;UAC3E;YACE,YAAU,WAAS,MAAC,KAAI;UAC1B;UACA,iBAAS,GAAN,OAAQ,uBAAS;sGACK;UACzB;2IACsC;mGAChB;UACtB,UAAQ,sBAAS;QACnB;UACE,WAAS,MAAC,UAAO,qBAAQ,KAAS,WAAS,MAAC,OACnB,QAAS,+BAAgB,aAAa;0JAClB;QAC/C;MACF;MACA,iBAAS,GAAN,OAAQ,uBAAS;kGACK;MACzB;MAGA,iBAA6B,IAA1B,sCAA4B,uBAAS;QACtC,YAAU,uEAAqC;MACjD;MAEA,aAAU,sTAKc;MAE1B;;IAGA;;;;;;;;;;;UAGI,yDAAwB;UACxB,+DAAwB;MAE1B,IAAc,UAAiC;;;;QAM7C,WAAS,sCAAK;QACd,yBAAG,UAAQ,MAAC,qBAAwB;UAClC,iCAAS,sGAA2C;QACtD;QACA,iCAAS,OAAU,qCAAG;QAEtB,yBAAG,UAAQ,MAAC,wBAA2B;UACrC,iBAAe,UAAQ,MAAC,aAAY;UACpC,iBAAmB,GAAhB,UAAQ,MAAC,SAAS,uBAAS;YAC5B,uCAAe,kHAAqC;UACtD;UACA,iBAAsB,GAAnB,UAAQ,MAAC,YAAY,YAAW;YACjC,iBAAuB,GAApB,qBAAsB,uBAAS;cAChC,iCAAS,QAAU,qQAGU;YAC/B;cACE,iCAAS,QAAU,oRAGU;YAC/B;UACF,wBAA+B,GAAxB,UAAQ,MAAC,iBAAiB,uBAAS;YACxC,iCAAS,QAAU,oUAGU;UAC/B;YACE,iCAAS,OAAU,aAAY;UACjC;QACF;QACA,iBAAsB,GAAnB,UAAQ,MAAC,YAAY,YACxB,yBAAI,sBAA0B;UAC5B,iBAAuB,GAApB,qBAAsB,uBAAS;YAChC,iCAAS,gDAAqB;UAChC;YACE,iCAAS,gDAAqB;UAChC;QACF;QAEA,iCAAS,OAAU,yCAAO;oEACJ;MACxB;MAEF;;IAGA;;;;;;;;;;;;;UAGI,8CAA+B;UAC/B,0DAAuB;UACvB,2DAAuB;;MAIzB,yBAAG,WAAqB;QACtB;MACF;MAEA,iBAAqB,GAAlB,mBAAoB,wBAAU;QAC/B,cAAW,6IAAuE;MACpF;MAEA,gBAAc,UAAU;MACxB,aAAU,kJAEmB;qHAEe;wKAEA;MAC5C,iBAAkB,GAAf,gBAAiB,uBAAS;mVAGkB;MAC/C;wEAC4B;MAC5B;sGACyB;MAE3B;;IAGA;;;;;;;;;;UAGI,0DAAsB;UACtB,0DAAsB;UACtB,4DAAsB;UACtB,mPAAyD;;MAI3D,yBAAG,QAAkB;QACnB;MACF;MAEA,sJAA0E;kHAEjC;MAEzC,iBAAkB,GAAf,gBAAiB,uBAAS;QAC3B;;;UAGE,yBAAG,UAAoB;YAErB,YAAU,oCAAG;UACf,wBAAgB,GAAT,eAAE,MAAC,QAAQ,yBAAO,aAAY;YACnC,kCAAU,8BAAW,UAAa,sCAAG;2HAED;UACtC;yJAEoD;UACpD;oGACmB;QACrB;MACF;qEACyB;MACzB;sGAEyB;MAE3B;;IAGA;;;;;;;UAEO,mVAAwD;UACxD,kgJAAmD;UACnD,+DAAwB;UACxB,sDAAc;UACd,2yIAAsC;MAE3C,IACE,WAAuC;MADzC,IAEE,eAA2C;MAE7C,sBAAmB,oGAA8C;;;QAG/D,iBAAe,eAAa,OAAE,wBAAO;QACrC,YAAY,MAAC,eAAc,MAAC,mBAAe,wDAA0B;QACrE,gCAAO,sBAAgB,YAAY;MACrC;MAEA,YAAU,yBAAO,cAAc;MAC/B;;mHAIqC;;;QAEnC,mRAEmE;QACnE,iBAAY,GAAT,eAAE,MAAC,QAAQ,QAAO;UACnB,uCAAe,aAAgB,qCAAG;QACpC;0EAC4B;MAC9B;iGACoB;wNAGE;kHACc;2IACyB;kGACxC;MAEvB;;IAGA;;;;;;;;;;;;;;;;;;;;;;;;UAEQ,mIAAkD;UAClD,2IAAyD;UACzD,yHAAgD;UAChD,0DAA0B;UAC1B,0DAA0B;;;MAKhC,iBAA0B,IAAvB,oDAAyB,uBAAS;QACnC,YAAU,iDAAe;QACzB,YAAU,sDAAoB;MAChC;QACE,YAAU,yDAAuB;QACjC,YAAU,sDAAoB;MAChC;wHAE0C;sHAEF;yFAIF;kMAC8B;MACpE,iBAA0B,IAAvB,oDAAyB,wBAAU;mCACpC,gBAAkB,OAAO;udAKS;MACpC;MAEA,iBAAgB,GAAb,cAAe,uBAAS;snBAMS;MACpC;MAEA,iBAA0B,IAAvB,oDAAyB,wBAAU;mCACpC,gBAAkB,OAAO;uoBAOS;MACpC;MAEA,iBAA0B,IAAvB,oDAAyB,wBAAW,iBAAmB,GAAf,gBAAiB,uBAAS;QACnE;oGAEkE;;;;;;;;;;;QAOlE;MACF;MAGA,yBAAG,kBAAiB,iBAAyB,IAArB,iCAAuB,uBAAS;QACtD,iBAA2B,IAAxB,oCAA0B,uBAAS;UACpC,YAAU,2DAAyB;QACrC;UACE,YAAU,mDAAiB;QAC7B;wbAMkC;MACpC;oGACuB;4HAEuB;MAG9C,iBAAa,GAAV,yBAAY,4LAAsF;QACnG,YAAU,4CAAW;MACvB;QACE,YAAU,4CAAW;MACvB;qeAIwE;MAGxE,iBAA2C,IAAxC,0FAA0C,uBAAS;sJACkB;MACxE;MAGA,iBAAkD,KAA/C,kEAA+B,iBAAkB,uBAAS;iLAET;MACpD;MAGA,iBAA0B,IAAvB,oDAAyB,wBAAU;mCACpC,gBAAkB,OAAO;QACzB,iBAAkB,GAAf,gBAAiB,uBAAS;iKAEiD;QAC9E;MACF;MAGA,iBAAmB,GAAhB,iBAAkB,uBAAS;kKACkC;MAChE;oGAEuB;6GACQ;MAEjC;;IAGA;;;;;;;;UAEQ,uGAA8D;UAC9D,6GAA8D;UAC9D,mGAA8D;UAC9D,mHAAoD;UACpD,iEAAgC;MAEtC,oBAAiB,wEAAqC;MACtD,yBAAuB,qCAAiB;MAExC,oBAAiB,kNAEoC;;MAIrD;QACI,oBAAiB,qEAAgD;geAK/B;;;;;;;MAGtC;IAEF;IAGA;;;;;;;;;MAEE,aAAU,qWAG+D;MAEzE,yBAAG,wCAA4C;ojBAOjB;MAC9B;MAEF;;IAGA;;;;;;;;UAEO,0DAAmB;MAExB,aAAU,uKAE2B;MAErC,IACE,OAEA,AAEA,KALG,aAAL;;kLAEmF;;gLAEF;;iLAEC;;QAE9E;;IAGN;IAGA;;;;;;;;;;;;;;;;UAEO,2DAAoB;;MAIzB,yBAAG,mBAAuB;QACxB,yFAAkC;MACpC;MAEA,yBAAG,wBAA4B;QAC7B,mCAAW,+FAA4C;MACzD;MAEA,iBAAgB,GAAb,cAAe,uBAAS;QACzB,mCAAW,mDAAwB;MACrC;wLAE+D;sOACsB;MAEvF;;IAGA;;;;;;;UAEO,mDAAc;UACd,mDAAc;;MAOnB,sJAA+D;MAEjE;;IAGA;;;;;;;;;;;;;UAGI,2DAAoB;UACpB,0DAAoB;;MAItB,yBAAG,aAAuB;QACxB;MACF;MAEA,cAAW,sIAAqE;MAEhF,uNAA2F;MAE3F,iBAAgB,GAAb,cAAe,uBAAS;8RAGoD;MAC/E;yHACgD;+KAGJ;QAC1C,iBAAkB,GAAf,gBAAiB,uBAAS;4KAGoB;QACjD;4EAC8B;QAC9B;wGAEyB;MAC3B;MAEF;;IAGA;;;;;;;;;;;;;;;;UAGI,2DAAoB;UACpB,0DAAoB;;MAItB,yBAAG,YAAsB;QACvB;MACF;MAEA,iBAAe,GAAZ,aAAe,0CAA2B,eAAe,iBAAsB,GAAlB,mBAAoB,wBAAU;QAC5F,cAAW,oFAAiD;MAC9D;MAEA,4MAAgF;MAEhF,iBAAgB,GAAb,cAAe,uBAAS;oNAGmD;MAC9E;oHAC2C;8KAGC;QAC1C,iBAAkB,GAAf,gBAAiB,uBAAU,iBAAgB,GAAZ,aAAe,0CAA2B,eAAc;2KAG1C;QAChD;2EAC6B;QAC7B;wGAEyB;MAC3B;MAEF;;IAGA;;;;;;;;8HAGkD;kRACgC;qGACxD;MAE1B;;IAGA;;;;;;;;;;qlEAuB6E;mKAKtD;MAEvB;;IAGA;;;;;;;;upBAWuF;MAEvF;;IAGA;;;;;;;;;;UACO,4DAAoB;UACpB,uEAA+B;MAEpC,iBAAe,WAAW;MAE1B,qJAA8D;MAC9D,oJAA6D;MAC7D,iBAAgB,GAAb,cAAgB,yCAAO;QACxB,kBAAuC,qBAAvB,0BAAQ,eAAiB,gCAAC;QAC1C,iBAAgB,+CAA2B;MAC7C;MAEA,iBAA0B,GAAvB,0BAAQ,gBAAiB,cAAa;QACvC,6BAAyC,qBAAd,cAAgB,gCAAC;QAC5C,uCAAe,2DAA0C,mCAAK;MAChE;MACF;;EACF","file":"zcl_abapgit_gui_chunk_lib.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_action_utils.clas.mjs":{"lineLengths":[53,42,37,32,57,37,180,602,537,488,671,268,1005,715,462,268,389,390,61,592,17,42,22,85,3,29,64,16,3,26,58,3,33,67,61,47,61,386,61,195,77,37,112,82,41,91,89,64,43,12,112,5,65,3,29,61,3,36,69,24,9,150,17,106,114,14,16,7,5,3,29,61,3,36,69,388,58,387,127,129,113,21,3,27,59,3,34,69,67,61,387,117,113,21,3,36,68,3,43,387,64,227,68,37,89,5,3,28,60,3,35,69,101,58,46,58,387,115,117,121,113,21,3,28,60,3,35,69,54,73,55,73,71,73,387,121,121,54,123,5,113,21,3,27,59,3,34,69,101,58,48,64,387,115,123,123,113,21,3,29,61,3,36,387,47,64,107,82,110,267,195,104,111,72,41,38,165,165,43,17,7,68,5,66,61,5,21,3,45,77,3,52,387,47,64,109,21,3,37,69,3,44,387,329,76,107,82,110,83,94,66,101,12,85,5,21,3,35,67,3,42,69,328,73,329,110,74,44,23,5,34,59,22,48,51,70,72,29,195,85,5,50,114,88,21,3,25,57,3,32,69,69,67,29,168,168,168,168,168,168,157,21,3,1,78,103,72,39,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_html_action_utils.clas.abap"],"names":[],"mappings":";;AAiFA;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;;;;;;;QAEO,0LAA8B;IAEnC,IAAc,UAAiB;IAE/B,QAAQ,MAAC,UAAO,OAAO;IAEvB,IACE,OAEA,OAHG,qFAAiD,IAAtD;;MAEI,QAAQ,MAAC,WAAQ,QAAQ;;MAEzB,gFAA0D;MAC1D,6CAAO,WAAoB;MAC3B,QAAQ,MAAC,WAAQ,UAAQ;;MAEzB,oCAAS,GAAF,iCAAI,gCAAC;;IAGhB,gCAAO,kBAAY,QAAQ;EAE7B;EAGA;;;;QAEY,4DAAiC,CAAA;;IAE3C;MACI,yDAAwB,qFAAsD;;;;;;;IAGlF;EAEF;EAGA;;;;;;;QAEQ,0XAAwB;8HAG6C;gIAEC;IAE5E,eAAY,4FAA8C;IAE5D;;EAGA;;;;;;;QAEQ,0XAAwB;oHAEyC;IACvE,eAAY,4FAA8C;IAE5D;;EAGA;;;;;;IAEE,IAAc,YAAiC;;;MAG7C,YAAU,MAAC,UAAO,4BAAU,YAAU,MAAC,OAAM;IAC/C;EAEF;EAGA;;;;;;;;;QAEQ,0XAAwB;kHAIwC;oHAEC;wHAEA;IAEvE,eAAY,4FAA8C;IAE5D;;EAGA;;;;;;;;;;;QAEQ,0XAAwB;wHAI6C;wHAEA;IAE3E,yBAAG,sBAA0B;0HAEgD;IAC7E;IAEA,eAAY,4FAA8C;IAE5D;;EAGA;;;;;;;;;QAEQ,0XAAwB;kHAIwC;0HAEG;0HAEA;IAEzE,eAAY,4FAA8C;IAE5D;;EAGA;;;;;;;;;;QAGI,kQAA+B;QAC/B,0LAAoC;IAEtC,IAAc,gBAAyC;IAEvD;;;MAIE,sBAAM,QAAQ;MAId,QAAQ,MAAC,WAAO,oIAED;MAEf,QAAQ,MAAC,YAAQ,mIAEF;MAEf,yBAAG,SAAmB;QACpB;MACF;MAEA,gCAAO,kBAAY,SAAS;IAE9B;IAEA,iBAAkB,GAAf,gBAAiB,uBAAS;4DAC0B;IACvD;IAEF;;EAGA;;;;;;;IAEE,eAAY,wFAEkB;IAEhC;;EAGA;;;;;;;;;;QAEO,0EAAmC;IAExC,6BAA0B,2DAAkC;IAC5D,iBAAkB,GAAf,gBAAiB,uBAAS;MAC3B,eAAY,8EAAuD;IACrE;MACE,eAAY,8DAAuC;IACrD;IAEF;;EAGA;;;;;;;QAEQ,gUAA6D;QAC7D,qGAA2C;QAC3C,iEAAyB;IAE/B,yBAAG,YAAsB;MACvB;IACF;IAEA,iBAAe,WAAW;IAG1B,4BAAM;;;;MACJ,uBAAqB,yBAAO,cAAc;MAC1C;2BAAkE;MAGlE,kBAAe,sBAAS,KAAO,cACP,MAAO,yDACP,MAAO,oBACP,KAAO,kCAAG;;IAEpC;;IAEA,sCAAqB,uBAAkB,SACF;IACrC,sCAAY,WAAU,uBAAkB,SACrB;IAErB;;EAGA;;;;;;;IAGE,cAAY,SAAS;IAGrB,iKAAoE;IACpE,iKAAoE;IACpE,iKAAoE;IACpE,iKAAoE;IACpE,iKAAoE;IACpE,iKAAoE;IACpE,sJAAsE;IAExE;;AACF","file":"zcl_abapgit_html_action_utils.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_language.clas.mjs":{"lineLengths":[53,33,28,32,48,37,210,79,66,208,17,42,22,68,3,29,64,16,3,29,52,3,36,68,70,3,34,57,3,41,70,3,37,60,3,44,105,73,43,3,1,60,124,63,30,54],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_language.clas.abap"],"names":[],"mappings":";;AAyBA;;;;;;;;;;;;;;;;;EAGE;;;;QAEO,2DAAoB;;EAI3B;EAGA;;;;;EAIA;EAGA;;;;;;;EAIA;AACF","file":"zcl_abapgit_language.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_labels.clas.mjs":{"lineLengths":[53,36,31,32,51,37,166,153,529,272,61,159,459,269,166,740,342,276,565,17,42,22,53,67,3,29,64,16,3,29,55,3,36,146,3,26,52,3,33,69,69,67,263,267,98,62,68,35,82,90,76,7,5,43,73,112,21,3,33,59,3,40,69,69,67,531,535,262,67,332,69,68,33,11,63,74,19,108,16,18,9,7,5,69,94,72,33,140,66,5,107,21,3,28,54,3,35,363,68,64,66,41,23,5,108,50,138,12,40,5,21,3,22,48,3,29,263,69,67,98,107,68,35,60,5,113,21,3,29,55,3,36,537,69,67,262,75,300,99,157,112,67,36,61,56,141,68,68,72,7,5,27,3,38,64,3,45,130,69,67,531,332,69,72,68,33,11,93,19,108,16,18,9,7,5,18,3,25,51,3,32,69,67,263,98,62,68,35,82,90,184,7,5,3,32,58,3,39,69,67,531,332,69,68,33,100,5,3,41,67,3,48,301,55,64,64,106,369,50,160,5,50,160,5,87,88,171,5,81,68,114,90,173,7,5,67,74,5,67,74,5,3,35,61,3,42,68,64,64,64,106,62,51,98,90,173,7,55,132,162,7,5,3,1,66,84,91,61,66,326,553,378,33,57],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_repo_labels.clas.abap"],"names":[],"mappings":";;AA0FA;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;;;;IACE,4IAAqC;EACvC;EAGA;;;;;;;QAEO,8PAA2B;QAC3B,kQAA+B;IACpC,IAAc,UAA+B;IAE7C,eAAY,yCAAkB;;;;MAI5B,iBAAY,GAAT,eAAE,MAAC,QAAQ,gCAAC;QACb,gCAAO,oBAAY,aAAa;MAClC;IACF;IAEA;;IAGA,cAAY,8BACV,OAAQ,eACR,KAAM,mCAAM;IAEhB;;EAGA;;;;;;;QAEO,0gBAA8B;QAC9B,8gBAAkC;QAClC,6PAA0B;QAC1B,0DAAmB;IACxB,IAAc,QAA6B;IAE3C,eAAY,gDAAyB;;;MAGnC;8DACsC;QAClC,gCAAO,kBAAU,aAAa;;;;;;MAElC;IACF;IAEA;;;;MAIE,kCAAU,QAAM,MAAC,6BAAS,iCAAO,QAAM,MAAC,QAAK;MAC7C,gCAAO,iBAAW,QAAQ;IAC5B;IAEA,cAAY,8BACV,OAAQ,UACR,KAAM,mCAAM;IAEhB;;EAGA;;;;;;;QAEO,yDAAkB;IAEvB,yBAAG,SAAmB;MACpB;IACF;IAEA,iBAAiB,GAAd,4CAAgB,qCAAG;MACpB,WAAU,+BAAU;MACpB;IACF;MACE,SAAS,MAAC,SAAM,QAAQ;IAC1B;IAEF;;EAGA;;;;;;;IAEE,IAAc,UAA+B;IAE7C;;;MAEE,yBAAS,UAAQ;IACnB;;IAGF;;EAGA;;;;;;;QAEO,6PAA0B;QAC1B,kEAA8B;QAC9B,mSAAiC;IACtC,IAAc,WAA+B;IAE7C,oBAAkB,sBAChB,KAAM,WACN,KAAM,uCAAwB,SAC9B,MAAO,kCAAK;IAEd;;;MAEE,yBAAS,WAAS;MAClB,yBAAG,sBAAwB;QACzB;QACA,yBAAS,IAAI,MAAC,MAAK;QACnB,yBAAS,IAAI,MAAC,MAAK;QACnB,gCAAO,cAAQ,eAAe;MAChC;IACF;IAEF;;EAGA;;;;;;;QAEO,0gBAA8B;IACnC,IAAc,QAA6B;IAE3C,eAAY,gDAAyB;IAErC,YAAS,sDAAiC;;;MAExC;4FAG6B;;;;;;MAE7B;IACF;IAEF;;EAGA;;;;;;QAEO,8PAA2B;IAChC,IAAc,UAA+B;IAE7C,eAAY,yCAAkB;;;;MAI5B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;uLAC2D;MAC3E;IAEF;EAEF;EAGA;;;;;;QAEO,0gBAA8B;IACnC,IAAc,QAA6B;IAE3C,eAAY,gDAAyB;;;mGAKZ;IACzB;EAEF;EAGA;;;;;;;;;QAEO,wWAA6B;IAElC,yBAAG,KAAK,MAAC,OAAgB;+JAC+C;IACxE;IAEA,yBAAG,KAAK,MAAC,OAAgB;+JAC+C;IACxE;;IAGA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;0KACmE;IACnF;IAEA,qBAAkB,sDAA0B;IAC5C,yBAAG,eAAe,MAAC,eAAkB;;MAEnC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4KACmE;MACnF;IACF;IACA,yBAAG,eAAe,MAAC,cAAiB;yEACM;IAC1C;IACA,yBAAG,eAAe,MAAC,cAAiB;yEACM;IAC1C;EAEF;EAGA;;;;;;;;;QAEO,qDAAa;IAElB,yBAAG,mBAAuB;;MAExB,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;4KACmE;MACnF;MACA,WAAS,0BAAQ,UAAU;MAC3B,IAAG,CAAI,cAAS,GAAP,QAAS,gCAAE,iBAAU,GAAP,QAAS,gCAAE,CAAC;iKACqC;MACxE;IACF;EAEF;AACF","file":"zcl_abapgit_repo_labels.clas.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_dependencies.clas.testclasses.mjs":{"lineLengths":[87,53,49,24,32,74,62,200,395,213,416,17,42,22,103,318,3,29,102,70,36,16,3,49,11,3,52,74,26,26,3,52,100,26,26,3,52,320,86,40,5,19,3,33,317,85,46,3,66,121,40,3,47,1035,70,3,53,100,64,3,48,3,42,100,19,3,54,309,29,3,55,71,30,3,54,320,19,3,47,55,23,3,1,82,321,0,29,32,79,37,911,395,76,482,70,262,17,42,22,814,318,3,29,64,16,3,26,245,251,251,44,135,135,135,3,28,52,67,55,73,54,70,108,88,595,102,41,45,43,75,59,34,86,5,3,38,168,176,94,157,95,3,39,63,61,54,70,627,60,32,112,3,1,92,49,70],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_dependencies.clas.testclasses.abap"],"names":[],"mappings":";;;AAwBA;;;;;;;;;;;;;;EAEE;;;IAEE,oBAAa,UAAU;IAEzB;;EAEA;IACE;EACF;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IAEE,iBAAc,GAAX,iBAAa,0CAAQ;MAEtB,YAAU,oBAAe;IAE3B;IAEF;;EAGA;;;IAEE,yBAAkB,eAAe;EAEnC;EAEA;;IAEA;;EAEA;;;EAEA;EAEA;;;EAEA;EAEA;EAEA;EAEA;;IAEA;;EAEA;;IAEA;;EAEA;;IAEA;;EAEA;;IAEA;;EAEA;;IAEA;;AAEF;;;;AAgCA;;;;;;;;;;;;;;;;;;;;EAEE;oPAMsC;0PAKM;0PAKA;2CAEb;sIAGgB;sIAEA;sIAEA;EAE/C;EAGA;;;;;;;;;QAEQ,0kBAAgC;QAChC,6FAAwB;IAE9B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,cAAW,WAAW;IAC/B,QAAQ,MAAC,aAAW,UAAU;IAC9B,oEAAmC;IAEnC,yBAAG,2BAA+B;MAChC,eAAa,WAAW;MACxB,6EAA4C;IAC9C;EAEF;EAGA;QAEQ,+JAAgD;;6FAME;4JAGqB;8FAEH;EAE5E;EAGA;;;;;IAEE,IAAe,YAAgC;IAE/C;8BACwC;+GAGsB;EAEhE;AAEF","file":"zcl_abapgit_dependencies.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_status.clas.testclasses.mjs":{"lineLengths":[85,98,53,48,0,0,17,32,66,37,25,345,17,42,22,3,29,64,16,3,31,43,3,38,120,58,70,70,648,437,104,73,70,32,63,48,14,7,5,109,3,1,67,23,32,72,90,1463,262,209,198,1275,49,52,70,70,65,63,56,59,63,62,17,42,22,1366,186,133,121,3,29,64,16,3,49,11,3,52,100,26,26,3,52,74,26,26,3,52,320,19,19,3,54,320,19,19,3,47,55,62,23,3,53,100,64,11,3,42,100,40,19,3,66,121,40,40,3,54,309,29,29,3,55,71,30,30,3,47,1035,70,11,3,48,11,3,49,99,56,76,111,18,3,54,99,56,76,18,3,30,104,73,105,73,101,64,94,67,94,67,102,70,67,61,71,73,104,73,1057,58,46,46,40,42,42,44,38,46,46,73,3,17,82,85,97,144,148,90,208,3,20,455,454,452,452,94,156,3,38,455,457,452,452,94,156,166,3,38,459,458,459,456,94,156,189,3,33,459,458,456,456,94,156,184,3,31,459,458,438,94,156,178,3,24,506,512,505,511,503,509,94,156,186,3,27,484,217,94,156,159,3,31,485,217,94,156,159,3,29,454,452,210,94,156,215,3,1,79,25,32,74,37,1464,1476,1248,243,17,42,22,1366,3,29,1365,70,36,94,16,3,25,1055,63,61,62,22,61,19,3,29,64,64,44,55,139,3,1,83,0,0,26,32,75,56,514,1493,967,735,73,335,415,890,414,388,17,42,22,417,1417,891,658,3,29,78,16,3,26,54,73,55,73,55,73,266,55,49,49,49,3,53,55,51,64,114,52,67,55,73,234,101,62,117,130,29,73,63,47,5,23,3,39,813,54,70,114,103,124,114,103,124,132,58,120,58,53,20,3,46,595,51,64,114,52,67,55,73,53,20,3,27,67,61,109,71,73,105,61,542,57,42,50,42,3,26,67,61,109,71,73,105,61,54,73,55,73,103,73,119,104,73,104,1225,55,60,60,60,60,52,60,52,3,26,67,61,109,71,73,105,61,457,55,41,49,41,3,20,159,103,73,119,1365,137,132,80,92,136,146,135,21,3,1,85,245,0,0,29,32,78,37,259,237,67,58,59,58,55,58,54,54,48,49,52,62,52,55,56,57,17,42,22,162,160,3,29,64,16,3,17,117,3,23,160,59,89,255,3,26,225,198,225,59,89,257,3,22,271,59,89,255,3,22,271,160,59,89,193,3,16,117,274,163,160,59,89,258,258,117,274,163,162,59,89,258,259,117,274,163,162,59,89,259,258,3,17,375,211,208,112,214,3,20,311,163,160,59,89,196,3,30,214,163,59,89,255,3,26,203,226,225,227,226,224,223,227,226,228,227,218,217,211,226,215,235,3,27,204,200,212,228,227,219,218,227,226,225,224,228,227,229,228,223,216,232,3,26,203,211,226,225,227,226,218,217,224,223,227,226,228,227,218,217,226,215,235,3,20,1055,49,49,32,33,32,59,90,59,61,65,53,97,85,86,86,88,50,72,59,79,59,79,59,142,59,142,59,142,59,144,59,144,59,144,59,144,59,144,59,144,59,80,60,80,60,80,60,80,60,80,60,7,240,5,50,3,23,227,227,59,89,255,3,24,331,220,229,228,120,89,194,3,24,328,214,218,213,120,89,193,259,255,3,1,91,98,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_file_status.clas.testclasses.abap"],"names":[],"mappings":";;;;;;AAWA;;;;;;;;;;;;;;EACE;;;;;;;;QACO,+nBAA6C;QAC7C,4aAAmC;QACnC,+FAA0B;IAE/B,iBAAc,kDAAuB;;;MAEnC,iBAAmB,GAAhB,UAAU,MAAC,OAAQ,WAAU;QAC9B,gBAAc,sBAAS;QACvB;MACF;IACF;4GAImB;EAErB;AACF;;AAsCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;IACE;EACF;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE,gBAAc,wCAAO;IACvB;;EAEA;;;IACE;EACF;EAEA;;IACE,YAAU,sBAAS;IACrB;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;;IACE;EACF;EAEA;IACE;EACF;EAEA;;;;IACE,WAAS,gCAAoB,GAAb,cAAgB,4CAAvB,CAAmC;IAC9C;;EAEA;;;;IACA;;EAEA;;;;;;;;;;;;;;;;;;;QAEO,whCAAiC;IAEtC,SAAS,MAAC,cAAW,uBAAU;IAE/B,SAAS,MAAC,cAAW,WAAW;IAChC,SAAS,MAAC,cAAW,WAAW;IAChC,SAAS,MAAC,WAAW,QAAQ;IAC7B,SAAS,MAAC,YAAW,SAAS;IAC9B,SAAS,MAAC,YAAW,SAAS;IAC9B,SAAS,MAAC,aAAW,UAAU;IAC/B,SAAS,MAAC,UAAW,OAAO;IAC5B,SAAS,MAAC,cAAW,WAAW;IAChC,SAAS,MAAC,cAAW,WAAW;IAEhC,gCAAO,mBAAa,eAAU;EAEhC;EAEA;;IAIE,iBAAS,8DAAyC;gGAChB;+IAG0B;mJAGA;yFAEf;;EAO/C;EAEA;scAUoD;qcASD;mcASD;mcASA;IAEhD,iBAAS,uEAAqC;2JAInC;EAEb;EAEA;scAUoD;wcASD;mcASD;mcASA;IAEhD,iBAAS,uEAAqC;2JAKnC;qKAI0B;EAEvC;EAEA;0cAUsD;ycASD;0cASD;ucASA;IAElD,iBAAS,uEAAqC;2JAInC;4LAIiD;EAE9D;EAEA;0cAUsD;ycASD;ucASD;ucASA;IAElD,iBAAS,uEAAqC;2JAInC;uLAI4C;EAEzD;EAEA;0cAUsD;ycASD;qbASlB;IAEjC,iBAAS,uEAAqC;2JAInC;iLAIsC;EAEnD;EAEA;yfAWoC;+fAUA;wfAUA;8fAUA;sfAUA;4fAUA;IAElC,iBAAS,uEAAqC;2JAKnC;yLAI8C;EAE3D;EAEA;meAU6D;;IAO3D,iBAAS,uEAAqC;2JAInC;8JAImB;EAEhC;EAEA;oeAU8D;;IAO5D,iBAAS,uEAAqC;2JAInC;8JAImB;EAEhC;EAEA;qcASmD;mcASA;;IAOjD,iBAAS,uEAAqC;2JAInC;sNAI2E;EAExF;AAEF;;AAwBA;;;;;;;;;;;;;EAEE;;;IAEE,oBAAa,UAAU;IACvB;IAEF;;EAEA;;;;IAEE;oBAAgD;4DACZ;IAEtC;;EAEA;;;;;0IAKkB;EAElB;AAEF;;;;AA6DA;;;;;;;;;;;;;;;;;;;;;;EAEE;6EAEuC;IAEvC;;EAEA;;;;;;;IAEE,IAAe,YAAgC;;IAG/C,YAAU,MAAC,cAAW,WAAW;IACjC,YAAU,MAAC,cAAW,WAAW;IACjC,YAAU,MAAC,cAAW,WAAW;EAEnC;EAEA;;;;;;;;;QAEQ,iOAA8B;IAEpC,iBAAqB,GAAlB,yBAAO,iBAAa,gCAAC;MACtB;;;;uEAEwB;8DACY;MAEpC,gBAAc,QAAQ,MAAC,SAAQ;IACjC;IAEF;;EAEA;;;;;;;;;;;;;;oDAC8B;IAC9B;;EAEA;;;;;;;;;oDAC8B;IAC9B;;EAEA;;;;;;;;IAEE,IAAe,aAAkC;;IAGjD,aAAW,MAAC,UAAW,OAAO;IAC9B,aAAW,MAAC,cAAW,WAAW;IAClC,aAAW,MAAC,UAAW,OAAO;EAEhC;EAEA;;;;;;;;;;;;;;;;;;IAEE,IAAe,YAAgC;;IAG/C,YAAU,MAAC,KAAI,MAAC,cAAW,WAAW;IACtC,YAAU,MAAC,KAAI,MAAC,cAAW,WAAW;IACtC,YAAU,MAAC,KAAI,MAAC,cAAW,WAAW;IACtC,YAAU,MAAC,KAAI,MAAC,cAAW,WAAW;IACtC,YAAU,MAAC,KAAI,MAAC,UAAW,OAAO;IAClC,YAAU,MAAC,KAAI,MAAC,cAAW,WAAW;IACtC,YAAU,MAAC,KAAI,MAAC,UAAW,OAAO;EAEpC;EAEA;;;;;;;;IAEE,IAAe,YAAgC;;IAG/C,YAAU,MAAC,UAAW,OAAO;IAC7B,YAAU,MAAC,cAAW,WAAW;IACjC,YAAU,MAAC,UAAW,OAAO;EAE/B;EAEA;;;;;QAEQ,40CAAuD;QACvD,gIAA+C;QAC/C,2HAA+C;IAErD,YAAS,8DAAyC;2FAChB;;IAOlC,gBAAa,4HAGc;;IAM7B;;AAEF;;;;;AAgCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;EAIA;EAEA;+JAIwB;IAEtB,oBAAY,iCAAiB;wFAED;8PAIoB;EAElD;EAEA;gOAK0B;qMAOA;gOAKA;IAExB,oBAAY,iCAAiB;wFAED;gQAIsB;EAEpD;EAEA;8QAMwB;IAEtB,oBAAY,iCAAiB;wFAED;8PAIoB;EAElD;EAEA;8QAMwB;+JAIA;IAEtB,oBAAY,iCAAiB;wFAED;gMAIT;EAErB;EAEA;;iRAQ2B;kKAIA;+JAIF;IAEvB,oBAAY,iCAAiB;wFAED;iQAIuB;iQAIA;;iRAQ1B;kKAIA;iKAIA;IAEzB,oBAAY,iCAAiB;wFAED;iQAIuB;kQAIC;;iRAQ3B;kKAIA;iKAIA;IAEzB,oBAAY,iCAAiB;wFAED;kQAIwB;iQAID;EAErD;EAEA;sXAQuB;kNAKA;+MAKE;IAEvB,oBAAY,sFAAqC;qNAI+C;EAElG;EAEA;sTAO2B;kKAIA;+JAIF;IAEvB,oBAAY,iCAAiB;wFAED;mMAIT;EAErB;EAEA;qNAK+B;kKAIJ;IAEzB,oBAAY,iCAAiB;wFAED;8PAKoB;EAElD;EAEA;0MAK0B;iOAIA;gOAIA;kOAIA;iOAIA;+NAIA;8NAIA;kOAIA;iOAIA;mOAIA;kOAIA;yNAIA;wNAIA;kNAIA;iOAIA;sNAIA;0OAIA;EAE1B;EAEA;2MAK0B;uMAIA;mNAIA;mOAIA;kOAIA;0NAIA;yNAIA;kOAIA;iOAIA;gOAIA;+NAIA;mOAIA;kOAIA;oOAIA;mOAIA;8NAIA;uNAIA;uOAIA;EAE1B;EAEA;0MAK0B;kNAIA;iOAIA;gOAIA;kOAIA;iOAIA;yNAIA;wNAIA;+NAIA;8NAIA;kOAIA;iOAIA;mOAIA;kOAIA;yNAIA;wNAIA;iOAIA;sNAIA;0OAIA;EAE1B;EAEA;QAGI,shCAA+C;QAC/C,wCAAuB;QACvB,wCAAuB;+BAER;gCACC;+BACD;IAEjB,oBAAY,iCAAiB;yFAEA;;;;;MAG3B,aAAU,4EAA+B;4BACzC,oCAAc,OAAO,MAAC,MAAK;4BAC3B,oCAAc,OAAO,MAAC,OAAM;4BAC5B,oCAAc,OAAO,MAAC,OAAM;4BAC5B,oCAAc,OAAO,MAAC,SAAQ;MAC9B,IACE,OAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,AAEA,KAjCG,eAAE,MAAC,MAAR;;QAEI,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,sCAAK;;QAEd,WAAS,uCAAM;;QAEf,WAAS,uCAAM;;QAEf,WAAS,uCAAM;;QAEf,WAAS,uCAAM;;QAEf,WAAS,uCAAM;;+OAMgC;IACrD;;EAEF;EAEA;kOAK0B;kOAKA;IAExB,oBAAY,iCAAiB;wFAED;8PAKoB;EAElD;EAEA;0UAQ4B;2NAKA;oOAKF;mOAKA;IAExB,oBAAY,8FAA4C;wFAE5B;iMAIR;EAEtB;EAEA;uUAQ4B;qNAKA;yNAKA;oNAKA;IAE1B,oBAAY,8FAA4C;wFAE5B;gMAKT;kQAKiC;8PAIJ;EAElD;AAEF","file":"zcl_abapgit_file_status.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_folder_logic.clas.testclasses.mjs":{"lineLengths":[87,53,49,32,32,82,37,25,671,17,42,22,3,29,64,16,3,21,48,3,28,71,73,98,58,68,64,102,70,67,61,67,102,132,80,67,62,166,169,40,129,5,96,90,3,1,98,33,32,83,62,25,22,17,42,22,3,29,64,16,3,52,320,103,65,72,70,72,19,3,49,11,3,52,100,26,26,3,52,74,26,26,3,54,320,19,19,3,47,55,65,23,3,53,100,64,11,3,42,100,40,19,3,66,121,40,40,3,54,309,29,29,3,55,71,30,30,3,47,1035,70,11,3,48,11,3,1,100,25,32,75,62,195,143,67,51,51,51,57,50,50,50,56,49,49,50,17,42,22,41,41,3,29,64,16,3,52,320,103,65,72,65,72,70,72,19,3,49,11,3,52,74,26,26,3,54,320,19,19,3,52,100,26,26,3,47,55,45,23,3,53,100,64,11,3,42,100,40,19,3,66,121,40,40,3,54,309,29,29,3,55,71,30,30,3,47,1035,70,11,3,48,11,3,17,177,121,127,147,146,150,155,3,19,333,3,19,374,3,19,384,3,25,9,371,112,17,106,14,16,7,5,3,18,332,3,18,373,3,18,378,3,24,9,370,112,17,106,14,16,7,5,3,17,331,3,17,377,3,17,385,3,1,84,107,36,75,37,36,32,86,62,195,143,67,51,51,50,50,49,50,17,42,22,52,52,3,29,64,16,3,52,320,103,65,72,72,72,19,3,49,11,3,52,100,26,26,3,52,74,26,26,3,54,320,19,19,3,66,121,40,40,3,47,55,56,23,3,53,100,64,11,3,42,100,40,19,3,54,309,29,29,3,55,71,30,30,3,47,1035,70,11,3,48,11,3,17,138,147,154,3,19,377,3,19,402,3,18,376,3,18,401,3,17,375,3,17,400,3,1,106,118,54,86,48,35,32,85,62,230,174,143,67,161,50,49,49,17,42,22,133,51,51,3,29,64,16,3,49,11,3,52,100,26,26,3,52,74,26,26,3,52,320,19,19,3,54,320,19,19,3,47,55,57,23,3,53,100,64,11,3,42,100,40,19,3,66,121,40,40,3,54,309,29,29,3,55,71,30,30,3,47,1035,70,11,3,48,11,3,17,137,146,3,21,75,85,67,85,94,74,233,118,3,18,132,3,17,131,3,16,130,3,1,104,117,46,85,47,139,70],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_folder_logic.clas.testclasses.abap"],"names":[],"mappings":";;;AAcA;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;;;QAEQ,0DAAsB;QACtB,6FAAwB;QACxB,2HAA8C;IAGpD,YAAS,8DAAyC;kEACR;6DACN;IAEpC,gBAAa,gJAGQ;IAErB,aAAU,sJAGiB;IAE3B,yBAAG,QAAkB;gIACuC;IAC5D;+FAIoB;yFAIH;EAEnB;AAEF;;AASA;;;;;;;;;;;;;;EAEE;;QACO,8FAAyB;IAC9B,gBAAc,2CAAU;IACxB,iEAAqC;IACrC,gBAAc,gDAAc;IAC5B,iEAAqC;IACvC;;EAEA;IACE;EACF;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE,gBAAc,2CAAU;IAC1B;;EAEA;;;IACE;EACF;EAEA;;IACE,YAAU,sBAAS;IACrB;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;;IACE;EACF;EAEA;IACE;EACF;AAEF;;AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUE;;QACO,8FAAyB;IAC9B,gBAAc,2CAAU;IACxB,iEAAqC;IACrC,gBAAc,2CAAU;IACxB,iEAAqC;IACrC,gBAAc,gDAAc;IAC5B,iEAAqC;IACvC;;EAEA;IACE;EACF;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE,gBAAc,uBAAK;IACrB;;EAEA;;;IACE;EACF;EAEA;;IACE,YAAU,sBAAS;IACrB;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;;IACE;EACF;EAEA;IACE;EACF;EAEA;QAEO,wKAAgD;;8HAKO;kJAGA;iJAGA;qJAIQ;0JAGA;EAEtE;EAEA;4UAMyB;EACzB;EAEA;qXAM+B;EAC/B;EAEA;+XAMmC;EACnC;EAEA;IAEE;kXAM6B;+GACoB;;;;;;IAEjD;EACF;EAEA;2UAMyB;EACzB;EAEA;oXAM+B;EAC/B;EAEA;yXAMmC;EACnC;EAEA;IAEE;iXAM6B;+GACoB;;;;;;IAEjD;EACF;EAEA;0UAMyB;EACzB;EAEA;wXAMmC;EACnC;EAEA;gYAM2C;EAC3C;AAEF;;;;;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;EAOE;;QACO,8FAAyB;IAC9B,gBAAc,2CAAU;IACxB,iEAAqC;IACrC,gBAAc,kDAAgB;IAC9B,iEAAqC;IACvC;;EAEA;IACE;EACF;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE,gBAAc,kCAAK;IACrB;;EAEA;;;IACE;EACF;EAEA;;IACE,YAAU,sBAAS;IACrB;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;;IACE;EACF;EAEA;IACE;EACF;EAEA;yIAG8D;kJAGA;yJAGA;EAE9D;EAEA;wXAMyB;EACzB;EAEA;iZAM8B;EAC9B;EAEA;uXAMyB;EACzB;EAEA;gZAM8B;EAC9B;EAEA;sXAMyB;EACzB;EAEA;+YAMoC;EACpC;AAEF;;;;;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;EAEE;IACE;EACF;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE,gBAAc,mCAAE;IAClB;;EAEA;;;IACE;EACF;EAEA;;IACE,YAAU,sBAAS;IACrB;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;IACE;IACF;;EAEA;;;IACE;EACF;EAEA;IACE;EACF;EAEA;wIAG8D;iJAGA;EAE9D;EAEA;;;QAEO,0DAAmB;IAExB,iBAAS,8DAAyC;6FACd;yEACO;IAE3C,aAAU,sNAGgB;qHAKd;EAEd;EAEA;mIACwD;EACxD;EAEA;kIACuD;EACvD;EAEA;iIACsD;EACtD;AACF","file":"zcl_abapgit_folder_logic.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_html_processor.clas.testclasses.mjs":{"lineLengths":[99,53,55,21,32,77,63,484,480,17,42,22,386,3,29,64,16,3,53,66,67,61,70,64,66,58,45,58,48,67,55,151,57,18,3,64,158,88,3,58,72,24,3,52,149,25,3,51,132,20,3,49,120,106,79,108,18,3,61,66,58,67,61,56,76,69,67,3,21,370,47,20,3,1,82,386,0,0,32,32,88,37,167,223,238,284,49,59,65,58,57,66,17,42,22,70,147,161,3,29,64,16,3,28,67,66,58,24,156,19,3,17,154,85,244,244,244,125,121,952,3,27,66,143,1249,180,174,227,3,33,66,107,143,1242,3,26,66,191,144,3,25,9,179,55,17,106,14,16,7,5,3,33,67,67,541,9,86,17,106,135,14,16,7,5,193,3,1,104,49,76],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_html_processor.clas.testclasses.abap"],"names":[],"mappings":";;;AAiBA;;;;;;;;;;;;;;;EACE;;;;;;;;;;;;IACE,4BAAuB,MAAC,SAAO,MAAM;IACrC,4BAAuB,MAAC,gCAAO,8BAAW,qCAAO,YAAU;IAC3D,4BAAuB,MAAC,UAAO,OAAO;IACxC;;EACA;;;EACA;EACA;;IACA;;EACA;;IACA;;EACA;;IACA;;EACA;;;;;IACA;;EACA;;;;;;;;;EACA;EAEA;;IACE,aAAW,4BAAuB;IACpC;;AACF;;;;;AA+BA;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;IACE,YAAU,MAAM;IAChB,qJAA+E;IACjF;;EAEA;QAEO,iJAAsD;IAE3D,kBAAe,6DAAwC;mPAIH;mPAGA;mPAGA;;;IAQpD,oBAAY,85BAUG;EAEjB;EAEA;QAEO,yDAAkB;IAEvB,YAAS,6HAEwB;guCAiB5B;mLAKqB;6KAGN;kOAG6B;EAEnD;EAEA;QAEO,yDAAkB;0GAEiB;IACxC,YAAS,6HAEwB;ytCAiB5B;EAEP;EAEA;QAEO,yDAAkB;IAEvB,YAAS,6KAEwB;+IAIK;EAExC;EAEA;IAEE;kLAIqC;sDACL;;;;;;IAEhC;EAEF;EAGA;QAEQ,0DAAkB;QAClB,0DAAuB;IAE7B,kCAAU,mJACA,gJACA,uIACA,2EAAsC;IAGhD;MACI,iBAAc,6DAA6C;;;;;;;IAG/D;gMAM8C;EAEhD;AAEF","file":"zcl_abapgit_gui_html_processor.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects.clas.testclasses.mjs":{"lineLengths":[77,53,44,25,32,70,37,25,76,54,17,42,22,3,29,64,16,3,26,215,216,212,3,21,597,102,271,82,79,82,67,36,37,86,46,92,203,5,3,1,79,22,32,67,37,25,702,58,58,58,58,58,58,58,58,58,58,58,58,59,17,42,22,3,29,64,16,3,26,597,72,79,41,3,26,597,72,82,41,3,26,597,72,73,41,3,26,597,72,72,41,3,26,597,72,93,41,3,26,597,72,90,41,3,26,597,72,73,41,3,26,597,72,73,41,3,26,597,72,72,41,3,26,597,72,70,41,3,26,597,72,79,41,3,26,597,72,72,41,3,26,597,72,76,41,3,22,597,61,1579,261,99,107,3,1,73,29,32,74,57,695,234,576,845,17,42,22,598,106,210,3,29,597,61,96,73,30,77,18,5,16,3,40,105,48,86,47,94,48,5,24,3,52,343,20,3,57,825,822,82,29,3,46,97,68,64,19,3,45,141,25,3,42,102,70,100,76,3,47,102,70,132,58,109,61,120,58,100,76,3,37,100,19,3,43,304,23,3,40,100,68,64,19,3,45,134,58,3,40,102,21,3,58,82,3,65,71,73,67,61,132,58,102,70,597,58,3,58,82,3,65,597,61,71,70,3,1,87,512,77,75,75,75,0,33,32,78,37,920,155,92,72,63,69,72,67,71,169,17,42,22,823,78,3,29,64,16,3,42,37,43,46,3,40,41,43,45,3,31,95,3,37,130,9,153,17,106,24,81,14,16,7,5,3,40,184,3,35,96,3,39,92,3,29,74,82,71,28,597,1008,44,47,80,69,72,157,132,3,1,95,93,65],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_objects.clas.testclasses.abap"],"names":[],"mappings":";;;AASA;;;;;;;;;;;;;;;EAEE;sNAIsB;uNAIC;mNAIA;EAEvB;EAEA;QAEQ,4kBAA+C;QAC/C,6FAAwB;QACxB,sQAA+C;IAErD,IAAe,WAA+B;IAG9C,cAAW,2DAAsC;iFAEE;;;MAGjD,sBAAM,OAAO;MACb,OAAO,MAAC,cAAW,mDAAiB;MACpC,OAAO,MAAC,cAAW,WAAS;MAC5B,eAAY,qEAAsC;0MAMjB;IACnC;EAEF;AAEF;;AAoCA;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,8CAAY;wCAEf;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,iDAAe;wCAElB;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,wCAAO;wCAEV;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,uCAAM;wCAET;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,4DAA0B;wCAE7B;EAElB;EAEA;QAEQ,4kBAA8C;IAEpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,yDAAuB;wCAE1B;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,wCAAO;wCAEV;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,wCAAO;wCAEV;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,uCAAM;wCAET;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,qCAAI;wCAEP;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,8CAAY;wCAEf;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,uCAAM;wCAET;EAElB;EAEA;QAEQ,4kBAA8C;IAGpD,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,2CAAU;wCAEb;EAElB;EAEA;;;QAEQ,kiDAAwD;IAE9D,mBAAgB,4OAE0F;kGAE5C;0GAEX;EAErD;AAEF;;AAiBA;;;;;;;;;;;;;;;EAEE;;;;;IAEE,iBAAU,OAAO;IAGjB,iBAAe,GAAZ,aAAc,qCAAG;MAClB;IACF;IAEF;;EAEA;;IAEE,IACE,OAIA,KALG,YAAO,MAAC,SAAb;;MAGI,iBAAe,sBAAS;;MAIxB,iBAAe,uBAAU;;IAI/B;;EAEA;;IAEA;;EAEA;;;;IAEA;;EAEA;;;;IAEA;;EAEA;;IAEA;;EAEA;;;;;EAEA;EAEA;;;;;;;;;;;EAEA;EAEA;;IAEA;;EAEA;;IAEA;;EAEA;;;;IAEA;;EAEA;;;EAEA;EAEA;;IAEA;;EAEA;;;;;;;;;;;;;;EAEA;EAEA;;;;;;;;EAEA;AAEF;;;;;;;;AA2BA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;oCAEwB;0CACM;6CACG;EAEjC;EAEA;wCAE4B;0CACE;4CACE;EAEhC;EAEA;8FAE+B;EAE/B;EAGA;QAEQ,yHAA0C;IAEhD;wJAE6E;;;;;;;;IAI7E;EAEF;EAGA;uLAI6B;EAE7B;EAGA;+FAEgC;EAEhC;EAGA;2FAE0D;EAE1D;EAGA;;;QAGI,8DAAoC,CAAA;;QAGpC,4kBAAiD;QACjD,u+BAA6E;IAE/E,OAAO,MAAC,cAAW,WAAW;IAC9B,OAAO,MAAC,cAAW,cAAc;IACjC,yEAAwC;IAExC,qBAAqB,MAAC,KAAI,MAAC,cAAW,WAAW;IACjD,qBAAqB,MAAC,KAAI,MAAC,cAAW,cAAc;IACpD,qBAAqB,MAAC,SAAQ,MAAC,YAAS,iGAA6D;IACrG,6HAAkF;EAEpF;AAEF","file":"zcl_abapgit_objects.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_aff_registry.clas.testclasses.mjs":{"lineLengths":[87,53,49,25,32,75,37,25,461,62,48,48,48,48,48,62,61,49,17,42,22,3,29,64,16,3,28,54,73,108,85,108,85,112,138,136,99,92,86,117,115,97,3,30,125,3,16,124,3,16,124,3,16,124,3,16,124,3,16,124,3,30,125,3,29,165,3,16,124,3,1,84,27,70],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/aff/zcl_abapgit_aff_registry.clas.testclasses.abap"],"names":[],"mappings":";;;AAwBA;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;QAEI,iIAAqD;QACrD,+HAAiD;QACjD,0FAA+B;;qFAI6B;;IAI9D,YAAS,iGAA+C;gGAEN;EACpD;EAEA;4HAE6C;EAC7C;EAEA;2HAE4C;EAC5C;EAEA;2HAE4C;EAC5C;EAEA;2HAE4C;EAC5C;EAEA;2HAE4C;EAC5C;EAEA;2HAE4C;EAC5C;EAEA;4HAE6C;EAC7C;EAEA;oKAG4C;EAC5C;EAEA;2HAE4C;EAC5C;AAEF","file":"zcl_abapgit_aff_registry.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson.clas.testclasses.mjs":{"lineLengths":[73,196,53,42,24,32,67,37,1068,169,49,1223,17,42,22,970,3,29,64,16,3,20,66,58,766,71,68,68,48,197,64,64,64,65,36,42,36,3,18,1134,32,20,3,17,41,3,1,75,24,32,67,37,244,228,67,49,63,56,56,55,57,55,54,54,61,55,57,52,273,17,42,22,147,151,3,29,64,16,3,17,105,108,3,29,967,99,101,110,38,100,100,110,38,101,100,110,38,102,101,110,38,97,100,110,3,23,967,132,9,101,143,17,110,22,174,154,14,16,7,5,9,507,138,17,110,22,174,154,14,16,7,5,3,24,147,147,967,114,110,3,24,147,147,967,112,110,3,23,147,147,967,105,114,110,3,25,147,147,967,114,110,3,23,147,147,967,113,110,3,22,147,147,967,111,110,3,22,147,147,967,119,110,3,28,47,3,35,67,72,76,2923,122,19,3,17,146,967,150,103,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,100,82,105,203,105,201,105,3,31,146,967,150,103,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,100,126,105,247,105,245,105,3,25,146,128,9,102,100,55,17,110,18,80,14,16,7,5,3,20,146,128,9,102,145,55,17,110,18,80,14,16,7,5,3,1,75,28,32,71,37,25,81,62,55,54,59,53,57,49,160,1229,17,42,22,3,29,64,16,3,23,46,3,30,67,2921,191,19,3,24,47,3,31,1134,150,103,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,50,20,3,31,66,66,138,43,186,54,174,174,174,174,174,174,88,3,30,66,66,182,43,88,3,23,66,66,150,103,136,136,136,136,142,71,88,3,22,66,66,150,103,137,137,137,137,142,88,88,186,88,88,3,27,66,66,150,103,136,136,136,136,136,136,186,533,189,88,3,21,66,66,150,103,136,186,54,88,186,54,88,3,25,66,66,66,150,103,319,124,142,72,88,3,17,66,66,150,103,142,52,88,3,1,83,0,23,32,66,37,25,76,54,64,67,17,42,22,3,29,64,16,3,34,246,3,32,285,9,179,55,17,110,14,16,7,5,9,179,55,17,110,14,16,7,5,3,26,231,232,238,239,239,240,3,22,292,67,53,63,63,169,54,63,63,169,58,64,66,169,56,64,66,169,57,64,66,169,57,64,66,169,61,68,66,169,62,68,66,169,3,1,73,0,24,32,67,37,25,71,57,50,57,56,57,56,51,49,65,52,58,17,42,22,3,29,64,16,3,17,120,150,103,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,154,140,150,103,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,154,134,150,103,126,126,126,154,150,150,3,21,124,178,211,212,213,222,3,25,124,154,263,269,269,268,271,269,265,267,268,3,20,120,150,59,79,60,103,126,126,77,183,103,126,126,77,183,103,126,126,77,212,3,25,120,150,94,33,79,103,126,126,77,193,3,18,124,178,198,199,196,211,3,25,124,178,212,214,213,3,24,124,178,211,220,220,3,25,124,178,203,203,201,204,3,24,124,178,218,218,212,220,3,19,260,124,178,34,91,91,183,34,93,93,193,3,33,120,150,260,260,103,126,126,126,126,126,126,126,93,93,93,91,90,90,79,77,126,88,128,103,126,126,77,9,115,55,17,110,18,150,14,16,7,5,9,114,55,17,110,18,152,14,16,7,5,9,115,55,17,110,18,153,14,16,7,5,103,126,126,77,9,114,55,17,110,18,173,14,16,7,5,3,1,75,0,25,32,68,37,25,75,69,57,57,74,67,66,63,62,62,68,60,65,74,72,74,17,42,22,3,29,64,16,3,25,148,2390,2389,64,32,104,43,150,103,133,133,133,133,133,133,133,133,133,133,133,133,133,101,98,67,58,67,50,75,40,40,50,50,50,89,3,37,148,95,150,103,127,101,98,114,3,25,148,67,150,103,133,101,98,123,3,25,148,261,260,150,103,130,130,130,101,98,93,93,89,3,42,148,440,439,260,150,103,129,129,129,129,129,101,98,93,61,34,93,61,89,3,35,148,440,439,260,150,103,129,129,129,129,129,129,129,101,98,93,93,61,34,95,94,61,89,3,34,148,2390,2389,150,103,133,133,133,133,133,133,101,98,252,64,72,64,72,89,3,31,148,2390,2389,150,103,139,139,139,139,101,98,109,109,89,3,36,148,255,254,150,103,138,138,138,101,98,94,94,89,3,30,148,466,465,150,103,140,140,140,140,140,140,140,101,98,252,64,57,67,64,57,67,89,3,30,148,466,465,150,103,140,140,140,140,140,140,140,101,98,252,64,57,67,64,57,67,89,3,28,148,128,2390,101,150,9,105,101,101,100,55,17,110,18,150,14,16,7,5,9,105,101,101,100,55,17,110,18,146,14,16,7,5,9,105,106,106,100,55,17,110,18,154,14,16,7,5,9,105,108,108,100,55,17,110,18,154,14,16,7,5,9,105,109,109,100,55,17,110,18,146,14,16,7,5,9,262,105,108,108,99,55,17,110,18,159,14,16,7,5,9,94,105,111,99,55,17,110,18,152,14,16,7,5,9,78,105,111,100,55,17,110,18,152,14,16,7,5,9,259,105,140,140,140,102,55,17,110,18,151,14,16,7,5,3,33,148,251,251,150,103,133,133,133,64,143,97,88,3,42,148,251,251,150,128,103,133,133,133,64,63,9,103,99,55,17,110,18,146,14,16,7,5,3,40,120,251,251,125,150,103,133,133,133,64,79,77,115,88,34,85,74,88,3,41,120,251,251,150,128,103,133,133,133,64,79,77,9,75,55,17,110,18,146,14,16,7,5,3,1,77,263,474,485,485,2403,0,24,32,67,37,25,71,53,56,51,63,51,58,65,61,58,50,50,59,59,62,56,56,51,51,52,57,53,57,57,72,70,48,54,56,69,502,17,42,22,3,29,64,16,3,29,120,154,73,107,113,113,113,113,113,98,154,107,114,114,114,114,114,114,101,3,26,120,154,73,107,113,113,113,113,113,81,107,113,113,136,154,3,18,120,154,73,107,113,113,113,113,113,81,107,113,113,100,154,107,113,113,113,113,113,81,107,113,113,101,154,3,21,150,120,120,127,73,73,26,103,109,109,109,109,77,112,150,113,150,103,109,109,109,111,111,111,111,52,118,150,103,109,109,111,111,111,111,116,150,3,21,150,120,127,73,26,103,109,109,109,109,148,142,141,150,3,24,150,124,73,103,109,109,136,136,150,103,109,109,109,178,150,3,19,150,120,127,230,32,29,37,73,26,103,115,115,115,115,115,116,150,3,31,150,124,127,418,37,35,44,35,123,26,103,115,115,115,115,115,125,115,115,150,3,19,150,120,127,260,73,26,95,95,103,110,110,110,110,114,150,3,26,150,120,127,254,73,26,96,96,103,110,110,110,110,114,150,3,33,4,150,124,272,462,73,67,60,66,66,67,60,66,66,103,110,110,110,110,110,110,110,110,110,110,150,3,18,120,154,127,73,26,107,114,114,106,154,107,114,114,114,149,154,107,114,114,114,114,114,131,34,117,154,106,154,107,114,114,140,154,107,114,114,114,114,114,145,143,154,3,27,120,127,73,26,106,142,128,9,110,55,17,110,18,173,14,16,7,5,9,146,55,17,110,18,156,14,16,7,5,9,144,55,17,110,18,156,14,16,7,5,9,149,55,17,110,18,179,14,16,7,5,9,147,55,17,110,18,179,14,16,7,5,9,145,55,17,110,18,166,14,16,7,5,3,27,120,154,127,131,34,73,26,107,113,113,115,154,107,113,113,52,114,154,107,114,114,52,104,147,154,107,113,52,146,154,3,30,120,154,127,73,26,107,114,114,114,138,139,154,3,24,120,154,127,73,26,107,114,114,114,147,147,154,3,24,120,154,127,260,73,26,107,114,114,114,95,122,34,122,154,3,19,120,154,127,60,73,26,107,117,117,117,117,153,137,61,122,154,3,19,120,154,127,73,26,107,117,117,149,154,3,20,120,154,127,60,73,26,107,119,119,119,61,120,35,120,154,3,25,120,154,127,100,73,26,107,129,129,73,130,154,3,21,120,127,73,26,146,106,147,50,9,148,55,17,110,14,16,7,5,9,108,55,17,110,14,16,7,5,9,149,55,17,110,14,16,7,5,9,103,55,17,110,14,16,7,5,9,54,55,17,110,14,16,7,5,3,25,120,154,127,107,146,146,146,146,146,146,146,146,146,146,73,26,111,156,155,156,155,154,3,25,123,120,127,157,73,26,131,165,3,36,124,70,129,73,67,61,67,769,200,33,142,42,126,82,109,134,109,14,139,7,5,3,38,124,178,218,175,268,175,136,175,3,40,124,376,218,176,268,176,137,176,3,16,299,301,303,306,306,306,310,308,308,292,291,301,3,22,308,312,308,308,312,3,24,315,301,309,301,9,150,55,17,110,14,16,7,5,9,146,55,17,110,14,16,7,5,3,37,124,178,28,28,108,99,113,99,193,112,193,99,199,3,1,75,23,32,66,37,25,68,55,56,53,65,52,53,53,17,42,22,3,29,64,16,3,24,260,260,66,66,53,59,61,65,53,90,84,7,137,105,63,5,50,83,127,86,76,88,3,23,427,427,248,66,53,59,61,65,53,90,84,7,148,56,63,5,50,83,127,86,76,88,3,18,69,127,97,89,214,1748,1748,857,68,63,70,53,52,74,54,89,73,83,69,69,67,68,54,89,78,83,69,70,67,68,76,88,3,21,120,127,66,127,243,58,73,26,139,144,130,103,86,132,106,106,140,117,116,121,132,1108,189,176,67,26,114,78,132,3,33,251,66,66,124,67,66,66,73,112,67,88,88,73,59,112,67,88,88,3,20,124,73,201,163,172,211,124,3,21,124,124,66,66,73,204,106,149,296,300,67,89,88,3,20,124,73,147,143,148,3,1,73,256,840,1061,1759,0,25,32,68,37,25,71,60,60,58,59,64,63,71,52,51,53,59,51,17,42,22,3,29,64,16,3,21,150,120,73,103,109,109,109,109,77,969,109,107,3,28,154,969,107,110,134,111,3,28,154,969,107,112,141,111,3,26,154,969,107,114,125,111,3,27,154,969,107,114,126,111,3,32,154,969,108,107,114,60,116,111,3,20,154,969,80,107,109,114,111,3,31,154,969,102,24,100,107,124,170,206,111,3,39,154,969,100,107,124,54,206,111,3,18,154,969,295,69,67,107,112,156,111,3,19,154,431,969,65,59,49,63,107,112,112,112,112,112,111,111,3,27,154,1830,969,456,65,59,49,63,67,78,72,108,108,53,62,53,62,107,112,112,112,112,112,112,112,112,112,112,112,113,113,113,113,113,113,113,113,113,113,113,113,113,113,111,111,3,21,154,969,608,456,41,62,56,41,62,56,107,113,113,113,113,113,113,113,113,113,113,113,109,111,263,96,96,107,113,113,113,112,111,3,1,77,441,650,1848,24,32,67,63,571,459,73,54,56,17,42,22,474,124,3,29,64,16,3,51,100,740,61,102,64,163,294,69,48,160,88,5,193,19,3,23,121,130,154,74,137,137,137,139,139,127,107,113,113,113,113,113,164,3,22,121,130,154,74,103,142,142,142,127,107,113,113,113,164,3,23,121,130,470,311,178,29,29,49,74,103,142,142,114,127,48,63,114,48,65,114,48,65,115,48,63,115,110,3,1,75,390,72,71,72,303,24,32,67,64,25,73,54,60,59,52,17,42,22,3,29,64,16,3,54,740,61,98,58,107,57,5,87,37,5,80,146,5,3,50,69,67,61,67,61,21,3,50,69,67,61,67,61,21,3,23,121,130,154,74,138,138,140,140,140,140,127,107,113,113,113,113,113,113,113,113,113,164,3,22,121,130,154,74,103,140,140,140,140,127,107,113,113,113,113,113,113,113,164,3,28,121,132,74,138,138,9,105,55,17,110,22,192,14,16,7,5,3,19,121,130,154,74,127,123,136,127,107,113,164,3,27,121,132,74,151,9,105,55,17,110,22,209,14,16,7,5,3,1,75,25,32,68,91,480,72,55,55,61,57,17,42,22,124,3,29,64,16,3,22,125,129,154,74,138,138,69,107,113,113,113,155,159,138,209,213,3,23,125,129,154,74,138,138,90,107,113,113,159,3,23,125,129,154,74,138,138,87,107,113,113,113,159,3,54,740,61,98,58,107,57,5,3,50,69,67,61,67,61,21,3,50,69,67,61,67,61,21,3,51,100,740,61,102,64,163,189,19,3,29,125,129,154,65,138,138,138,142,107,113,113,113,159,3,24,125,129,115,138,69,172,3,1,77,391,73,72,73,229,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson.clas.testclasses.abap"],"names":[],"mappings":";;;;AAiBA;;;;;;;;;;;;;;;;;EACE;;;IAEE,IAAc,KAAyB;QAClC,8DAAuB;QACvB,2DAAoB;QACpB,2DAAoB;;IAIzB;IAQA,yBAAS,KAAG,MAAC,KAAI;IACjB,yBAAS,KAAG,MAAC,KAAI;IACjB,yBAAS,KAAG,MAAC,KAAI;IACjB,yBAAS,KAAG,MAAC,MAAK;IAClB,KAAG,MAAC,WAAQ,QAAQ;IACpB,KAAG,MAAC,cAAW,WAAW;IAC1B,KAAG,MAAC,WAAQ,QAAQ;EAEtB;EAEA;;IACE,aAAW,aAAQ;IACrB;;EAEA;IACE,sBAAM,aAAQ;EAChB;AACF;;AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;EAGA;EAEA;QAEO,87BAAgD;kGAEjB;IACpC,YAAS,mFAAwB;6GAGL;qCAEV;mGACmB;IACrC,YAAS,kFAAuB;6GAGJ;qCAEV;oGACoB;IACtC,YAAS,kFAAuB;6GAGJ;qCAEV;qGACqB;IACvC,YAAS,mFAAwB;6GAGL;qCAEV;gGACgB;IAClC,YAAS,kFAAuB;6GAGJ;EAE9B;EAEA;QAEO,87BAAgD;QAChD,2HAA0C;IAC/C;MACI,YAAS,iFAAsB;8IAC6C;;;;;;;;;IAQhF;IAEA;MACI,YAAS,ueAGD;yIAC+D;;;;;;;;;IAQ3E;EAEF;EAEA;kJACsF;kJACA;QAE/E,87BAAgD;IACrD,YAAS,gGAAoC;6GAGjB;EAC9B;EAEA;kJACsF;kJACA;QAE/E,87BAAgD;IACrD,YAAS,8FAAkC;6GAGf;EAC9B;EAEA;kJACsF;kJACA;QAE/E,87BAAgD;;IAErD,YAAS,gGAAoC;6GAGjB;EAC9B;EAEA;kJACsF;kJACA;QAE/E,87BAAgD;IACrD,YAAS,gGAAoC;6GAGjB;EAC9B;EAEA;kJACsF;kJACA;QAE/E,87BAAgD;IACrD,YAAS,+FAAmC;6GAGhB;EAC9B;EAEA;kJACsF;kJACA;QAE/E,87BAAgD;IACrD,YAAS,6FAAiC;6GAGd;EAC9B;EAEA;kJACsF;kJACA;QAE/E,87BAAgD;IACrD,YAAS,qGAAyC;6GAGtB;EAC9B;EAEA;;;;;;;IAEE,kCACE,8DACA,gFACA,8EACA,gFACA,gFACA,+EACA,6EACA,qFACA,2EACA,kEACA,yGACA,yFACA,8EACA,+EACA,8EACA,sEACA,4EACA,+EACA,+EACA,sEACA,kGACA,mEACA,kEACA,yGACA,8FACA,8EACA,+EACA,+EACA,sEACA,4EACA,+EACA,+EACA,sEACA,kGACA,kEACA,0CACA,wEAAG;IAEL,mHAA4D;IAE9D;;EAEA;QAEO,yIAAkC;QAClC,87BAAgD;QAChD,6IAAqC;;6IAG0C;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;;IAGpF,YAAS,gEAA+B;wGAGZ;IAE5B,YAAS,yLAAqE;wGAGlD;IAE5B,YAAS,uLAAmE;wGAGhD;EAE9B;EAEA;QAEO,yIAAkC;QAClC,87BAAgD;QAChD,6IAAqC;;gJAG6C;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;gJACA;;IAGvF,YAAS,4GAEyB;wGAGN;IAE5B,YAAS,qOAEyB;wGAGN;IAE5B,YAAS,mOAEyB;wGAGN;EAE9B;EAEA;QAEO,yIAAkC;QAClC,uHAAsC;IAE3C;;mGAE2C;sDACX;;;;;;;;IAGhC;EAEF;EAEA;QAEO,yIAAkC;QAClC,uHAAsC;IAE3C;;gJAEwF;sDACxD;;;;;;;;IAGhC;EAEF;AAEF;;AAiCA;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;IAEE,kCACE,8DACA,gFACA,qFACA,+EACA,gFACA,2EACA,kEACA,4EACA,gFACA,8EACA,sEACA,mGACA,yFACA,yGACA,8EACA,+EACA,8EACA,oEACA,mEACA,kEACA,4EACA,gFACA,8EACA,sEACA,mGACA,8FACA,yGACA,8EACA,gFACA,8EACA,oEACA,kEACA,iEACA,6EACA,8EACA,yDACA,wEAAG;IAEL,YAAU,sBACR,KAAM,SACN,KAAM,wCACN,MAAO,uCAAwB,SAC/B,KAAM,iCAAG;IAEb;;EAEA;;;;;QAEO,6IAAqC;;6IAG0C;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;IAEpF,cAAW,8BAAmB;IAEhC;;EAEA;QAEO,yDAAkB;QAClB,yDAAkB;IAEvB,YAAS,wHAAiD;IAC1D,YAAS,yBAAc;IAEvB,WAAS,sBACP,KAAM,QACN,KAAM,uCAAwB,SAC9B,MAAO,qCACP,KAAM,iCAAG;IACX,yBAAS,MAAM;IACf,WAAS,sBACP,KAAM,QACN,KAAM,mCACN,MAAO,sCACP,KAAM,iCAAG;IACX,WAAS,sBACP,KAAM,QACN,KAAM,mCACN,MAAO,sCACP,KAAM,iCAAG;IACX,WAAS,sBACP,KAAM,QACN,KAAM,mCACN,MAAO,sCACP,KAAM,iCAAG;IACX,WAAS,sBACP,KAAM,QACN,KAAM,mCACN,MAAO,sCACP,KAAM,iCAAG;IACX,WAAS,sBACP,KAAM,QACN,KAAM,mCACN,MAAO,sCACP,KAAM,iCAAG;IACX,WAAS,sBACP,KAAM,QACN,KAAM,mCACN,MAAO,sCACP,KAAM,iCAAG;uFAIK;EAElB;EAEA;QAEO,yDAAkB;QAClB,yDAAkB;IAEvB,YAAS,oKAEW;IACpB,YAAS,yBAAc;uFAIP;EAElB;EAEA;QAEO,yDAAkB;QAClB,yDAAkB;QAClB,6IAAqC;;uIAGoC;uIACA;uIACA;uIACA;IAE9E,YAAS,4HAAqD;IAC9D,WAAS,sDAAoB;uFAIb;EAElB;EAEA;QAEO,yDAAkB;QAClB,yDAAkB;QAClB,6IAAqC;;wIAGqC;wIACA;wIACA;wIACA;IAE/E,YAAS,4HAAqD;IAC9D,WAAS,uEAAqC;uFAI9B;IAEhB,YAAS,wKAEyB;IAClC,WAAS,uEAAqC;uFAI9B;EAElB;EAEA;QAEO,yDAAkB;QAClB,yDAAkB;QAClB,6IAAqC;;uIAGoC;uIACA;uIACA;uIACA;uIACA;uIACA;IAE9E,YAAS,wKAEW;IACpB,iCAAS,8DACT,mEACA,gEACA,yEACA,wEACA,iEACA,gDACA,2CAAG;IACH,WAAS,sBACP,KAAM,QACN,KAAM,wCACN,MAAO,uCAAwB,SAC/B,KAAM,iCAAG;uFAIK;EAElB;EAEA;QAEO,yDAAkB;QAClB,yDAAkB;QAClB,6IAAqC;;uIAGoC;IAE9E,YAAS,wKAEW;IACpB,WAAS,qCAAI;uFAIG;IAEhB,YAAS,wKAEW;IACpB,WAAS,qCAAI;uFAIG;EAElB;EAEA;QAEO,yDAAkB;QAClB,yDAAkB;QAClB,yDAAkB;QAClB,6IAAqC;;IAG1C,iCAAS,2DAAO,2DAAO,4DAAO,uCAAwB,eAAkB,uCAAwB,SAAK;2HACtD;IAE/C,YAAS,4HAAqD;IAC9D,WAAS,uDAAe;uFAIR;EAElB;EAEA;QAEO,yDAAkB;QAClB,yDAAkB;QAClB,6IAAqC;;IAI1C,YAAS,4HAAqD;IAC9D,WAAS,mCAAE;uFAIK;EAElB;AAEF;;;AAsBA;;;;;;;;;;;;;;;;;EAEE;qPAIoB;EAEpB;EAEA;4RAIe;IAEb;kLAEqD;sDACrB;;;;;;IAEhC;IAEA;kLAEqD;sDACrB;;;;;;IAEhC;EAEF;EAEA;sOAIe;uOAGA;6OAGI;8OAGA;8OAGA;+OAGA;EAEnB;EAEA;QAEO,2RAAiD;QACjD,0DAAmB;IAExB,YAAc,mCAAE;IAChB,MAAM,MAAC,UAAO,mCAAE;IAChB,MAAM,MAAC,UAAO,mCAAE;wKAGA;IAEhB,YAAc,oCAAG;IACjB,MAAM,MAAC,UAAO,mCAAE;IAChB,MAAM,MAAC,UAAO,mCAAE;wKAGA;IAEhB,YAAc,wCAAO;IACrB,MAAM,MAAC,UAAO,oCAAG;IACjB,MAAM,MAAC,UAAO,sCAAK;wKAGH;IAEhB,YAAc,sCAAK;IACnB,MAAM,MAAC,UAAO,oCAAG;IACjB,MAAM,MAAC,UAAO,sCAAK;wKAGH;IAEhB,YAAc,uCAAM;IACpB,MAAM,MAAC,UAAO,oCAAG;IACjB,MAAM,MAAC,UAAO,sCAAK;wKAGH;IAEhB,YAAc,uCAAM;IACpB,MAAM,MAAC,UAAO,oCAAG;IACjB,MAAM,MAAC,UAAO,sCAAK;wKAGH;IAEhB,YAAc,2CAAU;IACxB,MAAM,MAAC,UAAO,wCAAO;IACrB,MAAM,MAAC,UAAO,sCAAK;wKAGH;IAEhB,YAAc,4CAAW;IACzB,MAAM,MAAC,UAAO,wCAAO;IACrB,MAAM,MAAC,UAAO,sCAAK;wKAGH;EAElB;AAEF;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,+GAAoC;QACpC,6IAAqC;;sIAGmC;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;sIACA;IAG7E,YAAS,wIAA4D;+BACrE,SAAU,kGAA4C;qJAGzB;;6IAKuD;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;6IACA;IAEpF,YAAS,wIAA4D;+BACrE,SAAU,4FAAsC;qJAGnB;;6HAKuC;6HACA;6HACA;IAEpE,YAAS,wIAA4D;+BACrE,SAAU,4GAAqD;qJAGlC;EAE/B;EAEA;QAEO,mHAAoC;+BACzC,SAAU,wIAA4D;kNAIvD;mNAIA;oNAIC;6NAIH;EAEf;EAEA;QAEO,mHAAoC;IACzC,YAAS,wIAA4D;sQAIlB;4QAGA;4QAGA;2QAGA;8QAGC;4QAGA;wQAGH;0QAGE;2QAGD;EAEpD;EAEA;QAEO,+GAAoC;QACpC,6IAAqC;QACrC,kDAAa;;IAGlB,WAAS,2CAAU;;6HAGiD;6HACA;IACpE,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;sLAIzB;;6HAGoD;6HACA;IACpE,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;sLAIzB;;6HAGoD;6HACA;IACpE,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;mNAI7B;EAEd;EAEA;QAEO,+GAAoC;QACpC,6IAAqC;QACrC,qFAA4C,CAAA;;;;6HAKmB;6HACA;IACpE,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;gMAIzB;EAElB;EAEA;QAEO,mHAAoC;+BACzC,SAAU,wIAA4D;qMAKnD;sMAIA;mMAIC;kNAID;EAErB;EAEA;QAEO,mHAAoC;+BACzC,SAAU,wIAA4D;mNAI3D;qNAIE;oNAIA;EAEf;EAEA;QAEO,mHAAoC;+BACzC,SAAU,wIAA4D;kNAI3D;2NAIO;2NAIC;EAErB;EAEA;QAEO,mHAAoC;+BACzC,SAAU,wIAA4D;0MAInD;0MAIA;wMAIC;2MAID;EAErB;EAEA;QAEO,mHAAoC;+BACzC,SAAU,wIAA4D;yNAIvD;yNAIA;mNAIH;2NAII;EAElB;EAEA;QAEO,2PAAwB;QACxB,mHAAoC;+BACzC,SAAU,wIAA4D;IAEtE,sBAAM,MAAM;IACZ,gCAAO,8CAAO,MAAM;IACpB,gCAAO,8CAAO,MAAM;sLAGJ;IAEhB,sBAAM,MAAM;IACZ,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gDAAS,MAAM;gMAGN;EAElB;EAEA;QAEO,+GAAoC;QACpC,6IAAqC;QACrC,2PAAwB;QACxB,2PAAwB;;6HAGuC;6HACA;6HACA;6HACA;6HACA;6HACA;6HACA;IAEpE,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gDAAS,MAAM;IACtB,gCAAO,8CAAO,MAAM;IACpB,gCAAO,6CAAM,MAAM;IACnB,gCAAO,6CAAM,MAAM;;IAGnB,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;IAEzC,YAAS,4GAAsD;uFAG/C;QAGX,uHAAsC;;6HAGyB;6HACA;IACpE,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;IAEzC;kHAC2D;sDAC3B;;;;;;;;IAKhC;IAEA;iHAC0D;sDAC1B;;;;;;;;IAKhC;IAEA;kHAC2D;sDAC3B;;;;;;;;IAKhC;;6HAGoE;6HACA;IACpE,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;IAEzC;iHAC0D;sDAC1B;;;;;;;;IAKhC;EAEF;AAEF;;;AA6FA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,2IAAmC;QACnC,60EAAuB;QACvB,40EAAuB;QACvB,uDAAmC,CAAA;;QACnC,+FAAsD,CAAA;;QACtD,6IAAqC;;oIAGiC;oIACA;oIACA;oIACA;oIACA;oIACA;oIACA;oIACA;oIACA;oIACA;oIACA;oIACA;oIACA;;iGAOhD;IAE3B,MAAM,MAAC,SAAa,wCAAO;IAC3B,MAAM,MAAC,SAAa,+BAAC;IACrB,MAAM,MAAC,WAAa,sCAAK;IACzB,MAAM,MAAC,UAAa,sBAAS;IAC7B,MAAM,MAAC,IAAG,MAAC,OAAS,wCAAO;IAC3B,MAAM,MAAC,WAAa,WAAW;IAC/B,MAAM,MAAC,WAAa,WAAW;IAC/B,MAAM,MAAC,gBAAa,gBAAgB;IACpC,MAAM,MAAC,gBAAa,gBAAgB;IACpC,MAAM,MAAC,gBAAa,gBAAgB;wFAIpB;EAElB;EAEA;QAEO,2IAAmC;QACnC,sFAAsB;QACtB,6IAAqC;;8HAG2B;;iGAO1C;iHAIhB;EAEb;EAEA;QAEO,2IAAmC;QACnC,0DAAmB;QACnB,6IAAqC;;oIAGiC;;iGAOhD;0HAIV;EAEnB;EAEA;QAEO,2IAAmC;QACnC,4PAAyB;QACzB,2PAAwB;QACxB,6IAAqC;;iIAG8B;iIACA;iIACA;;iGAO7C;IAE3B,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gDAAS,MAAM;wFAIN;EAElB;EAEA;QAEO,2IAAqC;QACrC,+aAAmC;QACnC,8aAAmC;QACnC,2PAA0B;QAC1B,6IAAqC;;gIAG6B;gIACA;gIACA;gIACA;gIACA;;iGAO5C;IAE3B,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gBAAU,MAAM;IACvB,sBAAM,MAAM;IACZ,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gBAAU,MAAM;wFAIP;EAElB;EAEA;QAEO,2IAAqC;QACrC,+aAAmC;QACnC,8aAAmC;QACnC,2PAA0B;QAC1B,6IAAqC;;gIAG6B;gIACA;gIACA;gIACA;gIACA;gIACA;gIACA;;iGAO5C;IAE3B,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gBAAU,MAAM;IACvB,sBAAM,MAAM;IACZ,gCAAO,kDAAW,MAAM;IACxB,gCAAO,iDAAU,MAAM;IACvB,gCAAO,gBAAU,MAAM;wFAIP;EAElB;EAEA;QAEO,2IAAmC;QACnC,60EAAuB;QACvB,40EAAuB;QACvB,6IAAqC;;oIAGiC;oIACA;oIACA;oIACA;oIACA;oIACA;;iGAOhD;QAEtB,mPAA+B;IACpC,OAAO,MAAC,OAAI,sCAAK;IACjB,gCAAO,iBAAW,MAAM,MAAC,IAAG;IAC5B,OAAO,MAAC,OAAI,sCAAK;IACjB,gCAAO,iBAAW,MAAM,MAAC,IAAG;wFAIZ;EAElB;EAEA;QAEO,2IAAmC;QACnC,60EAAuB;QACvB,40EAAuB;QACvB,6IAAqC;;0IAGuC;0IACA;0IACA;0IACA;;iGAOtD;IAE3B,gCAAO,gDAAS,MAAM,MAAC,UAAS;IAChC,gCAAO,gDAAS,MAAM,MAAC,UAAS;wFAIhB;EAElB;EAEA;QAEO,2IAAmC;QACnC,sPAA8D;QAC9D,qPAA8D;QAE9D,6IAAqC;;yIAEsC;yIACA;yIACA;;iGAOrD;IAE3B,uFAA8B;IAC9B,uFAA8B;wFAId;EAElB;EAEA;QAEO,2IAAmC;QACnC,ycAA6B;QAC7B,wcAA6B;QAE7B,6IAAqC;;2IAEwC;2IACA;2IACA;2IACA;2IACA;2IACA;2IACA;;iGAOvD;QAEtB,mPAA2B;IAChC,OAAO,MAAC,OAAI,sCAAK;IACjB,OAAO,MAAC,OAAI,+BAAC;IACb,4DAAgC;IAChC,OAAO,MAAC,OAAI,sCAAK;IACjB,OAAO,MAAC,OAAI,+BAAC;IACb,4DAAgC;wFAIhB;EAElB;EAEA;QAEO,2IAAmC;QACnC,ycAA6B;QAC7B,wcAA6B;QAE7B,6IAAqC;;2IAEwC;2IACA;2IACA;2IACA;2IACA;2IACA;2IACA;;iGAOvD;QAEtB,mPAA2B;IAChC,OAAO,MAAC,OAAI,sCAAK;IACjB,OAAO,MAAC,OAAI,+BAAC;IACb,4DAAgC;IAChC,OAAO,MAAC,OAAI,sCAAK;IACjB,OAAO,MAAC,OAAI,+BAAC;IACb,4DAAgC;wFAIhB;EAElB;EAEA;QAEO,2IAAmC;QACnC,uHAAsC;QACtC,60EAAuB;;QAIvB,6IAAqC;IAE1C;;oGAE6C;oGACA;mGAMhB;sDACG;;;;;;;;IAKhC;IAEA;;oGAE6C;oGACA;mGAMhB;sDACG;;;;;;;;IAKhC;IAEA;;yGAEkD;yGACA;mGAMrB;sDACG;;;;;;;;IAKhC;IAEA;;2GAEoD;2GACA;mGAMvB;sDACG;;;;;;;;IAKhC;IAEA;;4GAEqD;4GACA;mGAMxB;sDACG;;;;;;;;IAKhC;IAEA;UACS,2PAAwB;;2GAEmB;2GACA;kGAMxB;sDACI;;;;;;;;IAKhC;IAEA;UACS,mFAAyB;;8GAEqB;kGAM3B;sDACI;;;;;;;;IAKhC;IAEA;UACS,mEAAwB;;8GAEsB;mGAM1B;sDACG;;;;;;;;IAKhC;IAEA;UACS,wPAAgE;;2IAEW;2IACA;2IACA;qGAMrD;sDACC;;;;;;;;IAKhC;EAEF;EAEA;QAEO,2IAAmC;QACnC,kPAAoB;QACpB,kPAAqB;QACrB,6IAAqC;;oIAGiC;oIACA;oIACA;IAE3E,MAAM,MAAC,OAAK,uCAAM;;gGAUQ;uFAIV;EAElB;EAEA;QAEO,2IAAmC;QACnC,kPAAoB;QACpB,kPAAqB;QACrB,6IAAqC;QACrC,uHAAsC;;oIAGgC;oIACA;oIACA;IAE3E,MAAM,MAAC,OAAK,uCAAM;IAClB,MAAM,MAAC,OAAK,sCAAQ;IAEpB;;kGAM4B;sDACI;;;;;;;;IAKhC;EAEF;EAEA;QAEO,+GAAoC;QACpC,kPAAoB;QACpB,kPAAqB;QACrB,oHAAqC;QACrC,6IAAqC;;oIAGiC;oIACA;oIACA;IAE3E,MAAM,MAAC,OAAK,uCAAM;;IAGlB,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;kHAMV;uFAIf;IAEhB,sBAAM,MAAM;IACZ,aAAU,kEAAqC;yEACI;uFAGnC;EAElB;EAGA;QAEO,+GAAoC;QACpC,kPAAoB;QACpB,kPAAqB;QACrB,6IAAqC;QACrC,uHAAsC;;oIAGgC;oIACA;oIACA;IAE3E,MAAM,MAAC,OAAK,uCAAM;;IAGlB,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;IAEzC;0EACsD;sDAEtB;;;;;;;;IAKhC;EAEF;AAEF;;;;;;;;AAwDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,+GAAoC;QACpC,iJAAyC;IAE9C,YAAS,uDAAkC;;gHAGY;gHACA;gHACA;gHACA;gHACA;iGAEf;yJAGP;;iHAGuB;iHACA;iHACA;iHACA;iHACA;iHACA;oGACd;EAE5C;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;IAE9C,YAAS,uDAAkC;;gHAGY;gHACA;gHACA;gHACA;gHACA;IAEvD,MAAM,OAAE,mCAAe,YAAY,OAAE,QAAQ;;gHAGU;gHACA;uIAItC;yJAIgB;EAEnC;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;IAE9C,YAAS,uDAAkC;;gHAGY;gHACA;gHACA;gHACA;gHACA;IAEvD,MAAM,OAAE,mCAAe,YAAY,OAAE,QAAQ;;gHAGU;gHACA;mGAEH;yJAInB;;gHAGsB;gHACA;gHACA;gHACA;gHACA;IAEvD,MAAM,OAAE,mCAAe,YAAY,OAAE,QAAQ;;gHAGU;gHACA;oGAEF;yJAIpB;EAEnC;EAEA;QAEO,6IAAqC;QACrC,+GAAoC;QACpC,+GAAoC;QACpC,sHAAuC;IAE5C,YAAS,uDAAkC;IAC3C,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;4GAIiC;4GACA;4GACA;4GACA;IACnD,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;+GAKrB;qJAGS;gHAIT;qJAGS;;4GAIsB;4GACA;4GACA;8GACE;8GACA;8GACA;8GACA;mDAElC;qHAGC;qJAGS;;4GAIsB;4GACA;8GACE;8GACA;8GACA;8GACA;mHAIjC;qJAGS;EAE/B;EAEA;QAEO,6IAAqC;QACrC,+GAAoC;QACpC,sHAAuC;IAE5C,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;4GAIiC;4GACA;4GACA;4GACA;mJAIhC;6IAGH;4IAGD;qJAGc;EAE/B;EAEA;QAEO,6IAAqC;QACrC,mHAAoC;IAEzC,YAAS,uDAAkC;;4GAGQ;4GACA;uIAIpC;uIAGA;qJAGc;;4GAGsB;4GACA;4GACA;iLAKpC;qJAGc;EAE/B;EAEA;QAEO,6IAAqC;QACrC,+GAAoC;QACpC,sHAAuC;QAGjC,6NAAQ;;;;IAMnB,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;kHAIuC;kHACA;kHACA;kHACA;kHACA;mHAInC;qJAGO;EAE/B;EAEA;QAEO,6IAAqC;QACrC,mHAAoC;QACpC,sHAAuC;QAGjC,yZAAQ;;;;;IASnB,YAAS,yGAAsD;IAC/D,cAAY,MAAM;;kHAIuC;kHACA;kHACA;kHACA;kHACA;4HACU;kHACV;kHAInC;qJAGO;EAE/B;EAEA;QAEO,6IAAqC;QACrC,+GAAoC;QACpC,sHAAuC;QACvC,2PAAwB;IAE7B,YAAS,uDAAkC;IAC3C,cAAY,MAAM;IAElB,gCAAO,kDAAW,MAAM;IACxB,gCAAO,kDAAW,MAAM;;6GAI4B;6GACA;6GACA;6GACA;iHAIhC;qJAGS;EAE/B;EAEA;QAEO,6IAAqC;QACrC,+GAAoC;QACpC,sHAAuC;QACvC,qPAA6D;IAElE,YAAS,uDAAkC;IAC3C,cAAY,MAAM;IAElB,yFAAgC;IAChC,yFAAgC;;6GAIoB;6GACA;6GACA;6GACA;iHAIhC;qJAGS;EAE/B;EAEA;;QAaO,6IAAqC;QACrC,mHAAoC;QACpC,uQAAqB;QACrB,qcAAkB;IAEvB,YAAS,uDAAkC;IAE3C,MAAM,MAAC,SAAM,wCAAO;IACpB,MAAM,MAAC,SAAM,iCAAG;IAChB,MAAM,MAAC,SAAM,uCAAM;IACnB,2DAA+B;IAC/B,MAAM,MAAC,SAAM,wCAAO;IACpB,MAAM,MAAC,SAAM,iCAAG;IAChB,MAAM,MAAC,SAAM,uCAAM;IACnB,2DAA+B;;6GAIqB;6GACA;6GACA;6GACA;6GACA;6GACA;6GACA;6GACA;6GACA;6GAIhC;qJAGS;EAE/B;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;IAE5C,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;iHAIsC;iHACA;yGAEhB;yJAIP;;iHAIuB;iHACA;iHACA;oJAInC;yJAIY;;iHAIuB;iHACA;iHACA;iHACA;iHACA;QAG7C,0HAAQ;;oHAMG;yJAIW;yGAGO;yJAIP;;iHAIuB;iHACA;2IAIhC;yJAIS;;iHAIuB;iHACA;iHACA;iHACA;iHACA;gJAIvC;8IAGA;yJAIgB;EAEnC;EAEA;QAEO,+GAAoC;QACpC,sHAAuC;IAE5C,YAAS,uDAAkC;IAC3C,cAAY,MAAM;yGAEsB;6IAGxB;QAGX,uHAAsC;IAC3C;6GAC8C;sDACd;;;;;;;;IAKhC;IAGA;iJAGmB;sDACa;;;;;;;;IAKhC;IAGA;+IAGmB;sDACa;;;;;;;;IAKhC;IAGA;oJAGmB;sDACa;;;;;;;;IAKhC;IAEA;kJAGmB;sDACa;;;;;;;;IAKhC;IAGA;gJAGmB;sDACa;;;;;;;;IAKhC;EAEF;EAGA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;QAEjC,0HAAQ;;IAInB,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;gHAIqC;gHACA;kHAIjC;yJAIW;;gHAIsB;gHACA;mDAEpC;iHAGG;yJAIW;;iHAIuB;iHACA;mDAErC;uGACmB;kJAGjB;yJAIY;;gHAIsB;mDAEpC;iJAGE;yJAIY;EAEnC;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;IAG5C,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;iHAEsC;iHACA;iHACA;yIAIjC;0IAGC;yJAIS;EAEnC;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;IAG5C,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;iHAEsC;iHACA;iHACA;kJAIzC;kJAGA;yJAIkB;EAEnC;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;QACvC,2PAAwB;IAG7B,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;iHAEsC;iHACA;iHACA;IAExD,gCAAO,kDAAW,MAAM;yHAGJ;IACpB,sBAAM,MAAM;yHAGQ;yJAIa;EAEnC;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;QACvC,mDAAc;IAEnB,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;oHAEyC;oHACA;oHACA;oHACA;wJAIxC;wIAGI;IACvB,YAAU,2CAAU;yHAGC;yJAIY;EAEnC;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;IAE5C,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;oHAEyC;oHACA;oJAI1C;yJAIgB;EAEnC;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;QACvC,mDAAc;IAEnB,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;sHAE2C;sHACA;sHACA;IAE7D,YAAU,2CAAU;uHAGC;IAErB,sBAAM,OAAO;uHAGQ;yJAIY;EAEnC;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;QACvC,2FAA2B;IAEhC,YAAS,uDAAkC;IAC3C,cAAY,MAAM;;gIAEqD;gIACA;IAEvE,iBAAe,kDAAgB;iIAGL;yJAIO;EAEnC;EAEA;QAEO,+GAAoC;QACpC,sHAAuC;IAE5C,YAAS,uDAAkC;IAC3C,cAAY,MAAM;iJAKC;yGACqB;kJAGrB;iDAEF;IAEjB;mJAGqB;sDACW;;;;;;IAEhC;IAEA;2GAC4C;sDACZ;;;;;;IAEhC;IAEA;oJAGqB;sDACW;;;;;;IAEhC;IAEA;sGACuC;sDACP;;;;;;IAEhC;IAEA;qDACuB;sDACS;;;;;;IAEhC;EAEF;EAEA;QAEO,+GAAoC;QACpC,iJAAyC;QACzC,sHAAuC;;iJAG4C;iJACA;iJACA;iJACA;iJACA;iJACA;iJACA;iJACA;iJACA;iJACA;IAExF,YAAS,uDAAkC;IAC3C,cAAY,MAAM;8GAE2B;2JAG7B;0JAGD;2JAGC;0JAGD;yJAIkB;EAEnC;EAEA;QAEO,kHAAuC;QACvC,+GAAoC;QACpC,sHAAuC;IAE5C,eAAY,wIAA4D;IAExE,YAAS,uDAAkC;IAC3C,cAAY,MAAM;kIAIsB;oKAIP;EAEnC;EAEA;;;;;;;QAEO,0DAAmB;IAExB,IAAc,QAA4C;;;MAGxD,kCAAU,QAAM,MAAC,4BAAQ,QAAM,MAAC,MAAQ,sCAAG;MAC3C,IACE,OAKA,KANG,QAAM,MAAC,KAAZ;;iFAEuC;4GAGS;;4GAIA;;0IAKd;;IAEpC;EAEF;EAEA;QAEO,mHAAoC;QAE9B,yKAAQ;IAKnB,YAAS,wMAIa;8KAIG;IAEzB,YAAS,0PAKa;8KAIG;uIAIT;8KAIS;EAE3B;EAEA;QAEO,mHAAoC;QAE9B,+WAAQ;IAKnB,YAAS,wMAIa;+KAII;IAE1B,YAAS,0PAKa;+KAII;wIAIF;+KAIE;EAE5B;EAEA;0SAIqB;4SAIA;8SAIE;iTAIE;iTAID;iTAIA;qTAIE;mTAID;mTAIE;mSAIZ;kSAIA;4SAYO;EAEtB;EAEA;mTAIyB;uTAIG;mTAIF;mTAIA;uTAIE;EAE5B;EAEA;0TAI2B;4SAIL;oTAIG;4SAIH;IAEpB;qJACoD;sDACpB;;;;;;IAEhC;IAEA;iJACiD;sDACjB;;;;;;IAEhC;EAEF;EAEA;QAEO,mHAAoC;QAE9B,yKAAQ;;;IAKnB,YAAS,0FAAwD;kGAC3C;gHAGA;kGACA;gMAIqB;+GAET;gMAIS;kGAKrB;sMAI2B;EAEnD;AAEF;;AAiDA;;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,2PAAwB;QACxB,2PAAwB;QACxB,yDAAkB;QAElB,yDAAkB;IACvB,WAAS,oCAAG;;;;;MAEV,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,iCAAS,OAAU,kCAAI;MACzB;MACA,iCAAS,gGAA0B;MACnC,iGAAuB;MACvB,gCAAO,gBAAU,MAAM;IACzB;;IACA,iCAAS,OAAU,qCAAG;QAEjB,sHAAuC;IAC5C,eAAY,iEAAkC;2EACO;uFAIrC;EAElB;EAEA;QAEO,kaAA2B;QAC3B,kaAA2B;QAC3B,+OAAkB;QAElB,yDAAkB;IACvB,WAAS,oCAAG;;;;;MAEV,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;QACd,iCAAS,OAAU,kCAAI;MACzB;MACA,iCAAS,2GAAqC;MAC9C,MAAM,MAAC,SAAM,eAAE,MAAC,MAAK;MACrB,gCAAO,gBAAU,MAAM;IACzB;;IACA,iCAAS,OAAU,qCAAG;QAEjB,sHAAuC;IAC5C,eAAY,iEAAkC;2EACO;uFAIrC;EAElB;EAEA;QAEO,4DAAqB;QACrB,sHAAuC;IAE5C,eAAY,4EAAgC;IAC5C,eAAY,oEAAqC;qNAIlC;QAEV,2sDAAqB;QACrB,2sDAAqB;IAC1B,IAAc,KAA8B;IAE5C,MAAM,MAAC,YAAS,sCAAK;IACrB,MAAM,MAAC,YAAS,iCAAG;IACnB,MAAM,MAAC,WAAQ,yCAAQ;IACvB,MAAM,MAAC,aAAU,sBAAS;IAC1B,MAAM,MAAC,WAAQ,uBAAU;IACzB,MAAM,MAAC,UAAO,8CAAY;;IAG1B,KAAG,MAAC,aAAW,2DAAyB;IACxC,KAAG,MAAC,SAAW,+CAAa;IAC5B,KAAG,MAAC,cAAW,oDAAkB;IACjC,KAAG,MAAC,MAAK,MAAC,SAAM,+BAAC;IACjB,KAAG,MAAC,MAAK,MAAC,SAAM,+BAAC;IACjB,KAAG,MAAC,IAAG,MAAC,SAAQ,+BAAC;IACjB,KAAG,MAAC,IAAG,MAAC,SAAQ,gCAAE;;IAGlB,KAAG,MAAC,aAAW,2DAAyB;IACxC,KAAG,MAAC,SAAW,oDAAkB;IACjC,KAAG,MAAC,cAAW,oDAAkB;IACjC,KAAG,MAAC,MAAK,MAAC,SAAM,+BAAC;IACjB,KAAG,MAAC,MAAK,MAAC,SAAM,gCAAE;IAClB,KAAG,MAAC,IAAG,MAAC,SAAQ,+BAAC;IACjB,KAAG,MAAC,IAAG,MAAC,SAAQ,gCAAE;2EAEmC;uFAIrC;EAElB;EAEA;QAEO,+GAAoC;QACpC,sHAAuC;QACvC,yDAAkB;QACR,sHAAQ;QACR,0OAAO;IAEtB,QAAQ,MAAC,OAAI,+BAAC;IACd,YAAY,uDAAkC;IAC9C,cAAY,MAAM;0IAIH;+IAGE;iIAGM;sGACc;IAGrC,WAAS,qEAAmC;mIAG5B;yGAEwB;yGACA;2IAGzB;oHAGO;mHAGA;IAGtB,WAAS,wGAAsE;mIAG/D;IAGhB,iCACE,8DACA,uEACA,yEACA,0EACA,0EACA,wEACA,sEACA,mEACA,kEACA,0EACA,kEACA,iEACA,sEACA,wEACA,0CACA,mDAAG;IACL,WAAS,sBACP,KAAM,QACN,KAAM,wCACN,MAAO,uCAAwB,SAC/B,KAAM,iCAAG;+KAGK;IAGhB,OAAO,MAAC,SAAM,uCAAM;IAEpB,cAAY,MAAM;iHAGG;IAErB,WAAS,6DAA2B;mIAGpB;EAElB;EAEA;QAGa,kPAAQ;QAMd,yDAAkB;QAClB,yDAAkB;QAClB,mHAAoC;IAEzC,QAAQ,MAAC,WAAQ,oCAAG;IACpB,QAAQ,MAAC,UAAQ,oCAAG;IACpB,QAAQ,MAAC,UAAQ,oCAAG;IAGpB,YAAS,uDAAkC;+GAGrB;IAEtB,YAAS,iDAAoB;IAC7B,WAAS,uEAAqC;uFAI9B;IAGhB,YAAS,uDAAkC;0DACjB;+GAGJ;IAEtB,YAAS,iDAAoB;IAC7B,WAAS,uEAAqC;uFAI9B;EAElB;EAEA;QAEO,mHAAoC;IAEzC,YAAS,uDAAkC;wMAKxB;kKAEkD;2KAES;kNAKzD;2HAE0C;EAEjE;EAEA;QAEO,mHAAoC;QACpC,mHAAoC;QACpC,yDAAkB;QAClB,yDAAkB;IAEvB,YAAS,uDAAkC;IAC3C,YAAS,0LAEQ;yGAEa;oJAGT;uSAKA;2SAKI;IAEzB,YAAS,iDAAoB;IAC7B,WAAS,wEAAsC;uFAI/B;EAElB;EAEA;QAEO,mHAAoC;IAEzC,YAAS,uDAAkC;kJAId;8IAIV;mJAIU;EAE/B;AAEF;;;;;;;AAgDA;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,6IAAqC;QACrC,+GAAoC;IACzC,YAAS,uDAAkC;;4GAGQ;4GACA;4GACA;4GACA;IACnD,MAAM,OAAE,mCAAe,QAAQ,OAAE,QAAQ;QAEpC,g8BAAkD;IACvD,cAAW,yFAA6C;0GAI5B;EAE9B;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;;6GAIH;IAEpD,cAAW,kHAAwC;8GAInB;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;;+GAID;IAEtD,cAAW,yHAA4C;8GAIvB;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;;iHAIC;IAExD,cAAW,yGAAgD;8GAI3B;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;;iHAIC;IAExD,cAAW,0GAAiD;8GAI5B;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;QAElD,mGAA6B;;iHAEsB;IAExD,kBAAgB,oCAAG;IACnB,cAAW,gGAAoD;8GAI/B;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;QAClD,uEAA4B;;4GAIkB;IAEnD,cAAW,8FAAkD;8GAI7B;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;QAClD,6FAAkC,CAAA;;QAElC,2FAA2B;;2HAEkC;;IAIlE,cAAW,0LAA+E;8GAI1D;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;QAElD,2FAA2B;;2HAEkC;IAElE,iBAAe,+BAAC;IAChB,cAAW,0LAA+E;8GAI1D;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;QAClD,8RAAoD;IAEzD,SAAS,MAAC,UAAO,sCAAK;IACtB,SAAS,MAAC,UAAO,oCAAG;;+GAEkC;IAEtD,cAAW,wIAEc;8GAIO;EAElC;EAEA;QAEO,iJAAyC;QACzC,saAAsB;QACtB,g8BAAkD;IAEvD,QAAQ,MAAC,OAAI,sCAAK;IAClB,QAAQ,MAAC,OAAI,gCAAE;IACf,QAAQ,MAAC,OAAI,sBAAS;IACtB,QAAQ,MAAC,OAAI,oCAAG;;+GAGsC;+GACA;+GACA;+GACA;+GACA;IAEtD,cAAW,2FAA+C;8GAI1B;EAElC;EAEA;QAEO,iJAAyC;QACzC,6xDAA8B;QAC9B,g8BAAkD;IACvD,IAAc,KAA6B;IAE3C,QAAQ,MAAC,OAAI,sCAAK;IAClB,QAAQ,MAAC,OAAI,gCAAE;IACf,QAAQ,MAAC,OAAI,sBAAS;IACtB,QAAQ,MAAC,OAAI,oCAAG;IAChB,QAAQ,MAAC,QAAK,uCAAM;IAEpB,QAAQ,MAAC,MAAK,MAAC,OAAI,uCAAM;IACzB,QAAQ,MAAC,MAAK,MAAC,OAAI,iCAAG;IAEtB,gCAAO,kDAAW,QAAQ,MAAC,KAAI;IAC/B,gCAAO,kDAAW,QAAQ,MAAC,KAAI;;IAG/B,KAAG,MAAC,OAAI,sCAAK;;IAEb,KAAG,MAAC,OAAI,sCAAK;;+GAGyC;+GACA;+GACA;+GACA;+GACA;+GACA;+GACA;+GACA;+GACA;+GACA;+GACA;gHAEC;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHAEA;gHACA;gHACA;IAEvD,cAAW,2FAA+C;8GAI1B;EAElC;EAEA;QAEO,iJAAyC;QACzC,g8BAAkD;QAElD,ulBAA6B;IAClC,IAAc,KAAuB;;IAGrC,KAAG,MAAC,OAAI,sCAAK;IACb,KAAG,MAAC,OAAI,gCAAE;;IAEV,KAAG,MAAC,OAAI,sCAAK;IACb,KAAG,MAAC,OAAI,gCAAE;;gHAG6C;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;IAEvD,cAAW,yFAA6C;8GAIxB;QAE3B,8PAA2B;IAChC,gCAAO,gDAAS,SAAS;IACzB,gCAAO,gDAAS,SAAS;;gHAG8B;gHACA;gHACA;IAEvD,cAAW,4FAAgD;8GAI3B;EAElC;AAEF;;;;;AA+BA;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;QAEO,6RAA8C;IAEnD,iBAAY,GAAT,UAAW,gCAAC;MACb,gBAAgB,MAAC,UAAO,QAAQ;MAChC,gBAAgB,MAAC,gCAAO,OAAO,MAAC,4BAAQ,OAAO,MAAC,MAAQ,sCAAG;MAC3D,gCAAO,0BAAoB,qBAAgB;IAC7C;IAEA,YAAU,iCAAwB,GAAb,OAAO,MAAC,OAAQ,sCAAK,kBAAsB,GAAd,OAAO,MAAC,QAAS,sCAAzD,CAA+D;IAE3E;;EAEA;QAEO,gHAAqC;QACrC,yHAA8C;QAC9C,iJAAyC;IAE9C,aAAU,uDAAkC;wIAG7B;wIAGA;wIAGA;0IAGA;0IAGA;IAEf,sBAAmB,mGAEI;;gHAGgC;gHACA;gHACA;gHACA;gHACA;mKAItB;EAEnC;EAEA;QAEO,gHAAqC;QACrC,yHAA8C;QAC9C,iJAAyC;IAE9C,aAAU,uDAAkC;sGACjB;6IAGV;6IAGA;6IAGA;IAEjB,sBAAmB,mGAEI;;gHAGgC;gHACA;gHACA;mKAItB;EAEnC;EAEA;QAEO,gHAAqC;QACrC,yHAA8C;QAE9C,6cAAmC;IACxC,IAAc,KAA8B;QAGjC,yKAAQ;;;IAKnB,sBAAM,qBAAgB;IAEtB,aAAU,uDAAkC;sGACjB;6IAGV;6IAGA;iHAGK;IAEtB,sBAAmB,mGAEI;;IAGvB,KAAG,MAAC,UAAO,oCAAG;IACd,KAAG,MAAC,UAAO,yCAA0B,mCAAU,MAAC,KAAI;;IAEpD,KAAG,MAAC,UAAO,sCAAK;IAChB,KAAG,MAAC,UAAO,yCAA0B,mCAAU,MAAC,KAAI;;IAEpD,KAAG,MAAC,UAAO,sCAAK;IAChB,KAAG,MAAC,UAAO,yCAA0B,mCAAU,MAAC,MAAK;;IAErD,KAAG,MAAC,UAAO,oCAAG;IACd,KAAG,MAAC,UAAO,yCAA0B,mCAAU,MAAC,MAAK;6GAI9B;EAEzB;AAEF;;;;;;;AAwBA;;;;;;;;;;;;;;;;;;EAEE;;;;;IACE,iBAAgB,GAAb,2CAAe,qCAAG;MACnB,YAAU,4BAAU,SAAS;IAC/B;IACA,iBAAW,GAAR,SAAU,mDAAgB;MAC3B,sBAAM,OAAO;IACf;IAEA,iBAAiB,GAAd,OAAO,MAAC,QAAS,gCAAC;iJAC4D;IACjF;EACF;EAEA;;;;;;IACA;;EAEA;;;;;;IACA;;EAEA;QAEO,gHAAqC;QACrC,yHAA8C;QAC9C,iJAAyC;IAE9C,aAAU,uDAAkC;yIAG7B;yIAGA;2IAGA;2IAGA;2IAGA;2IAGA;IAEf,sBAAmB,mGAEI;;gHAGgC;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;mKAItB;EAEnC;EAEA;QAEO,gHAAqC;QACrC,yHAA8C;QAC9C,iJAAyC;IAE9C,aAAU,uDAAkC;sGACP;2IAGtB;2IAGA;2IAGA;2IAGA;IAEf,sBAAmB,mGAEI;;gHAGgC;gHACA;gHACA;gHACA;gHACA;gHACA;gHACA;mKAItB;EACnC;EAEA;QAEO,gHAAqC;QACrC,2HAA0C;IAE/C,aAAU,uDAAkC;yIAG7B;yIAGA;IAEf;wGAGyB;sDACO;;;;;;;;IAKhC;EAEF;EAEA;QAEO,gHAAqC;QACrC,yHAA8C;QAC9C,iJAAyC;IAE9C,aAAU,uDAAkC;IAC5C,sBAAmB,mGAEI;0HAC8C;uIAItD;IACf,sBAAmB,mGAEI;;gHAGgC;mKAGtB;EAEnC;EAEA;QAEO,gHAAqC;QACrC,2HAA0C;IAE/C,aAAU,uDAAkC;sJAG7B;IAEf;wGAGyB;sDACO;;;;;;;;IAKhC;EAEF;AAEF;;AAyBA;;;;;;;;;;;;;;;;;;;EAEE;QAEO,oHAAqC;QACrC,wHAAyC;QACzC,iJAAyC;IAE9C,aAAU,uDAAkC;yIAG7B;yIAGA;IAEf,iBAAc,8CAAiB;;gHAGwB;gHACA;gHACA;0JAItB;8JAGA;yIAKlB;gNAGJ;oNAGA;EAEb;EAEA;QAEO,oHAAqC;QACrC,wHAAyC;QACzC,iJAAyC;IAE9C,aAAU,uDAAkC;yIAG7B;yIAGA;IAEf,iBAAc,mEAAqB;;gHAGoB;gHACA;8JAItB;EAEnC;EAEA;QAEO,oHAAqC;QACrC,wHAAyC;QACzC,iJAAyC;IAE9C,aAAU,uDAAkC;yIAG7B;yIAGA;IAEf,iBAAc,gEAAkB;;gHAGuB;gHACA;gHACA;8JAItB;EAEnC;EAEA;;;;;IACE,iBAAgB,GAAb,2CAAe,qCAAG;MACnB,YAAU,4BAAU,SAAS;IAC/B;EACF;EAEA;;;;;;IAEA;;EAEA;;;;;;IAEA;;EAEA;;;;;;;IACE,YAAU,wCAAO,OAAO,MAAC,MAAgB,iBAAqB,GAAlB,OAAO,MAAC,yCAAa,qCAAvD,CAA4D;IACxE;;EAEA;QAEO,oHAAqC;QACrC,wHAAyC;QACzC,iJAAyC;IAE9C,aAAU,8CAAyB;yIAGpB;yIAGA;yIAGA;IAEf,iBAAc,uHAGI;;gHAGqC;gHACA;gHACA;8JAItB;EAEnC;EAEA;QAEO,oHAAqC;QACrC,wHAAyC;IAE9C,aAAU,gGAA6C;yIAGxC;IAEf,iBAAc,8CAAiB;2KAIZ;EAErB;AAEF","file":"zcl_abapgit_ajson.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_filter_lib.clas.testclasses.mjs":{"lineLengths":[95,122,53,53,25,32,79,37,25,81,61,55,62,66,60,55,17,42,22,3,29,64,16,3,31,125,134,74,142,141,142,137,194,189,3,29,125,134,74,142,143,139,139,194,180,3,23,125,134,262,96,74,142,144,144,218,202,3,30,125,134,74,142,144,144,254,195,3,34,125,134,74,149,142,144,144,153,297,202,3,28,125,134,262,94,74,142,144,144,144,218,195,3,22,125,134,372,133,186,74,142,141,142,137,216,180,3,1,88,27,74],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson_filter_lib.clas.testclasses.abap"],"names":[],"mappings":";;;;AAeA;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,oHAAqC;QACrC,6HAA8C;IAEnD,aAAU,uDAAkC;6IAG3B;4IAGD;6IAGC;wIAGF;IAEf,sBAAmB,sKAEiD;4LAIvC;EAE/B;EAEA;QAEO,oHAAqC;QACrC,6HAA8C;IAEnD,aAAU,uDAAkC;6IAG3B;8IAGD;0IAGD;0IAGA;IAEf,sBAAmB,sKAEiD;mLAI/C;EAEvB;EAEA;QAEO,oHAAqC;QACrC,6HAA8C;QAC9C,6PAA0B;IAE/B,gCAAO,iDAAU,QAAQ;IAEzB,aAAU,uDAAkC;6IAG3B;+IAGA;+IAGA;IAEjB,sBAAmB,8LAEyE;yMAIlD;EAE5C;EAEA;QAEO,oHAAqC;QACrC,6HAA8C;IAEnD,aAAU,uDAAkC;6IAG3B;+IAGA;+IAGA;IAEjB,sBAAmB,kOAE4E;kMAI5D;EAErC;EAEA;QAEO,oHAAqC;QACrC,6HAA8C;IAEnD,aAAU,uDAAkC;oJAGxB;6IAGH;+IAGA;+IAGA;wJAGI;IAErB,sBAAmB,6QAIkB;yMAIK;EAE5C;EAEA;QAEO,oHAAqC;QACrC,6HAA8C;QAC9C,6PAA0B;IAE/B,gCAAO,+CAAQ,QAAQ;IAEvB,aAAU,uDAAkC;6IAG3B;+IAGA;+IAGA;+IAGA;IAEjB,sBAAmB,8LAEyE;kMAIzD;EAErC;EAEA;QAEO,oHAAqC;QACrC,6HAA8C;QAC9C,2WAAuD;IAE5D,iCAAO,mFAAwD,UAAU;IACzE,iCAAO,wIAA4E,UAAU;IAE7F,aAAU,uDAAkC;6IAG3B;4IAGD;6IAGC;wIAGF;IAEf,sBAAmB,4LAE0D;mLAIxD;EAEvB;AAEF","file":"zcl_abapgit_ajson_filter_lib.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_mapping.clas.testclasses.mjs":{"lineLengths":[89,206,60,53,50,25,32,76,37,25,79,51,51,64,64,63,52,52,62,58,58,61,59,57,58,17,42,22,3,29,64,16,3,29,122,273,154,181,3,19,122,144,141,90,173,78,149,3,19,122,144,141,136,84,106,115,191,3,32,122,144,277,136,84,100,106,115,230,3,32,122,144,68,471,136,84,65,105,106,115,232,3,31,122,144,141,90,84,106,115,191,3,25,445,410,3,25,445,410,3,26,576,312,41,63,61,41,63,61,41,63,61,488,3,26,576,312,41,66,61,571,3,29,576,312,41,70,61,593,3,27,576,312,41,66,61,742,3,20,488,3,20,488,428,3,30,541,3,1,85,19,32,70,37,25,82,61,51,266,17,42,22,3,29,64,16,3,19,122,144,681,320,200,44,84,84,87,131,190,78,149,137,3,32,221,3,29,251,3,24,69,67,61,122,144,681,320,200,44,84,84,87,131,84,72,106,86,72,21,3,1,73,21,32,72,37,25,70,17,42,22,3,29,64,16,3,19,122,144,141,90,84,106,115,192,3,1,77,21,32,72,37,25,70,17,42,22,3,29,64,16,3,19,122,144,141,90,84,106,115,192,3,1,77,70,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson_mapping.clas.testclasses.abap"],"names":[],"mappings":";;;;;AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGE;QAGI,iHAAsC;IAExC,cACI,6PAE0G;yJAG1E;oLAIP;EAE/B;EAGA;QAGI,iHAAwC;QACxC,uIAAgD;QAEvC,oIAAS;IAIpB,gBAAa,oEAA+C;IAE5D,cAAW,yJAC0D;6EAEd;oJAIhC;EAEzB;EAGA;QAGI,iHAAwC;QACxC,uIAAgD;QAEvC,oIAAS;IAIpB,gBAAa,kHAAgF;IAE7F,SAAS,MAAC,gBAAa,+CAAa;IAEpC,cAAW,sFAAiE;kHAGzC;8LAII;EAEzC;EAGA;QAGI,iHAAwC;QACxC,uIAAgD;QAEvC,4QAAS;IAOpB,gBAAa,kHAAgF;IAE7F,SAAS,MAAC,gBAAa,+CAAa;IACpC,SAAS,MAAC,WAAU,MAAC,gBAAa,8CAAY;IAE9C,cAAW,sFAAiE;kHAGzC;qOAI2C;EAEhF;EAGA;QAGI,iHAAwC;QACxC,uIAAgD;QAEhD,2DAAoB;QACX,8cAAS;IAOpB,gBAAa,kHAAgF;IAE7F,SAAS,MAAC,gBAAa,+CAAa;IACpC,aAAW,8CAAY;IACvB,kGAA0D;IAE1D,cAAW,sFAAiE;kHAGzC;uOAI6C;EAElF;EAGA;QAGI,iHAAwC;QACxC,uIAAgD;QAEvC,oIAAS;IAIpB,gBAAa,oEAA+C;IAE5D,SAAS,MAAC,gBAAa,+CAAa;IAEpC,cAAW,sFAAiE;kHAGzC;8LAII;EAEzC;EAGA;4bAMiC;yZAMA;EAEjC;EAEA;4bAMiC;yZAMA;EAEjC;EAEA;QAEO,ujBAAqD;IAC1D,IAAc,KAAuB;;IAGrC,KAAG,MAAC,UAAO,oCAAG;IACd,KAAG,MAAC,QAAO,oCAAG;;IAEd,KAAG,MAAC,UAAO,oCAAG;IACd,KAAG,MAAC,QAAO,oCAAG;;IAEd,KAAG,MAAC,UAAO,oCAAG;IACd,KAAG,MAAC,QAAO,oCAAG;ueAO6B;EAE7C;EAEA;QAEO,ujBAAqD;IAC1D,IAAc,KAAuB;;IAGrC,KAAG,MAAC,UAAO,uCAAM;IACjB,KAAG,MAAC,QAAO,oCAAG;0jBAS6B;EAE7C;EAEA;QAEO,ujBAAqD;IAC1D,IAAc,KAAuB;;IAGrC,KAAG,MAAC,UAAO,2CAAU;IACrB,KAAG,MAAC,QAAO,oCAAG;glBASsC;EAEtD;EAEA;QAEO,ujBAAqD;IAC1D,IAAc,KAAuB;;IAGrC,KAAG,MAAC,UAAO,uCAAM;IACjB,KAAG,MAAC,QAAO,oCAAG;quBAW6B;EAE7C;EAEA;ueAOuD;EAEvD;EAEA;ueAOmD;2aAQ5B;EAEvB;EAEA;4hBAOuD;EAEvD;AAEF;;AAmBA;;;;;;;;;;;;;;;;;EAGE;QAGI,iHAA+C;QAC/C,uIAAuD;QACvD,gqBAAmE;QACnE,uTAAgD;QAEvC,+LAAS;IAKpB,sBAAM,gBAAgB;IACtB,gBAAgB,MAAC,UAAQ,8CAAY;IACrC,gBAAgB,MAAC,UAAO,8CAAY;IACpC,gFAAoD;IAEpD,gBAAa,6GAAoE;IAEjF,cACI,0KAC0D;6EAEP;oJAIhC;wIAIN;EAEnB;EAGA;4NAI0D;EAE1D;EAGA;0PAIyE;EAEzE;EAGA;;;;QAGI,iHAA+C;QAC/C,uIAAuD;QACvD,gqBAAmE;QACnE,uTAAgD;QAEvC,+LAAS;IAKpB,sBAAM,gBAAgB;IACtB,gBAAgB,MAAC,UAAQ,8CAAY;IACrC,gBAAgB,MAAC,UAAO,8CAAY;IACpC,gFAAoD;IAEpD,gBAAa,6GAAoE;IAEjF,SAAS,MAAC,gBAAa,+CAAa;IACpC,SAAS,MAAC,WAAa,wCAAO;IAE9B,cAAW,sFAAiE;qFAGzC;IAEnC,eAAY,mDAAsB;IAEpC;;AAGF;;AAcA;;;;;;;;;;;;;;EAGE;QAGI,iHAAwC;QACxC,uIAAgD;QAEvC,oIAAS;IAIpB,gBAAa,oEAA+C;IAE5D,SAAS,MAAC,gBAAa,+CAAa;IAEpC,cAAW,sFAAiE;kHAGzC;+LAIK;EAE1C;AAGF;;AAcA;;;;;;;;;;;;;;EAGE;QAGI,iHAAwC;QACxC,uIAAgD;QAEvC,oIAAS;IAIpB,gBAAa,oEAA+C;IAE5D,SAAS,MAAC,gBAAa,+CAAa;IAEpC,cAAW,sFAAiE;kHAGzC;+LAIK;EAE1C;AAGF","file":"zcl_abapgit_ajson_mapping.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ajson_utilities.clas.testclasses.mjs":{"lineLengths":[93,53,52,24,32,77,37,1068,169,1223,17,42,22,970,3,29,64,16,3,20,66,58,766,71,68,48,188,64,64,64,65,36,42,3,18,1134,32,20,3,1,85,24,32,77,37,25,291,17,42,22,3,29,64,16,3,28,47,3,35,67,72,76,2923,122,19,3,1,85,23,32,76,37,25,71,59,60,54,53,53,17,42,22,3,29,64,16,3,21,67,141,127,127,127,165,165,165,2923,156,118,128,128,128,128,128,128,128,118,128,128,128,128,128,128,128,118,128,128,128,128,128,128,90,217,150,150,150,3,27,69,69,141,127,127,127,165,165,278,550,158,158,118,128,128,128,128,128,118,128,128,90,141,150,150,180,141,150,150,180,3,28,69,69,141,127,127,127,165,197,274,158,158,90,141,180,180,180,187,118,128,128,150,180,180,3,22,69,69,141,126,164,479,560,158,158,117,127,127,127,127,127,127,127,90,92,148,3,21,67,141,69,73,762,156,768,162,90,66,98,3,20,393,273,274,280,280,3,1,83,61,73],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcl_abapgit_ajson_utilities.clas.testclasses.abap"],"names":[],"mappings":";;;AAkBA;;;;;;;;;;;;;;;;EACE;;;IAEE,IAAc,KAAyB;QAClC,8DAAuB;QACvB,2DAAoB;;IAIzB;IAOA,yBAAS,KAAG,MAAC,KAAI;IACjB,yBAAS,KAAG,MAAC,KAAI;IACjB,yBAAS,KAAG,MAAC,KAAI;IACjB,yBAAS,KAAG,MAAC,MAAK;IAClB,KAAG,MAAC,WAAQ,QAAQ;IACpB,KAAG,MAAC,cAAW,WAAW;EAE5B;EAEA;;IACE,aAAW,aAAQ;IACrB;;AACF;;AAqBA;;;;;;;;;;;;;;EAEE;;;;;;;IAEE,kCACE,8DACA,gFACA,8EACA,gFACA,gFACA,+EACA,6EACA,qFACA,2EACA,kEACA,yGACA,yFACA,8EACA,+EACA,8EACA,sEACA,4EACA,+EACA,+EACA,sEACA,kGACA,mEACA,kEACA,yGACA,8FACA,8EACA,+EACA,+EACA,sEACA,4EACA,+EACA,+EACA,sEACA,kGACA,kEACA,0CACA,wEAAG;IAEL,mHAA4D;IAE9D;;AAEF;;AAuBA;;;;;;;;;;;;;;;;;;;EAEE;QAGI,0DAAyB;QACzB,oIAAqD;QACrD,sHAA2C;QAC3C,sHAA2C;QAC3C,sHAA2C;QAC3C,4JAA0C;QAC1C,4JAA0C;QAC1C,4JAA0C;IAE5C,kCACE,8DACA,gFACA,8EACA,gFACA,kFACA,6EAEA,6EACA,qFACA,2EACA,kEACA,yGACA,yFACA,8EACA,+EACA,8EACA,sEACA,4EACA,+EAEA,+EACA,sEACA,kGACA,mEACA,kEACA,yGACA,8FACA,8EACA,+EACA,+EACA,sEACA,4EACA,+EACA,+EACA,sEACA,kGACA,kEACA,0CACA,wEAAG;IAEL,qJAA+E;;+HAGT;+HACA;+HACA;+HACA;+HACA;+HACA;+HACA;;+HAGA;+HACA;+HACA;+HACA;+HACA;+HACA;+HACA;;+HAGA;+HACA;+HACA;+HACA;+HACA;+HACA;;wNAW3C;qJAIM;qJAIA;qJAIA;EAEnC;EAEA;QAGI,4DAAyB;QACzB,4DAAyB;QACzB,oIAAqD;QACrD,sHAA2C;QAC3C,sHAA2C;QAC3C,sHAA2C;QAC3C,4JAA0C;QAC1C,4JAA0C;IAG5C,oCACE,8DACA,gFACA,uDACA,uCAAG;IAEL,oCACE,8DACA,2EACA,sEACA,sEACA,oEACA,iEACA,uDACA,2CAAG;IAEL,uJAAiF;IACjF,uJAAiF;;+HAGX;+HACA;+HACA;+HACA;+HACA;;+HAGA;+HACA;;4IAW3C;qJAIM;qJAIA;mLAItB;4IAUgB;qJAIM;qJAIA;mLAItB;EAEb;EAEA;QAGI,4DAAyB;QACzB,4DAAyB;QACzB,oIAAqD;QACrD,sHAA2C;QAC3C,sHAA2C;QAC3C,sHAA2C;QAC3C,4JAA0C;IAG5C,oCACE,8DACA,uDACA,sCAAG;IAEL,oCACE,8DACA,4EACA,uDACA,uCAAG;IAEL,uJAAiF;IACjF,uJAAiF;;4IAYtD;mLAIhB;mLAIA;mLAIA;0LAWgB;;+HAG2C;+HACA;qJAIrC;mLAItB;mLAIA;EAEb;EAEA;QAGI,4DAAwB;QACxB,4DAAwB;QACxB,oIAAoD;QACpD,qHAA0C;QAC1C,2JAAyC;IAG3C,oCACE,8DACA,2EACA,sEACA,oEACA,iEACA,uDACA,0CAAG;IAEL,oCACE,8DACA,2EACA,sEACA,oEACA,iEACA,8EACA,yDACA,2CAAG;IAEL,uJAAiF;IACjF,uJAAiF;;8HAGZ;8HACA;8HACA;8HACA;8HACA;8HACA;8HACA;;IAIrE,cAAW,wEAEc;mJAIO;EAElC;EAEA;QAGI,0DAAyB;QACzB,oIAAqD;QACrD,4DAAyB;QACzB,gEAAyB;IAE3B,kCACE,8DACA,gFACA,8EACA,gFACA,kFACA,6EACA,+EACA,6EACA,8DACA,6CAAG;IAEL,qJAA+E;IAE/E,wCACE,8DACA,kFACA,qFACA,+EACA,gFACA,6EACA,8EACA,gFACA,sDACA,6CAAG;IAEL,2JAAqF;;IAIrF,eAAY,6CAAkC;iGAIvB;EAEzB;EAEA;wYAKiE;gRAK5B;iRAKA;uRAKM;uRAKN;EAErC;AAEF","file":"zcl_abapgit_ajson_utilities.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_apack_reader.clas.testclasses.mjs":{"lineLengths":[87,53,49,34,32,84,37,245,67,63,2928,17,42,22,147,3,29,64,16,3,31,128,3,17,2830,108,99,92,127,158,120,3,38,2824,106,96,167,158,151,114,186,111,3,1,102,36,70],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/apack/zcl_abapgit_apack_reader.clas.testclasses.abap"],"names":[],"mappings":";;;AAWA;;;;;;;;;;;;;;;;;EAEE;+HACyE;EACzE;EAEA;QACQ,qwFAA8E;IAEpF,4BAA4B,MAAC,cAAW,sDAAoB;IAC5D,4BAA4B,MAAC,iBAAc,0CAAS;IACpD,4BAA4B,MAAC,aAAU,uCAAM;IAC7C,4BAA4B,MAAC,aAAU,0EAAwC;IAE/E,6BAAqB,2HAAmD;uHACG;EAE7E;EAEA;;;+FACmE;sKAEU;6JAEG;sJAEJ;iHAEG;yLAEH;8GACA;EAC5E;AAEF","file":"zcl_abapgit_apack_reader.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_auth.clas.testclasses.mjs":{"lineLengths":[71,53,41,17,32,59,37,25,79,17,42,22,3,29,64,16,3,28,103,145,108,3,1,60,19,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/exits/zcl_abapgit_auth.clas.testclasses.abap"],"names":[],"mappings":";;;AAQA;;;;;;;;;;;;;;EAEE;QAEO,8FAAyB;IAE9B,gBAAa,2HAAiD;2GAI3C;EAErB;AAEF","file":"zcl_abapgit_auth.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_convert.clas.testclasses.mjs":{"lineLengths":[77,53,44,20,32,65,37,25,73,56,59,66,70,66,70,61,72,57,61,62,17,42,22,3,29,64,16,3,29,4,234,63,158,114,143,3,29,69,138,141,3,25,4,63,256,153,115,140,3,40,93,141,121,3,29,71,139,128,3,34,71,132,116,139,126,3,38,71,136,116,141,128,144,135,3,34,69,130,116,140,123,3,38,69,9,142,55,17,106,14,16,7,5,3,27,72,39,64,110,66,73,72,65,65,59,63,65,53,53,40,41,40,106,100,61,62,67,55,105,74,98,106,36,93,7,52,106,95,5,50,3,23,72,64,65,59,63,65,53,48,100,106,95,5,50,3,24,260,260,93,93,256,162,34,258,160,3,1,69,22,65],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_convert.clas.testclasses.abap"],"names":[],"mappings":";;;AA4BA;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;QAGO,iOAAwD;QACxD,sDAAc;6JAOQ;iHAIhB;8IAIA;EAEb;EAEA;QAEO,4DAAoB;IAEzB,aAAU,uHAAuD;4IAI/B;EAEpC;EAEA;;QAGO,sDAAc;QACd,uPAAsD;wJAOrC;kHAIV;2IAID;EAEb;EAEA;QAEO,oFAAmB;IAExB,cAAW,yHAAwD;wHAIrD;EAEhB;EAEA;QAEO,8DAAsB;IAE3B,eAAY,sHAAoD;+HAI5C;EAEtB;EAEA;QAEO,8DAAsB;IAE3B,eAAY,+GAAiD;mHAIjD;IAEZ,eAAY,sHAAoD;6HAI9C;EAEpB;EAEA;QAEO,8DAAsB;IAE3B,eAAY,mHAAqD;mHAIrD;IAEZ,eAAY,wHAAsD;+HAI9C;IAEpB,eAAY,2HAAyD;sIAI3C;EAE5B;EAEA;QAEO,4DAAqB;IAE1B,eAAY,6GAAiD;mHAIjD;IAEZ,eAAY,uHAAuD;0HAIpD;EAEjB;EAEA;QAEO,4DAAqB;IAG1B;MACI,eAAY,uHAAuD;sDACvC;;;;;;IAEhC;EAEF;EAEA;QAEQ,+DAAwB;QACxB,8BAAkB;QAClB,uDAAkB;QAClB,qGAAwD;QACxD,yDAAkB;QAClB,gEAAwB;QACxB,+DAAwB;QACxB,wDAAkB;QAClB,wDAAkB;;;;;MAItB,cAAY,+BAAC;MACb,sBAAO,UAAU;MAAjB,sBAAmB,WAAW;MAA9B,sBAAgC,UAAU;MAE1C,aAAqB,wBAAT,eAAE,MAAC,OAAQ,iCAAE;MACzB,gBAAa,4EAAgD;;;;;QAE3D,cAAqB,qBAAT,eAAE,MAAC,OAAQ,gCAAC;QACxB,YAAU,oDAAuB;QACjC,gBAAa,wEAA4C;QACzD,gBAAa,gFAAiD;QAC9D,gBAAc,UAAU;QACxB,sCAAY,YAAW,sBAAiB,UAC1B;MAChB;;MACA,eAAY,mFAAiD;8FAIxC;IAEvB;;EAEF;EAEA;QAEQ,+DAAuB;QACvB,uDAAiB;QACjB,wDAAiB;;;;;MAIrB,aAAW,eAAE,MAAC,MAAK;MACnB,gBAAa,4EAAgD;MAC7D,eAAY,mFAAiD;8FAIxC;IACvB;;EAEF;EAEA;QAEQ,2PAAwB;QACxB,2PAAwB;IAE9B,gCAAO,gDAAS,MAAM;IACtB,gCAAO,gDAAS,MAAM;IAGtB,YAAS,8OAAoF;iKAIhB;IAE7E,sBAAO,MAAM;IAGb,YAAS,gPAAsF;+JAIpB;EAE7E;AAEF","file":"zcl_abapgit_convert.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_config.clas.testclasses.mjs":{"lineLengths":[85,53,48,17,32,66,37,165,672,67,61,51,981,17,42,22,68,595,3,29,64,16,3,17,542,122,76,115,3,29,139,594,88,71,117,108,85,49,108,85,197,3,19,139,889,508,67,88,90,76,142,79,22,61,92,115,95,47,3,26,889,64,139,88,82,197,3,1,67,19,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_config.clas.testclasses.abap"],"names":[],"mappings":";;;AAgBA;;;;;;;;;;;;;;;;;;;;EAEE;IAEE,whBAOM;IAEN,cAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;IAC1D,cAAS,MAAC,UAAQ,wCAAO;IACzB,gCAAO,kDAAW,cAAS,MAAC,MAAK;EAEnC;EAEA;QAEO,kIAA6C;QAC7C,ykBAAiD;;IAItD,SAAS,MAAC,UAAO,wCAAO;IACxB,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;IAC1D,gCAAO,gDAAS,SAAS,MAAC,MAAK;oFAEG;IAElC,sBAAM,SAAS,MAAC,MAAK;IACrB,gCAAO,gDAAS,SAAS,MAAC,MAAK;oFACG;oMAIvB;EAEb;EAEA;QAEO,kIAA6C;QAC7C,g3BAAsD;QACtD,mfAA6B;QAC7B,0DAAmB;;yFAIU;IAElC,cAAW,wDAAqB;6IAIrB;IAEX;oBAAwC;4DACJ;2FAEmB;IAEvD,aAAU,gGAA2D;8FAIpD;8CAEI;EAEvB;EAEA;;;QAEO,kIAA6C;;iFAIlB;oMAIrB;EAEb;AAEF","file":"zcl_abapgit_data_config.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_deserializer.clas.testclasses.mjs":{"lineLengths":[97,53,54,0,0,17,32,72,37,25,67,72,72,73,17,42,22,3,29,64,16,3,17,148,139,889,594,91,88,117,70,85,109,3,40,51,24,144,594,79,79,238,1290,158,158,154,269,154,154,117,70,117,89,117,89,57,79,38,78,75,91,179,98,98,98,144,144,144,68,34,108,5,3,40,51,24,144,594,79,79,238,1290,158,158,154,154,269,154,117,70,117,89,117,89,57,74,38,78,75,57,79,38,85,75,91,179,98,98,98,144,144,144,68,34,108,5,3,40,51,24,144,594,79,79,238,1290,158,158,154,154,154,269,117,70,117,89,117,89,57,79,38,85,75,91,179,98,98,98,144,144,144,68,34,108,5,3,1,73,19,75],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAcA;;;;;;;;;;;;;;;;;EAEE;QAEO,2IAAgD;QAChD,kIAA6C;QAC7C,g3BAAsD;QACtD,ykBAAiD;;;IAKtD,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;IAC1D,SAAS,MAAC,UAAO,uCAAM;oFAEW;4GAKV;EAE1B;EAGA;QAEa,0CAAoC,CAAA;;QAEzC,uIAAoD;QACpD,ykBAAkD;QAClD,sEAA2B;QAC3B,sEAA2B;QAC3B,qOAAoB;QACpB,iwCAAwD;IAE9D,IAAe,cAA2B;IAA1C,IACe,cAA2B;IAD1C,IAEe,UAA2B;IAF1C,IAGe,UAAsB;IAHrC,IAIe,UAA2B;IAJ1C,IAKe,UAA2B;IAE1C,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;IAC1D,SAAS,MAAC,UAAO,uCAAM;IAEvB,gBAAa,+FAA0D;IACvE,kFAAoC;IACpC,gBAAa,+FAA0D;IACvE,kFAAoC;IAGpC,OAAO,MAAC,WAAQ,eAAE,MAAC,MAAK;IACxB,OAAO,MAAC,WAAQ,iDAAe;IAC/B,OAAO,MAAC,WAAQ,QAAQ;IACxB,OAAO,MAAC,2DAA4B;IACpC,oEAAsC;;IAGtC,eAAY,8JAIe;IAE3B,2FAAuC;IACvC,2FAAuC;IACvC,2FAAuC;+IAIZ;+IAGA;+IAGA;;;2GAKD;IAC1B;EAEF;EAGA;QAEa,0CAAoC,CAAA;;QAEzC,uIAAoD;QACpD,ykBAAkD;QAClD,sEAA2B;QAC3B,sEAA2B;QAC3B,qOAAoB;QACpB,iwCAAwD;IAE9D,IAAe,cAA2B;IAA1C,IACe,cAA2B;IAD1C,IAEe,UAA2B;IAF1C,IAGe,UAA2B;IAH1C,IAIe,UAAsB;IAJrC,IAKe,UAA2B;IAE1C,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;IAC1D,SAAS,MAAC,UAAO,uCAAM;IAEvB,gBAAa,+FAA0D;IACvE,kFAAoC;IACpC,gBAAa,+FAA0D;IACvE,kFAAoC;IAGpC,OAAO,MAAC,WAAQ,eAAE,MAAC,MAAK;IACxB,OAAO,MAAC,uDAAuB;IAC/B,OAAO,MAAC,WAAQ,QAAQ;IACxB,OAAO,MAAC,2DAA4B;IACpC,oEAAsC;IAEtC,OAAO,MAAC,WAAQ,eAAE,MAAC,MAAK;IACxB,OAAO,MAAC,WAAQ,iDAAe;IAC/B,OAAO,MAAC,WAAQ,QAAQ;IACxB,OAAO,MAAC,kEAAmC;IAC3C,oEAAsC;;IAGtC,eAAY,8JAIe;IAE3B,2FAAuC;IACvC,2FAAuC;IACvC,2FAAuC;+IAIZ;+IAGA;+IAGA;;;2GAKD;IAC1B;EAEF;EAGA;QAEa,0CAAoC,CAAA;;QAEzC,uIAAoD;QACpD,ykBAAkD;QAClD,sEAA2B;QAC3B,sEAA2B;QAC3B,qOAAoB;QACpB,iwCAAwD;IAE9D,IAAe,cAA2B;IAA1C,IACe,cAA2B;IAD1C,IAEe,UAA2B;IAF1C,IAGe,UAA2B;IAH1C,IAIe,UAA2B;IAJ1C,IAKe,UAAsB;IAErC,SAAS,MAAC,UAAO,wCAAyB,mCAAW,MAAC,KAAI;IAC1D,SAAS,MAAC,UAAO,uCAAM;IAEvB,gBAAa,+FAA0D;IACvE,kFAAoC;IACpC,gBAAa,+FAA0D;IACvE,kFAAoC;IAGpC,OAAO,MAAC,WAAQ,eAAE,MAAC,MAAK;IACxB,OAAO,MAAC,WAAQ,iDAAe;IAC/B,OAAO,MAAC,WAAQ,QAAQ;IACxB,OAAO,MAAC,kEAAmC;IAC3C,oEAAsC;;IAGtC,eAAY,8JAIe;IAE3B,2FAAuC;IACvC,2FAAuC;IACvC,2FAAuC;+IAIZ;+IAGA;+IAGA;;;2GAKD;IAC1B;EAEF;AAEF","file":"zcl_abapgit_data_deserializer.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_serializer.clas.testclasses.mjs":{"lineLengths":[93,53,52,0,0,17,32,70,37,242,217,67,53,65,66,17,42,22,145,140,3,29,64,16,3,17,94,93,3,21,594,889,68,70,70,115,78,90,111,142,3,33,594,68,70,82,115,78,90,9,97,17,106,57,14,16,7,5,3,33,594,68,70,70,119,78,90,9,97,55,17,106,14,16,7,5,3,1,71,19,73],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAiBA;;;;;;;;;;;;;;;;;;;;EAEE;;;EAGA;EAEA;QAEO,ykBAAiD;QACjD,g3BAAsD;QACtD,2DAAqC;IAE1C,SAAS,MAAC,UAAO,uCAAM;IACvB,SAAS,MAAC,UAAO,uCAAM;IACvB,6GAAmC;IACnC,gCAAO,kBAAY,SAAS,MAAC,MAAK;yFAEA;IAElC,cAAW,2FAA8B;6IAI9B;EAEb;EAEA;QAEO,ykBAAiD;QACjD,2DAAqC;IAE1C,SAAS,MAAC,UAAO,uCAAM;IACvB,SAAS,MAAC,UAAO,mDAAiB;IAClC,6GAAmC;IACnC,gCAAO,kBAAY,SAAS,MAAC,MAAK;yFAEA;IAElC;gGACkC;;;;;;;IAGlC;EAEF;EAEA;QAEO,ykBAAiD;QACjD,2DAAqC;IAE1C,SAAS,MAAC,UAAO,uCAAM;IACvB,SAAS,MAAC,UAAO,uCAAM;IACvB,iHAAuC;IACvC,gCAAO,kBAAY,SAAS,MAAC,MAAK;yFAEA;IAElC;gGACkC;sDACF;;;;;;IAEhC;EAEF;AAEF","file":"zcl_abapgit_data_serializer.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_supporter.clas.testclasses.mjs":{"lineLengths":[91,53,51,26,32,78,65,25,22,17,42,22,3,29,64,16,3,63,105,105,61,51,61,192,47,5,24,3,1,88,0,22,32,74,37,25,78,57,17,42,22,3,29,64,16,3,28,99,291,105,3,24,162,139,99,113,90,65,291,104,3,1,80,44,72],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_supporter.clas.testclasses.abap"],"names":[],"mappings":";;;AAKA;;;;;;;;;;;;;;EACE;;;;;;IAEE,iBAAW,GAAR,SAAU,wCAAyB,mCAAW,MAAC,MAAK,iBAAY,GAAR,SAAU,wCAAM;MACzE,iBAAe,sBAAS;IAC1B;IAEF;;AAEF;;;AAcA;;;;;;;;;;;;;;;EAEE;QAEO,0FAAqB;IAG1B,YAAS,iRAEW;wGAIA;EAEtB;EAEA;QAEO,yJAAsC;QACtC,kIAA+C;QAC/C,0FAAqB;;;gEAKS;IAEnC,YAAS,iRAEW;uGAID;EAErB;AAEF","file":"zcl_abapgit_data_supporter.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_data_utils.clas.testclasses.mjs":{"lineLengths":[83,53,47,28,32,76,37,25,81,65,61,17,42,22,3,29,64,16,3,31,594,70,70,216,77,70,222,3,33,594,70,70,218,77,70,224,3,28,76,237,154,77,133,82,70,61,55,30,61,3,1,88,30,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/data/zcl_abapgit_data_utils.clas.testclasses.abap"],"names":[],"mappings":";;;AASA;;;;;;;;;;;;;;;;EAEE;QAEO,ykBAAiD;IAEtD,SAAS,MAAC,UAAO,uCAAM;IACvB,SAAS,MAAC,UAAO,uCAAM;uNAIG;IAE1B,SAAS,MAAC,UAAO,8CAAY;IAC7B,SAAS,MAAC,UAAO,uCAAM;6NAIS;EAElC;EAEA;QAEO,ykBAAiD;IAEtD,SAAS,MAAC,UAAO,uCAAM;IACvB,SAAS,MAAC,UAAO,uCAAM;yNAIG;IAE1B,SAAS,MAAC,UAAO,8CAAY;IAC7B,SAAS,MAAC,UAAO,uCAAM;+NAIS;EAElC;EAEA;QAEO,mEAAwB;QACxB,oOAAiB;IACtB,IAAc,UAAuB;IACrC,IAAc,UAAiB;IAE/B,aAAU,kHAAkD;IAC5D,2EAA6B;IAG7B,+DAAiC;4DACG;IAEpC;4BAAkD;4DACd;EAEtC;AAEF","file":"zcl_abapgit_data_utils.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_diff.clas.testclasses.mjs":{"lineLengths":[71,53,41,17,32,59,37,343,322,366,1312,173,155,161,920,49,647,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,56,17,42,22,246,246,290,1235,3,29,64,16,3,24,66,58,66,3,24,66,58,66,3,27,69,67,73,3,29,111,70,96,58,109,67,111,70,96,58,103,67,128,865,46,38,44,46,38,44,76,3,17,39,39,43,44,3,21,114,103,124,111,94,118,107,82,110,109,88,114,66,69,66,69,119,1230,893,147,147,105,105,231,68,128,13,5,45,66,36,53,5,99,3,18,71,320,22,3,18,71,71,329,22,3,18,71,320,22,3,18,72,71,327,22,3,18,71,71,71,71,329,329,22,3,18,71,71,78,71,78,71,71,71,71,329,329,327,329,333,22,3,18,71,72,71,75,71,71,71,71,329,330,329,333,69,3,18,71,73,71,77,71,73,71,77,329,333,329,341,66,3,18,71,71,71,71,71,71,71,71,329,329,329,329,62,3,18,78,78,340,62,3,18,78,82,78,82,343,351,62,3,18,84,67,75,74,75,74,84,75,74,399,361,381,379,369,368,22,3,18,84,67,75,74,75,74,84,75,74,399,361,381,379,369,368,22,3,18,71,66,67,69,71,71,71,68,66,71,329,325,319,323,329,22,3,18,68,70,329,66,3,18,66,77,334,66,3,23,86,66,90,82,66,92,83,89,75,66,96,80,89,82,78,75,66,82,66,85,95,66,86,80,70,91,97,101,101,101,90,91,64,3,1,60,19,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_diff.clas.testclasses.abap"],"names":[],"mappings":";;;AAsDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;IACE,gCAAO,gBAAU,WAAM;EACzB;EAEA;;;IACE,gCAAO,gBAAU,WAAM;EACzB;EAEA;;;IACE,gCAAO,mBAAa,eAAU;EAChC;EAEA;;;;;;;;;;;;;;QACO,w1BAAoC;IAEzC,WAAW,MAAC,aAAU,UAAU;IAChC,WAAW,MAAC,SAAU,MAAM;IAC5B,WAAW,MAAC,YAAU,SAAS;IAC/B,WAAW,MAAC,aAAU,UAAU;IAChC,WAAW,MAAC,SAAU,MAAM;IAC5B,WAAW,MAAC,YAAU,SAAS;IAC/B,gCAAO,qBAAe,gBAAW;EACnC;EAEA;IACE,sBAAM,WAAM;IACZ,sBAAM,WAAM;IACZ,sBAAM,eAAU;IAChB,sBAAM,gBAAW;EACnB;EAEA;;;;;;;;;;;;;QAEQ,yDAAmB;QACnB,4DAAoB;QACpB,yDAAmB;QACnB,4DAAoB;QACpB,8GAAoC;QACpC,qsCAAiD;IAEvD,IAAe,WAA8B;IAG7C,sCAAqB,sBAAY,MAAmD;IACpF,sCAAqB,sBAAY,MAAmD;IAEpF,aAAU,sFAAqD;IAC/D,aAAU,sFAAqD;;IAU/D,iBAAoB,GAAjB,kBAAmB,uBAAS;+HAGT;MACpB;IACF;IAEA,aAAU,0BAAe;;;MAGvB,sBAAM,WAAS,MAAC,MAAK;IACvB;kGAGuD;EAEzD;EAEA;sEAGgB;+TAMiB;qBACxB;EAET;EAEA;sEAGgB;sEACA;wUAMkB;qBACzB;EAET;EAEA;sEAGgB;+TAMkB;qBACzB;EAET;EAEA;uEAGiB;sEAED;sUAMkB;qBACzB;EAET;EAEA;sEAGgB;sEACA;sEAEA;sEACA;wUAMkB;wUAKA;qBACzB;EAET;EAEA;sEAGgB;sEACA;6EACO;sEACP;6EACO;sEAEP;sEACA;sEACA;sEACA;wUAMkB;wUAKA;sUAKD;wUAKC;4UAKA;qBAEzB;EAET;EAEA;sEAGgB;uEACC;sEACD;0EACI;sEAEJ;sEACA;sEACA;sEACA;wUAMkB;yUAKA;wUAKA;4UAKA;oEAES;EAE3C;EAEA;sEAGgB;wEACE;sEACF;4EACM;sEAEN;wEACE;sEACF;4EACM;wUAMY;4UAKE;wUAKF;oVAKM;iEAEA;EAExC;EAEA;sEAGgB;sEACA;sEACA;sEACA;sEAEA;sEACA;sEACA;sEACA;wUAMkB;wUAKA;wUAKA;wUAKA;6DAEE;EAEpC;EAEA;6EAG2B;6EAEA;mVAMkB;6DAET;EAEpC;EAEA;6EAG2B;iFACI;6EAEJ;iFACI;sVAMc;8VAKI;6DAEb;EAEpC;EAEA;mFAGiC;kEACjB;0EACQ;yEACD;0EACC;yEACD;mFAEU;0EACT;yEACD;8YAOS;wWAMA;4XAMA;0XAMA;gXAMA;+WAMA;qBAEvB;EAET;EAEA;mFAGiC;kEACjB;0EACQ;yEACD;0EACC;yEACD;mFAEU;0EACT;yEACD;8YAOS;wWAMA;4XAMA;0XAMA;gXAMA;+WAMA;qBAEvB;EAET;EAEA;sEAGgB;iEACD;kEACC;oEACE;sEACF;sEAEA;sEACI;mEACH;iEACF;sEACC;wUAMkB;oUAKI;8TAKH;kUAKF;wUAKC;qBAEzB;EAET;EAGA;mEAGiB;qEAEF;wUAMkB;iEAEO;EAExC;EAGA;iEAGe;4EAEW;6UAMkB;iEAEJ;EAExC;EAGA;qFAEmC;iEACpB;yFACwB;iFACR;iEAChB;2FAC0B;kFACT;wFACM;0EACd;iEACT;+FAC8B;+EAChB;wFACS;iFACP;6EACJ;0EACH;iEACT;iFACgB;iEAChB;oFACmB;8FACU;iEAC7B;qFACoB;+EACN;qEAEd;0FAEsB;gGACM;oGACI;oGACA;oGACA;yFACX;0FACC;+DAEC;EAEtC;AACF","file":"zcl_abapgit_diff.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_dot_abapgit.clas.testclasses.mjs":{"lineLengths":[85,53,48,0,0,24,32,73,37,25,70,51,17,42,22,3,29,64,16,3,20,132,1954,1953,80,40,121,39,93,3,18,67,25,67,21,71,34,103,132,80,98,109,80,98,108,83,98,109,164,109,183,109,136,108,138,109,3,1,81,26,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_dot_abapgit.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAaA;;;;;;;;;;;;;;;EAEE;QAEQ,2HAA6C;QAC7C,y5DAAsD;QACtD,w5DAAsD;IAG5D,YAAS,8DAAyC;IAClD,cAAY,MAAM,OAAE,OAAO;IAE3B,YAAS,uGAA4D;IACrE,aAAW,MAAM,OAAE,OAAO;4FAIP;EAErB;EAEA;QAEa,0DAAqC,CAAA;;QACrC,0DAAiC,CAAA;;QACjC,8DAA0C,CAAA;;QAE/C,8FAAyB;QACzB,2HAA8C;IAGpD,YAAS,8DAAyC;IAGlD,gBAAa,4EAC+C;4GAGxC;+EAI2B;IAE/C,gBAAa,4EAC+C;2GAGzC;kFAI+B;IAElD,gBAAa,4EAC+C;4GAGxC;IAGpB,gBAAa,8IAC0E;4GAGnE;IAEpB,gBAAa,iKACuF;4GAGhF;IAGpB,gBAAa,kHACmD;2GAG7C;IAGnB,gBAAa,oHACqD;4GAG9C;EAEtB;AAEF","file":"zcl_abapgit_dot_abapgit.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_environment.clas.testclasses.mjs":{"lineLengths":[85,53,48,0,0,17,32,66,37,235,67,65,53,74,65,64,17,42,22,137,3,29,64,16,3,17,90,3,33,76,3,21,64,3,42,85,3,33,76,3,31,74,3,1,67,19,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_environment.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAsBA;;;;;;;;;;;;;;;;;;;;EAEE;;EAIA;EAEA;2EAEkC;EAGlC;EAEA;+DAEsB;EAGtB;EAEA;oFAE2C;EAG3C;EAEA;2EAEkC;EAGlC;EAEA;yEAEgC;EAGhC;AAEF","file":"zcl_abapgit_environment.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_filename_logic.clas.testclasses.mjs":{"lineLengths":[91,53,51,0,0,27,32,79,67,25,22,17,42,22,3,29,64,16,3,52,131,73,11,3,45,131,87,23,3,1,90,23,32,75,37,231,67,59,55,58,58,66,67,17,42,22,133,3,29,64,16,3,17,166,85,116,94,3,23,102,252,108,3,27,266,238,239,240,3,26,597,102,103,306,137,141,108,315,137,141,108,305,137,141,107,380,137,166,313,137,144,314,137,145,305,137,138,108,311,137,145,108,3,26,597,71,72,76,156,141,72,83,156,147,72,74,215,151,72,101,156,215,72,79,155,148,72,80,156,144,72,80,156,144,3,34,597,282,137,138,291,137,147,3,34,597,71,72,76,155,139,3,1,82,46,72],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_filename_logic.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAQA;;;;;;;;;;;;;;EACE;;;IACE;EACF;EAEA;;;IAEA;;AACF;;AAmBA;;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,6JAAyC;IAG9C,iBAAS,8DAAyC;;6FAGK;EAEzD;EAEA;QAEO,6FAAwB;2PAQA;2GAKV;EAErB;EAEA;yQAIsB;6OAID;8OAIA;+OAIC;EAEtB;EAEA;QAEO,4kBAA6C;QAC7C,6FAAwB;QACxB,8FAAyB;iTAUD;wIAIH;4IAGA;2GAGP;0TAWU;wIAIH;4IAGA;2GAGP;gTAWU;wIAIH;4IAGA;0GAGP;2XAWS;wIAIF;qKAGA;wTAUE;wIAIF;+IAGA;yTAUE;wIAIF;gJAGA;gTAWI;wIAIJ;yIAGA;2GAGN;sTAYU;wIAIJ;gJAGA;2GAGN;EAEtB;EAEA;QAEO,4kBAA6C;QAC7C,8DAAuB;IAE5B,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,2CAAU;IAE7B,iBAAc,qIAEM;4IAIC;IAGrB,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,kDAAgB;IAEnC,iBAAc,qIAEM;kJAIC;IAGrB,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,yCAAQ;IAE3B,iBAAc,gMAGc;sJAIP;IAGrB,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,oEAAkC;IAErD,iBAAc,qIAEO;sNAIA;IAErB,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,8CAAY;IAE/B,iBAAc,oIAEM;mJAIC;IAErB,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,+CAAa;IAEhC,iBAAc,qIAEO;+IAIA;IAGrB,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,+CAAa;IAEhC,iBAAc,qIAEO;+IAIA;EAEvB;EAEA;QAEO,4kBAA6C;yRASvB;wIAID;yIAGA;kSAUC;wIAID;kJAGA;EAE5B;EAEA;QAEO,4kBAA6C;QAC7C,8DAAuB;IAE5B,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,2CAAU;IAE7B,iBAAc,oIAEK;0IAIE;EAEvB;AAEF","file":"zcl_abapgit_filename_logic.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_file_deserialize.clas.testclasses.mjs":{"lineLengths":[95,53,53,0,0,0,0,34,32,88,37,244,1442,67,61,68,68,67,74,72,72,69,168,67,17,42,22,147,1365,3,29,64,16,3,17,99,3,29,132,131,40,148,3,36,1054,1054,132,132,85,21,40,148,85,21,88,3,36,133,132,40,148,3,35,133,132,40,148,3,42,128,127,40,148,3,40,1054,1054,134,145,85,21,40,148,85,21,88,3,40,1054,1054,133,146,85,21,40,148,85,21,88,3,37,132,40,148,3,29,74,82,1057,319,77,3,34,112,3,1,106,33,32,87,37,244,1440,1441,143,153,67,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,161,67,166,17,42,22,147,1364,1365,67,76,3,29,64,16,3,17,99,66,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,41,84,84,3,28,80,80,80,80,80,80,41,84,84,84,84,84,84,3,28,80,80,41,84,84,3,28,80,80,80,80,41,84,84,84,84,3,22,74,82,1056,48,49,75,93,3,35,116,77,116,3,22,78,94,1057,111,78,24,118,3,1,104,63,74],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_file_deserialize.clas.testclasses.abap"],"names":[],"mappings":";;;;;;;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;EAIA;EAEA;mIAEyE;kIACD;uCAE7C;mJAIG;EAE9B;EAGA;QAEQ,qhCAA6B;QAC7B,qhCAA6B;mIAEoC;mIACA;IAEvE;mBAAwC;uCAEf;mJAIG;IAE5B;mBAAwC;uFAIxB;EAElB;EAGA;oIAE0E;mIACD;uCAE9C;mJAIG;EAE9B;EAGA;oIAE0E;mIACD;uCAE9C;mJAIG;EAE9B;EAGA;+HAEqE;8HACD;uCAEzC;mJAIG;EAE9B;EAEA;QAEQ,qhCAA6B;QAC7B,qhCAA6B;qIAGsC;gJACW;IAEpF;mBAAwC;uCAEf;mJAIG;IAE5B;mBAAwC;uFAKxB;EAElB;EAEA;QAEQ,qhCAA6B;QAC7B,qhCAA6B;oIAGqC;iJACa;IAErF;mBAAwC;uCAEf;mJAIG;IAE5B;mBAAwC;uFAKxB;EAElB;EAEA;mIAEyE;uCAE9C;mJAIG;EAE9B;EAEA;;;QAEQ,whCAAgC;IAEtC;IAYA,sEAAqC;EAEvC;EAGA;IAEE,oBAAY,sFAAoD;EAElE;AAEF;;AA6CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;IAEE,6BAAsB,+BAAC;EACzB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;+EACA;+EACA;+EACA;+EACA;wCACW;mFACX;mFACA;mFACA;mFACA;mFACA;mFACA;EACjB;EAEA;+EACiB;+EACA;wCACW;mFACX;mFACA;EACjB;EAEA;+EACiB;+EACA;+EACA;+EACA;wCACW;mFACX;mFACA;mFACA;mFACA;EACjB;EAEA;;;QAEO,uhCAA8B;IACnC,QAAQ,MAAC,cAAW,cAAc;IAClC,QAAQ,MAAC,cAAW,eAAU;IAC9B,oEAAmC;IACnC,oBAAwB,mBAAX,gBAAa,gCAAC;EAE7B;EAGA;QAEO,2GAAkC;;IAIvC,oBAAY,0FAEa;EAE3B;EAGA;;;QAEQ,whCAAgC;IAEtC,6BAA0C,mBAApB,yBAAsB,gCAAC;IAE7C;sBAA6D;qHAIjC;EAE9B;AAEF","file":"zcl_abapgit_file_deserialize.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_add_patch.clas.testclasses.mjs":{"lineLengths":[89,53,50,28,32,79,37,1328,339,208,75,68,72,67,57,68,72,67,57,68,72,67,49,51,63,1205,68,174,69,17,42,22,1231,263,131,3,29,64,16,3,25,330,344,330,42,217,3,36,330,344,351,330,42,297,3,40,330,344,330,351,330,42,354,3,35,330,344,330,351,330,42,274,3,25,330,344,330,42,89,3,36,330,344,351,330,42,89,3,40,330,344,351,349,330,42,222,3,35,330,344,351,349,350,330,42,302,3,25,330,365,330,42,224,3,36,330,365,365,330,42,297,3,40,330,365,330,365,330,42,354,3,35,330,365,330,365,330,42,361,3,17,330,365,330,365,330,347,42,437,3,19,338,42,90,3,31,330,42,42,3,27,106,79,111,70,96,58,109,67,111,70,96,58,101,64,111,103,67,108,861,48,42,34,40,42,34,38,40,73,3,36,146,120,9,68,17,106,29,14,16,7,5,3,37,72,76,250,68,100,106,66,29,82,34,63,98,5,3,36,170,3,1,91,30,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_add_patch.clas.testclasses.abap"],"names":[],"mappings":";;;AAwDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;yUAOmC;uVAOA;yUAOA;yCAEN;wNAKnB;EAEV;EAEA;yUAOmC;uVAOA;8VAOA;yUAOA;yCAEN;wSAMnB;EAEV;EAEA;yUAOmC;uVAOA;yUAOA;8VAOA;yUAOA;yCAEN;iWAOnB;EAEV;EAEA;yUAOmC;uVAOA;yUAOA;8VAOA;yUAOA;yCAEN;iRAMnB;EAEV;EAEA;yUAOmC;uVAOa;yUAOb;yCAEN;wFAEG;EAEhC;EAEA;yUAOmC;uVAOa;8VAOO;yUAOpB;yCAEN;wFAEG;EAEhC;EAEA;yUAOmC;uVAOa;8VAOO;4VAOF;yUAOlB;yCAEN;6NAKnB;EAEV;EAEA;yUAOmC;uVAOa;8VAOO;4VAOF;6VAOC;yUAOnB;yCAEN;6SAMnB;EAEV;EAEA;yUAOmC;4WAOa;yUAOb;yCAGN;+NAKnB;EAEV;EAEA;yUAOmC;4WAOa;4WAOO;yUAOpB;yCAEN;wSAMnB;EAEV;EAEA;yUAOmC;4WAOa;yUAOb;4WAOoB;yUAOpB;yCAEN;iWAOnB;EAEV;EAEA;yUAQmC;4WAOa;yUAOb;4WAOoB;yUAOpB;yCAEN;wWAOnB;EAEV;EAEA;yUAOmC;4WAOa;yUAOb;4WAOoB;yUAOpB;0VAOA;yCAEN;obAQF;EAE3B;EAGA;iVAOuC;yCAEV;yFAEI;EAEjC;EAGA;yUAOmC;yCAEN;yCAEA;EAE7B;EAEA;;;;;;;;;;;;;;;;;;;QAEQ,o1BAA4B;IAElC,OAAO,MAAC,gBAAa,aAAa;IAClC,OAAO,MAAC,aAAa,UAAU;IAC/B,OAAO,MAAC,SAAa,MAAM;IAC3B,OAAO,MAAC,YAAa,SAAS;IAC9B,OAAO,MAAC,aAAa,UAAU;IAC/B,OAAO,MAAC,SAAa,MAAM;IAC3B,OAAO,MAAC,WAAa,QAAQ;IAC7B,OAAO,MAAC,YAAa,SAAS;IAC9B,kEAAiC;EAEnC;EAGA;QAEQ,yIAAsD;;IAM5D;MACI,mBAAW,yCAA8B;;;;;;;IAE7C;EAEF;EAGA;;;QAEQ,iPAAuD;QACvD,2DAA8B;IAEpC,IAAe,YAAgC;IAE/C;;;MAGE;gCAAuD;8DACnB;iGAIhB;IACtB;EAEF;EAGA;yKAIiC;EAEjC;AAEF","file":"zcl_abapgit_git_add_patch.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_branch_list.clas.testclasses.mjs":{"lineLengths":[93,53,52,0,0,18,32,71,37,348,178,69,55,70,53,72,17,42,22,250,3,29,64,16,3,22,73,91,124,67,925,149,110,81,127,59,25,153,156,27,129,61,3,37,184,157,100,23,3,23,126,155,157,23,3,38,130,67,139,68,9,25,55,17,106,24,169,14,16,7,5,3,39,126,161,100,75,3,21,69,67,66,2192,104,116,134,3,1,73,20,73],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_branch_list.clas.testclasses.abap"],"names":[],"mappings":";;;;;AA2BA;;;;;;;;;;;;;;;;;;;;EAEE;;;;QAEQ,0DAAmB;QACnB,o5BAA+D;IAErE,sCAAqB,uBAAa,OAAoD;6GAM/D;gFAE2B;8HAIvB;IAE3B;;;;;+HAEyC;4DACL;EAEtC;EAEA;IASE,gCAAO,qIAA6F,YAAO;IAC3G,gCAAO,0GAAkE,YAAO;IAChF,gCAAO,iDAAU,YAAO;sBAEhB;EAEV;EAEA;IAEE,gCAAO,2EAAmC,YAAO;IACjD,gCAAO,wGAAgE,YAAO;IAC9E,gCAAO,0GAAkE,YAAO;sBAExE;EAEV;EAEA;QAIO,yHAA0C;QAC1C,0DAAmB;IAExB,qIAAsG;IACtG,gCAAO,iBAAW,YAAO;IAEzB;wBACY;sDACoB;;;;;;;;IAKhC;EAEF;EAEA;IAKE,gCAAO,2EAAmC,YAAO;IACjD,gCAAO,8GAAsE,YAAO;IACpF,gCAAO,iDAAU,YAAO;0EAEM;EAEhC;EAEA;QAEO,4DAAoB;QACpB,0DAAmB;QACnB,yDAAkB;IAEvB,kCAAU,mGACP,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,6EACA,+FAAwC;IAE3C,aAAU,qFAAsD;mHAMnC;qIAIF;EAE7B;AAEF","file":"zcl_abapgit_git_branch_list.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_commit.clas.testclasses.mjs":{"lineLengths":[83,53,47,0,0,17,32,65,37,25,75,63,17,42,22,3,29,64,16,3,25,891,2397,2173,525,122,1079,68,107,144,81,24,61,138,3,30,891,2397,525,773,122,80,85,130,122,68,125,122,68,123,122,68,129,122,68,132,122,68,136,122,68,107,144,3,1,66,0,0,27,32,75,37,2496,79,61,59,67,67,67,204,211,215,496,17,42,22,2398,3,29,64,16,3,29,84,92,3,29,84,91,3,27,84,95,3,35,2173,131,102,86,24,134,3,35,2173,131,102,86,24,134,3,35,2173,79,131,102,86,24,137,3,34,105,61,2173,38,73,3,41,105,61,173,3,45,105,61,174,3,29,105,61,108,70,108,70,2205,58,42,48,48,3,1,86,0,0,32,32,80,37,25,82,64,64,64,64,64,64,64,65,17,42,22,3,29,64,16,3,32,9,176,17,106,158,14,16,7,5,3,32,9,198,17,106,141,14,16,7,5,3,32,9,195,139,17,106,14,16,7,5,3,32,9,195,140,17,106,14,16,7,5,3,32,9,184,152,17,106,14,16,7,5,3,32,9,148,146,17,106,14,16,7,5,3,32,9,183,145,17,106,14,16,7,5,3,32,9,188,146,17,106,14,16,7,5,3,32,9,198,17,106,152,14,16,7,5,3,1,96,66,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_commit.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAiBA;;;;;;;;;;;;;;;EAEE;QAEQ,k3BAAsD;QACtD,o1EAAyD;QACzD,onEAAkC;QAClC,ogBAAkC;IAGxC,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,OAAM;IAC3D,SAAS,MAAC,gCAAO,mGACf,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,6EACA,0DAAc;IAChB,gCAAO,mBAAa,UAAU;IAE9B,gBAAa,qFAAmD;+IAIrD;IAEX;sBAA4C;4DACR;yIAIpB;EAElB;EAEA;QAEQ,k3BAA8D;QAC9D,o1EAAiE;QACjE,ogBAA0C;QAC1C,4vBAAuD;IAG7D,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,OAAM;IAC3D,kBAAkB,MAAC,UAAY,wCAAO;IACtC,kBAAkB,MAAC,eAAY,wCAAO;IAEtC,kBAAkB,MAAC,YAAS,wFAAsD;IAClF,SAAS,MAAC,WAAO,0FAAyD;IAC1E,gCAAO,mBAAa,UAAU;IAE9B,kBAAkB,MAAC,YAAS,mFAAiD;IAC7E,SAAS,MAAC,WAAO,0FAAyD;IAC1E,gCAAO,mBAAa,UAAU;IAE9B,kBAAkB,MAAC,YAAS,iFAA+C;IAC3E,SAAS,MAAC,WAAO,0FAAyD;IAC1E,gCAAO,mBAAa,UAAU;IAE9B,kBAAkB,MAAC,YAAS,uFAAqD;IACjF,SAAS,MAAC,WAAO,0FAAyD;IAC1E,gCAAO,mBAAa,UAAU;IAE9B,kBAAkB,MAAC,YAAS,0FAAwD;IACpF,SAAS,MAAC,WAAO,0FAAyD;IAC1E,gCAAO,mBAAa,UAAU;IAE9B,kBAAkB,MAAC,0GAA0E;IAC7F,SAAS,MAAC,WAAO,0FAAyD;IAC1E,gCAAO,mBAAa,UAAU;IAE9B,gBAAa,qFAAmD;+IAIpD;EAEd;AAEF;;;;AAyBA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;mFAC4B;2FACQ;EACpC;EAEA;mFAC4B;0FACO;EACnC;EAEA;mFAC4B;8FACW;EACvC;EAEA;QAEO,onEAAqD;kIAGxB;qGAC+C;IAEjF;sBAA4C;qIAEE;EAChD;EAEA;QAEO,onEAAqD;kIAGxB;qGAC+C;IAEjF;sBAA4C;qIAEE;EAEhD;EAEA;QAEO,onEAAqD;8EAE3B;kIAEG;qGAE+C;IAEjF;sBAA4C;wIAEK;EAEnD;EAEA;;;QACO,onEAAqD;IAE1D,SAAS,MAAC,UAAO,OAAO;IACxB,gCAAO,mBAAa,eAAU;EAEhC;EAGA;;;4KAGkE;EAClE;EAEA;;;6KAGkE;EAClE;EAEA;;;;;;;IACE,IAAe,aAAuD;;IAEtE,aAAW,MAAC,UAAO,OAAO;IAC1B,aAAW,MAAC,aAAU,UAAU;IAChC,aAAW,MAAC,aAAU,UAAU;EAClC;AAEF;;;;AAuBA;;;;;;;;;;;;;;;;;;;;;;EAEE;IACE;+KAC2G;;;;;;;IAG3G;EACF;EAEA;IACE;qMAEsF;;;;;;;IAGtF;EACF;EAEA;IACE;kMAEmF;0IACF;;;;;;IAEjF;EACF;EAEA;IACE;kMAEmF;2IACD;;;;;;IAElF;EACF;EAEA;IACE;uLAEwE;uJACsB;;;;;;IAE9F;EACF;EAEA;IACE;mJAC+E;iJACS;;;;;;IAExF;EACF;EAEA;IACE;sLACkH;gJAC3B;;;;;;IAEvF;EACF;EAEA;IACE;2LAE4E;iJACY;;;;;;IAExF;EACF;EAEA;IACE;qMAEsF;;;;;;;IAGtF;EACF;AAEF","file":"zcl_abapgit_git_commit.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_pack.clas.testclasses.mjs":{"lineLengths":[79,76,55,53,45,17,32,63,37,25,68,50,51,17,42,22,3,29,64,16,3,18,592,376,69,593,35,120,75,105,64,96,96,93,3,18,592,376,69,593,35,120,75,105,64,35,120,77,105,64,96,96,93,3,18,592,376,69,593,35,120,75,105,64,96,96,93,3,1,64,0,0,28,32,74,37,25,426,61,61,62,62,62,62,63,63,64,64,65,68,17,42,22,3,29,64,16,3,21,65,67,104,61,164,73,73,71,122,96,3,31,122,3,32,123,3,32,125,3,33,226,3,30,119,3,35,130,3,29,118,3,31,122,3,29,118,3,30,119,3,30,121,3,30,121,3,1,86,0,0,17,32,63,37,202,68,58,57,54,53,57,54,54,728,17,42,22,33,3,29,64,16,3,22,591,408,48,124,73,72,48,124,73,72,93,78,31,61,138,3,22,591,408,48,124,75,72,48,123,71,72,93,78,31,61,140,3,25,51,50,104,59,891,525,592,376,764,890,69,25,37,101,120,38,63,105,68,37,37,39,80,83,70,100,37,103,122,38,63,105,68,35,70,76,35,64,96,37,101,120,38,63,105,68,35,95,91,95,3,28,525,69,61,101,120,38,63,105,21,3,22,50,36,891,525,890,69,25,64,68,35,95,91,95,3,21,50,36,891,525,72,890,69,28,59,60,61,52,84,5,50,64,68,35,95,91,95,3,18,764,764,69,46,48,113,116,83,100,98,94,3,26,764,764,69,46,48,113,116,223,100,98,94,3,25,764,764,69,46,48,113,116,83,300,100,98,94,3,1,64,105,64,35,32,81,37,859,144,67,50,154,51,51,52,17,42,22,762,67,3,29,64,16,3,17,39,39,3,20,69,67,137,3,18,69,110,100,3,19,78,84,84,83,89,69,76,24,137,141,147,142,143,142,3,19,78,83,89,69,76,24,137,141,147,135,142,3,19,78,84,83,89,69,76,24,137,141,147,142,142,3,1,100,16,32,62,37,25,73,17,42,22,3,29,64,16,3,22,72,72,728,507,114,95,166,134,132,153,168,156,3,1,62,0,0,23,32,69,37,25,280,52,52,53,53,57,17,42,22,3,29,64,16,3,21,69,61,67,73,65,69,25,100,96,3,20,116,3,20,116,3,21,117,3,21,119,3,24,124,3,1,76,108,66],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_pack.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAUA;;;;;;;;;;;;;;;;EAEE;QAEQ,ukBAAgD;QAChD,+WAA+B;QAC/B,4DAAsB;QACtB,wkBAAgD;IAEtD,sBAAM,OAAO;IACb,OAAO,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;IACzD,OAAO,MAAC,UAAO,8CAAY;IAC3B,OAAO,MAAC,UAAO,4EAA0C;IACzD,gCAAO,iBAAW,QAAQ;IAE1B,aAAU,6EAA6C;IACvD,eAAY,2EAA4C;4FAInC;EAEvB;EAEA;QAEQ,ukBAAgD;QAChD,+WAA+B;QAC/B,4DAAsB;QACtB,wkBAAgD;IAEtD,sBAAM,OAAO;IACb,OAAO,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;IACzD,OAAO,MAAC,UAAO,8CAAY;IAC3B,OAAO,MAAC,UAAO,4EAA0C;IACzD,gCAAO,iBAAW,QAAQ;IAE1B,sBAAM,OAAO;IACb,OAAO,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;IACzD,OAAO,MAAC,UAAO,gDAAc;IAC7B,OAAO,MAAC,UAAO,4EAA0C;IACzD,gCAAO,iBAAW,QAAQ;IAE1B,aAAU,6EAA6C;IACvD,eAAY,2EAA4C;4FAInC;EAEvB;EAEA;QAEQ,ukBAAgD;QAChD,+WAA+B;QAC/B,4DAAsB;QACtB,wkBAAgD;IAEtD,sBAAM,OAAO;IACb,OAAO,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;IACzD,OAAO,MAAC,UAAO,8CAAY;IAC3B,OAAO,MAAC,UAAO,4EAA0C;IACzD,gCAAO,iBAAW,QAAQ;IAE1B,aAAU,6EAA6C;IACvD,eAAY,2EAA4C;4FAInC;EAEvB;AAEF;;;;AAgCA;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;QAEQ,8DAAsB;IAE5B,eAAY,qGAEa;+FAIJ;EAEvB;EAEA;yHAG8B;EAE9B;EAEA;0HAG8B;EAE9B;EAEA;4HAGgC;EAEhC;EAEA;iOAIgC;EAEhC;EAEA;sHAG4B;EAE5B;EAEA;iIAGkC;EAElC;EAEA;qHAG4B;EAE5B;EAEA;yHAG8B;EAE9B;EAEA;qHAG4B;EAE5B;EAEA;sHAG4B;EAE5B;EAEA;wHAG8B;EAE9B;EAEA;wHAG8B;EAE9B;AAEF;;;;AAoCA;;;;;;;;;;;;;;;;;;;;;;;EAEE;QAEQ,skBAA8C;IAEpD,IAAe,WAA8B;;IAI7C,WAAS,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;IAC3D,WAAS,MAAC,UAAQ,wCAAO;IACzB,WAAS,MAAC,UAAQ,uCAAM;;IAGxB,WAAS,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;IAC3D,WAAS,MAAC,UAAQ,wCAAO;IACzB,WAAS,MAAC,UAAQ,uCAAM;IAExB,aAAU,0EAA0C;IAEpD;6BAA8C;4DACV;yIAInB;EAEnB;EAEA;QAEQ,skBAA8C;IAEpD,IAAe,WAA8B;;IAI7C,WAAS,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;IAC3D,WAAS,MAAC,UAAQ,0CAAS;IAC3B,WAAS,MAAC,UAAQ,uCAAM;;IAGxB,WAAS,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,IAAG;IAC1D,WAAS,MAAC,UAAQ,sCAAK;IACvB,WAAS,MAAC,UAAQ,uCAAM;IAExB,aAAU,0EAA0C;IAEpD;6BAA8C;4DACV;2IAIjB;EAErB;EAEA;QAEa,0CAA+D,CAAA;;QAC/D,+FAAkG,CAAA;;QAEvG,k3BAAsD;QACtD,ogBAAkC;QAClC,ukBAAiD;QACjD,+WAAgC;QAChC,mvBAA+C;QAC/C,i3BAAsD;QACtD,4DAAuB;IAI7B,YAAU,OAAO;IACjB,sBAAM,SAAS;IACf,SAAS,MAAC,WAAO,qEAAsC;IACvD,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,KAAI;IACzD,SAAS,MAAC,UAAO,OAAO;IACxB,SAAS,MAAC,WAAQ,+BAAC;IACnB,SAAS,MAAC,cAAU,sEAAoC;IACxD,gCAAO,mBAAa,UAAU;IAG9B,sBAAM,SAAS;IACf,SAAS,MAAC,UAAY,MAAM;IAC5B,SAAS,MAAC,YAAY,MAAM;IAC5B,SAAS,MAAC,YAAY,+CAAa;IACnC,SAAS,MAAC,eAAY,+CAAa;IACnC,SAAS,MAAC,UAAY,uCAAM;IAC5B,aAAU,iFAAgD;IAC1D,sBAAM,SAAS;IACf,SAAS,MAAC,WAAO,uEAAwC;IACzD,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,OAAM;IAC3D,SAAS,MAAC,UAAO,OAAO;IACxB,SAAS,MAAC,WAAQ,+BAAC;IACnB,SAAS,MAAC,cAAU,sEAAoC;IACxD,gCAAO,mBAAa,UAAU;IAG9B,sBAAM,OAAO;IACb,OAAO,MAAC,WAAY,wCAAO;IAC3B,OAAO,MAAC,UAAY,+CAAa;IACjC,OAAO,MAAC,UAAY,MAAM;IAC1B,gCAAO,iBAAW,QAAQ;IAC1B,aAAU,6EAA6C;IACvD,sBAAM,SAAS;IACf,SAAS,MAAC,WAAO,qEAAsC;IACvD,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,KAAI;IACzD,SAAS,MAAC,UAAO,OAAO;IACxB,SAAS,MAAC,WAAQ,+BAAC;IACnB,SAAS,MAAC,cAAU,sEAAoC;IACxD,gCAAO,mBAAa,UAAU;IAG9B,sBAAM,OAAO;IACb,aAAU,4EAA0C;IACpD,eAAY,sEAAuC;8FAI9B;EAEvB;EAEA;;;;IAEE,SAAS,MAAC,WAAO,qEAAsC;IACvD,SAAS,MAAC,UAAO,4CAA6B,kCAAM,MAAC,KAAI;IACzD,SAAS,MAAC,UAAO,OAAO;IACxB,SAAS,MAAC,WAAQ,+BAAC;IACnB,SAAS,MAAC,cAAU,sEAAoC;IAE1D;;EAEA;QAEa,yCAAgD,CAAA;;QAErD,k3BAAsD;QACtD,ogBAAkC;QAClC,i3BAAsD;QACtD,4DAAuB;IAG7B,YAAU,OAAO;IAEjB,eAAY,2CAAsB;IAClC,gCAAO,mBAAa,UAAU;IAE9B,sBAAM,OAAO;IACb,aAAU,4EAA0C;IACpD,eAAY,sEAAuC;8FAI9B;EAEvB;EAEA;QAEa,yCAAgD,CAAA;;QAErD,k3BAAsD;QACtD,ogBAAkC;QAClC,+DAAuB;QACvB,i3BAAsD;QACtD,4DAAuB;IAG7B,eAAa,OAAO;;;;;MAElB,sCAAY,YAAW,kBAAa,OAAoB;IAC1D;;IAEA,eAAY,2CAAsB;IAClC,gCAAO,mBAAa,UAAU;IAE9B,sBAAM,OAAO;IACb,aAAU,4EAA0C;IACpD,eAAY,sEAAuC;8FAI9B;EAEvB;EAEA;QAEQ,mvBAA8C;QAC9C,mvBAA8C;QAC9C,4DAAsB;IAG5B,SAAS,MAAC,UAAY,eAAK;IAC3B,SAAS,MAAC,YAAY,eAAK;IAC3B,SAAS,MAAC,YAAY,gFAA8C;IACpE,SAAS,MAAC,eAAY,gFAA8C;IACpE,SAAS,MAAC,UAAY,oDAAkB;IAExC,aAAU,iFAAgD;IAC1D,eAAY,6EAA8C;6FAIrC;EAEvB;EAEA;QAEQ,mvBAA8C;QAC9C,mvBAA8C;QAC9C,4DAAsB;IAG5B,SAAS,MAAC,UAAY,eAAK;IAC3B,SAAS,MAAC,YAAY,eAAK;IAC3B,SAAS,MAAC,YAAY,gFAA8C;IACpE,SAAS,MAAC,eAAY,gFAA8C;IACpE,SAAS,MAAC,gCAAY,2EACC,uCAAwB,QACxB,uCAAwB,SAAO;IAEtD,aAAU,iFAAgD;IAC1D,eAAY,6EAA8C;6FAIrC;EAEvB;EAEA;QAEQ,mvBAA8C;QAC9C,mvBAA8C;QAC9C,4DAAsB;IAE5B,SAAS,MAAC,UAAY,eAAK;IAC3B,SAAS,MAAC,YAAY,eAAK;IAC3B,SAAS,MAAC,YAAY,gFAA8C;IACpE,SAAS,MAAC,eAAY,gFAA8C;IACpE,SAAS,MAAC,UAAY,oDAAkB;IACxC,SAAS,MAAC,kCAAY,qPAC4E;IAElG,aAAU,iFAAgD;IAC1D,eAAY,6EAA8C;6FAIrC;EAEvB;AAEF;;;;AA2BA;;;;;;;;;;;;;;;;;;;;;;EAEE;IACE,sBAAM,WAAM;IACZ,sBAAM,WAAM;EACd;EAEA;;;IAEE,sCAAY,aAAO,WAAU,uCAAwB,kBAAa,WAAM;EAE1E;EAEA;QAEQ,4DAAoB;IAG1B,aAAU,2FAAqD;IAE/D,iBAAS,6EAA8C;EAEzD;EAEA;6EAEoB;mFACK;mFACA;kFACD;wFACM;oEACnB;2EACO;uBAEP;wIAIO;4IAGE;kJAGG;6IAGF;8IAGA;6IAIC;EAEtB;EAEA;6EAEoB;kFACI;wFACM;oEACnB;2EACO;uBAEP;wIAIO;4IAGE;kJAGG;sIAGT;6IAIQ;EAEtB;EAEA;6EAEoB;mFACK;kFACD;wFACM;oEACnB;2EACO;uBAEP;wIAIO;4IAGE;kJAGG;6IAGF;6IAIC;EAEtB;AAEF;;AAYA;;;;;;;;;;;;;;EAEE;QAEQ,+DAAwB;QACxB,+DAAyB;QACzB,+sBAA8C;IAEpD,qfAK2C;IAE3C,gBAAa,4FAA2D;IAExE,YAAS,6EAA8C;qKAIhC;qIAIF;mIAID;wJAIQ;uKAIC;2JAIL;EAE1B;AAEF;;;;AAqBA;;;;;;;;;;;;;;;;;;;EAEE;;;;;QAEO,wDAAgB;QAChB,4DAAoB;IAEzB,YAAU,OAAO;mGAMQ;+FAIJ;EAEvB;EAEA;mHAIqB;EAErB;EAEA;mHAIqB;EAErB;EAEA;oHAIsB;EAEtB;EAEA;sHAIsB;EAEtB;EAEA;2HAIyB;EAEzB;AAEF","file":"zcl_abapgit_git_pack.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_porcelain.clas.testclasses.mjs":{"lineLengths":[89,53,50,0,0,26,32,77,37,822,680,67,262,55,63,54,54,52,48,17,42,22,725,603,3,29,64,16,3,17,44,41,3,23,67,61,67,61,531,61,44,44,73,128,3,23,128,118,147,3,31,124,124,118,147,3,15,124,128,118,147,3,20,413,141,141,118,147,72,36,98,5,3,22,413,143,143,118,147,72,36,98,5,3,22,128,118,147,3,1,87,28,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_porcelain.clas.testclasses.abap"],"names":[],"mappings":";;;;;AA6BA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;IACE,sBAAM,gBAAW;IACjB,sBAAM,aAAQ;EAChB;EAEA;;;;;IAEE,IAAe,eAAsC;;IAIrD,eAAa,MAAC,UAAQ,OAAO;IAC7B,eAAa,MAAC,UAAQ,OAAO;IAC7B,eAAa,MAAC,UAAQ,oCAAG;IACzB,eAAa,MAAC,WAAQ,4CAA6B,mCAAO,MAAC,KAAI;EAEjE;EAEA;+HAGkC;IAEhC,mBAAW,6FAAqD;kJAIrD;EAEb;EAEA;2HAG+B;2HAGA;IAE7B,mBAAW,6FAAqD;kJAIrD;EAEb;EAEA;2HAG+B;+HAGA;IAE7B,mBAAW,6FAAqD;kJAIrD;EAEb;EAEA;IAEE,IAAe,WAA+B;4IAGlB;4IAGA;IAE5B,mBAAW,6FAAqD;kJAIrD;;;iGAGgD;IAC3D;EAEF;EAEA;IAEE,IAAe,WAA+B;8IAGlB;8IAGA;IAE5B,mBAAW,6FAAqD;kJAIrD;;;iGAGgD;IAC3D;EAEF;EAEA;+HAG+B;IAE7B,mBAAW,6FAAqD;kJAKrD;EAEb;AAEF","file":"zcl_abapgit_git_porcelain.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_time.clas.testclasses.mjs":{"lineLengths":[79,53,45,22,32,68,37,25,70,52,17,42,22,3,29,64,16,3,20,102,73,81,3,19,40,40,150,81,81,3,1,74,24,66],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_time.clas.testclasses.abap"],"names":[],"mappings":";;;AAWA;;;;;;;;;;;;;;;EAEE;QAEQ,6FAA8C;IAEpD,aAAU,sDAAiC;gFAEO;EAEpD;EAGA;QAEQ,+BAAqB;QACrB,+BAAqB;qJAOJ;gFAE2B;gFACA;EAEpD;AAEF","file":"zcl_abapgit_git_time.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_transport.clas.testclasses.mjs":{"lineLengths":[89,53,50,0,0,26,32,77,37,25,68,56,57,55,49,64,17,42,22,3,29,64,16,3,17,69,69,3392,96,143,145,3,18,69,344,9,98,17,106,57,14,16,7,5,3,24,69,130,201,9,98,55,17,106,24,202,14,16,7,5,3,25,69,130,535,9,98,55,17,106,24,203,14,16,7,5,3,23,69,130,363,9,98,55,17,106,24,216,14,16,7,5,3,31,69,342,9,98,17,106,57,14,16,7,5,3,1,87,28,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_transport.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAgBA;;;;;;;;;;;;;;;;;;;EAEE;QAEO,4DAAoB;QACpB,4DAAoB;IAEzB,kCAAU,mGACL,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,mGACA,6EACA,2GAAwC;+FAMtB;8IAIZ;gJAIE;EAEf;EAEA;QAEO,4DAAqB;IAE1B,oCAAY,mEACV,uCAAwB,8BACxB,4EACA,uCAAwB,QACxB,2CAAU;IACZ;iGAC+D;;;;;;;IAG/D;EAEF;EAEA;QAEO,4DAAqB;QACrB,yHAA0C;IAE/C,oCAAY,uEACV,uCAAwB,QACxB,yCAAU;IAEZ;iGAC+D;sDAE/B;;;;;;;;IAKhC;EAEF;EAEA;QAEO,4DAAqB;QACrB,yHAA0C;IAE/C,oCAAY,mEACV,uCAAwB,8BACxB,+GACA,2JACA,uCAAwB,QACxB,4CAAU;IAEZ;iGAC+D;sDAE/B;;;;;;;;IAKhC;EAEF;EAEA;QAEO,4DAAqB;QACrB,yHAA0C;IAE/C,oCAAY,mEACV,uCAAwB,8BACxB,4EACA,uCAAwB,QACxB,8DAAwB;IAE1B;iGAC+D;sDAE/B;;;;;;;;IAKhC;EAEF;EAEA;QAIO,4DAAqB;IAE1B,oCAAY,mEACV,uCAAwB,8BACxB,8EACA,uCAAwB,QACxB,uCAAM;IAER;iGAC+D;;;;;;;IAG/D;EAEF;AAEF","file":"zcl_abapgit_git_transport.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_url.clas.testclasses.mjs":{"lineLengths":[77,53,44,0,0,24,32,69,37,25,89,17,42,22,3,29,64,16,3,38,4,255,450,109,36,124,105,287,81,111,154,77,110,153,77,114,158,77,111,156,77,71,45,149,124,5,3,1,77,26,65],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git_platform/zcl_abapgit_git_url.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAWA;;;;;;;;;;;;;;EAEE;;QAQQ,sPAAsC;QACtC,ybAAuC;QACvC,oGAA+E,CAAA;;QAC/E,mHAAgD;QAChD,gGAA0D;IAEhE,IAAc,oBAAwC;;IAItD,gBAAgB,MAAC,mFAAmD;IACpE,gBAAgB,MAAC,8HAAsE;IACvF,gCAAO,0BAAoB,YAAY;IACvC,gBAAgB,MAAC,kFAAkD;IACnE,gBAAgB,MAAC,6HAAqE;IACtF,gCAAO,0BAAoB,YAAY;IACvC,gBAAgB,MAAC,sFAAsD;IACvE,gBAAgB,MAAC,kIAA0E;IAC3F,gCAAO,0BAAoB,YAAY;IACvC,gBAAgB,MAAC,mFAAmD;IACpE,gBAAgB,MAAC,gIAAwE;IACzF,gCAAO,0BAAoB,YAAY;;;MAGrC,iBAAc,4HAEe;2HAIR;IACvB;EAEF;AAEF","file":"zcl_abapgit_git_url.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_git_utils.clas.testclasses.mjs":{"lineLengths":[81,53,46,22,32,69,37,227,67,52,54,60,17,42,22,129,3,29,64,16,3,17,88,3,20,50,24,47,68,51,76,91,3,22,209,3,27,65,204,205,215,208,9,113,55,17,106,14,16,7,5,3,1,75,24,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_git_utils.clas.testclasses.abap"],"names":[],"mappings":";;;AAaA;;;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;QAEY,yCAAoC,CAAA;;QAEzC,sCAAoB;IAEzB,IAAc,QAAa;IAE3B,UAAO,mCAAmB;IAE1B,qEAA6B;0FAIZ;EAEnB;EAEA;gNAIsB;EAEtB;EAEA;QAEO,wDAAgB;2MAIV;4MAIC;sNAIC;+MAIE;IAGf;MACI,eAAY,0FAA+B;sDACf;;;;;;IAEhC;EAEF;AAEF","file":"zcl_abapgit_git_utils.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_asset_manager.clas.testclasses.mjs":{"lineLengths":[97,53,54,38,32,93,37,25,78,58,58,60,51,67,17,42,22,3,29,64,16,3,28,153,638,84,240,146,134,136,215,3,26,153,84,240,246,305,9,196,55,17,106,14,16,7,5,244,9,137,55,17,106,14,16,7,5,3,26,153,84,260,265,3,28,153,84,241,245,3,19,153,84,241,241,208,3,34,153,84,240,240,208,246,3,1,115,40,75],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_asset_manager.clas.testclasses.abap"],"names":[],"mappings":";;;AAeA;;;;;;;;;;;;;;;;;;;EAEE;QAEO,gJAAqD;QACrD,qnBAAyD;IAE9D,iBAAc,6DAAwC;+OAK9B;IAExB,cAAW,8HAA0C;qIAGH;uIAED;sNAGlC;EAEjB;EAEA;QAEO,gJAAqD;IAE1D,iBAAc,6DAAwC;+OAK9B;qPAIT;gTAMA;IAEf;mMAGiC;sDACD;;;;;;IAGhC;mPAKwB;IAExB;wIACmD;sDACnB;;;;;;IAGhC;EAEF;EAEA;QAEO,gJAAqD;IAE1D,iBAAc,6DAAwC;mQAKd;wQAIR;EAElC;EAEA;QAEO,gJAAqD;IAE1D,iBAAc,6DAAwC;gPAKhC;oPAIR;EAEhB;EAEA;QAEO,gJAAqD;IAE1D,iBAAc,6DAAwC;gPAKhC;gPAKD;+MAIV;EAEb;EAEA;QAEO,gJAAqD;IAE1D,iBAAc,6DAAwC;+OAKjC;+OAKA;+MAIV;qPAII;EAEjB;AAEF","file":"zcl_abapgit_gui_asset_manager.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_chunk_lib.clas.testclasses.mjs":{"lineLengths":[89,53,50,0,35,32,86,37,241,67,50,52,17,42,22,143,3,29,64,16,3,17,98,3,18,279,3,19,244,268,3,1,105,37,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.testclasses.abap"],"names":[],"mappings":";;;;AAkBA;;;;;;;;;;;;;;;;;EAEE;;EAIA;EAGA;sRAI2C;EAE3C;EAGA;mPAI2B;2QAIY;EAEvC;AAEF","file":"zcl_abapgit_gui_chunk_lib.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_css_processor.clas.testclasses.mjs":{"lineLengths":[97,53,54,22,32,77,37,256,222,67,267,17,42,22,159,145,3,29,64,16,3,17,94,137,3,25,66,58,70,70,178,3,1,83,47,32,79,37,25,78,68,59,61,65,66,59,17,12,42,22,3,29,64,16,3,28,142,99,9,40,17,106,57,14,16,7,5,3,36,101,9,40,55,17,106,14,16,7,5,3,27,86,99,9,40,55,17,106,14,16,7,5,3,29,70,363,106,95,121,3,33,70,71,581,106,571,95,122,3,34,70,71,901,107,865,96,122,3,26,70,71,623,109,594,98,122,3,1,87,50,32,82,37,25,73,59,17,12,42,22,3,29,64,16,3,23,68,68,71,266,157,102,93,187,157,102,93,455,160,122,3,26,68,68,71,621,157,102,93,190,157,102,93,850,160,122,3,1,93,63,75],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_css_processor.clas.testclasses.abap"],"names":[],"mappings":";;;AAeA;;;;;;;;;;;;;;;;;;EACE;IACE,2BAAmB,6DAAwC;;EAI7D;EAEA;;;;;iLAI4B;EAC5B;AACF;;AAgBA;;;;;;;;;;;;;;;;;;;;;EACE;6IAEwC;kGACF;IACpC;uCACsB;;;;;;;IAGtB;EACF;EAEA;oGACwC;IACtC;uCACsB;sDACU;;;;;;IAEhC;EACF;EAEA;qFAC8B;kGACQ;IACpC;uCACsB;sDACU;;;;;;IAEhC;EACF;EAEA;QACQ,6DAAsB;IAE5B,qCACE,+DACA,uFACA,+EACA,oDACA,uCAAK;yGAE4B;8FAEH;wHAEsB;EACxD;EAEA;QACQ,6DAAuB;QACvB,8DAAuB;IAE7B,qCACE,gEACA,kFACA,0DACA,+DACA,uFACA,0FACA,oDACA,0CAAK;yGAE4B;IAEnC,sCACE,gEACA,kFACA,0DACA,+DACA,uFACA,+EACA,oDACA,0CAAK;8FAEyB;yHAEuB;EACzD;EAEA;QACQ,6DAAuB;QACvB,8DAAuB;IAE7B,qCACE,gEACA,oFACA,kFACA,qIACA,oGACA,0DACA,+DACA,uFACA,0FACA,oDACA,6CAAK;0GAE4B;IAEnC,sCACE,gEACA,oFACA,kFACA,qGACA,8FACA,0DACA,+DACA,uFACA,2FACA,oDACA,6CAAK;+FAE0B;yHAEsB;EACzD;EAEA;QACQ,6DAAuB;QACvB,8DAAuB;IAE7B,qCACE,gEACA,qEACA,+EACA,+EACA,qEACA,0DACA,+DACA,wDACA,2CAAK;4GAE4B;IAEnC,sCACE,gEACA,qEACA,qEACA,qEACA,qEACA,0DACA,+DACA,8CACA,2CAAK;iGAE4B;yHAEoB;EACzD;AACF;;AAWA;;;;;;;;;;;;;;;;EACE;QACQ,2DAAuB;QACvB,2DAAuB;QACvB,8DAAuB;IAE7B,mCACE,gEACA,+EACA,+CACA,mCAAG;IACL,sJAAgF;qGAE/C;4FACF;IAE/B,mCACE,gEACA,gDACA,kCAAG;IACL,sJAAgF;qGAE/C;4FACF;IAE/B,sCACE,gEACA,sEACA,qEACA,0DACA,gEACA,gDACA,sCAAG;IACL,yJAAmF;yHAG5B;EACzD;EAEA;QACQ,2DAAuB;QACvB,2DAAuB;QACvB,8DAAuB;IAE7B,mCACE,gEACA,qEACA,+EACA,+EACA,qEACA,0DACA,+DACA,wDACA,2CAAK;IACP,sJAAgF;qGAE/C;4FACF;IAE/B,mCACE,gEACA,gDACA,qCAAK;IACP,sJAAgF;qGAE/C;4FACF;IAE/B,sCACE,gEACA,qEACA,sEACA,sEACA,qEACA,0DACA,+DACA,qEACA,0DACA,yDACA,gEACA,gDACA,+CAAK;IACP,yJAAmF;yHAG5B;EACzD;AACF","file":"zcl_abapgit_gui_css_processor.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_event.clas.testclasses.mjs":{"lineLengths":[81,53,46,18,32,65,37,25,78,59,49,53,57,17,42,22,3,29,64,16,3,28,132,130,195,67,134,3,27,132,130,134,71,134,3,17,132,130,190,182,67,134,184,184,184,184,3,21,132,130,328,102,160,178,71,134,184,184,134,184,184,3,24,132,126,190,9,171,55,17,106,20,168,14,16,7,5,9,167,55,17,106,20,168,14,16,7,5,3,1,67,20,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap"],"names":[],"mappings":";;;AAgBA;;;;;;;;;;;;;;;;;;EAEE;QAEO,2HAAwC;QACxC,yHAAyC;;IAO9C,YAAS,iDAAgB;qIAGd;EAEb;EAEA;QAEO,2HAAwC;QACxC,yHAAyC;;IAM9C,YAAS,qDAAoB;qIAGlB;EAEb;EAEA;QAEO,2HAAwC;QACxC,yHAAyC;;qLAUnC;IAEX,YAAS,iDAAgB;qIAGd;uLAIE;uLAGA;uLAKA;uLAGA;EAEf;EAEA;QAEO,2HAAwC;QACxC,yHAAyC;QACzC,+TAAsD;IAE3D,gCAAO,oDAAa,WAAW;;iLASpB;IAEX,YAAS,qDAAoB;qIAGlB;uLAIE;uLAGA;qIAKF;uLAGE;uLAGA;EAEf;EAEA;QAEO,2HAAwC;QACxC,qHAAsC;;IAO3C;0KAGoB;sDACY;;;;;;;;IAKhC;IAEA;sKAGoB;sDACY;;;;;;;;IAKhC;EAEF;AAEF","file":"zcl_abapgit_gui_event.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_data.clas.testclasses.mjs":{"lineLengths":[79,89,53,50,0,0,17,32,68,37,25,88,70,70,71,17,42,22,3,29,64,16,3,38,68,220,179,3,38,68,201,161,3,38,68,220,164,3,38,68,218,162,3,1,69,19,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_data.clas.testclasses.abap"],"names":[],"mappings":";;;;;;AAaA;;;;;;;;;;;;;;;;;EAEE;QAEO,2DAAoB;IAEzB,cAAW,wMAE+B;kLAIkC;EAE9E;EAEA;QAEO,2DAAoB;IAEzB,cAAW,qLAEa;gKAIkC;EAE5D;EAEA;QAEO,2DAAoB;IAEzB,cAAW,wMAE+B;mKAImB;EAE/D;EAEA;QAEO,2DAAoB;IAEzB,cAAW,sMAE6B;iKAImB;EAE7D;AAEF","file":"zcl_abapgit_gui_page_data.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_page_patch.clas.testclasses.mjs":{"lineLengths":[89,91,53,51,0,27,32,79,37,25,80,65,70,72,17,42,22,3,29,64,16,3,30,72,73,214,147,122,3,33,72,73,207,140,122,3,38,72,73,130,9,180,55,17,106,24,168,14,16,7,5,3,39,72,73,130,9,199,55,17,106,24,168,14,16,7,5,3,1,90,35,32,87,37,216,944,79,74,74,74,963,71,70,75,17,42,22,119,867,3,29,64,16,3,29,33,45,48,3,42,866,119,61,45,44,3,42,866,119,61,45,44,3,42,866,119,61,45,44,3,39,149,3,38,166,3,42,166,3,32,866,76,40,3,1,106,58,72],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/pages/zcl_abapgit_gui_page_patch.clas.testclasses.abap"],"names":[],"mappings":";;;;;AA4CA;;;;;;;;;;;;;;;;;EAEE;QAEQ,+DAAyB;QACzB,gEAAyB;qNAOI;kJAIb;yHAIC;EAEzB;EAEA;QAEQ,+DAAyB;QACzB,gEAAyB;8MAOI;2IAIb;yHAIC;EAEzB;EAGA;QAEQ,+DAAyB;QACzB,gEAAyB;QACzB,yHAA+C;IAErD;mLAMuC;sDAEP;;;;;;;;IAMhC;EAEF;EAEA;QAEQ,+DAAyB;QACzB,gEAAyB;QACzB,yHAA+C;IAErD;sMAMuC;sDAEP;;;;;;;;IAMhC;EAEF;AAEF;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;gCAEoB;4CACY;+CACG;EAEnC;EAGA;QAEQ,y1BAAkD;IAExD,YAAY,MAAC,YAAS,wCAAyB,8BAAM,MAAC,OAAM;4DAE7B;4CACD;2CACD;EAE/B;EAGA;QAEQ,y1BAAkD;IAExD,YAAY,MAAC,YAAS,wCAAyB,8BAAM,MAAC,OAAM;4DAE7B;4CACD;2CACD;EAE/B;EAGA;QAEQ,y1BAAkD;IAExD,YAAY,MAAC,YAAS,wCAAyB,8BAAM,MAAC,OAAM;4DAE7B;4CACD;2CACD;EAE/B;EAGA;IAEE,oCAA4B,2GAAkE;EAEhG;EAGA;qKAIwC;EAExC;EAGA;qKAI4C;EAE5C;EAGA;;;IAEE,sBAAe,YAAY;EAE7B;AAEF","file":"zcl_abapgit_gui_page_patch.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_gui_utils.clas.testclasses.mjs":{"lineLengths":[81,53,46,22,32,69,65,25,22,17,42,22,3,29,64,16,3,45,123,19,3,1,75,19,32,66,68,25,22,17,42,22,3,29,64,16,3,55,363,134,64,22,3,1,69,22,32,69,37,25,75,61,17,42,22,3,29,64,16,3,25,146,155,104,110,182,180,3,28,146,155,104,110,186,182,3,1,75,53,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_gui_utils.clas.testclasses.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;EACE;;IACA;;AACF;;AAKA;;;;;;;;;;;;;;EACE;;;;IACA;;AACF;;AAeA;;;;;;;;;;;;;;;EAEE;QAEO,yIAAkC;QAClC,kJAAwC;;;qLAMoD;mLAEH;EAEhG;EAEA;QAEO,yIAAkC;QAClC,kJAAwC;;;yLAMuD;qLAEH;EAEnG;AAEF","file":"zcl_abapgit_gui_utils.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_hash.clas.testclasses.mjs":{"lineLengths":[71,53,41,17,32,59,37,25,69,48,58,59,17,42,22,3,29,64,16,3,19,51,135,127,3,16,105,226,159,3,26,105,70,77,88,159,3,26,105,70,54,88,159,3,1,60,19,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zcl_abapgit_hash.clas.testclasses.abap"],"names":[],"mappings":";;;AAeA;;;;;;;;;;;;;;;;;EAEE;QAEQ,0CAAqD;IAE3D,cAAW,mHAA+C;8HAItC;EAEtB;EAEA;QAEQ,gGAAiD;IAEvD,aAAU,+MAEkB;8JAIwB;EAEtD;EAGA;QAEQ,gGAAkD;QAClD,6DAAqB;IAE3B,aAAW,0DAAwB;IACnC,aAAU,qEAAsC;8JAII;EAEtD;EAEA;QAEQ,gGAAkD;QAClD,6DAAqB;IAG3B,aAAW,mCAAE;IACb,aAAU,qEAAsC;8JAII;EAEtD;AAEF","file":"zcl_abapgit_hash.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html.clas.testclasses.mjs":{"lineLengths":[71,53,41,27,32,69,65,25,22,17,42,22,3,29,64,16,3,45,123,127,19,3,1,80,26,32,68,65,25,22,17,42,22,3,29,64,16,3,45,123,107,19,3,1,78,17,32,59,37,222,66,58,46,46,51,51,51,51,51,50,50,17,42,22,124,3,29,64,16,3,17,84,3,19,66,103,111,104,333,134,3,19,66,103,134,104,356,134,3,19,66,103,153,104,375,134,3,19,66,103,110,104,332,134,3,18,66,123,122,108,110,100,107,784,134,3,14,105,153,581,3,14,105,153,581,3,19,252,437,3,16,100,154,302,201,1158,3,26,154,151,104,102,232,240,3,1,60,60,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_html.clas.testclasses.abap"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;;EACE;;IACE,aAAU,4GAAmC;IAC/C;;AACF;;AAMA;;;;;;;;;;;;;;EACE;;0GACyC;IACzC;;AACF;;AAyBA;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;QAEO,yDAAkB;sGAED;8GACO;uGACN;IAEvB,iCAAS,8DAAU,uCAAwB,8BAClC,wEAAmB,uCAAwB,QAC3C,4CAAO;qIAIA;EAElB;EAEA;QAEO,yDAAkB;sGAED;qIAC8B;uGAC7B;IAEvB,iCAAS,8DAAU,uCAAwB,8BAClC,+FAA0C,uCAAwB,QAClE,4CAAO;qIAIA;EAElB;EAEA;QAEO,yDAAkB;sGAED;wJACiD;uGAChD;IAEvB,iCAAS,8DAAU,uCAAwB,8BAClC,kHAA6D,uCAAwB,QACrF,4CAAO;qIAIA;EAElB;EAEA;QAEO,yDAAkB;sGAED;6GACM;uGACL;IAEvB,iCAAS,8DAAU,uCAAwB,8BAClC,uEAAkB,uCAAwB,QAC1C,4CAAO;qIAIA;EAElB;EAEA;QAEO,yDAAkB;0HAEkB;yHACD;2GACb;6GACC;mGACT;0GACO;IAE1B,iCAAS,kFAA6B,uCAAwB,8BACrD,mFAA8B,uCAAwB,8BACtD,sEAAiB,uCAAwB,8BACzC,yEAAoB,uCAAwB,8BAC5C,6DAAS,uCAAwB,QACjC,qDAAU;qIAIH;EAElB;EAEA;wGAEwB;wJAGE;okBAOX;EAEf;EAEA;wGAEwB;wJAGE;okBAOX;EAEf;EAEA;2PAI8D;obAO/C;EAEf;EAEA;mGAEgC;yJAGN;6SAMA;wMAIa;qoCAYf;EAExB;EAEA;QAEO,iJAAuC;QACvC,8IAAqC;;;uOAOzB;+OAIO;EAE1B;AAEF","file":"zcl_abapgit_html.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_action_utils.clas.testclasses.mjs":{"lineLengths":[97,53,54,0,30,32,85,37,391,158,471,375,185,73,67,383,173,264,61,68,70,65,70,71,69,64,63,71,17,42,22,84,82,395,80,3,29,64,16,3,29,54,3,36,178,178,178,3,36,104,47,193,3,38,565,47,199,215,188,220,191,196,3,33,109,47,88,200,3,38,471,41,88,201,206,3,39,65,65,65,71,83,83,83,85,698,47,230,204,155,272,224,198,3,33,69,67,46,3,41,155,3,35,139,3,39,64,64,67,61,68,64,234,69,39,204,247,251,3,44,64,64,305,3,29,54,3,36,64,66,52,123,69,59,16,3,37,119,47,88,123,47,88,178,3,32,329,105,110,63,83,155,93,68,98,136,88,178,213,176,88,178,243,3,31,154,41,88,192,185,216,3,38,69,133,56,41,88,247,3,1,99,308,312,78,78,78,49,32,75],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_html_action_utils.clas.testclasses.abap"],"names":[],"mappings":";;;;AAyDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;IAEE,+CAAwB,MAAC,oBAAgB,mGAAoD;IAC7F,+CAAwB,MAAC,oBAAgB,mGAAoD;IAC7F,+CAAwB,MAAC,oBAAgB,mGAAoD;EAE/F;EAEA;uGAEkD;8CAEhB;gMAIkB;EAEpD;EAEA;ojBAOqD;8CAEnB;sMAIwB;sNAIe;2LAInB;2NAImC;8LAIpC;mMAII;EAEzD;EAEA;4GAGkD;8CAEhB;uFACA;uMAKd;EAEpB;EAEA;sdAOqC;wCAET;uFACM;wMAKd;6MAKA;EAEpB;EAEA;QAEQ,wDAAuB;QACvB,wDAAuB;QACvB,wDAAuB;QACvB,8DAAuB;IAG7B,UAAQ,+CAAwB,MAAC,cAAa;IAC9C,UAAQ,+CAAwB,MAAC,cAAa;IAC9C,UAAQ,+CAAwB,MAAC,cAAa;IAE9C,sCAAc,4BAAS,MAAS,OAAK;yrBAOgB;8CAErB;qOAI+B;2MAIH;0JAIZ;+QAImE;+NAIvD;qMAIH;EAE3D;EAEA;;;IAEE,+BAAwB,SAAS;EAEnC;EAEA;IAEE,2BAAmB,0HAAoF;EAEzG;EAEA;IAEE,2BAAmB,0GAAoE;EAEzF;EAEA;;;;;;;IAEE,IAAe,mBAA+C;IAE9D;qCAAsE;2MAIf;sPAKK;0PAKE;EAEhE;EAEA;;;gTAK8E;EAE9E;EAEA;;;;;;;QAEO,kHAAsC;IAE3C,aAAU,kDAA6B;0DACyB;IAElE;;EAEA;sHAEiE;8CAC/B;uFACA;0HAEmC;8CACnC;uFACA;iLAId;EAEpB;EAEA;QAEO,gUAAuD;QACvD,gGAAiC;QACjC,qGAAsC;QACtC,sDAAc;IAEnB,4EAAuD;IACvD,iBAAe,qBACb,KAAM,sCACN,KAAc,qBAAR,QAAU,kCAAG;IACrB,kCAAU,wCAAU,aAAY;IAEhC,gCAAO,iBAAW,YAAY;IAC9B,gCAAO,+CAAQ,YAAY;IAE3B,2BAAmB,uGAAmE;uFACtD;iLAId;oNAIA;IAElB,2BAAmB,+IAEW;uFACE;iLAId;kPAIA;EAEpB;EAGA;yJAEoG;wCACxE;uFACM;+LAKH;wLAKP;uNAK0B;EAElD;EAEA;QAEO,4DAAqB;IAG1B,cAAY,iHAAmF;uDAElE;wCACH;uFACM;sPAKuD;EAEzF;AAEF","file":"zcl_abapgit_html_action_utils.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_form_utils.clas.testclasses.mjs":{"lineLengths":[93,53,52,24,32,77,57,278,181,337,175,230,204,17,42,22,181,105,122,60,3,29,64,16,3,53,622,66,58,77,91,111,94,116,82,105,76,21,3,53,2173,71,73,74,82,21,3,55,81,103,67,58,102,64,3,49,75,27,3,53,63,72,76,20,3,52,98,49,70,54,85,54,85,129,105,88,109,54,85,128,105,88,109,106,91,129,113,112,129,70,42,84,58,92,58,12,55,5,21,3,59,1040,82,102,64,3,65,363,86,100,31,3,61,123,58,62,64,93,52,79,105,71,85,121,69,79,118,69,79,117,67,73,113,111,94,118,114,103,123,78,91,167,59,100,119,757,103,290,97,123,58,3,57,75,21,3,59,100,309,91,117,112,130,24,3,35,107,62,26,3,34,104,88,48,3,60,568,72,76,64,64,58,94,124,23,3,60,568,23,3,50,1034,66,58,18,3,58,69,69,67,21,3,61,108,28,3,1,85,269,60,62,106,79,113,22,32,75,37,265,67,53,53,53,53,52,54,62,62,17,42,22,167,3,29,64,16,3,17,124,95,3,21,140,129,136,130,72,78,313,95,76,134,206,131,76,134,206,134,76,134,3,21,140,129,136,130,72,78,226,95,133,76,134,211,146,76,134,210,135,76,134,3,21,140,129,136,130,72,78,231,95,138,76,134,206,133,76,134,209,134,76,134,210,134,76,134,3,21,140,129,136,141,141,72,123,83,1346,95,135,135,129,131,131,136,221,132,132,129,130,140,140,136,131,135,135,138,226,137,137,134,135,88,144,3,20,140,129,136,72,78,910,95,157,135,158,78,130,158,78,132,158,78,130,157,78,221,129,129,129,134,158,3,22,140,129,136,136,72,78,78,140,95,133,62,133,202,158,3,30,140,129,136,136,72,78,78,140,95,78,62,133,171,202,157,3,29,140,129,136,136,72,78,78,140,95,78,62,133,170,194,157,3,1,81,42,73],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_html_form_utils.clas.testclasses.abap"],"names":[],"mappings":";;;AAmCA;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;IACA;;EAEA;;;;;;IACA;;EAEA;;;;;;;EACA;EAEA;;IACA;;EAEA;;;;IACA;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;IAEE,cAAS,MAAC,sBAAmB,sBAAS;IAEtC,IACE,OAEA,KAHG,qBAAL;;MAEI,cAAY,oCAAG;;MAEf,cAAY,oCAAG;;sDAEa;;IAGlC;;EAEA;;;;;EACA;EAEA;;;;IACA;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACA;EAEA;;IACA;;EAEA;;;;;;;IACA;;EAEA;;IACE,mBAAiB,cAAS,MAAC,iBAAgB;IAC7C;;EAEA;;;IACE,0BAAmB,gBAAgB;EACrC;EAEA;;;;;;;;;IACA;;EAEA;;IACA;;EAEA;;;;IACA;;EAEA;;;;IACA;;EAEA;;IACA;;AAEF;;;;;;;;AAwBA;;;;;;;;;;;;;;;;;;;;;;;EAEE;;8FAGuD;EAEvD;EAEA;QAEO,mIAA8C;QAC9C,wHAAyC;QACzC,+HAA+C;QAC/C,yHAAyC;IAE9C,aAAe,qDAAgC;IAC/C,kBAAe,sDAAiC;wTAQnB;IAE7B,YAAS,6EAA8C;IAEvD,YAAS,0DAAgC;qIAI9B;6MAGiB;kIAIb;IAEf,YAAS,0DAAgC;qIAI9B;6MAGiB;qIAIV;IAElB,YAAS,0DAAgC;qIAI9B;EAEb;EAEA;QAEO,mIAA8C;QAC9C,wHAAyC;QACzC,+HAA+C;QAC/C,yHAAyC;IAG9C,aAAU,qDAAgC;IAC1C,kBAAe,sDAAiC;iOAMnB;IAE7B,YAAS,6EAA8C;oIAItC;IAEjB,YAAS,0DAAgC;qIAI9B;kNAGsB;iJAIJ;IAE7B,YAAS,0DAAgC;qIAI9B;iNAGqB;sIAIb;IAEnB,YAAS,0DAAgC;qIAI9B;EAEb;EAEA;QAEO,mIAA8C;QAC9C,wHAAyC;QACzC,+HAA+C;QAC/C,yHAAyC;IAG9C,aAAU,qDAAgC;IAC1C,kBAAe,sDAAiC;sOAMnB;IAE7B,YAAS,6EAA8C;yIAIjC;IAEtB,YAAS,0DAAgC;qIAI9B;6MAGiB;oIAIX;IAEjB,YAAS,0DAAgC;qIAI9B;gNAGoB;qIAIb;IAElB,YAAS,0DAAgC;qIAI9B;iNAGqB;qIAId;IAElB,YAAS,0DAAgC;qIAI9B;EAEb;EAEA;QAEO,mIAA8C;QAC9C,wHAAyC;QACzC,+HAA+C;QAC/C,oIAAoD;QACpD,oIAAoD;IAEzD,aAAoB,qDAAgC;IACpD,kBAAoB,mGAAiE;IACrF,uBAAoB,sDAAiC;i0CA4BtB;IAE/B,YAAS,6EAA8C;sIAIpC;sIAGA;gIAIJ;kIAGE;kIAGA;uIAIK;4NAKN;mIAGE;mIAGA;gIAGH;iIAGC;2IAIG;2IAGA;uIAGJ;kIAGC;sIAGA;sIAGA;yIAIG;iOAIH;wIAGE;wIAGA;qIAGH;sIAGC;IAEhB,uBAAoB,2DAAiC;+IAId;EAEzC;EAEA;QAEO,mIAA8C;QAC9C,wHAAyC;QACzC,+HAA+C;IAEpD,aAAe,qDAAgC;IAC/C,kBAAe,sDAAiC;64BAkBjB;IAE/B,YAAS,6EAA8C;4JAIpC;sIAIA;6JAIC;IAEpB,kBAAe,sDAAiC;iIAGhC;6JAII;IAEpB,kBAAe,sDAAiC;mIAG9B;6JAIE;IAEpB,kBAAe,sDAAiC;iIAGhC;4JAIG;IAEnB,kBAAe,sDAAiC;4NAGhC;gIAGD;gIAGA;gIAGA;qIAGK;6JAIA;EAEtB;EAEA;QAEO,mIAA8C;QAC9C,wHAAyC;QACzC,+HAA+C;QAC/C,+HAA+C;IAEpD,aAAe,qDAAgC;IAC/C,kBAAe,sDAAiC;IAChD,kBAAe,sDAAiC;2IAIrB;IAE3B,YAAS,6EAA8C;oIAKrC;6DAEc;oIAId;yMAI0C;6JAIxC;EAEtB;EAEA;QAEO,mIAA8C;QAC9C,wHAAyC;QACzC,+HAA+C;QAC/C,+HAA+C;IAEpD,aAAe,qDAAgC;IAC/C,kBAAe,sDAAiC;IAChD,kBAAe,sDAAiC;2IAIrB;IAE3B,YAAS,6EAA8C;IAGvD,kBAAe,sDAAiC;6DAEhB;oIAId;0KAE4D;yMAIlB;4JAIzC;EAErB;EAEA;QAEO,mIAA8C;QAC9C,wHAAyC;QACzC,+HAA+C;QAC/C,+HAA+C;IAEpD,aAAe,qDAAgC;IAC/C,kBAAe,sDAAiC;IAChD,kBAAe,sDAAiC;2IAIrB;IAE3B,YAAS,6EAA8C;IAGvD,kBAAe,sDAAiC;6DAEhB;oIAId;yKAE2D;iMAIzB;4JAIjC;EAErB;AACF","file":"zcl_abapgit_html_form_utils.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_parts.clas.testclasses.mjs":{"lineLengths":[83,53,47,29,32,77,37,25,67,17,42,22,3,29,64,16,3,16,120,120,120,127,132,264,339,80,80,80,86,110,110,110,206,206,206,97,97,131,112,146,83,26,95,83,26,95,112,146,83,26,95,112,82,33,115,3,1,90,31,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/core/zcl_abapgit_html_parts.clas.testclasses.abap"],"names":[],"mappings":";;;AAcA;;;;;;;;;;;;;;EAEE;QAEO,+GAAqC;QACrC,+GAAqC;QACrC,+GAAqC;QACrC,sHAAwC;QACxC,2HAA2C;QAC3C,+PAA4B;QAC5B,0UAA+C;;;;;6GAS9B;6GAGA;6GAGA;6MAIX;6MAGA;6MAGA;IAEX,gCAAO,gDAAS,UAAU;IAC1B,gCAAO,gDAAS,UAAU;kIAIN;IAEpB,kBAAe,wFAA4B;iJAGhC;IACX;wBAAgD;8FAG9B;IAClB;wBAAgD;8FAG9B;IAElB,kBAAe,wFAA4B;iJAGhC;IACX;wBAAgD;8FAG9B;IAElB,kBAAe,wFAA4B;iFACQ;gCAEjC;kHACsD;EAE1E;AAEF","file":"zcl_abapgit_html_parts.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_html_table.clas.testclasses.mjs":{"lineLengths":[89,83,53,47,30,32,78,61,25,76,17,42,22,3,29,64,16,3,53,208,68,76,45,55,107,20,3,51,428,68,76,45,55,72,76,47,61,75,81,75,173,14,74,7,12,103,5,21,3,25,130,645,71,127,489,523,51,70,61,62,51,70,61,62,223,83,2268,138,3,1,92,482,32,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/lib/zcl_abapgit_html_table.clas.testclasses.abap"],"names":[],"mappings":";;;;AAkBA;;;;;;;;;;;;;;EACE;;;;;;IACE,QAAQ,MAAC,uFAA+B;IAC1C;;EAEA;;;;;;;;;;IACE,SAAS,MAAC,eAAY,uCAAM;IAC5B,iBAAgB,GAAb,cAAe,wCAAM;MACtB,iBAAgB,GAAb,cAAe,gCAAC;QACjB,SAAS,MAAC,WAAO,yIAA2C;MAC9D;QACE,SAAS,MAAC,aAAU,oCAAG;MACzB;IACF;MACE,SAAS,MAAC,gFAAwB;IACpC;IACF;;EAEA;QAEO,yHAAyC;QACzC,4nBAA0C;QAC1C,8DAAuB;QACvB,sHAAwC;IAC7C,IAAc,QAAiC;IAE/C,YAAS,yfAQmB;;IAG5B,QAAM,MAAC,UAAO,wCAAO;IACrB,QAAM,MAAC,UAAO,+BAAC;IACf,QAAM,MAAC,UAAO,gCAAE;;IAEhB,QAAM,MAAC,UAAO,wCAAO;IACrB,QAAM,MAAC,UAAO,+BAAC;IACf,QAAM,MAAC,UAAO,gCAAE;IAEhB,iBAAc,wMAG6B;;2tEA2B7B;yIAIkB;EAElC;AAEF","file":"zcl_abapgit_html_table.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_i18n_params.clas.testclasses.mjs":{"lineLengths":[85,53,48,0,29,32,78,37,25,86,60,65,17,42,22,3,29,64,16,3,36,313,566,566,339,95,95,66,69,65,63,65,63,117,88,3,28,314,314,313,130,95,95,91,91,91,91,91,157,63,88,34,34,37,91,91,91,91,157,63,88,3,32,224,405,405,313,130,95,95,63,59,63,59,63,59,63,59,63,59,157,126,88,37,95,157,171,88,34,34,37,63,59,63,59,63,59,63,59,157,126,88,3,1,91,31,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_i18n_params.clas.testclasses.abap"],"names":[],"mappings":";;;;AAeA;;;;;;;;;;;;;;;;EAEE;QAEO,gTAAoD;QACpD,6iBAA8D;QAC9D,6iBAA8D;QAC9D,0UAA4B;IAEjC,gCAAO,+CAAQ,SAAS;IACxB,gCAAO,+CAAQ,SAAS;IAExB,QAAQ,MAAC,UAAS,oCAAG;IACrB,QAAQ,MAAC,YAAS,qCAAI;IACtB,QAAQ,MAAC,SAAS,oCAAG;IACrB,gCAAO,kBAAY,MAAM;IACzB,QAAQ,MAAC,SAAS,oCAAG;IACrB,gCAAO,kBAAY,MAAM;IAEzB,YAAS,mGAA8D;uFAIvD;EAElB;EAEA;QAEO,iTAAqD;QACrD,iTAAqD;QACrD,gTAAoD;QACpD,yHAAwC;IAE7C,gCAAO,+CAAQ,SAAS;IACxB,gCAAO,+CAAQ,SAAS;IAExB,gCAAO,8CAAO,MAAM;IACpB,gCAAO,8CAAO,MAAM;IACpB,gCAAO,8CAAO,MAAM;IAEpB,gCAAO,8CAAO,MAAM;IACpB,gCAAO,8CAAO,MAAM;IAEpB,UAAO,6IAE6B;8DACqB;uFAIzC;IAGhB,sBAAO,MAAM;IAAb,sBAAe,MAAM;IAArB,sBAAuB,SAAS;IAChC,gCAAO,8CAAO,MAAM;IACpB,gCAAO,8CAAO,MAAM;IAEpB,gCAAO,8CAAO,MAAM;IACpB,gCAAO,8CAAO,MAAM;IAEpB,UAAO,6IAE6B;8DACqB;uFAIzC;EAElB;EAEA;QAGa,uNAAI;QAKV,4YAAyB;QACzB,4YAAyB;QACzB,gTAAoD;QACpD,yHAAwC;IAE7C,gCAAO,+CAAQ,SAAS;IACxB,gCAAO,+CAAQ,SAAS;IAExB,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IACrB,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IACrB,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IAErB,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IACrB,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IAErB,UAAO,6IAE6B;6HAKf;uFAIL;IAGhB,sBAAM,SAAS;IACf,gCAAO,+CAAQ,SAAS;IAExB,UAAO,6IAE6B;0KAMf;uFAIL;IAGhB,sBAAO,MAAM;IAAb,sBAAe,MAAM;IAArB,sBAAuB,SAAS;IAChC,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IACrB,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IAErB,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IACrB,IAAI,MAAC,WAAQ,oCAAG;IAChB,gCAAO,cAAQ,MAAM;IAErB,UAAO,6IAE6B;6HAKf;uFAIL;EAElB;AAEF","file":"zcl_abapgit_i18n_params.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_injector.clas.testclasses.mjs":{"lineLengths":[79,53,45,31,32,77,56,25,22,17,42,22,3,29,64,16,3,53,55,51,64,114,52,67,55,73,23,3,39,813,54,70,114,103,124,114,103,124,132,58,120,58,20,3,46,595,51,64,114,52,67,55,73,20,3,1,92,36,32,82,37,25,75,17,42,22,3,29,64,16,3,24,126,130,74,140,171,3,1,102,37,32,83,37,25,67,61,17,42,22,3,29,64,16,3,17,172,118,84,3,28,126,130,74,140,210,3,1,104,94,66],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/zcl_abapgit_injector.clas.testclasses.abap"],"names":[],"mappings":";;;AA4BA;;;;;;;;;;;;;;EAEE;;;;;;;;;IAEA;;EAEA;;;;;;;;;;;;;;IAEA;;EAEA;;;;;;;;;IAEA;;AAEF;;AAEA;;;;;;;;;;;;;;EAEE;QAEQ,qHAA4C;QAC5C,yHAA6C;IAEnD,cAAW,sDAAiC;+BAE5C,iBAAkB,0FAAsD;0KAIjC;EAEzC;AAEF;;AAEA;;;;;;;;;;;;;;;EAEE;QAEQ,mKAAkD;;mFAIR;EAElD;EAEA;QAEQ,qHAA4C;QAC5C,yHAA6C;IAEnD,cAAW,sDAAiC;+BAE5C,iBAAkB,0FAAsD;iNAIjC;EAEzC;AAEF","file":"zcl_abapgit_injector.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_item_graph.clas.testclasses.mjs":{"lineLengths":[83,53,47,17,32,65,37,25,68,17,42,22,3,29,64,16,3,17,132,120,816,598,598,597,77,73,73,65,73,73,65,106,72,135,67,121,135,67,121,136,3,1,66,19,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_item_graph.clas.testclasses.abap"],"names":[],"mappings":";;;AAQA;;;;;;;;;;;;;;EAEE;QAEO,2HAA2C;QAC3C,+GAAoC;QACpC,uyBAAkD;QAClD,6kBAA8B;QAC9B,6kBAA8B;QAC9B,4kBAA6B;;IAIlC,QAAQ,MAAC,cAAW,uCAAM;IAC1B,QAAQ,MAAC,cAAW,uCAAM;IAC1B,gCAAO,kBAAY,QAAQ;IAE3B,QAAQ,MAAC,cAAW,uCAAM;IAC1B,QAAQ,MAAC,cAAW,uCAAM;IAC1B,gCAAO,kBAAY,QAAQ;;uEAML;sIAIH;IAEnB,aAAU,gDAA4B;wHAGX;sIAIR;IAEnB,aAAU,gDAA4B;wHAGX;uIAIP;EAEtB;AAEF","file":"zcl_abapgit_item_graph.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_item_state.clas.testclasses.mjs":{"lineLengths":[83,53,47,23,32,71,37,25,82,64,17,42,22,3,29,64,16,3,32,1055,130,84,191,192,135,133,114,116,71,187,190,135,134,114,116,71,187,190,135,134,118,114,71,187,188,135,134,118,114,55,71,187,188,134,134,118,114,56,71,187,188,134,134,3,31,2075,130,84,191,192,135,133,114,116,67,187,190,135,134,114,116,67,187,190,135,134,118,114,67,187,188,135,134,118,114,55,67,187,188,134,134,118,114,56,67,187,188,134,134,3,1,78,25,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_item_state.clas.testclasses.abap"],"names":[],"mappings":";;;AASA;;;;;;;;;;;;;;;EACE;QAEO,shCAA+C;QAC/C,yHAAyC;;8LAMM;+LAGA;sIAGhC;oIAGD;IAEnB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;IACvD,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;sEAClB;0LAIS;6LAGE;sIAG9B;qIAGA;IAGpB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;IACvD,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;sEAClB;0LAIS;6LAGE;sIAG9B;qIAGA;IAEpB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,UAAS;IAC3D,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;sEAChB;0LAIS;2LAGA;sIAG5B;qIAGA;IAEpB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,UAAS;IAC3D,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;IACvD,OAAO,MAAC,cAAW,sBAAS;sEACW;0LAIS;2LAGA;qIAG7B;qIAGC;IAEpB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,UAAS;IAC3D,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;IACvD,OAAO,MAAC,cAAW,uBAAU;sEACU;0LAIS;2LAGA;qIAG7B;qIAGC;EAEtB;EAEA;QAEO,khEAAkD;QAClD,yHAAyC;;8LAMM;+LAGA;sIAGhC;oIAGD;IAEnB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;IACvD,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;kEACpB;0LAIW;6LAGE;sIAG9B;qIAGA;IAGpB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;IACvD,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,QAAO;kEACpB;0LAIW;6LAGE;sIAG9B;qIAGA;IAEpB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,UAAS;IAC3D,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;kEAClB;0LAIW;2LAGA;sIAG5B;qIAGA;IAEpB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,UAAS;IAC3D,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;IACvD,OAAO,MAAC,cAAW,sBAAS;kEACS;0LAIW;2LAGA;qIAG7B;qIAGC;IAEpB,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,UAAS;IAC3D,OAAO,MAAC,YAAS,wCAAyB,+BAAO,MAAC,MAAK;IACvD,OAAO,MAAC,cAAW,uBAAU;kEACQ;0LAIW;2LAGA;qIAG7B;qIAGC;EAEtB;AACF","file":"zcl_abapgit_item_state.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_log.clas.testclasses.mjs":{"lineLengths":[69,53,40,17,32,58,37,219,67,50,54,57,54,64,49,49,48,17,42,22,121,3,29,64,16,3,17,82,3,17,156,167,3,15,70,648,437,61,70,156,166,78,82,25,61,107,3,22,126,110,195,107,200,104,198,52,195,126,74,198,3,22,130,648,87,110,112,83,156,78,137,103,27,76,61,134,100,27,73,61,3,32,130,648,87,110,112,170,156,78,137,103,27,76,61,172,156,78,137,103,27,76,61,134,100,27,73,61,3,18,126,648,90,156,9,110,17,106,20,94,14,16,7,5,79,156,78,131,97,27,70,61,136,102,27,75,61,3,25,126,204,110,203,107,206,104,204,126,74,204,3,17,122,100,109,68,100,118,153,167,3,1,59,19,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_log.clas.testclasses.abap"],"names":[],"mappings":";;;AAoBA;;;;;;;;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;2JAIa;sKAII;EAEjB;EAEA;QAEO,6DAAsB;QACtB,+nBAA6C;QAC7C,4aAAmC;IAExC,eAAa,wCAAO;qEAEK;2JAId;qKAIE;IAEb,iBAAc,uDAAuB;IACrC;uBAA8C;4DACV;0GAIhB;EAEtB;EAEA;QAEO,qHAAsC;6GAEX;kMAIM;0GAET;uMAIc;uGAEjB;qMAIe;mDAEzB;kMAIsB;;yEAGT;qMAIY;EAE3C;EAEA;QAEO,yHAA4B;QAC5B,+nBAA6C;;6GAIlB;+GACO;kFACD;2JAI3B;IAEX,iBAAc,uDAAuB;IAErC;;;0EAAuE;4DACnC;IACpC;;;uEAAoE;4DAChC;EAEtC;EAEA;QAEO,yHAA4B;QAC5B,+nBAA6C;;6GAIlB;+GACO;yKAGc;2JAI1C;IAEX,iBAAc,uDAAuB;IAErC;;;0EAAuE;4DACnC;2KAKmB;2JAI5C;IAEX,iBAAc,uDAAuB;IAErC;;;0EAAuE;4DACnC;IACpC;;;uEAAoE;4DAChC;EAEtC;EAEA;QAEO,qHAAsC;QACtC,+nBAA6C;IAGlD,iBAAS,mEAAuC;2JAGrC;IAGX;6GAC4C;;;;;;;;IAG5C;8EAE2C;2JAGhC;IAEX,iBAAc,uDAAuB;IAErC;;;oEAAiE;4DAC7B;IACpC;;;yEAAsE;4DAClC;EAEtC;EAEA;QAEO,qHAAsC;2MAIC;6GAEZ;0MAIW;0GAEd;6MAIiB;uGAEpB;2MAIkB;;yEAGf;2MAIe;EAE9C;EAEA;QAEO,iHAAoC;mGAEnB;4GACO;IAE7B,cAAW,gDAAgB;mGAEL;qHACe;wJAI1B;sKAIO;EAEpB;AAEF","file":"zcl_abapgit_log.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_login_manager.clas.testclasses.mjs":{"lineLengths":[89,53,50,26,32,77,37,168,148,67,52,52,48,56,17,42,22,52,52,3,29,64,16,3,17,60,3,20,60,3,16,66,46,67,26,102,154,3,20,67,245,149,3,23,70,61,70,59,68,68,166,95,95,92,3,1,87,81,45,81,48,28,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_login_manager.clas.testclasses.abap"],"names":[],"mappings":";;;AAeA;;;;;;;;;;;;;;;;;;;;;EAEE;2DACqC;EACrC;EAEA;2DACqC;EACrC;EAEA;QAEY,yDAAsD,CAAA;;QACtD,0DAAkC,CAAA;;qGAId;yJAIb;EAEnB;EAEA;QAEO,0DAAmB;IAExB,aAAU,kOAGkB;oJAIc;EAE5C;EAEA;QAEa,6DAAqE,CAAA;;QACrE,6DAAmE,CAAA;;QAExE,2DAAoB;QACpB,2DAAoB;qKAME;IAE5B,cAAW,2EAA6C;IACxD,cAAW,2EAA6C;2FAItC;EAEpB;AAEF","file":"zcl_abapgit_login_manager.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_longtexts.clas.testclasses.mjs":{"lineLengths":[81,53,46,0,22,32,69,37,227,67,56,17,42,22,129,3,29,64,16,3,17,88,3,23,50,169,122,178,133,169,149,178,151,3,1,75,24,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap"],"names":[],"mappings":";;;;AAcA;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;QAEO,yCAAwB;IAG7B,YAAS,uJAEmB;yHAIX;IAEjB,YAAS,gKAE2B;oIAIT;IAG3B,YAAS,uJAEmB;oJAIe;IAE3C,YAAS,gKAE2B;sJAIS;EAE/C;AAEF","file":"zcl_abapgit_longtexts.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_lxe_texts.clas.testclasses.mjs":{"lineLengths":[81,53,46,0,22,32,69,37,25,90,64,65,17,42,22,3,29,64,16,3,40,316,316,324,324,319,319,164,161,162,154,204,116,106,3,32,310,310,9,215,94,94,90,17,106,57,14,16,7,5,9,215,90,17,106,57,14,16,7,5,9,204,36,93,90,17,106,57,14,16,7,5,3,32,312,66,66,9,96,96,119,59,90,17,106,57,14,16,7,5,9,38,95,119,55,90,17,106,57,14,16,7,5,3,1,75,24,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_lxe_texts.clas.testclasses.abap"],"names":[],"mappings":";;;;AAYA;;;;;;;;;;;;;;;;EAEE;QAEO,mTAAuD;QACvD,mTAAuD;QACvD,2TAA+D;QAC/D,2TAA+D;QAC/D,sTAA0D;QAC1D,sTAA0D;IAE/D,kBAAuB,4IAA0E;IACjG,kBAAuB,yIAAuE;IAC9F,0BAAuB,kIAAiE;IACxF,qBAAuB,+HAA8D;2MAQ9C;mHAIT;yGAIL;EAE3B;EAEA;QAEO,6SAAiD;QACjD,6SAAiD;IAEtD;MACI,YAAS,mMAE+B;MAExC,gCAAO,+CAAQ,MAAM;MACrB,gCAAO,+CAAQ,MAAM;yFAIL;;;;;;;IAGpB;IAEA;MACI,YAAS,mMAE+B;yFAIxB;;;;;;;IAGpB;IAEA;MACI,YAAS,wLAE+B;MAExC,sBAAM,MAAM;MACZ,gCAAO,8CAAO,MAAM;yFAIJ;;;;;;;IAGpB;EAEF;EAEA;QAEO,+SAAmD;QACnD,yDAAkB;QAClB,yDAAkB;IAEvB;MACI,gCAAO,+CAAQ,QAAQ;MACvB,gCAAO,+CAAQ,QAAQ;MAEvB,YAAS,mGAA+D;MACxE,WAAS,wCAAO;yFAIA;;;;;;;IAGpB;IAEA;MACI,sBAAM,QAAQ;MACd,gCAAO,8CAAO,QAAQ;MAEtB,YAAS,mGAA+D;MACxE,WAAS,oCAAG;yFAII;;;;;;;IAGpB;EAEF;AAEF","file":"zcl_abapgit_lxe_texts.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_news.clas.testclasses.mjs":{"lineLengths":[71,53,41,25,32,67,37,362,170,17,42,22,264,3,29,64,16,3,20,66,58,69,3,1,76,23,32,65,37,862,170,17,42,22,764,3,29,64,16,3,20,66,58,548,77,204,68,70,73,65,51,74,3,1,72,0,0,17,32,59,37,25,72,50,17,42,22,3,29,64,16,3,22,548,186,76,180,76,186,76,34,199,137,120,130,34,199,137,120,131,34,184,131,121,130,124,132,34,198,131,121,130,123,146,3,17,759,158,153,110,89,89,85,101,102,102,109,116,85,102,102,127,102,107,123,130,137,123,148,176,194,107,122,129,136,176,194,107,122,129,136,122,147,122,176,194,3,1,60,55,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_news.clas.testclasses.abap"],"names":[],"mappings":";;;AAWA;;;;;;;;;;;;;;;EACE;;;IACE,gCAAO,gBAAU,cAAS;EAC5B;AACF;;AAUA;;;;;;;;;;;;;;;EACE;;;QACO,2hBAAkC;QAClC,oEAA6B;IAElC;IAOA,yBAAS,MAAM,MAAC,QAAO;IACvB,yBAAS,MAAM,MAAC,UAAS;IACzB,yBAAS,MAAM,MAAC,aAAY;IAC5B,yBAAS,MAAM,MAAC,KAAI;IACpB,MAAM,MAAC,gBAAa,iBAAiB;IAErC,gCAAO,gBAAU,mBAAc;EACjC;AACF;;;;AA2BA;;;;;;;;;;;;;;;EAEE;QAEQ,2hBAAoC;IAE1C,YAAS,wKAEyB;2EACW;IAE7C,YAAS,kKAEyB;2EACW;IAE7C,YAAS,wKAEyB;2EACW;IAE7C,sBAAM,MAAM;IACZ,YAAS,qLAEyB;wIAEkB;uHAEC;iIAER;IAE7C,sBAAM,MAAM;IACZ,YAAS,qLAEyB;wIAEkB;uHAEC;kIAEP;IAE9C,sBAAM,MAAM;IACZ,YAAS,sKAEyB;kIAEY;wHAEQ;iIAET;2HAES;mIAEJ;IAElD,sBAAM,MAAM;IACZ,YAAS,oLAEyB;kIAEY;wHAEQ;iIAET;0HAEQ;iJAEU;EAEjE;EAEA;QAEO,8uBAAyC;QACzC,qJAA6C;QAC7C,gJAA0C;;wFAIf;wFACA;oFACA;oGACW;qGACC;qGACA;4GACO;mHACO;oFAC1B;qGACY;qGACA;8HACyB;qGACzB;;0HAMqB;iIACO;wIACO;0HACd;mJACyB;IAE1F,gBAAa,0JAEqB;iMAIQ;;yHAMsB;gIACO;uIACO;IAE9E,gBAAa,0JAEqB;iMAIQ;;yHAKsB;gIACO;uIACO;yHACd;kJACyB;yHACzB;IAEhE,gBAAa,0JAEqB;iMAIQ;EAE5C;AAEF","file":"zcl_abapgit_news.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_files.clas.testclasses.mjs":{"lineLengths":[89,53,50,26,32,77,37,235,67,260,165,474,53,52,60,60,64,60,17,42,22,137,3,29,64,16,3,17,889,597,541,50,87,128,50,86,61,50,93,50,93,50,96,72,71,110,60,3,33,71,51,76,74,192,115,21,3,24,71,73,1170,114,21,3,36,368,110,111,21,3,21,152,3,20,347,47,45,46,46,48,347,308,132,90,81,53,136,116,178,3,28,597,166,72,77,110,174,3,28,597,69,72,87,110,105,142,3,32,143,3,27,355,130,67,147,72,26,50,72,164,79,164,7,5,182,3,1,87,28,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_objects_files.clas.testclasses.abap"],"names":[],"mappings":";;;AAoCA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,g3BAAsD;QACtD,4kBAA8C;IACnD,IAAe,YAAgC;;IAI/C,YAAU,MAAC,cAAW,iDAAe;IACrC,YAAU,MAAC,WAAO,6FAAmD;;IAErE,YAAU,MAAC,cAAW,gDAAc;IACpC,YAAU,MAAC,WAAO,0BAAe;;IAEjC,YAAU,MAAC,cAAW,uDAAqB;;IAE3C,YAAU,MAAC,cAAW,uDAAqB;;IAE3C,YAAU,MAAC,cAAW,0DAAwB;IAG9C,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,sCAAK;;2DAIK;EAE/B;EAEA;;;;QACQ,iEAA0B;IAEhC,sCAAY,sDAAmB,eAAc,gEAAyB,cAAc;IACpF,eAAY,8FAA6D;IAE3E;;EAEA;;QACQ,gEAAyB;IAE/B,wCAAgB,iGACd,8IACE,0HACE,uEACE,mEACE,2EACA,yEACA,2EACA,2EACA,+EACF,qEACF,wEACF,gDACF,2DAAY;IAEd,eAAY,6FAA4D;IAE1E;;EAEA;;IAEE,gCAAO,8DAAsB,SAAS;IACtC,gCAAO,+DAAuB,SAAS;IAEzC;;EAEA;uJAGgC;EAEhC;EAEA;QACiB,kVAAoB;;;;;;QAO7B,kVAA8C;QAC9C,2SAA8D;QAC9D,2HAAsD;IAE5D,eAAe,MAAC,YAAS,mDAAiB;IAC1C,eAAe,MAAC,aAAU,yCAAQ;IAElC,YAAS,mCAAmB;uIACyD;mHAGvD;iLAEgB;EAEhD;EAEA;QAEO,4kBAA6C;qKAKb;IAGrC,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,4CAAW;;6KASO;EAEvC;EAEA;QAEO,4kBAA6C;QAC7C,4DAAoB;IAGzB,OAAO,MAAC,cAAW,uCAAM;IACzB,OAAO,MAAC,cAAW,sDAAoB;;wGAOJ;6IAIE;EAEvC;EAEA;8IAKuC;EAEvC;EAEA;QAEO,0VAAqD;QACrD,yHAA+B;IAEpC,mBAAgB,0CAA0B;kJAI/B;;;MAGT,IACE,OAIA,KALG,eAAE,MAAC,MAAR;;mKAIkB;;mKAIA;;IAEpB;qLAIW;EAEb;AAEF","file":"zcl_abapgit_objects_files.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_objects_program.clas.testclasses.mjs":{"lineLengths":[89,93,53,52,0,17,32,70,37,25,89,72,17,42,22,3,29,64,16,3,39,140,597,370,369,369,167,131,139,144,167,117,166,130,166,116,72,158,32,74,97,72,158,32,74,96,39,167,108,131,139,144,167,117,72,158,32,74,97,3,39,140,597,370,369,369,132,107,107,107,107,107,106,106,106,106,106,72,158,32,74,96,3,1,71,19,73],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_objects_program.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAYA;;;;;;;;;;;;;;;EACE;QAEO,mIAA8C;QAC9C,4kBAA6C;QAC7C,yWAA+B;QAC/B,wWAA8B;QAC9B,wWAA8B;IAGnC,gCAAO,qHAA6E,WAAW;IAC/F,gCAAO,iFAAyC,WAAW;IAC3D,gCAAO,yFAAiD,WAAW;IACnE,gCAAO,8FAAsD,WAAW;IACxE,gCAAO,qHAA6E,WAAW;IAC/F,gCAAO,mEAA2B,WAAW;IAE7C,gCAAO,qHAA6E,UAAU;IAC9F,gCAAO,iFAAyC,UAAU;IAC1D,gCAAO,qHAA6E,UAAU;IAC9F,gCAAO,mEAA2B,UAAU;IAG5C,OAAO,MAAC,cAAW,uCAAM;;IAMzB,eAAa,WAAW;yEAC4C;gGAG/C;IAGrB,OAAO,MAAC,cAAW,uCAAM;;IAMzB,eAAa,WAAW;yEAC4C;+FAGhD;IAIpB,sBAAM,WAAW;IACjB,gCAAO,qHAA6E,WAAW;IAC/F,gCAAO,0DAAkB,WAAW;IACpC,gCAAO,iFAAyC,WAAW;IAC3D,gCAAO,yFAAiD,WAAW;IACnE,gCAAO,8FAAsD,WAAW;IACxE,gCAAO,qHAA6E,WAAW;IAC/F,gCAAO,mEAA2B,WAAW;IAE7C,OAAO,MAAC,cAAW,uCAAM;;IAMzB,eAAa,WAAW;yEAC4C;gGAG/C;EAEvB;EAEA;QAEO,mIAA8C;QAC9C,4kBAA6C;QAC7C,yWAA+B;QAC/B,wWAA8B;QAC9B,wWAA8B;IAGnC,gCAAO,kFAA0C,WAAW;IAC5D,gCAAO,yDAAiB,WAAW;IACnC,gCAAO,yDAAiB,WAAW;IACnC,gCAAO,yDAAiB,WAAW;IACnC,gCAAO,yDAAiB,WAAW;IACnC,gCAAO,yDAAiB,WAAW;IAEnC,gCAAO,yDAAiB,UAAU;IAClC,gCAAO,yDAAiB,UAAU;IAClC,gCAAO,yDAAiB,UAAU;IAClC,gCAAO,yDAAiB,UAAU;IAClC,gCAAO,yDAAiB,UAAU;IAGlC,OAAO,MAAC,cAAW,uCAAM;;IAMzB,eAAa,WAAW;yEAC4C;+FAGhD;EAEtB;AACF","file":"zcl_abapgit_objects_program.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_object_intf.clas.testclasses.mjs":{"lineLengths":[93,85,129,53,48,0,0,25,32,74,64,207,952,264,377,265,763,685,434,130,140,175,432,22,17,42,22,110,876,188,301,189,687,609,358,54,64,99,121,3,29,64,16,3,65,597,61,41,3,49,101,64,102,70,768,79,52,76,43,49,3,63,352,64,48,55,58,82,96,73,109,88,37,31,49,40,3,54,108,82,102,70,132,58,3,49,184,85,3,63,48,55,58,82,96,73,3,61,175,58,288,67,102,70,40,46,3,49,102,183,82,21,3,58,175,58,83,100,87,112,78,85,84,103,102,70,3,63,73,181,76,31,3,55,425,108,82,23,3,67,878,185,88,35,3,59,100,19,3,59,109,79,71,76,96,73,46,61,111,3,58,768,110,82,25,3,60,686,110,82,96,73,27,3,64,783,110,82,96,73,27,3,61,352,48,55,58,82,96,73,20,3,52,108,82,134,58,140,82,3,58,109,108,76,25,3,57,71,109,79,96,73,24,3,57,288,181,76,72,61,21,3,62,175,58,686,85,41,46,3,66,175,58,783,85,3,1,83,364,87,87,79,89,22,32,71,37,224,193,240,675,67,155,353,57,17,42,22,127,117,164,598,3,29,64,16,3,17,132,95,77,159,144,82,120,71,28,3,24,130,877,187,469,695,175,366,117,109,309,164,104,81,111,84,81,83,143,100,137,137,138,105,94,82,115,96,140,131,84,89,92,84,115,92,136,148,150,177,3,19,66,2863,18,3,22,261,125,102,104,108,138,93,107,21,3,1,77,25,32,74,37,25,82,68,65,62,17,42,22,3,29,64,16,3,29,71,69,80,104,3615,158,84,79,139,73,136,967,103,150,109,3,33,71,69,80,104,3615,158,84,79,150,72,136,1428,103,150,109,3,36,69,79,346,346,352,589,897,1465,4892,4894,75,91,95,172,137,56,92,107,110,96,111,115,90,108,111,89,118,100,91,109,73,112,6070,100,139,96,3,32,69,79,4892,4894,75,91,95,172,126,57,965,100,139,96,3,1,83,62,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/zcl_abapgit_object_intf.clas.testclasses.abap"],"names":[],"mappings":";;;;;;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;IACE,4BAAqB,OAAO;EAC9B;EAEA;;;;;;;;;IACE,2BAAoB,UAAU;IAC9B,8BAAuB,aAAa;EACtC;EAEA;;;;;;;;;;;IACE,uBAAgB,QAAQ;IACxB,oBAAa,KAAK;IAClB,6BAAsB,cAAc;IACpC,uBAAkB,WAAW;EAE/B;EAEA;;;;;;;EACA;EACA;;;EACA;EAEA;;;;;;;EACA;EAEA;;;;;;;IACE,4BAAqB,MAAM;IAC3B,+BAAwB,SAAS;EACnC;EAEA;;;;IACA;;EAEA;;;;;;;;;;;;;EACA;EAEA;;;;IACA;;EAEA;;;;IACA;;EAEA;;;;IACA;;EAEA;;IACA;;EAEA;;;;;;;;;;EACA;EAEA;;;;IACA;;EAEA;;;;;;IACA;;EAEA;;;;;;IACA;;EAEA;;;;;;;;IACA;;EAEA;;;;;;;EACA;EAEA;;;;IACA;;EAEA;;;;;;IACA;;EAEA;;;;;;IACA;;EAEA;;;;;IACE,6BAAsB,MAAM;IAC5B,yBAAkB,eAAe;EACnC;EAEA;;;;;EACA;AAEF;;;;;;;AAuBA;;;;;;;;;;;;;;;;;;;;;;;;EAEE;QACO,2HAA0C;IAE/C,YAAO,MAAC,cAAW,yDAAuB;IAC1C,YAAO,MAAC,cAAW,uCAAM;;;;;IAczB,MAAM,OAAE,kCAAiC,kBAAa;IAEtD,gBAAS,MAAM;EAEjB;EAEA;QACO,yHAA0C;QAC1C,o2BAAsC;QACtC,kLAAiC;QACjC,4cAAuC;QACvC,8qBAAyE;QACzE,sKAAgC;QAChC,qWAAoC;;4GAME;oTAOX;mKAI4C;IAE5E,sBAAsB,MAAC,aAAU,yDAAuB;IACxD,sBAAsB,MAAC,WAAQ,oCAAG;IAClC,sBAAsB,MAAC,cAAW,+DAA6B;IAC/D,sBAAsB,MAAC,cAAW,oCAAG;IACrC,sBAAsB,MAAC,WAAQ,oCAAG;IAClC,sBAAsB,MAAC,aAAU,oCAAG;8IAE2C;IAE/E,kBAAkB,MAAC,aAAU,yDAAuB;wIAEyB;wIAEA;yIAGC;IAC9E,uBAAuB,MAAC,aAAU,yDAAuB;IACzD,uBAAuB,MAAC,aAAU,8CAAY;IAC9C,uBAAuB,MAAC,WAAQ,oCAAG;IACnC,uBAAuB,MAAC,cAAW,kEAAgC;IACnE,gCAAO,iCAA2B,wBAAwB;2IAEgB;kIAEG;IAE7E,qBAAqB,MAAC,cAAW,qCAAI;IACrC,qBAAqB,MAAC,YAAS,4CAAW;IAC1C,gCAAO,+BAAyB,sBAAsB;IACtD,qBAAqB,MAAC,cAAW,qCAAI;IACrC,qBAAqB,MAAC,YAAS,sEAAoC;IACnE,gCAAO,+BAAyB,sBAAsB;uIAEkB;mJAEH;qJAEG;gLAEM;EAChF;EAEA;;IACE,iCACA,2HACA,4HACA,2EACA,6EACA,2GACA,mFACA,mHACA,yFACA,mFACA,uFACA,8EACA,+EACA,+EACA,6GACA,kGACA,qFACA,wHACA,gFACA,gFACA,wEACA,0EACA,4FACA,uGACA,2EACA,0EACA,4FACA,wHACA,2EACA,yEACA,4EACA,kDACA,6EAAY;IACd;;EAEA;;IACE,gCAAO,6EAAqC,SAAS;IACrD,gCAAO,sDAAe,SAAS;IAC/B,gCAAO,wDAAgB,SAAS;IAChC,gCAAO,4DAAoB,SAAS;IACpC,gCAAO,0FAAkD,SAAS;IAClE,gCAAO,6CAAM,SAAS;IACtB,gCAAO,2DAAmB,SAAS;IACrC;;AAEF;;AAaA;;;;;;;;;;;;;;;;;EAEE;QAEI,8DAA8B;QAC9B,4DAA8B;QAC9B,uEAA+B;QAC/B,+FAAiC;QACjC,shHAAwD;IAE1D,OAAO,MAAC,WAAU,MAAC,aAAU,yCAA0B,qDAA4B,MAAC,SAAQ;IAC5F,OAAO,MAAC,WAAU,MAAC,cAAW,kCAAK;IACnC,OAAO,MAAC,WAAU,MAAC,WAAQ,gCAAG;IAC9B,OAAO,MAAC,WAAU,MAAC,cAAW,wCAAyB,mCAAW,MAAC,QAAO;IAC1E,OAAO,MAAC,WAAU,MAAC,cAAW,uBAAU;IAExC,wBAAqB,0GAA8C;IAEnE,sCACE,uDAAO,uCAAwB,8BAC/B,6EAA6B,uCAAwB,8BACrD,mEAAmB,uCAAwB,8BAC3C,+EAA+B,uCAAwB,8BACvD,kFAAkC,uCAAwB,8BAC1D,yDAAS,uCAAwB,8BACjC,iCAAO,uCAAwB,oBAAO;IAExC,eAAY,kFAAoD;IAEhE,iBAAc,+HAEa;4GAGR;EACrB;EAGA;QAEI,8DAA8B;QAC9B,4DAA8B;QAC9B,uEAA+B;QAC/B,+FAAiC;QACjC,shHAAwD;IAE1D,OAAO,MAAC,WAAU,MAAC,aAAU,yCAA0B,qDAA4B,MAAC,SAAQ;IAC5F,OAAO,MAAC,WAAU,MAAC,cAAW,kCAAK;IACnC,OAAO,MAAC,WAAU,MAAC,WAAQ,gCAAG;IAC9B,OAAO,MAAC,WAAU,MAAC,cAAW,wCAAyB,mCAAW,MAAC,mBAAkB;IACrF,OAAO,MAAC,WAAU,MAAC,cAAW,sBAAS;IAEvC,wBAAqB,0GAA8C;IAEnE,sCACE,uDAAO,uCAAwB,8BAC/B,6EAA6B,uCAAwB,8BACrD,mEAAmB,uCAAwB,8BAC3C,+EAA+B,uCAAwB,8BACvD,mFAAmC,uCAAwB,8BAC3D,0FAA0C,uCAAwB,8BAClE,0DAAU,uCAAwB,8BAClC,uFAAuC,uCAAwB,8BAC/D,qEAAqB,uCAAwB,8BAC7C,iCAAO,uCAAwB,0BAAO;IAExC,eAAY,kFAAoD;IAEhE,iBAAc,+HAEa;4GAGR;EACrB;EAEA;QAEI,4DAAsC;QACtC,sEAAuC;QACvC,iVAAqF;QACrF,iVAAqF;QACrF,uVAAqF;QACrF,okBAAsF;QACtF,w3BAAqE;QACrE,g7CAAsE;QACtE,mxJAAgE;QAChE,qxJAAgE;IAGlE,WAAW,MAAC,oBAAiB,gCAAG;IAChC,WAAW,MAAC,OAAM,MAAC,iBAAc,sCAAK;IACtC,WAAW,MAAC,OAAM,MAAC,uBAAoB,oCAAG;IAC1C,WAAW,MAAC,OAAM,MAAC,2BAAwB,yCAA0B,qDAA4B,MAAC,SAAQ;IAC1G,WAAW,MAAC,cAAW,wCAAyB,mCAAW,MAAC,mBAAkB;IAC9E,WAAW,MAAC,WAAQ,sBAAS;IAE7B,mBAAmB,MAAC,UAAO,mDAAiB;IAC5C,mBAAmB,MAAC,iBAAc,2DAAyB;IAC3D,gCAAO,6BAAuB,WAAW,MAAC,aAAY,MAAC,MAAK;IAE5D,mBAAmB,MAAC,UAAO,uDAAqB;IAChD,mBAAmB,MAAC,iBAAc,+DAA6B;IAC/D,gCAAO,6BAAuB,WAAW,MAAC,aAAY,MAAC,WAAU;IAEjE,mBAAmB,MAAC,UAAO,iDAAe;IAC1C,mBAAmB,MAAC,iBAAc,4DAA0B;IAC5D,gCAAO,6BAAuB,WAAW,MAAC,aAAY,MAAC,OAAM;IAE7D,yBAAyB,MAAC,UAAO,0CAAS;IAC1C,yBAAyB,MAAC,iBAAc,gEAA8B;IACtE,gCAAO,mCAA6B,0BAA0B;IAE9D,mBAAmB,MAAC,UAAO,kDAAgB;IAC3C,mBAAmB,MAAC,iBAAc,6DAA2B;IAC7D,mBAAmB,MAAC,gBAAa,0BAA0B;IAC3D,gCAAO,6BAAuB,WAAW,MAAC,aAAY,MAAC,QAAO;IAE9D,oCACE,uDAAO,uCAAwB,8BAC/B,6EAA6B,uCAAwB,8BACrD,mEAAmB,uCAAwB,8BAC3C,+EAA+B,uCAAwB,8BACvD,mFAAmC,uCAAwB,8BAC3D,0FAA0C,uCAAwB,8BAClE,0DAAU,uCAAwB,8BAClC,uFAAuC,uCAAwB,8BAC/D,sEAAsB,uCAAwB,8BAC9C,yEAAyB,uCAAwB,8BACjD,oEAAoB,uCAAwB,8BAC5C,6DAAa,uCAAwB,8BACrC,wFAAwC,uCAAwB,8BAChE,sGAAsD,uCAAwB,8BAC9E,6DAAa,uCAAwB,8BACrC,4DAAY,uCAAwB,8BACpC,yEAAyB,uCAAwB,8BACjD,6DAAa,uCAAwB,8BACrC,4FAA4C,uCAAwB,8BACpE,0GAA0D,uCAAwB,8BAClF,6DAAa,uCAAwB,8BACrC,4DAAY,uCAAwB,8BACpC,qEAAqB,uCAAwB,8BAC7C,6DAAa,uCAAwB,8BACrC,sFAAsC,uCAAwB,8BAC9D,uGAAuD,uCAAwB,8BAC/E,6DAAa,uCAAwB,8BACrC,4DAAY,uCAAwB,8BACpC,sEAAsB,uCAAwB,8BAC9C,6DAAa,uCAAwB,8BACrC,uFAAuC,uCAAwB,8BAC/D,yGAAyD,uCAAwB,8BACjF,6EAA6B,uCAAwB,8BACrD,iEAAiB,uCAAwB,8BACzC,oFAAoC,uCAAwB,8BAC5D,+GAA+D,uCAAwB,8BACvF,iEAAiB,uCAAwB,8BACzC,+DAAe,uCAAwB,8BACvC,6DAAa,uCAAwB,8BACrC,2DAAW,uCAAwB,8BACnC,yDAAS,uCAAwB,8BACjC,iCAAO,uCAAwB,0FAAO;IAExC,uBAAoB,uEAAyC;IAG7D,eAAY,sHAA0D;+FAGf;EACzD;EAEA;QAEI,4DAA6B;QAC7B,sEAA8B;QAC9B,mxJAAuD;QACvD,qxJAAuD;IAGzD,WAAW,MAAC,oBAAiB,gCAAG;IAChC,WAAW,MAAC,OAAM,MAAC,iBAAc,sCAAK;IACtC,WAAW,MAAC,OAAM,MAAC,uBAAoB,oCAAG;IAC1C,WAAW,MAAC,OAAM,MAAC,2BAAwB,yCAA0B,qDAA4B,MAAC,SAAQ;IAC1G,WAAW,MAAC,cAAW,wCAAyB,mCAAW,MAAC,QAAO;IACnE,WAAW,MAAC,WAAQ,uBAAU;IAE9B,oCACE,uDAAO,uCAAwB,8BAC/B,6EAA6B,uCAAwB,8BACrD,mEAAmB,uCAAwB,8BAC3C,+EAA+B,uCAAwB,8BACvD,kFAAkC,uCAAwB,8BAC1D,yDAAS,uCAAwB,8BACjC,iCAAO,uCAAwB,oBAAO;IAExC,uBAAoB,uEAAyC;IAG7D,eAAY,sHAA0D;+FAGf;EACzD;AAEF","file":"zcl_abapgit_object_intf.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_path.clas.testclasses.mjs":{"lineLengths":[71,53,41,17,32,59,37,25,69,63,53,54,70,17,42,22,3,29,64,16,3,19,195,195,202,203,3,31,67,67,155,118,118,163,118,126,156,119,118,164,119,126,164,127,118,173,127,126,3,21,99,179,104,180,104,175,105,171,105,168,104,172,105,3,22,67,164,118,168,122,169,122,170,119,174,123,172,126,171,126,3,37,71,144,130,154,130,149,130,150,130,145,130,158,130,231,131,3,1,60,19,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_path.clas.testclasses.abap"],"names":[],"mappings":";;;AAeA;;;;;;;;;;;;;;;;;;EAEE;kMAI4C;kMAID;yMAIO;0MAIC;EAEnD;EAEA;QAEQ,0DAAmB;QACnB,0DAAmB;0JAIgC;qHAEX;qHAEA;kKAIW;qHAEX;6HAEQ;2JAIG;sHAEV;qHAED;mKAIW;sHAEV;6HAEO;mKAIG;8HAEF;qHAET;4KAIW;8HAEF;6HAED;EAGxD;EAEA;QAEO,0FAAqB;IAE1B,YAAS,iKACiD;uGAEL;IAErD,YAAS,kKACkD;uGAEN;IAErD,YAAS,6JACiD;wGAEJ;IAEtD,YAAS,yJACiD;wGAEJ;IAEtD,YAAS,sJAC8C;uGAEF;IAErD,YAAS,0JACiD;wGAEJ;EAExD;EAEA;QAEO,0DAAmB;IAExB,aAAU,iJAC+C;qHAEX;IAE9C,aAAU,qJAC+C;yHAEP;IAElD,aAAU,sJACgD;yHAER;IAElD,aAAU,uJACiD;sHAEZ;IAE/C,aAAU,2JACiD;0HAER;IAEnD,aAAU,yJACkD;6HAEN;IAEtD,aAAU,wJACkD;6HAEN;EAExD;EAEA;QAEO,8DAAuB;IAE5B,iBAAc,yHAAyD;iIAEjB;IAEtD,iBAAc,mIAAgE;iIAExB;IAEtD,iBAAc,8HAA4D;iIAEpB;IAEtD,iBAAc,+HAA8D;iIAEtB;IAEtD,iBAAc,0HAA0D;iIAElB;IAEtD,iBAAc,uIAAmE;iIAE3B;IAEtD,iBAAc,gNACwE;kIAE/B;EAEzD;AAEF","file":"zcl_abapgit_path.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_po_file.clas.testclasses.mjs":{"lineLengths":[77,53,44,0,20,32,65,37,25,69,60,58,51,62,17,42,22,3,29,64,16,3,19,123,856,66,66,136,662,128,50,70,65,72,75,50,75,65,72,78,50,70,65,72,78,173,93,87,676,129,3,28,123,860,860,136,662,54,70,65,72,78,54,75,65,72,78,54,70,65,72,75,43,75,33,51,5,87,969,128,91,89,108,3,26,123,128,9,283,17,106,14,16,7,5,9,290,17,106,14,16,7,5,9,274,17,106,14,16,7,5,9,366,17,106,14,16,7,5,9,289,17,106,14,16,7,5,9,289,17,106,14,16,7,5,3,19,228,210,283,9,111,55,17,106,14,16,7,5,9,111,55,17,106,14,16,7,5,9,108,55,17,106,14,16,7,5,9,101,55,17,106,14,16,7,5,3,29,123,819,128,361,154,91,28,61,204,128,427,154,91,28,61,204,3,1,69,22,65],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_po_file.clas.testclasses.abap"],"names":[],"mappings":";;;;AAiBA;;;;;;;;;;;;;;;;;;EAEE;QAEO,kHAAqC;QACrC,+0BAAsD;QACtD,yDAAkB;QAClB,yDAAkB;QAClB,+HAA4C;IAEjD,IAAc,QAAgC;;;IAK9C,QAAM,MAAC,aAAU,qCAAI;IACrB,QAAM,MAAC,aAAU,gCAAE;IACnB,QAAM,MAAC,YAAU,wCAAO;IACxB,QAAM,MAAC,YAAU,2CAAU;;IAE3B,QAAM,MAAC,aAAU,0CAAS;IAC1B,QAAM,MAAC,aAAU,gCAAE;IACnB,QAAM,MAAC,YAAU,wCAAO;IACxB,QAAM,MAAC,YAAU,8CAAY;;IAE7B,QAAM,MAAC,aAAU,qCAAI;IACrB,QAAM,MAAC,aAAU,gCAAE;IACnB,QAAM,MAAC,YAAU,wCAAO;IACxB,QAAM,MAAC,YAAU,8CAAY;4KAKG;IAEhC,YAAS,2EAAoD;;mqBAW1B;gIAIU;EAE/C;EAEA;QAEO,kHAAqC;QACrC,m1BAA0D;QAC1D,m1BAA0D;QAC1D,+HAA4C;IAEjD,IAAc,QAAoC;;IAGlD,QAAM,MAAC,aAAU,qCAAI;IACrB,QAAM,MAAC,aAAU,gCAAE;IACnB,QAAM,MAAC,YAAU,wCAAO;IACxB,QAAM,MAAC,YAAU,8CAAY;;IAE7B,QAAM,MAAC,aAAU,0CAAS;IAC1B,QAAM,MAAC,aAAU,gCAAE;IACnB,QAAM,MAAC,YAAU,wCAAO;IACxB,QAAM,MAAC,YAAU,8CAAY;;IAE7B,QAAM,MAAC,aAAU,qCAAI;IACrB,QAAM,MAAC,aAAU,gCAAE;IACnB,QAAM,MAAC,YAAU,wCAAO;IACxB,QAAM,MAAC,YAAU,2CAAU;IAE3B,qBAAmB,gBAAgB;;;MAEjC,sBAAM,QAAM,MAAC,OAAM;IACrB;;w8BAe+B;;0FAGuB;wFAC6B;2GAIzD;EAE5B;EAEA;QAEO,kHAAqC;;IAI1C;0RAIsC;;;;;;IAEtC;IAEA;iSAIsC;;;;;;IAEtC;IAEA;iRAIsC;;;;;;IAEtC;IAEA;6WAKsC;;;;;;IAEtC;IAEA;gSAIsC;;;;;;IAEtC;IAEA;gSAIsC;;;;;;IAEtC;EAEF;EAEA;mOAIsB;iNAGR;0RAGmC;IAE/C;8GACgD;sDAChB;;;;;;IAEhC;IAEA;8GACgD;sDAChB;;;;;;IAEhC;IAEA;2GAC6C;sDACb;;;;;;IAEhC;IAEA;oGACuC;sDACP;;;;;;IAEhC;EAEF;EAEA;QAEO,kHAAqC;IAC1C,IAAc,QAAmC;;wWAOf;yJAIvB;IACX;0BAAmD;4DACf;2MAGa;;0aAQf;yJAIvB;IACX;0BAAmD;4DACf;2MAGa;EAEnD;AAEF","file":"zcl_abapgit_po_file.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo.clas.testclasses.mjs":{"lineLengths":[71,53,41,36,32,78,37,217,207,217,189,70,73,58,72,69,71,66,69,73,177,17,42,22,120,131,141,74,3,29,64,16,3,20,32,40,46,43,45,3,41,32,91,43,46,47,45,3,26,4399,73,110,3,34,889,508,103,110,1451,69,68,3,37,3,40,9,84,17,106,29,14,16,7,5,3,37,87,3,39,85,3,41,91,3,37,74,94,889,508,103,59,47,65,53,126,71,5,50,68,3,1,98,132,63,38,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo.clas.testclasses.abap"],"names":[],"mappings":";;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;+BAEmB;uCACQ;6CAEM;0CAEH;4CACE;EAEhC;EAGA;+BAEmB;0FACQ;0CACG;6CAEG;8CAEC;4CACF;EAEhC;EAGA;QAEQ,syIAA6C;IAEnD,OAAO,MAAC,SAAM,6CAAgB;;EAOhC;EAGA;QAGI,g3BAAsD;QACtD,mfAA8B;IAEhC,OAAO,MAAC,UAAO,wCAAyB,kCAAU;IAClD,OAAO,MAAC,cAAW,wCAAyB,qCAAa;IACzD,OAAO,MAAC,WAAO,64CAiBqB;IACpC,8DAAkC;mEAEG;EAEvC;EAGA;EAEA;EAGA;IAEE;MACI,yBAAiB,mDAAmC;;;;;;;IAExD;EAEF;EAGA;sFACqD;EACrD;EAGA;oFACmD;EACnD;EAGA;0FACyD;EACzD;EAGA;;;QAEQ,g3BAAsD;QACtD,mfAA8B;IAEpC,OAAO,MAAC,UAAO,wCAAyB,kCAAU;;;;;MAGhD,OAAO,MAAC,yGAA8B;MACtC,8DAAkC;IACpC;;mEAEqC;EAEvC;AAEF","file":"zcl_abapgit_repo.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_checksums.clas.testclasses.mjs":{"lineLengths":[91,117,53,51,37,32,89,37,25,71,65,55,67,1472,273,17,42,22,3,29,64,16,3,25,57,3,32,1276,73,66,55,1074,456,40,51,85,85,85,62,69,86,73,51,85,85,87,62,69,89,73,62,69,88,73,417,3,35,67,3,42,66,66,58,169,18,3,21,1276,66,66,70,136,88,3,23,1280,1280,66,74,139,108,3,33,1276,66,1074,456,51,136,117,62,69,83,76,62,69,85,73,136,312,3,35,1280,1280,1074,456,55,62,69,85,73,285,108,3,1,110,21,32,73,78,1520,973,4494,22,17,42,22,1423,897,4466,3,29,64,16,3,41,123,101,58,72,27,5,19,3,49,1416,120,58,147,79,38,20,3,50,889,147,79,108,85,112,39,20,3,36,101,53,18,3,37,67,57,19,3,38,148,24,3,37,3,44,123,61,3,47,1162,23,3,40,102,22,3,59,102,70,106,79,108,123,58,69,64,3,55,66,58,123,58,69,64,3,39,103,22,3,45,4567,67,120,58,3,47,4567,21,3,49,140,82,3,44,140,26,3,55,105,66,58,109,91,24,3,37,339,19,3,47,339,19,3,49,123,66,58,102,70,75,85,178,69,67,106,79,108,110,91,116,19,3,48,123,66,58,74,82,75,85,102,70,75,85,180,69,67,106,79,108,110,91,116,19,3,43,120,123,61,688,67,18,3,41,106,79,108,104,73,103,3,54,102,70,106,79,108,106,79,107,3,50,66,58,106,79,107,3,47,477,21,3,1,78,30,32,82,37,1513,170,17,42,22,1415,3,29,64,16,3,20,66,58,1192,66,23,54,276,99,63,63,63,5,67,3,1,96,31,32,83,37,986,170,17,42,22,888,3,29,64,16,3,20,66,58,508,66,23,54,141,67,3,1,98,28,32,80,37,754,170,17,42,22,656,3,29,64,16,3,20,66,58,424,66,23,54,141,67,3,1,92,27,32,79,66,211,198,65,58,65,58,17,42,22,114,121,3,29,64,16,3,15,152,142,1280,108,82,90,131,139,145,3,26,152,142,69,175,177,108,82,90,122,122,122,122,64,123,105,105,105,65,139,60,565,135,112,3,25,152,142,69,171,108,82,90,120,105,107,139,104,567,135,112,3,51,101,58,3,49,108,101,58,72,121,109,5,22,3,51,101,58,108,70,40,48,3,33,152,142,69,175,177,108,82,90,122,107,110,122,64,123,105,108,105,65,139,60,466,112,3,1,90,35,32,87,37,25,74,17,42,22,3,29,64,16,3,23,1277,1273,1273,175,171,120,105,107,122,122,122,122,603,601,242,94,3,1,106,175,72],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/repo/zcl_abapgit_repo_checksums.clas.testclasses.abap"],"names":[],"mappings":";;;;AAyBA;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;IAEE,IAAc,SAAiC;IAC/C,IAAc,WAAoC;IAElD,sBAAM,YAAY;;IAGlB,SAAO,MAAC,KAAI,MAAC,cAAW,uCAAM;IAC9B,SAAO,MAAC,KAAI,MAAC,cAAW,uCAAM;IAC9B,SAAO,MAAC,KAAI,MAAC,cAAW,uCAAM;;IAE9B,WAAS,MAAC,UAAW,oCAAG;IACxB,WAAS,MAAC,cAAW,iDAAe;IACpC,WAAS,MAAC,UAAW,wCAAO;;IAG5B,SAAO,MAAC,KAAI,MAAC,cAAW,uCAAM;IAC9B,SAAO,MAAC,KAAI,MAAC,cAAW,uCAAM;IAC9B,SAAO,MAAC,KAAI,MAAC,cAAW,yCAAQ;;IAEhC,WAAS,MAAC,UAAW,oCAAG;IACxB,WAAS,MAAC,cAAW,oDAAkB;IACvC,WAAS,MAAC,UAAW,wCAAO;;IAE5B,WAAS,MAAC,UAAW,oCAAG;IACxB,WAAS,MAAC,cAAW,mDAAiB;IACtC,WAAS,MAAC,UAAW,wCAAO;IAE5B,YAAS,+YAKoB;EAE/B;EAEA;;;;;;;IAEE,WAAS,sBACP,KAAO,QACP,KAAO,kCACP,MAAO,kCACP,KAAO,iCAAG;IAGd;;EAEA;QAEO,mvCAA+D;QAC/D,yDAAkB;QAClB,yDAAkB;qEAKI;IAE3B,YAAS,sHAAkD;uFAI3C;EAElB;EAEA;QAEO,uvCAAmE;QACnE,uvCAAmE;QACnE,yDAAkB;yEAKI;IAE3B,sBAAmB,+GAA8C;2GAIvC;EAE5B;EAEA;QAEO,mvCAA+D;QAC/D,yDAAkB;IAEvB,IAAc,SAAiC;IAC/C,IAAc,WAAoC;;IAIlD,YAAS,sHAAkD;oHAG/C;;IAGZ,WAAS,MAAC,UAAW,oCAAG;IACxB,WAAS,MAAC,cAAW,8CAAY;IACjC,WAAS,MAAC,UAAW,2CAAU;;IAE/B,WAAS,MAAC,UAAW,oCAAG;IACxB,WAAS,MAAC,cAAW,gDAAc;IACnC,WAAS,MAAC,UAAW,wCAAO;IAE5B,YAAS,sHAAkD;uTAM7B;EAEhC;EAEA;QAEO,uvCAAmE;QACnE,uvCAAmE;IAExE,IAAc,SAAqC;IACnD,IAAc,WAAoC;;;IAIlD,WAAS,MAAC,UAAW,oCAAG;IACxB,WAAS,MAAC,cAAW,gDAAc;IACnC,WAAS,MAAC,UAAW,wCAAO;IAE5B,sBAAmB,iQAES;2GAIF;EAE5B;AAEF;;AAoCA;;;;;;;;;;;;;;;;;;;EAEE;;;;IACE,iBAAU,GAAP,QAAS,qCAAG;MACb,YAAU,OAAE;IACd;IACF;;EAEA;;;;;;IACE,aAAW,mBAAc;IAC3B;;EAEA;;;;;;;IACE,aAAW,oBAAe;IAC5B;;EAEA;;IACE,WAAS,oCAAG;IACd;;EAEA;;IACE,YAAU,uCAAM;IAClB;;EACA;;IACA;;EAEA;EACA;EACA;;;EACA;EACA;;IACA;;EACA;;IACA;;EACA;;;;;;;;;;EACA;EACA;;;;;;;EACA;EACA;;IACA;;EACA;;;;;EACA;EACA;;IACA;;EACA;;;EACA;EACA;;IACA;;EACA;;;;;;IACA;;EACA;;IACA;;EACA;;IACA;;EACA;;;;;;;;;;;;;;;;;IACA;;EACA;;;;;;;;;;;;;;;;;;;;;IACA;;EACA;;;;;;IACA;;EACA;;;;;;;EACA;EACA;;;;;;;;;EACA;EACA;;;;;;EACA;EACA;;IACA;;AAEF;;AAQA;;;;;;;;;;;;;;;EACE;;;QACO,+pCAA2B;QAC3B,yDAAkB;IACvB,WAAS,MAAM;IACf,yBAAS,MAAM;IACf;IAOA,iBAAyB,GAAtB,OAAO,MAAC,KAAI,MAAC,WAAW,qCAAG;MAC5B,sBAAO,OAAO,MAAC,KAAI,MAAC,SAAQ;MAA5B,sBAA8B,OAAO,MAAC,KAAI,MAAC,SAAQ;MAAnD,sBAAqD,OAAO,MAAC,KAAI,MAAC,SAAQ;IAC5E;IACA,gCAAO,iBAAW,WAAM;EAC1B;AACF;;AAQA;;;;;;;;;;;;;;;EACE;;;QACO,mfAA2B;QAC3B,yDAAkB;IACvB,WAAS,MAAM;IACf,yBAAS,MAAM;IACf;IAIA,gCAAO,iBAAW,WAAM;EAC1B;AACF;;AAQA;;;;;;;;;;;;;;;EACE;;;QACO,+ZAA2B;QAC3B,yDAAkB;IACvB,WAAS,MAAM;IACf,yBAAS,MAAM;IACf;IAIA,gCAAO,iBAAW,WAAM;EAC1B;AACF;;AAMA;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,+IAAiC;QACjC,qIAA6C;QAC7C,uvCAAmE;;iFAGxB;yFACD;kIAEqC;;gJAQ1D;EAE5B;EAEA;QAEO,+IAAiC;QACjC,qIAA6C;QAC7C,4DAAqB;QACrB,sKAA+C;QAC/C,wKAAgD;;iFAGL;yFACD;;yHAIiB;yHACA;yHACA;IAChE,OAAO,OAAE,mBAAiB,YAAY,OAAE,MAAM;;wGAIC;wGACA;wGACA;IAC/C,OAAO,OAAE,oBAAkB,YAAY,OAAE,MAAM;;2DAM7B;IAElB,eAAY,giBAMiB;sIAGhB;+GAGM;EAErB;EAEA;QAEO,+IAAiC;QACjC,qIAA6C;QAC7C,4DAAqB;QACrB,kKAA6C;;iFAIF;yFACD;;wGAGA;0GACE;;uGAMX;IAEtC,eAAY,kiBAMmB;sIAGlB;+GAGM;EAErB;EAEA;;;EAEA;EAEA;;;;IAEE,iBAAU,GAAP,QAAS,qCAAG;wHAC2D;MACxE,qGAA8C;IAChD;IAEF;;EAEA;;;;;IACE,4BAAyB,MAAM;IAC/B,gCAAyB,UAAU;EACrC;EAEA;QAEO,+IAAiC;QACjC,qIAA6C;QAC7C,4DAAqB;QACrB,sKAA+C;QAC/C,wKAAgD;;iFAGL;yFACD;;0GAIE;6GACG;yHACY;IAChE,OAAO,OAAE,mBAAiB,YAAY,OAAE,MAAM;;wGAIC;2GACG;wGACH;IAC/C,OAAO,OAAE,oBAAkB,YAAY,OAAE,MAAM;;2DAM7B;IAElB,eAAY,6bAKe;+GAGR;EAErB;AAEF;;AAiBA;;;;;;;;;;;;;;EAEE;QAEO,ovCAAgE;QAChE,gvCAA4D;QAC5D,gvCAA4D;QAC5D,sKAA+C;QAC/C,kKAA6C;;wGAGH;0GACE;;yHAGe;yHACA;yHACA;IAEhE,mBAAgB,kkBAKe;IAE/B,eAAY,okBAKqB;IAEjC,eAAY,6NAGmC;6FAI5B;EAErB;AAEF","file":"zcl_abapgit_repo_checksums.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_repo_labels.clas.testclasses.mjs":{"lineLengths":[85,53,48,17,32,66,37,25,67,52,53,56,65,59,61,17,42,22,3,29,64,16,3,17,260,87,88,89,89,89,88,89,209,3,20,134,109,110,9,116,55,17,106,14,16,7,5,3,21,272,233,218,222,232,3,27,145,116,117,161,9,122,55,17,106,14,16,7,5,9,120,55,17,106,14,16,7,5,9,122,55,17,106,14,16,7,5,9,124,55,17,106,14,16,7,5,9,125,55,17,106,14,16,7,5,9,127,55,17,106,14,16,7,5,3,24,528,332,44,67,69,44,67,73,214,34,44,67,69,264,3,33,478,263,59,61,64,59,65,64,242,3,28,262,245,225,229,265,3,1,67,19,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_repo_labels.clas.testclasses.abap"],"names":[],"mappings":";;;AAgBA;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,2PAAwB;IAE7B,gCAAO,0CAAO,MAAM;IACpB,gCAAO,2CAAQ,MAAM;IACrB,gCAAO,4CAAS,MAAM;IACtB,gCAAO,4CAAS,MAAM;IACtB,gCAAO,4CAAS,MAAM;IACtB,gCAAO,2CAAQ,MAAM;IACrB,gCAAO,4CAAS,MAAM;gNAIN;EAElB;EAEA;qIAEsE;4GAC7B;6GACC;IAExC;mHACgD;sDAChB;;;;;;IAEhC;EAEF;EAEA;+QAI2C;wOAIvB;yNAIN;6NAIA;uOAIM;EAEpB;EAEA;gJAE4E;mHAC5B;oHACC;gKAC2C;IAE1F;yHACsD;sDACtB;;;;;;IAEhC;IAEA;uHACoD;sDACpB;;;;;;IAEhC;IAEA;yHACsD;sDACtB;;;;;;IAEhC;IAEA;2HACwD;sDACxB;;;;;;IAEhC;IAEA;4HACyD;sDACzB;;;;;;IAEhC;IAEA;8HAC2D;sDAC3B;;;;;;IAEhC;EAEF;EAEA;QAEO,ugBAAoD;IACzD,IAAc,QAA0B;;IAGxC,QAAM,MAAC,WAAQ,oCAAG;IAClB,QAAM,MAAC,WAAQ,sCAAK;;IAEpB,QAAM,MAAC,WAAQ,oCAAG;IAClB,QAAM,MAAC,WAAQ,0CAAS;qNAIR;IAEhB,sBAAM,MAAM;;IAEZ,QAAM,MAAC,WAAQ,oCAAG;IAClB,QAAM,MAAC,WAAQ,sCAAK;uQAGJ;EAElB;EAEA;QAEO,qdAA8C;QAC9C,8PAAwB;IAE7B,IAAI,MAAC,OAAI,oCAAG;IACZ,IAAI,MAAC,OAAI,sCAAK;IACd,yDAA6B;IAC7B,IAAI,MAAC,OAAI,oCAAG;IACZ,IAAI,MAAC,OAAI,0CAAS;IAClB,yDAA6B;iPAIb;EAElB;EAEA;qQAI8B;oPAIX;gOAIL;oOAIA;wQAIa;EAG3B;AAEF","file":"zcl_abapgit_repo_labels.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_requirement_helper.clas.testclasses.mjs":{"lineLengths":[99,53,55,18,32,74,37,25,187,17,42,22,3,29,64,16,3,35,48,3,42,63,245,9,199,148,103,41,17,22,44,77,61,13,16,20,9,7,90,197,7,62,105,108,29,81,90,131,7,23,5,3,78,28,34,84,39,27,75,57,56,59,19,44,24,5,31,66,18,5,25,68,588,363,121,71,125,74,80,257,5,25,68,588,363,121,71,125,192,80,257,5,24,68,588,363,121,71,125,72,80,257,5,26,68,588,363,121,71,125,124,80,257,5,3,94,27,34,83,39,27,75,57,56,59,19,44,24,5,31,66,18,5,25,68,588,363,121,71,71,74,80,257,5,25,68,588,363,121,71,71,192,80,257,5,24,68,588,363,121,71,71,72,80,257,5,26,68,588,363,121,71,71,124,80,256,5,3,92,29,34,85,39,27,75,57,56,59,19,44,24,5,31,66,18,5,25,68,588,363,121,71,123,74,80,256,5,25,68,588,363,121,71,123,126,80,256,5,24,68,588,363,121,71,123,72,80,256,5,26,68,588,363,121,71,123,124,80,256,5,3,96,22,34,78,39,27,77,59,19,44,24,5,31,66,18,5,27,68,588,363,121,71,71,199,148,171,80,257,5,26,68,588,363,121,71,71,198,147,170,80,257,5,3,82,94,76],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_requirement_helper.clas.testclasses.abap"],"names":[],"mappings":";;;AAYA;;;;;;;;;;;;;;EAGE;;;;;QAGI,4OAA6C;;;;;;;;;;;;;;;;MAQ/C,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;oMACwE;MACxF;MAEA;;;;+EACkC;MAClC,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;kIACiD;MACjE;MAEF;;EAGF;;EA+BA;;;;;;;;;;;;;;;;;IAGE;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAmC,qBAArB,YAAY,MAAC,SAAU,gCAAC;MACrD,cAAc,MAAC,eAAc,+BAAC;MAC9B,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAmC,qBAArB,YAAY,MAAC,SAAU,gCAAC;MACrD,cAAc,MAAC,eAAc,mBACE,MAA+B,qBAAxB,YAAY,MAAC,YAAa,kCACjC,MAAO,iCAAG;MACzC,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAmC,qBAArB,YAAY,MAAC,SAAU,gCAAC;MACrD,cAAc,MAAC,eAAc,YAAY,MAAC,WAAU;MACpD,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAmC,qBAArB,YAAY,MAAC,SAAU,gCAAC;MACrD,cAAc,MAAC,eAAsC,mBAAxB,YAAY,MAAC,YAAa,gCAAC;MACxD,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;EAGF;;EA+BA;;;;;;;;;;;;;;;;;IAGE;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAc,YAAY,MAAC,QAAO;MACjD,cAAc,MAAC,eAAc,+BAAC;MAC9B,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAc,YAAY,MAAC,QAAO;MACjD,cAAc,MAAC,eAAc,mBACE,MAA+B,qBAAxB,YAAY,MAAC,YAAa,kCACjC,MAAO,iCAAG;MACzC,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAc,YAAY,MAAC,QAAO;MACjD,cAAc,MAAC,eAAc,YAAY,MAAC,WAAU;MACpD,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAc,YAAY,MAAC,QAAO;MACjD,cAAc,MAAC,eAAsC,mBAAxB,YAAY,MAAC,YAAa,gCAAC;MACxD,gCAAO,wBAAkB,eAAe;+PAIC;IAE3C;EAGF;;EA+BA;;;;;;;;;;;;;;;;;IAGE;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAmC,mBAArB,YAAY,MAAC,SAAU,gCAAC;MACrD,cAAc,MAAC,eAAc,+BAAC;MAC9B,gCAAO,wBAAkB,eAAe;+PAIC;IAE3C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAmC,mBAArB,YAAY,MAAC,SAAU,gCAAC;MACrD,cAAc,MAAC,eAAsC,qBAAxB,YAAY,MAAC,YAAa,gCAAC;MACxD,gCAAO,wBAAkB,eAAe;+PAIC;IAE3C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAmC,mBAArB,YAAY,MAAC,SAAU,gCAAC;MACrD,cAAc,MAAC,eAAc,YAAY,MAAC,WAAU;MACpD,gCAAO,wBAAkB,eAAe;+PAIC;IAE3C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAmC,mBAArB,YAAY,MAAC,SAAU,gCAAC;MACrD,cAAc,MAAC,eAAsC,mBAAxB,YAAY,MAAC,YAAa,gCAAC;MACxD,gCAAO,wBAAkB,eAAe;+PAIC;IAE3C;EAGF;;EAuBA;;;;;;;;;;;;;;;IAGE;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAc,YAAY,MAAC,QAAO;;;;MAQjD,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;IAGA;UAGI,yDAA8B;UAC9B,ikBAA+D;UAC/D,gWAA4C;MAE9C,kBAAe,+FAAsC;MAErD,cAAc,MAAC,eAAc,YAAY,MAAC,UAAS;MACnD,cAAc,MAAC,iBAAc,YAAY,MAAC,QAAO;;;;MAQjD,gCAAO,wBAAkB,eAAe;gQAIE;IAE5C;EAGF","file":"zcl_abapgit_requirement_helper.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_serialize.clas.testclasses.mjs":{"lineLengths":[81,53,46,0,0,34,32,81,37,227,67,65,50,17,42,22,129,3,29,64,16,3,17,9,90,17,106,125,14,16,7,5,3,33,66,70,118,3,17,66,115,117,3,1,99,22,32,69,37,230,206,67,48,55,52,17,42,22,133,129,3,29,64,16,3,17,85,9,119,17,106,125,14,16,7,5,3,16,813,1421,1419,627,50,75,87,80,75,67,126,125,100,3,23,813,433,643,121,121,627,50,75,79,78,122,78,123,69,77,21,61,162,69,77,21,61,162,3,19,813,433,643,121,121,627,165,50,75,81,79,50,75,89,79,78,177,78,178,69,77,21,61,167,69,77,21,61,167,3,1,75,17,32,64,37,238,205,180,180,67,49,17,42,22,141,129,41,39,3,29,64,16,3,17,1952,59,9,118,127,17,106,125,14,16,7,5,3,16,813,1417,66,130,58,277,627,1226,130,50,75,77,80,75,77,143,80,33,106,131,101,124,120,135,87,74,82,85,26,58,61,3,1,65,105,29,104,28,63,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAiBA;;;;;;;;;;;;;;;;;EAEE;IACE;;;;;;;;IAIA;EACF;EAEA;QAEQ,yDAAiB;IAEvB,gBAAa,gDAAgC;qHAIlC;EAEb;EAEA;QAEQ,yDAAiB;IAEvB,gBAAa,6FAA0C;oHAI5C;EAEb;AAEF;;AAkBA;;;;;;;;;;;;;;;;;;;;EAEE;IAEE,iBAAS,8DAAyC;IAElD;;;;;;;;IAMA;EACF;EAEA;QAEQ,oyBAAuD;QACvD,o4CAA4D;QAC5D,k4CAA4D;IAElE,IAAe,YAAgC;;IAI/C,YAAU,MAAC,YAAW,uCAAM;IAC5B,YAAU,MAAC,cAAW,iDAAe;IACrC,YAAU,MAAC,cAAW,0CAAS;IAC/B,YAAU,MAAC,UAAW,yCAAQ;IAC9B,YAAU,MAAC,gBAAa,eAAE,MAAC,MAAK;IAEhC,mBAAgB,qGAEmB;IAEnC,iBAAc,sGAEsB;mGAIf;EAEvB;EAEA;QAEQ,oyBAAkD;QAClD,waAAyC;QACzC,0nBAA0C;QAC1C,gHAAoC;QACpC,gHAAoC;IAE1C,IAAe,YAAgC;;IAI/C,YAAU,MAAC,YAAW,uCAAM;IAC5B,YAAU,MAAC,cAAW,yCAAQ;;yHAMK;;0HAMC;IAEpC,YAAS,mDAAwB;IACjC;mBAAqC;4DACD;iKAIQ;IAE5C,YAAS,mDAAwB;IACjC;mBAAqC;4DACD;iKAIQ;EAE9C;EAEA;QAEQ,oyBAAkD;QAClD,waAAyC;QACzC,0nBAA0C;QAC1C,gHAAoC;QACpC,gHAAoC;IAE1C,IAAe,YAAgC;oKAIL;;IAG1C,YAAU,MAAC,YAAW,uCAAM;IAC5B,YAAU,MAAC,cAAW,2CAAU;IAChC,YAAU,MAAC,cAAW,yCAAQ;;IAG9B,YAAU,MAAC,YAAW,uCAAM;IAC5B,YAAU,MAAC,cAAW,mDAAiB;IACvC,YAAU,MAAC,cAAW,yCAAQ;;gLAOK;;iLAOC;IAEpC,YAAS,mDAAwB;IACjC;mBAAqC;4DACD;sKAIa;IAEjD,YAAS,mDAAwB;IACjC;mBAAqC;4DACD;sKAIa;EAEnD;AAEF;;AAqBA;;;;;;;;;;;;;;;;;;;;;;EAEE;QACO,u5DAAoD;IAGzD,OAAO,MAAC,qBAAkB,mBAAS;IAGnC;;;;;;;;;IAUA;EACF;EAEA;QAEQ,oyBAAuD;QACvD,g4CAA4D;QAC5D,yDAAyB;QACzB,yHAA+C;QAC/C,iDAAwB;QACxB,4QAAiC;IAEvC,IAAe,YAAqC;IAApD,IACe,aAAsC;IADrD,IAEe,iBAA0C;;IAIzD,YAAU,MAAC,YAAW,uCAAM;IAC5B,YAAU,MAAC,cAAW,uCAAM;IAC5B,YAAU,MAAC,cAAW,0CAAS;IAC/B,YAAU,MAAC,UAAW,yCAAQ;IAE9B,eAAY,wDAA6B;8IAI9B;IAEX;+BAAkD;IAClD,oCAAgB,GAAT,eAAE,MAAC,QAAQ,gCAAC;IAEnB,YAAS,iHAAoE;;2HAOT;uHAIjD;sIAGsD;sFAEjB;IAExD;;;;wDAAiF;4DAC7C;EAEtC;AACF","file":"zcl_abapgit_serialize.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_services_basis.clas.testclasses.mjs":{"lineLengths":[91,53,51,27,32,79,37,200,207,242,257,188,67,73,66,73,72,66,70,68,69,60,65,63,64,63,70,67,68,17,42,22,103,131,166,181,111,3,29,64,16,3,17,123,95,3,41,40,37,38,3,34,34,39,43,37,41,37,41,3,41,44,42,37,37,44,3,40,44,43,37,37,41,3,31,162,136,9,140,17,106,29,14,16,7,5,3,34,120,3,38,124,3,32,81,3,35,85,3,31,133,3,36,169,3,38,126,3,37,170,3,35,125,114,3,28,43,3,33,154,3,1,90,29,32,81,62,200,247,437,213,209,17,42,22,103,171,53,3,29,102,70,36,16,3,52,100,26,26,3,49,11,3,52,74,26,3,66,121,40,3,47,1035,70,60,3,53,100,64,3,48,3,42,100,118,19,3,54,309,29,3,55,71,30,3,52,320,19,3,54,320,19,3,47,55,23,3,29,109,54,28,3,1,94,373,64,72,56,24,32,76,57,285,181,179,337,175,237,203,196,17,42,22,188,105,103,122,60,3,29,64,16,3,53,622,66,58,77,91,111,94,116,82,105,76,21,3,53,2173,71,73,74,82,21,3,55,81,103,67,58,102,64,3,49,75,27,3,53,63,72,76,20,3,52,98,49,70,54,85,54,85,129,105,88,109,54,85,128,105,88,109,106,91,129,113,112,129,21,3,59,1040,82,102,64,77,42,84,45,92,44,12,55,5,3,65,363,86,100,31,3,61,123,58,62,64,93,52,79,105,71,85,121,69,79,118,69,79,117,67,73,113,111,94,118,114,103,123,78,91,167,59,100,119,757,103,290,97,123,58,3,57,75,21,3,59,100,309,91,117,112,130,24,3,42,107,69,26,3,34,104,88,48,3,28,102,70,36,3,60,568,72,76,64,64,58,94,124,23,3,60,568,23,3,50,1034,66,58,18,3,58,69,69,67,21,3,61,108,28,3,1,84,269,60,62,106,79,113,70,72],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/routing/zcl_abapgit_services_basis.clas.testclasses.abap"],"names":[],"mappings":";;;AAkHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;8FAGuD;EAEvD;EAGA;uCAE2B;oCACH;qCACC;EAEzB;EAGA;iCAEqB;sCACK;0CACI;oCACN;wCACI;oCACJ;wCACI;EAE5B;EAGA;2CAE+B;yCACF;oCACL;oCACA;2CACO;EAE/B;EAGA;2CAE+B;0CACD;oCACN;oCACA;wCACI;EAE5B;EAGA;;uIAQ4C;IAE1C;MACI,6BAAqB,uGAAwD;;;;;;;IAEjF;EAEF;EAGA;IAEE,oBAAa,sEAAuB,SAAS,MAAC,SAAQ;EAExD;EAGA;IAEE,oBAAa,sEAAuB,SAAS,MAAC,aAAY;EAE5D;EAGA;gFAE+C;EAE/C;EAGA;oFAEmD;EAEnD;EAGA;oIAEwF;EAExF;EAGA;wKAE+E;EAE/E;EAGA;6HAEgF;EAEhF;EAGA;yKAEgF;EAEhF;EAGA;4HAE+E;iHAG/C;EAEhC;EAGA;IAEE,sBAAO,eAAU;EAEnB;EAGA;yJAEsE;EAEtE;AAEF;;AAGA;;;;;;;;;;;;;;;;EAEE;;;IAEE,oBAAa,UAAU;IAEzB;;EAEA;;IACE;IACF;;EAEA;IACE;EACF;EAEA;;IAEA;;EAEA;;IAEA;;EAEA;;;IAEE,cAAS,MAAC,YAAS,sBAAS;EAE9B;EAEA;;;EAEA;EAEA;EAEA;EAEA;;IAEE,YAAU,gCAA0B,GAAnB,+BAAS,MAAC,WAAW,gBAA5B,CAAwC;IAEpD;;EAEA;;IAEA;;EAEA;;IAEA;;EAEA;;IAEA;;EAEA;;IAEA;;EAEA;;IAEA;;EAGA;;IAEE,qBAAmB,cAAS,MAAC,OAAM;IAErC;;AAEF;;;;;;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;IAEA;;EAEA;;;;;;IAEA;;EAEA;;;;;;;EAEA;EAEA;;IAEA;;EAEA;;;;IAEA;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;IAEA;;EAEA;;;;;IAEE,cAAS,MAAC,6BAA0B,sBAAS;IAE7C,IACE,OAEA,KAHG,qBAAL;;MAEI,cAAY,uBAAU;;MAEtB,cAAY,sBAAS;;sDAEO;;EAGlC;EAEA;;;;IAEA;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEA;EAEA;;IAEA;;EAEA;;;;;;;IAEA;;EAEA;;IAEE,mBAAiB,cAAS,MAAC,wBAAuB;IAEpD;;EAEA;;;IAEE,0BAAmB,gBAAgB;EAErC;EAEA;;;IAEE,oBAAa,UAAU;EAEzB;EAEA;;;;;;;;;IAEA;;EAEA;;IAEA;;EAEA;;;;IAEA;;EAEA;;;;IAEA;;EAEA;;IAEA;;AAEF","file":"zcl_abapgit_services_basis.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_sotr_handler.clas.testclasses.mjs":{"lineLengths":[87,53,49,25,32,75,37,25,395,57,67,57,57,17,42,22,3,29,64,16,3,41,120,111,91,72,77,45,9,190,139,185,58,64,7,17,102,14,16,7,5,39,3,25,114,58,431,132,11,294,85,19,108,127,16,18,9,7,5,3,35,124,56,431,142,11,304,81,19,108,127,16,18,9,7,5,3,25,114,58,431,132,11,294,100,127,9,19,108,127,16,18,9,7,5,3,24,431,9,328,83,17,106,125,14,16,7,5,3,1,84,27,70],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/objects/texts/zcl_abapgit_sotr_handler.clas.testclasses.abap"],"names":[],"mappings":";;;AAaA;;;;;;;;;;;;;;;;;;EACE;;;;QACO,+DAAiC;QACjC,oEAA6B;IAElC,sBAAoB,iBAAiB;IACrC;;;;MAQI,yBAAG,wBAA4B;QAC7B,gCAA8B,sBAAS;MACzC;;;;;;IAGJ;IACF;;EACA;QACY,yGAAqE,CAAA;;QAC1E,saAAiD;IACtD,iBAAoD,IAAjD,iFAAmD,uBAAS;MAC7D;qSAQ+B;oFACuB;;;;;;;MAGtD;IACF;EACF;EACA;QACY,mHAAmE,CAAA;;QACxE,saAAiD;IACtD,iBAA8D,IAA3D,2FAA8D,uBAAS;MACxE;+SAQ+B;gFACmB;;;;;;;MAGlD;IACF;EACF;EACA;QACY,yGAAqE,CAAA;;QAC1E,saAAiD;IACtD,iBAAoD,IAAjD,iFAAmD,uBAAS;MAC7D;qSAQ+B;QAC3B,iBAAoB,GAAjB,yBAAO,WAAY,iCAAE;8HACwC;QAChE;;;;;;;MAGJ;IACF;EACF;EACA;QACO,saAAiD;IACtD;uUAQ+B;kFACuB;;;;;;;IAGtD;EACF;AACF","file":"zcl_abapgit_sotr_handler.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_string_buffer.clas.testclasses.mjs":{"lineLengths":[89,53,50,24,32,75,37,25,73,17,42,22,3,29,64,16,3,22,340,3,1,83,26,71],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_string_buffer.clas.testclasses.abap"],"names":[],"mappings":";;;AAUA;;;;;;;;;;;;;;EAEE;mVAIiB;EAEjB;AAEF","file":"zcl_abapgit_string_buffer.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_string_map.clas.testclasses.mjs":{"lineLengths":[83,53,47,20,32,68,37,25,68,50,50,61,17,42,22,3,29,64,16,3,18,130,72,129,121,130,170,184,171,183,78,129,171,183,3,18,130,72,144,9,123,55,17,106,14,16,7,5,9,80,55,17,106,14,16,7,5,9,33,55,17,106,14,16,7,5,3,18,330,330,98,130,130,72,126,121,123,123,72,53,64,9,63,55,17,78,20,187,14,16,7,5,82,61,100,3,28,130,117,126,126,189,189,189,189,3,1,72,331,22,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_string_map.clas.testclasses.abap"],"names":[],"mappings":";;;AAqBA;;;;;;;;;;;;;;;;;EAEE;QAEO,yHAAyC;IAE9C,YAAS,sDAAiC;gIAIvB;wHAIH;iIAII;yKAID;uLAIN;0KAIO;sLAIR;6EAES;gIAIF;0KAIC;sLAIR;EAEd;EAEA;QAEO,yHAAyC;IAE9C,YAAS,sDAAiC;+IAGf;IAE3B;0HAGoB;sDACY;;;;;;IAEhC;IAEA;+EACyB;sDACO;;;;;;IAEhC;IAEA;gCACoB;sDACY;;;;;;IAEhC;EAEF;EAEA;QAEO,iUAA0B;QAC1B,iUAA0B;QAC1B,yFAAwB;QACxB,yHAAyC;QACzC,yHAAyC;IAE9C,YAAS,sDAAiC;6HAIrB;wHAGL;0HAGE;0HAGA;IAElB,YAAY,MAAC,OAAI,yCAAQ;IACzB,YAAY,MAAC,OAAI,sBAAS;IAC1B,YAAY,MAAC,OAAI,iCAAG;IAEpB;8DAC2D;sDAC3B;;;;;;;;IAKhC;IAEA,YAAS,gEAA4B;4DACkB;mGAIjC;EAExB;EAEA;QAEO,yHAAyC;IAC9C,YAAS,mGAAiE;6HAIrD;6HAGA;4LAIO;4LAIA;4LAIA;4LAIA;EAE9B;AAGF","file":"zcl_abapgit_string_map.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_abap.clas.testclasses.mjs":{"lineLengths":[99,85,53,48,32,32,81,37,231,67,58,17,42,22,133,3,29,64,16,3,17,90,3,25,66,111,154,3,1,97,0,0,31,32,80,37,246,67,56,55,56,17,42,22,148,3,29,64,16,3,17,105,3,23,67,71,71,92,382,95,195,3,23,71,207,241,3,24,71,123,196,139,241,3,1,95,0,0,25,32,74,37,853,832,834,174,352,463,464,56,56,56,56,56,56,56,57,17,42,22,756,756,757,3,29,64,16,3,24,67,61,755,524,63,135,88,79,71,204,88,205,89,207,49,73,30,60,234,7,69,5,3,31,46,61,65,67,65,67,524,39,41,41,76,3,31,46,61,65,67,65,67,71,73,524,39,41,41,45,76,3,32,46,61,65,67,65,67,71,73,524,39,41,41,45,77,3,24,67,93,168,169,169,169,169,169,169,219,220,43,3,24,67,84,168,169,169,218,219,219,219,220,220,220,220,220,43,3,24,67,92,168,168,169,169,169,218,218,221,220,219,219,219,220,222,220,221,43,3,24,67,121,168,169,169,169,169,169,169,218,219,219,219,222,219,219,220,220,220,220,220,220,223,220,43,3,24,67,72,168,168,168,168,169,169,169,169,219,218,220,219,220,219,220,219,219,219,221,220,220,220,221,220,43,3,24,67,113,169,169,169,169,169,169,169,169,169,169,169,169,169,169,219,220,221,219,220,221,220,220,220,220,220,221,220,222,220,220,220,221,220,222,220,221,220,221,43,3,24,67,71,168,168,218,218,219,219,219,220,43,3,24,67,81,169,169,220,43,3,1,83,78,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_abap.clas.testclasses.abap"],"names":[],"mappings":";;;;AAeA;;;;;;;;;;;;;;;;EAEE;;EAIA;EAEA;QAEO,yDAAkB;IAEvB,YAAS,6FAAsC;yJAI/B;EAElB;AAEF;;;;AA4BA;;;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;QAGI,0DAAuB;QACvB,8DAAuB;QACvB,8DAAuB;IAEzB,YAAU,0EAAwC;IAElD,sCACE,4FACA,sKAEA,gFAA2C;IAE7C,iBAAc,wEAA8C;kMAIqB;EAEnF;EAEA;QAEO,8DAAuB;IAG5B,iBAAc,wLAEuC;gPAKR;EAE/C;EAEA;QAEO,8DAAuB;IAG5B,iBAAc,oGAAyC;mMAKZ;IAG3C,iBAAc,oHAAwD;gPAK3B;EAE7C;AAEF;;;;AA4CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;QAEQ,0uBAAwD;QACxD,mgBAA0C;QAC1C,sDAAqB;QACrB,8HAAkD;;IAIxD,oBAAiB,qDAAgC;IAEjD;2MAI+E;uFAGrB;4MAIsB;wFAM/C;8MAIgD;IAGjF,YAAU,+BAAC;;;MAET,iBAAmB,GAAhB,QAAQ,MAAC,SAAU,QAAO;yOAGgE;MAC7F;MACA,YAAkB,mBAAR,QAAU,QAAQ,MAAC,QAAM;IACrC;EAEF;EAEA;;;;;;;QACO,mgBAA+C;IAEpD,QAAQ,MAAC,WAAW,QAAQ;IAC5B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,YAAW,SAAS;IAC7B,gCAAO,kBAAY,mBAAc;EACnC;EAEA;;;;;;;;;QACO,mgBAA+C;IAEpD,QAAQ,MAAC,WAAW,QAAQ;IAC5B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,cAAW,WAAW;IAC/B,gCAAO,kBAAY,mBAAc;EACnC;EAEA;;;;;;;;;QACO,mgBAA+C;IAEpD,QAAQ,MAAC,WAAW,QAAQ;IAC5B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,cAAW,WAAW;IAC/B,gCAAO,kBAAY,oBAAe;EACpC;EAKA;QAEO,0DAAmB;IAExB,YAAU,2EAAyC;uKAKpB;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;0NAOG;2NAMC;0CAEjB;EAEpB;EAKA;QAEO,0DAAmB;IAExB,YAAU,kEAAgC;uKAKX;wKAGA;wKAGA;yNAMG;0NAIA;0NAIA;0NAMC;2NAIA;2NAIA;2NAIA;2NAIA;2NAIA;0CAEjB;EAEpB;EAKA;QAEO,0DAAmB;IAGxB,YAAU,0EAAwC;uKAKnB;uKAGA;wKAGA;wKAGA;wKAGA;yNAMG;yNAIA;4NAIE;2NAIF;0NAMC;0NAIA;0NAIA;2NAIA;6NAIE;2NAIF;4NAIA;0CAEjB;EAEpB;EAKA;QAEO,0DAAmB;IAExB,YAAU,uGAAqE;uKAKhD;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;yNAMG;0NAIA;0NAIA;0NAIA;6NAIE;0NAMD;0NAIA;2NAIA;2NAIA;2NAIA;2NAIA;2NAIA;2NAIA;8NAIE;2NAIF;0CAEjB;EAEpB;EAKA;QAEO,0DAAmB;IAExB,YAAU,sDAAoB;uKAKC;uKAGA;uKAGA;uKAGA;wKAGA;wKAGA;wKAGA;wKAGA;0NAMI;yNAID;2NAIC;0NAID;2NAIC;0NAMA;2NAIC;0NAID;0NAIA;0NAIA;4NAIC;2NAID;2NAIA;2NAIA;4NAIC;2NAID;0CAEjB;EAEpB;EAKA;QAEO,0DAAmB;IAExB,YAAU,+FAA6D;wKAKxC;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;0NAMG;2NAIC;4NAIC;0NAIF;2NAIC;4NAIC;2NAID;2NAIA;2NAMA;2NAIA;2NAIA;4NAIC;2NAID;6NAIE;2NAIF;2NAIA;2NAIA;4NAIC;2NAID;6NAIE;2NAIF;4NAIC;2NAID;4NAIC;0CAElB;EAEpB;EAKA;QAEO,0DAAmB;IAExB,YAAU,qDAAmB;uKAKE;uKAIA;yNAMG;yNAIA;0NAMC;0NAIA;0NAIA;2NAIA;0CAEjB;EAEpB;EAKA;QAEO,0DAAmB;IAExB,YAAU,+DAA6B;wKAKR;wKAGA;2NAMI;0CAEjB;EAEpB;AAEF","file":"zcl_abapgit_syntax_abap.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_json.clas.testclasses.mjs":{"lineLengths":[99,85,53,48,32,32,81,37,231,67,53,53,54,17,42,22,133,3,29,64,16,3,17,90,3,21,273,3,21,379,3,21,244,3,1,97,34,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap"],"names":[],"mappings":";;;;AAiBA;;;;;;;;;;;;;;;;;;EAEE;;EAIA;EAEA;gRAGqF;EACrF;EAEA;0XAIsD;EACtD;EAEA;mPAGwD;EACxD;AAEF","file":"zcl_abapgit_syntax_json.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_syntax_xml.clas.testclasses.mjs":{"lineLengths":[99,83,53,47,31,32,79,37,229,67,64,60,73,60,53,59,71,64,17,42,22,131,3,29,64,16,3,17,89,3,32,223,3,28,234,3,41,236,3,28,990,3,27,523,521,3,21,231,615,3,39,782,3,31,245,89,234,3,1,94,0,0,25,32,73,37,853,832,834,174,352,463,464,55,55,55,55,55,55,55,55,56,17,42,22,756,756,757,3,29,64,16,3,24,67,61,755,524,63,133,87,79,71,205,88,206,89,208,49,73,30,60,234,7,69,5,3,31,46,61,65,67,65,67,524,39,41,41,76,3,31,46,61,65,67,65,67,71,73,524,39,41,41,45,76,3,32,46,61,65,67,65,67,71,73,524,39,41,41,45,77,3,23,67,69,168,168,168,169,219,219,220,219,220,43,3,23,67,59,168,168,219,220,43,3,23,67,78,168,169,169,169,219,219,219,220,220,220,220,220,221,43,3,23,67,75,168,168,169,169,219,218,219,220,220,219,220,220,221,43,3,23,67,101,168,168,169,169,169,169,169,169,169,219,218,219,219,219,220,220,220,219,220,220,220,220,220,221,220,221,43,3,23,67,72,168,168,169,219,218,219,220,219,220,220,43,3,23,67,79,168,169,169,169,219,219,219,220,220,220,220,220,221,43,3,23,67,71,168,169,218,219,219,219,220,43,3,23,67,78,168,169,169,169,219,219,219,220,220,220,220,220,221,43,3,1,82,52,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/syntax/zcl_abapgit_syntax_xml.clas.testclasses.abap"],"names":[],"mappings":";;;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;EAEE;;EAIA;EAEA;8NAIuC;EAEvC;EAEA;yOAI2C;EAE3C;EAEA;2OAI4C;EAE5C;EAEA;69BAWsG;EAEtG;EAEA;0gBAOiE;wgBAOD;EAEhE;EAEA;sOAI2C;smBAQ0B;EAErE;EAEA;6wBAS6G;EAE7G;EAEA;oPAIkD;;yOAOP;EAE3C;AAEF;;;;AA6CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;QAEQ,0uBAAuD;QACvD,mgBAA0C;QAC1C,sDAAqB;QACrB,4HAAiD;;IAIvD,oBAAiB,qDAAgC;IAEjD;4MAIgF;uFAGtB;6MAIuB;wFAMhD;+MAIiD;IAGlF,YAAU,+BAAC;;;MAET,iBAAmB,GAAhB,QAAQ,MAAC,SAAU,QAAO;yOAGgE;MAC7F;MACA,YAAkB,mBAAR,QAAU,QAAQ,MAAC,QAAM;IACrC;EAEF;EAEA;;;;;;;QACO,mgBAA8C;IAEnD,QAAQ,MAAC,WAAW,QAAQ;IAC5B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,YAAW,SAAS;IAC7B,gCAAO,kBAAY,mBAAc;EACnC;EAEA;;;;;;;;;QACO,mgBAA8C;IAEnD,QAAQ,MAAC,WAAW,QAAQ;IAC5B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,cAAW,WAAW;IAC/B,gCAAO,kBAAY,mBAAc;EACnC;EAEA;;;;;;;;;QACO,mgBAA8C;IAEnD,QAAQ,MAAC,WAAW,QAAQ;IAC5B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,YAAW,SAAS;IAC7B,QAAQ,MAAC,cAAW,WAAW;IAC/B,gCAAO,kBAAY,oBAAe;EACpC;EAKA;QAEO,0DAAmB;IAExB,YAAU,mDAAiB;uKAKI;uKAGA;uKAGA;wKAGA;0NAOI;0NAIA;2NAMC;0NAID;2NAIC;0CAElB;EAEpB;EAEA;QAEO,0DAAmB;IAExB,YAAU,yCAAQ;uKAKa;uKAGA;0NAMI;2NAKC;0CAElB;EAEpB;EAEA;QAEO,0DAAmB;IAExB,YAAU,4DAA0B;uKAKL;wKAGC;wKAGD;wKAGA;0NAMI;0NAID;0NAIA;2NAIC;2NAMC;2NAID;2NAIA;2NAIA;4NAIC;0CAElB;EAEpB;EAEA;QAEO,0DAAmB;IAExB,YAAU,yDAAuB;uKAKF;uKAGA;wKAGA;wKAGA;0NAMI;yNAID;0NAIA;2NAIC;2NAMC;0NAID;2NAIA;2NAIA;4NAIC;0CAElB;EAEpB;EAEA;QAEO,0DAAmB;IAExB,YAAU,mFAAiD;uKAK5B;uKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;wKAGA;0NAMI;yNAID;0NAIA;0NAIA;0NAIA;2NAIC;2NAIA;2NAMC;0NAID;2NAIA;2NAIA;2NAIA;2NAIA;2NAIA;4NAIC;2NAID;4NAIC;0CAElB;EAEpB;EAEA;QACO,0DAAmB;IAGxB,YAAU,sDAAoB;uKAKC;uKAGA;wKAGA;0NAMI;yNAID;0NAIA;2NAME;0NAID;2NAIA;2NAIA;0CAEjB;EAEpB;EAEA;QAEO,0DAAmB;IAGxB,YAAU,6DAA2B;uKAKN;wKAGC;wKAGD;wKAGA;0NAMI;0NAID;0NAIA;2NAIC;2NAMC;2NAID;2NAIA;2NAIA;4NAIC;0CAElB;EAEpB;EAEA;QAEO,0DAAmB;IAGxB,YAAU,qDAAmB;uKAKE;wKAGA;yNAMG;0NAIA;0NAMC;0NAIA;2NAIA;0CAEjB;EAEpB;EAEA;QAEO,0DAAmB;IAExB,YAAU,4DAA0B;uKAKL;wKAGC;wKAGD;wKAGA;0NAMI;0NAID;0NAIA;2NAIC;2NAMC;2NAID;2NAIA;2NAIA;4NAIC;0CAElB;EAEpB;AAEF","file":"zcl_abapgit_syntax_xml.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_timer.clas.testclasses.mjs":{"lineLengths":[73,53,42,18,32,61,37,25,289,53,64,64,17,42,22,3,29,64,16,3,29,69,67,68,64,55,170,3,21,122,91,88,135,3,32,122,134,88,145,137,88,149,3,31,68,27,122,110,88,167,3,1,63,20,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_timer.clas.testclasses.abap"],"names":[],"mappings":";;;AAiBA;;;;;;;;;;;;;;;;;EAEE;;;;;;yKAM8C;EAE9C;EAEA;QAEO,iHAAsC;IAE3C,cAAW,uEAAsC;;sIAMf;EAEpC;EAEA;QAEO,iHAAsC;IAE3C,cAAW,kHAAmD;;gJAMlB;IAE5C,cAAW,qHAAsD;;oJAMjB;EAElD;EAEA;QAEY,2DAAmC,CAAA;;QAExC,iHAAsC;IAE3C,cAAW,0FAA+C;;sKAMX;EAEjD;AACF","file":"zcl_abapgit_timer.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_transport_objects.clas.testclasses.mjs":{"lineLengths":[97,53,54,30,32,85,37,256,902,1450,3765,200,84,71,71,69,71,74,68,73,73,73,73,73,70,70,69,49,433,639,1847,56,1305,184,290,75,17,42,22,159,826,1374,3689,123,3,29,64,16,3,17,86,3,34,1198,154,309,332,30,73,3,39,1198,154,312,332,30,73,3,38,1203,1202,154,312,311,337,335,30,78,77,3,39,171,247,48,3,37,154,247,327,153,3,39,190,247,174,3,42,190,250,174,3,36,190,364,30,163,3,37,190,364,363,30,163,162,3,41,189,364,48,3,41,189,364,48,3,41,189,364,48,3,41,189,364,48,3,41,189,364,48,3,38,191,364,170,3,43,71,73,71,73,103,70,606,56,54,54,93,3,40,71,73,71,73,71,73,67,61,94,67,1064,53,53,53,45,49,88,3,37,1198,71,73,71,73,71,73,67,61,67,61,61,61,61,53,53,95,25,3,24,159,164,3,42,1198,79,1992,65,418,408,27,291,88,186,5,3,47,72,76,134,9,32,126,17,106,28,140,14,16,7,5,3,47,71,73,67,61,1992,65,174,144,27,87,88,160,5,3,42,134,9,32,17,106,28,132,14,16,7,5,3,1,99,32,75],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/cts/zcl_abapgit_transport_objects.clas.testclasses.abap"],"names":[],"mappings":";;;AA8DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;QACO,qqCAAwD;yJAInC;oTAMgC;IAE1D,mBAAgB,mTAKQ;6BAET;wEAE2B;EAC5C;EACA;QACO,qqCAAwD;yJAGnC;uTAMmC;IAE7D,mBAAgB,mTAKQ;6BAET;wEAE2B;EAC5C;EACA;QAEO,0qCAA6D;QAC7D,yqCAA6D;yJAIxC;uTAMmC;sTAMA;IAE7D,wBAAqB,mTAKG;IAExB,uBAAoB,kTAKI;6BAET;6EAEgC;4EACD;EAChD;EACA;0KAG4B;sPAKgC;+CAEzB;EAEnC;EAEA;yJAI4B;sPAKgC;sUAOlC;wJACiE;EAC3F;EAEA;6LAI+B;sPAK6B;6KAEoD;EAChH;EAEA;6LAI+B;yPAKgC;6KAEiD;EAChH;EAEA;6LAI+B;2WAO+B;6BAE7C;kKAIY;EAC7B;EAEA;6LAK+B;2WAO+B;0WAOA;6BAE7C;kKAIY;iKAIA;EAC7B;EAEA;4LAIiC;2WAO6B;+CAE3B;EACnC;EAEA;4LAIiC;2WAO6B;+CAE3B;EACnC;EAEA;4LAIiC;2WAO6B;+CAE3B;EACnC;EAEA;4LAIiC;2WAO6B;+CAE3B;EACnC;EAEA;4LAIiC;2WAO6B;+CAE3B;EACnC;EAEA;8LAIiC;2WAO6B;yKAE8C;EAC5G;EAEA;;;;;;;QACO,qlBAA0D;IAC/D,mBAAmB,MAAC,cAAW,WAAW;IAC1C,mBAAmB,MAAC,YAAW,WAAW;IAC1C,mBAAmB,MAAC,aAAW,UAAU;IACzC,gCAAO,6BAAuB,yBAAoB;EACpD;EAEA;;;;;;;;;;;QACO,+hCAAwD;IAC7D,gBAAgB,MAAC,cAAW,WAAW;IACvC,gBAAgB,MAAC,cAAW,WAAW;IACvC,gBAAgB,MAAC,cAAW,WAAW;IACvC,gBAAgB,MAAC,UAAW,OAAO;IACnC,gBAAgB,MAAC,YAAW,SAAS;IACrC,gCAAO,0BAAqB,uBAAkB;EAChD;EAEA;;;;;;;;;;;;IACE,aAAa,MAAC,KAAI,MAAC,cAAW,WAAW;IACzC,aAAa,MAAC,KAAI,MAAC,cAAW,WAAW;IACzC,aAAa,MAAC,KAAI,MAAC,cAAW,WAAW;IACzC,aAAa,MAAC,KAAI,MAAC,UAAW,OAAO;IACrC,aAAa,MAAC,KAAI,MAAC,UAAW,OAAO;IACrC,gCAAO,uBAAiB,qBAAgB,MAAC,MAAK;IAChD;;EAEA;;mKAO6C;EAC7C;EAEA;;;QACQ,+7DAA2D;IACjE,uBAAoB,oCAAoB;IAExC;;;iSAKuD;IACvD,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;yLAC0E;IAC1F;EACF;EAEA;;;QACQ,6HAA8C;IAEpD;+BACmB;6HAC4C;;;;;;;;IAK/D;EACF;EAEA;;;;;QAEQ,+7DAA2D;IAEjE,uBAAoB,oCAAoB;IAExC;;;qFAG0B;IAC1B,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;+JAC4D;IAC5E;EACF;EAEA;QACQ,6HAA8C;IAEpD;+BACmB;;;;;;;;IAGnB;EACF;AAEF","file":"zcl_abapgit_transport_objects.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_ui_injector.clas.testclasses.mjs":{"lineLengths":[85,91,53,48,32,32,81,57,196,22,17,42,22,122,3,29,64,16,3,53,622,66,58,77,91,111,94,116,82,105,76,21,3,53,2173,71,73,74,82,21,3,55,81,103,67,58,102,64,3,49,75,27,3,52,98,49,70,54,85,54,85,129,105,88,109,54,85,128,105,88,109,106,91,129,113,112,129,21,3,59,1040,82,102,64,3,65,363,86,100,31,3,61,123,58,62,64,93,52,79,105,71,85,121,69,79,118,69,79,117,67,73,113,111,94,118,114,103,123,78,91,167,59,100,119,757,103,290,97,123,58,3,57,75,21,3,59,100,309,91,117,112,130,24,3,53,63,72,76,20,3,60,568,72,76,64,64,58,94,124,23,3,60,568,23,3,50,1034,66,58,18,3,58,69,69,67,21,3,61,108,28,3,1,97,114,87,36,32,85,37,25,75,17,42,22,3,29,64,16,3,24,129,130,79,141,172,3,1,105,37,32,86,37,25,67,61,17,42,22,3,29,64,16,3,17,178,123,90,3,28,129,130,79,141,214,3,1,107,95,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap"],"names":[],"mappings":";;;;AA4BA;;;;;;;;;;;;;;;EAEE;;;;;;;;;;;;IAEA;;EAEA;;;;;;IAEA;;EAEA;;;;;;;EAEA;EAEA;;IAEA;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;IAEA;;EAEA;;;;;EAEA;EAEA;;;;IAEA;;EAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEA;EAEA;;IAEA;;EAEA;;;;;;;IAEA;;EAEA;;;;IAEA;;EAEA;;;;;;;;;IAEA;;EAEA;;IAEA;;EAEA;;;;IAEA;;EAEA;;;;IAEA;;EAEA;;IAEA;;AAEF;;;;AAEA;;;;;;;;;;;;;;EAEE;QAEQ,wHAA6C;QAC7C,yHAA6C;IAEnD,eAAY,0DAAqC;+BAEjD,iBAAkB,2FAAuD;2KAIlC;EAEzC;AAEF;;AAEA;;;;;;;;;;;;;;;EAEE;QAEQ,yKAAmD;;yFAIJ;EAEvD;EAEA;QAEQ,wHAA6C;QAC7C,yHAA6C;IAEnD,eAAY,0DAAqC;+BAEjD,iBAAkB,2FAAuD;qNAIlC;EAEzC;AAEF","file":"zcl_abapgit_ui_injector.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_url.clas.testclasses.mjs":{"lineLengths":[69,53,40,17,32,58,37,25,71,54,54,54,54,54,57,57,57,57,62,70,54,57,57,58,17,42,22,3,29,64,16,3,22,9,111,55,17,106,14,16,7,5,3,21,67,146,137,3,22,67,146,124,3,22,67,160,121,3,22,67,143,124,3,22,67,144,125,3,22,67,144,125,3,25,74,162,160,3,25,74,178,176,3,25,74,159,160,3,25,74,158,160,3,30,74,167,169,3,38,74,171,169,3,25,9,136,17,106,57,14,16,7,5,3,25,9,137,17,106,57,14,16,7,5,3,25,9,135,55,17,106,14,16,7,5,3,1,59,19,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/http/zcl_abapgit_url.clas.testclasses.abap"],"names":[],"mappings":";;;AAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;IAEE;8GAC6C;sDACb;;;;;;IAEhC;EAEF;EAEA;QAEQ,0DAAmB;IAEzB,aAAU,+HAA+D;wIAItD;EAErB;EAEA;QAEQ,0DAAmB;IAEzB,aAAU,+HAA+D;2HAItD;EAErB;EAEA;QAEQ,0DAAmB;IAEzB,aAAU,6IAA6E;wHAIpE;EAErB;EAEA;QAEQ,0DAAmB;IAEzB,aAAU,4HAA4D;2HAInD;EAErB;EAEA;QAEQ,0DAAmB;IAEzB,aAAU,6HAA6D;4HAIpD;EAErB;EAEA;QAEQ,0DAAmB;IAEzB,aAAU,6HAA6D;4HAIpD;EAErB;EAEA;QAGI,iEAA0B;IAE5B,oBAAiB,wIAAwE;+JAI/D;EAE5B;EAEA;QAGI,iEAA0B;IAE5B,oBAAiB,wJAAwF;+KAI/E;EAE5B;EAEA;QAGI,iEAA0B;IAE5B,oBAAiB,qIAAqE;+JAI5D;EAE5B;EAEA;QAGI,iEAA0B;IAE5B,oBAAiB,oIAAoE;+JAI3D;EAE5B;EAEA;QAGI,iEAA0B;IAE5B,oBAAiB,6IAA6E;wKAIpE;EAE5B;EAEA;QAGI,iEAA0B;IAE5B,oBAAiB,iJAAiF;wKAIxE;EAE5B;EAGA;IAEE;uIACsE;;;;;;;IAGtE;EAEF;EAEA;IAEE;wIACuE;;;;;;;IAGvE;EAEF;EAEA;IAEE;sIACqE;sDACrC;;;;;;IAEhC;EAEF;AAGF","file":"zcl_abapgit_url.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_user_record.clas.testclasses.mjs":{"lineLengths":[85,53,48,0,0,24,32,73,37,181,80,17,42,22,54,3,29,64,16,3,29,140,58,127,304,3,1,81,91,48,26,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_user_record.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAeA;;;;;;;;;;;;;;;EAEE;QACQ,mIAAkD;yDAEvB;IACjC,oBAAiB,qGAAqD;+SAKd;EAC1D;AAEF","file":"zcl_abapgit_user_record.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_utils.clas.testclasses.mjs":{"lineLengths":[73,53,42,22,32,65,37,146,128,152,187,82,67,59,159,55,62,70,69,62,58,62,17,42,22,38,44,76,110,3,29,64,16,3,29,46,3,36,77,78,3,32,36,43,36,3,35,44,43,36,3,27,29,43,32,3,27,67,61,117,3,23,4691,3,30,1637,3,38,74,29,1786,3,37,114,3,30,120,3,26,119,3,1,71,55,58,41,24,63],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_utils.clas.testclasses.abap"],"names":[],"mappings":";;;AAsCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;;;;IAEE,yBAAW,uCAAwB,OAAO;IAC1C,4BAAW,uCAAwB,KAAK;EAE1C;EAEA;mCAEuB;0CACO;mCACP;EAEvB;EAGA;2CAE+B;0CACD;mCACP;EAEvB;EAGA;4BAEgB;0CACc;+BACX;EAEnB;EAGA;;;IAEE,wBAAgB,uFAAsD;EAExE;EAGA;IAEE,wBACI,qjJAkC6E;EAEnF;EAGA;omDAiBmB;EAEnB;EAGA;QAEY,iEAAsC,CAAA;;yvDAgB3B;EAEvB;EAEA;IAEE,2BAAmB,iFAA6C;EAElE;EAGA;uHAIsB;EAEtB;EAGA;sHAIqB;EAErB;AAEF","file":"zcl_abapgit_utils.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_version.clas.testclasses.mjs":{"lineLengths":[77,53,44,0,0,20,32,65,37,25,80,51,54,17,42,22,3,29,64,16,3,30,70,32,70,145,199,3,19,65,173,208,37,173,209,37,173,208,3,21,229,230,223,220,3,1,69,22,65],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/utils/zcl_abapgit_version.clas.testclasses.abap"],"names":[],"mappings":";;;;;AAcA;;;;;;;;;;;;;;;;EAEE;QAEQ,6DAAmC,CAAA;;QACnC,6DAAqB;IAE3B,oBAAiB,uHAAoD;sMAI6B;EAEpG;EAEA;QAEO,wDAAgB;IAGrB,eAAY,wJACgD;+MAImC;IAE/F,sBAAO,SAAS;IAGhB,eAAY,wJACgD;gNAImC;IAE/F,sBAAO,SAAS;IAGhB,eAAY,wJACgD;+MAImC;EAEjG;EAEA;oOAIqB;qOAIA;8NAIP;2NAIA;EAEd;AAEF","file":"zcl_abapgit_version.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml.clas.testclasses.mjs":{"lineLengths":[69,53,40,0,49,32,66,37,25,22,17,12,42,22,3,29,64,16,3,1,75,16,32,57,37,247,67,66,66,62,135,266,17,42,22,149,3,29,64,16,3,17,105,3,26,44,55,66,493,52,3,34,71,69,67,48,94,158,3,27,66,67,61,124,127,144,98,115,148,54,18,3,34,66,130,67,444,9,54,118,17,106,24,66,137,14,16,7,5,3,30,66,130,67,528,9,54,118,17,106,24,66,134,14,16,7,5,3,1,57,37,61],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/xml/zcl_abapgit_xml.clas.testclasses.abap"],"names":[],"mappings":";;;;AAQA;;;;;;;;;;;;;;;AACA;;AA8BA;;;;;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;;;QAEO,yDAAkB;IAEvB,gYAES,uGAC8B;mDAEP;EAElC;EAEA;QAEQ,8DAAuB;QACvB,4DAAuB;IAE7B,gBAAc,6CAAgB;+CAEN;IAExB,eAAY,yEAAmB;6JAIF;EAE/B;EAEA;;;;QAIQ,mHAA4C;QAC5C,sHAA6C;QAC7C,uIAAmD;IAEzD,sBAAmB,sEAAyC;IAE5D,gBAAa,6FAAkD;IAE/D,iBAAc,6HAEmB;qDAEX;IAExB;;EAEA;QAEQ,yDAAoB;QACpB,yHAA0C;QAC1C,0DAAoB;IAE1B,sbAGuC;IAEvC;qDACoC;qHACyB;;;;;;;;;IAO7D;EAEF;EAEA;QAEQ,yDAAoB;QACpB,yHAA0C;QAC1C,0DAAoB;IAE1B,0gBAGuC;IAEvC;qDACoC;qHACyB;;;;;;;;;IAO7D;EAEF;AAEF","file":"zcl_abapgit_xml.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_input.clas.testclasses.mjs":{"lineLengths":[69,81,53,46,16,32,63,37,25,64,49,49,53,49,17,42,22,3,29,64,16,3,17,66,130,234,776,101,122,124,3,17,233,303,66,130,133,34,87,122,72,101,121,108,108,3,14,233,303,66,130,133,58,63,87,122,72,101,121,108,108,3,16,233,303,66,130,133,58,63,58,87,122,72,101,121,108,108,3,21,868,66,130,1276,101,135,137,143,3,1,63,234,304,18,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/xml/zcl_abapgit_xml_input.clas.testclasses.abap"],"names":[],"mappings":";;;;AAwBA;;;;;;;;;;;;;;;;;;EAEE;QAEO,yDAAoB;QACpB,yHAA0C;QAC1C,iOAAoB;IAEzB,kwBASc;;yHAOoD;2HAIvD;EAEb;EAEA;QAEQ,gOAAqB;QACrB,sSAAqB;QACrB,yDAAqB;QACrB,yHAA2C;QAC3C,4HAA4C;IAGlD,sBAAM,MAAM;;yHAI6C;IACzD,YAAS,sDAA2C;;wHAMa;2GAI7C;2GAIA;EAEtB;EAEA;QAEQ,gOAAqB;QACrB,sSAAqB;QACrB,yDAAqB;QACrB,yHAA2C;QAC3C,4HAA4C;IAGlD,MAAM,MAAC,SAAM,+BAAC;IACd,MAAM,MAAC,SAAM,oCAAG;;yHAIyC;IACzD,YAAS,sDAA2C;;wHAMa;2GAI7C;2GAIA;EAEtB;EAEA;QAEQ,gOAAqB;QACrB,sSAAqB;QACrB,yDAAqB;QACrB,yHAA2C;QAC3C,4HAA4C;IAGlD,MAAM,MAAC,SAAM,+BAAC;IACd,MAAM,MAAC,SAAM,oCAAG;IAChB,MAAM,MAAC,SAAM,+BAAC;;yHAI2C;IACzD,YAAS,sDAA2C;;wHAMa;2GAI7C;2GAIA;EAEtB;EAEA;QAEO,21BAA6B;QAC7B,yDAAyB;QACzB,yHAA+C;IAEpD,svCAcc;;sIAO0D;wIAI3D;8IAIG;EAElB;AAEF","file":"zcl_abapgit_xml_input.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_output.clas.testclasses.mjs":{"lineLengths":[69,83,53,47,0,0,23,32,71,37,25,79,62,17,42,22,3,29,64,16,3,29,256,257,68,128,133,65,65,87,124,145,75,38,145,75,38,93,3,29,256,68,66,133,133,136,86,72,68,65,65,433,155,87,124,72,128,155,59,66,78,84,121,57,90,3,1,78,262,25,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/xml/zcl_abapgit_xml_output.clas.testclasses.abap"],"names":[],"mappings":";;;;;;AAkBA;;;;;;;;;;;;;;;EAEE;QAEQ,uPAA0B;QAC1B,wPAA0B;QAC1B,2DAA0B;QAC1B,uHAA0C;QAC1C,4HAAiD;IAEvD,QAAQ,MAAC,SAAM,oCAAG;IAClB,QAAQ,MAAC,SAAM,oCAAG;;2HAIkB;IAEpC,oBAAiB,uHAA8C;IAC/D,cAAW,uDAA4B;IACvC,SAAS,MAAC,SAAM,QAAQ;IACxB,oBAAiB,uHAA8C;IAC/D,cAAW,uDAA4B;IACvC,SAAS,MAAC,SAAM,QAAQ;4FAIL;EAErB;EAEA;QAEQ,uPAA8B;QAC9B,2DAA8B;QAC9B,yDAA8B;QAC9B,4HAAqD;QACrD,4HAAiD;QACjD,+HAAkD;QAClD,6EAAqC;QACrC,+DAA+B;QAC/B,2DAA+B;IAErC,QAAQ,MAAC,SAAM,oCAAG;IAClB,QAAQ,MAAC,SAAM,oCAAG;IAElB,oCACE,wGAAA,sGAAA,yFAAA,gGAG4D;IAE9D,oJAA+E;;2HAIpB;IAE3D,YAAS,sDAA2C;IAEpD,iBAAc,yGAA4C;IAE1D,wBAAqB,6HAEA;0DAEuB;IAE5C,gBAAa,4CAAiC;IAE9C,WAAS,uCAAwB,sBAAsB;IACvD,sCAAY,QAAO,qBAAgB,UAAuB;IAE1D,uBAAoB,4FAEK;wDAE2B;yFAIlC;EAEpB;AAEF","file":"zcl_abapgit_xml_output.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_xml_pretty.clas.testclasses.mjs":{"lineLengths":[83,53,47,17,32,65,37,229,67,51,51,51,56,61,53,17,42,22,131,3,29,64,16,3,17,89,3,19,69,110,52,165,3,19,69,111,52,171,3,19,69,122,52,187,3,24,69,101,123,3,29,9,129,55,17,106,15,14,16,7,5,3,20,69,159,52,178,3,1,66,19,68],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/xml/zcl_abapgit_xml_pretty.clas.testclasses.abap"],"names":[],"mappings":";;;AAqBA;;;;;;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;QAEO,4DAAqB;IAE1B,eAAY,yFAA8B;IAC1C,cAAY,gCAAW;oKAIsC;EAE/D;EAEA;QAEO,4DAAqB;IAE1B,eAAY,0FAA+B;IAC3C,cAAY,gCAAW;0KAI4C;EAErE;EAEA;QAEO,4DAAqB;IAE1B,eAAY,qGAA0C;IACtD,cAAY,gCAAW;0LAI4D;EAErF;EAEA;QAEO,4DAAqB;IAE1B,eAAY,gFAAsB;0HAInB;EAEjB;EAEA;IAEE;gIAGqC;sDACL;;;;;;;IAGhC;EAEF;EAEA;QAEO,4DAAqB;IAE1B,eAAY,0IAEe;IAE3B,cAAY,gCAAW;iLAImD;EAE5E;AAEF","file":"zcl_abapgit_xml_pretty.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib.clas.testclasses.mjs":{"lineLengths":[71,53,41,17,32,59,37,25,67,58,59,51,59,17,42,22,3,29,64,16,3,17,295,68,47,75,66,101,91,99,3,26,295,68,43,75,60,101,91,99,3,26,295,75,72,109,144,101,91,103,3,27,295,75,72,404,311,101,91,103,3,19,295,75,72,6270,4463,101,91,103,3,1,60,19,62],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zlib/zcl_abapgit_zlib.clas.testclasses.abap"],"names":[],"mappings":";;;AAgBA;;;;;;;;;;;;;;;;;;EAEE;QAEQ,8RAA4C;QAGhD,2DAA+D,CAAA;;QAC/D,kEAA2E,CAAA;;IAG7E,aAAU,kFAA6C;0FAED;kGAEJ;EAEpD;EAEA;QAEQ,8RAA4C;QAGhD,2DAA2D,CAAA;;QAC3D,kEAAqE,CAAA;;IAGvE,aAAU,kFAA6C;0FAED;kGAEJ;EAEpD;EAEA;QAEQ,8RAAkD;QAClD,kEAA0B;QAC1B,+DAA0B;IAGhC,uGAAwE;IAExE,gBAAa,0HAA4D;IAEzE,aAAU,kFAA6C;0FAED;sGAEA;EAExD;EAEA;QAEQ,8RAAkD;QAClD,kEAA0B;QAC1B,+DAA0B;IAGhC,8YAGU;IAEV,gBAAa,iSAE2D;IAExE,aAAU,kFAA6C;0FAED;sGAEA;EAExD;EAEA;QAEQ,8RAAkD;QAClD,kEAA0B;QAC1B,+DAA0B;IAGhC,wnMAiE4C;IAE5C,gBAAa,y1IA8CuC;IAEpD,aAAU,kFAA6C;0FAED;sGAEA;EAExD;AAEF","file":"zcl_abapgit_zlib.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_convert.clas.testclasses.mjs":{"lineLengths":[87,53,49,17,32,67,37,233,67,55,55,55,17,42,22,135,3,29,64,16,3,17,91,3,23,65,108,116,3,23,67,106,135,3,22,68,97,119,3,1,68,19,70],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zlib/zcl_abapgit_zlib_convert.clas.testclasses.abap"],"names":[],"mappings":";;;AAkBA;;;;;;;;;;;;;;;;;;EAEE;;EAEA;EAEA;QAEQ,wDAAgB;IAEtB,eAAY,uFAA4B;mHAI7B;EAEb;EAEA;QAEQ,0DAAmB;IAEzB,aAAU,uFAA6B;sIAIX;EAE9B;EAEA;QAEQ,2DAAmB;IAEzB,YAAS,+EAAwB;sHAInB;EAEhB;AAEF","file":"zcl_abapgit_zlib_convert.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_huffman.clas.testclasses.mjs":{"lineLengths":[87,53,49,17,32,67,37,25,69,52,17,42,22,3,29,64,16,3,19,138,284,59,61,65,53,92,5,50,114,3,19,138,284,59,62,65,53,92,5,50,59,62,65,53,92,5,50,59,61,65,53,92,5,50,59,60,65,53,92,5,50,114,3,1,68,19,70],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zlib/zcl_abapgit_zlib_huffman.clas.testclasses.abap"],"names":[],"mappings":";;;AAQA;;;;;;;;;;;;;;;EAEE;QAEO,iIAA+C;QAC/C,mRAAoD;;;;;MAIvD,gCAAO,yCAAK,UAAU;IACxB;;;EAMF;EAEA;QAEO,iIAA+C;QAC/C,mRAAoD;;;;;MAIvD,gCAAO,yCAAK,UAAU;IACxB;;;;;;MAEE,gCAAO,yCAAK,UAAU;IACxB;;;;;;MAEE,gCAAO,yCAAK,UAAU;IACxB;;;;;;MAEE,gCAAO,yCAAK,UAAU;IACxB;;;EAOF;AAEF","file":"zcl_abapgit_zlib_huffman.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_zlib_stream.clas.testclasses.mjs":{"lineLengths":[85,53,48,17,32,66,37,25,67,17,42,22,3,29,64,16,3,16,135,68,62,67,70,147,97,126,58,119,95,114,99,123,3,1,67,19,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/git/zlib/zcl_abapgit_zlib_stream.clas.testclasses.abap"],"names":[],"mappings":";;;AAWA;;;;;;;;;;;;;;EAEE;QAEQ,8HAAgD;QAChD,2DAAmB;QACnB,qDAAmB;QACnB,0DAAwB;QACxB,6DAAyB;;IAO/B,aAAU,8EAAyB;6HAIf;IAEpB,kBAAe,kCAAuB;sHAI3B;IAEX,YAAS,6EAAwB;iHAIrB;IAEZ,cAAW,+EAA0B;0HAIrB;EAElB;AAEF","file":"zcl_abapgit_zlib_stream.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_ajson_error.clas.testclasses.mjs":{"lineLengths":[69,85,53,48,18,32,67,37,25,67,60,56,57,17,42,22,3,29,64,16,3,17,128,66,309,9,76,55,17,110,18,124,14,16,7,5,3,28,128,9,157,55,17,110,18,157,14,16,7,5,3,24,128,740,67,65,9,124,55,17,110,18,160,14,16,7,5,3,24,128,9,157,55,17,110,18,133,89,133,157,14,16,7,5,9,106,55,17,110,18,132,89,133,157,14,16,7,5,3,1,69,20,69],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/json/zcx_abapgit_ajson_error.clas.testclasses.abap"],"names":[],"mappings":";;;;AAeA;;;;;;;;;;;;;;;;;EAEE;QAEO,uHAAsC;QACtC,yDAAkB;IAEvB,iCAAS,qBAAQ,KAAM,sCACN,KAAM,yDAAQ,qBAAQ,KAAM,sCACN,KAAM,mCAAQ,wCAAK;IAE1D;2EAC0C;sDACZ;;;;;;;;IAK9B;EAEF;EAEA;QAEO,uHAAsC;IAE3C;4JAEqD;sDACvB;;;;;;;;IAK9B;EAEF;EAEA;QAEO,uHAAsC;QACtC,2tBAA6C;IAElD,OAAO,MAAC,UAAO,sCAAK;IACpB,OAAO,MAAC,UAAO,oCAAG;IAElB;2HAEqD;sDACvB;;;;;;;;IAK9B;EAEF;EAEA;QAEO,uHAAsC;IAE3C;4JAEqD;sDACvB;;;;;;;;;;;IAY9B;IAEA;yGACgD;sDAClB;;;;;;;;;;;IAY9B;EAEF;AAEF","file":"zcx_abapgit_ajson_error.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcx_abapgit_exception.clas.testclasses.mjs":{"lineLengths":[69,81,53,46,0,0,0,17,32,64,37,226,749,280,70,141,149,478,225,73,72,74,153,161,218,577,17,42,22,129,673,47,3,29,64,16,3,30,42,3,37,67,374,70,256,19,3,31,45,58,42,3,35,49,70,50,3,39,374,70,53,3,45,115,103,70,3,41,9,189,55,17,106,27,14,16,7,5,3,40,9,495,55,17,106,27,14,16,7,5,3,42,9,164,55,17,106,27,14,16,7,5,3,43,45,58,130,3,47,49,70,181,3,47,106,76,114,3,20,41,39,3,1,65,204,71,48,38,32,67,37,25,73,51,64,17,12,42,22,3,29,64,16,3,23,79,47,91,3,19,85,47,112,3,31,149,274,82,48,102,75,3,1,71,35,32,64,37,3112,73,49,49,49,49,49,49,49,50,17,12,42,22,57,3,29,64,16,3,17,96,46,139,3,17,96,46,139,3,17,96,46,139,3,17,96,46,139,3,17,96,46,139,3,17,96,46,139,3,17,96,46,139,3,17,96,46,139,3,23,35,3,30,102,103,102,103,111,102,103,111,111,102,103,111,111,111,102,103,111,111,111,111,102,103,111,111,111,111,102,103,102,103,3,1,65,3015,30,32,77,37,25,69,17,42,22,3,29,64,16,3,18,128,69,9,305,63,17,106,22,70,14,16,7,5,83,81,55,5,81,55,5,81,55,5,81,55,5,3,1,91,23,32,70,37,25,578,58,58,58,58,59,17,42,22,3,29,64,16,3,26,69,82,340,113,75,63,63,73,3,26,69,82,340,114,74,63,63,73,3,26,69,82,340,114,74,63,63,73,3,26,69,82,340,114,74,63,63,73,3,26,69,94,69,94,69,76,340,108,108,108,109,139,3,34,52,3,41,67,61,354,58,88,118,118,118,118,3,1,77,362,39,32,68,37,773,73,58,52,62,66,73,17,12,42,22,69,3,29,64,16,3,26,80,107,47,92,119,3,20,80,105,47,92,117,3,30,80,114,47,92,126,3,34,105,114,46,117,3,40,149,96,82,105,48,134,117,75,3,23,39,3,30,816,1032,120,121,3,1,73,680,65,100,67],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/zcx_abapgit_exception.clas.testclasses.abap"],"names":[],"mappings":";;;;;;;AAuCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACE;;;;;;;IACE,yPAEoB;IACtB;;EAEA;;;IACE,aAAQ,MAAC,UAAO,OAAO;EACzB;EAEA;;;IACE,aAAQ,MAAC,cAAW,WAAW;EACjC;EAEA;;;IACE,aAAQ,MAAC,kBAAe,UAAU;EACpC;EAEA;;;IACE,aAAQ,MAAC,wBAAqB,qBAAqB;EACrD;EAEA;IACE;4LAGmE;sDACnC;;;;;;;IAEhC;EACF;EAEA;IACE;8eAQwE;sDACxC;;;;;;;IAEhC;EACF;EAEA;IACE;mKAE6E;sDAC7C;;;;;;;IAEhC;EACF;EAEA;;;iIAEiE;EACjE;EAEA;;;oLAE+E;EAC/E;EAEA;;;iHAE8D;EAC9D;EAEA;IACE,sBAAM,aAAQ;IACd,sBAAK,WAAM;EACb;AACF;;;;;AAUA;;;;;;;;;;;;;;;;;EACE;8EACqC;8CACH;0FACe;EACjD;EAEA;oFAC2C;8CACT;+GACwC;EAC1E;EAEA;QACQ,4IAAqD;;iFAQhB;+CAEV;qGAEqB;0EACT;EAC/C;AACF;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;EACE;+FACsD;6CACrB;0IAC0C;EAC3E;EAEA;+FACsD;6CACrB;0IAC0C;EAC3E;EAEA;+FACsD;6CACrB;0IAC0C;EAC3E;EAEA;+FACsD;6CACrB;0IAC0C;EAC3E;EAEA;+FACsD;6CACrB;0IAC0C;EAC3E;EAEA;+FACsD;6CACrB;0IAC0C;EAC3E;EAEA;+FACsD;6CACrB;0IAC0C;EAC3E;EAEA;+FACsD;6CACrB;0IAC0C;EAC3E;EAEA;;;;IACE,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,qCAAI;IACvC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,sCAAK;IAExC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,qCAAI;IACvC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,sCAAK;IACxC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAE/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,qCAAI;IACvC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,sCAAK;IACxC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAE/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,qCAAI;IACvC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,sCAAK;IACxC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAE/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,qCAAI;IACvC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,sCAAK;IACxC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAE/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,qCAAI;IACvC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,sCAAK;IACxC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAC/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,8CAAY;IAE/C,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,qCAAI;IACvC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,sCAAK;IAExC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,qCAAI;IACvC,2BAAiB,MAAC,SAAQ,MAAC,WAAQ,sCAAK;EAC1C;AAEF;;;AASA;;;;;;;;;;;;;;EAEE;QAEQ,uHAA2C;QAC3C,4DAAqB;IAE3B;MACI,wSAA8F;8DAC1D;;;;;;;;IAGxC;kFAEoD;IAEpD,iBAAa,GAAV,WAAa,2CAAS;sDACK;IAC9B;IACA,iBAAa,GAAV,WAAa,2CAAS;sDACK;IAC9B;IACA,iBAAa,GAAV,WAAa,2CAAS;sDACK;IAC9B;IACA,iBAAa,GAAV,WAAa,2CAAS;sDACK;IAC9B;EAEF;AAEF;;AA8BA;;;;;;;;;;;;;;;;;;;EACE;QAEI,4DAA0F,CAAA;;;;;;;wEAQrD;EACzC;EACA;QAEI,4DAA0F,CAAA;;;;;;;wEAQrD;EACzC;EACA;QAEI,4DAA0F,CAAA;;;;;;;wEAQrD;EACzC;EACA;QAEI,4DAA0F,CAAA;;;;;;;wEAQrD;EACzC;EACA;QAEI,4DAAsG,CAAA;;QACtG,4DAAsG,CAAA;;QACtG,4DAAoF,CAAA;;;;;;;0IAQ/C;EACzC;EACA;;;;;;;;uFAEuD;qHAGA;qHAEA;qHAEA;qHAEA;EAEvD;AACF;;;AAsBA;;;;;;;;;;;;;;;;;;;;;EACE;+EACqC;0GACuB;8CAE1B;2FAEe;sHACuB;EACxE;EAEA;+EACqC;wGACqB;8CAExB;2FAEe;oHACqB;EACtE;EAEA;+EACqC;iHAC8B;8CAEjC;2FAEe;6HAC8B;EAC/E;EAEA;wGAC0D;iHACU;6CAEnC;oHAEqC;EACtE;EAEA;QACQ,4IAAqD;;iFAIhB;wGACa;+CAEvB;qIAEiC;oHACE;0EACvB;EAC/C;EAEA;;;;IACE,mCAAqB,MAAC,wCACpB,kKACA,kKACA,kKACA,4IACA,uGAAsE;IAExE,mCAAqB,MAAC,iDACpB,kKACA,8JACA,uCAAwB,8BACxB,wIACA,uCAAwB,8BACxB,uCAAwB,8BACxB,4IACA,qIAAiG;IAEnG,mCAAqB,MAAC,mBAAkB,MAAC,WAAQ,qCAAI;IACrD,mCAAqB,MAAC,mBAAkB,MAAC,WAAQ,sCAAK;EACxD;AAEF","file":"zcx_abapgit_exception.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_integration_git.clas.testclasses.mjs":{"lineLengths":[93,53,52,27,32,80,67,25,22,17,42,22,3,29,64,16,3,52,131,73,11,3,45,131,87,23,3,1,91,17,32,70,37,25,69,17,42,22,3,29,64,16,3,18,66,54,66,167,1969,117,94,125,133,124,153,3,1,71,40,73],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/test/zcl_abapgit_integration_git.clas.testclasses.abap"],"names":[],"mappings":";;;AAKA;;;;;;;;;;;;;;EACE;;;IACE;EACF;EAEA;;;IAEA;;AACF;;AAUA;;;;;;;;;;;;;;EAEE;QAEY,yDAA8D,CAAA;;QACnE,yDAAkB;QAClB,8JAAyC;QACzC,w6DAAsD;;6FAIJ;IAEvD,YAAS,2GAAiE;oIAI/C;IAE3B,aAAU,yGAEkB;wJAIjB;EAEb;AAEF","file":"zcl_abapgit_integration_git.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persistence_user.clas.testclasses.mjs":{"lineLengths":[95,53,53,17,32,71,37,237,158,147,148,78,61,60,62,53,17,42,22,140,45,43,43,3,29,64,16,3,28,67,122,117,40,122,97,103,3,29,101,106,321,88,13,5,122,91,40,122,84,93,3,30,68,122,133,40,122,117,104,3,28,1326,68,122,100,40,122,88,133,3,20,189,178,127,46,3,1,72,83,42,72,43,72,63,19,74],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persistence_user.clas.testclasses.abap"],"names":[],"mappings":";;;AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;EAEE;QAEQ,0DAAmB;IAEzB,kBAAU,kGAAyD;oHACnB;IAEhD,sBAAK,YAAO;IAEZ,kBAAU,kGAAyD;IACnE,aAAU,8EAAqC;sGAI3B;EAEtB;EAEA;QAEQ,4FAAqD;QACrD,iGAAqD;IAE3D;IAEA,iBAAY,GAAT,eAAE,MAAC,QAAS,gCAAC;MACd;IACF;IAEA,kBAAU,kGAAyD;0FAC9B;IAErC,sBAAK,YAAO;IAEZ,kBAAU,kGAAyD;IACnE,YAAS,kEAAyB;4FAIb;EAEvB;EAEA;QAEQ,2DAAoB;IAE1B,kBAAU,kGAAyD;oIAEnB;IAEhD,sBAAK,YAAO;IAEZ,kBAAU,kGAAyD;IACnE,cAAW,iGAAqC;uGAI5B;EAEtB;EAEA;QAEQ,qyCAA4D;IAElE,WAAW,MAAC,uBAAoB,sBAAS;IAEzC,kBAAU,kGAAyD;mGAC/B;IAEpC,sBAAK,YAAO;IAEZ,kBAAU,kGAAyD;IACnE,iBAAc,iEAAwB;oIAInB;EAErB;EAEA;4LAI4B;;;;EAE5B;AACF","file":"zcl_abapgit_persistence_user.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/output/zcl_abapgit_persist_packages.clas.testclasses.mjs":{"lineLengths":[95,53,53,21,32,75,37,199,132,134,74,53,17,42,22,45,49,51,3,29,64,16,3,24,147,252,130,89,9,160,17,106,24,108,14,16,7,5,9,92,129,131,17,106,24,108,14,16,7,5,3,20,147,89,9,76,17,106,14,16,7,5,3,1,80,107,46,61,44,62,41,23,74],"data":{"version":3,"sources":["file:///home/runner/work/abapGit/abapGit/src/persist/zcl_abapgit_persist_packages.clas.testclasses.abap"],"names":[],"mappings":";;;AAiBA;;;;;;;;;;;;;;;;;;;;EAEE;QAEO,0IAAoD;QACpD,mPAAwD;QACxD,yHAA0C;IAE/C,iBAAc,kEAA6C;IAE3D;+JAIoC;;;;;;;;IAGpC;IAEA;MACI,gBAAa,oEAA8B;gIAItB;kIAIC;;;;;;;;IAI1B;EAEF;EAEA;QAEO,0IAAoD;IAEzD,iBAAc,kEAA6C;IAG3D;2EACoC;;;;;;IAEpC;EAEF;AAEF","file":"zcl_abapgit_persist_packages.clas.testclasses.mjs","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/index.js":{"lineLengths":[13,62,114,39,51,45,63,43,128,37,37,30,16,41,29,18,33,22,43,53,51,73,61,131,12,24,25,26,23,34,29,23,23,28,23,27,31,35,31,57,75,45,60,57,47,197,44,123,50,39,9,49,38,9,68,83,32,38,38,38,52,5,1,20,33],"data":null,"url":"index.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/context.js":{"lineLengths":[13,62,25,15,19,53,38,34,5,17,64,65,9,51,5,1,26,35],"data":null,"url":"context.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/offset_length.js":{"lineLengths":[13,62,30,35,20,31,23,82,29,53,45,13,18,51,13,29,33,13,9,29,53,45,13,18,51,13,29,33,13,9,5,11,86,5,16,21,40,24,9,45,29,9,52,35,29,47,13,9,14,35,9,99,52,56,9,26,45,65,53,13,48,51,13,9,41,91,9,31,48,9,31,51,9,28,52,56,9,26,5,1,36,41],"data":null,"url":"offset_length.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/index.js":{"lineLengths":[13,97,33,53,88,68,5,39,29,33,17,4,72,126,2,62,48,46,51,41,47,49,42,40,44,45,41,43,43,46,42,41,45,44,33],"data":null,"url":"index.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/abap_object.js":{"lineLengths":[13,62,28,49,18,24,95,85,21,5,11,26,5,13,31,5,24,34,5,19,29,5,16,42,37,9,63,50,9,14,31,9,20,5,1,32,39],"data":null,"url":"abap_object.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/field_symbol.js":{"lineLengths":[13,62,29,35,37,31,35,53,19,23,33,29,25,5,24,21,44,5,21,31,5,18,28,5,16,33,5,18,42,5,18,27,81,30,9,28,5,19,69,45,9,14,32,9,5,19,13,15,83,5,11,23,27,49,40,50,54,51,61,17,22,33,165,37,17,13,18,29,161,33,13,9,14,25,85,9,5,21,52,48,9,25,5,13,15,21,83,5,22,15,21,92,5,16,15,79,20,5,22,50,5,1,34,40],"data":null,"url":"field_symbol.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/table.js":{"lineLengths":[13,62,194,39,37,36,43,49,53,67,45,20,29,45,41,41,39,35,72,17,26,40,34,36,63,22,38,26,29,27,5,1,40,40,35,20,55,15,36,23,29,40,51,34,36,18,46,34,14,9,154,68,9,14,62,9,5,1,36,19,1,34,19,50,24,35,31,31,31,31,94,59,9,119,5,22,46,5,24,19,192,5,29,56,61,9,50,38,61,9,62,34,113,57,20,5,29,22,60,37,60,64,17,22,33,55,17,13,18,29,54,59,45,17,22,36,17,44,13,9,20,5,25,52,5,21,49,32,5,31,22,62,60,44,55,41,13,18,87,41,43,40,17,22,66,63,17,13,40,9,20,5,16,32,5,18,50,45,50,9,14,44,63,47,13,35,44,9,5,13,24,23,40,39,9,19,5,32,54,26,17,5,26,32,5,32,51,5,19,45,5,24,34,5,18,28,5,18,28,5,13,24,35,5,14,21,65,42,31,13,24,9,14,72,9,5,17,40,37,9,27,5,31,20,47,39,62,55,23,9,44,62,53,23,25,47,9,201,77,49,23,9,14,62,26,23,9,5,1,34,13,50,24,35,31,31,31,69,94,59,9,119,5,22,33,5,24,19,192,5,29,56,61,9,50,38,61,9,37,113,57,20,5,24,34,5,18,28,5,32,54,26,17,5,26,32,5,18,28,5,104,13,26,5,13,24,35,5,14,19,35,96,80,9,14,90,41,13,25,60,39,13,66,91,9,20,5,17,40,37,9,27,5,47,35,57,40,34,64,13,39,21,9,16,32,38,9,14,23,9,26,36,9,47,33,9,14,45,9,59,48,39,13,9,19,5,37,24,35,40,19,9,46,62,9,31,31,9,14,40,9,46,35,26,13,9,5,18,35,57,40,34,59,13,27,21,9,66,75,42,33,23,9,14,44,33,23,9,5,21,35,47,34,21,59,49,5,21,35,5,31,20,47,39,62,55,23,9,44,62,53,23,25,47,9,201,77,49,23,9,14,62,26,23,9,5,1,22,33],"data":null,"url":"table.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/integer.js":{"lineLengths":[13,62,25,48,35,31,39,52,15,24,23,95,5,24,34,5,16,40,43,9,45,38,67,13,44,28,13,52,76,13,45,9,50,49,9,84,48,37,71,71,43,39,17,13,26,9,14,34,9,20,5,13,23,5,11,26,5,1,26,35],"data":null,"url":"integer.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/throw_error.js":{"lineLengths":[13,62,28,27,17,43,21,39,5,10,58,5,1,32,39],"data":null,"url":"throw_error.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/float.js":{"lineLengths":[13,62,23,31,39,2,36,16,22,3,29,21,29,3,18,56,35,46,1,2,13,24,23,95,5,24,34,5,16,40,31,9,74,27,9,45,43,9,42,40,9,84,45,48,9,14,34,9,20,5,13,23,5,14,26,5,11,60,38,34,43,38,55,46,9,14,43,38,55,46,9,5,1,22,33],"data":null,"url":"float.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/hex.js":{"lineLengths":[13,62,21,48,35,39,11,24,148,21,5,16,40,31,9,45,56,28,69,13,39,43,58,13,18,60,13,67,9,14,32,49,35,28,13,45,28,13,18,31,56,36,17,13,9,50,63,9,50,65,9,46,20,5,17,27,5,13,49,5,11,26,5,22,73,61,9,73,61,9,29,73,25,47,9,89,25,50,9,42,19,17,5,1,18,31],"data":null,"url":"hex.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/_parse.js":{"lineLengths":[13,62,23,36,46,21,34,19,5,39,32,35,9,14,37,9,5,44,28,5,78,31,21,9,42,33,65,65,39,35,13,9,19,5,74,32,5,49,28,5,10,32,5,1,22,34],"data":null,"url":"_parse.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/xstring.js":{"lineLengths":[13,62,25,48,35,43,15,24,24,95,5,24,34,5,16,40,31,69,61,9,45,56,46,46,13,9,14,32,49,35,28,13,62,45,13,45,44,73,67,13,18,28,13,9,20,5,13,24,5,11,26,5,22,73,61,9,73,61,9,29,73,25,47,9,89,25,50,9,32,19,17,5,1,26,35],"data":null,"url":"xstring.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/character.js":{"lineLengths":[13,62,27,48,48,49,43,39,24,17,32,30,34,46,86,9,36,62,9,27,21,5,19,29,20,5,16,37,49,9,69,31,9,63,51,54,13,41,24,9,58,43,24,9,54,79,63,9,14,42,9,46,59,9,51,61,9,20,5,24,15,87,5,25,15,88,5,19,15,82,5,17,27,5,13,45,5,11,26,5,18,48,53,9,14,30,9,5,22,80,21,49,9,80,21,49,9,45,37,40,71,9,29,21,37,9,35,40,9,44,19,17,5,1,30,37],"data":null,"url":"character.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/structure.js":{"lineLengths":[13,62,27,36,49,35,48,43,48,17,69,28,119,99,29,35,5,13,37,25,34,9,20,5,19,29,5,25,27,5,20,30,5,24,34,5,16,34,19,9,58,41,9,50,59,9,46,36,43,50,14,31,31,8,52,38,38,68,13,14,40,33,53,19,20,9,14,37,9,20,5,25,21,24,38,33,9,52,61,61,43,9,5,11,26,5,20,21,37,53,52,13,18,43,13,9,19,5,22,80,21,49,9,80,21,49,9,40,44,37,40,71,9,22,21,37,9,35,40,9,56,19,17,5,1,30,37],"data":null,"url":"structure.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/clone.js":{"lineLengths":[13,62,23,35,21,48,19,5,44,43,25,21,17,5,52,59,35,21,17,5,17,39,29,21,57,39,70,39,13,18,46,13,9,5,16,1,22,33],"data":null,"url":"clone.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/string.js":{"lineLengths":[13,62,24,48,48,43,49,39,37,43,35,14,24,24,95,5,24,34,5,16,58,51,54,13,48,9,45,31,9,45,42,9,58,74,44,9,58,56,9,52,57,76,34,9,54,57,52,34,9,50,42,54,9,14,42,9,20,5,13,24,5,11,26,5,22,80,21,49,9,80,21,49,9,50,37,40,71,9,29,21,37,9,35,40,9,31,19,17,5,1,24,34],"data":null,"url":"string.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/packed.js":{"lineLengths":[13,62,24,35,48,52,14,24,23,26,73,39,9,26,75,43,9,95,5,24,34,5,26,21,68,5,16,40,31,9,45,44,31,28,13,52,76,13,70,9,50,67,9,14,34,9,20,5,17,27,5,19,29,5,13,23,5,11,26,5,1,24,34],"data":null,"url":"packed.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/data_reference.js":{"lineLengths":[13,62,31,37,48,49,21,23,33,25,5,15,25,5,21,31,5,16,33,5,18,28,5,19,28,5,19,13,24,43,5,11,15,36,42,9,21,81,5,13,15,21,83,5,22,15,21,92,5,16,15,45,46,24,9,63,51,54,13,67,63,28,13,18,62,13,9,14,90,9,20,5,22,73,61,9,73,61,9,64,29,73,43,9,89,46,9,40,19,17,5,1,38,42],"data":null,"url":"data_reference.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/insert_internal.js":{"lineLengths":[13,62,32,36,40,36,45,33,34,27,55,55,50,9,51,5,59,54,50,9,49,5,52,191,184,55,25,5,24,117,32,19,181,40,59,155,37,21,17,22,95,37,21,17,13,24,10,105,36,31,88,52,85,86,110,34,17,13,18,36,33,75,18,13,127,25,58,29,51,23,13,9,5,28,35,67,22,19,5,32,46,59,32,42,9,5,26,49,62,59,56,60,41,58,17,13,9,14,51,40,13,9,5,40,51,28,44,9,81,32,42,9,36,46,9,5,68,72,32,42,9,36,46,9,21,47,15,5,20,104,101,32,42,9,36,46,9,5,17,39,70,34,215,50,11,108,20,9,34,56,9,14,44,9,5,1,40,43],"data":null,"url":"insert_internal.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/index.js":{"lineLengths":[13,97,33,53,88,68,5,39,29,33,17,4,72,126,2,62,20,45,44,39,39,39,39,39,39,39,39,44,48,39,39,38,39,39,39,39,38,38,27,104,33],"data":null,"url":"index.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/assigned.js":{"lineLengths":[13,62,26,24,28,1,28,36],"data":null,"url":"assigned.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/between.js":{"lineLengths":[13,62,25,29,29,36,64,1,26,35],"data":null,"url":"between.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/ge.js":{"lineLengths":[13,62,20,24,26,62,1,16,30],"data":null,"url":"ge.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/le.js":{"lineLengths":[13,62,20,24,26,62,1,16,30],"data":null,"url":"le.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/ca.js":{"lineLengths":[13,62,20,36,26,46,44,5,52,44,5,15,63,28,5,49,32,5,10,34,5,19,16,5,15,36,29,5,10,35,5,35,18,34,46,25,51,24,9,16,5,17,43,17,1,16,30],"data":null,"url":"ca.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/cn.js":{"lineLengths":[13,62,20,29,26,47,1,16,30],"data":null,"url":"cn.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/co.js":{"lineLengths":[13,62,20,36,26,15,63,28,5,10,34,5,15,36,29,5,50,68,5,10,35,5,35,18,34,47,25,51,25,9,16,5,17,43,16,1,16,30],"data":null,"url":"co.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/cp.js":{"lineLengths":[13,62,20,36,26,15,63,28,5,49,32,5,51,46,50,9,44,5,10,34,5,15,36,29,5,10,45,5,33,32,32,32,32,32,32,32,32,32,32,32,39,39,38,37,48,33,1,16,30],"data":null,"url":"cp.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/cs.js":{"lineLengths":[13,62,20,26,15,63,28,5,10,34,5,24,15,36,29,5,10,35,5,24,31,20,21,50,21,5,10,21,47,20,5,1,16,30],"data":null,"url":"cs.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/eq.js":{"lineLengths":[13,62,20,28,36,37,35,37,49,21,5,48,59,35,25,9,5,16,1,26,6,24,25,6,47,44,5,51,44,5,56,45,48,57,50,13,18,64,13,9,51,67,9,50,53,9,5,47,48,53,9,50,46,9,5,119,42,5,48,46,46,9,53,67,9,5,95,56,5,43,50,41,53,46,9,14,59,25,9,5,82,52,50,9,56,50,9,29,30,40,41,51,25,9,35,37,30,29,13,9,20,5,22,44,30,5,44,33,5,84,21,5,40,23,5,10,17,5,22,45,31,5,45,34,5,41,24,5,10,18,5,64,38,5,68,37,5,74,27,26,5,71,27,5,45,36,30,9,41,30,26,9,5,75,23,38,5,80,24,37,5,95,32,61,29,9,66,27,22,13,39,34,13,18,36,13,9,5,6,21,21,6,19,1,16,30],"data":null,"url":"eq.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/gt.js":{"lineLengths":[13,62,20,36,46,26,46,46,50,9,44,5,52,47,50,9,44,5,153,50,5,70,40,5,22,63,17,5,83,26,5,10,23,5,22,65,18,5,85,27,5,10,24,5,57,23,18,9,14,32,9,5,62,23,18,9,14,32,9,5,26,54,5,26,54,5,17,1,16,35,50,52,32,1,50,32,37,22,62,18,22,58,72,26,18,22,57,59,13,68,86,58,66,17,13,68,59,13,66,59,13,18,57,13,18,16,53,5,30,1,30],"data":null,"url":"gt.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/initial.js":{"lineLengths":[13,62,25,36,23,58,77,40,5,52,46,5,43,40,5,43,48,5,42,48,5,43,38,5,44,34,5,48,48,5,84,43,5,50,46,19,5,34,26,5,39,25,5,28,36,28,5,41,27,5,49,35,5,41,45,46,29,13,9,20,5,10,68,5,1,26,35],"data":null,"url":"initial.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/instance_of.js":{"lineLengths":[13,62,29,34,38,1,34,39],"data":null,"url":"instance_of.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/lt.js":{"lineLengths":[13,62,20,29,26,37,1,16,30],"data":null,"url":"lt.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/m.js":{"lineLengths":[13,62,41,29,17,28,58,61,63,5,15,1,34,18,32,45,47,52,69,5,25,26,63,63,63,28,32,32,13,18,33,13,9,5,33,1,14,29],"data":null,"url":"m.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/na.js":{"lineLengths":[13,62,20,29,26,38,1,16,30],"data":null,"url":"na.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/ne.js":{"lineLengths":[13,62,20,29,26,38,1,16,30],"data":null,"url":"ne.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/np.js":{"lineLengths":[13,62,20,29,26,38,1,16,30],"data":null,"url":"np.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/ns.js":{"lineLengths":[13,62,20,29,26,38,1,16,30],"data":null,"url":"ns.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/o.js":{"lineLengths":[13,62,19,27,18,32,54,56,52,69,5,29,26,63,63,63,28,32,42,13,18,33,13,9,5,31,1,14,29],"data":null,"url":"o.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/z.js":{"lineLengths":[13,62,19,27,18,32,54,56,52,69,5,25,30,63,63,63,28,32,32,13,18,43,13,9,5,30,1,14,29],"data":null,"url":"z.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/compare/in.js":{"lineLengths":[13,62,27,29,29,29,33,37,20,5,38,94,55,28,13,9,99,55,28,13,9,99,55,28,13,9,14,29,46,9,5,17,1,30,30],"data":null,"url":"in.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/read_table.js":{"lineLengths":[13,62,27,52,40,36,55,69,61,63,29,28,63,26,9,14,95,9,36,20,25,38,14,9,5,12,25,22,6,1,17,36,27,26,23,32,47,47,50,9,54,5,92,94,84,121,51,64,76,55,50,13,36,44,13,9,14,58,77,31,55,59,34,17,13,34,44,13,9,5,74,51,69,9,34,34,40,55,55,58,17,43,13,88,39,13,18,36,13,9,31,20,31,9,5,162,70,33,23,5,123,25,151,35,23,5,181,31,218,29,83,46,34,139,100,35,45,34,35,32,31,13,18,32,44,82,49,71,36,79,37,17,22,112,17,69,36,17,13,9,5,81,34,91,35,45,5,78,51,67,9,58,53,9,90,58,38,159,69,62,44,81,38,33,39,43,121,44,34,25,21,43,34,30,21,17,13,9,34,27,9,156,28,9,5,10,64,5,30,22,28,5,181,25,18,5,17,43,17,48,32,102,52,9,65,39,9,14,36,9,5,46,44,5,42,40,5,33,1,30,38],"data":null,"url":"read_table.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/binary_search.js":{"lineLengths":[13,62,89,28,39,35,39,38,85,21,17,5,53,63,30,63,63,32,28,63,26,9,14,95,9,57,27,9,14,26,9,47,5,26,24,59,22,5,10,91,5,53,41,20,5,17,1,50,67,30,63,73,27,9,14,26,9,5,17,1,44,65,30,63,73,26,9,14,27,9,5,17,1,40,41],"data":null,"url":"binary_search.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/sort.js":{"lineLengths":[13,62,22,36,40,31,42,40,25,25,41,23,23,5,43,45,17,17,30,33,33,9,5,10,38,38,5,51,80,5,54,18,5,60,18,5,45,17,5,10,17,5,1,31,29,47,39,32,50,9,27,15,5,47,51,5,71,38,37,9,30,47,45,32,31,17,13,21,11,5,10,107,30,42,25,13,61,26,13,62,26,13,18,25,13,11,5,1,20,32],"data":null,"url":"sort.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/date.js":{"lineLengths":[13,62,22,37,49,35,48,12,24,21,95,5,24,34,5,16,40,48,40,13,18,74,13,9,50,49,9,45,31,9,14,34,9,36,49,9,41,51,9,20,5,13,32,5,11,26,5,18,65,5,22,73,61,9,73,61,9,29,73,25,43,9,89,25,46,9,40,19,17,5,1,20,32],"data":null,"url":"date.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/_date_helper.js":{"lineLengths":[13,62,63,35,43,64,30,26,85,83,33,9,98,5,66,61,61,54,15,1,46,35,43,43,58,59,54,74,27,25,85,83,33,9,95,5,33,16,1,46,40],"data":null,"url":"_date_helper.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/decfloat34.js":{"lineLengths":[13,62,28,24,31,39,18,19,23,5,16,40,31,9,74,27,9,45,43,9,45,40,9,84,45,48,9,14,34,9,20,5,13,23,5,14,26,5,11,53,38,20,5,1,32,38],"data":null,"url":"decfloat34.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/integer8.js":{"lineLengths":[13,62,26,48,35,31,39,52,16,24,23,95,5,24,34,5,16,40,43,9,45,38,67,13,44,28,13,52,76,13,45,9,50,49,9,84,48,37,71,71,43,39,17,13,26,9,14,34,9,20,5,13,23,5,11,26,5,1,28,36],"data":null,"url":"integer8.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/numc.js":{"lineLengths":[13,62,22,48,48,12,24,148,95,21,5,24,34,5,29,40,42,9,45,50,9,14,34,19,9,46,89,9,14,56,43,58,13,9,20,5,17,27,5,13,45,5,11,26,5,22,80,21,49,9,80,21,49,9,45,37,40,71,9,29,21,37,9,35,40,9,51,19,17,5,1,20,32],"data":null,"url":"numc.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/time.js":{"lineLengths":[13,62,22,37,24,48,12,24,21,95,5,24,34,5,16,40,36,39,73,66,65,9,45,31,9,45,49,9,14,34,9,20,5,13,30,5,11,26,5,18,60,62,62,53,5,22,73,61,9,73,61,9,29,73,25,43,9,89,25,46,9,40,19,17,5,1,20,32],"data":null,"url":"time.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/types/utc_long.js":{"lineLengths":[13,62,25,15,24,21,95,5,24,34,5,23,72,5,17,15,20,5,13,24,5,11,26,5,1,26,36],"data":null,"url":"utc_long.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/index.js":{"lineLengths":[13,62,28,37,37,37,35,37,47,41,39,47,55,41,33,39,39,33,39,47,47,39,45,51,45,49,41,55,55,55,33,39,55,55,61,45,39,41,37,39,35,33,33,47,35,43,57,55,35,51,38,90,36,18,26,38,38,38,32,35,41,38,53,44,41,51,63,44,32,39,51,48,57,52,42,63,32,63,72,41,51,48,41,44,39,51,48,35,32,35,47,32,41,66,31,30,5,37,36,38,37,55,47,34,45,33,17,36,13,33,65,38,52,17,13,26,10,20,5,42,36,44,37,61,47,34,45,33,17,36,13,33,65,38,52,17,13,26,10,20,5,41,103,37,94,25,13,33,53,65,13,18,60,13,9,5,42,97,5,42,97,5,28,77,5,42,97,5,50,96,5,42,97,5,33,84,5,28,79,5,1,32,33],"data":null,"url":"index.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/append.js":{"lineLengths":[13,62,24,36,24,54,49,41,46,9,5,54,49,5,37,41,55,42,9,54,21,69,15,5,77,21,25,55,9,45,23,51,9,22,47,45,24,25,13,35,20,9,5,10,54,30,53,57,13,18,44,13,9,39,53,61,13,18,48,13,9,5,17,65,1,24,34],"data":null,"url":"append.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/assert.js":{"lineLengths":[13,62,24,24,26,44,5,1,24,34],"data":null,"url":"assert.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/assign.js":{"lineLengths":[13,62,24,36,24,11,27,28,65,67,9,56,47,124,62,30,40,36,37,80,21,26,37,113,21,17,13,18,29,51,23,13,9,52,56,25,62,37,29,51,23,13,61,66,29,51,23,13,97,97,29,51,23,13,9,34,53,25,47,9,14,25,47,9,5,31,107,53,26,19,9,61,58,25,47,19,9,40,44,40,9,52,113,56,13,18,72,13,9,31,44,34,38,13,65,63,62,59,61,13,9,60,71,34,36,41,13,9,35,43,25,47,9,14,40,25,47,9,5,10,33,58,50,36,54,13,37,25,47,9,46,25,47,9,14,32,42,13,46,25,47,9,5,1,24,34],"data":null,"url":"assign.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/clear.js":{"lineLengths":[13,62,23,23,18,1,22,33],"data":null,"url":"clear.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/commit.js":{"lineLengths":[13,62,24,19,11,1,24,34],"data":null,"url":"commit.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/concatenate.js":{"lineLengths":[13,62,29,36,29,20,31,36,43,42,54,49,17,22,39,17,13,9,5,10,44,25,50,69,13,80,40,13,59,54,46,17,22,39,17,13,18,46,13,27,9,5,17,28,93,47,9,14,53,9,5,37,1,34,39],"data":null,"url":"concatenate.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/condense.js":{"lineLengths":[13,62,26,35,49,41,25,45,5,10,49,5,23,1,28,36],"data":null,"url":"condense.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/convert.js":{"lineLengths":[13,62,25,57,34,19,6,24,24,6,18,22,46,31,9,14,37,9,36,30,9,5,18,22,46,31,9,14,37,9,5,19,23,47,33,9,14,44,9,5,18,22,46,31,9,14,42,9,30,5,29,21,5,28,26,37,55,80,19,9,143,117,42,5,10,28,79,79,19,9,151,135,41,5,63,63,23,32,5,22,27,5,22,27,5,1,26,35],"data":null,"url":"convert.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/dist/index.cjs":{"lineLengths":[210,34,0],"data":{"version":3,"file":"index.cjs","sources":[],"sourcesContent":null,"names":[],"mappings":"","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/dist/impl.cjs":{"lineLengths":[259,33,0],"data":{"version":3,"file":"impl.cjs","sources":["file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/impl.ts"],"sourcesContent":null,"names":["Temporal","TemporalImpl","Intl","getGlobalThis","DateTimeFormat","toTemporalInstant","toTemporalInstantImpl"],"mappings":"8FAIY,MAACA,EAAWC,WACXC,EAAO,IAAKC,kBAAgBD,oBAAME,kBAClCC,EAAoBC","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/dist/common-c41a489f.cjs":{"lineLengths":[56909,44,0],"data":{"version":3,"file":"common-c41a489f.cjs","sources":["file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/units.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/overflowHandling.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/refine.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/roundingMode.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/utils/obj.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/unitStr.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/diffOptions.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/roundingOptions.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/abstract.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/utils/math.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/utils/string.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/utils/largeInt.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/durationFields.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/dayAndTime.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/eraOrigins.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/calendarImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/isoCalendarImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/epoch.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/compare.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/constrain.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/fieldStr.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/gregoryCalendarImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/calendarDisplay.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/disambig.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/isoFormatOptions.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/timeZoneDisplay.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/isoFormat.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/mixins.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/offsetHandling.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/timeZone.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/translate.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/offset.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/parseRegExp.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/parse.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/parseRefine.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/timeZoneImpl/timeZoneImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/timeZoneImpl/fixedTimeZoneImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/intlFormat.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/native/intlUtils.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/timeZoneImpl/specialCases.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/timeZoneImpl/intlTimeZoneImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/timeZoneImpl/timeZoneImplQuery.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/timeZone.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/timeZone.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/fromAndWith.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/isoFieldValidation.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/rounding.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/native/intlFactory.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/native/intlMixins.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/parseDuration.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/offsetDisplay.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/plainTime.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/diff.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/plainYearMonth.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/zonedDateTime.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/relativeTo.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/durationSpan.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/totalUnits.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/roundingDuration.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/duration.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/totalOptions.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/plainDateTime.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/plainMonthDay.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/calendar.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/intlCalendarImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/japaneseCalendarImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/calendarImplQuery.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/islamicCalendarImpl.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/calendarImpl/bugs.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/dateUtils/week.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/calendar.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/argParse/calendar.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/plainDate.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/instant.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/native/intlTemporal.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/now.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/public/temporal.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/utils/dom.ts","file:///home/runner/work/abapGit/abapGit/node_modules/temporal-polyfill/src/native/date.ts"],"sourcesContent":null,"names":["nanoInHour","nanoInDay","nanoIn","unitDigitMap","isDayTimeUnit","unit","isDateUnit","parseOverflowOption","createOptionParser","constrain","reject","propName","map","defaultVal","valueParser","nameForError","input","runtimeDefaultVal","d","RangeError","createParser","options","ensured","ensureOptionsObj","constrainInt","val","min","max","overflowHandling","Number","isFinite","Math","trunc","newVal","refineFields","refinerMap","res","fieldName","strict","isObjectLike","TypeError","objectLikeTypeRE","v","test","parseRoundingModeOption","halfExpand","round","ceil","floor","createWeakMap","WeakMap","get","bind","set","attachGetters","ObjClass","getters","Object","defineProperties","prototype","mapHash","func","hash","key","mapHashByKeys","keys","output","strArrayToHash","strs","forEach","str","i","timeUnitNames","unitNames","durationUnitNames","unitMap","_str","pluralUnitMap","parseUnit","defaultUnit","minUnit","maxUnit","_a","num","parseDiffOptions","largestUnitDefault","smallestUnitDefault","forDurationRounding","ensuredOptions","roundingIncrement","smallestUnit","roundingFunc","largestUnitArg","largestUnit","largerNano","incNano","parseRoundingOptions","relaxedDivisibility","formatFactoryFactorySymbol","Symbol","ensureObj","arg","otherArgs","from","AbstractObj","toJSON","this","toString","AbstractNoValueObj","valueOf","Error","getISOFields","setISOFields","AbstractISOObj","constructor","isoFields","super","freeze","compareValues","a","b","numSign","roundToIncrement","inc","roundToMinute","nano","n","abs","roundToIncrementBI","wholeNum","div","mult","leftover","sub","toNumber","add","positiveModulo","padZeros","length","buildPadding","String","padEnd","len","padChar","Array","join","getSignStr","maxLowNum","pow","LargeInt","high","low","sign","neg","getHighLow","balanceAndCreate","highFloat","highStr","indexOf","toFixed","highDot","lowScraps","afterDot","substr","parseInt","toBigInt","BigInt","createLargeInt","maxNumBI","trim","match","SyntaxError","gapIndex","compareLargeInts","newLow","newHigh","signHigh","signLow","durationFieldNames","concat","negateDuration","fields","overrideDuration","d0","d1","_b","_c","_d","_e","_f","_g","_h","_i","_j","signDuration","years","months","weeks","days","hours","minutes","seconds","milliseconds","microseconds","nanoseconds","computeDurationSign","computeLargestDurationUnit","dur","zeroISOTimeFields","isoHour","isoMinute","isoSecond","isoMillisecond","isoMicrosecond","isoNanosecond","zeroDurationTimeFields","partialLocalTimeToISO","hour","minute","second","millisecond","microsecond","nanosecond","durationDayTimeToNano","durationTimeToNano","isoTimeToNano","nanoToDuration","temp","nanoToISOTime","timeNano","dayDelta","eraOrigins","gregory","bce","ce","ethioaa","era0","ethiopic","era1","coptic","roc","beforeroc","minguo","buddhist","be","islamic","ah","indian","saka","persian","ap","japanese","meiji","taisho","showa","heisei","reiwa","CalendarImpl","id","monthCode","month","_year","convertMonthCode","monthCodeIsLeap","monthCodeInt","convertEraYear","calendarID","eraYear","era","fromDateTimeFormat","origin","getCalendarIDBase","split","ISOCalendarImpl","computeFields","epochMilli","epochMilliToISOFields","year","isoYear","isoMonth","day","isoDay","epochMilliseconds","isoToEpochMilli","daysInMonth","inLeapYear","monthsInYear","guessYearForMonthDay","isoEpochLeapYear","normalizeISOYearForMonthDay","isoCalendarImpl","epochNanoSymbol","isoFieldsToEpochNano","isoToEpochNano","isoDayTry","milli","dayShiftAbs","twoDigitYearBug","isoYearTemp","milliTry","Date","UTC","isInvalid","throwOutOfRange","setUTCFullYear","epochNanoToISOFields","epochNano","leftoverNano","legacy","dayUnshift","nudgeToLegacyDate","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toEpochNano","dt","isoYearToEpochSeconds","epochNanoToISOYear","computeISODayOfWeek","getUTCDay","date","dateTry","isNaN","diffDaysMilli","epochMilli0","epochMilli1","addDaysMilli","dateTimesEqual","compareDateTimes","calendar","compareTimes","t0","t1","compareLocalDateFields","compareEpochObjs","constrainDateFields","calendarImpl","overflow","constrainDateISO","constrainDateTimeISO","constrainTimeISO","yearMonthFieldMap","dateFieldMap","timeFieldMap","monthDayFieldMap","durationFieldMap","GregoryCalendarImpl","parseCalendarDisplayOption","auto","never","always","parseDisambigOption","compatible","earlier","later","parseTimeToStringOptions","smallestUnitArg","digitsArg","fractionalSecondDigits","digits","parseTimeZoneDisplayOption","formatDateTimeISO","formatConfig","formatDateISO","formatTimeISO","formatYearMonthISO","parts","push","formatPartialSeconds","formatOffsetISO","offsetNano","partialSecondsStr","formatCalendarID","display","collapseDurationTuples","tuples","postfix","forceShow","toLocaleString","useGrouping","totalNano","totalNanoAbs","afterDecimal","replace","mixinEpochFields","epochNanoseconds","epochMicroseconds","epochSeconds","isoFieldMap","unitName","s","charAt","toUpperCase","slice","mixinISOFields","unitNames2","yearMonthCalendarFields","dateCalendarFields","mixinCalendarFields","propNames","value","defineProperty","attachStringTag","objOrClass","name","toStringTag","parseOffsetHandlingOption","prefer","use","ignore","getInstantFor","timeZoneProtocol","dateTime","disambigInt","possibleInstants","getPossibleInstantsFor","gapNano","plainDateTime","utcEpochNano","offsetDayBefore","getOffsetNanosecondsFor","Instant","computeGapNear","moreInstants","addYears","yearsToAdd","newMonth","newDay","addMonths","monthsToAdd","addDays","translateEpochNano","durationFields","computeZonedDateTimeEpochNano","fuzzyMatching","offsetHandling","disambigOptions","offsetNanoseconds","timeZone","Z","matchingEpochNano","findMatchingEpochNano","createDateTime","roundedOffsetNano","instant","possibleEpochNano","possibleOffsetNano","computeNanoInDay","day0","Calendar","day1","epochNano0","timeRegExpStr","offsetRegExpStr","endingRegExpStr","yearMonthRegExp","createRegExp","monthDayRegExp","dateTimeRegExp","dateRegExpStr","timeRegExp","offsetRegExp","durationRegExp","unicodeDashRegExp","meat","RegExp","normalizeDashes","parseZonedDateTime","tryParseZonedDateTime","createParseError","parseDateTime","tryParseDateTime","parseOffsetNano","tryParseOffsetNano","parseTime","m","exec","parseTimeParts","tryParseTime","tryOther","tryParseYearMonth","tryParseMonthDay","ex","isValidDateISO","zRE","zOrOffset","parseOffsetParts","parseDateTimeParts","parseZonedDateTimeParts","requireTime","allowZ","toInt1","toInt0","parseNanoAfterDecimal","timePartsToNano","toIntMaybe","type","refineBaseObj","parsed","createDefaultCalendar","refineZonedObj","TimeZone","TimeZoneImpl","FixedTimeZoneImpl","getPossibleOffsets","getOffset","getTransition","hashIntlFormatParts","format","epochMillisecond","formatToParts","part","eraRemap","bc","ad","normalizeShortEra","formattedEra","toLowerCase","normalize","OrigDateTimeFormat","Intl","DateTimeFormat","normalizeAndCopyLocalesArg","localesArg","specialCases","toNano","DST_PERSIST_YEAR","ISLAND_SEARCH_DAYS","IntlTimeZoneImpl","resolvedOptions","yearEndOffsets","transitionsInYear","zoneNano","lastOffsetNano","transitions","filter","Boolean","transition","transitionEpochNano","offsetNanoBefore","offsetNanoAfter","epochNanoA","epochNanoB","getYearEndOffsetSec","getOffsetForEpochSecs","epochSec","zoneMilli","direction","getTransitionFrom","DST_EARLIEST_YEAR","endYear","getTransitionsInYear","reverse","utcYear","computeTransitionsInYear","startOffsetSec","endOffsetSec","startEpochSec","endEpochSec","searchTransition","island","searchIsland","middleEpochSecs","outerOffsetSec","offsetSec","implCache","getImpl","setImpl","toLocaleUpperCase","queryTimeZoneImpl","static","obj","innerTimeZone","timeZoneFromObj","refined","checkInvalidOffset","getOffsetStringFor","instantArg","getPlainDateTimeFor","calendarArg","dateTimeArg","PlainDateTime","getPreviousTransition","rawTransition","getNextTransition","extractTimeZone","processZonedDateTimeFromFields","buildSafeFunc","rawFields","tryDateTimeFromFields","offset","processDateTimeFromFields","processDateFromFields","tryDateFromFields","processYearMonthFromFields","extractCalendar","filteredFields","filterFieldsViaCalendar","hasAnyProps","yearMonthFromFields","processMonthDayFromFields","monthDayFromFields","processTimeFromFields","tryTimeFromFields","processZonedDateTimeWithFields","zonedDateTime","tryDateTimeWithFields","hasNewOffset","processDateTimeWithFields","processDateWithFields","tryDateWithFields","processYearMonthWithFields","plainYearMonth","mergedFields","mergeFieldsViaCalendar","processMonthDayWithFields","plainMonthDay","processTimeWithFields","tryTimeWithFields","processDurationFields","refinedFields","dateRes","timeRes","dateFromFields","plainDate","plainTime","base","_refineFunc","objOrFields","fieldMap","fieldNames","call","filterFieldsViaWhitelist","whitelist","filtered","existingObj","existingFields","mergeFields","mergeCalFields","isWith","args","maxInstantBI","minInstantBI","maxPlainBI","minPlainBI","validateDateTime","validatePlain","checkEpochNanoBuggy","roundDateTime","roundingConfig","roundedTimeNano","roundNano","isoTimeFields","roundTime","roundEpochNano","dayEpochNano","splitEpochNano","createZonedFormatFactoryFactory","greedyDefaults","nonGreedyDefaults","finalOptions","locales","defaults","anyDefaultsOverridden","buildKey","createKeyFactory","buildFormat","timeZoneID","buildEpochMilli","getEpochMilliFromZonedEntity","entity","createPlainFormatFactoryFactory","strictCalendar","timeZoneName","computeEpochMilliViaTimeZone","computeEpochMilliViaISO","optionsCalendarID","locale","extractUnicodeCalendar","optionsTimeZoneID","otherEntity","_a2","entityCalendarID","entityTimeZoneID","overrides","mixinLocaleStringMethods","buildFormatFactory","formatFactory","extractFormatFactoryFactory","parseDuration","parseDurationTimeUnit","excludeUndefined","small","signedDuration","tryParseDuration","beforeDecimal","wholeUnits","parseOffsetDisplayOption","PlainTime","createTime","with","durationArg","translatePlainTime","Duration","subtract","until","other","diffPlainTimes","since","equals","toZonedDateTime","PlainDate","createZonedDateTimeFromFields","toPlainDateTime","dateArg","ensureLooseTime","pt","timeFields","newTimeFields","translateTime","pt0","pt1","diffConfig","createDuration","diffTimes","weekday","PlainYearMonth","referenceISODay","constrained","createYearMonth","parseYearMonth","translatePlainYearMonth","diffPlainYearMonths","calendarDisplay","toPlainDate","yearMonth","duration","toPlainYearMonth","pym0","pym1","flip","diffDates","getCommonCalendar","offsetNanoSymbol","ZonedDateTime","timeZoneArg","buildZonedDateTimeISOFields","isObject","withPlainDate","getStrangerCalendar","withPlainTime","timeArg","withCalendar","withTimeZone","translateZonedDateTime","diffZonedDateTimes","roundZonedDateTime","startOfDay","hoursInDay","offsetDisplay","timeZoneDisplay","roundedZdt","toPlainMonthDay","createDate","toPlainTime","toInstant","zdt","translatedDate","dateAdd","translateZonedDateTimeFields","roundZonedDateTimeFields","dt0","dt1","diffDateTimes","extractRelativeTo","spanDurationFrom","relativeTo","translated","dateUntil","spanDurationFromDate","spanDurationFromDateTime","dissolveWeeks","forcedWeeks","balancedDuration","diffAccurate","computeExactDuration","smallestUnitName","durationUnit","incDur","startDateTime","endDateTime","startNano","endNano","unitFrac","roundDurationSpan","spannedDuration","doRound","orig","getFields","setFields","numberFields","unsignedFields","fieldNum","fieldSign","isInteger","refineDurationNumbers","fields0","fields1","date0","date1","compareDurations","blank","negated","addDurations","optionsObj","relativeToTranslated","roundDuration","total","totalConfig","optionsArg","parseTotalConfig","computeTotalUnits","forceSeconds","formatDurationISO","_locales","_options","addDurationFields","translatePlainDateTime","diffPlainDateTimes","pdt0","translateDateTime","pdt1","PlainMonthDay","referenceISOYear","createMonthDay","parseMonthDay","formatMonthDayISO","isDateISOInstance","queryDateFields","disallowMonthDay","ensureCalendarsEqual","queryDateISOFields","dateLike","yearFromEra","tryMonth","unusedLeap","getExistingDateISOFields","computeDaysInYear","computeDayOfYear","calLeapMonths","hebrew","chinese","dangi","IntlCalendarImpl","specificCalendarID","relatedCalendarID","yearCorrection","computeFieldsDumb","monthCacheByYear","queryMonthCache","epochMillis","startMarker","leapMonth","queryLeapMonthByYear","presetLeapMonth","maxYear","dumbFields","monthStrToNum","partHash","relatedYear","currentCache","prevCache","nextCache","currentMonthStrs","prevMonthStrs","buildMonthCache","monthStrs","guessISOYear","unshift","primaryEraMilli","implClasses","arguments","iso8601","queryCalendarImpl","toLocaleLowerCase","good1582","goodIslamic","goodEpochMillis","hasBugByID","checkEpochMilliBuggy","hasBug","goodEpochMilli","impl","badEpochMilli","hasEpochMilliBug","isEpochMilliBuggy","computeFirstWeekOffset","firstDay","minimalDays","firstWeekDay","computeWeeksInISOYear","weekOffset","weekOffsetNext","innerCalendar","calendarFromObj","isoToEpochNanoSafe","dayOfWeek","dayOfYear","weekOfYear","week","weeksYear","computeWeekOfISOYear","daysInWeek","daysInYear","calFields","dateFields","daysFromTime","translateDate","dateArg0","dateArg1","largestUnitStr","generalSign","monthSign","wholeYearsUntil","daySign","wholeMonthsUntil","diffDateFields","inFields","baseFields","additionalFields","merged","anyAdditionalYear","anyAdditionalMonth","obj0","obj1","calendar0","calendar1","validateDate","diffPlainDates","refinedOptions","processToZonedDateTimeOptions","pd0","pd1","diffTimeScale","dateStart","dateTimeMiddle","bigDuration","timeDuration","bigSign","timeSign","dateMiddle","validateInstant","diffInstants","toZonedDateTimeISO","inst0","inst1","epochNano1","diffEpochNanos","origLocalesSymbol","origOptionsSymbol","factoryMapSymbol","_DateTimeFormat","normLocales","normOptions","newOptions","flattenOptions","Map","createSingleArgs","formatRange","startArg","endArg","createRangeArgs","formatRangeToParts","origDateTimeFormat","queryFormatFactoryForType","formatFactoryMap","cachedFormats","buildCachedFormatFactory","_Now","zonedDateTimeISO","buidZonedFields","plainDateTimeISO","plainDateISO","plainTimeISO","getEpochNano","getTimeZone","now","Temporal","Now","globalThis","window","fromEpochMilliseconds"],"mappings":"AAAO,MAcMA,EAAa,MACbC,EAAY,OACZC,EAAS,CACpB,EAPyB,IACA,IACC,IACA,KAS1BF,EACAC,GAOWE,EAAe,CAC1B,EACA,EACA,GAEK,SAASC,EAAcC,GAC5B,OAAOA,GA9BU,EAgCZ,SAASC,EAAWD,GACzB,OAAOA,GAjCU,ECLZ,MAMME,EAAsBC,EAAmB,WAJnB,CACjCC,UAAW,EACXC,OAAQ,GAJwB,GCA3B,SAASF,EAAmBG,EAAUC,EAAKC,GAChD,MAAMC,EAMD,SAAsBC,EAAcH,EAAKC,GAC9C,MAAO,CAACG,EAAOC,KACb,QAAc,IAAVD,EAAkB,CACpB,MAAME,EAAyB,MAArBD,EAA4BA,EAAoBJ,EAC1D,QAAU,IAANK,EACF,MAAM,IAAIC,WAAW,kBAAkBJ,KAEzC,OAAOG,EAET,QAAmB,IAAfN,EAAII,GACN,MAAM,IAAIG,WAAW,WAAWJ,MAAiBC,KAEnD,OAAOJ,EAAII,IAlBOI,CAAaT,EAAUC,EAAKC,GAChD,MAAO,CAACQ,EAASJ,KACf,MAAMK,EAAUC,EAAiBF,GACjC,OAAOP,EAAYQ,EAAQX,GAAWM,IAkBnC,SAASO,EAAaC,EAAKC,EAAKC,EAAKC,GAC1C,QAAY,IAARH,EACF,OAAOC,EAET,IAAKG,OAAOC,SAASL,GACnB,MAAM,IAAIN,WAAW,yBAEvBM,EAAMM,KAAKC,MAAMP,GACjB,MAAMQ,EAASF,KAAKL,IAAIK,KAAKJ,IAAIF,EAAKC,GAAMC,GAC5C,GAAIM,IAAWR,GD9Bc,IC8BPG,EACpB,MAAM,IAAIT,WAAW,4BAA8BM,GAErD,OAAOQ,EAEF,SAASC,EAAalB,EAAOmB,GAClC,MAAMC,EAAM,GACZ,IAAK,MAAMC,KAAaF,OACG,IAArBnB,EAAMqB,KACRD,EAAIC,GAAaF,EAAWE,GAAWrB,EAAMqB,KAGjD,OAAOD,EAEF,SAASb,EAAiBF,EAASiB,GACxC,QAAgB,IAAZjB,IAAuBiB,EACzB,MAAO,GAET,IAAKC,EAAalB,GAChB,MAAMmB,UAAU,0CAElB,OAAOnB,EAET,MAAMoB,EAAmB,kBAClB,SAASF,EAAaG,GAC3B,OAAa,OAANA,GAAcD,EAAiBE,YAAYD,GCxDpD,MAMaE,EAA0BpC,EAAmB,eANlC,CACtBqC,WAAYd,KAAKe,MACjBC,KAAMhB,KAAKgB,KACXf,MAAOD,KAAKC,MACZgB,MAAOjB,KAAKiB,QCLP,SAASC,IACd,MAAMrC,EAAsB,IAAIsC,QAChC,MAAO,CACLtC,EAAIuC,IAAIC,KAAKxC,GACbA,EAAIyC,IAAID,KAAKxC,IAGV,SAAS0C,EAAcC,EAAUC,GACtCC,OAAOC,iBAAiBH,EAASI,UAAWC,EAAQJ,GAAUK,KAAYV,IAAKU,OAE1E,SAASD,EAAQE,EAAMD,GAC5B,MAAMzB,EAAM,GACZ,IAAK,MAAM2B,KAAOD,EAChB1B,EAAI2B,GAAOF,EAAKC,EAAKC,GAAMA,GAE7B,OAAO3B,EAEF,SAAS4B,EAAchD,EAAOiD,EAAMJ,GACzC,MAAMK,EAAS,GACf,IAAK,MAAMH,KAAOE,EAChBC,EAAOH,GAAOF,EAAK7C,EAAM+C,IAE3B,OAAOG,EAWF,SAASC,EAAeC,EAAMP,GACnC,MAAMzB,EAAM,GAIZ,OAHAgC,EAAKC,SAAQ,CAACC,EAAKC,KACjBnC,EAAIkC,GAAOT,EAAKS,EAAKC,MAEhBnC,ECrCF,MAAMoC,EAAgB,CAC3B,aACA,cACA,cACA,SACA,SACA,QAQWC,EAAY,IACpBD,EANH,MACA,OACA,QACA,QAMWE,EAAoBD,EAAU7D,KAAKP,GAASA,EAAO,MAC1DsE,EAAUR,EAAeM,GAAW,CAACG,EAAML,IAAMA,IACjDM,EAAgBV,EAAeO,GAAmB,CAACE,EAAML,IAAMA,IAC9D,SAASO,EAAU9D,EAAO+D,EAAaC,EAASC,GACrD,IAAIC,EACJ,IAAIC,EACJ,QAAc,IAAVnE,EAAkB,CACpB,QAAoB,IAAhB+D,EACF,MAAM,IAAI5D,WAAW,oBAEvBgE,EAAMJ,OAGN,GADAI,EAA+B,OAAxBD,EAAKP,EAAQ3D,IAAkBkE,EAAKL,EAAc7D,QAC7C,IAARmE,GAAkBA,EAAMH,GAAWG,EAAMF,EAC3C,MAAM,IAAI9D,WAAW,gBAAkBH,GAG3C,OAAOmE,EChCF,SAASC,EAAiB/D,EAASgE,EAAoBC,EAAqBN,EAASC,EAASM,GACnG,IAAIL,EACJ,MAAMM,EAAiBjE,EAAiBF,GAClCoE,EAA+D,OAA1CP,EAAKM,EAAeC,mBAA6BP,EAAK,EAC3EQ,EAAeZ,EAAUU,EAAeE,aAAcJ,EAAqBN,EAASC,GACpFU,EAAe/C,EAAwB4C,EAAgBD,EAAsBxD,KAAKe,MAAQf,KAAKC,OACrG,IAAI4D,EAAiBJ,EAAeK,YACb,SAAnBD,IACFA,OAAiB,GAGnB,MAAMC,EAAcf,EAAUc,EAD9BP,EAAqBtD,KAAKJ,IAAI0D,EAAoBK,GACgBV,EAASC,GAC3E,GAAIS,EAAeG,EACjB,MAAM,IAAI1E,WAAW,gCAEvB,GAAIuE,ENba,EMaO,CACtB,MAAMI,EAAa5F,EAAOwF,EAAe,GACnCK,EAAU7F,EAAOwF,GAAgBD,EACvC,GAAIK,IAAeC,EACjB,MAAM,IAAI5E,WAAW,8BAEvB,GAAI2E,EAAaC,EACf,MAAM,IAAI5E,WAAW,gCAGzB,MAAO,CACLuE,aAAAA,EACAG,YAAAA,EACAF,aAAAA,EACAF,kBAAAA,GC7BG,SAASO,EAAqB3E,EAAS2D,EAASC,EAASgB,GAC9D,IAAIf,EACJ,MACMM,EAAiBjE,EADe,iBAAZF,EAAuB,CAAEqE,aAAcrE,GAAYA,GACzB,GAC9CoE,EAA+D,OAA1CP,EAAKM,EAAeC,mBAA6BP,EAAK,EAC3EQ,EAAeZ,EAAUU,EAAeE,kBAAc,EAAQV,EAASC,GACvEU,EAAe/C,EAAwB4C,EAAgBzD,KAAKe,OAC5DiD,EAAU7F,EAAOwF,GAAgBD,EACvC,GPNiB,IOMbC,GACF,GAA0B,IAAtBD,EACF,MAAM,IAAItE,WAAW,8DAElB,CACL,MAAM2E,EAAaG,EAAsBhG,EAAYC,EAAOwF,EAAe,GAC3E,IAAKO,GAAuBH,IAAeC,EACzC,MAAM,IAAI5E,WAAW,8BAEvB,GAAI2E,EAAaC,EACf,MAAM,IAAI5E,WAAW,gCAGzB,MAAO,CACLuE,aAAAA,EACAC,aAAAA,EACAI,QAAAA,GC3BG,MAAMG,EAA6BC,SACnC,SAASC,EAAU7C,EAAU8C,KAAQC,GAC1C,OAAID,aAAe9C,EACV8C,EAEF9C,EAASgD,KAAKF,KAAQC,GAExB,MAAME,EACXC,SACE,OAAOC,KAAKC,YAGT,MAAMC,UAA2BJ,EACtCK,UACE,MAAM,IAAIC,MAAM,wCAGpB,MAAOC,EAAcC,GAAgB/D,IAC9B,MAAMgE,UAAuBL,EAClCM,YAAYC,GACVC,QACAJ,EAAaN,KAAMjD,OAAO4D,OAAOF,IAEnCJ,eACE,OAAOA,EAAaL,OCxBjB,SAASY,EAAcC,EAAGC,GAC/B,OAAID,EAAIC,GACE,EACCD,EAAIC,EACN,EAEF,EAEF,SAASC,EAAQtC,GACtB,OAAOmC,EAAcnC,EAAK,GAErB,SAASuC,EAAiBvC,EAAKwC,EAAKhC,GACzC,OAAOA,EAAaR,EAAMwC,GAAOA,EAE5B,SAASC,EAAcC,GAC5B,OAAOH,EAAiBG,ETHE,KSGkBhF,GAE9C,SAASA,EAAWiF,GAClB,OAAO/F,KAAKe,MAAMf,KAAKgG,IAAID,IAAML,EAAQK,GAEpC,SAASE,EAAmB7C,EAAKwC,EAAKhC,GAC3C,MACMsC,EADa9C,EAAI+C,IAAIP,GACCQ,KAAKR,GAC3BS,EAAWjD,EAAIkD,IAAIJ,GAAUK,WACnC,OAAOL,EAASM,IAAI5C,EAAayC,EAAWT,GAAOA,GAE9C,SAASa,EAAeV,EAAGnG,GAChC,OAAQmG,EAAInG,EAAMA,GAAOA,ECzBpB,SAAS8G,EAAStD,EAAKuD,GAC5B,OAGOC,EADgBrE,EAFPsE,OAAOzD,GAAMuD,EAAQ,KAGIpE,EADpC,IAAkBA,EAGlB,SAASuE,EAAOvE,EAAKwE,EAAKC,GAC/B,OAAOzE,EAAMqE,EAAarE,EAAKwE,EAAKC,GAEtC,SAASJ,EAAarE,EAAKwE,EAAKC,GAC9B,OAAO,IAAIC,MAAMjH,KAAKJ,IAAI,EAAGmH,EAAMxE,EAAIoE,OAAS,IAAIO,KAAKF,GAEpD,SAASG,EAAW/D,GACzB,OAAOA,EAAM,EAAI,IAAM,ICdzB,MACMgE,EAAYpH,KAAKqH,IAAI,GADN,GAEd,MAAMC,EACXnC,YAAYoC,EAAMC,GAChB7C,KAAK4C,KAAOA,EACZ5C,KAAK6C,IAAMA,EAEbC,OACE,OAAO/B,EAAQf,KAAK4C,OAAS7B,EAAQf,KAAK6C,KAE5CE,MACE,OAAO,IAAIJ,GAAU3C,KAAK4C,MAAQ,GAAI5C,KAAK6C,KAAO,GAEpDxB,MACE,OAAOrB,KAAK8C,OAAS,EAAI9C,KAAK+C,MAAQ/C,KAExC6B,IAAIvH,GACF,MAAOsI,EAAMC,GAAOG,EAAW1I,GAC/B,OAAO2I,EAAiBjD,KAAK4C,KAAOA,EAAM5C,KAAK6C,IAAMA,GAEvDlB,IAAIrH,GACF,MAAOsI,EAAMC,GAAOG,EAAW1I,GAC/B,OAAO2I,EAAiBjD,KAAK4C,KAAOA,EAAM5C,KAAK6C,IAAMA,GAEvDpB,KAAKL,GACH,OAAO6B,EAAiBjD,KAAK4C,KAAOxB,EAAGpB,KAAK6C,IAAMzB,GAEpDI,IAAIJ,GACF,MAAM8B,EAAYlD,KAAK4C,KAAOxB,EAC9B,IAAI+B,EAAUjB,OAAOgB,IACU,IAA3BC,EAAQC,QAAQ,QAClBD,EAAUD,EAAUG,QAAQ,KAE9B,MAAMC,EAAUH,EAAQC,QAAQ,KAChC,IAAIG,EAAY,EAChB,IAAiB,IAAbD,EAAgB,CAClB,IAAIE,EAAWL,EAAQM,OAAOH,EAAU,GACxCE,EAAWrB,EAAOqB,EArCH,EAqC2B,KAC1CA,EAAWA,EAASC,OAAO,EAtCZ,GAuCfF,EAAYG,SAASF,IAAazC,EAAQmC,IAAc,GAI1D,OAAOD,EAFM5H,KAAKC,MAAM4H,IAAc,EAC1B7H,KAAKC,MAAM0E,KAAK6C,IAAMzB,GAAKmC,GAGzC3B,WACE,OAAO5B,KAAK4C,KAAOH,EAAYzC,KAAK6C,IAEtCc,WACE,OAAOC,OAAO5D,KAAK4C,MAAQgB,OAAOnB,GAAamB,OAAO5D,KAAK6C,MAGxD,SAASgB,EAAevJ,EAAOsB,GACpC,IAAIgH,EACAC,EACJ,GAAIvI,aAAiBqI,EACnBC,EAAOtI,EAAMsI,KACbC,EAAMvI,EAAMuI,SACP,GAAqB,iBAAVvI,EAAoB,CACpC,GAAIsB,EACF,MAAM,IAAIE,UAAU,kCAEtB8G,EAAOvH,KAAKC,MAAMhB,EAAQmI,GAC1BI,EAAMvI,EAAQmI,GAAa,OACtB,GAAqB,iBAAVnI,EAAoB,CACpC,MAAMwJ,EAAWF,OAAOnB,GACxBG,EAAOzH,OAAOb,EAAQwJ,GACtBjB,EAAM1H,OAAOb,EAAQwJ,GAAY,OAC5B,CAAA,GAAqB,iBAAVxJ,EAShB,MAAM,IAAI8F,MAAM,2BAToB,CAEpC,IADA9F,EAAQA,EAAMyJ,QACJC,MAAM,MACd,MAAM,IAAIC,YAAY,gBAAgB3J,iBAExC,MAAM4J,EAAW5J,EAAM0H,OAzEN,EA0EjBY,EAAOzH,OAAOb,EAAMmJ,OAAOS,IAC3BrB,EAAM1H,OAAOb,EAAMmJ,OAAO,EAAGS,KAI/B,OAAO,IAAIvB,EAASC,EAAMC,GAErB,SAASsB,EAAiBtD,EAAGC,GAClC,OAAOF,EAAcC,EAAE+B,KAAM9B,EAAE8B,OAAShC,EAAcC,EAAEgC,IAAK/B,EAAE+B,KAEjE,SAASG,EAAW1I,GAClB,MAAqB,iBAAVA,EACF,CAAC,EAAGA,GAEN,CAACA,EAAMsI,KAAMtI,EAAMuI,KAE5B,SAASI,EAAiBL,EAAMC,GAC9B,IAAIuB,EAASvB,EAAMJ,GAAa,EAC5B4B,EAAUzB,EAAOvH,KAAKC,MAAMuH,EAAMJ,GACtC,MAAM6B,EAAWvD,EAAQsD,GACnBE,EAAUxD,EAAQqD,GAKxB,OAJIG,GAAWD,GAAYC,IAAYD,IACrCD,GAAWE,EACXH,GAAU3B,EAAY8B,GAEjB,IAAI5B,EAAS0B,EAASD,GCjG/B,MAAMI,EAAqBxG,EAAkByG,OAAO,QAC7C,SAASC,EAAeC,GAC7B,OAAOrH,EAAcqH,EAAQH,GAAqBpD,IAAOA,GAAK,IAoBzD,SAASwD,EAAiBC,EAAIC,GACnC,IAAItG,EAAIuG,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EACxC,OAAOC,GAAa,CAClBC,MAA0B,OAAlBjH,EAAKsG,EAAGW,OAAiBjH,EAAKqG,EAAGY,MACzCC,OAA4B,OAAnBX,EAAKD,EAAGY,QAAkBX,EAAKF,EAAGa,OAC3CC,MAA0B,OAAlBX,EAAKF,EAAGa,OAAiBX,EAAKH,EAAGc,MACzCC,KAAwB,OAAjBX,EAAKH,EAAGc,MAAgBX,EAAKJ,EAAGe,KACvCC,MAA0B,OAAlBX,EAAKJ,EAAGe,OAAiBX,EAAKL,EAAGgB,MACzCC,QAA8B,OAApBX,EAAKL,EAAGgB,SAAmBX,EAAKN,EAAGiB,QAC7CC,QAA8B,OAApBX,EAAKN,EAAGiB,SAAmBX,EAAKP,EAAGkB,QAC7CC,aAAwC,OAAzBX,EAAKP,EAAGkB,cAAwBX,EAAKR,EAAGmB,aACvDC,aAAwC,OAAzBX,EAAKR,EAAGmB,cAAwBX,EAAKT,EAAGoB,aACvDC,YAAsC,OAAxBX,EAAKT,EAAGoB,aAAuBX,EAAKV,EAAGqB,cAkBlD,SAASV,GAAab,GAC3B,MAAO,IAAKA,EAAQ7B,KAAMqD,GAAoBxB,IAEhD,SAASwB,GAAoBxB,GAC3B,IAAI7B,EAAO,EACX,IAAK,MAAMnH,KAAaqC,EAAmB,CAEzC,GADiB2G,EAAOhJ,GACV,CACZmH,EAAO/B,EAAQ4D,EAAOhJ,IACtB,OAGJ,OAAOmH,EAEF,SAASsD,GAA2BC,GACzC,IAAI1M,EZ9Dc,EY+DlB,KAAOA,EZxEiB,IYwEK0M,EAAIrI,EAAkBrE,KACjDA,IAEF,OAAOA,EC3DF,MAAM2M,GAAoB,CAC/BC,QAAS,EACTC,UAAW,EACXC,UAAW,EACXC,eAAgB,EAChBC,eAAgB,EAChBC,cAAe,GAEJC,GAAyB,CACpChB,MAAO,EACPC,QAAS,EACTC,QAAS,EACTC,aAAc,EACdC,aAAc,EACdC,YAAa,GAER,SAASY,GAAsBnC,GACpC,MAAO,CACL4B,QAAS5B,EAAOoC,MAAQ,EACxBP,UAAW7B,EAAOqC,QAAU,EAC5BP,UAAW9B,EAAOsC,QAAU,EAC5BP,eAAgB/B,EAAOuC,aAAe,EACtCP,eAAgBhC,EAAOwC,aAAe,EACtCP,cAAejC,EAAOyC,YAAc,GAGjC,SAASC,GAAsB1C,GACpC,OAAOd,EAAetK,GAAWkI,KAAKkD,EAAOiB,MAAM/D,IAAIyF,GAAmB3C,IAErE,SAAS2C,GAAmB3C,GACjC,OAAOd,EAAec,EAAOuB,aAAarE,IAAIgC,EAAec,EAAOsB,cAAcxE,KbpCzD,MaoC4EI,IAAIgC,EAAec,EAAOqB,cAAcvE,KbnCpH,MamCuII,IAAIgC,EAAec,EAAOoB,SAAStE,KblCzK,MakC6LI,IAAIgC,EAAec,EAAOmB,SAASrE,KbjChO,OaiCoPI,IAAIgC,EAAec,EAAOkB,OAAOpE,KAAKnI,IAE/S,SAASiO,GAAc5C,GAC5B,OAAOA,EAAO4B,QAAUjN,EbpCE,KaoCWqL,EAAO6B,UbrClB,IaqC6C7B,EAAO8B,UbtCrD,IasCgF9B,EAAO+B,ebvCvF,IauCsH/B,EAAOgC,eAA+BhC,EAAOiC,cAEvL,SAASY,GAAerG,EAAMhC,GACnC,IAMIsI,EANA7B,EAAO,EACPC,EAAQ,EACRC,EAAU,EACVC,EAAU,EACVC,EAAe,EACfC,EAAe,EAEnB,OAAQ9G,GACN,KbtDe,EauDbsI,EAAOtG,EAAKK,IAAIjI,GAChBqM,EAAO6B,EAAK7F,WACZT,EAAOA,EAAKQ,IAAI8F,EAAKhG,KAAKlI,IAC5B,Kb3DgB,Ea4DdkO,EAAOtG,EAAKK,IAAIlI,GAChBuM,EAAQ4B,EAAK7F,WACbT,EAAOA,EAAKQ,IAAI8F,EAAKhG,KAAKnI,IAC5B,KbhEkB,EaiEhBmO,EAAOtG,EAAKK,IbxDU,MayDtBsE,EAAU2B,EAAK7F,WACfT,EAAOA,EAAKQ,IAAI8F,EAAKhG,Kb1DC,Oa2DxB,KbrEkB,EasEhBgG,EAAOtG,EAAKK,Ib7DU,Ka8DtBuE,EAAU0B,EAAK7F,WACfT,EAAOA,EAAKQ,IAAI8F,EAAKhG,Kb/DC,MagExB,Kb1EuB,Ea2ErBgG,EAAOtG,EAAKK,IblES,KamErBwE,EAAeyB,EAAK7F,WACpBT,EAAOA,EAAKQ,IAAI8F,EAAKhG,KbpEA,MaqEvB,Kb/EuB,EagFrBgG,EAAOtG,EAAKK,IbvES,KawErByE,EAAewB,EAAK7F,WACpBT,EAAOA,EAAKQ,IAAI8F,EAAKhG,KbzEA,Ma2EzB,OAAO+D,GAAa,CAClBC,MAAO,EACPC,OAAQ,EACRC,MAAO,EACPC,KAAAA,EACAC,MAAAA,EACAC,QAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,YAAa/E,EAAKS,aAGf,SAAS8F,GAAcC,GAC5B,MAAMC,EAAWvM,KAAKiB,MAAMqL,EAAWpO,GACvCoO,GAAYC,EAAWrO,EACvB,MAAMgN,EAAUlL,KAAKiB,MAAMqL,EAAWrO,GACtCqO,GAAYpB,EAAUjN,EACtB,MAAMkN,EAAYnL,KAAKiB,MAAMqL,Eb1FH,Ma2F1BA,Gb3F0B,Ka2FdnB,EACZ,MAAMC,EAAYpL,KAAKiB,MAAMqL,Eb7FH,Ka8F1BA,Gb9F0B,Ia8FdlB,EACZ,MAAMC,EAAiBrL,KAAKiB,MAAMqL,EbhGT,KaiGzBA,GbjGyB,IaiGbjB,EACZ,MAAMC,EAAiBtL,KAAKiB,MAAMqL,EbnGT,Ka6GzB,MAAO,CARe,CACpBpB,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAC,eAAAA,EACAC,eAAAA,EACAC,cAPFe,GbpGyB,IaoGbhB,GASWiB,GCvHlB,MAAMC,GAAa,CACxBC,QAAS,CACPC,KAAM,EACNC,GAAI,GAENC,QAAS,CACPC,KAAM,GAERC,SAAU,CACRD,KAAM,EACNE,KAAM,MAERC,OAAQ,CACNH,MAAO,EACPE,KAAM,GAERE,IAAK,CACHC,WAAY,EACZC,OAAQ,GAEVC,SAAU,CACRC,GAAI,GAENC,QAAS,CACPC,GAAI,GAENC,OAAQ,CACNC,KAAM,GAERC,QAAS,CACPC,GAAI,GAENC,SAAU,CACRlB,KAAM,EACNC,GAAI,EACJkB,MAAO,KACPC,OAAQ,KACRC,MAAO,KACPC,OAAQ,KACRC,MAAO,OCpCJ,MAAMC,GACX/I,YAAYgJ,GACVxJ,KAAKwJ,GAAKA,EAEZC,UAAUC,EAAOC,GACf,MAAO,IAAM5H,EAAS2H,EAAO,GAE/BE,iBAAiBH,EAAWE,GAC1B,MAAME,EAAkB,KAAK5N,KAAKwN,GAC5BK,EAAepG,SAAS+F,EAAUhG,OAAO,IAC/C,GAAIoG,EACF,MAAM,IAAIpP,WAAW,8CAEvB,MAAO,CAACqP,GAAc,IAGnB,SAASC,GAAeC,EAAYC,EAASC,EAAKC,GACvD,IAAI3L,EACJ,IAAI4L,EAA6D,OAAnD5L,EAAKqJ,GAAWwC,GAAkBL,UAAwB,EAASxL,EAAG0L,GACpF,QAAe,IAAXE,EAAmB,CACrB,IAAID,EAGF,MAAM,IAAI/J,MAAM,cAAgB8J,GAFhCE,EAAS,EAKb,OAAQA,EAASH,IAAYlJ,EAAQqJ,IAAW,GAK3C,SAASC,GAAkBL,GAChC,OAAOA,EAAWM,MAAM,KAAK,GCjCxB,MAAMC,WAAwBhB,GACnCiB,cAAcC,GACZ,MAAM9F,EAAS+F,GAAsBD,GACrC,MAAO,CACLP,SAAK,EACLD,aAAS,EACTU,KAAMhG,EAAOiG,QACblB,MAAO/E,EAAOkG,SACdC,IAAKnG,EAAOoG,QAGhBC,kBAAkBL,EAAMjB,EAAOoB,GAC7B,OAAOG,GAAgBN,EAAMjB,EAAOoB,GAEtCI,YAAYP,EAAMjB,GAChB,OAAc,IAAVA,EACK1J,KAAKmL,WAAWR,GAAQ,GAAK,GAExB,IAAVjB,GAAyB,IAAVA,GAAyB,IAAVA,GAAyB,KAAVA,EACxC,GAEF,GAET0B,eACE,OAAO,GAETD,WAAWR,GACT,OAAOA,EAAO,GAAM,IAAMA,EAAO,KAAQ,GAAKA,EAAO,KAAQ,GAE/DU,uBACE,OAAOC,GAETC,8BACE,OAAOD,IAGJ,MACME,GAAkB,IAAIjB,GADN,WC3BhBe,GAAmB,KACnBG,GAAkBhM,SACxB,SAASiM,GAAqBjL,GACnC,OAAOkL,GAAelL,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQtK,EAAU8F,QAAS9F,EAAU+F,UAAW/F,EAAUgG,UAAWhG,EAAUiG,eAAgBjG,EAAUkG,eAAgBlG,EAAUmG,eAKrM,SAAS+E,GAAef,EAASC,EAAUE,EAAQxE,EAASC,EAAWC,EAAWC,EAAgBC,EAAgBC,GACvH,OAAO/C,EAAeoH,GAAgBL,EAASC,EAAUE,EAAQxE,EAASC,EAAWC,EAAWC,IAAiBjF,KjBTxF,KiBS0GI,IjBV1G,KiBUiI,MAAlB8E,EAAyBA,EAAiB,IAAqC,MAAjBC,EAAwBA,EAAgB,IAEzO,SAASqE,GAAgBL,EAASC,EAAUE,EAAQxE,EAASC,EAAWC,EAAWC,GACxF,MAAM5D,EAAO/B,EAAQ6J,GACrB,IACIgB,EACAC,EAFAC,EAAc,EAGlB,MAAMC,EAAkBnB,GAAW,GAAKA,EAAU,IAC5CoB,EAAcD,EAAkBnB,EAAU,KAAOA,EACvD,KAAOkB,EAAc,GAAIA,IAAe,CACtCF,EAAYb,EAASjI,EAAOgJ,EAC5B,MAAMG,EAAWC,KAAKC,IAAIH,EAAanB,EAAW,EAAGe,EAAsB,MAAXrF,EAAkBA,EAAU,EAAgB,MAAbC,EAAoBA,EAAY,EAAgB,MAAbC,EAAoBA,EAAY,EAAqB,MAAlBC,EAAyBA,EAAiB,GAC/M,IAAK0F,GAAUH,GAAW,CACxBJ,EAAQI,EAAWnJ,EAAOgJ,EjBRN,MiBSpB,OASJ,YANc,IAAVD,GAAoBD,EAAY,GAAKA,EAAYJ,GAAgBN,YAAYN,EAASC,KACxFwB,KAEEN,IACFF,EAAQ,IAAIK,KAAKL,GAAOS,eAAe1B,IAElCiB,EAEF,SAASU,GAAqBC,GACnC,IAAI/B,EAAa+B,EAAUhL,IjBnCF,KiBoCrBiL,EAAeD,EAAU7K,IAAI8I,EAAWhJ,KjBpCnB,MiBoCsCG,WAC3D6K,EAAe,IACjBA,GjBtCuB,IiBuCvBhC,EAAaA,EAAW9I,IAAI,IAE9B,MAAMgF,EAAiBtL,KAAKiB,MAAMmQ,EjB1CT,KiB4CzB,OADAA,GjB3CyB,IiB2CT9F,EACT,IACF+D,GAAsBD,EAAW7I,YACpC+E,eAAAA,EACAC,cAAe6F,GAGZ,SAAS/B,GAAsBD,GACpC,MAAOiC,EAAQC,GAAcC,GAAkBnC,GAC/C,MAAO,CACLG,QAAS8B,EAAOG,iBAChBhC,SAAU6B,EAAOI,cAAgB,EACjC/B,OAAQ2B,EAAOK,aAAeJ,EAC9BpG,QAASmG,EAAOM,cAChBxG,UAAWkG,EAAOO,gBAClBxG,UAAWiG,EAAOQ,gBAClBxG,eAAgBgG,EAAOS,sBAGpB,SAASC,GAAYC,GAC1B,IAAI7O,EACJ,OAAqC,OAA7BA,EAAK6O,EAAG5B,KAA4BjN,EAAKkN,GAAqB2B,EAAGhN,gBAEpE,SAASiN,GAAsB1C,GACpC,OAAOvP,KAAKiB,MAAM2O,GAAgBL,EAAS,EAAG,GjBjDnB,KiBmDtB,SAAS2C,GAAmBf,GACjC,OAAOI,GAAkBJ,EAAUhL,IjBrEV,KiBqE2BI,YAAY,GAAGiL,iBAE9D,SAASW,GAAoB5C,EAASC,EAAUE,GACrD,MAAO2B,EAAQC,GAAcC,GAAkB3B,GAAgBL,EAASC,EAAUE,IAClF,OAAOjJ,EAAe4K,EAAOe,YAAcd,EAAY,IAAM,EAE/D,SAASC,GAAkBnC,GACzB,MAAM3H,EAAO/B,EAAQ0J,GACrB,IACIiD,EADA5B,EAAc,EAElB,KAAOA,EAAc,GAAIA,IAAe,CACtC,MAAM6B,EAAU,IAAIzB,KAAKzB,EAAa3H,EAAOgJ,EjBlEvB,OiBmEtB,IAAKM,GAAUuB,GAAU,CACvBD,EAAOC,EACP,OAMJ,YAHa,IAATD,GACFrB,KAEK,CAACqB,EAAM5K,EAAOgJ,GAEvB,SAASM,GAAUhL,GACjB,OAAOwM,MAAMxM,EAAEjB,WAEV,SAASkM,KACd,MAAM,IAAI5R,WAAW,mCAEhB,SAASoT,GAAcC,EAAaC,GACzC,OAAO1S,KAAKe,OAAO2R,EAAcD,GjBpFT,OiBsFnB,SAASE,GAAavD,EAAY7E,GACvC,OAAO6E,EjBvFiB,MiBuFJ7E,ECvGf,SAASqI,GAAepN,EAAGC,GAChC,OAAQoN,GAAiBrN,EAAGC,IAAMD,EAAEsN,SAASlO,aAAea,EAAEqN,SAASlO,WAElE,SAASiO,GAAiBrN,EAAGC,GAClC,OAAOqD,EAAiBuH,GAAqB7K,EAAER,gBAAiBqL,GAAqB5K,EAAET,iBAElF,SAAS+N,GAAaC,EAAIC,GAC/B,OAAO1N,EAAc2G,GAAc8G,EAAGhO,gBAAiBkH,GAAc+G,EAAGjO,iBAEnE,SAASkO,GAAuB1J,EAAIC,GACzC,OAAOlE,EAAciE,EAAG8F,KAAM7F,EAAG6F,OAAS/J,EAAciE,EAAG6E,MAAO5E,EAAG4E,QAAU9I,EAAciE,EAAGiG,IAAKhG,EAAGgG,KAEnG,SAAS0D,GAAiB3N,EAAGC,GAClC,OAAOqD,EAAiBtD,EAAE4K,IAAkB3K,EAAE2K,KCnBzC,SAASgD,GAAoB9D,EAAMjB,EAAOoB,EAAK4D,EAAcC,GAIlE,MAAO,CAHPhE,EAAOxP,OAAOwP,GACdjB,EAAQ5O,EAAa4O,EAAO,EAAGgF,EAAatD,aAAaT,GAAOgE,GAChE7D,EAAMhQ,EAAagQ,EAAK,EAAG4D,EAAaxD,YAAYP,EAAMjB,GAAQiF,IAG7D,SAASC,GAAiBnO,EAAWkO,GAC1C,MAAO/D,EAASC,EAAUE,GAAU0D,GAAoBhO,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQS,GAAiBmD,GAClI,MAAO,CAAE/D,QAAAA,EAASC,SAAAA,EAAUE,OAAAA,GAUvB,SAAS8D,GAAqBpO,EAAWkO,GAC9C,MAAO,IACFC,GAAiBnO,EAAWkO,MAC5BG,GAAiBrO,EAAWkO,IAG5B,SAASG,IAAiBvI,QAC/BA,EAAOC,UACPA,EAASC,UACTA,EAASC,eACTA,EAAcC,eACdA,EAAcC,cACdA,GACC+H,GAOD,MAAO,CAAEpI,QANTA,EAAUzL,EAAayL,EAAS,EAAG,GAAIoI,GAMrBnI,UALlBA,EAAY1L,EAAa0L,EAAW,EAAG,GAAImI,GAKdlI,UAJ7BA,EAAY3L,EAAa2L,EAAW,EAAG,GAAIkI,GAIHjI,eAHxCA,EAAiB5L,EAAa4L,EAAgB,EAAG,IAAKiI,GAGEhI,eAFxDA,EAAiB7L,EAAa6L,EAAgB,EAAG,IAAKgI,GAEkB/H,cADxEA,EAAgB9L,EAAa8L,EAAe,EAAG,IAAK+H,ICtC/C,MAAMI,GAAoB,CAC/B7E,IAAKhI,OACL+H,QAAS9O,OACTwP,KAAMxP,OACNuO,MAAOvO,OACPsO,UAAWvH,QAEA8M,GAAe,IACvBD,GACHjE,IAAK3P,QAEM8T,GAAe,CAC1BlI,KAAM5L,OACN6L,OAAQ7L,OACR8L,OAAQ9L,OACR+L,YAAa/L,OACbgM,YAAahM,OACbiM,WAAYjM,QAED+T,GAAmB,CAC9BhF,IAAKhI,OACL+H,QAAS9O,OACTwP,KAAMxP,OACNuO,MAAOvO,OACPsO,UAAWvH,OACX4I,IAAK3P,QAEMgU,GAAmB1R,EAAeO,GAAmB,IAAM7C,SC5BjE,MAAMiU,WAA4B7E,GACvCC,cAAcC,GACZ,MAAM9F,EAASjE,MAAM8J,cAAcC,IAC7BE,KAAEA,GAAShG,EACjB,MAAO,IACFA,EACHuF,IAAKS,EAAO,EAAI,MAAQ,KACxBV,QAASU,EAAO,IAAMA,EAAO,GAAKA,ICPjC,MAQM0E,GAA6BvV,EAAmB,eAL3B,CAChCwV,KAAM,EACNC,MAAO,EACPC,OAAQ,GAN2B,GCUxBC,GAAsB3V,EAAmB,iBAN3B,CACzB4V,WAAY,EACZC,QAAS,EACTC,MAAO,EACP5V,OAAQ,GARyB,GCS5B,SAAS6V,GAAyBlV,EAASwE,ExBN5B,GwBOpB,MAAML,EAAiBjE,EAAiBF,GAClCmV,EAAkBhR,EAAeE,aACjC+Q,EAAYjR,EAAekR,uBACjC,IAEIC,EAFAjR,ExBdoB,EwBepBK,EAAU,EAUd,YARwB,IAApByQ,GACF9Q,EAAeZ,EAAU0R,OAAiB,ExBlBpB,EwBkBwC3Q,GAC9DE,EAAU7F,EAAOwF,GACjBiR,EAASxW,EAAauF,IAAiB,QAChB,IAAd+Q,GAAsC,SAAdA,IACjCE,EAASnV,EAAaiV,EAAW,EAAG,EvBpBT,GuBqB3B1Q,EAAUhE,KAAKqH,IAAI,GAAI,EAAIuN,IAEtB,CACLjR,aAAAA,EACAgR,uBAAwBC,EACxBhR,aAAc/C,EAAwBvB,EAASU,KAAKC,OACpD+D,QAAAA,GC5BG,MAMM6Q,GAA6BpW,EAAmB,eAJ3B,CAChCwV,KAAM,EACNC,MAAO,GAJ6B,GCiB/B,SAASY,GAAkBxL,EAAQyL,GACxC,OAAOC,GAAc1L,GAAU,IAAM2L,GAAc3L,EAAQyL,GAEtD,SAASC,GAAc1L,GAC5B,OAAO4L,GAAmB5L,GAAU,IAAM5C,EAAS4C,EAAOoG,OAAQ,GAE7D,SAASwF,GAAmB5L,GACjC,MAAMiG,QAAEA,GAAYjG,EACpB,OAAQiG,EAAU,KAAOA,EAAU,KAAOpI,EAAWoI,GAAW7I,EAAS1G,KAAKgG,IAAIuJ,GAAU,GAAK7I,EAAS6I,EAAS,IAAM,IAAM7I,EAAS4C,EAAOkG,SAAU,GAKpJ,SAASyF,GAAc3L,EAAQyL,GACpC,MAAMI,EAAQ,CAACzO,EAAS4C,EAAO4B,QAAS,IAOxC,OANI6J,EAAapR,c1B7BG,I0B8BlBwR,EAAMC,KAAK1O,EAAS4C,EAAO6B,UAAW,IAClC4J,EAAapR,c1BhCC,G0BiChBwR,EAAMC,KAAK1O,EAAS4C,EAAO8B,UAAW,GAAKiK,GAAqB/L,EAAO+B,eAAgB/B,EAAOgC,eAAgBhC,EAAOiC,cAAewJ,EAAaJ,wBAAwB,KAGtKQ,EAAMjO,KAAK,KAEb,SAASoO,GAAgBC,GAC9B,MAAOjM,EAAQiD,GAAYF,GAAcrM,KAAKgG,IAAIuP,IAC5CC,EAAoBH,GAAqB/L,EAAO+B,eAAgB/B,EAAOgC,eAAgBhC,EAAOiC,mBAAe,GAAQ,GAC3H,OAAOpE,EAAWoO,GAAc7O,EAAS4C,EAAO4B,QAAqB,GAAXqB,EAAe,GAAK,IAAM7F,EAAS4C,EAAO6B,UAAW,IAAM7B,EAAO8B,WAAaoK,EAAoB,IAAM9O,EAAS4C,EAAO8B,UAAW,GAAKoK,EAAoB,IAElN,SAASC,GAAiB9G,EAAY+G,GAC3C,OAAI/G,IJ5CiC,II4ClB+G,GJ7CiB,II6CsBA,GVT/B,YUSqE/G,GACvF,SAASA,KAEX,GAoCT,SAASgH,GAAuBC,GAC9B,OAAOA,EAAO/W,KAAI,EAAEuE,EAAKyS,EAASC,MAChC,GAAIA,GAAa1S,EAAK,CAEpB,OADepD,KAAKgG,IAAI5C,GAAK2S,eAAe,WAAY,CAAEC,aAAa,IACvDH,EAElB,MAAO,MACN3O,KAAK,IAEV,SAASmO,GAAqB1K,EAAcC,EAAcC,EAAa8J,EAAwB/Q,EAAcD,GAC3G,IAAIsS,EAAYzN,EAAemC,GAAcvE,K1BrFpB,K0BqFsCI,IAAIgC,EAAeoC,GAAcxE,K1BtFvE,M0BsF0FI,IAAIqE,GACnHjH,IACFqS,EAAYhQ,EAAmBgQ,OAAsC,IAA3BtB,EAAoCxW,EAAOwF,GAAgB3D,KAAKqH,IAAI,GAAI,EAAIsN,GAAyB/Q,IAEjJ,MAAMsS,EAAeD,EAAUjQ,MACzB0E,EAAUwL,EAAa/P,I1BzFH,K0B2F1B,IAAIgQ,EAAezP,EADEwP,EAAa5P,IAAIoE,EAAQtE,K1B1FpB,M0B2FeG,WAAY,GAErD,OADA4P,OAA0C,IAA3BxB,EAAoCwB,EAAaC,QAAQ,MAAO,IAAMD,EAAa/N,OAAO,EAAGuM,GACrG,CACLwB,EAAe,IAAMA,EAAe,GACpCzL,EAAQnE,YAAc0P,EAAUxO,QAAU,ICtGvC,SAAS4O,GAAiB7U,GAC/BD,EAAcC,EAAU,CACtB8U,mBACE,OAAO3R,KAAKyL,IAAiB9H,YAE/BiO,oBACE,OAAO5R,KAAKyL,IAAiBjK,I3BDR,K2BCyBmC,YAEhDqH,oBACE,OAAOhL,KAAKyL,IAAiBjK,I3BHR,K2BGyBI,YAEhDiQ,eACE,OAAO7R,KAAKyL,IAAiBjK,I3BLP,K2BKyBI,cAIrD,MAAMkQ,GAAc,CAClB3D,SAAU,YAEZ,IAAK,MAAM4D,KAAYhU,EACrB+T,GAAYC,GAAY,QjBzBYC,GiByBkBD,GjBxB7CE,OAAO,GAAGC,cAAgBF,GAAEG,MAAM,IADtC,IAA+BH,GiB2B/B,SAASI,GAAevV,EAAUwV,EAAa,IACpDzV,EAAcC,EAAUY,EAAe4U,EAAW5N,OAAO,aAAcxK,GAAa,WAClF,OAAO+F,KAAKK,eAAeyR,GAAY7X,QAGpC,MAAMqY,GAA0B,CACrC,MACA,UACA,OACA,QACA,YACA,cACA,aACA,eACA,cAMWC,GAAqB,IAC7BD,GACH,MACA,YACA,YACA,aACA,cAEK,SAASE,GAAoB3V,EAAU4V,GAC5C7V,EAAcC,EAAUY,EAAegV,GAAYxY,GAAa,WAC9D,MAAMyY,EAAQ1S,KAAKmO,SAASlU,GAAU+F,MAEtC,OADAjD,OAAO4V,eAAe3S,KAAM/F,EAAU,CAAEyY,MAAAA,IACjCA,MAGJ,SAASE,GAAgBC,EAAYC,IACzCD,EAAW5V,WAAa4V,GAAYpT,OAAOsT,aAAe,YAAcD,EC9DpE,MAUME,GAA4BlZ,EAAmB,SAN3B,CAC/BmZ,OAAQ,EACRC,IAAK,EACLC,OAAQ,EACRnZ,OAAQ,ICAH,SAASoZ,GAAcC,EAAkBC,EAAUC,ENRvB,GMSjC,MAAMC,EAAmBH,EAAiBI,uBAAuBH,GACjE,GAAgC,IAA5BE,EAAiBxR,OACnB,OAAOwR,EAAiB,GAExB,GNV2B,IMUvBD,EACF,MAAM,IAAI9Y,WAAW,oBAEvB,GAAI+Y,EAAiBxR,OACnB,OAAOwR,ENfiB,IMeAD,EAAiC,EAAI,GACxD,CACL,MAAMG,EAQZ,SAAwBL,EAAkBM,GACxC,MAAMC,EAAexG,GAAYuG,GAC3BE,EAAkBR,EAAiBS,wBAAwB,IAAIC,GAAQH,EAAajS,IAAIpI,KAE9F,OADuB8Z,EAAiBS,wBAAwB,IAAIC,GAAQH,EAAa/R,IAAItI,KACrEsa,EAZJG,CAAeX,EAAkBC,GAC3CW,EAAeZ,EAAiBI,uBAAuBH,EAASzR,IAAI,CACxEqE,YAAawN,GNpBW,IMoBAH,GAAoC,EAAI,MAElE,OAAOU,ENtBmB,IMsBNV,EAAmC,EAAIU,EAAajS,OAAS,ICwBhF,SAASkS,IAASvJ,KAAEA,EAAIjB,MAAEA,EAAKoB,IAAEA,GAAOqJ,EAAYzF,EAAcxT,GACvEyP,GAAQwJ,EACR,MAAMC,EAAWtZ,EAAa4O,EAAO,EAAGgF,EAAatD,aAAaT,GAAOzP,GACzE,IAAImZ,EAAS3K,IAAU0K,EAAWtJ,EAAM,EAExC,OADAuJ,EAASvZ,EAAauZ,EAAQ,EAAG3F,EAAaxD,YAAYP,EAAMyJ,GAAWlZ,GACpE,CAAEyP,KAAAA,EAAMjB,MAAO0K,EAAUtJ,IAAKuJ,GAEhC,SAASC,IAAU3J,KAAEA,EAAIjB,MAAEA,EAAKoB,IAAEA,GAAOyJ,EAAa7F,EAAcxT,GACzE,GAAIqZ,EAAa,CAEf,GADA7K,GAAS6K,EACLA,EAAc,EAChB,KAAO7K,EAAQ,GACbA,GAASgF,EAAatD,eAAeT,OAElC,CACL,IAAIS,EACJ,KAAO1B,GAAS0B,EAAesD,EAAatD,aAAaT,KACvDjB,GAAS0B,EACTT,IAGJG,EAAMhQ,EAAagQ,EAAK,EAAG4D,EAAaxD,YAAYP,EAAMjB,GAAQxO,GAEpE,MAAO,CAAEyP,KAAAA,EAAMjB,MAAAA,EAAOoB,IAAAA,GAEjB,SAAS0J,IAAQ5J,QAAEA,EAAOC,SAAEA,EAAQE,OAAEA,GAAUnF,GACrD,GAAIA,EAAM,CACR,IAAI6E,EAAaQ,GAAgBL,EAASC,EAAUE,GACpDN,EAAauD,GAAavD,EAAY7E,KACnCgF,QAAAA,EAASC,SAAAA,EAAUE,OAAAA,GAAWL,GAAsBD,IAEzD,MAAO,CAAEG,QAAAA,EAASC,SAAAA,EAAUE,OAAAA,GAOvB,SAAS0J,GAAmBjI,EAAWkI,GAE5C,GADoBtO,GAA2BsO,I9BjF9B,E8BmFf,MAAM,IAAIja,WAAW,oCAEvB,OAAO+R,EAAU3K,IAAIyF,GAAmBoN,ICrEnC,SAASC,GAA8BlU,EAAWmU,EAAeC,EHlB3C,EGkB2EC,GACtG,MAAQC,kBAAmBnE,EAAUoE,SAAEA,EAAQC,EAAEA,GAAMxU,EACvD,QAAmB,IAAfmQ,GHrBuB,IGqBEiE,EAAkC,CAC7D,GHvBsB,IGuBlBA,GAAiCI,EACnC,OAAOvJ,GAAqBjL,GAAWkB,IAAIiP,GACtC,CACL,MAAMsE,EAAoBC,GAAsB1U,EAAWmQ,EAAYoE,EAAUJ,GACjF,QAA0B,IAAtBM,EACF,OAAOA,EAET,GH5BuB,IG4BnBL,EACF,MAAM,IAAIpa,WAAW,gCAK3B,OADgB2Y,GAAc4B,EAAUI,GAAe3U,GAAYgP,GAAoBqF,IACxErJ,IAEjB,SAAS0J,GAAsB1U,EAAWmQ,EAAYoE,EAAUJ,GAC9D,MAAMpB,EAAmBwB,EAASvB,uBAAuB2B,GAAe3U,IAClEmT,EAAelI,GAAqBjL,GACpC4U,EAAoBT,EAAgB1T,EAAc0P,GAAcA,EACtE,IAAK,MAAM0E,KAAW9B,EAAkB,CACtC,MAAM+B,EAAoBD,EAAQ7J,IAC5B+J,EAAqB5B,EAAajS,IAAI4T,GAAmB3T,WAE/D,IAD8BgT,EAAgB1T,EAAcsU,GAAsBA,KACpDH,EAC5B,OAAOE,GAIN,SAASE,GAAiB9Q,GAC/B,MAAMqQ,SAAEA,GAAarQ,EACf+Q,EAAO,IAAK/Q,KAAW2B,GAAmB6H,SAAU,IAAIwH,GAAS,YACjEC,EAAO,IAAKpB,GAAQkB,EAAM,MAAOpP,GAAmB6H,SAAU,IAAIwH,GAAS,YAC3EE,EAAazC,GAAc4B,EAAUI,GAAeM,IAAOjK,IAEjE,OADmB2H,GAAc4B,EAAUI,GAAeQ,IAAOnK,IAC/C9J,IAAIkU,GAAYjU,WC3DpC,MAGMkU,GAAgB,sDAEhBC,GAAkB,SAAWD,GAC7BE,GAAkB,MAAQD,GAAkB,+CACrCE,GAAkBC,GAPJ,gCAOsCF,IACpDG,GAAiBD,GANJ,0BAMqCF,IAClDI,GAAiBF,GALJG,oGAKqCL,IAClDM,GAAaJ,GAAa,KAAOJ,GAAgBE,IACjDO,GAAeL,GAAaH,IAC5BS,GAAiB,yHACxBC,GAAoB,UAC1B,SAASP,GAAaQ,GACpB,OAAO,IAAIC,OAAO,IAAID,KAAS,KAE1B,SAASE,GAAgBhZ,GAC9B,OAAOA,EAAI6T,QAAQgF,GAAmB,KCDjC,SAASI,GAAmBjZ,GACjC,MAAMlC,EAAMob,GAAsBlZ,GAClC,IAAKlC,EACH,MAAMqb,GAAiB,WAAYnZ,GAErC,OAAOlC,EAEF,SAASsb,GAAcpZ,GAC5B,MAAMlC,EAAMub,GAAiBrZ,GAC7B,IAAKlC,EACH,MAAMqb,GAAiB,WAAYnZ,GAErC,OAAOlC,EAgBF,SAASwb,GAAgBtZ,GAC9B,MAAMlC,EAAMyb,GAAmBvZ,GAC/B,QAAY,IAARlC,EACF,MAAMqb,GAAiB,WAAYnZ,GAErC,OAAOlC,EAEF,SAAS0b,GAAUxZ,GACxB,IAAIlC,EAyCN,SAAsBkC,GACpB,MAAMyZ,EAAIf,GAAWgB,KAAKV,GAAgBhZ,IAC1C,GAAIyZ,EACF,OAAOE,GAAeF,EAAElF,MAAM,IA5CtBqF,CAAa5Z,GACvB,QAAY,IAARlC,GACF,GAAsB,MAAlBkC,EAAIqU,OAAO,GAAY,CACzB,MAAMwF,EAAWC,GAAkB9Z,IAAQ+Z,GAAiB/Z,GACxD6Z,Gd5CH,SAAwBhX,GAC7B,IAEE,OADAmO,GAAiBnO,ElBbU,IkBcpB,EACP,MAAOmX,GACP,OAAO,GcuCWC,CAAeJ,KAC7B/b,OAAM,SAIVA,EAAMub,GAAiBrZ,GAAK,GAE9B,QAAY,IAARlC,EACF,MAAMqb,GAAiB,OAAQnZ,GAEjC,OAAOlC,EAET,MAAMoc,GAAM,OACL,SAAShB,GAAsBlZ,GACpC,MAAMyZ,EAAIjB,GAAekB,KAAKV,GAAgBhZ,IAC9C,GAAIyZ,EACF,OAiCJ,SAAiC7G,GAC/B,MAAMuH,EAAYvH,EAAM,IACxB,IAAIuE,EACAE,GAAI,EACJ8C,IACF9C,EAAI6C,GAAI7b,KAAK8b,GACbhD,EAAoBE,EAAI,EAAI+C,GAAiBxH,EAAM2B,MAAM,MAE3D,MAAO,IACF8F,GAAmBzH,GACtBwE,SAAUxE,EAAM,IAChBuE,kBAAAA,EACAE,EAAAA,GA7COiD,CAAwBb,EAAElF,MAAM,IAGpC,SAAS8E,GAAiBrZ,EAAKua,EAAaC,GACjD,MAAMf,EAAIjB,GAAekB,KAAKV,GAAgBhZ,IAC9C,GAAIyZ,IAAMe,IAAWN,GAAI7b,KAAKob,EAAE,SAAWc,GAAed,EAAE,IAC1D,OAAOY,GAAmBZ,EAAElF,MAAM,IAGtC,SAASuF,GAAkB9Z,GACzB,MAAMyZ,EAAIpB,GAAgBqB,KAAKV,GAAgBhZ,IAC/C,GAAIyZ,EACF,MA8CK,CACLlJ,UAFyBqC,EA7CE6G,EAAElF,MAAM,IA+CnB,IAChBvH,QAASyN,GAAO7H,EAAM,IACtB3F,SAAUwN,GAAO7H,EAAM,IACvBzF,OAAQ,GALZ,IAA6ByF,EA1C7B,SAASmH,GAAiB/Z,GACxB,MAAMyZ,EAAIlB,GAAemB,KAAKV,GAAgBhZ,IAC9C,GAAIyZ,EACF,MAgDK,CACLlJ,UAFwBqC,EA/CE6G,EAAElF,MAAM,IAiDlB,IAChBvH,QAASU,GACTT,SAAUwN,GAAO7H,EAAM,IACvBzF,OAAQsN,GAAO7H,EAAM,KALzB,IAA4BA,EAtCrB,SAAS2G,GAAmBvZ,GACjC,MAAMyZ,EAAId,GAAae,KAAKV,GAAgBhZ,IAC5C,GAAIyZ,EACF,OAAOW,GAAiBX,EAAElF,MAAM,IAkBpC,SAAS8F,GAAmBzH,GAC1B,MAAO,CACLrC,SAAUqC,EAAM,IAChB5F,QAASyN,GAAO7H,EAAM,IACtB3F,SAAUwN,GAAO7H,EAAM,IACvBzF,OAAQsN,GAAO7H,EAAM,OAClB+G,GAAe/G,EAAM2B,MAAM,KAmBlC,SAASoF,GAAe/G,GACtB,MAAM/J,EAAY6R,GAAO9H,EAAM,IAC/B,MAAO,IACF9I,GAAc6Q,GAAsB/H,EAAM,IAAM,KAAK,GACxDjK,QAAS+R,GAAO9H,EAAM,IACtBhK,UAAW8R,GAAO9H,EAAM,IACxB/J,UAAyB,KAAdA,EAAmB,GAAKA,GAGvC,SAASuR,GAAiBxH,GACxB,OAAqB,MAAbA,EAAM,GAAa,GAAK,GAElC,SAAyBA,GACvB,OAAO8H,GAAO9H,EAAM,IAAMlX,EjClJA,KiCkJagf,GAAO9H,EAAM,IjCnJ1B,IiCmJ+C8H,GAAO9H,EAAM,IAAqB+H,GAAsB/H,EAAM,IAAM,IAHxGgI,CAAgBhI,EAAM2B,MAAM,IAK5D,SAASoG,GAAsB3a,GACpC,OAAO8F,SAASvB,EAAOvE,EAAK,EAAG,MAEjC,SAAS0a,GAAOhe,GACd,OAAOoJ,SAASpJ,GAAS,KAE3B,SAAS+d,GAAO/d,GACd,OAAOoJ,SAASpJ,GAAS,KAEpB,SAASme,GAAWne,GACzB,YAAiB,IAAVA,OAAmB,EAASoJ,SAASpJ,GAEvC,SAASyc,GAAiB2B,EAAM9a,GACrC,MAAM,IAAInD,WAAW,gBAAgBie,MAAS9a,MC5KzC,SAAS+a,GAAcC,GAC5B,MAAO,IACFA,EACHzK,cAA8B,IAApByK,EAAOzK,SAAsB0K,KAA0B,IAAIlD,GAASiD,EAAOzK,WAGlF,SAAS2K,GAAeF,GAC7B,MAAO,IACFD,GAAcC,GACjB5D,SAAU,IAAI+D,GAASH,EAAO5D,WCX3B,MAAMgE,GACXxY,YAAYgJ,GACVxJ,KAAKwJ,GAAKA,GCDP,MAAMyP,WAA0BD,GACrCxY,YAAYgJ,EAAIoH,GACdlQ,MAAM8I,GACNxJ,KAAK4Q,WAAaA,EAEpBsI,qBACE,MAAO,CAAClZ,KAAK4Q,YAEfuI,YACE,OAAOnZ,KAAK4Q,WAEdwI,kBCZK,SAASC,GAAoBC,EAAQC,GAC1C,MAAMnc,EAAO,GACPoT,EAAQ8I,EAAOE,cAAcD,GACnC,IAAK,MAAME,KAAQjJ,EACjBpT,EAAKqc,EAAKf,MAAQe,EAAK/G,MAEzB,OAAOtV,EAET,MAAMsc,GAAW,CACfC,GAAI,MACJC,GAAI,MAEC,SAASC,GAAkBC,GAEhC,OADAA,EAAeA,EAAaC,cAAcC,UAAU,OAAOvI,QAAQ,aAAc,IAC1EiI,GAASI,IAAiBA,ECb5B,MAAMG,GAAqBC,KAAKC,eAChC,SAASC,GAA2BC,GACzC,MAAO,GAAG5V,OAAO4V,GAAc,ICD1B,MAAMC,GAAe,CAC1B,eAAgB,CACd,KAAM,CACJ,CAACC,GAAO,aAAc,OAAQ,QAC9B,CAACA,GAAO,aAAc,QAAS,OAC/B,CAACA,GAAO,aAAc,MAAO,WAInC,SAASA,GAAO1O,GACd,OAAOhI,EAAegI,GAAOpK,KvCDJ,KwCJ3B,MACM+Y,IAAmB,IAAItO,MAAOW,iBAAmB,GACjD4N,GAAqB,CACzB,IACA,GACA,KAEK,MAAMC,WAAyB1B,GACpCxY,YAAYgJ,GACV,MAAM8P,EAAS,IAAIW,GAAmB,QAAS,CAC7C/P,IAAK,QACLS,KAAM,UACNjB,MAAO,UACPoB,IAAK,UACL/D,KAAM,UACNC,OAAQ,UACRC,OAAQ,UACR+N,SAAUxL,IAEZ9I,MAAM4Y,EAAOqB,kBAAkB3F,UAC/BhV,KAAKsZ,OAASA,EACdtZ,KAAK4a,eAAiB,GACtB5a,KAAK6a,kBAAoBP,GAAa9Q,IAAO,GAE/C0P,mBAAmB4B,GACjB,IAAIC,EACJ,MAAMC,EAAc,CAClBhb,KAAKoZ,cAAc0B,GAAW,GAC9B9a,KAAKoZ,cAAc0B,EAASnZ,IAAI,GAAI,IACpCsZ,OAAOC,SACT,IAAK,MAAMC,KAAcH,EAAa,CACpC,MAAOI,EAAqBC,EAAkBC,GAAmBH,EAC3DI,EAAaT,EAASnZ,IAAI0Z,GAC1BG,EAAaV,EAASnZ,IAAI2Z,GAChC,GAAInX,EAAiBiX,EAAqBG,GAAc,GAAKpX,EAAiBiX,EAAqBI,GAAc,EAC/G,MAAO,CAACH,GACH,KAAIlX,EAAiBiX,EAAqBG,IAAe,GAAKpX,EAAiBiX,EAAqBI,IAAe,GAExH,OAAIH,EAAmBC,EACd,GAEA,CAACD,EAAkBC,GAG9BP,EAAiBO,EAEnB,YAAuB,IAAnBP,EACK,CAACA,GAEH,CxC5CiB,IwC6CtB/a,KAAKyb,oBAAoBlO,GAAmBuN,KAGhD3B,UAAU3M,GACR,OxCjDwB,IwCiDjBxM,KAAK0b,sBAAsBlP,EAAUhL,IxCjDpB,KwCiDsCI,YAEhE8Z,sBAAsBC,GACpB,MAAMzhB,EAAMmf,GAAoBrZ,KAAKsZ,OxCpCZ,IwCoCoBqC,GAC7C,IAAIhR,EAAOjH,SAASxJ,EAAIyQ,MACW,QAA/BkP,GAAkB3f,EAAIgQ,OACxBS,IAASA,EAAO,IAElB,MAAMiR,EAAY3Q,GAAgBN,EAAMjH,SAASxJ,EAAIwP,OAAQhG,SAASxJ,EAAI4Q,KAAMpH,SAASxJ,EAAI6M,MAAOrD,SAASxJ,EAAI8M,QAAStD,SAASxJ,EAAI+M,SAEvI,OADiB5L,KAAKiB,MAAMsf,ExC1CH,KwC2CPD,EAEpBvC,cAAc5M,EAAWqP,GACvB,IAAIlR,EAAO4C,GAAmBf,GAC9B,GAAI7B,EAAO6P,GAAkB,CAC3B,MAAM9e,EAAMsE,KAAK8b,kBAAkBnR,EAAMA,EAAOkR,EAAWA,EAAWrP,GACtE,GAAI9Q,GAAOmgB,EAAY,EACrB,OAAOngB,EAETiP,EAAO6P,GAET,OAAOxa,KAAK8b,kBAAkBzgB,KAAKJ,IAAI0P,EA3EjB,MA2E2CkR,EAAY,EAAIE,KAAwBvB,GAAkBqB,EAAWrP,GAExIsP,kBAAkBnR,EAAMqR,EAASH,EAAWrP,GAC1C,KAAO7B,IAASqR,EAASrR,GAAQkR,EAAW,CAC1C,IAAIb,EAAchb,KAAKic,qBAAqBtR,GACxCkR,EAAY,IACdb,EAAcA,EAAY7I,QAAQ+J,WAEpC,IAAK,MAAMf,KAAcH,EACvB,GAAI7W,EAAiBgX,EAAW,GAAI3O,KAAeqP,EACjD,OAAOV,GAKfM,oBAAoBU,GAClB,MAAMvB,eAAEA,GAAmB5a,KAC3B,OAAO4a,EAAeuB,KAAavB,EAAeuB,GAAWnc,KAAK0b,sBAAsBpO,GAAsB6O,EAAU,GAAK,IAE/HF,qBAAqBE,GACnB,MAAMtB,kBAAEA,GAAsB7a,KAC9B,OAAO6a,EAAkBsB,KAAatB,EAAkBsB,GAAWnc,KAAKoc,yBAAyBD,IAEnGC,yBAAyBD,GACvB,MAAME,EAAiBrc,KAAKyb,oBAAoBU,EAAU,GACpDG,EAAetc,KAAKyb,oBAAoBU,GACxCI,EAAgBjP,GAAsB6O,GAAW,EACjDK,EAAclP,GAAsB6O,EAAU,GAAK,EACzD,GAAIE,IAAmBC,EACrB,MAAO,CAACtc,KAAKyc,iBAAiBF,EAAeC,EAAaH,EAAgBC,IAE5E,MAAMI,EAAS1c,KAAK2c,aAAaN,EAAgBE,GACjD,YAAe,IAAXG,EACK,CACL1c,KAAKyc,iBAAiBF,EAAeG,EAAO,GAAIL,EAAgBK,EAAO,IACvE1c,KAAKyc,iBAAiBC,EAAO,GAAIF,EAAaE,EAAO,GAAIJ,IAGtD,GAETG,iBAAiBF,EAAeC,EAAaH,EAAgBC,GAC3D,KAAOE,EAAcD,EAAgB,GAAG,CACtC,MAAMK,EAAkBvhB,KAAKiB,MAAMigB,GAAiBC,EAAcD,GAAiB,GAC1Dvc,KAAK0b,sBAAsBkB,KAC3BP,EACvBE,EAAgBK,EAEhBJ,EAAcI,EAGlB,MAAO,CACL/Y,EAAe2Y,GAAa/a,KxCzHN,KAAA,IwC0HtB4a,ExC1HsB,IwC2HtBC,GAGJK,aAAaE,EAAgBN,GAC3B,IAAK,MAAM3W,KAAQ6U,GAAoB,CACrC,MAAMkB,EAAWY,ExC/GK,MwC+GW3W,EAC3BkX,EAAY9c,KAAK0b,sBAAsBC,GAC7C,GAAImB,IAAcD,EAChB,MAAO,CAAClB,EAAUmB,KC1I1B,MAAMC,GAAY,CAChB5Q,IAAK,IAAI8M,GAAkB,MAAO,ICUpC,MAAO+D,GAASC,IAAW1gB,IACpB,MAAMwc,WAAiBjZ,EAC5BU,YAAYgJ,GACV,IAAKA,EACH,MAAM,IAAI/O,WAAW,uBAEvBiG,QACAuc,GAAQjd,KDfL,SAA2BwJ,GAEhC,MAAMnM,GADNmM,EAAKtH,OAAOsH,IACG0T,oBACf,GAAIH,GAAU1f,GACZ,OAAO0f,GAAU1f,GAEnB,MAAMuT,EAAauG,GAAmB3N,GACtC,QAAmB,IAAfoH,EAAuB,CACzB,GAAIvV,KAAKgG,IAAIuP,GAAcrX,EACzB,MAAM,IAAIkB,WAAW,wBAEvB,OAAO,IAAIwe,GAAkBtI,GAAgBC,GAAaA,GAE5D,OAAOmM,GAAU1f,GAAO,IAAIqd,GAAiBlR,GCE7B2T,CAAkB3T,IAElC4T,YAAYzd,GACV,GAAI9D,EAAa8D,GACf,OCxBC,SAAyB0d,GAC9B,MAAMC,EAAgBD,EAAIrI,SAC1B,QAAsB,IAAlBsI,EACF,OAAOD,EAET,GAAIxhB,EAAayhB,SAA6C,IAA3BA,EAActI,SAC/C,OAAOsI,EAET,OAAO,IAAIvE,GAASuE,GDgBTC,CAAgB5d,GAEzB,MAAMiZ,EAAS9B,GAAsB5U,OAAOvC,IAC5C,GAAIiZ,EAAQ,CACV,GAAIA,EAAO5D,SAAU,CACnB,MAAMwI,EAAU1E,GAAeF,GAE/B,OXrBD,SAA4BnY,GACjC,MAAQsU,kBAAmBnE,EAAUoE,SAAEA,EAAQC,EAAEA,GAAMxU,EACvD,QAAmB,IAAfmQ,IAA0BqE,QAEF,IADAE,GAAsB1U,EAAWmQ,EAAYoE,GAAU,GAE/E,MAAM,IAAIva,WAAW,+BWenBgjB,CAAmBD,GACZA,EAAQxI,SACV,GAAI4D,EAAO3D,EAChB,OAAO,IAAI8D,GAAS,OACf,QAAiC,IAA7BH,EAAO7D,kBAChB,OAAO,IAAIgE,GAASpI,GAAgBiI,EAAO7D,oBAG/C,OAAO,IAAIgE,GAAS7W,OAAOvC,IAEzB6J,SACF,OAAOxJ,KAAKC,WAEdyd,mBAAmBC,GACjB,OAAOhN,GAAgB3Q,KAAK8T,wBAAwB6J,IAEtD7J,wBAAwB6J,GACtB,MAAMrI,EAAU5V,EAAUqU,GAAS4J,GACnC,OAAOX,GAAQhd,MAAMmZ,UAAU7D,EAAQ7J,KAEzCmS,oBAAoBD,EAAYE,EAAchF,MAC5C,MAAMvD,EAAU5V,EAAUqU,GAAS4J,GAEnC,OAAOvI,GAAe,IADJ7I,GAAqB+I,EAAQ7J,IAAiB5J,IAAI7B,KAAK8T,wBAAwBwB,KAG/FnH,SAAUzO,EAAUiW,GAAUkI,KAGlCzK,cAAc0K,EAAanjB,GACzB,OAAOyY,GAAcpT,KAAMN,EAAUqe,GAAeD,GAAcrO,GAAoB9U,IAExF8Y,uBAAuBqK,GACrB,MACMhD,EAAWpP,GADChM,EAAUqe,GAAeD,GAAazd,gBAGxD,OAD4B2c,GAAQhd,MAAMkZ,mBAAmB4B,GAClC5gB,KAAK0W,GAAe,IAAImD,GAAQ+G,EAASnZ,IAAIiP,MAE1EoN,sBAAsBL,GACpB,MAAMrI,EAAU5V,EAAUqU,GAAS4J,GAC7BM,EAAgBjB,GAAQhd,MAAMoZ,cAAc9D,EAAQ7J,KAAmB,GAC7E,OAAIwS,EACK,IAAIlK,GAAQkK,EAAc,IAE5B,KAETC,kBAAkBP,GAChB,MAAMrI,EAAU5V,EAAUqU,GAAS4J,GAC7BM,EAAgBjB,GAAQhd,MAAMoZ,cAAc9D,EAAQ7J,IAAkB,GAC5E,OAAIwS,EACK,IAAIlK,GAAQkK,EAAc,IAE5B,KAEThe,WACE,OAAO+c,GAAQhd,MAAMwJ,IC1ElB,SAAS2U,GAAgB7jB,GAC9B,QAAuB,IAAnBA,EAAM0a,SACR,MAAM,IAAIlZ,UAAU,yBAEtB,OAAO4D,EAAUqZ,GAAUze,EAAM0a,UDyEnCpC,GAAgBmG,GAAU,YE1EnB,MAAMqF,GAAiCC,IAa9C,SAAoCC,EAAWpjB,EAAkBP,GAC/D,MAAMe,EAAM6iB,GAAsBD,EAAWpjB,EAAkBP,GAC/D,GAAIe,EACF,MAAO,IACFA,EACHsZ,SAAUmJ,GAAgBG,GAC1BvJ,uBAAwC,IAArBuJ,EAAUE,OAAoBtH,GAAgBhV,OAAOoc,EAAUE,cAAW,MAlBtFC,GAA4BJ,GAAcE,IAC1CG,GAAwBL,GAAcM,IACtCC,GAA6BP,IAqC1C,SAAgCC,EAAW3jB,GACzC,MAAMwT,EAAW0Q,GAAgBP,GAC3BQ,EAAiBC,GAAwBT,EAAWvP,GAAmBZ,GAC7E,GAAI6Q,GAAYF,GACd,OAAO3Q,EAAS8Q,oBAAoBH,EAAgBnkB,MAxC3CukB,GAA4Bb,IA2CzC,SAA+BC,EAAW3jB,GACxC,MAAMwT,EAAW0Q,GAAgBP,GAC3BQ,EAAiBC,GAAwBT,EAAWpP,GAAkBf,GAC5E,GAAI6Q,GAAYF,GAId,YAHuB,IAAnBR,EAAU3T,WAA0C,IAAvB2T,EAAUnQ,WACzC2Q,EAAenU,KAAOW,IAEjB6C,EAASgR,mBAAmBL,EAAgBnkB,MAjD1CykB,GAAwBf,GAAcgB,IACtCC,GAAiCjB,IAyD9C,SAAoCkB,EAAejB,EAAWpjB,EAAkBP,GAC9E,MAAMe,EAAM8jB,GAAsBD,EAAejB,EAAWpjB,EAAkBP,GACxE8kB,OAAoC,IAArBnB,EAAUE,OAC/B,GAAI9iB,GAAO+jB,EACT,MAAO,IACF/jB,GAAO6jB,EAAclf,eACxB2U,SAAUuK,EAAcvK,SACxBD,kBAAmB0K,EAAevI,GAAgBhV,OAAOoc,EAAUE,SAAWe,EAAcxK,sBAhEV,GAC3E2K,GAA4BrB,GAAcmB,IAAuB,GACjEG,GAAwBtB,GAAcuB,IAAmB,GACzDC,GAA6BxB,IAoF1C,SAAgCyB,EAAgBxB,EAAW3jB,GACzD,MAAMwT,EAAW2R,EAAe3R,SAEhC,GAAI6Q,GADmBD,GAAwBT,EAAWvP,GAAmBZ,IAC5C,CAC/B,MAAM4R,EAAeC,GAAuBF,EAAgBxB,EAAWvP,GAAmBZ,GAC1F,OAAOA,EAAS8Q,oBAAoBc,EAAcplB,OAzF0B,GACnEslB,GAA4B5B,IA2FzC,SAA+B6B,EAAe5B,EAAW3jB,GACvD,MAAMwT,EAAW+R,EAAc/R,SAE/B,GAAI6Q,GADmBD,GAAwBT,EAAWpP,GAAkBf,IAC3C,CAC/B,MAAM4R,EAAeC,GAAuBE,EAAe5B,EAAWpP,GAAkBf,GACxF,OAAOA,EAASgR,mBAAmBY,EAAcplB,OAhGyB,GACjEwlB,GAAwB9B,GAAc+B,IAAmB,GACzDC,GAAwBhC,IAwGrC,SAA2BC,GACzB,MAAMgC,EAAgB9kB,EAAa8iB,EAAWnP,IAC9C,GAAI6P,GAAYsB,GACd,OAAOA,KAhGX,SAAS/B,GAAsBD,EAAWpjB,EAAkBP,GAC1D,MAAM4lB,EAAU5B,GAAkBL,EAAW3jB,GACvC6lB,EAAUnB,GAAkBf,EAAWpjB,GAC7C,GAAIqlB,EACF,MAAO,IACFA,EAAQlgB,kBACRmgB,GAAWla,IAIpB,SAASqY,GAAkBL,EAAW3jB,GACpC,MAAMwT,EAAW0Q,GAAgBP,GAC3BQ,EAAiBC,GAAwBT,EAAWtP,GAAcb,GACxE,GAAI6Q,GAAYF,GACd,OAAO3Q,EAASsS,eAAe3B,EAAgBnkB,GAoBnD,SAAS0kB,GAAkBf,EAAWpjB,GACpC,MAAMolB,EAAgB9kB,EAAa8iB,EAAWrP,IAC9C,GAAI+P,GAAYsB,GACd,OAAOxR,GAAiBhI,GAAsBwZ,GAAgBplB,GAclE,SAASskB,GAAsB7L,EAAe2K,EAAWpjB,EAAkBP,GACzE,MAAM4lB,EAAUX,GAAkBjM,EAAe2K,EAAW3jB,GACtD6lB,EAAUJ,GAAkBzM,EAAe2K,EAAWpjB,GAC5D,GAAIqlB,GAAWC,EACb,MAAO,IACF7M,EAActT,kBACdkgB,EAAUA,EAAQlgB,eAAiB,MACnCmgB,GAIT,SAASZ,GAAkBc,EAAWpC,EAAW3jB,GAC/C,MAAMwT,EAAWuS,EAAUvS,SACrB2Q,EAAiBC,GAAwBT,EAAWtP,GAAcb,GACxE,GAAI6Q,GAAYF,GAAiB,CAC/B,MAAMiB,EAAeC,GAAuBU,EAAW5B,EAAgB9P,GAAcb,GACrF,OAAOA,EAASsS,eAAeV,EAAcplB,IAmBjD,SAASylB,GAAkBO,EAAWrC,EAAWpjB,GAC/C,MAAMolB,EAAgB9kB,EAAa8iB,EAAWrP,IAC9C,GAAI+P,GAAYsB,GAAgB,CAE9B,OAAOxR,GAAiBhI,IAkCE8Z,EAnCgBD,EAmCVhc,EAnCqB2b,EAoChDpjB,EAAQ+R,IAAc,CAAC4R,EAAallB,KACzC,IAAI6C,EACJ,OAAmC,OAA3BA,EAAKmG,EAAOhJ,IAAsB6C,EAAKoiB,EAAKjlB,QArCST,GAkCjE,IAA8B0lB,EAAMjc,EAzBpC,SAASoa,GAAwB+B,EAAaC,EAAU5S,GACtD,IAAI6S,EAAajkB,OAAOQ,KAAKwjB,GAM7B,OAJEC,EADE7S,EAASxJ,OACErC,MAAMrF,UAAUkV,MAAM8O,KAAK9S,EAASxJ,OAAOqc,IAE3CjkB,OAAOQ,KAAK2jB,GAAyB/S,EAAU6S,IAEvDE,GAAyBJ,EAAaE,GAE/C,SAASE,GAAyBJ,EAAaK,GAC7C,MAAMC,EAAW,GACjB,IAAK,MAAMnnB,KAAYknB,OACS,IAA1BL,EAAY7mB,KACdmnB,EAASnnB,GAAY6mB,EAAY7mB,IAGrC,OAAOmnB,EAET,SAASpB,GAAuBqB,EAAa1c,EAAQoc,EAAU5S,GAC7D,MAAMmT,EAAiBvC,GAAwBsC,EAAaN,EAAU5S,GACtE,OAAIA,EAASoT,YACJpT,EAASoT,YAAYD,EAAgB3c,GAEvC6c,GAAeF,EAAgB3c,GAQxC,SAAS0Z,GAAclhB,EAAMskB,GAC3B,MAAO,IAAIC,KACT,GAAID,EAAQ,CACV,MAAMnD,EAAYoD,EAAK,GACvB,IAAK7lB,EAAayiB,GAChB,MAAM,IAAIxiB,UAAU,uBAEtB,QAA2B,IAAvBwiB,EAAUnQ,SACZ,MAAM,IAAIrS,UAAU,wBAEtB,QAA2B,IAAvBwiB,EAAUtJ,SACZ,MAAM,IAAIlZ,UAAU,wBAGxB,MAAMJ,EAAMyB,KAAQukB,GACpB,IAAKhmB,EACH,MAAM,IAAII,UAAU,mBAEtB,OAAOJ,GAGX,SAASsjB,GAAYra,GACnB,OAAO5H,OAAOQ,KAAKoH,GAAQ3C,OAAS,EC3LtC,MACM2f,GAAe9d,EAAetK,GAAWkI,KAAK,KAC9CmgB,GAAeD,GAAalgB,MAAM,GAClCogB,GAAaF,GAAa9f,IAHdtI,gBAIZuoB,GAAaF,GAAajgB,IAJdpI,gBAcX,SAASwoB,GAAiBthB,EAAWuJ,GAC1C,MAAMwC,EAAYd,GAAqBjL,GACvCuhB,GAAcxV,GACdyV,GAAoBzV,EAAWxC,GAO1B,SAASgY,GAAcxV,IACqB,IAA7CrI,EAAiBqI,EAAWsV,KAAkE,IAA5C3d,EAAiBqI,EAAWqV,KAChFxV,KCvBG,SAAS6V,GAAcvd,EAAQwd,GACpC,MACMC,EAAkBC,GADP9a,GAAc5C,GACawd,IACrCG,EAAe1a,GAAYF,GAAc0a,GAEhD,MAAO,IADoB5N,GAAQ7P,EAAQiD,MACR0a,GAE9B,SAASC,GAAU5d,EAAQwd,GAChC,MACMC,EAAkBC,GADP9a,GAAc5C,GACawd,IACrCG,GAAiB5a,GAAc0a,GACtC,OAAOE,EAEF,SAASE,GAAehW,EAAW2V,GACxC,MAAOM,EAAc9a,G7B6FhB,SAAwB6E,GAC7B,MAAM/L,EAAY8L,GAAqBC,GAGvC,MAAO,CAFcb,GAAelL,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,QACpExD,GAAc9G,I6BhGEiiB,CAAelW,GAC1C4V,EAAkBC,GAAU1a,EAAUwa,GAC5C,OAAOM,EAAa5gB,IAAIugB,GAuBnB,SAASC,GAAUlhB,EAAMghB,GAC9B,OAAOnhB,EAAiBG,EAAMghB,EAAe9iB,QAAS8iB,EAAeljB,cCzChE,SAAS0jB,GAAgCC,EAAgBC,EAAmBC,GACjF,MAAO,CAACC,EAASpoB,KACf,MAAMqoB,EAAWC,GAAsBL,EAAgBjoB,GAAW,GAAK,IAAKioB,KAAmBC,GAU/F,MAAO,CACLK,SAAUC,GAAiBJ,EAASpoB,GAAS,GAC7CyoB,YAXF,SAAqBpZ,EAAYqZ,GAC/B,OAAO,IAAIpJ,GAAmB8I,EAAS,CACrC5U,SAAUnE,EACVgL,SAAUqO,QAAc,KACrBL,KACAroB,KACAmoB,KAMLQ,gBAAiBC,KAIvB,SAASA,GAA6BC,GACpC,OAAOA,EAAOxY,kBAET,SAASyY,GAAgCb,EAAgBE,EAAcY,GAC5E,MAAO,CAACX,EAASpoB,KACf,MAAMqoB,EAAWC,GAAsBL,EAAgBjoB,GAAW,GAAKioB,EAWvE,MAAO,CACLM,SAAUC,GAAiBJ,EAASpoB,EAAS+oB,GAC7CN,YAZF,SAAqBpZ,EAAYqZ,GAC/B,OAAO,IAAIpJ,GAAmB8I,EAAS,CACrC5U,SAAUnE,KACPgZ,KACAroB,KACAmoB,EACH9N,SAAUqO,EACVM,kBAAc,KAMhBL,qBAAsC,IAArB3oB,EAAQqa,SAAsB4O,GAA6BlnB,KAAK,KAAM,IAAIqc,GAASpe,EAAQqa,WAAa6O,KAI/H,SAASD,GAA6B5O,EAAUwO,GAC9C,MAAM7P,EAAgByB,GAAe,IAChC9O,MACAkd,EAAOnjB,iBAEZ,OAAO2U,EAAS5B,cAAcO,GAAe3I,kBAE/C,SAAS6Y,GAAwBL,GAC/B,O9BvCOvY,IAD6BxK,E8BwCP+iB,EAAOnjB,gB9BvCHuK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQtK,EAAU8F,QAAS9F,EAAU+F,UAAW/F,EAAUgG,UAAWhG,EAAUiG,gBADlJ,IAA+BjG,E8BsDtC,SAAS0iB,GAAiBJ,EAASpoB,EAAS+oB,GAC1C,IAAIllB,EACJ,MAAMslB,EAA+C,OAA1BtlB,EAAK7D,EAAQwT,UAAoB3P,EAyB9D,SAAgCukB,GAC9B,IAAK,MAAMgB,KAAUhB,EAAS,CAC5B,MAAM1L,EAAI0M,EAAO/f,MAAM,eACvB,GAAIqT,EACF,OAAOA,EAAE,GAGb,OAhCiE2M,CAAuBjB,GAClFkB,EAAoBtpB,EAAQqa,SAClC,OAAO,SAASwO,EAAQU,GACtB,IAAIC,EAAKpf,EAAIC,EAAIC,EACjB,MAAMmf,EAA8C,OAA1BD,EAAMX,EAAOrV,eAAoB,EAASgW,EAAI3a,GAClE6a,EAA6C,OAAzBtf,EAAKye,EAAOxO,eAAoB,EAASjQ,EAAGyE,GACtE,GAAI0a,EAAa,CACf,IAAoC,OAA9Blf,EAAKkf,EAAY/V,eAAoB,EAASnJ,EAAGwE,MAAQ4a,EAC7D,MAAM,IAAI3pB,WAAW,wBAEvB,IAAoC,OAA9BwK,EAAKif,EAAYlP,eAAoB,EAAS/P,EAAGuE,MAAQ6a,EAC7D,MAAM,IAAI5pB,WAAW,wBAGzB,IAAKipB,G/BhDoB,Y+BgDFU,SAA4D,IAArBA,QAAqD,IAAtBN,GAAgCA,IAAsBM,EACjJ,MAAM,IAAI3pB,WAAW,6BAEvB,QAAyB,IAArB4pB,QAAqD,IAAtBJ,GAAgCA,IAAsBI,EACvF,MAAM,IAAI5pB,WAAW,6BAIvB,MAAO,CAFYqpB,GAAqBM,G/BtDf,U+BuDNH,GAAqBI,GAAoB,QAahE,SAASpB,GAAsBD,EAAUsB,GACvC,IAAK,MAAMrqB,KAAY+oB,EACrB,QAA4B,IAAxBsB,EAAUrqB,GACZ,OAAO,EAGX,OAAO,EC9GF,SAASsqB,GAAyB1nB,EAAU2nB,GACjD3nB,EAASI,UAAUmU,eAAiB,SAASiJ,EAAY1f,GACvD,MAAM8pB,EAAgBD,EAAmBpK,GAA2BC,GAAa1f,GAAW,IAC5F,OAAO8pB,EAAcrB,eAAeqB,EAAcvB,SAASljB,OAAOsZ,OAAOmL,EAAcnB,gBAAgBtjB,QAEzGnD,EAASI,UAAUuC,GAA8BglB,EAE5C,SAASE,GAA4BrH,GAC1C,OAAc,MAAPA,OAAc,EAASA,EAAI7d,GCO7B,SAASmlB,GAAc/mB,GAC5B,MAAMlC,EAMR,SAA0BkC,GACxB,MAAMoG,EAAQwS,GAAec,KAAKV,GAAgBhZ,IAClD,GAAIoG,EAAO,CACT,IAAI6B,EACAC,EACAC,EACA0G,GACH5G,EAAO4G,GAAgBmY,GAAsB5gB,EAAM,GAAIA,EAAM,IjD1B9C,OiD0ByD,IACxE8B,EAAS2G,GAAgBmY,GAAsB5gB,EAAM,IAAKA,EAAM,IjD5B/C,EiD4B4DyI,IAC7E1G,EAAS0G,GAAgBmY,GAAsB5gB,EAAM,IAAKA,EAAM,IjD9B/C,EiD8B4DyI,GAC9E,MAAM9H,E7CVH,SAA0B0Y,GAC/B,MAAM3hB,EAAM,GACZ,IAAK,MAAM2B,KAAOggB,OACC,IAAbA,EAAIhgB,KACN3B,EAAI2B,GAAOggB,EAAIhgB,IAGnB,OAAO3B,E6CGUmpB,CAAiB,CAC9Bpf,MAAOgT,GAAWzU,EAAM,IACxB0B,OAAQ+S,GAAWzU,EAAM,IACzB2B,MAAO8S,GAAWzU,EAAM,IACxB4B,KAAM6S,GAAWzU,EAAM,IACvB6B,MAAAA,EACAC,QAAAA,EACAC,QAAAA,IAEF,IAAKhJ,OAAOQ,KAAKoH,GAAQ3C,OACvB,MAAM,IAAIvH,WAAW,gDAEvB,MAAMqqB,EAAQtd,GAAe3D,EAAe4I,GAAgB,GjD5CrC,GiD6CvB9H,EAAOqB,aAAe8e,EAAM9e,aAC5BrB,EAAOsB,aAAe6e,EAAM7e,aAC5BtB,EAAOuB,YAAc4e,EAAM5e,YAC3B,IAAI6e,EAAiBvf,GAAab,GAIlC,MAHiB,MAAbX,EAAM,KACR+gB,EAAiBrgB,EAAeqgB,IAE3BA,GApCGC,CAAiBpnB,GAC7B,QAAY,IAARlC,EACF,MAAMqb,GAAiB,WAAYnZ,GAErC,OAAOlC,EAmCT,SAASkpB,GAAsBK,EAAezT,EAAc7X,EAAM8S,GAChE,QAAsB,IAAlBwY,EAA0B,CAC5B,QAAqB,IAAjBxY,EACF,MAAM,IAAIhS,WAAW,mCAEvB,MAAO,CACLiJ,SAASuhB,QACQ,IAAjBzT,EAA0B+G,GAAsB/G,IAAiBhY,EAAOG,GjDpDlD,UiDoD0E,GAE7F,QAAqB,IAAjB8S,EAAyB,CAClC,MAAMyY,EAAa7pB,KAAKC,MAAMmR,EAAejT,EAAOG,IACpD,MAAO,CAACurB,EAAYzY,EAAeyY,EAAa1rB,EAAOG,IAEvD,MAAO,MAAC,OAAQ,GCrEb,MAMMwrB,GAA2BrrB,EAAmB,SAJ3B,CAC9BwV,KAAM,EACNC,MAAO,GAJ0B,GCwB5B,MAAM6V,WAAkB7kB,EAC7BC,YAAY+F,EAAU,EAAGC,EAAY,EAAGC,EAAY,EAAGC,EAAiB,EAAGC,EAAiB,EAAGC,EAAgB,GAC7GlG,MAAM,IACDoO,GAAiB,CAClBvI,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAC,eAAAA,EACAC,eAAAA,EACAC,cAAAA,GlDhCuB,GkDkCzBuH,SAAU0K,OAGduE,YAAYzd,EAAKhF,GACf,MAAMO,EAAmBrB,EAAoBc,GAC7C,OAAO0qB,GAAW1lB,aAAeylB,GAAYzlB,EAAIU,eAAgC,iBAARV,EAAmByf,GAAsBzf,EAAKzE,GAAoBkc,GAAUlV,OAAOvC,KAE9Jyd,eAAevc,EAAGC,GAChB,OAAOsN,GAAa1O,EAAU0lB,GAAWvkB,GAAInB,EAAU0lB,GAAWtkB,IAEpEwkB,KAAK3gB,EAAQhK,GACX,OAAO0qB,GAAWlF,GAAsBngB,KAAM2E,EAAQ9K,EAAoBc,KAE5EkH,IAAI0jB,GACF,OAAOC,GAAmBxlB,KAAMN,EAAU+lB,GAAUF,IAEtDG,SAASH,GACP,OAAOC,GAAmBxlB,KAAM0E,EAAehF,EAAU+lB,GAAUF,KAErEI,MAAMC,EAAOjrB,GACX,OAAOkrB,GAAe7lB,KAAMN,EAAU0lB,GAAWQ,GAAQjrB,GAE3DmrB,MAAMF,EAAOjrB,GACX,OAAOkrB,GAAenmB,EAAU0lB,GAAWQ,GAAQ5lB,KAAMrF,GAE3DyB,MAAMzB,GACJ,MAAMwnB,EAAiB7iB,EAAqB3E,EnD9DtB,EAKN,GmD0DhB,OAAO0qB,GAAW9C,GAAUviB,KAAKK,eAAgB8hB,IAEnD4D,OAAOH,GACL,OAAQxX,GAAapO,KAAMN,EAAU0lB,GAAWQ,IAElD3lB,SAAStF,GACP,MAAMyV,EAAeP,GAAyBlV,GAE9C,OAAO2V,GADkBiS,GAAUviB,KAAKK,eAAgB+P,GACjBA,GAEzC4V,gBAAgBrrB,GACd,MAAM+lB,EAAYhhB,EAAUumB,GAAWtrB,EAAQ+lB,WACzC1L,EAAWtV,EAAUqZ,GAAUpe,EAAQqa,UAC7C,OAAOkR,GAA8B,IAChCxF,EAAUrgB,kBACVL,KAAKK,eACR2U,SAAAA,IAGJmR,gBAAgBC,GACd,OAAO1mB,EAAUumB,GAAWG,GAASD,gBAAgBnmB,OAwBlD,SAASqlB,GAAW5kB,GACzB,OAAO,IAAI2kB,GAAU3kB,EAAU8F,QAAS9F,EAAU+F,UAAW/F,EAAUgG,UAAWhG,EAAUiG,eAAgBjG,EAAUkG,eAAgBlG,EAAUmG,eAE3I,SAASyf,GAAgB1mB,GAC9B,OAAOD,EAAU0lB,GAAkB,MAAPzlB,EAAcA,EAAM,CAAEoH,KAAM,IAE1D,SAASye,GAAmBc,EAAIjgB,GAC9B,OAAOgf,GrBjCF,SAAuBkB,EAAY7R,GACxC,MAAMvT,EAAOoG,GAAcgf,GAAcjf,GAAmBoN,GAAgB9S,YACrE4kB,GAAiB9e,GAAcvG,GACtC,OAAOqlB,EqB8BWC,CAAcH,EAAGjmB,eAAgBgG,IAErD,SAASwf,GAAea,EAAKC,EAAKhsB,GAChC,MAAMisB,EAAaloB,EAAiB/D,EnDhHlB,EALM,EAAA,EAKN,GmDiHlB,OAAOksB,GCzFF,SAAmBxY,EAAIC,EAAIsY,GAEhC,OAAOpf,GAAe3D,EADF7C,EAAiBuG,GAAc+G,GAAM/G,GAAc8G,GAAK7U,EAAOotB,EAAW5nB,cAAgB4nB,EAAW7nB,kBAAmB6nB,EAAW3nB,eACpG2nB,EAAWznB,aDuFxC2nB,CAAUJ,EAAIrmB,eAAgBsmB,EAAItmB,eAAgBumB,IAhC1EhU,GAAgBwS,GAAW,aAC3BhT,GAAegT,GAAWtnB,GAC1BymB,GAAyBa,IACzB,SAAsCrC,EAASpoB,GAC7C,MAAO,CACLuoB,SAAU,IAAM,CAAC,GAAI,IACrBE,YAAa,IAAM,IAAInJ,GAAmB8I,EAAS,CACjDhc,KAAM,UACNC,OAAQ,UACRC,OAAQ,aACLtM,EACHqa,SAAU,MACV2O,kBAAc,EACdhZ,UAAM,EACNjB,WAAO,EACPoB,SAAK,EACLic,aAAS,IAEXzD,gBAAkB3C,GAActlB,KAAKC,MAAMiM,GAAcoZ,EAAUtgB,gBnD7F5C,SqDe3B,MAAMuV,GAAO,CAAE9K,IAAK,GACb,MAAMkc,WAAuBzmB,EAClCC,YAAYoK,EAASC,EAAUgT,EAAchF,KAAyBoO,EAAkB,GACtF,MAAMC,EAActY,GAAiB,CACnChE,QAAAA,EACAC,SAAAA,EACAE,OAAQkc,GpD9BiB,GoDgCrB9Y,EAAWzO,EAAUiW,GAAUkI,GRzBlC,IAA2Bpd,EAAWuJ,EAAXvJ,EQ0BZymB,ER1BuBld,EQ0BVmE,EAASlO,WRxB1CgiB,GADkBvW,GAAqBjL,GACRuJ,GQyB7BtJ,MAAM,IACDwmB,EACH/Y,SAAAA,IAGJiP,YAAYzd,EAAKhF,GAEf,GADAd,EAAoBc,GAChBgF,aAAeqnB,GACjB,OAAOG,GAAgBxnB,EAAIU,gBAE7B,GAAmB,iBAARV,EACT,OAAOif,GAA2Bjf,EAAKhF,GAEzC,MAAMie,EpBlBH,SAAwBhb,GAC7B,MAAMlC,EAAMgc,GAAkB9Z,IAAQqZ,GAAiBrZ,GACvD,IAAKlC,EACH,MAAMqb,GAAiB,YAAanZ,GAEtC,OAAOlC,EoBaU0rB,CAAellB,OAAOvC,IAIrC,YAHwB,IAApBiZ,EAAOzK,WACTyK,EAAO7N,OAAS,GAEXoc,GAAgBxO,GAAcC,IAEvCwE,eAAevc,EAAGC,GAChB,OAAOoN,GAAiBxO,EAAUsnB,GAAgBnmB,GAAInB,EAAUsnB,GAAgBlmB,IAElFwkB,KAAK3gB,EAAQhK,GACX,OAAOklB,GAA2B7f,KAAM2E,EAAQhK,GAElDkH,IAAI0jB,EAAa5qB,GACf,OAAO0sB,GAAwBrnB,KAAMN,EAAU+lB,GAAUF,GAAc5qB,GAEzE+qB,SAASH,EAAa5qB,GACpB,OAAO0sB,GAAwBrnB,KAAM0E,EAAehF,EAAU+lB,GAAUF,IAAe5qB,GAEzFgrB,MAAMC,EAAOjrB,GACX,OAAO2sB,GAAoBtnB,KAAMN,EAAUsnB,GAAgBpB,IAAQ,EAAOjrB,GAE5EmrB,MAAMF,EAAOjrB,GACX,OAAO2sB,GAAoBtnB,KAAMN,EAAUsnB,GAAgBpB,IAAQ,EAAMjrB,GAE3EorB,OAAOH,GACL,OAAQ1X,GAAiBlO,KAAMN,EAAUsnB,GAAgBpB,IAE3D3lB,SAAStF,GACP,MAAMgK,EAAS3E,KAAKK,eACd2J,EAAarF,EAAOwJ,SAASlO,WAC7BsnB,EAAkBlY,GAA2B1U,GACnD,OrC1CyB,YqC0CjBqP,EAA+BuG,GAAmB5L,GAAU0L,GAAc1L,IAAWmM,GAAiB9G,EAAYud,GAE5HC,YAAY7iB,GACV,OAAO3E,KAAKmO,SAASsS,eAAe,CAClC9V,KAAM3K,KAAK2K,KACXjB,MAAO1J,KAAK0J,MACZoB,IAAKnG,EAAOmG,OAiBX,SAASqc,GAAgB1mB,GAC9B,OAAO,IAAIumB,GAAevmB,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAU0N,SAAU1N,EAAUsK,QAEjG,SAASsc,GAAwBI,EAAWC,EAAU/sB,GACpD,OAAO8sB,EAAUD,YAAY,CAC3B1c,IAAK4c,EAAS5kB,KAAO,EAAI2kB,EAAUvc,YAAc,IAChDrJ,IAAI6lB,EAAU/sB,GAASgtB,mBAE5B,SAASL,GAAoBM,EAAMC,EAAMC,EAAMntB,GAC7C,OAAOksB,GAAekB,GAAUH,EAAKJ,YAAY5R,IAAOiS,EAAKL,YAAY5R,IAAOoS,GAAkBJ,EAAMC,GAAOC,EAAMppB,EAAiB/D,ErDvGpH,EADC,EAAA,EACD,KqDiFpBiY,GAAgBoU,GAAgB,kBAChC5U,GAAe4U,IACfxU,GAAoBwU,GAAgB1U,IACpCiS,GAAyByC,GAAgBvD,GAAgC,CACvE9Y,KAAM,UACNjB,MAAO,WACN,CACDqd,aAAS,EACTjc,SAAK,EACL/D,UAAM,EACNC,YAAQ,EACRC,YAAQ,IACP,ICnCH,MAAMghB,GAAmBxoB,SAClB,MAAMyoB,WAAsB3nB,EACjCC,YAAYmR,EAAkBwW,EAAatK,EAAchF,MACvD,MAAM7D,EAAWtV,EAAUqZ,GAAUoP,GAC/Bha,EAAWzO,EAAUiW,GAAUkI,GAC/BrR,EAAY3I,EAAe8N,IAC1BlR,EAAWmQ,GAAcwX,GAA4B5b,EAAWwI,GACvE+M,GAAiBthB,EAAW0N,EAASlO,YACrCS,MAAM,IACDD,EACH0N,SAAAA,EACA6G,SAAAA,EACAwJ,OAAQ7N,GAAgBC,KAE1B5Q,KAAKyL,IAAmBe,EACxBxM,KAAKioB,IAAoBrX,EAE3BwM,YAAYzd,EAAKhF,GACf,MAAMka,EAAiB7B,GAA0BrY,E1BjFxB,G0BkFnBO,EAAmBrB,EAAoBc,GAC7C,GAAIgF,aAAeuoB,GACjB,OAAO,IAAIA,GAAcvoB,EAAIgS,iBAAkBhS,EAAIqV,SAAUrV,EAAIwO,UAEnE,MAAMka,EAA0B,iBAAR1oB,EAExB,OAAOumB,GADQmC,EAAWjK,GAA+Bze,EAAKzE,EAAkBP,GAAWme,GAAejC,GAAmB3U,OAAOvC,MACtF0oB,EAAUxT,EAAgBla,GAE1EyiB,eAAevc,EAAGC,GAChB,OAAO0N,GAAiB9O,EAAUwoB,GAAernB,GAAInB,EAAUwoB,GAAepnB,IAE5EkU,eACF,OAAOhV,KAAKK,eAAe2U,SAEzBD,wBACF,OAAO/U,KAAKioB,IAEVzJ,aACF,OAAOxe,KAAKK,eAAeme,OAE7B8G,KAAK3gB,EAAQhK,GACX8U,GAAoB9U,GACpB,MAAMO,EAAmBrB,EAAoBc,GACvCka,EAAiB7B,GAA0BrY,E1B5GxB,G0B8GzB,OAAOurB,GADS5G,GAA+Btf,KAAM2E,EAAQzJ,EAAkBP,IACjC,EAAOka,EAAgBla,GAEvE2tB,cAAclC,GACZ,MAAM1Y,EAAOhO,EAAUumB,GAAWG,GAC5B9S,EAAW5F,EAAKyY,gBAAgBnmB,OAChCgV,SAAEA,GAAahV,KACfsV,EAAUlC,GAAc4B,EAAU1B,GACxC,OAAO,IAAI4U,GAAc5S,EAAQ3D,iBAAkBqD,EAAUuT,GAAoBvoB,KAAM0N,IAEzF8a,cAAcC,GACZ,OAAOvC,GAA8B,IAChClmB,KAAKK,uBACO,IAAZooB,EAAqBniB,GAAoB5G,EAAU0lB,GAAWqD,GAASpoB,iBAG9EqoB,aAAa7K,GACX,OAAO,IAAIqK,GAAcloB,KAAK2R,iBAAkB3R,KAAKgV,SAAU6I,GAEjE8K,aAAaR,GACX,OAAO,IAAID,GAAcloB,KAAK2R,iBAAkBwW,EAAanoB,KAAKmO,UAEpEtM,IAAI0jB,EAAa5qB,GACf,OAAOiuB,GAAuB5oB,KAAMN,EAAU+lB,GAAUF,GAAc5qB,GAExE+qB,SAASH,EAAa5qB,GACpB,OAAOiuB,GAAuB5oB,KAAM0E,EAAehF,EAAU+lB,GAAUF,IAAe5qB,GAExFgrB,MAAMC,EAAOjrB,GACX,OAAOkuB,GAAmB7oB,KAAMN,EAAUwoB,GAAetC,IAAQ,EAAOjrB,GAE1EmrB,MAAMF,EAAOjrB,GACX,OAAOkuB,GAAmB7oB,KAAMN,EAAUwoB,GAAetC,IAAQ,EAAMjrB,GAEzEyB,MAAMzB,GAEJ,OAAOmuB,GAAmB9oB,KADHV,EAAqB3E,EtDjJtB,EAMP,IsD8IjBorB,OAAOH,GACL,OpC/IgC/kB,EoC+ILb,KpC/IQc,EoC+IFpB,EAAUwoB,GAAetC,GpC9IrD3X,GAAepN,EAAGC,IAAMD,EAAEmU,SAAS/U,aAAea,EAAEkU,SAAS/U,WAD/D,IAA6BY,EAAGC,EoCiJrCioB,aACE,OAAO7C,GAA8B,IAChClmB,KAAKK,kBACLiG,GACHyO,kBAAmB/U,KAAK+U,oBACvB,E1B3JsB,G0B6JvBiU,iBACF,OAAOvT,GAAiBzV,KAAKK,gBAAkB/G,EAEjD2G,SAAStF,GACP,MAAMyV,EAAeP,GAAyBlV,GACxCsuB,EAAgB9D,GAAyBxqB,GACzCuuB,EAAkBhZ,GAA2BvV,GAC7C4sB,EAAkBlY,GAA2B1U,GAC7CwuB,EAAaL,GAAmB9oB,KAAMoQ,GAC5C,OAAOD,GAAkBgZ,EAAW9oB,eAAgB+P,IJtKrB,IIsKsC6Y,EAAwCtY,GAAgBzP,EAAcioB,EAAWpU,oBAAsB,K5BnH/IsO,E4BmHsKrjB,KAAKgV,SAAS/U,W7BrK9K,I6BqK0LipB,E5BjHtN,IAAI7F,KAEN,I4B+G2OvS,GAAiB9Q,KAAKmO,SAASlO,WAAYsnB,G5BnHxR,IAA0BlE,E4BqH/BsE,mBACE,OAAOR,GAAgBnnB,KAAKK,gBAE9B+oB,kBACE,OAAOppB,KAAKmO,SAASgR,mBAAmBnf,MAE1CmmB,kBACE,OAAO/Q,GAAepV,KAAKK,gBAE7BmnB,cACE,OAAO6B,GAAWrpB,KAAKK,gBAEzBipB,cACE,OAAOjE,GAAWrlB,KAAKK,gBAEzBkpB,YACE,OAAO,IAAIxV,GAAQ/T,KAAK2R,mBAkBrB,SAASuU,GAA8BvhB,EAAQiQ,EAAeC,EAAgBC,GACnF,MAAMtI,EAAYmI,GAA8BhQ,EAAQiQ,EAAeC,EAAgBC,GACvF,OAAO,IAAIoT,GAAc1b,EAAW7H,EAAOqQ,SAAUrQ,EAAOwJ,UAEvD,SAASia,GAA4B5b,EAAWwI,GACrD,MAAMM,EAAU,IAAIvB,GAAQvH,GACtBoE,EAAaoE,EAASlB,wBAAwBwB,GAEpD,MAAO,CADW/I,GAAqBC,EAAU3K,IAAI+O,IAClCA,GAErB,SAASgY,GAAuBY,EAAKnjB,EAAK1L,GACxC,MAAM8F,EAAY+oB,EAAInpB,eAChBmM,ExBhMD,SAAsC7H,EAAQ+iB,EAAU/sB,GAC7D,MAAMwT,SAAEA,EAAQ6G,SAAEA,GAAarQ,EACzB8kB,EAAiBtb,EAASub,QAAQL,GAAW1kB,GAASC,EAAiB8iB,EAAU7gB,IAAyBlM,GAMhH,OAD0ByY,GAAc4B,EAJbI,GAAe,IACrCzQ,KACA8kB,EAAeppB,kBAGKoL,IAAiB5J,IAAIyF,GAAmBogB,IwBwL/CiC,CAA6BlpB,EAAW4F,EAAK1L,GAC/D,OAAO,IAAIutB,GAAc1b,EAAW/L,EAAUuU,SAAUvU,EAAU0N,UAEpE,SAAS2a,GAAmBU,EAAKrH,GAC/B,MAAM1hB,EAAY+oB,EAAInpB,eAChBmM,ERnMD,SAAkC7H,EAAQoQ,EAAmBoN,GAClE,MAAMhU,SAAEA,EAAQ6G,SAAEA,GAAarQ,EAC/B,IACI2d,EACA1a,EAFAD,EAAWJ,GAAc5C,GAW7B,O9ChCiB,I8CwBbwd,EAAenjB,cACjBsjB,EAAgBhc,GAChBsB,EAAWua,EAAeljB,aAAa0I,EAAW8N,GAAiB9Q,MAEnEgD,EAAW0a,GAAU1a,EAAUwa,IAC9BG,EAAe1a,GAAYF,GAAcC,IAGrCgN,GAA8B,IADVH,GAAQ7P,EAAQiD,MAGtC0a,EACHvN,kBAAAA,EACA5G,SAAAA,EACA6G,SAAAA,IACC,ElB3CwB,G0B2NT4U,CAAyBnpB,EAAW+oB,EAAIzU,kBAAmBoN,GAC7E,OAAO,IAAI+F,GAAc1b,EAAW/L,EAAUuU,SAAUvU,EAAU0N,UAEpE,SAAS0a,GAAmBgB,EAAKC,EAAKhC,EAAMntB,GAC1C,MAAMisB,EAAaloB,EAAiB/D,EtD3NlB,EALM,EAAA,EASN,IsDwNZwE,YAAEA,GAAgBynB,EACxB,GAAIznB,GtD5Na,GsD4NS0qB,EAAI7U,SAASxL,KAAOsgB,EAAI9U,SAASxL,GACzD,MAAM,IAAIpJ,MAAM,yBAElB,OAAOymB,GAAekD,GAAcF,EAAKC,EAAK9B,GAAkB6B,EAAKC,GAAMhC,EAAMlB,IC5N5E,SAASoD,GAAkBrqB,GAChC,QAAY,IAARA,EACF,OAEF,GAAI9D,EAAa8D,GACf,OAAIA,aAAeuoB,IAAiBvoB,aAAeoe,GAC1Cpe,EAEFD,OAA2B,IAAjBC,EAAIqV,SAAsBkT,GAAgBnK,GAAepe,GAE5E,GAAmB,iBAARA,EACT,MAAM,IAAI7D,UAAU,6BAEtB,MAAM8c,EAAS9B,GAAsB5U,OAAOvC,IAC5C,GAAIiZ,EACF,YAAwB,IAApBA,EAAO5D,SACFkR,GAA8BpN,GAAeF,IAAS,GAEtDxD,GAAeuD,GAAcC,IAGxC,MAAM,IAAIne,WAAW,+BCzBhB,SAASwvB,GAAiBvC,EAAUvoB,EAAa+qB,EAAY/b,GAClE,OAAQ+b,aAAsBjE,GAEzB,SAA8ByB,EAAUvoB,EAAa+qB,EAAY/b,GACtE,MAAMgc,EAAaD,EAAWroB,IAAI6lB,GAIlC,MAAO,CAHavZ,EAASic,UAAUF,EAAYC,EAAY,CAC7DhrB,YAAapB,EAAUoB,KAEJgrB,GAPqBE,CAAqB3C,EAAUrsB,KAAKJ,IxDA7D,EwDAsEkE,GAAc+qB,EAAY/b,GAAYmc,GAAyB5C,EAAUvoB,EAAa+qB,EAAY/b,IAAW,GAS/L,SAASmc,GAAyB3lB,EAAQxF,EAAa+qB,EAAY/b,EAAUoc,GAClF,MAAMC,GAAgC,IAAlBD,GAA0BprB,ExDT5B,GwDSkDwF,EAAOgB,MACvE6kB,IACF7lB,EAASC,EAAiBD,EAAQ,CAAEgB,MAAO,KAE7C,IAAIwkB,EAAaD,EAAWroB,IAAI8C,GAC5B8lB,EAAmBC,GAAaR,EAAYC,EAAYhc,EAAUhP,GAKtE,OAJIqrB,IACFC,EAAmB7lB,EAAiB6lB,EAAkB,CAAE9kB,MAAO6kB,IAC/DL,EAAaA,EAAWtoB,IAAI,CAAE8D,MAAO6kB,KAEhC,CAACC,EAAkBN,GCNrB,SAASQ,GAAqBF,EAAkBzrB,EAAc6qB,EAAKC,GACxE,MAAMc,EAAmB5sB,EAAkBgB,IACrC8D,KAAEA,GAAS2nB,EACjB,IAAK3nB,EACH,OAAO2nB,EAET,MAAMpkB,EAAM,GACZ,IAAK,IAAI1M,EzDlBS,EyDkBIA,GAAQqF,EAAcrF,IAAQ,CAClD,MAAMkxB,EAAe7sB,EAAkBrE,GACvC0M,EAAIwkB,GAAgBJ,EAAiBI,GAEvC,MAAMC,EAAS,CAAEF,CAACA,GAAmB9nB,GAC/BioB,EAAgBlB,EAAIhoB,IAAIwE,GACxB2kB,EAAcD,EAAclpB,IAAIipB,GAChCG,EAAY7d,GAAY2d,GACxBG,EAAU9d,GAAY4d,GAEtBG,EADa/d,GAAY0c,GACHnoB,IAAIspB,GAAWrpB,WAAaspB,EAAQvpB,IAAIspB,GAAWrpB,WAAakB,EAE5F,OADAuD,EAAIukB,IAAqBO,EAClB9kB,ECVF,SAAS+kB,GAAkBC,EAAiBxmB,EAAIC,EAAIqJ,EAAU2Z,EAAMlB,GACzE,MAAMznB,YAAEA,EAAWH,aAAEA,EAAYD,kBAAEA,EAAiBE,aAAEA,GAAiB2nB,EACvE,IAAKhtB,EAAWuF,GAAc,CAG5B,OAAOqI,GADiBlG,EADP8L,GAAYtI,GAAInD,IAAIyL,GAAYvI,IAAKpD,KAAKqmB,GAAQ,EAAI,GAClBtuB,EAAOwF,GAAgBD,EAAmBE,GACxDE,GAEzC,IAAIuV,EAAiBiW,GAAqBU,EAAiBrsB,EAAc6F,EAAIC,GAC7E,MAAMiN,EAAW/T,EAAkBgB,GACnC,SAASssB,IACP,MAAMC,EAAO7W,EAAe3C,GAC5B2C,EAAe3C,GAAY/Q,EAAiBuqB,EAAMxsB,EAAmBE,GAkBvE,OAhBIA,IAAiB5D,KAAKe,OACxBkvB,IAEExD,IACFpT,EAAiBhQ,EAAegQ,IAE9BzV,IAAiB5D,KAAKe,OACxBkvB,IAEEtsB,E1DnDoB,I0DqDpB0V,EADEoT,EACepjB,EAAeulB,GAAiBvlB,EAAegQ,GAAiBvV,EAAa0F,EAAIsJ,IAEjF8b,GAAiBvV,EAAgBvV,EAAa0F,EAAIsJ,IAGhEuG,EJkIT9B,GAAgBsV,GAAe,iBAC/B9V,GAAe8V,GAAepqB,GAC9B0U,GAAoB0V,GAAe3V,IACnCb,GAAiBwW,IACjB3D,GAAyB2D,GAAevF,GAAgC,CACtEhY,KAAM,UACNjB,MAAO,UACPoB,IAAK,UACLic,aAAS,EACThgB,KAAM,UACNC,OAAQ,UACRC,OAAQ,WACP,CACD0c,aAAc,SACb,KKpLH,MAAO6H,GAAWC,IAAalvB,IACxB,MAAMkpB,WAAiBvlB,EAC5BM,YAAYiF,EAAQ,EAAGC,EAAS,EAAGC,EAAQ,EAAGC,EAAO,EAAGC,EAAQ,EAAGC,EAAU,EAAGC,EAAU,EAAGC,EAAe,EAAGC,EAAe,EAAGC,EAAc,GAC7IxF,QACA,MAAMgrB,EAAerL,GAAsB,CACzC5a,MAAAA,EACAC,OAAAA,EACAC,MAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,QAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,YAAAA,IAEFulB,GAAUzrB,K/CGP,SAA+B2rB,GACpC,MAAMhnB,EAASa,GAAammB,IACtB7oB,KAAEA,GAAS6B,EACjB,IAAK,MAAMhJ,KAAaqC,EAAmB,CACzC,MAAM4tB,EAAWjnB,EAAOhJ,GAClBkwB,EAAY9qB,EAAQ4D,EAAOhJ,IACjC,GAAIkwB,GAAaA,IAAc/oB,EAC7B,MAAM,IAAIrI,WAAW,gCAEvB,IAAKU,OAAO2wB,UAAUF,GACpB,MAAM,IAAInxB,WAAW,oCAGzB,OAAOkK,E+ChBWonB,CAAsBL,IAExCtO,YAAYzd,GACV,OAAOknB,GAA8B,iBAARlnB,EAAmB0gB,GAAsB1gB,GAAOglB,GAAchlB,IAE7Fyd,eAAevc,EAAGC,EAAGnG,GACnB,OzCpBG,SAA0BqxB,EAASC,EAAS/B,GACjD,QAAmB,IAAfA,GAAyB9jB,GAA2B4lB,IlBnBvC,GkBmB0D5lB,GAA2B6lB,IlBnBrF,EkBoBf,OAAO9nB,EAAiBkD,GAAsB2kB,GAAU3kB,GAAsB4kB,IAEhF,IAAK/B,EACH,MAAM,IAAIzvB,WAAW,mBAEvB,MAAMyxB,EAAQhC,EAAWroB,IAAImqB,GACvBG,EAAQjC,EAAWroB,IAAIoqB,GAC7B,YAAoC,IAAhC/B,EAAWze,IACN+C,GAAiB0d,EAAOC,GAE1Bje,GAAiBge,EAAOC,GyCQtBC,CAAiB1sB,EAAU+lB,GAAU5kB,GAAInB,EAAU+lB,GAAU3kB,GAAIkpB,GAAkBnvB,EAAiBF,GAASuvB,aAElHzkB,YACF,OAAO+lB,GAAUxrB,MAAMyF,MAErBC,aACF,OAAO8lB,GAAUxrB,MAAM0F,OAErBC,YACF,OAAO6lB,GAAUxrB,MAAM2F,MAErBC,WACF,OAAO4lB,GAAUxrB,MAAM4F,KAErBC,YACF,OAAO2lB,GAAUxrB,MAAM6F,MAErBC,cACF,OAAO0lB,GAAUxrB,MAAM8F,QAErBC,cACF,OAAOylB,GAAUxrB,MAAM+F,QAErBC,mBACF,OAAOwlB,GAAUxrB,MAAMgG,aAErBC,mBACF,OAAOulB,GAAUxrB,MAAMiG,aAErBC,kBACF,OAAOslB,GAAUxrB,MAAMkG,YAErBpD,WACF,OAAO0oB,GAAUxrB,MAAM8C,KAErBupB,YACF,OAAQrsB,KAAK8C,KAEfwiB,KAAK3gB,GACH,OAAOkiB,GAAe,IACjB2E,GAAUxrB,SACVqgB,GAAsB1b,KAG7B2nB,UACE,OAAOzF,GAAeniB,EAAe8mB,GAAUxrB,QAEjDqB,MACE,OAAOwlB,G/CnFFvpB,E+CmF6BkuB,GAAUxrB,M/CnFjBwE,GAAqBpD,GAAM/F,KAAKgG,IAAID,M+CqFjES,IAAI+jB,EAAOjrB,GACT,OAAO4xB,GAAavsB,KAAMN,EAAU+lB,GAAUG,GAAQjrB,GAExD+qB,SAASE,EAAOjrB,GACd,OAAO4xB,GAAavsB,KAAM0E,EAAehF,EAAU+lB,GAAUG,IAASjrB,GAExEyB,MAAMzB,GACJ,MAAM6xB,EAAgC,iBAAZ7xB,EAAuB,CAAEqE,aAAcrE,GAAYA,EAC7E,IAAKkB,EAAa2wB,GAChB,MAAM,IAAI1wB,UAAU,wBACf,QAA+B,IAA3B0wB,EAAWrtB,kBAAsD,IAA5BqtB,EAAWxtB,aACzD,MAAM,IAAIvE,WAAW,mDAEvB,MACMmsB,EAAaloB,EAAiB8tB,EADTpmB,GAA2BpG,M3D3GhC,EAAA,EASN,G2DmGkF,GAC5FkqB,EAAaF,GAAkBwC,EAAWtC,YAChD,OAAOrD,GD7FJ,SAAuBa,EAAUd,EAAYsD,EAAY/b,GAC9D,MAAMhP,YAAEA,EAAWH,aAAEA,EAAYD,kBAAEA,EAAiBE,aAAEA,GAAiB2nB,EACvE,QAAmB,IAAfsD,GAAyB9jB,GAA2BshB,I1DbvC,G0Da2DhuB,EAAcyF,IAAgBzF,EAAcsF,GAEtH,OAAOwI,GADMlG,EAAmB+F,GAAsBqgB,GAAWluB,EAAOwF,GAAgBD,EAAmBE,GAC/EE,GAE9B,IAAK+qB,EACH,MAAM,IAAIzvB,WAAW,mBAEvB,MAAO4wB,EAAiBoB,GAAwBnC,GAAyB5C,EAAUvoB,EAAa+qB,EAAY/b,GAC5G,OAAOid,GAAkBC,EAAiBnB,EAAYuC,EAAsBte,GAAU,EAAOyY,GCmFrE8F,CAAc1sB,KAAM4mB,EAAYsD,EAAYA,EAAaA,EAAW/b,cAAW,IAEvGwe,MAAMhyB,GACJ,MAAMiyB,EC9GH,SAA0BC,GAC/B,IAAI3C,EACAnY,EAOJ,MAN0B,iBAAf8a,EACT9a,EAAW8a,GAEX9a,EAAWlX,EAAiBgyB,GAAYlzB,KACxCuwB,EAAa2C,EAAW3C,YAEnB,CACLvwB,KAAMyE,EAAU2T,OAAU,E5DbJ,EASN,G4DKhBmY,WAAAA,GDmGoB4C,CAAiBnyB,GAC/BuvB,EAAaF,GAAkB4C,EAAY1C,YACjD,OF3GG,SAA2BxC,EAAU/tB,EAAMuwB,EAAY/b,GAC5D,QAAmB,IAAf+b,GAAyB9jB,GAA2BshB,IzDHvC,GyDG2DhuB,EAAcC,GACxF,OAAO0N,GAAsBqgB,GAAU9lB,WAAapI,EAAOG,GAE7D,IAAKuwB,EACH,MAAM,IAAIzvB,WAAW,mBAEvB,MAAOgwB,EAAkBgC,GAAwBnC,GAAyB5C,EAAU/tB,EAAMuwB,EAAY/b,GAAU,GAGhH,OAFqBwc,GAAqBF,EAAkB9wB,EAAMuwB,EAAYuC,GAC7DzuB,EAAkBrE,IEkG1BozB,CAAkB/sB,KAAM4sB,EAAYjzB,KAAMuwB,EAAYA,EAAaA,EAAW/b,cAAW,GAElGlO,SAAStF,GACP,MAAMyV,EAAeP,GAAyBlV,E3DnH5B,G2DoHlB,OjC7DG,SAA2BgK,EAAQyL,GACxC,MAAMpR,aAAEA,EAAYgR,uBAAEA,EAAsB/Q,aAAEA,GAAiBmR,GACzDtN,KAAEA,GAAS6B,EACXkB,EAAQlB,EAAOkB,MACfC,EAAUnB,EAAOmB,QACvB,IAAIC,EAAUpB,EAAOoB,QACjB8K,EAAoB,GACxB,GAAI7R,G1B9DgB,E0B8DQ,CAC1B,MAAMtD,EAAMgV,GAAqB/L,EAAOqB,aAAcrB,EAAOsB,aAActB,EAAOuB,YAAa8J,EAAwB/Q,EAAcD,GACrI6R,EAAoBnV,EAAI,GACxBqK,GAAWrK,EAAI,GAEjB,MAAMsxB,OAA0C,IAA3Bhd,GAAqCa,IAAsB/N,EAChF,OAAQA,EAAO,EAAI,IAAM,IAAM,IAAMkO,GAAuB,CAC1D,CAACrM,EAAOc,MAAO,KACf,CAACd,EAAOe,OAAQ,KAChB,CAACf,EAAOgB,MAAO,KACf,CAAChB,EAAOiB,KAAM,QACVC,GAASC,GAAWC,GAAWinB,EAAe,IAAMhc,GAAuB,CAC/E,CAACnL,EAAO,KACR,CAACC,EAAS,KACV,CACE9G,G1B7EgB,E0B6ES+G,EAAU,EACnC8K,EAAoB,IACpBmc,KAEC,IiCmCIC,CAAkBzB,GAAUxrB,MAAOoQ,GAE5CgB,eAAe8b,EAAUC,GACvB,OAAOntB,KAAKC,YAIT,SAAS4mB,GAAeliB,GAC7B,OAAO,IAAI8gB,GAAS9gB,EAAOc,MAAOd,EAAOe,OAAQf,EAAOgB,MAAOhB,EAAOiB,KAAMjB,EAAOkB,MAAOlB,EAAOmB,QAASnB,EAAOoB,QAASpB,EAAOqB,aAAcrB,EAAOsB,aAActB,EAAOuB,aAE7K,SAASqmB,GAAa1nB,EAAIC,EAAInK,GAC5B,MAAMuvB,EAAaF,GAAkBnvB,EAAiBF,GAASuvB,YAC/D,OAAOrD,G7BtCF,SAA2BhiB,EAAIC,EAAIolB,EAAY/b,GACpD,MAAMhP,EAAc9D,KAAKJ,IAAImL,GAA2BvB,GAAKuB,GAA2BtB,IACxF,QAAmB,IAAfolB,GAAyB/qB,G9BzFZ,E8B0Ff,OAAOqI,GAAeH,GAAsBxC,GAAIhD,IAAIwF,GAAsBvC,IAAM3F,GAElF,IAAK+qB,EACH,MAAM,IAAIzvB,WAAW,mBAEvB,MAAM0vB,EAAaD,EAAWroB,IAAIgD,GAAIhD,IAAIiD,GAC1C,OAAO4lB,GAAaR,EAAYC,EAAYhc,EAAUhP,G6B6BhCiuB,CAAkBvoB,EAAIC,EAAIolB,EAAYA,EAAaA,EAAW/b,cAAW,IANjGyE,GAAgB6S,GAAU,YExFnB,MAAM1H,WAAsBxd,EACjCC,YAAYoK,EAASC,EAAUE,EAAQxE,EAAU,EAAGC,EAAY,EAAGC,EAAY,EAAGC,EAAiB,EAAGC,EAAiB,EAAGC,EAAgB,EAAGiX,EAAchF,MACzJ,MAAMqO,EAAcrY,GAAqB,CACvCjE,QAAAA,EACAC,SAAAA,EACAE,OAAAA,EACAxE,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAC,eAAAA,EACAC,eAAAA,EACAC,cAAAA,G5D9CyB,G4DgDrBuH,EAAWzO,EAAUiW,GAAUkI,GACrCkE,GAAiBmF,EAAa/Y,EAASlO,YACvCS,MAAM,IACDwmB,EACH/Y,SAAAA,IAGJiP,YAAYzd,EAAKhF,GACf,MAAMO,EAAmBrB,EAAoBc,GAC7C,OAAOya,GAAezV,aAAeoe,GAAgBpe,EAAIU,eAAgC,iBAARV,EAAmB8e,GAA0B9e,EAAKzE,EAAkBP,GAAWge,GAAc3B,GAAc9U,OAAOvC,MAErMyd,eAAevc,EAAGC,GAChB,OAAOoN,GAAiBxO,EAAUqe,GAAeld,GAAInB,EAAUqe,GAAejd,IAEhFwkB,KAAK3gB,EAAQhK,GACX,MAAMO,EAAmBrB,EAAoBc,GAC7C,OAAOya,GAAesK,GAA0B1f,KAAM2E,EAAQzJ,EAAkBP,IAElF2tB,cAAclC,GACZ,MAAM1Y,EAAOhO,EAAUumB,GAAWG,GAClC,OAAOhR,GAAe,IACjBpV,KAAKK,kBACLqN,EAAKrN,eACR8N,SAAUoa,GAAoBvoB,KAAM0N,KAGxC8a,cAAcC,GACZ,OAAOrT,GAAe,IACjBpV,KAAKK,kBACLgmB,GAAgBoC,GAASpoB,iBAGhCqoB,aAAa7K,GACX,OAAOzI,GAAe,IACjBpV,KAAKK,eACR8N,SAAUzO,EAAUiW,GAAUkI,KAGlChc,IAAI0jB,EAAa5qB,GACf,OAAO0yB,GAAuBrtB,KAAMN,EAAU+lB,GAAUF,GAAc5qB,GAExE+qB,SAASH,EAAa5qB,GACpB,OAAO0yB,GAAuBrtB,KAAM0E,EAAehF,EAAU+lB,GAAUF,IAAe5qB,GAExFgrB,MAAMC,EAAOjrB,GACX,OAAO2yB,GAAmBttB,KAAMN,EAAUqe,GAAe6H,IAAQ,EAAOjrB,GAE1EmrB,MAAMF,EAAOjrB,GACX,OAAO2yB,GAAmBttB,KAAMN,EAAUqe,GAAe6H,IAAQ,EAAMjrB,GAEzEyB,MAAMzB,GACJ,MAAMwnB,EAAiB7iB,EAAqB3E,E7DrGtB,EAMP,G6DgGf,OAAOya,GAAe,IACjB8M,GAAcliB,KAAKK,eAAgB8hB,GACtChU,SAAUnO,KAAKmO,WAGnB4X,OAAOH,GACL,OAAO3X,GAAejO,KAAMN,EAAUqe,GAAe6H,IAEvD3lB,SAAStF,GACP,MAAMyV,EAAeP,GAAyBlV,GACxC4sB,EAAkBlY,GAA2B1U,GAEnD,OAAOwV,GADW+R,GAAcliB,KAAKK,eAAgB+P,GACjBA,GAAgBU,GAAiB9Q,KAAKmO,SAASlO,WAAYsnB,GAEjGvB,gBAAgBmC,EAAaxtB,GAC3B,MAAMqa,EAAWtV,EAAUqZ,GAAUoP,GAC/B7S,EAAUlC,GAAc4B,EAAUhV,KAAMyP,GAAoB9U,IAClE,OAAO,IAAIutB,GAAc5S,EAAQ3D,iBAAkBqD,EAAUhV,KAAKmO,UAEpEwZ,mBACE,OAAOR,GAAgBnnB,KAAKK,gBAE9B+oB,kBACE,OAAOppB,KAAKmO,SAASgR,mBAAmBnf,MAE1CwnB,cACE,OAAO6B,GAAWrpB,KAAKK,gBAEzBipB,cACE,OAAOjE,GAAWrlB,KAAKK,iBAepB,SAAS+U,GAAe3U,GAC7B,OAAO,IAAIsd,GAActd,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQtK,EAAU8F,QAAS9F,EAAU+F,UAAW/F,EAAUgG,UAAWhG,EAAUiG,eAAgBjG,EAAUkG,eAAgBlG,EAAUmG,cAAenG,EAAU0N,UAExO,SAASkf,GAAuBE,EAAMlnB,EAAK1L,GACzC,MAAM8F,E/BrHD,SAA2BkE,EAAQ+iB,EAAU/sB,GAClD,MAAMwT,SAAEA,GAAaxJ,EAGrB,OAAO4H,GADWb,GADLyC,EAASub,QAAQL,GAAW1kB,GAASC,EAAiB8iB,EAAU7gB,IAAyBlM,GAC1D0F,gBAAgBwB,IAAI0F,GAAc5C,IAAS9C,IAAIyF,GAAmBogB,K+BkH5F8F,CAAkBD,EAAKltB,eAAgBgG,EAAK1L,GAC9D,OAAOya,GAAe,IACjB3U,EACH0N,SAAUof,EAAKpf,WAGnB,SAASmf,GAAmBC,EAAME,EAAM3F,EAAMntB,GAC5C,MAAMisB,EAAaloB,EAAiB/D,E7DvJnB,EANO,EAAA,EASN,G6DqJlB,OAAOksB,GAAekD,GAAcwD,EAAME,EAAMzF,GAAkBuF,EAAME,GAAO3F,EAAMlB,IAxBvFhU,GAAgBmL,GAAe,iBAC/B3L,GAAe2L,GAAejgB,GAC9B0U,GAAoBuL,GAAexL,IACnCgS,GAAyBxG,GAAe0F,GAAgC,CACtE9Y,KAAM,UACNjB,MAAO,UACPoB,IAAK,UACLic,aAAS,EACThgB,KAAM,UACNC,OAAQ,UACRC,OAAQ,WACP,KC7HI,MAAMymB,WAAsBntB,EACjCC,YAAYqK,EAAUE,EAAQoD,EAAW0K,KAAyB8U,EAAmBriB,IACnF5K,MAAM,IACDkO,GAAiB,CAAEhE,QAAS+iB,EAAkB9iB,SAAAA,EAAUE,OAAAA,G7DrBlC,G6DsBzBoD,SAAUzO,EAAUiW,GAAUxH,KAGlCiP,YAAYzd,EAAKhF,GAEf,GADAd,EAAoBc,GAChBgF,aAAe+tB,GACjB,OAAOE,GAAejuB,EAAIU,gBAE5B,GAAmB,iBAARV,EACT,OAAOuf,GAA0Bvf,EAAKhF,GAExC,MAAMie,E7BGH,SAAuBhb,GAC5B,MAAMlC,EAAMic,GAAiB/Z,IAAQqZ,GAAiBrZ,GACtD,IAAKlC,EACH,MAAMqb,GAAiB,WAAYnZ,GAErC,OAAOlC,E6BRUmyB,CAAc3rB,OAAOvC,IAIpC,YAHwB,IAApBiZ,EAAOzK,WACTyK,EAAOhO,QAAUU,IAEZsiB,GAAejV,GAAcC,IAEtC0M,KAAK3gB,EAAQhK,GACX,OAAOslB,GAA0BjgB,KAAM2E,EAAQhK,GAEjDorB,OAAOH,GACL,OAAQ1X,GAAiBlO,KAAMN,EAAUguB,GAAe9H,IAE1D3lB,SAAStF,GACP,MAAMgK,EAAS3E,KAAKK,eACd2J,EAAarF,EAAOwJ,SAASlO,WAC7BsnB,EAAkBlY,GAA2B1U,GACnD,O9CbyB,Y8CajBqP,EpCvBL,SAA2BrF,GAChC,OAAO5C,EAAS4C,EAAOkG,SAAU,GAAK,IAAM9I,EAAS4C,EAAOoG,OAAQ,GoCsB3B+iB,CAAkBnpB,GAAU0L,GAAc1L,IAAWmM,GAAiB9G,EAAYud,GAE3HC,YAAY7iB,GACV,OAAO3E,KAAKmO,SAASsS,eAAe,CAClC9V,KAAMhG,EAAOgG,KACblB,UAAWzJ,KAAKyJ,UAChBqB,IAAK9K,KAAK8K,KACT,CACD6D,SAAU,YAiBT,SAASif,GAAentB,GAC7B,OAAO,IAAIitB,GAAcjtB,EAAUoK,SAAUpK,EAAUsK,OAAQtK,EAAU0N,SAAU1N,EAAUmK,SCnE/F,SAASmjB,GAAkBpuB,GACzB,OAAOA,aAAesmB,IAAatmB,aAAeoe,IAAiBpe,aAAeuoB,IAAiBvoB,aAAeqnB,IAAkBrnB,aAAe+tB,GAE9I,SAASM,GAAgBruB,EAAKwO,EAAU8f,GAC7C,IAAIvgB,EACJ,GAAI/N,aAAesmB,GACjBvY,EAAO/N,OACF,GAAIouB,GAAkBpuB,GAAM,CACjC,GAAIsuB,GAAoBtuB,aAAe+tB,GACrC,MAAM,IAAI5xB,UAAU,6BAEtB4R,EAAO2b,GAAW1pB,EAAIU,qBAEtBqN,EAAOuY,GAAUpmB,KAAKF,GAGxB,OADAuuB,GAAqBxgB,EAAKS,SAAUA,GAC7BT,EAEF,SAASygB,GAAmBC,EAAU1f,EAAc/T,GACzD,GAAIozB,GAAkBK,GACpB,OAAOA,EAAS/tB,eAElB,IAAI6J,IAAEA,EAAGD,QAAEA,EAAOU,KAAEA,EAAIjB,MAAEA,EAAKD,UAAEA,EAASqB,IAAEA,GAAQsjB,EACpD,MAAMC,OAA0B,IAAZpkB,QAA8B,IAARC,EAAiBH,GAAe2E,EAAalF,GAAIS,EAASC,QAAO,EAC3G,QAAa,IAATS,EAAiB,CACnB,QAAoB,IAAhB0jB,EAGF,MAAM,IAAIvyB,UAAU,kDAFpB6O,EAAO0jB,OAKT,QAAoB,IAAhBA,GACEA,IAAgB1jB,EAClB,MAAM,IAAIlQ,WAAW,mCAI3B,QAAY,IAARqQ,EACF,MAAM,IAAIhP,UAAU,oBAEtB,MAAM6S,EAAW9U,EAAoBc,GACrC,QAAkB,IAAd8O,EAAsB,CACxB,MAAO6kB,EAAUC,GAAc7f,EAAa9E,iBAAiBH,EAAWkB,GACxE,QAAc,IAAVjB,GAAoBA,IAAU4kB,EAChC,MAAM,IAAI7zB,WAAW,qCAGvB,GADAiP,EAAQ4kB,EACJC,EAAY,CACd,G9DxDyB,I8DwDrB5f,EACF,MAAM,IAAIlU,WAAW,2BAEvBqQ,EAAM4D,EAAaxD,YAAYP,EAAMjB,SAElC,QAAc,IAAVA,EACT,MAAM,IAAI5N,UAAU,4CAGtB,OADC6O,EAAMjB,EAAOoB,GAAO2D,GAAoB9D,EAAMjB,EAAOoB,EAAK4D,EAAcC,GAClEjE,GAAsBgE,EAAa1D,kBAAkBL,EAAMjB,EAAOoB,IAEpE,SAAS0jB,GAAyBpI,EAAS6H,GAChD,GAAIF,GAAkB3H,GAAU,CAC9B,GAAI6H,GAAoB7H,aAAmBsH,GACzC,MAAM,IAAI5xB,UAAU,6BAEtB,OAAOsqB,EAAQ/lB,eAEf,OAAO4lB,GAAUpmB,KAAKumB,GAAS/lB,eAG5B,SAASouB,GAAkB/f,EAAc/D,GAC9C,OAAOkD,GAAca,EAAa1D,kBAAkBL,EAAM,EAAG,GAAI+D,EAAa1D,kBAAkBL,EAAO,EAAG,EAAG,IAExG,SAAS+jB,GAAiBhgB,EAAc/D,EAAMjB,EAAOoB,GAC1D,OAAO+C,GAAca,EAAa1D,kBAAkBL,EAAM,EAAG,GAAI+D,EAAa1D,kBAAkBL,EAAMjB,EAAOoB,IAAQ,EDpBvH8H,GAAgB8a,GAAe,iBAC/Btb,GAAesb,IACflb,GAAoBkb,GnCtBkB,CACpC,YACA,QmCqBFnJ,GAAyBmJ,GAAejK,GAAgC,CACtE/Z,MAAO,UACPoB,IAAK,WACJ,CACDic,aAAS,EACTpc,UAAM,EACN5D,UAAM,EACNC,YAAQ,EACRC,YAAQ,IACP,IE5DH,MAAM0nB,GAAgB,CACpBC,OAAQ,EACRC,QAAS,EACTC,MAAO,GAEF,MAAMC,WAAyBxlB,GACpC/I,YAAYgJ,GACV,MAAM8P,EAAS8J,GAAY5Z,GAC3B,GAmKuBwlB,EAnKAxlB,EAmKoBylB,EAnKhB3V,EAAOqB,kBAAkBxM,SAoK/C9D,GAAkB2kB,KAAwB3kB,GAAkB4kB,GAnK/D,MAAM,IAAIx0B,WAAW,qBAAuB+O,GAkKlD,IAA2BwlB,EAAoBC,EAhK3CvuB,MAAM8I,GACNxJ,KAAKsZ,OAASA,EACdtZ,KAAKkvB,eAAiBlvB,KAAKmvB,kBAAkB,GAAGxkB,K/ClBlB,K+CmB9B3K,KAAKovB,iBAAmB,GAE1BpkB,kBAAkBL,EAAMjB,EAAOoB,GAG7B,OAAOkD,GAFahO,KAAKqvB,gBAAgB1kB,GAAM,GACpBjB,EAAQ,GACPoB,EAAM,GAEpCI,YAAYP,EAAMjB,GAChB,MAAM4lB,EAActvB,KAAKqvB,gBAAgB1kB,GAAM,GACzC4kB,EAAcD,EAAY5lB,EAAQ,GACpCA,GAAS4lB,EAAYttB,SACvB2I,IACAjB,EAAQ,GAGV,OAAOmE,GAAc0hB,EADHvvB,KAAKqvB,gBAAgB1kB,GAAM,GAAGjB,IAGlD0B,aAAaT,GAEX,OADoB3K,KAAKqvB,gBAAgB1kB,GAAM,GAC5B3I,OAErByH,UAAUC,EAAOiB,GACf,MAAM6kB,EAAYxvB,KAAKyvB,qBAAqB9kB,GAC5C,OAAK6kB,GAAa9lB,EAAQ8lB,EACjB9uB,MAAM+I,UAAUC,EAAOiB,GAEzBjK,MAAM+I,UAAUC,EAAQ,EAAGiB,IAASjB,IAAU8lB,EAAY,IAAM,IAEzE5lB,iBAAiBH,EAAWkB,GAC1B,MAAM6kB,EAAYxvB,KAAKyvB,qBAAqB9kB,GAC5C,IAAId,EAAkB,KAAK5N,KAAKwN,GAC5BK,EAAepG,SAAS+F,EAAUhG,OAAO,IACzC8qB,GAAa,EACjB,GAAI1kB,EAAiB,CACnB,MAAM6lB,EAAkBf,GAAc3uB,KAAKwJ,IAC3C,QAAwB,IAApBkmB,EACF,MAAM,IAAIj1B,WAAW,8CAEvB,GAAIi1B,GACF,GAAI5lB,IAAiB4lB,EAAkB,EACrC,MAAM,IAAIj1B,WAAW,sCAGvB,GAAIqP,GAAgB,GAAKA,GAAgB,GACvC,MAAM,IAAIrP,WAAW,iCAW3B,OAPIoP,GAAqB2lB,GAAa1lB,IAAiB0lB,EAAY,IACjEjB,GAAa,EACb1kB,GAAkB,IAEhBA,GAAmB2lB,GAAa1lB,GAAgB0lB,IAClD1lB,IAEK,CAACA,EAAcykB,GAExBpjB,WAAWR,GACT,MAAM/E,EAAO6oB,GAAkBzuB,KAAM2K,GACrC,OAAO/E,EAAO6oB,GAAkBzuB,KAAM2K,EAAO,IAAM/E,EAAO6oB,GAAkBzuB,KAAM2K,EAAO,GAE3FU,qBAAqB5B,EAAWqB,GAC9B,IAAIH,E/CjF0B,K+CiFE3K,KAAKkvB,eACrC,MAAMS,EAAUhlB,EAAO,IACvB,KAAOA,EAAOglB,EAAShlB,IAAQ,CAC7B,MAAOjB,EAAO6kB,GAAcvuB,KAAK4J,iBAAiBH,EAAWkB,GAC7D,IAAK4jB,GAAc7kB,GAAS1J,KAAKoL,aAAaT,IAASG,GAAO9K,KAAKkL,YAAYP,EAAMjB,GACnF,OAAOiB,EAGX,MAAM,IAAIvK,MAAM,wBAElBmL,4BAA4BX,GAC1B,OAAOA,EAETJ,cAAcC,GACZ,MAAMmlB,EAAa5vB,KAAKmvB,kBAAkB1kB,GACpColB,EAAgB7vB,KAAKqvB,gBAAgBO,EAAWjlB,MAAM,GAC5D,MAAO,IACFilB,EACHlmB,MAAOmmB,EAAcD,EAAWlmB,QAGpCylB,kBAAkB1kB,GAChB,MAAMqlB,EAAWzW,GAAoBrZ,KAAKsZ,OAAQ7O,GAClD,IAAIP,EACAD,EACAU,EAAOjH,SAASosB,EAASC,aAAeD,EAASnlB,MjDrFlD,IAAiBX,EiD2FpB,OALI8lB,EAAS5lB,MjDtFOF,EiDsFQhK,KAAKwJ,QjDrFkB,IAA9C3B,GAAWwC,GAAkBL,OiDsFhCE,EAAM2P,GAAkBiW,EAAS5lB,KACjCD,EAAUU,EACVA,EAAOZ,GAAe/J,KAAKwJ,GAAIS,EAASC,GAAK,IAExC,CACLA,IAAAA,EACAD,QAAAA,EACAU,KAAAA,EACAjB,MAAOomB,EAASpmB,MAChBoB,IAAKpH,SAASosB,EAAShlB,MAG3B2kB,qBAAqB9kB,GACnB,MAAMqlB,EAAehwB,KAAKqvB,gBAAgB1kB,GACpCslB,EAAYjwB,KAAKqvB,gBAAgB1kB,EAAO,GACxCulB,EAAYlwB,KAAKqvB,gBAAgB1kB,EAAO,GAC9C,GAAIqlB,EAAa,GAAGhuB,OAASiuB,EAAU,GAAGjuB,QAAUguB,EAAa,GAAGhuB,OAASkuB,EAAU,GAAGluB,OAAQ,CAChG,MAAMmuB,EAAmBH,EAAa,GAChCI,EAAgBH,EAAU,GAChC,IAAK,IAAIpyB,EAAI,EAAGA,EAAIuyB,EAAcpuB,OAAQnE,IACxC,GAAIuyB,EAAcvyB,KAAOsyB,EAAiBtyB,GACxC,OAAOA,EAAI,GAMnBwxB,gBAAgB1kB,GACd,MAAMykB,iBAAEA,GAAqBpvB,KAC7B,OAAOovB,EAAiBzkB,KAAUykB,EAAiBzkB,GAAQ3K,KAAKqwB,gBAAgB1lB,IAElF0lB,gBAAgB1lB,GACd,MAAM2kB,EAAc,GACdgB,EAAY,GACZT,EAAgB,GACtB,IAAIplB,EAAaQ,GAAgBjL,KAAKuwB,aAAa5lB,GAAO,EAAG,GAE7D,IADAF,EAAauD,GAAavD,EAAY,OACzB,CACX,MAAM9F,EAAS3E,KAAKmvB,kBAAkB1kB,GACtC,GAAI9F,EAAOgG,KAAOA,EAChB,MAEFF,EAAauD,GAAavD,EAAY,EAAI9F,EAAOmG,KAC7CnG,EAAOgG,OAASA,IAClB2kB,EAAYkB,QAAQ/lB,GACpB6lB,EAAUE,QAAQ7rB,EAAO+E,QAE3Be,EAAauD,GAAavD,GAAa,GAEzC,IAAK,IAAI5M,EAAI,EAAGA,EAAIyyB,EAAUtuB,OAAQnE,IACpCgyB,EAAcS,EAAUzyB,IAAMA,EAAI,EAEpC,MAAO,CAACyxB,EAAagB,EAAWT,GAElCU,aAAa5lB,GACX,OAAOA,EAAO3K,KAAKkvB,gBAGhB,SAAS9L,GAAYpZ,GAC1B,OAAO,IAAIiQ,GAAmB,QAAS,CACrC9L,SAAUnE,EACVE,IAAK,QACLS,KAAM,UACNjB,MAAO,QACPoB,IAAK,UACLkK,SAAU,QCnLd,MAAMyb,GAAkBxlB,GAAgB,KAAM,EAAG,GCEjD,MAAMylB,GAAc,CAClB5oB,QAASsH,GACTnG,SDHK,cAAmCmG,GACxC5O,cACEE,SAASiwB,WACT3wB,KAAKsZ,OAAS8J,GAAY,YAE5B5Y,cAAcC,GACZ,MAAM9F,EAASjE,MAAM8J,cAAcC,GACnC,GAAIA,GAAcgmB,GAAiB,CACjC,MAAMX,EAAWzW,GAAoBrZ,KAAKsZ,OAAQ7O,GAClD9F,EAAOuF,IAAM2P,GAAkBiW,EAAS5lB,KACxCvF,EAAOsF,QAAUvG,SAASosB,EAASC,aAAeD,EAASnlB,MAE7D,OAAOhG,ICRTgE,QCRK,cAAkComB,GACvCwB,aAAa5lB,GACX,OAAOtP,KAAKgB,KAAY,GAAPsO,EAAY,GAAK,QDQhCoS,GAAY,CAChB6T,QAAiBplB,IAEZ,SAASqlB,GAAkBrnB,GAEhC,MAAMnM,GADNmM,EAAKtH,OAAOsH,IACGsnB,oBACf,OAAO/T,GAAU1f,KAAS0f,GAAU1f,GAAO,IAAKqzB,GAAYrmB,GAAkBhN,KAAS0xB,IAAkBvlB,IEb3G,MAAMunB,GAAW9lB,GAAgB,KAAM,GAAI,IACrC+lB,GAAc/lB,GAAgB,IAAK,EAAG,IACtCgmB,GAAkB,CACtBxoB,SAAUsoB,GACV9nB,SAAU8nB,GACVzoB,IAAKyoB,GACLpoB,QAASqoB,GACT,eAAgBA,GAChBnoB,OAAQ,GAEJqoB,GAAa,GACZ,SAASjP,GAAoBzV,EAAWxC,GAC7C,OAAOmnB,GAAqB3kB,EAAUhL,IpELb,KoEK8BI,WAAYoI,GAE9D,SAASmnB,GAAqB1mB,EAAYT,GAC/C,GAIF,SAA2BS,EAAYT,GACrC,OAEF,SAA0BA,GACxB,IAAIonB,EAASF,GAAWlnB,GACxB,QAAe,IAAXonB,EAAmB,CACrB,MAAMC,EAAiBJ,GAAgBjnB,GACvC,QAAuB,IAAnBqnB,EACFD,GAAS,MACJ,CACL,IAAIE,EAAOT,GAAkB7mB,GACvBsnB,aAAgBvC,KACpBuC,EAAO,IAAIvC,GAAiB/kB,IAE9B,MAAMunB,EAAgBF,EpEZF,MoEad1sB,EAAS2sB,EAAK9mB,cAAc+mB,GAClCH,EAASG,IAAkBD,EAAKtmB,kBAAkBrG,EAAOgG,KAAMhG,EAAO+E,MAAO/E,EAAOmG,KAEtFomB,GAAWlnB,GAAconB,EAE3B,OAAOA,EAnBAI,CAAiBxnB,IAAeS,EAAawmB,GAAgBjnB,GALhEynB,CAAkBhnB,EAAYT,GAChC,MAAM,IAAIvP,WAAW,kCCJzB,SAASi3B,GAAuB9mB,EAAS+mB,EAAUC,GACjD,MAAMC,EAAe,EAAIF,EAAWC,EAEpC,OADkB9vB,EAAe0L,GAAoB5C,EAAS,EAAGinB,GAAgBF,EAAU,GACvEE,EAAe,EAErC,SAASC,GAAsBlnB,EAAS+mB,EAAUC,GAChD,MAAMG,EAAaL,GAAuB9mB,EAAS+mB,EAAUC,GACvDI,EAAiBN,GAAuB9mB,EAAU,EAAG+mB,EAAUC,GACrE,OAAQnD,GAAkBjjB,GAAiBZ,GAAWmnB,EAAaC,GAAkB,ECKvF,MAAOhV,GAASC,IAAW1gB,IACpB,MAAMoZ,WAAiB7V,EAC5BU,YAAYgJ,GACV9I,QACW,aAAP8I,IACFA,EAAK,iBAEPyT,GAAQjd,KAAM6wB,GAAkBrnB,IAElC4T,YAAYzd,GACV,GAAI9D,EAAa8D,GACf,OCpCC,SAAyB0d,GAC9B,MAAM4U,EAAgB5U,EAAIlP,SAC1B,QAAsB,IAAlB8jB,EACF,OAAO5U,EAET,GAAIxhB,EAAao2B,SAA6C,IAA3BA,EAAc9jB,SAC/C,OAAO8jB,EAET,OAAO,IAAItc,GAASsc,GD4BTC,CAAgBvyB,GAEzB,MAAMiZ,EAAS3B,GAAiB/U,OAAOvC,IAAM,GAAO,GACpD,OAAO,IAAIgW,GAASiD,EAASA,EAAOzK,UtDLX,UsDKuCjM,OAAOvC,IAErE6J,SACF,OAAOxJ,KAAKC,WAEdiK,IAAIvK,GACF,MAAMc,EAAY+tB,GAAyB7uB,GAAK,GAChD,OAAOwyB,GAAmBnV,GAAQhd,MAAOS,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,QAAQb,IAEpGD,QAAQtK,GACN,MAAMc,EAAY+tB,GAAyB7uB,GAAK,GAChD,OAAOwyB,GAAmBnV,GAAQhd,MAAOS,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,QAAQd,QAEpGU,KAAKhL,GACH,MAAMc,EAAY+tB,GAAyB7uB,GAAK,GAChD,OAAOwyB,GAAmBnV,GAAQhd,MAAOS,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,QAAQJ,KAEpGjB,MAAM/J,GACJ,MAAMc,EAAY+tB,GAAyB7uB,GAAK,GAChD,OAAOwyB,GAAmBnV,GAAQhd,MAAOS,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,QAAQrB,MAEpGD,UAAU9J,GACR,MAAMgF,EAASqpB,GAAgBruB,EAAKK,MACpC,OAAOgd,GAAQhd,MAAMyJ,UAAU9E,EAAO+E,MAAO/E,EAAOgG,MAEtDG,IAAInL,GACF,MAAMc,EAAY+tB,GAAyB7uB,GAC3C,OAAOwyB,GAAmBnV,GAAQhd,MAAOS,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,QAAQD,IAEpGsnB,UAAUzyB,GACR,MAAMc,EAAY+tB,GAAyB7uB,GAAK,GAChD,OAAO6N,GAAoB/M,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,QAE9EsnB,UAAU1yB,GACR,MAAMgF,EAASqpB,GAAgBruB,EAAKK,MAAM,GAC1C,OAAO0uB,GAAiB1R,GAAQhd,MAAO2E,EAAOgG,KAAMhG,EAAO+E,MAAO/E,EAAOmG,KAE3EwnB,WAAW3yB,GACT,MAAMc,EAAY+tB,GAAyB7uB,GAAK,GAChD,OD9EG,SAA8BiL,EAASC,EAAUE,EAAQ4mB,EAAUC,GACxE,MAAMG,EAAaL,GAAuB9mB,EAAS+mB,EAAUC,GACvDW,EAAOl3B,KAAKiB,OAAOoyB,GAAiBljB,GAAiBZ,EAASC,EAAUE,GAAUgnB,EAAa,GAAK,GAAK,EAC/G,GAAIQ,EAAO,EACT,OAAOA,EAAOT,GAAsBlnB,EAAU,EAAG+mB,EAAUC,GAE7D,MAAMY,EAAYV,GAAsBlnB,EAAS+mB,EAAUC,GAC3D,OAAIW,EAAOC,EACFD,EAAOC,EAETD,ECoEEE,CAAqBhyB,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQ,EAAG,GAE1F2nB,WAAW/yB,GAET,OADA6uB,GAAyB7uB,GAAK,GACvB,EAETuL,YAAYvL,GACV,MAAMgF,EAASqpB,GAAgBruB,EAAKK,MAAM,GAC1C,OAAOgd,GAAQhd,MAAMkL,YAAYvG,EAAOgG,KAAMhG,EAAO+E,OAEvDipB,WAAWhzB,GACT,MAAMgF,EAASqpB,GAAgBruB,EAAKK,MAAM,GAC1C,OAAOyuB,GAAkBzR,GAAQhd,MAAO2E,EAAOgG,MAEjDS,aAAazL,GACX,MAAMizB,EAAY5E,GAAgBruB,EAAKK,MAAM,GAC7C,OAAOgd,GAAQhd,MAAMoL,aAAawnB,EAAUjoB,MAE9CQ,WAAWxL,GACT,OAAOqd,GAAQhd,MAAMmL,WAAWnL,KAAK2K,KAAKhL,IAE5C8gB,eAAe9b,EAAQhK,GACrB,MACM8F,EAAY0tB,GADI3yB,EAAamJ,EAAQqK,IACSgO,GAAQhd,MAAOrF,GACnE,OAAO,IAAIsrB,GAAUxlB,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQ/K,MAEhFif,oBAAoBta,EAAQhK,GAC1B,MACM8F,EAAY0tB,GAAmB,IADf3yB,EAAamJ,EAAQoK,IACcjE,IAAK,GAAKkS,GAAQhd,MAAOrF,GAClF,OAAO,IAAIqsB,GAAevmB,EAAUmK,QAASnK,EAAUoK,SAAU7K,KAAMS,EAAUsK,QAEnFoU,mBAAmBxa,EAAQhK,GACzB,MAAM22B,EAAOtU,GAAQhd,MACrB,IAAIkK,IAAEA,EAAGD,QAAEA,EAAOU,KAAEA,EAAIjB,MAAEA,EAAKD,UAAEA,EAASqB,IAAEA,GAAQtP,EAAamJ,EAAQuK,IACzE,QAAY,IAARpE,EACF,MAAM,IAAIhP,UAAU,gDAOtB,QALkB,IAAd2N,EACFkB,EAAOW,QACU,IAARpB,QAA8B,IAAZD,IAC3BU,EAAOZ,GAAeunB,EAAK9nB,GAAIS,EAASC,SAE7B,IAATS,EAAiB,CACnB,QAAkB,IAAdlB,EAGF,MAAM,IAAI3N,UAAU,gDAFpB6O,EAAO2mB,EAAKjmB,qBAAqB5B,EAAWqB,GAKhD,MAAMrK,EAAY0tB,GAAmB,CAAExjB,KAAAA,EAAMjB,MAAAA,EAAOD,UAAAA,EAAWqB,IAAAA,GAAOwmB,EAAM32B,GAC5E,OAAO,IAAI+yB,GAAcjtB,EAAUoK,SAAUpK,EAAUsK,OAAQ/K,KAAMsxB,EAAK/lB,4BAA4B9K,EAAUmK,UAElH8e,QAAQtD,EAASb,EAAa5qB,GAC5B,MAAM22B,EAAOtU,GAAQhd,MAIfS,ExCpGH,SAAuBoyB,EAAYne,EAAgBhG,EAAcxT,GAEtE23B,EAAave,GADbue,EAAa3e,GAAS2e,EAAYne,EAAejP,MAAOiJ,EAAcxT,GACnCwZ,EAAehP,OAAQgJ,EAAcxT,GACxE,IAAIuP,EAAaiE,EAAa1D,kBAAkB6nB,EAAWloB,KAAMkoB,EAAWnpB,MAAOmpB,EAAW/nB,KAC9F,MAAMgoB,EAAez3B,KAAKC,MAAMgM,GAAmBoN,GAAgBlT,IAAIjI,GAAWqI,YAGlF,OADA6I,EAAauD,GAAavD,EADU,EAAvBiK,EAAe/O,MAAY+O,EAAe9O,KAAOktB,GAEvDpoB,GAAsBD,GwC6FTsoB,CAHLrzB,EAAUumB,GAAWG,EAASzrB,GAC1B+E,EAAU+lB,GAAUF,GAEW+L,EADvBz3B,EAAoBc,IAE7C,OAAO,IAAIsrB,GAAUxlB,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQ/K,MAEhFoqB,UAAU4I,EAAUC,EAAUt4B,GAC5B,MAAM22B,EAAOtU,GAAQhd,MACf6E,EAAKnF,EAAUumB,GAAW+M,GAC1BluB,EAAKpF,EAAUumB,GAAWgN,GAC1BC,EAAiBr4B,EAAiBF,GAASwE,YAC3CA,EAAiC,SAAnB+zB,EtE7IL,EsE6IuC90B,EAAU80B,EtE7IjD,EAAA,EAGC,GsE4IhB,OADAhF,GAAqBluB,KAAMgoB,GAAkBnjB,EAAIC,IAC1C+hB,GlBhHJ,SAAwBhiB,EAAIC,EAAI4J,EAAcvP,GACnD,IAAIsG,EAAQ,EACRC,EAAS,EACTC,EAAQ,EACRC,EAAO,EACX,OAAQzG,GACN,KpDlCgB,EoDmCdsG,EAwBN,SAAyBZ,EAAIC,EAAI4J,GAC/B,OAAS0F,EAAUC,GAAU5F,GAAoB3J,EAAG6F,KAAM9F,EAAG6E,MAAO7E,EAAGiG,IAAK4D,EnDpE5C,GmDqE1BykB,EAAc5kB,GAAuBzJ,EAAID,GACzCuuB,EAAYxyB,EAAckE,EAAG4E,MAAO0K,IAAaxT,EAAckE,EAAGgG,IAAKuJ,GAC7E,OAAOvP,EAAG6F,KAAO9F,EAAG8F,MAAQyoB,GAAaD,GAAeC,IAAcD,EAAcA,EAAc,GA5BtFE,CAAgBxuB,EAAIC,EAAI4J,GAChC7J,EAAKqP,GAASrP,EAAIY,EAAOiJ,EnD5CG,GmD6C9B,KpDtCiB,EoDuCfhJ,EA2BN,SAA0Bb,EAAIC,EAAI4J,GAChC,IAAI6F,EAAc,EAClB,MAAM4e,EAAc5kB,GAAuBzJ,EAAID,GAC/C,GAAIsuB,EAAa,CACf,IAAIxoB,KAAEA,GAAS9F,EACf,KAAO8F,IAAS7F,EAAG6F,MACjB4J,GAAe7F,EAAatD,aAAaT,GAAQwoB,EACjDxoB,GAAQwoB,EAEV,OAAS/e,EAAUC,GAAU5F,GAAoB3J,EAAG6F,KAAM9F,EAAG6E,MAAO7E,EAAGiG,IAAK4D,EnDlF9C,GmDmF9B6F,GAAezP,EAAG4E,MAAQ0K,EAC1B,MAAMkf,EAAU1yB,EAAckE,EAAGgG,IAAKuJ,GAClCif,GAAWH,GAAeG,IAAYH,IACxC5e,GAAe4e,GAGnB,OAAO5e,EA3CMgf,CAAiB1uB,EAAIC,EAAI4J,GAClC7J,EAAKyP,GAAUzP,EAAIa,EAAQgJ,EnD/CC,GmDiDhC9I,EAAOiI,GAAca,EAAa1D,kBAAkBnG,EAAG8F,KAAM9F,EAAG6E,MAAO7E,EAAGiG,KAAM4D,EAAa1D,kBAAkBlG,EAAG6F,KAAM7F,EAAG4E,MAAO5E,EAAGgG,MpD3CnH,IoD4Cd3L,IACFwG,EAAQtK,KAAKC,MAAMsK,EAAO,GAC1BA,GAAQ,GAEV,OAAOJ,GAAa,CAClBC,MAAAA,EACAC,OAAAA,EACAC,MAAAA,EACAC,KAAAA,EACAC,MAAO,EACPC,QAAS,EACTC,QAAS,EACTC,aAAc,EACdC,aAAc,EACdC,YAAa,IkBoFSstB,CAAe3uB,EAAIC,EAAIwsB,EAAMnyB,IAErDwF,OAAO8uB,GACL,OAAOA,EAASthB,QAElBoP,YAAYmS,EAAYC,GACtB,OAAOnS,GAAekS,EAAYC,GAEpC1zB,WACE,OAAO+c,GAAQhd,MAAMwJ,IAIlB,SAASqP,KACd,OAAO,IAAIlD,GtD7HgB,WsD+HtB,SAAS6L,GAAekS,EAAYC,GACzC,IAAIn1B,EACJ,MAAMo1B,EAAS,IAAKF,KAAeC,GACnC,QAAwB,IAApBD,EAAW/oB,KAAiB,QACvBipB,EAAO1pB,WACP0pB,EAAO3pB,eACP2pB,EAAOjpB,KACd,IAAIkpB,GAAoB,OACK,IAAzBF,EAAiBzpB,UAA+C,IAA7BypB,EAAiB1pB,UACtD2pB,EAAO1pB,IAAMypB,EAAiBzpB,IAC9B0pB,EAAO3pB,QAAU0pB,EAAiB1pB,QAClC4pB,GAAoB,QAEQ,IAA1BF,EAAiBhpB,OACnBipB,EAAOjpB,KAAOgpB,EAAiBhpB,KAC/BkpB,GAAoB,GAEjBA,IACHD,EAAOjpB,KAAO+oB,EAAW/oB,MAG7B,QAA6B,IAAzB+oB,EAAWjqB,UAAsB,QAC5BmqB,EAAOnqB,iBACPmqB,EAAOlqB,MACd,IAAIoqB,GAAqB,OACM,IAA3BH,EAAiBjqB,QACnBkqB,EAAOlqB,MAAQiqB,EAAiBjqB,MAChCoqB,GAAqB,QAEY,IAA/BH,EAAiBlqB,YACnBmqB,EAAOnqB,UAAYkqB,EAAiBlqB,UACpCqqB,GAAqB,GAElBA,IACHF,EAAOnqB,UAAYiqB,EAAWjqB,WAMlC,YAHuB,IAAnBiqB,EAAW5oB,MACb8oB,EAAO9oB,IAAqC,OAA9BtM,EAAKm1B,EAAiB7oB,KAAetM,EAAKk1B,EAAW5oB,KAE9D8oB,EAET,SAASzB,GAAmBzjB,EAAc9D,EAASC,EAAUE,GAC3D,MAAMN,EAAaQ,GAAgBL,EAASC,EAAUE,GAEtD,OADAomB,GAAqB1mB,EAAYiE,EAAalF,IACvCkF,EAAalE,cAAcC,GCpM7B,SAASoU,GAAgBvkB,GAC9B,YAAuB,IAAnBA,EAAM6T,SACD0K,KAEFnZ,EAAUiW,GAAUrb,EAAM6T,UAE5B,SAAS6Z,GAAkB+L,EAAMC,GACtC,MAAM7lB,SAAEA,GAAa4lB,EAErB,OADA7F,GAAqB/f,EAAU6lB,EAAK7lB,UAC7BA,EAEF,SAASoa,GAAoBwL,EAAMC,GACxC,MAAMC,EAAYF,EAAK5lB,SACjB+lB,EAAYF,EAAK7lB,SACvB,GvDU2B,YuDVvB8lB,EAAUzqB,GACZ,OAAO0qB,EAET,GvDO2B,YuDPvBA,EAAU1qB,GACZ,OAAOyqB,EAET,GAAIA,EAAUzqB,KAAO0qB,EAAU1qB,GAC7B,MAAM,IAAI/O,WAAW,kCAEvB,OAAOw5B,EAEF,SAAS/F,GAAqB+F,EAAWC,GAC9C,GAAID,EAAUh0B,aAAei0B,EAAUj0B,WACrC,MAAM,IAAIxF,WAAW,wBDwHzBmY,GAAgB+C,GAAU,YEnInB,MAAMsQ,WAAkB1lB,EAC7BC,YAAYoK,EAASC,EAAUE,EAAQ8S,EAAchF,MACnD,MAAMqO,EAActY,GAAiB,CAAEhE,QAAAA,EAASC,SAAAA,EAAUE,OAAAA,GvE9B/B,GuE+BrBoD,EAAWzO,EAAUiW,GAAUkI,I3BpBlC,SAAsBpd,EAAWuJ,GACtC,MAAMwC,EAAYd,GAAqBjL,GACvCuhB,GAAcxV,EAAU3K,IAAI2K,EAAU1J,OAAS,EAX/BvJ,eAW+C,IAC/D0oB,GAAoBzV,EAAWxC,G2BkB7BmqB,CAAajN,EAAa/Y,EAASlO,YACnCS,MAAM,IACDwmB,EACH/Y,SAAAA,IAGJiP,YAAYzd,EAAKhF,GAEf,OADAd,EAAoBc,GAChBgF,aAAesmB,GACVoD,GAAW1pB,EAAIU,gBAEL,iBAARV,EACF+e,GAAsB/e,EAAKhF,GAE7B0uB,GAAW1Q,GAAc3B,GAAc9U,OAAOvC,MAEvDyd,eAAevc,EAAGC,GAChB,OAAOoN,GAAiBxO,EAAUumB,GAAWplB,GAAInB,EAAUumB,GAAWnlB,IAExEwkB,KAAK3gB,EAAQhK,GACX,OAAOglB,GAAsB3f,KAAM2E,EAAQhK,GAE7C+tB,aAAa7K,GACX,MAAMpd,EAAYT,KAAKK,eACvB,OAAO,IAAI4lB,GAAUxlB,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQ8S,GAEhFhc,IAAI0jB,EAAa5qB,GACf,OAAOqF,KAAKmO,SAASub,QAAQ1pB,KAAMulB,EAAa5qB,GAElD+qB,SAASH,EAAa5qB,GACpB,OAAOqF,KAAKmO,SAASub,QAAQ1pB,KAAMN,EAAU+lB,GAAUF,GAAa+G,UAAW3xB,GAEjFgrB,MAAMC,EAAOjrB,GACX,OAAOy5B,GAAep0B,KAAMN,EAAUumB,GAAWL,IAAQ,EAAOjrB,GAElEmrB,MAAMF,EAAOjrB,GACX,OAAOy5B,GAAep0B,KAAMN,EAAUumB,GAAWL,IAAQ,EAAMjrB,GAEjEorB,OAAOH,GACL,OAAQ1X,GAAiBlO,KAAMN,EAAUumB,GAAWL,IAEtD3lB,SAAStF,GACP,MAAM4sB,EAAkBlY,GAA2B1U,GAC7CgK,EAAS3E,KAAKK,eACpB,OAAOgQ,GAAc1L,GAAUmM,GAAiBnM,EAAOwJ,SAASlO,WAAYsnB,GAE9EvB,gBAAgBrrB,GACd,MAAM05B,EAsCV,SAAuC15B,GACrC,IAAIgmB,EACA3L,EACJ,GAAuB,iBAAZra,EACTqa,EAAWra,MACN,CAAA,GAAuB,iBAAZA,EAWhB,MAAM,IAAImB,UAAU,qCAJpB,QANmB,IAAfnB,EAAQ6O,GACVwL,EAAWra,GAEXqa,EAAWra,EAAQqa,SACnB2L,EAAYhmB,EAAQgmB,gBAEL,IAAb3L,EACF,MAAM,IAAIlZ,UAAU,6BAKxB,MAAO,CAAE6kB,UAAAA,EAAW3L,SAAAA,GAxDKsf,CAA8B35B,GAC/Cqa,EAAWtV,EAAUqZ,GAAUsb,EAAerf,UAC9C2L,OAAyC,IAA7B0T,EAAe1T,eAAuB,EAASjhB,EAAU0lB,GAAWiP,EAAe1T,WACrG,OAAOuF,GAA8B,IAChClmB,KAAKK,kBACLsgB,EAAYA,EAAUtgB,eAAiBiG,GAC1C0O,SAAAA,IAGJmR,gBAAgBsC,GACd,OAAOrT,GAAe,IACjBpV,KAAKK,kBACLgmB,GAAgBoC,GAASpoB,iBAGhCsnB,mBACE,OAAOR,GAAgBnnB,KAAKK,gBAE9B+oB,kBACE,OAAOppB,KAAKmO,SAASgR,mBAAmBnf,OAgBrC,SAASqpB,GAAW5oB,GACzB,OAAO,IAAIwlB,GAAUxlB,EAAUmK,QAASnK,EAAUoK,SAAUpK,EAAUsK,OAAQtK,EAAU0N,UAsB1F,SAASimB,GAAeG,EAAKC,EAAK1M,EAAMntB,GACtC,OAAOksB,GAAekB,GAAUwM,EAAKC,EAAKxM,GAAkBuM,EAAKC,GAAM1M,EAAMppB,EAAiB/D,ExEtI7E,EAAA,EAAA,EAGC,KoDWb,SAASovB,GAAcF,EAAKC,EAAK3b,EAAU2Z,EAAMlB,GACtD,OAAOwE,GAAkBV,GAAab,EAAKC,EAAK3b,EAAUyY,EAAWznB,aAAc0qB,EAAKC,EAAK3b,EAAU2Z,EAAMlB,GAExG,SAASmB,GAAUljB,EAAIC,EAAIqJ,EAAU2Z,EAAMlB,GAIhD,OAAOwE,GAHkBjd,EAASic,UAAUvlB,EAAIC,EAAI,CAClD3F,YAAapB,EAAU6oB,EAAWznB,eAEO0F,EAAIC,EAAIqJ,EAAU2Z,EAAMlB,GAiE9D,SAAS8D,GAAab,EAAKC,EAAK3b,EAAUhP,GAC/C,IAAKvF,EAAWuF,GACd,OAAOs1B,GAAc5K,EAAKC,EAAK3qB,GAEjC,MAAMu1B,EAAYrL,GAAW,IAAKQ,EAAIxpB,eAAgB8N,SAAAA,IACtD,IACIwmB,EACAC,EACAC,EACAC,EACAC,EALAC,EAAa3L,GAAW,IAAKS,EAAIzpB,eAAgB8N,SAAAA,IAMrD,GACEymB,EAAczmB,EAASic,UAAUsK,EAAWM,EAAY,CAAE71B,YAAapB,EAAUoB,KACjFw1B,EAAiB9K,EAAIhoB,IAAI+yB,GACzBC,EAAeJ,GAAcE,EAAgB7K,EpDrG7B,GoDsGhBgL,EAAUF,EAAY9xB,KACtBiyB,EAAWF,EAAa/xB,WACjBgyB,GAAWC,GAAYD,IAAYC,IAAaC,EAAaA,EAAWnzB,IAAI,CAAE+D,KAAMmvB,MAC7F,OxCnGiCjwB,EwCmGE+vB,ExClG5B,CACL/xB,MAF2B+B,EwCmGP+vB,GxCjGX9xB,MAAQgC,EAAGhC,KACpB2C,MAAOZ,EAAGY,MAAQX,EAAGW,MACrBC,OAAQb,EAAGa,OAASZ,EAAGY,OACvBC,MAAOd,EAAGc,MAAQb,EAAGa,MACrBC,KAAMf,EAAGe,KAAOd,EAAGc,KACnBC,MAAOhB,EAAGgB,MAAQf,EAAGe,MACrBC,QAASjB,EAAGiB,QAAUhB,EAAGgB,QACzBC,QAASlB,EAAGkB,QAAUjB,EAAGiB,QACzBC,aAAcnB,EAAGmB,aAAelB,EAAGkB,aACnCC,aAAcpB,EAAGoB,aAAenB,EAAGmB,aACnCC,YAAarB,EAAGqB,YAAcpB,EAAGoB,aAZ9B,IAAwBrB,EAAIC,EwCqGnC,SAAS2vB,GAAc5K,EAAKC,EAAK3qB,GAC/B,OAAOqI,GAAe4F,GAAY0c,GAAKnoB,IAAIyL,GAAYyc,IAAO1qB,GoBVhEyT,GAAgBqT,GAAW,aAC3B7T,GAAe6T,IACfzT,GAAoByT,GAAW1T,IAC/BgS,GAAyB0B,GAAWxC,GAAgC,CAClE9Y,KAAM,UACNjB,MAAO,UACPoB,IAAK,UACLic,aAAS,GACR,CACDhgB,UAAM,EACNC,YAAQ,EACRC,YAAQ,KCtFH,MAAM8M,WAAgB7T,EAC3BM,YAAYmR,GACVjR,QACA,MAAM8L,EAAY3I,EAAe8N,GAAkB,I5BRhD,SAAyBnF,IACqB,IAA/CrI,EAAiBqI,EAAWoV,KAAsE,IAA9Czd,EAAiBqI,EAAWmV,KAClFtV,K4BOA4oB,CAAgBzoB,GAChBxM,KAAKyL,IAAmBe,EAE1B4Q,YAAYzd,GACV,GAAIA,aAAeoU,GACjB,OAAO,IAAIA,GAAQpU,EAAIgS,kBAEzB,MAAMhN,EAASkS,GAAmB3U,OAAOvC,IACnCiR,EAAajM,EAAOoQ,kBAC1B,QAAmB,IAAfnE,EACF,MAAM,IAAInW,WAAW,0BAEvB,OAAO,IAAIsZ,GAAQrI,GAAqBmD,GAAqBlK,ExE1ClC,IwE0C4DhD,IAAIiP,IAE7FwM,wBAAwBvL,GACtB,OAAO,IAAIkC,GAAQlQ,EAAegO,GAAcpQ,KzEnCxB,MyEqC1B2b,6BAA6BpS,GAC3B,OAAO,IAAI+I,GAAQlQ,EAAemH,GAAmBvJ,KzEvC9B,MyEyCzB2b,6BAA6BxL,GAC3B,OAAO,IAAImC,GAAQnC,EAAoBhO,OzE3ChB,MyE6CzBwZ,4BAA4BzL,GAC1B,OAAO,IAAIoC,GAAQpC,GAErByL,eAAevc,EAAGC,GAChB,OAAO0N,GAAiB9O,EAAUqU,GAASlT,GAAInB,EAAUqU,GAASjT,IAEpEe,IAAI0jB,GACF,OAAO,IAAIxR,GAAQU,GAAmBzU,KAAKyL,IAAkB/L,EAAU+lB,GAAUF,KAEnFG,SAASH,GACP,OAAO,IAAIxR,GAAQU,GAAmBzU,KAAKyL,IAAkB/G,EAAehF,EAAU+lB,GAAUF,MAElGI,MAAMC,EAAOjrB,GACX,OAAOu6B,GAAal1B,KAAMN,EAAUqU,GAAS6R,GAAQjrB,GAEvDmrB,MAAMF,EAAOjrB,GACX,OAAOu6B,GAAax1B,EAAUqU,GAAS6R,GAAQ5lB,KAAMrF,GAEvDyB,MAAMzB,GACJ,MAAMwnB,EAAiB7iB,EAAqB3E,EzE1EtB,EAKN,GyEqEuD,GACvE,OAAO,IAAIoZ,GAAQyO,GAAexiB,KAAKyL,IAAkB0W,IAE3D4D,OAAOH,GACL,OAAQpX,GAAiBxO,KAAMN,EAAUqU,GAAS6R,IAEpD3lB,SAAStF,GACP,MAAMwtB,EAActtB,EAAiBF,GAASqa,SAE9C,OADsBhV,KAAKm1B,mBAAkC,MAAfhN,EAAsBA,EAAc,OAC7DloB,SAAS,IACzBtF,EACH6jB,YAAwB,IAAhB2J,EAAyB,QAAU,OAC3CxE,aAAc,gBACM,IAAhBwE,EAAyB,IAAM,IAEvCgN,mBAAmBhN,GACjB,OAAO,IAAID,GAAcloB,KAAK2R,iBAAkBwW,GAElDnC,gBAAgBrrB,GACd,IAAKkB,EAAalB,GAChB,MAAM,IAAImB,UAAU,wBACf,QAAyB,IAArBnB,EAAQwT,SACjB,MAAM,IAAIrS,UAAU,2BACf,QAAyB,IAArBnB,EAAQqa,SACjB,MAAM,IAAIlZ,UAAU,2BAEtB,OAAO,IAAIosB,GAAcloB,KAAK2R,iBAAkBhX,EAAQqa,SAAUra,EAAQwT,WAgB9E,SAAS+mB,GAAaE,EAAOC,EAAO16B,GAClC,MAAMisB,EAAaloB,EAAiB/D,EzElHhB,EAHI,EAAA,EAKN,GyEiHlB,OAAOksB,GrBrFF,SAAwBhR,EAAYyf,EAAY1O,GAErD,OAAOpf,GADalG,EAAmBg0B,EAAW3zB,IAAIkU,GAAarc,EAAOotB,EAAW5nB,cAAgB4nB,EAAW7nB,kBAAmB6nB,EAAW3nB,cAC3G2nB,EAAWznB,aqBmFxBo2B,CAAeH,EAAM3pB,IAAkB4pB,EAAM5pB,IAAkBmb,IAfvFhU,GAAgBmB,GAAS,WACzBrC,GAAiBqC,IACjBwQ,GAAyBxQ,GAAS4O,GAAgC,CAChEhY,KAAM,UACNjB,MAAO,UACPoB,IAAK,UACLic,aAAS,EACThgB,KAAM,UACNC,OAAQ,UACRC,OAAQ,WACP,CACD0c,kBAAc,GACb,KChHH,MAAM6R,GAAoB/1B,SACpBg2B,GAAoBh2B,SACpBi2B,GAAmBj2B,SACzB,MAAMk2B,WAAwBzb,KAAKC,eACjC3Z,YAAY6Z,EAAY1f,GACtB,MAAMi7B,EAAcxb,GAA2BC,GACzCwb,EpCJH,SAAwBl7B,GAC7B,MAAMm7B,EAAa,GACnB,IAAK,MAAMhjB,KAAQnY,EAAS,CAC1B,IAAII,EAAMJ,EAAQmY,GACdjX,EAAad,KACfA,EAAMA,EAAIkF,YAEZ61B,EAAWhjB,GAAQ/X,EAErB,OAAO+6B,EoCLeC,CAAep7B,GAAW,IAC9C+F,MAAMk1B,EAAaC,GACnB71B,KAAKw1B,IAAqBI,EAC1B51B,KAAKy1B,IAAqBI,EAC1B71B,KAAK01B,IAAoC,IAAIM,IAE/C1c,OAAO8M,GACL,MAAM5V,EAAQylB,GAAiBj2B,KAAMomB,GACrC,OAAI5V,EAAM,KAAOxQ,KACRU,MAAM4Y,OAAO9I,EAAM,IAErBA,EAAM,GAAG8I,OAAO9I,EAAM,IAE/BgJ,cAAc4M,GACZ,OAAO1lB,MAAM8Y,cAAcyH,QAAQgV,GAAiBj2B,KAAMomB,IAE5D8P,YAAYC,EAAUC,GACpB,OAAO11B,MAAMw1B,YAAYjV,QAAQoV,GAAgBr2B,KAAMm2B,EAAUC,IAEnEE,mBAAmBH,EAAUC,GAC3B,OAAO11B,MAAM41B,mBAAmBrV,QAAQoV,GAAgBr2B,KAAMm2B,EAAUC,KAGhE,MAACjc,GAAiBwb,GAC9B,SAASM,GAAiBM,EAAoBnQ,GAC5C,MAAM5B,EAAqBE,GAA4B0B,GACvD,GAAI5B,EAAoB,CACtB,MAAMC,EAAgB+R,GAA0BD,EAAoB/R,GACpE,MAAO,CACLC,EAAcrB,YAAYgD,GAC1B3B,EAAcnB,gBAAgB8C,IAGlC,MAAO,CAACmQ,EAAoBnQ,GAE9B,SAASiQ,GAAgBE,EAAoBJ,EAAUC,GACrD,MAAM5R,EAAqBE,GAA4ByR,GAEvD,GAAI3R,IAD4BE,GAA4B0R,GAE1D,MAAM,IAAIt6B,UAAU,qBAEtB,GAAI0oB,EAAoB,CACtB,MAAMC,EAAgB+R,GAA0BD,EAAoB/R,GACpE,MAAO,CACLC,EAAcrB,YAAY+S,EAAUC,GACpC,IAAIlqB,KAAKuY,EAAcnB,gBAAgB6S,IACvC,IAAIjqB,KAAKuY,EAAcnB,gBAAgB8S,KAG3C,MAAO,CAACG,EAAoBJ,EAAUC,GAExC,SAASI,GAA0BD,EAAoB/R,GACrD,MAAMiS,EAAmBF,EAAmBb,IAC5C,IAAIjR,EAAgBgS,EAAiBh6B,IAAI+nB,GAKzC,OAJKC,IACHA,E3BNG,SAAkCA,GACvC,MAAMiS,EAAgB,GAMtB,MAAO,CACLtT,YANF,SAAqBI,EAAQU,GAC3B,MAAM3mB,EAAOknB,EAAcvB,SAASM,EAAQU,GACtC7mB,EAAME,EAAKgF,KAAK,KACtB,OAAOm0B,EAAcr5B,KAASq5B,EAAcr5B,GAAOonB,EAAcrB,eAAe7lB,KAIhF+lB,gBAAiBmB,EAAcnB,iB2BHfqT,CAAyBnS,EAAmB+R,EAAmBf,IAAoBe,EAAmBd,MACtHgB,EAAiB95B,IAAI6nB,EAAoBC,IAEpCA,ECnDT,MAAMmS,GAAO,CACXC,iBAYF,SAA6B1O,GAC3B,OAAOjC,GAA8B4Q,G3DQV,U2DRyC3O,KAZpE5I,cAcF,SAA0B1B,EAAasK,GACrC,OAAOjC,GAA8B4Q,GAAgBjZ,EAAasK,KAdlE4O,iBAgBF,SAA6B5O,GAC3B,OAAO/S,GAAe0hB,G3DEK,U2DF0B3O,KAhBrDxU,cAkBF,SAA0BkK,EAAasK,GACrC,OAAO/S,GAAe0hB,GAAgBjZ,EAAasK,KAlBnD6O,aAoBF,SAAyB7O,GACvB,OAAOkB,GAAWyN,G3DJS,U2DIsB3O,KApBjDzH,UAsBF,SAAsB7C,EAAasK,GACjC,OAAOkB,GAAWyN,GAAgBjZ,EAAasK,KAtB/C8O,aAwBF,SAAyB9O,GACvB,OAAO9C,GAAWyR,G3DVS,U2DUsB3O,KAxBjD7S,QA0BF,WACE,OAAO,IAAIvB,GAAQmjB,OA1BnBliB,SAAUmiB,IAEZvkB,GAAgBgkB,GAAM,OA0BtB,SAASO,KACP,OAAO,IAAIpe,IAAS,IAAIkB,IAAqBU,kBAAkB3F,UAEjE,SAAS8hB,GAAgBjZ,EAAasK,EAAcgP,MAClD,MAAMniB,EAAWtV,EAAUqZ,GAAUoP,GACrC,MAAO,IACFC,GAA4B8O,KAAgBliB,GAAU,GACzDA,SAAAA,EACA7G,SAAUzO,EAAUiW,GAAUkI,IAGlC,SAASqZ,KACP,OAAOrzB,EAAeqI,KAAKkrB,OAAO31B,K3EtDT,K4EAf,MAAC41B,GAAW,CACtBrQ,eAAAA,GACA0G,cAAAA,GACAzH,UAAAA,GACAb,UAAAA,GACArH,cAAAA,GACAmK,cAAAA,GACAnU,QAAAA,GACA4B,SAAAA,GACAoD,SAAAA,GACA0M,SAAAA,GACA6R,IDMiBV,GCLjB,CAACn3B,OAAOsT,aAAc,gFCvBjB,WACL,MAA6B,oBAAfwkB,WAA6BA,WAAaC,kCCAnD,WACL,OAAOzjB,GAAQ0jB,sBAAsBz3B,KAAKG","sourceRoot":""},"url":null},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/create_data.js":{"lineLengths":[13,62,28,36,48,36,38,48,49,15,5,58,58,5,144,21,62,69,9,21,84,5,78,21,48,25,86,9,47,91,25,56,73,13,25,80,73,13,25,95,9,55,86,25,67,37,68,13,75,9,58,91,107,9,55,48,9,56,49,9,50,49,9,50,46,9,50,46,9,50,47,9,53,50,9,14,69,9,42,25,80,9,5,82,35,21,17,35,41,54,21,65,17,22,21,17,35,41,54,21,72,17,22,21,17,35,41,54,21,71,17,22,21,17,35,41,54,21,37,43,58,21,94,17,22,21,51,22,21,50,22,21,50,22,21,53,22,26,52,22,24,54,22,27,53,22,20,29,60,33,98,17,59,93,33,64,81,21,33,98,81,21,33,113,17,22,74,17,9,5,78,56,5,84,64,65,9,75,5,78,58,53,9,56,5,10,60,5,1,32,39],"data":null,"url":"create_data.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/delete_internal.js":{"lineLengths":[13,66,91,39,213,164,128,2,62,32,36,40,33,48,24,18,48,37,35,63,9,5,73,90,93,94,89,90,68,25,47,19,9,14,56,25,47,19,9,5,71,176,39,9,52,34,9,15,5,88,52,61,9,37,64,42,35,86,34,63,95,33,30,21,17,28,46,17,13,59,42,13,9,15,5,17,60,9,131,26,23,25,25,58,82,89,50,64,45,21,26,50,21,17,13,122,60,22,13,136,42,13,123,42,13,76,43,42,22,13,9,5,45,13,13,66,9,45,5,1,40,43],"data":null,"url":"delete_internal.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/loop.js":{"lineLengths":[13,66,91,39,213,164,128,2,126,72,13,144,138,2,101,91,66,122,142,86,124,54,54,86,2,62,22,52,36,49,34,84,45,5,17,26,24,52,41,31,90,86,59,5,12,19,15,6,1,31,65,34,49,9,56,43,36,54,13,86,41,9,46,27,25,47,41,9,195,141,23,155,62,113,52,42,9,14,34,9,72,28,13,71,66,58,26,17,60,86,87,72,47,33,21,17,29,74,31,45,39,185,74,57,17,13,9,17,49,25,61,9,7,1,20,32],"data":null,"url":"loop.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/describe.js":{"lineLengths":[13,62,26,36,26,11,27,21,57,116,19,9,97,32,9,95,32,9,58,32,9,59,32,9,55,32,9,55,32,9,56,32,9,55,32,9,54,32,9,57,32,9,57,32,9,58,32,9,61,32,9,60,32,9,61,32,9,64,32,9,14,91,9,5,53,47,5,23,52,52,50,52,54,9,14,101,9,5,25,52,58,9,14,103,9,5,22,21,70,101,5,1,28,36],"data":null,"url":"describe.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/find.js":{"lineLengths":[13,62,22,46,36,31,35,99,44,42,5,15,23,25,36,24,9,23,25,47,19,9,36,36,36,36,36,36,36,36,36,31,5,29,48,39,72,13,9,46,68,9,30,36,24,9,36,51,9,58,26,25,37,25,51,44,13,9,14,45,9,77,5,10,40,5,23,41,21,43,21,54,47,79,45,26,17,13,19,9,5,10,31,28,46,9,17,50,37,31,41,22,13,9,5,29,73,25,54,29,69,13,42,50,13,9,5,26,63,32,34,49,44,46,46,148,15,46,44,48,117,48,29,41,50,49,17,22,33,76,33,59,17,56,13,59,46,13,18,43,13,72,22,13,9,5,31,21,43,5,10,21,43,5,90,35,28,33,9,31,26,9,79,5,74,89,5,10,77,5,102,96,5,10,78,5,1,20,32],"data":null,"url":"find.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/abap_regex.js":{"lineLengths":[13,62,28,18,60,27,24,96,88,70,48,19,5,31,64,5,1,32,38],"data":null,"url":"abap_regex.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/collect.js":{"lineLengths":[13,62,25,40,55,45,34,126,27,79,5,1,26,35],"data":null,"url":"collect.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/overlay.js":{"lineLengths":[13,62,25,52,36,39,88,26,27,35,46,105,9,5,1,26,35],"data":null,"url":"overlay.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/cast.js":{"lineLengths":[13,62,22,40,48,36,32,23,36,23,37,11,41,23,15,5,44,25,48,48,50,9,48,15,5,90,46,5,31,34,108,5,17,47,36,34,21,65,5,107,62,97,60,67,9,5,134,69,63,38,67,9,5,23,1,20,32],"data":null,"url":"cast.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_bit.js":{"lineLengths":[13,62,24,38,57,44,23,51,5,49,47,41,41,1,24,35],"data":null,"url":"get_bit.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/read_report.js":{"lineLengths":[13,62,28,36,36,23,29,80,5,11,17,39,1,32,39],"data":null,"url":"read_report.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/raise_event.js":{"lineLengths":[13,62,28,23,11,11,1,32,39],"data":null,"url":"raise_event.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/receive.js":{"lineLengths":[13,62,53,22,37,20,1,46,27,30,57,5,44,40,42,33,21,9,23,5,41,37,39,33,21,9,23,5,43,39,41,33,21,9,23,5,22,1,26,35],"data":null,"url":"receive.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_locale.js":{"lineLengths":[13,62,27,28,11,20,1,30,38],"data":null,"url":"get_locale.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_parameter.js":{"lineLengths":[13,62,30,41,54,17,39,1,36,41],"data":null,"url":"get_parameter.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/set_locale.js":{"lineLengths":[13,62,27,29,11,1,30,38],"data":null,"url":"set_locale.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_run_time.js":{"lineLengths":[13,62,28,21,28,29,21,36,5,10,41,30,19,5,1,32,40],"data":null,"url":"get_run_time.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/get_time.js":{"lineLengths":[13,62,25,27,25,37,53,47,58,51,50,32,21,5,87,21,37,5,37,37,37,37,74,32,5,74,39,5,1,26,36],"data":null,"url":"get_time.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/insert_database.js":{"lineLengths":[13,62,50,38,25,36,41,53,61,5,10,21,5,1,26,22,26,31,5,42,27,26,74,48,9,42,26,26,54,66,29,75,29,59,13,25,51,25,51,19,9,47,49,28,45,40,9,40,56,9,72,54,20,19,11,21,47,21,47,21,5,1,40,43],"data":null,"url":"insert_database.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/prefix.js":{"lineLengths":[13,62,31,31,17,64,26,1,38,34],"data":null,"url":"prefix.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/delete_database.js":{"lineLengths":[13,62,32,38,36,55,22,26,31,5,42,59,55,9,58,53,9,40,42,9,28,54,58,13,9,32,27,49,53,91,32,13,40,76,58,22,15,25,51,25,51,9,33,76,58,37,15,25,51,25,51,9,14,40,9,5,1,40,43],"data":null,"url":"delete_database.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/message.js":{"lineLengths":[13,62,34,27,33,37,25,24,27,40,28,13,18,54,51,13,9,39,21,25,54,9,45,5,23,1,55,11,25,25,13,35,114,82,28,41,13,9,20,32,9,5,29,21,156,5,29,19,121,5,16,1,24,26,31,5,28,31,63,32,9,82,33,63,32,9,82,21,53,35,63,32,9,21,53,21,47,26,32,75,9,14,75,51,9,27,39,9,14,107,34,9,5,1,44,35],"data":null,"url":"message.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/modify_database.js":{"lineLengths":[13,62,32,36,55,55,22,26,31,5,42,59,55,9,60,57,9,74,74,28,54,82,34,70,17,13,9,34,89,30,77,13,9,14,40,9,5,1,40,43],"data":null,"url":"modify_database.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/update_database.js":{"lineLengths":[13,62,32,38,36,55,22,26,31,5,42,59,55,9,58,53,9,40,32,9,21,62,25,23,27,49,53,91,53,36,17,22,34,17,13,9,31,32,42,13,37,9,14,41,9,72,54,39,16,11,21,47,21,47,21,5,1,40,43],"data":null,"url":"update_database.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/modify_internal.js":{"lineLengths":[13,62,32,36,55,55,45,41,22,24,46,51,20,37,51,9,5,69,22,45,47,66,67,39,30,35,15,41,29,55,59,17,13,20,9,5,28,86,37,118,9,77,5,32,17,43,1,40,43],"data":null,"url":"modify_internal.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/move_corresponding.js":{"lineLengths":[13,62,35,44,11,35,92,5,1,46,46],"data":null,"url":"move_corresponding.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/replace.js":{"lineLengths":[13,62,25,46,36,47,25,48,49,78,9,15,5,34,62,57,27,22,19,33,52,40,9,53,47,9,39,56,62,5,27,73,55,47,9,43,64,5,58,79,112,102,21,43,15,5,10,42,5,16,41,24,5,10,54,41,9,14,34,9,38,38,38,5,36,32,17,43,27,1,26,35],"data":null,"url":"replace.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/rollback.js":{"lineLengths":[13,62,26,21,11,1,28,36],"data":null,"url":"rollback.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/select.js":{"lineLengths":[13,62,32,36,36,22,26,31,5,49,19,76,52,48,54,13,25,41,9,114,40,47,13,18,79,13,9,32,25,47,19,9,50,30,43,85,29,17,95,13,25,85,9,92,37,74,61,49,62,55,111,37,25,37,120,21,17,22,59,51,17,29,98,13,9,41,65,46,66,13,9,40,32,57,9,56,25,71,9,14,25,57,9,21,43,5,1,40,34],"data":null,"url":"select.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/set_bit.js":{"lineLengths":[13,62,24,35,28,25,23,5,57,54,48,35,15,5,17,18,18,29,26,55,9,52,39,79,9,5,10,23,5,34,64,135,32,5,10,31,5,88,27,1,24,35],"data":null,"url":"set_bit.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/shift.js":{"lineLengths":[13,62,23,40,36,33,86,41,5,10,46,5,1,22,48,29,84,46,42,36,9,40,59,36,9,5,90,48,43,38,9,54,46,105,13,9,5,80,39,31,57,9,14,36,9,5,76,20,45,28,9,14,34,9,39,24,40,9,5,82,44,107,9,14,57,9,5,10,32,5,41,32,5,10,26,5,1,43,29,84,46,42,36,9,40,59,36,9,5,80,43,31,57,9,14,36,9,5,76,20,45,28,9,14,34,9,39,24,40,9,5,82,53,5,10,32,5,22,1,33],"data":null,"url":"shift.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/wait.js":{"lineLengths":[13,62,22,30,46,18,38,18,9,51,50,5,1,20,32],"data":null,"url":"wait.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/set_handler.js":{"lineLengths":[13,62,28,48,11,11,1,32,39],"data":null,"url":"set_handler.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/split.js":{"lineLengths":[13,62,23,36,23,20,43,30,5,57,43,5,10,36,5,72,62,22,34,24,9,28,32,60,9,50,65,9,5,24,33,31,9,40,22,35,56,13,9,31,42,65,47,9,5,1,22,33],"data":null,"url":"split.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/translate.js":{"lineLengths":[13,62,27,30,14,32,20,5,24,45,5,29,45,5,10,42,43,44,47,30,30,33,33,33,33,33,33,33,33,34,33,36,39,13,77,9,5,1,30,37],"data":null,"url":"translate.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/call_transaction.js":{"lineLengths":[13,62,33,28,17,39,17,42,17,41,17,43,17,56,17,66,1,42,44],"data":null,"url":"call_transaction.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/write.js":{"lineLengths":[13,62,32,36,22,26,31,5,28,15,92,43,9,14,139,47,13,28,75,43,13,59,50,60,13,55,150,71,73,86,57,21,26,86,21,17,22,53,17,13,56,68,13,18,49,13,83,43,13,18,49,13,9,5,1,40,33],"data":null,"url":"write.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/statements/call_function.js":{"lineLengths":[13,62,30,48,36,39,20,26,31,5,60,33,23,41,41,35,39,43,10,46,21,54,34,52,39,81,17,32,23,13,75,37,89,13,43,45,45,39,43,47,15,9,35,35,77,13,28,81,52,39,82,9,14,71,9,5,1,36,41],"data":null,"url":"call_function.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/template_formatting.js":{"lineLengths":[13,62,36,35,46,18,48,48,50,9,64,5,88,50,5,51,35,5,10,33,5,93,64,5,85,85,5,85,85,5,90,56,60,183,32,41,9,5,96,40,71,9,14,69,9,5,79,57,5,121,54,5,48,81,58,9,14,62,9,5,119,57,5,52,36,36,34,9,14,28,9,5,47,36,36,34,9,14,35,9,5,16,1,48,47],"data":null,"url":"template_formatting.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/unit_test.js":{"lineLengths":[13,62,32,28,28,23,25,32,32,5,12,29,5,12,29,5,12,29,5,1,27,23,25,26,5,21,51,31,19,5,1,28,23,25,26,5,24,50,31,19,5,1,22,19,26,5,21,51,31,19,5,16,47,33,50,37,26,75,41,118,45,64,50,37,199,17,45,13,37,9,31,19,5,1,40,37],"data":null,"url":"unit_test.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/index.js":{"lineLengths":[13,97,33,53,88,68,5,39,29,33,17,4,72,126,2,62,222,36,40,42,41,52,45,45,40,49,42,43,41,42,41,43,41,42,42,44,41,41,46,43,44,44,42,44,48,47,41,40,41,43,52,53,46,39,40,45,45,45,46,42,44,123,123,128,119,71,69,70,76,69,74,2,99,99,3,33],"data":null,"url":"index.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/abs.js":{"lineLengths":[13,62,21,21,27,40,27,5,45,39,5,10,56,5,28,1,18,31],"data":null,"url":"abs.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/boolc.js":{"lineLengths":[13,62,23,36,23,25,45,5,54,45,5,84,45,5,87,45,5,10,45,5,1,22,33],"data":null,"url":"boolc.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/ceil.js":{"lineLengths":[13,62,22,26,36,22,27,40,27,5,45,39,5,50,36,5,10,56,5,29,1,20,32],"data":null,"url":"ceil.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/concat_lines_of.js":{"lineLengths":[13,62,33,44,33,22,26,15,5,37,20,5,84,1,42,43],"data":null,"url":"concat_lines_of.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/condense.js":{"lineLengths":[13,62,26,36,26,85,19,21,89,5,17,19,81,5,6,18,20,83,5,6,33,33,37,70,5,64,1,28,36],"data":null,"url":"condense.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/contains.js":{"lineLengths":[13,62,26,36,26,32,34,34,37,41,5,18,22,76,5,25,68,5,27,72,5,25,68,5,41,1,28,36],"data":null,"url":"contains.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/cos.js":{"lineLengths":[13,62,21,26,36,21,27,40,27,5,45,39,5,50,36,5,10,56,5,28,1,18,31],"data":null,"url":"cos.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/count_any_of.js":{"lineLengths":[13,62,30,36,30,18,32,32,21,43,59,87,9,5,44,1,36,40],"data":null,"url":"count_any_of.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/count.js":{"lineLengths":[13,62,23,40,36,23,18,30,20,36,33,5,20,36,36,5,17,20,30,40,5,27,32,5,22,59,23,5,21,56,18,31,9,5,44,1,22,33],"data":null,"url":"count.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/escape.js":{"lineLengths":[13,62,24,49,36,24,74,88,21,29,45,44,46,46,18,30,45,44,44,18,30,45,44,44,46,45,18,25,33,18,33,44,44,18,16,30,5,41,1,24,34],"data":null,"url":"escape.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/find.js":{"lineLengths":[13,62,22,48,36,22,27,74,34,44,5,22,38,54,9,136,88,51,45,88,32,50,9,14,49,9,5,10,127,132,125,24,64,9,37,20,9,29,22,28,51,32,9,23,39,48,29,32,13,9,46,43,9,48,5,1,20,32],"data":null,"url":"find.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/floor.js":{"lineLengths":[13,62,23,26,36,23,27,40,27,5,45,39,5,50,36,5,10,56,5,30,1,22,33],"data":null,"url":"floor.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/frac.js":{"lineLengths":[13,62,22,26,36,22,27,16,19,40,27,5,45,39,5,52,48,36,5,10,56,5,50,32,25,24,9,44,5,50,49,5,50,44,5,10,19,5,1,20,32],"data":null,"url":"frac.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/insert.js":{"lineLengths":[13,62,24,36,24,19,20,33,5,76,25,54,43,1,24,34],"data":null,"url":"insert.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/ipow.js":{"lineLengths":[13,62,22,22,25,41,26,5,46,38,5,10,55,5,24,40,24,5,45,36,5,10,53,5,42,1,20,32],"data":null,"url":"ipow.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/lines.js":{"lineLengths":[13,62,23,36,23,51,51,50,9,54,5,65,1,22,33],"data":null,"url":"lines.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/match.js":{"lineLengths":[13,62,23,44,23,76,17,42,26,5,10,32,5,30,29,17,24,21,5,42,1,22,33],"data":null,"url":"match.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/matches.js":{"lineLengths":[13,62,25,36,25,35,38,5,41,48,5,76,17,42,26,5,10,32,5,42,29,23,48,5,10,48,5,1,26,35],"data":null,"url":"matches.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/nmax.js":{"lineLengths":[13,62,22,48,36,22,22,49,49,21,53,5,21,53,5,21,53,5,21,53,5,21,53,5,21,53,5,21,53,5,35,46,1,20,32],"data":null,"url":"nmax.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/nmin.js":{"lineLengths":[13,62,22,48,36,22,22,49,49,21,53,5,21,53,5,21,53,5,21,53,5,21,53,5,21,53,5,21,53,5,35,46,1,20,32],"data":null,"url":"nmin.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/numofchar.js":{"lineLengths":[13,62,27,36,27,17,40,24,5,10,30,5,24,49,1,30,37],"data":null,"url":"numofchar.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/repeat.js":{"lineLengths":[13,62,24,44,24,76,66,1,24,34],"data":null,"url":"repeat.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/replace.js":{"lineLengths":[13,62,25,44,46,36,25,24,40,24,5,10,30,5,23,41,24,5,55,37,5,26,30,5,24,40,24,5,25,30,5,28,41,40,5,42,76,5,27,82,5,66,39,39,77,5,74,39,39,72,16,67,5,52,35,5,77,38,39,9,35,5,42,1,26,35],"data":null,"url":"replace.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/reverse.js":{"lineLengths":[13,62,25,36,25,17,40,24,5,10,30,5,43,41,1,26,35],"data":null,"url":"reverse.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/round.js":{"lineLengths":[13,62,23,48,36,23,26,29,17,5,40,70,5,47,47,20,47,5,36,19,15,36,18,15,37,18,15,39,18,15,37,18,15,37,18,16,51,5,15,1,22,33],"data":null,"url":"round.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/segment.js":{"lineLengths":[13,62,25,48,36,25,24,34,24,5,24,34,24,5,28,36,28,5,42,60,5,33,20,24,32,5,31,60,5,54,1,26,35],"data":null,"url":"segment.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/shift_right.js":{"lineLengths":[13,62,29,44,29,74,20,80,35,57,9,5,28,44,5,30,44,5,10,57,5,42,1,34,39],"data":null,"url":"shift_right.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/shift_left.js":{"lineLengths":[13,62,28,44,48,28,74,20,80,37,41,9,5,28,90,41,42,9,34,71,9,36,5,30,61,63,5,10,56,5,42,1,32,38],"data":null,"url":"shift_left.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/sign.js":{"lineLengths":[13,62,22,22,27,40,27,5,45,39,5,10,56,5,29,1,20,32],"data":null,"url":"sign.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/sin.js":{"lineLengths":[13,62,21,26,36,21,27,40,27,5,45,39,5,50,36,5,10,56,5,28,1,18,31],"data":null,"url":"sin.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/sqrt.js":{"lineLengths":[13,62,22,26,36,22,27,40,27,5,45,39,5,50,36,5,10,56,5,29,1,20,32],"data":null,"url":"sqrt.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/strlen.js":{"lineLengths":[13,62,24,36,24,17,40,24,5,54,37,5,10,30,5,49,1,24,34],"data":null,"url":"strlen.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/substring_after.js":{"lineLengths":[13,62,33,46,36,44,33,74,49,37,5,17,42,26,5,73,32,5,45,62,5,71,68,5,39,29,17,24,21,5,42,1,42,43],"data":null,"url":"substring_after.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/substring_before.js":{"lineLengths":[13,62,34,46,36,44,34,17,40,24,5,54,37,5,10,30,5,17,42,26,5,73,32,5,45,62,5,71,68,5,40,29,17,24,21,5,42,1,44,44],"data":null,"url":"substring_before.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/substring.js":{"lineLengths":[13,62,27,44,48,27,15,123,28,16,5,18,67,5,125,25,67,5,17,40,41,5,10,70,5,42,1,30,37],"data":null,"url":"substring.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/sy.js":{"lineLengths":[13,62,20,36,36,71,30,30,33,33,53,33,45,47,37,43,36,37,37,37,37,33,47,33,33,30,33,53,30,37,3,30],"data":null,"url":"sy.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/tan.js":{"lineLengths":[13,62,21,26,36,21,27,40,27,5,45,39,5,50,36,5,10,56,5,28,1,18,31],"data":null,"url":"tan.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/to_lower.js":{"lineLengths":[13,62,26,36,26,76,49,83,5,10,59,5,1,28,36],"data":null,"url":"to_lower.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/to_mixed.js":{"lineLengths":[13,62,26,49,48,36,26,24,28,18,5,34,24,5,27,60,5,18,18,60,5,24,34,24,5,67,21,45,58,75,13,9,14,70,75,13,9,5,30,42,30,41,53,11,5,41,1,28,36],"data":null,"url":"to_mixed.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/to_upper.js":{"lineLengths":[13,62,26,36,26,76,49,83,5,10,59,5,1,28,36],"data":null,"url":"to_upper.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/translate.js":{"lineLengths":[13,62,27,36,44,27,74,80,70,48,35,5,37,33,21,48,47,5,50,48,42,1,30,37],"data":null,"url":"translate.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/trunc.js":{"lineLengths":[13,62,23,23,27,40,27,5,45,39,5,10,56,5,30,1,22,33],"data":null,"url":"trunc.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/builtin/xstrlen.js":{"lineLengths":[13,62,25,36,25,40,63,5,10,69,5,1,26,35],"data":null,"url":"xstrlen.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/db/db.js":{"lineLengths":[13,62,30],"data":null,"url":"db.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/index.js":{"lineLengths":[13,97,33,53,88,68,5,39,29,33,17,4,72,126,2,62,40,40,43,42,40,45,42,44,44,43,44,43,33],"data":null,"url":"index.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/add.js":{"lineLengths":[13,62,21,36,44,37,27,46,46,50,9,45,5,47,47,50,9,45,5,78,67,5,66,63,55,5,102,61,5,103,61,5,162,88,5,158,88,5,96,15,1,18,31],"data":null,"url":"add.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/div.js":{"lineLengths":[13,62,21,36,37,27,40,41,61,15,1,18,31],"data":null,"url":"div.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/divide.js":{"lineLengths":[13,62,24,48,36,37,65,30,41,18,58,5,46,40,1,24,34],"data":null,"url":"divide.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/minus.js":{"lineLengths":[13,62,23,36,37,44,29,46,46,50,9,47,5,47,47,50,9,47,5,78,67,5,66,63,55,5,102,61,5,103,61,5,162,88,5,158,88,5,91,1,22,33],"data":null,"url":"minus.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/mod.js":{"lineLengths":[13,62,21,36,37,27,40,41,61,15,1,18,31],"data":null,"url":"mod.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/multiply.js":{"lineLengths":[13,62,26,36,37,44,32,78,67,5,66,63,55,5,102,61,5,103,61,5,162,88,5,158,88,5,91,1,28,36],"data":null,"url":"multiply.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/power.js":{"lineLengths":[13,62,23,36,37,29,100,1,22,33],"data":null,"url":"power.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/bit-and.js":{"lineLengths":[13,62,24,53,36,55,30,17,80,46,52,114,5,38,17,15,1,24,35],"data":null,"url":"bit-and.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/_bit_operations.js":{"lineLengths":[13,62,42,48,19,30,36,64,32,38,67,91,99,30,47,45,49,61,63,101,52,54,50,52,87,5,15,1,60,43],"data":null,"url":"_bit_operations.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/bit-not.js":{"lineLengths":[13,62,24,40,36,71,24,61,17,35,63,75,43,43,43,70,19,5,68,31,15,1,24,35],"data":null,"url":"bit-not.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/bit-or.js":{"lineLengths":[13,62,23,53,36,55,29,16,80,46,52,112,5,38,16,15,1,22,34],"data":null,"url":"bit-or.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/bit-xor.js":{"lineLengths":[13,62,24,53,36,55,30,17,80,46,52,114,5,38,17,15,1,24,35],"data":null,"url":"bit-xor.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/operators/concat.js":{"lineLengths":[13,62,24,36,30,30,42,43,47,39,9,19,5,17,63,20,5,49,33,5,10,26,5,65,21,5,50,34,5,10,27,5,41,1,24,34],"data":null,"url":"concat.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/rfc.js":{"lineLengths":[13,62,31],"data":null,"url":"rfc.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/expand_in.js":{"lineLengths":[13,62,26,68,42,37,19,17,37,49,38,5,10,34,26,42,180,63,13,126,9,38,5,15,1,28,37],"data":null,"url":"expand_in.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/expand_dynamic.js":{"lineLengths":[13,62,31,35,34,22,23,5,10,56,45,32,48,35,55,73,13,9,20,5,1,38,42],"data":null,"url":"expand_dynamic.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/classic_error.js":{"lineLengths":[13,62,30,34,24,16,37,5,1,36,41],"data":null,"url":"classic_error.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/console/standard_out_console.js":{"lineLengths":[13,62,36,26,19,26,5,13,79,5,15,35,27,5,11,18,5,15,26,5,18,79,5,1,48,48],"data":null,"url":"standard_out_console.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/runtime/build/src/console/memory_console.js":{"lineLengths":[13,62,31,21,19,23,5,13,23,5,15,37,5,11,25,5,15,32,5,18,70,5,1,38,42],"data":null,"url":"memory_console.js.map"},"file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/database-sqlite/build/index.js":{"lineLengths":[13,62,38,63,28,24,29,32,90,5,25,19,58,45,21,196,25,102,9,5,24,28,32,5,24,38,29,23,13,33,9,14,34,38,13,9,5,14,15,83,5,30,23,5,20,23,5,22,23,5,27,76,22,22,13,38,33,13,34,56,61,43,30,26,13,9,23,22,9,32,5,27,101,22,22,13,38,33,13,34,56,61,43,30,26,13,9,23,22,9,32,5,27,145,22,22,13,38,33,13,34,22,9,23,51,22,9,32,5,49,27,28,89,68,86,33,124,9,14,82,9,72,74,59,34,40,9,13,51,9,23,25,77,29,125,13,24,9,39,30,5,18,52,22,9,24,48,27,22,54,47,20,13,27,9,20,5,1,52,33],"data":{"version":3,"file":"index.js","sourceRoot":"","sources":["file:///home/runner/work/abapGit/abapGit/node_modules/@abaplint/database-sqlite/src/index.ts"],"names":[],"mappings":";;;AAAA,+DAAgF;AAGhF,MAAa,oBAAoB;IAK/B,YAAmB,KAAyB;QAJ5B,SAAI,GAAG,QAAQ,CAAC;QAExB,WAAM,GAAyB,SAAS,CAAC;QAG/C,IAAI,CAAC,KAAK,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,MAAK,IAAI,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,IAAwC;;QAC3D,MAAM,GAAG,GAAG,MAAM,IAAA,wBAAS,GAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAErC,aAAa;QACb,IAAI,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,0CAAE,mBAAmB,KAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YAC9F,aAAa;YACb,MAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,0CAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7C;IACH,CAAC;IAEM,KAAK,CAAC,UAAU;QACrB,IAAI,CAAC,MAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAsB;QACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,IAAI,GAAG,KAAK,EAAE,EAAE;gBACd,OAAO;aACR;YACD,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SACvB;aAAM;YACL,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE;gBACnB,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;aACvB;SACF;IACH,CAAC;IAEM,MAAM;;QACX,OAAO,MAAA,IAAI,CAAC,MAAM,0CAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,gBAAgB;QAC3B,OAAO,CAAC,OAAO;IACjB,CAAC;IAEM,KAAK,CAAC,MAAM;QACjB,OAAO,CAAC,OAAO;IACjB,CAAC;IAEM,KAAK,CAAC,QAAQ;QACnB,OAAO,CAAC,OAAO;IACjB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,OAAiC;QACnD,MAAM,GAAG,GAAG,gBAAgB,OAAO,CAAC,KAAK,WAAW,OAAO,CAAC,KAAK,EAAE,CAAC;QAEpE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI;YACF,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;gBACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClB;YAED,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE7B,4CAA4C;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAClD,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;YACzC,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,KAAK,GAAG,CAAC,CAAC;aACX;SACF;QAAC,OAAO,KAAK,EAAE;YACd,KAAK,GAAG,CAAC,CAAC;SACX;QAED,OAAO,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,OAAiC;QACnD,MAAM,GAAG,GAAG,WAAW,OAAO,CAAC,KAAK,SAAS,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC;QAE7F,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI;YACF,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;gBACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClB;YAED,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEvB,4CAA4C;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAClD,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;YACzC,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,KAAK,GAAG,CAAC,CAAC;aACX;SACF;QAAC,OAAO,KAAK,EAAE;YACd,KAAK,GAAG,CAAC,CAAC;SACX;QAED,OAAO,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,OAAiC;QACnD,MAAM,GAAG,GAAG,gBAAgB,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAEzI,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI;YACF,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;gBACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClB;YAED,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,KAAK,GAAG,CAAC,CAAC;SACX;QAAC,OAAO,KAAK,EAAE;YACd,uCAAuC;YACvC,KAAK,GAAG,CAAC,CAAC;SACX;QACD,OAAO,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC;IACxB,CAAC;IAED,6CAA6C;IACtC,KAAK,CAAC,MAAM,CAAC,OAAiC;QACnD,IAAI,GAAG,GAAkC,SAAS,CAAC;QAEnD,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;QAC/E,4DAA4D;QAC9D,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;QAC9E,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACjH;aAAM;YACL,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;SACvE;QACD,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAClE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SAC7B;QAED,IAAI;YACF,GAAG,GAAG,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SACzC;QAAC,OAAO,KAAK,EAAE;YACd,aAAa;YACb,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,KAAK,SAAS,EAAE;gBAC9D,aAAa;gBACb,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,EAAE,CAAC,YAAY,CAAC,EAAC,MAAM,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAC,CAAC,CAAC;aAC5G;YACD,MAAM,KAAK,CAAC;SACb;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE/B,OAAO,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC;IACtB,CAAC;IAEO,OAAO,CAAC,GAAsB;QACpC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;YACzC,OAAO,EAAE,CAAC;SACX;QAED,MAAM,IAAI,GAAoB,EAAE,CAAC;QACjC,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;YACrC,MAAM,GAAG,GAAmB,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;gBACvC,GAAG,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC,EAAE,CAAC;aACL;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAChB;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAhLD,oDAgLC"},"url":null}}} \ No newline at end of file